home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / program / 316 / libsrc / sfguts.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-10-20  |  3.0 KB  |  151 lines

  1.  
  2. /* zzz fix these... */
  3. /* scanf routines */
  4.  
  5. #include <stdio.h>
  6.  
  7. fscanf(f, fmt, args) FILE *f; char *fmt; int *args; {
  8.     extern char *_sfcp;
  9.     extern FILE *_sffp;
  10.     _sffp = f;
  11.     _sfcp = NULL;
  12.     return _dosf(fmt, &args);
  13. }
  14.  
  15. scanf(fmt, args) char *fmt; int *args; {
  16.     extern char *_sfcp;
  17.     extern FILE *_sffp;
  18.     _sffp = stdin;
  19.     _sfcp = NULL;
  20.     return _dosf(fmt, &args);
  21. }
  22.  
  23. sscanf(s, fmt, args) char *s; char *fmt; int *args; {
  24.     extern char *_sfcp;
  25.     extern FILE *_sffp;
  26.     _sffp = NULL;
  27.     _sfcp = s;
  28.     return _dosf(fmt, &args);
  29. }
  30.         
  31. _dosf(fmt, args) char *fmt; int **args; {
  32.     int assigned, wid, lng, skip, *ip, f, c, m, base;
  33.     long n, *lp;
  34.     char *cp;
  35.     assigned = 0;
  36.     c = _sfget();
  37.     while ((f = *fmt++) && c != EOF) {
  38.         if (f <= ' ') { /* skip spaces */
  39.             while (c <= ' ' && c != EOF)
  40.                 c = _sfget();
  41.         }
  42.         else if (f != '%') { /* match character */
  43.             if (c != f) 
  44.                 return assigned;
  45.         }
  46.         else    {
  47.             wid = lng = skip = 0;
  48.             if ((f = *fmt++) == '*') { /* skip assignment */
  49.                 skip++;
  50.                 f = *fmt++;
  51.             }
  52.             while (f >= '0' && f <= '9') { /* width of value */
  53.                 wid = wid * 10 + f - '0';
  54.                 f = *fmt++;
  55.             }
  56.             if (f == 'l') { /* long */
  57.                 lng++;
  58.                 f = *fmt++;
  59.             }
  60.             else if (f == 'h') { /* short */
  61.                 f = *fmt++;
  62.             }
  63.             switch (f) { /* conversion spec */
  64.             case '%':
  65.                 if (c != '%') return assigned;
  66.                 c = _sfget();
  67.                 break;
  68.             case 'c':
  69.                 if (wid == 0) {
  70.                     cp = (char * )*args++;
  71.                     if (!skip) {
  72.                         *cp = c;
  73.                         assigned++;
  74.                     }
  75.                     c = _sfget();
  76.                     break;
  77.                 }
  78.             case 's':
  79.                 cp = (char * )*args++;
  80.                 while (c <= ' ' && c != EOF)
  81.                     c = _sfget();
  82.                 while (c > ' ' && c != EOF) {
  83.                     if (!skip) *cp++ = c;
  84.                     c = _sfget();
  85.                     if (--wid == 0) break;
  86.                 }
  87.                 *cp = 0;
  88.                 if (!skip) assigned++;
  89.                 break;
  90.             case 'D': case 'X': case 'O':
  91.                 lng = 1;
  92.                 f = f - 'A' + 'a';
  93.             case 'd': case 'x': case 'o':
  94.                 base = (f == 'x' ? 16 : f == 'o' ? 8 : 10);
  95.                 n = 0L;
  96.                 while (c != EOF && c <= ' ')
  97.                     c = _sfget();
  98.                 if ((m = _sfnum(c, base)) < 0)
  99.                     return assigned;
  100.                 do    {
  101.                     n = n * base + m;
  102.                     c = _sfget();
  103.                     m = _sfnum(c, base);
  104.                     if (--wid == 0) break;
  105.                 } while (m >= 0);
  106.                 if (!skip) {
  107.                     if (lng) {
  108.                         lp = (long * )*args++;
  109.                         *lp = n;
  110.                     }
  111.                     else    {
  112.                         ip = *args++;
  113.                         *ip = n;
  114.                     }
  115.                     assigned++;
  116.                 }
  117.                 break;
  118.             case 'e': case 'f': case 'E': case 'F':
  119.                 /* no floats implemented */
  120.                 return -2;
  121.             default:
  122.                 return assigned;
  123.             }
  124.         }
  125.     }
  126.     return f == 0 ? assigned : EOF;
  127. }
  128.  
  129.  
  130. _sfnum(c, base) {
  131.     if (c >= '0' && c <= '9')
  132.         return c - '0';
  133.     else if (base == 16 && c >= 'a' && c <= 'f')
  134.         return c - 'a' + 10;
  135.     else if (base == 16 && c >= 'A' && c <= 'F')
  136.         return c - 'A' + 10;
  137.     else     return -1;
  138. }
  139.  
  140. _sfget() {
  141.     extern char *_sfcp;
  142.     extern FILE *_sffp;
  143.     if (_sffp) return getc(_sffp);
  144.     if (_sfcp && *_sfcp) return *_sfcp++;
  145.     return EOF;
  146. }
  147.  
  148. char *_sfcp;    /* char pointer for scanf input string */
  149. FILE *_sffp;    /* FILE pointer for scanf input stream */
  150.  
  151.