#include #include #include "cards.h" static void put16(unsigned short int v, FILE *f) { putc((v>>8)&0xff,f); putc(v&0xff,f); } void card_allocdeck(DECK *d) { d->cmap = malloc(d->ncol*sizeof(*d->cmap)); d->face_c = malloc(CARD_C_INDEX(d,CARD_XDECK)); d->back_c = malloc(CARD_C_INDEX(d,d->nbacks)); d->face_bw = malloc(CARD_BW_INDEX(d,CARD_XDECK)); d->back_bw = malloc(CARD_BW_INDEX(d,d->nbacks)); } void card_freedeck(DECK *d) { free(d->cmap); free(d->face_c); free(d->back_c); free(d->face_bw); free(d->back_bw); } const char *card_savedeck(FILE *f, const DECK *d) { int i; if (ferror(f)) return("previous error writing to file"); if (d->ncol > 255) return("deck uses too many colours"); if (d->nbacks > 255) return("deck has too many back designs"); if (d->xsize > 255) return("deck X size too large"); if (d->ysize > 255) return("deck Y size too large"); putc(0,f); putc(d->ncol,f); putc(d->nbacks,f); putc(d->xsize,f); putc(d->ysize,f); for (i=0;incol;i++) { put16(d->cmap[i][0],f); put16(d->cmap[i][1],f); put16(d->cmap[i][2],f); } fwrite(d->back_bw,1,CARD_BW_INDEX(d,d->nbacks),f); fwrite(d->face_bw,1,CARD_BW_INDEX(d,CARD_XDECK),f); fwrite(d->back_c,1,CARD_C_INDEX(d,d->nbacks),f); fwrite(d->face_c,1,CARD_C_INDEX(d,CARD_XDECK),f); fflush(f); if (ferror(f)) return("error writing to file"); return(0); } const char *card_loaddeck(FILE *f, DECK *d) { __label__ unxerr; unsigned char c; unsigned char c2; int i; int j; unsigned char get(void) { int v; v = getc(f); if (v == EOF) goto unxerr; return(v); } if (0) { unxerr:; return(ferror(f)?"unexpected error reading file":"unexpected EOF reading file"); } c = get(); if (c != 0) return("unrecognized file version"); c = get(); if (c > CARD_MAX_NCOL) return("file uses too many colours"); d->ncol = c; c = get(); if (c > CARD_MAX_NBACKS) return("file uses too many back designs"); d->nbacks = c; c = get(); if (c > CARD_MAX_XSIZE) return("file X size is too large"); d->xsize = c; c = get(); if (c > CARD_MAX_YSIZE) return("file Y size is too large"); d->ysize = c; card_allocdeck(d); for (i=0;incol;i++) { for (j=0;j<3;j++) { c = get(); c2 = get(); d->cmap[i][j] = (c * 256) + c2; } } fread(d->back_bw,1,CARD_BW_INDEX(d,d->nbacks),f); fread(d->face_bw,1,CARD_BW_INDEX(d,CARD_XDECK),f); fread(d->back_c,1,CARD_C_INDEX(d,d->nbacks),f); fread(d->face_c,1,CARD_C_INDEX(d,CARD_XDECK),f); if (ferror(f)) return("error reading from file"); if (feof(f)) return("unexpected EOF reading from file"); return(0); }