ChangeLog: 19990629-05:55

This commit is contained in:
Ryszard Glab
1999-06-29 05:07:16 +00:00
parent 22edb32b44
commit cdfdaafdd5
31 changed files with 1160 additions and 882 deletions

View File

@@ -1,3 +1,45 @@
19990629-05:55 Ryszard Glab <rglab@imid.med.pl>
* Tagged all sources with the name 'release_old_item'
You can download old version by issuing tthe following command:
cvs checkout -r release_old_item harbour
(be sure to checkout into new directory)
To check tag names for file use:
cvs status -v <filename>
* include/extend.h
* changed definition of HB_ITEM structure
* include/init.h
* added HB_INIT_SYMBOLS and HB_CALL_ON_STARTUP macros
* include/hbsetup.h
* renamed HB_STRICT_CLIPPER_COMPATIBILITY to
HARBOUR_STRICT_CLIPPER_COMPATIBILITY
+ added HARBOUR_STRICT_ANSI_C definition
* source/vm/hvm.c
* changed to use the new HB_ITEM
* source/initsymb.c
* changed to use HARBOUR_STRICT_ANSI_C
* source/rtl/*.c
* changed to use the new HB_ITEM
* changed to automatically register symbol table
*source/tools/stringsx.c
* removed direct access to Harbour internals HB_ITEM structure
* source/compiler/harbour.l
* corrected line continuation bugs
* source/compiler/harbour.y
* corrected line continuation bug
* tests/working/linecont.prg
* added some more code for testing line continuation
19990628-23:30 EDT David G. Holm <dholm@jsd-llc.com>
* source/tools/hb_f.c
* Undid previous type change for x in hb_hbfskip(), because it

View File

@@ -49,31 +49,100 @@ void ProcessSymbols( SYMBOL *, WORD );
#define IT_NUMERIC ( IT_INTEGER | IT_LONG | IT_DOUBLE )
#define IT_ANY 0xFFFF
struct _CODEBLOCK; /* forward declaration */
struct _HB_CODEBLOCK; /* forward declaration */
struct _HB_BASEARRAY; /* forward declaration */
typedef struct /* items hold at the virtual machine stack */
struct hb_struArray
{
WORD wType; /* type of the item */
WORD wLength; /* length of the item */
WORD wDec; /* decimal places in a numeric double item */
union { /* different things may be holded here */
char * szText; /* string values */
int iNumber; /* int values */
long lNumber; /* long values */
double dNumber; /* double values */
int iLogical; /* logical values */
long lDate; /* date values */
PSYMBOL pSymbol; /* functions call symbol */
struct _CODEBLOCK * pCodeblock;/* pointer to a codeblock structure */
WORD wItem; /* variable by reference, stack offset */
void * pBaseArray; /* array base */
} value;
WORD wBase; /* stack frame number of items position for a function call */
WORD wLine; /* currently processed PRG line number */
WORD wParams; /* number of received parameters for a function call */
} HB_ITEM, * PHB_ITEM;
struct _HB_BASEARRAY * value;
};
typedef struct
struct hb_struBlock
{
LONG stackbase;
WORD lineno;
WORD paramcnt;
struct _HB_CODEBLOCK * value;
};
struct hb_struDate
{
WORD length;
LONG value;
};
struct hb_struDouble
{
WORD length;
WORD decimal;
double value;
};
struct hb_struInteger
{
WORD length;
WORD decimal;
int value;
};
struct hb_struLogical
{
WORD length;
WORD value;
};
struct hb_struLong
{
WORD length;
WORD decimal;
long value;
};
struct hb_struPointer
{
void *value;
};
struct hb_struRefer
{
LONG stackbase;
LONG value;
};
struct hb_struString
{
ULONG length;
char *value;
};
struct hb_struSymbol
{
LONG stackbase;
WORD lineno;
WORD paramcnt;
PSYMBOL value;
};
typedef struct /* items hold at the virtual machine stack */
{
WORD type;
union {
struct hb_struArray asArray;
struct hb_struBlock asBlock;
struct hb_struDate asDate;
struct hb_struDouble asDouble;
struct hb_struInteger asInteger;
struct hb_struLogical asLogical;
struct hb_struLong asLong;
struct hb_struPointer asPointer;
struct hb_struRefer asRefer;
struct hb_struString asString;
struct hb_struSymbol asSymbol;
} item;
}
HB_ITEM, *PHB_ITEM;
typedef struct _HB_BASEARRAY
{
PHB_ITEM pItems; /* pointer to the array items */
ULONG ulLen; /* number of items in the array */
@@ -86,7 +155,7 @@ typedef struct /* stack managed by the virtual machine */
{
PHB_ITEM pItems; /* pointer to the stack items */
PHB_ITEM pPos; /* pointer to the latest used item */
LONG wItems; /* total items that may be holded on the stack */
LONG wItems; /* total items that may be holded on the stack */
HB_ITEM Return; /* latest returned value */
PHB_ITEM pBase; /* stack frame position for the current function call */
PHB_ITEM pEvalBase;/* stack frame position for the evaluated codeblock */
@@ -103,7 +172,7 @@ typedef struct
} DYNSYM, * PDYNSYM; /* dynamic symbol structure */
/* internal structure for codeblocks */
typedef struct _CODEBLOCK
typedef struct _HB_CODEBLOCK
{
BYTE * pCode; /* codeblock pcode */
PHB_ITEM pItems; /* table with referenced local variables */
@@ -113,7 +182,7 @@ typedef struct _CODEBLOCK
WORD wRefBase; /* stack frame position for referenced local variables */
int iStatBase; /* static base for function where CB was created */
long lCounter; /* numer of references to this codeblock */
} CODEBLOCK, * PCODEBLOCK;
} HB_CODEBLOCK, * HB_CODEBLOCK_PTR;
PHB_ITEM hb_param( WORD wParam, WORD wType ); /* retrieve a generic parameter */
char * hb_parc( WORD wParam, ... ); /* retrieve a string parameter */

View File

@@ -1,15 +1,33 @@
/*
* $Id$
*
* Harbour compiler and runtime configuration file
*/
#ifndef HB_SETUP_H_
#define HB_SETUP_H_
/*
* Harbour compiler and runtime configuration file
*/
/* ***********************************************************************
* This symbol defines if Harbour is compiled using C compiler
* that support strict ANSI C only
*
* The only non ANSI C feature that we are using is an ability
* to call functions before the 'main' module is called.
* This trick is used to automatically join all symbol tables defined
* in run-time support modules and in user defined modules.
* If strict ANSI C compability is required then all symbol tables
* have to be joined manually by calling special function named
* <module_name>__InitSymbols
* (for example for myfirst.prg it will be: 'MYFIRST__InitSymbols'
* The generation of this function is performed by the macro called
* HB_CALL_ON_STARTUP that is defined in 'init.h'
*
* By default we are using extensions to ANSI C (symbol is not defined)
*/
/*#define HARBOUR_STRICT_ANSI_C */
/* The name of starting procedure
/* ***********************************************************************
* The name of starting procedure
* Note: You have to define it in case when Harbour cannot find the proper
* starting procedure (due to incorrect order of static data initialization)
*
@@ -25,26 +43,30 @@
#endif
#endif
/* This symbol defines if we want an ability to create and link OBJ files
/* ***********************************************************************
* This symbol defines if we want an ability to create and link OBJ files
* generated by Harbour compiler
*
* By default it is disabled (symbol is not defined)
*/
/*#define HARBOUR_OBJ_GENERATION*/
/* This symbol defines if we want to use strict Clipper compatibility
/* ***********************************************************************
* This symbol defines if we want to use strict Clipper compatibility
*
* By default it is disabled (symbol is not defined)
*/
/*#define HB_STRICT_CLIPPER_COMPATIBILITY*/
/*#define HARBOUR_STRICT_CLIPPER_COMPATIBILITY*/
/* This symbol defines if we want to use the GT API
/* ***********************************************************************
* This symbol defines if we want to use the GT API
*
* By default it is disabled (symbol is not defined)
*/
/*#define USE_GTAPI*/
/*#define HARBOUR_USE_GTAPI*/
/* Operating system specific definitions
/* ***********************************************************************
* Operating system specific definitions
*/
#ifdef __GNUC__
/* The GNU C compiler is used */

View File

@@ -1,47 +1,90 @@
/*
* $Id$
*
* Harbour local symbols initialization
*/
#ifndef HB_INIT_H_
#define HB_INIT_H_
/* Harbour local symbols initialization */
void ProcessSymbols( SYMBOL * pSymbols, WORD wSymbols );
#ifdef HARBOUR_STRICT_ANSI_C
#define HB_INIT_SYMBOLS( func ) \
void func( void ) \
{ \
ProcessSymbols( symbols, sizeof( symbols ) / sizeof( SYMBOL ) ); \
}
#define HB_CALL_ON_STARTUP( func ) func( void )
#define HB_RETURN_ON_STARTUP
#else /* HARBOUR_STRICT_ANSI_C */
#ifdef __GNUC__
static void __attribute__ ((constructor)) InitSymbols( void )
{
ProcessSymbols( symbols, sizeof( symbols ) / sizeof( SYMBOL ) );
}
#define HB_INIT_SYMBOLS( func ) \
static void __attribute__ ((constructor)) func( void ) \
{ \
ProcessSymbols( symbols, sizeof( symbols ) / sizeof( SYMBOL ) ); \
}
#define HB_CALL_ON_STARTUP( func ) \
static void __attribute__ ((constructor)) func( void )
#define HB_RETURN_ON_STARTUP
#endif
#ifdef __BORLANDC__
static void InitSymbols( void )
{
ProcessSymbols( symbols, sizeof( symbols ) / sizeof( SYMBOL ) );
}
#pragma startup InitSymbols
#define HB_INIT_SYMBOLS( func ) \
static void func( void ) \
{ \
ProcessSymbols( symbols, sizeof( symbols ) / sizeof( SYMBOL ) ); \
} \
#pragma startup func
#define HB_CALL_ON_STARTUP( func ) \
static void func( void )
#pragma startup func
#define HB_RETURN_ON_STARTUP
#endif
#if (defined(_MSC_VER) || defined(__IBMCPP__))
static int InitSymbols( void )
{
ProcessSymbols( symbols, sizeof( symbols ) / sizeof( SYMBOL ) );
return 1;
}
static int q = InitSymbols();
#define HB_INIT_SYMBOLS( func ) \
static int func( void ) \
{ \
ProcessSymbols( symbols, sizeof( symbols ) / sizeof( SYMBOL ) ); \
return 1; \
} \
static int static_int_##func = func();
#define HB_CALL_ON_STARTUP( func ) \
static int func( void ); \
static int static_int_##func = func(); \
static int func( void )
#define HB_RETURN_ON_STARTUP return 1;
#endif
#ifdef __WATCOMC__
static int InitSymbols( void )
{
ProcessSymbols( symbols, sizeof( symbols ) / sizeof( SYMBOL ) );
return 1;
}
static int _STATIC_INT_INIT_SYMBOLS = InitSymbols();
#define HB_INIT_SYMBOLS( func ) \
static int func( void ) \
{ \
ProcessSymbols( symbols, sizeof( symbols ) / sizeof( SYMBOL ) ); \
return 1; \
} \
static int static_int_##func = func();
#define HB_CALL_ON_STARTUP( func ) \
static int func( void ); \
static int static_int_##func = func(); \
static int func( void )
#define HB_RETURN_ON_STARTUP return 1;
#endif
#endif /*HARBOUR_STRICT_ANSI_C */
#endif /* HB_INIT_H_ */

View File

