Subversion Repositories Kolibri OS

Rev

Rev 9230 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */
  2. #include <math.h>
  3.  
  4. #ifndef unconst
  5. #define unconst(__v, __t) __extension__({union { const __t __cp; __t __p; } __q; __q.__cp = __v; __q.__p; })
  6. #endif
  7.  
  8. double strtod(const char* s, char** sret)
  9. {
  10.     long double r; /* result */
  11.     int e; /* exponent */
  12.     long double d; /* scale */
  13.     int sign; /* +- 1.0 */
  14.     int esign;
  15.     int i;
  16.     int flags = 0;
  17.  
  18.     r = 0.0;
  19.     sign = 1.0;
  20.     e = 0;
  21.     esign = 1;
  22.  
  23.     while ((*s == ' ') || (*s == '\t'))
  24.         s++;
  25.  
  26.     if (*s == '+')
  27.         s++;
  28.     else if (*s == '-') {
  29.         sign = -1;
  30.         s++;
  31.     }
  32.  
  33.     while ((*s >= '0') && (*s <= '9')) {
  34.         flags |= 1;
  35.         r *= 10.0;
  36.         r += *s - '0';
  37.         s++;
  38.     }
  39.  
  40.     if (*s == '.') {
  41.         d = 0.1L;
  42.         s++;
  43.  
  44.         while ((*s >= '0') && (*s <= '9')) {
  45.             flags |= 2;
  46.             r += d * (*s - '0');
  47.             s++;
  48.             d *= 0.1L;
  49.         }
  50.     }
  51.  
  52.     if (flags == 0) {
  53.         if (sret)
  54.             *sret = unconst(s, char*);
  55.         return 0;
  56.     }
  57.  
  58.     if ((*s == 'e') || (*s == 'E')) {
  59.         s++;
  60.         if (*s == '+')
  61.             s++;
  62.         else if (*s == '-') {
  63.             s++;
  64.             esign = -1;
  65.         }
  66.  
  67.         if ((*s < '0') || (*s > '9')) {
  68.             if (sret)
  69.                 *sret = unconst(s, char*);
  70.             return r;
  71.         }
  72.  
  73.         while ((*s >= '0') && (*s <= '9')) {
  74.             e *= 10;
  75.             e += *s - '0';
  76.             s++;
  77.         }
  78.     }
  79.     if (esign < 0)
  80.         for (i = 1; i <= e; i++)
  81.             r *= 0.1L;
  82.     else
  83.         for (i = 1; i <= e; i++)
  84.             r *= 10.0;
  85.  
  86.     if (sret)
  87.         *sret = unconst(s, char*);
  88.     return r * sign;
  89. }
  90.