Messages in this thread Patch in this message | | | Date | Sat, 5 Jul 2008 15:24:04 +0200 (CEST) | From | Jan Engelhardt <> | Subject | Re: the printk problem |
| |
On Saturday 2008-07-05 14:52, Vegard Nossum wrote: >> On Saturday 2008-07-05 00:01, Andrew Morton wrote: >>> >>>We don't know how much interest there would be in churning NIPQUAD from >>>the net guys. Interestingly, there's also %C (wint_t) which is a >>>32-bit quantity. So we could just go and say "%C prints an ipv4 >>>address" and be done with it. But there's no way of doing that for >>>ipv6 addresses so things would become asymmetrical there. >> >> struct in6_addr src; >> printk("Source address: %p{ipv6}\n", &src); >> >> How about %p{feature}? > >Something like this? > >+static char *custom_format(char *buf, char *end, >+ const char *fmt, unsigned int fmtlen, void *arg)
I'd use const void *arg here, so nobody gets the idea that you could modify the argument while printing :)
>+{ >+ if (!strncmp(fmt, "sym", fmtlen)) { >+ char name[KSYM_SYMBOL_LEN]; >+ int len; >+ int i; >+ >+ len = sprint_symbol(name, (unsigned long) arg); >+ if (len < 0) >+ return buf; >+ >+ i = 0; >+ while (i < len) { >+ if (buf < end) >+ *buf = name[i]; >+ ++buf; >+ ++i; >+ } >+ }
And I assume it's then as simple as
} else if (strncmp(fmt, "nip6", fmtlen) == 0) { snprintf(buf, end - buf (+1?), NIP6_FMT in expanded form, NIP6 in expanded form(arg)); }
Hm, that's going to get a big function when everyone adds their fmttypes.
>+ >+ return buf; >+} >+ > static char *number(char *buf, char *end, unsigned long long num, int base, int size, int precision, int type) > { > /* we are called with base 8, 10 or 16, only, thus don't need "G..." */ >@@ -648,6 +673,25 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) > continue; > > case 'p': >+ if (fmt[1] == '{') { >+ const char *cfmt; >+ >+ /* Skip the '%{' */ >+ ++fmt; >+ ++fmt; >+
Not this?
/* Skip the '%p{' */ fmt += 3;
| |