#include "general.h"
#define _IS_PRINT
#include "print.h"
+#include "globals.h"
/* NOTE: undocumented function which scratches files
We need to use this function because linking unistd.h
*/
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;
+ }
}