11
|
1 /* xdwhno Last Change: 2018-06-15 金 09:48:07.
|
|
2
|
|
3 release: xdwhno.lex
|
|
4 flex xdwhno.lex
|
|
5 gcc -I. lex.yy.c xdwapi.lib -static -o xdwhno.exe
|
|
6 strip xdwhno.exe
|
|
7
|
|
8 機能:
|
|
9 DocuWorks文書から被保番らしいものを抽出
|
|
10
|
|
11 */
|
|
12 /*** Definition section ***/
|
|
13
|
|
14 %{
|
|
15
|
|
16 /*
|
|
17 * C コードにはCの標準I/O ライブラリを使うものがある.
|
|
18 * %{と %} で囲まれた部分はそのまま生成ファイルに取り込まれる.
|
|
19 */
|
|
20 #include <stdio.h>
|
|
21 #include <stdbool.h>
|
|
22 int mcnt = 1;
|
|
23 int column = 1;
|
|
24 bool verbose = false;
|
|
25 bool debug = false;
|
|
26 bool plno = false;
|
|
27 bool z2h = false;
|
|
28 FILE *fp1, *fp2;
|
|
29
|
|
30 %}
|
|
31
|
|
32 /* これはflexに入力ファイルが一つであることを示す. */
|
|
33 /* %option noyywrap */
|
|
34
|
|
35 %%
|
|
36 /*
|
|
37 * 規則領域
|
|
38 * コメントはインデントしなければならない.そうしないと正規表現と誤認識してしまう.
|
|
39 */
|
|
40
|
|
41 0[1238]0[0-9]{7} {
|
|
42 /*
|
|
43 * この規則は入力から整数を表示する.
|
|
44 * yytextには一致した文字列が含まれる.
|
|
45 */
|
|
46 /* 同一行の mcnt 回のマッチだったら処理 */
|
|
47 if ( mcnt == column ) {
|
|
48 if ( plno ) printf( "%d,", yylineno );
|
|
49 printf( "%s\n", yytext );
|
|
50 }
|
|
51 mcnt++;
|
|
52 }
|
|
53 \n {
|
|
54 mcnt = 1;
|
|
55 yylineno++;
|
|
56 ECHO;
|
|
57 }
|
|
58 0 { unput( '0' ); }
|
|
59 1 { unput( '1' ); }
|
|
60 2 { unput( '2' ); }
|
|
61 3 { unput( '3' ); }
|
|
62 4 { unput( '4' ); }
|
|
63 5 { unput( '5' ); }
|
|
64 6 { unput( '6' ); }
|
|
65 7 { unput( '7' ); }
|
|
66 8 { unput( '8' ); }
|
|
67 9 { unput( '9' ); }
|
|
68 <<EOF>> { }
|
|
69 . { ECHO; }
|
|
70
|
|
71 %%
|
|
72 /*** Cコード領域 ***/
|
|
73
|
|
74 /*
|
|
75 * メインプログラム.
|
|
76 * 字句解析を呼び出し、処理が済むと終了する.
|
|
77 */
|
|
78
|
|
79
|
|
80 #include <unistd.h>
|
|
81 #include <stdlib.h>
|
|
82 #include <io.h>
|
|
83 #include <glob.h>
|
|
84
|
|
85 #include <windows.h>
|
|
86 #include <xdw_api.h>
|
|
87
|
|
88 void print_error( int code ) {
|
|
89 switch ( code ) {
|
|
90 case XDW_E_NOT_INSTALLED:
|
|
91 fprintf( stderr, "DocuWorksがインストールされていません。" );
|
|
92 break;
|
|
93 case XDW_E_FILE_NOT_FOUND:
|
|
94 fprintf( stderr, "指定されたファイルが見つかりません。" );
|
|
95 break;
|
|
96 case XDW_E_FILE_EXISTS:
|
|
97 fprintf( stderr, "指定されたファイルはすでに存在します。" );
|
|
98 break;
|
|
99 case XDW_E_ACCESSDENIED:
|
|
100 fprintf( stderr, "指定されたファイルを開くことができません。" );
|
|
101 break;
|
|
102 case XDW_E_INVALID_NAME:
|
|
103 case XDW_E_BAD_NETPATH:
|
|
104 fprintf( stderr, "指定されたファイルを開くことができません。(ネットワーク)" );
|
|
105 break;
|
|
106 case XDW_E_BAD_FORMAT:
|
|
107 fprintf( stderr, "指定されたファイルは正しいフォーマットではありません。" );
|
|
108 break;
|
|
109 case XDW_E_INVALID_ACCESS:
|
|
110 fprintf( stderr, "指定された操作をする権利がありません。" );
|
|
111 break;
|
|
112 case XDW_E_SHARING_VIOLATION:
|
|
113 fprintf( stderr, "ファイルが使用中です。" );
|
|
114 break;
|
|
115 default:
|
|
116 fprintf( stderr, "エラーが発生しました。" );
|
|
117 break;
|
|
118 }
|
|
119 fprintf( stderr, "[ Error code : %d ]\n", code );
|
|
120 }
|
|
121
|
|
122 void print_help() {
|
|
123 char prog[12] = "xdwhno";
|
|
124 fprintf( stderr, "Usage:\n" );
|
|
125 fprintf( stderr, " %s infile\n", prog );
|
|
126 fprintf( stderr, " %s -v infile\n", prog );
|
|
127 fprintf( stderr, " %s -p infile ( print line-no )\n", prog );
|
|
128 fprintf( stderr, " %s -c N infile ( N-th match )\n", prog );
|
|
129 fprintf( stderr, " %s -z infile ( not implement )\n", prog );
|
|
130 fprintf( stderr, " %s -d dir ( not implement )\n", prog );
|
|
131 fprintf( stderr, " %s -x ( debug )\n", prog );
|
|
132 }
|
|
133
|
|
134 int xdw2txt( const char* in_path, const char *tmpfile ) {
|
|
135
|
|
136 FILE *fp;
|
|
137 if ( ( fp = fopen( tmpfile, "w" ) ) == NULL ) {
|
|
138 fprintf( stderr, "can't open tmp file [%s].\n", tmpfile );
|
|
139 exit( 1 );
|
|
140 }
|
|
141
|
|
142 int api_result = 0;
|
|
143 // 文書ハンドルを開く
|
|
144 XDW_DOCUMENT_HANDLE h = NULL;
|
|
145 XDW_OPEN_MODE_EX mode = {
|
|
146 sizeof( XDW_OPEN_MODE_EX ), XDW_OPEN_READONLY, XDW_AUTH_NODIALOGUE
|
|
147 };
|
|
148 api_result = XDW_OpenDocumentHandle( in_path, &h, (XDW_OPEN_MODE*)&mode );
|
|
149 if ( api_result < 0 ) {
|
|
150 print_error( api_result );
|
|
151 return 1;
|
|
152 }
|
|
153 // XDW_GetDocumentInformationを用いて総ページ数を得る
|
|
154 XDW_DOCUMENT_INFO info = { sizeof(XDW_DOCUMENT_INFO), 0, 0, 0 };
|
|
155 XDW_GetDocumentInformation(h, &info);
|
|
156 int nPage = info.nPages;
|
|
157
|
|
158 long datasize;
|
|
159 char* lpszvalue;
|
|
160 // メイン処理
|
|
161 for ( int i = 1; i <= nPage; i++ ) {
|
|
162 datasize = XDW_GetPageTextToMemory( h, i, NULL, 0, NULL );
|
|
163 lpszvalue = (char*)malloc( sizeof(char)*datasize );
|
|
164 XDW_GetPageTextToMemory( h, i, lpszvalue, datasize, NULL );
|
|
165
|
|
166 fprintf( fp, "%s\n", lpszvalue );
|
|
167 free( lpszvalue );
|
|
168 }
|
|
169
|
|
170 if ( api_result < 0 ) {
|
|
171 print_error( api_result );
|
|
172 return 1;
|
|
173 }
|
|
174
|
|
175 // 文書ハンドルを閉じる
|
|
176 XDW_CloseDocumentHandle( h, NULL );
|
|
177
|
|
178 fclose( fp );
|
|
179 }
|
|
180
|
|
181 int main( int argc, char** argv ) {
|
|
182 // オプションの解析
|
|
183 char prog[128];
|
|
184 strcpy( prog, argv[0] );
|
|
185
|
|
186 bool zenkaku = false;
|
|
187 bool globdir = false;
|
|
188
|
|
189 int opt;
|
|
190 while ( ( opt = getopt( argc, argv, "pvzxdc::" ) ) != -1 ) {
|
|
191 switch ( opt ) {
|
|
192 case 'x':
|
|
193 debug = true;
|
|
194 break;
|
|
195 case 'v':
|
|
196 verbose = true;
|
|
197 break;
|
|
198 case 'p':
|
|
199 plno = true;
|
|
200 break;
|
|
201 case 'c':
|
|
202 column = atoi( optarg );
|
|
203 break;
|
|
204 case 'z':
|
|
205 zenkaku = true;
|
|
206 break;
|
|
207 case 'd':
|
|
208 globdir = true;
|
|
209 break;
|
|
210 default:
|
|
211 fprintf( stderr, "error: illegal option '%c'.\n", opt );
|
|
212 print_help();
|
|
213 exit( 1 );
|
|
214 }
|
|
215 }
|
|
216
|
|
217 if ( argc == 1 ) {
|
|
218 print_help();
|
|
219 exit( 1 );
|
|
220 }
|
|
221
|
|
222 char in_path[ _MAX_PATH ];
|
|
223 _fullpath( in_path, argv[ argc - 1 ], _MAX_PATH );
|
|
224
|
|
225 xdw2txt( in_path, "xdwhno.tmp1" );
|
|
226 if ( verbose ) fprintf( stderr, "x2t done.\n" );
|
|
227
|
|
228 if ( ( fp1 = fopen( "xdwhno.tmp1", "r" ) ) == NULL ) {
|
|
229 fprintf( stderr, "can't open tmp file [%s].\n", "xdwhno.tmp1" );
|
|
230 exit( 1 );
|
|
231 }
|
|
232
|
|
233 if ( ( fp2 = fopen( "xdwhno.tmp2", "w" ) ) == NULL ) {
|
|
234 fprintf( stderr, "can't open tmp file [%s].\n", "xdwhno.tmp2" );
|
|
235 exit( 1 );
|
|
236 }
|
|
237
|
|
238 yyin = fp1;
|
|
239 yyout = fp2;
|
|
240 yylex(); // 字句解析の呼び出し
|
|
241
|
|
242 return 0;
|
|
243 }
|
|
244
|
|
245 int yywrap() {
|
|
246 if ( z2h ) {
|
|
247 if ( verbose ) fprintf( stderr, "analysis done.\n" );
|
|
248 fclose( fp1 );
|
|
249 fclose( fp2 );
|
|
250
|
|
251 if ( !debug ) {
|
|
252 unlink( "xdwhno.tmp1" );
|
|
253 unlink( "xdwhno.tmp2" );
|
|
254 }
|
|
255
|
|
256 exit( 0 );
|
|
257 }
|
|
258
|
|
259 z2h = true;
|
|
260 if ( verbose ) fprintf( stderr, "z2h done.\n" );
|
|
261
|
|
262 yyout = NULL;
|
|
263 yylineno = 1;
|
|
264
|
|
265 if ( ( fp2 = freopen( "xdwhno.tmp2", "r", fp2 ) ) == NULL ) {
|
|
266 fprintf( stderr, "can't open tmp file [%s].\n", "xdwhno.tmp2" );
|
|
267 exit( 1 );
|
|
268 }
|
|
269
|
|
270 yyin = fp2;
|
|
271
|
|
272 return 0;
|
|
273 }
|