]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - tipo3/param_cte.c
-Cambie un poco la interfaz que hizo Rich, para que me quede mas comodo, asi que...
[z.facultad/75.06/emufs.git] / tipo3 / param_cte.c
1 /* archivo con bloques parametrizados y registro constante */
2
3 #include "param_cte.h"
4 FILE* f_block_reg;
5 FILE* f_block_free;
6 FILE* f_reg_exist;
7
8
9 /** Leo un registro del archivo, devuelve cero si no lo encuentra.**/
10 int leer_registro(EMUFS *emu, int ID, void *ptr, unsigned long tam_reg)
11 {
12         char* bloque = (char*)malloc(emu->tam_bloque);
13         char name_f_block_reg[255];
14         int block, ID_aux, a, b, c, d;
15         int iterador = 0;
16         strcpy(name_f_block_reg,emu->nombre);
17         strcat(name_f_block_reg,"bloc_reg.tipo3");
18
19         /* tengo que crear los archivos de indice antes de usarlos!!!!!!!!!*/
20         if ( (f_block_reg = fopen(name_f_block_reg,"a+")) == NULL ){
21                 free(bloque);
22                 return -1; /*ERROR*/
23         }
24         
25
26         /* si el registro no existe, retorno*/
27         if ( existe_registro(emu,ID) == -1 ){
28                 free(bloque);
29                 return -1;
30         }
31         /*si existe, lo busco en el archivo de bloques*/
32         
33         block = buscar_registro(emu,ID); /*me devuelve el nro de bloque al que pertenece el registro*/
34         if (leer_bloque(emu, block, bloque)==-1){
35                 free(bloque);
36                 return -1; /*No se pudo leer el bloque*/
37         }
38         
39         while ( iterador != emu->tam_bloque ){ 
40                 a = bloque[0+iterador];
41                 b = bloque[1+iterador];
42                 c = bloque[2+iterador];
43                 d = bloque[3+iterador];
44                 iterador += 4;
45                 ID_aux = (d << 0 ) | (c << 8) |  ( b << 16) | (a << 24);
46                 if ( ID_aux == ID ){
47                                 memcpy(ptr,bloque[iterador],tam_reg);
48                                 break;
49                         }
50                 iterador += tam_reg;    
51         }               
52         
53         fclose(f_block_reg);            
54         free(bloque);
55         return 0;
56 }
57
58
59 /*busco el registro ID en el archivo reg_exist.dat, para ver si existe.*/
60 int existe_registro(EMUFS *emu, int ID)
61 {
62         REG_EXIST_T reg;
63         char name_f_reg_exist[255];
64         strcpy(name_f_reg_exist,emu->nombre);
65         strcat(name_f_reg_exist,"_exist_reg.tipo3");
66         if ( (f_reg_exist = fopen(name_f_reg_exist,"r")) == NULL) return -1; /*ERROR*/
67         while ( !feof(f_reg_exist) ){
68                 fread(&reg,sizeof(reg),1,f_reg_exist);
69                 if ( reg.id_reg == ID && reg.existe == 'S' ){
70                         fclose(f_reg_exist);
71                         return 0;
72                 }
73         }
74         
75         fclose(f_reg_exist);
76         return -1;
77 }
78
79
80 /*busca el registro ID en el archivo "block_reg.dat" y devuelve el nro de bloque en el que se encuentra*/
81 int buscar_registro(EMUFS *emu, int ID)
82 {
83         BLOCK_REG_T reg;
84         char name_f_block_reg[255];
85         strcpy(name_f_block_reg,emu->nombre);
86         strcat(name_f_block_reg,"_block_reg.tipo3");
87         
88         if ( (f_block_reg = fopen(name_f_block_reg,"r")) == NULL) return -1; /*ERROR*/
89         while ( !feof(f_block_reg) ){
90                 fread(&reg,sizeof(reg),1,f_block_reg);
91                 if ( reg.id_reg == ID ){
92                         fclose(f_block_reg);
93                         return reg.block;
94                 }
95         }
96         
97         fclose(f_block_reg);
98         return -1;
99 }
100
101 int leer_bloque(EMUFS *emu, int ID, void* ptr)
102 {
103         FILE* file;
104         char name_f[255];
105         
106         strcpy(name_f,emu->nombre);
107         strcat(name_f,".tipo3");
108         
109         if ( (file = fopen(name_f,"r"))==NULL ) return -1; /*ERROR*/
110         fseek(file,ID*emu->tam_bloque,SEEK_SET);
111         fread(ptr,emu->tam_bloque,1,file);
112         
113         return 0;
114 }