utf82ascii

ソースコードのマルチバイト文字がUTF-8だと、VCでコンパイルできないので作成。

#include <stdio.h>

#define NATIVE(c) ((~(c) & 0x80) == 0x80)
#define UTF8_2BYTES(c) ((~(c) & 0x20) == 0x20)
#define UTF8_3BYTES(c) ((~(c) & 0x10) == 0x10)
#define UTF8_4BYTES(c) ((~(c) & 0x08) == 0x08)
#define UTF8_5BYTES(c) ((~(c) & 0x04) == 0x04)
#define UTF8_6BYTES(c) ((~(c) & 0x02) == 0x02)
#define UTF8_7BYTES(c) ((~(c) & 0x01) == 0x01)

static void puts_utf8(int c, FILE *fin, FILE *fout) {
  int n;

  n = UTF8_2BYTES(c) ? 2 :
      UTF8_3BYTES(c) ? 3 :
      UTF8_4BYTES(c) ? 4 :
      UTF8_5BYTES(c) ? 5 :
      UTF8_6BYTES(c) ? 6 :
      UTF8_7BYTES(c) ? 7 : 0;

  fprintf(fout, "\\x%x", c);

  for (; n > 1; n--) {
    c = fgetc(fin);
    fprintf(fout, "\\x%x", c);
  }
}

static void skip_bom(FILE *fin, FILE *fout) {
  int c;

  if ((c = fgetc(fin)) != 0xef) {
    ungetc(c, fin);
    return;
  }

  fputc(c, fout);
  c = fgetc(fin); fputc(c, fout);
  c = fgetc(fin); fputc(c, fout);
}

int main() {
  int c;

  skip_bom(stdin, stdout);

  while ((c = fgetc(stdin)) != EOF) {
    if (NATIVE(c)) {
      fputc(c, stdout);
    } else {
      puts_utf8(c, stdin, stdout);
    }
  }

  return 0;
}