Changeset daeb6d in git for Singular/ipid.cc


Ignore:
Timestamp:
Oct 22, 1998, 2:26:17 PM (26 years ago)
Author:
Kai Krüger <krueger@…>
Branches:
(u'spielwiese', '2a584933abf2a2d3082034c7586d38bb6de1a30a')
Children:
c6217051c24f5239a0f05fbcbf54346d4765c2e5
Parents:
f78e2660572d74fc77f51e15288a9f225a21bd10
Message:
 	tesths.cc subexpr.h subexpr.cc ipshell.h ipshell.cc iplib.cc
 	ipid.h ipid.cc ipassign.cc iparith.cc ChangeLog
	  - Added assignment <package>=<package> via ref-counter
	    rewriten killhdl for packages
	  - Added libname,language to packages
	  - exportto(Up,...) 'Up' defined in syMake
	  - listvar() shows toplevel-packages too.


git-svn-id: file:///usr/local/Singular/svn/trunk@2589 2c84dea3-7e68-4137-9b89-c4e89433aadc
File:
1 edited

Legend:

Unmodified
Added
Removed
  • Singular/ipid.cc

    rf78e26 rdaeb6d  
    22*  Computer Algebra System SINGULAR     *
    33****************************************/
    4 /* $Id: ipid.cc,v 1.20 1998-10-21 15:56:05 Singular Exp $ */
     4/* $Id: ipid.cc,v 1.21 1998-10-22 12:26:14 krueger Exp $ */
    55
    66/*
     
    3737char* iiNoName="_";
    3838
     39void paCleanUp(package pack);
     40BOOLEAN paKill(package pack, BOOLEAN force_top=FALSE);
     41
    3942/*0 implementation*/
    4043
     
    173176      IDPROC(h)->language=LANG_NONE;
    174177    }
     178    else if (t == PACKAGE_CMD)
     179    {
     180      IDPACKAGE(h)->language=LANG_NONE;
     181    }
     182
    175183  }
    176184  // --------------------------------------------------------
     
    208216#endif
    209217#ifdef HAVE_NAMESPACES
    210         if(strcmp(s,"Top")==0) {
    211         Warn("identifier `%s` in use",s);
    212         return(h);
    213       }
     218        if(t==PACKAGE_CMD && strcmp(s,"Top")==0) {
     219          Warn("identifier `%s` in use",s);
     220          return(h);
     221        }
    214222#endif /* HAVE_NAMESPACES */
    215223        if (s==IDID(h))
     
    350358  }
    351359  // ring / qring  --------------------------------------------------------
    352   // package  -------------------------------------------------------------
    353360  if ((IDTYP(h) == RING_CMD) || (IDTYP(h) == QRING_CMD))
    354361  {
     
    394401  // package -------------------------------------------------------------
    395402  else if (IDTYP(h) == PACKAGE_CMD) {
    396     package pack = IDPACKAGE(h);
    397     if(!checkPackage(pack)) return;
    398     idhdl hdh = pack->idroot;
    399     //idhdl  hdh = IDNEXT(*hd);
    400     idhdl  temp;
    401     //Print(">>>>>>Free package\n");
    402     while (hdh!=NULL)
    403     {
    404       temp = IDNEXT(hdh);
    405       //Print("killing %s\n", IDID(hdh));
    406       killhdl(hdh,&(IDPACKAGE(h)->idroot));
    407       hdh = temp;
    408     }
    409     //Print("killing last %s\n", IDID(*hd));
    410     //killhdl(*hd,hd);
    411     //Print(">>>>>>Free package... done\n");
     403    if(IDPACKAGE(h)->language!=LANG_TOP) {
     404      if(!paKill(IDPACKAGE(h))) return;
     405    } else {
     406      if(strcmp(IDID(h), "Top")!=0) {
     407        if(!paKill(IDPACKAGE(h))) return;
     408      }
     409      else {
     410        if(!paKill(IDPACKAGE(h), TRUE)) return;
     411      }
     412    }
    412413  }
    413414  // pointer -------------------------------------------------------------
     
    690691  if (pi->ref <= 0)
    691692    Free((ADDRESS)pi, sizeof(procinfo));
     693}
     694
     695void paCleanUp(package pack)
     696{
     697  (pack->ref)--;
     698  if (pack->ref < 0)
     699  {
     700    if( pack->language == LANG_C)
     701    {
     702      Print("//dclose(%s)\n",pack->libname);
     703     
     704    }
     705    FreeL((ADDRESS)pack->libname);
     706    memset((void *) pack, 0, sizeof(package));
     707    pack->language=LANG_NONE;
     708  }
     709}
     710
     711BOOLEAN paKill(package pack, BOOLEAN force_top)
     712{
     713  if (pack->ref <= 0 || force_top) {
     714    idhdl hdh = pack->idroot;
     715    idhdl temp;
     716    while (hdh!=NULL)
     717    {
     718      temp = IDNEXT(hdh);
     719      if((IDTYP(hdh)!=PACKAGE_CMD) ||
     720         (IDTYP(hdh)==PACKAGE_CMD && IDPACKAGE(hdh)->language!=LANG_TOP) ||
     721         (IDTYP(hdh)==PACKAGE_CMD && IDPACKAGE(hdh)->language==LANG_TOP &&
     722         IDPACKAGE(hdh)->ref>0 ))
     723        killhdl(hdh,&(pack->idroot));
     724      hdh = temp;
     725    }
     726    if(checkPackage(pack)) {
     727      paCleanUp(pack);
     728      Free((ADDRESS)pack, sizeof(package));
     729    } else return FALSE;
     730  } else paCleanUp(pack);
     731  return TRUE;
    692732}
    693733
     
    857897  }
    858898  if (nshdl->pack==pack) {
     899    //Print("NSstack: %s:%d, nesting=%d\n", nshdl->name, nshdl->lev, nshdl->myynest);
    859900    Warn("package '%s' still in use on level %d",nshdl->name, nshdl->lev);
    860901    return FALSE;
Note: See TracChangeset for help on using the changeset viewer.