aboutsummaryrefslogtreecommitdiff
path: root/src/load.c
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2015-05-21 21:38:24 -0400
committerFranklin Wei <git@fwei.tk>2015-05-21 21:38:24 -0400
commitad01f507d1b35c656c781a50ba3445bca52ea1af (patch)
tree508de0b44a6acfaa425ab27fed20efb7d99aa4df /src/load.c
parent06c23ee7f9950c7fe6f8ffda137f0db437f7a92e (diff)
downloadmarket-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.c50
1 files changed, 47 insertions, 3 deletions
diff --git a/src/load.c b/src/load.c
index fcb2147..526592e 100644
--- a/src/load.c
+++ b/src/load.c
@@ -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);