home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / file39a.zip / src / localsrc / strtol.c < prev   
C/C++ Source or Header  |  1993-04-10  |  2KB  |  122 lines

  1. /*
  2.  * strtol - convert string to long integer.
  3.  *
  4.  * Written by reading the System V Interface Definition, not the code.
  5.  *
  6.  * Totally public domain.
  7.  *
  8.  * Compile with -DTEST to get short interactive main() for testing.
  9.  */
  10.  
  11. #include <stdio.h>
  12. #include <ctype.h>
  13.  
  14. long
  15. strtol(s, p, b)
  16. char    *s, **p;
  17. int    b;
  18. {
  19.     int    base = 10, sign = 1, valid = 1;
  20.     long    n = 0;
  21.  
  22.     /*
  23.      * leading sign?
  24.      */
  25.     if (*s=='-')
  26.         sign=(-1);
  27.     else
  28.         sign=1;
  29.     if (*s=='+' || *s=='-')
  30.         ++s; /* skip sign */
  31.  
  32.     /*
  33.      * what base are we really using?
  34.      */
  35.     if (b == 0) {
  36.         if (strncmp(s, "0x", 2) == 0  ||
  37.             strncmp(s, "0X", 2) == 0) {
  38.             s += 2;
  39.             base = 16;
  40.         } else
  41.             if (*s == '0')
  42.                 base = 8;
  43.     }
  44.  
  45.     /*
  46.      * convert the string to a number.
  47.      */
  48.     while (isascii(*s) && valid) {
  49.         switch(*s) {
  50.         case '0':
  51.         case '1':
  52.         case '2':
  53.         case '3':
  54.         case '4':
  55.         case '5':
  56.         case '6':
  57.         case '7':
  58.             n = base*n  +  *s-'0';
  59.             break;
  60.         case '8':
  61.         case '9':
  62.             if (base >8)
  63.                 n = base*n  +  *s-'0';
  64.             else
  65.                 valid = 0;
  66.             break;
  67.         case 'a':
  68.         case 'b':
  69.         case 'c':
  70.         case 'd':
  71.         case 'e':
  72.         case 'f':
  73.             if (base == 16)
  74.                 n = base*n + *s-'a'+10;
  75.             else
  76.                 valid = 0;
  77.             break;
  78.         case 'A':
  79.         case 'B':
  80.         case 'C':
  81.         case 'D':
  82.         case 'E':
  83.         case 'F':
  84.             if (base == 16)
  85.                 n = base*n + *s-'A'+10;
  86.             else
  87.                 valid = 0;
  88.             break;
  89.         default:
  90.             valid = 0;
  91.             break;
  92.         }
  93.         if (valid)
  94.             ++s;
  95.     }
  96.  
  97.     /*
  98.      * if arg `p' (N.B. NOT *p) is not NULL, a ptr to the
  99.      * character terminating the scan will be returned in `p'.
  100.      */
  101.     if (p != NULL)
  102.         *p = s;
  103.  
  104.     return sign * n;
  105. }
  106.  
  107. #ifdef    TEST
  108. main(argc, argv)
  109. int argc;
  110. char **argv;
  111. {
  112.     int i;
  113.     long j, strtol();
  114.  
  115.     for (i=1; i<argc; i++) {
  116.         j = strtol(argv[i], 0, 0);
  117.         printf("%s -> %ld(%lx)\n", argv[i], j, j);
  118.     }
  119.     exit(0);
  120. }
  121. #endif    /*TEST*/
  122.