*save_ptr = s;
return token;
}
+
+int
+atoi (const char *s)
+{
+ bool negative;
+ int value;
+
+ /* Skip white space. */
+ while (isspace (*s))
+ s++;
+
+ /* Parse sign. */
+ negative = false;
+ if (*s == '+')
+ s++;
+ else if (*s == '-')
+ {
+ negative = true;
+ s++;
+ }
+
+ /* Parse digits. We always initially parse the value as
+ negative, and then make it positive later, because the
+ negative range of an int is bigger than the positive range
+ on a 2's complement system. */
+ for (value = 0; isdigit (*s); s++)
+ value = value * 10 - (*s - '0');
+ if (!negative)
+ value = -value;
+
+ return value;
+}
\f
static void
vprintf_core (const char *format, va_list args,
}
\f
void
-hex_dump (const void *buffer, size_t size)
+hex_dump (const void *buffer, size_t size, bool ascii)
{
const size_t n_per_line = 16;
const uint8_t *p = buffer;
printk ("%08zx", ofs);
n = size >= n_per_line ? n_per_line : size;
for (i = 0; i < n; i++)
- printk ("%c%02x", i == n / 2 ? '-' : ' ', (unsigned) p[i]);
- for (; i < n_per_line; i++)
- printk (" ");
- printk (" |");
- for (i = 0; i < n; i++)
- printk ("%c", isprint (p[i]) ? p[i] : '.');
- for (; i < n_per_line; i++)
- printk (" ");
- printk ("|\n");
+ printk ("%c%02x", i == n_per_line / 2 ? '-' : ' ', (unsigned) p[i]);
+
+ if (ascii)
+ {
+ for (; i < n_per_line; i++)
+ printk (" ");
+ printk (" |");
+ for (i = 0; i < n; i++)
+ printk ("%c", isprint (p[i]) ? p[i] : '.');
+ for (; i < n_per_line; i++)
+ printk (" ");
+ printk ("|");
+ }
+ printk ("\n");
p += n;
ofs += n;
#define HEADER_LIB_H 1
#include <stdarg.h>
+#include <stdbool.h>
#include <stddef.h>
#include "debug.h"
int strcmp (const char *, const char *);
char *strtok_r (char *, const char *, char **);
-void vprintk (const char *, va_list);
+int atoi (const char *);
+
+void vprintk (const char *, va_list) PRINTF_FORMAT (1, 0);
void printk (const char *, ...) PRINTF_FORMAT (1, 2);
-int vsnprintf (char *, size_t, const char *, va_list);
+int vsnprintf (char *, size_t, const char *, va_list) PRINTF_FORMAT (3, 0);
int snprintf (char *, size_t, const char *, ...) PRINTF_FORMAT (3, 4);
-void hex_dump (const void *, size_t size);
+void hex_dump (const void *, size_t size, bool ascii);
static inline int isdigit (int c) { return c >= '0' && c <= '9'; }
static inline int isprint (int c) { return c >= 32 && c < 127; }