diff runtime/doc/doctags.c @ 7:3fc0f57ecb91 v7.0001

updated for version 7.0001
author vimboss
date Sun, 13 Jun 2004 20:20:40 +0000
parents
children 33ba2adb6065
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/runtime/doc/doctags.c
@@ -0,0 +1,83 @@
+/* vim:set ts=4 sw=4:
+ * this program makes a tags file for vim_ref.txt
+ *
+ * Usage: doctags vim_ref.txt vim_win.txt ... >tags
+ *
+ * A tag in this context is an identifier between stars, e.g. *c_files*
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+#define LINELEN 200
+
+	int
+main(argc, argv)
+	int		argc;
+	char	**argv;
+{
+	char	line[LINELEN];
+	char	*p1, *p2;
+	char	*p;
+	FILE	*fd;
+
+	if (argc <= 1)
+	{
+		fprintf(stderr, "Usage: doctags docfile ... >tags\n");
+		exit(1);
+	}
+	printf("help-tags\ttags\t1\n");
+	while (--argc > 0)
+	{
+		++argv;
+		fd = fopen(argv[0], "r");
+		if (fd == NULL)
+		{
+			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
+									|| p[1] == '\0'))
+					{
+						*p2 = '\0';
+						++p1;
+						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);
+	}
+	return 0;
+}