Patch 9.0.0110

5 views
Skip to first unread message

Bram Moolenaar

unread,
Jul 30, 2022, 7:04:02 AM7/30/22
to vim...@googlegroups.com

Patch 9.0.0110
Problem: Help tag generation picks up words in code examples.
Solution: Skip over examples. (Carlo Teubner, closes #10813)
Files: src/help.c, runtime/doc/doctags.c, src/testdir/test_help.vim


*** ../vim-9.0.0109/src/help.c 2022-04-15 13:30:30.000000000 +0100
--- src/help.c 2022-07-30 12:02:00.415529097 +0100
***************
*** 960,965 ****
--- 960,967 ----
int utf8 = MAYBE;
int this_utf8;
int firstline;
+ int in_example;
+ int len;
int mix = FALSE; // detected mixed encodings

// Find all *.txt files.
***************
*** 1025,1030 ****
--- 1027,1033 ----
}
fname = files[fi] + dirlen + 1;

+ in_example = FALSE;
firstline = TRUE;
while (!vim_fgets(IObuff, IOSIZE, fd) && !got_int)
{
***************
*** 1059,1064 ****
--- 1062,1074 ----
}
firstline = FALSE;
}
+ if (in_example)
+ {
+ // skip over example; a non-white in the first column ends it
+ if (vim_strchr((char_u *)" \t\n\r", IObuff[0]))
+ continue;
+ in_example = FALSE;
+ }
p1 = vim_strchr(IObuff, '*'); // find first '*'
while (p1 != NULL)
{
***************
*** 1103,1108 ****
--- 1113,1122 ----
}
p1 = p2;
}
+ len = (int)STRLEN(IObuff);
+ if ((len == 2 && STRCMP(&IObuff[len - 2], ">\n") == 0)
+ || (len >= 3 && STRCMP(&IObuff[len - 3], " >\n") == 0))
+ in_example = TRUE;
line_breakcheck();
}

*** ../vim-9.0.0109/runtime/doc/doctags.c 2019-05-12 16:16:24.000000000 +0100
--- runtime/doc/doctags.c 2022-07-30 11:58:40.431442901 +0100
***************
*** 21,26 ****
--- 21,28 ----
char *p1, *p2;
char *p;
FILE *fd;
+ int len;
+ int in_example;

if (argc <= 1)
{
***************
*** 37,58 ****
fprintf(stderr, "Unable to open %s for reading\n", argv[0]);
continue;
}
while (fgets(line, LINELEN, fd) != NULL)
{
! p1 = strchr(line, '*'); /* find first '*' */
while (p1 != NULL)
{
! p2 = strchr(p1 + 1, '*'); /* find second '*' */
! if (p2 != NULL && p2 > p1 + 1) /* skip "*" and "**" */
{
for (p = p1 + 1; p < p2; ++p)
if (*p == ' ' || *p == '\t' || *p == '|')
break;
! /*
! * Only accept a *tag* when it consists of valid
! * characters, there is white space before it and is
! * followed by a white character or end-of-line.
! */
if (p == p2
&& (p1 == line || p1[-1] == ' ' || p1[-1] == '\t')
&& (strchr(" \t\n\r", p[1]) != NULL
--- 39,66 ----
fprintf(stderr, "Unable to open %s for reading\n", argv[0]);
continue;
}
+ in_example = 0;
while (fgets(line, LINELEN, fd) != NULL)
{
! if (in_example)
! {
! // skip over example; non-blank in first column ends example
! if (strchr(" \t\n\r", line[0]) != NULL)
! continue;
! in_example = 0;
! }
! p1 = strchr(line, '*'); // find first '*'
while (p1 != NULL)
{
! p2 = strchr(p1 + 1, '*'); // find second '*'
! if (p2 != NULL && p2 > p1 + 1) // skip "*" and "**"
{
for (p = p1 + 1; p < p2; ++p)
if (*p == ' ' || *p == '\t' || *p == '|')
break;
! // Only accept a *tag* when it consists of valid
! // characters, there is white space before it and is
! // followed by a white character or end-of-line.
if (p == p2
&& (p1 == line || p1[-1] == ' ' || p1[-1] == '\t')
&& (strchr(" \t\n\r", p[1]) != NULL
***************
*** 63,80 ****
printf("%s\t%s\t/*", p1, argv[0]);
while (*p1)
{
! /* insert backslash before '\\' and '/' */
if (*p1 == '\\' || *p1 == '/')
putchar('\\');
putchar(*p1);
++p1;
}
printf("*\n");
! p2 = strchr(p2 + 1, '*'); /* find next '*' */
}
}
p1 = p2;
}
}
fclose(fd);
}
--- 71,92 ----
printf("%s\t%s\t/*", p1, argv[0]);
while (*p1)
{
! // insert backslash before '\\' and '/'
if (*p1 == '\\' || *p1 == '/')
putchar('\\');
putchar(*p1);
++p1;
}
printf("*\n");
! p2 = strchr(p2 + 1, '*'); // find next '*'
}
}
p1 = p2;
}
+ len = strlen(line);
+ if ((len == 2 && strcmp(&line[len - 2], ">\n") == 0)
+ || (len >= 3 && strcmp(&line[len - 3], " >\n") == 0))
+ in_example = 1;
}
fclose(fd);
}
*** ../vim-9.0.0109/src/testdir/test_help.vim 2022-05-04 22:04:47.000000000 +0100
--- src/testdir/test_help.vim 2022-07-30 11:54:26.815321230 +0100
***************
*** 141,146 ****
--- 141,153 ----
call assert_equal(["help-tags\ttags\t1"], readfile('Xdir/tags'))
call delete('Xdir/tags')

+ " Test parsing tags
+ call writefile(['*tag1*', 'Example: >', ' *notag*', 'Example end: *tag2*'],
+ \ 'Xdir/a/doc/sample.txt')
+ helptags Xdir
+ call assert_equal(["tag1\ta/doc/sample.txt\t/*tag1*",
+ \ "tag2\ta/doc/sample.txt\t/*tag2*"], readfile('Xdir/tags'))
+
" Duplicate tags in the help file
call writefile(['*tag1*', '*tag1*', '*tag2*'], 'Xdir/a/doc/sample.txt')
call assert_fails('helptags Xdir', 'E154:')
*** ../vim-9.0.0109/src/version.c 2022-07-30 11:39:52.402622438 +0100
--- src/version.c 2022-07-30 11:54:15.711315491 +0100
***************
*** 737,738 ****
--- 737,740 ----
{ /* Add new patch number below this line */
+ /**/
+ 110,
/**/

--
Some of the well known MS-Windows errors:
EHUH Unexpected error
EUSER User error, not our fault!
EGOD Horrible problem, god knows what has happened
EERR Errornous error: nothing wrong

/// Bram Moolenaar -- Br...@Moolenaar.net -- http://www.Moolenaar.net \\\
/// \\\
\\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
Reply all
Reply to author
Forward
0 new messages