changeset 8:61ce4754737e

bug fix.
author pyon@macmini
date Tue, 03 Apr 2018 00:11:01 +0900
parents 8de5b1bd9506
children cc5262d43399
files xdwaddatn2.cpp xdwaddpage2.cpp xdwextpage2.cpp xdwgrep2.cpp xdwsort.cpp
diffstat 5 files changed, 211 insertions(+), 122 deletions(-) [+]
line wrap: on
line diff
--- a/xdwaddatn2.cpp	Sat Mar 24 08:51:45 2018 +0900
+++ b/xdwaddatn2.cpp	Tue Apr 03 00:11:01 2018 +0900
@@ -1,14 +1,14 @@
 /* Makefile
-debug: xdwaddatn2.c
+debug: xdwaddatn2.cpp
 	#rm -rf tempXXXX
 	#cls
-	g++ -g -O0 -I. xdwaddatn2.c xdwapi.lib
+	gcc -g -O0 -I. xdwaddatn2.cpp xdwapi.lib
 	#date
 	#./a.exe -m -i target.xdw
 	#date
 
-release: xdwaddatn2.c
-	g++ -I. xdwaddatn2.c xdwapi.lib -static -o xdwaddatn2.exe
+release: xdwaddatn2.cpp
+	gcc -I. xdwaddatn2.cpp xdwapi.lib -static -o xdwaddatn2.exe
 	strip xdwaddatn2.exe
 
 clean:
@@ -28,7 +28,6 @@
 
 #define MAXCOL  1024
 #define MAXLINE 9999
-#define BLOCKSZ   64
 
 void print_error( int code ) {
 	switch ( code ) {
--- a/xdwaddpage2.cpp	Sat Mar 24 08:51:45 2018 +0900
+++ b/xdwaddpage2.cpp	Tue Apr 03 00:11:01 2018 +0900
@@ -1,16 +1,18 @@
 /* Makefile
-debug: xdwaddpage2.c
+debug: xdwaddpage2.cpp
 	#cls
-	g++ -g -O0 -I. xdwaddpage2.c xdwapi.lib
+	gcc -g -O0 -I. xdwaddpage2.cpp xdwapi.lib
 
-release: xdwaddpage2.c
-	g++ -I. xdwaddpage2.c xdwapi.lib -static -o xdwaddpage2.exe
+release: xdwaddpage2.cpp
+	gcc -I. xdwaddpage2.cpp xdwapi.lib -static -o xdwaddpage2.exe
 	strip xdwaddpage2.exe
 
 clean:
 	rm -rf tempXXXX
 */
 
+#include <unistd.h>
+#include <stdbool.h>
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -50,6 +52,16 @@
 	}
 }
 
