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 } |
