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 |
