19990824-03:50 GMT+1

This commit is contained in:
Viktor Szakats
1999-08-24 02:17:48 +00:00
parent 37145ef8c0
commit 72a71f0f44
11 changed files with 235 additions and 125 deletions

View File

@@ -1,3 +1,26 @@
19990824-03:50 GMT+1 Victor Szel <info@szelvesz.hu>
* tests/working/fileio.prg
+ Rewritten to check more functions in more situations, displaying all
return values, etc. (almost like RTL_TEST.PRG)
* source/compiler/harbour.y
+ Changed spaces to tabs in the generated code. This made the
generated code size almost 30% smaller, and the comments better aligned.
* source/compiler/harbour.l
include/hberrors.h
+ One yyerror() call converted to standard GenError().
* source/hbpp/hbppint.c
! 'W' sign changed to 'I' for preprocessor warning.
* config/dos/djgpp.cf
- -( -) removed.
* runner.b32
! Fixes by Luiz Rafael Culik <Culik@sl.conex.net> implemented.
* include/ctoharb.h
+ hb_vmRequest*() functions added.
* source/rtl/errorsys.prg
+ BREAK uncommented.
* include/filesys.h
* Some name standardization (fp -> p).
19990823-19:37 GMT+1 Antonio Linares <alinares@fivetech.com>
* source/rtl/tbrowse.prg
* Added Class TbColumn DATA ColorBlock support.

View File

@@ -24,7 +24,7 @@ LINKPATHS += $(foreach lib, $(LIBS), -L$(TOP)$(ROOT)source/$(lib)/$(ARCH))
else
LINKPATHS += -L$(HB_LIB_COMPILE)
endif
LINKLIBS += -Wl,-(
# LINKLIBS += -Wl,-(
LINKLIBS += $(foreach lib, $(LIBS), -l$(lib))
# If LIBS specifies the rdd library, add all DB drivers.
@@ -33,7 +33,7 @@ LINKPATHS += $(foreach drv, $(HB_DB_DRIVERS), -L$(TOP)$(ROOT)source/rdd/$(drv)/$
LINKLIBS += $(foreach drv, $(HB_DB_DRIVERS), -l$(drv))
endif
LINKLIBS += -Wl,-)
# LINKLIBS += -Wl,-)
LDFLAGS = $(LINKPATHS)
# Note: The empty line directly before 'endef' HAVE TO exist!

View File

@@ -32,6 +32,8 @@
/* Harbour virtual machine functions */
extern void hb_vmExecute( BYTE * pCode, PHB_SYMB pSymbols ); /* invokes the virtual machine */
extern void hb_vmProcessSymbols( PHB_SYMB pSymbols, WORD wSymbols ); /* statics symbols initialization */
extern void hb_vmRequestQuit( void );
extern void hb_vmRequestBreak( PHB_ITEM pItem );
/* PCode functions */
extern void hb_vmAnd( void ); /* performs the logical AND on the latest two values, removes them and leaves result on the stack */

View File

@@ -61,27 +61,27 @@ typedef struct
char * szExtension;
} HB_FNAME, * PHB_FNAME, * HB_FNAME_PTR;
extern BOOL hb_fsChDir ( BYTE * fpDirName );
extern BOOL hb_fsChDir ( BYTE * pDirName );
extern USHORT hb_fsChDrv ( BYTE * nDrive );
extern void hb_fsClose ( FHANDLE hFileHandle );
extern void hb_fsCommit ( FHANDLE hFileHandle );
extern FHANDLE hb_fsCreate ( BYTE * fpFilename, USHORT uiAttribute );
extern FHANDLE hb_fsCreate ( BYTE * pFilename, USHORT uiAttribute );
extern BYTE * hb_fsCurDir ( USHORT uiDrive );
extern BYTE hb_fsCurDrv ( void );
extern void hb_fsDelete ( BYTE * fpFilename );
extern void hb_fsDelete ( BYTE * pFilename );
extern USHORT hb_fsError ( void );
extern FHANDLE hb_fsExtOpen ( BYTE * fpFilename, BYTE * fpDefExt,
USHORT uiFlags, BYTE * fpPaths, PHB_ITEM pError );
extern FHANDLE hb_fsExtOpen ( BYTE * pFilename, BYTE * pDefExt,
USHORT uiFlags, BYTE * pPaths, PHB_ITEM pError );
extern USHORT hb_fsIsDrv ( BYTE nDrive );
extern BOOL hb_fsLock ( FHANDLE hFileHandle, ULONG ulStart,
ULONG ulLength, USHORT uiMode );
extern BOOL hb_fsMkDir ( BYTE * fpDirName );
extern FHANDLE hb_fsOpen ( BYTE * fpFilename, USHORT uiFlags );
extern USHORT hb_fsRead ( FHANDLE hFileHandle, BYTE * fpBuff, USHORT uiCount );
extern BOOL hb_fsRmDir ( BYTE * fpDirName );
extern void hb_fsRename ( BYTE * fpOldName, BYTE * fpNewName );
extern BOOL hb_fsMkDir ( BYTE * pDirName );
extern FHANDLE hb_fsOpen ( BYTE * pFilename, USHORT uiFlags );
extern USHORT hb_fsRead ( FHANDLE hFileHandle, BYTE * pBuff, USHORT uiCount );
extern BOOL hb_fsRmDir ( BYTE * pDirName );
extern void hb_fsRename ( BYTE * pOldName, BYTE * pNewName );
extern ULONG hb_fsSeek ( FHANDLE hFileHandle, LONG lOffset, USHORT uiMode );
extern USHORT hb_fsWrite ( FHANDLE hFileHandle, BYTE * fpBuff, USHORT uiCount );
extern USHORT hb_fsWrite ( FHANDLE hFileHandle, BYTE * pBuff, USHORT uiCount );
extern PHB_FNAME hb_fsFNameSplit ( char * szFilename ); /* Split given filename into path, name and extension */
extern char * hb_fsFNameMerge ( char * szFileName, PHB_FNAME pFileName ); /* This function joins path, name and extension into a string with a filename */

