/*-----------------------------------------------------------------------*/ static void PutElem(void * elem) { t_ELMsize elemSize = elm2link(elem)->size; Putt_ELMsize(elemSize); if (1!=fwrite(elem,(int)elemSize,1,fileW)) AbortLL_M("PutListLev1","fwrite failed"); }
static t_ELMsize Gett_ELMsize(void) { t_ELMsize l; if (1 != fread(&l,sizeof(l),1,fileR)) AbortLL_M("Gett_ELMsize","fread failed"); return l; }
static char GetChar(void) { char c; if (1 != fread(&c,sizeof(c),1,fileR)) AbortLL_M("GetChar","fread failed"); return c; }
/*---------- empty element allocation and and linking ------------------*/ static void * InsEmptyBefLLf(l_list *li, size_t size) { l_list * newEl; if (NULL==(newEl=(l_list*)malloc(size+sizeof(t_linkLL)))) AbortLL_M("InsEmptyBefLLf","malloc failed"); l_lbefore(li,newEl); newEl->size=size; return (link2elm(newEl)); }
/*-----------------------------------------------------------------------*/ static void WritefLL(char * filename, t_LL list, void (*PutList)(t_LL l)) { if('-' == *filename) fileW = stdout; else if (NULL==( fileW = fopen(filename,"wb"))) AbortLL_M("WriteLL","fopen failed"); fprintf(fileW,"#LL"); PutList(list); fclose(fileW); }
void LL2File(t_LL list, char * name) { FILE *file = (strcmp("-",name)) ? fopen(name,"w") : stdout ; char * str; if (NULL==file) AbortLL_M("LL2File","can't open file for write"); ForeachLL_M(list,str) fputs(str,file); fclose(file); }
t_LL ReadLL(char * filename) { t_LL list; if('-' == *filename) fileR = stdin; else if (NULL==( fileR = fopen(filename,"rb"))) AbortLL_M("ReadLL","fopen failed"); /* .LL file starts #LL followed by a (t_LLsize) 0*/ if('#'!=GetChar() || 'L'!=GetChar() || 'L'!=GetChar() || 0!=Gett_LLsize()) AbortLL_M("ReadLL","file not in LL format!"); list = GetList(); { /* test whether the whole file was read */ char c; if(0 != fread(&c,sizeof(c),1,fileR)) AbortLL_M("ReadLL","trailing chars found"); } fclose(fileR); return list; }
static t_LL AuxFile2LL(char * name, int exitOnErr) { char buffer[MAX_LINE_LENGTH]; t_LL list = ConsLL(); FILE *file = fopen(name,"r"); if (NULL==file) { if (!exitOnErr) return list; /* return empty list */ else AbortLL_M("File2LL","can't open file for read"); } while(fgets(buffer,MAX_LINE_LENGTH,file)) InsLastLLf(list,strlen(buffer)+1,buffer); fclose(file); return list; }
/*-----------------------------------------------------------------------*/ static t_LL GetList(void) { t_LL list = ConsLL(); t_LLsize size = Gett_LLsize(); while(size-- > 0) { t_ELMsize elemSize = Gett_ELMsize(); if (0 == elemSize ) { /* this element is a list, get it by a recursive call */ t_LL listElem = GetList(); InsLastLL(list,listElem); } else { void * elemData = InsEmptyBefLLf(list2link(list),elemSize); if (1!=fread(elemData,elemSize,1,fileR)) AbortLL_M("GetList","fread failed"); } } return list; }
static void Putt_ELMsize(t_ELMsize l) { if (1 != fwrite(&l,sizeof(l),1,fileW)) AbortLL_M("Putt_ELMsize","fwrite failed"); }