home *** CD-ROM | disk | FTP | other *** search
/ Game.EXE 2002 June / Game.EXE_06_2002.iso / Alawar / Lib / Converter.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2002-04-15  |  3.0 KB  |  164 lines

  1. #include "Converter.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5.  
  6. static char buffer[256];
  7.  
  8. template<typename T>
  9. static const char * pri(const char * format, T val )
  10. {
  11.     sprintf( buffer, format, val );
  12.     return buffer;
  13. }
  14.  
  15. const char * Converter::convert( bool number )
  16. {
  17.     //MAX: ne uveren chto tak
  18.     return pri( "%d", number );
  19. }
  20.  
  21. const char * Converter::convert( int number )
  22. {
  23.     return pri( "%d", number );
  24. }
  25.  
  26. const char * Converter::convert( unsigned number )
  27. {
  28.     return pri( "%d", number );
  29. }
  30.  
  31. const char * Converter::convert( float number )
  32. {
  33.     return pri( "%f", number );
  34. }
  35.  
  36. const char * Converter::convert( double number )
  37. {
  38.     return pri( "%lf", number );
  39. }
  40.  
  41. bool Converter::convert( const char * stt, bool * number )
  42. {
  43.     int n = 0;
  44.     if( low_level_convert( stt, &n ) != stt )
  45.     {
  46.         *number = !!n;
  47.         return true;
  48.     }
  49.     return false;
  50. }
  51.  
  52. bool Converter::convert( const char * stt, int * number )
  53. {
  54.     if( low_level_convert( stt, number ) != stt )
  55.         return true;
  56.     return false;
  57. }
  58.  
  59. bool Converter::convert( const char * stt, unsigned * number )
  60. {
  61.     int n = 0;
  62.     if( low_level_convert( stt, &n ) != stt )
  63.     {
  64.         *number = n;
  65.         return true;
  66.     }
  67.     return false;
  68. }
  69.  
  70. bool Converter::convert( const char * stt, float * number )
  71. {
  72.     if( low_level_convert( stt, number ) != stt )
  73.         return true;
  74.     return false;
  75. }
  76.  
  77. bool Converter::convert( const char * stt, double * number )
  78. {
  79.     if( low_level_convert( stt, number ) != stt )
  80.         return true;
  81.     return false;
  82. }
  83.  
  84. const char * Converter::low_level_convert( const char * stt, int * number )
  85. {
  86.     const char * ptr = stt;
  87.     while ( isspace(*ptr) )
  88.         ++ptr;
  89.  
  90.     int c = *ptr++;
  91.     int sign = c;
  92.     if (c == '-' || c == '+')
  93.         c = *ptr++;
  94.  
  95.     int total = 0;
  96.     bool any_digit = false;
  97.  
  98.     while (isdigit(c))
  99.     {
  100.         any_digit = true;
  101.         total = 10 * total + (c - '0');
  102.         c = *ptr++;
  103.     }
  104.  
  105.     if (sign == '-')
  106.         *number = -total;
  107.     else
  108.         *number = total;
  109.     return any_digit ? ptr : stt;
  110. }
  111.  
  112. template<typename T>
  113. const char * any_float_convert( const char * stt, T * number )
  114. {
  115.     const char * ptr = stt;
  116.     while ( isspace(*ptr) )
  117.         ++ptr;
  118.  
  119.     int c = *ptr++;
  120.     int sign = c;
  121.     if (c == '-' || c == '+')
  122.         c = *ptr++;
  123.  
  124.     T total = 0;
  125.     bool any_digit = false;
  126.  
  127.     while (isdigit(c))
  128.     {
  129.         any_digit = true;
  130.         total = 10 * total + (c - '0');
  131.         c = *ptr++;
  132.     }
  133.     if( c == '.' )
  134.     {
  135.         c = *ptr++;
  136.         T mul = T(0.1);
  137.         while (isdigit(c))
  138.         {
  139.             any_digit = true;
  140.             total += mul * (c - '0');
  141.             mul *= T(0.1);
  142.             c = *ptr++;
  143.         }
  144.     }
  145.  
  146.     if (sign == '-')
  147.         *number = -total;
  148.     else
  149.         *number = total;
  150.     return any_digit ? ptr : stt;
  151. ///    *number = atof( stt );
  152. ///    return stt + 1;
  153. }
  154.  
  155. const char * Converter::low_level_convert( const char * stt, double * number )
  156. {
  157.     return any_float_convert( stt, number );
  158. }
  159.  
  160. const char * Converter::low_level_convert( const char * stt, float * number )
  161. {
  162.     return any_float_convert( stt, number );
  163. }
  164.