// Numerical user_key format: "%s%ld%s",prefix,inc_number,suffix // if no numbers found, treat it as string int NumericalComparatorImpl::Compare(const leveldb::Slice& a, const leveldb::Slice& b) const { assert(a.size() > LDB_COMPARE_META_ALL_SIZE && b.size() > LDB_COMPARE_META_ALL_SIZE ); int64_t num_a = 0, num_b = 0; int ret = 0; const char *prefix_a, *prefix_b, *delimiter_a, *delimiter_b, *suffix_a, *suffix_b; prefix_a = MetaSkip(a.data() + LDB_COMPARE_META_ALL_SIZE, a.size() - LDB_COMPARE_META_ALL_SIZE); delimiter_a = FindNumber(prefix_a, a.size() - (prefix_a - a.data())); prefix_b = MetaSkip(b.data() + LDB_COMPARE_META_ALL_SIZE, b.size() - LDB_COMPARE_META_ALL_SIZE); delimiter_b = FindNumber(prefix_b, b.size() - (prefix_b - b.data())); //compare bucket_num+area+meta+prefix const size_t pre_len_a = delimiter_a - a.data() - LDB_COMPARE_SKIP_SIZE; const size_t pre_len_b = delimiter_b - b.data() - LDB_COMPARE_SKIP_SIZE; ret = StringCompare(a.data() + LDB_COMPARE_SKIP_SIZE, pre_len_a, b.data() + LDB_COMPARE_SKIP_SIZE, pre_len_b); if (ret == 0) { //prefixs equal, compare number num_a = Strntoul(delimiter_a, a.size() - (delimiter_a - a.data()), &suffix_a); num_b = Strntoul(delimiter_b, b.size() - (delimiter_b - b.data()), &suffix_b); if (num_a != num_b) { ret = (num_a - num_b) > 0 ? 1 : -1; } else { //numbers equal or no numbers found, compare suffix const size_t suf_len_a = a.size() - (suffix_a - a.data()); const size_t suf_len_b = b.size() - (suffix_b - b.data()); ret = StringCompare(suffix_a, suf_len_a, suffix_b, suf_len_b); } } return ret; }
char *FindIPAddressInString (char *psz) { psz = FindNumber(psz); while (psz && !IsIPAddress(psz)) { while (psz && isdigit(*psz)) ++psz; psz = FindNumber(psz); } return psz; }
int ProcessExpress(char *instring) /*对原表达式进行预处理*/ { int len,pos; inlength=-1; parencount=0; tokencount=LASTOPERAND; len=strlen(instring); instring[len]='\0'; for (pos=0;pos<len;) { if (instring[pos]==' ') /*忽略空格字符*/ pos++; else if (isalpha(instring[pos])) /*处理字母*/ pos=FindWord(instring,pos); else if (isdigit(instring[pos]) || instring[pos]=='.') /*处理数字*/ pos=FindNumber(instring,pos); else /*处理符号*/ pos=FindSymbol(instring,pos); if (pos==-1) return 0; } if (parencount!=0) printf("左右括号不匹配\n"); PutToken(0); /*在infix中添加ENDEXPR*/ return 1; }