]> git.sur5r.net Git - c128-kasse/blobdiff - src/kasse.c
kasse: allow starting up without a printer
[c128-kasse] / src / kasse.c
index 4bed5cf5f8380ec00aaf5348b3143250e5f58a6b..d6ffb486c3ed5931eb46dd3956cb9d9b102b514f 100644 (file)
@@ -4,7 +4,6 @@
  * See LICENSE for license information
  *
  */
-#define _IS_KASSE
 #include <stdio.h>
 #include <conio.h>
 #include <stdlib.h>
@@ -21,6 +20,7 @@
 #include "print.h"
 #include "version.h"
 #include "vdc_patch_charset.h"
+#include "globals.h"
 // drucker 4 oder 5
 // graphic 4,0,10
 
@@ -44,7 +44,7 @@ static void print_screen(void) {
   char *time = get_time();
   char profit[10];
   clrscr();
-  if (format_euro(profit, 10, money) == NULL) {
+  if (format_euro(profit, sizeof(profit), money) == NULL) {
     cprintf("Einnahme %ld konnte nicht umgerechnet werden\r\n", money);
     exit(1);
   }
@@ -126,7 +126,7 @@ static void print_log(char *name, int item_price, int einheiten, char *nickname,
      + 7 leerzeichen
      --> 48 zeichen
      */
-  if (format_euro(price, 10, item_price) == NULL) {
+  if (format_euro(price, sizeof(price), item_price) == NULL) {
     cprintf("Preis %d konnte nicht umgerechnet werden\r\n", item_price);
     exit(1);
   }
@@ -141,57 +141,20 @@ 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) {
-  int negative = 1;
-  char entered[5] = {'1', 0, 0, 0, 0};
-  BYTE i = 0, matches = 0;
-  BYTE c, x, y, nickname_len;
+  BYTE matches = 0;
+  BYTE c, nickname_len;
   int einheiten;
   char nickname[NICKNAME_MAX_LEN + 1];
-  char rest[11];
+  char rest[10];
   struct credits_t *credit;
 
   memset(nickname, '\0', sizeof(nickname));
-  memset(rest, ' ', sizeof(rest));
-  rest[8] = '\0';
+  memset(rest, '\0', sizeof(rest));
 
   clrscr();
   cprintf("Wieviel Einheiten \"%s\"? [1] \r\n", name);
-  x = wherex();
-  y = wherey();
-  while (1) {
-    /* Buffer-Ende erreicht? */
-    if (i == 4)
-      break;
-
-    c = cgetc();
-    /* Enter */
-    if (c == PETSCII_CR)
-      break;
-    /* Backspace */
-    if (c == PETSCII_DEL) {
-      if (i == 0)
-        continue;
-      entered[--i] = '\0';
-      cputcxy(x + i, y, ' ');
-      gotoxy(x + i, y);
-      continue;
-    }
-    if (c == 27) {
-      cprintf("Kauf abgebrochen, dr" uUML "cke RETURN...\r\n");
-      get_input();
-      return 1;
-    }
-    if (c == '-' && i == 0) {
-      negative = -1;
-      cputc(c);
-    } else if (c >= PETSCII_0 && c <= PETSCII_9) {
-      entered[i++] = c;
-      cputc(c);
-    }
 
-    /* Ungültige Eingabe (keine Ziffer), einfach ignorieren */
-  }
-  einheiten = atoi(entered) * negative;
+  einheiten = cget_number(1);
 
   if (einheiten > 100 || einheiten < -100 || einheiten == 0) {
     cprintf("\r\nEinheit nicht in [-100, 100] oder 0, Abbruch, dr" uUML "cke "
@@ -275,14 +238,14 @@ static signed int buy(char *name, unsigned int price) {
     }
   }
 
-  if (*nickname != '\0' && *nickname != 32) {
+  if (*nickname != '\0' && *nickname != PETSCII_SP) {
     nickname_len = strlen(nickname);
     /* go through credits and remove the amount of money or set nickname
      * 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)) {
-        if (format_euro(rest, 10, credit->credit) == NULL) {
+        if (format_euro(rest, sizeof(rest), credit->credit) == NULL) {
           cprintf("Preis %d konnte nicht umgerechnet werden\r\n",
                   credit->credit);
           exit(1);
@@ -300,7 +263,7 @@ static signed int buy(char *name, unsigned int price) {
       /* substract money */
       credit->credit -= (price * einheiten);
 
-      if (format_euro(rest, 10, credit->credit) == NULL) {
+      if (format_euro(rest, sizeof(rest), credit->credit) == NULL) {
         cprintf("Preis %d konnte nicht umgerechnet werden\r\n", credit->credit);
         exit(1);
       }
@@ -310,14 +273,14 @@ static signed int buy(char *name, unsigned int price) {
               "cke RETURN...\r\n",
               nickname, rest);
       textcolor(TC_LIGHT_GRAY);
-      get_input();
+      cget_return();
       matches++;
     } else {
       textcolor(TC_LIGHT_RED);
       cprintf("\r\nNickname nicht gefunden in der Guthabenverwaltung! Abbruch, "
               "dr" uUML "cke RETURN...\r\n");
       textcolor(TC_LIGHT_GRAY);
-      get_input();
+      cget_return();
       return 0;
     }
   } else {
@@ -337,7 +300,7 @@ static signed int buy(char *name, unsigned int price) {
 void buy_stock(BYTE n) {
   if (n >= status.num_items || status.status[n].item_name == NULL) {
     cprintf("FEHLER: Diese Einheit existiert nicht.\r\n");
-    get_input();
+    cget_return();
     return;
   }
 
@@ -346,38 +309,23 @@ void buy_stock(BYTE n) {
 }
 
 void buy_custom(void) {
-  BYTE c = 0, i = 0;
-  int negative = 1;
-  char entered[5] = {'1', 0, 0, 0, 0};
-  char *input, name[20];
+  char name[MAX_ITEM_NAME_LENGTH + 1];
   int price;
 
   clrscr();
-  memset(name, '\0', 20);
   cprintf("\r\nWas soll gekauft werden?\r\n");
-  input = get_input();
-  strncpy(name, input, 20);
-  if (*name == '\0')
+  if (cgetn_input(name, sizeof(name)) == 0)
     return;
 
   cprintf("\r\nWie teuer ist \"%s\" (in cents)?\r\n", name);
-  while (1) {
-    c = cgetc();
-    if (c == 13)
-      break;
-    cputc(c);
-    if (c == 27) {
-      cprintf("Kauf abgebrochen, dr" uUML "cke RETURN...\r\n");
-      get_input();
-      return;
-    } else if (c == '-' && i == 0)
-      negative = -1;
-    else if (c > 47 && c < 58)
-      entered[i++] = c;
-  }
-  price = atoi(entered) * negative;
 
-  cprintf("\r\n");
+  price = cget_number(0);
+
+  if (price == 0) {
+    cprintf("Kauf abgebrochen, dr" uUML "cke RETURN...\r\n");
+    cget_return();
+    return;
+  }
 
   buy(name, price);
 }
@@ -407,11 +355,17 @@ int main(void) {
   char *c;
   char *time;
 
+  init_globals();
+
   videomode(VIDEOMODE_80x25);
 
   /* clock CPU at double the speed (a whopping 2 Mhz!) */
   fast();
 
+  /* Manipulate the VDC with IRQs turned off.
+   * KERNALs default IRQ handler will also try to read the VDC status
+   * register, which could interfere with our code trying to read it.
+   */
   SEI();
   vdc_patch_charset();
   CLI();
@@ -454,7 +408,7 @@ int main(void) {
     print_screen();
     c = get_input();
     /* ...display dialogs eventually */
-    if (*c > 47 && *c < 58) {
+    if (*c >= PETSCII_0 && *c <= PETSCII_9) {
       /* if the input starts with a digit, we will interpret it as a number
        * for the item to be sold */
       buy_stock(atoi(c));
@@ -469,7 +423,7 @@ int main(void) {
       log_flush();
       cprintf("ok\r\nStatefile/Creditfile/Log gesichert, dr" uUML
               "cke RETURN...\r\n");
-      get_input();
+      cget_return();
     } else if (*c == 'g') {
       credit_manager();
     } else if (*c == 'z') {