Updating preprocessor files

This commit is contained in:
Alexander S.Kresin
1999-06-08 16:29:03 +00:00
parent c498439a43
commit eee99f030f
4 changed files with 714 additions and 583 deletions

View File

@@ -1,8 +1,22 @@
19990608-20:00 Alexander Kresin
Implemented: #command, #xcommand, #translate, #xtranslate .
Some functions rewritten for a better functionality and readability.
Fixed some bugs.
Updated:
* source/hbpp/hbpp.c
* source/hbpp/harb.c
* source/hbpp/table.c
Removed:
- source/hbpp/a.prg
- source/hbpp/c.prg
- source/hbpp/example.ch
- source/hbpp/exam2.ch
Tue Jun 08 09:22:40 1999 Gonzalo A. Diethelm <Gonzalo.Diethelm@jda.cl>
* source/rtl/set.c (open_handle):
Misplaced parenthesis when callin open() caused S_IWRITE to never
be seen by open().
* source/rtl/set.c (open_handle):
Misplaced parenthesis when callin open() caused S_IWRITE to never
be seen by open().
19990608-13:25 CET Eddie Runia
* source/vm/initsymb.c
@@ -23,27 +37,27 @@ Tue Jun 08 09:22:40 1999 Gonzalo A. Diethelm <Gonzalo.Diethelm@jda.cl>
Mon Jun 07 20:42:04 1999 Gonzalo A. Diethelm <Gonzalo.Diethelm@jda.cl>
* config/dir.cf:
* config/global.cf:
* config/install.cf:
Made a mistake in my previous commit. This one works.
* config/dir.cf:
* config/global.cf:
* config/install.cf:
Made a mistake in my previous commit. This one works.
Mon Jun 07 20:20:32 1999 Gonzalo A. Diethelm <Gonzalo.Diethelm@jda.cl>
* config/bin.cf:
* config/c.cf:
* config/dir.cf:
* config/global.cf:
* config/install.cf:
* config/lib.cf:
* config/test.cf:
* config/win32/gcc.cf:
* config/win32/global.cf:
* config/win32/msvc.cf:
* config/win32/rules.cf:
Updated rules so they work under WinNT CMD.EXE without any Unix
utilities installed.
* config/bin.cf:
* config/c.cf:
* config/dir.cf:
* config/global.cf:
* config/install.cf:
* config/lib.cf:
* config/test.cf:
* config/win32/gcc.cf:
* config/win32/global.cf:
* config/win32/msvc.cf:
* config/win32/rules.cf:
Updated rules so they work under WinNT CMD.EXE without any Unix
utilities installed.
19990607-19:45 EDT David G. Holm <dholm@jsd-llc.com>
* include/extend.h
- Moved "#include <limits.h>" to include/types.h
@@ -74,62 +88,62 @@ Mon Jun 07 20:20:32 1999 Gonzalo A. Diethelm <Gonzalo.Diethelm@jda.cl>
Mon Jun 07 12:58:17 1999 Gonzalo A. Diethelm <Gonzalo.Diethelm@jda.cl>
* source/hbpp/Makefile:
* source/hbpp/harb.c:
* source/hbpp/harb.h:
* source/hbpp/hbpp.c:
* source/hbpp/table.c:
Added a GNU-make Makefile to this directory.
Solved portability problems under gcc.
Got rid of a few warnings and unused variables.
* source/hbpp/Makefile:
* source/hbpp/harb.c:
* source/hbpp/harb.h:
* source/hbpp/hbpp.c:
* source/hbpp/table.c:
Added a GNU-make Makefile to this directory.
Solved portability problems under gcc.
Got rid of a few warnings and unused variables.
* source/rtl/msgxxx.c:
This file includes the correct message file based on the value of
HB_LANGUAGE, whose default is UK.
* source/rtl/msgxxx.c:
This file includes the correct message file based on the value of
HB_LANGUAGE, whose default is UK.
* source/rtl/classes.c:
* source/rtl/console.c:
* source/rtl/dir.c:
* source/rtl/files.c:
* source/rtl/set.c:
Solved portability problems under gcc.
Got rid of a few warnings and unused variables.
* source/rtl/classes.c:
* source/rtl/console.c:
* source/rtl/dir.c:
* source/rtl/files.c:
* source/rtl/set.c:
Solved portability problems under gcc.
Got rid of a few warnings and unused variables.
* source/rtl/dir.c:
This file had definite bugs, see difference between r1.4 and r1.3
for more details.
* source/rtl/natmsg/msgdut.c:
* source/rtl/natmsg/msggal.c:
* source/rtl/natmsg/msgger.c:
* source/rtl/natmsg/msghu.c:
* source/rtl/natmsg/msgpor.c:
* source/rtl/natmsg/msgr1251.c:
* source/rtl/natmsg/msgru866.c:
* source/rtl/natmsg/msgspa.c:
* source/rtl/natmsg/msguk.c:
Added Id keywords.
* config/bin.cf:
* config/global.cf:
* config/header.cf:
* config/lib.cf:
* config/prg.cf:
* config/test.cf:
* config/win32/rules.cf:
Use GRANDP to refer to ../../ and change environment variables to
start with a HB_.
* source/rtl/dir.c:
This file had definite bugs, see difference between r1.4 and r1.3
for more details.
* config/win32/rules.cf:
Added a -I$(TOP) to the list of paths for included files in the
rule to compile a PRG file with Harbour.
* source/rtl/natmsg/msgdut.c:
* source/rtl/natmsg/msggal.c:
* source/rtl/natmsg/msgger.c:
* source/rtl/natmsg/msghu.c:
* source/rtl/natmsg/msgpor.c:
* source/rtl/natmsg/msgr1251.c:
* source/rtl/natmsg/msgru866.c:
* source/rtl/natmsg/msgspa.c:
* source/rtl/natmsg/msguk.c:
Added Id keywords.
* include/Makefile:
* source/Makefile:
* source/rtl/Makefile:
* source/tools/Makefile:
* tests/working/Makefile:
Updated the file list.
* config/bin.cf:
* config/global.cf:
* config/header.cf:
* config/lib.cf:
* config/prg.cf:
* config/test.cf:
* config/win32/rules.cf:
Use GRANDP to refer to ../../ and change environment variables to
start with a HB_.
* config/win32/rules.cf:
Added a -I$(TOP) to the list of paths for included files in the
rule to compile a PRG file with Harbour.
* include/Makefile:
* source/Makefile:
* source/rtl/Makefile:
* source/tools/Makefile:
* tests/working/Makefile:
Updated the file list.
19990607-15:15 CET Matthew Hamilton
* tests/working/inifiles.prg

View File

@@ -2,16 +2,11 @@
* $Id$
*/
#if defined(__DJGPP__)
#ifndef __dj_include_stdio_h_
#include <alloc.h>
#endif
#endif
#if defined(__DJGPP__) || defined(__GNUC__)
#include <string.h>
#include <stdlib.h>
#else
#include <alloc.h>
#include <mem.h>
#endif

View File

