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

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

元より長くなるので上書きは不可。
*/

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

int rjcstring(unchar *src,int size,unchar *des,unchar escc)
/* size : srcのサイズ(\0も変換可能なので、EOSによらない）*/
/*        size=0のときはEOSまで */
{
unchar c;
int len=0,i;
	if (size==0) size=strlen(src);
	for (i=0;i<size;i++) {
		c=*src++;
		if (check_kanji1(c)) { /* 漢字 */
			if (check_moji(c,*src,0)) { /* 漢字として不適格 */
				/* 2ﾊﾞｲﾄ目が無い時時も含む */
				goto NODISP;
			}
			des[len++]=c;
			des[len++]=*src++;
			i++;
			continue;
		}
		if (c==escc && escc!=0) { /* エスケープ文字 */
			/* ２回続ける */
			des[len++]=c;
			des[len++]=c;
			continue;
		}
		if (check_moji(0,c,0)) {
		  NODISP:;
		    /* 表示出来ない文字 -> エスケープ文字で復元 */
		    des[len++]=escc;
		    switch (c) { /* 特殊文字は小文字のみ有効 */
			default:
				des[len++]='x';
				make_hex2(c,&des[len],1);
				len+=2;
				continue;
			case 0x07:/* \a bell */
				c='a';
				break;
			case 0x08:/* \b backspace */
				c='b';
				break;
			case 0x09:/* \t TAB */
				c='t';
				break;
			case 0x0a:/* \n 改行 */
				c='n';
				break;
			case 0x0c:/* \f feed */
				c='f';
				break;
			case 0x0d:/* \r 復帰 */
				c='r';
				break;
			case 0x1b:/* \e esc */
				c='e';
				break;
			case 0x1a:/* \z EOF */
				c='z';
				break;
			case 0x00:/* \0 EOS */
				/* 終端の\0は出さない */
				if (i==size-1) {
					/* すでに書き込まれているesccも消して終了 */
					len--;
					goto END;
				}
				c='0';
				break;
		    }
		} /* 表示出来る文字はそのまま表示 */
		des[len++]=c;
	}
    END:;
	des[len]=0; /* EOS */
	/* 変換後の文字列長を返す=strlen(des) */
	return(len);
}

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