static Deque *Load(FILE *stream, ReadFunction loadFn,void *arg) { size_t i; char *buf; Deque D,*d; if (fread(&D,1,sizeof(Deque),stream) == 0) return NULL; d = Create(D.ElementSize); if (d == NULL) return NULL; buf = malloc(D.ElementSize); if (buf == NULL) { Finalize(d); iError.RaiseError("iDeque.Load",CONTAINER_ERROR_NOMEMORY); return NULL; } for (i=0; i<D.count;i++) { if (loadFn == NULL) { if (fread(buf,1,D.ElementSize,stream) == 0) break; } else { if (loadFn(buf,arg,stream) <= 0) { break; } } Add(d,buf); } free(buf); d->count = D.count; d->Flags = D.Flags; return d; }
static TreeMap *Load(FILE *stream, ReadFunction loadFn,void *arg) { size_t i,elemSize; TreeMap *result,L; char *buf; int r; guid Guid; if (stream == NULL) { iError.RaiseError("Load",CONTAINER_ERROR_BADARG); return NULL; } if (loadFn == NULL) { loadFn = DefaultLoadFunction; arg = &elemSize; } if (fread(&Guid,sizeof(guid),1,stream) <= 0) { iError.RaiseError("Load",CONTAINER_ERROR_FILE_READ); return NULL; } if (memcmp(&Guid,&TreeMapGuid,sizeof(guid))) { iError.RaiseError("Load",CONTAINER_ERROR_WRONGFILE); return NULL; } if (fread(&L,1,sizeof(TreeMap),stream) <= 0) { iError.RaiseError("Load",CONTAINER_ERROR_FILE_READ); return NULL; } elemSize = L.ElementSize; buf = malloc(L.ElementSize); if (buf == NULL) { iError.RaiseError("Load",CONTAINER_ERROR_NOMEMORY); return NULL; } result = Create(L.ElementSize); if (result == NULL) { iError.RaiseError("Load",CONTAINER_ERROR_NOMEMORY); return NULL; } result->Flags = L.Flags; r = 1; for (i=0; i < L.count; i++) { if (loadFn(buf,arg,stream) <= 0) { r = CONTAINER_ERROR_FILE_READ; break; } if ((r=Add(result,buf,NULL)) < 0) { break; } } free(buf); if (r < 0) { iError.RaiseError("Load",r); Finalize(result); result = NULL; } return result; }