Code:
#include <stdio.h>
#include <vector>
using namespace std;
typedef struct _VARINFO
{
int namelen;
int contentlen;
}
VARINFO;
typedef struct _VAR
{
VARINFO info;
char *name;
char *content;
}
VAR;
typedef vector<VAR> VARLIST;
enum VARS_MODES
{
VAR_NO_OVERWRITE,
VAR_OVERWRITE
};
enum VARS_ERRORS
{
VAR_SUCCESS,
VAR_FOPEN,
VAR_READERROR,
VAR_OUTOFMEMEORY,
VAR_NO_VAR_FOUND
};
int vars_add(VARLIST *varlist, char *name, char *content, int contentlen, int overwrite)
{
VAR var;
int i;
var.info.namelen = strlen(name);
var.info.contentlen = contentlen;
for(i = 0; i < varlist->size(); i++)
{
if ((*varlist)[i].info.namelen == var.info.namelen)
{
if (!memcmp((*varlist)[i].name, name, var.info.namelen))
{
if (overwrite == VAR_NO_OVERWRITE)
{
return VAR_SUCCESS;
}
break;
}
}
}
if (i == varlist->size() || VAR_OVERWRITE)
{
if (!(var.name = (char *) malloc(var.info.namelen + 1))
|| !(var.content = (char *) malloc(var.info.contentlen + 1)))
{
return VAR_OUTOFMEMEORY;
}
memcpy(var.name, name, var.info.namelen);
memcpy(var.content, content, var.info.contentlen);
if (i < varlist->size())
{
free((*varlist)[i].content);
free((*varlist)[i].name);
(*varlist)[i] = var;
}
else
{
varlist->push_back(var);
}
}
return VAR_SUCCESS;
}
int vars_update(VARLIST *varlist, char *name, char *content, int contentlen)
{
int i;
for(i = 0; i < varlist->size(); i++)
{
if ((*varlist)[i].info.namelen == strlen(name))
{
if (!memcmp((*varlist)[i].name, name, (*varlist)[i].info.namelen))
{
if ((*varlist)[i].info.contentlen == contentlen)
{
memcpy((*varlist)[i].content, content, contentlen);
}
else
{
free((*varlist)[i].content);
if (!((*varlist)[i].content = (char *) malloc(contentlen + 1)))
{
return VAR_OUTOFMEMEORY;
}
memcpy((*varlist)[i].content, content, contentlen);
}
return VAR_SUCCESS;
}
}
}
return VAR_NO_VAR_FOUND;
}
int vars_get(VARLIST *varlist, char *name, VAR *var)
{
int i;
for(i = 0; i < varlist->size(); i++)
{
if ((*varlist)[i].info.namelen == strlen(name))
{
if (!memcmp((*varlist)[i].name, name, (*varlist)[i].info.namelen))
{
*var = (*varlist)[i];
return VAR_SUCCESS;
}
}
}
return VAR_NO_VAR_FOUND;
}
int vars_read(VARLIST *varlist, char *file, int overwrite)
{
FILE *fp;
VAR var;
int i;
if (!(fp = fopen(file, "rb")))
{
return VAR_FOPEN;
}
while(!feof(fp))
{
if (fread(&var.info, 1, sizeof(var.info), fp) != sizeof(var.info))
{
return VAR_READERROR;
}
if (!(var.name = (char *) malloc(var.info.namelen + 1))
|| !(var.content = (char *) malloc(var.info.contentlen + 1)))
{
return VAR_OUTOFMEMEORY;
}
if (fread(var.name, 1, var.info.namelen, fp) != var.info.namelen
|| fread(var.content, 1, var.info.contentlen, fp) != var.info.contentlen)
{
free(var.name);
free(var.content);
return VAR_READERROR;
}
for(i = 0; i < varlist->size(); i++)
{
if ((*varlist)[i].info.namelen == var.info.namelen)
{
if (!memcmp((*varlist)[i].name, var.name, var.info.namelen))
{
if (overwrite == VAR_OVERWRITE)
{
free((*varlist)[i].content);
free((*varlist)[i].name);
(*varlist)[i] = var;
}
break;
}
}
}
if (i == varlist->size())
{
varlist->push_back(var);
}
}
fclose(fp);
return VAR_SUCCESS;
}
int vars_write(VARLIST *varlist, char *file)
{
FILE *fp;
VAR var;
int i;
vars_read(varlist, file, VAR_NO_OVERWRITE);
if (!(fp = fopen(file, "wb")))
{
return VAR_FOPEN;
}
for(i = 0; i < varlist->size(); i++)
{
fwrite(&(*varlist)[i].info, 1, sizeof((*varlist)[i].info), fp);
fwrite((*varlist)[i].name, 1, (*varlist)[i].info.namelen, fp);
fwrite((*varlist)[i].content, 1, (*varlist)[i].info.contentlen, fp);
}
fclose(fp);
return VAR_SUCCESS;
}
/*
int vars_add(VARLIST *varlist, char *name, char *content, int contentlen, int overwrite);
int vars_update(VARLIST *varlist, char *name, char *content, int contentlen);
int vars_get(VARLIST *varlist, char *name, VAR *var);
int vars_read(VARLIST *varlist, char *file, int overwrite);
int vars_write(VARLIST *varlist, char *file);
*/
int main(void)
{
char file[] = "myVars.backup";
VARLIST varlist;
VAR var1;
vars_read(&varlist, file, VAR_NO_OVERWRITE);
vars_add(&varlist, "var1", "\x00\x00\x00\x00", sizeof(int), VAR_NO_OVERWRITE);
vars_get(&varlist, "var1", &var1);
(*((int *) var1.content))++;
vars_update(&varlist, "var1", var1.content, var1.info.contentlen);
vars_write(&varlist, file);
printf("var1 = %d\n", *((int *) var1.content));
return 0;
}