From e6e584567017490003de54e12fbdc0efb06b05b0 Mon Sep 17 00:00:00 2001 From: Ryszard Glab Date: Fri, 20 Aug 1999 13:13:51 +0000 Subject: [PATCH] ChangeLog 19990820-15:05 GMT+2 --- harbour/ChangeLog | 34 ++ harbour/include/external.ch | 547 +++++++++++++++++++++++++++++ harbour/source/rtl/dir.c | 13 +- harbour/source/rtl/strings.c | 2 +- harbour/source/runner/Makefile | 6 +- harbour/source/runner/external.prg | 547 +++++++++++++++++++++++++++++ harbour/source/runner/runhrb.c | 447 +++++++++++++++++++++++ harbour/source/runner/runmain.prg | 16 + harbour/source/runner/runner.c | 2 +- 9 files changed, 1610 insertions(+), 4 deletions(-) create mode 100644 harbour/include/external.ch create mode 100644 harbour/source/runner/external.prg create mode 100644 harbour/source/runner/runhrb.c create mode 100644 harbour/source/runner/runmain.prg diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 2232fa714e..13d234c41e 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,37 @@ +19990820-15:05 GMT+2 Ryszard Glab + + *source/rtl/strings.c + * corrected a NULL assigment to '\x0' + + *source/rdd/dbcmd.c + * corrected SELF_DELETE to SELF_DELETED in HB_DELETED function + + *source/runner/runner.c + * corrected NULL to 0L (we are returning LONG in ReadLong()) + + *include/external.ch + + new file with EXTERNAL declaration for all harbour + functions/procedures + + *source/rtl/dir.c + * corrected a parameter passed to 'opendir' function when + Watcom C/C++ is used + + *source/runner/Makefile + *source/runner/external.prg + *source/runner/runhrb.c + *source/runner/runmain.prg + * new files to create the runner executable. + + external.prg is here temporary because the preprocessor doesn't + process EXTERNAL statement yet + + runhrb.c is copied from runner.c however without all code used + to handle the symbol table + + runmain.prg calls HB_RUN from runhrb.c + NOTE: I have left runner.c unchanged because I was unable to + replace it with new files in all these build*.bat - these + build*.bat doesn't allow to create an executable from more then + one source file :( + 19990820-14:40 GMT+1 Victor Szel * include/hbsetup.h + HARBOUR_USE_GTAPI is automatically #defined if any type of the GTAPIs diff --git a/harbour/include/external.ch b/harbour/include/external.ch new file mode 100644 index 0000000000..5ad1fc8fbb --- /dev/null +++ b/harbour/include/external.ch @@ -0,0 +1,547 @@ +// $Id$ +/* + Harbour Project source code + + The declarations for all harbour defined functions/procedures. + + Copyright 1999 Ryszard Glab + www - http://www.harbour-project.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version, with one exception: + + The exception is that if you link the Harbour Runtime Library (HRL) + and/or the Harbour Virtual Machine (HVM) with other files to produce + an executable, this does not by itself cause the resulting executable + to be covered by the GNU General Public License. Your use of that + executable is in no way restricted on account of linking the HRL + and/or HVM code into it. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA (or visit + their web site at http://www.gnu.org/). +*/ + +// +// Files from: vm +// +// +//symbols from file: vm/hvm.c +// +EXTERNAL ERRORSYS +EXTERNAL ERRORNEW +EXTERNAL EVAL +EXTERNAL LEN +EXTERNAL EMPTY +EXTERNAL VALTYPE +EXTERNAL ERRORBLOCK +EXTERNAL PROCNAME +EXTERNAL PROCLINE +EXTERNAL __QUIT +EXTERNAL ERRORLEVEL +EXTERNAL PCOUNT +EXTERNAL PVALUE +// +//symbols from file: vm/dynsym.c +// +EXTERNAL __DYNSCOUNT +EXTERNAL __DYNSGETNAME +EXTERNAL __DYNSGETINDEX +// +//symbols from file: vm/initsymb.c +// +//------------------------------------------------------------ +// Files from: rtl +// +// +//symbols from file: rtl/arrays.c +// +EXTERNAL AADD +EXTERNAL ACLONE +EXTERNAL ACOPY +EXTERNAL ADEL +EXTERNAL AEVAL +EXTERNAL AFILL +EXTERNAL AINS +EXTERNAL ARRAY +EXTERNAL ASCAN +EXTERNAL ASIZE +EXTERNAL ASORT +EXTERNAL ATAIL +// +//symbols from file: rtl/classes.c +// +EXTERNAL __CLSNEW +EXTERNAL __CLSINST +EXTERNAL __CLSINSTSUPER +EXTERNAL __CLSADDMSG +EXTERNAL __CLSDELMSG +EXTERNAL __CLSMODMSG +EXTERNAL __CLS_CNTCLSDATA +EXTERNAL __CLS_CNTDATA +EXTERNAL __CLS_DECDATA +EXTERNAL __CLS_INCDATA +EXTERNAL __OBJGETCLSNAME +EXTERNAL __OBJCLONE +EXTERNAL __OBJHASMSG +EXTERNAL __OBJSENDMSG +EXTERNAL __OBJGETMSGLIST +EXTERNAL __OBJGETMETHODLIST +EXTERNAL __OBJGETVALUELIST +EXTERNAL __OBJSETVALUELIST +EXTERNAL __OBJHASDATA +EXTERNAL __OBJHASMETHOD +EXTERNAL __OBJADDDATA +EXTERNAL __OBJADDINLINE +EXTERNAL __OBJADDMETHOD +EXTERNAL __OBJDELDATA +EXTERNAL __OBJDELINLINE +EXTERNAL __OBJDELMETHOD +EXTERNAL __OBJMODINLINE +EXTERNAL __OBJMODMETHOD +// +//symbols from file: rtl/codebloc.c +// +// +//symbols from file: rtl/console.c +// +EXTERNAL __ACCEPT +EXTERNAL __EJECT +EXTERNAL COL +EXTERNAL ROW +EXTERNAL DBGSHADOW +EXTERNAL DEVOUT +EXTERNAL DEVOUTPICT +EXTERNAL DEVPOS +EXTERNAL DISPBEGIN +EXTERNAL DISPBOX +EXTERNAL DISPCOUNT +EXTERNAL DISPEND +EXTERNAL DISPOUT +EXTERNAL ISCOLOR +EXTERNAL MAXCOL +EXTERNAL MAXROW +EXTERNAL NOSNOW +EXTERNAL OUTSTD +EXTERNAL OUTERR +EXTERNAL PCOL +EXTERNAL PROW +EXTERNAL RESTSCREEN +EXTERNAL SCROLL +EXTERNAL SAVESCREEN +EXTERNAL SETCURSOR +EXTERNAL SETBLINK +EXTERNAL SETPOS +EXTERNAL SETPRC +EXTERNAL SHADOW +EXTERNAL QOUT +EXTERNAL QQOUT +EXTERNAL __COLORINDEX +// +//symbols from file: rtl/copyfile.c +// +EXTERNAL __COPYFILE +// +//symbols from file: rtl/dates.c +// +EXTERNAL CDOW +EXTERNAL CMONTH +EXTERNAL CTOD +EXTERNAL DATE +EXTERNAL DAY +EXTERNAL DOW +EXTERNAL DTOC +EXTERNAL DTOS +EXTERNAL MONTH +EXTERNAL SECONDS +EXTERNAL STOD +EXTERNAL TIME +EXTERNAL YEAR +// +//symbols from file: rtl/descend.c +// +EXTERNAL DESCEND +// +//symbols from file: rtl/dir.c +// +EXTERNAL DIRECTORY +// +//symbols from file: rtl/do.c +// +EXTERNAL DO +// +//symbols from file: rtl/environ.c +// +EXTERNAL __RUN +EXTERNAL GETENV +EXTERNAL OS +EXTERNAL VERSION +// +//symbols from file: rtl/errorapi.c +// +EXTERNAL __ERRRT_BASE +// +//symbols from file: rtl/extend.c +// +// +//symbols from file: rtl/filesys.c +// +EXTERNAL BIN2I +EXTERNAL BIN2L +EXTERNAL BIN2W +EXTERNAL FCLOSE +EXTERNAL FCREATE +EXTERNAL FERASE +EXTERNAL FERROR +EXTERNAL FILE +EXTERNAL FOPEN +EXTERNAL FREAD +EXTERNAL FREADSTR +EXTERNAL FRENAME +EXTERNAL FSEEK +EXTERNAL FWRITE +EXTERNAL CURDIR +EXTERNAL I2BIN +EXTERNAL L2BIN +EXTERNAL W2BIN +// +//symbols from file: rtl/fm.c +// +// +//symbols from file: rtl/gtapi.c +// +// +//symbols from file: rtl/gtxxx.c +// +// +//symbols from file: rtl/hardcr.c +// +EXTERNAL HARDCR +// +//symbols from file: rtl/inkey.c +// +EXTERNAL __KEYBOARD +EXTERNAL INKEY +EXTERNAL LASTKEY +EXTERNAL NEXTKEY +// +//symbols from file: rtl/itemapi.c +// +// +//symbols from file: rtl/langapi.c +// +// +//symbols from file: rtl/math.c +// +EXTERNAL ABS +EXTERNAL EXP +EXTERNAL INT +EXTERNAL LOG +EXTERNAL MAX +EXTERNAL MIN +EXTERNAL MOD +EXTERNAL ROUND +EXTERNAL SQRT +// +//symbols from file: rtl/memvars.c +// +EXTERNAL __MVPUBLIC +EXTERNAL __MVPRIVATE +EXTERNAL __MVXRELEASE +EXTERNAL __MVRELEASE +EXTERNAL __MVSCOPE +EXTERNAL __MVCLEAR +// +//symbols from file: rtl/msgxxx.c +// +// +//symbols from file: rtl/mtran.c +// +EXTERNAL MEMOTRAN +// +//symbols from file: rtl/set.c +// +EXTERNAL SET +EXTERNAL __SETCENTURY +// +//symbols from file: rtl/setcolor.c +// +EXTERNAL SETCOLOR +EXTERNAL COLORSELECT +// +//symbols from file: rtl/strings.c +// +EXTERNAL ALLTRIM +EXTERNAL ASC +EXTERNAL AT +EXTERNAL CHR +EXTERNAL ISALPHA +EXTERNAL ISDIGIT +EXTERNAL ISUPPER +EXTERNAL ISLOWER +EXTERNAL LEFT +EXTERNAL LOWER +EXTERNAL LTRIM +EXTERNAL PAD +EXTERNAL PADC +EXTERNAL PADL +EXTERNAL PADR +EXTERNAL RAT +EXTERNAL REPLICATE +EXTERNAL RIGHT +EXTERNAL RTRIM +EXTERNAL SPACE +EXTERNAL STR +EXTERNAL STRTRAN +EXTERNAL STUFF +EXTERNAL SUBSTR +EXTERNAL TRIM +EXTERNAL UPPER +EXTERNAL VAL +// +//symbols from file: rtl/transfrm.c +// +EXTERNAL TRANSFORM +// +//symbols from file: rtl/tone.c +// +EXTERNAL TONE +// +//symbols from file: rtl/achoice.prg +// +EXTERNAL ACHOICE +// +//symbols from file: rtl/adir.prg +// +EXTERNAL ADIR +// +//symbols from file: rtl/alert.prg +// +EXTERNAL ALERT +// +//symbols from file: rtl/asort.prg +// +// +//symbols from file: rtl/devoutp.prg +// +// +//symbols from file: rtl/terror.prg +// +// +//symbols from file: rtl/errorsys.prg +// +// +//symbols from file: rtl/menuto.prg +// +EXTERNAL __ATPROMPT +EXTERNAL __MENUTO +// +//symbols from file: rtl/objfunc.prg +// +// +//symbols from file: rtl/readvar.prg +// +EXTERNAL READVAR +// +//symbols from file: rtl/setkey.prg +// +EXTERNAL SETKEY +EXTERNAL SETKEYGET +EXTERNAL SETKEYSAVE +EXTERNAL SETKEYCHECK +// +//symbols from file: rtl/tclass.prg +// +EXTERNAL TCLASS +// +//symbols from file: rtl/tget.prg +// +EXTERNAL GETNEW +EXTERNAL _GET_ +// +//symbols from file: rtl/tgetlist.prg +// +EXTERNAL READMODAL +// +//symbols from file: rtl/tbcolumn.prg +// +EXTERNAL TBCOLUMNNEW +// +//symbols from file: rtl/tbrowse.prg +// +EXTERNAL TBROWSENEW +// +//symbols from file: rtl/xsavescr.prg +// +EXTERNAL __XSAVESCREEN +EXTERNAL __XRESTSCREEN +// +//symbols from file: rtl/browdb.prg +// +EXTERNAL TBROWSEDB +//------------------------------------------------------------ +// Files from: tools +// +// +//symbols from file: tools/asciisum.c +// +EXTERNAL GT_ASCIISUM +// +//symbols from file: tools/ascpos.c +// +EXTERNAL GT_ASCPOS +// +//symbols from file: tools/atdiff.c +// +EXTERNAL GT_ATDIFF +// +//symbols from file: tools/chareven.c +// +EXTERNAL GT_CHAREVEN +// +//symbols from file: tools/charmix.c +// +EXTERNAL GT_CHARMIX +// +//symbols from file: tools/charodd.c +// +EXTERNAL GT_CHARODD +// +//symbols from file: tools/chrcount.c +// +EXTERNAL GT_CHRCOUNT +// +//symbols from file: tools/chrfirst.c +// +EXTERNAL GT_CHRFIRST +// +//symbols from file: tools/chrtotal.c +// +EXTERNAL GT_CHRTOTAL +// +//symbols from file: tools/dates2.c +// +EXTERNAL ADAYS +EXTERNAL AMONTHS +EXTERNAL BOM +EXTERNAL BOY +EXTERNAL DAYSINMONTH +EXTERNAL DOY +EXTERNAL EOM +EXTERNAL EOY +EXTERNAL ISLEAPYEAR +EXTERNAL WOM +EXTERNAL WOY +// +//symbols from file: tools/datesx.c +// +EXTERNAL DATETIME +// +//symbols from file: tools/debug.c +// +EXTERNAL __ASTATIC +EXTERNAL __STATIC +EXTERNAL __GLOBALSTACKLEN +EXTERNAL __AGLOBALSTACK +EXTERNAL __STACKLEN +EXTERNAL __ASTACK +EXTERNAL __APARAM +// +//symbols from file: tools/hb_f.c +// +EXTERNAL HB_FUSE +EXTERNAL HB_FRECNO +EXTERNAL HB_FSKIP +EXTERNAL HB_FREADLN +EXTERNAL HB_FEOF +EXTERNAL HB_FGOTO +EXTERNAL HB_FGOBOTTOM +EXTERNAL HB_FGOTOP +EXTERNAL HB_FLASTREC +EXTERNAL HB_FSELECT +// +//symbols from file: tools/io.c +// +//removed manually +// +//symbols from file: tools/mathx.c +// +EXTERNAL ACOS +EXTERNAL ASIN +EXTERNAL ATAN +EXTERNAL COS +EXTERNAL COSH +EXTERNAL LOG10 +EXTERNAL SIN +EXTERNAL SINH +EXTERNAL TAN +EXTERNAL TANH +EXTERNAL PI +// +//symbols from file: tools/strasint.c +// +// +//symbols from file: tools/strcount.c +// +EXTERNAL GT_STRCOUNT +// +//symbols from file: tools/strcspn.c +// +EXTERNAL GT_STRCSPN +// +//symbols from file: tools/strdiff.c +// +EXTERNAL GT_STRDIFF +// +//symbols from file: tools/strexpan.c +// +EXTERNAL GT_STREXPAND +// +//symbols from file: tools/strfmt.c +// +EXTERNAL STRFORMAT +// +//symbols from file: tools/stringsx.c +// +EXTERNAL STRTOKEN +EXTERNAL STRDUMP +EXTERNAL ROT13 +// +//symbols from file: tools/strleft.c +// +EXTERNAL GT_STRLEFT +// +//symbols from file: tools/strpbrk.c +// +EXTERNAL GT_STRPBRK +// +//symbols from file: tools/strright.c +// +EXTERNAL GT_STRRIGHT +// +//symbols from file: tools/fileread.prg +// +EXTERNAL TFILEREAD +// +//symbols from file: tools/numtxten.prg +// +EXTERNAL NUMTOTXTEN +// +//symbols from file: tools/numtxthu.prg +// +//EXTERNAL NUMTOTXTHU +// +//symbols from file: tools/stringp.prg +// +EXTERNAL DEFAULT +EXTERNAL TOCHAR +EXTERNAL DEBUG +//------------------------------------------------------------ diff --git a/harbour/source/rtl/dir.c b/harbour/source/rtl/dir.c index 8ddf3e0a79..aed9815e61 100644 --- a/harbour/source/rtl/dir.c +++ b/harbour/source/rtl/dir.c @@ -179,6 +179,7 @@ HARBOUR HB_DIRECTORY( void ) long fsize; time_t ftime; char * pos; + int iDirnamelen; PHB_ITEM pdir; PHB_ITEM psubarray; @@ -210,10 +211,12 @@ HARBOUR HB_DIRECTORY( void ) } if (strlen(pattern) < 1) strcpy(pattern,"*.*"); - if (strlen(dirname) < 1) + iDirnameLen =strlen(dirname); + if( iDirnameLen < 1 ) { strcpy(dirname,".X"); dirname[1] = OS_PATH_DELIMITER; + iDirnamelen =2; } if (strlen(pattern) > 0) @@ -270,7 +273,15 @@ HARBOUR HB_DIRECTORY( void ) { strcpy(string,entry.achName); #else + #if defined( __WATCOMC__ ) + /* opendir in Watcom doesn't like the path delimiter at the end of a string */ + dirname[ iDirnameLen ] ='.'; + dirname[ iDirnameLen+1 ] ='\x0'; + #endif dir = opendir( dirname ); + #if defined( __WATCOMC__ ) + dirname[ iDirnameLen ] ='\x0'; + #endif if (NULL == dir) { /* TODO: proper error handling */ diff --git a/harbour/source/rtl/strings.c b/harbour/source/rtl/strings.c index eea4d6aa11..d1784a0b4a 100644 --- a/harbour/source/rtl/strings.c +++ b/harbour/source/rtl/strings.c @@ -1322,7 +1322,7 @@ char * hb_itemStr( PHB_ITEM pNumber, PHB_ITEM pWidth, PHB_ITEM pDec ) default: iBytes = 0; - *szResult = NULL; + szResult[ 0 ] = '\0'; /* null string */ break; } /* Set to asterisks in case of overflow */ diff --git a/harbour/source/runner/Makefile b/harbour/source/runner/Makefile index 3ae96c60d9..18ce430d95 100644 --- a/harbour/source/runner/Makefile +++ b/harbour/source/runner/Makefile @@ -5,8 +5,12 @@ ROOT = ../../ C_SOURCES=\ + runhrb.c -C_MAIN=runner.c +PRG_SOURCES=\ + external.prg + +PRG_MAIN=runmain.prg LIBS=\ tools \ diff --git a/harbour/source/runner/external.prg b/harbour/source/runner/external.prg new file mode 100644 index 0000000000..8160802762 --- /dev/null +++ b/harbour/source/runner/external.prg @@ -0,0 +1,547 @@ +// $Id$ +/* + Harbour Project source code + + The declarations for all harbour defined functions/procedures. + + Copyright 1999 Ryszard Glab + www - http://www.harbour-project.org + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version, with one exception: + + The exception is that if you link the Harbour Runtime Library (HRL) + and/or the Harbour Virtual Machine (HVM) with other files to produce + an executable, this does not by itself cause the resulting executable + to be covered by the GNU General Public License. Your use of that + executable is in no way restricted on account of linking the HRL + and/or HVM code into it. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA (or visit + their web site at http://www.gnu.org/). +*/ + +// +// Files from: vm +// +// +//symbols from file: vm/hvm.c +// +EXTERNAL ERRORSYS +EXTERNAL ERRORNEW +EXTERNAL EVAL +EXTERNAL LEN +EXTERNAL EMPTY +EXTERNAL VALTYPE +EXTERNAL ERRORBLOCK +EXTERNAL PROCNAME +EXTERNAL PROCLINE +EXTERNAL __QUIT +EXTERNAL ERRORLEVEL +EXTERNAL PCOUNT +EXTERNAL PVALUE +// +//symbols from file: vm/dynsym.c +// +EXTERNAL __DYNSCOUNT +EXTERNAL __DYNSGETNAME +EXTERNAL __DYNSGETINDEX +// +//symbols from file: vm/initsymb.c +// +//------------------------------------------------------------ +// Files from: rtl +// +// +//symbols from file: rtl/arrays.c +// +EXTERNAL AADD +EXTERNAL ACLONE +EXTERNAL ACOPY +EXTERNAL ADEL +EXTERNAL AEVAL +EXTERNAL AFILL +EXTERNAL AINS +EXTERNAL ARRAY +EXTERNAL ASCAN +EXTERNAL ASIZE +EXTERNAL ASORT +EXTERNAL ATAIL +// +//symbols from file: rtl/classes.c +// +EXTERNAL __CLSNEW +EXTERNAL __CLSINST +EXTERNAL __CLSINSTSUPER +EXTERNAL __CLSADDMSG +EXTERNAL __CLSDELMSG +EXTERNAL __CLSMODMSG +EXTERNAL __CLS_CNTCLSDATA +EXTERNAL __CLS_CNTDATA +EXTERNAL __CLS_DECDATA +EXTERNAL __CLS_INCDATA +EXTERNAL __OBJGETCLSNAME +EXTERNAL __OBJCLONE +EXTERNAL __OBJHASMSG +EXTERNAL __OBJSENDMSG +EXTERNAL __OBJGETMSGLIST +EXTERNAL __OBJGETMETHODLIST +EXTERNAL __OBJGETVALUELIST +EXTERNAL __OBJSETVALUELIST +EXTERNAL __OBJHASDATA +EXTERNAL __OBJHASMETHOD +EXTERNAL __OBJADDDATA +EXTERNAL __OBJADDINLINE +EXTERNAL __OBJADDMETHOD +EXTERNAL __OBJDELDATA +EXTERNAL __OBJDELINLINE +EXTERNAL __OBJDELMETHOD +EXTERNAL __OBJMODINLINE +EXTERNAL __OBJMODMETHOD +// +//symbols from file: rtl/codebloc.c +// +// +//symbols from file: rtl/console.c +// +EXTERNAL __ACCEPT +EXTERNAL __EJECT +EXTERNAL COL +EXTERNAL ROW +EXTERNAL DBGSHADOW +EXTERNAL DEVOUT +EXTERNAL DEVOUTPICT +EXTERNAL DEVPOS +EXTERNAL DISPBEGIN +EXTERNAL DISPBOX +EXTERNAL DISPCOUNT +EXTERNAL DISPEND +EXTERNAL DISPOUT +EXTERNAL ISCOLOR +EXTERNAL MAXCOL +EXTERNAL MAXROW +EXTERNAL NOSNOW +EXTERNAL OUTSTD +EXTERNAL OUTERR +EXTERNAL PCOL +EXTERNAL PROW +EXTERNAL RESTSCREEN +EXTERNAL SCROLL +EXTERNAL SAVESCREEN +EXTERNAL SETCURSOR +EXTERNAL SETBLINK +EXTERNAL SETPOS +EXTERNAL SETPRC +EXTERNAL SHADOW +EXTERNAL QOUT +EXTERNAL QQOUT +EXTERNAL __COLORINDEX +// +//symbols from file: rtl/copyfile.c +// +EXTERNAL __COPYFILE +// +//symbols from file: rtl/dates.c +// +EXTERNAL CDOW +EXTERNAL CMONTH +EXTERNAL CTOD +EXTERNAL DATE +EXTERNAL DAY +EXTERNAL DOW +EXTERNAL DTOC +EXTERNAL DTOS +EXTERNAL MONTH +EXTERNAL SECONDS +EXTERNAL STOD +EXTERNAL TIME +EXTERNAL YEAR +// +//symbols from file: rtl/descend.c +// +EXTERNAL DESCEND +// +//symbols from file: rtl/dir.c +// +EXTERNAL DIRECTORY +// +//symbols from file: rtl/do.c +// +EXTERNAL DO +// +//symbols from file: rtl/environ.c +// +EXTERNAL __RUN +EXTERNAL GETENV +EXTERNAL OS +EXTERNAL VERSION +// +//symbols from file: rtl/errorapi.c +// +EXTERNAL __ERRRT_BASE +// +//symbols from file: rtl/extend.c +// +// +//symbols from file: rtl/filesys.c +// +EXTERNAL BIN2I +EXTERNAL BIN2L +EXTERNAL BIN2W +EXTERNAL FCLOSE +EXTERNAL FCREATE +EXTERNAL FERASE +EXTERNAL FERROR +EXTERNAL FILE +EXTERNAL FOPEN +EXTERNAL FREAD +EXTERNAL FREADSTR +EXTERNAL FRENAME +EXTERNAL FSEEK +EXTERNAL FWRITE +EXTERNAL CURDIR +EXTERNAL I2BIN +EXTERNAL L2BIN +EXTERNAL W2BIN +// +//symbols from file: rtl/fm.c +// +// +//symbols from file: rtl/gtapi.c +// +// +//symbols from file: rtl/gtxxx.c +// +// +//symbols from file: rtl/hardcr.c +// +EXTERNAL HARDCR +// +//symbols from file: rtl/inkey.c +// +EXTERNAL __KEYBOARD +EXTERNAL INKEY +EXTERNAL LASTKEY +EXTERNAL NEXTKEY +// +//symbols from file: rtl/itemapi.c +// +// +//symbols from file: rtl/langapi.c +// +// +//symbols from file: rtl/math.c +// +EXTERNAL ABS +EXTERNAL EXP +EXTERNAL INT +EXTERNAL LOG +EXTERNAL MAX +EXTERNAL MIN +EXTERNAL MOD +EXTERNAL ROUND +EXTERNAL SQRT +// +//symbols from file: rtl/memvars.c +// +EXTERNAL __MVPUBLIC +EXTERNAL __MVPRIVATE +EXTERNAL __MVXRELEASE +EXTERNAL __MVRELEASE +EXTERNAL __MVSCOPE +EXTERNAL __MVCLEAR +// +//symbols from file: rtl/msgxxx.c +// +// +//symbols from file: rtl/mtran.c +// +EXTERNAL MEMOTRAN +// +//symbols from file: rtl/set.c +// +EXTERNAL SET +EXTERNAL __SETCENTURY +// +//symbols from file: rtl/setcolor.c +// +EXTERNAL SETCOLOR +EXTERNAL COLORSELECT +// +//symbols from file: rtl/strings.c +// +EXTERNAL ALLTRIM +EXTERNAL ASC +EXTERNAL AT +EXTERNAL CHR +EXTERNAL ISALPHA +EXTERNAL ISDIGIT +EXTERNAL ISUPPER +EXTERNAL ISLOWER +EXTERNAL LEFT +EXTERNAL LOWER +EXTERNAL LTRIM +EXTERNAL PAD +EXTERNAL PADC +EXTERNAL PADL +EXTERNAL PADR +EXTERNAL RAT +EXTERNAL REPLICATE +EXTERNAL RIGHT +EXTERNAL RTRIM +EXTERNAL SPACE +EXTERNAL STR +EXTERNAL STRTRAN +EXTERNAL STUFF +EXTERNAL SUBSTR +EXTERNAL TRIM +EXTERNAL UPPER +EXTERNAL VAL +// +//symbols from file: rtl/transfrm.c +// +EXTERNAL TRANSFORM +// +//symbols from file: rtl/tone.c +// +EXTERNAL TONE +// +//symbols from file: rtl/achoice.prg +// +EXTERNAL ACHOICE +// +//symbols from file: rtl/adir.prg +// +EXTERNAL ADIR +// +//symbols from file: rtl/alert.prg +// +EXTERNAL ALERT +// +//symbols from file: rtl/asort.prg +// +// +//symbols from file: rtl/devoutp.prg +// +// +//symbols from file: rtl/terror.prg +// +// +//symbols from file: rtl/errorsys.prg +// +// +//symbols from file: rtl/menuto.prg +// +EXTERNAL __ATPROMPT +EXTERNAL __MENUTO +// +//symbols from file: rtl/objfunc.prg +// +// +//symbols from file: rtl/readvar.prg +// +EXTERNAL READVAR +// +//symbols from file: rtl/setkey.prg +// +EXTERNAL SETKEY +EXTERNAL SETKEYGET +EXTERNAL SETKEYSAVE +EXTERNAL SETKEYCHECK +// +//symbols from file: rtl/tclass.prg +// +EXTERNAL TCLASS +// +//symbols from file: rtl/tget.prg +// +EXTERNAL GETNEW +EXTERNAL _GET_ +// +//symbols from file: rtl/tgetlist.prg +// +EXTERNAL READMODAL +// +//symbols from file: rtl/tbcolumn.prg +// +EXTERNAL TBCOLUMNNEW +// +//symbols from file: rtl/tbrowse.prg +// +EXTERNAL TBROWSENEW +// +//symbols from file: rtl/xsavescr.prg +// +EXTERNAL __XSAVESCREEN +EXTERNAL __XRESTSCREEN +// +//symbols from file: rtl/browdb.prg +// +EXTERNAL TBROWSEDB +//------------------------------------------------------------ +// Files from: tools +// +// +//symbols from file: tools/asciisum.c +// +EXTERNAL GT_ASCIISUM +// +//symbols from file: tools/ascpos.c +// +EXTERNAL GT_ASCPOS +// +//symbols from file: tools/atdiff.c +// +EXTERNAL GT_ATDIFF +// +//symbols from file: tools/chareven.c +// +EXTERNAL GT_CHAREVEN +// +//symbols from file: tools/charmix.c +// +EXTERNAL GT_CHARMIX +// +//symbols from file: tools/charodd.c +// +EXTERNAL GT_CHARODD +// +//symbols from file: tools/chrcount.c +// +EXTERNAL GT_CHRCOUNT +// +//symbols from file: tools/chrfirst.c +// +EXTERNAL GT_CHRFIRST +// +//symbols from file: tools/chrtotal.c +// +EXTERNAL GT_CHRTOTAL +// +//symbols from file: tools/dates2.c +// +EXTERNAL ADAYS +EXTERNAL AMONTHS +EXTERNAL BOM +EXTERNAL BOY +EXTERNAL DAYSINMONTH +EXTERNAL DOY +EXTERNAL EOM +EXTERNAL EOY +EXTERNAL ISLEAPYEAR +EXTERNAL WOM +EXTERNAL WOY +// +//symbols from file: tools/datesx.c +// +EXTERNAL DATETIME +// +//symbols from file: tools/debug.c +// +EXTERNAL __ASTATIC +EXTERNAL __STATIC +EXTERNAL __GLOBALSTACKLEN +EXTERNAL __AGLOBALSTACK +EXTERNAL __STACKLEN +EXTERNAL __ASTACK +EXTERNAL __APARAM +// +//symbols from file: tools/hb_f.c +// +EXTERNAL HB_FUSE +EXTERNAL HB_FRECNO +EXTERNAL HB_FSKIP +EXTERNAL HB_FREADLN +EXTERNAL HB_FEOF +EXTERNAL HB_FGOTO +EXTERNAL HB_FGOBOTTOM +EXTERNAL HB_FGOTOP +EXTERNAL HB_FLASTREC +EXTERNAL HB_FSELECT +// +//symbols from file: tools/io.c +// +// removed manually +// +//symbols from file: tools/mathx.c +// +EXTERNAL ACOS +EXTERNAL ASIN +EXTERNAL ATAN +EXTERNAL COS +EXTERNAL COSH +EXTERNAL LOG10 +EXTERNAL SIN +EXTERNAL SINH +EXTERNAL TAN +EXTERNAL TANH +EXTERNAL PI +// +//symbols from file: tools/strasint.c +// +// +//symbols from file: tools/strcount.c +// +EXTERNAL GT_STRCOUNT +// +//symbols from file: tools/strcspn.c +// +EXTERNAL GT_STRCSPN +// +//symbols from file: tools/strdiff.c +// +EXTERNAL GT_STRDIFF +// +//symbols from file: tools/strexpan.c +// +EXTERNAL GT_STREXPAND +// +//symbols from file: tools/strfmt.c +// +EXTERNAL STRFORMAT +// +//symbols from file: tools/stringsx.c +// +EXTERNAL STRTOKEN +EXTERNAL STRDUMP +EXTERNAL ROT13 +// +//symbols from file: tools/strleft.c +// +EXTERNAL GT_STRLEFT +// +//symbols from file: tools/strpbrk.c +// +EXTERNAL GT_STRPBRK +// +//symbols from file: tools/strright.c +// +EXTERNAL GT_STRRIGHT +// +//symbols from file: tools/fileread.prg +// +EXTERNAL TFILEREAD +// +//symbols from file: tools/numtxten.prg +// +EXTERNAL NUMTOTXTEN +// +//symbols from file: tools/numtxthu.prg +// +//EXTERNAL NUMTOTXTHU //it uses undefined symbol STRZERO +// +//symbols from file: tools/stringp.prg +// +EXTERNAL DEFAULT +EXTERNAL TOCHAR +EXTERNAL DEBUG +//------------------------------------------------------------ diff --git a/harbour/source/runner/runhrb.c b/harbour/source/runner/runhrb.c new file mode 100644 index 0000000000..076bb37f80 --- /dev/null +++ b/harbour/source/runner/runhrb.c @@ -0,0 +1,447 @@ +/* + * $Id$ + */ +/* + * Runner.c contains the .HRB object system + * + * Copyright(C) 1999 by Eddie Runia + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to: + * + * The Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "extend.h" +#include "pcode.h" +#include "errorapi.h" +#include "ctoharb.h" +#include "init.h" +#include "initsymd.h" + +/* #if INTEL32 */ +static BYTE prgFunction[] = { 0x68, 0x00, 0x00, 0x00, 0x00, + 0x68, 0x00, 0x00, 0x00, 0x00, + 0xE8, 0x00, 0x00, 0x00, 0x00, + 0x83, 0xC4, 0x08, + 0xC3 }; + /* push offset pcode + push offset symbols + call near relative hb_vmExecute + add esp, 8 + ret near */ + + /* This is the assembler output from : hb_vmExecute(pcode,symbols). */ + +/* #elseif INTEL16 */ +/* #elseif MOTOROLA */ +/* #elseif ... */ +/* #endif */ + + +typedef union +{ + BYTE * pAsmData; /* The assembler bytes */ + PHB_FUNC pFunPtr; /* The (dynamic) harbour + function */ +} ASM_CALL, *PASM_CALL; + +typedef struct +{ + char *szName; /* Name of the function */ + PASM_CALL pAsmCall; /* Assembler call */ + BYTE * pCode; /* P-code */ +} DYNFUNC, *PDYNFUNC; + + +#define SYM_NOLINK 0 /* Symbol does not have to + be linked */ +#define SYM_FUNC 1 /* Defined function */ +#define SYM_EXTERN 2 /* Prev. defined function */ + +#define SYM_NOT_FOUND 0xFFFFFFFF /* Symbol not found. + FindSymbol */ + + HARBOUR HB_HB_RUN(); +static PASM_CALL CreateFun( PHB_SYMB, BYTE * ); /* Create a dynamic function*/ +static ULONG FindSymbol( char *, PDYNFUNC, ULONG ); +static void HRB_FileClose( FILE * ); +static void HRB_FileRead ( char *, int, int, FILE * ); +static FILE *HRB_FileOpen ( char * ); + BYTE ReadByte( FILE * ); + char *ReadId ( FILE * ); + long ReadLong( FILE * ); + + +ULONG ulSymEntry = 0; /* Link enhancement */ + +/* + HB_Run( ) + + This program will get the data from the .HRB file and run the p-code + contained in it. + + In due time it should also be able to collect the data from the + binary/executable itself +*/ +HARBOUR HB_HB_RUN( void ) +{ + char *szFileName; + + FILE *file; + + ULONG ulSymbols; /* Number of symbols */ + ULONG ulFuncs; /* Number of functions */ + ULONG ulSize; /* Size of function */ + ULONG ul, ulPos; + + int i; + + PHB_SYMB pSymRead; /* Symbols read */ + PDYNFUNC pDynFunc; /* Functions read */ + PHB_DYNS pDynSym; + + if( hb_pcount() == 0 ) + printf( "\nPlease give HRB file name\n" ); + else + { + szFileName = hb_parc( 1 ); + file = HRB_FileOpen( szFileName ); /* Open as binary */ + if( file ) + { + ulSymbols = ReadLong( file ); + pSymRead = ( PHB_SYMB )hb_xgrab( ulSymbols * sizeof( HB_SYMB ) ); + + for( ul=0; ul < ulSymbols; ul++) /* Read symbols in .HRB */ + { + pSymRead[ ul ].szName = ReadId( file ); + pSymRead[ ul ].cScope = ReadByte( file ); + pSymRead[ ul ].pFunPtr = ( PHB_FUNC ) (ULONG) ReadByte( file ); + pSymRead[ ul ].pDynSym = NULL; + } + + ulFuncs = ReadLong( file ); /* Read number of functions */ + pDynFunc = ( PDYNFUNC ) hb_xgrab( ulFuncs * sizeof( DYNFUNC ) ); + for( ul=0; ul < ulFuncs; ul++) /* Read symbols in .HRB */ + { + pDynFunc[ ul ].szName = ReadId( file ); + + ulSize = ReadLong( file ); /* Read size of function */ + pDynFunc[ ul ].pCode = ( BYTE * )hb_xgrab( ulSize ); + HRB_FileRead( pDynFunc[ ul ].pCode, 1, ulSize, file ); + /* Read the block */ + + pDynFunc[ ul ].pAsmCall = CreateFun( pSymRead, + pDynFunc[ ul ].pCode ); + /* Create matching dynamic */ + /* function */ + } + + ulSymEntry = 0; + for( ul = 0; ul < ulSymbols; ul++ ) /* Linker */ + { + if( ( (ULONG) pSymRead[ ul ].pFunPtr ) == SYM_FUNC ) + { + ulPos = FindSymbol( pSymRead[ ul ].szName, pDynFunc, ulFuncs ); + if( ulPos != SYM_NOT_FOUND ) + { +/* if( hb_dynsymFind( pSymRead[ ul ].szName ) && + !( pSymRead[ ul ].cScope & FS_STATIC ) ) + { */ /* Exists and NOT static ? */ +/* printf( "\nDuplicate identifier '%s' %i.", + pSymRead[ ul ].szName, pSymRead[ul].cScope ); + exit( 1 ); + } */ + pSymRead[ ul ].pFunPtr = pDynFunc[ ulPos ].pAsmCall->pFunPtr; + } + else + pSymRead[ ul ].pFunPtr = ( PHB_FUNC ) SYM_EXTERN; + } + if( ( (ULONG) pSymRead[ ul ].pFunPtr ) == SYM_EXTERN ) + { /* External function */ + pDynSym = hb_dynsymFind( pSymRead[ ul ].szName ); + if( !pDynSym ) + { + printf( "\nUnknown or unregistered function '%s'.", + pSymRead[ ul ].szName ); + exit( 1 ); + } + pSymRead[ ul ].pFunPtr = pDynSym->pFunPtr; + } + } + + hb_vmProcessSymbols( pSymRead, ulSymbols ); + + /* Initialize static variables first + */ + for( ul = 0; ul < ulSymbols; ul++ ) /* Check INIT functions */ + { + if( (pSymRead[ ul ].cScope & FS_INITEXIT) == FS_INITEXIT ) + { + /* call (_INITSTATICS) function. This function assigns + * literal values to static variables only. There is no need + * to pass any parameters to this function because they + * cannot be used to initialize static variable. + */ + pSymRead[ ul ].pFunPtr(); + } + } + for( ul = 0; ul < ulSymbols; ul++ ) /* Check INIT functions */ + { + if( (pSymRead[ ul ].cScope & FS_INITEXIT) == FS_INIT ) + { + hb_vmPushSymbol( pSymRead + ul ); + hb_vmPushNil(); + for( i = 0; i < (hb_pcount() - 1); i++ ) + hb_vmPush( hb_param( i + 2, IT_ANY ) ); + /* Push other cmdline params*/ + hb_vmDo( hb_pcount() - 1 ); /* Run init function */ + } + } + + hb_vmPushSymbol( pSymRead ); + hb_vmPushNil(); + for( i = 0; i < (hb_pcount() - 1); i++ ) + hb_vmPush( hb_param( i + 2, IT_ANY ) ); /* Push other cmdline params*/ + hb_vmDo( hb_pcount() - 1 ); /* Run the thing !!! */ + + for( ul = 0; ul < ulSymbols; ul++ ) /* Check EXIT functions */ + { + if( ( pSymRead[ ul ].cScope & FS_INITEXIT ) == FS_EXIT ) + { + hb_vmPushSymbol( pSymRead + ul ); + hb_vmPushNil(); + hb_vmDo( 0 ); /* Run exit function */ + pSymRead[ ul ].cScope = pSymRead[ ul ].cScope & (~FS_EXIT); + /* Exit function cannot be + handled by main in hvm.c */ + } + } + + for( ul = 0; ul < ulFuncs; ul++ ) + { + hb_xfree( pDynFunc[ ul ].pAsmCall->pAsmData ); + hb_xfree( pDynFunc[ ul ].pAsmCall ); + hb_xfree( pDynFunc[ ul ].pCode ); + hb_xfree( pDynFunc[ ul ].szName ); + } + + for( ul = 0; ul < ulSymbols; ul++ ) + { + hb_xfree( pSymRead[ ul ].szName ); + } + + hb_xfree( pDynFunc ); + hb_xfree( pSymRead ); + HRB_FileClose( file ); + } + else + { + printf( "\nCannot open %s\n", szFileName ); + } + } +} + + +static ULONG FindSymbol( char *szName, PDYNFUNC pDynFunc, ULONG ulLoaded ) +{ + ULONG ulRet; + BYTE bFound; + + if( ( ulSymEntry < ulLoaded ) && /* Is it a normal list ? */ + !strcmp( szName, pDynFunc[ ulSymEntry ].szName ) ) + ulRet = ulSymEntry++; + else + { + bFound = FALSE; + ulRet = 0; + while( !bFound && ulRet < ulLoaded ) + { + if( !strcmp( szName, pDynFunc[ ulRet ].szName ) ) + bFound = TRUE; + else + ulRet++; + } + if( !bFound ) + ulRet = SYM_NOT_FOUND; + } + return( ulRet ); +} + + +/* ReadId + Read the next (zero terminated) identifier */ +char *ReadId( FILE *file ) +{ + char *szTemp; /* Temporary buffer */ + char *szIdx; + char *szRet; + + BYTE bCont = TRUE; + + szTemp = ( char * )hb_xgrab( 256 ); + szIdx = szTemp; + do + { + HRB_FileRead( szIdx, 1, 1, file ); + if( *szIdx ) + szIdx++; + else + bCont = FALSE; + } while( bCont ); + + szRet = (char *) hb_xgrab( szIdx - szTemp + 1 ); + strcpy( szRet, szTemp ); + hb_xfree( szTemp ); + + return( szRet ); +} + + +BYTE ReadByte( FILE *file ) +{ + BYTE bRet; + + HRB_FileRead( &bRet, 1, 1, file ); + return( bRet ); +} + + +long ReadLong( FILE *file ) +{ + char cLong[4]; /* Temporary long */ + + HRB_FileRead( cLong, 4, 1, file ); + + if( cLong[3] ) /* Convert to long if ok */ + { + PHB_ITEM pError = hb_errNew(); + hb_errPutDescription(pError, "Error reading .HRB file"); + hb_errLaunch(pError); + hb_errRelease(pError); + return( 0L ); + } + else + return( ( (BYTE) cLong[0] ) + + ( (BYTE) cLong[1] ) * 0x100 + + ( (BYTE) cLong[2] ) * 0x10000 + + ( (BYTE) cLong[3] ) * 0x1000000 ); +} + + +/* HRB_FileRead + Controlled read from file. If errornous -> Break */ +static void HRB_FileRead( char *cBuffer, int iSize, int iCount, FILE *fStream ) +{ + if( iCount != (int) fread( cBuffer, iSize, iCount, fStream ) ) + { /* Read error */ + PHB_ITEM pError = hb_errNew(); + hb_errPutDescription(pError, "Error reading .HRB file"); + hb_errLaunch(pError); + hb_errRelease(pError); + exit(1); + } +} + + +/* HRB_FileOpen + Open an .HRB file */ +static FILE *HRB_FileOpen( char *szFileName ) +{ + return( fopen( szFileName, "rb" ) ); +} + + +/* HRB_FileClose + Close an .HRB file */ +static void HRB_FileClose( FILE *file ) +{ + fclose( file ); +} + + +/* Patch an address of the dynamic function */ +static void Patch( BYTE * pCode, ULONG ulOffset, void *Address ) +{ +/* #if 32 bits and low byte first */ + + pCode[ ulOffset ] = ( (ULONG) Address ) & 0xFF; + pCode[ ulOffset + 1 ] = ( (ULONG) Address >> 8 ) & 0xFF; + pCode[ ulOffset + 2 ] = ( (ULONG) Address >> 16 ) & 0xFF; + pCode[ ulOffset + 3 ] = ( (ULONG) Address >> 24 ) & 0xFF; + +/* #elseif 16 bits and low byte first */ +/* #elseif 32 bits and high byte first */ +/* #elseif ... */ +/* #endif */ +} + + +/* Intel specific ?? Patch an address relative to the next instruction */ +static void PatchRelative( BYTE * pCode, ULONG ulOffset, + void *Address, ULONG ulNext ) +{ +/* #if 32 bits and low byte first */ + ULONG ulBase = (ULONG) pCode + ulNext; + /* Relative to next instruction */ + ULONG ulRelative = (ULONG) Address - ulBase; + + pCode[ ulOffset ] = ( ulRelative ) & 0xFF; + pCode[ ulOffset + 1 ] = ( ulRelative >> 8 ) & 0xFF; + pCode[ ulOffset + 2 ] = ( ulRelative >> 16 ) & 0xFF; + pCode[ ulOffset + 3 ] = ( ulRelative >> 24 ) & 0xFF; + +/* #elseif 16 bits and low byte first */ +/* #elseif 32 bits and high byte first */ +/* #elseif ... */ +/* #endif */ +} + + +/* + Create dynamic function. + + This function is needed, since it will allow the existing strategy of + function pointers to work properly. + + For each Harbour function a little program calling the virtual machine + should be present (see : *.c) + + Since these programs no longer exists when using this system, they should + be create dynamically at run-time. + + If a .PRG contains 10 functions, 10 dynamic functions are created which + are all the same :-) except for 2 pointers. +*/ +static PASM_CALL CreateFun( PHB_SYMB pSymbols, BYTE * pCode ) +{ + PASM_CALL asmRet = (PASM_CALL) hb_xgrab( sizeof( ASM_CALL ) ); + + asmRet->pAsmData = (BYTE * ) hb_xgrab( sizeof( prgFunction ) ); + memcpy( asmRet->pAsmData, prgFunction, sizeof( prgFunction ) ); + /* Copy new assembler code in */ +/* #if INTEL32 */ + + Patch( asmRet->pAsmData, 1, pSymbols ); /* Insert pointer to testsym */ + Patch( asmRet->pAsmData, 6, pCode); /* Insert pointer to testcode */ + PatchRelative( asmRet->pAsmData, 11, &hb_vmExecute, 15 ); + /* Insert pointer to hb_vmExecute() */ + +/* #elseif INTEL16 */ +/* #elseif MOTOROLA */ +/* #elseif ... */ +/* #endif */ + return( asmRet ); +} + diff --git a/harbour/source/runner/runmain.prg b/harbour/source/runner/runmain.prg new file mode 100644 index 0000000000..f11a8e8e58 --- /dev/null +++ b/harbour/source/runner/runmain.prg @@ -0,0 +1,16 @@ +// $Id$ +// +#include "external.ch" + +PROCEDURE MAIN( cHRBFile ) + + IF( ! EMPTY(cHRBFile) ) + HB_RUN( cHRBFile ) + ELSE + ? + ? "Usage:" + ? "./runmain hrbfile" + ? + ENDIF + +RETURN \ No newline at end of file diff --git a/harbour/source/runner/runner.c b/harbour/source/runner/runner.c index d4b0034377..395f000023 100644 --- a/harbour/source/runner/runner.c +++ b/harbour/source/runner/runner.c @@ -356,7 +356,7 @@ long ReadLong( FILE *file ) hb_errPutDescription(pError, "Error reading .HRB file"); hb_errLaunch(pError); hb_errRelease(pError); - return( NULL ); + return( 0L ); } else return( ( (BYTE) cLong[0] ) +