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