00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #include <stdio.h>
00043 #include <stdlib.h>
00044 #ifndef __UNIX_
00045 #include <malloc.h>
00046 #endif
00047 #include "memvirtu.h"
00048 #define header 7
00049
00050 int init_v_array(char *filename, int rec_size, char filchar)
00051 {
00052 long size;
00053 FILE *f;
00054
00055 if ((f = fopen(filename, "wb")) != (FILE *)NULL)
00056 {
00057 size = 0;
00058 fwrite(&size, sizeof(long), 1, f);
00059 fwrite(&rec_size, sizeof(int), 1, f);
00060 fwrite(&filchar, sizeof(char), 1, f);
00061 fclose(f);
00062 return(1);
00063 }
00064 return(0);
00065 }
00066
00067 VACB *open_v_array(char *filename, int buffer_size)
00068 {
00069 VACB *v_array;
00070 char *buf_ptr;
00071 int i;
00072 char filchar;
00073
00074
00075 v_array = (VACB *)malloc(sizeof(VACB));
00076 if (v_array == NULL)
00077 {
00078 fprintf(stderr, "sem memoria\n");
00079 exit(1);
00080 }
00081
00082
00083 v_array->file = fopen(filename, "r+b");
00084 if (v_array->file == (FILE *)NULL)
00085 {
00086 free(v_array);
00087 return((VACB *)NULL);
00088 }
00089
00090
00091 fread(&v_array->size, sizeof(long), 1, v_array->file);
00092 fread(&v_array->elsize, sizeof(int), 1, v_array->file);
00093 fread(&filchar, sizeof(char), 1, v_array->file);
00094 v_array->buf_elsize = v_array->elsize + sizeof(long);
00095
00096
00097 v_array->buffer = (char *)malloc(v_array->buf_elsize *
00098 (buffer_size + 1));
00099 if (v_array->buffer == (char *)NULL)
00100 {
00101 fclose(v_array->file);
00102 free(v_array);
00103 fprintf(stderr, "sem memoria\n");
00104 exit(1);
00105 return((VACB *)NULL);
00106 }
00107 v_array->buf_size = buffer_size;
00108
00109
00110
00111 buf_ptr = v_array->buffer + v_array->buf_elsize * v_array->buf_size;
00112 v_array->blank_rec = buf_ptr + sizeof(long);
00113 for (i = 0; i < v_array->buf_elsize; ++i)
00114 {
00115 *buf_ptr++ = filchar;
00116 }
00117
00118
00119 buf_ptr = v_array->buffer;
00120 for (i = 0; i < v_array->buf_size; ++i)
00121 {
00122 *((long *)buf_ptr) = -1L;
00123 buf_ptr += v_array->buf_elsize;
00124 }
00125 return(v_array);
00126 }
00127
00128 void close_v_array(VACB *v_array)
00129 {
00130 int i;
00131 char *buf_ptr;
00132 long rec_index, file_offset;
00133
00134 buf_ptr = v_array->buffer;
00135
00136 for (i = 0; i < v_array->buf_size; ++i)
00137 {
00138
00139
00140 rec_index = *((long *)buf_ptr);
00141 if (rec_index >= 0)
00142 {
00143 file_offset = header + rec_index * v_array->elsize;
00144 fseek(v_array->file, file_offset, 0);
00145 fwrite(buf_ptr + sizeof(long), v_array->elsize, 1, v_array->file);
00146 }
00147 buf_ptr += v_array->buf_elsize;
00148 }
00149 free(v_array->buffer);
00150 fclose(v_array->file);
00151 free(v_array);
00152 }
00153
00154 char *access_v_rec(VACB *v_array, long index)
00155 {
00156 char *buf_ptr;
00157 int buf_index;
00158 long rec_index, temp_index;
00159 extern VACB *SET08VirtualArray;
00160
00161
00162
00163 buf_index = (int)(index % v_array->buf_size);
00164 buf_ptr = v_array->buffer + buf_index * v_array->buf_elsize;
00165 rec_index = *(long *)buf_ptr;
00166
00167
00168 if (rec_index == index)
00169 {
00170 return(buf_ptr + sizeof(long));
00171 }
00172
00173
00174 if (index >= v_array->size)
00175 {
00176 fseek(v_array->file, 0, 2);
00177 for (temp_index = v_array->size; temp_index++ <= index;)
00178 {
00179 fwrite(v_array->blank_rec, v_array->elsize, 1, v_array->file);
00180 }
00181 v_array->size = index + 1;
00182 fseek(v_array->file, 0, 0);
00183 fwrite(&v_array->size, sizeof(long), 1, v_array->file);
00184 }
00185
00186
00187
00188 if (rec_index >= 0)
00189 {
00190 fseek(v_array->file, rec_index * v_array->elsize + header, 0);
00191 fwrite(buf_ptr + sizeof(long), v_array->elsize, 1, v_array->file);
00192 }
00193
00194
00195 fseek(v_array->file, index * v_array->elsize + header, 0);
00196 fread(buf_ptr + sizeof(long), v_array->elsize, 1, v_array->file);
00197 *((long *)buf_ptr) = index;
00198
00199
00200 return(buf_ptr + sizeof(long));
00201 }