home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_100 / 162_01 / atof.c < prev    next >
Text File  |  1985-08-21  |  1KB  |  56 lines

  1. /*    file atof.c    */
  2. /*    convert ASCII string to float    */
  3. #asm
  4.     NAME    ('ATOF')
  5. #endasm
  6.  
  7. extern    float    fmten(),fdten();
  8. static float    val, power,xpow,xval;
  9. static int    c,sign,exp,xsign;
  10. static    char    *pc0;
  11. float atof(s)    /* convert string s to float */
  12. char    s[];
  13. {
  14.     pc0 = &s[0];
  15.     while((c = *pc0) == ' ' || c == '\n' || c == '\t')
  16.         pc0++;        /* skip white space */
  17.     xsign =1;
  18.     xval = exp = 0;
  19.     comlup(s);
  20.     sign = xsign;
  21.     xpow = exp = 1;
  22.     if(c == '.')
  23.         comlup(s);
  24.     val= xval;
  25.     power = xpow;
  26.     xsign = 1;
  27.     if(c == 'e' || c == 'E'){
  28.         xval = exp = 0;
  29.         xpow = xsign = 1;
  30.         comlup(s);
  31.         exp = xval * xsign;
  32.         if(xsign == 1) {
  33.             while(exp-- > 0) {
  34.                 power = fdten(power);
  35.             }
  36.         }
  37.         else {
  38.             while(exp++ < 0) {
  39.                 power =fmten(power);
  40.             }
  41.         }
  42.     }
  43.     return(sign * val / power);
  44. }
  45. comlup()    /* common loop */
  46. {
  47.     if((c = *pc0) == '+' || c == '-') {        /* sign */
  48.         ++pc0;
  49.         xsign = (c == '+') ? 1 : -1;
  50.     }
  51.     while(( c = *pc0++) >= '0' && c <= '9') {
  52.         xval = fmten(xval) + (c - '0');
  53.         xpow = fmten(xpow);
  54.     }
  55. }
  56.