Changeset c14b554 in tol for toltcl/generic/tolaccess.cpp
- Timestamp:
- Oct 19, 2008, 5:56:30 PM (18 years ago)
- Branches:
- 1941-docker-image-to-test, devel, master
- Children:
- ce06505
- Parents:
- 6d7779d
- File:
-
- 1 edited
-
toltcl/generic/tolaccess.cpp (modified) (37 diffs)
Legend:
- Unmodified
- Added
- Removed
-
toltcl/generic/tolaccess.cpp
r6d7779d rc14b554 33 33 #include <tol/tol_blanguag.h> 34 34 #include <tol/tol_bmatgra.h> 35 #include <tol/tol_bvmatgra.h> 36 #include <tol/tol_bnameblock.h> 35 37 #include <tol/tol_bspfun.h> 36 38 #include <tol/tol_bsetgra.h> … … 159 161 Tcl_DStringInit(&dstr); 160 162 expr = Tcl_UtfToExternalDString(NULL,Tcl_GetString(obj_expr),-1,&dstr); 161 /*162 Std(BText("\nTol_EvalExpr ")+163 "LEVEL = "+BGrammar::Level()+ "\n"164 "BEGIN {\n"+expr+"\n} END Tol_EvalExpr\n");165 */166 163 tol_result = MultyEvaluate(expr); 167 164 Tcl_DStringFree(&dstr); … … 184 181 Tcl_DStringInit( &dstr ); 185 182 Tcl_UtfToExternalDString( NULL, Tcl_GetString(name), -1, &dstr ); 186 if ( Tcl_DStringLength( &dstr ) && (structure = FindStruct(Tcl_DStringValue(&dstr)))) { 183 if ( Tcl_DStringLength( &dstr ) && 184 (structure = FindStruct(Tcl_DStringValue(&dstr)))) { 185 187 186 Tcl_Obj * tmp[2]; 188 187 Tcl_Obj * info[2]; … … 219 218 } 220 219 220 BSet* ContainerGetSet(const BSyntaxObject *container) 221 { 222 if (container) { 223 if (container->Grammar()==GraSet()) 224 return &(((BUserSet*)container)->Contens()); 225 else if (container->Grammar()==GraNameBlock()) 226 return &(((BUserNameBlock*)container)->Contens().Set()); 227 } 228 return NULL; 229 } 230 221 231 /* 222 232 * Return the path of a set if it is a file, trigger an error in other case … … 226 236 int Tol_GetSetPath( Tcl_Interp * interp, Tcl_Obj * name, Tcl_Obj * obj_result ) 227 237 { 228 Tcl_Obj ** items;229 int n;230 int tcl_code;231 238 Tcl_DString uniBuffer; 232 239 const BSyntaxObject * syn; … … 239 246 Tcl_DStringFree(&uniBuffer); 240 247 if (!syn) { 241 /* look for subitem given in name */ 242 tcl_code = Tcl_ListObjGetElements(interp,name,&n,&items); 243 if (tcl_code != TCL_OK) { 244 Tcl_AppendObjToObj(obj_result,Tcl_GetObjResult(interp)); 245 return TCL_ERROR; 246 } 247 if ( n > 1 ) { 248 /* is a list & should be a member of a set */ 249 250 syn = Tol_FindSet( items[0], obj_result ); 251 if ( !syn ) 252 return TCL_ERROR; 253 syn = Tol_FindChild(interp,syn,items+1,n-1,obj_result); 254 }// else 255 // syn = Tol_FindSet(name,obj_result); 248 syn = Tol_ResolveObject(interp, name, obj_result); 256 249 } 257 250 if ( !syn ) 258 251 return TCL_ERROR; 259 BSet & set = ((BUserSet*)syn)->Contens();260 if ( set.SubType() >= BSet::MODFile && set.SubType() <= BSet::BMIFile ) {252 BSet *ptrSet = ContainerGetSet(syn); 253 if ( ptrSet->SubType() >= BSet::MODFile && ptrSet->SubType() <= BSet::BMIFile ) { 261 254 Tcl_DString dstr; 262 255 BText path( syn->TolPath() ); … … 335 328 336 329 /* IS THE OBJECT A FILE? */ 337 #ifdef ISFILE_IMPLEMENTED338 330 robjv[5] = Tcl_NewIntObj(so->IsFile()); 339 #else 340 robjv[5] = Tcl_NewIntObj(0); 341 #endif 342 if ( so->Grammar()==GraSet() ) { 331 //// if ( so->Grammar()==GraSet() ) { 332 if ( so->Grammar()==GraSet() || so->Grammar()==GraNameBlock()) { 343 333 /* HAS SUBSET */ 344 ptrSet = &(((BUserSet*)so)->Contens()); 334 //// ptrSet = &(((BUserSet*)so)->Contens()); 335 ptrSet = ContainerGetSet(so); 345 336 tmpCard = ptrSet->Card(); 346 337 for (j=1; j<=tmpCard; ++j ) … … 471 462 472 463 /* 473 * return the set with name obj_name, in case of error return NULL 474 * and leave a description in obj_result. Also looks for files. 464 * return the container (File, Set or NameBlock) with name obj_name, 465 * in case of error return NULL and leave a description in 466 * obj_result. 475 467 * 476 468 */ 477 const BSyntaxObject * Tol_FindSet(Tcl_Obj * obj_name, Tcl_Obj * obj_result) 478 { 479 int is_file; 480 481 return Tol_FindSet(obj_name, obj_result, is_file); 482 } 483 484 const BSyntaxObject * Tol_FindSet(Tcl_Obj * obj_name, Tcl_Obj * obj_result, int& is_file) 485 { 486 BGrammar * gra = GraSet(); 487 469 const BSyntaxObject * Tol_FindGlobalContainer(const char* Type, 470 const char* obj_name, 471 Tcl_Obj* obj_result) 472 { 473 BGrammar *gra; 474 BSyntaxObject* var; 475 Tcl_DString uniBuffer; 476 477 if (!strcmp(Type, "Set")) 478 gra = GraSet(); 479 else if (!strcmp(Type, "NameBlock")) 480 gra = GraNameBlock(); 481 else if (!strcmp(Type, "File")) 482 gra = NULL; 483 else { 484 Tcl_AppendStringsToObj(obj_result,"type '", 485 Type, 486 "' is not a container grammar", NULL ); 487 return NULL; 488 } 489 Tcl_DStringInit(&uniBuffer); 490 Tcl_UtfToExternalDString(NULL,obj_name,-1,&uniBuffer); 488 491 if (!gra) { 489 Tcl_SetStringObj( obj_result, "grammar 'Set' not found", -1); 490 return NULL; 491 } 492 Tcl_DString uniBuffer; 493 494 Tcl_DStringInit(&uniBuffer); 495 Tcl_UtfToExternalDString(NULL,Tcl_GetString(obj_name),-1,&uniBuffer); 496 BSyntaxObject* var = gra->FINDVARIABLE(Tcl_DStringValue(&uniBuffer)); 497 if (var) { 498 is_file = 0; 499 } else { 492 /* should look in Files */ 500 493 BText fname(Tcl_DStringValue(&uniBuffer)); 501 var = (BSyntaxObject*)BSetFromFile::FindCompiled(fname); 502 if (var) { 503 is_file = 1; 504 } else { 494 if (!(var=(BSyntaxObject*)BSetFromFile::FindCompiled(fname))) { 495 Tcl_AppendStringsToObj(obj_result,"file \"", 496 obj_name, 497 "\" is not included", NULL ); 498 } 499 } else if (!(var=gra->FINDVARIABLE(Tcl_DStringValue(&uniBuffer)))) { 505 500 Tcl_AppendStringsToObj(obj_result,"\"", 506 Tcl_GetString(obj_name), 507 "\" isn't a variable in grammar Set", NULL ); 508 } 501 obj_name, 502 "\" isn't a ", Type, " variable", NULL ); 509 503 } 510 504 Tcl_DStringFree(&uniBuffer); … … 513 507 514 508 /* 515 * given a tol set in syn_obj, returns its child corresponding to516 * the set of indexes indexes of size n.517 * In case of error return NULL and leave a description in obj_result518 * 519 */ 520 521 const BSyntaxObject * Tol_FindChild( Tcl_Interp *interp,522 const BSyntaxObject *syn_obj,523 Tcl_Obj **indexes, int n,524 Tcl_Obj *obj_result)509 * given a tol set, returns its child corresponding to the set of 510 * indexes indexes of size n. In case of error return NULL and leave 511 * a description in obj_result. 512 * 513 */ 514 515 const BSyntaxObject * Tol_FindChild(Tcl_Interp *interp, 516 const BSyntaxObject *syn_obj, 517 Tcl_Obj **indexes, int n, 518 Tcl_Obj *obj_result) 525 519 { 526 520 int tcl_code; 527 521 Tcl_DString dstr; 528 BSet * set;522 BSet *container; 529 523 int idx, card; 530 524 int i; 531 525 532 526 for (i=0; i<n; ++i) { 533 //set = Set(syn_obj); 534 /* ojo con este cambio */ 535 set = &(((BUserSet*)syn_obj)->Contens()); 536 card = set->Card(); 527 if (!(container = ContainerGetSet(syn_obj))) { 528 BText info(syn_obj->Info()); 529 Tcl_DStringInit(&dstr); 530 Tcl_ExternalToUtfDString(NULL,info,-1,&dstr); 531 Tcl_AppendStringsToObj(obj_result,"object \"", 532 Tcl_DStringValue(&dstr), 533 "\" is not a container", 534 NULL); 535 Tcl_DStringFree(&dstr); 536 break; 537 } 538 /* get the current object index */ 537 539 tcl_code = Tcl_GetIntFromObj(interp,indexes[i],&idx); 538 540 if (tcl_code != TCL_OK) { … … 540 542 break; 541 543 } 542 if (idx >= 1 && idx<=card) { 543 syn_obj = (*set)[idx]; 544 if (i < n - 1 && syn_obj->Grammar() != GraSet()) { 545 BText info(syn_obj->Info()); 546 Tcl_DStringInit(&dstr); 547 Tcl_ExternalToUtfDString(NULL,info,-1,&dstr); 548 Tcl_AppendStringsToObj(obj_result,"object \"", Tcl_DStringValue(&dstr),"\" at position \"", 549 Tcl_GetString(indexes[i]), "\" is not a set",NULL); 550 Tcl_DStringFree(&dstr); 551 break; 552 } 553 } else { 554 Tcl_AppendStringsToObj(obj_result,"Index out of range \"", 555 Tcl_GetString(indexes[i]), "\"",NULL); 544 card = container->Card(); 545 if (idx<1 || idx>card) { 546 Tcl_AppendStringsToObj(obj_result, 547 "index '", 548 Tcl_GetString(indexes[i]), 549 "' out of range", 550 NULL); 556 551 break; 557 552 } 553 /* take the next object in the list */ 554 syn_obj = (*container)[idx]; 558 555 } 559 556 return i == n ? syn_obj : NULL; 560 557 } 561 562 558 563 559 /*! 564 560 * Tol_ResolveObject -- 565 561 * 566 * Resolve a SyntaxObject given a toltcl object reference. A reference is567 * {setname i1 i2 ... in} or a global name568 * setname is a global set name (including a file name) or, if empty, is569 * stack's console. The grammar of the object found is matched tothe570 * given argument grammar. If the return value is NULL the corresponding571 * message is left in interp.572 */ 573 574 const BSyntaxObject * Tol_ResolveObject(Tcl_Interp * interp,575 Tcl_Obj *obj_ref,576 BGrammar * match_gra)562 * Resolve a SyntaxObject given a toltcl object reference. A 563 * reference is {TYPE ?container? i1 i2 ... in} or a global 564 * container's name of type File|Set|NameBlock|Console. When TYPE 565 * is Console then container is not given. The grammar of the 566 * object found is matched to the given argument grammar. If the 567 * return value is NULL an error message is left in interp. 568 */ 569 570 const BSyntaxObject * Tol_ResolveObject(Tcl_Interp *interp, 571 Tcl_Obj *obj_ref, 572 Tcl_Obj *obj_result) 577 573 { 578 574 Tcl_Obj ** items; 579 575 int n; 580 576 int tcl_code; 577 char * type; 581 578 582 579 /* look for subitem given in obj_ref */ 583 580 tcl_code = Tcl_ListObjGetElements(interp, obj_ref, &n, &items); 584 if (tcl_code != TCL_OK) 581 if (tcl_code != TCL_OK) { 582 Tcl_AppendObjToObj(obj_result,Tcl_GetObjResult(interp)); 585 583 return NULL; 586 587 // this Tcl_Obj is to put error messages 588 Tcl_Obj * obj_result = Tcl_NewObj();584 } 585 586 // this Tcl_Obj is to leave error messages 589 587 const BSyntaxObject * syn = NULL; 590 const char * graname = match_gra?match_gra->Name().String():""; 591 592 if (n > 1) { 593 /* is a list & should be a member of a set */ 594 if (*Tcl_GetString(items[0])) { 595 if ((syn=Tol_FindSet(items[0], obj_result))) { 596 // global set found 597 if ((syn=Tol_FindChild(interp, syn, items+1, n-1, obj_result))) 598 if (match_gra && syn->Grammar()!=match_gra) { 599 // grammar missmatch 600 Tcl_AppendStringsToObj(obj_result, "object '", 601 Tcl_GetString(obj_ref), "' ", 602 "found but does not belong to grammar ", 603 "'", graname, NULL); 604 syn = NULL; 605 } 588 589 if (n >= 2) { 590 type = Tcl_GetString(items[0]); 591 if (!strcmp(type,"Console") || !strcmp(type,"File") || 592 !strcmp(type,"Set") || !strcmp(type,"NameBlock") ) { 593 if (!strcmp(type,"Console")) { 594 // is a reference in the console, items[1] is the first index in 595 // the path, following indexes are indexes withing containers. 596 int i1; 597 if ((tcl_code = Tcl_GetIntFromObj(interp,items[1],&i1)!=TCL_OK)) { 598 Tcl_AppendObjToObj(obj_result,Tcl_GetObjResult(interp)); 599 return NULL; 600 } 601 if (!(syn=Tol_GetConsoleObject(i1))) { 602 Tcl_AppendStringsToObj(obj_result, "index ", 603 Tcl_GetString(items[1]), 604 " not found in console", NULL); 605 return NULL; 606 } 607 } else { 608 /* should be File, Set or NameBlock, it is a hierarchical container */ 609 if (!(syn=Tol_FindGlobalContainer(Tcl_GetString(items[0]), 610 Tcl_GetString(items[1]), 611 obj_result))) { 612 return NULL; 613 } 614 } 615 assert(syn); 616 if (n>2) { 617 // there are more indexes & syn should be a Container 618 if (!(syn=Tol_FindChild(interp, 619 syn, items+2, n-2, obj_result))) { 620 return NULL; 621 } 606 622 } 607 623 } else { 608 // is a reference in the console 609 int i1; 610 if ((tcl_code = Tcl_GetIntFromObj(interp,items[1],&i1)!=TCL_OK)) { 611 Tcl_DecrRefCount(obj_result); 612 return NULL; 624 if (n==2) { 625 // look global var in grammar 626 BGrammar * gra; 627 gra = BGrammar::FindByName(type); 628 if (!gra) { 629 Tcl_AppendStringsToObj(obj_result, "\"", 630 type, 631 "\" isn't a grammar", NULL); 632 return NULL; 633 } 634 Tcl_DString dstr; 635 Tcl_DStringInit(&dstr); 636 Tcl_UtfToExternalDString(NULL,Tcl_GetString(items[1]),-1,&dstr); 637 if (!(syn = gra->FINDVARIABLE(Tcl_DStringValue(&dstr)))) 638 Tcl_AppendStringsToObj(obj_result, "variable '", 639 obj_ref, "' not found in grammar '", 640 gra->Name().String(), "'", NULL); 641 Tcl_DStringFree(&dstr); 642 /* found and matched */ 643 return syn; 613 644 } 614 if (!(syn=Tol_GetConsoleObject(i1)))615 Tcl_AppendStringsToObj(obj_result, "index ",616 Tcl_GetString(items[1]),617 " not found in console", NULL);618 else {619 // first index found in console620 if (n>2) {621 // there are more indexes & syn should be a Set622 if (syn->Grammar()==GraSet())623 syn=Tol_FindChild(interp, syn, items+2, n-2, obj_result);624 else {625 Tcl_AppendStringsToObj(obj_result, "invalid object reference in console '",626 Tcl_GetString(obj_ref),627 "' first index '", Tcl_GetString(items[1]),628 "' should be a Set", NULL);629 syn = NULL;630 }631 }632 // match grammar633 if (syn && match_gra && syn->Grammar()!=match_gra) {634 // grammar missmatch635 Tcl_AppendStringsToObj(obj_result, "object '",636 Tcl_GetString(obj_ref), "' ",637 "found but does not belong to grammar ",638 "'", graname, "'", NULL);639 syn = NULL;640 }641 }642 }643 } else if (n==1) {644 // look for a global variable645 char * var_name = Tcl_GetString(items[0]);646 if (match_gra==GraSet())647 syn = Tol_FindSet(items[0], obj_result);648 else {649 // look global var in match_gra650 Tcl_DString dstr;651 Tcl_DStringInit(&dstr);652 Tcl_UtfToExternalDString(NULL,var_name,-1,&dstr);653 if (!(syn = match_gra->FINDVARIABLE(Tcl_DStringValue(&dstr))))654 Tcl_AppendStringsToObj(obj_result, "variable '",655 var_name, "' not found in grammar '",656 graname, "'", NULL);657 Tcl_DStringFree(&dstr);658 645 } 659 646 } else { 660 // n == 0 661 Tcl_AppendStringsToObj(obj_result, 662 "empty set reference in ResolveObject", 663 NULL); 664 } 665 // always set the object result & release obj_release. 666 Tcl_SetObjResult(interp, obj_result); 647 Tcl_AppendStringsToObj(obj_result, 648 "incorrect object reference in ResolveObject", 649 NULL); 650 } 651 /* if (grammar && syn && syn->Grammar()!=grammar) { 652 Tcl_AppendStringsToObj(obj_result, "grammar for object '", 653 Tcl_GetString(obj_ref), 654 "' does not match grammar '", 655 grammar->Name().String(), "'", NULL); 656 syn = NULL; 657 } 658 */ 667 659 return syn; 668 660 } … … 676 668 for (j = 1; j <= ptrSet->Card(); j++) { 677 669 so = (*ptrSet)[j]; 678 if (so == syn || (so->Grammar() == GraSet() && 679 Tol_FindSOInSet(&(((BUserSet*)so)->Contens()), 670 BSet *ptrSet; 671 if (so == syn || ((ptrSet=ContainerGetSet(so)) && 672 Tol_FindSOInSet(ptrSet, 680 673 syn, indexes))) { 681 674 /* found!!! */ … … 705 698 ToltclPool indexes; 706 699 Tcl_DString dstr; 707 int j , idx, is_file;708 char * graname = "Set";700 int j; 701 char * graname, * objname; 709 702 710 703 assert(!Tcl_IsShared(obj_result)); 711 712 //Tcl_DStringInit(&dstr); 713 if (objc == 2) { 704 tcl_code = Tcl_ListObjGetElements(interp,objv[0],&n,&items); 705 assert(tcl_code == TCL_OK); 706 if (n<2) { 707 Tcl_AppendStringsToObj(obj_result, 708 "wrong # args: should be 'tol::info", 709 " reference {grammar|container objname ?indexes?}'", 710 NULL); 711 return TCL_ERROR; 712 } 713 if (n==2 && strcmp(Tcl_GetString(items[0]),"Console")) { 714 714 // global access 715 715 BGrammar * gra; 716 graname = Tcl_GetString( objv[0]);716 graname = Tcl_GetString(items[0]); 717 717 gra = BGrammar::FindByName(graname); 718 718 if (!gra) { … … 722 722 return TCL_ERROR; 723 723 } 724 Tcl_UtfToExternalDString(NULL,Tcl_GetString(objv[1]),-1,&dstr); 724 objname = Tcl_GetString(items[1]); 725 Tcl_UtfToExternalDString(NULL,objname,-1,&dstr); 725 726 syn = gra->FINDVARIABLE(Tcl_DStringValue(&dstr)); 726 727 Tcl_DStringFree(&dstr); 727 728 if (!syn) { 728 729 Tcl_AppendStringsToObj(obj_result, "\"", 729 Tcl_GetString( objv[1]),730 Tcl_GetString(items[1]), 730 731 "\" isn't a variable in grammar ", 731 732 graname, NULL); 732 733 return TCL_ERROR; 733 734 } 735 source = syn->Source(); 736 if (!source) { 737 /* is a global variable not defined inside a file */ 738 items = (Tcl_Obj**)Tcl_Alloc(sizeof(Tcl_Obj*) * 2); 739 Tcl_ExternalToUtfDString(NULL, graname, -1, &dstr); 740 items[0] = Tcl_NewStringObj(Tcl_DStringValue(&dstr), -1); 741 Tcl_DStringFree(&dstr); 742 Tcl_ExternalToUtfDString(NULL, objname, -1, &dstr); 743 items[1] = Tcl_NewStringObj(Tcl_DStringValue(&dstr), -1); 744 Tcl_DStringFree(&dstr); 745 Tcl_SetListObj(obj_result, 2, items); 746 Tcl_Free((char*)items); 747 return TCL_OK; 748 } 734 749 } else { 735 750 // member access 751 if (!(syn=Tol_ResolveObject(interp,objv[0],obj_result))) { 752 return TCL_ERROR; 753 } 754 /* here we have a valid reference */ 736 755 tcl_code = Tcl_ListObjGetElements(interp,objv[0],&n,&items); 737 if (tcl_code != TCL_OK) { 738 Tcl_AppendObjToObj(obj_result,Tcl_GetObjResult(interp)); 739 return TCL_ERROR; 740 } 741 if (n<=1) { 742 Tcl_AppendStringsToObj(obj_result, "invalid set element reference \"", 743 Tcl_GetString(objv[0]), 744 "\" : should be a list of of the form {set_name i1 ... ik}", 745 NULL); 746 return TCL_ERROR; 747 } 748 syn = Tol_FindSet(items[0], obj_result, is_file); 749 if (!syn) 750 return TCL_ERROR; 751 if (n > 1) { 752 if (!Tol_FindChild(interp, syn, items+1, n-1, obj_result)) 753 return TCL_ERROR; 754 if (is_file) { 755 /* here we have in objv[0] the answer */ 756 Tcl_SetListObj(obj_result, n, items); 757 return TCL_OK; 758 } 759 // append the indexes in reverse order 760 761 for (j=n-1; j > 0; j--) { 762 Tcl_GetIntFromObj(interp, items[j], &idx); 763 indexes.AppendObject((void*)idx); 764 } 765 } 766 } 767 source = syn->Source(); 768 if (!source) { 769 /* is a global variable not defined inside a file */ 770 Tcl_ExternalToUtfDString(NULL, syn->Name(), -1, &dstr); 771 Tcl_AppendStringsToObj(obj_result, Tcl_DStringValue(&dstr), NULL); 756 assert(tcl_code == TCL_OK); 757 if (!strcmp(Tcl_GetString(items[0]),"File") || 758 !strcmp(Tcl_GetString(items[0]),"Console")) { 759 /* here we have in objv[0] the answer */ 760 Tcl_SetListObj(obj_result, n, items); 761 return TCL_OK; 762 } 763 source = syn->Source(); 764 if (!source) { 765 /* here we have in objv[0] the answer too */ 766 Tcl_SetListObj(obj_result, n, items); 767 return TCL_OK; 768 } 769 } 770 /* at this point variable has to be defined inside a file */ 771 assert(source); 772 ptrSet = &(((BUserSet*)source)->Contens()); 773 if (Tol_FindSOInSet(ptrSet, syn, indexes)) { 774 items = (Tcl_Obj**)Tcl_Alloc(sizeof(Tcl_Obj*) * (indexes.GetSize()+2)); 775 Tcl_ExternalToUtfDString(NULL, "File", -1, &dstr); 776 items[0] = Tcl_NewStringObj(Tcl_DStringValue(&dstr), -1); 772 777 Tcl_DStringFree(&dstr); 778 Tcl_ExternalToUtfDString(NULL, source->Name(), -1, &dstr); 779 items[1] = Tcl_NewStringObj(Tcl_DStringValue(&dstr), -1); 780 Tcl_DStringFree(&dstr); 781 int last = indexes.GetLast(); 782 for(j = last; j >= 0; j--) 783 items[last+2-j] = Tcl_NewIntObj(long(*indexes._GetObject(j))); 784 Tcl_SetListObj(obj_result, indexes.GetSize()+2, items); 785 Tcl_Free((char*)items); 773 786 return TCL_OK; 774 787 } else { 775 ptrSet = &(((BUserSet*)source)->Contens()); 776 if (Tol_FindSOInSet(ptrSet, syn, indexes)) { 777 items = (Tcl_Obj**)Tcl_Alloc(sizeof(Tcl_Obj*) * (indexes.GetSize()+1)); 778 //items = (Tcl_Obj**)malloc(sizeof(Tcl_Obj*) * (indexes.GetSize()+1)); 779 Tcl_ExternalToUtfDString(NULL, source->Name(), -1, &dstr); 780 items[0] = Tcl_NewStringObj(Tcl_DStringValue(&dstr), -1); 781 Tcl_DStringFree(&dstr); 782 int last = indexes.GetLast(); 783 for(j = last; j >= 0; j--) 784 items[last+1-j] = Tcl_NewIntObj(long(*indexes._GetObject(j))); 785 Tcl_SetListObj(obj_result, indexes.GetSize()+1, items); 786 Tcl_Free((char*)items); 787 //free(items); 788 return TCL_OK; 789 } else { 790 /* this should not happend because syn should be inside syn->source */ 791 Tcl_AppendStringsToObj(obj_result, 788 /* this should not happend because syn should be inside syn->source */ 789 Tcl_AppendStringsToObj(obj_result, 792 790 "internal error: syn not found in syn->Source()", 793 791 NULL); 794 return TCL_ERROR; 795 } 792 return TCL_ERROR; 796 793 } 797 794 } … … 800 797 /* 801 798 * Iterate over a first level's children of a given set. The set 802 * could be tolset if the indexes is empty or tolset[i1][i2]...[ik] 803 * for the given indexes {i1,i2,...,ik} 804 * 805 */ 806 807 /* OJO con la declaracion de tmpSet */ 799 * could be a container Set, File or NameBlock if the index list is 800 * empty or container[i1][i2]...[ik] for the given indexes 801 * {i1,i2,...,ik} 802 * 803 */ 808 804 809 805 int Tol_IterChildren(Tcl_Interp * interp, … … 825 821 #define NUM_ARGS ARG_STRUCT+1 826 822 827 const BSyntaxObject* var_set;823 const BSyntaxObject* container; 828 824 Tcl_DString dstr; 829 825 Tcl_Obj * ArgIndexes; … … 832 828 int n, index_length; 833 829 Tcl_Obj ** items; 834 835 if (!(var_set=Tol_ResolveObject(interp, objv[0], GraSet()))) { 836 Tcl_AppendObjToObj(obj_result,Tcl_GetObjResult(interp)); 837 return TCL_ERROR; 838 } 830 831 int length = 0; 832 833 if (Tcl_ListObjLength(interp,objv[0],&length)!=TCL_OK) { 834 Tcl_AppendObjToObj(obj_result,Tcl_GetObjResult(interp)); 835 return TCL_ERROR; 836 } 837 if (length<2) { 838 Tcl_AppendStringsToObj(obj_result, 839 "invalid object reference '", 840 Tcl_GetString(objv[0]), 841 "must be {TYPE ?name? i1 i2 ... ik}", 842 NULL); 843 return TCL_ERROR; 844 } 845 846 if (!(container=Tol_ResolveObject(interp, objv[0], obj_result))) { 847 return TCL_ERROR; 848 } 849 BSet *set = ContainerGetSet(container); 850 if (!set) { 851 Tcl_AppendStringsToObj(obj_result, 852 "object '", 853 Tcl_GetString(objv[0]), 854 "' is not a valid container ", 855 NULL); 856 return TCL_ERROR; 857 } 858 859 card = set->Card(); 860 839 861 int datac; 840 862 Tcl_Obj * datav[NUM_ARGS]; 841 863 // is ok to ask for a list 842 864 Tcl_ListObjGetElements(interp,objv[0],&n,&items); 843 if (n>1) 844 ArgIndexes = Tcl_NewListObj(n-1,items+1); 845 else 846 ArgIndexes = Tcl_NewListObj(0,NULL); 865 866 if (strcmp(Tcl_GetString(items[0]),"Console")) { 867 if (n>2) 868 ArgIndexes = Tcl_NewListObj(n-2,items+2); 869 else 870 ArgIndexes = Tcl_NewListObj(0,NULL); 871 } else { 872 if (n>1) 873 ArgIndexes = Tcl_NewListObj(n-1,items+1); 874 else 875 ArgIndexes = Tcl_NewListObj(0,NULL); 876 } 877 847 878 datav[ARG_SCRIPT] = objv[1]; 848 879 … … 863 894 Tcl_IncrRefCount(datav[i]); 864 895 865 /* var_set is a good tol set */ 866 867 BSet & set = ((BUserSet*)var_set)->Contens(); //Set(var); 868 card = set.Card(); 869 BSyntaxObject* syn_i; 896 BSyntaxObject *syn_i; 897 BSet *set_i; /* just in case syn_i be a container */ 870 898 /* now iter over its children */ 871 899 … … 873 901 BText btxt; 874 902 875 /* used to verify if a set has subsets */ 876 BSet * ptrSet = 0; 877 int tmpCard; 878 int j; 879 903 880 904 for (i=1; i<=card; ++i) { 881 syn_i = set[i];905 syn_i = (*set)[i]; 882 906 883 907 /* read the grammar */ … … 942 966 Tcl_DStringFree(&dstr); 943 967 944 if ( syn_i->Grammar()==GraSet()) {968 if ((set_i=ContainerGetSet(syn_i))) { 945 969 /* update last index */ 946 970 if (Tcl_IsShared(last_index)) { … … 977 1001 #endif 978 1002 /* verify if has subset */ 979 ptrSet = &(((BUserSet*)syn_i)->Contens());980 tmpCard = ptrSet->Card();1003 int tmpCard = set_i->Card(); 1004 int j; 981 1005 for (j=1; j<=tmpCard; ++j ) 982 if ( (*ptrSet)[j]->Grammar()==GraSet())1006 if (ContainerGetSet((*set_i)[j])) 983 1007 break; 984 1008 if (Tcl_IsShared(datav[ARG_HASSUBSET])) { … … 993 1017 if (Tcl_IsShared(datav[ARG_SUBTYPE])) { 994 1018 Tcl_DecrRefCount(datav[ARG_SUBTYPE]); 995 datav[ARG_SUBTYPE] = Tcl_NewIntObj( ptrSet->SubType());1019 datav[ARG_SUBTYPE] = Tcl_NewIntObj(set_i->SubType()); 996 1020 Tcl_IncrRefCount(datav[ARG_SUBTYPE]); 997 1021 } else 998 Tcl_SetIntObj(datav[ARG_SUBTYPE], ptrSet->SubType());1022 Tcl_SetIntObj(datav[ARG_SUBTYPE],set_i->SubType()); 999 1023 1000 1024 /* STRUCT INFO */ 1001 if ( ptrSet->Struct() ) {1002 btxt = ptrSet->Struct()->Name();1025 if ( set_i->Struct() ) { 1026 btxt = set_i->Struct()->Name(); 1003 1027 Tcl_ExternalToUtfDString(NULL,btxt,-1,&dstr); 1004 1028 } … … 1044 1068 { 1045 1069 //BGrammar * gra = NULL; 1046 const BSyntaxObject * tol_obj = NULL;1070 const BSyntaxObject *tol_obj = NULL; 1047 1071 1048 if (!(tol_obj=Tol_ResolveObject(interp, obj_name, GraMatrix()))) { 1049 Tcl_AppendObjToObj(obj_result,Tcl_GetObjResult(interp)); 1050 return TCL_ERROR; 1051 } 1052 1072 if (!(tol_obj=Tol_ResolveObject(interp, obj_name, obj_result))) { 1073 return TCL_ERROR; 1074 } 1075 1076 BMatrix<double> vmat; 1077 BMatrix<double> &theMat = vmat; 1078 1079 if (tol_obj->Grammar()==GraVMatrix()) { 1080 BVMat &V = VMat((BSyntaxObject *)tol_obj); 1081 V.GetDMat(vmat); 1082 } else if (tol_obj->Grammar()==GraMatrix()) { 1083 theMat = ((DMat&)Mat((BSyntaxObject *)tol_obj)); 1084 } else { 1085 Tcl_AppendStringsToObj( obj_result, Tcl_GetString(obj_name), 1086 " is not a valid Matrix|VMatrix object", NULL ); 1087 return TCL_ERROR; 1088 } 1089 1053 1090 #define IT_NAME 0 1054 1091 #define IT_ROWS 1 … … 1062 1099 BDat & dat = BDat::Unknown(); 1063 1100 1064 BMatrix<BDat> & mat = (BMatrix<BDat>&)(((BUserMat*)tol_obj)->Contens());1101 //BMatrix<BDat> & mat = (BMatrix<BDat>&)(((BUserMat*)tol_obj)->Contens()); 1065 1102 1066 1103 //items[IT_NAME] = Tcl_NewStringObj(tol_obj->Identify(),-1); 1067 1104 items[IT_NAME] = Tcl_NewStringObj(GetObjectName(tol_obj),-1); 1068 Rows = mat.Rows();1069 Cols = mat.Columns();1105 Rows = theMat.Rows(); 1106 Cols = theMat.Columns(); 1070 1107 items[IT_ROWS] = Tcl_NewIntObj(Rows); 1071 1108 items[IT_COLS] = Tcl_NewIntObj(Cols); … … 1073 1110 for ( r = 0; r < Rows; ++r ) 1074 1111 for ( c = 0; c < Cols; ++c ) { 1075 dat = mat(r,c);1112 dat = theMat(r,c); 1076 1113 if (dat.IsKnown()) 1077 1114 subitems[r*Cols+c] = Tcl_NewDoubleObj(dat.Value()); … … 1095 1132 Tcl_Obj * obj_result) 1096 1133 { 1097 BGrammar * gra = BGrammar::FindByName("Serie"); 1098 1099 if (!gra) { 1100 Tcl_SetStringObj( obj_result, "grammar 'Serie' not found", -1); 1101 return TCL_ERROR; 1102 } 1103 1104 Tcl_Obj * ser_name = objv[0]; 1105 1106 const BSyntaxObject* var = gra->FINDVARIABLE(Tcl_GetString(ser_name)); 1134 const BSyntaxObject* var = Tol_ResolveObject(interp, 1135 objv[0], 1136 obj_result/*, 1137 GraSerie()*/); 1107 1138 if (!var) { 1108 Tcl_AppendStringsToObj( obj_result, "\"",1109 Tcl_GetString(ser_name),1110 "\" isn't a variable in grammar Serie", NULL );1111 1139 return TCL_ERROR; 1112 1140 } 1113 1141 1114 1142 // parse dates arguments 1115 1116 1143 1117 1144 BDate I0, I1; … … 1154 1181 if ( !tms ) { 1155 1182 Tcl_AppendStringsToObj(obj_result,"Serie \"", 1156 Tcl_GetString( ser_name),1183 Tcl_GetString(objv[0]), 1157 1184 "\" does not have dating", NULL); 1158 1185 return TCL_ERROR; … … 1396 1423 int j; 1397 1424 for (j=1; j<=tmpCard; ++j ) 1398 if ( (*ptrSet)[j]->Grammar()==GraSet())1425 if (ContainerGetSet((*ptrSet)[j])) 1399 1426 break; 1400 1427 info[3] = Tcl_NewIntObj(j<=tmpCard); … … 1554 1581 * 1555 1582 * Fill in obj_result the functions defined for grammar gra_name. If gra_name 1556 * is a list it is considered as an object reference { seti1 ... ik}1583 * is a list it is considered as an object reference {type ?name? i1 ... ik} 1557 1584 * 1558 1585 */ … … 1561 1588 Tcl_Obj * obj_result) 1562 1589 { 1563 Tcl_Obj * name; 1564 Tcl_Obj ** items; 1565 int n; 1566 int tcl_code; 1567 1568 /* first try gra_name as a list */ 1569 1570 tcl_code = Tcl_ListObjGetElements(interp,gra_name,&n,&items); 1571 if (tcl_code != TCL_OK) { 1590 int length = 0; 1591 1592 if (Tcl_ListObjLength(interp,gra_name,&length)!=TCL_OK) { 1572 1593 Tcl_AppendObjToObj(obj_result,Tcl_GetObjResult(interp)); 1573 1594 return TCL_ERROR; 1574 1595 } 1575 if ( n > 1 ) { 1576 /* is a list & should be a member of a set */ 1577 1578 const BSyntaxObject * syn = Tol_FindSet( items[0], obj_result ); 1579 1580 if ( !syn ) 1596 if (length>1) { 1597 const BSyntaxObject *syn; 1598 if (!(syn=Tol_ResolveObject(interp, gra_name, obj_result))) { 1581 1599 return TCL_ERROR; 1582 syn = Tol_FindChild(interp,syn,items+1,n-1,obj_result); 1583 if ( !syn ) 1584 return TCL_ERROR; 1600 } 1601 1585 1602 if (syn->Grammar() != GraCode()) { 1586 1603 Tcl_AppendStringsToObj(obj_result, "'", Tcl_GetString(gra_name), … … 1597 1614 for(iter=spf.begin(); iter!=spf.end(); iter++) 1598 1615 { 1599 name = Tcl_NewStringObj(iter->second->Name(), -1);1600 Tcl_ListObjAppendElement(interp, obj_result, name);1616 Tcl_ListObjAppendElement(interp, obj_result, 1617 Tcl_NewStringObj(iter->second->Name(), -1)); 1601 1618 } 1602 1619 if (QuickSort(interp,obj_result) != TCL_OK) { … … 1623 1640 return TCL_OK; 1624 1641 } 1625 Tcl_AppendStringsToObj( obj_result, "\"", 1626 Tcl_GetString(gra_name), 1627 "\" isn't a grammar", NULL ); 1642 1643 Tcl_AppendStringsToObj(obj_result, "'", 1644 Tcl_GetString(gra_name), 1645 "' isn't a grammar", NULL); 1628 1646 return TCL_ERROR; 1629 1647 } … … 1681 1699 if (opr) { 1682 1700 return Tol_FillFunctionInfo(opr, obj_result); 1683 /*1684 Tcl_DString dstr_info;1685 Tcl_DStringInit(&dstr_info);1686 Tcl_DStringAppend(&dstr_info, Tcl_GetString(gra_name), -1);1687 Tcl_DStringAppend(&dstr_info, " ", -1);1688 // dstr comes with the function name1689 Tcl_DStringAppend(&dstr_info, Tcl_DStringValue(&dstr), -1);1690 Tcl_DStringFree(&dstr);1691 Tcl_ExternalToUtfDString(NULL,opr->Arguments(),-1,&dstr);1692 Tcl_DStringAppend(&dstr_info, Tcl_DStringValue(&dstr), -1);1693 Tcl_DStringFree(&dstr);1694 //Tcl_ExternalToUtfDString(NULL,opr->Info(),-1,&dstr);1695 info[0] = Tcl_NewStringObj(Tcl_DStringValue(&dstr_info), -1);1696 Tcl_DStringFree(&dstr_info);1697 Tcl_ExternalToUtfDString(NULL,opr->SourcePath(),-1,&dstr);1698 info[1] = Tcl_NewStringObj(dstr.string, -1);1699 Tcl_DStringFree(&dstr);1700 Tcl_ExternalToUtfDString(NULL,opr->Description(),-1,&dstr);1701 info[2] = Tcl_NewStringObj(dstr.string, -1);1702 Tcl_DStringFree(&dstr);1703 Tcl_SetListObj(obj_result, 3, info);1704 return TCL_OK;1705 */1706 1701 } 1707 1702 // release the previous use of dstr … … 1726 1721 Tcl_DString dstr; 1727 1722 int infoc; 1728 1723 1729 1724 Tcl_DStringInit(&dstr); 1725 1726 /* GRAMMAR */ 1727 info[0] = Tcl_NewStringObj(var->Grammar()->Name().String(), -1); 1728 1729 /* NAME */ 1730 BText synname(GetObjectName(var)); 1731 Tcl_ExternalToUtfDString(NULL,synname,-1,&dstr); 1732 info[1] = Tcl_NewStringObj(Tcl_DStringValue(&dstr), -1); 1733 Tcl_DStringFree(&dstr); 1734 1735 /* REST OF FIELDS */ 1736 1730 1737 BText varInfo(var->Info()); 1731 1738 BText varPath(var->SourcePath()); … … 1738 1745 1739 1746 Tcl_ExternalToUtfDString(NULL,pch,-1,&dstr); 1740 info[ 0] = Tcl_NewStringObj(Tcl_DStringValue(&dstr), -1);1747 info[2] = Tcl_NewStringObj(Tcl_DStringValue(&dstr), -1); 1741 1748 Tcl_DStringFree(&dstr); 1742 1749 1743 1750 /* OBJECT PATH */ 1744 1751 Tcl_ExternalToUtfDString(NULL,varPath,-1,&dstr); 1745 info[ 1] = Tcl_NewStringObj(Tcl_DStringValue(&dstr), -1);1752 info[3] = Tcl_NewStringObj(Tcl_DStringValue(&dstr), -1); 1746 1753 Tcl_DStringFree(&dstr); 1747 1754 1748 1755 /* OBJECT DESCRIPTION */ 1749 1756 Tcl_ExternalToUtfDString(NULL,varDesc,-1,&dstr); 1750 info[ 2] = Tcl_NewStringObj(Tcl_DStringValue(&dstr), -1);1757 info[4] = Tcl_NewStringObj(Tcl_DStringValue(&dstr), -1); 1751 1758 Tcl_DStringFree(&dstr); 1752 1759 1753 1760 #ifdef ISFILE_IMPLEMENTED 1754 info[ 3] = Tcl_NewIntObj(var->IsFile());1761 info[5] = Tcl_NewIntObj(var->IsFile()); 1755 1762 #else 1756 info[ 3] = Tcl_NewIntObj(0);1763 info[5] = Tcl_NewIntObj(0); 1757 1764 #endif 1758 //info[4] = Tcl_NewIntObj(var->System()); 1759 1760 if ( (var->Mode()==BOBJECTMODE) && (var->Grammar() == GraSet() )) { 1761 BSet * ptrSet = &(((BUserSet*)var)->Contens()); 1765 //info[6] = Tcl_NewIntObj(var->System()); 1766 BSet *ptrSet; 1767 if ((ptrSet=ContainerGetSet(var))) { 1762 1768 /* HAS SUBSET */ 1763 1769 int tmpCard = ptrSet->Card(); … … 1766 1772 if ( (*ptrSet)[j]->Grammar()==GraSet() ) 1767 1773 break; 1768 info[ 4] = Tcl_NewIntObj(j<=tmpCard);1774 info[6] = Tcl_NewIntObj(j<=tmpCard); 1769 1775 1770 1776 /* SUBTYPE */ 1771 info[ 5] = Tcl_NewIntObj( ptrSet->SubType() );1777 info[7] = Tcl_NewIntObj( ptrSet->SubType() ); 1772 1778 1773 1779 /* STRUCTURE */ … … 1775 1781 BText btxt( ptrSet->Struct()->Name() ); 1776 1782 Tcl_ExternalToUtfDString(NULL,btxt,-1,&dstr); 1777 info[ 6] = Tcl_NewStringObj( Tcl_DStringValue(&dstr), -1 );1783 info[8] = Tcl_NewStringObj( Tcl_DStringValue(&dstr), -1 ); 1778 1784 Tcl_DStringFree( &dstr ); 1779 1785 } else 1780 info[ 6] = Tcl_NewStringObj( NULL, 0 );1781 infoc = 7;1786 info[8] = Tcl_NewStringObj( NULL, 0 ); 1787 infoc = 9; 1782 1788 } else 1783 infoc = 4;1789 infoc = 6; 1784 1790 1785 1791 return infoc; 1786 1792 } 1793 1794 int Tol_SetVariableInfoObj (Tcl_Obj * gra_name, 1795 Tcl_Obj * var_name, 1796 Tcl_Obj * obj_result); 1787 1797 1788 1798 /*! 1789 1799 * Fill in obj_result the variables defined for grammar gra_name. 1790 * Or the element set info if gra_name is a reference of an element 1791 * of a global set. 1792 */ 1793 int Tol_SetVariablesObj (Tcl_Interp * interp, Tcl_Obj * gra_name, 1794 Tcl_Obj * obj_result) 1795 { 1796 BGrammar * gra; 1797 /* verificar primero si gra_name es la referencia a un item de un 1798 * conjunto, esto es [llength $gra_name] > 1 1799 */ 1800 1800 * Or the element info if gra_name is a reference of an element 1801 * of a global container. 1802 */ 1803 int Tol_SetVariablesObj (Tcl_Interp *interp, Tcl_Obj *gra_name, 1804 Tcl_Obj *obj_result) 1805 { 1806 const BSyntaxObject *syn ; 1807 1808 int length = 0; 1801 1809 Tcl_Obj ** items; 1802 int n;1803 1810 int tcl_code; 1804 1805 /* look for subset given in objv[1]*/ 1806 tcl_code = Tcl_ListObjGetElements(interp,gra_name,&n,&items); 1807 if (tcl_code != TCL_OK) { 1811 1812 if (Tcl_ListObjLength(interp,gra_name,&length)!=TCL_OK) { 1808 1813 Tcl_AppendObjToObj(obj_result,Tcl_GetObjResult(interp)); 1809 1814 return TCL_ERROR; 1810 1815 } 1811 if ( n > 1 ) { 1812 const BSyntaxObject * syn; 1813 1814 if (!(syn=Tol_ResolveObject(interp, gra_name, NULL))) { 1815 Tcl_AppendObjToObj(obj_result,Tcl_GetObjResult(interp)); 1816 if (length!=1) { 1817 if (length == 2) { 1818 tcl_code = Tcl_ListObjGetElements(interp,gra_name,&length,&items); 1819 assert(tcl_code == TCL_OK); 1820 if (strcmp(Tcl_GetString(items[0]),"Console")) 1821 return Tol_SetVariableInfoObj(items[0], items[1], obj_result); 1822 } 1823 if (!(syn=Tol_ResolveObject(interp, gra_name, obj_result))) { 1816 1824 return TCL_ERROR; 1817 1825 } 1818 Tcl_DString dstr;1826 // Tcl_DString dstr; 1819 1827 Tcl_Obj * info[9]; 1820 1828 int infoc; 1821 1822 BText grname(syn->Grammar()->Name()); 1823 //BText synname(syn->Identify()); 1824 BText synname(GetObjectName(syn)); 1825 1826 /* GRAMMAR */ 1827 info[0] = Tcl_NewStringObj(grname, -1); 1828 1829 /* NAME */ 1830 Tcl_DStringInit(&dstr); 1831 Tcl_ExternalToUtfDString(NULL,synname,-1,&dstr); 1832 info[1] = Tcl_NewStringObj(Tcl_DStringValue(&dstr), -1); 1833 Tcl_DStringFree(&dstr); 1834 1835 /* REST OF FIELDS */ 1836 infoc = SynObj2TclObj( syn, info+2 ) + 2; 1829 1830 infoc = SynObj2TclObj(syn, info); 1837 1831 Tcl_SetListObj(obj_result,infoc,info); 1838 1832 return TCL_OK; 1839 1833 } 1840 gra = BGrammar::FindByName(Tcl_GetString(gra_name)); 1841 if (gra) { 1842 BList * lstVar = gra->GetVariables(); 1843 if (BList2TclList(interp,lstVar,obj_result,&GetIdentify) != TCL_OK) { 1844 Tcl_AppendObjToObj(obj_result,Tcl_GetObjResult(interp)); 1845 DESTROY(lstVar); 1846 return TCL_ERROR; 1847 } 1834 BGrammar *gra = BGrammar::FindByName(Tcl_GetString(gra_name)); 1835 if (!gra) { 1836 Tcl_AppendStringsToObj( obj_result, "'", 1837 Tcl_GetString(gra_name), 1838 "' isn't a grammar", NULL ); 1839 return TCL_ERROR; 1840 } 1841 BList * lstVar = gra->GetVariables(); 1842 if (BList2TclList(interp,lstVar,obj_result,&GetIdentify) != TCL_OK) { 1843 Tcl_AppendObjToObj(obj_result,Tcl_GetObjResult(interp)); 1848 1844 DESTROY(lstVar); 1849 if (QuickSort(interp,obj_result) != TCL_OK) { 1850 Tcl_AppendObjToObj(obj_result,Tcl_GetObjResult(interp)); 1851 return TCL_ERROR; 1852 } 1853 return TCL_OK; 1854 } 1855 Tcl_AppendStringsToObj( obj_result, "\"", 1856 Tcl_GetString(gra_name), 1857 "\" isn't a grammar", NULL ); 1858 return TCL_ERROR; 1859 1860 // The code below is death!!!!! 1861 1862 /* look for subset given in objv[1]*/ 1863 tcl_code = Tcl_ListObjGetElements(interp,gra_name,&n,&items); 1864 if (tcl_code != TCL_OK) { 1845 return TCL_ERROR; 1846 } 1847 DESTROY(lstVar); 1848 if (QuickSort(interp,obj_result) != TCL_OK) { 1865 1849 Tcl_AppendObjToObj(obj_result,Tcl_GetObjResult(interp)); 1866 1850 return TCL_ERROR; 1867 1851 } 1868 if ( n > 1 ) { 1869 /* is a list & should be a member of a set */ 1870 1871 const BSyntaxObject * syn = Tol_FindSet( items[0], obj_result ); 1872 Tcl_DString dstr; 1873 1874 if ( !syn ) 1875 return TCL_ERROR; 1876 syn = Tol_FindChild(interp,syn,items+1,n-1,obj_result); 1877 if ( !syn ) 1878 return TCL_ERROR; 1879 Tcl_Obj * info[9]; 1880 int infoc; 1881 BText grname(syn->Grammar()->Name()); 1882 //BText synname(syn->Identify()); 1883 BText synname(GetObjectName(syn)); 1884 1885 /* GRAMMAR */ 1886 Tcl_ExternalToUtfDString(NULL,grname,-1,&dstr); 1887 info[0] = Tcl_NewStringObj(Tcl_DStringValue(&dstr), -1); 1888 Tcl_DStringFree(&dstr); 1889 1890 /* NAME */ 1891 1892 Tcl_ExternalToUtfDString(NULL,synname,-1,&dstr); 1893 info[1] = Tcl_NewStringObj(Tcl_DStringValue(&dstr), -1); 1894 Tcl_DStringFree(&dstr); 1895 1896 /* REST OF FIELDS */ 1897 infoc = SynObj2TclObj( syn, info+2 ) + 2; 1898 Tcl_SetListObj(obj_result,infoc,info); 1899 return TCL_OK; 1900 } 1901 gra = BGrammar::FindByName(Tcl_GetString(gra_name)); 1902 if (gra) { 1903 BList * lstVar = gra->GetVariables(); 1904 if (BList2TclList(interp,lstVar,obj_result,&GetIdentify) != TCL_OK) { 1905 Tcl_AppendObjToObj(obj_result,Tcl_GetObjResult(interp)); 1906 DESTROY(lstVar); 1907 return TCL_ERROR; 1908 } 1909 DESTROY(lstVar); 1910 if (QuickSort(interp,obj_result) != TCL_OK) { 1911 Tcl_AppendObjToObj(obj_result,Tcl_GetObjResult(interp)); 1912 return TCL_ERROR; 1913 } 1914 return TCL_OK; 1915 } 1916 Tcl_AppendStringsToObj( obj_result, "\"", 1917 Tcl_GetString(gra_name), 1918 "\" isn't a grammar", NULL ); 1919 return TCL_ERROR; 1852 return TCL_OK; 1920 1853 } 1921 1854 … … 1940 1873 1941 1874 if (var) { 1942 Tcl_Obj * info[ 7];1875 Tcl_Obj * info[9]; 1943 1876 int infoc; 1944 1877 infoc = SynObj2TclObj( var, info );
Note: See TracChangeset
for help on using the changeset viewer.
