-
-
Save be9/905494 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#pragma warning(disable: 4996) | |
#include <stdlib.h> | |
#include <string.h> | |
#include "parray.h" | |
PArray *parray_create(size_t length, size_t sz, char *filename) | |
{ | |
PArray *pa = (PArray *)malloc(sizeof(PArray)); | |
if (!pa) | |
return 0; | |
pa->filename = _strdup(filename); | |
if (!pa->filename) { | |
free(pa); | |
return 0; | |
} | |
pa->fp = fopen(filename, "wb"); | |
if (!pa->fp) { | |
free(pa); | |
return 0; | |
} | |
pa->length = length; | |
pa->sz = sz; | |
pa->base = malloc(sz * length); | |
if (!pa->base) { | |
fclose(pa->fp); | |
free(pa); | |
return 0; | |
} | |
return pa; | |
} | |
PArray *parray_open(char *filename) | |
{ | |
FILE *fp = fopen(filename, "r+b"); | |
PArray *pa; | |
if (!fp) | |
return 0; | |
pa = (PArray *)malloc(sizeof(PArray)); | |
if (!pa) { | |
fclose(fp); | |
return 0; | |
} | |
pa->fp = fp; | |
if (fread(&pa->length, sizeof (pa->length), 1, pa->fp) < 1) { | |
fclose(fp); | |
free(pa); | |
return 0; | |
} | |
if (fread(&pa->sz, sizeof (pa->sz), 1, pa->fp) < 1) { | |
fclose(fp); | |
free(pa); | |
return 0; | |
} | |
pa->base = malloc(pa->sz * pa->length); | |
if (!pa->base) { | |
fclose(fp); | |
free(pa); | |
return 0; | |
} | |
pa->filename = _strdup(filename); | |
if (!pa->filename) { | |
fclose(fp); | |
free(pa->base); | |
free(pa); | |
return 0; | |
} | |
if (fread(pa->base, pa->sz, pa->length, fp) < pa->length) { | |
fclose(fp); | |
free(pa->base); | |
free(pa->filename); | |
free(pa); | |
return 0; | |
} | |
return pa; | |
} | |
void parray_free(PArray *pa) | |
{ | |
parray_flush(pa); | |
fclose(pa->fp); | |
free(pa->base); | |
free(pa->filename); | |
free(pa); | |
} | |
void parray_destroy(PArray *pa) | |
{ | |
fclose(pa->fp); | |
free(pa->base); | |
_unlink(pa->filename); | |
free(pa->filename); | |
free(pa); | |
} | |
int parray_flush(PArray *pa) | |
{ | |
if (fseek(pa->fp, 0, SEEK_SET)) | |
return 4; | |
if (fwrite(&pa->length, sizeof (pa->length), 1, pa->fp) < 1) | |
return 1; | |
if (fwrite(&pa->sz, sizeof (pa->sz), 1, pa->fp) < 1) | |
return 2; | |
if (fwrite(pa->base, pa->sz, pa->length, pa->fp) < pa->length) | |
return 3; | |
return 0; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifndef __parray_h | |
#define __parray_h | |
#include <stdio.h> | |
typedef struct _PArray { | |
void *base; | |
size_t length, sz; | |
FILE *fp; | |
char *filename; | |
} PArray; | |
PArray *parray_create(size_t length, size_t sz, char *filename); | |
PArray *parray_open(char *filename); | |
void parray_free(PArray *pa); | |
void parray_destroy(PArray *pa); | |
int parray_flush(PArray *pa); // 0 if ok | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment