Mercurial > mercurial > hgweb_xdwtools.cgi
comparison xdwsplit2.cpp @ 4:af8f454d20ed
add xdwsplit2.
| author | pyon@macmini |
|---|---|
| date | Fri, 27 Oct 2017 01:48:00 +0900 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 3:edfa39292d78 | 4:af8f454d20ed |
|---|---|
| 1 /* Makefile | |
| 2 debug: xdwsplit2.c | |
| 3 #rm -rf tempXXXX | |
| 4 #cls | |
| 5 gcc -g -O0 -I. xdwsplit2.c xdwapi.lib | |
| 6 | |
| 7 release: xdwsplit2.c | |
| 8 gcc -I. xdwsplit2.c xdwapi.lib -static -o xdwsplit2.exe | |
| 9 strip xdwsplit2.exe | |
| 10 | |
| 11 clean: | |
| 12 rm -rf tempXXXX | |
| 13 */ | |
| 14 | |
| 15 #include <stdio.h> | |
| 16 #include <string.h> | |
| 17 #include <stdlib.h> | |
| 18 #include <time.h> | |
| 19 #include <glob.h> | |
| 20 #include <io.h> | |
| 21 #include <windows.h> | |
| 22 #include <xdw_api.h> | |
| 23 | |
| 24 | |
| 25 void print_error( int code ) { | |
| 26 fprintf( stderr, "Error code : %d\n", code ); | |
| 27 switch ( code ) { | |
| 28 case XDW_E_NOT_INSTALLED: | |
| 29 fprintf( stderr, "DocuWorksがインストールされていません。" ); | |
| 30 break; | |
| 31 case XDW_E_FILE_NOT_FOUND: | |
| 32 fprintf( stderr, "指定されたファイルが見つかりません。" ); | |
| 33 break; | |
| 34 case XDW_E_FILE_EXISTS: | |
| 35 fprintf( stderr, "指定されたファイルはすでに存在します。" ); | |
| 36 break; | |
| 37 case XDW_E_ACCESSDENIED: | |
| 38 case XDW_E_INVALID_NAME: | |
| 39 case XDW_E_BAD_NETPATH: | |
| 40 fprintf( stderr, "指定されたファイルを開くことができません。" ); | |
| 41 break; | |
| 42 case XDW_E_BAD_FORMAT: | |
| 43 fprintf( stderr, "指定されたファイルは正しいフォーマットではありません。" ); | |
| 44 break; | |
| 45 case XDW_E_INVALID_ACCESS: | |
| 46 fprintf( stderr, "指定された操作をする権利がありません。" ); | |
| 47 break; | |
| 48 default: | |
| 49 fprintf( stderr, "エラーが発生しました。" ); | |
| 50 break; | |
| 51 } | |
| 52 } | |
| 53 | |
| 54 void print_now( char *msg ) { | |
| 55 time_t now = time( NULL ); | |
| 56 struct tm *ts = localtime( &now ); | |
| 57 | |
| 58 char buf[80]; | |
| 59 strftime( buf, sizeof( buf ), "%H:%M:%S %Z", ts ); | |
| 60 printf( "%s\t%s\n", buf, msg ); | |
| 61 } | |
| 62 | |
| 63 int main( int argc, char* argv[] ) { | |
| 64 | |
| 65 /* オプションの解析 */ | |
| 66 char prog[128]; | |
| 67 strcpy( prog, argv[0] ); | |
| 68 | |
| 69 int pnow = 0; | |
| 70 int text = 0; | |
| 71 int pstart = 0; | |
| 72 char c; | |
| 73 while ( --argc > 0 && ( *++argv )[0] == '-' ) { | |
| 74 while ( c = *++argv[0] ) { | |
| 75 switch ( c ) { | |
| 76 case 'v': | |
| 77 pnow = 1; | |
| 78 print_now( "start." ); | |
| 79 break; | |
| 80 case 's': | |
| 81 pstart = 1; | |
| 82 break; | |
| 83 case 't': | |
| 84 text = 1; | |
| 85 break; | |
| 86 default: | |
| 87 fprintf( stderr, "error: illegal option '%c'.\n", c ); | |
| 88 exit( 1 ); | |
| 89 } | |
| 90 } | |
| 91 } | |
| 92 | |
| 93 int sp; | |
| 94 char in_path[ _MAX_PATH ]; | |
| 95 if ( argc == 1 ) { | |
| 96 sp = 1; | |
| 97 pstart = 1; | |
| 98 _fullpath( in_path, argv[0], _MAX_PATH ); | |
| 99 } else if ( argc == 2 ) { | |
| 100 if ( pstart == 1 ) { | |
| 101 sp = 1; | |
| 102 pstart = atoi( argv[0] ); | |
| 103 _fullpath( in_path, argv[1], _MAX_PATH ); | |
| 104 } else { | |
| 105 sp = atoi( argv[0] ); | |
| 106 _fullpath( in_path, argv[1], _MAX_PATH ); | |
| 107 } | |
| 108 } else { | |
| 109 fprintf( stderr, "%s infile\n", prog ); | |
| 110 fprintf( stderr, "%s P infile\n", prog ); | |
| 111 fprintf( stderr, "%s -t infile\n", prog ); | |
| 112 fprintf( stderr, "%s -s S infile\n", prog ); | |
| 113 fprintf( stderr, "%s -v P infile\n", prog ); | |
| 114 exit( 1 ); | |
| 115 } | |
| 116 | |
| 117 /* 本処理 */ | |
| 118 if ( pnow ) print_now( "splitting xdw-file." ); | |
| 119 | |
| 120 int api_result = 0; | |
| 121 | |
| 122 XDW_DOCUMENT_HANDLE h = NULL; // 文書ハンドルを開く | |
| 123 XDW_OPEN_MODE_EX mode = { | |
| 124 sizeof( XDW_OPEN_MODE_EX ), XDW_OPEN_READONLY, XDW_AUTH_NODIALOGUE | |
| 125 }; | |
| 126 api_result = XDW_OpenDocumentHandle( in_path, &h, (XDW_OPEN_MODE*)&mode ); | |
| 127 if ( api_result < 0 ) { | |
| 128 print_error( api_result ); | |
| 129 return 0; | |
| 130 } | |
| 131 | |
| 132 XDW_DOCUMENT_INFO info = { sizeof( XDW_DOCUMENT_INFO ), 0, 0, 0 }; // 総ページ数を得る | |
| 133 XDW_GetDocumentInformation( h, &info ); | |
| 134 int last_page = info.nPages; | |
| 135 if ( last_page <= sp ) { | |
| 136 fprintf( stderr, "bad num. ( %d <= %d )\n", last_page, sp ); | |
| 137 exit( 1 ); | |
| 138 } | |
| 139 | |
| 140 if ( pnow ) print_now( "extracting pages." ); | |
| 141 | |
| 142 if ( sp != 1 ) mkdir( "tempXXXX" ); | |
| 143 | |
| 144 char buf[ _MAX_PATH ]; | |
| 145 long datasize; | |
| 146 char* lpszvalue; | |
| 147 | |
| 148 for ( int p = 0; p < last_page; p++ ) { | |
| 149 if ( sp == 1 ) | |
| 150 sprintf( buf, "%05d.xdw", pstart++ ); | |
| 151 else | |
| 152 sprintf( buf, "tempXXXX/%05d.xdw", p + 1 ); | |
| 153 | |
| 154 _fullpath( in_path, buf, _MAX_PATH ); | |
| 155 api_result = XDW_GetPage( h, p + 1, in_path, NULL ); | |
| 156 if ( api_result < 0 ) { | |
| 157 print_error( api_result ); | |
| 158 exit( 1 ); | |
| 159 } | |
| 160 if ( text == 1 ) { | |
| 161 datasize = XDW_GetPageTextToMemory( h, p, NULL, 0, NULL ); | |
| 162 lpszvalue = (char*)malloc( sizeof(char) * datasize ); | |
| 163 XDW_GetPageTextToMemory( h, p, lpszvalue, datasize, NULL ); | |
| 164 //printf( "%s\n", lpszvalue ); | |
| 165 free( lpszvalue ); | |
| 166 } | |
| 167 } | |
| 168 XDW_CloseDocumentHandle( h, NULL ); // 文書ハンドルを閉じる | |
| 169 | |
| 170 /* 1ページ毎ならマージする必要なし */ | |
| 171 if ( sp == 1 ) { | |
| 172 if ( pnow ) print_now( "done." ); | |
| 173 return 0; | |
| 174 } | |
| 175 | |
| 176 /* マージ */ | |
| 177 if ( pnow ) print_now( "merging pages." ); | |
| 178 | |
| 179 char *blk_path = (char*)malloc( sp * sizeof( char ) * _MAX_PATH ); | |
| 180 const char **blk_path_addr = (const char**)malloc( ( last_page / sp + 1 ) * sizeof( char* ) * _MAX_PATH ); | |
| 181 | |
| 182 int bn = 0; | |
| 183 // ブロック毎の処理 | |
| 184 for ( int p = 0, m = 0; p < last_page; p++ ) { | |
| 185 m = p % sp; | |
| 186 if ( m == 0 && p > 0 ) { | |
| 187 sprintf( buf, "%05d.xdw", ++bn ); | |
| 188 _fullpath( in_path, buf, _MAX_PATH ); | |
| 189 api_result = XDW_MergeXdwFiles( blk_path_addr, sp, in_path, NULL ); | |
| 190 if ( api_result < 0 ) { | |
| 191 print_error( api_result ); | |
| 192 exit( 1 ); | |
| 193 } | |
| 194 } | |
| 195 sprintf( buf, "tempXXXX/%05d.xdw", p + 1 ); | |
| 196 _fullpath( in_path, buf, _MAX_PATH ); | |
| 197 strncpy( &blk_path[ m * _MAX_PATH ], in_path, _MAX_PATH ); | |
| 198 blk_path_addr[m] = &blk_path[ m * _MAX_PATH ]; | |
| 199 } | |
| 200 if ( last_page % sp != 0 ) { | |
| 201 sprintf( buf, "%05d.xdw", ++bn ); | |
| 202 _fullpath( in_path, buf, _MAX_PATH ); | |
| 203 api_result = XDW_MergeXdwFiles( blk_path_addr, last_page % sp, in_path, NULL ); | |
| 204 if ( api_result < 0 ) { | |
| 205 print_error( api_result ); | |
| 206 exit( 1 ); | |
| 207 } | |
| 208 } | |
| 209 | |
| 210 free( blk_path ); | |
| 211 free( blk_path_addr ); | |
| 212 | |
| 213 /* 後処理 */ | |
| 214 if ( pnow ) print_now( "cleaning." ); | |
| 215 glob_t globbuf; | |
| 216 glob( "tempXXXX/*.*", 0, NULL, &globbuf ); | |
| 217 for ( int i = 0; i < globbuf.gl_pathc; i++ ) { | |
| 218 _fullpath( in_path, globbuf.gl_pathv[i], _MAX_PATH ); | |
| 219 remove( in_path ); | |
| 220 } | |
| 221 globfree( &globbuf ); | |
| 222 rmdir( "tempXXXX" ); | |
| 223 | |
| 224 if ( pnow ) print_now( "done." ); | |
| 225 return 0; | |
| 226 } | |
| 227 |
