Uploaded image for project: 'Commons CLI'
  1. Commons CLI
  2. CLI-151

HelpFormatter wraps incorrectly on every line beyond the first

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • None
    • 1.2
    • Help formatter
    • None

    Description

      The method findWrapPos(...) in the HelpFormatter is a couple of bugs in the way that it deals with the "startPos" variable. This causes it to format every line beyond the first line by "startPos" to many characters, beyond the specified width.

      To see this, create an option with a long description, and then use the help formatter to print it. The first line will be the correct length. The 2nd, 3rd, etc lines will all be too long.

      I don't have a patch (sorry) - but here is a corrected version of the method.

      I fixed it in two places - both were using "width + startPos" when they should have been using width.

       protected int findWrapPos(String text, int width, int startPos)
          {
              int pos = -1;
      
              // the line ends before the max wrap pos or a new line char found
              if (((pos = text.indexOf('\n', startPos)) != -1 && pos <= width)
                  || ((pos = text.indexOf('\t', startPos)) != -1 && pos <= width))
              {
                  return pos+1;
              }
              else if ((width) >= text.length())
              {
                  return -1;
              }
      
      
              // look for the last whitespace character before startPos+width
              pos = width;
      
              char c;
      
              while ((pos >= startPos) && ((c = text.charAt(pos)) != ' ')
                     && (c != '\n') && (c != '\r'))
              {
                  --pos;
              }
      
              // if we found it - just return
              if (pos > startPos)
              {
                  return pos;
              }
              
              // must look for the first whitespace chearacter after startPos 
              // + width
              pos = startPos + width;
      
              while ((pos <= text.length()) && ((c = text.charAt(pos)) != ' ')
                     && (c != '\n') && (c != '\r'))
              {
                  ++pos;
              }
      
              return (pos == text.length())        ? (-1) : pos;
          }
      

      Attachments

        1. fix-wrapping.patch
          1 kB
          J. Lewis Muir

        Issue Links

          Activity

            People

              Unassigned Unassigned
              armbrust Dan Armbrust
              Votes:
              1 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: