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 ); |
