home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / word2x0a.zip / source / scan_num.cc < prev    next >
C/C++ Source or Header  |  1997-04-10  |  1KB  |  77 lines

  1. /* $Id: scan_num.cc,v 1.4 1997/04/10 20:42:47 dps Exp $ */
  2. /* Simple number analyser */
  3. #define __EXCLUDE_READER_CLASSES
  4. #include "lib.h"
  5.  
  6. num_info scan_num(const char *scan)
  7. {
  8.     int nd, p;
  9.     num_info r;
  10.  
  11.     r.wd[0]=r.wd[1]=r.has_sign=nd=0;
  12.     p=1;
  13.  
  14.     switch (*scan)
  15.     {
  16.     case '-':
  17.     case '+':
  18.     scan++;
  19.     r.wd[0]++;
  20.     p++;
  21.     r.has_sign=1;
  22.     break;
  23.  
  24.     case '0':
  25.     case '1':
  26.     case '2':
  27.     case '3':
  28.     case '4':
  29.     case '5':
  30.     case '6':
  31.     case '7':
  32.     case '8':
  33.     case '9':
  34.     break;
  35.  
  36.     default:
  37.     r.dot_pos=-1;
  38.     return r;
  39.     }
  40.  
  41.     for ( ; *scan!='\0'; scan++, p++)
  42.     {
  43.     switch (*scan)
  44.     {
  45.     case '0':
  46.     case '1':
  47.     case '2':
  48.     case '3':
  49.     case '4':
  50.     case '5':
  51.     case '6':
  52.     case '7':
  53.     case '8':
  54.     case '9':
  55.         r.wd[nd]++;    // Digit
  56.         break;
  57.  
  58.     case '.':
  59.         r.dot_pos=p;
  60.         if ((++nd)==1)
  61.         break;
  62.         /* Fall through */
  63.     default:
  64.         r.dot_pos=-1;
  65.         return r;
  66.     }
  67.     }
  68.     if (r.wd[0]+r.wd[1]<=r.has_sign)
  69.     {
  70.     r.dot_pos=-1;
  71.     return r;
  72.     }
  73.     if (nd==0)
  74.     r.dot_pos=p;
  75.     return r;
  76. }
  77.