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

  1. #ifdef __STDC__
  2. static char sccs_id[] = "@(#) strtol.c 1.3 " __DATE__ " HJR";
  3. #else
  4. static char sccs_id[] = "@(#) strtol.c 1.3 26/9/90 HJR";
  5. #endif
  6.  
  7. /* strtol.c (c) Copyright 1990 H.Rogers */
  8.  
  9. #include <ctype.h>
  10. #ifdef __STDC__
  11. #include <stdlib.h>
  12. #else
  13. extern int atoi ();
  14. extern long atol ();
  15. extern long strtol ();
  16. extern unsigned long strtoul ();
  17. #endif
  18.  
  19. #ifdef __STDC__
  20. int (atoi) (register const char *s)
  21. #else
  22. int (atoi) (s)
  23.      register const char *s;
  24. #endif
  25. {
  26.   return (atoi (s));
  27. }
  28. #ifdef __STDC__
  29. long (atol) (register const char *s)
  30. #else
  31. long (atol) (s)
  32.      register const char *s;
  33. #endif
  34. {
  35.   return (atol (s));
  36. }
  37.  
  38. #define digit(x)    (((x) > '9') ? (((x) & 31) + 9) : ((x) - '0'))
  39.  
  40. #ifdef __STDC__
  41. long
  42. strtol (register const char *s, char **end, register int b)
  43. #else
  44. long
  45. strtol (s, end, b)
  46.      register const char *s;
  47.      char **end;
  48.      register int b;
  49. #endif
  50. {
  51.   register long r = 0L;
  52.   register int r_ = 0, d;
  53.  
  54.   if (!s)
  55.     return (r);
  56.  
  57.   while (isspace (*s))
  58.     s++;
  59.  
  60.   if (*s == '+' || *s == '-')
  61.     {
  62.       if (*s == '-')
  63.     r_ = 1;
  64.       s++;
  65.     }
  66.  
  67.   if (!b)
  68.     {
  69.       if (*s == '0')
  70.     {
  71.       s++;
  72.       b = 010;
  73.       if (*s == 'x')
  74.         {
  75.           s++;
  76.           b = 0x10;
  77.         }
  78.     }
  79.       else
  80.     b = 10;
  81.     }
  82.   else if (b == 16)
  83.     if (*s == '0' && *++s == 'x')
  84.       s++;
  85.  
  86.   while (d = digit (*s), d >= 0 && d < b)
  87.     {
  88.       r = r * (long) b + (long) d;
  89.       s++;
  90.     }
  91.  
  92.   if (end)
  93.     *end = (char *) s;
  94.  
  95.   return (r_ ? -r : r);
  96. }
  97.  
  98. #ifdef __STDC__
  99. unsigned long
  100. strtoul (register const char *s, char **end, register int b)
  101. #else
  102. unsigned long
  103. strtoul (s, end, b)
  104.      register const char *s;
  105.      char **end;
  106.      register int b;
  107. #endif
  108. {
  109.   register unsigned long r = 0;
  110.   register int d;
  111.  
  112.   if (!s)
  113.     return (r);
  114.  
  115.   while (isspace (*s))
  116.     s++;
  117.  
  118.   if (!b)
  119.     {
  120.       if (*s == '0')
  121.     {
  122.       s++;
  123.       b = 010;
  124.       if (*s == 'x')
  125.         {
  126.           s++;
  127.           b = 0x10;
  128.         }
  129.     }
  130.       else
  131.     b = 10;
  132.     }
  133.   else if (b == 16)
  134.     if (*s == '0' && *++s == 'x')
  135.       s++;
  136.  
  137.   while (d = digit (*s), d >= 0 && d < b)
  138.     {
  139.       r = r * (unsigned long) b + (unsigned long) d;
  140.       s++;
  141.     }
  142.  
  143.   if (end)
  144.     *end = (char *) s;
  145.  
  146.   return (r);
  147. }
  148.