home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Moscow ML 1.31 / source code / mosml / src / runtime / ints.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-07-03  |  1.5 KB  |  82 lines  |  [TEXT/R*ch]

  1. #include <stdio.h>
  2. #include "alloc.h"
  3. #include "fail.h"
  4. #include "memory.h"
  5. #include "mlvalues.h"
  6.  
  7. value int_of_string(s)          /* ML */
  8.      value s;
  9. {
  10.   long res;
  11.   int sign;
  12.   int base;
  13.   char * p;
  14.   int c, d;
  15.  
  16.   p = String_val(s);
  17.   if (*p == 0) failwith("int_of_string");
  18.   sign = 1;
  19.   if (*p == '-') {
  20.     sign = -1;
  21.     p++;
  22.   }
  23.   base = 10;
  24.   if (*p == '0') {
  25.     switch (p[1]) {
  26.     case 'x': case 'X':
  27.       base = 16; p += 2; break;
  28.     case 'o': case 'O':
  29.       base = 8; p += 2; break;
  30.     case 'b': case 'B':
  31.       base = 2; p += 2; break;
  32.     }
  33.   }
  34.   res = 0;
  35.   while (1) {
  36.     c = *p;
  37.     if (c >= '0' && c <= '9')
  38.       d = c - '0';
  39.     else if (c >= 'A' && c <= 'F')
  40.       d = c - 'A' + 10;
  41.     else if (c >= 'a' && c <= 'f')
  42.       d = c - 'a' + 10;
  43.     else
  44.       break;
  45.     if (d >= base) break;
  46.     res = base * res + d;
  47.     p++;
  48.   }
  49.   if (*p != 0)
  50.     failwith("int_of_string");
  51.   return Val_long(sign < 0 ? -res : res);
  52. }
  53.  
  54. value format_int(fmt, arg)      /* ML */
  55.      value fmt, arg;
  56. {
  57.   char format_buffer[32];
  58.   int prec;
  59.   char * p;
  60.   char * dest;
  61.   value res;
  62.  
  63.   prec = 32;
  64.   for (p = String_val(fmt); *p != 0; p++) {
  65.     if (*p >= '0' && *p <= '9') {
  66.       prec = atoi(p) + 5;
  67.       break;
  68.     }
  69.   }
  70.   if (prec <= sizeof(format_buffer)) {
  71.     dest = format_buffer;
  72.   } else {
  73.     dest = stat_alloc(prec);
  74.   }
  75.   sprintf(dest, String_val(fmt), Long_val(arg));
  76.   res = copy_string(dest);
  77.   if (dest != format_buffer) {
  78.     stat_free(dest);
  79.   }
  80.   return res;
  81. }
  82.