Mercurial > repos > rhope
diff saveload.c @ 0:76568becd6d6
Rhope Alpha 2a source import
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 28 Apr 2009 23:06:07 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/saveload.c Tue Apr 28 23:06:07 2009 +0000 @@ -0,0 +1,317 @@ +#include "interp.h" +#include "structs.h" +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +/* +void save_program(char * filename) +{ + worker * aworkerlist; + wire * awirelist; + FILE * savefile; + int def_num, version = 1; + savefile = fopen(filename, "wb"); + if(!savefile) + return; + //deflist[current_def].num_workers = num_workers; + //deflist[current_def].num_wires = num_wires; + fwrite(&version, 4, 1, savefile); + fwrite(&num_defs, 4, 1, savefile); + fwrite(deflist, sizeof(worker_def), num_defs, savefile); + for(def_num = 0; def_num < num_defs; ++def_num) + { + if(deflist[def_num].workerlist) + { + fwrite(&def_num, 4, 1, savefile); + //fwrite(&(deflist[def_num].num_workers), 4, 1, savefile); + fwrite(deflist[def_num].workerlist, sizeof(worker), deflist[def_num].num_workers, savefile); + //fwrite(&(deflist[def_num].num_wires), 4, 1, savefile); + fwrite(deflist[def_num].wirelist, sizeof(wire), deflist[def_num].num_wires, savefile); + } + } + def_num = -1; + fwrite(&def_num, 4, 1, savefile); + fclose(savefile); +}*/ + +program * new_program(int def_storage, int comp_storage) +{ + defchunk * defs = malloc(sizeof(defchunk) + (def_storage - 1) * sizeof(worker_def)); + program * prog = malloc(sizeof(program)); + defs->num_defs = 0; + defs->deflist[0].name = NULL; + defs->defs_storage = def_storage; + defs->next = NULL; + prog->current = prog->defs = defs; + //prog->deflist = malloc(sizeof(worker_def) * def_storage); + //prog->num_defs = 0; + //prog->defs_storage = def_storage; + prog->companylist = malloc(sizeof(company) * comp_storage); + prog->num_companies = 0; + prog->companies_storage = comp_storage; + prog->refcount = 1; + VIS_InitializeCriticalSection(prog->lock); + return prog; +} + +int count_defs(defchunk * chunk) +{ + int total = 0; + while(chunk) + { + total += chunk->num_defs; + chunk = chunk->next; + } + return total; +} + +void save_program(program * prog, char * filename) +{ + int version = 2; + int total_bytes = 0; + int zero = 0; + int i; + int num_defs; + unsigned char size; + custom_worker * aworker; + //worker_def * deflist = prog->deflist; + defchunk * defs = prog->defs; + defchunk * current = defs; + worker_def * deflist; + FILE * savefile; + savefile = fopen(filename, "wb"); + fwrite(&version, 4, 1, savefile); + num_defs = count_defs(defs); + fwrite(&(num_defs), 4, 1, savefile); + while(current) + { + deflist = current->deflist; + for(i = 0; i < current->num_defs; ++i) + { + size = strlen(deflist[i].name); + fwrite(&size, 1, 1, savefile); + fwrite(deflist[i].name, 1, size, savefile); + total_bytes += (int)size + 1; + } + current = current->next; + } + if(total_bytes % 4 != 0)// pad to a 4 byte boundary + fwrite(&zero, 1, 4-(total_bytes % 4), savefile); + current = defs; + while(current) + { + deflist = current->deflist; + for(i = 0; i < current->num_defs; ++i) + { + if(deflist[i].type & USER_FLAG) + { + fwrite(&i, sizeof(int), 1, savefile); + fwrite(&(deflist[i].num_inputs), sizeof(short), 1, savefile); + fwrite(&(deflist[i].num_outputs), sizeof(short), 1, savefile); + fwrite(&(deflist[i].type), sizeof(short), 1, savefile); + fwrite(deflist[i].input_types, sizeof(short), deflist[i].num_inputs, savefile); + fwrite(deflist[i].output_types, sizeof(short), deflist[i].num_outputs, savefile); + total_bytes += sizeof(int) + (sizeof(short) * (3+deflist[i].num_inputs+deflist[i].num_outputs)); + if(total_bytes % 4 != 0)// pad to a 4 byte boundary + fwrite(&zero, 1, 4-(total_bytes % 4), savefile); + if((deflist[i].type & TYPE_MASK) == WORKER_TYPE) + { + aworker = deflist[i].implement_func; + fwrite(&(aworker->num_workers), sizeof(int), 1, savefile); + fwrite(aworker->workerlist, sizeof(worker), aworker->num_workers, savefile); + fwrite(&(aworker->num_wires), sizeof(int), 1, savefile); + fwrite(aworker->wirelist, sizeof(wire), aworker->num_wires, savefile); + } + } + } + current = current->next; + } + i = -1; + fwrite(&i, sizeof(int), 1, savefile); + fclose(savefile); +} + +program * load_program(char * filename) +{ + custom_worker * aworker; + int version; + int i,j; + int * def_lookup; + char name[256]; + int total_bytes; + int file_defs; + unsigned char name_size; + FILE * loadfile; + char * code; + int size; + program * prog; + loadfile = fopen(filename, "rb"); + if(!loadfile) + { + puts("Error: Could not open file"); + fflush(stdout); + return NULL; + } + if(!strcmp(strrchr(filename,'.')+1, "vis")) + { + //TODO: Fixme + /*fread(&version, 4, 1, loadfile); + if(version != 2) + { + puts("Error: Can't read files of this version."); + return NULL; + } + + fread(&file_defs, 4, 1, loadfile); + def_lookup = malloc(sizeof(int) * file_defs); + total_bytes = 0; + prog = new_program(file_defs, START_COMP_STORAGE); + initworkers(prog); + for(i = 0; i < file_defs; ++i) + { + fread(&name_size, 1, 1, loadfile); + fread(name, 1, name_size, loadfile); + name[name_size] = '\0'; + total_bytes += (int)name_size + 1; + for(j = 0; j < prog->num_defs; ++j) + { + if(!strcmp(name, prog->deflist[j].name)) + { + def_lookup[i] = j; + break; + } + } + if(j >= prog->num_defs) //couldn't find it in the list + { + def_lookup[i] = prog->num_defs; + prog->deflist[prog->num_defs].name = malloc(name_size+1); + strcpy(prog->deflist[prog->num_defs].name, name); + ++prog->num_defs; + } + } + if(total_bytes % 4 != 0)// pad to a 4 byte boundary + fread(&i, 1, 4-(total_bytes % 4), loadfile); + do + { + fread(&i, sizeof(int), 1, loadfile); + if(i >= 0) + { + i = def_lookup[i]; + fread(&(prog->deflist[i].num_inputs), sizeof(short), 1, loadfile); + fread(&(prog->deflist[i].num_outputs), sizeof(short), 1, loadfile); + fread(&(prog->deflist[i].type), sizeof(short), 1, loadfile); + prog->deflist[i].input_types = malloc(sizeof(short) * (prog->deflist[i].num_inputs + prog->deflist[i].num_outputs)); + prog->deflist[i].output_types = prog->deflist[i].input_types + prog->deflist[i].num_inputs; + fread(prog->deflist[i].input_types, sizeof(short), prog->deflist[i].num_inputs, loadfile); + fread(prog->deflist[i].output_types, sizeof(short), prog->deflist[i].num_outputs, loadfile); + total_bytes += sizeof(int) + (sizeof(short) * (3+prog->deflist[i].num_inputs+prog->deflist[i].num_outputs)); + if(total_bytes % 4 != 0)// pad to a 4 byte boundary + fread(&j, 1, 4-(total_bytes % 4), loadfile); + if((prog->deflist[i].type & TYPE_MASK) == WORKER_TYPE) + { + aworker = malloc(sizeof(custom_worker)); + prog->deflist[i].implement_func = aworker; + fread(&(aworker->num_workers), sizeof(int), 1, loadfile); + aworker->workerlist = malloc(sizeof(worker) * (aworker->num_workers + 512)); + fread(aworker->workerlist, sizeof(worker), aworker->num_workers, loadfile); + fread(&(aworker->num_wires), sizeof(int), 1, loadfile); + aworker->wirelist = malloc(sizeof(wire) * (aworker->num_wires + 1024)); + fread(aworker->wirelist, sizeof(wire), aworker->num_wires, loadfile); + aworker->workers_to_wires_down = malloc(sizeof(int) * (aworker->num_wires + 1024)); + aworker->workers_to_wires_up = malloc(sizeof(int) * (aworker->num_wires + 1024)); + for(j = 0; j < aworker->num_workers; ++j) + if(aworker->workerlist[j].type == 2) + aworker->workerlist[j].value_index = def_lookup[aworker->workerlist[j].value_index]; + } + } + }while(i >= 0);*/ + } + else + { + //Read text program + fflush(stdout); + fseek(loadfile, 0, SEEK_END); + size = ftell(loadfile); + fseek(loadfile, 0, SEEK_SET); + fflush(stdout); + code = malloc(size+1); + fread(code, 1, size, loadfile); + fclose(loadfile); +// num_defs = 0; + fflush(stdout); + prog = new_program(START_DEF_STORAGE, START_COMP_STORAGE); + initpredefworkers(prog); + fflush(stdout); + parse(code, size, prog); + free(code); + +// num_workers = deflist[0].num_workers; +// num_wires = deflist[0].num_wires; + } + return prog; +} + +/* +void load_program(char * filename) +{ + worker * aworkerlist; + wire * awirelist; + FILE * loadfile; + char * code; + int size; + int def_num, version; + loadfile = fopen(filename, "rb"); + if(!loadfile) + { + puts("Error: Could not open file"); + return; + } + if(!strcmp(strrchr(filename,'.')+1, "vis")) + { + //Read binary program + fread(&version, 4, 1, loadfile); + if(version != 1) + { + puts("Error: Can't read files of this version."); + return; + } + //program * new_program = malloc(sizeof(program)); + // strcpy(program->filename, filename); + fread(&num_defs, 4, 1, loadfile); + //program->defs_storage = program->num_defs + 512; + //new_program->deflist = malloc(sizeof(worker_def) * (program->defs_storaage)); + fread(deflist, sizeof(worker_def), num_defs, loadfile); + fread(&def_num, 4, 1, loadfile); + while(def_num >= 0 && !feof(loadfile)) + { + deflist[def_num].workerlist = malloc((deflist[def_num].num_workers+512)*sizeof(worker)); + fread(deflist[def_num].workerlist, sizeof(worker), deflist[def_num].num_workers, loadfile); + deflist[def_num].wirelist = malloc((deflist[def_num].num_wires+1024)*sizeof(wire)); + fread(deflist[def_num].wirelist, sizeof(wire), deflist[def_num].num_wires, loadfile); + deflist[def_num].workers_to_wires_up = malloc((deflist[def_num].num_wires+1024)*sizeof(int)); + deflist[def_num].workers_to_wires_down = malloc((deflist[def_num].num_wires+1024)*sizeof(int)); + fread(&def_num, 4, 1, loadfile); + } + fclose(loadfile); + num_workers = deflist[0].num_workers; + num_wires = deflist[0].num_wires; + initpredefworkers(); + } + else + { + //Read text program + fseek(loadfile, 0, SEEK_END); + size = ftell(loadfile); + fseek(loadfile, 0, SEEK_SET); + code = malloc(size+1); + fread(code, 1, size, loadfile); + num_defs = 0; + initpredefworkers(); + parse(code, size); + num_workers = deflist[0].num_workers; + num_wires = deflist[0].num_wires; + } +}*/ + +