[PATCH PR/42686] Align the help text output

Shujing Zhao pearly.zhao@oracle.com
Wed Mar 31 07:03:00 GMT 2010


On 03/22/2010 04:41 PM, Shujing Zhao wrote:
> On 03/19/2010 09:26 PM, Joseph S. Myers wrote:
>> On Fri, 19 Mar 2010, Shujing Zhao wrote:
>>
>>>> Why this increment?  Characters may have width 0 (combining 
>>>> characters) or
>>>> more than 1 and it's not clear why adding 1 should be the correct 
>>>> thing to
>>>> do here.
>>> It is changed to *length--* at the new logic.
>>> +      colwidth += wcwidth (wc[0]);
>>> +      length--;
>>> +      if (length == 0)
>>> +       len = remaining;
>>> I have tried to used length = length - nbytes to get the new length. 
>>> But if
>>> nbytes > 1 and the character is the last character of the string 
>>> (length will
>>> be 0 if it decreases nbytes), it would not assign the last variable 
>>> *len* to
>>> *len_bk*, then the character that maybe put into the ROOM would not be
>>> printed. That is to say, it presumes the nbytes is 1. If (nbytes > 
>>> 1), it
>>> would be handled specially (just to update the value of len_bk). At 
>>> the other
>>> conditionals, len_bk is always kept consistently with len.
>>
>> I'm afraid none of this makes any sense to me, because I have no idea 
>> what "length", "len" and "len_bk" are meant to be, and how they 
>> differ.  You need clearer variable names.  I think you also need 
>> comments at various points stating what the values various variables 
>> mean at those points, and maybe an overview comment about the 
>> algorithm used.  It would be best to avoid ambiguous terms such as 
>> "length" at all points in variable names and comments, instead talking 
>> about numbers of bytes difference between two points, or similar.
>>
>> For example, the present algorithm in opts.c:wrap_help might be 
>> described thus:
>>
>> /* Look for a suitable point at which to break HELP.  If there is one 
>>    after at most ROOM columns, take the latest such point.  Otherwise, 
>>    take the first such point in the string, or the end of the string 
>> if it    cannot be broken.  */
>>
>> If the new algorithm is still like that, you may just need to update 
>> variable names (and explain what the interface is for indicating both 
>> how much of the string to print, and how much (spaces) to skip before 
>> starting on the next line).
>>
>> The key variables to explain are LEN and I.  At each iteration in the 
>> present loop, something like this might explain them.
>>
>> /* The best candidate point found so far to break HELP is after LEN    
>> bytes, where either LEN < I, or LEN == REMAINING if the string cannot 
>>    be broken within the first I bytes.  If we are outside ROOM columns 
>> and    have found somewhere to break the string, that is the best 
>> point    available; otherwise, breaking after I bytes will be better 
>> if that is    a valid point to break.  */
>>
>> Now, things will be a bit more complicated in that you need to track 
>> the current column width as well as the current number of bytes of the 
>> string that take up that width.  But I think the basic idea is still 
>> the same - it is just that "length", "len" and "len_bk" are not useful 
>> variable names to distinguish the different quantities being tracked 
>> and so make clear whether particular arithmetic you are doing on them 
>> makes logical sense.  
> Thanks. I changed the "len_bk" to "pre_len_to_print" as the number of 
> bytes that have been found can be printed at ROOM columns, "len" to 
> "cur_len_to_print" as the possible number of bytes that can be printed 
> at ROOM columns, "length" to left_len as the number of bytes that MSGSTR 
> left to convert to wide character.
> Some comments are also added as your suggestion.
> 
>> I remain very suspicious of anything modifying a byte counter by 1 in 
>> this context; if you are ever modifying a byte counter by something 
>> other than the number of bytes in the relevant multibyte character I 
>> think you are confused and need to sort out the logic of the code so 
>> you don't need to do so.
> Thanks. You are right. I found the way to solve the problem that I have 
> mentioned when I explain why I have to use "length--". It just needs to 
> store the previous point that can be break the string before the new 
> point is set to the end of the string.
> 
> +      left_len -= nbytes;
> +
> +      /* Compute the point to break the string. */
> +      if (left_len == 0)
> +       {
> +         pre_len_to_print = cur_len_to_print;
> +         cur_len_to_print = remaining;
> +       }
> 
> Is it Ok?
> 
> Thanks
> Pearly
> 
Added the ChangeLog.
Is it OK?
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: ChangeLog
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20100331/78f47c11/attachment.ksh>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0331.patch
Type: text/x-patch
Size: 8370 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20100331/78f47c11/attachment.bin>


More information about the Gcc-patches mailing list