[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
#!/usr/bin/python # -*- coding: utf-8 -*- # mkfont *** The Python Script making C source from font source file*** # Author : levelfour # Usage : ./mkfont [font src] (-o [c src file]) import sys def caution(msg) : print msg exit() usage = "usage: ./mkfont [font src] (-o [c src file])" error = "error: ./mkfont --help" data = [0] * (16 * 256) argv = sys.argv argc = len(argv) # show help if argv[-1] == "--help" : caution(usage) # too few argument if argc < 2 : caution(error) # wrong argument if argv[1] == "-o" : caution(error) # フォントソースファイルを開く src = open(argv[1], "r") # 出力するCソースファイルを開く if argc >= 4 : if argv[2] == "-o" : dst = open(argv[3], "w") else : dst = open("font.c", "w") i = 0 c = 0 # フォントソースファイルを一行ずつ読む for line in src : if i > 0 : tmp = 0 # 横一列の16進数データ j = 7 while j >= 0 : # "*"->1, "."->0に変換する if line[j] == "*" : tmp += (1 << (7 - j)) j -= 1 # 配列に順番に格納 data[c * 16 + (16 - i)] = tmp i -= 1 # 文字コードを取得 if line[0:4] == "char" : i = 16 c = int(line[7:9], 16) code = "char hankaku[4096] = {" i = 0 for d in data : if i != 0 : code += "," if i % 16 == 0 : code += "\n\t" code += (hex(d)) # 16進数データを文字列に変換 i += 1 code += "\n};" dst.write(code) src.close() dst.close()
char hankaku[4096] = { 0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x38,0x44,0x82,0xaa,0xaa,0x82,0x82,0xaa,0x92,0x44,0x38,0x0,0x0,0x0, 0x0,0x0,0x38,0x7c,0xfe,0xd6,0xd6,0xfe,0xfe,0xd6,0xee,0x7c,0x38,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x6c,0xfe,0xfe,0xfe,0x7c,0x38,0x10,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x10,0x38,0x7c,0xfe,0x7c,0x38,0x10,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x10,0x38,0x54,0xfe,0x54,0x10,0x38,0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x10,0x38,0x7c,0xfe,0xd6,0x10,0x38,0x0,0x0,0x0,0x0,0x0, ...(以下省略)
int lsprintf(char *str, const char *fmt, ...) { int *arg = (int *)(&str + 2); // 可変個引数の配列 int cnt, i, argc = 0; char buf[20]; const char *p = fmt; for(cnt = 0; *p != '\0'; p++) { if(*p == '%') { strcls(buf); // バッファの初期化 // フォーマット指定子の場合は引数の数値を文字列へ変換 switch(p[1]) { case 'd': int2dec(buf, arg[argc++]); break; case 'x': int2hex(buf, arg[argc++]); break; } // 変換した数値を生成文字列にコピー for(i = 0; buf[i] != '\0'; i++,cnt++) *str++ = buf[i]; p++; } else { // フォーマット指定子以外はそのままコピー *str++ = *p; cnt++; } } return cnt; } // ヌル文字で埋める void strcls(char *str) { while(*str != '\0') *str++ = '\0'; } // 数値を16進数文字列に変換する void int2hex(char *s, int value) { s[0] = '0', s[1] = 'x'; int i, filter = 0x0000000f; s += 2; for(i = 0; i < 8; i++) { if(((value >> (7-i)*4) & filter) >= 10) { *s++ = 'A' + ((value >> (7-i)*4) & filter) - 10; } else { *s++ = '0' + ((value >> (7-i)*4) & filter); } } *s = '\0'; } // 10進数valueのn桁目を返す int figure(int value, int n) { int i; for(i = 0; i < n-1; i++) value /= 10; return value % 10; } // 数値を10進数文字列に変換する void int2dec(char *s, int value) { int i; char zero = 1; for(i = 0; i < 10; i++) { if(zero && figure(value, 10-i) != 0) zero = 0; if(!zero) *s++ = '0' + figure(value, 10-i); } }
ついでに、Makefileのldのオプションがごちゃごちゃ多くて目障りなので、こっちに持ってきました。OUTPUT_FORMAT("binary")
ENTRY("Main")
SECTIONS {
. = 0x280000;
}
COMMENT
無題
"**.......**OOO*.",
↓
"**........*OOO*.",
無題
細かいながらご指摘ありがとうございます。
修正完了です。