/* Subject: Re: bdf merge In-Reply-To: Your message of "Tue, 18 May 93 17:53:14 JST." <9305180853.AA10344@gohan.nff.ncl.omron.co.jp> Date: Tue, 18 May 93 18:02:07 JST From: Jun Arai >> fj.kanji で、アナウンスのあった、和田研の TYPE-1 フォントをカッティン >> グして、補助漢字の 24ドットの bdf を作ったんですが、もとのフォントが、 >> 区毎に別れていたんで、それらをマージしたいと思っています。 >> そんなツール、dogo-font のために作りませんでした? 非常に、いい加減なものですが、あります。 完全な bdfに、部分的なbdfをマージします。 完全と言うのは、文字が全て含まれていることを意味します。 # ヘッダ部分を書き換えていないし、もともとの方に、そのコードの文字が #存在しないとマージしない。 # それに、コード順にならんでいることも仮定している。 % marge-font font.bdf ku.bdf とすれば、stdoutに出てきます。 新井 */ /* 和田研フォントから作った、区毎の BDF をマージできるように超手抜きで、 変更しました。使い方は、 前準備 (1)wftopfa で、pfa フォーマットに換える。 (2)fonts.scale を作って、mkfontdir ---- fonts.scale --- 62 min-1-30.pfa -wadalab-mincho-medium-r-normal--0-0-0-0-c-0-jisx0212.1990-30 min-1-31.pfa -wadalab-mincho-medium-r-normal--0-0-0-0-c-0-jisx0212.1990-31 min-1-32.pfa -wadalab-mincho-medium-r-normal--0-0-0-0-c-0-jisx0212.1990-32 .... min-1-6d.pfa -wadalab-mincho-medium-r-normal--0-0-0-0-c-0-jisx0212.1990-6d ------ (3)フォントサーバのコンフィグに、追加して、fs を立ち上げる。 (4)fstobdf で、フォントサーバから、bdf フォーマットで取り出す。 例えば、 KU="30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d" FN=min-1 BASE_FN=-wadalab-mincho-medium-r-normal--24-0-0-0-c-0-jisx0212.1990 for ku in $KU do fstobdf -fn $BASE_FN-$ku > $FN-$ku.bdf done (5)最後の区に、ない字が入ってるから削る。 #これって、fs のバグかな? (6)で、やっとこのプログラムの登場。:-) こんな感じで使います。 KU="31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d" FN=min-1 BASE_FN=-wadalab-mincho-medium-r-normal--24-0-0-0-c-0-jisx0212.1990 bdfmerge -30 $FN-30.bdf > $FN.bdf for ku in $KU do bdfmerge $FN.bdf -$ku FN-$ku.bdf > tmp mv tmp $FN.bdf done sed -e s/CHARS\ 94/CHARS\ `grep STARTCHAR *.bdf | wc -l`/ $FN.bdf */ #include #include #define XK_LATIN1 #include #define BUFSIZE 4096 static int obase = 0; static int ibase = 0; get_start_char(str, base) char *str; int base; { int code; int i; char ptr[100]; for (i = 0; *str; i++, str++) { if (isspace(*str) || *str == '\n') { ptr[i] = 0; break; } ptr[i] = *str; } if (strcmp(ptr, "exclam") == 0) { code = base * 0x100 + XK_exclam; } else if (strcmp(ptr, "quotedbl") == 0) { code = base * 0x100 + XK_quotedbl; } else if (strcmp(ptr, "numbersign") == 0) { code = base * 0x100 + XK_numbersign; } else if (strcmp(ptr, "dollar") == 0) { code = base * 0x100 + XK_dollar; } else if (strcmp(ptr, "percent") == 0) { code = base * 0x100 + XK_percent; } else if (strcmp(ptr, "ampersand") == 0) { code = base * 0x100 + XK_ampersand; } else if (strcmp(ptr, "apostrophe") == 0) { code = base * 0x100 + XK_apostrophe; } else if (strcmp(ptr, "parenleft") == 0) { code = base * 0x100 + XK_parenleft; } else if (strcmp(ptr, "parenright") == 0) { code = base * 0x100 + XK_parenright; } else if (strcmp(ptr, "asterisk") == 0) { code = base * 0x100 + XK_asterisk; } else if (strcmp(ptr, "plus") == 0) { code = base * 0x100 + XK_plus; } else if (strcmp(ptr, "comma") == 0) { code = base * 0x100 + XK_comma; } else if (strcmp(ptr, "minus") == 0) { code = base * 0x100 + XK_minus; } else if (strcmp(ptr, "period") == 0) { code = base * 0x100 + XK_period; } else if (strcmp(ptr, "slash") == 0) { code = base * 0x100 + XK_slash; } else if (strcmp(ptr, "0") == 0) { code = base * 0x100 + XK_0; } else if (strcmp(ptr, "1") == 0) { code = base * 0x100 + XK_1; } else if (strcmp(ptr, "2") == 0) { code = base * 0x100 + XK_2; } else if (strcmp(ptr, "3") == 0) { code = base * 0x100 + XK_3; } else if (strcmp(ptr, "4") == 0) { code = base * 0x100 + XK_4; } else if (strcmp(ptr, "5") == 0) { code = base * 0x100 + XK_5; } else if (strcmp(ptr, "6") == 0) { code = base * 0x100 + XK_6; } else if (strcmp(ptr, "7") == 0) { code = base * 0x100 + XK_7; } else if (strcmp(ptr, "8") == 0) { code = base * 0x100 + XK_8; } else if (strcmp(ptr, "9") == 0) { code = base * 0x100 + XK_9; } else if (strcmp(ptr, "colon") == 0) { code = base * 0x100 + XK_colon; } else if (strcmp(ptr, "semicolon") == 0) { code = base * 0x100 + XK_semicolon; } else if (strcmp(ptr, "less") == 0) { code = base * 0x100 + XK_less; } else if (strcmp(ptr, "equal") == 0) { code = base * 0x100 + XK_equal; } else if (strcmp(ptr, "greater") == 0) { code = base * 0x100 + XK_greater; } else if (strcmp(ptr, "question") == 0) { code = base * 0x100 + XK_question; } else if (strcmp(ptr, "at") == 0) { code = base * 0x100 + XK_at; } else if (strcmp(ptr, "A") == 0) { code = base * 0x100 + XK_A; } else if (strcmp(ptr, "B") == 0) { code = base * 0x100 + XK_B; } else if (strcmp(ptr, "C") == 0) { code = base * 0x100 + XK_C; } else if (strcmp(ptr, "D") == 0) { code = base * 0x100 + XK_D; } else if (strcmp(ptr, "E") == 0) { code = base * 0x100 + XK_E; } else if (strcmp(ptr, "F") == 0) { code = base * 0x100 + XK_F; } else if (strcmp(ptr, "G") == 0) { code = base * 0x100 + XK_G; } else if (strcmp(ptr, "H") == 0) { code = base * 0x100 + XK_H; } else if (strcmp(ptr, "I") == 0) { code = base * 0x100 + XK_I; } else if (strcmp(ptr, "J") == 0) { code = base * 0x100 + XK_J; } else if (strcmp(ptr, "K") == 0) { code = base * 0x100 + XK_K; } else if (strcmp(ptr, "L") == 0) { code = base * 0x100 + XK_L; } else if (strcmp(ptr, "M") == 0) { code = base * 0x100 + XK_M; } else if (strcmp(ptr, "N") == 0) { code = base * 0x100 + XK_N; } else if (strcmp(ptr, "O") == 0) { code = base * 0x100 + XK_O; } else if (strcmp(ptr, "P") == 0) { code = base * 0x100 + XK_P; } else if (strcmp(ptr, "Q") == 0) { code = base * 0x100 + XK_Q; } else if (strcmp(ptr, "R") == 0) { code = base * 0x100 + XK_R; } else if (strcmp(ptr, "S") == 0) { code = base * 0x100 + XK_S; } else if (strcmp(ptr, "T") == 0) { code = base * 0x100 + XK_T; } else if (strcmp(ptr, "U") == 0) { code = base * 0x100 + XK_U; } else if (strcmp(ptr, "V") == 0) { code = base * 0x100 + XK_V; } else if (strcmp(ptr, "W") == 0) { code = base * 0x100 + XK_W; } else if (strcmp(ptr, "X") == 0) { code = base * 0x100 + XK_X; } else if (strcmp(ptr, "Y") == 0) { code = base * 0x100 + XK_Y; } else if (strcmp(ptr, "Z") == 0) { code = base * 0x100 + XK_Z; } else if (strcmp(ptr, "bracketleft") == 0) { code = base * 0x100 + XK_bracketleft; } else if (strcmp(ptr, "backslash") == 0) { code = base * 0x100 + XK_backslash; } else if (strcmp(ptr, "bracketright") == 0) { code = base * 0x100 + XK_bracketright; } else if (strcmp(ptr, "asciicircum") == 0) { code = base * 0x100 + XK_asciicircum; } else if (strcmp(ptr, "underscore") == 0) { code = base * 0x100 + XK_underscore; } else if (strcmp(ptr, "grave") == 0) { code = base * 0x100 + XK_grave; } else if (strcmp(ptr, "a") == 0) { code = base * 0x100 + XK_a; } else if (strcmp(ptr, "b") == 0) { code = base * 0x100 + XK_b; } else if (strcmp(ptr, "c") == 0) { code = base * 0x100 + XK_c; } else if (strcmp(ptr, "d") == 0) { code = base * 0x100 + XK_d; } else if (strcmp(ptr, "e") == 0) { code = base * 0x100 + XK_e; } else if (strcmp(ptr, "f") == 0) { code = base * 0x100 + XK_f; } else if (strcmp(ptr, "g") == 0) { code = base * 0x100 + XK_g; } else if (strcmp(ptr, "h") == 0) { code = base * 0x100 + XK_h; } else if (strcmp(ptr, "i") == 0) { code = base * 0x100 + XK_i; } else if (strcmp(ptr, "j") == 0) { code = base * 0x100 + XK_j; } else if (strcmp(ptr, "k") == 0) { code = base * 0x100 + XK_k; } else if (strcmp(ptr, "l") == 0) { code = base * 0x100 + XK_l; } else if (strcmp(ptr, "m") == 0) { code = base * 0x100 + XK_m; } else if (strcmp(ptr, "n") == 0) { code = base * 0x100 + XK_n; } else if (strcmp(ptr, "o") == 0) { code = base * 0x100 + XK_o; } else if (strcmp(ptr, "p") == 0) { code = base * 0x100 + XK_p; } else if (strcmp(ptr, "q") == 0) { code = base * 0x100 + XK_q; } else if (strcmp(ptr, "r") == 0) { code = base * 0x100 + XK_r; } else if (strcmp(ptr, "s") == 0) { code = base * 0x100 + XK_s; } else if (strcmp(ptr, "t") == 0) { code = base * 0x100 + XK_t; } else if (strcmp(ptr, "u") == 0) { code = base * 0x100 + XK_u; } else if (strcmp(ptr, "v") == 0) { code = base * 0x100 + XK_v; } else if (strcmp(ptr, "w") == 0) { code = base * 0x100 + XK_w; } else if (strcmp(ptr, "x") == 0) { code = base * 0x100 + XK_x; } else if (strcmp(ptr, "y") == 0) { code = base * 0x100 + XK_y; } else if (strcmp(ptr, "z") == 0) { code = base * 0x100 + XK_z; } else if (strcmp(ptr, "braceleft") == 0) { code = base * 0x100 + XK_braceleft; } else if (strcmp(ptr, "bar") == 0) { code = base * 0x100 + XK_bar; } else if (strcmp(ptr, "braceright") == 0) { code = base * 0x100 + XK_braceright; } else if (strcmp(ptr, "asciitilde") == 0) { code = base * 0x100 + XK_asciitilde; } else if (strcmp(ptr, "hyphen") == 0) { code = base * 0x100 + XK_minus; } else { code = 0; } return (code); } next_char(in, out, base) FILE *in, *out; int base; { int code; char *ptr; char buffer[BUFSIZE]; while(1){ if(fgets(buffer, BUFSIZE, in) == NULL){ return EOF; } if(strncmp(buffer, "STARTCHAR", 9) == 0){ ptr = &buffer[9]; while(isspace(*ptr)) ptr++; code = 0; /*******************************/ code = get_start_char(ptr, base); if (code == 0) { /*******************************/ while(isxdigit(*ptr)){ code *= 16; if(isdigit(*ptr)) code += *ptr - '0'; else if(isupper(*ptr)) code += *ptr - 'A' + 10; else code += *ptr - 'a' + 10; ptr++; } } if(fgets(buffer, BUFSIZE, in) == NULL){ return EOF; } if(strncmp(buffer, "ENCODING", 8) == 0) { ; } else { fputs(buffer, out); } return code; } else if((strncmp(buffer, "ENDFONT", 7) != 0) && (out != NULL)) fputs(buffer, out); } } do_marge(orig, in, out) FILE *orig, *in, *out; { int next, code; int chstart; if (in != NULL) next = next_char(in, NULL, ibase); code = next_char(orig, out, obase); while(1) { if (in == NULL) { fprintf(out, "STARTCHAR %X\n", code); fprintf(out, "ENCODING %d\n", code); code = next_char(orig, out, obase); if (code == EOF) break; } else { if (code == EOF || next < code) { fprintf(out, "STARTCHAR %X\n", next); fprintf(out, "ENCODING %d\n", next); next = next_char(in, out, ibase); } else if (next == EOF || next > code) { fprintf(out, "STARTCHAR %X\n", code); fprintf(out, "ENCODING %d\n", code); code = next_char(orig, out, obase); } else if(code == next){ fprintf(out, "STARTCHAR %X\n", code); fprintf(out, "ENCODING %d\n", code); next = next_char(in, out, ibase); code = next_char(orig, NULL, obase); } if (code == EOF && next == EOF) break; } } fprintf(out, "ENDFONT\n"); } main(argc, argv) int argc; char *argv[]; { FILE *in, *orig; char *cmd = argv[0]; if(argc < 2){ fprintf(stderr, "usage: %s {-offset} bdf-file1 {{-offset} bdf-file2}\n", cmd); exit(10); } argv++; argc--; if (**argv == '-') { sscanf(*argv + 1, "%x", &obase); argv++; argc--; } if(argc < 1){ fprintf(stderr, "usage: %s {-offset} bdf-file1 {{-offset} bdf-file2}\n", cmd); exit(10); } if((orig = fopen(*argv, "r")) == NULL){ fprintf(stderr, "Can't open original file (%s)\n", *argv); exit(20); } argv++; argc--; if (argc > 0 && **argv == '-') { sscanf(*argv + 1, "%x", &ibase); argv++; argc--; } if (argc > 0) in = fopen(*argv, "r"); /* if((in = fopen(argv[2], "r")) == NULL){ fprintf(stderr, "Can't open marge file (%s)\n", argv[2]); exit(30); } */ do_marge(orig, in, stdout); }