1989-05-08 21:10:27 +00:00
|
|
|
|
/* Generate doc-string file for GNU Emacs from source files.
|
2011-01-25 04:08:28 +00:00
|
|
|
|
Copyright (C) 1985-1986, 1992-1994, 1997, 1999-2011
|
2008-01-07 08:42:46 +00:00
|
|
|
|
Free Software Foundation, Inc.
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
|
|
|
|
This file is part of GNU Emacs.
|
|
|
|
|
|
2008-05-09 23:19:13 +00:00
|
|
|
|
GNU Emacs is free software: you can redistribute it and/or modify
|
1989-10-31 16:00:17 +00:00
|
|
|
|
it under the terms of the GNU General Public License as published by
|
2008-05-09 23:19:13 +00:00
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
(at your option) any later version.
|
1989-10-31 16:00:17 +00:00
|
|
|
|
|
1989-05-08 21:10:27 +00:00
|
|
|
|
GNU Emacs is distributed in the hope that it will be useful,
|
1989-10-31 16:00:17 +00:00
|
|
|
|
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.
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
1989-10-31 16:00:17 +00:00
|
|
|
|
You should have received a copy of the GNU General Public License
|
2008-05-09 23:19:13 +00:00
|
|
|
|
along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
|
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
|
|
|
|
/* The arguments given to this program are all the C and Lisp source files
|
|
|
|
|
of GNU Emacs. .elc and .el and .c files are allowed.
|
|
|
|
|
A .o file can also be specified; the .c file it was made from is used.
|
|
|
|
|
This helps the makefile pass the correct list of files.
|
2003-12-24 06:49:23 +00:00
|
|
|
|
Option -d DIR means change to DIR before looking for files.
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
|
|
|
|
The results, which go to standard output or to a file
|
|
|
|
|
specified with -a or -o (-a to append, -o to start from nothing),
|
|
|
|
|
are entries containing function or variable names and their documentation.
|
|
|
|
|
Each entry starts with a ^_ character.
|
|
|
|
|
Then comes F for a function or V for a variable.
|
|
|
|
|
Then comes the function or variable name, terminated with a newline.
|
|
|
|
|
Then comes the documentation for that function or variable.
|
|
|
|
|
*/
|
|
|
|
|
|
1999-09-03 23:12:27 +00:00
|
|
|
|
#include <config.h>
|
|
|
|
|
|
|
|
|
|
/* defined to be emacs_main, sys_fopen, etc. in config.h */
|
|
|
|
|
#undef main
|
|
|
|
|
#undef fopen
|
|
|
|
|
#undef chdir
|
1995-05-04 21:57:30 +00:00
|
|
|
|
|
1989-05-08 21:10:27 +00:00
|
|
|
|
#include <stdio.h>
|
1994-01-06 03:59:30 +00:00
|
|
|
|
#ifdef MSDOS
|
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
#endif /* MSDOS */
|
1994-11-01 05:23:42 +00:00
|
|
|
|
#ifdef WINDOWSNT
|
2005-03-04 11:14:03 +00:00
|
|
|
|
#include <stdlib.h>
|
1994-11-01 05:23:42 +00:00
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
#include <direct.h>
|
|
|
|
|
#endif /* WINDOWSNT */
|
1994-01-06 03:59:30 +00:00
|
|
|
|
|
1994-11-01 05:23:42 +00:00
|
|
|
|
#ifdef DOS_NT
|
1994-01-06 03:59:30 +00:00
|
|
|
|
#define READ_TEXT "rt"
|
|
|
|
|
#define READ_BINARY "rb"
|
1994-11-01 05:23:42 +00:00
|
|
|
|
#else /* not DOS_NT */
|
1994-01-06 03:59:30 +00:00
|
|
|
|
#define READ_TEXT "r"
|
|
|
|
|
#define READ_BINARY "r"
|
1994-11-01 05:23:42 +00:00
|
|
|
|
#endif /* not DOS_NT */
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
2005-05-13 08:53:17 +00:00
|
|
|
|
#ifndef DIRECTORY_SEP
|
|
|
|
|
#define DIRECTORY_SEP '/'
|
|
|
|
|
#endif
|
|
|
|
|
|
2004-04-26 10:49:11 +00:00
|
|
|
|
#ifndef IS_DIRECTORY_SEP
|
2005-05-13 08:53:17 +00:00
|
|
|
|
#define IS_DIRECTORY_SEP(_c_) ((_c_) == DIRECTORY_SEP)
|
2004-04-26 10:49:11 +00:00
|
|
|
|
#endif
|
|
|
|
|
|
2010-07-02 22:18:28 +00:00
|
|
|
|
int scan_file (char *filename);
|
Fix warnings produced by compiling with -Wwrite_strings (i.e. use const char *).
* b2m.c (concat, fatal): Use const char*.
(main): Don't assign labels a string literal.
* ebrowse.c (struct member): filename, def_filename is const.
(struct sym): filename, sfilename is const.
(struct kw): name is const.
(add_sym, yyerror, token_string, insert_keyword, main): Use const char*.
* emacsclient.c (message, sock_err_message, send_to_emacs)
(quote_argument, set_local_socket)
(start_daemon_and_retry_set_socket): Use const char*.
* etags.c (compressor, language, Ada_suffix, Ada_help, Asm_suffixes)
(Asm_help, default_C_suffixes, default_C_help, Cplusplus_suffixes)
(Cplusplus_help, Cjava_suffixes, Cobol_suffixes, Cstar_suffixes)
(Erlang_suffixes, Erlang_help, Forth_suffixes, Forth_help)
(Fortran_suffixes, Fortran_help, HTML_suffixes, HTML_help)
(Lisp_suffixes, Lisp_help, Lua_suffixes, Lua_help)
(Makefile_filenames, Makefile_help, Objc_suffixes, Objc_help)
(Pascal_suffixes, Pascal_help, Perl_suffixes, Perl_interpreters)
(Perl_help, PHP_suffixes, PHP_help, plain_C_suffixses, PS_suffixes)
(PS_help, Prolog_suffixes, Prolog_help, Python_suffixes, Python_help)
(Scheme_suffixes, Scheme_help, TeX_suffixes, TeX_help, Texinfo_suffixes)
(Texinfo_help, Yacc_suffixes, Yacc_help, auto_help, none_help)
(no_lang_help, print_language_names)
(get_language_from_interpreter, get_language_from_filename)
(init, make_tag, struct C_stab_entry, write_classname, TEX_defenv)
(TEX_decode_env, nocase_tail, savestr, savenstr, fatal, pfatal)
(concat): Use const char*.
* make-docfile.c (error, fatal, scan_c_file, scan_lisp_file): Use
const char *.
* movemail.c (fatal, error, concat): Use const char *.
* pop.c (pop_multi_first, socket_connection, sendline): Use conat char*.
* pop.h (pop_multi_first): Use const char *.
(_ARGS): Remove.
* sorted-doc.c (error, fatal, states): Use const char *.
* update-game-score.c (get_prefix, write_scores, main): Use const char*.
2010-08-11 08:20:34 +00:00
|
|
|
|
int scan_lisp_file (const char *filename, const char *mode);
|
|
|
|
|
int scan_c_file (char *filename, const char *mode);
|
|
|
|
|
void fatal (const char *s1, const char *s2) NO_RETURN;
|
1994-10-12 20:21:51 +00:00
|
|
|
|
|
1995-06-08 20:13:45 +00:00
|
|
|
|
#ifdef MSDOS
|
|
|
|
|
/* s/msdos.h defines this as sys_chdir, but we're not linking with the
|
|
|
|
|
file where that function is defined. */
|
|
|
|
|
#undef chdir
|
|
|
|
|
#endif
|
|
|
|
|
|
1998-04-27 09:22:29 +00:00
|
|
|
|
#include <unistd.h>
|
|
|
|
|
|
1994-12-21 16:16:45 +00:00
|
|
|
|
/* Stdio stream for output to the DOC file. */
|
1989-05-08 21:10:27 +00:00
|
|
|
|
FILE *outfile;
|
|
|
|
|
|
1994-12-21 16:16:45 +00:00
|
|
|
|
/* Name this program was invoked with. */
|
|
|
|
|
char *progname;
|
|
|
|
|
|
2001-11-15 15:50:31 +00:00
|
|
|
|
/* Print error message. `s1' is printf control string, `s2' is arg for it. */
|
1994-12-21 16:16:45 +00:00
|
|
|
|
|
|
|
|
|
/* VARARGS1 */
|
|
|
|
|
void
|
Fix warnings produced by compiling with -Wwrite_strings (i.e. use const char *).
* b2m.c (concat, fatal): Use const char*.
(main): Don't assign labels a string literal.
* ebrowse.c (struct member): filename, def_filename is const.
(struct sym): filename, sfilename is const.
(struct kw): name is const.
(add_sym, yyerror, token_string, insert_keyword, main): Use const char*.
* emacsclient.c (message, sock_err_message, send_to_emacs)
(quote_argument, set_local_socket)
(start_daemon_and_retry_set_socket): Use const char*.
* etags.c (compressor, language, Ada_suffix, Ada_help, Asm_suffixes)
(Asm_help, default_C_suffixes, default_C_help, Cplusplus_suffixes)
(Cplusplus_help, Cjava_suffixes, Cobol_suffixes, Cstar_suffixes)
(Erlang_suffixes, Erlang_help, Forth_suffixes, Forth_help)
(Fortran_suffixes, Fortran_help, HTML_suffixes, HTML_help)
(Lisp_suffixes, Lisp_help, Lua_suffixes, Lua_help)
(Makefile_filenames, Makefile_help, Objc_suffixes, Objc_help)
(Pascal_suffixes, Pascal_help, Perl_suffixes, Perl_interpreters)
(Perl_help, PHP_suffixes, PHP_help, plain_C_suffixses, PS_suffixes)
(PS_help, Prolog_suffixes, Prolog_help, Python_suffixes, Python_help)
(Scheme_suffixes, Scheme_help, TeX_suffixes, TeX_help, Texinfo_suffixes)
(Texinfo_help, Yacc_suffixes, Yacc_help, auto_help, none_help)
(no_lang_help, print_language_names)
(get_language_from_interpreter, get_language_from_filename)
(init, make_tag, struct C_stab_entry, write_classname, TEX_defenv)
(TEX_decode_env, nocase_tail, savestr, savenstr, fatal, pfatal)
(concat): Use const char*.
* make-docfile.c (error, fatal, scan_c_file, scan_lisp_file): Use
const char *.
* movemail.c (fatal, error, concat): Use const char *.
* pop.c (pop_multi_first, socket_connection, sendline): Use conat char*.
* pop.h (pop_multi_first): Use const char *.
(_ARGS): Remove.
* sorted-doc.c (error, fatal, states): Use const char *.
* update-game-score.c (get_prefix, write_scores, main): Use const char*.
2010-08-11 08:20:34 +00:00
|
|
|
|
error (const char *s1, const char *s2)
|
1994-12-21 16:16:45 +00:00
|
|
|
|
{
|
|
|
|
|
fprintf (stderr, "%s: ", progname);
|
|
|
|
|
fprintf (stderr, s1, s2);
|
|
|
|
|
fprintf (stderr, "\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Print error message and exit. */
|
|
|
|
|
|
|
|
|
|
/* VARARGS1 */
|
|
|
|
|
void
|
Fix warnings produced by compiling with -Wwrite_strings (i.e. use const char *).
* b2m.c (concat, fatal): Use const char*.
(main): Don't assign labels a string literal.
* ebrowse.c (struct member): filename, def_filename is const.
(struct sym): filename, sfilename is const.
(struct kw): name is const.
(add_sym, yyerror, token_string, insert_keyword, main): Use const char*.
* emacsclient.c (message, sock_err_message, send_to_emacs)
(quote_argument, set_local_socket)
(start_daemon_and_retry_set_socket): Use const char*.
* etags.c (compressor, language, Ada_suffix, Ada_help, Asm_suffixes)
(Asm_help, default_C_suffixes, default_C_help, Cplusplus_suffixes)
(Cplusplus_help, Cjava_suffixes, Cobol_suffixes, Cstar_suffixes)
(Erlang_suffixes, Erlang_help, Forth_suffixes, Forth_help)
(Fortran_suffixes, Fortran_help, HTML_suffixes, HTML_help)
(Lisp_suffixes, Lisp_help, Lua_suffixes, Lua_help)
(Makefile_filenames, Makefile_help, Objc_suffixes, Objc_help)
(Pascal_suffixes, Pascal_help, Perl_suffixes, Perl_interpreters)
(Perl_help, PHP_suffixes, PHP_help, plain_C_suffixses, PS_suffixes)
(PS_help, Prolog_suffixes, Prolog_help, Python_suffixes, Python_help)
(Scheme_suffixes, Scheme_help, TeX_suffixes, TeX_help, Texinfo_suffixes)
(Texinfo_help, Yacc_suffixes, Yacc_help, auto_help, none_help)
(no_lang_help, print_language_names)
(get_language_from_interpreter, get_language_from_filename)
(init, make_tag, struct C_stab_entry, write_classname, TEX_defenv)
(TEX_decode_env, nocase_tail, savestr, savenstr, fatal, pfatal)
(concat): Use const char*.
* make-docfile.c (error, fatal, scan_c_file, scan_lisp_file): Use
const char *.
* movemail.c (fatal, error, concat): Use const char *.
* pop.c (pop_multi_first, socket_connection, sendline): Use conat char*.
* pop.h (pop_multi_first): Use const char *.
(_ARGS): Remove.
* sorted-doc.c (error, fatal, states): Use const char *.
* update-game-score.c (get_prefix, write_scores, main): Use const char*.
2010-08-11 08:20:34 +00:00
|
|
|
|
fatal (const char *s1, const char *s2)
|
1994-12-21 16:16:45 +00:00
|
|
|
|
{
|
|
|
|
|
error (s1, s2);
|
2004-05-08 15:26:33 +00:00
|
|
|
|
exit (EXIT_FAILURE);
|
1994-12-21 16:16:45 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Like malloc but get fatal error if memory is exhausted. */
|
|
|
|
|
|
2004-04-07 19:18:42 +00:00
|
|
|
|
void *
|
2010-07-03 00:50:23 +00:00
|
|
|
|
xmalloc (unsigned int size)
|
1994-12-21 16:16:45 +00:00
|
|
|
|
{
|
2004-04-07 19:18:42 +00:00
|
|
|
|
void *result = (void *) malloc (size);
|
1994-12-21 16:16:45 +00:00
|
|
|
|
if (result == NULL)
|
|
|
|
|
fatal ("virtual memory exhausted", 0);
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
1994-10-12 20:21:51 +00:00
|
|
|
|
int
|
2010-07-03 00:50:23 +00:00
|
|
|
|
main (int argc, char **argv)
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
int err_count = 0;
|
1994-10-21 20:31:43 +00:00
|
|
|
|
int first_infile;
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
1994-12-21 16:16:45 +00:00
|
|
|
|
progname = argv[0];
|
|
|
|
|
|
1995-06-20 02:52:38 +00:00
|
|
|
|
outfile = stdout;
|
|
|
|
|
|
1994-11-01 05:23:42 +00:00
|
|
|
|
/* Don't put CRs in the DOC file. */
|
1994-01-06 03:59:30 +00:00
|
|
|
|
#ifdef MSDOS
|
1995-06-21 19:45:27 +00:00
|
|
|
|
_fmode = O_BINARY;
|
1995-06-20 02:52:38 +00:00
|
|
|
|
#if 0 /* Suspicion is that this causes hanging.
|
|
|
|
|
So instead we require people to use -o on MSDOS. */
|
1994-01-06 03:59:30 +00:00
|
|
|
|
(stdout)->_flag &= ~_IOTEXT;
|
|
|
|
|
_setmode (fileno (stdout), O_BINARY);
|
1995-06-20 02:52:38 +00:00
|
|
|
|
#endif
|
|
|
|
|
outfile = 0;
|
1994-01-06 03:59:30 +00:00
|
|
|
|
#endif /* MSDOS */
|
1994-11-01 05:23:42 +00:00
|
|
|
|
#ifdef WINDOWSNT
|
|
|
|
|
_fmode = O_BINARY;
|
|
|
|
|
_setmode (fileno (stdout), O_BINARY);
|
|
|
|
|
#endif /* WINDOWSNT */
|
|
|
|
|
|
1989-05-08 21:10:27 +00:00
|
|
|
|
/* If first two args are -o FILE, output to FILE. */
|
|
|
|
|
i = 1;
|
|
|
|
|
if (argc > i + 1 && !strcmp (argv[i], "-o"))
|
|
|
|
|
{
|
|
|
|
|
outfile = fopen (argv[i + 1], "w");
|
|
|
|
|
i += 2;
|
|
|
|
|
}
|
|
|
|
|
if (argc > i + 1 && !strcmp (argv[i], "-a"))
|
|
|
|
|
{
|
|
|
|
|
outfile = fopen (argv[i + 1], "a");
|
|
|
|
|
i += 2;
|
|
|
|
|
}
|
1993-05-15 23:06:16 +00:00
|
|
|
|
if (argc > i + 1 && !strcmp (argv[i], "-d"))
|
|
|
|
|
{
|
2011-01-23 07:30:19 +00:00
|
|
|
|
if (chdir (argv[i + 1]) != 0)
|
|
|
|
|
{
|
|
|
|
|
perror (argv[i + 1]);
|
|
|
|
|
return EXIT_FAILURE;
|
|
|
|
|
}
|
1993-05-15 23:06:16 +00:00
|
|
|
|
i += 2;
|
|
|
|
|
}
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
1995-06-20 02:52:38 +00:00
|
|
|
|
if (outfile == 0)
|
|
|
|
|
fatal ("No output file specified", "");
|
|
|
|
|
|
1994-10-21 20:31:43 +00:00
|
|
|
|
first_infile = i;
|
1989-05-08 21:10:27 +00:00
|
|
|
|
for (; i < argc; i++)
|
1994-10-21 20:31:43 +00:00
|
|
|
|
{
|
|
|
|
|
int j;
|
|
|
|
|
/* Don't process one file twice. */
|
|
|
|
|
for (j = first_infile; j < i; j++)
|
|
|
|
|
if (! strcmp (argv[i], argv[j]))
|
|
|
|
|
break;
|
|
|
|
|
if (j == i)
|
|
|
|
|
err_count += scan_file (argv[i]);
|
|
|
|
|
}
|
2003-12-24 06:49:23 +00:00
|
|
|
|
return (err_count > 0 ? EXIT_FAILURE : EXIT_SUCCESS);
|
1989-05-08 21:10:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
2004-04-07 19:18:42 +00:00
|
|
|
|
/* Add a source file name boundary marker in the output file. */
|
|
|
|
|
void
|
2010-07-03 00:50:23 +00:00
|
|
|
|
put_filename (char *filename)
|
2004-04-07 19:18:42 +00:00
|
|
|
|
{
|
2004-04-26 10:49:11 +00:00
|
|
|
|
char *tmp;
|
|
|
|
|
|
|
|
|
|
for (tmp = filename; *tmp; tmp++)
|
|
|
|
|
{
|
|
|
|
|
if (IS_DIRECTORY_SEP(*tmp))
|
|
|
|
|
filename = tmp + 1;
|
|
|
|
|
}
|
2004-04-07 19:18:42 +00:00
|
|
|
|
|
|
|
|
|
putc (037, outfile);
|
|
|
|
|
putc ('S', outfile);
|
|
|
|
|
fprintf (outfile, "%s\n", filename);
|
|
|
|
|
}
|
|
|
|
|
|
1991-01-14 23:38:10 +00:00
|
|
|
|
/* Read file FILENAME and output its doc strings to outfile. */
|
1989-05-08 21:10:27 +00:00
|
|
|
|
/* Return 1 if file is not found, 0 if it is found. */
|
|
|
|
|
|
1994-10-12 20:21:51 +00:00
|
|
|
|
int
|
2010-07-03 00:50:23 +00:00
|
|
|
|
scan_file (char *filename)
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
2010-10-03 23:35:22 +00:00
|
|
|
|
|
|
|
|
|
size_t len = strlen (filename);
|
2004-04-07 19:18:42 +00:00
|
|
|
|
|
|
|
|
|
put_filename (filename);
|
1995-06-21 19:46:58 +00:00
|
|
|
|
if (len > 4 && !strcmp (filename + len - 4, ".elc"))
|
1994-01-06 03:59:30 +00:00
|
|
|
|
return scan_lisp_file (filename, READ_BINARY);
|
1995-06-21 19:46:58 +00:00
|
|
|
|
else if (len > 3 && !strcmp (filename + len - 3, ".el"))
|
1994-01-06 03:59:30 +00:00
|
|
|
|
return scan_lisp_file (filename, READ_TEXT);
|
1989-05-08 21:10:27 +00:00
|
|
|
|
else
|
1994-01-06 03:59:30 +00:00
|
|
|
|
return scan_c_file (filename, READ_TEXT);
|
1989-05-08 21:10:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
char buf[128];
|
|
|
|
|
|
2001-10-21 13:48:16 +00:00
|
|
|
|
/* Some state during the execution of `read_c_string_or_comment'. */
|
|
|
|
|
struct rcsoc_state
|
|
|
|
|
{
|
2001-11-15 15:50:31 +00:00
|
|
|
|
/* A count of spaces and newlines that have been read, but not output. */
|
2001-10-21 13:48:16 +00:00
|
|
|
|
unsigned pending_spaces, pending_newlines;
|
|
|
|
|
|
|
|
|
|
/* Where we're reading from. */
|
|
|
|
|
FILE *in_file;
|
|
|
|
|
|
|
|
|
|
/* If non-zero, a buffer into which to copy characters. */
|
|
|
|
|
char *buf_ptr;
|
|
|
|
|
/* If non-zero, a file into which to copy characters. */
|
|
|
|
|
FILE *out_file;
|
|
|
|
|
|
|
|
|
|
/* A keyword we look for at the beginning of lines. If found, it is
|
|
|
|
|
not copied, and SAW_KEYWORD is set to true. */
|
Fix warnings produced by compiling with -Wwrite_strings (i.e. use const char *).
* b2m.c (concat, fatal): Use const char*.
(main): Don't assign labels a string literal.
* ebrowse.c (struct member): filename, def_filename is const.
(struct sym): filename, sfilename is const.
(struct kw): name is const.
(add_sym, yyerror, token_string, insert_keyword, main): Use const char*.
* emacsclient.c (message, sock_err_message, send_to_emacs)
(quote_argument, set_local_socket)
(start_daemon_and_retry_set_socket): Use const char*.
* etags.c (compressor, language, Ada_suffix, Ada_help, Asm_suffixes)
(Asm_help, default_C_suffixes, default_C_help, Cplusplus_suffixes)
(Cplusplus_help, Cjava_suffixes, Cobol_suffixes, Cstar_suffixes)
(Erlang_suffixes, Erlang_help, Forth_suffixes, Forth_help)
(Fortran_suffixes, Fortran_help, HTML_suffixes, HTML_help)
(Lisp_suffixes, Lisp_help, Lua_suffixes, Lua_help)
(Makefile_filenames, Makefile_help, Objc_suffixes, Objc_help)
(Pascal_suffixes, Pascal_help, Perl_suffixes, Perl_interpreters)
(Perl_help, PHP_suffixes, PHP_help, plain_C_suffixses, PS_suffixes)
(PS_help, Prolog_suffixes, Prolog_help, Python_suffixes, Python_help)
(Scheme_suffixes, Scheme_help, TeX_suffixes, TeX_help, Texinfo_suffixes)
(Texinfo_help, Yacc_suffixes, Yacc_help, auto_help, none_help)
(no_lang_help, print_language_names)
(get_language_from_interpreter, get_language_from_filename)
(init, make_tag, struct C_stab_entry, write_classname, TEX_defenv)
(TEX_decode_env, nocase_tail, savestr, savenstr, fatal, pfatal)
(concat): Use const char*.
* make-docfile.c (error, fatal, scan_c_file, scan_lisp_file): Use
const char *.
* movemail.c (fatal, error, concat): Use const char *.
* pop.c (pop_multi_first, socket_connection, sendline): Use conat char*.
* pop.h (pop_multi_first): Use const char *.
(_ARGS): Remove.
* sorted-doc.c (error, fatal, states): Use const char *.
* update-game-score.c (get_prefix, write_scores, main): Use const char*.
2010-08-11 08:20:34 +00:00
|
|
|
|
const char *keyword;
|
2010-01-18 03:58:35 +00:00
|
|
|
|
/* The current point we've reached in an occurrence of KEYWORD in
|
2001-10-21 13:48:16 +00:00
|
|
|
|
the input stream. */
|
Fix warnings produced by compiling with -Wwrite_strings (i.e. use const char *).
* b2m.c (concat, fatal): Use const char*.
(main): Don't assign labels a string literal.
* ebrowse.c (struct member): filename, def_filename is const.
(struct sym): filename, sfilename is const.
(struct kw): name is const.
(add_sym, yyerror, token_string, insert_keyword, main): Use const char*.
* emacsclient.c (message, sock_err_message, send_to_emacs)
(quote_argument, set_local_socket)
(start_daemon_and_retry_set_socket): Use const char*.
* etags.c (compressor, language, Ada_suffix, Ada_help, Asm_suffixes)
(Asm_help, default_C_suffixes, default_C_help, Cplusplus_suffixes)
(Cplusplus_help, Cjava_suffixes, Cobol_suffixes, Cstar_suffixes)
(Erlang_suffixes, Erlang_help, Forth_suffixes, Forth_help)
(Fortran_suffixes, Fortran_help, HTML_suffixes, HTML_help)
(Lisp_suffixes, Lisp_help, Lua_suffixes, Lua_help)
(Makefile_filenames, Makefile_help, Objc_suffixes, Objc_help)
(Pascal_suffixes, Pascal_help, Perl_suffixes, Perl_interpreters)
(Perl_help, PHP_suffixes, PHP_help, plain_C_suffixses, PS_suffixes)
(PS_help, Prolog_suffixes, Prolog_help, Python_suffixes, Python_help)
(Scheme_suffixes, Scheme_help, TeX_suffixes, TeX_help, Texinfo_suffixes)
(Texinfo_help, Yacc_suffixes, Yacc_help, auto_help, none_help)
(no_lang_help, print_language_names)
(get_language_from_interpreter, get_language_from_filename)
(init, make_tag, struct C_stab_entry, write_classname, TEX_defenv)
(TEX_decode_env, nocase_tail, savestr, savenstr, fatal, pfatal)
(concat): Use const char*.
* make-docfile.c (error, fatal, scan_c_file, scan_lisp_file): Use
const char *.
* movemail.c (fatal, error, concat): Use const char *.
* pop.c (pop_multi_first, socket_connection, sendline): Use conat char*.
* pop.h (pop_multi_first): Use const char *.
(_ARGS): Remove.
* sorted-doc.c (error, fatal, states): Use const char *.
* update-game-score.c (get_prefix, write_scores, main): Use const char*.
2010-08-11 08:20:34 +00:00
|
|
|
|
const char *cur_keyword_ptr;
|
2010-01-18 03:58:35 +00:00
|
|
|
|
/* Set to true if we saw an occurrence of KEYWORD. */
|
2001-10-21 13:48:16 +00:00
|
|
|
|
int saw_keyword;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/* Output CH to the file or buffer in STATE. Any pending newlines or
|
|
|
|
|
spaces are output first. */
|
2001-10-17 02:53:57 +00:00
|
|
|
|
|
|
|
|
|
static INLINE void
|
2010-07-03 00:50:23 +00:00
|
|
|
|
put_char (int ch, struct rcsoc_state *state)
|
2001-10-17 02:53:57 +00:00
|
|
|
|
{
|
|
|
|
|
int out_ch;
|
|
|
|
|
do
|
|
|
|
|
{
|
2001-10-21 13:48:16 +00:00
|
|
|
|
if (state->pending_newlines > 0)
|
2001-10-17 02:53:57 +00:00
|
|
|
|
{
|
2001-10-21 13:48:16 +00:00
|
|
|
|
state->pending_newlines--;
|
2001-10-17 02:53:57 +00:00
|
|
|
|
out_ch = '\n';
|
|
|
|
|
}
|
2001-10-21 13:48:16 +00:00
|
|
|
|
else if (state->pending_spaces > 0)
|
2001-10-17 02:53:57 +00:00
|
|
|
|
{
|
2001-10-21 13:48:16 +00:00
|
|
|
|
state->pending_spaces--;
|
2001-10-17 02:53:57 +00:00
|
|
|
|
out_ch = ' ';
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
out_ch = ch;
|
|
|
|
|
|
2001-10-21 13:48:16 +00:00
|
|
|
|
if (state->out_file)
|
|
|
|
|
putc (out_ch, state->out_file);
|
|
|
|
|
if (state->buf_ptr)
|
|
|
|
|
*state->buf_ptr++ = out_ch;
|
2001-10-17 02:53:57 +00:00
|
|
|
|
}
|
|
|
|
|
while (out_ch != ch);
|
|
|
|
|
}
|
|
|
|
|
|
2001-10-21 13:48:16 +00:00
|
|
|
|
/* If in the middle of scanning a keyword, continue scanning with
|
|
|
|
|
character CH, otherwise output CH to the file or buffer in STATE.
|
|
|
|
|
Any pending newlines or spaces are output first, as well as any
|
|
|
|
|
previously scanned characters that were thought to be part of a
|
|
|
|
|
keyword, but were in fact not. */
|
|
|
|
|
|
|
|
|
|
static void
|
2010-07-03 00:50:23 +00:00
|
|
|
|
scan_keyword_or_put_char (int ch, struct rcsoc_state *state)
|
2001-10-21 13:48:16 +00:00
|
|
|
|
{
|
|
|
|
|
if (state->keyword
|
|
|
|
|
&& *state->cur_keyword_ptr == ch
|
|
|
|
|
&& (state->cur_keyword_ptr > state->keyword
|
|
|
|
|
|| state->pending_newlines > 0))
|
|
|
|
|
/* We might be looking at STATE->keyword at some point.
|
|
|
|
|
Keep looking until we know for sure. */
|
|
|
|
|
{
|
|
|
|
|
if (*++state->cur_keyword_ptr == '\0')
|
|
|
|
|
/* Saw the whole keyword. Set SAW_KEYWORD flag to true. */
|
|
|
|
|
{
|
|
|
|
|
state->saw_keyword = 1;
|
|
|
|
|
|
|
|
|
|
/* Reset the scanning pointer. */
|
|
|
|
|
state->cur_keyword_ptr = state->keyword;
|
|
|
|
|
|
2001-11-15 15:50:31 +00:00
|
|
|
|
/* Canonicalize whitespace preceding a usage string. */
|
2001-10-21 13:48:16 +00:00
|
|
|
|
state->pending_newlines = 2;
|
|
|
|
|
state->pending_spaces = 0;
|
|
|
|
|
|
|
|
|
|
/* Skip any whitespace between the keyword and the
|
|
|
|
|
usage string. */
|
|
|
|
|
do
|
|
|
|
|
ch = getc (state->in_file);
|
|
|
|
|
while (ch == ' ' || ch == '\n');
|
|
|
|
|
|
2002-08-19 21:47:38 +00:00
|
|
|
|
/* Output the open-paren we just read. */
|
|
|
|
|
put_char (ch, state);
|
|
|
|
|
|
|
|
|
|
/* Skip the function name and replace it with `fn'. */
|
|
|
|
|
do
|
|
|
|
|
ch = getc (state->in_file);
|
|
|
|
|
while (ch != ' ' && ch != ')');
|
|
|
|
|
put_char ('f', state);
|
|
|
|
|
put_char ('n', state);
|
2003-02-04 14:56:31 +00:00
|
|
|
|
|
2002-08-19 21:47:38 +00:00
|
|
|
|
/* Put back the last character. */
|
2001-10-21 13:48:16 +00:00
|
|
|
|
ungetc (ch, state->in_file);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (state->keyword && state->cur_keyword_ptr > state->keyword)
|
|
|
|
|
/* We scanned the beginning of a potential usage
|
|
|
|
|
keyword, but it was a false alarm. Output the
|
|
|
|
|
part we scanned. */
|
|
|
|
|
{
|
Fix warnings produced by compiling with -Wwrite_strings (i.e. use const char *).
* b2m.c (concat, fatal): Use const char*.
(main): Don't assign labels a string literal.
* ebrowse.c (struct member): filename, def_filename is const.
(struct sym): filename, sfilename is const.
(struct kw): name is const.
(add_sym, yyerror, token_string, insert_keyword, main): Use const char*.
* emacsclient.c (message, sock_err_message, send_to_emacs)
(quote_argument, set_local_socket)
(start_daemon_and_retry_set_socket): Use const char*.
* etags.c (compressor, language, Ada_suffix, Ada_help, Asm_suffixes)
(Asm_help, default_C_suffixes, default_C_help, Cplusplus_suffixes)
(Cplusplus_help, Cjava_suffixes, Cobol_suffixes, Cstar_suffixes)
(Erlang_suffixes, Erlang_help, Forth_suffixes, Forth_help)
(Fortran_suffixes, Fortran_help, HTML_suffixes, HTML_help)
(Lisp_suffixes, Lisp_help, Lua_suffixes, Lua_help)
(Makefile_filenames, Makefile_help, Objc_suffixes, Objc_help)
(Pascal_suffixes, Pascal_help, Perl_suffixes, Perl_interpreters)
(Perl_help, PHP_suffixes, PHP_help, plain_C_suffixses, PS_suffixes)
(PS_help, Prolog_suffixes, Prolog_help, Python_suffixes, Python_help)
(Scheme_suffixes, Scheme_help, TeX_suffixes, TeX_help, Texinfo_suffixes)
(Texinfo_help, Yacc_suffixes, Yacc_help, auto_help, none_help)
(no_lang_help, print_language_names)
(get_language_from_interpreter, get_language_from_filename)
(init, make_tag, struct C_stab_entry, write_classname, TEX_defenv)
(TEX_decode_env, nocase_tail, savestr, savenstr, fatal, pfatal)
(concat): Use const char*.
* make-docfile.c (error, fatal, scan_c_file, scan_lisp_file): Use
const char *.
* movemail.c (fatal, error, concat): Use const char *.
* pop.c (pop_multi_first, socket_connection, sendline): Use conat char*.
* pop.h (pop_multi_first): Use const char *.
(_ARGS): Remove.
* sorted-doc.c (error, fatal, states): Use const char *.
* update-game-score.c (get_prefix, write_scores, main): Use const char*.
2010-08-11 08:20:34 +00:00
|
|
|
|
const char *p;
|
2001-10-21 13:48:16 +00:00
|
|
|
|
|
|
|
|
|
for (p = state->keyword; p < state->cur_keyword_ptr; p++)
|
|
|
|
|
put_char (*p, state);
|
|
|
|
|
|
|
|
|
|
state->cur_keyword_ptr = state->keyword;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
put_char (ch, state);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2001-10-13 20:41:25 +00:00
|
|
|
|
/* Skip a C string or C-style comment from INFILE, and return the
|
|
|
|
|
character that follows. COMMENT non-zero means skip a comment. If
|
|
|
|
|
PRINTFLAG is positive, output string contents to outfile. If it is
|
|
|
|
|
negative, store contents in buf. Convert escape sequences \n and
|
2001-10-21 09:21:46 +00:00
|
|
|
|
\t to newline and tab; discard \ followed by newline.
|
2010-01-18 03:58:35 +00:00
|
|
|
|
If SAW_USAGE is non-zero, then any occurrences of the string `usage:'
|
2001-10-21 09:21:46 +00:00
|
|
|
|
at the beginning of a line will be removed, and *SAW_USAGE set to
|
|
|
|
|
true if any were encountered. */
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
1994-10-12 20:21:51 +00:00
|
|
|
|
int
|
2010-07-03 00:50:23 +00:00
|
|
|
|
read_c_string_or_comment (FILE *infile, int printflag, int comment, int *saw_usage)
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
|
|
|
|
register int c;
|
2001-10-21 13:48:16 +00:00
|
|
|
|
struct rcsoc_state state;
|
|
|
|
|
|
|
|
|
|
state.in_file = infile;
|
|
|
|
|
state.buf_ptr = (printflag < 0 ? buf : 0);
|
|
|
|
|
state.out_file = (printflag > 0 ? outfile : 0);
|
|
|
|
|
state.pending_spaces = 0;
|
|
|
|
|
state.pending_newlines = 0;
|
|
|
|
|
state.keyword = (saw_usage ? "usage:" : 0);
|
|
|
|
|
state.cur_keyword_ptr = state.keyword;
|
|
|
|
|
state.saw_keyword = 0;
|
|
|
|
|
|
|
|
|
|
c = getc (infile);
|
2001-10-13 20:41:25 +00:00
|
|
|
|
if (comment)
|
2001-10-21 13:48:16 +00:00
|
|
|
|
while (c == '\n' || c == '\r' || c == '\t' || c == ' ')
|
|
|
|
|
c = getc (infile);
|
2001-10-21 09:21:46 +00:00
|
|
|
|
|
1989-05-08 21:10:27 +00:00
|
|
|
|
while (c != EOF)
|
|
|
|
|
{
|
2001-10-13 20:41:25 +00:00
|
|
|
|
while (c != EOF && (comment ? c != '*' : c != '"'))
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
|
|
|
|
if (c == '\\')
|
|
|
|
|
{
|
|
|
|
|
c = getc (infile);
|
1999-09-03 23:12:27 +00:00
|
|
|
|
if (c == '\n' || c == '\r')
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (c == 'n')
|
|
|
|
|
c = '\n';
|
|
|
|
|
if (c == 't')
|
|
|
|
|
c = '\t';
|
|
|
|
|
}
|
2002-01-05 23:37:58 +00:00
|
|
|
|
|
2001-10-17 02:53:57 +00:00
|
|
|
|
if (c == ' ')
|
2001-10-21 13:48:16 +00:00
|
|
|
|
state.pending_spaces++;
|
2001-10-17 02:53:57 +00:00
|
|
|
|
else if (c == '\n')
|
|
|
|
|
{
|
2001-10-21 13:48:16 +00:00
|
|
|
|
state.pending_newlines++;
|
|
|
|
|
state.pending_spaces = 0;
|
2001-10-17 02:53:57 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
2001-10-21 13:48:16 +00:00
|
|
|
|
scan_keyword_or_put_char (c, &state);
|
2001-10-17 02:53:57 +00:00
|
|
|
|
|
1989-05-08 21:10:27 +00:00
|
|
|
|
c = getc (infile);
|
|
|
|
|
}
|
2001-10-13 20:41:25 +00:00
|
|
|
|
|
2001-10-15 10:04:31 +00:00
|
|
|
|
if (c != EOF)
|
|
|
|
|
c = getc (infile);
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
2001-10-13 20:41:25 +00:00
|
|
|
|
if (comment)
|
|
|
|
|
{
|
|
|
|
|
if (c == '/')
|
|
|
|
|
{
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2002-01-05 23:37:58 +00:00
|
|
|
|
|
2001-10-21 13:48:16 +00:00
|
|
|
|
scan_keyword_or_put_char ('*', &state);
|
2001-10-13 20:41:25 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (c != '"')
|
|
|
|
|
break;
|
2002-01-05 23:37:58 +00:00
|
|
|
|
|
2001-10-13 20:41:25 +00:00
|
|
|
|
/* If we had a "", concatenate the two strings. */
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
}
|
|
|
|
|
}
|
2002-01-05 23:37:58 +00:00
|
|
|
|
|
1989-05-08 21:10:27 +00:00
|
|
|
|
if (printflag < 0)
|
2001-10-21 13:48:16 +00:00
|
|
|
|
*state.buf_ptr = 0;
|
|
|
|
|
|
|
|
|
|
if (saw_usage)
|
|
|
|
|
*saw_usage = state.saw_keyword;
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
|
|
|
|
return c;
|
|
|
|
|
}
|
2001-10-13 20:41:25 +00:00
|
|
|
|
|
|
|
|
|
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
1994-01-16 08:35:01 +00:00
|
|
|
|
/* Write to file OUT the argument names of function FUNC, whose text is in BUF.
|
1989-05-08 21:10:27 +00:00
|
|
|
|
MINARGS and MAXARGS are the minimum and maximum number of arguments. */
|
|
|
|
|
|
1994-10-12 20:21:51 +00:00
|
|
|
|
void
|
2010-07-03 00:50:23 +00:00
|
|
|
|
write_c_args (FILE *out, char *func, char *buf, int minargs, int maxargs)
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
1992-09-23 10:33:26 +00:00
|
|
|
|
register char *p;
|
1992-09-29 03:14:35 +00:00
|
|
|
|
int in_ident = 0;
|
2010-07-09 17:00:04 +00:00
|
|
|
|
char *ident_start;
|
2010-10-03 23:35:22 +00:00
|
|
|
|
size_t ident_length = 0;
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
2002-08-19 21:47:38 +00:00
|
|
|
|
fprintf (out, "(fn");
|
1994-01-16 08:35:01 +00:00
|
|
|
|
|
|
|
|
|
if (*buf == '(')
|
|
|
|
|
++buf;
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
1992-09-23 10:33:26 +00:00
|
|
|
|
for (p = buf; *p; p++)
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
2010-07-09 17:00:04 +00:00
|
|
|
|
char c = *p;
|
1992-09-29 03:14:35 +00:00
|
|
|
|
|
2010-07-09 17:00:04 +00:00
|
|
|
|
/* Notice when a new identifier starts. */
|
1992-09-29 03:14:35 +00:00
|
|
|
|
if ((('A' <= c && c <= 'Z')
|
|
|
|
|
|| ('a' <= c && c <= 'z')
|
|
|
|
|
|| ('0' <= c && c <= '9')
|
|
|
|
|
|| c == '_')
|
|
|
|
|
!= in_ident)
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
1992-09-29 03:14:35 +00:00
|
|
|
|
if (!in_ident)
|
|
|
|
|
{
|
|
|
|
|
in_ident = 1;
|
2010-07-09 17:00:04 +00:00
|
|
|
|
ident_start = p;
|
1992-09-29 03:14:35 +00:00
|
|
|
|
}
|
|
|
|
|
else
|
2010-07-09 17:00:04 +00:00
|
|
|
|
{
|
|
|
|
|
in_ident = 0;
|
|
|
|
|
ident_length = p - ident_start;
|
|
|
|
|
}
|
1989-05-08 21:10:27 +00:00
|
|
|
|
}
|
1992-09-29 03:14:35 +00:00
|
|
|
|
|
2010-07-09 17:00:04 +00:00
|
|
|
|
/* Found the end of an argument, write out the last seen
|
|
|
|
|
identifier. */
|
|
|
|
|
if (c == ',' || c == ')')
|
1993-04-08 02:06:43 +00:00
|
|
|
|
{
|
2010-07-29 02:11:23 +00:00
|
|
|
|
if (ident_length == 0)
|
|
|
|
|
{
|
|
|
|
|
error ("empty arg list for `%s' should be (void), not ()", func);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2010-07-09 17:00:04 +00:00
|
|
|
|
if (strncmp (ident_start, "void", ident_length) == 0)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
putc (' ', out);
|
|
|
|
|
|
|
|
|
|
if (minargs == 0 && maxargs > 0)
|
|
|
|
|
fprintf (out, "&optional ");
|
1992-09-29 03:14:35 +00:00
|
|
|
|
|
2010-07-09 17:00:04 +00:00
|
|
|
|
minargs--;
|
|
|
|
|
maxargs--;
|
|
|
|
|
|
|
|
|
|
/* In C code, `default' is a reserved word, so we spell it
|
|
|
|
|
`defalt'; unmangle that here. */
|
2010-07-23 13:35:51 +00:00
|
|
|
|
if (ident_length == 6 && strncmp (ident_start, "defalt", 6) == 0)
|
2010-07-09 17:00:04 +00:00
|
|
|
|
fprintf (out, "DEFAULT");
|
|
|
|
|
else
|
|
|
|
|
while (ident_length-- > 0)
|
|
|
|
|
{
|
|
|
|
|
c = *ident_start++;
|
|
|
|
|
if (c >= 'a' && c <= 'z')
|
|
|
|
|
/* Upcase the letter. */
|
|
|
|
|
c += 'A' - 'a';
|
|
|
|
|
else if (c == '_')
|
|
|
|
|
/* Print underscore as hyphen. */
|
|
|
|
|
c = '-';
|
|
|
|
|
putc (c, out);
|
|
|
|
|
}
|
|
|
|
|
}
|
1989-05-08 21:10:27 +00:00
|
|
|
|
}
|
2010-07-09 17:00:04 +00:00
|
|
|
|
|
|
|
|
|
putc (')', out);
|
1989-05-08 21:10:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Read through a c file. If a .o file is named,
|
2008-07-15 18:15:18 +00:00
|
|
|
|
the corresponding .c or .m file is read instead.
|
1989-05-08 21:10:27 +00:00
|
|
|
|
Looks for DEFUN constructs such as are defined in ../src/lisp.h.
|
|
|
|
|
Accepts any word starting DEF... so it finds DEFSIMPLE and DEFPRED. */
|
|
|
|
|
|
1994-10-12 20:21:51 +00:00
|
|
|
|
int
|
Fix warnings produced by compiling with -Wwrite_strings (i.e. use const char *).
* b2m.c (concat, fatal): Use const char*.
(main): Don't assign labels a string literal.
* ebrowse.c (struct member): filename, def_filename is const.
(struct sym): filename, sfilename is const.
(struct kw): name is const.
(add_sym, yyerror, token_string, insert_keyword, main): Use const char*.
* emacsclient.c (message, sock_err_message, send_to_emacs)
(quote_argument, set_local_socket)
(start_daemon_and_retry_set_socket): Use const char*.
* etags.c (compressor, language, Ada_suffix, Ada_help, Asm_suffixes)
(Asm_help, default_C_suffixes, default_C_help, Cplusplus_suffixes)
(Cplusplus_help, Cjava_suffixes, Cobol_suffixes, Cstar_suffixes)
(Erlang_suffixes, Erlang_help, Forth_suffixes, Forth_help)
(Fortran_suffixes, Fortran_help, HTML_suffixes, HTML_help)
(Lisp_suffixes, Lisp_help, Lua_suffixes, Lua_help)
(Makefile_filenames, Makefile_help, Objc_suffixes, Objc_help)
(Pascal_suffixes, Pascal_help, Perl_suffixes, Perl_interpreters)
(Perl_help, PHP_suffixes, PHP_help, plain_C_suffixses, PS_suffixes)
(PS_help, Prolog_suffixes, Prolog_help, Python_suffixes, Python_help)
(Scheme_suffixes, Scheme_help, TeX_suffixes, TeX_help, Texinfo_suffixes)
(Texinfo_help, Yacc_suffixes, Yacc_help, auto_help, none_help)
(no_lang_help, print_language_names)
(get_language_from_interpreter, get_language_from_filename)
(init, make_tag, struct C_stab_entry, write_classname, TEX_defenv)
(TEX_decode_env, nocase_tail, savestr, savenstr, fatal, pfatal)
(concat): Use const char*.
* make-docfile.c (error, fatal, scan_c_file, scan_lisp_file): Use
const char *.
* movemail.c (fatal, error, concat): Use const char *.
* pop.c (pop_multi_first, socket_connection, sendline): Use conat char*.
* pop.h (pop_multi_first): Use const char *.
(_ARGS): Remove.
* sorted-doc.c (error, fatal, states): Use const char *.
* update-game-score.c (get_prefix, write_scores, main): Use const char*.
2010-08-11 08:20:34 +00:00
|
|
|
|
scan_c_file (char *filename, const char *mode)
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
|
|
|
|
FILE *infile;
|
|
|
|
|
register int c;
|
|
|
|
|
register int commas;
|
|
|
|
|
register int defunflag;
|
1992-12-12 15:25:18 +00:00
|
|
|
|
register int defvarperbufferflag;
|
1989-05-08 21:10:27 +00:00
|
|
|
|
register int defvarflag;
|
|
|
|
|
int minargs, maxargs;
|
1995-04-13 16:05:43 +00:00
|
|
|
|
int extension = filename[strlen (filename) - 1];
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
1995-04-13 16:05:43 +00:00
|
|
|
|
if (extension == 'o')
|
1989-05-08 21:10:27 +00:00
|
|
|
|
filename[strlen (filename) - 1] = 'c';
|
|
|
|
|
|
1994-01-06 03:59:30 +00:00
|
|
|
|
infile = fopen (filename, mode);
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
2008-07-15 18:15:18 +00:00
|
|
|
|
if (infile == NULL && extension == 'o')
|
|
|
|
|
{
|
|
|
|
|
/* try .m */
|
|
|
|
|
filename[strlen (filename) - 1] = 'm';
|
|
|
|
|
infile = fopen (filename, mode);
|
|
|
|
|
if (infile == NULL)
|
|
|
|
|
filename[strlen (filename) - 1] = 'c'; /* don't confuse people */
|
|
|
|
|
}
|
|
|
|
|
|
1989-05-08 21:10:27 +00:00
|
|
|
|
/* No error if non-ex input file */
|
|
|
|
|
if (infile == NULL)
|
|
|
|
|
{
|
|
|
|
|
perror (filename);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2001-11-15 15:50:31 +00:00
|
|
|
|
/* Reset extension to be able to detect duplicate files. */
|
1995-04-13 16:05:43 +00:00
|
|
|
|
filename[strlen (filename) - 1] = extension;
|
|
|
|
|
|
1989-05-08 21:10:27 +00:00
|
|
|
|
c = '\n';
|
|
|
|
|
while (!feof (infile))
|
|
|
|
|
{
|
2001-10-16 13:05:28 +00:00
|
|
|
|
int doc_keyword = 0;
|
|
|
|
|
|
1999-09-03 23:12:27 +00:00
|
|
|
|
if (c != '\n' && c != '\r')
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
if (c == ' ')
|
|
|
|
|
{
|
|
|
|
|
while (c == ' ')
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
if (c != 'D')
|
|
|
|
|
continue;
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
if (c != 'E')
|
|
|
|
|
continue;
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
if (c != 'F')
|
|
|
|
|
continue;
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
if (c != 'V')
|
|
|
|
|
continue;
|
1992-12-12 15:25:18 +00:00
|
|
|
|
c = getc (infile);
|
|
|
|
|
if (c != 'A')
|
|
|
|
|
continue;
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
if (c != 'R')
|
|
|
|
|
continue;
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
if (c != '_')
|
|
|
|
|
continue;
|
|
|
|
|
|
1989-05-08 21:10:27 +00:00
|
|
|
|
defvarflag = 1;
|
|
|
|
|
defunflag = 0;
|
1992-12-12 15:25:18 +00:00
|
|
|
|
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
defvarperbufferflag = (c == 'P');
|
|
|
|
|
|
1989-05-08 21:10:27 +00:00
|
|
|
|
c = getc (infile);
|
|
|
|
|
}
|
|
|
|
|
else if (c == 'D')
|
|
|
|
|
{
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
if (c != 'E')
|
|
|
|
|
continue;
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
if (c != 'F')
|
|
|
|
|
continue;
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
defunflag = c == 'U';
|
|
|
|
|
defvarflag = 0;
|
2004-11-09 11:03:12 +00:00
|
|
|
|
defvarperbufferflag = 0;
|
1989-05-08 21:10:27 +00:00
|
|
|
|
}
|
|
|
|
|
else continue;
|
|
|
|
|
|
|
|
|
|
while (c != '(')
|
|
|
|
|
{
|
|
|
|
|
if (c < 0)
|
|
|
|
|
goto eof;
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
}
|
|
|
|
|
|
2001-10-13 20:41:25 +00:00
|
|
|
|
/* Lisp variable or function name. */
|
1989-05-08 21:10:27 +00:00
|
|
|
|
c = getc (infile);
|
|
|
|
|
if (c != '"')
|
|
|
|
|
continue;
|
2001-10-21 09:21:46 +00:00
|
|
|
|
c = read_c_string_or_comment (infile, -1, 0, 0);
|
2001-10-13 20:41:25 +00:00
|
|
|
|
|
2001-10-16 13:05:28 +00:00
|
|
|
|
/* DEFVAR_LISP ("name", addr, "doc")
|
|
|
|
|
DEFVAR_LISP ("name", addr /\* doc *\/)
|
|
|
|
|
DEFVAR_LISP ("name", addr, doc: /\* doc *\/) */
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
|
|
|
|
if (defunflag)
|
|
|
|
|
commas = 5;
|
1992-12-12 15:25:18 +00:00
|
|
|
|
else if (defvarperbufferflag)
|
|
|
|
|
commas = 2;
|
1989-05-08 21:10:27 +00:00
|
|
|
|
else if (defvarflag)
|
|
|
|
|
commas = 1;
|
|
|
|
|
else /* For DEFSIMPLE and DEFPRED */
|
|
|
|
|
commas = 2;
|
|
|
|
|
|
|
|
|
|
while (commas)
|
|
|
|
|
{
|
|
|
|
|
if (c == ',')
|
|
|
|
|
{
|
|
|
|
|
commas--;
|
2001-10-13 20:41:25 +00:00
|
|
|
|
|
1989-05-08 21:10:27 +00:00
|
|
|
|
if (defunflag && (commas == 1 || commas == 2))
|
|
|
|
|
{
|
2011-01-23 07:30:19 +00:00
|
|
|
|
int scanned = 0;
|
1989-05-08 21:10:27 +00:00
|
|
|
|
do
|
|
|
|
|
c = getc (infile);
|
1999-09-03 23:12:27 +00:00
|
|
|
|
while (c == ' ' || c == '\n' || c == '\r' || c == '\t');
|
1989-05-08 21:10:27 +00:00
|
|
|
|
if (c < 0)
|
|
|
|
|
goto eof;
|
|
|
|
|
ungetc (c, infile);
|
|
|
|
|
if (commas == 2) /* pick up minargs */
|
2011-01-23 07:30:19 +00:00
|
|
|
|
scanned = fscanf (infile, "%d", &minargs);
|
1989-05-08 21:10:27 +00:00
|
|
|
|
else /* pick up maxargs */
|
|
|
|
|
if (c == 'M' || c == 'U') /* MANY || UNEVALLED */
|
|
|
|
|
maxargs = -1;
|
|
|
|
|
else
|
2011-01-23 07:30:19 +00:00
|
|
|
|
scanned = fscanf (infile, "%d", &maxargs);
|
|
|
|
|
if (scanned < 0)
|
|
|
|
|
goto eof;
|
1989-05-08 21:10:27 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2001-10-13 20:41:25 +00:00
|
|
|
|
|
|
|
|
|
if (c == EOF)
|
1989-05-08 21:10:27 +00:00
|
|
|
|
goto eof;
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
}
|
2001-10-16 13:05:28 +00:00
|
|
|
|
|
1999-09-03 23:12:27 +00:00
|
|
|
|
while (c == ' ' || c == '\n' || c == '\r' || c == '\t')
|
1989-05-08 21:10:27 +00:00
|
|
|
|
c = getc (infile);
|
2002-01-05 23:37:58 +00:00
|
|
|
|
|
1989-05-08 21:10:27 +00:00
|
|
|
|
if (c == '"')
|
2001-10-21 09:21:46 +00:00
|
|
|
|
c = read_c_string_or_comment (infile, 0, 0, 0);
|
2002-01-05 23:37:58 +00:00
|
|
|
|
|
2001-10-13 20:41:25 +00:00
|
|
|
|
while (c != EOF && c != ',' && c != '/')
|
1989-05-08 21:10:27 +00:00
|
|
|
|
c = getc (infile);
|
2001-10-13 20:41:25 +00:00
|
|
|
|
if (c == ',')
|
|
|
|
|
{
|
2001-10-16 13:05:28 +00:00
|
|
|
|
c = getc (infile);
|
|
|
|
|
while (c == ' ' || c == '\n' || c == '\r' || c == '\t')
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
while ((c >= 'a' && c <= 'z') || (c >= 'Z' && c <= 'Z'))
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
if (c == ':')
|
|
|
|
|
{
|
|
|
|
|
doc_keyword = 1;
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
while (c == ' ' || c == '\n' || c == '\r' || c == '\t')
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
}
|
2001-10-13 20:41:25 +00:00
|
|
|
|
}
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
2001-10-13 20:41:25 +00:00
|
|
|
|
if (c == '"'
|
|
|
|
|
|| (c == '/'
|
|
|
|
|
&& (c = getc (infile),
|
|
|
|
|
ungetc (c, infile),
|
|
|
|
|
c == '*')))
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
2001-10-13 20:41:25 +00:00
|
|
|
|
int comment = c != '"';
|
2001-10-21 09:21:46 +00:00
|
|
|
|
int saw_usage;
|
2002-01-05 23:37:58 +00:00
|
|
|
|
|
1989-05-08 21:10:27 +00:00
|
|
|
|
putc (037, outfile);
|
|
|
|
|
putc (defvarflag ? 'V' : 'F', outfile);
|
|
|
|
|
fprintf (outfile, "%s\n", buf);
|
2001-10-13 20:41:25 +00:00
|
|
|
|
|
|
|
|
|
if (comment)
|
|
|
|
|
getc (infile); /* Skip past `*' */
|
2001-10-21 09:21:46 +00:00
|
|
|
|
c = read_c_string_or_comment (infile, 1, comment, &saw_usage);
|
1991-01-26 03:29:36 +00:00
|
|
|
|
|
|
|
|
|
/* If this is a defun, find the arguments and print them. If
|
|
|
|
|
this function takes MANY or UNEVALLED args, then the C source
|
|
|
|
|
won't give the names of the arguments, so we shouldn't bother
|
2001-10-13 20:41:25 +00:00
|
|
|
|
trying to find them.
|
|
|
|
|
|
2001-10-16 13:05:28 +00:00
|
|
|
|
Various doc-string styles:
|
|
|
|
|
0: DEFUN (..., "DOC") (args) [!comment]
|
|
|
|
|
1: DEFUN (..., /\* DOC *\/ (args)) [comment && !doc_keyword]
|
|
|
|
|
2: DEFUN (..., doc: /\* DOC *\/) (args) [comment && doc_keyword]
|
|
|
|
|
*/
|
2001-10-21 09:21:46 +00:00
|
|
|
|
if (defunflag && maxargs != -1 && !saw_usage)
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
|
|
|
|
char argbuf[1024], *p = argbuf;
|
2001-10-13 20:41:25 +00:00
|
|
|
|
|
2001-10-16 13:05:28 +00:00
|
|
|
|
if (!comment || doc_keyword)
|
2001-10-13 20:41:25 +00:00
|
|
|
|
while (c != ')')
|
|
|
|
|
{
|
|
|
|
|
if (c < 0)
|
|
|
|
|
goto eof;
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
}
|
2002-01-05 23:37:58 +00:00
|
|
|
|
|
1989-05-08 21:10:27 +00:00
|
|
|
|
/* Skip into arguments. */
|
|
|
|
|
while (c != '(')
|
|
|
|
|
{
|
|
|
|
|
if (c < 0)
|
|
|
|
|
goto eof;
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
}
|
|
|
|
|
/* Copy arguments into ARGBUF. */
|
|
|
|
|
*p++ = c;
|
|
|
|
|
do
|
|
|
|
|
*p++ = c = getc (infile);
|
|
|
|
|
while (c != ')');
|
|
|
|
|
*p = '\0';
|
|
|
|
|
/* Output them. */
|
|
|
|
|
fprintf (outfile, "\n\n");
|
1994-01-16 08:35:01 +00:00
|
|
|
|
write_c_args (outfile, buf, argbuf, minargs, maxargs);
|
1989-05-08 21:10:27 +00:00
|
|
|
|
}
|
2002-07-15 20:00:03 +00:00
|
|
|
|
else if (defunflag && maxargs == -1 && !saw_usage)
|
|
|
|
|
/* The DOC should provide the usage form. */
|
|
|
|
|
fprintf (stderr, "Missing `usage' for function `%s'.\n", buf);
|
1989-05-08 21:10:27 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
eof:
|
|
|
|
|
fclose (infile);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Read a file of Lisp code, compiled or interpreted.
|
|
|
|
|
Looks for
|
|
|
|
|
(defun NAME ARGS DOCSTRING ...)
|
1992-07-08 22:47:39 +00:00
|
|
|
|
(defmacro NAME ARGS DOCSTRING ...)
|
2000-03-29 21:32:12 +00:00
|
|
|
|
(defsubst NAME ARGS DOCSTRING ...)
|
1992-07-08 22:47:39 +00:00
|
|
|
|
(autoload (quote NAME) FILE DOCSTRING ...)
|
1989-05-08 21:10:27 +00:00
|
|
|
|
(defvar NAME VALUE DOCSTRING)
|
|
|
|
|
(defconst NAME VALUE DOCSTRING)
|
1992-07-08 22:47:39 +00:00
|
|
|
|
(fset (quote NAME) (make-byte-code ... DOCSTRING ...))
|
|
|
|
|
(fset (quote NAME) #[... DOCSTRING ...])
|
1993-05-22 22:07:57 +00:00
|
|
|
|
(defalias (quote NAME) #[... DOCSTRING ...])
|
1997-08-31 17:05:53 +00:00
|
|
|
|
(custom-declare-variable (quote NAME) VALUE DOCSTRING ...)
|
1989-05-08 21:10:27 +00:00
|
|
|
|
starting in column zero.
|
1992-07-08 22:47:39 +00:00
|
|
|
|
(quote NAME) may appear as 'NAME as well.
|
1994-12-21 16:16:45 +00:00
|
|
|
|
|
|
|
|
|
We also look for #@LENGTH CONTENTS^_ at the beginning of the line.
|
|
|
|
|
When we find that, we save it for the following defining-form,
|
|
|
|
|
and we use that instead of reading a doc string within that defining-form.
|
|
|
|
|
|
2002-01-05 23:37:58 +00:00
|
|
|
|
For defvar, defconst, and fset we skip to the docstring with a kludgy
|
1992-07-08 22:47:39 +00:00
|
|
|
|
formatting convention: all docstrings must appear on the same line as the
|
2002-01-05 23:37:58 +00:00
|
|
|
|
initial open-paren (the one in column zero) and must contain a backslash
|
1999-09-04 11:25:13 +00:00
|
|
|
|
and a newline immediately after the initial double-quote. No newlines
|
1992-07-08 22:47:39 +00:00
|
|
|
|
must appear between the beginning of the form and the first double-quote.
|
1999-09-04 11:25:13 +00:00
|
|
|
|
For defun, defmacro, and autoload, we know how to skip over the
|
|
|
|
|
arglist, but the doc string must still have a backslash and newline
|
2002-01-05 23:37:58 +00:00
|
|
|
|
immediately after the double quote.
|
1999-09-04 11:25:13 +00:00
|
|
|
|
The only source files that must follow this convention are preloaded
|
|
|
|
|
uncompiled ones like loaddefs.el and bindings.el; aside
|
1992-07-08 22:47:39 +00:00
|
|
|
|
from that, it is always the .elc file that we look at, and they are no
|
|
|
|
|
problem because byte-compiler output follows this convention.
|
1989-05-08 21:10:27 +00:00
|
|
|
|
The NAME and DOCSTRING are output.
|
|
|
|
|
NAME is preceded by `F' for a function or `V' for a variable.
|
|
|
|
|
An entry is output only if DOCSTRING has \ newline just after the opening "
|
|
|
|
|
*/
|
|
|
|
|
|
1992-07-08 22:47:39 +00:00
|
|
|
|
void
|
2010-07-03 00:50:23 +00:00
|
|
|
|
skip_white (FILE *infile)
|
1992-07-08 22:47:39 +00:00
|
|
|
|
{
|
|
|
|
|
char c = ' ';
|
1999-09-03 23:12:27 +00:00
|
|
|
|
while (c == ' ' || c == '\t' || c == '\n' || c == '\r')
|
1992-07-08 22:47:39 +00:00
|
|
|
|
c = getc (infile);
|
|
|
|
|
ungetc (c, infile);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2010-07-03 00:50:23 +00:00
|
|
|
|
read_lisp_symbol (FILE *infile, char *buffer)
|
1992-07-08 22:47:39 +00:00
|
|
|
|
{
|
|
|
|
|
char c;
|
|
|
|
|
char *fillp = buffer;
|
|
|
|
|
|
|
|
|
|
skip_white (infile);
|
|
|
|
|
while (1)
|
|
|
|
|
{
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
if (c == '\\')
|
|
|
|
|
*(++fillp) = getc (infile);
|
1999-09-03 23:12:27 +00:00
|
|
|
|
else if (c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '(' || c == ')')
|
1992-07-08 22:47:39 +00:00
|
|
|
|
{
|
|
|
|
|
ungetc (c, infile);
|
|
|
|
|
*fillp = 0;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
*fillp++ = c;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (! buffer[0])
|
|
|
|
|
fprintf (stderr, "## expected a symbol, got '%c'\n", c);
|
2002-01-05 23:37:58 +00:00
|
|
|
|
|
1992-07-08 22:47:39 +00:00
|
|
|
|
skip_white (infile);
|
|
|
|
|
}
|
|
|
|
|
|
1994-10-12 20:21:51 +00:00
|
|
|
|
int
|
Fix warnings produced by compiling with -Wwrite_strings (i.e. use const char *).
* b2m.c (concat, fatal): Use const char*.
(main): Don't assign labels a string literal.
* ebrowse.c (struct member): filename, def_filename is const.
(struct sym): filename, sfilename is const.
(struct kw): name is const.
(add_sym, yyerror, token_string, insert_keyword, main): Use const char*.
* emacsclient.c (message, sock_err_message, send_to_emacs)
(quote_argument, set_local_socket)
(start_daemon_and_retry_set_socket): Use const char*.
* etags.c (compressor, language, Ada_suffix, Ada_help, Asm_suffixes)
(Asm_help, default_C_suffixes, default_C_help, Cplusplus_suffixes)
(Cplusplus_help, Cjava_suffixes, Cobol_suffixes, Cstar_suffixes)
(Erlang_suffixes, Erlang_help, Forth_suffixes, Forth_help)
(Fortran_suffixes, Fortran_help, HTML_suffixes, HTML_help)
(Lisp_suffixes, Lisp_help, Lua_suffixes, Lua_help)
(Makefile_filenames, Makefile_help, Objc_suffixes, Objc_help)
(Pascal_suffixes, Pascal_help, Perl_suffixes, Perl_interpreters)
(Perl_help, PHP_suffixes, PHP_help, plain_C_suffixses, PS_suffixes)
(PS_help, Prolog_suffixes, Prolog_help, Python_suffixes, Python_help)
(Scheme_suffixes, Scheme_help, TeX_suffixes, TeX_help, Texinfo_suffixes)
(Texinfo_help, Yacc_suffixes, Yacc_help, auto_help, none_help)
(no_lang_help, print_language_names)
(get_language_from_interpreter, get_language_from_filename)
(init, make_tag, struct C_stab_entry, write_classname, TEX_defenv)
(TEX_decode_env, nocase_tail, savestr, savenstr, fatal, pfatal)
(concat): Use const char*.
* make-docfile.c (error, fatal, scan_c_file, scan_lisp_file): Use
const char *.
* movemail.c (fatal, error, concat): Use const char *.
* pop.c (pop_multi_first, socket_connection, sendline): Use conat char*.
* pop.h (pop_multi_first): Use const char *.
(_ARGS): Remove.
* sorted-doc.c (error, fatal, states): Use const char *.
* update-game-score.c (get_prefix, write_scores, main): Use const char*.
2010-08-11 08:20:34 +00:00
|
|
|
|
scan_lisp_file (const char *filename, const char *mode)
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
|
|
|
|
FILE *infile;
|
|
|
|
|
register int c;
|
1994-12-21 16:16:45 +00:00
|
|
|
|
char *saved_string = 0;
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
1994-01-06 03:59:30 +00:00
|
|
|
|
infile = fopen (filename, mode);
|
1989-05-08 21:10:27 +00:00
|
|
|
|
if (infile == NULL)
|
|
|
|
|
{
|
|
|
|
|
perror (filename);
|
|
|
|
|
return 0; /* No error */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
c = '\n';
|
|
|
|
|
while (!feof (infile))
|
|
|
|
|
{
|
1994-12-21 16:16:45 +00:00
|
|
|
|
char buffer[BUFSIZ];
|
1992-07-08 22:47:39 +00:00
|
|
|
|
char type;
|
|
|
|
|
|
1999-09-24 13:52:46 +00:00
|
|
|
|
/* If not at end of line, skip till we get to one. */
|
1999-09-03 23:12:27 +00:00
|
|
|
|
if (c != '\n' && c != '\r')
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
1999-09-24 13:52:46 +00:00
|
|
|
|
/* Skip the line break. */
|
1999-09-27 11:34:27 +00:00
|
|
|
|
while (c == '\n' || c == '\r')
|
1999-09-24 13:52:46 +00:00
|
|
|
|
c = getc (infile);
|
1994-12-21 16:16:45 +00:00
|
|
|
|
/* Detect a dynamic doc string and save it for the next expression. */
|
|
|
|
|
if (c == '#')
|
|
|
|
|
{
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
if (c == '@')
|
|
|
|
|
{
|
|
|
|
|
int length = 0;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
/* Read the length. */
|
|
|
|
|
while ((c = getc (infile),
|
|
|
|
|
c >= '0' && c <= '9'))
|
|
|
|
|
{
|
|
|
|
|
length *= 10;
|
|
|
|
|
length += c - '0';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* The next character is a space that is counted in the length
|
|
|
|
|
but not part of the doc string.
|
|
|
|
|
We already read it, so just ignore it. */
|
|
|
|
|
length--;
|
|
|
|
|
|
|
|
|
|
/* Read in the contents. */
|
2009-06-29 05:27:53 +00:00
|
|
|
|
free (saved_string);
|
2008-12-01 20:29:02 +00:00
|
|
|
|
saved_string = (char *) xmalloc (length);
|
1994-12-21 16:16:45 +00:00
|
|
|
|
for (i = 0; i < length; i++)
|
|
|
|
|
saved_string[i] = getc (infile);
|
|
|
|
|
/* The last character is a ^_.
|
|
|
|
|
That is needed in the .elc file
|
|
|
|
|
but it is redundant in DOC. So get rid of it here. */
|
|
|
|
|
saved_string[length - 1] = 0;
|
1999-09-24 13:52:46 +00:00
|
|
|
|
/* Skip the line break. */
|
|
|
|
|
while (c == '\n' && c == '\r')
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
/* Skip the following line. */
|
1999-09-03 23:12:27 +00:00
|
|
|
|
while (c != '\n' && c != '\r')
|
1994-12-21 16:16:45 +00:00
|
|
|
|
c = getc (infile);
|
|
|
|
|
}
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
1989-05-08 21:10:27 +00:00
|
|
|
|
if (c != '(')
|
|
|
|
|
continue;
|
1991-01-14 23:38:10 +00:00
|
|
|
|
|
1992-07-08 22:47:39 +00:00
|
|
|
|
read_lisp_symbol (infile, buffer);
|
|
|
|
|
|
1999-09-24 13:52:46 +00:00
|
|
|
|
if (! strcmp (buffer, "defun")
|
2000-03-29 21:32:12 +00:00
|
|
|
|
|| ! strcmp (buffer, "defmacro")
|
|
|
|
|
|| ! strcmp (buffer, "defsubst"))
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
1992-07-08 22:47:39 +00:00
|
|
|
|
type = 'F';
|
|
|
|
|
read_lisp_symbol (infile, buffer);
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
1992-07-08 22:47:39 +00:00
|
|
|
|
/* Skip the arguments: either "nil" or a list in parens */
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
1992-07-08 22:47:39 +00:00
|
|
|
|
c = getc (infile);
|
|
|
|
|
if (c == 'n') /* nil */
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
1999-09-24 13:52:46 +00:00
|
|
|
|
if ((c = getc (infile)) != 'i'
|
|
|
|
|
|| (c = getc (infile)) != 'l')
|
1992-07-08 22:47:39 +00:00
|
|
|
|
{
|
|
|
|
|
fprintf (stderr, "## unparsable arglist in %s (%s)\n",
|
|
|
|
|
buffer, filename);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
1989-05-08 21:10:27 +00:00
|
|
|
|
}
|
1992-07-08 22:47:39 +00:00
|
|
|
|
else if (c != '(')
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
1992-07-08 22:47:39 +00:00
|
|
|
|
fprintf (stderr, "## unparsable arglist in %s (%s)\n",
|
|
|
|
|
buffer, filename);
|
|
|
|
|
continue;
|
1989-05-08 21:10:27 +00:00
|
|
|
|
}
|
1992-07-08 22:47:39 +00:00
|
|
|
|
else
|
|
|
|
|
while (c != ')')
|
1989-05-08 21:10:27 +00:00
|
|
|
|
c = getc (infile);
|
1992-07-08 22:47:39 +00:00
|
|
|
|
skip_white (infile);
|
|
|
|
|
|
|
|
|
|
/* If the next three characters aren't `dquote bslash newline'
|
|
|
|
|
then we're not reading a docstring.
|
|
|
|
|
*/
|
1999-09-24 13:52:46 +00:00
|
|
|
|
if ((c = getc (infile)) != '"'
|
|
|
|
|
|| (c = getc (infile)) != '\\'
|
|
|
|
|
|| ((c = getc (infile)) != '\n' && c != '\r'))
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
1992-07-08 22:47:39 +00:00
|
|
|
|
#ifdef DEBUG
|
|
|
|
|
fprintf (stderr, "## non-docstring in %s (%s)\n",
|
|
|
|
|
buffer, filename);
|
|
|
|
|
#endif
|
|
|
|
|
continue;
|
1989-05-08 21:10:27 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
1991-01-14 23:38:10 +00:00
|
|
|
|
|
1999-09-24 13:52:46 +00:00
|
|
|
|
else if (! strcmp (buffer, "defvar")
|
|
|
|
|
|| ! strcmp (buffer, "defconst"))
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
1992-07-08 22:47:39 +00:00
|
|
|
|
char c1 = 0, c2 = 0;
|
|
|
|
|
type = 'V';
|
|
|
|
|
read_lisp_symbol (infile, buffer);
|
1991-01-14 23:38:10 +00:00
|
|
|
|
|
1994-12-21 16:16:45 +00:00
|
|
|
|
if (saved_string == 0)
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
1994-12-21 16:16:45 +00:00
|
|
|
|
|
1999-09-24 13:52:46 +00:00
|
|
|
|
/* Skip until the end of line; remember two previous chars. */
|
1999-09-03 23:12:27 +00:00
|
|
|
|
while (c != '\n' && c != '\r' && c >= 0)
|
1994-12-21 16:16:45 +00:00
|
|
|
|
{
|
|
|
|
|
c2 = c1;
|
|
|
|
|
c1 = c;
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
}
|
2002-01-05 23:37:58 +00:00
|
|
|
|
|
1994-12-21 16:16:45 +00:00
|
|
|
|
/* If two previous characters were " and \,
|
|
|
|
|
this is a doc string. Otherwise, there is none. */
|
|
|
|
|
if (c2 != '"' || c1 != '\\')
|
|
|
|
|
{
|
1992-07-08 22:47:39 +00:00
|
|
|
|
#ifdef DEBUG
|
1994-12-21 16:16:45 +00:00
|
|
|
|
fprintf (stderr, "## non-docstring in %s (%s)\n",
|
|
|
|
|
buffer, filename);
|
1992-07-08 22:47:39 +00:00
|
|
|
|
#endif
|
1994-12-21 16:16:45 +00:00
|
|
|
|
continue;
|
|
|
|
|
}
|
1989-05-08 21:10:27 +00:00
|
|
|
|
}
|
1992-07-08 22:47:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
2009-11-04 06:15:41 +00:00
|
|
|
|
else if (! strcmp (buffer, "custom-declare-variable")
|
|
|
|
|
|| ! strcmp (buffer, "defvaralias")
|
|
|
|
|
)
|
1997-08-31 17:05:53 +00:00
|
|
|
|
{
|
|
|
|
|
char c1 = 0, c2 = 0;
|
|
|
|
|
type = 'V';
|
|
|
|
|
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
if (c == '\'')
|
|
|
|
|
read_lisp_symbol (infile, buffer);
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (c != '(')
|
|
|
|
|
{
|
|
|
|
|
fprintf (stderr,
|
|
|
|
|
"## unparsable name in custom-declare-variable in %s\n",
|
|
|
|
|
filename);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
read_lisp_symbol (infile, buffer);
|
|
|
|
|
if (strcmp (buffer, "quote"))
|
|
|
|
|
{
|
|
|
|
|
fprintf (stderr,
|
|
|
|
|
"## unparsable name in custom-declare-variable in %s\n",
|
|
|
|
|
filename);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
read_lisp_symbol (infile, buffer);
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
if (c != ')')
|
|
|
|
|
{
|
|
|
|
|
fprintf (stderr,
|
|
|
|
|
"## unparsable quoted name in custom-declare-variable in %s\n",
|
|
|
|
|
filename);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (saved_string == 0)
|
|
|
|
|
{
|
1999-09-24 13:52:46 +00:00
|
|
|
|
/* Skip to end of line; remember the two previous chars. */
|
1999-09-03 23:12:27 +00:00
|
|
|
|
while (c != '\n' && c != '\r' && c >= 0)
|
1997-08-31 17:05:53 +00:00
|
|
|
|
{
|
|
|
|
|
c2 = c1;
|
|
|
|
|
c1 = c;
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
}
|
2002-01-05 23:37:58 +00:00
|
|
|
|
|
1997-08-31 17:05:53 +00:00
|
|
|
|
/* If two previous characters were " and \,
|
|
|
|
|
this is a doc string. Otherwise, there is none. */
|
|
|
|
|
if (c2 != '"' || c1 != '\\')
|
|
|
|
|
{
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
|
fprintf (stderr, "## non-docstring in %s (%s)\n",
|
|
|
|
|
buffer, filename);
|
|
|
|
|
#endif
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
1993-05-22 22:07:57 +00:00
|
|
|
|
else if (! strcmp (buffer, "fset") || ! strcmp (buffer, "defalias"))
|
1992-07-08 22:47:39 +00:00
|
|
|
|
{
|
|
|
|
|
char c1 = 0, c2 = 0;
|
|
|
|
|
type = 'F';
|
1991-01-14 23:38:10 +00:00
|
|
|
|
|
1992-07-08 22:47:39 +00:00
|
|
|
|
c = getc (infile);
|
|
|
|
|
if (c == '\'')
|
|
|
|
|
read_lisp_symbol (infile, buffer);
|
|
|
|
|
else
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
1992-07-08 22:47:39 +00:00
|
|
|
|
if (c != '(')
|
|
|
|
|
{
|
|
|
|
|
fprintf (stderr, "## unparsable name in fset in %s\n",
|
|
|
|
|
filename);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
read_lisp_symbol (infile, buffer);
|
|
|
|
|
if (strcmp (buffer, "quote"))
|
|
|
|
|
{
|
|
|
|
|
fprintf (stderr, "## unparsable name in fset in %s\n",
|
|
|
|
|
filename);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
read_lisp_symbol (infile, buffer);
|
1989-05-08 21:10:27 +00:00
|
|
|
|
c = getc (infile);
|
1992-07-08 22:47:39 +00:00
|
|
|
|
if (c != ')')
|
|
|
|
|
{
|
|
|
|
|
fprintf (stderr,
|
|
|
|
|
"## unparsable quoted name in fset in %s\n",
|
|
|
|
|
filename);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
1989-05-08 21:10:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
1994-12-21 16:16:45 +00:00
|
|
|
|
if (saved_string == 0)
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
1999-09-24 13:52:46 +00:00
|
|
|
|
/* Skip to end of line; remember the two previous chars. */
|
1999-09-03 23:12:27 +00:00
|
|
|
|
while (c != '\n' && c != '\r' && c >= 0)
|
1994-12-21 16:16:45 +00:00
|
|
|
|
{
|
|
|
|
|
c2 = c1;
|
|
|
|
|
c1 = c;
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
}
|
2002-01-05 23:37:58 +00:00
|
|
|
|
|
1994-12-21 16:16:45 +00:00
|
|
|
|
/* If two previous characters were " and \,
|
|
|
|
|
this is a doc string. Otherwise, there is none. */
|
|
|
|
|
if (c2 != '"' || c1 != '\\')
|
|
|
|
|
{
|
1992-07-08 22:47:39 +00:00
|
|
|
|
#ifdef DEBUG
|
1994-12-21 16:16:45 +00:00
|
|
|
|
fprintf (stderr, "## non-docstring in %s (%s)\n",
|
|
|
|
|
buffer, filename);
|
1992-07-08 22:47:39 +00:00
|
|
|
|
#endif
|
1994-12-21 16:16:45 +00:00
|
|
|
|
continue;
|
|
|
|
|
}
|
1992-07-08 22:47:39 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
1992-07-08 22:47:39 +00:00
|
|
|
|
else if (! strcmp (buffer, "autoload"))
|
|
|
|
|
{
|
|
|
|
|
type = 'F';
|
|
|
|
|
c = getc (infile);
|
|
|
|
|
if (c == '\'')
|
|
|
|
|
read_lisp_symbol (infile, buffer);
|
|
|
|
|
else
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
1992-07-08 22:47:39 +00:00
|
|
|
|
if (c != '(')
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
1992-07-08 22:47:39 +00:00
|
|
|
|
fprintf (stderr, "## unparsable name in autoload in %s\n",
|
|
|
|
|
filename);
|
|
|
|
|
continue;
|
1989-05-08 21:10:27 +00:00
|
|
|
|
}
|
1992-07-08 22:47:39 +00:00
|
|
|
|
read_lisp_symbol (infile, buffer);
|
|
|
|
|
if (strcmp (buffer, "quote"))
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
1992-07-08 22:47:39 +00:00
|
|
|
|
fprintf (stderr, "## unparsable name in autoload in %s\n",
|
|
|
|
|
filename);
|
|
|
|
|
continue;
|
1989-05-08 21:10:27 +00:00
|
|
|
|
}
|
1992-07-08 22:47:39 +00:00
|
|
|
|
read_lisp_symbol (infile, buffer);
|
1989-05-08 21:10:27 +00:00
|
|
|
|
c = getc (infile);
|
1992-07-08 22:47:39 +00:00
|
|
|
|
if (c != ')')
|
1989-05-08 21:10:27 +00:00
|
|
|
|
{
|
1992-07-08 22:47:39 +00:00
|
|
|
|
fprintf (stderr,
|
|
|
|
|
"## unparsable quoted name in autoload in %s\n",
|
|
|
|
|
filename);
|
|
|
|
|
continue;
|
1989-05-08 21:10:27 +00:00
|
|
|
|
}
|
1992-07-08 22:47:39 +00:00
|
|
|
|
}
|
|
|
|
|
skip_white (infile);
|
|
|
|
|
if ((c = getc (infile)) != '\"')
|
|
|
|
|
{
|
|
|
|
|
fprintf (stderr, "## autoload of %s unparsable (%s)\n",
|
|
|
|
|
buffer, filename);
|
1989-05-08 21:10:27 +00:00
|
|
|
|
continue;
|
|
|
|
|
}
|
2001-10-21 09:21:46 +00:00
|
|
|
|
read_c_string_or_comment (infile, 0, 0, 0);
|
1992-07-08 22:47:39 +00:00
|
|
|
|
skip_white (infile);
|
|
|
|
|
|
1994-12-21 16:16:45 +00:00
|
|
|
|
if (saved_string == 0)
|
1991-01-14 23:38:10 +00:00
|
|
|
|
{
|
1994-12-21 16:16:45 +00:00
|
|
|
|
/* If the next three characters aren't `dquote bslash newline'
|
|
|
|
|
then we're not reading a docstring. */
|
1999-09-24 13:52:46 +00:00
|
|
|
|
if ((c = getc (infile)) != '"'
|
|
|
|
|
|| (c = getc (infile)) != '\\'
|
|
|
|
|
|| ((c = getc (infile)) != '\n' && c != '\r'))
|
1994-12-21 16:16:45 +00:00
|
|
|
|
{
|
1992-07-08 22:47:39 +00:00
|
|
|
|
#ifdef DEBUG
|
1994-12-21 16:16:45 +00:00
|
|
|
|
fprintf (stderr, "## non-docstring in %s (%s)\n",
|
|
|
|
|
buffer, filename);
|
1992-07-08 22:47:39 +00:00
|
|
|
|
#endif
|
1994-12-21 16:16:45 +00:00
|
|
|
|
continue;
|
|
|
|
|
}
|
1991-01-14 23:38:10 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
1992-07-08 22:47:39 +00:00
|
|
|
|
#ifdef DEBUG
|
1999-09-24 13:52:46 +00:00
|
|
|
|
else if (! strcmp (buffer, "if")
|
|
|
|
|
|| ! strcmp (buffer, "byte-code"))
|
1992-07-08 22:47:39 +00:00
|
|
|
|
;
|
|
|
|
|
#endif
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
1992-07-08 22:47:39 +00:00
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
#ifdef DEBUG
|
2008-07-01 03:00:46 +00:00
|
|
|
|
fprintf (stderr, "## unrecognized top-level form, %s (%s)\n",
|
1992-07-08 22:47:39 +00:00
|
|
|
|
buffer, filename);
|
|
|
|
|
#endif
|
|
|
|
|
continue;
|
|
|
|
|
}
|
1989-05-08 21:10:27 +00:00
|
|
|
|
|
1994-12-21 16:16:45 +00:00
|
|
|
|
/* At this point, we should either use the previous
|
|
|
|
|
dynamic doc string in saved_string
|
|
|
|
|
or gobble a doc string from the input file.
|
|
|
|
|
|
|
|
|
|
In the latter case, the opening quote (and leading
|
|
|
|
|
backslash-newline) have already been read. */
|
|
|
|
|
|
1989-05-08 21:10:27 +00:00
|
|
|
|
putc (037, outfile);
|
1992-07-08 22:47:39 +00:00
|
|
|
|
putc (type, outfile);
|
|
|
|
|
fprintf (outfile, "%s\n", buffer);
|
1994-12-21 16:16:45 +00:00
|
|
|
|
if (saved_string)
|
|
|
|
|
{
|
|
|
|
|
fputs (saved_string, outfile);
|
|
|
|
|
/* Don't use one dynamic doc string twice. */
|
|
|
|
|
free (saved_string);
|
|
|
|
|
saved_string = 0;
|
|
|
|
|
}
|
|
|
|
|
else
|
2001-10-21 09:21:46 +00:00
|
|
|
|
read_c_string_or_comment (infile, 1, 0, 0);
|
1989-05-08 21:10:27 +00:00
|
|
|
|
}
|
|
|
|
|
fclose (infile);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
2003-09-01 15:45:59 +00:00
|
|
|
|
|
2004-05-08 15:26:33 +00:00
|
|
|
|
|
|
|
|
|
/* make-docfile.c ends here */
|