水無瀬の部屋 > Programming > sample > cur2cpp > cur2cpp.cpp |
---|
1: //*********************************************************
2: // プロジェクト: cur2cpp
3: // ファイル名: cur2cpp.cpp
4: //*********************************************************
5: #include "cur2cpp.h"
6: #include "instdlg.h" //
7: #include "loadcur.h"
8: #include "putcpp.h"
9: #include "cmdline.h"
10: #include <filefmt/curfile.h>
11: #include <filefmt/bmpfile.h>
12: #include <misc/pathargv.h>
13:
14:
15: //---------------------------------------------------------
16: // マクロ定数 の 定義
17: //---------------------------------------------------------
18: //
19: #define MUTEX_INSTALLDLG ( "cur2cpp.InstallDlg" )
20: //
21: #define MODE_CUR2CPP ( 1 ) // 変換実行
22: #define MODE_INSTALL ( 2 ) // インストール
23:
24:
25: //---------------------------------------------------------
26: // ファイルスコープ関数 の 宣言
27: //---------------------------------------------------------
28: static int GetApplicationMode( int argc, char **argv );
29: static int CommandLineApplicationMainProc( HINSTANCE hInstance, int argc, char **argv );
30: static int ApplicationInstallMainProc( HINSTANCE hInstance, int argc, char **argv );
31:
32:
33: //*********************************************************
34: // ApplicationMainProc
35: //*********************************************************
36: int
37: ApplicationMainProc
38: (
39: HINSTANCE hInstance,
40: int argc,
41: char **argv
42: )
43: {
44: // パラメタの仮定
45: ASSERT( IsValidInstanceHandle( hInstance ) );
46: ASSERT( IsValidArgcArgv( argc, argv ) );
47: ASSERT( IsPathMyself( argv[ 0 ] ) ); // 自分自身
48:
49: //
50: const int mode = GetApplicationMode( argc, argv );
51: switch( mode )
52: {
53: default: return EXIT_FAILURE;
54: case MODE_CUR2CPP: return CommandLineApplicationMainProc( hInstance, argc, argv );
55: case MODE_INSTALL: return ApplicationInstallMainProc( hInstance, argc, argv );
56: }
57: }//ApplicationMainProc
58:
59:
60: //******************************************************************************************************************
61: // private
62: //******************************************************************************************************************
63: //*********************************************************
64: // GetApplicationMode
65: //*********************************************************
66: static
67: int
68: GetApplicationMode
69: (
70: int argc,
71: char **argv
72: )
73: {
74: // パラメタの仮定
75: ASSERT( IsValidArgcArgv( argc, argv ) );
76: ASSERT( IsPathMyself( argv[ 0 ] ) ); // 自分自身
77:
78: // 引数が無ければ 設定 モード
79: return (1 < argc) ? MODE_CUR2CPP : MODE_INSTALL ;
80: }//GetApplicationMode
81:
82:
83: //******************************************************************************************************************
84: // private - MODE_INSTALL
85: //******************************************************************************************************************
86: //*********************************************************
87: // ApplicationInstallMainProc
88: //*********************************************************
89: static
90: int
91: ApplicationInstallMainProc
92: (
93: HINSTANCE hInstance,
94: int argc,
95: char **argv
96: )
97: {
98: // パラメタの仮定
99: ASSERT( IsValidInstanceHandle( hInstance ) );
100: ASSERT( IsValidArgcArgv( argc, argv ) );
101: ASSERT( IsPathMyself( argv[ 0 ] ) ); // 自分自身
102:
103: //
104: HANDLE hMutex = CreateMutexOnce( MUTEX_INSTALLDLG );
105: if ( hMutex )
106: {
107: InstallDlg( HWND_DESKTOP );
108: VERIFY( CloseHandle( hMutex ) );
109: }
110:
111: return EXIT_SUCCESS;
112: }//ApplicationInstallMainProc
113:
114:
115: //******************************************************************************************************************
116: // private - MODE_CUR2CPP
117: //******************************************************************************************************************
118: static FILE *CreateCodeFile( const char *curfile );
119:
120:
121: //*********************************************************
122: // CommandLineApplicationMainProc
123: //*********************************************************
124: static
125: int
126: CommandLineApplicationMainProc
127: (
128: HINSTANCE hInstance,
129: int argc,
130: char **argv
131: )
132: {
133: // パラメタの仮定
134: ASSERT( IsValidInstanceHandle( hInstance ) );
135: ASSERT( IsValidArgcArgv( argc, argv ) );
136: ASSERT( IsPathMyself( argv[ 0 ] ) ); // 自分自身
137:
138: //
139: const DWORD flags = get_cmdline_option( argc, argv );
140:
141: //
142: int count;
143: char **paths = GetPathArgcArgv( &count, argc - 1 , argv + 1 );
144: if ( paths )
145: {
146: {for( int i = 0; i < count; ++i )
147: {
148: if ( IsPathFile( paths[ i ] ) )
149: {
150: // カーソルを読み込む
151: FILE *fr = fopen( paths[ i ], "rb" );
152: if ( fr )
153: {
154: MONOCHROMECURSORFILEDATA_t *cursor = LoadMonochromeCursorFileData( fr );
155: if ( cursor )
156: {
157: char *code = GenerateCode( &cursor->cih, &cursor->bih, cursor->maskXOR, cursor->maskAND );
158: if ( code )
159: {
160: // クリップボードへ
161: if ( FLAG_TOCLIPBOARD == (FLAG_TOCLIPBOARD & flags) )
162: {
163: SetClipboardText( HWND_DESKTOP, code );
164: }
165:
166: // ファイルへ
167: if ( FLAG_TOFILE == (FLAG_TOFILE & flags) )
168: {
169: FILE *fw = CreateCodeFile( paths[ i ] );
170: if ( fw )
171: {
172: fputs( code, fw );
173: VERIFY( 0 == fclose( fw ) );
174: }
175: }
176: free( code );
177: }
178:
179: // カーソルを破棄する
180: VERIFY( ReleaseMonochromeCursorFileData( cursor ) );
181: }
182: VERIFY( 0 == fclose( fr ) );
183: }
184: }
185: }}
186: VERIFY( ReleasePathArgcArgv( count, paths ) );
187: }
188:
189: return EXIT_SUCCESS;
190: }//CommandLineApplicationMainProc
191:
192: //*********************************************************
193: // CreateCodeFile
194: // body.cur => body.cpp
195: //*********************************************************
196: static
197: FILE *
198: CreateCodeFile
199: (
200: const char *curfile
201: )
202: {
203: // パラメタの仮定
204: ASSERT( IsPathFile( curfile ) );
205:
206: char cppfile[ MAX_PATH_BUF ];
207: strcopy( cppfile, numof( cppfile ), curfile );
208: SwapFileExtension( cppfile, numof( cppfile ), ".cpp" );
209:
210: // 既にディレクトリがある
211: // これを上書きするわけにはいかない
212: if ( IsPathDirectory( cppfile ) )
213: {
214: return null;
215: }
216:
217: // 既にファイルがあれば上書きする前にゴミ箱へバックアップする
218: if ( IsPathFile( cppfile ) )
219: {
220: char backupfile[ MAX_PATH_BUF ];
221: VERIFY( 0 < snprintf( backupfile, numof(backupfile)-1, "%s%c%c", cppfile, '\0', '\0' ) );
222: MoveFileToRecycleBin( HWND_DESKTOP, backupfile, FOF_SILENT| FOF_NOCONFIRMATION );
223: Sleep( 100 );
224: }
225:
226: return fopen( cppfile, "wb" );
227: }//CreateCodeFile
228:
229:
230: //** end **
参照:
水無瀬の部屋 > sample > cur2cpp > cur2cpp.cpp |
---|
このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/cur2cpp/cur2cpp_cpp.shtml