Mark_mmdb::Mark_mmdb (MarkBase_mmdb &base, UAS_Pointer<UAS_Common> &doc_ptr, const Anchor &anchor, const char *name, const char *notes) : f_doc_ptr (doc_ptr), f_anchor (anchor), f_mark_base (base), f_name (NULL), f_notes (NULL) { // This creates a new user mark in the mmdb mark database. #ifdef FUJITSU_OLIAS // Id = bookcase id / section id UAS_String theId = doc_ptr->bid(); theId = theId + "/" + doc_ptr->id(); #else UAS_String theId = doc_ptr->id(); #endif f_user_mark = new mark_smart_ptr (base, theId); set_name (name); set_notes (notes); // Flush the new mark to disk. do_save(); }
void MarkBase_mmdb::get_marks (UAS_Pointer<UAS_Common> &doc_ptr, xList<UAS_Pointer<Mark> > &list) { #ifdef FUJITSU_OLIAS UAS_String theId = doc_ptr->bid(); theId = theId + "/" + doc_ptr->id(); #else UAS_String theId = doc_ptr->id(); #endif oid_list_handler *l = f_mark_base->get_mark_list ((char *) theId); if (l != NULL) { for (int i = 1; i <= (*l)->count(); i++) { // Pull the entry from the list and replace it with NULL so // that it doesn't get deleted when the list is deleted. oid_t id = (*l)-> operator()(i); // Assure that the oid_t has not been deleted. qfc 7-6-93 if (id.eq (oid_t (c_code_t(0), 0)) == false) { try { Mark_mmdb *m = find_mark (id, doc_ptr); list.append (m); } catch_any() { // ignore failure for now! DJB } end_try; } } delete l; } }
void printLocs (UAS_Pointer<UAS_Common> doc, int level) { for (int i = 0; i < level; i ++) cerr << " "; UAS_String theLoc = doc->locator(); if (level >= 2) { char buf[1024]; UAS_String loc = doc->id(); (void) sprintf (buf, "mmdb:LOCATOR=%s", (char *) loc); UAS_Pointer<UAS_Common> theDoc = UAS_Common::create(buf); cerr << (char *) theLoc << ", " << (char *) theDoc->title() << endl; } else { cerr << (char *) theLoc << endl; } UAS_List<UAS_Common> kids = doc->children(); for (i = 0; i < kids.length(); i ++) { printLocs (kids[i], level + 1); } }
UAS_Pointer<UAS_SearchEngine> MMDB_Library::search_engine() { UAS_List<UAS_Common> bookcases = bookcaseList(); UAS_PtrList<const char> cList; unsigned int i; #ifdef DEBUG for (i = 0; i < bookcases.length(); i++) fprintf(stderr, "(DEBUG) bookcases %d=%s\n", i, (char*)bookcases[i]->id()); #endif UAS_List<UAS_String> strings; for (i = 0; i < bookcases.length(); i++) { UAS_Pointer<UAS_String> string = new UAS_String; strings.insert_item(string); } for (i = 0; i < bookcases.length(); i++) { UAS_Pointer<UAS_Common> infolib = bookcases[i]->parent(); UAS_String str = infolib->id(); str = str + "/" + bookcases[i]->id(); *(UAS_String *)strings[i] = str; cList.append((char*)(*(UAS_String *)strings[i])); } #ifdef DTSEARCH fSearchEngine = &(DtSR_SearchEngine::search_engine (&cList)); #else fSearchEngine = &(Fulcrum_SearchEngine::search_engine (&cList)); #endif return fSearchEngine; }
UAS_BookcaseEntry::UAS_BookcaseEntry(UAS_Pointer<UAS_Common> &bookcase, int searchable) : f_searchable(searchable), f_name(0), f_base_num(-1) { const char *bc_path = bookcase->id(); if (! bc_path) { f_name = f_path = NULL; } else { const char *bc_name = UASbasename(bc_path); f_name = new char[strlen(bc_name)+1]; strcpy(f_name, bc_name); f_path = new char[strlen(bc_path)+1]; strcpy (f_path, bc_path); } f_infolib_id = bookcase->lid(); f_bookcase_id = bookcase->bid(); }
UAS_Pointer<UAS_List<UAS_TextRun> > DtSR_SearchResultsEntry::create_matches() { #ifdef DEBUG fprintf(stderr, "(DEBUG) UAS_Common is being created from id=\"%s\"\n", (char*)f_id); #endif UAS_Pointer<UAS_Common> doc = UAS_Common::create(f_id); #ifdef DEBUG fprintf(stderr, "(DEBUG) id=%s\n\t" "book_name=%s title=%s\n", (char*)(doc->id()), (char*)(doc->book_name()), (char*)(doc->title())); #endif #ifdef DUMP_NODES { ofstream out("OriginalText"); out << (char *) doc->data(); } #endif mtry { style_sheet_mgr().initOnlineStyleSheet(doc); } // catch_noarg (StyleSheetSyntaxError) mcatch_any() { #ifdef JOE_HATES_THIS message_mgr().error_dialog( (char*)UAS_String(CATGETS(Set_Messages, 39, "File a Bug"))); #else throw(CASTEXCEPT Exception()); #endif } end_try; istringstream input((char *)doc->data()); ostringstream output; mtry { Tml_TextRenderer renderer(output, f_search_res->search_zones()); Resolver resolver(*gPathTab, renderer); DocParser docparser(resolver); docparser.parse(input); } mcatch_any() { ON_DEBUG(cerr << "DtSR_SearchResultsEntry::create_matches...exception thrown" << '\n' << flush); rethrow; } end_try; string outpstr = output.str(); char* text = (char*)outpstr.c_str(); #ifdef DUMP_NODES { ofstream out("ParsedText"); out << text; } #endif #ifdef DEBUG fprintf(stderr, "(DEBUG) stems=0x%p, count=%d\n", (char*)f_search_res->stems(f_dbn)->stems(), f_search_res->stems(f_dbn)->count()); int n_of_stems = 0; for (; n_of_stems < f_search_res->stems(f_dbn)->count(); n_of_stems++) { fprintf(stderr, "(DEBUG) %dth stem = %s\n", n_of_stems, (f_search_res->stems(f_dbn)->stems())[n_of_stems]); } #endif int stype = f_search_res->search_type(); DtSrHitword* kwics = NULL; long n_kwics = 0; char* parseout = NULL; // hack! overwrite f_language, since austext's value is wrong // In future, the next lines should be removed. const char* lang = getenv("LANG"); if (lang && !strncmp(lang, "ja", strlen("ja"))) f_language = DtSrLaJPN; else f_language = DtSrLaENG; if (f_language == DtSrLaJPN) { // do not trust DtSearchHighlight! int count = f_search_res->stems(f_dbn)->count(); ostringstream stemsbuf; for (int i = 0; i < count; i++) { stemsbuf << (f_search_res->stems(f_dbn)->stems())[i] << '\n'; } string stemsbstr = stemsbuf.str(); char* stems = (char*)stemsbstr.c_str(); parseout = StringParser::hilite(text, count, stems); assert( parseout != NULL ); delete[] stems; } else { static DtSR_SearchEngine& search_engine = DtSR_SearchEngine::search_engine(); if (DtSearchHighlight( search_engine.char_db_name(f_dbn), text, &kwics, &n_kwics, stype, (char*)f_search_res->stems(f_dbn)->stems(), f_search_res->stems(f_dbn)->count()) != DtSrOK) { fprintf(stderr, "(ERROR) DtSearchHighlight failed\n"); #ifdef DEBUG abort(); #endif } #ifdef DEBUG fprintf(stderr, "(DEBUG) %ld hit found in %s\n", n_kwics, (char*)f_id); #endif } UAS_Pointer<UAS_List<UAS_TextRun> > matches = new UAS_List<UAS_TextRun>; // convert kwics to textrun string textrbstr; if (parseout == NULL && kwics) { ostringstream textrunbuf; for (int i = 0; i < n_kwics; i++) textrunbuf << kwics[i].offset << '\t' << kwics[i].length << '\n'; textrbstr = textrunbuf.str(); parseout = (char*)textrbstr.c_str(); } else if (parseout == NULL) { return matches; } #ifdef DEBUG fprintf(stderr, "(DEBUG) byte offset and length\n%s", parseout); #endif istringstream textruns(parseout); char linebuf[128]; while (textruns.get(linebuf, 128, '\n')) { char newline; textruns.get(newline); assert( newline == '\n'); char* off_str = linebuf; char* len_str = strchr(linebuf, '\t'); assert( len_str && *len_str == '\t' ); *len_str++ = '\0'; int mode = True; const char* cursor = (const char*)text; assert( *cursor == ShiftIn || *cursor == ShiftOut ); int off = atoi(off_str); int vcc = 0; while (off > 0) { int scanned = 0; if (*cursor == '\n' || *cursor == '\t' || *cursor == ' ' || *cursor == 0x0D || (unsigned char)*cursor == 0xA0) { scanned++; } else if (*cursor == ShiftIn || *cursor == ShiftOut) { if (*cursor == ShiftIn) mode = True; else mode = False; scanned++; } else { scanned = mblen(cursor, MB_CUR_MAX); vcc++; /* skip one byte in case of failure */ if (scanned < 0) scanned = 1; } off -= scanned; cursor += scanned; } if (mode == False) continue; assert( off == 0 ); int len = atoi(len_str); // remove leading white-spaces for (; len && (*cursor == ' ' || *cursor == '\t' || *cursor == '\n'|| *cursor == 0x0D); cursor++, len--); // remove trailing white-spaces if (len > 0) { for (const char* p = cursor + len - 1; *p==' ' || *p=='\t' || *p=='\n' || *p==0x0D; p--, len--); } if (len == 0) continue; int vlen = 0; for (; len > 0; vlen++) { int scanned = mblen(cursor, MB_CUR_MAX); assert( scanned >= 0 ); len -= scanned; cursor += scanned; } UAS_Pointer<UAS_TextRun> textrun = new UAS_TextRun(vcc, vlen); matches->insert_item(textrun); } return matches; }