• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

jbanner は, 日本語を含む文字列を拡大し, バナーとして画面に表示するコマンドです。


Commit MetaInfo

Revision7f7a845d77e91b80195513f6f0b1b34e4e7d32df (tree)
Time2004-01-19 18:01:27
Authortfuruka1 <tfuruka1>
Commitertfuruka1

Log Message

リビジョン管理をRCSからCVSへ変更しました。

Change Summary

Incremental Difference

--- /dev/null
+++ b/src/comm.c
@@ -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+}
--- /dev/null
+++ b/src/gdi_wrap.c
@@ -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
Binary files /dev/null and b/src/icon1.ico differ
--- /dev/null
+++ b/src/jbanner.h
@@ -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
--- /dev/null
+++ b/src/jbanner.texinfo
@@ -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
--- /dev/null
+++ b/src/main.c
@@ -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+}
--- /dev/null
+++ b/src/makefile
@@ -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+# --- pdf
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)
--- /dev/null
+++ b/src/resource.h
@@ -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
--- /dev/null
+++ b/src/resource.rc
@@ -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+
--- /dev/null
+++ b/src/string.c
@@ -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+}