197 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			197 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* gen-helpfiles - create files containing builtin help text */
 | 
						|
 | 
						|
/* Copyright (C) 2012 Free Software Foundation, Inc.
 | 
						|
 | 
						|
   This file is part of GNU Bash, the Bourne Again SHell.
 | 
						|
 | 
						|
   Bash is free software: you can redistribute it and/or modify
 | 
						|
   it under the terms of the GNU General Public License as published by
 | 
						|
   the Free Software Foundation, either version 3 of the License, or
 | 
						|
   (at your option) any later version.
 | 
						|
 | 
						|
   Bash is distributed in the hope that it will be useful,
 | 
						|
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
   GNU General Public License for more details.
 | 
						|
 | 
						|
   You should have received a copy of the GNU General Public License
 | 
						|
   along with Bash.  If not, see <http://www.gnu.org/licenses/>.
 | 
						|
*/
 | 
						|
 | 
						|
/* This links with a specially-generated version of builtins.c and takes
 | 
						|
   the long_doc members of each struct builtin element and writes those to
 | 
						|
   the file named by the `handle' member of the struct builtin element. */
 | 
						|
 | 
						|
#if !defined (CROSS_COMPILING) 
 | 
						|
#  include <config.h>
 | 
						|
#else	/* CROSS_COMPILING */
 | 
						|
/* A conservative set of defines based on POSIX/SUS3/XPG6 */
 | 
						|
#  define HAVE_UNISTD_H
 | 
						|
#  define HAVE_STRING_H
 | 
						|
#  define HAVE_STDLIB_H
 | 
						|
 | 
						|
#  define HAVE_RENAME
 | 
						|
#endif /* CROSS_COMPILING */
 | 
						|
 | 
						|
#if defined (HAVE_UNISTD_H)
 | 
						|
#  ifdef _MINIX
 | 
						|
#    include <sys/types.h>
 | 
						|
#  endif
 | 
						|
#  include <unistd.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef _MINIX
 | 
						|
#  include "../bashtypes.h"
 | 
						|
#  if defined (HAVE_SYS_FILE_H)
 | 
						|
#    include <sys/file.h>
 | 
						|
#  endif
 | 
						|
#endif
 | 
						|
 | 
						|
#include "posixstat.h"
 | 
						|
#include "filecntl.h"
 | 
						|
 | 
						|
#include "../bashansi.h"
 | 
						|
#include <stdio.h>
 | 
						|
#include <errno.h>
 | 
						|
 | 
						|
#include "stdc.h"
 | 
						|
 | 
						|
#include "../builtins.h"
 | 
						|
#include "tmpbuiltins.h"
 | 
						|
 | 
						|
#if defined (USING_BASH_MALLOC)
 | 
						|
#undef xmalloc
 | 
						|
#undef xrealloc
 | 
						|
#undef xfree
 | 
						|
 | 
						|
#undef free		/* defined in xmalloc.h */
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef errno
 | 
						|
extern int errno;
 | 
						|
#endif
 | 
						|
 | 
						|
#if !defined (__STDC__) && !defined (strcpy)
 | 
						|
extern char *strcpy ();
 | 
						|
#endif /* !__STDC__ && !strcpy */
 | 
						|
 | 
						|
#define whitespace(c) (((c) == ' ') || ((c) == '\t'))
 | 
						|
 | 
						|
/* Flag values that builtins can have. */
 | 
						|
#define BUILTIN_FLAG_SPECIAL	0x01
 | 
						|
#define BUILTIN_FLAG_ASSIGNMENT 0x02
 | 
						|
#define BUILTIN_FLAG_POSIX_BUILTIN 0x04
 | 
						|
 | 
						|
#define BASE_INDENT	4
 | 
						|
 | 
						|
/* Non-zero means to produce separate help files for each builtin, named by
 | 
						|
   the builtin name, in `./helpfiles'. */
 | 
						|
int separate_helpfiles = 0;
 | 
						|
 | 
						|
/* Non-zero means to create single C strings for each `longdoc', with
 | 
						|
   embedded newlines, for ease of translation. */
 | 
						|
int single_longdoc_strings = 1;
 | 
						|
 | 
						|
/* The name of a directory into which the separate external help files will
 | 
						|
   eventually be installed. */
 | 
						|
char *helpfile_directory;
 | 
						|
 | 
						|
