Showing posts with label CA-Clipper. Show all posts
Showing posts with label CA-Clipper. Show all posts

Friday, February 18, 2011

CA-Compiler - Arguments Listing & Compiler Options

CA-Clipper Compiler--CLIPPER.EXE
 Compiles one or more program files (.prg) containing procedures and user-
 defined functions to form an object file (.OBJ).
------------------------------------------------------------------------------

 CLIPPER [<sourceFile> | @<scriptFile> [<option list>]]
   
 Arguments

<scriptFile> is the name of an ASCII text file containing a list of
     source files to compile into a single object file.  The default
     extension for this file is (.clp).

     <option list> is a list of one or more options to control the course
     of the compilation, all of which are described below.  To get a list of
     options, specify the compiler command line with no arguments.

 Compiler Options

     All options are shown in uppercase preceded by a slash (/).  Note,
     however, that options are not case-sensitive and that you can replace
     the slash with a dash (-) if you prefer.

     Some compiler options have arguments.  If an option has arguments,
     specify them after the option, with no space between the option and
     its first argument.

     /A

     Declares any variable included in a PRIVATE, PUBLIC, or PARAMETERS
     statement as MEMVAR.

     /B

     Includes debugging information in the object file.

     /D[=]

     Defines an identifier to the preprocessor with  assigned to the
      if specified.

     /ES[]

     Specifies the severity level of warnings.

     If  is 0 or omitted, the compiler does not set the DOS
     ERRORLEVEL upon exit if warnings are encountered.  This is the default
     behavior of the compiler.

     If  is 1, the compiler sets the DOS ERRORLEVEL upon exit
     if warnings are encountered but still generates an .OBJ file.

     If  is 2, the compiler sets the DOS ERRORLEVEL upon exit
     if warnings are encountered and does not generate an .OBJ file.  This
     effectively promotes warnings to error status.
     /I

     Adds the specified directory to the front of the INCLUDE path list.
     Multiple /I options can be specified in the same compiler session to
     specify several header file search directories.

     /L

     Excludes the program source code line numbers from the object file.

     /M

     Compiles only the current program file (.prg) suppressing automatic
     search for program files (.prg) referenced in a program file with the
     DO, SET FORMAT, and SET PROCEDURE commands.

     /N

     Suppresses the automatic definition of a procedure with the same name as
     the program file (.prg).

     /O

     Defines the name and/or location of the output object file.

     /P

     Preprocesses the program file (.prg) and copying the result to an output
     file with a (.ppo) extension.

     /Q

     Prevents line numbers from displaying while compiling.

     /R[]

     Embeds a library search request in the object file.  If /R is specified
     without  name, the default requests for CLIPPER.LIB,
     EXTEND.LIB, DBFNTX.LIB, and TERMINAL.LIB are suppressed.  Multiple /R
     options can be specified in the same compiler session to embed more
     than one library request.

     /S

     Checks the syntax of the current (.prg) file and no object file is
     generated.

     /T

     Specifies a different directory for temporary files generated during
     compilation.

     /U[]

     Identifies an alternate standard header file to preprocess in place of
     the supplied STD.CH which is used automatically.

     /V

     Forces the compiler to assume all references to undeclared or unaliased
     variable names are public or private variables.

     /W

     Generates warning messages for undeclared or unaliased (ambiguous)
     variable references.

     /Z

     Suppresses shortcutting optimizations on the logical operators .AND. and
     .OR.  This option is provided as an aid to isolating code that depends
     on the behavior of older versions of CA-Clipper.
 

More at http://www.itlnet.net/programming/program/Reference/c53g04c/ng35d.html

Tuesday, March 17, 2009

Mel Smith : From CA-Clipper to xHarbour+HMG

CCH: On reading a email from Sudip regarding Mel Smith's migration from CA-Clipper to xHarbourt+HMG, I wrote to Mel Smith on 16th March 2009 and obtained his consent to republish it here.

Mel Smith to Sudip

Sudip,

Many people are starting to use the 'IDE' method (and, apparently successfully).

However, I am 'old-fashioned' and so I hand-code everything, and I use the 'HBMAKE.EXE' utility of xHarbour to build my apps.

If you provide me with an email address that allows attachments (btw, Gmail does *not* allow attachments), I will forward my BLD.BAT file, my xxx.BC file that is a parameter to HBMAKE, and my main app plus one other module for you to see how I proceed.

My conversion procedure is usually:

1. Make a copy of the original Clipper 5.2e program and all its various modules
2. Convert this copy to proper xHarbour (fixing all previous bad styles to proper styling, etc, etc)
3. With all modules converted to xHarbour, run this console-style program to ensure it works as good or better than the Clipper app
4. Start windowizing:
a. Start with the Function Main() and build a main window.
b. Add the main menu to this window
c. In one of the menu options, call/activate a simple sub-function (e.g., build all indexes)
d. Go to this sub function and add a child window and carry on with the conversion.
e. Go to c. again :)))

I have included the Main Window definition from the Main Function from one of my apps below:


... there are 1480 lines of setup before the following initialization of the app's Main Window ...

BTW, I had an old app named ACT (for Accounting -- I always use 3 letters for my various apps)
When I started converting to 'windows' I just added a 'W' to the beginning of 'ACT' . Thus, WACT is the app name
Please don't assume the code below is 'Good' or 'Sophisticated'. It is *not* ! It is just *my* conversion of old stuff. But it does work., and it is quite simple. There are about 48 separated modules I had to convert. The fragment below is part of the Main module

