C言語で美咲フォントを扱う1
とりあえずfontx2ファイルを読み込んでヘッダだけ表示してみた。
https://github.com/yuyabu/MisakiFont-sandbox
>./font hdader size is 22 filesignature is FONTX fontname is MISAKI width is 8 hight is 8 char code flg is 1 blocks is 5c start_code is 4081 end_code is 7e81
一応MakeFileも作ってる。 警告マックスのオプションつけてるだけだけど。。。
font:font.c font.h gcc -W -Wall -o font font.c
まずはヘッダを定義している構造体。こういうファイルフォーマットのヘッダって多分誰かがすでに作っているけど、自分で書いて見た
typedef struct{ char filesignature[6]; char fontname[8]; char font_w; char font_h; char char_code_flg; char blocks; char start_code[2]; char end_code[2]; } fontx2header;
情報を出力している箇所のみコードで出してみる
//この書き方はできないみたい。filesignatureの開始アドレスからnull文字までが全部出てしまう。 //printf("filesignature is %s",header.filesignature); char temp[100];//ポインタで用意すると色々トラブル発生 strncpy(temp,header.filesignature,5); printf("filesignature is %s\n" ,temp ); strncpy(temp,header.fontname,7); printf("fontname is %s\n" ,temp ); printf("width is %x\n" ,header.font_w ); printf("hight is %x\n" ,header.font_h ); printf("char code flg is %x\n" ,header.char_code_flg); printf("blocks is %x\n" ,header.blocks ); //配列をそのまま16進数で表示する方法がわからないのでかなり頭の悪いやり方でやってる printf("start_code is %x%x\n" ,(unsigned char)header.start_code[0] ,(unsigned char)header.start_code[1]); printf("end_code is %02x%02x\n" ,(unsigned char)header.end_code[0] ,(unsigned char)header.end_code[1] );
char配列をprintfで16進数表示する方法がわからないので かなりアドホックなコードを書いた。
//配列をそのまま16進数で表示する方法がわからないのでかなり頭の悪いやり方でやってる printf("start_code is %x%x\n" ,(unsigned char)header.start_code[0] ,(unsigned char)header.start_code[1]); printf("end_code is %02x%02x\n" ,(unsigned char)header.end_code[0] ,(unsigned char)header.end_code[1] );
文字列を表示のためだけにバッファする変数はchar配列にすると色々面倒が起きずにすむ。
char temp[100];//ポインタで用意すると色々トラブル発生
ポインタにしたり、ポインタにして文字で初期化したものをtempに使って 変更を加えたりするとbus errorがでる。
多分静的変数領域に確保されて 実行時に変更できないという意味だと思う。
配列だとheapにできるので実行時に変更できる、のだと思う。
C言語ちょっと勉強してから空いてたり、色々他にも学んでいるせいで(Goとか) 文法など間違いまくるが、ググり直せばすぐかけるようになるし、 エラー見て大体トラブルシュートできるようになった。 少なくとも総当たりでいじってデバッグみたいなことはなくなった。
やっぱりちゃんと勉強しておいてよかったC言語。
次回はコンソールに美咲フォントを出力して見たい
情報源
fontx2の情報 http://elm-chan.org/docs/dosv/fontx.html https://qiita.com/meketen/items/a66c6953b3cff380d9b8
C言語でファイル読み書き http://wisdom.sakura.ne.jp/programming/c/c43.html http://simd.jugem.jp/?eid=50