4
|
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
|