@@ -1,8 +1,7 @@
/*
* $Id$
*/
/* Harbour Preprocessor , version 0.8
/* Harbour Preprocessor , version 0.9
author - Alexander Kresin */
#if defined(__DJGPP__) || defined(__GNUC__)
@@ -16,6 +15,7 @@
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <sys\stat.h>
#include <ctype.h>
#include "harb.h"
@@ -29,10 +29,11 @@ typedef struct
typedef struct
{
int com_or_xcom;
char *name;
char *mpatt;
char *value;
} COMMANDS;
} COMMANDS, TRANSLATES;
int Hp_Parse( int, int );
int ParseDirective( char* );
@@ -40,19 +41,24 @@ int ParseDefine( char* );
DEFINES* AddDefine ( char* );
int ParseUndef( char* );
int ParseIfdef( char*, int);
int ParseCommand( char* );
int ParseCommand( char*, int, int );
int ConvertPatterns ( char*, int, char*, int );
void AddCommand ( char * );
void AddTranslate ( char * );
COMMANDS* getCommand ( int );
int ParseExpression( char*, char* );
void WorkDefine ( char**, char**, DEFINES*);
int WorkCommand ( char*, char*, char**, int);
void CmdParse ( char *ptri, int aCmdStru[100][2] );
int WorkMarkers( char**, char*, char*, int*, int aCmdStru[100][2], int*, int );
int WorkDefine ( char**, char**, DEFINES *, int );
void WorkPseudoF ( char**, char**, DEFINES*);
int WorkCommand ( char*, char*, char*, int);
int CommandStuff ( char *, char *, char *, int*, int );
int WorkTranslate ( char*, char**, char*, int);
int WorkMarkers( char**, char**, char*, int*, int );
int getExpReal ( char *, char **, int );
void SkipOptional( char**, char*, int*);
DEFINES* DefSearch(char *);
int ComSearch(char *,int);
int TraSearch(char *,int);
void SearnRep( char*,char*,int,char*,int*);
int ReplacePattern ( char, char*, int, char*, int );
int RdStr(int,char *,int,int,char*,int*,int*);
@@ -62,9 +68,12 @@ int IsInStr ( char, char*);
void Stuff (char*, char*, int, int, int);
int strocpy (char*, char* );
int stroncpy (char*, char*, int);
int strocmp (char*, char**);
int strincpy (char*, char*);
int strincmp (char*, char**);
int strolen ( char* );
int strotrim ( char* );
char* strodup ( char * );
int idDrag ( char *, char ** );
int NextWord ( char**, char*, int);
int NextName ( char**, char*, char**);
@@ -84,7 +93,8 @@ int NextName ( char**, char*, char**);
#define STATE_ID_END 5
#define STATE_ID 6
#define STATE_EXPRES 7
#define STATE_BRACKET 8
#define STATE_EXPRES_ID 8
#define STATE_BRACKET 9
#define IT_EXPR 1
#define IT_ID 2
@@ -109,9 +119,12 @@ extern int kolcomm;
COMMANDS *aCommnew ;
int kolcommands = 0, maxcommands = INITIAL_ACOM_SIZE;
TRANSLATES *aTranslates ;
int koltranslates = 0, maxtranslates = 50;
int main (int argc,char* argv[])
{
int handl_i,handl_o;
int handl_i,handl_o,i;
char szFileName[ _POSIX_PATH_MAX ];
FILENAME *pFileName =NULL;
@@ -121,28 +134,29 @@ FILENAME *pFileName =NULL;
pFileName->extension =".prg";
MakeFilename( szFileName, pFileName );
if ((handl_i = open(szFileName, O_RDONLY | O_TEXT)) == -1)
if ((handl_i = open(szFileName, O_TEXT)) == -1)
{ printf("Can't open %s",szFileName); return 1; }
pFileName->extension =".ppo";
MakeFilename( szFileName, pFileName );
if ((handl_o = open(szFileName, O_CREAT | O_WRONLY | O_TEXT)) == -1)
if ((handl_o = open(szFileName, O_CREAT | O_TRUNC | O_WRONLY | O_TEXT , S_IREAD | S_IWRITE)) == -1)
{ printf("Can't open %s",szFileName); return 1; }
aCondCompile = (int*) _xgrab( sizeof(int) * 5 );
aDefnew = ( DEFINES * ) _xgrab( sizeof(DEFINES) * 50 );
aCommnew = ( COMMANDS * ) _xgrab( sizeof(COMMANDS) * INITIAL_ACOM_SIZE );
aTranslates = ( TRANSLATES * ) _xgrab( sizeof(TRANSLATES) * 50 );
Hp_Parse(handl_i,handl_o);
close(handl_i); close(handl_o);
/*
for (i=0;i<kolcommands;i++)
{
printf("\n\"%s\",",aCommands[i].name);
if (aCommands[i].mpatt !=NULL) printf("\"%s\",",aCommands[i].mpatt);
printf("\n{%d,\"%s\",",aCommnew[i].com_or_xcom, aCommands[i].name);
if (aCommnew[i].mpatt !=NULL) printf("\"%s\",",aCommnew[i].mpatt);
else printf("NULL,");
if (aCommands[i].value !=NULL) printf("\n\"%s\",",aCommands[i].value);
else printf("\nNULL,");
if (aCommnew[i].value !=NULL) printf("\n\"%s\"},",aCommnew[i].value);
else printf("\nNULL},");
}
*/
return 0;
@@ -242,7 +256,7 @@ int ParseDirective( char* sLine )
{ printf("\nCan't open %s",sLine); return 1001; }
lInclude++;
Hp_Parse(handl_i, 0);
Hp_Parse(handl_i, NULL);
lInclude--;
close(handl_i);
}
@@ -261,12 +275,13 @@ int ParseDirective( char* sLine )
else if ( (i == 7 && memcmp ( sDirective, "command", 7 ) == 0) ||
(i == 8 && memcmp ( sDirective, "xcommand", 8 ) == 0) )
ParseCommand ( sLine ); /* --- #command --- */
/* --- #command --- */
ParseCommand ( sLine, (i==7)? FALSE:TRUE, TRUE );
else if ( (i == 9 && memcmp ( sDirective, "translate", 9 ) == 0) ||
(i == 10 && memcmp ( sDirective, "xtranslate", 10 ) == 0) )
{ /* --- #translate --- */
}
/* --- #translate --- */
ParseCommand ( sLine, (i==9)? FALSE:TRUE, FALSE );
else if ( i == 6 && memcmp ( sDirective, "stdout", 6 ) == 0 )
printf ( "%s", sLine ); /* --- #stdout --- */
@@ -411,21 +426,43 @@ int ComSearch(char *cmdname, int ncmd)
if ( !ncmd || ncmd > kolcomm )
for ( i=(ncmd)? ncmd-kolcomm:kolcommands-1; i >= 0; i-- )
{
for ( j=0; *(aCommnew[i].name+j)==toupper(*(cmdname+j)) &&
*(aCommnew[i].name+j)!='\0'; j++ );
if ( *(aCommnew[i].name+j)==toupper(*(cmdname+j)) ) return kolcomm+i;
for ( j=0; (*(aCommnew[i].name+j)==toupper(*(cmdname+j))) &&
(*(aCommnew[i].name+j)!='\0') &&
((aCommnew[i].com_or_xcom)? 1:(j<4)); j++ );
if ( (*(aCommnew[i].name+j)==toupper(*(cmdname+j))) ||
( !aCommnew[i].com_or_xcom && j == 4 && *(aCommnew[i].name+j)!='\0') )
return kolcomm+i;
}
for ( i=(ncmd && ncmd<=kolcomm)? ncmd:kolcomm-1; i >= 0; i-- )
{
for ( j=0; *(aCommands[i].name+j)==toupper(*(cmdname+j)) &&
*(aCommands[i].name+j)!='\0'; j++ );
if ( *(aCommands[i].name+j)==toupper(*(cmdname+j)) ) break;
for ( j=0; (*(aCommands[i].name+j)==toupper(*(cmdname+j))) &&
(*(aCommands[i].name+j)!='\0') &&
((aCommands[i].com_or_xcom)? 1:(j<4)); j++ );
if ( (*(aCommands[i].name+j)==toupper(*(cmdname+j))) ||
( !aCommands[i].com_or_xcom && j == 4 && *(aCommands[i].name+j)!='\0') )
break;
}
return i;
}
int ParseCommand( char* sLine)
int TraSearch(char *cmdname, int ncmd)
{
int i,j;
for ( i=(ncmd)? ncmd:koltranslates-1; i >= 0; i-- )
{
for ( j=0; *(aTranslates[i].name+j)==toupper(*(cmdname+j)) &&
*(aTranslates[i].name+j)!='\0' &&
((aTranslates[i].com_or_xcom)? 1:(j<4)); j++ );
if ( *(aTranslates[i].name+j)==toupper(*(cmdname+j)) ||
( !aTranslates[i].com_or_xcom && j == 4 && *(aTranslates[i].name+j)!='\0') )
break;
}
return i;
}
int ParseCommand( char* sLine, int com_or_xcom, int com_or_tra )
{
char cmdname[MAX_NAME];
char mpatt[STR_SIZE], rpatt[STR_SIZE];
@@ -438,16 +475,29 @@ int ParseCommand( char* sLine)
if ( (ipos = hb_strAt( "=>", 2, sLine, strolen(sLine) )) > 0 )
mlen = stroncpy( mpatt, sLine, ipos-1 );
else return 4000; /* Quit, if '=>' absent */
mlen = strotrim( mpatt );
sLine += ipos + 1;
SKIPTABSPACES(sLine);
rlen = strocpy( rpatt, sLine );
rlen = strotrim( rpatt );
if ( (rez = ConvertPatterns ( mpatt, mlen, rpatt, rlen )) > 0 ) return rez;
AddCommand ( cmdname );
aCommnew[kolcommands-1].mpatt = strodup ( mpatt );
aCommnew[kolcommands-1].value = ( rlen > 0 )? strodup ( rpatt ) : NULL;
if ( com_or_tra )
{
AddCommand ( cmdname );
aCommnew[kolcommands-1].com_or_xcom = com_or_xcom;
aCommnew[kolcommands-1].mpatt = strodup ( mpatt );
aCommnew[kolcommands-1].value = ( rlen > 0 )? strodup ( rpatt ) : NULL;
}
else
{
AddTranslate ( cmdname );
aTranslates[koltranslates-1].com_or_xcom = com_or_xcom;
aTranslates[koltranslates-1].mpatt = strodup ( mpatt );
aTranslates[koltranslates-1].value = ( rlen > 0 )? strodup ( rpatt ) : NULL;
}
return 0;
}
@@ -531,6 +581,17 @@ void AddCommand ( char *cmdname )
kolcommands++;
}
void AddTranslate ( char *cmdname )
{
if ( koltranslates == maxtranslates )
{
maxtranslates += 50;
aTranslates = (TRANSLATES *)_xrealloc( aTranslates, sizeof( TRANSLATES ) * maxtranslates );
}
aTranslates[koltranslates].name = strodup ( cmdname );
koltranslates++;
}
COMMANDS* getCommand ( int ndef )
{
return (ndef>=kolcomm)? &(aCommnew[ndef-kolcomm]):&(aCommands[ndef]);
@@ -540,11 +601,12 @@ int ParseExpression( char* sLine, char* sOutLine )
{
char sToken[MAX_NAME];
char *ptri, *ptro;
int lenToken,npars,i,ndef;
int lenToken,i,ndef;
int rezDef, rezCom, kolpass = 0;
int kolused = 0, lastused;
DEFINES *aUsed[100], *stdef;
strotrim ( sLine );
do
{
ptri = sLine; ptro = sOutLine;
@@ -554,53 +616,31 @@ int ParseExpression( char* sLine, char* sOutLine )
while ( ( lenToken = NextName(&ptri, sToken, &ptro) ) > 0 )
if ( (stdef=DefSearch(sToken)) != NULL )
{
for(i=0;i<kolused;i++) if ( aUsed[i] == stdef ) break;
if ( i < kolused ) { if ( i < lastused ) return 1000; }
else
aUsed[kolused++] = stdef;
if ( stdef->pars == NULL )
{
rezDef = 1;
ptro -= lenToken;
lenToken = 0;
while ( *(stdef->value+lenToken) != '\0' )
*ptro++ = *(stdef->value+lenToken++);
}
else
{
SKIPTABSPACES( ptri );
if ( *ptri == '(' )
{
npars=0; i = 0;
while ( *(ptri+i) != ')' && *(ptri+i) != '\0' )
{
if ( *(ptri+i) == ',' ) npars++;
i++;
}
if ( stdef->npars == npars + 1 )
{
rezDef = 1;
ptro -= lenToken;
WorkDefine( &ptri, &ptro, stdef );
}
}
else *ptro++ = ' ';
}
for(i=0;i<kolused;i++) if ( aUsed[i] == stdef ) break;
if ( i < kolused ) { if ( i < lastused ) return 1000; }
else
aUsed[kolused++] = stdef;
rezDef += WorkDefine ( &ptri, &ptro, stdef, lenToken );
}
*ptro = '\0';
memcpy ( sLine, sOutLine, ptro - sOutLine + 1);
/* Look for definitions from #translate */
ptri = sLine; ptro = sOutLine;
while ( ( lenToken = NextName(&ptri, sToken, &ptro) ) > 0 )
if ( (ndef=TraSearch(sToken,0)) >= 0 )
WorkTranslate( sToken, &ptri, ptro, ndef );
/* Look for definitions from #command */
if ( !kolpass )
{
ptri = sLine; ptro = sOutLine;
// lenToken = NextWord( &ptri, sToken, FALSE);
SKIPTABSPACES( ptri );
if ( isname(*ptri) ) lenToken = NextName( &ptri, sToken, NULL);
else { *sToken = *ptri++; *(sToken+1) = '\0'; lenToken = 1; }
if ( (ndef=ComSearch(sToken,0)) >= 0 )
{
if ( (i = WorkCommand( sToken, ptri, &ptro, ndef )) > 0 )
if ( (i = WorkCommand( sToken, ptri, ptro, ndef )) > 0 )
memcpy ( sLine, sOutLine, i+1);
rezCom = 1;
}
@@ -612,7 +652,41 @@ int ParseExpression( char* sLine, char* sOutLine )
return 0;
}
void WorkDefine ( char** ptri, char** ptro, DEFINES *stdef )
int WorkDefine ( char** ptri, char** ptro, DEFINES *stdef, int lenToken )
{
int rezDef = 0, npars, i;
if ( stdef->pars == NULL )
{
rezDef = 1;
*ptro -= lenToken;
lenToken = 0;
while ( *(stdef->value+lenToken) != '\0' )
*(*ptro)++ = *(stdef->value+lenToken++);
}
else
{
SKIPTABSPACES( *ptri );
if ( **ptri == '(' )
{
npars=0; i = 0;
while ( *(*ptri+i) != ')' && *(*ptri+i) != '\0' )
{
if ( *(*ptri+i) == ',' ) npars++;
i++;
}
if ( stdef->npars == npars + 1 )
{
rezDef = 1;
*ptro -= lenToken;
WorkPseudoF( ptri, ptro, stdef );
}
}
else *(*ptro)++ = ' ';
}
return rezDef;
}
void WorkPseudoF ( char** ptri, char** ptro, DEFINES *stdef )
{
char parfict[MAX_NAME], parreal[MAX_NAME];
char *ptrb;
@@ -668,67 +742,103 @@ void WorkDefine ( char** ptri, char** ptro, DEFINES *stdef )
*ptro += lenres;
}
int WorkCommand ( char* sToken, char* ptri, char** ptro, int ndef )
int WorkCommand ( char* sToken, char* ptri, char* ptro, int ndef )
{
int aCmdStru[100][2], iItem;
int rez, nbr;
int lenres = 0;
char *lastopti[2];
int rez;
int lenres;
char *ptrmp;
/* Copying result pattern to destination string */
lenres = strocpy ( *ptro, getCommand(ndef)->value );
CmdParse ( ptri, aCmdStru ); /* Parse input string */
ptrmp = getCommand(ndef)->mpatt; /* Pointer to a match pattern */
do
{
lenres = strocpy ( ptro, getCommand(ndef)->value ); /* Copying result pattern */
ptrmp = getCommand(ndef)->mpatt; /* Pointer to a match pattern */
Repeate = 0;
groupchar = '@';
rez = 1; nbr = 0;
if ( ptrmp == NULL ) rez = ( aCmdStru[0][0] )? 0:1;
rez = CommandStuff ( ptrmp, ptri, ptro, &lenres, TRUE );
if ( !rez ) ndef = ComSearch(sToken,ndef-1);
}
while ( !rez && ndef >= 0 );
*(ptro+lenres) = '\0';
if ( rez ) return lenres;
return 0;
}
int WorkTranslate ( char* sToken, char** ptri, char* ptro, int ndef )
{
int rez;
int lenres;
char *ptrmp;
do
{
lenres = strocpy ( ptro, aTranslates[ndef].value );
ptrmp = aTranslates[ndef].mpatt;
Repeate = 0;
groupchar = '@';
rez = CommandStuff ( ptrmp, *ptri, ptro, &lenres, FALSE );
if ( !rez ) ndef = TraSearch(sToken,ndef-1);
}
while ( !rez && ndef >= 0 );
*(ptro+lenres) = '\0';
if ( rez )
{
Stuff( ptro, *ptri, lenres, rez, strolen(*ptri) );
return lenres;
}
return 0;
}
int CommandStuff ( char *ptrmp, char *inputLine, char * ptro, int *lenres, int com_or_tra )
{
int nbr = 0, endTranslation = FALSE;
char *lastopti[2];
char *ptri = inputLine, *ptr;
if ( ptrmp == NULL ) { if ( *ptri != '\0' ) return 0; }
else
for ( iItem=1; iItem <= aCmdStru[0][0] && rez; iItem++)
while ( *ptri != '\0' && !endTranslation )
{
SKIPTABSPACES( ptrmp );
SKIPTABSPACES( ptri );
switch ( *ptrmp ) {
case '[':
iItem--;
nbr++; ptrmp++; lastopti[Repeate] = ptrmp;
break;
case ']':
iItem--;
if ( Repeate ) { Repeate--; ptrmp = lastopti[Repeate]; }
else { nbr--; ptrmp++; }
break;
case ',':
if ( aCmdStru[iItem][1] == IT_COMMA ) ptrmp++;
if ( *ptri == ',' ) { ptrmp++; ptri++; }
else
{
if ( nbr ) { SkipOptional( &ptrmp, *ptro, &lenres); iItem--; }
else rez = 0;
if ( nbr ) { SkipOptional( &ptrmp, ptro, lenres); }
else return 0;
}
break;
case '\1': /* Match marker */
rez = WorkMarkers( &ptrmp, ptri, *ptro, &lenres, aCmdStru, &iItem, nbr );
if ( !WorkMarkers( &ptrmp, &ptri, ptro, lenres, nbr ) )
return 0;
break;
case '\0':
rez = 0;
break;
if ( com_or_tra ) return 0; else endTranslation = TRUE;
default: /* Key word */
if ( aCmdStru[iItem][1] == IT_COMMA ||
strocmp(ptri + aCmdStru[iItem][0], &ptrmp ) )
ptr = ptrmp;
if ( *ptri == ',' || strincmp(ptri, &ptrmp ) )
{
if ( nbr ) { SkipOptional( &ptrmp, *ptro, &lenres); iItem--; }
else rez = 0;
if ( nbr ) { SkipOptional( &ptrmp, ptro, lenres); }
else return 0;
}
else if ( *ptri != ',' ) ptri += (ptrmp - ptr);
}
}
};
if ( rez && ptrmp != NULL)
if ( ptrmp != NULL )
{
SKIPTABSPACES( ptrmp );
if ( *ptrmp == ']' ) { ptrmp++; nbr--; }
if ( Repeate ) { Repeate = 0; ptrmp = lastopti[0] - 1; }
do
{
@@ -737,184 +847,67 @@ int WorkCommand ( char* sToken, char* ptri, char** ptro, int ndef )
switch ( *ptrmp ) {
case '[':
ptrmp++;
SkipOptional( &ptrmp, *ptro, &lenres);
SkipOptional( &ptrmp, ptro, lenres);
ptrmp++;
break;
case ']': ptrmp++; break;
default:
rez = 0;
return 0;
}
}
while ( *ptrmp != '\0' && rez );
while ( *ptrmp != '\0' );
}
if ( !rez && (ndef = ComSearch(sToken,ndef-1))>=0 )
{
ptrmp = getCommand(ndef)->mpatt; /* Pointer to a match pattern */
/* Copying result pattern to destination string */
lenres = strocpy ( *ptro, getCommand(ndef)->value );
}
}
while ( !rez && ndef >= 0 );
*(*ptro+lenres) = '\0';
if ( rez ) return lenres;
return 0;
if ( com_or_tra ) return 1; else return (ptri-inputLine);
}
void CmdParse ( char *ptri, int aCmdStru[100][2] )
int WorkMarkers( char **ptrmp, char **ptri, char *ptro, int *lenres, int nbr )
{
char *sZnaki = "+-=><*/$";
int State = State = STATE_ID_END, StBr1 = 0, StBr2 = 0, StBr3 = 0;
int i = 0;
aCmdStru[0][0] = 0;
while ( *ptri != '\0' )
{
switch ( State ) {
case STATE_QUOTE1:
if(*ptri=='\'')
State = (StBr1==0 && StBr2==0 && StBr3==0)? STATE_ID_END:STATE_BRACKET;
break;
case STATE_QUOTE2:
if(*ptri=='\"')
State = (StBr1==0 && StBr2==0 && StBr3==0)? STATE_ID_END:STATE_BRACKET;
break;
case STATE_BRACKET:
if ( *ptri == '\'' ) State = STATE_QUOTE1;
else if ( *ptri == '\"' ) State = STATE_QUOTE2;
else if ( *ptri == '(' ) StBr1++;
else if ( *ptri == '[' ) StBr2++;
else if ( *ptri == '{' ) StBr3++;
else if ( *ptri == ')' )
{ StBr1--; if (StBr1==0 && StBr2==0 && StBr3==0) State = STATE_ID_END; }
else if ( *ptri == ']' )
{ StBr2--; if (StBr1==0 && StBr2==0 && StBr3==0) State = STATE_ID_END; }
else if ( *ptri == '}' )
{ StBr3--; if (StBr1==0 && StBr2==0 && StBr3==0) State = STATE_ID_END; }
break;
case STATE_ID:
case STATE_ID_END:
if ( ( (isname(*ptri) || *ptri=='\\') && State == STATE_ID_END ) ||
*ptri==',' || *ptri=='\'' || *ptri=='\"')
{
if ( !aCmdStru[ aCmdStru[0][0] ][1] ) aCmdStru[ aCmdStru[0][0] ][1] = IT_ID;
State = STATE_ID;
aCmdStru[0][0]++;
aCmdStru[ aCmdStru[0][0] ][0] = i;
if ( *ptri == ',' )
{
State = STATE_ID_END;
aCmdStru[ aCmdStru[0][0] ][1] = IT_COMMA;
}
else if ( *ptri == '\'' )
{
State = STATE_QUOTE1;
aCmdStru[ aCmdStru[0][0] ][1] = IT_EXPR;
}
else if ( *ptri == '\"' )
{
State = STATE_QUOTE2;
aCmdStru[ aCmdStru[0][0] ][1] = IT_EXPR;
}
else
{
State = STATE_ID;
if ( isdigit(*ptri) ) aCmdStru[ aCmdStru[0][0] ][1] = IT_EXPR;
else aCmdStru[ aCmdStru[0][0] ][1] = 0;
}
}
else if ( IsInStr( *ptri, sZnaki ) ) State = STATE_EXPRES;
else if ( *ptri == '(' )
{
State = STATE_BRACKET;
StBr1 = 1;
aCmdStru[ aCmdStru[0][0] ][1] = IT_ID_OR_EXPR;
aCmdStru[0][0]++;
aCmdStru[ aCmdStru[0][0] ][0] = i;
aCmdStru[ aCmdStru[0][0] ][1] = IT_EXPR;
}
else if ( *ptri == '[' )
{
State = STATE_BRACKET;
StBr2 = 1;
aCmdStru[ aCmdStru[0][0] ][1] = IT_EXPR;
}
else if ( *ptri == '{' )
{
State = STATE_BRACKET;
StBr3 = 1;
aCmdStru[ aCmdStru[0][0] ][1] = IT_ID;
aCmdStru[0][0]++;
aCmdStru[ aCmdStru[0][0] ][0] = i;
aCmdStru[ aCmdStru[0][0] ][1] = IT_EXPR;
}
else if ( *ptri == ' ' ) State = STATE_ID_END;
break;
case STATE_EXPRES:
aCmdStru[ aCmdStru[0][0] ][1] = IT_EXPR;
if ( *ptri == '\'' ) State = STATE_QUOTE1;
else if ( *ptri == '\"' ) State = STATE_QUOTE2;
else if ( isname(*ptri) ) State = STATE_ID;
else if ( *ptri == '(' ) { StBr1++; State = STATE_BRACKET; }
else if ( *ptri == '[' ) { StBr2++; State = STATE_BRACKET; }
else if ( *ptri == '{' ) { StBr3++; State = STATE_BRACKET; }
break;
}
ptri++; i++;
}
if ( aCmdStru[0][0] && !aCmdStru[ aCmdStru[0][0] ][1] )
aCmdStru[ aCmdStru[0][0] ][1] = IT_ID;
aCmdStru[ aCmdStru[0][0]+1 ][0] = i;
}
int WorkMarkers( char **ptrmp, char *ptri, char *ptro, int *lenres, int aCmdStru[100][2], int *iItem, int nbr )
{
int ifiItem;
char expreal[MAX_NAME], exppatt[MAX_NAME];
int lenreal, lenpatt;
int rezrestr,i;
char *ptr;
int lenreal = 0, lenpatt;
int rezrestr, i, ipos;
char *ptr, *ptrtemp;
if ( aCmdStru[*iItem][1] == IT_COMMA ) return 0;
if ( **ptri == ',' ) return 0;
/* Copying a match pattern to 'exppatt' */
lenpatt = stroncpy ( exppatt, *ptrmp, 4 );
*ptrmp += 4;
SKIPTABSPACES ( *ptrmp );
if ( !isname( ** ptrmp ) && **ptrmp != '\1' && **ptrmp != ',' &&
**ptrmp != '[' && **ptrmp != ']' && **ptrmp != '\0' )
{
lenreal = strincpy ( expreal, *ptrmp );
if ( (ipos = hb_strAt( expreal, lenreal, *ptri, strolen(*ptri) )) > 0 )
{
lenreal = stroncpy( expreal, *ptri, ipos-1 );
*ptri += lenreal;
}
else return 0;
}
ifiItem = *iItem;
if ( aCmdStru[ifiItem][1] == IT_ID_OR_EXPR ) (*iItem)++;
if ( *(exppatt+2) == '4' ) /* ---- extended match marker */
{
/* Copying a real expression to 'expreal' */
lenreal = stroncpy ( expreal, ptri + aCmdStru[ifiItem][0],
aCmdStru[*iItem+1][0]-aCmdStru[ifiItem][0] );
if ( !lenreal ) lenreal = getExpReal ( expreal, ptri, FALSE );
SearnRep( exppatt,expreal,lenreal,ptro,lenres);
}
else if ( *(exppatt+2) == '3' ) /* ---- wild match marker */
{
*iItem = aCmdStru[0][0];
/* Copying a real expression to 'expreal' */
lenreal = stroncpy ( expreal, ptri + aCmdStru[ifiItem][0],
aCmdStru[*iItem+1][0]-aCmdStru[ifiItem][0] );
lenreal = strocpy ( expreal, *ptri );
*ptri += lenreal;
SearnRep( exppatt,expreal,lenreal,ptro,lenres);
}
else if ( *(exppatt+2) == '2' ) /* ---- restricted match marker */
{
while ( **ptrmp != '>' && **ptrmp!= '\0' ) *(exppatt+lenpatt++) = *((*ptrmp)++);
*(exppatt+lenpatt++) = '>';
while ( **ptrmp != '>' ) *(exppatt+lenpatt++) = *((*ptrmp)++);
*(exppatt+lenpatt) = '\0';
(*ptrmp)++;
/* Copying a real expression to 'expreal' */
lenreal = stroncpy ( expreal, ptri + aCmdStru[ifiItem][0],
aCmdStru[*iItem+1][0]-aCmdStru[ifiItem][0] );
ptr = exppatt + 4;
rezrestr = 0;
while ( *ptr != '>' )
while ( *ptr != '\0' )
{
if ( *ptr == '&' )
{
if ( *expreal == '&' )
if ( **ptri == '&' )
{
rezrestr = 1;
break;
@@ -925,49 +918,134 @@ int WorkMarkers( char **ptrmp, char *ptri, char *ptro, int *lenres, int aCmdStru
{
SKIPTABSPACES( ptr );
/* Comparing real parameter and restriction value */
for ( i=0; toupper(*ptr) == toupper(*(expreal+i)) && *ptr != ','
&& *ptr != '>' && i < lenreal; i++,ptr++ );
if ( i == lenreal || *ptr == ',' || *ptr == '>' )
ptrtemp = ptr;
if ( !strincmp ( *ptri, &ptr ) )
{
lenreal = stroncpy( expreal, *ptri, (ptr-ptrtemp) );
*ptri += lenreal;
SearnRep( exppatt,expreal,lenreal,ptro,lenres);
rezrestr = 1;
break;
}
else
{
while ( *ptr != ',' && *ptr != '>' ) ptr++;
while ( *ptr != ',' && *ptr != '\0' ) ptr++;
if ( *ptr == ',' ) ptr++;
}
}
}
if ( rezrestr == 0 )
{ /* If restricted match marker doesn't correspond to real parameter */
if ( nbr )
{
SearnRep( exppatt,"",0,ptro,lenres);
(*iItem)--; /* if was optional, go to the next */
}
if ( nbr ) SearnRep( exppatt,"",0,ptro,lenres);
else return 0;
}
}
else if ( *(exppatt+2) == '1' ) /* ---- list match marker */
{
while ( *iItem < aCmdStru[0][0] && aCmdStru[*iItem+1][1] == IT_COMMA ) *iItem+=2;
/* Copying a real expression to 'expreal' */
lenreal = stroncpy ( expreal, ptri + aCmdStru[ifiItem][0],
aCmdStru[*iItem+1][0]-aCmdStru[ifiItem][0] );
if ( !lenreal ) lenreal = getExpReal ( expreal, ptri, TRUE );
SearnRep( exppatt,expreal,lenreal,ptro,lenres);
}
else /* ---- regular match marker */
{
/* Copying a real expression to 'expreal' */
lenreal = stroncpy ( expreal, ptri + aCmdStru[ifiItem][0],
aCmdStru[*iItem+1][0]-aCmdStru[ifiItem][0] );
if ( !lenreal ) lenreal = getExpReal ( expreal, ptri, FALSE );
SearnRep( exppatt,expreal,lenreal,ptro,lenres);
}
return 1;
}
int getExpReal ( char *expreal, char **ptri, int prlist )
{
int lens = 0;
char *sZnaki = "+-=><*/$.&:";
int State;
int StBr1 = 0, StBr2 = 0, StBr3 = 0;
int rez = 0;
SKIPTABSPACES ( *ptri );
State = (**ptri=='\'' || **ptri=='\"')? STATE_EXPRES:STATE_ID;
while ( **ptri != '\0' && !rez )
{
switch ( State ) {
case STATE_QUOTE1:
if(**ptri=='\'')
State = (StBr1==0 && StBr2==0 && StBr3==0)? STATE_ID_END:STATE_BRACKET;
break;
case STATE_QUOTE2:
if(**ptri=='\"')
State = (StBr1==0 && StBr2==0 && StBr3==0)? STATE_ID_END:STATE_BRACKET;
break;
case STATE_BRACKET:
if ( **ptri == '\'' ) State = STATE_QUOTE1;
else if ( **ptri == '\"' ) State = STATE_QUOTE2;
else if ( **ptri == '(' ) StBr1++;
else if ( **ptri == '[' ) StBr2++;
else if ( **ptri == '{' ) StBr3++;
else if ( **ptri == ')' )
{ StBr1--; if (StBr1==0 && StBr2==0 && StBr3==0) State = STATE_ID_END; }
else if ( **ptri == ']' )
{ StBr2--; if (StBr1==0 && StBr2==0 && StBr3==0) State = STATE_ID_END; }
else if ( **ptri == '}' )
{ StBr3--; if (StBr1==0 && StBr2==0 && StBr3==0) State = STATE_ID_END; }
break;
case STATE_ID:
case STATE_ID_END:
if ( ( (isname(**ptri) || **ptri=='\\') && State == STATE_ID_END ) ||
**ptri==',' || **ptri=='\'' || **ptri=='\"')
{
if ( **ptri == ',' )
{
if ( !prlist ) rez = 1;
State = STATE_EXPRES;
}
else rez = 1;
}
else if ( IsInStr( **ptri, sZnaki ) )
{
State = STATE_EXPRES;
}
else if ( **ptri == '(' )
{
State = STATE_BRACKET;
StBr1 = 1;
}
else if ( **ptri == '[' )
{
State = STATE_BRACKET;
StBr2 = 1;
}
else if ( **ptri == '{' )
{
State = STATE_BRACKET;
StBr3 = 1;
}
else if ( **ptri == ' ' ) State = STATE_ID_END;
break;
case STATE_EXPRES:
case STATE_EXPRES_ID:
if ( **ptri == '\'' ) State = STATE_QUOTE1;
else if ( **ptri == '\"' ) State = STATE_QUOTE2;
else if ( isname(**ptri) ) State = STATE_EXPRES_ID;
else if ( **ptri == ' ' && State == STATE_EXPRES_ID ) State = STATE_ID_END;
else if ( **ptri == '(' ) { StBr1++; State = STATE_BRACKET; }
else if ( **ptri == '[' ) { StBr2++; State = STATE_BRACKET; }
else if ( **ptri == '{' ) { StBr3++; State = STATE_BRACKET; }
else if ( **ptri == ',' ) { if ( !prlist ) rez = 1; State = STATE_EXPRES; }
else State = STATE_EXPRES;
break;
}
if ( !rez )
{
*expreal++ = **ptri;
(*ptri)++;
lens++;
}
}
if ( *(expreal-1) == ' ' ) { expreal--; lens--; };
*expreal = '\0';
return lens;
}
void SkipOptional( char** ptri, char *ptro, int* lenres)
{
int nbr = 0;
@@ -1177,8 +1255,9 @@ char cha,cLast='\0';
}
if ( cha != ' ' && cha != '\t' ) State = 1;
if( lDropSpaces && State ) lDropSpaces = 0;
if(readed<maxlen && (!lDropSpaces || readed==0) &&
ParseState != STATE_COMMENT) buffer[readed++]=cha;
if( readed<maxlen && (!lDropSpaces || readed==0) &&
ParseState != STATE_COMMENT )
buffer[readed++]=cha;
}
while(--readed >= 0 && ( buffer[readed] == ' ' || buffer[readed] == '\t') );
readed++;
@@ -1198,7 +1277,7 @@ int hb_strAt(char *szSub, int lSubLen, char *szText, int lLen)
{
if( lSubLen )
{
if( lLen > lSubLen )
if( lLen >= lSubLen )
{
long lPos = 0, lSubPos = 0;
@@ -1272,12 +1351,23 @@ int stroncpy (char* ptro, char* ptri, int lens )
return i;
}
int strocmp (char* ptro, char** ptri )
int strincmp (char* ptro, char** ptri )
{
for ( ; isname(**ptri) && isname(*ptro) && toupper(**ptri)==toupper(*ptro);
for ( ; **ptri != ' ' && **ptri != ',' && **ptri != '[' && **ptri != ']' &&
**ptri != '\1' && **ptri != '\0' && toupper(**ptri)==toupper(*ptro);
ptro++, (*ptri)++ );
if ( toupper(**ptri) != toupper(*ptro) ) return 1;
return 0;
if ( **ptri == ' ' || **ptri == ',' || **ptri == '[' ||
**ptri == ']' || **ptri == '\1' || **ptri == '\0' ) return 0;
return 1;
}
int strincpy (char* ptro, char* ptri )
{
int lens = 0;
for ( ; *ptri != ' ' && *ptri != ',' && *ptri != '[' && *ptri != ']' &&
*ptri != '\1' && *ptri != '\0'; ptro++, ptri++, lens++ )
*ptro = *ptri;
return lens;
}
char* strodup ( char *stroka )
@@ -1298,6 +1388,37 @@ int strolen ( char *stroka )
return lens;
}
int strotrim ( char *stroka )
{
char *ptr = stroka, lastc = '0';
int lens = 0, State = STATE_NORMAL;
while ( *stroka != '\0' )
{
if ( State == STATE_QUOTE1 ) { if (*stroka == '\'') State = STATE_NORMAL; }
else if ( State == STATE_QUOTE2 ) { if (*stroka=='\"') State = STATE_NORMAL; }
else
if ( (*stroka != ' ' && *stroka != '\t') ||
( isname(lastc) && isname(*(stroka+1)) ) )
{
*ptr++ = *stroka;
lastc = *stroka;
lens++;
}
stroka++;
}
*ptr = '\0';
return lens;
}
int idDrag ( char *identif, char **ptri )
{
int idlen = 0;
while ( **ptri != '[' && **ptri != ']' && **ptri != '\1' && **ptri != '\0' )
*(identif + idlen++) = *(*ptri)++;
do idlen--; while ( *(identif + idlen) == ' ' );
return idlen+1;
}
int NextWord ( char** sSource, char* sDest, int lLower )
{
int i = 0;

View File

@@ -1,7 +1,7 @@
/*
* $Id$
*/
#include <stdio.h>
typedef struct
@@ -13,10 +13,11 @@ typedef struct
} DEFINES;
typedef struct
{
int com_or_xcom;
char *name;
char *mpatt;
char *value;
} COMMANDS;
} COMMANDS, TRANSLATES;
int koldef = 41;
DEFINES aDefines[] =
@@ -67,269 +68,269 @@ DEFINES aDefines[] =
int kolcomm = 239;
COMMANDS aCommands[] =
{
{"DO","WHILE \1A00","while \1A00"},
{"END","\1A00","end"},
{"END","SEQUENCE","end"},
{"ENDSEQUENCE","","end"},
{"ENDDO","\1A30","enddo"},
{"ENDIF","\1A30","endif"},
{"ENDCASE","\1A30","endcase"},
{"ENDFOR","[ \1A30 ]","next"},
{"NEXT","\1A00 [TO \1B00] [STEP \1C00]","next"},
{"DO","\1A00.PRG [WITH \1B10]","do \1A00 [ WITH \1B00]"},
{"CALL","\1A00() [WITH \1B10]","call \1A00 [ WITH \1B00]"},
{"STORE","\1A00 TO \1B00 [, \1C00 ]","\1B00 := [ \1C00 := ] \1A00"},
{"SET","ECHO \1A30",NULL},
{"SET","HEADING \1A30",NULL},
{"SET","MENU \1A30",NULL},
{"SET","STATUS \1A30",NULL},
{"SET","STEP \1A30",NULL},
{"SET","SAFETY \1A30",NULL},
{"SET","TALK \1A30",NULL},
{"SET","PROCEDURE TO",NULL},
{"SET","PROCEDURE TO \1A00","_ProcReq_( \1A30 )"},
{"SET","EXACT \1A20ON,OFF,&>","Set( _SET_EXACT, \1A30 )"},
{"SET","EXACT (\1A00)","Set( _SET_EXACT, \1A00 )"},
{"SET","FIXED \1A20ON,OFF,&>","Set( _SET_FIXED, \1A30 )"},
{"SET","FIXED (\1A00)","Set( _SET_FIXED, \1A00 )"},
{"SET","DECIMALS TO \1A00","Set( _SET_DECIMALS, \1A00 )"},
{"SET","DECIMALS TO","Set( _SET_DECIMALS, 0 )"},
{"SET","PATH TO \1A30","Set( _SET_PATH, \1A30 )"},
{"SET","PATH TO","Set( _SET_PATH, "" )"},
{"SET","DEFAULT TO \1A40","Set( _SET_DEFAULT, \1A30 )"},
{"SET","DEFAULT TO","Set( _SET_DEFAULT, "" )"},
{"SET","CENTURY \1A20ON,OFF,&>","__SetCentury( \1A30 )"},
{"SET","CENTURY (\1A00)","__SetCentury( \1A00 )"},
{"SET","EPOCH TO \1A00","Set( _SET_EPOCH, \1A00 )"},
{"SET","DATE FORMAT [TO] \1A00","Set( _SET_DATEFORMAT, \1A00 )"},
{"SET","DATE [TO] AMERICAN","_DFSET( 'mm/dd/yyyy', 'mm/dd/yy' )"},
{"SET","DATE [TO] ANSI","_DFSET( 'yyyy.mm.dd', 'yy.mm.dd' )"},
{"SET","DATE [TO] BRITISH","_DFSET( 'dd/mm/yyyy', 'dd/mm/yy' )"},
{"SET","DATE [TO] FRENCH","_DFSET( 'dd/mm/yyyy', 'dd/mm/yy' )"},
{"SET","DATE [TO] GERMAN","_DFSET( 'dd.mm.yyyy', 'dd.mm.yy' )"},
{"SET","DATE [TO] ITALIAN","_DFSET( 'dd-mm-yyyy', 'dd-mm-yy' )"},
{"SET","DATE [TO] JAPANESE","_DFSET( 'yyyy/mm/dd', 'yy/mm/dd' )"},
{"SET","DATE [TO] USA","_DFSET( 'mm-dd-yyyy', 'mm-dd-yy' )"},
{"SET","ALTERNATE \1A20ON,OFF,&>","Set( _SET_ALTERNATE, \1A30 )"},
{"SET","ALTERNATE (\1A00)","Set( _SET_ALTERNATE, \1A00 )"},
{"SET","ALTERNATE TO","Set( _SET_ALTFILE, "" )"},
{"SET","ALTERNATE TO \1A40 [\1B20 ADDITIVE>]","Set( _SET_ALTFILE, \1A30, \1B50 )"},
{"SET","CONSOLE \1A20ON,OFF,&>","Set( _SET_CONSOLE, \1A30 )"},
{"SET","CONSOLE (\1A00)","Set( _SET_CONSOLE, \1A00 )"},
{"SET","MARGIN TO \1A00","Set( _SET_MARGIN, \1A00 )"},
{"SET","MARGIN TO","Set( _SET_MARGIN, 0 )"},
{"SET","PRINTER \1A20ON,OFF,&>","Set( _SET_PRINTER, \1A30 )"},
{"SET","PRINTER (\1A00)","Set( _SET_PRINTER, \1A00 )"},
{"SET","PRINTER TO","Set( _SET_PRINTFILE, "" )"},
{"SET","PRINTER TO \1A40 [\1B20 ADDITIVE>]","Set( _SET_PRINTFILE, \1A30, \1B50 )"},
{"SET","DEVICE TO SCREEN","Set( _SET_DEVICE, 'SCREEN' )"},
{"SET","DEVICE TO PRINTER","Set( _SET_DEVICE, 'PRINTER' )"},
{"SET","COLOR TO [\1A30]","SetColor( \1A10 )"},
{"SET","COLOR TO ( \1A00 )","SetColor( \1A00 )"},
{"SET","COLOUR TO [\1A30]","SET COLOR TO [\1A00]"},
{"SET","CURSOR \1A20ON,OFF,&>","SetCursor( if(Upper(\1A30) == 'ON', 1, 0) )"},
{"SET","CURSOR (\1A00)","SetCursor( if(\1A00, 1, 0) )"},
{"?","[ \1A10]","QOut( \1A00 )"},
{"??","[ \1A10]","QQOut( \1A00 )"},
{"EJECT","","__Eject()"},
{"TEXT","","text QOut, QQOut"},
{"TEXT","TO FILE \1A40","__TextSave( \1A30 ) ; text QOut, __TextRestore"},
{"TEXT","TO PRINTER","__TextSave('PRINTER') ; text QOut, __TextRestore"},
{"CLS","","Scroll() ; SetPos(0,0)"},
{"CLEAR","SCREEN","CLS"},
{"@","\1A00, \1B00","Scroll( \1A00, \1B00, \1A00 ) ; SetPos( \1A00, \1B00 )"},
{"@","\1A00, \1B00 CLEAR","Scroll( \1A00, \1B00 ) ; SetPos( \1A00, \1B00 )"},
{"@","\1A00, \1B00 CLEAR TO \1C00, \1D00","Scroll( \1A00, \1B00, \1C00, \1D00 ) ; SetPos( \1A00, \1B00 )"},
{"@","\1A00, \1B00, \1C00, \1D00 BOX \1E00 [COLOR \1F00]","DispBox( \1A00, \1B00, \1C00, \1D00, \1E00 [, \1F00 ] )"},
{"@","\1A00, \1B00 TO \1C00, \1D00 [DOUBLE] [COLOR \1E00]","DispBox( \1A00, \1B00, \1C00, \1D00, 2 [, \1E00 ] )"},
{"@","\1A00, \1B00 TO \1C00, \1D00 [COLOR \1E00]","DispBox( \1A00, \1B00, \1C00, \1D00, 1 [, \1E00 ] )"},
{"@","\1A00, \1B00 SAY \1C00 [PICTURE \1D00] [COLOR \1E00]","DevPos( \1A00, \1B00 ) ; DevOutPict( \1C00, \1D00 [, \1E00] )"},
{"@","\1A00, \1B00 SAY \1C00 [COLOR \1D00]","DevPos( \1A00, \1B00 ) ; DevOut( \1C00 [, \1D00] )"},
{"SET","BELL \1A20ON,OFF,&>","Set( _SET_BELL, \1A30 )"},
{"SET","BELL (\1A00)","Set( _SET_BELL, \1A00 )"},
{"SET","CONFIRM \1A20ON,OFF,&>","Set( _SET_CONFIRM, \1A30 )"},
{"SET","CONFIRM (\1A00)","Set( _SET_CONFIRM, \1A00 )"},
{"SET","ESCAPE \1A20ON,OFF,&>","Set( _SET_ESCAPE, \1A30 )"},
{"SET","ESCAPE (\1A00)","Set( _SET_ESCAPE, \1A00 )"},
{"SET","INTENSITY \1A20ON,OFF,&>","Set( _SET_INTENSITY, \1A30 )"},
{"SET","INTENSITY (\1A00)","Set( _SET_INTENSITY, \1A00 )"},
{"SET","SCOREBOARD \1A20ON,OFF,&>","Set( _SET_SCOREBOARD, \1A30 )"},
{"SET","SCOREBOARD (\1A00)","Set( _SET_SCOREBOARD, \1A00 )"},
{"SET","DELIMITERS \1A20ON,OFF,&>","Set( _SET_DELIMITERS, \1A30 )"},
{"SET","DELIMITERS (\1A00)","Set( _SET_DELIMITERS, \1A00 )"},
{"SET","DELIMITERS TO \1A00","Set( _SET_DELIMCHARS, \1A00 )"},
{"SET","DELIMITERS TO DEFAULT","Set( _SET_DELIMCHARS, '::' )"},
{"SET","DELIMITERS TO","Set( _SET_DELIMCHARS, '::' )"},
{"SET","FORMAT TO \1A00","_ProcReq_( \1A30 + '.FMT' ) ; __SetFormat( {|| \1A00()} )"},
{"SET","FORMAT TO \1A00.\1B00","_ProcReq_( \1A30 + '.' + \1B30 ) ; __SetFormat( {|| \1A00()} )"},
{"SET","FORMAT TO \1A20&>","if ( Empty(\1A30) ) ; SET FORMAT TO ; else ; __SetFormat( &('{||' + \1A30 + '()}') ) ; end"},
{"SET","FORMAT TO","__SetFormat()"},
{"@","\1A00, \1B00 GET \1C00 [PICTURE \1D00] [VALID \1E00] [WHEN \1F00] [SEND \1G00]",
{0,"DO","WHILE \1A00","while \1A00"},
{0,"END","\1A00","end"},
{0,"END","SEQUENCE","end"},
{0,"ENDSEQUENCE","","end"},
{0,"ENDDO","\1A30","enddo"},
{0,"ENDIF","\1A30","endif"},
{0,"ENDCASE","\1A30","endcase"},
{0,"ENDFOR","[ \1A30 ]","next"},
{0,"NEXT","\1A00 [TO \1B00] [STEP \1C00]","next"},
{0,"DO","\1A00.PRG [WITH \1B10]","do \1A00 [ WITH \1B00]"},
{0,"CALL","\1A00() [WITH \1B10]","call \1A00 [ WITH \1B00]"},
{0,"STORE","\1A00 TO \1B00 [, \1C00 ]","\1B00 := [ \1C00 := ] \1A00"},
{0,"SET","ECHO \1A30",NULL},
{0,"SET","HEADING \1A30",NULL},
{0,"SET","MENU \1A30",NULL},
{0,"SET","STATUS \1A30",NULL},
{0,"SET","STEP \1A30",NULL},
{0,"SET","SAFETY \1A30",NULL},
{0,"SET","TALK \1A30",NULL},
{0,"SET","PROCEDURE TO",NULL},
{0,"SET","PROCEDURE TO \1A00","_ProcReq_( \1A30 )"},
{0,"SET","EXACT \1A20ON,OFF,&>","Set( _SET_EXACT, \1A30 )"},
{0,"SET","EXACT (\1A00)","Set( _SET_EXACT, \1A00 )"},
{0,"SET","FIXED \1A20ON,OFF,&>","Set( _SET_FIXED, \1A30 )"},
{0,"SET","FIXED (\1A00)","Set( _SET_FIXED, \1A00 )"},
{0,"SET","DECIMALS TO \1A00","Set( _SET_DECIMALS, \1A00 )"},
{0,"SET","DECIMALS TO","Set( _SET_DECIMALS, 0 )"},
{0,"SET","PATH TO \1A30","Set( _SET_PATH, \1A30 )"},
{0,"SET","PATH TO","Set( _SET_PATH, "" )"},
{0,"SET","DEFAULT TO \1A40","Set( _SET_DEFAULT, \1A30 )"},
{0,"SET","DEFAULT TO","Set( _SET_DEFAULT, "" )"},
{0,"SET","CENTURY \1A20ON,OFF,&>","__SetCentury( \1A30 )"},
{0,"SET","CENTURY (\1A00)","__SetCentury( \1A00 )"},
{0,"SET","EPOCH TO \1A00","Set( _SET_EPOCH, \1A00 )"},
{0,"SET","DATE FORMAT [TO] \1A00","Set( _SET_DATEFORMAT, \1A00 )"},
{0,"SET","DATE [TO] AMERICAN","_DFSET( 'mm/dd/yyyy', 'mm/dd/yy' )"},
{0,"SET","DATE [TO] ANSI","_DFSET( 'yyyy.mm.dd', 'yy.mm.dd' )"},
{0,"SET","DATE [TO] BRITISH","_DFSET( 'dd/mm/yyyy', 'dd/mm/yy' )"},
{0,"SET","DATE [TO] FRENCH","_DFSET( 'dd/mm/yyyy', 'dd/mm/yy' )"},
{0,"SET","DATE [TO] GERMAN","_DFSET( 'dd.mm.yyyy', 'dd.mm.yy' )"},
{0,"SET","DATE [TO] ITALIAN","_DFSET( 'dd-mm-yyyy', 'dd-mm-yy' )"},
{0,"SET","DATE [TO] JAPANESE","_DFSET( 'yyyy/mm/dd', 'yy/mm/dd' )"},
{0,"SET","DATE [TO] USA","_DFSET( 'mm-dd-yyyy', 'mm-dd-yy' )"},
{0,"SET","ALTERNATE \1A20ON,OFF,&>","Set( _SET_ALTERNATE, \1A30 )"},
{0,"SET","ALTERNATE (\1A00)","Set( _SET_ALTERNATE, \1A00 )"},
{0,"SET","ALTERNATE TO","Set( _SET_ALTFILE, "" )"},
{0,"SET","ALTERNATE TO \1A40 [\1B20 ADDITIVE>]","Set( _SET_ALTFILE, \1A30, \1B50 )"},
{0,"SET","CONSOLE \1A20ON,OFF,&>","Set( _SET_CONSOLE, \1A30 )"},
{0,"SET","CONSOLE (\1A00)","Set( _SET_CONSOLE, \1A00 )"},
{0,"SET","MARGIN TO \1A00","Set( _SET_MARGIN, \1A00 )"},
{0,"SET","MARGIN TO","Set( _SET_MARGIN, 0 )"},
{0,"SET","PRINTER \1A20ON,OFF,&>","Set( _SET_PRINTER, \1A30 )"},
{0,"SET","PRINTER (\1A00)","Set( _SET_PRINTER, \1A00 )"},
{0,"SET","PRINTER TO","Set( _SET_PRINTFILE, "" )"},
{0,"SET","PRINTER TO \1A40 [\1B20 ADDITIVE>]","Set( _SET_PRINTFILE, \1A30, \1B50 )"},
{0,"SET","DEVICE TO SCREEN","Set( _SET_DEVICE, 'SCREEN' )"},
{0,"SET","DEVICE TO PRINTER","Set( _SET_DEVICE, 'PRINTER' )"},
{0,"SET","COLOR TO [\1A30]","SetColor( \1A10 )"},
{0,"SET","COLOR TO ( \1A00 )","SetColor( \1A00 )"},
{0,"SET","COLOUR TO [\1A30]","SET COLOR TO [\1A00]"},
{0,"SET","CURSOR \1A20ON,OFF,&>","SetCursor( if(Upper(\1A30) == 'ON', 1, 0) )"},
{0,"SET","CURSOR (\1A00)","SetCursor( if(\1A00, 1, 0) )"},
{0,"?","[ \1A10]","QOut( \1A00 )"},
{0,"??","[ \1A10]","QQOut( \1A00 )"},
{0,"EJECT","","__Eject()"},
{0,"TEXT","","text QOut, QQOut"},
{0,"TEXT","TO FILE \1A40","__TextSave( \1A30 ) ; text QOut, __TextRestore"},
{0,"TEXT","TO PRINTER","__TextSave('PRINTER') ; text QOut, __TextRestore"},
{0,"CLS","","Scroll() ; SetPos(0,0)"},
{0,"CLEAR","SCREEN","CLS"},
{0,"@","\1A00, \1B00","Scroll( \1A00, \1B00, \1A00 ) ; SetPos( \1A00, \1B00 )"},
{0,"@","\1A00, \1B00 CLEAR","Scroll( \1A00, \1B00 ) ; SetPos( \1A00, \1B00 )"},
{0,"@","\1A00, \1B00 CLEAR TO \1C00, \1D00","Scroll( \1A00, \1B00, \1C00, \1D00 ) ; SetPos( \1A00, \1B00 )"},
{0,"@","\1A00, \1B00, \1C00, \1D00 BOX \1E00 [COLOR \1F00]","DispBox( \1A00, \1B00, \1C00, \1D00, \1E00 [, \1F00 ] )"},
{0,"@","\1A00, \1B00 TO \1C00, \1D00 [DOUBLE] [COLOR \1E00]","DispBox( \1A00, \1B00, \1C00, \1D00, 2 [, \1E00 ] )"},
{0,"@","\1A00, \1B00 TO \1C00, \1D00 [COLOR \1E00]","DispBox( \1A00, \1B00, \1C00, \1D00, 1 [, \1E00 ] )"},
{0,"@","\1A00, \1B00 SAY \1C00 [PICTURE \1D00] [COLOR \1E00]","DevPos( \1A00, \1B00 ) ; DevOutPict( \1C00, \1D00 [, \1E00] )"},
{0,"@","\1A00, \1B00 SAY \1C00 [COLOR \1D00]","DevPos( \1A00, \1B00 ) ; DevOut( \1C00 [, \1D00] )"},
{0,"SET","BELL \1A20ON,OFF,&>","Set( _SET_BELL, \1A30 )"},
{0,"SET","BELL (\1A00)","Set( _SET_BELL, \1A00 )"},
{0,"SET","CONFIRM \1A20ON,OFF,&>","Set( _SET_CONFIRM, \1A30 )"},
{0,"SET","CONFIRM (\1A00)","Set( _SET_CONFIRM, \1A00 )"},
{0,"SET","ESCAPE \1A20ON,OFF,&>","Set( _SET_ESCAPE, \1A30 )"},
{0,"SET","ESCAPE (\1A00)","Set( _SET_ESCAPE, \1A00 )"},
{0,"SET","INTENSITY \1A20ON,OFF,&>","Set( _SET_INTENSITY, \1A30 )"},
{0,"SET","INTENSITY (\1A00)","Set( _SET_INTENSITY, \1A00 )"},
{0,"SET","SCOREBOARD \1A20ON,OFF,&>","Set( _SET_SCOREBOARD, \1A30 )"},
{0,"SET","SCOREBOARD (\1A00)","Set( _SET_SCOREBOARD, \1A00 )"},
{0,"SET","DELIMITERS \1A20ON,OFF,&>","Set( _SET_DELIMITERS, \1A30 )"},
{0,"SET","DELIMITERS (\1A00)","Set( _SET_DELIMITERS, \1A00 )"},
{0,"SET","DELIMITERS TO \1A00","Set( _SET_DELIMCHARS, \1A00 )"},
{0,"SET","DELIMITERS TO DEFAULT","Set( _SET_DELIMCHARS, '::' )"},
{0,"SET","DELIMITERS TO","Set( _SET_DELIMCHARS, '::' )"},
{0,"SET","FORMAT TO \1A00","_ProcReq_( \1A30 + '.FMT' ) ; __SetFormat( {|| \1A00()} )"},
{0,"SET","FORMAT TO \1A00.\1B00","_ProcReq_( \1A30 + '.' + \1B30 ) ; __SetFormat( {|| \1A00()} )"},
{0,"SET","FORMAT TO \1A20&>","if ( Empty(\1A30) ) ; SET FORMAT TO ; else ; __SetFormat( &('{||' + \1A30 + '()}') ) ; end"},
{0,"SET","FORMAT TO","__SetFormat()"},
{0,"@","\1A00, \1B00 GET \1C00 [PICTURE \1D00] [VALID \1E00] [WHEN \1F00] [SEND \1G00]",
"SetPos( \1A00, \1B00 ) ; AAdd( GetList, _GET_( \1C00, \1C20, \1D00, \1E40, \1F40 ):display() ) [; ATail(GetList):\1G00]"},
{"@","\1A00, \1B00 SAY \1C00 [\1D10] GET \1E00 [\1F10]","@ \1A00, \1B00 SAY \1C00 [\1D00] ; @ Row(), Col()+1 GET \1E00 [\1F00]"},
{"@","\1A00, \1B00 GET \1C00 [\1D10] RANGE \1E00, \1F00 [\1G10]",
{0,"@","\1A00, \1B00 SAY \1C00 [\1D10] GET \1E00 [\1F10]","@ \1A00, \1B00 SAY \1C00 [\1D00] ; @ Row(), Col()+1 GET \1E00 [\1F00]"},
{0,"@","\1A00, \1B00 GET \1C00 [\1D10] RANGE \1E00, \1F00 [\1G10]",
"@ \1A00, \1B00 GET \1C00 [\1D00] VALID {|_1| RangeCheck(_1,, \1E00, \1F00)} [\1G00]"},
{"@","\1A00, \1B00 GET \1C00 [\1D10] COLOR \1E00 [\1F10]","@ \1A00, \1B00 GET \1C00 [\1D00] SEND colorDisp(\1E00) [\1F00]"},
{"READ","SAVE","ReadModal(GetList)"},
{"READ","","ReadModal(GetList) ; GetList := {}"},
{"CLEAR","GETS","ReadKill(.T.) ; GetList := {}"},
{"@","[\1A10] COLOUR [\1B10]","@ [\1A00] COLOR [\1B00]"},
{"SET","WRAP \1A20ON,OFF,&>","Set( _SET_WRAP, \1A30 )"},
{"SET","WRAP (\1A00)","Set( _SET_WRAP, \1A00 )"},
{"SET","MESSAGE TO \1A00 [\1B20 CENTER, CENTRE>]","Set( _SET_MESSAGE, \1A00 ) ; Set( _SET_MCENTER, \1B50 )"},
{"SET","MESSAGE TO","Set( _SET_MESSAGE, 0 ) ; Set( _SET_MCENTER, .f. )"},
{"@","\1A00, \1B00 PROMPT \1C00 [MESSAGE \1D00]","__AtPrompt( \1A00, \1B00, \1C00 , \1D00 )"},
{"MENU","TO \1A00","\1A00 := __MenuTo( {|_1| if(PCount() == 0, \1A00, \1A00 := _1)}, \1A10 )"},
{"SAVE","SCREEN","__XSaveScreen()"},
{"RESTORE","SCREEN","__XRestScreen()"},
{"SAVE","SCREEN TO \1A00","\1A00 := SaveScreen( 0, 0, Maxrow(), Maxcol() )"},
{"RESTORE","SCREEN FROM \1A00","RestScreen( 0, 0, Maxrow(), Maxcol(), \1A00 )"},
{"WAIT","[\1A00]","__Wait( \1A00 )"},
{"WAIT","[\1A00] TO \1B00","\1B00 := __Wait( \1A00 )"},
{"ACCEPT","[\1A00] TO \1B00","\1B00 := __Accept( \1A00 )"},
{"INPUT","[\1A00] TO \1B00", "if ( !Empty(__Accept(\1A00)) ) ; \1B00 := &( __AcceptStr() ) ; end"},
{"KEYBOARD","\1A00","__Keyboard( \1A00 )"},
{"CLEAR","TYPEAHEAD","__Keyboard()"},
{"SET","TYPEAHEAD TO \1A00","Set( _SET_TYPEAHEAD, \1A00 )"},
{"SET","KEY \1A00 TO \1B00","SetKey( \1A00, {|p, l, v| \1B00(p, l, v)} )"},
{"SET","KEY \1A00 TO \1B00 ( [\1C10] )","SET KEY \1A00 TO \1B00"},
{"SET","KEY \1A00 TO \1B20&>","if ( Empty(\1B30) ) ; SetKey( \1A00, NIL ) ; else ; SetKey( \1A00, {|p, l, v| \1B00(p, l, v)} ) ; end"},
{"SET","KEY \1A00 [TO]","SetKey( \1A00, NIL )"},
{"SET","FUNCTION \1A00 [TO] [\1B00]","__SetFunction( \1A00, \1B00 )"},
{"CLEAR","MEMORY","__MClear()"},
{"RELEASE","\1A10s","__MXRelease( \1A20 )"},
{"RELEASE","ALL","__MRelease('*', .t.)"},
{"RELEASE","ALL LIKE \1A00","__MRelease( \1A10, .t. )"},
{"RELEASE","ALL EXCEPT \1A00","__MRelease( \1A10, .f. )"},
{"RESTORE","[FROM \1A40] [\1B20 ADDITIVE>]","__MRestore( \1A30, \1B50 )"},
{"SAVE","ALL LIKE \1A00 TO \1B40","__MSave( \1B30, \1A30, .t. )"},
{"SAVE","TO \1A40 ALL LIKE \1B00","__MSave( \1A30, \1B30, .t. )"},
{"SAVE","ALL EXCEPT \1A00 TO \1B40","__MSave( \1B30, \1A30, .f. )"},
{"SAVE","TO \1A40 ALL EXCEPT \1B00","__MSave( \1A30, \1B30, .f. )"},
{"SAVE","[TO \1A40] [ALL]","__MSave( \1A30, '*', .t. )"},
{"ERASE","\1A40","FErase( \1A30 )"},
{"DELETE","FILE \1A40","FErase( \1A30 )"},
{"RENAME","\1A40 TO \1B40","FRename( \1A30, \1B30 )"},
{"COPY","FILE \1A40 TO \1B40","__CopyFile( \1A30, \1B30 )"},
{"DIR","[\1A40]","__Dir( \1A30 )"},
{"TYPE","\1A40 [\1B20 TO PRINTER>] [TO FILE \1C40]","__TypeFile( \1A30, \1B50 ) [; COPY FILE \1A30 TO \1C30 ]"},
{"TYPE","\1A40 [\1B20 TO PRINTER>]","__TypeFile( \1A30, \1B50 )"},
{"REQUEST","\1A10s","EXTERNAL \1A00"},
{"CANCEL","","__Quit()"},
{"QUIT","","__Quit()"},
{"RUN","\1A30","__Run( \1A10 )"},
{"RUN","( \1A00 )","__Run( \1A00 )"},
{"!","\1A30","RUN \1A00"},
{"RUN","= \1A00","( run := \1A00 )"},
{"RUN",":= \1A00","( run := \1A00 )"},
{"SET","EXCLUSIVE \1A20ON,OFF,&>","Set( _SET_EXCLUSIVE, \1A30 )"},
{"SET","EXCLUSIVE (\1A00)","Set( _SET_EXCLUSIVE, \1A00 )"},
{"SET","SOFTSEEK \1A20ON,OFF,&>","Set( _SET_SOFTSEEK, \1A30 )"},
{"SET","SOFTSEEK (\1A00)","Set( _SET_SOFTSEEK, \1A00 )"},
{"SET","UNIQUE \1A20ON,OFF,&>","Set( _SET_UNIQUE, \1A30 )"},
{"SET","UNIQUE (\1A00)","Set( _SET_UNIQUE, \1A00 )"},
{"SET","DELETED \1A20ON,OFF,&>","Set( _SET_DELETED, \1A30 )"},
{"SET","DELETED (\1A00)","Set( _SET_DELETED, \1A00 )"},
{"SELECT","\1A00","dbSelectArea( \1A30 )"},
{"SELECT","\1A00([\1B10])","dbSelectArea( \1A00(\1B00) )"},
{"USE","","dbCloseArea()"},
{"USE","\1A40 [VIA \1B00] [ALIAS \1C00] [\1D20 NEW>] [\1E20 EXCLUSIVE>] [\1F20 SHARED>] [\1G20 READONLY>] [INDEX \1H40 [, \1I40]]",
{0,"@","\1A00, \1B00 GET \1C00 [\1D10] COLOR \1E00 [\1F10]","@ \1A00, \1B00 GET \1C00 [\1D00] SEND colorDisp(\1E00) [\1F00]"},
{0,"READ","SAVE","ReadModal(GetList)"},
{0,"READ","","ReadModal(GetList) ; GetList := {}"},
{0,"CLEAR","GETS","ReadKill(.T.) ; GetList := {}"},
{0,"@","[\1A10] COLOUR [\1B10]","@ [\1A00] COLOR [\1B00]"},
{0,"SET","WRAP \1A20ON,OFF,&>","Set( _SET_WRAP, \1A30 )"},
{0,"SET","WRAP (\1A00)","Set( _SET_WRAP, \1A00 )"},
{0,"SET","MESSAGE TO \1A00 [\1B20 CENTER, CENTRE>]","Set( _SET_MESSAGE, \1A00 ) ; Set( _SET_MCENTER, \1B50 )"},
{0,"SET","MESSAGE TO","Set( _SET_MESSAGE, 0 ) ; Set( _SET_MCENTER, .f. )"},
{0,"@","\1A00, \1B00 PROMPT \1C00 [MESSAGE \1D00]","__AtPrompt( \1A00, \1B00, \1C00 , \1D00 )"},
{0,"MENU","TO \1A00","\1A00 := __MenuTo( {|_1| if(PCount() == 0, \1A00, \1A00 := _1)}, \1A10 )"},
{0,"SAVE","SCREEN","__XSaveScreen()"},
{0,"RESTORE","SCREEN","__XRestScreen()"},
{0,"SAVE","SCREEN TO \1A00","\1A00 := SaveScreen( 0, 0, Maxrow(), Maxcol() )"},
{0,"RESTORE","SCREEN FROM \1A00","RestScreen( 0, 0, Maxrow(), Maxcol(), \1A00 )"},
{0,"WAIT","[\1A00]","__Wait( \1A00 )"},
{0,"WAIT","[\1A00] TO \1B00","\1B00 := __Wait( \1A00 )"},
{0,"ACCEPT","[\1A00] TO \1B00","\1B00 := __Accept( \1A00 )"},
{0,"INPUT","[\1A00] TO \1B00", "if ( !Empty(__Accept(\1A00)) ) ; \1B00 := &( __AcceptStr() ) ; end"},
{0,"KEYBOARD","\1A00","__Keyboard( \1A00 )"},
{0,"CLEAR","TYPEAHEAD","__Keyboard()"},
{0,"SET","TYPEAHEAD TO \1A00","Set( _SET_TYPEAHEAD, \1A00 )"},
{0,"SET","KEY \1A00 TO \1B00","SetKey( \1A00, {|p, l, v| \1B00(p, l, v)} )"},
{0,"SET","KEY \1A00 TO \1B00 ( [\1C10] )","SET KEY \1A00 TO \1B00"},
{0,"SET","KEY \1A00 TO \1B20&>","if ( Empty(\1B30) ) ; SetKey( \1A00, NIL ) ; else ; SetKey( \1A00, {|p, l, v| \1B00(p, l, v)} ) ; end"},
{0,"SET","KEY \1A00 [TO]","SetKey( \1A00, NIL )"},
{0,"SET","FUNCTION \1A00 [TO] [\1B00]","__SetFunction( \1A00, \1B00 )"},
{0,"CLEAR","MEMORY","__MClear()"},
{0,"RELEASE","\1A10s","__MXRelease( \1A20 )"},
{0,"RELEASE","ALL","__MRelease('*', .t.)"},
{0,"RELEASE","ALL LIKE \1A00","__MRelease( \1A10, .t. )"},
{0,"RELEASE","ALL EXCEPT \1A00","__MRelease( \1A10, .f. )"},
{0,"RESTORE","[FROM \1A40] [\1B20 ADDITIVE>]","__MRestore( \1A30, \1B50 )"},
{0,"SAVE","ALL LIKE \1A00 TO \1B40","__MSave( \1B30, \1A30, .t. )"},
{0,"SAVE","TO \1A40 ALL LIKE \1B00","__MSave( \1A30, \1B30, .t. )"},
{0,"SAVE","ALL EXCEPT \1A00 TO \1B40","__MSave( \1B30, \1A30, .f. )"},
{0,"SAVE","TO \1A40 ALL EXCEPT \1B00","__MSave( \1A30, \1B30, .f. )"},
{0,"SAVE","[TO \1A40] [ALL]","__MSave( \1A30, '*', .t. )"},
{0,"ERASE","\1A40","FErase( \1A30 )"},
{0,"DELETE","FILE \1A40","FErase( \1A30 )"},
{0,"RENAME","\1A40 TO \1B40","FRename( \1A30, \1B30 )"},
{0,"COPY","FILE \1A40 TO \1B40","__CopyFile( \1A30, \1B30 )"},
{0,"DIR","[\1A40]","__Dir( \1A30 )"},
{0,"TYPE","\1A40 [\1B20 TO PRINTER>] [TO FILE \1C40]","__TypeFile( \1A30, \1B50 ) [; COPY FILE \1A30 TO \1C30 ]"},
{0,"TYPE","\1A40 [\1B20 TO PRINTER>]","__TypeFile( \1A30, \1B50 )"},
{0,"REQUEST","\1A10s","EXTERNAL \1A00"},
{0,"CANCEL","","__Quit()"},
{0,"QUIT","","__Quit()"},
{0,"RUN","\1A30","__Run( \1A10 )"},
{0,"RUN","( \1A00 )","__Run( \1A00 )"},
{0,"!","\1A30","RUN \1A00"},
{0,"RUN","= \1A00","( run := \1A00 )"},
{0,"RUN",":= \1A00","( run := \1A00 )"},
{0,"SET","EXCLUSIVE \1A20ON,OFF,&>","Set( _SET_EXCLUSIVE, \1A30 )"},
{0,"SET","EXCLUSIVE (\1A00)","Set( _SET_EXCLUSIVE, \1A00 )"},
{0,"SET","SOFTSEEK \1A20ON,OFF,&>","Set( _SET_SOFTSEEK, \1A30 )"},
{0,"SET","SOFTSEEK (\1A00)","Set( _SET_SOFTSEEK, \1A00 )"},
{0,"SET","UNIQUE \1A20ON,OFF,&>","Set( _SET_UNIQUE, \1A30 )"},
{0,"SET","UNIQUE (\1A00)","Set( _SET_UNIQUE, \1A00 )"},
{0,"SET","DELETED \1A20ON,OFF,&>","Set( _SET_DELETED, \1A30 )"},
{0,"SET","DELETED (\1A00)","Set( _SET_DELETED, \1A00 )"},
{0,"SELECT","\1A00","dbSelectArea( \1A30 )"},
{0,"SELECT","\1A00([\1B10])","dbSelectArea( \1A00(\1B00) )"},
{0,"USE","","dbCloseArea()"},
{0,"USE","\1A40 [VIA \1B00] [ALIAS \1C00] [\1D20 NEW>] [\1E20 EXCLUSIVE>] [\1F20 SHARED>] [\1G20 READONLY>] [INDEX \1H40 [, \1I40]]",
"dbUseArea( \1D50, \1B00, \1A30, \1C30, if(\1F50 .or. \1E50, !\1E50, NIL), \1G50 ) [; dbSetIndex( \1H30 )] [; dbSetIndex( \1I30 )]"},
{"APPEND","BLANK","dbAppend()"},
{"PACK","","__dbPack()"},
{"ZAP","","__dbZap()"},
{"UNLOCK","","dbUnlock()"},
{"UNLOCK","ALL","dbUnlockAll()"},
{"COMMIT","","dbCommitAll()"},
{"GOTO","\1A00","dbGoto(\1A00)"},
{"GO","\1A00","dbGoto(\1A00)"},
{"GOTO","TOP","dbGoTop()"},
{"GO","TOP","dbGoTop()"},
{"GOTO","BOTTOM","dbGoBottom()"},
{"GO","BOTTOM","dbGoBottom()"},
{"SKIP","","dbSkip(1)"},
{"SKIP","\1A00","dbSkip( \1A00 )"},
{"SKIP","ALIAS \1A00","\1A00 -> ( dbSkip(1) )"},
{"SKIP","\1A00 ALIAS \1B00","\1B00 -> ( dbSkip(\1A00) )"},
{"SEEK","\1A00 [\1B20 SOFTSEEK>]","dbSeek( \1A00, if( \1B50, .T., NIL ) )"},
{"FIND","\1A30","dbSeek( \1A30 )"},
{"FIND",":= \1A00","( find := \1A00 )"},
{"FIND","= \1A00","( find := \1A00 )"},
{"CONTINUE","","__dbContinue()"},
{"LOCATE","[FOR \1A00] [WHILE \1B00] [NEXT \1C00] [RECORD \1D00] [\1E20REST>] [ALL]",
{0,"APPEND","BLANK","dbAppend()"},
{0,"PACK","","__dbPack()"},
{0,"ZAP","","__dbZap()"},
{0,"UNLOCK","","dbUnlock()"},
{0,"UNLOCK","ALL","dbUnlockAll()"},
{0,"COMMIT","","dbCommitAll()"},
{0,"GOTO","\1A00","dbGoto(\1A00)"},
{0,"GO","\1A00","dbGoto(\1A00)"},
{0,"GOTO","TOP","dbGoTop()"},
{0,"GO","TOP","dbGoTop()"},
{0,"GOTO","BOTTOM","dbGoBottom()"},
{0,"GO","BOTTOM","dbGoBottom()"},
{0,"SKIP","","dbSkip(1)"},
{0,"SKIP","\1A00","dbSkip( \1A00 )"},
{0,"SKIP","ALIAS \1A00","\1A00 -> ( dbSkip(1) )"},
{0,"SKIP","\1A00 ALIAS \1B00","\1B00 -> ( dbSkip(\1A00) )"},
{0,"SEEK","\1A00 [\1B20 SOFTSEEK>]","dbSeek( \1A00, if( \1B50, .T., NIL ) )"},
{0,"FIND","\1A30","dbSeek( \1A30 )"},
{0,"FIND",":= \1A00","( find := \1A00 )"},
{0,"FIND","= \1A00","( find := \1A00 )"},
{0,"CONTINUE","","__dbContinue()"},
{0,"LOCATE","[FOR \1A00] [WHILE \1B00] [NEXT \1C00] [RECORD \1D00] [\1E20REST>] [ALL]",
"__dbLocate(\1A40,\1B40,\1C00,\1D00,\1E50)"},
{"SET","RELATION TO","dbClearRel()"},
{"SET","RELATION [\1A20ADDITIVE>] [TO \1B00 INTO \1C40 [, [TO] \1D00 INTO \1E40]]",
{0,"SET","RELATION TO","dbClearRel()"},
{0,"SET","RELATION [\1A20ADDITIVE>] [TO \1B00 INTO \1C40 [, [TO] \1D00 INTO \1E40]]",
"if ( !\1A50 ) ; dbClearRel() ; end ; dbSetRelation(\1C30,\1B40,\1B20) [; dbSetRelation(\1E30,\1D40,\1D20)]"},
{"SET","FILTER TO","dbClearFilter(NIL)"},
{"SET","FILTER TO \1A00","dbSetFilter( \1A40, \1A20 )"},
{"SET","FILTER TO \1A20&>","if ( Empty(\1A30) ) ; dbClearFilter() ; else ; dbSetFilter(\1A40,\1A30) ; end"},
{"REPLACE","[ \1A00 WITH \1B00 [, \1C00 WITH \1D00] ] [FOR \1E00] [WHILE \1F00] [NEXT \1G00] [RECORD \1H00] [\1I20REST>] [ALL]"},
{"DBEval( {|| _FIELD->\1A00 := \1B00 [,_FIELD->\1C00 := \1D00]},\1E40,\1F40,\1G00,\1H00,\1I50)"},
{"REPLACE","\1A00 WITH \1B00 [, \1C00 WITH \1D00 ]","_FIELD->\1A00 := \1B00 [; _FIELD->\1C00 := \1D00]"},
{"DELETE","[FOR \1A00] [WHILE \1B00] [NEXT \1C00] [RECORD \1D00] [\1E20REST>] [ALL]"},
{"DBEval( {|| dbDelete()}, \1A40, \1B40, \1C00, \1D00, \1E50 )"},
{"RECALL","[FOR \1A00] [WHILE \1B00] [NEXT \1C00] [RECORD \1D00] [\1E20REST>] [ALL]"},
{"DBEval( {|| dbRecall()}, \1A40, \1B40, \1C00, \1D00, \1E50 )"},
{"DELETE","","dbDelete()"},
{"RECALL","","dbRecall()"},
{"CREATE","\1A40 [FROM \1B40] [VIA \1C00] [ALIAS \1D00] [\1E20 NEW>]","__dbCreate( \1A30, \1B30, \1C00, \1E50, \1D30 )"},
{"COPY","[STRUCTURE] [EXTENDED] [TO \1A40]","__dbCopyXStruct( \1A30 )"},
{"COPY","[STRUCTURE] [TO \1A40] [FIELDS \1B10]","__dbCopyStruct( \1A30, { \1B30 } )"},
{"COPY","[TO \1A40] [DELIMITED [WITH \1B30]] [FIELDS \1C10] [FOR \1D00] [WHILE \1E00] [NEXT \1F00] [RECORD \1G00] [\1H20REST>] [ALL]",
{0,"SET","FILTER TO","dbClearFilter(NIL)"},
{0,"SET","FILTER TO \1A00","dbSetFilter( \1A40, \1A20 )"},
{0,"SET","FILTER TO \1A20&>","if ( Empty(\1A30) ) ; dbClearFilter() ; else ; dbSetFilter(\1A40,\1A30) ; end"},
{0,"REPLACE","[ \1A00 WITH \1B00 [, \1C00 WITH \1D00] ] [FOR \1E00] [WHILE \1F00] [NEXT \1G00] [RECORD \1H00] [\1I20REST>] [ALL]"},
{0,"DBEval( {|| _FIELD->\1A00 := \1B00 [,_FIELD->\1C00 := \1D00]},\1E40,\1F40,\1G00,\1H00,\1I50)"},
{0,"REPLACE","\1A00 WITH \1B00 [, \1C00 WITH \1D00 ]","_FIELD->\1A00 := \1B00 [; _FIELD->\1C00 := \1D00]"},
{0,"DELETE","[FOR \1A00] [WHILE \1B00] [NEXT \1C00] [RECORD \1D00] [\1E20REST>] [ALL]"},
{0,"DBEval( {|| dbDelete()}, \1A40, \1B40, \1C00, \1D00, \1E50 )"},
{0,"RECALL","[FOR \1A00] [WHILE \1B00] [NEXT \1C00] [RECORD \1D00] [\1E20REST>] [ALL]"},
{0,"DBEval( {|| dbRecall()}, \1A40, \1B40, \1C00, \1D00, \1E50 )"},
{0,"DELETE","","dbDelete()"},
{0,"RECALL","","dbRecall()"},
{0,"CREATE","\1A40 [FROM \1B40] [VIA \1C00] [ALIAS \1D00] [\1E20 NEW>]","__dbCreate( \1A30, \1B30, \1C00, \1E50, \1D30 )"},
{0,"COPY","[STRUCTURE] [EXTENDED] [TO \1A40]","__dbCopyXStruct( \1A30 )"},
{0,"COPY","[STRUCTURE] [TO \1A40] [FIELDS \1B10]","__dbCopyStruct( \1A30, { \1B30 } )"},
{0,"COPY","[TO \1A40] [DELIMITED [WITH \1B30]] [FIELDS \1C10] [FOR \1D00] [WHILE \1E00] [NEXT \1F00] [RECORD \1G00] [\1H20REST>] [ALL]",
"__dbDelim( .T., \1A30, \1B30, { \1C30 }, \1D40, \1E40, \1F00, \1G00, \1H50 )"},
{"COPY","[TO \1A40] [SDF] [FIELDS \1B10] [FOR \1C00] [WHILE \1D00] [NEXT \1E00] [RECORD \1F00] [\1G20REST>] [ALL]",
{0,"COPY","[TO \1A40] [SDF] [FIELDS \1B10] [FOR \1C00] [WHILE \1D00] [NEXT \1E00] [RECORD \1F00] [\1G20REST>] [ALL]",
"__dbSDF( .T., \1A30, { \1B30 }, \1C40, \1D40, \1E00, \1F00, \1G50 )"},
{"COPY","[TO \1A40] [FIELDS \1B10] [FOR \1C00] [WHILE \1D00] [NEXT \1E00] [RECORD \1F00] [\1G20REST>] [VIA \1H00] [ALL]",
{0,"COPY","[TO \1A40] [FIELDS \1B10] [FOR \1C00] [WHILE \1D00] [NEXT \1E00] [RECORD \1F00] [\1G20REST>] [VIA \1H00] [ALL]",
"__dbCopy( \1A30, { \1B30 }, \1C40, \1D40, \1E00, \1F00, \1G50, \1H00 )"},
{"APPEND","[FROM \1A40] [DELIMITED [WITH \1B30]] [FIELDS \1C10] [FOR \1D00] [WHILE \1E00] [NEXT \1F00] [RECORD \1G00] [\1H20REST>] [ALL]",
{0,"APPEND","[FROM \1A40] [DELIMITED [WITH \1B30]] [FIELDS \1C10] [FOR \1D00] [WHILE \1E00] [NEXT \1F00] [RECORD \1G00] [\1H20REST>] [ALL]",
"__dbDelim( .F., \1A30, \1B30, { \1C30 }, \1D40, \1E40, \1F00, \1G00, \1H50 )"},
{"APPEND","[FROM \1A40] [SDF] [FIELDS \1B10] [FOR \1C00] [WHILE \1D00] [NEXT \1E00] [RECORD \1F00] [\1G20REST>] [ALL]",
{0,"APPEND","[FROM \1A40] [SDF] [FIELDS \1B10] [FOR \1C00] [WHILE \1D00] [NEXT \1E00] [RECORD \1F00] [\1G20REST>] [ALL]",
"__dbSDF( .F., \1A30, { \1B30 }, \1C40, \1D40, \1E00, \1F00, \1G50 )"},
{"APPEND","[FROM \1A40] [FIELDS \1B10] [FOR \1C00] [WHILE \1D00] [NEXT \1E00] [RECORD \1F00] [\1G20REST>] [VIA \1H00] [ALL]",
{0,"APPEND","[FROM \1A40] [FIELDS \1B10] [FOR \1C00] [WHILE \1D00] [NEXT \1E00] [RECORD \1F00] [\1G20REST>] [VIA \1H00] [ALL]",
"__dbApp( \1A30, { \1B30 }, \1C40, \1D40, \1E00, \1F00, \1G50, \1H00 )"},
{"SORT","[TO \1A40] [ON \1B10] [FOR \1C00] [WHILE \1D00] [NEXT \1E00] [RECORD \1F00] [\1G20REST>] [ALL]",
{0,"SORT","[TO \1A40] [ON \1B10] [FOR \1C00] [WHILE \1D00] [NEXT \1E00] [RECORD \1F00] [\1G20REST>] [ALL]",
"__dbSort( \1A30, { \1B30 }, \1C40, \1D40, \1E00, \1F00, \1G50 )"},
{"TOTAL","[TO \1A40] [ON \1B00] [FIELDS \1C10] [FOR \1D00] [WHILE \1E00] [NEXT \1F00] [RECORD \1G00] [\1H20REST>] [ALL]",
{0,"TOTAL","[TO \1A40] [ON \1B00] [FIELDS \1C10] [FOR \1D00] [WHILE \1E00] [NEXT \1F00] [RECORD \1G00] [\1H20REST>] [ALL]",
"__dbTotal( \1A30, \1B40, { \1C30 }, \1D40, \1E40, \1F00, \1G00, \1H50 )"},
{"UPDATE","[FROM \1A40] [ON \1B00] [REPLACE \1C00 WITH \1D00 [, \1E00 WITH \1F00]] [\1G20RANDOM>]",
{0,"UPDATE","[FROM \1A40] [ON \1B00] [REPLACE \1C00 WITH \1D00 [, \1E00 WITH \1F00]] [\1G20RANDOM>]",
"__dbUpdate( \1A30, \1B40, \1G50, {|| _FIELD->\1C00 := \1D00 [, _FIELD->\1E00 := \1F00]} )"},
{"JOIN","[WITH \1A40] [TO \1B00] [FIELDS \1C10] [FOR \1D00]","__dbJoin( \1A30, \1B30, { \1C30 }, \1D40 )"},
{"COUNT","[TO \1A00] [FOR \1B00] [WHILE \1C00] [NEXT \1D00] [RECORD \1E00] [\1F20REST>] [ALL]",
{0,"JOIN","[WITH \1A40] [TO \1B00] [FIELDS \1C10] [FOR \1D00]","__dbJoin( \1A30, \1B30, { \1C30 }, \1D40 )"},
{0,"COUNT","[TO \1A00] [FOR \1B00] [WHILE \1C00] [NEXT \1D00] [RECORD \1E00] [\1F20REST>] [ALL]",
"\1A00 := 0 ; DBEval( {|| \1A00 := \1A00 + 1}, \1B40, \1C40, \1D00, \1E00, \1F50 )"},
{"SUM","[ \1A00 [, \1B00] TO \1C00 [, \1D00] ] [FOR \1E00] [WHILE \1F00] [NEXT \1G00] [RECORD \1H00] [\1I20REST>] [ALL]",
{0,"SUM","[ \1A00 [, \1B00] TO \1C00 [, \1D00] ] [FOR \1E00] [WHILE \1F00] [NEXT \1G00] [RECORD \1H00] [\1I20REST>] [ALL]",
"\1C00 := [ \1D00 := ] 0 ; DBEval( {|| \1C00 := \1C00 + \1A00 [, \1D00 := \1D00 + \1B00 ]}, \1E40, \1F40, \1G00, \1H00, \1I50 )"},
{"AVERAGE","[ \1A00 [, \1B00] TO \1C00 [, \1D00] ] [FOR \1E00] [WHILE \1F00] [NEXT \1G00] [RECORD \1H00] [\1I20REST>] [ALL]",
{0,"AVERAGE","[ \1A00 [, \1B00] TO \1C00 [, \1D00] ] [FOR \1E00] [WHILE \1F00] [NEXT \1G00] [RECORD \1H00] [\1I20REST>] [ALL]",
"M->__Avg := \1C00 := [ \1D00 := ] 0 ; DBEval( {|| M->__Avg := M->__Avg + 1, \1C00 := \1C00 + \1A00 [, \1D00 := \1D00 + \1B00] }, \1E40, \1F40, \1G00, \1H00, \1I50 ) ; \1C00 := \1C00 / M->__Avg [; \1D00 := \1D00 / M->__Avg ]"},
{"LIST","[\1A10] [\1B20OFF>] [\1C20 TO PRINTER>] [TO FILE \1D40] [FOR \1E00] [WHILE \1F00] [NEXT \1G00] [RECORD \1H00] [\1I20REST>] [ALL]",
{0,"LIST","[\1A10] [\1B20OFF>] [\1C20 TO PRINTER>] [TO FILE \1D40] [FOR \1E00] [WHILE \1F00] [NEXT \1G00] [RECORD \1H00] [\1I20REST>] [ALL]",
"__dbList( \1B50, { \1A40 }, .t., \1E40, \1F40, \1G00, \1H00, \1I50, \1C50, \1D30 )"},
{"DISPLAY","[\1A10] [\1B20OFF>] [\1C20 TO PRINTER>] [TO FILE \1D40] [FOR \1E00] [WHILE \1F00] [NEXT \1G00] [RECORD \1H00] [\1I20REST>] [\1J20ALL>]",
{0,"DISPLAY","[\1A10] [\1B20OFF>] [\1C20 TO PRINTER>] [TO FILE \1D40] [FOR \1E00] [WHILE \1F00] [NEXT \1G00] [RECORD \1H00] [\1I20REST>] [\1J20ALL>]",
"__DBList( \1B50, { \1A40 }, \1J50, \1E40, \1F40, \1G00, \1H00, \1I50, \1C50, \1D30 )"},
{"REPORT","FORM \1A00 [HEADING \1B00] [\1C20 PLAIN>] [\1D20 NOEJECT>] [\1E20 SUMMARY>] [\1F20 NOCONSOLE>] [\1G20 TO PRINTER>] [TO FILE \1H40] [FOR \1I00] [WHILE \1J00] [NEXT \1K00] [RECORD \1L00] [\1M20REST>] [ALL]",
{0,"REPORT","FORM \1A00 [HEADING \1B00] [\1C20 PLAIN>] [\1D20 NOEJECT>] [\1E20 SUMMARY>] [\1F20 NOCONSOLE>] [\1G20 TO PRINTER>] [TO FILE \1H40] [FOR \1I00] [WHILE \1J00] [NEXT \1K00] [RECORD \1L00] [\1M20REST>] [ALL]",
"__ReportForm( \1A30, \1G50, \1H30, \1F50, \1I40, \1J40, \1K00, \1L00, \1M50, \1C50, \1B00, \1D50, \1E50 )"},
{"LABEL","FORM \1A00 [\1B20 SAMPLE>] [\1C20 NOCONSOLE>] [\1D20 TO PRINTER>] [TO FILE \1E40] [FOR \1F00] [WHILE \1G00] [NEXT \1H00] [RECORD \1I00] [\1J20REST>] [ALL]",
{0,"LABEL","FORM \1A00 [\1B20 SAMPLE>] [\1C20 NOCONSOLE>] [\1D20 TO PRINTER>] [TO FILE \1E40] [FOR \1F00] [WHILE \1G00] [NEXT \1H00] [RECORD \1I00] [\1J20REST>] [ALL]",
"__LabelForm( \1A30, \1D50, \1E30, \1C50, \1F40, \1G40, \1H00, \1I00, \1J50, \1B50 )"},
{"CLOSE","\1A00","\1A00->( dbCloseArea() )"},
{"CLOSE","","dbCloseArea()"},
{"CLOSE","DATABASES","dbCloseAll()"},
{"CLOSE","ALTERNATE","Set(_SET_ALTFILE, "")"},
{"CLOSE","FORMAT","__SetFormat(NIL)"},
{"CLOSE","INDEXES","dbClearIndex()"},
{"CLOSE","PROCEDURE",NULL},
{"CLOSE","ALL","CLOSE DATABASES ; SELECT 1 ; CLOSE FORMAT"},
{"CLEAR","","CLEAR SCREEN ; CLEAR GETS"},
{"CLEAR","ALL","CLOSE DATABASES ; CLOSE FORMAT ; CLEAR MEMORY ; CLEAR GETS ; SET ALTERNATE OFF ; SET ALTERNATE TO"},
{"INDEX","ON \1A00 [TAG \1B40 ] TO \1C40 [FOR \1D00] [\1E20ALL>] [WHILE \1F00] [NEXT \1G00] [RECORD \1H00] [\1I20REST>] [EVAL \1J00] [EVERY \1K00] [\1L20 UNIQUE>] [\1M20 ASCENDING>] [\1N20 DESCENDING>]",
{0,"CLOSE","\1A00","\1A00->( dbCloseArea() )"},
{0,"CLOSE","","dbCloseArea()"},
{0,"CLOSE","DATABASES","dbCloseAll()"},
{0,"CLOSE","ALTERNATE","Set(_SET_ALTFILE, "")"},
{0,"CLOSE","FORMAT","__SetFormat(NIL)"},
{0,"CLOSE","INDEXES","dbClearIndex()"},
{0,"CLOSE","PROCEDURE",NULL},
{0,"CLOSE","ALL","CLOSE DATABASES ; SELECT 1 ; CLOSE FORMAT"},
{0,"CLEAR","","CLEAR SCREEN ; CLEAR GETS"},
{0,"CLEAR","ALL","CLOSE DATABASES ; CLOSE FORMAT ; CLEAR MEMORY ; CLEAR GETS ; SET ALTERNATE OFF ; SET ALTERNATE TO"},
{0,"INDEX","ON \1A00 [TAG \1B40 ] TO \1C40 [FOR \1D00] [\1E20ALL>] [WHILE \1F00] [NEXT \1G00] [RECORD \1H00] [\1I20REST>] [EVAL \1J00] [EVERY \1K00] [\1L20 UNIQUE>] [\1M20 ASCENDING>] [\1N20 DESCENDING>]",
"ordCondSet( \1D20, \1D40, [\1E50], \1F40, \1J40, \1K00, RECNO(), \1G00, \1H00, [\1I50], [\1N50] ) ; ordCreate(\1C30, \1B30, \1A20, \1A40, [\1L50] )"},
{"INDEX","ON \1A00 TAG \1B40 [TO \1C40] [FOR \1D00] [\1E20ALL>] [WHILE \1F00] [NEXT \1G00] [RECORD \1H00] [\1I20REST>] [EVAL \1J00] [EVERY \1K00] [\1L20 UNIQUE>] [\1M20 ASCENDING>] [\1N20 DESCENDING>]",
{0,"INDEX","ON \1A00 TAG \1B40 [TO \1C40] [FOR \1D00] [\1E20ALL>] [WHILE \1F00] [NEXT \1G00] [RECORD \1H00] [\1I20REST>] [EVAL \1J00] [EVERY \1K00] [\1L20 UNIQUE>] [\1M20 ASCENDING>] [\1N20 DESCENDING>]",
"ordCondSet( \1D20, \1D40, [\1E50], \1F40, \1J40, \1K00, RECNO(), \1G00, \1H00, [\1I50], [\1N50] ) ; ordCreate(\1C30, \1B30, \1A20, \1A40, [\1L50] )"},
{"INDEX","ON \1A00 TO \1B40 [\1C20 UNIQUE>]","dbCreateIndex( \1B30, \1A20, \1A40, if( \1C50, .t., NIL ) )"},
{"DELETE","TAG \1A40 [ IN \1B40 ] [, \1C40 [ IN \1D40 ] ]","ordDestroy( \1A30, \1B30 ) [; ordDestroy( \1C30, \1D30 ) ]"},
{"REINDEX","[EVAL \1A00] [EVERY \1B00]","ordCondSet(,,,, \1A40, \1B00,,,,,,,) ; ordListRebuild()"},
{"REINDEX","","ordListRebuild()"},
{"SET","INDEX TO [ \1A40 [, \1B40]] [\1C20 ADDITIVE>]",
{0,"INDEX","ON \1A00 TO \1B40 [\1C20 UNIQUE>]","dbCreateIndex( \1B30, \1A20, \1A40, if( \1C50, .t., NIL ) )"},
{0,"DELETE","TAG \1A40 [ IN \1B40 ] [, \1C40 [ IN \1D40 ] ]","ordDestroy( \1A30, \1B30 ) [; ordDestroy( \1C30, \1D30 ) ]"},
{0,"REINDEX","[EVAL \1A00] [EVERY \1B00]","ordCondSet(,,,, \1A40, \1B00,,,,,,,) ; ordListRebuild()"},
{0,"REINDEX","","ordListRebuild()"},
{0,"SET","INDEX TO [ \1A40 [, \1B40]] [\1C20 ADDITIVE>]",
"if !\1C50 ; ordListClear() ; end [; ordListAdd( \1A30 )] [; ordListAdd( \1B30 )]"},
{"SET","ORDER TO \1A00 [IN \1B40]","ordSetFocus( \1A00 [, \1B30] )"},
{"SET","ORDER TO TAG \1A40 [IN \1B40]","ordSetFocus( \1A30 [, \1B30] )"},
{"SET","ORDER TO","ordSetFocus(0)"}
{0,"SET","ORDER TO \1A00 [IN \1B40]","ordSetFocus( \1A00 [, \1B30] )"},
{0,"SET","ORDER TO TAG \1A40 [IN \1B40]","ordSetFocus( \1A30 [, \1B30] )"},
{0,"SET","ORDER TO","ordSetFocus(0)"}
};