comparison xdwhno.lex @ 11:3cecce3b2ce3

add (f)lex file.
author pyon@macmini
date Fri, 15 Jun 2018 18:44:44 +0900
parents
children
comparison
equal deleted inserted replaced
10:e421bcd3bce4 11:3cecce3b2ce3
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 }