// SPDX-License-Identifier: Unlicense #include #include #include #include // ロケールの指定は必須 #define FIELDS 64 #define BUFSIZE 4096 #define NAME_F 0 // 氏名(姓) #define NAME_L 1 // 氏名(名) #define TITLE 4 // 敬称 #define NAME_L2 5 // 家族名1(名) #define TITLE2 6 // 家族名1の敬称 #define ZIP_H 11 // 自宅郵便番号 #define ADDR_H1 12 // 自宅住所1 #define ADDR_H2 13 // 自宅住所2 static wchar_t *tokenize(wchar_t *input, wchar_t **next) { wchar_t *p; if (*input == L'\0') return NULL; p = wcschr(input, L','); if (p == NULL) { *next = input + wcslen(input); } else { *p = L'\0'; *next = p + 1; } return input; } /* 数字の漢数字化、アルファベットの全角化、縦書き対応文字への変換 */ static wchar_t get_kanjinum(wchar_t c) { wchar_t *t; static wchar_t input[] = L"0123456789" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "-"; static wchar_t output[] = L"〇一二三四五六七八九" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "‐"; t = wcschr(input, c); if (t == NULL) return c; else return *(output + (t - input)); } static void to_kanjinum_str(wchar_t *out, wchar_t *in) { int i; for (i = 0; i < wcslen(in); i++) out[i] = get_kanjinum(in[i]); out[i] = L'\0'; } /* 空白文字列の作成 */ static void make_blank(wchar_t *out, int len) { int i; for (i = 0; i < len; i++) out[i] = L' '; out[i] = L'\0'; } /* 文字数の固定 */ static void force_chars(wchar_t *out, wchar_t *in, int chars) { int i; wcscpy(out, in); for (i = wcslen(out); i < chars; i++) out[i] = L' '; out[chars] = L'\0'; } /* 特定県名の省略 */ static void omit_pref(wchar_t *out, wchar_t *in) { wchar_t pref[] = L"神奈川県"; wchar_t *p; p = wcsstr(in, pref); if (p != NULL) { wcscpy(out, in + wcslen(pref)); } else wcscpy(out, in); } static void do_line(wchar_t *buf) { int i, name_max, name_len, name_len2; wchar_t *p[FIELDS], *t; wchar_t tmp[BUFSIZE], tmp2[BUFSIZE]; /* コメントアウトされていた場合は何もしない */ if (*buf == L'#') return; memset(p, 0, sizeof(p)); /* 行末のCRは削除 */ t = wcschr(buf, 0x0d); if (t != NULL) *t = '\0'; t = buf; for (i = 0; i < FIELDS; i++) { p[i] = tokenize(t, &t); if (p[i] == NULL) break; } name_len = wcslen(p[NAME_L]); name_len2 = wcslen(p[NAME_L2]); name_max = (name_len > name_len2) ? name_len : name_len2; wprintf(L"\\addaddress\n"); force_chars(tmp, p[NAME_L], name_max); wprintf(L" {%ls %ls} {%ls}\n", p[NAME_F], tmp, p[TITLE]); wprintf(L" {%ls}\n", p[ZIP_H]); to_kanjinum_str(tmp, p[ADDR_H1]); omit_pref(tmp2, tmp); wprintf(L" {%ls}\n", tmp2); to_kanjinum_str(tmp, p[ADDR_H2]); wprintf(L" {%ls}\n", tmp); if (name_len2) { make_blank(tmp, wcslen(p[NAME_F])); force_chars(tmp2, p[NAME_L2], name_max); wprintf(L" {%ls %ls} {%ls}\n", tmp, tmp2, p[TITLE2]); } else wprintf(L" {} {}\n"); } int main(int argc, char *argv[]) { wchar_t buf[BUFSIZE]; FILE *fp; if (argc < 2) { wprintf(L"%s [filename]\n", argv[0]); goto fin0; } setlocale(LC_ALL, "ja_JP.UTF-8"); fp = fopen(argv[1], "r"); if (fp == NULL) { printf("file open error\n"); goto fin0; } wprintf(L"\\documentclass[]{jletteraddress}\n"); wprintf(L"%%\\renewcommand{\\familydefault}{\\sfdefault}\n"); wprintf(L"%%\\renewcommand{\\kanjifamilydefault}{\\gtdefault}\n"); wprintf(L"\\sendername{}\n"); wprintf(L"\\senderaddressa{}\n"); wprintf(L"\\senderaddressb{}\n"); wprintf(L"\\senderpostcode{}\n"); wprintf(L"\\begin{document}\n"); while (fgetws((buf), sizeof(buf), fp) != NULL) do_line(buf); wprintf(L"\\end{document}\n"); fclose(fp); fin0: return 0; }