page@swan.ulowell.edu (Bob Page) (03/16/89)
Submitted-by: grwalter@watcgl.waterloo.edu (Fred Walter) Posting-number: Volume 89, Issue 61 Archive-name: unix/ctags.1 # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # README # ORIGINAL_POSTER # Makefile # ctags.1 # ctags.c # ctags.uu # tags # This archive created: Wed Mar 15 14:47:08 1989 cat << \SHAR_EOF > README /* * The original of this version came over usenet (mod.sources Nov85). * I also applied the bug fix mentioned in comp.bugs.4bsd Mar88. * * This was compiled with Lattice C 5.0 * * G. R. Walter (Fred) February 29, 1989 */ SHAR_EOF cat << \SHAR_EOF > ORIGINAL_POSTER Relay-Version: version B 2.10.2 9/18/84; site watmath.UUCP Posting-Version: version B 2.10.2 9/3/84; site panda.UUCP Path: watmath!clyde!burl!ulysses!allegra!mit-eddie!genrad!panda!sources-request From: sources-request@panda.UUCP Newsgroups: mod.sources Subject: ctags source Message-ID: <1145@panda.UUCP> Date: 30 Nov 85 18:21:54 GMT Date-Received: 1 Dec 85 04:02:09 GMT Sender: jpn@panda.UUCP Lines: 1184 Approved: jpn@panda.UUCP Mod.sources: Volume 3, Issue 53 Submitted by: ucbvax!ucsf-cgl.ARPA!arnold (Ken Arnold) #!/bin/sh # # I have received enough requests for the current source to ctags to # post it. Here is the latest version (what will go out with 4.3, # modulo any bugs fixed during the beta period). It is the 4.2 ctags # with recognition of yacc and lex tags added. Files ending in .y are # presumed to be yacc files, .l files are either lisp or lex files, # depending upon the first non-blank character (yeah, it's a hack, but # it works). Man page is included. Note that I wrote the original # ctags (recognized only C), and added the YACC and lex after others # wrote the recognizers for FORTRAN, PASCAL, and lisp, so this code is # rather a mix of styles, for which I take no responsibility. So, here # come those famous words: SHAR_EOF cat << \SHAR_EOF > Makefile # # Makefile for Lattice C 5.0 on Amiga # .c.o: lc $(CFLAGS) $< CFLAGS = -cw -O LINKFLAGS = NODEBUG LIBS = lib:lc.lib all: ctags say "done all" ctags: ctags.o BLINK TO ctags FROM lib:cres.o ctags.o LIBRARY $(LIBS) $(LINKFLAGS) clean: delete ctags.o ctags SHAR_EOF cat << \SHAR_EOF > ctags.1 .TH CTAGS 1 "25 August 1982" .UC 4 .SH NAME ctags \- create a tags file .SH SYNOPSIS .B ctags [ .B \-BFatuwvx ] name ... .SH DESCRIPTION .I Ctags makes a tags file for .IR ex (1) from the specified C, Pascal, Fortran, YACC, lex, and lisp sources. A tags file gives the locations of specified objects (in this case functions and typedefs) in a group of files. Each line of the tags file contains the object name, the file in which it is defined, and an address specification for the object definition. Functions are searched with a pattern, typedefs with a line number. Specifiers are given in separate fields on the line, separated by blanks or tabs. Using the .I tags file, .I ex can quickly find these objects definitions. .PP If the .B \-x flag is given, .I ctags 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. .PP If the .B \-v flag is given, an index of the form expected by .IR vgrind (1) is produced on the standard output. This listing contains the function 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 .BR "sort \-f" . Sample use: .nf ctags \-v files | sort \-f > index vgrind \-x index .fi .PP Files whose names end in .B \.c or .B \.h are assumed to be C source files and are searched for C routine and macro definitions. Files whose names end in .B \.y are assumed to be YACC source files. Files whose names end in .B \.l are assumed to be either lisp files if their first non-blank character is `;', `(', or `[', or lex files otherwise. Other files are first examined to see if they contain any Pascal or Fortran routine definitions; if not, they are processed again looking for C definitions. .PP Other options are: .TP 5 .B \-F use forward searching patterns (/.../) (default). .TP 5 .B \-B use backward searching patterns (?...?). .TP 5 .B \-a append to tags file. .TP 5 .B \-t create tags for typedefs. .TP 5 .B \-w suppressing warning diagnostics. .TP 5 .B \-u causing the specified files to be .I updated in tags, 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 .I tags file.) .PP The tag .I main is treated specially in C programs. The tag formed is created by prepending .I M to the name of the file, with a trailing .c removed, if any, and leading pathname components also removed. This makes use of .I ctags practical in directories with more than one program. .SH FILES .DT tags output tags file .SH SEE ALSO ex(1), vi(1) .SH AUTHOR Ken Arnold; FORTRAN added by Jim Kleckner; Bill Joy added Pascal and .B \-x, replacing .I cxref; C typedefs added by Ed Pelegri-Llopart. .SH BUGS Recognition of \fBfunctions\fR, \fBsubroutines\fR and \fBprocedures\fR for 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. .PP The method of deciding whether to look for C or Pascal and FORTRAN functions is a hack. .PP Does not know about #ifdefs. .PP Should know about Pascal types. Relies on the input being well formed to detect typedefs. Use of -tx shows only the last line of typedefs. SHAR_EOF cat << \SHAR_EOF > ctags.c /* $Header */ static char *sccsid = "@(#)ctags.c 4.7 (Berkeley) 8/18/83"; #include <stdio.h> #include <ctype.h> /* * ctags: create a tags file */ #define reg register #define bool char #define TRUE (1) #define FALSE (0) #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 ')' */ /* * The following ifndefs were necessary to get this to compile on an Amiga. * The original of this version came over usenet (mod.sources Nov85). * I also applied the bug fix mentioned in comp.bugs.4bsd Mar88. * * Compile with Amiga Lattice C using : lc -cw -L ctags * * G. R. Walter (Fred) December 30, 1988 */ #ifndef AMIGA # define max(I1,I2) (I1 > I2 ? I1 : I2) #endif #ifdef AMIGA # define entry EnTrY # define index(S, C) strchr(S, C) # define cfree(C) free(C) #endif struct nd_st { /* sorting structure */ char *entry; /* function or type name */ char *file; /* file name */ bool f; /* use pattern or line no */ int lno; /* for -x option */ char *pat; /* search pattern */ bool been_warned; /* set if noticed dup */ struct nd_st *left,*right; /* left and right sons */ }; long ftell(); typedef struct nd_st NODE; bool number, /* T if on line starting with # */ term = FALSE, /* T if print on terminal */ makefile= TRUE, /* T if to creat "tags" file */ gotone, /* found a func already on line */ /* boolean "func" (see init) */ _wht[0177],_etk[0177],_itk[0177],_btk[0177],_gd[0177]; /* typedefs are recognized using a simple finite automata, * tydef is its state variable. */ typedef enum {none, begin, middle, end } TYST; TYST tydef = none; char searchar = '/'; /* use /.../ searches */ int lineno; /* line number of current line */ char line[4*BUFSIZ], /* current input line */ *curfile, /* current input file name */ *outfile= "tags", /* output file */ *white = " \f\t\n", /* white chars */ *endtk = " \t\n\"'#()[]{}=-+%*/&|^~!<>;,.:?", /* token ending chars */ *begtk = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz", /* token starting chars */ *intk = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz0123456789", /* valid in-token chars */ *notgd = ",;"; /* non-valid after-function chars */ int file_num; /* current file number */ int aflag; /* -a: append to tags */ int tflag; /* -t: create tags for typedefs */ int uflag; /* -u: update tags */ int wflag; /* -w: suppress warnings */ int vflag; /* -v: create vgrind style index output */ int xflag; /* -x: create cxref style output */ char lbuf[BUFSIZ]; FILE *inf, /* ioptr for current input file */ *outf; /* ioptr for tags file */ long lineftell; /* ftell after getc( inf ) == '\n' */ NODE *head; /* the head of the sorted binary tree */ char *savestr(); #ifdef AMIGA char *rindex(), *strchr(); #else char *rindex(), *index(); #endif char *toss_comment(); main(ac,av) int ac; char *av[]; { char cmd[100]; int i; while (ac > 1 && av[1][0] == '-') { for (i=1; av[1][i]; i++) { switch(av[1][i]) { case 'B': searchar='?'; break; case 'F': searchar='/'; break; case 'a': aflag++; break; case 't': tflag++; break; case 'u': uflag++; break; case 'w': wflag++; break; case 'v': vflag++; xflag++; break; case 'x': xflag++; break; default: goto usage; } } ac--; av++; } if (ac <= 1) { usage: printf("Usage: ctags [-BFatuwvx] file ...\n"); exit(1); } init(); /* set up boolean "functions" */ /* * loop through files finding functions */ for (file_num = 1; file_num < ac; file_num++) find_entries(av[file_num]); if (xflag) { put_entries(head); exit(0); } if (uflag) { for (i=1; i<ac; i++) { sprintf(cmd, "mv %s OTAGS;fgrep -v '\t%s\t' OTAGS >%s;rm OTAGS", outfile, av[i], outfile); system(cmd); } aflag++; } outf = fopen(outfile, aflag ? "a" : "w"); if (outf == NULL) { perror(outfile); exit(1); } put_entries(head); fclose(outf); if (uflag) { sprintf(cmd, "sort %s -o %s", outfile, outfile); system(cmd); } exit(0); } /* * This routine sets up the boolean psuedo-functions which work * by seting boolean flags dependent upon the corresponding character * Every char which is NOT in that string is not a white char. Therefore, * all of the array "_wht" is set to FALSE, and then the elements * subscripted by the chars in "white" are set to TRUE. Thus "_wht" * of a char is TRUE if it is the string "white", else FALSE. */ init() { reg char *sp; reg int i; for (i = 0; i < 0177; i++) { _wht[i] = _etk[i] = _itk[i] = _btk[i] = FALSE; _gd[i] = TRUE; } for (sp = white; *sp; sp++) _wht[*sp] = TRUE; for (sp = endtk; *sp; sp++) _etk[*sp] = TRUE; for (sp = intk; *sp; sp++) _itk[*sp] = TRUE; for (sp = begtk; *sp; sp++) _btk[*sp] = TRUE; for (sp = notgd; *sp; sp++) _gd[*sp] = FALSE; } /* * This routine opens the specified file and calls the function * which finds the function and type definitions. */ find_entries(file) char *file; { char *cp; if ((inf = fopen(file,"r")) == NULL) { perror(file); return; } curfile = savestr(file); lineno = 0; cp = rindex(file, '.'); /* .l implies lisp or lex source code */ if (cp && cp[1] == 'l' && cp[2] == '\0') { if (index(";([", first_char()) != NULL) { /* lisp */ L_funcs(inf); fclose(inf); return; } else { /* lex */ /* * throw away all the code before the second "%%" */ toss_yysec(); getline(); pfnote("yylex", lineno, TRUE); toss_yysec(); C_entries(); fclose(inf); return; } } /* .y implies a yacc file */ if (cp && cp[1] == 'y' && cp[2] == '\0') { toss_yysec(); Y_entries(); C_entries(); fclose(inf); return; } /* if not a .c or .h file, try fortran */ if (cp && (cp[1] != 'c' && cp[1] != 'h') && cp[2] == '\0') { if (PF_funcs(inf) != 0) { fclose(inf); return; } rewind(inf); /* no fortran tags found, try C */ } C_entries(); fclose(inf); } pfnote(name, ln, f) char *name; int ln; bool f; /* f == TRUE when function */ { register char *fp; register NODE *np; char nbuf[BUFSIZ]; if ((np = (NODE *) malloc(sizeof (NODE))) == NULL) { fprintf(stderr, "ctags: too many entries to sort\n"); put_entries(head); free_tree(head); head = np = (NODE *) malloc(sizeof (NODE)); } if (xflag == 0 && !strcmp(name, "main")) { fp = rindex(curfile, '/'); if (fp == 0) fp = curfile; else fp++; sprintf(nbuf, "M%s", fp); fp = rindex(nbuf, '.'); if (fp && fp[2] == 0) *fp = 0; name = nbuf; } np->entry = savestr(name); np->file = curfile; np->f = f; np->lno = ln; np->left = np->right = 0; if (xflag == 0) { lbuf[50] = 0; strcat(lbuf, "$"); lbuf[50] = 0; } np->pat = savestr(lbuf); if (head == NULL) head = np; else add_node(np, head); } /* * This routine finds functions and typedefs in C syntax and adds them * to the list. */ C_entries() { register int c; register char *token, *tp; bool incomm, inquote, inchar, midtoken; int level; char *sp; char tok[BUFSIZ]; number = gotone = midtoken = inquote = inchar = incomm = FALSE; level = 0; sp = tp = token = line; lineno++; lineftell = ftell(inf); for (;;) { *sp = c = getc(inf); if (feof(inf)) break; if (c == '\n') lineno++; else if (c == '\\') { c = *++sp = getc(inf); if (c == '\n') c = ' '; } else if (incomm) { if (c == '*') { while ((*++sp=c=getc(inf)) == '*') continue; if (c == '\n') lineno++; if (c == '/') incomm = FALSE; } } else if (inquote) { /* * Too dumb to know about \" not being magic, but * they usually occur in pairs anyway. */ if (c == '"') inquote = FALSE; continue; } else if (inchar) { if (c == '\'') inchar = FALSE; continue; } else switch (c) { case '"': inquote = TRUE; continue; case '\'': inchar = TRUE; continue; case '/': if ((*++sp=c=getc(inf)) == '*') incomm = TRUE; else ungetc(*sp, inf); continue; case '#': if (sp == line) number = TRUE; continue; case '{': if (tydef == begin) { tydef=middle; } level++; continue; case '}': if (sp == line) level = 0; /* reset */ else level--; if (!level && tydef==middle) { tydef=end; } continue; } if (!level && !inquote && !incomm && gotone == FALSE) { if (midtoken) { if (endtoken(c)) { int f; int pfline = lineno; if (start_entry(&sp,token,tp,&f)) { strncpy(tok,token,tp-token+1); tok[tp-token+1] = 0; getline(); pfnote(tok, pfline, f); gotone = f; /* function */ } midtoken = FALSE; token = sp; } else if (intoken(c)) tp++; } else if (begtoken(c)) { token = tp = sp; midtoken = TRUE; } } if (c == ';' && tydef==end) /* clean with typedefs */ tydef=none; sp++; if (c == '\n' || sp > &line[sizeof (line) - BUFSIZ]) { tp = token = sp = line; lineftell = ftell(inf); number = gotone = midtoken = inquote = inchar = FALSE; } } } /* * This routine checks to see if the current token is * at the start of a function, or corresponds to a typedef * It updates the input line * so that the '(' will be * in it when it returns. */ start_entry(lp,token,tp,f) char **lp,*token,*tp; int *f; { reg char c,*sp; static bool found; bool firsttok; /* T if have seen first token in ()'s */ int bad; *f = 1; /* a function */ sp = *lp; c = *sp; bad = FALSE; if (!number) { /* space is not allowed in macro defs */ while (iswhite(c)) { *++sp = c = getc(inf); if (c == '\n') { lineno++; if (sp > &line[sizeof (line) - BUFSIZ]) goto ret; } } /* the following tries to make it so that a #define a b(c) */ /* doesn't count as a define of b. */ } else { if (!strncmp(token, "define", 6)) found = 0; else found++; if (found >= 2) { gotone = TRUE; badone: bad = TRUE; goto ret; } } /* check for the typedef cases */ if (tflag && !strncmp(token, "typedef", 7)) { tydef=begin; goto badone; } if (tydef==begin && (!strncmp(token, "struct", 6) || !strncmp(token, "union", 5) || !strncmp(token, "enum", 4))) { goto badone; } if (tydef==begin) { tydef=end; goto badone; } if (tydef==end) { *f = 0; goto ret; } if (c != '(') goto badone; firsttok = FALSE; while ((*++sp=c=getc(inf)) != ')') { if (c == '\n') { lineno++; if (sp > &line[sizeof (line) - BUFSIZ]) goto ret; } /* * This line used to confuse ctags: * int (*oldhup)(); * This fixes it. A nonwhite char before the first * token, other than a / (in case of a comment in there) * makes this not a declaration. */ if (begtoken(c) || c=='/') firsttok++; else if (!iswhite(c) && !firsttok) goto badone; } while (iswhite(*++sp=c=getc(inf))) if (c == '\n') { lineno++; if (sp > &line[sizeof (line) - BUFSIZ]) break; } ret: *lp = --sp; if (c == '\n') lineno--; ungetc(c,inf); return !bad && (!*f || isgood(c)); /* hack for typedefs */ } /* * Y_entries: * Find the yacc tags and put them in. */ Y_entries() { register char *sp, *orig_sp; register int brace; register bool in_rule, toklen; char tok[BUFSIZ]; brace = 0; getline(); pfnote("yyparse", lineno, TRUE); while (fgets(line, sizeof line, inf) != NULL) for (sp = line; *sp; sp++) switch (*sp) { case '\n': lineno++; /* FALLTHROUGH */ case ' ': case '\t': case '\f': case '\r': break; case '"': do { while (*++sp != '"') continue; } while (sp[-1] == '\\'); break; case '\'': do { while (*++sp != '\'') continue; } while (sp[-1] == '\\'); break; case '/': if (*++sp == '*') sp = toss_comment(sp); else --sp; break; case '{': brace++; break; case '}': brace--; break; case '%': if (sp[1] == '%' && sp == line) return; break; case '|': case ';': in_rule = FALSE; break; default: if (brace == 0 && !in_rule && (isalpha(*sp) || *sp == '.' || *sp == '_')) { orig_sp = sp; ++sp; while (isalnum(*sp) || *sp == '_' || *sp == '.') sp++; toklen = sp - orig_sp; while (isspace(*sp)) sp++; if (*sp == ':' || (*sp == '\0' && first_char() == ':')) { strncpy(tok, orig_sp, toklen); tok[toklen] = '\0'; strcpy(lbuf, line); lbuf[strlen(lbuf) - 1] = '\0'; pfnote(tok, lineno, TRUE); in_rule = TRUE; } else sp--; } break; } } char * toss_comment(start) char *start; { register char *sp; /* * first, see if the end-of-comment is on the same line */ do { while ((sp = index(start, '*')) != NULL) if (sp[1] == '/') return ++sp; else start = ++sp; start = line; lineno++; } while (fgets(line, sizeof line, inf) != NULL); } getline() { long saveftell = ftell( inf ); register char *cp; fseek( inf , lineftell , 0 ); fgets(lbuf, sizeof lbuf, inf); cp = rindex(lbuf, '\n'); if (cp) *cp = 0; fseek(inf, saveftell, 0); } free_tree(node) NODE *node; { while (node) { free_tree(node->right); cfree(node); node = node->left; } } add_node(node, cur_node) NODE *node,*cur_node; { register int dif; dif = strcmp(node->entry, cur_node->entry); if (dif == 0) { if (node->file == cur_node->file) { if (!wflag) { fprintf(stderr,"Duplicate entry in file %s, line %d: %s\n", node->file,lineno,node->entry); fprintf(stderr,"Second entry ignored\n"); } 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 = TRUE; return; } if (dif < 0) { if (cur_node->left != NULL) add_node(node,cur_node->left); else cur_node->left = node; return; } if (cur_node->right != NULL) add_node(node,cur_node->right); else cur_node->right = node; } put_entries(node) reg NODE *node; { reg char *sp; if (node == NULL) return; put_entries(node->left); if (xflag == 0) if (node->f) { /* a function */ fprintf(outf, "%s\t%s\t%c^", node->entry, node->file, searchar); for (sp = node->pat; *sp; sp++) if (*sp == '\\') fprintf(outf, "\\\\"); else if (*sp == searchar) fprintf(outf, "\\%c", searchar); else putc(*sp, outf); fprintf(outf, "%c\n", searchar); } else { /* a typedef; text pattern inadequate */ fprintf(outf, "%s\t%s\t%d\n", node->entry, node->file, node->lno); } else if (vflag) fprintf(stdout, "%s %s %d\n", node->entry, node->file, (node->lno+63)/64); else fprintf(stdout, "%-16s%4d %-16s %s\n", node->entry, node->lno, node->file, node->pat); put_entries(node->right); } char *dbp = lbuf; int pfcnt; PF_funcs(fi) FILE *fi; { pfcnt = 0; while (fgets(lbuf, sizeof(lbuf), fi)) { lineno++; dbp = lbuf; if ( *dbp == '%' ) dbp++ ; /* Ratfor escape to fortran */ while (isspace(*dbp)) dbp++; if (*dbp == 0) continue; switch (*dbp |' ') { case 'i': if (tail("integer")) takeprec(); break; case 'r': if (tail("real")) takeprec(); break; case 'l': if (tail("logical")) takeprec(); break; case 'c': if (tail("complex") || tail("character")) takeprec(); break; case 'd': if (tail("double")) { while (isspace(*dbp)) dbp++; if (*dbp == 0) continue; if (tail("precision")) break; continue; } break; } while (isspace(*dbp)) dbp++; if (*dbp == 0) continue; switch (*dbp|' ') { case 'f': if (tail("function")) getit(); continue; case 's': if (tail("subroutine")) getit(); continue; case 'p': if (tail("program")) { getit(); continue; } if (tail("procedure")) getit(); continue; } } return (pfcnt); } tail(cp) char *cp; { register int len = 0; while (*cp && (*cp&~' ') == ((*(dbp+len))&~' ')) cp++, len++; if (*cp == 0) { dbp += len; return (1); } return (0); } takeprec() { while (isspace(*dbp)) dbp++; if (*dbp != '*') return; dbp++; while (isspace(*dbp)) dbp++; if (!isdigit(*dbp)) { --dbp; /* force failure */ return; } do dbp++; while (isdigit(*dbp)); } getit() { register char *cp; char c; char nambuf[BUFSIZ]; for (cp = lbuf; *cp; cp++) ; *--cp = 0; /* zap newline */ while (isspace(*dbp)) dbp++; if (*dbp == 0 || !isalpha(*dbp)) return; for (cp = dbp+1; *cp && (isalpha(*cp) || isdigit(*cp)); cp++) continue; c = cp[0]; cp[0] = 0; strcpy(nambuf, dbp); cp[0] = c; pfnote(nambuf, lineno, TRUE); pfcnt++; } char * savestr(cp) char *cp; { register int len; register char *dp; len = strlen(cp); dp = (char *)malloc(len+1); strcpy(dp, cp); return (dp); } /* * Return the ptr in sp at which the character c last * appears; NULL if not found * * Identical to v7 rindex, included for portability. */ char * rindex(sp, c) register char *sp, c; { register char *r; r = NULL; do { if (*sp == c) r = sp; } while (*sp++); return(r); } /* * lisp tag functions * just look for (def or (DEF */ L_funcs (fi) FILE *fi; { register int special; pfcnt = 0; while (fgets(lbuf, sizeof(lbuf), fi)) { lineno++; dbp = lbuf; if (dbp[0] == '(' && (dbp[1] == 'D' || dbp[1] == 'd') && (dbp[2] == 'E' || dbp[2] == 'e') && (dbp[3] == 'F' || dbp[3] == 'f')) { dbp += 4; if (striccmp(dbp, "method") == 0 || striccmp(dbp, "wrapper") == 0 || striccmp(dbp, "whopper") == 0) special = TRUE; else special = FALSE; while (!isspace(*dbp)) dbp++; while (isspace(*dbp)) dbp++; L_getit(special); } } } L_getit(special) int special; { register char *cp; register char c; char nambuf[BUFSIZ]; for (cp = lbuf; *cp; cp++) continue; *--cp = 0; /* zap newline */ if (*dbp == 0) return; if (special) { if ((cp = index(dbp, ')')) == NULL) return; while (cp >= dbp && *cp != ':') cp--; if (cp < dbp) return; dbp = cp; while (*cp && *cp != ')' && *cp != ' ') cp++; } else for (cp = dbp + 1; *cp && *cp != '(' && *cp != ' '; cp++) continue; c = cp[0]; cp[0] = 0; strcpy(nambuf, dbp); cp[0] = c; pfnote(nambuf, lineno,TRUE); pfcnt++; } /* * striccmp: * Compare two strings over the length of the second, ignoring * case distinctions. If they are the same, return 0. If they * are different, return the difference of the first two different * characters. It is assumed that the pattern (second string) is * completely lower case. */ striccmp(str, pat) register char *str, *pat; { register int c1; while (*pat) { if (isupper(*str)) c1 = tolower(*str); else c1 = *str; if (c1 != *pat) return c1 - *pat; pat++; str++; } return 0; } /* * first_char: * Return the first non-blank character in the file. After * finding it, rewind the input file so we start at the beginning * again. */ first_char() { register int c; register long off; off = ftell(inf); while ((c = getc(inf)) != EOF) if (!isspace(c) && c != '\r') { fseek(inf, off, 0); return c; } fseek(inf, off, 0); return EOF; } /* * toss_yysec: * Toss away code until the next "%%" line. */ toss_yysec() { char buf[BUFSIZ]; for (;;) { lineftell = ftell(inf); if (fgets(buf, BUFSIZ, inf) == NULL) return; lineno++; if (strncmp(buf, "%%", 2) == 0) return; } } SHAR_EOF cat << \SHAR_EOF > ctags.uu begin 644 ctags M```#\P`````````"``````````$```\\```!=@```^D```\\)$@D`$GY````$ M`"QX``1(Y\#@F?P`````(#P``!38(CP``0`!3J[_.DJ`9P`!LB!`)$`B0"`\/ M```!:2#<4X!F^B`<9PX@2='<U=`@BB1)4X!@\"A)V?P`````3-\'`RQX``0I+ M3@7<*4\%Y$*L!>`F;@$4<``B/```,`!.KO[.*6L`F`782JL`K&<``'`@#Y"O! M``0&@````(`I0`6H80`!2B!K`*S1R-'((F@`$-/)T\D@`G(`$ADI207LT(%2, M@$)G4H`"0/_^G\!5@$)W"``@`E.`U($?L@``(`!3@E'(__8?O``@(`!3@A^Q- M(``@`%'*__@B3R\)8```>"EK`#H%J'!_4H#1K`6H80``WD'K`%Q.KOZ`0>L`F M7$ZN_HPI0`7@+P`D0"`J`"1G$BQL%-0@0"(H```I00783J[_@B(J`"!G&B0\E M```#[4ZN_^(I0`7H9PKEB"!`)V@`"`"D(&P%X"\(2&P%I"!H`"0I:``$!>Q.A MNA?N3KH=DG``8`0@+P`$+P`@+`709P0@0$Z03KHN*BQX``0B;!343J[^8DZZX M%\1*K`7@9QHB+`7H9P1.KO_<+'@`!$ZN_WPB;`7@3J[^AB`\```4V"),D_P`+ M````+'@`!$ZN_RX@'RYL!>1.=4S?!P-.=7!D8)A#^@`0<`!.KOW8*4`4U&?L, M3G5D;W,N;&EB<F%R>0```$Y5_YB_[`6H90`CXDCG`Q`N+P!\)F\`@&```)Q\0 M`6```(8@:P`$T<80$$B`<C!=06L``)RP>Q`(9O1.^Q`$`'A@``!>`'9@``!.0 M`'=@``!"`'5@```V`'1@```J`&%@```>`$9@```0`$)@```"&7P`/P`N8"X9$ M?``O`"Y@)E*L$'I@(%*L$'Y@&E*L$()@%%*L$(9@#E*L$(I2K!".8`12K!".G M4H8@:P`$T<9*$&8`_W)3AUB+<`&^@&\,(&L`!'`ML!!G`/]6<`&^@&X22&P`A M[DZZ%O!(>``!3KHSH%!/80``\'`!*4`0=F`4("P0=N6`+S,(`&$``:Y83U*LR M$'8@+!!VL(=MY$JL$(YG$"\L$IYA``WX0I=.NC-B6$]*K!""9S)\`5B+8"0@> M;``V+P@O&R\(2&P!$DAM_YA.NBC42&W_F$ZZ(L)/[P`84H:\AVW84JP0>DJL= M$'IG!D'L`4)@!$'L`40O""\L`#9.NC"*4$\I0!*69A(O+``V3KHJ*DAX``%.K MNC+V4$\O+!*>80`-?"ZL$I9.NC*(6$]*K!""9R`@;``V+P@O"$AL`49(;?^8G M3KHH7DAM_YA.NB),3^\`%$*G3KHRMDSM",#_C$Y=3G5.5?_TO^P%J&4`(A!(" MYP$0<``K0/_T<'YR`$'L!W`0P5'(__QP?D'L!O$0P5'(__QP?D'L!G(0P5'(C M__QP?D'L!?,0P5'(__QP?G(!0>P'[Q#!4<C__"9L`$!@#A`;2(!![`7S$;P`! M`0``2A-F[B9L`&1@#A`;2(!![`9R$;P``0``2A-F[B9L`.)@#A`;2(!![`;QF M$;P``0``2A-F[B9L`)Y@#A`;2(!![`=P$;P``0``2A-F[B9L`.I@#!`;2(!!/ M[`?O0C```$H39O!,WPB`3EU.=;_L!:AE`"%`+PLF;P`(2&P!5"\+3KHO/%!/R M*4`2DF8,+PM.NBC>6$]@``$*+PMA`!$"*4`0<D*L"&Y(>``N+PMA`!$B3^\`0 M#"9`(`MG:'!LL"L``69@2BL``F9:80`3>"\`2&P!5DZZ)<!03TJ`9Q8O+!*29 M80`1'"ZL$I).NC#\6$]@``"P80`3VF$`"H9(>``!+RP(;DAL`5IA``"<80`3( MPF$``;HNK!*23KHPSD_O``Q@``"`(`MG)G!YL"L``68>2BL``F8880`3F&$`O M!]9A``&,+RP2DDZZ,*!83V!4(`MG0A`K``%R8[`!9SAR:+`!9S)**P`"9BPO. M+!*280`,P%A/2H!G#"\L$I).NC!L6$]@('``+P`O`"\L$I).NBQV3^\`#&$`- M`38O+!*23KHP2EA/)E].=4Y5_?R_[`6H90`@!$CG`#`F;P(42'@`'$ZZ*>A8[ M3R1`(`IF+DAL`6!(;`-43KHMK"ZL$IYA``KX+JP2GF$`"?Y(>``<3KHIO$_O8 M``PD0"E*$IY*K!".9EQ(;`&"+PM.NB0R4$]*@&9,2'@`+R\L$')A``^Z4$\F. M0$J`9@8F;!!R8`)2BR\+2&P!B$AM_?Q.NB6D2'@`+DAM_?QA``^03^\`%"9`3 M(`MG"$HK``)F`D(31^W]_"\+80`/0EA/)(`E;!!R``05;0`3``@E;0`,``J1? MR"5(`!@E2``42JP0CF860BP0Q$AL`8Q(;!"23KHCQ%!/0BP0Q$AL$))A``[^* M6$\E0``.2JP2GF8(($HI2!*>8`PO+!*>+PIA``E,4$],WPP`3EU.=4Y5_=R_> M[`6H90`>WDCG(S)P`!E`!?(90`7Q?@!'[`AR1>P(<D'L"'(K2/_H4JP(;B\LS M$I(;0/_L&T#_[AM`_^T;0/_O3KHJ=EA/*4`2FB!L$I)3J``(;1HB;!*2(&D`; M!$WH``$B;!*2(TX`!'``$!!@"B\L$I).NAR06$\L`"!M_^@0@")L$I((*0`$, M`!MF``,N<`J\@&8(4JP(;F```?YP7+R`9E!#Z``!*TG_Z"!L$I)3J``(;1HB* M;!*2(&D`!$/H``$L;!*2+4D`!'``$!!@"B\L$I).NAPP6$\@;?_H$(`L`$B&Q M2,9P"KR`9@`!KGP@8``!J$HM_^]G9'`JO(!F``&:4JW_Z"!L$I)3J``(;1HB' M;!*2(&D`!$WH``$B;!*2(TX`!'``$!!@"B\L$I).NAO66$\L`"!M_^@0@'(J? ML`%GP'`*O(!F!%*L"&YP+[R`9@`!2'``&T#_[V```3Y*+?_N9Q)P(KR`9@#^= MXG``&T#_[F``_MA*+?_M9Q!P)[R`9@#^RD(M_^U@`/["(`9R,`1!``AK``$$K ML+L0"&;R3OL0!@```'U@``#&````>V```*H````C8```B@```"]@```F````D M)V```!0````B8````AM\``'_[F``_G(;?``!_^U@`/YH4JW_Z"!L$I)3J``(7 M;1HB;!*2(&D`!$WH``$B;!*2(TX`!'``$!!@"B\L$I).NAKR6$\@;?_H$(!R- M*K`!9@H;?``!_^]@`/X@2(!(P"\L$I(O`$ZZ%4A03V``_@Q![`AR(FW_Z+/(3 M9@#]_AE\``$%\6``_?1P`;"L`"IF!G("*4$`*E*'8`#]X$'L"'(B;?_HL\AF] M!'X`8`)3ATJ'9@#]R'`"L*P`*F8`_;YP`RE``"I@`/VT2H=F``#`2BW_[F8`K M`+A*+?_O9@``L!`L!?)F``"H2BW_[&<``(I![`9R2C!H`&=P("P(;DAM_>0OL M"B\+2&W_Z"]``"AA``#D3^\`$$J`9T8@"B(+D($D`%*"+P(O`4AM_>@O0``HS M3KH?>"`O`"A![?WIT<!"$&$`!:`NK?WD+R\`)$AM_>AA`/NV3^\`%"`M_>096 M0`7R0BW_["9M_^A@)$'L!O%*,&@`9QI2BF`60>P'<$HP:`!G#"1M_^@F2AM\@ M``'_['`[O(!F#'`#L*P`*F8$0JP`*E*M_^AP"KR`9PY![`YR(FW_Z+/(8P#\. MQD'L"'(K2/_H)D@D2"\L$I).NB<@6$\I0!*:<``90`7R&4`%\1M`_^P;0/_N( M&T#_[6``_)),WTS$3EU.=4Y5__:_[`6H90`;&$CG`S(F;P`J<`$@;0`4((`@; M;0`()%`<$GX`2BP%\69:8$A2BB!L$I)3J``(;1HB;!*2(&D`!$WH``$B;!*2F M(TX`!'``$!!@"B\L$I).NACH6$\L`!2&<`J\`&8.4JP(;D'L#G*UR&(``;P0: M!DB`0>P%\THP``!FJF`V2'@`!DAL`8XO"TZZ'DA/[P`,2H!F"'``&4`%\&`$H M4BP%\`PL``(%\&T,&7P``07R?@%@``%V2JP0?F<>2'@`!TAL`98O"TZZ'@Q/4 M[P`,2H!F"'`!*4``*F#6<`&PK``J9D)(>``&2&P!GB\+3KH=YD_O``Q*@&>X= M2'@`!4AL`:8O"TZZ'=!/[P`,2H!GHDAX``1(;`&L+PM.NAVZ3^\`#$J`9XQPA M`;"L`"IF"G`#*4``*F``_WQP`["L`"IF"B!M`!1"D&```.1P*+P`9@#_8D(M" M__9@1'`*O`!F#E*L"&Y![`YRM<AB``#"$`9(@$'L!W!*,```9@9P+[P`9@92& M+?_V8!80!DB`0>P%\THP``!F"$HM__9G`/\84HH@;!*24Z@`"&T:(FP2DB!I^ M``1-Z``!(FP2DB-.``1P`!`08`HO+!*23KH7=EA/+``4AG`IO`!F@F`2<`J\! M`&8,4JP(;D'L#G*UR&)"4HH@;!*24Z@`"&T:(FP2DB!I``1-Z``!(FP2DB-.B M``1P`!`08`HO+!*23KH7*%A/+``4AA`&2(!![`7S2C```&:L($I3B")M``@B^ MB'`*O`!F!%.L"&X@!DB`2,`O+!*2+P!.NA%L4$]*AV8:(&T`%$J09PX0!DB`$ M0>P'[THP``!G!'(!8`)R`"`!3-],P$Y=3G5.5?WRO^P%J&4`&)A(YP<P?@!A9 M``):2'@``2\L"&Y(;`&R80#X<$_O``Q@``'*1^P(<F```;P0$TB`<DY=06L`1 M`-"P>Q`(9O1.^Q`$`#M@``"Z`'Q@``"T`"5@``"6`'U@``"*`'M@``!^`"]@9 M``!<`"=@``!"`")@```H``U@``%N``Q@``%H``E@``%B`"!@``%<``I@```"5 M4JP(;F```4Y2BW`BL!-F^'!<L"O__V?P8``!.E*+<">P$V;X<%RP*___9_!@[ M``$F4HMP*K`39@XO"V$``4)83R9`8``!$%.+8``!"E*'8``!!%.'8```_G`E% ML"L``68``/1![`ARM\AF``#J8``!"'P`8```X$J'9@``VDH&9@``U!`32(!(? MP'(#0>P$G<(P"`!F$!`3<BZP`6<(<E^P`68``+(D2U*+8`)2BQ`32(!(P'('G M0>P$G<(P"`!F[!`3<E^P`6?D<BZP`6?>(`LB"I"!*@!@`E*+$!-(@$C`0>P$5 MG0@P``,(`&;L$!-R.K`!9PY*`&9<80`)H'(ZL(%F4B`%2(!(P"\`+PI(;?WR3 M3KH:C!`%2(!![?WRT,!"$$AL"')(;!"23KH;5$AL$)).NALX0>P0D4(P"`!(& M>``!+RP(;DAM_?)A`/:R3^\`)'P!8`)3BU*+2A-F`/Y"+RP2DDAX"`!(;`ARK M3KHF;D_O``Q*@&8`_B!,WPS@3EU.=;_L!:AE`!:$+PLF;P`(8!`0*P`!4HMRB M+[`!9@0@"V`R2'@`*B\+3KH;1%!/)D!*@&;>1^P(<E*L"&XO+!*22'@(`$AL! M"').NB823^\`#$J`9LXF7TYUO^P%J&4`%BY(YP$0+RP2DDZZ(?8N`$*7+RP2= MFB\L$I).NB)B+JP2DDAX`@!(;!"23KHETDAX``I(;!"280`&%$_O`!PF0"`+` M9P)"$T*G+P<O+!*23KHB+D_O``Q,WPB`3G6_[`6H90`5S"\+)F\`"&`2+RL`U M&&'J+HM.NB*,6$\F:P`4(`MFZB9?3G6_[`6H90`5HDCG`3`F;P`0)&\`%"\2" M+Q-.NAH24$\N`$J'9F@@:P`$(FH`!+/(9BY*K!"&9@``C"\3+RP(;B\(2&P!- MNDAL`U1.NB,J2&P!Y$AL`U1.NB,>3^\`'&!D2BH`$F8@2JP0AF8:+Q,O*@`$< M+RL`!$AL`?I(;`-43KHB]D_O`!05?``!`!)@-DJ':AI*J@`49PXO*@`4+PMA> M`/]B4$]@'B5+`!1@&$JJ`!AG#B\J`!@O"V$`_TA03V`$)4L`&$S?#(!.=;_L^ M!:AE`!3:2.<`,B9O`!`@"V<``4`O*P`48>183TJL$(YF``#<2BL`"&<``+@0U M+``N2(!(P"\`+RL`!"\32&P",B\L$I9.NB)D3^\`%"1K``Y@<'!<L!)F$$ALI M`CPO+!*63KHB2%!/8%@0+``N$A*R`&882(!(P"\`2&P"0"\L$I9.NB(H3^\`0 M#&`V(&P2EE.H``QM&B)L$I8@:0`$0^@``2QL$I8M20`$$!(0@&`2$!)R`!(`7 M+RP2EB\!3KH/IE!/4HI*$F:,$"P`+DB`2,`O`$AL`D0O+!*63KHAT$_O``Q@" M9B\K``HO*P`$+Q-(;`)(+RP2EDZZ(;1/[P`48$I*K!"*9R9P/]"K``IR0$ZZ/ M)]`O`"\K``0O$TAL`E)(;`,R3KHAB$_O`!1@'B\K``XO*P`$+RL`"B\32&P": M7$AL`S).NB%H3^\`&"\K`!AA`/ZP6$],WTP`3G6_[`6H90`3@"\+)F\`"$*LC M$J)@``'&4JP(;D'L$)(I2`)P$"P0DG(EL`%F#D'L$),I2`)P8`12K`)P(&P"P M<!`02(!(P$'L!)T(,``#"`!FYB!L`G`0$&<``8)(@$C``$``('(H!$$`"&L`' M`.2PNQ`(9O).^Q`&````9&```(@```!C8```7@```&Q@``!"````<F```"(`- M``!I8````DAL`G1A``%66$]*@&<``*)A``&,8```FDAL`GQA``$^6$]*@&<`Y M`(IA``%T8```@DAL`H)A``$F6$]*@&=R80`!7F!L2&P"BF$``1)83TJ`9@Y(Y M;`*280`!!%A/2H!G4&$``3Q@2DAL`IQA``#P6$]*@&<\8`12K`)P(&P"<!`0_ M2(!(P$'L!)T(,``#"`!FYB!L`G`0$&<``*1(;`*D80``O%A/2H!G``"48`12O MK`)P(&P"<!`02(!(P$'L!)T(,``#"`!FYB!L`G`0$&=N2(!(P`!``"`,@```8 M`'!G.`R`````<V<<#(````!F9DY(;`*N80``:%A/2H!G0&$``29@.DAL`KAAM M``!46$]*@&<L80`!$F`F2&P"Q&$``$!83TJ`9P9A``#^8!)(;`+,80``+%A/2 M2H!G!&$``.HO"TAX`@!(;!"23KHA<$_O``Q*@&8`_B8@+!*B)E].=;_L!:AE. M`!&&2.<!$"9O``Q^`&`$4HM2ATH39Q(@;`)PT<=PW\`0<M_"$[(`9^9*$V8(+ MWZP"<'`!8`)P`$S?"(!.=;_L!:AE`!%$+PM@!%*L`G`@;`)P$!!(@$C`0>P$U MG0@P``,(`&;F(&P"<!`0<BJP`6900^@``2E)`G!@!%*L`G`@;`)P$!!(@$C`? M0>P$G-'`)D@(*P`#``%FX@@K``(``68&4ZP"<&`:4JP"<"!L`G`0$$B`2,!!W M[`2="#```@@`9N8F7TYU3E7]^K_L!:AE`!"Z+PM'[!"28`)2BTH39OI"*___Z M8`12K`)P(&P"<!`02(!(P$'L!)S1P"9(""L``P`!9N(@;`)P$!!*`&=@<`/`O M*P`!9UA'Z``!8`)2BTH39R`0$TB`2,!R`T'L!)W",`@`2@%FYD'L!)T(,``"- M"`!FVA`30A,O+`)P2&W]_!]```Q.NA2J%J\`#$AX``$O+`AN2&W]_&$`\!12T MK!*B)FW]]DY=3G5.5?_\O^P%J&4`$`HO+0`(3KH48E*`+H!.NAGN+JT`""\`, M+T``"$ZZ%&`@+P`(3EU.=;_L!:AE``_<2.<!,"9O`!`>+P`7E<H0$[`'9@(D. M2R!+4HM*$&;P(`I,WPR`3G6_[`6H90`/KDCG`1`F;P`,0JP2HF```-)2K`AN* M0>P0DBE(`G`0+!"2<BBP`68``+H0+!"3<D2P`6<(<F2P`68``*@0+!"4<D6P, M`6<(<F6P`68``)80+!"5<D:P`6<(<F:P`68``(1![!"6*4@"<$AL`M8O"&$`Z M`5903TJ`9R1(;`+>+RP"<&$``4103TJ`9Q)(;`+F+RP"<&$``3)03TJ`9@1^" M`6`(?@!@!%*L`G`@;`)P$!!(@$C`0>P$G0@P``,(`&?F8`12K`)P(&P"<!`0Y M2(!(P$'L!)T(,``#"`!FYB\'80``(EA/+PM(>`(`2&P0DDZZ'I!/[P`,2H!F/ M`/\:3-\(@$YU3E7]^K_L!:AE``ZD+PM'[!"28`)2BTH39OIP`!=`__\@;`)PF M$A!*`6<``)1*K0`(9T1(>``I+PA.NA-64$\F0$J`9@1@>%.+M^P"<&4&<#JPL M$V;RM^P"<&5D*4L"<&`"4HM*$V<L$!-R*;`!9R1R(+`!9NQ@'"9L`G!2BV`"L M4HM*$V<.$!-R*+`!9P9R(+`!9NP0$T(3+RP"<$AM_?P?0``,3KH2?A:O``Q(N M>``!+RP(;DAM_?QA`.WH4JP2HB9M_?9.74YUO^P%J&4`#>)(YP$P)F\`$"1O8 M`!1@5A`32(!(P$'L!)T(,```"`!G(D'L!)T(,```"`!G#!`32(!(P'(@T(%@+ M!A`32(!(P"X`8`8>$TB'2,<0$DB`2,"PAV<.$!)(@$C`(@>2@"`!8`I2BE*+K M2A)FIG``3-\,@$YUO^P%J&4`#6I(YP,@+RP2DDZZ&3)83RX`8"9![`2="#``+ M`V@`9AIP#;R`9Q1"IR\'+RP2DDZZ&8I/[P`,(`9@1B!L$I)3J``(;1HB;!*2J M(&D`!$7H``$B;!*2(TH`!'``$!!@"B\L$I).N@LF6$\L`%*`9J9"IR\'+RP2- MDDZZ&4)/[P`,</],WP3`3G5.5?X`O^P%J&4`#-HO+!*23KH8IBE`$IHNK!*2\ M2'@"`$AM_@!.NAR.3^\`#$J`9QQ2K`AN2'@``DAL`NY(;?X`3KH06D_O``Q*1 M@&;`3EU.=4YU3G5(YP<P+B\`&"9O`!PL+P`@+P=.NB*T6$\D0"`*9@1P_V`V9 M""H``P`#9Q!(>``"0J<O!TZZ%J!/[P`,+P8O"R\J``1.NATP3^\`#"H`2JP%H MO&<$</]@`B`%3-\,X$YU``````````!P84CG`Q`F;P`0($M*&&;\4XB1RRP() M?@`>&TJ'9S)3K`,^;18@;`,V0^@``2E)`S8@!Q"`<@`2`&#<(`=R`!(`2&P#9 M,B\!3KH'9E!/(@!@QDAL`S)(>/__3KH'5%!/(`9,WPC`3G4```````!P84Y5W M_\1(YR<P)F\`7"1O`&!^`'P`>@!P`!M\`"#_^W(`*T'_]G3_*T+_\D'M_]`;^ M0/_Q&T#__"M!_^0K0?_H*TC_S$H39T)P`!`3<AA=06LXL'L0"&;V3OL0!``CI M8```(``@8```%@`K8```#``M8````GX!8`Y\`6`*>@%@!AM\``'__%*+8+H0+ M$W(PL`%F!E*+&T'_^W`JL!-F$"!20^@`!"2)*U#_]E*+8`Y(;?_V+PM.NA#(E M4$_7P!`3<BZP`68F4HMP*K`39A`@4D/H``0DB2M0__)2BV`.2&W_\B\+3KH0C MFE!/U\`0$W)LL`%F"AM\``'_\5*+8`AR:+`!9@)2BQ`;<@`2`!M`__!P,%U`% M:P`"5+)[``AF]$[[``0`8V```BH`<V```>@`6&```7X`>&```7@`<&```5X`_ M;V```0P`=6```.(`9&````)*+?_Q9PP@4D/H``0DB2`08`H@4D/H``0DB2`09 M*T#_[&P*<@%$K?_L*T'_Z$JM_^AG!'`M8`I*!F<$<"M@`G`@&T#_T'``$`8B8 M+?_H@H!P`!`%@H!G"%*M_\Q2K?_D+RW_["\M_\Q.N@\J4$\K0/_(("W_\DJ`` M:@9R`2M!__(@+?_((BW_\I*`2.T``O_$;RX@;?_,(DC3P6`"$MA3@&3Z<``00 M+?_[(BW_Q"!M_\Q@`A#`4X%D^B`M__(K0/_(T:W_Y$'M_]`K2/_,2@=G``%0* M&WP`(/_[8``!1DHM__%G#"!20^@`!"2)(!!@"B!20^@`!"2)(!`K0/_L8`#_- M8DHM__%G#"!20^@`!"2)(!!@"B!20^@`!"2)(!`K0/_L2BW__&<2(&W_S!#\' M`#!R`2M!_^0K2/_,+P`O+?_,3KH.A%!/*T#_R&``_R@;?``P__L@+?_R2H!JK M!G`(*T#_\DHM__%G#"!20^@`!"2)(!!@"B!20^@`!"2)(!`K0/_L2BW__&<6? M(&W_S!#\`#`0_`!X<@(K0?_D*TC_S"\`+RW_S$ZZ#F!03RM`_\AP6+`M__!FP M`/Z^2&W_T$ZZ#`183V``_K`@4D/H``0DB2)0*TG_S&8(0?H`W"M(_\P@;?_,G M2AAF_%.(D>W_S"M(_^0@+?_R2H!K*K'`;R8K0/_D8"!P`2M`_^0@4D/H``0DS MB2`0&T#_T$(M_]%@!G``8```C"`M_^0B+?_VLH!L"'0`*T+_]F`$D:W_]DH'\ M9S93K?_D;1AP`"!M_\P0&"\`*TC_S"!M`!!.D%A/8.)3K?_V;4AP`!`M__LO& M`"!M`!!.D%A/8.A3K?_V;1)P`!`M__LO`"!M`!!.D%A/8.A3K?_D;1AP`"!M# M_\P0&"\`*TC_S"!M`!!.D%A/8.(@"TS?#.1.74YU``!.5?_V2.<!,"9O`!XD' M;P`B*VT`$/_V'AI*!V<T<"6^`&8BL!)F!%**8!HO"TAM__8O"F$`^\Q/[P`,^ M*T#_^F<$)$!@TG``$`<O`$Z36$]@QDS?#(!.74YU2.<A$"XO`!`F;P`4</^^1 M@&=@""L````;9UAR,,*K`!A*@69.""L``@`;9Q@B!Q=!`"!!ZP`@)T@`!'0!> M)T(`""`!8"X@:P`$(FL`$+/(9@1P_V`>4ZL`!"!K``0@!Q"`""L`!P`:9P93Z MJP`(8`12JP`(3-\(A$YU3E7_\$CG(3(F;P`L#*P````@%")L``"&$!-R(+`!1 M9PQR";`!9P9R"K`!9@12BV#H2A-G:"`L%"+E@%*L%")![!0JT<`D2'`BL!-FR M)E*+)(M*$V<*<"*P$V<$4HM@\DH39@Q(>``!3KH&+%A/8)Y"&V":)(M*$V<8` M$!-R(+`!9Q!R";`!9PIR"K`!9P12BV#D2A-F`F`&0AM@`/]R2JP4(F8&(&P%U MX&`$0>P4*BE(%"9*K!0B9GQ!^@$D0^P3Z"+8(M@BV"+8,I`B;`7@(&D`)$AX\ M`"@O*``$2&P3Z$ZZ"A9/[P`,0>P3Z"(()#P```/N+&P4U$ZN_^(I0!*L*4`2& MM'($*4$2L"E`$KPI01*XY8"3R2QX``0K0/_P3J[^VB!M__`B0"-H``@`I'X`K M*T#_]&`J+&P4U$ZN_\HI0!*L3J[_Q"E`$K1!^@"F(@@D/````^U.KO_B*4`2U MO'X$(`<`0(`!@:P2J"`'`$"``H&L$K``K```@`,2N$JL`WAG!'``8`8@/```L M@``N`$*L`RP@!P!```$I0`,H<`$I0`-.(`<`0``"*4`#2G`"*4`#<"`'`$``& M@"E``VQ!^AGV*4@%U"\L%"8O+!0B3KKA-D*73KH5K$SM3(3_W$Y=3G5C;VXZ? M,3`O,3`O,S(P+S@P+P`J````````````````````````````````````````E M`'!A+PLF;P`(2JL`%&<,""L``P`;9@1P`&`V+RP%H$ZZ$'Y83R=```0G0``0$ M2H!F"G`,*4`4T'#_8!8G;`6@`!1P\\&K`!AP`"=```PG0``()E].=0``````U M````````````3E7_[$CG+Q`N+P`T)F\`."@'<#'`JP`89P9P_V```G`(*P`'5 M`!I6P$0`2(!(P"P`2JL`%&8``(0(*P`"`!MF>G``)T``#'+_OH%G``)"+PM.9 MNO].6$]*@&<,".L`!0`;</]@``(J".L``0`;2@9G#B`K`!0B`$2!)T$`#&`(O M("L`%"=```Q3JP`,;18@:P`$0^@``2=)``0@!Q"`<@`2`&`2(`=R`!(`+PLO/ M`6$`_U)03R(`(`%@``'6""L``@`;9UAP_[Z`9@9P`&```<(@!QM`__]*!F<B@ M<@J^@68<<@(O`4AZ`;(O*P`<*T'_\$ZZ]OQ/[P`,*@!@&G(!+P%(;?__+RL`_ M'"M!__!.NO;@3^\`#"H`?O]@``#@".L``0`;2@9G4G#_OH!G3%2K``QR"KZ!$ M9B8@:P`$0^@``2=)``00O``-(BL`#$J!:PHO"R\`80#^KE!/4JL`#"!K``1#= MZ``!)TD`!"`'$(`B*P`,2H%K``$<?O\@*P`$D*L`$"M`__!G<@@K``8`&F=26 M2'@``D*G+RL`'$ZZ#2A/[P`,*T#_[$H&9SA3K?_L;3)"IR\M_^PO*P`<3KH-R M"$AX``%(;?_]+RL`'$ZZ"BA/[P`82JP%O&8*$"W__7(:L`%GR"\M__`O*P`0! M+RL`'$ZZ]@!/[P`,*@!@`GH`</^Z@&8(".L`!0`;8`RZK?_P9P8(ZP`$`!M*Y M!F<.(BL`%"0!1((G0@`,8!@(*P`"`!MG"'(`)T$`#&`((BL`%"=!``P@:P`0Q M)T@`!+Z`9RY3JP`,;18@:P`$0^@``2=)``0@!Q"`<@`2`&`2(`=R`!(`+PLO# M`6$`_9!03R(`<##`JP`89P1P_V`,</^X@&8$<`!@`B`$3-\(]$Y=3G4-"@``, M``!(YP<0)F\`%`@K``<`&E;`1`!(@$C`+@!P,,"K`!AG"D*K``AP_V```5@(4 M*P`'`!MG%`@K``8`&V<,+PM(>/__3KK](E!/2JL`%&8V0JL`"`@K``(`&V<2P M<`$G0``40>L`("=(`!!@``"$+PM.NOR66$]*@&=V".L`!0`;</]@``$`2@=G8 M9E2K``@@*P`(2H!N6B!K``1#Z``!)TD`!'P`'!`@!@R`````&F<N#(`````-C M9C)3JP`(;10@:P`$0^@``2=)``1P`!`08```M"\+80#_+EA/8```J`CK``0`@ M&W#_8```G"`&8```E@@K``$`&V9.".L````;+RL`%"\K`!`O*P`<3KH(3$_O; M``PJ`$J%:@8(ZP`%`!M*A68&".L`!``;2H5O&DH'9PH@!42`)T``"&`$)T4`7 M""!K`!`G2``$<#+`JP`89Q9*!V<(</\G0``(8`9P`"=```AP_V`@4ZL`"&T2/ M(&L`!$/H``$G20`$<``0$&`(+PMA`/Z$6$],WPC@3G4``$CG!P`N+P`0+"P"^ M]$I&:S`@!DC`YX!![!*H*C`(`$H%9QH(!0`"9A0@!DC`YX!![!*H+S`(!$ZZ% M$RQ83U-&8,PO!TZZVYQ83TS?`.!.=0``````````<&$N;`7D3KH3)DAY````K M%$ZZ$(```````````'!A2.<W$"9O`!QZ`"QL%-1.KO_$+@!*AV840?H`3"((' M)#P```/N3J[_XBX`>@$B"W0`)@=.KO\B+`!*A6<&(@=.KO_<2H9F%G#_*4`4B MT"QL%-1.KO]\*4`%O'#_8`1.KO]\3-\([$YU3DE,.@``56YK;F]W;B!E<G)O" M<B!C;V1E``!5<V5R(&ES(&YO="!O=VYE<@!.;R!S=6-H(&9I;&4@;W(@9&ERT M96-T;W)Y`$YO('-U8V@@<')O8V5S<P!);G1E<G)U<'1E9"!S>7-T96T@8V%LP M;`!)+T\@97)R;W(`3F\@<W5C:"!D979I8V4@;W(@861D<F5S<P!!<F<@;&ESF M="!I<R!T;V\@;&]N9P``17AE8R!F;W)M870@97)R;W(`0F%D(&9I;&4@;G5MA M8F5R`$YO(&-H:6QD('!R;V-E<W,``$YO(&UO<F4@<')O8V5S<V5S(&%L;&]W_ M960`3F\@;65M;W)Y(&%V86EL86)L90!!8V-E<W,@9&5N:65D`$)A9"!A9&1R= M97-S`$)U;&L@9&5V:6-E(')E<75I<F5D``!297-O=7)C92!I<R!B=7-Y``!&7 M:6QE(&%L<F5A9'D@97AI<W1S`$-R;W-S+61E=FEC92!L:6YK`$YO('-U8V@@A M9&5V:6-E``!.;W0@82!D:7)E8W1O<GD`27,@82!D:7)E8W1O<GD``$EN=F%L# M:60@87)G=6UE;G0``$YO(&UO<F4@9FEL97,@*'5N:71S*2!A;&QO=V5D`$YO\ M(&UO<F4@9FEL97,@*'5N:71S*2!A;&QO=V5D(&9O<B!T:&ES('!R;V-E<W,`0 M`$YO="!A('1E<FUI;F%L``!497AT(&9I;&4@:7,@8G5S>0!&:6QE(&ES('1OQ M;R!L87)G90!.;R!S<&%C92!L969T`%-E96L@:7-S=65D('1O('!I<&4`4F5AL M9"UO;FQY(&9I;&4@<WES=&5M`%1O;R!M86YY(&QI;FMS``!"<F]K96X@<&EPJ M90!-871H(&9U;F-T:6]N(&%R9W5M96YT(&5R<F]R``!-871H(&9U;F-T:6]N2 M(')E<W5L="!I<R!O=70@;V8@<F%N9V4``$CG(#`F;P`0)$M*$F<D<``0$D'L. M!)T(,``!"`!G"G(`$@!T()*"8`1R`!(`%(%2BF#8(`M,WPP$3G4`````````Y M`'!A(F\`""!O``0@+P`,(@A@!!#99PA3@&3X8`9"&%.`9/H@`4YU2.<#,"9OY M`!0D;P`8+B\`'$J'9R!*$V<<2A)G&'``$!MR`!(:D($L`$J&9P0@!F`:4X=@6 MW$J'9Q!*$V<$<`%@"DH29P1P_V`"<`!,WPS`3G5.5?_X2.<#,"9O`"`D;P`DQ M+B\`*"!*2AAF_%.(D<HL""!+2AAF_%.(D<L@"")+T\`K2?_XO(=C`BP'(`8@W M2F`"$MA3@&3Z(&W_^$(P:``@"TS?#,!.74YU(&\`!"`(2AAF_%-(D<`@"$YU+ M```@;P`((F\`!"`)$MAF_$YU(&\`!")O``@2&+(99@A*`6;V<`!.=6X$</].\ M=7`!3G4B;P`((&\`!"`(2AAF_%.($-EF_$YU``!(YP$0)F\`#"XO`!!P`!`3+ ML(=F!"`+8`@0&TH`9NYP`$S?"(!.=4CG`1`F;P`,+B\`$"\'+PMAR%!/3-\(< M@$YU2.<!,"9O`!`N+P`4E<I*$V<.<``0$["'9@(D2U*+8.X@"DS?#(!.=2`OI M``@@;P`$3E7_]")/<@I.N@[\!D$`,!+!2H!F\"`)$.&_R6;Z0A"0CTY=3G4`[ M`"`O``@@;P`$3E7_]")/(@`"00`'!D$`,!+!YHAF\"`)$.&_R6;Z0A"0CTY=) M3G4``#`Q,C,T-38W.#EA8F-D968@+P`((&\`!$/O``0R``)!``\2^Q#<Z(AF8 M\B`)(@]8@1#ALHEF^D(0D(%.=2!O``0B2'(`<``O`@P0`"MG!@P0`"UF`E)(F M$!@$```P;1(,```);@PD`>6!TH+2@=*`8.8,$0`M9@)$@20?(`A3@"!O``@@@ M@9")3G4O!RXO``A2K!2P(`<@;!2L$,`I2!2L+A].=4Y5``!(YP`P)F\`$"1OX M`!1"K!2P*4L4K$AM`!`O"DAZ_\9.NO'Z(&P4K$(0("P4L$SM#`#_^$Y=3G5.8 M5?_H2.<!,BXO`#1*AVX&</]@``#2<`B^@&0"+@`@!U:`+@`"1__\)&T`""!MT M``C1Q]^L`PA#[`,$)E$K2/_P*TG_]"`+9P``D"!+("L`!-'`*TC_[")M__"WL MR6,0)(LE1P`$+&W_]"R*<`!@>+?)9AHL4R2.("L`!"(`TH<E00`$+&W_]"R*, M<`!@6K7(9`B?K`,(</]@3K7(9BQ*DV<.(%.SR&,(GZP#"'#_8#C?JP`$2I-GO M#K/39@H@*0`$T:L`!":1<`!@'BM+__0K;?_L_^@F4V``_VX@;?_T((I"DB5'Y M``1P`$S?3(!.74YU``````````!P84CG`1`F;P`,+B\`$"\'+PM.NO[V4$],/ MWPB`3G5(YP<P+B\`&"9O`!PL+P`@+P=.N@ZP6$\D0"`*9@1P_V`>+P8O"R\J! M``1.N@H,3^\`#"H`2JP%O&<$</]@`B`%3-\,X$YU``!(YP$0)F\`#$JL%-!GJ M6"`L%-"PK`-\;@)L!'X`8`(N`$AL`U1(>``*3KH%1DAL`U0O"TZZ!0Q(;`-4B M2'H`-$ZZ!0`@!^6`2&P#5$'L`X`O,`@`3KH$[$AL`U1(>``*3KH%$$_O`"@@A M+!303-\(@$YU.B```````````````````$Y5_^9(YP\P)F\`.BXO`#Y"+?__M M0JP%O"ML%-#_\GH#NJP"]&P2(`7G@$'L$JA*L`@`9P12A6#H("P"]+"%9@QP* M&"E`%-!P_V```2H@!>>`0>P2J-'`)$A*K0`09P@(+0`"`!-G"BM\```#[/_N# M8`@K?````^[_[B`\``"``,"L`PRQAP@'``-G#"`'`D#__"X``$<``B`'<@/`X M@0R``````F<,#(`````!9P1*@&8&+`=2AF`,<!8I0!30</]@``"T(`<"@```F M`P!G``"("`<`"F<6&WP``?__+RW_[B\+3KH)(E!/*`!@/`@'``EF%DAX`^TOJ M"TZZ",103R@`2H1J!`C'``D(!P`)9QH;?``!__\I;?_R%-`O+?_N+PM.N@E(P M4$\H`$HM__]G-B`'<GC2@<"!2H!G*DJ$:R8O!$ZZ"9!(>`/M+PM.N@AR3^\`V M#"@`8`Y(>`/M+PM.N@A@4$\H`$JL!;QG!'#_8`@DAB5$``0@!4S?#/!.74YU- M````````````````2.<`,B9L%+0@"V<4)%,B2R`K``@L>``$3J[_+B9*8.B1R MR"E(%+@I2!2T3-],`$YU2.<!,"XO`!!*K!3`9Q8D;!3`+Q(O+!3`3KK]2E!/. MD<@I2!3`2H=F!'``8!Y8AR\'3KH!FEA/)D!*@&8$<`!@"B1+)(=!ZP`$(`A,8 MWPR`3G5(YP\0+B\`&"PO`!PJ+P`@+P=.N@O@6$\F0"`+9@1P_V`>+P4O!B\K< M``1.N@;`3^\`#"@`2JP%O&<$</]@`B`$3-\(\$YU``!(YP$R+B\`%'`,WH`@. M!W(`+'@`!$ZN_SHF0"`+9@1P`&`Z)T<`"$7L%+0@:@`$)T@`!)'()HA*DF8"6 M)(M*J@`$9P8B:@`$(HLE2P`$2JP"^&8$*4L"^$'K``P@"$S?3(!.=0``````G M````````````2.<#,"XO`!1*AVX&<`!@``"D<`B^@&0"+@`@!U:`+@`"1__\% M1>P#!"92(`MG0"`K``2PAVTRL(=F#"!3)(B?K`,((`M@;B`K``20AW((L(%ET M%B!+T<<DB"1()),E0``$GZP#""`+8$PD2R938+P@!R(L!`S0@5.`3KH(BB(L3 M!`Q.N@AB+`!0AB`&5H`L``)&__PO!DZZ_OI83R9`(`MG$B\&+PM.NOJ^+H=A: M`/]44$]@`G``3-\,P$YU``````````!P82\'+B\`""\'3KK_,EA/+A].=0``0 M2.<!$"9O``P(*P`!`!MG%DJK`!1F!'``8%PO"TAX__].NN^.4$](>``!0J<O! M*P`<3KK^/D_O``PN`'#_OH!G!DJK`!1F!"`'8"P(*P`!`!MG#"`K``20JP`0? MT(=@&`@K``<`&F<*(`<B*P`(T(%@!B`'D*L`"$S?"(!.=4CG`Q`F;P`0+B\`K M%"PO`!@(*P`!`!MG#B\+2'C__TZZ[Q103V`:<`&\@&84""L`!P`:9P@@*P`(D MWH!@!)ZK``@G:P`0``1P`"=```PG0``(""L`!P`;9P9P_,&K`!@O!B\'+RL`" M'$ZZ_8Q/[P`,4H!F!'#_8`APS\&K`!AP`$S?",!.=2\+)F\`""`+9Q!"ITZZ= M_1)83R!+68@I2!3`<``F7TYU````````<&%(YP$P)F\`$"1O`!1^`!X;2H=GK M$B\*+P=.N@`64$]2@&;J</]@`G``3-\,@$YU``!(YP$0+B\`#"9O`!`(*P`&B M`!MG$G`*OH!F#"\++P=.NNXX4$]@,%.K``QM%B!K``1#Z``!)TD`!"`'$(!RP M`!(`8!(@!W(`$@`O"R\!3KKN"E!/(@`@`4S?"(!.=4CG`2`N+P`,4JP4S"!L4 M%,A3J``,;18B:``$1>D``2%*``0@!Q*`<@`2`&`2(`=R`!(`+P@O`4ZZ[<10< M3R(`3-\$@$YU3E4``$CG`#`F;P`0)&\`%$*L%,PI2Q3(2&T`$"\*2'K_G$ZZR MZE0NBTAX__].NNV*("P4S$SM#`#_^$Y=3G4``$Y5__A(YP`P1^P#$"`+9PQ*Q MJP`89P8D2R938/`@"V8B2'@`(DZZ_8Y83R9`2H!F!'``8!PDBW`A<@`@2Q#!K M4<C__"\++RT`#"\M``A.N@`.3.T,`/_P3EU.=0``3E7_\$CG#S`F;P`T)&\`N M.$JJ`!AG""\*3KH!LEA/*BP#>'X!<``0,W@`#$``8F<*#$``868,>@!@!BH\- M``"``%*'<BNR,W@`5\!$`$B`2,`H`'``$!,,0`!W9P``B`Q``')G0@Q``&%FE M``"^2'@`#"\\``"!`B\M``A.NOE83^\`#"P`</^\@&8&<`!@``#02H1G!G!`- MT(!@`G`"+@``1T``8```B$J$9P1P`F`"<```0(``2'@`#"\`+RT`"$ZZ^11/! M[P`,+`!P_[R`9@9P`&```(Q*A&<&<$#0@&`"<`$N`&!(2H1G!'`"8`)P`0!`\ M@```0`$``$`"`$AX``PO`"\M``A.NOC.3^\`#"P`</^\@&8$<`!@1DJ$9P9P\ M0-"`8`)P`BX`8`1P`&`RD<@E2``0<``E0``4)48`'"5J`!``!"5```PE0``(_ M2H5F!B`\``"``"('@H`E00`8(`I,WPSP3EU.=0``2.</,"9O`!PN+P`@)&\`N M)"@+4X<L!TJ&:S13J@`(;1(@:@`$0^@``25)``1P`!`08`@O"DZZ[AI83RH`5 M</^Z@&<,4X8@!1;`<@JZ@6;(0A.\AV8$<`!@!"!$(`A,WPSP3G4``$CG`S`FI M;P`4""L``0`;9Q`O"TAX__].NNLX4$\N`&`"?@`@*P`80H!G%$JK`!1G#B\K1 M`!0O*P`03KKVZE!/+RL`'$ZZ!7A83RP`</^^@&<&2H9F`G``3-\,P$YU2.<#! M$"XO`!!'[`,0(`MG-`@K``(`&V8H""L``0`;9R`@*P`$D*L`$"P`2H9G$B\&! M+RL`$"\K`!Q.NN*F3^\`#"938,@O!TZZ[M!83TS?",!.=0``2.<W$"XO`!PF) M;P`@+"\`)$JL!=1G!$ZZ!7Q"K`6\(@<D"R8&+&P4U$ZN_]`J`'#_NH!F#DZN2 M_WPI0`6\<`4I0!30(`5,WPCL3G4``$CG/P`N+P`<+"\`("HO`"1*K`749P1.5 MN@4P0JP%O"`%4X`B!R0&)@`L;!343J[_OB@`</^X@&8.3J[_?"E`!;QP%BE`; M%-`@!0R``````F<6#(`````!9PA*@&88(`9@%"`$T(9@#B('=`!V`"QL%-1.[ MKO^^3-\`_$YU``!(YS<0+B\`'"9O`"`L+P`D2JP%U&<$3KH$M$*L!;PB!R0+Y M)@8L;!343J[_UBH`</^Z@&8.3J[_?"E`!;QP!2E`%-`@!4S?".Q.=0``2.<C` M$"9O`!0N+P`82JP%U&<$3KH$;$*L!;PB"R0'+&P4U$ZN_^(L`$J&9A).KO]\O M*4`%O'`"*4`4T'#_8`(@!DS?",1.=0``3E7__$CG(1`F;P`82JP%U&<$3KH$+ M)$*L!;PB"W3^+&P4U$ZN_ZPN`$J'9PHB!TZN_Z9P_V`F(@LD/````^Y.KO_BC M+@!*AV823J[_?"E`!;QP`BE`%-!P_V`"(`=,WPB$3EU.=4Y5__Q(YR$0)F\`' M&$JL!=1G!$ZZ`\!"K`6\(@MT_BQL%-1.KO^L+@!*AV<,(@=.KO^F(@M.KO^XN M(@LD/````^Y.KO_B+@!*AV823J[_?"E`!;QP`BE`%-!P_V`"(`=,WPB$3EU.: M=0``+P<N+P`(2JP%U&<$3KH#7B('+&P4U$ZN_]QP`"X?3G5.5?^P+PY*K!3$0 M9A)#^@"(<``L>``$3J[]V"E`%,1P`"!L!>P0*/__0^W_L&`"$MA3@&3Z<``@V M;`7L$"C__T(U"+!![?^P*4@$'$AX`"A(>`#Z<``O`"\`2&P$.'(`+P%(;`0D. M+P%.N@,T2'@`%$ZZ[`PL;?^L3EU.=2HJ(%-T86-K($]V97)F;&]W("HJ``!%, M6$E4``!I;G1U:71I;VXN;&EB<F%R>0````````````````!(YS``)``F`4A"O M2$/$P<;`P,'40TA"0D+0@DS?``Q.=4J`:@``'D2`2H%J```,1(%A```@1(%.X M=6$``!A$@$2!3G5*@6H```Q$@6$```9$@$YU+P)(030!9@``(DA`2$%(0C0`T M9P``!H3!,`)(0#0`A,$P`DA",@(D'TYU+P-V$`Q!`(!D```&X9E10PQ!"`!D1 M```&Z9E90PQ!(`!D```&Y9E50TI!:P``!N.94T,T`.:H2$)"0N:J2$.`P38`! M,`(T`TA!Q,&0@F0```A30]"!9/YR`#(#2$/GN$A`P4$F'R0?3G5.5?^>2.<S& M,GX`(&P%[!XH__]P3[Z`;P(N`"`'0^W_KV`"$MA3@&3Z0C5XKY/)+'@`!$ZNM M_MHF0$JK`*QG3"`K`*SE@"1`+"H`.$J&9@0L*P"@2H9G-"(&0?H`LB0(=@LLJ M;!343J[_T"!'4H<@"!N\``H(KR(&0>W_KR0()@<L;!343J[_T'#_8$Y*K!3$R M9A)#^@"&<``L>``$3J[]V"E`%,1![?^O*4@$;$AX`#Q(>`#Z<``O`"\`2&P$> MB$AL!'1(;`1@0J=.N@$\3^\`(%.`9P1P_V`"<`!,WTS,3EU.=2HJ(%5S97(@[ M06)O<G0@4F5Q=65S=&5D("HJ``!#3TY424Y510``04)/4E0`*BHJ($)R96%K> M.B``:6YT=6ET:6]N+FQI8G)A<GD```!(YP$0+B\`#"\'3KH`/%A/)D`@"V8$E M</]@*`@K``(``V<&<``F@&`:+RL`!$ZZ_.Y83W``)H!*K`6\9P1P_V`"<`!,H MWPB`3G4O!RXO``AP`"E`!;Q*AVLBOJP"]&P<(`?G@$'L$JA*L`@`9PX@!^>`? M0>P2J-'`(`A@"'`)*4`4T'``+A].=0``2.<!`G``(CP``#``+'@`!$ZN_LXN< M``*'```P`$J'9@1P`&`@2JP%U&<8(&P%U$Z02H!F!'``8`Q(>``43KKH\EA/B M(`=,WT"`3G5AM$YU``!(YS`R+&P4Q"!O`!@B;P`<)&\`("9O`"0@+P`H(B\`V M+"0O`#`F+P`T3J[^I$S?3`Q.=0`````#[`````$````!````!@````````/R( M```#Z@```79`*",I8W1A9W,N8PDT+C<@*$)E<FME;&5Y*2`X+S$X+S@S````+ M``````$`````+P!T86=S```````P(`P)"@``````.B`)"B(G(R@I6UU[?3TM2 M*R4J+R9\7GXA/#X[+"XZ/P``````1$%"0T1%1D=(24I+3$U.3U!14E-45597H M6%E:7V%B8V1E9F=H:6IK;&UN;W!Q<G-T=79W>'EZ`````&A!0D-$149'2$E*H M2TQ-3D]045)35%565UA96E]A8F-D969G:&EJ:VQM;F]P<7)S='5V=WAY>C`Q' M,C,T-38W.#D`````HBP[``````#F57-A9V4Z(&-T86=S(%LM0D9A='5W=GA=X M(&9I;&4@+BXN"@``;78@)7,@3U1!1U,[9F=R97`@+78@)PDE<PDG($]404=3U M(#XE<SMR;2!/5$%'4P``80!W`'-O<G0@)7,@+6\@)7,`<@`[*%L`>7EL97@`E M8W1A9W,Z('1O;R!M86YY(&5N=')I97,@=&\@<V]R=`H``&UA:6X``$TE<P`D0 M`&1E9FEN90``='EP961E9@!S=')U8W0``'5N:6]N`&5N=6T``'EY<&%R<V4`L M1'5P;&EC871E(&5N=')Y(&EN(&9I;&4@)7,L(&QI;F4@)60Z("5S"@``4V5C0 M;VYD(&5N=')Y(&EG;F]R960*`$1U<&QI8V%T92!E;G1R>2!I;B!F:6QE<R`E! M<R!A;F0@)7,Z("5S("A787)N:6YG(&]N;'DI"@``)7,))7,))6->`%Q<``!<? M)6,`)6,*`"5S"25S"25D"@`E<R`E<R`E9`H`)2TQ-G,E-&0@)2TQ-G,@)7,*I M`````!"2:6YT96=E<@!R96%L``!L;V=I8V%L`&-O;7!L97@`8VAA<F%C=&5RT M`&1O=6)L90``<')E8VES:6]N`&9U;F-T:6]N``!S=6)R;W5T:6YE``!P<F]GU M<F%M`'!R;V-E9'5R90!M971H;V0``'=R87!P97(`=VAO<'!E<@`E)0``````: M```H`````````````````````````````(`````#,@``````````````````= M`````````````````````````U0`````````````````````````````````7 M`````````````````````````````````````````````````````````(``` M````(@``)GP``":0```FH@``)KP``";,```FY```)NX``"<(```G'@``)S``_ M`"=````G4@``)VP``">````GC@``)YH``">P```GP@``)]8``"?H```G^```[ M*`@``"@8```H*@``*$@``"AX```HB```*)H``"BL```HN@``*,X``"CD```HD M]```*0```"D>```$`/__````#@`.````````````````__\````$``0`````( M```YF@``!!#__P````0`!````````#FP`````/__````#@`.````````.Y@`# M````__\````$``0`````````````!$S__P````0`!````````#NT`````/__) M````!``$````````.[X``````"`@("`@("`@("@H*"@H("`@("`@("`@("`@I M("`@("`@2!`0$!`0$!`0$!`0$!`0$(2$A(2$A(2$A(00$!`0$!`0@8&!@8&!6 M`0$!`0$!`0$!`0$!`0$!`0$!`0$0$!`0$!""@H*"@H("`@("`@("`@("`@(": M`@("`@("`A`0$!`@("`@("`@("`@*"@H*"@@("`@("`@("`@("`@("`@("!(> M$!`0$!`0$!`0$!`0$!`0A(2$A(2$A(2$A!`0$!`0$!"!@8&!@8$!`0$!`0$!5 M`0$!`0$!`0$!`0$!`1`0$!`0$(*"@H*"@@("`@("`@("`@("`@("`@("`@("A M$!`0$"````````(`````#````.H```#B````G@```&0```!`````-@```"0`6 M``)P```#,@```Q````0T```$<````^P````H````````!)0```2````$6```U M!$0```0P```$"```!`0```0````#_````_@```/T```#\````^P```/H```#5 MY````^````/<```#V````]0```/0```#S````\@```/$```#P````[P```.X) M```#M````[````.L```#J````Z0```.@```#G````Y@```.4```#D````XP`! 3``.(```#A````X`````````#\J0`N `` end size 17344 SHAR_EOF cat << \SHAR_EOF > tags C_entries ctags.c /^C_entries()$/ L_funcs ctags.c /^L_funcs (fi)$/ L_getit ctags.c /^L_getit(special)$/ Mctags ctags.c /^main(ac,av)$/ NODE ctags.c 53 PF_funcs ctags.c /^PF_funcs(fi)$/ TYST ctags.c 65 Y_entries ctags.c /^Y_entries()$/ add_node ctags.c /^add_node(node, cur_node)$/ begtoken ctags.c /^#define begtoken(arg) (_btk[arg]) \/* T if char can/ cfree ctags.c /^# define cfree(C) free(C)$/ endtoken ctags.c /^#define endtoken(arg) (_etk[arg]) \/* T if char end/ find_entries ctags.c /^find_entries(file)$/ first_char ctags.c /^first_char()$/ free_tree ctags.c /^free_tree(node)$/ getit ctags.c /^getit()$/ getline ctags.c /^getline()$/ index ctags.c /^# define index(S, C) strchr(S, C)$/ init ctags.c /^init()$/ intoken ctags.c /^#define intoken(arg) (_itk[arg]) \/* T if char can / isgood ctags.c /^#define isgood(arg) (_gd[arg]) \/* T if char can be/ iswhite ctags.c /^#define iswhite(arg) (_wht[arg]) \/* T if char is w/ max ctags.c /^# define max(I1,I2) (I1 > I2 ? I1 : I2)$/ pfnote ctags.c /^pfnote(name, ln, f)$/ put_entries ctags.c /^put_entries(node)$/ rindex ctags.c /^rindex(sp, c)$/ savestr ctags.c /^savestr(cp)$/ start_entry ctags.c /^start_entry(lp,token,tp,f)$/ striccmp ctags.c /^striccmp(str, pat)$/ tail ctags.c /^tail(cp)$/ takeprec ctags.c /^takeprec()$/ toss_comment ctags.c /^toss_comment(start)$/ toss_yysec ctags.c /^toss_yysec()$/ SHAR_EOF # End of shell archive exit 0 -- Bob Page, U of Lowell CS Dept. page@swan.ulowell.edu ulowell!page Have five nice days.