1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
#include "umfileint.h"
/* functions to create pointers to new structures (such as Rec, Var and File)
* from heap memory
*
* Also for good measure functions to free these, although most are not
* crucial if they are not called, because of the garbage collection procedure
* employed in free_file()
*/
Rec *new_rec(int word_size, List *heaplist)
{
Rec *rec;
CKP( rec = malloc_(sizeof(Rec), heaplist) );
CKP( rec->internp = malloc_(sizeof(struct _Rec), heaplist) );
CKP( rec->int_hdr = malloc_(N_INT_HDR * word_size, heaplist) );
CKP( rec->real_hdr = malloc_(N_REAL_HDR * word_size, heaplist) );
rec->header_offset = -1;
rec->data_offset = -1;
rec->disk_length = -1;
return rec;
ERRBLKP;
}
int free_rec(Rec *rec, List *heaplist)
{
CKI( free_(rec->internp, heaplist) );
CKI( free_(rec->int_hdr, heaplist) );
CKI( free_(rec->real_hdr, heaplist) );
CKI( free_(rec, heaplist) );
return 0;
ERRBLKI;
}
Var *new_var(List *heaplist)
{
Var *var;
CKP(
var = malloc_(sizeof(Var), heaplist)
);
CKP(
var->internp = malloc_(sizeof(struct _Var), heaplist)
);
var->nz = 0;
var->nt = 0;
var->supervar_index = -1;
var->recs = NULL;
return var;
ERRBLKP;
}
int free_var(Var *var, List *heaplist)
{
CKI( free_(var->internp, heaplist) );
if (var->recs)
CKI( free_(var->recs, heaplist) );
CKI( free_(var, heaplist) );
return 0;
ERRBLKI;
}
/* new_file is a rather special case, because the heaplist is initialised as
* part of the structure rather than supplied externally. Also free_file will
* free everything on the heaplist.
*/
File *new_file()
{
File *file;
if ( (file = malloc_(sizeof(File), NULL)) == NULL) goto err1;
if ( (file->internp = malloc_(sizeof(struct _File), NULL)) == NULL) goto err2;
if ( (file->internp->heaplist = list_new(NULL)) == NULL) goto err3;
file->nvars = 0;
file->vars = NULL;
file->fd = -1;
file->file_type.format = -1;
file->file_type.byte_ordering = -1;
file->file_type.word_size = -1;
file->internp->nrec = 0;
file->internp->recs = NULL;
return file;
err3:
free_(file->internp, NULL);
err2:
free_(file, NULL);
err1:
GRIPE;
return NULL;
}
int free_file(File *file)
{
CKI( free_all(file->internp->heaplist) );
CKI( free_(file->internp, NULL) );
CKI( free_(file, NULL) );
return 0;
ERRBLKI;
}
|