diff xdwextpage2.cpp @ 8:61ce4754737e

bug fix.
author pyon@macmini
date Tue, 03 Apr 2018 00:11:01 +0900
parents a4af60a0ec32
children
line wrap: on
line diff
--- a/xdwextpage2.cpp	Sat Mar 24 08:51:45 2018 +0900
+++ b/xdwextpage2.cpp	Tue Apr 03 00:11:01 2018 +0900
@@ -1,16 +1,17 @@
 /* Makefile
-debug: xdwextpage2.c
-	gcc -g -O0 -I. xdwextpage2.c xdwapi.lib
+debug: xdwextpage2.cpp
+	gcc -g -O0 -I. xdwextpage2.cpp xdwapi.lib
 	#date
 	#./a.exe target.xdw
 	#date
 
-release: xdwextpage2.c
-	gcc -I. xdwextpage2.c xdwapi.lib -static -o xdwextpage2.exe
+release: xdwextpage2.cpp
+	gcc -I. xdwextpage2.cpp xdwapi.lib -static -o xdwextpage2.exe
 	strip xdwextpage2.exe
 
 */
 
+#include <stdbool.h>
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -19,6 +20,9 @@
 #include <windows.h>
 #include <xdw_api.h>
 
+#define MAXCOL  1024
+#define MAXLINE 9999
+
 void print_error( int code ) {
 	fprintf( stderr, "Error code : %d\n", code );
 	switch ( code ) {
@@ -48,7 +52,17 @@
 	}
 }
 
