On 12/16/2016 17:44, Warner Losh wrote:
> On Fri, Dec 16, 2016 at 3:07 PM, John Baldwin <j...@freebsd.org> wrote:
>> On Friday, December 16, 2016 04:53:04 PM Eric van Gyzen wrote:
>>> On 12/16/2016 16:45, John Baldwin wrote:
>>>> On Friday, December 16, 2016 08:53:26 PM Dimitry Andric wrote:
>>>>> On 16 Dec 2016, at 20:31, Baptiste Daroussin <b...@freebsd.org> wrote:
>>>>>>
>>>>>> On Fri, Dec 16, 2016 at 01:44:51AM +0000, Conrad E. Meyer wrote:
>>>>>>> Author: cem
>>>>>>> Date: Fri Dec 16 01:44:50 2016
>>>>>>> New Revision: 310138
>>>>>>> URL: https://svnweb.freebsd.org/changeset/base/310138
>>>>>>>
>>>>>>> Log:
>>>>>>>  vfprintf(3): Add support for kernel %b format
>>>>>>>
>>>>>>>  This is a direct port of the kernel %b format.
>>>>>>>
>>>>>>>  I'm unclear on if (more) non-portable printf extensions will be a
>>>>>>>  problem. I think it's desirable to have userspace formats include all
>>>>>>>  kernel formats, but there may be competing goals I'm not aware of.
>>>>>>>
>>>>>>>  Reviewed by:    no one, unfortunately
>>>>>>>  Sponsored by:   Dell EMC Isilon
>>>>>>>  Differential Revision:  https://reviews.freebsd.org/D8426
>>>>>>>
>>>>>>
>>>>>> I really don't think it is a good idea, if used in userland it would be 
>>>>>> make
>>>>>> more of our code difficult to port elsewhere.
>>>>>
>>>>> Indeed, this is a bad idea.  These custom format specifiers should be
>>>>> eliminated, not multiplied. :-)
>>>>>
>>>>>
>>>>>> Other than that, it makes more difficult to use vanilla gcc with out 
>>>>>> userland.
>>>>>> and it is adding more complexity to be able to build freebsd from a non 
>>>>>> freebsd
>>>>>> system which some people are working on.
>>>>>>
>>>>>> Personnaly I would prefer to see those extensions removed from the 
>>>>>> kernel rather
>>>>>> than see them available in userland.
>>>>>
>>>>> Same here.
>>>>>
>>>>>
>>>>>> Can't we use simple helper function instead?
>>>>>
>>>>> Yes, please.  Just take the snprintb(3) function from NetBSD:
>>>>>
>>>>> http://netbsd.gw.com/cgi-bin/man-cgi?snprintb+3+NetBSD-current
>>>>
>>>> In general I agree with something like this instead, but it is quite a bit 
>>>> more
>>>> tedious to use as you have to run it once to determine the length, 
>>>> allocate a
>>>> buffer, and then run it again.  Calling malloc() for that buffer isn't 
>>>> always
>>>> convenient in the kernel (though it should be fine in userland).  Having 
>>>> it live
>>>> in printf() itself means the output is generated to the stream without 
>>>> having to
>>>> manage a variable-sized intermediate buffer.
>>>
>>> I imagine most callers can simply use a char[sizeof(fmt)+C] on the stack, 
>>> where
>>> C is some constant that I haven't taken the time to calculate, at the risk 
>>> of
>>> making myself look foolish and unprofessional.
>>
>> Hmm, that might work, but it is still cumbersome.  Probably to make things 
>> readable
>> we'd end up with a wrapper:
>>
>> printb(uint val, const char *fmt)
>> {
>>    char buf[strlen(fmt) + C];
>>
>>    snprintb(...);
>>    printf("%s", buf);
>> }
> 
> Sadly this "cure" is worse than the disease.

How about this cure?

        printf("reg=%b\n", value, FORMAT);

        // versus

        char buf[BITMASK_BUFFER_SIZE(FORMAT)];
        printf("reg=%s\n", format_bitmask(buf, sizeof(buf), value, FORMAT));

That doesn't seem so bad.

Eric
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to