Beispiel #1
0
static HashTable *Load(FILE *stream, ReadFunction readFn,void *arg)
{
    size_t i,len,keybuflen;
    HashTable *result=NULL,HT;
    char *keybuf=NULL,*valbuf=NULL;
    guid Guid;

    if (readFn == NULL) {
        readFn = DefaultLoadFunction;
        arg = &HT.ElementSize;
    }

    if (fread(&Guid,sizeof(guid),1,stream) == 0) {
        iError.RaiseError("iHashTable.Load",CONTAINER_ERROR_FILE_READ);
        return NULL;
    }
    if (memcmp(&Guid,&HashTableGuid,sizeof(guid))) {
        iError.RaiseError("iHashTable.Load",CONTAINER_ERROR_WRONGFILE);
        return NULL;
    }
    if (fread(&HT,1,sizeof(HashTable),stream) == 0) {
        iError.RaiseError("HashTable.Load",CONTAINER_ERROR_FILE_READ);
        return NULL;
    }
    result = iHashTable.Create(HT.ElementSize);
    if (result == NULL)
        return NULL;
    keybuflen = 4096;
    keybuf = malloc(keybuflen);
    valbuf = malloc(HT.ElementSize);
    result->Flags = HT.Flags;
    for (i=0; i< HT.count; i++) {
        if (decode_ule128(stream, &len) <= 0) {
        err:
            iError.RaiseError("iHashTable.Load",CONTAINER_ERROR_FILE_READ);
            goto out;
        }
        if (keybuflen < len) {
            void *tmp = realloc(keybuf,len);
            if (tmp == NULL) {
                iError.RaiseError("iHashTable.Load",CONTAINER_ERROR_NOMEMORY);
                goto out;
            }
            keybuf = tmp;
            keybuflen = len;
        }
        if (fread(keybuf,1,len,stream) == 0) {
            goto err;
        }
        if (readFn(valbuf,arg,stream) == 0) {
            goto err;
        }
        iHashTable.Add(result,keybuf,len,valbuf);
    }
out:
    if (keybuf) free(keybuf);
    if (valbuf) free(valbuf);
    return result;
}
Beispiel #2
0
static ElementType *Load(FILE *stream, ReadFunction readFn,void *arg)
{
    size_t i,len=0;
    ElementType *result,SC;
    guid Guid;

    if (stream == NULL) {
        NullPtrError("Load");
        return NULL;
    }
    if (readFn == NULL) {
        readFn = DefaultLoadFunction;
        arg = &len;
    }
    if (fread(&Guid,sizeof(guid),1,stream) == 0) {
        iError.RaiseError("istrCollection.Load",CONTAINER_ERROR_FILE_READ);
        return NULL;
    }
    if (memcmp(&Guid,&strCollectionGuid,sizeof(guid))) {
        iError.RaiseError("istrCollection.Load",CONTAINER_ERROR_WRONGFILE);
        return NULL;
    }
    if (fread(&SC,1,sizeof(ElementType),stream) == 0) {
        iError.RaiseError("istrCollection.Load",CONTAINER_ERROR_FILE_READ);
        return NULL;
    }
    result = iElementType.Create(SC.count);
    if (result == 0) {
        return NULL;
    }
    result->Flags = SC.Flags;
    for (i=0; i< SC.count; i++) {
        if (decode_ule128(stream, &len) <= 0) {
            goto err;
        }
        len++;
        result->contents[i] = result->Allocator->malloc(len);
        if (result->contents[i] == NULL) {
            NoMemoryError(result,"Load");
            Finalize(result);
            return NULL;
        }
        if (readFn(result->contents[i],arg,stream) <= 0) {
        err:
            iError.RaiseError("ElementType.Load",CONTAINER_ERROR_FILE_READ);
            break;
        }
        result->count++;
    }
    return result;
}