View File

@@ -64,6 +64,7 @@
#define ERR_INVALID_REFER 23
#define ERR_PARAMETERS_NOT_ALLOWED 24
#define ERR_EXIT_IN_SEQUENCE 25
#define ERR_UNTERM_ARRAY_INDEX 26
#define WARN_AMBIGUOUS_VAR 1
#define WARN_MEMVAR_ASSUMED 2

View File

@@ -7,7 +7,9 @@
.path.obj = obj;source\runner;source\runner\stdalone
.path.prg = source\runner\stdalone
PROJECT: runner.exe runner.lib
PROJECT: runner.lib runner.exe
runner.lib : runlib.obj
runlib.obj : runlib.c
@@ -15,7 +17,7 @@ runner.c : runner.prg
external.c : external.prg
.prg.c:
bin\harbour $< /n /osource\runner /iinclude /p
bin\harbour $< /n /osource\runner\stdalone /iinclude /p
.c.obj:
bcc32 -c -O2 -I.\include -v -o$@ -DHARBOUR_USE_GTAPI $<

View File

@@ -193,7 +193,7 @@ Separator {SpaceTab}
return LITERAL;
}
<INDEX>\n { yyerror( "Unterminated Array Index" ); exit(1); }
<INDEX>\n { GenError( _szCErrors, 'E', ERR_UNTERM_ARRAY_INDEX, NULL, NULL ); }
<INDEX>\[ { iIndexSets++; return yytext[ 0 ]; }

View File

@@ -2408,68 +2408,68 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
switch( pFunc->pCode[ lPCodePos ] )
{
case HB_P_AND:
fprintf( yyc, " HB_P_AND,\n" );
fprintf( yyc, "\t\tHB_P_AND,\n" );
lPCodePos++;
break;
case HB_P_ARRAYAT:
fprintf( yyc, " HB_P_ARRAYAT,\n" );
fprintf( yyc, "\t\tHB_P_ARRAYAT,\n" );
lPCodePos++;
break;
case HB_P_ARRAYPUT:
fprintf( yyc, " HB_P_ARRAYPUT,\n" );
fprintf( yyc, "\t\tHB_P_ARRAYPUT,\n" );
lPCodePos++;
break;
case HB_P_DEC:
fprintf( yyc, " HB_P_DEC,\n" );
fprintf( yyc, "\t\tHB_P_DEC,\n" );
lPCodePos++;
break;
case HB_P_DIMARRAY:
w = pFunc->pCode[ lPCodePos + 1 ] + pFunc->pCode[ lPCodePos + 2 ] * 256;
fprintf( yyc, " HB_P_DIMARRAY, %i, %i,\t/* %i */\n",
fprintf( yyc, "\t\tHB_P_DIMARRAY, %i, %i,\t/* %i */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ], w );
lPCodePos += 3;
break;
case HB_P_DIVIDE:
fprintf( yyc, " HB_P_DIVIDE,\n" );
fprintf( yyc, "\t\tHB_P_DIVIDE,\n" );
lPCodePos++;
break;
case HB_P_DO:
fprintf( yyc, " HB_P_DO, %i, %i,\n",
fprintf( yyc, "\t\tHB_P_DO, %i, %i,\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ] );
lPCodePos += 3;
break;
case HB_P_DUPLICATE:
fprintf( yyc, " HB_P_DUPLICATE,\n" );
fprintf( yyc, "\t\tHB_P_DUPLICATE,\n" );
lPCodePos++;
break;
case HB_P_DUPLTWO:
fprintf( yyc, " HB_P_DUPLTWO,\n" );
fprintf( yyc, "\t\tHB_P_DUPLTWO,\n" );
lPCodePos++;
break;
case HB_P_EQUAL:
fprintf( yyc, " HB_P_EQUAL,\n" );
fprintf( yyc, "\t\tHB_P_EQUAL,\n" );
lPCodePos++;
break;
case HB_P_EXACTLYEQUAL:
fprintf( yyc, " HB_P_EXACTLYEQUAL,\n" );
fprintf( yyc, "\t\tHB_P_EXACTLYEQUAL,\n" );
lPCodePos++;
break;
case HB_P_ENDBLOCK:
--iNestedCodeblock;
fprintf( yyc, " HB_P_ENDBLOCK,\n" );
fprintf( yyc, "\t\tHB_P_ENDBLOCK,\n" );
lPCodePos++;
break;
@@ -2478,20 +2478,20 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
if( lPCodePos == pFunc->lPCodePos )
{
bEndProcRequired =FALSE;
fprintf( yyc, " HB_P_ENDPROC\n" );
fprintf( yyc, "\t\tHB_P_ENDPROC\n" );
}
else
fprintf( yyc, " HB_P_ENDPROC,\n" );
fprintf( yyc, "\t\tHB_P_ENDPROC,\n" );
break;
case HB_P_FALSE:
fprintf( yyc, " HB_P_FALSE,\n" );
fprintf( yyc, "\t\tHB_P_FALSE,\n" );
lPCodePos++;
break;
case HB_P_FORTEST: /* ER For tests. Step > 0 LESS */
/* Step < 0 GREATER */
fprintf( yyc, " HB_P_FORTEST,\n" );
fprintf( yyc, "\t\tHB_P_FORTEST,\n" );
lPCodePos++;
break;
@@ -2507,7 +2507,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
}
if( bLocals || pFunc->wParamCount )
fprintf( yyc, " HB_P_FRAME, %i, %i,\t\t/* locals, params */\n",
fprintf( yyc, "\t\tHB_P_FRAME, %i, %i,\t/* locals, params */\n",
bLocals - pFunc->wParamCount,
pFunc->wParamCount );
lPCodePos += 3;
@@ -2515,12 +2515,12 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
break;
case HB_P_FUNCPTR:
fprintf( yyc, " HB_P_FUNCPTR,\n" );
fprintf( yyc, "\t\tHB_P_FUNCPTR,\n" );
lPCodePos++;
break;
case HB_P_FUNCTION:
fprintf( yyc, " HB_P_FUNCTION, %i, %i,\n",
fprintf( yyc, "\t\tHB_P_FUNCTION, %i, %i,\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ] );
lPCodePos += 3;
@@ -2528,29 +2528,29 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
case HB_P_GENARRAY:
w = pFunc->pCode[ lPCodePos + 1 ] + pFunc->pCode[ lPCodePos + 2 ] * 256;
fprintf( yyc, " HB_P_GENARRAY, %i, %i,\t/* %i */\n",
fprintf( yyc, "\t\tHB_P_GENARRAY, %i, %i,\t/* %i */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ], w );
lPCodePos += 3;
break;
case HB_P_GREATER:
fprintf( yyc, " HB_P_GREATER,\n" );
fprintf( yyc, "\t\tHB_P_GREATER,\n" );
lPCodePos++;
break;
case HB_P_GREATEREQUAL:
fprintf( yyc, " HB_P_GREATEREQUAL,\n" );
fprintf( yyc, "\t\tHB_P_GREATEREQUAL,\n" );
lPCodePos++;
break;
case HB_P_INC:
fprintf( yyc, " HB_P_INC,\n" );
fprintf( yyc, "\t\tHB_P_INC,\n" );
lPCodePos++;
break;
case HB_P_INSTRING:
fprintf( yyc, " HB_P_INSTRING,\n" );
fprintf( yyc, "\t\tHB_P_INSTRING,\n" );
lPCodePos++;
break;
@@ -2558,7 +2558,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
/*if( 1 ) (lPCodePos + 3) < pFunc->lPCodePos ) */
{
w = pFunc->pCode[ lPCodePos + 1 ] + pFunc->pCode[ lPCodePos + 2 ] * 256;
fprintf( yyc, " HB_P_JUMP, %i, %i,\t/* %i (abs: %05li) */\n",
fprintf( yyc, "\t\tHB_P_JUMP, %i, %i,\t/* %i (abs: %05li) */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ], w, lPCodePos + ( w ? w: 3 ) );
}
@@ -2567,7 +2567,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
case HB_P_JUMPFALSE:
w = pFunc->pCode[ lPCodePos + 1 ] + pFunc->pCode[ lPCodePos + 2 ] * 256;
fprintf( yyc, " HB_P_JUMPFALSE, %i, %i,\t/* %i (abs: %05li) */\n",
fprintf( yyc, "\t\tHB_P_JUMPFALSE, %i, %i,\t/* %i (abs: %05li) */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ], w, lPCodePos + ( w ? w: 3 ) );
lPCodePos += 3;
@@ -2575,19 +2575,19 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
case HB_P_JUMPTRUE:
w = pFunc->pCode[ lPCodePos + 1 ] + pFunc->pCode[ lPCodePos + 2 ] * 256;
fprintf( yyc, " HB_P_JUMPTRUE, %i, %i,\t/* %i (abs: %05li) */\n",
fprintf( yyc, "\t\tHB_P_JUMPTRUE, %i, %i,\t/* %i (abs: %05li) */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ], w, lPCodePos + ( w ? w: 3 ) );
lPCodePos += 3;
break;
case HB_P_LESS:
fprintf( yyc, " HB_P_LESS,\n" );
fprintf( yyc, "\t\tHB_P_LESS,\n" );
lPCodePos++;
break;
case HB_P_LESSEQUAL:
fprintf( yyc, " HB_P_LESSEQUAL,\n" );
fprintf( yyc, "\t\tHB_P_LESSEQUAL,\n" );
lPCodePos++;
break;
@@ -2601,7 +2601,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
break;
case HB_P_LOCALNAME:
fprintf( yyc, " HB_P_LOCALNAME, %i, %i,\t/* %s */\n",
fprintf( yyc, "\t\tHB_P_LOCALNAME, %i, %i,\t/* %s */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ],
( char * ) pFunc->pCode + lPCodePos + 3 );
@@ -2624,7 +2624,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
wSym = pFunc->pCode[ lPCodePos + 1 ] + pFunc->pCode[ lPCodePos + 2 ] * 256;
wFixPos =FixSymbolPos( wSym );
fprintf( yyc, " HB_P_MESSAGE, %i, %i, /* %s */\n",
fprintf( yyc, "\t\tHB_P_MESSAGE, %i, %i,\t/* %s */\n",
LOBYTE( wFixPos ),
HIBYTE( wFixPos ),
GetSymbolOrd( wSym )->szName );
@@ -2633,12 +2633,12 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
break;
case HB_P_MINUS:
fprintf( yyc, " HB_P_MINUS,\n" );
fprintf( yyc, "\t\tHB_P_MINUS,\n" );
lPCodePos++;
break;
case HB_P_MODULENAME:
fprintf( yyc, " HB_P_MODULENAME, /* %s */\n",
fprintf( yyc, "\t\tHB_P_MODULENAME,\t/* %s */\n",
( char * ) pFunc->pCode + lPCodePos++ + 1 );
while( pFunc->pCode[ lPCodePos ] )
{
@@ -2653,32 +2653,32 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
break;
case HB_P_MODULUS:
fprintf( yyc, " HB_P_MODULUS,\n" );
fprintf( yyc, "\t\tHB_P_MODULUS,\n" );
lPCodePos++;
break;
case HB_P_MULT:
fprintf( yyc, " HB_P_MULT,\n" );
fprintf( yyc, "\t\tHB_P_MULT,\n" );
lPCodePos++;
break;
case HB_P_NEGATE:
fprintf( yyc, " HB_P_NEGATE,\n" );
fprintf( yyc, "\t\tHB_P_NEGATE,\n" );
lPCodePos++;
break;
case HB_P_NOT:
fprintf( yyc, " HB_P_NOT,\n" );
fprintf( yyc, "\t\tHB_P_NOT,\n" );
lPCodePos++;
break;
case HB_P_NOTEQUAL:
fprintf( yyc, " HB_P_NOTEQUAL,\n" );
fprintf( yyc, "\t\tHB_P_NOTEQUAL,\n" );
lPCodePos++;
break;
case HB_P_OR:
fprintf( yyc, " HB_P_OR,\n" );
fprintf( yyc, "\t\tHB_P_OR,\n" );
lPCodePos++;
break;
@@ -2688,7 +2688,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
wVar = pFunc->pCode[ lPCodePos + 1 ] + pFunc->pCode[ lPCodePos + 2 ] * 256;
wFixPos =FixSymbolPos( wVar );
fprintf( yyc, " HB_P_PARAMETER, %i, %i, %i,\t/* %s */\n",
fprintf( yyc, "\t\tHB_P_PARAMETER, %i, %i, %i,\t/* %s */\n",
LOBYTE( wFixPos ),
HIBYTE( wFixPos ),
pFunc->pCode[ lPCodePos + 3 ],
@@ -2698,17 +2698,17 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
break;
case HB_P_PLUS:
fprintf( yyc, " HB_P_PLUS,\n" );
fprintf( yyc, "\t\tHB_P_PLUS,\n" );
lPCodePos++;
break;
case HB_P_POP:
fprintf( yyc, " HB_P_POP,\n" );
fprintf( yyc, "\t\tHB_P_POP,\n" );
lPCodePos++;
break;
case HB_P_POPALIAS:
fprintf( yyc, " HB_P_POPALIAS,\n" );
fprintf( yyc, "\t\tHB_P_POPALIAS,\n" );
lPCodePos++;
break;
@@ -2718,7 +2718,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
wVar = pFunc->pCode[ lPCodePos + 1 ] + pFunc->pCode[ lPCodePos + 2 ] * 256;
wFixPos =FixSymbolPos( wVar );
fprintf( yyc, " HB_P_POPALIASEDFIELD, %i, %i,\t/* %s */\n",
fprintf( yyc, "\t\tHB_P_POPALIASEDFIELD, %i, %i,\t/* %s */\n",
LOBYTE( wFixPos ),
HIBYTE( wFixPos ),
GetSymbolOrd( wVar )->szName );
@@ -2732,7 +2732,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
wVar = pFunc->pCode[ lPCodePos + 1 ] + pFunc->pCode[ lPCodePos + 2 ] * 256;
wFixPos =FixSymbolPos( wVar );
fprintf( yyc, " HB_P_POPFIELD, %i, %i,\t/* %s */\n",
fprintf( yyc, "\t\tHB_P_POPFIELD, %i, %i,\t/* %s */\n",
LOBYTE( wFixPos ),
HIBYTE( wFixPos ),
GetSymbolOrd( wVar )->szName );
@@ -2751,18 +2751,18 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
/* we are accesing variables within a codeblock */
/* the names of codeblock variable are lost */
if( wVar < 0 )
fprintf( yyc, " HB_P_POPLOCAL, %i, %i,\t/* localvar%i */\n",
fprintf( yyc, "\t\tHB_P_POPLOCAL, %i, %i,\t/* localvar%i */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ],
-wVar );
else
fprintf( yyc, " HB_P_POPLOCAL, %i, %i,\t/* codeblockvar%i */\n",
fprintf( yyc, "\t\tHB_P_POPLOCAL, %i, %i,\t/* codeblockvar%i */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ],
wVar );
}
else
fprintf( yyc, " HB_P_POPLOCAL, %i, %i,\t/* %s */\n",
fprintf( yyc, "\t\tHB_P_POPLOCAL, %i, %i,\t/* %s */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ],
GetVar( pFunc->pLocals, wVar )->szName );
@@ -2776,7 +2776,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
wVar = pFunc->pCode[ lPCodePos + 1 ] + pFunc->pCode[ lPCodePos + 2 ] * 256;
wFixPos =FixSymbolPos( wVar );
fprintf( yyc, " HB_P_POPMEMVAR, %i, %i,\t/* %s */\n",
fprintf( yyc, "\t\tHB_P_POPMEMVAR, %i, %i,\t/* %s */\n",
LOBYTE( wFixPos ),
HIBYTE( wFixPos ),
GetSymbolOrd( wVar )->szName );
@@ -2793,7 +2793,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
while( pTmp->pNext && pTmp->pNext->wStaticsBase < wVar )
pTmp =pTmp->pNext;
pVar = GetVar( pTmp->pStatics, wVar - pTmp->wStaticsBase );
fprintf( yyc, " HB_P_POPSTATIC, %i, %i,\t/* %s */\n",
fprintf( yyc, "\t\tHB_P_POPSTATIC, %i, %i,\t/* %s */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ],
pVar->szName );
@@ -2802,12 +2802,12 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
break;
case HB_P_POWER:
fprintf( yyc, " HB_P_POWER,\n" );
fprintf( yyc, "\t\tHB_P_POWER,\n" );
lPCodePos++;
break;
case HB_P_PUSHALIAS:
fprintf( yyc, " HB_P_PUSHALIAS,\n" );
fprintf( yyc, "\t\tHB_P_PUSHALIAS,\n" );
lPCodePos++;
break;
@@ -2818,7 +2818,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
wVar = pFunc->pCode[ lPCodePos + 1 ] +
pFunc->pCode[ lPCodePos + 2 ] * 256;
wFixPos =FixSymbolPos( wVar );
fprintf( yyc, " HB_P_PUSHALIASEDFIELD, %i, %i,\t/* %s */\n",
fprintf( yyc, "\t\tHB_P_PUSHALIASEDFIELD, %i, %i,\t/* %s */\n",
LOBYTE( wFixPos ),
HIBYTE( wFixPos ),
GetSymbolOrd( wVar )->szName );
@@ -2828,17 +2828,17 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
case HB_P_PUSHBLOCK:
++iNestedCodeblock;
fprintf( yyc, " HB_P_PUSHBLOCK, %i, %i,\t/* %i */\n",
fprintf( yyc, "\t\tHB_P_PUSHBLOCK, %i, %i,\t/* %i */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ],
pFunc->pCode[ lPCodePos + 1 ] +
pFunc->pCode[ lPCodePos + 2 ] * 256 );
w = * ( ( WORD *) &( pFunc->pCode [ lPCodePos + 3 ] ) );
fprintf( yyc, " %i, %i, \t/* number of local parameters (%i) */\n",
fprintf( yyc, "\t\t%i, %i,\t/* number of local parameters (%i) */\n",
pFunc->pCode[ lPCodePos + 3 ],
pFunc->pCode[ lPCodePos + 4 ], w );
wVar = * ( ( WORD *) &( pFunc->pCode [ lPCodePos + 5 ] ) );
fprintf( yyc, " %i, %i, \t/* number of local variables (%i) */\n",
fprintf( yyc, "\t\t%i, %i,\t/* number of local variables (%i) */\n",
pFunc->pCode[ lPCodePos + 5 ],
pFunc->pCode[ lPCodePos + 6 ], wVar );
lPCodePos += 7; /* codeblock size + number of parameters + number of local variables */
@@ -2846,7 +2846,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
while( wVar-- )
{
w = * ( ( WORD *) &( pFunc->pCode [ lPCodePos ] ) );
fprintf( yyc, " %i, %i, \t/* %s */\n",
fprintf( yyc, "\t\t%i, %i,\t/* %s */\n",
pFunc->pCode[ lPCodePos ],
pFunc->pCode[ lPCodePos + 1 ],
GetVar( pFunc->pLocals, w )->szName );
@@ -2858,10 +2858,10 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
{
int i;
++lPCodePos;
fprintf( yyc, " HB_P_PUSHDOUBLE, " );
fprintf( yyc, "\t\tHB_P_PUSHDOUBLE, " );
for( i = 0; i < sizeof( double ) + sizeof( BYTE ); ++i )
fprintf( yyc, "%i, ", ( ( BYTE * ) pFunc->pCode )[ lPCodePos + i ] );
fprintf( yyc, "/* %.*f, %d */\n",
fprintf( yyc, "%i,", ( ( BYTE * ) pFunc->pCode )[ lPCodePos + i ] );
fprintf( yyc, "\t/* %.*f, %d */\n",
*( ( BYTE * ) &( pFunc->pCode[ lPCodePos + sizeof( double ) ] ) ),
*( ( double * ) &( pFunc->pCode[ lPCodePos ] ) ),
*( ( BYTE * ) &( pFunc->pCode[ lPCodePos + sizeof( double ) ] ) ) );
@@ -2876,7 +2876,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
wVar = pFunc->pCode[ lPCodePos + 1 ] +
pFunc->pCode[ lPCodePos + 2 ] * 256;
wFixPos =FixSymbolPos( wVar );
fprintf( yyc, " HB_P_PUSHFIELD, %i, %i,\t/* %s */\n",
fprintf( yyc, "\t\tHB_P_PUSHFIELD, %i, %i,\t/* %s */\n",
LOBYTE( wFixPos ),
HIBYTE( wFixPos ),
GetSymbolOrd( wVar )->szName );
@@ -2885,7 +2885,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
break;
case HB_P_PUSHINT:
fprintf( yyc, " HB_P_PUSHINT, %i, %i, /* %i */\n",
fprintf( yyc, "\t\tHB_P_PUSHINT, %i, %i,\t/* %i */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ],
pFunc->pCode[ lPCodePos + 1 ] +
@@ -2904,18 +2904,18 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
/* we are accesing variables within a codeblock */
/* the names of codeblock variable are lost */
if( wVar < 0 )
fprintf( yyc, " HB_P_PUSHLOCAL, %i, %i,\t/* localvar%i */\n",
fprintf( yyc, "\t\tHB_P_PUSHLOCAL, %i, %i,\t/* localvar%i */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ],
-wVar );
else
fprintf( yyc, " HB_P_PUSHLOCAL, %i, %i,\t/* codeblockvar%i */\n",
fprintf( yyc, "\t\tHB_P_PUSHLOCAL, %i, %i,\t/* codeblockvar%i */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ],
wVar );
}
else
fprintf( yyc, " HB_P_PUSHLOCAL, %i, %i,\t/* %s */\n",
fprintf( yyc, "\t\tHB_P_PUSHLOCAL, %i, %i,\t/* %s */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ],
GetVar( pFunc->pLocals, wVar )->szName );
@@ -2934,18 +2934,18 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
/* we are accesing variables within a codeblock */
/* the names of codeblock variable are lost */
if( wVar < 0 )
fprintf( yyc, " HB_P_PUSHLOCALREF, %i, %i,\t/* localvar%i */\n",
fprintf( yyc, "\t\tHB_P_PUSHLOCALREF, %i, %i,\t/* localvar%i */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ],
-wVar );
else
fprintf( yyc, " HB_P_PUSHLOCALREF, %i, %i,\t/* codeblockvar%i */\n",
fprintf( yyc, "\t\tHB_P_PUSHLOCALREF, %i, %i,\t/* codeblockvar%i */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ],
wVar );
}
else
fprintf( yyc, " HB_P_PUSHLOCALREF, %i, %i,\t/* %s */\n",
fprintf( yyc, "\t\tHB_P_PUSHLOCALREF, %i, %i,\t/* %s */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ],
GetVar( pFunc->pLocals, wVar )->szName );
@@ -2954,7 +2954,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
break;
case HB_P_PUSHLONG:
fprintf( yyc, " HB_P_PUSHLONG, %i, %i, %i, %i, /* %li */\n",
fprintf( yyc, "\t\tHB_P_PUSHLONG, %i, %i, %i, %i,\t/* %li */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ],
pFunc->pCode[ lPCodePos + 3 ],
@@ -2970,7 +2970,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
wVar = pFunc->pCode[ lPCodePos + 1 ] +
pFunc->pCode[ lPCodePos + 2 ] * 256;
wFixPos =FixSymbolPos( wVar );
fprintf( yyc, " HB_P_PUSHMEMVAR, %i, %i,\t/* %s */\n",
fprintf( yyc, "\t\tHB_P_PUSHMEMVAR, %i, %i,\t/* %s */\n",
LOBYTE( wFixPos ),
HIBYTE( wFixPos ),
GetSymbolOrd( wVar )->szName );
@@ -2985,7 +2985,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
wVar = pFunc->pCode[ lPCodePos + 1 ] +
pFunc->pCode[ lPCodePos + 2 ] * 256;
wFixPos =FixSymbolPos( wVar );
fprintf( yyc, " HB_P_PUSHMEMVARREF, %i, %i,\t/* %s */\n",
fprintf( yyc, "\t\tHB_P_PUSHMEMVARREF, %i, %i,\t/* %s */\n",
LOBYTE( wFixPos ),
HIBYTE( wFixPos ),
GetSymbolOrd( wVar )->szName );
@@ -2994,12 +2994,12 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
break;
case HB_P_PUSHNIL:
fprintf( yyc, " HB_P_PUSHNIL,\n" );
fprintf( yyc, "\t\tHB_P_PUSHNIL,\n" );
lPCodePos++;
break;
case HB_P_PUSHSELF:
fprintf( yyc, " HB_P_PUSHSELF,\n" );
fprintf( yyc, "\t\tHB_P_PUSHSELF,\n" );
lPCodePos++;
break;
@@ -3012,7 +3012,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
while( pTmp->pNext && pTmp->pNext->wStaticsBase < wVar )
pTmp =pTmp->pNext;
pVar = GetVar( pTmp->pStatics, wVar - pTmp->wStaticsBase );
fprintf( yyc, " HB_P_PUSHSTATIC, %i, %i,\t/* %s */\n",
fprintf( yyc, "\t\tHB_P_PUSHSTATIC, %i, %i,\t/* %s */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ],
pVar->szName );
@@ -3029,7 +3029,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
while( pTmp->pNext && pTmp->pNext->wStaticsBase < wVar )
pTmp =pTmp->pNext;
pVar = GetVar( pTmp->pStatics, wVar - pTmp->wStaticsBase );
fprintf( yyc, " HB_P_PUSHSTATICREF, %i, %i,\t/* %s */\n",
fprintf( yyc, "\t\tHB_P_PUSHSTATICREF, %i, %i,\t/* %s */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ],
pVar->szName );
@@ -3040,7 +3040,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
case HB_P_PUSHSTR:
wLen = pFunc->pCode[ lPCodePos + 1 ] +
pFunc->pCode[ lPCodePos + 2 ] * 256;
fprintf( yyc, " HB_P_PUSHSTR, %i, %i, /* %i */\n",
fprintf( yyc, "\t\tHB_P_PUSHSTR, %i, %i,\t/* %i */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ], wLen );
lPCodePos +=3;
@@ -3062,7 +3062,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
wSym = pFunc->pCode[ lPCodePos + 1 ] +
pFunc->pCode[ lPCodePos + 2 ] * 256;
wFixPos =FixSymbolPos( wSym );
fprintf( yyc, " HB_P_PUSHSYM, %i, %i, /* %s */\n",
fprintf( yyc, "\t\tHB_P_PUSHSYM, %i, %i,\t/* %s */\n",
LOBYTE( wFixPos ),
HIBYTE( wFixPos ),
GetSymbolOrd( wSym )->szName );
@@ -3071,13 +3071,13 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
break;
case HB_P_RETVALUE:
fprintf( yyc, " HB_P_RETVALUE,\n" );
fprintf( yyc, "\t\tHB_P_RETVALUE,\n" );
lPCodePos++;
break;
case HB_P_SEQBEGIN:
w = pFunc->pCode[ lPCodePos + 1 ] + pFunc->pCode[ lPCodePos + 2 ] * 256;
fprintf( yyc, " HB_P_SEQBEGIN, %i, %i,\t/* %i (abs: %05li) */\n",
fprintf( yyc, "\t\tHB_P_SEQBEGIN, %i, %i,\t/* %i (abs: %05li) */\n",
pFunc->pCode[ lPCodePos + 1 ],
pFunc->pCode[ lPCodePos + 2 ], w, lPCodePos + ( w ? w: 3 ) );
lPCodePos += 3;
@@ -3093,7 +3093,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
break;
case HB_P_SEQRECOVER:
fprintf( yyc, " HB_P_SEQRECOVER,\n" );
fprintf( yyc, "\t\tHB_P_SEQRECOVER,\n" );
lPCodePos++;
break;
@@ -3103,7 +3103,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
{
GetSymbol( _pInitFunc->szName, &w );
w = FixSymbolPos( w );
fprintf( yyc, " HB_P_SFRAME, %i, %i,\t\t/* symbol (_INITSTATICS) */\n",
fprintf( yyc, "\t\tHB_P_SFRAME, %i, %i,\t/* symbol (_INITSTATICS) */\n",
LOBYTE( w ), HIBYTE( w ) );
}
lPCodePos += 3;
@@ -3113,24 +3113,24 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
{
GetSymbol( _pInitFunc->szName, &w );
w = FixSymbolPos( w );
fprintf( yyc, " HB_P_STATICS, %i, %i,\t\t/* symbol (_INITSTATICS) */\n",
fprintf( yyc, "\t\tHB_P_STATICS, %i, %i,\t/* symbol (_INITSTATICS) */\n",
LOBYTE( w ), HIBYTE( w ) );
lPCodePos += 3;
}
break;
case HB_P_SWAPALIAS:
fprintf( yyc, " HB_P_SWAPALIAS,\n" );
fprintf( yyc, "\t\tHB_P_SWAPALIAS,\n" );
lPCodePos++;
break;
case HB_P_TRUE:
fprintf( yyc, " HB_P_TRUE,\n" );
fprintf( yyc, "\t\tHB_P_TRUE,\n" );
lPCodePos++;
break;
case HB_P_ZERO:
fprintf( yyc, " HB_P_ZERO,\n" );
fprintf( yyc, "\t\tHB_P_ZERO,\n" );
lPCodePos++;
break;

View File

@@ -159,7 +159,7 @@ int Hp_Parse( FILE* handl_i, FILE* handl_o )
*sLine = '\0';
}
else
GenWarning( _szPWarnings, 'W', WARN_NONDIRECTIVE, NULL, NULL );
GenWarning( _szPWarnings, 'I', WARN_NONDIRECTIVE, NULL, NULL );
}
}
}

View File

@@ -26,8 +26,8 @@
#include "error.ch"
#define ISCHAR(var) (ValType(var) == "C")
#define ISNUM(var) (ValType(var) == "N")
#define ISCHAR( var ) ( ValType(var) == "C" )
#define ISNUM( var ) ( ValType(var) == "N" )
//----------------------------------------------------------------------------//
@@ -50,21 +50,21 @@ static function DefError( oError )
LOCAL cInfo := ""
LOCAL n := 2
cMessage := ErrorMessage(oError)
cMessage := ErrorMessage( oError )
// Build buttons
aOptions := {}
// aAdd(aOptions, "Break" )
aAdd(aOptions, "Quit" )
// aAdd( aOptions, "Break" )
aAdd( aOptions, "Quit" )
IF oError:canRetry
aAdd(aOptions, "Retry")
aAdd( aOptions, "Retry" )
ENDIF
IF oError:canDefault
aAdd(aOptions, "Default")
aAdd( aOptions, "Default" )
ENDIF
// Show alert box
@@ -75,14 +75,14 @@ static function DefError( oError )
IF Empty( oError:osCode )
nChoice := Alert( cMessage, aOptions )
ELSE
nChoice := Alert( cMessage + ";(DOS Error " + LTrim(Str(oError:osCode)) + ")", aOptions)
nChoice := Alert( cMessage + ";(DOS Error " + LTrim( Str( oError:osCode ) ) + ")", aOptions)
ENDIF
ENDDO
DO CASE
CASE aOptions[ nChoice ] == "Break"
// Break(oError)
Break( oError )
CASE aOptions[ nChoice ] == "Retry"
RETURN .T.
CASE aOptions[ nChoice ] == "Default"
@@ -91,8 +91,8 @@ static function DefError( oError )
// "Quit" selected
IF !Empty(oError:osCode)
cMessage += " (DOS Error " + LTrim(Str(oError:osCode)) + ")"
IF ! Empty( oError:osCode )
cMessage += " (DOS Error " + LTrim( Str( oError:osCode ) ) + ")"
ENDIF
QOut( cMessage )
@@ -123,29 +123,29 @@ STATIC FUNCTION ErrorMessage(oError)
cMessage := iif( oError:severity > ES_WARNING, "Error", "Warning" ) + " "
// add subsystem name if available
IF ISCHAR(oError:subsystem)
IF ISCHAR( oError:subsystem )
cMessage += oError:subsystem()
ELSE
cMessage += "???"
ENDIF
// add subsystem's error code if available
IF ISNUM(oError:subCode)
cMessage += "/" + LTrim(Str(oError:subCode))
IF ISNUM( oError:subCode )
cMessage += "/" + LTrim( Str( oError:subCode ) )
ELSE
cMessage += "/???"
ENDIF
// add error description if available
IF ISCHAR(oError:description)
IF ISCHAR( oError:description )
cMessage += " " + oError:description
ENDIF
// add either filename or operation
DO CASE
CASE !Empty(oError:filename)
CASE !Empty( oError:filename )
cMessage += ": " + oError:filename
CASE !Empty(oError:operation)
CASE !Empty( oError:operation )
cMessage += ": " + oError:operation
ENDCASE

View File

@@ -2,14 +2,96 @@
// $Id$
//
// Testing Harbour file io features
// Written by Victor Szel <info@szelvesz.hu>
// www - http://www.harbour-project.org
//
// Placed in the public domain
function Main()
#include "fileio.ch"
local h := FCreate( "test.txt" )
FUNCTION Main()
LOCAL cFileName := "TEST.TXT"
LOCAL nFlags
FWrite( h, "This is a test" )
LOCAL cBuffer
LOCAL fhnd
FClose( h )
OutSpec("FCreate( cFileName, nFlags )" , fhnd := FCreate( cFileName, nFlags ) )
OutSpec("FWrite( fhnd, '>1234567890<' )" , FWrite( fhnd, ">1234567890<" ) )
OutSpec("FWrite( fhnd, '(123.4567890)' )", FWrite( fhnd, "(123" + Chr(0) + "4567890)" ) )
OutSpec("FSeek( fhnd )" , FSeek( fhnd ) )
OutSpec("FSeek( fhnd, 5 )" , FSeek( fhnd, 5 ) )
OutSpec("FSeek( fhnd, -1, FS_SET )" , FSeek( fhnd, -1, FS_SET ) )
OutSpec("FSeek( fhnd, -10, FS_SET )" , FSeek( fhnd, -10, FS_SET ) )
OutSpec("FSeek( fhnd, -100, FS_SET )" , FSeek( fhnd, -100, FS_SET ) )
OutSpec("FWrite( fhnd, '!' )" , FWrite( fhnd, "!" ) )
OutSpec("FSeek( fhnd, 1 )" , FSeek( fhnd, 1 ) )
OutSpec("FWrite( fhnd, 'A' )" , FWrite( fhnd, "A" ) )
OutSpec("FSeek( fhnd, 2, FS_SET )" , FSeek( fhnd, 2, FS_SET ) )
OutSpec("FWrite( fhnd, 'B' )" , FWrite( fhnd, "B" ) )
OutSpec("FSeek( fhnd, 3, FS_RELATIVE )" , FSeek( fhnd, 3, FS_RELATIVE ) )
OutSpec("FWrite( fhnd, 'C' )" , FWrite( fhnd, "C" ) )
OutSpec("FSeek( fhnd, -1, FS_RELATIVE )" , FSeek( fhnd, -1, FS_RELATIVE ) )
OutSpec("FWrite( fhnd, 'D' )" , FWrite( fhnd, "D" ) )
OutSpec("FSeek( fhnd, 3, FS_END )" , FSeek( fhnd, 3, FS_END ) )
OutSpec("FWrite( fhnd, 'E' )" , FWrite( fhnd, "E" ) )
OutSpec("FSeek( fhnd, -1, FS_END )" , FSeek( fhnd, -1, FS_END ) )
OutSpec("FWrite( fhnd, 'F' )" , FWrite( fhnd, "F" ) )
OutSpec("FSeek( fhnd, 0 )" , FSeek( fhnd, 0 ) )
cBuffer := Space(4)
OutSpec("FRead( fhnd, cBuffer )" , FRead( fhnd, cBuffer ) )
OutSpec("FRead( fhnd, cBuffer, 2 )" , FRead( fhnd, cBuffer, 2 ) )
OutSpec("FRead( fhnd, @cBuffer, 5 )" , FRead( fhnd, @cBuffer, 5 ) )
OutSpec("FRead( fhnd, @cBuffer, 3 )" , FRead( fhnd, @cBuffer, 3 ) )
cBuffer := Space(100)
OutSpec("FRead( fhnd, @cBuffer, 100 )" , FRead( fhnd, @cBuffer, 100 ) )
OutSpec("FSeek( fhnd, 0 )" , FSeek( fhnd, 0 ) )
OutSpec("FReadStr( fhnd, 4 )" , FReadStr( fhnd, 4 ) )
OutSpec("FSeek( fhnd, 0 )" , FSeek( fhnd, 0 ) )
OutSpec("FReadStr( fhnd, 100 )" , FReadStr( fhnd, 100 ) )
OutSpec("FSeek( fhnd, -4, FS_END )" , FSeek( fhnd, -4, FS_END ) )
OutSpec("FReadStr( fhnd, 1 )" , FReadStr( fhnd, 1 ) )
OutSpec("FReadStr( fhnd, 20 )" , FReadStr( fhnd, 20 ) )
OutSpec("FSeek( fhnd, 0, FS_END )" , FSeek( fhnd, 0, FS_END ) )
OutSpec("FWrite( fhnd, '_-_-_-_-_-_-_' )", FWrite( fhnd, "_-_-_-_-_-_-_" ) )
OutSpec("FSeek( fhnd, -4, FS_END )" , FSeek( fhnd, -4, FS_END ) )
OutSpec("FReadStr( fhnd, 1 )" , FReadStr( fhnd, 1 ) )
OutSpec("FReadStr( fhnd, 20 )" , FReadStr( fhnd, 20 ) )
OutSpec("FSeek( fhnd, 3, FS_END )" , FSeek( fhnd, 3, FS_END ) )
OutSpec("FWrite( fhnd, 'V' )" , FWrite( fhnd, "V" ) )
OutSpec("FSeek( fhnd, -3, FS_END )" , FSeek( fhnd, -3, FS_END ) )
OutSpec("FWrite( fhnd, 'W' )" , FWrite( fhnd, "W" ) )
return nil
OutSpec("FClose()" , FClose() )
OutSpec("FClose( fhnd )" , FClose( fhnd ) )
OutSpec("FClose( fhnd )" , FClose( fhnd ) )
OutSpec("File( cFileName )" , File( cFileName ) )
RETURN NIL
STATIC FUNCTION OutSpec( cWhat, xRetVal )
OutStd( PadR( cWhat, 35 ) +;
PadR( " e: " + LTrim( Str( FError() ) ), 9 ) +;
PadR( " ret: " + XToStr( xRetVal ), 35 ) )
OutStd( Chr(13) + Chr(10) )
RETURN NIL
STATIC FUNCTION XToStr( xValue )
LOCAL cType := ValType( xValue )
DO CASE
CASE cType == "C" ; RETURN "$" + xValue + "$"
CASE cType == "N" ; RETURN LTrim( Str( xValue ) )
CASE cType == "D" ; RETURN DToC( xValue )
CASE cType == "L" ; RETURN iif( xValue, ".T.", ".F." )
CASE cType == "O" ; RETURN xValue:className + " Object"
CASE cType == "U" ; RETURN "NIL"
CASE cType == "B" ; RETURN "{||...}"
CASE cType == "A" ; RETURN "{...}"
CASE cType == "M" ; RETURN xValue
ENDCASE
RETURN ""