Subversion Repositories Kolibri OS

Rev

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