diff options
| author | Franklin Wei <git@fwei.tk> | 2015-05-21 21:38:24 -0400 |
|---|---|---|
| committer | Franklin Wei <git@fwei.tk> | 2015-05-21 21:38:24 -0400 |
| commit | ad01f507d1b35c656c781a50ba3445bca52ea1af (patch) | |
| tree | 508de0b44a6acfaa425ab27fed20efb7d99aa4df /src/load.c | |
| parent | 06c23ee7f9950c7fe6f8ffda137f0db437f7a92e (diff) | |
| download | market-sim-ad01f507d1b35c656c781a50ba3445bca52ea1af.zip market-sim-ad01f507d1b35c656c781a50ba3445bca52ea1af.tar.gz market-sim-ad01f507d1b35c656c781a50ba3445bca52ea1af.tar.bz2 market-sim-ad01f507d1b35c656c781a50ba3445bca52ea1af.tar.xz | |
add some amount of redundancy to save files
Diffstat (limited to 'src/load.c')
| -rw-r--r-- | src/load.c | 50 |
1 files changed, 47 insertions, 3 deletions
@@ -4,12 +4,21 @@ #define FAIL() exit(EXIT_FAILURE); +static uint32_t cksum; + +#define ADD_CKSUM(x) (cksum += (x*x) + 1) + uint64_t read_be64(FILE *f) { uint64_t n; if(fread(&n, sizeof(n), 1, f) != 1) FAIL(); - return to_sys64(n); + + n = to_sys64(n); + + ADD_CKSUM(n); + + return n; } uint32_t read_be32(FILE *f) @@ -17,7 +26,23 @@ uint32_t read_be32(FILE *f) uint32_t n; if(fread(&n, sizeof(n), 1, f) != 1) FAIL(); - return to_sys32(n); + + n = to_sys32(n); + + ADD_CKSUM(n); + + return n; +} + +uint32_t read_be32_nocheck(FILE *f) +{ + uint32_t n; + if(fread(&n, sizeof(n), 1, f) != 1) + FAIL(); + + n = to_sys32(n); + + return n; } uint16_t read_be16(FILE *f) @@ -25,7 +50,12 @@ uint16_t read_be16(FILE *f) uint16_t n; if(fread(&n, sizeof(n), 1, f) != 1) FAIL(); - return to_sys16(n); + + n = to_sys16(n); + + ADD_CKSUM(n); + + return n; } uint8_t read_int8(FILE *f) @@ -33,6 +63,9 @@ uint8_t read_int8(FILE *f) uint8_t n; if(fread(&n, sizeof(n), 1, f) != 1) FAIL(); + + ADD_CKSUM(n); + return n; } @@ -46,6 +79,8 @@ void load_portfolio(struct player_t *player, const char *filename) player->portfolio_len = 0; player->portfolio = NULL; + cksum = 0; + FILE *f = fopen(filename, "rb"); char magic[6]; @@ -112,6 +147,15 @@ void load_portfolio(struct player_t *player, const char *filename) hist = hist->next; } } + + uint32_t ck = read_be32_nocheck(f); + + if(ck != cksum) + { + printf("FATAL: bad checksum, file is corrupt.\n%d %d", ck, cksum); + exit(EXIT_FAILURE); + } + int junk = fgetc(f); ungetc(junk, f); |