Changeset 94d691 in git


Ignore:
Timestamp:
Mar 27, 2017, 2:04:58 PM (7 years ago)
Author:
Hans Schoenemann <hannes@…>
Branches:
(u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
Children:
19e445169dc94cfe73bfa752bb44871e975d40dfc3b003914c0b9ce9b79928dbffdac547fdfc1700
Parents:
0d1a367213d4988be6eb6006d04b503fd8914d97
Message:
add iiCallLibProc1, iiCallLibProcM (<- iiCallLib): call LIB-proc from C++
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • Singular/iplib.cc

    r0d1a36 r94d691  
    586586  return FALSE;
    587587}
    588 
    589 void* iiCallLib(const char*n, void *arg, int arg_type, BOOLEAN &err)
    590 {
    591   idhdl h=ggetid(n);
    592   if ((h==NULL)
    593   || (IDTYP(h)!=PROC_CMD))
    594   {
    595     err=2;
    596     return NULL;
    597   }
    598   // ring handling
    599   idhdl save_ringhdl=currRingHdl;
    600   ring save_ring=currRing;
     588static void iiCallLibProcBegin()
     589{
    601590  idhdl tmp_ring=NULL;
    602591  if (currRing!=NULL)
     
    614603    }
    615604  }
     605}
     606static void iiCallLibProcEnd(idhdl save_ringhdl, ring save_ring)
     607{
     608  if ((currRing!=NULL)
     609  &&(currRing!=save_ring))
     610  {
     611    currRing->ref--;
     612    idhdl hh=IDROOT;
     613    idhdl prev=NULL;
     614    while((hh!=currRingHdl) && (hh!=NULL)) { prev=hh; hh=hh->next; }
     615    if (hh!=NULL)
     616    {
     617      if (prev==NULL) IDROOT=hh->next;
     618      else prev->next=hh->next;
     619      omFree((ADDRESS)IDID(hh));
     620      omFreeBin((ADDRESS)hh, idrec_bin);
     621    }
     622    else
     623    {
     624      WarnS("internal: lost ring in iiCallLib");
     625    }
     626  }
     627  currRingHdl=save_ringhdl;
     628  currRing=save_ring;
     629}
     630
     631void* iiCallLibProc1(const char*n, void *arg, int arg_type, BOOLEAN &err)
     632{
     633  idhdl h=ggetid(n);
     634  if ((h==NULL)
     635  || (IDTYP(h)!=PROC_CMD))
     636  {
     637    err=2;
     638    return NULL;
     639  }
     640  // ring handling
     641  idhdl save_ringhdl=currRingHdl;
     642  ring save_ring=currRing;
     643  iiCallLibProcBegin();
    616644  // argument:
    617645  sleftv tmp;
     
    622650  err=iiMake_proc(h,currPack,&tmp);
    623651  // clean up ring
    624   if (tmp_ring!=NULL)
    625   {
    626     IDRING(tmp_ring)->ref--;
    627     idhdl hh=IDROOT;
    628     idhdl prev=NULL;
    629     while((hh!=tmp_ring) && (hh!=NULL)) { prev=hh; hh=hh->next; }
    630     if (hh!=NULL)
    631     {
    632       if (prev==NULL) IDROOT=hh->next;
    633       else prev->next=hh->next;
    634       omFree((ADDRESS)IDID(hh));
    635       omFreeBin((ADDRESS)hh, idrec_bin);
    636     }
    637     else
    638     {
    639       WarnS("internal: lost ring in iiCallLib");
    640     }
    641   }
    642   currRingHdl=save_ringhdl;
    643   currRing=save_ring;
     652  iiCallLibProcEnd(save_ringhdl,save_ring);
     653  // return
     654  if (err==FALSE)
     655  {
     656    void*r=iiRETURNEXPR.data;
     657    iiRETURNEXPR.data=NULL;
     658    iiRETURNEXPR.CleanUp();
     659    return r;
     660  }
     661  return NULL;
     662}
     663/// args: NULL terminated arry of arguments
     664/// arg_types: 0 terminated array of corresponding types
     665void* iiCallLibProcM(const char*n, void **args, int* arg_types, BOOLEAN &err)
     666{
     667  idhdl h=ggetid(n);
     668  if ((h==NULL)
     669  || (IDTYP(h)!=PROC_CMD))
     670  {
     671    err=2;
     672    return NULL;
     673  }
     674  // ring handling
     675  idhdl save_ringhdl=currRingHdl;
     676  ring save_ring=currRing;
     677  iiCallLibProcBegin();
     678  // argument:
     679  if (arg_types[0]!=0)
     680  {
     681    sleftv tmp;
     682    leftv tt=&tmp;
     683    int i=1;
     684    tmp.Init();
     685    tmp.data=args[0];
     686    tmp.rtyp=arg_types[0];
     687    while(arg_types[i]!=0)
     688    {
     689      tt->next=(leftv)omAlloc0(sizeof(sleftv));
     690      tt=tt->next;
     691      tt->rtyp=arg_types[i];
     692      tt->data=args[i];
     693      i++;
     694    }
     695    // call proc
     696    err=iiMake_proc(h,currPack,&tmp);
     697  }
     698  else
     699  // call proc
     700    err=iiMake_proc(h,currPack,NULL);
     701  // clean up ring
     702  iiCallLibProcEnd(save_ringhdl,save_ring);
    644703  // return
    645704  if (err==FALSE)
  • Singular/ipshell.h

    r0d1a36 r94d691  
    193193  BOOLEAN isring = FALSE, BOOLEAN init_b=TRUE);
    194194BOOLEAN iiMake_proc(idhdl pn, package pack, leftv sl);
    195 void* iiCallLib(const char*n, void *arg, int arg_type, BOOLEAN &err);
     195void* iiCallLibProc1(const char*n, void *arg, int arg_type, BOOLEAN &err);
     196void* iiCallLibProcM(const char*n, void **args, int *arg_types, BOOLEAN &err);
    196197// from misc.cc:
    197198char *  showOption();
  • kernel/ideals.cc

    r0d1a36 r94d691  
    519519  {
    520520    BOOLEAN err;
    521     h3=(ideal)iiCallLib("groebner",idCopy(h2),MODUL_CMD,err);
     521    h3=(ideal)iiCallLibProc1("groebner",idCopy(h2),MODUL_CMD,err);
    522522    if (err)
    523523    {
Note: See TracChangeset for help on using the changeset viewer.