]> git.sur5r.net Git - c128-kasse/blobdiff - src/credit_manager.c
Restructure Makefile and create include/version.h
[c128-kasse] / src / credit_manager.c
index a91adda537c0dfac942ea5e400f65c56208df6da..670926dad7f713fd148264f0cf28d652f9009d8b 100644 (file)
@@ -1,3 +1,9 @@
+/* 
+ * RGB2R-C128-Kassenprogramm
+ * © 2007-2009 phil_fry, sECuRE, sur5r
+ * See LICENSE for license information
+ *
+ */
 #include <conio.h>
 #include <stdio.h>
 #include <stdlib.h>
 
 #include "config.h"
 #include "general.h"
+#include "kasse.h"
+#include "c128time.h"
+#include "print.h"
+#include "version.h"
 
 static char *filter = NULL;
 static BYTE filter_len;
 
-static void print_credit_screen() {
-       BYTE i = 0;
+static BYTE current_credits_page = 0;
+
+static void credit_print_screen() {
+       BYTE i, pages;
+       char buffer[10];
+
        clrscr();
-       cprintf("C128-Kassenprogramm: Credit Manager\r\n\r\n");
-       for (; i < credits.num_items; ++i)
-               if (filter == NULL || strncmp(credits.credits[i].nickname, filter, filter_len) == 0)
-                       cprintf("Guthaben %s: %d Cents\r\n", credits.credits[i].nickname, credits.credits[i].credit);
-       cprintf("\r\nBefehle: n) Neues Guthaben f) Filtern z) Zurueck\r\n");
+       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, 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");
 }
 
-/* Guthabenverwalter */
-void credit_manager() {
-       int negative = 1;
-       char *c, *nickname, *credits_input;
-       /* credits_int is a stupid name, but overlaps with struct credits_t credits; else */
-       int credits_int;
-       while (1) {
-               print_credit_screen();
-               c = get_input();
-               if (c == NULL || *c == '\0')
-                       continue;
-               if (*c == 'n') {
-                       cprintf("\r\nGuthaben eingeben:\r\n");
-                       credits_input = get_input();
-
-                       if (credits_input == NULL || credits_input[0] == '\0')
-                               continue;
-                       else if (credits_input[0] == '-') {
-                               negative = -1;
-                               ++credits_input;
-                       }
-                       credits_int = atoi(credits_input) * negative;
-                       if (credits_int > 0) {
-                               cprintf("Nickname eingeben:\r\n");
-                               nickname = get_input();
-                               if (nickname == NULL || nickname[0] == '\0')
-                                       continue;
-                               strncpy(credits.credits[credits.num_items].nickname, nickname, 9);
-                               credits.credits[credits.num_items].credit = credits_int;
-                               ++credits.num_items;
-                       }
-               } else if (*c == 'f') {
-                       cprintf("Filter eingeben:\r\n");
-                       filter = get_input();
-                       if (filter == NULL || *filter == 32 || (filter_len = strlen(filter)) == 0)
-                               filter = NULL;
-               } else if (*c == 'z' || *c == 'q')
-                       break;
+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;
+}
+
+/*
+ * Deposits credit for a user. Called in the credit manager (with input ==
+ * NULL) or interactively when the user does not have enough money for his
+ * intended purchase (with input == nickname).
+ * 
+ */
+void deposit_credit(char *input) {
+       char *time = get_time();
+       struct credits_t *credit;
+       unsigned int deposit;
+
+       if (input == NULL) {
+               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, credit->credit);
+       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();
+}
+
+static void new_credit() {
+       char *input, *name;
+       char *time;
+       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;
+
+       time = get_time();
+       sprintf(print_buffer, "%c%s - Guthaben mit %d Cent fuer %s angelegt\r", 17, time, credit, name);
+       print_the_buffer();
+
+       credits.num_items++;
+       free(name);
+}
+
+static void _delete_credit(BYTE num) {
+       memset(credits.credits[num].nickname, '\0', 11);
+       credits.credits[num].credit = 0;
+}
+
+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--;
+}
+
+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(NULL); 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(); 
+               }
+       }       
 }