summaryrefslogtreecommitdiff
path: root/cesar/lib/src/trace.c
diff options
context:
space:
mode:
authorschodet2009-10-07 16:03:02 +0000
committerschodet2009-10-07 16:03:02 +0000
commitf8a666c1377aed4b1c5bbcc01a5bdd2762c73cd4 (patch)
treed959ec0499c8acd75bc11514dfcba1a9e7ab0e00 /cesar/lib/src/trace.c
parentf573c6085ce1c4ea83102445e54dcfa034954705 (diff)
cesar/lib/trace: add table format
This can be used to format several parameters with one callback. git-svn-id: svn+ssh://pessac/svn/cesar/trunk@6002 017c9cb6-072f-447c-8318-d5b54f68fe89
Diffstat (limited to 'cesar/lib/src/trace.c')
-rw-r--r--cesar/lib/src/trace.c59
1 files changed, 33 insertions, 26 deletions
diff --git a/cesar/lib/src/trace.c b/cesar/lib/src/trace.c
index 105ee08af6..c6ac7edbcf 100644
--- a/cesar/lib/src/trace.c
+++ b/cesar/lib/src/trace.c
@@ -212,6 +212,19 @@ trace_namespace_register_format_u64 (trace_namespace_t *ns, char code,
}
void
+trace_namespace_register_format_table (trace_namespace_t *ns, char code,
+ trace_format_table_t callback,
+ uint size)
+{
+ dbg_assert (ns);
+ dbg_assert ((code >= 'A' && code <= 'Z') || (code >= 'a' && code <= 'z'));
+ dbg_assert (callback);
+ dbg_assert (size > 2);
+ ns->formats[code - 'A'].callback.format_table = callback;
+ ns->formats[code - 'A'].size = size;
+}
+
+void
trace_buffer_add (trace_buffer_t *buf, const char *name, uint drop_level,
uint preload, bool locked, trace_namespace_t *namespace)
{
@@ -317,44 +330,38 @@ trace_buffer_dump_event (char *text, char *text_end,
if (*fp == '%' && *++fp != '%')
{
dbg_assert (((*fp >= 'A' && *fp <= 'Z')
- || (*fp >= 'a' && *fp <= 'z'))
- && namespace->formats[*fp - 'A'].size);
+ || (*fp >= 'a' && *fp <= 'z')));
+ uint format_size = namespace->formats[*fp - 'A'].size;
+ dbg_assert (format_size);
int ret;
- if (namespace->formats[*fp - 'A'].size == 1)
+ if (TRACE_DEBUG_ARGS && args < format_size)
{
- if (TRACE_DEBUG_ARGS && !args)
- {
- if (p == text_end)
- return -1;
- *p++ = '?';
- ret = 1;
- }
- else
- {
- dbg_assert (args);
- args--;
- ret = namespace->formats[*fp - 'A'].callback.format_u32 (
- p, text_end - p, *parg++);
- }
+ if (p == text_end)
+ return -1;
+ *p++ = '?';
+ ret = 1;
}
else
{
- if (TRACE_DEBUG_ARGS && args < 2)
+ dbg_assert (args >= format_size);
+ args -= format_size;
+ if (format_size == 1)
{
- if (p == text_end)
- return -1;
- *p++ = '?';
- ret = 1;
+ ret = namespace->formats[*fp - 'A'].callback.format_u32 (
+ p, text_end - p, *parg);
}
- else
+ else if (format_size == 2)
{
- dbg_assert (args >= 2);
- args -= 2;
u64 arg = (u64) parg[1] << 32 | parg[0];
ret = namespace->formats[*fp - 'A'].callback.format_u64 (
p, text_end - p, arg);
- parg += 2;
}
+ else
+ {
+ ret = namespace->formats[*fp - 'A'].callback.format_table
+ (p, text_end - p, parg, format_size);
+ }
+ parg += format_size;
}
if (ret == -1)
return -1;