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 | |
| 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')
| -rw-r--r-- | src/globals.h | 45 | ||||
| -rw-r--r-- | src/load.c | 50 | ||||
| -rw-r--r-- | src/main.c | 4 | ||||
| -rw-r--r-- | src/save.c | 26 |
4 files changed, 96 insertions, 29 deletions
diff --git a/src/globals.h b/src/globals.h index 60cd40c..c336aa4 100644 --- a/src/globals.h +++ b/src/globals.h @@ -80,39 +80,38 @@ struct command_t { }; /*** prototypes ***/ -void cleanup(void); -int compare_stocks(const void*, const void*); -void all_lower(char*); -void all_upper(char*); + +void do_menu(struct player_t*, const struct command_t*, uint len, const char *prompt); bool get_stock_info(char *sym, struct money_t*, char **name); -uint64_t to_sys64(uint64_t); -uint64_t to_be64(uint64_t); -uint32_t to_sys32(uint32_t); -uint32_t to_be32(uint32_t); -uint16_t to_sys16(uint16_t); -uint16_t to_be16(uint16_t); +char *csv_read(char**); +char *read_string(void); +char *read_ticker(void); +int compare_stocks(const void*, const void*); struct stock_t *find_stock(struct player_t*, char*); +uint parse_args(struct player_t*, int argc, char *argv[]); +uint16_t to_be16(uint16_t); +uint16_t to_sys16(uint16_t); +uint32_t to_be32(uint32_t); +uint32_t to_sys32(uint32_t); +uint64_t to_be64(uint64_t); +uint64_t to_sys64(uint64_t); +ullong read_int(void); void add_hist(struct stock_t*, enum history_action, ullong count); +void all_lower(char*); +void all_upper(char*); +void cleanup(void); +void load_portfolio(struct player_t*, const char*); void print_history(struct stock_t*); -char *read_ticker(void); -char *read_string(void); -ullong read_int(void); void print_usage(int argc, char *argv[]); void print_version(void); -uint parse_args(struct player_t*, int argc, char *argv[]); -char *csv_read(char**); -void load_portfolio(struct player_t*, const char*); - void buy_handler(struct player_t*); -void sell_handler(struct player_t*); void info_handler(struct player_t*); -void update_handler(struct player_t*); -void save_handler(struct player_t*); void load_handler(struct player_t*); -void quit_handler(struct player_t*); void print_handler(struct player_t*); - -void do_menu(struct player_t*, const struct command_t*, uint len, const char *prompt); +void quit_handler(struct player_t*); +void save_handler(struct player_t*); +void sell_handler(struct player_t*); +void update_handler(struct player_t*); #endif @@ -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); @@ -33,8 +33,8 @@ int main(int argc, char *argv[]) { "[P]rint portfolio", "print", print_handler }, { "[U]pdate stock prices", "update", update_handler }, { "Stock [i]nfo", "info", info_handler }, - { "[W]rite portfolio", "write", save_handler }, - { "[L]oad portfolio", "load", load_handler }, + { "[L]oad portfolio from disk", "load", load_handler }, + { "[W]rite portfolio to disk", "write", save_handler }, { "[Q]uit", "quit", quit_handler }, }; @@ -1,9 +1,15 @@ #include "globals.h" -/* NOTE: integers are represented internally by long long ints, but in the save they are always 64 bits */ +/* NOTE: integers are represented internally as long long ints, but in the save they are always 64 bits */ + +static uint64_t cksum; + +#define ADD_CKSUM(x) (cksum += (x*x) + 1) static bool write_be64(FILE *f, uint64_t n) { + ADD_CKSUM(n); + n = to_be64(n); if(fwrite(&n, sizeof(n), 1, f) != 1) return false; @@ -12,6 +18,16 @@ static bool write_be64(FILE *f, uint64_t n) static bool write_be32(FILE *f, uint32_t n) { + ADD_CKSUM(n); + + n = to_be32(n); + if(fwrite(&n, sizeof(n), 1, f) != 1) + return false; + return true; +} + +static bool write_be32_noupdate(FILE *f, uint32_t n) +{ n = to_be32(n); if(fwrite(&n, sizeof(n), 1, f) != 1) return false; @@ -20,6 +36,8 @@ static bool write_be32(FILE *f, uint32_t n) static bool write_be16(FILE *f, uint16_t n) { + ADD_CKSUM(n); + n = to_be16(n); if(fwrite(&n, sizeof(n), 1, f) != 1) return false; @@ -28,6 +46,8 @@ static bool write_be16(FILE *f, uint16_t n) static bool write_int8(FILE *f, uint8_t n) { + ADD_CKSUM(n); + if(fwrite(&n, sizeof(n), 1, f) != 1) return false; return true; @@ -44,6 +64,8 @@ void save_handler(struct player_t *player) free(filename); + cksum = 0; + const char *magic = "PORTv2"; fwrite(magic, strlen(magic), 1, f); @@ -78,6 +100,8 @@ void save_handler(struct player_t *player) hist = hist->next; } + + write_be32_noupdate(f, cksum); } fclose(f); |