---
lib/printf.c | 427 +++++++++++++++++++++++++--------------------------
lib/string.c | 354 +++++++++++++++++++++---------------------
2 files changed, 390 insertions(+), 391 deletions(-)
diff --git a/lib/printf.c b/lib/printf.c
index 1269723ef720..383799ec0717 100644
--- a/lib/printf.c
+++ b/lib/printf.c
@@ -10,285 +10,284 @@
#define BUFSZ 2000
typedef struct pstream {
- char *buffer;
- int remain;
- int added;
+ char *buffer;
+ int remain;
+ int added;
} pstream_t;
typedef struct strprops {
- char pad;
- int npad;
- bool alternate;
+ char pad;
+ int npad;
+ bool alternate;
} strprops_t;
static void addchar(pstream_t *p, char c)
{
- if (p->remain) {
- *p->buffer++ = c;
- --p->remain;
- }
- ++p->added;
+ if (p->remain) {
+ *p->buffer++ = c;
+ --p->remain;
+ }
+ ++p->added;
}
static void print_str(pstream_t *p, const char *s, strprops_t props)
{
- const char *s_orig = s;
- int npad = props.npad;
-
- if (npad > 0) {
- npad -= strlen(s_orig);
- while (npad > 0) {
- addchar(p, props.pad);
- --npad;
+ const char *s_orig = s;
+ int npad = props.npad;
+
+ if (npad > 0) {
+ npad -= strlen(s_orig);
+ while (npad > 0) {
+ addchar(p, props.pad);
+ --npad;
+ }
}
- }
- while (*s)
- addchar(p, *s++);
+ while (*s)
+ addchar(p, *s++);
- if (npad < 0) {
- props.pad = ' '; /* ignore '0' flag with '-' flag */
- npad += strlen(s_orig);
- while (npad < 0) {
- addchar(p, props.pad);
- ++npad;
+ if (npad < 0) {
+ props.pad = ' '; /* ignore '0' flag with '-' flag */
+ npad += strlen(s_orig);
+ while (npad < 0) {
+ addchar(p, props.pad);
+ ++npad;
+ }
}
- }
}
static char digits[16] = "0123456789abcdef";
static void print_int(pstream_t *ps, long long n, int base, strprops_t props)
{
- char buf[sizeof(long) * 3 + 2], *p = buf;
- int s = 0, i;
+ char buf[sizeof(long) * 3 + 2], *p = buf;
+ int s = 0, i;
- if (n < 0) {
- n = -n;
- s = 1;
- }
+ if (n < 0) {
+ n = -n;
+ s = 1;
+ }
- while (n) {
- *p++ = digits[n % base];
- n /= base;
- }
+ while (n) {
+ *p++ = digits[n % base];
+ n /= base;
+ }
- if (s)
- *p++ = '-';
+ if (s)
+ *p++ = '-';
- if (p == buf)
- *p++ = '0';
+ if (p == buf)
+ *p++ = '0';
- for (i = 0; i < (p - buf) / 2; ++i) {
- char tmp;
+ for (i = 0; i < (p - buf) / 2; ++i) {
+ char tmp;
- tmp = buf[i];
- buf[i] = p[-1-i];
- p[-1-i] = tmp;
- }
+ tmp = buf[i];
+ buf[i] = p[-1 - i];
+ p[-1 - i] = tmp;
+ }
- *p = 0;
+ *p = 0;
- print_str(ps, buf, props);
+ print_str(ps, buf, props);
}
static void print_unsigned(pstream_t *ps, unsigned long long n, int base,
strprops_t props)
{
- char buf[sizeof(long) * 3 + 3], *p = buf;
- int i;
-
- while (n) {
- *p++ = digits[n % base];
- n /= base;
- }
-
- if (p == buf)
- *p++ = '0';
- else if (props.alternate && base == 16) {
- if (props.pad == '0') {
- addchar(ps, '0');
- addchar(ps, 'x');
-
- if (props.npad > 0)
- props.npad = MAX(props.npad - 2, 0);
- } else {
- *p++ = 'x';
- *p++ = '0';
+ char buf[sizeof(long) * 3 + 3], *p = buf;
+ int i;
+
+ while (n) {
+ *p++ = digits[n % base];
+ n /= base;
+ }
+
+ if (p == buf)
+ *p++ = '0';
+ else if (props.alternate && base == 16) {
+ if (props.pad == '0') {
+ addchar(ps, '0');
+ addchar(ps, 'x');
+
+ if (props.npad > 0)
+ props.npad = MAX(props.npad - 2, 0);
+ } else {
+ *p++ = 'x';
+ *p++ = '0';
+ }
}
- }
- for (i = 0; i < (p - buf) / 2; ++i) {
- char tmp;
+ for (i = 0; i < (p - buf) / 2; ++i) {
+ char tmp;
- tmp = buf[i];
- buf[i] = p[-1-i];
- p[-1-i] = tmp;
- }
+ tmp = buf[i];
+ buf[i] = p[-1 - i];
+ p[-1 - i] = tmp;
+ }
- *p = 0;
+ *p = 0;
- print_str(ps, buf, props);
+ print_str(ps, buf, props);
}
static int fmtnum(const char **fmt)
{
- const char *f = *fmt;
- int len = 0, num;
+ const char *f = *fmt;
+ int len = 0, num;
- if (*f == '-')
- ++f, ++len;
+ if (*f == '-')
+ ++f, ++len;
- while (*f >= '0' && *f <= '9')
- ++f, ++len;
+ while (*f >= '0' && *f <= '9')
+ ++f, ++len;
- num = atol(*fmt);
- *fmt += len;
- return num;
+ num = atol(*fmt);
+ *fmt += len;
+ return num;
}
int vsnprintf(char *buf, int size, const char *fmt, va_list va)
{
- pstream_t s;
-
- s.buffer = buf;
- s.remain = size - 1;
- s.added = 0;
- while (*fmt) {
- char f = *fmt++;
- int nlong = 0;
- strprops_t props;
- memset(&props, 0, sizeof(props));
- props.pad = ' ';
-
- if (f != '%') {
- addchar(&s, f);
- continue;
- }
- morefmt:
- f = *fmt++;
- switch (f) {
- case '%':
- addchar(&s, '%');
- break;
- case 'c':
- addchar(&s, va_arg(va, int));
- break;
- case '\0':
- --fmt;
- break;
- case '#':
- props.alternate = true;
- goto morefmt;
- case '0':
- props.pad = '0';
- ++fmt;
- /* fall through */
- case '1'...'9':
- case '-':
- --fmt;
- props.npad = fmtnum(&fmt);
- goto morefmt;
- case 'l':
- ++nlong;
- goto morefmt;
- case 't':
- case 'z':
- /* Here we only care that sizeof(size_t) == sizeof(long).
- * On a 32-bit platform it doesn't matter that size_t is
- * typedef'ed to int or long; va_arg will work either way.
- * Same for ptrdiff_t (%td).
- */
- nlong = 1;
- goto morefmt;
- case 'd':
- switch (nlong) {
- case 0:
- print_int(&s, va_arg(va, int), 10, props);
- break;
- case 1:
- print_int(&s, va_arg(va, long), 10, props);
- break;
- default:
- print_int(&s, va_arg(va, long long), 10, props);
- break;
- }
- break;
- case 'u':
- switch (nlong) {
- case 0:
- print_unsigned(&s, va_arg(va, unsigned), 10, props);
- break;
- case 1:
- print_unsigned(&s, va_arg(va, unsigned long), 10, props);
- break;
- default:
- print_unsigned(&s, va_arg(va, unsigned long long), 10, props);
- break;
- }
- break;
- case 'x':
- switch (nlong) {
- case 0:
- print_unsigned(&s, va_arg(va, unsigned), 16, props);
- break;
- case 1:
- print_unsigned(&s, va_arg(va, unsigned long), 16, props);
- break;
- default:
- print_unsigned(&s, va_arg(va, unsigned long long), 16, props);
- break;
- }
- break;
- case 'p':
- props.alternate = true;
- print_unsigned(&s, (unsigned long)va_arg(va, void *), 16, props);
- break;
- case 's':
- print_str(&s, va_arg(va, const char *), props);
- break;
- default:
- addchar(&s, f);
- break;
+ pstream_t s;
+
+ s.buffer = buf;
+ s.remain = size - 1;
+ s.added = 0;
+ while (*fmt) {
+ char f = *fmt++;
+ int nlong = 0;
+ strprops_t props;
+ memset(&props, 0, sizeof(props));
+ props.pad = ' ';
+
+ if (f != '%') {
+ addchar(&s, f);
+ continue;
+ }
+morefmt:
+ f = *fmt++;
+ switch (f) {
+ case '%':
+ addchar(&s, '%');
+ break;
+ case 'c':
+ addchar(&s, va_arg(va, int));
+ break;
+ case '\0':
+ --fmt;
+ break;
+ case '#':
+ props.alternate = true;
+ goto morefmt;
+ case '0':
+ props.pad = '0';
+ ++fmt;
+ /* fall through */
+ case '1' ... '9':
+ case '-':
+ --fmt;
+ props.npad = fmtnum(&fmt);
+ goto morefmt;
+ case 'l':
+ ++nlong;
+ goto morefmt;
+ case 't':
+ case 'z':
+ /* Here we only care that sizeof(size_t) == sizeof(long).
+ * On a 32-bit platform it doesn't matter that size_t is
+ * typedef'ed to int or long; va_arg will work either way.
+ * Same for ptrdiff_t (%td).
+ */
+ nlong = 1;
+ goto morefmt;
+ case 'd':
+ switch (nlong) {
+ case 0:
+ print_int(&s, va_arg(va, int), 10, props);
+ break;
+ case 1:
+ print_int(&s, va_arg(va, long), 10, props);
+ break;
+ default:
+ print_int(&s, va_arg(va, long long), 10, props);
+ break;
+ }
+ break;
+ case 'u':
+ switch (nlong) {
+ case 0:
+ print_unsigned(&s, va_arg(va, unsigned), 10, props);
+ break;
+ case 1:
+ print_unsigned(&s, va_arg(va, unsigned long), 10, props);
+ break;
+ default:
+ print_unsigned(&s, va_arg(va, unsigned long long), 10, props);
+ break;
+ }
+ break;
+ case 'x':
+ switch (nlong) {
+ case 0:
+ print_unsigned(&s, va_arg(va, unsigned), 16, props);
+ break;
+ case 1:
+ print_unsigned(&s, va_arg(va, unsigned long), 16, props);
+ break;
+ default:
+ print_unsigned(&s, va_arg(va, unsigned long long), 16, props);
+ break;
+ }
+ break;
+ case 'p':
+ props.alternate = true;
+ print_unsigned(&s, (unsigned long)va_arg(va, void *), 16, props);
+ break;
+ case 's':
+ print_str(&s, va_arg(va, const char *), props);
+ break;
+ default:
+ addchar(&s, f);
+ break;
+ }
}
- }
- *s.buffer = 0;
- return s.added;
+ *s.buffer = 0;
+ return s.added;
}
-
int snprintf(char *buf, int size, const char *fmt, ...)
{
- va_list va;
- int r;
+ va_list va;
+ int r;
- va_start(va, fmt);
- r = vsnprintf(buf, size, fmt, va);
- va_end(va);
- return r;
+ va_start(va, fmt);
+ r = vsnprintf(buf, size, fmt, va);
+ va_end(va);
+ return r;
}
int vprintf(const char *fmt, va_list va)
{
- char buf[BUFSZ];
- int r;
+ char buf[BUFSZ];
+ int r;
- r = vsnprintf(buf, sizeof(buf), fmt, va);
- puts(buf);
- return r;
+ r = vsnprintf(buf, sizeof(buf), fmt, va);
+ puts(buf);
+ return r;
}
int printf(const char *fmt, ...)
{
- va_list va;
- char buf[BUFSZ];
- int r;
-
- va_start(va, fmt);
- r = vsnprintf(buf, sizeof buf, fmt, va);
- va_end(va);
- puts(buf);
- return r;
+ va_list va;
+ char buf[BUFSZ];
+ int r;
+
+ va_start(va, fmt);
+ r = vsnprintf(buf, sizeof buf, fmt, va);
+ va_end(va);
+ puts(buf);
+ return r;
}
void binstr(unsigned long x, char out[BINSTR_SZ])
diff --git a/lib/string.c b/lib/string.c
index 27106dae0b0b..a3a8f3b1ce0b 100644
--- a/lib/string.c
+++ b/lib/string.c
@@ -11,281 +11,281 @@
size_t strlen(const char *buf)
{
- size_t len = 0;
+ size_t len = 0;
- while (*buf++)
- ++len;
- return len;
+ while (*buf++)
+ ++len;
+ return len;
}
size_t strnlen(const char *buf, size_t maxlen)
{
- const char *sc;
+ const char *sc;
- for (sc = buf; maxlen-- && *sc != '\0'; ++sc)
- /* nothing */;
- return sc - buf;
+ for (sc = buf; maxlen-- && *sc != '\0'; ++sc)
+ /* nothing */ ;
+ return sc - buf;
}
char *strcat(char *dest, const char *src)
{
- char *p = dest;
+ char *p = dest;
- while (*p)
- ++p;
- while ((*p++ = *src++) != 0)
- ;
- return dest;
+ while (*p)
+ ++p;
+ while ((*p++ = *src++) != 0)
+ ;
+ return dest;
}
char *strcpy(char *dest, const char *src)
{
- *dest = 0;
- return strcat(dest, src);
+ *dest = 0;
+ return strcat(dest, src);
}
int strncmp(const char *a, const char *b, size_t n)
{
- for (; n--; ++a, ++b)
- if (*a != *b || *a == '\0')
- return *a - *b;
+ for (; n--; ++a, ++b)
+ if (*a != *b || *a == '\0')
+ return *a - *b;
- return 0;
+ return 0;
}
int strcmp(const char *a, const char *b)
{
- return strncmp(a, b, SIZE_MAX);
+ return strncmp(a, b, SIZE_MAX);
}
char *strchr(const char *s, int c)
{
- while (*s != (char)c)
- if (*s++ == '\0')
- return NULL;
- return (char *)s;
+ while (*s != (char)c)
+ if (*s++ == '\0')
+ return NULL;
+ return (char *)s;
}
char *strrchr(const char *s, int c)
{
- const char *last = NULL;
- do {
- if (*s == (char)c)
- last = s;
- } while (*s++);
- return (char *)last;
+ const char *last = NULL;
+ do {
+ if (*s == (char)c)
+ last = s;
+ } while (*s++);
+ return (char *)last;
}
char *strchrnul(const char *s, int c)
{
- while (*s && *s != (char)c)
- s++;
- return (char *)s;
+ while (*s && *s != (char)c)
+ s++;
+ return (char *)s;
}
char *strstr(const char *s1, const char *s2)
{
- size_t l1, l2;
-
- l2 = strlen(s2);
- if (!l2)
- return (char *)s1;
- l1 = strlen(s1);
- while (l1 >= l2) {
- l1--;
- if (!memcmp(s1, s2, l2))
- return (char *)s1;
- s1++;
- }
- return NULL;
+ size_t l1, l2;
+
+ l2 = strlen(s2);
+ if (!l2)
+ return (char *)s1;
+ l1 = strlen(s1);
+ while (l1 >= l2) {
+ l1--;
+ if (!memcmp(s1, s2, l2))
+ return (char *)s1;
+ s1++;
+ }
+ return NULL;
}
void *memset(void *s, int c, size_t n)
{
- size_t i;
- char *a = s;
+ size_t i;
+ char *a = s;
- for (i = 0; i < n; ++i)
- a[i] = c;
+ for (i = 0; i < n; ++i)
+ a[i] = c;
- return s;
+ return s;
}
void *memcpy(void *dest, const void *src, size_t n)
{
- size_t i;
- char *a = dest;
- const char *b = src;
+ size_t i;
+ char *a = dest;
+ const char *b = src;
- for (i = 0; i < n; ++i)
- a[i] = b[i];
+ for (i = 0; i < n; ++i)
+ a[i] = b[i];
- return dest;
+ return dest;
}
int memcmp(const void *s1, const void *s2, size_t n)
{
- const unsigned char *a = s1, *b = s2;
- int ret = 0;
-
- while (n--) {
- ret = *a - *b;
- if (ret)
- break;
- ++a, ++b;
- }
- return ret;
+ const unsigned char *a = s1, *b = s2;
+ int ret = 0;
+
+ while (n--) {
+ ret = *a - *b;
+ if (ret)
+ break;
+ ++a, ++b;
+ }
+ return ret;
}
void *memmove(void *dest, const void *src, size_t n)
{
- const unsigned char *s = src;
- unsigned char *d = dest;
-
- if (d <= s) {
- while (n--)
- *d++ = *s++;
- } else {
- d += n, s += n;
- while (n--)
- *--d = *--s;
- }
- return dest;
+ const unsigned char *s = src;
+ unsigned char *d = dest;
+
+ if (d <= s) {
+ while (n--)
+ *d++ = *s++;
+ } else {
+ d += n, s += n;
+ while (n--)
+ *--d = *--s;
+ }
+ return dest;
}
void *memchr(const void *s, int c, size_t n)
{
- const unsigned char *str = s, chr = (unsigned char)c;
+ const unsigned char *str = s, chr = (unsigned char)c;
- while (n--)
- if (*str++ == chr)
- return (void *)(str - 1);
- return NULL;
+ while (n--)
+ if (*str++ == chr)
+ return (void *)(str - 1);
+ return NULL;
}
static int isspace(int c)
{
- return c == ' ' || c == '\t' || c == '\r' || c == '\n' || c == '\v' || c == '\f';
+ return c == ' ' || c == '\t' || c == '\r' || c == '\n' || c == '\v' || c == '\f';
}
static unsigned long long __strtoll(const char *nptr, char **endptr,
- int base, bool is_signed,
- bool is_longlong) {
- unsigned long long ull = 0;
- const char *s = nptr;
- int neg, c;
-
- assert(base == 0 || (base >= 2 && base <= 36));
-
- while (isspace(*s))
- s++;
-
- if (*s == '-') {
- neg = 1;
- s++;
- } else {
- neg = 0;
- if (*s == '+')
- s++;
- }
-
- if (base == 0 || base == 16) {
- if (*s == '0') {
- s++;
- if (*s == 'x' || *s == 'X') {
- s++;
- base = 16;
- } else if (base == 0)
- base = 8;
- } else if (base == 0)
- base = 10;
- }
-
- while (*s) {
- if (*s >= '0' && *s < '0' + base && *s <= '9')
- c = *s - '0';
- else if (*s >= 'a' && *s < 'a' + base - 10)
- c = *s - 'a' + 10;
- else if (*s >= 'A' && *s < 'A' + base - 10)
- c = *s - 'A' + 10;
- else
- break;
-
- if (!is_longlong) {
- if (is_signed) {
- long sl = (long)ull;
- assert(!check_mul_overflow(sl, base));
- assert(!check_add_overflow(sl * base, c));
- } else {
- unsigned long ul = (unsigned long)ull;
- assert(!check_mul_overflow(ul, base));
- assert(!check_add_overflow(ul * base, c));
- }
- } else {
- if (is_signed) {
- long long sll = (long long)ull;
- assert(!check_mul_overflow(sll, base));
- assert(!check_add_overflow(sll * base, c));
- } else {
- assert(!check_mul_overflow(ull, base));
- assert(!check_add_overflow(ull * base, c));
- }
- }
-
- ull = ull * base + c;
- s++;
- }
-
- if (neg)
- ull = -ull;
-
- if (endptr)
- *endptr = (char *)s;
-
- return ull;
+ int base, bool is_signed, bool is_longlong)
+{
+ unsigned long long ull = 0;
+ const char *s = nptr;
+ int neg, c;
+
+ assert(base == 0 || (base >= 2 && base <= 36));
+
+ while (isspace(*s))
+ s++;
+
+ if (*s == '-') {
+ neg = 1;
+ s++;
+ } else {
+ neg = 0;
+ if (*s == '+')
+ s++;
+ }
+
+ if (base == 0 || base == 16) {
+ if (*s == '0') {
+ s++;
+ if (*s == 'x' || *s == 'X') {
+ s++;
+ base = 16;
+ } else if (base == 0)
+ base = 8;
+ } else if (base == 0)
+ base = 10;
+ }
+
+ while (*s) {
+ if (*s >= '0' && *s < '0' + base && *s <= '9')
+ c = *s - '0';
+ else if (*s >= 'a' && *s < 'a' + base - 10)
+ c = *s - 'a' + 10;
+ else if (*s >= 'A' && *s < 'A' + base - 10)
+ c = *s - 'A' + 10;
+ else
+ break;
+
+ if (!is_longlong) {
+ if (is_signed) {
+ long sl = (long)ull;
+ assert(!check_mul_overflow(sl, base));
+ assert(!check_add_overflow(sl * base, c));
+ } else {
+ unsigned long ul = (unsigned long)ull;
+ assert(!check_mul_overflow(ul, base));
+ assert(!check_add_overflow(ul * base, c));
+ }
+ } else {
+ if (is_signed) {
+ long long sll = (long long)ull;
+ assert(!check_mul_overflow(sll, base));
+ assert(!check_add_overflow(sll * base, c));
+ } else {
+ assert(!check_mul_overflow(ull, base));
+ assert(!check_add_overflow(ull * base, c));
+ }
+ }
+
+ ull = ull * base + c;
+ s++;
+ }
+
+ if (neg)
+ ull = -ull;
+
+ if (endptr)
+ *endptr = (char *)s;
+
+ return ull;
}
long int strtol(const char *nptr, char **endptr, int base)
{
- return __strtoll(nptr, endptr, base, true, false);
+ return __strtoll(nptr, endptr, base, true, false);
}
unsigned long int strtoul(const char *nptr, char **endptr, int base)
{
- return __strtoll(nptr, endptr, base, false, false);
+ return __strtoll(nptr, endptr, base, false, false);
}
long long int strtoll(const char *nptr, char **endptr, int base)
{
- return __strtoll(nptr, endptr, base, true, true);
+ return __strtoll(nptr, endptr, base, true, true);
}
unsigned long long int strtoull(const char *nptr, char **endptr, int base)
{
- return __strtoll(nptr, endptr, base, false, true);
+ return __strtoll(nptr, endptr, base, false, true);
}
long atol(const char *ptr)
{
- return strtol(ptr, NULL, 10);
+ return strtol(ptr, NULL, 10);
}
extern char **environ;
char *getenv(const char *name)
{
- char **envp = environ, *delim;
- int len;
-
- while (*envp) {
- delim = strchr(*envp, '=');
- assert(delim);
- len = delim - *envp;
- if (memcmp(name, *envp, len) == 0 && !name[len])
- return delim + 1;
- ++envp;
- }
- return NULL;
+ char **envp = environ, *delim;
+ int len;
+
+ while (*envp) {
+ delim = strchr(*envp, '=');
+ assert(delim);
+ len = delim - *envp;
+ if (memcmp(name, *envp, len) == 0 && !name[len])
+ return delim + 1;
+ ++envp;
+ }
+ return NULL;
}
/* Very simple glob matching. Allows '*' at beginning and end of pattern. */