Exemplo n.º 1
0
static void compile_count(const char *&re, size_t &low, size_t &high)
{
   assertq(*re == FrRE_COUNT_BEG) ;
   low = 0 ;
   high = UINT_MAX ;
   re++ ;
   while (Fr_isdigit(*re))
      low = 10*low + (*re - '0') ;
   if (*re == FrRE_COUNT_END)
      high = low ;
   else if (*re == ',')
      {
      high = 0 ;
      while (Fr_isdigit(*re))
	 high = 10*high + (*re - '0') ;
      if (high < low)
	 high = low ;
      }
   else
      FrWarning("invalid {} specifier in regular expression") ;
   if (*re == FrRE_COUNT_END)
      re++ ;
   else
      FrWarning("unterminated {} specifier in regular expression") ;
   return ;
}
Exemplo n.º 2
0
FrObject *FrRegExp::match(const char *word) const
{
   if (!regex || !word || !*word)
      return 0 ;
   char *groups[10] ;
   for (size_t i = 0 ; i < lengthof(groups) ; i++)
      groups[i] = 0 ;
//   char *end = strchr(word,'\0') ;
   FrObject *result ;
   char *matchbuf = 0 ;
//   if (re_match(regex,word,matchbuf,0,groups,lengthof(groups)) == end)
   const char *end ;
   if ((end = re_match(regex,word,matchbuf,0,groups,lengthof(groups))) != 0 &&
       !*end)
      {
      char translation[FrMAX_SYMBOLNAME_LEN+1] ;
      char *trans_end = &translation[FrMAX_SYMBOLNAME_LEN] ;
      char *xlat = translation ;
      const char *repl ;
      for (repl = replacement ; *repl && xlat < trans_end ; repl++)
	 {
	 char c = *repl ;
	 if (c == FrRE_QUOTE)
	    {
	    // escape-char plus digit specifies a replacement taken from the
	    //   source match
	    c = *++repl ;
	    if (Fr_isdigit(c))
	       {
	       const char *targ = groups[c-'0'] ;
	       if (targ)
		  {
		  size_t len = strlen(targ) ;
		  memcpy(xlat,targ,len) ;
		  xlat += len ;
		  }
	       else
		  FrWarningVA("mismatch in r.e. replacement: %%%c",c) ;
	       }
	    else if (c)
	       *xlat++ = *++repl ;
	    else
	       break ;
	    }
	 else
	    *xlat++ = c ;
	 }
      *xlat = '\0' ;
      result = new FrString(translation) ;
      }
   else
      result = 0 ;
   for (size_t j = 0 ; j < lengthof(groups) ; j++)
      if (groups[j]) FrFree(groups[j]) ;
   return result ;
}
Exemplo n.º 3
0
FrInteger64 *make_Int64(const char *str, char **stopper, long radix)
{
   bool neg = false ;
   if (*str == '-')
      {
      neg = true ;
      str++ ;
      }
   else if (*str == '+')
      str++ ;
   static int64_t value ;
   value = 0 ;
   while (Fr_isdigit(*str))
      {
      value = (value * radix) + (*str - '0') ;
      str++ ;
      }
   if (stopper)
      *stopper = (char*)str ;
   if (neg)
      value = -value ;
   return new FrInteger64(value) ;
}