00001
00020 #include "mfcpch.h"
00021 #include "hosthplb.h"
00022
00023 #include "rejctmap.h"
00024 #include "secname.h"
00025
00026 #define EXTERN
00027
00030 EXTERN BOOL_VAR (rejword_only_set_if_accepted, TRUE, "Mimic old reject_word");
00031 EXTERN BOOL_VAR (rejmap_allow_more_good_qual, FALSE,
00032 "Use initial good qual setting");
00033 EXTERN BOOL_VAR (rej_use_1Il_rej, TRUE, "1Il rejection enabled");
00039 BOOL8 REJ::perm_rejected() {
00040 return (flag (R_TESS_FAILURE) ||
00041 flag (R_SMALL_XHT) ||
00042 flag (R_EDGE_CHAR) ||
00043 flag (R_1IL_CONFLICT) ||
00044 flag (R_POSTNN_1IL) ||
00045 flag (R_REJ_CBLOB) ||
00046 flag (R_BAD_REPETITION) || flag (R_MM_REJECT));
00047 }
00048
00049
00052 BOOL8 REJ::rej_before_nn_accept() {
00053 return flag (R_POOR_MATCH) ||
00054 flag (R_NOT_TESS_ACCEPTED) ||
00055 flag (R_CONTAINS_BLANKS) || flag (R_BAD_PERMUTER);
00056 }
00057
00058
00061 BOOL8 REJ::rej_between_nn_and_mm() {
00062 return flag (R_HYPHEN) ||
00063 flag (R_DUBIOUS) ||
00064 flag (R_NO_ALPHANUMS) || flag (R_MOSTLY_REJ) || flag (R_XHT_FIXUP);
00065 }
00066
00067
00070 BOOL8 REJ::rej_between_mm_and_quality_accept() {
00071 return flag (R_BAD_QUALITY);
00072 }
00073
00074
00077 BOOL8 REJ::rej_between_quality_and_minimal_rej_accept() {
00078 return flag (R_DOC_REJ) ||
00079 flag (R_BLOCK_REJ) || flag (R_ROW_REJ) || flag (R_UNLV_REJ);
00080 }
00081
00082
00085 BOOL8 REJ::rej_before_mm_accept() {
00086 return rej_between_nn_and_mm () ||
00087 (rej_before_nn_accept () &&
00088 !flag (R_NN_ACCEPT) && !flag (R_HYPHEN_ACCEPT));
00089 }
00090
00091
00094 BOOL8 REJ::rej_before_quality_accept() {
00095 return rej_between_mm_and_quality_accept () ||
00096 (!flag (R_MM_ACCEPT) && rej_before_mm_accept ());
00097 }
00098
00099
00103 BOOL8 REJ::rejected() {
00104 if (flag (R_MINIMAL_REJ_ACCEPT))
00105 return FALSE;
00106 else
00107 return (perm_rejected () ||
00108 rej_between_quality_and_minimal_rej_accept () ||
00109 (!flag (R_QUALITY_ACCEPT) && rej_before_quality_accept ()));
00110 }
00111
00112
00116 BOOL8 REJ::accept_if_good_quality() {
00117 return (rejected () &&
00118 !perm_rejected () &&
00119 flag (R_BAD_PERMUTER) &&
00120 !flag (R_POOR_MATCH) &&
00121 !flag (R_NOT_TESS_ACCEPTED) &&
00122 !flag (R_CONTAINS_BLANKS) &&
00123 (rejmap_allow_more_good_qual ||
00124 (!rej_between_nn_and_mm () &&
00125 !rej_between_mm_and_quality_accept () &&
00126 !rej_between_quality_and_minimal_rej_accept ())));
00127 }
00128
00129
00133 void REJ::setrej_tess_failure() {
00134 set_flag(R_TESS_FAILURE);
00135 }
00136
00137
00141 void REJ::setrej_small_xht() {
00142 set_flag(R_SMALL_XHT);
00143 }
00144
00145
00149 void REJ::setrej_edge_char() {
00150 set_flag(R_EDGE_CHAR);
00151 }
00152
00153
00157 void REJ::setrej_1Il_conflict() {
00158 if (rej_use_1Il_rej)
00159 set_flag(R_1IL_CONFLICT);
00160 }
00161
00162
00166 void REJ::setrej_postNN_1Il() {
00167 set_flag(R_POSTNN_1IL);
00168 }
00169
00170
00174 void REJ::setrej_rej_cblob() {
00175 set_flag(R_REJ_CBLOB);
00176 }
00177
00178
00182 void REJ::setrej_mm_reject() {
00183 set_flag(R_MM_REJECT);
00184 }
00185
00186
00190 void REJ::setrej_bad_repetition() {
00191 set_flag(R_BAD_REPETITION);
00192 }
00193
00194
00198 void REJ::setrej_poor_match() {
00199 set_flag(R_POOR_MATCH);
00200 }
00201
00202
00206 void REJ::setrej_not_tess_accepted() {
00207 set_flag(R_NOT_TESS_ACCEPTED);
00208 }
00209
00210
00214 void REJ::setrej_contains_blanks() {
00215 set_flag(R_CONTAINS_BLANKS);
00216 }
00217
00218
00222 void REJ::setrej_bad_permuter() {
00223 set_flag(R_BAD_PERMUTER);
00224 }
00225
00226
00230 void REJ::setrej_hyphen() {
00231 set_flag(R_HYPHEN);
00232 }
00233
00234
00238 void REJ::setrej_dubious() {
00239 set_flag(R_DUBIOUS);
00240 }
00241
00242
00246 void REJ::setrej_no_alphanums() {
00247 set_flag(R_NO_ALPHANUMS);
00248 }
00249
00250
00254 void REJ::setrej_mostly_rej() {
00255 set_flag(R_MOSTLY_REJ);
00256 }
00257
00258
00262 void REJ::setrej_xht_fixup() {
00263 set_flag(R_XHT_FIXUP);
00264 }
00265
00266
00270 void REJ::setrej_bad_quality() {
00271 set_flag(R_BAD_QUALITY);
00272 }
00273
00274
00278 void REJ::setrej_doc_rej() {
00279 set_flag(R_DOC_REJ);
00280 }
00281
00282
00286 void REJ::setrej_block_rej() {
00287 set_flag(R_BLOCK_REJ);
00288 }
00289
00290
00294 void REJ::setrej_row_rej() {
00295 set_flag(R_ROW_REJ);
00296 }
00297
00298
00302 void REJ::setrej_unlv_rej() {
00303 set_flag(R_UNLV_REJ);
00304 }
00305
00306
00310 void REJ::setrej_hyphen_accept() {
00311 set_flag(R_HYPHEN_ACCEPT);
00312 }
00313
00314
00318 void REJ::setrej_nn_accept() {
00319 set_flag(R_NN_ACCEPT);
00320 }
00321
00322
00326 void REJ::setrej_mm_accept() {
00327 set_flag(R_MM_ACCEPT);
00328 }
00329
00330
00334 void REJ::setrej_quality_accept() {
00335 set_flag(R_QUALITY_ACCEPT);
00336 }
00337
00338
00342 void REJ::setrej_minimal_rej_accept() {
00343 set_flag(R_MINIMAL_REJ_ACCEPT);
00344 }
00345
00346
00350 void REJ::full_print(FILE *fp) {
00351 #ifndef SECURE_NAMES
00352
00353 fprintf (fp, "R_TESS_FAILURE: %s\n", flag (R_TESS_FAILURE) ? "T" : "F");
00354 fprintf (fp, "R_SMALL_XHT: %s\n", flag (R_SMALL_XHT) ? "T" : "F");
00355 fprintf (fp, "R_EDGE_CHAR: %s\n", flag (R_EDGE_CHAR) ? "T" : "F");
00356 fprintf (fp, "R_1IL_CONFLICT: %s\n", flag (R_1IL_CONFLICT) ? "T" : "F");
00357 fprintf (fp, "R_POSTNN_1IL: %s\n", flag (R_POSTNN_1IL) ? "T" : "F");
00358 fprintf (fp, "R_REJ_CBLOB: %s\n", flag (R_REJ_CBLOB) ? "T" : "F");
00359 fprintf (fp, "R_MM_REJECT: %s\n", flag (R_MM_REJECT) ? "T" : "F");
00360 fprintf (fp, "R_BAD_REPETITION: %s\n", flag (R_BAD_REPETITION) ? "T" : "F");
00361 fprintf (fp, "R_POOR_MATCH: %s\n", flag (R_POOR_MATCH) ? "T" : "F");
00362 fprintf (fp, "R_NOT_TESS_ACCEPTED: %s\n",
00363 flag (R_NOT_TESS_ACCEPTED) ? "T" : "F");
00364 fprintf (fp, "R_CONTAINS_BLANKS: %s\n",
00365 flag (R_CONTAINS_BLANKS) ? "T" : "F");
00366 fprintf (fp, "R_BAD_PERMUTER: %s\n", flag (R_BAD_PERMUTER) ? "T" : "F");
00367 fprintf (fp, "R_HYPHEN: %s\n", flag (R_HYPHEN) ? "T" : "F");
00368 fprintf (fp, "R_DUBIOUS: %s\n", flag (R_DUBIOUS) ? "T" : "F");
00369 fprintf (fp, "R_NO_ALPHANUMS: %s\n", flag (R_NO_ALPHANUMS) ? "T" : "F");
00370 fprintf (fp, "R_MOSTLY_REJ: %s\n", flag (R_MOSTLY_REJ) ? "T" : "F");
00371 fprintf (fp, "R_XHT_FIXUP: %s\n", flag (R_XHT_FIXUP) ? "T" : "F");
00372 fprintf (fp, "R_BAD_QUALITY: %s\n", flag (R_BAD_QUALITY) ? "T" : "F");
00373 fprintf (fp, "R_DOC_REJ: %s\n", flag (R_DOC_REJ) ? "T" : "F");
00374 fprintf (fp, "R_BLOCK_REJ: %s\n", flag (R_BLOCK_REJ) ? "T" : "F");
00375 fprintf (fp, "R_ROW_REJ: %s\n", flag (R_ROW_REJ) ? "T" : "F");
00376 fprintf (fp, "R_UNLV_REJ: %s\n", flag (R_UNLV_REJ) ? "T" : "F");
00377 fprintf (fp, "R_HYPHEN_ACCEPT: %s\n", flag (R_HYPHEN_ACCEPT) ? "T" : "F");
00378 fprintf (fp, "R_NN_ACCEPT: %s\n", flag (R_NN_ACCEPT) ? "T" : "F");
00379 fprintf (fp, "R_MM_ACCEPT: %s\n", flag (R_MM_ACCEPT) ? "T" : "F");
00380 fprintf (fp, "R_QUALITY_ACCEPT: %s\n", flag (R_QUALITY_ACCEPT) ? "T" : "F");
00381 fprintf (fp, "R_MINIMAL_REJ_ACCEPT: %s\n",
00382 flag (R_MINIMAL_REJ_ACCEPT) ? "T" : "F");
00383 #endif
00384 }
00385
00386
00397 REJMAP::REJMAP(
00398 const REJMAP &source) {
00399 REJ *to;
00400 REJ *from = source.ptr;
00401 int i;
00402
00403 len = source.length ();
00404
00405 if (len > 0) {
00406 ptr = (REJ *) alloc_struct (len * sizeof (REJ), "REJ");
00407 to = ptr;
00408 for (i = 0; i < len; i++) {
00409 *to = *from;
00410 to++;
00411 from++;
00412 }
00413 }
00414 else
00415 ptr = NULL;
00416 }
00417
00418
00422 REJMAP & REJMAP::operator= (
00423 const REJMAP & source
00424 ) {
00425 REJ *
00426 to;
00427 REJ *
00428 from = source.ptr;
00429 int
00430 i;
00431
00432 initialise (source.len);
00433 to = ptr;
00434 for (i = 0; i < len; i++) {
00435 *to = *from;
00436 to++;
00437 from++;
00438 }
00439 return *this;
00440 }
00441
00442
00446 void REJMAP::initialise(
00447 INT16 length) {
00448 if (ptr != NULL)
00449 free_struct (ptr, len * sizeof (REJ), "REJ");
00450 len = length;
00451 if (len > 0)
00452 ptr = (REJ *) memset (alloc_struct (len * sizeof (REJ), "REJ"),
00453 0, len * sizeof (REJ));
00454 else
00455 ptr = NULL;
00456 }
00457
00458
00462 INT16 REJMAP::accept_count() {
00463 int i;
00464 INT16 count = 0;
00465
00466 for (i = 0; i < len; i++) {
00467 if (ptr[i].accepted ())
00468 count++;
00469 }
00470 return count;
00471 }
00472
00473
00477 BOOL8 REJMAP::recoverable_rejects() {
00478 int i;
00479
00480 for (i = 0; i < len; i++) {
00481 if (ptr[i].recoverable ())
00482 return TRUE;
00483 }
00484 return FALSE;
00485 }
00486
00487
00491 BOOL8 REJMAP::quality_recoverable_rejects() {
00492 int i;
00493
00494 for (i = 0; i < len; i++) {
00495 if (ptr[i].accept_if_good_quality ())
00496 return TRUE;
00497 }
00498 return FALSE;
00499 }
00500
00501
00505 void REJMAP::remove_pos(
00506 INT16 pos
00507 ) {
00508 REJ *new_ptr;
00509 int i;
00510
00511 ASSERT_HOST (pos >= 0);
00512 ASSERT_HOST (pos < len);
00513 ASSERT_HOST (len > 0);
00514
00515 len--;
00516 if (len > 0)
00517 new_ptr = (REJ *) memset (alloc_struct (len * sizeof (REJ), "REJ"),
00518 0, len * sizeof (REJ));
00519 else
00520 new_ptr = NULL;
00521
00522 for (i = 0; i < pos; i++)
00523 new_ptr[i] = ptr[i];
00524
00525 for (; pos < len; pos++)
00526 new_ptr[pos] = ptr[pos + 1];
00527
00528
00529 free_struct (ptr, (len + 1) * sizeof (REJ), "REJ");
00530 ptr = new_ptr;
00531 }
00532
00533
00537 void REJMAP::print(FILE *fp) {
00538 int i;
00539 char buff[512];
00540
00541 for (i = 0; i < len; i++) {
00542 buff[i] = ptr[i].display_char ();
00543 }
00544 buff[i] = '\0';
00545 fprintf (fp, "\"%s\"", buff);
00546 }
00547
00548
00549 void REJMAP::full_print(FILE *fp) {
00550 int i;
00551
00552 for (i = 0; i < len; i++) {
00553 ptr[i].full_print (fp);
00554 fprintf (fp, "\n");
00555 }
00556 }
00557
00558
00562 void REJMAP::rej_word_small_xht() {
00563 int i;
00564
00565 for (i = 0; i < len; i++) {
00566 ptr[i].setrej_small_xht ();
00567 }
00568 }
00569
00570
00574 void REJMAP::rej_word_tess_failure() {
00575 int i;
00576
00577 for (i = 0; i < len; i++) {
00578 ptr[i].setrej_tess_failure ();
00579 }
00580 }
00581
00582
00586 void REJMAP::rej_word_not_tess_accepted() {
00587 int i;
00588
00589 for (i = 0; i < len; i++) {
00590 if (!rejword_only_set_if_accepted || ptr[i].accepted ())
00591 ptr[i].setrej_not_tess_accepted ();
00592 }
00593 }
00594
00595
00599 void REJMAP::rej_word_contains_blanks() {
00600 int i;
00601
00602 for (i = 0; i < len; i++) {
00603 if (!rejword_only_set_if_accepted || ptr[i].accepted ())
00604 ptr[i].setrej_contains_blanks ();
00605 }
00606 }
00607
00608
00612 void REJMAP::rej_word_bad_permuter() {
00613 int i;
00614
00615 for (i = 0; i < len; i++) {
00616 if (!rejword_only_set_if_accepted || ptr[i].accepted ())
00617 ptr[i].setrej_bad_permuter ();
00618 }
00619 }
00620
00621
00625 void REJMAP::rej_word_xht_fixup() {
00626 int i;
00627
00628 for (i = 0; i < len; i++) {
00629 if (!rejword_only_set_if_accepted || ptr[i].accepted ())
00630 ptr[i].setrej_xht_fixup ();
00631 }
00632 }
00633
00634
00638 void REJMAP::rej_word_no_alphanums() {
00639 int i;
00640
00641 for (i = 0; i < len; i++) {
00642 if (!rejword_only_set_if_accepted || ptr[i].accepted ())
00643 ptr[i].setrej_no_alphanums ();
00644 }
00645 }
00646
00647
00651 void REJMAP::rej_word_mostly_rej() {
00652 int i;
00653
00654 for (i = 0; i < len; i++) {
00655 if (!rejword_only_set_if_accepted || ptr[i].accepted ())
00656 ptr[i].setrej_mostly_rej ();
00657 }
00658 }
00659
00660
00664 void REJMAP::rej_word_bad_quality() {
00665 int i;
00666
00667 for (i = 0; i < len; i++) {
00668 if (!rejword_only_set_if_accepted || ptr[i].accepted ())
00669 ptr[i].setrej_bad_quality ();
00670 }
00671 }
00672
00673
00677 void REJMAP::rej_word_doc_rej() {
00678 int i;
00679
00680 for (i = 0; i < len; i++) {
00681 if (!rejword_only_set_if_accepted || ptr[i].accepted ())
00682 ptr[i].setrej_doc_rej ();
00683 }
00684 }
00685
00686
00690 void REJMAP::rej_word_block_rej() {
00691 int i;
00692
00693 for (i = 0; i < len; i++) {
00694 if (!rejword_only_set_if_accepted || ptr[i].accepted ())
00695 ptr[i].setrej_block_rej ();
00696 }
00697 }
00698
00699
00703 void REJMAP::rej_word_row_rej() {
00704 int i;
00705
00706 for (i = 0; i < len; i++) {
00707 if (!rejword_only_set_if_accepted || ptr[i].accepted ())
00708 ptr[i].setrej_row_rej ();
00709 }
00710 }