diff --git a/src/avmesh.cpp b/src/avmesh.cpp index 10873c5..762a47a 100644 --- a/src/avmesh.cpp +++ b/src/avmesh.cpp @@ -35,24 +35,28 @@ int avm_open(const char* filename, int* id) { if (filename==NULL) RETURN_ERROR("avm_open: filename is NULL"); if (id==NULL) RETURN_ERROR("avm_open: id is NULL"); - avmesh_file *avf = new avmesh_file; - avf->rev0 = NULL; - avf->rev1 = NULL; - avf->rev2 = NULL; - avf->formatRevision = -1; - file_list[file_counter] = avf; // is this a AVMesh File? FILE* fp = NULL; - bool byte_swap = 0; - file_id_prefix_t file_prefix; fp = fopen(filename, "rb"); if (fp==NULL) RETURN_ERROR("avm_open: fopen failed"); + + // read the file_prefix metadata + bool byte_swap = 0; + file_id_prefix_t file_prefix; if(!file_id_prefix::read(fp, &byte_swap, &file_prefix)) { - avm_close(file_counter); + fclose(fp); RETURN_ERROR("avm_open: failed reading file_id_prefix"); } + // allocate an avmesh_file instance + avmesh_file *avf = new avmesh_file; + avf->rev0 = NULL; + avf->rev1 = NULL; + avf->rev2 = NULL; + avf->formatRevision = -1; + file_list[file_counter] = avf; + if (file_prefix.formatRevision == 0) { avf->formatRevision = 0; avf->rev0 = new rev0_avmesh_file; @@ -62,8 +66,7 @@ int avm_open(const char* filename, int* id) avf->rev0->filename = filename; avf->rev0->file_prefix.formatRevision = 0; if (rev0::avm_open(avf->rev0, id)) { - delete avf->rev0; - delete avf; + avm_close(file_counter); return 1; } *id = file_counter++; @@ -77,9 +80,8 @@ int avm_open(const char* filename, int* id) avf->rev1->file_prefix = file_prefix; avf->rev1->filename = filename; avf->rev1->file_prefix.formatRevision = 1; - if (rev1::avm_open(avf->rev1, id)) { - delete avf->rev1; - delete avf; + if (rev1::avm_open(avf->rev1, id)) { + avm_close(file_counter); return 1; } *id = file_counter++; @@ -94,8 +96,7 @@ int avm_open(const char* filename, int* id) avf->rev2->filename = filename; avf->rev2->file_prefix.formatRevision = 2; if (rev2::avm_open(avf->rev2, id)) { - delete avf->rev2; - delete avf; + avm_close(file_counter); return 1; } *id = file_counter++;