#define regexp_MATCH_PATTERN (6) // pattern non valido
#define regexp_MATCH_LITERAL (5) // il pattern non coincide su un carattere comune
#define regexp_MATCH_RANGE (4) // il pattern non coincide in un costrutto [..]
#define regexp_MATCH_ABORT (3) // il stringa da confrontare <20> terminata anticipatamente
#define regexp_MATCH_END (2) // il pattern <20> terminato anticipatamente
#define regexp_MATCH_VALID (1) // pattern e stringa coincidono
// codici di ritorno della is_valid_pattern()
#define regexp_PATTERN_VALID (0) // il pattern <20> valido
#define regexp_PATTERN_ESC (-1) // <20> presente un escape aperto a fine pattern
#define regexp_PATTERN_RANGE (-2) // c'<27> un range non chiuso all'interno di un costrutto [..]
#define regexp_PATTERN_CLOSE (-3) // manca la parentesi di chiusura in un costrutto [..]
#define regexp_PATTERN_EMPTY (-4) // c'<27> un costrutto vuoto
// prototipi delle funzioni interne
HIDDENintmatche(constchar*pat,constchar*str);// ritorna un codice della classe regexp_MATCH che indica se e in che modo pattern e stringa coincidono
HIDDENintmatche_after_star(constchar*pat,constchar*str);// chiama ricorsivamente la matche() con i segmenti puri del pattern e della stringa
HIDDENboolis_pattern(constchar*pat);// ritorna TRUE se la stringa <20> un pattern
HIDDENboolis_valid_pattern(constchar*pat,int*err=NULL);// ritorna TRUE se la stringa <20> un pattern valido, indica un codice di ritorno della classe regexp_PATTERN nel secondo parametro
while(*p=='?'||*p=='*'){// salto degli eventuali '*' e '?'
if(*p=='?')// salto di un carattere per ciascun '?'
if(!*t++)returnregexp_MATCH_ABORT;// se la stringa termina qui non c'<27> coincidenza
p++;// posizionamento sul prossimo carattere del pattern
}
if(!*p)returnregexp_MATCH_VALID;//se il pattern <20> concluso c'<27> coincidenza
intnextp=*p;// prelevamento del prossimo carattere, normale o '['
if(nextp=='\\'){
nextp=p[1];
if(!nextp)returnregexp_MATCH_PATTERN;// se il pattern termina qui non <20> valido
}
do{// ciclo fino a conclusione di stringa o pattern
if(nextp==*t||nextp=='[')match=matche(p,t);// <20> necessario che il carattere corrente del testo coincida con il carattere corrente del pattern, oppure che il pattern abbia un inizio di costrutto [..]
if(!*t++)match=regexp_MATCH_ABORT;// se la stringa termina qui non c'<27> coincidenza