-void print_now( char *msg ) {
+void print_help( const char *prog ) {
+	fprintf( stderr, "%s p infile outfile\n",     prog );
+	fprintf( stderr, "%s -i infile outfile\n",    prog );
+	fprintf( stderr, "%s -i -v infile outfile\n", prog );
+	fprintf( stderr, "%s -l p infile outfile\n",  prog );
+	fprintf( stderr, "%s p:q infile outfile\n",   prog );
+	fprintf( stderr, "%s p:  infile outfile\n",   prog );
+	fprintf( stderr, "%s  :q infile outfile\n",   prog );
+}
+
+void print_now( const char *msg ) {
    time_t now = time( NULL );
    struct tm *ts = localtime( &now );
 
@@ -63,15 +77,26 @@
 	char prog[128];
 	strcpy( prog, argv[0] );
 
-	int pnow = 0;
+	bool pnow  = false;
+	bool plist = false;
+	bool inv   = false;
 	char c;
 	while ( --argc > 0 && ( *++argv )[0] == '-' ) {
 		while ( c = *++argv[0] ) {
 			switch ( c ) {
 				case 'l':
-					pnow = 1;
+					pnow = true;
 					print_now( "start." );
 					break;
+				case 'v':
+					inv = true;
+					break;
+				case 'i':
+					plist = true;
+					break;
+				case 'h':
+					print_help( prog );
+					exit( 1 );
 				default:
 					fprintf( stderr, "error: illegal option '%c'.\n", c );
 					exit( 1 );
@@ -79,27 +104,26 @@
 		}
 	}
 
-	if ( argc != 3 ) {
-		fprintf( stderr, "%s p infile outfile\n",    prog );
-		fprintf( stderr, "%s -l p infile outfile\n", prog );
-		fprintf( stderr, "%s p:q infile outfile\n",  prog );
-		fprintf( stderr, "%s p:  infile outfile\n",  prog );
-		fprintf( stderr, "%s  :q infile outfile\n",  prog );
+	if ( argc != 3 && !plist ) {
+		print_help( prog );
 		exit( 1 );
 	}
 
 	/* メイン処理 */
-	if ( pnow ) print_now( "start." );
 
 	char in_path[ _MAX_PATH ], out_path[ _MAX_PATH ], tmp_path[ _MAX_PATH ];
 	_fullpath( in_path,  argv[1], _MAX_PATH );
 	_fullpath( out_path, argv[2], _MAX_PATH );
+	if ( plist ) {
+		_fullpath( in_path,  argv[0], _MAX_PATH );
+		_fullpath( out_path, argv[1], _MAX_PATH );
+	}
 	_fullpath( tmp_path, "tempXXXX.xdw", _MAX_PATH );
 
 	remove( tmp_path );
 	remove( out_path );
 
-	char buf[ _MAX_PATH ];
+	char buf[ MAXCOL ];
 	sprintf( buf, "copy %s %s", in_path, tmp_path );
 	system( buf );
 
@@ -118,34 +142,86 @@
 	XDW_GetDocumentInformation( h, &info );
 	int last_page = info.nPages;
 
-	int bgn = 1;
-	int end = 0;
-	if ( strchr( argv[0], ':' ) == NULL ) {
-		bgn = end = atoi( argv[0] );
-	} else {
-		if ( strcmp( argv[0], ":" ) == 0 ) {
+	if ( plist ) {
+		/* リストの取り込み */
+		char *al = (char*)malloc( MAXLINE * sizeof( char ) * MAXCOL );
+		int alN = 0;
+		if ( plist ) {
+			if ( pnow ) print_now( "reading list." );
+			FILE *fp;
+
+			if ( al == NULL ) {
+				fprintf( stderr, "can't allocate memory\n" );
+				exit( 1 );
+			}
+
+			if ( ( fp = fopen( "extpage.list", "r" ) ) == NULL ) {
+				fprintf( stderr, "%s: can't open file [extpage.list]\n", prog );
+				exit ( 1 );
+			}
+			char *p;
+			while ( fgets( buf, sizeof buf, fp ) ) {
+				if ( !strncmp( buf, "#",  1 ) ) continue;
+				if ( !strncmp( buf, "//", 2 ) ) continue;
+				if ( !strcmp( buf, "\n" )     ) continue;
+
+				if ( ( p = strchr( buf, '\n' ) ) != NULL ) {
+					*p = '\0';
+				}
+				strncpy( &al[ alN * MAXCOL ], buf, MAXCOL );
+				alN++;
+			}
+			fclose( fp );
+		}
+
+		bool ext[MAXLINE];
+		for ( int p = 0; p < last_page; p++ ) ext[p] = false;
+		for ( int i = 0; i < alN; i++ ) {
+			int p = atoi( &al[ i * MAXCOL ] );
+			if ( p != 0 ) ext[ p - 1 ] = true;
+		}
+		if ( inv ) for ( int p = 0; p < last_page; p++ ) ext[p] = !ext[p];
+
+		for ( int p = last_page; p > 0; p-- ) {
+			if ( !ext[ p - 1 ] ) {
+				api_result = XDW_DeletePage( h, p, NULL );
+				if ( api_result < 0 ) {
+					print_error( api_result );
+					exit( 1 );
+				}
+			}
+		}
+	}
+	else {
+		int bgn = 1;
+		int end = 0;
+		if ( strchr( argv[0], ':' ) == NULL ) {
+			bgn = end = atoi( argv[0] );
+		} else {
+			if ( strcmp( argv[0], ":" ) == 0 ) {
+				fprintf( stderr, "bad page range.\n" );
+				exit( 1 );
+			}
+			if ( argv[0][0] == ':' ) {
+				end = atoi( strtok( argv[0], ":" ) );
+			} else {
+				bgn = atoi( strtok( argv[0], ":" ) );
+				end = atoi( strtok( NULL, ":" ) );
+				if ( end == 0 ) end = last_page;
+			}
+		}
+
+		//printf( "bgn = %d, end = %d\n", bgn, end );
+		if ( bgn < 1 || end < 1 || bgn > end || bgn > last_page || end > last_page ) {
 			fprintf( stderr, "bad page range.\n" );
 			exit( 1 );
 		}
-		if ( argv[0][0] == ':' ) {
-			end = atoi( strtok( argv[0], ":" ) );
-		} else {
-			bgn = atoi( strtok( argv[0], ":" ) );
-			end = atoi( strtok( NULL, ":" ) );
-			if ( end == 0 ) end = last_page;
+
+		for ( int i = last_page; i > 0; i-- ) {
+			if ( i < bgn || i > end ) api_result = XDW_DeletePage( h, i, NULL );
 		}
 	}
 
-	//printf( "bgn = %d, end = %d\n", bgn, end );
-	if ( bgn < 1 || end < 1 || bgn > end || bgn > last_page || end > last_page ) {
-		fprintf( stderr, "bad page range.\n" );
-		exit( 1 );
-	}
-
-	for ( int i = last_page; i > 0; i-- ) {
-		if ( i < bgn || i > end ) api_result = XDW_DeletePage( h, i, NULL );
-	}
-
 	// 文書ハンドルを閉じる
 	XDW_SaveDocument( h, NULL );
 	XDW_CloseDocumentHandle( h, NULL );