diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 478d334e29..e46f2aa2bb 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -1,3 +1,7 @@ +199908.09-13:12 GMT+3 Alexander Kresin + * source/hbpp/hbpp.c + * added support for list match patterns + 19990809-03:47 EDT Paul Tucker * source/compiler/harbour.l + added DECLARE statement - treated as PRIVATE diff --git a/harbour/source/hbpp/hbpp.c b/harbour/source/hbpp/hbpp.c index 40ef6a87a0..3b6f408ea0 100644 --- a/harbour/source/hbpp/hbpp.c +++ b/harbour/source/hbpp/hbpp.c @@ -376,7 +376,7 @@ void ParseCommand( char* sLine, int com_or_xcom, int com_or_tra ) char cmdname[MAX_NAME]; COMMANDS *stcmd; int mlen,rlen; - int ipos; + int ipos, rez; NextWord( &sLine, cmdname, FALSE ); stroupper( cmdname ); @@ -1287,8 +1287,8 @@ void SearnRep( char *exppatt,char *expreal,int lenreal,char *ptro, int *lenres) int ReplacePattern ( char patttype, char *expreal, int lenreal, char *ptro, int lenres ) { - int rmlen = lenreal; - char sQuotes[ 3 ] = "\"\""; + int rmlen = lenreal, ifou, lenitem, i; + char sQuotes[ 4 ] = "\"\","; switch ( *(ptro+2) ) { case '0': /* Regular result marker */ @@ -1306,6 +1306,26 @@ int ReplacePattern ( char patttype, char *expreal, int lenreal, char *ptro, int 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 = pp_strAt( ",", 1, expreal, lenreal ); + 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 { @@ -1318,6 +1338,38 @@ int ReplacePattern ( char patttype, char *expreal, int lenreal, char *ptro, int case '3': /* Smart stringify result marker */ if ( patttype == '1' ) /* list match marker */ { + pp_Stuff ( "", ptro, 0, 4, lenres ); + lenres -= 4; + rmlen = 0; + do + { + ifou = pp_strAt( ",", 1, expreal, lenreal ); + lenitem = (ifou)? ifou-1:lenreal; + if( *expreal != '\0' ) + { + if ( !lenitem || *expreal == '(' || *expreal == '&' || + *expreal == '\"' || *expreal == '\'' ) + { + if( ifou ) lenitem++; + pp_Stuff ( (*expreal=='&')? expreal+1:expreal, ptro, + (*expreal=='&')? lenitem-1:lenitem, 4, lenres ); + } + 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; + } + ptro += lenitem; + rmlen += lenitem; + } + expreal += ifou; + lenreal -= ifou; + } + while ( ifou > 0 ); } else if ( !lenreal || *expreal == '(' || *expreal == '&' || *expreal == '\"' || *expreal == '\'' ) @@ -1336,6 +1388,25 @@ int ReplacePattern ( char patttype, char *expreal, int lenreal, char *ptro, int 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 = pp_strAt( ",", 1, expreal, lenreal ); + 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 { @@ -1380,6 +1451,11 @@ void pp_rQuotes( char *expreal, char *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) @@ -1766,4 +1842,4 @@ BOOL OpenInclude( char * szFileName, PATHNAMES *pSearch, FILE** fptr, BOOL bStan } return ( *fptr ? TRUE : FALSE ); -} +} \ No newline at end of file