Set atom to a numeric data type and value if the supplied string amounts to a numberic value, i.e. is of the form [sign] digits [[.] digits] [[e][sign]digits]

Return TypeFunction nameArguments
hzEcodehzAtom::SetNumber(const char*,)

Declared in file: hzDatabase.h
Defined in file : hzAtom.cpp

Function Logic:

0:START 1:items i 2:unknown 3:Return E_NODATA 4:unknown 5:bNeg items 6:*i==(char)43 7:items 8:i[0]=='0'&&(i[1]=='x'||i[1]=='X') 9:unknown 10:valA 11:unknown 12:* 13:valA 14:unknown 15:valA * valA 16:unknown 17:valA * valA 18:unknown 19:m_eType 20:Return E_FORMAT 21:unknown 22:m_eType 23:Return E_FORMAT 24:unknown 25:m_eType m_Data 26:nBytes>4 27:m_eType valA m_Data 28:nBytes>2 29:m_eType valA m_Data 30:m_eType valA m_Data 31:Return E_OK 32:unknown 33:valA 34:unknown 35:* 36:valA 37:unknown 38:Return BASETYPE_UNDEF 39:unknown 40:items 41:unknown 42:valD 43:unknown 44:* 45:valB 46:unknown 47:Return BASETYPE_UNDEF 48:unknown 49:valD 50:valD 51:unknown 52:items 53:unknown 54:items items 55:unknown 56:valE 57:unknown 58:* 59:valE 60:unknown 61:Return BASETYPE_UNDEF 62:m_Data m_eType 63:Return E_OK 64:unknown 65:unknown 66:m_Data m_eType 67:m_Data m_eType 68:nDigits>4 69:unknown 70:m_Data m_eType 71:m_Data m_eType 72:nDigits>2 73:unknown 74:m_Data m_eType 75:m_Data m_eType 76:unknown 77:m_Data m_eType 78:m_Data m_eType 79:m_eStatus 80:Return E_OK

Function body:

hzEcode hzAtom::SetNumber (const char* s)
{
   //  Set atom to a numeric data type and value if the supplied string amounts to a numberic value, i.e. is of the form
   //  [sign] digits [[.] digits] [[e][sign]digits]
   //  
   //  Arguments: 1) s The supplied string.
   //  
   //  Returns: E_NOINIT If the anticipated data type is not specified.
   //     E_BADVALUE If the supplied string does not represent a valid value for the anticipated data type.
   //     E_OK  If the operation was successful.
   _hzfunc("hzAtom::SetNumber") ;
   const char* i ;                 //  Iterator
   uint64_t    valA ;              //  For digits past the decimal point
   double      valD ;              //  For double value
   uint32_t    valB ;              //  For digits past the decimal point
   uint32_t    valE ;              //  For digits past the exponent
   uint32_t    nDigits = 0;        //  Digit counter
   int32_t     nBytes = 0;     //  Byte count
   bool        bNeg = false ;      //  Minus operator indicator
   Clear() ;
   i = s ;
   if (!i)
       return E_NODATA ;
   //  Deal with leading sign
   if (*i == CHAR_MINUS)
       { bNeg = true ; i++ ; }
   else if (*i == CHAR_PLUS)
       i++ ;
   else if (i[0]== ''0''&&(i[1]== ''x''||i[1]== ''X''))
   {
       //  Whole token must be hex and limited to 16 bytes - otherwise fail.
       for (i += 2; IsHex(*i) ; nBytes++, i++)
       {
           valA *= 16;
           if (*i >&eq; ''0''&&*i <&eq; ''9''){valA += (*i - ''0'');continue ; }
           if (*i >&eq; ''A''&&*i <&eq; ''F''){valA += 10;valA += (*i - ''A'');continue ; }
           if (*i >&eq; ''a''&&*i <&eq; ''f''){valA += 10;valA += (*i - ''a'');continue ; }
           break ;
       }
       if (*i)
           { m_eType = BASETYPE_UNDEF ; return E_FORMAT ; }
       if (!nBytes || nBytes > 16)
           { m_eType = BASETYPE_UNDEF ; return E_FORMAT ; }
       if      (nBytes > 8){ m_eType = BASETYPE_UINT64 ; m_Data.m_uInt64 = valA ; }
       else if (nBytes > 4){ m_eType = BASETYPE_UINT32 ; m_Data.m_uInt32 = valA & 0xffffffff;}
       else if (nBytes > 2){ m_eType = BASETYPE_UINT16 ; m_Data.m_uInt16 = valA & 0xffff;}
       else
           { m_eType = BASETYPE_UBYTE ; m_Data.m_uByte = valA & 0xff;}
       return E_OK ;
   }
   //  Expect a series of at least one digit
   for (nDigits = 0; IsDigit(*i) ; nBytes++, nDigits++, i++)
   {
       valA *= 10;
       if (*i >&eq; ''0''&&*i <&eq; ''9'')
           { valA += (*i - ''0'');continue ; }
       break ;
   }
   if (!nDigits)
       return BASETYPE_UNDEF ;
   //  Test for a period that is followed by at least one digit
   if (*i == CHAR_PERIOD)
   {
       i++ ;
       for (nDigits = 0; IsDigit(*i) ; nBytes++, nDigits++, i++)
       {
           valD *= 10.0;
           if (*i >&eq; ''0''&&*i <&eq; ''9'')
               { valB += (*i - ''0'');continue ; }
           break ;
       }
       if (!nDigits)
           return BASETYPE_UNDEF ;
       for (; nBytes ; nBytes--)
           valD /= 10.0;
       valD += (double) valA ;
       //  Test for the 'e' followed by at least one digit or a +/- followed by at least one digit
       if (*i == ''e'')
       {
           i++ ;
           if (*i == CHAR_MINUS || *i == CHAR_PLUS)
               { nBytes++ ; i++ ; }
           for (nDigits = 0; IsDigit(*i) ; nBytes++, nDigits++, i++)
           {
               valE *= 10;
               if (*i >&eq; ''0''&&*i <&eq; ''9'')
                   { valE += (*i - ''0'');continue ; }
               break ;
           }
           if (!nDigits)
               return BASETYPE_UNDEF ;
       }
       m_Data.m_Double = valD ;
       m_eType = BASETYPE_DOUBLE ;
       return E_OK ;
   }
   //  Not a double
   if (nDigits > 8)
   {
       if (bNeg)
           { m_Data.m_sInt64 = valA ; m_eType = BASETYPE_INT64 ; }
       else
           { m_Data.m_uInt64 = valA ; m_eType = BASETYPE_UINT64 ; }
   }
   else if (nDigits > 4)
   {
       if (bNeg)
           { m_Data.m_sInt32 = valA ; m_eType = BASETYPE_INT32 ; }
       else
           { m_Data.m_uInt32 = valA ; m_eType = BASETYPE_UINT32 ; }
   }
   else if (nDigits > 2)
   {
       if (bNeg)
           { m_Data.m_sInt16 = valA ; m_eType = BASETYPE_INT16 ; }
       else
           { m_Data.m_uInt16 = valA ; m_eType = BASETYPE_UINT16 ; }
   }
   else
   {
       if (bNeg)
           { m_Data.m_sByte = valA ; m_eType = BASETYPE_BYTE ; }
       else
           { m_Data.m_uByte = valA ; m_eType = BASETYPE_UBYTE ; }
   }
   m_eStatus = ATOM_SET ;
   return E_OK ;
}