+int emufs_indice_es_menor(INDICE *idx, CLAVE c1, CLAVE c2)
+{
+ char *sc1, *sc2; /* Si es IDX_STRING aca pongo los strings leidos */
+ EMUFS_REG_SIZE dummy; /* No me interesa el tamaño del string aca! */
+ int error=0, a, b;
+
+ switch (idx->tipo_dato) {
+ case IDX_FLOAT:
+ return c1.f_clave < c2.f_clave;
+ case IDX_INT:
+ return c1.i_clave < c2.i_clave;
+ case IDX_STRING:
+ error = 0;
+ sc1 = idx->emu_string->leer_registro(idx->emu_string, c1, &dummy, &error);
+ error = 0;
+ sc2 = idx->emu_string->leer_registro(idx->emu_string, c2, &dummy, &error);
+ /* Salteo el caracter que indica si la clave en temporal */
+ a = b = 0;
+ if (*sc1 == '*') a = 1;
+ if (*sc2 == '*') b = 1;
+ error = (strcmp(sc1, sc2) < 0);
+ free(sc1);
+ free(sc2);
+ return error;
+ }
+ return 0;
+}
+
+int emufs_indice_es_igual(INDICE *idx, CLAVE c1, CLAVE c2)
+{
+ char *sc1, *sc2; /* Si es IDX_STRING aca pongo los strings leidos */
+ EMUFS_REG_SIZE dummy; /* No me interesa el tamaño del string aca! */
+ int error, a, b;
+
+ switch (idx->tipo_dato) {
+ case IDX_FLOAT:
+ return c1.f_clave == c2.f_clave;
+ case IDX_INT:
+ return c1.i_clave == c2.i_clave;
+ case IDX_STRING:
+ error = 0;
+ sc1 = idx->emu_string->leer_registro(idx->emu_string, c1, &dummy, &error);
+ if (sc1 == NULL) return 0;
+ error = 0;
+ sc2 = idx->emu_string->leer_registro(idx->emu_string, c2, &dummy, &error);
+ if (sc2 == NULL) {
+ free(sc2);
+ return 0;
+ }
+ /* Salteo el caracter que indica si la clave en temporal */
+ a = b = 0;
+ if (*sc1 == '*') a=1;
+ if (*sc2 == '*') b=1;
+ error = (strcmp(sc1, sc2) == 0);
+ free(sc1);
+ free(sc2);
+ return error;
+ }
+ return 0;
+}
+
+void emufs_indice_obtener_valor_desde_clave(INDICE *idx, CLAVE k, void *dst)
+{
+ int error;
+ char *leido;
+ EMUFS_REG_SIZE dummy;
+
+ switch (idx->tipo_dato) {
+ case IDX_FLOAT:
+ (*((float *)dst)) = k.f_clave;
+ break;
+ case IDX_INT:
+ (*((int *)dst)) = k.f_clave;
+ break;
+ case IDX_STRING:
+ error = 0;
+ leido = idx->emu_string->leer_registro(idx->emu_string, k, &dummy, &error);
+ strcpy((char *)dst, leido);
+ free(leido);
+ }
+}
+
+
+void emufs_indice_borrar(INDICE *primero, CLAVE k, INDICE_DATO dato)
+{
+ INDICE *iter = primero;
+
+ while (iter) {
+ iter->borrar_entrada(iter, k, dato);
+ iter = iter->sig;
+ }
+}
+
+int emufs_indice_es_clave_nula(INDICE *idx, CLAVE k)
+{
+ char *sc1;
+ EMUFS_REG_SIZE dummy; /* No me interesa el tamaño del string aca! */
+ int error=0;
+
+ switch (idx->tipo_dato) {
+ case IDX_FLOAT:
+ return k.f_clave == -1 ;
+ case IDX_INT:
+ return k.i_clave == -1;
+ case IDX_STRING:
+ error = 0;
+ sc1 = idx->emu_string->leer_registro(idx->emu_string, k, &dummy, &error);
+ error = strlen(sc1);
+ free(sc1);
+ return error==0;
+ }
+ return 0;
+}