]> git.sur5r.net Git - c128-kasse/commitdiff
log to memory
authorMichael Stapelberg <michael@stapelberg.de>
Sun, 30 Sep 2012 10:51:13 +0000 (12:51 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 30 Sep 2012 10:51:13 +0000 (12:51 +0200)
include/print.h
src/config.c
src/kasse.c
src/print.c

index 586c708ddbcc97cf1a93c1733c74b8a2fc8d85c6..33acad22136271a8db462ed1786d7a0e8749897e 100644 (file)
@@ -1,19 +1,22 @@
 #ifndef _PRINT_H
 #define _PRINT_H
 
+void init_log();
 void print_the_buffer();
 void print_header();
 void log_file(const char *s);
+void log_flush(void);
 
 #ifdef _IS_PRINT
 char print_buffer[80 + 2 + 1];
 unsigned char log_num = 0;
-int log_lines_written = 0;
 #else
 extern char print_buffer[80 + 2 + 1];
 extern unsigned char log_num;
-extern int log_lines_written;
-
+extern char *log_heap_buf;
+extern int log_heap_offset;
+extern int log_heap_flushed;
+extern const int LOG_SIZE;
 #endif
 
 #endif
index 266f441fe81de9800647c34ec7c22dc209c9b0db..7304c073e5e1adb71c8c96e8fe6b03a45709facc 100644 (file)
@@ -40,15 +40,7 @@ struct credits_array_t credits;
 static void lookup_needed_files() {
        BYTE lfn = 8, c;
        struct cbm_dirent dirent;
-       char *buffer = malloc(sizeof(char) * 64 * 100);
-       char *walk;
        char filename[8];
-       int n;
-
-       if (buffer == NULL) {
-               cprintf("Not enough memory available\r\n");
-               exit(1);
-       }
 
        if (cbm_opendir(lfn, (BYTE)8) != 0) {
                cprintf("could not open directory\r\n");
@@ -76,20 +68,15 @@ static void lookup_needed_files() {
                        c128_perror(c, "cbm_open(log) for reading");
                        exit(1);
                }
-               n = cbm_read(lfn, buffer, sizeof(char) * 64 * 100);
-               if (n < 0) {
+               log_heap_offset = cbm_read(lfn, log_heap_buf, LOG_SIZE);
+               if (log_heap_offset < 0) {
                        cprintf("error while cbm_read()ing the logfile\r\n");
                        exit(1);
                }
-               buffer[n] = '\0';
-               for (walk = buffer; (walk - buffer) < n; walk++) {
-                       if (*walk == '\r' || *walk == '\n')
-                               log_lines_written++;
-               }
+               log_heap_flushed = log_heap_offset;
+               log_heap_buf[log_heap_offset] = '\0';
                cbm_close(lfn);
        }
-
-       free(buffer);
 }
 
 void load_items() {
index 0710b2adad7013008c0e6874906da2023480e73f..4883ef8f34c8d5a533956d2d08882c36aa7bfa68 100644 (file)
@@ -303,6 +303,10 @@ int main() {
        if (VIDEOMODE == 40)
                toggle_videomode();
        clrscr();
+
+       /* Allocate logging buffer memory */
+       init_log();
+
        /* Set time initially, c128 doesn't know it */
        set_time_interactive();
 
@@ -322,7 +326,7 @@ int main() {
        sprintf(print_buffer, "%cC128-Kasse Version " GV "\r", 17);
        print_the_buffer();
 
-       sprintf(print_buffer, "%cKasse gestartet um %s. Nutze logfile log-%u, zeile %d.\r", 17, time, log_num, log_lines_written);
+       sprintf(print_buffer, "%cKasse gestartet um %s. Nutze logfile log-%u, offset %d.\r", 17, time, log_num, log_heap_offset);
        print_the_buffer();
 
        print_header();
@@ -346,7 +350,8 @@ int main() {
                } else if (*c == 's') {
                        save_items();
                        save_credits();
-                       cprintf("Statefile/Creditfile gesichert, druecke RETURN...\r\n");
+                       log_flush();
+                       cprintf("\r\nStatefile/Creditfile/Log gesichert, druecke RETURN...\r\n");
                        get_input();
                } else if (*c == 'g') {
                        credit_manager();
index 803bbb6edbdd88fc4d90304483739ff8ad8b9c6f..768e819860de3b0f9d7fbf5be36d0b37b52ebda1 100644 (file)
  */
 unsigned char __fastcall__ _sysremove(const char *name);
 
+/* 8192 bytes of log buffer on the heap used for storing one entire logfile in
+ * memory before writing (unless flushed). */
+char *log_heap_buf;
+int log_heap_offset = 0;
+int log_heap_flushed = 0;
+
+const int LOG_SIZE = 8192;
+
+void init_log() {
+       log_heap_buf = malloc(sizeof(char) * LOG_SIZE);
+       if (log_heap_buf == NULL) {
+               cprintf("malloc(log_heap_buf) failed");
+               exit(1);
+       }
+}
+
 void print_the_buffer() {
        BYTE c;
 RETRY:
@@ -53,48 +69,50 @@ void print_header() {
 
 }
 
-void log_file(const char *s) {
-       /* A log-entry has usually 50 bytes, so we take 64 bytes.
-          Because files are wrapped (log.0, log.1, ...) every 100
-          lines, we don't need more than 100 * 64 bytes. */
-       char *buffer = malloc(sizeof(char) * 64 * 100);
-       char filename[8];
-       int read = 0;
-       unsigned int c;
-
-       if (buffer == NULL) {
-               cprintf("No memory available\n");
-               exit(1);
-       }
-
-       buffer[0] = '\0';
-       if (((++log_lines_written) % 100) == 0)
-               log_num++;
+/*
+ * Flushes the current log buffer to disk. Called either by log_file() when one
+ * entire log file is completed or interactively.
+ *
+ */
+void log_flush(void) {
+       int c;
+       static char filename[8];
        sprintf(filename, "log-%d", log_num);
-       /* Don't read log if there were no lines written before */
-       if (log_lines_written != 1) {
-               if ((c = cbm_open((BYTE)8, (BYTE)8, (BYTE)0, filename)) != 0) {
-                       c128_perror(c, "cbm_open(log)");
-                       exit(1);
-               }
-               read = cbm_read((BYTE)8, buffer, sizeof(char) * 64 * 100);
-               cbm_close((BYTE)8);
+
+       /* If we have written to this logfile before, we need to remove it first */
+       if (log_heap_flushed > 0)
                _sysremove(filename);
-       }
+
        if ((c = cbm_open((BYTE)8, (BYTE)8, (BYTE)1, filename)) != 0) {
                c128_perror(c, "cbm_open(log)");
                exit(1);
        }
-       if (read < 0) {
-               cprintf("Could not read existing logfile (read returned %d)\n", read);
-               exit(1);
-       }
-       strcpy(buffer+read, s);
-       c = cbm_write((BYTE)8, buffer, read+strlen(s));
-       if (c != (read+strlen(s))) {
-               cprintf("Could not save logfile (wrote %d bytes, wanted %d bytes), please make sure the floppy is not full!\n", c, (read+strlen(s)));
+       c = cbm_write((BYTE)8, log_heap_buf, log_heap_offset);
+       if (c != log_heap_offset) {
+               textcolor(TC_LIGHT_RED);
+               cprintf("\r\nCould not save logfile (wrote %d bytes, wanted %d bytes), please make sure the floppy is not full!\n", c, log_heap_offset);
+               c128_perror(c, "cbm_write");
                exit(1);
        }
        cbm_close((BYTE)8);
-       free(buffer);
+
+       log_heap_flushed = log_heap_offset;
+}
+
+/*
+ * Logs to memory and eventually to file (log_flush() is called when one entire
+ * logfile was completed in memory).
+ *
+ */
+void log_file(const char *s) {
+       strcpy(log_heap_buf+log_heap_offset, s);
+       log_heap_offset += strlen(s);
+
+       /* Force a flush when there are only five lines left */
+       if (log_heap_offset > (LOG_SIZE - (5 * 80))) {
+               log_flush();
+               log_num++;
+               log_heap_offset = 0;
+               log_heap_flushed = 0;
+       }
 }