Mercurial > mercurial > hgweb_xdwtools.cgi
comparison xdwaddatn2.cpp @ 10:e421bcd3bce4
xdwaddatn2 done.
author | pyon@macmini |
---|---|
date | Fri, 06 Apr 2018 18:30:09 +0900 |
parents | cc5262d43399 |
children |
comparison
equal
deleted
inserted
replaced
9:cc5262d43399 | 10:e421bcd3bce4 |
---|---|
13 | 13 |
14 clean: | 14 clean: |
15 rm -rf tempXXXX | 15 rm -rf tempXXXX |
16 */ | 16 */ |
17 | 17 |
18 #include <unistd.h> | |
18 #include <stdbool.h> | 19 #include <stdbool.h> |
19 #include <stdio.h> | 20 #include <stdio.h> |
20 #include <string.h> | 21 #include <string.h> |
21 #include <stdlib.h> | 22 #include <stdlib.h> |
22 #include <time.h> | 23 #include <time.h> |
64 } | 65 } |
65 | 66 |
66 void print_help() { | 67 void print_help() { |
67 char prog[12] = "xdwaddatn2"; | 68 char prog[12] = "xdwaddatn2"; |
68 fprintf( stderr, "Usage:\n" ); | 69 fprintf( stderr, "Usage:\n" ); |
69 fprintf( stderr, " %s -m mtxt x y txt sz tr infile\n", prog ); | 70 fprintf( stderr, " normal mode ( one-liner )\n" ); |
70 fprintf( stderr, " %s -p page x y txt sz tr infile\n", prog ); | 71 fprintf( stderr, " %s -m mtxt x y txt sz tr infile\n", prog ); |
71 fprintf( stderr, " %s -m -i infile\n", prog ); | 72 fprintf( stderr, " %s -p page x y txt sz tr infile\n", prog ); |
72 fprintf( stderr, " %s -p -i infile\n", prog ); | 73 fprintf( stderr, " %s -a x y txt sz tr infile\n", prog ); |
73 fprintf( stderr, " %s -v -p -i infile\n", prog ); | 74 fprintf( stderr, " batch mode ( with addatn.list )\n" ); |
74 fprintf( stderr, " %s -v -m -i infile\n", prog ); | 75 fprintf( stderr, " %s -M infile\n", prog ); |
76 fprintf( stderr, " %s -P infile\n", prog ); | |
77 fprintf( stderr, " %s -v -P infile\n", prog ); | |
78 fprintf( stderr, " %s -v -M infile\n", prog ); | |
75 } | 79 } |
76 | 80 |
77 void print_now( const char *msg ) { | 81 void print_now( const char *msg ) { |
78 time_t now = time( NULL ); | 82 time_t now = time( NULL ); |
79 struct tm *ts = localtime( &now ); | 83 struct tm *ts = localtime( &now ); |
109 strcpy( prog, argv[0] ); | 113 strcpy( prog, argv[0] ); |
110 | 114 |
111 bool pnow = false; | 115 bool pnow = false; |
112 bool mmode = false; | 116 bool mmode = false; |
113 bool pmode = false; | 117 bool pmode = false; |
114 bool csv = false; | 118 bool amode = false; |
115 char c; | 119 bool batch = false; |
116 while ( --argc > 0 && ( *++argv )[0] == '-' ) { | 120 |
117 while ( c = *++argv[0] ) { | 121 /* アノテーション変数 */ |
118 switch ( c ) { | 122 int pp, x, y, sz, tr; |
119 case 'v': | 123 char mtxt[80]; |
120 pnow = true; | 124 char str[120]; |
121 print_now( "start." ); | 125 |
122 break; | 126 int opt; |
123 case 'm': /* matched page: now writing... */ | 127 while ( ( opt = getopt( argc, argv, "vm:p:aMP" ) ) != -1 ) { |
124 mmode = true; | 128 switch ( opt ) { |
125 break; | 129 case 'v': |
126 case 'p': /* page number: now writing... */ | 130 pnow = true; |
127 pmode = true; | 131 print_now( "start." ); |
128 break; | 132 break; |
129 case 'i': /* csv file: now writing... */ | 133 case 'm': /* matched page */ |
130 csv = true; | 134 mmode = true; |
131 break; | 135 strcpy( mtxt, optarg ); |
132 default: | 136 break; |
133 fprintf( stderr, "error: illegal option '%c'.\n", c ); | 137 case 'p': /* page number */ |
134 print_help(); | 138 pmode = true; |
135 exit( 1 ); | 139 pp = atoi( optarg ); |
136 } | 140 break; |
137 } | 141 case 'a': /* all page */ |
138 } | 142 amode = true; |
139 | 143 break; |
140 if ( argc < 1 || ( mmode && pmode ) || ( !mmode && !pmode )) { | 144 case 'M': |
145 mmode = true; | |
146 batch = true; | |
147 break; | |
148 case 'P': | |
149 pmode = true; | |
150 batch = true; | |
151 break; | |
152 default: | |
153 fprintf( stderr, "error: illegal option '%c'.\n", opt ); | |
154 print_help(); | |
155 exit( 1 ); | |
156 } | |
157 } | |
158 | |
159 if ( argc < 1 || ( mmode && pmode ) || ( !mmode && !pmode && !amode ) ) { | |
141 print_help(); | 160 print_help(); |
142 exit( 1 ); | 161 exit( 1 ); |
143 } | 162 } |
144 | 163 if ( ( mmode || pmode ) && argc != 9 && argc != 10 ) { |
145 /* リストの取り込み */ | 164 print_help(); |
146 char *al = (char*)malloc( MAXLINE * sizeof( char ) * MAXCOL ); | 165 exit( 1 ); |
147 char buf[ MAXCOL ]; | 166 } |
148 int alN = 0; | 167 |
149 if ( csv ) { | |
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( "addatn.list", "r" ) ) == NULL ) { | |
159 fprintf( stderr, "%s: can't open file [addatn.list]\n", argv[0] ); | |
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 | 168 |
177 /* 本処理:アノテーションを貼付け */ | 169 /* 本処理:アノテーションを貼付け */ |
178 if ( pnow ) print_now( "analizing xdw-file." ); | 170 if ( pnow ) print_now( "analizing xdw-file." ); |
179 | 171 |
180 char in_path[ _MAX_PATH ]; | 172 char in_path[ _MAX_PATH ], buf[ MAXCOL ]; |
181 sprintf( buf, "copy %s %s", argv[0], "tmpXXXX.xdw" ); | 173 sprintf( buf, "copy %s %s", argv[ argc - 1 ], "tmpXXXX.xdw" ); |
182 system( buf ); | 174 system( buf ); |
183 _fullpath( in_path, "tmpXXXX.xdw", _MAX_PATH ); | 175 _fullpath( in_path, "tmpXXXX.xdw", _MAX_PATH ); |
184 | 176 |
185 int api_result = 0; | 177 int api_result = 0; |
186 | 178 |
191 api_result = XDW_OpenDocumentHandle( in_path, &h, (XDW_OPEN_MODE*)&mode ); | 183 api_result = XDW_OpenDocumentHandle( in_path, &h, (XDW_OPEN_MODE*)&mode ); |
192 if ( api_result < 0 ) { | 184 if ( api_result < 0 ) { |
193 print_error( api_result ); | 185 print_error( api_result ); |
194 return 0; | 186 return 0; |
195 } | 187 } |
196 | 188 XDW_DOCUMENT_INFO info = { sizeof( XDW_DOCUMENT_INFO ), 0, 0, 0 }; // 総ページ数を得る |
197 if ( !csv ) { | 189 XDW_GetDocumentInformation( h, &info ); |
190 int last_page = info.nPages; | |
191 XDW_FOUND_HANDLE pFoundHandle = NULL; | |
192 | |
193 /* ワンライナーモード */ | |
194 if ( !batch ) { | |
195 if ( pnow ) print_now( "normal mode. ( one-liner )" ); | |
196 x = atoi( argv[ argc - 6 ] ); | |
197 y = atoi( argv[ argc - 5 ] ); | |
198 strcpy( str, argv[ argc - 4 ] ); | |
199 sz = atoi( argv[ argc - 3 ] ); | |
200 tr = atoi( argv[ argc - 2 ] ); | |
201 | |
198 if ( mmode ) { | 202 if ( mmode ) { |
199 for ( int i = 0; i < alN; i++ ) { | 203 for ( int p = 0; p < last_page; p++ ) { |
200 } | 204 api_result = XDW_FindTextInPage( h, p + 1, mtxt, NULL, &pFoundHandle, NULL ); |
201 } | 205 if ( pFoundHandle ) { |
202 else { // pmode のはず | 206 api_result = add_annotation( h, p + 1, x, y, str, &sz, tr ); |
203 } | 207 if ( api_result < 0 ) { |
204 } | 208 print_error( api_result ); |
209 break; | |
210 } | |
211 } | |
212 } | |
213 XDW_CloseFoundHandle( pFoundHandle ); | |
214 } | |
215 else if ( pmode ){ | |
216 api_result = add_annotation( h, pp, x, y, str, &sz, tr ); | |
217 if ( api_result < 0 ) { | |
218 print_error( api_result ); | |
219 return 0; | |
220 } | |
221 } | |
222 else { // amode のはず | |
223 for ( int p = 0; p < last_page; p++ ) { | |
224 api_result = add_annotation( h, p + 1, x, y, str, &sz, tr ); | |
225 if ( api_result < 0 ) { | |
226 print_error( api_result ); | |
227 break; | |
228 } | |
229 } | |
230 } | |
231 } | |
232 /* 以下 batch mode */ | |
205 else { | 233 else { |
206 if ( pnow ) print_now( "csv mode." ); | 234 if ( pnow ) print_now( "batch mode." ); |
207 XDW_DOCUMENT_INFO info = { sizeof( XDW_DOCUMENT_INFO ), 0, 0, 0 }; // 総ページ数を得る | 235 /* リストの取り込み */ |
208 XDW_GetDocumentInformation( h, &info ); | 236 char *al = (char*)malloc( MAXLINE * sizeof( char ) * MAXCOL ); |
209 int last_page = info.nPages; | 237 int alN = 0; |
210 | 238 if ( pnow ) print_now( "reading list." ); |
211 int x, y, sz, tr; | 239 FILE *fp; |
212 char *str, *m, *s; | 240 |
241 if ( al == NULL ) { | |
242 fprintf( stderr, "can't allocate memory\n" ); | |
243 exit( 1 ); | |
244 } | |
245 | |
246 if ( ( fp = fopen( "addatn.list", "r" ) ) == NULL ) { | |
247 fprintf( stderr, "%s: can't open file [addatn.list]\n", argv[0] ); | |
248 exit ( 1 ); | |
249 } | |
250 char *z; | |
251 while ( fgets( buf, sizeof buf, fp ) ) { | |
252 if ( !strncmp( buf, "#", 1 ) ) continue; | |
253 if ( !strncmp( buf, "//", 2 ) ) continue; | |
254 if ( !strcmp( buf, "\n" ) ) continue; | |
255 | |
256 if ( ( z = strchr( buf, '\n' ) ) != NULL ) { | |
257 *z = '\0'; | |
258 } | |
259 strncpy( &al[ alN * MAXCOL ], buf, MAXCOL ); | |
260 alN++; | |
261 } | |
262 fclose( fp ); | |
263 | |
264 /* バッチ処理 */ | |
265 char *s; | |
213 if ( mmode ) { | 266 if ( mmode ) { |
214 XDW_FOUND_HANDLE pFoundHandle = NULL; | 267 if ( pnow ) print_now( "> text match mode." ); |
268 char *m; | |
215 for ( int p = 0; p < last_page; p++ ) { | 269 for ( int p = 0; p < last_page; p++ ) { |
216 for ( int i = 0; i < alN; i++ ) { | 270 for ( int i = 0; i < alN; i++ ) { |
217 strncpy( buf, &al[ i * MAXCOL ], MAXCOL ); | 271 strncpy( buf, &al[ i * MAXCOL ], MAXCOL ); |
218 m = strtok( buf, "," ); | 272 m = strtok( buf, "," ); |
219 api_result = XDW_FindTextInPage( h, p + 1, m, NULL, &pFoundHandle, NULL ); | 273 api_result = XDW_FindTextInPage( h, p + 1, m, NULL, &pFoundHandle, NULL ); |
220 if ( pFoundHandle ) { | 274 if ( pFoundHandle ) { |
221 x = atoi( strtok( NULL, "," ) ); | 275 x = atoi( strtok( NULL, "," ) ); |
222 y = atoi( strtok( NULL, "," ) ); | 276 y = atoi( strtok( NULL, "," ) ); |
223 s = strtok( NULL, "," ); | 277 s = strtok( NULL, "," ); |
224 sz = atoi( strtok( NULL, "," ) ); | 278 sz = atoi( strtok( NULL, "," ) ); |
225 tr = atoi( strtok( NULL, "," ) ); | 279 tr = atoi( strtok( NULL, "," ) ); |
226 api_result = add_annotation( h, p + 1, x, y, s, &sz, tr ); | 280 api_result = add_annotation( h, p + 1, x, y, s, &sz, tr ); |
227 if ( api_result < 0 ) { | 281 if ( api_result < 0 ) { |
228 print_error( api_result ); | 282 print_error( api_result ); |
229 break; | 283 break; |
230 } | 284 } |
232 } | 286 } |
233 } | 287 } |
234 XDW_CloseFoundHandle( pFoundHandle ); | 288 XDW_CloseFoundHandle( pFoundHandle ); |
235 } | 289 } |
236 else { // pmode のはず | 290 else { // pmode のはず |
291 if ( pnow ) print_now( "> page number mode." ); | |
237 int p; | 292 int p; |
238 for ( int i = 0; i < alN; i++ ) { | 293 for ( int i = 0; i < alN; i++ ) { |
239 strncpy( buf, &al[ i * MAXCOL ], MAXCOL ); | 294 strncpy( buf, &al[ i * MAXCOL ], MAXCOL ); |
240 m = strtok( buf, "," ); | 295 p = atoi( strtok( buf, "," ) ); |
241 p = atoi( m ); | |
242 if ( p > 0 && p <= last_page ) { | 296 if ( p > 0 && p <= last_page ) { |
243 x = atoi( strtok( NULL, "," ) ); | 297 x = atoi( strtok( NULL, "," ) ); |
244 y = atoi( strtok( NULL, "," ) ); | 298 y = atoi( strtok( NULL, "," ) ); |
245 s = strtok( NULL, "," ); | 299 s = strtok( NULL, "," ); |
246 sz = atoi( strtok( NULL, "," ) ); | 300 sz = atoi( strtok( NULL, "," ) ); |
247 tr = atoi( strtok( NULL, "," ) ); | 301 tr = atoi( strtok( NULL, "," ) ); |
248 api_result = add_annotation( h, p, x, y, s, &sz, tr ); | 302 api_result = add_annotation( h, p, x, y, s, &sz, tr ); |
249 if ( api_result < 0 ) { | 303 if ( api_result < 0 ) { |
250 print_error( api_result ); | 304 print_error( api_result ); |
251 break; | 305 break; |
252 } | 306 } |
253 } | 307 } |
254 } | 308 } |
255 } | 309 } |
310 free( al ); | |
256 } | 311 } |
257 | 312 |
258 api_result = XDW_SaveDocument( h, NULL ); // 変更をファイルに反映する | 313 api_result = XDW_SaveDocument( h, NULL ); // 変更をファイルに反映する |
259 XDW_CloseDocumentHandle( h, NULL ); // 文書ハンドルを閉じる | 314 XDW_CloseDocumentHandle( h, NULL ); // 文書ハンドルを閉じる |
260 | 315 |
270 } | 325 } |
271 | 326 |
272 /* 後処理 */ | 327 /* 後処理 */ |
273 if ( pnow ) print_now( "cleaning." ); | 328 if ( pnow ) print_now( "cleaning." ); |
274 remove( in_path ); | 329 remove( in_path ); |
275 free( al ); | |
276 | 330 |
277 if ( pnow ) print_now( "done." ); | 331 if ( pnow ) print_now( "done." ); |
278 return 0; | 332 return 0; |
279 } | 333 } |
280 | 334 |