source: git/Singular/newstruct.cc @ 2e4ec14

spielwiese
Last change on this file since 2e4ec14 was 2e4ec14, checked in by Yue Ren <ren@…>, 11 years ago
fix: -Wunused-parameter warnings
  • Property mode set to 100644
File size: 18.5 KB
Line 
1#include <ctype.h>
2
3#include "config.h"
4#include <kernel/mod2.h>
5#include <Singular/ipid.h>
6#include <Singular/blackbox.h>
7#include <Singular/lists.h>
8#include <Singular/ipid.h>
9#include <Singular/ipshell.h>
10#include <Singular/newstruct.h>
11
12struct newstruct_member_s;
13typedef struct newstruct_member_s *newstruct_member;
14struct  newstruct_member_s
15{
16  newstruct_member next;
17  char *         name;
18  int            typ;
19  int            pos;
20};
21
22struct newstruct_proc_s;
23typedef struct newstruct_proc_a *newstruct_proc;
24struct  newstruct_proc_a
25{
26  newstruct_proc next;
27  int            t; /*tok id */
28  int            args; /* number of args */
29  procinfov      p;
30};
31
32struct newstruct_desc_s
33{
34  newstruct_member member;
35  newstruct_desc   parent;
36  newstruct_proc   procs;
37  int            size; // number of mebers +1
38  int            id;   // the type id assigned to this bb
39};
40
41int newstruct_desc_size()
42{
43  return sizeof(newstruct_desc_s);
44}
45
46char * newstruct_String(blackbox *b, void *d)
47{
48  if (d==NULL) return omStrDup("oo");
49  else
50  {
51    newstruct_desc ad=(newstruct_desc)(b->data);
52
53    newstruct_proc p=ad->procs;
54    while((p!=NULL)&&(p->t!=STRING_CMD))
55      p=p->next;
56
57    if (p!=NULL)
58    {
59      BOOLEAN sl;
60      sleftv tmp;
61      memset(&tmp,0,sizeof(tmp));
62      tmp.rtyp=ad->id;
63      void * newstruct_Copy(blackbox*, void *); //forward declaration
64      tmp.data=(void*)newstruct_Copy(b,d);
65      idrec hh;
66      memset(&hh,0,sizeof(hh));
67      hh.id=Tok2Cmdname(p->t);
68      hh.typ=PROC_CMD;
69      hh.data.pinf=p->p;
70      sl=iiMake_proc(&hh,NULL,&tmp);
71
72      if ((!sl)&& (iiRETURNEXPR.Typ() == STRING_CMD))
73      {
74        char *res = omStrDup((char*)iiRETURNEXPR.CopyD());
75        iiRETURNEXPR.CleanUp();
76        iiRETURNEXPR.Init();
77        return res;
78      }
79      iiRETURNEXPR.CleanUp();
80      iiRETURNEXPR.Init();
81    }
82
83    lists l=(lists)d;
84    newstruct_member a=ad->member;
85    StringSetS("");
86    loop
87    {
88      StringAppendS(a->name);
89      StringAppendS("=");
90      if ((!RingDependend(a->typ))
91      || ((l->m[a->pos-1].data==(void *)currRing)
92         && (currRing!=NULL)))
93      {
94        if (l->m[a->pos].rtyp==LIST_CMD)
95        {
96          StringAppendS("<list>");
97        }
98        else
99        {
100          char *tmp2=omStrDup(l->m[a->pos].String());
101          if ((strlen(tmp2)>80)||(strchr(tmp2,'\n')!=NULL))
102          {
103            StringAppend("<%s>",Tok2Cmdname(l->m[a->pos].rtyp));
104          }
105          else StringAppendS(tmp2);
106          omFree(tmp2);
107        }
108      }
109      else StringAppendS("??");
110      if (a->next==NULL) break;
111      StringAppendS("\n");
112      if(errorreported) break;
113      a=a->next;
114    }
115    return StringEndS();
116  }
117}
118lists lCopy_newstruct(lists L)
119{
120  lists N=(lists)omAlloc0Bin(slists_bin);
121  int n=L->nr;
122  ring save_ring=currRing;
123  N->Init(n+1);
124  for(;n>=0;n--)
125  {
126    if (RingDependend(L->m[n].rtyp))
127    {
128      assume((L->m[n-1].rtyp==RING_CMD) || (L->m[n-1].data==NULL));
129      if(L->m[n-1].data!=NULL)
130      {
131        if (L->m[n-1].data!=(void*)currRing)
132          rChangeCurrRing((ring)(L->m[n-1].data));
133        N->m[n].Copy(&L->m[n]);
134      }
135      else
136      {
137        N->m[n].rtyp=L->m[n].rtyp;
138        N->m[n].data=idrecDataInit(L->m[n].rtyp);
139      }
140    }
141    else if(L->m[n].rtyp==LIST_CMD)
142    {
143      N->m[n].rtyp=L->m[n].rtyp;
144      N->m[n].data=(void *)lCopy((lists)(L->m[n].data));
145    }
146    else if(L->m[n].rtyp>MAX_TOK)
147    {
148      N->m[n].rtyp=L->m[n].rtyp;
149      blackbox *b=getBlackboxStuff(N->m[n].rtyp);
150      N->m[n].data=(void *)b->blackbox_Copy(b,L->m[n].data);
151    }
152    else
153      N->m[n].Copy(&L->m[n]);
154  }
155  if (currRing!=save_ring) rChangeCurrRing(save_ring);
156  return N;
157}
158void * newstruct_Copy(blackbox*, void *d)
159{
160  lists n1=(lists)d;
161  return (void*)lCopy_newstruct(n1);
162}
163
164// Used by newstruct_Assign for overloaded '='
165BOOLEAN newstruct_equal(int op, leftv l, leftv r)
166{
167  blackbox *ll=getBlackboxStuff(op);
168  assume(ll->data != NULL);
169  newstruct_desc nt=(newstruct_desc)ll->data;
170  newstruct_proc p=nt->procs;
171
172  while( (p!=NULL) && ((p->t!='=')||(p->args!=1)) ) p=p->next;
173
174  if (p!=NULL)
175  {
176    BOOLEAN sl;
177    idrec hh;
178    memset(&hh,0,sizeof(hh));
179    hh.id=Tok2Cmdname(p->t);
180    hh.typ=PROC_CMD;
181    hh.data.pinf=p->p;
182    sleftv tmp;
183    memset(&tmp,0,sizeof(sleftv));
184    tmp.Copy(r);
185    sl = iiMake_proc(&hh, NULL, &tmp);
186    if (!sl)
187    {
188      if (iiRETURNEXPR.Typ() == op)
189      {
190        l->Copy(&iiRETURNEXPR);
191        iiRETURNEXPR.Init();
192        return FALSE;
193      }
194      iiRETURNEXPR.CleanUp();
195      iiRETURNEXPR.Init();
196    }
197  }
198  return TRUE;
199}
200
201void lClean_newstruct(lists l)
202{
203  if (l->nr>=0)
204  {
205    int i;
206    ring r=NULL;
207    for(i=l->nr;i>=0;i--)
208    {
209      if ((i>0) && (l->m[i-1].rtyp==RING_CMD))
210        r=(ring)(l->m[i-1].data);
211      else
212        r=NULL;
213      l->m[i].CleanUp(r);
214    }
215    omFreeSize((ADDRESS)l->m, (l->nr+1)*sizeof(sleftv));
216    l->nr=-1;
217  }
218  omFreeBin((ADDRESS)l,slists_bin);
219}
220
221BOOLEAN newstruct_Assign(leftv l, leftv r)
222{
223  if (r->Typ()>MAX_TOK)
224  {
225    blackbox *rr=getBlackboxStuff(r->Typ());
226    if (l->Typ()!=r->Typ())
227    {
228      newstruct_desc rrn=(newstruct_desc)rr->data;
229
230      if (!rrn)
231      {
232        Werror("custom type %s(%d) cannot be assigned to newstruct %s(%d)",
233               Tok2Cmdname(r->Typ()), r->Typ(), Tok2Cmdname(l->Typ()), l->Typ());
234        return TRUE;
235      }
236
237      newstruct_desc rrp=rrn->parent;
238      while ((rrp!=NULL)&&(rrp->id!=l->Typ())) rrp=rrp->parent;
239      if (rrp!=NULL)
240      {
241        if (l->rtyp==IDHDL)
242        {
243          IDTYP((idhdl)l->data)=r->Typ();
244        }
245        else
246        {
247          l->rtyp=r->Typ();
248        }
249      }
250      else                      // unrelated types - look for custom conversion
251      {
252        sleftv tmp;
253        BOOLEAN newstruct_Op1(int, leftv, leftv);  // forward declaration
254        if (! newstruct_Op1(l->Typ(), &tmp, r))  return newstruct_Assign(l, &tmp);
255      }
256    }
257    if (l->Typ()==r->Typ())
258    {
259      if (l->Data()!=NULL)
260      {
261        lists n1=(lists)l->Data();
262        lClean_newstruct(n1);
263      }
264      lists n2=(lists)r->Data();
265      n2=lCopy_newstruct(n2);
266      if (l->rtyp==IDHDL)
267      {
268        IDDATA((idhdl)l->data)=(char *)n2;
269      }
270      else
271      {
272        l->data=(void *)n2;
273      }
274      return FALSE;
275    }
276  }
277
278  else
279  {
280    assume(l->Typ() > MAX_TOK);
281    sleftv tmp;
282    if(!newstruct_equal(l->Typ(), &tmp, r)) return newstruct_Assign(l, &tmp);
283  }
284  Werror("assign %s(%d) = %s(%d)",
285        Tok2Cmdname(l->Typ()),l->Typ(),Tok2Cmdname(r->Typ()),r->Typ());
286  return TRUE;
287}
288
289BOOLEAN newstruct_Op1(int op, leftv res, leftv arg)
290{
291  // interpreter: arg is newstruct
292  blackbox *a=getBlackboxStuff(arg->Typ());
293  newstruct_desc nt=(newstruct_desc)a->data;
294  newstruct_proc p=nt->procs;
295
296  while((p!=NULL) &&( (p->t!=op) || (p->args!=1) )) p=p->next;
297
298  if (p!=NULL)
299  {
300    BOOLEAN sl;
301    sleftv tmp;
302    memset(&tmp,0,sizeof(sleftv));
303    tmp.Copy(arg);
304    idrec hh;
305    memset(&hh,0,sizeof(hh));
306    hh.id=Tok2Cmdname(p->t);
307    hh.typ=PROC_CMD;
308    hh.data.pinf=p->p;
309    sl=iiMake_proc(&hh,NULL,&tmp);
310    if (sl) return TRUE;
311    else
312    {
313      res->Copy(&iiRETURNEXPR);
314      iiRETURNEXPR.Init();
315      return FALSE;
316    }
317  }
318  return blackboxDefaultOp1(op,res,arg);
319}
320
321
322
323BOOLEAN newstruct_Op2(int op, leftv res, leftv a1, leftv a2)
324{
325  // interpreter: a1 or a2 is newstruct
326  blackbox *a=getBlackboxStuff(a1->Typ());
327  newstruct_desc nt;
328  lists al=(lists)a1->Data();
329  if (a!=NULL)
330  {
331    nt=(newstruct_desc)a->data;
332    switch(op)
333    {
334      case '.':
335      {
336        if (a2->name!=NULL)
337        {
338          BOOLEAN search_ring=FALSE;
339          newstruct_member nm=nt->member;
340          while ((nm!=NULL)&&(strcmp(nm->name,a2->name)!=0)) nm=nm->next;
341          if ((nm==NULL) && (strncmp(a2->name,"r_",2)==0))
342          {
343            nm=nt->member;
344            while ((nm!=NULL)&&(strcmp(nm->name,a2->name+2)!=0)) nm=nm->next;
345            if ((nm!=NULL)&&(RingDependend(nm->typ)))
346              search_ring=TRUE;
347            else
348              nm=NULL;
349          }
350          if (nm==NULL)
351          {
352            Werror("member %s nor found", a2->name);
353            return TRUE;
354          }
355          if (search_ring)
356          {
357            ring r;
358            res->rtyp=RING_CMD;
359            res->data=al->m[nm->pos-1].data;
360            r=(ring)res->data;
361            if (r==NULL) { res->data=(void *)currRing; r=currRing; }
362            if (r!=NULL) r->ref++;
363            else Werror("ring of this member is not set and no basering found");
364            return r==NULL;
365          }
366          else if (RingDependend(nm->typ))
367          {
368            if (al->m[nm->pos].data==NULL)
369            {
370              // NULL belongs to any ring
371              ring r=(ring)al->m[nm->pos-1].data;
372              if (r!=NULL)
373              {
374                r->ref--;
375                al->m[nm->pos-1].data=NULL;
376                al->m[nm->pos-1].rtyp=DEF_CMD;
377              }
378            }
379            else
380            {
381              //Print("checking ring at pos %d for dat at pos %d\n",nm->pos-1,nm->pos);
382              if ((al->m[nm->pos-1].data!=(void *)currRing)
383              &&(al->m[nm->pos-1].data!=(void*)0L))
384              {
385                Werror("different ring %lx(data) - %lx(basering)",
386                  (long unsigned)(al->m[nm->pos-1].data),(long unsigned)currRing);
387                return TRUE;
388              }
389            }
390            if ((currRing!=NULL)&&(al->m[nm->pos-1].data==NULL))
391            {
392              // remember the ring, if not already set
393              al->m[nm->pos-1].data=(void *)currRing;
394              al->m[nm->pos-1].rtyp=RING_CMD;
395              currRing->ref++;
396            }
397          }
398          Subexpr r=(Subexpr)omAlloc0Bin(sSubexpr_bin);
399          r->start = nm->pos+1;
400          memcpy(res,a1,sizeof(sleftv));
401          memset(a1,0,sizeof(sleftv));
402          if (res->e==NULL) res->e=r;
403          else
404          {
405            Subexpr sh=res->e;
406            while (sh->next != NULL) sh=sh->next;
407            sh->next=r;
408          }
409          return FALSE;
410        }
411        else
412        {
413          WerrorS("name expected");
414          return TRUE;
415        }
416      }
417    }
418  }
419  else
420  {
421    a=getBlackboxStuff(a2->Typ());
422    nt=(newstruct_desc)a->data;
423    al=(lists)a2->Data();
424  }
425  newstruct_proc p=nt->procs;
426  while((p!=NULL) && ( (p->t!=op) || (p->args!=2) )) p=p->next;
427  if (p!=NULL)
428  {
429    BOOLEAN sl;
430    sleftv tmp;
431    memset(&tmp,0,sizeof(sleftv));
432    tmp.Copy(a1);
433    tmp.next=(leftv)omAlloc0(sizeof(sleftv));
434    tmp.next->Copy(a2);
435    idrec hh;
436    memset(&hh,0,sizeof(hh));
437    hh.id=Tok2Cmdname(p->t);
438    hh.typ=PROC_CMD;
439    hh.data.pinf=p->p;
440    sl=iiMake_proc(&hh,NULL,&tmp);
441    if (sl) return TRUE;
442    else
443    {
444      res->Copy(&iiRETURNEXPR);
445      iiRETURNEXPR.Init();
446      return FALSE;
447    }
448  }
449  return blackboxDefaultOp2(op,res,a1,a2);
450}
451
452// BOOLEAN opM(int op, leftv res, leftv args)
453BOOLEAN newstruct_OpM(int op, leftv res, leftv args)
454{
455  // interpreter: args->1. arg is newstruct
456  blackbox *a=getBlackboxStuff(args->Typ());
457  newstruct_desc nt=(newstruct_desc)a->data;
458  switch(op)
459  {
460    case STRING_CMD:
461    {
462      res->data=(void *)a->blackbox_String(a,args->Data());
463      res->rtyp=STRING_CMD;
464      return FALSE;
465    }
466    default:
467      break;
468  }
469  newstruct_proc p=nt->procs;
470
471  while((p!=NULL) &&( (p->t!=op) || (p->args!=4) )) p=p->next;
472
473  if (p!=NULL)
474  {
475    BOOLEAN sl;
476    sleftv tmp;
477    memset(&tmp,0,sizeof(sleftv));
478    tmp.Copy(args);
479    idrec hh;
480    memset(&hh,0,sizeof(hh));
481    hh.id=Tok2Cmdname(p->t);
482    hh.typ=PROC_CMD;
483    hh.data.pinf=p->p;
484    sl=iiMake_proc(&hh,NULL,&tmp);
485    if (sl) return TRUE;
486    else
487    {
488      res->Copy(&iiRETURNEXPR);
489      iiRETURNEXPR.Init();
490      return FALSE;
491    }
492  }
493  return blackbox_default_OpM(op,res,args);
494}
495
496void newstruct_destroy(blackbox */*b*/, void *d)
497{
498  if (d!=NULL)
499  {
500    lists n=(lists)d;
501    lClean_newstruct(n);
502  }
503}
504
505void *newstruct_Init(blackbox *b)
506{
507  newstruct_desc n=(newstruct_desc)b->data;
508  lists l=(lists)omAlloc0Bin(slists_bin);
509  l->Init(n->size);
510  newstruct_member nm=n->member;
511  while (nm!=NULL)
512  {
513    l->m[nm->pos].rtyp=nm->typ;
514    l->m[nm->pos].data=idrecDataInit(nm->typ);
515    nm=nm->next;
516  }
517  return l;
518}
519
520BOOLEAN newstruct_CheckAssign(blackbox */*b*/, leftv L, leftv R)
521{
522  int lt=L->Typ();
523  int rt=R->Typ();
524  if ((lt!=DEF_CMD)&&(lt!=rt))
525  {
526    Werror("can not assign %s(%d) to member of type %s(%d)",
527            Tok2Cmdname(rt),rt,
528            Tok2Cmdname(lt),lt);
529    return TRUE;
530  }
531  return FALSE;
532}
533
534/* check internal structure:
535* BOOLEAN newstruct_Check(blackbox *b, void *d)
536{
537  newstruct_desc n=(newstruct_desc)b->data;
538  lists l=(lists)d;
539  newstruct_member nm=n->member;
540  while (nm!=NULL)
541  {
542    if ((l->m[nm->pos].rtyp!=nm->typ)
543    &&( nm->typ!=DEF_CMD))
544    {
545      Werror("type change in member %s (%s(%d) -> %s(%d))",nm->name,
546          Tok2Cmdname(nm->typ),nm->typ,
547          Tok2Cmdname(l->m[nm->pos].rtyp),l->m[nm->pos].rtyp);
548      return TRUE;
549    }
550    nm=nm->next;
551  }
552  return FALSE;
553}
554*/
555
556BOOLEAN newstruct_serialize(blackbox *b, void *d, si_link f)
557{
558  newstruct_desc dd=(newstruct_desc)b->data;
559  sleftv l;
560  memset(&l,0,sizeof(l));
561  l.rtyp=STRING_CMD;
562  l.data=(void*)getBlackboxName(dd->id);
563  f->m->Write(f, &l);
564  lists ll=(lists)d;
565  memset(&l,0,sizeof(l));
566  l.rtyp=LIST_CMD;
567  l.data=ll;
568  f->m->Write(f, &l);
569  return FALSE;
570}
571
572BOOLEAN newstruct_deserialize(blackbox **/*b*/, void **d, si_link f)
573{
574  // newstruct is serialiazed as a list,
575  // just read a list and take data,
576  // rtyp must be set correctly (to the blackbox id) by routine calling
577  // newstruct_deserialize
578  leftv l=f->m->Read(f);
579  //newstruct_desc n=(newstruct_desc)b->data;
580  //TODO: check compatibility of list l->data with description in n
581  *d=l->data;
582  return FALSE;
583}
584
585void newstruct_Print(blackbox *b,void *d)
586{
587  newstruct_desc dd=(newstruct_desc)b->data;
588  newstruct_proc p=dd->procs;
589  while((p!=NULL)&&(p->t!=PRINT_CMD))
590    p=p->next;
591  if (p!=NULL)
592  {
593    BOOLEAN sl;
594    sleftv tmp;
595    memset(&tmp,0,sizeof(tmp));
596    tmp.rtyp=dd->id;
597    tmp.data=(void*)newstruct_Copy(b,d);
598    idrec hh;
599    memset(&hh,0,sizeof(hh));
600    hh.id=Tok2Cmdname(p->t);
601    hh.typ=PROC_CMD;
602    hh.data.pinf=p->p;
603    sl=iiMake_proc(&hh,NULL,&tmp);
604    if (!sl) iiRETURNEXPR.CleanUp();
605    iiRETURNEXPR.Init();
606  }
607  else
608    blackbox_default_Print(b,d);
609}
610void newstruct_setup(const char *n, newstruct_desc d )
611{
612  blackbox *b=(blackbox*)omAlloc0(sizeof(blackbox));
613  // all undefined entries will be set to default in setBlackboxStuff
614  // the default Print is quite useful,
615  // all other are simply error messages
616  b->blackbox_destroy=newstruct_destroy;
617  b->blackbox_String=newstruct_String;
618  b->blackbox_Print=newstruct_Print;//blackbox_default_Print;
619  b->blackbox_Init=newstruct_Init;
620  b->blackbox_Copy=newstruct_Copy;
621  b->blackbox_Assign=newstruct_Assign;
622  b->blackbox_Op1=newstruct_Op1;
623  b->blackbox_Op2=newstruct_Op2;
624  //b->blackbox_Op3=blackbox_default_Op3;
625  b->blackbox_OpM=newstruct_OpM;
626  b->blackbox_CheckAssign=newstruct_CheckAssign;
627  b->blackbox_serialize=newstruct_serialize;
628  b->blackbox_deserialize=newstruct_deserialize;
629  b->data=d;
630  b->properties=1; // list_like
631  int rt=setBlackboxStuff(b,n);
632  d->id=rt;
633  //Print("create type %d (%s)\n",rt,n);
634}
635
636static newstruct_desc scanNewstructFromString(const char *s, newstruct_desc res)
637{
638  char *ss=omStrDup(s);
639  char *p=ss;
640  char *start;
641  int t;
642  char c;
643  newstruct_member elem;
644
645  idhdl save_ring=currRingHdl;
646  currRingHdl=(idhdl)1; // fake ring detection
647  loop
648  {
649    // read type:
650    while (*p==' ') p++;
651    start=p;
652    while (isalpha(*p)) p++;
653    *p='\0';
654    IsCmd(start,t);
655    if (t==0)
656    {
657      Werror("unknown type `%s`",start);
658      omFree(ss);
659      omFree(res);
660      currRingHdl=save_ring;
661      return NULL;
662    }
663    if (RingDependend(t))
664      res->size++;    // one additional field for the ring (before the data)
665    //Print("found type %s at real-pos %d",start,res->size);
666    elem=(newstruct_member)omAlloc0(sizeof(*elem));
667    // read name:
668    p++;
669    while (*p==' ') p++;
670    start=p;
671    while (isalpha(*p)) p++;
672    c=*p;
673    *p='\0';
674    elem->typ=t;
675    elem->pos=res->size;
676    if (*start=='\0') /*empty name*/
677    {
678      WerrorS("empty name for element");
679      goto error_in_newstruct_def;
680    }
681    elem->name=omStrDup(start);
682    //Print(" name:%s\n",start);
683    elem->next=res->member;
684    res->member=elem;
685    res->size++;
686
687    // next ?
688    *p=c;
689    while (*p==' ') p++;
690    if (*p!=',')
691    {
692      if (*p!='\0')
693      {
694        Werror("unknown character in newstruct:>>%s<<",p);
695        goto error_in_newstruct_def;
696      }
697      break; // end-of-list
698    }
699    p++;
700  }
701  omFree(ss);
702  currRingHdl=save_ring;
703  //Print("new type with %d elements\n",res->size);
704  return res;
705error_in_newstruct_def:
706   omFree(elem);
707   omFree(ss);
708   omFree(res);
709   currRingHdl=save_ring;
710   return NULL;
711}
712newstruct_desc newstructFromString(const char *s)
713{
714  newstruct_desc res=(newstruct_desc)omAlloc0(sizeof(*res));
715  res->size=0;
716
717  return scanNewstructFromString(s,res);
718}
719newstruct_desc newstructChildFromString(const char *parent, const char *s)
720{
721  // find parent:
722  int parent_id=0;
723  blackboxIsCmd(parent,parent_id);
724  if (parent_id<MAX_TOK)
725  {
726    Werror(">>%s< not found",parent);
727    return NULL;
728  }
729  blackbox *parent_bb=getBlackboxStuff(parent_id);
730  // check for the correct type:
731  if (parent_bb->blackbox_destroy!=newstruct_destroy)
732  {
733    Werror(">>%s< is not a user defined type",parent);
734    return NULL;
735  }
736  // setup for scanNewstructFromString:
737  newstruct_desc res=(newstruct_desc)omAlloc0(sizeof(*res));
738  newstruct_desc parent_desc=(newstruct_desc)parent_bb->data;
739  res->size=parent_desc->size;
740  res->member=parent_desc->member;
741  res->parent=parent_desc;
742
743  return scanNewstructFromString(s,res);
744}
745void newstructShow(newstruct_desc d)
746{
747  newstruct_member elem;
748  Print("id: %d\n",d->id);
749  elem=d->member;
750  while (elem!=NULL)
751  {
752    Print(">>%s<< at pos %d, type %d\n",elem->name,elem->pos,elem->typ);
753    elem=elem->next;
754  }
755}
756
757BOOLEAN newstruct_set_proc(const char *bbname,const char *func, int args,procinfov pr)
758{
759  int id=0;
760  blackboxIsCmd(bbname,id);
761  blackbox *bb=getBlackboxStuff(id);
762  newstruct_desc desc=(newstruct_desc)bb->data;
763  newstruct_proc p=(newstruct_proc)omAlloc(sizeof(*p));
764  p->next=desc->procs; desc->procs=p;
765
766  idhdl save_ring=currRingHdl;
767  currRingHdl=(idhdl)1; // fake ring detection
768
769  if(!IsCmd(func,p->t))
770  {
771    int t=0;
772    if (func[1]=='\0') p->t=func[0];
773    else if((t=iiOpsTwoChar(func))!=0)
774    {
775      p->t=t;
776    }
777    else
778    {
779      Werror(">>%s<< is not a kernel command",func);
780      currRingHdl = save_ring;
781      return TRUE;
782    }
783  }
784  p->args=args;
785  p->p=pr; pr->ref++;
786  currRingHdl = save_ring;
787  return FALSE;
788}
Note: See TracBrowser for help on using the repository browser.