]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - tipo3/param_cte.c
subo esto para no perderlo y para que me vayan corrigiendo porque de seguro tiene...
[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* block_reg;
5 FILE* block_free;
6 FILE* reg_exist;
7
8
9 /** Leo un registro del archivo, devuelve cero si no lo encuentra.**/
10 int leer_registro(int ID, void *str, unsigned long tam)
11 {
12         struct t_param_cte dato;
13         char* bloque = (char*)malloc(tam);
14         char ID_char[4];
15         int block, i, ID_aux, a, b, c, d;
16         int iterador = 0;
17         /* tengo que crear los archivos de indice antes de usarlos!!!!!!!!!*/
18         if ( (block_reg = fopen("block_reg.dat","a+")) == NULL )
19                 return -1; /*ERROR*/
20         
21         if ( (block_free = fopen("block_free.dat","a+")) == NULL )
22                 return -1; /*ERROR*/
23         
24         if ( (reg_exist = fopen("reg_exist.dat","a+")) == NULL )
25                 return -1; /*ERROR*/
26         /* si el registro no existe, retorno*/
27         if ( existe_registro(ID) == -1 ) return -1;
28         /*si existe, lo busco en el archivo de bloques*/
29         
30         block = buscar_registro(ID); /*me devuelve el nro de bloque al que pertenece el registro*/
31         if (leer_bloque(block,bloque,tam)==-1) 
32                 return -1; /*No se pudo leer el bloque*/
33         
34         while ( iterador != (tam/sizeof(dato)) ){
35                 a = bloque[0+iterador];
36                 b = bloque[1+iterador];
37                 c = bloque[2+iterador];
38                 d = bloque[3+iterador];
39                 ID_aux = (d << 0 ) | (c << 8) |  ( b << 16) | (a << 24);
40                 if ( ID_aux == ID ){
41                                 copiar(dato, &str);
42                                 break;
43                         }
44                 iterador += sizeof(dato);       
45         }               
46         fclose(block_reg);              
47         fclose(block_free);
48         fclose(reg_exist);
49         free(bloque);
50         return 0;
51         
52 }
53
54
55 /*busco el registro ID en el archivo reg_exist.dat, para ver si existe.*/
56 int existe_registro(int ID)
57 {
58         int num;
59         char ex;
60         if ( (reg_exist = fopen("reg_exist.dat","r")) == NULL) return 0; /*ERROR*/
61         while ( !feof(reg_exist) ){
62                 fscanf(reg_exist,"%i%c",num,ex);
63                 if ( num == ID && ex == 'S' ){
64                         fclose(reg_exist);
65                         return 0;
66                 }
67         }
68         
69         fclose(reg_exist);
70         return -1;
71 }
72
73
74 /*busca el registro ID en el archivo "block_reg.dat" y devuelve el nro de bloque en el que se encuentra*/
75 int buscar_registro(int ID)
76 {
77         int num_block, num_reg; 
78         if ( (block_reg = fopen("block_reg.dat","r")) == NULL) return 0; /*ERROR*/
79         while ( !feof(block_reg) ){
80                 fscanf(block_reg,"%i%i",num_block,num_reg);
81                 if ( num_reg == ID ){
82                         fclose(block_reg);
83                         return num_block;
84                 }
85         }
86         
87         fclose(block_reg);
88         return -1;
89 }
90
91 int copiar(struct t_param_cte dato, void** str)
92 {
93         if (str == NULL) return 0;
94         str->ID == dato.ID;     
95         strcpy(str->num_fac,dato.num_fac);
96         strcpy(str->fecha_emision,dato.fecha_emision);
97         strcpy(str->fecha_vto,dato.fecha_vto);
98         strcpy(str->num_fac,dato.num_fac);
99         strcpy(str->num_remito,dato.num_remito);
100         strcpy(str->estado,dato.estado);
101         strcpy(str->FP,dato.FP);
102         strcpy(str->Por_DoI,dato.Por_DoI);
103         strcpy(str->num_cta_cte,dato.num_cta_cte);
104         strcpy(str->num_cheque,dato.num_cheque);
105         str->texto = dato.texto;
106         return 1;
107 }
108         
109 int leer_bloque(int ID, void* str, unsigned long tam)
110 {
111         
112 }