static void syntax_strncpy(char *dst,char *src,int len) { char *char_class_end; while(len) { switch(*src) { case '\\': src++; len--; if(!len) break; switch (*src) { case 'n': *dst='\n'; break; case 'r': *dst='\r'; break; case 't': *dst='\t'; break; case 's': *dst=' '; break; default: *dst=*src; break; } break; case '*': *dst='\001'; break; case '+': *dst='\002'; break; case '/': char_class_end=get_char_class_end(src+1,len-1); if((char_class_end)&&((char_class_end-src+1)>4)) { int index=add_char_class(src+1,char_class_end); *dst='\003'; dst++; *((int *)dst)=code_index(index); dst++; dst++; dst++; while(src<char_class_end) { src++; len--; } break; } default: *dst=*src; break; } if(len) { src++; dst++; len--; } } *dst=0; }
SLwchar_Lut_Type *SLwchar_strtolut (SLuchar_Type *u, int allow_range, int allow_charclass) { SLuchar_Type *umax; SLwchar_Lut_Type *r; Lexical_Element_Type lex; r = SLwchar_create_lut (32); if (r == NULL) return NULL; umax = u + strlen ((char *) u); while (u < umax) { if (NULL == (u = get_lexical_element (u, umax, allow_range, allow_charclass, &lex))) goto return_error; switch (lex.lexical_type) { case LEXICAL_CHAR_TYPE: if (-1 == SLwchar_add_range_to_lut (r, lex.e.wch, lex.e.wch)) goto return_error; break; case LEXICAL_RANGE_TYPE: if (-1 == SLwchar_add_range_to_lut (r, lex.e.range[0], lex.e.range[1])) goto return_error; break; case LEXICAL_CLASS_TYPE: add_char_class (r, lex.e.char_class); break; } } return r; return_error: SLwchar_free_lut (r); return NULL; }