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 ; }
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 ; }
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++ ; }