/* Forward declarations. */
 | 
						|
 | 
						|
int write_helpfiles __P((struct builtin *));
 | 
						|
 | 
						|
/* For each file mentioned on the command line, process it and
 | 
						|
   write the information to STRUCTFILE and EXTERNFILE, while
 | 
						|
   creating the production file if neccessary. */
 | 
						|
int
 | 
						|
main (argc, argv)
 | 
						|
     int argc;
 | 
						|
     char **argv;
 | 
						|
{
 | 
						|
  int arg_index = 1;
 | 
						|
 | 
						|
  while (arg_index < argc && argv[arg_index][0] == '-')
 | 
						|
    {
 | 
						|
      char *arg = argv[arg_index++];
 | 
						|
 | 
						|
      if (strcmp (arg, "-noproduction") == 0)
 | 
						|
	;
 | 
						|
      else if (strcmp (arg, "-H") == 0)
 | 
						|
	helpfile_directory = argv[arg_index++];
 | 
						|
      else if (strcmp (arg, "-S") == 0)
 | 
						|
	single_longdoc_strings = 0;
 | 
						|
      else
 | 
						|
	{
 | 
						|
	  fprintf (stderr, "%s: Unknown flag %s.\n", argv[0], arg);
 | 
						|
	  exit (2);
 | 
						|
	}
 | 
						|
    }
 | 
						|
 | 
						|
  write_helpfiles(shell_builtins);
 | 
						|
 | 
						|
  exit (0);
 | 
						|
}
 | 
						|
 | 
						|
/* Write DOCUMENTATION to STREAM, perhaps surrounding it with double-quotes
 | 
						|
   and quoting special characters in the string.  Handle special things for
 | 
						|
   internationalization (gettext) and the single-string vs. multiple-strings
 | 
						|
   issues. */
 | 
						|
void
 | 
						|
write_documentation (stream, documentation, indentation)
 | 
						|
     FILE *stream;
 | 
						|
     char *documentation;
 | 
						|
     int indentation;
 | 
						|
{
 | 
						|
  if (stream == 0)
 | 
						|
    return;
 | 
						|
 | 
						|
  if (documentation)
 | 
						|
    fprintf (stream, "%*s%s\n", indentation, " ", documentation);
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
write_helpfiles (builtins)
 | 
						|
     struct builtin *builtins;
 | 
						|
{
 | 
						|
  char *helpfile, *bname, *fname;
 | 
						|
  FILE *helpfp;
 | 
						|
  int i, hdlen;
 | 
						|
  struct builtin b;
 | 
						|
 | 
						|
  i = mkdir ("helpfiles", 0777);
 | 
						|
  if (i < 0 && errno != EEXIST)
 | 
						|
    {
 | 
						|
      fprintf (stderr, "write_helpfiles: helpfiles: cannot create directory\n");
 | 
						|
      return -1;
 | 
						|
    }
 | 
						|
 | 
						|
  hdlen = strlen ("helpfiles/");
 | 
						|
  for (i = 0; i < num_shell_builtins; i++)
 | 
						|
    {
 | 
						|
      b = builtins[i];
 | 
						|
 | 
						|
      fname = (char *)b.handle;
 | 
						|
      helpfile = (char *)malloc (hdlen + strlen (fname) + 1);
 | 
						|
      if (helpfile == 0)
 | 
						|
	{
 | 
						|
	  fprintf (stderr, "gen-helpfiles: cannot allocate memory\n");
 | 
						|
	  exit (1);
 | 
						|
	}
 | 
						|
      sprintf (helpfile, "helpfiles/%s", fname);
 | 
						|
 | 
						|
      helpfp = fopen (helpfile, "w");
 | 
						|
      if (helpfp == 0)
 | 
						|
	{
 | 
						|
	  fprintf (stderr, "write_helpfiles: cannot open %s\n", helpfile);
 | 
						|
	  free (helpfile);
 | 
						|
	  continue;
 | 
						|
	}
 | 
						|
 | 
						|
      write_documentation (helpfp, b.long_doc[0], 4);
 | 
						|
 | 
						|
      fflush (helpfp);
 | 
						|
      fclose (helpfp);
 | 
						|
      free (helpfile);
 | 
						|
    }
 | 
						|
  return 0;
 | 
						|
}
 |