deref.c

来自「gcc-2.95.3 Linux下最常用的C编译器」· C语言 代码 · 共 239 行

C
239
字号
/* * 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 */intmain (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 */intisref (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 */voidprocess (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 */voidrepair (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;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?