view xdwsplit2.cpp @ 6:a4af60a0ec32

add xdwextpage2.
author pyon@macmini
date Thu, 09 Nov 2017 18:42:22 +0900
parents af8f454d20ed
children
line wrap: on
line source

/* Makefile
debug: xdwsplit2.c
	#rm -rf tempXXXX
	#cls
	gcc -g -O0 -I. xdwsplit2.c xdwapi.lib

release: xdwsplit2.c
	gcc -I. xdwsplit2.c xdwapi.lib -static -o xdwsplit2.exe
	strip xdwsplit2.exe

clean:
	rm -rf tempXXXX
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <glob.h>
#include <io.h>
#include <windows.h>
#include <xdw_api.h>


void print_error( int code ) {
	fprintf( stderr, "Error code : %d\n", 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:
	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;
	default:
		fprintf( stderr, "エラーが発生しました。" );
		break;
	}
}

void print_now( char *msg ) {
   time_t now = time( NULL );
   struct tm *ts = localtime( &now );

   char buf[80];
   strftime( buf, sizeof( buf ), "%H:%M:%S %Z", ts );
   printf( "%s\t%s\n", buf, msg );
}

int main( int argc, char* argv[] ) {

	/* オプションの解析 */
	char prog[128];
	strcpy( prog, argv[0] );

	int pnow = 0;
	int text = 0;
	int pstart = 0;
	char c;
	while ( --argc > 0 && ( *++argv )[0] == '-' ) {
		while ( c = *++argv[0] ) {
			switch ( c ) {
				case 'v':
					pnow = 1;
					print_now( "start." );
					break;
				case 's':
					pstart = 1;
					break;
				case 't':
					text = 1;
					break;
				default:
					fprintf( stderr, "error: illegal option '%c'.\n", c );
					exit( 1 );
			}
		}
	}

	int sp;
	char in_path[ _MAX_PATH ];
	if ( argc == 1 ) {
		sp = 1;
		pstart = 1;
		_fullpath( in_path, argv[0], _MAX_PATH );
	} else if ( argc == 2 ) {
		if ( pstart == 1 ) {
			sp = 1;
			pstart = atoi( argv[0] );
			_fullpath( in_path, argv[1], _MAX_PATH );
		} else {
			sp = atoi( argv[0] );
			_fullpath( in_path, argv[1], _MAX_PATH );
		}
	} else {
		fprintf( stderr, "%s infile\n", prog );
		fprintf( stderr, "%s P infile\n", prog );
		fprintf( stderr, "%s -t infile\n", prog );
		fprintf( stderr, "%s -s S infile\n", prog );
		fprintf( stderr, "%s -v P infile\n", prog );
		exit( 1 );
	}

	/* 本処理 */
	if ( pnow ) print_now( "splitting xdw-file." );

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

	XDW_DOCUMENT_INFO info = { sizeof( XDW_DOCUMENT_INFO ), 0, 0, 0 }; // 総ページ数を得る
	XDW_GetDocumentInformation( h, &info );
	int last_page = info.nPages;
	if ( last_page <= sp ) {
		fprintf( stderr, "bad num. ( %d <= %d )\n", last_page, sp );
		exit( 1 );
	}

	if ( pnow ) print_now( "extracting pages." );

	if ( sp != 1 ) mkdir( "tempXXXX" );

	char buf[ _MAX_PATH ];
    long datasize;
    char* lpszvalue;

	for ( int p = 0; p < last_page; p++ ) {
		if ( sp == 1 ) 
			sprintf( buf, "%05d.xdw", pstart++ );
		else
			sprintf( buf, "tempXXXX/%05d.xdw", p + 1 );

		_fullpath( in_path, buf, _MAX_PATH );
		api_result = XDW_GetPage( h, p + 1, in_path, NULL );
		if ( api_result < 0 ) {
			print_error( api_result );
			exit( 1 );
		}
		if ( text == 1 ) {
			datasize = XDW_GetPageTextToMemory( h, p, NULL, 0, NULL );
			lpszvalue = (char*)malloc( sizeof(char) * datasize );
			XDW_GetPageTextToMemory( h, p, lpszvalue, datasize, NULL );
			//printf( "%s\n", lpszvalue );
			free( lpszvalue );
		}
	}
	XDW_CloseDocumentHandle( h, NULL ); // 文書ハンドルを閉じる

	/* 1ページ毎ならマージする必要なし */
	if ( sp == 1 ) {
		if ( pnow ) print_now( "done." );
		return 0;
	}

	/* マージ */
	if ( pnow ) print_now( "merging pages." );

	char *blk_path = (char*)malloc( sp * sizeof( char ) * _MAX_PATH );
	const char **blk_path_addr = (const char**)malloc( ( last_page / sp + 1 ) * sizeof( char* ) * _MAX_PATH );

	int bn = 0;
	// ブロック毎の処理
	for ( int p = 0, m = 0; p < last_page; p++ ) {
		m = p % sp;
		if ( m == 0 && p > 0 ) {
			sprintf( buf, "%05d.xdw", ++bn );
			_fullpath( in_path, buf, _MAX_PATH );
			api_result = XDW_MergeXdwFiles( blk_path_addr, sp, in_path, NULL );
			if ( api_result < 0 ) {
				print_error( api_result );
				exit( 1 );
			}
		} 
		sprintf( buf, "tempXXXX/%05d.xdw", p + 1 );
		_fullpath( in_path, buf, _MAX_PATH );
		strncpy( &blk_path[ m * _MAX_PATH ], in_path, _MAX_PATH );
		blk_path_addr[m] = &blk_path[ m * _MAX_PATH ];
	}
	if ( last_page % sp != 0 ) {
		sprintf( buf, "%05d.xdw", ++bn );
		_fullpath( in_path, buf, _MAX_PATH );
		api_result = XDW_MergeXdwFiles( blk_path_addr, last_page % sp, in_path, NULL );
		if ( api_result < 0 ) {
			print_error( api_result );
			exit( 1 );
		}
	}

	free( blk_path );
	free( blk_path_addr );

	/* 後処理 */
	if ( pnow ) print_now( "cleaning." );
	glob_t globbuf;
    glob( "tempXXXX/*.*", 0, NULL, &globbuf );
    for ( int i = 0; i < globbuf.gl_pathc; i++ ) {
		_fullpath( in_path, globbuf.gl_pathv[i], _MAX_PATH );
		remove( in_path );
    }
    globfree( &globbuf );
	rmdir( "tempXXXX" );

	if ( pnow ) print_now( "done." );
	return 0;
}