projects
/
pintos-anon
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Move TODO.
[pintos-anon]
/
src
/
lib
/
stdio.c
diff --git
a/src/lib/stdio.c
b/src/lib/stdio.c
index 6a03f5388966260d375fc7c77b975986f9c0713e..13df2c7703fb47defa6fd3d9d0b9f71605961879 100644
(file)
--- a/
src/lib/stdio.c
+++ b/
src/lib/stdio.c
@@
-1,5
+1,7
@@
-#include <ctype.h>
#include <stdio.h>
#include <stdio.h>
+#include <ctype.h>
+#include <inttypes.h>
+#include <round.h>
#include <stdint.h>
#include <string.h>
#include <stdint.h>
#include <string.h>
@@
-198,6
+200,9
@@
__vprintf (const char *format, va_list args,
case INT:
value = va_arg (args, int);
break;
case INT:
value = va_arg (args, int);
break;
+ case INTMAX:
+ value = va_arg (args, intmax_t);
+ break;
case LONG:
value = va_arg (args, long);
break;
case LONG:
value = va_arg (args, long);
break;
@@
-239,6
+244,9
@@
__vprintf (const char *format, va_list args,
case INT:
value = va_arg (args, unsigned);
break;
case INT:
value = va_arg (args, unsigned);
break;
+ case INTMAX:
+ value = va_arg (args, uintmax_t);
+ break;
case LONG:
value = va_arg (args, unsigned long);
break;
case LONG:
value = va_arg (args, unsigned long);
break;
@@
-293,14
+301,11
@@
__vprintf (const char *format, va_list args,
case 'p':
{
/* Pointer conversion.
case 'p':
{
/* Pointer conversion.
- Format
non-null
pointers as %#x. */
+ Format pointers as %#x. */
void *p = va_arg (args, void *);
c.flags = POUND;
void *p = va_arg (args, void *);
c.flags = POUND;
- if (p != NULL)
- format_integer ((uintptr_t) p, false, &base_x, &c, output, aux);
- else
- format_string ("(nil)", 5, &c, output, aux);
+ format_integer ((uintptr_t) p, false, &base_x, &c, output, aux);
}
break;
}
break;
@@
-555,51
+560,54
@@
__printf (const char *format,
__vprintf (format, args, output, aux);
va_end (args);
}
__vprintf (format, args, output, aux);
va_end (args);
}
-
-/* Writes string S to the console, followed by a new-line
- character. */
-int
-puts (const char *s)
-{
- while (*s != '\0')
- putchar (*s++);
- putchar ('\n');
- return 0;
-}
\f
\f
-/* Dumps the SIZE bytes in BUFFER to the console as hex bytes
- arranged 16 per line. If ASCII is true then the corresponding
+/* Dumps the SIZE bytes in BUF to the console as hex bytes
+ arranged 16 per line, plus offsets listed starting at OFS for
+ the first byte in BU. If ASCII is true then the corresponding
ASCII characters are also rendered alongside. */
void
ASCII characters are also rendered alongside. */
void
-hex_dump (
const void *buffer
, size_t size, bool ascii)
+hex_dump (
uintptr_t ofs, const void *buf_
, size_t size, bool ascii)
{
{
- const size_t n_per_line = 16; /* Maximum bytes per line. */
- size_t n; /* Number of bytes in this line. */
- const uint8_t *p; /* Start of current line in buffer. */
+ const uint8_t *buf = buf_;
+ const size_t per_line = 16; /* Maximum bytes per line. */
- for (p = buffer; p < (uint8_t *) buffer + size; p += n)
+ while (size > 0)
{
{
+ size_t start, end, n;
size_t i;
size_t i;
-
+
/* Number of bytes on this line. */
/* Number of bytes on this line. */
- n = (uint8_t *) (buffer + size) - p;
- if (n > n_per_line)
- n = n_per_line;
+ start = ofs % per_line;
+ end = per_line;
+ if (end - start > size)
+ end = start + size;
+ n = end - start;
/* Print line. */
/* Print line. */
- for (i = 0; i < n; i++)
- printf ("%c%02x", i == n_per_line / 2 ? '-' : ' ', (unsigned) p[i]);
+ printf ("%08jx ", (uintmax_t) ROUND_DOWN (ofs, per_line));
+ for (i = 0; i < start; i++)
+ printf (" ");
+ for (; i < end; i++)
+ printf ("%02hhx%c",
+ buf[i - start], i == per_line / 2 - 1? '-' : ' ');
if (ascii)
{
if (ascii)
{
- for (; i <
n_
per_line; i++)
+ for (; i < per_line; i++)
printf (" ");
printf (" ");
- printf (" |");
- for (i = 0; i < n; i++)
- printf ("%c", isprint (p[i]) ? p[i] : '.');
- for (; i < n_per_line; i++)
+ printf ("|");
+ for (i = 0; i < start; i++)
+ printf (" ");
+ for (; i < end; i++)
+ printf ("%c",
+ isprint (buf[i - start]) ? buf[i - start] : '.');
+ for (; i < per_line; i++)
printf (" ");
printf ("|");
}
printf ("\n");
printf (" ");
printf ("|");
}
printf ("\n");
+
+ ofs += n;
+ buf += n;
+ size -= n;
}
}
}
}