aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2015-05-11 21:43:48 -0400
committerFranklin Wei <git@fwei.tk>2015-05-11 21:43:48 -0400
commit36ac0cde6b9ab3ee6b34a58af13ce3a146514a4b (patch)
treebd337f8014d67d98bedaa29be347a860debf0160 /src
parentb4c20b3cc1f5429650f79a6fd95b5e3d5bc4d4e5 (diff)
downloadmarket-sim-36ac0cde6b9ab3ee6b34a58af13ce3a146514a4b.zip
market-sim-36ac0cde6b9ab3ee6b34a58af13ce3a146514a4b.tar.gz
market-sim-36ac0cde6b9ab3ee6b34a58af13ce3a146514a4b.tar.bz2
market-sim-36ac0cde6b9ab3ee6b34a58af13ce3a146514a4b.tar.xz
fix stuff
Diffstat (limited to 'src')
-rw-r--r--src/globals.h1
-rw-r--r--src/main.c128
2 files changed, 124 insertions, 5 deletions
diff --git a/src/globals.h b/src/globals.h
index 55c9994..a926f1e 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -25,4 +25,5 @@ struct player_t {
struct money_t cash;
uint portfolio_len;
struct stock_t *portfolio;
+ bool need_to_free_portfolio;
};
diff --git a/src/main.c b/src/main.c
index b153de5..afac4a7 100644
--- a/src/main.c
+++ b/src/main.c
@@ -137,14 +137,43 @@ int compare_stocks(const void *a, const void *b)
b1->symbol);
}
+static enum { OTHER = 0, LITTLE = 1, BIG = 2 } endianness;
+
ullong to_be64(ullong n)
{
- n = (n & 0x00000000FFFFFFFF) << 32 | (n & 0xFFFFFFFF00000000) >> 32;
- n = (n & 0x0000FFFF0000FFFF) << 16 | (n & 0xFFFF0000FFFF0000) >> 16;
- n = (n & 0x00FF00FF00FF00FF) << 8 | (n & 0xFF00FF00FF00FF00) >> 8;
+ if(BIG)
+ {
+ n = (n & 0x00000000FFFFFFFF) << 32 | (n & 0xFFFFFFFF00000000) >> 32;
+ n = (n & 0x0000FFFF0000FFFF) << 16 | (n & 0xFFFF0000FFFF0000) >> 16;
+ n = (n & 0x00FF00FF00FF00FF) << 8 | (n & 0xFF00FF00FF00FF00) >> 8;
+ }
return n;
}
+ullong to_sys64(ullong n)
+{
+
+ if(!endianness)
+ {
+ ulong test = 0x12345678;
+ uchar *ptr = &test;
+ if(*ptr == 0x12)
+ endianness = BIG;
+ else if(*ptr == 0x78)
+ endianness = LITTLE;
+ else
+ {
+ printf("FATAL: failed to detect system endianness!\n");
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ if(endianness == BIG)
+ return n;
+ else
+ return to_be64(n);
+}
+
/*** driver functions ***/
void buy_handler(struct player_t *player)
@@ -207,6 +236,7 @@ void buy_handler(struct player_t *player)
/* not found, add a new one */
player->portfolio_len += 1;
player->portfolio = realloc(player->portfolio, player->portfolio_len * sizeof(struct stock_t));
+ player->need_to_free_portfolio = true;
printf("sym: %s\n", sym);
printf("name: %s\n", name);
@@ -251,8 +281,15 @@ void save_handler(struct player_t *player)
for(uint i = 0; i < player->portfolio_len; ++i)
{
struct stock_t *stock = player->portfolio + i;
+
+ ullong be_symlen = to_be64(strlen(stock->symbol));
+ fwrite(&be_symlen, sizeof(be_symlen), 1, f);
fwrite(stock->symbol, strlen(stock->symbol) + 1, 1, f);
+
+ ullong be_namelen = to_be64(strlen(stock->fullname));
+ fwrite(&be_namelen, sizeof(be_namelen), 1, f);
fwrite(stock->fullname, strlen(stock->fullname) + 1, 1, f);
+
ullong be_count = to_be64(stock->count);
fwrite(&be_count, sizeof(be_count), 1, f);
}
@@ -280,6 +317,87 @@ void load_handler(struct player_t *player)
printf("Loading portfolio...\n");
+ if(player->need_to_free_portfolio)
+ free(player->portfolio);
+ player->portfolio_len = 0;
+
+ FILE *f = fopen(buf, "r");
+ char magic[6];
+ if(!f || fread(magic, 1, sizeof(magic), f) != 6 || memcmp(magic, "PORTv1", sizeof(magic)) != 0)
+ {
+ printf("FATAL: Failed to load save.");
+ exit(EXIT_FAILURE);
+ }
+
+ ullong cash;
+ if(fread(&cash, sizeof(cash), 1, f) != 1)
+ {
+ printf("cash: %llu\n", cash);
+ printf("FATAL: Failed to load save.");
+ exit(EXIT_FAILURE);
+ }
+ cash = to_sys64(cash);
+
+ player->cash.cents = cash;
+
+ printf("cash: %d\n", cash);
+
+ fflush(stdout);
+ do {
+ /* read portfolio data */
+
+ player->portfolio_len += 1;
+ player->portfolio = realloc(player->portfolio, player->portfolio_len * sizeof(struct stock_t));
+ player->need_to_free_portfolio = true;
+
+ ullong symlen;
+ if(fread(&symlen, sizeof(symlen), 1, f) != 1)
+ {
+ printf("FATAL: Save is corrupted (symbol length too short).\n");
+ exit(EXIT_FAILURE);
+ }
+ symlen = to_sys64(symlen);
+ char *sym = malloc(symlen + 1);
+ if(fread(sym, symlen + 1, 1, f) != 1)
+ {
+ printf("FATAL: Save is corrupted (symbol too short).\n");
+ exit(EXIT_FAILURE);
+ }
+
+ player->portfolio[player->portfolio_len - 1].symbol = sym;
+
+ ullong namelen;
+ if(fread(&namelen, sizeof(namelen), 1, f) != 1)
+ {
+ printf("FATAL: Save is corrupted (name length too short).\n");
+ exit(EXIT_FAILURE);
+ }
+ namelen = to_sys64(namelen);
+ char *name = malloc(namelen + 1);
+ if(fread(name, namelen + 1, 1, f) != 1)
+ {
+ printf("FATAL: Save is corrupted (name too short).\n");
+ exit(EXIT_FAILURE);
+ }
+
+ player->portfolio[player->portfolio_len - 1].fullname = name;
+
+ ullong count;
+ if(fread(&count, sizeof(count), 1, f) != 1)
+ {
+ printf("FATAL: Save is corrupted (count too short).\n");
+ exit(EXIT_FAILURE);
+ }
+ count = to_sys64(count);
+
+ player->portfolio[player->portfolio_len - 1].count = count;
+
+ int junk = fgetc(f);
+ ungetc(junk, f);
+
+ } while (!feof(f) && !ferror(f));
+
+ update_handler(player);
}
void quit_handler(struct player_t *player)
@@ -303,7 +421,7 @@ int main(int argc, char *argv[])
while(1)
{
printf("\nYour portfolio:\n");
- printf("================================================================================");
+ printf("================================================================================\n");
ullong portfolio_value = 0;
@@ -342,7 +460,7 @@ int main(int argc, char *argv[])
const struct command_t commands[] = {
{ "[B]uy", "buy", buy_handler },
{ "[S]ell", "sell", sell_handler },
- { "[U]pdate stock prices", "update", update_handler },d
+ { "[U]pdate stock prices", "update", update_handler },
{ "[W]rite portfolio", "write", save_handler },
{ "[L]oad portfolio", "load", load_handler },
{ "[Q]uit", "quit", quit_handler },