/* Ｃ言語ほぼ互換の文字列コード変換を行う（漢字対応）*/
/*
	\a bell		\\ \
	\b backspace	\0 EOS
	\f feed		\xnn   １６進数２桁
	\n 改行
	\r 復帰
	\t TAB

追加されたもの
	\e esc		\z EOF

削除されたもの
	\v
	\nnによる８進数表記
	\"

変更されているもの
	'?はそのまま表記出来る
	１６進数は必ず必要桁数全て記述する

エスケープキャラクターの'\'は変更可能。esccに設定する。
８ビット文字のみ。0を指定するとコード変換しなくなる。

必ず元以下の長さになるので、上書き（src=des）でも構わない。
*/

#include "deftype.h"
#include "acdata.h"

int jcstring(unchar *src,unchar *des,unchar escc)
{
static code[]={ // \? , コードの順
	// よく出てくる順にしているつもり
	 'n',0x0a
	,'t',0x09
	,'r',0x0d
	,'a',0x07
	,'b',0x08
	,'0',0x00
	,'e',0x1b
	,'f',0x0c
	,'z',0x1a
};
#define CODES sizeof(code)
unchar c;
int len=0;
	while ((c=*src++)!=0) {
		if (check_kanji1(c)) { /* 漢字 */
			des[len++]=c;
			/* 漢字２バイト目が無い時は１バイト目だけ入れて終了 */
			if (*src==0) break;
			des[len++]=*src++;
			continue;
		}
		/* １バイト文字 */
		if (c==escc) {
		    c=*src++;
		    if (c==0) break;
		    if (c==escc) { /* エスケープ文字が２つ続く時 */
			des[len++]=c; /* エスケープ文字そのもの */
			continue;
		    }
		    /* 特殊文字は小文字のみ有効 */
		    if (c=='x') { /* \xnn １６進数２桁 */
		      int cc;
			/* ２桁無ければ\xが無視される */
			cc=hval(*src);
			if (cc<0) continue;
			c=cc<<4;
			cc=hval(*(src+1));
			if (cc<0) continue;
			c|=cc;
			src+=2;
		    } else { // その他のコード
		      int i;
			for (i=0;i<CODES;i+=2) {
			    if (c==code[i]) {c=code[i+1]; break;}
			}
		    }
		}
		des[len++]=c;
	}
	des[len]=0; /* EOS */
	/* 変換後の文字列長を返す */
	/* strlen(des)とは必ずしも一致しない（\0があるから）*/
	return(len);
}

#if 0
main()
{
int len;
unchar str[128];
	printf("$a;$b$e[7m文字列ﾃﾞｽsp$e[m$t123\n");
	len=jcstring("$a;$b$e[7m文字列ﾃﾞｽsp$e[m$t123",str,'$');
	printf("str(%d)=%s\n",len,str);
	
	printf("abcdefghijklmn^^0123456789^rABC\n");
	jcstring("abcdefghijklmn^^0123456789^rABC",str,'^');
	printf("%s\n",str);
	
	printf("$xd0$xd1$xd2$xgh\n");
	len=jcstring("$xd0$xd1$xd2$xgh$0人は捜し物を見つけると・・・",str,'$');
	printf("%s\n",str);
}
#endif
