#include <stdio.h>

char str[7], check[7];
char *ptr;

void MINUS(void) {
  *ptr++ = '-';
}

void show_digit(short int n) {
  *ptr++ = n+'0';
}

void print16(short int num) {
  int zeroes, digit;
  ptr = str;
  // max -32768
  if (num >= 0) num = -num; else MINUS();
  zeroes = 0;
  // max 14 add/subtracts...
  digit = 0;
  if (num <= -20000) { num += 20000; digit += 2; zeroes = 1; }
  if (num <= -10000) { num += 10000; digit += 1; zeroes = 1; }
  if (zeroes) show_digit(digit);
  digit = 0;
  if (num <= -8000) { num += 8000; digit += 8; zeroes = 1; } else if (num <= -4000) { num += 4000; digit += 4; zeroes = 1; }
  if (num <= -2000) { num += 2000; digit += 2; zeroes = 1; }
  if (num <= -1000) { num += 1000; digit += 1; zeroes = 1; }
  if (zeroes) show_digit(digit);
  digit = 0;
  if (num <= -800) { num += 800; digit += 8; zeroes = 1; } else if (num <= -400) { num += 400; digit += 4; zeroes = 1; }
  if (num <= -200) { num += 200; digit += 2; zeroes = 1; }
  if (num <= -100) { num += 100; digit += 1; zeroes = 1; }
  if (zeroes) show_digit(digit);
  digit = 0;
  if (num <= -80) { num += 80; digit += 8; zeroes = 1; } else if (num <= -40) { num += 40; digit += 4; zeroes = 1; }
  if (num <= -20) { num += 20; digit += 2; zeroes = 1; }
  if (num <= -10) { num += 10; digit += 1; zeroes = 1; }
  if (zeroes) show_digit(digit);
  show_digit(-num);
  *ptr = '\0';
}

int main(void) {
  int n, mismatches = 0;
  for (n = -32768; n <= 32767; n++) {
    print16((short int)n);
    sprintf(check, "%0d", n);
    if (strcmp(str, check) != 0) {
      fprintf(stderr, "Mismatch: '%s' vs '%s'\n", str, check);
      mismatches++;
    }
  }
  if (mismatches == 0) fprintf(stderr, "All correct!\n");
  fflush(stderr);
  return 0;
}
