diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 1998-04-14 16:03:45 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 1998-04-14 16:03:45 +0000 |
commit | 52461c587563822939b238379bb1d72975e80b62 (patch) | |
tree | 453b3e3982d1af792bd6b4e6973e429b25dd8539 /doc/tools/src2html1.4a/Ctags | |
parent | Now builds for all formats and includes urls (diff) | |
download | rtems-52461c587563822939b238379bb1d72975e80b62.tar.bz2 |
New files
Diffstat (limited to 'doc/tools/src2html1.4a/Ctags')
-rw-r--r-- | doc/tools/src2html1.4a/Ctags/C.c | 444 | ||||
-rw-r--r-- | doc/tools/src2html1.4a/Ctags/Makefile | 12 | ||||
-rw-r--r-- | doc/tools/src2html1.4a/Ctags/ctags.1 | 225 | ||||
-rw-r--r-- | doc/tools/src2html1.4a/Ctags/ctags.c | 265 | ||||
-rw-r--r-- | doc/tools/src2html1.4a/Ctags/ctags.h | 81 | ||||
-rw-r--r-- | doc/tools/src2html1.4a/Ctags/fortran.c | 155 | ||||
-rw-r--r-- | doc/tools/src2html1.4a/Ctags/lisp.c | 97 | ||||
-rw-r--r-- | doc/tools/src2html1.4a/Ctags/print.c | 130 | ||||
-rw-r--r-- | doc/tools/src2html1.4a/Ctags/strerror.c | 6 | ||||
-rw-r--r-- | doc/tools/src2html1.4a/Ctags/tree.c | 138 | ||||
-rw-r--r-- | doc/tools/src2html1.4a/Ctags/yacc.c | 144 | ||||
-rw-r--r-- | doc/tools/src2html1.4a/Ctags/z.c | 20 |
12 files changed, 1717 insertions, 0 deletions
diff --git a/doc/tools/src2html1.4a/Ctags/C.c b/doc/tools/src2html1.4a/Ctags/C.c new file mode 100644 index 0000000000..f091fcedad --- /dev/null +++ b/doc/tools/src2html1.4a/Ctags/C.c @@ -0,0 +1,444 @@ +/* + * Copyright (c) 1987 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)C.c 5.5 (Berkeley) 2/26/91"; +#endif /* not lint */ + +#include <stdio.h> +#include <string.h> +#include "ctags.h" + +static int func_entry(), str_entry(); +static void hash_entry(); + +/* + * c_entries -- + * read .c and .h files and call appropriate routines + */ +c_entries() +{ + extern int tflag; /* -t: create tags for typedefs */ + register int c, /* current character */ + level; /* brace level */ + register char *sp; /* buffer pointer */ + int token, /* if reading a token */ + t_def, /* if reading a typedef */ + t_level; /* typedef's brace level */ + char tok[MAXTOKEN]; /* token buffer */ + int st; /* Symbol type */ + int rparen; /* State of last rparen */ + + lineftell = ftell(inf); + sp = tok; token = t_def = NO; t_level = -1; level = 0; lineno = 1; + rparen=0; + while (GETC(!=,EOF)) { + rparen--; + switch ((char)c) { + /* + * Here's where it DOESN'T handle: + * foo(a) + * { + * #ifdef notdef + * } + * #endif + * if (a) + * puts("hello, world"); + * } + */ + case '{': + ++level; + goto endtok; + case '}': + /* + * if level goes below zero, try and fix + * it, even though we've already messed up + */ + if (--level < 0) + level = 0; + goto endtok; + + case '\n': + SETLINE; + /* + * the above 3 cases are similar in that they + * are special characters that also end tokens. + */ +endtok: if (sp > tok) { + *sp = EOS; + token = YES; + sp = tok; + } + else + token = NO; + continue; + + /* we ignore quoted strings and comments in their entirety */ + case '"': + case '\'': + (void)skip_key(c); + break; + /* We ignore everything between [] */ + case '[': + (void)skip_key(']'); + goto storec; + + /* + * comments can be fun; note the state is unchanged after + * return, in case we found: + * "foo() XX comment XX { int bar; }" + */ + case '/': + if (GETC(==,'*')) { + skip_comment(); + continue; + } + (void)ungetc(c,inf); + c = '/'; + goto storec; + + /* hash marks flag #define's. */ + case '#': + if (sp == tok) { + hash_entry(); + break; + } + goto storec; + + /* + * if we have a current token, parenthesis on + * level zero indicates a function. + */ + case '(': + if (!level && token) { + int curline; + + if (sp != tok) + *sp = EOS; + /* + * grab the line immediately, we may + * already be wrong, for example, + * foo\n + * (arg1, + */ + getline(); + curline = lineno; + if (func_entry()) { + ++level; + pfnote(tok,curline,SY_FUN); + } else rparen=2; + break; + } + goto storec; + + /* + * semi-colons indicate the end of a typedef; if we find a + * typedef we search for the next semi-colon of the same + * level as the typedef. Ignoring "structs", they are + * tricky, since you can find: + * + * "typedef long time_t;" + * "typedef unsigned int u_int;" + * "typedef unsigned int u_int [10];" + * + * If looking at a typedef, we save a copy of the last token + * found. Then, when we find the ';' we take the current + * token if it starts with a valid token name, else we take + * the one we saved. There's probably some reasonable + * alternative to this... + */ + case ';': + if (t_def && level == t_level) { + t_def = NO; + getline(); + if (sp != tok) + *sp = EOS; + pfnote(tok,lineno,SY_TYP); + break; + } + /* + * Catch global variables by the fact that they end in ; or , + * and they are at level zero. + */ + case ',': + if (sp != tok) *sp = EOS; + if (level==0 && rparen!=1) { + pfnote(tok,lineno,SY_VAR); + break; + } + goto storec; + + /* + * store characters until one that can't be part of a token + * comes along; check the current token against certain + * reserved words. + */ + default: +storec: if (!intoken(c)) { + if (sp == tok) + break; + *sp = EOS; + if (tflag) { + /* no typedefs inside typedefs */ + if (!t_def && !bcmp(tok,"typedef",8)) { + t_def = YES; + t_level = level; + break; + } + /* catch "typedef struct" */ + if ((!t_def || t_level < level) + && (!bcmp(tok,"struct",7) + || !bcmp(tok,"union",6) + || !bcmp(tok,"enum",5))) { + /* Get type of symbol */ + st=0; + switch (*tok) { + case 's' : st= SY_STR; break; + case 'u' : st= SY_UNI; break; + case 'e' : st= SY_ENU; break; + } + /* + * get line immediately; + * may change before '{' + */ + getline(); + if (str_entry(c,st)) + ++level; + break; + } + } + sp = tok; + } + else if (sp != tok || begtoken(c)) { + *sp++ = c; + token = YES; + } + continue; + } + sp = tok; + token = NO; + } +} + +/* + * func_entry -- + * handle a function reference + */ +static +func_entry() +{ + register int c; /* current character */ + + /* + * we assume that the character after a function's right paren + * is a token character if it's a function and a non-token + * character if it's a declaration. Comments don't count... + */ + (void)skip_key((int)')'); + for (;;) { + while (GETC(!=,EOF) && iswhite(c)) + if (c == (int)'\n') + SETLINE; + if (intoken(c) || c == (int)'{') + break; + if (c == (int)'/' && GETC(==,'*')) + skip_comment(); + else { /* don't ever "read" '/' */ + (void)ungetc(c,inf); + return(NO); + } + } + if (c != (int)'{') + (void)skip_key((int)'{'); + return(YES); +} + +/* + * hash_entry -- + * handle a line starting with a '#' + */ +static void +hash_entry() +{ + extern int dflag; /* -d: non-macro defines */ + register int c, /* character read */ + curline; /* line started on */ + register char *sp; /* buffer pointer */ + char tok[MAXTOKEN]; /* storage buffer */ + + curline = lineno; + for (sp = tok;;) { /* get next token */ + if (GETC(==,EOF)) + return; + if (iswhite(c)) + break; + *sp++ = c; + } + *sp = EOS; + if (bcmp(tok,"define",6)) /* only interested in #define's */ + goto skip; + for (;;) { /* this doesn't handle "#define \n" */ + if (GETC(==,EOF)) + return; + if (!iswhite(c)) + break; + } + for (sp = tok;;) { /* get next token */ + *sp++ = c; + if (GETC(==,EOF)) + return; + /* + * this is where it DOESN'T handle + * "#define \n" + */ + if (!intoken(c)) + break; + } + *sp = EOS; + if (dflag || c == (int)'(') { /* only want macros */ + getline(); + if (c == (int)'(') pfnote(tok,curline,SY_MAC); + else pfnote(tok,curline,SY_DEF); + } +skip: if (c == (int)'\n') { /* get rid of rest of define */ + SETLINE + if (*(sp - 1) != '\\') + return; + } + (void)skip_key((int)'\n'); +} + +/* + * str_entry -- + * handle a struct, union or enum entry + */ +static +str_entry(c,st) + register int c; /* current character */ + int st; /* type of symbol */ +{ + register char *sp; /* buffer pointer */ + int curline; /* line started on */ + char tok[BUFSIZ]; /* storage buffer */ + + curline = lineno; + while (iswhite(c)) + if (GETC(==,EOF)) + return(NO); + if (c == (int)'{') /* it was "struct {" */ + return(YES); + for (sp = tok;;) { /* get next token */ + *sp++ = c; + if (GETC(==,EOF)) + return(NO); + if (!intoken(c)) + break; + } + switch ((char)c) { + case '{': /* it was "struct foo{" */ + --sp; + break; + case '\n': /* it was "struct foo\n" */ + SETLINE; + /*FALLTHROUGH*/ + default: /* probably "struct foo " */ + while (GETC(!=,EOF)) + if (!iswhite(c)) + break; + if (c != (int)'{') { + (void)ungetc(c, inf); + return(NO); + } + } + *sp = EOS; + pfnote(tok,curline,st); + return(YES); +} + +/* + * skip_comment -- + * skip over comment + */ +skip_comment() +{ + register int c, /* character read */ + star; /* '*' flag */ + + for (star = 0;GETC(!=,EOF);) + switch((char)c) { + /* comments don't nest, nor can they be escaped. */ + case '*': + star = YES; + break; + case '/': + if (star) + return; + break; + case '\n': + SETLINE; + /*FALLTHROUGH*/ + default: + star = NO; + } +} + +/* + * skip_key -- + * skip to next char "key" + */ +skip_key(key) + register int key; +{ + register int c, + skip, + retval; + + for (skip = retval = NO;GETC(!=,EOF);) + switch((char)c) { + case '\\': /* a backslash escapes anything */ + skip = !skip; /* we toggle in case it's "\\" */ + break; + case ';': /* special case for yacc; if one */ + case '|': /* of these chars occurs, we may */ + retval = YES; /* have moved out of the rule */ + break; /* not used by C */ + case '\n': + SETLINE; + /*FALLTHROUGH*/ + default: + if (c == key && !skip) + return(retval); + skip = NO; + } + return(retval); +} diff --git a/doc/tools/src2html1.4a/Ctags/Makefile b/doc/tools/src2html1.4a/Ctags/Makefile new file mode 100644 index 0000000000..da7a148bb1 --- /dev/null +++ b/doc/tools/src2html1.4a/Ctags/Makefile @@ -0,0 +1,12 @@ +# @(#)Makefile 5.6 (Berkeley) 5/11/90 + +PROG= ctags-new +CFLAGS+=-I. +SRCS= C.c ctags.c fortran.c lisp.c print.c tree.c yacc.c strerror.c + +ctags: C.o ctags.o fortran.o lisp.o print.o tree.o yacc.o strerror.o + cc -o ctags-new C.o ctags.o fortran.o lisp.o print.o tree.o yacc.o \ + strerror.o + +clean: + rm -f *.o ctags-new diff --git a/doc/tools/src2html1.4a/Ctags/ctags.1 b/doc/tools/src2html1.4a/Ctags/ctags.1 new file mode 100644 index 0000000000..aea23f9826 --- /dev/null +++ b/doc/tools/src2html1.4a/Ctags/ctags.1 @@ -0,0 +1,225 @@ +.\" Ctags-new is a modified version of the ctags produced by UCB and +.\" distributed in their BSD distributions. +.\" You should be able to diff this version against theirs to see what I +.\" have changed. +.\" Warren Toomey +.\" +.\" Copyright (c) 1987, 1990 The Regents of the University of California. +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)ctags.1 6.8 (Berkeley) 4/24/91 +.\" +.Dd April 24, 1991 +.Dt CTAGS 1 +.Os BSD 4 +.Sh NAME +.Nm ctags-new +.Nd create a tags file +.Sh SYNOPSIS +.Nm ctags-new +.Op Fl BFadtuwvx +.Op Fl f Ar tagsfile +.Ar name ... +.Sh DESCRIPTION +.Nm Ctags-new +makes a tags file for +.Xr ex 1 +from the specified C, +Pascal, Fortran, +.Tn YACC , +lex, and lisp sources. A tags file gives the +locations of specified objects in a group of files. Each line of the +tags file contains the object name, the file in which it is defined, +and a search pattern for the object definition, separated by white-space. +Using the +.Ar tags +file, +.Xr ex 1 +can quickly locate these object +definitions. Depending on the options provided to +.Nm ctags-new , +objects will consist of subroutines, typedefs, defines, structs, +enums and unions. +.Bl -tag -width Ds +.It Fl B +use backward searching patterns +.Pq Li ?...? . +.It Fl F +use forward searching patterns +.Pq Li /.../ +(the default). +.It Fl a +append to +.Ar tags +file. +.It Fl d +create tags for +.Li #defines +that don't take arguments; +.Li #defines +that take arguments are tagged automatically. +.It Fl f +Places the tag descriptions in a file called +.Ar tagsfile . +The default behaviour is to place them in a file +.Ar tags . +.It Fl t +create tags for typedefs, structs, unions, and enums. +.It Fl u +update the specified files in the +.Ar tags +file, that is, all +references to them are deleted, and the new values are appended to the +file. (Beware: this option is implemented in a way which is rather +slow; it is usually faster to simply rebuild the +.Ar tags +file.) +.It Fl v +An index of the form expected by +.Xr vgrind 1 +is produced on the standard output. This listing +contains the object name, file name, and page number (assuming 64 +line pages). Since the output will be sorted into lexicographic order, +it may be desired to run the output through +.Xr sort 1 . +Sample use: +.Bd -literal -offset indent +ctags-new \-v files \&| sort \-f > index +vgrind \-x index +.Ed +.It Fl y +Yet another output format. This produces lines with the information: +symbol, line number, file name, type of symbol, each separated by whitespace. +This is used by the +.Xr src2html 1L +program. +.It Fl w +suppress warning diagnostics. +.It Fl x +.Nm ctags-new +produces a list of object +names, the line number and file name on which each is defined, as well +as the text of that line and prints this on the standard output. This +is a simple index which can be printed out as an off-line readable +function index. +.El +.Pp +Files whose names end in +.Nm \&.c +or +.Nm \&.h +are assumed to be C +source files and are searched for C style routine and macro definitions. +Files whose names end in +.Nm \&.y +are assumed to be +.Tn YACC +source files. +Files whose names end in +.Nm \&.l +are assumed to be lisp files if their +first non-blank character is `;', `(', or `[', +otherwise, they are +treated as lex files. Other files are first examined to see if they +contain any Pascal or Fortran routine definitions, and, if not, are +searched for C style definitions. +.Pp +The tag +.Li main +is treated specially in C programs. The tag formed +is created by prepending +.Ar M +to the name of the file, with the +trailing +.Nm \&.c +and any leading pathname components removed. This +makes use of +.Nm ctags-new +practical in directories with more than one +program. +.Pp +Yacc and lex files each have a special tag. +.Ar Yyparse +is the start +of the second section of the yacc file, and +.Ar yylex +is the start of +the second section of the lex file. +.Sh FILES +.Bl -tag -width tags -compact +.It Pa tags +default output tags file +.El +.Sh DIAGNOSTICS +.Nm Ctags-new +exits with a value of 1 if an error occurred, where +duplicate objects are not considered errors, 0 otherwise. +.Sh SEE ALSO +.Xr ex 1 , +.Xr vi 1 +.Sh BUGS +Recognition of +.Nm functions , +.Nm subroutines +and +.Nm procedures +for +.Tn FORTRAN +and Pascal is done is a very simpleminded way. No attempt +is made to deal with block structure; if you have two Pascal procedures +in different blocks with the same name you lose. +.Nm Ctags-new +doesn't +understand about Pascal types. +.Pp +The method of deciding whether to look for C, Pascal or +.Tn FORTRAN +functions is a hack. +.Pp +.Nm Ctags-new +relies on the input being well formed, and any syntactical +errors will completely confuse it. It also finds some legal syntax +confusing; for example, as it doesn't understand +.Li #ifdef Ns 's , +(incidentally, that's a feature, not a bug) any code with unbalanced +braces inside +.Li #ifdef Ns 's +will cause it to become somewhat disoriented. +In a similar fashion, multiple line changes within a definition will +cause it to enter the last line of the object, rather than the first, as +the searching pattern. The last line of multiple line +.Li typedef Ns 's +will similarly be noted. +.Sh HISTORY +The +.Nm +command appeared in +.Bx 3.0 . diff --git a/doc/tools/src2html1.4a/Ctags/ctags.c b/doc/tools/src2html1.4a/Ctags/ctags.c new file mode 100644 index 0000000000..08d01a2ba0 --- /dev/null +++ b/doc/tools/src2html1.4a/Ctags/ctags.c @@ -0,0 +1,265 @@ +/* + * Copyright (c) 1987 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +char copyright[] = +"@(#) Copyright (c) 1987 The Regents of the University of California.\n\ + All rights reserved.\n"; +#endif /* not lint */ + +#ifndef lint +static char sccsid[] = "@(#)ctags.c 5.8 (Berkeley) 2/26/91"; +#endif /* not lint */ + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include "ctags.h" + +/* + * ctags: create a tags file + */ + +NODE *head; /* head of the sorted binary tree */ + + /* boolean "func" (see init()) */ +bool _wht[0177],_etk[0177],_itk[0177],_btk[0177],_gd[0177]; + +FILE *inf, /* ioptr for current input file */ + *outf; /* ioptr for tags file */ + +long lineftell; /* ftell after getc( inf ) == '\n' */ + +int lineno, /* line number of current line */ + dflag, /* -d: non-macro defines */ + tflag, /* -t: create tags for typedefs */ + wflag, /* -w: suppress warnings */ + vflag, /* -v: vgrind style index output */ + xflag, /* -x: cxref style output */ + yflag; /* -y: yet another style output */ + +char *curfile, /* current input file name */ + searchar = '/', /* use /.../ searches by default */ + lbuf[BUFSIZ]; + +main(argc,argv) + int argc; + char **argv; +{ + extern char *optarg; /* getopt arguments */ + extern int optind; + static char *outfile = "tags"; /* output file */ + int aflag, /* -a: append to tags */ + uflag, /* -u: update tags */ + exit_val, /* exit value */ + step, /* step through args */ + ch; /* getopts char */ + char cmd[100]; /* too ugly to explain */ + + aflag = uflag = NO; + while ((ch = getopt(argc,argv,"BFadf:tuwvxy")) != EOF) + switch((char)ch) { + case 'B': + searchar = '?'; + break; + case 'F': + searchar = '/'; + break; + case 'a': + aflag++; + break; + case 'd': + dflag++; + break; + case 'f': + outfile = optarg; + break; + case 't': + tflag++; + break; + case 'u': + uflag++; + break; + case 'w': + wflag++; + break; + case 'v': + vflag++; + case 'x': + xflag++; + break; + case 'y': + yflag++; + break; + case '?': + default: + goto usage; + } + argv += optind; + argc -= optind; + if (!argc) { +usage: puts("Usage: ctags [-BFadtuwvx] [-f tagsfile] file ..."); + exit(1); + } + + init(); + + for (exit_val = step = 0;step < argc;++step) + if (!(inf = fopen(argv[step],"r"))) { + perror(argv[step]); + exit_val = 1; + } + else { + curfile = argv[step]; + find_entries(argv[step]); + (void)fclose(inf); + } + + if (head) + if (xflag) + put_entries(head); + else { + if (uflag) { + for (step = 0;step < argc;step++) { + (void)sprintf(cmd,"mv %s OTAGS;fgrep -v '\t%s\t' OTAGS >%s;rm OTAGS",outfile,argv[step],outfile); + system(cmd); + } + ++aflag; + } + if (!(outf = fopen(outfile, aflag ? "a" : "w"))) { + perror(outfile); + exit(exit_val); + } + put_entries(head); + (void)fclose(outf); + if (uflag) { + (void)sprintf(cmd,"sort %s -o %s",outfile,outfile); + system(cmd); + } + } + exit(exit_val); +} + +/* + * init -- + * this routine sets up the boolean psuedo-functions which work by + * setting boolean flags dependent upon the corresponding character. + * Every char which is NOT in that string is false with respect to + * the pseudo-function. Therefore, all of the array "_wht" is NO + * by default and then the elements subscripted by the chars in + * CWHITE are set to YES. Thus, "_wht" of a char is YES if it is in + * the string CWHITE, else NO. + */ +init() +{ + register int i; + register char *sp; + + for (i = 0; i < 0177; i++) { + _wht[i] = _etk[i] = _itk[i] = _btk[i] = NO; + _gd[i] = YES; + } +#define CWHITE " \f\t\n" + for (sp = CWHITE; *sp; sp++) /* white space chars */ + _wht[*sp] = YES; +#define CTOKEN " \t\n\"'#()[]{}=-+%*/&|^~!<>;,.:?" + for (sp = CTOKEN; *sp; sp++) /* token ending chars */ + _etk[*sp] = YES; +#define CINTOK "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz0123456789" + for (sp = CINTOK; *sp; sp++) /* valid in-token chars */ + _itk[*sp] = YES; +#define CBEGIN "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz" + for (sp = CBEGIN; *sp; sp++) /* token starting chars */ + _btk[*sp] = YES; +#define CNOTGD ",;" + for (sp = CNOTGD; *sp; sp++) /* invalid after-function chars */ + _gd[*sp] = NO; +} + +/* + * find_entries -- + * this routine opens the specified file and calls the function + * which searches the file. + */ +find_entries(file) + char *file; +{ + register char *cp; + + lineno = 0; /* should be 1 ?? KB */ + if (cp = rindex(file, '.')) { + if (cp[1] == 'l' && !cp[2]) { + register int c; + + for (;;) { + if (GETC(==,EOF)) + return; + if (!iswhite(c)) { + rewind(inf); + break; + } + } +#define LISPCHR ";([" +/* lisp */ if (index(LISPCHR,(char)c)) { + l_entries(); + return; + } +/* lex */ else { + /* + * we search all 3 parts of a lex file + * for C references. This may be wrong. + */ + toss_yysec(); + (void)strcpy(lbuf,"%%$"); + pfnote("yylex",lineno); + rewind(inf); + } + } +/* yacc */ else if (cp[1] == 'y' && !cp[2]) { + /* + * we search only the 3rd part of a yacc file + * for C references. This may be wrong. + */ + toss_yysec(); + (void)strcpy(lbuf,"%%$"); + pfnote("yyparse",lineno); + y_entries(); + } +/* fortran */ else if ((cp[1] != 'c' && cp[1] != 'h') && !cp[2]) { + if (PF_funcs()) + return; + rewind(inf); + } + } +/* C */ c_entries(); +} diff --git a/doc/tools/src2html1.4a/Ctags/ctags.h b/doc/tools/src2html1.4a/Ctags/ctags.h new file mode 100644 index 0000000000..7b28018714 --- /dev/null +++ b/doc/tools/src2html1.4a/Ctags/ctags.h @@ -0,0 +1,81 @@ +/* + * Copyright (c) 1987 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)ctags.h 5.4 (Berkeley) 2/26/91 + */ + +#include <strings.h> +#define bool char + +#define YES 1 +#define NO 0 +#define EOS '\0' + +#define ENDLINE 50 /* max length of pattern */ +#define MAXTOKEN 250 /* max size of single token */ + +#define SETLINE {++lineno;lineftell = ftell(inf);} +#define GETC(op,exp) ((c = getc(inf)) op (int)exp) + +#define iswhite(arg) (_wht[arg]) /* T if char is white */ +#define begtoken(arg) (_btk[arg]) /* T if char can start token */ +#define intoken(arg) (_itk[arg]) /* T if char can be in token */ +#define endtoken(arg) (_etk[arg]) /* T if char ends tokens */ +#define isgood(arg) (_gd[arg]) /* T if char can be after ')' */ + + /* Symbol types */ +#define SY_MAC 1 /* Preprocessor Macros */ +#define SY_DEF 2 /* Preprocessor Defines */ +#define SY_FUN 3 /* C Functions */ +#define SY_VAR 4 /* C Variables */ +#define SY_STR 5 /* C Structs */ +#define SY_UNI 6 /* C Unions */ +#define SY_TYP 7 /* C Typedefs */ +#define SY_ENU 8 /* C Enums */ + +typedef struct nd_st { /* sorting structure */ + struct nd_st *left, + *right; /* left and right sons */ + char *entry, /* function or type name */ + *file, /* file name */ + *pat; /* search pattern */ + int symbtype; /* Type of symbol */ + int lno; /* for -x option */ + bool been_warned; /* set if noticed dup */ +} NODE; + +extern FILE *inf; /* ioptr for current input file */ +extern long lineftell; /* ftell after getc( inf ) == '\n' */ +extern int lineno, /* line number of current line */ + xflag; /* -x: cxref style output */ +extern bool _wht[0177],_etk[0177],_itk[0177],_btk[0177],_gd[0177]; +extern char lbuf[BUFSIZ]; diff --git a/doc/tools/src2html1.4a/Ctags/fortran.c b/doc/tools/src2html1.4a/Ctags/fortran.c new file mode 100644 index 0000000000..025a204b6b --- /dev/null +++ b/doc/tools/src2html1.4a/Ctags/fortran.c @@ -0,0 +1,155 @@ +/* + * Copyright (c) 1987 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)fortran.c 5.5 (Berkeley) 2/26/91"; +#endif /* not lint */ + +#include <stdio.h> +#include <string.h> +#include "ctags.h" + +static void takeprec(); + +char *lbp; /* line buffer pointer */ + +PF_funcs() +{ + register bool pfcnt; /* pascal/fortran functions found */ + register char *cp; + char tok[MAXTOKEN], + *gettoken(); + + for (pfcnt = NO;;) { + lineftell = ftell(inf); + if (!fgets(lbuf,sizeof(lbuf),inf)) + return(pfcnt); + ++lineno; + lbp = lbuf; + if (*lbp == '%') /* Ratfor escape to fortran */ + ++lbp; + for (;isspace(*lbp);++lbp); + if (!*lbp) + continue; + switch (*lbp | ' ') { /* convert to lower-case */ + case 'c': + if (cicmp("complex") || cicmp("character")) + takeprec(); + break; + case 'd': + if (cicmp("double")) { + for (;isspace(*lbp);++lbp); + if (!*lbp) + continue; + if (cicmp("precision")) + break; + continue; + } + break; + case 'i': + if (cicmp("integer")) + takeprec(); + break; + case 'l': + if (cicmp("logical")) + takeprec(); + break; + case 'r': + if (cicmp("real")) + takeprec(); + break; + } + for (;isspace(*lbp);++lbp); + if (!*lbp) + continue; + switch (*lbp | ' ') { + case 'f': + if (cicmp("function")) + break; + continue; + case 'p': + if (cicmp("program") || cicmp("procedure")) + break; + continue; + case 's': + if (cicmp("subroutine")) + break; + default: + continue; + } + for (;isspace(*lbp);++lbp); + if (!*lbp) + continue; + for (cp = lbp + 1;*cp && intoken(*cp);++cp); + if (cp = lbp + 1) + continue; + *cp = EOS; + (void)strcpy(tok,lbp); + getline(); /* process line for ex(1) */ + pfnote(tok,lineno); + pfcnt = YES; + } + /*NOTREACHED*/ +} + +/* + * cicmp -- + * do case-independent strcmp + */ +cicmp(cp) + register char *cp; +{ + register int len; + register char *bp; + + for (len = 0,bp = lbp;*cp && (*cp &~ ' ') == (*bp++ &~ ' '); + ++cp,++len); + if (!*cp) { + lbp += len; + return(YES); + } + return(NO); +} + +static void +takeprec() +{ + for (;isspace(*lbp);++lbp); + if (*lbp == '*') { + for (++lbp;isspace(*lbp);++lbp); + if (!isdigit(*lbp)) + --lbp; /* force failure */ + else + while (isdigit(*++lbp)); + } +} diff --git a/doc/tools/src2html1.4a/Ctags/lisp.c b/doc/tools/src2html1.4a/Ctags/lisp.c new file mode 100644 index 0000000000..652313d4fe --- /dev/null +++ b/doc/tools/src2html1.4a/Ctags/lisp.c @@ -0,0 +1,97 @@ +/* + * Copyright (c) 1987 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)lisp.c 5.5 (Berkeley) 2/26/91"; +#endif /* not lint */ + +#include <stdio.h> +#include <string.h> +#include "ctags.h" + +extern char *lbp; /* pointer shared with fortran */ + +/* + * lisp tag functions + * just look for (def or (DEF + */ +l_entries() +{ + register int special; + register char *cp, + savedc; + char tok[MAXTOKEN]; + + for (;;) { + lineftell = ftell(inf); + if (!fgets(lbuf,sizeof(lbuf),inf)) + return; + ++lineno; + lbp = lbuf; + if (!cicmp("(def")) + continue; + special = NO; + switch(*lbp | ' ') { + case 'm': + if (cicmp("method")) + special = YES; + break; + case 'w': + if (cicmp("wrapper") || cicmp("whopper")) + special = YES; + } + for (;!isspace(*lbp);++lbp); + for (;isspace(*lbp);++lbp); + for (cp = lbp;*cp && *cp != '\n';++cp); + *cp = EOS; + if (special) { + if (!(cp = index(lbp,')'))) + continue; + for (;cp >= lbp && *cp != ':';--cp); + if (cp < lbp) + continue; + lbp = cp; + for (;*cp && *cp != ')' && *cp != ' ';++cp); + } + else + for (cp = lbp + 1; + *cp && *cp != '(' && *cp != ' ';++cp); + savedc = *cp; + *cp = EOS; + (void)strcpy(tok,lbp); + *cp = savedc; + getline(); + pfnote(tok,lineno); + } + /*NOTREACHED*/ +} diff --git a/doc/tools/src2html1.4a/Ctags/print.c b/doc/tools/src2html1.4a/Ctags/print.c new file mode 100644 index 0000000000..1c1c545ab6 --- /dev/null +++ b/doc/tools/src2html1.4a/Ctags/print.c @@ -0,0 +1,130 @@ +/* + * Copyright (c) 1987 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)print.c 5.4 (Berkeley) 2/26/91"; +#endif /* not lint */ + +#include <unistd.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "ctags.h" + +extern char searchar; /* ex search character */ + +/* + * getline -- + * get the line the token of interest occurred on, + * prepare it for printing. + */ +getline() +{ + register long saveftell; + register int c, + cnt; + register char *cp; + + saveftell = ftell(inf); + (void)fseek(inf,lineftell,SEEK_SET); + if (xflag) + for (cp = lbuf;GETC(!=,'\n');*cp++ = c); + /* + * do all processing here, so we don't step through the + * line more than once; means you don't call this routine + * unless you're sure you've got a keeper. + */ + else for (cnt = 0,cp = lbuf;GETC(!=,EOF) && cnt < ENDLINE;++cnt) { + if (c == (int)'\\') { /* backslashes */ + if (cnt > ENDLINE - 2) + break; + *cp++ = '\\'; *cp++ = '\\'; + ++cnt; + } + else if (c == (int)searchar) { /* search character */ + if (cnt > ENDLINE - 2) + break; + *cp++ = '\\'; *cp++ = c; + ++cnt; + } + else if (c == (int)'\n') { /* end of keep */ + *cp++ = '$'; /* can find whole line */ + break; + } + else + *cp++ = c; + } + *cp = EOS; + (void)fseek(inf,saveftell,SEEK_SET); +} + +char *symtype[]= { + "Unknown", + "Preprocessor macro", + "Preprocessor define", + "C function", + "C variable", + "C struct", + "C union", + "C typedef", + "C enum" +}; + +/* + * put_entries -- + * write out the tags + */ +put_entries(node) + register NODE *node; +{ + extern FILE *outf; /* ioptr for tags file */ + extern int vflag; /* -v: vgrind style output */ + extern int yflag; /* -y: yet another style output */ + + if (node->left) + put_entries(node->left); + if (vflag) + printf("%s %s %d\n", + node->entry,node->file,(node->lno + 63) / 64); + else if (xflag) + printf("%-16s %4d %-16s %s\n", + node->entry,node->lno,node->file,node->pat); + else if (yflag) + printf("%-16s %4d %-16s %s\n", + node->entry,node->lno,node->file,symtype[node->symbtype]); + else + fprintf(outf,"%s\t%s\t%c^%s%c\n", + node->entry,node->file,searchar,node->pat,searchar); + if (node->right) + put_entries(node->right); +} diff --git a/doc/tools/src2html1.4a/Ctags/strerror.c b/doc/tools/src2html1.4a/Ctags/strerror.c new file mode 100644 index 0000000000..7a82b869bf --- /dev/null +++ b/doc/tools/src2html1.4a/Ctags/strerror.c @@ -0,0 +1,6 @@ +char *strerror(i) + int i; + { + extern char *sys_errlist[]; + return sys_errlist[i]; + } diff --git a/doc/tools/src2html1.4a/Ctags/tree.c b/doc/tools/src2html1.4a/Ctags/tree.c new file mode 100644 index 0000000000..e82c72c404 --- /dev/null +++ b/doc/tools/src2html1.4a/Ctags/tree.c @@ -0,0 +1,138 @@ +/* + * Copyright (c) 1987 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)tree.c 5.5 (Berkeley) 2/26/91"; +#endif /* not lint */ + +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "ctags.h" + +/* + * pfnote -- + * enter a new node in the tree + */ +pfnote(name,ln,type) + char *name; + int ln; + int type; +{ + extern NODE *head; /* head of the sorted binary tree */ + extern char *curfile; /* current input file name */ + register NODE *np; + register char *fp; + char nbuf[MAXTOKEN]; + + /*NOSTRICT*/ + if (!(np = (NODE *)malloc(sizeof(NODE)))) { + fputs("ctags: too many entries to sort\n",stderr); + put_entries(head); + free_tree(head); + /*NOSTRICT*/ + if (!(head = np = (NODE *)malloc(sizeof(NODE)))) { + fputs("ctags: out of space.\n",stderr); + exit(1); + } + } + if (!xflag && !strcmp(name,"main")) { + if (!(fp = rindex(curfile,'/'))) + fp = curfile; + else + ++fp; + (void)sprintf(nbuf,"M%s",fp); + fp = rindex(nbuf,'.'); + if (fp && !fp[2]) + *fp = EOS; + name = nbuf; + } + if (!(np->entry = strdup(name))) { + (void)fprintf(stderr, "ctags: %s\n", strerror(errno)); + exit(1); + } + np->file = curfile; + np->lno = ln; np->symbtype= type; + np->left = np->right = 0; + if (!(np->pat = strdup(lbuf))) { + (void)fprintf(stderr, "ctags: %s\n", strerror(errno)); + exit(1); + } + if (!head) + head = np; + else + add_node(np,head); +} + +add_node(node,cur_node) + register NODE *node, + *cur_node; +{ + extern int wflag; /* -w: suppress warnings */ + register int dif; + + dif = strcmp(node->entry,cur_node->entry); + if (!dif) { + if (node->file == cur_node->file) { + if (!wflag) + fprintf(stderr,"Duplicate entry in file %s, line %d: %s\nSecond entry ignored\n",node->file,lineno,node->entry); + return; + } + if (!cur_node->been_warned) + if (!wflag) + fprintf(stderr,"Duplicate entry in files %s and %s: %s (Warning only)\n",node->file,cur_node->file,node->entry); + cur_node->been_warned = YES; + } + else if (dif < 0) + if (cur_node->left) + add_node(node,cur_node->left); + else + cur_node->left = node; + else if (cur_node->right) + add_node(node,cur_node->right); + else + cur_node->right = node; +} + +free_tree(node) + register NODE *node; +{ + NODE *nl; + while (node) { + if (node->right) + free_tree(node->right); + nl= node->left; free(node); + node = nl; + } +} diff --git a/doc/tools/src2html1.4a/Ctags/yacc.c b/doc/tools/src2html1.4a/Ctags/yacc.c new file mode 100644 index 0000000000..f073f2bb7c --- /dev/null +++ b/doc/tools/src2html1.4a/Ctags/yacc.c @@ -0,0 +1,144 @@ +/* + * Copyright (c) 1987 The Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)yacc.c 5.6 (Berkeley) 2/26/91"; +#endif /* not lint */ + +#include <stdio.h> +#include <string.h> +#include "ctags.h" + +/* + * y_entries: + * find the yacc tags and put them in. + */ +y_entries() +{ + register int c; + register char *sp; + register bool in_rule; + char tok[MAXTOKEN]; + + while (GETC(!=,EOF)) + switch ((char)c) { + case '\n': + SETLINE; + /* FALLTHROUGH */ + case ' ': + case '\f': + case '\r': + case '\t': + break; + case '{': + if (skip_key((int)'}')) + in_rule = NO; + break; + case '\'': + case '"': + if (skip_key(c)) + in_rule = NO; + break; + case '%': + if (GETC(==,'%')) + return; + (void)ungetc(c,inf); + break; + case '/': + if (GETC(==,'*')) + skip_comment(); + else + (void)ungetc(c,inf); + break; + case '|': + case ';': + in_rule = NO; + break; + default: + if (in_rule || !isalpha(c) && c != (int)'.' + && c != (int)'_') + break; + sp = tok; + *sp++ = c; + while (GETC(!=,EOF) && (intoken(c) || c == (int)'.')) + *sp++ = c; + *sp = EOS; + getline(); /* may change before ':' */ + while (iswhite(c)) { + if (c == (int)'\n') + SETLINE; + if (GETC(==,EOF)) + return; + } + if (c == (int)':') { + pfnote(tok,lineno); + in_rule = YES; + } + else + (void)ungetc(c,inf); + } +} + +/* + * toss_yysec -- + * throw away lines up to the next "\n%%\n" + */ +toss_yysec() +{ + register int c, /* read character */ + state; + + /* + * state == 0 : waiting + * state == 1 : received a newline + * state == 2 : received first % + * state == 3 : recieved second % + */ + lineftell = ftell(inf); + for (state = 0;GETC(!=,EOF);) + switch ((char)c) { + case '\n': + ++lineno; + lineftell = ftell(inf); + if (state == 3) /* done! */ + return; + state = 1; /* start over */ + break; + case '%': + if (state) /* if 1 or 2 */ + ++state; /* goto 3 */ + break; + default: + state = 0; /* reset */ + } +} diff --git a/doc/tools/src2html1.4a/Ctags/z.c b/doc/tools/src2html1.4a/Ctags/z.c new file mode 100644 index 0000000000..4c90e6ec95 --- /dev/null +++ b/doc/tools/src2html1.4a/Ctags/z.c @@ -0,0 +1,20 @@ +#define fred 23 +#define jim(a) (a+2) + +int helo; + +struct thing { + int v; +} doris; + +union what { + int v; + char q; +} mary; + +enum thinddd { 1,2,3,4,5 } zoo; + +typedef unsigned int uinty; + +int rain() + { printf("Hello world\n"); } |