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 ; }
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 ; }
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) ; }