From 437b04a8eaabddb04f264fd77773358edc9543d5 Mon Sep 17 00:00:00 2001 From: Przemyslaw Czerpak Date: Wed, 8 Nov 2006 12:06:17 +0000 Subject: [PATCH] 2006-11-08 12:55 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/bin/hb-func.sh + added linker parametrs to hbcc * harbour/include/hbapi.h + added hb_retclenAdoptRaw() * harbour/include/hbapifs.h * harbour/source/common/hbfsapi.c * changed first parameters of hb_fsAddSearchPath() to const char * * harbour/include/hbclass.ch * update for new PP. I think that now we can try to create final version of our OOP rules. * harbour/include/hbdefs.h + added UCHAR and SCHAR typedefs * harbour/include/hbrddcdx.h * indenting * harbour/source/rdd/workarea.c ! fixed minor typo * harbour/source/common/hbdate.c * harbour/source/rtl/dates.c * moved hb_dateToday() and hb_dateTimeStr() from RTL to COMMON library - harbour/include/hbpp.h - harbour/source/pp/ppcomp.c - harbour/source/pp/ppcore.c - harbour/source/pp/pplib.c - harbour/source/pp/pptable.c - harbour/source/pp/pragma.c * harbour/utils/hbpp/Makefile * harbour/utils/hbpp/hbpp.c + harbour/utils/hbpp/hbpp.h + harbour/utils/hbpp/ppcomp.c + harbour/utils/hbpp/ppcore.c + harbour/utils/hbpp/pplib.c + harbour/utils/hbpp/pptable.c + harbour/utils/hbpp/pragma.c * moved all PP code to harbour/utils/hbpp It's interesting and working preprocessor and the code can be usable for some other things so I do not want to remove it. Probablly we should move it to contrib/hbpptext * harbour/include/hbcomp.h * harbour/include/hberrors.h * harbour/include/hbsetup.ch + harbour/include/hbpp.h + harbour/include/hbstdgen.ch * harbour/source/common/hbstr.c * harbour/source/compiler/Makefile * harbour/source/compiler/cmdcheck.c * harbour/source/compiler/harbour.c * harbour/source/compiler/harbour.l * harbour/source/compiler/hbgenerr.c + harbour/source/compiler/ppcomp.c * harbour/source/pp/Makefile + harbour/source/pp/ppcore.c + harbour/source/pp/pplib.c + harbour/source/pp/ppgen.c + New PP code written from scratch. It works in similar way to Clipper PP even the error codes are replicated. The code is MT safe does not have any limitation on size of preprocessed code, line, etc. It's also Clipper compatible lexer. It means that we do not longer need FLEX or SIMPLEX which can be replaced by new PP after some small modifications. Anyhow I haven't decided to make it myself. I would like to agree with with the rest of developers. I will be very happy if such modifications will be done by someone else, Ryszard? Meanwhile I current PP join on output the line tokens and give the string line to FLEX/SIMPLEX. It does not have any sense and all FLEX/SIMPLEX limitations are still existing. Ryszard, even if we keep it then I hope you can remove at least FLEX line buffer and use the one returned from PP. Because string tokens in parsed line are converted to text which is later once again decoded to tokens by FLEX I had to introduce new string format which supports embedded string delimiters. I chose modified version of xHarbour extension with escaped strings e"" so now FLEX understand such strings and decode them like C escaped strings. It means that you can use them also in the .prg code f.e.: outstd( e"Hello\n\rWorld" ) The new PP is also noticeable faster. You should see the difference compiling long files. The build in PP rules are generated automatically by ppgen program created from source/pp/ppgen.c I had to add to GNU source/pp/Makefile these two lines: pptable.c : ppgen$(EXE_EXT) ./ppgen$(EXE_EXT) $(TOP)$(ROOT)include/hbstdgen.ch -opptable.c -q Sth like that will have to be done also in non GNU make system. Now Harbour can be compiled only using GNU make. Marek can you update non GNU make files? I would like to leave this modification to you or other developers who can test it. It was quite big modification and I do not believe that I haven't make any mistakes but I hope that in few weeks I'll fix any reported bugs and it will resolve any PP problems. TODO: * error messages create one common list of errors and warnings and keep it in common library. PP and compiler can still generate different errors with the same number. It can be confusing for the users and hard to document and add i18n translations. If possible we should also try to keep Clipper error numbers. In new PP code I added Clipper error numbers but I cannot use them until compiler code is not updated. We should aslo remove the ctype passed to error functions and hack with first character in warning messages and use only error number. The codes from 1000 to 1999 should be warnings where range 1000:1099 is activated by -w, 1100:1199 by -w1, 1200:1299 by -w2, etc. 2000:2999 are errors and 3000:3999 fatal errors. All compiler functions which generate an error should expect that error function will not stop the compiler but return and cleanly finished their job. It's necessary for MT support in compiler and making compiler part of some other programs which may still work and compile different source code. * FLEX/SIMPLEX remove them at all and add some final pass to PP to create more precise tokens for grammar parser or at least add better integration to remove some redundant code and existing limits. * hb_inLine() support - it's broken in new PP but as I can see it was never working correctly. I can add a hack to PP to support hb_inLine() but I'm not sure it's worth to do. Maybe in few days. + harbour/include/std.ch + added new std.ch. It was created without using Clipper's std.ch. It's quite possible that some rules are wrong and should be fixed so please help. Anyhow I created a set of programs based on new PP code generating all possible combinations of different commands I collected from different source code, documentation and match patterns of rules I was adding to new std.ch and then I was comparing .ppo files generated by Clipper and Harbour so I do not expect any bigger problems then some minor typos. I had to introduce some modifications in spacing as workaround for FLEX/SIMPLEX which cannot properly decode text preprocessed by Clipper after stringify. * harbour/utils/hbpptest/pretest.prg * updated for new PP It reports 16 wrong translations but some of them are valid and some others are caused by escaped string e"..." (one of hack for FLEX/SIMPLEX support) I also had to remove all spaces in comparison the results because they were not Clipper ocmpatible at all. Ryszard please look at it. --- harbour/ChangeLog | 145 + harbour/bin/hb-func.sh | 2 +- harbour/include/hbapi.h | 1 + harbour/include/hbapifs.h | 2 +- harbour/include/hbclass.ch | 66 +- harbour/include/hbcomp.h | 21 +- harbour/include/hbdefs.h | 6 + harbour/include/hberrors.h | 29 +- harbour/include/hbpp.h | 616 +- harbour/include/hbrddcdx.h | 2 +- harbour/include/hbsetup.ch | 3 - harbour/include/hbstdgen.ch | 86 + harbour/include/std.ch | 605 +- harbour/source/common/hbdate.c | 55 + harbour/source/common/hbfsapi.c | 2 +- harbour/source/common/hbstr.c | 98 +- harbour/source/compiler/Makefile | 1 + harbour/source/compiler/cmdcheck.c | 12 +- harbour/source/compiler/harbour.c | 47 +- harbour/source/compiler/harbour.l | 73 +- harbour/source/compiler/hbgenerr.c | 3 +- harbour/source/compiler/ppcomp.c | 375 + harbour/source/pp/Makefile | 10 +- harbour/source/pp/ppcore.c | 8936 +++++++++---------- harbour/source/pp/ppgen.c | 396 + harbour/source/pp/pplib.c | 299 +- harbour/source/rdd/workarea.c | 3 +- harbour/source/rtl/dates.c | 54 - harbour/utils/hbpp/Makefile | 5 +- harbour/utils/hbpp/hbpp.c | 8 +- harbour/utils/hbpp/hbpp.h | 184 + harbour/{source/pp => utils/hbpp}/ppcomp.c | 4 +- harbour/utils/hbpp/ppcore.c | 4813 ++++++++++ harbour/utils/hbpp/pplib.c | 265 + harbour/{source/pp => utils/hbpp}/pptable.c | 0 harbour/{source/pp => utils/hbpp}/pragma.c | 0 harbour/utils/hbpptest/pretest.prg | 14 +- 37 files changed, 12181 insertions(+), 5060 deletions(-) create mode 100644 harbour/include/hbstdgen.ch create mode 100644 harbour/source/compiler/ppcomp.c create mode 100644 harbour/source/pp/ppgen.c create mode 100644 harbour/utils/hbpp/hbpp.h rename harbour/{source/pp => utils/hbpp}/ppcomp.c (99%) create mode 100644 harbour/utils/hbpp/ppcore.c create mode 100644 harbour/utils/hbpp/pplib.c rename harbour/{source/pp => utils/hbpp}/pptable.c (100%) rename harbour/{source/pp => utils/hbpp}/pragma.c (100%) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 95624fb68a..33bda71e9e 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,151 @@ 2002-12-01 13:30 UTC+0100 Foo Bar */ + to character not symbol item type. + +2006-11-08 13:40 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/source/pp/ppcore.c + * cleaned two warnings generated by old GCC versions + +2006-11-08 12:55 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/bin/hb-func.sh + + added linker parametrs to hbcc + + * harbour/include/hbapi.h + + added hb_retclenAdoptRaw() + + * harbour/include/hbapifs.h + * harbour/source/common/hbfsapi.c + * changed first parameters of hb_fsAddSearchPath() to const char * + + * harbour/include/hbclass.ch + * update for new PP. I think that now we can try to create final + version of our OOP rules. + + * harbour/include/hbdefs.h + + added UCHAR and SCHAR typedefs + + * harbour/include/hbrddcdx.h + * indenting + + * harbour/source/rdd/workarea.c + ! fixed minor typo + + * harbour/source/common/hbdate.c + * harbour/source/rtl/dates.c + * moved hb_dateToday() and hb_dateTimeStr() from RTL to COMMON library + + - harbour/include/hbpp.h + - harbour/source/pp/ppcomp.c + - harbour/source/pp/ppcore.c + - harbour/source/pp/pplib.c + - harbour/source/pp/pptable.c + - harbour/source/pp/pragma.c + * harbour/utils/hbpp/Makefile + * harbour/utils/hbpp/hbpp.c + + harbour/utils/hbpp/hbpp.h + + harbour/utils/hbpp/ppcomp.c + + harbour/utils/hbpp/ppcore.c + + harbour/utils/hbpp/pplib.c + + harbour/utils/hbpp/pptable.c + + harbour/utils/hbpp/pragma.c + * moved all PP code to harbour/utils/hbpp + It's interesting and working preprocessor and the code can be + usable for some other things so I do not want to remove it. + Probablly we should move it to contrib/hbpptext + + * harbour/include/hbcomp.h + * harbour/include/hberrors.h + * harbour/include/hbsetup.ch + + harbour/include/hbpp.h + + harbour/include/hbstdgen.ch + * harbour/source/common/hbstr.c + * harbour/source/compiler/Makefile + * harbour/source/compiler/cmdcheck.c + * harbour/source/compiler/harbour.c + * harbour/source/compiler/harbour.l + * harbour/source/compiler/hbgenerr.c + + harbour/source/compiler/ppcomp.c + * harbour/source/pp/Makefile + + harbour/source/pp/ppcore.c + + harbour/source/pp/pplib.c + + harbour/source/pp/ppgen.c + + New PP code written from scratch. It works in similar way to + Clipper PP even the error codes are replicated. The code is MT + safe does not have any limitation on size of preprocessed code, + line, etc. It's also Clipper compatible lexer. It means that + we do not longer need FLEX or SIMPLEX which can be replaced + by new PP after some small modifications. Anyhow I haven't + decided to make it myself. I would like to agree with with the + rest of developers. I will be very happy if such modifications + will be done by someone else, Ryszard? + Meanwhile I h may no flush data in PreExt() + + * harbour/source/rtl/gtwin/gtwin.c + ! fixed Init() code by adding missing SUPER_INIT() + * modified a little bit PreExt() and PostExt() methods + +2006-02-08 20:23 UTC+0100 Antonio Linares + * makefile.nt + * makefile64.nt + * updated with recent changes + + ./ppgen$(EXE_EXT) $(TOP)$(ROOT)include/hbstdgen.ch -opptable.c -q + * harbour/source/rtl/gtwin/gtwin.c + + added PreExt() and PostExt() methods + +2006-02-08 15:17 UTC+0100 PrzemyslawI chose + modified version of xHarbour extension with escaped strings e"" + so now FLEX understand such strings and decode them like C escaped + strings. It means that you can use them also in the .prg code f.e.: + outstd( e"Hello\n\rWorld" ) + The new PP is also noticeable faster. You should see the difference + compiling long files. The build in PP rules are generated automatically + by ppgen program created from source/pp/ppgen.c + I had to add to GNU source/pp/Makefile these two lines: + pptable.c : ppgen$(EXE_EXT) + ./ppgen$(EXE_EXT) $(TOP)$(ROOT)include/hbstdgen.ch -opptable.c -q + Sth like that will have to be done also in non GNU make system. + Now Harbour can be compiled only using GNU make. + Marek can you update non GNU make files? I would like to leave this + modification to you or other developers who can test it. + It was quite big modification and I do not believe that I haven't + make any mistakes but I hope that in few weeks I'll fix any reported + bugs and it will resolve any PP problems. + TODO: + * error messages + create one common list of errors and warnings and keep it + in common library. PP and compiler can still generate different + errors with the same number. It can be confusing for the users + and hard to document and add i18n translations. + If possible we should also try to keep Clipper error numbers. + In new PP code I added Clipper error numbers but I cannot use + them until compiler code is not updated. + We should aslo remove the ctype passed to error functions and + hack with first character in warning messages and use only + error number. The codes from 1000 to 1999 should be warnings + where range 1000:1099 is activated by -w, 1100:1199 by -w1, + 1200:1299 by -w2, etc. 2000:2999 are errors and 3000:3999 + fatal errors. All compiler functions which generate an error + should expect that error function will not stop the compiler + but return and cleanly finished their job. It's necessary for + MT support in compiler and making compiler part of some other + programs which may still work and compile different source code. + * FLEX/SIMPLEX + remove them at all and add some final pass to PP to create + more precise tokens for grammar parser or at least add better + integration to remove some redundant code and existing limits. + * hb_inLine() support - it's broken in new PP but as I can see + it was never working correctly. I can add a hack to PP to support + hb_inLine() but I'm not sure it's worth to do. Maybe in few days. + + + harbour/include/std.ch + + added new std.ch. It was created without using Clipper's std.ch. + It's quite possible that some rules are wrong and should be fixed + so please help. Anyhow I created a set of programs based on new PP + code generating all possible combinations of different commands I + collected from different source code, documentation and match patterns + of rules I was adding to new std.ch and then I was comparing .ppo files generated by Clipper and Harbour so I do not expect any bigger problems then some minor typos. I had to introduce some modifications in spacing as workaround for FLEX/SIMPLEX which cannot properly decode diff --git a/harbour/bin/hb-func.sh b/harbour/bin/hb-func.sh index 751e9436aa..8b74acd3cd 100644 --- a/harbour/bin/hb-func.sh +++ b/harbour/bin/hb-func.sh @@ -409,7 +409,7 @@ FOUTE="\${FOUTE%.[oc]}${hb_exesuf}" hb_cc() { - ${CCPREFIX}\${HB_CC} "\$@" \${CC_OPT} \${GCC_PATHS} + ${CCPREFIX}\${HB_CC} "\$@" \${CC_OPT} \${GCC_PATHS} \${HB_USRLPATH} \${HB_USRLIBS} } hb_cmp() diff --git a/harbour/include/hbapi.h b/harbour/include/hbapi.h index 58a0b89576..da0e50dbdf 100644 --- a/harbour/include/hbapi.h +++ b/harbour/include/hbapi.h @@ -448,6 +448,7 @@ extern HB_EXPORT void hb_retnlllen( LONGLONG lNumber, int iWidth ); /* returns /* xHarbour compatible function */ #define hb_retcAdopt( szText ) hb_retc_buffer( (szText) ) #define hb_retclenAdopt( szText, ulLen ) hb_retclen_buffer( (szText), (ulLen) ) +#define hb_retclenAdoptRaw( szText, ulLen ) hb_retclen_buffer( (szText), (ulLen) ) #define hb_retcStatic( szText ) hb_retc_const( (szText) ) #ifdef HB_API_MACROS diff --git a/harbour/include/hbapifs.h b/harbour/include/hbapifs.h index 7016e5a343..6f69574742 100644 --- a/harbour/include/hbapifs.h +++ b/harbour/include/hbapifs.h @@ -178,7 +178,7 @@ typedef struct _HB_PATHNAMES BOOL fFree; } HB_PATHNAMES; -extern HB_EXPORT void hb_fsAddSearchPath( char * szPath, HB_PATHNAMES ** pSearchList ); +extern HB_EXPORT void hb_fsAddSearchPath( const char * szPath, HB_PATHNAMES ** pSearchList ); extern HB_EXPORT void hb_fsFreeSearchPath( HB_PATHNAMES * pSearchList ); extern HB_EXPORT BOOL hb_spFile( BYTE * pFilename, BYTE * pRetPath ); diff --git a/harbour/include/hbclass.ch b/harbour/include/hbclass.ch index a1e0787881..f483a3289c 100644 --- a/harbour/include/hbclass.ch +++ b/harbour/include/hbclass.ch @@ -181,7 +181,7 @@ #ifdef HB_CLS_NO_OO_ERR #xtranslate __HB_CLS_ERR([]) => #else - #xtranslate __HB_CLS_ERR([]) => ;#error [] ; #undef _DUMMY_DEF_ + #xtranslate __HB_CLS_ERR([]) => ;#error [ ] ; #undef _DUMMY_DEF_ #endif #xtranslate __HB_CLS_VARERR() => __HB_CLS_ERR( Invalid instance variable name: ) @@ -221,8 +221,8 @@ DECLARE HBClass ; #xtranslate __HB_CLS_ASARGS( ([]) ) => [] #xtranslate __HB_CLS_ASARGSOPT( ) => #xtranslate __HB_CLS_ASARGSOPT( ([]) ) => [, ] -#xtranslate __HB_CLS_ISVAR( ) => -#xtranslate __HB_CLS_ISVAR( ([]) ) => __HB_CLS_VARERR(([])) +#xtranslate __HB_CLS_ISVAR( ) => __HB_CLS_VARERR() +#xtranslate __HB_CLS_ISVAR( ) => #xcommand __HB_CLS_CHECKVAR( [,] ) => __HB_CLS_ISVAR( ) [;__HB_CLS_ISVAR( )] /* #xtranslate __HB_CLS_SCOPE( , , ) => ; @@ -257,7 +257,7 @@ DECLARE HBClass ; #xcommand ENDCLASS => ; s_oClass:Create() ;; - endif ;; + end ;; return s_oClass:Instance() AS CLASS _CLASS_NAME_ ;; #undef _CLASS_MODE_ ; #define _CLASS_MODE_ _CLASS_IMPLEMENTATION_ @@ -273,7 +273,7 @@ DECLARE HBClass ; #undef _DUMMY_DEF_ #else #xcommand __HB_CLS_DECLARE_METHOD => ; - #xcommand METHOD \ \[(\[])] CLASS _CLASS_IMPLEMENTATION_ => ; + #xcommand METHOD \ \[(\[\])] CLASS _CLASS_IMPLEMENTATION_ => ; DECLARED METHOD \ \[(\)] CLASS #endif @@ -286,7 +286,7 @@ DECLARE HBClass ; __HB_CLS_DECLARE_METHOD __HB_CLS_PARAMS() _CLASS_NAME_ ;; s_oClass:AddMethod( __HB_CLS_ASSTRING(), @__HB_CLS_ASID( __HB_CLS_MTHNAME _CLASS_NAME_ )(), __HB_CLS_SCOPE( <.export.>, <.protect.>, <.hidde.> ) + iif( <.ctor.>, HB_OO_CLSTP_CTOR, 0 ) + iif( <.persistent.>, HB_OO_CLSTP_PERSIST, 0 ) ) -#xcommand ACCESS [()] [ AS ] [ ] [] [