svn commit: r320908 - head/sys/kern
Roman Divacky
rdivacky at freebsd.org
Wed Jul 12 07:55:12 UTC 2017
Clang knows about %b modifier and can do some semantic analysis on it.
Currently it type checks the first arg to be an int and the second to be
a char*.
Do you think it would be worth modifying the checks to include
this new functionality? Do you think you would like to take a stab
at it?
Search for FreeBSDbArg in contrib/llvm/tools/clang/lib/Sema/SemaChecking.cpp
if you want to take a look.
Thanks, Roman
On Wed, Jul 12, 2017 at 07:30:14AM +0000, Ryan Libby wrote:
> Author: rlibby
> Date: Wed Jul 12 07:30:14 2017
> New Revision: 320908
> URL: https://svnweb.freebsd.org/changeset/base/320908
>
> Log:
> kvprintf %b enhancements
>
> Make the %b formatter accept number formatting flags. It will now accept
> alternate form, precision, and length modifiers. It also now partially
> supports field width (but forces left justification).
>
> Reviewed by: markj
> Approved by: markj (mentor)
> Sponsored by: Dell EMC Isilon
> Differential Revision: https://reviews.freebsd.org/D11284
>
> Modified:
> head/sys/kern/subr_prf.c
>
> Modified: head/sys/kern/subr_prf.c
> ==============================================================================
> --- head/sys/kern/subr_prf.c Wed Jul 12 07:26:07 2017 (r320907)
> +++ head/sys/kern/subr_prf.c Wed Jul 12 07:30:14 2017 (r320908)
> @@ -650,7 +650,7 @@ kvprintf(char const *fmt, void (*func)(int, void*), vo
> uintmax_t num;
> int base, lflag, qflag, tmp, width, ladjust, sharpflag, neg, sign, dot;
> int cflag, hflag, jflag, tflag, zflag;
> - int dwidth, upper;
> + int bconv, dwidth, upper;
> char padc;
> int stop = 0, retval = 0;
>
> @@ -676,7 +676,7 @@ kvprintf(char const *fmt, void (*func)(int, void*), vo
> }
> percent = fmt - 1;
> qflag = 0; lflag = 0; ladjust = 0; sharpflag = 0; neg = 0;
> - sign = 0; dot = 0; dwidth = 0; upper = 0;
> + sign = 0; dot = 0; bconv = 0; dwidth = 0; upper = 0;
> cflag = 0; hflag = 0; jflag = 0; tflag = 0; zflag = 0;
> reswitch: switch (ch = (u_char)*fmt++) {
> case '.':
> @@ -724,28 +724,9 @@ reswitch: switch (ch = (u_char)*fmt++) {
> width = n;
> goto reswitch;
> case 'b':
> - num = (u_int)va_arg(ap, int);
> - p = va_arg(ap, char *);
> - for (q = ksprintn(nbuf, num, *p++, NULL, 0); *q;)
> - PCHAR(*q--);
> -
> - if (num == 0)
> - break;
> -
> - for (tmp = 0; *p;) {
> - n = *p++;
> - if (num & (1 << (n - 1))) {
> - PCHAR(tmp ? ',' : '<');
> - for (; (n = *p) > ' '; ++p)
> - PCHAR(n);
> - tmp = 1;
> - } else
> - for (; *p > ' '; ++p)
> - continue;
> - }
> - if (tmp)
> - PCHAR('>');
> - break;
> + ladjust = 1;
> + bconv = 1;
> + goto handle_nosign;
> case 'c':
> width -= 1;
>
> @@ -883,6 +864,10 @@ handle_nosign:
> num = (u_char)va_arg(ap, int);
> else
> num = va_arg(ap, u_int);
> + if (bconv) {
> + q = va_arg(ap, char *);
> + base = *q++;
> + }
> goto number;
> handle_sign:
> if (jflag)
> @@ -939,6 +924,26 @@ number:
>
> while (*p)
> PCHAR(*p--);
> +
> + if (bconv && num != 0) {
> + /* %b conversion flag format. */
> + tmp = retval;
> + while (*q) {
> + n = *q++;
> + if (num & (1 << (n - 1))) {
> + PCHAR(retval != tmp ?
> + ',' : '<');
> + for (; (n = *q) > ' '; ++q)
> + PCHAR(n);
> + } else
> + for (; *q > ' '; ++q)
> + continue;
> + }
> + if (retval != tmp) {
> + PCHAR('>');
> + width -= retval - tmp;
> + }
> + }
>
> if (ladjust)
> while (width-- > 0)
> _______________________________________________
> svn-src-head at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/svn-src-head
> To unsubscribe, send any mail to "svn-src-head-unsubscribe at freebsd.org"
More information about the svn-src-head
mailing list