Reduce warnings/errors in libpayload when using picky compiler options
[coreboot.git] / payloads / libpayload / libc / printf.c
index 8be713c1ef5bb00748e0a1325668ff7cdd76edfa..e3cf8bbb24ca2224879ac96ff3da8add9f0a0548 100644 (file)
  */
 
 #include <libpayload.h>
-#include <stdarg.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 {
@@ -107,7 +114,7 @@ static int printf_putstr(const char *str, struct printf_spec *ps)
        size_t count;
 
        if (str == NULL) {
-               char *nullstr = "(NULL)";
+               const char *nullstr = "(NULL)";
                return printf_putnchars(nullstr, strlen(nullstr), ps);
        }
 
@@ -136,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)
@@ -157,7 +165,7 @@ static int print_char(char c, int width, uint64_t flags, struct printf_spec *ps)
                        ++counter;
        }
 
-       return ++counter;
+       return counter;
 }
 
 /**
@@ -167,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)
 {
@@ -208,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,
@@ -279,8 +290,8 @@ static int print_number(uint64_t num, int width, int precision, int base,
                flags &= ~__PRINTF_FLAG_ZEROPADDED;
 
        /*
-        * If the number is leftaligned or precision is specified then
-        * zeropadding is ignored.
+        * If the number is left-aligned or precision is specified then
+        * zero-padding is ignored.
         */
        if (flags & __PRINTF_FLAG_ZEROPADDED) {
                if ((precision == 0) && (width > size))
@@ -360,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
@@ -382,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
@@ -399,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.
  *
@@ -415,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.
@@ -433,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.
  *
@@ -694,6 +706,18 @@ out:
        return counter;
 }
 
+int snprintf(char *str, size_t size, const char *fmt, ...)
+{
+       int ret;
+       va_list args;
+
+       va_start(args, fmt);
+       ret = vsnprintf(str, size, fmt, args);
+       va_end(args);
+
+       return ret;
+}
+
 int sprintf(char *str, const char *fmt, ...)
 {
        int ret;
@@ -706,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 */