void Len (Token ** Pila) { Token *Operando = EntornoEjecucion_BuscaSimbolo (*Pila); if (Buzon.GetHuboError ()) return; if (NoEsString (Operando)) { BorrarTokenSiEsVariable (Operando); return; } long double ValorRetorno = (long double) strlen (Operando->GetDatoStr ()); BorrarTokenSiEsVariable (Operando); Token *TokenRetorno = ConsigueToken (ValorRetorno); if (Buzon.GetHuboError ()) return; delete Desapila (Pila); Apila (Pila, TokenRetorno); return; }
/* We do touch orig. */ void VariableVector::AlmacenaVectorInternal(char *Cadena) { int Largo = strlen (Cadena); int ActualChar = 0; for (; ActualChar < Largo && (Cadena[ActualChar] != '('); ++ActualChar); char tmp = Cadena[ActualChar]; Cadena[ActualChar] = 0; Token *t = GetPostfijo (Cadena); Cadena[ActualChar] = tmp; if (Buzon.GetHuboError ()) return; if (!t) { //Uso ilegal de la coma o cadena vacia; un error pa'l buzon Buzon.Error (ILEGAL_COMA_O_CADENA_VACIA); return; } if ((t->GetTipoAlmacenamiento () != VARIABLE) || (t->GetSig ())) { //Solo se admiten camos variables; un error pa'l buzon LiberarListaToken (t); Buzon.Error (SOLO_VARIABLES); return; } Identificador = dfd_strdup(t->GetDatoStr()); delete t; if (Cadena[ActualChar] == 0) return; // Ahora los indices... int EsCadena = 0; int IniChar = ActualChar + 1, Parent = 1; for (++ActualChar; (ActualChar < Largo) && (Parent > 0); ++ActualChar) { char &Casilla = Cadena[ActualChar]; if (Casilla == '(' && !EsCadena) ++Parent; if (Casilla == ')' && !EsCadena) --Parent; if (Casilla == '\'') EsCadena = 1 - EsCadena; if (!EsCadena && (((Casilla == ',') && (Parent == 1)) || ((Casilla == ')') && (!Parent)))) { char Temp = Casilla; Casilla = 0; t = GetPostfijo (Cadena + IniChar); Casilla = Temp; IniChar = ActualChar + 1; if (Buzon.GetHuboError ()) return; if (!t) { //Uso ilegal de la coma o cadena vacia; un error pa'l buzon Buzon.Error (ILEGAL_COMA_O_CADENA_VACIA); return; } Lista.Insertar (t); } } if (Parent) { //No se cerraron todos los parentesis abiertos; un error pa'l buzon Buzon.Error (ABIERTO_PARENTESIS_NO_CERRADO); return; } int n = Lista.GetNItems (); if (!n) { //No hay indices entre los parentesis; un error pa'l buzon Buzon.Error (NO_INDICES); return; } VectorIndices = new unsigned int[n]; if (ActualChar >= Largo) return; t = GetPostfijo (Cadena + ActualChar); if (t) // Solo se admiten campos variables; un error pa'l buzon Buzon.Error (SOLO_VARIABLES); return; }