Add atoi().
authorBen Pfaff <blp@cs.stanford.edu>
Tue, 31 Aug 2004 22:03:49 +0000 (22:03 +0000)
committerBen Pfaff <blp@cs.stanford.edu>
Tue, 31 Aug 2004 22:03:49 +0000 (22:03 +0000)
Add a hex_dump() argument that specifies whether to include ASCII.
Mark vsnprintf(), vprintk() with PRINTF_FORMAT.

src/lib/lib.c
src/lib/lib.h

index 25b4cc1ea039970a5a7e9b3c02fbdb8c8d514adb..6e676cd1a6b1c9e04e356d08b83c23d18910c63c 100644 (file)
@@ -198,6 +198,38 @@ strtok_r (char *s, const char *delimiters, char **save_ptr)
     *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,
@@ -734,7 +766,7 @@ 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;
@@ -747,15 +779,20 @@ hex_dump (const void *buffer, size_t size)
       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;
index e163d877f6dcc454ba3e02ec741cc336f5903822..71291395ce2ccdcf9ea4b2c25421dc98a192c285 100644 (file)
@@ -2,6 +2,7 @@
 #define HEADER_LIB_H 1
 
 #include <stdarg.h>
+#include <stdbool.h>
 #include <stddef.h>
 #include "debug.h"
 
@@ -21,12 +22,14 @@ size_t strlen (const char *);
 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; }