projects
/
pintos-anon
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix %' grouping in printf().
[pintos-anon]
/
src
/
lib
/
stdio.c
diff --git
a/src/lib/stdio.c
b/src/lib/stdio.c
index 6a03f5388966260d375fc7c77b975986f9c0713e..98b63030b4d2925127b77f14b4f8a1394fa61066 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;
@@
-464,31
+469,27
@@
format_integer (uintmax_t value, bool negative, const struct integer_base *b,
const char *signifier; /* b->signifier or "". */
int precision; /* Rendered precision. */
int pad_cnt; /* # of pad characters to fill field width. */
const char *signifier; /* b->signifier or "". */
int precision; /* Rendered precision. */
int pad_cnt; /* # of pad characters to fill field width. */
- int
group_cnt; /* # of digits grouped
so far. */
+ int
digit_cnt; /* # of digits output
so far. */
/* Accumulate digits into buffer.
This algorithm produces digits in reverse order, so later we
will output the buffer's content in reverse. This is also
the reason that later we append zeros and the sign. */
cp = buf;
/* Accumulate digits into buffer.
This algorithm produces digits in reverse order, so later we
will output the buffer's content in reverse. This is also
the reason that later we append zeros and the sign. */
cp = buf;
-
group
_cnt = 0;
+
digit
_cnt = 0;
while (value > 0)
{
while (value > 0)
{
- if ((c->flags & GROUP) && group_cnt++ == b->group)
- {
- *cp++ = ',';
- group_cnt = 0;
- }
+ if ((c->flags & GROUP) && digit_cnt > 0 && digit_cnt % b->group == 0)
+ *cp++ = ',';
*cp++ = b->digits[value % b->base];
value /= b->base;
*cp++ = b->digits[value % b->base];
value /= b->base;
+ digit_cnt++;
}
/* Append enough zeros to match precision.
If requested precision is 0, then a value of zero is
rendered as a null string, otherwise as "0". */
precision = c->precision < 0 ? 1 : c->precision;
}
/* Append enough zeros to match precision.
If requested precision is 0, then a value of zero is
rendered as a null string, otherwise as "0". */
precision = c->precision < 0 ? 1 : c->precision;
- if (precision < 0)
- precision = 1;
while (cp - buf < precision && cp - buf < (int) sizeof buf - 8)
*cp++ = '0';
while (cp - buf < precision && cp - buf < (int) sizeof buf - 8)
*cp++ = '0';
@@
-555,51
+556,55
@@
__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
- ASCII characters are also rendered alongside. */
+/* Dumps the SIZE bytes in BUF to the console as hex bytes
+ arranged 16 per line. Numeric offsets are also included,
+ starting at OFS for the first byte in BUF. If ASCII is true
+ then the corresponding ASCII characters are also rendered
+ alongside. */
void
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;
}
}
}
}