Mercurial > mercurial > hgweb_xdwtools.cgi
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 ); |