コード例 #1
0
ファイル: frqueue.C プロジェクト: ralfbrown/framepac
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 ;
}
コード例 #2
0
ファイル: frqueue.C プロジェクト: ralfbrown/framepac
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
}
コード例 #3
0
ファイル: frregexp.C プロジェクト: ralfbrown/framepac
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 ;
}
コード例 #4
0
ファイル: testfp.C プロジェクト: tripleee/la-strings
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 ;
}
コード例 #5
0
ファイル: frtxtspn.C プロジェクト: ralfbrown/framepac
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 ;
}