You will note that some of the conversion has not been required or completed yet (i.e., the donothing() function refers to this

...
...
SET MULTIPLE OFF

SET NAVIGATION EXTENDED
cWIN := "WACT"

DEFINE WINDOW WACT ;
AT nMTOP,nMLEFT ;
WIDTH nMWIDTH HEIGHT nMHEIGHT ;
TITLE "Accounting Control for A/P, A/R and Payroll: " + GVERSION + ;
" ( on Drive " + GNETDRV+" )" + " Process Date : " + GTHEN ;
ICON "WORLD" ;
FONT "Arial" SIZE 12 ;
MAIN ;
ON INIT {|| (IIF(lRBLDIDX,(WACT.LABNDX.SHOW,WACT.NDXFIL.SHOW, ;
WACT.INDEXPROG.SHOW,RBLDIDX(lSETUPDBF:=.T.)),), ;
WACT.LABNDX.HIDE,WACT.NDXFIL.HIDE,WACT.INDEXPROG.HIDE, ;
(GABORT := .NOT. SETUPDATES(GDATE), ;
IIF(GABORT,DOMETHOD("WACT","RELEASE"),.T.)), ;
SETSTATUS(cWINSTATUS:=" Ready for Menu Selection"))}

DEFINE MAIN MENU
POPUP "Accounts &Payable"
ITEM " 1. Add/Edit A/P Transactions" ACTION {||MNTPAY(),DBCLOSEALL()}
ITEM " 2. Add/Edit C/R Transactions" ACTION DONOTHING() DISABLED
ITEM " 3. Load Suppliers" ACTION DONOTHING() DISABLED
ITEM " 4. Update Supplier A/P File" ACTION DONOTHING() DISABLED
ITEM " 5. Update Purchase Order File" ACTION {||MNTPCH(),DBCLOSEALL()}
ITEM " 6. Fix Vend Acct. Nos. in A/P" ACTION DONOTHING() DISABLED
ITEM " 7. P.O Report Menu" ACTION DONOTHING() DISABLED
ITEM " 8. A/P Reports / Cheques Menu" ACTION {||PAYREPS(),DBCLOSEALL()}
ITEM " 9. C/R Reports / Cheques Menu" ACTION DONOTHING() DISABLED
ITEM " A. Multi-Job Costing Tables" ACTION {|| LOADCOST("WACT"),DBCLOSEALL(), ;
SETPROPERTY("WACT","oSTOPSCAN","VISIBLE",.F.), ;
SETPROPERTY("WACT","oSTOPSCAN","ENABLED",.F.)}
ITEM " B. Job Costing for ONE Job" ACTION {||MNTJCS(),DBCLOSEALL()}
ITEM " X. Exit" ACTION DOMETHOD("WACT","Release")
END POPUP

POPUP "Accounts &Receivable"
ITEM " 1. Add/Edit A/R Transactions" ACTION DONOTHING() DISABLED
ITEM " 2. Fix Cust No. in A/R File " ACTION DONOTHING() DISABLED
ITEM " 3. Edit Customer Information" ACTION DONOTHING() DISABLED
ITEM " 4. Edit Customer Financials " ACTION DONOTHING() DISABLED
ITEM " 5. " ACTION DONOTHING() DISABLED
ITEM " 6. Receipts Input Processing" ACTION DONOTHING() DISABLED
ITEM " 7. " ACTION DONOTHING() DISABLED
ITEM " 8. Print Reports / Invoices " ACTION DONOTHING() DISABLED
ITEM " 9. " ACTION DONOTHING() DISABLED
ITEM " A. Change Txn Number Format " ACTION DONOTHING() DISABLED
ITEM " B. Import Spreadsheet Data " ACTION DONOTHING() DISABLED
END POPUP

POPUP "&Utilities"
ITEM " 1. View/Edit G/L Master " ACTION DONOTHING() DISABLED
ITEM " 2. View Admin Passwords " ACTION DONOTHING() DISABLED
ITEM " 3. Load C/R Register File" ACTION DONOTHING() DISABLED
ITEM " 4. Load G/L Accounts File" ACTION DONOTHING() DISABLED
ITEM " 5. Load Time-Sheet Files " ACTION DONOTHING() DISABLED
ITEM " 6. Load Employee File " ACTION DONOTHING() DISABLED
ITEM " 7. Re-Build Vendor Codes " ACTION DONOTHING() DISABLED
ITEM " 8. Set-Up P.O. Remarks " ACTION DONOTHING() DISABLED
ITEM " 9. Set-Up Div/EWO DBFs " ACTION DONOTHING() DISABLED
ITEM " A. Set-Up Work-Area DBFs " ACTION DONOTHING() DISABLED
END POPUP

POPUP "&Employees"
ITEM " 1. Browse Employee File " ACTION DONOTHING() DISABLED
ITEM " 2. Browse Job Desc File " ACTION DONOTHING() DISABLED
ITEM " 3. Browse Rates/Deductions " ACTION DONOTHING() DISABLED
ITEM " 4. Time-Sheet Entry System " ACTION {||MNTTBS(),DBCLOSEALL()}
ITEM " 5. Print Time and Expenses " ACTION {||TBSREPS(),DBCLOSEALL()}
ITEM " 6. Print Payroll Cheques " ACTION DONOTHING() DISABLED
ITEM " 7. Period-End Payroll " ACTION DONOTHING() DISABLED
ITEM " 8. Load Employees (AccPac) " ACTION DONOTHING() DISABLED
ITEM " 9. View TBS Time-Sheets " ACTION DONOTHING() DISABLED
ITEM " A. Browse Unions File " ACTION DONOTHING() DISABLED
END POPUP

POPUP "&Manager"
ITEM " 1. Rebuild Index Files" ACTION RBLDIDX(lSETUPDBF:=.T.)
ITEM " 2. Edit Company Information" ACTION {|| MNTSYS(),DBCLOSEALL()}
ITEM " 3. Run old DOS ACT System" ACTION DOOLDACT("WACT")
ITEM " 4. View / Edit Job Status" ACTION {|| MNTJOB("WACT"),DBCLOSEALL()}
ITEM " 5. View / Edit Job Rates" ACTION {|| MNTJRT(),DBCLOSEALL()}
ITEM " 6. Print Job(s) Status" ACTION DONOTHING() DISABLED
ITEM " 7. Test Send of Email" ACTION SENDMAIL()
ITEM " X. Exit" ACTION DOMETHOD("WACT","Release")
END POPUP

END MENU

@ (nMBOT-nMTOP)/2 - 40, 150 LABEL LABNDX AUTOSIZE ;
VALUE "Indexing File : " ;
INVISIBLE

cFIL2NDX := SPACE(20)

@ (nMBOT-nMTOP)/2 - 40, 300 TEXTBOX NDXFIL VALUE cFIL2NDX ;
WIDTH 300 ;
INVISIBLE

@ (nMBOT-nMTOP)/2,150 PROGRESSBAR INDEXPROG ;
RANGE 0,10000 ;
WIDTH 600 ;
HEIGHT 30 ;
SMOOTH ;
INVISIBLE ;
TOOLTIP "Indexing Progress"


@ nMBOT-86,000 LABEL STATPMPT OF WACT AUTOSIZE ;
VALUE "Status Line->" ;
FONT "Arial" SIZE 10

@ nMBOT-86,100 LABEL STATLINE OF WACT ;
VALUE cWINSTATUS ;
WIDTH 500 HEIGHT 30 ;
FONT "Arial" SIZE 10 ;
BOLD

@ nMCTRROW-(nBUTTH),nMCTRCOL-(nBUTTH) BUTTONEX oSTOPSCAN OF WACT;
CAPTION "Stop Scan"+CRLF+"of Job Cost"+CRLF+"Databases" ;
WIDTH nBUTTW+30 ;
HEIGHT nBUTTH+40 ;
FONTCOLOR RED ;
BACKCOLOR YELLOW ;
NOTABSTOP ;
BOLD ;
INVISIBLE ;
ACTION {||lESCPRESSED := .T.}

WACT.oSTOPSCAN.ENABLED := .F.
WACT.oSTOPSCAN.VISIBLE := .F.

ON KEY ESCAPE OF WACT ACTION {||nESCKEY:=K_ESC,THISWINDOW.RELEASE}

END WINDOW

Mel Smith

Friday, March 13, 2009

Mapping Clipper Command to HMG Commands

To assist CA-Clipper users to understand the Harbour MiniGUI (HMG) equivalent, I have listed the following examples :-

1. @... SAY

Clipper :

@row, col SAY [PICTURE ] [COLOR ]

Example :
@ 15, 20 SAY "Phone" PICTURE "@R (999)999-9999" COLOR "BG+/B+, BG+/N"

HMG :
@ , LABEL
[ ID ]
[ OF | PARENT | DIALOG ]
VALUE
[ ACTION | ONCLICK | ON CLICK | ]
[ WIDTH ]
[ HEIGHT ]
[ AUTOSIZE ]
[ FONT SIZE ]
[ BOLD ] [ ITALIC ] [ UNDERLINE ] [ STRIKEOUT ]
[ TOOLTIP ]
[ BACKCOLOR ]
[ FONTCOLOR ]
[ BORDER ]
[ CLIENTEDGE ]
[ HSCROLL ]
[ VSCROLL ]
[ TRANSPARENT ]
[ RIGHTALIGN | CENTERALIGN ]
[ HELPID ]
[ INVISIBLE ]

Example
@ 15 ,20 LABEL Lbl_1;
VALUE "Phone" ;
WIDTH 350 HEIGHT 35 ;
FONT "Arial" SIZE 18 BOLD ;
FONTCOLOR BLUE ;
CENTERALIGN

CCH: Basically, SAY in Clipper becomes LABEL control. While COLOR string becomes BACKCOLOR & FONTCOLOR

2. @... GET
Clipper :

    @ , 
[SAY 
[PICTURE ]
[COLOR ]]
GET 
[PICTURE ]
[COLOR ]
[CAPTION]
[MESSAGE ]
[WHEN ]
[RANGE* , ] |
[VALID ]

HMG :
@ , GETBOX
[ ID ]
[ OF | PARENT | DIALOG ]
[ HEIGHT ]
[ WIDTH ]
[ FIELD ]
[ VALUE ]
[ PICTURE ] //** format function and template string
[ VALID | RANGE ,] // VALID - postvalidation function or codeblock which must return logical value
// RANGE - allowed range of values
[ VALIDMESSAGE ]
[ MESSAGE ] // text to display on STATUSBAR Item(1) when getbox have focus
[ WHEN ] // prevalidation function or codeblock (if return .f. GetBox is readonly
[ READONLY ]
[ FONT SIZE ]
[ BOLD ] [ ITALIC ] [ UNDERLINE ] [ STRIKEOUT ]
[ PASSWORD ]
[ TOOLTIP ]
[ BACKCOLOR ] // * or
[ FONTCOLOR ] // * or
[ ON CHANGE ] ;
[ ON GOTFOCUS | ]
[ ON LOSTFOCUS | ]
[ RIGHTALIGN ]
[ INVISIBLE ]
[ NOTABSTOP ]
[ HELPID ]

Example :
@ 160,460 GETBOX GBox_1 ;
HEIGHT 24 WIDTH 120;
VALUE " " ;
FONT "Arial" SIZE 9 ;
ON CHANGE FindChg();
PICTURE '@XXXXXXXXXXXXXXXXXXXXXXX'

CCH: Basically, GET in Clipper becomes GETBOX control.

More GETBOX Examples

. @ 40,10 GETBOX Text_2 ;
HEIGHT 20;
VALUE 57639 ;
ACTION MsgInfo( "Button Action");
TOOLTIP "Numeric input. RANGE -100,200000 PICTURE @Z 99,999.99";
PICTURE '@Z 99,999.99';
RANGE -100,200000;
BOLD;
MESSAGE "Numeric input";
VALIDMESSAGE "Value between -100 and 200000 " ;
BACKCOLOR {{255,255,255},{255,255,200},{200,255,255}} ;
FONTCOLOR {{0,0,0},{255,255,200},{0,0,255}}

@ 78,10 GETBOX Text_3 ;
VALUE "Jacek";
ACTION MsgInfo( "Button Action");
ACTION2 MsgInfo( "Button2 Action");
IMAGE {"folder.bmp","info.bmp"};
BUTTONWIDTH 20 ;
PICTURE "@K !xxxxxxxxxxxxxx";
TOOLTIP "Character Input. VALID {|| ( len(alltrim(This.Value)) >= 2)} PICTURE @K !xxxxxxxxxxxxxx " ;
VALID {|| ( len(alltrim(This.Value)) >= 2)};
VALIDMESSAGE "Minimum 2 characters" ;
MESSAGE "Character Input";
BACKCOLOR {{255,255,255},{255,255,200},{200,255,255}} ;
FONTCOLOR {{0,0,0},{255,255,200},{0,0,255}}

@ 120,10 GETBOX Text_4 WIDTH 30 HEIGHT 20;
VALUE .t.;
TOOLTIP "Logical Input VALID {|| (This.Value == .t.)}";
PICTURE "Y";
VALID {|| (This.Value == .t.)};
VALIDMESSAGE "Only True is allowed here !!!";
MESSAGE "Logical Input";
BACKCOLOR {{255,255,255},{255,255,200},{200,255,255}} ;
FONTCOLOR {{0,0,0},{255,255,200},{0,0,255}}

@ 160,10 GETBOX Text_2a HEIGHT 20;
VALUE 234123.10 ;
TOOLTIP "Numeric input PICTURE @ECX) $**,***.**" ;
PICTURE '@ECX) $**,***.**' ;
BACKCOLOR {{255,255,255},{255,255,200},{200,255,255}} ;
FONTCOLOR {{0,0,0},{255,255,200},{0,0,255}}

@ 200,10 GETBOX Text_2b HEIGHT 20;
VALUE "Kowalski";
PICTURE "@K !!!!!!!!!!";
ON CHANGE {|| TONE(300)};
BACKCOLOR {{255,255,255},{255,255,200},{200,255,255}} ;
FONTCOLOR {{0,0,0},{255,255,200},{0,0,255}}

DEFINE GETBOX Text_2c // Alternate Syntax
ROW 240
COL 10
HEIGHT 20
VALUE "MyPass"
PICTURE "@K !!!!!!!!!"
BACKCOLOR {{255,255,255},{255,255,200},{200,255,255}}
FONTCOLOR {{0,0,0},{255,255,200},{0,0,255}}
VALID {|| ( len(alltrim(This.Value)) >= 4)}
TOOLTIP "Character input PASSWORD clause is set"
VALIDMESSAGE "Password must contains minimum 4 characters"
MESSAGE "Enter password (min 4 char.) "
PASSWORD .T.

Comments by Mel Smith from comp.lang.clipper/comp.lang.xharbour

David:

Here is a snippet of HMG Code that shows a prompt (P.O. Number:), then a
'GET' that inputs a P.O. number from the user, then verifies it and does a few more things.

These next two statements are 'inside' a Window Definition structure:

DEFINE WINDOW MNTPCH;
etc,
etc,

// This next is a 'SAY' emulation showing how wide/high the prompt
box should be,
// and where the label should be positioned (in 'pixels'), and that
// it should be right-aligned in its 'box'. Note that the 'LABEL'
has a name itself.
// Here, it is named LABPONUM, so that I can reference and change
the characteristics
// of the label itself at a later stsge -- if I wish to.

@ 010,010 LABEL LABPONUM OF MNTPCH WIDTH 090 HEIGHT 20 ;
VALUE "P.O. Number :" RIGHT

// This next is the 'GET' emulation showing the 'picture' clause,
the initial value to be displayed,
// the colors for foreground and background, and what to do when
gaining focus, and
// what to do when focus is lost, and then a Validation function to
perform on losing focus.

@ 010,120 GETBOX oPONUM OF MNTPCH WIDTH 060 HEIGHT 20 ;
PICTURE "@K! #####" ;
VALUE cPONUM ;
FONTCOLOR GFCOLORS ;
BACKCOLOR GBCOLORS ;
ON GOTFOCUS {|| IF(lGOTNEWPO,SETFOCUSTO("MNTPCH","oVENDCODE"), ;
SETPROPERTY("MNTPCH","LABF6SELPO","VISIBLE",.T.))}
;
ON LOSTFOCUS {||SETPROPERTY("MNTPCH","LABF6SELPO","VISIBLE",.F.)} ;
VALID {||GABORT := .NOT. CHKPONUM("MNTPCH","oPONUM",ALIAS(), ;
THIS.VALUE,@cPONUM),.T.} ;
TOOLTIP "Enter a different P.O. No., or use Movement Keys"

etc,
etc
// and many other fields, browses, etc, in here too
// It gets easier after you bang your head against the wall for five
months :))

END WINDOW

-Mel Smith, 14th March 2009

Sunday, March 1, 2009

Why you should recompile your CA-Clipper DOS applications to Win32

CA-Clipper for DOS was, once hugely popular amongst Xbase programmers from Summer'87 right up to Version 5.2e. Apparently, 5.3 onwards were not vey popular. Even now, it is amazing to discover that there are still many CA-Clipper programmers out there. However, CA-Clipper for DOS programs don't do well under Windows, and may not run at all in Win'98, ME, XP , Vista or on fast processors, or they may have problems printing. In addition , the interface is text-based , hogs processor time which slows everything else down, and can't communicate with Windows programs.

So what's the solution & I am not talking of GUI ?

