Changeset c14b554 in tol for toltcl/generic/tolaccess.cpp


Ignore:
Timestamp:
Oct 19, 2008, 5:56:30 PM (18 years ago)
Author:
Jorge Pérez <josp.jorge@…>
Branches:
1941-docker-image-to-test, devel, master
Children:
ce06505
Parents:
6d7779d
Message:

merging from NameBlock/VMatrix branch

git-svn-id: ​https://www.tol-project.org/svn/tolp/trunk@4 be4846ae-f051-483a-831f-b64e7d08527f

File:
1 edited

Legend:

Unmodified
Added
Removed
  • toltcl/generic/tolaccess.cpp

    r6d7779d rc14b554  
    3333#include <tol/tol_blanguag.h>
    3434#include <tol/tol_bmatgra.h>
     35#include <tol/tol_bvmatgra.h>
     36#include <tol/tol_bnameblock.h>
    3537#include <tol/tol_bspfun.h>
    3638#include <tol/tol_bsetgra.h>
    … …  
    159161  Tcl_DStringInit(&dstr);
    160162  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 */
    166163  tol_result = MultyEvaluate(expr);
    167164  Tcl_DStringFree(&dstr);
    … …  
    184181  Tcl_DStringInit( &dstr );
    185182  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   
    187186    Tcl_Obj * tmp[2];
    188187    Tcl_Obj * info[2];
    … …  
    219218}
    220219
     220BSet* 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 
    221231/*
    222232 * Return the path of a set if it is a file, trigger an error in other case
    … …  
    226236int Tol_GetSetPath( Tcl_Interp * interp, Tcl_Obj * name, Tcl_Obj * obj_result )
    227237{
    228   Tcl_Obj ** items;
    229   int n;
    230   int tcl_code;
    231238  Tcl_DString uniBuffer;
    232239  const BSyntaxObject * syn;
    … …  
    239246  Tcl_DStringFree(&uniBuffer);
    240247  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);
    256249  }
    257250  if ( !syn )
    258251    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 ) {
    261254    Tcl_DString dstr;
    262255    BText path( syn->TolPath() );
    … …  
    335328   
    336329    /* IS THE OBJECT A FILE? */
    337 #ifdef ISFILE_IMPLEMENTED
    338330    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()) {
    343333      /* HAS SUBSET */
    344       ptrSet = &(((BUserSet*)so)->Contens());
     334////      ptrSet = &(((BUserSet*)so)->Contens());
     335      ptrSet = ContainerGetSet(so);
    345336      tmpCard = ptrSet->Card();
    346337      for (j=1; j<=tmpCard; ++j )
    … …  
    471462
    472463/*
    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.
    475467 *
    476468 */
    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 
     469const 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);
    488491  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 */
    500493    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)))) {
    505500      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 );
    509503  }
    510504  Tcl_DStringFree(&uniBuffer);
    … …  
    513507
    514508/*
    515  * given a tol set in syn_obj, returns its child corresponding to
    516  * the set of indexes indexes of size n.
    517  * In case of error return NULL and leave a description in obj_result
    518  *
    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
     515const BSyntaxObject * Tol_FindChild(Tcl_Interp    *interp,
     516                                    const BSyntaxObject *syn_obj,
     517                                    Tcl_Obj       **indexes, int n,
     518                                    Tcl_Obj       *obj_result)
    525519{
    526520  int tcl_code;
    527521  Tcl_DString dstr;
    528   BSet * set;
     522  BSet *container;
    529523  int idx, card;
    530524  int i;
    531525
    532526  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 */
    537539    tcl_code = Tcl_GetIntFromObj(interp,indexes[i],&idx);
    538540    if (tcl_code != TCL_OK) {
    … …  
    540542      break;
    541543    }
    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);
    556551      break;
    557552    }
     553    /* take the next object in the list */
     554    syn_obj = (*container)[idx];
    558555  }
    559556  return i == n ? syn_obj : NULL;
    560557}
    561 
    562558
    563559/*!
    564560 *  Tol_ResolveObject --
    565561 *
    566  *     Resolve a SyntaxObject given a toltcl object reference. A reference is
    567  *     {setname i1 i2 ... in} or a global name
    568  *     setname is a global set name (including a file name) or, if empty, is
    569  *     stack's console. The grammar of the object found is matched to the
    570  *     given argument grammar. If the return value is NULL the corresponding
    571  *     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
     570const BSyntaxObject * Tol_ResolveObject(Tcl_Interp *interp,
     571                                        Tcl_Obj    *obj_ref,
     572                                        Tcl_Obj    *obj_result)
    577573{
    578574  Tcl_Obj ** items;
    579575  int n;
    580576  int tcl_code;
     577  char * type;
    581578
    582579  /* look for subitem given in obj_ref */
    583580  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));
    585583    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
    589587  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        }
    606622      }
    607623    } 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;
    613644      }
    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 console
    620         if (n>2) {
    621           // there are more indexes & syn should be a Set
    622           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 grammar
    633         if (syn && match_gra && syn->Grammar()!=match_gra) {
    634           // grammar missmatch
    635           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 variable
    645     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_gra
    650       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);
    658645    }
    659646  } 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*/
    667659  return syn;
    668660}
    … …  
    676668  for (j = 1; j <= ptrSet->Card(); j++) {
    677669    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,
    680673                                      syn, indexes))) {
    681674      /* found!!! */
    … …  
    705698  ToltclPool indexes;
    706699  Tcl_DString dstr;
    707   int j, idx, is_file;
    708   char * graname = "Set";
     700  int j;
     701  char * graname, * objname;
    709702
    710703  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")) {
    714714  // global access
    715715    BGrammar * gra;
    716     graname = Tcl_GetString(objv[0]);
     716    graname = Tcl_GetString(items[0]);
    717717    gra = BGrammar::FindByName(graname);
    718718    if (!gra) {
    … …  
    722722      return TCL_ERROR;
    723723    }
    724     Tcl_UtfToExternalDString(NULL,Tcl_GetString(objv[1]),-1,&dstr);
     724    objname = Tcl_GetString(items[1]);
     725    Tcl_UtfToExternalDString(NULL,objname,-1,&dstr);
    725726    syn = gra->FINDVARIABLE(Tcl_DStringValue(&dstr));
    726727    Tcl_DStringFree(&dstr);
    727728    if (!syn) {
    728729      Tcl_AppendStringsToObj(obj_result, "\"",
    729                              Tcl_GetString(objv[1]),
     730                             Tcl_GetString(items[1]),
    730731                             "\" isn't a variable in grammar ",
    731732                             graname, NULL);
    732733      return TCL_ERROR;
    733734    }
     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    }
    734749  } else {
    735750    // member access
     751    if (!(syn=Tol_ResolveObject(interp,objv[0],obj_result))) {
     752      return TCL_ERROR;
     753    }
     754    /* here we have a valid reference */
    736755    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);
    772777    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);
    773786    return TCL_OK;
    774787  } 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,
    792790                             "internal error: syn not found in syn->Source()",
    793791                             NULL);
    794       return TCL_ERROR;
    795     }
     792    return TCL_ERROR;
    796793  }
    797794}
    … …  
    800797/*
    801798 * 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 */
    808804
    809805int Tol_IterChildren(Tcl_Interp * interp,
    … …  
    825821#define NUM_ARGS      ARG_STRUCT+1
    826822
    827   const BSyntaxObject* var_set;
     823  const BSyntaxObject* container;
    828824  Tcl_DString dstr;
    829825  Tcl_Obj * ArgIndexes;
    … …  
    832828  int n, index_length;
    833829  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 
    839861  int datac;
    840862  Tcl_Obj * datav[NUM_ARGS];
    841863  // is ok to ask for a list
    842864  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
    847878  datav[ARG_SCRIPT] = objv[1];
    848879 
    … …  
    863894    Tcl_IncrRefCount(datav[i]);
    864895 
    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 */
    870898  /* now iter over its children */
    871899 
    … …  
    873901  BText btxt;
    874902 
    875   /* used to verify if a set has subsets */
    876   BSet * ptrSet = 0;
    877   int tmpCard;
    878   int j;
    879  
     903 
    880904  for (i=1; i<=card; ++i) {
    881     syn_i = set[i];
     905    syn_i = (*set)[i];
    882906   
    883907    /* read the grammar */
    … …  
    942966    Tcl_DStringFree(&dstr);
    943967   
    944     if (syn_i->Grammar()==GraSet()) {
     968    if ((set_i=ContainerGetSet(syn_i))) {
    945969      /* update last index */
    946970      if (Tcl_IsShared(last_index)) {
    … …  
    9771001#endif
    9781002      /* verify if has subset */
    979       ptrSet = &(((BUserSet*)syn_i)->Contens());
    980       tmpCard = ptrSet->Card();
     1003      int tmpCard = set_i->Card();
     1004      int j;
    9811005      for (j=1; j<=tmpCard; ++j )
    982         if ( (*ptrSet)[j]->Grammar()==GraSet() )
     1006        if (ContainerGetSet((*set_i)[j]))
    9831007          break;
    9841008      if (Tcl_IsShared(datav[ARG_HASSUBSET])) {
    … …  
    9931017      if (Tcl_IsShared(datav[ARG_SUBTYPE])) {
    9941018        Tcl_DecrRefCount(datav[ARG_SUBTYPE]);
    995         datav[ARG_SUBTYPE] = Tcl_NewIntObj(ptrSet->SubType());
     1019        datav[ARG_SUBTYPE] = Tcl_NewIntObj(set_i->SubType());
    9961020        Tcl_IncrRefCount(datav[ARG_SUBTYPE]);
    9971021      } else
    998         Tcl_SetIntObj(datav[ARG_SUBTYPE],ptrSet->SubType());
     1022        Tcl_SetIntObj(datav[ARG_SUBTYPE],set_i->SubType());
    9991023       
    10001024      /* STRUCT INFO */
    1001       if ( ptrSet->Struct() ) {
    1002         btxt = ptrSet->Struct()->Name();
     1025      if ( set_i->Struct() ) {
     1026        btxt = set_i->Struct()->Name();
    10031027        Tcl_ExternalToUtfDString(NULL,btxt,-1,&dstr);
    10041028      }
    … …  
    10441068{
    10451069  //BGrammar * gra = NULL;
    1046   const BSyntaxObject * tol_obj = NULL;
     1070  const BSyntaxObject *tol_obj = NULL;
    10471071   
    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   
    10531090#define IT_NAME 0
    10541091#define IT_ROWS 1
    … …  
    10621099  BDat & dat = BDat::Unknown();
    10631100 
    1064   BMatrix<BDat> & mat = (BMatrix<BDat>&)(((BUserMat*)tol_obj)->Contens());
     1101  //BMatrix<BDat> & mat = (BMatrix<BDat>&)(((BUserMat*)tol_obj)->Contens());
    10651102 
    10661103  //items[IT_NAME] = Tcl_NewStringObj(tol_obj->Identify(),-1);
    10671104  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();
    10701107  items[IT_ROWS] = Tcl_NewIntObj(Rows);
    10711108  items[IT_COLS] = Tcl_NewIntObj(Cols);
    … …  
    10731110  for ( r = 0; r < Rows; ++r )
    10741111    for ( c = 0; c < Cols; ++c ) {
    1075       dat = mat(r,c);
     1112      dat = theMat(r,c);
    10761113      if (dat.IsKnown())
    10771114        subitems[r*Cols+c] = Tcl_NewDoubleObj(dat.Value());
    … …  
    10951132                        Tcl_Obj * obj_result)
    10961133{
    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()*/);
    11071138  if (!var) {
    1108     Tcl_AppendStringsToObj( obj_result, "\"",
    1109                             Tcl_GetString(ser_name),
    1110                             "\" isn't a variable in grammar Serie", NULL );
    11111139    return TCL_ERROR;
    11121140  }
    11131141
    11141142  // parse dates arguments
    1115 
    11161143 
    11171144  BDate I0, I1;
    … …  
    11541181  if ( !tms ) {
    11551182    Tcl_AppendStringsToObj(obj_result,"Serie \"",
    1156                            Tcl_GetString(ser_name),
     1183                           Tcl_GetString(objv[0]),
    11571184                           "\" does not have dating", NULL);
    11581185    return TCL_ERROR;
    … …  
    13961423  int j;
    13971424  for (j=1; j<=tmpCard; ++j )
    1398     if ( (*ptrSet)[j]->Grammar()==GraSet() )
     1425    if (ContainerGetSet((*ptrSet)[j]))
    13991426      break;
    14001427  info[3] = Tcl_NewIntObj(j<=tmpCard);
    … …  
    15541581 *
    15551582 * 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 {set i1 ... ik}
     1583 * is a list it is considered as an object reference {type ?name? i1 ... ik}
    15571584 *
    15581585 */
    … …  
    15611588                         Tcl_Obj * obj_result)
    15621589{
    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) {
    15721593    Tcl_AppendObjToObj(obj_result,Tcl_GetObjResult(interp));
    15731594    return TCL_ERROR;
    15741595  }
    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))) {
    15811599      return TCL_ERROR;
    1582     syn = Tol_FindChild(interp,syn,items+1,n-1,obj_result);
    1583     if ( !syn )
    1584       return TCL_ERROR;
     1600    }
     1601   
    15851602    if (syn->Grammar() != GraCode()) {
    15861603      Tcl_AppendStringsToObj(obj_result, "'", Tcl_GetString(gra_name),
    … …  
    15971614    for(iter=spf.begin(); iter!=spf.end(); iter++)
    15981615    {
    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));
    16011618    }
    16021619    if (QuickSort(interp,obj_result) != TCL_OK) {
    … …  
    16231640    return TCL_OK;
    16241641  }
    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);
    16281646  return TCL_ERROR;
    16291647}
    … …  
    16811699      if (opr) {
    16821700        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 name
    1689         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         */
    17061701      }
    17071702      // release the previous use of dstr
    … …  
    17261721  Tcl_DString dstr;
    17271722  int infoc;
    1728  
     1723
    17291724  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 
    17301737  BText varInfo(var->Info());
    17311738  BText varPath(var->SourcePath());
    … …  
    17381745 
    17391746  Tcl_ExternalToUtfDString(NULL,pch,-1,&dstr);
    1740   info[0] = Tcl_NewStringObj(Tcl_DStringValue(&dstr), -1);
     1747  info[2] = Tcl_NewStringObj(Tcl_DStringValue(&dstr), -1);
    17411748  Tcl_DStringFree(&dstr);
    17421749 
    17431750  /* OBJECT PATH */
    17441751  Tcl_ExternalToUtfDString(NULL,varPath,-1,&dstr);
    1745   info[1] = Tcl_NewStringObj(Tcl_DStringValue(&dstr), -1);
     1752  info[3] = Tcl_NewStringObj(Tcl_DStringValue(&dstr), -1);
    17461753  Tcl_DStringFree(&dstr);
    17471754 
    17481755  /* OBJECT DESCRIPTION */
    17491756  Tcl_ExternalToUtfDString(NULL,varDesc,-1,&dstr);
    1750   info[2] = Tcl_NewStringObj(Tcl_DStringValue(&dstr), -1);
     1757  info[4] = Tcl_NewStringObj(Tcl_DStringValue(&dstr), -1);
    17511758  Tcl_DStringFree(&dstr);
    17521759 
    17531760#ifdef ISFILE_IMPLEMENTED
    1754   info[3] = Tcl_NewIntObj(var->IsFile());
     1761  info[5] = Tcl_NewIntObj(var->IsFile());
    17551762#else
    1756   info[3] = Tcl_NewIntObj(0);
     1763  info[5] = Tcl_NewIntObj(0);
    17571764#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))) {
    17621768    /* HAS SUBSET */
    17631769    int tmpCard = ptrSet->Card();
    … …  
    17661772      if ( (*ptrSet)[j]->Grammar()==GraSet() )
    17671773        break;
    1768     info[4] = Tcl_NewIntObj(j<=tmpCard);
     1774    info[6] = Tcl_NewIntObj(j<=tmpCard);
    17691775     
    17701776    /* SUBTYPE */
    1771     info[5] = Tcl_NewIntObj( ptrSet->SubType() );
     1777    info[7] = Tcl_NewIntObj( ptrSet->SubType() );
    17721778     
    17731779    /* STRUCTURE */
    … …  
    17751781      BText btxt( ptrSet->Struct()->Name() );
    17761782      Tcl_ExternalToUtfDString(NULL,btxt,-1,&dstr);
    1777       info[6] = Tcl_NewStringObj( Tcl_DStringValue(&dstr), -1 );
     1783      info[8] = Tcl_NewStringObj( Tcl_DStringValue(&dstr), -1 );
    17781784      Tcl_DStringFree( &dstr );
    17791785    } else
    1780       info[6] = Tcl_NewStringObj( NULL, 0 );
    1781     infoc = 7;
     1786      info[8] = Tcl_NewStringObj( NULL, 0 );
     1787    infoc = 9;
    17821788  } else
    1783     infoc = 4;
     1789    infoc = 6;
    17841790 
    17851791  return infoc;
    17861792}
     1793
     1794int Tol_SetVariableInfoObj (Tcl_Obj * gra_name,
     1795                            Tcl_Obj * var_name,
     1796                            Tcl_Obj * obj_result);
    17871797
    17881798/*!
    17891799 * 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 */
     1803int Tol_SetVariablesObj (Tcl_Interp *interp, Tcl_Obj *gra_name,
     1804                         Tcl_Obj *obj_result)
     1805{
     1806  const BSyntaxObject *syn ;
     1807 
     1808  int length = 0;
    18011809  Tcl_Obj ** items;
    1802   int n;
    18031810  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) {
    18081813    Tcl_AppendObjToObj(obj_result,Tcl_GetObjResult(interp));
    18091814    return TCL_ERROR;
    18101815  }
    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))) {
    18161824      return TCL_ERROR;
    18171825    }
    1818     Tcl_DString dstr;
     1826//    Tcl_DString dstr;
    18191827    Tcl_Obj * info[9];
    18201828    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);
    18371831    Tcl_SetListObj(obj_result,infoc,info);
    18381832    return TCL_OK;
    18391833  }
    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));
    18481844    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) {
    18651849    Tcl_AppendObjToObj(obj_result,Tcl_GetObjResult(interp));
    18661850    return TCL_ERROR;
    18671851  }
    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;
    19201853}
    19211854
    … …  
    19401873
    19411874    if (var) {
    1942       Tcl_Obj * info[7];
     1875      Tcl_Obj * info[9];
    19431876      int infoc;
    19441877      infoc = SynObj2TclObj( var, info );
Note: See TracChangeset for help on using the changeset viewer.