Esempio n. 1
5
      // 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;
   }
Esempio n. 3
0
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;
}