@@ -58,7 +58,7 @@ long lNumber = 0;
#define LOOKUP 0 /* scan from the begining of line */
#define OPERATOR -1
#define SEPARATOR -2
static int _iState = LOOKUP;
int _iState = LOOKUP;
static int _iOpenBracket = 0;
/* Support for Array Index */
@@ -200,13 +200,12 @@ Separator {SpaceTab}
if( i_INDEX_STATE ) BEGIN INDEX; else BEGIN 0;
++iLine;
if( ! _iQuiet ) printf( "\rline: %i", iLine );
_iState=LINECONT_;
return ';';
}
<LINECONT_>{Separator}*("("|")") {
GenError( ERR_INCOMPLETE_STMT, yytext, NULL );
}
<LINECONT_>{Separator}*";" ; /*Ignore any repeated ';' */
<LINECONT_>";" ; /*Ignore any repeated ';' */
<LINECONT_>{Separator}*. {
unput( yytext[ yyleng-1 ] );
if( i_INDEX_STATE )

View File

@@ -398,7 +398,6 @@ int _iRestrictSymbolLength = 0; /* generate 10 chars max symbols length */
int _iShortCuts = 1; /* .and. & .or. expressions shortcuts */
int _iWarnings = 0; /* enable parse warnings */
short int _iAltSymbolTableInit = 0; /* alternative method of symbol table initialization */
WORD _wSeqCounter = 0;
WORD _wForCounter = 0;
WORD _wIfCounter = 0;
@@ -416,6 +415,9 @@ PATHNAMES *_pIncludePath = NULL;
PSTACK_VAL_TYPE pStackValType = 0; /* compile time stack values linked list */
char cVarType = ' '; /* current declared variable type */
#define LOOKUP 0
extern int _iState; /* current parser state (defined in harbour.l */
%}
%union /* special structure used by lex and yacc to share info */
@@ -501,10 +503,11 @@ Source : Crlf
Include : NE1 INCLUDE LITERAL { if( ! Include( $3, _pIncludePath ) )
GenError( ERR_CANT_OPEN_INCLUDE, $3, NULL );
_iState =LOOKUP;
} Crlf
;
Extern : EXTERN ExtList Crlf
Extern : EXTERN ExtList { _iState =LOOKUP; } Crlf
;
ExtList : IDENTIFIER { AddExtern( $1 ); }
@@ -529,52 +532,52 @@ FunScope : { $$ = FS_PUBLIC; }
| EXIT { $$ = FS_EXIT; }
;
Params : { $$ = 0; }
| '(' ')' { $$ = 0; }
| '(' { iVarScope = VS_PARAMETER; } ParamList ')' { $$ = $3; }
Params : { $$ = 0; _iState =LOOKUP; }
| '(' ')' { $$ = 0; _iState =LOOKUP; }
| '(' { iVarScope = VS_PARAMETER; } ParamList ')' { $$ = $3; _iState =LOOKUP; }
;
ParamList : IDENTIFIER { cVarType = ' '; AddVar( $1 ); $$ = 1; }
| IDENTIFIER AS_NUMERIC { cVarType = 'N'; AddVar( $1 ); $$ = 1; }
| IDENTIFIER AS_CHARACTER { cVarType = 'C'; AddVar( $1 ); $$ = 1; }
| IDENTIFIER AS_DATE { cVarType = 'D'; AddVar( $1 ); $$ = 1; }
| IDENTIFIER AS_LOGICAL { cVarType = 'L'; AddVar( $1 ); $$ = 1; }
| IDENTIFIER AS_ARRAY { cVarType = 'A'; AddVar( $1 ); $$ = 1; }
| IDENTIFIER AS_BLOCK { cVarType = 'B'; AddVar( $1 ); $$ = 1; }
| IDENTIFIER AS_OBJECT { cVarType = 'O'; AddVar( $1 ); $$ = 1; }
| ParamList ',' IDENTIFIER { AddVar( $3 ); $$++; }
ParamList : IDENTIFIER { cVarType = ' '; AddVar( $1 ); $$ = 1; }
| IDENTIFIER AS_NUMERIC { cVarType = 'N'; AddVar( $1 ); $$ = 1; }
| IDENTIFIER AS_CHARACTER { cVarType = 'C'; AddVar( $1 ); $$ = 1; }
| IDENTIFIER AS_DATE { cVarType = 'D'; AddVar( $1 ); $$ = 1; }
| IDENTIFIER AS_LOGICAL { cVarType = 'L'; AddVar( $1 ); $$ = 1; }
| IDENTIFIER AS_ARRAY { cVarType = 'A'; AddVar( $1 ); $$ = 1; }
| IDENTIFIER AS_BLOCK { cVarType = 'B'; AddVar( $1 ); $$ = 1; }
| IDENTIFIER AS_OBJECT { cVarType = 'O'; AddVar( $1 ); $$ = 1; }
| ParamList ',' IDENTIFIER { AddVar( $3 ); $$++; }
;
Statements : Statement
| Statements { Line(); } Statement
;
Statement : ExecFlow Crlf {}
| FunCall Crlf { Do( $1 ); }
| AliasFunc Crlf {}
| IfInline Crlf { GenPCode1( HB_P_POP ); }
| ObjectMethod Crlf { GenPCode1( HB_P_POP ); }
| VarUnary Crlf { GenPCode1( HB_P_POP ); }
| VarAssign Crlf { GenPCode1( HB_P_POP ); }
Statement : ExecFlow { _iState =LOOKUP; } Crlf {}
| FunCall { _iState =LOOKUP; } Crlf { Do( $1 ); }
| AliasFunc { _iState =LOOKUP; } Crlf {}
| IfInline { _iState =LOOKUP; } Crlf { GenPCode1( HB_P_POP ); }
| ObjectMethod { _iState =LOOKUP; } Crlf { GenPCode1( HB_P_POP ); }
| VarUnary { _iState =LOOKUP; } Crlf { GenPCode1( HB_P_POP ); }
| VarAssign { _iState =LOOKUP; } Crlf { GenPCode1( HB_P_POP ); }
| IDENTIFIER '=' Expression Crlf { PopId( $1 ); }
| AliasExp '=' Expression Crlf { /* TODO */ GenPCode1( HB_P_POP ); }
| VarId ArrayIndex '=' Expression Crlf { GenPCode1( HB_P_ARRAYPUT ); GenPCode1( HB_P_POP ); }
| FunArrayCall '=' Expression Crlf { GenPCode1( HB_P_ARRAYPUT ); GenPCode1( HB_P_POP ); }
| IdSend IDENTIFIER '=' { Message( SetData( $2 ) ); } Expression Crlf { Function( 1 ); }
| ObjectData ArrayIndex '=' Expression Crlf { GenPCode1( HB_P_ARRAYPUT ); GenPCode1( HB_P_POP ); }
| ObjectMethod ArrayIndex '=' Expression Crlf { GenPCode1( HB_P_ARRAYPUT ); GenPCode1( HB_P_POP ); }
| IDENTIFIER '=' Expression { _iState =LOOKUP; } Crlf { PopId( $1 ); }
| AliasExp '=' Expression { _iState =LOOKUP; } Crlf { /* TODO */ GenPCode1( HB_P_POP ); }
| VarId ArrayIndex '=' Expression { _iState =LOOKUP; } Crlf { GenPCode1( HB_P_ARRAYPUT ); GenPCode1( HB_P_POP ); }
| FunArrayCall '=' Expression { _iState =LOOKUP; } Crlf { GenPCode1( HB_P_ARRAYPUT ); GenPCode1( HB_P_POP ); }
| IdSend IDENTIFIER '=' { Message( SetData( $2 ) ); } Expression { _iState =LOOKUP; } Crlf { Function( 1 ); }
| ObjectData ArrayIndex '=' Expression { _iState =LOOKUP; } Crlf { GenPCode1( HB_P_ARRAYPUT ); GenPCode1( HB_P_POP ); }
| ObjectMethod ArrayIndex '=' Expression { _iState =LOOKUP; } Crlf { GenPCode1( HB_P_ARRAYPUT ); GenPCode1( HB_P_POP ); }
| BREAK Crlf
| BREAK Expression Crlf
| RETURN Crlf { GenReturn( Jump( 0 ) ); }
| RETURN Expression Crlf { GenPCode1( HB_P_RETVALUE ); GenReturn( Jump ( 0 ) ); }
| PUBLIC { iVarScope = VS_MEMVAR; } VarList Crlf
| PRIVATE { iVarScope = VS_MEMVAR; } VarList Crlf
| PARAMETERS { iVarScope = VS_MEMVAR; } IdentList Crlf
| EXITLOOP Crlf { LoopExit(); }
| LOOP Crlf { LoopLoop(); }
| DoProc Crlf
| BREAK { _iState =LOOKUP; } Crlf
| BREAK Expression { _iState =LOOKUP; } Crlf
| RETURN { _iState =LOOKUP; } Crlf { GenReturn( Jump( 0 ) ); }
| RETURN Expression { _iState =LOOKUP; } Crlf { GenPCode1( HB_P_RETVALUE ); GenReturn( Jump ( 0 ) ); }
| PUBLIC { iVarScope = VS_MEMVAR; } VarList { _iState =LOOKUP; } Crlf
| PRIVATE { iVarScope = VS_MEMVAR; } VarList { _iState =LOOKUP; } Crlf
| PARAMETERS { iVarScope = VS_MEMVAR; } IdentList { _iState =LOOKUP; } Crlf
| EXITLOOP { _iState =LOOKUP; } Crlf { LoopExit(); }
| LOOP { _iState =LOOKUP; } Crlf { LoopLoop(); }
| DoProc { _iState =LOOKUP; } Crlf
;
FunCall : FunStart ')' { $$ = 0; }
@@ -877,8 +880,8 @@ ExpList : Expression %prec POST { $$ = 1; }
| ExpList { GenPCode1( HB_P_POP ); } ',' Expression %prec POST { $$++; }
;
VarDefs : LOCAL { iVarScope = VS_LOCAL; Line(); } VarList Crlf { cVarType = ' '; SetFrame(); }
| STATIC { StaticDefStart() } VarList Crlf { StaticDefEnd( $<iNumber>3 ); }
VarDefs : LOCAL { iVarScope = VS_LOCAL; Line(); } VarList { _iState =LOOKUP; } Crlf { cVarType = ' '; SetFrame(); }
| STATIC { StaticDefStart() } VarList { _iState =LOOKUP; } Crlf { StaticDefEnd( $<iNumber>3 ); }
;
VarList : VarDef { $$ = 1; }
@@ -905,7 +908,7 @@ VarDef : IDENTIFIER { cVarType = ' '; AddV
| IDENTIFIER '[' ExpList ']' AS_ARRAY { cVarType = 'A'; AddVar( $1 ); DimArray( $3 ); }
;
FieldsDef : FIELD { iVarScope =VS_FIELD; } FieldList Crlf { LineBody(); }
FieldsDef : FIELD { iVarScope =VS_FIELD; } FieldList { _iState =LOOKUP; } Crlf { LineBody(); }
;
FieldList : IDENTIFIER { cVarType = ' '; $$=FieldsCount(); AddVar( $1 ); }
@@ -920,7 +923,7 @@ FieldList : IDENTIFIER { cVarType = ' '; $$=FieldsCo
| FieldList IN IDENTIFIER { SetAlias( $3, $<iNumber>1 ); }
;
MemvarDef : MEMVAR { iVarScope = VS_MEMVAR; } MemvarList Crlf { LineBody(); }
MemvarDef : MEMVAR { iVarScope = VS_MEMVAR; } MemvarList { _iState =LOOKUP; } Crlf { LineBody(); }
;
MemvarList : IDENTIFIER { AddVar( $1 ); }
@@ -944,23 +947,23 @@ IfEndif : IfBegin EndIf { JumpHere( $1 ); }
| IfBegin IfElseIf IfElse EndIf { JumpHere( $1 ); FixElseIfs( $2 ); }
;
IfBegin : IF Expression { ++_wIfCounter; } Crlf { $$ = JumpFalse( 0 ); }
IfBegin : IF Expression { ++_wIfCounter; _iState =LOOKUP; } Crlf { $$ = JumpFalse( 0 ); }
IfStats
{ $$ = Jump( 0 ); JumpHere( $<iNumber>5 ); }
;
IfElse : ELSE Crlf IfStats
IfElse : ELSE { _iState =LOOKUP; } Crlf IfStats
;
IfElseIf : ELSEIF Expression Crlf { $<iNumber>$ = JumpFalse( 0 ); }
IfElseIf : ELSEIF Expression { _iState =LOOKUP; } Crlf { $<iNumber>$ = JumpFalse( 0 ); }
IfStats { $$ = GenElseIf( 0, Jump( 0 ) ); JumpHere( $<iNumber>4 ); }
| IfElseIf ELSEIF Expression Crlf { $<iNumber>$ = JumpFalse( 0 ); }
| IfElseIf ELSEIF Expression { _iState =LOOKUP; } Crlf { $<iNumber>$ = JumpFalse( 0 ); }
IfStats { $$ = GenElseIf( $1, Jump( 0 ) ); JumpHere( $<iNumber>5 ); }
;
EndIf : ENDIF { --_wIfCounter; }
| END { --_wIfCounter; }
EndIf : ENDIF { --_wIfCounter; _iState =LOOKUP; }
| END { --_wIfCounter; _iState =LOOKUP; }
;
IfStats : /* no statements */
@@ -984,29 +987,29 @@ DoCase : DoCaseBegin
EndCase { FixElseIfs( $2 ); }
;
EndCase : ENDCASE { --_wCaseCounter; }
| END { --_wCaseCounter; }
EndCase : ENDCASE { --_wCaseCounter; _iState =LOOKUP; }
| END { --_wCaseCounter; _iState =LOOKUP; }
;
DoCaseBegin : DOCASE { ++_wCaseCounter; } Crlf
DoCaseBegin : DOCASE { ++_wCaseCounter; _iState =LOOKUP; } Crlf
;
Cases : CASE Expression Crlf { $<iNumber>$ = JumpFalse( 0 ); Line(); } CaseStmts { $$ = GenElseIf( 0, Jump( 0 ) ); JumpHere( $<iNumber>4 ); Line(); }
| Cases CASE Expression Crlf { $<iNumber>$ = JumpFalse( 0 ); Line(); } CaseStmts { $$ = GenElseIf( $1, Jump( 0 ) ); JumpHere( $<iNumber>5 ); Line(); }
Cases : CASE Expression { _iState =LOOKUP; } Crlf { $<iNumber>$ = JumpFalse( 0 ); Line(); } CaseStmts { $$ = GenElseIf( 0, Jump( 0 ) ); JumpHere( $<iNumber>4 ); Line(); }
| Cases CASE Expression { _iState =LOOKUP; } Crlf { $<iNumber>$ = JumpFalse( 0 ); Line(); } CaseStmts { $$ = GenElseIf( $1, Jump( 0 ) ); JumpHere( $<iNumber>5 ); Line(); }
;
Otherwise : OTHERWISE Crlf CaseStmts
Otherwise : OTHERWISE { _iState =LOOKUP; } Crlf CaseStmts
;
CaseStmts : /* no statements */
| Statements
;
DoWhile : WhileBegin Expression Crlf { $<lNumber>$ = JumpFalse( 0 ); }
DoWhile : WhileBegin WhileExpression Crlf { $<lNumber>$ = JumpFalse( 0 ); }
{ Jump( $1 - functions.pLast->lPCodePos ); }
EndWhile { JumpHere( $<lNumber>4 ); --_wWhileCounter; }
| WhileBegin Expression Crlf { $<lNumber>$ = JumpFalse( 0 ); Line(); }
| WhileBegin WhileExpression Crlf { $<lNumber>$ = JumpFalse( 0 ); Line(); }
WhileStatements { LoopHere(); Jump( $1 - functions.pLast->lPCodePos ); }
EndWhile { JumpHere( $<lNumber>4 ); --_wWhileCounter; LoopEnd(); }
;
@@ -1014,17 +1017,20 @@ DoWhile : WhileBegin Expression Crlf { $<lNumber>$ = JumpFalse( 0 ); }
WhileBegin : WHILE { $$ = functions.pLast->lPCodePos; ++_wWhileCounter; LoopStart(); }
;
WhileExpression : Expression { _iState =LOOKUP; }
;
WhileStatements : Statement
| WhileStatements Statement { Line(); }
;
EndWhile : END
| ENDDO
EndWhile : END { _iState =LOOKUP; }
| ENDDO { _iState =LOOKUP; }
;
ForNext : FOR IDENTIFIER ForAssign Expression { PopId( $2 ); $<iNumber>$ = functions.pLast->lPCodePos; ++_wForCounter; LoopStart(); }
TO Expression { PushId( $2 ); }
StepExpr Crlf { GenPCode1( HB_P_FORTEST ); $<iNumber>$ = JumpTrue( 0 ); }
StepExpr { _iState =LOOKUP; } Crlf { GenPCode1( HB_P_FORTEST ); $<iNumber>$ = JumpTrue( 0 ); }
ForStatements { LoopHere(); PushId( $2 ); GenPCode1( HB_P_PLUS ); PopId( $2 ); Jump( $<iNumber>5 - functions.pLast->lPCodePos ); JumpHere( $<iNumber>11 ); LoopEnd(); }
;
@@ -1036,16 +1042,16 @@ StepExpr : /* default step expression */ { PushInteger( 1 ); }
| STEP Expression
;
ForStatements : ForStat NEXT { --_wForCounter; }
| ForStat NEXT IDENTIFIER { --_wForCounter; }
| NEXT { --_wForCounter; }
| NEXT IDENTIFIER { --_wForCounter; }
ForStatements : ForStat NEXT { --_wForCounter; _iState =LOOKUP; }
| ForStat NEXT IDENTIFIER { --_wForCounter; _iState =LOOKUP; }
| NEXT { --_wForCounter; _iState =LOOKUP; }
| NEXT IDENTIFIER { --_wForCounter; _iState =LOOKUP; }
;
ForStat : Statements { Line(); }
;
BeginSeq : BEGINSEQ { ++_wSeqCounter; } Crlf
BeginSeq : BEGINSEQ { ++_wSeqCounter; _iState =LOOKUP; } Crlf
SeqStatms
RecoverSeq
END { --_wSeqCounter; }
@@ -1056,10 +1062,16 @@ SeqStatms : /* empty */
;
RecoverSeq : /* no recover */
| RECOVER Crlf
| RECOVER Crlf Statements
| RECOVER USING IDENTIFIER Crlf
| RECOVER USING IDENTIFIER Crlf Statements
| RecoverEmpty Crlf
| RecoverEmpty Crlf Statements
| RecoverUsing Crlf
| RecoverUsing Crlf Statements
;
RecoverEmpty : RECOVER { _iState =LOOKUP; }
;
RecoverUsing : RECOVER USING IDENTIFIER { _iState =LOOKUP; }
;
DoProc : DO IDENTIFIER { PushSymbol( $2, 1 ); PushNil(); Do( 0 ); }
@@ -1260,11 +1272,6 @@ int harbour_main( int argc, char * argv[] )
_iSyntaxCheckOnly = 1;
break;
case 't':
case 'T':
_iAltSymbolTableInit = 1;
break;
case 'v':
case 'V':
break;
@@ -1810,7 +1817,7 @@ int Include( char * szFileName, PATHNAMES *pSearch )
{
pFileName->path =pSearch->szPath;
MakeFilename( szFName, pFileName );
yyin = fopen( szFName, "r" );
yyin = fopen( szFName, "r" );
if( ! yyin )
{
pSearch = pSearch->pNext;
@@ -2037,7 +2044,8 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
if( ! _iQuiet )
printf( "\nGenerating C language output...\n" );
fprintf( yyc, "#include \"pcode.h\"\n\n" );
fprintf( yyc, "#include \"pcode.h\"\n" );
fprintf( yyc, "#include <init.h>\n\n" );
if( ! _iStartProc )
pFunc = pFunc->pNext; /* No implicit starting procedure */
@@ -2095,7 +2103,7 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
fprintf( yyc, ", HB_%s, 0 }", pFTemp->szName );
else
{
pFTemp = GetFuncall( pSym->szName );
pFTemp = GetFuncall( pSym->szName );
if( pFTemp )
fprintf( yyc, ", HB_%s, 0 }", pFTemp->szName );
else
@@ -2109,15 +2117,9 @@ void GenCCode( char *szFileName, char *szName ) /* generates the C languag
}
fprintf( yyc, " };\n\n" );
if( _iAltSymbolTableInit )
{
fprintf( yyc, "void ProcessSymbols( SYMBOL *, WORD );\n" );
fprintf( yyc, "/* Add a local symbol table to the global one\n*/\n" );
fprintf( yyc, "void %s__InitSymbols( void )\n{\n"
" ProcessSymbols( symbols, %i );\n}\n\n", symbols.pFirst->szName, wSym );
}
else
fprintf( yyc, "#include <init.h>\n\n" );
/* Generate function that will initialize local symbol table
*/
fprintf( yyc, "HB_INIT_SYMBOLS( %s__InitSymbols );\n\n", symbols.pFirst->szName );
/* Generate functions data
*/
@@ -3142,9 +3144,9 @@ WORD JumpFalse( int iOffset )
/* compile time Operand value */
if( pStackValType && pStackValType->cType == ' ' )
GenWarning( WARN_LOGICAL_SUSPECT, NULL, NULL );
GenWarning( WARN_LOGICAL_SUSPECT, NULL, NULL );
else if( pStackValType && pStackValType->cType != 'L')
GenWarning( WARN_LOGICAL_TYPE, sType, NULL );
GenWarning( WARN_LOGICAL_TYPE, sType, NULL );
/* compile time assignment value has to be released */
pFree = pStackValType;
@@ -3196,9 +3198,9 @@ WORD JumpTrue( int iOffset )
/* compile time Operand value */
if( pStackValType && pStackValType->cType == ' ' )
GenWarning( WARN_LOGICAL_SUSPECT, NULL, NULL );
GenWarning( WARN_LOGICAL_SUSPECT, NULL, NULL );
else if( pStackValType && pStackValType->cType != 'L')
GenWarning( WARN_LOGICAL_TYPE, sType, NULL );
GenWarning( WARN_LOGICAL_TYPE, sType, NULL );
/* compile time assignment value has to be released */
pFree = pStackValType;
@@ -3362,16 +3364,16 @@ void PopId( char * szVarName ) /* generates the pcode to pop a value from the vi
sType[0] = pVarType->cType;
sType[1] = 0;
/* skip back to the assigned value */
pStackValType = pStackValType->pPrev;
/* skip back to the assigned value */
pStackValType = pStackValType->pPrev;
}
else
debug_msg( "\n***PopId() Compile time stack overflow\n", NULL );
if( pVarType && pStackValType && pVarType->cType != ' ' && pStackValType->cType == ' ' )
GenWarning( WARN_ASSIGN_SUSPECT, szVarName, sType );
GenWarning( WARN_ASSIGN_SUSPECT, szVarName, sType );
else if( pVarType && pStackValType && pVarType->cType != ' ' && pVarType->cType != pStackValType->cType )
GenWarning( WARN_ASSIGN_TYPE, szVarName, sType );
GenWarning( WARN_ASSIGN_TYPE, szVarName, sType );
/* compile time variable has to be released */
if( pVarType )
@@ -3716,7 +3718,7 @@ void Do( BYTE bParams )
else
debug_msg( "\n***Do() Compile time stack overflow\n", NULL );
if( pFree )
if( pFree )
{
OurFree( (void *) pFree );
}
@@ -3853,7 +3855,7 @@ void Function( BYTE bParams )
else
debug_msg( "\n***Function() parameter %i Compile time stack overflow\n", i );
if( pFree )
if( pFree )
{
OurFree( (void *) pFree );
}
@@ -3943,13 +3945,13 @@ void GenPCode1( BYTE byte )
{
PSTACK_VAL_TYPE pFree;
/* Releasing compile time assignment value */
/* Releasing compile time assignment value */
pFree = pStackValType;
debug_msg( "\n***---ArrayPut()\n", NULL );
if( pStackValType )
pStackValType = pStackValType->pPrev;
else
else
debug_msg( "\n***HB_P_ARRAYPUT Compile time stack overflow\n", NULL );
if( pFree )
@@ -3957,7 +3959,7 @@ void GenPCode1( BYTE byte )
OurFree( (void *) pFree );
}
/* Releasing compile time array element index value */
/* Releasing compile time array element index value */
pFree = pStackValType;
debug_msg( "\n***---HB_P_ARRAYPUT\n", NULL );
@@ -4322,8 +4324,8 @@ void CodeBlockEnd()
if( _iWarnings )
{
if( pStackValType )
/* reusing the place holder of the result value */
pStackValType->cType = 'B';
/* reusing the place holder of the result value */
pStackValType->cType = 'B';
else
debug_msg( "\n***CodeBlockEnd() Compile time stack overflow\n", NULL );
}

View File

@@ -6,6 +6,7 @@
#include <extend.h>
#include <errorapi.h>
#include <ctoharb.h>
#include <init.h>
HARBOUR HB_AADD(void);
HARBOUR HB_ACLONE(void);
@@ -21,7 +22,6 @@ HARBOUR HB_ASORT(void);
HARBOUR HB_ATAIL(void);
static SYMBOL symbols[] = {
{ "AADD", FS_PUBLIC, HB_AADD , 0 },
{ "ACLONE", FS_PUBLIC, HB_ACLONE , 0 },
{ "ACOPY", FS_PUBLIC, HB_ACOPY , 0 },
{ "ADEL", FS_PUBLIC, HB_ADEL , 0 },
@@ -46,10 +46,13 @@ static char *szBoundError = "Bound error: Array access";
static char *szArgumentError = "Argument error: incorrect type";
HB_INIT_SYMBOLS( Arrays__InitSymbols );
/*
void Arrays__InitSymbols( void )
{
ProcessSymbols( symbols, sizeof(symbols)/sizeof( SYMBOL ) );
}
*/
/*
* Internal
@@ -62,7 +65,7 @@ void hb_arrayNew( PHB_ITEM pItem, ULONG ulLen ) /* creates a new array */
ItemRelease( pItem );
pItem->wType = IT_ARRAY;
pItem->type = IT_ARRAY;
if( ulLen )
pBaseArray->pItems = ( PHB_ITEM ) hb_xgrab( sizeof( HB_ITEM ) * ulLen );
@@ -75,16 +78,16 @@ void hb_arrayNew( PHB_ITEM pItem, ULONG ulLen ) /* creates a new array */
pBaseArray->wSuperCast = FALSE;
for( ul = 0; ul < ulLen; ul++ )
( pBaseArray->pItems + ul )->wType = IT_NIL;
( pBaseArray->pItems + ul )->type = IT_NIL;
pItem->value.pBaseArray = pBaseArray;
pItem->item.asArray.value = pBaseArray;
}
void hb_arrayAdd( PHB_ITEM pArray, PHB_ITEM pValue )
{
PBASEARRAY pBaseArray = ( PBASEARRAY ) pArray->value.pBaseArray;
PBASEARRAY pBaseArray = ( PBASEARRAY ) pArray->item.asArray.value;
hb_arraySize( pArray, pBaseArray->ulLen + 1 );
pBaseArray = ( PBASEARRAY ) pArray->value.pBaseArray;
pBaseArray = ( PBASEARRAY ) pArray->item.asArray.value;
ItemCopy( pBaseArray->pItems + ( pBaseArray->ulLen - 1 ), pValue );
}
@@ -93,7 +96,7 @@ void hb_arrayGet( PHB_ITEM pArray, ULONG ulIndex, PHB_ITEM pItem )
if( IS_ARRAY( pArray ) )
{
if( ulIndex <= ( unsigned )hb_arrayLen( pArray ) )
ItemCopy( pItem, ( ( PBASEARRAY ) pArray->value.pBaseArray )->pItems + ( ulIndex - 1 ) );
ItemCopy( pItem, pArray->item.asArray.value->pItems + ( ulIndex - 1 ) );
else
{
hb_errorRT_BASE(EG_ARG, 1132, "Bound error", "array access");
@@ -111,10 +114,10 @@ char *hb_arrayGetString( PHB_ITEM pArray, ULONG ulIndex )
{
if( ulIndex <= ( unsigned )hb_arrayLen( pArray ) )
{
PHB_ITEM pItem = ( ( PBASEARRAY ) pArray->value.pBaseArray )->pItems + ulIndex - 1;
PHB_ITEM pItem = pArray->item.asArray.value->pItems + ulIndex - 1;
if( IS_STRING( pItem ) )
return pItem->value.szText;
return pItem->item.asString.value;
else
return "";
}
@@ -136,10 +139,10 @@ ULONG hb_arrayGetStringLen( PHB_ITEM pArray, ULONG ulIndex )
{
if( ulIndex <= ( unsigned )hb_arrayLen( pArray ) )
{
PHB_ITEM pItem = ( ( PBASEARRAY ) pArray->value.pBaseArray )->pItems + ulIndex - 1;
PHB_ITEM pItem = pArray->item.asArray.value->pItems + ulIndex - 1;
if( IS_STRING( pItem ) )
return pItem->wLength;
return pItem->item.asString.length;
else
return 0;
}
@@ -161,8 +164,8 @@ int hb_arrayGetType( PHB_ITEM pArray, ULONG ulIndex )
{
if( ulIndex <= ( unsigned ) hb_arrayLen( pArray ) )
{
PHB_ITEM pItem = ( ( PBASEARRAY ) pArray->value.pBaseArray )->pItems + ulIndex - 1;
return pItem->wType;
PHB_ITEM pItem = pArray->item.asArray.value->pItems + ulIndex - 1;
return pItem->type;
}
else
{
@@ -178,9 +181,9 @@ int hb_arrayGetType( PHB_ITEM pArray, ULONG ulIndex )
void hb_arrayLast( PHB_ITEM pArray, PHB_ITEM pResult )
{
if ( ( ( PBASEARRAY ) pArray->value.pBaseArray )->ulLen )
ItemCopy( pResult, ( ( PBASEARRAY ) pArray->value.pBaseArray )->pItems +
( ( ( PBASEARRAY ) pArray->value.pBaseArray )->ulLen - 1 ) );
if ( pArray->item.asArray.value->ulLen )
ItemCopy( pResult, pArray->item.asArray.value->pItems +
( pArray->item.asArray.value->ulLen - 1 ) );
else
ItemRelease( pResult );
}
@@ -188,7 +191,7 @@ void hb_arrayLast( PHB_ITEM pArray, PHB_ITEM pResult )
ULONG hb_arrayLen( PHB_ITEM pArray )
{
if( IS_ARRAY( pArray ) )
return ( ( PBASEARRAY ) pArray->value.pBaseArray )->ulLen;
return pArray->item.asArray.value->ulLen;
else
{
hb_errorRT_BASE(EG_ARG, 1068, "Argument error", "array access");
@@ -201,7 +204,7 @@ void hb_arraySet( PHB_ITEM pArray, ULONG ulIndex, PHB_ITEM pItem )
if( IS_ARRAY( pArray ) )
{
if( ulIndex <= ( unsigned )hb_arrayLen( pArray ) )
ItemCopy( ( ( PBASEARRAY ) pArray->value.pBaseArray )->pItems + ( ulIndex - 1 ), pItem );
ItemCopy( pArray->item.asArray.value->pItems + ( ulIndex - 1 ), pItem );
else
{
hb_errorRT_BASE(EG_ARG, 1133, "Bound error", "array assign");
@@ -217,14 +220,14 @@ void hb_arraySize( PHB_ITEM pArray, ULONG ulLen )
{
if ( IS_ARRAY( pArray ) )
{
PBASEARRAY pBaseArray = ( PBASEARRAY ) pArray->value.pBaseArray;
PBASEARRAY pBaseArray = pArray->item.asArray.value;
ULONG ul;
if( ! pBaseArray->ulLen )
{
pBaseArray->pItems = ( PHB_ITEM ) hb_xgrab( ulLen * sizeof( HB_ITEM ) );
for ( ul = 0; ul < ulLen; ul ++ )
( pBaseArray->pItems + ul )->wType = IT_NIL;
( pBaseArray->pItems + ul )->type = IT_NIL;
}
else
{
@@ -234,7 +237,7 @@ void hb_arraySize( PHB_ITEM pArray, ULONG ulLen )
/* set value for new items */
for( ul = pBaseArray->ulLen; ul < ulLen; ul++ )
( pBaseArray->pItems + ul )->wType = IT_NIL;
( pBaseArray->pItems + ul )->type = IT_NIL;
}
else if( pBaseArray->ulLen > ulLen )
{
@@ -265,7 +268,7 @@ void hb_arrayFill( PHB_ITEM pArray, PHB_ITEM pValue, ULONG ulStart, ULONG ulCoun
if ( ulStart + ulCount > ulLen ) /* check range */
ulCount = ulLen - ulStart + 1;
pBaseArray = ( PBASEARRAY )pArray->value.pBaseArray;
pBaseArray = pArray->item.asArray.value;
for ( ; ulCount > 0; ulCount --, ulStart ++ ) /* set value items */
ItemCopy( pBaseArray->pItems + ( ulStart - 1 ), pValue );
@@ -287,7 +290,7 @@ void hb_arrayDel( PHB_ITEM pArray, ULONG ulIndex )
if ( ulIndex > 0 && ulIndex <= ulLen )
{
PBASEARRAY pBaseArray = ( PBASEARRAY )pArray->value.pBaseArray;
PBASEARRAY pBaseArray = pArray->item.asArray.value;
ItemRelease( pBaseArray->pItems + ( ulIndex - 1 ) );
@@ -321,7 +324,7 @@ void hb_arrayIns( PHB_ITEM pArray, ULONG ulIndex )
if ( ulIndex > 0 && ulIndex <= ulLen )
{
PBASEARRAY pBaseArray = ( PBASEARRAY )pArray->value.pBaseArray;
PBASEARRAY pBaseArray = pArray->item.asArray.value;
ItemRelease( pBaseArray->pItems + ( ulLen - 1 ) );
@@ -349,7 +352,7 @@ void hb_arrayIns( PHB_ITEM pArray, ULONG ulIndex )
int hb_arrayScan( PHB_ITEM pArray, PHB_ITEM pValue, ULONG ulStart, ULONG ulCount )
{
if ( IS_ARRAY( pArray ) && pValue->wType != IT_NIL )
if ( IS_ARRAY( pArray ) && pValue->type != IT_NIL )
{
int iRet = 0;
PBASEARRAY pBaseArray;
@@ -364,49 +367,49 @@ int hb_arrayScan( PHB_ITEM pArray, PHB_ITEM pValue, ULONG ulStart, ULONG ulCount
if ( ulStart + ulCount > ulLen ) /* check range */
ulCount = ulLen - ulStart + 1;
pBaseArray = ( PBASEARRAY )pArray->value.pBaseArray;
pBaseArray = pArray->item.asArray.value;
for ( ulStart --; ulCount > 0; ulCount --, ulStart ++ )
{
PHB_ITEM pItem = pBaseArray->pItems + ulStart;
if ( pValue->wType == IT_BLOCK )
if ( pValue->type == IT_BLOCK )
{
PushSymbol( &symEval );
Push( pValue );
Push( pItem );
Do( 1 );
if ( stack.Return.value.iLogical )
if ( stack.Return.item.asLogical.value )
iRet = 1;
}
else
{
if ( pValue->wType == pItem->wType )
if ( pValue->type == pItem->type )
{
switch( pItem->wType )
switch( pItem->type )
{
case IT_INTEGER :
iRet = ( pValue->value.iNumber == pItem->value.iNumber );
iRet = ( pValue->item.asInteger.value == pItem->item.asInteger.value);
break;
case IT_LONG :
iRet = ( pValue->value.lNumber == pItem->value.lNumber );
iRet = ( pValue->item.asLong.value == pItem->item.asLong.value );
break;
case IT_DOUBLE :
iRet = ( pValue->value.dNumber == pItem->value.dNumber );
iRet = ( pValue->item.asDouble.value == pItem->item.asDouble.value );
break;
case IT_DATE :
iRet = ( pValue->value.lDate == pItem->value.lDate );
iRet = ( pValue->item.asDate.value == pItem->item.asDouble.value );
break;
case IT_LOGICAL :
iRet = ( pValue->value.iLogical == pItem->value.iLogical );
iRet = ( pValue->item.asLogical.value == pItem->item.asLogical.value );
break;
case IT_STRING :
iRet = ( hb_itemStrCmp( pValue, pItem, FALSE ) == 0 );
iRet = ( hb_itemStrCmp( pValue, pItem, FALSE ) == 0 );
break;
}
}
@@ -441,7 +444,7 @@ void hb_arrayEval( PHB_ITEM pArray, PHB_ITEM bBlock, ULONG ulStart, ULONG ulCoun
if ( ulStart + ulCount > ulLen ) /* check range */
ulCount = ulLen - ulStart + 1;
pBaseArray = ( PBASEARRAY )pArray->value.pBaseArray;
pBaseArray = pArray->item.asArray.value;
for ( ulStart --; ulCount > 0; ulCount --, ulStart ++ )
{
@@ -464,7 +467,7 @@ void hb_arrayRelease( PHB_ITEM pArray )
if ( IS_ARRAY( pArray ) )
{
ULONG ul, ulLen = hb_arrayLen( pArray );
PBASEARRAY pBaseArray = ( PBASEARRAY )pArray->value.pBaseArray;
PBASEARRAY pBaseArray = pArray->item.asArray.value;
if( !pBaseArray->wSuperCast )
{
@@ -476,8 +479,8 @@ void hb_arrayRelease( PHB_ITEM pArray )
}
hb_xfree( pBaseArray );
pArray->wType = IT_NIL;
pArray->value.pBaseArray = NULL;
pArray->type = IT_NIL;
pArray->item.asArray.value = NULL;
}
else
{
@@ -512,8 +515,8 @@ void hb_arrayCopy( PHB_ITEM pSrcArray, PHB_ITEM pDstArray, ULONG ulStart,
if ( ulCount > ulDstLen )
ulCount = ulDstLen;
pSrcBaseArray = ( PBASEARRAY )pSrcArray->value.pBaseArray;
pDstBaseArray = ( PBASEARRAY )pDstArray->value.pBaseArray;
pSrcBaseArray = pSrcArray->item.asArray.value;
pDstBaseArray = pDstArray->item.asArray.value;
for ( ulTarget --, ulStart --; ulCount > 0; ulCount --, ulStart ++ )
{
@@ -540,15 +543,15 @@ PHB_ITEM hb_arrayClone( PHB_ITEM pSrcArray )
hb_arrayNew( pDstArray, ulSrcLen );
pSrcBaseArray = ( PBASEARRAY )pSrcArray->value.pBaseArray;
pDstBaseArray = ( PBASEARRAY )pDstArray->value.pBaseArray;
pSrcBaseArray = pSrcArray->item.asArray.value;
pDstBaseArray = pDstArray->item.asArray.value;
pDstBaseArray->wClass = pSrcBaseArray->wClass;
for ( ulCount = 0; ulCount < ulSrcLen; ulCount ++ )
{
PHB_ITEM pSrcItem = pSrcBaseArray->pItems + ulCount;
if ( pSrcItem->wType == IT_ARRAY )
if ( pSrcItem->type == IT_ARRAY )
{
PHB_ITEM pClone = hb_arrayClone( pSrcItem );

View File

@@ -6,6 +6,7 @@
#include <errorapi.h>
#include <itemapi.h>
#include <ctoharb.h>
#include <init.h>
#define MET_METHOD 0
#define MET_DATA 1
@@ -121,11 +122,14 @@ static SYMBOL symbols[] = {
{ "OSEND" , FS_PUBLIC, HB_OSEND , 0 }
};
HB_INIT_SYMBOLS( Classes__InitSymbols );
/*
void Classes__InitSymbols( void )
{
ProcessSymbols( symbols, sizeof(symbols)/sizeof( SYMBOL ) );
}
*/
/*
* ClassAdd( <hClass>, <cMessage>, <pFunction>, <nType>, [xInit] )
@@ -303,7 +307,7 @@ HARBOUR HB_CLASSCREATE(void)
HARBOUR HB_CLASSDEL(void)
{
PHB_ITEM pString = hb_param( 2, IT_STRING );
PSYMBOL pMessage = GetDynSym( pString->value.szText )->pSymbol;
PSYMBOL pMessage = GetDynSym( pString->item.asString.value )->pSymbol;
PDYNSYM pMsg = ( PDYNSYM ) pMessage->pDynSym;
PCLASS pClass;
@@ -364,7 +368,7 @@ HARBOUR HB_CLASSDEL(void)
*/
static HARBOUR ClassH( void )
{
hb_retni( ( ( PBASEARRAY ) ( stack.pBase + 1 )->value.pBaseArray )->wClass );
hb_retni( ( stack.pBase + 1 )->item.asArray.value->wClass );
}
@@ -384,7 +388,7 @@ HARBOUR HB_CLASSINSTANCE(void)
{
pClass = pClasses + ( wClass - 1 );
hb_arrayNew( &stack.Return, pClass->wDatas );
( ( PBASEARRAY ) stack.Return.value.pBaseArray )->wClass = wClass;
stack.Return.item.asArray.value->wClass = wClass;
pMeth = pClass->pMethods; /* Initialize DATA */
wLimit = pClass->wHashKey * BUCKET;
@@ -404,7 +408,7 @@ HARBOUR HB_CLASSINSTANCE(void)
HARBOUR HB_CLASSMOD(void)
{
PHB_ITEM pString = hb_param( 2, IT_STRING );
PSYMBOL pMessage = GetDynSym( pString->value.szText )->pSymbol;
PSYMBOL pMessage = GetDynSym( pString->item.asString.value )->pSymbol;
PDYNSYM pMsg = ( PDYNSYM ) pMessage->pDynSym;
PCLASS pClass;
@@ -461,7 +465,7 @@ static HARBOUR ClassName( void )
PHB_ITEM pItemRef;
if( IS_BYREF( stack.pBase + 1 ) ) /* Variables by reference */
pItemRef = stack.pItems + ( stack.pBase + 1 )->value.wItem;
pItemRef = stack.pItems + ( stack.pBase + 1 )->item.asRefer.value;
else
pItemRef = stack.pBase + 1;
@@ -479,9 +483,9 @@ HARBOUR HB_CLASSNAME(void)
PHB_ITEM pObject = hb_param( 0, IT_OBJECT );
WORD wClass;
if( pObject && ( ( PBASEARRAY ) pObject->value.pBaseArray )->wClass )
if( pObject && pObject->item.asArray.value->wClass )
{
wClass = ( ( PBASEARRAY ) pObject->value.pBaseArray )->wClass;
wClass = pObject->item.asArray.value->wClass;
hb_retc( pClasses[ wClass - 1 ].szName );
}
else
@@ -503,7 +507,7 @@ HARBOUR HB_CLASSNAME(void)
static HARBOUR ClassSel(void)
{
WORD wClass = IS_ARRAY( stack.pBase + 1 ) ?
( ( PBASEARRAY ) ( stack.pBase + 1 )->value.pBaseArray )->wClass : 0;
( stack.pBase + 1 )->item.asArray.value->wClass : 0;
/* Get class word */
WORD wLimit; /* Number of Hash keys */
WORD wAt;
@@ -517,9 +521,9 @@ static HARBOUR ClassSel(void)
/* Variables by reference */
if( ( ! wClass ) && IS_BYREF( stack.pBase + 1 ) )
{
pItemRef = stack.pItems + ( stack.pBase + 1 )->value.wItem;
pItemRef = stack.pItems + ( stack.pBase + 1 )->item.asRefer.value;
if( IS_ARRAY( pItemRef ) )
wClass = ( ( PBASEARRAY ) pItemRef->value.pBaseArray )->wClass;
wClass = pItemRef->item.asArray.value->wClass;
}
if( wClass && wClass <= wClasses )
@@ -570,7 +574,7 @@ static void DictRealloc( PCLASS pClass )
static HARBOUR EvalInline( void )
{
HB_ITEM block;
WORD wClass = ( (PBASEARRAY) ( stack.pBase + 1 )->value.pBaseArray )->wClass;
WORD wClass = ( stack.pBase + 1 )->item.asArray.value->wClass;
WORD w;
hb_arrayGet( pClasses[ wClass - 1 ].pInlines, pMethod->wData, &block );
@@ -598,14 +602,14 @@ char * hb_GetClassName( PHB_ITEM pObject )
if( IS_ARRAY( pObject ) )
{
if( ! ( ( PBASEARRAY ) pObject->value.pBaseArray )->wClass )
if( ! pObject->item.asArray.value->wClass )
szClassName = "ARRAY";
else
szClassName = ( pClasses + ( ( PBASEARRAY ) pObject->value.pBaseArray )->wClass - 1 )->szName;
szClassName = ( pClasses + pObject->item.asArray.value->wClass - 1 )->szName;
}
else /* built in types */
{
switch( pObject->wType )
switch( pObject->type )
{
case IT_NIL:
szClassName = "NIL";
@@ -652,7 +656,7 @@ char * hb_GetClassName( PHB_ITEM pObject )
*/
static HARBOUR GetClassData( void )
{
WORD wClass = ( (PBASEARRAY) ( stack.pBase + 1 )->value.pBaseArray )->wClass;
WORD wClass = ( stack.pBase + 1 )->item.asArray.value->wClass;
if( wClass && wClass <= wClasses )
hb_arrayGet( pClasses[ wClass - 1 ].pClassDatas, pMethod->wData,
@@ -685,7 +689,7 @@ static HARBOUR GetData( void )
HARBOURFUNC GetMethod( PHB_ITEM pObject, PSYMBOL pMessage )
{
WORD wAt, wLimit, wMask;
WORD wClass = ( ( PBASEARRAY ) pObject->value.pBaseArray )->wClass;
WORD wClass = pObject->item.asArray.value->wClass;
PCLASS pClass;
PDYNSYM pMsg = ( PDYNSYM ) pMessage->pDynSym;
@@ -760,7 +764,7 @@ HARBOUR HB_ISMESSAGE(void)
PHB_ITEM pString = hb_param( 2, IT_STRING );
if( pObject && pString )
hb_retl( hb_isMessage( pObject, pString->value.szText ) != 0 );
hb_retl( hb_isMessage( pObject, pString->item.asString.value ) != 0 );
else
{
PHB_ITEM pError = hb_errNew();
@@ -811,7 +815,7 @@ HARBOUR HB_OSEND(void)
if( pMessage && pObject ) /* Object & message passed */
{
Push( pObject ); /* Push object */
Message( GetDynSym( pMessage->value.szText )->pSymbol );
Message( GetDynSym( pMessage->item.asString.value )->pSymbol );
/* Push char symbol as message */
for( w = 3; w <= hb_pcount(); w++ ) /* Push arguments on stack */
Push( hb_param( w, IT_ANY ) );
@@ -882,9 +886,9 @@ static HARBOUR SelectSuper( void )
WORD wSuperCls = pMethod->wData; /* Get handle of superclass */
memcpy( pSuper, pObject, sizeof( HB_ITEM ) ); /* Allocate new structures */
memcpy( pNewBase, pObject->value.pBaseArray, sizeof( BASEARRAY ) );
memcpy( pNewBase, pObject->item.asArray.value, sizeof( BASEARRAY ) );
pSuper->value.pBaseArray = pNewBase;
pSuper->item.asArray.value = pNewBase;
pNewBase->wClass = wSuperCls;
pNewBase->wHolders = 1; /* New item is returned */
@@ -902,7 +906,7 @@ static HARBOUR SelectSuper( void )
*/
static HARBOUR SetClassData( void )
{
WORD wClass = ( (PBASEARRAY) ( stack.pBase + 1 )->value.pBaseArray )->wClass;
WORD wClass = ( stack.pBase + 1 )->item.asArray.value->wClass;
PHB_ITEM pReturn = stack.pBase + 2;
if( wClass && wClass <= wClasses )
@@ -954,7 +958,7 @@ HARBOUR HB___INSTSUPER( void )
if( pString )
{
pDynSym = FindDynSym( pString->value.szText );
pDynSym = FindDynSym( pString->item.asString.value );
if( pDynSym ) /* Find function */
{
PushSymbol( pDynSym->pSymbol ); /* Push function name */
@@ -971,7 +975,7 @@ HARBOUR HB___INSTSUPER( void )
for( w = 0; !bFound && w < wClasses; w++ )
{ /* Locate the entry */
if( !hb_stricmp( pString->value.szText, pClasses[ w ].szName ) )
if( !hb_stricmp( pString->item.asString.value, pClasses[ w ].szName ) )
{
hb_retni( w + 1 ); /* Entry + 1 = ClassH */
bFound = TRUE;

View File

@@ -23,13 +23,13 @@ extern STACK stack;
* +2 bytes -> table of referenced local variables
* +2 + 2 *(number of referenced variables) -> codeblock pcode
*/
PCODEBLOCK CodeblockNew( BYTE * pBuffer, WORD wSize, PSYMBOL pSymbols,
HB_CODEBLOCK_PTR CodeblockNew( BYTE * pBuffer, WORD wSize, PSYMBOL pSymbols,
int iStaticsBase, WORD wStackBase )
{
PCODEBLOCK pCBlock;
HB_CODEBLOCK_PTR pCBlock;
WORD wVars;
pCBlock =( PCODEBLOCK ) hb_xgrab( sizeof(CODEBLOCK) );
pCBlock =( HB_CODEBLOCK_PTR ) hb_xgrab( sizeof(HB_CODEBLOCK) );
/* Check the number of referenced local variables
*/
@@ -50,8 +50,8 @@ PCODEBLOCK CodeblockNew( BYTE * pBuffer, WORD wSize, PSYMBOL pSymbols,
while( wVars-- )
{
pCBlock->pItems[ w ].wType =IT_INTEGER; /* not really integer */
pCBlock->pItems[ w ].value.wItem = * ( (WORD*) pBuffer );
pCBlock->pItems[ w ].type =IT_BYREF; /* not really integer */
pCBlock->pItems[ w ].item.asRefer.value = * ( (WORD*) pBuffer );
++w;
pBuffer +=2;
}
@@ -88,7 +88,7 @@ PCODEBLOCK CodeblockNew( BYTE * pBuffer, WORD wSize, PSYMBOL pSymbols,
/* Delete a codeblock
*/
void CodeblockDelete( PCODEBLOCK pCBlock )
void CodeblockDelete( HB_CODEBLOCK_PTR pCBlock )
{
#ifdef CODEBLOCKDEBUG
printf( "delete a codeblock (%li) %lx\n", pCBlock->lCounter, pCBlock );
@@ -118,7 +118,7 @@ void CodeblockDelete( PCODEBLOCK pCBlock )
/* Function to unlink variables referenced in a codeblock from a function
* where this codeblock was created
*/
void CodeblockDetach( PCODEBLOCK pCBlock )
void CodeblockDetach( HB_CODEBLOCK_PTR pCBlock )
{
if( pCBlock->wLocals && !pCBlock->wDetached )
{
@@ -134,9 +134,9 @@ void CodeblockDetach( PCODEBLOCK pCBlock )
* where this codeblock was defined
*/
pItem =pCBlock->pItems + w;
pItem =stack.pBase +pItem->value.wItem + 1;
pItem =stack.pBase +pItem->item.asRefer.value + 1;
if( IS_BYREF( pItem ) )
pItem =stack.pItems +pItem->value.wItem;
pItem =stack.pItems +pItem->item.asRefer.value;
ItemCopy( pCBlock->pItems + w, pItem );
++w;
}
@@ -151,7 +151,7 @@ void CodeblockDetach( PCODEBLOCK pCBlock )
* wStackBase is stack base of function where the codeblock was defined
* We need it because stack.pBase points to a stack base of EVAL function
*/
void CodeblockEvaluate( PCODEBLOCK pCBlock )
void CodeblockEvaluate( HB_CODEBLOCK_PTR pCBlock )
{
int iStatics = stack.iStatics;
@@ -162,9 +162,9 @@ void CodeblockEvaluate( PCODEBLOCK pCBlock )
/* Get local variable referenced in a codeblock
*/
PHB_ITEM CodeblockGetVar( PHB_ITEM pItem, SHORT iItemPos )
PHB_ITEM CodeblockGetVar( PHB_ITEM pItem, LONG iItemPos )
{
PCODEBLOCK pCBlock = (PCODEBLOCK)pItem->value.pCodeblock;
HB_CODEBLOCK_PTR pCBlock = pItem->item.asBlock.value;
PHB_ITEM pLocalVar;
pLocalVar =&pCBlock->pItems[ -iItemPos -1 ];
@@ -174,7 +174,7 @@ PHB_ITEM CodeblockGetVar( PHB_ITEM pItem, SHORT iItemPos )
/* when variables are not detached then a codeblock stores the variable's
* position on the stack
*/
pLocalVar =stack.pItems +pCBlock->wRefBase +pLocalVar->value.wItem + 1;
pLocalVar =stack.pItems +pCBlock->wRefBase +pLocalVar->item.asRefer.value + 1;
}
return pLocalVar;
@@ -186,9 +186,9 @@ PHB_ITEM CodeblockGetVar( PHB_ITEM pItem, SHORT iItemPos )
*/
void CodeblockCopy( PHB_ITEM pDest, PHB_ITEM pSource )
{
pDest->value.pCodeblock =pSource->value.pCodeblock;
((PCODEBLOCK) pDest->value.pCodeblock)->lCounter++;
pDest->item.asBlock.value =pSource->item.asBlock.value;
pDest->item.asBlock.value->lCounter++;
#ifdef CODEBLOCKDEBUG
printf( "copy a codeblock (%li) %lx\n", ((PCODEBLOCK) pDest->value.pCodeblock)->lCounter, pDest->value.pCodeblock);
printf( "copy a codeblock (%li) %lx\n", pDest->item.asBlock.valuevalue->lCounter, pDest->item.asBlock.valuevalue);
#endif
}

View File

@@ -9,8 +9,10 @@
#include <hbsetup.h>
#include <extend.h>
#include <ctoharb.h>
#include <init.h>
#include <dates.h>
#include <set.h>
#if defined(__GNUC__)
#include <unistd.h>
#if defined(__DJGPP__)
@@ -19,7 +21,7 @@
#else
#include <io.h>
#endif
#include <gtapi.h> /* USE_GTAPI is checked inside gtapi.h, so that
#include <gtapi.h> /* HARBOUR_USE_GTAPI is checked inside gtapi.h, so that
we can always get the border styles */
#define ACCEPT_BUFFER_LEN 256 /*length of input buffer for ACCEPT command */
@@ -58,9 +60,7 @@ HARBOUR HB_QQOUT( void );
static SYMBOL symbols[] = {
{ "__ACCEPT" , FS_PUBLIC, HB___ACCEPT , 0 },
{ "__EJECT" , FS_PUBLIC, HB___EJECT , 0 },
{ "COL" , FS_PUBLIC, HB_COL , 0 },
{ "DEVOUT" , FS_PUBLIC, HB_DEVOUT , 0 },
{ "DEVPOS" , FS_PUBLIC, HB_DEVPOS , 0 },
{ "DISPBEGIN", FS_PUBLIC, HB_DISPBEGIN, 0 },
{ "DISPBOX" , FS_PUBLIC, HB_DISPBOX , 0 },
{ "DISPCOUNT", FS_PUBLIC, HB_DISPCOUNT, 0 },
@@ -72,9 +72,6 @@ static SYMBOL symbols[] = {
{ "OUTERR" , FS_PUBLIC, HB_OUTERR , 0 },
{ "OUTSTD" , FS_PUBLIC, HB_OUTSTD , 0 },
{ "NOSNOW" , FS_PUBLIC, HB_NOSNOW , 0 },
{ "PCOL" , FS_PUBLIC, HB_PCOL , 0 },
{ "PROW" , FS_PUBLIC, HB_PROW , 0 },
{ "ROW" , FS_PUBLIC, HB_ROW , 0 },
{ "SCROLL" , FS_PUBLIC, HB_SCROLL , 0 },
{ "SETPOS" , FS_PUBLIC, HB_SETPOS , 0 },
{ "SETPRC" , FS_PUBLIC, HB_SETPRC , 0 },
@@ -82,10 +79,14 @@ static SYMBOL symbols[] = {
{ "QQOUT" , FS_PUBLIC, HB_QQOUT , 0 }
};
HB_INIT_SYMBOLS( Console__InitSymbols );
/*
void Console__InitSymbols( void )
{
ProcessSymbols( symbols, sizeof(symbols)/sizeof( SYMBOL ) );
}
*/
static unsigned short dev_row, dev_col, p_row, p_col;
static char CrLf [ CRLF_BUFFER_LEN ];
@@ -101,7 +102,7 @@ void InitializeConsole( void )
CrLf [1] = 0;
#endif
#ifdef USE_GTAPI
#ifdef HARBOUR_USE_GTAPI
dev_row = gtWhereY();
dev_col = gtWhereX();
hb_gtSetPos( dev_row, dev_col );
@@ -114,7 +115,7 @@ void InitializeConsole( void )
USHORT hb_max_row( void )
{
#ifdef USE_GTAPI
#ifdef HARBOUR_USE_GTAPI
return hb_gtMaxRow ();
#else
return 23; /* QUESTION: Shouldn't this be 24 ? info@szelvesz.hu */
@@ -123,14 +124,14 @@ USHORT hb_max_row( void )
USHORT hb_max_col( void )
{
#ifdef USE_GTAPI
#ifdef HARBOUR_USE_GTAPI
return hb_gtMaxCol ();
#else
return 79;
#endif
}
#ifndef USE_GTAPI
#ifndef HARBOUR_USE_GTAPI
static void adjust_pos( char * fpStr, WORD uiLen, USHORT * row, USHORT * col, USHORT max_row, USHORT max_col )
{
WORD uiCount;
@@ -251,7 +252,7 @@ static void hb_outstd( char * fpStr, WORD uiLen )
while( uiCount-- )
printf( "%c", *fpPtr++ );
fflush( stdout );
#ifdef USE_GTAPI
#ifdef HARBOUR_USE_GTAPI
if( isatty( fileno( stdout ) ) )
{
dev_row = gtWhereY();
@@ -271,7 +272,7 @@ static void hb_outerr( char * fpStr, WORD uiLen )
while( uiCount-- )
fprintf( stderr, "%c", *fpPtr++ );
fflush( stderr );
#ifdef USE_GTAPI
#ifdef HARBOUR_USE_GTAPI
if( isatty( fileno( stdout ) ) )
{
dev_row = gtWhereY();
@@ -288,7 +289,7 @@ static void hb_altout( char * fpStr, WORD uiLen )
{
if( hb_set.HB_SET_CONSOLE )
{
#ifdef USE_GTAPI
#ifdef HARBOUR_USE_GTAPI
hb_gtWriteCon( fpStr, uiLen );
hb_gtGetPos( &dev_row, &dev_col );
#else
@@ -322,7 +323,7 @@ static void hb_devout( char * fpStr, WORD uiLen )
}
else
{
#ifdef USE_GTAPI
#ifdef HARBOUR_USE_GTAPI
/* Otherwise, display to console */
hb_gtWrite( fpStr, uiLen );
hb_gtGetPos( &dev_row, &dev_col );
@@ -338,7 +339,7 @@ static void hb_devout( char * fpStr, WORD uiLen )
/* Output an item to the screen */
static void hb_dispout( char * fpStr, WORD uiLen )
{
#ifdef USE_GTAPI
#ifdef HARBOUR_USE_GTAPI
/* Display to console */
hb_gtWrite( fpStr, uiLen );
hb_gtGetPos( &dev_row, &dev_col );
@@ -352,7 +353,7 @@ static void hb_dispout( char * fpStr, WORD uiLen )
void hb_setpos( USHORT row, USHORT col )
{
#ifdef USE_GTAPI
#ifdef HARBOUR_USE_GTAPI
hb_gtSetPos( row, col );
#else
USHORT count;
@@ -473,7 +474,7 @@ HARBOUR HB_DEVOUT( void ) /* writes a single value to the current device (screen
{
if( hb_pcount() > 0 )
{
#ifdef USE_GTAPI
#ifdef HARBOUR_USE_GTAPI
char fpOldColor[ CLR_STRLEN ];
if( ISCHAR(2) )
@@ -485,7 +486,7 @@ HARBOUR HB_DEVOUT( void ) /* writes a single value to the current device (screen
hb_out( 1, hb_devout );
#ifdef USE_GTAPI
#ifdef HARBOUR_USE_GTAPI
if( ISCHAR(2) )
{
hb_gtSetColorStr( fpOldColor );
@@ -498,7 +499,7 @@ HARBOUR HB_DISPOUT( void ) /* writes a single value to the current device (scree
{
if( hb_pcount() > 0 )
{
#ifdef USE_GTAPI
#ifdef HARBOUR_USE_GTAPI
char fpOldColor[ CLR_STRLEN ];
if( ISCHAR(2) )
@@ -510,7 +511,7 @@ HARBOUR HB_DISPOUT( void ) /* writes a single value to the current device (scree
hb_out( 1, hb_dispout );
#ifdef USE_GTAPI
#ifdef HARBOUR_USE_GTAPI
if( ISCHAR(2) )
{
hb_gtSetColorStr( fpOldColor );
@@ -570,7 +571,7 @@ HARBOUR HB_SCROLL( void ) /* Scrolls a screen region (requires the GT API) */
if( hb_pcount() > 5 && hb_param( 6, IT_NUMERIC ) )
h_scroll = hb_parni( 6 );
#ifdef USE_GTAPI
#ifdef HARBOUR_USE_GTAPI
hb_gtScroll( top, left, bottom, right, v_scroll, h_scroll );
#else
if( top == 0 && bottom == hb_max_row()
@@ -607,7 +608,7 @@ HARBOUR HB_COL( void ) /* Return the current screen column position (zero origin
HARBOUR HB_DISPBOX (void)
{
#ifdef USE_GTAPI
#ifdef HARBOUR_USE_GTAPI
if (ISNUM(1) && ISNUM(2) && ISNUM(3) && ISNUM(4))
{
char szOldColor [CLR_STRLEN];
@@ -739,21 +740,21 @@ HARBOUR HB_DISPBOX (void)
HARBOUR HB_DISPBEGIN (void)
{
#ifdef USE_GTAPI
#ifdef HARBOUR_USE_GTAPI
hb_gtDispBegin();
#endif
}
HARBOUR HB_DISPEND (void)
{
#ifdef USE_GTAPI
#ifdef HARBOUR_USE_GTAPI
hb_gtDispBegin();
#endif
}
HARBOUR HB_DISPCOUNT (void)
{
#ifdef USE_GTAPI
#ifdef HARBOUR_USE_GTAPI
hb_retni(hb_gtDispCount());
#else
hb_retni(0);
@@ -762,7 +763,7 @@ HARBOUR HB_DISPCOUNT (void)
HARBOUR HB_ISCOLOR (void)
{
#ifdef USE_GTAPI
#ifdef HARBOUR_USE_GTAPI
hb_retl(hb_gtIsColor());
#else
hb_retl(FALSE);
@@ -771,7 +772,7 @@ HARBOUR HB_ISCOLOR (void)
HARBOUR HB_NOSNOW (void)
{
#ifdef USE_GTAPI
#ifdef HARBOUR_USE_GTAPI
if (ISLOG(1))
{
hb_gtSetSnowFlag(hb_parl(1));

View File

@@ -22,10 +22,11 @@ static BOOL hb_fsCopy(char* szSource, char* szDest, ULONG* ulWrittenTotal);
/* and canRetry/canDefault flags */
HARBOUR HB___COPYFILE( void )
{
if ( ISCHAR(1) && ISCHAR(2) )
{
#ifdef HB_STRICT_CLIPPER_COMPATIBILITY
#ifdef HARBOUR_STRICT_CLIPPER_COMPATIBILITY
if (!hb_fsCopy(hb_parc(1), hb_parc(2)))
{
hb_retl(FALSE);
@@ -43,6 +44,7 @@ HARBOUR HB___COPYFILE( void )
}
static BOOL hb_fsCopy(char* szSource, char* szDest, ULONG* ulWrittenTotal)
{
BOOL bRetVal = FALSE;
FHANDLE fhndSource;

View File

@@ -4,7 +4,9 @@
#include <hbsetup.h>
#include <extend.h>
#include <init.h>
#include <errorapi.h>
#include <itemapi.h>
#include <set.h>
#include <dates.h>
#include <ctype.h>
@@ -13,7 +15,7 @@
#include <dos.h>
#endif
#ifndef HB_STRICT_CLIPPER_COMPATIBILITY
#ifndef HARBOUR_STRICT_CLIPPER_COMPATIBILITY
#define HB_OPTIMIZE_DTOS
#endif
@@ -38,25 +40,17 @@ HARBOUR HB_TIME( void );
HARBOUR HB_YEAR( void );
static SYMBOL symbols[] = {
{ "HB_CDOW", FS_PUBLIC, HB_CDOW, 0 },
{ "HB_CMONTH", FS_PUBLIC, HB_CMONTH, 0 },
{ "HB_CTOD", FS_PUBLIC, HB_CTOD, 0 },
{ "HB_DATE", FS_PUBLIC, HB_DATE, 0 },
{ "HB_DAY", FS_PUBLIC, HB_DAY, 0 },
{ "HB_DOW", FS_PUBLIC, HB_DOW, 0 },
{ "HB_DTOC", FS_PUBLIC, HB_DTOC, 0 },
{ "HB_DTOS", FS_PUBLIC, HB_DTOS, 0 },
{ "HB_MONTH", FS_PUBLIC, HB_MONTH, 0 },
{ "HB_SECONDS", FS_PUBLIC, HB_SECONDS, 0 },
{ "HB_STOD", FS_PUBLIC, HB_STOD, 0 },
{ "HB_TIME", FS_PUBLIC, HB_TIME, 0 },
{ "HB_YEAR", FS_PUBLIC, HB_YEAR, 0 }
};
{ "STOD", FS_PUBLIC, HB_STOD, 0 }
}; /* rest of the functions is pulled automatically in initsymb.c */
HB_INIT_SYMBOLS( Dates__InitSymbols );
/*
void Dates__InitSymbols( void )
{
ProcessSymbols( symbols, sizeof(symbols)/sizeof( SYMBOL ) );
}
*/
double hb__seconds( void )
{
@@ -418,9 +412,20 @@ HARBOUR HB_DAY( void )
if( pDate )
{
hb_dateDecode( pDate->value.lDate, &lDay, &lMonth, &lYear );
PHB_ITEM pReturn = hb_itemNew( NULL );
hb_dateDecode( pDate->item.asDate.value, &lDay, &lMonth, &lYear );
pReturn->type = IT_LONG;
pReturn->item.asLong.value =lDay;
pReturn->item.asLong.length =3;
hb_itemReturn( pReturn );
hb_itemRelease( pReturn );
/*
hb_retni( lDay );
stack.Return.wLength = 3;
* It is dengerous to manipulate the stack return value directly!
stack.Return.item.asInteger.length = 3;
*/
}
else
{
@@ -435,9 +440,20 @@ HARBOUR HB_MONTH( void )
if( pDate )
{
hb_dateDecode( pDate->value.lDate, &lDay, &lMonth, &lYear );
PHB_ITEM pReturn = hb_itemNew( NULL );
hb_dateDecode( pDate->item.asDate.value, &lDay, &lMonth, &lYear );
pReturn->type = IT_LONG;
pReturn->item.asLong.value =lMonth;
pReturn->item.asLong.length =3;
hb_itemReturn( pReturn );
hb_itemRelease( pReturn );
/*
hb_retni( lMonth );
stack.Return.wLength = 3;
* It is dengerous to manipulate the stack return value directly!
stack.Return.item.asInteger.length = 3;
*/
}
else
{
@@ -452,9 +468,20 @@ HARBOUR HB_YEAR( void )
if( pDate )
{
hb_dateDecode( pDate->value.lDate, &lDay, &lMonth, &lYear );
PHB_ITEM pReturn = hb_itemNew( NULL );
hb_dateDecode( pDate->item.asDate.value, &lDay, &lMonth, &lYear );
pReturn->type = IT_LONG;
pReturn->item.asLong.value =lYear;
pReturn->item.asLong.length =5;
hb_itemReturn( pReturn );
hb_itemRelease( pReturn );
/*
hb_retni( lYear );
stack.Return.wLength = 5;
* It is dengerous to manipulate the stack return value directly!
stack.Return.item.asInteger.length = 5;
*/
}
else
{
@@ -477,7 +504,6 @@ HARBOUR HB_TIME( void )
}
else
{
/* QUESTION: Clipper catches this at compile time! */
hb_errorRT_BASE(EG_ARG, 9999, "Incorrect number of arguments", "TIME");
}
}
@@ -522,14 +548,28 @@ HARBOUR HB_DOW( void )
if( pDate )
{
if( pDate->value.lDate )
PHB_ITEM pReturn = hb_itemNew( NULL );
pReturn->type = IT_LONG;
if( pDate->item.asDate.value )
{
hb_dateDecode( pDate->value.lDate, &lDay, &lMonth, &lYear );
hb_retni( hb_dow( lDay, lMonth, lYear ) );
hb_dateDecode( pDate->item.asDate.value, &lDay, &lMonth, &lYear );
pReturn->item.asLong.value =hb_dow( lDay, lMonth, lYear );
/* hb_retni( hb_dow( lDay, lMonth, lYear ) );
*/
}
else
hb_retni( 0 );
stack.Return.wLength = 3;
pReturn->item.asLong.value =0;
/* hb_retni( 0 );
*/
pReturn->item.asLong.length =3;
hb_itemReturn( pReturn );
hb_itemRelease( pReturn );
/*
stack.Return.item.asInteger.length = 3;
*/
}
else
{
@@ -544,15 +584,15 @@ HARBOUR HB_CMONTH( void )
if( hb_pcount() )
{
if( pDate )
{
hb_dateDecode( pDate->value.lDate, &lDay, &lMonth, &lYear );
hb_retc( hb_cmonth( lMonth ) );
}
else
{
hb_errorRT_BASE(EG_ARG, 1116, "Argument error", "CMONTH");
}
if( pDate )
{
hb_dateDecode( pDate->item.asDate.value, &lDay, &lMonth, &lYear );
hb_retc( hb_cmonth( lMonth ) );
}
else
{
hb_errorRT_BASE(EG_ARG, 1116, "Argument error", "CMONTH");
}
}
else
{
@@ -570,7 +610,7 @@ HARBOUR HB_CDOW( void )
{
if( pDate )
{
hb_dateDecode( pDate->value.lDate, &lDay, &lMonth, &lYear );
hb_dateDecode( pDate->item.asDate.value, &lDay, &lMonth, &lYear );
hb_retc( hb_cdow( hb_dow( lDay, lMonth, lYear ) ) );
}
else

View File

@@ -3,7 +3,9 @@
*/
#include <extend.h>
#include <itemapi.h>
#include <ctype.h>
#include <init.h>
extern STACK stack;
@@ -13,11 +15,13 @@ static SYMBOL symbols[] = {
{ "DESCEND", FS_PUBLIC, HB_DESCEND, 0 }
};
HB_INIT_SYMBOLS( Descend__InitSymbols );
/*
void Descend__InitSymbols( void )
{
ProcessSymbols( symbols, sizeof(symbols)/sizeof( SYMBOL ) );
}
*/
char *hb_strdescend( char *string )
{
char *s;
@@ -39,20 +43,27 @@ HARBOUR HB_DESCEND( void )
if( pItem )
{
if( IS_STRING( pItem ) )
hb_retc( hb_strdescend( pItem->value.szText ) );
hb_retc( hb_strdescend( pItem->item.asString.value ) );
else if( IS_DATE( pItem ) )
hb_retnl( 5231808 - pItem->value.lDate );
hb_retnl( 5231808 - pItem->item.asDate.value );
else if( IS_INTEGER( pItem ) )
hb_retni( -1 * pItem->value.iNumber );
hb_retni( -1 * pItem->item.asInteger.value );
else if( IS_LONG( pItem ) )
hb_retnl( -1 * pItem->value.lNumber );
hb_retnl( -1 * pItem->item.asLong.value );
else if( IS_DOUBLE( pItem ) )
{
hb_retnd( -1 * pItem->value.dNumber );
PHB_ITEM pReturn;
pReturn = hb_itemPutND( NULL, -1 * pItem->item.asDouble.value );
hb_itemReturn( pReturn );
hb_itemRelease( pReturn );
/* It is dengerous to operate on the stack directly
stack.Return.wDec = pItem->wDec;
*/
}
else if( IS_LOGICAL( pItem ) )
hb_retl( !pItem->value.iLogical );
hb_retl( !pItem->item.asLogical.value );
else
hb_retc( "NIL" );
}

View File

@@ -7,6 +7,7 @@
#include <string.h>
#include <ctype.h>
#include <itemapi.h>
#include <init.h>
#if defined(__GNUC__)
#include <sys/types.h>
@@ -90,10 +91,13 @@ static SYMBOL symbols[] = {
{ "DIRECTORY", FS_PUBLIC, HB_DIRECTORY, 0 }
};
HB_INIT_SYMBOLS( Dir__InitSymbols );
/*
void Dir__InitSymbols( void )
{
ProcessSymbols( symbols, sizeof(symbols)/sizeof( SYMBOL ) );
}
*/
static BOOL hb_strMatchDOS (char *pszString, char *pszMask);

View File

@@ -2,6 +2,9 @@
* $Id$
*/
#include <extend.h>
#include <init.h>
#ifdef __IBMCPP__
#define INCL_DOSMISC
#endif
@@ -45,10 +48,13 @@ static SYMBOL symbols[] = {
{ "VERSION", FS_PUBLIC, HB_VERSION, 0 }
};
HB_INIT_SYMBOLS( Environ__InitSymbols );
/*
void Environ__InitSymbols( void )
{
ProcessSymbols( symbols, sizeof(symbols)/sizeof( SYMBOL ) );
}
*/
HARBOUR HB_OS(void)
{
@@ -81,10 +87,10 @@ HARBOUR HB_OS(void)
system plays the major/minor version number game. Not all operating
systems work like that. So, we do a little bit of mucking around
because we've managed to work out version[] on our own. */
hb_os = "";
hb_osmajor = -2;
#else
/* TODO: add MSVC support but MSVC cannot detect any OS except Windows! */

View File

@@ -31,7 +31,7 @@ WORD hb_errLaunch( PHB_ITEM pError )
Push( pError );
Do( 1 );
return stack.Return.value.iNumber; /* TODO: hb_parnl( -1 ) */
return stack.Return.item.asInteger.value; /* TODO: hb_parnl( -1 ) */
}
void hb_errRelease( PHB_ITEM pError )
@@ -44,7 +44,7 @@ char * hb_errGetDescription( PHB_ITEM pError )
PushSymbol( GetDynSym( "DESCRIPTION" )->pSymbol );
Push( pError );
Do( 0 );
return stack.Return.value.szText;
return stack.Return.item.asString.value;
}
PHB_ITEM hb_errPutDescription( PHB_ITEM pError, char * szDescription )
@@ -62,7 +62,7 @@ char * hb_errGetFileName( PHB_ITEM pError )
PushSymbol( GetDynSym( "FILENAME" )->pSymbol );
Push( pError );
Do( 0 );
return stack.Return.value.szText;
return stack.Return.item.asString.value;
}
PHB_ITEM hb_errPutFileName( PHB_ITEM pError, char * szFileName )
@@ -79,7 +79,7 @@ USHORT hb_errGetGenCode( PHB_ITEM pError )
PushSymbol( GetDynSym( "GENCODE" )->pSymbol );
Push( pError );
Do( 0 );
return stack.Return.value.iNumber;
return stack.Return.item.asInteger.value;
}
PHB_ITEM hb_errPutGenCode( PHB_ITEM pError, USHORT uiGenCode )
@@ -96,7 +96,7 @@ char * hb_errGetOperation( PHB_ITEM pError )
PushSymbol( GetDynSym( "OPERATION" )->pSymbol );
Push( pError );
Do( 0 );
return stack.Return.value.szText;
return stack.Return.item.asString.value;
}
PHB_ITEM hb_errPutOperation( PHB_ITEM pError, char * szOperation )
@@ -113,7 +113,7 @@ USHORT hb_errGetOsCode( PHB_ITEM pError )
PushSymbol( GetDynSym( "OSCODE" )->pSymbol );
Push( pError );
Do( 0 );
return stack.Return.value.iNumber;
return stack.Return.item.asInteger.value;
}
PHB_ITEM hb_errPutOsCode( PHB_ITEM pError, USHORT uiOsCode )
@@ -130,7 +130,7 @@ USHORT hb_errGetSeverity( PHB_ITEM pError )
PushSymbol( GetDynSym( "SEVERITY" )->pSymbol );
Push( pError );
Do( 0 );
return stack.Return.value.iNumber;
return stack.Return.item.asInteger.value;
}
PHB_ITEM hb_errPutSeverity( PHB_ITEM pError, USHORT uiSeverity )
@@ -147,7 +147,7 @@ USHORT hb_errGetSubCode( PHB_ITEM pError )
PushSymbol( GetDynSym( "SUBCODE" )->pSymbol );
Push( pError );
Do( 0 );
return stack.Return.value.iNumber;
return stack.Return.item.asInteger.value;
}
PHB_ITEM hb_errPutSubCode( PHB_ITEM pError, USHORT uiSubCode )
@@ -164,7 +164,7 @@ char * hb_errGetSubSystem( PHB_ITEM pError )
PushSymbol( GetDynSym( "SUBSYSTEM" )->pSymbol );
Push( pError );
Do( 0 );
return stack.Return.value.szText;
return stack.Return.item.asString.value;
}
PHB_ITEM hb_errPutSubSystem( PHB_ITEM pError, char * szSubSystem )
@@ -181,7 +181,7 @@ USHORT hb_errGetTries( PHB_ITEM pError )
PushSymbol( GetDynSym( "TRIES" )->pSymbol );
Push( pError );
Do( 0 );
return stack.Return.value.iNumber;
return stack.Return.item.asInteger.value;
}
PHB_ITEM hb_errPutTries( PHB_ITEM pError, USHORT uiTries )
@@ -203,7 +203,7 @@ USHORT hb_errGetFlags( PHB_ITEM pError )
Push( pError );
Do( 0 );
if (stack.Return.value.iLogical) uiFlags |= EF_CANRETRY;
if (stack.Return.item.asLogical.value) uiFlags |= EF_CANRETRY;
/* ; */
@@ -211,7 +211,7 @@ USHORT hb_errGetFlags( PHB_ITEM pError )
Push( pError );
Do( 0 );
if (stack.Return.value.iLogical) uiFlags |= EF_CANSUBSTITUTE;
if (stack.Return.item.asLogical.value) uiFlags |= EF_CANSUBSTITUTE;
/* ; */
@@ -219,7 +219,7 @@ USHORT hb_errGetFlags( PHB_ITEM pError )
Push( pError );
Do( 0 );
if (stack.Return.value.iLogical) uiFlags |= EF_CANDEFAULT;
if (stack.Return.item.asLogical.value) uiFlags |= EF_CANDEFAULT;
/* ; */

View File

@@ -22,13 +22,13 @@ PHB_ITEM hb_param( WORD wParam, WORD wMask )
if( wParam <= hb_pcount() )
{
wType = ( stack.pBase + 1 + wParam )->wType;
wType = ( stack.pBase + 1 + wParam )->type;
if( ( wType & wMask ) || ( wType == IT_NIL && wMask == IT_ANY ) )
{
pLocal = stack.pBase + 1 + wParam;
if( wType & IT_BYREF )
return stack.pItems + pLocal->value.wItem;
return stack.pItems + pLocal->item.asRefer.value;
else
return pLocal;
}
@@ -51,8 +51,8 @@ char * hb_parc( WORD wParam, ... )
if( wParam <= hb_pcount() )
{
pItem = stack.pBase + 1 + wParam;
if( pItem->wType & IT_BYREF )
pItem = stack.pItems + pItem->value.wItem;
if( pItem->type & IT_BYREF )
pItem = stack.pItems + pItem->item.asRefer.value;
if( IS_ARRAY( pItem ) )
{
@@ -62,7 +62,7 @@ char * hb_parc( WORD wParam, ... )
return "";
}
else if( IS_STRING( pItem ) )
return pItem->value.szText;
return pItem->item.asString.value;
else
return "";
@@ -83,8 +83,8 @@ ULONG hb_parclen( WORD wParam, ... )
if( wParam <= hb_pcount() )
{
pItem = stack.pBase + 1 + wParam;
if( pItem->wType & IT_BYREF )
pItem = stack.pItems + pItem->value.wItem;
if( pItem->type & IT_BYREF )
pItem = stack.pItems + pItem->item.asRefer.value;
if( IS_ARRAY( pItem ) )
{
@@ -94,7 +94,7 @@ ULONG hb_parclen( WORD wParam, ... )
return 0;
}
else if( IS_STRING( pItem ) )
return pItem->wLength;
return pItem->item.asString.length;
else
return 0;
@@ -116,16 +116,16 @@ char * hb_pards( WORD wParam, ... )
if( wParam <= hb_pcount() )
{
pItem = stack.pBase + 1 + wParam;
if( pItem->wType & IT_BYREF )
pItem = stack.pItems + pItem->value.wItem;
if( pItem->type & IT_BYREF )
pItem = stack.pItems + pItem->item.asRefer.value;
if( IS_ARRAY( pItem ) && wArrayIndex )
/* TODO: implement wArrayIndex use when retrieving an array element */
return " ";
else if( IS_DATE( pItem ) && pItem->value.lDate > 0 )
else if( IS_DATE( pItem ) && pItem->item.asDate.value > 0 )
{
hb_dateDecode( pItem->value.lDate, &lDay, &lMonth, &lYear );
hb_dateDecode( pItem->item.asDate.value, &lDay, &lMonth, &lYear );
stack.szDate[ 0 ] = ( lYear / 1000 ) + '0';
stack.szDate[ 1 ] = ( ( lYear % 1000 ) / 100 ) + '0';
@@ -160,15 +160,15 @@ int hb_parl( WORD wParam, ... )
if( wParam <= hb_pcount() )
{
pItem = stack.pBase + 1 + wParam;
if( pItem->wType & IT_BYREF )
pItem = stack.pItems + pItem->value.wItem;
if( pItem->type & IT_BYREF )
pItem = stack.pItems + pItem->item.asRefer.value;
if( IS_ARRAY( pItem ) && wArrayIndex )
/* TODO: implement wArrayIndex use when retrieving an array element */
return 0;
else if( IS_LOGICAL( pItem ) )
return pItem->value.iLogical;
return pItem->item.asLogical.value;
else
return 0;
@@ -189,21 +189,21 @@ double hb_parnd( WORD wParam, ... )
if( wParam <= hb_pcount() )
{
pItem = stack.pBase + 1 + wParam;
if( pItem->wType & IT_BYREF )
pItem = stack.pItems + pItem->value.wItem;
if( pItem->type & IT_BYREF )
pItem = stack.pItems + pItem->item.asRefer.value;
if( IS_ARRAY( pItem ) && wArrayIndex )
/* TODO: implement wArrayIndex use when retrieving an array element */
return 0;
else if( IS_INTEGER( pItem ) )
return pItem->value.iNumber;
return pItem->item.asInteger.value;
else if( IS_LONG( pItem ) )
return pItem->value.lNumber;
return pItem->item.asLong.value;
else if( IS_DOUBLE( pItem ) )
return pItem->value.dNumber;
return pItem->item.asDouble.value;
else
return 0;
@@ -224,21 +224,21 @@ int hb_parni( WORD wParam, ... )
if( wParam <= hb_pcount() )
{
pItem = stack.pBase + 1 + wParam;
if( pItem->wType & IT_BYREF )
pItem = stack.pItems + pItem->value.wItem;
if( pItem->type & IT_BYREF )
pItem = stack.pItems + pItem->item.asRefer.value;
if( IS_ARRAY( pItem ) && wArrayIndex )
/* TODO: implement wArrayIndex use when retrieving an array element */
return 0;
else if( IS_INTEGER( pItem ) )
return pItem->value.iNumber;
return pItem->item.asInteger.value;
else if( IS_LONG( pItem ) )
return pItem->value.lNumber;
return pItem->item.asLong.value;
else if( IS_DOUBLE( pItem ) )
return pItem->value.dNumber;
return pItem->item.asDouble.value;
else
return 0;
@@ -259,21 +259,21 @@ long hb_parnl( WORD wParam, ... )
if( wParam <= hb_pcount() )
{
pItem = stack.pBase + 1 + wParam;
if( pItem->wType & IT_BYREF )
pItem = stack.pItems + pItem->value.wItem;
if( pItem->type & IT_BYREF )
pItem = stack.pItems + pItem->item.asRefer.value;
if( IS_ARRAY( pItem ) && wArrayIndex )
/* TODO: implement wArrayIndex use when retrieving an array element */
return 0;
else if( IS_INTEGER( pItem ) )
return (long) pItem->value.iNumber;
return (long) pItem->item.asInteger.value;
else if( IS_LONG( pItem ) )
return pItem->value.lNumber;
return pItem->item.asLong.value;
else if( IS_DOUBLE( pItem ) )
return (long) pItem->value.dNumber;
return (long) pItem->item.asDouble.value;
else
return 0;
@@ -299,11 +299,11 @@ int hb_parinfa( int iParamNum, ULONG uiArrayIndex )
WORD hb_parinfo( WORD wParam )
{
if( ! wParam )
return stack.pBase->wParams;
return stack.pBase->item.asSymbol.paramcnt;
else
{
if( wParam <= hb_pcount() )
return ( stack.pBase + 1 + wParam )->wType;
return ( stack.pBase + 1 + wParam )->type;
else
return 0;
}
@@ -311,7 +311,7 @@ WORD hb_parinfo( WORD wParam )
WORD hb_pcount( void )
{
return stack.pBase->wParams;
return stack.pBase->item.asSymbol.paramcnt;
}
void hb_ret( void )
@@ -329,20 +329,20 @@ void hb_retc( char * szText )
ULONG ulLen = strlen( szText );
ItemRelease( &stack.Return );
stack.Return.wType = IT_STRING;
stack.Return.wLength = ulLen;
stack.Return.value.szText = ( char * ) hb_xgrab( ulLen + 1 );
strcpy( stack.Return.value.szText, szText );
stack.Return.type = IT_STRING;
stack.Return.item.asString.length = ulLen;
stack.Return.item.asString.value = ( char * ) hb_xgrab( ulLen + 1 );
strcpy( stack.Return.item.asString.value, szText );
}
void hb_retclen( char * szText, ULONG ulLen )
{
ItemRelease( &stack.Return );
stack.Return.wType = IT_STRING;
stack.Return.wLength = ulLen;
stack.Return.value.szText = ( char * ) hb_xgrab( ulLen + 1 );
memcpy( stack.Return.value.szText, szText, ulLen );
stack.Return.value.szText[ ulLen ] = 0;
stack.Return.type = IT_STRING;
stack.Return.item.asString.length = ulLen;
stack.Return.item.asString.value = ( char * ) hb_xgrab( ulLen + 1 );
memcpy( stack.Return.item.asString.value, szText, ulLen );
stack.Return.item.asString.value[ ulLen ] = 0;
}
void hb_retds( char * szDate ) /* szDate must have yyyymmdd format */
@@ -362,48 +362,50 @@ void hb_retds( char * szDate ) /* szDate must have yyyymmdd format */
ItemRelease( &stack.Return );
stack.Return.wType = IT_DATE;
stack.Return.wLength = 8;
stack.Return.type = IT_DATE;
stack.Return.item.asDate.length = 8;
/* QUESTION: Is this ok ? we are going to use a long to store the date */
/* QUESTION: What happens if we use sizeof( LONG ) instead ? */
/* QUESTION: Would it break Clipper language code ? */
stack.Return.value.lDate = hb_dateEncode( lDay, lMonth, lYear );
stack.Return.item.asDate.value = hb_dateEncode( lDay, lMonth, lYear );
}
void hb_retnd( double dNumber )
{
ItemRelease( &stack.Return );
stack.Return.wType = IT_DOUBLE;
if( dNumber > 10000000000.0 ) stack.Return.wLength = 20;
else stack.Return.wLength = 10;
stack.Return.wDec = hb_set.HB_SET_DECIMALS;
stack.Return.value.dNumber = dNumber;
stack.Return.type = IT_DOUBLE;
if( dNumber > 10000000000.0 )
stack.Return.item.asDouble.length = 20;
else
stack.Return.item.asDouble.length = 10;
stack.Return.item.asDouble.decimal = hb_set.HB_SET_DECIMALS;
stack.Return.item.asDouble.value = dNumber;
}
void hb_retni( int iNumber )
{
ItemRelease( &stack.Return );
stack.Return.wType = IT_INTEGER;
stack.Return.wLength = 10;
stack.Return.wDec = 0;
stack.Return.value.iNumber = iNumber;
stack.Return.type = IT_INTEGER;
stack.Return.item.asInteger.length = 10;
stack.Return.item.asInteger.decimal = 0;
stack.Return.item.asInteger.value = iNumber;
}
void hb_retl( int iTrueFalse )
{
ItemRelease( &stack.Return );
stack.Return.wType = IT_LOGICAL;
stack.Return.wLength = 3;
stack.Return.value.iLogical = iTrueFalse;
stack.Return.type = IT_LOGICAL;
stack.Return.item.asLogical.length = 3;
stack.Return.item.asLogical.value = iTrueFalse;
}
void hb_retnl( long lNumber )
{
ItemRelease( &stack.Return );
stack.Return.wType = IT_LONG;
stack.Return.wLength = 10;
stack.Return.wDec = 0;
stack.Return.value.lNumber = lNumber;
stack.Return.type = IT_LONG;
stack.Return.item.asLong.length = 10;
stack.Return.item.asLong.decimal = 0;
stack.Return.item.asLong.value = lNumber;
}
void hb_storc( char * szText, WORD wParam, ... )
@@ -428,12 +430,12 @@ void hb_storc( char * szText, WORD wParam, ... )
if( IS_BYREF( pItem ) )
{
ulLen = strlen( szText );
pItemRef = stack.pItems + pItem->value.wItem;
pItemRef = stack.pItems + pItem->item.asRefer.value;
ItemRelease( pItemRef );
pItemRef->wType = IT_STRING;
pItemRef->wLength = ulLen;
pItemRef->value.szText = ( char * ) hb_xgrab( ulLen + 1 );
strcpy( pItemRef->value.szText, szText );
pItemRef->type = IT_STRING;
pItemRef->item.asString.length = ulLen;
pItemRef->item.asString.value = ( char * ) hb_xgrab( ulLen + 1 );
strcpy( pItemRef->item.asString.value, szText );
}
}
}
@@ -458,13 +460,13 @@ void hb_storclen( char * fixText, WORD wLength, WORD wParam, ... )
if( IS_BYREF( pItem ) )
{
pItemRef = stack.pItems + pItem->value.wItem;
pItemRef = stack.pItems + pItem->item.asRefer.value;
ItemRelease( pItemRef );
pItemRef->wType = IT_STRING;
pItemRef->wLength = wLength;
pItemRef->value.szText = ( char * ) hb_xgrab( wLength + 1 );
memcpy( pItemRef->value.szText, fixText, wLength );
pItemRef->value.szText[ wLength ] = '\0';
pItemRef->type = IT_STRING;
pItemRef->item.asString.length = wLength;
pItemRef->item.asString.value = ( char * ) hb_xgrab( wLength + 1 );
memcpy( pItemRef->item.asString.value, fixText, wLength );
pItemRef->item.asString.value[ wLength ] = '\0';
}
}
}
@@ -501,11 +503,11 @@ void hb_stords( char * szDate, WORD wParam, ... ) /* szDate must have yyyymmdd f
if( IS_BYREF( pItem ) )
{
pItemRef = stack.pItems + pItem->value.wItem;
pItemRef = stack.pItems + pItem->item.asRefer.value;
ItemRelease( pItemRef );
pItemRef->wType = IT_DATE;
pItemRef->wLength = 8;
pItemRef->value.lDate = hb_dateEncode( lDay, lMonth, lYear );
pItemRef->type = IT_DATE;
pItemRef->item.asDate.length = 8;
pItemRef->item.asDate.value = hb_dateEncode( lDay, lMonth, lYear );
}
}
}
@@ -530,11 +532,11 @@ void hb_storl( int iLogical, WORD wParam, ... )
if( IS_BYREF( pItem ) )
{
pItemRef = stack.pItems + pItem->value.wItem;
pItemRef = stack.pItems + pItem->item.asRefer.value;
ItemRelease( pItemRef );
pItemRef->wType = IT_LOGICAL;
pItemRef->wLength = 3;
pItemRef->value.iLogical = iLogical;
pItemRef->type = IT_LOGICAL;
pItemRef->item.asLogical.length = 3;
pItemRef->item.asLogical.value = iLogical;
}
}
}
@@ -559,12 +561,12 @@ void hb_storni( int iValue, WORD wParam, ... )
if( IS_BYREF( pItem ) )
{
pItemRef = stack.pItems + pItem->value.wItem;
pItemRef = stack.pItems + pItem->item.asRefer.value;
ItemRelease( pItemRef );
pItemRef->wType = IT_INTEGER;
pItemRef->wLength = 10;
pItemRef->wDec = 0;
pItemRef->value.iNumber = iValue;
pItemRef->type = IT_INTEGER;
pItemRef->item.asInteger.length = 10;
pItemRef->item.asInteger.decimal = 0;
pItemRef->item.asInteger.value = iValue;
}
}
}
@@ -589,12 +591,12 @@ void hb_stornl( long lValue, WORD wParam, ... )
if( IS_BYREF( pItem ) )
{
pItemRef = stack.pItems + pItem->value.wItem;
pItemRef = stack.pItems + pItem->item.asRefer.value;
ItemRelease( pItemRef );
pItemRef->wType = IT_LONG;
pItemRef->wLength = 10;
pItemRef->wDec = 0;
pItemRef->value.lNumber = lValue;
pItemRef->type = IT_LONG;
pItemRef->item.asLong.length = 10;
pItemRef->item.asLong.decimal = 0;
pItemRef->item.asLong.value = lValue;
}
}
}
@@ -619,13 +621,15 @@ void hb_stornd( double dValue, WORD wParam, ... )
if( IS_BYREF( pItem ) )
{
pItemRef = stack.pItems + pItem->value.wItem;
pItemRef = stack.pItems + pItem->item.asRefer.value;
ItemRelease( pItemRef );
pItemRef->wType = IT_DOUBLE;
if( dValue > 10000000000.0 ) pItemRef->wLength = 20;
else pItemRef->wLength = 10;
pItemRef->wDec = hb_set.HB_SET_DECIMALS;
pItemRef->value.dNumber = dValue;
pItemRef->type = IT_DOUBLE;
if( dValue > 10000000000.0 )
pItemRef->item.asDouble.length = 20;
else
pItemRef->item.asDouble.length = 10;
pItemRef->item.asDouble.decimal = hb_set.HB_SET_DECIMALS;
pItemRef->item.asDouble.value = dValue;
}
}
}

View File

@@ -2,7 +2,8 @@
* $Id$
*/
#include <hbsetup.h>
#include <extend.h>
#include <init.h>
#include <filesys.h>
#include <string.h>
@@ -149,10 +150,13 @@ static SYMBOL symbols[] = {
{ "W2BIN" , FS_PUBLIC, HB_W2BIN , 0 }
};
HB_INIT_SYMBOLS( Files__InitSymbols );
/*
void Files__InitSymbols( void )
{
ProcessSymbols( symbols, sizeof(symbols)/sizeof( SYMBOL ) );
}
*/
/* Convert HARBOUR flags to IO subsystem flags */
@@ -580,7 +584,7 @@ HARBOUR HB_FWRITE( void )
if( arg1_it && arg2_it )
{
bytes = (arg3_it ? hb_parnl(3) : arg2_it->wLength );
bytes = (arg3_it ? hb_parnl(3) : hb_parclen( 2 ) );
bytes = hb_fsWrite( hb_parni(1), (BYTEP)hb_parc(2), bytes);
}
@@ -659,12 +663,12 @@ HARBOUR HB_FILE( void )
if( arg1_it )
{
/*TODO: Check if F_OK is defined in all compilers */
/*TODO: Check if F_OK is defined in all compilers */
#ifdef OS_UNIX_COMPATIBLE
hb_retl( access(hb_parc(1), F_OK) == 0 );
#else
#else
hb_retl( access(hb_parc(1), 0) == 0 );
#endif
#endif
}
else hb_retl(0);
return;

View File

@@ -30,8 +30,8 @@ void hb_gtInit(void)
int hb_gtBox (USHORT uiTop, USHORT uiLeft, USHORT uiBottom, USHORT uiRight, char* pbyFrame)
{
BYTE pszBox [10];
BYTE cPadChar;
char pszBox [10];
char cPadChar;
USHORT uiRow = uiTop;
USHORT uiCol = uiLeft;
@@ -273,6 +273,7 @@ int hb_gtScrDim(USHORT * uipHeight, USHORT * uipWidth)
int hb_gtSetBlink(BOOL bBlink)
{
HB_SYMBOL_UNUSED( bBlink );
return(0);
}
@@ -284,6 +285,8 @@ int hb_gtSetCursor(USHORT uiCursorShape)
int hb_gtSetMode(USHORT uiRows, USHORT uiCols)
{
HB_SYMBOL_UNUSED( uiRows );
HB_SYMBOL_UNUSED( uiCols );
return(0);
}
@@ -302,6 +305,7 @@ int hb_gtSetPos(USHORT uiRow, USHORT uiCol)
int hb_gtSetSnowFlag(BOOL bNoSnow)
{
HB_SYMBOL_UNUSED( bNoSnow );
return(0);
}

View File

@@ -4,21 +4,25 @@
#include <extend.h>
#include <ctype.h>
#include <init.h>
#define CHR_HARD1 (char)141
#define CHR_HARD2 (char)10
HARBOUR HB_HARDCR(void);
static SYMBOL symbols[] = {
{ "HARDCR", FS_PUBLIC, HB_HARDCR, 0 }
};
HB_INIT_SYMBOLS( HardCR__InitSymbols );
/*
void HardCR__InitSymbols( void )
{
ProcessSymbols( symbols, sizeof(symbols)/sizeof( SYMBOL ) );
}
*/
char *hb_hardcr( char *string )
{

View File

@@ -96,10 +96,10 @@ PHB_ITEM hb_itemNew( PHB_ITEM pNull )
PHB_ITEM pItem = ( PHB_ITEM ) hb_xgrab( sizeof( HB_ITEM ) );
if( pNull ) /* keep the C compiler silent */
pNull->wType = 0; /* keep the C compiler silent */
pNull->type = 0; /* keep the C compiler silent */
memset( pItem, 0, sizeof( HB_ITEM ) );
pItem->wType = IT_NIL;
pItem->type = IT_NIL;
return pItem;
}
@@ -158,10 +158,10 @@ PHB_ITEM hb_itemPutC( PHB_ITEM pItem, char * szText )
else
pItem = hb_itemNew(0);
pItem->wType = IT_STRING;
pItem->wLength = strlen( szText );
pItem->value.szText = ( char * ) hb_xgrab( pItem->wLength + 1 );
strcpy( pItem->value.szText, szText );
pItem->type = IT_STRING;
pItem->item.asString.length = strlen( szText );
pItem->item.asString.value = ( char * ) hb_xgrab( pItem->item.asString.length + 1 );
strcpy( pItem->item.asString.value, szText );
return pItem;
}
@@ -172,11 +172,11 @@ PHB_ITEM hb_itemPutCL( PHB_ITEM pItem, char * nszText, ULONG ulLen )
else
pItem = hb_itemNew(0);
pItem->wType = IT_STRING;
pItem->wLength = ulLen;
pItem->value.szText = ( char * ) hb_xgrab( ulLen + 1 );
memcpy( pItem->value.szText, nszText, ulLen );
pItem->value.szText[ ulLen ] = 0;
pItem->type = IT_STRING;
pItem->item.asString.length = ulLen;
pItem->item.asString.value = ( char * ) hb_xgrab( ulLen + 1 );
memcpy( pItem->item.asString.value, nszText, ulLen );
pItem->item.asString.value[ ulLen ] = 0;
return pItem;
}
@@ -185,9 +185,9 @@ char *hb_itemGetC( PHB_ITEM pItem )
{
if( pItem && IS_STRING( pItem ) )
{
char *szResult = (char *) hb_xgrab(pItem->wLength + 1);
memcpy(szResult, pItem->value.szText, pItem->wLength);
szResult[pItem->wLength] = 0;
char *szResult = (char *) hb_xgrab(pItem->item.asString.length + 1);
memcpy(szResult, pItem->item.asString.value, pItem->item.asString.length);
szResult[ pItem->item.asString.length ] = 0;
return szResult;
}
@@ -200,9 +200,9 @@ ULONG hb_itemCopyC( PHB_ITEM pItem, char *szBuffer, ULONG ulLen )
if( pItem && IS_STRING(pItem) )
{
if( !ulLen )
ulLen = pItem->wLength;
ulLen = pItem->item.asString.length;
memcpy(szBuffer, pItem->value.szText, ulLen);
memcpy(szBuffer, pItem->item.asString.value, ulLen);
return ulLen;
}
else
@@ -226,7 +226,7 @@ char *hb_itemGetDS( PHB_ITEM pItem, char *szDate )
if( pItem && IS_DATE(pItem) )
{
long lDay, lMonth, lYear;
hb_dateDecode(pItem->value.lDate, &lDay, &lMonth, &lYear);
hb_dateDecode(pItem->item.asDate.value, &lDay, &lMonth, &lYear);
szDate[ 0 ] = ( lYear / 1000 ) + '0';
szDate[ 1 ] = ( ( lYear % 1000 ) / 100 ) + '0';
@@ -250,7 +250,7 @@ BOOL hb_itemGetL( PHB_ITEM pItem )
{
if( pItem && IS_LOGICAL(pItem) )
{
return pItem->value.iLogical;
return pItem->item.asLogical.value;
}
else
return FALSE;
@@ -260,11 +260,11 @@ double hb_itemGetND( PHB_ITEM pItem )
{
if( pItem )
{
switch( pItem->wType )
switch( pItem->type )
{
case IT_INTEGER: return pItem->value.iNumber;
case IT_DOUBLE: return pItem->value.dNumber;
case IT_LONG: return pItem->value.lNumber;
case IT_INTEGER: return pItem->item.asInteger.value;
case IT_DOUBLE: return pItem->item.asDouble.value;
case IT_LONG: return pItem->item.asLong.value;
default: return 0;
}
}
@@ -276,11 +276,11 @@ long hb_itemGetNL( PHB_ITEM pItem )
{
if( pItem )
{
switch( pItem->wType )
switch( pItem->type )
{
case IT_INTEGER: return pItem->value.iNumber;
case IT_DOUBLE: return pItem->value.dNumber;
case IT_LONG: return pItem->value.lNumber;
case IT_INTEGER: return pItem->item.asInteger.value;
case IT_DOUBLE: return pItem->item.asDouble.value;
case IT_LONG: return pItem->item.asLong.value;
default: return 0;
}
}
@@ -311,12 +311,12 @@ PHB_ITEM hb_itemPutDS( PHB_ITEM pItem, char *szDate )
+ ((szDate[ 2 ] - '0') * 10) + (szDate[ 3 ] - '0');
ItemRelease( pItem );
pItem->wType = IT_DATE;
pItem->wLength = 8;
pItem->type = IT_DATE;
pItem->item.asDate.length = 8;
/* QUESTION: Is this ok ? we are going to use a long to store the date */
/* QUESTION: What happens if we use sizeof( LONG ) instead ? */
/* QUESTION: Would it break Clipper language code ? */
pItem->value.lDate = hb_dateEncode(lDay, lMonth, lYear);
pItem->item.asDate.value = hb_dateEncode(lDay, lMonth, lYear);
return pItem;
}
@@ -328,9 +328,9 @@ PHB_ITEM hb_itemPutL( PHB_ITEM pItem, BOOL bValue )
else
pItem = hb_itemNew(0);
pItem->wType = IT_LOGICAL;
pItem->wLength = 3;
pItem->value.iLogical = bValue;
pItem->type = IT_LOGICAL;
pItem->item.asLogical.length = 3;
pItem->item.asLogical.value = bValue;
return pItem;
}
@@ -341,11 +341,11 @@ PHB_ITEM hb_itemPutND( PHB_ITEM pItem, double dNumber )
else
pItem = hb_itemNew(0);
pItem->wType = IT_DOUBLE;
if( dNumber > 10000000000.0 ) pItem->wLength = 20;
else pItem->wLength = 10;
pItem->wDec = hb_set.HB_SET_DECIMALS;
pItem->value.dNumber = dNumber;
pItem->type = IT_DOUBLE;
if( dNumber > 10000000000.0 ) pItem->item.asDouble.length = 20;
else pItem->item.asDouble.length = 10;
pItem->item.asDouble.decimal = hb_set.HB_SET_DECIMALS;
pItem->item.asDouble.value = dNumber;
return pItem;
}
@@ -356,10 +356,9 @@ PHB_ITEM hb_itemPutNL( PHB_ITEM pItem, long lNumber )
else
pItem = hb_itemNew(0);
pItem->wType = IT_DOUBLE;
pItem->wLength = 10;
pItem->wDec = hb_set.HB_SET_DECIMALS;
pItem->value.lNumber = lNumber;
pItem->type = IT_LONG;
pItem->item.asLong.length = 10;
pItem->item.asLong.value = lNumber;
return pItem;
}
@@ -367,10 +366,10 @@ ULONG hb_itemSize( PHB_ITEM pItem )
{
if( pItem )
{
switch( pItem->wType )
switch( pItem->type )
{
case IT_ARRAY: return hb_arrayLen(pItem);
case IT_STRING: return pItem->wLength;
case IT_STRING: return pItem->item.asString.length;
}
}
return 0;
@@ -378,5 +377,5 @@ ULONG hb_itemSize( PHB_ITEM pItem )
WORD hb_itemType( PHB_ITEM pItem )
{
return pItem->wType;
return pItem->type;
}

View File

@@ -2,6 +2,8 @@
* $Id$
*/
#include <extend.h>
#include <init.h>
#include <set.h>
#include <errorapi.h>
#include <math.h>
@@ -19,21 +21,16 @@ HARBOUR HB_ROUND( void );
HARBOUR HB_SQRT( void );
static SYMBOL symbols[] = {
{ "ABS" , FS_PUBLIC, HB_ABS , 0 },
{ "EXP" , FS_PUBLIC, HB_EXP , 0 },
{ "INT" , FS_PUBLIC, HB_INT , 0 },
{ "LOG" , FS_PUBLIC, HB_LOG , 0 },
{ "MAX" , FS_PUBLIC, HB_MAX , 0 },
{ "MIN" , FS_PUBLIC, HB_MIN , 0 },
{ "MOD" , FS_PUBLIC, HB_MOD , 0 },
{ "ROUND", FS_PUBLIC, HB_ROUND, 0 },
{ "SQRT" , FS_PUBLIC, HB_SQRT , 0 }
};
{ "MOD" , FS_PUBLIC, HB_MOD , 0 }
}; /* The rest of functions is pulled automatically by initsymb.c */
HB_INIT_SYMBOLS( Math__InitSymbols );
/*
void Math__InitSymbols( void )
{
ProcessSymbols( symbols, sizeof(symbols)/sizeof( SYMBOL ) );
}
*/
HARBOUR HB_ABS( void )
{
@@ -41,28 +38,28 @@ HARBOUR HB_ABS( void )
{
PHB_ITEM pNumber = hb_param(1, IT_NUMERIC);
if( pNumber ) switch( pNumber->wType )
if( pNumber ) switch( pNumber->type )
{
case IT_INTEGER:
if( pNumber->value.iNumber >= 0 )
hb_retni( pNumber->value.iNumber );
if( pNumber->item.asInteger.value >= 0 )
hb_retni( pNumber->item.asInteger.value );
else
hb_retni( -pNumber->value.iNumber );
hb_retni( -pNumber->item.asInteger.value );
break;
case IT_LONG:
if( pNumber->value.lNumber >= 0 )
hb_retnl( pNumber->value.lNumber );
if( pNumber->item.asLong.value >= 0 )
hb_retnl( pNumber->item.asLong.value );
else
hb_retnl( -pNumber->value.lNumber );
hb_retnl( -pNumber->item.asLong.value );
break;
case IT_DOUBLE:
if( pNumber->value.dNumber >= 0.0 )
hb_retnd( pNumber->value.dNumber );
if( pNumber->item.asDouble.value >= 0.0 )
hb_retnd( pNumber->item.asDouble.value );
else
hb_retnd( -pNumber->value.dNumber );
stack.Return.wDec = pNumber->wDec;
hb_retnd( -pNumber->item.asDouble.value );
stack.Return.item.asDouble.decimal = pNumber->item.asDouble.decimal;
}
else
{
@@ -86,7 +83,7 @@ HARBOUR HB_EXP( void )
{
hb_retnd( exp( hb_parnd( 1 ) ) );
/* Always set default number of decimals after EXP() */
stack.Return.wDec = hb_set.HB_SET_DECIMALS;
stack.Return.item.asDouble.decimal = hb_set.HB_SET_DECIMALS;
}
else
{
@@ -129,10 +126,10 @@ HARBOUR HB_LOG( void )
double dNumber = hb_parnd( 1 );
hb_retnd( log( dNumber ) );
/* Always set default number of decimals after LOG() */
stack.Return.wDec = hb_set.HB_SET_DECIMALS;
stack.Return.item.asDouble.decimal = hb_set.HB_SET_DECIMALS;
if( dNumber <= 0.0 )
/* Indicate overflow if called with an invalid argument */
stack.Return.wLength = 99;
stack.Return.item.asDouble.length = 99;
}
else
{
@@ -153,18 +150,18 @@ HARBOUR HB_MAX( void )
{
PHB_ITEM p1 = hb_param(1, IT_NUMERIC + IT_DATE), p2 = hb_param(2, IT_NUMERIC + IT_DATE);
if( p1 && p2 && p1->wType == p2->wType )
if( p1 && p2 && p1->type == p2->type )
{
if( p1->wType == IT_DATE )
if( p1->type == IT_DATE )
{
long l1 = p1->value.lDate, l2 = p2->value.lDate;
long l1 = p1->item.asDate.value, l2 = p2->item.asDate.value;
hb_retds(l1 > l2? hb_pards(1): hb_pards(2));
}
else
{
double d1 = hb_parnd(1), d2 = hb_parnd(2);
hb_retnd(d1 > d2? d1: d2);
stack.Return.wDec = (d1 > d2? p1->wDec : p2->wDec);
stack.Return.item.asDouble.decimal = (d1 > d2? p1->item.asDouble.decimal : p2->item.asDouble.decimal);
}
}
else
@@ -186,18 +183,18 @@ HARBOUR HB_MIN( void )
{
PHB_ITEM p1 = hb_param(1, IT_NUMERIC + IT_DATE), p2 = hb_param(2, IT_NUMERIC + IT_DATE);
if( p1 && p2 && p1->wType == p2->wType )
if( p1 && p2 && p1->type == p2->type )
{
if( p1->wType == IT_DATE )
if( p1->type == IT_DATE )
{
long l1 = p1->value.lDate, l2 = p2->value.lDate;
long l1 = p1->item.asDate.value, l2 = p2->item.asDate.value;
hb_retds(l1 < l2? hb_pards(1): hb_pards(2));
}
else
{
double d1 = hb_parnd(1), d2 = hb_parnd(2);
hb_retnd(d1 < d2? d1: d2);
stack.Return.wDec = (d1 < d2? p1->wDec : p2->wDec);
stack.Return.item.asDouble.decimal = (d1 < d2? p1->item.asDouble.decimal : p2->item.asDouble.decimal);
}
}
else
@@ -280,7 +277,7 @@ HARBOUR HB_ROUND( void )
hb_xfree( szResult );
}
hb_retnd( dResult );
stack.Return.wDec = iDec;
stack.Return.item.asDouble.decimal = iDec;
}
else
{
@@ -312,7 +309,7 @@ HARBOUR HB_SQRT( void )
/* Clipper doesn't error! */
hb_retnd(0);
/* Always set default number of decimals after SQRT() */
stack.Return.wDec = hb_set.HB_SET_DECIMALS;
stack.Return.item.asDouble.decimal = hb_set.HB_SET_DECIMALS;
}
else
{

View File

@@ -3,6 +3,7 @@
*/
#include <extend.h>
#include <init.h>
#include <ctype.h>
#define CHR_HARD1 (char)141
@@ -17,11 +18,13 @@ static SYMBOL symbols[] = {
{ "MEMOTRAN", FS_PUBLIC, HB_MEMOTRAN, 0 }
};
HB_INIT_SYMBOLS( Memotran__InitSymbols );
/*
void Memotran__InitSymbols( void )
{
ProcessSymbols( symbols, sizeof(symbols)/sizeof( SYMBOL ) );
}
*/
char *hb_memotran( char *string, char *hardcr, char *softcr )
{

View File

@@ -13,6 +13,7 @@
#include <ctype.h>
#include <extend.h>
#include <init.h>
#include <errorapi.h>
#include <fcntl.h>
#include <sys/stat.h>
@@ -38,28 +39,31 @@ static SYMBOL symbols[] = {
{ "SET" , FS_PUBLIC, HB_SET , 0 }
};
HB_INIT_SYMBOLS( Set__InitSymbols );
/*
void Set__InitSymbols( void )
{
ProcessSymbols( symbols, sizeof(symbols)/sizeof( SYMBOL ) );
}
*/
static BOOL set_logical (PHB_ITEM pItem)
{
BOOL logical = FALSE;
if (IS_LOGICAL (pItem)) logical = pItem->value.iLogical;
if (IS_LOGICAL (pItem)) logical = pItem->item.asLogical.value;
else if (IS_STRING (pItem))
{
if (pItem->wLength == 2)
if (pItem->item.asString.length == 2)
{
if (toupper (pItem->value.szText [0]) == 'O'
&& toupper (pItem->value.szText [1]) == 'N')
if (toupper (pItem->item.asString.value [0]) == 'O'
&& toupper (pItem->item.asString.value [1]) == 'N')
logical = TRUE;
}
else if (pItem->wLength == 3)
else if (pItem->item.asString.length == 3)
{
if (toupper (pItem->value.szText [0]) == 'O'
&& toupper (pItem->value.szText [1]) == 'F'
&& toupper (pItem->value.szText [2]) == 'F')
if (toupper (pItem->item.asString.value [0]) == 'O'
&& toupper (pItem->item.asString.value [1]) == 'F'
&& toupper (pItem->item.asString.value [2]) == 'F')
logical = FALSE;
}
}
@@ -69,9 +73,9 @@ static BOOL set_logical (PHB_ITEM pItem)
static int set_number (PHB_ITEM pItem, int old_value)
{
int number;
if (IS_INTEGER (pItem)) number = pItem->value.iNumber;
else if (IS_LONG (pItem)) number = (int)pItem->value.lNumber;
else if (IS_DOUBLE (pItem)) number = (int)pItem->value.dNumber;
if (IS_INTEGER (pItem)) number = pItem->item.asInteger.value;
else if (IS_LONG (pItem)) number = (int)pItem->item.asLong.value;
else if (IS_DOUBLE (pItem)) number = (int)pItem->item.asDouble.value;
else number = old_value;
return (number);
}
@@ -81,10 +85,10 @@ static char * set_string (PHB_ITEM pItem, char * old_str)
char * string;
if (IS_STRING (pItem))
{
int size = pItem->wLength;
int size = pItem->item.asString.length;
if (old_str) string = (char*)hb_xrealloc (old_str, size + 1);
else string = (char*)hb_xgrab (size + 1);
memcpy (string, pItem->value.szText, size);
memcpy (string, pItem->item.asString.value, size);
string [size] = 0;
}
else string = old_str;
@@ -92,7 +96,7 @@ static char * set_string (PHB_ITEM pItem, char * old_str)
}
static void close_binary( int handle )
{
{
#if defined(OS_UNIX_COMPATIBLE)
fchmod( handle, S_IRUSR|S_IWUSR );
#endif
@@ -105,7 +109,7 @@ static void close_text (int handle)
fchmod( handle, S_IRUSR|S_IWUSR );
#else
write (handle, "\x1A", 1);
#endif
#endif
close( handle );
}
@@ -190,20 +194,20 @@ HARBOUR HB___SETCENTURY (void)
* Then change the setting if the parameter is a logical value, or is
* either "ON" or "OFF" (regardless of case)
*/
if ( pItem && IS_LOGICAL (pItem)) hb_set_century = pItem->value.iLogical;
if ( pItem && IS_LOGICAL (pItem)) hb_set_century = pItem->item.asLogical.value;
else if ( pItem && IS_STRING (pItem))
{
if (pItem->wLength == 2)
if (pItem->item.asString.length == 2)
{
if (toupper (pItem->value.szText [0]) == 'O'
&& toupper (pItem->value.szText [1]) == 'N')
if (toupper (pItem->item.asString.value [0]) == 'O'
&& toupper (pItem->item.asString.value [1]) == 'N')
hb_set_century = TRUE;
}
else if (pItem->wLength == 3)
else if (pItem->item.asString.length == 3)
{
if (toupper (pItem->value.szText [0]) == 'O'
&& toupper (pItem->value.szText [1]) == 'F'
&& toupper (pItem->value.szText [2]) == 'F')
if (toupper (pItem->item.asString.value [0]) == 'O'
&& toupper (pItem->item.asString.value [1]) == 'F'
&& toupper (pItem->item.asString.value [2]) == 'F')
hb_set_century = FALSE;
}
}

View File

@@ -33,10 +33,10 @@ int hb_stricmp( const char *s1, const char *s2 )
/* Check whether two strings are equal (0), smaller (-1), or greater (1) */
int hb_itemStrCmp( PHB_ITEM pFirst, PHB_ITEM pSecond, BOOL bForceExact )
{
char *szFirst = pFirst->value.szText;
char *szSecond = pSecond->value.szText;
long lLenFirst = pFirst->wLength; /* TODO: change HB_ITEM.wLength from WORD to long */
long lLenSecond = pSecond->wLength; /* TODO: change HB_ITEM.wLength from WORD to long */
char *szFirst = pFirst->item.asString.value;
char *szSecond = pSecond->item.asString.value;
ULONG lLenFirst = pFirst->item.asString.length;
ULONG lLenSecond = pSecond->item.asString.length;
long lMinLen;
long lCounter;
int iRet = 0; /* Current status */

View File

@@ -5,6 +5,8 @@
#include <hbsetup.h>
#include <dates.h>
#include <extend.h>
#include <init.h>
#include <itemapi.h>
#include <errorapi.h>
#include <ctype.h>
#include <math.h>
@@ -12,7 +14,7 @@
extern STACK stack;
#ifdef HB_STRICT_CLIPPER_COMPATIBILITY
#ifdef HARBOUR_STRICT_CLIPPER_COMPATIBILITY
static double infinity = 0;
#endif
@@ -51,40 +53,36 @@ HARBOUR HB_VAL( void );
static SYMBOL symbols[] = {
{ "ALLTRIM" , FS_PUBLIC, HB_ALLTRIM, 0 },
{ "HB_ASC" , FS_PUBLIC, HB_ASC , 0 },
{ "HB_AT" , FS_PUBLIC, HB_AT , 0 },
{ "HB_CHR" , FS_PUBLIC, HB_CHR , 0 },
{ "ISALPHA" , FS_PUBLIC, HB_ISALPHA, 0 },
{ "ISDIGIT" , FS_PUBLIC, HB_ISDIGIT, 0 },
{ "ISUPPER" , FS_PUBLIC, HB_ISUPPER, 0 },
{ "ISLOWER" , FS_PUBLIC, HB_ISLOWER, 0 },
{ "HB_LEFT" , FS_PUBLIC, HB_LEFT , 0 },
{ "HB_LOWER" , FS_PUBLIC, HB_LOWER , 0 },
{ "HB_LTRIM" , FS_PUBLIC, HB_LTRIM , 0 },
{ "PAD" , FS_PUBLIC, HB_PAD , 0 },
{ "PADC" , FS_PUBLIC, HB_PADC , 0 },
{ "PADL" , FS_PUBLIC, HB_PADL , 0 },
{ "PADR" , FS_PUBLIC, HB_PADR , 0 },
{ "RAT" , FS_PUBLIC, HB_RAT , 0 },
{ "HB_REPLICATE" , FS_PUBLIC, HB_REPLICATE , 0 },
{ "RIGHT" , FS_PUBLIC, HB_RIGHT , 0 },
{ "HB_RTRIM" , FS_PUBLIC, HB_RTRIM , 0 },
{ "STR" , FS_PUBLIC, HB_STR , 0 },
{ "STRTRAN" , FS_PUBLIC, HB_STRTRAN, 0 },
{ "STUFF" , FS_PUBLIC, HB_STUFF , 0 },
{ "HB_SUBSTR" , FS_PUBLIC, HB_SUBSTR , 0 },
{ "TRIM" , FS_PUBLIC, HB_TRIM , 0 },
{ "HB_UPPER" , FS_PUBLIC, HB_UPPER , 0 },
{ "HB_VAL" , FS_PUBLIC, HB_VAL , 0 }
};
{ "STUFF" , FS_PUBLIC, HB_STUFF , 0 }
}; /* The rest of functions is pulled automatically by initsymb.c */
HB_INIT_SYMBOLS( Strings__InitSymbols );
/*
void Strings__InitSymbols( void )
{
ProcessSymbols( symbols, sizeof(symbols)/sizeof( SYMBOL ) );
#ifdef HB_STRICT_CLIPPER_COMPATIBILITY
infinity = -log( 0 );
#endif
}
*/
#ifdef HARBOUR_STRICT_CLIPPER_COMPATIBILITY
HB_CALL_ON_STARTUP( Strings_InitInfinity )
{
infinity = -log( 0 );
HB_RETURN_ON_STARTUP
}
#endif
BOOL hb_strempty( char * szText, ULONG ulLen )
{
@@ -158,8 +156,8 @@ HARBOUR HB_LTRIM( void )
if( pText )
{
ULONG lLen = pText->wLength;
char *szText = hb_strLTrim(pText->value.szText, &lLen);
ULONG lLen = pText->item.asString.length;
char *szText = hb_strLTrim(pText->item.asString.value, &lLen);
hb_retclen(szText, lLen);
}
@@ -202,11 +200,11 @@ HARBOUR HB_RTRIM( void )
if( pText )
{
BOOL bAnySpace = (hb_pcount() > 1? hb_parl(2): 0);
hb_retclen(pText->value.szText, hb_strRTrimLen(pText->value.szText, pText->wLength, bAnySpace));
hb_retclen(pText->item.asString.value, hb_strRTrimLen(pText->item.asString.value, pText->item.asString.length, bAnySpace));
}
else
{
#ifdef HB_STRICT_CLIPPER_COMPATIBILITY
#ifdef HARBOUR_STRICT_CLIPPER_COMPATIBILITY
/* Clipper doesn't error, but only in RTRIM. TRIM() throws an error, though */
hb_retc("");
#else
@@ -221,7 +219,7 @@ HARBOUR HB_RTRIM( void )
}
}
/* synonymn for RTRIM, with different error handling */
/* synonymn for RTRIM */
HARBOUR HB_TRIM( void )
{
if( hb_pcount() > 0 )
@@ -272,7 +270,7 @@ static char * hb_pad_prep( PHB_ITEM pItem, char * buffer, WORD * pwSize )
{
char * szText = 0;
if( pItem ) switch( pItem->wType )
if( pItem ) switch( pItem->type )
{
case IT_DATE:
szText = hb_dtoc( hb_pards( 1 ), buffer );
@@ -289,8 +287,8 @@ static char * hb_pad_prep( PHB_ITEM pItem, char * buffer, WORD * pwSize )
*pwSize = strlen( szText );
break;
case IT_DOUBLE:
if( pItem->wDec )
sprintf( buffer, "%.*f", pItem->wDec, hb_parnd( 1 ) );
if( pItem->item.asDouble.decimal )
sprintf( buffer, "%.*f", pItem->item.asDouble.decimal, hb_parnd( 1 ) );
else
sprintf( buffer, "%ld", hb_parnl( 1 ) );
szText = buffer;
@@ -480,7 +478,7 @@ HARBOUR HB_AT( void )
{
if( IS_STRING( pText ) && IS_STRING( pSub ) )
{
hb_retnl( hb_strAt(pSub->value.szText, pSub->wLength, pText->value.szText, pText->wLength) );
hb_retnl( hb_strAt(pSub->item.asString.value, pSub->item.asString.length, pText->item.asString.value, pText->item.asString.length) );
}
else
{
@@ -562,8 +560,8 @@ HARBOUR HB_ASC(void)
if( pText )
{
if( pText->wLength > 0 )
hb_retni(*(pText->value.szText));
if( pText->item.asString.length > 0 )
hb_retni(*(pText->item.asString.value));
else
hb_retni(0);
}
@@ -594,13 +592,13 @@ HARBOUR HB_LEFT( void )
{
long lLen = hb_parnl(2);
if( lLen > pText->wLength )
lLen = pText->wLength;
if( lLen > pText->item.asString.length )
lLen = pText->item.asString.length;
else if( lLen < 0 )
lLen = 0;
hb_retclen(pText->value.szText, lLen);
hb_retclen(pText->item.asString.value, lLen);
}
else
{
@@ -634,13 +632,13 @@ HARBOUR HB_RIGHT( void )
{
long lLen = hb_parnl(2);
if( lLen > pText->wLength )
lLen = pText->wLength;
if( lLen > pText->item.asString.length )
lLen = pText->item.asString.length;
else if( lLen < 0 )
lLen = 0;
hb_retclen(pText->value.szText + pText->wLength - lLen, lLen);
hb_retclen(pText->item.asString.value + pText->item.asString.length - lLen, lLen);
}
else
{
@@ -656,6 +654,7 @@ HARBOUR HB_RIGHT( void )
}
else
{
/* QUESTION: Clipper catches this at compile time! */
/* Clipper doesn't error */
hb_retc("");
}
@@ -675,7 +674,7 @@ HARBOUR HB_SUBSTR( void )
if( lPos < 0 )
{
lPos += pText->wLength;
lPos += pText->item.asString.length;
if( lPos < 0 )
lPos = 0;
}
@@ -684,7 +683,7 @@ HARBOUR HB_SUBSTR( void )
lPos--;
}
if( lPos < pText->wLength )
if( lPos < pText->item.asString.length )
{
PHB_ITEM pLen = hb_param(3, IT_NUMERIC);
long lLen;
@@ -693,14 +692,14 @@ HARBOUR HB_SUBSTR( void )
{
lLen = hb_parnl(3);
if( lLen > pText->wLength - lPos )
lLen = pText->wLength - lPos;
if( lLen > pText->item.asString.length - lPos )
lLen = pText->item.asString.length - lPos;
}
else
lLen = pText->wLength - lPos;
lLen = pText->item.asString.length - lPos;
if( lLen > 0 )
hb_retclen(pText->value.szText + lPos, lLen);
hb_retclen(pText->item.asString.value + lPos, lLen);
else
hb_retc("");
}
@@ -737,9 +736,9 @@ HARBOUR HB_LOWER( void )
if( pText )
{
long lLen = pText->wLength;
long lLen = pText->item.asString.length;
hb_retclen(hb_strLower(pText->value.szText, lLen), lLen);
hb_retclen(hb_strLower(pText->item.asString.value, lLen), lLen);
}
else
{
@@ -771,9 +770,9 @@ HARBOUR HB_UPPER( void )
if( pText )
{
long lLen = pText->wLength;
long lLen = pText->item.asString.length;
hb_retclen(hb_strUpper(pText->value.szText, lLen), lLen);
hb_retclen(hb_strUpper(pText->item.asString.value, lLen), lLen);
}
else
{
@@ -802,8 +801,8 @@ HARBOUR HB_REPLICATE( void )
if( lTimes > 0 )
{
char *szText = pText->value.szText;
long lLen = pText->wLength;
char *szText = pText->item.asString.value;
long lLen = pText->item.asString.length;
char *szResult = (char *)hb_xgrab((lLen * lTimes) + 1);
char *szPtr = szResult;
long i;
@@ -881,22 +880,22 @@ HARBOUR HB_STUFF( void )
pText = hb_param(1, IT_STRING);
if( pText )
{
char *szText = pText->value.szText;
char *szText = pText->item.asString.value;
PHB_ITEM pPos, pDel, pInsert;
long lPos, lDel, lInsert, lTotalLen;
ULONG lPos, lDel, lInsert, lTotalLen;
char *szInsert;
pPos = hb_param(2, IT_NUMERIC);
lPos = (pPos? pPos->value.lNumber - 1: 0);
if( lPos > pText->wLength )
lPos = pText->wLength;
lPos = (pPos? hb_itemGetNL( pPos ) - 1: 0);
if( lPos > pText->item.asString.length )
lPos = pText->item.asString.length;
pDel = hb_param(3, IT_NUMERIC);
if( pDel )
{
lDel = pDel->value.lNumber;
if( lDel > pText->wLength - lPos )
lDel = pText->wLength - lPos;
lDel = hb_itemGetNL( pDel );
if( lDel > pText->item.asString.length - lPos )
lDel = pText->item.asString.length - lPos;
}
else
lDel = 0;
@@ -904,8 +903,8 @@ HARBOUR HB_STUFF( void )
pInsert = hb_param(4, IT_STRING);
if( pInsert )
{
szInsert = pInsert->value.szText;
lInsert = pInsert->wLength;
szInsert = pInsert->item.asString.value;
lInsert = pInsert->item.asString.length;
}
else
{
@@ -913,14 +912,14 @@ HARBOUR HB_STUFF( void )
lInsert = 0;
}
if( (lTotalLen = pText->wLength + lInsert - lDel) > 0 )
if( (lTotalLen = pText->item.asString.length + lInsert - lDel) > 0 )
{
char *szResult = (char *)hb_xgrab(lTotalLen + 1);
memcpy(szResult, szText, lPos);
memcpy(szResult + lPos, szInsert, lInsert);
memcpy(szResult + lPos + lInsert, szText + lPos + lDel,
pText->wLength - (lPos + lDel));
pText->item.asString.length - (lPos + lDel));
szResult[lTotalLen] = 0;
hb_retclen(szResult, lTotalLen);
@@ -943,13 +942,13 @@ HARBOUR HB_STRTRAN( void )
PHB_ITEM pSeek = hb_param(2, IT_STRING);
if( pSeek )
{
char *szText = pText->value.szText;
if( pSeek->wLength && pSeek->wLength <= pText->wLength )
char *szText = pText->item.asString.value;
if( pSeek->item.asString.length && pSeek->item.asString.length <= pText->item.asString.length )
{
char *szSeek = pSeek->value.szText;
char *szSeek = pSeek->item.asString.value;
PHB_ITEM pStart = hb_param(4, IT_NUMERIC);
char *szReplace;
long iStart;
ULONG iStart;
iStart = (pStart? hb_parnl(4): 1);
if( !iStart )
@@ -961,13 +960,14 @@ HARBOUR HB_STRTRAN( void )
{
PHB_ITEM pReplace = hb_param(3, IT_STRING);
PHB_ITEM pCount = hb_param(5, IT_NUMERIC);
long iReplace;
long iCount, bAll;
ULONG iReplace;
ULONG iCount;
long bAll;
if( pReplace )
{
szReplace = pReplace->value.szText;
iReplace = pReplace->wLength;
szReplace = pReplace->item.asString.value;
iReplace = pReplace->item.asString.length;
}
else
{
@@ -977,7 +977,7 @@ HARBOUR HB_STRTRAN( void )
if( pCount )
{
iCount = pCount->value.lNumber;
iCount = hb_itemGetNL( pCount );
bAll = 0;
}
else
@@ -990,19 +990,19 @@ HARBOUR HB_STRTRAN( void )
{
long iFound = 0;
long iReplaced = 0;
long i = 0;
long iLength = pText->wLength;
ULONG i = 0;
ULONG iLength = pText->item.asString.length;
while( i < pText->wLength )
while( i < pText->item.asString.length )
{
if( (bAll || iReplaced < iCount) && !memcmp(szText + i, szSeek, pSeek->wLength) )
if( (bAll || iReplaced < iCount) && !memcmp(szText + i, szSeek, pSeek->item.asString.length) )
{
iFound++;
if( iFound >= iStart )
{
iReplaced++;
iLength = iLength - pSeek->wLength + iReplace;
i += pSeek->wLength;
iLength = iLength - pSeek->item.asString.length + iReplace;
i += pSeek->item.asString.length;
}
else
i++;
@@ -1018,9 +1018,9 @@ HARBOUR HB_STRTRAN( void )
iFound = 0;
i = 0;
while( i < pText->wLength )
while( i < pText->item.asString.length )
{
if( iReplaced && !memcmp(szText + i, szSeek, pSeek->wLength) )
if( iReplaced && !memcmp(szText + i, szSeek, pSeek->item.asString.length) )
{
iFound++;
if( iFound >= iStart )
@@ -1028,7 +1028,7 @@ HARBOUR HB_STRTRAN( void )
iReplaced--;
memcpy(szPtr, szReplace, iReplace);
szPtr += iReplace;
i += pSeek->wLength;
i += pSeek->item.asString.length;
}
else
{
@@ -1048,16 +1048,16 @@ HARBOUR HB_STRTRAN( void )
hb_xfree(szResult);
}
else
hb_retclen(szText, pText->wLength);
hb_retclen(szText, pText->item.asString.length);
}
else
hb_retclen(szText, pText->wLength);
hb_retclen(szText, pText->item.asString.length);
}
else
hb_retclen(szText, pText->wLength);
hb_retclen(szText, pText->item.asString.length);
}
else
hb_retclen(szText, pText->wLength);
hb_retclen(szText, pText->item.asString.length);
}
else
hb_retc("");
@@ -1082,16 +1082,16 @@ HARBOUR HB_VAL( void )
if( pText )
{
int nWidth, nDec = 0;
char * ptr = strchr( pText->value.szText, '.' );
char * ptr = strchr( pText->item.asString.value, '.' );
if( ptr )
{
nWidth = ptr - pText->value.szText;
nWidth = ptr - pText->item.asString.value;
nDec = strlen( ptr + 1 );
}
else nWidth = strlen( pText->value.szText );
hb_retnd(hb_strVal(pText->value.szText));
stack.Return.wLength = nWidth;
stack.Return.wDec = nDec;
else nWidth = strlen( pText->item.asString.value );
hb_retnd(hb_strVal(pText->item.asString.value));
stack.Return.item.asDouble.length = nWidth;
stack.Return.item.asDouble.decimal = nDec;
}
else
{
@@ -1120,8 +1120,8 @@ char * hb_str( PHB_ITEM pNumber, PHB_ITEM pWidth, PHB_ITEM pDec )
{
/* Default to the width and number of decimals specified by the item,
with a limit of 20 integer places and 9 decimal places */
int iWidth = pNumber->wLength;
int iDec = pNumber->wDec;
int iWidth = pNumber->item.asDouble.length;
int iDec = pNumber->item.asDouble.decimal;
if( iWidth > 20 )
iWidth = 20;
if( iDec > 9 )
@@ -1133,12 +1133,7 @@ char * hb_str( PHB_ITEM pNumber, PHB_ITEM pWidth, PHB_ITEM pDec )
{
/* If the width parameter is specified, override the default value
and set the number of decimals to zero */
if( IS_INTEGER( pWidth ) )
iWidth = pWidth->value.iNumber;
else if( IS_LONG( pWidth ) )
iWidth = (int) pWidth->value.lNumber;
else if( IS_DOUBLE( pWidth ) )
iWidth = (int) pWidth->value.dNumber;
iWidth =(int) hb_itemGetNL( pWidth );
if( iWidth < 1 )
iWidth = 10; /* If 0 or negative, use default */
@@ -1150,12 +1145,7 @@ char * hb_str( PHB_ITEM pNumber, PHB_ITEM pWidth, PHB_ITEM pDec )
/* This function does not include the decimal places in the width,
so the width must be adjusted downwards, if the decimal places
parameter is greater than 0 */
if( IS_INTEGER( pDec ) )
iDec = pDec->value.iNumber;
else if( IS_LONG( pDec ) )
iDec = (int) pDec->value.lNumber;
else if( IS_DOUBLE( pDec ) )
iDec = (int) pDec->value.dNumber;
iDec =(int) hb_itemGetNL( pDec );
if( iDec < 0 )
iDec = 0;
@@ -1174,17 +1164,10 @@ char * hb_str( PHB_ITEM pNumber, PHB_ITEM pWidth, PHB_ITEM pDec )
if( IS_DOUBLE( pNumber ) || iDec != 0 )
{
double dNumber;
double dNumber =hb_itemGetND( pNumber );
if( IS_INTEGER( pNumber ) )
dNumber = (double) pNumber->value.iNumber;
else if( IS_LONG( pNumber ) )
dNumber = (double) pNumber->value.lNumber;
else if( IS_DOUBLE( pNumber ) )
dNumber = pNumber->value.dNumber;
#ifdef HB_STRICT_CLIPPER_COMPATIBILITY
if( pNumber->wLength == 99 || dNumber == infinity || dNumber == -infinity )
#ifdef HARBOUR_STRICT_CLIPPER_COMPATIBILITY
if( pNumber->item.asDouble.length == 99 || dNumber == infinity || dNumber == -infinity )
/* Numeric overflow */
iBytes = iSize + 1;
else
@@ -1196,14 +1179,14 @@ char * hb_str( PHB_ITEM pNumber, PHB_ITEM pWidth, PHB_ITEM pDec )
iBytes = sprintf( szResult, "%*ld", iWidth, (long)dNumber );
}
}
else switch( pNumber->wType & ~IT_BYREF )
else switch( pNumber->type & ~IT_BYREF )
{
case IT_LONG:
iBytes = sprintf( szResult, "%*li", iWidth, pNumber->value.lNumber );
iBytes = sprintf( szResult, "%*li", iWidth, pNumber->item.asLong.value );
break;
case IT_INTEGER:
iBytes = sprintf( szResult, "%*i", iWidth, pNumber->value.iNumber );
iBytes = sprintf( szResult, "%*i", iWidth, pNumber->item.asInteger.value );
break;
default:

View File

@@ -3,6 +3,7 @@
*/
#include <extend.h>
#include <init.h>
#include <errorapi.h>
#include <ctoharb.h>
#include <ctype.h>
@@ -18,13 +19,16 @@
HARBOUR HB_TRANSFORM( void );
static SYMBOL symbols[] = {
{ "HB_TRANSFORM" , FS_PUBLIC, HB_TRANSFORM , 0 }
{ "TRANSFORM" , FS_PUBLIC, HB_TRANSFORM , 0 }
};
HB_INIT_SYMBOLS( Transfrm__InitSymbols );
/*
void Transfrm__InitSymbols( void )
{
ProcessSymbols( symbols, sizeof(symbols)/sizeof( SYMBOL ) );
}
*/
extern STACK stack;
@@ -203,7 +207,7 @@ char *NumPicture( char *szPic, long lPic, int iPicFlags, double dValue,
pItem = &stack.Return;
if( IS_STRING( pItem ) ) /* Is it a string */
{
szStr = pItem->value.szText;
szStr = pItem->item.asString.value;
iCount = 0;
if( iPicFlags & PF_ZERO ) /* Pad with Zero's */
@@ -211,9 +215,9 @@ char *NumPicture( char *szPic, long lPic, int iPicFlags, double dValue,
for( i=0; szStr[i] == ' ' && i < iWidth; i++ )
szStr[i] = '0';
}
if( bEmpty && pItem->wLength ) /* Suppress empty value */
if( bEmpty && pItem->item.asString.length ) /* Suppress empty value */
{
szStr[pItem->wLength - 1] = ' ';
szStr[pItem->item.asString.length - 1] = ' ';
}
if( iPicFlags & PF_LEFT ) /* Left align */
@@ -329,7 +333,7 @@ PHB_ITEM NumDefault( double dValue )
PushDouble ( dValue, hb_set.HB_SET_DECIMALS ); /* Push value to transform */
Function ( 1 ); /* 1 Parameter */
StackPop (); /* Pop return value */
if( stack.pPos->wType != IT_STRING ) /* Is it a string */
if( stack.pPos->type != IT_STRING ) /* Is it a string */
{
printf( "\nNUMDEFAULT: STR does not return string" );
_exit(1);
@@ -441,14 +445,14 @@ HARBOUR HB_TRANSFORM( void )
PHB_ITEM pPic = hb_param( 2, IT_STRING); /* Picture string */
PHB_ITEM pExp = hb_param( 1, IT_ANY ); /* Input parameter */
char *szPic = pPic->value.szText;
char *szPic = pPic->item.asString.value;
char *szTemp;
char *szResult;
char *szExp;
PHB_ITEM pItem;
long lPic = pPic->wLength;
long lPic = pPic->item.asString.length;
long lPicStart = 0; /* Start of template */
long lExpPos = 0;
long lResultPos = 0;
@@ -460,28 +464,28 @@ HARBOUR HB_TRANSFORM( void )
if( lPic )
{
if( pPic->wLength )
if( pPic->item.asString.length )
{
if( *szPic == '@' ) /* Function marker found */
{
iPicFlags = PictFunc( &szPic, &lPic ); /* Get length of function*/
lPicStart = pPic->wLength - lPic; /* Get start of template */
lPicStart = pPic->item.asString.length - lPic; /* Get start of template */
}
switch( pExp->wType & ~IT_BYREF )
switch( pExp->type & ~IT_BYREF )
{
case IT_STRING:
{
szExp = pExp->value.szText;
szResult = (char *)hb_xgrab( ( (lPic-lPicStart) > pExp->wLength) ?
(lPic-lPicStart) + 1 : pExp->wLength + 1 );
szExp = pExp->item.asString.value;
szResult = (char *)hb_xgrab( ( (lPic-lPicStart) > pExp->item.asString.length) ?
(lPic-lPicStart) + 1 : pExp->item.asString.length + 1 );
/* Grab enough */
szPic += lPicStart; /* Skip functions */
if( iPicFlags & PF_UPPER ) /* Function : @! */
{
szTemp = szExp; /* Convert to upper */
for( n = pExp->wLength; n ; n--)
for( n = pExp->item.asString.length; n ; n--)
{
*szTemp = toupper( *szTemp );
szTemp++;
@@ -490,7 +494,7 @@ HARBOUR HB_TRANSFORM( void )
if( lPic ) /* Template string */
{
while( lPic && lExpPos < pExp->wLength )
while( lPic && lExpPos < pExp->item.asString.length )
{ /* Analyze picture mask */
switch( *szPic )
{
@@ -530,7 +534,7 @@ HARBOUR HB_TRANSFORM( void )
}
else if( iPicFlags & (PF_UPPER + PF_REMAIN) )
{ /* Without template */
for( n = pExp->wLength; n; n--)
for( n = pExp->item.asString.length; n; n--)
szResult[lResultPos++] = *szExp++;
}
@@ -557,7 +561,7 @@ HARBOUR HB_TRANSFORM( void )
{
case 'Y': /* Yes/No */
{
*szResult = pExp->value.iLogical ? 'Y' : 'N';
*szResult = pExp->item.asLogical.value ? 'Y' : 'N';
szPic++;
lPic--;
bDone = TRUE; /* Logical written */
@@ -567,7 +571,7 @@ HARBOUR HB_TRANSFORM( void )
case '#':
case 'L': /* True/False */
{
*szResult = pExp->value.iLogical ? 'T' : 'F';
*szResult = pExp->item.asLogical.value ? 'T' : 'F';
szPic++;
lPic--;
bDone = TRUE;
@@ -586,7 +590,7 @@ HARBOUR HB_TRANSFORM( void )
for( n = lPic; n; n--) /* Copy remainder */
szResult[lResultPos++] = *szPic++;
if( !bDone ) /* Logical written ? */
szResult[lResultPos++] = pExp->value.iLogical ? 'T' : 'F';
szResult[lResultPos++] = pExp->item.asLogical.value ? 'T' : 'F';
}
hb_retclen( szResult, lResultPos );
hb_xfree( szResult );
@@ -595,7 +599,7 @@ HARBOUR HB_TRANSFORM( void )
case IT_INTEGER:
{
szResult = NumPicture( szPic + lPicStart, lPic, iPicFlags,
(double) pExp->value.iNumber, &lResultPos );
(double) pExp->item.asInteger.value, &lResultPos );
hb_retclen( szResult, lResultPos );
hb_xfree( szResult );
break;
@@ -603,7 +607,7 @@ HARBOUR HB_TRANSFORM( void )
case IT_LONG:
{
szResult = NumPicture( szPic + lPicStart, lPic, iPicFlags,
(double) pExp->value.lNumber, &lResultPos );
(double) pExp->item.asLong.value, &lResultPos );
hb_retclen( szResult, lResultPos );
hb_xfree( szResult );
break;
@@ -611,14 +615,14 @@ HARBOUR HB_TRANSFORM( void )
case IT_DOUBLE:
{
szResult = NumPicture( szPic + lPicStart, lPic, iPicFlags,
(double) pExp->value.dNumber, &lResultPos );
(double) pExp->item.asDouble.value, &lResultPos );
hb_retclen( szResult, lResultPos);
hb_xfree( szResult );
break;
}
case IT_DATE:
{ /* Date is currently British; Century is on */
szResult = DatePicture( pExp->value.lDate, iPicFlags, &lResultPos );
szResult = DatePicture( pExp->item.asDate.value, iPicFlags, &lResultPos );
hb_retclen( szResult, lResultPos );
hb_xfree( szResult );
break;
@@ -636,42 +640,42 @@ HARBOUR HB_TRANSFORM( void )
}
else /* No picture supplied */
{
switch( pExp->wType & ~IT_BYREF ) /* Default behaviour */
switch( pExp->type & ~IT_BYREF ) /* Default behaviour */
{
case IT_STRING:
{
hb_retclen( pExp->value.szText, pExp->wLength);
hb_retclen( pExp->item.asString.value, pExp->item.asString.length);
break;
}
case IT_LOGICAL:
{
hb_retclen( pExp->value.iLogical ? "T" : "F", 1);
hb_retclen( pExp->item.asLogical.value ? "T" : "F", 1);
break;
}
case IT_INTEGER:
{
pItem = NumDefault( (double) pExp->value.iNumber );
hb_retclen( pItem->value.szText, pItem->wLength );
pItem = NumDefault( (double) pExp->item.asInteger.value );
hb_retclen( pItem->item.asString.value, pItem->item.asInteger.length );
ItemRelease( pItem );
break;
}
case IT_LONG:
{
pItem = NumDefault( (double) pExp->value.lNumber );
hb_retclen( pItem->value.szText, pItem->wLength );
pItem = NumDefault( (double) pExp->item.asLong.value );
hb_retclen( pItem->item.asString.value, pItem->item.asLong.length );
ItemRelease( pItem );
break;
}
case IT_DOUBLE:
{
pItem = NumDefault( (double) pExp->value.dNumber );
hb_retclen( pItem->value.szText, pItem->wLength );
pItem = NumDefault( (double) pExp->item.asDouble.value );
hb_retclen( pItem->item.asString.value, pItem->item.asDouble.length );
ItemRelease( pItem );
break;
}
case IT_DATE:
{
szResult = DatePicture( pExp->value.lDate, iPicFlags, &lResultPos );
szResult = DatePicture( pExp->item.asDate.value, iPicFlags, &lResultPos );
hb_retclen( szResult, lResultPos );
hb_xfree( szResult );
break;

View File

@@ -78,12 +78,10 @@ HARBOUR HB_STRTOKEN( void )
HARBOUR HB_ROT13( void )
{
PHB_ITEM pText = hb_param(1, IT_STRING);
if( pText )
if( ISCHAR(1) )
{
char *szText = pText->value.szText;
long i, lLen = pText->wLength;
char *szText = hb_parc( 1 );
ULONG i, lLen = hb_parclen( 1 );
char *szResult = (char*)hb_xgrab(lLen + 1);
for( i = 0; i < lLen; i++ )

View File

@@ -75,7 +75,7 @@ void Or( void ); /* performs the logical OR on the latest two value
void Plus( void ); /* sums the latest two values on the stack, removes them and leaves the result */
long PopDate( void ); /* pops the stack latest value and returns its date value as a LONG */
void PopDefStat( WORD wStatic ); /* pops the stack latest value onto a static as default init */
double PopDouble( void ); /* pops the stack latest value and returns its double numeric format value */
double PopDouble( WORD * ); /* pops the stack latest value and returns its double numeric format value */
void PopLocal( SHORT wLocal ); /* pops the stack latest value onto a local */
int PopLogical( void ); /* pops the stack latest value and returns its logical value */
double PopNumber( void ); /* pops the stack latest value and returns its numeric value */
@@ -121,12 +121,12 @@ void StackPush( void ); /* pushes an item on to the stack */
void StackInit( void ); /* initializes the stack */
void StackShow( void ); /* show the types of the items on the stack for debugging purposes */
PCODEBLOCK CodeblockNew( BYTE *, WORD, PSYMBOL, int, WORD );
void CodeblockDelete( PCODEBLOCK );
PHB_ITEM CodeblockGetVar( PHB_ITEM, SHORT );
void CodeblockEvaluate( PCODEBLOCK );
HB_CODEBLOCK_PTR CodeblockNew( BYTE *, WORD, PSYMBOL, int, WORD );
void CodeblockDelete( HB_CODEBLOCK_PTR );
PHB_ITEM CodeblockGetVar( PHB_ITEM, LONG );
void CodeblockEvaluate( HB_CODEBLOCK_PTR );
void CodeblockCopy( PHB_ITEM, PHB_ITEM );
void CodeblockDetach( PCODEBLOCK );
void CodeblockDetach( HB_CODEBLOCK_PTR );
void InitSymbolTable( void ); /* initialization of runtime support symbols */
@@ -191,9 +191,9 @@ BYTE bErrorLevel = 0; /* application exit errorlevel */
iHB_DEBUG += ( int ) DontDiscardForceLink; /* just to avoid warnings from the C compiler */
HB_DEBUG( "main\n" );
aStatics.wType = IT_NIL;
errorBlock.wType = IT_NIL;
stack.Return.wType = IT_NIL;
aStatics.type = IT_NIL;
errorBlock.type = IT_NIL;
stack.Return.type = IT_NIL;
StackInit();
NewDynSym( &symEval ); /* initialize dynamic symbol for evaluating codeblocks */
hb_setInitialize(); /* initialize Sets */
@@ -577,7 +577,7 @@ void VirtualMachine( PBYTE pCode, PSYMBOL pSymbols )
default:
printf( "The Harbour virtual machine can't run yet this PRG\n(unsuported pcode opcode: %i)\n", bCode );
printf( "Line number %i in %s", stack.pBase->wLine, stack.pBase->value.pSymbol->szName );
printf( "Line number %i in %s", stack.pBase->item.asSymbol.lineno, stack.pBase->item.asSymbol.value->szName );
exit( 1 );
break;
}
@@ -596,7 +596,7 @@ void And( void )
if( IS_LOGICAL( pItem1 ) && IS_LOGICAL( pItem2 ) )
{
iResult = pItem1->value.iLogical && pItem2->value.iLogical;
iResult = pItem1->item.asLogical.value && pItem2->item.asLogical.value;
StackPop();
StackPop();
PushLogical( iResult );
@@ -632,13 +632,13 @@ void ArrayPut( void )
ULONG ulIndex;
if( IS_INTEGER( pIndex ) )
ulIndex = pIndex->value.iNumber;
ulIndex = pIndex->item.asInteger.value;
else if( IS_LONG( pIndex ) )
ulIndex = pIndex->value.lNumber;
ulIndex = pIndex->item.asLong.value;
else if( IS_DOUBLE( pIndex ) )
ulIndex = pIndex->value.dNumber;
ulIndex = pIndex->item.asDouble.value;
else ;
/* QUESTION: Should we raise an error here ? */
@@ -653,11 +653,12 @@ void Dec( void )
{
double dNumber;
LONG lDate;
WORD wDec;
if( IS_NUMERIC( stack.pPos - 1 ) )
{
dNumber = PopDouble();
PushNumber( --dNumber, stack.pPos->wDec );
dNumber = PopDouble( &wDec );
PushNumber( --dNumber, wDec );
}
else if( IS_DATE( stack.pPos - 1 ) )
{
@@ -669,19 +670,20 @@ void Dec( void )
void Div( void )
{
double d2 = PopDouble();
double d1 = PopDouble();
WORD wDec1, wDec2;
double d2 = PopDouble( &wDec2 );
double d1 = PopDouble( &wDec1 );
PushNumber( d1 / d2, hb_set.HB_SET_DECIMALS );
PushNumber( d1 / d2, (wDec1>wDec2) ? wDec1 : wDec2 );
}
void Do( WORD wParams )
{
PHB_ITEM pItem = stack.pPos - wParams - 2;
PSYMBOL pSym = pItem->value.pSymbol;
WORD wStackBase = stack.pBase - stack.pItems; /* as the stack memory block could change */
WORD wItemIndex = pItem - stack.pItems;
PHB_ITEM pSelf = stack.pPos - wParams - 1;
PHB_ITEM pItem = stack.pPos - wParams - 2; /* procedure name */
PSYMBOL pSym = pItem->item.asSymbol.value;
LONG wStackBase = stack.pBase - stack.pItems; /* as the stack memory block could change */
LONG wItemIndex = pItem - stack.pItems;
PHB_ITEM pSelf = stack.pPos - wParams - 1; /* NIL, OBJECT or BLOCK */
HARBOURFUNC pFunc;
int iStatics = stack.iStatics; /* Return iStatics position */
@@ -699,10 +701,10 @@ void Do( WORD wParams )
exit( 1 );
}
pItem->wLine = 0;
pItem->wParams = wParams;
stack.pBase = stack.pItems + pItem->wBase;
pItem->wBase = wStackBase;
pItem->item.asSymbol.lineno = 0;
pItem->item.asSymbol.paramcnt = wParams;
stack.pBase = stack.pItems + pItem->item.asSymbol.stackbase;
pItem->item.asSymbol.stackbase = wStackBase;
HB_DEBUG2( "Do with %i params\n", wParams );
@@ -748,7 +750,7 @@ HARBOUR DoBlock( void )
}
/* Check for valid count of parameters */
iParam =pBlock->wParams -hb_pcount();
iParam =pBlock->item.asBlock.paramcnt -hb_pcount();
/* add missing parameters */
while( iParam-- > 0 )
PushNil();
@@ -756,9 +758,9 @@ HARBOUR DoBlock( void )
/* set pBaseCB to point to local variables of a function where
* the codeblock was defined
*/
stack.pBase->wLine =pBlock->wLine;
stack.pBase->item.asSymbol.lineno =pBlock->item.asBlock.lineno;
CodeblockEvaluate( (PCODEBLOCK)pBlock->value.pCodeblock );
CodeblockEvaluate( pBlock->item.asBlock.value );
/* restore stack pointers */
stack.pBase = stack.pItems + wStackBase;
@@ -815,6 +817,7 @@ void Equal( BOOL bExact )
PHB_ITEM pItem2 = stack.pPos - 1;
PHB_ITEM pItem1 = stack.pPos - 2;
int i;
WORD wDec;
if( IS_NIL( pItem1 ) && IS_NIL( pItem2 ) )
{
@@ -842,12 +845,12 @@ void Equal( BOOL bExact )
PushLogical( PopLogical() == PopLogical() );
else if( IS_NUMERIC( pItem1 ) && IS_NUMERIC( pItem2 ) )
PushLogical( PopDouble() == PopDouble() );
PushLogical( PopDouble(&wDec) == PopDouble(&wDec) );
else if( IS_OBJECT( pItem1 ) && hb_isMessage( pItem1, "==" ) )
OperatorCall( pItem1, pItem2, "==" );
else if( pItem1->wType != pItem2->wType )
else if( pItem1->type != pItem2->type )
{
printf( "types not match on equal operation\n" );
exit( 1 );
@@ -867,12 +870,13 @@ void ForTest( void ) /* Test to check the end point of the FOR */
{
double dStep;
int iEqual;
WORD wDec;
if( IS_NUMERIC( stack.pPos - 1 ) )
{
dStep = PopNumber();
wDec = stack.pPos->wDec;
WORD wDec;
dStep = PopDouble( &wDec );
if( dStep > 0 ) /* Positive loop. Use LESS */
Less();
else if( dStep < 0 ) /* Negative loop. Use GREATER */
@@ -894,7 +898,7 @@ void Frame( BYTE bLocals, BYTE bParams )
HB_DEBUG( "Frame\n" );
if( iTotal )
for( i = 0; i < ( iTotal - stack.pBase->wParams ); i++ )
for( i = 0; i < ( iTotal - stack.pBase->item.asSymbol.paramcnt ); i++ )
PushNil();
}
@@ -905,7 +909,7 @@ void FuncPtr( void ) /* pushes a function address pointer. Removes the symbol f
if( IS_SYMBOL( pItem ) )
{
StackPop();
PushLong( ( ULONG ) pItem->value.pSymbol->pFunPtr );
PushLong( ( ULONG ) pItem->item.asSymbol.value->pFunPtr );
}
else
{
@@ -926,10 +930,10 @@ void GenArray( WORD wElements ) /* generates a wElements Array and fills it from
HB_ITEM itArray;
WORD w;
itArray.wType = IT_NIL;
itArray.type = IT_NIL;
hb_arrayNew( &itArray, wElements );
for( w = 0; w < wElements; w++ )
ItemCopy( ( ( PBASEARRAY ) itArray.value.pBaseArray )->pItems + w,
ItemCopy( itArray.item.asArray.value->pItems + w,
stack.pPos - wElements + w );
for( w = 0; w < wElements; w++ )
@@ -980,7 +984,7 @@ void Greater( void )
hb_isMessage( stack.pPos - 2, ">" ) )
OperatorCall( stack.pPos - 2, stack.pPos - 1, ">" );
else if( ( stack.pPos - 2 )->wType != ( stack.pPos - 1 )->wType )
else if( ( stack.pPos - 2 )->type != ( stack.pPos - 1 )->type )
{
printf( "types not match on greater operation\n" );
exit( 1 );
@@ -1027,7 +1031,7 @@ void GreaterEqual( void )
hb_isMessage( stack.pPos - 2, ">=" ) )
OperatorCall( stack.pPos - 2, stack.pPos - 1, ">=" );
else if( ( stack.pPos - 2 )->wType != ( stack.pPos - 1 )->wType )
else if( ( stack.pPos - 2 )->type != ( stack.pPos - 1 )->type )
{
printf( "types not match on greaterequal operation\n" );
exit( 1 );
@@ -1039,11 +1043,12 @@ void Inc( void )
double dNumber;
LONG lDate;
PHB_ITEM pError;
WORD wDec;
if( IS_NUMERIC( stack.pPos - 1 ) )
{
dNumber = PopDouble();
PushNumber( ++dNumber, stack.pPos->wDec );
dNumber = PopDouble( &wDec );
PushNumber( ++dNumber, wDec );
}
else if( IS_DATE( stack.pPos - 1 ) )
{
@@ -1063,23 +1068,23 @@ void ItemRelease( PHB_ITEM pItem )
{
if( IS_STRING( pItem ) )
{
if( pItem->value.szText )
if( pItem->item.asString.value )
{
hb_xfree( pItem->value.szText );
pItem->value.szText = 0;
hb_xfree( pItem->item.asString.value );
pItem->item.asString.value = NULL;
}
pItem->wLength = 0;
pItem->item.asString.length = 0;
}
else if( IS_ARRAY( pItem ) && pItem->value.pBaseArray )
else if( IS_ARRAY( pItem ) && pItem->item.asArray.value )
{
if( --( ( PBASEARRAY ) pItem->value.pBaseArray )->wHolders == 0 )
if( --( pItem->item.asArray.value )->wHolders == 0 )
hb_arrayRelease( pItem );
}
else if( IS_BLOCK( pItem ) )
{
CodeblockDelete( ( PCODEBLOCK ) pItem->value.pCodeblock );
CodeblockDelete( pItem->item.asBlock.value );
}
pItem->wType = IT_NIL;
pItem->type = IT_NIL;
}
void Instring( void )
@@ -1091,9 +1096,9 @@ void Instring( void )
if( IS_STRING( pItem1 ) && IS_STRING( pItem2 ) )
{
for( iResult = 0, ul = 0; !iResult && ul < (ULONG) pItem1->wLength; ul++ )
iResult = hb_strAt( pItem1->value.szText + ul, 1,
pItem2->value.szText, pItem2->wLength );
for( iResult = 0, ul = 0; !iResult && ul < pItem1->item.asString.length; ul++ )
iResult = hb_strAt( pItem1->item.asString.value + ul, 1,
pItem2->item.asString.value, pItem2->item.asString.length );
StackPop();
StackPop();
PushLogical( iResult == 0 ? 0 : 1 );
@@ -1122,13 +1127,13 @@ void ItemCopy( PHB_ITEM pDest, PHB_ITEM pSource )
if( IS_STRING( pSource ) )
{
pDest->value.szText = ( char * ) hb_xgrab( pSource->wLength + 1 );
memcpy( pDest->value.szText, pSource->value.szText, pSource->wLength );
pDest->value.szText[ pSource->wLength ] = 0;
pDest->item.asString.value = ( char * ) hb_xgrab( pSource->item.asString.length + 1 );
memcpy( pDest->item.asString.value, pSource->item.asString.value, pSource->item.asString.length );
pDest->item.asString.value[ pSource->item.asString.length ] = 0;
}
else if( IS_ARRAY( pSource ) )
( ( PBASEARRAY ) pSource->value.pBaseArray )->wHolders++;
( pSource->item.asArray.value )->wHolders++;
else if( IS_BLOCK( pSource ) )
{
@@ -1176,7 +1181,7 @@ void Less( void )
hb_isMessage( stack.pPos - 2, "<" ) )
OperatorCall( stack.pPos - 2, stack.pPos - 1, "<" );
else if( ( stack.pPos - 2 )->wType != ( stack.pPos - 1 )->wType )
else if( ( stack.pPos - 2 )->type != ( stack.pPos - 1 )->type )
{
printf( "types not match on less operation\n" );
exit( 1 );
@@ -1223,7 +1228,7 @@ void LessEqual( void )
hb_isMessage( stack.pPos - 2, "<=" ) )
OperatorCall( stack.pPos - 2, stack.pPos - 1, "<=" );
else if( ( stack.pPos - 2 )->wType != ( stack.pPos - 1 )->wType )
else if( ( stack.pPos - 2 )->type != ( stack.pPos - 1 )->type )
{
printf( "types not match on lessequal operation\n" );
exit( 1 );
@@ -1234,29 +1239,29 @@ void Message( PSYMBOL pSymMsg ) /* sends a message to an object */
{
ItemCopy( stack.pPos, stack.pPos - 1 ); /* moves the object forward */
ItemRelease( stack.pPos - 1 );
( stack.pPos - 1 )->wType = IT_SYMBOL;
( stack.pPos - 1 )->value.pSymbol = pSymMsg;
( stack.pPos - 1 )->wBase = ( stack.pPos - 1 ) - stack.pItems;
( stack.pPos - 1 )->type = IT_SYMBOL;
( stack.pPos - 1 )->item.asSymbol.value = pSymMsg;
( stack.pPos - 1 )->item.asSymbol.stackbase = ( stack.pPos - 1 ) - stack.pItems;
StackPush();
HB_DEBUG2( "Message: %s\n", pSymMsg->szName );
}
void Line( WORD wLine )
{
stack.pBase->wLine = wLine;
stack.pBase->item.asSymbol.lineno = wLine;
HB_DEBUG( "line\n" );
}
void Negate( void )
{
if( IS_INTEGER( stack.pPos - 1 ) )
( stack.pPos - 1 )->value.iNumber = -( stack.pPos - 1 )->value.iNumber;
( stack.pPos - 1 )->item.asInteger.value = -( stack.pPos - 1 )->item.asInteger.value;
else if( IS_LONG( stack.pPos - 1 ) )
( stack.pPos - 1 )->value.lNumber = -( stack.pPos - 1 )->value.lNumber;
( stack.pPos - 1 )->item.asLong.value = -( stack.pPos - 1 )->item.asLong.value;
else if( IS_DOUBLE( stack.pPos - 1 ) )
( stack.pPos - 1 )->value.dNumber = -( stack.pPos - 1 )->value.dNumber;
( stack.pPos - 1 )->item.asDouble.value = -( stack.pPos - 1 )->item.asDouble.value;
}
void Not( void )
@@ -1264,7 +1269,7 @@ void Not( void )
PHB_ITEM pItem = stack.pPos - 1;
if( IS_LOGICAL( pItem ) )
pItem->value.iLogical = ! pItem->value.iLogical;
pItem->item.asLogical.value = ! pItem->item.asLogical.value;
else
; /* TODO: Raise an error here ? */
}
@@ -1274,6 +1279,7 @@ void NotEqual( void )
PHB_ITEM pItem2 = stack.pPos - 1;
PHB_ITEM pItem1 = stack.pPos - 2;
int i;
WORD wDec;
if( IS_NIL( pItem1 ) && IS_NIL( pItem2 ) )
{
@@ -1298,7 +1304,7 @@ void NotEqual( void )
}
else if( IS_NUMERIC( pItem1 ) && IS_NUMERIC( pItem2 ) )
PushLogical( PopDouble() != PopDouble() );
PushLogical( PopDouble( &wDec ) != PopDouble( &wDec ) );
else if( IS_LOGICAL( pItem1 ) && IS_LOGICAL( pItem2 ) )
PushLogical( PopLogical() != PopLogical() );
@@ -1306,7 +1312,7 @@ void NotEqual( void )
else if( IS_OBJECT( pItem1 ) && hb_isMessage( pItem1, "!=" ) )
OperatorCall( pItem1, pItem2, "!=" );
else if( pItem1->wType != pItem2->wType )
else if( pItem1->type != pItem2->type )
{
printf( "types not match on equal operation\n" );
exit( 1 );
@@ -1324,10 +1330,8 @@ void Minus( void )
if( IS_NUMERIC( stack.pPos - 1 ) && IS_NUMERIC( stack.pPos - 2 ) )
{
WORD wDec2, wDec1;
dNumber2 = PopNumber();
wDec2 = stack.pPos->wDec;
dNumber1 = PopNumber();
wDec1 = stack.pPos->wDec;
dNumber2 = PopDouble( &wDec2 );
dNumber1 = PopDouble( &wDec1 );
PushNumber( dNumber1 - dNumber2, (wDec1 > wDec2) ? wDec1 : wDec2 );
}
else if( IS_DATE( stack.pPos - 1 ) && IS_DATE( stack.pPos - 2 ) )
@@ -1351,19 +1355,18 @@ void Minus( void )
void Modulus( void )
{
double d2 = PopDouble();
double d1 = PopDouble();
WORD wDec1, wDec2;
double d2 = PopDouble( &wDec2 );
double d1 = PopDouble( &wDec1 );
PushNumber( ( long ) d1 % ( long ) d2, hb_set.HB_SET_DECIMALS );
PushNumber( ( long ) d1 % ( long ) d2, (wDec1>wDec2) ? wDec1 : wDec2 );
}
void Mult( void )
{
WORD wDec2, wDec1;
double d1, d2 = PopDouble();
wDec2 = stack.pPos->wDec;
d1 = PopDouble();
wDec1 = stack.pPos->wDec;
double d2 = PopDouble( &wDec2 );
double d1 = PopDouble( &wDec1 );
PushNumber( d1 * d2, wDec1 + wDec2 );
}
@@ -1385,7 +1388,7 @@ void Or( void )
if( IS_LOGICAL( pItem1 ) && IS_LOGICAL( pItem2 ) )
{
iResult = pItem1->value.iLogical || pItem2->value.iLogical;
iResult = pItem1->item.asLogical.value || pItem2->item.asLogical.value;
StackPop();
StackPop();
PushLogical( iResult );
@@ -1408,15 +1411,15 @@ void Plus( void )
if( IS_STRING( pItem1 ) && IS_STRING( pItem2 ) )
{
pItem1->value.szText = (char*)hb_xrealloc( pItem1->value.szText, pItem1->wLength + pItem2->wLength + 1 );
memcpy( pItem1->value.szText + pItem1->wLength,
pItem2->value.szText, pItem2->wLength );
pItem1->wLength += pItem2->wLength;
pItem1->value.szText[ pItem1->wLength ] = 0;
if( pItem2->value.szText )
pItem1->item.asString.value = (char*)hb_xrealloc( pItem1->item.asString.value, pItem1->item.asString.length + pItem2->item.asString.length + 1 );
memcpy( pItem1->item.asString.value+ pItem1->item.asString.length,
pItem2->item.asString.value, pItem2->item.asString.length );
pItem1->item.asString.length += pItem2->item.asString.length;
pItem1->item.asString.value[ pItem1->item.asString.length ] = 0;
if( pItem2->item.asString.value )
{
hb_xfree( pItem2->value.szText );
pItem2->value.szText = 0;
hb_xfree( pItem2->item.asString.value );
pItem2->item.asString.value = NULL;
}
StackPop();
return;
@@ -1425,12 +1428,10 @@ void Plus( void )
else if( IS_NUMERIC( pItem1 ) && IS_NUMERIC( pItem2 ) )
{
WORD wDec2, wDec1;
dNumber2 = PopDouble();
wDec2 = stack.pPos->wDec;
dNumber1 = PopDouble();
wDec1 = stack.pPos->wDec;
dNumber2 = PopDouble( &wDec2 );
dNumber1 = PopDouble( &wDec1 );
PushNumber( dNumber1 + dNumber2, (wDec1 > wDec2) ? wDec1 : wDec2 );
PushNumber( dNumber1 + dNumber2, (wDec1>wDec2) ? wDec1 : wDec2 );
}
else if( IS_DATE( pItem1 ) && IS_DATE( pItem2 ) )
@@ -1442,7 +1443,8 @@ void Plus( void )
else if( IS_DATE( pItem1 ) && IS_NUMERIC( pItem2 ) )
{
dNumber2 = PopDouble();
WORD wDec;
dNumber2 = PopDouble( &wDec );
lDate1 = PopDate();
PushDate( lDate1 + dNumber2 );
}
@@ -1459,7 +1461,7 @@ long PopDate( void )
StackPop();
if( IS_DATE( stack.pPos ) )
return stack.pPos->value.lDate;
return stack.pPos->item.asDate.value;
else
{
printf( "incorrect item value trying to Pop a date value\n" );
@@ -1473,41 +1475,44 @@ void PopDefStat( WORD wStatic ) /* Pops a default value to a STATIC */
PHB_ITEM pStatic;
StackPop();
pStatic = ( ( PBASEARRAY ) aStatics.value.pBaseArray )->pItems + stack.iStatics +
pStatic = aStatics.item.asArray.value->pItems + stack.iStatics +
wStatic - 1;
if( IS_BYREF( pStatic ) )
{
if( ( stack.pItems + pStatic->value.wItem )->wType == IT_NIL )
if( ( stack.pItems + pStatic->item.asRefer.value )->type == IT_NIL )
/* Only initialize when NIL */
ItemCopy( stack.pItems + pStatic->value.wItem, stack.pPos );
ItemCopy( stack.pItems + pStatic->item.asRefer.value, stack.pPos );
}
else
if( pStatic->wType == IT_NIL ) /* Only initialize when NIL */
if( pStatic->type == IT_NIL ) /* Only initialize when NIL */
ItemCopy( pStatic, stack.pPos );
ItemRelease( stack.pPos );
HB_DEBUG( "PopDefStat\n" );
}
double PopDouble( void )
double PopDouble( WORD *pwDec )
{
double d;
StackPop();
switch( stack.pPos->wType & ~IT_BYREF )
switch( stack.pPos->type & ~IT_BYREF )
{
case IT_INTEGER:
d = stack.pPos->value.iNumber;
d = stack.pPos->item.asInteger.value;
*pwDec =0;
break;
case IT_LONG:
d = stack.pPos->value.lNumber;
d = stack.pPos->item.asLong.value;
*pwDec =0;
break;
case IT_DOUBLE:
d = stack.pPos->value.dNumber;
d = stack.pPos->item.asDouble.value;
*pwDec =stack.pPos->item.asDouble.decimal;
break;
default:
@@ -1531,11 +1536,11 @@ void PopLocal( SHORT iLocal )
pLocal = stack.pBase + 1 + iLocal;
if( IS_BYREF( pLocal ) )
{
if( pLocal->value.iNumber >= 0)
ItemCopy( stack.pItems + pLocal->value.wItem, stack.pPos );
if( pLocal->item.asRefer.value >= 0)
ItemCopy( stack.pItems + pLocal->item.asRefer.value, stack.pPos );
else
/* local variable referenced in a codeblock */
ItemCopy( CodeblockGetVar( stack.pItems +pLocal->wBase +1, pLocal->value.wItem ), stack.pPos );
ItemCopy( CodeblockGetVar( stack.pItems +pLocal->item.asRefer.stackbase +1, pLocal->item.asRefer.value ), stack.pPos );
}
else
ItemCopy( pLocal, stack.pPos );
@@ -1555,7 +1560,7 @@ int PopLogical( void )
StackPop();
if( IS_LOGICAL( stack.pPos ) )
return stack.pPos->value.iLogical;
return stack.pPos->item.asLogical.value;
else
{
pError = hb_errNew();
@@ -1573,18 +1578,18 @@ double PopNumber( void )
StackPop();
switch( pItem->wType & ~IT_BYREF )
switch( pItem->type & ~IT_BYREF )
{
case IT_INTEGER:
dNumber = ( double ) pItem->value.iNumber;
dNumber = ( double ) pItem->item.asInteger.value;
break;
case IT_LONG:
dNumber = ( double ) pItem->value.lNumber;
dNumber = ( double ) pItem->item.asLong.value;
break;
case IT_DOUBLE:
dNumber = pItem->value.dNumber;
dNumber = pItem->item.asDouble.value;
break;
default:
@@ -1600,11 +1605,11 @@ void PopStatic( WORD wStatic )
PHB_ITEM pStatic;
StackPop();
pStatic = ( ( PBASEARRAY ) aStatics.value.pBaseArray )->pItems + stack.iStatics +
pStatic = aStatics.item.asArray.value->pItems + stack.iStatics +
wStatic - 1;
if( IS_BYREF( pStatic ) )
ItemCopy( stack.pItems + pStatic->value.wItem, stack.pPos );
ItemCopy( stack.pItems + pStatic->item.asRefer.value, stack.pPos );
else
ItemCopy( pStatic, stack.pPos );
@@ -1614,17 +1619,18 @@ void PopStatic( WORD wStatic )
void Power( void )
{
double d2 = PopDouble();
double d1 = PopDouble();
WORD wDec1, wDec2;
double d2 = PopDouble( &wDec2 );
double d1 = PopDouble( &wDec1 );
PushNumber( pow( d1, d2 ), hb_set.HB_SET_DECIMALS );
PushNumber( pow( d1, d2 ), (wDec1>wDec2) ? wDec1 : wDec2 );
}
void PushLogical( int iTrueFalse )
{
ItemRelease( stack.pPos );
stack.pPos->wType = IT_LOGICAL;
stack.pPos->value.iLogical = iTrueFalse;
stack.pPos->type = IT_LOGICAL;
stack.pPos->item.asLogical.value = iTrueFalse;
StackPush();
HB_DEBUG( "PushLogical\n" );
}
@@ -1639,18 +1645,18 @@ void PushLocal( SHORT iLocal )
pLocal = stack.pBase + 1 + iLocal;
if( IS_BYREF( pLocal ) )
{
if( pLocal->value.iNumber >= 0 )
ItemCopy( stack.pPos, stack.pItems + pLocal->value.wItem );
if( pLocal->item.asRefer.value >= 0 )
ItemCopy( stack.pPos, stack.pItems + pLocal->item.asRefer.value );
else
/* local variable referenced in a codeblock */
ItemCopy( stack.pPos, CodeblockGetVar( stack.pItems + pLocal->wBase +1, pLocal->value.wItem ) );
ItemCopy( stack.pPos, CodeblockGetVar( stack.pItems + pLocal->item.asRefer.stackbase +1, pLocal->item.asRefer.value) );
}
else
ItemCopy( stack.pPos, pLocal );
}
else
/* local variable referenced in a codeblock */
ItemCopy( stack.pPos, CodeblockGetVar( stack.pBase + 1, iLocal ) );
ItemCopy( stack.pPos, CodeblockGetVar( stack.pBase + 1, (LONG)iLocal ) );
StackPush();
HB_DEBUG2( "PushLocal %i\n", iLocal );
}
@@ -1658,16 +1664,17 @@ void PushLocal( SHORT iLocal )
void PushLocalByRef( SHORT iLocal )
{
ItemRelease( stack.pPos );
stack.pPos->wType = IT_BYREF;
stack.pPos->type = IT_BYREF;
/* we store its stack offset instead of a pointer to support a dynamic stack */
if( iLocal >= 0 )
/* local variable or local parameter */
stack.pPos->value.wItem = stack.pBase + 1 + iLocal - stack.pItems;
/* store the position of referenced local variable on the eval stack */
stack.pPos->item.asRefer.value = stack.pBase + 1 + iLocal - stack.pItems;
else
{
/* local variable referenced in a codeblock */
stack.pPos->value.iNumber = iLocal;
stack.pPos->wBase = stack.pBase - stack.pItems;
stack.pPos->item.asRefer.value = iLocal;
stack.pPos->item.asRefer.stackbase = stack.pBase - stack.pItems;
}
StackPush();
@@ -1698,7 +1705,7 @@ void PushNumber( double dNumber, WORD wDec )
void PushStatic( WORD wStatic )
{
ItemCopy( stack.pPos, ( ( PBASEARRAY ) aStatics.value.pBaseArray )->pItems +
ItemCopy( stack.pPos, aStatics.item.asArray.value->pItems +
stack.iStatics + wStatic - 1 );
StackPush();
HB_DEBUG2( "PushStatic %i\n", wStatic );
@@ -1712,9 +1719,9 @@ void PushString( char * szText, WORD wLength )
szTemp[ wLength ] = 0;
ItemRelease( stack.pPos );
stack.pPos->wType = IT_STRING;
stack.pPos->wLength = wLength;
stack.pPos->value.szText = szTemp;
stack.pPos->type = IT_STRING;
stack.pPos->item.asString.length = wLength;
stack.pPos->item.asString.value = szTemp;
StackPush();
HB_DEBUG( "PushString\n" );
}
@@ -1722,9 +1729,9 @@ void PushString( char * szText, WORD wLength )
void PushSymbol( PSYMBOL pSym )
{
ItemRelease( stack.pPos );
stack.pPos->wType = IT_SYMBOL;
stack.pPos->value.pSymbol = pSym;
stack.pPos->wBase = stack.pPos - stack.pItems;
stack.pPos->type = IT_SYMBOL;
stack.pPos->item.asSymbol.value = pSym;
stack.pPos->item.asSymbol.stackbase = stack.pPos - stack.pItems;
StackPush();
HB_DEBUG2( "PushSymbol: %s\n", pSym->szName );
}
@@ -1739,15 +1746,15 @@ void Push( PHB_ITEM pItem )
void PushBlock( BYTE * pCode, WORD wSize, WORD wParam, PSYMBOL pSymbols )
{
ItemRelease( stack.pPos );
stack.pPos->wType = IT_BLOCK;
stack.pPos->value.pCodeblock = CodeblockNew( pCode, wSize, pSymbols,
stack.pPos->type = IT_BLOCK;
stack.pPos->item.asBlock.value = CodeblockNew( pCode, wSize, pSymbols,
stack.iStatics, stack.pBase - stack.pItems );
/* store the stack base of function where the codeblock was defined */
stack.pPos->wBase = stack.pBase - stack.pItems;
stack.pPos->item.asBlock.stackbase = stack.pBase - stack.pItems;
/* store the number of expected parameters */
stack.pPos->wParams = wParam;
stack.pPos->item.asBlock.paramcnt = wParam;
/* store the line number where the codeblock was defined */
stack.pPos->wLine = stack.pBase->wLine;
stack.pPos->item.asBlock.lineno = stack.pBase->item.asSymbol.lineno;
StackPush();
HB_DEBUG( "PushBlock\n" );
}
@@ -1755,8 +1762,8 @@ void PushBlock( BYTE * pCode, WORD wSize, WORD wParam, PSYMBOL pSymbols )
void PushDate( LONG lDate )
{
ItemRelease( stack.pPos );
stack.pPos->wType = IT_DATE;
stack.pPos->value.lDate = lDate;
stack.pPos->type = IT_DATE;
stack.pPos->item.asDate.value = lDate;
StackPush();
HB_DEBUG( "PushDate\n" );
}
@@ -1764,11 +1771,11 @@ void PushDate( LONG lDate )
void PushDouble( double dNumber, WORD wDec )
{
ItemRelease( stack.pPos );
stack.pPos->wType = IT_DOUBLE;
stack.pPos->value.dNumber = dNumber;
if( dNumber >= 10000000000.0 ) stack.pPos->wLength = 20;
else stack.pPos->wLength = 10;
stack.pPos->wDec = (wDec > 9) ? 9 : wDec;
stack.pPos->type = IT_DOUBLE;
stack.pPos->item.asDouble.value = dNumber;
if( dNumber >= 10000000000.0 ) stack.pPos->item.asDouble.length = 20;
else stack.pPos->item.asDouble.length = 10;
stack.pPos->item.asDouble.decimal = (wDec > 9) ? 9 : wDec;
StackPush();
HB_DEBUG( "PushDouble\n" );
}
@@ -1776,10 +1783,10 @@ void PushDouble( double dNumber, WORD wDec )
void PushInteger( int iNumber )
{
ItemRelease( stack.pPos );
stack.pPos->wType = IT_INTEGER;
stack.pPos->value.iNumber = iNumber;
stack.pPos->wLength = 10;
stack.pPos->wDec = 0;
stack.pPos->type = IT_INTEGER;
stack.pPos->item.asInteger.value = iNumber;
stack.pPos->item.asInteger.length = 10;
stack.pPos->item.asInteger.decimal = 0;
StackPush();
HB_DEBUG( "PushInteger\n" );
}
@@ -1787,10 +1794,10 @@ void PushInteger( int iNumber )
void PushLong( long lNumber )
{
ItemRelease( stack.pPos );
stack.pPos->wType = IT_LONG;
stack.pPos->value.lNumber = lNumber;
stack.pPos->wLength = 10;
stack.pPos->wDec = 0;
stack.pPos->type = IT_LONG;
stack.pPos->item.asLong.value = lNumber;
stack.pPos->item.asLong.length = 10;
stack.pPos->item.asLong.decimal = 0;
StackPush();
HB_DEBUG( "PushLong\n" );
}
@@ -1799,8 +1806,8 @@ void RetValue( void )
{
StackPop();
ItemCopy( &stack.Return, stack.pPos );
if( stack.Return.wType == IT_BLOCK )
CodeblockDetach( (PCODEBLOCK)stack.Return.value.pCodeblock );
if( stack.Return.type == IT_BLOCK )
CodeblockDetach( stack.Return.item.asBlock.value );
HB_DEBUG( "RetValue\n" );
}
@@ -1850,7 +1857,7 @@ void StackPush( void )
/* now, push it: */
stack.pPos++;
stack.pPos->wType = IT_NIL;
stack.pPos->type = IT_NIL;
return;
}
@@ -1869,14 +1876,14 @@ void StackInit( void )
for( p = stack.pBase; p <= stack.pPos; p++ )
{
switch( p->wType )
switch( p->type )
{
case IT_NIL:
printf( "NIL " );
break;
case IT_ARRAY:
if( ( ( PBASEARRAY ) p->value.pBaseArray )->wClass )
if( p->item.asArray.value->wClass )
printf( "OBJECT " );
else
printf( "ARRAY " );
@@ -1895,14 +1902,15 @@ void StackInit( void )
break;
case IT_LOGICAL:
printf( "LOGICAL[%i] ", p->value.iLogical );
printf( "LOGICAL[%i] ", p->item.asLogical.value );
break;
case IT_LONG:
printf( "LONG" );
break;
case IT_INTEGER:
printf( "INTEGER[%i] ", p->value.iNumber );
printf( "INTEGER[%i] ", p->item.asInteger.value );
break;
case IT_STRING:
@@ -1910,11 +1918,11 @@ void StackInit( void )
break;
case IT_SYMBOL:
printf( "SYMBOL(%s) ", p->value.pSymbol->szName );
printf( "SYMBOL(%s) ", p->item.asSymbol.value->szName );
break;
default:
printf( "UNKNOWN[%i] ", p->wType );
printf( "UNKNOWN[%i] ", p->type );
break;
}
}
@@ -2069,14 +2077,14 @@ HARBOUR HB_LEN( void )
{
pItem = hb_param( 1, IT_ANY );
switch( pItem->wType )
switch( pItem->type )
{
case IT_ARRAY:
hb_retnl( ( ( PBASEARRAY ) pItem->value.pBaseArray )->ulLen );
hb_retnl( pItem->item.asArray.value->ulLen );
break;
case IT_STRING:
hb_retnl( pItem->wLength );
hb_retnl( pItem->item.asString.length );
break;
default:
@@ -2094,10 +2102,10 @@ HARBOUR HB_EMPTY(void)
if( pItem )
{
switch( pItem->wType & ~IT_BYREF )
switch( pItem->type & ~IT_BYREF )
{
case IT_ARRAY:
hb_retl( ( ( PBASEARRAY ) pItem->value.pBaseArray )->ulLen == 0 );
hb_retl( pItem->item.asArray.value->ulLen == 0 );
break;
case IT_STRING:
@@ -2146,10 +2154,10 @@ HARBOUR HB_VALTYPE( void )
{
pItem = hb_param( 1, IT_ANY );
switch( pItem->wType & ~IT_BYREF )
switch( pItem->type & ~IT_BYREF )
{
case IT_ARRAY:
if( ( ( PBASEARRAY ) pItem->value.pBaseArray )->wClass )
if( pItem->item.asArray.value->wClass )
hb_retc( "O" ); /* it is an object */
else
hb_retc( "A" );
@@ -2192,7 +2200,7 @@ HARBOUR HB_ERRORBLOCK(void)
HB_ITEM oldError;
PHB_ITEM pNewErrorBlock = hb_param( 1, IT_BLOCK );
oldError.wType = IT_NIL;
oldError.type = IT_NIL;
ItemCopy( &oldError, &errorBlock );
if( pNewErrorBlock )
@@ -2208,10 +2216,10 @@ HARBOUR HB_PROCNAME(void)
PHB_ITEM pBase = stack.pBase;
while( ( iLevel-- > 0 ) && pBase != stack.pItems )
pBase = stack.pItems + pBase->wBase;
pBase = stack.pItems + pBase->item.asSymbol.stackbase;
if( ( iLevel == -1 ) )
hb_retc( pBase->value.pSymbol->szName );
hb_retc( pBase->item.asSymbol.value->szName );
else
hb_retc( "" );
}
@@ -2222,10 +2230,10 @@ HARBOUR HB_PROCLINE(void)
PHB_ITEM pBase = stack.pBase;
while( ( iLevel-- > 0 ) && pBase != stack.pItems )
pBase = stack.pItems + pBase->wBase;
pBase = stack.pItems + pBase->item.asSymbol.stackbase;
if( iLevel == -1 )
hb_retni( pBase->wLine );
hb_retni( pBase->item.asSymbol.lineno );
else
hb_retni( 0 );
}
@@ -2247,8 +2255,8 @@ HARBOUR HB_ERRORLEVEL(void)
HARBOUR HB_PCOUNT(void)
{
PHB_ITEM pBase = stack.pItems + stack.pBase->wBase;
WORD wRet = pBase->wParams; /* Skip current function */
PHB_ITEM pBase = stack.pItems + stack.pBase->item.asSymbol.stackbase;
WORD wRet = pBase->item.asSymbol.paramcnt; /* Skip current function */
hb_retni( wRet );
}
@@ -2256,10 +2264,10 @@ HARBOUR HB_PCOUNT(void)
HARBOUR HB_PVALUE(void) /* PValue( <nArg> ) */
{
WORD wParam = hb_parni( 1 ); /* Get parameter */
PHB_ITEM pBase = stack.pItems + stack.pBase->wBase;
PHB_ITEM pBase = stack.pItems + stack.pBase->item.asSymbol.stackbase;
/* Skip function + self */
if( wParam && wParam <= pBase->wParams ) /* Valid number */
if( wParam && wParam <= pBase->item.asSymbol.paramcnt ) /* Valid number */
hb_itemReturn( pBase + 1 + wParam );
else
{

View File

@@ -56,8 +56,10 @@ HARBOUR HB_MONTH( void );
HARBOUR HB_PCOUNT( void );
HARBOUR HB_REPLICATE( void );
HARBOUR HB_ROW( void );
HARBOUR HB_ROUND( void );
HARBOUR HB_RTRIM( void );
HARBOUR HB_SECONDS( void );
HARBOUR HB_SETPOS( void );
HARBOUR HB_SPACE( void );
HARBOUR HB_SQRT( void );
HARBOUR HB_STOD( void );
@@ -117,12 +119,12 @@ static SYMBOL symbols[] = {
{ "RECNO" , FS_PUBLIC, NULL , 0 },
{ "REPLICATE" , FS_PUBLIC, HB_REPLICATE , 0 },
{ "RLOCK" , FS_PUBLIC, NULL , 0 },
{ "ROUND" , FS_PUBLIC, NULL , 0 },
{ "ROUND" , FS_PUBLIC, HB_ROUND , 0 },
{ "ROW" , FS_PUBLIC, HB_ROW , 0 },
{ "RTRIM" , FS_PUBLIC, HB_RTRIM , 0 },
{ "SECONDS" , FS_PUBLIC, HB_SECONDS , 0 },
{ "SELECT" , FS_PUBLIC, NULL , 0 },
{ "SETPOS" , FS_PUBLIC, NULL , 0 },
{ "SETPOS" , FS_PUBLIC, HB_SETPOS , 0 },
{ "SPACE" , FS_PUBLIC, HB_SPACE , 0 },
{ "SQRT" , FS_PUBLIC, HB_SQRT , 0 },
{ "STOD" , FS_PUBLIC, HB_STOD , 0 },
@@ -144,8 +146,14 @@ static SYMBOL symbols[] = {
void InitSymbolTable( void )
{
/*
* Place here your <modulename>__InitSymbols functions
* Place here your user defined <modulename>__InitSymbols functions
*/
/*
* The symbol tables from runtime support modules start here
*/
#ifdef HARBOUR_STRICT_ANSI_C
Arrays__InitSymbols();
Classes__InitSymbols();
Console__InitSymbols();
@@ -158,8 +166,12 @@ void InitSymbolTable( void )
Math__InitSymbols();
Memotran__InitSymbols();
Set__InitSymbols();
Strings__InitSymbols();
Strings__InitSymbols();
#ifdef HARBOUR_STRICT_CLIPPER_COMPATIBILITY
Strings__InitInfinity
#endif
Transfrm__InitSymbols();
#endif
/*
* The system symbol table with runtime functions HAVE TO be called last

View File

@@ -80,3 +80,9 @@ b ;
RETURN nil
FUNCTION TEST1() ; LOCAL n; IF n==5; n =4; END; RETURN n
FUNCTION TEST2(); LOCAL n
WHILE n<5; n++; END
RETURN n