]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs/idx.c
Fixed mezcla de data types utilizando los nuevos tipos definidos por Luca - by Bugo
[z.facultad/75.06/emufs.git] / emufs / idx.c
1 /* vim: set noexpandtab tabstop=4 shiftwidth=4:
2  *----------------------------------------------------------------------------
3  *                                  emufs
4  *----------------------------------------------------------------------------
5  * This file is part of emufs.
6  *
7  * emufs is free software; you can redistribute it and/or modify it under the
8  * terms of the GNU General Public License as published by the Free Software
9  * Foundation; either version 2 of the License, or (at your option) any later
10  * version.
11  *
12  * emufs is distributed in the hope that it will be useful, but WITHOUT ANY
13  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
15  * details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with emufs; if not, write to the Free Software Foundation, Inc., 59 Temple
19  * Place, Suite 330, Boston, MA  02111-1307  USA
20  *----------------------------------------------------------------------------
21  * Creado:  jue abr  8 18:10:35 ART 2004
22  * Autores: Nicolás Dimov <sagardua@uolsinectis.com.ar>
23  *          Leandro Lucarella <llucare@fi.uba.ar>
24  *----------------------------------------------------------------------------
25  *
26  * $Id$
27  *
28  */
29
30 /** \file
31  *
32  * Manejo de archivos de índice de registros.
33  * 
34  * Implementación del manejo de archivos de índice de registros.
35  *
36  */
37
38 #include "idx.h"
39 #include <stdlib.h>
40 #include <strings.h>
41 #include <unistd.h>
42
43 FILE* emufs_idx_abrir(EMUFS* efs, const char* mode)
44 {
45         FILE* f;
46         char* filename;
47
48         filename = (char*) malloc(sizeof(char) * (strlen(efs->nombre)
49                                 + strlen(EMUFS_IDX_EXT) + 1));
50         if (filename == NULL) {
51                 /* TODO Manejo de errores */
52                 return NULL;
53         }
54         strcpy(filename, efs->nombre);
55         strcat(filename, EMUFS_IDX_EXT);
56         f = fopen(filename, mode);
57         free(filename);
58         return f;
59 }
60
61 int emufs_idx_crear(EMUFS *efs)
62 {
63         return emufs_crear_archivo_auxiliar(efs->nombre, EMUFS_IDX_EXT);
64 }
65
66 EMUFS_REG_ID emufs_idx_buscar_mayor_id(EMUFS *emu)
67 {
68         int id, max = -1;
69         FILE *f_idx;    
70         EMUFS_IDX reg;
71         char name_f_idx[255]; /* TODO usar malloc para no limitar el tamaño de nombre de archivo */
72
73         strcpy(name_f_idx,emu->nombre);
74         strcat(name_f_idx, EMUFS_IDX_EXT);
75
76         if ( (f_idx = fopen(name_f_idx,"r")) == NULL) return -1; /*ERROR*/
77         id = -1;
78         while ( !feof(f_idx) ){
79                 /* Me aseguro de leer la cantidad de bytes correcta */
80                 if (fread(&reg,sizeof(EMUFS_IDX),1,f_idx) != 1) continue;
81                 if ( reg.id_reg >= max ) 
82                         max = reg.id_reg;
83         }
84         id = max+1;
85         fclose(f_idx);
86
87         return id;      
88 }
89
90 /*busca el registro ID en el archivo ".idx" y devuelve el nro de bloque en el que se encuentra*/
91 EMUFS_BLOCK_ID emufs_idx_buscar_registro(EMUFS *emu, EMUFS_REG_ID ID)
92 {
93         FILE* f_idx;
94         EMUFS_IDX reg;
95         char name_f_idx[255];
96         strcpy(name_f_idx,emu->nombre);
97         strcat(name_f_idx, EMUFS_IDX_EXT);
98         
99         if ( (f_idx = fopen(name_f_idx,"r")) == NULL) return -1; /*ERROR*/
100         reg.id_reg = -1;
101         reg.block = -1;
102         while ( !feof(f_idx) ){
103                 if (fread(&reg,sizeof(EMUFS_IDX),1,f_idx) != 1) continue;
104                 if ( reg.id_reg == ID ){
105                         break;
106                 }
107         }
108         
109         fclose(f_idx);
110         return reg.block;
111 }
112
113 /* agrega un registro al final del archivo */
114 int emufs_idx_agregar(EMUFS *emu, EMUFS_BLOCK_ID num_bloque, EMUFS_REG_ID id)
115 {
116         FILE *f_idx;
117         EMUFS_IDX reg;
118         char name_f_idx[255];
119         
120         strcpy(name_f_idx,emu->nombre);
121         strcat(name_f_idx, EMUFS_IDX_EXT);
122
123         if ( (f_idx = fopen(name_f_idx,"a+"))==NULL ) return -1;
124                 
125         reg.block = num_bloque;
126         reg.id_reg = id;
127         fwrite(&reg,sizeof(EMUFS_IDX),1,f_idx); 
128         fclose(f_idx);
129         return 0;
130 }
131
132 int emufs_idx_borrar(EMUFS *emu, EMUFS_REG_ID ID)
133 {
134         FILE *f_idx;
135         EMUFS_IDX reg, buffer;
136         char name_f_idx[255];
137         long actual, final, cant, i, tam;
138         
139         strcpy(name_f_idx,emu->nombre);
140         strcat(name_f_idx, EMUFS_IDX_EXT);
141
142         if ( (f_idx = fopen(name_f_idx,"a+"))==NULL ) return -1;
143         
144         while ( !feof(f_idx) ){
145                 /*busco cual tengo que borrar*/
146                 if ( fread(&reg, sizeof(EMUFS_IDX), 1, f_idx) != 1 ) continue;
147                 if ( reg.id_reg == ID )
148                         break;
149         }
150         
151         /* me paro en el que tengo que borrar */
152         actual = fseek(f_idx, -sizeof(EMUFS_IDX), SEEK_CUR);
153         /*actual = ftell(f_idx); /* Guardo la posicion actual */
154         printf("ACTUAL = %ld\n", actual/sizeof(EMUFS_IDX));
155         fseek(f_idx, 0, SEEK_END); /* me voy al final */
156         final = ftell(f_idx); /* veo cuando ocupa el archivo */
157         printf("tamanio del archivo de bloques y registros = %ld\n", final/sizeof(EMUFS_IDX));
158         fseek(f_idx, actual, SEEK_SET); /* vuelvo al lugar desde donde quiero justificar */
159         
160         cant = (final-actual)/sizeof(EMUFS_IDX);
161         printf("cant = %ld\n", cant);
162         for(i=0; i<cant-1; i++) {
163                    /* Calculo donde empieza el proximo elemento a mover */
164                    final = actual+sizeof(EMUFS_IDX); printf("final = %ld actual =  %ld\n", final/sizeof(EMUFS_IDX), actual/sizeof(EMUFS_IDX));
165                    /* Me paro en ese lugar */
166                    fseek(f_idx, final, SEEK_SET);
167                    /* y lo leo */
168                    fread(&buffer, sizeof(EMUFS_IDX), 1, f_idx);
169                    /* Ahora me paro en la nueva posicion de este item */
170                    fseek(f_idx, actual, SEEK_SET);
171                    /* y lo guardo */
172                    fwrite(&buffer, sizeof(EMUFS_IDX), 1, f_idx);
173                    /* Ahora el proximo item va en la posicion siguiente */
174                    actual += sizeof(EMUFS_IDX);printf("actual = %ld\n", actual/sizeof(EMUFS_IDX));
175         }
176         fseek (f_idx,0,SEEK_END);
177         tam = ftell(f_idx);
178         printf("tamanio del archivo de bloques y registros = %ld\n", tam/sizeof(EMUFS_IDX) - 1);
179         fclose(f_idx);
180         truncate(name_f_idx, tam - sizeof(EMUFS_IDX));
181         return 0;
182 }