示例#1
0
文件: deque.c 项目: HunterPlus/ccl
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;
}
示例#2
0
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;
}