/* This file is in the public domain. */ #include #include #include "structs.h" #include "repo.h" void repo_free(REPO *r) { free(r->name); free(r->filename); if (r->f) fclose(r->f); free(r); } void repo_free_chain(REPO *chain) { REPO *r; while (chain) { r = chain; chain = r->link; repo_free(r); } } void repo_record(REPO *r, unsigned long long int ts, const char *data, void (*err)(const char *, ...)) { long long int iv; double dv; char *ep; char *ds; switch (r->type) { case DT_INT: iv = strtoll(data,&ep,0); if ((ep == data) || *ep) (*err)("invalid data"); asprintf(&ds,"%lld",iv); break; case DT_FLOAT: dv = strtod(data,&ep); if ((ep == data) || *ep) (*err)("invalid data"); asprintf(&ds,"%.20g",dv); break; default: abort(); break; } flock(fileno(r->f),LOCK_EX); fseek(r->f,0,SEEK_END); fprintf(r->f,"%llu %s\n",ts,ds); fflush(r->f); flock(fileno(r->f),LOCK_UN); }