bool FrTextSpans::insertMetaData(FrSymbol *key, FrObject *value, bool copy) { FrStructField *field = m_metadata.getField(key) ; if (!field) return setMetaData(key,value,copy) ; FrObject *oldvalue = field->get() ; if (oldvalue) { if (!oldvalue->consp()) { oldvalue = new FrList(oldvalue) ; field->set(oldvalue) ; } FrList *list = (FrList*)oldvalue ; if (!list->member(value,::equal)) { pushlist(value&©?value->deepcopy():value,list) ; field->set(list) ; } } else if (value && value->consp()) field->set(copy?value->deepcopy():value) ; else field->set(new FrList((value&©)?value->deepcopy():value)) ; return true ; }
static FrRegExElt *compile_class(const char *&re, FrList *&classes) { assertq(*re == FrRE_CLASS_BEG) ; re++ ; const char *name_end = strchr(re,FrRE_CLASS_END) ; if (name_end) { char name[FrMAX_SYMBOLNAME_LEN+1] ; size_t namelen = name_end - re ; if (namelen >= sizeof(name)) namelen = sizeof(name) - 1 ; memcpy(name,re,namelen) ; name[namelen] = '\0' ; re = name_end + 1 ; FrRegExClass *class_members = new FrRegExClass ; if (!class_members) return 0 ; // out of memory! FrSymbol *namesym = FrSymbolTable::add(name) ; FrList *cl = (FrList*)classes->assoc(namesym) ; if (cl) { // add to list of instances of this class FrList *members = cl->rest() ; pushlist((FrObject*)class_members,members) ; cl->replacd(members) ; } else { // create a new list of class instances pushlist(new FrList(namesym,(FrObject*)class_members),classes) ; } return new FrRegExElt(class_members) ; } return 0 ; }
bool FrTextSpans::addMetaData(FrSymbol *key, const FrObject *value) { FrStructField *field = m_metadata.getField(key) ; if (!field) return setMetaData(key,value) ; FrObject *oldvalue = field->get() ; if (oldvalue) { if (oldvalue->consp()) { FrList *list = (FrList*)oldvalue ; if (value && value->consp()) { FrList *newvalue = ((FrList*)value)->difference(list) ; list = newvalue->nconc(list) ; } else if (!list->member(value,::equal)) pushlist(value?value->deepcopy():0,list) ; field->set(list) ; } else return false ; } else if (value && value->consp()) field->set(value->deepcopy()) ; else field->set(new FrList(value?value->deepcopy():0)) ; return true ; }
FrObject *FrQueue::find(const FrObject *item, FrCompareFunc cmp) const { for (FrList *q = qhead ; q ; q = q->rest()) if (cmp(item,q->first())) return q->first() ; return 0 ; // not found }
FrObject *FrQueue::subseq(size_t start, size_t stop) const { FrList *items = qhead ? (FrList*)qhead->subseq(start,stop) : 0 ; FrQueue *newqueue = new FrQueue ; newqueue->qhead = items ; newqueue->qtail = items->last() ; return newqueue ; }
bool FrQueue::remove(const FrObject *item) { FrList *prev = 0 ; FrList *curr = qhead ; while (curr && curr->first() != item) { prev = curr ; curr = curr->rest() ; } if (curr) { if (prev) prev->replacd(curr->rest()) ; else qhead = curr->rest() ; curr->replaca(0) ; curr->replacd(0) ; delete curr ; qlength-- ; return true ; } else return false ; }
void FrQueue::addFront(const FrObject *item, bool do_copy) { FrList *newitem = new FrList ; newitem->replaca((item && do_copy) ? item->deepcopy() : item) ; newitem->replacd(qhead) ; if (qhead) qhead = newitem ; else qhead = qtail = newitem ; qlength++ ; }
static void symtab_menu(ostream &out, istream &in) { int choice ; static FrList *symtabs = 0 ; FrCons *newtab ; FrSymbolTable *old_symtab = FrSymbolTable::current() ; do { FrSymbolTable::selectDefault() ; // read into default symbol table choice = display_menu(out,in,true,5, "FrSymbol Table Options:", "\t1. Select default symbol table\n" "\t2. Create a new symbol table\n" "\t3. FrList symbol tables\n" "\t4. Select symbol table by name\n" "\t5. Destroy a symbol table\n" ) ; old_symtab->select() ; // restore symbol table after reading input switch (choice) { case 0: // do nothing break ; case 1: FrSymbolTable::selectDefault() ; break ; case 2: newtab = symtab_create(in,symtabs) ; if (newtab) pushlist(newtab,symtabs) ; break ; case 3: out << "\nCurrent symbol tables: (default)" ; FrList *sym ; for (sym = symtabs ; sym ; sym = sym->rest()) out << ", " << sym->car()->car() ; out << endl << endl ; break ; case 4: old_symtab = symtab_select(in,symtabs) ; break ; case 5: symtabs = symtab_delete(in,symtabs) ; break ; default: FrMissedCase("symtab_menu") ; break ; } } while (choice != 0) ; old_symtab->select() ; return ; }
FrList *FrTextSpans::wordList() const { FrList *words = 0 ; FrList **end = &words ; for (size_t i = 0 ; i < spanCount() ; i++) { const FrTextSpan *span = getSpan(i) ; char *text = span->getText() ; words->pushlistend(new FrString(text,strlen(text),1,false),end) ; } *end = 0 ; // properly terminate the list return words ; }
static FrList *find_files_Windows(const char *directory, const char *mask, const char *extension, bool strip_extension = true) { if (!mask) mask = "*" ; if (!extension) extension = "*" ; struct _finddata_t ffblk ; FrList *files = 0 ; size_t dirlen = strlen(directory) ; size_t masklen = strlen(mask) + 1 ; size_t buflen = dirlen + masklen + strlen(extension) + 2 ; FrLocalAlloc(char,fullname,1024,buflen) ; if (!fullname) { FrNoMemory("while getting disk directory") ; return 0 ; } memcpy(fullname,directory,dirlen) ; fullname[dirlen++] = '/' ; memcpy(fullname+dirlen,mask,masklen) ; if (*extension) { strcat(fullname,".") ; strcat(fullname,extension) ; } ffblk.attrib = _A_NORMAL ; long searchhandle = _findfirst(fullname,&ffblk) ; //!!! if (searchhandle == -1) { FrLocalFree(fullname) ; return 0 ; } int found = 1 ; while (found > 0) { char *period = strip_extension ? strchr(ffblk.name,'.') : strchr(ffblk.name,'\0') ; if (period) { int len = period - ffblk.name ; pushlist(new FrString(ffblk.name,len),files) ; } found = _findnext(searchhandle,&ffblk) ; } _findclose(searchhandle) ; FrLocalFree(fullname) ; return files->sort(string_compare) ; }
FrList *FramepaC_to_FrameKit(const FrFrame *frame) { if (!frame) return 0 ; FrList *temp_FrameKit_slots = nullptr ; FrList *list = new FrList(FrSymbolTable::add(stringMAKEFRAME), FrSymbolTable::add(frame->frameName()->symbolName())); if (do_slots(frame,FramepaC_to_FrameKit_slot,&temp_FrameKit_slots)) return list->nconc(temp_FrameKit_slots) ; else { FrWarning("error encountered while converting frame to FrameKit format.") ; return 0 ; } }
void FrTextSpans::parseSpans(const FrList *spans, size_t numstrings) { for (const FrList *sp = spans ; sp ; sp = sp->rest()) { const FrObject *item = sp->first() ; if (item && (item->stringp() || item->symbolp())) { m_text = FrDupString(FrPrintableName(item)) ; if (m_text && setPositionMap()) break ; return ; } } m_spancount = spans->simplelistlength() - numstrings ; m_spans = FrNewN(FrTextSpan,m_spancount) ; if (!m_spans) { m_spancount = 0 ; return ; } size_t count = 0 ; for ( ; spans ; spans = spans->rest()) { FrList *span = (FrList*)spans->first() ; if (!span) continue ; if (span->consp() && m_spans[count].parse(span,this)) { count++ ; m_sorted = false ; } else if (span->structp()) { FrStruct *meta = (FrStruct*)span ; if (meta->typeName() && Fr_stricmp(FrPrintableName(meta->typeName()),"META") == 0) addMetaData(meta) ; } } m_spancount = count ; return ; }
bool FrTextSpan::addMetaData(FrSymbol *key, const FrObject *value) { if (!metaData()) { setMetaData(new FrStruct(FrSymbolTable::add(METADATA_TYPENAME))) ; if (!metaData()) return false ; } FrObject *oldvalue = m_metadata->get(key) ; if (oldvalue) { if (oldvalue->consp()) { FrList *list = (FrList*)oldvalue->deepcopy() ; if (value && value->consp()) { FrList *newvalue = ((FrList*)value)->difference(list) ; list = newvalue->nconc(list) ; m_metadata->put(key,list,false) ; } else if (!list->member(value,::equal)) { pushlist(value?value->deepcopy():0,list) ; m_metadata->put(key,list,false) ; } else free_object(list) ; } else return false ; } else if (value && value->consp()) m_metadata->put(key,value->deepcopy(),false) ; else m_metadata->put(key,new FrList(value?value->deepcopy():0),false) ; return true ; }
static FrList *find_files_Unix(const char *directory, const char *filemask, const char *extension, bool strip_extension = true) { if (!extension) extension = "" ; if (!filemask) filemask = "*" ; size_t filelen = strlen(filemask) ; size_t extlen = strlen(extension) + 1 ; size_t masklen = filelen + extlen + 1 ; FrLocalAlloc(char,mask,1024,masklen) ; if (!mask) { FrNoMemory("while searching for files") ; return 0 ; } memcpy(mask,filemask,filelen+1) ; if (*extension) { mask[filelen++] = '.' ; memcpy(mask+filelen,extension,extlen) ; } FrList *files = 0 ; DIR *dirp = opendir(directory) ; if (dirp) { struct dirent *entry ; while ((entry = readdir(dirp)) != 0) { const char *name = entry->d_name ; const char *m = mask ; while (*name && *m && *m != '*' && (*name == *m || *m == '?')) { name++ ; m++ ; } bool match = false ; if (*m == '*') { size_t tail = strlen(m+1) ; size_t remaining = strlen(name) ; if (tail <= remaining && strcmp(name+remaining-tail,m+1) == 0) match = true ; } else if (*m == *name) match = true ; if (match) { name = entry->d_name ; size_t len = strlen(name) ; if (strip_extension && *extension) len -= (strlen(extension) + 1) ; pushlist(new FrString(name,len), files) ; } } closedir(dirp) ; } FrLocalFree(mask) ; return files->sort(string_compare) ; }
bool FrTextSpan::parse(const FrList *span, FrTextSpans *contain) { if (span && span->consp() && span->simplelistlength() >= 2 && span->first() && span->second() && span->first()->numberp() && span->second()->numberp()) { size_t sp_start = span->first()->intValue() ; size_t sp_end = span->second()->intValue() ; span = span->rest()->rest() ; // we'll allow rather free-form input from the rest of the span's // description: the first two numbers are the score and weight, // respectively, the first string is the span's text, the second // string (if present) becomes the INIT_TEXT metadata. Then, // the first structure (if present) is the metadata, and any lists // starting with a symbol become additional metadata fields double sp_score = DEFAULT_SCORE ; double sp_weight = DEFAULT_WEIGHT ; // scan for the first two numbers for (const FrList *sp = span ; sp ; sp = sp->rest()) { if (sp->first() && sp->first()->numberp()) { sp_score = sp->first()->floatValue() ; for (sp = sp->rest() ; sp ; sp = sp->rest()) { if (sp->first() && sp->first()->numberp()) { sp_weight = sp->first()->floatValue() ; break ; } } break ; } } const char *curr_text = 0 ; const char *orig_text = 0 ; // scan for the first two strings or symbols for (const FrList *sp = span ; sp ; sp = sp->rest()) { FrObject *item = sp->first() ; if (item && (item->stringp() || item->symbolp())) { curr_text = item->printableName() ; for (sp = sp->rest() ; sp ; sp = sp->rest()) { item = sp->first() ; if (item && (item->stringp() || item->symbolp())) { orig_text = item->printableName() ; break ; } } break ; } } if (curr_text) (void)FrSkipWhitespace(curr_text) ; if (orig_text) (void)FrSkipWhitespace(orig_text) ; // scan for the first structure const FrStruct *meta = 0 ; for (const FrList *sp = span ; sp ; sp = sp->rest()) { if (sp->first() && sp->first()->structp()) { meta = (FrStruct*)sp->first() ; break ; } } init(sp_start,sp_end,sp_score,sp_weight,curr_text,contain) ; free_object(m_metadata) ; if (meta) { FrSymbol *symMETATYPE = FrSymbolTable::add(METADATA_TYPENAME) ; if (meta->typeName() == symMETATYPE) m_metadata = (FrStruct*)meta->deepcopy() ; else { // copy the keywords one by one FrList *keys = meta->fieldNames() ; while (keys) { FrSymbol *key = (FrSymbol*)poplist(keys) ; setMetaData(key,meta->get(key)) ; } } } if (orig_text) setMetaData(FrSymbolTable::add(init_text_tag), new FrString(orig_text),false) ; // finally, scan for any embedded lists and add them as metadata fields for (const FrList *sp = span ; sp ; sp = sp->rest()) { FrList *item = (FrList*)sp->first() ; if (item && item->consp() && item->first() && item->first()->symbolp()) { FrSymbol *key = (FrSymbol*)item->first() ; setMetaData(key,item->rest()) ; } } return true ; } return false ; }
void display_object_info(ostream &out, const FrObject *obj) { FramepaC_bgproc() ; // handle any asynchronous operations FramepaC_bgproc() ; size_t objlen = FrObject_string_length(obj) ; out << "\n\nYou entered " ; if (objlen > 68) out << endl ; out << obj << endl ; if (obj) out << "That object is of type " << obj->objTypeName() << "; it takes " << objlen << " bytes to print" << endl ; else return ; if (obj->framep()) { FrList *framekit = FramepaC_to_FrameKit((FrFrame *)obj) ; out << "As a FrameKit frame, it would be:\n" << framekit << endl ; free_object(framekit) ; } else if (obj->arrayp()) { if (obj->length() > 0) out << "This " << ((obj->objType() == OT_FrSparseArray) ? "sparse " : "") << "array's last element is " << (*(FrArray*)obj)[obj->length()-1] << endl ; } else if (obj->queuep()) { out << "This queue contains " << ((FrQueue*)obj)->queueLength() << " items" << endl ; } else if (obj->hashp()) { FrList *matches = ((FrHashTable*)obj)->prefixMatches("A") ; out << "This hash table contains " << matches->listlength() << " items matching the prefix 'A'" << endl ; free_object(matches) ; } else if (obj->stringp()) out << "This string uses " << ((FrString*)obj)->charWidth() << "-byte characters." << endl ; else if (obj->consp()) { out << "Its length is " << obj->length() << " cons cells.\n" << "Its head is " << obj->car() << " and its tail is " << obj->cdr() << endl << endl ; FrObject *obj_car = obj->car() ; if (obj_car && obj_car->symbolp() && (obj_car == findSymbol("MAKE-FRAME") || obj_car == findSymbol("MAKE-FRAME-OLD"))) { FrFrame *frame = FrameKit_to_FramepaC((FrList *)obj) ; out << "It is a FrameKit frame; as a FramepaC frame, it would be:\n" << frame << endl ; free_object(frame) ; } } else if (obj->vectorp()) { out << "This vector contains " << obj->length() << " bits, of which " << ((FrBitVector*)obj)->countBits() << " are set." << endl ; } FramepaC_bgproc() ; // handle any asynchronous operations }