int state_load(memfile_t *file) { stateheader_t header; block_t *block; u32 size = 0; int i; readvar(header.ident,4); readvar(header.version,2); readvar(header.flags,2); readvar(header.usize,4); readvar(header.csize,4); readvar(header.crc32,4); log_printf("state_load: state header loaded. version %04X\n",header.version); while(memfile_eof(file) == 0 && size < header.usize) { if((block = block_load(file)) == 0) break; size += 8 + block->size; log_printf("state_load: loaded block '%4s' (%08X) (%d bytes)\n",&block->type,block->type,block->size); for(i=0;blockinfo[i].type;i++) { if(blockinfo[i].type == block->type) { blockinfo[i].func(STATE_LOAD,block->data); break; } } if(blockinfo[i].type == 0) { log_printf("state_load: no handler for block type '%4s' (%d bytes)\n",&block->type,block->size); } block_destroy(block); } return(0); }
int memfile_getc(memfile_t *mf) { int ret; if(memfile_eof(mf) != 0) { log_printf("memfile_getc: cannot read past eof\n"); return(-1); } ret = (int)mf->data[mf->curpos]; mf->curpos++; return(ret); }
u32 memfile_read(void *data,int chunksize,int chunks,memfile_t *mf) { int size = chunksize * chunks; if(memfile_eof(mf) != 0) { log_printf("memfile_read: cannot read past eof\n"); return(0); } memcpy(data,mf->data + mf->curpos,size); mf->curpos += size; return(chunks); }
char *memfile_gets(char *str,int n,memfile_t *mf) { int ch; char *p = str; memset(str,0,n); if(memfile_eof(mf) != 0) { log_printf("memfile_gets: cannot read past eof\n"); return(0); } for(;;) { ch = memfile_getc(mf); if(ch == -1) { if(p == str) return(0); return(str); } *p++ = (char)ch; if(--n == 0 || ch == '\n' || ch == 0) break; } return(str); }