Simple, recompile your existing CA-Clipper source codes using a 32-bit CA-Clipper compatible compilers such as the Harbour Project, xHarbour or Xbase++. If you prefer open-source the Harbour Project & xHarbour will definitely be your choice. However, if you require more support, I guess that xHarbour.com & Xbase++ will be the way to go.

Clarification from Ron Pinkas

xHarbour is first and foremost a free open source project, exactly as
Harbour.

In *addition* to being completely free, it's *also* distributed by
xHarbour.com, as a commercial distribution that includes numerous Add-on
Tools & Libraries, as well as tech support services.

Needless to say, the existence of the xHarbour.com commercial distribution
does not take away from the freedom of xHarbour, the opposite it provides
even more resources to the free project.


So what are the benefits of having your familiar CA-Clipper application as a true Windows 32-bit Executable ?

A quick list of the benefits of being a true Windows application is that it can:
  • Utilize all the available memory, no more DOS boundaries
  • Use bigger sized variables, no more limits such as 4096 array elements, 64K data segment, etc.
  • Use any kind of printer installed on Windows, including network printer, Fax printer, PDF printer, etc.
  • Use Windows resources easily, eg. clipboard, common dialogs, etc
  • Collaborate with other Windows application, eg. Excel, Internet Explorer, etc.
You may want to read about my own experience in porting a sizeable real-life Accounting application (still in use in some customers) from CA-Clipper 5.2e to xHarbour

CA-Clipper is Alive & Well ! [5th November 2009]

I am simply amazed that the Clipper Language (in the form of CA-Clipper, Xbase++, Harbour, xHarbour & CA-Visual Objects) is still being used by Clipperheads from 103 countries since this blog started on 26th January 2009, latest in May 2009 from Burkina Faso(4/5/09), Cote D'ivoire(5/5/09), Guyana (8/5/09), Macau (22/5/09), Libyan Arab Jamahiriya(23/5/09), Ghana, Nepal (8/6/09), Cameroon (28/6/09), Mauritius (7/7/09), Montenegro(2/8/09), French Polynesia, Senegal (20/10/09), Trinidad and Tobago (5thNov 2009)

As at 5th November 2009, we now have more than 16,800 unique visitors from Europe, Africa & Middle-east, North, Central & South America & the Asia-Pacific as follows :-

