/* * RJIS ( Recover JIS code from broken file ) * $Header: rjis.c,v 0.2 92/09/04 takahasi Exp $ * Copyright (C) 1992 * Hironobu Takahashi (takahasi@tiny.or.jp) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either versions 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with KAKASI, see the file COPYING. If not, write to the Free * Software Foundation Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* $Log: rjis.c,v $ * */ #include FILE *input, *output; extern void exit(); main(argc, argv) int argc; char *argv[]; { int i; input = stdin; output = stdout; for (i = 1; i < argc; ++ i) { if (argv[i][0] == '-') { usage(argv); exit(0); } else { if (input == stdin) { if ((input = fopen(argv[i], "r")) == NULL) { perror(argv[i]); exit(1); } } else { if ((output = fopen(argv[i], "w")) == NULL) { perror(argv[i]); exit(1); } break; } } } process(); return 0; } usage(argv) char *argv[]; { fprintf(stderr, "Usage:\n"); fprintf(stderr, "\n"); fprintf(stderr, " Recover: %s [input_file [output_file]]\n", argv[0]); fprintf(stderr, "\n"); } process() { int c1, c2, c3, c4; for(;;) { /* stage 1 (ascii or jisroman) */ while((c1 = getc(input)) != EOF) { if (c1 == '$') { c2 = getc(input); if ((c2 == '@') || (c2 == 'B')) { /* start kanji proc */ c3 = getc(input); c4 = getc(input); if (maybekanji(c3, c4)) { putc('\033', output); putc(c1, output); putc(c2, output); putc(c3, output); putc(c4, output); break; } else { putc(c1, output); putc(c2, output); putc(c3, output); putc(c4, output); } } else { putc(c1, output); putc(c2, output); } } else { putc(c1, output); } } if (c1 == EOF) return; /* stage 2 (kanji) */ while((c1 = getc(input)) != EOF) { c2 = getc(input); if ((c1 == '(') && ((c2 == 'B') || (c2 == 'J'))) { putc('\033', output); putc(c1, output); putc(c2, output); break; } putc(c1, output); putc(c2, output); } if (c1 == EOF) return; } } int maybekanji(c1, c2) int c1, c2; { if ((c2 < 33) || (c2 > 126)) return 0; if ((c1 < 33) || ((40 < c1) && (c1 < 48)) || (116 < c1)) return 0; c2 -= 32; switch(c1-32) { case 2: if ((14 < c2) && ( c2 < 26)) return 0; if ((33 < c2) && ( c2 < 42)) return 0; if ((48 < c2) && ( c2 < 60)) return 0; if ((74 < c2) && ( c2 < 82)) return 0; if ((89 < c2) && ( c2 < 94)) return 0; break; case 3: if (c2 < 16) return 0; if ((25 < c2) && ( c2 < 33)) return 0; if ((58 < c2) && ( c2 < 65)) return 0; if (90 < c2) return 0; break; case 4: if (83 < c2) return 0; break; case 5: if (86 < c2) return 0; break; case 6: if ((24 < c2) && ( c2 < 33)) return 0; if (56 < c2) return 0; break; case 7: if ((33 < c2) && ( c2 < 49)) return 0; if (81 < c2) return 0; break; case 8: if (32 < c2) return 0; break; case 47: if (51 < c2) return 0; break; case 84: if (6 < c2) return 0; break; } return 1; }