summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorElliott Baron <elliott@localhost.localdomain>2008-12-19 17:00:51 -0500
committerElliott Baron <elliott@localhost.localdomain>2008-12-19 17:00:51 -0500
commit51d997112e435da6fc84713ef09908b3b8659798 (patch)
tree80db6ddb4d303aa515b28f7fc00594022565fa5a
parenta46143af464b24e75e784a3ebaebf86bc52a44ed (diff)
downloadsystemtap-steved-51d997112e435da6fc84713ef09908b3b8659798.tar.gz
systemtap-steved-51d997112e435da6fc84713ef09908b3b8659798.tar.xz
systemtap-steved-51d997112e435da6fc84713ef09908b3b8659798.zip
Better implementation for %M
-rw-r--r--ChangeLog9
-rw-r--r--runtime/vsprintf.c27
2 files changed, 26 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index ab8f482d..3b3007b7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-12-19 Elliott Baron <ebaron@redhat.com>
+
+ PR3668
+ * elaborate.cxx: Handling for %M.
+ * runtime/vsprintf.c: Likewise.
+ * staptree.cxx: Likewise.
+ * translate.cxx: Likewise.
+ * staptree.h: Added %M converter, conv_memory_hex, to enum
+
2008-12-16 Roland McGrath <roland@redhat.com>
* systemtap.spec (Requires): Add kernel-devel, is correct virtual
diff --git a/runtime/vsprintf.c b/runtime/vsprintf.c
index fbd90a83..60852872 100644
--- a/runtime/vsprintf.c
+++ b/runtime/vsprintf.c
@@ -283,7 +283,7 @@ int _stp_vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
continue;
case 's':
- case 'M':
+ case 'M':
case 'm':
s = va_arg(args, char *);
if ((unsigned long)s < PAGE_SIZE)
@@ -303,15 +303,23 @@ int _stp_vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
++str;
}
}
- for (i = 0; i < len; ++i) {
- if (str <= end) {
- if (*fmt == 'M')
- str = number(str, str + 2, (uint64_t)(unsigned char) *s, 16, 2, 2, STP_SPACE);
- else
- *str = *s;
- }
- ++str; ++s;
+ if (*fmt == 'M') {
+ str = number(str, str + len - 1 < end ? str + len - 1 : end,
+ (unsigned long) *(uint64_t *) s,
+ 16, field_width, len, flags);
+ }
+ else {
+ for (i = 0; i < len; ++i) {
+ if (str <= end) {
+ //if (*fmt == 'M')
+ //str = number(str, str + 2, (uint64_t)(unsigned char) *s, 16, 2, 2, STP_SPACE);
+ //else
+ *str = *s;
+ }
+ ++str; ++s;
+ }
}
+
while (len < field_width--) {
if (str <= end)
*str = ' ';
@@ -323,7 +331,6 @@ int _stp_vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
++str;
}
continue;
-
case 'X':
flags |= STP_LARGE;
case 'x':