Skip to content

Instantly share code, notes, and snippets.

@be9
Forked from anonymous/parray.c
Created April 6, 2011 11:25
Show Gist options
  • Save be9/905494 to your computer and use it in GitHub Desktop.
Save be9/905494 to your computer and use it in GitHub Desktop.
#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;
}
#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