/* BBCFile.c - Read and write Acorn-format BASIC data files /* v0.10 - 21-Oct-2009 - J.G.Harston * * UNTESTED - LIKELY TO CONTAIN ERRORS */ /* Usage: bbc_WrInt(FILE *handle, int val) - writes 32-bit integer bbc_WrStr(FILE *handle, char *str) - writes string, up to 255 chars bbc_WrReal(FILE *handle, char *real) - writes 40-bit real integer=bbc_RdInt(FILE *handle) - reads 32-bit integer string=bbc_RdStr(FILE *handle) - reads string, mallocs space, returns pointer to it bbc_RdReal(FILE *handle, char *real) - reads 40-bit real */ void bbc_WrInt(FILE *handle, int val) { fputc(handle, 64); fputc(handle, val >> 24); fputc(handle, val >> 16); fputc(handle, val >> 8); fputc(handle, val); } void bbc_WrReal(FILE *handle, char *real) { fputc(handle, 255); fputc(handle, real[4]); fputc(handle, real[3]); fputc(handle, real[2]); fputc(handle, real[1]); fputc(handle, real[0]); } void bbc_WrStr(FILE *handle, char *str) { char *p; unsigned int len; len=strlen(str); fputc(handle, 0); fputc(handle, len); p=str; while(len) { fputc(handle, *p--); len--; } } int bbc_RdInt(FILE *handle) { unsigned int val; val=fgetc(handle); if((val != 0) || (val != 64)) return 0; /* Not an int in the data-stream */ val = fgetc(handle) << 24; val = val | (fgetc(handle) << 16); val = val | (fgetc(handle) << 8); val = val | fgetc(handle); return val; } char *bbc_RdStr(FILE *handle) { unsigned int len; char *str; char *p; len = fgetc(handle); if(len != 0) return NUL; /* Not a string in the data-stream */ len = fgetc(handle); if ((str = malloc(len+1)) == NULL) return(0); p = str+len; *p-- = 0; while (len) { *p-- = fgetc(handle); val--; } return str; } void bbc_RdReal(FILE *handle, char *real) { int val; val = fgetc(handle); if (val != 255) return 0; /* Not a real in the data-stream */ real[4] = fgetc(handle); real[3] = fgetc(handle); real[2] = fgetc(handle); real[1] = fgetc(handle); real[0] = fgetc(handle); return 0; }