Changeset 188de86 in git for Singular/newstruct.cc
- Timestamp:
- Aug 2, 2012, 4:09:13 PM (12 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- 4f9652847609cefd5ff3b91d14f34611592ab699
- Parents:
- 0419aba8292e7109329604d8ad03b70f8ef6542344a1c2199e33375a631289eaab7a81954c8383e2
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/newstruct.cc
r0419ab r188de86 39 39 }; 40 40 41 int newstruct_desc_size() 42 { 43 return sizeof(newstruct_desc_s); 44 } 41 45 42 46 char * newstruct_String(blackbox *b, void *d) … … 46 50 { 47 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 leftv 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->Typ() == STRING_CMD) 73 { 74 char *res = omStrDup((char*)sl->Data()); 75 sl->CleanUp(); 76 return res; 77 } 78 else 79 sl->CleanUp(); 80 } 81 48 82 lists l=(lists)d; 49 83 newstruct_member a=ad->member; … … 130 164 } 131 165 166 // Used by newstruct_Assign for overloaded '=' 167 BOOLEAN 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 idrec hh; 179 memset(&hh,0,sizeof(hh)); 180 hh.id=Tok2Cmdname(p->t); 181 hh.typ=PROC_CMD; 182 hh.data.pinf=p->p; 183 sleftv tmp; 184 memset(&tmp,0,sizeof(sleftv)); 185 tmp.Copy(r); 186 leftv sl = iiMake_proc(&hh, NULL, &tmp); 187 if (sl != NULL) 188 { 189 if (sl->Typ() == op) { l->Copy(sl); return FALSE;} 190 else sl->CleanUp(); 191 } 192 } 193 return TRUE; 194 } 195 132 196 BOOLEAN newstruct_Assign(leftv l, leftv r) 133 197 { … … 138 202 { 139 203 newstruct_desc rrn=(newstruct_desc)rr->data; 204 205 if (!rrn) 206 { 207 Werror("custom type %s(%d) cannot be assigned to newstruct %s(%d)", 208 Tok2Cmdname(r->Typ()), r->Typ(), Tok2Cmdname(l->Typ()), l->Typ()); 209 return TRUE; 210 } 211 140 212 newstruct_desc rrp=rrn->parent; 141 213 while ((rrp!=NULL)&&(rrp->id!=l->Typ())) rrp=rrp->parent; … … 151 223 } 152 224 } 225 else // unrelated types - look for custom conversion 226 { 227 sleftv tmp; 228 BOOLEAN newstruct_Op1(int, leftv, leftv); // forward declaration 229 if (! newstruct_Op1(l->Typ(), &tmp, r)) return newstruct_Assign(l, &tmp); 230 } 153 231 } 154 232 if (l->Typ()==r->Typ()) … … 172 250 } 173 251 } 252 253 else if(l->Typ() > MAX_TOK) 254 { 255 assume(l->Typ() > MAX_TOK); 256 sleftv tmp; 257 if(!newstruct_equal(l->Typ(), &tmp, r)) return newstruct_Assign(l, &tmp); 258 } 174 259 Werror("assign %s(%d) = %s(%d)", 175 260 Tok2Cmdname(l->Typ()),l->Typ(),Tok2Cmdname(r->Typ()),r->Typ()); 176 261 return TRUE; 177 262 } 263 264 BOOLEAN newstruct_Op1(int op, leftv res, leftv arg) 265 { 266 // interpreter: arg is newstruct 267 blackbox *a=getBlackboxStuff(arg->Typ()); 268 newstruct_desc nt=(newstruct_desc)a->data; 269 newstruct_proc p=nt->procs; 270 271 while((p!=NULL) &&( (p->t!=op) || (p->args!=1) )) p=p->next; 272 273 if (p!=NULL) 274 { 275 leftv sl; 276 sleftv tmp; 277 memset(&tmp,0,sizeof(sleftv)); 278 tmp.Copy(arg); 279 idrec hh; 280 memset(&hh,0,sizeof(hh)); 281 hh.id=Tok2Cmdname(p->t); 282 hh.typ=PROC_CMD; 283 hh.data.pinf=p->p; 284 sl=iiMake_proc(&hh,NULL,&tmp); 285 if (sl==NULL) return TRUE; 286 else 287 { 288 res->Copy(sl); 289 return FALSE; 290 } 291 } 292 return blackboxDefaultOp1(op,res,arg); 293 } 294 295 178 296 179 297 BOOLEAN newstruct_Op2(int op, leftv res, leftv a1, leftv a2) … … 280 398 } 281 399 newstruct_proc p=nt->procs; 282 while((p!=NULL) && (p->t=op)&&(p->args!=2)) p=p->next;400 while((p!=NULL) && ( (p->t!=op) || (p->args!=2) )) p=p->next; 283 401 if (p!=NULL) 284 402 { … … 323 441 } 324 442 newstruct_proc p=nt->procs; 325 while((p!=NULL) &&(p->t=op)&&(p->args!=4)) p=p->next; 443 444 while((p!=NULL) &&( (p->t!=op) || (p->args!=4) )) p=p->next; 445 326 446 if (p!=NULL) 327 447 { … … 474 594 b->blackbox_Copy=newstruct_Copy; 475 595 b->blackbox_Assign=newstruct_Assign; 476 //b->blackbox_Op1=blackboxDefaultOp1;596 b->blackbox_Op1=newstruct_Op1; 477 597 b->blackbox_Op2=newstruct_Op2; 478 598 //b->blackbox_Op3=blackbox_default_Op3; … … 617 737 newstruct_proc p=(newstruct_proc)omAlloc(sizeof(*p)); 618 738 p->next=desc->procs; desc->procs=p; 739 740 idhdl save_ring=currRingHdl; 741 currRingHdl=(idhdl)1; // fake ring detection 742 619 743 if(!IsCmd(func,p->t)) 620 744 { … … 628 752 { 629 753 Werror(">>%s<< is not a kernel command",func); 754 currRingHdl = save_ring; 630 755 return TRUE; 631 756 } … … 633 758 p->args=args; 634 759 p->p=pr; pr->ref++; 760 currRingHdl = save_ring; 635 761 return FALSE; 636 762 }
Note: See TracChangeset
for help on using the changeset viewer.