]> git.sur5r.net Git - c128-kasse/commitdiff
Fix format_euros()
authorJakob Haufe <sur5r@sur5r.net>
Sat, 4 Nov 2017 23:47:54 +0000 (00:47 +0100)
committerJakob Haufe <sur5r@sur5r.net>
Sun, 5 Nov 2017 13:24:34 +0000 (14:24 +0100)
This fixes two related issues:
- Total amount reaching 327,67 EUR does no longer result in negativ numbers
- Total amount less than 0 EUR gets calculated and displayed correctly (but
  not across reloads yet)

fixes #36

include/config.h
include/general.h
src/config.c
src/general.c
src/kasse.c

index 4dd7fcc9f71f0bfe93cb6e41121060352503611f..2e2bcd802d586a87e3241642d3f6a77e61ec76e4 100644 (file)
@@ -9,8 +9,8 @@
 #define CREDITS_PER_PAGE 10
 
 /* Eingenommes Geld in Cent */
-extern unsigned long int money;
-extern unsigned long int items_sold;
+extern int32_t money;
+extern int32_t items_sold;
 extern BYTE printer_port;
 
 /* Datenstruktur der verkauften Einträge */
index 4b7c99ba502db45d8be450fb2c22f3d42ec0d861..0aec044f13f85f85876e3da64c8769770272c271 100644 (file)
@@ -19,7 +19,7 @@ int16_t cget_number(int16_t default_val);
 void cget_return(void);
 uint8_t cget_nickname(char *buf, uint8_t len);
 char retry_or_quit(void);
-char *format_euro(char *s, int maxlen, int cent);
+char *format_euro(char *s, int maxlen, int32_t cent);
 void c128_perror(BYTE, char *);
 extern BYTE _oserror;
 
@@ -66,9 +66,9 @@ extern BYTE _oserror;
 
 #define VIDEOMODE (((*(BYTE *)0xD7) == 0x80) ? 80 : 40)
 
-/* "999,99€" */
-#define EUR_FORMAT "%3d,%02d" EURSYM
-#define EUR_FORMAT_MINLEN 7
+/* "-999,99€" */
+#define EUR_FORMAT "%3ld,%02lu" EURSYM
+#define EUR_FORMAT_MINLEN 8
 
 /* because there is no macro expansion when stringifying, we need to use two
  * levels of macros to stringify the value of a macro (for example
index 6d447a740e8e0385bbe24729fe24f6a35a4b001d..0e235f356c6213311ffc28a86939fd9901004b14 100644 (file)
@@ -23,8 +23,8 @@
  */
 unsigned char __fastcall__ _sysremove(const char *name);
 
-unsigned long int money = 0;
-unsigned long int items_sold = 0;
+int32_t money = 0;
+int32_t items_sold = 0;
 BYTE printer_port = 4;
 static bool items_exists = false;
 static bool credits_exists = false;
@@ -88,7 +88,8 @@ void load_items(void) {
     cbm_load("items", (BYTE)8, &status);
     for (c = 0; c < status.num_items; c++) {
       items_sold += status.status[c].times_sold;
-      money += (status.status[c].price * status.status[c].times_sold);
+      money += (((int32_t)status.status[c].price) *
+                ((int32_t)status.status[c].times_sold));
     }
   } else
     memset(&status, 0, sizeof(struct status_array_t));
index 537c833aeb2348591fb9b5988b397c2d7175e6ec..10d715d62a0c4698079fa82db7b8fb32b0f04371 100644 (file)
@@ -215,8 +215,11 @@ char retry_or_quit(void) {
   return *c;
 }
 
-char *format_euro(char *s, int maxlen, int cent) {
-  if (snprintf(s, maxlen, EUR_FORMAT, cent / 100, cent % 100) > maxlen)
+char *format_euro(char *s, int maxlen, int32_t cent) {
+  int32_t euros, cents;
+  euros = cent / 100;
+  cents = abs(cent % 100);
+  if (snprintf(s, maxlen, EUR_FORMAT, euros, cents) > maxlen)
     return NULL;
   return s;
 }
index d5426c2cdae47b15db30141f5fd15cae3d191c2e..f063a97dd3eeb5068d6acbcc5aa40df90563bc57 100644 (file)
@@ -46,7 +46,7 @@ static void print_screen(void) {
   clrscr();
   if (format_euro(profit, sizeof(profit), money) == NULL) {
     cprintf("Einnahme %ld konnte nicht umgerechnet werden\r\n", money);
-    profit[0]='\0';
+    profit[0] = '\0';
   }
   textcolor(TC_CYAN);
   cprintf("C128-Kassenprogramm (phil_fry, sECuRE, sur5r, mxf) " GV "\r\n");
@@ -109,8 +109,8 @@ static void print_screen(void) {
  * Prints a line and logs it to file. Every line can be at max 80 characters.
  *
  */
-static void print_log(char *name, int item_price, int einheiten, char *nickname,
-                      char *rest) {
+static void print_log(char *name, int32_t item_price, int16_t einheiten,
+                      char *nickname, char *rest) {
   char *time = get_time();
   uint8_t n;
   char price[EUR_FORMAT_MINLEN + 1];
@@ -135,9 +135,9 @@ static void print_log(char *name, int item_price, int einheiten, char *nickname,
         "%8s - "
         /*  Eintragname (= Getränk) -- 9-stellig + 3 */
         "%-" xstr(MAX_ITEM_NAME_LENGTH) "s - "
-        /*  Preis (in Cents) -- 7-stellig  + 3 */
+        /*  Preis (in Cents) -- 8-stellig  + 3 */
         "%" xstr(EUR_FORMAT_MINLEN) "s - "
-        /*  restguthaben (7-stellig) + 3 */
+        /*  restguthaben (8-stellig) + 3 */
         "%" xstr(EUR_FORMAT_MINLEN) "s - "
         /*  Anzahl -- 2-stellig + 3 */
         "%2d - "
@@ -158,10 +158,10 @@ static void print_log(char *name, int item_price, int einheiten, char *nickname,
 }
 
 /* dialog which is called for each bought item */
-static signed int buy(char *name, unsigned int price) {
+static signed int buy(char *name, int32_t price) {
   BYTE matches = 0;
   BYTE c, nickname_len;
-  int einheiten;
+  int16_t einheiten;
   char nickname[NICKNAME_MAX_LEN + 1];
   char rest[EUR_FORMAT_MINLEN + 1];
   struct credits_t *credit;
@@ -186,7 +186,7 @@ static signed int buy(char *name, unsigned int price) {
      * to NULL if no such credit could be found */
     credit = find_credit(nickname);
     if (credit != NULL) {
-      while ((signed int)credit->credit < ((signed int)price * einheiten)) {
+      while ((int32_t)credit->credit < (price * einheiten)) {
         if (format_euro(rest, sizeof(rest), credit->credit) == NULL) {
           cprintf("Preis %d konnte nicht umgerechnet werden\r\n",
                   credit->credit);