1/* vim:set ts=4 sw=4:
2 * this program makes a tags file for vim_ref.txt
3 *
4 * Usage: doctags vim_ref.txt vim_win.txt ... >tags
5 *
6 * A tag in this context is an identifier between stars, e.g. *c_files*
7 */
8
9#include <stdio.h>
10#include <string.h>
11#include <ctype.h>
12#include <stdlib.h>
13
14#define LINELEN 200
15
16	int
17main(argc, argv)
18	int		argc;
19	char	**argv;
20{
21	char	line[LINELEN];
22	char	*p1, *p2;
23	char	*p;
24	FILE	*fd;
25
26	if (argc <= 1)
27	{
28		fprintf(stderr, "Usage: doctags docfile ... >tags\n");
29		exit(1);
30	}
31	printf("help-tags\ttags\t1\n");
32	while (--argc > 0)
33	{
34		++argv;
35		fd = fopen(argv[0], "r");
36		if (fd == NULL)
37		{
38			fprintf(stderr, "Unable to open %s for reading\n", argv[0]);
39			continue;
40		}
41		while (fgets(line, LINELEN, fd) != NULL)
42		{
43			p1 = strchr(line, '*');				/* find first '*' */
44			while (p1 != NULL)
45			{
46				p2 = strchr(p1 + 1, '*');		/* find second '*' */
47				if (p2 != NULL && p2 > p1 + 1)	/* skip "*" and "**" */
48				{
49					for (p = p1 + 1; p < p2; ++p)
50						if (*p == ' ' || *p == '\t' || *p == '|')
51							break;
52					/*
53					 * Only accept a *tag* when it consists of valid
54					 * characters, there is white space before it and is
55					 * followed by a white character or end-of-line.
56					 */
57					if (p == p2
58							&& (p1 == line || p1[-1] == ' ' || p1[-1] == '\t')
59								&& (strchr(" \t\n\r", p[1]) != NULL
60									|| p[1] == '\0'))
61					{
62						*p2 = '\0';
63						++p1;
64						printf("%s\t%s\t/*", p1, argv[0]);
65						while (*p1)
66						{
67							/* insert backslash before '\\' and '/' */
68							if (*p1 == '\\' || *p1 == '/')
69								putchar('\\');
70							putchar(*p1);
71							++p1;
72						}
73						printf("*\n");
74						p2 = strchr(p2 + 1, '*');		/* find next '*' */
75					}
76				}
77				p1 = p2;
78			}
79		}
80		fclose(fd);
81	}
82	return 0;
83}
84