Europe
  1. Austria (4/9, 9), Steiermark(Graz, Leoben, Radmer), Wien (Vienna) , Tirol(Innsbruck, Sillian,Jenbach, Kitzbühel ), Saltzburg(Angerberg)
  2. Belarus(5,7), Vitsyebskaya Voblasts(Novolukoml, Rossony, Vitebsk), Minsk, Homyel'skaya Voblasts'(Gomel), Brestskaya Voblasts'(Brest), Hrodzyenskaya , Hrodzyenskaya Voblasts'(Grodno), Voblasts(Hrodna)
  3. Belgium (10/10,31),Namur, Antwerpen(Hoboken, Merksem, Deurne, Antwerp,Edegem, Mol, Grobbendonk, Kontich, Schoten, Mechelen, Wijnegem, Brecht), Brabant(Diegem, Nivelles, Meise, Sint-genesius-rode), Liege(Amay, Sprimont, Verviers), West-vlaanderen(Avelgem, Damme, Brugge, Blankenberge,), Oost-vlaanderen (Lede, Zottegem, Gent), Hainaut(Charleroi), Limburg(Hamont, Kerkrade,), Liege(Esneux. Tilff), Oost-vlaanderen(Temse), Liege(Liège, Verlaine, Saint-Georges, Fize-fontaine)
  4. Bosnia-Herzigovina(4,5), Mostar, Sarajevo, Novi Travnik, Republika Srpska(Banja Luka,Foca)
  5. Bulgaria(8,8), Pleven(Levski), Varna, Grad Sofiya(Sofia), Gabrovo, Burgas, Montana, Plovdiv, Vratsa(Kozloduj)
  6. Croatia(11,21), Grad Zagreb (Zagreb,Samobor, Zapresic), Varazdinska(Varazdin, Belec), Krapinsko-zagorska(Donja Bistra), Sisacko-moslavacka(Sisak), Primorsko-goranska(Grobnik, Krk, Ogulin, Lopar,Rijeka, Novi Vinodolski), Splitsko-dalmatinska(Bol, Split), Pozesko-slavonska(Pozega, Djakovo), , Licko-senjska(Senj), Dubrovacko-neretvanska(Dubrovnik), Istarska(Zminj), Karlovacka(Karlovac), Varazdinska(Donji Kraljevec)
  7. Cyprus(1,1), Nicosia, Osjecko-baranjska(Osijek), Limassol(Lemesos)
  8. Czech Republic(3/13,5), Moravskoslezsky Kraj(Hluchin, Ostrava), Stredocesky Kraj(Mlada Boleslav),Hlavni Mestro Praha(Praque, Praha)
  9. Denmark(2,2), Staden Kobenhavn(Copenhagen), Viborg
  10. Estonia, Harjumaa(Tallinn)
  11. Finland(2,4), Southern Finland(Helsinki, Järvenpää, Kaarenkylä),Western Finland(Turku)
  12. France (13/26,36) from Lorraine(Metz), Bretagne(Saint-brieuc, Penguily,Telgruc-sur-mer), Languedoc-roussillon(Montpellier), Rhone-alpes(échirolles, Baix, Lyon, Ambérieu-en-bugey, Annecy-le-vieux), Sorel-moussel , Aquitaine(Bordeaux, Saint-front-de-pradoux), Centre(Saint Aignan, Tours), Midi-pyrenees(Albi), Ile-de-france(Noisy-le-grand, Neuilly-sur-seine,Issy-les-moulineaux,Paris, Vincennes, Maisons-alfort, Le Chesnay, Coulommiers, Montgeron,Pantin ), Nord-pas-de-calais(Haubourdin, Valenciennes), Poitou-charentes(Cognac), Haute-normandie(Rouen, Le Havre), Champagne-ardenne(Reims, Troyes), Haute-normandie(Le Havre), Bretagne(Quimperlé, Vannes), Provence-alpes-cote D'azur(Aix-en-provence)
  13. Germany (16/16,138), Berlin, Bremen, Baden-Wurttemberg(Abtsgmünd, Aulendorf, Schwäbisch Gmünd, Riedlingen, Gomaringen, Ludwigsburg, Leinfelden-echterdingen, Sigmaringenn, Rottenburg, Fellbach, Bad Waldsee, Freiburg, Schwann, Asperg, Oftersheim, Mannheim, Stuttgart, Hornberg, Pforzheim, Weil Der Stadt, Karlsruhe, Meckesheim, Bruchsal, Kressbronn, Heidelberg), Bayern(Klaus, Harlaching, Mainburg, Grasbrunn, Gammelsdorf, Neustadt Am Kulm, Edling, Mespelbrunn, Oberappersdorf, Neutraubling, Fürstenfeldbruck, Rütschenhausen, Gaißach, Hilpoltstein, Germering, Hof, Wolnzach, Hahnbach, Elsendorf, Neufahrn, Röthlein, Hirschaid, Bad Tölz, Sonthofen, Munich, Fürth, Eglharting, Germering, Nuremberg,Hersbruck, Roth, Baierbrunn), Brandenburg(Templin), Frankfurt Am Main, Hamburg, Hessen(Gießen, Wald-michelbach, Vellmar, Kassel, Weilburg, Offenbach, Eschborn, Bad Nauheim, Bad Vivel, Darmstadt, Eschwege, Friedberg, Friedrichsdorf, Griesheim, Großalmerode, Hattersheim, Herbelhausen, Kronberg, Rosbach, Wiesbaden, Kelsterbach, Viernheim, Wellburg), Niedersachsen(Giesen, Hanover, Aurich, Achim, Edemissen, Moisburg, Barleben, Hameln, Oldenburg, Wunstorf, Osnabrück, Wolmirstedt) , Nordrhein-westfalen (Bergkamen, Duisburg, Paderborn, Wipperfürth, Köln,Pulheim, Bielefeld, Essen, Gütersloh, Verl, Wuppertal, Wese, Hamm, Iserlohn, Senden, Mechernich, Drensteinfurt, Münster, Titz, Oberhausen, Erwitte ), Mecklenburg-vorpommern(Bergen), Rheinland-pfalz (Gillenfeld, Zweibrücken, Altrip, Hirschberg, Rödersheim-gronau, Kaiserslautern, Mainz, Grünstadt, Koblenz, Ludwigshafen), Schleswig-holstein(Lübeck, Roseburg, Kiel), Sachsen-anhalt(Halle, Barleben, Egeln, Blankenburg, Wernigerode, Cattensted, Beesenlaublingen,BerBel, Hornhausen, Schönebeck, Halberstadt, Wolfen, Magdeburg,Quedlinburg, Altenweddingen), Sachsen(Dresden), Thuringen(Jena, Unterpörlitz)
  14. Greece(11,15), Attiki(Athens, Spétsai) , Thessalonki, Xanthi(Xánthi), Magnisia (Vólos), Rodhopi(Komotiní), Korinthia(Corinth, Kórinthos), Argolis(árgos, Kranídion), Lakonia(Stoúpa), Kavala(Kavála) ,Thessaloniki(Thessaloníki), Kranídion, Argolis, Florina(Flórina),Argolis( árgos), Rodhopi(Komotiní)
  15. Hungary(17,25), Bacs-kiskun(Csólyospálos), Baranya(Kozármisleny), Budapest, Fejer(Székesfehérvár, Dunaújváros), Bekes(Békéscsaba, Mezobereny), Debrecen, Gyor, Pest(Gyomro), Gyor-moson-sopron(Dunakiliti, Sopron), Hajdu-bihar(Zsáka), Szabolcs-szatmar-bereg(Mátészalka), Somogy(Kaposvár), Pecs(Pécs, ), Szeged, Veszprem(Balatonalmádi), Hajdu-bihar(Téglás), Nograd(Szécsény), Borsod-abauj-zemplen(Méra), Komarom-esztergom(Tatabánya, Komárom), Pest(Diósd, Törökbálint), Pest(Budakeszi)
  16. Iceland(1,1), Gullbringusysla(Reykjavík)
  17. Ireland(2,3) Dublin(Rathfarnham,Dublin), Roscommon
  18. Italy (17/21,103) , Giulia Abruzzi(Pescara), Basilicata(Matera), Calabria(Cosenza), Campania(Torre Del Greco, Casalnuovo Di Napoli, Frattamaggiore, Teggiano, Naples, San Giorgio A Cremano, Battipaglia), Emila-romagna (Concordia Sulla Secchia, Bagnolo In Piano, Rubiera, Bologna, Imola, Modena, Forl, Viadanaì, Albinea), Lazio (Rome, Monte Porzio Catone, Monterotondo) , Liguria (Savona, Genoa,Verezzo, Osiglia), Lombardia(Vittuone, Isorella,Monza, Vertova, Varese, Brescia, Milan, Marcallo Con Casone,Castelli Calepio, Vimodrone), Piemonte(Alessandria, Chieri, Settimo Torinese, Casale Monferrato, Alba, Cuneo, Desana, Turin, Novara, Moncalieri, Verceli, Cuorgnè, Bussoleno), Puglia(Galatina, Bari, Barletta, San Cesario, Foggia, Cerignola, Alberobello, Modugno, Casamassima), Friuli-venezia Giulia(San Giovanni Al Natisone,Trieste, Pordenone, Monfalcone, Gorizia, Friuli-Venezia Giulia), Sicilia(Gela, Canicattì, Aci Catena,Ragusa, San Gregorio Di Catania, San Giovanni La Punta, Bagheria, Palermo, Caltagirone, Misterbianco, Messina, Syracuse, Catania, Torregrotta), Sardegna(Muravera, Sennori, Nuoro, Ozieri, Quartucciu, Cagliari, Elmas, Palau), Toscana(Lucca, Leghorn, Pisa Prato, Pistoia, Florence,), Trentino-alto Adige (Caldaro, Adige, Trento, Bolzano, Mezzolombardo), Veneto(Mestre, Verona, Padova, Vicenza, Montecchio Maggiore, Torri Di Quartesolo), Umbria(Foligno)
  19. Latvia(2,2), Riga, Ventspils
  20. Lithuania(2,2), Kauno ApskrKaunas), Vilniaus Apskritis(Vilnius)
  21. Luxembourg(2,6), Diekirch(Erpeldange,Schoos), Luxembourg(Soleuvre, Luxembourg, Rollingen, Strassen)
  22. Macedonia(1) Macedonia(Gostivar), Karpos(Skopje), Veles, Kicevo
  23. Moldava(1) Chisinau
  24. Montenegro(1), Podgorica
  25. Netherlands (13,44), Noord-holland(Haarlemmermeer, Hilversum, Bussum, Den Helden, Amsterdam, Assendelft, Schiphol), Noord-brabant(Udenhout, Eindhoven,Prinsenbeek, Cranendonck, Breda), Flevoland(Almere, Marknesse), Utrecht(Nieuwegein, Vianen, Wijk Bij Duurstede, Bilthoven, Amerongen, Veenendaal, Bilthoven, Houten), Groningen(Usquert,Wagenborgen), Limburg(Tegelen, Roermond), Gelderland(Bennekom, Vaassen, Epe,Nijmegen ), Zuid-holland(Maassluis, Alphen, Krimpen, Leidschendam,, Rotterdam, Rijswijk, Den Haag, Wateringen, Hoek Van Holland, Delft, Capelle, Leiden,Noordwijk, Zoetermeer), Overijssel(Rijssen, Deventer, Holten), Gelderland(Arnhem), Drenthe(Meppel), Zeeland(Terneuzen)
  26. Norway(4,4) Hordaland(Loddefjord), Friesland(Franeker), Oslo, Sor-trondelag(Trondheim), More Og Romsda(Molde)
  27. Poland (34,84), Skierniewice(Radziejowice), Piotrkow(Zelów, Tomaszów Mazowiecki), Czestochowa(Lubliniec,Starokrzepice), Opolskie(Opole), Tarnobrzeg(Koprzywnica), Biala Podlaska(Miedzyrzec Podlaski), Ciechanow, Gdansk(Gdynia, Pomorskie, Trabki Wielkie), Podlaska, Bielsko (Bielsko-biala, Dankowice, Wadowice, Oswiecim, Kety, Skoczów,Babice), Dolnoslaskie(Wroclaw, Siedlecin), Jelenia Gora(Boleslawiec, Zgorzelec) , Kielce(Konskie,Swietokrzyskie), Kalisz(Mazury), Katowice(Dabrowa Gornicza, Zebrzydowice, Czerwionka, Zabrze, Gliwice,Tychy, Bytom, Ledziny, Chrzanów, Chorzów, Pyskowice, Bedzin, Starachowice, Pszczyna, Piekary Slaskie), Legnica(Lubin), Lodz(Lodzkie, Ozorków), Poznan (Grodzisk, Gniezno, Wielkopolski) , Bialystok(Lapy, Podlaskie) Pila, Malopolskie(Cracow), Radom(Jedlnia-letnisko), Rzeszow(Frysztak), Slaskie(Katowice), Walbrzych (Duszniki Zdrój,Nowa Ruda, Swidnica, Pieszyce), Wielkopolskie(Poznan), Warszawa (Kobylka, Opacz, Komorów, Brwinów, Warsaw, Pruszków, Blonie, Warszawa), Torun(Grudziadz), Zachodniopomorskie(Szczecin, Goleniów, Koszalin), Wloclawek(Polska, Przysiek, Ciechocinek), Radom, Bilgoraj(Zamosc) , Olsztyn(Ketrzyn,Warminsko-mazurskie ), Kalisz(Mazury), Kartow(Wieliczka), Suwalki(Gizycko), Nowy Sacz(Limanowa, Bialka), Przemysl(Jaroslaw), Bydgoszcz( Kujawsko-pomorskie, Sepolno Krajenskie, Inowroclaw), Tarnow(Lisia Góra), Krakow(Skawina), Tarnobrzeg(Janów Lubelski)
  28. Portugal(7,15), Porto(Maia, Vila Do Conde), Lisboa(Cascais, Lisbon, Sintra,Almargem Do Bispo, Amadora, Carnaxide), Braga (Santa Maria), Faro (Santa Bárbara De Nexe), Azores(Angra), Santarem(Santarém,
  29. Almeirim), Aveiro(Espinho, Esmoriz), Viana Do Castelo(Melgaço)
  30. Romania(16,16),Tulcea(Sarichioi), Ilfov(Buftea), Harghita(Miercurea-ciuc), Brasov, Iasi, Vaslui, Bistrita-nasaud(Vatra Dornei), Prahova(Ploiesti), Bucuresti(Bucharest), Botosani, Bihor(Oradea), Suceava(Radauti), Neamt(Piatra Neamt), Sibiu, Hunedoara(Hateg), Timis(Timisoara)
  31. Russian Federation(26,26), Tatarstan(Kazan) , Orel, Sakhalin(Yuzhno-sakhalinsk), Belgorod, Kemerovo, Kaluga(Obninsk)Moscow(Moscow City,Khimki), Pskov, Primor'ye(Vladivostok),Kaluga, Saratov, Yaroslavl'(Yaroslavl), Lipetsk, Saint Petersburg City(Saint Petersburg), Krasnodar(Lenina), Rostov(Rostov-na-donu),Krasnodar( Sochi), Khabarovsk, Yamal-nenets(Tarko-sale), Moskva(Dmitrov), Voronezh, Orenburg(Orsk), Sverdlovsk(Yekaterinburg), Orenburg(Buzuluk), ,Kemerovo(Novokuznetsk), Udmur(Izhevsk), Udmurt(zhevsk), Irkutsk
  32. Serbia(3, 17), Serbia Proper(Leskovac, Obrenovac, Pancevo, Belgrade,Beograd, Bela Palanka, Kragujevac, Dardania, Backa Topola, Kosovo, Nis, Beograd, Sabac), Vojvodina(Novi Sad, Zrenjanin)
  33. Slovakia(4,7) Bratislava, Banska Bystrica(Banská Bystrica, Rimavská Sobota, Rohovce, Rimavská, Zvolen), Zilina, Rohovce, Váhom, Nitra(Trnovec Nad)
  34. Slovenia(2,14), Bohinj(Lesce, Cerknica,, Lukovica, Ravne, Kranj, empeter, Ljubljana, Sempeter, Trzin, Novo Mesto, Kocevje, Logatec, Jesenice), Brezovica(Maribor, Ormoz)
  35. Spain (20,67), Pais Vasco(Vitoria), Islas Baleares(Palma), Aragon(Peraltilla,, Zaragoza, Teruel,), Andalucia(Cullera, El Puerto De Santa Maria, Cadiz, Granada, Jaén, Melilla, Servilia, Marbella, Mijas, Málaga, Dos Hermanas, Almería, Jerez), Comunidad Valenciana(Orihuela, Torrevieja, Comunidad Valenciana, Valencia, sueca, Elche, Novelda), Casti-la Moncha(Albacete), Castilla Y Leon(Burgos), Catalonia (Girona, Cassá De La Selva, Manresa, Badalona, Barcelona, Granollers, Gerona, Mataró, Salt, Solsona, Silis, Cardedeu), Canarias(Adeje, Las Palmas, Santa Cruz De Tenerife), Extremadura(Badajoz), Galicia(Pontevedra, Vigo, Lalín, Santiago De Compostela, A Coruña,), Islas Baleares, Murcia (Alcantarilla) , Madrid(Fuenlabrada, Alcorcón, Villaviciosa De Odón, Torrejón De Ardoz), Navarra (Tafalla, Pamplona), Pais Vasco(Irún, Gáceta), Cantabria(Santander), Sicilia(Vittoria), Santa Catarina(Itajaí, Joinville, Blumenau, Camboriú, Florianópolis), Castilla-la Mancha(Tomellos), Comunidad Valenciana(Elche), Asturias(Gijón)
  36. Sweden(7,9), Norrbottens Lan(Luleå), Stockholms Lan (Södertälje,Sollentuna,), Orebro Lan(Hällefors), Kalmar Lan(Kalmar), Uppsala Lan(Uppsala), Varmlands Lan(Sunne), Ostergotlands Lan(Linköping), Habo, Gotaland(Vastra), Blekinge Lan(ödeby)
  37. Switzerland(8,10, Bern(Wabern), Schaffhausen, Obwalden(Mörigen, Nods), Zurich(Zürich, Pfäffikon), Valais(Sion), Vaud(Lausanne), Ausser-rhoden(Herisau), Sankt Gallen(Walzenhausen)
  38. Turkey(7,8), Hatay(Antakya,Iskenderun), Istanbul, Ankara, Konya, Icel(Mersin), Trabzon, Bursa
  39. United Kingdom(38,41), from Hampshire(Southsea), Northamptonshire (Northampton), Nottinghamshire(Mansfield), Surrey(Surbiton), Greater London(Isleworth), Blackpool, Buckinghamshire(Buckingham) Cambridgeshire (Cambridge,Ely), Cheshire(Winsford), Coventry, Devon(Barnstaple), Derbyshire(Derby), Glasglow(Glasgow City), West Sussex(Burgess Hill ), Gloucestershire(Gloucester), Kirklees(Huddersfield), Leicestershire(Hinckley), London, Milton Keynes, New Hampshire(Manchester), Rochdal, West Sussex(Pagham), West Lothian (Livingston), Birmingham, Hertford(Norton, Watford), Reading, Leeds, West Berkshire(Newbury), Portsmouth, Wolverhampton, Croydon, Rotherham, Bristol, Swansea, West Midlands(Sutton Coldfield), Staffordshire(Smethwick), Windsor And Maidenhead(Maidenhead), Monmouthshire(Usk). Witney(OxfordShire), Kingston Upon Hul(Kingston Upon Hull)
  40. Ukraine(12,12), Dnipropetrovs'ka Oblast'(Dnepropetrovsk), Donets'ka Oblast'(Malaya), Kyyivs'ka Oblast (Kiev), Kharkivs'ka Oblast' (Kharkov), Mykolayivs'ka Oblast' (Nikolaev), Odes'ka Oblast(Odessa), Volyns'ka Oblast'(Lutsk), Zaporiz'ka Oblast(Zaporozhye), L'vivs'ka Oblast'(Lviv), Zhitomir(Zhytomyrs'ka Oblast'), Zhytomyrs'ka Oblast'(Zhitomir), Poltavs'ka Oblast'(Poltava)
African & Middle-East
  1. Algeria(5,5), Alger (Algiers ), Boumerdes(Boudouaou), Bouira(Sidi Aïssa), Setif(Sétif), Constantine(Skikda)
  2. Burkina Faso
  3. Cameroon
  4. Cote D'ivoire, Abidjan, Lagunes,
  5. Democratic Republic of Congo(1,1), Kinshasa
  6. Egypt(4,5), Cairo, Al Qahirah(cairo, Helwan), Al Iskandariyah(Alexandria), Al Gharbiyah(Tanta), Al Buhayrah(Ramsis)
  7. Iran, Islamic Republic Of, Khorasan(Mashhad), Esfahan(Tehran), Ardabil
  8. Ghana
  9. Guyana, Demerara-mahaica(Georgetown)
  10. Israel(4,5), Yerushalayim(Jerusalem), Hamerkaz(Rishon Le Zion, Hod Hasharon), Hefa(Haifa), Tel Aviv
  11. Kenya(4,4), Nairobi Area (Nairobi), Nyanza(Kisumu), Western(Kakamega), Coast(Mombasa)
  12. Kuwait
  13. Libya, Libyan Arab Jamahiriya
  14. Madagascar(1,1) Antananarivo,
  15. Morocco(2,2), Gurgaon, Safi(Youssoufia)
  16. Nigeria(1,1), Federal Capital Territory(Abuja)
  17. Oman(1,1), Masqat(Muscat, )
  18. Saudi Arabia(2,2) Ash Sharqiyah (Dhahran), Ar Riyad(Riyadh)
  19. Senegal(1,1) Dakar
  20. South Africa(5,11), Gauteng(Boksburg, Pretoria, Johannesburg, Roodepoort),Western Cape(Cape Town, Durbanville, Stellenbosch, Bellville), North-west(Fochville), Kwazulu-natal(Durban), Kwazulu-natal(Pietermaritzburg)
  21. Tunisia, Safaqis
  22. UAE(2,2), Sharjah, Dubai

North America

Canada (8/13,39)
  1. Alberta (Edmonton, Medicine Hat)
  2. Manitoba(Winnipeg)
  3. New Brunswick (Moncton, Saint John)
  4. Ontario (Thornhill, Little Current, Waterloo,Scarborough, Cobourg,Toronto,Etobicoke, Barrie, Brampton, Taschereau, London, Milton)
  5. Quebec (Beaconsfield, Lévis, Downingtown, Montreal,Verdun,Rimouski, Chicoutimi, Sherbrooke, Laval)
  6. Saskatchewan(Saskatoon, Prince Albert)
  7. British Columbia(Nanaimo, Vancouver, Abbotsford,New Westminster, Sidney, Port Coquitlam,Nelson, Victoria)
  8. Nova Scotia(Sydney, Leme, Halifax)

USA (46/293)
  1. Alabama (Montgomerey, Birmingham, Harvest, Goodyear, Andalusia, Enterprise, Huntsville)
  2. Alaska(Fairbanks, Juneau, Anchorage)
  3. Arizona (Chinle, Scottsdale,Mesa,Tucson)
  4. Arkansas(Little Rock,Texarkana),
  5. California (Citrus Heights, Hayward, La Mirada, San Fransisco, Newark, Alhambra, Monterey Park, Sanger, Anaheim,Aptos, Lake Isabella, Fontana, San Bernardino, Rosemead, Rocklin, Auburn,Brea,Buena Park, Bakersville, El Cajon, Cathedral City, Los Angeles, Sacremento,San Diego, Oakland, Vacaville, Merced, Rowland Heights, Long Beach, Foresthill, Irvine, Walnut Creek, Fresno, Rancho Cucamonga, Calabasas, Castro Valley, San Clemente, Mountain View, San Jose,South Pasadena, Winnetka, Orange, Riverside, Mexicali Baja, Fullerton)
  6. Colorado (Colorado Springs, Denver, Englewood)
  7. Connecticut(Greenwich, Groton, Hamden, New Canaan, Meridien, Stamford)
  8. Delaware(Dover)
  9. District Of Columbia(Washington)
  10. Hawaii(Kailua Kona, Kapolei,)
  11. Idaho (Meridian,Lewiston, Boise)
  12. Indiana (Fort Wayne, Muncie, Angola)
  13. Illinois (Schaumburg, Hoffman Estates, Buffalo Grove, Roselle, Chicago, Alsip, Barrington, Peoria, Orland Park, Palos Hills, Des Plaines, Lincolnshire, Wheaton, Worth)
  14. Iowa, (Hamburg, Iowa City, Troy, Fairfield, Sidney)
  15. Florida (Hialeah,Hollywood, Winter Park, Deland, Saint Augustine, Jupiter, Kissimmee, Fort Meyers, Saint Cloud,West Palm Beach, Miami, Miami Beach, Tallahassee, Orange Park, Jacksonville, Pompano Beach, Rockledge, Orlando, Fort Lauderdale, Tampa, Clearwater, Sarasota, Boca Raton)
  16. Georgia (Conyers, Alpharetta, Macon, Savannah, Tampa, Marietta, Atlanta, Roswell, Kennesaw, Norcross)
  17. Kansas (Concordia, Wichita)
  18. Kentucky (Harrodsburg)
  19. Louisiana (Monroe,Shreveport)
  20. Maine (Westbrook)
  21. Maryland(Frederick, La Plata, Baltimore, Columbia, Lanham, Sykesville, Silver Spring)
  22. Massachusetts(Cambridge, Framingham, Tewksbury, Bedford, Mattapan, Acton, Billerica, Uxbridge, Marlborough)
  23. Michigan (Bridgman, Cold Water, East Lansing, Owosso, Traverse City, Grand Rapids)
  24. Minnesota (Minneapolis, Rochester)
  25. Missouri (Saint Louis, Sikeston, Florissant, Kansas City, Nixa)
  26. Nevada(Las Vegas)
  27. New Hampshire(Derry)
  28. New Jersey(Andover, Paramus, Tranquility, Mahwah, Midland Parks, Teaneck, Somerset, Paterson, Vineland, Riverton, Flemington,Westwood,Willingboro)
  29. New York (Buffalo, Brooklyn, Staten Island, Astoria, Babylon, Brookyln, Clifton Park, Fayetteville, Waterloo, West Islip, Rego Park, Flushing, Lindenhurst, Rensselaer, Oceanside, Rochester)
  30. North Carolina(Burlington, Cornelieus, Durham, Mooresville, Asheville,Fletcher,North Hollywood,Monroe, Cuernavaca, )
  31. North Dakota(Fargo)
  32. Ohio (Akron, Bucyrus, Bloomingdale, Cambridge, Bowling Green, Milford, Powell, Hudson, Cincinnati, Logan, Loveland, Twinsburg, Marysville, Yellow Springs)
  33. Oklahoma (Oklahoma City, Stillwater)
  34. Oregon (Portland, Beaverton)
  35. Pennsylvania (Philadelphia, Harrisburg, Chester Springs, Orefield, Malvern, Downingtown, Landsdale, West Chester, Doylestown, Pottstown, Scranton)
  36. Puerto Rico(Anasco)
  37. South Carolina (Florence, Columbia, Hilton Head Island,)
  38. South Dakota(Aberdeen, Sioux Falls)
  39. Tennessee (Brownsville, Nashville, Memphis, Bell Buckle, Chattanooga,)
  40. Texas (Irving, Killeen, Texarkana, Kemah, League City,Dallas, San Antonio, Houston, Corpus Christi, El Paso, Fort Worth, Abilene, Harker Heights, Lake Jackson)
  41. Virginia, (Arlington, Ashburn,Floyd, Richmond, Rocky Mount, Lebanon, Chesapeake, Fairfax Station)
  42. Vermont(Enosburg Falls, Chester)
  43. West Virginia
  44. Washington (Bellingham,Seattle, Tacoma, Olympia, Redmond,Everett)
  45. Wisconsin (Neenah, Tomah, Pound, Green Bay, Appleton, Madison, Bellingham, Hatley, Hartford,Wausau, Plover, Bellevue, Janesville)
  46. Utah (Ogden, Salt Lake City, Hooper,Washington, Sandy)
Mexico(26, 48)
  1. Baja California(ijuana)
  2. Chiapas(Tapachula, Zinacantán, Tuxtla Gutiérrez, La Trinitaria)
  3. Chihuahua
  4. Colima
  5. Coahuila De Zaragoza(Saltillo, Torreón)
  6. Distrito Federal(Mexico)
  7. Guerrero(Chilpancingo)
  8. Guanajuato(León)
  9. Hidalgo(Tulancingo)
  10. Jalisco (Zapopan, Tlajomulco, Guadalajara)
  11. Juarez
  12. Mexico(Tultitlán, Cuautitlán Izcalli, Nezahualcóyotl, Naucalpan, Guanajuato, Metepec)
  13. Morelos(Cuernavaca, Cuernavaca)
  14. Naucalpan
  15. Oaxaca(Tuxtepec)
  16. Quintana Roo(Chetumal)
  17. Queretaro De Arteaga(Querétaro)
  18. Nuevo Leon(Monterrey, San Nicolás De Los Garza, Garza García)
  19. Puebla(Tehuacán)
  20. Sonora (Obregon)
  21. Sinaloa (Los Mochis, Mazatlán, Sinaloa)
  22. Tabasco(Villahermosa)
  23. Tamaulipas(Tampico, Nuevo Laredo, Reynosa, Altamira€)
  24. Veracruz-llave(álamo, Tierra Blanca,Veracruz, Poza Rica, Xalapa)
  25. Yucatan(Mérida)
  26. Zacatecas(Madero)

Central America


  1. Costa Rica, San Jose(San José), Limon(Limón), Alajuela(San Ramón)
  2. Guatemala, Guatemala(Guatemala City)
  3. Honduras, Francisco Morazan (Tegucigalpa)
  4. Nicaragua(Managua), Masaya(Masatepe)
  5. Panama , Chiriqui(Pueblo Nuevo, David ), Panama(La Chorrera)
  6. Trinidad & Tobago, St George
Caribean

  1. Dominician Republic, (Santiago, Santo Domingo),Espaillat(Moca, ), San Cristobal(Fundación)

South America
  1. Argentina(13,54), San Luis(Mercedes), Tucuman(Tucumán), Corrientes, Entre Rios(Viale, Federal), Bueno Aires(Florencio Varela, La Pata, Martinez, Olivis, San Antonio De padua, San Martín, Olivos, Luján, Hurlingham, Temperley, Junín, Banfield,Avellaneda, Ituzaingó, San Isidro, Bahia Blanca, Bernal, Brandsen, Boulogne, Berazategui, , Matheu, Lanús, La Plata, Monte Grande, Quilmes, Ranelagh,Villa Ballester, Gonnet, Mar Del Plata,Verónica, Santos Lugares, San Nicolás), Cordoba(Córdoba, Laboulaye, Serrano, Villa Carlos Paz,),Distrito Federal(Villa Devoto,Buenos Aires) Mendoza(Junín), Santa Fe(Rosario,Villa Constitución), Chaco(Resistencia), Neuquen(Neuquén, San Martín De Los Andes), Mendoza (Rivadavia), Entre Rios(Concordia), Mendoza, Chubut(Trelew), Misiones(Posadas, Puerto Rico, Eldorado)
  2. Bolivia(3,3), El Beni(Santa Cruz), Cochabamba, La Paz
  3. Brazil (22,108), Tocantins(Palmas), Rio Grande Do Norte(Natal), Amazonas(Manaus), Espirito Santo(Vila Velha) , Golas(Inhumas), Sergipe(Aracaju), Bahia (Salvador) , Rondonia(Cacoal, Ji-paraná,Pôrto Velho),Parana(Campo Mourão, Curitiba, Loanda, Londrina, Paranavaí, Foz Do Iguaçu, Maringá), Pernambuco(Recife, Olinda, São João), Minas Gerais(Ipatinga, São João Del Rei, Contagem, Almenara, Carmo Do Rio Claro, Belo Horizonte, Uberlândia, Ubaporanga,Betim, Mijas), Goias(Goiânia,Senador Canedo, Anápolis), Paraiba(Patos, Bayeux, João Pessoa), Distrito Federal(Brasília), Rio De Janeiro(Petrópolis,Rio De Janeiro,), Ceara(Fortaleza), Para(Belém, Santarém,), Mato Grosso Do Sul(Dourados, Campo Grande), Rio Grande Do Sul(Caxias Do Sul, Santa Cruz Do Sul, Novo Hamburgo, Cachoeirinha, Gravataí, Sapiranga, Estrêla, Porto Alegre, Igrejinha, Cruzeiro Do Sul, Venâncio Aires), Piaui(Teresina), Maranhao(São Luís, Coroatá,), Sao Paolo(Ribeirão Prêto, Indaiatuba, Taubaté, Santos, Pontal, Louveira, Santo André, São José Do Rio Prêto, Getulina, São paolo, Manuel,Moji Das Cruzes, Tatuí, Osasco, Sao Carlos, Araçatuba, Nova Odessa, Lins,Laranjal Paulista, Presidente Prudente, Sorocaba, Juquitiba, Araraquara, Araras, Mogi-guaçu, Campinas, Leme, Arujá, São Sebastião,Birigui, São José Dos Campos, Piraju,Caraguatatuba, Piracicaba, Avaré,Bebedouro, Garça, Itapira, São Paulo, Rio Claro, Pao, Limeira, Guarulhos, Hortolândia,Bauru, Embu, Jundiaí , Jaboticabal,Mirassol, Barueri,), Santa Catarina(Blumenau, Schroeder, Gravatal, Criciúma, Tubarão), Maranhao(São Luís)
  4. Chile(13,17), Region Metropolitana (Santiago), Magallanes Y De La Antartica Chilena(Punta Arenas), Coquimbo, Bio-bio(Chillán, Concepción, Los ángeles), Araucania(Temuco), Valparaiso(Viña Del Mar, Valparaíso), Rio Grande Do Sul(Porto Alegre), Los Lagos,(aldivia), Los Lagos(Valdivia, Osorno), Antofagasta(Calama) , Libertador General Bernardo O'higgins(Rancagua), Maule(Parral)
  5. Colombia(9,9), Atlantico (Barranquilla), Santander(Bucaramanga), Department(Tunja, Boyacá), Cundinamarca(Bogotá, Zipaquirá), Norte De Santander(Cúcuta), Bolívar , Santande(Bucaramanga), Bolivar Department(Cartagena), Huilia(Beiva),Tolima(lbague)
  6. Ecuador(1,1) , Pichinca (Quito)
  7. Paraguay(2,2) , Central( Asunción), Itapua(Encarnación)
  8. Peru(5,5), Piura(Sullana), Lima, La Libertad(Trujillo), Arequipa, Tacna
  9. Uruguay(4,4), Montevideo, Maldonado, San Jose(San José), Tacuarembo(Tacuarembó)
  10. Venezuela(13,18), Sucre(Cumaná), Guarico(Valle De La Pascua), Nueva Esparta(Manzanillo, Porlamar), Distrito Federal (Caracas), Monagas(Bolivar, Maturín), Aragua(Maracay), Anzoategui(Barcelona), Barinas, Lara(Barquisimeto, Cabudare), Zulia(Maracaibo, Cabimas, ), Miranda(Petare, Charallave), Tachira(San Cristóbal), Cabimas, Zulia, Merida(Mérida)

Asia-Pacific
  1. Australia(6/8, 26), Queensland(Brookfield, Mooloolah, Brisbane,Gold Coast), New South Wales (Toronto, Uki, Manly, Mascot, Sydney, Murwillumbah. Narellan, Parkes,Liverpool,Pyrmont), Victoria (Box Hill, Glen, Geelong, Berwick, Waverley, Melbourne, Horsham, Hampton Park), Western Australia(Kalgoorlie, Perth), South Australia(Adelaide, Port Augusta), Australian Capital Territory(Canberra)
  2. Brunei Darussalam(1,1)(Bandar Seri Begawan)
  3. China(9,10) , Guangdong(Guangzhou, Dongguan), Guangxi (Nanning), Guangdong(Shenzhen), Shanghai, Shanxi (Henan), Jilin(Changchun), Shaanxi(Xian), Beijing, Shandong(Qingdao), Fujian(Shangxi)
  4. French Polynesia(1,1)
  5. Guam(3,3) Barrigada, Hagatna, Yigo
  6. Hong Kong(5,5), Quarry Bay,Central District,Causeway Bay,Chai Wan, North Point
  7. India (17/35,46), Punjab(Amritsar, Phagwara), Goa(Cortalim), Jharkhand(Ranchi), Maharasta(Nasik, Bombay,Pune, Aurangabad) , Kerala (Kollam, Kochi, Thiruvananthapuram, Pathanamthitta), Gujarat(Palanpur, Bhavnagar, Anand, Rajkot, Surat, Ahmadabad, Nadiad, Vadodara), Karnataka(Bangalore, Mangaluru), Tamil Nadu(Madurai, Sennori, Tiruppur, Madras, Erode, Singanallur, Coimbatore, Tiruchchirappalli, Erode), West Bengal(Calcutta), Delhi (New Delhi), Andhra Pradesh(Hyderabad), Uttar Pradesh(Muzaffarnagar, Meerut, Lakhnau, Ghaziabad, Gorakhpu), Madhya Pradesh(Ujjain, Indore, Bhopal), Bihar(Patna), Haryana(Faridabad, Sonipat, Gurgaon), Kerala(Kochi), Rajasthan(Jaipur), Chandigarh
  8. Indonesia(8,14), Yogyakarta,Jakarta Raya (Jakarta), Jawa Barat(Bandung,Tangerang, Bekasi, Cimahi, Sukabumi, Bogor), Jawa Tengah(Semarang), Jawa Timur(Tulungagung, Surabaya), Jawa Tengah(Mega), Sumatera Utara(Medan), Sumatera Selatan(Palembang)
  9. Japan(3,3), Tokyo, Kanagawa(Yokohama), Aichi(Ichinomiya), Gumma(Tomioka)
  10. Korea(4,4), Seoul-t'ukpyolsi(Seoul), Kwangju-jikhalsi(Gwangju), Kyonggi-do(Ansan), Inch'on-jikhalsi(Incheon)
  11. Macau, Ilhas(Macau)
  12. Malaysia (8/13,14) , Penang(Butterworth, Penang), Kelantan(Pasir Mas), Selangor(Shah Alam, Petaling Jaya, Kuala Selangor), Johor(Johor Baru, Kluang), Sabah(Kota Kinabalu), Sarawak (Kuching), Melaka, Perak(Ipoh, Parit Buntar), Kuala Lumpur, Pahang(Kuantan)
  13. Mauritius
  14. Mongolia(1,1) (Ulaanbaata)
  15. Nepal, Kathmandu
  16. New Zealand(3,3), Wellington(Porirua), Auckland(Dargaville), Nelson
  17. Pakistan(4,5), Punjab(Sahiwal, Lahore), Kashmir, Islamabad, Sindh(Karachi)
  18. Philippines(15,21), Nueva Ecija(Quezon),Cebu(Cebu City), Bulacan(Malolos), Manila, Rizal(Pasig, Mandaluyong, Makati, Sampaloc, MalandayParañaque), Mandaue, Davao(Tagum, Davo City), Quezon City(Caloocan), Tagbilaran, Lipa, Surigao Del Sur(Bislig), Cavite City(Cavite), Pamoanga(San Fernando), Bukidnon(Malaybalay), Nueva Ecija(Quezon), Laguna(College), Philippine(Banguet)
  19. Singapore(1) Singapore
  20. South Korea(1), Seoul-t'ukpyolsi (Seoul)
  21. Sri Lanka(1,1) Western(Colombo), Uva(Badulla)
  22. Taiwan(2,5), T'ai-pei(Taipei), T'ai-wan(Kangshan,Kaohsiung, Taoyüan, Hsinchu)
  23. Thailand(3,3), Khan Kaen, Krung Thep (Bangkok), Chai Nat(Sankhaburi)
  24. Vanuatu (Vila, Efate)
  25. Fpo, Armed Forces Pacific
  26. Vietnam , Song Be(Plây Cu), Quang Tri,

Friday, February 27, 2009

What's fixed in CA-Clipper 5.2a


The following information on the CA-Clipper 5.2a patch was extrated from 52doc.txt which came with the patch.

PROBLEMS ADDRESSED BY CA-Clipper 5.2a

o C3049 - String Space exhausted. - Change to CLIPPER.EXE The compiler has been changed to increase the available string space. Developers whose applications compiled with this error in previous versions of Clipper should no longer receive this error message.

o Debugger Break Point Handling. - Change to CLD.EXE & CLD.LIB The debugger has been changed to improve Break Point handling. Developers who noticed difficulty in setting break points or noticed that break points were lost upon application restart will no longer have problems.

o Memoedit() double spacing problem. - Change to EXTEND.LIB The Memoedit() function has been changed to alleviate a double spacing effect which sometimes occurred. The only developers who noticed this problem had memo field data which had a trailing space at the wrap point. While this problem was uncommon it could be very disconcerting in applications where the format of memo field data is important.

o Inkey() setting Lastkey() to 0. - Change to CLIPPER.LIB The Inkey() function has been changed. The Inkey() function in CA-Clipper 5.2a will only set the Lastkey() value when a key is drawn from the keyboard buffer. The Inkey() function in version 5.20 set the Lastkey() value to 0 when there was no key in the keyboard buffer to retrieve and the time value expired. The 5.20 behavior had an adverse effect on several systems which use Inkey(); for example Memoedit() with a custom UDF() where the UDF() had been coded to expect the last navigational key pressed to be available via Lastkey() would receive a value of 0.

o OrdSetFocus() tag in lowercase. - Change to DBFNTX.LIB The OrdSetFocus() function will now accept parameters in any case. Developers who changed their applications to use order names rather than order numbers noticed that unless the name was in upper case the order established would be natural (no) order. This problem was unique to the DBFNTX driver.

o NATION support. - Change to NAT_OBJ.EXE The change here is only in the internal structure of the nation drivers. The drivers will now make a function call into CLIPPER.LIB to retreive clipper version information. In the future should a specific driver require updating this change simplifies that process.

SUPPORT NOTES CA-Clipper 5.01 vs 5.2x

o _GET_() - Changed in 5.2 and may effect 3rd Party products. If you have noticed that sometimes GETs don't appear then your application is probably making a call to _GET_(). The call to this internal function may be invoked from a 3rd party product.

The CA-Clipper internal function _GET_() has changed from version 5.01 to 5.2x. In 5.2x _GET_() no longer displays the GET. The GET is now only displayed after a call to the get_object:Display() method. Developers or 3rd parties who depended on the old behavior will either have to re-write the offending code, recompile, or ask the 3rd party vendor to supply a 5.2x compatible version of the library.

o Avoid calls to Internal Functions. As a reminder. Developers should not rely on the behavior of internal functions, (those that start with one or more "_"). Calling internal functions is strongly discouraged by Computer Associates as there is no guarantee the behavior of these internals will remain consistant between versions.

What's fixed in CA-Clipper 5.2b


The following information on the CA-Clipper 5.2b patch was extrated from 52abi.txt which came with the patch. This is an important patch as it fixes 28 known bugs !!!

The problems resolved by CA-Clipper 5.2b include:

1. Fixed a Virtual Memory Integrity Failure in FOPEN() when the file name is numeric instead of a character string.

2. Fixed a Virtual Memory Integrity Failure when calling AADD() to increase the size of an array.

3. Fixed a Virtual Memory Integerity Failure that occured when an ACHOICE() user function deleted elements from the menu selection array. ACHOICE() now allows the user function to add, delete, or modify existing elements without causing any problems in ACHOICE().

4. Fixed a Virtual Memory Integrity Failure in the Internal Runtime Event System. This was causing the DBFCDX driver to hang as well as various "unexplainable" errors.

5. Fixed a Virtual Memory Integrity Failure in the debugger when viewing multiple nested arrays. Tbrowse was producing a parameter error when viewing multiple nested arrays. In some instances this produced a Virtual Memory Integrity Failure.

6. Fixed a Virtual Memory Integrity Failure in the debugger's memory allocator. (STAR Issue# 737689)

7. Fixed INDEXKEY() memory corruption problem. INDEXKEY() would occasionally return a garbage string when called repeatedly. This sometimes caused a Virtual Memory Integrity Failure.

8. Fixed MEMOEDIT() buffer memory corruption problem. This occurred when MEMOEDIT() was called with a user defined function. This would result in various memory related errors including a Virtual Memory Integrity Failure.

9. Fixed slow disk I/O on replaces on large DBF's with non-unique indexes. The performance has been improved to a speed which is comparable to CA-Clipper 5.01a.

10. Fixed the releasing of all relations (in all workareas) when any child dbf was closed. Now closing a child database releases only the relations that it is involved with.

11. Fixed the DBFNDX Replaceable Database Driver so that it now properly seeks on a date value with SET DELETED ON.

12. Fixed DBCREATE() to properly return a NIL value as documented.

13. Fixed INDEXORD() so that it now returns a zero when no database is open rather than generating a runtime error.

14. Fixed some occurances of internal error 1210 (database and index are out of sync).

15. Fixed many occurances of internal error 415 (can not open external overlay file).

16. Fixed the Runtime Memory Manager so that it now returns an EG_MEM (5300 "Memory Low Warning") before generating a memory exhausted error.

17. Fixed Runtime failures that occured when CA-Clipper mistakenly tried to use non-existent EMS memory.

18. Fixed FREAD() so that it does not modify variables that it shouldn't have access to.

19. Fixed BROWSE() so that it no longer causes the repositioning of a file to BOF() when editing takes place in a new record.

20. Fixed the debugger so that it is no longer necessary to specify the default file extension (.PRG or .PPO) when opening a file.

21. Fixed the debugger so that it correctly searches the path (indicated by the PATH environment variable) when searching for a file to open.

22. Fixed the debugger so that it does not produce "Argument error +" when the F6 key is pressed to view databases.

23. Fixed DBU so it now correctly parses a file name that contained a drive letter and colon (:) but no backslash (\) (such as C:TEMP).

24. Fixed numerous bugs in the R.L. utility.

25. Fixed the compiler screen to include the missing /t and /z options in order to match the documented options.

26. Fixed the spelling of OrdDestory to OrdDestroy in STD.CH for the DELETE TAG command.

27. Fixed the "Guide to CA-Clipper" .NG file so that the Norton Guide engine may now be unloaded from memory.

28. Enhanced the //INFO command line parameter to show what message and collation driver is linked in.

Technical Note: The Virtual Memory Integrity Failure Error Message

The Virtual Memory Integrity Failure error message (or VMIF for short) refers to a problem that is neither well documented nor well understood. In this technical note, we will explore what the VMIF message indicates, some of the common reasons it occurs, and what measures to take if you encounter one.

CA-Clipper uses a virtual memory manager to allow applications to access more strings, arrays, and objects than conventional memory would otherwise allow. It accomplishes this by swapping information to and from expanded memory or disk as needed. Each virtual data item (called a segment) has an entry in a descriptor table that maintains its current location and length. A segment's length can be up to 65,518 bytes, while its location may be conventional memory (resident), disk or EMS (non-resident). When CA-Clipper receives a request for non-resident data, it always checks the segment's descriptor entry to ensure that it's length is non-zero. Any descriptor whose length is zero is, by definition, invalid because VM does not allow zero-byte segments. Thus, a zero length segment is interpreted as a corruption, and the VMIF error message is displayed.

Along with the VMIF message is a hexadecimal address that indicates the address of the corrupted descriptor table element. This information may be useful to the CA-Clipper Technical Support as well as the development staff. C and Assembler programmers may also find this information useful in determining if and how their code caused the corruption. A special case is the address 0000:0000. It indicates that a NULL and (possibly uninitialized) pointer was used to access virtual data.

While it is true that the VMIF message occurs for exactly one condition, that condition can be created in many different ways. Research indicates that the conditions that lead to a VMIF can be broken down into three distinct categories.

First, several VMIFs can be attributed to Clipper programming bugs. While a VMIF should never occur solely on the basis of executing Clipper code, a combination of inadequate error detection on the part of Clipper runtime and a violation of proper programming practices may cause the error to occur. Examples of this have been: calling FOPEN() with numeric data for the file name, deleting array elements from within an ACHOICE() UDF, and assigning NIL to any TBROWSE instance variable that requires a character value. (Please note that the TBROWSE VMIFs were fixed in the 5.01a release and the ACHOICE() and FOPEN() VMIFs are fixed in the 5.2b release by producing an error when improper values are used.)

The second category is within the CA-Clipper runtime support libraries. CA-Clipper's runtime support libraries constantly issue calls to the VM system throughout the normal execution of a Clipper application. On occasion, specific conditions pertaining to runtime activities are not properly handled internally, creating conditions that eventually result in a VMIF. These instances are always considered problems by the development staff.

The last category is external code typically written in C or Assembler by CA-Clipper programmers and third party library developers. These are usually caused by improper use of one of CA-Clipper's APIs or by changing the functionality of something within CA-Clipper's runtime that is assumed to remain constant.

Although CA-Clipper's VM system provides detection and reporting, it is almost never the cause of a VMIF.

VMIFs are commonly detected long after the actual corruption occurred. A module may store a zero-length segment in the segment descriptor table either through use of VM or by writing to a wild pointer. This corruption will not be detected until a VM segment is accessed that requires the corrupted segment to be discarded, or swapped to disk or EMS. The Clipper VM subsystem is demand-based. This means that it only performs swapping when swapping is absolutely required. If a VMIF consistently occurs at a specific point in the execution of an application, it is often not actually caused at this point. It tells us that a corruption has occurred, but has no means for determining the cause of the corruption or when the corruption actually occurred.

Because VMIFs are detected when the VM system attempts to swap in memory, a change in the amount of conventional memory available when an application is executed changes the possibility of the VMIF occurring. When sufficient real memory is available, VM has no need to perform any swapping and any possible VMIFs will not be detected. When less real memory is available to an application, the entire profile of swapping is changed, and may prevent the VMIF from occurring in a constant location.

This raises the question of how to ensure that the VM system is being called during the testing phase of application development. A simple and effective method is to use CA-Clipper's //X: parameter to decrease the available memory as much as is feasible. This will ensure that the VM system will be called with the most frequency. (The //X: parameter is detailed in the Runtime Environment chapter of the CA-Clipper 5.2 Programming and Utilities Guide.)

If a VMIF occurs, try to determine how to reproduce the problem at will and if possible, isolate it to a small example and immediately contact your CA-Clipper Technical Support Representative. The CA-Clipper Quality Assurance team is also constantly searching for occurrences of VMIFs. Either way, the CA-Clipper Development team is anxious to correct all internal VMIFs as quickly as possible.

What's fixed in CA-Clipper 5.2d ?

The following information on the CA-Clipper 5.2d patch was extrated from 52dix.txt which came with the patch. This is an important patch as it fixes 86 known bugs !!!

What is the 5.2d patch ?

The CA-Clipper 5.2d/ExoSpace 1.0f upgrade described in this file contains latest fixes for CA-Clipper and CA-Clipper/ExoSpace. This includes an updated version of the DBFMDX driver revised to be compatible with the CA-Clipper/Compiler Kit. The DBFMDX database collation drivers are now CA-Clipper/ExoSpace compatible also. The DBFCDX driver has not been changed. We are currently working on a separate patch for it. It will be published as soon as it is ready.

Problems resolved by CA-Clipper 5.2d:

1. Fixed a VMIF in the Object Memory Manager. This occurred in low memory situations when the OMM took space from the VM segment that it was attempting to expand.

2. Fixed a GPF/VMIF in the Object Memory Manager's garbage collector that occurred when there were a large number of static variables.

3. Fixed the FIELDPOS() function so that it no longer returns misleading results when passed an invalid argument.

4. Fixed bug in oStrDup() where an incorrect number of bytes were being copied to an incorrect location for dedicated VM segments.

5. Fixed a VMIF in the Object Memory Manager that occurred when performing an incremental garbage collection on an array that had just satisfied the requirement for occupying its own dedicated VM segment.

6. Fixed a GPF that occurred when growing the class/dictionary table. This happens when instantiating a class or creating a dictionary when the dictionary/class table is full.

7. Fixed the RDD manager so it does not become corrupted when the VMM swaps its data to disk. This occurred only in a very low memory situation.

8. Panning right in a TBROWSE containing a single frozen column no longer causes TBROWSE to go into an infinite loop when trying to redisplay.

9. Fixed a GPF in TbrowseNew() and TbrowseDB() in certain memory configurations.

10. Fixed a GPF in the function ALIAS([]) when nWorkArea > 255.

11. Fixed the GPF caused by function ORDKEY() with an invalid .

12. Fixed the SET DELETED ON command so that it does not affect record visibility on a network.

13. Fixed the SORT command so that it deallocates the memory it allocated before returning control to its caller.

14. Fixed internal errors 650, 775 and 999 that occurred when the compiler did not produce correct code for statements that contained an extra set of parentheses. EXAMPLE: (( Test() ))

15. Fixed C3039 PHASE ERROR in the compiler that occurred when a .PRG source file contained several static variables that were inline initialized to a codeblock. EXAMPLE: static Var1 := { | x | func1( x ) } static Var2 := { | x | func2( x ) } static Var3 := { | x | func3( x ) }

16. Fixed a lockup in the compiler that occurred when a .PRG had a large number of STATIC variables.

17. Fixed the compiler so that /Z switch has effect on expressions that contain constants.

18. Fixed the compiler so it will not produce the "C3050 Something terrible has happened" error when it encounters a user defined function whose argument is being negated. Example: MyUDF( -X )

19. Fixed a problem in the compiler that allowed it to accept illegal comment blocks. EXAMPLE: /**/*/

20. Fixed the compiler so it now generates an error when it encounters one of the following incorrect control blocks: IF...ELSE...ELSE...ENDIF IF...ELSE...ELSEIF...ENDIF

21. Fixed the compiler to generate an error when it encounters the following statement: Alias->Alias->

22. Fixed the compiler so it does not generate an error when it encounters an expression containing multiple NOTs. EXAMPLE: iff( ! ! .t., .t., .f. )

23. Fixed the compiler so it does not generate an error when it encounters a statement in which an aliased expression contains extra parenthesis: (MyFunc())->DBFfield

or: ? (MyFunc())[x]

24. Fixed the compiler so it will not produce the "C2005 Statement not recognized match failed at: '&'" error when it encounters the following: @ nCol, nRow SAY "string" + &(macro_expression)

25. Fixed evaluating a macro that contains an alias caused a syntax error in the next macro evaluation. EXAMPLE: ? &( "aTest[1]" ) // ? &( "test->( RECNO() )" ) ? &( "aTest[1]" ) // Syntax error - &

26. Fixed a lockup that occurred when a memvar was created within a macro. The scope of that memvar was incorrect, it expanded to the upper lever procedure. EXAMPLE: &("MEMVAR->dummy") := 666

27. Fixed a lockup that occurred when using a macro to expand an expression, that contains an alias. EXAMPLE: &(alias(1))->( Recno() )

28. Fixed SELECT() so it now returns 0 when passed an invalid parameter.

29. Fixed DBCREATE() so it generates a run-time error when it is passed an unknown RDD name instead of hanging the system.

30. Fixed The USE command so it does not upper-case convert the contents of the variable which is used in VIA clause.

31. Fixed DBCREATE() so it generates a run-time error when there is not enough space on a drive.

32. Fixed the database/index synchronization as in the following example: SET ORDER TO REPLACE SKIP() SET ORDER TO SKIP(-1) ? RECNO()

33. Fixed the 'INDEX ON TO WHILE ' command so it does not create only one record in the scoped index (regardless how many meet the WHILE condition) when the current index order was used, and the most recent DBF movement was not an index movement (SKIP, SEEK).

34. Fixed the updating of the conditional .NTX file when a field, that was not in the key expression, was updated.

35. Fixed index file update failure on complex key expression when the multiple fields were being concatenated as a key and the key field(s) value(s) were subsequently changed.

36. Fixed the 'REPLACE WITH' command so it will not cause a program to lock up if it attempts to write memo information to disk with insufficient space.

37. Fixed the following commands: COPY TO...SDF, COPY TO...DELIMITED APPEND FROM...SDF, APPEND FROM...DELIMITED so they do not hang the system when the DEFAULT option is chosen from the 'cannot open/create file' error message.

38. Fixed the COPY TO [ SDF | DELIMITED ] command so it does not close the current workarea when the DEFAULT option is chosen from the 'cannot open/create file' error message.

39. Fixed the COPY TO command when the current database is the child of a relation and there is a pending seek.

40. Fixed CREATE FROM & COPY STRUCTURE so they work when the target is a disk drive designator and file name without a backslash. EXAMPLE: C:FileName

41. Fixed the APPEND FROM SDF command so it would ignore null-characters when it reads SDF-file.

42. Fixed TBrowse so that 'hitBottom' would report .T. if an attempt was made to go past the end of the available data when there are not enough records to completely fill the TBrowse display and refreshAll() is invoked prior to stabilization.

43. The decimal portion of the field definition for date, logical and memo fields is now initialized.

44. Fixed the function ORDSETFOCUS() to ignore an invalid as per documentation.

45. Fixed the function ORDSETFOCUS() to return an empty string when a database has no controlling order and the DBFNDX driver is used.

46. Fixed the function INDEXKEY() to return an empty string when there was no database opened in a workarea.

47. Fixed the functions ORDBAGNAME(), ORDNAME(), ORDNUMBER(), ORDKEY(), ORDFOR() to provide an argument type checking. The following run-time errors are generated when one or more of the arguments are of the wrong type: Error DBCMD/1021 Argument error: ORDBAGNAME Error DBCMD/1022 Argument error: ORDFOR Error DBCMD/1023 Argument error: ORDKEY Error DBCMD/1024 Argument error: ORDNAME Error DBCMD/1025 Argument error: ORDNUMBER

48. Fixed the inconsistency between OrdSetFocus("") and OrdSetFocus(0). Now OrdSetFocus("") also restores the natural order.

49. Fixed OrdNumber("") so that it returns zero rather than the number of orders for the workarea when DBFNDX driver is used.

50. Fixed the GO command when DBFNDX driver is used and the data type of was DOUBLE, not LONG.

51. Fixed the OrdName(0) so it would return the name of the current controlling order when DBFNDX driver is used.

52. Fixed the OrdNumber() when DBFNDX driver is used and there is no in the Order List.

53. Major revisions have been made to the DBFMDX driver to rectify the problems in the previous versions.

54. Fixed SET ALTERNATE so it generates a run-time error when there is no space available on the disk.

55. Fixed the STRTRAN() function so it no longer goes into an infinite loop when the cSearch parameter is a zero length string.

56. Fixed ALLTRIM() so it generates an error when given an argument of the wrong type.

57. Fixed the function DIRECTORY (, "V") so it does not pad the volume name with garbage, if its length is exactly 8 characters long.

58. All commas contained in a GET's PICTURE clause are now copied into the GET's edit buffer.

59. When a GET's PICTURE clause contains an '@R', the number of editable positions in its edit buffer is now calculated correctly.

60. When a GET's PICTURE clause contains an '@R', non-picture characters beyond the last editable position are now displayed.

61. When a GET's PICTURE clause contains a paren, a leading paren in its edit buffer now causes the value to be parsed as a negative number.

62. A bug was fixed in which GETs that had a PICTURE clause containing a leading '$' would sometimes display negative values with multiple '$' characters.

63. The size of a GET's edit buffer no longer increases if its PICTURE clause contains a paren, and a negative value is entered into its edit buffer.

64. In the #command for GET, the smart stringify result marker was replaced by a normal stringify result marker. The previous use of the smart stringify marker had caused parsing problems whenever an aliased variable was used in a GET command.

65. The ALERT() function now updates the LASTKEY status.

66. Fixed ALERT() so that it no longer exhibits occasional problems when fewer than four option strings are used.

67. Fixed FSEEK() so that it rejects requests that would cause the resulting absolute file position to become negative. In such cases the current file position is left unchanged and an error flag is set; the value of this flag can be retrieved by calling the FERROR() function.

68. Fixed the 'SET FUNCTION TO' command so that it will now accept strings that contain only white space.

69. The SET DATE FORMAT code was modified so that the format string must contain non-numeric delimiters between the month, day, and year portions.

70. Fixed the DEVPOS() function so that it now immediately responds to an error condition.

71. Fixed STUFF() so it will generate a run-time error when there is insufficient virtual memory to create it's data buffer.

72. Fixed VAL("-.nnnn") so it does not return "******" now.

73. Fixed DBU so it does not go to an endless loop if there is a filter set on a field and if GOTO is used and a record number is given that is not one of the records matching the filter.

74. Fixed DBU to respond to the key when BROWSEing a database in which none of the records match the filter condition.

75. Fixed DBU so it does not go to an endless loop if, when VIEWing an empty database, the user presses any character key.

76. Fixed DBU to update and reopen indexes after PACKing or ZAPing a database.

77. Fixed DBU so that BROWSE reflects the filter condition after PACKing or ZAPing a database.

78. Fixed the REPORT FORM command's sub-grouping feature when the name of the last subgroup in a group was the same as the name of the next group.

79. Fixed the REPORT FORM command without the TO PRINT clause so it produces the printer output if SET PRINT ON command was previously issued.

80. The multi-lines per record using ";" - method is now implemented.

81. Fixed the number of lines on the first REPORT page to be the same as the number of lines on the following pages.

82. Fixed the REPORT FORM command not to do page eject after subgroup if page eject after group flag was set to TRUE.

83. Fixed the REPORT FORM heading not to be truncated when page width is set to 61 or more characters.

84. Fixed the CA-Clipper Debugger so it does not display garbage in the last line of the Monitor Window when was pressed.

85. Fixed RLOCK() and DBRLOCK() so that it would not fail if the database was the child of a relation and there was a pending seek.

86. Fixed the failure of the RLOCK() function when invoked after a successful FLOCK() on an open shared database.

Welcome to Clipper... Clipper... Clipper


In 1997, then using Delphi 3, I had already created 32-bits Windows applications for HRIS, ERP and CRM. In 2007, using Ruby on Rails, an AJAX powered CRM site running on Apache & MySQL was created and I am now using Visual Studio .Net 2008 to create web-based projects and Delphi 7 for Win32 applications using SQL2005 & DBFCDX.

So, why then am I reviving the Original Clipper... Clipper... Clipper via a Blog as CA-Clipper is a programming language for the DOS world ? Believe it or not, there are still some clients using my mission-critical CA-Clipper applications for DOS installed in the late 80's and up to the mid 90's. This is testimony to CA-Clipper's robustness as a language :-)

With the widespread introduction of Windows 7 64-bits as the standard O/S for new Windows based PCs & Notebooks, CA-Clipper EXE simply will not work and it has become imperative for Clipper programmers to migrate immediately to Harbour to build 32/64 bits EXEs

Since 28th January 2009, this blog has been read by 134,389 (10/3/11 - 39,277) unique visitors (of which 45,151 (10/3/11 - 13,929) are returning visitors) from 103 countries and 1,574 cities & towns in Europe (37; 764 cities), North America (3; 373 cities) , Central America & Caribeans (6; 13 cities), South America(10; 226 cities), Africa & Middle-East (12; 44 cities) , Asia-Pacific (21; 175 cities). So, obviously Clipper is Alive & Well : -)


