#include #include #include #include #include #include "cards.h" int card_ncol; int card_nbacks; unsigned short int (*card_cmap)[3] = 0; unsigned char card_cards_color[CARD_XDECK][CARD_YSIZE][CARD_XSIZE]; unsigned char (*card_backs_color)[CARD_YSIZE][CARD_XSIZE] = 0; unsigned char card_cards_bw[CARD_XDECK][CARD_YSIZE][CARD_BW_XBYTES]; unsigned char (*card_backs_bw)[CARD_YSIZE][CARD_BW_XBYTES] = 0; static int Read(int fd, void *buf, int nb) { int left; int did; char *bp; left = nb; bp = buf; do { did = read(fd,bp,left); if (did < 0) return(-1); if (did == 0) break; left -= did; bp += did; } while (left > 0); return(nb-left); } #define Write write static int getcment(int fd, unsigned short int *ep) { unsigned char buf[6]; if (Read(fd,&buf[0],6) != 6) return(-1); ep[0] = (buf[0] << 8) | buf[1]; ep[1] = (buf[2] << 8) | buf[3]; ep[2] = (buf[4] << 8) | buf[5]; return(0); } static int putcment(int fd, unsigned short int *ep) { unsigned char buf[6]; buf[0] = ep[0] >> 8; buf[1] = ep[0] & 0xff; buf[2] = ep[1] >> 8; buf[3] = ep[1] & 0xff; buf[4] = ep[2] >> 8; buf[5] = ep[2] & 0xff; if (Write(fd,&buf[0],6) != 6) return(-1); return(0); } static int getbm_c(int fd, unsigned char (*bm)[CARD_XSIZE]) { if (Read(fd,bm,CARD_XSIZE*CARD_YSIZE) != CARD_XSIZE*CARD_YSIZE) return(-1); return(0); } static int putbm_c(int fd, unsigned char (*bm)[CARD_XSIZE]) { if (Write(fd,bm,CARD_XSIZE*CARD_YSIZE) != CARD_XSIZE*CARD_YSIZE) return(-1); return(0); } static int getbm_bw(int fd, unsigned char (*bm)[CARD_BW_XBYTES]) { if (Read(fd,bm,CARD_BW_XBYTES*CARD_YSIZE) != CARD_BW_XBYTES*CARD_YSIZE) return(-1); return(0); } static int putbm_bw(int fd, unsigned char (*bm)[CARD_BW_XBYTES]) { if (Write(fd,bm,CARD_BW_XBYTES*CARD_YSIZE) != CARD_BW_XBYTES*CARD_YSIZE) return(-1); return(0); } /* cards_c and cards_bw would be auto [][][], except that if they are then the stack takes too big a step and we drop core. */ int card_loaddeck(const char *path) { int errsave; int fd; unsigned char buf; int i; int ncol; int nbacks; unsigned short int (*cmap)[3]; unsigned char (*cards_c)[CARD_YSIZE][CARD_XSIZE]; unsigned char (*backs_c)[CARD_YSIZE][CARD_XSIZE]; unsigned char (*cards_bw)[CARD_YSIZE][CARD_BW_XBYTES]; unsigned char (*backs_bw)[CARD_YSIZE][CARD_BW_XBYTES]; errno = 0; cmap = 0; cards_c = 0; backs_c = 0; cards_bw = 0; backs_bw = 0; fd = open(path,O_RDONLY,0); if (fd < 0) goto err; if (Read(fd,&buf,1) != 1) goto err; ncol = buf; if (Read(fd,&buf,1) != 1) goto err; nbacks = buf; cmap = malloc(ncol*sizeof(*cmap)); if (cmap == 0) { errno = ENOMEM; goto err; } cards_c = malloc(CARD_XDECK*sizeof(*cards_c)); if (cards_c == 0) { errno = ENOMEM; goto err; } backs_c = malloc(nbacks*sizeof(*backs_c)); if (backs_c == 0) { errno = ENOMEM; goto err; } cards_bw = malloc(CARD_XDECK*sizeof(*cards_bw)); if (cards_bw == 0) { errno = ENOMEM; goto err; } backs_bw = malloc(nbacks*sizeof(*backs_bw)); if (backs_bw == 0) { errno = ENOMEM; goto err; } for (i=0;i= 0) close(fd); if (cmap) free(cmap); if (cards_c) free(cards_c); if (backs_c) free(backs_c); if (cards_bw) free(cards_bw); if (backs_bw) free(backs_bw); errno = errsave ? errsave : EIO; return(-1); } int card_savedeck(const char *path) { int fd; unsigned char buf; int i; int errsave; off_t len; if ( (card_ncol < 0) || (card_ncol > 255) || (card_nbacks < 0) || (card_nbacks > 255) ) { errno = EINVAL; return(-1); } fd = open(path,O_RDWR|O_CREAT,0666); if (fd < 0) goto err; buf = card_ncol; if (Write(fd,&buf,1) != 1) goto err; buf = card_nbacks; if (Write(fd,&buf,1) != 1) goto err; for (i=0;i= 0) close(fd); errno = errsave ? errsave : EIO; return(-1); }