]> git.llucax.com Git - z.facultad/75.52/treemulator.git/blobdiff - src/clave_variable.cpp
Agrego ToRaw a las claves.
[z.facultad/75.52/treemulator.git] / src / clave_variable.cpp
index c4fd1f1dc220272935caddb9a050734e269ace03..48a42a60b5d8cddd6f9ade59fc0873f00ca622ef 100644 (file)
@@ -19,11 +19,12 @@ ClaveVariable::ClaveVariable (uchar *n)
        str[len] = '\0';
        data = std::string ((const char *)(str));
        delete [] str;
        str[len] = '\0';
        data = std::string ((const char *)(str));
        delete [] str;
+       raw_data = data;
 }
 
 uint ClaveVariable::Size () const
 {
 }
 
 uint ClaveVariable::Size () const
 {
-       return data.size ()+sizeof (uint);
+       return data.size ()*sizeof (uchar)+sizeof (uint);
 }
 
 uchar *ClaveVariable::ToArray () const
 }
 
 uchar *ClaveVariable::ToArray () const
@@ -32,7 +33,7 @@ uchar *ClaveVariable::ToArray () const
        uint len = data.size ();
        out = new uchar[Size ()];
        memcpy (out, &len, sizeof (uint));
        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;
 }
 
        return out;
 }
 
@@ -52,3 +53,74 @@ bool ClaveVariable::operator == (const Clave &c) const
        return data == ((ClaveVariable&)c).data;
 }
 
        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;
+}
+