int rnc_bind(struct rnc_source *sp,char *fn,int fd) { rnc_source_init(sp,fn); if((sp->fd=fd)!=-1) { sp->buf=(char*)m_alloc(BUFSIZE,sizeof(char)); sp->flags=SRC_FREE; sp->n=sp->i=0; sp->complete=0; rnc_read(sp); sp->i=u_bom(sp->buf,sp->n); } return sp->fd; }
int rnc_stropen(struct rnc_source *sp,char *fn,char *s,int len) { rnc_source_init(sp,fn); sp->buf=s; sp->n=len; sp->complete=1; sp->i=u_bom(s,len); return 0; }
static int arx(char *fn) { if((arxfd=open(arxfn=fn,O_RDONLY))==-1) { (*er_printf)("error (%s): %s\n",arxfn,strerror(errno)); return 0; } else { errors=0; len_b=read(arxfd,buf,BUFSIZE); i_b=u_bom(buf,len_b); prevline=-1; line=1; col=0; rnc=0; cc=' '; getsym(); chk_get(SYM_GRMS); chk_get(SYM_LCUR); do { if(i_2==len_2) t2s=(int(*)[2])m_stretch(t2s,len_2=i_2*2,i_2,sizeof(int[2])); if(chksym(SYM_IDNT)) t2s[i_2][0]=add_s(value); getsym(); chk_get(SYM_ASGN); if(chksym(SYM_LTRL)) { if(path2abs) { int len=strlen(arxfn)+strlen(value)+1; if(len>len_v) {value=(char*)m_stretch(value,len,len_v,sizeof(char)); len_v=len;} s_abspath(value,arxfn); } t2s[i_2][1]=add_s(value); } getsym(); ++i_2; } while(sym==SYM_IDNT); chk_get(SYM_RCUR); for(;;) { if(i_r==len_r) rules=(int(*)[3])m_stretch(rules,len_r=i_r*2,i_r,sizeof(int[3])); switch(sym) { case SYM_MTCH: rules[i_r][0]=MATCH; goto REGEXP; case SYM_NMTC: rules[i_r][0]=NOMAT; goto REGEXP; REGEXP: getsym(); if(chksym(SYM_RGXP)) { if(!rx_check(value)) error(ARX_ER_REX); rules[i_r][1]=add_s(value); } getsym(); if(chksym(SYM_IDNT)) rules[i_r][2]=typ2str(); goto NEXT; case SYM_VALD: rules[i_r][0]=VALID; goto RNG; case SYM_NVAL: rules[i_r][0]=INVAL; goto RNG; RNG: getsym(); if(chksym(SYM_RENG)) { char *rncfn=(char*)m_alloc(strlen(arxfn)+strlen("#rnc[]")+12,sizeof(char)); sprintf(rncfn,"%s#rnc[%i]",arxfn,rnc++); if(!(rules[i_r][1]=rnl_s(rncfn,value,strlen(value)))) error(ARX_ER_RNG); m_free(rncfn); } getsym(); if(chksym(SYM_IDNT)) rules[i_r][2]=typ2str(); goto NEXT; default: goto LAST; } NEXT: ++i_r; getsym(); } LAST: chk_get(SYM_EOF); close(arxfd); return !errors; } }