JIS -> SJISへの変換プログラム

眠いのでソースだけとりあえず(あとから説明かく)

#include <iostream>
#include <cstdlib>

#define ESC 0x1B

void jisToSjis(int *h, int *l){
   if(*h & 1){
      if(*l < 0x60) *l +=  0x1F;
      else *l += 0x20;
   }
   else *l += 0x7E;
   if(*h < 0x5F) *h = (*h + 0xE1) >> 1;
   else *h = (*h + 0x161) >> 1;
}

int main(void){
	int c, d;
	enum {FALSE, TRUE} jiskanji = FALSE;

	while ((c = getchar()) != EOF) {
		if (c == ESC) {
			if ((c = getchar()) == '$') {
				if ((c = getchar()) == '@' || c == 'B') {
					jiskanji = TRUE;  
				} else {
					putchar(ESC);  putchar('$');
					if (c != EOF) putchar(c);
				}
			} else if (c == '(') {
				if ((c = getchar()) == 'H' || c == 'J') {
					jiskanji = FALSE;  
				} else {
					putchar(ESC);  putchar('(');
					if (c != EOF) putchar(c);
				}
			} else if (c == 'K') {
				jiskanji = TRUE;  
			} else if (c == 'H') {
				jiskanji = FALSE; 
			} else {
				putchar(ESC);  if (c != EOF) putchar(c);
			}
		} else if (jiskanji && c >= 0x21 && c <= 0x7E) {
			if ((d = getchar()) >= 0x21 && d <= 0x7E)
			    jisToSjis(&c, &d);
			putchar(c);  if (d != EOF) putchar(d);
		} else if (c >= 0xA1 && c <= 0xFE) {
			if ((d = getchar()) >= 0xA1 && d <= 0xFE) {
				d &= 0x7F;  c &= 0x7F;  jisToSjis(&c, &d);
			}
			putchar(c);  if (d != EOF) putchar(d);
		} else putchar(c);
	}
	return 0;
}