X-Git-Url: https://git.llucax.com/z.facultad/75.52/treemulator.git/blobdiff_plain/2ab8041933e77875de62bc73e76febc528af258e..98e331147474997778f92d14b794a94f1dc3bedb:/src/clave_variable.cpp?ds=inline diff --git a/src/clave_variable.cpp b/src/clave_variable.cpp index 6534764..48a42a6 100644 --- a/src/clave_variable.cpp +++ b/src/clave_variable.cpp @@ -18,13 +18,13 @@ ClaveVariable::ClaveVariable (uchar *n) memcpy (str, n, sizeof (uchar)*len); str[len] = '\0'; data = std::string ((const char *)(str)); - std::cout << "CREE : " << data << std::endl; delete [] str; + raw_data = data; } uint ClaveVariable::Size () const { - return data.size ()+sizeof (uint); + return data.size ()*sizeof (uchar)+sizeof (uint); } uchar *ClaveVariable::ToArray () const @@ -33,7 +33,7 @@ uchar *ClaveVariable::ToArray () const uint len = data.size (); out = new uchar[Size ()]; memcpy (out, &len, sizeof (uint)); - memcpy (out+sizeof(uint), data.c_str (), data.size ()); + memcpy (out+sizeof(uint), data.c_str (), data.size ()*sizeof (uchar)); return out; } @@ -53,3 +53,74 @@ bool ClaveVariable::operator == (const Clave &c) const return data == ((ClaveVariable&)c).data; } +bool ClaveVariable::Abrev (ClaveVariable *c) +{ + if (c == NULL) return false; + int iguales = 0; + std::string resto; + + resto = abreviar (c->data, data, iguales); + + /* No hago nada si solo machea un caracter */ + if (iguales < 2) return false; + + std::stringstream ss; + ss << iguales; + ss << "|"; + ss << resto; + data = ss.str (); + + return true; +} + +bool ClaveVariable::DesAbrev (ClaveVariable *c) +{ + if (c == NULL) return false; + + int pos = data.find ("|"); + + /* No esta abreviada! */ + if (pos <= 0) return false; + + std::string siguales = data.substr (0, pos); + int iguales = atoi (siguales.c_str ()); + + std::string primera_parte = c->data.substr (0, iguales); + std::string segunda_parte = data.substr (pos+1, data.size () - pos - 1); + + data = primera_parte + segunda_parte; + + return true; +} + +std::string ClaveVariable::abreviar(std::string &p, std::string &a, int &iguales) +{ + char *primera = (char *)p.c_str (); + char *actual = (char *)a.c_str (); + + iguales = 0; + while (((*primera) != '\0') && ((*actual) != '\0')) { + if ((*primera) == (*actual)) { + primera++; + actual++; + iguales++; + } else { + /* No coinciden mas! */ + break; + } + } + + return std::string (actual); +} + +uchar *ClaveVariable::ToRaw (uint &size) const +{ + uchar *out; + size = raw_data.size ()*sizeof (uchar)+sizeof (uint); + uint len = raw_data.size (); + out = new uchar[size]; + memcpy (out, &len, sizeof (uint)); + memcpy (out+sizeof(uint), raw_data.c_str (), raw_data.size ()*sizeof (uchar)); + return out; +} +