int rx_cmatch(char *rx,char *s,int n) { int p=compile(rx); if(!errors) { char *end=s+n; int u; SKIP_SPACE: for(;;) { if(s==end) return nullable(p); s+=u_get(&u,s); if(!xmlc_white_space(u)) break; } for(;;) { if(p==notAllowed) return 0; if(xmlc_white_space(u)) { u=' '; p=drv(p,u); if(p==notAllowed) { for(;;) { if(s==end) return 1; s+=u_get(&u,s); if(!xmlc_white_space(u)) return 0; } } else goto SKIP_SPACE; } p=drv(p,u); if(s==end) goto SKIP_SPACE; s+=u_get(&u,s); } } else return 0; }
static int tokcntn(char *s,int n) { char *end=s+n; int u,cnt=0; SKIP_SPACE: for(;;) { if(s==end) return cnt; s+=u_get(&u,s); if(!xmlc_white_space(u)) break; } ++cnt; for(;;) { if(s==end) return cnt; s+=u_get(&u,s); if(xmlc_white_space(u)) goto SKIP_SPACE; } }
static int toklenn(char *s,int n) { char *end=s+n; int u,len=0; SKIP_SPACE: for(;;) { if(s==end) return len?len-1:0; s+=u_get(&u,s); if(!xmlc_white_space(u)) break; } ++len; for(;;) { if(s==end) return len; ++len; s+=u_get(&u,s); if(xmlc_white_space(u)) goto SKIP_SPACE; } }
/* read utf8 */ static void getu(struct rnc_source *sp) { int n,u0=sp->u; for(;;) { if(!sp->complete&&sp->i>sp->n-BUFTAIL) { if(rnc_read(sp)==-1) error(1,sp,RNC_ER_IO,sp->fn,sp->line,sp->col,strerror(errno)); } if(sp->i==sp->n) { sp->u=(u0=='\n'||u0=='\r'||u0==-1)?-1:'\n'; u0=-1; break; } /* eof */ n=u_get(&sp->u,sp->buf+sp->i); if(n==0) { error(0,sp,RNC_ER_UTF,sp->fn,sp->line,sp->col); ++sp->i; continue; } else if(n+sp->i>sp->n) { error(0,sp,RNC_ER_UTF,sp->fn,sp->line,sp->col); sp->i=sp->n; continue; } else { sp->i+=n; if(u0=='\r'&&sp->u=='\n') {u0='\n'; continue;} } break; } if(u0!=-1) { if(u0=='\r'||u0=='\n') {++sp->line; sp->col=0;} if(!(sp->u=='\r'||sp->u=='\n')) {++sp->col;} } }
int rx_match(char *rx,char *s,int n) { int p=compile(rx); if(!errors) { char *end=s+n; int u; for(;;) { if(p==notAllowed) return 0; if(s==end) return nullable(p); s+=u_get(&u,s); p=drv(p,u); } } else return 0; }
static void getsym(void) { int u; if(regex[ri]=='\0') sym=SYM_END; else { ri+=u_get(&u,regex+ri); if(u=='\\') { ri+=u_get(&u,regex+ri); switch(u) { case '\0': --ri; error(RX_ER_UNFIN); sym=SYM_END; break; case 'p': sym=SYM_CLS; val=chclass(); break; case 'P': sym=SYM_CLS; val=-chclass(); break; case 's': sym=SYM_CLS; val=CLS_S; break; case 'S': sym=SYM_CLS; val=-CLS_S; break; case 'i': sym=SYM_CLS; val=CLS_I; break; case 'I': sym=SYM_CLS; val=-CLS_I; break; case 'c': sym=SYM_CLS; val=CLS_C; break; case 'C': sym=SYM_CLS; val=-CLS_C; break; case 'd': sym=SYM_CLS; val=CLS_U_Nd; break; case 'D': sym=SYM_CLS; val=-CLS_U_Nd; break; case 'w': sym=SYM_CLS; val=CLS_W; break; case 'W': sym=SYM_CLS; val=-CLS_W; break; case 'n': sym=SYM_ESC; val=0xA; break; case 'r': sym=SYM_ESC; val=0xD; break; case 't': sym=SYM_ESC; val=0x9; break; case '\\': case '|': case '.': case '-': case '^': case '?': case '*': case '+': case '{': case '}': case '[': case ']': case '(': case ')': sym=SYM_ESC; val=u; break; default: error(RX_ER_BADCH); sym=SYM_ESC; val=u; break; } } else { switch(u) { case '.': sym=SYM_CLS; val=-CLS_NL; break; default: sym=SYM_CHR; val=u; break; } } } }
static int chclass(void) { int u,cl,rj; ri+=u_get(&u,regex+ri); if(u=='\0') {--ri; error(RX_ER_NOLCU); return 0;} if(u!='{') {error(RX_ER_NOLCU); return 0;} rj=ri; for(;;) { if(regex[rj]=='\0') {ri=rj; error(RX_ER_NORCU); return 0;} if(regex[rj]=='}') { if((cl=s_ntab(regex+ri,rj-ri,clstab,NUM_CLS_U))==NUM_CLS_U) {error(RX_ER_BADCL); cl=0;} ri=rj+1; return cl; } ++rj; } }