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 |