Changeset 7d06d2f in tol


Ignore:
Timestamp:
Jun 12, 2009, 7:46:32 AM (17 years ago)
Author:
Víctor de Buen <vdebuen@…>
Branches:
1941-docker-image-to-test, devel, master
Children:
13bb6e7
Parents:
510f3f8
Message:

New function GetAddressFromObject and GetObjectFromAddress
Related #695

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

Location:
tol/btol
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • tol/btol/bgrammar/spfuninst.cpp

    r510f3f8 r7d06d2f  
    11501150}
    11511151
     1152//--------------------------------------------------------------------
     1153static BSyntaxObject* EvGetObjectFromAddress(
     1154  BGrammar* gra, const List* tre, BBool left)
     1155
     1156/*! Evaluate TOLPath expressions
     1157 */
     1158//--------------------------------------------------------------------
     1159{
     1160  static BText _name_ = "GetObjectFromAddress";
     1161  BSyntaxObject* result = NIL;
     1162  BInt nb = NumBranches(tre);
     1163  BUserText* uTxt=NULL;
     1164  if(TestNumArg(_name_, 1, nb, 1))
     1165  {
     1166    uTxt = (BUserText*)GraText()->EvaluateTree(Branch(tre,1));
     1167    BGrammar::PutLast(gra);
     1168    if(uTxt)
     1169    {
     1170      BText& address = Text(uTxt);
     1171      if(address.HasName())
     1172      {
     1173        result = BSyntaxObject::GetObjectFromAddress(address);
     1174      }
     1175    }
     1176  }
     1177  SAFE_DESTROY(uTxt,result);
     1178  result=TestResult(_name_,result,tre,NIL,BTRUE);
     1179  return(result);
     1180}
    11521181
    11531182//--------------------------------------------------------------------
    … …  
    19651994  EvTOLPath);
    19661995
     1996  AddLeftInstance("GetObjectFromAddress",
     1997  I2("(Text path)",
     1998     "(Text camino)"),
     1999  I2("Returns the TOL object specified by its internal address obtained by "
     2000     "mean of calling GetAddressFromObject.",
     2001     "Devuelve el objeto TOL especificado por su dirección interna que se "
     2002     "obtiene llamando a la función GetAddressFromObject."),
     2003  EvGetObjectFromAddress);
    19672004
    19682005  AddLeftInstance("Dating",
  • tol/btol/bgrammar/syn.cpp

    r510f3f8 r7d06d2f  
    453453  }
    454454}
     455
     456//--------------------------------------------------------------------
     457union BIntPointerMask
     458//--------------------------------------------------------------------
     459{
     460  BIntPair                    pair_;
     461  const BSyntaxObject*        obj_;
     462  const BGrammar*             gra_;
     463  const BFixedSizeMemoryBase* mhn_;
     464};
     465
     466
     467//--------------------------------------------------------------------
     468  BSyntaxObject* BSyntaxObject::GetObjectFromAddress(const BText& address)
     469//--------------------------------------------------------------------
     470{
     471  const BSyntaxObject* obj = NULL;
     472  BIntPointerMask objMask, graMask, mhnMask;
     473  int mode;
     474  int size;
     475  int pageNum;
     476  sscanf(address.String(), "%X:%X:%X:%X:%X:%X:%X:%X:%X",
     477    &objMask.pair_.r_,
     478    &objMask.pair_.c_,
     479    &graMask.pair_.r_,
     480    &graMask.pair_.c_,
     481    &mhnMask.pair_.r_,
     482    &mhnMask.pair_.c_,
     483    &mode,
     484    &size,
     485    &pageNum);
     486  if( objMask.obj_ &&
     487     (objMask.obj_->Grammar() == graMask.gra_) &&
     488     (objMask.obj_->Mode() == mode) &&
     489     (sizeof(objMask.obj_) == size) &&
     490     (objMask.obj_->GetPageNum() == pageNum)&&
     491     (objMask.obj_->GetMemHandler() == mhnMask.mhn_)&&
     492     (objMask.obj_->IsAssigned()!=0))
     493  {
     494    obj = objMask.obj_;
     495  }
     496  return((BSyntaxObject*)obj);
     497}
     498
     499//--------------------------------------------------------------------
     500  BText BSyntaxObject::GetAddressFromObject() const
     501//--------------------------------------------------------------------
     502{
     503  static char address[7*32];
     504  BIntPointerMask objMask, graMask, mhnMask;
     505  objMask.pair_.r_ = 0;
     506  objMask.pair_.c_ = 0;
     507  graMask.pair_.r_ = 0;
     508  graMask.pair_.c_ = 0;
     509  mhnMask.pair_.r_ = 0;
     510  mhnMask.pair_.c_ = 0;
     511  objMask.obj_ = this;
     512  graMask.gra_ = Grammar();
     513  mhnMask.mhn_ = GetMemHandler();
     514  int mode = Mode();
     515  int size = sizeof(this);
     516  int pageNum = GetPageNum();
     517  sprintf(address, "%X:%X:%X:%X:%X:%X:%X:%X:%X",
     518    objMask.pair_.r_,
     519    objMask.pair_.c_,
     520    graMask.pair_.r_,
     521    graMask.pair_.c_,
     522    mhnMask.pair_.r_,
     523    mhnMask.pair_.c_,
     524    mode,
     525    size,
     526    pageNum);
     527  return(BText(address));
     528}
  • tol/btol/bgrammar/tol_bsyntax.h

    r510f3f8 r7d06d2f  
    319319  #endif
    320320
     321  static BSyntaxObject* GetObjectFromAddress(const BText& address);
     322  BText GetAddressFromObject() const;
    321323
    322324#ifndef FOR_BTOLLNK
  • tol/btol/text_type/txtgra.cpp

    r510f3f8 r7d06d2f  
    10351035{
    10361036  contens_ = Arg(1)->TolPath();
     1037}
     1038
     1039//--------------------------------------------------------------------
     1040DeclareContensClass(BText, BTxtTemporary, BTxtGetAddressFromObject);
     1041DefExtOpr(1, BTxtGetAddressFromObject, "GetAddressFromObject",   1, 1, "Anything",
     1042          "(Anything var)",
     1043          I2("Returns a unique string address for a TOL variable that can "
     1044       "be used after to recover the object with GetObjectFromAddress "
     1045       "if it is still alive.",
     1046             "Devuelve una cadena de dirección única para una variable TOL "
     1047       "que puede ser utilizada posterormente para recuperar el objeto "
     1048       "con GetObjectFromAddress si aún existe."),
     1049          BOperClassify::General_);
     1050
     1051//--------------------------------------------------------------------
     1052void BTxtGetAddressFromObject::CalcContens()
     1053//--------------------------------------------------------------------
     1054{
     1055  contens_ = Arg(1)->GetAddressFromObject();
    10371056}
    10381057
Note: See TracChangeset for help on using the changeset viewer.