static int matchBackRef( struct RE *rexp ){ const int backRefId = aToi( rexp->ptr + 1 ); const int backRefIndex = lastIdCatch( backRefId ); if( gpsCatch( backRefIndex ) == 0 || strnEql( text.ptr + text.pos, gpsCatch( backRefIndex ), lenCatch( backRefIndex ) ) == FALSE ) return FALSE; else return lenCatch( backRefIndex ); }
static void getLoops( struct RE *rexp, struct RE *track ){ track->loopsMin = 1; track->loopsMax = 1; if( rexp->len ) switch( *rexp->ptr ){ case '?' : cutRexp( rexp, 1 ); track->loopsMin = 0; track->loopsMax = 1; return; case '+' : cutRexp( rexp, 1 ); track->loopsMin = 1; track->loopsMax = INF; return; case '*' : cutRexp( rexp, 1 ); track->loopsMin = 0; track->loopsMax = INF; return; case '{' : cutRexp( rexp, 1 ); track->loopsMin = aToi( rexp->ptr ); cutRexp( rexp, countCharDigits( rexp->ptr ) ); if( *rexp->ptr == ',' ){ cutRexp( rexp, 1 ); if( *rexp->ptr == '}' ) track->loopsMax = INF; else { track->loopsMax = aToi( rexp->ptr ); cutRexp( rexp, countCharDigits( rexp->ptr ) ); } } else track->loopsMax = track->loopsMin; cutRexp( rexp, 1 ); } }
char * putCatch( char * newStr, const char * putStr ){ char *oNewStr = newStr; while( *putStr ) switch( *putStr ){ case '#': if( *++putStr == '#' ) *newStr++ = *putStr++; else { int index = aToi( putStr ); cpyCatch( newStr, index ); newStr += lenCatch( index ); putStr += countCharDigits( putStr ); } break; default : *newStr++ = *putStr++; } *newStr = '\0'; return oNewStr; }
int main(void) { struct point p1, p2; struct rect r; int value[4]; /* 一个矩形需要两个点,两个坐标决定一个点,共4个坐标 */ int i, type; char s[MAXSIZE]; i = 0; while ((type = getpoint(s)) != EOF) { if (type == NUMBER) value[i++] = aToi(s); if (i == 4) { i = 0; p1 = makepoint(value[0], value[1]); p2 = makepoint(value[2], value[3]); r.p1 = p1; r.p2 = p2; drawrect(r); } } return 0; }