Mercurial > mercurial > hgweb_xdwtools.cgi
changeset 11:3cecce3b2ce3
add (f)lex file.
author | pyon@macmini |
---|---|
date | Fri, 15 Jun 2018 18:44:44 +0900 |
parents | e421bcd3bce4 |
children | e07f9f1d1cc5 |
files | xdwhno.lex |
diffstat | 1 files changed, 273 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdwhno.lex Fri Jun 15 18:44:44 2018 +0900 @@ -0,0 +1,273 @@ +/* xdwhno Last Change: 2018-06-15 金 09:48:07. + +release: xdwhno.lex + flex xdwhno.lex + gcc -I. lex.yy.c xdwapi.lib -static -o xdwhno.exe + strip xdwhno.exe + +機能: + DocuWorks文書から被保番らしいものを抽出 + +*/ +/*** Definition section ***/ + +%{ + +/* + * C コードにはCの標準I/O ライブラリを使うものがある. + * %{と %} で囲まれた部分はそのまま生成ファイルに取り込まれる. + */ +#include <stdio.h> +#include <stdbool.h> +int mcnt = 1; +int column = 1; +bool verbose = false; +bool debug = false; +bool plno = false; +bool z2h = false; +FILE *fp1, *fp2; + +%} + +/* これはflexに入力ファイルが一つであることを示す. */ +/* %option noyywrap */ + +%% + /* + * 規則領域 + * コメントはインデントしなければならない.そうしないと正規表現と誤認識してしまう. + */ + +0[1238]0[0-9]{7} { + /* + * この規則は入力から整数を表示する. + * yytextには一致した文字列が含まれる. + */ + /* 同一行の mcnt 回のマッチだったら処理 */ + if ( mcnt == column ) { + if ( plno ) printf( "%d,", yylineno ); + printf( "%s\n", yytext ); + } + mcnt++; + } +\n { + mcnt = 1; + yylineno++; + ECHO; + } +0 { unput( '0' ); } +1 { unput( '1' ); } +2 { unput( '2' ); } +3 { unput( '3' ); } +4 { unput( '4' ); } +5 { unput( '5' ); } +6 { unput( '6' ); } +7 { unput( '7' ); } +8 { unput( '8' ); } +9 { unput( '9' ); } +<<EOF>> { } +. { ECHO; } + +%% +/*** Cコード領域 ***/ + +/* + * メインプログラム. + * 字句解析を呼び出し、処理が済むと終了する. + */ + + +#include <unistd.h> +#include <stdlib.h> +#include <io.h> +#include <glob.h> + +#include <windows.h> +#include <xdw_api.h> + +void print_error( int code ) { + switch ( code ) { + case XDW_E_NOT_INSTALLED: + fprintf( stderr, "DocuWorksがインストールされていません。" ); + break; + case XDW_E_FILE_NOT_FOUND: + fprintf( stderr, "指定されたファイルが見つかりません。" ); + break; + case XDW_E_FILE_EXISTS: + fprintf( stderr, "指定されたファイルはすでに存在します。" ); + break; + case XDW_E_ACCESSDENIED: + fprintf( stderr, "指定されたファイルを開くことができません。" ); + break; + case XDW_E_INVALID_NAME: + case XDW_E_BAD_NETPATH: + fprintf( stderr, "指定されたファイルを開くことができません。(ネットワーク)" ); + break; + case XDW_E_BAD_FORMAT: + fprintf( stderr, "指定されたファイルは正しいフォーマットではありません。" ); + break; + case XDW_E_INVALID_ACCESS: + fprintf( stderr, "指定された操作をする権利がありません。" ); + break; + case XDW_E_SHARING_VIOLATION: + fprintf( stderr, "ファイルが使用中です。" ); + break; + default: + fprintf( stderr, "エラーが発生しました。" ); + break; + } + fprintf( stderr, "[ Error code : %d ]\n", code ); +} + +void print_help() { + char prog[12] = "xdwhno"; + fprintf( stderr, "Usage:\n" ); + fprintf( stderr, " %s infile\n", prog ); + fprintf( stderr, " %s -v infile\n", prog ); + fprintf( stderr, " %s -p infile ( print line-no )\n", prog ); + fprintf( stderr, " %s -c N infile ( N-th match )\n", prog ); + fprintf( stderr, " %s -z infile ( not implement )\n", prog ); + fprintf( stderr, " %s -d dir ( not implement )\n", prog ); + fprintf( stderr, " %s -x ( debug )\n", prog ); +} + +int xdw2txt( const char* in_path, const char *tmpfile ) { + + FILE *fp; + if ( ( fp = fopen( tmpfile, "w" ) ) == NULL ) { + fprintf( stderr, "can't open tmp file [%s].\n", tmpfile ); + exit( 1 ); + } + + int api_result = 0; + // 文書ハンドルを開く + XDW_DOCUMENT_HANDLE h = NULL; + XDW_OPEN_MODE_EX mode = { + sizeof( XDW_OPEN_MODE_EX ), XDW_OPEN_READONLY, XDW_AUTH_NODIALOGUE + }; + api_result = XDW_OpenDocumentHandle( in_path, &h, (XDW_OPEN_MODE*)&mode ); + if ( api_result < 0 ) { + print_error( api_result ); + return 1; + } + // XDW_GetDocumentInformationを用いて総ページ数を得る + XDW_DOCUMENT_INFO info = { sizeof(XDW_DOCUMENT_INFO), 0, 0, 0 }; + XDW_GetDocumentInformation(h, &info); + int nPage = info.nPages; + + long datasize; + char* lpszvalue; + // メイン処理 + for ( int i = 1; i <= nPage; i++ ) { + datasize = XDW_GetPageTextToMemory( h, i, NULL, 0, NULL ); + lpszvalue = (char*)malloc( sizeof(char)*datasize ); + XDW_GetPageTextToMemory( h, i, lpszvalue, datasize, NULL ); + + fprintf( fp, "%s\n", lpszvalue ); + free( lpszvalue ); + } + + if ( api_result < 0 ) { + print_error( api_result ); + return 1; + } + + // 文書ハンドルを閉じる + XDW_CloseDocumentHandle( h, NULL ); + + fclose( fp ); +} + +int main( int argc, char** argv ) { + // オプションの解析 + char prog[128]; + strcpy( prog, argv[0] ); + + bool zenkaku = false; + bool globdir = false; + + int opt; + while ( ( opt = getopt( argc, argv, "pvzxdc::" ) ) != -1 ) { + switch ( opt ) { + case 'x': + debug = true; + break; + case 'v': + verbose = true; + break; + case 'p': + plno = true; + break; + case 'c': + column = atoi( optarg ); + break; + case 'z': + zenkaku = true; + break; + case 'd': + globdir = true; + break; + default: + fprintf( stderr, "error: illegal option '%c'.\n", opt ); + print_help(); + exit( 1 ); + } + } + + if ( argc == 1 ) { + print_help(); + exit( 1 ); + } + + char in_path[ _MAX_PATH ]; + _fullpath( in_path, argv[ argc - 1 ], _MAX_PATH ); + + xdw2txt( in_path, "xdwhno.tmp1" ); + if ( verbose ) fprintf( stderr, "x2t done.\n" ); + + if ( ( fp1 = fopen( "xdwhno.tmp1", "r" ) ) == NULL ) { + fprintf( stderr, "can't open tmp file [%s].\n", "xdwhno.tmp1" ); + exit( 1 ); + } + + if ( ( fp2 = fopen( "xdwhno.tmp2", "w" ) ) == NULL ) { + fprintf( stderr, "can't open tmp file [%s].\n", "xdwhno.tmp2" ); + exit( 1 ); + } + + yyin = fp1; + yyout = fp2; + yylex(); // 字句解析の呼び出し + + return 0; +} + +int yywrap() { + if ( z2h ) { + if ( verbose ) fprintf( stderr, "analysis done.\n" ); + fclose( fp1 ); + fclose( fp2 ); + + if ( !debug ) { + unlink( "xdwhno.tmp1" ); + unlink( "xdwhno.tmp2" ); + } + + exit( 0 ); + } + + z2h = true; + if ( verbose ) fprintf( stderr, "z2h done.\n" ); + + yyout = NULL; + yylineno = 1; + + if ( ( fp2 = freopen( "xdwhno.tmp2", "r", fp2 ) ) == NULL ) { + fprintf( stderr, "can't open tmp file [%s].\n", "xdwhno.tmp2" ); + exit( 1 ); + } + + yyin = fp2; + + return 0; +}