ldlinux: Add eprintf() to print to VGA and serial
authorMatt Fleming <matt.fleming@intel.com>
Fri, 25 Nov 2011 15:54:48 +0000 (15:54 +0000)
committerMatt Fleming <matt.fleming@intel.com>
Fri, 2 Dec 2011 12:13:30 +0000 (12:13 +0000)
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 <matt.fleming@intel.com>
com32/elflink/ldlinux/Makefile
com32/elflink/ldlinux/cli.c
com32/elflink/ldlinux/config.h
com32/elflink/ldlinux/eprintf.c [new file with mode: 0644]
com32/elflink/ldlinux/readconfig.c

index 32780c4..5927e50 100644 (file)
@@ -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
index 3bb7db4..1ed3ea6 100644 (file)
@@ -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));
index 8f708f1..c34b2cc 100644 (file)
@@ -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 (file)
index 0000000..d8858ff
--- /dev/null
@@ -0,0 +1,35 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+
+#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);
+}
index 3a6a367..564cbef 100644 (file)
@@ -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");
        }
     }
 }