#include "skeleton.h" #include #include #include FILE * ptr = NULL; char f[DSIZE+FCHARS] = "",*file = &f[0]; struct ReqFileRequester MyFileReqStruct; char filename[FCHARS] = ""; char directoryname[DSIZE] = ""; BOOL filerequest(void) { BOOL result; file[0] = 0; MyFileReqStruct.PathName = file; MyFileReqStruct.Dir = directoryname; MyFileReqStruct.File = filename; MyFileReqStruct.Flags = FRQCACHINGM; MyFileReqStruct.dirnamescolor = 2; MyFileReqStruct.devicenamescolor = 2; result = FileRequester(&MyFileReqStruct); PurgeFiles(&MyFileReqStruct); if(filename[0]==0) return(FALSE); return(result); } void new(void) { obj_ptr frame,next,hold; frame = framehead; while(frame!=NULL) { next = frame->next; while(frame!=NULL) { hold = frame->framedown; if(frame->image!=NULL) deleteline(frame->image); if(frame->skeleton!=NULL) deleteline(frame->skeleton); if(frame->outline!=NULL) deleteline(frame->outline); free(frame,sizeof(struct object)); frame = hold; } frame = next; } /* adjust global variables */ framehead = makeobject(); } void writeline(line_ptr line) { /* not too sure what will happen to structures with 0 pts */ while(line!=NULL) { fwrite((char *)line,sizeof(struct line),1,ptr); if((line->pts!=NULL) && (line->number!=0)) fwrite((char *)line->pts,sizeof(struct pts),line->number,ptr); line=line->next; } } line_ptr readline(void) { line_ptr first,seg,prev; /* not too sure what will happen to structures with 0 pts */ prev = NULL; seg=(line_ptr)malloc(sizeof(struct line)); first = seg; do { if(fread((char *)seg,sizeof(struct line),1,ptr)==0) { free(seg,sizeof(struct line)); if(prev!=NULL) prev->next = NULL; if(first==seg) return(NULL); else return(first); } if((seg->pts!=NULL) && (seg->number!=0)) { seg->pts=(struct pts *)malloc(sizeof(struct pts)*POINTS*((seg->number-1)/POINTS+1)); if(fread((char *)seg->pts,sizeof(struct pts),seg->number,ptr)!=seg->number) { free(seg->pts,sizeof(struct pts)*POINTS*((seg->number-1)/POINTS+1)); seg->pts = NULL; seg->number = 0; seg->next = NULL; return(first); } if(seg->number==1) { seg->pts->p[1][0] = seg->pts->p[0][0]; seg->pts->p[1][1] = seg->pts->p[0][1]; } } else { seg->pts = NULL; seg->number = 0; } if(seg->next!=NULL) seg->next=(line_ptr)malloc(sizeof(struct line)); prev = seg; seg = seg->next; } while(seg!=NULL); return(first); } void writeobject(obj_ptr object) { if(object==NULL) return; fwrite((char *)object,sizeof(struct object),1,ptr); if(((object->entry&IMAGE)!=0) && (object->image!=NULL)) { writeline(object->image); } if(((object->entry&SKELETON)!=0) && (object->skeleton!=NULL)) { writeline(object->skeleton); } if(((object->entry&XOUTLINE)!=0) && (object->outline!=NULL)) { writeline(object->outline); } } obj_ptr readobject(void) { obj_ptr object; object = makeobject(); /* clear things up */ if(fread((char *)object,sizeof(struct object),1,ptr)==0) { free(object,sizeof(struct object)); return(NULL); } if(((object->entry&IMAGE)!=0) && (object->image!=NULL)) object->image = readline(); else object->image = NULL; if(((object->entry&SKELETON)!=0) && (object->skeleton!=NULL)) object->skeleton = readline(); else object->skeleton = NULL; if(((object->entry&XOUTLINE)!=0) && (object->outline!=NULL)) object->outline = readline(); else object->outline = NULL; return(object); } void writechain(obj_ptr chain) { /* writes first and any subsequents with entry flags*/ obj_ptr next,hold; int count; while(chain!=NULL) { next = chain->next; hold = chain->next; count = 1; while((next!=NULL) && (next->entry==0)) { next = next->next; count++; } if(next==NULL) count = 0; chain->next = (obj_ptr)count; /* store number of frames to next */ writeobject(chain); chain->next = hold; chain = next; } } obj_ptr readchain(void) { /* writes first and any subsequents with entry flags*/ obj_ptr first, object,next; int count; object = readobject(); first = object; while(object!=NULL) { count = (int)object->next; object->frameup=object->framedown=NULL; if(count!=0) { next = readobject(); object->next = NULL; addobject(object,next,count); } else next = NULL; object = next; } return(first); } void save(void) { obj_ptr chain,frame; int count; ptr = fopen(file,"w"); if(ptr==NULL) return; frame = framehead; count = 0; while(frame!=NULL) { chain = frame->framedown; while(chain!=NULL) { if(chain->prev==NULL) { chain->prev = (obj_ptr)count; writechain(chain); } chain = chain->framedown; } frame = frame->next; count++; } fclose(ptr); } void load(void) { obj_ptr chain,frame; int count,pos; ptr = fopen(file,"r"); if(ptr==NULL) return; new(); count = 0; /* 1 frame has header */ chain = readchain(); while(chain!=NULL) { pos = (int)chain->prev; chain->prev = NULL; if(pos>count) { addobject(framehead,makeobject(),pos); count = pos; } frame = framehead; for(;pos>0;pos--) frame = frame->next; addchain(frame,chain); chain = readchain(); } fclose(ptr); }