BEGIN{ #東雲フォントや出水フォントなど適宜指定する font8x16="font\\shinonome\\shnm8x16.bdf"; #8x16ドットフォントファイル # font8x16="font\\shinonome\\shnm8x16r.bdf"; #8x16ドットフォントファイル # font8x16="font\\izumi\\izumi-uv16.bdf"; #8x16ドットフォントファイル font16x16="font\\shinonome\\shnmk16.bdf"; #16x16ドットフォントファイル # font16x16="font\\shinonome\\shnmk16b.bdf"; #16x16ドットフォントファイル # font16x16="font\\izumi\\izmg16-2004-1.bdf"; #16x16ドットフォントファイル } { # 色(白), 色(緑), 色(赤青)などの行は色指定のための制御コマンド if($0~/^[  \t]*色(.*)[  \t]*$/ || $0~/^[  \t]*色(.*)[  \t]*$/){ if($0~/白/) print "#define _WHITE"; if($0~/紫/) print "#define _MAGENTA"; if($0~/青/) print "#define _BLUE"; if($0~/緑/) print "#define _GREEN"; if($0~/赤/) print "#define _RED"; NR--; }else mes[NR]=$0; # 各行の行末に10文字スペースを追加 } END{ NMES=NR; for(i=1;i<=NMES;i++){ patt[i]=0; if(mes[i]~/\$$/){patt[i]+=1; mes[i]=substr(mes[i],1,length(mes[i])-1);} else mes[i]=mes[i] " "; if(mes[i]~/^\^/){patt[i]+=2; mes[i]=substr(mes[i],2,length(mes[i]));} for(j=1;j<=jlength(mes[i]);j++) count[jsubstr(mes[i],j,1)]++; } for(c in count){ if(length(c)==1){ # 1バイト文字 for(j=0;j<256;j++) if(sprintf("%c",j)==c){ code[c]=j; # code["A"]=65; char[j]=c; # char[65]="A"; } }else{ # 2バイト文字ならJISコードに変換 # for(j=0;j<256;j++){ # jgawk 2.15.2 # if(sprintf("%c",j)==substr(c,1,1)) sjis1=j; # if(sprintf("%c",j)==substr(c,2,1)) sjis2=j; # } for(i=128;i<256;i++)for(j=0;j<256;j++) # gawk 3.0.6 mb1.15 if(sprintf("%c%c",i,j)==c){sjis1=i; sjis2=j; break;} jis1=sjis1; jis2=sjis2; jis1*=2; if(jis1>=256) jis1-=256; if(jis2<159){ if(jis1<63) jis1+=31; else jis1-=97; if(jis2>126)jis2-=32; else jis2-=31; }else{ if(jis1<63) jis1+=32; else jis1-=96; jis2-=126; } jcode[c]=jis1*256+jis2; # jcode["あ"]=... jchar[jis1*256+jis2]=c; # jchar[...]="あ" } } print "prog_uint8_t font8[][16]={ // 8x16 font table"; for(i=0;getline0;){ if($1=="STARTCHAR"){ MODE=1; hex=$2;} else if(MODE==1 && $1=="ENCODING"){ if($2 in char){ # 1バイト文字 icode[char[$2]]=i++; # icode["A"]=0 MODE=2; c=$2+0; if(c<32 || c>=127&&c<=160 || c>=224) MODE=0; }else MODE=0; }else if(MODE==2 && $1=="BITMAP"){ MODE=3; s=""; } else if(MODE==3 && $1!="ENDCHAR") s=s "0x" $0 ","; else if(MODE==3){ MODE=0; printf("\t%s\t//%c(%s)\n",s,c,hex);} } print "};"; print "prog_uint16_t font16[][16]={ // 16x16 font table"; for(i=128;getline0;){ if($1=="STARTCHAR"){ MODE=1; hex=$2; } else if(MODE==1 && $1=="ENCODING"){ if($2 in jchar){ # 2バイト文字 icode[jchar[$2]]=i++; # icode["あ"]=128; MODE=2; c=$2; j=jchar[$2]; }else MODE=0; }else if(MODE==2 && $1=="BITMAP"){ MODE=3; s=""; } else if(MODE==3 && $1!="ENDCHAR") s=s "0x" $0 ","; else if(MODE==3){ MODE=0; printf("\t%s\t// %s(%s)\n",s,j,hex);} } print "};"; for(i=1;i<=NMES;i++) print "//prog_uint8_t mes" (i-1) "[]=\"" mes[i] "\";"; for(i=1;i<=NMES;i++){ printf "prog_uint8_t mes" (i-1) "[]={"; for(j=1;j<=jlength(mes[i]);j++) printf icode[jsubstr(mes[i],j,1)] ","; print "255};"; # 255は終端記号 } printf "prog_uint8_t *mes[]={"; for(i=1;i<=NMES;i++) printf "(prog_uint8_t *)mes" (i-1) ","; print "};"; printf "prog_uint8_t patt[]={"; for(i=1;i<=NMES;i++) printf patt[i] ","; print "};"; print "#define NMES " NMES; }