]> git.sur5r.net Git - c128-kasse/commitdiff
change ad-hoc number input code to use cget_number()
authorMaik Fischer <maikf@qu.cx>
Sat, 28 Oct 2017 10:35:26 +0000 (12:35 +0200)
committerMaik Fischer <maikf@qu.cx>
Mon, 30 Oct 2017 10:10:27 +0000 (11:10 +0100)
include/general.h
src/credit_manager.c
src/general.c
src/itemz.c
src/kasse.c

index e07176eadf8cfe05fbc359bfb2cc860af7470570..413fa46bc5ac885b0933fcee3e5155622929049b 100644 (file)
@@ -13,6 +13,7 @@ input_terminator_t get_input_terminated_by(input_terminator_mask_t terminators,
                                            char *out, BYTE outlen);
 char *get_input(void);
 BYTE cgetn_input(char *s, BYTE len);
+int16_t cget_number(int16_t default_val);
 void cget_return(void);
 char retry_or_quit(void);
 char *format_euro(char *s, int maxlen, int cent);
index 6590f85542ef1ac5952db65c10f8d25fab51510f..6dbae85d23fa48fa5f49a32a7a551e1b8b704dc2 100644 (file)
@@ -64,7 +64,6 @@ struct credits_t *find_credit(char *name) {
 
 void deposit_credit(char *nickname) {
   char *time = get_time();
-  char *input;
   struct credits_t *credit;
   unsigned int deposit;
 
@@ -72,8 +71,7 @@ void deposit_credit(char *nickname) {
     return; // cannot find named credit
 
   cprintf("\r\nEinzahlung in Cent:\r\n");
-  if ((input = get_input()) == NULL || *input == '\0' ||
-      (deposit = atoi(input)) == 0)
+  if (cget_number(0) == 0)
     return;
 
   credit->credit += deposit;
@@ -84,7 +82,7 @@ void deposit_credit(char *nickname) {
 }
 
 static void new_credit(void) {
-  char *input, *name;
+  char name[NICKNAME_MAX_LEN + 1];
   char *time;
   int credit;
 
@@ -97,12 +95,11 @@ static void new_credit(void) {
 
   clrscr();
   cprintf("\rNickname (max. 10 Zeichen):\r\n");
-  if ((input = get_input()) == NULL || *input == '\0')
+  if (cgetn_input(name, sizeof(name)) == 0)
     return;
-  name = strdup(input);
+
   cprintf("\r\nGuthaben in Cents:\r\n");
-  if ((input = get_input()) == NULL || *input == '\0' ||
-      (credit = atoi(input)) == 0)
+  if ((credit = cget_number(0)) == 0)
     return;
   strncpy(credits.credits[credits.num_items].nickname, name, NICKNAME_MAX_LEN);
   credits.credits[credits.num_items].credit = credit;
index 91318aa9faa51269439ab846bd7f3b1000aa614a..df0c2c6d70ef58373ed74fa63a955b9ebb943c22 100644 (file)
@@ -8,6 +8,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <conio.h>
+#include <stdint.h>
 
 #include "general.h"
 #include "vdc_patch_charset.h"
@@ -72,14 +73,62 @@ BYTE cgetn_input(char *s, BYTE len) {
   return strlen(s);
 }
 
-void cget_return() {
-  BYTE c;
+int16_t cget_number(int16_t default_val) {
+  char c;
+  int x, y;
+  uint8_t num_chars = 0;
+  char buf[6] = {0, 0, 0, 0, 0, 0};
+  int i = 0;
+  x = wherex();
+  y = wherey();
   while (1) {
     c = cgetc();
-    if (c == PETSCII_CR) {
-      return;
+
+    /* Enter */
+    if (c == PETSCII_CR)
+      break;
+
+    /* Backspace */
+    if (c == PETSCII_DEL) {
+      if (i == 0)
+        continue;
+      buf[--i] = '\0';
+      cputcxy(x + i, y, ' ');
+      gotoxy(x + i, y);
+      continue;
+    }
+
+    /* Abort */
+    if (c == PETSCII_ESC) {
+      return default_val;
     }
+
+    /* end of buffer? wait for user to press RETURN */
+    if (i == (sizeof(buf) - 1))
+      continue;
+
+    /* match either numbers or iff it's the first entered char a minus sign */
+    if ((c >= PETSCII_0 && c <= PETSCII_9) || (c == '-' && i == 0)) {
+      buf[i] = c;
+      ++i;
+      ++num_chars;
+      cputc(c);
+    }
+  }
+
+  if (num_chars == 0) {
+    return default_val;
+  } else if ((num_chars == 1) && (c == '-')) {
+    return default_val;
+  }
+
+  return atoi(buf);
+}
+
+void cget_return() {
+  while (cgetc() != PETSCII_CR) {
   }
+  return;
 }
 
 char retry_or_quit(void) {
index 7751b68e9055434a88f6666baa8a7d20d75e732b..da2b7bd24ff9b47410f9f78975729263d08e6263 100644 (file)
@@ -22,7 +22,7 @@ static void itemz_print_screen(void) {
   char buffer[10];
 
   clrscr();
-  cprintf("itemz (phil_fry, sECuRE, sur5r) v:" GV "\r\n\r\n");
+  cprintf("itemz (phil_fry, sECuRE, sur5r, mxf) v:" GV "\r\n\r\n");
   cprintf("Datei: ITEMS\r\n\r\n");
   for (i = 0; i < max(status.num_items, 15); i++) {
     if (format_euro(buffer, 10, status.status[i].price) != buffer) {
@@ -37,35 +37,32 @@ static void itemz_print_screen(void) {
 }
 
 static void new_item(void) {
-  char *input, *name;
-  int price;
+  char name[MAX_ITEM_NAME_LENGTH + 1];
+  int price, times_sold;
 
   if (status.num_items == MAX_ITEMS) {
     cprintf("\rEs ist bereits die maximale Anzahl an Eintraegen erreicht, "
             "druecke RETURN...\r\n");
-    input = get_input();
+    cget_return();
     return;
   }
 
   cprintf("\rName des Eintrags:\r\n");
-  if ((input = get_input()) == NULL || *input == '\0')
+  if (cgetn_input(name, sizeof(name)) == 0)
     return;
-  name = strdup(input);
   cprintf("\r\nPreis in Cents:\r\n");
-  if ((input = get_input()) == NULL || *input == '\0' ||
-      (price = atoi(input)) == 0)
+  if ((price = cget_number(0)) <= 0)
     return;
   cprintf("\r\nWie oft schon verkauft? [0] \r\n");
-  if ((input = get_input()) == NULL)
+  if ((times_sold = cget_number(0)) < 0)
     return;
   memset(status.status[status.num_items].item_name, '\0',
          MAX_ITEM_NAME_LENGTH + 1);
   strncpy(status.status[status.num_items].item_name, name,
           MAX_ITEM_NAME_LENGTH);
   status.status[status.num_items].price = price;
-  status.status[status.num_items].times_sold = atoi(input);
+  status.status[status.num_items].times_sold = times_sold;
   status.num_items++;
-  free(name);
 }
 
 static void _delete_item(BYTE num) {
@@ -75,17 +72,17 @@ static void _delete_item(BYTE num) {
 }
 
 static void delete_item(void) {
-  char *input;
   BYTE num, last;
 
   cprintf("\r Welcher Eintrag soll geloescht werden?\r\n");
-  if ((input = get_input()) == NULL || *input == '\0')
+  if ((num = cget_number(-1)) < 0)
     return;
-  num = atoi(input);
+
   if (status.num_items > 1) {
     /* Swap last item with this one and delete the last one to avoid holes */
     last = (status.num_items - 1);
-    strcpy(status.status[num].item_name, status.status[last].item_name);
+    strncpy(status.status[num].item_name, status.status[last].item_name,
+            MAX_ITEM_NAME_LENGTH);
     status.status[num].price = status.status[last].price;
     status.status[num].times_sold = status.status[last].times_sold;
     _delete_item(last);
index b59d44d812d75309fcac9b4c3b64128792bbabb0..91b4268c9cd99b59423c48962d0fbd5597688652 100644 (file)
@@ -141,10 +141,8 @@ 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[10];
@@ -155,42 +153,8 @@ static signed int buy(char *name, unsigned int price) {
 
   clrscr();
   cprintf("Wieviel Einheiten \"%s\"? [1] \r\n", name);
-  x = wherex();
-  y = wherey();
-  while (1) {
-    /* Buffer-Ende erreicht? */
-    if (i == (sizeof(entered) - 1))
-      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 == PETSCII_ESC) {
-      cprintf("Kauf abgebrochen, dr" uUML "cke RETURN...\r\n");
-      cget_return();
-      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 "
@@ -345,9 +309,6 @@ 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 name[MAX_ITEM_NAME_LENGTH + 1];
   int price;
 
@@ -357,23 +318,14 @@ void buy_custom(void) {
     return;
 
   cprintf("\r\nWie teuer ist \"%s\" (in cents)?\r\n", name);
-  while (1) {
-    c = cgetc();
-    if (c == PETSCII_CR)
-      break;
-    cputc(c);
-    if (c == PETSCII_ESC) {
-      cprintf("Kauf abgebrochen, dr" uUML "cke RETURN...\r\n");
-      cget_return();
-      return;
-    } else if (c == '-' && i == 0)
-      negative = -1;
-    else if (c >= PETSCII_0 && c <= PETSCII_9)
-      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);
 }