From 086d698c642f0b8901757a40cef56b04d05bf19c Mon Sep 17 00:00:00 2001 From: Matt Fleming Date: Fri, 25 Nov 2011 15:54:48 +0000 Subject: [PATCH] ldlinux: Add eprintf() to print to VGA and serial printf() is used heavily in the ldlinux code but that only displays things on the VGA console, not on serial. Introduce eprintf(), which gives us the benefit of format strings but will also print to both VGA and serial. Signed-off-by: Matt Fleming --- com32/elflink/ldlinux/Makefile | 2 +- com32/elflink/ldlinux/cli.c | 30 +++++++++++++++--------------- com32/elflink/ldlinux/config.h | 2 ++ com32/elflink/ldlinux/eprintf.c | 35 +++++++++++++++++++++++++++++++++++ com32/elflink/ldlinux/readconfig.c | 14 +++++++------- 5 files changed, 60 insertions(+), 23 deletions(-) create mode 100644 com32/elflink/ldlinux/eprintf.c diff --git a/com32/elflink/ldlinux/Makefile b/com32/elflink/ldlinux/Makefile index 32780c4..5927e50 100644 --- a/com32/elflink/ldlinux/Makefile +++ b/com32/elflink/ldlinux/Makefile @@ -20,7 +20,7 @@ all: ldlinux.c32 ldlinux_lnx.a ldlinux.c32 : ldlinux.o cli.o readconfig.o refstr.o colors.o getadv.o \ adv.o ipappend.o execute.o kernel.o get_key.o \ - advwrite.o setadv.o + advwrite.o setadv.o eprintf.o $(LD) $(LDFLAGS) -o $@ $^ LNXLIBOBJS = get_key.lo diff --git a/com32/elflink/ldlinux/cli.c b/com32/elflink/ldlinux/cli.c index 3bb7db4..1ed3ea6 100644 --- a/com32/elflink/ldlinux/cli.c +++ b/com32/elflink/ldlinux/cli.c @@ -81,7 +81,7 @@ static const char * cmd_reverse_search(int *cursor) memset(buf, 0, MAX_CMDLINE_LEN); - printf("\033[1G\033[1;36m(reverse-i-search)`': \033[0m"); + eprintf("\033[1G\033[1;36m(reverse-i-search)`': \033[0m"); while (1) { key = mygetkey(0); @@ -115,11 +115,11 @@ static const char * cmd_reverse_search(int *cursor) *cursor = p - last_good->command; } - printf("\033[?7l\033[?25l"); + eprintf("\033[?7l\033[?25l"); /* Didn't handle the line wrap case here */ - printf("\033[1G\033[1;36m(reverse-i-search)\033[0m`%s': %s", + eprintf("\033[1G\033[1;36m(reverse-i-search)\033[0m`%s': %s", buf, last_good->command ? : ""); - printf("\033[K\r"); + eprintf("\033[K\r"); } return last_good ? last_good->command : NULL; @@ -171,10 +171,10 @@ const char *edit_cmdline(const char *input, int top /*, int width */ , prev_len = max(len, prev_len); /* Redraw the command line */ - printf("\033[?7l\033[?25l"); + eprintf("\033[?7l\033[?25l"); if (y) - printf("\033[%dA", y); - printf("\033[1G\033[1;36m%s \033[0m", input); + eprintf("\033[%dA", y); + eprintf("\033[1G\033[1;36m%s \033[0m", input); x = strlen(input); y = 0; @@ -184,23 +184,23 @@ const char *edit_cmdline(const char *input, int top /*, int width */ , at++; x++; if (x >= width) { - printf("\r\n"); + eprintf("\r\n"); x = 0; y++; } } - printf("\033[K\r"); + eprintf("\033[K\r"); dy = y - (cursor + strlen(input) + 1) / width; x = (cursor + strlen(input) + 1) % width; if (dy) { - printf("\033[%dA", dy); + eprintf("\033[%dA", dy); y -= dy; } if (x) - printf("\033[%dC", x); - printf("\033[?25h"); + eprintf("\033[%dC", x); + eprintf("\033[?25h"); prev_len = len; redraw = 0; } @@ -294,7 +294,7 @@ const char *edit_cmdline(const char *input, int top /*, int width */ , cursor++; x++; if (x >= width) { - printf("\r\n"); + eprintf("\r\n"); y++; x = 0; } @@ -423,7 +423,7 @@ const char *edit_cmdline(const char *input, int top /*, int width */ , cursor++; x++; if (x >= width) { - printf("\r\n\033[K"); + eprintf("\r\n\033[K"); y++; x = 0; } @@ -443,7 +443,7 @@ const char *edit_cmdline(const char *input, int top /*, int width */ , } } - printf("\033[?7h"); + eprintf("\033[?7h"); /* Add the command to the history */ comm_counter = malloc(sizeof(struct cli_command)); diff --git a/com32/elflink/ldlinux/config.h b/com32/elflink/ldlinux/config.h index 8f708f1..c34b2cc 100644 --- a/com32/elflink/ldlinux/config.h +++ b/com32/elflink/ldlinux/config.h @@ -38,4 +38,6 @@ extern const char *onerror; //"onerror" command line extern void cat_help_file(int key); +extern void eprintf(const char *filename, ...); + #endif /* __CONFIG_H__ */ diff --git a/com32/elflink/ldlinux/eprintf.c b/com32/elflink/ldlinux/eprintf.c new file mode 100644 index 0000000..d8858ff --- /dev/null +++ b/com32/elflink/ldlinux/eprintf.c @@ -0,0 +1,35 @@ +#include +#include +#include + +#define BUFFER_SIZE 4096 + +static void veprintf(const char *format, va_list ap) +{ + int rv, _rv; + char buffer[BUFFER_SIZE]; + char *p; + + _rv = rv = vsnprintf(buffer, BUFFER_SIZE, format, ap); + + if (rv < 0) + return; + + if (rv > BUFFER_SIZE - 1) + rv = BUFFER_SIZE - 1; + + p = buffer; + while (rv--) + write_serial(*p++); + + _fwrite(buffer, _rv, stdout); +} + +void eprintf(const char *format, ...) +{ + va_list ap; + + va_start(ap, format); + veprintf(format, ap); + va_end(ap); +} diff --git a/com32/elflink/ldlinux/readconfig.c b/com32/elflink/ldlinux/readconfig.c index 3a6a367..564cbef 100644 --- a/com32/elflink/ldlinux/readconfig.c +++ b/com32/elflink/ldlinux/readconfig.c @@ -423,12 +423,12 @@ void print_labels(const char *prefix, size_t len) { struct menu_entry *me; - printf("\n"); + eprintf("\n"); for (me = all_entries; me; me = me->next ) { if (!strncmp(prefix, me->label, len)) - printf(" %s", me->label); + eprintf(" %s", me->label); } - printf("\n"); + eprintf("\n"); } struct menu_entry *find_label(const char *str) @@ -628,7 +628,7 @@ static int cat_file(const char *filename) return -1; while (fgets(line, sizeof(line), f) != NULL) - printf("%s", line); + eprintf("%s", line); fclose(f); return 0; @@ -685,7 +685,7 @@ void cat_help_file(int key) return; if (cm->fkeyhelp[fkey].textname) { - printf("\n"); + eprintf("\n"); cat_file(cm->fkeyhelp[fkey].textname); } } @@ -1306,7 +1306,7 @@ do_include: write_serial_str(copyright_str); } } else if (looking_at(p, "say")) { - printf("%s\n", p + 4); + eprintf("%s\n", p+4); } else if (looking_at(p, "path")) { /* PATH-based lookup */ char *new_path, *_p; @@ -1323,7 +1323,7 @@ do_include: _p[len + new_len] = '\0'; PATH = _p; } else - printf("Failed to realloc PATH\n"); + eprintf("Failed to realloc PATH\n"); } } } -- 2.7.4