-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, nickname_len;
- int einheiten;
- char *input;
- char nickname[11];
- char rest[11];
- struct credits_t *credit;
-
- memset(rest, ' ', sizeof(rest));
- rest[8] = '\0';
-
- clrscr();
- cprintf("Wieviel Einheiten \"%s\"? [1] \r\n", name);
- while (1) {
- c = cgetc();
- if (c == 13)
- break;
- cputc(c);
- if (c == 27) {
- cprintf("Kauf abgebrochen, druecke RETURN...\r\n");
- get_input();
- return 1;
- } else if (c == '-' && i == 0)
- negative = -1;
- else if (c > 47 && c < 58)
- entered[i++] = c;
- }
- einheiten = atoi(entered) * negative;
-
- toggle_videomode();
- cprintf("\r\n *** VERKAUF ***\r\n\r\n");
- cprintf("%dx %s", einheiten, name);
- toggle_videomode();
-
- cprintf("\r\nAuf ein Guthaben kaufen? Wenn ja, Nickname eingeben:\r\n");
- input = get_input();
- strncpy(nickname, input, 11);
- if (*nickname != '\0') {
- toggle_videomode();
- cprintf(" fuer %s\r\n", nickname);
- toggle_videomode();
- }
-
- if (*nickname != '\0' && *nickname != 32) {
- 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) {
- cprintf("Preis %d konnte nicht umgerechnet werden\r\n", credit->credit);
- exit(1);
- }
- cprintf("\r\n%s hat nicht genug Geld (%s). e) einzahlen a) abbruch \r\n", nickname, rest);
- c = cgetc();
- if (c == 'e') {
- deposit_credit(nickname);
- } else {
- return 0;
- }
- }
- /* substract money */
- credit->credit -= (price * einheiten);
-
- if (format_euro(rest, 10, credit->credit) == NULL) {
- cprintf("Preis %d konnte nicht umgerechnet werden\r\n", credit->credit);
- exit(1);
- }
-
- textcolor(TC_LIGHT_GREEN);
- cprintf("\r\nVerbleibendes Guthaben fuer %s: %s. Druecke RETURN...\r\n",
- nickname, rest);
- textcolor(TC_LIGHT_GRAY);
- toggle_videomode();
- cprintf("\r\nDein Guthaben betraegt noch %s.\r\n", rest);
- toggle_videomode();
- get_input();
- matches++;
- } else {
- textcolor(TC_LIGHT_RED);
- cprintf("\r\nNickname nicht gefunden in der Guthabenverwaltung! Abbruch, druecke RETURN...\r\n");
- textcolor(TC_LIGHT_GRAY);
- get_input();
- return 0;
- }
- } else {
- /* Ensure that nickname is NULL if it's empty because it's used in print_log */
- *nickname = '\0';
- }
-
- money += price * einheiten;
- items_sold += einheiten;
- if (printing == 1)
- print_log(name, price, einheiten, nickname, rest);
-
- return einheiten;
+static signed int buy(char *name, int32_t price) {
+ BYTE matches = 0;
+ BYTE c, nickname_len;
+ int16_t einheiten;
+ char nickname[NICKNAME_MAX_LEN + 1];
+ char rest[EUR_FORMAT_MINLEN + 1];
+ struct credits_t *credit;
+
+ clrscr();
+ cprintf("Wieviel Einheiten \"%s\"? [1] \r\n", name);
+
+ einheiten = cget_number(1);
+
+ if (einheiten > 100 || einheiten < -100 || einheiten == 0) {
+ cprintf("\r\nEinheit nicht in [-100, 100] oder 0, Abbruch, dr" uUML "cke "
+ "RETURN...\r\n");
+ cget_return();
+ return 1;
+ }
+
+ cprintf("\r\nAuf ein Guthaben kaufen? Wenn ja, Nickname eingeben:\r\n");
+ nickname_len = cget_nickname(nickname, sizeof(nickname));
+
+ if (nickname_len && *nickname != '\0' && *nickname != PETSCII_SP) {
+ /* 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 ((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);
+ exit(1);
+ }
+ cprintf(
+ "\r\n%s hat nicht genug Geld (%s). e) einzahlen a) abbruch \r\n",
+ nickname, rest);
+ c = cgetc();
+ if (c == 'e') {
+ deposit_credit(nickname);
+ } else {
+ return 0;
+ }
+ }
+ /* substract money */
+ credit->credit -= (price * einheiten);
+
+ if (format_euro(rest, sizeof(rest), credit->credit) == NULL) {
+ cprintf("Preis %d konnte nicht umgerechnet werden\r\n", credit->credit);
+ exit(1);
+ }
+
+ textcolor(TC_LIGHT_GREEN);
+ cprintf("\r\nVerbleibendes Guthaben f" uUML "r %s: %s. Dr" uUML
+ "cke RETURN...\r\n",
+ nickname, rest);
+ textcolor(TC_LIGHT_GRAY);
+ 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);
+ cget_return();
+ return 0;
+ }
+ }
+
+ money += price * einheiten;
+ items_sold += einheiten;
+ if (printing == 1)
+ print_log(name, price, einheiten, nickname, rest);
+
+ return einheiten;