libpayload: Move stdin/stdout/stderr away from headers
[coreboot.git] / payloads / libpayload / libc / printf.c
index 2f1ca8bda6b31bc24c1b4f9c7a3b4487f9e1a198..389d2277eaf6d22faa34f57d7bb4a40d9bd4ebc0 100644 (file)
  */
 
 #include <libpayload.h>
+#include <ctype.h>
+
+static struct _FILE {
+} _stdout, _stdin, _stderr;
+
+FILE *stdout = &_stdout;
+FILE *stdin = &_stdin;
+FILE *stderr = &_stderr;
 
 /** Structure for specifying output methods for different printf clones. */
 struct printf_spec {
@@ -135,6 +143,7 @@ static int printf_putchar(int c, struct printf_spec *ps)
  * @param c    Character to print.
  * @param width        Width modifier.
  * @param flags        Flags that change the way the character is printed.
+ * @param ps   Output methods spec for different printf clones.
  * @return     Number of characters printed, negative value on failure.
  */
 static int print_char(char c, int width, uint64_t flags, struct printf_spec *ps)
@@ -156,7 +165,7 @@ static int print_char(char c, int width, uint64_t flags, struct printf_spec *ps)
                        ++counter;
        }
 
-       return ++counter;
+       return counter;
 }
 
 /**
@@ -166,8 +175,10 @@ static int print_char(char c, int width, uint64_t flags, struct printf_spec *ps)
  * @param width                Width modifier.
  * @param precision    Precision modifier.
  * @param flags                Flags that modify the way the string is printed.
+ * @param ps           Output methods spec for different printf clones.
  * @return             Number of characters printed, negative value on failure.
  */
+/** Structure for specifying output methods for different printf clones. */
 static int print_string(char *s, int width, unsigned int precision,
                        uint64_t flags, struct printf_spec *ps)
 {
@@ -207,10 +218,11 @@ static int print_string(char *s, int width, unsigned int precision,
  * Print significant digits of a number in given base.
  *
  * @param num          Number to print.
- * @param widt         Width modifier.h
+ * @param width                Width modifier.h
  * @param precision    Precision modifier.
  * @param base         Base to print the number in (must be between 2 and 16).
  * @param flags                Flags that modify the way the number is printed.
+ * @param ps           Output methods spec for different printf clones.
  * @return             Number of characters printed.
  */
 static int print_number(uint64_t num, int width, int precision, int base,
@@ -359,11 +371,12 @@ static int print_number(uint64_t num, int width, int precision, int base,
        return counter;
 }
 
-/** Print formatted string.
+/**
+ * Print formatted string.
  *
  * Print string formatted according to the fmt parameter and variadic arguments.
  * Each formatting directive must have the following form:
- * 
+ *
  *     \% [ FLAGS ] [ WIDTH ] [ .PRECISION ] [ TYPE ] CONVERSION
  *
  * FLAGS:@n
@@ -381,7 +394,7 @@ static int print_number(uint64_t num, int width, int precision, int base,
  *     - "0"   Print 0 as padding instead of spaces. Zeroes are placed between
  *             sign and the rest of the number. This flag is ignored if "-"
  *             flag is specified.
- * 
+ *
  * WIDTH:@n
  *     - Specify the minimal width of a printed argument. If it is bigger,
  *     width is ignored. If width is specified with a "*" character instead of
@@ -398,15 +411,15 @@ static int print_number(uint64_t num, int width, int precision, int base,
  *     value is then expected in parameters. When both width and precision are
  *     specified using "*", the first parameter is used for width and the
  *     second one for precision.
- * 
+ *
  * TYPE:@n
  *     - "hh"  Signed or unsigned char.@n
  *     - "h"   Signed or unsigned short.@n
  *     - ""    Signed or unsigned int (default value).@n
  *     - "l"   Signed or unsigned long int.@n
  *     - "ll"  Signed or unsigned long long int.@n
- * 
- * 
+ *
+ *
  * CONVERSION:@n
  *     - %     Print percentile character itself.
  *
@@ -414,16 +427,16 @@ static int print_number(uint64_t num, int width, int precision, int base,
  *
  *     - s     Print zero terminated string. If a NULL value is passed as
  *             value, "(NULL)" is printed instead.
- * 
+ *
  *     - P, p  Print value of a pointer. Void * value is expected and it is
  *             printed in hexadecimal notation with prefix (as with \%#X / \%#x
  *             for 32-bit or \%#X / \%#x for 64-bit long pointers).
  *
  *     - b     Print value as unsigned binary number. Prefix is not printed by
  *             default. (Nonstandard extension.)
- * 
+ *
  *     - o     Print value as unsigned octal number. Prefix is not printed by
- *             default. 
+ *             default.
  *
  *     - d, i  Print signed decimal number. There is no difference between d
  *             and i conversion.
@@ -432,7 +445,7 @@ static int print_number(uint64_t num, int width, int precision, int base,
  *
  *     - X, x  Print hexadecimal number with upper- or lower-case. Prefix is
  *             not printed by default.
- * 
+ *
  * All other characters from fmt except the formatting directives are printed in
  * verbatim.
  *
@@ -717,6 +730,20 @@ int sprintf(char *str, const char *fmt, ...)
        return ret;
 }
 
+int fprintf(FILE *file, const char *fmt, ...)
+{
+       int ret;
+       if ((file == stdout) || (file == stderr)) {
+               va_list args;
+               va_start(args, fmt);
+               ret = vprintf(fmt, args);
+               va_end(args);
+
+               return ret;
+       }
+       return -1;
+}
+
 struct vsnprintf_data {
        size_t size;            /* Total space for string */
        size_t len;             /* Count of currently used characters */