X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fprint.c;h=a0e63df655aed53ab9b2d2be68a6ec2fcefb0108;hb=3a0ee7dce566ac289c19d31bd3837ee1535dcf2b;hp=4c31d6c23929f92e86db3fddab9d67cd3a0b9f91;hpb=54b6c22a4c089e85575d5d3edb73d25938f27513;p=c128-kasse diff --git a/src/print.c b/src/print.c index 4c31d6c..a0e63df 100644 --- a/src/print.c +++ b/src/print.c @@ -10,8 +10,9 @@ #include #include "general.h" -#define _IS_PRINT +#define IS_PRINT_C #include "print.h" +#include "globals.h" /* NOTE: undocumented function which scratches files We need to use this function because linking unistd.h @@ -19,82 +20,123 @@ */ unsigned char __fastcall__ _sysremove(const char *name); -void print_the_buffer() { - BYTE c; +/* 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(void) { + 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(void) { + BYTE status; + char *c; + + if (!printing) + return; + RETRY: - c = cbm_open((BYTE)4, (BYTE)4, (BYTE)0, NULL); - if (c != 0) { - c128_perror(c, "cbm_open(printer)"); - if (retry_or_quit() == 'q') - exit(1); - - goto RETRY; - } - c = cbm_write((BYTE)4, print_buffer, strlen(print_buffer)); - if (c != strlen(print_buffer)) { - c128_perror(c, "write(printer)"); - if (retry_or_quit() == 'q') - exit(1); - goto RETRY; - } - cbm_close((BYTE)4); - log_file(print_buffer); + status = cbm_open((BYTE)4, (BYTE)4, (BYTE)0, NULL); + if (status != 0) { + c128_perror(status, "cbm_open(printer)"); + + do { + cprintf("\r\nr)etry, c)ontinue or q)uit?\r\n"); + c = get_input(); + } while ((*c != 'r') && (*c != 'c') && (*c != 'q')); + + if (*c == 'q') + exit(1); + else if (*c == 'c') { + printing = 0; + return; + } + + goto RETRY; + } + status = cbm_write((BYTE)4, print_buffer, strlen(print_buffer)); + if (status != strlen(print_buffer)) { + c128_perror(status, "write(printer)"); + if (retry_or_quit() == 'q') + exit(1); + goto RETRY; + } + cbm_close((BYTE)4); + log_file(print_buffer); +} + +void print_header(void) { + sprintf(print_buffer, "%c----------------------------------------------------" + "----------------------------\r", + 17); + print_the_buffer(); + + sprintf( + print_buffer, + "%c#kauf Uhrzeit - Ding - Preis - Restguthbn - # - Nickname\r", + 17); + print_the_buffer(); + + sprintf(print_buffer, "%c----------------------------------------------------" + "----------------------------\r", + 17); + print_the_buffer(); } -void print_header() { - sprintf(print_buffer, "%c--------------------------------------------------------------------------------\r", 17); - print_the_buffer(); +/* + * 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); - sprintf(print_buffer, "%c#kauf Uhrzeit - Ding - Preis - Restguthbn - # - Nickname\r", 17); - print_the_buffer(); + /* If we have written to this logfile before, we need to remove it first */ + if (log_heap_flushed > 0) + _sysremove(filename); - sprintf(print_buffer, "%c--------------------------------------------------------------------------------\r", 17); - print_the_buffer(); + if ((c = cbm_open((BYTE)8, (BYTE)8, (BYTE)1, filename)) != 0) { + c128_perror(c, "cbm_open(log)"); + exit(1); + } + 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); + 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) { - /* 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++; - 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); - _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))); - exit(1); - } - cbm_close((BYTE)8); - free(buffer); + 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; + } }