diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 8b099946eb..8444113976 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,39 @@ +Wed Oct 20 19:28:51 1999 Gonzalo A. Diethelm + + * source/Makefile: + * source/common/Makefile: + * source/common/hbtrace.c: + * include/hbtrace.h: + Added a common/ library where all "common" stuff should be + implemented. For starters, I placed here a rudimentary tracing + facility. Basically, all functions should be of the form: + + int foo(char* name /* other parameters */) + { + HB_TRACE(("foo(%s)", name)); + + /* implementation */ + } + + If harbour is compiled with HB_DO_TRACE defined, then this will + generate a trace on stderr of all functions being called (caution: + it generates LOTS of output!!!). If HB_DO_TRACE is not defined, + the HB_TRACE() lines are defined out and there is no performance + hit. + + * include/hbdefs.h: + Included hbtrace.h. + + * source/pp/hbpp.c: + * source/pp/hbppint.c: + * source/pp/hbpplib.c: + * source/pp/stdalone/Makefile: + * source/pp/stdalone/hbpp.c: + Added tracing calls as a "proof of concept". + + * source/rtl/gt/gtwin.c: + Fixed two minor typos. + 19991020-21:30 GMT+1 Victor Szel * source/rtl/achoice.prg % FUNCTION -> PROCEDURE for speed. diff --git a/harbour/include/hbdefs.h b/harbour/include/hbdefs.h index bb69e1a0ec..f422a8b0a7 100644 --- a/harbour/include/hbdefs.h +++ b/harbour/include/hbdefs.h @@ -41,6 +41,7 @@ #include #include #include "hbsetup.h" +#include "hbtrace.h" #if defined(__IBMCPP__) /* With the exception of WORD, the IBM Visual Age C++ compiler has diff --git a/harbour/include/hbtrace.h b/harbour/include/hbtrace.h new file mode 100644 index 0000000000..9273db78bd --- /dev/null +++ b/harbour/include/hbtrace.h @@ -0,0 +1,59 @@ +/* + * $Id$ + */ + +/* + * Harbour Project source code: + * Header file for trace macros and functions. + * + * Copyright 1999 Gonzalo Diethelm + * 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/). + * + */ + +#ifndef HB_TRACE_H_ +#define HB_TRACE_H_ + +#if defined(HB_DO_TRACE) + +extern char* hb_tr_file_; +extern int hb_tr_line_; + +void hb_tr_trace(char* fmt, ...); + +#define HB_TRACE(x) \ +do { \ + hb_tr_file_ = __FILE__; \ + hb_tr_line_ = __LINE__; \ + hb_tr_trace x ; \ +} while (0) + +#else + +#define TRACE(x) + +#endif /* #if defined(HB_DO_TRACE) */ + +#endif /* HB_TRACE_H_ */ diff --git a/harbour/source/Makefile b/harbour/source/Makefile index 0a293cb931..8a4c04666c 100644 --- a/harbour/source/Makefile +++ b/harbour/source/Makefile @@ -5,6 +5,7 @@ ROOT = ../ DIRS=\ + common \ pp \ compiler \ rtl \ diff --git a/harbour/source/common/Makefile b/harbour/source/common/Makefile new file mode 100644 index 0000000000..24e0ddd985 --- /dev/null +++ b/harbour/source/common/Makefile @@ -0,0 +1,14 @@ +# +# $Id$ +# + +ROOT = ../../ + +C_SOURCES=\ + hbtrace.c \ + +PRG_SOURCES=\ + +LIBNAME=common + +include $(TOP)$(ROOT)config/lib.cf diff --git a/harbour/source/common/hbtrace.c b/harbour/source/common/hbtrace.c new file mode 100644 index 0000000000..7443044982 --- /dev/null +++ b/harbour/source/common/hbtrace.c @@ -0,0 +1,74 @@ +/* + * $Id$ + */ + +/* + * Harbour Project source code: + * Tracing functions. + * + * Copyright 1999 Gonzalo Diethelm + * 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/). + * + */ + +#if defined(HB_DO_TRACE) + +#include +#include +#include "hbtrace.h" + +char* hb_tr_file_ = ""; +int hb_tr_line_ = 0; + +void hb_tr_trace(char* fmt, ...) +{ + char buf[1024]; + char file[256]; + int i, j; + + va_list ap; + va_start(ap, fmt); + vsprintf(buf, fmt, ap); + va_end(ap); + + for (i = 0; hb_tr_file_[i] != '\0'; ++i) { + if (hb_tr_file_[i] != '.' && + hb_tr_file_[i] != '/' && + hb_tr_file_[i] != '\\') + break; + } + for (j = 0; hb_tr_file_[i] != '\0'; ++i, ++j) { + file[j] = hb_tr_file_[i]; + } + file[j] = '\0'; + + fprintf(stderr, "%s:%d: %s\n", + file, hb_tr_line_, buf); + + hb_tr_file_ = ""; + hb_tr_line_ = 0; +} + +#endif /* #if defined(HB_DO_TRACE) */ diff --git a/harbour/source/pp/hbpp.c b/harbour/source/pp/hbpp.c index 3d4a747829..4abcb78d7a 100644 --- a/harbour/source/pp/hbpp.c +++ b/harbour/source/pp/hbpp.c @@ -35,12 +35,12 @@ #include #if ( defined(_MSC_VER) || defined(__IBMCPP__) || defined(__MINGW32_) ) - #include +#include #elif defined(__GNUC__) - #include - #include +#include +#include #else - #include +#include #endif #include @@ -131,19 +131,19 @@ char groupchar; /* Table with parse errors */ char * _szPErrors[] = { - "Can\'t open #include file: \'%s\'", - "#else does not match #ifdef", - "#endif does not match #ifdef", - "Bad filename in #include", - "#define without parameters", - "Missing => in #translate/#command", - "Error in pattern definition", - "Cycled #define", - "Invalid name follows #: \'%s\'", - "#error: \'%s\'", - "Memory allocation error", - "Memory reallocation error", - "Freeing a NULL memory pointer" + "Can\'t open #include file: \'%s\'", + "#else does not match #ifdef", + "#endif does not match #ifdef", + "Bad filename in #include", + "#define without parameters", + "Missing => in #translate/#command", + "Error in pattern definition", + "Cycled #define", + "Invalid name follows #: \'%s\'", + "#error: \'%s\'", + "Memory allocation error", + "Memory reallocation error", + "Freeing a NULL memory pointer" }; /* Table with parse warnings */ @@ -152,282 +152,301 @@ char * _szPErrors[] = */ char * _szPWarnings[] = { - "1Non directive in include file" + "1Non directive in include file" }; int ParseDirective( char* sLine ) { - char sDirective[MAX_NAME]; - int i; - FILE* handl_i; + char sDirective[MAX_NAME]; + int i; + FILE* handl_i; - i = NextName( &sLine, sDirective ); - stroupper( sDirective ); + HB_TRACE(("ParseDirective(%s)", sLine)); - SKIPTABSPACES(sLine); + i = NextName( &sLine, sDirective ); + stroupper( sDirective ); - if ( i == 4 && memcmp ( sDirective, "ELSE", 4 ) == 0 ) - { /* --- #else --- */ - if ( nCondCompile == 0 ) - GenError( _szPErrors, 'P', ERR_DIRECTIVE_ELSE, NULL, NULL ); - else if ( nCondCompile == 1 || aCondCompile[nCondCompile-2] ) - aCondCompile[nCondCompile-1] = 1 - aCondCompile[nCondCompile-1]; - } + SKIPTABSPACES(sLine); - else if ( i == 5 && memcmp ( sDirective, "ENDIF", 5 ) == 0 ) - { /* --- #endif --- */ - if ( nCondCompile == 0 ) - GenError( _szPErrors, 'P', ERR_DIRECTIVE_ENDIF, NULL, NULL ); - else nCondCompile--; - } + if ( i == 4 && memcmp ( sDirective, "ELSE", 4 ) == 0 ) + { /* --- #else --- */ + if ( nCondCompile == 0 ) + GenError( _szPErrors, 'P', ERR_DIRECTIVE_ELSE, NULL, NULL ); + else if ( nCondCompile == 1 || aCondCompile[nCondCompile-2] ) + aCondCompile[nCondCompile-1] = 1 - aCondCompile[nCondCompile-1]; + } - else if ( i == 5 && memcmp ( sDirective, "IFDEF", 5 ) == 0 ) - ParseIfdef ( sLine, TRUE ); /* --- #ifdef --- */ + else if ( i == 5 && memcmp ( sDirective, "ENDIF", 5 ) == 0 ) + { /* --- #endif --- */ + if ( nCondCompile == 0 ) + GenError( _szPErrors, 'P', ERR_DIRECTIVE_ENDIF, NULL, NULL ); + else nCondCompile--; + } - else if ( i == 6 && memcmp ( sDirective, "IFNDEF", 6 ) == 0 ) - ParseIfdef ( sLine, FALSE ); /* --- #ifndef --- */ + else if ( i == 5 && memcmp ( sDirective, "IFDEF", 5 ) == 0 ) + ParseIfdef ( sLine, TRUE ); /* --- #ifdef --- */ - else if ( nCondCompile==0 || aCondCompile[nCondCompile-1]) - { + else if ( i == 6 && memcmp ( sDirective, "IFNDEF", 6 ) == 0 ) + ParseIfdef ( sLine, FALSE ); /* --- #ifndef --- */ + + else if ( nCondCompile==0 || aCondCompile[nCondCompile-1]) + { if ( i == 7 && memcmp ( sDirective, "INCLUDE", 7 ) == 0 ) - { /* --- #include --- */ - char cDelimChar; + { /* --- #include --- */ + char cDelimChar; - if ( *sLine != '\"' && *sLine != '\'' && *sLine != '<' ) + if ( *sLine != '\"' && *sLine != '\'' && *sLine != '<' ) GenError( _szPErrors, 'P', ERR_WRONG_NAME, NULL, NULL ); - cDelimChar = *sLine; - if (cDelimChar == '<') + cDelimChar = *sLine; + if (cDelimChar == '<') cDelimChar = '>'; - sLine++; i = 0; - while ( *(sLine+i) != '\0' && *(sLine+i) != cDelimChar ) i++; - if ( *(sLine+i) != cDelimChar ) + sLine++; i = 0; + while ( *(sLine+i) != '\0' && *(sLine+i) != cDelimChar ) i++; + if ( *(sLine+i) != cDelimChar ) GenError( _szPErrors, 'P', ERR_WRONG_NAME, NULL, NULL ); - *(sLine+i) = '\0'; + *(sLine+i) = '\0'; - /* if ((handl_i = fopen(sLine, "r")) == NULL) */ - if ( !OpenInclude( sLine, _pIncludePath, &handl_i, (cDelimChar == '>') ) ) + /* if ((handl_i = fopen(sLine, "r")) == NULL) */ + if ( !OpenInclude( sLine, _pIncludePath, &handl_i, (cDelimChar == '>') ) ) GenError( _szPErrors, 'P', ERR_CANNOT_OPEN, sLine, NULL ); - lInclude++; - Hp_Parse(handl_i, 0 ); - lInclude--; - fclose(handl_i); - } + lInclude++; + Hp_Parse(handl_i, 0 ); + lInclude--; + fclose(handl_i); + } else if ( i == 6 && memcmp ( sDirective, "DEFINE", 6 ) == 0 ) - ParseDefine ( sLine ); /* --- #define --- */ + ParseDefine ( sLine ); /* --- #define --- */ else if ( i == 5 && memcmp ( sDirective, "UNDEF", 5 ) == 0 ) - ParseUndef ( sLine ); /* --- #undef --- */ + ParseUndef ( sLine ); /* --- #undef --- */ else if ( (i == 7 && memcmp ( sDirective, "COMMAND", 7 ) == 0) || - (i == 8 && memcmp ( sDirective, "XCOMMAND", 8 ) == 0) ) + (i == 8 && memcmp ( sDirective, "XCOMMAND", 8 ) == 0) ) /* --- #command --- */ - ParseCommand ( sLine, (i==7)? FALSE:TRUE, TRUE ); + ParseCommand ( sLine, (i==7)? FALSE:TRUE, TRUE ); else if ( (i == 9 && memcmp ( sDirective, "TRANSLATE", 9 ) == 0) || - (i == 10 && memcmp ( sDirective, "XTRANSLATE", 10 ) == 0) ) + (i == 10 && memcmp ( sDirective, "XTRANSLATE", 10 ) == 0) ) /* --- #translate --- */ - ParseCommand ( sLine, (i==9)? FALSE:TRUE, FALSE ); + ParseCommand ( sLine, (i==9)? FALSE:TRUE, FALSE ); else if ( i == 6 && memcmp ( sDirective, "STDOUT", 6 ) == 0 ) - printf ( "%s\n", sLine ); /* --- #stdout --- */ + printf ( "%s\n", sLine ); /* --- #stdout --- */ else if ( i == 5 && memcmp ( sDirective, "ERROR", 5 ) == 0 ) - /* --- #error --- */ - GenError( _szPErrors, 'P', ERR_EXPLICIT, sLine, NULL ); + /* --- #error --- */ + GenError( _szPErrors, 'P', ERR_EXPLICIT, sLine, NULL ); else if ( i == 4 && memcmp ( sDirective, "LINE", 4 ) == 0 ) - return -1; + return -1; else - GenError( _szPErrors, 'P', ERR_WRONG_DIRECTIVE, sDirective, NULL ); - } - return 0; + GenError( _szPErrors, 'P', ERR_WRONG_DIRECTIVE, sDirective, NULL ); + } + return 0; } int ParseDefine( char* sLine) { - char defname[MAX_NAME], pars[MAX_NAME]; - int i, npars = -1; - DEFINES *lastdef; + char defname[MAX_NAME], pars[MAX_NAME]; + int i, npars = -1; + DEFINES *lastdef; - SKIPTABSPACES( sLine ); - if( isalpha( *sLine ) || *sLine == '_' || *sLine > 0x7e ) - { + HB_TRACE(("ParseDefine(%s)", sLine)); + + SKIPTABSPACES( sLine ); + if( isalpha( *sLine ) || *sLine == '_' || *sLine > 0x7e ) + { NextName( &sLine, defname ); if ( *sLine == '(' ) /* If pseudofunction was found */ - { - sLine++; i = 0; - npars = 0; - while ( *sLine != '\0' && *sLine != ')') - { - if ( *sLine == ',' ) npars++; - if ( *sLine != ' ' && *sLine != '\t' ) *(pars+i++) = *sLine; - sLine++; - } - if ( i > 0 ) npars++; - *(pars+i) = '\0'; - sLine++; - } + { + sLine++; i = 0; + npars = 0; + while ( *sLine != '\0' && *sLine != ')') + { + if ( *sLine == ',' ) npars++; + if ( *sLine != ' ' && *sLine != '\t' ) *(pars+i++) = *sLine; + sLine++; + } + if ( i > 0 ) npars++; + *(pars+i) = '\0'; + sLine++; + } SKIPTABSPACES(sLine); lastdef = AddDefine ( defname, ( *sLine == '\0' )? NULL : sLine ); lastdef->npars = npars; lastdef->pars = ( npars <= 0 )? NULL : strodup ( pars ); - } - else - GenError( _szPErrors, 'P', ERR_DEFINE_ABSENT, NULL, NULL ); - return 0; + } + else + GenError( _szPErrors, 'P', ERR_DEFINE_ABSENT, NULL, NULL ); + return 0; } DEFINES* AddDefine ( char* defname, char* value ) { - DEFINES* stdef = DefSearch( defname ); + DEFINES* stdef = DefSearch( defname ); - if ( stdef != NULL ) - stdef->pars = NULL; - else - { - stdef = ( DEFINES * ) hb_xgrab( sizeof( DEFINES ) ); - stdef->last = topDefine; - topDefine = stdef; - stdef->name = strodup ( defname ); - } - stdef->value = ( value == NULL )? NULL : strodup ( value ); - return stdef; + HB_TRACE(("AddDefine(%s, %s)", defname, value)); + + if ( stdef != NULL ) + stdef->pars = NULL; + else + { + stdef = ( DEFINES * ) hb_xgrab( sizeof( DEFINES ) ); + stdef->last = topDefine; + topDefine = stdef; + stdef->name = strodup ( defname ); + } + stdef->value = ( value == NULL )? NULL : strodup ( value ); + return stdef; } int ParseUndef( char* sLine) { - char defname[MAX_NAME]; - DEFINES* stdef; + char defname[MAX_NAME]; + DEFINES* stdef; - NextWord( &sLine, defname, FALSE ); + HB_TRACE(("ParseUndef(%s)", sLine)); - if ( ( stdef = DefSearch(defname) ) != NULL ) - stdef->name = NULL; - return 0; + NextWord( &sLine, defname, FALSE ); + + if ( ( stdef = DefSearch(defname) ) != NULL ) + stdef->name = NULL; + return 0; } int ParseIfdef( char* sLine, int usl) { - char defname[MAX_NAME]; - DEFINES *stdef; + char defname[MAX_NAME]; + DEFINES *stdef; - if ( nCondCompile==0 || aCondCompile[nCondCompile-1]) - { + HB_TRACE(("ParseIfdef(%s, %d)", sLine, usl)); + + if ( nCondCompile==0 || aCondCompile[nCondCompile-1]) + { NextWord( &sLine, defname, FALSE ); if ( *defname == '\0' ) - GenError( _szPErrors, 'P', ERR_DEFINE_ABSENT, NULL, NULL ); - } - if ( nCondCompile == maxCondCompile ) - { + GenError( _szPErrors, 'P', ERR_DEFINE_ABSENT, NULL, NULL ); + } + if ( nCondCompile == maxCondCompile ) + { maxCondCompile += 5; aCondCompile = (int*)hb_xrealloc( aCondCompile, sizeof( int ) * maxCondCompile ); - } - if ( nCondCompile==0 || aCondCompile[nCondCompile-1]) - { + } + if ( nCondCompile==0 || aCondCompile[nCondCompile-1]) + { if ( ( (stdef = DefSearch(defname)) != NULL && usl ) - || ( stdef == NULL && !usl ) ) aCondCompile[nCondCompile] = 1; + || ( stdef == NULL && !usl ) ) aCondCompile[nCondCompile] = 1; else aCondCompile[nCondCompile] = 0; - } - else aCondCompile[nCondCompile] = 0; - nCondCompile++; - return 0; + } + else aCondCompile[nCondCompile] = 0; + nCondCompile++; + return 0; } DEFINES* DefSearch(char *defname) { - int j; - DEFINES * stdef = topDefine; + int j; + DEFINES * stdef = topDefine; - while( stdef != NULL ) - { - if( stdef->name != NULL ) - { - for ( j=0; *(stdef->name+j) == *(defname+j) && - *(stdef->name+j) != '\0'; j++ ); - if ( *(stdef->name+j) == *(defname+j) ) return stdef; - } - stdef = stdef->last; - } - return NULL; + HB_TRACE(("DefSearch(%s)", defname)); + + while( stdef != NULL ) + { + if( stdef->name != NULL ) + { + for ( j=0; *(stdef->name+j) == *(defname+j) && + *(stdef->name+j) != '\0'; j++ ); + if ( *(stdef->name+j) == *(defname+j) ) return stdef; + } + stdef = stdef->last; + } + return NULL; } COMMANDS* ComSearch(char *cmdname, COMMANDS *stcmdStart) { - int j; - COMMANDS *stcmd = ( stcmdStart )? stcmdStart:topCommand; + int j; + COMMANDS *stcmd = ( stcmdStart )? stcmdStart:topCommand; - while( stcmd != NULL ) - { + HB_TRACE(("ComSearch(%s, %p)", cmdname, stcmdStart)); + + while( stcmd != NULL ) + { for ( j=0; (*(stcmd->name+j)==toupper(*(cmdname+j))) && - (*(stcmd->name+j)!='\0') && - ((stcmd->com_or_xcom)? 1:(j<4 || ISNAME(*(cmdname+j+1)))); j++ ); + (*(stcmd->name+j)!='\0') && + ((stcmd->com_or_xcom)? 1:(j<4 || ISNAME(*(cmdname+j+1)))); j++ ); if ( (*(stcmd->name+j)==toupper(*(cmdname+j))) || ( !stcmd->com_or_xcom && j >= 4 && *(stcmd->name+j)!='\0' - && *(cmdname+j) == '\0' ) ) - break; + && *(cmdname+j) == '\0' ) ) + break; stcmd = stcmd->last; - } + } - return stcmd; + return stcmd; } COMMANDS* TraSearch(char *cmdname, COMMANDS *sttraStart) { - int j; - COMMANDS *sttra = ( sttraStart )? sttraStart:topTranslate; + int j; + COMMANDS *sttra = ( sttraStart )? sttraStart:topTranslate; - while( sttra != NULL ) - { + HB_TRACE(("TraSearch(%s, %p)", cmdname, sttraStart)); + + while( sttra != NULL ) + { for ( j=0; *(sttra->name+j)==toupper(*(cmdname+j)) && - *(sttra->name+j)!='\0' && - ((sttra->com_or_xcom)? 1:(j<4 || ISNAME(*(cmdname+j+1)))); j++ ); + *(sttra->name+j)!='\0' && + ((sttra->com_or_xcom)? 1:(j<4 || ISNAME(*(cmdname+j+1)))); j++ ); if ( *(sttra->name+j)==toupper(*(cmdname+j)) || - ( !sttra->com_or_xcom && j >= 4 && - *(sttra->name+j)!='\0' && *(cmdname+j) == '\0' ) ) - break; + ( !sttra->com_or_xcom && j >= 4 && + *(sttra->name+j)!='\0' && *(cmdname+j) == '\0' ) ) + break; sttra = sttra->last; - } - return sttra; + } + return sttra; } void ParseCommand( char* sLine, int com_or_xcom, int com_or_tra ) { - static char mpatt[PATTERN_SIZE], rpatt[PATTERN_SIZE]; - char cmdname[MAX_NAME]; - COMMANDS *stcmd; - int mlen,rlen; - int ipos; + static char mpatt[PATTERN_SIZE], rpatt[PATTERN_SIZE]; + char cmdname[MAX_NAME]; + COMMANDS *stcmd; + int mlen,rlen; + int ipos; - NextWord( &sLine, cmdname, FALSE ); - stroupper( cmdname ); - SKIPTABSPACES(sLine); + HB_TRACE(("ParseCommand(%s, $d, $d)", + sLine, com_or_xcom, com_or_tra)); - if ( (ipos = pp_strAt( "=>", 2, sLine, strolen(sLine) )) > 0 ) - stroncpy( mpatt, sLine, ipos-1 ); - else - GenError( _szPErrors, 'P', ERR_COMMAND_DEFINITION, NULL, NULL ); - mlen = strotrim( mpatt ); + NextWord( &sLine, cmdname, FALSE ); + stroupper( cmdname ); + SKIPTABSPACES(sLine); - sLine += ipos + 1; - SKIPTABSPACES(sLine); - strocpy( rpatt, sLine ); - rlen = strotrim( rpatt ); + if ( (ipos = pp_strAt( "=>", 2, sLine, strolen(sLine) )) > 0 ) + stroncpy( mpatt, sLine, ipos-1 ); + else + GenError( _szPErrors, 'P', ERR_COMMAND_DEFINITION, NULL, NULL ); + mlen = strotrim( mpatt ); - ConvertPatterns ( mpatt, mlen, rpatt, rlen ); + sLine += ipos + 1; + SKIPTABSPACES(sLine); + strocpy( rpatt, sLine ); + rlen = strotrim( rpatt ); - if ( com_or_tra ) - stcmd = AddCommand ( cmdname ); - else - stcmd = AddTranslate ( cmdname ); + ConvertPatterns ( mpatt, mlen, rpatt, rlen ); - stcmd->com_or_xcom = com_or_xcom; - stcmd->mpatt = strodup ( mpatt ); - stcmd->value = ( rlen > 0 )? strodup ( rpatt ) : NULL; + if ( com_or_tra ) + stcmd = AddCommand ( cmdname ); + else + stcmd = AddTranslate ( cmdname ); + + stcmd->com_or_xcom = com_or_xcom; + stcmd->mpatt = strodup ( mpatt ); + stcmd->value = ( rlen > 0 )? strodup ( rpatt ) : NULL; } /* ConvertPatterns() @@ -436,354 +455,373 @@ void ParseCommand( char* sLine, int com_or_xcom, int com_or_tra ) void ConvertPatterns ( char *mpatt, int mlen, char *rpatt, int rlen ) { - int i = 0, ipos, ifou; - int explen,rmlen; - char exppatt[MAX_NAME], expreal[5] = "\1 0"; - char lastchar = '@', exptype; - char *ptr; + int i = 0, ipos, ifou; + int explen,rmlen; + char exppatt[MAX_NAME], expreal[5] = "\1 0"; + char lastchar = '@', exptype; + char *ptr; - while ( *(mpatt+i) != '\0' ) - { + HB_TRACE(("ConvertPatterns(%s, $d, %s, $d)", + mpatt, mlen, rpatt, rlen)); + + while ( *(mpatt+i) != '\0' ) + { if ( *(mpatt+i) == '<' ) - { /* Drag match marker, determine it type */ - explen = 0; ipos = i; i++; exptype = '0'; - while( *(mpatt+i) == ' ' || *(mpatt+i) == '\t' ) i++; - if ( *(mpatt+i) == '*' ) /* Wild match marker */ + { /* Drag match marker, determine it type */ + explen = 0; ipos = i; i++; exptype = '0'; + while( *(mpatt+i) == ' ' || *(mpatt+i) == '\t' ) i++; + if ( *(mpatt+i) == '*' ) /* Wild match marker */ { exptype = '3'; i++; } - else if ( *(mpatt+i) == '(' ) /* Extended expression match marker */ + else if ( *(mpatt+i) == '(' ) /* Extended expression match marker */ { exptype = '4'; i++; } - while ( *(mpatt+i) != '>' ) - { - if ( *(mpatt+i) == ',' ) /* List match marker */ - { - exptype = '1'; - while ( *(mpatt+i) != '>' ) i++; - break; - } - else if ( *(mpatt+i) == ':' ) /* Restricted match marker */ - { - exptype = '2'; - *(mpatt+i--) = ' '; - break; - } - if( *(mpatt+i) != ' ' && *(mpatt+i) != '\t' ) - *(exppatt+explen++) = *(mpatt+i); - i++; - } - if ( exptype == '3' ) - { - if ( *(exppatt+explen-1) == '*' ) explen--; - else - GenError( _szPErrors, 'P', ERR_PATTERN_DEFINITION, NULL, NULL ); - } - else if ( exptype == '4' ) - { - if ( *(exppatt+explen-1) == ')' ) explen--; - else - GenError( _szPErrors, 'P', ERR_PATTERN_DEFINITION, NULL, NULL ); - } - rmlen = i - ipos + 1; + while ( *(mpatt+i) != '>' ) + { + if ( *(mpatt+i) == ',' ) /* List match marker */ + { + exptype = '1'; + while ( *(mpatt+i) != '>' ) i++; + break; + } + else if ( *(mpatt+i) == ':' ) /* Restricted match marker */ + { + exptype = '2'; + *(mpatt+i--) = ' '; + break; + } + if( *(mpatt+i) != ' ' && *(mpatt+i) != '\t' ) + *(exppatt+explen++) = *(mpatt+i); + i++; + } + if ( exptype == '3' ) + { + if ( *(exppatt+explen-1) == '*' ) explen--; + else + GenError( _szPErrors, 'P', ERR_PATTERN_DEFINITION, NULL, NULL ); + } + else if ( exptype == '4' ) + { + if ( *(exppatt+explen-1) == ')' ) explen--; + else + GenError( _szPErrors, 'P', ERR_PATTERN_DEFINITION, NULL, NULL ); + } + rmlen = i - ipos + 1; /* Convert match marker into inner format */ - lastchar = (char) ( (unsigned int)lastchar + 1 ); - expreal[1] = lastchar; - expreal[2] = exptype; - pp_Stuff ( expreal, mpatt+ipos, 4, rmlen, mlen ); - mlen += 4 - rmlen; - i += 4 - rmlen; + lastchar = (char) ( (unsigned int)lastchar + 1 ); + expreal[1] = lastchar; + expreal[2] = exptype; + pp_Stuff ( expreal, mpatt+ipos, 4, rmlen, mlen ); + mlen += 4 - rmlen; + i += 4 - rmlen; /* Look for appropriate result markers */ - ptr = rpatt; - while ( (ifou = pp_strAt( exppatt, explen, ptr, rlen-(ptr-rpatt) )) > 0 ) - { - /* Convert result marker into inner format */ - ptr += ifou; - if ( *(ptr-2) == '<' && *(ptr+explen-1) == '>' && - *(ptr-3) != '\\' && *(ptr+explen-2) != '\\' ) /* <...> */ - { - if ( *(ptr-3) == '#' && *(ptr-4) != '\\' ) /* #<...> */ - { exptype = '1'; ptr -= 3; rmlen = explen+3; } - else - { exptype = '0'; ptr -= 2; rmlen = explen+2; } - } - else if ( *(ptr-3) == '<' && *(ptr+explen) == '>' && - *(ptr-4) != '\\' && *(ptr+explen-1) != '\\' ) /* < ... > */ - { - ptr -= 2; - if ( *ptr == '\"' ) exptype = '2'; - else if ( *ptr == '(' ) exptype = '3'; - else if ( *ptr == '{' ) exptype = '4'; - else if ( *ptr == '.' ) exptype = '5'; - ptr--; - rmlen = explen+4; - } - else continue; - expreal[2] = exptype; - pp_Stuff ( expreal, ptr, 4, rmlen, rlen ); - rlen += 4 - rmlen; - } - } + ptr = rpatt; + while ( (ifou = pp_strAt( exppatt, explen, ptr, rlen-(ptr-rpatt) )) > 0 ) + { + /* Convert result marker into inner format */ + ptr += ifou; + if ( *(ptr-2) == '<' && *(ptr+explen-1) == '>' && + *(ptr-3) != '\\' && *(ptr+explen-2) != '\\' ) /* <...> */ + { + if ( *(ptr-3) == '#' && *(ptr-4) != '\\' ) /* #<...> */ + { exptype = '1'; ptr -= 3; rmlen = explen+3; } + else + { exptype = '0'; ptr -= 2; rmlen = explen+2; } + } + else if ( *(ptr-3) == '<' && *(ptr+explen) == '>' && + *(ptr-4) != '\\' && *(ptr+explen-1) != '\\' ) /* < ... > */ + { + ptr -= 2; + if ( *ptr == '\"' ) exptype = '2'; + else if ( *ptr == '(' ) exptype = '3'; + else if ( *ptr == '{' ) exptype = '4'; + else if ( *ptr == '.' ) exptype = '5'; + ptr--; + rmlen = explen+4; + } + else continue; + expreal[2] = exptype; + pp_Stuff ( expreal, ptr, 4, rmlen, rlen ); + rlen += 4 - rmlen; + } + } i++; - } + } } COMMANDS* AddCommand ( char *cmdname ) { - COMMANDS *stcmd; + COMMANDS *stcmd; - stcmd = ( COMMANDS * ) hb_xgrab( sizeof( COMMANDS ) ); - stcmd->last = topCommand; - topCommand = stcmd; - stcmd->name = strodup ( cmdname ); - return stcmd; + HB_TRACE(("AddCommand(%s)", cmdname)); + + stcmd = ( COMMANDS * ) hb_xgrab( sizeof( COMMANDS ) ); + stcmd->last = topCommand; + topCommand = stcmd; + stcmd->name = strodup ( cmdname ); + return stcmd; } COMMANDS* AddTranslate ( char *traname ) { - COMMANDS *sttra; + COMMANDS *sttra; - sttra = ( COMMANDS * ) hb_xgrab( sizeof( COMMANDS ) ); - sttra->last = topTranslate; - topTranslate = sttra; - sttra->name = strodup ( traname ); - return sttra; + HB_TRACE(("AddTranslate(%s)", traname)); + + sttra = ( COMMANDS * ) hb_xgrab( sizeof( COMMANDS ) ); + sttra->last = topTranslate; + topTranslate = sttra; + sttra->name = strodup ( traname ); + return sttra; } int ParseExpression( char* sLine, char* sOutLine ) { - char sToken[MAX_NAME]; - char *ptri, *ptro, *ptrb; - int lenToken, i, ipos, isdvig, lens; - int ifou; - int rezDef, rezTra, rezCom, kolpass = 0; - DEFINES *stdef; - COMMANDS *stcmd; + char sToken[MAX_NAME]; + char *ptri, *ptro, *ptrb; + int lenToken, i, ipos, isdvig, lens; + int ifou; + int rezDef, rezTra, rezCom, kolpass = 0; + DEFINES *stdef; + COMMANDS *stcmd; - do - { + HB_TRACE(("ParseExpression(%s, %s)", + sLine, sOutLine)); + + do + { strotrim ( sLine ); rezDef = 0; rezTra = 0; rezCom = 0; isdvig = 0; do - { - ptro = sOutLine; - ptri = sLine + isdvig; - ipos = md_strAt( ";", 1, ptri, TRUE, FALSE ); - if ( ipos > 0 ) *(ptri+ipos-1) = '\0'; - SKIPTABSPACES( ptri ); - if ( *ptri == '#' ) - { - ParseDirective( ptri+1 ); - if ( ipos > 0 ) *( sLine + isdvig + ipos - 1 ) = ';'; - lens = strolen( sLine+isdvig ); - pp_Stuff ( " ", sLine+isdvig, 0, (ipos)? ipos:lens, lens ); - if( ipos > 0 ) ipos = 1; - } - else - { /* Look for macros from #define */ - while ( ( lenToken = NextName( &ptri, sToken ) ) > 0 ) - if ( (stdef=DefSearch(sToken)) != NULL ) - { - ptrb = ptri - lenToken; - if ( ( i = WorkDefine ( &ptri, ptro, stdef ) ) >= 0 ) - { - rezDef++; - lens = strolen( ptrb ); - if ( ipos > 0 ) - { - *(ptrb+lens) = ';'; - lens += strolen( ptrb+lens+1 ); - } - pp_Stuff ( ptro, ptrb, i, ptri-ptrb, lens+1 ); - if ( ipos > 0 ) - { - ipos += i - (ptri-ptrb); - *(sLine + isdvig + ipos - 1) = '\0'; - } - ptri += i - (ptri-ptrb); - } - } + { + ptro = sOutLine; + ptri = sLine + isdvig; + ipos = md_strAt( ";", 1, ptri, TRUE, FALSE ); + if ( ipos > 0 ) *(ptri+ipos-1) = '\0'; + SKIPTABSPACES( ptri ); + if ( *ptri == '#' ) + { + ParseDirective( ptri+1 ); + if ( ipos > 0 ) *( sLine + isdvig + ipos - 1 ) = ';'; + lens = strolen( sLine+isdvig ); + pp_Stuff ( " ", sLine+isdvig, 0, (ipos)? ipos:lens, lens ); + if( ipos > 0 ) ipos = 1; + } + else + { /* Look for macros from #define */ + while ( ( lenToken = NextName( &ptri, sToken ) ) > 0 ) + if ( (stdef=DefSearch(sToken)) != NULL ) + { + ptrb = ptri - lenToken; + if ( ( i = WorkDefine ( &ptri, ptro, stdef ) ) >= 0 ) + { + rezDef++; + lens = strolen( ptrb ); + if ( ipos > 0 ) + { + *(ptrb+lens) = ';'; + lens += strolen( ptrb+lens+1 ); + } + pp_Stuff ( ptro, ptrb, i, ptri-ptrb, lens+1 ); + if ( ipos > 0 ) + { + ipos += i - (ptri-ptrb); + *(sLine + isdvig + ipos - 1) = '\0'; + } + ptri += i - (ptri-ptrb); + } + } - /* Look for definitions from #translate */ - stcmd = topTranslate; - while( stcmd != NULL ) - { - ptri = sLine + isdvig; - lenToken = strolen(stcmd->name); - while( ( ifou = md_strAt( stcmd->name, lenToken, - ptri, TRUE, FALSE )) > 0 ) - { - ptri += ifou -1; - if( (i = WorkTranslate( ptri+lenToken, ptro, stcmd, &lens )) >= 0 ) - { - lens += lenToken; - while ( lens > 0 && - (*(ptri+lens-1)==' ' || *(ptri+lens-1)=='\t') ) - lens--; - if ( ipos > 0 ) *(sLine+isdvig+ipos-1) = ';'; - pp_Stuff( ptro, ptri, i, lens, strolen(ptri) ); - rezTra = 1; - if ( ipos > 0 ) - { - ipos += i - lens; - *(sLine+isdvig+ipos-1) = '\0'; - } - ptri += i; - } - else - ptri += lenToken; - } - stcmd = stcmd->last; - } + /* Look for definitions from #translate */ + stcmd = topTranslate; + while( stcmd != NULL ) + { + ptri = sLine + isdvig; + lenToken = strolen(stcmd->name); + while( ( ifou = md_strAt( stcmd->name, lenToken, + ptri, TRUE, FALSE )) > 0 ) + { + ptri += ifou -1; + if( (i = WorkTranslate( ptri+lenToken, ptro, stcmd, &lens )) >= 0 ) + { + lens += lenToken; + while ( lens > 0 && + (*(ptri+lens-1)==' ' || *(ptri+lens-1)=='\t') ) + lens--; + if ( ipos > 0 ) *(sLine+isdvig+ipos-1) = ';'; + pp_Stuff( ptro, ptri, i, lens, strolen(ptri) ); + rezTra = 1; + if ( ipos > 0 ) + { + ipos += i - lens; + *(sLine+isdvig+ipos-1) = '\0'; + } + ptri += i; + } + else + ptri += lenToken; + } + stcmd = stcmd->last; + } - /* Look for definitions from #command */ - if ( kolpass < 3 ) - { - ptri = sLine + isdvig; - SKIPTABSPACES( ptri ); - if ( ISNAME(*ptri) ) - NextName( &ptri, sToken ); - else - { - i = 0; - while ( *ptri != ' ' && *ptri != '\t' && *ptri != '\0' && - *ptri != '\"' && *ptri != '\'' && *ptri != '(' && - !ISNAME(*ptri) ) - { - *(sToken+i) = *ptri++; - i++; - } - *(sToken+i) = '\0'; - } - SKIPTABSPACES( ptri ); + /* Look for definitions from #command */ + if ( kolpass < 3 ) + { + ptri = sLine + isdvig; + SKIPTABSPACES( ptri ); + if ( ISNAME(*ptri) ) + NextName( &ptri, sToken ); + else + { + i = 0; + while ( *ptri != ' ' && *ptri != '\t' && *ptri != '\0' && + *ptri != '\"' && *ptri != '\'' && *ptri != '(' && + !ISNAME(*ptri) ) + { + *(sToken+i) = *ptri++; + i++; + } + *(sToken+i) = '\0'; + } + SKIPTABSPACES( ptri ); - if ( ( *ptri == '\0' || ( *ptri != '=' && - (!IsInStr(*ptri,":/*+-") || *(ptri+1) != '=') && - ( *ptri != '-' || *(ptri+1) != '>' ) ) ) - && ( stcmd = ComSearch(sToken,NULL) ) != NULL ) - { - ptro = sOutLine; - i = WorkCommand( ptri, ptro, stcmd ); - ptri = sLine + isdvig; - if ( ipos > 0 ) *(ptri+ipos-1) = ';'; - if ( i >= 0 ) - { - if ( isdvig + ipos > 0 ) - { - lens = strolen( sLine+isdvig ); - pp_Stuff ( ptro, sLine+isdvig, i, (ipos)? ipos-1:lens, lens ); - if( ipos > 0 ) ipos = i + 1; - } - else - memcpy ( sLine, sOutLine, i+1); - } - rezCom = 1; - } - else if ( ipos > 0 ) *(sLine+isdvig+ipos-1) = ';'; - } - else if ( ipos > 0 ) - *(sLine+isdvig+ipos-1) = ';'; - } - isdvig += ipos; - } + if ( ( *ptri == '\0' || ( *ptri != '=' && + (!IsInStr(*ptri,":/*+-") || *(ptri+1) != '=') && + ( *ptri != '-' || *(ptri+1) != '>' ) ) ) + && ( stcmd = ComSearch(sToken,NULL) ) != NULL ) + { + ptro = sOutLine; + i = WorkCommand( ptri, ptro, stcmd ); + ptri = sLine + isdvig; + if ( ipos > 0 ) *(ptri+ipos-1) = ';'; + if ( i >= 0 ) + { + if ( isdvig + ipos > 0 ) + { + lens = strolen( sLine+isdvig ); + pp_Stuff ( ptro, sLine+isdvig, i, (ipos)? ipos-1:lens, lens ); + if( ipos > 0 ) ipos = i + 1; + } + else + memcpy ( sLine, sOutLine, i+1); + } + rezCom = 1; + } + else if ( ipos > 0 ) *(sLine+isdvig+ipos-1) = ';'; + } + else if ( ipos > 0 ) + *(sLine+isdvig+ipos-1) = ';'; + } + isdvig += ipos; + } while ( ipos != 0 ); kolpass++; if( kolpass > 20 && rezDef ) - GenError( _szPErrors, 'P', ERR_RECURSE, NULL, NULL ); - } - while ( rezDef || rezTra || rezCom ); + GenError( _szPErrors, 'P', ERR_RECURSE, NULL, NULL ); + } + while ( rezDef || rezTra || rezCom ); - return 0; + return 0; } int WorkDefine ( char** ptri, char* ptro, DEFINES *stdef ) { - int npars, lens; - char *ptr; + int npars, lens; + char *ptr; - if ( stdef->npars < 0 ) - lens = strocpy( ptro,stdef->value ); - else - { + HB_TRACE(("WorkDefine(%p, %s, %p)", + ptri, ptro, stdef)); + + if ( stdef->npars < 0 ) + lens = strocpy( ptro,stdef->value ); + else + { SKIPTABSPACES( *ptri ); if ( **ptri == '(' ) - { - npars = 0; ptr = *ptri; - do - { - ptr++; - if ( NextParm( &ptr, NULL ) > 0 ) npars++; - } - while ( *ptr != ')' && *ptr != '\0' ); - if ( *ptr == ')' && stdef->npars == npars ) + { + npars = 0; ptr = *ptri; + do + { + ptr++; + if ( NextParm( &ptr, NULL ) > 0 ) npars++; + } + while ( *ptr != ')' && *ptr != '\0' ); + if ( *ptr == ')' && stdef->npars == npars ) lens = WorkPseudoF( ptri, ptro, stdef ); - else return -1; - } + else return -1; + } else return -1; - } - return lens; + } + return lens; } int WorkPseudoF ( char** ptri, char* ptro, DEFINES *stdef ) { - char parfict[MAX_NAME], *ptrreal; - char *ptrb; - int ipos, ifou, ibeg; - int lenfict, lenreal, lenres; + char parfict[MAX_NAME], *ptrreal; + char *ptrb; + int ipos, ifou, ibeg; + int lenfict, lenreal, lenres; - lenres = strocpy( ptro, stdef->value ); /* Copying value of macro to destination string */ + HB_TRACE(("WorkPseudoF(%p, %s, %p)", + ptri, ptro, stdef)); - if ( stdef->pars ) - { + lenres = strocpy( ptro, stdef->value ); /* Copying value of macro to destination string */ + + if ( stdef->pars ) + { ipos = 0; ibeg = 0; do /* Parsing through parameters */ - { /* in macro definition */ - if ( *(stdef->pars+ipos) == ',' || *(stdef->pars+ipos) == '\0' ) - { - *(parfict+ipos-ibeg) = '\0'; - lenfict = ipos - ibeg; + { /* in macro definition */ + if ( *(stdef->pars+ipos) == ',' || *(stdef->pars+ipos) == '\0' ) + { + *(parfict+ipos-ibeg) = '\0'; + lenfict = ipos - ibeg; - if ( **ptri != ')' ) - { - (*ptri)++; /* Get next real parameter */ - SKIPTABSPACES( *ptri ); - ptrreal = *ptri; - lenreal = NextParm( ptri, NULL); + if ( **ptri != ')' ) + { + (*ptri)++; /* Get next real parameter */ + SKIPTABSPACES( *ptri ); + ptrreal = *ptri; + lenreal = NextParm( ptri, NULL); - ptrb = ptro; - while ( (ifou = pp_strAt( parfict, lenfict, ptrb, lenres-(ptrb-ptro) )) > 0 ) - { - ptrb = ptrb+ifou-1; - if ( !ISNAME(*(ptrb-1)) && !ISNAME(*(ptrb+lenfict)) ) - { - pp_Stuff ( ptrreal, ptrb, lenreal, lenfict, lenres ); - lenres += lenreal - lenfict; - ptrb += lenreal; - } - else ptrb++; - } - ibeg = ipos+1; - } - } - else *(parfict+ipos-ibeg) = *(stdef->pars+ipos); - if ( *(stdef->pars+ipos) == '\0' ) break; - ipos++; - } + ptrb = ptro; + while ( (ifou = pp_strAt( parfict, lenfict, ptrb, lenres-(ptrb-ptro) )) > 0 ) + { + ptrb = ptrb+ifou-1; + if ( !ISNAME(*(ptrb-1)) && !ISNAME(*(ptrb+lenfict)) ) + { + pp_Stuff ( ptrreal, ptrb, lenreal, lenfict, lenres ); + lenres += lenreal - lenfict; + ptrb += lenreal; + } + else ptrb++; + } + ibeg = ipos+1; + } + } + else *(parfict+ipos-ibeg) = *(stdef->pars+ipos); + if ( *(stdef->pars+ipos) == '\0' ) break; + ipos++; + } while ( 1 ); - } - else while ( **ptri != ')' ) (*ptri)++; - (*ptri)++; - return lenres; + } + else while ( **ptri != ')' ) (*ptri)++; + (*ptri)++; + return lenres; } int WorkCommand ( char* ptri, char* ptro, COMMANDS *stcmd ) { - int rez; - int lenres; - char *ptrmp; - char *sToken = stcmd->name; + int rez; + int lenres; + char *ptrmp; + char *sToken = stcmd->name; - do - { + HB_TRACE(("WorkCommand(%s, %s, %p)", + ptri, ptro, stcmd)); + + do + { lenres = strocpy ( ptro, stcmd->value ); /* Copying result pattern */ ptrmp = stcmd->mpatt; /* Pointer to a match pattern */ Repeate = 0; @@ -792,23 +830,26 @@ int WorkCommand ( char* ptri, char* ptro, COMMANDS *stcmd ) stcmd = stcmd->last; if ( rez < 0 && stcmd != NULL ) stcmd = ComSearch(sToken, stcmd); - } - while ( rez < 0 && stcmd != NULL ); + } + while ( rez < 0 && stcmd != NULL ); - *(ptro+lenres) = '\0'; - if ( rez >= 0 ) return lenres; - return -1; + *(ptro+lenres) = '\0'; + if ( rez >= 0 ) return lenres; + return -1; } int WorkTranslate ( char* ptri, char* ptro, COMMANDS *sttra, int *lens ) { - int rez; - int lenres; - char *ptrmp; - char *sToken = sttra->name; + int rez; + int lenres; + char *ptrmp; + char *sToken = sttra->name; - do - { + HB_TRACE(("WorkTranslate(%s, %s, %p, %p)", + ptri, ptro, sttra, lens)); + + do + { lenres = strocpy ( ptro, sttra->value ); ptrmp = sttra->mpatt; Repeate = 0; @@ -817,159 +858,163 @@ int WorkTranslate ( char* ptri, char* ptro, COMMANDS *sttra, int *lens ) sttra = sttra->last; if ( rez < 0 && sttra != NULL ) sttra = TraSearch(sToken, sttra); - } - while ( rez < 0 && sttra != NULL ); + } + while ( rez < 0 && sttra != NULL ); - *(ptro+lenres) = '\0'; - if ( rez >= 0 ) - { + *(ptro+lenres) = '\0'; + if ( rez >= 0 ) + { *lens = rez; return lenres; - } - return -1; + } + return -1; } int CommandStuff ( char *ptrmp, char *inputLine, char * ptro, int *lenres, int com_or_tra, int com_or_xcom ) { - int endTranslation = FALSE, ipos; - char *lastopti[3], *strtopti = NULL, *strtptri = NULL; - char *ptri = inputLine, *ptr, tmpname[MAX_NAME]; + int endTranslation = FALSE, ipos; + char *lastopti[3], *strtopti = NULL, *strtptri = NULL; + char *ptri = inputLine, *ptr, tmpname[MAX_NAME]; - numBrackets = 0; - SKIPTABSPACES( ptri ); - if ( ptrmp == NULL ) { if ( *ptri != '\0' ) return -1; } - else - while ( *ptri != '\0' && !endTranslation ) + HB_TRACE(("CommandStuff(%s, %s, %s, %p, %d, %d)", + ptrmp, inputLine, ptro, lenres, + com_or_tra, com_or_xcom)); + + numBrackets = 0; + SKIPTABSPACES( ptri ); + if ( ptrmp == NULL ) { if ( *ptri != '\0' ) return -1; } + else + while ( *ptri != '\0' && !endTranslation ) { - SKIPTABSPACES( ptrmp ); - if( *ptrmp == '[' && !numBrackets && !strtopti ) - strtopti = ptrmp; - if( !numBrackets && strtopti && strtptri != ptri && ISNAME( *ptri ) ) - { + SKIPTABSPACES( ptrmp ); + if( *ptrmp == '[' && !numBrackets && !strtopti ) + strtopti = ptrmp; + if( !numBrackets && strtopti && strtptri != ptri && ISNAME( *ptri ) ) + { strtptri = ptri; ptrmp = strtopti; ptr = ptri; ipos = NextName( &ptr, tmpname ); ipos = md_strAt( tmpname, ipos, strtopti, TRUE, TRUE ); if( ipos && TestOptional( strtopti, strtopti+ipos-2 ) ) - { - ptr = strtopti+ipos-2; - while( *ptr != '[' && *ptr != ']' ) ptr--; - if( *ptr != ']' ) + { + ptr = strtopti+ipos-2; + while( *ptr != '[' && *ptr != ']' ) ptr--; + if( *ptr != ']' ) ptrmp = ptr; - } - } - switch ( *ptrmp ) { - case '[': - numBrackets++; - aIsRepeate[ Repeate ] = 0; - lastopti[Repeate++] = ptrmp; - ptrmp++; - if( !CheckOptional( ptrmp, ptri, ptro, lenres, com_or_tra, com_or_xcom ) ) - SkipOptional( &ptrmp ); - break; - case ']': - if( Repeate ) + } + } + switch ( *ptrmp ) { + case '[': + numBrackets++; + aIsRepeate[ Repeate ] = 0; + lastopti[Repeate++] = ptrmp; + ptrmp++; + if( !CheckOptional( ptrmp, ptri, ptro, lenres, com_or_tra, com_or_xcom ) ) + SkipOptional( &ptrmp ); + break; + case ']': + if( Repeate ) { - Repeate--; - if( aIsRepeate[ Repeate ] ) - { + Repeate--; + if( aIsRepeate[ Repeate ] ) + { if( ISNAME(*ptri) ) - { - ptr = ptri; - ipos = NextName( &ptr, tmpname ); - ipos = md_strAt( tmpname, ipos, ptrmp, TRUE, TRUE ); - if( ipos && TestOptional( ptrmp+1, ptrmp+ipos-2 ) ) - { + { + ptr = ptri; + ipos = NextName( &ptr, tmpname ); + ipos = md_strAt( tmpname, ipos, ptrmp, TRUE, TRUE ); + if( ipos && TestOptional( ptrmp+1, ptrmp+ipos-2 ) ) + { + ptrmp = lastopti[Repeate]; + ptrmp++; + Repeate++; + SkipOptional( &ptrmp ); + numBrackets++; + ptrmp++; + strtptri = ptri; + } + else ptrmp = lastopti[Repeate]; - ptrmp++; - Repeate++; - SkipOptional( &ptrmp ); - numBrackets++; - ptrmp++; - strtptri = ptri; - } - else - ptrmp = lastopti[Repeate]; - } + } else - ptrmp = lastopti[Repeate]; - } - else ptrmp++; - numBrackets--; + ptrmp = lastopti[Repeate]; + } + else ptrmp++; + numBrackets--; } - else { numBrackets--; ptrmp++; } - break; - case ',': - if( !numBrackets ) strtopti = NULL; - if ( *ptri == ',' ) { ptrmp++; ptri++; } - else + else { numBrackets--; ptrmp++; } + break; + case ',': + if( !numBrackets ) strtopti = NULL; + if ( *ptri == ',' ) { ptrmp++; ptri++; } + else { - if ( numBrackets ) - { + if ( numBrackets ) + { SkipOptional( &ptrmp ); - } - else return -1; + } + else return -1; } - break; - case '\1': /* Match marker */ - if( !numBrackets ) strtopti = NULL; - if ( !WorkMarkers( &ptrmp, &ptri, ptro, lenres, com_or_xcom ) ) + break; + case '\1': /* Match marker */ + if( !numBrackets ) strtopti = NULL; + if ( !WorkMarkers( &ptrmp, &ptri, ptro, lenres, com_or_xcom ) ) { - if ( numBrackets ) - { + if ( numBrackets ) + { SkipOptional( &ptrmp ); - } - else return -1; + } + else return -1; } - break; - case '\0': - if ( com_or_tra ) - return -1; - else endTranslation = TRUE; - break; - default: /* Key word */ - if( !numBrackets ) strtopti = NULL; - ptr = ptri; - if ( *ptri == ',' || truncmp( &ptri, &ptrmp, !com_or_xcom ) ) + break; + case '\0': + if ( com_or_tra ) + return -1; + else endTranslation = TRUE; + break; + default: /* Key word */ + if( !numBrackets ) strtopti = NULL; + ptr = ptri; + if ( *ptri == ',' || truncmp( &ptri, &ptrmp, !com_or_xcom ) ) { - ptri = ptr; - if ( numBrackets ) - { + ptri = ptr; + if ( numBrackets ) + { SkipOptional( &ptrmp ); - } - else return -1; + } + else return -1; } - } - SKIPTABSPACES( ptri ); + } + SKIPTABSPACES( ptri ); }; - if ( *ptrmp != '\0' ) - { - if ( Repeate ) { Repeate = 0; ptrmp = lastopti[0]; } - numBrackets = 0; - do - { - SKIPTABSPACES( ptrmp ); - if ( *ptrmp != '\0' ) - switch ( *ptrmp ) { - case '[': - ptrmp++; - SkipOptional( &ptrmp ); - ptrmp++; - break; - case ']': ptrmp++; break; - default: - return -1; - } - } - while ( *ptrmp != '\0' ); - } - SearnRep( "\1","",0,ptro,lenres); + if ( *ptrmp != '\0' ) + { + if ( Repeate ) { Repeate = 0; ptrmp = lastopti[0]; } + numBrackets = 0; + do + { + SKIPTABSPACES( ptrmp ); + if ( *ptrmp != '\0' ) + switch ( *ptrmp ) { + case '[': + ptrmp++; + SkipOptional( &ptrmp ); + ptrmp++; + break; + case ']': ptrmp++; break; + default: + return -1; + } + } + while ( *ptrmp != '\0' ); + } + SearnRep( "\1","",0,ptro,lenres); - *(ptro + *lenres) = '\0'; - *lenres = RemoveSlash( ptro ); /* Removing '\' from result string */ - if ( com_or_tra ) return 1; else return (ptri-inputLine); + *(ptro + *lenres) = '\0'; + *lenres = RemoveSlash( ptro ); /* Removing '\' from result string */ + if ( com_or_tra ) return 1; else return (ptri-inputLine); } int RemoveSlash( char *stroka ) @@ -978,9 +1023,11 @@ int RemoveSlash( char *stroka ) int State = STATE_INIT, lDirective = FALSE; int lenres = strolen( stroka ); + HB_TRACE(("RemoveSlash(%s)", stroka)); + while( *ptr != '\0' ) - { - switch( State ) { + { + switch( State ) { case STATE_INIT: if( *ptr != ' ' && *ptr != '\t' ) State = STATE_NORMAL; if( *ptr == '#' ) lDirective = TRUE; @@ -988,21 +1035,21 @@ int RemoveSlash( char *stroka ) if( *ptr == '\'' ) State = STATE_QUOTE1; else if( *ptr == '\"' ) State = STATE_QUOTE2; else if( *ptr == ';' ) - { - State = STATE_INIT; - lDirective = FALSE; - } + { + State = STATE_INIT; + lDirective = FALSE; + } else if( !lDirective ) - { - if( *ptr == '\\' && ( *(ptr+1) == '[' || *(ptr+1) == ']' || - *(ptr+1) == '{' || *(ptr+1) == '}' || *(ptr+1) == '<' || - *(ptr+1) == '>' || *(ptr+1) == '\'' || *(ptr+1) == '\"' ) ) - { - pp_Stuff ( "", ptr, 0, 1, lenres - (ptr - stroka) ); - lenres--; - ptr++; - } - } + { + if( *ptr == '\\' && ( *(ptr+1) == '[' || *(ptr+1) == ']' || + *(ptr+1) == '{' || *(ptr+1) == '}' || *(ptr+1) == '<' || + *(ptr+1) == '>' || *(ptr+1) == '\'' || *(ptr+1) == '\"' ) ) + { + pp_Stuff ( "", ptr, 0, 1, lenres - (ptr - stroka) ); + lenres--; + ptr++; + } + } break; case STATE_QUOTE1: if( *ptr == '\'' ) State = STATE_NORMAL; @@ -1010,981 +1057,1039 @@ int RemoveSlash( char *stroka ) case STATE_QUOTE2: if( *ptr == '\"' ) State = STATE_NORMAL; break; + } + ptr++; } - ptr++; - } return lenres; } int WorkMarkers( char **ptrmp, char **ptri, char *ptro, int *lenres, int com_or_xcom ) { - char expreal[MAX_NAME], exppatt[MAX_NAME]; - int lenreal = 0, maxlenreal = STR_SIZE, lenpatt; - int rezrestr, ipos; - char *ptr, *ptrtemp; + char expreal[MAX_NAME], exppatt[MAX_NAME]; + int lenreal = 0, maxlenreal = STR_SIZE, lenpatt; + int rezrestr, ipos; + char *ptr, *ptrtemp; - /* Copying a match pattern to 'exppatt' */ + HB_TRACE(("WorkMarkers(%p, %p, %s, %p)", + ptrmp, ptri, ptro, lenres)); + + /* Copying a match pattern to 'exppatt' */ lenpatt = stroncpy ( exppatt, *ptrmp, 4 ); *ptrmp += 4; SKIPTABSPACES ( *ptrmp ); if ( **ptri == ',' ) - { - if ( numBrackets ) { - return 0; + if ( numBrackets ) + { + return 0; + } } - } ptrtemp = *ptrmp; if ( *(exppatt+2) != '2' && *ptrtemp == ']' ) - { - ptrtemp++; - SKIPTABSPACES ( ptrtemp ); - } + { + ptrtemp++; + SKIPTABSPACES ( ptrtemp ); + } if ( *(exppatt+2) != '2' && *ptrtemp != '\1' && *ptrtemp != ',' && - *ptrtemp != '[' && *ptrtemp != ']' && *ptrtemp != '\0' ) - { - lenreal = strincpy ( expreal, ptrtemp ); - if ( (ipos = md_strAt( expreal, lenreal, *ptri, TRUE, TRUE )) > 0 ) - { - if ( ptrtemp > *ptrmp ) + *ptrtemp != '[' && *ptrtemp != ']' && *ptrtemp != '\0' ) { - if ( ipos == 1 ) - { - if ( numBrackets ) - { - return 0; - } - } + lenreal = strincpy ( expreal, ptrtemp ); + if ( (ipos = md_strAt( expreal, lenreal, *ptri, TRUE, TRUE )) > 0 ) + { + if ( ptrtemp > *ptrmp ) + { + if ( ipos == 1 ) + { + if ( numBrackets ) + { + return 0; + } + } + else + { + maxlenreal = ipos - 1; + lenreal = 0; + } + } + else + { + lenreal = stroncpy( expreal, *ptri, ipos-1 ); + if ( ipos > 1 && isExpres ( expreal ) ) + *ptri += lenreal; + else + { + if ( numBrackets ) + { + return 0; + } + } + } + } else - { - maxlenreal = ipos - 1; - lenreal = 0; - } + { + if ( numBrackets ) + { + return 0; + } + else lenreal = 0; + } } - else - { - lenreal = stroncpy( expreal, *ptri, ipos-1 ); - if ( ipos > 1 && isExpres ( expreal ) ) - *ptri += lenreal; - else - { - if ( numBrackets ) - { - return 0; - } - } - } - } - else - { - if ( numBrackets ) - { - return 0; - } - else lenreal = 0; - } - } if ( *(exppatt+2) == '4' ) /* ---- extended match marker */ - { - if ( !lenreal ) lenreal = getExpReal ( expreal, ptri, FALSE, maxlenreal ); - SearnRep( exppatt,expreal,lenreal,ptro,lenres); - } + { + if ( !lenreal ) lenreal = getExpReal ( expreal, ptri, FALSE, maxlenreal ); + SearnRep( exppatt,expreal,lenreal,ptro,lenres); + } else if ( *(exppatt+2) == '3' ) /* ---- wild match marker */ - { - lenreal = strocpy ( expreal, *ptri ); - *ptri += lenreal; - SearnRep( exppatt,expreal,lenreal,ptro,lenres); - } + { + lenreal = strocpy ( expreal, *ptri ); + *ptri += lenreal; + SearnRep( exppatt,expreal,lenreal,ptro,lenres); + } else if ( *(exppatt+2) == '2' ) /* ---- restricted match marker */ - { - while ( **ptrmp != '>' ) *(exppatt+lenpatt++) = *((*ptrmp)++); - *(exppatt+lenpatt) = '\0'; - (*ptrmp)++; + { + while ( **ptrmp != '>' ) *(exppatt+lenpatt++) = *((*ptrmp)++); + *(exppatt+lenpatt) = '\0'; + (*ptrmp)++; - ptr = exppatt + 4; - rezrestr = 0; - while ( *ptr != '\0' ) - { - if ( *ptr == '&' ) - { - if ( **ptri == '&' ) - { - rezrestr = 1; - /* (*ptri)++; */ - lenreal = getExpReal ( expreal, ptri, FALSE, maxlenreal ); - SearnRep( exppatt,expreal,lenreal,ptro,lenres); - break; - } - else ptr++; - } - else - { - SKIPTABSPACES( ptr ); - /* Comparing real parameter and restriction value */ - ptrtemp = ptr; - if ( !strincmp ( *ptri, &ptr, !com_or_xcom ) ) - { - lenreal = stroncpy( expreal, *ptri, (ptr-ptrtemp) ); - *ptri += lenreal; - SearnRep( exppatt,expreal,lenreal,ptro,lenres); - rezrestr = 1; - break; - } - else - { - while ( *ptr != ',' && *ptr != '\0' ) ptr++; - if ( *ptr == ',' ) ptr++; - } - } - } - if ( rezrestr == 0 ) - { /* If restricted match marker doesn't correspond to real parameter */ - if ( numBrackets ) - { - return 0; - } - else return 0; - } - } + ptr = exppatt + 4; + rezrestr = 0; + while ( *ptr != '\0' ) + { + if ( *ptr == '&' ) + { + if ( **ptri == '&' ) + { + rezrestr = 1; + /* (*ptri)++; */ + lenreal = getExpReal ( expreal, ptri, FALSE, maxlenreal ); + SearnRep( exppatt,expreal,lenreal,ptro,lenres); + break; + } + else ptr++; + } + else + { + SKIPTABSPACES( ptr ); + /* Comparing real parameter and restriction value */ + ptrtemp = ptr; + if ( !strincmp ( *ptri, &ptr, !com_or_xcom ) ) + { + lenreal = stroncpy( expreal, *ptri, (ptr-ptrtemp) ); + *ptri += lenreal; + SearnRep( exppatt,expreal,lenreal,ptro,lenres); + rezrestr = 1; + break; + } + else + { + while ( *ptr != ',' && *ptr != '\0' ) ptr++; + if ( *ptr == ',' ) ptr++; + } + } + } + if ( rezrestr == 0 ) + { /* If restricted match marker doesn't correspond to real parameter */ + if ( numBrackets ) + { + return 0; + } + else return 0; + } + } else if ( *(exppatt+2) == '1' ) /* ---- list match marker */ - { - if ( !lenreal ) lenreal = getExpReal ( expreal, ptri, TRUE, maxlenreal ); - SearnRep( exppatt,expreal,lenreal,ptro,lenres); - } + { + if ( !lenreal ) lenreal = getExpReal ( expreal, ptri, TRUE, maxlenreal ); + SearnRep( exppatt,expreal,lenreal,ptro,lenres); + } else /* ---- regular match marker */ - { - /* Copying a real expression to 'expreal' */ - if ( !lenreal ) lenreal = getExpReal ( expreal, ptri, FALSE, maxlenreal ); - SearnRep( exppatt,expreal,lenreal,ptro,lenres); - } + { + /* Copying a real expression to 'expreal' */ + if ( !lenreal ) lenreal = getExpReal ( expreal, ptri, FALSE, maxlenreal ); + SearnRep( exppatt,expreal,lenreal,ptro,lenres); + } return 1; } int getExpReal ( char *expreal, char **ptri, int prlist, int maxrez ) { - int lens = 0; - char *sZnaki = "+-=><*/$.&:#%!^"; - int State; - int StBr1 = 0, StBr2 = 0, StBr3 = 0; - int rez = 0; + int lens = 0; + char *sZnaki = "+-=><*/$.&:#%!^"; + int State; + int StBr1 = 0, StBr2 = 0, StBr3 = 0; + int rez = 0; - SKIPTABSPACES ( *ptri ); - State = (**ptri=='\'' || **ptri=='\"')? STATE_EXPRES:STATE_ID; - while ( **ptri != '\0' && !rez && lens < maxrez ) - { - switch ( State ) { - case STATE_QUOTE1: - if(**ptri=='\'') - State = (StBr1==0 && StBr2==0 && StBr3==0)? STATE_ID_END:STATE_BRACKET; - break; - case STATE_QUOTE2: - if(**ptri=='\"') - State = (StBr1==0 && StBr2==0 && StBr3==0)? STATE_ID_END:STATE_BRACKET; - break; - case STATE_BRACKET: - if ( **ptri == '\'' ) State = STATE_QUOTE1; - else if ( **ptri == '\"' ) State = STATE_QUOTE2; - else if ( **ptri == '(' ) StBr1++; - else if ( **ptri == '[' ) StBr2++; - else if ( **ptri == '{' ) StBr3++; - else if ( **ptri == ')' ) - { StBr1--; if (StBr1==0 && StBr2==0 && StBr3==0) State = STATE_ID_END; } - else if ( **ptri == ']' ) - { StBr2--; if (StBr1==0 && StBr2==0 && StBr3==0) State = STATE_ID_END; } - else if ( **ptri == '}' ) - { StBr3--; if (StBr1==0 && StBr2==0 && StBr3==0) State = STATE_ID_END; } - break; - case STATE_ID: - case STATE_ID_END: - if ( ( (ISNAME(**ptri) || **ptri=='\\') && State == STATE_ID_END ) || - **ptri==',' || **ptri=='\'' || **ptri=='\"' || **ptri==')' ) - { - if ( **ptri == ',' ) - { - if ( !prlist ) rez = 1; - State = STATE_EXPRES; + HB_TRACE(("getExpReal(%s, %p, %d, %d)", + expreal, ptri, prlist, maxrez)); + + SKIPTABSPACES ( *ptri ); + State = (**ptri=='\'' || **ptri=='\"')? STATE_EXPRES:STATE_ID; + while ( **ptri != '\0' && !rez && lens < maxrez ) + { + switch ( State ) { + case STATE_QUOTE1: + if(**ptri=='\'') + State = (StBr1==0 && StBr2==0 && StBr3==0)? STATE_ID_END:STATE_BRACKET; + break; + case STATE_QUOTE2: + if(**ptri=='\"') + State = (StBr1==0 && StBr2==0 && StBr3==0)? STATE_ID_END:STATE_BRACKET; + break; + case STATE_BRACKET: + if ( **ptri == '\'' ) State = STATE_QUOTE1; + else if ( **ptri == '\"' ) State = STATE_QUOTE2; + else if ( **ptri == '(' ) StBr1++; + else if ( **ptri == '[' ) StBr2++; + else if ( **ptri == '{' ) StBr3++; + else if ( **ptri == ')' ) + { StBr1--; if (StBr1==0 && StBr2==0 && StBr3==0) State = STATE_ID_END; } + else if ( **ptri == ']' ) + { StBr2--; if (StBr1==0 && StBr2==0 && StBr3==0) State = STATE_ID_END; } + else if ( **ptri == '}' ) + { StBr3--; if (StBr1==0 && StBr2==0 && StBr3==0) State = STATE_ID_END; } + break; + case STATE_ID: + case STATE_ID_END: + if ( ( (ISNAME(**ptri) || **ptri=='\\') && State == STATE_ID_END ) || + **ptri==',' || **ptri=='\'' || **ptri=='\"' || **ptri==')' ) + { + if ( **ptri == ',' ) + { + if ( !prlist ) rez = 1; + State = STATE_EXPRES; + } + else rez = 1; + } + else if ( IsInStr( **ptri, sZnaki ) ) + { + State = STATE_EXPRES; + } + else if ( **ptri == '(' ) + { + State = STATE_BRACKET; + StBr1 = 1; + } + else if ( **ptri == '[' ) + { + State = STATE_BRACKET; + StBr2 = 1; + } + else if ( **ptri == '{' ) + { + State = STATE_BRACKET; + StBr3 = 1; + } + else if ( **ptri == ' ' ) State = STATE_ID_END; + break; + case STATE_EXPRES: + case STATE_EXPRES_ID: + if ( **ptri == '\'' ) State = STATE_QUOTE1; + else if ( **ptri == '\"' ) State = STATE_QUOTE2; + else if ( ISNAME(**ptri) ) State = STATE_EXPRES_ID; + else if ( **ptri == ' ' ) + { + if( State == STATE_EXPRES_ID ) State = STATE_ID_END; + else if( lens > 2 && ( ( *(*ptri-2)=='+' && *(*ptri-1)=='+' ) || + ( *(*ptri-2)=='-' && *(*ptri-1)=='-' ) ) ) + State = STATE_ID_END; + } + else if ( **ptri == '(' ) { StBr1++; State = STATE_BRACKET; } + else if ( **ptri == '[' ) { StBr2++; State = STATE_BRACKET; } + else if ( **ptri == '{' ) { StBr3++; State = STATE_BRACKET; } + else if ( **ptri == ',' ) { if ( !prlist ) rez = 1; State = STATE_EXPRES; } + else if( **ptri == '.' && *(*ptri-2) == '.' && + ( *(*ptri-1) == 'T' || *(*ptri-1) == 'F' || + *(*ptri-1) == 't' || *(*ptri-1) == 'f' ) ) + State = STATE_ID_END; + else State = STATE_EXPRES; + break; } - else rez = 1; - } - else if ( IsInStr( **ptri, sZnaki ) ) - { - State = STATE_EXPRES; - } - else if ( **ptri == '(' ) - { - State = STATE_BRACKET; - StBr1 = 1; - } - else if ( **ptri == '[' ) - { - State = STATE_BRACKET; - StBr2 = 1; - } - else if ( **ptri == '{' ) - { - State = STATE_BRACKET; - StBr3 = 1; - } - else if ( **ptri == ' ' ) State = STATE_ID_END; - break; - case STATE_EXPRES: - case STATE_EXPRES_ID: - if ( **ptri == '\'' ) State = STATE_QUOTE1; - else if ( **ptri == '\"' ) State = STATE_QUOTE2; - else if ( ISNAME(**ptri) ) State = STATE_EXPRES_ID; - else if ( **ptri == ' ' ) - { - if( State == STATE_EXPRES_ID ) State = STATE_ID_END; - else if( lens > 2 && ( ( *(*ptri-2)=='+' && *(*ptri-1)=='+' ) || - ( *(*ptri-2)=='-' && *(*ptri-1)=='-' ) ) ) - State = STATE_ID_END; - } - else if ( **ptri == '(' ) { StBr1++; State = STATE_BRACKET; } - else if ( **ptri == '[' ) { StBr2++; State = STATE_BRACKET; } - else if ( **ptri == '{' ) { StBr3++; State = STATE_BRACKET; } - else if ( **ptri == ',' ) { if ( !prlist ) rez = 1; State = STATE_EXPRES; } - else if( **ptri == '.' && *(*ptri-2) == '.' && - ( *(*ptri-1) == 'T' || *(*ptri-1) == 'F' || - *(*ptri-1) == 't' || *(*ptri-1) == 'f' ) ) - State = STATE_ID_END; - else State = STATE_EXPRES; - break; - } - if ( !rez ) - { - if ( expreal != NULL ) *expreal++ = **ptri; - (*ptri)++; - lens++; - } - } - if ( expreal != NULL ) - { - if ( *(expreal-1) == ' ' ) { expreal--; lens--; }; - *expreal = '\0'; - } - return lens; + if ( !rez ) + { + if ( expreal != NULL ) *expreal++ = **ptri; + (*ptri)++; + lens++; + } + } + if ( expreal != NULL ) + { + if ( *(expreal-1) == ' ' ) { expreal--; lens--; }; + *expreal = '\0'; + } + return lens; } int isExpres ( char* stroka ) { - if ( strolen ( stroka ) > getExpReal ( NULL, &stroka, FALSE, STR_SIZE ) ) - return 0; - else - return 1; + HB_TRACE(("isExpres(%s)", stroka)); + + if ( strolen ( stroka ) > getExpReal ( NULL, &stroka, FALSE, STR_SIZE ) ) + return 0; + else + return 1; } int TestOptional( char *ptr1, char *ptr2 ) { - int nbr = 0, flagname = 0, statevar = 0; + int nbr = 0, flagname = 0, statevar = 0; - while( ptr1 <= ptr2 ) - { + HB_TRACE(("TestOptional(%s, %s)", ptr1, ptr2)); + + while( ptr1 <= ptr2 ) + { if( *ptr1 == '[' ) nbr++; else if( *ptr1 == ']' ) - { - if( nbr ) - { - nbr--; - flagname = 0; - } - else return 0; - } + { + if( nbr ) + { + nbr--; + flagname = 0; + } + else return 0; + } else if( *ptr1 == '\1' && *(ptr1+2) == '2' && nbr ) statevar = 1; else if( *ptr1 == '>' && statevar ) statevar = 0; else if( *ptr1 != ' ' && *ptr1 != '\t' && !statevar ) - { - if( nbr ) flagname = 1; - else return 0; - } + { + if( nbr ) flagname = 1; + else return 0; + } ptr1++; - } -/* if( !flagname ) - while( *ptr1 != ']' ) - { - if( *ptr1 == '[' || *ptr1 == '\0' ) return 0; - ptr1++; - } */ - return !flagname; + } + /* if( !flagname ) + while( *ptr1 != ']' ) + { + if( *ptr1 == '[' || *ptr1 == '\0' ) return 0; + ptr1++; + } */ + return !flagname; } int CheckOptional( char* ptrmp, char* ptri, char* ptro, int* lenres, int com_or_tra, int com_or_xcom ) { - int save_numBr = numBrackets, save_Repeate = Repeate; - int endTranslation = FALSE, result = TRUE; - char *lastInputptr[5]; - char *lastopti[3], *ptr; + int save_numBr = numBrackets, save_Repeate = Repeate; + int endTranslation = FALSE, result = TRUE; + char *lastInputptr[5]; + char *lastopti[3], *ptr; - lReplacePat = FALSE; - lastInputptr[Repeate] = ptri; - while ( *ptri != '\0' && !endTranslation && result ) - { + HB_TRACE(("CheckOptional(%s, %s, %s, %p, %d, %d)", + ptrmp, ptri, ptro, lenres, com_or_tra, com_or_xcom)); + + lReplacePat = FALSE; + lastInputptr[Repeate] = ptri; + while ( *ptri != '\0' && !endTranslation && result ) + { SKIPTABSPACES( ptrmp ); switch ( *ptrmp ) { case '[': - numBrackets++; - aIsRepeate[ Repeate ] = 0; - lastInputptr[Repeate] = ptri; - lastopti[Repeate++] = ptrmp; - ptrmp++; - break; + numBrackets++; + aIsRepeate[ Repeate ] = 0; + lastInputptr[Repeate] = ptri; + lastopti[Repeate++] = ptrmp; + ptrmp++; + break; case ']': - if( numBrackets == save_numBr ) - endTranslation = TRUE; - else - { + if( numBrackets == save_numBr ) + endTranslation = TRUE; + else + { if( Repeate ) - { - Repeate--; - ptrmp = lastopti[Repeate]; - } + { + Repeate--; + ptrmp = lastopti[Repeate]; + } else ptrmp++; numBrackets--; - } - break; + } + break; case ',': - if ( *ptri == ',' ) { ptrmp++; ptri++; } - else - { + if ( *ptri == ',' ) { ptrmp++; ptri++; } + else + { if ( numBrackets - save_numBr > 0 ) - { - SkipOptional( &ptrmp ); - ptri = lastInputptr[Repeate]; - } + { + SkipOptional( &ptrmp ); + ptri = lastInputptr[Repeate]; + } else result = FALSE; - } - break; + } + break; case '\1': /* Match marker */ - if ( !WorkMarkers( &ptrmp, &ptri, ptro, lenres, com_or_xcom ) ) - { + if ( !WorkMarkers( &ptrmp, &ptri, ptro, lenres, com_or_xcom ) ) + { if ( numBrackets - save_numBr > 0 ) - { - SkipOptional( &ptrmp ); - ptri = lastInputptr[Repeate]; - } + { + SkipOptional( &ptrmp ); + ptri = lastInputptr[Repeate]; + } else result = FALSE; - } - break; + } + break; case '\0': - result = FALSE; + result = FALSE; default: /* Key word */ - ptr = ptri; - if ( *ptri == ',' || truncmp( &ptri, &ptrmp, !com_or_xcom ) ) - { + ptr = ptri; + if ( *ptri == ',' || truncmp( &ptri, &ptrmp, !com_or_xcom ) ) + { ptri = ptr; if ( numBrackets - save_numBr > 0 ) - { - SkipOptional( &ptrmp ); - ptri = lastInputptr[Repeate]; - } + { + SkipOptional( &ptrmp ); + ptri = lastInputptr[Repeate]; + } else result = FALSE; - } + } } SKIPTABSPACES( ptri ); - }; - if ( *ptri == '\0' ) - { + }; + if ( *ptri == '\0' ) + { do - { - SKIPTABSPACES( ptrmp ); - if( *ptrmp == '[' ) - { - ptrmp++; - SkipOptional( &ptrmp ); - } - else if( *ptrmp == ']' ) + { + SKIPTABSPACES( ptrmp ); + if( *ptrmp == '[' ) + { + ptrmp++; + SkipOptional( &ptrmp ); + } + else if( *ptrmp == ']' ) break; - else - { - result = 0; - break; - } - } + else + { + result = 0; + break; + } + } while ( 1 ); - } - Repeate = save_Repeate; - numBrackets = save_numBr; - lReplacePat = TRUE; - return result ; + } + Repeate = save_Repeate; + numBrackets = save_numBr; + lReplacePat = TRUE; + return result ; } void SkipOptional( char** ptri ) { - int nbr = 0; + int nbr = 0; - while ( **ptri != ']' || nbr ) - { + HB_TRACE(("SkipOptional(%p)", ptri)); + + while ( **ptri != ']' || nbr ) + { switch ( **ptri ) { case '[': nbr++; break; case ']': nbr--; break; case '\1': - (*ptri) += 3; - if ( *(*ptri-1) == '2' ) - while ( **ptri != '>' ) (*ptri)++; - break; + (*ptri) += 3; + if ( *(*ptri-1) == '2' ) + while ( **ptri != '>' ) (*ptri)++; + break; } (*ptri)++; - } - if ( **ptri == ']' && numBrackets > 0 ) - { - if ( Repeate ) Repeate--; - numBrackets--; (*ptri)++; - } + } + if ( **ptri == ']' && numBrackets > 0 ) + { + if ( Repeate ) Repeate--; + numBrackets--; (*ptri)++; + } } void SearnRep( char *exppatt,char *expreal,int lenreal,char *ptro, int *lenres) { - int ifou, isdvig = 0, rezs; - int kolmarkers; - int lennew, i; - char lastchar = '0'; - char expnew[MAX_NAME]; - char *ptr, *ptr2, *ptrOut = ptro; + int ifou, isdvig = 0, rezs; + int kolmarkers; + int lennew, i; + char lastchar = '0'; + char expnew[MAX_NAME]; + char *ptr, *ptr2, *ptrOut = ptro; - if( *(exppatt+1) == '\0' ) *( ptro + *lenres ) = '\0'; - while ( (ifou = md_strAt( exppatt, (*(exppatt+1))? 2:1, ptrOut, FALSE, FALSE )) > 0 ) - { + HB_TRACE(("SearnRep(%s, %s, %d, %s, %p)", + exppatt, expreal, lenreal, ptro, lenres)); + + if( *(exppatt+1) == '\0' ) *( ptro + *lenres ) = '\0'; + while ( (ifou = md_strAt( exppatt, (*(exppatt+1))? 2:1, ptrOut, FALSE, FALSE )) > 0 ) + { rezs = 0; ptr = ptrOut + ifou - 2; kolmarkers = 0; while ( ptr >= ptrOut ) - { - if ( (*ptr == '[' || *ptr == ']') && *(ptr-1) != '\\' ) break; - if ( *ptr == '\1' ) kolmarkers++; - ptr--; - } + { + if ( (*ptr == '[' || *ptr == ']') && *(ptr-1) != '\\' ) break; + if ( *ptr == '\1' ) kolmarkers++; + ptr--; + } if ( *ptr == '[' && *(ptr-1) != '\\' ) - { - if( Repeate ) aIsRepeate[ Repeate - 1 ]++; - if( !lReplacePat ) return; - ptr2 = ptrOut + ifou + 3; - while ( *ptr2 != ']' && *(ptr-1) != '\\' ) - { - if ( *ptr2 == '\1' ) kolmarkers++; - ptr2++; - } + { + if( Repeate ) aIsRepeate[ Repeate - 1 ]++; + if( !lReplacePat ) return; + ptr2 = ptrOut + ifou + 3; + while ( *ptr2 != ']' && *(ptr-1) != '\\' ) + { + if ( *ptr2 == '\1' ) kolmarkers++; + ptr2++; + } - if ( Repeate && lenreal && kolmarkers && lastchar != '0' && - *(ptrOut + ifou + 2) == '0' ) - { - isdvig += ifou; - rezs = 1; - } - else - { - if ( lenreal == 0 ) - { - if( numBrackets >= 2 ) - { - isdvig += ifou; - continue; - } - else - { - pp_Stuff ( "", ptr, 0, ptr2-ptr+1, *lenres-(ptr-ptro) ); - *lenres -= ptr2-ptr+1; - isdvig = ptr - ptro; - rezs = 1; - } - } - else - { - lennew = ptr2-ptr-1; + if ( Repeate && lenreal && kolmarkers && lastchar != '0' && + *(ptrOut + ifou + 2) == '0' ) + { + isdvig += ifou; + rezs = 1; + } + else + { + if ( lenreal == 0 ) + { + if( numBrackets >= 2 ) + { + isdvig += ifou; + continue; + } + else + { + pp_Stuff ( "", ptr, 0, ptr2-ptr+1, *lenres-(ptr-ptro) ); + *lenres -= ptr2-ptr+1; + isdvig = ptr - ptro; + rezs = 1; + } + } + else + { + lennew = ptr2-ptr-1; - memcpy ( expnew, ptr+1, lennew ); - *(expnew + lennew++) = ' '; - *(expnew + lennew) = '\0'; - while ( (i = pp_strAt( exppatt, 2, expnew, lennew )) > 0 ) - lennew += ReplacePattern ( exppatt[2], expreal, lenreal, expnew+i-1, lennew ); - if ( kolmarkers ) - { - groupchar = (char) ( (unsigned int)groupchar + 1 ); - for ( i=0; i 0 ) + lennew += ReplacePattern ( exppatt[2], expreal, lenreal, expnew+i-1, lennew ); + if ( kolmarkers ) + { + groupchar = (char) ( (unsigned int)groupchar + 1 ); + for ( i=0; i 0 ); - } - else - { - pp_rQuotes( expreal, sQuotes ); - pp_Stuff ( sQuotes, ptro, 2, 4, lenres ); - pp_Stuff ( expreal, ptro+1, lenreal, 0, lenres ); - rmlen = lenreal + 2; - } - break; - case '3': /* Smart stringify result marker */ - if ( patttype == '1' ) /* list match marker */ - { - pp_Stuff ( "", ptro, 0, 4, lenres ); - lenres -= 4; - rmlen = 0; - do - { - ifou = md_strAt( ",", 1, expreal, FALSE, TRUE ); - lenitem = (ifou)? ifou-1:lenreal; - if( *expreal != '\0' ) - { - if ( !lenitem || *expreal == '(' || *expreal == '&' || - (*expreal=='\"' && *(expreal+lenitem-1)=='\"') || - (*expreal == '\'' && *(expreal+lenitem-1)=='\'') ) + HB_TRACE(("ReplacePattern(%c, %s, %d, %s, %p)", + patttype, expreal, lenreal, ptro, lenres)); + + switch ( *(ptro+2) ) { + case '0': /* Regular result marker */ + pp_Stuff ( expreal, ptro, lenreal, 4, lenres ); + break; + case '1': /* Dumb stringify result marker */ + pp_rQuotes( expreal, sQuotes ); + pp_Stuff ( sQuotes, ptro, 2, 4, lenres ); + if ( lenreal ) + pp_Stuff ( expreal, ptro+1, lenreal, 0, lenres ); + rmlen = lenreal + 2; + break; + case '2': /* Normal stringify result marker */ + if ( !lenreal ) + pp_Stuff ( "", ptro, 0, 4, lenres ); + else if ( patttype == '1' ) /* list match marker */ + { + pp_Stuff ( "", ptro, 0, 4, lenres ); + lenres -= 4; + rmlen = 0; + do + { + ifou = md_strAt( ",", 1, expreal, FALSE, TRUE ); + lenitem = (ifou)? ifou-1:lenreal; + if( *expreal != '\0' ) + { + i = (ifou)? 3:2; + pp_rQuotes( expreal, sQuotes ); + pp_Stuff ( sQuotes, ptro, i, 0, lenres ); + pp_Stuff ( expreal, ptro+1, lenitem, 0, lenres+i ); + ptro += i + lenitem; + rmlen += i + lenitem; + } + expreal += ifou; + lenreal -= ifou; + } + while ( ifou > 0 ); + } + else + { + pp_rQuotes( expreal, sQuotes ); + pp_Stuff ( sQuotes, ptro, 2, 4, lenres ); + pp_Stuff ( expreal, ptro+1, lenreal, 0, lenres ); + rmlen = lenreal + 2; + } + break; + case '3': /* Smart stringify result marker */ + if ( patttype == '1' ) /* list match marker */ + { + pp_Stuff ( "", ptro, 0, 4, lenres ); + lenres -= 4; + rmlen = 0; + do + { + ifou = md_strAt( ",", 1, expreal, FALSE, TRUE ); + lenitem = (ifou)? ifou-1:lenreal; + if( *expreal != '\0' ) + { + if ( !lenitem || *expreal == '(' || *expreal == '&' || + (*expreal=='\"' && *(expreal+lenitem-1)=='\"') || + (*expreal == '\'' && *(expreal+lenitem-1)=='\'') ) { - if( ifou ) lenitem++; - pp_Stuff ( (*expreal=='&')? expreal+1:expreal, ptro, - (*expreal=='&')? lenitem-1:lenitem, 0, lenres ); + if( ifou ) lenitem++; + pp_Stuff ( (*expreal=='&')? expreal+1:expreal, ptro, + (*expreal=='&')? lenitem-1:lenitem, 0, lenres ); } - else + else { - i = (ifou)? 3:2; - pp_rQuotes( expreal, sQuotes ); - pp_Stuff ( sQuotes, ptro, i, 0, lenres ); - pp_Stuff ( expreal, ptro+1, lenitem, 0, lenres+i ); - ptro += i; - rmlen += i; + i = (ifou)? 3:2; + pp_rQuotes( expreal, sQuotes ); + pp_Stuff ( sQuotes, ptro, i, 0, lenres ); + pp_Stuff ( expreal, ptro+1, lenitem, 0, lenres+i ); + ptro += i; + rmlen += i; } - ptro += lenitem; - rmlen += lenitem; - } - expreal += ifou; - lenreal -= ifou; - } - while ( ifou > 0 ); - } - else if ( !lenreal || *expreal == '(' || *expreal == '&' || - (*expreal=='\"' && *(expreal+lenreal-1)=='\"') || - (*expreal == '\'' && *(expreal+lenreal-1)=='\'') ) - pp_Stuff ( (*expreal=='&')? expreal+1:expreal, ptro, - (*expreal=='&')? lenreal-1:lenreal, 4, lenres ); - else - { - pp_rQuotes( expreal, sQuotes ); - pp_Stuff ( sQuotes, ptro, 2, 4, lenres ); - pp_Stuff ( expreal, ptro+1, lenreal, 0, lenres ); - rmlen = lenreal + 2; - } - break; - case '4': /* Blockify result marker */ - if ( !lenreal ) - pp_Stuff ( expreal, ptro, lenreal, 4, lenres ); - else if ( patttype == '1' ) /* list match marker */ - { - pp_Stuff ( "", ptro, 0, 4, lenres ); - lenres -= 4; - rmlen = 0; - do - { - ifou = md_strAt( ",", 1, expreal, FALSE, TRUE ); - lenitem = (ifou)? ifou-1:lenreal; - if( *expreal != '\0' ) - { - i = (ifou)? 5:4; - pp_Stuff ( "{||},", ptro, i, 0, lenres ); - pp_Stuff ( expreal, ptro+3, lenitem, 0, lenres+i ); - ptro += i + lenitem; - rmlen += i + lenitem; - } - expreal += ifou; - lenreal -= ifou; - } - while ( ifou > 0 ); - } - else - { - pp_Stuff ( "{||}", ptro, 4, 4, lenres ); - pp_Stuff ( expreal, ptro+3, lenreal, 0, lenres ); - rmlen = lenreal + 4; - } - break; - case '5': /* Logify result marker */ - rmlen = 3; - if ( !lenreal ) - { - pp_Stuff ( ".F.", ptro, 3, 4, lenres ); - } - else - pp_Stuff ( ".T.", ptro, 3, 4, lenres ); - break; - } - return rmlen - 4; + ptro += lenitem; + rmlen += lenitem; + } + expreal += ifou; + lenreal -= ifou; + } + while ( ifou > 0 ); + } + else if ( !lenreal || *expreal == '(' || *expreal == '&' || + (*expreal=='\"' && *(expreal+lenreal-1)=='\"') || + (*expreal == '\'' && *(expreal+lenreal-1)=='\'') ) + pp_Stuff ( (*expreal=='&')? expreal+1:expreal, ptro, + (*expreal=='&')? lenreal-1:lenreal, 4, lenres ); + else + { + pp_rQuotes( expreal, sQuotes ); + pp_Stuff ( sQuotes, ptro, 2, 4, lenres ); + pp_Stuff ( expreal, ptro+1, lenreal, 0, lenres ); + rmlen = lenreal + 2; + } + break; + case '4': /* Blockify result marker */ + if ( !lenreal ) + pp_Stuff ( expreal, ptro, lenreal, 4, lenres ); + else if ( patttype == '1' ) /* list match marker */ + { + pp_Stuff ( "", ptro, 0, 4, lenres ); + lenres -= 4; + rmlen = 0; + do + { + ifou = md_strAt( ",", 1, expreal, FALSE, TRUE ); + lenitem = (ifou)? ifou-1:lenreal; + if( *expreal != '\0' ) + { + i = (ifou)? 5:4; + pp_Stuff ( "{||},", ptro, i, 0, lenres ); + pp_Stuff ( expreal, ptro+3, lenitem, 0, lenres+i ); + ptro += i + lenitem; + rmlen += i + lenitem; + } + expreal += ifou; + lenreal -= ifou; + } + while ( ifou > 0 ); + } + else + { + pp_Stuff ( "{||}", ptro, 4, 4, lenres ); + pp_Stuff ( expreal, ptro+3, lenreal, 0, lenres ); + rmlen = lenreal + 4; + } + break; + case '5': /* Logify result marker */ + rmlen = 3; + if ( !lenreal ) + { + pp_Stuff ( ".F.", ptro, 3, 4, lenres ); + } + else + pp_Stuff ( ".T.", ptro, 3, 4, lenres ); + break; + } + return rmlen - 4; } void pp_rQuotes( char *expreal, char *sQuotes ) { - int lQuote1 = 0, lQuote2 = 0; + int lQuote1 = 0, lQuote2 = 0; - while( *expreal != '\0' ) - { - if( *expreal == '\"' ) lQuote2 = 1; - else if( *expreal == '\'' ) lQuote1 = 1; - expreal++; - } - if( lQuote2 ) - { - if( lQuote1 ) - { - *sQuotes = '['; - *(sQuotes+1) = ']'; - } - else - { - *sQuotes = '\''; - *(sQuotes+1) = '\''; - } - } - else - { + HB_TRACE(("pp_rQuotes(%s, %s)", expreal, sQuotes)); + + while( *expreal != '\0' ) + { + if( *expreal == '\"' ) lQuote2 = 1; + else if( *expreal == '\'' ) lQuote1 = 1; + expreal++; + } + if( lQuote2 ) + { + if( lQuote1 ) + { + *sQuotes = '['; + *(sQuotes+1) = ']'; + } + else + { + *sQuotes = '\''; + *(sQuotes+1) = '\''; + } + } + else + { *sQuotes = '\"'; *(sQuotes+1) = '\"'; - } + } } int pp_RdStr(FILE* handl_i,char *buffer,int maxlen,int lDropSpaces,char* sBuffer, int* lenBuffer, int* iBuffer) { - int readed = 0; - int State = 0; - char cha,cLast='\0'; + int readed = 0; + int State = 0; + char cha,cLast='\0'; - if ( *lenBuffer == 0 ) return -1; - while(1) - { + HB_TRACE(("pp_RdStr(%p, %s, %d, %d, %s, %p, %p)", + handl_i, buffer, maxlen, lDropSpaces, + sBuffer, lenBuffer, iBuffer)); + + if ( *lenBuffer == 0 ) return -1; + while(1) + { if ( *iBuffer == *lenBuffer ) - { - if ( (*lenBuffer = fread(sBuffer,1,BUFF_SIZE,handl_i)) < 1 ) + { + if ( (*lenBuffer = fread(sBuffer,1,BUFF_SIZE,handl_i)) < 1 ) sBuffer[0] = '\n'; - *iBuffer = 0; - } + *iBuffer = 0; + } cha = sBuffer[*iBuffer]; (*iBuffer)++; if( cha == '\n' ) break; if ( maxlen > 0 ) - { - switch ( ParseState ) { - case STATE_COMMENT: + { + switch ( ParseState ) { + case STATE_COMMENT: if ( cha == '/' && cLast == '*' ) - { - ParseState = STATE_NORMAL; - cha = ' '; - } + { + ParseState = STATE_NORMAL; + cha = ' '; + } cLast = cha; break; - case STATE_QUOTE1: if(cha=='\'') ParseState = STATE_NORMAL; break; - case STATE_QUOTE2: if(cha=='\"') ParseState = STATE_NORMAL; break; - default: + case STATE_QUOTE1: if(cha=='\'') ParseState = STATE_NORMAL; break; + case STATE_QUOTE2: if(cha=='\"') ParseState = STATE_NORMAL; break; + default: switch ( cha ) { case '[': ParseState = STATE_BRACKET; break; case ']': ParseState = STATE_NORMAL; break; case '\"': - if( ParseState != STATE_BRACKET ) ParseState = STATE_QUOTE2; - break; + if( ParseState != STATE_BRACKET ) ParseState = STATE_QUOTE2; + break; case '\'': - if( ParseState != STATE_BRACKET ) ParseState = STATE_QUOTE1; - break; + if( ParseState != STATE_BRACKET ) ParseState = STATE_QUOTE1; + break; case '&': - if ( readed>0 && buffer[readed-1] == '&' ) { maxlen = 0; readed--; } - break; + if ( readed>0 && buffer[readed-1] == '&' ) { maxlen = 0; readed--; } + break; case '/': - if ( readed>0 && buffer[readed-1] == '/' ) { maxlen = 0; readed--; } - break; + if ( readed>0 && buffer[readed-1] == '/' ) { maxlen = 0; readed--; } + break; case '*': - if ( readed > 0 && buffer[readed-1] == '/' ) - { + if ( readed > 0 && buffer[readed-1] == '/' ) + { ParseState = STATE_COMMENT; readed--; - } - else if ( !State ) maxlen = readed = 0; - break; + } + else if ( !State ) maxlen = readed = 0; + break; } - } - if ( cha != ' ' && cha != '\t' ) State = 1; - if( lDropSpaces && State ) lDropSpaces = 0; - if( readed= 0 && ( buffer[readed] == ' ' || buffer[readed] == '\t') ); - readed++; - buffer[readed]='\0'; - return readed; + } + if ( cha != ' ' && cha != '\t' ) State = 1; + if( lDropSpaces && State ) lDropSpaces = 0; + if( readed= 0 && ( buffer[readed] == ' ' || buffer[readed] == '\t') ); + readed++; + buffer[readed]='\0'; + return readed; } int pp_WrStr(FILE* handl_o,char *buffer) { - int lens = strolen(buffer); - fwrite(buffer,lens,1,handl_o); - if ( *(buffer+lens-1) != '\n' ) - fwrite("\n",1,1,handl_o); - return 0; + int lens = strolen(buffer); + + HB_TRACE(("pp_WrStr(%p, %s)", handl_o, buffer)); + + fwrite(buffer,lens,1,handl_o); + if ( *(buffer+lens-1) != '\n' ) + fwrite("\n",1,1,handl_o); + return 0; } /* locates a substring in a string */ int pp_strAt(char *szSub, int lSubLen, char *szText, int lLen) { - if( lSubLen ) - { - if( lLen >= lSubLen ) - { - long lPos = 0, lSubPos = 0; + HB_TRACE(("pp_strAt(%s, %d, %s, %d)", + szSub, lSubLen, szText, lLen)); - while( lPos < lLen && lSubPos < lSubLen ) - { - if( *(szText + lPos) == *(szSub + lSubPos) ) - { - lSubPos++; - lPos++; - } - else if( lSubPos ) - lSubPos = 0; - else - lPos++; - } - return (lSubPos < lSubLen? 0: lPos - lSubLen + 1); - } + if( lSubLen ) + { + if( lLen >= lSubLen ) + { + long lPos = 0, lSubPos = 0; + + while( lPos < lLen && lSubPos < lSubLen ) + { + if( *(szText + lPos) == *(szSub + lSubPos) ) + { + lSubPos++; + lPos++; + } + else if( lSubPos ) + lSubPos = 0; + else + lPos++; + } + return (lSubPos < lSubLen? 0: lPos - lSubLen + 1); + } else - return 0; - } - else - return 1; + return 0; + } + else + return 1; } int md_strAt(char *szSub, int lSubLen, char *szText, int checkword, int checkPrth) { - int State = STATE_NORMAL; - long lPos = 0, lSubPos = 0; - int kolPrth = 0; + int State = STATE_NORMAL; + long lPos = 0, lSubPos = 0; + int kolPrth = 0; - while( *(szText+lPos) != '\0' && lSubPos < lSubLen ) - { - if( State == STATE_QUOTE1 ) - { - if ( *(szText+lPos) == '\'' ) - State = STATE_NORMAL; - lPos++; - } - else if( State == STATE_QUOTE2 ) - { - if ( *(szText+lPos) == '\"' ) - State = STATE_NORMAL; - lPos++; - } - else - { - if ( *(szText+lPos) == '\"' && ( lPos == 0 || *(szText+lPos-1) != '\\' ) ) - { - State = STATE_QUOTE2; - lPos++; - continue; - } - else if ( *(szText+lPos) == '\'' && ( lPos == 0 || *(szText+lPos-1) != '\\' ) ) - { - State = STATE_QUOTE1; - lPos++; - continue; - } - else if ( *(szText+lPos) == '(' ) - kolPrth++; - else if ( *(szText+lPos) == ')' ) - kolPrth--; - if( !lSubPos && checkPrth && ( (kolPrth > 1) || - (kolPrth == 1 && *(szText+lPos) != '(') || (kolPrth == 0 && *(szText+lPos) == ')')) ) - { - lPos++; - continue; - } + HB_TRACE(("md_strAt(%s, %d, %s, %d, %d)", + szSub, lSubLen, szText, checkword, checkPrth)); - if( toupper(*(szText + lPos)) == toupper(*(szSub + lSubPos)) ) - { - lSubPos++; - lPos++; - if ( lSubPos >= lSubLen && checkword && - ( ( ISNAME(*szSub) && lPos>lSubPos && ISNAME(*(szText+lPos-lSubPos-1)) ) || - ( ISNAME(*(szSub+lSubLen-1)) && ISNAME(*(szText+lPos)) ) ) ) - lSubPos = 0; - } - else if( lSubPos ) lSubPos = 0; - else lPos++; - } - } - return (lSubPos < lSubLen? 0: lPos - lSubLen + 1); + while( *(szText+lPos) != '\0' && lSubPos < lSubLen ) + { + if( State == STATE_QUOTE1 ) + { + if ( *(szText+lPos) == '\'' ) + State = STATE_NORMAL; + lPos++; + } + else if( State == STATE_QUOTE2 ) + { + if ( *(szText+lPos) == '\"' ) + State = STATE_NORMAL; + lPos++; + } + else + { + if ( *(szText+lPos) == '\"' && ( lPos == 0 || *(szText+lPos-1) != '\\' ) ) + { + State = STATE_QUOTE2; + lPos++; + continue; + } + else if ( *(szText+lPos) == '\'' && ( lPos == 0 || *(szText+lPos-1) != '\\' ) ) + { + State = STATE_QUOTE1; + lPos++; + continue; + } + else if ( *(szText+lPos) == '(' ) + kolPrth++; + else if ( *(szText+lPos) == ')' ) + kolPrth--; + if( !lSubPos && checkPrth && ( (kolPrth > 1) || + (kolPrth == 1 && *(szText+lPos) != '(') || (kolPrth == 0 && *(szText+lPos) == ')')) ) + { + lPos++; + continue; + } + + if( toupper(*(szText + lPos)) == toupper(*(szSub + lSubPos)) ) + { + lSubPos++; + lPos++; + if ( lSubPos >= lSubLen && checkword && + ( ( ISNAME(*szSub) && lPos>lSubPos && ISNAME(*(szText+lPos-lSubPos-1)) ) || + ( ISNAME(*(szSub+lSubLen-1)) && ISNAME(*(szText+lPos)) ) ) ) + lSubPos = 0; + } + else if( lSubPos ) lSubPos = 0; + else lPos++; + } + } + return (lSubPos < lSubLen? 0: lPos - lSubLen + 1); } int IsInStr ( char symb, char* s ) { - while ( *s != '\0' ) if ( *s++ == symb ) return 1; - return 0; + HB_TRACE(("IsInStr(%c, %s)", symb, s)); + + while ( *s != '\0' ) if ( *s++ == symb ) return 1; + return 0; } void pp_Stuff (char *ptri, char * ptro, int len1, int len2, int lenres ) { - char *ptr1, *ptr2; - int i; + char *ptr1, *ptr2; + int i; + + HB_TRACE(("pp_Stuff(%s, %s, %d, %d, %d)", + ptri, ptro, len1, len2, lenres)); + if ( len1 > len2 ) - { - ptr1 = ptro+lenres; - ptr2 = ptro + lenres + len1 - len2; - for ( ; ptr1 >= ptro; ptr1--,ptr2-- ) *ptr2 = *ptr1; - } + { + ptr1 = ptro+lenres; + ptr2 = ptro + lenres + len1 - len2; + for ( ; ptr1 >= ptro; ptr1--,ptr2-- ) *ptr2 = *ptr1; + } else - { - ptr1 = ptro + len2; - ptr2 = ptro + len1; - for ( ; ptr1 <= ptro+lenres; ptr1++,ptr2++ ) *ptr2 = *ptr1; - } + { + ptr1 = ptro + len2; + ptr2 = ptro + len1; + for ( ; ptr1 <= ptro+lenres; ptr1++,ptr2++ ) *ptr2 = *ptr1; + } ptr2 = ptro; for ( i=0; i < len1; i++ ) *ptr2++ = *(ptri+i); } int strocpy (char* ptro, char* ptri ) { - int lens = 0; - if ( ptri != NULL ) - while ( *ptri != '\0' ) - { - *ptro++ = *ptri++; - lens++; - } - *ptro = '\0'; - return lens; + int lens = 0; + + HB_TRACE(("strocpy(%s, %s)", ptro, ptri)); + + if ( ptri != NULL ) + while ( *ptri != '\0' ) + { + *ptro++ = *ptri++; + lens++; + } + *ptro = '\0'; + return lens; } int stroncpy (char* ptro, char* ptri, int lens ) { - int i = 0; - for ( ; i < lens; i++ ) *(ptro+i) = *ptri++; - i--; - while ( i > 0 && *(ptro+i) == ' ' ) i--; - i++; - *(ptro+i) = '\0'; - return i; + int i = 0; + + HB_TRACE(("stroncpy(%s, %s, %d)", ptro, ptri, lens)); + + for ( ; i < lens; i++ ) *(ptro+i) = *ptri++; + i--; + while ( i > 0 && *(ptro+i) == ' ' ) i--; + i++; + *(ptro+i) = '\0'; + return i; } int truncmp (char** ptro, char** ptri, int lTrunc ) { - char *ptrb = *ptro, co, ci; + char *ptrb = *ptro, co, ci; - for ( ; **ptri != ' ' && **ptri != '\t' && **ptri != ',' && **ptri != '[' && **ptri != ']' && - **ptri != '\1' && **ptri != '\0' && toupper(**ptri)==toupper(**ptro); - (*ptro)++, (*ptri)++ ); - co = *(*ptro-1); - ci = **ptri; - if ( ( ( ci == ' ' || ci == ',' || ci == '[' || - ci == ']' || ci == '\1' || ci == '\0' ) && - ( ( !ISNAME(**ptro) && ISNAME(co) ) || - ( !ISNAME(co) ) ) ) ) - return 0; - else if ( lTrunc && *ptro-ptrb >= 4 && ISNAME(ci) && !ISNAME(**ptro) && ISNAME(co) ) - { + HB_TRACE(("truncmp(%p, %p, %d)", ptro, ptri, lTrunc)); + + for ( ; **ptri != ' ' && **ptri != '\t' && **ptri != ',' && **ptri != '[' && **ptri != ']' && + **ptri != '\1' && **ptri != '\0' && toupper(**ptri)==toupper(**ptro); + (*ptro)++, (*ptri)++ ); + co = *(*ptro-1); + ci = **ptri; + if ( ( ( ci == ' ' || ci == ',' || ci == '[' || + ci == ']' || ci == '\1' || ci == '\0' ) && + ( ( !ISNAME(**ptro) && ISNAME(co) ) || + ( !ISNAME(co) ) ) ) ) + return 0; + else if ( lTrunc && *ptro-ptrb >= 4 && ISNAME(ci) && !ISNAME(**ptro) && ISNAME(co) ) + { while( ISNAME(**ptri) ) (*ptri)++; return 0; - } - return 1; + } + return 1; } int strincmp (char* ptro, char** ptri, int lTrunc ) { - char *ptrb = ptro, co, ci; + char *ptrb = ptro, co, ci; - for ( ; **ptri != ',' && **ptri != '[' && **ptri != ']' && - **ptri != '\1' && **ptri != '\0' && toupper(**ptri)==toupper(*ptro); - ptro++, (*ptri)++ ); - co = *(ptro-1); - ci = **ptri; - if ( ( ( ci == ' ' || ci == ',' || ci == '[' || - ci == ']' || ci == '\1' || ci == '\0' ) && - ( ( !ISNAME(*ptro) && ISNAME(co) ) || - ( !ISNAME(co) ) ) ) ) + HB_TRACE(("strincmp(%s, %p)", ptro, ptri)); + + for ( ; **ptri != ',' && **ptri != '[' && **ptri != ']' && + **ptri != '\1' && **ptri != '\0' && toupper(**ptri)==toupper(*ptro); + ptro++, (*ptri)++ ); + co = *(ptro-1); + ci = **ptri; + if ( ( ( ci == ' ' || ci == ',' || ci == '[' || + ci == ']' || ci == '\1' || ci == '\0' ) && + ( ( !ISNAME(*ptro) && ISNAME(co) ) || + ( !ISNAME(co) ) ) ) ) + return 0; + else if ( lTrunc && ptro-ptrb >= 4 && ISNAME(ci) && !ISNAME(*ptro) && ISNAME(co) ) + { + // while( ISNAME(**ptri) ) (*ptri)++; return 0; - else if ( lTrunc && ptro-ptrb >= 4 && ISNAME(ci) && !ISNAME(*ptro) && ISNAME(co) ) - { -// while( ISNAME(**ptri) ) (*ptri)++; - return 0; - } - return 1; + } + return 1; } int strincpy (char* ptro, char* ptri ) { - int lens = 0; - for ( ; *ptri != ' ' && *ptri != ',' && *ptri != '[' && *ptri != ']' && - *ptri != '\1' && *ptri != '\0'; ptro++, ptri++, lens++ ) - *ptro = *ptri; - return lens; + int lens = 0; + + HB_TRACE(("strincpy(%s, %s)", ptro, ptri)); + + for ( ; *ptri != ' ' && *ptri != ',' && *ptri != '[' && *ptri != ']' && + *ptri != '\1' && *ptri != '\0'; ptro++, ptri++, lens++ ) + *ptro = *ptri; + return lens; } char* strodup ( char *stroka ) { - char *ptr; - int lens = 0; + char *ptr; + int lens = 0; + + HB_TRACE(("strodup(%s)", stroka)); + while ( *(stroka+lens) != '\0' ) lens++; ptr = ( char * ) hb_xgrab( lens + 1 ); memcpy( ptr, stroka, lens+1 ); @@ -1994,116 +2099,132 @@ char* strodup ( char *stroka ) int strolen ( char *stroka ) { - int lens = 0; + int lens = 0; + + HB_TRACE(("strolen(%s)", stroka)); + while ( *(stroka+lens) != '\0' ) lens++; return lens; } void stroupper ( char *stroka ) { + HB_TRACE(("stroupper(%s)", stroka)); + while ( *stroka != '\0' ) - { - *stroka = toupper(*stroka); - stroka++; - } + { + *stroka = toupper(*stroka); + stroka++; + } } int strotrim ( char *stroka ) { - char *ptr = stroka, lastc = '0', curc; - int lens = 0, State = STATE_NORMAL; - while ( ( curc = *stroka ) != '\0' ) - { - if ( State == STATE_QUOTE1 ) { if (curc == '\'') State = STATE_NORMAL; } - else if ( State == STATE_QUOTE2 ) { if (curc=='\"') State = STATE_NORMAL; } - else - { - if ( curc == '\'' ) State = STATE_QUOTE1; - else if ( curc == '\"' ) State = STATE_QUOTE2; - else if ( curc == '\t' ) curc = ' '; - } - if ( State != STATE_NORMAL || curc != ' ' || - ( curc==' ' && lastc != ' ' && lastc != ',' && lastc != '(' && *(stroka+1)!=',') ) - { - *ptr++ = curc; - lastc = curc; - lens++; - } - stroka++; - } - *ptr = '\0'; - return lens; + char *ptr = stroka, lastc = '0', curc; + int lens = 0, State = STATE_NORMAL; + + HB_TRACE(("strotrim(%s)", stroka)); + + while ( ( curc = *stroka ) != '\0' ) + { + if ( State == STATE_QUOTE1 ) { if (curc == '\'') State = STATE_NORMAL; } + else if ( State == STATE_QUOTE2 ) { if (curc=='\"') State = STATE_NORMAL; } + else + { + if ( curc == '\'' ) State = STATE_QUOTE1; + else if ( curc == '\"' ) State = STATE_QUOTE2; + else if ( curc == '\t' ) curc = ' '; + } + if ( State != STATE_NORMAL || curc != ' ' || + ( curc==' ' && lastc != ' ' && lastc != ',' && lastc != '(' && *(stroka+1)!=',') ) + { + *ptr++ = curc; + lastc = curc; + lens++; + } + stroka++; + } + *ptr = '\0'; + return lens; } int NextWord ( char** sSource, char* sDest, int lLower ) { - int i = 0; - SKIPTABSPACES( (*sSource) ); - while ( **sSource != '\0' && **sSource != ' ' && **sSource != '\t' && **sSource != '(') - { - *sDest++ = (lLower)? tolower(**sSource):**sSource; - (*sSource)++; - i++; - } - *sDest = '\0'; - return i; + int i = 0; + + HB_TRACE(("NextWord(%p, %s, %d)", sSource, sDest, lLower)); + + SKIPTABSPACES( (*sSource) ); + while ( **sSource != '\0' && **sSource != ' ' && **sSource != '\t' && **sSource != '(') + { + *sDest++ = (lLower)? tolower(**sSource):**sSource; + (*sSource)++; + i++; + } + *sDest = '\0'; + return i; } int NextName ( char** sSource, char* sDest ) { - int lenName = 0, State = STATE_NORMAL; - while ( **sSource != '\0' && ( !ISNAME(**sSource) || State != STATE_NORMAL ) ) - { - if ( State == STATE_QUOTE1 ) - { if ( **sSource == '\'' ) State = STATE_NORMAL; } - else if ( State == STATE_QUOTE2 ) - { if ( **sSource == '\"' ) State = STATE_NORMAL; } - else if ( **sSource == '\"' ) State = STATE_QUOTE2; - else if ( **sSource == '\'' ) State = STATE_QUOTE1; + int lenName = 0, State = STATE_NORMAL; - (*sSource)++; - } + HB_TRACE(("NextName(%p, %s)", sSource, sDest)); - while ( **sSource != '\0' && ISNAME(**sSource) ) - { - *sDest++ = *(*sSource)++; - lenName++; - } - *sDest = '\0'; - return lenName; + while ( **sSource != '\0' && ( !ISNAME(**sSource) || State != STATE_NORMAL ) ) + { + if ( State == STATE_QUOTE1 ) + { if ( **sSource == '\'' ) State = STATE_NORMAL; } + else if ( State == STATE_QUOTE2 ) + { if ( **sSource == '\"' ) State = STATE_NORMAL; } + else if ( **sSource == '\"' ) State = STATE_QUOTE2; + else if ( **sSource == '\'' ) State = STATE_QUOTE1; + + (*sSource)++; + } + + while ( **sSource != '\0' && ISNAME(**sSource) ) + { + *sDest++ = *(*sSource)++; + lenName++; + } + *sDest = '\0'; + return lenName; } int NextParm ( char** sSource, char* sDest ) { - int lenName = 0, State = STATE_NORMAL, StBr = 0; + int lenName = 0, State = STATE_NORMAL, StBr = 0; - SKIPTABSPACES( (*sSource) ); - while ( **sSource != '\0' ) - { - if ( State == STATE_QUOTE1 ) - { - if ( **sSource == '\'' ) State = STATE_NORMAL; - } - else if ( State == STATE_QUOTE2 ) - { - if ( **sSource == '\"' ) State = STATE_NORMAL; - } - else if ( **sSource == '\"' ) State = STATE_QUOTE2; - else if ( **sSource == '\'' ) State = STATE_QUOTE1; - else if ( **sSource == '(' ) StBr++; - else if ( **sSource == ')' || **sSource == ',' ) - { - if( !StBr ) break; - if( **sSource == ')' ) StBr--; - } + HB_TRACE(("NextParm(%p, %s)", sSource, sDest)); - if ( sDest != NULL ) *sDest++ = **sSource; - (*sSource)++; - lenName++; - } + SKIPTABSPACES( (*sSource) ); + while ( **sSource != '\0' ) + { + if ( State == STATE_QUOTE1 ) + { + if ( **sSource == '\'' ) State = STATE_NORMAL; + } + else if ( State == STATE_QUOTE2 ) + { + if ( **sSource == '\"' ) State = STATE_NORMAL; + } + else if ( **sSource == '\"' ) State = STATE_QUOTE2; + else if ( **sSource == '\'' ) State = STATE_QUOTE1; + else if ( **sSource == '(' ) StBr++; + else if ( **sSource == ')' || **sSource == ',' ) + { + if( !StBr ) break; + if( **sSource == ')' ) StBr--; + } - if ( sDest != NULL ) *sDest = '\0'; - return lenName; + if ( sDest != NULL ) *sDest++ = **sSource; + (*sSource)++; + lenName++; + } + + if ( sDest != NULL ) *sDest = '\0'; + return lenName; } BOOL OpenInclude( char * szFileName, PATHNAMES *pSearch, FILE** fptr, BOOL bStandardOnly ) @@ -2111,33 +2232,36 @@ BOOL OpenInclude( char * szFileName, PATHNAMES *pSearch, FILE** fptr, BOOL bStan PHB_FNAME pFileName; char szFName[ _POSIX_PATH_MAX ]; /* filename to parse */ - if ( bStandardOnly ) - { - *fptr = 0; - } - else - { - pFileName = hb_fsFNameSplit( szFileName ); - pFileName->szPath = _pFileName->szPath; - hb_fsFNameMerge( szFName, pFileName ); - *fptr = fopen( szFName, "r" ); - hb_xfree( pFileName ); - } + HB_TRACE(("OpenInclude(%s, %p, %p, %d)", + szFileName, pSearch, fptr, (int) bStandardOnly)); - if ( !*fptr && pSearch ) - { - pFileName = hb_fsFNameSplit( szFileName ); - pFileName->szName = szFileName; - pFileName->szExtension = NULL; - while ( pSearch && !*fptr ) + if ( bStandardOnly ) { - pFileName->szPath = pSearch->szPath; + *fptr = 0; + } + else + { + pFileName = hb_fsFNameSplit( szFileName ); + pFileName->szPath = _pFileName->szPath; hb_fsFNameMerge( szFName, pFileName ); *fptr = fopen( szFName, "r" ); - pSearch = pSearch->pNext; + hb_xfree( pFileName ); + } + + if ( !*fptr && pSearch ) + { + pFileName = hb_fsFNameSplit( szFileName ); + pFileName->szName = szFileName; + pFileName->szExtension = NULL; + while ( pSearch && !*fptr ) + { + pFileName->szPath = pSearch->szPath; + hb_fsFNameMerge( szFName, pFileName ); + *fptr = fopen( szFName, "r" ); + pSearch = pSearch->pNext; + } + hb_xfree( pFileName ); } - hb_xfree( pFileName ); - } return ( *fptr ? TRUE : FALSE ); } diff --git a/harbour/source/pp/hbppint.c b/harbour/source/pp/hbppint.c index db6824007c..b24ebb9fef 100644 --- a/harbour/source/pp/hbppint.c +++ b/harbour/source/pp/hbppint.c @@ -34,14 +34,14 @@ */ #if ( defined(_MSC_VER) || defined(__IBMCPP__) || defined(__MINW32__) ) - #include - #include +#include +#include #elif ( defined(__GNUC__) || defined(__WATCOMC__) ) - #include - #include +#include +#include #else - #include - #include +#include +#include #endif #include #include "hbpp.h" @@ -58,129 +58,137 @@ FILE * yyppo; void Hbpp_init( void ) { - lenBuffer = 10; - iBuffer = 10; - aCondCompile = ( int * ) hb_xgrab( sizeof( int ) * 5 ); + HB_TRACE(("Hbpp_init()")); + + lenBuffer = 10; + iBuffer = 10; + aCondCompile = ( int * ) hb_xgrab( sizeof( int ) * 5 ); } int PreProcess( FILE * handl_i, FILE * handl_o, char * sOut ) { - static char sBuffer[ BUFF_SIZE ]; /* File read buffer */ - char *ptr, *ptrOut = sOut; - int lContinue = 0; - int lens = 0, rdlen; - int rezParse; + static char sBuffer[ BUFF_SIZE ]; /* File read buffer */ + char *ptr, *ptrOut = sOut; + int lContinue = 0; + int lens = 0, rdlen; + int rezParse; - HB_SYMBOL_UNUSED( handl_o ); + HB_TRACE(("PreProcess(%p, %p, %s)", + handl_i, handl_o, sOut)); - while( ( rdlen = pp_RdStr( handl_i, sLine + lens, STR_SIZE - lens, lContinue, - sBuffer, &lenBuffer, &iBuffer ) ) >= 0 ) - { + HB_SYMBOL_UNUSED( handl_o ); + + while( ( rdlen = pp_RdStr( handl_i, sLine + lens, STR_SIZE - lens, lContinue, + sBuffer, &lenBuffer, &iBuffer ) ) >= 0 ) + { if( ! lInclude ) - nline++; + nline++; lens += rdlen; if( sLine[ lens - 1 ] == ';' ) - { - lContinue = 1; - lens--; - lens--; - while( sLine[ lens ] == ' ' || sLine[ lens ] == '\t' ) lens--; - sLine[ ++lens ] = ' '; - sLine[ ++lens ] = '\0'; + { + lContinue = 1; + lens--; + lens--; + while( sLine[ lens ] == ' ' || sLine[ lens ] == '\t' ) lens--; + sLine[ ++lens ] = ' '; + sLine[ ++lens ] = '\0'; - *ptrOut++ = '\n'; - } + *ptrOut++ = '\n'; + } else - { - lContinue = 0; - lens = 0; - } + { + lContinue = 0; + lens = 0; + } if( !lContinue ) - { - if( *sLine != '\0' ) - { - ptr = sLine; - SKIPTABSPACES( ptr ); - if( *ptr == '#' ) - { - if( ( rezParse = ParseDirective( ptr + 1 ) ) == 0 ) - *sLine = '\0'; - } - else - { - if( nCondCompile == 0 || aCondCompile[ nCondCompile - 1 ] ) - { - if( ( rezParse = ParseExpression( ptr, sOutLine ) ) > 0 ) - { - printf( "\nError number %u in line %u\n", rezParse, nline ); - } - } - else - *sLine = '\0'; - } - } - break; - } - } - if( rdlen < 0 ) return 0; + { + if( *sLine != '\0' ) + { + ptr = sLine; + SKIPTABSPACES( ptr ); + if( *ptr == '#' ) + { + if( ( rezParse = ParseDirective( ptr + 1 ) ) == 0 ) + *sLine = '\0'; + } + else + { + if( nCondCompile == 0 || aCondCompile[ nCondCompile - 1 ] ) + { + if( ( rezParse = ParseExpression( ptr, sOutLine ) ) > 0 ) + { + printf( "\nError number %u in line %u\n", rezParse, nline ); + } + } + else + *sLine = '\0'; + } + } + break; + } + } + if( rdlen < 0 ) return 0; - lens = strocpy( ptrOut, sLine ) + ( ptrOut - sOut ); - *( sOut + lens++ ) = '\n'; - *( sOut + lens ) = '\0'; + lens = strocpy( ptrOut, sLine ) + ( ptrOut - sOut ); + *( sOut + lens++ ) = '\n'; + *( sOut + lens ) = '\0'; - if( _bPPO ) - pp_WrStr( handl_o, sOut ); + if( _bPPO ) + pp_WrStr( handl_o, sOut ); - return lens; + return lens; } int Hp_Parse( FILE * handl_i, FILE * handl_o ) { - char * sBuffer = ( char * ) hb_xgrab( BUFF_SIZE ); /* File read buffer */ - char * ptr; - int lContinue = 0; - int iBuffer = 10, lenBuffer = 10; - int lens = 0, rdlen; - while( ( rdlen = pp_RdStr( handl_i, sLine + lens, STR_SIZE - lens, lContinue, - sBuffer, &lenBuffer, &iBuffer ) ) >= 0 ) - { + char * sBuffer = ( char * ) hb_xgrab( BUFF_SIZE ); /* File read buffer */ + char * ptr; + int lContinue = 0; + int iBuffer = 10, lenBuffer = 10; + int lens = 0, rdlen; + + HB_TRACE(("Hp_Parse(%p, %p)", handl_i, handl_o)); + + while( ( rdlen = pp_RdStr( handl_i, sLine + lens, STR_SIZE - lens, lContinue, + sBuffer, &lenBuffer, &iBuffer ) ) >= 0 ) + { lens += rdlen; if( sLine[ lens - 1 ] == ';' ) - { - lContinue = 1; - lens--; - lens--; - while( sLine[ lens ] == ' ' || sLine[ lens ] == '\t' ) lens--; - sLine[ ++lens ] = ' '; - sLine[ ++lens ] = '\0'; - } + { + lContinue = 1; + lens--; + lens--; + while( sLine[ lens ] == ' ' || sLine[ lens ] == '\t' ) lens--; + sLine[ ++lens ] = ' '; + sLine[ ++lens ] = '\0'; + } else - { - lContinue = 0; - lens = 0; - } + { + lContinue = 0; + lens = 0; + } if( !lContinue ) - { - if( *sLine != '\0' ) - { - ptr = sLine; - SKIPTABSPACES( ptr ); - if( *ptr == '#' ) - { - ParseDirective( ptr + 1 ); - *sLine = '\0'; - } - else - GenWarning( _szPWarnings, 'I', WARN_NONDIRECTIVE, NULL, NULL ); - } - } - } + { + if( *sLine != '\0' ) + { + ptr = sLine; + SKIPTABSPACES( ptr ); + if( *ptr == '#' ) + { + ParseDirective( ptr + 1 ); + *sLine = '\0'; + } + else + GenWarning( _szPWarnings, 'I', WARN_NONDIRECTIVE, NULL, NULL ); + } + } + } - hb_xfree( sBuffer ); + hb_xfree( sBuffer ); - return 0; + return 0; } diff --git a/harbour/source/pp/hbpplib.c b/harbour/source/pp/hbpplib.c index 4064d249d6..291b811a23 100644 --- a/harbour/source/pp/hbpplib.c +++ b/harbour/source/pp/hbpplib.c @@ -54,8 +54,8 @@ jmp_buf s_env; */ HARBOUR HB___PREPROCESS( void ) { - if( ISCHAR( 1 ) ) - { + if( ISCHAR( 1 ) ) + { char * pText = ( char * ) hb_xgrab( STR_SIZE ); char * pOut = ( char * ) hb_xgrab( STR_SIZE ); char * ptr = pText; @@ -70,51 +70,57 @@ HARBOUR HB___PREPROCESS( void ) SKIPTABSPACES( ptr ); if( setjmp( s_env ) == 0 ) - { - int resParse; + { + int resParse; - if( ( resParse = ParseExpression( ptr, pOut ) ) > 0 ) - { - /* Some error here? */ - } - hb_retc( pText ); /* Preprocessor returns parsed line in input buffer */ - } + if( ( resParse = ParseExpression( ptr, pOut ) ) > 0 ) + { + /* Some error here? */ + } + hb_retc( pText ); /* Preprocessor returns parsed line in input buffer */ + } else - { - /* an error occured during parsing. - * The longjmp was used in GenError() - */ - hb_retc( "ERROR" ); - } + { + /* an error occured during parsing. + * The longjmp was used in GenError() + */ + hb_retc( "ERROR" ); + } hb_xfree( pText ); hb_xfree( pOut ); - } - else - hb_retc( "" ); + } + else + hb_retc( "" ); } void GenError( char * _szErrors[], char cPrefix, int iError, char * szError1, char * szError2 ) { - /* TODO: The internal buffers allocated by the preprocessor should be - * deallocated here - */ - printf( "Error %c%i ", cPrefix, iError ); - printf( _szErrors[ iError - 1 ], szError1, szError2 ); - printf( hb_consoleGetNewLine() ); - printf( hb_consoleGetNewLine() ); + HB_TRACE(("GenError(%p, %c, %d, %s, %s)", + _szErrors, cPrefix, iError, szError1, szError2)); - longjmp( s_env, iError ); + /* TODO: The internal buffers allocated by the preprocessor should be + * deallocated here + */ + printf( "Error %c%i ", cPrefix, iError ); + printf( _szErrors[ iError - 1 ], szError1, szError2 ); + printf( hb_consoleGetNewLine() ); + printf( hb_consoleGetNewLine() ); + + longjmp( s_env, iError ); } void GenWarning( char* _szWarnings[], char cPrefix, int iWarning, char * szWarning1, char * szWarning2) { - /* NOTE: - * All warnings are simply ignored - */ - HB_SYMBOL_UNUSED( _szWarnings ); - HB_SYMBOL_UNUSED( cPrefix ); - HB_SYMBOL_UNUSED( iWarning ); - HB_SYMBOL_UNUSED( szWarning1 ); - HB_SYMBOL_UNUSED( szWarning2 ); + HB_TRACE(("GenWarning(%p, %c, %d, %s, %s)", + _szWarnings, cPrefix, iWarning, szWarning1, szWarning2)); + + /* NOTE: + * All warnings are simply ignored + */ + HB_SYMBOL_UNUSED( _szWarnings ); + HB_SYMBOL_UNUSED( cPrefix ); + HB_SYMBOL_UNUSED( iWarning ); + HB_SYMBOL_UNUSED( szWarning1 ); + HB_SYMBOL_UNUSED( szWarning2 ); } diff --git a/harbour/source/pp/stdalone/Makefile b/harbour/source/pp/stdalone/Makefile index 57c23a585d..a9c71d0f89 100644 --- a/harbour/source/pp/stdalone/Makefile +++ b/harbour/source/pp/stdalone/Makefile @@ -10,5 +10,6 @@ C_MAIN=hbpp.c LIBS=\ pp \ + common \ include $(TOP)$(ROOT)config/bin.cf diff --git a/harbour/source/pp/stdalone/hbpp.c b/harbour/source/pp/stdalone/hbpp.c index 7847160442..3c60bf25f9 100644 --- a/harbour/source/pp/stdalone/hbpp.c +++ b/harbour/source/pp/stdalone/hbpp.c @@ -35,13 +35,13 @@ #include #if ( defined(_MSC_VER) || defined(__IBMCPP__) || defined(__MINGW32__) ) - #include +#include #elif defined(__GNUC__) - #include +#include #elif ! defined(__MPW__) - #include +#include #else - #include +#include #endif #include #include @@ -65,90 +65,92 @@ int _iWarnings = 0; int main( int argc, char * argv[] ) { - FILE * handl_i; - FILE * handl_o; - char szFileName[ _POSIX_PATH_MAX ]; - char * szDefText; - int iArg = 1, i; - BOOL bOutTable = FALSE; - BOOL bOutNew = FALSE; - DEFINES * stdef = topDefine; - COMMANDS * stcmd = topCommand; + FILE * handl_i; + FILE * handl_o; + char szFileName[ _POSIX_PATH_MAX ]; + char * szDefText; + int iArg = 1, i; + BOOL bOutTable = FALSE; + BOOL bOutNew = FALSE; + DEFINES * stdef = topDefine; + COMMANDS * stcmd = topCommand; - printf( "Harbour Preprocessor, Build %i%s (%04d.%02d.%02d)\n", - hb_build, hb_revision, hb_year, hb_month, hb_day ); - printf( "Copyright 1999, http://www.harbour-project.org\n" ); + HB_TRACE(("main(%d, %p)", argc, argv)); - while( iArg < argc ) - { + printf( "Harbour Preprocessor, Build %i%s (%04d.%02d.%02d)\n", + hb_build, hb_revision, hb_year, hb_month, hb_day ); + printf( "Copyright 1999, http://www.harbour-project.org\n" ); + + while( iArg < argc ) + { if( IS_OPT_SEP(argv[ iArg ][ 0 ])) - { - switch( argv[ iArg ][ 1 ] ) - { + { + switch( argv[ iArg ][ 1 ] ) + { case 'd': case 'D': /* defines a #define from the command line */ - { - i = 0; - szDefText = strodup( argv[ iArg ] + 2 ); - while( i < strolen( szDefText ) && szDefText[ i ] != '=' ) - i++; - if( szDefText[ i ] != '=' ) - AddDefine( szDefText, 0 ); - else + { + i = 0; + szDefText = strodup( argv[ iArg ] + 2 ); + while( i < strolen( szDefText ) && szDefText[ i ] != '=' ) + i++; + if( szDefText[ i ] != '=' ) + AddDefine( szDefText, 0 ); + else { - szDefText[ i ] = 0; - AddDefine( szDefText, szDefText + i + 1 ); + szDefText[ i ] = 0; + AddDefine( szDefText, szDefText + i + 1 ); } - free( szDefText ); - } - break; + free( szDefText ); + } + break; case 'i': case 'I': - AddSearchPath( argv[ iArg ]+2, &_pIncludePath ); - break; + AddSearchPath( argv[ iArg ]+2, &_pIncludePath ); + break; case 'o': case 'O': - bOutTable = TRUE; - break; + bOutTable = TRUE; + break; case 'n': case 'N': - bOutNew = TRUE; - break; + bOutNew = TRUE; + break; case 'w': case 'W': - _iWarnings = 1; - if( argv[ iArg ][ 2 ] ) - { /*there is -w<0,1,2,3> probably */ + _iWarnings = 1; + if( argv[ iArg ][ 2 ] ) + { /*there is -w<0,1,2,3> probably */ _iWarnings = argv[ iArg ][ 2 ] - '0'; if( _iWarnings < 0 || _iWarnings > 3 ) - printf( "\nInvalid command line option: %s\n", argv[ iArg ] ); - } - break; + printf( "\nInvalid command line option: %s\n", argv[ iArg ] ); + } + break; default: - printf( "\nInvalid command line option: %s\n", &argv[ iArg ][ 1 ] ); - break; - } - } + printf( "\nInvalid command line option: %s\n", &argv[ iArg ][ 1 ] ); + break; + } + } else _pFileName = hb_fsFNameSplit( argv[ iArg ] ); iArg++; - } - if( _pFileName ) - { + } + if( _pFileName ) + { if( ! _pFileName->szExtension ) - _pFileName->szExtension =".prg"; + _pFileName->szExtension =".prg"; hb_fsFNameMerge( szFileName, _pFileName ); if( ( handl_i = fopen( szFileName, "r" ) ) == NULL ) - { - printf("\nCan't open %s\n", szFileName ); - return 1; - } + { + printf("\nCan't open %s\n", szFileName ); + return 1; + } printf( "\nParsing file %s\n", szFileName ); - } - else - { + } + else + { printf( "\nSyntax: %s [options]" "\n" "\nOptions: /d[=] #define " @@ -160,265 +162,269 @@ int main( int argc, char * argv[] ) , argv[ 0 ] ); if( bOutTable ) - OutTable( NULL, NULL ); + OutTable( NULL, NULL ); return 1; - } + } - _pFileName->szExtension = ".ppo"; - hb_fsFNameMerge( szFileName, _pFileName ); + _pFileName->szExtension = ".ppo"; + hb_fsFNameMerge( szFileName, _pFileName ); - if( ( handl_o = fopen( szFileName, "wt" ) ) == NULL ) - { + if( ( handl_o = fopen( szFileName, "wt" ) ) == NULL ) + { printf("\nCan't open %s\n", szFileName ); return 1; - } + } - { - char * szInclude = getenv( "INCLUDE" ); + { + char * szInclude = getenv( "INCLUDE" ); - if( szInclude ) + if( szInclude ) { - char * pPath; - char * pDelim; + char * pPath; + char * pDelim; - pPath = szInclude = strodup( szInclude ); - while( ( pDelim = strchr( pPath, OS_PATH_LIST_SEPARATOR ) ) != NULL ) - { + pPath = szInclude = strodup( szInclude ); + while( ( pDelim = strchr( pPath, OS_PATH_LIST_SEPARATOR ) ) != NULL ) + { *pDelim = '\0'; AddSearchPath( pPath, &_pIncludePath ); pPath = pDelim + 1; - } - AddSearchPath( pPath, &_pIncludePath ); + } + AddSearchPath( pPath, &_pIncludePath ); } - } + } - aCondCompile = ( int * ) hb_xgrab( sizeof( int ) * 5 ); + aCondCompile = ( int * ) hb_xgrab( sizeof( int ) * 5 ); - Hp_Parse( handl_i, handl_o ); - fclose( handl_i ); - fclose( handl_o ); + Hp_Parse( handl_i, handl_o ); + fclose( handl_i ); + fclose( handl_o ); - if( bOutTable ) - OutTable( NULL, NULL ); - else if( bOutNew ) - OutTable( stdef, stcmd ); + if( bOutTable ) + OutTable( NULL, NULL ); + else if( bOutNew ) + OutTable( stdef, stcmd ); - printf( "\nOk" ); + printf( "\nOk" ); - return 0; + return 0; } int Hp_Parse( FILE * handl_i, FILE * handl_o ) { - char sBuffer[ BUFF_SIZE ]; /* File read buffer */ - char * ptr; - int lContinue = 0; - int iBuffer = 10, lenBuffer = 10; - int lens = 0, rdlen; + char sBuffer[ BUFF_SIZE ]; /* File read buffer */ + char * ptr; + int lContinue = 0; + int iBuffer = 10, lenBuffer = 10; + int lens = 0, rdlen; - while( ( rdlen = pp_RdStr( handl_i, sLine + lens, STR_SIZE - lens, lContinue, - sBuffer, &lenBuffer, &iBuffer ) ) >= 0 ) - { + HB_TRACE(("Hp_parse(%p, %p)", handl_i, handl_o)); + + while( ( rdlen = pp_RdStr( handl_i, sLine + lens, STR_SIZE - lens, lContinue, + sBuffer, &lenBuffer, &iBuffer ) ) >= 0 ) + { if( ! lInclude ) nline++; lens += rdlen; if( sLine[ lens - 1 ] == ';' ) - { - lContinue = 1; - lens--; - lens--; - while( sLine[ lens ] == ' ' || sLine[ lens ] == '\t' ) lens--; - sLine[ ++lens ] = ' '; - sLine[ ++lens ] = '\0'; - } + { + lContinue = 1; + lens--; + lens--; + while( sLine[ lens ] == ' ' || sLine[ lens ] == '\t' ) lens--; + sLine[ ++lens ] = ' '; + sLine[ ++lens ] = '\0'; + } else - { - lContinue = 0; - lens = 0; - } + { + lContinue = 0; + lens = 0; + } if( *sLine != '\0' && !lContinue ) - { - printf( "\r line %i", nline ); - ptr = sLine; - SKIPTABSPACES( ptr ); - if( *ptr == '#' ) - { - if( ParseDirective( ptr + 1 ) == 0 ) - *sLine = '\0'; - } - else - { - if( nCondCompile == 0 || aCondCompile[ nCondCompile - 1 ] ) - ParseExpression( ptr, sOutLine ); - else - *sLine = '\0'; - } - } + { + printf( "\r line %i", nline ); + ptr = sLine; + SKIPTABSPACES( ptr ); + if( *ptr == '#' ) + { + if( ParseDirective( ptr + 1 ) == 0 ) + *sLine = '\0'; + } + else + { + if( nCondCompile == 0 || aCondCompile[ nCondCompile - 1 ] ) + ParseExpression( ptr, sOutLine ); + else + *sLine = '\0'; + } + } if( ! lInclude ) - { - if( lContinue ) pp_WrStr( handl_o, "\n" ); - else pp_WrStr( handl_o, sLine ); - } - } + { + if( lContinue ) pp_WrStr( handl_o, "\n" ); + else pp_WrStr( handl_o, sLine ); + } + } - return 0; + return 0; } void OutTable( DEFINES * endDefine, COMMANDS * endCommand ) { - FILE *handl_o; - int ipos, len_mpatt, len_value; - int num; - DEFINES * stdef1 = topDefine, * stdef2 = NULL, * stdef3; - COMMANDS * stcmd1 = topCommand, * stcmd2 = NULL, * stcmd3; + FILE *handl_o; + int ipos, len_mpatt, len_value; + int num; + DEFINES * stdef1 = topDefine, * stdef2 = NULL, * stdef3; + COMMANDS * stcmd1 = topCommand, * stcmd2 = NULL, * stcmd3; - while( stdef1 != endDefine ) - { + HB_TRACE(("OutTable(%p, %p)", endDefine, endCommand)); + + while( stdef1 != endDefine ) + { stdef3 = stdef1->last; stdef1->last = stdef2; stdef2 = stdef1; stdef1 = stdef3; - } - while( stcmd1 != endCommand ) - { + } + while( stcmd1 != endCommand ) + { stcmd3 = stcmd1->last; stcmd1->last = stcmd2; stcmd2 = stcmd1; stcmd1 = stcmd3; - } + } - if( ( handl_o = fopen( "hbpp.out", "wt" ) ) == NULL ) - { + if( ( handl_o = fopen( "hbpp.out", "wt" ) ) == NULL ) + { printf( "\nCan't open hbpp.out\n" ); return; - } + } - num = 1; - while( stdef2 != NULL ) - { + num = 1; + while( stdef2 != NULL ) + { fprintf( handl_o, "\n static DEFINES sD___%i = ", num ); fprintf( handl_o, "{\"%s\",", stdef2->name ); if( stdef2->pars ) - fprintf( handl_o, "\"%s\",", stdef2->pars ); + fprintf( handl_o, "\"%s\",", stdef2->pars ); else - fprintf( handl_o, "NULL," ); + fprintf( handl_o, "NULL," ); fprintf( handl_o, "%d,", stdef2->npars ); if( stdef2->value ) - fprintf( handl_o, "\"%s\"", stdef2->value ); + fprintf( handl_o, "\"%s\"", stdef2->value ); else - fprintf( handl_o, "NULL" ); + fprintf( handl_o, "NULL" ); if( num == 1 ) - fprintf( handl_o, ", NULL };" ); + fprintf( handl_o, ", NULL };" ); else - fprintf( handl_o, ", &sD___%i };", num - 1 ); + fprintf( handl_o, ", &sD___%i };", num - 1 ); stdef2 = stdef2->last; num++; - } - fprintf( handl_o, "\n DEFINES *topDefine = " ); - if( num == 1 ) - fprintf( handl_o, "NULL;" ); - else - fprintf( handl_o, " = &sD___%i;\n", num - 1 ); + } + fprintf( handl_o, "\n DEFINES *topDefine = " ); + if( num == 1 ) + fprintf( handl_o, "NULL;" ); + else + fprintf( handl_o, " = &sD___%i;\n", num - 1 ); - num = 1; - while( stcmd2 != NULL ) - { + num = 1; + while( stcmd2 != NULL ) + { fprintf( handl_o, "\n static COMMANDS sC___%i = ", num ); fprintf( handl_o, "{%d,\"%s\",", stcmd2->com_or_xcom, stcmd2->name ); if( stcmd2->mpatt != NULL ) - { - len_mpatt = strocpy( sLine, stcmd2->mpatt ); - while( ( ipos = pp_strAt( "\1", 1, sLine, len_mpatt ) ) > 0 ) - { - pp_Stuff( "\\1", sLine + ipos - 1, 2, 1, len_mpatt ); - len_mpatt++; - } - fprintf( handl_o, "\"%s\",", sLine ); - } + { + len_mpatt = strocpy( sLine, stcmd2->mpatt ); + while( ( ipos = pp_strAt( "\1", 1, sLine, len_mpatt ) ) > 0 ) + { + pp_Stuff( "\\1", sLine + ipos - 1, 2, 1, len_mpatt ); + len_mpatt++; + } + fprintf( handl_o, "\"%s\",", sLine ); + } else - fprintf( handl_o, "NULL," ); + fprintf( handl_o, "NULL," ); if( stcmd2->value != NULL ) - { - len_value = strocpy( sLine, stcmd2->value ); - while( ( ipos = pp_strAt( "\1", 1, sLine, len_value ) ) > 0 ) - { - pp_Stuff( "\\1", sLine + ipos - 1, 2, 1, len_value ); - len_value++; - } - if( len_mpatt + len_value > 80 ) + { + len_value = strocpy( sLine, stcmd2->value ); + while( ( ipos = pp_strAt( "\1", 1, sLine, len_value ) ) > 0 ) + { + pp_Stuff( "\\1", sLine + ipos - 1, 2, 1, len_value ); + len_value++; + } + if( len_mpatt + len_value > 80 ) fprintf( handl_o, "\n " ); - fprintf( handl_o, "\"%s\"", sLine ); - } + fprintf( handl_o, "\"%s\"", sLine ); + } else fprintf( handl_o, "NULL" ); if( num == 1 ) - fprintf( handl_o, ",NULL };" ); + fprintf( handl_o, ",NULL };" ); else - fprintf( handl_o, ",&sC___%i };", num - 1 ); + fprintf( handl_o, ",&sC___%i };", num - 1 ); stcmd2 = stcmd2->last; num++; - } - fprintf( handl_o, "\n COMMANDS *topCommand = " ); - if( num == 1 ) - fprintf( handl_o, "NULL;" ); - else - fprintf( handl_o, " = &sC___%i;\n", num - 1 ); + } + fprintf( handl_o, "\n COMMANDS *topCommand = " ); + if( num == 1 ) + fprintf( handl_o, "NULL;" ); + else + fprintf( handl_o, " = &sC___%i;\n", num - 1 ); - stcmd1 = topTranslate; - stcmd2 = NULL; - while( stcmd1 != NULL ) - { + stcmd1 = topTranslate; + stcmd2 = NULL; + while( stcmd1 != NULL ) + { stcmd3 = stcmd1->last; stcmd1->last = stcmd2; stcmd2 = stcmd1; stcmd1 = stcmd3; - } - num = 1; - while( stcmd2 != NULL ) - { + } + num = 1; + while( stcmd2 != NULL ) + { fprintf( handl_o, "\n static COMMANDS sC___%i = ", num ); fprintf( handl_o, "{%d,\"%s\",", stcmd2->com_or_xcom, stcmd2->name ); if( stcmd2->mpatt != NULL ) - { - len_mpatt = strocpy( sLine, stcmd2->mpatt ); - while( ( ipos = pp_strAt( "\1", 1, sLine, len_mpatt ) ) > 0 ) - { - pp_Stuff( "\\1", sLine + ipos - 1, 2, 1, len_mpatt ); - len_mpatt++; - } - fprintf( handl_o, "\"%s\",", sLine ); - } + { + len_mpatt = strocpy( sLine, stcmd2->mpatt ); + while( ( ipos = pp_strAt( "\1", 1, sLine, len_mpatt ) ) > 0 ) + { + pp_Stuff( "\\1", sLine + ipos - 1, 2, 1, len_mpatt ); + len_mpatt++; + } + fprintf( handl_o, "\"%s\",", sLine ); + } else - fprintf( handl_o, "NULL," ); + fprintf( handl_o, "NULL," ); if( stcmd2->value != NULL ) - { - len_value = strocpy( sLine, stcmd2->value ); - while( ( ipos = pp_strAt( "\1", 1, sLine, len_value ) ) > 0 ) - { - pp_Stuff( "\\1", sLine + ipos - 1, 2, 1, len_value ); - len_value++; - } - if( len_mpatt + len_value > 80 ) + { + len_value = strocpy( sLine, stcmd2->value ); + while( ( ipos = pp_strAt( "\1", 1, sLine, len_value ) ) > 0 ) + { + pp_Stuff( "\\1", sLine + ipos - 1, 2, 1, len_value ); + len_value++; + } + if( len_mpatt + len_value > 80 ) fprintf( handl_o, "\n " ); - fprintf( handl_o, "\"%s\"", sLine ); - } + fprintf( handl_o, "\"%s\"", sLine ); + } else fprintf( handl_o, "NULL" ); if( num == 1 ) - fprintf( handl_o, ",NULL };" ); + fprintf( handl_o, ",NULL };" ); else - fprintf( handl_o, ",&sC___%i };", num - 1 ); + fprintf( handl_o, ",&sC___%i };", num - 1 ); stcmd2 = stcmd2->last; num++; - } - fprintf( handl_o, "\n COMMANDS *topTranslate = " ); - if( num == 1 ) - fprintf( handl_o, "NULL;" ); - else - fprintf( handl_o, " = &sT___%i;", num ); + } + fprintf( handl_o, "\n COMMANDS *topTranslate = " ); + if( num == 1 ) + fprintf( handl_o, "NULL;" ); + else + fprintf( handl_o, " = &sT___%i;", num ); - fclose( handl_o ); + fclose( handl_o ); } /* @@ -426,47 +432,55 @@ void OutTable( DEFINES * endDefine, COMMANDS * endCommand ) */ void AddSearchPath( char * szPath, PATHNAMES * * pSearchList ) { - PATHNAMES * pPath = *pSearchList; + PATHNAMES * pPath = *pSearchList; - if( pPath ) - { + HB_TRACE(("AddSearchPath(%s, %p)", szPath, pSearchList)); + + if( pPath ) + { while( pPath->pNext ) - pPath = pPath->pNext; + pPath = pPath->pNext; pPath->pNext = ( PATHNAMES * ) hb_xgrab( sizeof( PATHNAMES ) ); pPath = pPath->pNext; - } - else - { + } + else + { *pSearchList = pPath = ( PATHNAMES * ) hb_xgrab( sizeof( PATHNAMES ) ); - } - pPath->pNext = NULL; - pPath->szPath = szPath; + } + pPath->pNext = NULL; + pPath->szPath = szPath; } void GenError( char * _szErrors[], char cPrefix, int iError, char * szError1, char * szError2 ) { - printf( "\r(%i) ", nline ); - printf( "Error %c%04i ", cPrefix, iError ); - printf( _szErrors[ iError - 1 ], szError1, szError2 ); - printf( "\n\n" ); + HB_TRACE(("GenError(%p, %c, %d, %s, %s)", + _szErrors, cPrefix, iError, szError1, szError2)); - exit( EXIT_FAILURE ); + printf( "\r(%i) ", nline ); + printf( "Error %c%04i ", cPrefix, iError ); + printf( _szErrors[ iError - 1 ], szError1, szError2 ); + printf( "\n\n" ); + + exit( EXIT_FAILURE ); } void GenWarning( char* _szWarnings[], char cPrefix, int iWarning, char * szWarning1, char * szWarning2) { - if( _iWarnings ) - { + HB_TRACE(("GenWarning(%p, %c, %d, %s, %s)", + _szWarnings, cPrefix, iWarning, szWarning1, szWarning2)); + + if( _iWarnings ) + { char *szText = _szWarnings[ iWarning - 1 ]; if( (szText[ 0 ] - '0') <= _iWarnings ) - { - printf( "\r(%i) ", nline ); - printf( "Warning %c%04i ", cPrefix, iWarning ); - printf( szText + 1, szWarning1, szWarning2 ); - printf( "\n" ); - } - } + { + printf( "\r(%i) ", nline ); + printf( "Warning %c%04i ", cPrefix, iWarning ); + printf( szText + 1, szWarning1, szWarning2 ); + printf( "\n" ); + } + } } #define IS_PATH_SEP( c ) ( strchr( OS_PATH_DELIMITER_LIST, ( c ) ) != NULL ) @@ -474,103 +488,107 @@ void GenWarning( char* _szWarnings[], char cPrefix, int iWarning, char * szWarni /* Split given filename into path, name and extension */ PHB_FNAME hb_fsFNameSplit( char * szFileName ) { - PHB_FNAME pFileName = ( PHB_FNAME ) hb_xgrab( sizeof( HB_FNAME ) ); + PHB_FNAME pFileName = ( PHB_FNAME ) hb_xgrab( sizeof( HB_FNAME ) ); - int iLen = strlen( szFileName ); - int iSlashPos; - int iDotPos; - int iPos; + int iLen = strlen( szFileName ); + int iSlashPos; + int iDotPos; + int iPos; - pFileName->szPath = - pFileName->szName = - pFileName->szExtension = NULL; + HB_TRACE(("hb_fsFNameSplit(%s)", szFileName)); - iSlashPos = iLen - 1; - iPos = 0; + pFileName->szPath = + pFileName->szName = + pFileName->szExtension = NULL; - while( iSlashPos >= 0 && !IS_PATH_SEP( szFileName[ iSlashPos ] ) ) - --iSlashPos; + iSlashPos = iLen - 1; + iPos = 0; - if( iSlashPos == 0 ) - { + while( iSlashPos >= 0 && !IS_PATH_SEP( szFileName[ iSlashPos ] ) ) + --iSlashPos; + + if( iSlashPos == 0 ) + { /* root path -> \filename */ pFileName->szBuffer[ 0 ] = OS_PATH_DELIMITER; pFileName->szBuffer[ 1 ] = '\0'; pFileName->szPath = pFileName->szBuffer; iPos = 2; /* first free position after the slash */ - } - else if( iSlashPos > 0 ) - { + } + else if( iSlashPos > 0 ) + { /* If we are after a drive letter let's keep the following backslash */ if( IS_PATH_SEP( ':' ) && - ( szFileName[ iSlashPos ] == ':' || szFileName[ iSlashPos - 1 ] == ':' ) ) - { - /* path with separator -> d:\path\filename or d:path\filename */ - memcpy( pFileName->szBuffer, szFileName, iSlashPos + 1 ); - pFileName->szBuffer[ iSlashPos + 1 ] = '\0'; - iPos = iSlashPos + 2; /* first free position after the slash */ - } + ( szFileName[ iSlashPos ] == ':' || szFileName[ iSlashPos - 1 ] == ':' ) ) + { + /* path with separator -> d:\path\filename or d:path\filename */ + memcpy( pFileName->szBuffer, szFileName, iSlashPos + 1 ); + pFileName->szBuffer[ iSlashPos + 1 ] = '\0'; + iPos = iSlashPos + 2; /* first free position after the slash */ + } else - { - /* path with separator -> path\filename */ - memcpy( pFileName->szBuffer, szFileName, iSlashPos ); - pFileName->szBuffer[ iSlashPos ] = '\0'; - iPos = iSlashPos + 1; /* first free position after the slash */ - } + { + /* path with separator -> path\filename */ + memcpy( pFileName->szBuffer, szFileName, iSlashPos ); + pFileName->szBuffer[ iSlashPos ] = '\0'; + iPos = iSlashPos + 1; /* first free position after the slash */ + } pFileName->szPath = pFileName->szBuffer; - } + } - iDotPos = iLen - 1; - while( iDotPos > iSlashPos && szFileName[ iDotPos ] != '.' ) - --iDotPos; + iDotPos = iLen - 1; + while( iDotPos > iSlashPos && szFileName[ iDotPos ] != '.' ) + --iDotPos; - if( ( iDotPos - iSlashPos ) > 1 ) - { + if( ( iDotPos - iSlashPos ) > 1 ) + { /* the dot was found * and there is at least one character between a slash and a dot */ if( iDotPos == iLen - 1 ) - { - /* the dot is the last character - use it as extension name */ - pFileName->szExtension = pFileName->szBuffer + iPos; - pFileName->szBuffer[ iPos++ ] = '.'; - pFileName->szBuffer[ iPos++ ] = '\0'; - } + { + /* the dot is the last character - use it as extension name */ + pFileName->szExtension = pFileName->szBuffer + iPos; + pFileName->szBuffer[ iPos++ ] = '.'; + pFileName->szBuffer[ iPos++ ] = '\0'; + } else - { - pFileName->szExtension = pFileName->szBuffer + iPos; - /* copy rest of the string with terminating ZERO character */ - memcpy( pFileName->szExtension, szFileName + iDotPos + 1, iLen - iDotPos ); - iPos += iLen - iDotPos; - } - } - else - /* there is no dot in the filename or it is '.filename' */ - iDotPos = iLen; + { + pFileName->szExtension = pFileName->szBuffer + iPos; + /* copy rest of the string with terminating ZERO character */ + memcpy( pFileName->szExtension, szFileName + iDotPos + 1, iLen - iDotPos ); + iPos += iLen - iDotPos; + } + } + else + /* there is no dot in the filename or it is '.filename' */ + iDotPos = iLen; - if( ( iDotPos - iSlashPos - 1 ) > 0 ) - { + if( ( iDotPos - iSlashPos - 1 ) > 0 ) + { pFileName->szName = pFileName->szBuffer + iPos; memcpy( pFileName->szName, szFileName + iSlashPos + 1, iDotPos - iSlashPos - 1 ); pFileName->szName[ iDotPos - iSlashPos - 1 ] = '\0'; - } + } -/* DEBUG - printf( "\nFilename: %s\n", szFileName ); - printf( "\n szPath: %s\n", pFileName->szPath ); - printf( "\n szName: %s\n", pFileName->szName ); - printf( "\n szExt: %s\n", pFileName->szExtension ); -*/ + /* DEBUG + printf( "\nFilename: %s\n", szFileName ); + printf( "\n szPath: %s\n", pFileName->szPath ); + printf( "\n szName: %s\n", pFileName->szName ); + printf( "\n szExt: %s\n", pFileName->szExtension ); + */ - return pFileName; + return pFileName; } /* This function joins path, name and extension into a string with a filename */ char * hb_fsFNameMerge( char * szFileName, PHB_FNAME pFileName ) { - if( pFileName->szPath && pFileName->szPath[ 0 ] ) - { + HB_TRACE(("hb_fsFNameMerge(%s, %p)", szFileName, pFileName)); + + if( pFileName->szPath && pFileName->szPath[ 0 ] ) + { /* we have not empty path specified */ int iLen = strlen( pFileName->szPath ); @@ -578,75 +596,80 @@ char * hb_fsFNameMerge( char * szFileName, PHB_FNAME pFileName ) /* if the path is a root directory then we don't need to add path separator */ if( !( IS_PATH_SEP( pFileName->szPath[ 0 ] ) && pFileName->szPath[ 0 ] == '\0' ) ) - { - /* add the path separator only in cases: - * when a name doesn't start with it - * when the path doesn't end with it - */ - if( !( IS_PATH_SEP( pFileName->szName[ 0 ] ) || IS_PATH_SEP( pFileName->szPath[ iLen-1 ] ) ) ) - { - szFileName[ iLen++ ] = OS_PATH_DELIMITER; - szFileName[ iLen ] = '\0'; - } - } + { + /* add the path separator only in cases: + * when a name doesn't start with it + * when the path doesn't end with it + */ + if( !( IS_PATH_SEP( pFileName->szName[ 0 ] ) || IS_PATH_SEP( pFileName->szPath[ iLen-1 ] ) ) ) + { + szFileName[ iLen++ ] = OS_PATH_DELIMITER; + szFileName[ iLen ] = '\0'; + } + } if( pFileName->szName ) - strcpy( szFileName + iLen, pFileName->szName ); - } - else - { + strcpy( szFileName + iLen, pFileName->szName ); + } + else + { if( pFileName->szName ) - strcpy( szFileName, pFileName->szName ); - } + strcpy( szFileName, pFileName->szName ); + } - if( pFileName->szExtension ) - { + if( pFileName->szExtension ) + { int iLen = strlen( szFileName ); if( !( pFileName->szExtension[ 0 ] == '.' || szFileName[ iLen - 1 ] == '.') ) - { - /* add extension separator only when extansion doesn't contain it */ - szFileName[ iLen++ ] = '.'; - szFileName[ iLen ] = '\0'; - } + { + /* add extension separator only when extansion doesn't contain it */ + szFileName[ iLen++ ] = '.'; + szFileName[ iLen ] = '\0'; + } strcpy( szFileName + iLen, pFileName->szExtension ); - } + } -/* DEBUG - printf( "\nMERGE:\n" ); - printf( "\n szPath: %s\n", pFileName->szPath ); - printf( "\n szName: %s\n", pFileName->szName ); - printf( "\n szExt: %s\n", pFileName->szExtension ); - printf( "\nFilename result: %s\n", szFileName ); -*/ + /* DEBUG + printf( "\nMERGE:\n" ); + printf( "\n szPath: %s\n", pFileName->szPath ); + printf( "\n szName: %s\n", pFileName->szName ); + printf( "\n szExt: %s\n", pFileName->szExtension ); + printf( "\nFilename result: %s\n", szFileName ); + */ - return szFileName; + return szFileName; } void * hb_xgrab( ULONG ulSize ) /* allocates fixed memory, exits on failure */ { - void * pMem = malloc( ulSize ); + void * pMem = malloc( ulSize ); - if( ! pMem ) - GenError( _szPErrors, 'P', ERR_PPMEMALLOC, NULL, NULL ); + HB_TRACE(("hb_xgrab(%lu)", ulSize)); - return pMem; + if( ! pMem ) + GenError( _szPErrors, 'P', ERR_PPMEMALLOC, NULL, NULL ); + + return pMem; } void * hb_xrealloc( void * pMem, ULONG ulSize ) /* reallocates memory */ { - void * pResult = realloc( pMem, ulSize ); + void * pResult = realloc( pMem, ulSize ); - if( ! pResult ) - GenError( _szPErrors, 'P', ERR_PPMEMREALLOC, NULL, NULL ); + HB_TRACE(("hb_xrealloc(%p, %lu)", pMem, ulSize)); - return pResult; + if( ! pResult ) + GenError( _szPErrors, 'P', ERR_PPMEMREALLOC, NULL, NULL ); + + return pResult; } void hb_xfree( void * pMem ) /* frees fixed memory */ { - if( pMem ) - free( pMem ); - else - GenError( _szPErrors, 'P', ERR_PPMEMFREE, NULL, NULL ); -} + HB_TRACE(("hb_xfree(%p)", pMem)); + if( pMem ) + free( pMem ); + else + GenError( _szPErrors, 'P', ERR_PPMEMFREE, NULL, NULL ); +} diff --git a/harbour/source/rtl/gt/gtwin.c b/harbour/source/rtl/gt/gtwin.c index 2bd3b3a399..afd2ea0e50 100644 --- a/harbour/source/rtl/gt/gtwin.c +++ b/harbour/source/rtl/gt/gtwin.c @@ -93,9 +93,9 @@ static HANDLE HCursor; /* When DispBegin is in effect, all cursor related #if (defined(HB_LOG) && (HB_LOG != 0)) static FILE * flog = 0; -int line = 0; +static int line = 0; #define LOG(x) \ -do +do \ { \ flog = fopen( "c:/tmp/gt.log", "a" ); \ fprintf( flog, "%5d> GT: %s\n", line++, x ); \