[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*.",
無題
細かいながらご指摘ありがとうございます。
修正完了です。