comparison xdwextpage2.cpp @ 8:61ce4754737e

bug fix.
author pyon@macmini
date Tue, 03 Apr 2018 00:11:01 +0900
parents a4af60a0ec32
children
comparison
equal deleted inserted replaced
7:8de5b1bd9506 8:61ce4754737e
1 /* Makefile 1 /* Makefile
2 debug: xdwextpage2.c 2 debug: xdwextpage2.cpp
3 gcc -g -O0 -I. xdwextpage2.c xdwapi.lib 3 gcc -g -O0 -I. xdwextpage2.cpp xdwapi.lib
4 #date 4 #date
5 #./a.exe target.xdw 5 #./a.exe target.xdw
6 #date 6 #date
7 7
8 release: xdwextpage2.c 8 release: xdwextpage2.cpp
9 gcc -I. xdwextpage2.c xdwapi.lib -static -o xdwextpage2.exe 9 gcc -I. xdwextpage2.cpp xdwapi.lib -static -o xdwextpage2.exe
10 strip xdwextpage2.exe 10 strip xdwextpage2.exe
11 11
12 */ 12 */
13 13
14 #include <stdbool.h>
14 #include <stdio.h> 15 #include <stdio.h>
15 #include <string.h> 16 #include <string.h>
16 #include <stdlib.h> 17 #include <stdlib.h>
17 #include <time.h> 18 #include <time.h>
18 #include <io.h> 19 #include <io.h>
19 #include <windows.h> 20 #include <windows.h>
20 #include <xdw_api.h> 21 #include <xdw_api.h>
21 22
23 #define MAXCOL 1024
24 #define MAXLINE 9999
25
22 void print_error( int code ) { 26 void print_error( int code ) {
23 fprintf( stderr, "Error code : %d\n", code ); 27 fprintf( stderr, "Error code : %d\n", code );
24 switch ( code ) { 28 switch ( code ) {
25 case XDW_E_NOT_INSTALLED: 29 case XDW_E_NOT_INSTALLED:
26 fprintf( stderr, "DocuWorksがインストールされていません。" ); 30 fprintf( stderr, "DocuWorksがインストールされていません。" );
46 fprintf( stderr, "エラーが発生しました。" ); 50 fprintf( stderr, "エラーが発生しました。" );
47 break; 51 break;
48 } 52 }
49 } 53 }
50 54
51 void print_now( char *msg ) { 55 void print_help( const char *prog ) {
56 fprintf( stderr, "%s p infile outfile\n", prog );
57 fprintf( stderr, "%s -i infile outfile\n", prog );
58 fprintf( stderr, "%s -i -v infile outfile\n", prog );
59 fprintf( stderr, "%s -l p infile outfile\n", prog );
60 fprintf( stderr, "%s p:q infile outfile\n", prog );
61 fprintf( stderr, "%s p: infile outfile\n", prog );
62 fprintf( stderr, "%s :q infile outfile\n", prog );
63 }
64
65 void print_now( const char *msg ) {
52 time_t now = time( NULL ); 66 time_t now = time( NULL );
53 struct tm *ts = localtime( &now ); 67 struct tm *ts = localtime( &now );
54 68
55 char buf[80]; 69 char buf[80];
56 strftime( buf, sizeof( buf ), "%H:%M:%S %Z", ts ); 70 strftime( buf, sizeof( buf ), "%H:%M:%S %Z", ts );
61 75
62 /* オプションの解析 */ 76 /* オプションの解析 */
63 char prog[128]; 77 char prog[128];
64 strcpy( prog, argv[0] ); 78 strcpy( prog, argv[0] );
65 79
66 int pnow = 0; 80 bool pnow = false;
81 bool plist = false;
82 bool inv = false;
67 char c; 83 char c;
68 while ( --argc > 0 && ( *++argv )[0] == '-' ) { 84 while ( --argc > 0 && ( *++argv )[0] == '-' ) {
69 while ( c = *++argv[0] ) { 85 while ( c = *++argv[0] ) {
70 switch ( c ) { 86 switch ( c ) {
71 case 'l': 87 case 'l':
72 pnow = 1; 88 pnow = true;
73 print_now( "start." ); 89 print_now( "start." );
74 break; 90 break;
91 case 'v':
92 inv = true;
93 break;
94 case 'i':
95 plist = true;
96 break;
97 case 'h':
98 print_help( prog );
99 exit( 1 );
75 default: 100 default:
76 fprintf( stderr, "error: illegal option '%c'.\n", c ); 101 fprintf( stderr, "error: illegal option '%c'.\n", c );
77 exit( 1 ); 102 exit( 1 );
78 } 103 }
79 } 104 }
80 } 105 }
81 106
82 if ( argc != 3 ) { 107 if ( argc != 3 && !plist ) {
83 fprintf( stderr, "%s p infile outfile\n", prog ); 108 print_help( prog );
84 fprintf( stderr, "%s -l p infile outfile\n", prog );
85 fprintf( stderr, "%s p:q infile outfile\n", prog );
86 fprintf( stderr, "%s p: infile outfile\n", prog );
87 fprintf( stderr, "%s :q infile outfile\n", prog );
88 exit( 1 ); 109 exit( 1 );
89 } 110 }
90 111
91 /* メイン処理 */ 112 /* メイン処理 */
92 if ( pnow ) print_now( "start." );
93 113
94 char in_path[ _MAX_PATH ], out_path[ _MAX_PATH ], tmp_path[ _MAX_PATH ]; 114 char in_path[ _MAX_PATH ], out_path[ _MAX_PATH ], tmp_path[ _MAX_PATH ];
95 _fullpath( in_path, argv[1], _MAX_PATH ); 115 _fullpath( in_path, argv[1], _MAX_PATH );
96 _fullpath( out_path, argv[2], _MAX_PATH ); 116 _fullpath( out_path, argv[2], _MAX_PATH );
117 if ( plist ) {
118 _fullpath( in_path, argv[0], _MAX_PATH );
119 _fullpath( out_path, argv[1], _MAX_PATH );
120 }
97 _fullpath( tmp_path, "tempXXXX.xdw", _MAX_PATH ); 121 _fullpath( tmp_path, "tempXXXX.xdw", _MAX_PATH );
98 122
99 remove( tmp_path ); 123 remove( tmp_path );
100 remove( out_path ); 124 remove( out_path );
101 125
102 char buf[ _MAX_PATH ]; 126 char buf[ MAXCOL ];
103 sprintf( buf, "copy %s %s", in_path, tmp_path ); 127 sprintf( buf, "copy %s %s", in_path, tmp_path );
104 system( buf ); 128 system( buf );
105 129
106 int api_result = 0; 130 int api_result = 0;
107 131
116 140
117 XDW_DOCUMENT_INFO info = { sizeof( XDW_DOCUMENT_INFO ), 0, 0, 0 }; // 総ページ数を得る 141 XDW_DOCUMENT_INFO info = { sizeof( XDW_DOCUMENT_INFO ), 0, 0, 0 }; // 総ページ数を得る
118 XDW_GetDocumentInformation( h, &info ); 142 XDW_GetDocumentInformation( h, &info );
119 int last_page = info.nPages; 143 int last_page = info.nPages;
120 144
121 int bgn = 1; 145 if ( plist ) {
122 int end = 0; 146 /* リストの取り込み */
123 if ( strchr( argv[0], ':' ) == NULL ) { 147 char *al = (char*)malloc( MAXLINE * sizeof( char ) * MAXCOL );
124 bgn = end = atoi( argv[0] ); 148 int alN = 0;
125 } else { 149 if ( plist ) {
126 if ( strcmp( argv[0], ":" ) == 0 ) { 150 if ( pnow ) print_now( "reading list." );
151 FILE *fp;
152
153 if ( al == NULL ) {
154 fprintf( stderr, "can't allocate memory\n" );
155 exit( 1 );
156 }
157
158 if ( ( fp = fopen( "extpage.list", "r" ) ) == NULL ) {
159 fprintf( stderr, "%s: can't open file [extpage.list]\n", prog );
160 exit ( 1 );
161 }
162 char *p;
163 while ( fgets( buf, sizeof buf, fp ) ) {
164 if ( !strncmp( buf, "#", 1 ) ) continue;
165 if ( !strncmp( buf, "//", 2 ) ) continue;
166 if ( !strcmp( buf, "\n" ) ) continue;
167
168 if ( ( p = strchr( buf, '\n' ) ) != NULL ) {
169 *p = '\0';
170 }
171 strncpy( &al[ alN * MAXCOL ], buf, MAXCOL );
172 alN++;
173 }
174 fclose( fp );
175 }
176
177 bool ext[MAXLINE];
178 for ( int p = 0; p < last_page; p++ ) ext[p] = false;
179 for ( int i = 0; i < alN; i++ ) {
180 int p = atoi( &al[ i * MAXCOL ] );
181 if ( p != 0 ) ext[ p - 1 ] = true;
182 }
183 if ( inv ) for ( int p = 0; p < last_page; p++ ) ext[p] = !ext[p];
184
185 for ( int p = last_page; p > 0; p-- ) {
186 if ( !ext[ p - 1 ] ) {
187 api_result = XDW_DeletePage( h, p, NULL );
188 if ( api_result < 0 ) {
189 print_error( api_result );
190 exit( 1 );
191 }
192 }
193 }
194 }
195 else {
196 int bgn = 1;
197 int end = 0;
198 if ( strchr( argv[0], ':' ) == NULL ) {
199 bgn = end = atoi( argv[0] );
200 } else {
201 if ( strcmp( argv[0], ":" ) == 0 ) {
202 fprintf( stderr, "bad page range.\n" );
203 exit( 1 );
204 }
205 if ( argv[0][0] == ':' ) {
206 end = atoi( strtok( argv[0], ":" ) );
207 } else {
208 bgn = atoi( strtok( argv[0], ":" ) );
209 end = atoi( strtok( NULL, ":" ) );
210 if ( end == 0 ) end = last_page;
211 }
212 }
213
214 //printf( "bgn = %d, end = %d\n", bgn, end );
215 if ( bgn < 1 || end < 1 || bgn > end || bgn > last_page || end > last_page ) {
127 fprintf( stderr, "bad page range.\n" ); 216 fprintf( stderr, "bad page range.\n" );
128 exit( 1 ); 217 exit( 1 );
129 } 218 }
130 if ( argv[0][0] == ':' ) { 219
131 end = atoi( strtok( argv[0], ":" ) ); 220 for ( int i = last_page; i > 0; i-- ) {
132 } else { 221 if ( i < bgn || i > end ) api_result = XDW_DeletePage( h, i, NULL );
133 bgn = atoi( strtok( argv[0], ":" ) ); 222 }
134 end = atoi( strtok( NULL, ":" ) );
135 if ( end == 0 ) end = last_page;
136 }
137 }
138
139 //printf( "bgn = %d, end = %d\n", bgn, end );
140 if ( bgn < 1 || end < 1 || bgn > end || bgn > last_page || end > last_page ) {
141 fprintf( stderr, "bad page range.\n" );
142 exit( 1 );
143 }
144
145 for ( int i = last_page; i > 0; i-- ) {
146 if ( i < bgn || i > end ) api_result = XDW_DeletePage( h, i, NULL );
147 } 223 }
148 224
149 // 文書ハンドルを閉じる 225 // 文書ハンドルを閉じる
150 XDW_SaveDocument( h, NULL ); 226 XDW_SaveDocument( h, NULL );
151 XDW_CloseDocumentHandle( h, NULL ); 227 XDW_CloseDocumentHandle( h, NULL );