home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / unix / unixlib36d / src / c / strtod < prev    next >
Text File  |  1994-03-08  |  2KB  |  91 lines

  1. #ifdef __STDC__
  2. static char sccs_id[] = "@(#) strtod.c 1.3 " __DATE__ " HJR";
  3. #else
  4. static char sccs_id[] = "@(#) strtod.c 1.3 26/9/90 HJR";
  5. #endif
  6.  
  7. /* strtod.c (c) Copyright 1990 H.Rogers */
  8.  
  9. #include <ctype.h>
  10. #ifdef __STDC__
  11. #include <stdlib.h>
  12. #else
  13. extern double strtod ();
  14. #endif
  15.  
  16. #define MAXEXP    308        /* maximum decimal exponential for IEEE double */
  17.  
  18. /* recognizes: [spaces][sign][digs][[.][digs]][[e|E][space|sign][int]] */
  19.  
  20. /* this is the most efficient strtod() can be, without resorting to
  21.  * assuming IEEE 'D' or some other floating point representation */
  22.  
  23. double
  24. strtod (register const char *s, char **end)
  25. {
  26.   register double r, p;
  27.   register unsigned int x;
  28.   register int r_, x_;
  29.   const char *_s;
  30.  
  31.   r = 0;
  32.   r_ = 0;
  33.  
  34.   if (!s)
  35.     return (r);
  36.  
  37.   while (isspace (*s++));
  38.   s--;
  39.  
  40.   if (*s == '-' || *s == '+')
  41.     {
  42.       if (*s == '-')
  43.     r_ = 1;
  44.       s++;
  45.     }
  46.  
  47.   while (isdigit (*s))
  48.     {
  49.       r = r * 10 + (*s - '0');
  50.       s++;
  51.     }
  52.  
  53.   if (*s != '.')
  54.     goto integer;
  55.  
  56.   s++;
  57.   p = 1;
  58.   while (isdigit (*s))
  59.     {
  60.       r = r * 10 + (*s - '0');
  61.       p *= 10;
  62.       s++;
  63.     }
  64.   r /= p;
  65.  
  66. integer:if (!(*s == 'e' || *s == 'E'))
  67.     goto ret;
  68.  
  69.   x_ = (int) strtol (++s, (char **) &_s, 0);
  70.   s = _s;
  71.  
  72.   x_ = (x_ < 0) ? ((x = (unsigned int) (-x_)), 1) : ((x = (unsigned int) x_), 0);
  73.  
  74.   if (x > MAXEXP)
  75.     {
  76.       r_ = 0;
  77.       r = 0;
  78.       goto ret;
  79.     }
  80.  
  81.   p = 1;
  82.   while (x)
  83.     p *= 10, x--;
  84.   r = (x_) ? (r / p) : (r * p);
  85.  
  86. ret:if (end)
  87.     *end = (char *) s;
  88.  
  89.   return (r_ ? -r : r);
  90. }
  91.