X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcredit_manager.c;h=37dd0b6961f16818ee51116c046ea80563fcb3cb;hb=a81ad6858d258c61e587b9c4b684c7755ee2572e;hp=d4caea7df6255455643883d1be9c965d9e1ef45c;hpb=5391e76a448825b4c687c1f47c3d8b71aa6b453a;p=c128-kasse diff --git a/src/credit_manager.c b/src/credit_manager.c index d4caea7..37dd0b6 100644 --- a/src/credit_manager.c +++ b/src/credit_manager.c @@ -1,6 +1,6 @@ -/* +/* * RGB2R-C128-Kassenprogramm - * (c) 2007-2008 phil_fry, sECuRE, sur5r + * © 2007-2009 phil_fry, sECuRE, sur5r * See LICENSE for license information * */ @@ -14,168 +14,181 @@ #include "kasse.h" #include "c128time.h" #include "print.h" +#include "version.h" +#include "vdc_patch_charset.h" static char *filter = NULL; static BYTE filter_len; static BYTE current_credits_page = 0; -static void credit_print_screen() { - BYTE i, pages; - char buffer[10]; - - clrscr(); - cprintf("itemz (phil_fry, sECuRE, sur5r)\r\n\r\n"); - pages = (credits.num_items / CREDITS_PER_PAGE); - if (current_credits_page > pages) - current_credits_page = pages; - cprintf("Datei: CREDITS (Seite %d von %d)\r\n\r\n", current_credits_page, pages); - for (i = (current_credits_page * CREDITS_PER_PAGE); i < credits.num_items && i < ((current_credits_page+1) * CREDITS_PER_PAGE); i++) { - if (filter == NULL || strncmp(credits.credits[i].nickname, filter, filter_len) == 0) { - if (format_euro(buffer, 10, credits.credits[i].credit) != buffer) { - cprintf("Error: Could not format credit %d\r\n", credits.credits[i].credit); - exit(1); - } - - cprintf("%d: %s: %s\r\n", i, credits.credits[i].nickname, buffer); - } - } - cprintf("\r\nn) Neu d) Loeschen p) Einzahlen b) Seite hoch f) Seite runter\r\ng) Filtern e) Aendern s) Speichern z) Zurueck\r\n"); +static void credit_print_screen(void) { + BYTE i, pages; + char buffer[EUR_FORMAT_MINLEN + 1]; + + clrscr(); + cprintf("credit_manager (phil_fry, sECuRE, sur5r) v:" GV "\r\n\r\n"); + pages = (credits.num_items / CREDITS_PER_PAGE); + if (current_credits_page > pages) + current_credits_page = pages; + cprintf("Datei: CREDITS (Seite %d von %d)\r\n\r\n", current_credits_page, + pages); + for (i = (current_credits_page * CREDITS_PER_PAGE); + i < credits.num_items && + i < ((current_credits_page + 1) * CREDITS_PER_PAGE); + i++) { + if (filter == NULL || + strncmp(credits.credits[i].nickname, filter, filter_len) == 0) { + if (format_euro(buffer, sizeof(buffer), credits.credits[i].credit) != + buffer) { + cprintf("Error: Could not format credit %d\r\n", + credits.credits[i].credit); + exit(1); + } + + cprintf("%d: %s: %s\r\n", i, credits.credits[i].nickname, buffer); + } + } + cprintf("\r\nn) Neu d) L" oUML "schen p) Einzahlen b) Seite hoch " + "f) Seite runter\r\ng) Filtern s) Speichern z) Zur" uUML "ck\r\n"); } -struct credits_t *find_credit(char *name){ - int i; - for (i = 0; i < credits.num_items; i++) - if (strncmp(name, credits.credits[i].nickname, NICKNAME_MAX_LEN + 1) == 0) - return &credits.credits[i]; - return NULL; +static int8_t find_credit_idx(char *name) { + int8_t i; + for (i = 0; i < credits.num_items; ++i) { + if (strncmp(name, credits.credits[i].nickname, NICKNAME_MAX_LEN + 1) == 0) { + return i; + } + } + return -1; } -/* - * when depositing money with this and returning to the main menu, the program - * will crash with a message like the following: - * - */ -static void deposit_credit() { - char *time = get_time(); - char *input; - struct credits_t *credit; - unsigned int deposit; - - cprintf("\r\nName:\r\n"); - if ((input = get_input()) == NULL || *input == '\0') - return; // no name given - - if ((credit = find_credit(input)) == NULL) - return; // cannot find named credit - - cprintf("\r\nEinzahlung in Cent:\r\n"); - if ((input = get_input()) == NULL || *input == '\0' || (deposit = atoi(input)) == 0) - return; - - credit->credit += deposit; - - toggle_videomode(); - cprintf("%d Cent eingezahlt fuer %s.\r\nRestguthaben: %d\r\n", deposit, credit->nickname); - sprintf(print_buffer, "%c%s - %d Cent eingezahlt fuer %s. Restguthaben: %d Cent\r", 17, time, deposit, credit->nickname, credit->credit); - cprintf("%s", print_buffer); - toggle_videomode(); - print_the_buffer(); - cprintf("\r\nEinzahlung durchgefuehrt, druecke RETURN...\r\n"); - input = get_input(); - toggle_videomode(); - clrscr(); - toggle_videomode(); +struct credits_t *find_credit(char *name) { + int i; + if ((i = find_credit_idx(name)) >= 0) { + return &credits.credits[i]; + } + return NULL; } -static void new_credit() { - char *input, *name; - int credit; - - if (credits.num_items == 75) { - cprintf("\rEs ist bereits die maximale Anzahl an Eintraegen erreicht, druecke RETURN...\r\n"); - input = get_input(); - return; - } - - clrscr(); - cprintf("\rNickname:\r\n"); - if ((input = get_input()) == NULL || *input == '\0') - return; - name = strdup(input); - cprintf("\r\nGuthaben in Cents:\r\n"); - if ((input = get_input()) == NULL || *input == '\0' || (credit = atoi(input)) == 0) - return; - strcpy(credits.credits[credits.num_items].nickname, name); - credits.credits[credits.num_items].credit = credit; - - sprintf(print_buffer, "%cGuthaben mit %d Cent fuer %s angelegt\r", 17, credit, name); - print_the_buffer(); - - credits.num_items++; - free(name); +void deposit_credit(char *nickname) { + char *time = get_time(); + struct credits_t *credit; + unsigned int deposit; + + if ((credit = find_credit(nickname)) == NULL) + return; // cannot find named credit + + cprintf("\r\nEinzahlung in Cent:\r\n"); + if ((deposit = cget_number(0)) == 0) + return; + + credit->credit += deposit; + + print_the_buffer(); + cprintf("\r\nEinzahlung durchgef" uUML "hrt, dr" uUML "cke RETURN...\r\n"); + cget_return(); } -static void _delete_credit(BYTE num) { - memset(credits.credits[num].nickname, '\0', 11); - credits.credits[num].credit = 0; +static void new_credit(void) { + char name[NICKNAME_MAX_LEN + 1]; + char *time; + int credit; + + if (credits.num_items == MAX_CREDIT_ITEMS) { + cprintf("\rEs ist bereits die maximale Anzahl an Eintr" aUML + "gen erreicht, dr" uUML "cke RETURN...\r\n"); + cget_return(); + return; + } + + clrscr(); + cprintf("\rNickname (max. 10 Zeichen):\r\n"); + if (cgetn_input(name, sizeof(name)) == 0) + return; + + if (find_credit_idx(name) >= 0) { + cprintf("\rNickname existiert bereits, dr" uUML "cke RETURN...\r\n"); + cget_return(); + return; + } + + cprintf("\r\nGuthaben in Cents:\r\n"); + 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; + + time = get_time(); + sprintf(print_buffer, "%c%s - Guthaben mit %d Cent f" uUML "r %s angelegt\r", + 17, time, credit, name); + print_the_buffer(); + + credits.num_items++; } -static void delete_credit() { - char *input; - BYTE num, last; - - cprintf("\r Welcher Eintrag soll geloescht werden?\r\n"); - if ((input = get_input()) == NULL || *input == '\0') - return; - num = atoi(input); - if (credits.num_items > 1) { - /* Swap last item with this one and delete the last one to avoid holes */ - last = (credits.num_items - 1); - strcpy(credits.credits[num].nickname, credits.credits[last].nickname); - credits.credits[num].credit = credits.credits[last].credit; - _delete_credit(last); - } else { - /* Just delete it */ - _delete_credit(num); - } - credits.num_items--; +static void delete_credit(char *nickname) { + int8_t i; + if ((i = find_credit_idx(nickname)) < 0) { + cprintf("\r Nick existiert nicht\r\n"); + return; + } + --credits.num_items; + if (i != credits.num_items) { + credits.credits[i] = credits.credits[credits.num_items]; + } + memset(credits.credits[credits.num_items].nickname, '\0', + NICKNAME_MAX_LEN + 1); + credits.credits[credits.num_items].credit = 0; + return; } -void credit_manager(){ - char *c; - while(1){ - credit_print_screen(); - c = get_input(); - switch (*c) { - case 'n': - new_credit(); break; - case 'd': - delete_credit(); break; - case 's': - save_credits(); break; - case 'f': - if (current_credits_page < (credits.num_items / CREDITS_PER_PAGE)) - current_credits_page++; - break; - case 'b': - if (current_credits_page > 0) - current_credits_page--; - break; - case 'p': - deposit_credit(); break; - case 'g': - cprintf("Filter eingeben:\r\n"); - filter = get_input(); - if (filter == NULL || *filter == 32 || (filter_len = strlen(filter)) == 0) - filter = NULL; - break; - case 'z': - save_credits(); - return; - default: - cprintf("Unbekannter Befehl, druecke RETURN...\r\n"); - get_input(); - } - } +void credit_manager() { + char nickname[NICKNAME_MAX_LEN + 1]; + char *c; + while (1) { + credit_print_screen(); + c = get_input(); + switch (*c) { + case 'n': + new_credit(); + break; + case 'd': + cputs("\rName?\r\n"); + if (cget_nickname(nickname, sizeof(nickname))) { + delete_credit(nickname); + } + break; + case 's': + save_credits(); + break; + case 'f': + if (current_credits_page < (credits.num_items / CREDITS_PER_PAGE)) + current_credits_page++; + break; + case 'b': + if (current_credits_page > 0) + current_credits_page--; + break; + case 'p': + cputs("\rName?\r\n"); + if (cget_nickname(nickname, sizeof(nickname))) { + deposit_credit(nickname); + } + break; + case 'g': + cprintf("Filter eingeben:\r\n"); + filter = get_input(); + if (filter == NULL || *filter == PETSCII_SP || + (filter_len = strlen(filter)) == 0) + filter = NULL; + break; + case 'z': + save_credits(); + return; + default: + cprintf("Unbekannter Befehl, dr" uUML "cke RETURN...\r\n"); + cget_return(); + } + } }