source: git/Singular/newstruct.cc @ 16f511

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