Mercurial > mercurial > hgweb_xdwtools.cgi
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 } |