home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / program / lynxlib / atoi.c < prev    next >
C/C++ Source or Header  |  1993-10-23  |  4KB  |  167 lines

  1. /* This source file is part of the LynxLib miscellaneous library by
  2. Robert Fischer, and is Copyright 1990 by Robert Fischer.  It costs no
  3. money, and you may not make money off of it, but you may redistribute
  4. it.  It comes with ABSOLUTELY NO WARRANTY.  See the file LYNXLIB.DOC
  5. for more details.
  6. To contact the author:
  7.     Robert Fischer \\80 Killdeer Rd \\Hamden, CT   06517   USA
  8.     (203) 288-9599     fischer-robert@cs.yale.edu                 */
  9.  
  10. #include <stddef.h>
  11. /* Routines for converting between integers and strings */
  12. /* By Robert Fischer March 23, 1987 */
  13. /* ---------------------------------------------------- */
  14. #define BETWEEN(ch, low, high) ((ch) >= (low) && (ch) <= (high))
  15. int digit(ch)
  16. int ch;
  17. {
  18.     if (BETWEEN(ch, '0', '9')) return ch - '0';
  19.     if (BETWEEN(ch, 'a', 'z')) return ch - 'a' + 10;
  20.     if (BETWEEN(ch, 'A', 'Z')) return ch - 'A' + 10;
  21.     return -1;
  22. }
  23.  
  24. char find_char(digit)
  25. int digit;
  26. {
  27.     if (BETWEEN(digit, 0, 9)) return (char)(digit + (int)'0');
  28.     return (char)(digit - 10 + (int)'A');
  29. }
  30.  
  31. /*---------------------------------------------------*/
  32. BOOLEAN natoi(stringg, base, result)
  33. char *stringg;
  34. int base;
  35. int *result;
  36. /* Returning a FALSE indicates an error. */
  37. {
  38. int i;
  39. int dig;
  40. int number;
  41. BOOLEAN er;
  42. BOOLEAN neg;
  43. char *c;
  44.  
  45.     er = FALSE;
  46.     neg = FALSE;
  47.     number = 0;
  48.  
  49.     for (c = stringg; *c != NIL; c++) {
  50.         if (stringg[i] == '-') neg = TRUE;
  51.         else {
  52.             dig = digit((int)(*c));
  53.             if ((dig >= base) || (dig == -1)) er = TRUE;
  54.             else number = base*number + dig;
  55.         }
  56.     }
  57.  
  58.     if (!er) {
  59.         if (neg) *result = -number;
  60.         else *result = number;
  61.     }
  62.     return !er;
  63. }
  64. /*----------------------------------------------------------------*/
  65. BOOLEAN natol(stringg, base, result)
  66. char *stringg;
  67. int base;
  68. long *result;
  69. /* Returning a FALSE indicates an error. */
  70. {
  71. int i;
  72. int dig;
  73. long number;
  74. BOOLEAN er;
  75. BOOLEAN neg;
  76. char *c;
  77.  
  78.     er = FALSE;
  79.     neg = FALSE;
  80.     number = 0;
  81.  
  82.     for (c = stringg; *c != NIL; c++) {
  83.         if (stringg[i] == '-') neg = TRUE;
  84.         else {
  85.             dig = digit((int)(*c));
  86.             if ((dig >= base) || (dig == -1)) er = TRUE;
  87.             else number = base*number + dig;
  88.         }
  89.     }
  90.  
  91.     if (!er) {
  92.         if (neg) *result = -number;
  93.         else *result = number;
  94.     }
  95.     return !er;
  96. }
  97. /*----------------------------------------------------------------*/
  98. /* Converts integer to string of specified length.          */
  99. /* Fills with leading zeros.                      */
  100. fitoa(val, len, base, s)
  101. int val, len, base;
  102. char *s;
  103. {
  104.  
  105. int i,d;
  106. int oval;
  107.     oval = val;
  108.     val = abs(val);
  109.     for (i = len-1; i >= 0; i--) {
  110.         d = val % base;
  111.         val = val / base;
  112.         s[i] = find_char(d);
  113.     }
  114.     s[len] = '\0';
  115.     if (oval < 0) s[0] = '-';
  116. }
  117. /*----------------------------------------------------*/
  118. /* Converts unsigned integer to string of specified length.          */
  119. /* Fills with leading zeros.                      */
  120. ufitoa(val, len, base, s)
  121. unsigned val, len, base;
  122. char *s;
  123. {
  124. unsigned d;
  125. int i;
  126.     for (i = len-1; i >= 0; i--) {
  127.         d = val % base;
  128.         val = val / base;
  129.         s[i] = find_char(d);
  130.     }
  131.     s[len] = '\0';
  132. }
  133. /*----------------------------------------------------*/
  134. char *catoi(stringg, base, result)
  135. /* Converts a string to an integer and
  136.     returns *character of 1st non-numeral */
  137. char *stringg;
  138. int base;
  139. int *result;
  140. /* If no number found, doesn't destroy the previous contents of *result */
  141. {
  142. int dig;
  143. int number;
  144. BOOLEAN neg, er;
  145. char *c;
  146.     if (*stringg == NIL) return stringg;
  147.  
  148.     er = FALSE;
  149.     neg = FALSE;
  150.     number = 0;
  151.  
  152.     for (c = stringg; *c != NIL; c++) {
  153.         if (*c == '-') neg = TRUE;
  154.         else {
  155.             dig = digit((int)(*c));
  156.             if ((dig >= base) || (dig == -1)) return c;
  157.             else number = base*number + dig;
  158.         }
  159.     }
  160.  
  161.     if (neg) *result = -number;
  162.     else *result = number;
  163.  
  164.     return c;
  165. }
  166. /* ------------------------------------------------------------------ */
  167.