TIA & Enjoy ! (10th October 2012, 11:05; 13th November 2015)


Original Welcome Page for Clipper... Clipper... Clipper

This is the original Welcome Page for Clipper... Clipper... Clipper, which I am republishing for historical and sentimental reasons. The only changes that I have made was to fix all the broken links. BTW, the counter from counter.digits.com is still working :-)

Welcome to Chee Chong Hwa's Malaysian WWW web site which is dedicated to Clipperheads throughout the world.

This site started out as a teeny-weeny section of Who the heck is Chee Chong Hwa ? and has graduated into a full blown web site of more than 140 pages (actually hundreds of A4 size pages) ! This is due to its growing popularity and tremendous encouragements from visiting Clipperheads from 100 countries worldwide, from North America, Central America, Caribbean, South America, Europe, Middle-East, Africa and Asia-Pacific. Thanx Clipperheads, you all made this happen !


What is Clipper ?

You may ask, what is this Clipper stuff ? Could Clipper be something to do with sailing as it is the name of a very fast sailing American ship in the 19th century ?

Well, Clipper or to be precise, CA-Clipper is the premier PC-Software development tool for DOS. It was first developed by Nantucket Corporation initially as a compiler for dBase3+ programs. Since then, CA-Clipper has evolved away from its x-base roots with the introduction of lexical scoping & pre-defined objects like TBrowse. As at today, the most stable version ofClipper is 5.2e while the latest version, 5.3a was introduced on 21 May 1996.

As at 11th November, 1996, an unofficial 5.3a fixes file was made available by Jo French. See the About CA-Clipper 5.3a section for more details. BTW, Jo French uploaded the revised 5.3a fixes file on 20th November, 1996.

Latest News

The latest news is that CA has finally released the long-awaited 5.3b patch on 21 May, 1997.

For 5.3b users, you must a take a look at Jo French's comments on unfixed bugs in 5.3b.

BTW, have you used Click ? If you're a serious Clipperprogrammer and need an excellent code formatter, Click is a natural choice. How to get it ? Simple, access Phil Barnett's site via my Cool Clipper Sites.

32-bits Clipper for Windows ?

Have you tried Xbase ++ ? Well, I have and compared to Delphi (my current Windows programming tool of choice), I'm still sticking to Delphi.

Anyway, you should visit the Alaska Home Page. Give it a chance and then draw your own conclusions !.

The Harbour Project

Is this the future of Xbase ? Take a look at at the Harbour Project

You are Visitor # ...

According to counter.digits.com, you are visitor since 3 June 1996.

If you like or dislike what you see on this website, please drop me a line by clicking the email button at the bottom of this page or better still, by filling out the form in my guest book. If you are not sure what to write,click here to take a look at what other Clipperheads have to say.