home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2006 March / Gamestar_82_2006-03_dvd.iso / DVDStar / Editace / quake4_sdkv10.exe / source / idlib / Token.cpp < prev    next >
C/C++ Source or Header  |  2005-11-14  |  3KB  |  153 lines

  1.  
  2. #include "precompiled.h"
  3. #pragma hdrstop
  4.  
  5.  
  6. /*
  7. ================
  8. idToken::NumberValue
  9. ================
  10. */
  11. void idToken::NumberValue( void ) {
  12.     int i, pow, div, c;
  13.     const char *p;
  14.     double m;
  15.  
  16.     assert( type == TT_NUMBER );
  17.     p = c_str();
  18.     floatvalue = 0;
  19.     intvalue = 0;
  20.     // floating point number
  21.     if ( subtype & TT_FLOAT ) {
  22.         if ( subtype & ( TT_INFINITE | TT_INDEFINITE | TT_NAN ) ) {
  23.             if ( subtype & TT_INFINITE ) {            // 1.#INF
  24.                 unsigned int inf = 0x7f800000;
  25.                 floatvalue = (double) *(float*)&inf;
  26.             }
  27.             else if ( subtype & TT_INDEFINITE ) {    // 1.#IND
  28.                 unsigned int ind = 0xffc00000;
  29.                 floatvalue = (double) *(float*)&ind;
  30.             }
  31.             else if ( subtype & TT_NAN ) {            // 1.#QNAN
  32.                 unsigned int nan = 0x7fc00000;
  33.                 floatvalue = (double) *(float*)&nan;
  34.             }
  35.         }
  36.         else {
  37.             while( *p && *p != '.' && *p != 'e' ) {
  38.                 floatvalue = floatvalue * 10.0 + (double) (*p - '0');
  39.                 p++;
  40.             }
  41.             if ( *p == '.' ) {
  42.                 p++;
  43.                 for( m = 0.1; *p && *p != 'e'; p++ ) {
  44.                     floatvalue = floatvalue + (double) (*p - '0') * m;
  45.                     m *= 0.1;
  46.                 }
  47.             }
  48.             if ( *p == 'e' ) {
  49.                 p++;
  50.                 if ( *p == '-' ) {
  51.                     div = true;
  52.                     p++;
  53.                 }
  54.                 else if ( *p == '+' ) {
  55.                     div = false;
  56.                     p++;
  57.                 }
  58.                 else {
  59.                     div = false;
  60.                 }
  61.                 pow = 0;
  62.                 for ( pow = 0; *p; p++ ) {
  63.                     pow = pow * 10 + (int) (*p - '0');
  64.                 }
  65.                 for ( m = 1.0, i = 0; i < pow; i++ ) {
  66.                     m *= 10.0;
  67.                 }
  68.                 if ( div ) {
  69.                     floatvalue /= m;
  70.                 }
  71.                 else {
  72.                     floatvalue *= m;
  73.                 }
  74.             }
  75.         }
  76.         intvalue = idMath::Ftoi( floatvalue );
  77.     }
  78.     else if ( subtype & TT_DECIMAL ) {
  79.         while( *p ) {
  80.             intvalue = intvalue * 10 + (*p - '0');
  81.             p++;
  82.         }
  83.         floatvalue = intvalue;
  84.     }
  85.     else if ( subtype & TT_IPADDRESS ) {
  86.         c = 0;
  87.         while( *p && *p != ':' ) {
  88.             if ( *p == '.' ) {
  89.                 while( c != 3 ) {
  90.                     intvalue = intvalue * 10;
  91.                     c++;
  92.                 }
  93.                 c = 0;
  94.             }
  95.             else {
  96.                 intvalue = intvalue * 10 + (*p - '0');
  97.                 c++;
  98.             }
  99.             p++;
  100.         }
  101.         while( c != 3 ) {
  102.             intvalue = intvalue * 10;
  103.             c++;
  104.         }
  105.         floatvalue = intvalue;
  106.     }
  107.     else if ( subtype & TT_OCTAL ) {
  108.         // step over the first zero
  109.         p += 1;
  110.         while( *p ) {
  111.             intvalue = (intvalue << 3) + (*p - '0');
  112.             p++;
  113.         }
  114.         floatvalue = intvalue;
  115.     }
  116.     else if ( subtype & TT_HEX ) {
  117.         // step over the leading 0x or 0X
  118.         p += 2;
  119.         while( *p ) {
  120.             intvalue <<= 4;
  121.             if (*p >= 'a' && *p <= 'f')
  122.                 intvalue += *p - 'a' + 10;
  123.             else if (*p >= 'A' && *p <= 'F')
  124.                 intvalue += *p - 'A' + 10;
  125.             else
  126.                 intvalue += *p - '0';
  127.             p++;
  128.         }
  129.         floatvalue = intvalue;
  130.     }
  131.     else if ( subtype & TT_BINARY ) {
  132.         // step over the leading 0b or 0B
  133.         p += 2;
  134.         while( *p ) {
  135.             intvalue = (intvalue << 1) + (*p - '0');
  136.             p++;
  137.         }
  138.         floatvalue = intvalue;
  139.     }
  140.     subtype |= TT_VALUESVALID;
  141. }
  142.  
  143. /*
  144. ================
  145. idToken::ClearTokenWhiteSpace
  146. ================
  147. */
  148. void idToken::ClearTokenWhiteSpace( void ) {
  149.     whiteSpaceStart_p = NULL;
  150.     whiteSpaceEnd_p = NULL;
  151.     linesCrossed = 0;
  152. }
  153.