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