diff man/deref.c @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/man/deref.c	Mon Aug 13 08:45:50 2007 +0200
@@ -0,0 +1,238 @@
+/*
+ * deref.c
+
+ *  compile command:  gcc -g -o deref deref.c
+
+ *  execute command:  deref filename.texi > newfile.texi
+
+ * To: bob@gnu.ai.mit.edu
+ * Subject: another tool
+ * Date: 18 Dec 91 16:03:13 EST (Wed)
+ * From: gatech!skeeve!arnold@eddie.mit.edu (Arnold D. Robbins)
+ *
+ * Here is deref.c.  It turns texinfo cross references back into the
+ * one argument form. It has the same limitations as fixref; one xref per
+ * line and can't cross lines.  You can use it to find references that do
+ * cross a line boundary this way:
+ *
+ * 	deref < manual > /dev/null 2>errs
+ *
+ * (This assumes bash or /bin/sh.)  The file errs will have list of lines
+ * where deref could not find matching braces.
+ *
+ * A gawk manual processed by deref goes through makeinfo without complaint.
+ * Compile with gcc and you should be set.
+ *
+ * Enjoy,
+ *
+ * Arnold
+ * -----------
+ */
+
+/*
+ * deref.c
+ *
+ * Make all texinfo references into the one argument form.
+ *
+ * Arnold Robbins
+ * arnold@skeeve.atl.ga.us
+ * December, 1991
+ *
+ * Copyright, 1991, Arnold Robbins
+ */
+
+/*
+ * LIMITATIONS:
+ *	One texinfo cross reference per line.
+ *	Cross references may not cross newlines.
+ *	Use of fgets for input (to be fixed).
+ */
+
+#include <stdio.h>
+#include <ctype.h>
+#include <errno.h>
+
+/* for gcc on the 3B1, delete if this gives you grief */
+extern int fclose (FILE * fp);
+extern int fprintf (FILE * fp, const char *str,...);
+
+extern char *strerror (int errno);
+extern char *strchr (char *cp, int ch);
+extern int strncmp (const char *s1, const char *s2, int count);
+
+extern int errno;
+
+void process (FILE * fp);
+void repair (char *line, char *ref, int toffset);
+
+int Errs = 0;
+char *Name = "stdin";
+int Line = 0;
+char *Me;
+
+/* main --- handle arguments, global vars for errors */
+
+int
+main (int argc, char **argv)
+{
+  FILE *fp;
+
+  Me = argv[0];
+
+  if (argc == 1)
+    process (stdin);
+  else
+    for (argc--, argv++; *argv != NULL; argc--, argv++)
+      {
+	if (argv[0][0] == '-' && argv[0][1] == '\0')
+	  {
+	    Name = "stdin";
+	    Line = 0;
+	    process (stdin);
+	  }
+	else if ((fp = fopen (*argv, "r")) != NULL)
+	  {
+	    Name = *argv;
+	    Line = 0;
+	    process (fp);
+	    fclose (fp);
+	  }
+	else
+	  {
+	    fprintf (stderr, "%s: can not open: %s\n",
+		     *argv, strerror (errno));
+	    Errs++;
+	  }
+      }
+  return Errs != 0;
+}
+
+/* isref --- decide if we've seen a texinfo cross reference */
+
+int
+isref (char *cp)
+{
+  if (strncmp (cp, "@ref{", 5) == 0)
+    return 5;
+  if (strncmp (cp, "@xref{", 6) == 0)
+    return 6;
+  if (strncmp (cp, "@pxref{", 7) == 0)
+    return 7;
+  return 0;
+}
+
+/* process --- read files, look for references, fix them up */
+
+void
+process (FILE * fp)
+{
+  char buf[BUFSIZ];
+  char *cp;
+  int count;
+
+  while (fgets (buf, sizeof buf, fp) != NULL)
+    {
+      Line++;
+      cp = strchr (buf, '@');
+      if (cp == NULL)
+	{
+	  fputs (buf, stdout);
+	  continue;
+	}
+      do
+	{
+	  count = isref (cp);
+	  if (count == 0)
+	    {
+	      cp++;
+	      cp = strchr (cp, '@');
+	      if (cp == NULL)
+		{
+		  fputs (buf, stdout);
+		  goto next;
+		}
+	      continue;
+	    }
+	  /* got one */
+	  repair (buf, cp, count);
+	  break;
+	}
+      while (cp != NULL);
+    next:;
+    }
+}
+
+/* repair --- turn all texinfo cross references into the one argument form */
+
+void
+repair (char *line, char *ref, int toffset)
+{
+  int braces = 1;		/* have seen first left brace */
+  char *cp;
+
+  ref += toffset;
+
+  /* output line up to and including left brace in reference */
+  for (cp = line; cp <= ref; cp++)
+    putchar (*cp);
+
+  /* output node name */
+  for (; *cp && *cp != '}' && *cp != ',' && *cp != '\n'; cp++)
+    putchar (*cp);
+
+  if (*cp != '}')
+    {				/* could have been one arg xref */
+      /* skip to matching right brace */
+      for (; braces > 0; cp++)
+	{
+	  switch (*cp)
+	    {
+	    case '@':
+	      cp++;		/* blindly skip next character */
+	      break;
+	    case '{':
+	      braces++;
+	      break;
+	    case '}':
+	      braces--;
+	      break;
+	    case '\n':
+	    case '\0':
+	      Errs++;
+	      fprintf (stderr,
+		       "%s: %s: %d: mismatched braces\n",
+		       Me, Name, Line);
+	      goto out;
+	    default:
+	      break;
+	    }
+	}
+    out:
+      ;
+    }
+
+  putchar ('}');
+  if (*cp == '}')
+    cp++;
+
+  /* now the rest of the line */
+  for (; *cp; cp++)
+    putchar (*cp);
+  return;
+}
+
+/* strerror --- return error string, delete if in your library */
+
+char *
+strerror (int errno)
+{
+  static char buf[100];
+  extern int sys_nerr;
+  extern char *sys_errlist[];
+
+  if (errno < sys_nerr && errno >= 0)
+    return sys_errlist[errno];
+
+  sprintf (buf, "unknown error %d", errno);
+  return buf;
+}