stdio.c 2.19 KB
#ifdef __CCT__
extern int putc(char c);
#define neg(i) -i
#define UINT(i) i
#define _DIGITS "0123456789ABCDEF"
#define _STR "65536"
#else
extern int putchar(int c);
#define putc(c) putchar(c)
#define neg(i) ~i + 1
#define UINT(i) (unsigned int)(i)
#define _DIGITS _digits
char _digits[17] = "0123456789ABCDEF";
#define _STR _str
char _str[6] = "65536";
#endif

int puts(char *s) {
  int n;
  int i;
  n = 0;
  i = 0;
  while (1) {
    if (s[i]) {
      n += putc(s[i]);
      i += 1;
    } else {
      break;
    }
  }
  return n;
}

#define ICHAR 105
#define SCHAR 115
#define UCHAR 117
#define XCHAR 120
#define PERCENT 37
#define MINUS 45
  
int putu(int u, char f) {
  char *DIGITS;
  char *str;
  int div;
  int r;
  int n;
  int p;
  DIGITS = _DIGITS;
  str = _STR;
  n = 0;
  p = 0;
  if (f == XCHAR) {
    div = 16;
  } else {
    div = 10;
  }
  while (u) {
    r = u % div;
    str[p] = DIGITS[r];
    p += 1;
    u = u / div;
  }
  p -= 1;
  while (p >= 0) {
    n += putc(str[p]);
    p -= 1;
  }
  return n;
} 

int puti(int i) {
  int n;
  int s;
  int r;
  n = 0;
  if (UINT(i) > 32767) {
    n += putc(MINUS);
    n += putu(neg(i), UCHAR);
    return n;
  } else {
    return putu(i, UCHAR);
  }
}

int printf(char *str, ...) {
  int n;
  int i;
  int a;
  int *iargs;
  char **cargs;
  iargs = &str;
  cargs = &str;
  a = 1;
  n = 0;
  i = 0;
  while (1) {
    if (str[i] == 0) {
      break;
    } else if (str[i] == PERCENT) {
      i += 1;
      if (str[i] == ICHAR) {
        n += puti(iargs[a]);
      } else if (str[i] == UCHAR) {
        n += putu(iargs[a], UCHAR);
      } else if (str[i] == SCHAR) {
        n += puts(cargs[a]);
      } else if (str[i] == XCHAR) {
        n += putu(iargs[a], XCHAR);
      } else if (str[i] == PERCENT) {
        n += putc(PERCENT);
        i += 1;
        continue;
      } else {
        n += putc(PERCENT);
        n += putc(str[i]);
      }
      a += 1;
    } else {
      n += putc(str[i]);
    }
    i += 1;
  }
  return n;
}

int main() {
  puts("hello world\n");
  puti(42);
  puts(" => 42\n");
  puti(-42);
  puts(" => -42\n");
  putu(42, XCHAR);
  puts(" => 2A\n");
  putu(42, UCHAR);
  puts(" => 42\n");
  printf("hello %s I'm %u (%x)\n", "stdio", 42, 42);
  return 0;
}