Пример #1
0
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;
}
Пример #2
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;
}