80 lines · 1.5 KB · C
RawDownload
#include <stdio.h>#include <stdlib.h>#include "alloc.h"#include "fail.h"#include "memory.h"#include "mlvalues.h" value int_of_string(value s)          /* ML */{  long res;  int sign;  int base;  char * p;  int c, d;   p = String_val(s);  if (*p == 0) failwith("int_of_string");  sign = 1;  if (*p == '-') {    sign = -1;    p++;  }  base = 10;  if (*p == '0') {    switch (p[1]) {    case 'x': case 'X':      base = 16; p += 2; break;    case 'o': case 'O':      base = 8; p += 2; break;    case 'b': case 'B':      base = 2; p += 2; break;    }  }  res = 0;  while (1) {    c = *p;    if (c >= '0' && c <= '9')      d = c - '0';    else if (c >= 'A' && c <= 'F')      d = c - 'A' + 10;    else if (c >= 'a' && c <= 'f')      d = c - 'a' + 10;    else      break;    if (d >= base) break;    res = base * res + d;    p++;  }  if (*p != 0)    failwith("int_of_string");  return Val_long(sign < 0 ? -res : res);} value format_int(value fmt, value arg)      /* ML */{  char format_buffer[32];  int prec;  char * p;  char * dest;  value res;   prec = 32;  for (p = String_val(fmt); *p != 0; p++) {    if (*p >= '0' && *p <= '9') {      prec = atoi(p) + 5;      break;    }  }  if (prec <= sizeof(format_buffer)) {    dest = format_buffer;  } else {    dest = stat_alloc(prec);  }  sprintf(dest, String_val(fmt), Long_val(arg));  res = copy_string(dest);  if (dest != format_buffer) {    stat_free(dest);  }  return res;}