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