+void print_help() {
+	char prog[12] = "xdwaddpage2";
+	fprintf( stderr, "Usage:\n" );
+	fprintf( stderr, " %s infile\n", prog );
+	fprintf( stderr, " %s -l infile\n", prog );
+	fprintf( stderr, " %s -ltxt infile\n", prog );
+	fprintf( stderr, " %s -s S infile\n", prog );
+	fprintf( stderr, " %s -v infile\n", prog );
+}
+
 void print_now( char const *msg ) {
    time_t now = time( NULL );
    struct tm *ts = localtime( &now );
@@ -80,53 +92,39 @@
 int main( int argc, char* argv[] ) {
 
 	/* オプションの解析 */
-	char prog[128];
-	strcpy( prog, argv[0] );
+	bool pnow = false;
+	bool pleft = false;
+	char *ltext = NULL;
+	int sp = 1;
 
-	int pnow = 0;
-	int pstart = 0;
-	int pleft = 0;
-	char c;
-	while ( --argc > 0 && ( *++argv )[0] == '-' ) {
-		while ( c = *++argv[0] ) {
-			switch ( c ) {
-				case 'v':
-					pnow = 1;
-					print_now( "start." );
-					break;
-				case 'l':
-					pleft = 1;
-					break;
-				case 's':
-					pstart = 1;
-					break;
-				default:
-					fprintf( stderr, "error: illegal option '%c'.\n", c );
+	int opt;
+	while ( ( opt = getopt( argc, argv, "vs:l::" ) ) != -1 ) {
+		switch ( opt ) {
+			case 'v':
+				pnow = true;
+				print_now( "start." );
+				break;
+			case 'l':
+				pleft = true;
+				ltext = optarg;
+				break;
+			case 's':
+				sp = atoi( optarg );
+				if ( sp == 0 ) {
+					print_help();
 					exit( 1 );
-			}
+				}
+				break;
+			default:
+				print_help();
+				exit( 1 );
 		}
 	}
 
-	int sp = 1;
 	char in_path[ _MAX_PATH ];
-	if ( argc == 1 ) {
-		_fullpath( in_path, argv[0], _MAX_PATH );
-	} else if ( argc == 2 ) {
-		if ( pstart == 1 ) {
-			sp = atoi( argv[0] );
-			_fullpath( in_path, argv[1], _MAX_PATH );
-		}
-	} else {
-		fprintf( stderr, "%s infile\n", prog );
-		fprintf( stderr, "%s -l infile\n", prog );
-		fprintf( stderr, "%s -s S infile\n", prog );
-		fprintf( stderr, "%s -v infile\n", prog );
-		exit( 1 );
-	}
+	_fullpath( in_path, argv[ argc - 1 ], _MAX_PATH );
 
 	/* 本処理 */
-	if ( pnow ) print_now( "adding pages." );
-
 	int api_result = 0;
 
 	XDW_DOCUMENT_HANDLE h = NULL; // 文書ハンドルを開く
@@ -143,14 +141,19 @@
 
     int sz = 80;    // 文字サイズ
     int tr = 1;     // 透明フラグ
-    char pagenum[18];
+    char pagenum[18], lpagenum[30];
 
 	// アノテーションを貼り付ける
     for ( int p = 0; p < last_page; p++ ) {
-        sprintf( pagenum, "%05d-%05d-%05d", p + sp, p + 1,last_page );
-		if ( pleft == 1 )
-			api_result = add_annotation( h, p + 1,  1700,  5600, pagenum, &sz, tr );    // 左上
+        sprintf( pagenum, "%05d-%05d-%05d", p + sp, p + 1, last_page );
         api_result = add_annotation( h, p + 1, 17500, 28500, pagenum, &sz, tr );        // 右下
+		if ( pleft ) {
+			if ( ltext != NULL ) 
+				sprintf( lpagenum, "%s%s", pagenum, ltext );
+			else
+				sprintf( lpagenum, "%s", pagenum );
+			api_result = add_annotation( h, p + 1,  1700,  5600, lpagenum, &sz, tr );    // 左上
+		}
         if ( api_result < 0 ) {
             print_error( api_result );
             break;
--- 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 );
--- a/xdwgrep2.cpp	Sat Mar 24 08:51:45 2018 +0900
+++ b/xdwgrep2.cpp	Tue Apr 03 00:11:01 2018 +0900
@@ -1,12 +1,12 @@
 /* Makefile
-debug: xdwgrep2.c
-	gcc -g -O0 -I. xdwgrep2.c xdwapi.lib
+debug: xdwgrep2.cpp
+	gcc -g -O0 -I. xdwgrep2.cpp xdwapi.lib
 	#date
 	#./a.exe target.xdw
 	#date
 
-release: xdwgrep2.c
-	gcc -I. xdwgrep2.c xdwapi.lib -static -o xdwgrep2.exe
+release: xdwgrep2.cpp
+	gcc -I. xdwgrep2.cpp xdwapi.lib -static -o xdwgrep2.exe
 	strip xdwgrep2.exe
 
 */
@@ -21,7 +21,7 @@
 #include <xdw_api.h>
 
 #define MAXKWORD  256
-#define MAXLINE   256
+#define MAXLINE  4096
 
 void print_error( int code ) {
 	fprintf( stderr, "Error code : %d\n", code );
@@ -52,7 +52,7 @@
 	}
 }
 
-void print_now( char *msg ) {
+void print_now( const char *msg ) {
    time_t now = time( NULL );
    struct tm *ts = localtime( &now );
 
@@ -62,7 +62,7 @@
 }
 
 /* 指定された単語で検索 */
-int xdw_grep( char infile[ _MAX_PATH ], char outfile[ _MAX_PATH ], char keyword[ MAXKWORD ], int inv ) {
+int xdw_grep( const char infile[ _MAX_PATH ], const char outfile[ _MAX_PATH ], const char keyword[ MAXKWORD ], int inv ) {
 
 	char in_path[ _MAX_PATH ], out_path[ _MAX_PATH ], tmp_path[ _MAX_PATH ];
 	_fullpath( in_path,  infile,  _MAX_PATH );
@@ -118,7 +118,7 @@
 }
 
 /* 検索する単語のリストをファイルから読み込む */
-int xdw_grep_list( char infile[ _MAX_PATH ], char outfile[ _MAX_PATH ], bool inv ) {
+int xdw_grep_list( const char infile[ _MAX_PATH ], const char outfile[ _MAX_PATH ], bool inv ) {
 
 	char in_path[ _MAX_PATH ], out_path[ _MAX_PATH ], tmp_path[ _MAX_PATH ];
 	_fullpath( in_path,  infile,  _MAX_PATH );
--- a/xdwsort.cpp	Sat Mar 24 08:51:45 2018 +0900
+++ b/xdwsort.cpp	Tue Apr 03 00:11:01 2018 +0900
@@ -1,20 +1,21 @@
 /* Makefile
-debug: xdwsort.c
+debug: xdwsort.cpp
 	#rm -rf tempXXXX
 	#cls
-	gcc -g -O0 -I. xdwsort.c xdwapi.lib
+	gcc -g -O0 -I. xdwsort.cpp xdwapi.lib
 	#date
 	#./a.exe target.xdw
 	#date
 
-release: xdwsort.c
-	gcc -I. xdwsort.c xdwapi.lib -static -o xdwsort.exe
+release: xdwsort.cpp
+	gcc -I. xdwsort.cpp xdwapi.lib -static -o xdwsort.exe
 	strip xdwsort.exe
 
 clean:
 	rm -rf tempXXXX
 */
 
+#include <stdbool.h>
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -57,7 +58,7 @@
 	}
 }
 
-void print_now( char *msg ) {
+void print_now( const char *msg ) {
    time_t now = time( NULL );
    struct tm *ts = localtime( &now );
 
@@ -72,17 +73,23 @@
 	char prog[128];
 	strcpy( prog, argv[0] );
 
-	int pnow = 0;
+	bool pnow = false;
+	bool debug = false;
 	char c;
 	while ( --argc > 0 && ( *++argv )[0] == '-' ) {
 		while ( c = *++argv[0] ) {
 			switch ( c ) {
 				case 'v':
-					pnow = 1;
+					pnow = true;
 					print_now( "start." );
 					break;
 				case 'l':	/* now writing... */
 					break;
+				case 'd':
+					pnow = true;
+					debug = true;
+					print_now( "debug-mode start." );
+					break;
 				default:
 					fprintf( stderr, "error: illegal option '%c'.\n", c );
 					exit( 1 );
@@ -93,6 +100,7 @@
 	if ( argc < 1 ) {
 		fprintf( stderr, "%s infile\n", prog );
 		fprintf( stderr, "%s -v infile\n", prog );
+		fprintf( stderr, "%s -d infile\n", prog );
 		exit( 1 );
 	}
 
@@ -109,7 +117,7 @@
 	}
 
 	if ( ( fp = fopen( "sort.list", "r" ) ) == NULL ) {
-		fprintf( stderr, "%s: can't open file [sort.list]\n", argv[0] );
+		fprintf( stderr, "%s: can't open file [sort.list]\n", prog );
 		exit ( 1 );
 	}
 
@@ -223,14 +231,15 @@
 		strncpy( &blk_path[ m * _MAX_PATH ], in_path, _MAX_PATH );
 		blk_path_addr[m] = &blk_path[ m * _MAX_PATH ];
 	}
-	if ( last_page % BLOCKSZ != 0 ) {
-		sprintf( buf, "tempXXXX/b%04d.xdw", ++bn );
-		_fullpath( in_path, buf, _MAX_PATH );
-		api_result = XDW_MergeXdwFiles( blk_path_addr, last_page % BLOCKSZ, in_path, NULL );
-		if ( api_result < 0 ) {
-			print_error( api_result );
-			exit( 1 );
-		}
+
+	sprintf( buf, "tempXXXX/b%04d.xdw", ++bn );
+	_fullpath( in_path, buf, _MAX_PATH );
+	int mod = last_page % BLOCKSZ;
+	if ( mod == 0 ) mod = BLOCKSZ; 
+	api_result = XDW_MergeXdwFiles( blk_path_addr, mod, in_path, NULL );
+	if ( api_result < 0 ) {
+		print_error( api_result );
+		exit( 1 );
 	}
 
 	// ブロックをまとめる
@@ -291,15 +300,17 @@
 	}
 
 	/* 後処理 */
-	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 ( !debug ) {
+		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;