jbanner は, 日本語を含む文字列を拡大し, バナーとして画面に表示するコマンドです。
Revision | 7f7a845d77e91b80195513f6f0b1b34e4e7d32df (tree) |
---|---|
Time | 2004-01-19 18:01:27 |
Author | tfuruka1 <tfuruka1> |
Commiter | tfuruka1 |
リビジョン管理をRCSからCVSへ変更しました。
@@ -0,0 +1,161 @@ | ||
1 | +/* -*- mode: c++; coding: sjis-dos; -*- | |
2 | + * Time-stamp: <2003-06-01 15:29:26 tfuruka1> | |
3 | + * Copyright (C) 2003 Tadamegu Furukawa | |
4 | + * | |
5 | + * 共通モジュール | |
6 | + * | |
7 | + * $Id: comm.c,v 1.1 2004/01/19 09:01:28 tfuruka1 Exp $ | |
8 | + * $Log: comm.c,v $ | |
9 | + * Revision 1.1 2004/01/19 09:01:28 tfuruka1 | |
10 | + * リビジョン管理をRCSからCVSへ変更しました。 | |
11 | + * | |
12 | + * Revision 1.1 2003/06/01 08:23:11 tfuruka1 | |
13 | + * Initial revision | |
14 | + * | |
15 | + */ | |
16 | +#include <windows.h> | |
17 | +#include <stdio.h> | |
18 | + | |
19 | +#ifndef CYGWIN | |
20 | +# include <mbstring.h> | |
21 | +#else | |
22 | +# include <sys/types.h> | |
23 | +# include <winsock.h> | |
24 | +#endif | |
25 | + | |
26 | +/*-------------------------------------------------------------------- | |
27 | + * Unixのbasenameと同じ。返却するポインタは一時的なポインタなので、必 | |
28 | + * ずコピーして使用する必要がある。 | |
29 | + * *-------------------------------------------------------------------*/ | |
30 | +LPCTSTR WINAPI | |
31 | +BaseName(LPCTSTR lpszPath) | |
32 | +{ | |
33 | + LPCTSTR a, b; | |
34 | +#ifdef _MSC_VER | |
35 | + a = _mbsrchr(lpszPath, '\\'); | |
36 | + b = _mbsrchr(lpszPath, '/'); | |
37 | +#else | |
38 | + a = strchr(lpszPath, '\\'); | |
39 | + b = strchr(lpszPath, '/'); | |
40 | +#endif | |
41 | + | |
42 | + if (a == b) { // 等しい時は NULLしかない | |
43 | + return lpszPath; | |
44 | + } | |
45 | + | |
46 | + return ((ULONG)a > (ULONG)b ? a : b) + 1; | |
47 | +} | |
48 | +/*-------------------------------------------------------------------- | |
49 | + * Unixのbasenameと同じ。返却するポインタは一時的なポインタなので、必 | |
50 | + * ずコピーして使用する必要がある。ショートファイル名が指定されても、 | |
51 | + * ロングファイル名へ変換します。 | |
52 | + * *-------------------------------------------------------------------*/ | |
53 | +LPCTSTR WINAPI | |
54 | +GetLongBaseName(LPCTSTR lpszPath) | |
55 | +{ | |
56 | + HANDLE hFile; | |
57 | + static WIN32_FIND_DATA wfd; | |
58 | + | |
59 | + hFile = FindFirstFile(lpszPath, &wfd); | |
60 | + if (INVALID_HANDLE_VALUE == hFile) { | |
61 | + return BaseName(lpszPath); | |
62 | + } | |
63 | + FindClose(hFile); | |
64 | + return wfd.cFileName; | |
65 | +} | |
66 | + | |
67 | +/*-------------------------------------------------------------------- | |
68 | + * dwErrに対応するエラーメッセージを返却する。dwErrはGetLastError()で | |
69 | + * 取得した値を指定する。 | |
70 | + * *-------------------------------------------------------------------*/ | |
71 | +LPCSTR WINAPI | |
72 | +GetLastErrorMessage(LPCSTR lpsz, DWORD dwErr) | |
73 | +{ | |
74 | +#ifdef _WIN32_WCE | |
75 | + static LPTSTR sz = "WindowsCE では GetLastErrorMessage は未サポートです"; | |
76 | + return sz; | |
77 | +#else | |
78 | + static TCHAR sz[1024]; | |
79 | + TCHAR szTmp[256]; | |
80 | + int i; | |
81 | + | |
82 | + if (!(i = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | | |
83 | + FORMAT_MESSAGE_IGNORE_INSERTS, | |
84 | + NULL, dwErr, 0, szTmp, sizeof(szTmp), NULL))) { | |
85 | + strcpy(szTmp, "---"); | |
86 | + } | |
87 | + else { | |
88 | + szTmp[i] = '\0'; | |
89 | + for (i--; 0 <= i; i--) { | |
90 | + if ('\n' == szTmp[i] || '\r' == szTmp[i]) { | |
91 | + szTmp[i] = '\0'; | |
92 | + } | |
93 | + } | |
94 | + } | |
95 | + wsprintf(sz, "[WIN32] %s: Error Code = %d(%#02x): %s", | |
96 | + lpsz, dwErr, dwErr, szTmp); | |
97 | + return (LPCTSTR)sz; | |
98 | +#endif | |
99 | +} | |
100 | + | |
101 | +/*-------------------------------------------------------------------- | |
102 | + * UNIXのSyslogの簡易版。常にdebug.local7しか出力しません。 | |
103 | + * *-------------------------------------------------------------------*/ | |
104 | +VOID WINAPI | |
105 | +Syslogger(BOOL bStdOut, // T:stdoutにも出力 | |
106 | + LPCSTR lpstr, // 書式printfと同じ | |
107 | + ... // 引数 | |
108 | + ) | |
109 | +{ | |
110 | + WSADATA wsaData; | |
111 | + SOCKET finet; | |
112 | + PSERVENT sp; | |
113 | + SOCKADDR_IN sin; | |
114 | + LPHOSTENT lpHost; | |
115 | + va_list args; // 引数展開用 | |
116 | + char szLine[1024 * 64], szBuf[1024], *p; | |
117 | + | |
118 | + // モジュール名のフルパスを得る | |
119 | + if (!GetModuleFileName(GetModuleHandle(NULL), szBuf, 1024)) { | |
120 | + return; | |
121 | + } | |
122 | + // ファイル名部分だけ切り出す | |
123 | + if (NULL == (p = strrchr(szBuf, '\\'))) { | |
124 | + return; | |
125 | + } | |
126 | + // FACILITY = 23, LEVEL = 7 | |
127 | + sprintf(szLine, "<%d>[%s] ", 7 + 23 * 8, p + 1); | |
128 | + | |
129 | + // 文字列を書式に合せて整形する | |
130 | + va_start(args, lpstr); | |
131 | + vsprintf(szLine + strlen(szLine), lpstr, args); | |
132 | + va_end(args); | |
133 | + | |
134 | + if (bStdOut) { | |
135 | + printf("%s\n", szLine); | |
136 | + } | |
137 | + | |
138 | + if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) { | |
139 | + return; | |
140 | + } | |
141 | + | |
142 | + if (0 > (finet = socket(AF_INET, SOCK_DGRAM, 0))) { | |
143 | + return; | |
144 | + } | |
145 | + | |
146 | + lpHost = gethostbyname("localhost"); | |
147 | + | |
148 | + if (NULL == (sp = getservbyname("syslog", "udp"))) { | |
149 | + return; | |
150 | + } | |
151 | + | |
152 | + memset(&sin, 0, sizeof(sin)); | |
153 | + sin.sin_family = AF_INET; | |
154 | + sin.sin_port = htons(sp->s_port); | |
155 | + sin.sin_addr = *((LPIN_ADDR)*lpHost->h_addr_list); | |
156 | + | |
157 | + sendto(finet, szLine, strlen(szLine), 0, (PSOCKADDR)&sin, | |
158 | + sizeof(SOCKADDR)); | |
159 | + closesocket(finet); | |
160 | + WSACleanup(); | |
161 | +} |
@@ -0,0 +1,320 @@ | ||
1 | +/* -*- mode: c++; coding: sjis-dos; -*- | |
2 | + * Time-stamp: <2003-06-07 21:59:35 tfuruka1> | |
3 | + * Copyright (C) 2003 Tadamegu Furukawa | |
4 | + * | |
5 | + * gdiに関連する関数 - 実際にはフォント部分しか存在していないが・・・ | |
6 | + * | |
7 | + * $Id: gdi_wrap.c,v 1.1 2004/01/19 09:01:28 tfuruka1 Exp $ | |
8 | + * $Log: gdi_wrap.c,v $ | |
9 | + * Revision 1.1 2004/01/19 09:01:28 tfuruka1 | |
10 | + * リビジョン管理をRCSからCVSへ変更しました。 | |
11 | + * | |
12 | + * Revision 1.3 2003/06/08 11:22:10 tfuruka1 | |
13 | + * フォントを列挙する関数を追加した。 | |
14 | + * | |
15 | + * Revision 1.2 2003/06/05 13:50:40 tfuruka1 | |
16 | + * ● -c オプションで文字列をできるように修正した事に伴う修正。 | |
17 | + * ● フォントで斜体、ボールド、中線をそのまま反映するように修正。 | |
18 | + * | |
19 | + * Revision 1.1 2003/06/01 08:22:11 tfuruka1 | |
20 | + * Initial revision | |
21 | + * | |
22 | + */ | |
23 | + | |
24 | +#include "jbanner.h" | |
25 | + | |
26 | +/* | |
27 | + * SDK32:コンソールウィンドウのハンドル取得 | |
28 | + * | |
29 | + * 本関数は以下の記事を参考にして作成しました。 | |
30 | + * | |
31 | + * 最終更新日: 1999/02/09 | |
32 | + * 文書番号: J046738 | |
33 | + * | |
34 | + * この資料は以下について記述したものです。 | |
35 | + * | |
36 | + * Microsoft(R) Win32(R) Software Development Kit (SDK) | |
37 | + * | |
38 | + * この資料は、米国 Microsoft Corporation から提供されている Knowledge | |
39 | + * Base の Article ID Q124103 (最終更新日 1988-12-23) をもとに作成した | |
40 | + * ものです。 | |
41 | + */ | |
42 | +#define MY_BUFSIZE 1024 // コンソールのタイトル用 | |
43 | +HWND GetConsoleHwnd(VOID) | |
44 | +{ | |
45 | + HWND hwndFound; | |
46 | + char pszNewWindowTitle[MY_BUFSIZE]; | |
47 | + char pszOldWindowTitle[MY_BUFSIZE]; | |
48 | + int i; | |
49 | + | |
50 | + // コンソールタイトルの取得 | |
51 | + GetConsoleTitle(pszOldWindowTitle, MY_BUFSIZE); | |
52 | + | |
53 | + // 独自に、ウィンドウの新規タイトルをフォーマットします | |
54 | + wsprintf(pszNewWindowTitle,"%d/%d-%s", | |
55 | + GetTickCount(), | |
56 | + GetCurrentProcessId(), | |
57 | + pszOldWindowTitle); | |
58 | + | |
59 | + // 現在のウィンドウタイトルを変更します | |
60 | + SetConsoleTitle(pszNewWindowTitle); | |
61 | + | |
62 | + for (i = 0; i < 100; i++) { | |
63 | + // ウィンドウの新規タイトルを探しにいきます | |
64 | + hwndFound = FindWindow(NULL, pszNewWindowTitle); | |
65 | + if (hwndFound) { | |
66 | + Syslogger(FALSE, "GetConsoleHwnd(): 回数=%d, T=%s", | |
67 | + i, pszNewWindowTitle); | |
68 | + break; // 見つかった | |
69 | + } | |
70 | + Sleep(10); // 10m Wait | |
71 | + } | |
72 | + | |
73 | + // 元のウィンドウタイトルへ戻します | |
74 | + SetConsoleTitle(pszOldWindowTitle); | |
75 | + | |
76 | + return hwndFound; | |
77 | +} | |
78 | + | |
79 | + | |
80 | +/* | |
81 | + * フォント関連の処理(う〜ん。汚い処理だにゃ。C++でクラス化した方が良 | |
82 | + * かったな〜) | |
83 | + */ | |
84 | +static LOGFONT lft = {-13, 0, 0, 0, 800, 0, 0, 0, SHIFTJIS_CHARSET, | |
85 | + 3, 2, 1, 49, TEXT("MS ゴシック")}; | |
86 | +static int numCallBack = 0; | |
87 | +static int CALLBACK | |
88 | +EnumFontFamProc( | |
89 | + ENUMLOGFONT FAR *lpelf, // pointer to logical-font data | |
90 | + NEWTEXTMETRIC FAR *lpntm, // pointer to physical-font data | |
91 | + int FontType, // type of font | |
92 | + LPARAM lParam // address of application-defined data | |
93 | + ) | |
94 | +{ | |
95 | + // データが存在しない場合は処理しない | |
96 | + if (!lpelf) { | |
97 | + return 0; | |
98 | + } | |
99 | + | |
100 | + // ------------------------------ | |
101 | + // フォントの作成要求の場合の処理 | |
102 | + // ------------------------------ | |
103 | + if (0 == lParam) { | |
104 | + // 最初以外の呼び出しの場合は処理しない | |
105 | + if (numCallBack) { | |
106 | + return 0; | |
107 | + } | |
108 | + numCallBack++; | |
109 | + | |
110 | + Syslogger(FALSE, "選択フォントファミリ: %s, %s", | |
111 | + lpelf->elfFullName, | |
112 | + (FontType == DEVICE_FONTTYPE) ? "Device-Font" | |
113 | + : ((FontType == RASTER_FONTTYPE) ? "Raster-Font" | |
114 | + : "TrueType-Font")); | |
115 | + | |
116 | + memcpy(&lft, &lpelf->elfLogFont, sizeof(LOGFONT)); | |
117 | + } | |
118 | + else { | |
119 | + // ------------------------ | |
120 | + // フォントの一覧表示の場合 | |
121 | + // ------------------------ | |
122 | + | |
123 | + // フォントの一意な名前, フォントのスタイル, フォントの書体名 | |
124 | + // を表示する | |
125 | + printf("\"%s\"\t\"%s\"\t\"%s\"\n", lpelf->elfFullName, | |
126 | + lpelf->elfStyle, lpelf->elfLogFont.lfFaceName); | |
127 | + } | |
128 | + return 1; | |
129 | +} | |
130 | + | |
131 | +/* | |
132 | + * フォントの一覧を表示する | |
133 | + */ | |
134 | +VOID WINAPI | |
135 | +LsFont(LPTSTR lpszFamily) | |
136 | +{ | |
137 | + HDC hDC = CreateDC("DISPLAY", NULL, NULL, NULL); | |
138 | + EnumFontFamilies(hDC, lpszFamily, (FONTENUMPROC)EnumFontFamProc, 1); | |
139 | + DeleteDC(hDC); | |
140 | +} | |
141 | +/* | |
142 | + * フォントファミリ名からデフォルトの論理フォントを作成する | |
143 | + */ | |
144 | +BOOL WINAPI SetLogFont(LPCTSTR lpszFamily) | |
145 | +{ | |
146 | + HDC hDC = CreateDC("DISPLAY", NULL, NULL, NULL); | |
147 | + | |
148 | + numCallBack = 0; | |
149 | + EnumFontFamilies(hDC, lpszFamily, (FONTENUMPROC)EnumFontFamProc, 0); | |
150 | + DeleteDC(hDC); | |
151 | + return numCallBack; | |
152 | +} | |
153 | + | |
154 | +/* | |
155 | + * フォントを作成する。フォントファミリが変更になる場合は、予め | |
156 | + * SetLogFont関数で論理フォントを初期化し直す必要があります。 | |
157 | + */ | |
158 | +static HFONT WINAPI | |
159 | +CreateBannerFont(int nHeight) | |
160 | +{ | |
161 | + | |
162 | + LOGFONT lf; | |
163 | + | |
164 | + memcpy(&lf, &lft, sizeof(LOGFONT)); | |
165 | + lf.lfHeight = nHeight; | |
166 | + lf.lfWidth = 0; | |
167 | + | |
168 | + return CreateFontIndirect(&lf); | |
169 | +} | |
170 | + | |
171 | +/* | |
172 | + * バナーを描画する。なんらかのエラーが発生した場合は、0(FALSE)を返却 | |
173 | + * し、正常に終了した場合は、0以外(TRUE)を返却します。 | |
174 | + */ | |
175 | +BOOL WINAPI | |
176 | +DrawBanner( | |
177 | + LPTSTR lpszUseChar, // 表示文字 | |
178 | + int nScreenWidth, // 表示幅 | |
179 | + int nFontSize, // フォントサイズ | |
180 | + LPTSTR lpszString, // 表示文字列 | |
181 | + BOOL bDebug // T:デバッグ | |
182 | + ) | |
183 | +{ | |
184 | + HWND hWnd; // ウインドウハンドル | |
185 | + HFONT hFont; // フォント | |
186 | + HFONT hOldFont; // 古いフォント | |
187 | + RECT rc; // 描画粋 | |
188 | + HDC hDC; // デバイスコンテキスト | |
189 | + HDC hMemDC; // デバイスコンテキスト(仮想) | |
190 | + HBITMAP hBitMap; // ビットマップ | |
191 | + HBITMAP hOldBitmap; // 古いビットマップ | |
192 | + | |
193 | + BYTE szLine[MAX_WIDTH]; // バナーの一行 | |
194 | + LPTSTR lpszBgChar; // 背景の文字 | |
195 | + | |
196 | + int x, y, ht; // 幅と高さ | |
197 | + int i; // 汎用 | |
198 | + | |
199 | + // 背景の文字を設定する | |
200 | + if (!(lpszBgChar = malloc(strlen(lpszUseChar + 1)))) { | |
201 | + fprintf(stderr, "メモリの確保に失敗[%s:%d]", __FILE__, __LINE__); | |
202 | + return FALSE; | |
203 | + } | |
204 | + | |
205 | + for (i = 0; (ULONG)i < strlen(lpszUseChar); i++) { | |
206 | + if (isKanjiSJIS(*((LPBYTE)lpszUseChar + i))) { | |
207 | + strcpy(lpszBgChar + i, Z_SPACE); | |
208 | + i++; | |
209 | + } | |
210 | + else { | |
211 | + strcpy(lpszBgChar + i, " "); | |
212 | + } | |
213 | + } | |
214 | + | |
215 | + // ウインドウハンドルの取得 | |
216 | + if (!(hWnd = GetConsoleHwnd())) { | |
217 | + fprintf(stderr, "ウインドウハンドルの取得に失敗しました\n"); | |
218 | + return FALSE; | |
219 | + } | |
220 | + | |
221 | + // 描画粋の設定 | |
222 | + rc.top = rc.left = 0; | |
223 | + rc.right = nScreenWidth; | |
224 | + rc.bottom = nFontSize * 2; // 小文字のgとかの為2倍 | |
225 | + | |
226 | + // デバイスコンテキストの取得 | |
227 | + if (!(hDC = GetDC(hWnd))) { | |
228 | + fprintf(stderr, "デバイスコンテキストの取得に失敗しました。\n"); | |
229 | + return FALSE; | |
230 | + } | |
231 | + | |
232 | + // 仮想デバイスコンテキストを作成する | |
233 | + if (!(hMemDC = CreateCompatibleDC(hDC))) { | |
234 | + fprintf(stderr, "%s\n", | |
235 | + GetLastErrorMessage("CreateCompatibleDC", | |
236 | + GetLastError())); | |
237 | + ReleaseDC(hWnd, hDC); | |
238 | + return FALSE; | |
239 | + } | |
240 | + | |
241 | + // ビットマップの作成 | |
242 | + if (!(hBitMap = CreateBitmap(nScreenWidth, rc.bottom, 1, 1, NULL))) { | |
243 | + fprintf(stderr, "ビットマップの作成に失敗しました\n"); | |
244 | + DeleteDC(hMemDC); // デバイスコンテキスト削除 | |
245 | + ReleaseDC(hWnd, hDC); // デバイスコンテキストの開放 | |
246 | + return FALSE; | |
247 | + } | |
248 | + | |
249 | + // ビットマップの選択 | |
250 | + if (!(hOldBitmap = SelectObject(hMemDC, hBitMap))) { | |
251 | + fprintf(stderr, "ビットマップの選択に失敗しました。\n"); | |
252 | + DeleteDC(hMemDC); // デバイスコンテキスト削除 | |
253 | + DeleteObject(hBitMap); // ビットマップ削除 | |
254 | + ReleaseDC(hWnd, hDC); // デバイスコンテキストの開放 | |
255 | + return FALSE; | |
256 | + } | |
257 | + | |
258 | + // フォントの作成 | |
259 | + if (!(hFont = CreateBannerFont(-nFontSize))) { | |
260 | + fprintf(stderr, "%s\n", | |
261 | + GetLastErrorMessage("CreateFont", GetLastError())); | |
262 | + SelectObject(hMemDC, hOldBitmap); // ビットマップを戻す | |
263 | + DeleteDC(hMemDC); // デバイスコンテキスト削除 | |
264 | + DeleteObject(hBitMap); // ビットマップの削除 | |
265 | + ReleaseDC(hWnd, hDC); // デバイスコンテキストの開放 | |
266 | + return FALSE; | |
267 | + } | |
268 | + | |
269 | + // フォントの選択 | |
270 | + if (!(hOldFont = SelectObject(hMemDC, hFont))) { | |
271 | + fprintf(stderr, "オブジェクトの選択(FONT)に失敗しました。\n"); | |
272 | + DeleteObject(hFont); // フォントの削除 | |
273 | + SelectObject(hMemDC, hOldBitmap); // ビットマップを戻す | |
274 | + DeleteDC(hMemDC); // デバイスコンテキスト削除 | |
275 | + DeleteObject(hBitMap); // ビットマップの削除 | |
276 | + ReleaseDC(hWnd, hDC); // デバイスコンテキスト開放 | |
277 | + return FALSE; | |
278 | + } | |
279 | + | |
280 | + // フォントの色の設定 | |
281 | + SetTextColor(hMemDC, RGB(255, 255, 255)); | |
282 | + SetBkColor(hMemDC, RGB(0, 0, 0)); | |
283 | + | |
284 | + // 描画 | |
285 | + ht = DrawText(hMemDC, lpszString, -1, &rc, | |
286 | + DT_LEFT | DT_TOP | DT_SINGLELINE); | |
287 | + | |
288 | + // デバッグモードの場合はコンソールに転送する | |
289 | + if (bDebug) { | |
290 | + BitBlt(hDC, 0, 0, rc.right, rc.bottom, hMemDC, 0, 0, SRCCOPY); | |
291 | + } | |
292 | + | |
293 | + // バナーに変換する | |
294 | + for (y = 0; y < ht; y++) { | |
295 | + szLine[0] = '\0'; | |
296 | + for (x = 0; x < nScreenWidth; x++) { | |
297 | + strcat(szLine, (0 == GetPixel(hMemDC, x, y)) | |
298 | + ? lpszBgChar : lpszUseChar); | |
299 | + } | |
300 | + printf("%s\n", TrimRightJa(TrimRight(szLine))); | |
301 | + } | |
302 | + | |
303 | + // 後始末 | |
304 | + SelectObject(hMemDC, hOldFont); // フォントを戻す | |
305 | + SelectObject(hMemDC, hOldBitmap); // ビットマップを戻す | |
306 | + ReleaseDC(hWnd, hDC); // デバイスコンテキスト開放 | |
307 | + DeleteObject(hFont); // フォント削除 | |
308 | + DeleteObject(hBitMap); // ビットマップ削除 | |
309 | + DeleteDC(hMemDC); // 仮想DC削除 | |
310 | + | |
311 | + return TRUE; | |
312 | +} | |
313 | + | |
314 | +#if 0 | |
315 | +int main(void) | |
316 | +{ | |
317 | + HWND hWnd = GetConsoleHwnd(); | |
318 | + printf("DBG:TEST:GetConsoleHwnd(): hWnd = %x\n", hWnd); | |
319 | +} | |
320 | +#endif |
@@ -0,0 +1,82 @@ | ||
1 | +/* -*- mode: c++; coding: sjis-dos; -*- | |
2 | + * Time-stamp: <2003-06-08 20:18:00 tfuruka1> | |
3 | + * Copyright (C) 2003 Tadamegu Furukawa | |
4 | + * | |
5 | + * jbannerの唯一のヘッダファイル | |
6 | + * | |
7 | + * $Id: jbanner.h,v 1.1 2004/01/19 09:01:28 tfuruka1 Exp $ | |
8 | + * $Log: jbanner.h,v $ | |
9 | + * Revision 1.1 2004/01/19 09:01:28 tfuruka1 | |
10 | + * リビジョン管理をRCSからCVSへ変更しました。 | |
11 | + * | |
12 | + * Revision 1.3 2003/06/08 11:18:45 tfuruka1 | |
13 | + * フォントの列挙関数追加に伴うプロトタイプの追加 | |
14 | + * | |
15 | + * Revision 1.2 2003/06/05 13:51:35 tfuruka1 | |
16 | + * ● DrawBanner関数の修正に伴い、プロトタイプを修正 | |
17 | + * | |
18 | + * Revision 1.1 2003/06/01 08:23:29 tfuruka1 | |
19 | + * Initial revision | |
20 | + * | |
21 | + */ | |
22 | +#ifndef _JBANNER_H_ | |
23 | +#define _JBANNER_H_ | |
24 | + | |
25 | +/* | |
26 | + * Cygwinのgccで、日本語を通す為に、以下の文字はコードで埋め込んでいま | |
27 | + * す。 | |
28 | + * | |
29 | + * 表=\x95\x5c | |
30 | + * ソ=\x83\x5c | |
31 | + */ | |
32 | +#define VERSION "jbanner version 1.0\n"\ | |
33 | +" Copyright 2002, 2003 Tadamegu Furukawa\n"\ | |
34 | +" 日本語を含む文字列を拡大し、バナーとして画面に\x95\x5c示します。\n\n"\ | |
35 | +" この\x83\x5cフトウエアはフリー\x83\x5cフトウエアです。転載、"\ | |
36 | +"頒布は入手したアー\n"\ | |
37 | +" カイブのままであれば、自由に行ってください。\n"\ | |
38 | +"\n $Id: jbanner.h,v 1.1 2004/01/19 09:01:28 tfuruka1 Exp $\n" | |
39 | + | |
40 | +#include <windows.h> | |
41 | +#include <stdio.h> | |
42 | + | |
43 | +// 漢字のチェック | |
44 | +#define isKanjiSJIS(c) (((c) >= 0x81 && (c) <= 0x9f) ||\ | |
45 | + ((c) >= 0xe0 && (c) <= 0xfc)) | |
46 | + | |
47 | +#define DEFAULT_WIDTH 80 // デフォルトの表示幅 | |
48 | +#define DEFAULT_CHAR "X" // デフォルトの文字 | |
49 | +#define DEFAULT_FONT TEXT("MS ゴシック") // デフォルトのフォント | |
50 | +#define DEFAULT_FSIZE 16 // デフォルトのフォントサイズ | |
51 | + | |
52 | +#define MAX_WIDTH 1024 // 最大表示幅 | |
53 | + | |
54 | +#define Z_SPACE "\x81\x40" // 全角スペース | |
55 | +// ---------------- | |
56 | +// プロトタイプ宣言 | |
57 | +// ---------------- | |
58 | + | |
59 | +// -- comm.c | |
60 | +VOID WINAPI | |
61 | +Syslogger(BOOL bStdOut, // T:stdoutにも出力 | |
62 | + LPCSTR lpstr, // 書式printfと同じ | |
63 | + ... // 引数 | |
64 | + ); | |
65 | +LPCTSTR WINAPI GetLongBaseName(LPCTSTR lpszPath); | |
66 | +LPCSTR WINAPI GetLastErrorMessage(LPCSTR lpsz, DWORD dwErr); | |
67 | + | |
68 | +// -- gdi_wrap.c | |
69 | +BOOL WINAPI DrawBanner( | |
70 | + LPTSTR lpszUseChar, // 表示文字 | |
71 | + int ScreenWidth, // 表示幅 | |
72 | + int FontSize, // フォントサイズ | |
73 | + LPTSTR lpszString, // 表示文字列 | |
74 | + BOOL bDebug // T:デバッグ | |
75 | + ); | |
76 | +BOOL WINAPI SetLogFont(LPCTSTR lpszFamily); | |
77 | +VOID WINAPI LsFont(LPTSTR lpszFamily); | |
78 | + | |
79 | +// -- string.c | |
80 | +LPTSTR TrimRightJa(LPTSTR lpszStr); | |
81 | +LPTSTR TrimRight(LPTSTR lpszStr); | |
82 | +#endif |
@@ -0,0 +1,778 @@ | ||
1 | +\input texinfo @c -*- mode: texinfo; coding: sjis-dos -*- | |
2 | +@c $Id: jbanner.texinfo,v 1.1 2004/01/19 09:01:28 tfuruka1 Exp $ | |
3 | +@c $Log: jbanner.texinfo,v $ | |
4 | +@c Revision 1.1 2004/01/19 09:01:28 tfuruka1 | |
5 | +@c リビジョン管理をRCSからCVSへ変更しました。 | |
6 | +@c | |
7 | +@c Revision 1.1 2003/06/09 07:09:06 tfuruka1 | |
8 | +@c Initial revision | |
9 | +@c | |
10 | +@c | |
11 | + | |
12 | +@documentlanguage{ja} | |
13 | + | |
14 | +@c 現在, これは makeinfo の HTML 出力のみで使われます.ドキュメントエンコード | |
15 | +@c enc が指定された場合, `<meta>'タグで出力の`<head>'に含められます. <meta | |
16 | +@c http-equiv="Content-Type" content="text/html; charset=enc"> てな事を書い | |
17 | +@c ているんですが, 私の makeinfo だと, 巧く行かないようななので, 手動で html を | |
18 | +@c 書き換えています。 | |
19 | +@c <meta http-equiv="Content-Type" content="text/html; charset=iso-2022-jp"> | |
20 | +@documentencoding{iso-2022-jp} | |
21 | + | |
22 | + | |
23 | +@c -------------- | |
24 | +@c part 1: ヘッダ | |
25 | +@c -------------- | |
26 | + | |
27 | +@c %**start of header | |
28 | +@setfilename jbanner.info | |
29 | +@settitle jbanner | |
30 | +@afourpaper | |
31 | +@c %**end of header | |
32 | + | |
33 | +@c -------------------------- | |
34 | +@c part 2: 要約の記述と著作権 | |
35 | +@c -------------------------- | |
36 | +@copying | |
37 | +このドキュメントは, jbanner について記述しています。jbanner は日本語を含 | |
38 | +む文字列を拡大し, バナーとして画面に表示するコマンドです。CYGWIN の | |
39 | +banner と同じ動作になるように作成したつもりですが, ソースを全く参照して | |
40 | +いませんので, 内部処理は全く異なっているでしょう。また, 細かい動作は異なっ | |
41 | +ていると思われます。 | |
42 | + | |
43 | +@flushright | |
44 | +Copyright @copyright{} 2003 Tadamegu Furukawa | |
45 | +@end flushright | |
46 | + | |
47 | +このドキュメントの版数は $Revision: 1.1 $ です。 | |
48 | +@end copying | |
49 | + | |
50 | +@c ------------------------------------ | |
51 | +@c part 3: タイトルページ, 目次, 著作権 | |
52 | +@c ------------------------------------ | |
53 | +@titlepage | |
54 | +@title JBANNER | |
55 | +@subtitle 日本語を含む文字列を拡大し, バナーとして画面に表示する | |
56 | +@author tfuruka1@@nifty.com | |
57 | +@author Copyright @copyright 2003 Tadamegu Furukawa | |
58 | + | |
59 | +@c the following two commands start the copyright page. | |
60 | +@page | |
61 | +@vskip 0pt plus 1filll | |
62 | +@insertcopying | |
63 | +@end titlepage | |
64 | + | |
65 | +@c Output the table of contents at the beginning. | |
66 | +@contents | |
67 | + | |
68 | +@c ------------ | |
69 | +@c インストール | |
70 | +@c ------------ | |
71 | +@dircategory Individual utilities | |
72 | +@direntry | |
73 | +* jbanner: (jbanner). Prints a string enlarged as a banner on the screen. | |
74 | +@end direntry | |
75 | + | |
76 | +@c ------------------------------------- | |
77 | +@c Part 4: `Top'ノードとマスターメニュー | |
78 | +@c ------------------------------------- | |
79 | +@ifnottex | |
80 | +@node Top, 要旨, (dir), (dir) | |
81 | +@top JBANNER | |
82 | +@end ifnottex | |
83 | + | |
84 | +@insertcopying | |
85 | + | |
86 | +@menu | |
87 | +* 要旨:: | |
88 | +* 機能概要:: | |
89 | +* 動作環境:: | |
90 | +* インストールとアンインストール方法:: | |
91 | +* 使用方法:: | |
92 | +* 蛇足:: | |
93 | +* 取り扱い:: | |
94 | + | |
95 | +@detailmenu | |
96 | + --- The Detailed Node Listing --- | |
97 | + | |
98 | +インストールとアンインストール方法 | |
99 | + | |
100 | +* インストール:: | |
101 | +* アンインストール:: | |
102 | + | |
103 | +使用方法 | |
104 | + | |
105 | +* 簡単な使いかた:: | |
106 | +* コマンド形式:: | |
107 | +* ヘルプオプション:: | |
108 | +* 全体的なオプション:: | |
109 | +* 特殊オプション(WIN32):: | |
110 | + | |
111 | +蛇足 | |
112 | + | |
113 | +* コンパイル方法:: | |
114 | +* コマンドライン引数の解析:: | |
115 | +* 蛇足の蛇足:: | |
116 | + | |
117 | +取り扱い | |
118 | + | |
119 | +* 著作権、免責等:: | |
120 | +* バグ報告等:: | |
121 | + | |
122 | +@end detailmenu | |
123 | +@end menu | |
124 | + | |
125 | +@c -------------------------- | |
126 | +@c Part 5: ドキュメントの本体 | |
127 | +@c -------------------------- | |
128 | +@node 要旨, 機能概要, Top, Top | |
129 | +@chapter 要旨 | |
130 | + | |
131 | +jbanner は, 日本語を含む文字列を拡大し, バナーとして画面に表示するコマン | |
132 | +ドです。以下の出力例を見れば何をするコマンドなのかは一目瞭然でしょう。 | |
133 | + | |
134 | +@example | |
135 | +[491] ~/WORK/jbanner/src: ./jbanner -c 漢 漢字 | |
136 | + | |
137 | + 漢 漢 漢 漢 | |
138 | + 漢 漢漢漢漢漢漢漢漢漢漢漢 漢 | |
139 | + 漢 漢 漢 漢漢漢漢漢漢漢漢漢漢漢漢漢漢漢 | |
140 | + 漢 漢 | |
141 | +漢 漢漢漢漢漢漢漢漢漢 漢 漢 | |
142 | + 漢 漢 漢 漢 漢漢漢漢漢漢漢漢漢 | |
143 | + 漢 漢漢漢漢漢漢漢漢漢 漢 | |
144 | + 漢 漢 | |
145 | + 漢漢漢漢漢漢漢漢漢 漢漢 | |
146 | + 漢 漢 漢 | |
147 | + 漢 漢漢漢漢漢漢漢漢漢漢漢 漢漢漢漢漢漢漢漢漢漢漢漢漢漢漢 | |
148 | + 漢 漢 漢 | |
149 | + 漢 漢 漢 漢 | |
150 | +漢 漢漢 漢漢 漢 | |
151 | +漢 漢漢 漢漢 漢漢漢 | |
152 | + | |
153 | +[492] ~/WORK/jbanner/src: ./jbanner -c '_/' 漢字 | |
154 | + | |
155 | + _/ _/ _/ _/ | |
156 | + _/ _/_/_/_/_/_/_/_/_/_/_/ _/ | |
157 | + _/ _/ _/ _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ | |
158 | + _/ _/ | |
159 | +_/ _/_/_/_/_/_/_/_/_/ _/ _/ | |
160 | + _/ _/ _/ _/ _/_/_/_/_/_/_/_/_/ | |
161 | + _/ _/_/_/_/_/_/_/_/_/ _/ | |
162 | + _/ _/ | |
163 | + _/_/_/_/_/_/_/_/_/ _/_/ | |
164 | + _/ _/ _/ | |
165 | + _/ _/_/_/_/_/_/_/_/_/_/_/ _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ | |
166 | + _/ _/ _/ | |
167 | + _/ _/ _/ _/ | |
168 | +_/ _/_/ _/_/ _/ | |
169 | +_/ _/_/ _/_/ _/_/_/ | |
170 | + | |
171 | +@end example | |
172 | + | |
173 | +ふとした事から, banner を使用したくなったのですが, Cygwin の banner は日 | |
174 | +本語を通してくれませんでした(当たり前ですけど)。多分, 数時間で作成できる | |
175 | +だろうと思って作り始めたのですが, 色々と機能を追加しては削除したりして, | |
176 | +結構な日数を費やしてしましました。 | |
177 | + | |
178 | +@c -------------------------------------------------------------------- | |
179 | +@node 機能概要, 動作環境, 要旨, Top | |
180 | +@comment node-name, next, previous, up | |
181 | +@chapter 機能概要 | |
182 | + | |
183 | +jbanner は, 日本語を含む文字列を拡大し, バナーとして画面に表示するコマン | |
184 | +ドです。 | |
185 | + | |
186 | +ある日, メールに日本語のバナーを入れたいと思って, Cygwin の banner を使 | |
187 | +用したところ, 思った通り, 日本語は通してくれませんでした。多分, 日本語化 | |
188 | +されたものが有ると思い, インターネット等で検索してみたのですが, 違うバナー | |
189 | +が沢山ヒットしてしまい, 結局目的のものは探し出せませんでした。 | |
190 | + | |
191 | +@quotation | |
192 | +「しょうがない。作るか〜。」 | |
193 | + | |
194 | +「多分, 二〜三時間もあれば作れるだろう」 | |
195 | +@end quotation | |
196 | + | |
197 | +と思って, 作り始めました。ま〜, だいたいは二時間ぐらいで出来たのですが, | |
198 | +どうせなら, オリジナルと同じ動作にしようと思い, オリジナルを操作しながら, | |
199 | +動作を真似て作りました。 | |
200 | + | |
201 | +面倒だったので, オリジナルのソースは見ないで作成したので, 細かい部分まで | |
202 | +は真似しきれてないと思います。何れにしろ, オリジナルは多分プログラム内部 | |
203 | +にフォント情報を持っているでしょう(違うかな?)。欧文のように数が少なけれ | |
204 | +ば可能なのですが, 日本語は数が多いのでフォントを内部に持つのは得策ではな | |
205 | +いと判断して, OS からフォント情報を得ています。そんな訳でオリジナルには | |
206 | +存在しない機能として, 以下の機能があります。 | |
207 | + | |
208 | +@itemize | |
209 | +@item | |
210 | +日本語を処理できます | |
211 | + | |
212 | +@item | |
213 | +フォントの指定が可能です | |
214 | + | |
215 | +@item | |
216 | +フォントサイズの指定が可能です | |
217 | + | |
218 | +@item | |
219 | +フォントファミリを列挙する事ができます。 | |
220 | + | |
221 | +@end itemize | |
222 | + | |
223 | +フォントの指定が可能になった事により, | |
224 | + | |
225 | +@example | |
226 | +[498] ~/WORK/jbanner/src: ./jbanner -c 漢 --fontname='@@MS 明朝' 漢字 | |
227 | + | |
228 | + 漢 漢 漢 漢 漢 | |
229 | + 漢 漢漢漢 漢 漢 漢 漢漢漢 漢漢 | |
230 | + 漢 漢 漢 漢 漢 漢 漢 漢 | |
231 | +漢漢漢 漢 漢 漢 漢 漢 漢 漢 漢 | |
232 | + 漢 漢 漢 漢 漢漢 漢 漢漢 漢 | |
233 | + 漢 漢漢漢漢漢漢漢 漢 漢漢 漢 | |
234 | + 漢 漢 漢 漢 漢漢 漢 漢 漢 漢 漢 | |
235 | +漢漢漢 漢 漢 漢 漢 漢 漢漢漢 漢 漢漢漢漢漢漢漢 | |
236 | + 漢 漢 漢 漢 漢 漢 漢 漢 漢 漢漢 | |
237 | + 漢 漢漢漢 漢 漢 漢 漢 漢 漢 漢 | |
238 | + 漢 漢 漢 漢 漢 漢 漢 | |
239 | + 漢漢漢 漢 漢 漢 | |
240 | + 漢漢 漢漢漢 漢 漢 | |
241 | +漢 漢漢 漢漢漢漢漢 漢漢漢 漢 | |
242 | + 漢 漢 漢漢 漢 | |
243 | +@end example | |
244 | + | |
245 | +こんな事も出来るようになりました。 | |
246 | + | |
247 | +@c -------------------------------------------------------------------- | |
248 | +@node 動作環境, インストールとアンインストール方法, 機能概要, Top | |
249 | +@comment node-name, next, previous, up | |
250 | +@chapter 動作環境 | |
251 | + | |
252 | +一応, Windows(32bit)汎用のつもりです。特殊な API は一切使用していません | |
253 | +ので, 多分 Windows 95/98/98SE/ME/NT/2000/Xp の何れでも動作すると思います。 | |
254 | +もしかすると, Win32s でも動作するかもしれません。但し私が動作確認を行っ | |
255 | +た環境は | |
256 | + | |
257 | +@itemize | |
258 | +@item Windows 2000 | |
259 | +@item Windows Xp | |
260 | +@end itemize | |
261 | + | |
262 | +のみです。 | |
263 | + | |
264 | +@c -------------------------------------------------------------------- | |
265 | +@node インストールとアンインストール方法, 使用方法, 動作環境, Top | |
266 | +@comment node-name, next, previous, up | |
267 | +@chapter インストールとアンインストール方法 | |
268 | + | |
269 | +@menu | |
270 | +* インストール:: | |
271 | +* アンインストール:: | |
272 | +@end menu | |
273 | + | |
274 | +@node インストール, アンインストール, インストールとアンインストール方法, インストールとアンインストール方法 | |
275 | +@comment node-name, next, previous, up | |
276 | +@section インストール | |
277 | + | |
278 | +インストールは, 特殊な事は何も行う必要はありません。@file{jbanner.exe}を | |
279 | +任意のフォルダ(ディレクトリ)にコピーして下さい。jbanner はコマンドプロン | |
280 | +プトから使用するツールですので, 環境変数@code{Path}に含まれているディレ | |
281 | +クトリにコピーする事をお勧め致します。エクスプローラから, クリックしても | |
282 | +何も起こりませんので悪しからず@code{:-p} 。 | |
283 | + | |
284 | +@node アンインストール, , インストール, インストールとアンインストール方法 | |
285 | +@comment node-name, next, previous, up | |
286 | +@section アンインストール | |
287 | + | |
288 | +アンインストールは, @file{jbanner.exe}を削除するだけです。レジストリは一 | |
289 | +切触っていませんので, それ以外には何も行う必要はありません。 | |
290 | + | |
291 | +@c -------------------------------------------------------------------- | |
292 | +@node 使用方法, 蛇足, インストールとアンインストール方法, Top | |
293 | +@comment node-name, next, previous, up | |
294 | +@chapter 使用方法 | |
295 | + | |
296 | +@menu | |
297 | +* 簡単な使いかた:: | |
298 | +* コマンド形式:: | |
299 | +* ヘルプオプション:: | |
300 | +* 全体的なオプション:: | |
301 | +* 特殊オプション(WIN32):: | |
302 | +@end menu | |
303 | + | |
304 | +@c -------------------------------------------------------------------- | |
305 | +@node 簡単な使いかた, コマンド形式, 使用方法, 使用方法 | |
306 | +@comment node-name, next, previous, up | |
307 | +@section 簡単な使いかた | |
308 | + | |
309 | +@file{jbanner}は Windows のコマンドプロンプト等から使用します。私は | |
310 | +Emacs の shell で bash を起動して使用する事が殆どですので, このドキュメ | |
311 | +ントの例もbash のものを使用しているのが殆どです。コマンドプロンプトで使 | |
312 | +用する場合に於いても特に大きな違いはありませんので, 適当に読み替えて下さ | |
313 | +い。 | |
314 | + | |
315 | +そのままコマンドプロンプトから@samp{jbanner}と入力すると, | |
316 | + | |
317 | +@example | |
318 | +C:\home\tfuruka1>jbanner | |
319 | +jbanner: 引数が不十分です。 | |
320 | +Usage: jbanner [-c X] [-w 80] [--usage] [--version] [--help] 表示する文字列 | |
321 | +@end example | |
322 | + | |
323 | +といった, 簡単な使用方法を表示します。今度は「表示する文字列」を何か入力してみ | |
324 | +ます。ここでは「ほげ」と入力します。 | |
325 | + | |
326 | +@example | |
327 | +C:\home\tfuruka1>jbanner ほげ | |
328 | + X X | |
329 | + X X X X | |
330 | + X XXXXXXXX X X | |
331 | + X X X X | |
332 | + X X X XXXXXXXXX | |
333 | + X XXXXXXXX X X | |
334 | + X X X X | |
335 | + X X X X | |
336 | + X X X X | |
337 | + X X X X | |
338 | + X XXXXX X X | |
339 | + X X XX X X | |
340 | + X X X X X X | |
341 | + X XXXX XX | |
342 | +@end example | |
343 | + | |
344 | +これが基本的な使用方法です。あとは, オプションで細かい指定がそれなりにで | |
345 | +きます。 | |
346 | + | |
347 | +@c -------------------------------------------------------------------- | |
348 | +@node コマンド形式, ヘルプオプション, 簡単な使いかた, 使用方法 | |
349 | +@comment node-name, next, previous, up | |
350 | +@section コマンド形式 | |
351 | + | |
352 | +@file{jbanner}のコマンド形式は以下の通りです。 | |
353 | + | |
354 | +@example | |
355 | +jbanner [options] 表示文字列 | |
356 | +@end example | |
357 | + | |
358 | +@code{表示文字列}で指定した文字列を拡大して, バナーとして, 画面に表示し | |
359 | +ます。オプションは, @code{-}又は@code{--}から始まる文字又は文字列で, 出 | |
360 | +力形式に対する指示を行う事ができます。オプションの中には, 引数を必要とす | |
361 | +るものもあります。その場合の引数は, コマンドの次の引数として記述する事も | |
362 | +できますし, @code{=}で連結して指定する事も可能です。例えば, 以下の二つは | |
363 | +どちらも同じ意味になります。 | |
364 | + | |
365 | +@example | |
366 | +--option argument | |
367 | +--option=argument | |
368 | +@end example | |
369 | + | |
370 | +因みにjbannerには@code{--option}というオプションは存在しません。上記はあ | |
371 | +くまで例です。 | |
372 | + | |
373 | +@c -------------------------------------------------------------------- | |
374 | +@node ヘルプオプション, 全体的なオプション, コマンド形式, 使用方法 | |
375 | +@comment node-name, next, previous, up | |
376 | +@section ヘルプオプション | |
377 | + | |
378 | +ヘルプオプションを指定した場合は, jbanner に関連する情報を表示し, 直ちに | |
379 | +コマンドを終了します。表示文字列を指定した場合も, バナー処理を行いません。 | |
380 | + | |
381 | +@table @kbd | |
382 | + | |
383 | +@item -? | |
384 | +@itemx --help | |
385 | + | |
386 | +詳細な使用方法を表示し, 処理を終了します。 | |
387 | + | |
388 | +@item --usage | |
389 | +簡潔な使用方法を表示し, 処理を終了します。 | |
390 | + | |
391 | +@item --version | |
392 | +ヴァージョン情報を表示し, 処理を終了します。 | |
393 | +@end table | |
394 | + | |
395 | +@c -------------------------------------------------------------------- | |
396 | +@node 全体的なオプション, 特殊オプション(WIN32), ヘルプオプション, 使用方法 | |
397 | +@comment node-name, next, previous, up | |
398 | +@section 全体的なオプション | |
399 | + | |
400 | +@table @kbd | |
401 | + | |
402 | +@item -c=X | |
403 | +@itemx --char=X | |
404 | + | |
405 | +バナーを作成する為に使用する文字列を指定します。このオプションを指定しな | |
406 | +かった場合は, バナーを作成する文字列として@code{X}を使用します。このオプ | |
407 | +ションで指定するのは文字ではなく, @strong{文字列}です。例えば, @code{AB} | |
408 | +を指定した場合は, 以下のようになります。 | |
409 | + | |
410 | +@example | |
411 | +[513] ~/WORK/jbanner/src: ./jbanner -c AB 漢字 | |
412 | + AB AB AB AB | |
413 | + AB ABABABABABABABABABABAB AB | |
414 | + AB AB AB ABABABABABABABABABABABABABABAB | |
415 | + AB AB | |
416 | +AB ABABABABABABABABAB AB AB | |
417 | + AB AB AB AB ABABABABABABABABAB | |
418 | + AB ABABABABABABABABAB AB | |
419 | + AB AB | |
420 | + ABABABABABABABABAB ABAB | |
421 | + AB AB AB | |
422 | + AB ABABABABABABABABABABAB ABABABABABABABABABABABABABABAB | |
423 | + AB AB AB | |
424 | + AB AB AB AB | |
425 | +AB ABAB ABAB AB | |
426 | +AB ABAB ABAB ABABAB | |
427 | +@end example | |
428 | + | |
429 | +@item -w=80 | |
430 | +@itemx --width=80 | |
431 | + | |
432 | +バナーの表示幅を設定します。このオプションを指定しなかった場合の表示幅は | |
433 | +80文字です。表示幅は 1以上, 1024未満の範囲で指定可能です。表示幅を超えた | |
434 | +分部はカットされます。表示幅を 45に指定した場合の例を以下に示します。 | |
435 | + | |
436 | +@example | |
437 | +[517] ~/WORK/jbanner/src: ./jbanner -c AB --width=45 漢字 | |
438 | + AB AB AB | |
439 | + AB ABABABABABABABABABABAB | |
440 | + AB AB AB ABABABABABAB | |
441 | + AB | |
442 | +AB ABABABABABABABABAB AB | |
443 | + AB AB AB AB ABABAB | |
444 | + AB ABABABABABABABABAB | |
445 | + AB | |
446 | + ABABABABABABABABAB | |
447 | + AB AB | |
448 | + AB ABABABABABABABABABABAB ABABABABABAB | |
449 | + AB AB | |
450 | + AB AB AB | |
451 | +AB ABAB ABAB | |
452 | +AB ABAB ABAB AB | |
453 | +@end example | |
454 | +@end table | |
455 | + | |
456 | +@c -------------------------------------------------------------------- | |
457 | +@node 特殊オプション(WIN32), , 全体的なオプション, 使用方法 | |
458 | +@comment node-name, next, previous, up | |
459 | +@section 特殊オプション(WIN32) | |
460 | + | |
461 | +@file{jbanner}は, Windows のフォントを使用してバナーを作成しています。そ | |
462 | +のために, フォントに関連するオプションを用意しています。 | |
463 | + | |
464 | +@table @kbd | |
465 | + | |
466 | +@item -F="MS ゴシック" | |
467 | +@itemx --fontname="MS ゴシック" | |
468 | + | |
469 | +バナー作成に使用するフォント名を指定します。このオプションを指定しなかっ | |
470 | +た場合は, @code{MS ゴシック}を使用します。以下の例は, フォントに | |
471 | +@code{@@FixedSys}を使用した場合の例です。 | |
472 | + | |
473 | +@example | |
474 | +[537] ~/WORK/jbanner/src: ./jbanner -c '漢' -F=@@FixedSys 漢字 | |
475 | + | |
476 | + | |
477 | + | |
478 | + 漢 漢 漢 漢漢漢 漢 | |
479 | + 漢 漢漢漢 漢 漢 漢 漢 漢 | |
480 | + 漢 漢 漢 漢 漢 漢 漢 漢 | |
481 | +漢漢漢 漢 漢 漢 漢 漢 漢 漢 漢 | |
482 | + 漢 漢 漢 漢 漢 漢 漢 漢漢 漢 | |
483 | + 漢 漢漢漢漢漢漢漢漢 漢 漢 漢 漢 | |
484 | + 漢 漢 漢 漢 漢 漢 漢 漢 漢 漢 | |
485 | +漢漢漢 漢 漢 漢 漢 漢 漢漢漢 漢 漢漢漢漢漢漢漢 | |
486 | + 漢 漢 漢 漢 漢 漢 漢 漢 漢 漢 | |
487 | + 漢 漢漢漢 漢 漢 漢 漢 漢 漢 漢 | |
488 | + 漢 漢 漢 漢 漢 漢 | |
489 | + 漢 漢 漢 漢 | |
490 | + 漢 漢 漢漢 漢 漢 | |
491 | +漢 漢 漢漢 漢 漢 | |
492 | + 漢 漢漢 漢漢漢 漢 | |
493 | +@end example | |
494 | + | |
495 | +このオプションで指定するのは, 書体名(フォントフェイス)ではなく, フォント | |
496 | +名なので, 以下のように指定する事も出来ます。 | |
497 | + | |
498 | +@example | |
499 | +[538] ~/WORK/jbanner/src: ./jbanner -F="Times New Roman Bold Italic" Hoge | |
500 | + | |
501 | + | |
502 | + | |
503 | + | |
504 | + XXXX XXXX | |
505 | + XX XX | |
506 | + XX XX | |
507 | + XX XX | |
508 | + XX XX XXX XXXXXX XXXX | |
509 | + XXXXXXXX X XX XXX XX X XX | |
510 | + XX XX XX XX XX XX X XX | |
511 | + XX XX XX XX XX XXX XXXXX | |
512 | + XX XX XX XX XXXX XX | |
513 | + XX XX XX XX XX XX XX | |
514 | +XXXX XXXX XXX XXXX XXX | |
515 | + X XXX | |
516 | + XX XX | |
517 | + XXXXX | |
518 | +@end example | |
519 | + | |
520 | +@item -f=16 | |
521 | +@itemx --fontsize=16 | |
522 | + | |
523 | +バナー作成に使用するフォントのフォントサイズを指定します。このサイズはフォ | |
524 | +ントの高さを意味します。フォントの幅は, アスペクトル比から自動算出します。 | |
525 | +このオプションを指定しなかった場合のフォントサイズは 16を指定した事にな | |
526 | +ります。フォントサイズに 24を指定した場合の例を以下に示します(行書体は16 | |
527 | +ドットだと辛いですね)。 | |
528 | + | |
529 | +@example | |
530 | +[546] ~/WORK/jbanner/src: ./jbanner -c '##' -F=HGS行書体 -f 24 あ | |
531 | + | |
532 | + | |
533 | + | |
534 | + ## | |
535 | + ## ## | |
536 | + #### #### | |
537 | + #### ######## | |
538 | + ## ############ | |
539 | + ############ | |
540 | + #### | |
541 | + #### ## | |
542 | + #### ############ | |
543 | + ######## ## ## | |
544 | + ###### #### ## | |
545 | + ######## #### #### | |
546 | + #### ########## #### | |
547 | + ## ######## #### | |
548 | + ## ###### #### | |
549 | + ######## #### ###### | |
550 | + ###### | |
551 | + ######## | |
552 | +@end example | |
553 | + | |
554 | +@item --lsfont[=family] | |
555 | + | |
556 | +familyで指定したフォントファミリのフォント情報を列挙し、コマンドを終了し | |
557 | +ます。フォント名を指定する時に、システムに使用できるフォントを調べる場合 | |
558 | +に使用する事を想定しています。familyを指定しなかった場合は、使用可能な全 | |
559 | +てのフォントを列挙します。フォント情報は、左から | |
560 | + | |
561 | +@itemize | |
562 | +@item フォント名 | |
563 | +@item スタイル名 | |
564 | +@item 書体名 | |
565 | +@end itemize | |
566 | + | |
567 | +の順に列挙します。以下に例を示します。 | |
568 | + | |
569 | +@example | |
570 | +[551] ~/WORK/jbanner/src: ./jbanner --lsfont=times | |
571 | +"Times New Roman" "Regular" "Times" | |
572 | +"Times New Roman" "Regular" "Times" | |
573 | +"Times New Roman" "Regular" "Times" | |
574 | +---中略--- | |
575 | +"Times New Roman Bold" "Bold" "Times" | |
576 | +"Times New Roman Bold" "Bold" "Times" | |
577 | +"Times New Roman Bold" "Bold" "Times" | |
578 | +---中略--- | |
579 | +"Times New Roman Bold Italic" "Bold Italic" "Times" | |
580 | +"Times New Roman Bold Italic" "Bold Italic" "Times" | |
581 | +...以下省略... | |
582 | + | |
583 | +[552] ~/WORK/jbanner/src: ./jbanner --lsfont="MS ゴシック" | |
584 | +"MS ゴシック" "標準" "MS ゴシック" | |
585 | +@end example | |
586 | + | |
587 | +jbanner のオプションで指定するのは, フォント名です。フォント名から使用す | |
588 | +る書体名を得ています。日本語のフォントの場合は, フォント名と書体名は殆ど | |
589 | +一致しているようです。 | |
590 | +@end table | |
591 | + | |
592 | +@c -------------------------------------------------------------------- | |
593 | +@node 蛇足, 取り扱い, 使用方法, Top | |
594 | +@comment node-name, next, previous, up | |
595 | +@chapter 蛇足 | |
596 | + | |
597 | +@menu | |
598 | +* コンパイル方法:: | |
599 | +* コマンドライン引数の解析:: | |
600 | +* 蛇足の蛇足:: | |
601 | +@end menu | |
602 | + | |
603 | +@node コンパイル方法, コマンドライン引数の解析, 蛇足, 蛇足 | |
604 | +@comment node-name, next, previous, up | |
605 | +@section コンパイル方法 | |
606 | + | |
607 | +コンパイルは, VC6.0と Cygwin の gcc で確認しています。特殊な事は行ってい | |
608 | +ないつもりですので, もっと古いものでも, 多分大丈夫だと思います。gcc でコ | |
609 | +ンパイルを通す為に姑息な事(といっても, 昔 MS-DOS の MSC-3あたりを使用し | |
610 | +ていた頃もこんな事をしていましたが)をしています。早い話が, 日本語を正し | |
611 | +く処理できない分部の対応をしているだけです。もう少し詳しくいうと, エスケー | |
612 | +プコード@code{0x5C}が, SHIFT-JIS での漢字コードの 2バイト目と一致してし | |
613 | +まい, 特定の漢字コード(2バイト目がエスケープコードと一致するコード)が正 | |
614 | +しく処理されないのです。例えば, 「表」(@code{0x955c})がそれにあたります。 | |
615 | + | |
616 | +@example | |
617 | +printf("表示\n") | |
618 | +@end example | |
619 | + | |
620 | +だとエラーになりますので、 | |
621 | + | |
622 | +@example | |
623 | +printf("\x95\x5c示\n") | |
624 | +@end example | |
625 | + | |
626 | +と記述しています。 | |
627 | + | |
628 | +一応, 私がコンパイルを確認したコンパイラを以下に列挙します。 | |
629 | + | |
630 | +@itemize | |
631 | +@item | |
632 | +Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for | |
633 | +80x86 | |
634 | + | |
635 | +@item | |
636 | +gcc (GCC) 3.2 20020818 (prerelease) | |
637 | +@end itemize | |
638 | + | |
639 | +コンパイルは, nmake または make 一発で行えるように考慮したつもりですが, | |
640 | +環境によっては, makefile を書き換える必要があるかもしれません(と, いうよ | |
641 | +り, 私と全く同じ環境の筈がありませんので, 何らかの書き換えは必要になりま | |
642 | +す)。修正方法は, makefile 内に記述していますので, そちらを参照して下さい。 | |
643 | + | |
644 | +@c -------------------------------------------------------------------- | |
645 | +@node コマンドライン引数の解析, 蛇足の蛇足, コンパイル方法, 蛇足 | |
646 | +@comment node-name, next, previous, up | |
647 | +@section コマンドライン引数の解析 | |
648 | + | |
649 | +恥ずかしながら, 今回デバッグをしていて始めて判ったのですが, gcc でコンパ | |
650 | +イルしたものと, MSVC でコンパイルしたもので, コマンドライン引数の処理が異 | |
651 | +なるようです。Windows のコマンドプロンプトから, 以下のコマンドを入力して, | |
652 | +その引数の渡り方を調べてみました。 | |
653 | + | |
654 | +@itemize | |
655 | +@item | |
656 | +@samp{jbanner --fontname='Times New Roman' hoge} | |
657 | + | |
658 | +@enumerate | |
659 | +@item | |
660 | +MSVCでコンパイルした場合 | |
661 | + | |
662 | +@example | |
663 | +ARGV[0]=<jbanner> | |
664 | +ARGV[1]=<--fontname='Times> | |
665 | +ARGV[2]=<New> | |
666 | +ARGV[3]=<Roman'> | |
667 | +ARGV[4]=<hoge> | |
668 | +@end example | |
669 | + | |
670 | +@code{Times New Roman}を一つの引数として渡すつもりで@code{'}で括ったので | |
671 | +すが, 見事に引数が三つに分割されてしまいました。 | |
672 | + | |
673 | +@item gccでコンパイルした場合 | |
674 | + | |
675 | +@example | |
676 | +ARGV[0]=<jbanner> | |
677 | +ARGV[1]=<--fontname=Times New Roman> | |
678 | +ARGV[2]=<hoge> | |
679 | +@end example | |
680 | + | |
681 | +こちらは, 意図した通りです。 | |
682 | + | |
683 | +@end enumerate | |
684 | + | |
685 | +@item | |
686 | +@samp{jbanner --fontname="Times New Roman" hoge} | |
687 | + | |
688 | +今度は, @code{'}ではなく, @code{"}で括ってみました。 | |
689 | + | |
690 | +@enumerate | |
691 | + | |
692 | +@item MSVCでコンパイルした場合 | |
693 | + | |
694 | +@example | |
695 | +ARGV[0]=<jbanner> | |
696 | +ARGV[1]=<--fontname=Times New Roman> | |
697 | +ARGV[2]=<hoge> | |
698 | +@end example | |
699 | + | |
700 | +意図した通りです。 | |
701 | + | |
702 | +@item gcc でコンパイルした場合 | |
703 | + | |
704 | +@example | |
705 | +ARGV[0]=<./jbanner> | |
706 | +ARGV[1]=<--fontname=Times New Roman> | |
707 | +ARGV[2]=<hoge> | |
708 | +@end example | |
709 | + | |
710 | +意図した通りです。 | |
711 | + | |
712 | +@end enumerate | |
713 | +@end itemize | |
714 | + | |
715 | +といった結果になりました。私は殆ど bash を使用していますので, シェルが処 | |
716 | +理してくれるので, 気が付きませんでした。 | |
717 | + | |
718 | +@c -------------------------------------------------------------------- | |
719 | +@node 蛇足の蛇足, , コマンドライン引数の解析, 蛇足 | |
720 | +@comment node-name, next, previous, up | |
721 | +@section 蛇足の蛇足 | |
722 | + | |
723 | +一部, デバッグ用に Syslog 出力しています。Syslogd を起動している方は, ご | |
724 | +注意(べつに悪さは与えないと思いますが)ください。 | |
725 | + | |
726 | + | |
727 | +@c -------------------------------------------------------------------- | |
728 | +@node 取り扱い, , 蛇足, Top | |
729 | +@comment node-name, next, previous, up | |
730 | +@chapter 取り扱い | |
731 | + | |
732 | +@menu | |
733 | +* 著作権、免責等:: | |
734 | +* バグ報告等:: | |
735 | +@end menu | |
736 | + | |
737 | +@node 著作権、免責等, バグ報告等, 取り扱い, 取り扱い | |
738 | +@comment node-name, next, previous, up | |
739 | +@section 著作権、免責等 | |
740 | + | |
741 | +本プログラムはフリーソフトウェアです。本プログラムを使用して生じたいかな | |
742 | +る結果に対しても作者は責任を負わないこととします。個人の責任に於いて使用 | |
743 | +して下さい。入手したアーカイブのままの形式であれば, 再頒布, 転載は可能と | |
744 | +します。常識的に扱ってください。 | |
745 | + | |
746 | +@node バグ報告等, , 著作権、免責等, 取り扱い | |
747 | +@comment node-name, next, previous, up | |
748 | +@section バグ報告等 | |
749 | + | |
750 | +バグ報告, 改善案(あるいは, 自分で改善した), 質問等ありましたら, 是非作者 | |
751 | +へ「励ましのお便り」@code{(^^;}を送って下さい。特にご自分で改善なさった | |
752 | +場合は, 私も恩恵に預かりたいので, 是非教えて下さい。改善案のご連絡を下さっ | |
753 | +ても, 仕事に忙殺されている関係上, ご希望に添える事は出来ないかもしれませ | |
754 | +んが, バグ修正はなるべく行うつもりです。自分の名誉の為にも@dots{}(^^; | |
755 | + | |
756 | +メールアドレスは, 以下の通りです。 | |
757 | + | |
758 | +@flushright | |
759 | +@ifhtml | |
760 | +T.Furukawa <tfuruka1@@nifty.com> | |
761 | +@end ifhtml | |
762 | +@ifnothtml | |
763 | +T.Furukawa @email{tfuruka1@@nifty.com} | |
764 | +@end ifnothtml | |
765 | +@end flushright | |
766 | + | |
767 | +@c -------------------------- | |
768 | +@c Part 6: ドキュメントの終り | |
769 | +@c -------------------------- | |
770 | +@c @node 索引, , 取り扱い, Top | |
771 | +@c @unnumbered 索引 | |
772 | + | |
773 | +@c @printindex cp | |
774 | +@c @printindex fn | |
775 | +@c @printindex vr | |
776 | + | |
777 | +@c インデックスは要らないや | |
778 | +@bye |
@@ -0,0 +1,270 @@ | ||
1 | +/* -*- mode: c++; coding: sjis-dos; -*- | |
2 | + * Time-stamp: <2003-06-08 17:35:02 tfuruka1> | |
3 | + * Copyright (C) 2003 Tadamegu Furukawa | |
4 | + * | |
5 | + * jbanner - 日本語を含む文字列を拡大し、バナーとして画面に表示します。 | |
6 | + * | |
7 | + * $Id: main.c,v 1.1 2004/01/19 09:01:28 tfuruka1 Exp $ | |
8 | + * $Log: main.c,v $ | |
9 | + * Revision 1.1 2004/01/19 09:01:28 tfuruka1 | |
10 | + * リビジョン管理をRCSからCVSへ変更しました。 | |
11 | + * | |
12 | + * Revision 1.4 2003/06/08 11:20:38 tfuruka1 | |
13 | + * ● フォントの列挙を行うオプションを追加した。 | |
14 | + * ● 表示幅のチェックに誤りがあったので修正した。 | |
15 | + * | |
16 | + * Revision 1.3 2003/06/05 13:48:57 tfuruka1 | |
17 | + * ● -c オプションで「文字列」を指定できるように修正。 | |
18 | + * | |
19 | + * Revision 1.2 2003/06/01 11:17:32 tfuruka1 | |
20 | + * コマンドライン解析のデバッグ用にSyslog出力を追加しました。 | |
21 | + * | |
22 | + * Revision 1.1 2003/06/01 08:19:58 tfuruka1 | |
23 | + * Initial revision | |
24 | + */ | |
25 | +#include "jbanner.h" | |
26 | + | |
27 | +/* | |
28 | + * Cygwinのgccで、日本語を通す為に、以下の文字はコードで埋め込んでいま | |
29 | + * す。 | |
30 | + * | |
31 | + * 表=\x95\x5c | |
32 | + * 十=\x8f\x5c | |
33 | + * ソ=\x83\x5c | |
34 | + */ | |
35 | +#define USAGE_STR "Usage: %s "\ | |
36 | +"[-c X] [-w 80] [--usage] [--version] [--help] \x95\x5c示する文字列\n" | |
37 | + | |
38 | +#define HELP_STR "Usage: %s \x95\x5c示する文字列\n\n"\ | |
39 | +"全体的なオプション\n"\ | |
40 | +" -c, --char=%s 使用する文字列 <%s>\n"\ | |
41 | +" -w, --width=%d \x95\x5c示幅を設定します。<%d>\n\n"\ | |
42 | +"ヘルプオプション\n"\ | |
43 | +" -?, --help このヘルプメッセージを\x95\x5c示します。\n"\ | |
44 | +" --usage 簡潔な使用方法を\x95\x5c示します。\n"\ | |
45 | +" --version ヴァージョン情報を\x95\x5c示します。\n\n"\ | |
46 | +"特殊オプション(WIN32)\n"\ | |
47 | +" -F, --fontname=\"%s\"\n"\ | |
48 | +" 使用フォント名を指定します。<%s>\n"\ | |
49 | +" -f, --fontsize=%d フォントサイズを指定します。<%d>\n"\ | |
50 | +" --lsfont[=family] familyで指定したフォントファミリのフォント"\ | |
51 | +"を列挙します。\n"\ | |
52 | +"\nこのバージョンはCygwinのbannerと同じように動作するように作成しているつ\n"\ | |
53 | +"もりですが、\x83\x5cースは一切参照していませんので、実装手段は全く異なっ"\ | |
54 | +"てい\n"\ | |
55 | +"るでしょう。従って、細かい見た目の動作についても、異なる部分があると思\n"\ | |
56 | +"われます。\n"\ | |
57 | +"\nReport bugs to <tfuruka1@nifty.com>.\n" | |
58 | + | |
59 | +/* | |
60 | + * ヴァージョン情報を表示する | |
61 | + */ | |
62 | +static void | |
63 | +ShowVersion() | |
64 | +{ | |
65 | + fprintf(stderr, "%s\n", VERSION); | |
66 | +} | |
67 | + | |
68 | +/* | |
69 | + * 簡潔な使用方法を表示する | |
70 | + */ | |
71 | +static void ShowUsage(char *lpszCom) | |
72 | +{ | |
73 | + fprintf(stderr, USAGE_STR, GetLongBaseName(lpszCom)); | |
74 | +} | |
75 | + | |
76 | +/* | |
77 | + * 使用方法を表示する | |
78 | + */ | |
79 | +static void ShowHelp(char *lpszCom) | |
80 | +{ | |
81 | + ShowVersion(); | |
82 | + fprintf(stderr, HELP_STR, GetLongBaseName(lpszCom), | |
83 | + DEFAULT_CHAR, DEFAULT_CHAR, DEFAULT_WIDTH, DEFAULT_WIDTH, | |
84 | + DEFAULT_FONT, DEFAULT_FONT, DEFAULT_FSIZE, DEFAULT_FSIZE); | |
85 | +} | |
86 | + | |
87 | +/* | |
88 | + * 引数が不十分な場合のえらーメッセージを表示後、簡潔な使用方法を表示する | |
89 | + */ | |
90 | +static void NotEnoughArguments(char *lpszCom) | |
91 | +{ | |
92 | + fprintf(stderr, "%s: 引数が不\x8f\x5c分です。\n", | |
93 | + GetLongBaseName(lpszCom)); | |
94 | + ShowUsage(lpszCom); | |
95 | +} | |
96 | + | |
97 | +/* | |
98 | + * 本コマンドのエントリ | |
99 | + */ | |
100 | +// 引数チェック用のマクロ:引数はargv[i]と決め打ちしているので要注 | |
101 | +// 意!!!行が長くなるのが嫌だったので・・・ | |
102 | +#define IS_ARG_OK1(Expected) (0 == strcmp(Expected, argv[i])) | |
103 | +#define IS_ARG_OK2(Exp1, Exp2) IS_ARG_OK1(Exp1) || IS_ARG_OK1(Exp2) | |
104 | +int main(int argc, char *argv[]) | |
105 | +{ | |
106 | + int i; | |
107 | + int nScreenWidth = DEFAULT_WIDTH; | |
108 | + int nFontSize = DEFAULT_FSIZE; | |
109 | + BOOL bDebug = FALSE; | |
110 | + LPTSTR lpszUseChar = DEFAULT_CHAR; | |
111 | + LPTSTR lpszFontName = DEFAULT_FONT; | |
112 | + BYTE *pNextArg; | |
113 | + | |
114 | + | |
115 | + // コマンドオプションのデバッグ用です | |
116 | + { | |
117 | + Syslogger(FALSE, ">>>>>" | |
118 | +#if defined(CYGWIN) | |
119 | + "CYGWIN-VERSION" | |
120 | +#else | |
121 | + "MSVC-VERSION" | |
122 | +#endif | |
123 | + ": START"); | |
124 | + for (i = 0; i < argc; i++) { | |
125 | + Syslogger(FALSE, "ARGV[%d]=<%s>", i, argv[i]); | |
126 | + } | |
127 | + Syslogger(FALSE, "<<<<<"); | |
128 | + } | |
129 | + // コマンドオプションのデバッグ用はここまで | |
130 | + | |
131 | + for (i = 1; i < argc; i++) { | |
132 | + if ('-' != *argv[i]) { | |
133 | + break; | |
134 | + } | |
135 | + | |
136 | + // オプションに=を使用していた場合の処理 | |
137 | + pNextArg = strchr(argv[i], '='); | |
138 | + if (pNextArg) { | |
139 | + if (!*(pNextArg)) { | |
140 | + fprintf(stderr, "%s: オプションの値が存在しません。(%s)\n", | |
141 | + GetLongBaseName(argv[0]), argv[i]); | |
142 | + return 1; | |
143 | + } | |
144 | + *pNextArg = '\0'; | |
145 | + pNextArg++; | |
146 | + } | |
147 | + | |
148 | + // 引数のチェック | |
149 | + if (IS_ARG_OK2("-?", "--help")) { | |
150 | + ShowHelp(argv[0]); | |
151 | + return 0; | |
152 | + } | |
153 | + else if (IS_ARG_OK1("--usage")) { | |
154 | + ShowUsage(argv[0]); | |
155 | + return 0; | |
156 | + } | |
157 | + else if (IS_ARG_OK1("--version")) { | |
158 | + ShowVersion(); | |
159 | + return 0; | |
160 | + } | |
161 | + else if (IS_ARG_OK1("--lsfont")) { | |
162 | + if (!pNextArg) { | |
163 | + // 仮にこれが最後の引数だったとしても、次のポインタは | |
164 | + // NULLなので、LsFontの引数としては辻褄があう。 | |
165 | + pNextArg = argv[i + 1]; | |
166 | + } | |
167 | + LsFont(pNextArg); | |
168 | + return 0; | |
169 | + } | |
170 | + else if (IS_ARG_OK2("-c", "--char")) { | |
171 | + if (!pNextArg) { | |
172 | + if (NULL == argv[i + 1]) { | |
173 | + NotEnoughArguments(argv[0]); | |
174 | + return 1; | |
175 | + } | |
176 | + i++; | |
177 | + pNextArg = argv[i]; | |
178 | + } | |
179 | + lpszUseChar = pNextArg; | |
180 | + } | |
181 | + else if (IS_ARG_OK2("-w", "--width")) { | |
182 | + if (!pNextArg) { | |
183 | + if (NULL == argv[i + 1]) { | |
184 | + NotEnoughArguments(argv[0]); | |
185 | + return 1; | |
186 | + } | |
187 | + i++; | |
188 | + pNextArg = argv[i]; | |
189 | + } | |
190 | + nScreenWidth = (int)strtol(pNextArg, NULL, 10); | |
191 | + if (0 >= nScreenWidth) { | |
192 | + fprintf(stderr, "%s: \x95\x5c示幅が狭すぎます。<%d>\n", | |
193 | + GetLongBaseName(argv[0]), nScreenWidth); | |
194 | + return 1; | |
195 | + } | |
196 | + if (MAX_WIDTH <= nScreenWidth) { | |
197 | + fprintf(stderr, "%s: \x95\x5c示幅が大きすぎます。<%d>\n", | |
198 | + GetLongBaseName(argv[0]), nScreenWidth); | |
199 | + return 1; | |
200 | + } | |
201 | + } | |
202 | + else if (IS_ARG_OK2("-F", "--fontname")) { | |
203 | + if (!pNextArg) { | |
204 | + if (NULL == argv[i + 1]) { | |
205 | + NotEnoughArguments(argv[0]); | |
206 | + return 1; | |
207 | + } | |
208 | + i++; | |
209 | + pNextArg = argv[i]; | |
210 | + } | |
211 | + lpszFontName = pNextArg; | |
212 | + } | |
213 | + else if (IS_ARG_OK2("-f", "--fontsize")) { | |
214 | + if (!pNextArg) { | |
215 | + if (NULL == argv[i + 1]) { | |
216 | + NotEnoughArguments(argv[0]); | |
217 | + return 1; | |
218 | + } | |
219 | + i++; | |
220 | + pNextArg = argv[i]; | |
221 | + } | |
222 | + nFontSize = (int)strtol(pNextArg, NULL, 10); | |
223 | + if (0 >= nFontSize) { | |
224 | + fprintf(stderr, "%s: フォントサイズが小さすぎます。<%d>\n", | |
225 | + GetLongBaseName(argv[0]), nFontSize); | |
226 | + return 1; | |
227 | + } | |
228 | + } | |
229 | + else if (IS_ARG_OK1("-d")) { | |
230 | + // デバッグモードにする | |
231 | + bDebug = TRUE; | |
232 | + } | |
233 | + else { | |
234 | + fprintf(stderr, "%s: 無効なオプションです(%s)\n", | |
235 | + GetLongBaseName(argv[0]), argv[i]); | |
236 | + return 1; | |
237 | + } | |
238 | + } | |
239 | + | |
240 | + if (i >= argc) { | |
241 | + NotEnoughArguments(argv[0]); | |
242 | + return 1; | |
243 | + } | |
244 | + | |
245 | + // 使用文字列長に合わせてサイズを調整する | |
246 | + nScreenWidth /= strlen(lpszUseChar); | |
247 | + | |
248 | + if (strlen(lpszUseChar) >= (ULONG)nScreenWidth) { | |
249 | + fprintf(stderr, "%s: \x95\x5c示幅より、" | |
250 | + "使用文字列長が長い為\x95\x5c示できません\n", | |
251 | + GetLongBaseName(argv[0])); | |
252 | + return 1; | |
253 | + } | |
254 | + | |
255 | + Syslogger(FALSE, "DBG: 使用文字=%s, \x95\x5c示幅=%d, " | |
256 | + "フォント=%s, フォントサイズ=%d", | |
257 | + lpszUseChar, nScreenWidth, lpszFontName, nFontSize); | |
258 | + | |
259 | + // 使用フォントの初期化 | |
260 | + if (!SetLogFont(lpszFontName)) { | |
261 | + fprintf(stderr, "%s: フォントファミリが選択できませんでした。\n", | |
262 | + GetLongBaseName(argv[0])); | |
263 | + return 1; | |
264 | + } | |
265 | + | |
266 | + for (; i < argc; i++) { | |
267 | + DrawBanner(lpszUseChar, nScreenWidth, nFontSize, argv[i], bDebug); | |
268 | + } | |
269 | + return 0; | |
270 | +} |
@@ -0,0 +1,232 @@ | ||
1 | +# -*- mode: makefile; coding: sjis-dos; -*- | |
2 | +# Time-stamp: <2003-06-09 12:04:33 tfuruka1> | |
3 | +# Copyright (C) 2003 Tadamegu Furukawa# | |
4 | +# | |
5 | +# jbanner の makefile | |
6 | + | |
7 | +# (while (re-search-forward "^#!" nil t) (replace-match "!")) | |
8 | +# (while (re-search-forward "^!" nil t) (replace-match "#!")) | |
9 | + | |
10 | +# | |
11 | +# この makefaile は概ね以下の構造になっています。 | |
12 | +# | |
13 | +# !if defined(CYGWIN) ←(1) | |
14 | +# | |
15 | +# << CYGWIN の定義部>> ←(2) | |
16 | +# | |
17 | +# !else ←(1) | |
18 | +# | |
19 | +# << MSVC の定義部 >> ←(3) | |
20 | +# | |
21 | +# !endif ←(1) | |
22 | +# | |
23 | +# << 共通の定義 >> | |
24 | +# | |
25 | +# (1)の分部は, nmake でのみ有効な文法ですので, make を使用する場合は, | |
26 | +# コメントアウトして下さい。nmake を使用する場合は, (2), (3)のコメント | |
27 | +# を外して下さい。そして, gcc でコンパイルする場合はコマンドプロンプト | |
28 | +# 等から | |
29 | +# | |
30 | +# nmake CYGWIN=1 | |
31 | +# | |
32 | +# と入力して下さい。MSVC でコンパイルする場合は | |
33 | +# | |
34 | +# nmake | |
35 | +# | |
36 | +# として下さい。make を使用する場合は, !if 文は使用出来ませんので, (1) | |
37 | +# の分部をコメントアウトして下さい。そして, gcc でコンパイルする場合は, | |
38 | +# (2)分部のコメントを外して, (3)の分部をコメントアウトして下さい。MSVC | |
39 | +# でコンパイルする場合は, (3)分部のコメントを外して, (2)の分部をコメン | |
40 | +# トアウトして下さい。そして, コマンドプロンプト等から | |
41 | +# | |
42 | +# make | |
43 | +# | |
44 | +# と入力して下さい。 | |
45 | +# | |
46 | +# $Id: makefile,v 1.1 2004/01/19 09:01:28 tfuruka1 Exp $ | |
47 | +# $Log: makefile,v $ | |
48 | +# Revision 1.1 2004/01/19 09:01:28 tfuruka1 | |
49 | +# リビジョン管理をRCSからCVSへ変更しました。 | |
50 | +# | |
51 | + | |
52 | + | |
53 | +# | |
54 | +# ↓ nmake 以外はコメントアウトして下さい | |
55 | +!if defined(CYGWIN) | |
56 | + | |
57 | +####### | |
58 | +####### CYGWIN用 | |
59 | +####### | |
60 | + | |
61 | +# CYGWIN のリソースコンパイラを通すコツ。IDC_STATIC が定義されていない | |
62 | +# 事とMFCのリソース用ヘッダファイルを使用しないようにすれば、大抵は通 | |
63 | +# ります。以下は例です | |
64 | + | |
65 | +# #ifdef CYGWIN | |
66 | +# # include <windows.h> | |
67 | +# # define IDC_STATIC -1 | |
68 | +# #else | |
69 | +# # include "afxres.h" | |
70 | +# #endif | |
71 | + | |
72 | +# ソケットを使用する場合は、__USE_W32_SOCKETS を定義したほうが良いよう | |
73 | +# です。特に不具合を発見した事は無いのですが、一応ウォーニングが消えな | |
74 | +# いので入れてます。 | |
75 | + | |
76 | +O = o | |
77 | +RES = o | |
78 | +CC = gcc | |
79 | +CFLAGS = -g -DCYGWIN -Wall -D__USE_W32_SOCKETS -mno-cygwin | |
80 | +LDFLAGS = -lwsock32 -lgdi32 | |
81 | +RC = windres | |
82 | +RCFLAGS = --define CYGWIN --define IDC_STATIC=-1 -o | |
83 | + | |
84 | +# ↓ nmake 以外はコメントアウトして下さい | |
85 | +!else | |
86 | + | |
87 | +####### | |
88 | +####### MSC(VC)用 | |
89 | +####### | |
90 | + | |
91 | +O=obj | |
92 | +RES=res | |
93 | +CC=cl | |
94 | +CFLAGS=/W3 /Zi | |
95 | +LDFLAGS=/link user32.lib wsock32.lib gdi32.lib | |
96 | +RC=rc | |
97 | +RCFLAGS= /fo | |
98 | + | |
99 | +# ↓ nmake 以外はコメントアウトして下さい | |
100 | +!endif | |
101 | + | |
102 | +####### | |
103 | +####### 以下はMSVC, gcc共通 | |
104 | +####### | |
105 | + | |
106 | +.SUFFIXES: .$(O) .c | |
107 | +.c.$(O): | |
108 | + $(CC) $(CFLAGS) -c $< | |
109 | + | |
110 | +OBJS = main.$(O) gdi_wrap.$(O) comm.$(O) string.$(O) | |
111 | +RES_BASE = resource | |
112 | +OBJ_RES = $(RES_BASE).$(RES) | |
113 | +BASE_NAME = jbanner | |
114 | +EXE = $(BASE_NAME).exe | |
115 | +TAR_GZ = $(BASE_NAME).tar.gz | |
116 | + | |
117 | +TEXINFO = $(BASE_NAME).texinfo | |
118 | +INFO = $(BASE_NAME).info | |
119 | +PLAIN_TXT = $(BASE_NAME).txt | |
120 | +PDF = $(BASE_NAME).pdf | |
121 | +HTML = $(BASE_NAME).html | |
122 | + | |
123 | +MAKEINFO=/usr/local/bin/makeinfo | |
124 | +TEXINDEX=/usr/local/bin/texindex | |
125 | +DVIPDF=/usr/local/bin/dvipdfmx | |
126 | +ETAGS=/usr/local/Meadow/1.15/bin/etags.exe | |
127 | + | |
128 | +SHELL=/bin/sh | |
129 | + | |
130 | +$(EXE) : $(OBJS) $(OBJ_RES) | |
131 | + $(CC) -o $@ $(CFLAGS) $(OBJS) $(OBJ_RES) $(LDFLAGS) | |
132 | + | |
133 | +# リソースのコンパイル。MSVCのrcとCYGWINのwindresで出力ファイルのオプ | |
134 | +# ションが異なるので、RCFLAGSの一番最後のオプションを出力ファイル名に | |
135 | +# しています。 | |
136 | +$(OBJ_RES) : $(RES_BASE).rc | |
137 | + $(RC) $(RCFLAGS) $@ $(RES_BASE).rc | |
138 | + | |
139 | +$(OBJS) : makefile jbanner.h | |
140 | + | |
141 | +tags: | |
142 | + $(ETAGS) *.c *.h | |
143 | + | |
144 | +# tar で固める。nmake だとshellが呼び出されないので、強制的にshを呼び | |
145 | +# 出しています。 | |
146 | +tar: clean tags | |
147 | + $(SHELL) -c "(cd ..; tar cvzf $(TAR_GZ) src)" | |
148 | + | |
149 | +# | |
150 | +# --- ドキュメント | |
151 | +# | |
152 | +doc : $(INFO) $(PDF) $(BASE_NAME).ps $(PLAIN_TXT) $(HTML) | |
153 | + | |
154 | +# --- html | |
155 | +$(HTML) : $(TEXINFO) makefile | |
156 | + @echo --- | |
157 | + @echo --- make HTML --- | |
158 | + @echo --- | |
159 | + $(MAKEINFO) --html --no-split $(TEXINFO) | |
160 | + cp $@ ../doc/. | |
161 | +# --- text | |
162 | +$(PLAIN_TXT) : $(TEXINFO) makefile | |
163 | + @echo --- | |
164 | + @echo --- make text --- | |
165 | + @echo --- | |
166 | + $(MAKEINFO) --no-headers $(TEXINFO) > $@ | |
167 | + cp $@ ../doc/. | |
168 | +# --- info | |
169 | +$(INFO) : $(TEXINFO) makefile | |
170 | + @echo --- | |
171 | + @echo --- make info --- | |
172 | + @echo --- | |
173 | + $(MAKEINFO) $(TEXINFO) | |
174 | + cp $@ ../doc/. | |
175 | ||
176 | +$(PDF) : $(BASE_NAME).dvi | |
177 | + @echo --- | |
178 | + @echo --- make pdf --- | |
179 | + @echo --- | |
180 | + $(DVIPDF) $(BASE_NAME).dvi | |
181 | + cp $@ ../doc/. | |
182 | + | |
183 | +# --- dvi --- CYGWINのtexindexだと日本語が正しく処理できないので、pTeX | |
184 | +# で配布されているtexindexを使用しています。ところが、pTeXのtexindexだ | |
185 | +# と、ワイルドカードの展開がうまく出来ないようなので、shを強制的に呼び | |
186 | +# 出して処理しています。 | |
187 | +$(BASE_NAME).dvi : $(TEXINFO) makefile | |
188 | + @echo --- | |
189 | + @echo --- make dvi --- | |
190 | + @echo --- | |
191 | + ptex $(TEXINFO) | |
192 | + $(SHELL) -c "$(TEXINDEX) $(BASE_NAME).??" | |
193 | + ptex $(TEXINFO) | |
194 | + ptex $(TEXINFO) | |
195 | +# --- ps | |
196 | +$(BASE_NAME).ps : $(BASE_NAME).dvi | |
197 | + @echo --- | |
198 | + @echo --- make PostScript --- | |
199 | + @echo --- | |
200 | + dvipsk -R600 -Pdl $(BASE_NAME).dvi | |
201 | + | |
202 | +clean : | |
203 | + rm -f *.obj | |
204 | + rm -f *.o | |
205 | + rm -f *.*~ | |
206 | + rm -f *~ | |
207 | + rm -f *.pdb | |
208 | + rm -f *.res | |
209 | + rm -f *.ilk | |
210 | + rm -f *.html | |
211 | + rm -f *.dvi | |
212 | + rm -f *.txt | |
213 | + rm -f *.pdf | |
214 | + rm -f *.ps | |
215 | + rm -f *.toc | |
216 | + rm -f *.log | |
217 | + rm -f *.aux | |
218 | + rm -f *.cp | |
219 | + rm -f *.cps | |
220 | + rm -f *.fn | |
221 | + rm -f *.fns | |
222 | + rm -f *.pg | |
223 | + rm -f *.pgs | |
224 | + rm -f *.tp | |
225 | + rm -f *.tps | |
226 | + rm -f *.vr | |
227 | + rm -f *.vrs | |
228 | + rm -f *.ky | |
229 | + rm -f *.kys | |
230 | + rm -f *.info | |
231 | + rm -f ../$(TAR_GZ) | |
232 | + rm -f $(EXE) |
@@ -0,0 +1,16 @@ | ||
1 | +//{{NO_DEPENDENCIES}} | |
2 | +// Microsoft Developer Studio generated include file. | |
3 | +// Used by resource.rc | |
4 | +// | |
5 | +#define IDI_ICON1 101 | |
6 | + | |
7 | +// Next default values for new objects | |
8 | +// | |
9 | +#ifdef APSTUDIO_INVOKED | |
10 | +#ifndef APSTUDIO_READONLY_SYMBOLS | |
11 | +#define _APS_NEXT_RESOURCE_VALUE 102 | |
12 | +#define _APS_NEXT_COMMAND_VALUE 40001 | |
13 | +#define _APS_NEXT_CONTROL_VALUE 1000 | |
14 | +#define _APS_NEXT_SYMED_VALUE 101 | |
15 | +#endif | |
16 | +#endif |
@@ -0,0 +1,77 @@ | ||
1 | +//Microsoft Developer Studio generated resource script. | |
2 | +// | |
3 | +#include "resource.h" | |
4 | + | |
5 | +#define APSTUDIO_READONLY_SYMBOLS | |
6 | +///////////////////////////////////////////////////////////////////////////// | |
7 | +// | |
8 | +// Generated from the TEXTINCLUDE 2 resource. | |
9 | +// | |
10 | +#ifdef CYGWIN | |
11 | +# include <windows.h> | |
12 | +# define IDC_STATIC -1 | |
13 | +#else | |
14 | +# include "afxres.h" | |
15 | +#endif | |
16 | + | |
17 | +///////////////////////////////////////////////////////////////////////////// | |
18 | +#undef APSTUDIO_READONLY_SYMBOLS | |
19 | + | |
20 | +///////////////////////////////////////////////////////////////////////////// | |
21 | +// 日本語 resources | |
22 | + | |
23 | +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) | |
24 | +#ifdef _WIN32 | |
25 | +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT | |
26 | +#pragma code_page(932) | |
27 | +#endif //_WIN32 | |
28 | + | |
29 | +///////////////////////////////////////////////////////////////////////////// | |
30 | +// | |
31 | +// Icon | |
32 | +// | |
33 | + | |
34 | +// Icon with lowest ID value placed first to ensure application icon | |
35 | +// remains consistent on all systems. | |
36 | +IDI_ICON1 ICON DISCARDABLE "icon1.ico" | |
37 | + | |
38 | +#ifdef APSTUDIO_INVOKED | |
39 | +///////////////////////////////////////////////////////////////////////////// | |
40 | +// | |
41 | +// TEXTINCLUDE | |
42 | +// | |
43 | + | |
44 | +1 TEXTINCLUDE DISCARDABLE | |
45 | +BEGIN | |
46 | + "resource.h\0" | |
47 | +END | |
48 | + | |
49 | +2 TEXTINCLUDE DISCARDABLE | |
50 | +BEGIN | |
51 | + "#include ""afxres.h""\r\n" | |
52 | + "\0" | |
53 | +END | |
54 | + | |
55 | +3 TEXTINCLUDE DISCARDABLE | |
56 | +BEGIN | |
57 | + "\r\n" | |
58 | + "\0" | |
59 | +END | |
60 | + | |
61 | +#endif // APSTUDIO_INVOKED | |
62 | + | |
63 | +#endif // 日本語 resources | |
64 | +///////////////////////////////////////////////////////////////////////////// | |
65 | + | |
66 | + | |
67 | + | |
68 | +#ifndef APSTUDIO_INVOKED | |
69 | +///////////////////////////////////////////////////////////////////////////// | |
70 | +// | |
71 | +// Generated from the TEXTINCLUDE 3 resource. | |
72 | +// | |
73 | + | |
74 | + | |
75 | +///////////////////////////////////////////////////////////////////////////// | |
76 | +#endif // not APSTUDIO_INVOKED | |
77 | + |
@@ -0,0 +1,163 @@ | ||
1 | +/* -*- mode: c++; coding: sjis-dos; -*- | |
2 | + * Time-stamp: <2003-06-01 15:28:34 tfuruka1> | |
3 | + * Copyright (C) 2003 Tadamegu Furukawa | |
4 | + * | |
5 | + * 文字列操作関数 | |
6 | + * | |
7 | + * $Id: string.c,v 1.1 2004/01/19 09:01:27 tfuruka1 Exp $ | |
8 | + * $Log: string.c,v $ | |
9 | + * Revision 1.1 2004/01/19 09:01:27 tfuruka1 | |
10 | + * リビジョン管理をRCSからCVSへ変更しました。 | |
11 | + * | |
12 | + */ | |
13 | +// (replace-regexp "/\\*\\(.+\\)\\*/" "//\\1") | |
14 | +// (replace-regexp "[ \t]+$" "") | |
15 | + | |
16 | +#include <windows.h> | |
17 | +#include <stdio.h> | |
18 | + | |
19 | +#define Z_SPACE "\x81\x40" // 全角スペース | |
20 | + | |
21 | +/* ------------------------------------------------------------------- | |
22 | + * 文字列の右側のスペース文字を取り除く | |
23 | + * *-----------------------------------------------------------------*/ | |
24 | +LPTSTR TrimRight(LPTSTR lpszStr) | |
25 | +{ | |
26 | + size_t len = strlen(lpszStr); | |
27 | + | |
28 | + for (--len; len; len--) { | |
29 | + if ('\r' == *(lpszStr + len) | |
30 | + || '\n' == *(lpszStr + len) | |
31 | + || '\t' == *(lpszStr + len) | |
32 | + || '\f' == *(lpszStr + len) | |
33 | + || ' ' == *(lpszStr + len)) { | |
34 | + *(lpszStr + len) = '\0'; | |
35 | + } | |
36 | + else { | |
37 | + break; | |
38 | + } | |
39 | + } | |
40 | + return lpszStr; | |
41 | +} | |
42 | + | |
43 | +/* ------------------------------------------------------------------- | |
44 | + * 文字列の右側の全角スペース文字を取り除く | |
45 | + * *-----------------------------------------------------------------*/ | |
46 | +LPTSTR TrimRightJa(LPTSTR lpszStr) | |
47 | +{ | |
48 | + size_t len = strlen(lpszStr) - 2; | |
49 | + | |
50 | + for (; len; len -= 2) { | |
51 | + if (0 == strcmp(Z_SPACE, lpszStr + len)) { | |
52 | + *(lpszStr + len) = '\0'; | |
53 | + } | |
54 | + else { | |
55 | + break; | |
56 | + } | |
57 | + } | |
58 | + return lpszStr; | |
59 | +} | |
60 | + | |
61 | +/* ------------------------------------------------------------------- | |
62 | + * 文字列の左側のスペース文字を取り除く | |
63 | + * *-----------------------------------------------------------------*/ | |
64 | +LPTSTR TrimLeft(LPTSTR lpszStr) | |
65 | +{ | |
66 | + LPTSTR pFrom = lpszStr, pTo = lpszStr; | |
67 | + | |
68 | + for (; *pFrom; pFrom++) { | |
69 | + if ('\r' != *pFrom | |
70 | + && '\n' != *pFrom | |
71 | + && '\t' != *pFrom | |
72 | + && '\f' != *pFrom | |
73 | + && ' ' != *pFrom) { | |
74 | + break; | |
75 | + } | |
76 | + } | |
77 | + | |
78 | + if (pFrom == pTo) { // 余分な文字は無い | |
79 | + return lpszStr; | |
80 | + } | |
81 | + for (; *pFrom; pFrom++, pTo++) { | |
82 | + *pTo = *pFrom; | |
83 | + } | |
84 | + *pTo = '\0'; | |
85 | + return lpszStr; | |
86 | +} | |
87 | + | |
88 | +/* ------------------------------------------------------------------- | |
89 | + * 文字列の左右のスペース文字を取り除く | |
90 | + * *-----------------------------------------------------------------*/ | |
91 | +LPTSTR TrimString(LPSTR lpszStr) | |
92 | +{ | |
93 | + return TrimLeft(TrimRight(lpszStr)); | |
94 | +} | |
95 | + | |
96 | +/* ------------------------------------------------------------------- | |
97 | + * fgetsと同様の処理を行うが、タブをスペース文字列へ展開する。但し、タ | |
98 | + * ブの展開を途中で止める事は無いので、最大文字列長はタブストップを考 | |
99 | + * 慮する必要がある。 | |
100 | + * *-----------------------------------------------------------------*/ | |
101 | +LPTSTR | |
102 | +ufgets( | |
103 | + LPTSTR szBuf, // 格納バッファ | |
104 | + int cbMax, // 最大文字列長 | |
105 | + FILE *fp, // ファイルポインタ | |
106 | + int nTab // タブストップ | |
107 | + ) | |
108 | +{ | |
109 | + int i, j, c; | |
110 | + | |
111 | + for (i = 0; i < cbMax - 1; i++) { | |
112 | + if (EOF == (c = getc(fp))) break; | |
113 | + if ('\t' == c) { | |
114 | + for (j = 0; j < (nTab - (i % nTab)); j++) { | |
115 | + *szBuf++ = ' '; | |
116 | + } | |
117 | + i += (nTab - (i % nTab)); | |
118 | + i--; | |
119 | + continue; | |
120 | + } | |
121 | + *szBuf++ = c; | |
122 | + if ('\n' == c) { | |
123 | + i++; | |
124 | + break; | |
125 | + } | |
126 | + } | |
127 | + *szBuf = '\0'; | |
128 | + | |
129 | + if (!i) { | |
130 | + return NULL; | |
131 | + } | |
132 | + return szBuf; | |
133 | +} | |
134 | + | |
135 | +/* ------------------------------------------------------------------- | |
136 | + * strの文字列を区切り文字cで区切り、区切られた文字列の先頭アドレスを | |
137 | + * それぞれ*intoに格納する。但しmaxで指定された数より多くは区切らない。 | |
138 | + * 連続した区切り文字は1つと見る。 | |
139 | + * *-----------------------------------------------------------------*/ | |
140 | +int unstr(char *str, int c, char *into[], int max) | |
141 | +{ | |
142 | + int intomax = 0; | |
143 | + | |
144 | + into[intomax++] = str; | |
145 | + while (*str) { | |
146 | + if((int)*str == c) { | |
147 | + if(intomax < max) { | |
148 | + *str++ = '\0'; | |
149 | + while((int)*str == c) { | |
150 | + str++; | |
151 | + } | |
152 | + into[intomax++] = str; | |
153 | + } | |
154 | + else { | |
155 | + return 0; | |
156 | + } | |
157 | + } | |
158 | + else { | |
159 | + str++; | |
160 | + } | |
161 | + } | |
162 | + return intomax; | |
163 | +} |