view xdwhno.lex @ 11:3cecce3b2ce3

add (f)lex file.
author pyon@macmini
date Fri, 15 Jun 2018 18:44:44 +0900
parents
children
line wrap: on
line source

/* 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;
}