emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] master 000f5e0: Add a test suite for etags


From: Eli Zaretskii
Subject: [Emacs-diffs] master 000f5e0: Add a test suite for etags
Date: Tue, 12 May 2015 17:09:23 +0000

branch: master
commit 000f5e0e43ee5784bedf6e70e5f324a24f2f455c
Author: Eli Zaretskii <address@hidden>
Commit: Eli Zaretskii <address@hidden>

    Add a test suite for etags
    
    * test/etags/: New test suite, adapted from
    http://fly.isti.cnr.it/pub/software/unix/etags-regression-test.tar.bz2,
    whose original author is Francesco Potortì <address@hidden>.
---
 .gitignore                                      |   10 +-
 test/etags/CTAGS.good                           | 6013 ++++++++++++
 test/etags/ETAGS.good_1                         | 5214 ++++++++++
 test/etags/ETAGS.good_2                         | 6440 ++++++++++++
 test/etags/ETAGS.good_3                         | 6118 ++++++++++++
 test/etags/ETAGS.good_4                         | 5378 ++++++++++
 test/etags/ETAGS.good_5                         | 7508 ++++++++++++++
 test/etags/Makefile                             |   79 +
 test/etags/ada-src/2ataspri.adb                 |  665 ++
 test/etags/ada-src/2ataspri.ads                 |  298 +
 test/etags/ada-src/etags-test-for.ada           |  193 +
 test/etags/ada-src/waroquiers.ada               |  153 +
 test/etags/c-src/a/b/b.c                        |    5 +
 test/etags/c-src/abbrev.c                       |  616 ++
 test/etags/c-src/c.c                            |  169 +
 test/etags/c-src/dostorture.c                   |  107 +
 test/etags/c-src/emacs/src/gmalloc.c            | 2040 ++++
 test/etags/c-src/emacs/src/keyboard.c           |11960 +++++++++++++++++++++++
 test/etags/c-src/emacs/src/lisp.h               | 4817 +++++++++
 test/etags/c-src/emacs/src/regex.h              |  630 ++
 test/etags/c-src/etags.c                        | 6563 +++++++++++++
 test/etags/c-src/exit.c                         |   77 +
 test/etags/c-src/exit.strange_suffix            |   77 +
 test/etags/c-src/fail.c                         |    1 +
 test/etags/c-src/getopt.h                       |  125 +
 test/etags/c-src/h.h                            |  119 +
 test/etags/c-src/machsyscalls.c                 |   10 +
 test/etags/c-src/machsyscalls.h                 |   31 +
 test/etags/c-src/sysdep.h                       |   57 +
 test/etags/c-src/tab.c                          |  112 +
 test/etags/c-src/torture.c                      |  107 +
 test/etags/cp-src/MDiagArray2.h                 |  163 +
 test/etags/cp-src/Pctest.h                      |   99 +
 test/etags/cp-src/Range.h                       |   96 +
 test/etags/cp-src/abstract.C                    | 4840 +++++++++
 test/etags/cp-src/abstract.H                    |  993 ++
 test/etags/cp-src/burton.cpp                    |   14 +
 test/etags/cp-src/c.C                           |  156 +
 test/etags/cp-src/cfront.H                      |  836 ++
 test/etags/cp-src/clheir.cpp.gz                 |  Bin 0 -> 408 bytes
 test/etags/cp-src/clheir.hpp                    |   82 +
 test/etags/cp-src/conway.cpp                    |   95 +
 test/etags/cp-src/conway.hpp                    |   23 +
 test/etags/cp-src/fail.C                        |   52 +
 test/etags/cp-src/functions.cpp                 |  239 +
 test/etags/cp-src/screen.cpp                    |   62 +
 test/etags/cp-src/screen.hpp                    |   39 +
 test/etags/el-src/TAGTEST.EL                    |   31 +
 test/etags/el-src/emacs/lisp/progmodes/etags.el | 2153 ++++
 test/etags/erl-src/gs_dialog.erl                |  271 +
 test/etags/erl-src/lines.erl                    |  297 +
 test/etags/erl-src/lists.erl.gz                 |  Bin 0 -> 2667 bytes
 test/etags/f-src/entry.for                      |  581 ++
 test/etags/f-src/entry.strange.gz               |  Bin 0 -> 3265 bytes
 test/etags/f-src/entry.strange_suffix           |  581 ++
 test/etags/forth-src/test-forth.fth             |   53 +
 test/etags/html-src/algrthms.html               |  519 +
 test/etags/html-src/index.shtml                 |   70 +
 test/etags/html-src/software.html               |  241 +
 test/etags/html-src/softwarelibero.html         |  313 +
 test/etags/java-src/AWTEMul.java                |  658 ++
 test/etags/java-src/KeyEve.java                 |  440 +
 test/etags/java-src/SMan.java                   |  848 ++
 test/etags/java-src/SysCol.java                 |  381 +
 test/etags/java-src/TG.java                     |  840 ++
 test/etags/lua-src/allegro.lua                  |  282 +
 test/etags/make-src/Makefile                    |  226 +
 test/etags/objc-src/PackInsp.h                  |  120 +
 test/etags/objc-src/PackInsp.m                  |  505 +
 test/etags/objc-src/Subprocess.h                |   81 +
 test/etags/objc-src/Subprocess.m                |  343 +
 test/etags/objcpp-src/SimpleCalc.H              |   49 +
 test/etags/objcpp-src/SimpleCalc.M              |  207 +
 test/etags/pas-src/common.pas                   | 1545 +++
 test/etags/perl-src/htlmify-cystic              |  382 +
 test/etags/perl-src/kai-test.pl                 |   39 +
 test/etags/perl-src/mirror.pl                   | 4149 ++++++++
 test/etags/perl-src/yagrip.pl                   |   54 +
 test/etags/php-src/lce_functions.php            |  699 ++
 test/etags/php-src/ptest.php                    |   18 +
 test/etags/php-src/sendmail.php                 |  527 +
 test/etags/prol-src/natded.prolog               | 1545 +++
 test/etags/prol-src/ordsets.prolog              |  337 +
 test/etags/ps-src/rfc1245.ps                    | 2085 ++++
 test/etags/pyt-src/server.py                    |  819 ++
 test/etags/tex-src/gzip.texi                    |  479 +
 test/etags/tex-src/nonewline.tex                |    1 +
 test/etags/tex-src/testenv.tex                  |   15 +
 test/etags/tex-src/texinfo.tex                  | 3350 +++++++
 test/etags/y-src/atest.y                        |    5 +
 test/etags/y-src/cccp.c                         | 2202 +++++
 test/etags/y-src/cccp.y                         | 1006 ++
 test/etags/y-src/parse.c                        | 2236 +++++
 test/etags/y-src/parse.y                        |  875 ++
 94 files changed, 105938 insertions(+), 1 deletions(-)

diff --git a/.gitignore b/.gitignore
index 9d32e6b..4e526be 100644
--- a/.gitignore
+++ b/.gitignore
@@ -39,11 +39,13 @@ src/config.in
 Info.plist
 InfoPlist.strings
 Makefile
+makefile
 !admin/charsets/Makefile
 !etc/refcards/Makefile
 !test/automated/data/flymake/Makefile
 !test/indent/Makefile
-makefile
+!test/etags/Makefile
+!test/etags/make-src/Makefile
 /*.cache
 /confdefs.h
 /config.status
@@ -145,6 +147,10 @@ src/*.map
 # Tests.
 test/indent/*.new
 test/biditest.txt
+test/etags/srclist
+test/etags/regexfile
+test/etags/ETAGS
+test/etags/CTAGS
 
 # ctags, etags.
 TAGS
@@ -200,6 +206,7 @@ lisp/international/uni-*.el
 *.fn
 *.fns
 *.html
+!test/etags/html-src/*.html
 *.info
 *.ky
 *.kys
@@ -215,6 +222,7 @@ lisp/international/uni-*.el
 *.pj
 *.pjs
 *.ps
+!test/etags/ps-src/*.ps
 *.sc
 *.scs
 *.t2d/
diff --git a/test/etags/CTAGS.good b/test/etags/CTAGS.good
new file mode 100644
index 0000000..ee5b3f4
--- /dev/null
+++ b/test/etags/CTAGS.good
@@ -0,0 +1,6013 @@
+#a-defer-word  forth-src/test-forth.fth        /^defer #a-defer-word$/
+#some-storage  forth-src/test-forth.fth        /^2000 buffer: #some-storage$/
+$      make-src/Makefile       /^      @-$(MAKE) OPTIONS='--no-members' 
${LATEST}ediff$/
+$      make-src/Makefile       /^      @-$(MAKE) OPTIONS='--declarations 
--no-members' $/
+$      make-src/Makefile       /^      @-$(MAKE) OPTIONS='--members' 
${LATEST}ediff$/
+$      make-src/Makefile       /^      @-$(MAKE) OPTIONS='address@hidden 
--no-member/
+$      make-src/Makefile       /^      @-$(MAKE) OPTIONS='nonexistent 
--members --declar/
+$      make-src/Makefile       /^      @-$(MAKE) ${LATEST}cdiff$/
+$      make-src/Makefile       /^      $(CC) ${FASTCFLAGS} -c $?$/
+$      make-src/Makefile       /^      $(CC) ${FASTCFLAGS} -c $?$/
+$      make-src/Makefile       /^      $(CC) ${FASTCFLAGS} -c $?$/
+$      make-src/Makefile       /^      $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) 
-o etags e/
+$      make-src/Makefile       /^      $(CC) $(CFLAGS) $(CPPFLAGS) -DCTAGS 
$(LDFLAGS) -o/
+$$i    make-src/Makefile       140
+$0x80  c-src/sysdep.h  32
+$SYS_##syscall_na      c-src/sysdep.h  31
+$domain        php-src/lce_functions.php       175
+$filename      php-src/lce_functions.php       174
+$ignore_ws     php-src/lce_functions.php       171
+$memassign     php-src/ptest.php       9
+$memassign_space       php-src/ptest.php       10
+$member        php-src/ptest.php       8
+$msgid php-src/lce_functions.php       107
+$msgid php-src/lce_functions.php       165
+$msgid_lc      php-src/lce_functions.php       113
+$msgstr        php-src/lce_functions.php       108
+$msgstr        php-src/lce_functions.php       166
+$msgstr_lc     php-src/lce_functions.php       114
+$po_entries    php-src/lce_functions.php       172
+$poe_num       php-src/lce_functions.php       173
+$por_a php-src/lce_functions.php       500
+$prefix        php-src/lce_functions.php       72
+$state php-src/lce_functions.php       170
+$sys_comment   php-src/lce_functions.php       110
+$sys_comment   php-src/lce_functions.php       168
+$sys_comment_lc        php-src/lce_functions.php       116
+$test  php-src/ptest.php       12
+$unk_comment   php-src/lce_functions.php       111
+$unk_comment   php-src/lce_functions.php       169
+$unk_comment_lc        php-src/lce_functions.php       117
+$user_comment  php-src/lce_functions.php       109
+$user_comment  php-src/lce_functions.php       167
+$user_comment_lc       php-src/lce_functions.php       115
+( $arg         perl-src/mirror.pl      468
+( $arg         perl-src/mirror.pl      1506
+( $as  perl-src/mirror.pl      3046
+( $atime, $mtime, $path        perl-src/mirror.pl      4118
+( $attempts    perl-src/mirror.pl      1548
+( $buffer, $in, $sofar         perl-src/mirror.pl      3686
+( $bufsiz      perl-src/mirror.pl      3685
+( $c   perl-src/mirror.pl      634
+( $c   perl-src/mirror.pl      706
+( $changed     perl-src/mirror.pl      3916
+( $com         perl-src/mirror.pl      3741
+( $comp        perl-src/mirror.pl      2998
+( $comptemp    perl-src/mirror.pl      2916
+( $con         perl-src/mirror.pl      1241
+( $cont        perl-src/mirror.pl      830
+( $count       perl-src/mirror.pl      2353
+( $count       perl-src/mirror.pl      3920
+( $d   perl-src/mirror.pl      3691
+( $del, $kind  perl-src/mirror.pl      3322
+( $del_patt    perl-src/mirror.pl      3135
+( $dest, $existing     perl-src/mirror.pl      2745
+( $dest_dir    perl-src/mirror.pl      3684
+( $dest_path   perl-src/mirror.pl      3066
+( $dest_path, $attribs         perl-src/mirror.pl      2809
+( $dest_path, $dest_loc_mapi, $src_rem_mapi,  $rtime   perl-src/mirror.pl      
2685
+( $dest_path, $existing_path   perl-src/mirror.pl      3400
+( $desti, $srci, $compress, $srciZ, $srcigz, $split, $dest_path_real   
perl-src/mirror.pl      2299
+( $dev,$ino,$fmode,$nlink,$uid,$gid,$rdev,$ssize,      perl-src/mirror.pl      
1694
+( $diff        perl-src/mirror.pl      3638
+( $dir         perl-src/mirror.pl      3306
+( $dir         perl-src/mirror.pl      3459
+( $dir         perl-src/mirror.pl      3530
+( $dir         perl-src/mirror.pl      3784
+( $dir, $file  perl-src/mirror.pl      3064
+( $dir, $file, $temp, $compress, $split, $restart, $mesg, $got_mesg    
perl-src/mirror.pl      2872
+( $dir, $mode  perl-src/mirror.pl      3499
+( $dir, $mp    perl-src/mirror.pl      723
+( $dir, $rest  perl-src/mirror.pl      3873
+( $dir_level   perl-src/mirror.pl      1691
+( $dirname     perl-src/mirror.pl      3284
+( $dirpart     perl-src/mirror.pl      2746
+( $dirpart     perl-src/mirror.pl      3905
+( $dirtmp      perl-src/mirror.pl      1830
+( $dirtmp      perl-src/mirror.pl      1859
+( $dl  perl-src/mirror.pl      2788
+( $done        perl-src/mirror.pl      2239
+( $dpp, $dps   perl-src/mirror.pl      2509
+( $eqpl        perl-src/mirror.pl      829
+( $err         perl-src/mirror.pl      1601
+( $exit_status         perl-src/mirror.pl      1030
+( $f   perl-src/mirror.pl      725
+( $f   perl-src/mirror.pl      1840
+( $f   perl-src/mirror.pl      2770
+( $f   perl-src/mirror.pl      2921
+( $f   perl-src/mirror.pl      2997
+( $f, $fr, $flb, $flt, $flp, $flz, $frb, $frt  perl-src/mirror.pl      1990
+( $f, $uf      perl-src/mirror.pl      1878
+( $file        perl-src/mirror.pl      3673
+( $file, $kind         perl-src/mirror.pl      3991
+( $files_to_go, $dirs_to_go    perl-src/mirror.pl      3125
+( $filesize    perl-src/mirror.pl      3015
+( $flag, $p    perl-src/mirror.pl      480
+( $flags       perl-src/mirror.pl      1912
+( $fname       perl-src/mirror.pl      758
+( $fname       perl-src/mirror.pl      3379
+( $ft  perl-src/mirror.pl      2747
+( $get_one_package     perl-src/mirror.pl      1009
+( $i   perl-src/mirror.pl      1692
+( $i   perl-src/mirror.pl      2129
+( $i   perl-src/mirror.pl      3917
+( $in  perl-src/mirror.pl      3932
+( $index       perl-src/mirror.pl      3697
+( $key         perl-src/mirror.pl      964
+( $key, $val   perl-src/mirror.pl      896
+( $key, $val, $overrides       perl-src/mirror.pl      870
+( $key, $val, $str     perl-src/mirror.pl      975
+( $key_val     perl-src/mirror.pl      578
+( $last_prodded        perl-src/mirror.pl      1643
+( $last_prodded        perl-src/mirror.pl      2294
+( $lcwd        perl-src/mirror.pl      4137
+( $locali      perl-src/mirror.pl      3054
+( $locali      perl-src/mirror.pl      3714
+( $map         perl-src/mirror.pl      3645
+( $map         perl-src/mirror.pl      3659
+( $mapi        perl-src/mirror.pl      1763
+( $mapi        perl-src/mirror.pl      2214
+( $mode        perl-src/mirror.pl      3556
+( $msg         perl-src/mirror.pl      972
+( $msg         perl-src/mirror.pl      1963
+( $msg         perl-src/mirror.pl      3417
+( $msg         perl-src/mirror.pl      3431
+( $msg         perl-src/mirror.pl      4030
+( $name        perl-src/mirror.pl      2653
+( $newpath     perl-src/mirror.pl      2838
+( $nle         perl-src/mirror.pl      973
+( $now         perl-src/mirror.pl      1493
+( $old         perl-src/mirror.pl      2421
+( $old_dest_path       perl-src/mirror.pl      2432
+( $old_dest_path, $existing_path, $tmp, $restart       perl-src/mirror.pl      
2300
+( $old_mode    perl-src/mirror.pl      4124
+( $old_name    perl-src/mirror.pl      2656
+( $old_path    perl-src/mirror.pl      2130
+( $old_path    perl-src/mirror.pl      2143
+( $old_sig     perl-src/mirror.pl      2098
+( $orig_do_deletes     perl-src/mirror.pl      3132
+( $orig_path   perl-src/mirror.pl      3921
+( $orig_path, $points_to       perl-src/mirror.pl      3904
+( $orig_save_deletes   perl-src/mirror.pl      3133
+( $out         perl-src/mirror.pl      974
+( $p   perl-src/mirror.pl      2762
+( $p, $s, $trz, $t, $m         perl-src/mirror.pl      2030
+( $package     perl-src/mirror.pl      3965
+( $package, $filename, $line   perl-src/mirror.pl      4031
+( $parse_state         perl-src/mirror.pl      1946
+( $part        perl-src/mirror.pl      3698
+( $pass        perl-src/mirror.pl      3609
+( $path        perl-src/mirror.pl      3763
+( $path        perl-src/mirror.pl      3766
+( $path        perl-src/mirror.pl      3888
+( $path        perl-src/mirror.pl      3915
+( $path, $size, $time, $type, $mode, $rdir, $rcwd      perl-src/mirror.pl      
2127
+( $path, $src_path, $type      perl-src/mirror.pl      3555
+( $path, $time         perl-src/mirror.pl      2701
+( $path, $time, $size, $type, $mode, $name, $isdir, $value, $follow    
perl-src/mirror.pl      1693
+( $pathi       perl-src/mirror.pl      3564
+( $pathi       perl-src/mirror.pl      3568
+( $pathi, $path, *keep, *keep_totals, *keep_map, $kind         
perl-src/mirror.pl      4071
+( $per         perl-src/mirror.pl      3162
+( $per         perl-src/mirror.pl      3184
+( $pr_time     perl-src/mirror.pl      2703
+( $prog        perl-src/mirror.pl      3762
+( $program     perl-src/mirror.pl      3782
+( $readme      perl-src/mirror.pl      3730
+( $real        perl-src/mirror.pl      2409
+( $real, $reali, $reali1       perl-src/mirror.pl      2352
+( $real_save_dir, $save_dest   perl-src/mirror.pl      3249
+( $reali       perl-src/mirror.pl      2410
+( $res         perl-src/mirror.pl      1549
+( $ret         perl-src/mirror.pl      1587
+( $ret         perl-src/mirror.pl      2097
+( $ret         perl-src/mirror.pl      4126
+( $ri  perl-src/mirror.pl      2203
+( $rls         perl-src/mirror.pl      1825
+( $rooted      perl-src/mirror.pl      3919
+( $save, $kind         perl-src/mirror.pl      3247
+( $save_dir_tail       perl-src/mirror.pl      3226
+( $sec,$min,$hour,$mday,$mon,$year,    perl-src/mirror.pl      678
+( $sig         perl-src/mirror.pl      4029
+( $sig         perl-src/mirror.pl      4038
+( $site, $path         perl-src/mirror.pl      539
+( $site_path   perl-src/mirror.pl      525
+( $size        perl-src/mirror.pl      3840
+( $sizemsg     perl-src/mirror.pl      3016
+( $sp, $dp     perl-src/mirror.pl      2301
+( $src_file    perl-src/mirror.pl      2915
+( $src_path    perl-src/mirror.pl      2677
+( $src_path    perl-src/mirror.pl      2808
+( $src_path, $dest_path, $attribs, $timestamp  perl-src/mirror.pl      2871
+( $src_path, $dest_path, $got_mesg, $size      perl-src/mirror.pl      3092
+( $src_path, $dest_path, $i    perl-src/mirror.pl      2293
+( $src_path, $i        perl-src/mirror.pl      3131
+( $srci        perl-src/mirror.pl      2810
+( $srcsize     perl-src/mirror.pl      3017
+( $status      perl-src/mirror.pl      3442
+( $storename   perl-src/mirror.pl      1793
+( $t   perl-src/mirror.pl      1589
+( $t1, $t2     perl-src/mirror.pl      3637
+( $temp, $dest_path, $time     perl-src/mirror.pl      3683
+( $thing       perl-src/mirror.pl      2721
+( $thing       perl-src/mirror.pl      2738
+( $ti  perl-src/mirror.pl      2975
+( $time        perl-src/mirror.pl      3029
+( $time_to_sig         perl-src/mirror.pl      4106
+( $tlb         perl-src/mirror.pl      1995
+( $tlz         perl-src/mirror.pl      2037
+( $tmp         perl-src/mirror.pl      2666
+( $tmp_mode    perl-src/mirror.pl      4125
+( $to , $tn    perl-src/mirror.pl      1991
+( $todo, $msg  perl-src/mirror.pl      3809
+( $type_changed        perl-src/mirror.pl      1791
+( $udirtmp     perl-src/mirror.pl      1792
+( $uid, $gid, $path    perl-src/mirror.pl      4112
+( $unsquish    perl-src/mirror.pl      1832
+( $unsquish    perl-src/mirror.pl      1870
+( $update      perl-src/mirror.pl      2534
+( $user        perl-src/mirror.pl      595
+( $user        perl-src/mirror.pl      3608
+( $v   perl-src/mirror.pl      839
+( $v, $kind    perl-src/mirror.pl      3860
+( $val         perl-src/mirror.pl      953
+( $val         perl-src/mirror.pl      1597
+( $val         perl-src/mirror.pl      3392
+( $val         perl-src/mirror.pl      3500
+( $val         perl-src/mirror.pl      3531
+( $val_name    perl-src/mirror.pl      902
+( $value       perl-src/mirror.pl      2408
+( $|   perl-src/mirror.pl      3610
+( *src_paths,  perl-src/mirror.pl      2286
+( *src_paths,  perl-src/mirror.pl      3121
+( *things      perl-src/mirror.pl      3754
+( @dir, $d, $path      perl-src/mirror.pl      3460
+( @dir_list    perl-src/mirror.pl      2128
+( @dirs, $dir  perl-src/mirror.pl      1642
+( @parts       perl-src/mirror.pl      3933
+( @prog_path   perl-src/mirror.pl      3783
+( @rhelp       perl-src/mirror.pl      1289
+( @sub_dirs    perl-src/mirror.pl      1329
+( @t   perl-src/mirror.pl      1154
+( @t   perl-src/mirror.pl      4006
+($_,$flag,$opt,$f,$r,@temp     perl-src/yagrip.pl      8
+($filesize     perl-src/mirror.pl      2944
+($old_dir      perl-src/mirror.pl      3539
+($prog,$_,@list        perl-src/yagrip.pl      39
+($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst   perl-src/mirror.pl      
4013
+($string,$flag,@string,@temp,@last     perl-src/yagrip.pl      40
+(a-forth-constant      forth-src/test-forth.fth        /^constant 
(a-forth-constant$/
+(another-forth-word    forth-src/test-forth.fth        /^: 
(another-forth-word) ( -- )$/
++      tex-src/texinfo.tex     /^\\def+{{\\tt \\char 43}}$/
+.PRECIOUS      Makefile        /^.PRECIOUS: ETAGS.good CTAGS.good$/
+/.notdef       ps-src/rfc1245.ps       /^\/.notdef \/.notdef \/.notdef 
\/.notdef \/.notdef \/.not/
+/.notdef       ps-src/rfc1245.ps       /^\/.notdef \/.notdef \/.notdef 
\/.notdef \/.notdef \/.not/
+/.notdef       ps-src/rfc1245.ps       /^\/.notdef \/.notdef \/.notdef 
\/.notdef \/.notdef \/.not/
+/.notdef       ps-src/rfc1245.ps       /^\/.notdef \/.notdef \/.notdef 
\/.notdef \/.notdef \/.not/
+/.notdef       ps-src/rfc1245.ps       /^\/.notdef \/.notdef \/.notdef 
\/.notdef \/space \/exclam/
+/A     ps-src/rfc1245.ps       /^\/A { $/
+/Acircumflex   ps-src/rfc1245.ps       /^\/Acircumflex \/Ecircumflex \/Aacute 
\/Edieresis \/Egra/
+/B     ps-src/rfc1245.ps       /^\/B { $/
+/BEGINBITMAP2BIT       ps-src/rfc1245.ps       /^\/BEGINBITMAP2BIT { $/
+/BEGINBITMAP2BITc      ps-src/rfc1245.ps       /^\/BEGINBITMAP2BITc { $/
+/BEGINBITMAPBW ps-src/rfc1245.ps       /^\/BEGINBITMAPBW { $/
+/BEGINBITMAPBWc        ps-src/rfc1245.ps       /^\/BEGINBITMAPBWc { $/
+/BEGINBITMAPGRAY       ps-src/rfc1245.ps       /^\/BEGINBITMAPGRAY { $/
+/BEGINBITMAPGRAYc      ps-src/rfc1245.ps       /^\/BEGINBITMAPGRAYc { $/
+/BEGINPRINTCODE        ps-src/rfc1245.ps       /^\/BEGINPRINTCODE { $/
+/BF    ps-src/rfc1245.ps       /^\/BF { $/
+/BITMAPCOLOR   ps-src/rfc1245.ps       /^\/BITMAPCOLOR { $/
+/BITMAPCOLORc  ps-src/rfc1245.ps       /^\/BITMAPCOLORc { $/
+/BITMAPGRAY    ps-src/rfc1245.ps       /^\/BITMAPGRAY { $/
+/BITMAPGRAYc   ps-src/rfc1245.ps       /^\/BITMAPGRAYc { $/
+/C     ps-src/rfc1245.ps       /^\/C { $/
+/COMMONBITMAP  ps-src/rfc1245.ps       /^\/COMMONBITMAP { $/
+/COMMONBITMAPc ps-src/rfc1245.ps       /^\/COMMONBITMAPc { $/
+/D     ps-src/rfc1245.ps       /^\/D {curveto} bind def$/
+/DiacriticEncoding     ps-src/rfc1245.ps       /^\/DiacriticEncoding [$/
+/E     ps-src/rfc1245.ps       /^\/E {lineto} bind def$/
+/ENDBITMAP     ps-src/rfc1245.ps       /^\/ENDBITMAP {$/
+/ENDPRINTCODE  ps-src/rfc1245.ps       /^\/ENDPRINTCODE {$/
+/F     ps-src/rfc1245.ps       /^\/F { $/
+/FMBEGINEPSF   ps-src/rfc1245.ps       /^\/FMBEGINEPSF { $/
+/FMBEGINPAGE   ps-src/rfc1245.ps       /^\/FMBEGINPAGE { $/
+/FMDEFINEFONT  ps-src/rfc1245.ps       /^\/FMDEFINEFONT { $/
+/FMDOCUMENT    ps-src/rfc1245.ps       /^\/FMDOCUMENT { $/
+/FMENDEPSF     ps-src/rfc1245.ps       /^\/FMENDEPSF {$/
+/FMENDPAGE     ps-src/rfc1245.ps       /^\/FMENDPAGE {$/
+/FMLOCAL       ps-src/rfc1245.ps       /^\/FMLOCAL {$/
+/FMNORMALIZEGRAPHICS   ps-src/rfc1245.ps       /^\/FMNORMALIZEGRAPHICS { $/
+/FMVERSION     ps-src/rfc1245.ps       /^\/FMVERSION {$/
+/FMversion     ps-src/rfc1245.ps       /^\/FMversion (2.0) def $/
+/Fmcc  ps-src/rfc1245.ps       /^\/Fmcc {$/
+/FrameDict     ps-src/rfc1245.ps       /^\/FrameDict 190 dict def $/
+/G     ps-src/rfc1245.ps       /^\/G { $/
+/H     ps-src/rfc1245.ps       /^\/H { $/
+/Icircumflex   ps-src/rfc1245.ps       /^\/Icircumflex \/Idieresis \/Igrave 
\/Oacute \/Ocircumfl/
+/L     ps-src/rfc1245.ps       /^\/L \/M \/N \/O \/P \/Q \/R \/S \/T \/U \/V 
\/W \/X \/Y \/Z \/brac/
+/L     ps-src/rfc1245.ps       /^\/L { $/
+/M     ps-src/rfc1245.ps       /^\/M {newpath moveto} bind def$/
+/N     ps-src/rfc1245.ps       /^\/N { $/
+/Ntilde        ps-src/rfc1245.ps       /^\/Ntilde \/Odieresis \/Udieresis 
\/aacute \/agrave \/aci/
+/O     ps-src/rfc1245.ps       /^\/O {closepath} bind def$/
+/Otilde        ps-src/rfc1245.ps       /^\/Otilde \/OE \/oe \/endash \/emdash 
\/quotedblleft \/quo/
+/P     ps-src/rfc1245.ps       /^\/P { $/
+/PF    ps-src/rfc1245.ps       /^\/PF { $/
+/R     ps-src/rfc1245.ps       /^\/R { $/
+/RF    ps-src/rfc1245.ps       /^\/RF { $/
+/RR    ps-src/rfc1245.ps       /^\/RR { $/
+/ReEncode      ps-src/rfc1245.ps       /^\/ReEncode { $/
+/S     ps-src/rfc1245.ps       /^\/S { $/
+/SF    ps-src/rfc1245.ps       /^\/SF { $/
+/T     ps-src/rfc1245.ps       /^\/T { $/
+/TF    ps-src/rfc1245.ps       /^\/TF { $/
+/U     ps-src/rfc1245.ps       /^\/U { $/
+/Uacute        ps-src/rfc1245.ps       /^\/Uacute \/Ucircumflex \/Ugrave 
\/dotlessi \/circumflex/
+/V     ps-src/rfc1245.ps       /^\/V { $/
+/W     ps-src/rfc1245.ps       /^\/W { $/
+/X     ps-src/rfc1245.ps       /^\/X { $/
+/Y     ps-src/rfc1245.ps       /^\/Y { $/
+/Z     ps-src/rfc1245.ps       /^\/Z {$/
+/atilde        ps-src/rfc1245.ps       /^\/atilde \/aring \/ccedilla \/eacute 
\/egrave \/ecircumf/
+/bl    ps-src/rfc1245.ps       /^\/bl { $/
+/braceright    ps-src/rfc1245.ps       /^\/braceright \/asciitilde \/.notdef 
\/Adieresis \/Aring/
+/bracketright  ps-src/rfc1245.ps       /^\/bracketright \/asciicircum 
\/underscore \/grave \/a \//
+/breve ps-src/rfc1245.ps       /^\/breve \/dotaccent \/ring \/cedilla 
\/hungarumlaut \/og/
+/cfs   ps-src/rfc1245.ps       /^\/cfs { $/
+/colorsetup    ps-src/rfc1245.ps       /^\/colorsetup {$/
+/desperatepapersize    ps-src/rfc1245.ps       /^\/desperatepapersize {$/
+/dieresis      ps-src/rfc1245.ps       /^\/dieresis \/.notdef \/AE \/Oslash 
\/.notdef \/.notdef \//
+/dmatrix       ps-src/rfc1245.ps       /^\/dmatrix matrix def$/
+/dnormalize    ps-src/rfc1245.ps       /^\/dnormalize {$/
+/dpi   ps-src/rfc1245.ps       /^\/dpi    72 0 dmatrix defaultmatrix 
dtransform$/
+/exclamdown    ps-src/rfc1245.ps       /^\/exclamdown \/logicalnot \/.notdef 
\/florin \/.notdef /
+/fakecolorsetup        ps-src/rfc1245.ps       /^\/fakecolorsetup {$/
+/fillprocs     ps-src/rfc1245.ps       /^\/fillprocs 32 array def$/
+/fl    ps-src/rfc1245.ps       /^\/fl { $/
+/fraction      ps-src/rfc1245.ps       /^\/fraction \/currency \/guilsinglleft 
\/guilsinglright/
+/freq  ps-src/rfc1245.ps       /^\/freq dpi 18.75 div 8 div round dup 0 eq 
{pop 1} i/
+/gn    ps-src/rfc1245.ps       /^\/gn { $/
+/graymode      ps-src/rfc1245.ps       /^\/graymode true def$/
+/grayness      ps-src/rfc1245.ps       /^\/grayness {$/
+/guillemotleft ps-src/rfc1245.ps       /^\/guillemotleft \/guillemotright 
\/ellipsis \/.notdef /
+/hx    ps-src/rfc1245.ps       /^\/hx { $/
+/i     ps-src/rfc1245.ps       /^\/i \/j \/k \/l \/m \/n \/o \/p \/q \/r \/s 
\/t \/u \/v \/w \/x \/y/
+/iacute        ps-src/rfc1245.ps       /^\/iacute \/igrave \/icircumflex 
\/idieresis \/ntilde \/o/
+/ic    ps-src/rfc1245.ps       /^\/ic [ $/
+/inch  ps-src/rfc1245.ps       /^\/inch {72 mul} def$/
+/ip    ps-src/rfc1245.ps       /^\/ip { $/
+/less  ps-src/rfc1245.ps       /^\/less \/equal \/greater \/question \/at \/A 
\/B \/C \/D \/E/
+/lnormalize    ps-src/rfc1245.ps       /^\/lnormalize { $/
+/manualpapersize       ps-src/rfc1245.ps       /^\/manualpapersize {$/
+/max   ps-src/rfc1245.ps       /^\/max {2 copy lt {exch} if pop} bind def$/
+/min   ps-src/rfc1245.ps       /^\/min {2 copy gt {exch} if pop} bind def$/
+/ms    ps-src/rfc1245.ps       /^\/ms { $/
+/nbluet        ps-src/rfc1245.ps       /^\/nbluet 256 array def$/
+/ngrayt        ps-src/rfc1245.ps       /^\/ngrayt 256 array def$/
+/ngreent       ps-src/rfc1245.ps       /^\/ngreent 256 array def$/
+/normalize     ps-src/rfc1245.ps       /^\/normalize {$/
+/nredt ps-src/rfc1245.ps       /^\/nredt 256 array def$/
+/numbersign    ps-src/rfc1245.ps       /^\/numbersign \/dollar \/percent 
\/ampersand \/quotesing/
+/ocircumflex   ps-src/rfc1245.ps       /^\/ocircumflex \/odieresis \/otilde 
\/uacute \/ugrave \/u/
+/ordfeminine   ps-src/rfc1245.ps       /^\/ordfeminine \/ordmasculine 
\/.notdef \/ae \/oslash \/q/
+/pagedimen     ps-src/rfc1245.ps       /^\/pagedimen { $/
+/papersize     ps-src/rfc1245.ps       /^\/papersize {$/
+/paragraph     ps-src/rfc1245.ps       /^\/paragraph \/germandbls \/registered 
\/copyright \/tra/
+/parenright    ps-src/rfc1245.ps       /^\/parenright \/asterisk \/plus 
\/comma \/hyphen \/period/
+/periodcentered        ps-src/rfc1245.ps       /^\/periodcentered 
\/quotesinglbase \/quotedblbase \/per/
+/quoteleft     ps-src/rfc1245.ps       /^\/quoteleft \/quoteright \/.notdef 
\/.notdef \/ydieresi/
+/restorematrix ps-src/rfc1245.ps       /^\/restorematrix {$/
+/s1    ps-src/rfc1245.ps       /^\/s1 1 string def$/
+/sangle        ps-src/rfc1245.ps       /^\/sangle 1 0 dmatrix defaultmatrix 
dtransform exch /
+/savematrix    ps-src/rfc1245.ps       /^\/savematrix {$/
+/setmanualfeed ps-src/rfc1245.ps       /^\/setmanualfeed {$/
+/setpapername  ps-src/rfc1245.ps       /^\/setpapername { $/
+/setpattern    ps-src/rfc1245.ps       /^\/setpattern {$/
+/two   ps-src/rfc1245.ps       /^\/two \/three \/four \/five \/six \/seven 
\/eight \/nine \//
+/udieresis     ps-src/rfc1245.ps       /^\/udieresis \/dagger \/.notdef \/cent 
\/sterling \/secti/
+/wbytes        ps-src/rfc1245.ps       /^\/wbytes { $/
+/wh    ps-src/rfc1245.ps       /^\/wh { $/
+/yen   ps-src/rfc1245.ps       /^\/yen \/.notdef \/.notdef \/.notdef \/.notdef 
\/.notdef /
+::PctestActionAbort    cp-src/Pctest.h 53
+::PctestActionFiltered cp-src/Pctest.h 51
+::PctestActionValid    cp-src/Pctest.h 47
+::PctestActionValidLasthop     cp-src/Pctest.h 49
+::cat  cp-src/c.C      126
+::dog  cp-src/c.C      126
+::f    cp-src/c.C      /^     void f() {}$/
+::teats        cp-src/c.C      127
+:a-forth-dictionary-entry      forth-src/test-forth.fth        /^create 
:a-forth-dictionary-entry$/
+<      tex-src/texinfo.tex     /^\\def<{{\\tt \\less}}$/
+=      tex-src/texinfo.tex     /^\\global\\let\\section = \\numberedsec$/
+=      tex-src/texinfo.tex     /^\\global\\let\\subsection = \\numberedsubsec$/
+=      tex-src/texinfo.tex     /^\\global\\let\\subsubsection = 
\\numberedsubsubsec$/
+=      tex-src/texinfo.tex     /^\\global\\let\\section = \\appendixsec$/
+=      tex-src/texinfo.tex     /^\\global\\let\\subsection = \\appendixsubsec$/
+=      tex-src/texinfo.tex     /^\\global\\let\\subsubsection = 
\\appendixsubsubsec$/
+=      tex-src/texinfo.tex     /^\\global\\let\\section = \\unnumberedsec$/
+=      tex-src/texinfo.tex     /^\\global\\let\\subsection = 
\\unnumberedsubsec$/
+=      tex-src/texinfo.tex     /^\\global\\let\\subsubsection = 
\\unnumberedsubsubsec$/
+=      tex-src/texinfo.tex     /^\\global\\let\\section = \\numberedsec$/
+=      tex-src/texinfo.tex     /^\\global\\let\\subsection = \\numberedsubsec$/
+=      tex-src/texinfo.tex     /^\\global\\let\\subsubsection = 
\\numberedsubsubsec$/
+=      tex-src/texinfo.tex     /^\\global\\def={{\\tt \\char 61}}}$/
+=/f    ada-src/etags-test-for.ada      /^   function "=" (L, R : 
System.Address) return Boo/
+=\indexdummyfont       tex-src/texinfo.tex     /^\\let\\cite=\\indexdummyfont$/
+=\relax        tex-src/texinfo.tex     /^\\let\\chapter=\\relax$/
+=\relax        tex-src/texinfo.tex     /^\\let\\section=\\relax$/
+=\relax        tex-src/texinfo.tex     /^\\let\\subsection=\\relax$/
+=\relax        tex-src/texinfo.tex     /^\\let\\subsubsection=\\relax$/
+=\relax        tex-src/texinfo.tex     /^\\let\\appendix=\\relax$/
+=\smartitalic  tex-src/texinfo.tex     /^\\let\\cite=\\smartitalic$/
+>      tex-src/texinfo.tex     /^\\def>{{\\tt \\gtr}}$/
+>field1        forth-src/test-forth.fth        /^   9   field   >field1$/
+>field2        forth-src/test-forth.fth        /^   5   field   >field2$/
address@hidden  make-src/Makefile       /^      @$(MAKE) OPTIONS='--no-members' 
${LATEST}ediff$/
address@hidden  make-src/Makefile       /^      @$(MAKE) 
OPTIONS='--declarations --no-members' ${/
address@hidden  make-src/Makefile       /^      @$(MAKE) OPTIONS='--members' 
${LATEST}ediff$/
address@hidden  make-src/Makefile       /^      @$(MAKE) 
OPTIONS='address@hidden --no-members/
address@hidden  make-src/Makefile       /^      @$(MAKE) OPTIONS='nonexistent 
--members --declara/
address@hidden  make-src/Makefile       /^      @$(MAKE) ${LATEST}cdiff$/
address@hidden  make-src/Makefile       /^      @$(MAKE) etags 
"CPPFLAGS=-UVERSION"$/
address@hidden  make-src/Makefile       /^      @$(MAKE) CHECKOBJS= CHECKFLAGS= 
etags "CFLAGS=-an/
address@hidden  make-src/Makefile       /^      @$(MAKE) CHECKOBJS= CHECKFLAGS= 
ctags "CFLAGS=-an/
address@hidden  make-src/Makefile       /^      @$(MAKE) etags CHECKOBJS= 
CHECKFLAGS= REGEXOBJS= /
+A      c.c     162
+A      cp-src/c.C      39
+A      cp-src/c.C      56
+A      cp-src/c.C      57
+A      cp-src/c.C      73
+A      cp-src/c.C      117
+A      cp-src/fail.C   7
+A      cp-src/fail.C   23
+A::A   cp-src/c.C      /^void A::A() {}$/
+A::B   cp-src/c.C      56
+A::B   cp-src/fail.C   8
+A::B   cp-src/fail.C   24
+A::B::C        cp-src/fail.C   9
+A::B::C        cp-src/fail.C   25
+A::B::C::C     cp-src/fail.C   /^                         C(int i) {x = i;}$/
+A::B::C::operator int  cp-src/fail.C   /^                         operator 
int() const {return x;}$/
+A::B::C::x     cp-src/fail.C   10
+A::B::T        cp-src/fail.C   14
+A::B::f        cp-src/fail.C   /^              int f() { return 5; }$/
+A::B::f        cp-src/fail.C   /^int A::B::f() { return 2; }$/
+A::T2  cp-src/fail.C   16
+A::colori      cp-src/c.C      40
+A::giallo      cp-src/c.C      40
+A::operator+   cp-src/c.C      /^const A& A::operator+(const A&) { }$/
+A::operator+   cp-src/c.C      /^  A operator+(A& a) {};$/
+A::rosso       cp-src/c.C      40
+A::verde       cp-src/c.C      40
+A::~A  cp-src/c.C      /^A::~A() {}$/
+ADASRC Makefile        /^ADASRC=$(addprefix .\/ada-src\/,etags-test-for.ada 2/
+ADDRESS        c-src/emacs/src/gmalloc.c       /^#define ADDRESS(B)    ((void 
*) (((B) - 1) * BLOCKSIZ/
+ALIGNOF_STRUCT_LISP_VECTOR     c-src/emacs/src/lisp.h  1378
+ALLOCATED_BEFORE_DUMPING       c-src/emacs/src/gmalloc.c       /^#define 
ALLOCATED_BEFORE_DUMPING(P) \\$/
+ALLOCATE_PSEUDOVECTOR  c-src/emacs/src/lisp.h  /^#define 
ALLOCATE_PSEUDOVECTOR(type, field, tag)                       /
+ALLOCATE_ZEROED_PSEUDOVECTOR   c-src/emacs/src/lisp.h  /^#define 
ALLOCATE_ZEROED_PSEUDOVECTOR(type, field, /
+AND    y-src/cccp.c    11
+ANSIC  c-src/h.h       84
+ANSIC  c-src/h.h       85
+AREF   c-src/emacs/src/lisp.h  /^AREF (Lisp_Object array, ptrdiff_t idx)$/
+ARGS   Makefile        /^ARGS=- < srclist$/
+ARITH_EQUAL    c-src/emacs/src/lisp.h  3498
+ARITH_GRTR     c-src/emacs/src/lisp.h  3501
+ARITH_GRTR_OR_EQUAL    c-src/emacs/src/lisp.h  3503
+ARITH_LESS     c-src/emacs/src/lisp.h  3500
+ARITH_LESS_OR_EQUAL    c-src/emacs/src/lisp.h  3502
+ARITH_NOTEQUAL c-src/emacs/src/lisp.h  3499
+ARRAYELTS      c-src/emacs/src/lisp.h  /^#define ARRAYELTS(arr) (sizeof (arr) 
\/ sizeof (arr/
+ARRAYP c-src/emacs/src/lisp.h  /^ARRAYP (Lisp_Object x)$/
+ARRAY_MARK_FLAG        c-src/emacs/src/lisp.h  768
+ASCII_CHAR_P   c-src/emacs/src/lisp.h  /^#define ASCII_CHAR_P(c) UNSIGNED_CMP 
(c, <, 0x80)$/
+ASET   c-src/emacs/src/lisp.h  /^ASET (Lisp_Object array, ptrdiff_t idx, 
Lisp_Objec/
+ASIZE  c-src/emacs/src/lisp.h  /^ASIZE (Lisp_Object array)$/
+ASRC   Makefile        /^ASRC=$(addprefix .\/a-src\/,empty.zz empty.zz.gz)$/
+AST_Array::AST_Array   cp-src/c.C      /^AST_Array::AST_Array(UTL_ScopedName 
*n, unsigned l/
+AST_ConcreteType::AST_ConcreteType     cp-src/c.C      
/^AST_ConcreteType::AST_ConcreteType(AST_Decl::NodeT/
+AST_Root       cp-src/c.C      92
+AT     cp-src/c.C      52
+AT::t  cp-src/c.C      52
+AU     cp-src/c.C      53
+AU::x  cp-src/c.C      53
+AUTOLOADP      c-src/emacs/src/lisp.h  /^AUTOLOADP (Lisp_Object x)$/
+AUTO_CONS      c-src/emacs/src/lisp.h  /^#define AUTO_CONS(name, a, b) 
Lisp_Object name = A/
+AUTO_CONS_EXPR c-src/emacs/src/lisp.h  /^#define AUTO_CONS_EXPR(a, b) \\$/
+AUTO_LIST1     c-src/emacs/src/lisp.h  /^#define AUTO_LIST1(name, a)           
                                \\$/
+AUTO_LIST2     c-src/emacs/src/lisp.h  /^#define AUTO_LIST2(name, a, b)        
                                        \\$/
+AUTO_LIST3     c-src/emacs/src/lisp.h  /^#define AUTO_LIST3(name, a, b, c)     
                                \\$/
+AUTO_LIST4     c-src/emacs/src/lisp.h  /^#define AUTO_LIST4(name, a, b, c, d)  
                                \\$/
+AUTO_STRING    c-src/emacs/src/lisp.h  /^#define AUTO_STRING(name, str)        
                                        \\$/
+AVAIL_ALLOCA   c-src/emacs/src/lisp.h  /^#define AVAIL_ALLOCA(size) (sa_avail 
-= (size), al/
+AWTEventMulticaster    java-src/AWTEMul.java   63
+AWTEventMulticaster.AWTEventMulticaster        java-src/AWTEMul.java   /^    
protected AWTEventMulticaster(EventListener a,/
+AWTEventMulticaster.a  java-src/AWTEMul.java   69
+AWTEventMulticaster.actionPerformed    java-src/AWTEMul.java   /^    public 
void actionPerformed(ActionEvent e) {$/
+AWTEventMulticaster.add        java-src/AWTEMul.java   /^    public static 
ComponentListener add(ComponentL/
+AWTEventMulticaster.add        java-src/AWTEMul.java   /^    public static 
ContainerListener add(ContainerL/
+AWTEventMulticaster.add        java-src/AWTEMul.java   /^    public static 
FocusListener add(FocusListener /
+AWTEventMulticaster.add        java-src/AWTEMul.java   /^    public static 
KeyListener add(KeyListener a, K/
+AWTEventMulticaster.add        java-src/AWTEMul.java   /^    public static 
MouseListener add(MouseListener /
+AWTEventMulticaster.add        java-src/AWTEMul.java   /^    public static 
MouseMotionListener add(MouseMot/
+AWTEventMulticaster.add        java-src/AWTEMul.java   /^    public static 
WindowListener add(WindowListene/
+AWTEventMulticaster.add        java-src/AWTEMul.java   /^    public static 
ActionListener add(ActionListene/
+AWTEventMulticaster.add        java-src/AWTEMul.java   /^    public static 
ItemListener add(ItemListener a,/
+AWTEventMulticaster.add        java-src/AWTEMul.java   /^    public static 
AdjustmentListener add(Adjustmen/
+AWTEventMulticaster.add        java-src/AWTEMul.java   /^    public static 
TextListener add(TextListener a,/
+AWTEventMulticaster.addInternal        java-src/AWTEMul.java   /^    protected 
static EventListener addInternal(Eve/
+AWTEventMulticaster.adjustmentValueChanged     java-src/AWTEMul.java   /^    
public void adjustmentValueChanged(AdjustmentE/
+AWTEventMulticaster.b  java-src/AWTEMul.java   69
+AWTEventMulticaster.componentAdded     java-src/AWTEMul.java   /^    public 
void componentAdded(ContainerEvent e) {/
+AWTEventMulticaster.componentHidden    java-src/AWTEMul.java   /^    public 
void componentHidden(ComponentEvent e) /
+AWTEventMulticaster.componentMoved     java-src/AWTEMul.java   /^    public 
void componentMoved(ComponentEvent e) {/
+AWTEventMulticaster.componentRemoved   java-src/AWTEMul.java   /^    public 
void componentRemoved(ContainerEvent e)/
+AWTEventMulticaster.componentResized   java-src/AWTEMul.java   /^    public 
void componentResized(ComponentEvent e)/
+AWTEventMulticaster.componentShown     java-src/AWTEMul.java   /^    public 
void componentShown(ComponentEvent e) {/
+AWTEventMulticaster.focusGained        java-src/AWTEMul.java   /^    public 
void focusGained(FocusEvent e) {$/
+AWTEventMulticaster.focusLost  java-src/AWTEMul.java   /^    public void 
focusLost(FocusEvent e) {$/
+AWTEventMulticaster.itemStateChanged   java-src/AWTEMul.java   /^    public 
void itemStateChanged(ItemEvent e) {$/
+AWTEventMulticaster.keyPressed java-src/AWTEMul.java   /^    public void 
keyPressed(KeyEvent e) {$/
+AWTEventMulticaster.keyReleased        java-src/AWTEMul.java   /^    public 
void keyReleased(KeyEvent e) {$/
+AWTEventMulticaster.keyTyped   java-src/AWTEMul.java   /^    public void 
keyTyped(KeyEvent e) {$/
+AWTEventMulticaster.mouseClicked       java-src/AWTEMul.java   /^    public 
void mouseClicked(MouseEvent e) {$/
+AWTEventMulticaster.mouseDragged       java-src/AWTEMul.java   /^    public 
void mouseDragged(MouseEvent e) {$/
+AWTEventMulticaster.mouseEntered       java-src/AWTEMul.java   /^    public 
void mouseEntered(MouseEvent e) {$/
+AWTEventMulticaster.mouseExited        java-src/AWTEMul.java   /^    public 
void mouseExited(MouseEvent e) {$/
+AWTEventMulticaster.mouseMoved java-src/AWTEMul.java   /^    public void 
mouseMoved(MouseEvent e) {$/
+AWTEventMulticaster.mousePressed       java-src/AWTEMul.java   /^    public 
void mousePressed(MouseEvent e) {$/
+AWTEventMulticaster.mouseReleased      java-src/AWTEMul.java   /^    public 
void mouseReleased(MouseEvent e) {$/
+AWTEventMulticaster.remove     java-src/AWTEMul.java   /^    protected 
EventListener remove(EventListener o/
+AWTEventMulticaster.remove     java-src/AWTEMul.java   /^    public static 
ComponentListener remove(Compone/
+AWTEventMulticaster.remove     java-src/AWTEMul.java   /^    public static 
ContainerListener remove(Contain/
+AWTEventMulticaster.remove     java-src/AWTEMul.java   /^    public static 
FocusListener remove(FocusListen/
+AWTEventMulticaster.remove     java-src/AWTEMul.java   /^    public static 
KeyListener remove(KeyListener l/
+AWTEventMulticaster.remove     java-src/AWTEMul.java   /^    public static 
MouseListener remove(MouseListen/
+AWTEventMulticaster.remove     java-src/AWTEMul.java   /^    public static 
MouseMotionListener remove(Mouse/
+AWTEventMulticaster.remove     java-src/AWTEMul.java   /^    public static 
WindowListener remove(WindowList/
+AWTEventMulticaster.remove     java-src/AWTEMul.java   /^    public static 
ActionListener remove(ActionList/
+AWTEventMulticaster.remove     java-src/AWTEMul.java   /^    public static 
ItemListener remove(ItemListener/
+AWTEventMulticaster.remove     java-src/AWTEMul.java   /^    public static 
AdjustmentListener remove(Adjust/
+AWTEventMulticaster.remove     java-src/AWTEMul.java   /^    public static 
TextListener remove(TextListener/
+AWTEventMulticaster.removeInternal     java-src/AWTEMul.java   /^    protected 
static EventListener removeInternal(/
+AWTEventMulticaster.save       java-src/AWTEMul.java   /^    static void 
save(ObjectOutputStream s, String /
+AWTEventMulticaster.saveInternal       java-src/AWTEMul.java   /^    protected 
void saveInternal(ObjectOutputStream/
+AWTEventMulticaster.textValueChanged   java-src/AWTEMul.java   /^    public 
void textValueChanged(TextEvent e) {$/
+AWTEventMulticaster.windowActivated    java-src/AWTEMul.java   /^    public 
void windowActivated(WindowEvent e) {$/
+AWTEventMulticaster.windowClosed       java-src/AWTEMul.java   /^    public 
void windowClosed(WindowEvent e) {$/
+AWTEventMulticaster.windowClosing      java-src/AWTEMul.java   /^    public 
void windowClosing(WindowEvent e) {$/
+AWTEventMulticaster.windowDeactivated  java-src/AWTEMul.java   /^    public 
void windowDeactivated(WindowEvent e) {/
+AWTEventMulticaster.windowDeiconified  java-src/AWTEMul.java   /^    public 
void windowDeiconified(WindowEvent e) {/
+AWTEventMulticaster.windowIconified    java-src/AWTEMul.java   /^    public 
void windowIconified(WindowEvent e) {$/
+AWTEventMulticaster.windowOpened       java-src/AWTEMul.java   /^    public 
void windowOpened(WindowEvent e) {$/
+Abort_Handler_Pointer/t        ada-src/2ataspri.ads    /^   type 
Abort_Handler_Pointer is access procedure /
+Abort_Task/p   ada-src/2ataspri.adb    /^   procedure Abort_Task (T : TCB_Ptr) 
is$/
+Abort_Task/p   ada-src/2ataspri.ads    /^   procedure Abort_Task (T : 
TCB_Ptr);$/
+Abort_Wrapper/p        ada-src/2ataspri.adb    /^   procedure Abort_Wrapper$/
+Abort_Wrapper/p        ada-src/2ataspri.adb    /^   procedure Abort_Wrapper$/
+Action_Pref    cp-src/abstract.H       704
+Action_Pref::Action_Pref       cp-src/abstract.C       
/^Action_Pref::Action_Pref(Tree_Node *a_d, Tree_Node/
+Action_Pref::SetCollapsed      cp-src/abstract.C       /^void 
Action_Pref::SetCollapsed(char t)$/
+Action_Pref::SetDimensions     cp-src/abstract.C       /^void 
Action_Pref::SetDimensions(void)$/
+Action_Pref::SetFather cp-src/abstract.C       /^void 
Action_Pref::SetFather(Tree_Node *f)$/
+Action_Pref::SetPosition       cp-src/abstract.C       /^void 
Action_Pref::SetPosition(Coord xx, Coord yy)$/
+Action_Pref::SetTextual        cp-src/abstract.C       /^void 
Action_Pref::SetTextual(char t, char s)$/
+Action_Pref::action_den        cp-src/abstract.H       706
+Action_Pref::bex       cp-src/abstract.H       707
+Action_Pref::border    cp-src/abstract.H       709
+Action_Pref::havebox   cp-src/abstract.H       708
+Ada_funcs      c-src/etags.c   /^Ada_funcs (FILE *inf)$/
+Ada_getit      c-src/etags.c   /^Ada_getit (FILE *inf, const char 
*name_qualifier)$/
+Ada_help       c-src/etags.c   475
+Ada_suffixes   c-src/etags.c   473
+AddNullToNmStr pas-src/common.pas      /^function AddNullToNmStr; (*($/
+Address_To_Call_State/f        ada-src/2ataspri.adb    /^      function 
Address_To_Call_State is new$/
+Address_To_TCB_Ptr/f   ada-src/2ataspri.ads    /^   function 
Address_To_TCB_Ptr is new$/
+Advanced usage tex-src/gzip.texi       /address@hidden Advanced usage, 
Environment, Invoking gzip, /
+Aligned_Cons   c-src/emacs/src/lisp.h  4670
+Aligned_String c-src/emacs/src/lisp.h  4676
+AppendTextString       pas-src/common.pas      /^function 
AppendTextString;(*($/
+Arith_Comparison       c-src/emacs/src/lisp.h  3497
+Asm_help       c-src/etags.c   504
+Asm_labels     c-src/etags.c   /^Asm_labels (FILE *inf)$/
+Asm_suffixes   c-src/etags.c   493
+B      cp-src/c.C      54
+B      cp-src/c.C      74
+B      cp-src/c.C      122
+B::B   cp-src/c.C      /^void B::B() {}$/
+B::f   cp-src/c.C      /^class B<int> { void f() {} };$/
+B::~B  cp-src/c.C      /^    ~B() {};$/
+BE_Node        cp-src/c.C      77
+BE_Node::BE_Node       cp-src/c.C      /^void BE_Node::BE_Node() {}$/
+BITS_PER_BITS_WORD     c-src/emacs/src/lisp.h  125
+BITS_PER_BITS_WORD     c-src/emacs/src/lisp.h  129
+BITS_PER_CHAR  c-src/emacs/src/lisp.h  136
+BITS_PER_EMACS_INT     c-src/emacs/src/lisp.h  139
+BITS_PER_LONG  c-src/emacs/src/lisp.h  138
+BITS_PER_SHORT c-src/emacs/src/lisp.h  137
+BITS_WORD_MAX  c-src/emacs/src/lisp.h  124
+BITS_WORD_MAX  c-src/emacs/src/lisp.h  128
+BLOCK  c-src/emacs/src/gmalloc.c       /^#define BLOCK(A)      (((char *) (A) 
- _heapbase) \/ BLO/
+BLOCKIFY       c-src/emacs/src/gmalloc.c       /^#define BLOCKIFY(SIZE)        
(((SIZE) + BLOCKSIZE - 1) \//
+BLOCKLOG       c-src/emacs/src/gmalloc.c       125
+BLOCKSIZE      c-src/emacs/src/gmalloc.c       126
+BOOL_VECTOR_BITS_PER_CHAR      c-src/emacs/src/lisp.h  114
+BOOL_VECTOR_BITS_PER_CHAR      c-src/emacs/src/lisp.h  115
+BOOL_VECTOR_P  c-src/emacs/src/lisp.h  /^BOOL_VECTOR_P (Lisp_Object a)$/
+BREAK  erl-src/lines.erl       /^-define(BREAK, 10).   % how many lines to 
store in e/
+BUFFERP        c-src/emacs/src/lisp.h  /^BUFFERP (Lisp_Object a)$/
+BUFFERSIZE     objc-src/Subprocess.h   43
+BUFFER_OBJFWDP c-src/emacs/src/lisp.h  /^BUFFER_OBJFWDP (union Lisp_Fwd *a)$/
+BYTE_MARK_STACK        c-src/emacs/src/lisp.h  3181
+Bar    perl-src/kai-test.pl    /^package Bar;$/
+Bar::f4        perl-src/kai-test.pl    /^sub Bar::f4 {$/
+Bar::f5        perl-src/kai-test.pl    /^sub f5 {$/
+Barrier_Function_Pointer/t     ada-src/etags-test-for.ada      /^   type 
Barrier_Function_Pointer is access$/
+Bidule/b       ada-src/etags-test-for.ada      /^  protected body Bidule is$/
+Bidule/b       ada-src/waroquiers.ada  /^  protected body Bidule is$/
+Bidule/t       ada-src/etags-test-for.ada      /^  protected Bidule is$/
+Bidule/t       ada-src/waroquiers.ada  /^  protected Bidule is$/
+Body_Required/f        ada-src/etags-test-for.ada      /^   function 
Body_Required$/
+Boo    cp-src/c.C      129
+Boo::Boo       cp-src/c.C      /^    Boo(int _i, int _a, int _b) : i(_i), 
a(_a), b(/
+Boo::Boo       cp-src/c.C      /^Boo::Boo(Boo) :$/
+Boo::a cp-src/c.C      132
+Boo::animals   cp-src/c.C      130
+Boo::b cp-src/c.C      132
+Boo::cat       cp-src/c.C      130
+Boo::cow       cp-src/c.C      131
+Boo::dog       cp-src/c.C      130
+Boo::foo       cp-src/c.C      /^    foo() {$/
+Boo::i cp-src/c.C      132
+Boo::treats    cp-src/c.C      131
+ButtonBar      pyt-src/server.py       /^def ButtonBar(frame, legend, ref, 
alternatives, co/
+CALLMANY       c-src/emacs/src/lisp.h  /^#define CALLMANY(f, array) (f) 
(ARRAYELTS (array),/
+CALLN  c-src/emacs/src/lisp.h  /^#define CALLN(f, ...) CALLMANY (f, 
((Lisp_Object [/
+CAR    c-src/emacs/src/lisp.h  /^CAR (Lisp_Object c)$/
+CAR_SAFE       c-src/emacs/src/lisp.h  /^CAR_SAFE (Lisp_Object c)$/
+CATCHER        c-src/emacs/src/lisp.h  3021
+CDR    c-src/emacs/src/lisp.h  /^CDR (Lisp_Object c)$/
+CDR_SAFE       c-src/emacs/src/lisp.h  /^CDR_SAFE (Lisp_Object c)$/
+CFLAGS make-src/Makefile       88
+CHAR   c-src/etags.c   /^#define CHAR(x)               ((unsigned int)(x) & 
(CHARS - 1))/
+CHAR   y-src/cccp.c    7
+CHARACTERBITS  c-src/emacs/src/lisp.h  2457
+CHARS  c-src/etags.c   157
+CHARTAB_SIZE_BITS      c-src/emacs/src/lisp.h  1565
+CHARTAB_SIZE_BITS_0    c-src/emacs/src/lisp.h  1567
+CHARTAB_SIZE_BITS_1    c-src/emacs/src/lisp.h  1568
+CHARTAB_SIZE_BITS_2    c-src/emacs/src/lisp.h  1569
+CHARTAB_SIZE_BITS_3    c-src/emacs/src/lisp.h  1570
+CHAR_ALT       c-src/emacs/src/lisp.h  2445
+CHAR_CLASS_MAX_LENGTH  c-src/emacs/src/regex.h 593
+CHAR_CLASS_MAX_LENGTH  c-src/emacs/src/regex.h 597
+CHAR_CLASS_MAX_LENGTH  c-src/emacs/src/regex.h 605
+CHAR_CTL       c-src/emacs/src/lisp.h  2449
+CHAR_HYPER     c-src/emacs/src/lisp.h  2447
+CHAR_META      c-src/emacs/src/lisp.h  2450
+CHAR_MODIFIER_MASK     c-src/emacs/src/lisp.h  2452
+CHAR_SHIFT     c-src/emacs/src/lisp.h  2448
+CHAR_SUPER     c-src/emacs/src/lisp.h  2446
+CHAR_TABLE_EXTRA_SLOTS c-src/emacs/src/lisp.h  /^CHAR_TABLE_EXTRA_SLOTS 
(struct Lisp_Char_Table *ct/
+CHAR_TABLE_P   c-src/emacs/src/lisp.h  /^CHAR_TABLE_P (Lisp_Object a)$/
+CHAR_TABLE_REF c-src/emacs/src/lisp.h  /^CHAR_TABLE_REF (Lisp_Object ct, int 
idx)$/
+CHAR_TABLE_REF_ASCII   c-src/emacs/src/lisp.h  /^CHAR_TABLE_REF_ASCII 
(Lisp_Object ct, ptrdiff_t id/
+CHAR_TABLE_SET c-src/emacs/src/lisp.h  /^CHAR_TABLE_SET (Lisp_Object ct, int 
idx, Lisp_Obje/
+CHAR_TABLE_STANDARD_SLOTS      c-src/emacs/src/lisp.h  1697
+CHAR_TYPE_SIZE cccp.y  87
+CHAR_TYPE_SIZE y-src/cccp.y    87
+CHECKEROPTS    make-src/Makefile       92
+CHECK_ARRAY    c-src/emacs/src/lisp.h  /^CHECK_ARRAY (Lisp_Object x, 
Lisp_Object predicate)/
+CHECK_BOOL_VECTOR      c-src/emacs/src/lisp.h  /^CHECK_BOOL_VECTOR 
(Lisp_Object x)$/
+CHECK_BUFFER   c-src/emacs/src/lisp.h  /^CHECK_BUFFER (Lisp_Object x)$/
+CHECK_CONS     c-src/emacs/src/lisp.h  /^CHECK_CONS (Lisp_Object x)$/
+CHECK_LISP_OBJECT_TYPE c-src/emacs/src/lisp.h  571
+CHECK_LISP_OBJECT_TYPE c-src/emacs/src/lisp.h  572
+CHECK_LISP_OBJECT_TYPE c-src/emacs/src/lisp.h  572
+CHECK_LISP_OBJECT_TYPE c-src/emacs/src/lisp.h  579
+CHECK_LISP_OBJECT_TYPE c-src/emacs/src/lisp.h  579
+CHECK_LIST     c-src/emacs/src/lisp.h  /^CHECK_LIST (Lisp_Object x)$/
+CHECK_LIST_CONS        c-src/emacs/src/lisp.h  /^# define CHECK_LIST_CONS(x, 
y) lisp_h_CHECK_LIST_C/
+CHECK_NATNUM   c-src/emacs/src/lisp.h  /^CHECK_NATNUM (Lisp_Object x)$/
+CHECK_NUMBER   c-src/emacs/src/lisp.h  /^# define CHECK_NUMBER(x) 
lisp_h_CHECK_NUMBER (x)$/
+CHECK_NUMBER_CAR       c-src/emacs/src/lisp.h  /^CHECK_NUMBER_CAR (Lisp_Object 
x)$/
+CHECK_NUMBER_CDR       c-src/emacs/src/lisp.h  /^CHECK_NUMBER_CDR (Lisp_Object 
x)$/
+CHECK_NUMBER_COERCE_MARKER     c-src/emacs/src/lisp.h  /^#define 
CHECK_NUMBER_COERCE_MARKER(x)                                 \\$/
+CHECK_NUMBER_OR_FLOAT  c-src/emacs/src/lisp.h  /^CHECK_NUMBER_OR_FLOAT 
(Lisp_Object x)$/
+CHECK_NUMBER_OR_FLOAT_COERCE_MARKER    c-src/emacs/src/lisp.h  /^#define 
CHECK_NUMBER_OR_FLOAT_COERCE_MARKER(x)                                /
+CHECK_PROCESS  c-src/emacs/src/lisp.h  /^CHECK_PROCESS (Lisp_Object x)$/
+CHECK_RANGED_INTEGER   c-src/emacs/src/lisp.h  /^#define 
CHECK_RANGED_INTEGER(x, lo, hi)                                       \\$/
+CHECK_STRING_CAR       c-src/emacs/src/lisp.h  /^CHECK_STRING_CAR (Lisp_Object 
x)$/
+CHECK_SYMBOL   c-src/emacs/src/lisp.h  /^# define CHECK_SYMBOL(x) 
lisp_h_CHECK_SYMBOL (x)$/
+CHECK_TYPE     c-src/emacs/src/lisp.h  /^# define CHECK_TYPE(ok, predicate, x) 
lisp_h_CHECK/
+CHECK_TYPE_RANGED_INTEGER      c-src/emacs/src/lisp.h  /^#define 
CHECK_TYPE_RANGED_INTEGER(type, x) \\$/
+CHECK_VECTOR   c-src/emacs/src/lisp.h  /^CHECK_VECTOR (Lisp_Object x)$/
+CHECK_VECTOR_OR_STRING c-src/emacs/src/lisp.h  /^CHECK_VECTOR_OR_STRING 
(Lisp_Object x)$/
+CHECK_WINDOW   c-src/emacs/src/lisp.h  /^CHECK_WINDOW (Lisp_Object x)$/
+CK_ABS_C       y-src/parse.y   /^#define CK_ABS_C(x)   if((x)<MIN_COL || 
(x)>MAX_COL)/
+CK_ABS_C       parse.y /^#define CK_ABS_C(x)   if((x)<MIN_COL || (x)>MAX_COL)/
+CK_ABS_R       y-src/parse.y   /^#define CK_ABS_R(x)   if((x)<MIN_ROW || 
(x)>MAX_ROW)/
+CK_ABS_R       parse.y /^#define CK_ABS_R(x)   if((x)<MIN_ROW || (x)>MAX_ROW)/
+CK_REL_C       y-src/parse.y   /^#define CK_REL_C(x)   if(   ((x)>0 && 
MAX_COL-(x)<cu/
+CK_REL_C       parse.y /^#define CK_REL_C(x)   if(   ((x)>0 && MAX_COL-(x)<cu/
+CK_REL_R       y-src/parse.y   /^#define CK_REL_R(x)   if(   ((x)>0 && 
MAX_ROW-(x)<cu/
+CK_REL_R       parse.y /^#define CK_REL_R(x)   if(   ((x)>0 && MAX_ROW-(x)<cu/
+CMultiChannelCSC19_3D  cp-src/c.C      2
+CMultiChannelCSC19_3D::cscInitTime     cp-src/c.C      7
+CMultiChannelCSC19_3D::cscSegmentationTime     cp-src/c.C      8
+CMultiChannelCSC19_3D::execute cp-src/c.C      /^        void 
execute(CPluginCSCState& p, int w, in/
+CMultiChannelCSC19_3D::ipc3dCSC19      cp-src/c.C      6
+CMultiChannelCSC19_3D::mcCSC   cp-src/c.C      6
+CMultiChannelCSC19_3D::outputTime      cp-src/c.C      9
+CMultiChannelCSC19_3D::setup   cp-src/c.C      5
+CNL    c-src/etags.c   /^#define CNL()                                         
                \\$/
+CNL_SAVE_DEFINEDEF     c-src/etags.c   /^#define CNL_SAVE_DEFINEDEF()          
                                \\$/
+COLORS cp-src/screen.hpp       11
+COLORS::BLACK  cp-src/screen.hpp       12
+COLORS::BLUE   cp-src/screen.hpp       13
+COLORS::BROWN  cp-src/screen.hpp       18
+COLORS::CYAN   cp-src/screen.hpp       15
+COLORS::DARKGRAY       cp-src/screen.hpp       20
+COLORS::GREEN  cp-src/screen.hpp       14
+COLORS::LIGHTBLUE      cp-src/screen.hpp       21
+COLORS::LIGHTCYAN      cp-src/screen.hpp       23
+COLORS::LIGHTGRAY      cp-src/screen.hpp       19
+COLORS::LIGHTGREEN     cp-src/screen.hpp       22
+COLORS::LIGHTMAGENTA   cp-src/screen.hpp       25
+COLORS::LIGHTRED       cp-src/screen.hpp       24
+COLORS::MAGENTA        cp-src/screen.hpp       17
+COLORS::RED    cp-src/screen.hpp       16
+COLORS::WHITE  cp-src/screen.hpp       27
+COLORS::YELLOW cp-src/screen.hpp       26
+COMPILEDP      c-src/emacs/src/lisp.h  /^COMPILEDP (Lisp_Object a)$/
+COMPILED_ARGLIST       c-src/emacs/src/lisp.h  2431
+COMPILED_BYTECODE      c-src/emacs/src/lisp.h  2432
+COMPILED_CONSTANTS     c-src/emacs/src/lisp.h  2433
+COMPILED_DOC_STRING    c-src/emacs/src/lisp.h  2435
+COMPILED_INTERACTIVE   c-src/emacs/src/lisp.h  2436
+COMPILED_STACK_DEPTH   c-src/emacs/src/lisp.h  2434
+CONDITION_CASE c-src/emacs/src/lisp.h  3021
+CONSP  c-src/emacs/src/lisp.h  /^# define CONSP(x) lisp_h_CONSP (x)$/
+CONSTYPE_HEAP  c-src/emacs/src/lisp.h  3739
+CONSTYPE_PURE  c-src/emacs/src/lisp.h  3739
+CONS_TO_INTEGER        c-src/emacs/src/lisp.h  /^#define CONS_TO_INTEGER(cons, 
type, var)                              \\$/
+CONVERT_CHARSTRING_TO_VALUE    pas-src/common.pas      /^procedure 
CONVERT_CHARSTRING_TO_VALUE;(*($/
+CPPFLAGS       make-src/Makefile       49
+CPSRC  Makefile        /^CPSRC=$(addprefix .\/cp-src\/,c.C abstract.C abstrac/
+CSRC   Makefile        /^CSRC=$(addprefix .\/c-src\/,abbrev.c .\/\/c.c 
torture./
+CTAGS  Makefile        /^CTAGS: FRC ${infiles}$/
+CTAGS  c-src/etags.c   146
+CTAGS  c-src/etags.c   147
+CTAGS  c-src/etags.c   149
+CTAGS_PROG     Makefile        /^CTAGS_PROG=..\/..\/lib-src\/ctags$/
+C_AUTO c-src/etags.c   2198
+C_EXT  c-src/etags.c   2193
+C_JAVA c-src/etags.c   2197
+C_PLAIN        c-src/etags.c   2194
+C_PLPL c-src/etags.c   2195
+C_STAR c-src/etags.c   2196
+C_entries      c-src/etags.c   /^C_entries (int c_ext, FILE *inf)$/
+C_stab_entry   c-src/etags.c   2271
+C_symtype      c-src/etags.c   /^C_symtype (char *str, int len, int c_ext)$/
+ChangeFileType pas-src/common.pas      /^function ChangeFileType; (*(FileName 
: NameString;/
+Choice cp-src/abstract.H       768
+Choice::ChangeH        cp-src/abstract.C       /^void Choice::ChangeH(int nh)$/
+Choice::ChangeW        cp-src/abstract.C       /^void Choice::ChangeW(int nw)$/
+Choice::Choice cp-src/abstract.C       /^Choice::Choice(Tree_Node *b1, 
Tree_Node *b2)$/
+Choice::Get_Textual_H  cp-src/abstract.C       /^int Choice::Get_Textual_H()$/
+Choice::Get_Textual_W  cp-src/abstract.C       /^int Choice::Get_Textual_W()$/
+Choice::SetCollapsed   cp-src/abstract.C       /^void 
Choice::SetCollapsed(char t)$/
+Choice::SetDimensions  cp-src/abstract.C       /^void 
Choice::SetDimensions(void)$/
+Choice::SetFather      cp-src/abstract.C       /^void 
Choice::SetFather(Tree_Node *f)$/
+Choice::SetPosition    cp-src/abstract.C       /^void 
Choice::SetPosition(Coord xx, Coord yy)$/
+Choice::SetTerminalPos cp-src/abstract.C       /^void 
Choice::SetTerminalPos()$/
+Choice::SetTextual     cp-src/abstract.C       /^void Choice::SetTextual(char 
t, char s)$/
+Choice::bex1   cp-src/abstract.H       770
+Choice::bex2   cp-src/abstract.H       770
+Choice::border cp-src/abstract.H       774
+Choice::delta  cp-src/abstract.H       773
+Choice::havebox        cp-src/abstract.H       772
+Choice::xl     cp-src/abstract.H       771
+Choice::yl     cp-src/abstract.H       771
+Choice::yl1    cp-src/abstract.H       771
+Cjava_entries  c-src/etags.c   /^Cjava_entries (FILE *inf)$/
+Cjava_help     c-src/etags.c   551
+Cjava_suffixes c-src/etags.c   549
+Clear/p        ada-src/2ataspri.adb    /^   procedure Clear (Cell : in out 
TAS_Cell) is$/
+Clear/p        ada-src/2ataspri.ads    /^   procedure Clear        (Cell : in 
out TAS_Cell)/
+Cobol_help     c-src/etags.c   558
+Cobol_paragraphs       c-src/etags.c   /^Cobol_paragraphs (FILE *inf)$/
+Cobol_suffixes c-src/etags.c   556
+Comment        cp-src/abstract.H       105
+Comment::Comment       cp-src/abstract.C       /^Comment::Comment()$/
+Comment::SetComment    cp-src/abstract.C       /^void Comment::SetComment(char 
*comment)$/
+Comment::SetDimensions cp-src/abstract.C       /^void 
Comment::SetDimensions(void)$/
+Comment::SetFather     cp-src/abstract.C       /^void 
Comment::SetFather(Tree_Node *f)$/
+Comment::SetPosition   cp-src/abstract.C       /^void 
Comment::SetPosition(Coord xx, Coord yy)$/
+Comment::comm  cp-src/abstract.H       107
+Comment::~Comment      cp-src/abstract.C       /^Comment::~Comment()$/
+CommentAD      php-src/lce_functions.php       70
+CommentAD      php-src/lce_functions.php       /^      function CommentAD($/
+Comment_List   cp-src/abstract.H       122
+Comment_List::Comment_List     cp-src/abstract.C       
/^Comment_List::Comment_List(Comment *el, Comment_Li/
+Comment_List::SetDimensions    cp-src/abstract.C       /^void 
Comment_List::SetDimensions(void)$/
+Comment_List::SetFather        cp-src/abstract.C       /^void 
Comment_List::SetFather(Tree_Node *f)$/
+Comment_List::SetPosition      cp-src/abstract.C       /^void 
Comment_List::SetPosition(Coord xx, Coord yy)/
+Comment_List::elem     cp-src/abstract.H       124
+Comment_List::next     cp-src/abstract.H       125
+Communication  cp-src/abstract.H       627
+Communication::Communication   cp-src/abstract.C       
/^Communication::Communication(ID_Place *i, Tree_Nod/
+Communication::SetCollapsed    cp-src/abstract.C       /^void 
Communication::SetCollapsed(char t)$/
+Communication::SetDimensions   cp-src/abstract.C       /^void 
Communication::SetDimensions(void)$/
+Communication::SetFather       cp-src/abstract.C       /^void 
Communication::SetFather(Tree_Node *f)$/
+Communication::SetPosition     cp-src/abstract.C       /^void 
Communication::SetPosition(Coord xx, Coord yy/
+Communication::SetTextual      cp-src/abstract.C       /^void 
Communication::SetTextual(char t, char)$/
+Communication::experiment_option       cp-src/abstract.H       630
+Communication::gate_identifier cp-src/abstract.H       629
+Communication::hr      cp-src/abstract.H       632
+Communication::xl      cp-src/abstract.H       631
+Communication::yl      cp-src/abstract.H       631
+ConcatT        pas-src/common.pas      /^function ConcatT;(*($/
+Concept Index  tex-src/gzip.texi       /address@hidden Concept Index, , 
Problems, Top$/
+Cond_Signal/p  ada-src/2ataspri.adb    /^   procedure Cond_Signal (Cond : in 
out Condition_/
+Cond_Signal/p  ada-src/2ataspri.ads    /^   procedure Cond_Signal (Cond : in 
out Condition_/
+Cond_Timed_Wait/p      ada-src/2ataspri.adb    /^   procedure Cond_Timed_Wait$/
+Cond_Timed_Wait/p      ada-src/2ataspri.ads    /^   procedure Cond_Timed_Wait$/
+Cond_Wait/p    ada-src/2ataspri.adb    /^   procedure Cond_Wait (Cond : in out 
Condition_Va/
+Cond_Wait/p    ada-src/2ataspri.ads    /^   procedure Cond_Wait (Cond : in out 
Condition_Va/
+Condition_Variable/t   ada-src/2ataspri.ads    /^   type Condition_Variable is 
private;$/
+Condition_Variable/t   ada-src/2ataspri.ads    /^   type Condition_Variable 
is$/
+Configure      pyt-src/server.py       /^class Configure(Frame, ControlEdit):$/
+ConfirmQuit    pyt-src/server.py       /^def ConfirmQuit(frame, context):$/
+ControlEdit    pyt-src/server.py       /^class ControlEdit(Frame):$/
+Controls       pyt-src/server.py       /^class Controls:$/
+CopyTextString pas-src/common.pas      /^function CopyTextString;(*($/
+Copying        tex-src/gzip.texi       /address@hidden Copying, Overview, , 
Top$/
+Cplusplus_entries      c-src/etags.c   /^Cplusplus_entries (FILE *inf)$/
+Cplusplus_help c-src/etags.c   540
+Cplusplus_suffixes     c-src/etags.c   535
+Create_LL_Task/p       ada-src/2ataspri.adb    /^   procedure Create_LL_Task$/
+Create_LL_Task/p       ada-src/2ataspri.ads    /^   procedure Create_LL_Task$/
+Cstar_entries  c-src/etags.c   /^Cstar_entries (FILE *inf)$/
+Cstar_suffixes c-src/etags.c   562
+D      cp-src/fail.C   41
+D::D   cp-src/fail.C   /^              D() : ::A::T2::T(97), x(1066) {}$/
+D::x   cp-src/fail.C   44
+DAEMON_RUNNING c-src/emacs/src/lisp.h  4258
+DAEMON_RUNNING c-src/emacs/src/lisp.h  4262
+DB     cp-src/cfront.H /^#define DB(a) fprintf a$/
+DB     cp-src/cfront.H /^#define DB(a) \/**\/$/
+DEAFUN c.c     /^DEAFUN ("expand-file-name", Fexpand_file_name, Sex/
+DEBUG  c-src/etags.c   84
+DEBUG  c-src/etags.c   85
+DEBUG  c-src/etags.c   87
+DEBUG  objc-src/PackInsp.m     37
+DECLARE_GDB_SYM        c-src/emacs/src/lisp.h  /^#define DECLARE_GDB_SYM(type, 
id) type const id EX/
+DEFAULT_HASH_SIZE      c-src/emacs/src/lisp.h  1940
+DEFAULT_HASH_SIZE      c-src/emacs/src/lisp.h  1940
+DEFAULT_REHASH_SIZE    c-src/emacs/src/lisp.h  1950
+DEFAULT_REHASH_THRESHOLD       c-src/emacs/src/lisp.h  1946
+DEFINED        cp-src/cfront.H 230
+DEFINE_GDB_SYMBOL_BEGIN        c-src/emacs/src/lisp.h  /^# define 
DEFINE_GDB_SYMBOL_BEGIN(type, id) DECLARE/
+DEFINE_GDB_SYMBOL_BEGIN        c-src/emacs/src/lisp.h  /^# define 
DEFINE_GDB_SYMBOL_BEGIN(type, id) extern /
+DEFINE_GDB_SYMBOL_END  c-src/emacs/src/lisp.h  /^# define 
DEFINE_GDB_SYMBOL_END(id) = id;$/
+DEFINE_GDB_SYMBOL_END  c-src/emacs/src/lisp.h  /^# define 
DEFINE_GDB_SYMBOL_END(val) ;$/
+DEFINE_LISP_SYMBOL     c-src/emacs/src/lisp.h  /^#define 
DEFINE_LISP_SYMBOL(name) \\$/
+DEFINE_NON_NIL_Q_SYMBOL_MACROS c-src/emacs/src/lisp.h  755
+DEFSYM c-src/emacs/src/lisp.h  /^#define DEFSYM(sym, name) \/* empty *\/$/
+DEFSYM c-src/emacs/src/lisp.h  /^LISP_MACRO_DEFUN (SYMBOL_CONSTANT_P, int, 
(Lisp_Ob/
+DEFUN  c-src/emacs/src/lisp.h  /^#define DEFUN(lname, fnname, sname, minargs, 
maxar/
+DEFUN  c-src/emacs/src/lisp.h  /^#define DEFUN(lname, fnname, sname, minargs, 
maxar/
+DEFUN_ARGS_0   c-src/emacs/src/lisp.h  714
+DEFUN_ARGS_1   c-src/emacs/src/lisp.h  715
+DEFUN_ARGS_2   c-src/emacs/src/lisp.h  716
+DEFUN_ARGS_3   c-src/emacs/src/lisp.h  717
+DEFUN_ARGS_4   c-src/emacs/src/lisp.h  718
+DEFUN_ARGS_5   c-src/emacs/src/lisp.h  719
+DEFUN_ARGS_6   c-src/emacs/src/lisp.h  721
+DEFUN_ARGS_7   c-src/emacs/src/lisp.h  723
+DEFUN_ARGS_8   c-src/emacs/src/lisp.h  725
+DEFUN_ARGS_MANY        c-src/emacs/src/lisp.h  712
+DEFUN_ARGS_UNEVALLED   c-src/emacs/src/lisp.h  713
+DEFUN_func2    c.c     /^DEFUN_func2()$/
+DEFVAR_BOOL    c-src/emacs/src/lisp.h  /^#define DEFVAR_BOOL(lname, vname, 
doc)                \\$/
+DEFVAR_BUFFER_DEFAULTS c-src/emacs/src/lisp.h  /^#define 
DEFVAR_BUFFER_DEFAULTS(lname, vname, doc)     /
+DEFVAR_INT     c-src/emacs/src/lisp.h  /^#define DEFVAR_INT(lname, vname, doc) 
        \\$/
+DEFVAR_KBOARD  c-src/emacs/src/lisp.h  /^#define DEFVAR_KBOARD(lname, vname, 
doc)                      \\$/
+DEFVAR_LISP    c-src/emacs/src/lisp.h  /^#define DEFVAR_LISP(lname, vname, 
doc)                \\$/
+DEFVAR_LISP_NOPRO      c-src/emacs/src/lisp.h  /^#define 
DEFVAR_LISP_NOPRO(lname, vname, doc)  \\$/
+DEF_SEEN       cp-src/cfront.H 232
+DEL    cp-src/cfront.H /^#define DEL(p) if (p && (p->permanent==0)) p->del(/
+DEVICE_LAST    c-src/h.h       24
+DEVICE_SWP     c-src/h.h       23
+DOS_NT c-src/etags.c   117
+DOS_NT c-src/etags.c   118
+DUMPED c-src/emacs/src/gmalloc.c       80
+Date::minus    cp-src/functions.cpp    /^void Date::minus ( int days , int 
month , int year/
+Date::operator ++      cp-src/functions.cpp    /^Date & Date::operator ++ ( 
void ){$/
+Date::operator +=      cp-src/functions.cpp    /^Date & Date::operator += ( 
int days ){$/
+Date::operator -       cp-src/functions.cpp    /^int Date::operator - ( Date d 
){$/
+Date::operator --      cp-src/functions.cpp    /^Date & Date::operator -- ( 
void ){$/
+Date::operator -=      cp-src/functions.cpp    /^Date & Date::operator -= ( 
int days ){$/
+Date::operator <       cp-src/functions.cpp    /^int Date::operator < ( Date d 
) {$/
+Date::operator =       cp-src/functions.cpp    /^Date & Date::operator = ( 
Date d ){$/
+Date::operator ==      cp-src/functions.cpp    /^int Date::operator == ( Date 
d ) {$/
+Date::operator >       cp-src/functions.cpp    /^int Date::operator > ( Date d 
) {$/
+Date::plus     cp-src/functions.cpp    /^void Date::plus ( int days , int 
month , int year /
+Date::setDate  cp-src/functions.cpp    /^void Date::setDate ( int d , int m , 
int y ){$/
+Date::shift    cp-src/functions.cpp    /^void Date::shift ( void ){\/\/Shift 
this date to pre/
+Debug  cp-src/functions.cpp    /^void Debug ( int lineno, int level, char* 
func , c/
+Definition     cp-src/abstract.H       382
+Definition::Definition cp-src/abstract.C       
/^Definition::Definition(Tree_Node *b, Proc_List *p,/
+Definition::GetPath    cp-src/abstract.H       /^ char *GetPath() { 
return(path);};$/
+Definition::SetDimensions      cp-src/abstract.C       /^void 
Definition::SetDimensions(void)$/
+Definition::SetFather  cp-src/abstract.C       /^void 
Definition::SetFather(Tree_Node *f)$/
+Definition::SetPath    cp-src/abstract.C       /^void Definition::SetPath(char 
*p, char n, int& np,/
+Definition::SetPosition        cp-src/abstract.C       /^void 
Definition::SetPosition(Coord xx, Coord yy)$/
+Definition::bex        cp-src/abstract.H       384
+Definition::data_list  cp-src/abstract.H       386
+Definition::path       cp-src/abstract.H       387
+Definition::process_list       cp-src/abstract.H       385
+Disable        cp-src/abstract.H       746
+Disable::Disable       cp-src/abstract.C       /^Disable::Disable(Tree_Node 
*b1, Tree_Node *b2)$/
+Disable::Get_Textual_H cp-src/abstract.C       /^int Disable::Get_Textual_H()$/
+Disable::Get_Textual_W cp-src/abstract.C       /^int Disable::Get_Textual_W()$/
+Disable::SetCollapsed  cp-src/abstract.C       /^void 
Disable::SetCollapsed(char t)$/
+Disable::SetDimensions cp-src/abstract.C       /^void 
Disable::SetDimensions(void)$/
+Disable::SetFather     cp-src/abstract.C       /^void 
Disable::SetFather(Tree_Node *f)$/
+Disable::SetPosition   cp-src/abstract.C       /^void 
Disable::SetPosition(Coord xx, Coord yy)$/
+Disable::SetTerminalPos        cp-src/abstract.C       /^void 
Disable::SetTerminalPos()$/
+Disable::SetTextual    cp-src/abstract.C       /^void Disable::SetTextual(char 
t, char s)$/
+Disable::bex1  cp-src/abstract.H       748
+Disable::bex2  cp-src/abstract.H       748
+Disable::border        cp-src/abstract.H       751
+Disable::havebox       cp-src/abstract.H       750
+Disable::xl    cp-src/abstract.H       749
+Disable::yl    cp-src/abstract.H       749
+Disable::yl2   cp-src/abstract.H       749
+DisposeANameList       pas-src/common.pas      /^procedure DisposeANameList( $/
+DisposeNameList        pas-src/common.pas      /^procedure DisposeNameList;$/
+ELEM_I c-src/h.h       3
+ELSRC  Makefile        /^ELSRC=$(addprefix .\/el-src\/,TAGTEST.EL 
emacs\/lisp\//
+EMACS_INT      c-src/emacs/src/lisp.h  91
+EMACS_INT      c-src/emacs/src/lisp.h  96
+EMACS_INT      c-src/emacs/src/lisp.h  103
+EMACS_INT_MAX  c-src/emacs/src/lisp.h  93
+EMACS_INT_MAX  c-src/emacs/src/lisp.h  98
+EMACS_INT_MAX  c-src/emacs/src/lisp.h  105
+EMACS_LISP_H   c-src/emacs/src/lisp.h  22
+EMACS_NAME     c-src/etags.c   786
+EMACS_UINT     c-src/emacs/src/lisp.h  92
+EMACS_UINT     c-src/emacs/src/lisp.h  97
+EMACS_UINT     c-src/emacs/src/lisp.h  104
+ENTRY  c-src/sysdep.h  /^#define       ENTRY(name)                             
                              \\$/
+ENUM_BF        c-src/emacs/src/lisp.h  /^#define ENUM_BF(TYPE) unsigned int$/
+ENUM_BF        c-src/emacs/src/lisp.h  /^#define ENUM_BF(TYPE) enum TYPE$/
+ENUM_BF        c-src/emacs/src/lisp.h  /^  ENUM_BF (symbol_redirect) redirect 
: 3;$/
+ENUM_BF        c-src/emacs/src/lisp.h  /^  ENUM_BF (Lisp_Misc_Type) type : 16; 
        \/* = Lisp_M/
+ENUM_BF        c-src/emacs/src/lisp.h  /^  ENUM_BF (Lisp_Misc_Type) type : 16; 
        \/* = Lisp_M/
+ENUM_BF        c-src/emacs/src/lisp.h  /^    ENUM_BF (Lisp_Misc_Type) type : 
16;       \/* = Lisp_/
+ENUM_BF        c-src/emacs/src/lisp.h  /^    ENUM_BF (Lisp_Misc_Type) type : 
16;       \/* = Lisp_/
+ENUM_BF        c-src/emacs/src/lisp.h  /^    ENUM_BF (Lisp_Misc_Type) type : 
16;       \/* = Lisp_/
+ENUM_BF        c-src/emacs/src/lisp.h  /^    ENUM_BF (specbind_tag) kind : 
CHAR_BIT;$/
+ENUM_BF        c-src/emacs/src/lisp.h  /^      ENUM_BF (specbind_tag) kind : 
CHAR_BIT;$/
+ENUM_BF        c-src/emacs/src/lisp.h  /^      ENUM_BF (specbind_tag) kind : 
CHAR_BIT;$/
+ENUM_BF        c-src/emacs/src/lisp.h  /^      ENUM_BF (specbind_tag) kind : 
CHAR_BIT;$/
+ENUM_BF        c-src/emacs/src/lisp.h  /^      ENUM_BF (specbind_tag) kind : 
CHAR_BIT;$/
+ENUM_BF        c-src/emacs/src/lisp.h  /^      ENUM_BF (specbind_tag) kind : 
CHAR_BIT;$/
+ENUM_BF        c-src/emacs/src/lisp.h  /^      ENUM_BF (specbind_tag) kind : 
CHAR_BIT;$/
+EQ     c-src/emacs/src/lisp.h  /^# define EQ(x, y) lisp_h_EQ (x, y)$/
+EQUAL  y-src/cccp.c    12
+ERLSRC Makefile        /^ERLSRC=$(addprefix .\/erl-src\/,gs_dialog.erl lines./
+ERROR  y-src/parse.y   303
+ERROR  parse.y 303
+ERROR  y-src/cccp.c    9
+ETAGS  Makefile        /^ETAGS: FRC ${infiles}$/
+ETAGS_PROG     Makefile        /^ETAGS_PROG=..\/..\/lib-src\/etags$/
+EXFUN  c-src/emacs/src/lisp.h  /^#define EXFUN(fnname, maxargs) \\$/
+EXTERNALLY_VISIBLE     c-src/emacs/src/keyboard.c      3497
+EXTERNALLY_VISIBLE     c-src/emacs/src/keyboard.c      4372
+EmptyNmStr     pas-src/common.pas      /^function EmptyNmStr(* : 
NameString*);$/
+Enable cp-src/abstract.H       723
+Enable::Enable cp-src/abstract.C       /^Enable::Enable(Tree_Node *b1, ID_List 
*g_i_l, Tree/
+Enable::Get_Textual_H  cp-src/abstract.C       /^int Enable::Get_Textual_H()$/
+Enable::Get_Textual_W  cp-src/abstract.C       /^int Enable::Get_Textual_W()$/
+Enable::SetCollapsed   cp-src/abstract.C       /^void 
Enable::SetCollapsed(char t)$/
+Enable::SetDimensions  cp-src/abstract.C       /^void 
Enable::SetDimensions(void)$/
+Enable::SetFather      cp-src/abstract.C       /^void 
Enable::SetFather(Tree_Node *f)$/
+Enable::SetPosition    cp-src/abstract.C       /^void 
Enable::SetPosition(Coord xx, Coord yy)$/
+Enable::SetTerminalPos cp-src/abstract.C       /^void 
Enable::SetTerminalPos()$/
+Enable::SetTextual     cp-src/abstract.C       /^void Enable::SetTextual(char 
t, char s)$/
+Enable::Yclose cp-src/abstract.H       727
+Enable::bex1   cp-src/abstract.H       725
+Enable::bex2   cp-src/abstract.H       725
+Enable::border cp-src/abstract.H       729
+Enable::gate_id_list   cp-src/abstract.H       726
+Enable::havebox        cp-src/abstract.H       728
+Enable::xid    cp-src/abstract.H       727
+Enable::xl     cp-src/abstract.H       727
+Enable::xl2    cp-src/abstract.H       727
+Enable::yid    cp-src/abstract.H       727
+Enable::yl1    cp-src/abstract.H       727
+Enable::yl2    cp-src/abstract.H       727
+Environment    tex-src/gzip.texi       /address@hidden Environment, Tapes, 
Advanced usage, Top$/
+Equality       cp-src/abstract.H       473
+Equality::Equality     cp-src/abstract.C       /^Equality::Equality()$/
+Equality::Equality     cp-src/abstract.C       /^Equality::Equality(Tree_Node 
*ex1, Tree_Node *ex2)/
+Equality::SetCollapsed cp-src/abstract.C       /^void 
Equality::SetCollapsed(char t)$/
+Equality::SetDimensions        cp-src/abstract.C       /^void 
Equality::SetDimensions(void)$/
+Equality::SetFather    cp-src/abstract.C       /^void 
Equality::SetFather(Tree_Node *f)$/
+Equality::SetPosition  cp-src/abstract.C       /^void 
Equality::SetPosition(Coord xx, Coord yy)$/
+Equality::express1     cp-src/abstract.H       475
+Equality::express2     cp-src/abstract.H       476
+Erlang_functions       c-src/etags.c   /^Erlang_functions (FILE *inf)$/
+Erlang_help    c-src/etags.c   567
+Erlang_suffixes        c-src/etags.c   565
+ErrStrToNmStr  pas-src/common.pas      /^function ErrStrToNmStr;(*($/
+Error_Information/t    ada-src/2ataspri.ads    /^   type Error_Information is 
new Interfaces.C.POSI/
+Exclam cp-src/abstract.H       578
+Exclam::Exclam cp-src/abstract.C       /^Exclam::Exclam(Tree_Node *v_e)$/
+Exclam::SetCollapsed   cp-src/abstract.C       /^void 
Exclam::SetCollapsed(char t)$/
+Exclam::SetDimensions  cp-src/abstract.C       /^void 
Exclam::SetDimensions(void)$/
+Exclam::SetFather      cp-src/abstract.C       /^void 
Exclam::SetFather(Tree_Node *f)$/
+Exclam::SetPosition    cp-src/abstract.C       /^void 
Exclam::SetPosition(Coord xx, Coord yy)$/
+Exclam::value_exp      cp-src/abstract.H       580
+Exit   cp-src/abstract.H       407
+Exit::Exit     cp-src/abstract.C       /^Exit::Exit(ID_List *sl)$/
+Exit::SetDimensions    cp-src/abstract.C       /^void 
Exit::SetDimensions(void)$/
+Exit::SetFather        cp-src/abstract.C       /^void 
Exit::SetFather(Tree_Node *f)$/
+Exit::SetPosition      cp-src/abstract.C       /^void Exit::SetPosition(Coord 
x1, Coord y1, Coord x/
+Exit::sort_list        cp-src/abstract.H       409
+Exit_Bex       cp-src/abstract.H       810
+Exit_Bex::Exit_Bex     cp-src/abstract.C       
/^Exit_Bex::Exit_Bex(Exit_Entry_List *l)$/
+Exit_Bex::SetCollapsed cp-src/abstract.C       /^void 
Exit_Bex::SetCollapsed(char t)$/
+Exit_Bex::SetDimensions        cp-src/abstract.C       /^void 
Exit_Bex::SetDimensions(void)$/
+Exit_Bex::SetFather    cp-src/abstract.C       /^void 
Exit_Bex::SetFather(Tree_Node *f)$/
+Exit_Bex::SetPosition  cp-src/abstract.C       /^void 
Exit_Bex::SetPosition(Coord xx, Coord yy)$/
+Exit_Bex::SetTextual   cp-src/abstract.C       /^void 
Exit_Bex::SetTextual(char t, char s)$/
+Exit_Bex::Xclose       cp-src/abstract.H       813
+Exit_Bex::Xopen        cp-src/abstract.H       813
+Exit_Bex::border       cp-src/abstract.H       815
+Exit_Bex::entry_list   cp-src/abstract.H       812
+Exit_Bex::havebox      cp-src/abstract.H       814
+Exit_Entry     cp-src/abstract.H       165
+Exit_Entry::Exit_Entry cp-src/abstract.C       /^Exit_Entry::Exit_Entry() $/
+Exit_Entry::SetDimensions      cp-src/abstract.C       /^void 
Exit_Entry::SetDimensions(void)$/
+Exit_Entry::SetFather  cp-src/abstract.C       /^void 
Exit_Entry::SetFather(Tree_Node *f)$/
+Exit_Entry::SetPosition        cp-src/abstract.C       /^void 
Exit_Entry::SetPosition(Coord xx, Coord yy)$/
+Exit_Entry_List        cp-src/abstract.H       179
+Exit_Entry_List::Exit_Entry_List       cp-src/abstract.C       
/^Exit_Entry_List::Exit_Entry_List(Tree_Node *el, Ex/
+Exit_Entry_List::SetCollapsed  cp-src/abstract.C       /^void 
Exit_Entry_List::SetCollapsed(char t)$/
+Exit_Entry_List::SetDimensions cp-src/abstract.C       /^void 
Exit_Entry_List::SetDimensions(void)$/
+Exit_Entry_List::SetFather     cp-src/abstract.C       /^void 
Exit_Entry_List::SetFather(Tree_Node *f)$/
+Exit_Entry_List::SetPosition   cp-src/abstract.C       /^void 
Exit_Entry_List::SetPosition(Coord xx, Coord /
+Exit_Entry_List::elem  cp-src/abstract.H       181
+Exit_Entry_List::next  cp-src/abstract.H       182
+Exit_LL_Task/p ada-src/2ataspri.adb    /^   procedure Exit_LL_Task is$/
+Exit_LL_Task/p ada-src/2ataspri.ads    /^   procedure Exit_LL_Task;$/
+Exper_Off      cp-src/abstract.H       195
+Exper_Off::Exper_Off   cp-src/abstract.C       /^Exper_Off::Exper_Off()$/
+Exper_Off::SetDimensions       cp-src/abstract.C       /^void 
Exper_Off::SetDimensions(void)$/
+Exper_Off::SetFather   cp-src/abstract.C       /^void 
Exper_Off::SetFather(Tree_Node *f)$/
+Exper_Off::SetPosition cp-src/abstract.C       /^void 
Exper_Off::SetPosition(Coord xx, Coord yy)$/
+Exper_Off_List cp-src/abstract.H       207
+Exper_Off_List::Exper_Off_List cp-src/abstract.C       
/^Exper_Off_List::Exper_Off_List(Exper_Off *el, Expe/
+Exper_Off_List::SetCollapsed   cp-src/abstract.C       /^void 
Exper_Off_List::SetCollapsed(char t)$/
+Exper_Off_List::SetDimensions  cp-src/abstract.C       /^void 
Exper_Off_List::SetDimensions(void)$/
+Exper_Off_List::SetFather      cp-src/abstract.C       /^void 
Exper_Off_List::SetFather(Tree_Node *f)$/
+Exper_Off_List::SetPosition    cp-src/abstract.C       /^void 
Exper_Off_List::SetPosition(Coord xx, Coord y/
+Exper_Off_List::elem   cp-src/abstract.H       209
+Exper_Off_List::next   cp-src/abstract.H       210
+Experiment     cp-src/abstract.H       558
+Experiment::Experiment cp-src/abstract.C       
/^Experiment::Experiment(Exper_Off_List *e_of_l, Tre/
+Experiment::GetGuard   cp-src/abstract.H       /^ Tree_Node *GetGuard(void) { 
return(guard_option);/
+Experiment::SetCollapsed       cp-src/abstract.C       /^void 
Experiment::SetCollapsed(char t)$/
+Experiment::SetDimensions      cp-src/abstract.C       /^void 
Experiment::SetDimensions(void)$/
+Experiment::SetFather  cp-src/abstract.C       /^void 
Experiment::SetFather(Tree_Node *f)$/
+Experiment::SetPosition        cp-src/abstract.C       /^void 
Experiment::SetPosition(Coord xx, Coord yy)$/
+Experiment::SetTextual cp-src/abstract.C       /^void 
Experiment::SetTextual(char t, char)$/
+Experiment::exp_offer_list     cp-src/abstract.H       560
+Experiment::guard_option       cp-src/abstract.H       561
+ExtractCommentInfo     pas-src/common.pas      /^procedure ExtractCommentInfo; 
(*($/
+FASTCFLAGS     make-src/Makefile       55
+FILTER make-src/Makefile       58
+FINALIZERP     c-src/emacs/src/lisp.h  /^FINALIZERP (Lisp_Object x)$/
+FINAL_FREE_BLOCKS      c-src/emacs/src/gmalloc.c       135
+FIXNUM_BITS    c-src/emacs/src/lisp.h  252
+FIXNUM_OVERFLOW_P      c-src/emacs/src/lisp.h  /^#define FIXNUM_OVERFLOW_P(i) 
\\$/
+FIXNUM_OVERFLOW_P      c-src/emacs/src/lisp.h  /^LISP_MACRO_DEFUN (EQ, bool, 
(Lisp_Object x, Lisp_O/
+FLOATP c-src/emacs/src/lisp.h  /^# define FLOATP(x) lisp_h_FLOATP (x)$/
+FLOAT_TO_STRING_BUFSIZE        c-src/emacs/src/lisp.h  3927
+FORTHSRC       Makefile        /^FORTHSRC=$(addprefix 
.\/forth-src\/,test-forth.fth)$/
+FOR_EACH_ALIST_VALUE   c-src/emacs/src/lisp.h  /^#define 
FOR_EACH_ALIST_VALUE(head_var, list_var, v/
+FOR_EACH_TAIL  c-src/emacs/src/lisp.h  /^#define FOR_EACH_TAIL(hare, list, 
tortoise, n)        \\$/
+FRAMEP c-src/emacs/src/lisp.h  /^FRAMEP (Lisp_Object a)$/
+FRC    Makefile        /^FRC:;$/
+FREEFLOOD      c-src/emacs/src/gmalloc.c       1858
+FSRC   Makefile        /^FSRC=$(addprefix .\/f-src\/,entry.for entry.strange_/
+FUDGE111       cp-src/cfront.H 791
+FUN0   y-src/parse.y   /^yylex FUN0()$/
+FUN0   parse.y /^yylex FUN0()$/
+FUN1   y-src/parse.y   /^yyerror FUN1(char *, s)$/
+FUN1   y-src/parse.y   /^str_to_col FUN1(char **,str)$/
+FUN1   parse.y /^yyerror FUN1(char *, s)$/
+FUN1   parse.y /^str_to_col FUN1(char **,str)$/
+FUN2   y-src/parse.y   /^make_list FUN2(YYSTYPE, car, YYSTYPE, cdr)$/
+FUN2   y-src/parse.y   /^parse_cell_or_range FUN2(char **,ptr, struct rng */
+FUN2   parse.y /^make_list FUN2(YYSTYPE, car, YYSTYPE, cdr)$/
+FUN2   parse.y /^parse_cell_or_range FUN2(char **,ptr, struct rng */
+FUNCTIONP      c-src/emacs/src/lisp.h  /^FUNCTIONP (Lisp_Object obj)$/
+FUNCTION_KEY_OFFSET    c-src/emacs/src/keyboard.c      4766
+FUNCTION_KEY_OFFSET    c-src/emacs/src/keyboard.c      5061
+F_getit        c-src/etags.c   /^F_getit (FILE *inf)$/
+F_takeprec     c-src/etags.c   /^F_takeprec (void)$/
+Fails_t        c-src/h.h       5
+Finalize_Cond/p        ada-src/2ataspri.adb    /^   procedure Finalize_Cond 
(Cond : in out Conditio/
+Finalize_Cond/p        ada-src/2ataspri.ads    /^   procedure Finalize_Cond 
(Cond : in out Conditio/
+Finalize_Lock/p        ada-src/2ataspri.adb    /^   procedure Finalize_Lock (L 
: in out Lock) is$/
+Finalize_Lock/p        ada-src/2ataspri.ads    /^   procedure Finalize_Lock (L 
: in out Lock);$/
+Finalize_TAS_Cell/p    ada-src/2ataspri.adb    /^   procedure 
Finalize_TAS_Cell (Cell : in out TAS_/
+Finalize_TAS_Cell/p    ada-src/2ataspri.ads    /^   procedure 
Finalize_TAS_Cell   (Cell : in out TA/
+First100Chars  pas-src/common.pas      /^procedure First100Chars; (*($/
+Foo    perl-src/kai-test.pl    /^package Foo;$/
+Foo::Bar       perl-src/kai-test.pl    /^package Foo::Bar;$/
+Foo::Bar::f6   perl-src/kai-test.pl    /^sub f6 {$/
+Foo::f3        perl-src/kai-test.pl    /^sub f3 {$/
+Forth_help     c-src/etags.c   573
+Forth_suffixes c-src/etags.c   571
+Forth_words    c-src/etags.c   /^Forth_words (FILE *inf)$/
+Fortran_functions      c-src/etags.c   /^Fortran_functions (FILE *inf)$/
+Fortran_help   c-src/etags.c   579
+Fortran_suffixes       c-src/etags.c   577
+GCALIGNED      c-src/emacs/src/lisp.h  288
+GCALIGNED      c-src/emacs/src/lisp.h  290
+GCALIGNMENT    c-src/emacs/src/lisp.h  243
+GCPRO1 c-src/emacs/src/lisp.h  /^#define GCPRO1(varname) ((void) gcpro1)$/
+GCPRO1 c-src/emacs/src/lisp.h  /^#define GCPRO1(a)                             
                        \\$/
+GCPRO1 c-src/emacs/src/lisp.h  /^#define GCPRO1(a)                             
                        \\$/
+GCPRO2 c-src/emacs/src/lisp.h  /^#define GCPRO2(varname1, varname2) ((void) 
gcpro2,/
+GCPRO2 c-src/emacs/src/lisp.h  /^#define GCPRO2(a, b)                          
                        \\$/
+GCPRO2 c-src/emacs/src/lisp.h  /^#define GCPRO2(a, b)                          
                        \\$/
+GCPRO3 c-src/emacs/src/lisp.h  /^#define GCPRO3(varname1, varname2, varname3) 
\\$/
+GCPRO3 c-src/emacs/src/lisp.h  /^#define GCPRO3(a, b, c)                       
                                \\$/
+GCPRO3 c-src/emacs/src/lisp.h  /^#define GCPRO3(a, b, c)                       
                                \\$/
+GCPRO4 c-src/emacs/src/lisp.h  /^#define GCPRO4(varname1, varname2, varname3, 
varna/
+GCPRO4 c-src/emacs/src/lisp.h  /^#define GCPRO4(a, b, c, d)                    
                        \\$/
+GCPRO4 c-src/emacs/src/lisp.h  /^#define GCPRO4(a, b, c, d)                    
                        \\$/
+GCPRO5 c-src/emacs/src/lisp.h  /^#define GCPRO5(varname1, varname2, varname3, 
varna/
+GCPRO5 c-src/emacs/src/lisp.h  /^#define GCPRO5(a, b, c, d, e)                 
                        \\$/
+GCPRO5 c-src/emacs/src/lisp.h  /^#define GCPRO5(a, b, c, d, e)                 
                        \\$/
+GCPRO6 c-src/emacs/src/lisp.h  /^#define GCPRO6(varname1, varname2, varname3, 
varna/
+GCPRO6 c-src/emacs/src/lisp.h  /^#define GCPRO6(a, b, c, d, e, f)              
                        \\$/
+GCPRO6 c-src/emacs/src/lisp.h  /^#define GCPRO6(a, b, c, d, e, f)              
                        \\$/
+GCPRO7 c-src/emacs/src/lisp.h  /^#define GCPRO7(a, b, c, d, e, f, g) (GCPRO6 
(a, b,/
+GCPRO7 c-src/emacs/src/lisp.h  /^#define GCPRO7(a, b, c, d, e, f, g)           
                        \\$/
+GCPRO7 c-src/emacs/src/lisp.h  /^#define GCPRO7(a, b, c, d, e, f, g)           
                        \\$/
+GCTYPEBITS     c-src/emacs/src/lisp.h  67
+GCTYPEBITS     c-src/emacs/src/lisp.h  /^DEFINE_GDB_SYMBOL_BEGIN (int, 
GCTYPEBITS)$/
+GC_MAKE_GCPROS_NOOPS   c-src/emacs/src/lisp.h  3172
+GC_MARK_STACK  c-src/emacs/src/lisp.h  3177
+GC_MARK_STACK_CHECK_GCPROS     c-src/emacs/src/lisp.h  3173
+GC_USE_GCPROS_AS_BEFORE        c-src/emacs/src/lisp.h  3171
+GC_USE_GCPROS_CHECK_ZOMBIES    c-src/emacs/src/lisp.h  3174
+GE     y-src/parse.c   8
+GENERIC_PTR    cccp.y  56
+GENERIC_PTR    cccp.y  58
+GENERIC_PTR    y-src/cccp.y    56
+GENERIC_PTR    y-src/cccp.y    58
+GEQ    y-src/cccp.c    15
+GROW_RAW_KEYBUF        c-src/emacs/src/keyboard.c      119
+Gate_Decl      cp-src/abstract.H       223
+Gate_Decl::Gate_Decl   cp-src/abstract.C       /^Gate_Decl::Gate_Decl(ID_List 
*g_id_l1, ID_List *g_/
+Gate_Decl::SetCollapsed        cp-src/abstract.C       /^void 
Gate_Decl::SetCollapsed(char t)$/
+Gate_Decl::SetDimensions       cp-src/abstract.C       /^void 
Gate_Decl::SetDimensions(void)$/
+Gate_Decl::SetFather   cp-src/abstract.C       /^void 
Gate_Decl::SetFather(Tree_Node *f)$/
+Gate_Decl::SetPosition cp-src/abstract.C       /^void 
Gate_Decl::SetPosition(Coord xx, Coord yy)$/
+Gate_Decl::gate_id_list1       cp-src/abstract.H       225
+Gate_Decl::gate_id_list2       cp-src/abstract.H       226
+Gate_Decl_List cp-src/abstract.H       239
+Gate_Decl_List::Gate_Decl_List cp-src/abstract.C       
/^Gate_Decl_List::Gate_Decl_List(Gate_Decl *el, Gate/
+Gate_Decl_List::SetCollapsed   cp-src/abstract.C       /^void 
Gate_Decl_List::SetCollapsed(char t)$/
+Gate_Decl_List::SetDimensions  cp-src/abstract.C       /^void 
Gate_Decl_List::SetDimensions(void)$/
+Gate_Decl_List::SetFather      cp-src/abstract.C       /^void 
Gate_Decl_List::SetFather(Tree_Node *f)$/
+Gate_Decl_List::SetPosition    cp-src/abstract.C       /^void 
Gate_Decl_List::SetPosition(Coord xx, Coord y/
+Gate_Decl_List::elem   cp-src/abstract.H       241
+Gate_Decl_List::next   cp-src/abstract.H       242
+GatherControls pyt-src/server.py       /^    def GatherControls(self):$/
+Gen_Paral      cp-src/abstract.H       652
+Gen_Paral::Gen_Paral   cp-src/abstract.C       /^Gen_Paral::Gen_Paral(ID_List 
*g_i_l)$/
+Gen_Paral::HideGate    cp-src/abstract.H       /^ void HideGate() { ((ID_List 
*)gate_id_list)->Hide/
+Gen_Paral::SetCollapsed        cp-src/abstract.C       /^void 
Gen_Paral::SetCollapsed(char t)$/
+Gen_Paral::SetDimensions       cp-src/abstract.C       /^void 
Gen_Paral::SetDimensions(void)$/
+Gen_Paral::SetFather   cp-src/abstract.C       /^void 
Gen_Paral::SetFather(Tree_Node *f)$/
+Gen_Paral::SetPosition cp-src/abstract.C       /^void 
Gen_Paral::SetPosition(Coord xx, Coord yy)$/
+Gen_Paral::Xclose      cp-src/abstract.H       655
+Gen_Paral::border      cp-src/abstract.H       656
+Gen_Paral::gate_id_list        cp-src/abstract.H       654
+GetLayerByName lua-src/allegro.lua     /^function GetLayerByName (name)$/
+GetNameList    pas-src/common.pas      /^function GetNameList; (* : 
BinNodePointer;*)$/
+GetNewNameListNode     pas-src/common.pas      /^function 
GetNewNameListNode;(*($/
+GetTextRef     pas-src/common.pas      /^function GetTextRef;(*($/
+GetUniqueLayerName     lua-src/allegro.lua     /^function GetUniqueLayerName 
()$/
+Get_Own_Priority/f     ada-src/2ataspri.adb    /^   function Get_Own_Priority 
return System.Any_Pri/
+Get_Own_Priority/f     ada-src/2ataspri.ads    /^   function Get_Own_Priority 
return System.Any_Pri/
+Get_Priority/f ada-src/2ataspri.adb    /^   function Get_Priority (T : 
TCB_Ptr) return Syst/
+Get_Priority/f ada-src/2ataspri.ads    /^   function Get_Priority (T : 
TCB_Ptr) return Syst/
+Guard  cp-src/abstract.H       524
+Guard::Guard   cp-src/abstract.C       /^Guard::Guard(Equality *eq)$/
+Guard::SetCollapsed    cp-src/abstract.C       /^void Guard::SetCollapsed(char 
t)$/
+Guard::SetDimensions   cp-src/abstract.C       /^void 
Guard::SetDimensions(void)$/
+Guard::SetFather       cp-src/abstract.C       /^void 
Guard::SetFather(Tree_Node *f)$/
+Guard::SetPosition     cp-src/abstract.C       /^void Guard::SetPosition(Coord 
xx, Coord yy)$/
+Guard::equality        cp-src/abstract.H       526
+Guarded        cp-src/abstract.H       848
+Guarded::Guarded       cp-src/abstract.C       /^Guarded::Guarded(Equality 
*eq, Tree_Node *b)$/
+Guarded::SetCollapsed  cp-src/abstract.C       /^void 
Guarded::SetCollapsed(char t)$/
+Guarded::SetDimensions cp-src/abstract.C       /^void 
Guarded::SetDimensions(void)$/
+Guarded::SetFather     cp-src/abstract.C       /^void 
Guarded::SetFather(Tree_Node *f)$/
+Guarded::SetPosition   cp-src/abstract.C       /^void 
Guarded::SetPosition(Coord xx, Coord yy)$/
+Guarded::SetTextual    cp-src/abstract.C       /^void Guarded::SetTextual(char 
t, char s)$/
+Guarded::Xclose        cp-src/abstract.H       852
+Guarded::bex   cp-src/abstract.H       851
+Guarded::border        cp-src/abstract.H       853
+Guarded::equality      cp-src/abstract.H       850
+HASH_HASH      c-src/emacs/src/lisp.h  /^HASH_HASH (struct Lisp_Hash_Table *h, 
ptrdiff_t id/
+HASH_INDEX     c-src/emacs/src/lisp.h  /^HASH_INDEX (struct Lisp_Hash_Table 
*h, ptrdiff_t i/
+HASH_KEY       c-src/emacs/src/lisp.h  /^HASH_KEY (struct Lisp_Hash_Table *h, 
ptrdiff_t idx/
+HASH_NEXT      c-src/emacs/src/lisp.h  /^HASH_NEXT (struct Lisp_Hash_Table *h, 
ptrdiff_t id/
+HASH_TABLE_P   c-src/emacs/src/lisp.h  /^HASH_TABLE_P (Lisp_Object a)$/
+HASH_TABLE_SIZE        c-src/emacs/src/lisp.h  /^HASH_TABLE_SIZE (struct 
Lisp_Hash_Table *h)$/
+HASH_VALUE     c-src/emacs/src/lisp.h  /^HASH_VALUE (struct Lisp_Hash_Table 
*h, ptrdiff_t i/
+HAVE_NTGUI     c-src/etags.c   116
+HEAP   c-src/emacs/src/gmalloc.c       131
+HTMLSRC        Makefile        /^HTMLSRC=$(addprefix 
.\/html-src\/,softwarelibero.htm/
+HTML_help      c-src/etags.c   584
+HTML_labels    c-src/etags.c   /^HTML_labels (FILE *inf)$/
+HTML_suffixes  c-src/etags.c   582
+Half_Container cp-src/abstract.H       287
+Half_Container::Half_Container cp-src/abstract.C       
/^Half_Container::Half_Container(ID_List *g_l)$/
+Half_Container::SetCollapsed   cp-src/abstract.C       /^void 
Half_Container::SetCollapsed(char t)$/
+Half_Container::SetDimensions  cp-src/abstract.C       /^void 
Half_Container::SetDimensions(void)$/
+Half_Container::SetFather      cp-src/abstract.C       /^void 
Half_Container::SetFather(Tree_Node *f)$/
+Half_Container::SetPosition    cp-src/abstract.C       /^void 
Half_Container::SetPosition(Coord xx, Coord y/
+Half_Container::gate_list      cp-src/abstract.H       289
+Hide   cp-src/abstract.H       829
+Hide::Hide     cp-src/abstract.C       /^Hide::Hide(ID_List *g_l, Tree_Node 
*b)$/
+Hide::SetCollapsed     cp-src/abstract.C       /^void Hide::SetCollapsed(char 
t)$/
+Hide::SetDimensions    cp-src/abstract.C       /^void 
Hide::SetDimensions(void)$/
+Hide::SetFather        cp-src/abstract.C       /^void 
Hide::SetFather(Tree_Node *f)$/
+Hide::SetPosition      cp-src/abstract.C       /^void Hide::SetPosition(Coord 
xx, Coord yy)$/
+Hide::SetTextual       cp-src/abstract.C       /^void Hide::SetTextual(char t, 
char s)$/
+Hide::bex      cp-src/abstract.H       832
+Hide::border   cp-src/abstract.H       833
+Hide::gate_list        cp-src/abstract.H       831
+Hide::yl       cp-src/abstract.H       834
+ID_List        cp-src/abstract.H       47
+ID_List::BuildSigSorts cp-src/abstract.C       /^void 
ID_List::BuildSigSorts(char bubble, Signature/
+ID_List::ClearIDs      cp-src/abstract.C       /^void ID_List::ClearIDs(void)$/
+ID_List::GetCardinality        cp-src/abstract.C       /^int 
ID_List::GetCardinality(int c)$/
+ID_List::HideMe        cp-src/abstract.C       /^void ID_List::HideMe(void)$/
+ID_List::ID_List       cp-src/abstract.C       /^ID_List::ID_List(ID_Place 
*el, ID_List *nxt)$/
+ID_List::SetAlignement cp-src/abstract.C       /^void 
ID_List::SetAlignement(char a)$/
+ID_List::SetCollapsed  cp-src/abstract.C       /^void 
ID_List::SetCollapsed(char t)$/
+ID_List::SetDimensions cp-src/abstract.C       /^void 
ID_List::SetDimensions(void)$/
+ID_List::SetFather     cp-src/abstract.C       /^void 
ID_List::SetFather(Tree_Node *f)$/
+ID_List::SetPosition   cp-src/abstract.C       /^void 
ID_List::SetPosition(Coord xx, Coord yy)$/
+ID_List::SetRBubble    cp-src/abstract.C       /^void ID_List::SetRBubble(char 
r)$/
+ID_List::SetVisible    cp-src/abstract.C       /^void ID_List::SetVisible(char 
v)$/
+ID_List::elem  cp-src/abstract.H       49
+ID_List::next  cp-src/abstract.H       50
+ID_Place       cp-src/abstract.H       23
+ID_Place::ClearID      cp-src/abstract.C       /^void ID_Place::ClearID(void)$/
+ID_Place::GetIdent     cp-src/abstract.H       /^ char *GetIdent() 
{return(str);};$/
+ID_Place::GetRBubble   cp-src/abstract.H       /^ char GetRBubble(void) { 
return(RBubble); };$/
+ID_Place::ID_Place     cp-src/abstract.C       /^ID_Place::ID_Place()$/
+ID_Place::RBubble      cp-src/abstract.H       26
+ID_Place::SetDimensions        cp-src/abstract.C       /^void 
ID_Place::SetDimensions(void)$/
+ID_Place::SetFather    cp-src/abstract.C       /^void 
ID_Place::SetFather(Tree_Node *f)$/
+ID_Place::SetIdent     cp-src/abstract.C       /^void ID_Place::SetIdent(char 
*identifier)$/
+ID_Place::SetPosition  cp-src/abstract.C       /^void 
ID_Place::SetPosition(Coord xx, Coord yy)$/
+ID_Place::SetRBubble   cp-src/abstract.H       /^ void SetRBubble(char r) { 
RBubble = r; };$/
+ID_Place::SetVisible   cp-src/abstract.C       /^void 
ID_Place::SetVisible(char v)$/
+ID_Place::str  cp-src/abstract.H       25
+ID_Place::~ID_Place    cp-src/abstract.C       /^ID_Place::~ID_Place()$/
+IEEE_FLOATING_POINT    c-src/emacs/src/lisp.h  2415
+IMAGEP c-src/emacs/src/lisp.h  /^IMAGEP (Lisp_Object x)$/
+INPUT_EVENT_POS_MAX    c-src/emacs/src/keyboard.c      3698
+INPUT_EVENT_POS_MIN    c-src/emacs/src/keyboard.c      3701
+INSERT_TREE_NODE       pas-src/common.pas      /^procedure 
INSERT_TREE_NODE;(*( $/
+INSTANTIATE_MDIAGARRAY_FRIENDS cp-src/MDiagArray2.h    /^#define 
INSTANTIATE_MDIAGARRAY_FRIENDS(T) \\$/
+INT    c-src/h.h       32
+INT    y-src/cccp.c    6
+INTEGERP       c-src/emacs/src/lisp.h  /^# define INTEGERP(x) lisp_h_INTEGERP 
(x)$/
+INTEGER_TO_CONS        c-src/emacs/src/lisp.h  /^#define INTEGER_TO_CONS(i)    
                                    \\$/
+INTERVAL       c-src/emacs/src/lisp.h  1149
+INTMASK        c-src/emacs/src/lisp.h  437
+INTTYPEBITS    c-src/emacs/src/lisp.h  249
+INT_BIT        c-src/emacs/src/gmalloc.c       124
+INT_TYPE_SIZE  cccp.y  91
+INT_TYPE_SIZE  y-src/cccp.y    91
+IN_ERROR       cp-src/cfront.H 234
+ISALNUM        c-src/etags.c   /^#define ISALNUM(c)    isalnum (CHAR (c))$/
+ISALPHA        c-src/etags.c   /^#define ISALPHA(c)    isalpha (CHAR (c))$/
+ISDIGIT        c-src/etags.c   /^#define ISDIGIT(c)    isdigit (CHAR (c))$/
+ISLOWER        c-src/etags.c   /^#define ISLOWER(c)    islower (CHAR (c))$/
+ISO_FUNCTION_KEY_OFFSET        c-src/emacs/src/keyboard.c      5149
+ISUPPER        c-src/etags.c   /^# define ISUPPER(c)   isupper (CHAR (c))$/
+IS_DAEMON      c-src/emacs/src/lisp.h  4257
+IS_DAEMON      c-src/emacs/src/lisp.h  4261
+Id_Decl        cp-src/abstract.H       73
+Id_Decl::Id_Decl       cp-src/abstract.C       /^Id_Decl::Id_Decl(ID_List *l, 
ID_Place *s)$/
+Id_Decl::SetCollapsed  cp-src/abstract.C       /^void 
Id_Decl::SetCollapsed(char t)$/
+Id_Decl::SetDimensions cp-src/abstract.C       /^void 
Id_Decl::SetDimensions(void)$/
+Id_Decl::SetFather     cp-src/abstract.C       /^void 
Id_Decl::SetFather(Tree_Node *f)$/
+Id_Decl::SetPosition   cp-src/abstract.C       /^void 
Id_Decl::SetPosition(Coord xx, Coord yy)$/
+Id_Decl::id_list       cp-src/abstract.H       75
+Id_Decl::sort_id       cp-src/abstract.H       76
+Id_Decl_List   cp-src/abstract.H       89
+Id_Decl_List::Id_Decl_List     cp-src/abstract.C       
/^Id_Decl_List::Id_Decl_List(Id_Decl *el, Id_Decl_Li/
+Id_Decl_List::SetCollapsed     cp-src/abstract.C       /^void 
Id_Decl_List::SetCollapsed(char t)$/
+Id_Decl_List::SetDimensions    cp-src/abstract.C       /^void 
Id_Decl_List::SetDimensions(void)$/
+Id_Decl_List::SetFather        cp-src/abstract.C       /^void 
Id_Decl_List::SetFather(Tree_Node *f)$/
+Id_Decl_List::SetPosition      cp-src/abstract.C       /^void 
Id_Decl_List::SetPosition(Coord xx, Coord yy)/
+Id_Decl_List::elem     cp-src/abstract.H       91
+Id_Decl_List::next     cp-src/abstract.H       92
+Ident_Eq       cp-src/abstract.H       255
+Ident_Eq::Ident_Eq     cp-src/abstract.C       /^Ident_Eq::Ident_Eq(Id_Decl 
*idd, Value_Expr *ex)$/
+Ident_Eq::SetCollapsed cp-src/abstract.C       /^void 
Ident_Eq::SetCollapsed(char t)$/
+Ident_Eq::SetDimensions        cp-src/abstract.C       /^void 
Ident_Eq::SetDimensions(void)$/
+Ident_Eq::SetFather    cp-src/abstract.C       /^void 
Ident_Eq::SetFather(Tree_Node *f)$/
+Ident_Eq::SetPosition  cp-src/abstract.C       /^void 
Ident_Eq::SetPosition(Coord xx, Coord yy)$/
+Ident_Eq::expr cp-src/abstract.H       258
+Ident_Eq::iddecl       cp-src/abstract.H       257
+Ident_Eq_List  cp-src/abstract.H       271
+Ident_Eq_List::Ident_Eq_List   cp-src/abstract.C       
/^Ident_Eq_List::Ident_Eq_List(Ident_Eq *el, Ident_E/
+Ident_Eq_List::SetCollapsed    cp-src/abstract.C       /^void 
Ident_Eq_List::SetCollapsed(char t)$/
+Ident_Eq_List::SetDimensions   cp-src/abstract.C       /^void 
Ident_Eq_List::SetDimensions(void)$/
+Ident_Eq_List::SetFather       cp-src/abstract.C       /^void 
Ident_Eq_List::SetFather(Tree_Node *f)$/
+Ident_Eq_List::SetPosition     cp-src/abstract.C       /^void 
Ident_Eq_List::SetPosition(Coord xx, Coord yy/
+Ident_Eq_List::elem    cp-src/abstract.H       273
+Ident_Eq_List::next    cp-src/abstract.H       274
+InitNameList   pas-src/common.pas      /^procedure InitNameList;$/
+InitNameStringPool     pas-src/common.pas      /^procedure 
InitNameStringPool;$/
+InitializeStringPackage        pas-src/common.pas      /^procedure 
InitializeStringPackage;$/
+Initialize_Cond/p      ada-src/2ataspri.adb    /^   procedure Initialize_Cond 
(Cond : in out Condit/
+Initialize_Cond/p      ada-src/2ataspri.ads    /^   procedure Initialize_Cond 
(Cond : in out Condit/
+Initialize_LL_Tasks/p  ada-src/2ataspri.adb    /^   procedure 
Initialize_LL_Tasks (T : TCB_Ptr) is$/
+Initialize_LL_Tasks/p  ada-src/2ataspri.ads    /^   procedure 
Initialize_LL_Tasks (T : TCB_Ptr);$/
+Initialize_Lock/p      ada-src/2ataspri.adb    /^   procedure Initialize_Lock$/
+Initialize_Lock/p      ada-src/2ataspri.ads    /^   procedure Initialize_Lock 
(Prio : System.Any_Pr/
+Initialize_TAS_Cell/p  ada-src/2ataspri.adb    /^   procedure 
Initialize_TAS_Cell (Cell : out TAS_C/
+Initialize_TAS_Cell/p  ada-src/2ataspri.ads    /^   procedure 
Initialize_TAS_Cell (Cell :    out TA/
+Inner1/b       ada-src/etags-test-for.ada      /^  package body Inner1 is$/
+Inner1/b       ada-src/waroquiers.ada  /^  package body Inner1 is$/
+Inner1/s       ada-src/etags-test-for.ada      /^  package Inner1 is$/
+Inner1/s       ada-src/waroquiers.ada  /^  package Inner1 is$/
+Inner2/b       ada-src/etags-test-for.ada      /^  package body Inner2 is$/
+Inner2/b       ada-src/waroquiers.ada  /^  package body Inner2 is$/
+Inner2/s       ada-src/etags-test-for.ada      /^  package Inner2 is$/
+Inner2/s       ada-src/waroquiers.ada  /^  package Inner2 is$/
+Install_Abort_Handler/p        ada-src/2ataspri.adb    /^   procedure 
Install_Abort_Handler (Handler : Abor/
+Install_Abort_Handler/p        ada-src/2ataspri.ads    /^   procedure 
Install_Abort_Handler (Handler : Abor/
+Install_Error_Handler/p        ada-src/2ataspri.adb    /^   procedure 
Install_Error_Handler (Handler : Syst/
+Install_Error_Handler/p        ada-src/2ataspri.ads    /^   procedure 
Install_Error_Handler (Handler : Syst/
+Interl cp-src/abstract.H       672
+Interl::Interl cp-src/abstract.C       /^Interl::Interl()$/
+Interl::SetDimensions  cp-src/abstract.C       /^void 
Interl::SetDimensions(void)$/
+Interl::SetFather      cp-src/abstract.C       /^void 
Interl::SetFather(Tree_Node *f)$/
+Interl::SetPosition    cp-src/abstract.C       /^void 
Interl::SetPosition(Coord xx, Coord yy)$/
+Internal       cp-src/abstract.H       614
+Internal::Internal     cp-src/abstract.C       /^Internal::Internal()$/
+Internal::SetDimensions        cp-src/abstract.C       /^void 
Internal::SetDimensions(void)$/
+Internal::SetFather    cp-src/abstract.C       /^void 
Internal::SetFather(Tree_Node *f)$/
+Internal::SetPosition  cp-src/abstract.C       /^void 
Internal::SetPosition(Coord xx, Coord yy)$/
+Invoking gzip  tex-src/gzip.texi       /address@hidden Invoking gzip, Advanced 
usage, Sample, Top$/
+IsControlChar  pas-src/common.pas      /^function IsControlChar; (*($/
+IsControlCharName      pas-src/common.pas      /^function IsControlCharName($/
+Is_Set/f       ada-src/2ataspri.adb    /^   function  Is_Set (Cell : in 
TAS_Cell) return Bo/
+Is_Set/f       ada-src/2ataspri.ads    /^   function  Is_Set       (Cell : in  
   TAS_Cell)/
+JAVASRC        Makefile        /^JAVASRC=$(addprefix 
.\/java-src\/,AWTEMul.java KeyEv/
+KBD_BUFFER_SIZE        c-src/emacs/src/keyboard.c      82
+KBYTES objc-src/PackInsp.m     58
+KEY_TO_CHAR    c-src/emacs/src/keyboard.c      /^#define KEY_TO_CHAR(k) (XINT 
(k) & ((1 << CHARACTE/
+KeyEvent       java-src/KeyEve.java    36
+KeyEvent.CHAR_UNDEFINED        java-src/KeyEve.java    214
+KeyEvent.KEY_FIRST     java-src/KeyEve.java    41
+KeyEvent.KEY_LAST      java-src/KeyEve.java    46
+KeyEvent.KEY_PRESSED   java-src/KeyEve.java    57
+KeyEvent.KEY_RELEASED  java-src/KeyEve.java    62
+KeyEvent.KEY_TYPED     java-src/KeyEve.java    52
+KeyEvent.KeyEvent      java-src/KeyEve.java    /^    public KeyEvent(Component 
source, int id, long/
+KeyEvent.KeyEvent      java-src/KeyEve.java    /^    public KeyEvent(Component 
source, int id, long/
+KeyEvent.VK_0  java-src/KeyEve.java    110
+KeyEvent.VK_1  java-src/KeyEve.java    111
+KeyEvent.VK_2  java-src/KeyEve.java    112
+KeyEvent.VK_3  java-src/KeyEve.java    113
+KeyEvent.VK_4  java-src/KeyEve.java    114
+KeyEvent.VK_5  java-src/KeyEve.java    115
+KeyEvent.VK_6  java-src/KeyEve.java    116
+KeyEvent.VK_7  java-src/KeyEve.java    117
+KeyEvent.VK_8  java-src/KeyEve.java    118
+KeyEvent.VK_9  java-src/KeyEve.java    119
+KeyEvent.VK_A  java-src/KeyEve.java    125
+KeyEvent.VK_ACCEPT     java-src/KeyEve.java    200
+KeyEvent.VK_ADD        java-src/KeyEve.java    167
+KeyEvent.VK_ALT        java-src/KeyEve.java    92
+KeyEvent.VK_B  java-src/KeyEve.java    126
+KeyEvent.VK_BACK_QUOTE java-src/KeyEve.java    193
+KeyEvent.VK_BACK_SLASH java-src/KeyEve.java    153
+KeyEvent.VK_BACK_SPACE java-src/KeyEve.java    86
+KeyEvent.VK_C  java-src/KeyEve.java    127
+KeyEvent.VK_CANCEL     java-src/KeyEve.java    88
+KeyEvent.VK_CAPS_LOCK  java-src/KeyEve.java    94
+KeyEvent.VK_CLEAR      java-src/KeyEve.java    89
+KeyEvent.VK_CLOSE_BRACKET      java-src/KeyEve.java    154
+KeyEvent.VK_COMMA      java-src/KeyEve.java    105
+KeyEvent.VK_CONTROL    java-src/KeyEve.java    91
+KeyEvent.VK_CONVERT    java-src/KeyEve.java    198
+KeyEvent.VK_D  java-src/KeyEve.java    128
+KeyEvent.VK_DECIMAL    java-src/KeyEve.java    170
+KeyEvent.VK_DELETE     java-src/KeyEve.java    184
+KeyEvent.VK_DIVIDE     java-src/KeyEve.java    171
+KeyEvent.VK_DOWN       java-src/KeyEve.java    104
+KeyEvent.VK_E  java-src/KeyEve.java    129
+KeyEvent.VK_END        java-src/KeyEve.java    99
+KeyEvent.VK_ENTER      java-src/KeyEve.java    85
+KeyEvent.VK_EQUALS     java-src/KeyEve.java    122
+KeyEvent.VK_ESCAPE     java-src/KeyEve.java    95
+KeyEvent.VK_F  java-src/KeyEve.java    130
+KeyEvent.VK_F1 java-src/KeyEve.java    172
+KeyEvent.VK_F10        java-src/KeyEve.java    181
+KeyEvent.VK_F11        java-src/KeyEve.java    182
+KeyEvent.VK_F12        java-src/KeyEve.java    183
+KeyEvent.VK_F2 java-src/KeyEve.java    173
+KeyEvent.VK_F3 java-src/KeyEve.java    174
+KeyEvent.VK_F4 java-src/KeyEve.java    175
+KeyEvent.VK_F5 java-src/KeyEve.java    176
+KeyEvent.VK_F6 java-src/KeyEve.java    177
+KeyEvent.VK_F7 java-src/KeyEve.java    178
+KeyEvent.VK_F8 java-src/KeyEve.java    179
+KeyEvent.VK_F9 java-src/KeyEve.java    180
+KeyEvent.VK_FINAL      java-src/KeyEve.java    197
+KeyEvent.VK_G  java-src/KeyEve.java    131
+KeyEvent.VK_H  java-src/KeyEve.java    132
+KeyEvent.VK_HELP       java-src/KeyEve.java    190
+KeyEvent.VK_HOME       java-src/KeyEve.java    100
+KeyEvent.VK_I  java-src/KeyEve.java    133
+KeyEvent.VK_INSERT     java-src/KeyEve.java    189
+KeyEvent.VK_J  java-src/KeyEve.java    134
+KeyEvent.VK_K  java-src/KeyEve.java    135
+KeyEvent.VK_KANA       java-src/KeyEve.java    202
+KeyEvent.VK_KANJI      java-src/KeyEve.java    203
+KeyEvent.VK_L  java-src/KeyEve.java    136
+KeyEvent.VK_LEFT       java-src/KeyEve.java    101
+KeyEvent.VK_M  java-src/KeyEve.java    137
+KeyEvent.VK_META       java-src/KeyEve.java    191
+KeyEvent.VK_MODECHANGE java-src/KeyEve.java    201
+KeyEvent.VK_MULTIPLY   java-src/KeyEve.java    166
+KeyEvent.VK_N  java-src/KeyEve.java    138
+KeyEvent.VK_NONCONVERT java-src/KeyEve.java    199
+KeyEvent.VK_NUMPAD0    java-src/KeyEve.java    156
+KeyEvent.VK_NUMPAD1    java-src/KeyEve.java    157
+KeyEvent.VK_NUMPAD2    java-src/KeyEve.java    158
+KeyEvent.VK_NUMPAD3    java-src/KeyEve.java    159
+KeyEvent.VK_NUMPAD4    java-src/KeyEve.java    160
+KeyEvent.VK_NUMPAD5    java-src/KeyEve.java    161
+KeyEvent.VK_NUMPAD6    java-src/KeyEve.java    162
+KeyEvent.VK_NUMPAD7    java-src/KeyEve.java    163
+KeyEvent.VK_NUMPAD8    java-src/KeyEve.java    164
+KeyEvent.VK_NUMPAD9    java-src/KeyEve.java    165
+KeyEvent.VK_NUM_LOCK   java-src/KeyEve.java    185
+KeyEvent.VK_O  java-src/KeyEve.java    139
+KeyEvent.VK_OPEN_BRACKET       java-src/KeyEve.java    152
+KeyEvent.VK_P  java-src/KeyEve.java    140
+KeyEvent.VK_PAGE_DOWN  java-src/KeyEve.java    98
+KeyEvent.VK_PAGE_UP    java-src/KeyEve.java    97
+KeyEvent.VK_PAUSE      java-src/KeyEve.java    93
+KeyEvent.VK_PERIOD     java-src/KeyEve.java    106
+KeyEvent.VK_PRINTSCREEN        java-src/KeyEve.java    188
+KeyEvent.VK_Q  java-src/KeyEve.java    141
+KeyEvent.VK_QUOTE      java-src/KeyEve.java    194
+KeyEvent.VK_R  java-src/KeyEve.java    142
+KeyEvent.VK_RIGHT      java-src/KeyEve.java    103
+KeyEvent.VK_S  java-src/KeyEve.java    143
+KeyEvent.VK_SCROLL_LOCK        java-src/KeyEve.java    186
+KeyEvent.VK_SEMICOLON  java-src/KeyEve.java    121
+KeyEvent.VK_SEPARATER  java-src/KeyEve.java    168
+KeyEvent.VK_SHIFT      java-src/KeyEve.java    90
+KeyEvent.VK_SLASH      java-src/KeyEve.java    107
+KeyEvent.VK_SPACE      java-src/KeyEve.java    96
+KeyEvent.VK_SUBTRACT   java-src/KeyEve.java    169
+KeyEvent.VK_T  java-src/KeyEve.java    144
+KeyEvent.VK_TAB        java-src/KeyEve.java    87
+KeyEvent.VK_U  java-src/KeyEve.java    145
+KeyEvent.VK_UNDEFINED  java-src/KeyEve.java    208
+KeyEvent.VK_UP java-src/KeyEve.java    102
+KeyEvent.VK_V  java-src/KeyEve.java    146
+KeyEvent.VK_W  java-src/KeyEve.java    147
+KeyEvent.VK_X  java-src/KeyEve.java    148
+KeyEvent.VK_Y  java-src/KeyEve.java    149
+KeyEvent.VK_Z  java-src/KeyEve.java    150
+KeyEvent.getKeyChar    java-src/KeyEve.java    /^    public char getKeyChar() 
{$/
+KeyEvent.getKeyCode    java-src/KeyEve.java    /^    public int getKeyCode() 
{$/
+KeyEvent.getKeyModifiersText   java-src/KeyEve.java    /^    public static 
String getKeyModifiersText(int m/
+KeyEvent.getKeyText    java-src/KeyEve.java    /^    public static String 
getKeyText(int keyCode) {/
+KeyEvent.isActionKey   java-src/KeyEve.java    /^    public boolean 
isActionKey() {$/
+KeyEvent.keyChar       java-src/KeyEve.java    217
+KeyEvent.keyCode       java-src/KeyEve.java    216
+KeyEvent.paramString   java-src/KeyEve.java    /^    public String 
paramString() {$/
+KeyEvent.serialVersionUID      java-src/KeyEve.java    222
+KeyEvent.setKeyChar    java-src/KeyEve.java    /^    public void 
setKeyChar(char keyChar) {$/
+KeyEvent.setKeyCode    java-src/KeyEve.java    /^    public void 
setKeyCode(int keyCode) {$/
+KeyEvent.setModifiers  java-src/KeyEve.java    /^    public void 
setModifiers(int modifiers) {$/
+LATEST make-src/Makefile       1
+LCE_COMMENT    php-src/lce_functions.php       13
+LCE_COMMENT_TOOL       php-src/lce_functions.php       17
+LCE_COMMENT_USER       php-src/lce_functions.php       15
+LCE_FUNCTIONS  php-src/lce_functions.php       4
+LCE_MSGID      php-src/lce_functions.php       19
+LCE_MSGSTR     php-src/lce_functions.php       21
+LCE_TEXT       php-src/lce_functions.php       23
+LCE_UNKNOWN    php-src/lce_functions.php       9
+LCE_WS php-src/lce_functions.php       11
+LDFLAGS        make-src/Makefile       50
+LE     y-src/parse.c   7
+LEQ    y-src/cccp.c    14
+LISP_INITIALLY c-src/emacs/src/lisp.h  /^#define LISP_INITIALLY(i) {i}$/
+LISP_INITIALLY c-src/emacs/src/lisp.h  /^#define LISP_INITIALLY(i) (i)$/
+LISP_INITIALLY_ZERO    c-src/emacs/src/lisp.h  582
+LISP_MACRO_DEFUN       c-src/emacs/src/lisp.h  /^#define 
LISP_MACRO_DEFUN(name, type, argdecls, arg/
+LISP_MACRO_DEFUN       c-src/emacs/src/lisp.h  /^LISP_MACRO_DEFUN (XLI, 
EMACS_INT, (Lisp_Object o),/
+LISP_MACRO_DEFUN       c-src/emacs/src/lisp.h  /^LISP_MACRO_DEFUN (XPNTR, void 
*, (Lisp_Object a), /
+LISP_MACRO_DEFUN       c-src/emacs/src/lisp.h  /^LISP_MACRO_DEFUN (XHASH, 
EMACS_INT, (Lisp_Object a/
+LISP_MACRO_DEFUN       c-src/emacs/src/lisp.h  /^LISP_MACRO_DEFUN (XCONS, 
struct Lisp_Cons *, (Lisp/
+LISP_MACRO_DEFUN       c-src/emacs/src/lisp.h  /^LISP_MACRO_DEFUN (XCAR, 
Lisp_Object, (Lisp_Object /
+LISP_MACRO_DEFUN       c-src/emacs/src/lisp.h  /^LISP_MACRO_DEFUN (SYMBOL_VAL, 
Lisp_Object, (struct/
+LISP_MACRO_DEFUN       c-src/emacs/src/lisp.h  /^LISP_MACRO_DEFUN (NILP, bool, 
(Lisp_Object x), (x)/
+LISP_MACRO_DEFUN       c-src/emacs/src/lisp.h  /^LISP_MACRO_DEFUN (CONSP, 
bool, (Lisp_Object x), (x/
+LISP_MACRO_DEFUN_VOID  c-src/emacs/src/lisp.h  /^#define 
LISP_MACRO_DEFUN_VOID(name, argdecls, args/
+LISP_MACRO_DEFUN_VOID  c-src/emacs/src/lisp.h  /^LISP_MACRO_DEFUN_VOID 
(CHECK_TYPE,$/
+LISP_MACRO_DEFUN_VOID  c-src/emacs/src/lisp.h  /^LISP_MACRO_DEFUN_VOID 
(SET_SYMBOL_VAL,$/
+LISP_MACRO_DEFUN_VOID  c-src/emacs/src/lisp.h  /^LISP_MACRO_DEFUN_VOID 
(CHECK_LIST_CONS, (Lisp_Obje/
+LISTCONTENTS   objc-src/PackInsp.m     39
+LISTCONTENTSBUTTON     objc-src/PackInsp.m     48
+LISTDESCRIPTIONBUTTON  objc-src/PackInsp.m     49
+LL_Assert/p    ada-src/2ataspri.adb    /^   procedure LL_Assert (B : Boolean; 
M : String) i/
+LL_Assert/p    ada-src/2ataspri.ads    /^   procedure LL_Assert (B : Boolean; 
M : String);$/
+LL_Task_Procedure_Access/t     ada-src/etags-test-for.ada      /^   type 
LL_Task_Procedure_Access is access procedu/
+LL_Task_Procedure_Access/t     ada-src/2ataspri.ads    /^   type 
LL_Task_Procedure_Access is access procedu/
+LL_Wrapper/p   ada-src/etags-test-for.ada      /^   procedure LL_Wrapper (T : 
TCB_Ptr);$/
+LL_Wrapper/p   ada-src/2ataspri.adb    /^   procedure LL_Wrapper (T : 
TCB_Ptr);$/
+LL_Wrapper/p   ada-src/2ataspri.adb    /^   procedure LL_Wrapper (T : TCB_Ptr) 
is$/
+LOCALIZE       objc-src/PackInsp.m     /^#define LOCALIZE(s)           
NXLoadLocalizedStringFromTabl/
+LOCALIZE_ARCH  objc-src/PackInsp.m     /^#define LOCALIZE_ARCH(s)      
NXLoadLocalizedStringFrom/
+LOCK   c-src/emacs/src/gmalloc.c       /^#define LOCK()                        
                \\$/
+LOCK   c-src/emacs/src/gmalloc.c       /^#define LOCK()$/
+LOCK_ALIGNED_BLOCKS    c-src/emacs/src/gmalloc.c       /^#define 
LOCK_ALIGNED_BLOCKS()                         \\$/
+LOCK_ALIGNED_BLOCKS    c-src/emacs/src/gmalloc.c       /^#define 
LOCK_ALIGNED_BLOCKS()$/
+LONG_TYPE_SIZE cccp.y  95
+LONG_TYPE_SIZE y-src/cccp.y    95
+LOOKING_AT     c-src/etags.c   /^#define LOOKING_AT(cp, kw)  \/* kw is the 
keyword, /
+LOOKING_AT_NOCASE      c-src/etags.c   /^#define LOOKING_AT_NOCASE(cp, kw) \/* 
the keyword i/
+LOOKUP objc-src/PackInsp.m     /^#define LOOKUP(key, notfound) ([table 
isKey:key] ?/
+LOOKUP objc-src/PackInsp.m     176
+LOOP_ON_INPUT_LINES    c-src/etags.c   /^#define 
LOOP_ON_INPUT_LINES(file_pointer, line_buf/
+LSH    y-src/cccp.c    16
+LTGT   cp-src/MDiagArray2.h    35
+LTGT   cp-src/MDiagArray2.h    39
+LTGT   cp-src/MDiagArray2.h    42
+LTGT   cp-src/MDiagArray2.h    144
+LUASRC Makefile        /^LUASRC=$(addprefix .\/lua-src\/,allegro.lua)$/
+L_CELL y-src/parse.c   10
+L_CONST        y-src/parse.c   13
+L_FN0  y-src/parse.c   14
+L_FN1  y-src/parse.c   15
+L_FN1R y-src/parse.c   20
+L_FN2  y-src/parse.c   16
+L_FN2R y-src/parse.c   21
+L_FN3  y-src/parse.c   17
+L_FN3R y-src/parse.c   22
+L_FN4  y-src/parse.c   18
+L_FN4R y-src/parse.c   23
+L_FNN  y-src/parse.c   19
+L_FNNR y-src/parse.c   24
+L_GE   y-src/parse.c   27
+L_LE   y-src/parse.c   25
+L_NE   y-src/parse.c   26
+L_RANGE        y-src/parse.c   11
+L_VAR  y-src/parse.c   12
+L_getit        c-src/etags.c   /^L_getit (void)$/
+LabeledEntry   pyt-src/server.py       /^class LabeledEntry(Frame):$/
+Lang_function  c-src/etags.c   182
+Lang_function  c-src/h.h       6
+Lisp_Bits      c-src/emacs/src/lisp.h  239
+Lisp_Bool_Vector       c-src/emacs/src/lisp.h  1384
+Lisp_Boolfwd   c-src/emacs/src/lisp.h  2284
+Lisp_Buffer_Local_Value        c-src/emacs/src/lisp.h  2334
+Lisp_Buffer_Objfwd     c-src/emacs/src/lisp.h  2302
+Lisp_Char_Table        c-src/emacs/src/lisp.h  1575
+Lisp_Compiled  c-src/emacs/src/lisp.h  2429
+Lisp_Cons      c-src/emacs/src/lisp.h  475
+Lisp_Finalizer c-src/emacs/src/lisp.h  2186
+Lisp_Float     c-src/emacs/src/lisp.h  477
+Lisp_Float     c-src/emacs/src/lisp.h  2391
+Lisp_Free      c-src/emacs/src/lisp.h  2201
+Lisp_Fwd       c-src/emacs/src/lisp.h  2368
+Lisp_Fwd_Bool  c-src/emacs/src/lisp.h  505
+Lisp_Fwd_Buffer_Obj    c-src/emacs/src/lisp.h  507
+Lisp_Fwd_Int   c-src/emacs/src/lisp.h  504
+Lisp_Fwd_Kboard_Obj    c-src/emacs/src/lisp.h  508
+Lisp_Fwd_Obj   c-src/emacs/src/lisp.h  506
+Lisp_Fwd_Type  c-src/emacs/src/lisp.h  502
+Lisp_Hash_Table        c-src/emacs/src/lisp.h  1823
+Lisp_Int0      c-src/emacs/src/lisp.h  461
+Lisp_Int1      c-src/emacs/src/lisp.h  462
+Lisp_Intfwd    c-src/emacs/src/lisp.h  2274
+Lisp_Kboard_Objfwd     c-src/emacs/src/lisp.h  2362
+Lisp_Marker    c-src/emacs/src/lisp.h  1978
+Lisp_Misc      c-src/emacs/src/lisp.h  458
+Lisp_Misc      c-src/emacs/src/lisp.h  2212
+Lisp_Misc_Any  c-src/emacs/src/lisp.h  1971
+Lisp_Misc_Finalizer    c-src/emacs/src/lisp.h  491
+Lisp_Misc_Float        c-src/emacs/src/lisp.h  494
+Lisp_Misc_Free c-src/emacs/src/lisp.h  487
+Lisp_Misc_Limit        c-src/emacs/src/lisp.h  496
+Lisp_Misc_Marker       c-src/emacs/src/lisp.h  488
+Lisp_Misc_Overlay      c-src/emacs/src/lisp.h  489
+Lisp_Misc_Save_Value   c-src/emacs/src/lisp.h  490
+Lisp_Misc_Type c-src/emacs/src/lisp.h  485
+Lisp_Object    c-src/emacs/src/lisp.h  567
+Lisp_Object    c-src/emacs/src/lisp.h  577
+Lisp_Objfwd    c-src/emacs/src/lisp.h  2294
+Lisp_Overlay   c-src/emacs/src/lisp.h  2021
+Lisp_Save_Type c-src/emacs/src/lisp.h  2064
+Lisp_Save_Value        c-src/emacs/src/lisp.h  2110
+Lisp_String    c-src/emacs/src/lisp.h  466
+Lisp_Sub_Char_Table    c-src/emacs/src/lisp.h  1606
+Lisp_Subr      c-src/emacs/src/lisp.h  1670
+Lisp_Symbol    c-src/emacs/src/lisp.h  454
+Lisp_Symbol    c-src/emacs/src/lisp.h  654
+Lisp_Type      c-src/emacs/src/lisp.h  451
+Lisp_Vector    c-src/emacs/src/lisp.h  1369
+Lisp_Vectorlike        c-src/emacs/src/lisp.h  472
+Lisp_functions c-src/etags.c   /^Lisp_functions (FILE *inf)$/
+Lisp_help      c-src/etags.c   591
+Lisp_suffixes  c-src/etags.c   589
+ListEdit       pyt-src/server.py       /^class ListEdit(Frame):$/
+Local_Def      cp-src/abstract.H       914
+Local_Def::Local_Def   cp-src/abstract.C       
/^Local_Def::Local_Def(Ident_Eq_List *e_l, Tree_Node/
+Local_Def::SetCollapsed        cp-src/abstract.C       /^void 
Local_Def::SetCollapsed(char t)$/
+Local_Def::SetDimensions       cp-src/abstract.C       /^void 
Local_Def::SetDimensions(void)$/
+Local_Def::SetFather   cp-src/abstract.C       /^void 
Local_Def::SetFather(Tree_Node *f)$/
+Local_Def::SetPosition cp-src/abstract.C       /^void 
Local_Def::SetPosition(Coord xx, Coord yy)$/
+Local_Def::SetTextual  cp-src/abstract.C       /^void 
Local_Def::SetTextual(char t, char s)$/
+Local_Def::bex cp-src/abstract.H       917
+Local_Def::border      cp-src/abstract.H       919
+Local_Def::equa_list   cp-src/abstract.H       916
+Local_Def::yl  cp-src/abstract.H       918
+Locate pas-src/common.pas      /^function Locate; (*($/
+Lock/t ada-src/2ataspri.ads    /^   type Lock is private;$/
+Lock/t ada-src/2ataspri.ads    /^   type Lock is$/
+LowerCaseNmStr pas-src/common.pas      /^function LowerCaseNmStr; (*($/
+Lua_functions  c-src/etags.c   /^Lua_functions (FILE *inf)$/
+Lua_help       c-src/etags.c   600
+Lua_suffixes   c-src/etags.c   598
+MAGICBYTE      c-src/emacs/src/gmalloc.c       1856
+MAGICFREE      c-src/emacs/src/gmalloc.c       1855
+MAGICWORD      c-src/emacs/src/gmalloc.c       1854
+MAKESRC        Makefile        /^MAKESRC=$(addprefix .\/make-src\/,Makefile)$/
+MALLOCFLOOD    c-src/emacs/src/gmalloc.c       1857
+MANY   c-src/emacs/src/lisp.h  2833
+MARKERP        c-src/emacs/src/lisp.h  /^# define MARKERP(x) lisp_h_MARKERP 
(x)$/
+MAXCONT        cp-src/cfront.H 751
+MAXPATHLEN     c-src/etags.c   115
+MAX_ALLOCA     c-src/emacs/src/lisp.h  4556
+MAX_ALLOCA     c-src/emacs/src/lisp.h  4556
+MAX_ENCODED_BYTES      c-src/emacs/src/keyboard.c      2254
+MAX_HASH_VALUE c-src/etags.c   2329
+MAX_WORD_LENGTH        c-src/etags.c   2327
+MAYBEREL       y-src/parse.y   /^#define MAYBEREL(p) (*(p)=='[' && 
(isdigit((p)[1])/
+MAYBEREL       parse.y /^#define MAYBEREL(p) (*(p)=='[' && (isdigit((p)[1])/
+MBYTES objc-src/PackInsp.m     59
+MCHECK_DISABLED        c-src/emacs/src/gmalloc.c       285
+MCHECK_FREE    c-src/emacs/src/gmalloc.c       287
+MCHECK_HEAD    c-src/emacs/src/gmalloc.c       288
+MCHECK_OK      c-src/emacs/src/gmalloc.c       286
+MCHECK_TAIL    c-src/emacs/src/gmalloc.c       289
+MDiagArray2    cp-src/MDiagArray2.h    78
+MDiagArray2::MDiagArray2       cp-src/MDiagArray2.h    /^  MDiagArray2 (T *d, 
int r, int c) : DiagArray2<T>/
+MDiagArray2::MDiagArray2       cp-src/MDiagArray2.h    /^  MDiagArray2 (void) 
: DiagArray2<T> () { }$/
+MDiagArray2::MDiagArray2       cp-src/MDiagArray2.h    /^  MDiagArray2 (int r, 
int c) : DiagArray2<T> (r, c/
+MDiagArray2::MDiagArray2       cp-src/MDiagArray2.h    /^  MDiagArray2 (int r, 
int c, const T& val) : DiagA/
+MDiagArray2::MDiagArray2       cp-src/MDiagArray2.h    /^  MDiagArray2 (const 
Array<T>& a) : DiagArray2<T> /
+MDiagArray2::MDiagArray2       cp-src/MDiagArray2.h    /^  MDiagArray2 (const 
DiagArray2<T>& a) : DiagArray/
+MDiagArray2::MDiagArray2       cp-src/MDiagArray2.h    /^  MDiagArray2 (const 
MDiagArray2<T>& a) : DiagArra/
+MDiagArray2::operator =        cp-src/MDiagArray2.h    /^  MDiagArray2<T>& 
operator = (const MDiagArray2<T>/
+MDiagArray2::operator MArray2<T>       cp-src/MDiagArray2.h    /^  operator 
MArray2<T> () const$/
+MDiagArray2::~MDiagArray2      cp-src/MDiagArray2.h    /^  ~MDiagArray2 (void) 
{ }$/
+MIA    cp-src/cfront.H 779
+MIN_HASH_VALUE c-src/etags.c   2328
+MIN_WORD_LENGTH        c-src/etags.c   2326
+MISCP  c-src/emacs/src/lisp.h  /^# define MISCP(x) lisp_h_MISCP (x)$/
+MOST_NEGATIVE_FIXNUM   c-src/emacs/src/lisp.h  835
+MOST_POSITIVE_FIXNUM   c-src/emacs/src/lisp.h  834
+MOVE   c-src/sysdep.h  /^#define MOVE(x,y)     movl x, y$/
+MSDOS  c-src/etags.c   100
+MSDOS  c-src/etags.c   106
+MSDOS  c-src/etags.c   107
+MSDOS  c-src/etags.c   110
+MSGSEL f-src/entry.for /^       ENTRY  MSGSEL ( TYPE )$/
+MSGSEL f-src/entry.strange_suffix      /^       ENTRY  MSGSEL ( TYPE )$/
+MSGSEL f-src/entry.strange     /^       ENTRY  MSGSEL ( TYPE )$/
+MULTI_LETTER_MOD       c-src/emacs/src/keyboard.c      /^#define 
MULTI_LETTER_MOD(BIT, NAME, LEN)                      \\$/
+MULTI_LETTER_MOD       c-src/emacs/src/keyboard.c      6231
+MULTI_LETTER_MOD       c-src/emacs/src/keyboard.c      /^#define 
MULTI_LETTER_MOD(BIT, NAME, LEN)              \\$/
+MULTI_LETTER_MOD       c-src/emacs/src/keyboard.c      6764
+Machin_T/b     ada-src/waroquiers.ada  /^  protected body Machin_T is$/
+Machin_T/t     ada-src/etags-test-for.ada      /^  protected type Machin_T is$/
+Machin_T/t     ada-src/etags-test-for.ada      /^  protected Machin_T is$/
+Machin_T/t     ada-src/waroquiers.ada  /^  protected type Machin_T is$/
+Machine_Exceptions/t   ada-src/2ataspri.ads    /^   type Machine_Exceptions is 
new Interfaces.C.POS/
+MakeDispose    pyt-src/server.py       /^    def MakeDispose(self):$/
+MakeSitelist   pyt-src/server.py       /^    def MakeSitelist(self, master):$/
+Makefile_filenames     c-src/etags.c   603
+Makefile_help  c-src/etags.c   605
+Makefile_targets       c-src/etags.c   /^Makefile_targets (FILE *inf)$/
+Mc     cp-src/c.C      /^int main (void) { my_function0(0); my_function1(1)/
+Mcccp  cccp.y  /^main ()$/
+Mcccp  y-src/cccp.y    /^main ()$/
+Mconway.cpp    cp-src/conway.cpp       /^void main(void)$/
+Metags c-src/etags.c   /^main (int argc, char **argv)$/
+Mfail  cp-src/fail.C   /^main()$/
+Mkai-test.pl   perl-src/kai-test.pl    /^package main;$/
+More_Lisp_Bits c-src/emacs/src/lisp.h  801
+MoveLayerAfter lua-src/allegro.lua     /^function MoveLayerAfter (this_one)$/
+MoveLayerBefore        lua-src/allegro.lua     /^function MoveLayerBefore 
(this_one)$/
+MoveLayerBottom        lua-src/allegro.lua     /^function MoveLayerBottom ()$/
+MoveLayerTop   lua-src/allegro.lua     /^function MoveLayerTop ()$/
+NAME   y-src/cccp.c    8
+NATNUMP        c-src/emacs/src/lisp.h  /^NATNUMP (Lisp_Object x)$/
+NDEBUG c-src/etags.c   88
+NE     y-src/parse.c   6
+NEG    y-src/parse.c   9
+NEXT_ALMOST_PRIME_LIMIT        c-src/emacs/src/lisp.h  3573
+NILP   c-src/emacs/src/lisp.h  /^# define NILP(x) lisp_h_NILP (x)$/
+NIL_IS_ZERO    c-src/emacs/src/lisp.h  1515
+NONPOINTER_BITS        c-src/emacs/src/lisp.h  78
+NONPOINTER_BITS        c-src/emacs/src/lisp.h  80
+NONSRCS        Makefile        /^NONSRCS=.\/f-src\/entry.strange 
.\/erl-src\/lists.erl /
+NONSRCS        make-src/Makefile       35
+NOTEQUAL       y-src/cccp.c    13
+NULL   cccp.y  51
+NULL   y-src/cccp.y    51
+NULL_PTR       cccp.y  63
+NULL_PTR       y-src/cccp.y    63
+NUMSTATS       objc-src/PackInsp.h     36
+NUM_MOD_NAMES  c-src/emacs/src/keyboard.c      6325
+NUM_RECENT_KEYS        c-src/emacs/src/keyboard.c      91
+NameHasChar    pas-src/common.pas      /^function NameHasChar; (* (TheName : 
NameString; Th/
+NameStringLess pas-src/common.pas      /^function NameStringLess;(*(var 
Name1,Name2 : NameS/
+NewLayer       lua-src/allegro.lua     /^function NewLayer (name, x, y, w, h)$/
+NewLayerSet    lua-src/allegro.lua     /^function NewLayerSet (name)$/
+NewNameString  pas-src/common.pas      /^procedure NewNameString; (* (var NSP: 
NameStringPo/
+NmStrToErrStr  pas-src/common.pas      /^function NmStrToErrStr;(*($/
+NmStrToInteger pas-src/common.pas      /^function NmStrToInteger; (* (Str : 
NameString) : i/
+NoExit cp-src/abstract.H       421
+NoExit::NoExit cp-src/abstract.C       /^NoExit::NoExit()$/
+NoExit::SetDimensions  cp-src/abstract.C       /^void 
NoExit::SetDimensions(void)$/
+NoExit::SetFather      cp-src/abstract.C       /^void 
NoExit::SetFather(Tree_Node *f)$/
+NoExit::SetPosition    cp-src/abstract.C       /^void 
NoExit::SetPosition(Coord xx, Coord yy)$/
+NoExperiment   cp-src/abstract.H       545
+NoExperiment::NoExperiment     cp-src/abstract.C       
/^NoExperiment::NoExperiment()$/
+NoExperiment::SetDimensions    cp-src/abstract.C       /^void 
NoExperiment::SetDimensions(void)$/
+NoExperiment::SetFather        cp-src/abstract.C       /^void 
NoExperiment::SetFather(Tree_Node *f)$/
+NoExperiment::SetPosition      cp-src/abstract.C       /^void 
NoExperiment::SetPosition(Coord xx, Coord yy)/
+NoGuard        cp-src/abstract.H       511
+NoGuard::NoGuard       cp-src/abstract.C       /^NoGuard::NoGuard()$/
+NoGuard::SetDimensions cp-src/abstract.C       /^void 
NoGuard::SetDimensions(void)$/
+NoGuard::SetFather     cp-src/abstract.C       /^void 
NoGuard::SetFather(Tree_Node *f)$/
+NoGuard::SetPosition   cp-src/abstract.C       /^void 
NoGuard::SetPosition(Coord xx, Coord yy)$/
+NullSecurityManager    java-src/SMan.java      817
+NullSecurityManager.checkAccept        java-src/SMan.java      /^    public 
void checkAccept(String host, int port)/
+NullSecurityManager.checkAccess        java-src/SMan.java      /^    public 
void checkAccess(Thread g) { }$/
+NullSecurityManager.checkAccess        java-src/SMan.java      /^    public 
void checkAccess(ThreadGroup g) { }$/
+NullSecurityManager.checkAwtEventQueueAccess   java-src/SMan.java      /^    
public void checkAwtEventQueueAccess() { }$/
+NullSecurityManager.checkConnect       java-src/SMan.java      /^    public 
void checkConnect(String host, int port/
+NullSecurityManager.checkConnect       java-src/SMan.java      /^    public 
void checkConnect(String host, int port/
+NullSecurityManager.checkCreateClassLoader     java-src/SMan.java      /^    
public void checkCreateClassLoader() { } $/
+NullSecurityManager.checkDelete        java-src/SMan.java      /^    public 
void checkDelete(String file) { }$/
+NullSecurityManager.checkExec  java-src/SMan.java      /^    public void 
checkExec(String cmd) { }$/
+NullSecurityManager.checkExit  java-src/SMan.java      /^    public void 
checkExit(int status) { }$/
+NullSecurityManager.checkLink  java-src/SMan.java      /^    public void 
checkLink(String lib) { }$/
+NullSecurityManager.checkListen        java-src/SMan.java      /^    public 
void checkListen(int port) { }$/
+NullSecurityManager.checkMemberAccess  java-src/SMan.java      /^    public 
void checkMemberAccess(Class clazz, int/
+NullSecurityManager.checkMulticast     java-src/SMan.java      /^    public 
void checkMulticast(InetAddress maddr) /
+NullSecurityManager.checkMulticast     java-src/SMan.java      /^    public 
void checkMulticast(InetAddress maddr, /
+NullSecurityManager.checkPackageAccess java-src/SMan.java      /^    public 
void checkPackageAccess(String pkg) { }/
+NullSecurityManager.checkPackageDefinition     java-src/SMan.java      /^    
public void checkPackageDefinition(String pkg)/
+NullSecurityManager.checkPrintJobAccess        java-src/SMan.java      /^    
public void checkPrintJobAccess() { }$/
+NullSecurityManager.checkPropertiesAccess      java-src/SMan.java      /^    
public void checkPropertiesAccess() { }$/
+NullSecurityManager.checkPropertyAccess        java-src/SMan.java      /^    
public void checkPropertyAccess(String key) { /
+NullSecurityManager.checkPropertyAccess        java-src/SMan.java      /^    
public void checkPropertyAccess(String key, St/
+NullSecurityManager.checkRead  java-src/SMan.java      /^    public void 
checkRead(FileDescriptor fd) { }$/
+NullSecurityManager.checkRead  java-src/SMan.java      /^    public void 
checkRead(String file) { }$/
+NullSecurityManager.checkRead  java-src/SMan.java      /^    public void 
checkRead(String file, Object cont/
+NullSecurityManager.checkSecurityAccess        java-src/SMan.java      /^    
public void checkSecurityAccess(String provide/
+NullSecurityManager.checkSetFactory    java-src/SMan.java      /^    public 
void checkSetFactory() { }$/
+NullSecurityManager.checkSystemClipboardAccess java-src/SMan.java      /^    
public void checkSystemClipboardAccess() { }$/
+NullSecurityManager.checkTopLevelWindow        java-src/SMan.java      /^    
public boolean checkTopLevelWindow(Object wind/
+NullSecurityManager.checkWrite java-src/SMan.java      /^    public void 
checkWrite(FileDescriptor fd) { }$/
+NullSecurityManager.checkWrite java-src/SMan.java      /^    public void 
checkWrite(String file) { }$/
+OBJCPPSRC      Makefile        /^OBJCPPSRC=$(addprefix 
.\/objcpp-src\/,SimpleCalc.H S/
+OBJCSRC        Makefile        /^OBJCSRC=$(addprefix 
.\/objc-src\/,Subprocess.h Subpr/
+OPENBUTTON     objc-src/PackInsp.m     47
+OPTIONS        Makefile        /^OPTIONS=--members --declarations 
address@hidden/
+OR     y-src/cccp.c    10
+OVERLAYP       c-src/emacs/src/lisp.h  /^OVERLAYP (Lisp_Object x)$/
+Objc_help      c-src/etags.c   613
+Objc_suffixes  c-src/etags.c   609
+OperatorFun    c-src/h.h       88
+Overview       tex-src/gzip.texi       /address@hidden Overview, Sample, 
Copying, Top$/
+PASSRC Makefile        /^PASSRC=$(addprefix .\/pas-src\/,common.pas)$/
+PCTEST_H       cp-src/Pctest.h 24
+PDT    c-src/h.h       /^  Date 04 May 87 235311 PDT (Mon)$/
+PERLSRC        Makefile        /^PERLSRC=$(addprefix 
.\/perl-src\/,htlmify-cystic yag/
+PERM   cp-src/cfront.H /^#define PERM(p) p->permanent=1$/
+PHPSRC Makefile        /^PHPSRC=$(addprefix .\/php-src\/,lce_functions.php pt/
+PHP_functions  c-src/etags.c   /^PHP_functions (FILE *inf)$/
+PHP_help       c-src/etags.c   639
+PHP_suffixes   c-src/etags.c   637
+POEntry        php-src/lce_functions.php       105
+POEntry        php-src/lce_functions.php       /^      function POEntry()$/
+POEntryAD      php-src/lce_functions.php       29
+PORManager     php-src/lce_functions.php       498
+PORManager     php-src/lce_functions.php       /^      function PORManager()$/
+POReader       php-src/lce_functions.php       163
+POReader       php-src/lce_functions.php       /^      function 
POReader($domain, $filename)$/
+PRINT_UNDOCUMENTED_OPTIONS_HELP        c-src/etags.c   804
+PROCESSP       c-src/emacs/src/lisp.h  /^PROCESSP (Lisp_Object a)$/
+PROLSRC        Makefile        /^PROLSRC=$(addprefix 
.\/prol-src\/,ordsets.prolog nat/
+PROP   c-src/emacs/src/keyboard.c      /^#define PROP(IDX) AREF 
(tool_bar_item_properties, /
+PROP   c-src/emacs/src/keyboard.c      8379
+PROTECT_MALLOC_STATE   c-src/emacs/src/gmalloc.c       /^#define 
PROTECT_MALLOC_STATE(PROT) protect_malloc_/
+PROTECT_MALLOC_STATE   c-src/emacs/src/gmalloc.c       /^#define 
PROTECT_MALLOC_STATE(PROT)    \/* empty *\/$/
+PRTPKG f-src/entry.for /^      LOGICAL FUNCTION PRTPKG ( SHORT, LONG, EXPL,/
+PRTPKG f-src/entry.strange_suffix      /^      LOGICAL FUNCTION PRTPKG ( 
SHORT, LONG, EXPL,/
+PSEUDO c-src/sysdep.h  /^#define       PSEUDO(name, syscall_name, args)        
                              /
+PSEUDOVECSIZE  c-src/emacs/src/lisp.h  /^#define PSEUDOVECSIZE(type, 
nonlispfield)                     \\$/
+PSEUDOVECTORP  c-src/emacs/src/lisp.h  /^PSEUDOVECTORP (Lisp_Object a, int 
code)$/
+PSEUDOVECTOR_AREA_BITS c-src/emacs/src/lisp.h  818
+PSEUDOVECTOR_FLAG      c-src/emacs/src/lisp.h  774
+PSEUDOVECTOR_REST_BITS c-src/emacs/src/lisp.h  813
+PSEUDOVECTOR_REST_MASK c-src/emacs/src/lisp.h  814
+PSEUDOVECTOR_SIZE_BITS c-src/emacs/src/lisp.h  808
+PSEUDOVECTOR_SIZE_MASK c-src/emacs/src/lisp.h  809
+PSEUDOVECTOR_TYPEP     c-src/emacs/src/lisp.h  /^PSEUDOVECTOR_TYPEP (struct 
vectorlike_header *a, i/
+PSSRC  Makefile        /^PSSRC=$(addprefix .\/ps-src\/,rfc1245.ps)$/
+PS_functions   c-src/etags.c   /^PS_functions (FILE *inf)$/
+PS_help        c-src/etags.c   649
+PS_suffixes    c-src/etags.c   647
+PTY_LENGTH     objc-src/Subprocess.m   21
+PTY_TEMPLATE   objc-src/Subprocess.m   20
+PUSH_C_STR     c-src/emacs/src/keyboard.c      /^#define PUSH_C_STR(str, 
listvar) \\$/
+PUSH_HANDLER   c-src/emacs/src/lisp.h  /^#define PUSH_HANDLER(c, tag_ch_val, 
handlertype)      \\/
+PVEC_BOOL_VECTOR       c-src/emacs/src/lisp.h  787
+PVEC_BUFFER    c-src/emacs/src/lisp.h  788
+PVEC_CHAR_TABLE        c-src/emacs/src/lisp.h  796
+PVEC_COMPILED  c-src/emacs/src/lisp.h  795
+PVEC_FONT      c-src/emacs/src/lisp.h  798
+PVEC_FRAME     c-src/emacs/src/lisp.h  785
+PVEC_FREE      c-src/emacs/src/lisp.h  783
+PVEC_HASH_TABLE        c-src/emacs/src/lisp.h  789
+PVEC_NORMAL_VECTOR     c-src/emacs/src/lisp.h  782
+PVEC_OTHER     c-src/emacs/src/lisp.h  793
+PVEC_PROCESS   c-src/emacs/src/lisp.h  784
+PVEC_SUBR      c-src/emacs/src/lisp.h  792
+PVEC_SUB_CHAR_TABLE    c-src/emacs/src/lisp.h  797
+PVEC_TERMINAL  c-src/emacs/src/lisp.h  790
+PVEC_TYPE_MASK c-src/emacs/src/lisp.h  819
+PVEC_WINDOW    c-src/emacs/src/lisp.h  786
+PVEC_WINDOW_CONFIGURATION      c-src/emacs/src/lisp.h  791
+PYTSRC Makefile        /^PYTSRC=$(addprefix .\/pyt-src\/,server.py)$/
+PackageInspector       objc-src/PackInsp.h     /address@hidden 
PackageInspector:WMInspector$/
+Par    cp-src/abstract.H       933
+Par::Par       cp-src/abstract.C       /^Par::Par(Gate_Decl_List *g_d_l, 
Tree_Node *op, Tre/
+Par::SetCollapsed      cp-src/abstract.C       /^void Par::SetCollapsed(char 
t)$/
+Par::SetDimensions     cp-src/abstract.C       /^void 
Par::SetDimensions(void)$/
+Par::SetFather cp-src/abstract.C       /^void Par::SetFather(Tree_Node *f)$/
+Par::SetPosition       cp-src/abstract.C       /^void Par::SetPosition(Coord 
xx, Coord yy)$/
+Par::SetTextual        cp-src/abstract.C       /^void Par::SetTextual(char t, 
char s)$/
+Par::bex       cp-src/abstract.H       936
+Par::border    cp-src/abstract.H       938
+Par::gate_decl_list    cp-src/abstract.H       935
+Par::oper      cp-src/abstract.H       936
+Par::xl        cp-src/abstract.H       937
+Par::yl        cp-src/abstract.H       937
+Parallel       cp-src/abstract.H       888
+Parallel::GetOperType  cp-src/abstract.H       /^ char GetOperType(void) { 
return(oper->GetType());/
+Parallel::Get_Textual_H        cp-src/abstract.C       /^int 
Parallel::Get_Textual_H()$/
+Parallel::Get_Textual_W        cp-src/abstract.C       /^int 
Parallel::Get_Textual_W()$/
+Parallel::Parallel     cp-src/abstract.C       /^Parallel::Parallel(Tree_Node 
*b1, Tree_Node *op, T/
+Parallel::SetCollapsed cp-src/abstract.C       /^void 
Parallel::SetCollapsed(char t)$/
+Parallel::SetDimensions        cp-src/abstract.C       /^void 
Parallel::SetDimensions(void)$/
+Parallel::SetFather    cp-src/abstract.C       /^void 
Parallel::SetFather(Tree_Node *f)$/
+Parallel::SetPosition  cp-src/abstract.C       /^void 
Parallel::SetPosition(Coord xx, Coord yy)$/
+Parallel::SetTerminalPos       cp-src/abstract.C       /^void 
Parallel::SetTerminalPos()$/
+Parallel::SetTextual   cp-src/abstract.C       /^void 
Parallel::SetTextual(char t, char s)$/
+Parallel::bex1 cp-src/abstract.H       890
+Parallel::bex2 cp-src/abstract.H       890
+Parallel::border       cp-src/abstract.H       894
+Parallel::delta        cp-src/abstract.H       893
+Parallel::havebox      cp-src/abstract.H       892
+Parallel::oper cp-src/abstract.H       890
+Parallel::xl   cp-src/abstract.H       891
+Parallel::yl   cp-src/abstract.H       891
+Parallel::yl1  cp-src/abstract.H       891
+Pascal_functions       c-src/etags.c   /^Pascal_functions (FILE *inf)$/
+Pascal_help    c-src/etags.c   621
+Pascal_suffixes        c-src/etags.c   619
+Pctest cp-src/Pctest.h 56
+Pctest::GetAction      cp-src/Pctest.h /^    virtual PctestActionType 
GetAction(TestRecord /
+Pctest::GetTargetName  cp-src/Pctest.h /^    virtual char *GetTargetName() { 
return targetN/
+Pctest::Pctest cp-src/Pctest.h /^    Pctest() {$/
+Pctest::initialized    cp-src/Pctest.h 93
+Pctest::syscallTime    cp-src/Pctest.h 95
+Pctest::targetName     cp-src/Pctest.h 94
+Pctest::~Pctest        cp-src/Pctest.h /^    virtual ~Pctest() { };$/
+PctestActionType       cp-src/Pctest.h 54
+Perl_functions c-src/etags.c   /^Perl_functions (FILE *inf)$/
+Perl_help      c-src/etags.c   630
+Perl_interpreters      c-src/etags.c   628
+Perl_suffixes  c-src/etags.c   626
+Pkg1/b ada-src/etags-test-for.ada      /^package body Pkg1 is$/
+Pkg1/b ada-src/waroquiers.ada  /^package body Pkg1 is$/
+Pkg1/s ada-src/etags-test-for.ada      /^package Pkg1 is$/
+Pkg1/s ada-src/waroquiers.ada  /^package Pkg1 is$/
+Pkg1_Func1/f   ada-src/etags-test-for.ada      /^  function Pkg1_Func1 return 
Boolean;$/
+Pkg1_Func1/f   ada-src/etags-test-for.ada      /^  function Pkg1_Func1 return 
Boolean is separate;$/
+Pkg1_Func1/f   ada-src/etags-test-for.ada      /^function  Pkg1_Func1 return 
Boolean is$/
+Pkg1_Func1/f   ada-src/waroquiers.ada  /^  function Pkg1_Func1 return 
Boolean;$/
+Pkg1_Func1/f   ada-src/waroquiers.ada  /^  function Pkg1_Func1 return Boolean 
is separate;$/
+Pkg1_Func1/f   ada-src/waroquiers.ada  /^function  Pkg1_Func1 return Boolean 
is$/
+Pkg1_Func2/f   ada-src/etags-test-for.ada      /^  function Pkg1_Func2 (Ijk : 
Integer; Z : Integer)/
+Pkg1_Func2/f   ada-src/etags-test-for.ada      /^  function Pkg1_Func2 (Ijk : 
Integer; Z : Integer)/
+Pkg1_Func2/f   ada-src/waroquiers.ada  /^  function Pkg1_Func2 (Ijk : Integer; 
Z : Integer)/
+Pkg1_Func2/f   ada-src/waroquiers.ada  /^  function Pkg1_Func2 (Ijk : Integer; 
Z : Integer)/
+Pkg1_Pkg1/b    ada-src/etags-test-for.ada      /^  package body Pkg1_Pkg1 is 
separate;$/
+Pkg1_Pkg1/b    ada-src/etags-test-for.ada      /^package body Pkg1_Pkg1 is$/
+Pkg1_Pkg1/b    ada-src/waroquiers.ada  /^  package body Pkg1_Pkg1 is 
separate;$/
+Pkg1_Pkg1/b    ada-src/waroquiers.ada  /^package body Pkg1_Pkg1 is$/
+Pkg1_Pkg1/s    ada-src/etags-test-for.ada      /^  package Pkg1_Pkg1 is$/
+Pkg1_Pkg1/s    ada-src/waroquiers.ada  /^  package Pkg1_Pkg1 is$/
+Pkg1_Pkg1_Proc1/p      ada-src/etags-test-for.ada      /^    procedure 
Pkg1_Pkg1_Proc1;$/
+Pkg1_Pkg1_Proc1/p      ada-src/etags-test-for.ada      /^  procedure 
Pkg1_Pkg1_Proc1 is$/
+Pkg1_Pkg1_Proc1/p      ada-src/waroquiers.ada  /^    procedure 
Pkg1_Pkg1_Proc1;$/
+Pkg1_Pkg1_Proc1/p      ada-src/waroquiers.ada  /^  procedure Pkg1_Pkg1_Proc1 
is$/
+Pkg1_Proc1/p   ada-src/etags-test-for.ada      /^  procedure Pkg1_Proc1;$/
+Pkg1_Proc1/p   ada-src/etags-test-for.ada      /^  procedure Pkg1_Proc1 is$/
+Pkg1_Proc1/p   ada-src/waroquiers.ada  /^  procedure Pkg1_Proc1;$/
+Pkg1_Proc1/p   ada-src/waroquiers.ada  /^  procedure Pkg1_Proc1 is$/
+Pkg1_Proc2/p   ada-src/etags-test-for.ada      /^  procedure Pkg1_Proc2 (I : 
Integer);$/
+Pkg1_Proc2/p   ada-src/etags-test-for.ada      /^  procedure Pkg1_Proc2 (I : 
Integer) is$/
+Pkg1_Proc2/p   ada-src/waroquiers.ada  /^  procedure Pkg1_Proc2 (I : 
Integer);$/
+Pkg1_Proc2/p   ada-src/waroquiers.ada  /^  procedure Pkg1_Proc2 (I : Integer) 
is$/
+PostControls   pyt-src/server.py       /^    def PostControls(self):$/
+Pre_Call_State/t       ada-src/2ataspri.ads    /^   type Pre_Call_State is new 
System.Address;$/
+Private_T/b    ada-src/etags-test-for.ada      /^    task body Private_T is$/
+Private_T/b    ada-src/waroquiers.ada  /^    task body Private_T is$/
+Private_T/k    ada-src/etags-test-for.ada      /^    task Private_T;$/
+Private_T/k    ada-src/waroquiers.ada  /^    task Private_T;$/
+Private_T/p    ada-src/etags-test-for.ada      /^    procedure Private_T;$/
+Private_T/p    ada-src/etags-test-for.ada      /^    procedure Private_T is$/
+Private_T/p    ada-src/waroquiers.ada  /^    procedure Private_T;$/
+Private_T/p    ada-src/waroquiers.ada  /^    procedure Private_T is$/
+Private_T/t    ada-src/etags-test-for.ada      /^  type Private_T is private;$/
+Private_T/t    ada-src/etags-test-for.ada      /^  type Private_T is$/
+Private_T/t    ada-src/waroquiers.ada  /^  type Private_T is private;$/
+Private_T/t    ada-src/waroquiers.ada  /^  type Private_T is$/
+Problems       tex-src/gzip.texi       /address@hidden Problems, Concept 
Index, Tapes, Top$/
+Proc/t ada-src/2ataspri.ads    /^   type Proc is access procedure (Addr : 
System.Ad/
+Proc_Inst      cp-src/abstract.H       867
+Proc_Inst::Proc_Inst   cp-src/abstract.C       /^Proc_Inst::Proc_Inst(ID_Place 
*id, ID_List *g_i_l,/
+Proc_Inst::SetCollapsed        cp-src/abstract.C       /^void 
Proc_Inst::SetCollapsed(char t)$/
+Proc_Inst::SetDimensions       cp-src/abstract.C       /^void 
Proc_Inst::SetDimensions(void)$/
+Proc_Inst::SetFather   cp-src/abstract.C       /^void 
Proc_Inst::SetFather(Tree_Node *f)$/
+Proc_Inst::SetPosition cp-src/abstract.C       /^void 
Proc_Inst::SetPosition(Coord xx, Coord yy)$/
+Proc_Inst::SetTextual  cp-src/abstract.C       /^void 
Proc_Inst::SetTextual(char t, char s)$/
+Proc_Inst::Xclose      cp-src/abstract.H       872
+Proc_Inst::Xopen       cp-src/abstract.H       872
+Proc_Inst::border      cp-src/abstract.H       874
+Proc_Inst::gate_list   cp-src/abstract.H       869
+Proc_Inst::hp  cp-src/abstract.H       873
+Proc_Inst::ident       cp-src/abstract.H       870
+Proc_Inst::value_expr_list     cp-src/abstract.H       871
+Proc_Inst::yl1 cp-src/abstract.H       872
+Proc_Inst::yp  cp-src/abstract.H       872
+Proc_List      cp-src/abstract.H       367
+Proc_List::GetPath     cp-src/abstract.C       /^char *Proc_List::GetPath()$/
+Proc_List::Proc_List   cp-src/abstract.C       /^Proc_List::Proc_List(Process 
*el, Proc_List *nxt)$/
+Proc_List::SetDimensions       cp-src/abstract.C       /^void 
Proc_List::SetDimensions(void)$/
+Proc_List::SetFather   cp-src/abstract.C       /^void 
Proc_List::SetFather(Tree_Node *f)$/
+Proc_List::SetPath     cp-src/abstract.C       /^void Proc_List::SetPath(char 
*p, char n, int& np, /
+Proc_List::SetPosition cp-src/abstract.C       /^void 
Proc_List::SetPosition(Coord xx, Coord yy)$/
+Proc_List::elem        cp-src/abstract.H       369
+Proc_List::next        cp-src/abstract.H       370
+Process        cp-src/abstract.H       337
+Process::GetMaxX       cp-src/abstract.C       /^Coord Process::GetMaxX()$/
+Process::GetMaxY       cp-src/abstract.C       /^Coord Process::GetMaxY()$/
+Process::GetNesting    cp-src/abstract.H       /^ char GetNesting() 
{return(nesting);};$/
+Process::MaxX  cp-src/abstract.H       347
+Process::MaxY  cp-src/abstract.H       347
+Process::Process       cp-src/abstract.C       /^Process::Process(Comment_List 
*c_l, ID_Place *id, /
+Process::SetDimensions cp-src/abstract.C       /^void 
Process::SetDimensions(void)$/
+Process::SetFather     cp-src/abstract.C       /^void 
Process::SetFather(Tree_Node *f)$/
+Process::SetPath       cp-src/abstract.C       /^void Process::SetPath(char 
*p, char n, int& np, in/
+Process::SetPosition   cp-src/abstract.C       /^void 
Process::SetPosition(Coord xx, Coord yy)$/
+Process::com_list      cp-src/abstract.H       339
+Process::def   cp-src/abstract.H       343
+Process::func  cp-src/abstract.H       344
+Process::gate_list     cp-src/abstract.H       341
+Process::id_decl_list  cp-src/abstract.H       342
+Process::ident cp-src/abstract.H       340
+Process::nesting       cp-src/abstract.H       345
+Process::yl1   cp-src/abstract.H       346
+Process::yl2   cp-src/abstract.H       346
+Process::yl3   cp-src/abstract.H       346
+Process::ypath cp-src/abstract.H       346
+Prolog_functions       c-src/etags.c   /^Prolog_functions (FILE *inf)$/
+Prolog_help    c-src/etags.c   654
+Prolog_suffixes        c-src/etags.c   652
+Public_T/t     ada-src/etags-test-for.ada      /^  type Public_T is$/
+Public_T/t     ada-src/waroquiers.ada  /^  type Public_T is$/
+Python_functions       c-src/etags.c   /^Python_functions (FILE *inf)$/
+Python_help    c-src/etags.c   660
+Python_suffixes        c-src/etags.c   658
+QUIT   c-src/emacs/src/lisp.h  3101
+QUITP  c-src/emacs/src/lisp.h  3112
+Qpre_abbrev_expand_hook        c-src/abbrev.c  82
+Query  cp-src/abstract.H       593
+Query::Query   cp-src/abstract.C       /^Query::Query(Id_Decl *i_d)$/
+Query::SetCollapsed    cp-src/abstract.C       /^void Query::SetCollapsed(char 
t)$/
+Query::SetDimensions   cp-src/abstract.C       /^void 
Query::SetDimensions(void)$/
+Query::SetFather       cp-src/abstract.C       /^void 
Query::SetFather(Tree_Node *f)$/
+Query::SetPosition     cp-src/abstract.C       /^void Query::SetPosition(Coord 
xx, Coord yy)$/
+Query::id_decl cp-src/abstract.H       595
+RANGED_INTEGERP        c-src/emacs/src/lisp.h  /^RANGED_INTEGERP (intmax_t lo, 
Lisp_Object x, intma/
+RCSid  objc-src/PackInsp.m     30
+READABLE_EVENTS_DO_TIMERS_NOW  c-src/emacs/src/keyboard.c      346
+READABLE_EVENTS_FILTER_EVENTS  c-src/emacs/src/keyboard.c      347
+READABLE_EVENTS_IGNORE_SQUEEZABLES     c-src/emacs/src/keyboard.c      348
+RECC_ALNUM     c-src/emacs/src/regex.h 610
+RECC_ALPHA     c-src/emacs/src/regex.h 610
+RECC_ASCII     c-src/emacs/src/regex.h 617
+RECC_BLANK     c-src/emacs/src/regex.h 615
+RECC_CNTRL     c-src/emacs/src/regex.h 613
+RECC_DIGIT     c-src/emacs/src/regex.h 614
+RECC_ERROR     c-src/emacs/src/regex.h 609
+RECC_GRAPH     c-src/emacs/src/regex.h 611
+RECC_LOWER     c-src/emacs/src/regex.h 612
+RECC_MULTIBYTE c-src/emacs/src/regex.h 616
+RECC_NONASCII  c-src/emacs/src/regex.h 616
+RECC_PRINT     c-src/emacs/src/regex.h 611
+RECC_PUNCT     c-src/emacs/src/regex.h 613
+RECC_SPACE     c-src/emacs/src/regex.h 615
+RECC_UNIBYTE   c-src/emacs/src/regex.h 617
+RECC_UPPER     c-src/emacs/src/regex.h 612
+RECC_WORD      c-src/emacs/src/regex.h 610
+RECC_XDIGIT    c-src/emacs/src/regex.h 614
+REGEX  Makefile        /^REGEX=\/[ \\t]*DEFVAR_[A-Z_ \\t\\n(]+"\\([^"]+\\)"\/$/
+REGS_FIXED     c-src/emacs/src/regex.h 378
+REGS_REALLOCATE        c-src/emacs/src/regex.h 377
+REGS_UNALLOCATED       c-src/emacs/src/regex.h 376
+REG_BADBR      c-src/emacs/src/regex.h 313
+REG_BADPAT     c-src/emacs/src/regex.h 305
+REG_BADRPT     c-src/emacs/src/regex.h 316
+REG_EBRACE     c-src/emacs/src/regex.h 312
+REG_EBRACK     c-src/emacs/src/regex.h 310
+REG_ECOLLATE   c-src/emacs/src/regex.h 306
+REG_ECTYPE     c-src/emacs/src/regex.h 307
+REG_EEND       c-src/emacs/src/regex.h 319
+REG_EESCAPE    c-src/emacs/src/regex.h 308
+REG_ENOSYS     c.c     279
+REG_ENOSYS     c-src/emacs/src/regex.h 297
+REG_EPAREN     c-src/emacs/src/regex.h 311
+REG_ERANGE     c-src/emacs/src/regex.h 314
+REG_ERANGEX    c-src/emacs/src/regex.h 322
+REG_ERPAREN    c-src/emacs/src/regex.h 321
+REG_ESIZE      c-src/emacs/src/regex.h 320
+REG_ESPACE     c-src/emacs/src/regex.h 315
+REG_ESUBREG    c-src/emacs/src/regex.h 309
+REG_EXTENDED   c-src/emacs/src/regex.h 263
+REG_ICASE      c-src/emacs/src/regex.h 267
+REG_NEWLINE    c-src/emacs/src/regex.h 272
+REG_NOERROR    c-src/emacs/src/regex.h 300
+REG_NOMATCH    c-src/emacs/src/regex.h 301
+REG_NOSUB      c-src/emacs/src/regex.h 276
+REG_NOTBOL     c-src/emacs/src/regex.h 286
+REG_NOTEOL     c-src/emacs/src/regex.h 289
+RESUME_POLLING c-src/emacs/src/keyboard.c      2170
+RETURN_UNGCPRO c-src/emacs/src/lisp.h  /^#define RETURN_UNGCPRO(expr)          
        \\$/
+RE_BACKSLASH_ESCAPE_IN_LISTS   c-src/emacs/src/regex.h 47
+RE_BK_PLUS_QM  c-src/emacs/src/regex.h 52
+RE_CHAR_CLASSES        c-src/emacs/src/regex.h 58
+RE_CONTEXT_INDEP_ANCHORS       c-src/emacs/src/regex.h 72
+RE_CONTEXT_INDEP_OPS   c-src/emacs/src/regex.h 80
+RE_CONTEXT_INVALID_OPS c-src/emacs/src/regex.h 84
+RE_DEBUG       c-src/emacs/src/regex.h 161
+RE_DOT_NEWLINE c-src/emacs/src/regex.h 88
+RE_DOT_NOT_NULL        c-src/emacs/src/regex.h 92
+RE_DUP_MAX     c-src/emacs/src/regex.h 253
+RE_DUP_MAX     c-src/emacs/src/regex.h 256
+RE_FRUGAL      c-src/emacs/src/regex.h 147
+RE_HAT_LISTS_NOT_NEWLINE       c-src/emacs/src/regex.h 96
+RE_INTERVALS   c-src/emacs/src/regex.h 101
+RE_LIMITED_OPS c-src/emacs/src/regex.h 105
+RE_NEWLINE_ALT c-src/emacs/src/regex.h 109
+RE_NO_BK_BRACES        c-src/emacs/src/regex.h 114
+RE_NO_BK_PARENS        c-src/emacs/src/regex.h 118
+RE_NO_BK_REFS  c-src/emacs/src/regex.h 122
+RE_NO_BK_VBAR  c-src/emacs/src/regex.h 126
+RE_NO_EMPTY_RANGES     c-src/emacs/src/regex.h 132
+RE_NO_GNU_OPS  c-src/emacs/src/regex.h 144
+RE_NO_NEWLINE_ANCHOR   c-src/emacs/src/regex.h 153
+RE_NO_POSIX_BACKTRACKING       c-src/emacs/src/regex.h 140
+RE_NREGS       c-src/emacs/src/regex.h 440
+RE_SHY_GROUPS  c-src/emacs/src/regex.h 150
+RE_SYNTAX_AWK  c-src/emacs/src/regex.h 186
+RE_SYNTAX_ED   c-src/emacs/src/regex.h 216
+RE_SYNTAX_EGREP        c-src/emacs/src/regex.h 206
+RE_SYNTAX_EMACS        c-src/emacs/src/regex.h 183
+RE_SYNTAX_GNU_AWK      c-src/emacs/src/regex.h 193
+RE_SYNTAX_GREP c-src/emacs/src/regex.h 201
+RE_SYNTAX_POSIX_AWK    c-src/emacs/src/regex.h 197
+RE_SYNTAX_POSIX_BASIC  c-src/emacs/src/regex.h 225
+RE_SYNTAX_POSIX_EGREP  c-src/emacs/src/regex.h 212
+RE_SYNTAX_POSIX_EXTENDED       c-src/emacs/src/regex.h 234
+RE_SYNTAX_POSIX_MINIMAL_BASIC  c-src/emacs/src/regex.h 231
+RE_SYNTAX_POSIX_MINIMAL_EXTENDED       c-src/emacs/src/regex.h 242
+RE_SYNTAX_SED  c-src/emacs/src/regex.h 218
+RE_TRANSLATE_TYPE      c-src/emacs/src/regex.h 332
+RE_UNMATCHED_RIGHT_PAREN_ORD   c-src/emacs/src/regex.h 136
+RSH    y-src/cccp.c    17
+RTE/s  ada-src/2ataspri.adb    /^   package RTE renames 
Interfaces.C.POSIX_RTE;$/
+RUN    Makefile        /^RUN=$/
+Range  cp-src/Range.h  35
+Range::Range   cp-src/Range.h  /^  Range (void)$/
+Range::Range   cp-src/Range.h  /^  Range (const Range& r)$/
+Range::Range   cp-src/Range.h  /^  Range (double b, double l)$/
+Range::Range   cp-src/Range.h  /^  Range (double b, double l, double i)$/
+Range::base    cp-src/Range.h  /^  double base (void) const { return rng_base; 
 }$/
+Range::inc     cp-src/Range.h  /^  double inc (void) const { return rng_inc;   
}$/
+Range::limit   cp-src/Range.h  /^  double limit (void) const { return 
rng_limit; }$/
+Range::nelem   cp-src/Range.h  /^  int nelem (void) const { return rng_nelem; 
}$/
+Range::rng_base        cp-src/Range.h  79
+Range::rng_inc cp-src/Range.h  81
+Range::rng_limit       cp-src/Range.h  80
+Range::rng_nelem       cp-src/Range.h  83
+Range::set_base        cp-src/Range.h  /^  void set_base (double b) { rng_base 
= b;  }$/
+Range::set_inc cp-src/Range.h  /^  void set_inc (double i) { rng_inc = i;   }$/
+Range::set_limit       cp-src/Range.h  /^  void set_limit (double l) { 
rng_limit = l; }$/
+ReadVacation   cp-src/functions.cpp    /^void ReadVacation ( char *filename ) 
{$/
+Read_Lock/p    ada-src/2ataspri.adb    /^   procedure Read_Lock (L : in out 
Lock; Ceiling_V/
+Read_Lock/p    ada-src/2ataspri.ads    /^   procedure Read_Lock (L : in out 
Lock; Ceiling_V/
+ReleaseNameString      pas-src/common.pas      /^procedure ReleaseNameString; 
(* (var NSP: NameStri/
+RemoveLayer    lua-src/allegro.lua     /^function RemoveLayer ()$/
+RemoveUnderlineControl pas-src/common.pas      /^function 
RemoveUnderlineControl; (*($/
+ReprOfChar     pas-src/common.pas      /^function ReprOfChar; (*( ch : char) : 
NameString;*/
+S      c.c     156
+SAFE_ALLOCA    c-src/emacs/src/lisp.h  /^#define SAFE_ALLOCA(size) ((size) <= 
sa_avail                         \\/
+SAFE_ALLOCA_LISP       c-src/emacs/src/lisp.h  /^#define SAFE_ALLOCA_LISP(buf, 
nelt)                          \\$/
+SAFE_ALLOCA_STRING     c-src/emacs/src/lisp.h  /^#define 
SAFE_ALLOCA_STRING(ptr, string)                       \\$/
+SAFE_FREE      c-src/emacs/src/lisp.h  /^#define SAFE_FREE()                   
\\$/
+SAFE_NALLOCA   c-src/emacs/src/lisp.h  /^#define SAFE_NALLOCA(buf, multiplier, 
nitems)                  \\/
+SAVE_FUNCPOINTER       c-src/emacs/src/lisp.h  2049
+SAVE_INTEGER   c-src/emacs/src/lisp.h  2048
+SAVE_OBJECT    c-src/emacs/src/lisp.h  2051
+SAVE_POINTER   c-src/emacs/src/lisp.h  2050
+SAVE_SLOT_BITS c-src/emacs/src/lisp.h  2055
+SAVE_TYPE_BITS c-src/emacs/src/lisp.h  2062
+SAVE_TYPE_FUNCPTR_PTR_OBJ      c-src/emacs/src/lisp.h  2076
+SAVE_TYPE_INT_INT      c-src/emacs/src/lisp.h  2066
+SAVE_TYPE_INT_INT_INT  c-src/emacs/src/lisp.h  2067
+SAVE_TYPE_MEMORY       c-src/emacs/src/lisp.h  2080
+SAVE_TYPE_OBJ_OBJ      c-src/emacs/src/lisp.h  2069
+SAVE_TYPE_OBJ_OBJ_OBJ  c-src/emacs/src/lisp.h  2070
+SAVE_TYPE_OBJ_OBJ_OBJ_OBJ      c-src/emacs/src/lisp.h  2071
+SAVE_TYPE_PTR_INT      c-src/emacs/src/lisp.h  2073
+SAVE_TYPE_PTR_OBJ      c-src/emacs/src/lisp.h  2074
+SAVE_TYPE_PTR_PTR      c-src/emacs/src/lisp.h  2075
+SAVE_UNUSED    c-src/emacs/src/lisp.h  2047
+SAVE_VALUEP    c-src/emacs/src/lisp.h  /^SAVE_VALUEP (Lisp_Object x)$/
+SAVE_VALUE_SLOTS       c-src/emacs/src/lisp.h  2058
+SBYTES c-src/emacs/src/lisp.h  /^SBYTES (Lisp_Object string)$/
+SCHARS c-src/emacs/src/lisp.h  /^SCHARS (Lisp_Object string)$/
+SCREEN_FP      cp-src/screen.hpp       /^#define SCREEN_FP(x,y) \\$/
+SCREEN_START   cp-src/screen.hpp       33
+SDATA  c-src/emacs/src/lisp.h  /^SDATA (Lisp_Object string)$/
+SDTrefGetInteger       pas-src/common.pas      /^function SDTrefGetInteger : 
integer;$/
+SDTrefIsEnd    pas-src/common.pas      /^function SDTrefIsEnd : Boolean;$/
+SDTrefRecToString      pas-src/common.pas      /^procedure SDTrefRecToString  
(* ($/
+SDTrefSkipSpaces       pas-src/common.pas      /^procedure SDTrefSkipSpaces;$/
+SDTrefStringToRec      pas-src/common.pas      /^procedure SDTrefStringToRec 
(* ($/
+SETPRT f-src/entry.for /^       ENTRY  SETPRT ( SHORT, EXPL, LONG, TRACE, D/
+SETPRT f-src/entry.strange_suffix      /^       ENTRY  SETPRT ( SHORT, EXPL, 
LONG, TRACE, D/
+SET_SYMBOL_BLV c-src/emacs/src/lisp.h  /^SET_SYMBOL_BLV (struct Lisp_Symbol 
*sym, struct Li/
+SET_SYMBOL_FWD c-src/emacs/src/lisp.h  /^SET_SYMBOL_FWD (struct Lisp_Symbol 
*sym, union Lis/
+SET_SYMBOL_VAL c-src/emacs/src/lisp.h  /^# define SET_SYMBOL_VAL(sym, v) 
lisp_h_SET_SYMBOL_/
+SIMPLIFIED     cp-src/cfront.H 231
+SINGLE_LETTER_MOD      c-src/emacs/src/keyboard.c      /^#define 
SINGLE_LETTER_MOD(BIT)                                \\$/
+SINGLE_LETTER_MOD      c-src/emacs/src/keyboard.c      6212
+SINGLE_LETTER_MOD      c-src/emacs/src/keyboard.c      /^#define 
SINGLE_LETTER_MOD(BIT)                                \\$/
+SINGLE_LETTER_MOD      c-src/emacs/src/keyboard.c      6763
+SIZEFORMAT     objc-src/PackInsp.m     57
+SPECPDL_BACKTRACE      c-src/emacs/src/lisp.h  2948
+SPECPDL_LET    c-src/emacs/src/lisp.h  2949
+SPECPDL_LET_DEFAULT    c-src/emacs/src/lisp.h  2952
+SPECPDL_LET_LOCAL      c-src/emacs/src/lisp.h  2951
+SPECPDL_UNWIND c-src/emacs/src/lisp.h  2944
+SPECPDL_UNWIND_INT     c-src/emacs/src/lisp.h  2946
+SPECPDL_UNWIND_PTR     c-src/emacs/src/lisp.h  2945
+SPECPDL_UNWIND_VOID    c-src/emacs/src/lisp.h  2947
+SRCS   Makefile        /^SRCS=Makefile ${ADASRC} ${ASRC} ${CSRC} ${CPSRC} $/
+SREF   c-src/emacs/src/lisp.h  /^SREF (Lisp_Object string, ptrdiff_t index)$/
+SSDATA c-src/emacs/src/lisp.h  /^SSDATA (Lisp_Object string)$/
+SSET   c-src/emacs/src/lisp.h  /^SSET (Lisp_Object string, ptrdiff_t index, 
unsigne/
+STACK_CONS     c-src/emacs/src/lisp.h  /^#define STACK_CONS(a, b) \\$/
+STATE_ABORT    php-src/lce_functions.php       25
+STATE_COMPRESSD        objc-src/PackInsp.m     54
+STATE_INSTALLED        objc-src/PackInsp.m     53
+STATE_LOOP     php-src/lce_functions.php       27
+STATE_OK       php-src/lce_functions.php       26
+STATE_UNINSTALLED      objc-src/PackInsp.m     52
+STAT_EQ        objc-src/PackInsp.m     /^#define STAT_EQ(s1, s2)       
((s1)->st_ino == (s2)->st_/
+STDIN  c-src/etags.c   408
+STDIN  c-src/etags.c   411
+STOP_POLLING   c-src/emacs/src/keyboard.c      2166
+STRING_BYTES   c-src/emacs/src/lisp.h  /^STRING_BYTES (struct Lisp_String *s)$/
+STRING_BYTES_BOUND     c-src/emacs/src/lisp.h  1261
+STRING_MULTIBYTE       c-src/emacs/src/lisp.h  /^STRING_MULTIBYTE (Lisp_Object 
str)$/
+STRING_SET_CHARS       c-src/emacs/src/lisp.h  /^STRING_SET_CHARS (Lisp_Object 
string, ptrdiff_t ne/
+STRING_SET_MULTIBYTE   c-src/emacs/src/lisp.h  /^#define 
STRING_SET_MULTIBYTE(STR)                     \\$/
+STRING_SET_UNIBYTE     c-src/emacs/src/lisp.h  /^#define 
STRING_SET_UNIBYTE(STR)                               \\$/
+SUBRP  c-src/emacs/src/lisp.h  /^SUBRP (Lisp_Object a)$/
+SUB_CHAR_TABLE_OFFSET  c-src/emacs/src/lisp.h  1701
+SUB_CHAR_TABLE_P       c-src/emacs/src/lisp.h  /^SUB_CHAR_TABLE_P (Lisp_Object 
a)$/
+SXHASH_REDUCE  c-src/emacs/src/lisp.h  /^SXHASH_REDUCE (EMACS_UINT x)$/
+SYMBOLP        c-src/emacs/src/lisp.h  /^# define SYMBOLP(x) lisp_h_SYMBOLP 
(x)$/
+SYMBOL_BLV     c-src/emacs/src/lisp.h  /^SYMBOL_BLV (struct Lisp_Symbol *sym)$/
+SYMBOL_CONSTANT_P      c-src/emacs/src/lisp.h  /^# define 
SYMBOL_CONSTANT_P(sym) lisp_h_SYMBOL_CONS/
+SYMBOL_FORWARDED       c-src/emacs/src/lisp.h  651
+SYMBOL_FWD     c-src/emacs/src/lisp.h  /^SYMBOL_FWD (struct Lisp_Symbol *sym)$/
+SYMBOL_INDEX   c-src/emacs/src/lisp.h  /^#define SYMBOL_INDEX(sym) i##sym$/
+SYMBOL_INTERNED        c-src/emacs/src/lisp.h  642
+SYMBOL_INTERNED_IN_INITIAL_OBARRAY     c-src/emacs/src/lisp.h  643
+SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P   c-src/emacs/src/lisp.h  
/^SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P (Lisp_Object /
+SYMBOL_INTERNED_P      c-src/emacs/src/lisp.h  /^SYMBOL_INTERNED_P 
(Lisp_Object sym)$/
+SYMBOL_LOCALIZED       c-src/emacs/src/lisp.h  650
+SYMBOL_NAME    c-src/emacs/src/lisp.h  /^SYMBOL_NAME (Lisp_Object sym)$/
+SYMBOL_PLAINVAL        c-src/emacs/src/lisp.h  648
+SYMBOL_UNINTERNED      c-src/emacs/src/lisp.h  641
+SYMBOL_VAL     c-src/emacs/src/lisp.h  /^# define SYMBOL_VAL(sym) 
lisp_h_SYMBOL_VAL (sym)$/
+SYMBOL_VARALIAS        c-src/emacs/src/lisp.h  649
+SYSCALL        c-src/machsyscalls.c    /^#define       SYSCALL(name, number, 
type, args, typed_ar/
+Sample tex-src/gzip.texi       /address@hidden Sample, Invoking gzip, 
Overview, Top$/
+Scheme_functions       c-src/etags.c   /^Scheme_functions (FILE *inf)$/
+Scheme_help    c-src/etags.c   667
+Scheme_suffixes        c-src/etags.c   665
+SecurityManager        java-src/SMan.java      80
+SecurityManager.SecurityManager        java-src/SMan.java      /^    protected 
SecurityManager() {$/
+SecurityManager.checkAccept    java-src/SMan.java      /^    public void 
checkAccept(String host, int port)/
+SecurityManager.checkAccess    java-src/SMan.java      /^    public void 
checkAccess(Thread g) {$/
+SecurityManager.checkAccess    java-src/SMan.java      /^    public void 
checkAccess(ThreadGroup g) {$/
+SecurityManager.checkAwtEventQueueAccess       java-src/SMan.java      /^    
public void checkAwtEventQueueAccess() {$/
+SecurityManager.checkConnect   java-src/SMan.java      /^    public void 
checkConnect(String host, int port/
+SecurityManager.checkConnect   java-src/SMan.java      /^    public void 
checkConnect(String host, int port/
+SecurityManager.checkCreateClassLoader java-src/SMan.java      /^    public 
void checkCreateClassLoader() {$/
+SecurityManager.checkDelete    java-src/SMan.java      /^    public void 
checkDelete(String file) {$/
+SecurityManager.checkExec      java-src/SMan.java      /^    public void 
checkExec(String cmd) {$/
+SecurityManager.checkExit      java-src/SMan.java      /^    public void 
checkExit(int status) {$/
+SecurityManager.checkLink      java-src/SMan.java      /^    public void 
checkLink(String lib) {$/
+SecurityManager.checkListen    java-src/SMan.java      /^    public void 
checkListen(int port) {$/
+SecurityManager.checkMemberAccess      java-src/SMan.java      /^    public 
void checkMemberAccess(Class clazz, int/
+SecurityManager.checkMulticast java-src/SMan.java      /^    public void 
checkMulticast(InetAddress maddr) /
+SecurityManager.checkMulticast java-src/SMan.java      /^    public void 
checkMulticast(InetAddress maddr, /
+SecurityManager.checkPackageAccess     java-src/SMan.java      /^    public 
void checkPackageAccess(String pkg) {$/
+SecurityManager.checkPackageDefinition java-src/SMan.java      /^    public 
void checkPackageDefinition(String pkg)/
+SecurityManager.checkPrintJobAccess    java-src/SMan.java      /^    public 
void checkPrintJobAccess() {$/
+SecurityManager.checkPropertiesAccess  java-src/SMan.java      /^    public 
void checkPropertiesAccess() {$/
+SecurityManager.checkPropertyAccess    java-src/SMan.java      /^    public 
void checkPropertyAccess(String key) {$/
+SecurityManager.checkRead      java-src/SMan.java      /^    public void 
checkRead(FileDescriptor fd) {$/
+SecurityManager.checkRead      java-src/SMan.java      /^    public void 
checkRead(String file) {$/
+SecurityManager.checkRead      java-src/SMan.java      /^    public void 
checkRead(String file, Object cont/
+SecurityManager.checkSecurityAccess    java-src/SMan.java      /^    public 
void checkSecurityAccess(String action)/
+SecurityManager.checkSetFactory        java-src/SMan.java      /^    public 
void checkSetFactory() {$/
+SecurityManager.checkSystemClipboardAccess     java-src/SMan.java      /^    
public void checkSystemClipboardAccess() {$/
+SecurityManager.checkTopLevelWindow    java-src/SMan.java      /^    public 
boolean checkTopLevelWindow(Object wind/
+SecurityManager.checkWrite     java-src/SMan.java      /^    public void 
checkWrite(FileDescriptor fd) {$/
+SecurityManager.checkWrite     java-src/SMan.java      /^    public void 
checkWrite(String file) {$/
+SecurityManager.currentLoadedClass     java-src/SMan.java      /^    protected 
Class currentLoadedClass() {$/
+SecurityManager.getInCheck     java-src/SMan.java      /^    public boolean 
getInCheck() {$/
+SecurityManager.getSecurityContext     java-src/SMan.java      /^    public 
Object getSecurityContext() {$/
+SecurityManager.getThreadGroup java-src/SMan.java      /^    public 
ThreadGroup getThreadGroup() {$/
+SecurityManager.inCheck        java-src/SMan.java      87
+SecurityManager.inClass        java-src/SMan.java      /^    protected boolean 
inClass(String name) {$/
+SecurityManager.inClassLoader  java-src/SMan.java      /^    protected boolean 
inClassLoader() {$/
+SecurityManager.initialized    java-src/SMan.java      90
+SelectLayer    lua-src/allegro.lua     /^function SelectLayer (layer)$/
+Self/f ada-src/2ataspri.adb    /^   function Self return TCB_Ptr is$/
+Self/f ada-src/2ataspri.ads    /^   function Self return TCB_Ptr;$/
+Server pyt-src/server.py       /^class Server:$/
+ServerEdit     pyt-src/server.py       /^class ServerEdit(Frame):$/
+Set_Own_Priority/p     ada-src/2ataspri.adb    /^   procedure Set_Own_Priority 
(Prio : System.Any_P/
+Set_Own_Priority/p     ada-src/2ataspri.ads    /^   procedure Set_Own_Priority 
(Prio : System.Any_P/
+Set_Priority/p ada-src/2ataspri.adb    /^   procedure Set_Priority$/
+Set_Priority/p ada-src/2ataspri.ads    /^   procedure Set_Priority (T : 
TCB_Ptr; Prio : Sys/
+SimpleCalc     objcpp-src/SimpleCalc.H /address@hidden SimpleCalc:Object$/
+SkipBlanks     pas-src/common.pas      /^function SkipBlanks; (*($/
+SkipChars      pas-src/common.pas      /^function SkipChars; (*($/
+SkipSpaces     pas-src/common.pas      /^procedure SkipSpaces; (* (Str : 
NameString; var I /
+Sort_Id_Exit   cp-src/abstract.H       490
+Sort_Id_Exit::SetCollapsed     cp-src/abstract.C       /^void 
Sort_Id_Exit::SetCollapsed(char t)$/
+Sort_Id_Exit::SetDimensions    cp-src/abstract.C       /^void 
Sort_Id_Exit::SetDimensions(void)$/
+Sort_Id_Exit::SetFather        cp-src/abstract.C       /^void 
Sort_Id_Exit::SetFather(Tree_Node *f)$/
+Sort_Id_Exit::SetPosition      cp-src/abstract.C       /^void 
Sort_Id_Exit::SetPosition(Coord xx, Coord yy)/
+Sort_Id_Exit::Sort_Id_Exit     cp-src/abstract.C       
/^Sort_Id_Exit::Sort_Id_Exit(ID_Place *s)$/
+Sort_Id_Exit::sort_id  cp-src/abstract.H       492
+Specification  cp-src/abstract.H       308
+Specification::GetMaxX cp-src/abstract.C       /^Coord 
Specification::GetMaxX()$/
+Specification::GetMaxY cp-src/abstract.C       /^Coord 
Specification::GetMaxY()$/
+Specification::MaxX    cp-src/abstract.H       321
+Specification::MaxY    cp-src/abstract.H       321
+Specification::SetDimensions   cp-src/abstract.C       /^void 
Specification::SetDimensions(void)$/
+Specification::SetFather       cp-src/abstract.C       /^void 
Specification::SetFather(Tree_Node *f)$/
+Specification::SetPath cp-src/abstract.C       /^void 
Specification::SetPath(int& np, int& nd)$/
+Specification::SetPosition     cp-src/abstract.C       /^void 
Specification::SetPosition(Coord xx, Coord yy/
+Specification::Specification   cp-src/abstract.C       
/^Specification::Specification(Comment_List *c_l, ID/
+Specification::com_list        cp-src/abstract.H       312
+Specification::com_list1       cp-src/abstract.H       316
+Specification::def     cp-src/abstract.H       319
+Specification::dt_list cp-src/abstract.H       318
+Specification::func    cp-src/abstract.H       317
+Specification::gate_list       cp-src/abstract.H       314
+Specification::id_decl_list    cp-src/abstract.H       315
+Specification::ident   cp-src/abstract.H       313
+Specification::yl1     cp-src/abstract.H       320
+Specification::yl2     cp-src/abstract.H       320
+Specification::yl3     cp-src/abstract.H       320
+StartDay       cp-src/functions.cpp    /^Date StartDay(Date a,int 
days){\/\/Function to calcu/
+Stop   cp-src/abstract.H       793
+Stop::SetCollapsed     cp-src/abstract.C       /^void Stop::SetCollapsed(char 
t)$/
+Stop::SetDimensions    cp-src/abstract.C       /^void 
Stop::SetDimensions(void)$/
+Stop::SetFather        cp-src/abstract.C       /^void 
Stop::SetFather(Tree_Node *f)$/
+Stop::SetPosition      cp-src/abstract.C       /^void Stop::SetPosition(Coord 
xx, Coord yy)$/
+Stop::SetTextual       cp-src/abstract.C       /^void Stop::SetTextual(char t, 
char s)$/
+Stop::Stop     cp-src/abstract.C       /^Stop::Stop()$/
+Stop::border   cp-src/abstract.H       796
+Stop::havebox  cp-src/abstract.H       795
+StripPath      pas-src/common.pas      /^function StripPath; (*($/
+SubString      pas-src/common.pas      /^function SubString; (*($/
+Subprocess     objc-src/Subprocess.h   41
+Subprocess     objc-src/Subprocess.h   /address@hidden Subprocess:Object$/
+Subprocess(Private)    objc-src/Subprocess.m   /address@hidden 
Subprocess(Private)$/
+Sum_Gate       cp-src/abstract.H       952
+Sum_Gate::SetCollapsed cp-src/abstract.C       /^void 
Sum_Gate::SetCollapsed(char t)$/
+Sum_Gate::SetDimensions        cp-src/abstract.C       /^void 
Sum_Gate::SetDimensions(void)$/
+Sum_Gate::SetFather    cp-src/abstract.C       /^void 
Sum_Gate::SetFather(Tree_Node *f)$/
+Sum_Gate::SetPosition  cp-src/abstract.C       /^void 
Sum_Gate::SetPosition(Coord xx, Coord yy)$/
+Sum_Gate::SetTerminalPos       cp-src/abstract.C       /^void 
Sum_Gate::SetTerminalPos()$/
+Sum_Gate::SetTextual   cp-src/abstract.C       /^void 
Sum_Gate::SetTextual(char t, char s)$/
+Sum_Gate::Sum_Gate     cp-src/abstract.C       
/^Sum_Gate::Sum_Gate(Gate_Decl_List *g_d_l, Tree_Nod/
+Sum_Gate::Xch  cp-src/abstract.H       956
+Sum_Gate::Xclose       cp-src/abstract.H       956
+Sum_Gate::Ych  cp-src/abstract.H       956
+Sum_Gate::Yclose       cp-src/abstract.H       956
+Sum_Gate::bex  cp-src/abstract.H       955
+Sum_Gate::border       cp-src/abstract.H       957
+Sum_Gate::gate_decl_list       cp-src/abstract.H       954
+Sum_Gate::xl   cp-src/abstract.H       956
+Sum_Gate::yl   cp-src/abstract.H       956
+Sum_Ident      cp-src/abstract.H       972
+Sum_Ident::SetCollapsed        cp-src/abstract.C       /^void 
Sum_Ident::SetCollapsed(char t)$/
+Sum_Ident::SetDimensions       cp-src/abstract.C       /^void 
Sum_Ident::SetDimensions(void)$/
+Sum_Ident::SetFather   cp-src/abstract.C       /^void 
Sum_Ident::SetFather(Tree_Node *f)$/
+Sum_Ident::SetPosition cp-src/abstract.C       /^void 
Sum_Ident::SetPosition(Coord xx, Coord yy)$/
+Sum_Ident::SetTerminalPos      cp-src/abstract.C       /^void 
Sum_Ident::SetTerminalPos()$/
+Sum_Ident::SetTextual  cp-src/abstract.C       /^void 
Sum_Ident::SetTextual(char t, char s)$/
+Sum_Ident::Sum_Ident   cp-src/abstract.C       
/^Sum_Ident::Sum_Ident(Id_Decl_List *i_d_l, Tree_Nod/
+Sum_Ident::Xch cp-src/abstract.H       976
+Sum_Ident::Xclose      cp-src/abstract.H       976
+Sum_Ident::Ych cp-src/abstract.H       976
+Sum_Ident::Yclose      cp-src/abstract.H       976
+Sum_Ident::bex cp-src/abstract.H       975
+Sum_Ident::border      cp-src/abstract.H       977
+Sum_Ident::ident_decl_list     cp-src/abstract.H       974
+Sum_Ident::xl  cp-src/abstract.H       976
+Sum_Ident::yl  cp-src/abstract.H       976
+Syncr  cp-src/abstract.H       685
+Syncr::SetDimensions   cp-src/abstract.C       /^void 
Syncr::SetDimensions(void)$/
+Syncr::SetFather       cp-src/abstract.C       /^void 
Syncr::SetFather(Tree_Node *f)$/
+Syncr::SetPosition     cp-src/abstract.C       /^void Syncr::SetPosition(Coord 
xx, Coord yy)$/
+Syncr::Syncr   cp-src/abstract.C       /^Syncr::Syncr()$/
+System.Task_Primitives/b       ada-src/2ataspri.adb    /^package body 
System.Task_Primitives is$/
+System.Task_Primitives/s       ada-src/2ataspri.ads    /^package 
System.Task_Primitives is$/
+SystemColor    java-src/SysCol.java    37
+SystemColor.ACTIVE_CAPTION     java-src/SysCol.java    47
+SystemColor.ACTIVE_CAPTION_BORDER      java-src/SysCol.java    57
+SystemColor.ACTIVE_CAPTION_TEXT        java-src/SysCol.java    52
+SystemColor.CONTROL    java-src/SysCol.java    127
+SystemColor.CONTROL_DK_SHADOW  java-src/SysCol.java    152
+SystemColor.CONTROL_HIGHLIGHT  java-src/SysCol.java    137
+SystemColor.CONTROL_LT_HIGHLIGHT       java-src/SysCol.java    142
+SystemColor.CONTROL_SHADOW     java-src/SysCol.java    147
+SystemColor.CONTROL_TEXT       java-src/SysCol.java    132
+SystemColor.DESKTOP    java-src/SysCol.java    42
+SystemColor.INACTIVE_CAPTION   java-src/SysCol.java    62
+SystemColor.INACTIVE_CAPTION_BORDER    java-src/SysCol.java    72
+SystemColor.INACTIVE_CAPTION_TEXT      java-src/SysCol.java    67
+SystemColor.INFO       java-src/SysCol.java    162
+SystemColor.INFO_TEXT  java-src/SysCol.java    167
+SystemColor.MENU       java-src/SysCol.java    92
+SystemColor.MENU_TEXT  java-src/SysCol.java    97
+SystemColor.NUM_COLORS java-src/SysCol.java    172
+SystemColor.SCROLLBAR  java-src/SysCol.java    157
+SystemColor.SystemColor        java-src/SysCol.java    /^    private 
SystemColor(byte index) {$/
+SystemColor.TEXT       java-src/SysCol.java    102
+SystemColor.TEXT_HIGHLIGHT     java-src/SysCol.java    112
+SystemColor.TEXT_HIGHLIGHT_TEXT        java-src/SysCol.java    117
+SystemColor.TEXT_INACTIVE_TEXT java-src/SysCol.java    122
+SystemColor.TEXT_TEXT  java-src/SysCol.java    107
+SystemColor.WINDOW     java-src/SysCol.java    77
+SystemColor.WINDOW_BORDER      java-src/SysCol.java    82
+SystemColor.WINDOW_TEXT        java-src/SysCol.java    87
+SystemColor.activeCaption      java-src/SysCol.java    182
+SystemColor.activeCaptionBorder        java-src/SysCol.java    192
+SystemColor.activeCaptionText  java-src/SysCol.java    187
+SystemColor.control    java-src/SysCol.java    262
+SystemColor.controlDkShadow    java-src/SysCol.java    287
+SystemColor.controlHighlight   java-src/SysCol.java    272
+SystemColor.controlLtHighlight java-src/SysCol.java    277
+SystemColor.controlShadow      java-src/SysCol.java    282
+SystemColor.controlText        java-src/SysCol.java    267
+SystemColor.desktop    java-src/SysCol.java    177
+SystemColor.getRGB     java-src/SysCol.java    /^    public int getRGB() {$/
+SystemColor.inactiveCaption    java-src/SysCol.java    197
+SystemColor.inactiveCaptionBorder      java-src/SysCol.java    207
+SystemColor.inactiveCaptionText        java-src/SysCol.java    202
+SystemColor.info       java-src/SysCol.java    297
+SystemColor.infoText   java-src/SysCol.java    302
+SystemColor.menu       java-src/SysCol.java    227
+SystemColor.menuText   java-src/SysCol.java    232
+SystemColor.scrollbar  java-src/SysCol.java    292
+SystemColor.serialVersionUID   java-src/SysCol.java    340
+SystemColor.systemColors       java-src/SysCol.java    308
+SystemColor.text       java-src/SysCol.java    237
+SystemColor.textHighlight      java-src/SysCol.java    247
+SystemColor.textHighlightText  java-src/SysCol.java    252
+SystemColor.textInactiveText   java-src/SysCol.java    257
+SystemColor.textText   java-src/SysCol.java    242
+SystemColor.toString   java-src/SysCol.java    /^    public String toString() 
{$/
+SystemColor.updateSystemColors java-src/SysCol.java    /^    private static 
void updateSystemColors() {$/
+SystemColor.window     java-src/SysCol.java    212
+SystemColor.windowBorder       java-src/SysCol.java    217
+SystemColor.windowText java-src/SysCol.java    222
+T3     c.c     163
+TAG_PTR        c-src/emacs/src/lisp.h  /^#define TAG_PTR(tag, ptr) \\$/
+TAG_SYMOFFSET  c-src/emacs/src/lisp.h  /^#define TAG_SYMOFFSET(offset)         
                    \\$/
+TAS_Cell/t     ada-src/2ataspri.ads    /^   type TAS_Cell is private;$/
+TAS_Cell/t     ada-src/2ataspri.ads    /^   type TAS_Cell is$/
+TCB_Ptr/t      ada-src/2ataspri.ads    /^   type TCB_Ptr is access all 
Task_Control_Block;$/
+TERMINALP      c-src/emacs/src/lisp.h  /^TERMINALP (Lisp_Object a)$/
+TEST   php-src/ptest.php       1
+TEXSRC Makefile        /^TEXSRC=$(addprefix .\/tex-src\/,testenv.tex gzip.tex/
+TEXTAGS        make-src/Makefile       204
+TEXTAGS        make-src/Makefile       219
+TEX_LESC       c-src/etags.c   4986
+TEX_SESC       c-src/etags.c   4987
+TEX_clgrp      c-src/etags.c   4922
+TEX_decode_env c-src/etags.c   /^TEX_decode_env (const char *evarname, const 
char */
+TEX_defenv     c-src/etags.c   4912
+TEX_esc        c-src/etags.c   4920
+TEX_mode       c-src/etags.c   /^TEX_mode (FILE *inf)$/
+TEX_opgrp      c-src/etags.c   4921
+TEX_toktab     c-src/etags.c   4908
+TOTAL_KEYWORDS c-src/etags.c   2325
+TSL/s  ada-src/2ataspri.adb    /^   package TSL renames 
System.Tasking_Soft_Links;$/
+TYPESTOSTAT    objc-src/PackInsp.h     37
+TYPE_RANGED_INTEGERP   c-src/emacs/src/lisp.h  /^#define 
TYPE_RANGED_INTEGERP(type, x) \\$/
+Tapes  tex-src/gzip.texi       /address@hidden Tapes, Problems, Environment, 
Top$/
+Task_Control_Block/t   ada-src/2ataspri.ads    /^   type Task_Control_Block is 
record$/
+Task_Storage_Size/t    ada-src/2ataspri.ads    /^   type Task_Storage_Size is 
new Interfaces.C.size/
+Task_Type/b    ada-src/etags-test-for.ada      /^  task body Task_Type is$/
+Task_Type/b    ada-src/waroquiers.ada  /^  task body Task_Type is$/
+Task_Type/k    ada-src/etags-test-for.ada      /^  task type Task_Type is$/
+Task_Type/k    ada-src/waroquiers.ada  /^  task type Task_Type is$/
+TeX_commands   c-src/etags.c   /^TeX_commands (FILE *inf)$/
+TeX_help       c-src/etags.c   674
+TeX_suffixes   c-src/etags.c   672
+Term   cp-src/abstract.H       456
+Term::SetCollapsed     cp-src/abstract.C       /^void Term::SetCollapsed(char 
t)$/
+Term::SetDimensions    cp-src/abstract.C       /^void 
Term::SetDimensions(void)$/
+Term::SetFather        cp-src/abstract.C       /^void 
Term::SetFather(Tree_Node *f)$/
+Term::SetPosition      cp-src/abstract.C       /^void Term::SetPosition(Coord 
xx, Coord yy)$/
+Term::Term     cp-src/abstract.C       /^Term::Term(ID_Place *op, 
Value_Expr_List *el, ID_P/
+Term::expr_list        cp-src/abstract.H       459
+Term::op_ident cp-src/abstract.H       458
+Term::sort_id  cp-src/abstract.H       460
+Test_Abort/p   ada-src/2ataspri.adb    /^   procedure Test_Abort is$/
+Test_Abort/p   ada-src/2ataspri.ads    /^   procedure Test_Abort;$/
+Test_And_Set/p ada-src/2ataspri.adb    /^   procedure Test_And_Set (Cell : in 
out TAS_Cell;/
+Test_And_Set/p ada-src/2ataspri.ads    /^   procedure Test_And_Set (Cell : in 
out TAS_Cell;/
+Texinfo_help   c-src/etags.c   688
+Texinfo_nodes  c-src/etags.c   /^Texinfo_nodes (FILE *inf)$/
+Texinfo_suffixes       c-src/etags.c   686
+ThreadGroup    java-src/TG.java        54
+ThreadGroup.ThreadGroup        java-src/TG.java        /^    private 
ThreadGroup() {   \/\/ called from C code$/
+ThreadGroup.ThreadGroup        java-src/TG.java        /^    public 
ThreadGroup(String name) {$/
+ThreadGroup.ThreadGroup        java-src/TG.java        /^    public 
ThreadGroup(ThreadGroup parent, String /
+ThreadGroup.activeCount        java-src/TG.java        /^    public int 
activeCount() {$/
+ThreadGroup.activeGroupCount   java-src/TG.java        /^    public int 
activeGroupCount() {$/
+ThreadGroup.add        java-src/TG.java        /^    private final void 
add(ThreadGroup g){$/
+ThreadGroup.add        java-src/TG.java        /^    void add(Thread t) {$/
+ThreadGroup.allowThreadSuspension      java-src/TG.java        /^    public 
boolean allowThreadSuspension(boolean b/
+ThreadGroup.checkAccess        java-src/TG.java        /^    public final void 
checkAccess() {$/
+ThreadGroup.daemon     java-src/TG.java        59
+ThreadGroup.destroy    java-src/TG.java        /^    public final void 
destroy() {$/
+ThreadGroup.destroyed  java-src/TG.java        58
+ThreadGroup.enumerate  java-src/TG.java        /^    public int 
enumerate(Thread list[]) {$/
+ThreadGroup.enumerate  java-src/TG.java        /^    public int 
enumerate(Thread list[], boolean re/
+ThreadGroup.enumerate  java-src/TG.java        /^    private int 
enumerate(Thread list[], int n, bo/
+ThreadGroup.enumerate  java-src/TG.java        /^    public int 
enumerate(ThreadGroup list[]) {$/
+ThreadGroup.enumerate  java-src/TG.java        /^    public int 
enumerate(ThreadGroup list[], boole/
+ThreadGroup.enumerate  java-src/TG.java        /^    private int 
enumerate(ThreadGroup list[], int /
+ThreadGroup.getMaxPriority     java-src/TG.java        /^    public final int 
getMaxPriority() {$/
+ThreadGroup.getName    java-src/TG.java        /^    public final String 
getName() {$/
+ThreadGroup.getParent  java-src/TG.java        /^    public final ThreadGroup 
getParent() {$/
+ThreadGroup.groups     java-src/TG.java        66
+ThreadGroup.isDaemon   java-src/TG.java        /^    public final boolean 
isDaemon() {$/
+ThreadGroup.isDestroyed        java-src/TG.java        /^    public 
synchronized boolean isDestroyed() {$/
+ThreadGroup.list       java-src/TG.java        /^    public void list() {$/
+ThreadGroup.list       java-src/TG.java        /^    void list(PrintStream 
out, int indent) {$/
+ThreadGroup.maxPriority        java-src/TG.java        57
+ThreadGroup.name       java-src/TG.java        56
+ThreadGroup.ngroups    java-src/TG.java        65
+ThreadGroup.nthreads   java-src/TG.java        62
+ThreadGroup.parent     java-src/TG.java        55
+ThreadGroup.parentOf   java-src/TG.java        /^    public final boolean 
parentOf(ThreadGroup g) {/
+ThreadGroup.remove     java-src/TG.java        /^    private void 
remove(ThreadGroup g) {$/
+ThreadGroup.remove     java-src/TG.java        /^    void remove(Thread t) {$/
+ThreadGroup.resume     java-src/TG.java        /^    public final void 
resume() {$/
+ThreadGroup.setDaemon  java-src/TG.java        /^    public final void 
setDaemon(boolean daemon) {$/
+ThreadGroup.setMaxPriority     java-src/TG.java        /^    public final void 
setMaxPriority(int pri) {$/
+ThreadGroup.stop       java-src/TG.java        /^    public final void stop() 
{$/
+ThreadGroup.suspend    java-src/TG.java        /^    public final void 
suspend() {$/
+ThreadGroup.threads    java-src/TG.java        63
+ThreadGroup.toString   java-src/TG.java        /^    public String toString() 
{$/
+ThreadGroup.uncaughtException  java-src/TG.java        /^    public void 
uncaughtException(Thread t, Throwa/
+ThreadGroup.vmAllowSuspension  java-src/TG.java        60
+Time_to_position       c-src/emacs/src/keyboard.c      /^Time_to_position 
(Time encoded_pos)$/
+To_Lower       pas-src/common.pas      /^function To_Lower;(*(ch:char) : 
char;*)$/
+To_Start_Addr/f        ada-src/2ataspri.adb    /^      function To_Start_Addr 
is new$/
+To_TCB_Ptr/f   ada-src/2ataspri.adb    /^   function To_TCB_Ptr is new$/
+To_Upper       pas-src/common.pas      /^function To_Upper;(*(ch:char) : 
char;*)$/
+To_void_ptr/f  ada-src/2ataspri.adb    /^   function To_void_ptr is new$/
+Top    tex-src/gzip.texi       /address@hidden Top, , , (dir)$/
+Truc.Bidule/b  ada-src/etags-test-for.ada      /^package body Truc.Bidule is$/
+Truc.Bidule/b  ada-src/waroquiers.ada  /^package body Truc.Bidule is$/
+Truc.Bidule/s  ada-src/etags-test-for.ada      /^package Truc.Bidule is$/
+Truc.Bidule/s  ada-src/waroquiers.ada  /^package Truc.Bidule is$/
+Truc/s ada-src/etags-test-for.ada      /^package Truc is$/
+Truc/s ada-src/waroquiers.ada  /^package Truc is$/
+Type_Specific_Data/t   ada-src/etags-test-for.ada      /^   type 
Type_Specific_Data is record$/
+UCHAR  c-src/emacs/src/lisp.h  2424
+UNARY  y-src/cccp.c    18
+UNDEFINED      c-src/h.h       118
+UNEVALLED      c-src/emacs/src/lisp.h  2834
+UNGCPRO        c-src/emacs/src/lisp.h  3202
+UNGCPRO        c-src/emacs/src/lisp.h  3257
+UNGCPRO        c-src/emacs/src/lisp.h  3353
+UNLOCK c-src/emacs/src/gmalloc.c       /^#define UNLOCK()                      
        \\$/
+UNLOCK c-src/emacs/src/gmalloc.c       /^#define UNLOCK()$/
+UNLOCK_ALIGNED_BLOCKS  c-src/emacs/src/gmalloc.c       /^#define 
UNLOCK_ALIGNED_BLOCKS()                               \\$/
+UNLOCK_ALIGNED_BLOCKS  c-src/emacs/src/gmalloc.c       /^#define 
UNLOCK_ALIGNED_BLOCKS()$/
+UNPERM cp-src/cfront.H /^#define UNPERM(p) p->permanent=0$/
+UNSIGNED_CMP   c-src/emacs/src/lisp.h  /^#define UNSIGNED_CMP(a, op, b)        
                                        \\$/
+USE_LSB_TAG    c-src/emacs/src/lisp.h  271
+USE_LSB_TAG    c-src/emacs/src/lisp.h  /^DEFINE_GDB_SYMBOL_BEGIN (bool, 
USE_LSB_TAG)$/
+USE_PTHREAD    c-src/emacs/src/gmalloc.c       25
+USE_SAFE_ALLOCA        c-src/emacs/src/lisp.h  4560
+USE_STACK_CONS c-src/emacs/src/lisp.h  4689
+USE_STACK_LISP_OBJECTS c-src/emacs/src/lisp.h  4652
+USE_STACK_LISP_OBJECTS c-src/emacs/src/lisp.h  4658
+USE_STACK_LISP_OBJECTS c-src/emacs/src/lisp.h  4659
+USE_STACK_STRING       c-src/emacs/src/lisp.h  4691
+U_CHAR cccp.y  38
+U_CHAR y-src/cccp.y    38
+Unlock/p       ada-src/2ataspri.adb    /^   procedure Unlock (L : in out Lock) 
is$/
+Unlock/p       ada-src/2ataspri.ads    /^   procedure Unlock (L : in out 
Lock);$/
+User   pyt-src/server.py       /^class User:$/
+UserEdit       pyt-src/server.py       /^class UserEdit(Frame):$/
+VALBITS        c-src/emacs/src/lisp.h  246
+VALMASK        c-src/emacs/src/lisp.h  829
+VALMASK        c-src/emacs/src/lisp.h  /^DEFINE_GDB_SYMBOL_BEGIN (EMACS_INT, 
VALMASK)$/
+VAL_MAX        c-src/emacs/src/lisp.h  263
+VECSIZE        c-src/emacs/src/lisp.h  /^#define VECSIZE(type)                 
                        \\$/
+VECTORLIKEP    c-src/emacs/src/lisp.h  /^# define VECTORLIKEP(x) 
lisp_h_VECTORLIKEP (x)$/
+VECTORP        c-src/emacs/src/lisp.h  /^VECTORP (Lisp_Object x)$/
+VERSION        c-src/etags.c   789
+VERSION        erl-src/gs_dialog.erl   /^-define(VERSION, '2001.1101').$/
+VERSION        objc-src/PackInsp.m     34
+Vabbrev_start_location c-src/abbrev.c  62
+Vabbrev_start_location_buffer  c-src/abbrev.c  65
+Vabbrev_table_name_list        c-src/abbrev.c  42
+ValToNmStr     pas-src/common.pas      /^function ValToNmStr; (*($/
+Value  cp-src/abstract.H       440
+Value::SetCollapsed    cp-src/abstract.C       /^void Value::SetCollapsed(char 
t)$/
+Value::SetDimensions   cp-src/abstract.C       /^void 
Value::SetDimensions(void)$/
+Value::SetFather       cp-src/abstract.C       /^void 
Value::SetFather(Tree_Node *f)$/
+Value::SetPosition     cp-src/abstract.C       /^void Value::SetPosition(Coord 
xx, Coord yy)$/
+Value::Value   cp-src/abstract.C       /^Value::Value(ID_Place *i, ID_Place 
*s)$/
+Value::ident   cp-src/abstract.H       442
+Value::sort_id cp-src/abstract.H       443
+Value_Expr     cp-src/abstract.H       135
+Value_Expr::SetDimensions      cp-src/abstract.C       /^void 
Value_Expr::SetDimensions(void)$/
+Value_Expr::SetFather  cp-src/abstract.C       /^void 
Value_Expr::SetFather(Tree_Node *f)$/
+Value_Expr::SetPosition        cp-src/abstract.C       /^void 
Value_Expr::SetPosition(Coord xx, Coord yy)$/
+Value_Expr::Value_Expr cp-src/abstract.C       /^Value_Expr::Value_Expr() $/
+Value_Expr_List        cp-src/abstract.H       149
+Value_Expr_List::SetCollapsed  cp-src/abstract.C       /^void 
Value_Expr_List::SetCollapsed(char t)$/
+Value_Expr_List::SetDimensions cp-src/abstract.C       /^void 
Value_Expr_List::SetDimensions(void)$/
+Value_Expr_List::SetFather     cp-src/abstract.C       /^void 
Value_Expr_List::SetFather(Tree_Node *f)$/
+Value_Expr_List::SetPosition   cp-src/abstract.C       /^void 
Value_Expr_List::SetPosition(Coord xx, Coord /
+Value_Expr_List::Value_Expr_List       cp-src/abstract.C       
/^Value_Expr_List::Value_Expr_List(Tree_Node *el, Va/
+Value_Expr_List::elem  cp-src/abstract.H       151
+Value_Expr_List::next  cp-src/abstract.H       152
+Vfundamental_mode_abbrev_table c-src/abbrev.c  51
+Vglobal_abbrev_table   c-src/abbrev.c  47
+Vlast_abbrev   c-src/abbrev.c  69
+Vlast_abbrev_text      c-src/abbrev.c  74
+Vlispy_mouse_stem      c-src/emacs/src/keyboard.c      5172
+Vpre_abbrev_expand_hook        c-src/abbrev.c  82
+WAIT_READING_MAX       c-src/emacs/src/lisp.h  4281
+WAIT_READING_MAX       c-src/emacs/src/lisp.h  4283
+WCHAR_TYPE_SIZE        cccp.y  99
+WCHAR_TYPE_SIZE        y-src/cccp.y    99
+WINDOWP        c-src/emacs/src/lisp.h  /^WINDOWP (Lisp_Object a)$/
+WINDOWSNT      c-src/etags.c   101
+WINDOWSNT      c-src/etags.c   102
+WINDOW_CONFIGURATIONP  c-src/emacs/src/lisp.h  /^WINDOW_CONFIGURATIONP 
(Lisp_Object a)$/
+WORKING        objc-src/PackInsp.m     368
+WorkingDays    cp-src/functions.cpp    /^int WorkingDays(Date a, Date b){$/
+Write_Lock/p   ada-src/2ataspri.adb    /^   procedure Write_Lock (L : in out 
Lock; Ceiling_/
+Write_Lock/p   ada-src/2ataspri.ads    /^   procedure Write_Lock (L : in out 
Lock; Ceiling_/
+X      c-src/h.h       100
+XBOOL_VECTOR   c-src/emacs/src/lisp.h  /^XBOOL_VECTOR (Lisp_Object a)$/
+XBUFFER        c-src/emacs/src/lisp.h  /^XBUFFER (Lisp_Object a)$/
+XBUFFER_OBJFWD c-src/emacs/src/lisp.h  /^XBUFFER_OBJFWD (union Lisp_Fwd *a)$/
+XCAR   c-src/emacs/src/lisp.h  /^# define XCAR(c) lisp_h_XCAR (c)$/
+XCDR   c-src/emacs/src/lisp.h  /^# define XCDR(c) lisp_h_XCDR (c)$/
+XCHAR_TABLE    c-src/emacs/src/lisp.h  /^XCHAR_TABLE (Lisp_Object a)$/
+XCHG_0 c-src/sysdep.h  47
+XCHG_1 c-src/sysdep.h  48
+XCHG_2 c-src/sysdep.h  49
+XCHG_3 c-src/sysdep.h  50
+XCHG_4 c-src/sysdep.h  51
+XCHG_5 c-src/sysdep.h  52
+XCONS  c-src/emacs/src/lisp.h  /^# define XCONS(a) lisp_h_XCONS (a)$/
+XDEFUN c.c     /^XDEFUN ("x-get-selection-internal", Fx_get_selecti/
+XFASTINT       c-src/emacs/src/lisp.h  /^#  define XFASTINT(a) lisp_h_XFASTINT 
(a)$/
+XFASTINT       c-src/emacs/src/lisp.h  /^XFASTINT (Lisp_Object a)$/
+XFINALIZER     c-src/emacs/src/lisp.h  /^XFINALIZER (Lisp_Object a)$/
+XFLOAT c-src/emacs/src/lisp.h  /^XFLOAT (Lisp_Object a)$/
+XFLOATINT      c-src/emacs/src/lisp.h  /^XFLOATINT (Lisp_Object n)$/
+XFLOAT_DATA    c-src/emacs/src/lisp.h  /^XFLOAT_DATA (Lisp_Object f)$/
+XFWDTYPE       c-src/emacs/src/lisp.h  /^XFWDTYPE (union Lisp_Fwd *a)$/
+XHASH  c-src/emacs/src/lisp.h  /^# define XHASH(a) lisp_h_XHASH (a)$/
+XHASH_TABLE    c-src/emacs/src/lisp.h  /^XHASH_TABLE (Lisp_Object a)$/
+XIL    c-src/emacs/src/lisp.h  /^# define XIL(i) lisp_h_XIL (i)$/
+XINT   c-src/emacs/src/lisp.h  /^#  define XINT(a) lisp_h_XINT (a)$/
+XINT   c-src/emacs/src/lisp.h  /^XINT (Lisp_Object a)$/
+XINTPTR        c-src/emacs/src/lisp.h  /^XINTPTR (Lisp_Object a)$/
+XLI    c-src/emacs/src/lisp.h  /^# define XLI(o) lisp_h_XLI (o)$/
+XLI_BUILTIN_LISPSYM    c-src/emacs/src/lisp.h  /^#define 
XLI_BUILTIN_LISPSYM(iname) TAG_SYMOFFSET (/
+XMARKER        c-src/emacs/src/lisp.h  /^XMARKER (Lisp_Object a)$/
+XMISC  c-src/emacs/src/lisp.h  /^XMISC (Lisp_Object a)$/
+XMISCANY       c-src/emacs/src/lisp.h  /^XMISCANY (Lisp_Object a)$/
+XMISCTYPE      c-src/emacs/src/lisp.h  /^XMISCTYPE (Lisp_Object a)$/
+XOVERLAY       c-src/emacs/src/lisp.h  /^XOVERLAY (Lisp_Object a)$/
+XPNTR  c-src/emacs/src/lisp.h  /^# define XPNTR(a) lisp_h_XPNTR (a)$/
+XPROCESS       c-src/emacs/src/lisp.h  /^XPROCESS (Lisp_Object a)$/
+XSAVE_FUNCPOINTER      c-src/emacs/src/lisp.h  /^XSAVE_FUNCPOINTER 
(Lisp_Object obj, int n)$/
+XSAVE_INTEGER  c-src/emacs/src/lisp.h  /^XSAVE_INTEGER (Lisp_Object obj, int 
n)$/
+XSAVE_OBJECT   c-src/emacs/src/lisp.h  /^XSAVE_OBJECT (Lisp_Object obj, int 
n)$/
+XSAVE_POINTER  c-src/emacs/src/lisp.h  /^XSAVE_POINTER (Lisp_Object obj, int 
n)$/
+XSAVE_VALUE    c-src/emacs/src/lisp.h  /^XSAVE_VALUE (Lisp_Object a)$/
+XSETBOOL_VECTOR        c-src/emacs/src/lisp.h  /^#define XSETBOOL_VECTOR(a, b) 
(XSETPSEUDOVECTOR (a/
+XSETBUFFER     c-src/emacs/src/lisp.h  /^#define XSETBUFFER(a, b) 
(XSETPSEUDOVECTOR (a, b, /
+XSETCDR        c-src/emacs/src/lisp.h  /^XSETCDR (Lisp_Object c, Lisp_Object 
n)$/
+XSETCHAR_TABLE c-src/emacs/src/lisp.h  /^#define XSETCHAR_TABLE(a, b) 
(XSETPSEUDOVECTOR (a,/
+XSETCOMPILED   c-src/emacs/src/lisp.h  /^#define XSETCOMPILED(a, b) 
(XSETPSEUDOVECTOR (a, b/
+XSETCONS       c-src/emacs/src/lisp.h  /^#define XSETCONS(a, b) ((a) = 
make_lisp_ptr (b, Li/
+XSETFASTINT    c-src/emacs/src/lisp.h  /^#define XSETFASTINT(a, b) ((a) = 
make_natnum (b))$/
+XSETFLOAT      c-src/emacs/src/lisp.h  /^#define XSETFLOAT(a, b) ((a) = 
make_lisp_ptr (b, L/
+XSETINT        c-src/emacs/src/lisp.h  /^#define XSETINT(a, b) ((a) = 
make_number (b))$/
+XSETMISC       c-src/emacs/src/lisp.h  /^#define XSETMISC(a, b) ((a) = 
make_lisp_ptr (b, Li/
+XSETPROCESS    c-src/emacs/src/lisp.h  /^#define XSETPROCESS(a, b) 
(XSETPSEUDOVECTOR (a, b,/
+XSETPSEUDOVECTOR       c-src/emacs/src/lisp.h  /^#define XSETPSEUDOVECTOR(a, 
b, code) \\$/
+XSETPVECTYPE   c-src/emacs/src/lisp.h  /^#define XSETPVECTYPE(v, code)         
                                \\$/
+XSETPVECTYPESIZE       c-src/emacs/src/lisp.h  /^#define XSETPVECTYPESIZE(v, 
code, lispsize, restsi/
+XSETSTRING     c-src/emacs/src/lisp.h  /^#define XSETSTRING(a, b) ((a) = 
make_lisp_ptr (b, /
+XSETSUBR       c-src/emacs/src/lisp.h  /^#define XSETSUBR(a, b) 
(XSETPSEUDOVECTOR (a, b, PV/
+XSETSUB_CHAR_TABLE     c-src/emacs/src/lisp.h  /^#define XSETSUB_CHAR_TABLE(a, 
b) (XSETPSEUDOVECTOR/
+XSETSYMBOL     c-src/emacs/src/lisp.h  /^#define XSETSYMBOL(a, b) ((a) = 
make_lisp_symbol (/
+XSETTERMINAL   c-src/emacs/src/lisp.h  /^#define XSETTERMINAL(a, b) 
(XSETPSEUDOVECTOR (a, b/
+XSETTYPED_PSEUDOVECTOR c-src/emacs/src/lisp.h  /^#define 
XSETTYPED_PSEUDOVECTOR(a, b, size, code)              /
+XSETVECTOR     c-src/emacs/src/lisp.h  /^#define XSETVECTOR(a, b) ((a) = 
make_lisp_ptr (b, /
+XSETWINDOW     c-src/emacs/src/lisp.h  /^#define XSETWINDOW(a, b) 
(XSETPSEUDOVECTOR (a, b, /
+XSETWINDOW_CONFIGURATION       c-src/emacs/src/lisp.h  /^#define 
XSETWINDOW_CONFIGURATION(a, b) \\$/
+XSET_HASH_TABLE        c-src/emacs/src/lisp.h  /^#define XSET_HASH_TABLE(VAR, 
PTR) \\$/
+XSTRING        c-src/emacs/src/lisp.h  /^XSTRING (Lisp_Object a)$/
+XSUBR  c-src/emacs/src/lisp.h  /^XSUBR (Lisp_Object a)$/
+XSUB_CHAR_TABLE        c-src/emacs/src/lisp.h  /^XSUB_CHAR_TABLE (Lisp_Object 
a)$/
+XSYMBOL        c-src/emacs/src/lisp.h  /^#  define XSYMBOL(a) lisp_h_XSYMBOL 
(a)$/
+XSYMBOL        c-src/emacs/src/lisp.h  /^XSYMBOL (Lisp_Object a)$/
+XTERMINAL      c-src/emacs/src/lisp.h  /^XTERMINAL (Lisp_Object a)$/
+XTYPE  c-src/emacs/src/lisp.h  /^#  define XTYPE(a) lisp_h_XTYPE (a)$/
+XTYPE  c-src/emacs/src/lisp.h  /^XTYPE (Lisp_Object a)$/
+XUNTAG c-src/emacs/src/lisp.h  /^#  define XUNTAG(a, type) lisp_h_XUNTAG (a, 
type)$/
+XUNTAG c-src/emacs/src/lisp.h  /^XUNTAG (Lisp_Object a, int type)$/
+XWINDOW        c-src/emacs/src/lisp.h  /^XWINDOW (Lisp_Object a)$/
+Y      c-src/h.h       100
+YACC   c-src/etags.c   2199
+YSRC   Makefile        /^YSRC=$(addprefix .\/y-src\/,parse.y parse.c atest.y /
+YYABORT        /usr/share/bison/bison.simple   153
+YYABORT        /usr/share/bison/bison.simple   153
+YYACCEPT       /usr/share/bison/bison.simple   152
+YYACCEPT       /usr/share/bison/bison.simple   152
+YYBACKUP       /usr/share/bison/bison.simple   /^#define YYBACKUP(Token, 
Value)                                        \\$/
+YYBACKUP       /usr/share/bison/bison.simple   /^#define YYBACKUP(Token, 
Value)                                        \\$/
+YYBISON        y-src/parse.c   4
+YYBISON        y-src/cccp.c    4
+YYDEBUG        parse.y 88
+YYDEBUG        cccp.y  122
+YYDPRINTF      /usr/share/bison/bison.simple   /^# define YYDPRINTF(Args)      
                \\$/
+YYDPRINTF      /usr/share/bison/bison.simple   /^# define YYDPRINTF(Args)$/
+YYDPRINTF      /usr/share/bison/bison.simple   /^# define YYDPRINTF(Args)      
                \\$/
+YYDPRINTF      /usr/share/bison/bison.simple   /^# define YYDPRINTF(Args)$/
+YYEMPTY        /usr/share/bison/bison.simple   150
+YYEMPTY        /usr/share/bison/bison.simple   150
+YYEOF  /usr/share/bison/bison.simple   151
+YYEOF  /usr/share/bison/bison.simple   151
+YYERRCODE      /usr/share/bison/bison.simple   178
+YYERRCODE      /usr/share/bison/bison.simple   178
+YYERROR        /usr/share/bison/bison.simple   154
+YYERROR        /usr/share/bison/bison.simple   154
+YYFAIL /usr/share/bison/bison.simple   158
+YYFAIL /usr/share/bison/bison.simple   158
+YYFINAL        parse.y 93
+YYFINAL        cccp.y  127
+YYFLAG parse.y 94
+YYFLAG cccp.y  128
+YYFPRINTF      /usr/share/bison/bison.simple   225
+YYFPRINTF      /usr/share/bison/bison.simple   225
+YYINITDEPTH    /usr/share/bison/bison.simple   244
+YYINITDEPTH    /usr/share/bison/bison.simple   244
+YYLAST parse.y 266
+YYLAST cccp.y  274
+YYLEX  /usr/share/bison/bison.simple   200
+YYLEX  /usr/share/bison/bison.simple   202
+YYLEX  /usr/share/bison/bison.simple   206
+YYLEX  /usr/share/bison/bison.simple   208
+YYLEX  /usr/share/bison/bison.simple   212
+YYLEX  /usr/share/bison/bison.simple   200
+YYLEX  /usr/share/bison/bison.simple   202
+YYLEX  /usr/share/bison/bison.simple   206
+YYLEX  /usr/share/bison/bison.simple   208
+YYLEX  /usr/share/bison/bison.simple   212
+YYLLOC_DEFAULT /usr/share/bison/bison.simple   /^# define 
YYLLOC_DEFAULT(Current, Rhs, N)              \\$/
+YYLLOC_DEFAULT /usr/share/bison/bison.simple   /^# define 
YYLLOC_DEFAULT(Current, Rhs, N)              \\$/
+YYMAXDEPTH     /usr/share/bison/bison.simple   255
+YYMAXDEPTH     /usr/share/bison/bison.simple   259
+YYMAXDEPTH     /usr/share/bison/bison.simple   255
+YYMAXDEPTH     /usr/share/bison/bison.simple   259
+YYNTBASE       parse.y 95
+YYNTBASE       cccp.y  129
+YYPARSE_PARAM_ARG      /usr/share/bison/bison.simple   351
+YYPARSE_PARAM_ARG      /usr/share/bison/bison.simple   354
+YYPARSE_PARAM_ARG      /usr/share/bison/bison.simple   358
+YYPARSE_PARAM_ARG      /usr/share/bison/bison.simple   351
+YYPARSE_PARAM_ARG      /usr/share/bison/bison.simple   354
+YYPARSE_PARAM_ARG      /usr/share/bison/bison.simple   358
+YYPARSE_PARAM_DECL     /usr/share/bison/bison.simple   352
+YYPARSE_PARAM_DECL     /usr/share/bison/bison.simple   355
+YYPARSE_PARAM_DECL     /usr/share/bison/bison.simple   359
+YYPARSE_PARAM_DECL     /usr/share/bison/bison.simple   352
+YYPARSE_PARAM_DECL     /usr/share/bison/bison.simple   355
+YYPARSE_PARAM_DECL     /usr/share/bison/bison.simple   359
+YYPOPSTACK     /usr/share/bison/bison.simple   445
+YYPOPSTACK     /usr/share/bison/bison.simple   447
+YYPOPSTACK     /usr/share/bison/bison.simple   445
+YYPOPSTACK     /usr/share/bison/bison.simple   447
+YYRECOVERING   /usr/share/bison/bison.simple   /^#define YYRECOVERING()  
(!!yyerrstatus)$/
+YYRECOVERING   /usr/share/bison/bison.simple   /^#define YYRECOVERING()  
(!!yyerrstatus)$/
+YYSIZE_T       /usr/share/bison/bison.simple   51
+YYSIZE_T       /usr/share/bison/bison.simple   56
+YYSIZE_T       /usr/share/bison/bison.simple   71
+YYSIZE_T       /usr/share/bison/bison.simple   75
+YYSIZE_T       /usr/share/bison/bison.simple   128
+YYSIZE_T       /usr/share/bison/bison.simple   131
+YYSIZE_T       /usr/share/bison/bison.simple   136
+YYSIZE_T       /usr/share/bison/bison.simple   140
+YYSIZE_T       /usr/share/bison/bison.simple   145
+YYSIZE_T       /usr/share/bison/bison.simple   51
+YYSIZE_T       /usr/share/bison/bison.simple   56
+YYSIZE_T       /usr/share/bison/bison.simple   71
+YYSIZE_T       /usr/share/bison/bison.simple   75
+YYSIZE_T       /usr/share/bison/bison.simple   128
+YYSIZE_T       /usr/share/bison/bison.simple   131
+YYSIZE_T       /usr/share/bison/bison.simple   136
+YYSIZE_T       /usr/share/bison/bison.simple   140
+YYSIZE_T       /usr/share/bison/bison.simple   145
+YYSTACK_ALLOC  /usr/share/bison/bison.simple   50
+YYSTACK_ALLOC  /usr/share/bison/bison.simple   55
+YYSTACK_ALLOC  /usr/share/bison/bison.simple   59
+YYSTACK_ALLOC  /usr/share/bison/bison.simple   78
+YYSTACK_ALLOC  /usr/share/bison/bison.simple   50
+YYSTACK_ALLOC  /usr/share/bison/bison.simple   55
+YYSTACK_ALLOC  /usr/share/bison/bison.simple   59
+YYSTACK_ALLOC  /usr/share/bison/bison.simple   78
+YYSTACK_BYTES  /usr/share/bison/bison.simple   /^#  define YYSTACK_BYTES(N) 
\\$/
+YYSTACK_BYTES  /usr/share/bison/bison.simple   /^#  define YYSTACK_BYTES(N) 
\\$/
+YYSTACK_BYTES  /usr/share/bison/bison.simple   /^#  define YYSTACK_BYTES(N) 
\\$/
+YYSTACK_BYTES  /usr/share/bison/bison.simple   /^#  define YYSTACK_BYTES(N) 
\\$/
+YYSTACK_FREE   /usr/share/bison/bison.simple   /^#  define YYSTACK_FREE(Ptr) 
do { \/* empty *\/; } wh/
+YYSTACK_FREE   /usr/share/bison/bison.simple   79
+YYSTACK_FREE   /usr/share/bison/bison.simple   /^#  define YYSTACK_FREE(Ptr) 
do { \/* empty *\/; } wh/
+YYSTACK_FREE   /usr/share/bison/bison.simple   79
+YYSTACK_GAP_MAX        /usr/share/bison/bison.simple   93
+YYSTACK_GAP_MAX        /usr/share/bison/bison.simple   93
+YYSTACK_RELOCATE       /usr/share/bison/bison.simple   /^# define 
YYSTACK_RELOCATE(Type, Stack)                                        \\$/
+YYSTACK_RELOCATE       /usr/share/bison/bison.simple   548
+YYSTACK_RELOCATE       /usr/share/bison/bison.simple   /^# define 
YYSTACK_RELOCATE(Type, Stack)                                        \\$/
+YYSTACK_RELOCATE       /usr/share/bison/bison.simple   548
+YYSTD  /usr/share/bison/bison.simple   /^# define YYSTD(x) std::x$/
+YYSTD  /usr/share/bison/bison.simple   /^# define YYSTD(x) x$/
+YYSTD  /usr/share/bison/bison.simple   /^# define YYSTD(x) std::x$/
+YYSTD  /usr/share/bison/bison.simple   /^# define YYSTD(x) x$/
+YYSTYPE        y-src/parse.y   71
+YYSTYPE        y-src/parse.y   72
+YYSTYPE        parse.y 71
+YYSTYPE        parse.y 72
+YYSTYPE        parse.y 85
+YYSTYPE        cccp.y  119
+YYTERROR       /usr/share/bison/bison.simple   177
+YYTERROR       /usr/share/bison/bison.simple   177
+YYTRANSLATE    parse.y /^#define YYTRANSLATE(x) ((unsigned)(x) <= 278 ? yyt/
+YYTRANSLATE    cccp.y  /^#define YYTRANSLATE(x) ((unsigned)(x) <= 269 ? yyt/
+YY_DECL_NON_LSP_VARIABLES      /usr/share/bison/bison.simple   374
+YY_DECL_NON_LSP_VARIABLES      /usr/share/bison/bison.simple   374
+YY_DECL_VARIABLES      /usr/share/bison/bison.simple   385
+YY_DECL_VARIABLES      /usr/share/bison/bison.simple   391
+YY_DECL_VARIABLES      /usr/share/bison/bison.simple   385
+YY_DECL_VARIABLES      /usr/share/bison/bison.simple   391
+Yacc_entries   c-src/etags.c   /^Yacc_entries (FILE *inf)$/
+Yacc_help      c-src/etags.c   693
+Yacc_suffixes  c-src/etags.c   691
+Z      c-src/h.h       100
+\      tex-src/texinfo.tex     /^\\def\\ {{\\fontdimen2\\font=\\tclosesave{} 
}}%$/
+\      tex-src/texinfo.tex     /^\\gdef\\sepspaces{\\def {\\ }}}$/
+\'     tex-src/texinfo.tex     /^\\def\\'{{'}}$/
+\*     tex-src/texinfo.tex     
/^\\def\\*{\\hfil\\break\\hbox{}\\ignorespaces}$/
+\.     tex-src/texinfo.tex     /^\\def\\.{.\\spacefactor=3000 }$/
+\1     c-src/abbrev.c  /^  DEFVAR_LISP ("abbrev-table-name-list", &Vabbrev_/
+\1     c-src/abbrev.c  /^  DEFVAR_LISP ("global-abbrev-table", &Vglobal_abb/
+\1     c-src/abbrev.c  /^  DEFVAR_LISP ("fundamental-mode-abbrev-table", &V/
+\1     c-src/abbrev.c  /^  DEFVAR_LISP ("last-abbrev", &Vlast_abbrev,
+    "/
+\1     c-src/abbrev.c  /^  DEFVAR_LISP ("last-abbrev-text", &Vlast_abbrev_t/
+\1     c-src/abbrev.c  /^  DEFVAR_INT ("last-abbrev-location", &last_abbrev/
+\1     c-src/abbrev.c  /^  DEFVAR_LISP ("abbrev-start-location", &Vabbrev_s/
+\1     c-src/abbrev.c  /^  DEFVAR_LISP ("abbrev-start-location-buffer", &Va/
+\1     c-src/abbrev.c  /^  DEFVAR_PER_BUFFER ("local-abbrev-table", &curren/
+\1     c-src/abbrev.c  /^  DEFVAR_BOOL ("abbrevs-changed", &abbrevs_changed/
+\1     c-src/abbrev.c  /^  DEFVAR_BOOL ("abbrev-all-caps", &abbrev_all_caps/
+\1     c-src/abbrev.c  /^  DEFVAR_LISP ("pre-abbrev-expand-hook", &Vpre_abb/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("internal--top-level-message", Vint/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("last-command-event", 
last_command_/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("last-nonmenu-event", 
last_nonmenu_/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("last-input-event", 
last_input_even/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("unread-command-events", Vunread_co/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("unread-post-input-method-events", /
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("unread-input-method-events", Vunre/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("meta-prefix-char", 
meta_prefix_cha/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_KBOARD ("last-command", 
Vlast_command,
+               /
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_KBOARD ("real-last-command", 
Vreal_last_c/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_KBOARD 
("last-repeatable-command", Vlast_/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("this-command", 
Vthis_command,
+          /
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("real-this-command", 
Vreal_this_com/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("this-command-keys-shift-translated/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("this-original-command", Vthis_orig/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_INT ("auto-save-interval", 
auto_save_inte/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("auto-save-timeout", 
Vauto_save_tim/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("echo-keystrokes", 
Vecho_keystrokes/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_INT ("polling-period", 
polling_period,
+        /
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("double-click-time", 
Vdouble_click_/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_INT ("double-click-fuzz", 
double_click_fu/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_INT ("num-input-keys", 
num_input_keys,
+        /
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_INT 
("num-nonmacro-input-events", num_non/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("last-event-frame", 
Vlast_event_fra/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("tty-erase-char", 
Vtty_erase_char,
+/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("help-char", 
Vhelp_char,
+              do/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("help-event-list", 
Vhelp_event_list/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("help-form", 
Vhelp_form,
+              do/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("prefix-help-command", 
Vprefix_help/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("top-level", 
Vtop_level,
+              do/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_KBOARD 
("keyboard-translate-table", Vkeyb/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_BOOL ("cannot-suspend", 
cannot_suspend,
+       /
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_BOOL ("menu-prompting", 
menu_prompting,
+       /
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("menu-prompt-more-char", menu_promp/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_INT 
("extra-keyboard-modifiers", extra_ke/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("deactivate-mark", 
Vdeactivate_mark/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("pre-command-hook", 
Vpre_command_ho/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("post-command-hook", 
Vpost_command_/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("echo-area-clear-hook", ...,
+            /
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("lucid-menu-bar-dirty-flag", Vlucid/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("menu-bar-final-items", Vmenu_bar_f/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("tool-bar-separator-image-expressio/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_KBOARD 
("overriding-terminal-local-map",
+/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("overriding-local-map", Voverriding/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("overriding-local-map-menu-flag", V/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("special-event-map", 
Vspecial_event/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("track-mouse", 
do_mouse_tracking,
+       /
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_KBOARD ("system-key-alist", 
Vsystem_key_a/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_KBOARD 
("local-function-key-map", Vlocal_/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_KBOARD ("input-decode-map", 
Vinput_decode/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("function-key-map", 
Vfunction_key_m/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("key-translation-map", 
Vkey_transla/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("deferred-action-list", Vdeferred_a/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("deferred-action-function", Vdeferr/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("delayed-warnings-list", Vdelayed_w/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("timer-list", 
Vtimer_list,
+              /
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("timer-idle-list", 
Vtimer_idle_list/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("input-method-function", Vinput_met/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("input-method-previous-message",
+        /
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("show-help-function", 
Vshow_help_fu/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("disable-point-adjustment", Vdisabl/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("global-disable-point-adjustment",
+/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("minibuffer-message-timeout", Vmini/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("throw-on-input", 
Vthrow_on_input,
+/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("command-error-function", Vcommand_/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("enable-disabled-menus-and-buttons"/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("select-active-regions",
+              Vs/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("saved-region-selection",
+              V/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP 
("selection-inhibit-update-commands"/
+\1     c-src/emacs/src/keyboard.c      /^  DEFVAR_LISP ("debug-on-event",
+               Vd/
+\:     tex-src/texinfo.tex     /^\\def\\:{\\spacefactor=1000 }$/
+\@     tex-src/texinfo.tex     /address@hidden \\char '100}}$/
+\@     tex-src/texinfo.tex     /address@hidden@}%$/
+\CHAPFopen     tex-src/texinfo.tex     /^\\def\\CHAPFopen{$/
+\CHAPFplain    tex-src/texinfo.tex     /^\\def\\CHAPFplain{$/
+\CHAPPAGodd    tex-src/texinfo.tex     /^\\def\\CHAPPAGodd{$/
+\CHAPPAGoff    tex-src/texinfo.tex     /^\\def\\CHAPPAGoff{$/
+\CHAPPAGon     tex-src/texinfo.tex     /^\\def\\CHAPPAGon{$/
+\ENVcheck      tex-src/texinfo.tex     /^\\def\\ENVcheck{%$/
+\Ealphaenumerate       tex-src/texinfo.tex     
/^\\def\\Ealphaenumerate{\\Eenumerate}$/
+\Ecapsenumerate        tex-src/texinfo.tex     
/^\\def\\Ecapsenumerate{\\Eenumerate}$/
+\Ecartouche    tex-src/texinfo.tex     /^\\def\\Ecartouche{%$/
+\Edescription  tex-src/texinfo.tex     /^\\def\\Edescription{\\Etable}% 
Neccessary kludge.$/
+\Edisplay      tex-src/texinfo.tex     
/^\\def\\Edisplay{\\endgroup\\afterenvbreak}%$/
+\Eexample      tex-src/texinfo.tex     /^\\def\\Eexample{\\Elisp}$/
+\Eflushleft    tex-src/texinfo.tex     
/^\\def\\Eflushleft{\\endgroup\\afterenvbreak}%$/
+\Eflushright   tex-src/texinfo.tex     
/^\\def\\Eflushright{\\endgroup\\afterenvbreak}%$/
+\Eformat       tex-src/texinfo.tex     
/^\\def\\Eformat{\\endgroup\\afterenvbreak}$/
+\Eftable       tex-src/texinfo.tex     
/^\\def\\Eftable{\\endgraf\\endgroup\\afterenvbreak}%$/
+\Egroup        tex-src/texinfo.tex     /^  \\def\\Egroup{\\egroup\\endgroup}%$/
+\Eifclear      tex-src/texinfo.tex     /^\\def\\Eifclear{}$/
+\Eifset        tex-src/texinfo.tex     /^\\def\\Eifset{}$/
+\Eiftex        tex-src/texinfo.tex     /^\\def\\Eiftex{}$/
+\Elisp tex-src/texinfo.tex     /^\\def\\Elisp{\\endgroup\\afterenvbreak}%$/
+\Equotation    tex-src/texinfo.tex     
/^\\def\\Equotation{\\par\\endgroup\\afterenvbreak}%$/
+\Esmallexample tex-src/texinfo.tex     /^\\def\\Esmallexample{\\Elisp}$/
+\Esmallexample tex-src/texinfo.tex     
/^\\global\\def\\Esmallexample{\\Esmalllisp}$/
+\Esmalllisp    tex-src/texinfo.tex     
/^\\def\\Esmalllisp{\\endgroup\\afterenvbreak}%$/
+\Etable        tex-src/texinfo.tex     
/^\\def\\Etable{\\endgraf\\endgroup\\afterenvbreak}%$/
+\Etitlepage    tex-src/texinfo.tex     /^\\def\\Etitlepage{%$/
+\Evtable       tex-src/texinfo.tex     
/^\\def\\Evtable{\\endgraf\\endgroup\\afterenvbreak}%$/
+\HEADINGSafter tex-src/texinfo.tex     
/^\\def\\HEADINGSafter{\\let\\HEADINGShook=\\HEADINGSdoub/
+\HEADINGSdouble        tex-src/texinfo.tex     /^\\def\\HEADINGSdouble{$/
+\HEADINGSdoublex       tex-src/texinfo.tex     /^\\def\\HEADINGSdoublex{%$/
+\HEADINGSoff   tex-src/texinfo.tex     /^\\def\\HEADINGSoff{$/
+\HEADINGSon    tex-src/texinfo.tex     /^\\def\\HEADINGSon{\\HEADINGSdouble}$/
+\HEADINGSon    tex-src/texinfo.tex     
/^\\global\\def\\HEADINGSon{\\HEADINGSsingle}}$/
+\HEADINGSon    tex-src/texinfo.tex     
/^\\global\\def\\HEADINGSon{\\HEADINGSdouble}}$/
+\HEADINGSsingle        tex-src/texinfo.tex     /^\\def\\HEADINGSsingle{$/
+\HEADINGSsingleafter   tex-src/texinfo.tex     
/^\\def\\HEADINGSsingleafter{\\let\\HEADINGShook=\\HEADIN/
+\HEADINGSsinglex       tex-src/texinfo.tex     /^\\def\\HEADINGSsinglex{%$/
+\TeX   tex-src/texinfo.tex     /^\\def\\TeX{\\realbackslash TeX}%$/
+\TeX   tex-src/texinfo.tex     /^\\def\\TeX{\\realbackslash TeX}$/
+\Yappendixletterandtype        tex-src/texinfo.tex     
/^\\def\\Yappendixletterandtype{%$/
+\Ynothing      tex-src/texinfo.tex     /^\\def\\Ynothing{}$/
+\Ypagenumber   tex-src/texinfo.tex     /^\\def\\Ypagenumber{\\folio}$/
+\Ysectionnumberandtype tex-src/texinfo.tex     
/^\\def\\Ysectionnumberandtype{%$/
+\Ytitle        tex-src/texinfo.tex     /^\\def\\Ytitle{\\thischapter}$/
+\_     tex-src/texinfo.tex     /^\\def\\_{{\\realbackslash _}}%$/
+\_     tex-src/texinfo.tex     /^\\def\\_{\\lvvmode \\kern.06em \\vbox{\\hrule 
width.3em /
+\`     tex-src/texinfo.tex     /^\\def\\`{{`}}$/
+\aboveenvbreak tex-src/texinfo.tex     
/^\\def\\aboveenvbreak{{\\advance\\aboveenvskipamount by/
+\activedoublequote     tex-src/texinfo.tex     
/^\\def\\activedoublequote{{\\tt \\char '042}}$/
+\activeparens  tex-src/texinfo.tex     /^\\def\\activeparens{%$/
+\afourpaper    tex-src/texinfo.tex     /^\\def\\afourpaper{$/
+\afterenvbreak tex-src/texinfo.tex     /^\\def\\afterenvbreak{\\endgraf 
\\ifdim\\lastskip<\\above/
+\alphaenumerate        tex-src/texinfo.tex     
/^\\def\\alphaenumerate{\\enumerate{a}}$/
+\appendix      tex-src/texinfo.tex     
/^\\outer\\def\\appendix{\\parsearg\\appendixzzz}$/
+\appendixletter        tex-src/texinfo.tex     
/^\\def\\appendixletter{\\char\\the\\appendixno}$/
+\appendixnoderef       tex-src/texinfo.tex     
/^\\def\\appendixnoderef{\\ifx\\lastnode\\relax\\else$/
+\appendixsec   tex-src/texinfo.tex     
/^\\outer\\def\\appendixsec{\\parsearg\\appendixsectionzz/
+\appendixsection       tex-src/texinfo.tex     
/^\\outer\\def\\appendixsection{\\parsearg\\appendixsecti/
+\appendixsectionzzz    tex-src/texinfo.tex     /^\\def\\appendixsectionzzz 
#1{\\seccheck{appendixsecti/
+\appendixsetref        tex-src/texinfo.tex     /^\\def\\appendixsetref#1{%$/
+\appendixsubsec        tex-src/texinfo.tex     
/^\\outer\\def\\appendixsubsec{\\parsearg\\appendixsubsec/
+\appendixsubseczzz     tex-src/texinfo.tex     /^\\def\\appendixsubseczzz 
#1{\\seccheck{appendixsubsec/
+\appendixsubsubsec     tex-src/texinfo.tex     
/^\\outer\\def\\appendixsubsubsec{\\parsearg\\appendixsub/
+\appendixsubsubseczzz  tex-src/texinfo.tex     /^\\def\\appendixsubsubseczzz 
#1{\\seccheck{appendixsub/
+\appendixzzz   tex-src/texinfo.tex     /^\\def\\appendixzzz 
#1{\\seccheck{appendix}%$/
+\asis  tex-src/texinfo.tex     /^\\def\\asis#1{#1}$/
+\author        tex-src/texinfo.tex     /^   
\\def\\author{\\parsearg\\authorzzz}%$/
+\authorfont    tex-src/texinfo.tex     /^   \\def\\authorfont{\\authorrm 
\\normalbaselineskip =/
+\authorzzz     tex-src/texinfo.tex     /^   
\\def\\authorzzz##1{\\ifseenauthor\\else\\vskip 0pt /
+\b     tex-src/texinfo.tex     /^\\def\\b#1{{\\bf #1}}$/
+\b     tex-src/texinfo.tex     /^\\def\\b##1{\\realbackslash b {##1}}%$/
+\b     tex-src/texinfo.tex     /^\\def\\b##1{\\realbackslash b {##1}}$/
+\balancecolumns        tex-src/texinfo.tex     /^\\def\\balancecolumns{%$/
+\begin tex-src/texinfo.tex     /^\\outer\\def\\begin{\\parsearg\\beginxxx}$/
+\begindoublecolumns    tex-src/texinfo.tex     
/^\\def\\begindoublecolumns{\\begingroup$/
+\beginxxx      tex-src/texinfo.tex     /^\\def\\beginxxx #1{%$/
+\bf    tex-src/texinfo.tex     /^\\def\\bf{\\realbackslash bf }%$/
+\bf    tex-src/texinfo.tex     /^\\def\\bf{\\realbackslash bf }$/
+\bullet        tex-src/texinfo.tex     /^\\def\\bullet{$\\ptexbullet$}$/
+\bye   tex-src/texinfo.tex     
/^\\outer\\def\\bye{\\pagealignmacro\\tracingstats=1\\ptex/
+\capsenumerate tex-src/texinfo.tex     /^\\def\\capsenumerate{\\enumerate{A}}$/
+\cartbot       tex-src/texinfo.tex     /^\\def\\cartbot{\\hbox to 
\\cartouter{\\hskip\\lskip$/
+\cartouche     tex-src/texinfo.tex     /^\\long\\def\\cartouche{%$/
+\carttop       tex-src/texinfo.tex     /^\\def\\carttop{\\hbox to 
\\cartouter{\\hskip\\lskip$/
+\cbl   tex-src/texinfo.tex     /^\\def\\cbl{{\\circle\\char'012\\hskip -6pt}}$/
+\cbr   tex-src/texinfo.tex     /^\\def\\cbr{{\\hskip 6pt\\circle\\char'011}}$/
+\center        tex-src/texinfo.tex     /^\\def\\center{\\parsearg\\centerzzz}$/
+\centerzzz     tex-src/texinfo.tex     /^\\def\\centerzzz #1{{\\advance\\hsize 
by -\\leftskip$/
+\chapbreak     tex-src/texinfo.tex     /^\\def\\chapbreak{\\dobreak 
\\chapheadingskip {-4000}}$/
+\chapentry     tex-src/texinfo.tex     
/^\\def\\chapentry#1#2#3{\\dochapentry{#2\\labelspace#1}/
+\chapentryfonts        tex-src/texinfo.tex     
/^\\def\\chapentryfonts{\\secfonts \\rm}$/
+\chapfonts     tex-src/texinfo.tex     /^\\def\\chapfonts{%$/
+\chapheading   tex-src/texinfo.tex     
/^\\def\\chapheading{\\parsearg\\chapheadingzzz}$/
+\chapheadingzzz        tex-src/texinfo.tex     /^\\def\\chapheadingzzz 
#1{\\chapbreak %$/
+\chapoddpage   tex-src/texinfo.tex     /^\\def\\chapoddpage{\\chappager 
\\ifodd\\pageno \\else \\h/
+\chappager     tex-src/texinfo.tex     
/^\\def\\chappager{\\par\\vfill\\supereject}$/
+\chapter       tex-src/texinfo.tex     
/^\\outer\\def\\chapter{\\parsearg\\chapterzzz}$/
+\chapternofonts        tex-src/texinfo.tex     /^\\def\\chapternofonts{%$/
+\chapterzzz    tex-src/texinfo.tex     /^\\def\\chapterzzz 
#1{\\seccheck{chapter}%$/
+\char  tex-src/texinfo.tex     /^\\def\\char{\\realbackslash char}%$/
+\char  tex-src/texinfo.tex     /^\\def\\char{\\realbackslash char}$/
+\chfopen       tex-src/texinfo.tex     /^\\def\\chfopen #1#2{\\chapoddpage 
{\\chapfonts$/
+\chfplain      tex-src/texinfo.tex     /^\\def\\chfplain #1#2{%$/
+\cindex        tex-src/texinfo.tex     /^\\def\\cindex {\\cpindex}$/
+\cindexsub     tex-src/texinfo.tex     /^\\def\\cindexsub 
{\\begingroup\\obeylines\\cindexsub}$/
+\cite  tex-src/texinfo.tex     /^\\def\\cite##1{\\realbackslash cite {##1}}%$/
+\cite  tex-src/texinfo.tex     /^\\def\\cite##1{\\realbackslash cite {##1}}$/
+\clear tex-src/texinfo.tex     /^\\def\\clear{\\parsearg\\clearxxx}$/
+\clearxxx      tex-src/texinfo.tex     /^\\def\\clearxxx #1{$/
+\code  tex-src/texinfo.tex     /^\\def\\code##1{\\realbackslash code {##1}}%$/
+\code  tex-src/texinfo.tex     /^\\def\\code##1{\\realbackslash code {##1}}$/
+\comment       tex-src/texinfo.tex     /^\\def\\comment{\\catcode 64=\\other 
\\catcode 123=\\othe/
+\commentxxx    tex-src/texinfo.tex     /^\\def\\commentxxx #1{\\catcode 64=0 
\\catcode 123=1 \\c/
+\contents      tex-src/texinfo.tex     /^\\outer\\def\\contents{%$/
+\copyright     tex-src/texinfo.tex     /^\\def\\copyright{\\realbackslash 
copyright }%$/
+\copyright     tex-src/texinfo.tex     /^\\def\\copyright{\\realbackslash 
copyright}$/
+\cropmarks     tex-src/texinfo.tex     
/^\\def\\cropmarks{\\let\\onepageout=\\croppageout }$/
+\croppageout   tex-src/texinfo.tex     /^\\def\\croppageout#1{\\hoffset=0pt % 
make sure this d/
+\ctl   tex-src/texinfo.tex     /^\\def\\ctl{{\\circle\\char'013\\hskip -6pt}}% 
6pt from /
+\ctr   tex-src/texinfo.tex     /^\\def\\ctr{{\\hskip 6pt\\circle\\char'010}}$/
+\ctrl  tex-src/texinfo.tex     /^\\def\\ctrl #1{{\\tt \\rawbackslash 
\\hat}#1}$/
+\defcodeindex  tex-src/texinfo.tex     
/^\\def\\defcodeindex{\\parsearg\\newcodeindex}$/
+\defcv tex-src/texinfo.tex     /^\\def\\defcv #1 {\\def\\defcvtype{#1}%$/
+\defcvarheader tex-src/texinfo.tex     /^\\def\\defcvarheader #1#2#3{%$/
+\defcvx        tex-src/texinfo.tex     /^\\def\\defcvx #1 address@hidden in 
invalid con/
+\deffn tex-src/texinfo.tex     
/^\\def\\deffn{\\defmethparsebody\\Edeffn\\deffnx\\deffnhe/
+\deffnheader   tex-src/texinfo.tex     /^\\def\\deffnheader #1#2#3{\\doind 
{fn}{\\code{#2}}%$/
+\deffnx        tex-src/texinfo.tex     /^\\def\\deffnx #1 address@hidden in 
invalid con/
+\defindex      tex-src/texinfo.tex     
/^\\def\\defindex{\\parsearg\\newindex}$/
+\defivar       tex-src/texinfo.tex     
/^\\def\\defivar{\\defvrparsebody\\Edefivar\\defivarx\\def/
+\defivarheader tex-src/texinfo.tex     /^\\def\\defivarheader #1#2#3{%$/
+\defivarx      tex-src/texinfo.tex     /^\\def\\defivarx #1 address@hidden in 
invalid/
+\defmac        tex-src/texinfo.tex     
/^\\def\\defmac{\\defparsebody\\Edefmac\\defmacx\\defmache/
+\defmacheader  tex-src/texinfo.tex     /^\\def\\defmacheader #1#2{\\doind 
{fn}{\\code{#1}}% Mak/
+\defmacx       tex-src/texinfo.tex     /^\\def\\defmacx #1 address@hidden in 
invalid c/
+\defmethod     tex-src/texinfo.tex     
/^\\def\\defmethod{\\defmethparsebody\\Edefmethod\\defmet/
+\defmethodheader       tex-src/texinfo.tex     /^\\def\\defmethodheader 
#1#2#3{%$/
+\defmethodx    tex-src/texinfo.tex     /^\\def\\defmethodx #1 address@hidden 
in inv/
+\defmethparsebody      tex-src/texinfo.tex     /^\\def\\defmethparsebody 
#1#2#3#4 {\\begingroup\\inENV /
+\defname       tex-src/texinfo.tex     /^\\def\\defname #1#2{%$/
+\defop tex-src/texinfo.tex     /^\\def\\defop #1 {\\def\\defoptype{#1}%$/
+\defopheader   tex-src/texinfo.tex     /^\\def\\defopheader #1#2#3{%$/
+\defopparsebody        tex-src/texinfo.tex     /^\\def\\defopparsebody 
#1#2#3#4#5 {\\begingroup\\inENV /
+\defopt        tex-src/texinfo.tex     
/^\\def\\defopt{\\defvarparsebody\\Edefopt\\defoptx\\defop/
+\defoptheader  tex-src/texinfo.tex     /^\\def\\defoptheader #1#2{\\doind 
{vr}{\\code{#1}}% Mak/
+\defoptx       tex-src/texinfo.tex     /^\\def\\defoptx #1 address@hidden in 
invalid c/
+\defopvarparsebody     tex-src/texinfo.tex     /^\\def\\defopvarparsebody 
#1#2#3#4#5 {\\begingroup\\inE/
+\defopx        tex-src/texinfo.tex     /^\\def\\defopx #1 address@hidden in 
invalid con/
+\defparsebody  tex-src/texinfo.tex     /^\\def\\defparsebody 
#1#2#3{\\begingroup\\inENV% Enviro/
+\defspec       tex-src/texinfo.tex     
/^\\def\\defspec{\\defparsebody\\Edefspec\\defspecx\\defsp/
+\defspecheader tex-src/texinfo.tex     /^\\def\\defspecheader #1#2{\\doind 
{fn}{\\code{#1}}% Ma/
+\defspecx      tex-src/texinfo.tex     /^\\def\\defspecx #1 address@hidden in 
invalid/
+\deftp tex-src/texinfo.tex     
/^\\def\\deftp{\\defvrparsebody\\Edeftp\\deftpx\\deftphead/
+\deftpargs     tex-src/texinfo.tex     /^\\def\\deftpargs #1{\\bf 
\\defvarargs{#1}}$/
+\deftpheader   tex-src/texinfo.tex     /^\\def\\deftpheader #1#2#3{\\doind 
{tp}{\\code{#2}}%$/
+\deftpx        tex-src/texinfo.tex     /^\\def\\deftpx #1 address@hidden in 
invalid con/
+\deftypefn     tex-src/texinfo.tex     
/^\\def\\deftypefn{\\defmethparsebody\\Edeftypefn\\deftyp/
+\deftypefnheader       tex-src/texinfo.tex     /^\\def\\deftypefnheader 
#1#2#3{\\deftypefnheaderx{#1}{/
+\deftypefnheaderx      tex-src/texinfo.tex     /^\\def\\deftypefnheaderx 
#1#2#3 #4\\relax{%$/
+\deftypefnx    tex-src/texinfo.tex     /^\\def\\deftypefnx #1 address@hidden 
in inv/
+\deftypefun    tex-src/texinfo.tex     
/^\\def\\deftypefun{\\defparsebody\\Edeftypefun\\deftypef/
+\deftypefunargs        tex-src/texinfo.tex     /^\\def\\deftypefunargs #1{%$/
+\deftypefunheader      tex-src/texinfo.tex     /^\\def\\deftypefunheader 
#1#2{\\deftypefunheaderx{#1}#/
+\deftypefunheaderx     tex-src/texinfo.tex     /^\\def\\deftypefunheaderx #1#2 
#3\\relax{%$/
+\deftypeunx    tex-src/texinfo.tex     /^\\def\\deftypeunx #1 address@hidden 
in inv/
+\deftypevar    tex-src/texinfo.tex     
/^\\def\\deftypevar{\\defvarparsebody\\Edeftypevar\\defty/
+\deftypevarheader      tex-src/texinfo.tex     /^\\def\\deftypevarheader 
#1#2{%$/
+\deftypevarx   tex-src/texinfo.tex     /^\\def\\deftypevarx #1 address@hidden 
in i/
+\deftypevr     tex-src/texinfo.tex     
/^\\def\\deftypevr{\\defvrparsebody\\Edeftypevr\\deftypev/
+\deftypevrheader       tex-src/texinfo.tex     /^\\def\\deftypevrheader 
#1#2#3{\\doind {vr}{\\code{#3}}/
+\deftypevrx    tex-src/texinfo.tex     /^\\def\\deftypevrx #1 address@hidden 
in inv/
+\defun tex-src/texinfo.tex     
/^\\def\\defun{\\defparsebody\\Edefun\\defunx\\defunheader/
+\defunargs     tex-src/texinfo.tex     /^\\def\\defunargs #1{\\functionparens 
\\sl$/
+\defunheader   tex-src/texinfo.tex     /^\\def\\defunheader #1#2{\\doind 
{fn}{\\code{#1}}% Make/
+\defunx        tex-src/texinfo.tex     /^\\def\\defunx #1 address@hidden in 
invalid con/
+\defvar        tex-src/texinfo.tex     
/^\\def\\defvar{\\defvarparsebody\\Edefvar\\defvarx\\defva/
+\defvarargs    tex-src/texinfo.tex     /^\\def\\defvarargs #1{\\normalparens 
#1%$/
+\defvarheader  tex-src/texinfo.tex     /^\\def\\defvarheader #1#2{\\doind 
{vr}{\\code{#1}}% Mak/
+\defvarparsebody       tex-src/texinfo.tex     /^\\def\\defvarparsebody 
#1#2#3{\\begingroup\\inENV% Env/
+\defvarx       tex-src/texinfo.tex     /^\\def\\defvarx #1 address@hidden in 
invalid c/
+\defvr tex-src/texinfo.tex     
/^\\def\\defvr{\\defvrparsebody\\Edefvr\\defvrx\\defvrhead/
+\defvrheader   tex-src/texinfo.tex     /^\\def\\defvrheader #1#2#3{\\doind 
{vr}{\\code{#2}}%$/
+\defvrparsebody        tex-src/texinfo.tex     /^\\def\\defvrparsebody 
#1#2#3#4 {\\begingroup\\inENV %$/
+\defvrx        tex-src/texinfo.tex     /^\\def\\defvrx #1 address@hidden in 
invalid con/
+\description   tex-src/texinfo.tex     
/^\\def\\description{\\tablez{\\dontindex}{1}{}{}{}{}}$/
+\df    tex-src/texinfo.tex     /^\\def\\df{\\let\\tentt=\\deftt \\let\\tenbf = 
\\defbf \\bf}/
+\dfn   tex-src/texinfo.tex     /^\\def\\dfn##1{\\realbackslash dfn {##1}}$/
+\direntry      tex-src/texinfo.tex     
/^\\def\\direntry{\\begingroup\\direntryxxx}$/
+\direntryxxx   tex-src/texinfo.tex     /^\\long\\def\\direntryxxx #1\\end 
direntry{\\endgroup\\ig/
+\display       tex-src/texinfo.tex     /^\\def\\display{\\begingroup\\inENV 
%This group ends at/
+\dmn   tex-src/texinfo.tex     /^\\def\\dmn#1{\\thinspace #1}$/
+\dobreak       tex-src/texinfo.tex     
/^\\def\\dobreak#1#2{\\par\\ifdim\\lastskip<#1\\removelast/
+\dochapentry   tex-src/texinfo.tex     /^\\def\\dochapentry#1#2{%$/
+\docodeindex   tex-src/texinfo.tex     
/^\\def\\docodeindex#1{\\edef\\indexname{#1}\\parsearg\\si/
+\doind tex-src/texinfo.tex     /^\\def\\doind #1#2{%$/
+\doindex       tex-src/texinfo.tex     
/^\\def\\doindex#1{\\edef\\indexname{#1}\\parsearg\\single/
+\donoderef     tex-src/texinfo.tex     
/^\\def\\donoderef{\\ifx\\lastnode\\relax\\else$/
+\dontindex     tex-src/texinfo.tex     /^\\def\\dontindex #1{}$/
+\dopageno      tex-src/texinfo.tex     /^\\def\\dopageno#1{{\\rm #1}}$/
+\doprintindex  tex-src/texinfo.tex     /^\\def\\doprintindex#1{%$/
+\dosecentry    tex-src/texinfo.tex     /^\\def\\dosecentry#1#2{%$/
+\dosetq        tex-src/texinfo.tex     /^\\def\\dosetq #1#2{{\\let\\folio=0 
\\turnoffactive%$/
+\doshortpageno tex-src/texinfo.tex     /^\\def\\doshortpageno#1{{\\rm #1}}$/
+\dosubind      tex-src/texinfo.tex     /^\\def\\dosubind #1#2#3{%$/
+\dosubsecentry tex-src/texinfo.tex     /^\\def\\dosubsecentry#1#2{%$/
+\dosubsubsecentry      tex-src/texinfo.tex     
/^\\def\\dosubsubsecentry#1#2{%$/
+\dots  tex-src/texinfo.tex     /^\\def\\dots{$\\ldots$}$/
+\dots  tex-src/texinfo.tex     /^\\def\\dots{\\realbackslash dots }%$/
+\dots  tex-src/texinfo.tex     /^\\def\\dots{\\realbackslash dots}$/
+\doublecolumnout       tex-src/texinfo.tex     
/^\\def\\doublecolumnout{\\splittopskip=\\topskip \\split/
+\emph  tex-src/texinfo.tex     /^\\def\\emph##1{\\realbackslash emph {##1}}$/
+\end   tex-src/texinfo.tex     /^\\def\\end{\\parsearg\\endxxx}$/
+\enddoublecolumns      tex-src/texinfo.tex     
/^\\def\\enddoublecolumns{\\output={\\balancecolumns}\\ej/
+\endxxx        tex-src/texinfo.tex     /^\\def\\endxxx #1{%$/
+\entry tex-src/texinfo.tex     /^\\def\\entry #1#2{\\begingroup$/
+\enumerate     tex-src/texinfo.tex     
/^\\def\\enumerate{\\parsearg\\enumeratezzz}$/
+\enumeratey    tex-src/texinfo.tex     /^\\def\\enumeratey #1 
#2\\endenumeratey{%$/
+\enumeratezzz  tex-src/texinfo.tex     /^\\def\\enumeratezzz #1{\\enumeratey 
#1  \\endenumerate/
+\equiv tex-src/texinfo.tex     /^\\def\\equiv{\\realbackslash equiv}$/
+\equiv tex-src/texinfo.tex     /^\\def\\equiv{\\leavevmode\\lower.1ex\\hbox to 
1em{\\hfil/
+\error tex-src/texinfo.tex     
/^\\def\\error{\\leavevmode\\lower.7ex\\copy\\errorbox}$/
+\errorE        tex-src/texinfo.tex     /^\\def\\errorE#1{$/
+\evenfooting   tex-src/texinfo.tex     
/^\\def\\evenfooting{\\parsearg\\evenfootingxxx}$/
+\evenheading   tex-src/texinfo.tex     
/^\\def\\evenheading{\\parsearg\\evenheadingxxx}$/
+\everyfooting  tex-src/texinfo.tex     
/^\\def\\everyfooting{\\parsearg\\everyfootingxxx}$/
+\everyheading  tex-src/texinfo.tex     
/^\\def\\everyheading{\\parsearg\\everyheadingxxx}$/
+\ewbot tex-src/texinfo.tex     /^\\def\\ewbot{\\vrule height0pt 
depth\\cornerthick widt/
+\ewtop tex-src/texinfo.tex     /^\\def\\ewtop{\\vrule height\\cornerthick 
depth0pt widt/
+\exdent        tex-src/texinfo.tex     /^\\def\\exdent{\\parsearg\\exdentyyy}$/
+\exdentyyy     tex-src/texinfo.tex     /^\\def\\exdentyyy 
#1{{\\hfil\\break\\hbox{\\kern -\\exdent/
+\expansion     tex-src/texinfo.tex     /^\\def\\expansion{\\realbackslash 
expansion}$/
+\expansion     tex-src/texinfo.tex     
/^\\def\\expansion{\\leavevmode\\raise.1ex\\hbox to 1em{\\/
+\file  tex-src/texinfo.tex     /^\\def\\file##1{\\realbackslash file {##1}}%$/
+\file  tex-src/texinfo.tex     /^\\def\\file##1{\\realbackslash file {##1}}$/
+\finalout      tex-src/texinfo.tex     /^\\def\\finalout{\\overfullrule=0pt}$/
+\findex        tex-src/texinfo.tex     /^\\def\\findex {\\fnindex}$/
+\finishtitlepage       tex-src/texinfo.tex     /^\\def\\finishtitlepage{%$/
+\flushcr       tex-src/texinfo.tex     /^\\def\\flushcr{\\ifx\\par\\lisppar 
\\def\\next##1{}\\else /
+\flushleft     tex-src/texinfo.tex     /^\\def\\flushleft{%$/
+\flushright    tex-src/texinfo.tex     /^\\def\\flushright{%$/
+\fnitemindex   tex-src/texinfo.tex     /^\\def\\fnitemindex #1{\\doind 
{fn}{\\code{#1}}}%$/
+\format        tex-src/texinfo.tex     /^\\def\\format{\\begingroup\\inENV 
%This group ends at /
+\frenchspacing tex-src/texinfo.tex     /^\\def\\frenchspacing{\\sfcode46=1000 
\\sfcode63=1000 \\/
+\ftable        tex-src/texinfo.tex     
/^\\def\\ftable{\\begingroup\\inENV\\obeylines\\obeyspaces/
+\gloggingall   tex-src/texinfo.tex     /^\\def\\gloggingall{\\begingroup 
\\globaldefs = 1 \\logg/
+\group tex-src/texinfo.tex     /^\\def\\group{\\begingroup$/
+\gtr   tex-src/texinfo.tex     /^\\def\\gtr{\\realbackslash gtr}%$/
+\gtr   tex-src/texinfo.tex     /^\\def\\gtr{\\realbackslash gtr}$/
+\hat   tex-src/texinfo.tex     /^\\def\\hat{\\realbackslash hat}%$/
+\hat   tex-src/texinfo.tex     /^\\def\\hat{\\realbackslash hat}$/
+\heading       tex-src/texinfo.tex     
/^\\def\\heading{\\parsearg\\secheadingi}$/
+\headings      tex-src/texinfo.tex     /^\\def\\headings #1 {\\csname 
HEADINGS#1\\endcsname}$/
+\i     tex-src/texinfo.tex     /^\\def\\i##1{\\realbackslash i {##1}}%$/
+\i     tex-src/texinfo.tex     /^\\def\\i##1{\\realbackslash i {##1}}$/
+\ifclear       tex-src/texinfo.tex     
/^\\def\\ifclear{\\begingroup\\ignoresections\\parsearg\\i/
+\ifclearfail   tex-src/texinfo.tex     
/^\\def\\ifclearfail{\\begingroup\\ignoresections\\ifclea/
+\ifclearfailxxx        tex-src/texinfo.tex     /^\\long\\def\\ifclearfailxxx 
#1\\end ifclear{\\endgroup\\/
+\ifclearxxx    tex-src/texinfo.tex     /^\\def\\ifclearxxx #1{\\endgroup$/
+\ifinfo        tex-src/texinfo.tex     
/^\\def\\ifinfo{\\begingroup\\ignoresections\\ifinfoxxx}$/
+\ifinfoxxx     tex-src/texinfo.tex     /^\\long\\def\\ifinfoxxx #1\\end 
ifinfo{\\endgroup\\ignore/
+\ifset tex-src/texinfo.tex     
/^\\def\\ifset{\\begingroup\\ignoresections\\parsearg\\ifs/
+\ifsetfail     tex-src/texinfo.tex     
/^\\def\\ifsetfail{\\begingroup\\ignoresections\\ifsetfai/
+\ifsetfailxxx  tex-src/texinfo.tex     /^\\long\\def\\ifsetfailxxx #1\\end 
ifset{\\endgroup\\igno/
+\ifsetxxx      tex-src/texinfo.tex     /^\\def\\ifsetxxx #1{\\endgroup$/
+\iftex tex-src/texinfo.tex     /^\\def\\iftex{}$/
+\ifusingtt     tex-src/texinfo.tex     /^\\def\\ifusingtt#1#2{\\ifdim 
\\fontdimen3\\the\\font=0pt/
+\ignore        tex-src/texinfo.tex     
/^\\def\\ignore{\\begingroup\\ignoresections$/
+\ignoresections        tex-src/texinfo.tex     /^\\def\\ignoresections{%$/
+\ignorexxx     tex-src/texinfo.tex     /^\\long\\def\\ignorexxx #1\\end 
ignore{\\endgroup\\ignore/
+\ii    tex-src/texinfo.tex     /^\\def\\ii#1{{\\it #1}}                % 
italic font$/
+\inENV tex-src/texinfo.tex     /^\\newif\\ifENV \\ENVfalse 
\\def\\inENV{\\ifENV\\relax\\els/
+\include       tex-src/texinfo.tex     
/^\\def\\include{\\parsearg\\includezzz}$/
+\includezzz    tex-src/texinfo.tex     /^\\def\\includezzz 
#1{{\\def\\thisfile{#1}\\input #1$/
+\indexbackslash        tex-src/texinfo.tex     /^  
\\def\\indexbackslash{\\rawbackslashxx}$/
+\indexdotfill  tex-src/texinfo.tex     /^\\def\\indexdotfill{\\cleaders$/
+\indexdummies  tex-src/texinfo.tex     /^\\def\\indexdummies{%$/
+\indexdummydots        tex-src/texinfo.tex     /^\\def\\indexdummydots{...}$/
+\indexdummyfont        tex-src/texinfo.tex     /^\\def\\indexdummyfont#1{#1}$/
+\indexdummytex tex-src/texinfo.tex     /^\\def\\indexdummytex{TeX}$/
+\indexfonts    tex-src/texinfo.tex     /^\\def\\indexfonts{%$/
+\indexnofonts  tex-src/texinfo.tex     /^\\def\\indexnofonts{%$/
+\infoappendix  tex-src/texinfo.tex     
/^\\def\\infoappendix{\\parsearg\\appendixzzz}$/
+\infoappendixsec       tex-src/texinfo.tex     
/^\\def\\infoappendixsec{\\parsearg\\appendixseczzz}$/
+\infoappendixsubsec    tex-src/texinfo.tex     
/^\\def\\infoappendixsubsec{\\parsearg\\appendixsubseczz/
+\infoappendixsubsubsec tex-src/texinfo.tex     
/^\\def\\infoappendixsubsubsec{\\parsearg\\appendixsubsu/
+\infochapter   tex-src/texinfo.tex     
/^\\def\\infochapter{\\parsearg\\chapterzzz}$/
+\inforef       tex-src/texinfo.tex     /^\\def\\inforef #1{\\inforefzzz 
#1,,,,**}$/
+\inforefzzz    tex-src/texinfo.tex     /^\\def\\inforefzzz #1,#2,#3,#4**{See 
Info file \\file{/
+\infosection   tex-src/texinfo.tex     
/^\\def\\infosection{\\parsearg\\sectionzzz}$/
+\infosubsection        tex-src/texinfo.tex     
/^\\def\\infosubsection{\\parsearg\\subsectionzzz}$/
+\infosubsubsection     tex-src/texinfo.tex     
/^\\def\\infosubsubsection{\\parsearg\\subsubsectionzzz}/
+\infotop       tex-src/texinfo.tex     
/^\\def\\infotop{\\parsearg\\unnumberedzzz}$/
+\infounnumbered        tex-src/texinfo.tex     
/^\\def\\infounnumbered{\\parsearg\\unnumberedzzz}$/
+\infounnumberedsec     tex-src/texinfo.tex     
/^\\def\\infounnumberedsec{\\parsearg\\unnumberedseczzz}/
+\infounnumberedsubsec  tex-src/texinfo.tex     
/^\\def\\infounnumberedsubsec{\\parsearg\\unnumberedsubs/
+\infounnumberedsubsubsec       tex-src/texinfo.tex     
/^\\def\\infounnumberedsubsubsec{\\parsearg\\unnumbereds/
+\initial       tex-src/texinfo.tex     /^\\def\\initial #1{%$/
+\internalBitem tex-src/texinfo.tex     /^\\def\\internalBitem{\\smallbreak 
\\parsearg\\itemzzz}$/
+\internalBitemx        tex-src/texinfo.tex     /^\\def\\internalBitemx{\\par 
\\parsearg\\itemzzz}$/
+\internalBkitem        tex-src/texinfo.tex     
/^\\def\\internalBkitem{\\smallbreak \\parsearg\\kitemzzz/
+\internalBkitemx       tex-src/texinfo.tex     /^\\def\\internalBkitemx{\\par 
\\parsearg\\kitemzzz}$/
+\internalBxitem        tex-src/texinfo.tex     /^\\def\\internalBxitem 
"#1"{\\def\\xitemsubtopix{#1} \\s/
+\internalBxitemx       tex-src/texinfo.tex     /^\\def\\internalBxitemx 
"#1"{\\def\\xitemsubtopix{#1} \\/
+\internalsetq  tex-src/texinfo.tex     /^\\def\\internalsetq #1#2{'xrdef 
{#1}{\\csname #2\\endc/
+\item  tex-src/texinfo.tex     /address@hidden while not in a table}}/
+\itemcontents  tex-src/texinfo.tex     /^\\def\\itemcontents{#1}%$/
+\itemfont      tex-src/texinfo.tex     /^\\def\\itemfont{#2}%$/
+\itemize       tex-src/texinfo.tex     
/^\\def\\itemize{\\parsearg\\itemizezzz}$/
+\itemizeitem   tex-src/texinfo.tex     /^\\def\\itemizeitem{%$/
+\itemizey      tex-src/texinfo.tex     /^\\def\\itemizey #1#2{%$/
+\itemizezzz    tex-src/texinfo.tex     /^\\def\\itemizezzz #1{%$/
+\itemx tex-src/texinfo.tex     /address@hidden while not in a table/
+\itemzzz       tex-src/texinfo.tex     /^\\def\\itemzzz #1{\\begingroup %$/
+\kbd   tex-src/texinfo.tex     
/^\\def\\kbd#1{\\def\\look{#1}\\expandafter\\kbdfoo\\look??/
+\kbd   tex-src/texinfo.tex     /^\\def\\kbd##1{\\realbackslash kbd {##1}}%$/
+\kbd   tex-src/texinfo.tex     /^\\def\\kbd##1{\\realbackslash kbd {##1}}$/
+\kbdfoo        tex-src/texinfo.tex     
/^\\def\\kbdfoo#1#2#3\\par{\\def\\one{#1}\\def\\three{#3}\\d/
+\key   tex-src/texinfo.tex     /^\\def\\key #1{{\\tt 
\\exhyphenpenalty=10000\\uppercase{/
+\key   tex-src/texinfo.tex     /^\\def\\key##1{\\realbackslash key {##1}}%$/
+\key   tex-src/texinfo.tex     /^\\def\\key##1{\\realbackslash key {##1}}$/
+\kindex        tex-src/texinfo.tex     /^\\def\\kindex {\\kyindex}$/
+\kitem tex-src/texinfo.tex     /address@hidden while not in a table/
+\kitemx        tex-src/texinfo.tex     /address@hidden while not in a tab/
+\kitemzzz      tex-src/texinfo.tex     /^\\def\\kitemzzz #1{\\dosubind 
{kw}{\\code{#1}}{for {\\b/
+\l     tex-src/texinfo.tex     /^\\def\\l#1{{\\li #1}\\null}           % $/
+\labelspace    tex-src/texinfo.tex     /^\\def\\labelspace{\\hskip1em 
\\relax}$/
+\lbrb  tex-src/texinfo.tex     /^\\def\\lbrb{{\\bf\\char`\\[}} 
\\def\\rbrb{{\\bf\\char`\\]}}$/
+\less  tex-src/texinfo.tex     /^\\def\\less{\\realbackslash less}%$/
+\less  tex-src/texinfo.tex     /^\\def\\less{\\realbackslash less}$/
+\linenumber    tex-src/texinfo.tex     /^  
\\def\\linenumber{\\the\\inputlineno:\\space}$/
+\lisp  tex-src/texinfo.tex     /^\\def\\lisp{\\aboveenvbreak$/
+\loggingall    tex-src/texinfo.tex     /^\\def\\loggingall{\\tracingcommands2 
\\tracingstats2 $/
+\losespace     tex-src/texinfo.tex     /^\\def\\losespace #1{#1}$/
+\lowercaseenumerate    tex-src/texinfo.tex     /^\\def\\lowercaseenumerate{%$/
+\lvvmode       tex-src/texinfo.tex     /^\\def\\lvvmode{\\vbox to 0pt{}}$/
+\majorheading  tex-src/texinfo.tex     
/^\\def\\majorheading{\\parsearg\\majorheadingzzz}$/
+\majorheadingzzz       tex-src/texinfo.tex     /^\\def\\majorheadingzzz #1{%$/
+\math  tex-src/texinfo.tex     /^\\def\\math#1{\\implicitmath 
#1\\implicitmath}$/
+\menu  tex-src/texinfo.tex     /^\\long\\def\\menu #1\\end menu{}$/
+\minus tex-src/texinfo.tex     /^\\def\\minus{$-$}$/
+\mylbrace      tex-src/texinfo.tex     /^\\def\\mylbrace {{\\tt \\char '173}}$/
+\myrbrace      tex-src/texinfo.tex     /^\\def\\myrbrace {{\\tt \\char '175}}$/
+\need  tex-src/texinfo.tex     /^\\def\\need{\\parsearg\\needx}$/
+\needx tex-src/texinfo.tex     /^\\def\\needx#1{%$/
+\newcodeindex  tex-src/texinfo.tex     /^\\def\\newcodeindex #1{$/
+\newindex      tex-src/texinfo.tex     /^\\def\\newindex #1{$/
+\next  tex-src/texinfo.tex     /^\\def\\next##1{}\\next}$/
+\next  tex-src/texinfo.tex     /^\\def\\next##1{}\\next}$/
+\next  tex-src/texinfo.tex     /^\\def\\next##1{}\\next}$/
+\next  tex-src/texinfo.tex     /^\\def\\next##1{}\\next}$/
+\next  tex-src/texinfo.tex     /^\\def\\next##1{}\\next}$/
+\next  tex-src/texinfo.tex     /^\\def\\next##1{}\\next}$/
+\nm    tex-src/testenv.tex     
/^\\newcommand{\\nm}[2]{\\nomenclature{#1}{#2}}$/
+\node  tex-src/texinfo.tex     /^\\def\\node{\\ENVcheck\\parsearg\\nodezzz}$/
+\nodexxx[      tex-src/texinfo.tex     
/^\\def\\nodexxx[#1,#2]{\\gdef\\lastnode{#1}}$/
+\nodezzz       tex-src/texinfo.tex     /^\\def\\nodezzz#1{\\nodexxx [#1,]}$/
+\nofillexdent  tex-src/texinfo.tex     
/^\\def\\nofillexdent{\\parsearg\\nofillexdentyyy}$/
+\nofillexdentyyy       tex-src/texinfo.tex     /^\\def\\nofillexdentyyy 
#1{{\\advance \\leftskip by -\\e/
+\normalbackslash       tex-src/texinfo.tex     
/^\\def\\normalbackslash{{\\tt\\rawbackslashxx}}$/
+\normalcaret   tex-src/texinfo.tex     /^\\def\\normalcaret{^}$/
+\normaldoublequote     tex-src/texinfo.tex     /^\\def\\normaldoublequote{"}$/
+\normalgreater tex-src/texinfo.tex     /^\\def\\normalgreater{>}$/
+\normalless    tex-src/texinfo.tex     /^\\def\\normalless{<}$/
+\normalplus    tex-src/texinfo.tex     /^\\def\\normalplus{+}$/
+\normaltilde   tex-src/texinfo.tex     /^\\def\\normaltilde{~}$/
+\normalunderscore      tex-src/texinfo.tex     /^\\def\\normalunderscore{_}$/
+\normalverticalbar     tex-src/texinfo.tex     /^\\def\\normalverticalbar{|}$/
+\nsbot tex-src/texinfo.tex     /^\\def\\nsbot{\\vbox$/
+\nstop tex-src/texinfo.tex     /^\\def\\nstop{\\vbox$/
+\numberedsec   tex-src/texinfo.tex     
/^\\outer\\def\\numberedsec{\\parsearg\\seczzz}$/
+\numberedsubsec        tex-src/texinfo.tex     
/^\\outer\\def\\numberedsubsec{\\parsearg\\numberedsubsec/
+\numberedsubseczzz     tex-src/texinfo.tex     /^\\def\\numberedsubseczzz 
#1{\\seccheck{subsection}%$/
+\numberedsubsubsec     tex-src/texinfo.tex     
/^\\outer\\def\\numberedsubsubsec{\\parsearg\\numberedsub/
+\numberedsubsubseczzz  tex-src/texinfo.tex     /^\\def\\numberedsubsubseczzz 
#1{\\seccheck{subsubsecti/
+\numericenumerate      tex-src/texinfo.tex     /^\\def\\numericenumerate{%$/
+\oddfooting    tex-src/texinfo.tex     
/^\\def\\oddfooting{\\parsearg\\oddfootingxxx}$/
+\oddheading    tex-src/texinfo.tex     
/^\\def\\oddheading{\\parsearg\\oddheadingxxx}$/
+\onepageout    tex-src/texinfo.tex     
/^\\def\\onepageout#1{\\hoffset=\\normaloffset$/
+\opencontents  tex-src/texinfo.tex     /^\\def\\opencontents{\\openout 
\\contentsfile = \\jobnam/
+\openindices   tex-src/texinfo.tex     /^\\def\\openindices{%$/
+\opnr  tex-src/texinfo.tex     /^\\def\\opnr{{\\sf\\char`\\(}} 
\\def\\clnr{{\\sf\\char`\\)}} /
+\page  tex-src/texinfo.tex     /^\\def\\page{\\par\\vfill\\supereject}$/
+\page  tex-src/texinfo.tex     /^   \\def\\page{%$/
+\pagebody      tex-src/texinfo.tex     /^\\def\\pagebody#1{\\vbox 
to\\pageheight{\\boxmaxdepth=\\/
+\pagesofar     tex-src/texinfo.tex     
/^\\def\\pagesofar{\\unvbox\\partialpage %$/
+\parsearg      tex-src/texinfo.tex     /^\\def\\parsearg 
#1{\\let\\next=#1\\begingroup\\obeylines/
+\parseargline  tex-src/texinfo.tex     /^\\def\\parseargline{\\begingroup 
\\obeylines \\parsearg/
+\parseargx     tex-src/texinfo.tex     /^\\def\\parseargx{%$/
+\pindex        tex-src/texinfo.tex     /^\\def\\pindex {\\pgindex}$/
+\plainsecheading       tex-src/texinfo.tex     /^\\def\\plainsecheading 
#1{\\secheadingi {#1}}$/
+\point tex-src/texinfo.tex     /^\\def\\point{$\\star$}$/
+\primary       tex-src/texinfo.tex     /^\\def\\primary #1{\\line{#1\\hfil}}$/
+\print tex-src/texinfo.tex     /^\\def\\print{\\realbackslash print}$/
+\print tex-src/texinfo.tex     /^\\def\\print{\\leavevmode\\lower.1ex\\hbox to 
1em{\\hfil/
+\printedmanual tex-src/texinfo.tex     /^\\def\\printedmanual{\\ignorespaces 
#5}%$/
+\printedmanual tex-src/texinfo.tex     /^section ``\\printednodename'' in 
\\cite{\\printedmanu/
+\printednodename       tex-src/texinfo.tex     
/^\\def\\printednodename{\\ignorespaces #3}%$/
+\printednodename       tex-src/texinfo.tex     
/^\\def\\printednodename{\\ignorespaces #1}%$/
+\printindex    tex-src/texinfo.tex     
/^\\def\\printindex{\\parsearg\\doprintindex}$/
+\pxref tex-src/texinfo.tex     /^\\def\\pxref#1{see \\xrefX[#1,,,,,,,]}$/
+\quotation     tex-src/texinfo.tex     /^\\def\\quotation{%$/
+\r     tex-src/texinfo.tex     /^\\def\\r#1{{\\rm #1}}         % roman font$/
+\r     tex-src/texinfo.tex     /^\\def\\r##1{\\realbackslash r {##1}}%$/
+\r     tex-src/texinfo.tex     /^\\def\\r##1{\\realbackslash r {##1}}$/
+\rawbackslashxx        tex-src/texinfo.tex     
/^\\def\\rawbackslashxx{\\indexbackslash}% \\indexbacksl/
+\rawbackslashxx        tex-src/texinfo.tex     
/^\\def\\rawbackslashxx{\\indexbackslash}%$/
+\readauxfile   tex-src/texinfo.tex     /^\\def\\readauxfile{%$/
+\ref   tex-src/texinfo.tex     /^\\def\\ref#1{\\xrefX[#1,,,,,,,]}$/
+\refx  tex-src/texinfo.tex     /^\\def\\refx#1#2{%$/
+\resetmathfonts        tex-src/texinfo.tex     /^\\def\\resetmathfonts{%$/
+\result        tex-src/texinfo.tex     /^\\def\\result{\\realbackslash 
result}$/
+\result        tex-src/texinfo.tex     
/^\\def\\result{\\leavevmode\\raise.15ex\\hbox to 1em{\\hf/
+\rm    tex-src/texinfo.tex     /^\\def\\rm{\\realbackslash rm }%$/
+\samp  tex-src/texinfo.tex     /^\\def\\samp #1{`\\tclose{#1}'\\null}$/
+\samp  tex-src/texinfo.tex     /^\\def\\samp##1{\\realbackslash samp {##1}}%$/
+\samp  tex-src/texinfo.tex     /^\\def\\samp##1{\\realbackslash samp {##1}}$/
+\sc    tex-src/texinfo.tex     /^\\def\\sc#1{{\\smallcaps#1}}  % smallcaps 
font$/
+\seccheck      tex-src/texinfo.tex     /^\\def\\seccheck#1{\\if \\pageno<0 %$/
+\secentry      tex-src/texinfo.tex     /^      \\def\\secentry ##1##2##3##4{}$/
+\secentry      tex-src/texinfo.tex     
/^\\def\\secentry#1#2#3#4{\\dosecentry{#2.#3\\labelspace/
+\secentryfonts tex-src/texinfo.tex     /^\\def\\secentryfonts{\\textfonts}$/
+\secfonts      tex-src/texinfo.tex     /^\\def\\secfonts{%$/
+\secheading    tex-src/texinfo.tex     /^\\def\\secheading 
#1#2#3{\\secheadingi {#2.#3\\enspace/
+\secheadingbreak       tex-src/texinfo.tex     
/^\\def\\secheadingbreak{\\dobreak \\secheadingskip {-10/
+\secheadingi   tex-src/texinfo.tex     /^\\def\\secheadingi #1{{\\advance 
\\secheadingskip by \\/
+\secondary     tex-src/texinfo.tex     /^\\def\\secondary #1#2{$/
+\seczzz        tex-src/texinfo.tex     /^\\def\\seczzz 
#1{\\seccheck{section}%$/
+\set   tex-src/texinfo.tex     /^\\def\\set{\\parsearg\\setxxx}$/
+\setchapternewpage     tex-src/texinfo.tex     /^\\def\\setchapternewpage #1 
{\\csname CHAPPAG#1\\endcs/
+\setchapterstyle       tex-src/texinfo.tex     /^\\def\\setchapterstyle #1 
{\\csname CHAPF#1\\endcsname/
+\setdeffont    tex-src/texinfo.tex     /^\\def\\setdeffont #1 {\\csname 
DEF#1\\endcsname}$/
+\setfilename   tex-src/texinfo.tex     /^\\def\\setfilename{%$/
+\setref        tex-src/texinfo.tex     /^\\def\\setref#1{%$/
+\settitle      tex-src/texinfo.tex     
/^\\def\\settitle{\\parsearg\\settitlezzz}$/
+\settitlezzz   tex-src/texinfo.tex     /^\\def\\settitlezzz 
#1{\\gdef\\thistitle{#1}}$/
+\setxxx        tex-src/texinfo.tex     /^\\def\\setxxx #1{$/
+\sf    tex-src/texinfo.tex     /^\\def\\sf{\\fam=\\sffam \\tensf}$/
+\sf    tex-src/texinfo.tex     /^\\def\\sf{\\realbackslash sf}%$/
+\shortchapentry        tex-src/texinfo.tex     
/^\\def\\shortchapentry#1#2#3{%$/
+\shortunnumberedentry  tex-src/texinfo.tex     
/^\\def\\shortunnumberedentry#1#2{%$/
+\singlecodeindexer     tex-src/texinfo.tex     /^\\def\\singlecodeindexer 
#1{\\doind{\\indexname}{\\code/
+\singleindexer tex-src/texinfo.tex     /^\\def\\singleindexer 
#1{\\doind{\\indexname}{#1}}$/
+\singlespace   tex-src/texinfo.tex     /^\\def\\singlespace{%$/
+\sl    tex-src/texinfo.tex     /^\\def\\sl{\\realbackslash sl }%$/
+\smallbook     tex-src/texinfo.tex     /^\\def\\smallbook{$/
+\smalllispx    tex-src/texinfo.tex     
/^\\def\\smalllispx{\\aboveenvbreak\\begingroup\\inENV$/
+\smartitalic   tex-src/texinfo.tex     /^\\def\\smartitalic#1{{\\sl 
#1}\\futurelet\\next\\smartit/
+\smartitalicx  tex-src/texinfo.tex     
/^\\def\\smartitalicx{\\ifx\\next,\\else\\ifx\\next-\\else\\i/
+\sp    tex-src/texinfo.tex     /^\\def\\sp{\\parsearg\\spxxx}$/
+\splitoff      tex-src/texinfo.tex     
/^\\def\\splitoff#1#2\\endmark{\\def\\first{#1}\\def\\rest{/
+\spxxx tex-src/texinfo.tex     /^\\def\\spxxx #1{\\par \\vskip 
#1\\baselineskip}$/
+\startcontents tex-src/texinfo.tex     /^\\def\\startcontents#1{%$/
+\startenumeration      tex-src/texinfo.tex     /^\\def\\startenumeration#1{%$/
+\subheading    tex-src/texinfo.tex     
/^\\def\\subheading{\\parsearg\\subsecheadingi}$/
+\subsecentry   tex-src/texinfo.tex     /^      \\def\\subsecentry 
##1##2##3##4##5{}$/
+\subsecentry   tex-src/texinfo.tex     
/^\\def\\subsecentry#1#2#3#4#5{\\dosubsecentry{#2.#3.#4/
+\subsecfonts   tex-src/texinfo.tex     /^\\def\\subsecfonts{%$/
+\subsecheading tex-src/texinfo.tex     /^\\def\\subsecheading 
#1#2#3#4{\\subsecheadingi {#2.#3/
+\subsecheadingbreak    tex-src/texinfo.tex     
/^\\def\\subsecheadingbreak{\\dobreak \\subsecheadingski/
+\subsecheadingi        tex-src/texinfo.tex     /^\\def\\subsecheadingi 
#1{{\\advance \\subsecheadingski/
+\subsubheading tex-src/texinfo.tex     
/^\\def\\subsubheading{\\parsearg\\subsubsecheadingi}$/
+\subsubsecentry        tex-src/texinfo.tex     /^      \\def\\subsubsecentry 
##1##2##3##4##5##6{}$/
+\subsubsecentry        tex-src/texinfo.tex     
/^\\def\\subsubsecentry#1#2#3#4#5#6{%$/
+\subsubsecfonts        tex-src/texinfo.tex     
/^\\def\\subsubsecfonts{\\subsecfonts} % Maybe this sho/
+\subsubsecheading      tex-src/texinfo.tex     /^\\def\\subsubsecheading 
#1#2#3#4#5{\\subsubsecheading/
+\subsubsecheadingi     tex-src/texinfo.tex     /^\\def\\subsubsecheadingi 
#1{{\\advance \\subsecheading/
+\subtitle      tex-src/texinfo.tex     /^   
\\def\\subtitle{\\parsearg\\subtitlezzz}%$/
+\subtitlefont  tex-src/texinfo.tex     /^   \\def\\subtitlefont{\\subtitlerm 
\\normalbaselinesk/
+\subtitlezzz   tex-src/texinfo.tex     /^   
\\def\\subtitlezzz##1{{\\subtitlefont \\rightline{#/
+\summarycontents       tex-src/texinfo.tex     
/^\\outer\\def\\summarycontents{%$/
+\supereject    tex-src/texinfo.tex     /^\\def\\supereject{\\par\\penalty 
-20000\\footnoteno =0 /
+\syncodeindex  tex-src/texinfo.tex     /^\\def\\syncodeindex #1 #2 {%$/
+\synindex      tex-src/texinfo.tex     /^\\def\\synindex #1 #2 {%$/
+\t     tex-src/texinfo.tex     /^\\def\\t#1{{\\tt 
\\exhyphenpenalty=10000\\rawbackslash /
+\t     tex-src/texinfo.tex     /^\\def\\t##1{\\realbackslash r {##1}}%$/
+\table tex-src/texinfo.tex     
/^\\def\\table{\\begingroup\\inENV\\obeylines\\obeyspaces\\/
+\tablez        tex-src/texinfo.tex     /^\\def\\tablez #1#2#3#4#5#6{%$/
+\tclose        tex-src/texinfo.tex     /^\\def\\tclose#1{{\\rm 
\\tcloserm=\\fontdimen2\\font \\tt /
+\tclose        tex-src/texinfo.tex     /^\\def\\tclose##1{\\realbackslash 
tclose {##1}}%$/
+\tclose        tex-src/texinfo.tex     /^\\def\\tclose##1{\\realbackslash 
tclose {##1}}$/
+\tex   tex-src/texinfo.tex     /^\\def\\tex{\\begingroup$/
+\texinfoversion        tex-src/texinfo.tex     /^\\def\\texinfoversion{2.73}$/
+\textfonts     tex-src/texinfo.tex     /^\\def\\textfonts{%$/
+\thearg        tex-src/texinfo.tex     /^  \\def\\thearg{#1}%$/
+\thearg        tex-src/texinfo.tex     /^  \\ifx\\thearg\\empty 
\\def\\thearg{1}\\fi$/
+\thischapter   tex-src/texinfo.tex     /^\\def\\thischapter{} 
\\def\\thissection{}$/
+\thischapter   tex-src/texinfo.tex     /^   
\\unnumbchapmacro{#1}\\def\\thischapter{}%$/
+\thischaptername       tex-src/texinfo.tex     /^\\def\\thischaptername{No 
Chapter Title}$/
+\thisfile      tex-src/texinfo.tex     /^\\def\\thisfile{}$/
+\thistitle     tex-src/texinfo.tex     /^\\def\\thistitle{No Title}$/
+\tie   tex-src/texinfo.tex     /^\\def\\tie{\\penalty 10000\\ }     % Save 
plain tex de/
+\tindex        tex-src/texinfo.tex     /^\\def\\tindex {\\tpindex}$/
+\title tex-src/texinfo.tex     /^   \\def\\title{\\parsearg\\titlezzz}%$/
+\titlefont     tex-src/texinfo.tex     /^\\def\\titlefont#1{{\\titlerm #1}}$/
+\titlepage     tex-src/texinfo.tex     /^\\def\\titlepage{\\begingroup 
\\parindent=0pt \\textfon/
+\titlezzz      tex-src/texinfo.tex     /^   
\\def\\titlezzz##1{\\leftline{\\titlefont{##1}}$/
+\today tex-src/texinfo.tex     /^\\def\\today{\\number\\day\\space$/
+\top   tex-src/texinfo.tex     /^\\outer\\def\\top{\\parsearg\\unnumberedzzz}$/
+\tt    tex-src/texinfo.tex     /^\\def\\tt{\\realbackslash tt}%$/
+\tt    tex-src/texinfo.tex     /^\\def\\tt{\\realbackslash tt}$/
+\turnoffactive tex-src/texinfo.tex     
/^\\def\\turnoffactive{\\let"=\\normaldoublequote$/
+\unnchfopen    tex-src/texinfo.tex     /^\\def\\unnchfopen #1{%$/
+\unnchfplain   tex-src/texinfo.tex     /^\\def\\unnchfplain #1{%$/
+\unnumbchapentry       tex-src/texinfo.tex     
/^\\def\\unnumbchapentry#1#2{\\dochapentry{#1}{#2}}$/
+\unnumbered    tex-src/texinfo.tex     
/^\\outer\\def\\unnumbered{\\parsearg\\unnumberedzzz}$/
+\unnumberedsec tex-src/texinfo.tex     
/^\\outer\\def\\unnumberedsec{\\parsearg\\unnumberedseczz/
+\unnumberedseczzz      tex-src/texinfo.tex     /^\\def\\unnumberedseczzz 
#1{\\seccheck{unnumberedsec}%/
+\unnumberedsubsec      tex-src/texinfo.tex     
/^\\outer\\def\\unnumberedsubsec{\\parsearg\\unnumberedsu/
+\unnumberedsubseczzz   tex-src/texinfo.tex     /^\\def\\unnumberedsubseczzz 
#1{\\seccheck{unnumberedsu/
+\unnumberedsubsubsec   tex-src/texinfo.tex     
/^\\outer\\def\\unnumberedsubsubsec{\\parsearg\\unnumbere/
+\unnumberedsubsubseczzz        tex-src/texinfo.tex     
/^\\def\\unnumberedsubsubseczzz #1{\\seccheck{unnumbere/
+\unnumberedzzz tex-src/texinfo.tex     /^\\def\\unnumberedzzz 
#1{\\seccheck{unnumbered}%$/
+\unnumbnoderef tex-src/texinfo.tex     
/^\\def\\unnumbnoderef{\\ifx\\lastnode\\relax\\else$/
+\unnumbsecentry        tex-src/texinfo.tex     /^      \\def\\unnumbsecentry 
##1##2{}$/
+\unnumbsecentry        tex-src/texinfo.tex     
/^\\def\\unnumbsecentry#1#2{\\dosecentry{#1}{#2}}$/
+\unnumbsetref  tex-src/texinfo.tex     /^\\def\\unnumbsetref#1{%$/
+\unnumbsubsecentry     tex-src/texinfo.tex     /^      
\\def\\unnumbsubsecentry ##1##2{}$/
+\unnumbsubsecentry     tex-src/texinfo.tex     
/^\\def\\unnumbsubsecentry#1#2{\\dosubsecentry{#1}{#2}}/
+\unnumbsubsubsecentry  tex-src/texinfo.tex     /^      
\\def\\unnumbsubsubsecentry ##1##2{}$/
+\unnumbsubsubsecentry  tex-src/texinfo.tex     
/^\\def\\unnumbsubsubsecentry#1#2{\\dosubsubsecentry{#1/
+\uppercaseenumerate    tex-src/texinfo.tex     /^\\def\\uppercaseenumerate{%$/
+\var   tex-src/texinfo.tex     /^\\def\\var##1{\\realbackslash var {##1}}%$/
+\var   tex-src/texinfo.tex     /^\\def\\var##1{\\realbackslash var {##1}}$/
+\vindex        tex-src/texinfo.tex     /^\\def\\vindex {\\vrindex}$/
+\vritemindex   tex-src/texinfo.tex     /^\\def\\vritemindex #1{\\doind 
{vr}{\\code{#1}}}%$/
+\vtable        tex-src/texinfo.tex     
/^\\def\\vtable{\\begingroup\\inENV\\obeylines\\obeyspaces/
+\w     tex-src/texinfo.tex     /^\\def\\w#1{\\leavevmode\\hbox{#1}}$/
+\w     tex-src/texinfo.tex     /^\\def\\w{\\realbackslash w }%$/
+\w     tex-src/texinfo.tex     /^\\def\\w{\\realbackslash w}$/
+\xitem tex-src/texinfo.tex     /address@hidden while not in a table/
+\xitemx        tex-src/texinfo.tex     /address@hidden while not in a tab/
+\xitemzzz      tex-src/texinfo.tex     /^\\def\\xitemzzz #1{\\dosubind 
{kw}{\\code{#1}}{for {\\b/
+\xkey  tex-src/texinfo.tex     /^\\def\\xkey{\\key}$/
+\xrdef tex-src/texinfo.tex     /^\\def\\xrdef #1#2{$/
+\xref  tex-src/texinfo.tex     /^\\def\\xref#1{See \\xrefX[#1,,,,,,,]}$/
+\xrefX[        tex-src/texinfo.tex     
/^\\def\\xrefX[#1,#2,#3,#4,#5,#6]{\\begingroup%$/
+^      tex-src/texinfo.tex     /^\\def^{{\\tt \\hat}}$/
+_      tex-src/texinfo.tex     /^\\def_{\\ifusingtt\\normalunderscore\\_}$/
+_GETOPT_H      c-src/getopt.h  19
+_GNU_SOURCE    c-src/etags.c   94
+_REGEX_H       c-src/emacs/src/regex.h 21
+_RE_SYNTAX_POSIX_COMMON        c-src/emacs/src/regex.h 221
+_Restrict_     c-src/emacs/src/regex.h 540
+_Restrict_     c-src/emacs/src/regex.h 542
+_Restrict_     c-src/emacs/src/regex.h 544
+_Restrict_arr_ c-src/emacs/src/regex.h 555
+_Restrict_arr_ c-src/emacs/src/regex.h 557
+_UCHAR_T       c-src/emacs/src/lisp.h  2423
+__COLORS       cp-src/screen.hpp       9
+__default_morecore     c-src/emacs/src/gmalloc.c       /^__default_morecore 
(ptrdiff_t increment)$/
+__init__       pyt-src/server.py       /^    def __init__(self):$/
+__init__       pyt-src/server.py       /^    def __init__(self):$/
+__init__       pyt-src/server.py       /^    def __init__(self):$/
+__init__       pyt-src/server.py       /^    def __init__(self, Master, text, 
textvar, widt/
+__init__       pyt-src/server.py       /^    def __init__(self, newlegend, 
list, editor, ma/
+__init__       pyt-src/server.py       /^    def __init__(self, host, 
sitelist, master=None/
+__init__       pyt-src/server.py       /^    def __init__(self, user, 
userlist, master=None/
+__init__       pyt-src/server.py       /^    def __init__(self, master=None):$/
+__ip   c.c     159
+__libc_atexit  c-src/exit.c    30
+__libc_atexit  c-src/exit.strange_suffix       30
+__malloc_extra_blocks  c-src/emacs/src/gmalloc.c       381
+__malloc_initialize    c-src/emacs/src/gmalloc.c       /^__malloc_initialize 
(void)$/
+__malloc_initialized   c-src/emacs/src/gmalloc.c       379
+__repr__       pyt-src/server.py       /^    def __repr__(self):$/
+__repr__       pyt-src/server.py       /^    def __repr__(self):$/
+__repr__       pyt-src/server.py       /^    def __repr__(self):$/
+__sbrk c-src/emacs/src/gmalloc.c       1513
+__str__        pyt-src/server.py       /^    def __str__(self):$/
+__str__        pyt-src/server.py       /^    def __str__(self):$/
+__str__        pyt-src/server.py       /^    def __str__(self):$/
+__up   c.c     160
+_aligned_blocks        c-src/emacs/src/gmalloc.c       1004
+_aligned_blocks_mutex  c-src/emacs/src/gmalloc.c       518
+_bytes_free    c-src/emacs/src/gmalloc.c       376
+_bytes_used    c-src/emacs/src/gmalloc.c       374
+_chunks_free   c-src/emacs/src/gmalloc.c       375
+_chunks_used   c-src/emacs/src/gmalloc.c       373
+_fraghead      c-src/emacs/src/gmalloc.c       370
+_free  c-src/emacs/src/gmalloc.c       /^_free (void *ptr)$/
+_free_internal c-src/emacs/src/gmalloc.c       /^_free_internal (void *ptr)$/
+_free_internal_nolock  c-src/emacs/src/gmalloc.c       /^_free_internal_nolock 
(void *ptr)$/
+_heapbase      c-src/emacs/src/gmalloc.c       355
+_heapindex     c-src/emacs/src/gmalloc.c       364
+_heapinfo      c-src/emacs/src/gmalloc.c       358
+_heaplimit     c-src/emacs/src/gmalloc.c       367
+_malloc        c-src/emacs/src/gmalloc.c       /^_malloc (size_t size)$/
+_malloc_internal       c-src/emacs/src/gmalloc.c       /^_malloc_internal 
(size_t size)$/
+_malloc_internal_nolock        c-src/emacs/src/gmalloc.c       
/^_malloc_internal_nolock (size_t size)$/
+_malloc_mutex  c-src/emacs/src/gmalloc.c       517
+_malloc_thread_enabled_p       c-src/emacs/src/gmalloc.c       519
+_realloc       c-src/emacs/src/gmalloc.c       /^_realloc (void *ptr, size_t 
size)$/
+_realloc_internal      c-src/emacs/src/gmalloc.c       /^_realloc_internal 
(void *ptr, size_t size)$/
+_realloc_internal_nolock       c-src/emacs/src/gmalloc.c       
/^_realloc_internal_nolock (void *ptr, size_t size)$/
+a      c.c     152
+a      c.c     180
+a      c.c     /^a()$/
+a      c.c     /^a ()$/
+a      c-src/h.h       40
+a      c-src/h.h       103
+a-forth-constant!      forth-src/test-forth.fth        /^99 constant 
a-forth-constant!$/
+a-forth-value? forth-src/test-forth.fth        /^55 value a-forth-value?$/
+a-forth-word   forth-src/test-forth.fth        /^: a-forth-word ( a b c -- 
a*b+c )  + * ;$/
+a-forth-word   forth-src/test-forth.fth        /^: a-forth-word ( a b c -- )$/
+a0     c-src/emacs/src/lisp.h  /^      Lisp_Object (*a0) (void);$/
+a1     c-src/emacs/src/lisp.h  /^      Lisp_Object (*a1) (Lisp_Object);$/
+a2     c-src/emacs/src/lisp.h  /^      Lisp_Object (*a2) (Lisp_Object, 
Lisp_Object)/
+a3     c-src/emacs/src/lisp.h  /^      Lisp_Object (*a3) (Lisp_Object, 
Lisp_Object,/
+a4     c-src/emacs/src/lisp.h  /^      Lisp_Object (*a4) (Lisp_Object, 
Lisp_Object,/
+a5     c-src/emacs/src/lisp.h  /^      Lisp_Object (*a5) (Lisp_Object, 
Lisp_Object,/
+a6     c-src/emacs/src/lisp.h  /^      Lisp_Object (*a6) (Lisp_Object, 
Lisp_Object,/
+a7     c-src/emacs/src/lisp.h  /^      Lisp_Object (*a7) (Lisp_Object, 
Lisp_Object,/
+a8     c-src/emacs/src/lisp.h  /^      Lisp_Object (*a8) (Lisp_Object, 
Lisp_Object,/
+aMANY  c-src/emacs/src/lisp.h  /^      Lisp_Object (*aMANY) (ptrdiff_t, 
Lisp_Object/
+aUNEVALLED     c-src/emacs/src/lisp.h  /^      Lisp_Object (*aUNEVALLED) 
(Lisp_Object args)/
+aa     c.c     269
+aa     c.c     279
+aaa    c.c     249
+aaa    c.c     269
+aaaaaa c-src/h.h       111
+abbrev-expansion       c-src/abbrev.c  /^DEFUN ("abbrev-expansion", 
Fabbrev_expansion, Sabb/
+abbrev-symbol  c-src/abbrev.c  /^DEFUN ("abbrev-symbol", Fabbrev_symbol, 
Sabbrev_sy/
+abbrev_all_caps        c-src/abbrev.c  57
+abbrevs_changed        c-src/abbrev.c  55
+abc    c-src/h.h       33
+abc    c-src/h.h       37
+abort-recursive-edit   c-src/emacs/src/keyboard.c      /^DEFUN 
("abort-recursive-edit", Fabort_recursive_ed/
+abs/f  ada-src/etags-test-for.ada      /^   function "abs"   (Right : Complex) 
return Real'/
+absolute_dirname       c-src/etags.c   /^absolute_dirname (char *file, char 
*dir)$/
+absolute_filename      c-src/etags.c   /^absolute_filename (char *file, char 
*dir)$/
+abstract_hh    cp-src/abstract.H       16
+abt    cp-src/c.C      55
+accent_key_syms        c-src/emacs/src/keyboard.c      4625
+access_keymap_keyremap c-src/emacs/src/keyboard.c      
/^access_keymap_keyremap (Lisp_Object map, Lisp_Obje/
+act    prol-src/natded.prolog  /^act(OutForm,OutSyn,Ws):-$/
+action prol-src/natded.prolog  /^action(KeyVals):-$/
+active_maps    c-src/emacs/src/keyboard.c      /^active_maps (Lisp_Object 
first_event)$/
+actout prol-src/natded.prolog  /^actout('Text',Trees):-$/
+addArchs:      objc-src/PackInsp.m     /^-(void)addArchs:(const char *)string$/
+addPOReader    php-src/lce_functions.php       /^      function 
addPOReader($d_name, &$por)$/
+add_active     prol-src/natded.prolog  /^add_active([],Cat,Goal):-$/
+add_command_key        c-src/emacs/src/keyboard.c      /^add_command_key 
(Lisp_Object key)$/
+add_edge       prol-src/natded.prolog  /^add_edge(Left,Right,Cat):-$/
+add_node       c-src/etags.c   /^add_node (node *np, node **cur_node_p)$/
+add_regex      c-src/etags.c   /^add_regex (char *regexp_pattern, language 
*lang)$/
+add_user_signal        c-src/emacs/src/keyboard.c      /^add_user_signal (int 
sig, const char *name)$/
+addnoise       html-src/algrthms.html  /^Adding Noise to the$/
+address        cccp.y  114
+address        y-src/cccp.y    113
+adjust_point_for_property      c-src/emacs/src/keyboard.c      
/^adjust_point_for_property (ptrdiff_t last_pt, bool/
+agent  cp-src/clheir.hpp       75
+agent::move    cp-src/clheir.cpp       /^void agent::move(int direction)$/
+agent::where   cp-src/clheir.hpp       77
+algorithms     html-src/algrthms.html  /^Description$/
+alias  c-src/emacs/src/lisp.h  688
+align  c-src/emacs/src/gmalloc.c       /^align (size_t size)$/
+alignas        c-src/emacs/src/lisp.h  /^# define alignas(alignment) \/* empty 
*\/$/
+aligned        c-src/emacs/src/gmalloc.c       199
+aligned_alloc  c-src/emacs/src/gmalloc.c       71
+aligned_alloc  c-src/emacs/src/gmalloc.c       /^aligned_alloc (size_t 
alignment, size_t size)$/
+aligned_alloc  c-src/emacs/src/gmalloc.c       1718
+alignlist      c-src/emacs/src/gmalloc.c       196
+all_kboards    c-src/emacs/src/keyboard.c      86
+allocate_kboard        c-src/emacs/src/keyboard.c      /^allocate_kboard 
(Lisp_Object type)$/
+allocated      c-src/emacs/src/regex.h 344
+an_extern_linkage      c-src/h.h       44
+an_extern_linkage      c-src/h.h       56
+an_extern_linkage_ptr  c-src/h.h       43
+analyze_regex  c-src/etags.c   /^analyze_regex (char *regex_arg)$/
+andkeyvalseq   prol-src/natded.prolog  /^andkeyvalseq(KeyVals) --> ['&'], 
keyvalseq(KeyVals/
+animals        c-src/h.h       81
+animals        cp-src/c.C      126
+any_kboard_state       c-src/emacs/src/keyboard.c      /^any_kboard_state ()$/
+appDidInit:    objcpp-src/SimpleCalc.M /^- appDidInit:sender$/
+append erl-src/lines.erl       /^append(Line, {L, List}) when list(List), L < 
?BREA/
+append erl-src/lists.erl       /^append(X,Y) -> erlang:append(X, Y).  %% A BIF 
at l/
+append prol-src/natded.prolog  /^append([],Xs,Xs).$/
+appendToDisplay:       objcpp-src/SimpleCalc.M /^- appendToDisplay:(const char 
*)theDigit$/
+append_list    prol-src/natded.prolog  /^append_list([],[]).$/
+append_string  pas-src/common.pas      /^procedure append_string;(*($/
+append_tool_bar_item   c-src/emacs/src/keyboard.c      /^append_tool_bar_item 
(void)$/
+appendix       perl-src/htlmify-cystic 24
+appendix_name  perl-src/htlmify-cystic 13
+appendix_toc   perl-src/htlmify-cystic 16
+apply_modifiers        c-src/emacs/src/keyboard.c      /^apply_modifiers (int 
modifiers, Lisp_Object base)$/
+apply_modifiers_uncached       c-src/emacs/src/keyboard.c      
/^apply_modifiers_uncached (int modifiers, char *bas/
+aref_addr      c-src/emacs/src/lisp.h  /^aref_addr (Lisp_Object array, 
ptrdiff_t idx)$/
+arg    c-src/h.h       13
+arg_type       c-src/etags.c   250
+arglist        cccp.y  41
+arglist        y-src/cccp.y    41
+argno  cccp.y  45
+argno  y-src/cccp.y    45
+args   c-src/h.h       30
+argsindent     tex-src/texinfo.tex     /^\\newskip\\defargsindent 
\\defargsindent=50pt$/
+argsindent     tex-src/texinfo.tex     /^\\dimen1=\\hsize \\advance \\dimen1 
by -\\defargsindent/
+argsindent     tex-src/texinfo.tex     /^\\parshape 2 0in \\dimen0 
\\defargsindent \\dimen1    /
+argument       c-src/etags.c   253
+argvals        prol-src/natded.prolog  /^argvals([]) --> [].$/
+array  c.c     190
+ascii  c-src/emacs/src/lisp.h  1598
+asort  cp-src/functions.cpp    /^void asort(int *a, int num){$/
+assemby-code-word      forth-src/test-forth.fth        /^code 
assemby-code-word ( dunno what it does )$/
+assert c-src/etags.c   135
+assert c-src/etags.c   /^# define assert(x) ((void) 0)$/
+at_end c-src/etags.c   249
+at_filename    c-src/etags.c   247
+at_language    c-src/etags.c   245
+at_least_one_member    prol-src/natded.prolog  
/^at_least_one_member(X,[X|_]):-!.$/
+at_regexp      c-src/etags.c   246
+at_stdin       c-src/etags.c   248
+atom   prol-src/natded.prolog  /^atom(X) --> [X], {atomic(X)}.$/
+atomval        prol-src/natded.prolog  /^atomval(X) --> atom(X).$/
+aultparindent  tex-src/texinfo.tex     /^\\newdimen\\defaultparindent 
\\defaultparindent = 15p/
+aultparindent  tex-src/texinfo.tex     /^\\parindent = \\defaultparindent$/
+aultparindent\hang\textindent  tex-src/texinfo.tex     
/^\\footstrut\\parindent=\\defaultparindent\\hang\\textin/
+auto_help      c-src/etags.c   699
+b      c.c     180
+b      c.c     259
+b      c.c     260
+b      c.c     262
+b      c.c     /^b ()$/
+b      c-src/h.h       41
+b      c-src/h.h       103
+b      c-src/h.h       104
+backslash=0    tex-src/texinfo.tex     /^\\let\\indexbackslash=0  %overridden 
during \\printin/
+balance_left   erl-src/lines.erl       /^balance_left(N_Tot, $/
+balance_right  erl-src/lines.erl       /^balance_right(N_Tot, $/
+bar    c-src//c.c      /^void bar() {while(0) {}}$/
+bar    c.c     143
+bar    c-src/h.h       19
+bas_syn        prol-src/natded.prolog  /^bas_syn(n(_)).$/
+base   c-src/emacs/src/lisp.h  2188
+base   cp-src/c.C      /^double base (void) const { return rng_base;  }$/
+basetype       cp-src/cfront.H 323
+basetype::b_bits       cp-src/cfront.H 341
+basetype::b_const      cp-src/cfront.H 335
+basetype::b_field      cp-src/cfront.H 346
+basetype::b_fieldtype  cp-src/cfront.H 348
+basetype::b_inline     cp-src/cfront.H 337
+basetype::b_long       cp-src/cfront.H 340
+basetype::b_name       cp-src/cfront.H 344
+basetype::b_offset     cp-src/cfront.H 342
+basetype::b_short      cp-src/cfront.H 339
+basetype::b_sto        cp-src/cfront.H 343
+basetype::b_table      cp-src/cfront.H 345
+basetype::b_typedef    cp-src/cfront.H 336
+basetype::b_unsigned   cp-src/cfront.H 334
+basetype::b_virtual    cp-src/cfront.H 338
+basetype::b_xname      cp-src/cfront.H 347
+bb     c.c     275
+bbb    c.c     251
+bbbbbb c-src/h.h       113
+been_warned    c-src/etags.c   222
+before_command_echo_length     c-src/emacs/src/keyboard.c      130
+before_command_key_count       c-src/emacs/src/keyboard.c      129
+begtoken       c-src/etags.c   /^#define       begtoken(c)     (_btk[CHAR 
(c)]) \/* c can star/
+behaviour_info erl-src/gs_dialog.erl   /^behaviour_info(callbacks) ->$/
+bf=cmbx10      tex-src/texinfo.tex     /^\\font\\defbf=cmbx10 scaled 
\\magstep1 %was 1314$/
+bind   pyt-src/server.py       /^    def bind(self, key, action):$/
+bind_polling_period    c-src/emacs/src/keyboard.c      /^bind_polling_period 
(int n)$/
+bits_word      c-src/emacs/src/lisp.h  123
+bits_word      c-src/emacs/src/lisp.h  127
+bla    c.c     /^int bla ()$/
+blah   tex-src/testenv.tex     /^\\section{blah}$/
+bletch el-src/TAGTEST.EL       /^(foo::defmumble bletch beuarghh)$/
+block  cp-src/cfront.H 694
+block::block   cp-src/cfront.H /^      block(loc ll, Pname nn, Pstmt ss) : 
(BLOCK,ll,ss)/
+blv    c-src/emacs/src/lisp.h  689
+blv_found      c-src/emacs/src/lisp.h  /^blv_found (struct 
Lisp_Buffer_Local_Value *blv)$/
+bodyindent     tex-src/texinfo.tex     /^\\newskip\\defbodyindent 
\\defbodyindent=.4in$/
+bodyindent     tex-src/texinfo.tex     /^\\advance\\dimen2 by 
-\\defbodyindent$/
+bodyindent     tex-src/texinfo.tex     /^\\advance\\dimen3 by 
-\\defbodyindent$/
+bodyindent     tex-src/texinfo.tex     /^\\advance\\leftskip by 
-\\defbodyindent$/
+bodyindent     tex-src/texinfo.tex     /^\\exdentamount=\\defbodyindent$/
+bodyindent     tex-src/texinfo.tex     /^\\advance\\leftskip by 
\\defbodyindent \\advance \\righ/
+bodyindent     tex-src/texinfo.tex     /^\\exdentamount=\\defbodyindent$/
+bodyindent     tex-src/texinfo.tex     /^\\advance\\leftskip by 
\\defbodyindent \\advance \\righ/
+bodyindent     tex-src/texinfo.tex     /^\\exdentamount=\\defbodyindent$/
+bodyindent     tex-src/texinfo.tex     /^\\advance\\leftskip by 
\\defbodyindent \\advance \\righ/
+bodyindent     tex-src/texinfo.tex     /^\\exdentamount=\\defbodyindent$/
+bodyindent     tex-src/texinfo.tex     /^\\advance\\leftskip by 
\\defbodyindent \\advance \\righ/
+bodyindent     tex-src/texinfo.tex     /^\\exdentamount=\\defbodyindent$/
+bodyindent     tex-src/texinfo.tex     /^\\advance\\leftskip by 
\\defbodyindent \\advance \\righ/
+bodyindent     tex-src/texinfo.tex     /^\\exdentamount=\\defbodyindent$/
+bodyindent     tex-src/texinfo.tex     /^\\advance\\leftskip by 
\\defbodyindent \\advance \\righ/
+bodyindent     tex-src/texinfo.tex     /^\\exdentamount=\\defbodyindent$/
+bool   c.c     222
+bool_header_size       c-src/emacs/src/lisp.h  1472
+bool_vector_bitref     c-src/emacs/src/lisp.h  /^bool_vector_bitref 
(Lisp_Object a, EMACS_INT i)$/
+bool_vector_bytes      c-src/emacs/src/lisp.h  /^bool_vector_bytes (EMACS_INT 
size)$/
+bool_vector_data       c-src/emacs/src/lisp.h  /^bool_vector_data (Lisp_Object 
a)$/
+bool_vector_ref        c-src/emacs/src/lisp.h  /^bool_vector_ref (Lisp_Object 
a, EMACS_INT i)$/
+bool_vector_set        c-src/emacs/src/lisp.h  /^bool_vector_set (Lisp_Object 
a, EMACS_INT i, bool /
+bool_vector_size       c-src/emacs/src/lisp.h  /^bool_vector_size (Lisp_Object 
a)$/
+bool_vector_uchar_data c-src/emacs/src/lisp.h  /^bool_vector_uchar_data 
(Lisp_Object a)$/
+bool_vector_words      c-src/emacs/src/lisp.h  /^bool_vector_words (EMACS_INT 
size)$/
+boolvar        c-src/emacs/src/lisp.h  2287
+bracelev       c-src/etags.c   2520
+bsp_DevId      c-src/h.h       25
+btowc  c-src/emacs/src/regex.h /^# define btowc(c) c$/
+buffer c-src/etags.c   238
+buffer c-src/emacs/src/regex.h 341
+buffer c-src/h.h       119
+build  prol-src/natded.prolog  /^build([],Left,Left).$/
+build_pure_c_string    c-src/emacs/src/lisp.h  /^build_pure_c_string (const 
char *str)$/
+build_string   c-src/emacs/src/lisp.h  /^build_string (const char *str)$/
+buildact       prol-src/natded.prolog  /^buildact([SynIn],Right,RightPlus1):-$/
+builtin_lisp_symbol    c-src/emacs/src/lisp.h  /^builtin_lisp_symbol (int 
index)$/
+burst  c-src/h.h       28
+busy   c-src/emacs/src/gmalloc.c       158
+button_down_location   c-src/emacs/src/keyboard.c      5210
+button_down_time       c-src/emacs/src/keyboard.c      5218
+byte_stack     c-src/emacs/src/lisp.h  3049
+bytecode_dest  c-src/emacs/src/lisp.h  3037
+bytecode_top   c-src/emacs/src/lisp.h  3036
+bytes_free     c-src/emacs/src/gmalloc.c       314
+bytes_total    c-src/emacs/src/gmalloc.c       310
+bytes_used     c-src/emacs/src/gmalloc.c       312
+c      c.c     180
+c      c-src/h.h       /^#define c() d$/
+c      c-src/h.h       106
+c      make-src/Makefile       222
+c_ext  c-src/etags.c   2271
+caccacacca     c.c     /^caccacacca (a,b,c,d,e,f,g)$/
+cacheLRUEntry_s        c.c     172
+cacheLRUEntry_t        c.c     177
+call   cp-src/cfront.H 535
+call::call     cp-src/cfront.H /^      call(Pexpr aa, Pexpr bb) : (CALL,aa,bb) 
{ this=0;/
+calloc c-src/emacs/src/gmalloc.c       66
+calloc c-src/emacs/src/gmalloc.c       70
+calloc c-src/emacs/src/gmalloc.c       /^calloc (size_t nmemb, size_t size)$/
+calloc c-src/emacs/src/gmalloc.c       1717
+can_be_null    c-src/emacs/src/regex.h 370
+cancel_echoing c-src/emacs/src/keyboard.c      /^cancel_echoing (void)$/
+canonicalize_filename  c-src/etags.c   /^canonicalize_filename (register char 
*fn)$/
+case_Lisp_Int  c-src/emacs/src/lisp.h  438
+cat    c-src/h.h       81
+cat    prol-src/natded.prolog  /^cat(A, address@hidden, Ass3, Qs3, 
tree(fe,A:address@hidden/
+cat_atoms      prol-src/natded.prolog  /^cat_atoms(A1,A2,A3):-$/
+cccccccccc     c-src/h.h       115
+cdiff  Makefile        /^cdiff: CTAGS.good CTAGS ${infiles}$/
+cdr    c-src/emacs/src/lisp.h  1159
+cell   y-src/parse.y   278
+cgrep  html-src/software.html  /^cgrep$/
+chain  c-src/emacs/src/lisp.h  1162
+chain  c-src/emacs/src/lisp.h  2396
+char_bits      c-src/emacs/src/lisp.h  2443
+char_table_specials    c-src/emacs/src/lisp.h  1692
+charset_unibyte        c-src/emacs/src/regex.h 410
+chartonmstr    pas-src/common.pas      /^function chartonmstr; (*($/
+check  Makefile        /^check:$/
+checkQuotation php-src/lce_functions.php       /^      function 
checkQuotation($str)$/
+check_cons_list        c-src/emacs/src/lisp.h  /^#  define check_cons_list() 
lisp_h_check_cons_list/
+checkhdr       c-src/emacs/src/gmalloc.c       /^checkhdr (const struct hdr 
*hdr)$/
+checkiso       html-src/software.html  /^checkiso$/
+childDidExit   objc-src/Subprocess.m   /^- childDidExit$/
+chunks_free    c-src/emacs/src/gmalloc.c       313
+chunks_used    c-src/emacs/src/gmalloc.c       311
+cjava  c-src/etags.c   2936
+classdef       cp-src/cfront.H 278
+classdef::bit_ass      cp-src/cfront.H 283
+classdef::c_body       cp-src/cfront.H 280
+classdef::clbase       cp-src/cfront.H 286
+classdef::conv cp-src/cfront.H 299
+classdef::csu  cp-src/cfront.H 281
+classdef::friend_list  cp-src/cfront.H 292
+classdef::has_ctor     cp-src/cfront.H /^      Pname   has_ctor()      { 
return memtbl->look("_ctor",0)/
+classdef::has_dtor     cp-src/cfront.H /^      Pname   has_dtor()      { 
return memtbl->look("_dtor",0)/
+classdef::has_itor     cp-src/cfront.H /^      Pname   has_itor()      { 
return itor; }$/
+classdef::in_class     cp-src/cfront.H 295
+classdef::is_simple    cp-src/cfront.H /^      TOK     is_simple()     { 
return (csu==CLASS)?0:csu; };$/
+classdef::itor cp-src/cfront.H 298
+classdef::mem_list     cp-src/cfront.H 288
+classdef::memtbl       cp-src/cfront.H 289
+classdef::obj_align    cp-src/cfront.H 282
+classdef::obj_size     cp-src/cfront.H 290
+classdef::pubbase      cp-src/cfront.H 279
+classdef::pubdef       cp-src/cfront.H 293
+classdef::real_size    cp-src/cfront.H 291
+classdef::string       cp-src/cfront.H 287
+classdef::this_type    cp-src/cfront.H 296
+classdef::tn_list      cp-src/cfront.H 294
+classdef::virt_count   cp-src/cfront.H 284
+classdef::virt_init    cp-src/cfront.H 297
+classifyLine   php-src/lce_functions.php       /^      function 
classifyLine($line)$/
+clear-abbrev-table     c-src/abbrev.c  /^DEFUN ("clear-abbrev-table", 
Fclear_abbrev_table, /
+clear-this-command-keys        c-src/emacs/src/keyboard.c      /^DEFUN 
("clear-this-command-keys", Fclear_this_comm/
+clearAllKey:   objcpp-src/SimpleCalc.M /^- clearAllKey:sender$/
+clearKey:      objcpp-src/SimpleCalc.M /^- clearKey:sender$/
+clear_event    c-src/emacs/src/keyboard.c      /^clear_event (struct 
input_event *event)$/
+clear_input_pending    c-src/emacs/src/keyboard.c      /^clear_input_pending 
(void)$/
+clear_screen   cp-src/screen.cpp       /^void clear_screen(void)$/
+clear_waiting_for_input        c-src/emacs/src/keyboard.c      
/^clear_waiting_for_input (void)$/
+cmd_error      c-src/emacs/src/keyboard.c      /^cmd_error (Lisp_Object data)$/
+cmd_error_internal     c-src/emacs/src/keyboard.c      /^cmd_error_internal 
(Lisp_Object data, const char */
+cmpfn  c-src/emacs/src/lisp.h  /^  bool (*cmpfn) (struct hash_table_test *t, 
Lisp_O/
+cmt    prol-src/natded.prolog  /^cmt:-$/
+cname  c-src/etags.c   2519
+cno    c-src/etags.c   224
+commaargvals   prol-src/natded.prolog  /^commaargvals(Args) -->$/
+command        c-src/etags.c   187
+command-error-default-function c-src/emacs/src/keyboard.c      /^DEFUN 
("command-error-default-function", Fcommand_/
+command_loop   c-src/emacs/src/keyboard.c      /^command_loop (void)$/
+command_loop_1 c-src/emacs/src/keyboard.c      /^command_loop_1 (void)$/
+command_loop_2 c-src/emacs/src/keyboard.c      /^command_loop_2 (Lisp_Object 
ignore)$/
+command_loop_level     c-src/emacs/src/keyboard.c      195
+comment        php-src/lce_functions.php       /^      function comment($line, 
$class)$/
+compile_empty  prol-src/natded.prolog  /^compile_empty:-$/
+compile_lex    prol-src/natded.prolog  /^compile_lex(File):-$/
+complete       prol-src/natded.prolog  /^complete(Cat):-$/
+complete-tag   el-src/emacs/lisp/progmodes/etags.el    /^(defun complete-tag 
()$/
+compressor     c-src/etags.c   188
+compressors    c-src/etags.c   457
+conalgorithm   html-src/algrthms.html  /^Convolutionally$/
+concat c-src/etags.c   /^concat (const char *s1, const char *s2, const char/
+concat erl-src/lists.erl       /^concat([H|T]) ->$/
+concatenatenamestrings pas-src/common.pas      /^function 
concatenatenamestrings; (*($/
+consider_token c-src/etags.c   /^consider_token (char *str, int len, int c, 
int *c_/
+constant       c-src/h.h       29
+constant       cccp.y  113
+constant       y-src/cccp.y    112
+constant_args  c-src/h.h       27
+constype       c-src/emacs/src/lisp.h  3739
+consult_lex    prol-src/natded.prolog  /^consult_lex:-$/
+contents       c-src/emacs/src/lisp.h  1372
+contents       c-src/emacs/src/lisp.h  1600
+contents       c-src/emacs/src/lisp.h  1624
+convert_from_list      erl-src/lines.erl       /^convert_from_list(L) when 
list(L) ->$/
+convert_to_list        erl-src/lines.erl       /^convert_to_list({_, List}) 
when list(List) ->$/
+count  c-src/emacs/src/lisp.h  1863
+count  erl-src/lines.erl       /^count({N, _}) ->$/
+count_layers   lua-src/allegro.lua     /^local function count_layers (layer)$/
+count_words    c-src/tab.c     /^static int            count_words(char *str, 
char delim)$/
+cow    cp-src/c.C      127
+cplpl  c-src/etags.c   2935
+createPOEntries        php-src/lce_functions.php       /^      function 
createPOEntries()$/
+createWidgets  pyt-src/server.py       /^    def createWidgets(self, host):$/
+createWidgets  pyt-src/server.py       /^    def createWidgets(self):$/
+cstack c-src/etags.c   2523
+curlb  c-src/etags.c   2929
+curlinepos     c-src/etags.c   2931
+current-idle-time      c-src/emacs/src/keyboard.c      /^DEFUN 
("current-idle-time", Fcurrent_idle_time, Sc/
+current-input-mode     c-src/emacs/src/keyboard.c      /^DEFUN 
("current-input-mode", Fcurrent_input_mode, /
+current_kboard c-src/emacs/src/keyboard.c      85
+current_lb_is_new      c-src/etags.c   2926
+cursor_position        cp-src/screen.cpp       /^void cursor_position(void)$/
+cursor_x       cp-src/screen.cpp       15
+cursor_y       cp-src/screen.cpp       15
+d      c.c     180
+d      c-src/emacs/src/lisp.h  4673
+d      c-src/emacs/src/lisp.h  4679
+data   c-src/emacs/src/lisp.h  1395
+data   c-src/emacs/src/lisp.h  2129
+data   c-src/emacs/src/lisp.h  2395
+dbg    erl-src/lines.erl       /^-define(dbg(Fmt, Args), ok=io:format("~p: " 
++ Fmt/
+dcl_context    cp-src/cfront.H 739
+dcl_context::c_this    cp-src/cfront.H 740
+dcl_context::cot       cp-src/cfront.H 743
+dcl_context::ftbl      cp-src/cfront.H 744
+dcl_context::nof       cp-src/cfront.H 745
+dcl_context::not       cp-src/cfront.H 742
+dcl_context::stack     cp-src/cfront.H /^      void    stack()         { cc++; 
*cc = *(cc-1); };$/
+dcl_context::tot       cp-src/cfront.H 741
+dcl_context::unstack   cp-src/cfront.H /^      void    unstack()       { cc--; 
};$/
+ddefineseen    c-src/etags.c   2462
+debian-bug     html-src/software.html  /^debian-bug.el$/
+decimalKey:    objcpp-src/SimpleCalc.M /^- decimalKey:sender$/
+decode_timer   c-src/emacs/src/keyboard.c      /^decode_timer (Lisp_Object 
timer, struct timespec */
+def    c-src/h.h       35
+def    c-src/h.h       38
+defalt c-src/emacs/src/lisp.h  1585
+default-tags-table-function    el-src/emacs/lisp/progmodes/etags.el    
/^(defvar default-tags-table-function nil$/
+default_C_entries      c-src/etags.c   /^default_C_entries (FILE *inf)$/
+default_C_help c-src/etags.c   515
+default_C_help c-src/etags.c   523
+default_C_suffixes     c-src/etags.c   512
+defcell        c-src/emacs/src/lisp.h  2351
+define-abbrev  c-src/abbrev.c  /^DEFUN ("define-abbrev", Fdefine_abbrev, 
Sdefine_ab/
+define-abbrev-table    c-src/abbrev.c  /^DEFUN ("define-abbrev-table", 
Fdefine_abbrev_table/
+define-global-abbrev   c-src/abbrev.c  /^DEFUN ("define-global-abbrev", 
Fdefine_global_abbr/
+define-mode-abbrev     c-src/abbrev.c  /^DEFUN ("define-mode-abbrev", 
Fdefine_mode_abbrev, /
+defined_GC_CHECK_STRING_BYTES  c-src/emacs/src/lisp.h  4663
+defined_GC_CHECK_STRING_BYTES  c-src/emacs/src/lisp.h  4665
+definedef      c-src/etags.c   2464
+defun_func1    c.c     /^defun_func1()$/
+delegate       objc-src/Subprocess.m   /^- delegate$/
+delete erl-src/lines.erl       /^delete(Lno, _) when Lno < 1 ->$/
+delete erl-src/lists.erl       /^delete(Item, [Item|Rest]) ->$/
+deleteItem     pyt-src/server.py       /^    def deleteItem(self):$/
+delete_kboard  c-src/emacs/src/keyboard.c      /^delete_kboard (KBOARD *kb)$/
+delete_nth     erl-src/lines.erl       /^delete_nth(1, [H|T]) ->$/
+deliver_input_available_signal c-src/emacs/src/keyboard.c      
/^deliver_input_available_signal (int sig)$/
+deliver_interrupt_signal       c-src/emacs/src/keyboard.c      
/^deliver_interrupt_signal (int sig)$/
+deliver_user_signal    c-src/emacs/src/keyboard.c      /^deliver_user_signal 
(int sig)$/
+depth  c-src/emacs/src/lisp.h  1618
+derived_analyses       prol-src/natded.prolog  /^derived_analyses([],[]).$/
+describe_abbrev        c-src/abbrev.c  /^describe_abbrev (sym, stream)$/
+detect_input_pending   c-src/emacs/src/keyboard.c      /^detect_input_pending 
(void)$/
+detect_input_pending_ignore_squeezables        c-src/emacs/src/keyboard.c      
/^detect_input_pending_ignore_squeezables (void)$/
+detect_input_pending_run_timers        c-src/emacs/src/keyboard.c      
/^detect_input_pending_run_timers (bool do_display)$/
+dialog_loop    erl-src/gs_dialog.erl   /^dialog_loop(Module, Window, Frame, 
Extra, Args) ->/
+dignorerest    c-src/etags.c   2463
+discard-input  c-src/emacs/src/keyboard.c      /^DEFUN ("discard-input", 
Fdiscard_input, Sdiscard_i/
+discard_mouse_events   c-src/emacs/src/keyboard.c      /^discard_mouse_events 
(void)$/
+discrete_location      cp-src/clheir.hpp       56
+discrete_location::assign_neighbor     cp-src/clheir.hpp       /^    void 
assign_neighbor(int direction, location */
+discrete_location::clear_neighbors     cp-src/clheir.cpp       /^void 
discrete_location::clear_neighbors(void)$/
+discrete_location::discrete_location   cp-src/clheir.hpp       /^    
discrete_location(int xi, int yi, int zi):$/
+discrete_location::neighbors   cp-src/clheir.hpp       59
+discrete_location::x   cp-src/clheir.hpp       58
+discrete_location::y   cp-src/clheir.hpp       58
+discrete_location::z   cp-src/clheir.hpp       58
+display        cp-src/conway.cpp       /^void display(void)$/
+disposetextstring      pas-src/common.pas      /^procedure 
disposetextstring;(*($/
+dnone  c-src/etags.c   2460
+doc    c-src/emacs/src/lisp.h  1689
+dog    c-src/h.h       81
+dotfill        tex-src/texinfo.tex     /^  \\null\\nobreak\\indexdotfill % 
Have leaders before/
+dotfill        tex-src/texinfo.tex     
/^\\noindent\\hskip\\secondaryindent\\hbox{#1}\\indexdotf/
+double_click_count     c-src/emacs/src/keyboard.c      5222
+drag_n_drop_syms       c-src/emacs/src/keyboard.c      4629
+dribble        c-src/emacs/src/keyboard.c      236
+dsharpseen     c-src/etags.c   2461
+dummies        tex-src/texinfo.tex     /^{\\indexdummies % Must do this here, 
since \\bf, etc/
+dummies        tex-src/texinfo.tex     /^{\\indexdummies % Must do this here, 
since \\bf, etc/
+dummydots      tex-src/texinfo.tex     /^\\let\\dots=\\indexdummydots$/
+dummyfont      tex-src/texinfo.tex     /^\\let\\w=\\indexdummyfont$/
+dummyfont      tex-src/texinfo.tex     /^\\let\\t=\\indexdummyfont$/
+dummyfont      tex-src/texinfo.tex     /^\\let\\r=\\indexdummyfont$/
+dummyfont      tex-src/texinfo.tex     /^\\let\\i=\\indexdummyfont$/
+dummyfont      tex-src/texinfo.tex     /^\\let\\b=\\indexdummyfont$/
+dummyfont      tex-src/texinfo.tex     /^\\let\\emph=\\indexdummyfont$/
+dummyfont      tex-src/texinfo.tex     /^\\let\\strong=\\indexdummyfont$/
+dummyfont      tex-src/texinfo.tex     /^\\let\\sc=\\indexdummyfont$/
+dummyfont      tex-src/texinfo.tex     /^\\let\\tclose=\\indexdummyfont$/
+dummyfont      tex-src/texinfo.tex     /^\\let\\code=\\indexdummyfont$/
+dummyfont      tex-src/texinfo.tex     /^\\let\\file=\\indexdummyfont$/
+dummyfont      tex-src/texinfo.tex     /^\\let\\samp=\\indexdummyfont$/
+dummyfont      tex-src/texinfo.tex     /^\\let\\kbd=\\indexdummyfont$/
+dummyfont      tex-src/texinfo.tex     /^\\let\\key=\\indexdummyfont$/
+dummyfont      tex-src/texinfo.tex     /^\\let\\var=\\indexdummyfont$/
+dummytex       tex-src/texinfo.tex     /^\\let\\TeX=\\indexdummytex$/
+dump   pyt-src/server.py       /^    def dump(self, folded):$/
+duplicate      erl-src/lists.erl       /^duplicate(N, X) when integer(N), N >= 
0 -> duplica/
+ea     cp-src/cfront.H 80
+ea::ea cp-src/cfront.H /^      ea(void* pp) { p = pp; }$/
+ea::ea cp-src/cfront.H /^      ea(int ii)   { i = ii; }$/
+ea::ea cp-src/cfront.H /^      ea() {}$/
+ea::ea cp-src/cfront.H /^      ea(int i)       { x; }$/
+ea::i  cp-src/cfront.H 83
+ea::p  cp-src/cfront.H 82
+eabs   c-src/emacs/src/lisp.h  /^#define eabs(x)         ((x) < 0 ? -(x) : 
(x))$/
+eassert        c-src/emacs/src/lisp.h  /^# define eassert(cond) ((void) (false 
&& (cond))) /
+eassert        c-src/emacs/src/lisp.h  /^# define eassert(cond)                
                                \\$/
+eassume        c-src/emacs/src/lisp.h  /^# define eassume(cond) assume (cond)$/
+eassume        c-src/emacs/src/lisp.h  /^# define eassume(cond)                
                                \\$/
+eax    c-src/sysdep.h  31
+eax    c-src/sysdep.h  33
+eax    c-src/sysdep.h  33
+echo_add_key   c-src/emacs/src/keyboard.c      /^echo_add_key (Lisp_Object c)$/
+echo_char      c-src/emacs/src/keyboard.c      /^echo_char (Lisp_Object c)$/
+echo_dash      c-src/emacs/src/keyboard.c      /^echo_dash (void)$/
+echo_kboard    c-src/emacs/src/keyboard.c      166
+echo_keystrokes_p      c-src/emacs/src/keyboard.c      /^echo_keystrokes_p 
(void)$/
+echo_length    c-src/emacs/src/keyboard.c      /^echo_length (void)$/
+echo_message_buffer    c-src/emacs/src/keyboard.c      171
+echo_now       c-src/emacs/src/keyboard.c      /^echo_now (void)$/
+echo_truncate  c-src/emacs/src/keyboard.c      /^echo_truncate (ptrdiff_t 
nchars)$/
+echoing        c-src/emacs/src/keyboard.c      154
+ediff% Makefile        /^ediff%: ETAGS.good% ETAGS ${infiles}$/
+editItem       pyt-src/server.py       /^    def editItem(self):$/
+editsite       pyt-src/server.py       /^    def editsite(self, site):$/
+edituser       pyt-src/server.py       /^    def edituser(self, user):$/
+egetenv        c-src/emacs/src/lisp.h  /^egetenv (const char *var)$/
+elist  cp-src/cfront.H 727
+elist::add     cp-src/cfront.H /^      void    add(Pexpr e)    { tail->e2 = e; 
tail = e; };$/
+elist::elist   cp-src/cfront.H /^              elist(Pexpr e)  { Nl++; head = 
tail = e; };$/
+elist::head    cp-src/cfront.H 728
+elist::tail    cp-src/cfront.H 729
+emacs_abort    c-src/emacs/src/lisp.h  /^extern _Noreturn void emacs_abort 
(void) NO_INLINE/
+end    c-src/emacs/src/regex.h 432
+end    c-src/emacs/src/keyboard.c      8753
+endtoken       c-src/etags.c   /^#define       endtoken(c)     (_etk[CHAR 
(c)]) \/* c ends tok/
+enter_critical_section c-src/h.h       116
+entry  perl-src/htlmify-cystic 218
+entry  perl-src/htlmify-cystic 234
+entry  perl-src/htlmify-cystic 245
+entry  perl-src/htlmify-cystic 252
+entry  perl-src/htlmify-cystic 268
+entry  perl-src/htlmify-cystic 276
+entry  perl-src/htlmify-cystic 281
+entry  perl-src/htlmify-cystic 296
+enumdef        cp-src/cfront.H 265
+enumdef::e_body        cp-src/cfront.H 266
+enumdef::enumdef       cp-src/cfront.H /^              enumdef(Pname n)        
{ base=ENUM; mem=n; };$/
+enumdef::mem   cp-src/cfront.H 268
+enumdef::no_of_enumerators     cp-src/cfront.H 267
+equalsKey:     objcpp-src/SimpleCalc.M /^- equalsKey:sender$/
+erlang_atom    c-src/etags.c   /^erlang_atom (char *s)$/
+erlang_attribute       c-src/etags.c   /^erlang_attribute (char *s)$/
+erlang_func    c-src/etags.c   /^erlang_func (char *s, char *last)$/
+error  c-src/etags.c   /^static void error (const char *, ...) ATTRIBUTE_FO/
+error  c-src/etags.c   /^error (const char *format, ...)$/
+error  c-src/emacs/src/lisp.h  /^extern _Noreturn void error (const char *, 
...) AT/
+error  cp-src/cfront.H 94
+error  cccp.y  /^error (msg)$/
+error  y-src/cccp.y    /^error (msg)$/
+error_signaled c-src/etags.c   264
+estmt  cp-src/cfront.H 662
+estmt::estmt   cp-src/cfront.H /^      estmt(TOK t, loc ll, Pexpr ee, Pstmt 
ss) : (t,ll,/
+etags  el-src/emacs/lisp/progmodes/etags.el    /^(defgroup etags nil "Tags 
tables."$/
+etags  html-src/software.html  /^Etags$/
+etags--xref-find-definitions   el-src/emacs/lisp/progmodes/etags.el    
/^(defun etags--xref-find-definitions (pattern &opti/
+etags--xref-limit      el-src/emacs/lisp/progmodes/etags.el    /^(defconst 
etags--xref-limit 1000)$/
+etags-file-of-tag      el-src/emacs/lisp/progmodes/etags.el    /^(defun 
etags-file-of-tag (&optional relative) ; Do/
+etags-goto-tag-location        el-src/emacs/lisp/progmodes/etags.el    
/^(defun etags-goto-tag-location (tag-info)$/
+etags-list-tags        el-src/emacs/lisp/progmodes/etags.el    /^(defun 
etags-list-tags (file) ; Doc string?$/
+etags-recognize-tags-table     el-src/emacs/lisp/progmodes/etags.el    
/^(defun etags-recognize-tags-table ()$/
+etags-snarf-tag        el-src/emacs/lisp/progmodes/etags.el    /^(defun 
etags-snarf-tag (&optional use-explicit) ; /
+etags-tags-apropos     el-src/emacs/lisp/progmodes/etags.el    /^(defun 
etags-tags-apropos (string) ; Doc string?$/
+etags-tags-apropos-additional  el-src/emacs/lisp/progmodes/etags.el    
/^(defun etags-tags-apropos-additional (regexp)$/
+etags-tags-completion-table    el-src/emacs/lisp/progmodes/etags.el    
/^(defun etags-tags-completion-table () ; Doc string/
+etags-tags-included-tables     el-src/emacs/lisp/progmodes/etags.el    
/^(defun etags-tags-included-tables () ; Doc string?/
+etags-tags-table-files el-src/emacs/lisp/progmodes/etags.el    /^(defun 
etags-tags-table-files () ; Doc string?$/
+etags-verify-tags-table        el-src/emacs/lisp/progmodes/etags.el    
/^(defun etags-verify-tags-table ()$/
+etags-xref-find        el-src/emacs/lisp/progmodes/etags.el    /^(defun 
etags-xref-find (action id)$/
+etags-xref-find-definitions-tag-order  el-src/emacs/lisp/progmodes/etags.el    
/^(defvar etags-xref-find-definitions-tag-order '(ta/
+etags_getcwd   c-src/etags.c   /^etags_getcwd (void)$/
+eval_dyn       c-src/emacs/src/keyboard.c      /^eval_dyn (Lisp_Object form)$/
+event-convert-list     c-src/emacs/src/keyboard.c      /^DEFUN 
("event-convert-list", Fevent_convert_list, /
+event-symbol-parse-modifiers   c-src/emacs/src/keyboard.c      /^DEFUN 
("internal-event-symbol-parse-modifiers", Fe/
+event_head     c-src/emacs/src/keyboard.c      11021
+event_to_kboard        c-src/emacs/src/keyboard.c      /^event_to_kboard 
(struct input_event *event)$/
+exact  c-src/emacs/src/gmalloc.c       200
+exit   c-src/exit.c    /^DEFUN(exit, (status), int status)$/
+exit   c-src/exit.strange_suffix       /^DEFUN(exit, (status), int status)$/
+exit-recursive-edit    c-src/emacs/src/keyboard.c      /^DEFUN 
("exit-recursive-edit", Fexit_recursive_edit/
+exit_critical_to_previous      c-src/h.h       117
+exp    y-src/parse.y   94
+exp    y-src/atest.y   2
+exp    y-src/cccp.y    156
+exp    y-src/cccp.y    185
+exp1   y-src/cccp.y    148
+exp_list       y-src/parse.y   262
+expand-abbrev  c-src/abbrev.c  /^DEFUN ("expand-abbrev", Fexpand_abbrev, 
Sexpand_ab/
+expandmng      prol-src/natded.prolog  /^expandmng(var(V),var(V)).$/
+expandmng_tree prol-src/natded.prolog  
/^expandmng_tree(tree(Rule,Syn:Sem,Trees),$/
+expandmng_trees        prol-src/natded.prolog  /^expandmng_trees([],[]).$/
+expandsyn      prol-src/natded.prolog  /^expandsyn(Syn,Syn):-$/
+explicitly-quoted-pending-delete-mode  el-src/TAGTEST.EL       /^(defalias 
(quote explicitly-quoted-pending-delete-/
+expr   cp-src/cfront.H 469
+expr::as_type  cp-src/cfront.H 499
+expr::cond     cp-src/cfront.H 497
+expr::e1       cp-src/cfront.H 485
+expr::e2       cp-src/cfront.H 490
+expr::fct_name cp-src/cfront.H 496
+expr::i1       cp-src/cfront.H 487
+expr::il       cp-src/cfront.H 501
+expr::mem      cp-src/cfront.H 498
+expr::n_initializer    cp-src/cfront.H 491
+expr::n_table  cp-src/cfront.H 500
+expr::string   cp-src/cfront.H 486
+expr::string2  cp-src/cfront.H 492
+expr::syn_class        cp-src/cfront.H 482
+expr::tp       cp-src/cfront.H 481
+expr::tp2      cp-src/cfront.H 495
+expression_value       cccp.y  68
+expression_value       y-src/cccp.y    68
+extras c-src/emacs/src/lisp.h  1603
+extvar c-src/h.h       109
+f      c-src//c.c      /^T f(){if(x){}$/
+f      c.c     145
+f      c.c     156
+f      c.c     168
+f      c.c     /^int f$/
+f      c-src/h.h       89
+f      cp-src/c.C      /^A<int>* f() {}$/
+f      cp-src/c.C      /^int f(A<int> x) {}$/
+f      cp-src/c.C      /^int A<int>::f(A<int>* x) {}$/
+f      cp-src/c.C      /^A<float,B<int> > A<B<float>,int>::f(A<int>* x) {}$/
+f1     c.c     /^     f1 () { \/* Do something. *\/; }$/
+f2     c.c     /^void f2 () { \/* Do something. *\/; }$/
+fast_string_match_ignore_case  c-src/emacs/src/lisp.h  
/^fast_string_match_ignore_case (Lisp_Object regexp,/
+fastmap        c-src/emacs/src/regex.h 355
+fastmap_accurate       c-src/emacs/src/regex.h 383
+fatal  c-src/etags.c   /^fatal (const char *s1, const char *s2)$/
+fatala c.c     /^void fatala () __attribute__ ((noreturn));$/
+fct    cp-src/cfront.H 365
+fct::argtype   cp-src/cfront.H 372
+fct::b_init    cp-src/cfront.H 380
+fct::body      cp-src/cfront.H 376
+fct::declared  cp-src/cfront.H /^      bit     declared() { return 
nargs_known; };$/
+fct::f_expr    cp-src/cfront.H 383
+fct::f_init    cp-src/cfront.H 377
+fct::f_inline  cp-src/cfront.H 370
+fct::f_result  cp-src/cfront.H 385
+fct::f_this    cp-src/cfront.H 374
+fct::f_virtual cp-src/cfront.H 369
+fct::last_expanded     cp-src/cfront.H 384
+fct::memof     cp-src/cfront.H 375
+fct::nargs     cp-src/cfront.H 367
+fct::nargs_known       cp-src/cfront.H 368
+fct::returns   cp-src/cfront.H 371
+fct::s_returns cp-src/cfront.H 373
+fdHandler      objc-src/Subprocess.m   /^fdHandler (int theFd, id self)$/
+fdHandler:     objc-src/Subprocess.m   /^- fdHandler:(int)theFd$/
+fdefunkey      c-src/etags.c   2409
+fdefunname     c-src/etags.c   2410
+fdesc  c-src/etags.c   201
+fdesc  c-src/etags.c   212
+fdp    c-src/etags.c   217
+field_of_play  cp-src/conway.cpp       18
+fignore        c-src/etags.c   2416
+file-of-tag    el-src/emacs/lisp/progmodes/etags.el    /^(defun file-of-tag 
(&optional relative)$/
+file-of-tag-function   el-src/emacs/lisp/progmodes/etags.el    /^(defvar 
file-of-tag-function nil$/
+fileJoin       php-src/lce_functions.php       /^  function fileJoin()$/
+file_index     perl-src/htlmify-cystic 33
+file_tocs      perl-src/htlmify-cystic 30
+filename_is_absolute   c-src/etags.c   /^filename_is_absolute (char *fn)$/
+filenames      c-src/etags.c   196
+find-tag       el-src/emacs/lisp/progmodes/etags.el    /^(defun find-tag 
(tagname &optional next-p regexp-p/
+find-tag-default-function      el-src/emacs/lisp/progmodes/etags.el    
/^(defcustom find-tag-default-function nil$/
+find-tag-history       el-src/emacs/lisp/progmodes/etags.el    /^(defvar 
find-tag-history nil) ; Doc string?$/
+find-tag-hook  el-src/emacs/lisp/progmodes/etags.el    /^(defcustom 
find-tag-hook nil$/
+find-tag-in-order      el-src/emacs/lisp/progmodes/etags.el    /^(defun 
find-tag-in-order (pattern$/
+find-tag-interactive   el-src/emacs/lisp/progmodes/etags.el    /^(defun 
find-tag-interactive (prompt &optional no-d/
+find-tag-marker-ring   el-src/emacs/lisp/progmodes/etags.el    /^(defvaralias 
'find-tag-marker-ring 'xref--marker-r/
+find-tag-marker-ring-length    el-src/emacs/lisp/progmodes/etags.el    
/^(define-obsolete-variable-alias 'find-tag-marker-r/
+find-tag-next-line-after-failure-p     el-src/emacs/lisp/progmodes/etags.el    
/^(defvar find-tag-next-line-after-failure-p nil$/
+find-tag-noselect      el-src/emacs/lisp/progmodes/etags.el    /^(defun 
find-tag-noselect (tagname &optional next-p/
+find-tag-other-frame   el-src/emacs/lisp/progmodes/etags.el    /^(defun 
find-tag-other-frame (tagname &optional nex/
+find-tag-other-window  el-src/emacs/lisp/progmodes/etags.el    /^(defun 
find-tag-other-window (tagname &optional ne/
+find-tag-regexp        el-src/emacs/lisp/progmodes/etags.el    /^(defun 
find-tag-regexp (regexp &optional next-p ot/
+find-tag-regexp-next-line-after-failure-p      
el-src/emacs/lisp/progmodes/etags.el    /^(defvar 
find-tag-regexp-next-line-after-failure-p /
+find-tag-regexp-search-function        el-src/emacs/lisp/progmodes/etags.el    
/^(defvar find-tag-regexp-search-function nil$/
+find-tag-regexp-tag-order      el-src/emacs/lisp/progmodes/etags.el    
/^(defvar find-tag-regexp-tag-order nil$/
+find-tag-search-function       el-src/emacs/lisp/progmodes/etags.el    
/^(defvar find-tag-search-function nil$/
+find-tag-tag   el-src/emacs/lisp/progmodes/etags.el    /^(defun find-tag-tag 
(string)$/
+find-tag-tag-order     el-src/emacs/lisp/progmodes/etags.el    /^(defvar 
find-tag-tag-order nil$/
+find_entries   c-src/etags.c   /^find_entries (FILE *inf)$/
+find_user_signal_name  c-src/emacs/src/keyboard.c      /^find_user_signal_name 
(int sig)$/
+findcats       prol-src/natded.prolog  /^findcats([],Left,Left).$/
+finlist        c-src/etags.c   2414
+first  c-src/emacs/src/gmalloc.c       151
+fitchtreelist  prol-src/natded.prolog  /^fitchtreelist([]).$/
+fixup_locale   c-src/emacs/src/lisp.h  /^INLINE void fixup_locale (void) {}$/
+flag   c-src/getopt.h  83
+flag2str       pyt-src/server.py       /^def flag2str(value, string):$/
+flat_length    erl-src/lists.erl       /^flat_length(List) ->$/
+flatten        erl-src/lists.erl       /^flatten(List) ->$/
+flistseen      c-src/etags.c   2415
+fn     c-src/exit.c    /^    void EXFUN((*fn[1]), (NOARGS));$/
+fn     c-src/exit.strange_suffix       /^    void EXFUN((*fn[1]), (NOARGS));$/
+fnin   y-src/parse.y   67
+fnin   parse.y 67
+focus_set      pyt-src/server.py       /^    def focus_set(self):$/
+foldl  erl-src/lists.erl       /^foldl(F, As, Last, [Hd|Tail]) ->$/
+foldr  erl-src/lists.erl       /^foldr(F, As, [Hd|Tail], Last) ->$/
+follow_key     c-src/emacs/src/keyboard.c      /^follow_key (Lisp_Object 
keymap, Lisp_Object key)$/
+fonts  tex-src/texinfo.tex     /^\\obeyspaces \\obeylines \\ninett 
\\indexfonts \\rawbac/
+fonts\rm       tex-src/texinfo.tex     /^  \\indexfonts\\rm \\tolerance=9500 
\\advance\\baseline/
+foo    c.c     150
+foo    c.c     166
+foo    c.c     167
+foo    c.c     178
+foo    c.c     189
+foo    c-src/h.h       18
+foo    cp-src/c.C      68
+foo    cp-src/c.C      79
+foo    f-src/entry.for /^       character*(*) function foo()$/
+foo    f-src/entry.strange_suffix      /^       character*(*) function foo()$/
+foo    f-src/entry.strange     /^       character*(*) function foo()$/
+foo    php-src/ptest.php       /^foo()$/
+foo::f cp-src/c.C      /^     void f() {}$/
+foo::x cp-src/c.C      80
+foobar c-src//c.c      /^int foobar() {;}$/
+foobar c.c     /^extern void foobar (void) __attribute__ ((section /
+foobar2        c-src/h.h       20
+foobar2_       c-src/h.h       16
+foperator      c-src/etags.c   2411
+force_auto_save_soon   c-src/emacs/src/keyboard.c      /^force_auto_save_soon 
(void)$/
+force_explicit_name    c-src/etags.c   265
+force_quit_count       c-src/emacs/src/keyboard.c      10387
+formatSize:inBuf:      objc-src/PackInsp.m     /^-(const char 
*)formatSize:(const char *)size inBuf/
+forstmt        cp-src/cfront.H 689
+forstmt::forstmt       cp-src/cfront.H /^      forstmt(loc ll, Pstmt fss, 
Pexpr ee1, Pexpr ee2, /
+found  c-src/emacs/src/lisp.h  2344
+fracas html-src/software.html  /^Fracas$/
+frag   c-src/emacs/src/gmalloc.c       152
+frame_local    c-src/emacs/src/lisp.h  2341
+free   c-src/emacs/src/gmalloc.c       67
+free   c-src/emacs/src/gmalloc.c       72
+free   c-src/emacs/src/gmalloc.c       166
+free   c-src/emacs/src/gmalloc.c       /^free (void *ptr)$/
+free   c-src/emacs/src/gmalloc.c       1719
+free_fdesc     c-src/etags.c   /^free_fdesc (register fdesc *fdp)$/
+free_for       prol-src/natded.prolog  /^free_for(var(_),_,_).$/
+free_regexps   c-src/etags.c   /^free_regexps (void)$/
+free_tree      c-src/etags.c   /^free_tree (register node *np)$/
+free_var       prol-src/natded.prolog  /^free_var(var(V),var(V)).$/
+freehook       c-src/emacs/src/gmalloc.c       /^freehook (void *ptr)$/
+fresh_vars     prol-src/natded.prolog  /^fresh_vars(var(V),var(V)).$/
+fstartlist     c-src/etags.c   2413
+func1  c.c     /^int func1$/
+func2  c.c     /^int func2 (a,b$/
+func_key_syms  c-src/emacs/src/keyboard.c      4626
+funcboo        c.c     /^bool funcboo ()$/
+funcpointer    c-src/emacs/src/lisp.h  2126
+funcptr        c-src/h.h       /^    fu   int (*funcptr) (void *ptr);$/
+function       c-src/etags.c   194
+function       c-src/emacs/src/lisp.h  694
+function       c-src/emacs/src/lisp.h  1685
+function       c-src/emacs/src/lisp.h  2197
+functionp      c-src/emacs/src/lisp.h  /^functionp (Lisp_Object object)$/
+fvdef  c-src/etags.c   2418
+fvextern       c-src/etags.c   2420
+fvnameseen     c-src/etags.c   2412
+fvnone c-src/etags.c   2408
+fwd    c-src/emacs/src/lisp.h  690
+fwd    c-src/emacs/src/lisp.h  2346
+galileo        html-src/software.html  /^GaliLEO$/
+gather pyt-src/server.py       /^    def gather(self):$/
+gather pyt-src/server.py       /^    def gather(self):$/
+gc_aset        c-src/emacs/src/lisp.h  /^gc_aset (Lisp_Object array, ptrdiff_t 
idx, Lisp_Ob/
+gcmarkbit      c-src/emacs/src/lisp.h  656
+gcpro  c-src/emacs/src/lisp.h  3042
+gcpro  c-src/emacs/src/lisp.h  3132
+gen    cp-src/cfront.H 410
+gen::fct_list  cp-src/cfront.H 411
+gen::string    cp-src/cfront.H 412
+gen_help_event c-src/emacs/src/keyboard.c      /^gen_help_event (Lisp_Object 
help, Lisp_Object fram/
+genalgorithm   html-src/algrthms.html  /^Generating the 
Data<\/font><\/i><\/b>$/
+generic_object cp-src/clheir.hpp       13
+generic_object::compute_next_state     cp-src/clheir.hpp       /^    virtual 
void compute_next_state(void) { }$/
+generic_object::generic_object cp-src/clheir.cpp       
/^generic_object::generic_object(void)$/
+generic_object::step   cp-src/clheir.hpp       /^    virtual void step(void) { 
}$/
+generic_object::where_in_registry      cp-src/clheir.hpp       15
+generic_object::~generic_object        cp-src/clheir.cpp       
/^generic_object::~generic_object(void)$/
+getArchs       objc-src/PackInsp.m     /^-(void)getArchs$/
+getDomainNames php-src/lce_functions.php       /^      function 
getDomainNames()$/
+getPOReader    php-src/lce_functions.php       /^      function 
&getPOReader($domain)$/
+getPath:forType:       objc-src/PackInsp.m     /^-(const char *)getPath:(char 
*)buf forType:(const /
+getTextDomains php-src/lce_functions.php       /^  function 
getTextDomains($lines)$/
+get_compressor_from_suffix     c-src/etags.c   /^get_compressor_from_suffix 
(char *file, char **ext/
+get_contiguous_space   c-src/emacs/src/gmalloc.c       /^get_contiguous_space 
(ptrdiff_t size, void *positi/
+get_current_dir_name   c-src/emacs/src/gmalloc.c       33
+get_input_pending      c-src/emacs/src/keyboard.c      /^get_input_pending 
(int flags)$/
+get_language_from_filename     c-src/etags.c   /^get_language_from_filename 
(char *file, int case_s/
+get_language_from_interpreter  c-src/etags.c   /^get_language_from_interpreter 
(char *interpreter)$/
+get_language_from_langname     c-src/etags.c   /^get_language_from_langname 
(const char *name)$/
+get_layer_by_name      lua-src/allegro.lua     /^local function 
get_layer_by_name (sprite, layer, n/
+get_tag        c-src/etags.c   /^get_tag (register char *bp, char **namepp)$/
+get_word       c-src/tab.c     /^static char           *get_word(char **str, 
char delim)$/
+getcjmp        c-src/emacs/src/keyboard.c      147
+getptys        objc-src/Subprocess.m   /^getptys (int *master, int *slave)$/
+gettext        php-src/lce_functions.php       /^      function 
gettext($msgid)$/
+ggg    c-src/h.h       10
+ghi1   c-src/h.h       36
+ghi2   c-src/h.h       39
+glider cp-src/conway.cpp       /^void glider(int x, int y)$/
+gnu    html-src/software.html  /^Free software that I wrote for the GNU 
project or /
+gobble_input   c-src/emacs/src/keyboard.c      /^gobble_input (void)$/
+goto-tag-location-function     el-src/emacs/lisp/progmodes/etags.el    
/^(defvar goto-tag-location-function nil$/
+goto_xy        cp-src/screen.cpp       /^void goto_xy(unsigned char x, 
unsigned char y)$/
+handleList     pyt-src/server.py       /^    def handleList(self, event):$/
+handleNew      pyt-src/server.py       /^    def handleNew(self, event):$/
+handle_async_input     c-src/emacs/src/keyboard.c      /^handle_async_input 
(void)$/
+handle_input_available_signal  c-src/emacs/src/keyboard.c      
/^handle_input_available_signal (int sig)$/
+handle_interrupt       c-src/emacs/src/keyboard.c      /^handle_interrupt 
(bool in_signal_handler)$/
+handle_interrupt_signal        c-src/emacs/src/keyboard.c      
/^handle_interrupt_signal (int sig)$/
+handle_user_signal     c-src/emacs/src/keyboard.c      /^handle_user_signal 
(int sig)$/
+handler        c-src/emacs/src/lisp.h  3023
+handlertype    c-src/emacs/src/lisp.h  3021
+has_arg        c-src/getopt.h  82
+hash   c-src/etags.c   /^hash (const char *str, int len)$/
+hash   c-src/emacs/src/lisp.h  1843
+hash_table_test        c-src/emacs/src/lisp.h  1805
+hashfn c-src/emacs/src/lisp.h  /^  EMACS_UINT (*hashfn) (struct 
hash_table_test *t,/
+hdr    c-src/emacs/src/gmalloc.c       1860
+head_table     c-src/emacs/src/keyboard.c      11027
+header c-src/emacs/src/lisp.h  1371
+header c-src/emacs/src/lisp.h  1388
+header c-src/emacs/src/lisp.h  1581
+header c-src/emacs/src/lisp.h  1610
+header c-src/emacs/src/lisp.h  1672
+header c-src/emacs/src/lisp.h  1826
+header_size    c-src/emacs/src/lisp.h  1471
+heapsize       c-src/emacs/src/gmalloc.c       361
+help   c-src/etags.c   193
+helpPanel:     objcpp-src/SimpleCalc.M /^- helpPanel:sender$/
+help_char_p    c-src/emacs/src/keyboard.c      /^help_char_p (Lisp_Object c)$/
+help_form_saved_window_configs c-src/emacs/src/keyboard.c      2156
+helpwin        pyt-src/server.py       /^def helpwin(helpdict):$/
+hide_cursor    cp-src/screen.cpp       /^void hide_cursor(void)$/
+htmltreelist   prol-src/natded.prolog  /^htmltreelist([]).$/
+hybrid_aligned_alloc   c-src/emacs/src/gmalloc.c       /^hybrid_aligned_alloc 
(size_t alignment, size_t siz/
+hybrid_calloc  c-src/emacs/src/gmalloc.c       /^hybrid_calloc (size_t nmemb, 
size_t size)$/
+hybrid_free    c-src/emacs/src/gmalloc.c       /^hybrid_free (void *ptr)$/
+hybrid_get_current_dir_name    c-src/emacs/src/gmalloc.c       
/^hybrid_get_current_dir_name (void)$/
+hybrid_malloc  c-src/emacs/src/gmalloc.c       /^hybrid_malloc (size_t size)$/
+hybrid_realloc c-src/emacs/src/gmalloc.c       /^hybrid_realloc (void *ptr, 
size_t size)$/
+hypothetical_mem       prol-src/natded.prolog  
/^hypothetical_mem(fi(N),Ass,_):-$/
+i      c-src//c.c      2
+i      c.c     169
+i      c-src/emacs/src/lisp.h  567
+i      c-src/emacs/src/lisp.h  4673
+i      c-src/emacs/src/lisp.h  4679
+ialpage        tex-src/texinfo.tex     /^\\newbox\\partialpage$/
+ialpage        tex-src/texinfo.tex     /^  address@hidden \\advance\\dimen@ 
by-\\ht\\parti/
+ialpage        tex-src/texinfo.tex     /^  address@hidden 
\\advance\\availdimen@ by/
+ialpage        tex-src/texinfo.tex     /^     address@hidden \\advance\\dimen@ 
by-\\ht\\pa/
+ialpage=       tex-src/texinfo.tex     /^  
\\output={\\global\\setbox\\partialpage=$/
+idx    c-src/emacs/src/lisp.h  3150
+ifstmt cp-src/cfront.H 672
+ifstmt::ifstmt cp-src/cfront.H /^      ifstmt(loc ll, Pexpr ee, Pstmt ss1, 
Pstmt ss2)$/
+ignore_case    c-src/etags.c   266
+ignore_mouse_drag_p    c-src/emacs/src/keyboard.c      1256
+iline  cp-src/cfront.H 780
+iline::arg     cp-src/cfront.H 785
+iline::fct_name        cp-src/cfront.H 781
+iline::i_next  cp-src/cfront.H 782
+iline::i_table cp-src/cfront.H 783
+iline::local   cp-src/cfront.H 784
+iline::tp      cp-src/cfront.H 786
+ill=\relax     tex-src/texinfo.tex     /^\\let\\refill=\\relax$/
+immediate_quit c-src/emacs/src/keyboard.c      174
+impatto        html-src/softwarelibero.html    /^Impatto pratico del software 
libero$/
+in_word_set    c-src/etags.c   /^in_word_set (register const char *str, 
register un/
+inattribute    c-src/etags.c   2400
+index  c-src/emacs/src/lisp.h  1856
+infabsdir      c-src/etags.c   206
+infabsname     c-src/etags.c   205
+infiles        Makefile        /^infiles = $(filter-out ${NONSRCS},${SRCS}) 
srclist/
+infname        c-src/etags.c   204
+info   c-src/emacs/src/gmalloc.c       157
+infoPanel:     objcpp-src/SimpleCalc.M /^- infoPanel:sender$/
+init   c-src/etags.c   /^init (void)$/
+init   objcpp-src/SimpleCalc.M /^- init$/
+init:  objc-src/Subprocess.m   /^- init:(const char *)subprocessString$/
+init:withDelegate:andPtySupport:andStdErr:     objc-src/Subprocess.m   /^    
andStdErr:(BOOL)wantsStdErr$/
+init_control   c.c     239
+init_kboard    c-src/emacs/src/keyboard.c      /^init_kboard (KBOARD *kb, 
Lisp_Object type)$/
+init_keyboard  c-src/emacs/src/keyboard.c      /^init_keyboard (void)$/
+init_registry  cp-src/clheir.cpp       /^void init_registry(void)$/
+init_tool_bar_items    c-src/emacs/src/keyboard.c      /^init_tool_bar_items 
(Lisp_Object reuse)$/
+inita  c.c     /^static void inita () {}$/
+initb  c.c     /^static void initb () {}$/
+initial_kboard c-src/emacs/src/keyboard.c      84
+initialize-new-tags-table      el-src/emacs/lisp/progmodes/etags.el    
/^(defun initialize-new-tags-table ()$/
+initialize_random_junk cccp.y  /^initialize_random_junk ()$/
+initialize_random_junk y-src/cccp.y    /^initialize_random_junk ()$/
+input-pending-p        c-src/emacs/src/keyboard.c      /^DEFUN 
("input-pending-p", Finput_pending_p, Sinput/
+input_available_clear_time     c-src/emacs/src/keyboard.c      324
+input_pending  c-src/emacs/src/keyboard.c      239
+input_polling_used     c-src/emacs/src/keyboard.c      /^input_polling_used 
(void)$/
+input_was_pending      c-src/emacs/src/keyboard.c      287
+insert erl-src/lines.erl       /^insert(Lno, _, _) when Lno < 1 ->$/
+insert-abbrev-table-description        c-src/abbrev.c  /^DEFUN 
("insert-abbrev-table-description", Finsert_/
+insert_after   erl-src/lines.erl       /^insert_after(Lno, _, _) when Lno < 1 
->$/
+insert_after_nth       erl-src/lines.erl       /^insert_after_nth(1, [H|T], X) 
->$/
+insert_nth     erl-src/lines.erl       /^insert_nth(1, L, X) ->$/
+insertname     pas-src/common.pas      /^function insertname;(*($/
+instr  y-src/parse.y   80
+instr  parse.y 80
+instruct       c-src/etags.c   2527
+integer        c-src/emacs/src/lisp.h  2127
+integer        cccp.y  113
+integer        y-src/cccp.y    112
+integer_overflow       cccp.y  /^integer_overflow ()$/
+integer_overflow       y-src/cccp.y    /^integer_overflow ()$/
+integertonmstr pas-src/common.pas      /^function integertonmstr; (* 
(TheInteger : integer)/
+intensity1     f-src/entry.for /^     & 
intensity1(efv,fv,svin,svquad,sfpv,maxp,val/
+intensity1     f-src/entry.strange_suffix      /^     & 
intensity1(efv,fv,svin,svquad,sfpv,maxp,val/
+intensity1     f-src/entry.strange     /^     & 
intensity1(efv,fv,svin,svquad,sfpv,maxp,val/
+interface_locate       c-src//c.c      /^interface_locate(void)$/
+intern c-src/emacs/src/lisp.h  /^intern (const char *str)$/
+intern_c_string        c-src/emacs/src/lisp.h  /^intern_c_string (const char 
*str)$/
+internal_last_event_frame      c-src/emacs/src/keyboard.c      228
+interpreters   c-src/etags.c   197
+interrupt_input        c-src/emacs/src/keyboard.c      328
+interrupt_input_blocked        c-src/emacs/src/keyboard.c      76
+interrupt_input_blocked        c-src/emacs/src/lisp.h  3048
+interrupts_deferred    c-src/emacs/src/keyboard.c      331
+intoken        c-src/etags.c   /^#define       intoken(c)      (_itk[CHAR 
(c)]) \/* c can be in/
+intspec        c-src/emacs/src/lisp.h  1688
+intvar c-src/emacs/src/lisp.h  2277
+invalidate_nodes       c-src/etags.c   /^invalidate_nodes (fdesc *badfdp, node 
**npp)$/
+ipc3dChannelType       cp-src/c.C      1
+ipc3dIslandHierarchy   cp-src/c.C      1
+ipc3dLinkControl       cp-src/c.C      1
+irregular_location     cp-src/clheir.hpp       47
+irregular_location::irregular_location cp-src/clheir.hpp       /^    
irregular_location(double xi, double yi, doubl/
+irregular_location::x  cp-src/clheir.hpp       49
+irregular_location::y  cp-src/clheir.hpp       49
+irregular_location::z  cp-src/clheir.hpp       49
+isComment      php-src/lce_functions.php       /^      function 
isComment($class)$/
+isHoliday      cp-src/functions.cpp    /^bool isHoliday ( Date d ){$/
+isLeap cp-src/functions.cpp    /^bool isLeap ( int year ){$/
+is_curly_brace_form    c-src/h.h       54
+is_explicit    c-src/h.h       49
+is_func        c-src/etags.c   221
+is_hor_space   cccp.y  953
+is_hor_space   y-src/cccp.y    953
+is_idchar      cccp.y  948
+is_idchar      y-src/cccp.y    948
+is_idstart     cccp.y  950
+is_idstart     y-src/cccp.y    950
+is_muldiv_operation    cp-src/c.C      /^is_muldiv_operation(pc)$/
+is_ordset      prol-src/ordsets.prolog /^is_ordset(X) :- var(X), !, fail.$/
+iso_lispy_function_keys        c-src/emacs/src/keyboard.c      5151
+isoperator     prol-src/natded.prolog  /^isoperator(Char):-$/
+isoptab        prol-src/natded.prolog  /^isoptab('%').$/
+iswhite        c-src/etags.c   /^#define       iswhite(c)      (_wht[CHAR 
(c)]) \/* c is white /
+item_properties        c-src/emacs/src/keyboard.c      7568
+ival   cp-src/cfront.H 531
+ival::ival     cp-src/cfront.H /^      ival(int ii) : (IVAL,0,0) {this=0; i1 = 
ii;}$/
+jmp    c-src/emacs/src/lisp.h  3044
+just_read_file c-src/etags.c   /^just_read_file (FILE *inf)$/
+kbd_buffer     c-src/emacs/src/keyboard.c      291
+kbd_buffer_events_waiting      c-src/emacs/src/keyboard.c      
/^kbd_buffer_events_waiting (void)$/
+kbd_buffer_get_event   c-src/emacs/src/keyboard.c      /^kbd_buffer_get_event 
(KBOARD **kbp,$/
+kbd_buffer_nr_stored   c-src/emacs/src/keyboard.c      /^kbd_buffer_nr_stored 
(void)$/
+kbd_buffer_store_event c-src/emacs/src/keyboard.c      
/^kbd_buffer_store_event (register struct input_even/
+kbd_buffer_store_event_hold    c-src/emacs/src/keyboard.c      
/^kbd_buffer_store_event_hold (register struct input/
+kbd_buffer_store_help_event    c-src/emacs/src/keyboard.c      
/^kbd_buffer_store_help_event (Lisp_Object frame, Li/
+kbd_buffer_unget_event c-src/emacs/src/keyboard.c      
/^kbd_buffer_unget_event (register struct input_even/
+kbd_fetch_ptr  c-src/emacs/src/keyboard.c      297
+kbd_store_ptr  c-src/emacs/src/keyboard.c      302
+kboard c-src/emacs/src/keyboard.c      860
+kboard_stack   c-src/emacs/src/keyboard.c      858
+kboard_stack   c-src/emacs/src/keyboard.c      864
+key_and_value  c-src/emacs/src/lisp.h  1868
+keydelete      erl-src/lists.erl       /^keydelete(Key, N, [H|T]) when 
element(N, H) == Key/
+keymap erl-src/lists.erl       /^keymap({Mod, Func}, Pos, List) ->$/
+keymember      erl-src/lists.erl       /^keymember(Key, N, [T|Ts]) when 
element(N, T) == Ke/
+keymerge       erl-src/lists.erl       /^keymerge(Index, X, Y) -> 
keymerge(Index, X, Y, [])/
+keyremap       c-src/emacs/src/keyboard.c      8742
+keyremap       c-src/emacs/src/keyboard.c      8754
+keyremap_step  c-src/emacs/src/keyboard.c      /^keyremap_step (Lisp_Object 
*keybuf, int bufsize, v/
+keyreplace     erl-src/lists.erl       /^keyreplace(Key,Pos,[],New) -> [];$/
+keys_of_keyboard       c-src/emacs/src/keyboard.c      /^keys_of_keyboard 
(void)$/
+keysearch      erl-src/lists.erl       /^keysearch(Key, N, [H|T]) when 
element(N, H) == Key/
+keysort        erl-src/lists.erl       /^keysort(Index, [X]) -> [X];$/
+keyval prol-src/natded.prolog  /^keyval(key(Key,Val)) --> [Key,'='], 
valseq(Val).$/
+keyvalcgi      prol-src/natded.prolog  /^keyvalcgi(Key,Val):-$/
+keyvalscgi     prol-src/natded.prolog  /^keyvalscgi(KeyVals),$/
+keyvalseq      prol-src/natded.prolog  /^keyvalseq([KeyVal|KeyVals]) --> $/
+keyword_parsing        cccp.y  73
+keyword_parsing        y-src/cccp.y    73
+keywords       cccp.y  115
+keywords       y-src/cccp.y    114
+keywords       y-src/cccp.y    306
+kind   c-src/emacs/src/keyboard.c      11024
+kind   c-src/h.h       46
+kset_echo_string       c-src/emacs/src/keyboard.c      /^kset_echo_string 
(struct kboard *kb, Lisp_Object v/
+kset_kbd_queue c-src/emacs/src/keyboard.c      /^kset_kbd_queue (struct kboard 
*kb, Lisp_Object val/
+kset_keyboard_translate_table  c-src/emacs/src/keyboard.c      
/^kset_keyboard_translate_table (struct kboard *kb, /
+kset_last_prefix_arg   c-src/emacs/src/keyboard.c      /^kset_last_prefix_arg 
(struct kboard *kb, Lisp_Obje/
+kset_last_repeatable_command   c-src/emacs/src/keyboard.c      
/^kset_last_repeatable_command (struct kboard *kb, L/
+kset_local_function_key_map    c-src/emacs/src/keyboard.c      
/^kset_local_function_key_map (struct kboard *kb, Li/
+kset_overriding_terminal_local_map     c-src/emacs/src/keyboard.c      
/^kset_overriding_terminal_local_map (struct kboard /
+kset_real_last_command c-src/emacs/src/keyboard.c      
/^kset_real_last_command (struct kboard *kb, Lisp_Ob/
+kset_system_key_syms   c-src/emacs/src/keyboard.c      /^kset_system_key_syms 
(struct kboard *kb, Lisp_Obje/
+lang   c-src/etags.c   208
+lang   c-src/etags.c   251
+lang   c-src/etags.c   259
+lang_names     c-src/etags.c   718
+language       c-src/etags.c   199
+last   erl-src/lists.erl       /^last([E]) ->$/
+last-tag       el-src/emacs/lisp/progmodes/etags.el    /^(defvar last-tag nil$/
+last_abbrev_point      c-src/abbrev.c  78
+last_auto_save c-src/emacs/src/keyboard.c      214
+last_heapinfo  c-src/emacs/src/gmalloc.c       402
+last_mouse_button      c-src/emacs/src/keyboard.c      5215
+last_mouse_x   c-src/emacs/src/keyboard.c      5216
+last_mouse_y   c-src/emacs/src/keyboard.c      5217
+last_non_minibuf_size  c-src/emacs/src/keyboard.c      207
+last_point_position    c-src/emacs/src/keyboard.c      217
+last_state_size        c-src/emacs/src/gmalloc.c       401
+last_undo_boundary     c-src/emacs/src/keyboard.c      1287
+lasta  c.c     272
+lastargmargin  tex-src/texinfo.tex     /^\\newskip\\deflastargmargin 
\\deflastargmargin=18pt$/
+lastargmargin  tex-src/texinfo.tex     /^\\setbox0=\\hbox{\\hskip 
\\deflastargmargin{\\rm #2}\\hs/
+lastb  c.c     278
+lb     c-src/etags.c   2923
+lbs    c-src/etags.c   2924
+lce    php-src/lce_functions.php       /^      function lce()$/
+lce    php-src/lce_functions.php       /^      function lce()$/
+lce_bindtextdomain     php-src/lce_functions.php       /^      function 
lce_bindtextdomain($d_name, $d_path/
+lce_bindtextdomain     php-src/lce_functions.php       /^      function 
lce_bindtextdomain($domain, $path)$/
+lce_dgettext   php-src/lce_functions.php       /^      function 
lce_dgettext($domain, $msgid)$/
+lce_dgettext   php-src/lce_functions.php       /^      function 
lce_dgettext($domain, $msgid)$/
+lce_geteditcode        php-src/lce_functions.php       /^  function 
lce_geteditcode($type, $name, $text, $r/
+lce_gettext    php-src/lce_functions.php       /^      function 
lce_gettext($msgid)$/
+lce_gettext    php-src/lce_functions.php       /^      function 
lce_gettext($msgid)$/
+lce_textdomain php-src/lce_functions.php       /^      function 
lce_textdomain($domain)$/
+lce_textdomain php-src/lce_functions.php       /^      function 
lce_textdomain($domain)$/
+leasqr html-src/software.html  /^Leasqr$/
+left   c-src/etags.c   216
+left_shift     cccp.y  /^left_shift (a, b)$/
+left_shift     y-src/cccp.y    /^left_shift (a, b)$/
+len    c-src/etags.c   237
+length c-src/etags.c   2495
+length cccp.y  44
+length cccp.y  114
+length y-src/cccp.y    44
+length y-src/cccp.y    113
+letter tex-src/texinfo.tex     /^\\chapmacro {#1}{Appendix \\appendixletter}%$/
+letter tex-src/texinfo.tex     /^  {#1}{Appendix 
\\appendixletter}{\\noexpand\\folio}}/
+letter tex-src/texinfo.tex     /^\\gdef\\thissection{#1}\\secheading 
{#1}{\\appendixlet/
+letter tex-src/texinfo.tex     
/^{#1}{\\appendixletter}{\\the\\secno}{\\noexpand\\folio}/
+letter tex-src/texinfo.tex     /^\\subsecheading 
{#1}{\\appendixletter}{\\the\\secno}{\\/
+letter tex-src/texinfo.tex     
/^{#1}{\\appendixletter}{\\the\\secno}{\\the\\subsecno}{\\/
+letter tex-src/texinfo.tex     /^  
{\\appendixletter}{\\the\\secno}{\\the\\subsecno}{\\th/
+letter tex-src/texinfo.tex     /^  {\\appendixletter}$/
+letter:        tex-src/texinfo.tex     /^\\xdef\\thischapter{Appendix 
\\appendixletter: \\noexp/
+level  c-src/emacs/src/lisp.h  3153
+lex    prol-src/natded.prolog  /^lex(W,SynOut,Sem):-$/
+lexptr cccp.y  332
+lexptr y-src/cccp.y    332
+licenze        html-src/softwarelibero.html    /^Licenze d'uso di un 
programma$/
+line   c-src/etags.c   2493
+line   perl-src/htlmify-cystic 37
+line   y-src/parse.y   86
+lineCount      php-src/lce_functions.php       /^      function 
lineCount($entry)$/
+linebuffer     c-src/etags.c   239
+linebuffer_init        c-src/etags.c   /^linebuffer_init (linebuffer *lbp)$/
+linebuffer_setlen      c-src/etags.c   /^linebuffer_setlen (linebuffer *lbp, 
int toksize)$/
+lineno c-src/etags.c   2506
+lineno c-src/emacs/src/lisp.h  3147
+linepos        c-src/etags.c   2507
+linepos        c-src/etags.c   2922
+links  html-src/software.html  /^Links to interesting software$/
+lisp_eval_depth        c-src/emacs/src/lisp.h  3045
+lisp_h_CHECK_LIST_CONS c-src/emacs/src/lisp.h  /^#define 
lisp_h_CHECK_LIST_CONS(x, y) CHECK_TYPE (C/
+lisp_h_CHECK_NUMBER    c-src/emacs/src/lisp.h  /^#define 
lisp_h_CHECK_NUMBER(x) CHECK_TYPE (INTEGER/
+lisp_h_CHECK_SYMBOL    c-src/emacs/src/lisp.h  /^#define 
lisp_h_CHECK_SYMBOL(x) CHECK_TYPE (SYMBOLP/
+lisp_h_CHECK_TYPE      c-src/emacs/src/lisp.h  /^#define lisp_h_CHECK_TYPE(ok, 
predicate, x) \\$/
+lisp_h_CONSP   c-src/emacs/src/lisp.h  /^#define lisp_h_CONSP(x) (XTYPE (x) == 
Lisp_Cons)$/
+lisp_h_EQ      c-src/emacs/src/lisp.h  /^#define lisp_h_EQ(x, y) (XLI (x) == 
XLI (y))$/
+lisp_h_FLOATP  c-src/emacs/src/lisp.h  /^#define lisp_h_FLOATP(x) (XTYPE (x) 
== Lisp_Float)/
+lisp_h_INTEGERP        c-src/emacs/src/lisp.h  /^#define lisp_h_INTEGERP(x) 
((XTYPE (x) & (Lisp_Int/
+lisp_h_MARKERP c-src/emacs/src/lisp.h  /^#define lisp_h_MARKERP(x) (MISCP (x) 
&& XMISCTYPE /
+lisp_h_MISCP   c-src/emacs/src/lisp.h  /^#define lisp_h_MISCP(x) (XTYPE (x) == 
Lisp_Misc)$/
+lisp_h_NILP    c-src/emacs/src/lisp.h  /^#define lisp_h_NILP(x) EQ (x, Qnil)$/
+lisp_h_SET_SYMBOL_VAL  c-src/emacs/src/lisp.h  /^#define 
lisp_h_SET_SYMBOL_VAL(sym, v) \\$/
+lisp_h_SYMBOLP c-src/emacs/src/lisp.h  /^#define lisp_h_SYMBOLP(x) (XTYPE (x) 
== Lisp_Symbo/
+lisp_h_SYMBOL_CONSTANT_P       c-src/emacs/src/lisp.h  /^#define 
lisp_h_SYMBOL_CONSTANT_P(sym) (XSYMBOL (sy/
+lisp_h_SYMBOL_VAL      c-src/emacs/src/lisp.h  /^#define 
lisp_h_SYMBOL_VAL(sym) \\$/
+lisp_h_VECTORLIKEP     c-src/emacs/src/lisp.h  /^#define lisp_h_VECTORLIKEP(x) 
(XTYPE (x) == Lisp_V/
+lisp_h_XCAR    c-src/emacs/src/lisp.h  /^#define lisp_h_XCAR(c) XCONS 
(c)->car$/
+lisp_h_XCDR    c-src/emacs/src/lisp.h  /^#define lisp_h_XCDR(c) XCONS 
(c)->u.cdr$/
+lisp_h_XCONS   c-src/emacs/src/lisp.h  /^#define lisp_h_XCONS(a) \\$/
+lisp_h_XFASTINT        c-src/emacs/src/lisp.h  /^# define lisp_h_XFASTINT(a) 
XINT (a)$/
+lisp_h_XHASH   c-src/emacs/src/lisp.h  /^#define lisp_h_XHASH(a) XUINT (a)$/
+lisp_h_XIL     c-src/emacs/src/lisp.h  /^# define lisp_h_XIL(i) ((Lisp_Object) 
{ i })$/
+lisp_h_XIL     c-src/emacs/src/lisp.h  /^# define lisp_h_XIL(i) (i)$/
+lisp_h_XINT    c-src/emacs/src/lisp.h  /^# define lisp_h_XINT(a) (XLI (a) >> 
INTTYPEBITS)$/
+lisp_h_XLI     c-src/emacs/src/lisp.h  /^# define lisp_h_XLI(o) ((o).i)$/
+lisp_h_XLI     c-src/emacs/src/lisp.h  /^# define lisp_h_XLI(o) (o)$/
+lisp_h_XPNTR   c-src/emacs/src/lisp.h  /^#define lisp_h_XPNTR(a) \\$/
+lisp_h_XSYMBOL c-src/emacs/src/lisp.h  /^# define lisp_h_XSYMBOL(a) \\$/
+lisp_h_XTYPE   c-src/emacs/src/lisp.h  /^# define lisp_h_XTYPE(a) ((enum 
Lisp_Type) (XLI (a/
+lisp_h_XUNTAG  c-src/emacs/src/lisp.h  /^# define lisp_h_XUNTAG(a, type) 
((void *) (intptr_/
+lisp_h_check_cons_list c-src/emacs/src/lisp.h  /^# define 
lisp_h_check_cons_list() ((void) 0)$/
+lisp_h_make_number     c-src/emacs/src/lisp.h  /^# define 
lisp_h_make_number(n) \\$/
+lispy_accent_codes     c-src/emacs/src/keyboard.c      4634
+lispy_accent_keys      c-src/emacs/src/keyboard.c      4741
+lispy_drag_n_drop_names        c-src/emacs/src/keyboard.c      5181
+lispy_function_keys    c-src/emacs/src/keyboard.c      4768
+lispy_function_keys    c-src/emacs/src/keyboard.c      5065
+lispy_kana_keys        c-src/emacs/src/keyboard.c      5026
+lispy_modifier_list    c-src/emacs/src/keyboard.c      /^lispy_modifier_list 
(int modifiers)$/
+lispy_multimedia_keys  c-src/emacs/src/keyboard.c      4962
+lispy_wheel_names      c-src/emacs/src/keyboard.c      5174
+list   c-src/emacs/src/gmalloc.c       186
+list-tags      el-src/emacs/lisp/progmodes/etags.el    /^(defun list-tags 
(file &optional _next-match)$/
+list-tags-function     el-src/emacs/lisp/progmodes/etags.el    /^(defvar 
list-tags-function nil$/
+list2i c-src/emacs/src/lisp.h  /^list2i (EMACS_INT x, EMACS_INT y)$/
+list3i c-src/emacs/src/lisp.h  /^list3i (EMACS_INT x, EMACS_INT y, EMACS_INT 
w)$/
+list4i c-src/emacs/src/lisp.h  /^list4i (EMACS_INT x, EMACS_INT y, EMACS_INT 
w, EMA/
+list_to_ord_set        prol-src/ordsets.prolog /^list_to_ord_set(List, Set) 
:-$/
+lno    c-src/etags.c   223
+load   objc-src/PackInsp.m     /^-load$/
+loadContentsOf:inTable:        objc-src/PackInsp.m     
/^-loadContentsOf:(const char *)type inTable:(HashTa/
+loadImage      objc-src/PackInsp.m     /^-loadImage$/
+loadKeyValuesFrom:inTable:     objc-src/PackInsp.m     
/^-loadKeyValuesFrom:(const char *)type inTable:(Has/
+loadPORManager php-src/lce_functions.php       /^  function &loadPORManager()$/
+loc    cp-src/cfront.H 67
+loc::file      cp-src/cfront.H 69
+loc::line      cp-src/cfront.H 70
+local_if_set   c-src/emacs/src/lisp.h  2338
+location       cp-src/clheir.hpp       33
+location::location     cp-src/clheir.hpp       /^    location() { }$/
+lookup cccp.y  /^lookup (name, len, hash)$/
+lookup y-src/cccp.y    /^lookup (name, len, hash)$/
+lowcase        c-src/etags.c   /^#define lowcase(c)    tolower (CHAR (c))$/
+lstmt  cp-src/cfront.H 680
+lstmt::lstmt   cp-src/cfront.H /^      lstmt(TOK bb, loc ll, Pname nn, Pstmt 
ss) : (bb,l/
+lucid_event_type_list_p        c-src/emacs/src/keyboard.c      
/^lucid_event_type_list_p (Lisp_Object object)$/
+mabort c-src/emacs/src/gmalloc.c       /^mabort (enum mcheck_status status)$/
+mach_host_self c-src/machsyscalls.h    /^SYSCALL (mach_host_self, -29,$/
+mach_msg_trap  c-src/machsyscalls.h    /^SYSCALL (mach_msg_trap, -25,$/
+mach_reply_port        c-src/machsyscalls.h    /^SYSCALL (mach_reply_port, 
-26,$/
+mach_task_self c-src/machsyscalls.h    /^SYSCALL (mach_task_self, -28,$/
+mach_thread_self       c-src/machsyscalls.h    /^SYSCALL (mach_thread_self, 
-27,$/
+magic  c-src/emacs/src/gmalloc.c       1863
+main::alarm    perl-src/mirror.pl      /^sub alarm$/
+main::bsplit   perl-src/mirror.pl      /^sub bsplit$/
+main::checkout_regexps perl-src/mirror.pl      /^sub checkout_regexps$/
+main::chown    perl-src/mirror.pl      /^sub chown$/
+main::clear_local      perl-src/mirror.pl      /^sub clear_local$/
+main::clear_remote     perl-src/mirror.pl      /^sub clear_remote$/
+main::command_line_override    perl-src/mirror.pl      /^sub 
command_line_override$/
+main::compare_dirs     perl-src/mirror.pl      /^sub compare_dirs$/
+main::compare_times    perl-src/mirror.pl      /^sub compare_times$/
+main::connect  perl-src/mirror.pl      /^sub connect$/
+main::create_assocs    perl-src/mirror.pl      /^sub create_assocs$/
+main::cwd      perl-src/mirror.pl      /^sub cwd$/
+main::delete_assocs    perl-src/mirror.pl      /^sub delete_assocs$/
+main::dir_exists       perl-src/mirror.pl      /^sub dir_exists$/
+main::dirpart  perl-src/mirror.pl      /^sub dirpart$/
+main::disconnect       perl-src/mirror.pl      /^sub disconnect$/
+main::do_all_transfers perl-src/mirror.pl      /^sub do_all_transfers$/
+main::do_delete        perl-src/mirror.pl      /^sub do_delete$/
+main::do_deletes       perl-src/mirror.pl      /^sub do_deletes$/
+main::do_mirror        perl-src/mirror.pl      /^sub do_mirror$/
+main::expand_symlink   perl-src/mirror.pl      /^sub expand_symlink$/
+main::f1       perl-src/kai-test.pl    /^sub f1 {$/
+main::f2       perl-src/kai-test.pl    /^sub main::f2 {$/
+main::f7       perl-src/kai-test.pl    /^sub f7 {$/
+main::file_end perl-src/htlmify-cystic /^sub file_end ()$/
+main::filename_to_tempname     perl-src/mirror.pl      /^sub 
filename_to_tempname$/
+main::filesize perl-src/mirror.pl      /^sub filesize$/
+main::find_prog        perl-src/mirror.pl      /^sub find_prog$/
+main::finish_appendices        perl-src/htlmify-cystic /^sub finish_appendices 
()$/
+main::finish_sections  perl-src/htlmify-cystic /^sub finish_sections ()$/
+main::finish_subsections       perl-src/htlmify-cystic /^sub 
finish_subsections ()$/
+main::finish_subsubsections    perl-src/htlmify-cystic /^sub 
finish_subsubsections ()$/
+main::fix_package      perl-src/mirror.pl      /^sub fix_package$/
+main::flatten_path     perl-src/mirror.pl      /^sub flatten_path$/
+main::get_local_directory_details      perl-src/mirror.pl      /^sub 
get_local_directory_details$/
+main::get_passwd       perl-src/mirror.pl      /^sub get_passwd$/
+main::get_remote_directory_details     perl-src/mirror.pl      /^sub 
get_remote_directory_details$/
+main::getopt   perl-src/yagrip.pl      /^sub getopt {$/
+main::handler  perl-src/mirror.pl      /^sub handler$/
+main::interpret_config perl-src/mirror.pl      /^sub interpret_config$/
+main::interpret_config_files   perl-src/mirror.pl      /^sub 
interpret_config_files$/
+main::istrue   perl-src/mirror.pl      /^sub istrue$/
+main::keep     perl-src/mirror.pl      /^sub keep$/
+main::log_upload       perl-src/mirror.pl      /^sub log_upload$/
+main::make_dir perl-src/mirror.pl      /^sub make_dir$/
+main::make_dirs        perl-src/mirror.pl      /^sub make_dirs$/
+main::make_symlinks    perl-src/mirror.pl      /^sub make_symlinks$/
+main::map_name perl-src/mirror.pl      /^sub map_name$/
+main::map_user_group   perl-src/mirror.pl      /^sub map_user_group$/
+main::mkdirs   perl-src/mirror.pl      /^sub mkdirs$/
+main::mksymlink        perl-src/mirror.pl      /^sub mksymlink$/
+main::msg      perl-src/mirror.pl      /^sub msg$/
+main::msg_version      perl-src/mirror.pl      /^sub msg_version$/
+main::myflock  perl-src/mirror.pl      /^sub myflock$/
+main::parse_line       perl-src/mirror.pl      /^sub parse_line$/
+main::parse_remote_details     perl-src/mirror.pl      /^sub 
parse_remote_details$/
+main::parse_remote_details_real        perl-src/mirror.pl      /^sub 
parse_remote_details_real$/
+main::parse_timeout    perl-src/mirror.pl      /^sub parse_timeout$/
+main::patch_ls_lR_file perl-src/mirror.pl      /^sub patch_ls_lR_file$/
+main::pr_variables     perl-src/mirror.pl      /^sub pr_variables$/
+main::prod     perl-src/mirror.pl      /^sub prod$/
+main::read_toc perl-src/htlmify-cystic /^sub read_toc ()$/
+main::real_dir_from_path       perl-src/mirror.pl      /^sub 
real_dir_from_path$/
+main::save_delete      perl-src/mirror.pl      /^sub save_delete$/
+main::save_mkdir       perl-src/mirror.pl      /^sub save_mkdir$/
+main::section_href     perl-src/htlmify-cystic /^sub section_href ($)$/
+main::section_name     perl-src/htlmify-cystic /^sub section_name ($)$/
+main::section_url      perl-src/htlmify-cystic /^sub section_url ()$/
+main::section_url_base perl-src/htlmify-cystic /^sub section_url_base ()$/
+main::section_url_name perl-src/htlmify-cystic /^sub section_url_name ()$/
+main::set_assoc_from_array     perl-src/mirror.pl      /^sub 
set_assoc_from_array$/
+main::set_attribs      perl-src/mirror.pl      /^sub set_attribs$/
+main::set_defaults     perl-src/mirror.pl      /^sub set_defaults$/
+main::set_timestamp    perl-src/mirror.pl      /^sub set_timestamp$/
+main::set_timestamps   perl-src/mirror.pl      /^sub set_timestamps$/
+main::set_variables    perl-src/mirror.pl      /^sub set_variables$/
+main::sys      perl-src/mirror.pl      /^sub sys$/
+main::t2str    perl-src/mirror.pl      /^sub t2str$/
+main::to_bytes perl-src/mirror.pl      /^sub to_bytes$/
+main::toc_line perl-src/htlmify-cystic /^sub toc_line ($)$/
+main::transfer_file    perl-src/mirror.pl      /^sub transfer_file$/
+main::trap_signals     perl-src/mirror.pl      /^sub trap_signals$/
+main::unix2vms perl-src/mirror.pl      /^sub unix2vms$/
+main::unlink_dbm       perl-src/mirror.pl      /^sub unlink_dbm$/
+main::upd_val  perl-src/mirror.pl      /^sub upd_val$/
+main::usage    perl-src/yagrip.pl      /^sub usage {$/
+main::utime    perl-src/mirror.pl      /^sub utime$/
+main::will_compress    perl-src/mirror.pl      /^sub will_compress$/
+main::will_split       perl-src/mirror.pl      /^sub will_split$/
+make-abbrev-table      c-src/abbrev.c  /^DEFUN ("make-abbrev-table", 
Fmake_abbrev_table, Sm/
+make_C_tag     c-src/etags.c   /^make_C_tag (bool isfun)$/
+make_coor      prol-src/natded.prolog  
/^make_coor(s(_),Alpha,Sem1,Sem2,address@hidden@Sem2).$/
+make_ctrl_char c-src/emacs/src/keyboard.c      /^make_ctrl_char (int c)$/
+make_fixnum_or_float   c-src/emacs/src/lisp.h  /^#define 
make_fixnum_or_float(val) \\$/
+make_formatted_string  c-src/emacs/src/lisp.h  /^extern Lisp_Object 
make_formatted_string (char *, /
+make_lisp_ptr  c-src/emacs/src/lisp.h  /^make_lisp_ptr (void *ptr, enum 
Lisp_Type type)$/
+make_lisp_symbol       c-src/emacs/src/lisp.h  /^make_lisp_symbol (struct 
Lisp_Symbol *sym)$/
+make_lispy_event       c-src/emacs/src/keyboard.c      /^make_lispy_event 
(struct input_event *event)$/
+make_lispy_focus_in    c-src/emacs/src/keyboard.c      /^make_lispy_focus_in 
(Lisp_Object frame)$/
+make_lispy_focus_out   c-src/emacs/src/keyboard.c      /^make_lispy_focus_out 
(Lisp_Object frame)$/
+make_lispy_movement    c-src/emacs/src/keyboard.c      /^make_lispy_movement 
(struct frame *frame, Lisp_Obj/
+make_lispy_position    c-src/emacs/src/keyboard.c      /^make_lispy_position 
(struct frame *f, Lisp_Object /
+make_lispy_switch_frame        c-src/emacs/src/keyboard.c      
/^make_lispy_switch_frame (Lisp_Object frame)$/
+make_number    c-src/emacs/src/lisp.h  /^#  define make_number(n) 
lisp_h_make_number (n)$/
+make_pointer_integer   c-src/emacs/src/lisp.h  /^make_pointer_integer (void 
*p)$/
+make_scroll_bar_position       c-src/emacs/src/keyboard.c      
/^make_scroll_bar_position (struct input_event *ev, /
+make_tag       c-src/etags.c   /^make_tag (const char *name,   \/* tag name, 
or NULL /
+make_uninit_sub_char_table     c-src/emacs/src/lisp.h  
/^make_uninit_sub_char_table (int depth, int min_cha/
+make_uninit_vector     c-src/emacs/src/lisp.h  /^make_uninit_vector (ptrdiff_t 
size)$/
+malloc c-src/emacs/src/gmalloc.c       64
+malloc c-src/emacs/src/gmalloc.c       68
+malloc c-src/emacs/src/gmalloc.c       /^extern void *malloc (size_t size) 
ATTRIBUTE_MALLOC/
+malloc c-src/emacs/src/gmalloc.c       /^malloc (size_t size)$/
+malloc c-src/emacs/src/gmalloc.c       1715
+malloc_atfork_handler_child    c-src/emacs/src/gmalloc.c       
/^malloc_atfork_handler_child (void)$/
+malloc_atfork_handler_parent   c-src/emacs/src/gmalloc.c       
/^malloc_atfork_handler_parent (void)$/
+malloc_atfork_handler_prepare  c-src/emacs/src/gmalloc.c       
/^malloc_atfork_handler_prepare (void)$/
+malloc_enable_thread   c-src/emacs/src/gmalloc.c       /^malloc_enable_thread 
(void)$/
+malloc_info    c-src/emacs/src/gmalloc.c       167
+malloc_initialize_1    c-src/emacs/src/gmalloc.c       /^malloc_initialize_1 
(void)$/
+mallochook     c-src/emacs/src/gmalloc.c       /^mallochook (size_t size)$/
+mao    c-src/h.h       101
+map    c-src/emacs/src/keyboard.c      8748
+map    erl-src/lists.erl       /^map(F, As, [Hd|Tail]) ->$/
+map_word       prol-src/natded.prolog  /^map_word([[_]|Ws],Exp):-$/
+mapping        html-src/algrthms.html  /^Mapping the Channel Symbols$/
+mapsyn prol-src/natded.prolog  /^mapsyn(A\/B,AM\/BM):-$/
+mark_kboards   c-src/emacs/src/keyboard.c      /^mark_kboards (void)$/
+max    c.c     /^max (int a, int b)$/
+max    c.c     /^__attribute__ ((always_inline)) max (int a, int b)/
+max    c-src/emacs/src/lisp.h  58
+max    c-src/emacs/src/lisp.h  /^#define max(a, b) ((a) > (b) ? (a) : (b))$/
+max    cp-src/conway.cpp       /^#define max(x,y)  ((x > y) ? x : y)$/
+max    erl-src/lists.erl       /^max([H|T]) -> max(T, H).$/
+max_args       c-src/emacs/src/lisp.h  1686
+max_num_directions     cp-src/clheir.hpp       31
+max_num_generic_objects        cp-src/clheir.cpp       9
+maxargs        c-src/emacs/src/lisp.h  2831
+maybe_gc       c-src/emacs/src/lisp.h  /^maybe_gc (void)$/
+mcheck c-src/emacs/src/gmalloc.c       /^mcheck (void (*func) (enum 
mcheck_status))$/
+mcheck_status  c-src/emacs/src/gmalloc.c       283
+mcheck_used    c-src/emacs/src/gmalloc.c       2012
+memalign       c-src/emacs/src/gmalloc.c       /^memalign (size_t alignment, 
size_t size)$/
+member erl-src/lists.erl       /^member(X, [X|_]) ->$/
+member prol-src/natded.prolog  /^member(X,[X|_]).$/
+memclear       c-src/emacs/src/lisp.h  /^memclear (void *p, ptrdiff_t nbytes)$/
+menu_bar_item  c-src/emacs/src/keyboard.c      /^menu_bar_item (Lisp_Object 
key, Lisp_Object item, /
+menu_bar_items c-src/emacs/src/keyboard.c      /^menu_bar_items (Lisp_Object 
old)$/
+menu_bar_items_index   c-src/emacs/src/keyboard.c      7369
+menu_bar_items_vector  c-src/emacs/src/keyboard.c      7368
+menu_bar_one_keymap_changed_items      c-src/emacs/src/keyboard.c      7363
+menu_item_eval_property        c-src/emacs/src/keyboard.c      
/^menu_item_eval_property (Lisp_Object sexpr)$/
+menu_item_eval_property_1      c-src/emacs/src/keyboard.c      
/^menu_item_eval_property_1 (Lisp_Object arg)$/
+menu_separator_name_p  c-src/emacs/src/keyboard.c      /^menu_separator_name_p 
(const char *label)$/
+merge  erl-src/lists.erl       /^merge(X, Y) -> merge(X, Y, []).$/
+metasource     c-src/etags.c   198
+min    c-src/emacs/src/gmalloc.c       /^#define min(a, b) ((a) < (b) ? (a) : 
(b))$/
+min    c-src/emacs/src/lisp.h  57
+min    c-src/emacs/src/lisp.h  /^#define min(a, b) ((a) < (b) ? (a) : (b))$/
+min    cp-src/conway.cpp       /^#define min(x,y)  ((x > y) ? y : x)$/
+min    erl-src/lists.erl       /^min([H|T]) -> min(T, H).$/
+min_args       c-src/emacs/src/lisp.h  1686
+min_char       c-src/emacs/src/lisp.h  1621
+miti   html-src/softwarelibero.html    /^Sfatiamo alcuni miti$/
+modifier_names c-src/emacs/src/keyboard.c      6319
+modifier_symbols       c-src/emacs/src/keyboard.c      6327
+modify_event_symbol    c-src/emacs/src/keyboard.c      /^modify_event_symbol 
(ptrdiff_t symbol_num, int mod/
+more_aligned_int       c.c     165
+morecore_nolock        c-src/emacs/src/gmalloc.c       /^morecore_nolock 
(size_t size)$/
+morecore_recursing     c-src/emacs/src/gmalloc.c       604
+mouse_syms     c-src/emacs/src/keyboard.c      4627
+mprobe c-src/emacs/src/gmalloc.c       /^mprobe (void *ptr)$/
+msgid  php-src/lce_functions.php       /^      function msgid($line, $class)$/
+msgstr php-src/lce_functions.php       /^      function msgstr($line, $class)$/
+mstats c-src/emacs/src/gmalloc.c       308
+mt     prol-src/natded.prolog  /^mt:-$/
+mtg    html-src/software.html  /^MTG$/
+multi_line     c-src/etags.c   267
+multibyte      c-src/emacs/src/regex.h 403
+my_printf      c.c     /^my_printf (void *my_object, const char *my_format,/
+my_struct      c.c     226
+my_struct      c-src/h.h       91
+my_typedef     c.c     228
+my_typedef     c-src/h.h       93
+n      c-src/exit.c    28
+n      c-src/exit.strange_suffix       28
+name   c-src/getopt.h  76
+name   c-src/getopt.h  78
+name   c-src/etags.c   192
+name   c-src/etags.c   218
+name   c-src/etags.c   261
+name   c-src/etags.c   2271
+name   c-src/emacs/src/keyboard.c      7241
+name   c-src/emacs/src/lisp.h  1808
+name   c-src/emacs/src/lisp.h  3144
+name   cp-src/cfront.H 557
+name   perl-src/htlmify-cystic 357
+name   tex-src/texinfo.tex     /^\\begingroup\\defname 
{#2}{#1}\\defunargs{#3}\\endgrou/
+name   tex-src/texinfo.tex     /^\\begingroup\\defname {#1}{Function}%$/
+name   tex-src/texinfo.tex     /^\\begingroup\\defname {\\code{#1} 
#2}{Function}%$/
+name   tex-src/texinfo.tex     /^\\begingroup\\defname {\\code{#2} #3}{#1}%$/
+name   tex-src/texinfo.tex     /^\\begingroup\\defname {#1}{Macro}%$/
+name   tex-src/texinfo.tex     /^\\begingroup\\defname {#1}{Special Form}%$/
+name   tex-src/texinfo.tex     /^\\begingroup\\defname {#2}{\\defoptype{} on 
#1}%$/
+name   tex-src/texinfo.tex     /^\\begingroup\\defname {#2}{Method on #1}%$/
+name   tex-src/texinfo.tex     /^\\begingroup\\defname {#2}{\\defcvtype{} of 
#1}%$/
+name   tex-src/texinfo.tex     /^\\begingroup\\defname {#2}{Instance Variable 
of #1}%/
+name   tex-src/texinfo.tex     /^\\begingroup\\defname 
{#2}{#1}\\defvarargs{#3}\\endgro/
+name   tex-src/texinfo.tex     /^\\begingroup\\defname {#1}{Variable}%$/
+name   tex-src/texinfo.tex     /^\\begingroup\\defname {#1}{User Option}%$/
+name   tex-src/texinfo.tex     /^\\begingroup\\defname {\\code{#1} 
#2}{Variable}%$/
+name   tex-src/texinfo.tex     /^\\begingroup\\defname {\\code{#2} #3}{#1}$/
+name   tex-src/texinfo.tex     /^\\begingroup\\defname 
{#2}{#1}\\deftpargs{#3}\\endgrou/
+name   cccp.y  43
+name   cccp.y  114
+name   cccp.y  114
+name   y-src/cccp.y    43
+name   y-src/cccp.y    113
+name   y-src/cccp.y    113
+name::lex_level        cp-src/cfront.H 565
+name::n_addr_taken     cp-src/cfront.H 567
+name::n_assigned_to    cp-src/cfront.H 569
+name::n_evaluated      cp-src/cfront.H 563
+name::n_list   cp-src/cfront.H 575
+name::n_offset cp-src/cfront.H 574
+name::n_oper   cp-src/cfront.H 558
+name::n_protect        cp-src/cfront.H 566
+name::n_qualifier      cp-src/cfront.H 578
+name::n_realscope      cp-src/cfront.H 579
+name::n_scope  cp-src/cfront.H 561
+name::n_stclass        cp-src/cfront.H 560
+name::n_sto    cp-src/cfront.H 559
+name::n_tbl_list       cp-src/cfront.H 576
+name::n_union  cp-src/cfront.H 562
+name::n_used   cp-src/cfront.H 568
+name::n_val    cp-src/cfront.H 571
+name::n_xref   cp-src/cfront.H 564
+name::take_addr        cp-src/cfront.H /^      void    take_addr()     { 
n_addr_taken++; };$/
+name::unhide   cp-src/cfront.H /^      void    unhide()        { n_key=0; 
n_list=0; };$/
+name::use      cp-src/cfront.H /^      void    use()           { n_used++; };$/
+name::where    cp-src/cfront.H 570
+name_list      cp-src/cfront.H 403
+name_list::f   cp-src/cfront.H 404
+name_list::l   cp-src/cfront.H 405
+name_list::name_list   cp-src/cfront.H /^      name_list(Pname ff, Plist ll) { 
f=ff; l=ll; };$/
+named  c-src/etags.c   2505
+namestringequal        pas-src/common.pas      /^function 
namestringequal;(*(var Name1,Name2 : Name/
+nestlev        c-src/etags.c   2525
+new    erl-src/lines.erl       /^new() ->$/
+new    objc-src/PackInsp.m     /^+new$/
+new    perl-src/htlmify-cystic 163
+new_tag        perl-src/htlmify-cystic 18
+newlb  c-src/etags.c   2930
+newlinepos     c-src/etags.c   2932
+newtextstring  pas-src/common.pas      /^function newtextstring; (*: 
TextString;*)$/
+next   c.c     174
+next   c-src/etags.c   203
+next   c-src/emacs/src/gmalloc.c       164
+next   c-src/emacs/src/gmalloc.c       188
+next   c-src/emacs/src/gmalloc.c       198
+next   c-src/emacs/src/keyboard.c      861
+next   c-src/emacs/src/keyboard.c      7246
+next   c-src/emacs/src/lisp.h  700
+next   c-src/emacs/src/lisp.h  1848
+next   c-src/emacs/src/lisp.h  2192
+next   c-src/emacs/src/lisp.h  3028
+next   c-src/emacs/src/lisp.h  3134
+next   cccp.y  42
+next   y-src/cccp.y    42
+next-file      el-src/emacs/lisp/progmodes/etags.el    /^(defun next-file 
(&optional initialize novisit)$/
+next-file-list el-src/emacs/lisp/progmodes/etags.el    /^(defvar 
next-file-list nil$/
+next_almost_prime      c-src/emacs/src/lisp.h  /^extern EMACS_INT 
next_almost_prime (EMACS_INT) ATT/
+next_free      c-src/emacs/src/lisp.h  1851
+next_weak      c-src/emacs/src/lisp.h  1875
+nextfree       c-src/emacs/src/lisp.h  3029
+nfree  c-src/emacs/src/gmalloc.c       150
+nl     c-src/etags.c   2521
+nlist  cp-src/cfront.H 708
+nlist::add     cp-src/cfront.H /^      void    add(Pname n)    { tail->n_list 
= n; tail = n; }/
+nlist::head    cp-src/cfront.H 709
+nlist::tail    cp-src/cfront.H 710
+no     tex-src/texinfo.tex     /^\\newcount \\appendixno  \\appendixno = 
address@hidden/
+no     tex-src/texinfo.tex     /^\\global\\advance \\appendixno by 1 
\\message{Appendix/
+no     tex-src/texinfo.tex     /^\\ifnum\\secno=0 
Appendix\\xreftie'char\\the\\appendixn/
+no.\the\secno  tex-src/texinfo.tex     /^\\else \\ifnum \\subsecno=0 
Section\\xreftie'char\\the\\/
+no.\the\secno.\the\subsecno    tex-src/texinfo.tex     
/^Section\\xreftie'char\\the\\appendixno.\\the\\secno.\\th/
+no.\the\secno.\the\subsecno.\the\subsubsecno   tex-src/texinfo.tex     
/^Section\\xreftie'char\\the\\appendixno.\\the\\secno.\\th/
+no_argument    c-src/getopt.h  89
+no_lang_help   c-src/etags.c   707
+no_sub c-src/emacs/src/regex.h 387
+nocase_tail    c-src/etags.c   /^nocase_tail (const char *cp)$/
+node   c-src/etags.c   225
+node   cp-src/cfront.H 165
+node::base     cp-src/cfront.H 166
+node::n_key    cp-src/cfront.H 167
+node::permanent        cp-src/cfront.H 168
+node_st        c-src/etags.c   214
+noderef        tex-src/texinfo.tex     /^\\appendixnoderef %$/
+noderef        tex-src/texinfo.tex     /^\\appendixnoderef %$/
+noderef        tex-src/texinfo.tex     /^\\appendixnoderef %$/
+noderef        tex-src/texinfo.tex     /^\\appendixnoderef %$/
+nofonts        tex-src/texinfo.tex     /^{\\indexnofonts$/
+nofonts        tex-src/texinfo.tex     /^{\\indexnofonts$/
+nofonts%       tex-src/texinfo.tex     /^{\\chapternofonts%$/
+nofonts%       tex-src/texinfo.tex     /^{\\chapternofonts%$/
+nofonts%       tex-src/texinfo.tex     /^{\\chapternofonts%$/
+nofonts%       tex-src/texinfo.tex     /^{\\chapternofonts%$/
+nofonts%       tex-src/texinfo.tex     /^{\\chapternofonts%$/
+nofonts%       tex-src/texinfo.tex     /^{\\chapternofonts%$/
+nofonts%       tex-src/texinfo.tex     /^{\\chapternofonts%$/
+nofonts%       tex-src/texinfo.tex     /^{\\chapternofonts%$/
+nofonts%       tex-src/texinfo.tex     /^{\\chapternofonts%$/
+nofonts%       tex-src/texinfo.tex     /^{\\chapternofonts%$/
+nofonts%       tex-src/texinfo.tex     /^{\\chapternofonts%$/
+nofonts%       tex-src/texinfo.tex     /^{\\chapternofonts%$/
+none_help      c-src/etags.c   703
+normalize      prol-src/natded.prolog  /^normalize(M,MNorm):-$/
+normalize_fresh        prol-src/natded.prolog  /^normalize_fresh(M,N):-$/
+normalize_tree prol-src/natded.prolog  
/^normalize_tree(tree(Rule,Syn:Sem,Trees),$/
+normalize_trees        prol-src/natded.prolog  /^normalize_trees([],[]).$/
+nosave pyt-src/server.py       /^    def nosave(self):$/
+nosave pyt-src/server.py       /^    def nosave(self):$/
+nosave pyt-src/server.py       /^    def nosave(self):$/
+not_bol        c-src/emacs/src/regex.h 391
+not_eol        c-src/emacs/src/regex.h 394
+not_single_kboard_state        c-src/emacs/src/keyboard.c      
/^not_single_kboard_state (KBOARD *kboard)$/
+notag2 c-src/torture.c 26
+notag2 c-src/dostorture.c      26
+notag4 c-src/torture.c 45
+notag4 c-src/dostorture.c      45
+notinname      c-src/etags.c   /^#define notinname(c)  (_nin[CHAR (c)]) \/* c 
is not /
+npending       c-src/emacs/src/keyboard.c      7244
+nth    erl-src/lines.erl       /^nth(L, _) when L < 1 ->$/
+nth    erl-src/lists.erl       /^nth(1, [H|T]) ->$/
+nthtail        erl-src/lists.erl       /^nthtail(1, [H|T]) ->$/
+ntool_bar_items        c-src/emacs/src/keyboard.c      7974
+numOfChannels  cp-src/c.C      1
+num_columns    cp-src/conway.cpp       16
+num_input_events       c-src/emacs/src/keyboard.c      210
+num_regs       c-src/emacs/src/regex.h 430
+num_rows       cp-src/conway.cpp       15
+numberKeys:    objcpp-src/SimpleCalc.M /^- numberKeys:sender$/
+number_len     c-src/etags.c   /^static int number_len (long) 
ATTRIBUTE_CONST;$/
+numbervars     prol-src/natded.prolog  /^numbervars(X):-$/
+nvars  c-src/emacs/src/lisp.h  3140
+objdef c-src/etags.c   2484
+object c-src/emacs/src/lisp.h  2128
+object_registry        cp-src/clheir.cpp       10
+objtag c-src/etags.c   2453
+objvar c-src/emacs/src/lisp.h  2297
+obstack_chunk_alloc    y-src/parse.y   46
+obstack_chunk_alloc    parse.y 46
+obstack_chunk_free     y-src/parse.y   47
+obstack_chunk_free     parse.y 47
+ocatseen       c-src/etags.c   2477
+octave_MDiagArray2_h   cp-src/MDiagArray2.h    29
+octave_Range_h cp-src/Range.h  24
+offset c-src/etags.c   2494
+offset c-src/emacs/src/lisp.h  2305
+offset c-src/emacs/src/lisp.h  2365
+oignore        c-src/etags.c   2483
+oimplementation        c-src/etags.c   2474
+oinbody        c-src/etags.c   2478
+ok:    objc-src/PackInsp.m     /^-ok:sender$/
+ok_to_echo_at_next_pause       c-src/emacs/src/keyboard.c      159
+omethodcolon   c-src/etags.c   2481
+omethodparm    c-src/etags.c   2482
+omethodsign    c-src/etags.c   2479
+omethodtag     c-src/etags.c   2480
+onone  c-src/etags.c   2472
+oparenseen     c-src/etags.c   2476
+open-dribble-file      c-src/emacs/src/keyboard.c      /^DEFUN 
("open-dribble-file", Fopen_dribble_file, So/
+open:  objc-src/PackInsp.m     /^-open:sender$/
+openInWorkspace        objc-src/PackInsp.m     /^static void 
openInWorkspace(const char *filename)$/
+operationKeys: objcpp-src/SimpleCalc.M /^- operationKeys:sender$/
+operator       cccp.y  438
+operator       y-src/cccp.y    438
+operator -     cp-src/c.C      /^void operator -(int, int) {}$/
+operator <<    cp-src/functions.cpp    /^ostream& operator <<  ( ostream &c, 
Date d ) {$/
+operator >>    cp-src/functions.cpp    /^istream& operator >> ( istream &i, 
Date & dd ){$/
+operator int   cp-src/c.C      /^void operator int(int, int) {}$/
+operator+      cp-src/c.C      /^void operator+(int, int) {}$/
+opparsebody\Edefop\defopx\defopheader\defoptype        tex-src/texinfo.tex     
/^\\defopparsebody\\Edefop\\defopx\\defopheader\\defoptyp/
+oprotocol      c-src/etags.c   2473
+option c-src/getopt.h  73
+optional_argument      c-src/getopt.h  91
+opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype   tex-src/texinfo.tex     
/^\\defopvarparsebody\\Edefcv\\defcvx\\defcvarheader\\def/
+ord_add_element        prol-src/ordsets.prolog /^ord_add_element([], Element, 
[Element]).$/
+ord_del_element        prol-src/ordsets.prolog /^ord_del_element([], _, []).$/
+ord_disjoint   prol-src/ordsets.prolog /^ord_disjoint(Set1, Set2) :-$/
+ord_intersect  prol-src/ordsets.prolog /^ord_intersect([Head1|Tail1], 
[Head2|Tail2]) :-$/
+ord_intersection       prol-src/ordsets.prolog /^ord_intersection([], _, []).$/
+ord_intersection       prol-src/ordsets.prolog /^ord_intersection([], Set2, 
[], Set2).$/
+ord_intersection       prol-src/ordsets.prolog /^ord_intersection(Sets, 
Intersection) :- $/
+ord_intersection2      prol-src/ordsets.prolog /^ord_intersection2(1, 
[Set|Sets], Set0, Sets0) :- !/
+ord_intersection3      prol-src/ordsets.prolog /^ord_intersection3(<, _, Set1, 
Head2, Tail2, Inters/
+ord_intersection4      prol-src/ordsets.prolog /^ord_intersection4(<, _, Set1, 
Head2, Tail2, Inters/
+ord_member     prol-src/ordsets.prolog /^ord_member(X, [E|Es]) :-$/
+ord_seteq      prol-src/ordsets.prolog /^ord_seteq(Set1, Set2) :-$/
+ord_setproduct prol-src/ordsets.prolog /^ord_setproduct([], _, []).$/
+ord_subset     prol-src/ordsets.prolog /^ord_subset([], _).$/
+ord_subtract   prol-src/ordsets.prolog /^ord_subtract(Set1, Set2, Union) :-$/
+ord_symdiff    prol-src/ordsets.prolog /^ord_symdiff([], Set2, Set2).$/
+ord_union      prol-src/ordsets.prolog /^ord_union(Set1, Set2, Union) :-$/
+ord_union      prol-src/ordsets.prolog /^ord_union([], Union) :- !, Union = 
[].$/
+ord_union4     prol-src/ordsets.prolog /^ord_union4(<, Head, Set1, Head2, 
Tail2, [Head|Unio/
+ord_union_all  prol-src/ordsets.prolog /^ord_union_all(1, [Set|Sets], Set, 
Sets) :- !.$/
+oss    html-src/softwarelibero.html    /^Il movimento open source$/
+otagseen       c-src/etags.c   2475
+output_file    perl-src/htlmify-cystic 35
+output_files   perl-src/htlmify-cystic 32
+outputtable    html-src/algrthms.html  /^Output$/
+outsyn prol-src/natded.prolog  /^outsyn(['Any'],_).$/
+p      c-src/emacs/src/lisp.h  4673
+p      c-src/emacs/src/lisp.h  4679
+p/f    ada-src/etags-test-for.ada      /^   function p pragma Import (C,$/
+p/f    ada-src/etags-test-for.ada      /^function p ("p");$/
+pD     c-src/emacs/src/lisp.h  165
+pD     c-src/emacs/src/lisp.h  167
+pD     c-src/emacs/src/lisp.h  169
+pD     c-src/emacs/src/lisp.h  171
+pI     c-src/emacs/src/lisp.h  94
+pI     c-src/emacs/src/lisp.h  99
+pI     c-src/emacs/src/lisp.h  106
+pMd    c-src/emacs/src/lisp.h  150
+pMd    c-src/emacs/src/lisp.h  155
+pMu    c-src/emacs/src/lisp.h  151
+pMu    c-src/emacs/src/lisp.h  156
+p_next c-src/etags.c   258
+pagesize       c-src/emacs/src/gmalloc.c       1703
+pair   cp-src/cfront.H 703
+pair::pair     cp-src/cfront.H /^      pair(loc ll, Pstmt a, Pstmt b) : 
(PAIR,ll,a) { th/
+parent c-src/emacs/src/keyboard.c      8745
+parent c-src/emacs/src/lisp.h  1590
+parse  prol-src/natded.prolog  /^parse(Ws,Cat):-$/
+parseFromVars  php-src/lce_functions.php       /^      function 
parseFromVars($prefix)$/
+parse_c_expression     cccp.y  /^parse_c_expression (string)$/
+parse_c_expression     y-src/cccp.y    /^parse_c_expression (string)$/
+parse_cgi      prol-src/natded.prolog  /^parse_cgi(TokenList,KeyVals):-$/
+parse_error    y-src/parse.y   81
+parse_error    parse.y 81
+parse_escape   cccp.y  /^parse_escape (string_ptr)$/
+parse_escape   y-src/cccp.y    /^parse_escape (string_ptr)$/
+parse_hash     y-src/parse.y   63
+parse_hash     parse.y 63
+parse_menu_item        c-src/emacs/src/keyboard.c      /^parse_menu_item 
(Lisp_Object item, int inmenubar)$/
+parse_modifiers        c-src/emacs/src/keyboard.c      /^parse_modifiers 
(Lisp_Object symbol)$/
+parse_modifiers_uncached       c-src/emacs/src/keyboard.c      
/^parse_modifiers_uncached (Lisp_Object symbol, ptrd/
+parse_number   cccp.y  /^parse_number (olen)$/
+parse_number   y-src/cccp.y    /^parse_number (olen)$/
+parse_return   y-src/parse.y   73
+parse_return   parse.y 73
+parse_return_error     cccp.y  70
+parse_return_error     y-src/cccp.y    70
+parse_solitary_modifier        c-src/emacs/src/keyboard.c      
/^parse_solitary_modifier (Lisp_Object symbol)$/
+parse_tool_bar_item    c-src/emacs/src/keyboard.c      /^parse_tool_bar_item 
(Lisp_Object key, Lisp_Object /
+pat    c-src/etags.c   262
+pattern        c-src/etags.c   260
+pdlcount       c-src/emacs/src/lisp.h  3046
+pending-delete-mode    el-src/TAGTEST.EL       /^(defalias 
'pending-delete-mode 'delete-selection-m/
+pending_funcalls       c-src/emacs/src/keyboard.c      4377
+pending_signals        c-src/emacs/src/keyboard.c      80
+pfatal c-src/etags.c   /^pfatal (const char *s1)$/
+pfdset c-src/h.h       57
+pfnote c-src/etags.c   /^pfnote (char *name, bool is_func, char *linestart,/
+plain_C_entries        c-src/etags.c   /^plain_C_entries (FILE *inf)$/
+plain_C_suffixes       c-src/etags.c   643
+plainc c-src/etags.c   2934
+plist  c-src/emacs/src/lisp.h  697
+plusvalseq     prol-src/natded.prolog  /^plusvalseq([]) --> [].$/
+pointer        c-src/emacs/src/lisp.h  2125
+poll_for_input c-src/emacs/src/keyboard.c      /^poll_for_input (struct atimer 
*timer)$/
+poll_for_input_1       c-src/emacs/src/keyboard.c      /^poll_for_input_1 
(void)$/
+poll_suppress_count    c-src/emacs/src/keyboard.c      1908
+poll_suppress_count    c-src/emacs/src/lisp.h  3047
+poll_timer     c-src/emacs/src/keyboard.c      1915
+pop-tag-mark   el-src/emacs/lisp/progmodes/etags.el    /^(defalias 
'pop-tag-mark 'xref-pop-marker-stack)$/
+pop_kboard     c-src/emacs/src/keyboard.c      /^pop_kboard (void)$/
+popclass_above c-src/etags.c   /^popclass_above (int bracelev)$/
+position_to_Time       c-src/emacs/src/keyboard.c      /^position_to_Time 
(ptrdiff_t pos)$/
+posix_memalign c-src/emacs/src/gmalloc.c       /^posix_memalign (void 
**memptr, size_t alignment, s/
+posn-at-point  c-src/emacs/src/keyboard.c      /^DEFUN ("posn-at-point", 
Fposn_at_point, Sposn_at_p/
+posn-at-x-y    c-src/emacs/src/keyboard.c      /^DEFUN ("posn-at-x-y", 
Fposn_at_x_y, Sposn_at_x_y, /
+possible_sum_sign      cccp.y  /^#define possible_sum_sign(a, b, sum) ((((a) ^ 
(b))/
+possible_sum_sign      y-src/cccp.y    /^#define possible_sum_sign(a, b, sum) 
((((a) ^ (b))/
+post   pyt-src/server.py       /^    def post(self):$/
+post   pyt-src/server.py       /^    def post(self):$/
+pot_etags_version      c-src/etags.c   81
+pp1    c-src/torture.c /^int pp1($/
+pp1    c-src/dostorture.c      /^int pp1($/
+pp2    c-src/torture.c /^pp2$/
+pp2    c-src/dostorture.c      /^pp2$/
+pp3    c-src/torture.c /^pp3(int bar)$/
+pp3    c-src/dostorture.c      /^pp3(int bar)$/
+pp_bas_cat     prol-src/natded.prolog  /^pp_bas_cat(Cat):-$/
+pp_cat prol-src/natded.prolog  /^pp_cat(Syn:Sem):-$/
+pp_exp prol-src/natded.prolog  /^pp_exp('NIL'):-$/
+pp_exps        prol-src/natded.prolog  /^pp_exps([]).$/
+pp_html_fitch_tree     prol-src/natded.prolog  
/^pp_html_fitch_tree(tree(der,Root,[ders(Words)]),M,/
+pp_html_table_fitch_tree       prol-src/natded.prolog  
/^pp_html_table_fitch_tree(T):-$/
+pp_html_table_tree     prol-src/natded.prolog  /^pp_html_table_tree(T):-$/
+pp_html_tree   prol-src/natded.prolog  /^pp_html_tree(ass(Syn,V,'$VAR'(N))):-$/
+pp_html_trees  prol-src/natded.prolog  /^pp_html_trees([T|Ts],N,M):-$/
+pp_lam prol-src/natded.prolog  /^pp_lam(Var^Alpha):-$/
+pp_lam_bracket prol-src/natded.prolog  /^pp_lam_bracket(A^B):-$/
+pp_lam_paren   prol-src/natded.prolog  /^pp_lam_paren(Var^Alpha):-$/
+pp_paren       prol-src/natded.prolog  /^pp_paren(C):-$/
+pp_rule        prol-src/natded.prolog  /^pp_rule(fe):-write('\/E').$/
+pp_syn prol-src/natded.prolog  /^pp_syn(A\/B):-$/
+pp_syn_back    prol-src/natded.prolog  /^pp_syn_back(A\/B):-$/
+pp_syn_paren   prol-src/natded.prolog  /^pp_syn_paren(A\/B):-$/
+pp_tree        prol-src/natded.prolog  /^pp_tree(T):-$/
+pp_trees       prol-src/natded.prolog  /^pp_trees([T|Ts],Column):-$/
+pp_word        prol-src/natded.prolog  /^pp_word(W):-$/
+pp_word_list   prol-src/natded.prolog  /^pp_word_list([]).$/
+pp_word_list_rest      prol-src/natded.prolog  /^pp_word_list_rest([]).$/
+predicate      c-src/emacs/src/lisp.h  2307
+prefix erl-src/lists.erl       /^prefix([X|PreTail], [X|Tail]) ->$/
+prev   c.c     175
+prev   c-src/emacs/src/gmalloc.c       165
+prev   c-src/emacs/src/gmalloc.c       189
+prev   c-src/emacs/src/lisp.h  2191
+printClassification    php-src/lce_functions.php       /^      function 
printClassification()$/
+print_help     c-src/etags.c   /^print_help (argument *argbuffer)$/
+print_language_names   c-src/etags.c   /^print_language_names (void)$/
+print_version  c-src/etags.c   /^print_version (void)$/
+printmax_t     c-src/emacs/src/lisp.h  148
+printmax_t     c-src/emacs/src/lisp.h  153
+proc   c-src/h.h       87
+process_file   c-src/etags.c   /^process_file (FILE *fh, char *fn, language 
*lang)$/
+process_file_name      c-src/etags.c   /^process_file_name (char *file, 
language *lang)$/
+process_pending_signals        c-src/emacs/src/keyboard.c      
/^process_pending_signals (void)$/
+process_special_events c-src/emacs/src/keyboard.c      
/^process_special_events (void)$/
+process_tool_bar_item  c-src/emacs/src/keyboard.c      /^process_tool_bar_item 
(Lisp_Object key, Lisp_Objec/
+prolog_atom    c-src/etags.c   /^prolog_atom (char *s, size_t pos)$/
+prolog_pr      c-src/etags.c   /^prolog_pr (char *s, char *last)$/
+prolog_skip_comment    c-src/etags.c   /^prolog_skip_comment (linebuffer *plb, 
FILE *inf)$/
+prop   c-src/etags.c   209
+protect_malloc_state   c-src/emacs/src/gmalloc.c       /^protect_malloc_state 
(int protect_p)$/
+pthread_mutexattr_setprio_ceiling/f    ada-src/2ataspri.adb    /^   function 
pthread_mutexattr_setprio_ceiling$/
+pthread_mutexattr_setprotocol/f        ada-src/2ataspri.adb    /^   function 
pthread_mutexattr_setprotocol$/
+ptr    cp-src/cfront.H 435
+ptr::memof     cp-src/cfront.H 437
+ptr::ptr       cp-src/cfront.H /^      ptr(TOK b, Ptype t, bit r = 0) { Nt++; 
base=b; ty/
+ptr::rdo       cp-src/cfront.H 438
+purpose        c-src/emacs/src/lisp.h  1594
+push_kboard    c-src/emacs/src/keyboard.c      /^push_kboard (struct kboard 
*k)$/
+pushclass_above        c-src/etags.c   /^pushclass_above (int bracelev, char 
*str, int len)/
+put_entries    c-src/etags.c   /^put_entries (register node *np)$/
+pvec_type      c-src/emacs/src/lisp.h  780
+pvtyp  cp-src/cfront.H 419
+pvtyp::typ     cp-src/cfront.H 420
+qexpr  cp-src/cfront.H 543
+qexpr::qexpr   cp-src/cfront.H /^      qexpr(Pexpr ee, Pexpr ee1, Pexpr ee2) : 
(QUEST,ee/
+quantizing     html-src/algrthms.html  /^Quantizing the Received$/
+questo ../c/c.web      34
+quit_char      c-src/emacs/src/keyboard.c      192
+quit_throw_to_read_char        c-src/emacs/src/keyboard.c      
/^quit_throw_to_read_char (bool from_signal)$/
+r0     c-src/sysdep.h  54
+r1     c-src/sysdep.h  55
+r_alloc        c-src/emacs/src/lisp.h  /^extern void *r_alloc (void **, 
size_t) ATTRIBUTE_A/
+range_exp      y-src/parse.y   268
+range_exp_list y-src/parse.y   272
+raw_keybuf     c-src/emacs/src/keyboard.c      116
+raw_keybuf_count       c-src/emacs/src/keyboard.c      117
+rbtp   c.c     240
+re_iswctype    c-src/emacs/src/regex.h 602
+re_nsub        c-src/emacs/src/regex.h 364
+re_pattern_buffer      c-src/emacs/src/regex.h 335
+re_pattern_buffer      c-src/h.h       119
+re_registers   c-src/emacs/src/regex.h 428
+re_wchar_t     c-src/emacs/src/regex.h 600
+re_wchar_t     c-src/emacs/src/regex.h 623
+re_wctype      c-src/emacs/src/regex.h 601
+re_wctype_t    c-src/emacs/src/regex.h 599
+re_wctype_t    c-src/emacs/src/regex.h 618
+re_wctype_to_bit       c-src/emacs/src/regex.h /^# define re_wctype_to_bit(cc) 
0$/
+read   php-src/lce_functions.php       /^      function read()$/
+read-key-sequence      c-src/emacs/src/keyboard.c      /^DEFUN 
("read-key-sequence", Fread_key_sequence, Sr/
+read-key-sequence-vector       c-src/emacs/src/keyboard.c      /^DEFUN 
("read-key-sequence-vector", Fread_key_seque/
+read_char      c-src/emacs/src/keyboard.c      /^read_char (int commandflag, 
Lisp_Object map,$/
+read_char_help_form_unwind     c-src/emacs/src/keyboard.c      
/^read_char_help_form_unwind (void)$/
+read_char_minibuf_menu_prompt  c-src/emacs/src/keyboard.c      
/^read_char_minibuf_menu_prompt (int commandflag,$/
+read_char_x_menu_prompt        c-src/emacs/src/keyboard.c      
/^read_char_x_menu_prompt (Lisp_Object map,$/
+read_decoded_event_from_main_queue     c-src/emacs/src/keyboard.c      
/^read_decoded_event_from_main_queue (struct timespe/
+read_event_from_main_queue     c-src/emacs/src/keyboard.c      
/^read_event_from_main_queue (struct timespec *end_t/
+read_key_sequence      c-src/emacs/src/keyboard.c      /^read_key_sequence 
(Lisp_Object *keybuf, int bufsiz/
+read_key_sequence_cmd  c-src/emacs/src/keyboard.c      232
+read_key_sequence_remapped     c-src/emacs/src/keyboard.c      233
+read_key_sequence_vs   c-src/emacs/src/keyboard.c      /^read_key_sequence_vs 
(Lisp_Object prompt, Lisp_Obj/
+read_menu_command      c-src/emacs/src/keyboard.c      /^read_menu_command 
(void)$/
+readable_events        c-src/emacs/src/keyboard.c      /^readable_events (int 
flags)$/
+readline       c-src/etags.c   /^readline (linebuffer *lbp, FILE *stream)$/
+readline_internal      c-src/etags.c   /^readline_internal (linebuffer *lbp, 
register FILE /
+realloc        c-src/emacs/src/gmalloc.c       65
+realloc        c-src/emacs/src/gmalloc.c       69
+realloc        c-src/emacs/src/gmalloc.c       /^realloc (void *ptr, size_t 
size)$/
+realloc        c-src/emacs/src/gmalloc.c       1716
+reallochook    c-src/emacs/src/gmalloc.c       /^reallochook (void *ptr, 
size_t size)$/
+recent-keys    c-src/emacs/src/keyboard.c      /^DEFUN ("recent-keys", 
Frecent_keys, Srecent_keys, /
+recent_keys    c-src/emacs/src/keyboard.c      100
+recent_keys_index      c-src/emacs/src/keyboard.c      94
+record_asynch_buffer_change    c-src/emacs/src/keyboard.c      
/^record_asynch_buffer_change (void)$/
+record_auto_save       c-src/emacs/src/keyboard.c      /^record_auto_save 
(void)$/
+record_char    c-src/emacs/src/keyboard.c      /^record_char (Lisp_Object c)$/
+record_menu_key        c-src/emacs/src/keyboard.c      /^record_menu_key 
(Lisp_Object c)$/
+record_single_kboard_state     c-src/emacs/src/keyboard.c      
/^record_single_kboard_state ()$/
+record_xmalloc c-src/emacs/src/lisp.h  /^extern void *record_xmalloc (size_t) 
ATTRIBUTE_ALL/
+recover_top_level_message      c-src/emacs/src/keyboard.c      138
+recursion-depth        c-src/emacs/src/keyboard.c      /^DEFUN 
("recursion-depth", Frecursion_depth, Srecur/
+recursive-edit c-src/emacs/src/keyboard.c      /^DEFUN ("recursive-edit", 
Frecursive_edit, Srecursi/
+recursive_edit_1       c-src/emacs/src/keyboard.c      /^recursive_edit_1 
(void)$/
+recursive_edit_unwind  c-src/emacs/src/keyboard.c      /^recursive_edit_unwind 
(Lisp_Object buffer)$/
+reduce prol-src/natded.prolog  /^reduce((X^M)@N,L):-     % beta reduction$/
+reduce_subterm prol-src/natded.prolog  /^reduce_subterm(M,M2):-$/
+ref    cp-src/cfront.H 547
+ref::ref       cp-src/cfront.H /^      ref(TOK ba, Pexpr a, Pname b) : 
(ba,a,0) { this=0/
+refreshPort    pyt-src/server.py       /^    def refreshPort(self):$/
+reg_errcode_t  c.c     279
+reg_errcode_t  c-src/emacs/src/regex.h 323
+reg_syntax_t   c-src/emacs/src/regex.h 43
+regex  c-src/etags.c   219
+regex  make-src/Makefile       204
+regex  make-src/Makefile       207
+regex  make-src/Makefile       213
+regex  make-src/Makefile       216
+regex  make-src/Makefile       219
+regex_t        c-src/emacs/src/regex.h 416
+regex_tag_multiline    c-src/etags.c   /^regex_tag_multiline (void)$/
+regexfile      Makefile        /^regexfile: Makefile$/
+regexp c-src/etags.c   256
+regexp c-src/etags.c   268
+registerAction:        objcpp-src/SimpleCalc.M /^- registerAction:(SEL)action$/
+register_heapinfo      c-src/emacs/src/gmalloc.c       /^register_heapinfo 
(void)$/
+regmatch_t     c-src/emacs/src/regex.h 451
+regoff_t       c-src/emacs/src/regex.h 423
+regs   c-src/etags.c   263
+regs   cp-src/screen.cpp       16
+regs_allocated c-src/emacs/src/regex.h 379
+regset c-src/h.h       31
+regular_top_level_message      c-src/emacs/src/keyboard.c      143
+rehash_size    c-src/emacs/src/lisp.h  1835
+rehash_threshold       c-src/emacs/src/lisp.h  1839
+relative_filename      c-src/etags.c   /^relative_filename (char *file, char 
*dir)$/
+removeexp      prol-src/natded.prolog  /^removeexp(E,E,'NIL'):-!.$/
+reorder_modifiers      c-src/emacs/src/keyboard.c      /^reorder_modifiers 
(Lisp_Object symbol)$/
+replace        erl-src/lines.erl       /^replace(Lno, _, _) when Lno < 1 ->$/
+replace_nth    erl-src/lines.erl       /^replace_nth(1, [H|T], X) ->$/
+request        c.c     /^request request (a, b)$/
+requeued_events_pending_p      c-src/emacs/src/keyboard.c      
/^requeued_events_pending_p (void)$/
+required_argument      c-src/getopt.h  90
+reset-this-command-lengths     c-src/emacs/src/keyboard.c      /^DEFUN 
("reset-this-command-lengths", Freset_this_c/
+restore_getcjmp        c-src/emacs/src/keyboard.c      /^restore_getcjmp 
(sys_jmp_buf temp)$/
+restore_kboard_configuration   c-src/emacs/src/keyboard.c      
/^restore_kboard_configuration (int was_locked)$/
+return_to_command_loop c-src/emacs/src/keyboard.c      135
+reverse        erl-src/lists.erl       /^reverse(X) ->$/
+reverse        prol-src/natded.prolog  /^reverse([],Ws,Ws).$/
+revert:        objc-src/PackInsp.m     /^-revert:sender$/
+right  c-src/etags.c   216
+right_shift    cccp.y  /^right_shift (a, b)$/
+right_shift    y-src/cccp.y    /^right_shift (a, b)$/
+ring1  c.c     241
+ring2  c.c     242
+rm_eo  c-src/emacs/src/regex.h 450
+rm_so  c-src/emacs/src/regex.h 449
+rtint  c-src/h.h       60
+rtint  c-src/h.h       68
+rtstr  c-src/h.h       61
+rtstr  c-src/h.h       69
+rtunion_def    c-src/h.h       58
+rtunion_def    c-src/h.h       64
+rtx    c-src/h.h       62
+rtxnp  c-src/h.h       71
+rtxp   c-src/h.h       70
+s      c-src/emacs/src/lisp.h  4672
+s      c-src/emacs/src/lisp.h  4678
+s1     cp-src/c.C      32
+s1::counter    cp-src/c.C      33
+s2     cp-src/c.C      35
+s2::counter    cp-src/c.C      36
+safe_run_hook_funcall  c-src/emacs/src/keyboard.c      /^safe_run_hook_funcall 
(ptrdiff_t nargs, Lisp_Objec/
+safe_run_hooks c-src/emacs/src/keyboard.c      /^safe_run_hooks (Lisp_Object 
hook)$/
+safe_run_hooks_1       c-src/emacs/src/keyboard.c      /^safe_run_hooks_1 
(ptrdiff_t nargs, Lisp_Object *ar/
+safe_run_hooks_error   c-src/emacs/src/keyboard.c      /^safe_run_hooks_error 
(Lisp_Object error, ptrdiff_t/
+save   pyt-src/server.py       /^    def save(self):$/
+save   pyt-src/server.py       /^    def save(self):$/
+save   pyt-src/server.py       /^    def save(self):$/
+save_getcjmp   c-src/emacs/src/keyboard.c      /^save_getcjmp (sys_jmp_buf 
temp)$/
+save_type      c-src/emacs/src/lisp.h  /^save_type (struct Lisp_Save_Value *v, 
int n)$/
+savenstr       c-src/etags.c   /^savenstr (const char *cp, int len)$/
+savestr        c-src/etags.c   /^savestr (const char *cp)$/
+scan_separators        c-src/etags.c   /^scan_separators (char *name)$/
+scolonseen     c-src/etags.c   2447
+scratch        c-src/sysdep.h  56
+scroll_bar_parts       c-src/emacs/src/keyboard.c      5189
+sec=\relax     tex-src/texinfo.tex     /^\\let\\appendixsec=\\relax$/
+section        perl-src/htlmify-cystic 25
+section=\relax tex-src/texinfo.tex     /^\\let\\appendixsection=\\relax$/
+section_name   perl-src/htlmify-cystic 12
+section_toc    perl-src/htlmify-cystic 15
+select prol-src/natded.prolog  /^select(X,[X|Xs],Xs).$/
+select-tags-table      el-src/emacs/lisp/progmodes/etags.el    /^(defun 
select-tags-table ()$/
+select-tags-table-mode el-src/emacs/lisp/progmodes/etags.el    
/^(define-derived-mode select-tags-table-mode specia/
+select-tags-table-mode-map     el-src/emacs/lisp/progmodes/etags.el    
/^(defvar select-tags-table-mode-map ; Doc string?$/
+select-tags-table-quit el-src/emacs/lisp/progmodes/etags.el    /^(defun 
select-tags-table-quit ()$/
+select-tags-table-select       el-src/emacs/lisp/progmodes/etags.el    
/^(defun select-tags-table-select (button)$/
+select_last    prol-src/natded.prolog  /^select_last([X],X,[]).$/
+send:  objc-src/Subprocess.m   /^- send:(const char *)string$/
+send:withNewline:      objc-src/Subprocess.m   /^- send:(const char *)string 
withNewline:(BOOL)want/
+separator_names        c-src/emacs/src/keyboard.c      7372
+seq    erl-src/lists.erl       /^seq(Min, Max) when integer(Min), 
integer(Max), Min/
+serializeToVars        php-src/lce_functions.php       /^      function 
serializeToVars($prefix)$/
+serializeToVars        php-src/lce_functions.php       /^      function 
serializeToVars($prefix)$/
+set-input-interrupt-mode       c-src/emacs/src/keyboard.c      /^DEFUN 
("set-input-interrupt-mode", Fset_input_inte/
+set-input-meta-mode    c-src/emacs/src/keyboard.c      /^DEFUN 
("set-input-meta-mode", Fset_input_meta_mode/
+set-input-mode c-src/emacs/src/keyboard.c      /^DEFUN ("set-input-mode", 
Fset_input_mode, Sset_inp/
+set-output-flow-control        c-src/emacs/src/keyboard.c      /^DEFUN 
("set-output-flow-control", Fset_output_flow/
+set-quit-char  c-src/emacs/src/keyboard.c      /^DEFUN ("set-quit-char", 
Fset_quit_char, Sset_quit_/
+setDelegate:   objc-src/Subprocess.m   /^- setDelegate:anObject$/
+setRevertButtonTitle   objc-src/PackInsp.m     /^-setRevertButtonTitle$/
+set_char_table_contents        c-src/emacs/src/lisp.h  
/^set_char_table_contents (Lisp_Object table, ptrdif/
+set_char_table_defalt  c-src/emacs/src/lisp.h  /^set_char_table_defalt 
(Lisp_Object table, Lisp_Obj/
+set_char_table_extras  c-src/emacs/src/lisp.h  /^set_char_table_extras 
(Lisp_Object table, ptrdiff_/
+set_char_table_purpose c-src/emacs/src/lisp.h  /^set_char_table_purpose 
(Lisp_Object table, Lisp_Ob/
+set_hash_key_slot      c-src/emacs/src/lisp.h  /^set_hash_key_slot (struct 
Lisp_Hash_Table *h, ptrd/
+set_hash_value_slot    c-src/emacs/src/lisp.h  /^set_hash_value_slot (struct 
Lisp_Hash_Table *h, pt/
+set_overlay_plist      c-src/emacs/src/lisp.h  /^set_overlay_plist 
(Lisp_Object overlay, Lisp_Objec/
+set_poll_suppress_count        c-src/emacs/src/keyboard.c      
/^set_poll_suppress_count (int count)$/
+set_prop       c-src/emacs/src/keyboard.c      /^set_prop (ptrdiff_t idx, 
Lisp_Object val)$/
+set_save_integer       c-src/emacs/src/lisp.h  /^set_save_integer (Lisp_Object 
obj, int n, ptrdiff_/
+set_save_pointer       c-src/emacs/src/lisp.h  /^set_save_pointer (Lisp_Object 
obj, int n, void *va/
+set_string_intervals   c-src/emacs/src/lisp.h  /^set_string_intervals 
(Lisp_Object s, INTERVAL i)$/
+set_sub_char_table_contents    c-src/emacs/src/lisp.h  
/^set_sub_char_table_contents (Lisp_Object table, pt/
+set_symbol_function    c-src/emacs/src/lisp.h  /^set_symbol_function 
(Lisp_Object sym, Lisp_Object /
+set_symbol_next        c-src/emacs/src/lisp.h  /^set_symbol_next (Lisp_Object 
sym, struct Lisp_Symb/
+set_symbol_plist       c-src/emacs/src/lisp.h  /^set_symbol_plist (Lisp_Object 
sym, Lisp_Object pli/
+set_waiting_for_input  c-src/emacs/src/keyboard.c      /^set_waiting_for_input 
(struct timespec *time_to_cl/
+setref tex-src/texinfo.tex     
/^\\expandafter\\expandafter\\expandafter\\appendixsetre/
+shouldLoad     objc-src/PackInsp.m     /^-(BOOL)shouldLoad$/
+should_see_this_array_type     cp-src/c.C      156
+should_see_this_function_pointer       cp-src/c.C      153
+should_see_this_one_enclosed_in_extern_C       cp-src/c.C      149
+show   erl-src/gs_dialog.erl   /^show(Module, Title, Message, Args) ->$/
+showError      objc-src/Subprocess.m   /^showError (const char *errorString, 
id theDelegate/
+showInfo:      objc-src/PackInsp.m     /^-showInfo:sender$/
+show_help_echo c-src/emacs/src/keyboard.c      /^show_help_echo (Lisp_Object 
help, Lisp_Object wind/
+sig    c-src/emacs/src/keyboard.c      7238
+signal_handler c-src/h.h       82
+signal_handler1        c-src/h.h       83
+signal_handler_t       c-src/h.h       94
+simulation     html-src/software.html  /^Software that I wrote for supporting 
my research a/
+single_kboard  c-src/emacs/src/keyboard.c      89
+single_kboard_state    c-src/emacs/src/keyboard.c      /^single_kboard_state 
()$/
+site   cp-src/conway.hpp       5
+site::alive    cp-src/conway.hpp       7
+site::clear    cp-src/conway.hpp       /^    void clear(void) { alive = 0; }$/
+site::compute_next_state       cp-src/conway.hpp       /^    void 
compute_next_state(void)$/
+site::next_alive       cp-src/conway.hpp       7
+site::read     cp-src/conway.hpp       /^    char read() { return alive; }$/
+site::set      cp-src/conway.hpp       /^    void set(void) { alive = 1; }$/
+site::site     cp-src/conway.hpp       /^    site(int xi, int yi): x(xi), 
y(yi), alive(0) {/
+site::step     cp-src/conway.hpp       /^    void step(void) { alive = 
next_alive; }$/
+site::total_surrounding        cp-src/conway.cpp       /^int 
site::total_surrounding(void)$/
+site::x        cp-src/conway.hpp       7
+site::y        cp-src/conway.hpp       7
+size   c-src/etags.c   236
+size   c-src/etags.c   2522
+size   c-src/emacs/src/gmalloc.c       156
+size   c-src/emacs/src/gmalloc.c       163
+size   c-src/emacs/src/gmalloc.c       1862
+size   c-src/emacs/src/lisp.h  1364
+size   c-src/emacs/src/lisp.h  1390
+skeyseen       c-src/etags.c   2445
+skip_name      c-src/etags.c   /^skip_name (char *cp)$/
+skip_non_spaces        c-src/etags.c   /^skip_non_spaces (char *cp)$/
+skip_spaces    c-src/etags.c   /^skip_spaces (char *cp)$/
+slist  cp-src/cfront.H 718
+slist::add     cp-src/cfront.H /^      void    add(Pstmt s)    { tail->s_list 
= s; tail = s; }/
+slist::head    cp-src/cfront.H 719
+slist::slist   cp-src/cfront.H /^              slist(Pstmt s)  { Nl++; head = 
tail = s; };$/
+slist::tail    cp-src/cfront.H 720
+snarf-tag-function     el-src/emacs/lisp/progmodes/etags.el    /^(defvar 
snarf-tag-function nil$/
+snone  c-src/etags.c   2443
+some_mouse_moved       c-src/emacs/src/keyboard.c      /^some_mouse_moved 
(void)$/
+sort   erl-src/lists.erl       /^sort([X]) -> [X];$/
+space  tex-src/texinfo.tex     /^    {#2\\labelspace 
#1}\\dotfill\\doshortpageno{#3}}%/
+space  tex-src/texinfo.tex     /^  
\\dosubsubsecentry{#2.#3.#4.#5\\labelspace#1}{#6}}/
+specbind_tag   c-src/emacs/src/lisp.h  2943
+specbinding    c-src/emacs/src/lisp.h  2955
+specialsymbol  prol-src/natded.prolog  /^specialsymbol(C1,C2,S):-$/
+split_and_keysort      erl-src/lists.erl       /^split_and_keysort([A,B|T], X, 
Y, Index) ->$/
+split_and_sort erl-src/lists.erl       /^split_and_sort([A,B|T], X, Y) ->$/
+split_at       erl-src/lines.erl       /^split_at(Pos, L) ->$/
+splitexp       prol-src/natded.prolog  /^splitexp(E,E,('NIL','NIL')):-!.$/
+srclist        Makefile        /^srclist: Makefile$/
+ss3    c.c     255
+sss1   c.c     252
+sss2   c.c     253
+sstab  prol-src/natded.prolog  /^sstab(2,'C',',').$/
+st_C_attribute c-src/etags.c   2209
+st_C_class     c-src/etags.c   2212
+st_C_define    c-src/etags.c   2213
+st_C_enum      c-src/etags.c   2213
+st_C_extern    c-src/etags.c   2213
+st_C_gnumacro  c-src/etags.c   2208
+st_C_ignore    c-src/etags.c   2209
+st_C_javastruct        c-src/etags.c   2210
+st_C_objend    c-src/etags.c   2207
+st_C_objimpl   c-src/etags.c   2207
+st_C_objprot   c-src/etags.c   2207
+st_C_operator  c-src/etags.c   2211
+st_C_struct    c-src/etags.c   2213
+st_C_template  c-src/etags.c   2212
+st_C_typedef   c-src/etags.c   2213
+st_none        c-src/etags.c   2206
+stack  c.c     155
+stagseen       c-src/etags.c   2446
+start  c-src/emacs/src/regex.h 431
+start  c-src/emacs/src/keyboard.c      8753
+start  php-src/lce_functions.php       /^      function start($line, $class)$/
+start  y-src/cccp.y    143
+start_polling  c-src/emacs/src/keyboard.c      /^start_polling (void)$/
+start_up       prol-src/natded.prolog  /^start_up:-$/
+state_protected_p      c-src/emacs/src/gmalloc.c       400
+statetable     html-src/algrthms.html  /^Next$/
+step_everybody cp-src/clheir.cpp       /^void step_everybody(void)$/
+stmt   cp-src/cfront.H 615
+stmt::case_list        cp-src/cfront.H 636
+stmt::case_value       cp-src/cfront.H 624
+stmt::d        cp-src/cfront.H 621
+stmt::e        cp-src/cfront.H 628
+stmt::e2       cp-src/cfront.H 622
+stmt::else_stmt        cp-src/cfront.H 635
+stmt::empty    cp-src/cfront.H 637
+stmt::for_init cp-src/cfront.H 634
+stmt::has_default      cp-src/cfront.H 623
+stmt::memtbl   cp-src/cfront.H 632
+stmt::own_tbl  cp-src/cfront.H 629
+stmt::ret_tp   cp-src/cfront.H 625
+stmt::s        cp-src/cfront.H 617
+stmt::s2       cp-src/cfront.H 630
+stmt::s_list   cp-src/cfront.H 618
+stmt::where    cp-src/cfront.H 619
+stop_polling   c-src/emacs/src/keyboard.c      /^stop_polling (void)$/
+store_user_signal_events       c-src/emacs/src/keyboard.c      
/^store_user_signal_events (void)$/
+strcaseeq      c-src/etags.c   /^#define strcaseeq(s,t)        (assert 
((s)!=NULL && (t)!=/
+streq  c-src/etags.c   /^#define streq(s,t)    (assert ((s)!=NULL || (t)!=NULL/
+string_intervals       c-src/emacs/src/lisp.h  /^string_intervals (Lisp_Object 
s)$/
+stripLine      php-src/lce_functions.php       /^      function 
stripLine($line, $class)$/
+stripname      pas-src/common.pas      /^function stripname; (* ($/
+strncaseeq     c-src/etags.c   /^#define strncaseeq(s,t,n) (assert ((s)!=NULL 
&& (t/
+strneq c-src/etags.c   /^#define strneq(s,t,n) (assert ((s)!=NULL || (t)!=N/
+structdef      c-src/etags.c   2448
+stuff_buffered_input   c-src/emacs/src/keyboard.c      /^stuff_buffered_input 
(Lisp_Object stuffstring)$/
+sublist        erl-src/lists.erl       /^sublist(List, S, L) when L >= 0 ->$/
+subprocess:output:     objc-src/PackInsp.m     /^-subprocess:(Subprocess 
*)sender output:(char *)bu/
+subprocessDone:        objc-src/PackInsp.m     /^-subprocessDone:(Subprocess 
*)sender$/
+subsec=\relax  tex-src/texinfo.tex     /^\\let\\appendixsubsec=\\relax$/
+subsection     perl-src/htlmify-cystic 26
+subsection=\relax      tex-src/texinfo.tex     
/^\\let\\appendixsubsection=\\relax$/
+subsection_marker      perl-src/htlmify-cystic 161
+subst  prol-src/natded.prolog  /^subst(var(Y),var(X),M,N):-$/
+substitute     c-src/etags.c   /^substitute (char *in, char *out, struct 
re_registe/
+subsubsec=\relax       tex-src/texinfo.tex     
/^\\let\\appendixsubsubsec=\\relax$/
+subsubsection  perl-src/htlmify-cystic 27
+subsubsection=\relax   tex-src/texinfo.tex     
/^\\let\\appendixsubsubsection=\\relax$/
+subtree        prol-src/natded.prolog  /^subtree(T,T).$/
+suffix c-src/etags.c   186
+suffix erl-src/lists.erl       /^suffix(Suffix, Suffix) ->$/
+suffixes       c-src/etags.c   195
+suggest_asking_for_help        c-src/etags.c   /^suggest_asking_for_help 
(void)$/
+sum    erl-src/lists.erl       /^sum(L)          -> sum(L, 0).$/
+suspend-emacs  c-src/emacs/src/keyboard.c      /^DEFUN ("suspend-emacs", 
Fsuspend_emacs, Ssuspend_e/
+sval   cccp.y  117
+sval   y-src/cccp.y    116
+swallow_events c-src/emacs/src/keyboard.c      /^swallow_events (bool 
do_display)$/
+switch_line_buffers    c-src/etags.c   /^#define switch_line_buffers() (curndx 
= 1 - curndx/
+sxhash_combine c-src/emacs/src/lisp.h  /^sxhash_combine (EMACS_UINT x, 
EMACS_UINT y)$/
+sym_type       c-src/etags.c   2204
+symbol_interned        c-src/emacs/src/lisp.h  639
+symbol_name    c-src/emacs/src/lisp.h  1687
+symbol_redirect        c-src/emacs/src/lisp.h  646
+syms_of_abbrev c-src/abbrev.c  /^syms_of_abbrev ()$/
+syms_of_keyboard       c-src/emacs/src/keyboard.c      /^syms_of_keyboard 
(void)$/
+synchronize_system_messages_locale     c-src/emacs/src/lisp.h  /^INLINE void 
synchronize_system_messages_locale (vo/
+synchronize_system_time_locale c-src/emacs/src/lisp.h  /^INLINE void 
synchronize_system_time_locale (void) /
+syntax c-src/emacs/src/regex.h 350
+sys_jmp_buf    c-src/emacs/src/lisp.h  2906
+sys_jmp_buf    c-src/emacs/src/lisp.h  2910
+sys_jmp_buf    c-src/emacs/src/lisp.h  2916
+sys_longjmp    c-src/emacs/src/lisp.h  /^# define sys_longjmp(j, v) _longjmp 
(j, v)$/
+sys_longjmp    c-src/emacs/src/lisp.h  /^# define sys_longjmp(j, v) siglongjmp 
(j, v)$/
+sys_longjmp    c-src/emacs/src/lisp.h  /^# define sys_longjmp(j, v) longjmp 
(j, v)$/
+sys_setjmp     c-src/emacs/src/lisp.h  /^# define sys_setjmp(j) _setjmp (j)$/
+sys_setjmp     c-src/emacs/src/lisp.h  /^# define sys_setjmp(j) sigsetjmp (j, 
0)$/
+sys_setjmp     c-src/emacs/src/lisp.h  /^# define sys_setjmp(j) setjmp (j)$/
+syscall_error  c-src/sysdep.h  34
+t1     cp-src/c.C      34
+t2     cp-src/c.C      38
+tab_count_words        c-src/tab.c     /^int                   
tab_count_words(char **tab)$/
+tab_delete_first       c-src/tab.c     /^int                   
tab_delete_first(char **tab)$/
+tab_fill       c-src/tab.c     /^char                  **tab_fill(char *str, 
char delim)$/
+tab_free       c-src/tab.c     /^void                  tab_free(char **tab)$/
+table  cp-src/cfront.H 175
+table::entries cp-src/cfront.H 184
+table::free_slot       cp-src/cfront.H 183
+table::hashsize        cp-src/cfront.H 182
+table::hashtbl cp-src/cfront.H 185
+table::init_stat       cp-src/cfront.H 177
+table::max     cp-src/cfront.H /^      int     max()                   { 
return free_slot-1; };$/
+table::next    cp-src/cfront.H 189
+table::real_block      cp-src/cfront.H 186
+table::set_name        cp-src/cfront.H /^      void    set_name(Pname n)       
{ t_name = n; };$/
+table::set_scope       cp-src/cfront.H /^      void    set_scope(Ptable t)     
{ next = t; };$/
+table::size    cp-src/cfront.H 181
+table::t_name  cp-src/cfront.H 190
+tag-any-match-p        el-src/emacs/lisp/progmodes/etags.el    /^(defun 
tag-any-match-p (_tag)$/
+tag-exact-file-name-match-p    el-src/emacs/lisp/progmodes/etags.el    
/^(defun tag-exact-file-name-match-p (tag)$/
+tag-exact-match-p      el-src/emacs/lisp/progmodes/etags.el    /^(defun 
tag-exact-match-p (tag)$/
+tag-file-name-match-p  el-src/emacs/lisp/progmodes/etags.el    /^(defun 
tag-file-name-match-p (tag)$/
+tag-find-file-of-tag   el-src/emacs/lisp/progmodes/etags.el    /^(defun 
tag-find-file-of-tag (file) ; Doc string?$/
+tag-find-file-of-tag-noselect  el-src/emacs/lisp/progmodes/etags.el    
/^(defun tag-find-file-of-tag-noselect (file)$/
+tag-implicit-name-match-p      el-src/emacs/lisp/progmodes/etags.el    
/^(defun tag-implicit-name-match-p (tag)$/
+tag-lines-already-matched      el-src/emacs/lisp/progmodes/etags.el    
/^(defvar tag-lines-already-matched nil$/
+tag-partial-file-name-match-p  el-src/emacs/lisp/progmodes/etags.el    
/^(defun tag-partial-file-name-match-p (_tag)$/
+tag-re-match-p el-src/emacs/lisp/progmodes/etags.el    /^(defun tag-re-match-p 
(re)$/
+tag-symbol-match-p     el-src/emacs/lisp/progmodes/etags.el    /^(defun 
tag-symbol-match-p (tag)$/
+tag-word-match-p       el-src/emacs/lisp/progmodes/etags.el    /^(defun 
tag-word-match-p (tag)$/
+tag1   c-src/torture.c /^(*tag1 (sig, handler)) ()$/
+tag1   c-src/dostorture.c      /^(*tag1 (sig, handler)) ()$/
+tag1   c-src/h.h       110
+tag2   c-src/torture.c /^(*tag2 (sig, handler)) ()$/
+tag2   c-src/dostorture.c      /^(*tag2 (sig, handler)) ()$/
+tag3   c-src/torture.c /^(*tag3 (int sig, void (*handler) (int))) (int)$/
+tag3   c-src/dostorture.c      /^(*tag3 (int sig, void (*handler) (int))) 
(int)$/
+tag4   c-src/torture.c /^(*tag4 (int sig, void (*handler) (int))) (int)$/
+tag4   c-src/dostorture.c      /^(*tag4 (int sig, void (*handler) (int))) 
(int)$/
+tag5   c-src/torture.c /^tag5 (handler, arg)$/
+tag5   c-src/dostorture.c      /^tag5 (handler, arg)$/
+tag6   c-src/torture.c /^tag6 (void (*handler) (void *), void *arg)$/
+tag6   c-src/dostorture.c      /^tag6 (void (*handler) (void *), void *arg)$/
+tag_or_ch      c-src/emacs/src/lisp.h  3026
+taggedfname    c-src/etags.c   207
+tags-add-tables        el-src/emacs/lisp/progmodes/etags.el    /^(defcustom 
tags-add-tables 'ask-user$/
+tags-apropos   el-src/emacs/lisp/progmodes/etags.el    /^(defun tags-apropos 
(regexp)$/
+tags-apropos-additional-actions        el-src/emacs/lisp/progmodes/etags.el    
/^(defcustom tags-apropos-additional-actions nil$/
+tags-apropos-function  el-src/emacs/lisp/progmodes/etags.el    /^(defvar 
tags-apropos-function nil$/
+tags-apropos-verbose   el-src/emacs/lisp/progmodes/etags.el    /^(defcustom 
tags-apropos-verbose nil$/
+tags-case-fold-search  el-src/emacs/lisp/progmodes/etags.el    /^(defcustom 
tags-case-fold-search 'default$/
+tags-complete-tags-table-file  el-src/emacs/lisp/progmodes/etags.el    
/^(defun tags-complete-tags-table-file (string predi/
+tags-completion-at-point-function      el-src/emacs/lisp/progmodes/etags.el    
/^(defun tags-completion-at-point-function ()$/
+tags-completion-table  el-src/emacs/lisp/progmodes/etags.el    /^(defvar 
tags-completion-table nil$/
+tags-completion-table  el-src/emacs/lisp/progmodes/etags.el    /^(defun 
tags-completion-table ()$/
+tags-completion-table-function el-src/emacs/lisp/progmodes/etags.el    
/^(defvar tags-completion-table-function nil$/
+tags-compression-info-list     el-src/emacs/lisp/progmodes/etags.el    
/^(defcustom tags-compression-info-list$/
+tags-expand-table-name el-src/emacs/lisp/progmodes/etags.el    /^(defun 
tags-expand-table-name (file)$/
+tags-file-name el-src/emacs/lisp/progmodes/etags.el    /^(defvar 
tags-file-name nil$/
+tags-included-tables   el-src/emacs/lisp/progmodes/etags.el    /^(defvar 
tags-included-tables nil$/
+tags-included-tables   el-src/emacs/lisp/progmodes/etags.el    /^(defun 
tags-included-tables ()$/
+tags-included-tables-function  el-src/emacs/lisp/progmodes/etags.el    
/^(defvar tags-included-tables-function nil$/
+tags-lazy-completion-table     el-src/emacs/lisp/progmodes/etags.el    
/^(defun tags-lazy-completion-table ()$/
+tags-location-ring     el-src/emacs/lisp/progmodes/etags.el    /^(defvar 
tags-location-ring (make-ring xref-marker-/
+tags-loop-continue     el-src/emacs/lisp/progmodes/etags.el    /^(defun 
tags-loop-continue (&optional first-time)$/
+tags-loop-eval el-src/emacs/lisp/progmodes/etags.el    /^(defun tags-loop-eval 
(form)$/
+tags-loop-operate      el-src/emacs/lisp/progmodes/etags.el    /^(defvar 
tags-loop-operate nil$/
+tags-loop-revert-buffers       el-src/emacs/lisp/progmodes/etags.el    
/^(defcustom tags-loop-revert-buffers nil$/
+tags-loop-scan el-src/emacs/lisp/progmodes/etags.el    /^(defvar 
tags-loop-scan$/
+tags-next-table        el-src/emacs/lisp/progmodes/etags.el    /^(defun 
tags-next-table ()$/
+tags-query-replace     el-src/emacs/lisp/progmodes/etags.el    /^(defun 
tags-query-replace (from to &optional delim/
+tags-recognize-empty-tags-table        el-src/emacs/lisp/progmodes/etags.el    
/^(defun tags-recognize-empty-tags-table ()$/
+tags-reset-tags-tables el-src/emacs/lisp/progmodes/etags.el    /^(defun 
tags-reset-tags-tables ()$/
+tags-revert-without-query      el-src/emacs/lisp/progmodes/etags.el    
/^(defcustom tags-revert-without-query nil$/
+tags-search    el-src/emacs/lisp/progmodes/etags.el    /^(defun tags-search 
(regexp &optional file-list-for/
+tags-select-tags-table el-src/emacs/lisp/progmodes/etags.el    
/^(define-button-type 'tags-select-tags-table$/
+tags-table-check-computed-list el-src/emacs/lisp/progmodes/etags.el    
/^(defun tags-table-check-computed-list ()$/
+tags-table-computed-list       el-src/emacs/lisp/progmodes/etags.el    
/^(defvar tags-table-computed-list nil$/
+tags-table-computed-list-for   el-src/emacs/lisp/progmodes/etags.el    
/^(defvar tags-table-computed-list-for nil$/
+tags-table-extend-computed-list        el-src/emacs/lisp/progmodes/etags.el    
/^(defun tags-table-extend-computed-list ()$/
+tags-table-files       el-src/emacs/lisp/progmodes/etags.el    /^(defvar 
tags-table-files nil$/
+tags-table-files       el-src/emacs/lisp/progmodes/etags.el    /^(defun 
tags-table-files ()$/
+tags-table-files-function      el-src/emacs/lisp/progmodes/etags.el    
/^(defvar tags-table-files-function nil$/
+tags-table-format-functions    el-src/emacs/lisp/progmodes/etags.el    
/^(defvar tags-table-format-functions '(etags-recogn/
+tags-table-including   el-src/emacs/lisp/progmodes/etags.el    /^(defun 
tags-table-including (this-file core-only)$/
+tags-table-list        el-src/emacs/lisp/progmodes/etags.el    /^(defcustom 
tags-table-list nil$/
+tags-table-list-member el-src/emacs/lisp/progmodes/etags.el    /^(defun 
tags-table-list-member (file list)$/
+tags-table-list-pointer        el-src/emacs/lisp/progmodes/etags.el    
/^(defvar tags-table-list-pointer nil$/
+tags-table-list-started-at     el-src/emacs/lisp/progmodes/etags.el    
/^(defvar tags-table-list-started-at nil$/
+tags-table-mode        el-src/emacs/lisp/progmodes/etags.el    /^(defun 
tags-table-mode ()$/
+tags-table-set-list    el-src/emacs/lisp/progmodes/etags.el    /^(defvar 
tags-table-set-list nil$/
+tags-tag-face  el-src/emacs/lisp/progmodes/etags.el    /^(defcustom 
tags-tag-face 'default$/
+tags-verify-table      el-src/emacs/lisp/progmodes/etags.el    /^(defun 
tags-verify-table (file)$/
+tags-with-face el-src/emacs/lisp/progmodes/etags.el    /^(defmacro 
tags-with-face (face &rest body)$/
+target_multibyte       c-src/emacs/src/regex.h 407
+tcpdump        html-src/software.html  /^tcpdump$/
+temporarily_switch_to_single_kboard    c-src/emacs/src/keyboard.c      
/^temporarily_switch_to_single_kboard (struct frame /
+tend   c-src/etags.c   2432
+terminate:     objc-src/Subprocess.m   /^- terminate:sender$/
+terminateInput objc-src/Subprocess.m   /^- terminateInput$/
+test   c-src/emacs/src/lisp.h  1871
+test   cp-src/c.C      86
+test   erl-src/gs_dialog.erl   /^test() ->$/
+test   php-src/ptest.php       /^test $/
+test::dummy1   cp-src/burton.cpp       /^::dummy::dummy test::dummy1(void)$/
+test::dummy2   cp-src/burton.cpp       /^::dummy::dummy 
test::dummy2(::CORBA::Long dummy)$/
+test::dummy3   cp-src/burton.cpp       /^::dummy::dummy test::dummy3(char* 
name, ::CORBA::L/
+test::f        cp-src/c.C      /^  int f(){return 0;};         \/\/ first 
comment$/
+test::ff       cp-src/c.C      /^  int ff(){return 1;};$/
+test::g        cp-src/c.C      /^  int g(){return 2;};$/
+test_undefined c-src/emacs/src/keyboard.c      /^test_undefined (Lisp_Object 
binding)$/
+texpr  cp-src/cfront.H 527
+texpr::texpr   cp-src/cfront.H /^      texpr(TOK bb, Ptype tt, Pexpr ee) : 
(bb,ee,0) {th/
+text_expr      cp-src/cfront.H 551
+text_expr::text_expr   cp-src/cfront.H /^      text_expr(char* a, char* b) : 
(TEXT,0,0) { string/
+texttreelist   prol-src/natded.prolog  /^texttreelist([]).$/
+thing_to_list  erl-src/lists.erl       /^thing_to_list(X) when integer(X) -> 
integer_to_lis/
+this   c-src/a/b/b.c   1
+this-command-keys      c-src/emacs/src/keyboard.c      /^DEFUN 
("this-command-keys", Fthis_command_keys, St/
+this-command-keys-vector       c-src/emacs/src/keyboard.c      /^DEFUN 
("this-command-keys-vector", Fthis_command_k/
+this-single-command-keys       c-src/emacs/src/keyboard.c      /^DEFUN 
("this-single-command-keys", Fthis_single_co/
+this-single-command-raw-keys   c-src/emacs/src/keyboard.c      /^DEFUN 
("this-single-command-raw-keys", Fthis_singl/
+this_command_key_count c-src/emacs/src/keyboard.c      108
+this_command_key_count_reset   c-src/emacs/src/keyboard.c      112
+this_command_keys      c-src/emacs/src/keyboard.c      107
+this_file_toc  perl-src/htlmify-cystic 29
+this_single_command_key_start  c-src/emacs/src/keyboard.c      125
+tignore        c-src/etags.c   2433
+timer_check    c-src/emacs/src/keyboard.c      /^timer_check (void)$/
+timer_check_2  c-src/emacs/src/keyboard.c      /^timer_check_2 (Lisp_Object 
timers, Lisp_Object idl/
+timer_idleness_start_time      c-src/emacs/src/keyboard.c      335
+timer_last_idleness_start_time c-src/emacs/src/keyboard.c      340
+timer_resume_idle      c-src/emacs/src/keyboard.c      /^timer_resume_idle 
(void)$/
+timer_start_idle       c-src/emacs/src/keyboard.c      /^timer_start_idle 
(void)$/
+timer_stop_idle        c-src/emacs/src/keyboard.c      /^timer_stop_idle 
(void)$/
+timers_run     c-src/emacs/src/keyboard.c      320
+tinbody        c-src/etags.c   2431
+tkeyseen       c-src/etags.c   2429
+tnone  c-src/etags.c   2428
+toggleDescription      objc-src/PackInsp.m     /^-toggleDescription$/
+tok    c-src/etags.c   2491
+token  c-src/etags.c   2508
+token  cccp.y  437
+token  cccp.y  439
+token  y-src/cccp.y    437
+token  y-src/cccp.y    439
+tokenize       prol-src/natded.prolog  
/^tokenize([C1,C2,C3|Cs],Xs-Ys,TsResult):-     % spe/
+tokenizeatom   prol-src/natded.prolog  /^tokenizeatom(Atom,Ws):-$/
+tokentab2      cccp.y  442
+tokentab2      y-src/cccp.y    442
+tool_bar_item_properties       c-src/emacs/src/keyboard.c      7970
+tool_bar_items c-src/emacs/src/keyboard.c      /^tool_bar_items (Lisp_Object 
reuse, int *nitems)$/
+tool_bar_items_vector  c-src/emacs/src/keyboard.c      7965
+toolkit_menubar_in_use c-src/emacs/src/keyboard.c      
/^toolkit_menubar_in_use (struct frame *f)$/
+top-level      c-src/emacs/src/keyboard.c      /^DEFUN ("top-level", 
Ftop_level, Stop_level, 0, 0, /
+top_level_1    c-src/emacs/src/keyboard.c      /^top_level_1 (Lisp_Object 
ignore)$/
+top_level_2    c-src/emacs/src/keyboard.c      /^top_level_2 (void)$/
+total_keys     c-src/emacs/src/keyboard.c      97
+total_size_of_entries  c-src/etags.c   /^total_size_of_entries (register node 
*np)$/
+totally_unblock_input  c-src/emacs/src/keyboard.c      /^totally_unblock_input 
(void)$/
+tpcmd  c-src/h.h       8
+tpcmd  c-src/h.h       15
+track-mouse    c-src/emacs/src/keyboard.c      /^DEFUN 
("internal--track-mouse", Ftrack_mouse, Stra/
+tracking_off   c-src/emacs/src/keyboard.c      /^tracking_off (Lisp_Object 
old_value)$/
+traffic_light  cp-src/conway.cpp       /^void traffic_light(int x, int y)$/
+translate      c-src/emacs/src/regex.h 361
+tt     prol-src/natded.prolog  /^tt:-$/
+tt=cmtt10      tex-src/texinfo.tex     /^\\font\\deftt=cmtt10 scaled 
\\magstep1$/
+tty_read_avail_input   c-src/emacs/src/keyboard.c      /^tty_read_avail_input 
(struct terminal *terminal,$/
+ttypeseen      c-src/etags.c   2430
+typdef c-src/etags.c   2434
+type   c-src/etags.c   2271
+type   c-src/emacs/src/gmalloc.c       145
+type   c-src/emacs/src/lisp.h  2276
+type   c-src/emacs/src/lisp.h  2286
+type   c-src/emacs/src/lisp.h  2296
+type   c-src/emacs/src/lisp.h  2304
+type   c-src/emacs/src/lisp.h  2364
+type   c-src/emacs/src/lisp.h  3025
+type   cp-src/cfront.H 236
+type::addrof   cp-src/cfront.H /^inline Pptr type::addrof() { return new 
ptr(PTR,th/
+type::defined  cp-src/cfront.H 237
+type::integral cp-src/cfront.H /^      TOK     integral(TOK oo)        { 
return kind(oo,I); };$/
+type::num_ptr  cp-src/cfront.H /^      TOK     num_ptr(TOK oo)         { 
return kind(oo,P); };$/
+type::numeric  cp-src/cfront.H /^      TOK     numeric(TOK oo)         { 
return kind(oo,N); };$/
+typefunargs    tex-src/texinfo.tex     /^\\deftypefunargs {#3}\\endgroup %$/
+typefunargs    tex-src/texinfo.tex     /^\\deftypefunargs {#4}\\endgroup %$/
+typemargin     tex-src/texinfo.tex     /^\\newskip\\deftypemargin 
\\deftypemargin=12pt$/
+typemargin     tex-src/texinfo.tex     /^\\rlap{\\rightline{{\\rm #2}\\hskip 
\\deftypemargin}}}%/
+u      c-src/emacs/src/lisp.h  2397
+u_any  c-src/emacs/src/lisp.h  2214
+u_boolfwd      c-src/emacs/src/lisp.h  2371
+u_buffer_objfwd        c-src/emacs/src/lisp.h  2373
+u_finalizer    c-src/emacs/src/lisp.h  2219
+u_free c-src/emacs/src/lisp.h  2215
+u_intfwd       c-src/emacs/src/lisp.h  2370
+u_kboard_objfwd        c-src/emacs/src/lisp.h  2374
+u_marker       c-src/emacs/src/lisp.h  2216
+u_objfwd       c-src/emacs/src/lisp.h  2372
+u_overlay      c-src/emacs/src/lisp.h  2217
+u_save_value   c-src/emacs/src/lisp.h  2218
+unargs tex-src/texinfo.tex     /^\\defunargs {#2}\\endgroup %$/
+unargs tex-src/texinfo.tex     /^\\defunargs {#2}\\endgroup %$/
+unargs tex-src/texinfo.tex     /^\\defunargs {#2}\\endgroup %$/
+unargs tex-src/texinfo.tex     /^\\defunargs {#3}\\endgroup %$/
+unargs tex-src/texinfo.tex     /^\\defunargs {#3}\\endgroup %$/
+unblock_input  c-src/emacs/src/keyboard.c      /^unblock_input (void)$/
+unblock_input_to       c-src/emacs/src/keyboard.c      /^unblock_input_to (int 
level)$/
+unchar c-src/h.h       99
+unexpand-abbrev        c-src/abbrev.c  /^DEFUN ("unexpand-abbrev", 
Funexpand_abbrev, Sunexp/
+unread_switch_frame    c-src/emacs/src/keyboard.c      204
+unsignedp      cccp.y  113
+unsignedp      y-src/cccp.y    112
+uprintmax_t    c-src/emacs/src/lisp.h  149
+uprintmax_t    c-src/emacs/src/lisp.h  154
+usecharno      c-src/etags.c   210
+used   c-src/emacs/src/regex.h 347
+used_syntax    c-src/emacs/src/regex.h 398
+user_cmp_function      c-src/emacs/src/lisp.h  1814
+user_error     c-src/emacs/src/keyboard.c      /^user_error (const char *msg)$/
+user_hash_function     c-src/emacs/src/lisp.h  1811
+user_signal_info       c-src/emacs/src/keyboard.c      7235
+user_signals   c-src/emacs/src/keyboard.c      7250
+usfreelock_ptr/t       ada-src/etags-test-for.ada      /^   type 
usfreelock_ptr is access$/
+val    c-src/getopt.h  84
+val    c-src/emacs/src/lisp.h  691
+val    c-src/emacs/src/lisp.h  3027
+val    prol-src/natded.prolog  /^val(X) --> ['['], valseq(X), [']'].$/
+valcell        c-src/emacs/src/lisp.h  2357
+valid  c-src/etags.c   220
+valid  c-src/etags.c   2502
+validate       php-src/lce_functions.php       /^      function 
validate($value)$/
+validate       php-src/lce_functions.php       /^      function 
validate($value)$/
+valloc c-src/emacs/src/gmalloc.c       /^valloc (size_t size)$/
+valseq prol-src/natded.prolog  /^valseq([Val|Vals]) --> val(Val), 
plusvalseq(Vals)./
+value  c-src/emacs/src/lisp.h  687
+value  cccp.y  113
+value  y-src/cccp.y    112
+var    c-src/emacs/src/keyboard.c      11023
+var    c-src/emacs/src/lisp.h  3137
+varargs        tex-src/texinfo.tex     /^\\defvarargs {#3}\\endgroup %$/
+varargs        tex-src/texinfo.tex     /^\\defvarargs {#3}\\endgroup %$/
+varargs        tex-src/texinfo.tex     /^\\defvarargs {#2}\\endgroup %$/
+varargs        tex-src/texinfo.tex     /^\\defvarargs {#2}\\endgroup %$/
+vcopy  c-src/emacs/src/lisp.h  /^vcopy (Lisp_Object v, ptrdiff_t offset, 
Lisp_Objec/
+vec    cp-src/cfront.H 423
+vec::dim       cp-src/cfront.H 426
+vec::size      cp-src/cfront.H 427
+vec::vec       cp-src/cfront.H /^      vec(Ptype t, Pexpr e) { Nt++; base=VEC; 
typ=t; di/
+vectorlike_header      c-src/emacs/src/lisp.h  1343
+verify-tags-table-function     el-src/emacs/lisp/progmodes/etags.el    
/^(defvar verify-tags-table-function nil$/
+verify_ascii   c-src/emacs/src/lisp.h  /^# define verify_ascii(str) (str)$/
+vignore        c-src/etags.c   2417
+visit-tags-table       el-src/emacs/lisp/progmodes/etags.el    /^(defun 
visit-tags-table (file &optional local)$/
+visit-tags-table-buffer        el-src/emacs/lisp/progmodes/etags.el    
/^(defun visit-tags-table-buffer (&optional cont)$/
+void   c-src/emacs/src/lisp.h  /^INLINE void (check_cons_list) (void) { 
lisp_h_chec/
+voidfuncptr    c-src/emacs/src/lisp.h  2108
+voidval        cccp.y  116
+voidval        y-src/cccp.y    115
+wait_status_ptr_t      c.c     161
+waiting_for_input      c-src/emacs/src/keyboard.c      150
+warning        cccp.y  /^warning (msg)$/
+warning        y-src/cccp.y    /^warning (msg)$/
+weak   c-src/emacs/src/lisp.h  1830
+weak_alias     c-src/emacs/src/gmalloc.c       /^weak_alias (free, cfree)$/
+what   c-src/etags.c   252
+wheel_syms     c-src/emacs/src/keyboard.c      4628
+where  c-src/emacs/src/lisp.h  2348
+width  make-src/Makefile       186
+width  make-src/Makefile       189
+width  make-src/Makefile       192
+width  make-src/Makefile       195
+windowWillClose:       objcpp-src/SimpleCalc.M /^- windowWillClose:sender$/
+wipe_kboard    c-src/emacs/src/keyboard.c      /^wipe_kboard (KBOARD *kb)$/
+womboid        c-src/h.h       63
+womboid        c-src/h.h       75
+word_size      c-src/emacs/src/lisp.h  1473
+write  php-src/lce_functions.php       /^      function write()$/
+write  php-src/lce_functions.php       /^      function write($save="yes")$/
+write_abbrev   c-src/abbrev.c  /^write_abbrev (sym, stream)$/
+write_classname        c-src/etags.c   /^write_classname (linebuffer *cn, 
const char *quali/
+write_lex      prol-src/natded.prolog  /^write_lex(File):-$/
+write_lex_cat  prol-src/natded.prolog  /^write_lex_cat(File):-$/
+write_xyc      cp-src/screen.cpp       /^void write_xyc(int x, int y, char c)$/
+writebreak     prol-src/natded.prolog  /^writebreak([]).$/
+writebreaklex  prol-src/natded.prolog  /^writebreaklex([]).$/
+writecat       prol-src/natded.prolog  
/^writecat(np(ind(sng),nm(_)),np,[],[]):-!.$/
+writelist      prol-src/natded.prolog  /^writelist([der(Ws)|Ws2]):-$/
+writelistsubs  prol-src/natded.prolog  /^writelistsubs([],X):-$/
+writenamestring        pas-src/common.pas      /^procedure 
writenamestring;(*($/
+writesubs      prol-src/natded.prolog  /^writesubs([]).$/
+writesups      prol-src/natded.prolog  /^writesups([]).$/
+written        c-src/etags.c   211
+x      c.c     153
+x      c.c     179
+x      c.c     188
+x      c.c     189
+x      tex-src/texinfo.tex     /^\\refx{#1-snt}{} [\\printednodename], 
page\\tie\\refx{/
+x-get-selection-internal       c.c     /^DEFUN ("x-get-selection-internal", 
Fx_get_selectio/
+x-get-selection-internal       c.c     /^       Fx_get_selection_internal, 
Sx_get_selection/
+xcar_addr      c-src/emacs/src/lisp.h  /^xcar_addr (Lisp_Object c)$/
+xcdr_addr      c-src/emacs/src/lisp.h  /^xcdr_addr (Lisp_Object c)$/
+xmalloc        c-src/etags.c   /^xmalloc (size_t size)$/
+xnew   c-src/etags.c   /^#define xnew(n, Type)      ((Type *) xmalloc ((n) /
+xrealloc       c-src/etags.c   /^xrealloc (void *ptr, size_t size)$/
+xref-etags-location    el-src/emacs/lisp/progmodes/etags.el    /^(defclass 
xref-etags-location (xref-location)$/
+xref-location-line     el-src/emacs/lisp/progmodes/etags.el    /^(cl-defmethod 
xref-location-line ((l xref-etags-lo/
+xref-location-marker   el-src/emacs/lisp/progmodes/etags.el    /^(cl-defmethod 
xref-location-marker ((l xref-etags-/
+xref-make-etags-location       el-src/emacs/lisp/progmodes/etags.el    
/^(defun xref-make-etags-location (tag-info file)$/
+xrnew  c-src/etags.c   /^#define xrnew(op, n, Type) ((op) = (Type *) xreall/
+xx     Makefile        /^xx="this line is here because of a fontlock bug$/
+y-get-selection-internal       c.c     /^      Fy_get_selection_internal, 
Sy_get_selection_/
+yyalloc        /usr/share/bison/bison.simple   83
+yyalloc        /usr/share/bison/bison.simple   83
+yycheck        parse.y 330
+yycheck        cccp.y  301
+yyclearin      /usr/share/bison/bison.simple   149
+yyclearin      /usr/share/bison/bison.simple   149
+yydebug        /usr/share/bison/bison.simple   237
+yydebug        /usr/share/bison/bison.simple   237
+yydefact       parse.y 219
+yydefact       cccp.y  239
+yydefgoto      parse.y 237
+yydefgoto      cccp.y  251
+yyerrhandle    /usr/share/bison/bison.simple   848
+yyerrhandle    /usr/share/bison/bison.simple   848
+yyerrlab1      /usr/share/bison/bison.simple   823
+yyerrlab1      /usr/share/bison/bison.simple   823
+yyerrok        /usr/share/bison/bison.simple   148
+yyerrok        /usr/share/bison/bison.simple   148
+yyerror        cccp.y  /^yyerror (s)$/
+yyerror        y-src/cccp.y    /^yyerror (s)$/
+yyerrstatus    /usr/share/bison/bison.simple   846
+yyerrstatus    /usr/share/bison/bison.simple   846
+yylex  cccp.y  /^yylex ()$/
+yylex  y-src/cccp.y    /^yylex ()$/
+yyls   /usr/share/bison/bison.simple   88
+yyls   /usr/share/bison/bison.simple   88
+yylsp  /usr/share/bison/bison.simple   748
+yylsp  /usr/share/bison/bison.simple   921
+yylsp  /usr/share/bison/bison.simple   748
+yylsp  /usr/share/bison/bison.simple   921
+yymemcpy       /usr/share/bison/bison.simple   264
+yymemcpy       /usr/share/bison/bison.simple   /^yymemcpy (char *yyto, const 
char *yyfrom, YYSIZE_T/
+yymemcpy       /usr/share/bison/bison.simple   264
+yymemcpy       /usr/share/bison/bison.simple   /^yymemcpy (char *yyto, const 
char *yyfrom, YYSIZE_T/
+yyn    /usr/share/bison/bison.simple   755
+yyn    /usr/share/bison/bison.simple   861
+yyn    /usr/share/bison/bison.simple   895
+yyn    /usr/share/bison/bison.simple   903
+yyn    /usr/share/bison/bison.simple   755
+yyn    /usr/share/bison/bison.simple   861
+yyn    /usr/share/bison/bison.simple   895
+yyn    /usr/share/bison/bison.simple   903
+yynewstate     /usr/share/bison/bison.simple   763
+yynewstate     /usr/share/bison/bison.simple   925
+yynewstate     /usr/share/bison/bison.simple   763
+yynewstate     /usr/share/bison/bison.simple   925
+yypact parse.y 242
+yypact cccp.y  256
+yyparse        /usr/share/bison/bison.simple   /^yyparse (YYPARSE_PARAM_ARG)$/
+yyparse        /usr/share/bison/bison.simple   /^yyparse (YYPARSE_PARAM_ARG)$/
+yypgoto        parse.y 260
+yypgoto        cccp.y  268
+yyprhs parse.y 134
+yyprhs cccp.y  167
+yyr1   parse.y 197
+yyr1   cccp.y  219
+yyr2   parse.y 207
+yyr2   cccp.y  228
+yyresult       /usr/share/bison/bison.simple   932
+yyresult       /usr/share/bison/bison.simple   939
+yyresult       /usr/share/bison/bison.simple   947
+yyresult       /usr/share/bison/bison.simple   932
+yyresult       /usr/share/bison/bison.simple   939
+yyresult       /usr/share/bison/bison.simple   947
+yyreturn       /usr/share/bison/bison.simple   933
+yyreturn       /usr/share/bison/bison.simple   940
+yyreturn       /usr/share/bison/bison.simple   933
+yyreturn       /usr/share/bison/bison.simple   940
+yyrhs  parse.y 142
+yyrhs  cccp.y  174
+yyrline        parse.y 171
+yyrline        cccp.y  195
+yyss   /usr/share/bison/bison.simple   85
+yyss   /usr/share/bison/bison.simple   85
+yystate        /usr/share/bison/bison.simple   757
+yystate        /usr/share/bison/bison.simple   761
+yystate        /usr/share/bison/bison.simple   875
+yystate        /usr/share/bison/bison.simple   924
+yystate        /usr/share/bison/bison.simple   757
+yystate        /usr/share/bison/bison.simple   761
+yystate        /usr/share/bison/bison.simple   875
+yystate        /usr/share/bison/bison.simple   924
+yystpcpy       /usr/share/bison/bison.simple   316
+yystpcpy       /usr/share/bison/bison.simple   /^yystpcpy (char *yydest, const 
char *yysrc)$/
+yystpcpy       /usr/share/bison/bison.simple   316
+yystpcpy       /usr/share/bison/bison.simple   /^yystpcpy (char *yydest, const 
char *yysrc)$/
+yystrlen       /usr/share/bison/bison.simple   293
+yystrlen       /usr/share/bison/bison.simple   /^yystrlen (const char *yystr)$/
+yystrlen       /usr/share/bison/bison.simple   293
+yystrlen       /usr/share/bison/bison.simple   /^yystrlen (const char *yystr)$/
+yystype        cccp.y  118
+yytable        parse.y 269
+yytable        cccp.y  277
+yytname        parse.y 185
+yytname        cccp.y  208
+yytranslate    parse.y 101
+yytranslate    cccp.y  135
+yyvs   /usr/share/bison/bison.simple   86
+yyvs   /usr/share/bison/bison.simple   86
+yyvsp  /usr/share/bison/bison.simple   746
+yyvsp  /usr/share/bison/bison.simple   919
+yyvsp  /usr/share/bison/bison.simple   746
+yyvsp  /usr/share/bison/bison.simple   919
+z      c.c     144
+z      c.c     164
+zf     erl-src/lists.erl       /^zf(F, As, [H|T]) ->$/
+|      tex-src/texinfo.tex     /^\\def|{{\\tt \\char '174}}$/
+~      tex-src/texinfo.tex     /^\\def~{{\\tt \\char '176}}$/
diff --git a/test/etags/ETAGS.good_1 b/test/etags/ETAGS.good_1
new file mode 100644
index 0000000..95bb70c
--- /dev/null
+++ b/test/etags/ETAGS.good_1
@@ -0,0 +1,5214 @@
+
+Makefile,701
+ADASRC=1,0
+ASRC=2,91
+CSRC=3,139
+CPSRC=7,410
+ELSRC=10,624
+ERLSRC=11,694
+FORTHSRC=12,759
+FSRC=13,809
+HTMLSRC=14,881
+JAVASRC=15,974
+LUASRC=16,1062
+MAKESRC=17,1105
+OBJCSRC=18,1147
+OBJCPPSRC=19,1228
+PASSRC=20,1291
+PERLSRC=21,1333
+PHPSRC=22,1413
+PSSRC=23,1485
+PROLSRC=24,1525
+PYTSRC=25,1587
+TEXSRC=26,1628
+YSRC=27,1707
+SRCS=28,1772
+NONSRCS=32,2024
+ETAGS_PROG=34,2098
+CTAGS_PROG=35,2129
+REGEX=37,2161
+xx=38,2207
+RUN=40,2256
+OPTIONS=42,2262
+ARGS=43,2314
+infiles 45,2332
+check:check47,2394
+ediff%:ediff%55,2697
+cdiff:cdiff58,2798
+ETAGS:ETAGS61,2895
+CTAGS:CTAGS64,2965
+srclist:srclist67,3043
+regexfile:regexfile71,3134
+.PRECIOUS:.PRECIOUS77,3311
+FRC:FRC79,3345
+
+ada-src/etags-test-for.ada,1969
+   type LL_Task_Procedure_Access LL_Task_Procedure_Access/t1,0
+   function Body_RequiredBody_Required/f3,78
+   type Type_Specific_Data Type_Specific_Data/t11,280
+   function "abs"abs/f19,504
+   type Barrier_Function_Pointer Barrier_Function_Pointer/t21,577
+   function "="=/f27,722
+   type usfreelock_ptr usfreelock_ptr/t30,803
+   function p p/f33,891
+   procedure LL_Wrapper LL_Wrapper/p37,1054
+function p p/f39,1094
+package Pkg1 Pkg1/s44,1203
+  type Private_T Private_T/t46,1220
+  package Inner1 Inner1/s48,1250
+    procedure Private_T;Private_T/p49,1270
+  package Inner2 Inner2/s52,1310
+    task Private_T;Private_T/k53,1330
+  type Public_T Public_T/t56,1365
+  procedure Pkg1_Proc1;Pkg1_Proc1/p62,1450
+  procedure Pkg1_Proc2 Pkg1_Proc2/p64,1475
+  function Pkg1_Func1 Pkg1_Func1/f66,1514
+  function Pkg1_Func2 Pkg1_Func2/f68,1553
+  package Pkg1_Pkg1 Pkg1_Pkg1/s71,1622
+    procedure Pkg1_Pkg1_Proc1;Pkg1_Pkg1_Proc1/p72,1645
+  task type Task_Type Task_Type/k75,1694
+  type Private_T Private_T/t82,1786
+package body Pkg1 Pkg1/b89,1882
+  procedure Pkg1_Proc1 Pkg1_Proc1/p91,1904
+  package body Inner1 Inner1/b96,1956
+    procedure Private_T Private_T/p97,1981
+  package body Inner2 Inner2/b103,2054
+    task body Private_T Private_T/b104,2079
+  task body Task_Type Task_Type/b112,2181
+  procedure Pkg1_Proc2 Pkg1_Proc2/p126,2367
+  function Pkg1_Func1 Pkg1_Func1/f132,2445
+  function Pkg1_Func2 Pkg1_Func2/f134,2496
+  package body Pkg1_Pkg1 Pkg1_Pkg1/b140,2596
+package body Pkg1_Pkg1 Pkg1_Pkg1/b146,2663
+  procedure Pkg1_Pkg1_Proc1 Pkg1_Pkg1_Proc1/p147,2689
+function  Pkg1_Func1 Pkg1_Func1/f155,2778
+package Truc Truc/s162,2887
+package Truc.Bidule Truc.Bidule/s166,2929
+  protected Bidule Bidule/t168,2953
+  protected type Machin_T Machin_T/t172,3007
+package body Truc.Bidule Truc.Bidule/b178,3087
+  protected body Bidule Bidule/b179,3115
+  protected Machin_T Machin_T/t186,3207
+
+ada-src/2ataspri.adb,2190
+package body System.Task_Primitives System.Task_Primitives/b64,2603
+   package RTE RTE/s69,2712
+   package TSL TSL/s70,2759
+   function To_void_ptr To_void_ptr/f86,3287
+   function To_TCB_Ptr To_TCB_Ptr/f89,3366
+   function 
pthread_mutexattr_setprotocolpthread_mutexattr_setprotocol/f92,3444
+   function 
pthread_mutexattr_setprio_ceilingpthread_mutexattr_setprio_ceiling/f99,3728
+   procedure Abort_WrapperAbort_Wrapper/p115,4302
+   procedure LL_Wrapper LL_Wrapper/p122,4526
+   procedure Initialize_LL_Tasks Initialize_LL_Tasks/p131,4830
+   function Self Self/f160,5586
+   procedure Initialize_LockInitialize_Lock/p174,5958
+   procedure Finalize_Lock Finalize_Lock/p210,6927
+   procedure Write_Lock Write_Lock/p226,7338
+   procedure Read_Lock Read_Lock/p239,7700
+   procedure Unlock Unlock/p246,7850
+   procedure Initialize_Cond Initialize_Cond/p258,8160
+   procedure Finalize_Cond Finalize_Cond/p286,8979
+   procedure Cond_Wait Cond_Wait/p300,9303
+   procedure Cond_Timed_WaitCond_Timed_Wait/p312,9661
+   procedure Cond_Signal Cond_Signal/p343,10510
+   procedure Set_PrioritySet_Priority/p355,10836
+   procedure Set_Own_Priority Set_Own_Priority/p372,11243
+   function Get_Priority Get_Priority/f385,11598
+   function Get_Own_Priority Get_Own_Priority/f398,12023
+   procedure Create_LL_TaskCreate_LL_Task/p412,12438
+      function To_Start_Addr To_Start_Addr/f426,12873
+   procedure Exit_LL_Task Exit_LL_Task/p491,14995
+   procedure Abort_Task Abort_Task/p500,15158
+   procedure Test_Abort Test_Abort/p518,15716
+   procedure Install_Abort_Handler Install_Abort_Handler/p527,15878
+   procedure Abort_WrapperAbort_Wrapper/p557,16939
+      function Address_To_Call_State Address_To_Call_State/f562,17062
+   procedure Install_Error_Handler Install_Error_Handler/p573,17351
+   procedure LL_Assert LL_Assert/p599,18146
+   procedure LL_Wrapper LL_Wrapper/p608,18299
+   procedure Initialize_TAS_Cell Initialize_TAS_Cell/p630,19010
+   procedure Finalize_TAS_Cell Finalize_TAS_Cell/p635,19129
+   procedure Clear Clear/p640,19236
+   procedure Test_And_Set Test_And_Set/p645,19330
+   function  Is_Set Is_Set/f659,19676
+
+ada-src/2ataspri.ads,2313
+package System.Task_Primitives System.Task_Primitives/s58,3169
+   type LL_Task_Procedure_Access LL_Task_Procedure_Access/t62,3253
+   type Pre_Call_State Pre_Call_State/t64,3331
+   type Task_Storage_Size Task_Storage_Size/t66,3378
+   type Machine_Exceptions Machine_Exceptions/t68,3433
+   type Error_Information Error_Information/t70,3499
+   type Lock Lock/t72,3569
+   type Condition_Variable Condition_Variable/t73,3594
+   type Task_Control_Block Task_Control_Block/t81,3955
+   type TCB_Ptr TCB_Ptr/t89,4241
+   function Address_To_TCB_Ptr Address_To_TCB_Ptr/f93,4333
+   procedure Initialize_LL_Tasks Initialize_LL_Tasks/p96,4425
+   function Self Self/f100,4602
+   procedure Initialize_Lock Initialize_Lock/p103,4707
+   procedure Finalize_Lock Finalize_Lock/p107,4879
+   procedure Write_Lock Write_Lock/p111,5034
+   procedure Read_Lock Read_Lock/p118,5428
+   procedure Unlock Unlock/p128,5995
+   procedure Initialize_Cond Initialize_Cond/p135,6300
+   procedure Finalize_Cond Finalize_Cond/p138,6413
+   procedure Cond_Wait Cond_Wait/p142,6591
+   procedure Cond_Timed_WaitCond_Timed_Wait/p155,7396
+   procedure Cond_Signal Cond_Signal/p164,7812
+   procedure Set_Priority Set_Priority/p169,8040
+   procedure Set_Own_Priority Set_Own_Priority/p173,8200
+   function Get_Priority Get_Priority/f177,8348
+   function Get_Own_Priority Get_Own_Priority/f181,8504
+   procedure Create_LL_TaskCreate_LL_Task/p185,8647
+   procedure Exit_LL_Task;Exit_LL_Task/p198,9282
+   procedure Abort_Task Abort_Task/p203,9516
+   procedure Test_Abort;Test_Abort/p210,9878
+   type Abort_Handler_Pointer Abort_Handler_Pointer/t217,10233
+   procedure Install_Abort_Handler Install_Abort_Handler/p219,10312
+   procedure Install_Error_Handler Install_Error_Handler/p226,10741
+   procedure LL_Assert LL_Assert/p231,10983
+   type Proc Proc/t238,11240
+   type TAS_Cell TAS_Cell/t242,11328
+   procedure Initialize_TAS_Cell Initialize_TAS_Cell/p249,11670
+   procedure Finalize_TAS_Cell Finalize_TAS_Cell/p255,11941
+   procedure Clear Clear/p260,12157
+   procedure Test_And_Set Test_And_Set/p267,12462
+   function  Is_Set Is_Set/f275,12877
+   type Lock Lock/t283,13155
+   type Condition_Variable Condition_Variable/t288,13267
+   type TAS_Cell TAS_Cell/t293,13389
+
+ada-src/waroquiers.ada,1503
+package Pkg1 Pkg1/s3,89
+  type Private_T Private_T/t5,106
+  package Inner1 Inner1/s7,136
+    procedure Private_T;Private_T/p8,156
+  package Inner2 Inner2/s11,196
+    task Private_T;Private_T/k12,216
+  type Public_T Public_T/t15,251
+  procedure Pkg1_Proc1;Pkg1_Proc1/p21,336
+  procedure Pkg1_Proc2 Pkg1_Proc2/p23,361
+  function Pkg1_Func1 Pkg1_Func1/f25,400
+  function Pkg1_Func2 Pkg1_Func2/f27,439
+  package Pkg1_Pkg1 Pkg1_Pkg1/s30,508
+    procedure Pkg1_Pkg1_Proc1;Pkg1_Pkg1_Proc1/p31,531
+  task type Task_Type Task_Type/k34,580
+  type Private_T Private_T/t40,671
+package body Pkg1 Pkg1/b46,766
+  procedure Pkg1_Proc1 Pkg1_Proc1/p48,788
+  package body Inner1 Inner1/b53,840
+    procedure Private_T Private_T/p54,865
+  package body Inner2 Inner2/b60,938
+    task body Private_T Private_T/b61,963
+  task body Task_Type Task_Type/b68,1064
+  procedure Pkg1_Proc2 Pkg1_Proc2/p82,1250
+  function Pkg1_Func1 Pkg1_Func1/f88,1328
+  function Pkg1_Func2 Pkg1_Func2/f90,1379
+  package body Pkg1_Pkg1 Pkg1_Pkg1/b96,1479
+package body Pkg1_Pkg1 Pkg1_Pkg1/b100,1544
+  procedure Pkg1_Pkg1_Proc1 Pkg1_Pkg1_Proc1/p101,1570
+function  Pkg1_Func1 Pkg1_Func1/f107,1657
+package Truc Truc/s112,1764
+package Truc.Bidule Truc.Bidule/s116,1816
+  protected Bidule Bidule/t125,1964
+  protected type Machin_T Machin_T/t131,2046
+package body Truc.Bidule Truc.Bidule/b138,2153
+  protected body Bidule Bidule/b139,2181
+  protected body Machin_T Machin_T/b146,2281
+
+c-src/abbrev.c,1432
+Lisp_Object Vabbrev_table_name_list;42,1416
+Lisp_Object Vglobal_abbrev_table;47,1561
+Lisp_Object Vfundamental_mode_abbrev_table;51,1672
+int abbrevs_changed;55,1773
+int abbrev_all_caps;57,1795
+Lisp_Object Vabbrev_start_location;62,1944
+Lisp_Object Vabbrev_start_location_buffer;65,2033
+Lisp_Object Vlast_abbrev;69,2142
+Lisp_Object Vlast_abbrev_text;74,2311
+int last_abbrev_point;78,2401
+Lisp_Object Vpre_abbrev_expand_hook,82,2474
+Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;82,2474
+DEFUN ("make-abbrev-table", Fmake_abbrev_table,make-abbrev-table84,2538
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table,clear-abbrev-table91,2730
+DEFUN ("define-abbrev", Fdefine_abbrev,define-abbrev106,3111
+DEFUN ("define-global-abbrev", 
Fdefine_global_abbrev,define-global-abbrev148,4430
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,define-mode-abbrev159,4801
+DEFUN ("abbrev-symbol", Fabbrev_symbol,abbrev-symbol173,5269
+DEFUN ("abbrev-expansion", Fabbrev_expansion,abbrev-expansion201,6233
+DEFUN ("expand-abbrev", Fexpand_abbrev,expand-abbrev217,6748
+DEFUN ("unexpand-abbrev", Funexpand_abbrev,unexpand-abbrev388,11669
+write_abbrev 425,12876
+describe_abbrev 444,13311
+DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,insert-abbrev-table-description465,13826
+DEFUN ("define-abbrev-table", 
Fdefine_abbrev_table,define-abbrev-table505,14982
+syms_of_abbrev 539,16059
+
+c-src/torture.c,197
+(*tag1 tag118,452
+#define notag2 26,553
+(*tag2 tag229,630
+(*tag3 tag339,772
+#define notag4 45,861
+(*tag4 tag448,955
+tag5 57,1081
+tag6 66,1208
+int pp1(74,1317
+pp287,1419
+pp3(100,1518
+
+c-src/getopt.h,147
+#define _GETOPT_H 19,801
+struct option73,2797
+#define        no_argument     89,3124
+#define required_argument      90,3147
+#define optional_argument      91,3175
+
+c-src/etags.c,10045
+char pot_etags_version[pot_etags_version81,3470
+#  undef DEBUG84,3552
+#  define DEBUG 85,3567
+#  define DEBUG 87,3594
+#  define NDEBUG       88,3617
+# define _GNU_SOURCE 94,3705
+# undef MSDOS100,3876
+# undef  WINDOWSNT101,3890
+# define WINDOWSNT102,3909
+# undef MSDOS106,3968
+# define MSDOS 107,3982
+# define MSDOS 110,4032
+# define MAXPATHLEN 115,4111
+# undef HAVE_NTGUI116,4141
+# undef  DOS_NT117,4160
+# define DOS_NT118,4176
+# undef  assert        135,4482
+# define assert(136,4541
+# undef  CTAGS146,4857
+# define CTAGS 147,4872
+# define CTAGS 149,4898
+#define streq(152,4927
+#define strcaseeq(153,4996
+#define strneq(154,5075
+#define strncaseeq(155,5151
+#define CHARS 157,5238
+#define CHAR(158,5278
+#define        iswhite(159,5329
+#define notinname(160,5394
+#define        begtoken(161,5469
+#define        intoken(162,5542
+#define        endtoken(163,5614
+#define ISALNUM(165,5684
+#define ISALPHA(166,5722
+#define ISDIGIT(167,5760
+#define ISLOWER(168,5798
+#define lowcase(170,5837
+#define xnew(179,6015
+#define xrnew(180,6083
+typedef void Lang_function 182,6164
+} compressor;188,6365
+} language;199,6835
+typedef struct fdesc201,6848
+} fdesc;212,7366
+typedef struct node_st214,7376
+} node;225,7894
+} linebuffer;239,8248
+    at_language,245,8344
+    at_regexp,246,8393
+    at_filename,247,8437
+    at_stdin,248,8473
+    at_end     249,8516
+} argument;253,8698
+typedef struct regexp256,8758
+} regexp;268,9325
+static void error 311,10780
+# undef STDIN408,15073
+#define STDIN 411,15095
+static compressor compressors[compressors457,17664
+static const char *Ada_suffixes Ada_suffixes473,17907
+static const char Ada_help 475,17977
+static const char *Asm_suffixes Asm_suffixes493,18580
+static const char Asm_help 504,18976
+static const char *default_C_suffixes default_C_suffixes512,19312
+static const char default_C_help 515,19413
+static const char default_C_help 523,19850
+static const char *Cplusplus_suffixes Cplusplus_suffixes535,20460
+static const char Cplusplus_help 540,20658
+static const char *Cjava_suffixes Cjava_suffixes549,21113
+static char Cjava_help 551,21172
+static const char *Cobol_suffixes Cobol_suffixes556,21337
+static char Cobol_help 558,21402
+static const char *Cstar_suffixes Cstar_suffixes562,21543
+static const char *Erlang_suffixes Erlang_suffixes565,21607
+static const char Erlang_help 567,21673
+const char *Forth_suffixes Forth_suffixes571,21799
+static const char Forth_help 573,21857
+static const char *Fortran_suffixes Fortran_suffixes577,22008
+static const char Fortran_help 579,22085
+static const char *HTML_suffixes HTML_suffixes582,22190
+static const char HTML_help 584,22264
+static const char *Lisp_suffixes Lisp_suffixes589,22452
+static const char Lisp_help 591,22556
+static const char *Lua_suffixes Lua_suffixes598,22871
+static const char Lua_help 600,22934
+static const char *Makefile_filenames Makefile_filenames603,23010
+static const char Makefile_help 605,23133
+static const char *Objc_suffixes Objc_suffixes609,23277
+static const char Objc_help 613,23399
+static const char *Pascal_suffixes Pascal_suffixes619,23714
+static const char Pascal_help 621,23778
+static const char *Perl_suffixes Perl_suffixes626,23966
+static const char *Perl_interpreters Perl_interpreters628,24028
+static const char Perl_help 630,24100
+static const char *PHP_suffixes PHP_suffixes637,24451
+static const char PHP_help 639,24523
+static const char *plain_C_suffixes plain_C_suffixes643,24678
+static const char *PS_suffixes PS_suffixes647,24762
+static const char PS_help 649,24848
+static const char *Prolog_suffixes Prolog_suffixes652,24931
+static const char Prolog_help 654,24993
+static const char *Python_suffixes Python_suffixes658,25107
+static const char Python_help 660,25165
+static const char *Scheme_suffixes Scheme_suffixes665,25347
+static const char Scheme_help 667,25460
+static const char *TeX_suffixes TeX_suffixes672,25683
+static const char TeX_help 674,25781
+static const char *Texinfo_suffixes Texinfo_suffixes686,26316
+static const char Texinfo_help 688,26395
+static const char *Yacc_suffixes Yacc_suffixes691,26492
+static const char Yacc_help 693,26606
+static const char auto_help 699,26856
+static const char none_help 703,27020
+static const char no_lang_help 707,27143
+static language lang_names 718,27355
+print_language_names 753,29532
+# define EMACS_NAME 786,30755
+# define VERSION 789,30811
+print_version 792,30869
+# define PRINT_UNDOCUMENTED_OPTIONS_HELP 804,31173
+print_help 808,31250
+main 981,37438
+get_compressor_from_suffix 1319,46217
+get_language_from_langname 1355,47158
+get_language_from_interpreter 1377,47545
+get_language_from_filename 1399,47976
+process_file_name 1433,48834
+process_file 1555,51665
+init 1632,54150
+find_entries 1656,54901
+make_tag 1814,59707
+pfnote 1856,60942
+free_tree 1917,62744
+free_fdesc 1935,63029
+add_node 1955,63472
+invalidate_nodes 2035,65537
+static int number_len 2068,66193
+total_size_of_entries 2087,66694
+put_entries 2107,67154
+#define C_EXT  2193,68995
+#define C_PLAIN 2194,69037
+#define C_PLPL 2195,69070
+#define C_STAR 2196,69104
+#define C_JAVA 2197,69137
+#define C_AUTO 2198,69172
+#define YACC   2199,69242
+enum sym_type2204,69312
+  st_none,2206,69328
+  st_C_objprot,2207,69339
+  st_C_objprot, st_C_objimpl,2207,69339
+  st_C_objprot, st_C_objimpl, st_C_objend,2207,69339
+  st_C_gnumacro,2208,69382
+  st_C_ignore,2209,69399
+  st_C_ignore, st_C_attribute,2209,69399
+  st_C_javastruct,2210,69430
+  st_C_operator,2211,69449
+  st_C_class,2212,69466
+  st_C_class, st_C_template,2212,69466
+  st_C_struct,2213,69495
+  st_C_struct, st_C_extern,2213,69495
+  st_C_struct, st_C_extern, st_C_enum,2213,69495
+  st_C_struct, st_C_extern, st_C_enum, st_C_define,2213,69495
+  st_C_struct, st_C_extern, st_C_enum, st_C_define, st_C_typedef2213,69495
+struct C_stab_entry 2271,71278
+hash 2275,71409
+in_word_set 2321,72937
+      TOTAL_KEYWORDS 2325,73018
+      MIN_WORD_LENGTH 2326,73045
+      MAX_WORD_LENGTH 2327,73072
+      MIN_HASH_VALUE 2328,73100
+      MAX_HASH_VALUE 2329,73126
+C_symtype 2387,74985
+static bool inattribute;2400,75234
+  fvnone,2408,75435
+  fdefunkey,2409,75466
+  fdefunname,2410,75512
+  foperator,2411,75556
+  fvnameseen,2412,75613
+  fstartlist,2413,75666
+  finlist,2414,75722
+  flistseen,2415,75765
+  fignore,2416,75813
+  vignore      2417,75856
+} fvdef;2418,75901
+static bool fvextern;2420,75911
+  tnone,2428,76089
+  tkeyseen,2429,76119
+  ttypeseen,2430,76160
+  tinbody,2431,76199
+  tend,2432,76238
+  tignore      2433,76279
+} typdef;2434,76320
+  snone,2443,76499
+  skeyseen,2445,76575
+  stagseen,2446,76620
+  scolonseen   2447,76661
+} structdef;2448,76715
+static const char *objtag objtag2453,76809
+  dnone,2460,76942
+  dsharpseen,2461,76972
+  ddefineseen,2462,77025
+  dignorerest  2463,77070
+} definedef;2464,77112
+  onone,2472,77267
+  oprotocol,2473,77297
+  oimplementation,2474,77347
+  otagseen,2475,77395
+  oparenseen,2476,77431
+  ocatseen,2477,77486
+  oinbody,2478,77525
+  omethodsign,2479,77568
+  omethodtag,2480,77626
+  omethodcolon,2481,77666
+  omethodparm,2482,77709
+  oignore      2483,77755
+} objdef;2484,77787
+static struct tok2491,77944
+} token;2508,78626
+} cstack;2523,79136
+#define nestlev        2525,79264
+#define instruct       2527,79369
+pushclass_above 2531,79489
+popclass_above 2550,79948
+write_classname 2564,80162
+consider_token 2613,81341
+} lbs[lbs2924,88532
+#define current_lb_is_new 2926,88543
+#define switch_line_buffers(2927,88588
+#define curlb 2929,88641
+#define newlb 2930,88672
+#define curlinepos 2931,88703
+#define newlinepos 2932,88744
+#define plainc 2934,88786
+#define cplpl 2935,88830
+#define cjava 2936,88861
+#define CNL_SAVE_DEFINEDEF(2938,88905
+#define CNL(2947,89117
+make_C_tag 2960,89375
+C_entries 2986,90194
+default_C_entries 3833,110156
+plain_C_entries 3840,110276
+Cplusplus_entries 3847,110364
+Cjava_entries 3854,110460
+Cstar_entries 3861,110550
+Yacc_entries 3868,110642
+#define LOOP_ON_INPUT_LINES(3875,110720
+#define LOOKING_AT(3884,111056
+#define LOOKING_AT_NOCASE(3891,111461
+just_read_file 3901,111861
+F_takeprec 3914,112039
+F_getit 3937,112366
+Fortran_functions 3961,112840
+Ada_getit 4052,114669
+Ada_funcs 4115,116044
+Asm_labels 4228,118582
+Perl_functions 4261,119549
+Python_functions 4357,122057
+PHP_functions 4387,122684
+Cobol_paragraphs 4466,124471
+Makefile_targets 4494,125029
+Pascal_functions 4529,125950
+L_getit 4709,130318
+Lisp_functions 4725,130664
+Lua_functions 4785,131850
+PS_functions 4811,132385
+Forth_words 4841,133053
+Scheme_functions 4877,134092
+static linebuffer *TEX_toktab TEX_toktab4908,134781
+static const char *TEX_defenv TEX_defenv4912,134974
+static char TEX_esc 4920,135261
+static char TEX_opgrp 4921,135289
+static char TEX_clgrp 4922,135318
+TeX_commands 4928,135395
+#define TEX_LESC 4986,136652
+#define TEX_SESC 4987,136674
+TEX_mode 4992,136804
+TEX_decode_env 5026,137509
+Texinfo_nodes 5071,138554
+HTML_labels 5094,139013
+Prolog_functions 5219,142347
+prolog_skip_comment 5255,143128
+prolog_pr 5281,143736
+prolog_atom 5319,144628
+Erlang_functions 5379,145666
+erlang_func 5438,146965
+erlang_attribute 5476,147642
+erlang_atom 5496,148061
+scan_separators 5534,149080
+analyze_regex 5586,150460
+add_regex 5654,152050
+substitute 5767,154797
+free_regexps 5814,155837
+regex_tag_multiline 5836,156291
+nocase_tail 5913,158263
+get_tag 5928,158519
+readline_internal 5959,159455
+readline 6037,161296
+savestr 6230,167243
+savenstr 6240,167473
+skip_spaces 6249,167679
+skip_non_spaces 6258,167833
+skip_name 6267,167983
+fatal 6277,168156
+pfatal 6284,168253
+suggest_asking_for_help 6291,168332
+error 6300,168554
+concat 6313,168846
+etags_getcwd 6329,169259
+relative_filename 6350,169725
+absolute_filename 6389,170751
+absolute_dirname 6453,172416
+filename_is_absolute 6472,172845
+canonicalize_filename 6484,173096
+# define ISUPPER(6491,173235
+linebuffer_init 6514,173656
+linebuffer_setlen 6524,173887
+xmalloc 6536,174148
+xrealloc 6545,174314
+
+c-src/exit.c,47
+  } __libc_atexit;30,1011
+DEFUN(exit,38,1252
+
+c-src/exit.strange_suffix,47
+  } __libc_atexit;30,1011
+DEFUN(exit,38,1252
+
+c-src/sysdep.h,491
+#define        ENTRY(21,865
+#define        PSEUDO(26,972
+    movl $SYS_##syscall_nam$SYS_##syscall_na31,1132
+    movl $SYS_##syscall_name, %eax;eax31,1132
+    int $0x80;32,1180
+    test %eax,eax33,1210
+    test %eax, %eax;eax33,1210
+    jl syscall_error;34,1245
+#define        XCHG_0  47,1562
+#define        XCHG_1  48,1606
+#define        XCHG_2  49,1648
+#define        XCHG_3  50,1691
+#define        XCHG_4  51,1734
+#define        XCHG_5  52,1777
+#define        r0      54,1821
+#define        r1      55,1875
+#define scratch 56,1932
+#define MOVE(57,2001
+
+c-src/tab.c,196
+static int             count_words(15,263
+static char            *get_word(get_word35,553
+void                   tab_free(59,966
+char                   **tab_fill(tab_fill70,1129
+int                    tab_delete_first(91,1638
+int                    tab_count_words(103,1820
+
+c-src/dostorture.c,197
+(*tag1 tag118,451
+#define notag2 26,552
+(*tag2 tag229,629
+(*tag3 tag339,771
+#define notag4 45,860
+(*tag4 tag448,954
+tag5 57,1080
+tag6 66,1207
+int pp1(74,1316
+pp287,1418
+pp3(100,1517
+
+c-src/emacs/src/gmalloc.c,3539
+#define USE_PTHREAD25,1002
+#undef get_current_dir_name33,1126
+#undef malloc64,2110
+#undef realloc65,2124
+#undef calloc66,2139
+#undef free67,2153
+#define malloc 68,2165
+#define realloc 69,2188
+#define calloc 70,2213
+#define aligned_alloc 71,2236
+#define free 72,2273
+#define DUMPED 80,2472
+#define ALLOCATED_BEFORE_DUMPING(81,2507
+extern void *malloc malloc94,2718
+#define INT_BIT        124,3934
+#define BLOCKLOG       125,3977
+#define BLOCKSIZE      126,4018
+#define BLOCKIFY(127,4052
+#define HEAP   131,4215
+#define FINAL_FREE_BLOCKS      135,4391
+  } malloc_info;167,5388
+#define BLOCK(176,5620
+#define ADDRESS(177,5682
+struct list186,5939
+struct alignlist196,6153
+#define LOCK(223,7064
+#define UNLOCK(228,7195
+#define LOCK_ALIGNED_BLOCKS(233,7329
+#define UNLOCK_ALIGNED_BLOCKS(238,7484
+#define LOCK(244,7649
+#define UNLOCK(245,7664
+#define LOCK_ALIGNED_BLOCKS(246,7681
+#define UNLOCK_ALIGNED_BLOCKS(247,7711
+enum mcheck_status283,9092
+    MCHECK_DISABLED 285,9115
+    MCHECK_OK,286,9187
+    MCHECK_FREE,287,9226
+    MCHECK_HEAD,288,9270
+    MCHECK_TAIL        289,9334
+struct mstats308,10153
+char *_heapbase;_heapbase355,11829
+malloc_info *_heapinfo;_heapinfo358,11927
+static size_t heapsize;361,11983
+size_t _heapindex;364,12047
+size_t _heaplimit;367,12109
+struct list _fraghead[_fraghead370,12171
+size_t _chunks_used;373,12229
+size_t _bytes_used;374,12250
+size_t _chunks_free;375,12270
+size_t _bytes_free;376,12291
+int __malloc_initialized;379,12340
+size_t __malloc_extra_blocks;381,12367
+static int state_protected_p;400,12912
+static size_t last_state_size;401,12942
+static malloc_info *last_heapinfo;last_heapinfo402,12973
+protect_malloc_state 405,13014
+#define PROTECT_MALLOC_STATE(426,13627
+#define PROTECT_MALLOC_STATE(429,13697
+align 435,13794
+get_contiguous_space 466,14616
+register_heapinfo 497,15325
+pthread_mutex_t _malloc_mutex 517,15879
+pthread_mutex_t _aligned_blocks_mutex 518,15938
+int _malloc_thread_enabled_p;519,16005
+malloc_atfork_handler_prepare 522,16048
+malloc_atfork_handler_parent 529,16139
+malloc_atfork_handler_child 536,16233
+malloc_enable_thread 544,16375
+malloc_initialize_1 563,16961
+__malloc_initialize 594,17793
+static int morecore_recursing;604,17926
+morecore_nolock 609,18066
+_malloc_internal_nolock 722,21584
+_malloc_internal 920,28102
+malloc 932,28247
+_malloc 961,29140
+_free 967,29196
+_realloc 973,29240
+struct alignlist *_aligned_blocks _aligned_blocks1004,30345
+_free_internal_nolock 1009,30474
+_free_internal 1255,38476
+free 1265,38603
+weak_alias 1277,38799
+#define min(1306,39813
+_realloc_internal_nolock 1319,40309
+_realloc_internal 1435,43563
+realloc 1447,43726
+calloc 1478,44894
+#define        __sbrk  1513,46042
+__default_morecore 1525,46511
+aligned_alloc 1557,47522
+memalign 1647,49704
+posix_memalign 1656,49909
+static size_t pagesize;1703,51317
+valloc 1706,51349
+#undef malloc1715,51490
+#undef realloc1716,51504
+#undef calloc1717,51519
+#undef aligned_alloc1718,51533
+#undef free1719,51554
+hybrid_malloc 1736,52083
+hybrid_calloc 1744,52188
+hybrid_free 1752,52319
+hybrid_aligned_alloc 1765,52626
+hybrid_realloc 1780,52984
+hybrid_get_current_dir_name 1811,53797
+#define MAGICWORD      1854,55206
+#define MAGICFREE      1855,55261
+#define MAGICBYTE      1856,55316
+#define MALLOCFLOOD    1857,55348
+#define FREEFLOOD      1858,55382
+struct hdr1860,55415
+checkhdr 1867,55581
+freehook 1891,56022
+mallochook 1927,56804
+reallochook 1944,57143
+mabort 1978,57901
+static int mcheck_used 2012,58586
+mcheck 2015,58619
+mprobe 2035,59138
+
+c-src/emacs/src/regex.h,3761
+#define _REGEX_H 21,836
+typedef unsigned long reg_syntax_t;43,1577
+#define RE_BACKSLASH_ESCAPE_IN_LISTS 47,1749
+#define RE_BK_PLUS_QM 52,1969
+#define RE_CHAR_CLASSES 58,2298
+#define RE_CONTEXT_INDEP_ANCHORS 72,3032
+#define RE_CONTEXT_INDEP_OPS 80,3458
+#define RE_CONTEXT_INVALID_OPS 84,3658
+#define RE_DOT_NEWLINE 88,3801
+#define RE_DOT_NOT_NULL 92,3937
+#define RE_HAT_LISTS_NOT_NEWLINE 96,4082
+#define RE_INTERVALS 101,4292
+#define RE_LIMITED_OPS 105,4441
+#define RE_NEWLINE_ALT 109,4583
+#define RE_NO_BK_BRACES 114,4773
+#define RE_NO_BK_PARENS 118,4964
+#define RE_NO_BK_REFS 122,5120
+#define RE_NO_BK_VBAR 126,5316
+#define RE_NO_EMPTY_RANGES 132,5610
+#define RE_UNMATCHED_RIGHT_PAREN_ORD 136,5766
+#define RE_NO_POSIX_BACKTRACKING 140,5937
+#define RE_NO_GNU_OPS 144,6133
+#define RE_FRUGAL 147,6253
+#define RE_SHY_GROUPS 150,6360
+#define RE_NO_NEWLINE_ANCHOR 153,6468
+#define RE_DEBUG 161,6884
+#define RE_SYNTAX_EMACS        183,7684
+#define RE_SYNTAX_AWK  186,7780
+#define RE_SYNTAX_GNU_AWK      193,8084
+#define RE_SYNTAX_POSIX_AWK 197,8255
+#define RE_SYNTAX_GREP 201,8393
+#define RE_SYNTAX_EGREP        206,8549
+#define RE_SYNTAX_POSIX_EGREP  212,8765
+#define RE_SYNTAX_ED 216,8910
+#define RE_SYNTAX_SED 218,8954
+#define _RE_SYNTAX_POSIX_COMMON        221,9072
+#define RE_SYNTAX_POSIX_BASIC  225,9215
+#define RE_SYNTAX_POSIX_MINIMAL_BASIC  231,9508
+#define RE_SYNTAX_POSIX_EXTENDED       234,9598
+#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED       242,9967
+# undef RE_DUP_MAX253,10454
+#define RE_DUP_MAX 256,10540
+#define REG_EXTENDED 263,10762
+#define REG_ICASE 267,10886
+#define REG_NEWLINE 272,11070
+#define REG_NOSUB 276,11248
+#define REG_NOTBOL 286,11614
+#define REG_NOTEOL 289,11688
+  REG_ENOSYS 297,11859
+  REG_NOERROR 300,11941
+  REG_NOMATCH,301,11976
+  REG_BADPAT,305,12123
+  REG_ECOLLATE,306,12162
+  REG_ECTYPE,307,12203
+  REG_EESCAPE,308,12255
+  REG_ESUBREG,309,12298
+  REG_EBRACK,310,12345
+  REG_EPAREN,311,12391
+  REG_EBRACE,312,12436
+  REG_BADBR,313,12472
+  REG_ERANGE,314,12519
+  REG_ESPACE,315,12560
+  REG_BADRPT,316,12601
+  REG_EEND,319,12693
+  REG_ESIZE,320,12728
+  REG_ERPAREN,321,12790
+  REG_ERANGEX  322,12859
+} reg_errcode_t;323,12911
+# define RE_TRANSLATE_TYPE 332,13273
+struct re_pattern_buffer335,13315
+#define REGS_UNALLOCATED 376,14889
+#define REGS_REALLOCATE 377,14916
+#define REGS_FIXED 378,14942
+typedef struct re_pattern_buffer regex_t;416,16098
+typedef ssize_t regoff_t;423,16492
+struct re_registers428,16652
+# define RE_NREGS 440,16942
+} regmatch_t;451,17317
+#  define _Restrict_ 540,20886
+#  define _Restrict_ 542,20979
+#  define _Restrict_544,21018
+#  define _Restrict_arr_ 555,21418
+#  define _Restrict_arr_557,21461
+#  define CHAR_CLASS_MAX_LENGTH 593,22470
+#  define CHAR_CLASS_MAX_LENGTH 597,22648
+typedef wctype_t re_wctype_t;599,22692
+typedef wchar_t re_wchar_t;600,22722
+# define re_wctype 601,22750
+# define re_iswctype 602,22776
+# define re_wctype_to_bit(603,22806
+# define CHAR_CLASS_MAX_LENGTH 605,22844
+# define btowc(606,22906
+typedef enum { RECC_ERROR 609,22953
+              RECC_ALNUM,610,22984
+              RECC_ALNUM, RECC_ALPHA,610,22984
+              RECC_ALNUM, RECC_ALPHA, RECC_WORD,610,22984
+              RECC_GRAPH,611,23027
+              RECC_GRAPH, RECC_PRINT,611,23027
+              RECC_LOWER,612,23059
+              RECC_LOWER, RECC_UPPER,612,23059
+              RECC_PUNCT,613,23091
+              RECC_PUNCT, RECC_CNTRL,613,23091
+              RECC_DIGIT,614,23123
+              RECC_DIGIT, RECC_XDIGIT,614,23123
+              RECC_BLANK,615,23156
+              RECC_BLANK, RECC_SPACE,615,23156
+              RECC_MULTIBYTE,616,23188
+              RECC_MULTIBYTE, RECC_NONASCII,616,23188
+              RECC_ASCII,617,23227
+              RECC_ASCII, RECC_UNIBYTE617,23227
+} re_wctype_t;618,23260
+typedef int re_wchar_t;623,23387
+
+c-src/emacs/src/keyboard.c,13565
+volatile int interrupt_input_blocked;76,1808
+volatile bool pending_signals;80,1944
+#define KBD_BUFFER_SIZE 82,1976
+KBOARD *initial_kboard;initial_kboard84,2006
+KBOARD *current_kboard;current_kboard85,2030
+static KBOARD *all_kboards;all_kboards86,2054
+static bool single_kboard;89,2154
+#define NUM_RECENT_KEYS 91,2182
+static int recent_keys_index;94,2269
+static int total_keys;97,2357
+static Lisp_Object recent_keys;100,2443
+Lisp_Object this_command_keys;107,2777
+ptrdiff_t this_command_key_count;108,2808
+static bool this_command_key_count_reset;112,2922
+static Lisp_Object raw_keybuf;116,3074
+static int raw_keybuf_count;117,3105
+#define GROW_RAW_KEYBUF        119,3135
+static ptrdiff_t this_single_command_key_start;125,3350
+static ptrdiff_t before_command_key_count;129,3498
+static ptrdiff_t before_command_echo_length;130,3541
+sigjmp_buf return_to_command_loop;135,3677
+static Lisp_Object recover_top_level_message;138,3791
+static Lisp_Object regular_top_level_message;143,3930
+static sys_jmp_buf getcjmp;147,4031
+bool waiting_for_input;150,4095
+static bool echoing;154,4186
+static struct kboard 
*ok_to_echo_at_next_pause;ok_to_echo_at_next_pause159,4328
+struct kboard *echo_kboard;echo_kboard166,4632
+Lisp_Object echo_message_buffer;171,4744
+bool immediate_quit;174,4837
+int quit_char;192,5623
+EMACS_INT command_loop_level;195,5680
+Lisp_Object unread_switch_frame;204,6108
+static ptrdiff_t last_non_minibuf_size;207,6216
+uintmax_t num_input_events;210,6334
+static EMACS_INT last_auto_save;214,6428
+static ptrdiff_t last_point_position;217,6523
+Lisp_Object internal_last_event_frame;228,7028
+static Lisp_Object read_key_sequence_cmd;232,7168
+static Lisp_Object read_key_sequence_remapped;233,7210
+static FILE *dribble;dribble236,7310
+bool input_pending;239,7368
+static bool input_was_pending;287,10022
+static struct input_event kbd_buffer[kbd_buffer291,10107
+static struct input_event *kbd_fetch_ptr;kbd_fetch_ptr297,10386
+static struct input_event * volatile kbd_store_ptr;302,10601
+unsigned timers_run;320,11296
+struct timespec 
*input_available_clear_time;input_available_clear_time324,11408
+bool interrupt_input;328,11573
+bool interrupts_deferred;331,11671
+static struct timespec timer_idleness_start_time;335,11746
+static struct timespec timer_last_idleness_start_time;340,11916
+#define READABLE_EVENTS_DO_TIMERS_NOW  346,12046
+#define READABLE_EVENTS_FILTER_EVENTS  347,12094
+#define READABLE_EVENTS_IGNORE_SQUEEZABLES     348,12142
+kset_echo_string 392,14088
+kset_kbd_queue 397,14184
+kset_keyboard_translate_table 402,14276
+kset_last_prefix_arg 407,14399
+kset_last_repeatable_command 412,14504
+kset_local_function_key_map 417,14625
+kset_overriding_terminal_local_map 422,14744
+kset_real_last_command 427,14877
+kset_system_key_syms 432,14986
+echo_add_key 443,15249
+echo_char 527,17527
+echo_dash 541,17813
+echo_now 586,19140
+cancel_echoing 635,20614
+echo_length 648,20922
+echo_truncate 660,21253
+add_command_key 672,21582
+recursive_edit_1 697,22406
+record_auto_save 742,23848
+force_auto_save_soon 751,24016
+DEFUN ("recursive-edit", Frecursive_edit,recursive-edit759,24137
+recursive_edit_unwind 804,25747
+any_kboard_state 817,26013
+single_kboard_state 838,26665
+not_single_kboard_state 848,26803
+struct kboard_stack858,27065
+static struct kboard_stack *kboard_stack;kboard_stack864,27138
+push_kboard 867,27186
+pop_kboard 879,27375
+temporarily_switch_to_single_kboard 914,28263
+record_single_kboard_state 943,29437
+restore_kboard_configuration 952,29621
+cmd_error 970,30077
+cmd_error_internal 1024,31510
+DEFUN ("command-error-default-function", 
Fcommand_error_default_function,command-error-default-function1043,32030
+command_loop 1094,33916
+command_loop_2 1134,35135
+top_level_2 1146,35339
+top_level_1 1152,35417
+DEFUN ("top-level", Ftop_level,top-level1164,35787
+user_error 1183,36288
+DEFUN ("exit-recursive-edit", 
Fexit_recursive_edit,exit-recursive-edit1189,36429
+DEFUN ("abort-recursive-edit", 
Fabort_recursive_edit,abort-recursive-edit1201,36819
+tracking_off 1216,37281
+DEFUN ("internal--track-mouse", Ftrack_mouse,track-mouse1234,37816
+bool ignore_mouse_drag_p;1256,38392
+some_mouse_moved 1259,38441
+Lisp_Object last_undo_boundary;1287,39032
+command_loop_1 1294,39273
+read_menu_command 1649,50889
+adjust_point_for_property 1678,51617
+safe_run_hooks_1 1831,57339
+safe_run_hooks_error 1841,57569
+safe_run_hook_funcall 1878,58576
+safe_run_hooks 1893,59058
+int poll_suppress_count;1908,59397
+static struct atimer *poll_timer;poll_timer1915,59487
+poll_for_input_1 1919,59589
+poll_for_input 1930,59789
+start_polling 1942,60053
+input_polling_used 1979,61091
+stop_polling 1994,61390
+set_poll_suppress_count 2009,61759
+bind_polling_period 2029,62141
+make_ctrl_char 2048,62492
+show_help_echo 2113,64455
+static Lisp_Object help_form_saved_window_configs;2156,65638
+read_char_help_form_unwind 2158,65701
+#define STOP_POLLING   2166,65959
+#define RESUME_POLLING 2170,66084
+read_event_from_main_queue 2175,66229
+read_decoded_event_from_main_queue 2249,68417
+#define MAX_ENCODED_BYTES 2254,68664
+echo_keystrokes_p 2342,71556
+read_char 2376,72848
+record_menu_key 3225,98949
+help_char_p 3258,99674
+record_char 3273,99953
+save_getcjmp 3412,104235
+restore_getcjmp 3418,104326
+readable_events 3430,104697
+int stop_character EXTERNALLY_VISIBLE;3497,106437
+event_to_kboard 3500,106493
+kbd_buffer_nr_stored 3522,107142
+kbd_buffer_store_event 3534,107483
+kbd_buffer_store_event_hold 3550,108025
+kbd_buffer_unget_event 3684,111617
+#define INPUT_EVENT_POS_MAX 3698,112018
+#define INPUT_EVENT_POS_MIN 3701,112147
+position_to_Time 3706,112287
+Time_to_position 3716,112514
+gen_help_event 3738,113171
+kbd_buffer_store_help_event 3756,113611
+discard_mouse_events 3773,113976
+kbd_buffer_events_waiting 3803,114711
+clear_event 3823,115068
+kbd_buffer_get_event 3836,115408
+process_special_events 4258,127881
+swallow_events 4322,129705
+timer_start_idle 4339,130098
+timer_stop_idle 4355,130576
+timer_resume_idle 4363,130720
+struct input_event last_timer_event EXTERNALLY_VISIBLE;4372,130912
+Lisp_Object pending_funcalls;4377,131172
+decode_timer 4381,131293
+timer_check_2 4414,132246
+timer_check 4572,136817
+DEFUN ("current-idle-time", Fcurrent_idle_time,current-idle-time4607,137662
+static Lisp_Object accent_key_syms;4625,138239
+static Lisp_Object func_key_syms;4626,138275
+static Lisp_Object mouse_syms;4627,138309
+static Lisp_Object wheel_syms;4628,138340
+static Lisp_Object drag_n_drop_syms;4629,138371
+static const int lispy_accent_codes[lispy_accent_codes4634,138516
+static const char *const lispy_accent_keys[lispy_accent_keys4741,139878
+#define FUNCTION_KEY_OFFSET 4766,140314
+const char *const lispy_function_keys[lispy_function_keys4768,140347
+static const char *const 
lispy_multimedia_keys[lispy_multimedia_keys4962,148901
+static const char *const lispy_kana_keys[lispy_kana_keys5026,150135
+#define FUNCTION_KEY_OFFSET 5061,151751
+static const char *const lispy_function_keys[lispy_function_keys5065,151894
+#define ISO_FUNCTION_KEY_OFFSET 5149,154429
+static const char *const 
iso_lispy_function_keys[iso_lispy_function_keys5151,154469
+static Lisp_Object Vlispy_mouse_stem;5172,155328
+static const char *const lispy_wheel_names[lispy_wheel_names5174,155367
+static const char *const 
lispy_drag_n_drop_names[lispy_drag_n_drop_names5181,155619
+static short const scroll_bar_parts[scroll_bar_parts5189,155885
+static Lisp_Object button_down_location;5210,156910
+static int last_mouse_button;5215,157065
+static int last_mouse_x;5216,157095
+static int last_mouse_y;5217,157120
+static Time button_down_time;5218,157145
+static int double_click_count;5222,157229
+make_lispy_position 5228,157390
+toolkit_menubar_in_use 5456,163953
+make_scroll_bar_position 5469,164321
+make_lispy_event 5485,164967
+make_lispy_movement 6104,183531
+make_lispy_switch_frame 6131,184262
+make_lispy_focus_in 6137,184369
+make_lispy_focus_out 6145,184495
+parse_modifiers_uncached 6163,184945
+#define SINGLE_LETTER_MOD(6185,185465
+#undef SINGLE_LETTER_MOD6212,185906
+#define MULTI_LETTER_MOD(6214,185932
+#undef MULTI_LETTER_MOD6231,186400
+apply_modifiers_uncached 6273,187574
+static const char *const modifier_names[modifier_names6319,189193
+#define NUM_MOD_NAMES 6325,189399
+static Lisp_Object modifier_symbols;6327,189449
+lispy_modifier_list 6331,189586
+#define KEY_TO_CHAR(6353,190252
+parse_modifiers 6356,190328
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191517
+apply_modifiers 6422,192391
+reorder_modifiers 6491,194720
+modify_event_symbol 6536,196528
+DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199244
+parse_solitary_modifier 6695,201135
+#define SINGLE_LETTER_MOD(6701,201258
+#define MULTI_LETTER_MOD(6705,201343
+#undef SINGLE_LETTER_MOD6763,202641
+#undef MULTI_LETTER_MOD6764,202666
+lucid_event_type_list_p 6775,202889
+get_input_pending 6814,203960
+record_asynch_buffer_change 6834,204579
+gobble_input 6872,205702
+tty_read_avail_input 6967,208310
+handle_async_input 7149,214039
+process_pending_signals 7165,214359
+unblock_input_to 7177,214645
+unblock_input 7200,215277
+totally_unblock_input 7209,215445
+handle_input_available_signal 7217,215529
+deliver_input_available_signal 7226,215700
+struct user_signal_info7235,215865
+static struct user_signal_info *user_signals user_signals7250,216090
+add_user_signal 7253,216149
+handle_user_signal 7275,216598
+deliver_user_signal 7316,217558
+find_user_signal_name 7322,217659
+store_user_signal_events 7334,217841
+static Lisp_Object menu_bar_one_keymap_changed_items;7363,218416
+static Lisp_Object menu_bar_items_vector;7368,218630
+static int menu_bar_items_index;7369,218672
+static const char *separator_names[separator_names7372,218707
+menu_separator_name_p 7393,219148
+menu_bar_items 7426,219852
+Lisp_Object item_properties;7568,224603
+menu_bar_item 7571,224645
+menu_item_eval_property_1 7647,227175
+eval_dyn 7658,227465
+menu_item_eval_property 7666,227675
+parse_menu_item 7686,228341
+static Lisp_Object tool_bar_items_vector;7965,236336
+static Lisp_Object tool_bar_item_properties;7970,236510
+static int ntool_bar_items;7974,236606
+tool_bar_items 7990,237083
+process_tool_bar_item 8075,239892
+#define PROP(8112,240969
+set_prop 8114,241038
+parse_tool_bar_item 8167,242453
+#undef PROP8379,248844
+init_tool_bar_items 8387,248969
+append_tool_bar_item 8401,249261
+read_char_x_menu_prompt 8443,250771
+read_char_minibuf_menu_prompt 8503,252445
+#define PUSH_C_STR(8527,253014
+follow_key 8726,258553
+active_maps 8733,258695
+typedef struct keyremap8742,259021
+} keyremap;8754,259464
+access_keymap_keyremap 8764,259808
+keyremap_step 8811,261450
+test_undefined 8867,262934
+read_key_sequence 8916,264861
+read_key_sequence_vs 9826,295821
+DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297294
+DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299982
+detect_input_pending 9950,300488
+detect_input_pending_ignore_squeezables 9959,300654
+detect_input_pending_run_timers 9967,300870
+clear_input_pending 9985,301362
+requeued_events_pending_p 9997,301732
+DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301813
+DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302596
+DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303517
+DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303958
+DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304380
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304955
+DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305495
+DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306510
+DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307069
+DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307406
+DEFUN ("discard-input", Fdiscard_input,discard-input10203,308447
+DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308949
+stuff_buffered_input 10285,311045
+set_waiting_for_input 10323,312016
+clear_waiting_for_input 10337,312390
+handle_interrupt_signal 10351,312754
+deliver_interrupt_signal 10378,313642
+static int volatile force_quit_count;10387,313932
+handle_interrupt 10401,314414
+quit_throw_to_read_char 10541,318711
+DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319288
+DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320516
+DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321432
+DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322706
+DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323570
+DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324459
+DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325837
+DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327060
+init_kboard 10861,328214
+allocate_kboard 10893,329284
+wipe_kboard 10909,329637
+delete_kboard 10917,329751
+init_keyboard 10942,330281
+struct event_head11021,332696
+static const struct event_head head_table[head_table11027,332747
+syms_of_keyboard 11045,333577
+keys_of_keyboard 11841,367115
+mark_kboards 11916,370434
+
+c-src/emacs/src/lisp.h,20567
+#define EMACS_LISP_H22,800
+#define DECLARE_GDB_SYM(47,1421
+# define DEFINE_GDB_SYMBOL_BEGIN(49,1508
+# define DEFINE_GDB_SYMBOL_END(50,1578
+# define DEFINE_GDB_SYMBOL_BEGIN(52,1625
+# define DEFINE_GDB_SYMBOL_END(53,1702
+#undef min57,1790
+#undef max58,1801
+#define max(59,1812
+#define min(60,1854
+#define ARRAYELTS(63,1936
+#define GCTYPEBITS 67,2079
+DEFINE_GDB_SYMBOL_BEGIN GCTYPEBITS66,2037
+# define NONPOINTER_BITS 78,2567
+# define NONPOINTER_BITS 80,2600
+typedef int EMACS_INT;91,3023
+typedef unsigned int EMACS_UINT;92,3046
+#  define EMACS_INT_MAX 93,3079
+#  define pI 94,3111
+typedef long int EMACS_INT;96,3203
+typedef unsigned long EMACS_UINT;97,3231
+#  define EMACS_INT_MAX 98,3265
+#  define pI 99,3298
+typedef long long int EMACS_INT;103,3477
+typedef unsigned long long int EMACS_UINT;104,3510
+#  define EMACS_INT_MAX 105,3553
+#  define pI 106,3587
+enum {  BOOL_VECTOR_BITS_PER_CHAR 114,3804
+#define BOOL_VECTOR_BITS_PER_CHAR 115,3840
+typedef size_t bits_word;123,4165
+# define BITS_WORD_MAX 124,4191
+enum { BITS_PER_BITS_WORD 125,4223
+typedef unsigned char bits_word;127,4290
+# define BITS_WORD_MAX 128,4323
+enum { BITS_PER_BITS_WORD 129,4386
+    BITS_PER_CHAR 136,4570
+    BITS_PER_SHORT 137,4605
+    BITS_PER_LONG 138,4657
+    BITS_PER_EMACS_INT 139,4712
+typedef intmax_t printmax_t;148,5089
+typedef uintmax_t uprintmax_t;149,5118
+# define pMd 150,5149
+# define pMu 151,5170
+typedef EMACS_INT printmax_t;153,5197
+typedef EMACS_UINT uprintmax_t;154,5227
+# define pMd 155,5259
+# define pMu 156,5278
+# define pD 165,5664
+# define pD 167,5709
+# define pD 169,5756
+# define pD 171,5779
+# define eassert(200,7062
+# define eassume(201,7140
+# define eassert(208,7319
+# define eassume(212,7450
+enum Lisp_Bits239,8519
+#define GCALIGNMENT 243,8647
+    VALBITS 246,8742
+    INTTYPEBITS 249,8838
+    FIXNUM_BITS 252,8945
+#define VAL_MAX 263,9327
+#define USE_LSB_TAG 271,9777
+DEFINE_GDB_SYMBOL_BEGIN USE_LSB_TAG270,9733
+# define alignas(281,10077
+# define GCALIGNED 288,10227
+# define GCALIGNED 290,10292
+# define lisp_h_XLI(327,11642
+# define lisp_h_XIL(328,11673
+# define lisp_h_XLI(330,11724
+# define lisp_h_XIL(331,11751
+#define lisp_h_CHECK_LIST_CONS(333,11785
+#define lisp_h_CHECK_NUMBER(334,11856
+#define lisp_h_CHECK_SYMBOL(335,11927
+#define lisp_h_CHECK_TYPE(336,11996
+#define lisp_h_CONSP(338,12107
+#define lisp_h_EQ(339,12156
+#define lisp_h_FLOATP(340,12201
+#define lisp_h_INTEGERP(341,12252
+#define lisp_h_MARKERP(342,12333
+#define lisp_h_MISCP(343,12408
+#define lisp_h_NILP(344,12457
+#define lisp_h_SET_SYMBOL_VAL(345,12493
+#define lisp_h_SYMBOL_CONSTANT_P(347,12607
+#define lisp_h_SYMBOL_VAL(348,12671
+#define lisp_h_SYMBOLP(350,12772
+#define lisp_h_VECTORLIKEP(351,12825
+#define lisp_h_XCAR(352,12886
+#define lisp_h_XCDR(353,12924
+#define lisp_h_XCONS(354,12964
+#define lisp_h_XHASH(356,13059
+#define lisp_h_XPNTR(357,13093
+# define lisp_h_check_cons_list(360,13221
+# define lisp_h_make_number(363,13289
+# define lisp_h_XFASTINT(365,13392
+# define lisp_h_XINT(366,13429
+# define lisp_h_XSYMBOL(367,13478
+# define lisp_h_XTYPE(371,13631
+# define lisp_h_XUNTAG(372,13696
+# define XLI(381,14086
+# define XIL(382,14117
+# define CHECK_LIST_CONS(383,14148
+# define CHECK_NUMBER(384,14209
+# define CHECK_SYMBOL(385,14258
+# define CHECK_TYPE(386,14307
+# define CONSP(387,14382
+# define EQ(388,14417
+# define FLOATP(389,14452
+# define INTEGERP(390,14489
+# define MARKERP(391,14530
+# define MISCP(392,14569
+# define NILP(393,14604
+# define SET_SYMBOL_VAL(394,14637
+# define SYMBOL_CONSTANT_P(395,14700
+# define SYMBOL_VAL(396,14763
+# define SYMBOLP(397,14812
+# define VECTORLIKEP(398,14851
+# define XCAR(399,14898
+# define XCDR(400,14931
+# define XCONS(401,14964
+# define XHASH(402,14999
+# define XPNTR(403,15034
+#  define check_cons_list(405,15097
+#  define make_number(408,15176
+#  define XFASTINT(409,15224
+#  define XINT(410,15266
+#  define XSYMBOL(411,15300
+#  define XTYPE(412,15340
+#  define XUNTAG(413,15376
+#define LISP_MACRO_DEFUN(421,15672
+#define LISP_MACRO_DEFUN_VOID(425,15845
+#define INTMASK 437,16289
+#define case_Lisp_Int 438,16342
+#define ENUM_BF(445,16681
+#define ENUM_BF(447,16722
+enum Lisp_Type451,16763
+    Lisp_Symbol 454,16851
+    Lisp_Misc 458,16993
+    Lisp_Int0 461,17067
+    Lisp_Int1 462,17086
+    Lisp_String 466,17264
+    Lisp_Vectorlike 472,17543
+    Lisp_Cons 475,17632
+    Lisp_Float 477,17670
+enum Lisp_Misc_Type485,18016
+    Lisp_Misc_Free 487,18040
+    Lisp_Misc_Marker,488,18069
+    Lisp_Misc_Overlay,489,18091
+    Lisp_Misc_Save_Value,490,18114
+    Lisp_Misc_Finalizer,491,18140
+    Lisp_Misc_Float,494,18275
+    Lisp_Misc_Limit496,18359
+enum Lisp_Fwd_Type502,18543
+    Lisp_Fwd_Int,504,18566
+    Lisp_Fwd_Bool,505,18619
+    Lisp_Fwd_Obj,506,18670
+    Lisp_Fwd_Buffer_Obj,507,18729
+    Lisp_Fwd_Kboard_Obj        508,18800
+typedef struct { EMACS_INT i; } Lisp_Object;567,21781
+#define LISP_INITIALLY(569,21827
+#undef CHECK_LISP_OBJECT_TYPE571,21858
+enum CHECK_LISP_OBJECT_TYPE 572,21888
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE 572,21888
+typedef EMACS_INT Lisp_Object;577,22064
+#define LISP_INITIALLY(578,22095
+enum CHECK_LISP_OBJECT_TYPE 579,22125
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE 579,22125
+#define LISP_INITIALLY_ZERO 582,22226
+enum symbol_interned639,24199
+  SYMBOL_UNINTERNED 641,24222
+  SYMBOL_INTERNED 642,24247
+  SYMBOL_INTERNED_IN_INITIAL_OBARRAY 643,24270
+enum symbol_redirect646,24315
+  SYMBOL_PLAINVAL 648,24338
+  SYMBOL_VARALIAS 649,24362
+  SYMBOL_LOCALIZED 650,24386
+  SYMBOL_FORWARDED 651,24410
+struct Lisp_Symbol654,24437
+  ENUM_BF 663,24793
+#define EXFUN(707,26252
+#define DEFUN_ARGS_MANY        712,26446
+#define DEFUN_ARGS_UNEVALLED   713,26498
+#define DEFUN_ARGS_0   714,26541
+#define DEFUN_ARGS_1   715,26569
+#define DEFUN_ARGS_2   716,26604
+#define DEFUN_ARGS_3   717,26652
+#define DEFUN_ARGS_4   718,26713
+#define DEFUN_ARGS_5   719,26787
+#define DEFUN_ARGS_6   721,26880
+#define DEFUN_ARGS_7   723,26986
+#define DEFUN_ARGS_8   725,27105
+#define TAG_PTR(729,27296
+#define TAG_SYMOFFSET(734,27543
+#define XLI_BUILTIN_LISPSYM(741,27842
+#define DEFINE_LISP_SYMBOL(746,28101
+# define DEFINE_NON_NIL_Q_SYMBOL_MACROS 755,28572
+LISP_MACRO_DEFUN 762,28777
+# define ARRAY_MARK_FLAG 768,29024
+# define PSEUDOVECTOR_FLAG 774,29267
+enum pvec_type780,29568
+  PVEC_NORMAL_VECTOR,782,29585
+  PVEC_FREE,783,29607
+  PVEC_PROCESS,784,29620
+  PVEC_FRAME,785,29636
+  PVEC_WINDOW,786,29650
+  PVEC_BOOL_VECTOR,787,29665
+  PVEC_BUFFER,788,29685
+  PVEC_HASH_TABLE,789,29700
+  PVEC_TERMINAL,790,29719
+  PVEC_WINDOW_CONFIGURATION,791,29736
+  PVEC_SUBR,792,29765
+  PVEC_OTHER,793,29778
+  PVEC_COMPILED,795,29856
+  PVEC_CHAR_TABLE,796,29873
+  PVEC_SUB_CHAR_TABLE,797,29892
+  PVEC_FONT 798,29915
+enum More_Lisp_Bits801,29991
+    PSEUDOVECTOR_SIZE_BITS 808,30382
+    PSEUDOVECTOR_SIZE_MASK 809,30415
+    PSEUDOVECTOR_REST_BITS 813,30625
+    PSEUDOVECTOR_REST_MASK 814,30658
+    PSEUDOVECTOR_AREA_BITS 818,30823
+    PVEC_TYPE_MASK 819,30901
+# define VALMASK 829,31302
+DEFINE_GDB_SYMBOL_BEGIN VALMASK828,31257
+#define MOST_POSITIVE_FIXNUM 834,31532
+#define MOST_NEGATIVE_FIXNUM 835,31592
+XINT 874,32684
+XFASTINT 889,33035
+XSYMBOL 899,33263
+XTYPE 910,33481
+XUNTAG 918,33661
+LISP_MACRO_DEFUN 927,33857
+LISP_MACRO_DEFUN 940,34242
+#define FIXNUM_OVERFLOW_P(958,34855
+LISP_MACRO_DEFUN FIXNUM_OVERFLOW_P952,34632
+LISP_MACRO_DEFUN 970,35171
+XSTRING 980,35391
+#define SYMBOL_INDEX(988,35575
+XFLOAT 991,35636
+XPROCESS 1000,35778
+XWINDOW 1007,35895
+XTERMINAL 1014,36012
+XSUBR 1021,36134
+XBUFFER 1028,36245
+XCHAR_TABLE 1035,36369
+XSUB_CHAR_TABLE 1042,36506
+XBOOL_VECTOR 1049,36648
+make_lisp_ptr 1058,36827
+make_lisp_symbol 1066,37013
+builtin_lisp_symbol 1074,37197
+#define XSETINT(1079,37279
+#define XSETFASTINT(1080,37325
+#define XSETCONS(1081,37375
+#define XSETVECTOR(1082,37435
+#define XSETSTRING(1083,37503
+#define XSETSYMBOL(1084,37567
+#define XSETFLOAT(1085,37621
+#define XSETMISC(1086,37683
+#define XSETPVECTYPE(1090,37772
+#define XSETPVECTYPESIZE(1092,37888
+#define XSETPSEUDOVECTOR(1099,38185
+#define XSETTYPED_PSEUDOVECTOR(1105,38369
+#define XSETWINDOW_CONFIGURATION(1110,38579
+#define XSETPROCESS(1112,38675
+#define XSETWINDOW(1113,38741
+#define XSETTERMINAL(1114,38805
+#define XSETSUBR(1115,38873
+#define XSETCOMPILED(1116,38933
+#define XSETBUFFER(1117,39001
+#define XSETCHAR_TABLE(1118,39065
+#define XSETBOOL_VECTOR(1119,39137
+#define XSETSUB_CHAR_TABLE(1120,39211
+XINTPTR 1128,39581
+make_pointer_integer 1134,39661
+LISP_MACRO_DEFUN_VOID 1143,39826
+typedef struct interval *INTERVAL;INTERVAL1149,39987
+xcar_addr 1174,40760
+xcdr_addr 1179,40837
+LISP_MACRO_DEFUN 1185,40931
+XSETCDR 1198,41307
+CAR 1205,41457
+CDR 1212,41591
+CAR_SAFE 1221,41791
+CDR_SAFE 1226,41877
+STRING_MULTIBYTE 1243,42250
+#define STRING_BYTES_BOUND 1261,43057
+#define STRING_SET_UNIBYTE(1265,43201
+#define STRING_SET_MULTIBYTE(1275,43516
+SDATA 1286,43830
+SSDATA 1291,43908
+SREF 1297,44037
+SSET 1302,44128
+SCHARS 1307,44242
+STRING_BYTES 1316,44415
+SBYTES 1326,44595
+STRING_SET_CHARS 1331,44681
+struct vectorlike_header1343,45232
+struct Lisp_Vector1369,46482
+    ALIGNOF_STRUCT_LISP_VECTOR1378,46681
+struct Lisp_Bool_Vector1384,46864
+bool_vector_size 1399,47385
+bool_vector_data 1407,47523
+bool_vector_uchar_data 1413,47617
+bool_vector_words 1421,47803
+bool_vector_bytes 1428,47998
+bool_vector_bitref 1437,48238
+bool_vector_ref 1445,48478
+bool_vector_set 1453,48618
+    header_size 1471,49047
+    bool_header_size 1472,49106
+    word_size 1473,49171
+AREF 1479,49284
+aref_addr 1485,49391
+ASIZE 1491,49501
+ASET 1497,49583
+gc_aset 1504,49742
+enum { NIL_IS_ZERO 1515,50269
+memclear 1520,50464
+#define VECSIZE(1531,50762
+#define PSEUDOVECSIZE(1538,51047
+#define UNSIGNED_CMP(1546,51480
+#define ASCII_CHAR_P(1552,51734
+enum CHARTAB_SIZE_BITS1565,52489
+    CHARTAB_SIZE_BITS_0 1567,52516
+    CHARTAB_SIZE_BITS_1 1568,52545
+    CHARTAB_SIZE_BITS_2 1569,52574
+    CHARTAB_SIZE_BITS_3 1570,52603
+struct Lisp_Char_Table1575,52672
+struct Lisp_Sub_Char_Table1606,53752
+CHAR_TABLE_REF_ASCII 1628,54566
+CHAR_TABLE_REF 1648,55113
+CHAR_TABLE_SET 1658,55402
+struct Lisp_Subr1670,55786
+enum char_table_specials1692,56798
+    CHAR_TABLE_STANDARD_SLOTS 1697,56993
+    SUB_CHAR_TABLE_OFFSET 1701,57214
+CHAR_TABLE_EXTRA_SLOTS 1707,57377
+LISP_MACRO_DEFUN 1723,57921
+SYMBOL_BLV 1732,58181
+SYMBOL_FWD 1738,58316
+LISP_MACRO_DEFUN_VOID 1744,58428
+SET_SYMBOL_BLV 1754,58691
+SET_SYMBOL_FWD 1760,58850
+SYMBOL_NAME 1767,59001
+SYMBOL_INTERNED_P 1775,59130
+SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P 1783,59299
+#define DEFSYM(1796,59809
+LISP_MACRO_DEFUN DEFSYM1792,59630
+struct hash_table_test1805,60062
+struct Lisp_Hash_Table1823,60555
+XHASH_TABLE 1880,62531
+#define XSET_HASH_TABLE(1885,62602
+HASH_TABLE_P 1889,62703
+HASH_KEY 1896,62860
+HASH_VALUE 1903,63040
+HASH_NEXT 1911,63254
+HASH_HASH 1918,63431
+HASH_INDEX 1926,63677
+HASH_TABLE_SIZE 1933,63826
+enum DEFAULT_HASH_SIZE 1940,63956
+enum DEFAULT_HASH_SIZE { DEFAULT_HASH_SIZE 1940,63956
+static double const DEFAULT_REHASH_THRESHOLD 1946,64176
+static double const DEFAULT_REHASH_SIZE 1950,64299
+sxhash_combine 1956,64465
+SXHASH_REDUCE 1964,64648
+struct Lisp_Misc_Any   1971,64806
+  ENUM_BF 1973,64866
+struct Lisp_Marker1978,64980
+  ENUM_BF 1980,65001
+struct Lisp_Overlay2021,66838
+    ENUM_BF 2034,67346
+    SAVE_UNUSED,2047,67641
+    SAVE_INTEGER,2048,67658
+    SAVE_FUNCPOINTER,2049,67676
+    SAVE_POINTER,2050,67698
+    SAVE_OBJECT2051,67716
+enum { SAVE_SLOT_BITS 2055,67801
+enum { SAVE_VALUE_SLOTS 2058,67898
+enum { SAVE_TYPE_BITS 2062,68006
+enum Lisp_Save_Type2064,68072
+    SAVE_TYPE_INT_INT 2066,68096
+    SAVE_TYPE_INT_INT_INT2067,68169
+    SAVE_TYPE_OBJ_OBJ 2069,68259
+    SAVE_TYPE_OBJ_OBJ_OBJ 2070,68330
+    SAVE_TYPE_OBJ_OBJ_OBJ_OBJ2071,68411
+    SAVE_TYPE_PTR_INT 2073,68506
+    SAVE_TYPE_PTR_OBJ 2074,68579
+    SAVE_TYPE_PTR_PTR 2075,68651
+    SAVE_TYPE_FUNCPTR_PTR_OBJ2076,68724
+    SAVE_TYPE_MEMORY 2080,68882
+typedef void (*voidfuncptr)voidfuncptr2108,69836
+struct Lisp_Save_Value2110,69873
+    ENUM_BF 2112,69900
+save_type 2134,70752
+XSAVE_POINTER 2143,70982
+set_save_pointer 2149,71144
+XSAVE_FUNCPOINTER 2155,71326
+XSAVE_INTEGER 2164,71546
+set_save_integer 2170,71708
+XSAVE_OBJECT 2179,71929
+struct Lisp_Finalizer2186,72106
+struct Lisp_Free2201,72581
+    ENUM_BF 2203,72602
+union Lisp_Misc2212,72882
+XMISC 2223,73181
+XMISCANY 2229,73270
+XMISCTYPE 2236,73379
+XMARKER 2242,73467
+XOVERLAY 2249,73582
+XSAVE_VALUE 2256,73703
+XFINALIZER 2263,73832
+struct Lisp_Intfwd2274,74117
+struct Lisp_Boolfwd2284,74411
+struct Lisp_Objfwd2294,74702
+struct Lisp_Buffer_Objfwd2302,74934
+struct Lisp_Buffer_Local_Value2334,76470
+struct Lisp_Kboard_Objfwd2362,77729
+union Lisp_Fwd2368,77838
+XFWDTYPE 2378,78084
+XBUFFER_OBJFWD 2384,78180
+struct Lisp_Float2391,78316
+XFLOAT_DATA 2401,78434
+    IEEE_FLOATING_POINT2415,78943
+#define _UCHAR_T2423,79266
+typedef unsigned char UCHAR;2424,79283
+enum Lisp_Compiled2429,79366
+    COMPILED_ARGLIST 2431,79389
+    COMPILED_BYTECODE 2432,79415
+    COMPILED_CONSTANTS 2433,79442
+    COMPILED_STACK_DEPTH 2434,79470
+    COMPILED_DOC_STRING 2435,79500
+    COMPILED_INTERACTIVE 2436,79529
+enum char_bits2443,79831
+    CHAR_ALT 2445,79850
+    CHAR_SUPER 2446,79876
+    CHAR_HYPER 2447,79904
+    CHAR_SHIFT 2448,79932
+    CHAR_CTL 2449,79960
+    CHAR_META 2450,79986
+    CHAR_MODIFIER_MASK 2452,80014
+    CHARACTERBITS 2457,80209
+LISP_MACRO_DEFUN 2462,80267
+NATNUMP 2470,80409
+RANGED_INTEGERP 2476,80490
+#define TYPE_RANGED_INTEGERP(2481,80612
+LISP_MACRO_DEFUN 2486,80797
+VECTORP 2500,81270
+OVERLAYP 2505,81373
+SAVE_VALUEP 2510,81472
+FINALIZERP 2516,81578
+AUTOLOADP 2522,81682
+BUFFER_OBJFWDP 2528,81773
+PSEUDOVECTOR_TYPEP 2534,81871
+PSEUDOVECTORP 2542,82124
+WINDOW_CONFIGURATIONP 2558,82476
+PROCESSP 2564,82586
+WINDOWP 2570,82670
+TERMINALP 2576,82752
+SUBRP 2582,82838
+COMPILEDP 2588,82916
+BUFFERP 2594,83002
+CHAR_TABLE_P 2600,83084
+SUB_CHAR_TABLE_P 2606,83175
+BOOL_VECTOR_P 2612,83274
+FRAMEP 2618,83367
+IMAGEP 2625,83484
+ARRAYP 2632,83589
+CHECK_LIST 2638,83708
+LISP_MACRO_DEFUN_VOID 2643,83789
+CHECK_STRING_CAR 2653,84086
+CHECK_CONS 2658,84190
+CHECK_VECTOR 2663,84270
+CHECK_BOOL_VECTOR 2668,84356
+CHECK_VECTOR_OR_STRING 2674,84533
+CHECK_ARRAY 2683,84707
+CHECK_BUFFER 2688,84815
+CHECK_WINDOW 2693,84901
+CHECK_PROCESS 2699,85007
+CHECK_NATNUM 2705,85103
+#define CHECK_RANGED_INTEGER(2710,85180
+#define CHECK_TYPE_RANGED_INTEGER(2721,85563
+#define CHECK_NUMBER_COERCE_MARKER(2729,85833
+XFLOATINT 2738,86086
+CHECK_NUMBER_OR_FLOAT 2744,86157
+#define CHECK_NUMBER_OR_FLOAT_COERCE_MARKER(2749,86256
+CHECK_NUMBER_CAR 2760,86666
+CHECK_NUMBER_CDR 2768,86788
+#define DEFUN(2803,88383
+#define DEFUN(2812,88851
+FUNCTIONP 2822,89206
+enum maxargs2831,89401
+    MANY 2833,89418
+    UNEVALLED 2834,89433
+#define CALLMANY(2838,89536
+#define CALLN(2844,89889
+#define DEFVAR_LISP(2869,91094
+#define DEFVAR_LISP_NOPRO(2874,91266
+#define DEFVAR_BOOL(2879,91448
+#define DEFVAR_INT(2884,91621
+#define DEFVAR_BUFFER_DEFAULTS(2890,91792
+#define DEFVAR_KBOARD(2896,91996
+typedef jmp_buf sys_jmp_buf;2906,92320
+# define sys_setjmp(2907,92349
+# define sys_longjmp(2908,92384
+typedef sigjmp_buf sys_jmp_buf;2910,92456
+# define sys_setjmp(2911,92488
+# define sys_longjmp(2912,92528
+typedef jmp_buf sys_jmp_buf;2916,92687
+# define sys_setjmp(2917,92716
+# define sys_longjmp(2918,92750
+enum specbind_tag 2943,93802
+  SPECPDL_UNWIND,2944,93822
+  SPECPDL_UNWIND_PTR,2945,93891
+  SPECPDL_UNWIND_INT,2946,93942
+  SPECPDL_UNWIND_VOID,2947,93990
+  SPECPDL_BACKTRACE,2948,94044
+  SPECPDL_LET,2949,94102
+  SPECPDL_LET_LOCAL,2951,94232
+  SPECPDL_LET_DEFAULT  2952,94289
+union specbinding2955,94361
+    ENUM_BF 2957,94383
+      ENUM_BF 2959,94440
+      ENUM_BF 2964,94570
+      ENUM_BF 2969,94693
+      ENUM_BF 2974,94811
+      ENUM_BF 2978,94916
+      ENUM_BF 2983,95091
+enum handlertype 3021,96407
+enum handlertype { CATCHER,3021,96407
+enum handlertype { CATCHER, CONDITION_CASE 3021,96407
+struct handler3023,96454
+#define PUSH_HANDLER(3053,97443
+#define QUIT   3101,99220
+#define QUITP 3112,99470
+struct gcpro3132,100313
+#define GC_USE_GCPROS_AS_BEFORE        3171,101294
+#define GC_MAKE_GCPROS_NOOPS   3172,101329
+#define GC_MARK_STACK_CHECK_GCPROS     3173,101361
+#define GC_USE_GCPROS_CHECK_ZOMBIES    3174,101398
+#define GC_MARK_STACK 3177,101459
+#define BYTE_MARK_STACK 3181,101559
+#define GCPRO1(3190,101830
+#define GCPRO2(3191,101870
+#define GCPRO3(3192,101936
+#define GCPRO4(3194,102031
+#define GCPRO5(3196,102151
+#define GCPRO6(3198,102296
+#define GCPRO7(3201,102471
+#define UNGCPRO 3202,102550
+#define GCPRO1(3208,102650
+#define GCPRO2(3212,102772
+#define GCPRO3(3217,102964
+#define GCPRO4(3223,103226
+#define GCPRO5(3230,103557
+#define GCPRO6(3238,103958
+#define GCPRO7(3247,104428
+#define UNGCPRO 3257,104968
+#define GCPRO1(3263,105062
+#define GCPRO2(3269,105296
+#define GCPRO3(3278,105714
+#define GCPRO4(3289,106271
+#define GCPRO5(3302,106969
+#define GCPRO6(3317,107809
+#define GCPRO7(3334,108790
+#define UNGCPRO        3353,109913
+#define RETURN_UNGCPRO(3363,110180
+vcopy 3384,110654
+set_hash_key_slot 3393,110929
+set_hash_value_slot 3399,111068
+set_symbol_function 3408,111303
+set_symbol_plist 3414,111418
+set_symbol_next 3420,111521
+blv_found 3428,111694
+set_overlay_plist 3437,111877
+string_intervals 3445,112028
+set_string_intervals 3453,112150
+set_char_table_defalt 3462,112352
+set_char_table_purpose 3467,112464
+set_char_table_extras 3475,112633
+set_char_table_contents 3482,112842
+set_sub_char_table_contents 3489,113037
+enum Arith_Comparison 3497,113300
+  ARITH_EQUAL,3498,113324
+  ARITH_NOTEQUAL,3499,113339
+  ARITH_LESS,3500,113357
+  ARITH_GRTR,3501,113371
+  ARITH_LESS_OR_EQUAL,3502,113385
+  ARITH_GRTR_OR_EQUAL3503,113408
+#define INTEGER_TO_CONS(3511,113759
+#define CONS_TO_INTEGER(3529,114622
+enum { NEXT_ALMOST_PRIME_LIMIT 3573,116326
+extern EMACS_INT next_almost_prime 3574,116365
+enum constype 3739,123817
+enum constype {CONSTYPE_HEAP,CONSTYPE_HEAP3739,123817
+enum constype {CONSTYPE_HEAP, CONSTYPE_PURE}CONSTYPE_PURE3739,123817
+list2i 3745,124007
+list3i 3751,124116
+list4i 3757,124255
+extern Lisp_Object make_formatted_string 3767,124631
+build_pure_c_string 3792,125659
+build_string 3801,125864
+make_uninit_vector 3820,126435
+make_uninit_sub_char_table 3833,126654
+#define ALLOCATE_PSEUDOVECTOR(3850,127198
+#define ALLOCATE_ZEROED_PSEUDOVECTOR(3858,127534
+INLINE void 3890,128940
+extern void *r_alloc r_alloc3895,129061
+#define FLOAT_TO_STRING_BUFSIZE 3927,130524
+intern 3968,132131
+intern_c_string 3974,132219
+extern _Noreturn void error 4034,135598
+fast_string_match_ignore_case 4136,140086
+INLINE void fixup_locale 4241,143851
+INLINE void synchronize_system_messages_locale 4242,143886
+INLINE void synchronize_system_time_locale 4243,143943
+#define IS_DAEMON 4257,144416
+#define DAEMON_RUNNING 4258,144456
+#define IS_DAEMON 4261,144555
+#define DAEMON_RUNNING 4262,144600
+# define WAIT_READING_MAX 4281,145419
+# define WAIT_READING_MAX 4283,145491
+extern _Noreturn void emacs_abort 4374,148383
+egetenv 4532,152806
+#define eabs(4545,153302
+#define make_fixnum_or_float(4550,153435
+enum MAX_ALLOCA 4556,153686
+enum MAX_ALLOCA { MAX_ALLOCA 4556,153686
+extern void *record_xmalloc record_xmalloc4558,153731
+#define USE_SAFE_ALLOCA        4560,153797
+#define AVAIL_ALLOCA(4564,153930
+#define SAFE_ALLOCA(4568,154041
+#define SAFE_NALLOCA(4576,154382
+#define SAFE_ALLOCA_STRING(4590,154858
+#define SAFE_FREE(4598,155110
+#define SAFE_ALLOCA_LISP(4625,155688
+# define USE_STACK_LISP_OBJECTS 4652,156810
+# undef USE_STACK_LISP_OBJECTS4658,156976
+# define USE_STACK_LISP_OBJECTS 4659,157007
+enum { defined_GC_CHECK_STRING_BYTES 4663,157082
+enum { defined_GC_CHECK_STRING_BYTES 4665,157135
+union Aligned_Cons4670,157269
+union Aligned_String4676,157349
+    USE_STACK_CONS 4689,157704
+    USE_STACK_STRING 4691,157810
+#define STACK_CONS(4699,158147
+#define AUTO_CONS_EXPR(4701,158244
+#define AUTO_CONS(4709,158607
+#define AUTO_LIST1(4710,158678
+#define AUTO_LIST2(4712,158786
+#define AUTO_LIST3(4716,158941
+#define AUTO_LIST4(4720,159116
+# define verify_ascii(4732,159507
+#define AUTO_STRING(4740,159815
+#define FOR_EACH_TAIL(4752,160279
+#define FOR_EACH_ALIST_VALUE(4766,160770
+maybe_gc 4774,161057
+functionp 4784,161296
+
+c-src/machsyscalls.c,23
+#define        SYSCALL(6,113
+
+c-src/machsyscalls.h,159
+SYSCALL (mach_msg_trap,1,0
+SYSCALL (mach_reply_port,13,314
+SYSCALL (mach_thread_self,18,377
+SYSCALL (mach_task_self,23,441
+SYSCALL (mach_host_self,28,503
+
+c-src/h.h,1850
+   ELEM_I/ELEM_I3,15
+} Fails_t;5,85
+typedef void Lang_function 6,96
+typedef struct tpcmd8,147
+#define ggg 10,170
+tpcmd;15,209
+typedef struct foobar2_ 16,216
+} foobar2;20,307
+    DEVICE_SWP,23,333
+    DEVICE_LAST24,349
+} bsp_DevId;25,365
+  struct constant_args 27,394
+} args;30,457
+typedef int *regset;regset31,465
+typedef int INT;32,486
+typedef union abc33,503
+} ghi1;36,534
+typedef union abc 37,542
+} ghi2;39,573
+typedef struct a 40,581
+} b;41,600
+#define c(42,605
+typedef struct an_extern_linkage 
*an_extern_linkage_ptr;an_extern_linkage_ptr43,619
+typedef struct an_extern_linkage 44,676
+} an_extern_linkage;56,1054
+typedef struct pollfd   pfdset[pfdset57,1075
+typedef union rtunion_def58,1119
+  } womboid 63,1206
+typedef union rtunion_def64,1220
+womboid75,1330
+enum {dog,dog81,1416
+enum {dog, cat}cat81,1416
+enum {dog, cat} animals;81,1416
+typedef void (_CALLBACK_ *signal_handler)signal_handler82,1441
+typedef void (_CALLBACK_ *signal_handler1)signal_handler183,1489
+/* comment */ #define ANSIC84,1538
+ #define ANSIC85,1566
+typedef void (proc)87,1588
+typedef void OperatorFun(88,1612
+typedef int f(89,1648
+struct my_struct 91,1691
+typedef struct my_struct my_typedef;93,1713
+typedef RETSIGTYPE (*signal_handler_t)signal_handler_t94,1750
+  Date 04 May 87 235311 PDT 96,1802
+typedef unsigned char unchar;99,1880
+typedef int X,100,1910
+typedef int X, Y,100,1910
+typedef int X, Y, Z;100,1910
+typedef mio mao;101,1931
+typedef struct a 103,1966
+typedef struct a { } b;103,1966
+typedef struct b104,1990
+} c;106,2009
+int extvar;109,2053
+#define tag1110,2065
+#define aaaaaa 111,2078
+#define bbbbbb\bbbbbb113,2102
+#define cccccccccc115,2125
+#define enter_critical_section 116,2144
+#define exit_critical_to_previous      117,2199
+#define UNDEFINED118,2259
+struct re_pattern_buffer 119,2277
+
+cp-src/c.C,2225
+template <typename ipc3dIslandHierarchy,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType, unsigned 
numOfChannels,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType, unsigned 
numOfChannels, typename ipc3dLinkControl,1,0
+class CMultiChannelCSC19_3D2,151
+        void execute(CMultiChannelCSC19_3D::execute11,493
+int main 25,1026
+double base 26,1088
+typedef struct s1 32,1251
+} t1;34,1287
+struct s2 35,1293
+typedef struct s2 t2;38,1324
+class A 39,1346
+  enum { rosso,A::rosso40,1356
+  enum { rosso, giallo,A::giallo40,1356
+  enum { rosso, giallo, verde A::verde40,1356
+const A& A::operator+(43,1431
+void operator+(44,1467
+void operator -(operator -45,1495
+void operator int(operator int46,1524
+A<int>* f(48,1556
+int f(49,1571
+int A<int>::f(f50,1590
+A<float,B<int> > A<B<float>,int>::f(f51,1618
+template <class C, int n> class AT 52,1668
+class AU 53,1716
+class B<B54,1735
+class B<int> { void f(B::f54,1735
+const A::B::T& abt 55,1765
+class A 56,1791
+class A { class B A::B56,1791
+class A 57,1826
+  A operator+(A::operator+59,1860
+is_muldiv_operation(61,1887
+domain foo 68,1955
+     void f(foo::f69,1968
+void A::A(72,1989
+struct A 73,2004
+struct B 74,2022
+void B::B(75,2041
+void BE_Node::BE_Node(76,2056
+class BE_Node 77,2083
+struct foo 79,2102
+class test 86,2156
+  int f(test::f87,2169
+  int ff(test::ff89,2231
+  int g(test::g90,2254
+class  AST_Root 92,2278
+AST_ConcreteType::AST_ConcreteType(99,2393
+AST_Array::AST_Array(107,2532
+     void f(::f115,2733
+struct A 117,2753
+A::~A(120,2777
+struct B 122,2789
+    ~B(B::~B123,2800
+enum {dog,::dog126,2817
+enum {dog, cat}::cat126,2817
+enum {dog, cat} animals;126,2817
+struct {int teats;} cow;127,2842
+class Boo 129,2868
+    enum {dog,Boo::dog130,2880
+    enum {dog, cat}Boo::cat130,2880
+    foo(Boo::foo133,2954
+    Boo(Boo::Boo137,2995
+Boo::Boo(141,3070
+typedef int should_see_this_one_enclosed_in_extern_C;149,3155
+typedef int 
(*should_see_this_function_pointer)should_see_this_function_pointer153,3228
+typedef int should_see_this_array_type[should_see_this_array_type156,3310
+
+cp-src/abstract.C,11317
+Half_Container::Half_Container(34,703
+void Half_Container::SetPosition(45,941
+void Half_Container::SetDimensions(58,1259
+void Half_Container::SetFather(81,1697
+void Half_Container::SetCollapsed(87,1787
+Specification::Specification(98,1958
+void Specification::SetPosition(119,2453
+void Specification::SetDimensions(164,3742
+void Specification::SetFather(188,4616
+void Specification::SetPath(202,4908
+Coord Specification::GetMaxX(212,5125
+Coord Specification::GetMaxY(215,5174
+Process::Process(222,5298
+void Process::SetPosition(242,5697
+void Process::SetDimensions(291,6959
+void Process::SetFather(315,7913
+void Process::SetPath(326,8123
+Coord Process::GetMaxX(335,8323
+Coord Process::GetMaxY(338,8365
+Choice::Choice(346,8482
+void Choice::SetPosition(357,8698
+void Choice::SetDimensions(405,10053
+void Choice::ChangeH(466,12014
+void Choice::ChangeW(495,12947
+void Choice::SetFather(522,13700
+void Choice::SetTextual(532,13918
+void Choice::SetCollapsed(540,14041
+int Choice::Get_Textual_H(549,14168
+int Choice::Get_Textual_W(557,14408
+void Choice::SetTerminalPos(566,14615
+Stop::Stop(588,15087
+void Stop::SetPosition(595,15207
+void Stop::SetDimensions(605,15373
+void Stop::SetFather(644,16369
+void Stop::SetTextual(652,16537
+void Stop::SetCollapsed(655,16616
+Exit::Exit(667,16768
+void Exit::SetPosition(676,16935
+void Exit::SetDimensions(687,17164
+void Exit::SetFather(695,17350
+Exit_Bex::Exit_Bex(703,17476
+void Exit_Bex::SetPosition(713,17678
+void Exit_Bex::SetDimensions(740,18430
+void Exit_Bex::SetFather(798,20444
+void Exit_Bex::SetTextual(807,20646
+void Exit_Bex::SetCollapsed(814,20757
+NoExit::NoExit(826,20943
+void NoExit::SetPosition(835,21092
+void NoExit::SetDimensions(845,21266
+void NoExit::SetFather(852,21359
+ID_Place::ID_Place(861,21488
+void ID_Place::SetIdent(875,21745
+void ID_Place::SetPosition(886,21936
+void ID_Place::SetDimensions(897,22173
+void ID_Place::SetFather(928,23017
+ID_Place::~ID_Place(932,23073
+void ID_Place::SetVisible(935,23112
+void ID_Place::ClearID(941,23193
+ID_List::ID_List(953,23379
+void ID_List::SetPosition(967,23644
+void ID_List::SetDimensions(999,24385
+void ID_List::SetFather(1038,25456
+void ID_List::SetCollapsed(1047,25595
+void ID_List::HideMe(1056,25734
+void ID_List::SetRBubble(1065,25862
+void ID_List::SetAlignement(1073,25980
+int ID_List::GetCardinality(1082,26123
+void ID_List::SetVisible(1093,26291
+void ID_List::BuildSigSorts(1103,26518
+void ID_List::ClearIDs(1126,27081
+Id_Decl::Id_Decl(1139,27280
+void Id_Decl::SetPosition(1156,27659
+void Id_Decl::SetDimensions(1174,28016
+void Id_Decl::SetFather(1191,28417
+void Id_Decl::SetCollapsed(1200,28568
+Id_Decl_List::Id_Decl_List(1214,28799
+void Id_Decl_List::SetPosition(1227,29069
+void Id_Decl_List::SetDimensions(1245,29424
+void Id_Decl_List::SetFather(1262,29844
+void Id_Decl_List::SetCollapsed(1271,29988
+Comment::Comment(1286,30209
+void Comment::SetComment(1299,30446
+void Comment::SetFather(1317,30800
+void Comment::SetPosition(1321,30854
+void Comment::SetDimensions(1331,31031
+Comment::~Comment(1345,31265
+Comment_List::Comment_List(1352,31382
+void Comment_List::SetPosition(1362,31541
+void Comment_List::SetDimensions(1380,31860
+void Comment_List::SetFather(1392,32139
+Parallel::Parallel(1406,32360
+void Parallel::SetPosition(1417,32573
+void Parallel::SetDimensions(1473,34272
+void Parallel::SetTextual(1534,36167
+int Parallel::Get_Textual_W(1543,36313
+int Parallel::Get_Textual_H(1559,36722
+void Parallel::SetTerminalPos(1570,37191
+void Parallel::SetFather(1590,37698
+void Parallel::SetCollapsed(1601,37950
+Ident_Eq::Ident_Eq(1615,38177
+void Ident_Eq::SetPosition(1632,38546
+void Ident_Eq::SetDimensions(1647,38851
+void Ident_Eq::SetFather(1662,39191
+void Ident_Eq::SetCollapsed(1669,39295
+Ident_Eq_List::Ident_Eq_List(1681,39480
+void Ident_Eq_List::SetPosition(1694,39753
+void Ident_Eq_List::SetDimensions(1712,40111
+void Ident_Eq_List::SetCollapsed(1729,40538
+void Ident_Eq_List::SetFather(1738,40683
+Local_Def::Local_Def(1751,40904
+void Local_Def::SetPosition(1761,41102
+void Local_Def::SetDimensions(1791,41833
+void Local_Def::SetFather(1832,43262
+void Local_Def::SetCollapsed(1839,43370
+void Local_Def::SetTextual(1848,43504
+Hide::Hide(1860,43681
+void Hide::SetPosition(1871,43872
+void Hide::SetDimensions(1901,44569
+void Hide::SetFather(1944,45771
+void Hide::SetCollapsed(1951,45873
+void Hide::SetTextual(1961,46003
+Interl::Interl(1972,46175
+void Interl::SetPosition(1982,46361
+void Interl::SetDimensions(1993,46593
+void Interl::SetFather(2021,47103
+Syncr::Syncr(2031,47257
+void Syncr::SetPosition(2041,47438
+void Syncr::SetDimensions(2051,47609
+void Syncr::SetFather(2079,48153
+Enable::Enable(2090,48436
+void Enable::SetPosition(2102,48690
+void Enable::SetDimensions(2169,50473
+void Enable::SetTextual(2243,53017
+void Enable::SetTerminalPos(2251,53140
+int Enable::Get_Textual_W(2271,53720
+int Enable::Get_Textual_H(2282,53985
+void Enable::SetFather(2285,54104
+void Enable::SetCollapsed(2298,54418
+Disable::Disable(2314,54780
+void Disable::SetPosition(2325,55001
+void Disable::SetDimensions(2376,56251
+void Disable::SetFather(2436,58064
+void Disable::SetCollapsed(2446,58284
+void Disable::SetTextual(2455,58412
+void Disable::SetTerminalPos(2463,58536
+int Disable::Get_Textual_W(2479,58987
+int Disable::Get_Textual_H(2488,59190
+Gen_Paral::Gen_Paral(2500,59630
+void Gen_Paral::SetPosition(2513,59899
+void Gen_Paral::SetDimensions(2540,60659
+void Gen_Paral::SetFather(2590,62171
+void Gen_Paral::SetCollapsed(2597,62290
+Action_Pref::Action_Pref(2609,62583
+void Action_Pref::SetPosition(2620,62829
+void Action_Pref::SetDimensions(2669,63937
+void Action_Pref::SetFather(2724,65777
+void Action_Pref::SetCollapsed(2734,66010
+void Action_Pref::SetTextual(2743,66147
+Internal::Internal(2757,66484
+void Internal::SetPosition(2768,66658
+void Internal::SetDimensions(2778,66838
+void Internal::SetFather(2806,67442
+Communication::Communication(2816,67702
+void Communication::SetPosition(2827,67956
+void Communication::SetDimensions(2897,70390
+void Communication::SetFather(2935,71706
+void Communication::SetCollapsed(2942,71837
+void Communication::SetTextual(2949,71968
+NoGuard::NoGuard(2961,72262
+void NoGuard::SetPosition(2974,72462
+void NoGuard::SetDimensions(2984,72639
+void NoGuard::SetFather(2987,72678
+Guard::Guard(2996,72929
+void Guard::SetPosition(3008,73118
+void Guard::SetDimensions(3022,73428
+void Guard::SetFather(3044,73894
+void Guard::SetCollapsed(3050,73974
+NoExperiment::NoExperiment(3062,74258
+void NoExperiment::SetPosition(3075,74478
+void NoExperiment::SetDimensions(3085,74670
+void NoExperiment::SetFather(3088,74714
+Experiment::Experiment(3097,74978
+void Experiment::SetPosition(3110,75245
+void Experiment::SetDimensions(3128,75611
+void Experiment::SetFather(3150,76066
+void Experiment::SetCollapsed(3157,76188
+void Experiment::SetTextual(3165,76311
+Proc_Inst::Proc_Inst(3175,76476
+void Proc_Inst::SetPosition(3191,76777
+void Proc_Inst::SetDimensions(3236,77965
+void Proc_Inst::SetFather(3286,79596
+void Proc_Inst::SetCollapsed(3294,79739
+void Proc_Inst::SetTextual(3304,79909
+Value_Expr::Value_Expr(3316,80100
+void Value_Expr::SetPosition(3329,80327
+void Value_Expr::SetDimensions(3340,80572
+void Value_Expr::SetFather(3343,80614
+Value_Expr_List::Value_Expr_List(3351,80755
+void Value_Expr_List::SetPosition(3364,81042
+void Value_Expr_List::SetDimensions(3382,81406
+void Value_Expr_List::SetFather(3399,81830
+void Value_Expr_List::SetCollapsed(3408,81977
+Sum_Ident::Sum_Ident(3423,82203
+void Sum_Ident::SetPosition(3435,82445
+void Sum_Ident::SetDimensions(3466,83196
+void Sum_Ident::SetFather(3509,84540
+void Sum_Ident::SetCollapsed(3516,84653
+void Sum_Ident::SetTextual(3525,84793
+void Sum_Ident::SetTerminalPos(3532,84897
+Value::Value(3552,85432
+void Value::SetPosition(3569,85792
+void Value::SetDimensions(3583,86091
+void Value::SetFather(3606,86628
+void Value::SetCollapsed(3613,86731
+Term::Term(3626,86908
+void Term::SetPosition(3646,87323
+void Term::SetDimensions(3671,87942
+void Term::SetFather(3697,88599
+void Term::SetCollapsed(3705,88732
+Exit_Entry::Exit_Entry(3719,88947
+void Exit_Entry::SetPosition(3732,89176
+void Exit_Entry::SetDimensions(3743,89421
+void Exit_Entry::SetFather(3746,89463
+Exit_Entry_List::Exit_Entry_List(3754,89604
+void Exit_Entry_List::SetPosition(3766,89875
+void Exit_Entry_List::SetDimensions(3785,90304
+void Exit_Entry_List::SetFather(3802,90753
+void Exit_Entry_List::SetCollapsed(3811,90900
+Sum_Gate::Sum_Gate(3826,91125
+void Sum_Gate::SetPosition(3837,91363
+void Sum_Gate::SetDimensions(3873,92120
+void Sum_Gate::SetFather(3915,93438
+void Sum_Gate::SetCollapsed(3922,93549
+void Sum_Gate::SetTextual(3931,93687
+void Sum_Gate::SetTerminalPos(3938,93790
+Gate_Decl::Gate_Decl(3959,94421
+void Gate_Decl::SetPosition(3977,94900
+void Gate_Decl::SetDimensions(3995,95298
+void Gate_Decl::SetFather(4011,95694
+void Gate_Decl::SetCollapsed(4020,95871
+Gate_Decl_List::Gate_Decl_List(4034,96130
+void Gate_Decl_List::SetPosition(4047,96414
+void Gate_Decl_List::SetDimensions(4065,96779
+void Gate_Decl_List::SetFather(4082,97207
+void Gate_Decl_List::SetCollapsed(4091,97353
+Par::Par(4106,97572
+void Par::SetPosition(4126,97957
+void Par::SetDimensions(4174,99236
+void Par::SetFather(4226,100814
+void Par::SetCollapsed(4234,100943
+void Par::SetTextual(4245,101100
+Sort_Id_Exit::Sort_Id_Exit(4258,101329
+void Sort_Id_Exit::SetPosition(4270,101556
+void Sort_Id_Exit::SetDimensions(4283,101834
+void Sort_Id_Exit::SetFather(4297,102142
+void Sort_Id_Exit::SetCollapsed(4303,102228
+Equality::Equality(4314,102512
+Equality::Equality(4327,102736
+void Equality::SetPosition(4340,102987
+void Equality::SetDimensions(4357,103329
+void Equality::SetFather(4377,103720
+void Equality::SetCollapsed(4387,103858
+Guarded::Guarded(4401,104167
+void Guarded::SetPosition(4413,104384
+void Guarded::SetDimensions(4441,105084
+void Guarded::SetFather(4482,106273
+void Guarded::SetCollapsed(4489,106377
+void Guarded::SetTextual(4499,106509
+Exper_Off::Exper_Off(4510,106813
+void Exper_Off::SetPosition(4523,107035
+void Exper_Off::SetDimensions(4533,107220
+void Exper_Off::SetFather(4536,107261
+Exper_Off_List::Exper_Off_List(4544,107521
+void Exper_Off_List::SetPosition(4557,107802
+void Exper_Off_List::SetDimensions(4575,108167
+void Exper_Off_List::SetFather(4592,108594
+void Exper_Off_List::SetCollapsed(4601,108740
+Exclam::Exclam(4616,109087
+void Exclam::SetPosition(4629,109300
+void Exclam::SetDimensions(4641,109541
+void Exclam::SetFather(4655,109830
+void Exclam::SetCollapsed(4661,109912
+Query::Query(4673,110194
+void Query::SetPosition(4686,110399
+void Query::SetDimensions(4698,110636
+void Query::SetFather(4712,110918
+void Query::SetCollapsed(4718,110997
+Definition::Definition(4729,111279
+void Definition::SetPosition(4741,111448
+void Definition::SetDimensions(4752,111658
+void Definition::SetFather(4766,111896
+void Definition::SetPath(4777,112089
+Proc_List::Proc_List(4790,112374
+void Proc_List::SetPosition(4799,112505
+void Proc_List::SetDimensions(4809,112686
+void Proc_List::SetFather(4815,112767
+void Proc_List::SetPath(4824,112908
+char *Proc_List::GetPath(Proc_List::GetPath4832,113068
+
+cp-src/abstract.H,2253
+#define abstract_hh16,453
+class ID_Place:ID_Place23,536
+ char *GetIdent(ID_Place::GetIdent41,857
+ void SetRBubble(ID_Place::SetRBubble42,891
+ char GetRBubble(ID_Place::GetRBubble43,934
+class ID_List:ID_List47,1012
+class Id_Decl:Id_Decl73,1540
+class Id_Decl_List:Id_Decl_List89,1829
+class Comment:Comment105,2140
+class Comment_List:Comment_List122,2440
+class Value_Expr:Value_Expr135,2694
+class Value_Expr_List:Value_Expr_List149,2911
+class Exit_Entry:Exit_Entry165,3244
+class Exit_Entry_List:Exit_Entry_List179,3460
+class Exper_Off:Exper_Off195,3793
+class Exper_Off_List:Exper_Off_List207,3977
+class Gate_Decl:Gate_Decl223,4323
+class Gate_Decl_List:Gate_Decl_List239,4630
+class Ident_Eq:Ident_Eq255,4957
+class Ident_Eq_List:Ident_Eq_List271,5270
+class Half_Container:Half_Container287,5608
+class Specification:Specification308,5954
+class Process:Process337,6609
+ char GetNesting(Process::GetNesting363,7186
+class Proc_List:Proc_List367,7257
+class Definition:Definition382,7574
+ char *GetPath(Definition::GetPath397,7940
+class Exit:Exit407,8071
+class NoExit:NoExit421,8305
+class Value:Value440,8560
+class Term:Term456,8841
+class Equality:Equality473,9169
+class Sort_Id_Exit:Sort_Id_Exit490,9504
+class NoGuard:NoGuard511,9837
+class Guard:Guard524,10045
+class NoExperiment:NoExperiment545,10368
+class Experiment:Experiment558,10591
+ Tree_Node *GetGuard(Experiment::GetGuard574,10962
+class Exclam:Exclam578,11053
+class Query:Query593,11324
+class Internal:Internal614,11643
+class Communication:Communication627,11854
+class Gen_Paral:Gen_Paral652,12337
+ void HideGate(Gen_Paral::HideGate668,12634
+class Interl:Interl672,12730
+class Syncr:Syncr685,12929
+class Action_Pref:Action_Pref704,13185
+class Enable:Enable723,13577
+class Disable:Disable746,14097
+class Choice:Choice768,14561
+class Stop:Stop793,15054
+class Exit_Bex:Exit_Bex810,15338
+class Hide:Hide829,15707
+class Guarded:Guarded848,16047
+class Proc_Inst:Proc_Inst867,16425
+class Parallel:Parallel888,16870
+ char GetOperType(Parallel::GetOperType910,17343
+class Local_Def:Local_Def914,17429
+class Par:Par933,17801
+class Sum_Gate:Sum_Gate952,18180
+class Sum_Ident:Sum_Ident972,18613
+
+cp-src/cfront.H,2555
+struct loc     67,1948
+struct ea 80,2150
+       ea(ea::ea86,2249
+       ea(ea::ea87,2275
+       ea(ea::ea88,2301
+       ea(ea::ea89,2310
+overload error;94,2349
+#define DEL(161,4040
+#define PERM(162,4092
+#define UNPERM(163,4123
+struct node 165,4157
+struct table 175,4321
+       void    set_scope(table::set_scope198,4988
+       void    set_name(table::set_name199,5029
+       int     max(table::max201,5091
+#define DEFINED 230,5655
+#define SIMPLIFIED 231,5712
+#define DEF_SEEN 232,5754
+#define IN_ERROR 234,5859
+struct type 236,5881
+       TOK     integral(type::integral255,6278
+       TOK     numeric(type::numeric256,6324
+       TOK     num_ptr(type::num_ptr257,6370
+struct enumdef 265,6500
+               enumdef(enumdef::enumdef269,6586
+struct classdef 278,6732
+       TOK     is_simple(classdef::is_simple302,7506
+       Pname   has_ctor(classdef::has_ctor314,7759
+       Pname   has_dtor(classdef::has_dtor315,7813
+       Pname   has_itor(classdef::has_itor316,7867
+struct basetype 323,7935
+struct fct 365,8857
+       bit     declared(fct::declared396,9724
+struct name_list 403,9827
+       name_list(name_list::name_list406,9866
+struct gen 410,9931
+struct pvtyp 419,10071
+struct vec 423,10109
+       vec(vec::vec429,10182
+struct ptr 435,10289
+       ptr(ptr::ptr440,10419
+inline Pptr type::addrof(447,10546
+struct expr 469,11113
+struct texpr 527,12108
+       texpr(texpr::texpr528,12149
+struct ival 531,12218
+       ival(ival::ival532,12258
+struct call 535,12308
+       call(call::call536,12338
+struct qexpr 543,12453
+       qexpr(qexpr::qexpr544,12500
+struct ref 547,12582
+       ref(ref::ref548,12632
+struct text_expr 551,12697
+       text_expr(text_expr::text_expr552,12731
+struct name 557,12884
+       void    unhide(name::unhide592,13929
+       void    use(name::use596,14025
+       void    take_addr(name::take_addr598,14069
+struct stmt 615,14374
+struct estmt 662,15111
+       estmt(estmt::estmt669,15303
+struct ifstmt 672,15379
+       ifstmt(ifstmt::ifstmt676,15484
+struct lstmt 680,15586
+       lstmt(lstmt::lstmt686,15650
+struct forstmt 689,15728
+       forstmt(forstmt::forstmt690,15759
+struct block 694,15880
+       block(block::block695,15919
+struct pair 703,16060
+       pair(pair::pair704,16096
+struct nlist 708,16173
+       void    add(nlist::add712,16230
+struct slist 718,16344
+               slist(slist::slist721,16385
+       void    add(slist::add722,16430
+struct elist 727,16521
+               elist(elist::elist730,16562
+       void    add(elist::add731,16607
+struct dcl_context 739,16739
+       void    stack(dcl_context::stack747,17023
+       void    unstack(dcl_context::unstack748,17064
+#define MAXCONT        751,17095
+const MIA 779,17690
+struct iline 780,17705
+#define FUDGE111 791,17985
+#define DB(831,18890
+#define DB(833,18920
+
+cp-src/burton.cpp,103
+::dummy::dummy test::dummy1(1,0
+::dummy::dummy test::dummy2(6,64
+::dummy::dummy test::dummy3(11,143
+
+cp-src/functions.cpp,807
+void Date::setDate 5,148
+void Date::plus 32,939
+void Date::minus 42,1229
+void Date::shift 52,1407
+Date & Date::operator = Date::operator =62,1628
+Date & Date::operator += Date::operator +=69,1789
+Date & Date::operator -= Date::operator -=78,1939
+Date & Date::operator ++ Date::operator ++87,2080
+Date & Date::operator -- Date::operator --96,2216
+int Date::operator - Date::operator -104,2331
+int Date::operator < Date::operator <112,2483
+int Date::operator > Date::operator >116,2557
+int Date::operator == Date::operator ==120,2631
+ostream& operator << operator <<124,2707
+istream& operator >> operator >>133,2943
+bool isLeap 159,3543
+bool isHoliday 163,3629
+void asort(173,3865
+void ReadVacation 186,4064
+void Debug 201,4523
+int WorkingDays(211,4867
+Date StartDay(226,5129
+
+cp-src/MDiagArray2.h,709
+#define octave_MDiagArray2_h 29,870
+#undef LTGT35,967
+#define LTGT39,1031
+#define LTGT 42,1051
+class MDiagArray2 78,2022
+  MDiagArray2 MDiagArray2::MDiagArray282,2077
+  MDiagArray2 MDiagArray2::MDiagArray286,2154
+  MDiagArray2 MDiagArray2::MDiagArray287,2198
+  MDiagArray2 MDiagArray2::MDiagArray288,2254
+  MDiagArray2 MDiagArray2::MDiagArray289,2329
+  MDiagArray2 MDiagArray2::MDiagArray290,2387
+  MDiagArray2 MDiagArray2::MDiagArray291,2450
+  ~MDiagArray2 MDiagArray2::~MDiagArray293,2515
+  MDiagArray2<T>& operator = MDiagArray2::operator =95,2542
+  operator MArray2<T> MDiagArray2::operator MArray2<T>101,2667
+#undef LTGT144,3874
+#define INSTANTIATE_MDIAGARRAY_FRIENDS(146,3887
+
+cp-src/Pctest.h,507
+#define PCTEST_H24,837
+    PctestActionValid,::PctestActionValid47,1286
+    PctestActionValidLasthop,::PctestActionValidLasthop49,1370
+    PctestActionFiltered,::PctestActionFiltered51,1481
+    PctestActionAbort  ::PctestActionAbort53,1566
+} PctestActionType;54,1616
+class Pctest 56,1637
+    Pctest(Pctest::Pctest59,1663
+    virtual ~Pctest(Pctest::~Pctest65,1813
+    virtual char *GetTargetName(Pctest::GetTargetName77,2171
+    virtual PctestActionType GetAction(Pctest::GetAction86,2555
+
+cp-src/Range.h,424
+#define octave_Range_h 24,765
+Range35,891
+  Range Range::Range39,909
+  Range Range::Range42,995
+  Range Range::Range46,1130
+  Range Range::Range50,1248
+  double base Range::base54,1376
+  double limit Range::limit55,1425
+  double inc Range::inc56,1475
+  int nelem Range::nelem57,1523
+  void set_base Range::set_base68,1728
+  void set_limit Range::set_limit69,1774
+  void set_inc Range::set_inc70,1821
+
+cp-src/screen.cpp,228
+unsigned char cursor_x,15,548
+unsigned char cursor_x, cursor_y;15,548
+static union REGS regs;16,582
+void goto_xy(18,607
+void hide_cursor(27,774
+void cursor_position(32,836
+void clear_screen(41,997
+void write_xyc(55,1247
+
+cp-src/screen.hpp,667
+#define __COLORS9,401
+enum COLORS 11,419
+    BLACK,COLORS::BLACK12,433
+    BLUE,COLORS::BLUE13,471
+    GREEN,COLORS::GREEN14,481
+    CYAN,COLORS::CYAN15,492
+    RED,COLORS::RED16,502
+    MAGENTA,COLORS::MAGENTA17,511
+    BROWN,COLORS::BROWN18,524
+    LIGHTGRAY,COLORS::LIGHTGRAY19,535
+    DARKGRAY,COLORS::DARKGRAY20,550
+    LIGHTBLUE,COLORS::LIGHTBLUE21,589
+    LIGHTGREEN,COLORS::LIGHTGREEN22,604
+    LIGHTCYAN,COLORS::LIGHTCYAN23,620
+    LIGHTRED,COLORS::LIGHTRED24,635
+    LIGHTMAGENTA,COLORS::LIGHTMAGENTA25,649
+    YELLOW,COLORS::YELLOW26,667
+    WHITECOLORS::WHITE27,679
+#define SCREEN_FP(31,700
+#define SCREEN_START 33,795
+
+cp-src/conway.cpp,270
+#define max(12,357
+#define min(13,393
+const int num_rows 15,430
+const int num_columns 16,470
+class site *field_of_play[field_of_play18,499
+int site::total_surrounding(20,550
+void display(37,958
+void glider(50,1239
+void traffic_light(59,1478
+void main(67,1633
+
+cp-src/conway.hpp,244
+class site:site5,235
+    site(site::site10,344
+    char read(site::read12,410
+    void set(site::set13,444
+    void clear(site::clear14,478
+    void compute_next_state(site::compute_next_state15,514
+    void step(site::step22,717
+
+cp-src/clheir.cpp,307
+const int max_num_generic_objects 9,298
+generic_object * object_registry[object_registry10,340
+void init_registry(12,400
+void step_everybody(19,527
+void discrete_location::clear_neighbors(31,852
+generic_object::generic_object(36,981
+generic_object::~generic_object(48,1255
+void agent::move(53,1353
+
+cp-src/clheir.hpp,609
+class generic_object13,520
+    virtual void compute_next_state(generic_object::compute_next_state21,842
+    virtual void step(generic_object::step22,888
+const int max_num_directions 31,1219
+class location:location33,1289
+    location(location::location43,1642
+class irregular_location:irregular_location47,1686
+    irregular_location(irregular_location::irregular_location51,1762
+class discrete_location:discrete_location56,1889
+    discrete_location(discrete_location::discrete_location62,2044
+    void assign_neighbor(discrete_location::assign_neighbor66,2184
+class agent:agent75,2508
+
+cp-src/fail.C,365
+struct A 7,263
+          struct B A::B8,274
+                  struct C A::B::C9,289
+                          C(A::B::C::C11,318
+                          operator int(A::B::C::operator int12,342
+                  typedef C T;A::B::T14,389
+          typedef B T2;A::T216,414
+class A 23,453
+       class B A::B24,463
+               class C A::B::C25,474
+               int f(A::B::f26,488
+int A::B::f(31,521
+main(37,571
+       class D 41,622
+               D(D::D43,659
+
+el-src/TAGTEST.EL,148
+(foo::defmumble bletch 1,0
+(defalias 'pending-delete-mode pending-delete-mode5,102
+(defalias (quote explicitly-quoted-pending-delete-mode)8,175
+
+el-src/emacs/lisp/progmodes/etags.el,5069
+(defvar tags-file-name 34,1034
+(defgroup etags 43,1498
+(defcustom tags-case-fold-search 47,1566
+(defcustom tags-table-list 59,2051
+(defcustom tags-compression-info-list69,2449
+(defcustom tags-add-tables 88,3231
+(defcustom tags-revert-without-query 98,3627
+(defvar tags-table-computed-list 103,3778
+(defvar tags-table-computed-list-for 112,4262
+(defvar tags-table-list-pointer 117,4510
+(defvar tags-table-list-started-at 121,4701
+(defvar tags-table-set-list 124,4821
+(defcustom find-tag-hook 129,5000
+(defcustom find-tag-default-function 137,5263
+(define-obsolete-variable-alias 
'find-tag-marker-ring-lengthfind-tag-marker-ring-length145,5602
+(defcustom tags-tag-face 148,5699
+(defcustom tags-apropos-verbose 154,5834
+(defcustom tags-apropos-additional-actions 160,5998
+(defvaralias 'find-tag-marker-ring find-tag-marker-ring183,6917
+(defvar default-tags-table-function 189,7097
+(defvar tags-location-ring 194,7323
+(defvar tags-table-files 201,7599
+(defvar tags-completion-table 206,7766
+(defvar tags-included-tables 209,7858
+(defvar next-file-list 212,7953
+(defvar tags-table-format-functions 217,8059
+(defvar file-of-tag-function 224,8440
+(defvar tags-table-files-function 228,8634
+(defvar tags-completion-table-function 230,8745
+(defvar snarf-tag-function 232,8840
+(defvar goto-tag-location-function 236,9049
+(defvar find-tag-regexp-search-function 239,9222
+(defvar find-tag-regexp-tag-order 241,9343
+(defvar find-tag-regexp-next-line-after-failure-p 243,9452
+(defvar find-tag-search-function 245,9572
+(defvar find-tag-tag-order 247,9679
+(defvar find-tag-next-line-after-failure-p 249,9774
+(defvar list-tags-function 251,9880
+(defvar tags-apropos-function 253,9968
+(defvar tags-included-tables-function 255,10062
+(defvar verify-tags-table-function 257,10181
+(defun initialize-new-tags-table 260,10292
+(defun tags-table-mode 276,10980
+(defun visit-tags-table 285,11245
+(defun tags-table-check-computed-list 321,12783
+(defun tags-table-extend-computed-list 360,14654
+(defun tags-expand-table-name 400,16367
+(defun tags-table-list-member 409,16710
+(defun tags-verify-table 421,17182
+(defun tags-table-including 470,19302
+(defun tags-next-table 522,21346
+(defun visit-tags-table-buffer 543,22203
+(defun tags-reset-tags-tables 712,28513
+(defun file-of-tag 731,29170
+(defun tags-table-files 740,29519
+(defun tags-included-tables 749,29869
+(defun tags-completion-table 755,30115
+(defun tags-lazy-completion-table 783,31309
+(defun tags-completion-at-point-function 799,31944
+(defun find-tag-tag 818,32694
+(defvar last-tag 837,33367
+(defun find-tag-interactive 840,33426
+(defvar find-tag-history 852,33841
+(defun find-tag-noselect 860,34011
+(defun find-tag 932,37125
+(defun find-tag-other-window 959,38341
+(defun find-tag-other-frame 1000,40269
+(defun find-tag-regexp 1025,41443
+(defalias 'pop-tag-mark pop-tag-mark1049,42605
+(defvar tag-lines-already-matched 1052,42656
+(defun find-tag-in-order 1055,42763
+(defun tag-find-file-of-tag-noselect 1167,47109
+(defun tag-find-file-of-tag 1200,48955
+(defun etags-recognize-tags-table 1208,49181
+(defun etags-verify-tags-table 1241,50812
+(defun etags-file-of-tag 1246,51010
+(defun etags-tags-completion-table 1256,51345
+(defun etags-snarf-tag 1286,52551
+(defun etags-goto-tag-location 1324,54120
+(defun etags-list-tags 1388,56563
+(defmacro tags-with-face 1423,57838
+(defun etags-tags-apropos-additional 1431,58171
+(defun etags-tags-apropos 1465,59408
+(defun etags-tags-table-files 1527,61617
+(defun etags-tags-included-tables 1542,62053
+(defun tags-recognize-empty-tags-table 1559,62593
+(defun tag-exact-file-name-match-p 1587,63739
+(defun tag-file-name-match-p 1596,64132
+(defun tag-exact-match-p 1609,64688
+(defun tag-implicit-name-match-p 1620,65256
+(defun tag-symbol-match-p 1633,65856
+(defun tag-word-match-p 1643,66292
+(defun tag-partial-file-name-match-p 1652,66690
+(defun tag-any-match-p 1662,67134
+(defun tag-re-match-p 1667,67318
+(defcustom tags-loop-revert-buffers 1675,67567
+(defun next-file 1685,67976
+(defvar tags-loop-operate 1760,70890
+(defvar tags-loop-scan1763,70984
+(defun tags-loop-eval 1771,71314
+(defun tags-loop-continue 1782,71643
+(defun tags-search 1850,73949
+(defun tags-query-replace 1871,74775
+(defun tags-complete-tags-table-file 1896,75999
+(defun list-tags 1906,76378
+(defun tags-apropos 1934,77331
+(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78157
+(defun select-tags-table 1964,78396
+(defvar select-tags-table-mode-map 2019,80523
+(define-derived-mode select-tags-table-mode 2030,80906
+(defun select-tags-table-select 2034,81090
+(defun select-tags-table-quit 2043,81456
+(defun complete-tag 2049,81611
+(defconst etags--xref-limit 2074,82552
+(defvar etags-xref-find-definitions-tag-order 2076,82587
+(defun etags-xref-find 2082,82877
+(defun etags--xref-find-definitions 2096,83406
+(defclass xref-etags-location 2129,85121
+(defun xref-make-etags-location 2135,85344
+(cl-defmethod xref-location-marker 2139,85499
+(cl-defmethod xref-location-line 2146,85743
+
+erl-src/gs_dialog.erl,98
+-define(VERSION2,32
+behaviour_info(51,2177
+show(124,5458
+dialog_loop(219,9529
+test(252,10806
+
+erl-src/lines.erl,386
+-define(BREAK66,2377
+-define(dbg68,2437
+new(73,2565
+count(80,2686
+nth(87,2815
+append(104,3301
+replace(119,3816
+insert(138,4559
+insert_after(165,5501
+delete(192,6456
+convert_to_list(215,7110
+convert_from_list(220,7259
+replace_nth(229,7518
+insert_nth(234,7618
+insert_after_nth(239,7711
+delete_nth(244,7828
+split_at(252,8027
+balance_left(267,8451
+balance_right(282,8865
+
+erl-src/lists.erl,593
+member(21,663
+append(30,790
+reverse(48,1099
+nth(59,1310
+nthtail(64,1382
+prefix(73,1546
+suffix(83,1707
+last(92,1882
+seq(101,2058
+sum(109,2265
+duplicate(116,2432
+min(124,2628
+max(132,2837
+sublist(141,3083
+delete(152,3329
+sort(161,3483
+split_and_sort(165,3559
+merge(175,3811
+concat(190,4219
+thing_to_list(195,4300
+flatten(204,4606
+flat_length(222,5003
+keymember(239,5451
+keysearch(246,5609
+keydelete(253,5770
+keyreplace(260,5923
+keysort(266,6113
+split_and_keysort(270,6229
+keymerge(277,6504
+keymap(288,6851
+map(311,7829
+foldl(315,7919
+foldr(320,8037
+zf(325,8155
+
+f-src/entry.for,172
+      LOGICAL FUNCTION PRTPKG 3,75
+       ENTRY  SETPRT 194,3866
+       ENTRY  MSGSEL 395,8478
+     & intensity1(577,12231
+       character*(*) function foo(579,12307
+
+f-src/entry.strange_suffix,172
+      LOGICAL FUNCTION PRTPKG 3,75
+       ENTRY  SETPRT 194,3866
+       ENTRY  MSGSEL 395,8478
+     & intensity1(577,12231
+       character*(*) function foo(579,12307
+
+f-src/entry.strange,103
+       ENTRY  MSGSEL 193,4382
+     & intensity1(375,8135
+       character*(*) function foo(377,8211
+
+forth-src/test-forth.fth,408
+: a-forth-word 20,301
+99 constant a-forth-constant!22,343
+55 value a-forth-value?23,373
+create :a-forth-dictionary-entry24,397
+defer #a-defer-word27,460
+: (another-forth-word)(another-forth-word29,481
+   9   field   >field136,582
+   5   field   >field237,605
+constant (a-forth-constant(a-forth-constant38,628
+2000 buffer: #some-storage41,657
+code assemby-code-word 43,685
+: a-forth-word 50,870
+
+html-src/softwarelibero.html,198
+Cos'� il software libero?4,38
+Licenze d'uso di un programmalicenze65,2474
+Sfatiamo alcuni miti138,6064
+Il movimento open sourceoss191,7968
+Impatto pratico del software liberoimpatto231,9986
+
+html-src/index.shtml,104
+&nbsp;8,281
+In evidenza15,446
+Comunicati e iniziative32,974
+Ultime notizie dall'associazione63,2027
+
+html-src/algrthms.html,467
+Tutorial on Convolutional Coding with Viterbi Decoding--Description of the 
Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and 
Quantizing Algorithms7,276
+Descriptionalgorithms10,477
+Generating the Datagenalgorithm48,1953
+Convolutionallyconalgorithm55,2463
+Nextstatetable262,11331
+Outputoutputtable350,13571
+Mapping the Channel Symbolsmapping433,15786
+Adding Noise to theaddnoise439,16174
+Quantizing the Receivedquantizing469,18637
+
+html-src/software.html,438
+Francesco Potort� Software Page9,280
+Software that I wrote for supporting my research activitysimulation36,1400
+MTGmtg41,1484
+Fracasfracas65,2626
+GaliLEOgalileo101,4234
+Leasqrleasqr114,4679
+Free software that I wrote for the GNU project or for my personal or 
workgnu142,6067
+Etagsetags148,6182
+checkiso161,6731
+cgrep178,7549
+debian-bug.eldebian-bug190,7981
+tcpdump205,8566
+Links to interesting softwarelinks216,8893
+
+java-src/AWTEMul.java,4356
+public class AWTEventMulticaster 63,2111
+    protected 
AWTEventMulticaster(AWTEventMulticaster.AWTEventMulticaster77,2555
+    protected EventListener remove(AWTEventMulticaster.remove86,2820
+    public void componentResized(AWTEventMulticaster.componentResized102,3294
+    public void componentMoved(AWTEventMulticaster.componentMoved112,3626
+    public void componentShown(AWTEventMulticaster.componentShown122,3952
+    public void componentHidden(AWTEventMulticaster.componentHidden132,4280
+    public void componentAdded(AWTEventMulticaster.componentAdded142,4619
+    public void componentRemoved(AWTEventMulticaster.componentRemoved152,4959
+    public void focusGained(AWTEventMulticaster.focusGained162,5281
+    public void focusLost(AWTEventMulticaster.focusLost172,5572
+    public void keyTyped(AWTEventMulticaster.keyTyped182,5853
+    public void keyPressed(AWTEventMulticaster.keyPressed192,6129
+    public void keyReleased(AWTEventMulticaster.keyReleased202,6413
+    public void mouseClicked(AWTEventMulticaster.mouseClicked212,6704
+    public void mousePressed(AWTEventMulticaster.mousePressed222,7004
+    public void mouseReleased(AWTEventMulticaster.mouseReleased232,7306
+    public void mouseEntered(AWTEventMulticaster.mouseEntered242,7609
+    public void mouseExited(AWTEventMulticaster.mouseExited252,7907
+    public void mouseDragged(AWTEventMulticaster.mouseDragged262,8204
+    public void mouseMoved(AWTEventMulticaster.mouseMoved272,8512
+    public void windowOpened(AWTEventMulticaster.windowOpened282,8819
+    public void windowClosing(AWTEventMulticaster.windowClosing292,9125
+    public void windowClosed(AWTEventMulticaster.windowClosed302,9432
+    public void windowIconified(AWTEventMulticaster.windowIconified312,9742
+    public void 
windowDeiconified(AWTEventMulticaster.windowDeiconified322,10064
+    public void windowActivated(AWTEventMulticaster.windowActivated332,10389
+    public void 
windowDeactivated(AWTEventMulticaster.windowDeactivated342,10712
+    public void actionPerformed(AWTEventMulticaster.actionPerformed352,11037
+    public void 
itemStateChanged(AWTEventMulticaster.itemStateChanged362,11356
+    public void 
adjustmentValueChanged(AWTEventMulticaster.adjustmentValueChanged372,11690
+    public void 
textValueChanged(AWTEventMulticaster.textValueChanged376,11874
+    public static ComponentListener add(AWTEventMulticaster.add387,12225
+    public static ContainerListener add(AWTEventMulticaster.add397,12571
+    public static FocusListener add(AWTEventMulticaster.add407,12901
+    public static KeyListener add(AWTEventMulticaster.add417,13207
+    public static MouseListener add(AWTEventMulticaster.add427,13513
+    public static MouseMotionListener add(AWTEventMulticaster.add437,13855
+    public static WindowListener add(AWTEventMulticaster.add447,14197
+    public static ActionListener add(AWTEventMulticaster.add457,14519
+    public static ItemListener add(AWTEventMulticaster.add467,14833
+    public static AdjustmentListener add(AWTEventMulticaster.add477,15163
+    public static TextListener add(AWTEventMulticaster.add480,15310
+    public static ComponentListener 
remove(AWTEventMulticaster.remove490,15664
+    public static ContainerListener 
remove(AWTEventMulticaster.remove500,16044
+    public static FocusListener remove(AWTEventMulticaster.remove510,16408
+    public static KeyListener remove(AWTEventMulticaster.remove520,16748
+    public static MouseListener remove(AWTEventMulticaster.remove530,17088
+    public static MouseMotionListener 
remove(AWTEventMulticaster.remove540,17465
+    public static WindowListener remove(AWTEventMulticaster.remove550,17841
+    public static ActionListener remove(AWTEventMulticaster.remove560,18197
+    public static ItemListener remove(AWTEventMulticaster.remove570,18545
+    public static AdjustmentListener 
remove(AWTEventMulticaster.remove580,18909
+    public static TextListener remove(AWTEventMulticaster.remove583,19062
+    protected static EventListener 
addInternal(AWTEventMulticaster.addInternal597,19608
+    protected static EventListener 
removeInternal(AWTEventMulticaster.removeInternal614,20244
+    protected void saveInternal(AWTEventMulticaster.saveInternal628,20582
+    static void save(AWTEventMulticaster.save646,21131
+
+java-src/KeyEve.java,698
+public class KeyEvent 36,1075
+    public KeyEvent(KeyEvent.KeyEvent234,9912
+    public KeyEvent(KeyEvent.KeyEvent252,10510
+    public int getKeyCode(KeyEvent.getKeyCode261,10836
+    public void setKeyCode(KeyEvent.setKeyCode265,10897
+    public void setKeyChar(KeyEvent.setKeyChar269,10978
+    public void setModifiers(KeyEvent.setModifiers273,11060
+    public char getKeyChar(KeyEvent.getKeyChar282,11331
+    public static String getKeyText(KeyEvent.getKeyText290,11561
+    public static String 
getKeyModifiersText(KeyEvent.getKeyModifiersText377,16662
+    public boolean isActionKey(KeyEvent.isActionKey403,17618
+    public String paramString(KeyEvent.paramString407,17704
+
+java-src/SMan.java,5099
+class SecurityManager 80,3387
+    public boolean getInCheck(SecurityManager.getInCheck101,4075
+    protected SecurityManager(SecurityManager.SecurityManager114,4497
+    protected Class 
currentLoadedClass(SecurityManager.currentLoadedClass149,5707
+    protected boolean inClass(SecurityManager.inClass184,7034
+    protected boolean inClassLoader(SecurityManager.inClassLoader196,7372
+    public Object 
getSecurityContext(SecurityManager.getSecurityContext221,8485
+    public void 
checkCreateClassLoader(SecurityManager.checkCreateClassLoader238,9069
+    public void checkAccess(SecurityManager.checkAccess268,10298
+    public void checkAccess(SecurityManager.checkAccess298,11632
+    public void checkExit(SecurityManager.checkExit323,12649
+    public void checkExec(SecurityManager.checkExec349,13734
+    public void checkLink(SecurityManager.checkLink375,14813
+    public void checkRead(SecurityManager.checkRead394,15485
+    public void checkRead(SecurityManager.checkRead412,16111
+    public void checkRead(SecurityManager.checkRead434,17017
+    public void checkWrite(SecurityManager.checkWrite453,17706
+    public void checkWrite(SecurityManager.checkWrite471,18337
+    public void checkDelete(SecurityManager.checkDelete493,19165
+    public void checkConnect(SecurityManager.checkConnect517,20119
+    public void checkConnect(SecurityManager.checkConnect543,21254
+    public void checkListen(SecurityManager.checkListen561,21910
+    public void checkAccept(SecurityManager.checkAccept585,22887
+    public void checkMulticast(SecurityManager.checkMulticast597,23272
+    public void checkMulticast(SecurityManager.checkMulticast610,23732
+    public void 
checkPropertiesAccess(SecurityManager.checkPropertiesAccess632,24609
+    public void 
checkPropertyAccess(SecurityManager.checkPropertyAccess654,25449
+    public boolean 
checkTopLevelWindow(SecurityManager.checkTopLevelWindow680,26580
+    public void 
checkPrintJobAccess(SecurityManager.checkPrintJobAccess689,26763
+    public void 
checkSystemClipboardAccess(SecurityManager.checkSystemClipboardAccess698,26958
+    public void 
checkAwtEventQueueAccess(SecurityManager.checkAwtEventQueueAccess707,27159
+    public void 
checkPackageAccess(SecurityManager.checkPackageAccess729,27966
+    public void 
checkPackageDefinition(SecurityManager.checkPackageDefinition751,28803
+    public void checkSetFactory(SecurityManager.checkSetFactory775,29929
+    public void checkMemberAccess(SecurityManager.checkMemberAccess786,30209
+    public void 
checkSecurityAccess(SecurityManager.checkSecurityAccess796,30430
+    public ThreadGroup getThreadGroup(SecurityManager.getThreadGroup811,30923
+class NullSecurityManager 817,31025
+    public void 
checkCreateClassLoader(NullSecurityManager.checkCreateClassLoader818,31077
+    public void checkAccess(NullSecurityManager.checkAccess819,31123
+    public void checkAccess(NullSecurityManager.checkAccess820,31165
+    public void checkExit(NullSecurityManager.checkExit821,31212
+    public void checkExec(NullSecurityManager.checkExec822,31254
+    public void checkLink(NullSecurityManager.checkLink823,31296
+    public void checkRead(NullSecurityManager.checkRead824,31338
+    public void checkRead(NullSecurityManager.checkRead825,31387
+    public void checkRead(NullSecurityManager.checkRead826,31430
+    public void checkWrite(NullSecurityManager.checkWrite827,31489
+    public void checkWrite(NullSecurityManager.checkWrite828,31539
+    public void checkDelete(NullSecurityManager.checkDelete829,31583
+    public void checkConnect(NullSecurityManager.checkConnect830,31628
+    public void checkConnect(NullSecurityManager.checkConnect831,31684
+    public void checkListen(NullSecurityManager.checkListen832,31756
+    public void checkAccept(NullSecurityManager.checkAccept833,31798
+    public void checkMulticast(NullSecurityManager.checkMulticast834,31853
+    public void checkMulticast(NullSecurityManager.checkMulticast835,31907
+    public void 
checkPropertiesAccess(NullSecurityManager.checkPropertiesAccess836,31971
+    public void 
checkPropertyAccess(NullSecurityManager.checkPropertyAccess837,32015
+    public void 
checkPropertyAccess(NullSecurityManager.checkPropertyAccess838,32067
+    public boolean 
checkTopLevelWindow(NullSecurityManager.checkTopLevelWindow839,32131
+    public void 
checkPrintJobAccess(NullSecurityManager.checkPrintJobAccess840,32202
+    public void 
checkSystemClipboardAccess(NullSecurityManager.checkSystemClipboardAccess841,32244
+    public void 
checkAwtEventQueueAccess(NullSecurityManager.checkAwtEventQueueAccess842,32293
+    public void 
checkPackageAccess(NullSecurityManager.checkPackageAccess843,32340
+    public void 
checkPackageDefinition(NullSecurityManager.checkPackageDefinition844,32391
+    public void checkSetFactory(NullSecurityManager.checkSetFactory845,32446
+    public void 
checkMemberAccess(NullSecurityManager.checkMemberAccess846,32484
+    public void 
checkSecurityAccess(NullSecurityManager.checkSecurityAccess847,32546
+
+java-src/SysCol.java,295
+public final class SystemColor 37,1402
+    private static void 
updateSystemColors(SystemColor.updateSystemColors349,10617
+    private SystemColor(SystemColor.SystemColor357,10885
+    public int getRGB(SystemColor.getRGB370,11245
+    public String toString(SystemColor.toString377,11388
+
+java-src/TG.java,2041
+class ThreadGroup 54,2104
+    private ThreadGroup(ThreadGroup.ThreadGroup72,2495
+    public ThreadGroup(ThreadGroup.ThreadGroup84,2848
+    public ThreadGroup(ThreadGroup.ThreadGroup105,3714
+    public final String getName(ThreadGroup.getName124,4189
+    public final ThreadGroup getParent(ThreadGroup.getParent135,4492
+    public final int getMaxPriority(ThreadGroup.getMaxPriority148,4867
+    public final boolean isDaemon(ThreadGroup.isDaemon161,5305
+    public synchronized boolean isDestroyed(ThreadGroup.isDestroyed170,5470
+    public final void setDaemon(ThreadGroup.setDaemon192,6368
+    public final void setMaxPriority(ThreadGroup.setMaxPriority213,7110
+    public final boolean parentOf(ThreadGroup.parentOf246,8106
+    public final void checkAccess(ThreadGroup.checkAccess268,8834
+    public int activeCount(ThreadGroup.activeCount283,9286
+    public int enumerate(ThreadGroup.enumerate322,10497
+    public int enumerate(ThreadGroup.enumerate344,11481
+    private int enumerate(ThreadGroup.enumerate348,11584
+    public int activeGroupCount(ThreadGroup.activeGroupCount389,12588
+    public int enumerate(ThreadGroup.enumerate425,13727
+    public int enumerate(ThreadGroup.enumerate445,14595
+    private int enumerate(ThreadGroup.enumerate449,14703
+    public final void stop(ThreadGroup.stop499,16212
+    public final void suspend(ThreadGroup.suspend537,17477
+    public final void resume(ThreadGroup.resume575,18749
+    public final void destroy(ThreadGroup.destroy607,19779
+    private final void add(ThreadGroup.add643,20704
+    private void remove(ThreadGroup.remove668,21402
+    void add(ThreadGroup.add697,22142
+    void remove(ThreadGroup.remove722,22808
+    public void list(ThreadGroup.list751,23503
+    void list(ThreadGroup.list754,23556
+    public void uncaughtException(ThreadGroup.uncaughtException810,25512
+    public boolean 
allowThreadSuspension(ThreadGroup.allowThreadSuspension823,25823
+    public String toString(ThreadGroup.toString837,26142
+
+lua-src/allegro.lua,400
+local function get_layer_by_name 7,175
+local function count_layers 33,621
+function GetLayerByName 54,980
+function GetUniqueLayerName 65,1204
+function SelectLayer 76,1415
+function NewLayer 86,1773
+function NewLayerSet 144,3226
+function RemoveLayer 170,3750
+function MoveLayerTop 211,4767
+function MoveLayerBottom 223,5079
+function MoveLayerBefore 236,5457
+function MoveLayerAfter 258,6090
+
+make-src/Makefile,1133
+LATEST=1,0
+NONSRCS=35,1578
+CPPFLAGS=49,2191
+LDFLAGS=50,2260
+FASTCFLAGS=55,2531
+FILTER=58,2642
+       @-$($72,3064
+       @-$($73,3113
+       @-$($74,3177
+       @-$($75,3223
+       @-$($76,3291
+       @-$($77,3383
+       @$(81,3466
+       @$(82,3514
+       @$(83,3577
+       @$(84,3622
+       @$(85,3689
+       @$(86,3780
+${CHECKOBJS}: CFLAGS=88,3806
+       @env CHECKEROPTS=92,3922
+       @$(98,4094
+       @$(106,4250
+       @$(110,4374
+       @$(114,4500
+       @for i in $(SRCS); do echo $$i;140,5315
+       $(160,6053
+       $(163,6114
+       $(166,6177
+       $(169,6228
+       $(172,6317
+       sdiff --suppress-common-lines --width=width186,6614
+       sdiff --suppress-common-lines --width=width189,6703
+       sdiff --suppress-common-lines --width=width192,6791
+       sdiff --suppress-common-lines --width=width195,6880
+       TEXTAGS=204,7122
+       TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* 
--regex=regex204,7122
+       ${RUN} etags12 --members -o $@ --regex=regex207,7239
+       ${RUN} ./ctags -o $@ --regex=regex213,7388
+       ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=regex216,7464
+       TEXTAGS=219,7583
+       TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ 
--regex=regex219,7583
+       ${RUN} ./extags -e --regex-c=c222,7710
+
+objc-src/Subprocess.h,98
+#define Subprocess 41,1217
+#define BUFFERSIZE 43,1267
address@hidden Subprocess:Subprocess45,1292
+
+objc-src/Subprocess.m,475
+#define        PTY_TEMPLATE 20,494
+#define        PTY_LENGTH 21,528
address@hidden Subprocess(Private)Subprocess(Private)32,737
+- childDidExit39,851
+- fdHandler:67,1589
+showError 98,2360
+fdHandler 112,2785
+getptys 119,2907
+- init:183,4815
+    andStdErr:init:withDelegate:andPtySupport:andStdErr:197,5147
+- send:(const char *)string withNewline:send:withNewline:300,7436
+- send:308,7599
+- terminateInput314,7689
+- terminate:321,7810
+- setDelegate:332,7961
+- delegate338,8031
+
+objc-src/PackInsp.h,109
+#define NUMSTATS       36,1101
+#define TYPESTOSTAT    37,1120
address@hidden PackageInspector:PackageInspector39,1172
+
+objc-src/PackInsp.m,1360
+static const char RCSid[RCSid30,1032
+#define VERSION        34,1116
+#   define DEBUG 37,1155
+#define LISTCONTENTS   39,1181
+#define OPENBUTTON     47,1352
+#define LISTCONTENTSBUTTON     48,1449
+#define LISTDESCRIPTIONBUTTON  49,1562
+#define STATE_UNINSTALLED      52,1687
+#define STATE_INSTALLED        53,1807
+#define STATE_COMPRESSD        54,1948
+#define SIZEFORMAT     57,2152
+#define KBYTES 58,2362
+#define MBYTES 59,2473
+#define LOCALIZE(61,2585
+#define LOCALIZE_ARCH(62,2668
++newnew67,2802
+-showInfo:showInfo:93,3417
+-revert:revert:107,3737
+-ok:ok:136,4297
+-loadload143,4424
+#define LOOKUP(156,4826
+#undef LOOKUP176,5694
+-loadKeyValuesFrom:(const char *)type 
inTable:loadKeyValuesFrom:inTable:186,5852
+-loadContentsOf:(const char *)type inTable:loadContentsOf:inTable:238,7079
+-loadImageloadImage257,7552
+#define STAT_EQ(275,7940
+-(BOOL)shouldLoad280,8116
+-toggleDescriptiontoggleDescription301,8626
+-(const char *)getPath:(char *)buf forType:getPath:forType:317,8899
+-setRevertButtonTitlesetRevertButtonTitle333,9320
+-(const char *)formatSize:(const char *)size inBuf:formatSize:inBuf:344,9525
+#define WORKING        368,10045
+-(void)getArchs370,10100
+-(void)addArchs:385,10520
+-subprocess:(Subprocess *)sender output:subprocess:output:428,11351
+-subprocessDone:subprocessDone:436,11484
+static void openInWorkspace(446,11634
+-open:open:464,12063
+
+objcpp-src/SimpleCalc.H,41
address@hidden SimpleCalc:SimpleCalc14,400
+
+objcpp-src/SimpleCalc.M,300
+- init52,1747
+- appendToDisplay:60,1933
+- registerAction:70,2210
+- decimalKey:77,2348
+- numberKeys:91,2661
+- equalsKey:112,3192
+- operationKeys:131,3680
+- clearKey:153,4301
+- clearAllKey:160,4410
+- appDidInit:168,4591
+- windowWillClose:178,4882
+- infoPanel:186,5132
+- helpPanel:198,5482
+
+pas-src/common.pas,1875
+procedure InitializeStringPackage;26,527
+function newtextstring;34,874
+procedure disposetextstring;52,1404
+function ConcatT;78,2066
+function AppendTextString;112,3238
+function CopyTextString;132,3947
+procedure CONVERT_CHARSTRING_TO_VALUE;151,4505
+procedure append_string;172,5166
+function To_Upper;186,5462
+function To_Lower;194,5617
+function EmptyNmStr(209,6213
+function chartonmstr;219,6436
+function LowerCaseNmStr;230,6682
+function concatenatenamestrings;242,7007
+procedure writenamestring;263,7517
+function IsControlChar;277,7928
+function namestringequal;283,8079
+function NameStringLess;302,8539
+function IsControlCharName(343,9710
+function SubString;358,10208
+function SkipChars;379,10791
+function RemoveUnderlineControl;397,11311
+procedure First100Chars;427,12162
+procedure SkipSpaces;462,13298
+function SkipBlanks;477,13782
+function stripname;505,14595
+function Locate;522,15039
+function NameHasChar;543,15581
+function integertonmstr;561,16134
+function NmStrToInteger;585,16901
+function AddNullToNmStr;600,17317
+function ValToNmStr;611,17585
+function ChangeFileType;625,18037
+function StripPath;647,18734
+function ReprOfChar;675,19343
+procedure ExtractCommentInfo;702,20749
+procedure INSERT_TREE_NODE;784,24053
+function GetNameList;920,27926
+procedure DisposeANameList(925,28010
+procedure DisposeNameList;938,28340
+function GetNewNameListNode;943,28409
+function insertname;972,29051
+procedure InitNameList;988,29471
+procedure InitNameStringPool;998,29767
+procedure NewNameString;1004,29867
+procedure ReleaseNameString;1022,30232
+procedure SDTrefStringToRec 1045,30741
+procedure SDTrefSkipSpaces;1059,31092
+function SDTrefIsEnd 1070,31323
+function SDTrefGetInteger 1082,31529
+procedure SDTrefRecToString 1303,37546
+function NmStrToErrStr;1497,42305
+function ErrStrToNmStr;1509,42557
+function GetTextRef;1529,43112
+
+php-src/lce_functions.php,2152
+  define("LCE_FUNCTIONS"LCE_FUNCTIONS4,38
+  define("LCE_UNKNOWN"LCE_UNKNOWN9,145
+  define("LCE_WS"LCE_WS11,194
+  define("LCE_COMMENT"LCE_COMMENT13,244
+  define("LCE_COMMENT_USER"LCE_COMMENT_USER15,303
+  define("LCE_COMMENT_TOOL"LCE_COMMENT_TOOL17,366
+  define("LCE_MSGID"LCE_MSGID19,430
+  define("LCE_MSGSTR"LCE_MSGSTR21,488
+  define("LCE_TEXT"LCE_TEXT23,541
+  define("STATE_ABORT"STATE_ABORT25,567
+  define("STATE_OK"STATE_OK26,595
+  define("STATE_LOOP"STATE_LOOP27,620
+  class POEntryAD 29,648
+      function validate(31,683
+      function checkQuotation(59,1384
+  class CommentAD 70,1639
+      function CommentAD(73,1693
+      function validate(83,1944
+  class POEntry 105,2410
+      function POEntry(119,2711
+      function lineCount(135,3255
+      function serializeToVars(141,3365
+      function write(151,3800
+  class POReader 163,4178
+      function gettext(177,4457
+      function parseFromVars(189,4705
+      function serializeToVars(215,5331
+      function POReader(229,5613
+      function read(243,5983
+      function write(259,6307
+      function isComment(277,6645
+      function comment(284,6822
+      function msgid(304,7247
+      function msgstr(320,7574
+      function start(340,8232
+      function createPOEntries(360,8644
+      function stripLine(394,9472
+      function printClassification(421,10056
+      function classifyLine(432,10301
+  function getTextDomains(471,11094
+  class PORManager 498,11756
+      function PORManager(502,11822
+      function addPOReader(507,11896
+      function &getPOReader(getPOReader512,11992
+      function getDomainNames(517,12081
+  function &loadPORManager(loadPORManager523,12174
+  function fileJoin(536,12436
+      function lce_bindtextdomain(557,12839
+      function lce_textdomain(614,14530
+      function lce_gettext(620,14641
+      function lce_dgettext(626,14767
+      function lce(634,14966
+      function lce_bindtextdomain(651,15488
+      function lce_textdomain(656,15592
+      function lce_gettext(661,15674
+      function lce_dgettext(666,15755
+      function lce(670,15855
+  function lce_geteditcode(676,15898
+
+php-src/ptest.php,46
+define("TEST"TEST1,0
+test 4,26
+foo(16,200
+
+perl-src/htlmify-cystic,1443
+my @section_name;section_name12,236
+my @appendix_name;appendix_name13,254
+my @section_toc;section_toc15,274
+my @appendix_toc;appendix_toc16,291
+my $new_tag new_tag18,310
+my $appendix;appendix24,409
+my $section;section25,423
+my $subsection;subsection26,436
+my $subsubsection;subsubsection27,452
+my $this_file_toc this_file_toc29,472
+my %file_tocs;file_tocs30,496
+my @output_files output_files32,512
+my $file_index file_index33,535
+my $output_file;output_file35,556
+my $line;line37,574
+my $subsection_marker;subsection_marker161,3883
+my $new;new163,3907
+sub read_toc main::read_toc165,3917
+         my $entry entry218,5621
+         my $entry entry234,6077
+             my $entry entry245,6351
+         my $entry entry252,6536
+         my $entry entry268,7010
+             my $entry entry276,7204
+         my $entry entry281,7328
+      my $entry entry296,7698
+sub finish_subsubsections main::finish_subsubsections302,7805
+sub finish_subsections main::finish_subsections309,7987
+sub finish_sections main::finish_sections320,8310
+sub finish_appendices main::finish_appendices331,8599
+sub section_url_base main::section_url_base337,8724
+sub section_url_name main::section_url_name342,8922
+sub section_url main::section_url355,9284
+  my $name name357,9336
+sub section_href main::section_href364,9452
+sub section_name main::section_name368,9551
+sub toc_line main::toc_line372,9655
+sub file_end main::file_end375,9750
+
+perl-src/yagrip.pl,258
+sub getopt main::getopt7,156
+       local($_,$flag,$opt,$f,$r,@temp)($_,$flag,$opt,$f,$r,@temp8,169
+sub usage main::usage38,856
+       local($prog,$_,@list)($prog,$_,@list39,868
+       
local($string,$flag,@string,@temp,@last)($string,$flag,@string,@temp,@last40,897
+
+perl-src/kai-test.pl,244
+sub f1 main::f12,16
+sub main::f2 6,50
+package Foo;10,90
+sub f3 Foo::f312,104
+sub Bar::f4 16,138
+package Bar;20,177
+sub f5 Bar::f522,191
+package Foo::Bar;26,225
+sub f6 Foo::Bar::f628,244
+package main;32,278
+sub f7 main::f734,293
+
+perl-src/mirror.pl,13410
+sub msg_versionmain::msg_version459,18271
+       local( $arg )( $arg 468,18582
+               local( $flag, $p )( $flag, $p 480,18757
+               local( $site_path )( $site_path 525,19687
+                       local( $site, $path )( $site, $path 539,19958
+               local( $key_val )( $key_val 578,20743
+               local( $user )( $user 595,21097
+               local( $c )( $c 634,21853
+                       local( $sec,$min,$hour,$mday,$mon,$year,( 
$sec,$min,$hour,$mday,$mon,$year,678,22807
+       local( $c )( $c 706,23393
+       local( $dir, $mp )( $dir, $mp 723,23695
+               local( $f )( $f 725,23740
+sub interpret_config_filesmain::interpret_config_files756,24304
+       local( $fname )( $fname 758,24333
+sub interpret_configmain::interpret_config785,24927
+sub parse_linemain::parse_line827,25710
+       local( $eqpl )( $eqpl 829,25727
+       local( $cont )( $cont 830,25744
+                       local( $v )( $v 839,26029
+sub set_defaultsmain::set_defaults860,26448
+sub command_line_overridemain::command_line_override868,26579
+       local( $key, $val, $overrides )( $key, $val, $overrides 870,26607
+sub set_variablesmain::set_variables894,27072
+       local( $key, $val )( $key, $val 896,27092
+                       local( $val_name )( $val_name 902,27259
+               local( $val )( $val 953,28825
+sub upd_valmain::upd_val962,28974
+       local( $key )( $key 964,28988
+sub pr_variablesmain::pr_variables970,29083
+       local( $msg )( $msg 972,29102
+       local( $nle )( $nle 973,29123
+       local( $out )( $out 974,29144
+       local( $key, $val, $str )( $key, $val, $str 975,29164
+sub do_mirrormain::do_mirror1007,29923
+       local( $get_one_package )( $get_one_package 1009,29939
+       local( $exit_status )( $exit_status 1030,30384
+                       local( @t )( @t 1154,33165
+       local( $con )( $con 1241,35499
+               local( @rhelp )( @rhelp 1289,36702
+       local( @sub_dirs )( @sub_dirs 1329,37778
+       local( $now )( $now 1493,41348
+               local( $arg )( $arg 1506,41774
+sub disconnectmain::disconnect1528,42250
+sub connectmain::connect1546,42576
+       local( $attempts )( $attempts 1548,42590
+       local( $res )( $res 1549,42642
+sub prodmain::prod1573,43156
+sub checkout_regexpsmain::checkout_regexps1585,43327
+       local( $ret )( $ret 1587,43350
+       local( $t )( $t 1589,43395
+               local( $val )( $val 1597,43701
+                       local( $err )( $err 1601,43786
+sub clear_localmain::clear_local1610,43909
+sub clear_remotemain::clear_remote1625,44172
+sub get_local_directory_detailsmain::get_local_directory_details1640,44445
+       local( @dirs, $dir )( @dirs, $dir 1642,44479
+       local( $last_prodded )( $last_prodded 1643,44502
+       local( $dir_level )( $dir_level 1691,45615
+       local( $i )( $i 1692,45641
+       local( $path, $time, $size, $type, $mode, $name, $isdir, $value, 
$follow )( $path, $time, $size, $type, $mode, $name, $isdir, $value, $follow 
1693,45659
+       local( $dev,$ino,$fmode,$nlink,$uid,$gid,$rdev,$ssize,( 
$dev,$ino,$fmode,$nlink,$uid,$gid,$rdev,$ssize,1694,45736
+                       local( $mapi )( $mapi 1763,47586
+sub get_remote_directory_detailsmain::get_remote_directory_details1789,48122
+       local( $type_changed )( $type_changed 1791,48157
+       local( $udirtmp )( $udirtmp 1792,48186
+       local( $storename )( $storename 1793,48206
+       local( $rls )( $rls 1825,48944
+               local( $dirtmp )( $dirtmp 1830,49002
+               local( $unsquish )( $unsquish 1832,49130
+                       local( $f )( $f 1840,49360
+               local( $dirtmp )( $dirtmp 1859,49866
+               local( $unsquish )( $unsquish 1870,50215
+                       local( $f, $uf )( $f, $uf 1878,50445
+               local( $flags )( $flags 1912,51259
+       local( $parse_state )( $parse_state 1946,52111
+                       local( $msg )( $msg 1963,52486
+sub patch_ls_lR_filemain::patch_ls_lR_file1984,52955
+       local( $f, $fr, $flb, $flt, $flp, $flz, $frb, $frt )( $f, $fr, $flb, 
$flt, $flp, $flz, $frb, $frt 1990,53055
+       local( $to , $tn )( $to , $tn 1991,53110
+       local( $tlb )( $tlb 1995,53225
+               local( $p, $s, $trz, $t, $m )( $p, $s, $trz, $t, $m 2030,54182
+               local( $tlz )( $tlz 2037,54467
+sub parse_timeoutmain::parse_timeout2089,55670
+sub parse_remote_detailsmain::parse_remote_details2095,55754
+       local( $ret )( $ret 2097,55781
+       local( $old_sig )( $old_sig 2098,55797
+sub parse_remote_details_realmain::parse_remote_details_real2125,56234
+       local( $path, $size, $time, $type, $mode, $rdir, $rcwd )( $path, 
$size, $time, $type, $mode, $rdir, $rcwd 2127,56266
+       local( @dir_list )( @dir_list 2128,56325
+       local( $i )( $i 2129,56346
+       local( $old_path )( $old_path 2130,56364
+                               local( $old_path )( $old_path 2143,56630
+                               local( $ri )( $ri 2203,58078
+                       local( $mapi )( $mapi 2214,58335
+                       local( $done )( $done 2239,58911
+sub compare_dirsmain::compare_dirs2283,59825
+       local( *src_paths,( *src_paths,2286,59915
+       local( $src_path, $dest_path, $i )( $src_path, $dest_path, $i 
2293,60099
+       local( $last_prodded )( $last_prodded 2294,60136
+       local( $desti, $srci, $compress, $srciZ, $srcigz, $split, 
$dest_path_real )( $desti, $srci, $compress, $srciZ, $srcigz, $split, 
$dest_path_real 2299,60350
+       local( $old_dest_path, $existing_path, $tmp, $restart )( 
$old_dest_path, $existing_path, $tmp, $restart 2300,60428
+       local( $sp, $dp )( $sp, $dp 2301,60486
+                  local( $real, $reali, $reali1 )( $real, $reali, $reali1 
2352,62034
+                  local( $count )( $count 2353,62072
+                       local( $value )( $value 2408,63996
+                       local( $real )( $real 2409,64028
+                       local( $reali )( $reali 2410,64086
+                               local( $old )( $old 2421,64571
+                       local( $old_dest_path )( $old_dest_path 2432,64842
+                               local( $dpp, $dps )( $dpp, $dps 2509,67031
+               local( $update )( $update 2534,67671
+sub map_namemain::map_name2651,71028
+       local( $name )( $name 2653,71043
+               local( $old_name )( $old_name 2656,71089
+               local( $tmp )( $tmp 2666,71252
+sub set_timestampsmain::set_timestamps2675,71362
+       local( $src_path )( $src_path 2677,71383
+       local( $dest_path, $dest_loc_mapi, $src_rem_mapi,  $rtime )( 
$dest_path, $dest_loc_mapi, $src_rem_mapi,  $rtime 2685,71517
+sub set_timestampmain::set_timestamp2699,71901
+       local( $path, $time )( $path, $time 2701,71921
+       local( $pr_time )( $pr_time 2703,71953
+sub make_dirsmain::make_dirs2719,72284
+       local( $thing )( $thing 2721,72300
+sub make_symlinksmain::make_symlinks2736,72489
+       local( $thing )( $thing 2738,72509
+               local( $dest, $existing )( $dest, $existing 2745,72623
+               local( $dirpart )( $dirpart 2746,72663
+               local( $ft )( $ft 2747,72704
+               local( $p )( $p 2762,73261
+                       local( $f )( $f 2770,73467
+                       local( $dl )( $dl 2788,74038
+sub do_all_transfersmain::do_all_transfers2806,74439
+       local( $src_path )( $src_path 2808,74462
+       local( $dest_path, $attribs )( $dest_path, $attribs 2809,74483
+       local( $srci )( $srci 2810,74515
+               local( $newpath )( $newpath 2838,75124
+sub transfer_filemain::transfer_file2869,75847
+       local( $src_path, $dest_path, $attribs, $timestamp )( $src_path, 
$dest_path, $attribs, $timestamp 2871,75867
+       local( $dir, $file, $temp, $compress, $split, $restart, $mesg, 
$got_mesg )( $dir, $file, $temp, $compress, $split, $restart, $mesg, $got_mesg 
2872,75927
+               local( $src_file )( $src_file 2915,76782
+               local( $comptemp )( $comptemp 2916,76816
+                       local( $f )( $f 2921,76964
+               local($filesize)($filesize2944,77569
+                       local( $ti )( $ti 2975,78401
+               local( $f )( $f 2997,78887
+               local( $comp )( $comp 2998,78912
+       local( $filesize )( $filesize 3015,79427
+       local( $sizemsg )( $sizemsg 3016,79469
+       local( $srcsize )( $srcsize 3017,79501
+               local( $time )( $time 3029,79865
+       local( $as )( $as 3046,80223
+       local( $locali )( $locali 3054,80499
+sub filename_to_tempnamemain::filename_to_tempname3062,80713
+       local( $dir, $file )( $dir, $file 3064,80740
+       local ( $dest_path )( $dest_path 3066,80769
+sub log_uploadmain::log_upload3090,81228
+       local( $src_path, $dest_path, $got_mesg, $size )( $src_path, 
$dest_path, $got_mesg, $size 3092,81245
+sub do_deletesmain::do_deletes3118,81773
+       local( *src_paths,( *src_paths,3121,81861
+       local( $files_to_go, $dirs_to_go )( $files_to_go, $dirs_to_go 
3125,81960
+       local( $src_path, $i )( $src_path, $i 3131,82055
+       local( $orig_do_deletes )( $orig_do_deletes 3132,82080
+       local( $orig_save_deletes )( $orig_save_deletes 3133,82122
+       local( $del_patt )( $del_patt 3135,82169
+               local( $per )( $per 3162,82843
+               local( $per )( $per 3184,83513
+                       local( $save_dir_tail )( $save_dir_tail 3226,84617
+sub save_deletemain::save_delete3245,85019
+       local( $save, $kind )( $save, $kind 3247,85037
+       local( $real_save_dir, $save_dest )( $real_save_dir, $save_dest 
3249,85067
+       local( $dirname )( $dirname 3284,85704
+sub save_mkdirmain::save_mkdir3304,86155
+       local( $dir )( $dir 3306,86172
+sub do_deletemain::do_delete3320,86459
+       local( $del, $kind )( $del, $kind 3322,86475
+sub filesizemain::filesize3377,87532
+       local( $fname )( $fname 3379,87547
+sub istruemain::istrue3390,87654
+       local( $val )( $val 3392,87667
+sub mksymlinkmain::mksymlink3398,87773
+       local( $dest_path, $existing_path )( $dest_path, $existing_path 
3400,87789
+               local( $msg )( $msg 3417,88246
+               local( $msg )( $msg 3431,88590
+               local( $status )( $status 3442,88816
+sub mkdirsmain::mkdirs3457,89196
+       local( $dir )( $dir 3459,89209
+       local( @dir, $d, $path )( @dir, $d, $path 3460,89230
+sub make_dirmain::make_dir3497,90042
+       local( $dir, $mode )( $dir, $mode 3499,90057
+       local( $val )( $val 3500,90085
+sub dir_existsmain::dir_exists3528,90573
+       local( $dir )( $dir 3530,90590
+       local( $val )( $val 3531,90611
+               local($old_dir)($old_dir3539,90750
+sub set_attribsmain::set_attribs3553,91053
+       local( $path, $src_path, $type )( $path, $src_path, $type 3555,91071
+       local( $mode )( $mode 3556,91111
+               local( $pathi )( $pathi 3564,91229
+               local( $pathi )( $pathi 3568,91320
+sub get_passwdmain::get_passwd3606,91977
+       local( $user )( $user 3608,91994
+       local( $pass )( $pass 3609,92016
+       local( $| )( $| 3610,92033
+sub compare_timesmain::compare_times3631,92384
+       local( $t1, $t2 )( $t1, $t2 3637,92564
+       local( $diff )( $diff 3638,92589
+sub create_assocsmain::create_assocs3643,92688
+       local( $map )( $map 3645,92708
+sub delete_assocsmain::delete_assocs3657,92957
+       local( $map )( $map 3659,92977
+sub unlink_dbmmain::unlink_dbm3671,93247
+       local( $file )( $file 3673,93264
+sub bsplitmain::bsplit3681,93462
+       local( $temp, $dest_path, $time )( $temp, $dest_path, $time 3683,93475
+       local( $dest_dir )( $dest_dir 3684,93516
+       local( $bufsiz )( $bufsiz 3685,93558
+       local( $buffer, $in, $sofar )( $buffer, $in, $sofar 3686,93583
+       local( $d )( $d 3691,93721
+       local( $index )( $index 3697,93840
+       local( $part )( $part 3698,93865
+                       local( $locali )( $locali 3714,94336
+       local( $readme )( $readme 3730,94740
+sub sysmain::sys3739,95116
+       local( $com )( $com 3741,95126
+sub set_assoc_from_arraymain::set_assoc_from_array3751,95355
+       local( *things )( *things 3754,95453
+sub find_progmain::find_prog3760,95537
+       local( $prog )( $prog 3762,95553
+       local( $path )( $path 3763,95575
+               local( $path )( $path 3766,95657
+sub real_dir_from_pathmain::real_dir_from_path3780,95842
+       local( $program )( $program 3782,95867
+       local( @prog_path )( @prog_path 3783,95892
+       local( $dir )( $dir 3784,95970
+sub msgmain::msg3807,96489
+       local( $todo, $msg )( $todo, $msg 3809,96499
+sub to_bytesmain::to_bytes3838,96979
+       local( $size )( $size 3840,96994
+sub unix2vmsmain::unix2vms3858,97332
+       local( $v, $kind )( $v, $kind 3860,97347
+                       local( $dir, $rest )( $dir, $rest 3873,97559
+sub dirpartmain::dirpart3886,97730
+       local( $path )( $path 3888,97744
+sub expand_symlinkmain::expand_symlink3902,98076
+       local( $orig_path, $points_to )( $orig_path, $points_to 3904,98097
+       local( $dirpart )( $dirpart 3905,98136
+sub flatten_pathmain::flatten_path3913,98365
+       local( $path )( $path 3915,98384
+       local( $changed )( $changed 3916,98406
+       local( $i )( $i 3917,98430
+       local( $rooted )( $rooted 3919,98446
+       local( $count )( $count 3920,98482
+       local( $orig_path )( $orig_path 3921,98504
+               local( $in )( $in 3932,98741
+               local( @parts )( @parts 3933,98765
+sub fix_packagemain::fix_package3963,99438
+       local( $package )( $package 3965,99456
+sub will_compressmain::will_compress3970,99529
+sub will_splitmain::will_split3981,99859
+sub myflockmain::myflock3989,100001
+       local( $file, $kind )( $file, $kind 3991,100015
+sub t2strmain::t2str4004,100221
+       local( @t )( @t 4006,100233
+       
local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst4013,100335
+sub handlermain::handler4022,100583
+        local( $sig )( $sig 4029,100651
+        local( $msg )( $msg 4030,100679
+        local( $package, $filename, $line )( $package, $filename, $line 
4031,100737
+sub trap_signalsmain::trap_signals4036,100859
+       local( $sig )( $sig 4038,100878
+sub map_user_groupmain::map_user_group4047,101158
+sub keepmain::keep4069,101537
+       local( $pathi, $path, *keep, *keep_totals, *keep_map, $kind )( $pathi, 
$path, *keep, *keep_totals, *keep_map, $kind 4071,101548
+sub alarmmain::alarm4104,102330
+       local( $time_to_sig )( $time_to_sig 4106,102342
+sub chownmain::chown4110,102405
+       local( $uid, $gid, $path )( $uid, $gid, $path 4112,102417
+sub utimemain::utime4116,102494
+       local( $atime, $mtime, $path )( $atime, $mtime, $path 4118,102506
+       local( $old_mode )( $old_mode 4124,102685
+       local( $tmp_mode )( $tmp_mode 4125,102730
+       local( $ret )( $ret 4126,102763
+sub cwdmain::cwd4135,102913
+       local( $lcwd )( $lcwd 4137,102923
+
+ps-src/rfc1245.ps,2478
+/FMversion 12,311
+/FrameDict 17,500
+/FMVERSION 47,1307
+/FMLOCAL 56,1494
+/FMDOCUMENT 73,1766
+/FMBEGINPAGE 95,2279
+/FMENDPAGE 109,2516
+/FMDEFINEFONT 115,2582
+/FMNORMALIZEGRAPHICS 126,2725
+/FMBEGINEPSF 142,2955
+/FMENDEPSF 153,3207
+/setmanualfeed 158,3283
+/max 163,3386
+/min 164,3426
+/inch 165,3466
+/pagedimen 166,3485
+/setpapername 172,3629
+/papersize 190,4214
+/manualpapersize 211,4789
+/desperatepapersize 230,5211
+/savematrix 239,5370
+/restorematrix 242,5425
+/dmatrix 245,5475
+/dpi 246,5495
+/freq 248,5583
+/sangle 249,5658
+/DiacriticEncoding 250,5717
+/.notdef 251,5738
+/.notdef 252,5801
+/.notdef 253,5864
+/.notdef 254,5927
+/.notdef 255,5990
+/numbersign 256,6051
+/parenright 257,6115
+/two 258,6184
+/less 259,6251
+/L 260,6320
+/bracketright 261,6389
+/i 262,6459
+/braceright 263,6529
+/Ntilde 264,6598
+/atilde 265,6668
+/iacute 266,6733
+/ocircumflex 267,6797
+/udieresis 268,6858
+/paragraph 269,6919
+/dieresis 270,6983
+/yen 271,7050
+/ordfeminine 272,7109
+/exclamdown 273,7171
+/guillemotleft 274,7230
+/Otilde 275,7296
+/quoteleft 276,7357
+/fraction 277,7420
+/periodcentered 278,7490
+/Acircumflex 279,7549
+/Icircumflex 280,7610
+/Uacute 281,7680
+/breve 282,7746
+/ReEncode 284,7814
+/graymode 300,8020
+/setpattern 310,8184
+/grayness 331,8725
+/normalize 394,9873
+/dnormalize 397,9942
+/lnormalize 400,10014
+/H 403,10104
+/Z 406,10147
+/X 409,10176
+/V 412,10219
+/N 415,10260
+/M 418,10286
+/E 419,10315
+/D 420,10336
+/O 421,10358
+/L 423,10394
+/Y 430,10489
+/R 439,10588
+/RR 450,10696
+/C 467,10959
+/U 473,11004
+/F 477,11039
+/T 481,11084
+/RF 484,11115
+/TF 488,11164
+/P 495,11219
+/PF 499,11270
+/S 506,11344
+/SF 510,11384
+/B 517,11446
+/BF 521,11505
+/W 538,11714
+/G 573,12382
+/A 582,12525
+/BEGINPRINTCODE 606,12918
+/ENDPRINTCODE 615,13131
+/gn 620,13259
+/cfs 631,13384
+/ic 636,13473
+/ms 658,14285
+/ip 668,14395
+/wh 678,14492
+/bl 684,14607
+/s1 690,14722
+/fl 691,14739
+/hx 698,14887
+/wbytes 709,15055
+/BEGINBITMAPBWc 713,15147
+/BEGINBITMAPGRAYc 716,15198
+/BEGINBITMAP2BITc 719,15251
+/COMMONBITMAPc 722,15304
+/BEGINBITMAPBW 739,15660
+/BEGINBITMAPGRAY 742,15709
+/BEGINBITMAP2BIT 745,15760
+/COMMONBITMAP 748,15811
+/Fmcc 765,16156
+/ngrayt 773,16371
+/nredt 774,16393
+/nbluet 775,16414
+/ngreent 776,16436
+/colorsetup 787,16603
+/fakecolorsetup 814,17370
+/BITMAPCOLOR 826,17636
+/BITMAPCOLORc 839,17926
+/BITMAPGRAY 855,18275
+/BITMAPGRAYc 858,18335
+/ENDBITMAP 861,18397
+/fillprocs 868,18497
+
+prol-src/ordsets.prolog,525
+is_ordset(47,1310
+list_to_ord_set(63,1688
+ord_add_element(71,1867
+ord_del_element(85,2344
+ord_disjoint(100,2783
+ord_intersect(108,2953
+ord_intersection(126,3552
+ord_intersection3(130,3691
+ord_intersection(150,4531
+ord_intersection4(154,4703
+ord_intersection(176,5664
+ord_intersection2(181,5812
+ord_member(200,6318
+ord_seteq(216,6683
+ord_setproduct(225,6971
+ord_subset(240,7377
+ord_subtract(257,7861
+ord_symdiff(265,8054
+ord_union(288,8887
+ord_union4(303,9352
+ord_union(324,10171
+ord_union_all(329,10313
+
+prol-src/natded.prolog,2319
+expandmng(100,2879
+normalize(116,3359
+fresh_vars(125,3716
+subst(138,4134
+normalize_fresh(159,4660
+reduce_subterm(171,5112
+reduce(185,5559
+free_var(196,5903
+free_for(209,6246
+compile_lex(231,6875
+consult_lex:-consult_lex248,7384
+lex(259,7754
+expandsyn(267,8068
+bas_syn(292,8897
+compile_empty:-compile_empty310,9376
+complete(328,10055
+add_active(340,10527
+parse(353,10949
+derived_analyses(364,11341
+build(378,11965
+buildact(392,12521
+mapsyn(412,13542
+add_edge(434,14278
+findcats(447,14758
+normalize_tree(465,15478
+normalize_trees(475,15856
+expandmng_tree(486,16248
+expandmng_trees(496,16614
+cat(511,17013
+subtree(644,21266
+hypothetical_mem(653,21565
+make_coor(667,22130
+start_up:-start_up688,23013
+tokenizeatom(710,23921
+tokenize(720,24348
+isoperator(752,25377
+isoptab(756,25431
+specialsymbol(765,25756
+sstab(771,25861
+parse_cgi(787,26347
+keyvalseq(792,26510
+andkeyvalseq(796,26609
+keyval(799,26688
+valseq(807,26920
+plusvalseq(810,27007
+val(816,27109
+argvals(824,27426
+commaargvals(828,27503
+atomval(833,27578
+atom(836,27640
+action(846,28004
+keyvalcgi(864,28649
+keyvalscgi(865,28670
+outsyn(868,28726
+act(876,29060
+actout(901,29906
+texttreelist(912,30089
+htmltreelist(918,30190
+fitchtreelist(924,30304
+pp_html_table_tree(938,30759
+pp_html_tree(949,31113
+pp_html_trees(988,32381
+pp_html_table_fitch_tree(999,32769
+pp_html_fitch_tree(1017,33672
+removeexp(1129,39002
+splitexp(1142,39490
+pp_exp(1155,39990
+map_word(1168,40249
+pp_exps(1180,40474
+pp_tree(1188,40777
+pp_trees(1216,41807
+pp_word_list(1225,42128
+pp_word(1231,42262
+pp_word_list_rest(1238,42569
+pp_cat(1248,42929
+pp_syn(1255,43196
+pp_syn_paren(1276,43899
+pp_paren(1293,44377
+pp_syn_back(1300,44661
+pp_bas_cat(1311,45001
+writecat(1322,45409
+writesubs(1351,46455
+writesups(1361,46757
+writelistsubs(1371,47090
+pp_lam(1380,47408
+pp_lam_bracket(1398,48022
+pp_lam_paren(1407,48338
+pp_rule(1429,49238
+member(1447,49866
+append_list(1451,49919
+append(1456,50010
+at_least_one_member(1460,50076
+numbervars(1464,50171
+reverse(1467,50209
+select(1471,50290
+select_last(1475,50357
+cat_atoms(1479,50436
+writelist(1485,50524
+write_lex_cat(1492,50676
+writebreaklex(1500,50988
+write_lex(1513,51265
+writebreak(1521,51541
+tt:-tt1531,51713
+mt:-mt1534,51784
+cmt:-cmt1537,51878
+
+pyt-src/server.py,1438
+class Controls:Controls17,358
+    def __init__(18,374
+    def __repr__(24,590
+    def __str__(34,871
+class Server:Server37,934
+    def __init__(38,948
+    def dump(73,2198
+    def __repr__(125,3896
+    def __str__(128,3945
+class User:User131,4014
+    def __init__(132,4026
+    def __repr__(172,5445
+    def __str__(206,6883
+def flag2str(223,7212
+class LabeledEntry(232,7442
+    def bind(234,7525
+    def focus_set(236,7584
+    def __init__(238,7629
+def ButtonBar(245,7909
+def helpwin(255,8280
+class ListEdit(267,8707
+    def __init__(269,8808
+    def handleList(303,10042
+    def handleNew(306,10094
+    def editItem(314,10426
+    def deleteItem(320,10596
+def ConfirmQuit(326,10760
+class ControlEdit(375,12377
+    def PostControls(376,12403
+    def GatherControls(421,13530
+class ServerEdit(512,16264
+    def __init__(513,16289
+    def post(525,16629
+    def gather(543,17191
+    def nosave(547,17304
+    def save(551,17408
+    def refreshPort(556,17509
+    def createWidgets(561,17663
+    def edituser(631,20708
+class UserEdit(645,20921
+    def __init__(646,20944
+    def post(658,21283
+    def gather(676,21841
+    def nosave(680,21950
+    def save(684,22052
+    def createWidgets(689,22151
+class Configure(760,24879
+    def __init__(761,24916
+    def MakeDispose(772,25211
+    def MakeSitelist(786,25706
+    def editsite(794,25949
+    def save(797,26022
+    def nosave(807,26310
+
+tex-src/testenv.tex,52
+\newcommand{\nm}\nm4,77
+\section{blah}blah8,139
+
+tex-src/gzip.texi,303
address@hidden Top,62,2139
address@hidden Copying,80,2652
address@hidden Overview,83,2705
address@hidden Sample,166,7272
address@hidden Invoking gzip,Invoking gzip210,8828
address@hidden Advanced usage,Advanced usage357,13495
address@hidden Environment,420,15207
address@hidden Tapes,437,15768
address@hidden Problems,460,16767
address@hidden Concept Index,Concept Index473,17287
+
+tex-src/texinfo.tex,30626
+\def\texinfoversion{\texinfoversion25,1019
+\def\tie{\tie48,1510
+\def\gloggingall{\gloggingall71,2260
+\def\loggingall{\loggingall72,2329
+\def\onepageout#1{\onepageout98,3266
+\def\croppageout#1{\croppageout114,4016
+\def\cropmarks{\cropmarks141,5076
+\def\pagebody#1{\pagebody143,5123
+\def\ewtop{\ewtop156,5578
+\def\nstop{\nstop157,5642
+\def\ewbot{\ewbot159,5725
+\def\nsbot{\nsbot160,5789
+\def\parsearg #1{\parsearg169,6088
+\def\parseargx{\parseargx171,6166
+\def\parseargline{\parseargline181,6406
+\def\flushcr{\flushcr185,6527
+\newif\ifENV \ENVfalse \def\inENV{\inENV189,6726
+\def\ENVcheck{\ENVcheck190,6790
+\outer\def\begin{\begin197,7037
+\def\beginxxx #1{\beginxxx199,7075
+\def\end{\end207,7330
+\def\endxxx #1{\endxxx209,7358
+\def\errorE#1{\errorE215,7547
+\def\singlespace{\singlespace221,7741
address@hidden@231,7964
+\def\`{\`235,8064
+\def\'{\'236,8076
+\def\mylbrace {\mylbrace240,8124
+\def\myrbrace {\myrbrace241,8157
+\def\:{\:246,8271
+\def\*{\*249,8325
+\def\.{\.252,8401
+\def\w#1{\w257,8632
+\def\group{\group267,9115
+  \def\Egroup{\Egroup272,9279
+\def\need{\need288,9721
+\def\needx#1{\needx299,9998
+\def\dots{\dots338,11384
+\def\page{\page342,11448
+\def\exdent{\exdent352,11775
+\def\exdentyyy #1{\exdentyyy353,11808
+\def\nofillexdent{\nofillexdent356,11952
+\def\nofillexdentyyy #1{\nofillexdentyyy357,11997
+\def\include{\include364,12181
+\def\includezzz #1{\includezzz365,12216
+\def\thisfile{\thisfile368,12267
+\def\center{\center372,12330
+\def\centerzzz #1{\centerzzz373,12363
+\def\sp{\sp379,12505
+\def\spxxx #1{\spxxx380,12530
+\def\comment{\comment386,12704
+\def\commentxxx #1{\commentxxx389,12801
+\def\ignoresections{\ignoresections395,12970
+\let\chapter=\relax=\relax396,12992
+\let\section=\relax=\relax405,13237
+\let\subsection=\relax=\relax408,13298
+\let\subsubsection=\relax=\relax409,13321
+\let\appendix=\relax=\relax410,13347
+\let\appendixsec=\relaxsec=\relax411,13368
+\let\appendixsection=\relaxsection=\relax412,13392
+\let\appendixsubsec=\relaxsubsec=\relax413,13420
+\let\appendixsubsection=\relaxsubsection=\relax414,13447
+\let\appendixsubsubsec=\relaxsubsubsec=\relax415,13478
+\let\appendixsubsubsection=\relaxsubsubsection=\relax416,13508
+\def\ignore{\ignore422,13610
+\long\def\ignorexxx #1\end ignore{\ignorexxx426,13750
+\def\direntry{\direntry428,13809
+\long\def\direntryxxx #1\end direntry{\direntryxxx429,13848
+\def\ifset{\ifset433,13958
+\def\ifsetxxx #1{\ifsetxxx435,14016
+\def\Eifset{\Eifset439,14143
+\def\ifsetfail{\ifsetfail440,14157
+\long\def\ifsetfailxxx #1\end ifset{\ifsetfailxxx441,14213
+\def\ifclear{\ifclear443,14274
+\def\ifclearxxx #1{\ifclearxxx445,14336
+\def\Eifclear{\Eifclear449,14467
+\def\ifclearfail{\ifclearfail450,14483
+\long\def\ifclearfailxxx #1\end ifclear{\ifclearfailxxx451,14543
+\def\set{\set455,14694
+\def\setxxx #1{\setxxx456,14721
+\def\clear{\clear459,14783
+\def\clearxxx #1{\clearxxx460,14814
+\def\iftex{\iftex465,14931
+\def\Eiftex{\Eiftex466,14944
+\def\ifinfo{\ifinfo467,14958
+\long\def\ifinfoxxx #1\end ifinfo{\ifinfoxxx468,15008
+\long\def\menu #1\end menu{\menu470,15067
+\def\asis#1{\asis471,15096
+\def\math#1{\math484,15639
+\def\node{\node486,15683
+\def\nodezzz#1{\nodezzz487,15721
+\def\nodexxx[#1,#2]{\nodexxx[488,15752
+\def\donoderef{\donoderef491,15814
+\def\unnumbnoderef{\unnumbnoderef495,15935
+\def\appendixnoderef{\appendixnoderef499,16066
+\expandafter\expandafter\expandafter\appendixsetref{setref500,16112
+\let\refill=\relaxill=\relax503,16201
+\def\setfilename{\setfilename508,16415
+\outer\def\bye{\bye517,16661
+\def\inforef #1{\inforef519,16717
+\def\inforefzzz #1,#2,#3,#4**{\inforefzzz520,16755
+\def\losespace #1{\losespace522,16852
+\def\sf{\sf531,17056
+\font\defbf=cmbx10 scaled \magstep1 %was 1314bf=cmbx10557,17851
+\font\deftt=cmtt10 scaled \magstep1tt=cmtt10558,17897
+\def\df{\df559,17933
+\def\resetmathfonts{\resetmathfonts634,20527
+\def\textfonts{\textfonts647,21116
+\def\chapfonts{\chapfonts652,21331
+\def\secfonts{\secfonts657,21547
+\def\subsecfonts{\subsecfonts662,21752
+\def\indexfonts{\indexfonts667,21969
+\def\smartitalicx{\smartitalicx690,22701
+\def\smartitalic#1{\smartitalic691,22777
+\let\cite=\smartitalic=\smartitalic697,22922
+\def\b#1{\b699,22946
+\def\t#1{\t702,22981
+\def\samp #1{\samp705,23133
+\def\key #1{\key706,23166
+\def\ctrl #1{\ctrl707,23227
+\def\tclose#1{\tclose715,23429
+\def\ {\719,23595
+\def\xkey{\xkey727,23864
+\def\kbdfoo#1#2#3\par{\kbdfoo728,23880
+\def\dmn#1{\dmn737,24181
+\def\kbd#1{\kbd739,24208
+\def\l#1{\l741,24265
+\def\r#1{\r743,24294
+\def\sc#1{\sc745,24362
+\def\ii#1{\ii746,24405
+\def\titlefont#1{\titlefont754,24638
+\def\titlepage{\titlepage760,24741
+   \def\subtitlefont{\subtitlefont765,24968
+   \def\authorfont{\authorfont767,25052
+   \def\title{\title773,25262
+   \def\titlezzz##1{\titlezzz774,25297
+   \def\subtitle{\subtitle782,25612
+   \def\subtitlezzz##1{\subtitlezzz783,25653
+   \def\author{\author786,25771
+   \def\authorzzz##1{\authorzzz787,25808
+   \def\page{\page793,26099
+\def\Etitlepage{\Etitlepage803,26268
+\def\finishtitlepage{\finishtitlepage816,26656
+\def\evenheading{\evenheading845,27664
+\def\oddheading{\oddheading846,27707
+\def\everyheading{\everyheading847,27748
+\def\evenfooting{\evenfooting849,27794
+\def\oddfooting{\oddfooting850,27837
+\def\everyfooting{\everyfooting851,27878
+\def\headings #1 {\headings892,29570
+\def\HEADINGSoff{\HEADINGSoff894,29619
+\def\HEADINGSdouble{\HEADINGSdouble903,30046
+\def\HEADINGSsingle{\HEADINGSsingle913,30366
+\def\HEADINGSon{\HEADINGSon921,30587
+\def\HEADINGSafter{\HEADINGSafter923,30621
+\def\HEADINGSdoublex{\HEADINGSdoublex925,30716
+\def\HEADINGSsingleafter{\HEADINGSsingleafter932,30904
+\def\HEADINGSsinglex{\HEADINGSsinglex933,30965
+\def\today{\today942,31240
+\def\thistitle{\thistitle957,31785
+\def\settitle{\settitle958,31810
+\def\settitlezzz #1{\settitlezzz959,31847
+\def\internalBitem{\internalBitem991,32777
+\def\internalBitemx{\internalBitemx992,32827
+\def\internalBxitem "#1"{\internalBxitem994,32872
+\def\internalBxitemx "#1"{\internalBxitemx995,32952
+\def\internalBkitem{\internalBkitem997,33027
+\def\internalBkitemx{\internalBkitemx998,33079
+\def\kitemzzz #1{\kitemzzz1000,33126
+\def\xitemzzz #1{\xitemzzz1003,33228
+\def\itemzzz #1{\itemzzz1006,33331
+\def\item{\item1036,34402
+\def\itemx{\itemx1037,34453
+\def\kitem{\kitem1038,34506
+\def\kitemx{\kitemx1039,34559
+\def\xitem{\xitem1040,34614
+\def\xitemx{\xitemx1041,34667
+\def\description{\description1044,34777
+\def\table{\table1046,34827
+\def\ftable{\ftable1051,34971
+\def\Eftable{\Eftable1055,35117
+\def\vtable{\vtable1058,35186
+\def\Evtable{\Evtable1062,35332
+\def\dontindex #1{\dontindex1065,35401
+\def\fnitemindex #1{\fnitemindex1066,35421
+\def\vritemindex #1{\vritemindex1067,35466
+\def\tablez #1#2#3#4#5#6{\tablez1073,35615
+\def\Edescription{\Edescription1076,35673
+\def\itemfont{\itemfont1081,35875
+\def\Etable{\Etable1089,36101
+\def\itemize{\itemize1102,36425
+\def\itemizezzz #1{\itemizezzz1104,36461
+\def\itemizey #1#2{\itemizey1109,36556
+\def#2{1118,36802
+\def\itemcontents{\itemcontents1119,36843
+\def\bullet{\bullet1122,36891
+\def\minus{\minus1123,36918
+\def\frenchspacing{\frenchspacing1127,37026
+\def\splitoff#1#2\endmark{\splitoff1133,37251
+\def\enumerate{\enumerate1139,37481
+\def\enumeratezzz #1{\enumeratezzz1140,37520
+\def\enumeratey #1 #2\endenumeratey{\enumeratey1141,37573
+  \def\thearg{\thearg1145,37720
+  \ifx\thearg\empty \def\thearg{\thearg1146,37739
+\def\numericenumerate{\numericenumerate1183,39073
+\def\lowercaseenumerate{\lowercaseenumerate1189,39203
+\def\uppercaseenumerate{\uppercaseenumerate1202,39550
+\def\startenumeration#1{\startenumeration1218,40040
+\def\alphaenumerate{\alphaenumerate1226,40222
+\def\capsenumerate{\capsenumerate1227,40257
+\def\Ealphaenumerate{\Ealphaenumerate1228,40291
+\def\Ecapsenumerate{\Ecapsenumerate1229,40325
+\def\itemizeitem{\itemizeitem1233,40405
+\def\newindex #1{\newindex1258,41262
+\def\defindex{\defindex1267,41551
+\def\newcodeindex #1{\newcodeindex1271,41659
+\def\defcodeindex{\defcodeindex1278,41919
+\def\synindex #1 #2 {\synindex1282,42099
+\def\syncodeindex #1 #2 {\syncodeindex1291,42439
+\def\doindex#1{\doindex1308,43118
+\def\singleindexer #1{\singleindexer1309,43177
+\def\docodeindex#1{\docodeindex1312,43289
+\def\singlecodeindexer #1{\singlecodeindexer1313,43356
+\def\indexdummies{\indexdummies1315,43414
+\def\_{\_1316,43434
+\def\w{\w1317,43462
+\def\bf{\bf1318,43489
+\def\rm{\rm1319,43518
+\def\sl{\sl1320,43547
+\def\sf{\sf1321,43576
+\def\tt{\tt1322,43604
+\def\gtr{\gtr1323,43632
+\def\less{\less1324,43662
+\def\hat{\hat1325,43694
+\def\char{\char1326,43724
+\def\TeX{\TeX1327,43756
+\def\dots{\dots1328,43786
+\def\copyright{\copyright1329,43819
+\def\tclose##1{\tclose1330,43862
+\def\code##1{\code1331,43907
+\def\samp##1{\samp1332,43948
+\def\t##1{\t1333,43989
+\def\r##1{\r1334,44024
+\def\i##1{\i1335,44059
+\def\b##1{\b1336,44094
+\def\cite##1{\cite1337,44129
+\def\key##1{\key1338,44170
+\def\file##1{\file1339,44209
+\def\var##1{\var1340,44250
+\def\kbd##1{\kbd1341,44289
+\def\indexdummyfont#1{\indexdummyfont1346,44445
+\def\indexdummytex{\indexdummytex1347,44471
+\def\indexdummydots{\indexdummydots1348,44495
+\def\indexnofonts{\indexnofonts1350,44521
+\let\w=\indexdummyfontdummyfont1351,44541
+\let\t=\indexdummyfontdummyfont1352,44564
+\let\r=\indexdummyfontdummyfont1353,44587
+\let\i=\indexdummyfontdummyfont1354,44610
+\let\b=\indexdummyfontdummyfont1355,44633
+\let\emph=\indexdummyfontdummyfont1356,44656
+\let\strong=\indexdummyfontdummyfont1357,44682
+\let\cite=\indexdummyfont=\indexdummyfont1358,44710
+\let\sc=\indexdummyfontdummyfont1359,44736
+\let\tclose=\indexdummyfontdummyfont1363,44908
+\let\code=\indexdummyfontdummyfont1364,44936
+\let\file=\indexdummyfontdummyfont1365,44962
+\let\samp=\indexdummyfontdummyfont1366,44988
+\let\kbd=\indexdummyfontdummyfont1367,45014
+\let\key=\indexdummyfontdummyfont1368,45039
+\let\var=\indexdummyfontdummyfont1369,45064
+\let\TeX=\indexdummytexdummytex1370,45089
+\let\dots=\indexdummydotsdummydots1371,45113
+\let\indexbackslash=0  %overridden during \printindex.backslash=01381,45365
+\def\doind #1#2{\doind1383,45421
+{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1385,45464
+\def\rawbackslashxx{\rawbackslashxx1388,45604
+{\indexnofontsnofonts1393,45866
+\def\dosubind #1#2#3{\dosubind1404,46177
+{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1406,46225
+\def\rawbackslashxx{\rawbackslashxx1409,46329
+{\indexnofontsnofonts1413,46483
+\def\findex {\findex1442,47414
+\def\kindex {\kindex1443,47437
+\def\cindex {\cindex1444,47460
+\def\vindex {\vindex1445,47483
+\def\tindex {\tindex1446,47506
+\def\pindex {\pindex1447,47529
+\def\cindexsub {\cindexsub1449,47553
+\def\printindex{\printindex1461,47880
+\def\doprintindex#1{\doprintindex1463,47921
+  \def\indexbackslash{\indexbackslash1480,48406
+  \indexfonts\rm \tolerance=9500 \advance\baselineskip -1ptfonts\rm1481,48445
+\def\initial #1{\initial1516,49517
+\def\entry #1#2{\entry1522,49724
+  \null\nobreak\indexdotfill % Have leaders before the page 
number.dotfill1539,50371
+\def\indexdotfill{\indexdotfill1548,50699
+\def\primary #1{\primary1551,50805
+\def\secondary #1#2{\secondary1555,50887
+\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\pardotfill1558,50969
+\newbox\partialpageialpage1565,51142
+\def\begindoublecolumns{\begindoublecolumns1571,51300
+  \output={\global\setbox\partialpage=ialpage=1572,51336
+\def\enddoublecolumns{\enddoublecolumns1576,51524
+\def\doublecolumnout{\doublecolumnout1579,51609
+  address@hidden \advance\dimen@ by-\ht\partialpageialpage1580,51678
+\def\pagesofar{\pagesofar1583,51856
+\def\balancecolumns{\balancecolumns1587,52093
+  address@hidden \advance\availdimen@ by-\ht\partialpageialpage1593,52264
+     address@hidden \advance\dimen@ by-\ht\partialpageialpage1599,52525
+\newcount \appendixno  \appendixno = address@hidden,53430
+\def\appendixletter{\appendixletter1627,53471
+\def\opencontents{\opencontents1631,53574
+\def\thischapter{\thischapter1636,53755
+\def\seccheck#1{\seccheck1637,53793
+\def\chapternofonts{\chapternofonts1642,53897
+\def\result{\result1645,53972
+\def\equiv{\equiv1646,54007
+\def\expansion{\expansion1647,54040
+\def\print{\print1648,54081
+\def\TeX{\TeX1649,54114
+\def\dots{\dots1650,54143
+\def\copyright{\copyright1651,54174
+\def\tt{\tt1652,54215
+\def\bf{\bf1653,54242
+\def\w{\w1654,54270
+\def\less{\less1655,54295
+\def\gtr{\gtr1656,54326
+\def\hat{\hat1657,54355
+\def\char{\char1658,54384
+\def\tclose##1{\tclose1659,54415
+\def\code##1{\code1660,54459
+\def\samp##1{\samp1661,54499
+\def\r##1{\r1662,54539
+\def\b##1{\b1663,54573
+\def\key##1{\key1664,54607
+\def\file##1{\file1665,54645
+\def\kbd##1{\kbd1666,54685
+\def\i##1{\i1668,54793
+\def\cite##1{\cite1669,54827
+\def\var##1{\var1670,54867
+\def\emph##1{\emph1671,54905
+\def\dfn##1{\dfn1672,54945
+\def\thischaptername{\thischaptername1675,54986
+\outer\def\chapter{\chapter1676,55025
+\def\chapterzzz #1{\chapterzzz1677,55066
+{\chapternofonts%nofonts%1686,55462
+\global\let\section = \numberedsec=1691,55615
+\global\let\subsection = \numberedsubsec=1692,55650
+\global\let\subsubsection = \numberedsubsubsec=1693,55691
+\outer\def\appendix{\appendix1696,55742
+\def\appendixzzz #1{\appendixzzz1697,55785
+\global\advance \appendixno by 1 \message{no1699,55862
+\chapmacro {#1}{Appendix \appendixletter}letter1700,55931
+\xdef\thischapter{Appendix \appendixletter: 
\noexpand\thischaptername}letter:1703,56024
+{\chapternofonts%nofonts%1704,56096
+  {#1}{Appendix \appendixletter}letter1706,56152
+\appendixnoderef %noderef1709,56252
+\global\let\section = \appendixsec=1710,56271
+\global\let\subsection = \appendixsubsec=1711,56306
+\global\let\subsubsection = \appendixsubsubsec=1712,56347
+\outer\def\top{\top1715,56398
+\outer\def\unnumbered{\unnumbered1716,56438
+\def\unnumberedzzz #1{\unnumberedzzz1717,56485
+{\chapternofonts%nofonts%1721,56648
+\global\let\section = \unnumberedsec=1726,56798
+\global\let\subsection = \unnumberedsubsec=1727,56835
+\global\let\subsubsection = \unnumberedsubsubsec=1728,56878
+\outer\def\numberedsec{\numberedsec1731,56931
+\def\seczzz #1{\seczzz1732,56972
+{\chapternofonts%nofonts%1735,57128
+\outer\def\appendixsection{\appendixsection1744,57314
+\outer\def\appendixsec{\appendixsec1745,57371
+\def\appendixsectionzzz #1{\appendixsectionzzz1746,57424
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}letter1748,57536
+{\chapternofonts%nofonts%1749,57604
+{#1}{\appendixletter}letter1751,57660
+\appendixnoderef %noderef1754,57760
+\outer\def\unnumberedsec{\unnumberedsec1758,57800
+\def\unnumberedseczzz #1{\unnumberedseczzz1759,57853
+{\chapternofonts%nofonts%1761,57948
+\outer\def\numberedsubsec{\numberedsubsec1769,58116
+\def\numberedsubseczzz #1{\numberedsubseczzz1770,58171
+{\chapternofonts%nofonts%1773,58350
+\outer\def\appendixsubsec{\appendixsubsec1782,58554
+\def\appendixsubseczzz #1{\appendixsubseczzz1783,58609
+\subsecheading {#1}{\appendixletter}letter1785,58731
+{\chapternofonts%nofonts%1786,58796
+{#1}{\appendixletter}letter1788,58855
+\appendixnoderef %noderef1791,58970
+\outer\def\unnumberedsubsec{\unnumberedsubsec1795,59010
+\def\unnumberedsubseczzz #1{\unnumberedsubseczzz1796,59069
+{\chapternofonts%nofonts%1798,59170
+\outer\def\numberedsubsubsec{\numberedsubsubsec1806,59341
+\def\numberedsubsubseczzz #1{\numberedsubsubseczzz1807,59402
+{\chapternofonts%nofonts%1811,59599
+\outer\def\appendixsubsubsec{\appendixsubsubsec1822,59832
+\def\appendixsubsubseczzz #1{\appendixsubsubseczzz1823,59893
+  {\appendixletter}letter1826,60032
+{\chapternofonts%nofonts%1827,60098
+  {\appendixletter}letter1829,60163
+\appendixnoderef %noderef1833,60297
+\outer\def\unnumberedsubsubsec{\unnumberedsubsubsec1837,60337
+\def\unnumberedsubsubseczzz #1{\unnumberedsubsubseczzz1838,60402
+{\chapternofonts%nofonts%1840,60509
+\def\infotop{\infotop1850,60838
+\def\infounnumbered{\infounnumbered1851,60876
+\def\infounnumberedsec{\infounnumberedsec1852,60921
+\def\infounnumberedsubsec{\infounnumberedsubsec1853,60972
+\def\infounnumberedsubsubsec{\infounnumberedsubsubsec1854,61029
+\def\infoappendix{\infoappendix1856,61093
+\def\infoappendixsec{\infoappendixsec1857,61134
+\def\infoappendixsubsec{\infoappendixsubsec1858,61181
+\def\infoappendixsubsubsec{\infoappendixsubsubsec1859,61234
+\def\infochapter{\infochapter1861,61294
+\def\infosection{\infosection1862,61333
+\def\infosubsection{\infosubsection1863,61372
+\def\infosubsubsection{\infosubsubsection1864,61417
+\global\let\section = \numberedsec=1869,61654
+\global\let\subsection = \numberedsubsec=1870,61689
+\global\let\subsubsection = \numberedsubsubsec=1871,61730
+\def\majorheading{\majorheading1885,62237
+\def\majorheadingzzz #1{\majorheadingzzz1886,62282
+\def\chapheading{\chapheading1892,62515
+\def\chapheadingzzz #1{\chapheadingzzz1893,62558
+\def\heading{\heading1898,62753
+\def\subheading{\subheading1900,62790
+\def\subsubheading{\subsubheading1902,62833
+\def\dobreak#1#2{\dobreak1909,63110
+\def\setchapterstyle #1 {\setchapterstyle1911,63188
+\def\chapbreak{\chapbreak1918,63443
+\def\chappager{\chappager1919,63493
+\def\chapoddpage{\chapoddpage1920,63531
+\def\setchapternewpage #1 {\setchapternewpage1922,63610
+\def\CHAPPAGoff{\CHAPPAGoff1924,63667
+\def\CHAPPAGon{\CHAPPAGon1928,63761
+\global\def\HEADINGSon{\HEADINGSon1931,63852
+\def\CHAPPAGodd{\CHAPPAGodd1933,63894
+\global\def\HEADINGSon{\HEADINGSon1936,63990
+\def\CHAPFplain{\CHAPFplain1940,64044
+\def\chfplain #1#2{\chfplain1944,64136
+\def\unnchfplain #1{\unnchfplain1955,64359
+\def\unnchfopen #1{\unnchfopen1963,64588
+\def\chfopen #1#2{\chfopen1969,64796
+\def\CHAPFopen{\CHAPFopen1974,64940
+\def\subsecheadingbreak{\subsecheadingbreak1981,65158
+\def\secheadingbreak{\secheadingbreak1984,65287
+\def\secheading #1#2#3{\secheading1992,65569
+\def\plainsecheading #1{\plainsecheading1993,65625
+\def\secheadingi #1{\secheadingi1994,65668
+\def\subsecheading #1#2#3#4{\subsecheading2005,66036
+\def\subsecheadingi #1{\subsecheadingi2006,66103
+\def\subsubsecfonts{\subsubsecfonts2013,66400
+\def\subsubsecheading #1#2#3#4#5{\subsubsecheading2016,66523
+\def\subsubsecheadingi #1{\subsubsecheadingi2017,66601
+\def\startcontents#1{\startcontents2031,67073
+   \unnumbchapmacro{#1}\def\thischapter{\thischapter2039,67346
+\outer\def\contents{\contents2048,67705
+\outer\def\summarycontents{\summarycontents2056,67849
+      \def\secentry ##1##2##3##4{\secentry2066,68220
+      \def\unnumbsecentry ##1##2{\unnumbsecentry2067,68255
+      \def\subsecentry ##1##2##3##4##5{\subsecentry2068,68290
+      \def\unnumbsubsecentry ##1##2{\unnumbsubsecentry2069,68331
+      \def\subsubsecentry ##1##2##3##4##5##6{\subsubsecentry2070,68369
+      \def\unnumbsubsubsecentry ##1##2{\unnumbsubsubsecentry2071,68416
+\def\chapentry#1#2#3{\chapentry2084,68850
+\def\shortchapentry#1#2#3{\shortchapentry2087,68967
+    {#2\labelspace #1}space2090,69077
+\def\unnumbchapentry#1#2{\unnumbchapentry2093,69131
+\def\shortunnumberedentry#1#2{\shortunnumberedentry2094,69178
+\def\secentry#1#2#3#4{\secentry2101,69342
+\def\unnumbsecentry#1#2{\unnumbsecentry2102,69401
+\def\subsecentry#1#2#3#4#5{\subsecentry2105,69462
+\def\unnumbsubsecentry#1#2{\unnumbsubsecentry2106,69532
+\def\subsubsecentry#1#2#3#4#5#6{\subsubsecentry2109,69606
+  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}space2110,69640
+\def\unnumbsubsubsecentry#1#2{\unnumbsubsubsecentry2111,69691
+\def\dochapentry#1#2{\dochapentry2122,70065
+\def\dosecentry#1#2{\dosecentry2137,70670
+\def\dosubsecentry#1#2{\dosubsecentry2144,70848
+\def\dosubsubsecentry#1#2{\dosubsubsecentry2151,71033
+\def\labelspace{\labelspace2159,71284
+\def\dopageno#1{\dopageno2161,71319
+\def\doshortpageno#1{\doshortpageno2162,71345
+\def\chapentryfonts{\chapentryfonts2164,71377
+\def\secentryfonts{\secentryfonts2165,71412
+\def\point{\point2191,72371
+\def\result{\result2193,72392
+\def\expansion{\expansion2194,72465
+\def\print{\print2195,72536
+\def\equiv{\equiv2197,72603
+\def\error{\error2217,73376
+\def\tex{\tex2223,73605
address@hidden@2241,73988
+\gdef\sepspaces{\def {\ }}}\2264,74720
+\def\aboveenvbreak{\aboveenvbreak2267,74802
+\def\afterenvbreak{\afterenvbreak2271,74968
+\def\ctl{\ctl2285,75479
+\def\ctr{\ctr2286,75551
+\def\cbl{\cbl2287,75590
+\def\cbr{\cbr2288,75630
+\def\carttop{\carttop2289,75669
+\def\cartbot{\cartbot2292,75777
+\long\def\cartouche{\cartouche2298,75917
+\def\Ecartouche{\Ecartouche2325,76705
+\def\lisp{\lisp2337,76840
+\def\Elisp{\Elisp2347,77187
+\def\next##1{\next2359,77513
+\def\Eexample{\Eexample2363,77555
+\def\Esmallexample{\Esmallexample2366,77602
+\def\smalllispx{\smalllispx2372,77780
+\def\Esmalllisp{\Esmalllisp2382,78134
+\obeyspaces \obeylines \ninett \indexfonts \rawbackslashfonts2395,78490
+\def\next##1{\next2396,78547
+\def\display{\display2400,78627
+\def\Edisplay{\Edisplay2409,78946
+\def\next##1{\next2421,79257
+\def\format{\format2425,79360
+\def\Eformat{\Eformat2433,79656
+\def\next##1{\next2436,79745
+\def\flushleft{\flushleft2440,79797
+\def\Eflushleft{\Eflushleft2450,80168
+\def\next##1{\next2453,80261
+\def\flushright{\flushright2455,80283
+\def\Eflushright{\Eflushright2465,80655
+\def\next##1{\next2469,80786
+\def\quotation{\quotation2473,80844
+\def\Equotation{\Equotation2479,81036
+\def\setdeffont #1 {\setdeffont2492,81434
+\newskip\defbodyindent \defbodyindent=.4inbodyindent2494,81480
+\newskip\defargsindent \defargsindent=50ptargsindent2495,81523
+\newskip\deftypemargin \deftypemargin=12pttypemargin2496,81566
+\newskip\deflastargmargin \deflastargmargin=18ptlastargmargin2497,81609
+\def\activeparens{\activeparens2502,81807
+\def\opnr{\opnr2528,83019
+\def\lbrb{\lbrb2529,83084
+\def\defname #1#2{\defname2535,83285
+\advance\dimen2 by -\defbodyindentbodyindent2539,83403
+\advance\dimen3 by -\defbodyindentbodyindent2541,83457
+\setbox0=\hbox{\hskip \deflastargmargin{lastargmargin2543,83511
+\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for 
continuationsargsindent2545,83653
+\parshape 2 0in \dimen0 \defargsindent \dimen1     %argsindent2546,83728
+\rlap{\rightline{{\rm #2}\hskip \deftypemargin}typemargin2553,84097
+\advance\leftskip by -\defbodyindentbodyindent2556,84231
+\exdentamount=\defbodyindentbodyindent2557,84268
+\def\defparsebody #1#2#3{\defparsebody2567,84627
+\def#1{2571,84811
+\def#2{2572,84847
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2574,84919
+\exdentamount=\defbodyindentbodyindent2575,84993
+\def\defmethparsebody #1#2#3#4 {\defmethparsebody2580,85097
+\def#1{2584,85258
+\def#2##1 {2585,85294
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2587,85377
+\exdentamount=\defbodyindentbodyindent2588,85451
+\def\defopparsebody #1#2#3#4#5 {\defopparsebody2591,85536
+\def#1{2595,85697
+\def#2##1 ##2 {2596,85733
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2599,85833
+\exdentamount=\defbodyindentbodyindent2600,85907
+\def\defvarparsebody #1#2#3{\defvarparsebody2607,86178
+\def#1{2611,86365
+\def#2{2612,86401
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2614,86460
+\exdentamount=\defbodyindentbodyindent2615,86534
+\def\defvrparsebody #1#2#3#4 {\defvrparsebody2620,86625
+\def#1{2624,86784
+\def#2##1 {2625,86820
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2627,86890
+\exdentamount=\defbodyindentbodyindent2628,86964
+\def\defopvarparsebody #1#2#3#4#5 {\defopvarparsebody2631,87036
+\def#1{2635,87200
+\def#2##1 ##2 {2636,87236
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2639,87323
+\exdentamount=\defbodyindentbodyindent2640,87397
+\def\defunargs #1{\defunargs2663,88157
+\def\deftypefunargs #1{\deftypefunargs2675,88539
+\def\deffn{\deffn2689,88921
+\def\deffnheader #1#2#3{\deffnheader2691,88978
+\begingroup\defname {name2692,89026
+\def\defun{\defun2698,89171
+\def\defunheader #1#2{\defunheader2700,89224
+\begingroup\defname {name2701,89299
+\defunargs {unargs2702,89335
+\def\deftypefun{\deftypefun2708,89483
+\def\deftypefunheader #1#2{\deftypefunheader2711,89605
+\def\deftypefunheaderx #1#2 #3\relax{\deftypefunheaderx2713,89714
+\begingroup\defname {name2715,89806
+\deftypefunargs {typefunargs2716,89852
+\def\deftypefn{\deftypefn2722,90023
+\def\deftypefnheader #1#2#3{\deftypefnheader2725,90172
+\def\deftypefnheaderx #1#2#3 #4\relax{\deftypefnheaderx2727,90308
+\begingroup\defname {name2729,90401
+\deftypefunargs {typefunargs2730,90441
+\def\defmac{\defmac2736,90562
+\def\defmacheader #1#2{\defmacheader2738,90619
+\begingroup\defname {name2739,90695
+\defunargs {unargs2740,90728
+\def\defspec{\defspec2746,90852
+\def\defspecheader #1#2{\defspecheader2748,90913
+\begingroup\defname {name2749,90990
+\defunargs {unargs2750,91030
+\def\deffnx #1 {\deffnx2757,91225
+\def\defunx #1 {\defunx2758,91282
+\def\defmacx #1 {\defmacx2759,91339
+\def\defspecx #1 {\defspecx2760,91398
+\def\deftypefnx #1 {\deftypefnx2761,91459
+\def\deftypeunx #1 {\deftypeunx2762,91524
+\def\defop #1 {\defop2768,91670
+\defopparsebody\Edefop\defopx\defopheader\defoptype}opparsebody\Edefop\defopx\defopheader\defoptype2769,91705
+\def\defopheader #1#2#3{\defopheader2771,91759
+\begingroup\defname {name2773,91848
+\defunargs {unargs2774,91894
+\def\defmethod{\defmethod2779,91955
+\def\defmethodheader #1#2#3{\defmethodheader2781,92028
+\begingroup\defname {name2783,92116
+\defunargs {unargs2784,92156
+\def\defcv #1 {\defcv2789,92230
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype2790,92265
+\def\defcvarheader #1#2#3{\defcvarheader2792,92324
+\begingroup\defname {name2794,92410
+\defvarargs {varargs2795,92456
+\def\defivar{\defivar2800,92529
+\def\defivarheader #1#2#3{\defivarheader2802,92592
+\begingroup\defname {name2804,92678
+\defvarargs {varargs2805,92729
+\def\defopx #1 {\defopx2811,92878
+\def\defmethodx #1 {\defmethodx2812,92935
+\def\defcvx #1 {\defcvx2813,93000
+\def\defivarx #1 {\defivarx2814,93057
+\def\defvarargs #1{\defvarargs2821,93328
+\def\defvr{\defvr2827,93472
+\def\defvrheader #1#2#3{\defvrheader2829,93527
+\begingroup\defname {name2830,93575
+\def\defvar{\defvar2834,93660
+\def\defvarheader #1#2{\defvarheader2836,93720
+\begingroup\defname {name2837,93791
+\defvarargs {varargs2838,93827
+\def\defopt{\defopt2843,93893
+\def\defoptheader #1#2{\defoptheader2845,93953
+\begingroup\defname {name2846,94024
+\defvarargs {varargs2847,94063
+\def\deftypevar{\deftypevar2852,94120
+\def\deftypevarheader #1#2{\deftypevarheader2855,94236
+\begingroup\defname {name2857,94319
+\def\deftypevr{\deftypevr2864,94493
+\def\deftypevrheader #1#2#3{\deftypevrheader2866,94564
+\begingroup\defname {name2867,94616
+\def\defvrx #1 {\defvrx2875,94853
+\def\defvarx #1 {\defvarx2876,94910
+\def\defoptx #1 {\defoptx2877,94969
+\def\deftypevarx #1 {\deftypevarx2878,95028
+\def\deftypevrx #1 {\deftypevrx2879,95095
+\def\deftpargs #1{\deftpargs2884,95244
+\def\deftp{\deftp2888,95324
+\def\deftpheader #1#2#3{\deftpheader2890,95379
+\begingroup\defname {name2891,95427
+\def\deftpx #1 {\deftpx2896,95586
+\def\setref#1{\setref2907,95907
+\def\unnumbsetref#1{\unnumbsetref2912,96021
+\def\appendixsetref#1{\appendixsetref2917,96128
+\def\pxref#1{\pxref2928,96539
+\def\xref#1{\xref2929,96575
+\def\ref#1{\ref2930,96610
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\xrefX[2931,96640
+\def\printedmanual{\printedmanual2932,96683
+\def\printednodename{\printednodename2933,96721
+\def\printednodename{\printednodename2938,96846
+section ``\printednodename'' in \cite{\printedmanual}\printedmanual2953,97479
+\refx{x2956,97557
+\def\dosetq #1#2{\dosetq2964,97777
+\def\internalsetq #1#2{\internalsetq2972,98035
+\def\Ypagenumber{\Ypagenumber2976,98136
+\def\Ytitle{\Ytitle2978,98162
+\def\Ynothing{\Ynothing2980,98189
+\def\Ysectionnumberandtype{\Ysectionnumberandtype2982,98206
+\def\Yappendixletterandtype{\Yappendixletterandtype2991,98522
+\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{no2992,98552
+\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno 
%no.\the\secno2993,98607
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno 
%no.\the\secno.\the\subsecno2995,98711
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno 
%no.\the\secno.\the\subsecno.\the\subsubsecno2997,98782
+  \def\linenumber{\linenumber3008,99121
+\def\refx#1#2{\refx3014,99305
+\def\xrdef #1#2{\xrdef3036,99931
+\def\readauxfile{\readauxfile3039,100016
+\def\supereject{\supereject3109,101797
+\footstrut\parindent=\defaultparindent\hang\textindent{aultparindent\hang\textindent3130,102482
+\def\openindices{\openindices3138,102668
+\newdimen\defaultparindent \defaultparindent = 15ptaultparindent3150,102893
+\parindent = \defaultparindentaultparindent3151,102945
+\def\smallbook{\smallbook3174,103669
+\global\def\Esmallexample{\Esmallexample3191,104096
+\def\afourpaper{\afourpaper3195,104187
+\def\finalout{\finalout3223,104995
+\def\normaldoublequote{\normaldoublequote3234,105256
+\def\normaltilde{\normaltilde3235,105282
+\def\normalcaret{\normalcaret3236,105302
+\def\normalunderscore{\normalunderscore3237,105322
+\def\normalverticalbar{\normalverticalbar3238,105347
+\def\normalless{\normalless3239,105373
+\def\normalgreater{\normalgreater3240,105392
+\def\normalplus{\normalplus3241,105414
+\def\ifusingtt#1#2{\ifusingtt3252,105906
+\def\activedoublequote{\activedoublequote3260,106234
+\def~{~3263,106320
+\def^{^3266,106381
+\def_{_3269,106420
+\def\_{\_3271,106494
+\def\lvvmode{\lvvmode3278,106831
+\def|{|3281,106881
+\def<{<3284,106944
+\def>{>3287,107001
+\def+{+3289,107039
+\def\turnoffactive{\turnoffactive3295,107200
+\global\def={=3306,107486
+\def\normalbackslash{\normalbackslash3320,107868
+
+c-src//c.c,76
+T f(1,0
+}T i;2,14
+void bar(5,69
+int foobar(6,94
+interface_locate(9,131
+
+c.c,1663
+my_printf 135,
+void fatala 138,
+max 141,
+struct bar 143,
+__attribute__ ((always_inline)) max 147,
+struct foo150,
+char stack[stack155,
+struct S 156,
+} wait_status_ptr_t 161,
+Some_Class  A 162,
+typedef T1 T3 163,
+T3 z 164,
+typedef int more_aligned_int 165,
+struct S  __attribute__ ((vector_size (16))) foo;166,
+int foo 167,
+char *__attribute__((aligned(8))) *f;f168,
+int i 169,
+extern void foobar 170,
+typedef struct cacheLRUEntry_s172,
+__attribute__ ((packed)) cacheLRUEntry_t;177,
+struct foo 178,
+     f1 183,
+void f2 184,
+int x 188,
+struct foo 189,
+short array[array190,
+int f193,
+DEAFUN 196,
+XDEFUN 203,
+DEFUN ("x-get-selection-internal", 
Fx_get_selection_internal,x-get-selection-internal206,
+       Fx_get_selection_internal,x-get-selection-internal212,
+      Fy_get_selection_internal,y-get-selection-internal216,
+defun_func1(218,
+DEFUN_func2(220,
+typedef int bool;222,
+bool funcboo 223,
+struct my_struct 226,
+typedef struct my_struct my_typedef;228,
+int bla 229,
+a(234,
+int func1237,
+static struct cca_control init_control 239,
+static tpcmd rbtp 240,
+static byte ring1 241,
+static byte ring2 242,
+request request 243,
+int func2 246,
+  aaa;249,
+  bbb;251,
+struct sss1 252,
+struct sss2253,
+  struct ss3255,
+struct a b;259,
+struct aa *b;b260,
+  **b;b262,
+caccacacca 263,
+a 267,
+  typedef struct aa 269,
+  typedef struct aa {} aaa;269,
+static void inita 271,
+node *lasta lasta272,
+b 273,
+  typedef  int bb;275,
+static void initb 277,
+node *lastb lastb278,
+typedef enum { REG_ENOSYS 279,
+typedef enum { REG_ENOSYS = -1, aa 279,
+typedef enum { REG_ENOSYS = -1, aa } reg_errcode_t;279,
+
+c-src/a/b/b.c,18
+#define this 1,0
+
+../c/c.web,20
+#define questo 34,
+
+y-src/parse.y,738
+#define obstack_chunk_alloc 46,1111
+#define obstack_chunk_free 47,1149
+VOIDSTAR parse_hash;63,1400
+unsigned char fnin[fnin67,1519
+#define YYSTYPE 71,1617
+typedef struct node *YYSTYPE;YYSTYPE72,1648
+YYSTYPE parse_return;73,1678
+char *instr;instr80,1790
+int parse_error 81,1803
+line:line86,1862
+exp:exp94,1975
+exp_list:exp_list262,5642
+range_exp:range_exp268,5740
+range_exp_list:range_exp_list272,5770
+cell:cell278,5888
+yyerror FUN1(285,5935
+make_list FUN2(292,6015
+#define ERROR 303,6215
+yylex FUN0(314,6392
+parse_cell_or_range FUN2(586,11758
+#define CK_ABS_R(670,13200
+#define CK_REL_R(674,13279
+#define CK_ABS_C(679,13408
+#define CK_REL_C(683,13487
+#define MAYBEREL(688,13616
+str_to_col FUN1(846,16817
+
+y-src/parse.c,520
+#define YYBISON 4,64
+# define       NE      6,114
+# define       LE      7,130
+# define       GE      8,146
+# define       NEG     9,162
+# define       L_CELL  10,179
+# define       L_RANGE 11,199
+# define       L_VAR   12,220
+# define       L_CONST 13,239
+# define       L_FN0   14,260
+# define       L_FN1   15,279
+# define       L_FN2   16,298
+# define       L_FN3   17,317
+# define       L_FN4   18,336
+# define       L_FNN   19,355
+# define       L_FN1R  20,374
+# define       L_FN2R  21,394
+# define       L_FN3R  22,414
+# define       L_FN4R  23,434
+# define       L_FNNR  24,454
+# define       L_LE    25,474
+# define       L_NE    26,492
+# define       L_GE    27,510
+
+parse.y,1181
+#define obstack_chunk_alloc 46,
+#define obstack_chunk_free 47,
+VOIDSTAR parse_hash;63,
+unsigned char fnin[fnin67,
+#define YYSTYPE 71,
+typedef struct node *YYSTYPE;YYSTYPE72,
+YYSTYPE parse_return;73,
+char *instr;instr80,
+int parse_error 81,
+#define YYSTYPE 85,
+# define YYDEBUG 88,
+#define        YYFINAL 93,
+#define        YYFLAG  94,
+#define        YYNTBASE        95,
+#define YYTRANSLATE(98,
+static const char yytranslate[yytranslate101,
+static const short yyprhs[yyprhs134,
+static const short yyrhs[yyrhs142,
+static const short yyrline[yyrline171,
+static const char *const yytname[yytname185,
+static const short yyr1[yyr1197,
+static const short yyr2[yyr2207,
+static const short yydefact[yydefact219,
+static const short yydefgoto[yydefgoto237,
+static const short yypact[yypact242,
+static const short yypgoto[yypgoto260,
+#define        YYLAST  266,
+static const short yytable[yytable269,
+static const short yycheck[yycheck330,
+yyerror FUN1(285,
+make_list FUN2(292,
+#define ERROR 303,
+yylex FUN0(314,
+parse_cell_or_range FUN2(586,
+#define CK_ABS_R(670,
+#define CK_REL_R(674,
+#define CK_ABS_C(679,
+#define CK_REL_C(683,
+#define MAYBEREL(688,
+str_to_col FUN1(846,
+
+/usr/share/bison/bison.simple,2110
+# define YYSTD(40,
+# define YYSTD(42,
+#  define YYSTACK_ALLOC 50,
+#  define YYSIZE_T 51,
+#    define YYSTACK_ALLOC 55,
+#    define YYSIZE_T 56,
+#     define YYSTACK_ALLOC 59,
+#  define YYSTACK_FREE(67,
+#   define YYSIZE_T 71,
+#    define YYSIZE_T 75,
+#  define YYSTACK_ALLOC 78,
+#  define YYSTACK_FREE 79,
+union yyalloc83,
+# define YYSTACK_GAP_MAX 93,
+#  define YYSTACK_BYTES(98,
+#  define YYSTACK_BYTES(102,
+# define YYSTACK_RELOCATE(112,
+# define YYSIZE_T 128,
+# define YYSIZE_T 131,
+#  define YYSIZE_T 136,
+#   define YYSIZE_T 140,
+# define YYSIZE_T 145,
+#define yyerrok        148,
+#define yyclearin      149,
+#define YYEMPTY        150,
+#define YYEOF  151,
+#define YYACCEPT       152,
+#define YYABORT 153,
+#define YYERROR        154,
+#define YYFAIL 158,
+#define YYRECOVERING(159,
+#define YYBACKUP(160,
+#define YYTERROR       177,
+#define YYERRCODE      178,
+# define YYLLOC_DEFAULT(189,
+#   define YYLEX       200,
+#   define YYLEX       202,
+#   define YYLEX       206,
+#   define YYLEX       208,
+# define YYLEX 212,
+#  define YYFPRINTF 225,
+# define YYDPRINTF(228,
+int yydebug;237,
+# define YYDPRINTF(239,
+# define YYINITDEPTH 244,
+# undef YYMAXDEPTH255,
+# define YYMAXDEPTH 259,
+#  define yymemcpy 264,
+yymemcpy 271,
+#   define yystrlen 293,
+yystrlen 298,
+#   define yystpcpy 316,
+yystpcpy 322,
+#  define YYPARSE_PARAM_ARG 351,
+#  define YYPARSE_PARAM_DECL352,
+#  define YYPARSE_PARAM_ARG 354,
+#  define YYPARSE_PARAM_DECL 355,
+# define YYPARSE_PARAM_ARG358,
+# define YYPARSE_PARAM_DECL359,
+#define YY_DECL_NON_LSP_VARIABLES      374,
+# define YY_DECL_VARIABLES     385,
+# define YY_DECL_VARIABLES     391,
+yyparse 403,
+# define YYPOPSTACK 445,
+# define YYPOPSTACK 447,
+# undef YYSTACK_RELOCATE548,
+  *++yyvsp yyvsp746,
+  *++yylsp yylsp748,
+  yyn 755,
+  yystate 757,
+    yystate 761,
+  goto yynewstate;763,
+  goto yyerrlab1;823,
+  yyerrstatus 846,
+  goto yyerrhandle;848,
+  yyn 861,
+  yystate 875,
+  yyn 895,
+  yyn 903,
+  *++yyvsp yyvsp919,
+  *++yylsp yylsp921,
+  yystate 924,
+  goto yynewstate;925,
+  yyresult 932,
+  goto yyreturn;933,
+  yyresult 939,
+  goto yyreturn;940,
+  yyresult 947,
+
+y-src/atest.y,9
+exp    2,3
+
+y-src/cccp.c,303
+#define YYBISON 4,63
+# define       INT     6,113
+# define       CHAR    7,130
+# define       NAME    8,148
+# define       ERROR   9,166
+# define       OR      10,185
+# define       AND     11,201
+# define       EQUAL   12,218
+# define       NOTEQUAL        13,237
+# define       LEQ     14,259
+# define       GEQ     15,276
+# define       LSH     16,293
+# define       RSH     17,310
+# define       UNARY   18,327
+
+cccp.y,1579
+typedef unsigned char U_CHAR;38,
+struct arglist 41,
+#define NULL 51,
+#define GENERIC_PTR 56,
+#define GENERIC_PTR 58,
+#define NULL_PTR 63,
+int expression_value;68,
+static jmp_buf parse_return_error;70,
+static int keyword_parsing 73,
+#define CHAR_TYPE_SIZE 87,
+#define INT_TYPE_SIZE 91,
+#define LONG_TYPE_SIZE 95,
+#define WCHAR_TYPE_SIZE 99,
+#define possible_sum_sign(104,
+  struct constant 113,
+  struct name 114,
+} yystype;118,
+# define YYSTYPE 119,
+# define YYDEBUG 122,
+#define        YYFINAL 127,
+#define        YYFLAG  128,
+#define        YYNTBASE        129,
+#define YYTRANSLATE(132,
+static const char yytranslate[yytranslate135,
+static const short yyprhs[yyprhs167,
+static const short yyrhs[yyrhs174,
+static const short yyrline[yyrline195,
+static const char *const yytname[yytname208,
+static const short yyr1[yyr1219,
+static const short yyr2[yyr2228,
+static const short yydefact[yydefact239,
+static const short yydefgoto[yydefgoto251,
+static const short yypact[yypact256,
+static const short yypgoto[yypgoto268,
+#define        YYLAST  274,
+static const short yytable[yytable277,
+static const short yycheck[yycheck301,
+static char *lexptr;lexptr332,
+parse_number 341,
+struct token 437,
+static struct token tokentab2[tokentab2442,
+yylex 459,
+parse_escape 740,
+yyerror 836,
+integer_overflow 844,
+left_shift 851,
+right_shift 873,
+parse_c_expression 893,
+main 923,
+unsigned char is_idchar[is_idchar948,
+unsigned char is_idstart[is_idstart950,
+char is_hor_space[is_hor_space953,
+initialize_random_junk 958,
+error 988,
+warning 993,
+lookup 999,
+
+/usr/share/bison/bison.simple,2110
+# define YYSTD(40,
+# define YYSTD(42,
+#  define YYSTACK_ALLOC 50,
+#  define YYSIZE_T 51,
+#    define YYSTACK_ALLOC 55,
+#    define YYSIZE_T 56,
+#     define YYSTACK_ALLOC 59,
+#  define YYSTACK_FREE(67,
+#   define YYSIZE_T 71,
+#    define YYSIZE_T 75,
+#  define YYSTACK_ALLOC 78,
+#  define YYSTACK_FREE 79,
+union yyalloc83,
+# define YYSTACK_GAP_MAX 93,
+#  define YYSTACK_BYTES(98,
+#  define YYSTACK_BYTES(102,
+# define YYSTACK_RELOCATE(112,
+# define YYSIZE_T 128,
+# define YYSIZE_T 131,
+#  define YYSIZE_T 136,
+#   define YYSIZE_T 140,
+# define YYSIZE_T 145,
+#define yyerrok        148,
+#define yyclearin      149,
+#define YYEMPTY        150,
+#define YYEOF  151,
+#define YYACCEPT       152,
+#define YYABORT 153,
+#define YYERROR        154,
+#define YYFAIL 158,
+#define YYRECOVERING(159,
+#define YYBACKUP(160,
+#define YYTERROR       177,
+#define YYERRCODE      178,
+# define YYLLOC_DEFAULT(189,
+#   define YYLEX       200,
+#   define YYLEX       202,
+#   define YYLEX       206,
+#   define YYLEX       208,
+# define YYLEX 212,
+#  define YYFPRINTF 225,
+# define YYDPRINTF(228,
+int yydebug;237,
+# define YYDPRINTF(239,
+# define YYINITDEPTH 244,
+# undef YYMAXDEPTH255,
+# define YYMAXDEPTH 259,
+#  define yymemcpy 264,
+yymemcpy 271,
+#   define yystrlen 293,
+yystrlen 298,
+#   define yystpcpy 316,
+yystpcpy 322,
+#  define YYPARSE_PARAM_ARG 351,
+#  define YYPARSE_PARAM_DECL352,
+#  define YYPARSE_PARAM_ARG 354,
+#  define YYPARSE_PARAM_DECL 355,
+# define YYPARSE_PARAM_ARG358,
+# define YYPARSE_PARAM_DECL359,
+#define YY_DECL_NON_LSP_VARIABLES      374,
+# define YY_DECL_VARIABLES     385,
+# define YY_DECL_VARIABLES     391,
+yyparse 403,
+# define YYPOPSTACK 445,
+# define YYPOPSTACK 447,
+# undef YYSTACK_RELOCATE548,
+  *++yyvsp yyvsp746,
+  *++yylsp yylsp748,
+  yyn 755,
+  yystate 757,
+    yystate 761,
+  goto yynewstate;763,
+  goto yyerrlab1;823,
+  yyerrstatus 846,
+  goto yyerrhandle;848,
+  yyn 861,
+  yystate 875,
+  yyn 895,
+  yyn 903,
+  *++yyvsp yyvsp919,
+  *++yylsp yylsp921,
+  yystate 924,
+  goto yynewstate;925,
+  yyresult 932,
+  goto yyreturn;933,
+  yyresult 939,
+  goto yyreturn;940,
+  yyresult 947,
+
+y-src/cccp.y,1107
+typedef unsigned char U_CHAR;38,1201
+struct arglist 41,1301
+#define NULL 51,1468
+#define GENERIC_PTR 56,1578
+#define GENERIC_PTR 58,1611
+#define NULL_PTR 63,1670
+int expression_value;68,1743
+static jmp_buf parse_return_error;70,1766
+static int keyword_parsing 73,1865
+#define CHAR_TYPE_SIZE 87,2162
+#define INT_TYPE_SIZE 91,2229
+#define LONG_TYPE_SIZE 95,2296
+#define WCHAR_TYPE_SIZE 99,2365
+#define possible_sum_sign(104,2556
+  struct constant 112,2733
+  struct name 113,2789
+start 143,3226
+exp1   148,3330
+exp    156,3505
+exp    185,4295
+keywords 306,7835
+static char *lexptr;lexptr332,8579
+parse_number 341,8842
+struct token 437,11038
+static struct token tokentab2[tokentab2442,11088
+yylex 459,11367
+parse_escape 740,17718
+yyerror 836,19599
+integer_overflow 844,19690
+left_shift 851,19804
+right_shift 873,20194
+parse_c_expression 893,20732
+main 923,21483
+unsigned char is_idchar[is_idchar948,21901
+unsigned char is_idstart[is_idstart950,21996
+char is_hor_space[is_hor_space953,22160
+initialize_random_junk 958,22259
+error 988,22915
+warning 993,22963
+lookup 999,23033
+
+tex-src/nonewline.tex,0
+
+php-src/sendmail.php,0
+
+c-src/fail.c,0
+
+a-src/empty.zz,0
diff --git a/test/etags/ETAGS.good_2 b/test/etags/ETAGS.good_2
new file mode 100644
index 0000000..737a6f9
--- /dev/null
+++ b/test/etags/ETAGS.good_2
@@ -0,0 +1,6440 @@
+
+Makefile,701
+ADASRC=1,0
+ASRC=2,91
+CSRC=3,139
+CPSRC=7,410
+ELSRC=10,624
+ERLSRC=11,694
+FORTHSRC=12,759
+FSRC=13,809
+HTMLSRC=14,881
+JAVASRC=15,974
+LUASRC=16,1062
+MAKESRC=17,1105
+OBJCSRC=18,1147
+OBJCPPSRC=19,1228
+PASSRC=20,1291
+PERLSRC=21,1333
+PHPSRC=22,1413
+PSSRC=23,1485
+PROLSRC=24,1525
+PYTSRC=25,1587
+TEXSRC=26,1628
+YSRC=27,1707
+SRCS=28,1772
+NONSRCS=32,2024
+ETAGS_PROG=34,2098
+CTAGS_PROG=35,2129
+REGEX=37,2161
+xx=38,2207
+RUN=40,2256
+OPTIONS=42,2262
+ARGS=43,2314
+infiles 45,2332
+check:check47,2394
+ediff%:ediff%55,2697
+cdiff:cdiff58,2798
+ETAGS:ETAGS61,2895
+CTAGS:CTAGS64,2965
+srclist:srclist67,3043
+regexfile:regexfile71,3134
+.PRECIOUS:.PRECIOUS77,3311
+FRC:FRC79,3345
+
+ada-src/etags-test-for.ada,1969
+   type LL_Task_Procedure_Access LL_Task_Procedure_Access/t1,0
+   function Body_RequiredBody_Required/f3,78
+   type Type_Specific_Data Type_Specific_Data/t11,280
+   function "abs"abs/f19,504
+   type Barrier_Function_Pointer Barrier_Function_Pointer/t21,577
+   function "="=/f27,722
+   type usfreelock_ptr usfreelock_ptr/t30,803
+   function p p/f33,891
+   procedure LL_Wrapper LL_Wrapper/p37,1054
+function p p/f39,1094
+package Pkg1 Pkg1/s44,1203
+  type Private_T Private_T/t46,1220
+  package Inner1 Inner1/s48,1250
+    procedure Private_T;Private_T/p49,1270
+  package Inner2 Inner2/s52,1310
+    task Private_T;Private_T/k53,1330
+  type Public_T Public_T/t56,1365
+  procedure Pkg1_Proc1;Pkg1_Proc1/p62,1450
+  procedure Pkg1_Proc2 Pkg1_Proc2/p64,1475
+  function Pkg1_Func1 Pkg1_Func1/f66,1514
+  function Pkg1_Func2 Pkg1_Func2/f68,1553
+  package Pkg1_Pkg1 Pkg1_Pkg1/s71,1622
+    procedure Pkg1_Pkg1_Proc1;Pkg1_Pkg1_Proc1/p72,1645
+  task type Task_Type Task_Type/k75,1694
+  type Private_T Private_T/t82,1786
+package body Pkg1 Pkg1/b89,1882
+  procedure Pkg1_Proc1 Pkg1_Proc1/p91,1904
+  package body Inner1 Inner1/b96,1956
+    procedure Private_T Private_T/p97,1981
+  package body Inner2 Inner2/b103,2054
+    task body Private_T Private_T/b104,2079
+  task body Task_Type Task_Type/b112,2181
+  procedure Pkg1_Proc2 Pkg1_Proc2/p126,2367
+  function Pkg1_Func1 Pkg1_Func1/f132,2445
+  function Pkg1_Func2 Pkg1_Func2/f134,2496
+  package body Pkg1_Pkg1 Pkg1_Pkg1/b140,2596
+package body Pkg1_Pkg1 Pkg1_Pkg1/b146,2663
+  procedure Pkg1_Pkg1_Proc1 Pkg1_Pkg1_Proc1/p147,2689
+function  Pkg1_Func1 Pkg1_Func1/f155,2778
+package Truc Truc/s162,2887
+package Truc.Bidule Truc.Bidule/s166,2929
+  protected Bidule Bidule/t168,2953
+  protected type Machin_T Machin_T/t172,3007
+package body Truc.Bidule Truc.Bidule/b178,3087
+  protected body Bidule Bidule/b179,3115
+  protected Machin_T Machin_T/t186,3207
+
+ada-src/2ataspri.adb,2190
+package body System.Task_Primitives System.Task_Primitives/b64,2603
+   package RTE RTE/s69,2712
+   package TSL TSL/s70,2759
+   function To_void_ptr To_void_ptr/f86,3287
+   function To_TCB_Ptr To_TCB_Ptr/f89,3366
+   function 
pthread_mutexattr_setprotocolpthread_mutexattr_setprotocol/f92,3444
+   function 
pthread_mutexattr_setprio_ceilingpthread_mutexattr_setprio_ceiling/f99,3728
+   procedure Abort_WrapperAbort_Wrapper/p115,4302
+   procedure LL_Wrapper LL_Wrapper/p122,4526
+   procedure Initialize_LL_Tasks Initialize_LL_Tasks/p131,4830
+   function Self Self/f160,5586
+   procedure Initialize_LockInitialize_Lock/p174,5958
+   procedure Finalize_Lock Finalize_Lock/p210,6927
+   procedure Write_Lock Write_Lock/p226,7338
+   procedure Read_Lock Read_Lock/p239,7700
+   procedure Unlock Unlock/p246,7850
+   procedure Initialize_Cond Initialize_Cond/p258,8160
+   procedure Finalize_Cond Finalize_Cond/p286,8979
+   procedure Cond_Wait Cond_Wait/p300,9303
+   procedure Cond_Timed_WaitCond_Timed_Wait/p312,9661
+   procedure Cond_Signal Cond_Signal/p343,10510
+   procedure Set_PrioritySet_Priority/p355,10836
+   procedure Set_Own_Priority Set_Own_Priority/p372,11243
+   function Get_Priority Get_Priority/f385,11598
+   function Get_Own_Priority Get_Own_Priority/f398,12023
+   procedure Create_LL_TaskCreate_LL_Task/p412,12438
+      function To_Start_Addr To_Start_Addr/f426,12873
+   procedure Exit_LL_Task Exit_LL_Task/p491,14995
+   procedure Abort_Task Abort_Task/p500,15158
+   procedure Test_Abort Test_Abort/p518,15716
+   procedure Install_Abort_Handler Install_Abort_Handler/p527,15878
+   procedure Abort_WrapperAbort_Wrapper/p557,16939
+      function Address_To_Call_State Address_To_Call_State/f562,17062
+   procedure Install_Error_Handler Install_Error_Handler/p573,17351
+   procedure LL_Assert LL_Assert/p599,18146
+   procedure LL_Wrapper LL_Wrapper/p608,18299
+   procedure Initialize_TAS_Cell Initialize_TAS_Cell/p630,19010
+   procedure Finalize_TAS_Cell Finalize_TAS_Cell/p635,19129
+   procedure Clear Clear/p640,19236
+   procedure Test_And_Set Test_And_Set/p645,19330
+   function  Is_Set Is_Set/f659,19676
+
+ada-src/2ataspri.ads,2313
+package System.Task_Primitives System.Task_Primitives/s58,3169
+   type LL_Task_Procedure_Access LL_Task_Procedure_Access/t62,3253
+   type Pre_Call_State Pre_Call_State/t64,3331
+   type Task_Storage_Size Task_Storage_Size/t66,3378
+   type Machine_Exceptions Machine_Exceptions/t68,3433
+   type Error_Information Error_Information/t70,3499
+   type Lock Lock/t72,3569
+   type Condition_Variable Condition_Variable/t73,3594
+   type Task_Control_Block Task_Control_Block/t81,3955
+   type TCB_Ptr TCB_Ptr/t89,4241
+   function Address_To_TCB_Ptr Address_To_TCB_Ptr/f93,4333
+   procedure Initialize_LL_Tasks Initialize_LL_Tasks/p96,4425
+   function Self Self/f100,4602
+   procedure Initialize_Lock Initialize_Lock/p103,4707
+   procedure Finalize_Lock Finalize_Lock/p107,4879
+   procedure Write_Lock Write_Lock/p111,5034
+   procedure Read_Lock Read_Lock/p118,5428
+   procedure Unlock Unlock/p128,5995
+   procedure Initialize_Cond Initialize_Cond/p135,6300
+   procedure Finalize_Cond Finalize_Cond/p138,6413
+   procedure Cond_Wait Cond_Wait/p142,6591
+   procedure Cond_Timed_WaitCond_Timed_Wait/p155,7396
+   procedure Cond_Signal Cond_Signal/p164,7812
+   procedure Set_Priority Set_Priority/p169,8040
+   procedure Set_Own_Priority Set_Own_Priority/p173,8200
+   function Get_Priority Get_Priority/f177,8348
+   function Get_Own_Priority Get_Own_Priority/f181,8504
+   procedure Create_LL_TaskCreate_LL_Task/p185,8647
+   procedure Exit_LL_Task;Exit_LL_Task/p198,9282
+   procedure Abort_Task Abort_Task/p203,9516
+   procedure Test_Abort;Test_Abort/p210,9878
+   type Abort_Handler_Pointer Abort_Handler_Pointer/t217,10233
+   procedure Install_Abort_Handler Install_Abort_Handler/p219,10312
+   procedure Install_Error_Handler Install_Error_Handler/p226,10741
+   procedure LL_Assert LL_Assert/p231,10983
+   type Proc Proc/t238,11240
+   type TAS_Cell TAS_Cell/t242,11328
+   procedure Initialize_TAS_Cell Initialize_TAS_Cell/p249,11670
+   procedure Finalize_TAS_Cell Finalize_TAS_Cell/p255,11941
+   procedure Clear Clear/p260,12157
+   procedure Test_And_Set Test_And_Set/p267,12462
+   function  Is_Set Is_Set/f275,12877
+   type Lock Lock/t283,13155
+   type Condition_Variable Condition_Variable/t288,13267
+   type TAS_Cell TAS_Cell/t293,13389
+
+ada-src/waroquiers.ada,1503
+package Pkg1 Pkg1/s3,89
+  type Private_T Private_T/t5,106
+  package Inner1 Inner1/s7,136
+    procedure Private_T;Private_T/p8,156
+  package Inner2 Inner2/s11,196
+    task Private_T;Private_T/k12,216
+  type Public_T Public_T/t15,251
+  procedure Pkg1_Proc1;Pkg1_Proc1/p21,336
+  procedure Pkg1_Proc2 Pkg1_Proc2/p23,361
+  function Pkg1_Func1 Pkg1_Func1/f25,400
+  function Pkg1_Func2 Pkg1_Func2/f27,439
+  package Pkg1_Pkg1 Pkg1_Pkg1/s30,508
+    procedure Pkg1_Pkg1_Proc1;Pkg1_Pkg1_Proc1/p31,531
+  task type Task_Type Task_Type/k34,580
+  type Private_T Private_T/t40,671
+package body Pkg1 Pkg1/b46,766
+  procedure Pkg1_Proc1 Pkg1_Proc1/p48,788
+  package body Inner1 Inner1/b53,840
+    procedure Private_T Private_T/p54,865
+  package body Inner2 Inner2/b60,938
+    task body Private_T Private_T/b61,963
+  task body Task_Type Task_Type/b68,1064
+  procedure Pkg1_Proc2 Pkg1_Proc2/p82,1250
+  function Pkg1_Func1 Pkg1_Func1/f88,1328
+  function Pkg1_Func2 Pkg1_Func2/f90,1379
+  package body Pkg1_Pkg1 Pkg1_Pkg1/b96,1479
+package body Pkg1_Pkg1 Pkg1_Pkg1/b100,1544
+  procedure Pkg1_Pkg1_Proc1 Pkg1_Pkg1_Proc1/p101,1570
+function  Pkg1_Func1 Pkg1_Func1/f107,1657
+package Truc Truc/s112,1764
+package Truc.Bidule Truc.Bidule/s116,1816
+  protected Bidule Bidule/t125,1964
+  protected type Machin_T Machin_T/t131,2046
+package body Truc.Bidule Truc.Bidule/b138,2153
+  protected body Bidule Bidule/b139,2181
+  protected body Machin_T Machin_T/b146,2281
+
+c-src/abbrev.c,1432
+Lisp_Object Vabbrev_table_name_list;42,1416
+Lisp_Object Vglobal_abbrev_table;47,1561
+Lisp_Object Vfundamental_mode_abbrev_table;51,1672
+int abbrevs_changed;55,1773
+int abbrev_all_caps;57,1795
+Lisp_Object Vabbrev_start_location;62,1944
+Lisp_Object Vabbrev_start_location_buffer;65,2033
+Lisp_Object Vlast_abbrev;69,2142
+Lisp_Object Vlast_abbrev_text;74,2311
+int last_abbrev_point;78,2401
+Lisp_Object Vpre_abbrev_expand_hook,82,2474
+Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;82,2474
+DEFUN ("make-abbrev-table", Fmake_abbrev_table,make-abbrev-table84,2538
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table,clear-abbrev-table91,2730
+DEFUN ("define-abbrev", Fdefine_abbrev,define-abbrev106,3111
+DEFUN ("define-global-abbrev", 
Fdefine_global_abbrev,define-global-abbrev148,4430
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,define-mode-abbrev159,4801
+DEFUN ("abbrev-symbol", Fabbrev_symbol,abbrev-symbol173,5269
+DEFUN ("abbrev-expansion", Fabbrev_expansion,abbrev-expansion201,6233
+DEFUN ("expand-abbrev", Fexpand_abbrev,expand-abbrev217,6748
+DEFUN ("unexpand-abbrev", Funexpand_abbrev,unexpand-abbrev388,11669
+write_abbrev 425,12876
+describe_abbrev 444,13311
+DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,insert-abbrev-table-description465,13826
+DEFUN ("define-abbrev-table", 
Fdefine_abbrev_table,define-abbrev-table505,14982
+syms_of_abbrev 539,16059
+
+c-src/torture.c,197
+(*tag1 tag118,452
+#define notag2 26,553
+(*tag2 tag229,630
+(*tag3 tag339,772
+#define notag4 45,861
+(*tag4 tag448,955
+tag5 57,1081
+tag6 66,1208
+int pp1(74,1317
+pp287,1419
+pp3(100,1518
+
+c-src/getopt.h,538
+#define _GETOPT_H 19,801
+extern char *optarg;optarg31,1109
+extern int optind;45,1617
+extern int opterr;50,1743
+struct option73,2797
+#define        no_argument     89,3124
+#define required_argument      90,3147
+#define optional_argument      91,3175
+extern int getopt 98,3440
+extern int getopt 100,3544
+extern int getopt_long 102,3599
+extern int getopt_long_only 104,3731
+extern int _getopt_internal 109,3942
+extern int getopt 114,4140
+extern int getopt_long 115,4162
+extern int getopt_long_only 116,4189
+extern int _getopt_internal 118,4222
+
+c-src/etags.c,12175
+char pot_etags_version[pot_etags_version81,3470
+#  undef DEBUG84,3552
+#  define DEBUG 85,3567
+#  define DEBUG 87,3594
+#  define NDEBUG       88,3617
+# define _GNU_SOURCE 94,3705
+# undef MSDOS100,3876
+# undef  WINDOWSNT101,3890
+# define WINDOWSNT102,3909
+# undef MSDOS106,3968
+# define MSDOS 107,3982
+# define MSDOS 110,4032
+# define MAXPATHLEN 115,4111
+# undef HAVE_NTGUI116,4141
+# undef  DOS_NT117,4160
+# define DOS_NT118,4176
+# undef  assert        135,4482
+# define assert(136,4541
+# undef  CTAGS146,4857
+# define CTAGS 147,4872
+# define CTAGS 149,4898
+#define streq(152,4927
+#define strcaseeq(153,4996
+#define strneq(154,5075
+#define strncaseeq(155,5151
+#define CHARS 157,5238
+#define CHAR(158,5278
+#define        iswhite(159,5329
+#define notinname(160,5394
+#define        begtoken(161,5469
+#define        intoken(162,5542
+#define        endtoken(163,5614
+#define ISALNUM(165,5684
+#define ISALPHA(166,5722
+#define ISDIGIT(167,5760
+#define ISLOWER(168,5798
+#define lowcase(170,5837
+#define xnew(179,6015
+#define xrnew(180,6083
+typedef void Lang_function 182,6164
+} compressor;188,6365
+} language;199,6835
+typedef struct fdesc201,6848
+} fdesc;212,7366
+typedef struct node_st214,7376
+} node;225,7894
+} linebuffer;239,8248
+    at_language,245,8344
+    at_regexp,246,8393
+    at_filename,247,8437
+    at_stdin,248,8473
+    at_end     249,8516
+} argument;253,8698
+typedef struct regexp256,8758
+} regexp;268,9325
+static void Ada_funcs 274,9428
+static void Asm_labels 275,9460
+static void C_entries 276,9493
+static void default_C_entries 277,9536
+static void plain_C_entries 278,9576
+static void Cjava_entries 279,9614
+static void Cobol_paragraphs 280,9650
+static void Cplusplus_entries 281,9689
+static void Cstar_entries 282,9729
+static void Erlang_functions 283,9765
+static void Forth_words 284,9804
+static void Fortran_functions 285,9838
+static void HTML_labels 286,9878
+static void Lisp_functions 287,9912
+static void Lua_functions 288,9949
+static void Makefile_targets 289,9985
+static void Pascal_functions 290,10024
+static void Perl_functions 291,10063
+static void PHP_functions 292,10100
+static void PS_functions 293,10136
+static void Prolog_functions 294,10171
+static void Python_functions 295,10210
+static void Scheme_functions 296,10249
+static void TeX_commands 297,10288
+static void Texinfo_nodes 298,10323
+static void Yacc_entries 299,10359
+static void just_read_file 300,10394
+static language *get_language_from_langname 
get_language_from_langname302,10432
+static void readline 303,10492
+static long readline_internal 304,10537
+static bool nocase_tail 305,10591
+static void get_tag 306,10631
+static void analyze_regex 308,10671
+static void free_regexps 309,10707
+static void regex_tag_multiline 310,10740
+static void error 311,10780
+# undef STDIN408,15073
+#define STDIN 411,15095
+static compressor compressors[compressors457,17664
+static const char *Ada_suffixes Ada_suffixes473,17907
+static const char Ada_help 475,17977
+static const char *Asm_suffixes Asm_suffixes493,18580
+static const char Asm_help 504,18976
+static const char *default_C_suffixes default_C_suffixes512,19312
+static const char default_C_help 515,19413
+static const char default_C_help 523,19850
+static const char *Cplusplus_suffixes Cplusplus_suffixes535,20460
+static const char Cplusplus_help 540,20658
+static const char *Cjava_suffixes Cjava_suffixes549,21113
+static char Cjava_help 551,21172
+static const char *Cobol_suffixes Cobol_suffixes556,21337
+static char Cobol_help 558,21402
+static const char *Cstar_suffixes Cstar_suffixes562,21543
+static const char *Erlang_suffixes Erlang_suffixes565,21607
+static const char Erlang_help 567,21673
+const char *Forth_suffixes Forth_suffixes571,21799
+static const char Forth_help 573,21857
+static const char *Fortran_suffixes Fortran_suffixes577,22008
+static const char Fortran_help 579,22085
+static const char *HTML_suffixes HTML_suffixes582,22190
+static const char HTML_help 584,22264
+static const char *Lisp_suffixes Lisp_suffixes589,22452
+static const char Lisp_help 591,22556
+static const char *Lua_suffixes Lua_suffixes598,22871
+static const char Lua_help 600,22934
+static const char *Makefile_filenames Makefile_filenames603,23010
+static const char Makefile_help 605,23133
+static const char *Objc_suffixes Objc_suffixes609,23277
+static const char Objc_help 613,23399
+static const char *Pascal_suffixes Pascal_suffixes619,23714
+static const char Pascal_help 621,23778
+static const char *Perl_suffixes Perl_suffixes626,23966
+static const char *Perl_interpreters Perl_interpreters628,24028
+static const char Perl_help 630,24100
+static const char *PHP_suffixes PHP_suffixes637,24451
+static const char PHP_help 639,24523
+static const char *plain_C_suffixes plain_C_suffixes643,24678
+static const char *PS_suffixes PS_suffixes647,24762
+static const char PS_help 649,24848
+static const char *Prolog_suffixes Prolog_suffixes652,24931
+static const char Prolog_help 654,24993
+static const char *Python_suffixes Python_suffixes658,25107
+static const char Python_help 660,25165
+static const char *Scheme_suffixes Scheme_suffixes665,25347
+static const char Scheme_help 667,25460
+static const char *TeX_suffixes TeX_suffixes672,25683
+static const char TeX_help 674,25781
+static const char *Texinfo_suffixes Texinfo_suffixes686,26316
+static const char Texinfo_help 688,26395
+static const char *Yacc_suffixes Yacc_suffixes691,26492
+static const char Yacc_help 693,26606
+static const char auto_help 699,26856
+static const char none_help 703,27020
+static const char no_lang_help 707,27143
+static language lang_names 718,27355
+print_language_names 753,29532
+# define EMACS_NAME 786,30755
+# define VERSION 789,30811
+print_version 792,30869
+# define PRINT_UNDOCUMENTED_OPTIONS_HELP 804,31173
+print_help 808,31250
+main 981,37438
+get_compressor_from_suffix 1319,46217
+get_language_from_langname 1355,47158
+get_language_from_interpreter 1377,47545
+get_language_from_filename 1399,47976
+process_file_name 1433,48834
+process_file 1555,51665
+init 1632,54150
+find_entries 1656,54901
+make_tag 1814,59707
+pfnote 1856,60942
+free_tree 1917,62744
+free_fdesc 1935,63029
+add_node 1955,63472
+invalidate_nodes 2035,65537
+static int total_size_of_entries 2067,66150
+static int number_len 2068,66193
+total_size_of_entries 2087,66694
+put_entries 2107,67154
+#define C_EXT  2193,68995
+#define C_PLAIN 2194,69037
+#define C_PLPL 2195,69070
+#define C_STAR 2196,69104
+#define C_JAVA 2197,69137
+#define C_AUTO 2198,69172
+#define YACC   2199,69242
+enum sym_type2204,69312
+  st_none,2206,69328
+  st_C_objprot,2207,69339
+  st_C_objprot, st_C_objimpl,2207,69339
+  st_C_objprot, st_C_objimpl, st_C_objend,2207,69339
+  st_C_gnumacro,2208,69382
+  st_C_ignore,2209,69399
+  st_C_ignore, st_C_attribute,2209,69399
+  st_C_javastruct,2210,69430
+  st_C_operator,2211,69449
+  st_C_class,2212,69466
+  st_C_class, st_C_template,2212,69466
+  st_C_struct,2213,69495
+  st_C_struct, st_C_extern,2213,69495
+  st_C_struct, st_C_extern, st_C_enum,2213,69495
+  st_C_struct, st_C_extern, st_C_enum, st_C_define,2213,69495
+  st_C_struct, st_C_extern, st_C_enum, st_C_define, st_C_typedef2213,69495
+struct C_stab_entry 2271,71278
+hash 2275,71409
+in_word_set 2321,72937
+      TOTAL_KEYWORDS 2325,73018
+      MIN_WORD_LENGTH 2326,73045
+      MAX_WORD_LENGTH 2327,73072
+      MIN_HASH_VALUE 2328,73100
+      MAX_HASH_VALUE 2329,73126
+C_symtype 2387,74985
+static bool inattribute;2400,75234
+  fvnone,2408,75435
+  fdefunkey,2409,75466
+  fdefunname,2410,75512
+  foperator,2411,75556
+  fvnameseen,2412,75613
+  fstartlist,2413,75666
+  finlist,2414,75722
+  flistseen,2415,75765
+  fignore,2416,75813
+  vignore      2417,75856
+} fvdef;2418,75901
+static bool fvextern;2420,75911
+  tnone,2428,76089
+  tkeyseen,2429,76119
+  ttypeseen,2430,76160
+  tinbody,2431,76199
+  tend,2432,76238
+  tignore      2433,76279
+} typdef;2434,76320
+  snone,2443,76499
+  skeyseen,2445,76575
+  stagseen,2446,76620
+  scolonseen   2447,76661
+} structdef;2448,76715
+static const char *objtag objtag2453,76809
+  dnone,2460,76942
+  dsharpseen,2461,76972
+  ddefineseen,2462,77025
+  dignorerest  2463,77070
+} definedef;2464,77112
+  onone,2472,77267
+  oprotocol,2473,77297
+  oimplementation,2474,77347
+  otagseen,2475,77395
+  oparenseen,2476,77431
+  ocatseen,2477,77486
+  oinbody,2478,77525
+  omethodsign,2479,77568
+  omethodtag,2480,77626
+  omethodcolon,2481,77666
+  omethodparm,2482,77709
+  oignore      2483,77755
+} objdef;2484,77787
+static struct tok2491,77944
+} token;2508,78626
+static void pushclass_above 2514,78784
+static void popclass_above 2515,78832
+static void write_classname 2516,78866
+} cstack;2523,79136
+#define nestlev        2525,79264
+#define instruct       2527,79369
+pushclass_above 2531,79489
+popclass_above 2550,79948
+write_classname 2564,80162
+static bool consider_token 2592,80761
+static void make_C_tag 2593,80833
+consider_token 2613,81341
+} lbs[lbs2924,88532
+#define current_lb_is_new 2926,88543
+#define switch_line_buffers(2927,88588
+#define curlb 2929,88641
+#define newlb 2930,88672
+#define curlinepos 2931,88703
+#define newlinepos 2932,88744
+#define plainc 2934,88786
+#define cplpl 2935,88830
+#define cjava 2936,88861
+#define CNL_SAVE_DEFINEDEF(2938,88905
+#define CNL(2947,89117
+make_C_tag 2960,89375
+C_entries 2986,90194
+default_C_entries 3833,110156
+plain_C_entries 3840,110276
+Cplusplus_entries 3847,110364
+Cjava_entries 3854,110460
+Cstar_entries 3861,110550
+Yacc_entries 3868,110642
+#define LOOP_ON_INPUT_LINES(3875,110720
+#define LOOKING_AT(3884,111056
+#define LOOKING_AT_NOCASE(3891,111461
+just_read_file 3901,111861
+static void F_takeprec 3910,111965
+static void F_getit 3911,111996
+F_takeprec 3914,112039
+F_getit 3937,112366
+Fortran_functions 3961,112840
+Ada_getit 4052,114669
+Ada_funcs 4115,116044
+Asm_labels 4228,118582
+Perl_functions 4261,119549
+Python_functions 4357,122057
+PHP_functions 4387,122684
+Cobol_paragraphs 4466,124471
+Makefile_targets 4494,125029
+Pascal_functions 4529,125950
+static void L_getit 4706,130277
+L_getit 4709,130318
+Lisp_functions 4725,130664
+Lua_functions 4785,131850
+PS_functions 4811,132385
+Forth_words 4841,133053
+Scheme_functions 4877,134092
+static linebuffer *TEX_toktab TEX_toktab4908,134781
+static const char *TEX_defenv TEX_defenv4912,134974
+static void TEX_mode 4917,135172
+static void TEX_decode_env 4918,135203
+static char TEX_esc 4920,135261
+static char TEX_opgrp 4921,135289
+static char TEX_clgrp 4922,135318
+TeX_commands 4928,135395
+#define TEX_LESC 4986,136652
+#define TEX_SESC 4987,136674
+TEX_mode 4992,136804
+TEX_decode_env 5026,137509
+Texinfo_nodes 5071,138554
+HTML_labels 5094,139013
+static size_t prolog_pr 5214,142192
+static void prolog_skip_comment 5215,142234
+static size_t prolog_atom 5216,142290
+Prolog_functions 5219,142347
+prolog_skip_comment 5255,143128
+prolog_pr 5281,143736
+prolog_atom 5319,144628
+static int erlang_func 5374,145540
+static void erlang_attribute 5375,145581
+static int erlang_atom 5376,145620
+Erlang_functions 5379,145666
+erlang_func 5438,146965
+erlang_attribute 5476,147642
+erlang_atom 5496,148061
+static char *scan_separators scan_separators5520,148487
+static void add_regex 5521,148526
+static char *substitute substitute5522,148570
+scan_separators 5534,149080
+analyze_regex 5586,150460
+add_regex 5654,152050
+substitute 5767,154797
+free_regexps 5814,155837
+regex_tag_multiline 5836,156291
+nocase_tail 5913,158263
+get_tag 5928,158519
+readline_internal 5959,159455
+readline 6037,161296
+savestr 6230,167243
+savenstr 6240,167473
+skip_spaces 6249,167679
+skip_non_spaces 6258,167833
+skip_name 6267,167983
+fatal 6277,168156
+pfatal 6284,168253
+suggest_asking_for_help 6291,168332
+error 6300,168554
+concat 6313,168846
+etags_getcwd 6329,169259
+relative_filename 6350,169725
+absolute_filename 6389,170751
+absolute_dirname 6453,172416
+filename_is_absolute 6472,172845
+canonicalize_filename 6484,173096
+# define ISUPPER(6491,173235
+linebuffer_init 6514,173656
+linebuffer_setlen 6524,173887
+xmalloc 6536,174148
+xrealloc 6545,174314
+
+c-src/exit.c,47
+  } __libc_atexit;30,1011
+DEFUN(exit,38,1252
+
+c-src/exit.strange_suffix,47
+  } __libc_atexit;30,1011
+DEFUN(exit,38,1252
+
+c-src/sysdep.h,491
+#define        ENTRY(21,865
+#define        PSEUDO(26,972
+    movl $SYS_##syscall_nam$SYS_##syscall_na31,1132
+    movl $SYS_##syscall_name, %eax;eax31,1132
+    int $0x80;32,1180
+    test %eax,eax33,1210
+    test %eax, %eax;eax33,1210
+    jl syscall_error;34,1245
+#define        XCHG_0  47,1562
+#define        XCHG_1  48,1606
+#define        XCHG_2  49,1648
+#define        XCHG_3  50,1691
+#define        XCHG_4  51,1734
+#define        XCHG_5  52,1777
+#define        r0      54,1821
+#define        r1      55,1875
+#define scratch 56,1932
+#define MOVE(57,2001
+
+c-src/tab.c,196
+static int             count_words(15,263
+static char            *get_word(get_word35,553
+void                   tab_free(59,966
+char                   **tab_fill(tab_fill70,1129
+int                    tab_delete_first(91,1638
+int                    tab_count_words(103,1820
+
+c-src/dostorture.c,197
+(*tag1 tag118,451
+#define notag2 26,552
+(*tag2 tag229,629
+(*tag3 tag339,771
+#define notag4 45,860
+(*tag4 tag448,954
+tag5 57,1080
+tag6 66,1207
+int pp1(74,1316
+pp287,1418
+pp3(100,1517
+
+c-src/emacs/src/gmalloc.c,6643
+#define USE_PTHREAD25,1002
+#undef get_current_dir_name33,1126
+extern void emacs_abort 47,1305
+#undef malloc64,2110
+#undef realloc65,2124
+#undef calloc66,2139
+#undef free67,2153
+#define malloc 68,2165
+#define realloc 69,2188
+#define calloc 70,2213
+#define aligned_alloc 71,2236
+#define free 72,2273
+extern void *bss_sbrk bss_sbrk76,2335
+extern int bss_sbrk_did_unexec;77,2375
+extern char bss_sbrk_buffer[bss_sbrk_buffer78,2407
+extern void *bss_sbrk_buffer_end;bss_sbrk_buffer_end79,2438
+#define DUMPED 80,2472
+#define ALLOCATED_BEFORE_DUMPING(81,2507
+extern void *malloc malloc94,2718
+#define INT_BIT        124,3934
+#define BLOCKLOG       125,3977
+#define BLOCKSIZE      126,4018
+#define BLOCKIFY(127,4052
+#define HEAP   131,4215
+#define FINAL_FREE_BLOCKS      135,4391
+  } malloc_info;167,5388
+extern char *_heapbase;_heapbase170,5449
+extern malloc_info *_heapinfo;_heapinfo173,5541
+#define BLOCK(176,5620
+#define ADDRESS(177,5682
+extern size_t _heapindex;180,5797
+extern size_t _heaplimit;183,5866
+struct list186,5939
+extern struct list _fraghead[_fraghead193,6056
+struct alignlist196,6153
+extern struct alignlist *_aligned_blocks;_aligned_blocks202,6334
+extern size_t _chunks_used;205,6401
+extern size_t _bytes_used;206,6429
+extern size_t _chunks_free;207,6456
+extern size_t _bytes_free;208,6484
+extern void *_malloc_internal _malloc_internal213,6673
+extern void *_realloc_internal _realloc_internal214,6713
+extern void _free_internal 215,6762
+extern void *_malloc_internal_nolock _malloc_internal_nolock216,6799
+extern void *_realloc_internal_nolock _realloc_internal_nolock217,6846
+extern void _free_internal_nolock 218,6902
+extern pthread_mutex_t _malloc_mutex,221,6966
+extern pthread_mutex_t _malloc_mutex, _aligned_blocks_mutex;221,6966
+extern int _malloc_thread_enabled_p;222,7027
+#define LOCK(223,7064
+#define UNLOCK(228,7195
+#define LOCK_ALIGNED_BLOCKS(233,7329
+#define UNLOCK_ALIGNED_BLOCKS(238,7484
+#define LOCK(244,7649
+#define UNLOCK(245,7664
+#define LOCK_ALIGNED_BLOCKS(246,7681
+#define UNLOCK_ALIGNED_BLOCKS(247,7711
+extern void *malloc_find_object_address malloc_find_object_address252,7865
+extern void *(*__morecore)__morecore256,8021
+extern void *__default_morecore __default_morecore259,8105
+extern void (*__after_morecore_hook)__after_morecore_hook263,8269
+extern size_t __malloc_extra_blocks;267,8442
+extern int __malloc_initialized;270,8552
+extern int __malloc_initialize 272,8646
+extern void (*__malloc_initialize_hook)__malloc_initialize_hook275,8723
+extern void (*__free_hook)__free_hook276,8771
+extern void *(*__malloc_hook)__malloc_hook277,8811
+extern void *(*__realloc_hook)__realloc_hook278,8856
+extern void *(*__memalign_hook)__memalign_hook279,8913
+enum mcheck_status283,9092
+    MCHECK_DISABLED 285,9115
+    MCHECK_OK,286,9187
+    MCHECK_FREE,287,9226
+    MCHECK_HEAD,288,9270
+    MCHECK_TAIL        289,9334
+extern int mcheck 296,9701
+extern enum mcheck_status mprobe 301,9952
+extern void mtrace 304,10055
+extern void muntrace 305,10082
+struct mstats308,10153
+extern struct mstats mstats 318,10518
+extern void memory_warnings 321,10625
+void *(*__malloc_hook)__malloc_hook352,11743
+char *_heapbase;_heapbase355,11829
+malloc_info *_heapinfo;_heapinfo358,11927
+static size_t heapsize;361,11983
+size_t _heapindex;364,12047
+size_t _heaplimit;367,12109
+struct list _fraghead[_fraghead370,12171
+size_t _chunks_used;373,12229
+size_t _bytes_used;374,12250
+size_t _chunks_free;375,12270
+size_t _bytes_free;376,12291
+int __malloc_initialized;379,12340
+size_t __malloc_extra_blocks;381,12367
+void (*__malloc_initialize_hook)__malloc_initialize_hook383,12398
+void (*__after_morecore_hook)__after_morecore_hook384,12439
+static int state_protected_p;400,12912
+static size_t last_state_size;401,12942
+static malloc_info *last_heapinfo;last_heapinfo402,12973
+protect_malloc_state 405,13014
+#define PROTECT_MALLOC_STATE(426,13627
+#define PROTECT_MALLOC_STATE(429,13697
+align 435,13794
+get_contiguous_space 466,14616
+register_heapinfo 497,15325
+pthread_mutex_t _malloc_mutex 517,15879
+pthread_mutex_t _aligned_blocks_mutex 518,15938
+int _malloc_thread_enabled_p;519,16005
+malloc_atfork_handler_prepare 522,16048
+malloc_atfork_handler_parent 529,16139
+malloc_atfork_handler_child 536,16233
+malloc_enable_thread 544,16375
+malloc_initialize_1 563,16961
+__malloc_initialize 594,17793
+static int morecore_recursing;604,17926
+morecore_nolock 609,18066
+_malloc_internal_nolock 722,21584
+_malloc_internal 920,28102
+malloc 932,28247
+extern void *_malloc _malloc956,29033
+extern void _free 957,29064
+extern void *_realloc _realloc958,29092
+_malloc 961,29140
+_free 967,29196
+_realloc 973,29240
+void (*__free_hook)__free_hook1001,30259
+struct alignlist *_aligned_blocks _aligned_blocks1004,30345
+_free_internal_nolock 1009,30474
+_free_internal 1255,38476
+free 1265,38603
+weak_alias 1277,38799
+#define min(1306,39813
+void *(*__realloc_hook)__realloc_hook1310,39898
+_realloc_internal_nolock 1319,40309
+_realloc_internal 1435,43563
+realloc 1447,43726
+calloc 1478,44894
+#define        __sbrk  1513,46042
+extern void *__sbrk __sbrk1518,46247
+__default_morecore 1525,46511
+void *(*__memalign_hook)__memalign_hook1554,47456
+aligned_alloc 1557,47522
+memalign 1647,49704
+posix_memalign 1656,49909
+extern void *valloc valloc1695,51140
+extern int getpagesize 1700,51278
+static size_t pagesize;1703,51317
+valloc 1706,51349
+#undef malloc1715,51490
+#undef realloc1716,51504
+#undef calloc1717,51519
+#undef aligned_alloc1718,51533
+#undef free1719,51554
+extern void *malloc malloc1722,51609
+extern void *realloc realloc1723,51644
+extern void *calloc calloc1724,51691
+extern void free 1725,51740
+extern void *aligned_alloc aligned_alloc1727,51796
+extern int posix_memalign 1729,51890
+hybrid_malloc 1736,52083
+hybrid_calloc 1744,52188
+hybrid_free 1752,52319
+hybrid_aligned_alloc 1765,52626
+hybrid_realloc 1780,52984
+char *gget_current_dir_name gget_current_dir_name1808,53753
+hybrid_get_current_dir_name 1811,53797
+static void (*old_free_hook)old_free_hook1846,54921
+static void *(*old_malloc_hook)old_malloc_hook1847,54963
+static void *(*old_realloc_hook)old_realloc_hook1848,55010
+static void (*abortfunc)abortfunc1851,55124
+#define MAGICWORD      1854,55206
+#define MAGICFREE      1855,55261
+#define MAGICBYTE      1856,55316
+#define MALLOCFLOOD    1857,55348
+#define FREEFLOOD      1858,55382
+struct hdr1860,55415
+checkhdr 1867,55581
+freehook 1891,56022
+mallochook 1927,56804
+reallochook 1944,57143
+mabort 1978,57901
+static int mcheck_used 2012,58586
+mcheck 2015,58619
+mprobe 2035,59138
+
+c-src/emacs/src/regex.h,4576
+#define _REGEX_H 21,836
+typedef unsigned long reg_syntax_t;43,1577
+#define RE_BACKSLASH_ESCAPE_IN_LISTS 47,1749
+#define RE_BK_PLUS_QM 52,1969
+#define RE_CHAR_CLASSES 58,2298
+#define RE_CONTEXT_INDEP_ANCHORS 72,3032
+#define RE_CONTEXT_INDEP_OPS 80,3458
+#define RE_CONTEXT_INVALID_OPS 84,3658
+#define RE_DOT_NEWLINE 88,3801
+#define RE_DOT_NOT_NULL 92,3937
+#define RE_HAT_LISTS_NOT_NEWLINE 96,4082
+#define RE_INTERVALS 101,4292
+#define RE_LIMITED_OPS 105,4441
+#define RE_NEWLINE_ALT 109,4583
+#define RE_NO_BK_BRACES 114,4773
+#define RE_NO_BK_PARENS 118,4964
+#define RE_NO_BK_REFS 122,5120
+#define RE_NO_BK_VBAR 126,5316
+#define RE_NO_EMPTY_RANGES 132,5610
+#define RE_UNMATCHED_RIGHT_PAREN_ORD 136,5766
+#define RE_NO_POSIX_BACKTRACKING 140,5937
+#define RE_NO_GNU_OPS 144,6133
+#define RE_FRUGAL 147,6253
+#define RE_SHY_GROUPS 150,6360
+#define RE_NO_NEWLINE_ANCHOR 153,6468
+#define RE_DEBUG 161,6884
+extern reg_syntax_t re_syntax_options;167,7170
+extern Lisp_Object re_match_object;172,7344
+extern size_t re_max_failures;176,7454
+#define RE_SYNTAX_EMACS        183,7684
+#define RE_SYNTAX_AWK  186,7780
+#define RE_SYNTAX_GNU_AWK      193,8084
+#define RE_SYNTAX_POSIX_AWK 197,8255
+#define RE_SYNTAX_GREP 201,8393
+#define RE_SYNTAX_EGREP        206,8549
+#define RE_SYNTAX_POSIX_EGREP  212,8765
+#define RE_SYNTAX_ED 216,8910
+#define RE_SYNTAX_SED 218,8954
+#define _RE_SYNTAX_POSIX_COMMON        221,9072
+#define RE_SYNTAX_POSIX_BASIC  225,9215
+#define RE_SYNTAX_POSIX_MINIMAL_BASIC  231,9508
+#define RE_SYNTAX_POSIX_EXTENDED       234,9598
+#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED       242,9967
+# undef RE_DUP_MAX253,10454
+#define RE_DUP_MAX 256,10540
+#define REG_EXTENDED 263,10762
+#define REG_ICASE 267,10886
+#define REG_NEWLINE 272,11070
+#define REG_NOSUB 276,11248
+#define REG_NOTBOL 286,11614
+#define REG_NOTEOL 289,11688
+  REG_ENOSYS 297,11859
+  REG_NOERROR 300,11941
+  REG_NOMATCH,301,11976
+  REG_BADPAT,305,12123
+  REG_ECOLLATE,306,12162
+  REG_ECTYPE,307,12203
+  REG_EESCAPE,308,12255
+  REG_ESUBREG,309,12298
+  REG_EBRACK,310,12345
+  REG_EPAREN,311,12391
+  REG_EBRACE,312,12436
+  REG_BADBR,313,12472
+  REG_ERANGE,314,12519
+  REG_ESPACE,315,12560
+  REG_BADRPT,316,12601
+  REG_EEND,319,12693
+  REG_ESIZE,320,12728
+  REG_ERPAREN,321,12790
+  REG_ERANGEX  322,12859
+} reg_errcode_t;323,12911
+# define RE_TRANSLATE_TYPE 332,13273
+struct re_pattern_buffer335,13315
+#define REGS_UNALLOCATED 376,14889
+#define REGS_REALLOCATE 377,14916
+#define REGS_FIXED 378,14942
+typedef struct re_pattern_buffer regex_t;416,16098
+typedef ssize_t regoff_t;423,16492
+struct re_registers428,16652
+# define RE_NREGS 440,16942
+} regmatch_t;451,17317
+extern reg_syntax_t re_set_syntax 457,17512
+extern const char *re_compile_pattern re_compile_pattern462,17776
+extern int re_compile_fastmap 469,18058
+extern regoff_t re_search 477,18466
+extern regoff_t re_search_2 485,18781
+extern regoff_t re_match 495,19177
+extern regoff_t re_match_2 501,19407
+extern void re_set_registers 520,20197
+extern char *re_comp re_comp528,20469
+extern int re_exec 529,20506
+#  define _Restrict_ 540,20886
+#  define _Restrict_ 542,20979
+#  define _Restrict_544,21018
+#  define _Restrict_arr_ 555,21418
+#  define _Restrict_arr_557,21461
+extern reg_errcode_t regcomp 562,21530
+extern reg_errcode_t regexec 566,21656
+extern size_t regerror 571,21850
+extern void regfree 574,21956
+#  define CHAR_CLASS_MAX_LENGTH 593,22470
+#  define CHAR_CLASS_MAX_LENGTH 597,22648
+typedef wctype_t re_wctype_t;599,22692
+typedef wchar_t re_wchar_t;600,22722
+# define re_wctype 601,22750
+# define re_iswctype 602,22776
+# define re_wctype_to_bit(603,22806
+# define CHAR_CLASS_MAX_LENGTH 605,22844
+# define btowc(606,22906
+typedef enum { RECC_ERROR 609,22953
+              RECC_ALNUM,610,22984
+              RECC_ALNUM, RECC_ALPHA,610,22984
+              RECC_ALNUM, RECC_ALPHA, RECC_WORD,610,22984
+              RECC_GRAPH,611,23027
+              RECC_GRAPH, RECC_PRINT,611,23027
+              RECC_LOWER,612,23059
+              RECC_LOWER, RECC_UPPER,612,23059
+              RECC_PUNCT,613,23091
+              RECC_PUNCT, RECC_CNTRL,613,23091
+              RECC_DIGIT,614,23123
+              RECC_DIGIT, RECC_XDIGIT,614,23123
+              RECC_BLANK,615,23156
+              RECC_BLANK, RECC_SPACE,615,23156
+              RECC_MULTIBYTE,616,23188
+              RECC_MULTIBYTE, RECC_NONASCII,616,23188
+              RECC_ASCII,617,23227
+              RECC_ASCII, RECC_UNIBYTE617,23227
+} re_wctype_t;618,23260
+extern char re_iswctype 620,23276
+extern re_wctype_t re_wctype 621,23329
+typedef int re_wchar_t;623,23387
+extern void re_set_whitespace_regexp 625,23412
+
+c-src/emacs/src/keyboard.c,15493
+volatile int interrupt_input_blocked;76,1808
+volatile bool pending_signals;80,1944
+#define KBD_BUFFER_SIZE 82,1976
+KBOARD *initial_kboard;initial_kboard84,2006
+KBOARD *current_kboard;current_kboard85,2030
+static KBOARD *all_kboards;all_kboards86,2054
+static bool single_kboard;89,2154
+#define NUM_RECENT_KEYS 91,2182
+static int recent_keys_index;94,2269
+static int total_keys;97,2357
+static Lisp_Object recent_keys;100,2443
+Lisp_Object this_command_keys;107,2777
+ptrdiff_t this_command_key_count;108,2808
+static bool this_command_key_count_reset;112,2922
+static Lisp_Object raw_keybuf;116,3074
+static int raw_keybuf_count;117,3105
+#define GROW_RAW_KEYBUF        119,3135
+static ptrdiff_t this_single_command_key_start;125,3350
+static ptrdiff_t before_command_key_count;129,3498
+static ptrdiff_t before_command_echo_length;130,3541
+sigjmp_buf return_to_command_loop;135,3677
+static Lisp_Object recover_top_level_message;138,3791
+static Lisp_Object regular_top_level_message;143,3930
+static sys_jmp_buf getcjmp;147,4031
+bool waiting_for_input;150,4095
+static bool echoing;154,4186
+static struct kboard 
*ok_to_echo_at_next_pause;ok_to_echo_at_next_pause159,4328
+struct kboard *echo_kboard;echo_kboard166,4632
+Lisp_Object echo_message_buffer;171,4744
+bool immediate_quit;174,4837
+int quit_char;192,5623
+EMACS_INT command_loop_level;195,5680
+Lisp_Object unread_switch_frame;204,6108
+static ptrdiff_t last_non_minibuf_size;207,6216
+uintmax_t num_input_events;210,6334
+static EMACS_INT last_auto_save;214,6428
+static ptrdiff_t last_point_position;217,6523
+Lisp_Object internal_last_event_frame;228,7028
+static Lisp_Object read_key_sequence_cmd;232,7168
+static Lisp_Object read_key_sequence_remapped;233,7210
+static FILE *dribble;dribble236,7310
+bool input_pending;239,7368
+static bool input_was_pending;287,10022
+static struct input_event kbd_buffer[kbd_buffer291,10107
+static struct input_event *kbd_fetch_ptr;kbd_fetch_ptr297,10386
+static struct input_event * volatile kbd_store_ptr;302,10601
+static void recursive_edit_unwind 313,11088
+static Lisp_Object command_loop 314,11144
+static void echo_now 316,11185
+static ptrdiff_t echo_length 317,11214
+unsigned timers_run;320,11296
+struct timespec 
*input_available_clear_time;input_available_clear_time324,11408
+bool interrupt_input;328,11573
+bool interrupts_deferred;331,11671
+static struct timespec timer_idleness_start_time;335,11746
+static struct timespec timer_last_idleness_start_time;340,11916
+#define READABLE_EVENTS_DO_TIMERS_NOW  346,12046
+#define READABLE_EVENTS_FILTER_EVENTS  347,12094
+#define READABLE_EVENTS_IGNORE_SQUEEZABLES     348,12142
+static void (*keyboard_init_hook)keyboard_init_hook351,12264
+static bool get_input_pending 353,12307
+static bool readable_events 354,12344
+static Lisp_Object read_char_x_menu_prompt 355,12379
+static Lisp_Object read_char_minibuf_menu_prompt 357,12502
+static Lisp_Object make_lispy_event 358,12571
+static Lisp_Object make_lispy_movement 359,12631
+static Lisp_Object modify_event_symbol 363,12840
+static Lisp_Object make_lispy_switch_frame 366,13050
+static Lisp_Object make_lispy_focus_in 367,13108
+static Lisp_Object make_lispy_focus_out 369,13188
+static bool help_char_p 371,13275
+static void save_getcjmp 372,13314
+static void restore_getcjmp 373,13354
+static Lisp_Object apply_modifiers 374,13397
+static void clear_event 375,13452
+static void restore_kboard_configuration 376,13500
+static void deliver_input_available_signal 378,13568
+static void handle_interrupt 380,13631
+static _Noreturn void quit_throw_to_read_char 381,13668
+static void process_special_events 382,13722
+static void timer_start_idle 383,13765
+static void timer_stop_idle 384,13802
+static void timer_resume_idle 385,13838
+static void deliver_user_signal 386,13876
+static char *find_user_signal_name find_user_signal_name387,13915
+static void store_user_signal_events 388,13957
+kset_echo_string 392,14088
+kset_kbd_queue 397,14184
+kset_keyboard_translate_table 402,14276
+kset_last_prefix_arg 407,14399
+kset_last_repeatable_command 412,14504
+kset_local_function_key_map 417,14625
+kset_overriding_terminal_local_map 422,14744
+kset_real_last_command 427,14877
+kset_system_key_syms 432,14986
+echo_add_key 443,15249
+echo_char 527,17527
+echo_dash 541,17813
+echo_now 586,19140
+cancel_echoing 635,20614
+echo_length 648,20922
+echo_truncate 660,21253
+add_command_key 672,21582
+recursive_edit_1 697,22406
+record_auto_save 742,23848
+force_auto_save_soon 751,24016
+DEFUN ("recursive-edit", Frecursive_edit,recursive-edit759,24137
+recursive_edit_unwind 804,25747
+any_kboard_state 817,26013
+single_kboard_state 838,26665
+not_single_kboard_state 848,26803
+struct kboard_stack858,27065
+static struct kboard_stack *kboard_stack;kboard_stack864,27138
+push_kboard 867,27186
+pop_kboard 879,27375
+temporarily_switch_to_single_kboard 914,28263
+record_single_kboard_state 943,29437
+restore_kboard_configuration 952,29621
+cmd_error 970,30077
+cmd_error_internal 1024,31510
+DEFUN ("command-error-default-function", 
Fcommand_error_default_function,command-error-default-function1043,32030
+static Lisp_Object command_loop_2 1086,33637
+static Lisp_Object top_level_1 1087,33686
+command_loop 1094,33916
+command_loop_2 1134,35135
+top_level_2 1146,35339
+top_level_1 1152,35417
+DEFUN ("top-level", Ftop_level,top-level1164,35787
+user_error 1183,36288
+DEFUN ("exit-recursive-edit", 
Fexit_recursive_edit,exit-recursive-edit1189,36429
+DEFUN ("abort-recursive-edit", 
Fabort_recursive_edit,abort-recursive-edit1201,36819
+tracking_off 1216,37281
+DEFUN ("internal--track-mouse", Ftrack_mouse,track-mouse1234,37816
+bool ignore_mouse_drag_p;1256,38392
+some_mouse_moved 1259,38441
+static int read_key_sequence 1282,38799
+static void adjust_point_for_property 1284,38917
+Lisp_Object last_undo_boundary;1287,39032
+command_loop_1 1294,39273
+read_menu_command 1649,50889
+adjust_point_for_property 1678,51617
+safe_run_hooks_1 1831,57339
+safe_run_hooks_error 1841,57569
+safe_run_hook_funcall 1878,58576
+safe_run_hooks 1893,59058
+int poll_suppress_count;1908,59397
+static struct atimer *poll_timer;poll_timer1915,59487
+poll_for_input_1 1919,59589
+poll_for_input 1930,59789
+start_polling 1942,60053
+input_polling_used 1979,61091
+stop_polling 1994,61390
+set_poll_suppress_count 2009,61759
+bind_polling_period 2029,62141
+make_ctrl_char 2048,62492
+show_help_echo 2113,64455
+static Lisp_Object kbd_buffer_get_event 2152,65484
+static void record_char 2154,65596
+static Lisp_Object help_form_saved_window_configs;2156,65638
+read_char_help_form_unwind 2158,65701
+#define STOP_POLLING   2166,65959
+#define RESUME_POLLING 2170,66084
+read_event_from_main_queue 2175,66229
+read_decoded_event_from_main_queue 2249,68417
+#define MAX_ENCODED_BYTES 2254,68664
+echo_keystrokes_p 2342,71556
+read_char 2376,72848
+record_menu_key 3225,98949
+help_char_p 3258,99674
+record_char 3273,99953
+save_getcjmp 3412,104235
+restore_getcjmp 3418,104326
+readable_events 3430,104697
+int stop_character EXTERNALLY_VISIBLE;3497,106437
+event_to_kboard 3500,106493
+kbd_buffer_nr_stored 3522,107142
+kbd_buffer_store_event 3534,107483
+kbd_buffer_store_event_hold 3550,108025
+kbd_buffer_unget_event 3684,111617
+#define INPUT_EVENT_POS_MAX 3698,112018
+#define INPUT_EVENT_POS_MIN 3701,112147
+position_to_Time 3706,112287
+Time_to_position 3716,112514
+gen_help_event 3738,113171
+kbd_buffer_store_help_event 3756,113611
+discard_mouse_events 3773,113976
+kbd_buffer_events_waiting 3803,114711
+clear_event 3823,115068
+kbd_buffer_get_event 3836,115408
+process_special_events 4258,127881
+swallow_events 4322,129705
+timer_start_idle 4339,130098
+timer_stop_idle 4355,130576
+timer_resume_idle 4363,130720
+struct input_event last_timer_event EXTERNALLY_VISIBLE;4372,130912
+Lisp_Object pending_funcalls;4377,131172
+decode_timer 4381,131293
+timer_check_2 4414,132246
+timer_check 4572,136817
+DEFUN ("current-idle-time", Fcurrent_idle_time,current-idle-time4607,137662
+static Lisp_Object accent_key_syms;4625,138239
+static Lisp_Object func_key_syms;4626,138275
+static Lisp_Object mouse_syms;4627,138309
+static Lisp_Object wheel_syms;4628,138340
+static Lisp_Object drag_n_drop_syms;4629,138371
+static const int lispy_accent_codes[lispy_accent_codes4634,138516
+static const char *const lispy_accent_keys[lispy_accent_keys4741,139878
+#define FUNCTION_KEY_OFFSET 4766,140314
+const char *const lispy_function_keys[lispy_function_keys4768,140347
+static const char *const 
lispy_multimedia_keys[lispy_multimedia_keys4962,148901
+static const char *const lispy_kana_keys[lispy_kana_keys5026,150135
+#define FUNCTION_KEY_OFFSET 5061,151751
+static const char *const lispy_function_keys[lispy_function_keys5065,151894
+#define ISO_FUNCTION_KEY_OFFSET 5149,154429
+static const char *const 
iso_lispy_function_keys[iso_lispy_function_keys5151,154469
+static Lisp_Object Vlispy_mouse_stem;5172,155328
+static const char *const lispy_wheel_names[lispy_wheel_names5174,155367
+static const char *const 
lispy_drag_n_drop_names[lispy_drag_n_drop_names5181,155619
+static short const scroll_bar_parts[scroll_bar_parts5189,155885
+static Lisp_Object button_down_location;5210,156910
+static int last_mouse_button;5215,157065
+static int last_mouse_x;5216,157095
+static int last_mouse_y;5217,157120
+static Time button_down_time;5218,157145
+static int double_click_count;5222,157229
+make_lispy_position 5228,157390
+toolkit_menubar_in_use 5456,163953
+make_scroll_bar_position 5469,164321
+make_lispy_event 5485,164967
+make_lispy_movement 6104,183531
+make_lispy_switch_frame 6131,184262
+make_lispy_focus_in 6137,184369
+make_lispy_focus_out 6145,184495
+parse_modifiers_uncached 6163,184945
+#define SINGLE_LETTER_MOD(6185,185465
+#undef SINGLE_LETTER_MOD6212,185906
+#define MULTI_LETTER_MOD(6214,185932
+#undef MULTI_LETTER_MOD6231,186400
+apply_modifiers_uncached 6273,187574
+static const char *const modifier_names[modifier_names6319,189193
+#define NUM_MOD_NAMES 6325,189399
+static Lisp_Object modifier_symbols;6327,189449
+lispy_modifier_list 6331,189586
+#define KEY_TO_CHAR(6353,190252
+parse_modifiers 6356,190328
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191517
+apply_modifiers 6422,192391
+reorder_modifiers 6491,194720
+modify_event_symbol 6536,196528
+DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199244
+parse_solitary_modifier 6695,201135
+#define SINGLE_LETTER_MOD(6701,201258
+#define MULTI_LETTER_MOD(6705,201343
+#undef SINGLE_LETTER_MOD6763,202641
+#undef MULTI_LETTER_MOD6764,202666
+lucid_event_type_list_p 6775,202889
+get_input_pending 6814,203960
+record_asynch_buffer_change 6834,204579
+gobble_input 6872,205702
+tty_read_avail_input 6967,208310
+handle_async_input 7149,214039
+process_pending_signals 7165,214359
+unblock_input_to 7177,214645
+unblock_input 7200,215277
+totally_unblock_input 7209,215445
+handle_input_available_signal 7217,215529
+deliver_input_available_signal 7226,215700
+struct user_signal_info7235,215865
+static struct user_signal_info *user_signals user_signals7250,216090
+add_user_signal 7253,216149
+handle_user_signal 7275,216598
+deliver_user_signal 7316,217558
+find_user_signal_name 7322,217659
+store_user_signal_events 7334,217841
+static void menu_bar_item 7362,218341
+static Lisp_Object menu_bar_one_keymap_changed_items;7363,218416
+static Lisp_Object menu_bar_items_vector;7368,218630
+static int menu_bar_items_index;7369,218672
+static const char *separator_names[separator_names7372,218707
+menu_separator_name_p 7393,219148
+menu_bar_items 7426,219852
+Lisp_Object item_properties;7568,224603
+menu_bar_item 7571,224645
+menu_item_eval_property_1 7647,227175
+eval_dyn 7658,227465
+menu_item_eval_property 7666,227675
+parse_menu_item 7686,228341
+static Lisp_Object tool_bar_items_vector;7965,236336
+static Lisp_Object tool_bar_item_properties;7970,236510
+static int ntool_bar_items;7974,236606
+static void init_tool_bar_items 7978,236664
+static void process_tool_bar_item 7979,236711
+static bool parse_tool_bar_item 7981,236801
+static void append_tool_bar_item 7982,236861
+tool_bar_items 7990,237083
+process_tool_bar_item 8075,239892
+#define PROP(8112,240969
+set_prop 8114,241038
+parse_tool_bar_item 8167,242453
+#undef PROP8379,248844
+init_tool_bar_items 8387,248969
+append_tool_bar_item 8401,249261
+read_char_x_menu_prompt 8443,250771
+read_char_minibuf_menu_prompt 8503,252445
+#define PUSH_C_STR(8527,253014
+follow_key 8726,258553
+active_maps 8733,258695
+typedef struct keyremap8742,259021
+} keyremap;8754,259464
+access_keymap_keyremap 8764,259808
+keyremap_step 8811,261450
+test_undefined 8867,262934
+read_key_sequence 8916,264861
+read_key_sequence_vs 9826,295821
+DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297294
+DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299982
+detect_input_pending 9950,300488
+detect_input_pending_ignore_squeezables 9959,300654
+detect_input_pending_run_timers 9967,300870
+clear_input_pending 9985,301362
+requeued_events_pending_p 9997,301732
+DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301813
+DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302596
+DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303517
+DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303958
+DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304380
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304955
+DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305495
+DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306510
+DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307069
+DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307406
+DEFUN ("discard-input", Fdiscard_input,discard-input10203,308447
+DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308949
+stuff_buffered_input 10285,311045
+set_waiting_for_input 10323,312016
+clear_waiting_for_input 10337,312390
+handle_interrupt_signal 10351,312754
+deliver_interrupt_signal 10378,313642
+static int volatile force_quit_count;10387,313932
+handle_interrupt 10401,314414
+quit_throw_to_read_char 10541,318711
+DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319288
+DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320516
+DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321432
+DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322706
+DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323570
+DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324459
+DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325837
+DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327060
+init_kboard 10861,328214
+allocate_kboard 10893,329284
+wipe_kboard 10909,329637
+delete_kboard 10917,329751
+init_keyboard 10942,330281
+struct event_head11021,332696
+static const struct event_head head_table[head_table11027,332747
+syms_of_keyboard 11045,333577
+keys_of_keyboard 11841,367115
+mark_kboards 11916,370434
+
+c-src/emacs/src/lisp.h,33973
+#define EMACS_LISP_H22,800
+#define DECLARE_GDB_SYM(47,1421
+# define DEFINE_GDB_SYMBOL_BEGIN(49,1508
+# define DEFINE_GDB_SYMBOL_END(50,1578
+# define DEFINE_GDB_SYMBOL_BEGIN(52,1625
+# define DEFINE_GDB_SYMBOL_END(53,1702
+#undef min57,1790
+#undef max58,1801
+#define max(59,1812
+#define min(60,1854
+#define ARRAYELTS(63,1936
+#define GCTYPEBITS 67,2079
+DEFINE_GDB_SYMBOL_BEGIN GCTYPEBITS66,2037
+# define NONPOINTER_BITS 78,2567
+# define NONPOINTER_BITS 80,2600
+typedef int EMACS_INT;91,3023
+typedef unsigned int EMACS_UINT;92,3046
+#  define EMACS_INT_MAX 93,3079
+#  define pI 94,3111
+typedef long int EMACS_INT;96,3203
+typedef unsigned long EMACS_UINT;97,3231
+#  define EMACS_INT_MAX 98,3265
+#  define pI 99,3298
+typedef long long int EMACS_INT;103,3477
+typedef unsigned long long int EMACS_UINT;104,3510
+#  define EMACS_INT_MAX 105,3553
+#  define pI 106,3587
+enum {  BOOL_VECTOR_BITS_PER_CHAR 114,3804
+#define BOOL_VECTOR_BITS_PER_CHAR 115,3840
+typedef size_t bits_word;123,4165
+# define BITS_WORD_MAX 124,4191
+enum { BITS_PER_BITS_WORD 125,4223
+typedef unsigned char bits_word;127,4290
+# define BITS_WORD_MAX 128,4323
+enum { BITS_PER_BITS_WORD 129,4386
+verify 131,4450
+    BITS_PER_CHAR 136,4570
+    BITS_PER_SHORT 137,4605
+    BITS_PER_LONG 138,4657
+    BITS_PER_EMACS_INT 139,4712
+typedef intmax_t printmax_t;148,5089
+typedef uintmax_t uprintmax_t;149,5118
+# define pMd 150,5149
+# define pMu 151,5170
+typedef EMACS_INT printmax_t;153,5197
+typedef EMACS_UINT uprintmax_t;154,5227
+# define pMd 155,5259
+# define pMu 156,5278
+# define pD 165,5664
+# define pD 167,5709
+# define pD 169,5756
+# define pD 171,5779
+# define eassert(200,7062
+# define eassume(201,7140
+extern _Noreturn void die 204,7206
+extern bool suppress_checking EXTERNALLY_VISIBLE;206,7268
+# define eassert(208,7319
+# define eassume(212,7450
+enum Lisp_Bits239,8519
+#define GCALIGNMENT 243,8647
+    VALBITS 246,8742
+    INTTYPEBITS 249,8838
+    FIXNUM_BITS 252,8945
+#define VAL_MAX 263,9327
+#define USE_LSB_TAG 271,9777
+DEFINE_GDB_SYMBOL_BEGIN USE_LSB_TAG270,9733
+# define alignas(281,10077
+# define GCALIGNED 288,10227
+# define GCALIGNED 290,10292
+# define lisp_h_XLI(327,11642
+# define lisp_h_XIL(328,11673
+# define lisp_h_XLI(330,11724
+# define lisp_h_XIL(331,11751
+#define lisp_h_CHECK_LIST_CONS(333,11785
+#define lisp_h_CHECK_NUMBER(334,11856
+#define lisp_h_CHECK_SYMBOL(335,11927
+#define lisp_h_CHECK_TYPE(336,11996
+#define lisp_h_CONSP(338,12107
+#define lisp_h_EQ(339,12156
+#define lisp_h_FLOATP(340,12201
+#define lisp_h_INTEGERP(341,12252
+#define lisp_h_MARKERP(342,12333
+#define lisp_h_MISCP(343,12408
+#define lisp_h_NILP(344,12457
+#define lisp_h_SET_SYMBOL_VAL(345,12493
+#define lisp_h_SYMBOL_CONSTANT_P(347,12607
+#define lisp_h_SYMBOL_VAL(348,12671
+#define lisp_h_SYMBOLP(350,12772
+#define lisp_h_VECTORLIKEP(351,12825
+#define lisp_h_XCAR(352,12886
+#define lisp_h_XCDR(353,12924
+#define lisp_h_XCONS(354,12964
+#define lisp_h_XHASH(356,13059
+#define lisp_h_XPNTR(357,13093
+# define lisp_h_check_cons_list(360,13221
+# define lisp_h_make_number(363,13289
+# define lisp_h_XFASTINT(365,13392
+# define lisp_h_XINT(366,13429
+# define lisp_h_XSYMBOL(367,13478
+# define lisp_h_XTYPE(371,13631
+# define lisp_h_XUNTAG(372,13696
+# define XLI(381,14086
+# define XIL(382,14117
+# define CHECK_LIST_CONS(383,14148
+# define CHECK_NUMBER(384,14209
+# define CHECK_SYMBOL(385,14258
+# define CHECK_TYPE(386,14307
+# define CONSP(387,14382
+# define EQ(388,14417
+# define FLOATP(389,14452
+# define INTEGERP(390,14489
+# define MARKERP(391,14530
+# define MISCP(392,14569
+# define NILP(393,14604
+# define SET_SYMBOL_VAL(394,14637
+# define SYMBOL_CONSTANT_P(395,14700
+# define SYMBOL_VAL(396,14763
+# define SYMBOLP(397,14812
+# define VECTORLIKEP(398,14851
+# define XCAR(399,14898
+# define XCDR(400,14931
+# define XCONS(401,14964
+# define XHASH(402,14999
+# define XPNTR(403,15034
+#  define check_cons_list(405,15097
+#  define make_number(408,15176
+#  define XFASTINT(409,15224
+#  define XINT(410,15266
+#  define XSYMBOL(411,15300
+#  define XTYPE(412,15340
+#  define XUNTAG(413,15376
+#define LISP_MACRO_DEFUN(421,15672
+#define LISP_MACRO_DEFUN_VOID(425,15845
+#define INTMASK 437,16289
+#define case_Lisp_Int 438,16342
+#define ENUM_BF(445,16681
+#define ENUM_BF(447,16722
+enum Lisp_Type451,16763
+    Lisp_Symbol 454,16851
+    Lisp_Misc 458,16993
+    Lisp_Int0 461,17067
+    Lisp_Int1 462,17086
+    Lisp_String 466,17264
+    Lisp_Vectorlike 472,17543
+    Lisp_Cons 475,17632
+    Lisp_Float 477,17670
+enum Lisp_Misc_Type485,18016
+    Lisp_Misc_Free 487,18040
+    Lisp_Misc_Marker,488,18069
+    Lisp_Misc_Overlay,489,18091
+    Lisp_Misc_Save_Value,490,18114
+    Lisp_Misc_Finalizer,491,18140
+    Lisp_Misc_Float,494,18275
+    Lisp_Misc_Limit496,18359
+enum Lisp_Fwd_Type502,18543
+    Lisp_Fwd_Int,504,18566
+    Lisp_Fwd_Bool,505,18619
+    Lisp_Fwd_Obj,506,18670
+    Lisp_Fwd_Buffer_Obj,507,18729
+    Lisp_Fwd_Kboard_Obj        508,18800
+typedef struct { EMACS_INT i; } Lisp_Object;567,21781
+#define LISP_INITIALLY(569,21827
+#undef CHECK_LISP_OBJECT_TYPE571,21858
+enum CHECK_LISP_OBJECT_TYPE 572,21888
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE 572,21888
+typedef EMACS_INT Lisp_Object;577,22064
+#define LISP_INITIALLY(578,22095
+enum CHECK_LISP_OBJECT_TYPE 579,22125
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE 579,22125
+#define LISP_INITIALLY_ZERO 582,22226
+INLINE bool BOOL_VECTOR_P 588,22350
+INLINE bool BUFFER_OBJFWDP 589,22391
+INLINE bool BUFFERP 590,22438
+INLINE bool CHAR_TABLE_P 591,22473
+INLINE Lisp_Object CHAR_TABLE_REF_ASCII 592,22513
+INLINE bool 593,22579
+INLINE bool 594,22614
+INLINE bool functionp 595,22650
+INLINE bool 596,22687
+INLINE bool 597,22725
+INLINE bool 598,22762
+INLINE bool 599,22797
+INLINE bool OVERLAYP 600,22831
+INLINE bool PROCESSP 601,22867
+INLINE bool PSEUDOVECTORP 602,22903
+INLINE bool SAVE_VALUEP 603,22949
+INLINE bool FINALIZERP 604,22988
+INLINE void set_sub_char_table_contents 605,23026
+INLINE bool STRINGP 607,23116
+INLINE bool SUB_CHAR_TABLE_P 608,23151
+INLINE bool SUBRP 609,23195
+INLINE bool 610,23228
+INLINE bool 611,23265
+INLINE bool WINDOWP 612,23306
+INLINE bool TERMINALP 613,23341
+INLINE struct Lisp_Save_Value *XSAVE_VALUE XSAVE_VALUE614,23378
+INLINE struct Lisp_Finalizer *XFINALIZER XFINALIZER615,23436
+INLINE struct Lisp_Symbol *(XSYMBOL)616,23492
+INLINE void 617,23544
+extern Lisp_Object char_table_ref 620,23616
+extern void char_table_set 621,23670
+extern _Noreturn Lisp_Object wrong_type_argument 624,23757
+extern _Noreturn void wrong_choice 625,23834
+extern bool might_dump;628,23925
+extern bool initialized;631,24061
+extern double extract_float 634,24117
+enum symbol_interned639,24199
+  SYMBOL_UNINTERNED 641,24222
+  SYMBOL_INTERNED 642,24247
+  SYMBOL_INTERNED_IN_INITIAL_OBARRAY 643,24270
+enum symbol_redirect646,24315
+  SYMBOL_PLAINVAL 648,24338
+  SYMBOL_VARALIAS 649,24362
+  SYMBOL_LOCALIZED 650,24386
+  SYMBOL_FORWARDED 651,24410
+struct Lisp_Symbol654,24437
+  ENUM_BF 663,24793
+#define EXFUN(707,26252
+#define DEFUN_ARGS_MANY        712,26446
+#define DEFUN_ARGS_UNEVALLED   713,26498
+#define DEFUN_ARGS_0   714,26541
+#define DEFUN_ARGS_1   715,26569
+#define DEFUN_ARGS_2   716,26604
+#define DEFUN_ARGS_3   717,26652
+#define DEFUN_ARGS_4   718,26713
+#define DEFUN_ARGS_5   719,26787
+#define DEFUN_ARGS_6   721,26880
+#define DEFUN_ARGS_7   723,26986
+#define DEFUN_ARGS_8   725,27105
+#define TAG_PTR(729,27296
+#define TAG_SYMOFFSET(734,27543
+#define XLI_BUILTIN_LISPSYM(741,27842
+#define DEFINE_LISP_SYMBOL(746,28101
+# define DEFINE_NON_NIL_Q_SYMBOL_MACROS 755,28572
+LISP_MACRO_DEFUN 762,28777
+# define ARRAY_MARK_FLAG 768,29024
+# define PSEUDOVECTOR_FLAG 774,29267
+enum pvec_type780,29568
+  PVEC_NORMAL_VECTOR,782,29585
+  PVEC_FREE,783,29607
+  PVEC_PROCESS,784,29620
+  PVEC_FRAME,785,29636
+  PVEC_WINDOW,786,29650
+  PVEC_BOOL_VECTOR,787,29665
+  PVEC_BUFFER,788,29685
+  PVEC_HASH_TABLE,789,29700
+  PVEC_TERMINAL,790,29719
+  PVEC_WINDOW_CONFIGURATION,791,29736
+  PVEC_SUBR,792,29765
+  PVEC_OTHER,793,29778
+  PVEC_COMPILED,795,29856
+  PVEC_CHAR_TABLE,796,29873
+  PVEC_SUB_CHAR_TABLE,797,29892
+  PVEC_FONT 798,29915
+enum More_Lisp_Bits801,29991
+    PSEUDOVECTOR_SIZE_BITS 808,30382
+    PSEUDOVECTOR_SIZE_MASK 809,30415
+    PSEUDOVECTOR_REST_BITS 813,30625
+    PSEUDOVECTOR_REST_MASK 814,30658
+    PSEUDOVECTOR_AREA_BITS 818,30823
+    PVEC_TYPE_MASK 819,30901
+# define VALMASK 829,31302
+DEFINE_GDB_SYMBOL_BEGIN VALMASK828,31257
+#define MOST_POSITIVE_FIXNUM 834,31532
+#define MOST_NEGATIVE_FIXNUM 835,31592
+XINT 874,32684
+XFASTINT 889,33035
+XSYMBOL 899,33263
+XTYPE 910,33481
+XUNTAG 918,33661
+LISP_MACRO_DEFUN 927,33857
+LISP_MACRO_DEFUN 940,34242
+#define FIXNUM_OVERFLOW_P(958,34855
+LISP_MACRO_DEFUN FIXNUM_OVERFLOW_P952,34632
+LISP_MACRO_DEFUN 970,35171
+XSTRING 980,35391
+#define SYMBOL_INDEX(988,35575
+XFLOAT 991,35636
+XPROCESS 1000,35778
+XWINDOW 1007,35895
+XTERMINAL 1014,36012
+XSUBR 1021,36134
+XBUFFER 1028,36245
+XCHAR_TABLE 1035,36369
+XSUB_CHAR_TABLE 1042,36506
+XBOOL_VECTOR 1049,36648
+make_lisp_ptr 1058,36827
+make_lisp_symbol 1066,37013
+builtin_lisp_symbol 1074,37197
+#define XSETINT(1079,37279
+#define XSETFASTINT(1080,37325
+#define XSETCONS(1081,37375
+#define XSETVECTOR(1082,37435
+#define XSETSTRING(1083,37503
+#define XSETSYMBOL(1084,37567
+#define XSETFLOAT(1085,37621
+#define XSETMISC(1086,37683
+#define XSETPVECTYPE(1090,37772
+#define XSETPVECTYPESIZE(1092,37888
+#define XSETPSEUDOVECTOR(1099,38185
+#define XSETTYPED_PSEUDOVECTOR(1105,38369
+#define XSETWINDOW_CONFIGURATION(1110,38579
+#define XSETPROCESS(1112,38675
+#define XSETWINDOW(1113,38741
+#define XSETTERMINAL(1114,38805
+#define XSETSUBR(1115,38873
+#define XSETCOMPILED(1116,38933
+#define XSETBUFFER(1117,39001
+#define XSETCHAR_TABLE(1118,39065
+#define XSETBOOL_VECTOR(1119,39137
+#define XSETSUB_CHAR_TABLE(1120,39211
+XINTPTR 1128,39581
+make_pointer_integer 1134,39661
+LISP_MACRO_DEFUN_VOID 1143,39826
+typedef struct interval *INTERVAL;INTERVAL1149,39987
+xcar_addr 1174,40760
+xcdr_addr 1179,40837
+LISP_MACRO_DEFUN 1185,40931
+XSETCDR 1198,41307
+CAR 1205,41457
+CDR 1212,41591
+CAR_SAFE 1221,41791
+CDR_SAFE 1226,41877
+STRING_MULTIBYTE 1243,42250
+#define STRING_BYTES_BOUND 1261,43057
+#define STRING_SET_UNIBYTE(1265,43201
+#define STRING_SET_MULTIBYTE(1275,43516
+SDATA 1286,43830
+SSDATA 1291,43908
+SREF 1297,44037
+SSET 1302,44128
+SCHARS 1307,44242
+extern ptrdiff_t string_bytes 1313,44337
+STRING_BYTES 1316,44415
+SBYTES 1326,44595
+STRING_SET_CHARS 1331,44681
+struct vectorlike_header1343,45232
+struct Lisp_Vector1369,46482
+    ALIGNOF_STRUCT_LISP_VECTOR1378,46681
+struct Lisp_Bool_Vector1384,46864
+bool_vector_size 1399,47385
+bool_vector_data 1407,47523
+bool_vector_uchar_data 1413,47617
+bool_vector_words 1421,47803
+bool_vector_bytes 1428,47998
+bool_vector_bitref 1437,48238
+bool_vector_ref 1445,48478
+bool_vector_set 1453,48618
+    header_size 1471,49047
+    bool_header_size 1472,49106
+    word_size 1473,49171
+AREF 1479,49284
+aref_addr 1485,49391
+ASIZE 1491,49501
+ASET 1497,49583
+gc_aset 1504,49742
+enum { NIL_IS_ZERO 1515,50269
+memclear 1520,50464
+#define VECSIZE(1531,50762
+#define PSEUDOVECSIZE(1538,51047
+#define UNSIGNED_CMP(1546,51480
+#define ASCII_CHAR_P(1552,51734
+enum CHARTAB_SIZE_BITS1565,52489
+    CHARTAB_SIZE_BITS_0 1567,52516
+    CHARTAB_SIZE_BITS_1 1568,52545
+    CHARTAB_SIZE_BITS_2 1569,52574
+    CHARTAB_SIZE_BITS_3 1570,52603
+extern const int chartab_size[chartab_size1573,52637
+struct Lisp_Char_Table1575,52672
+struct Lisp_Sub_Char_Table1606,53752
+CHAR_TABLE_REF_ASCII 1628,54566
+CHAR_TABLE_REF 1648,55113
+CHAR_TABLE_SET 1658,55402
+struct Lisp_Subr1670,55786
+enum char_table_specials1692,56798
+    CHAR_TABLE_STANDARD_SLOTS 1697,56993
+    SUB_CHAR_TABLE_OFFSET 1701,57214
+CHAR_TABLE_EXTRA_SLOTS 1707,57377
+verify 1714,57596
+LISP_MACRO_DEFUN 1723,57921
+SYMBOL_BLV 1732,58181
+SYMBOL_FWD 1738,58316
+LISP_MACRO_DEFUN_VOID 1744,58428
+SET_SYMBOL_BLV 1754,58691
+SET_SYMBOL_FWD 1760,58850
+SYMBOL_NAME 1767,59001
+SYMBOL_INTERNED_P 1775,59130
+SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P 1783,59299
+#define DEFSYM(1796,59809
+LISP_MACRO_DEFUN DEFSYM1792,59630
+struct hash_table_test1805,60062
+struct Lisp_Hash_Table1823,60555
+XHASH_TABLE 1880,62531
+#define XSET_HASH_TABLE(1885,62602
+HASH_TABLE_P 1889,62703
+HASH_KEY 1896,62860
+HASH_VALUE 1903,63040
+HASH_NEXT 1911,63254
+HASH_HASH 1918,63431
+HASH_INDEX 1926,63677
+HASH_TABLE_SIZE 1933,63826
+enum DEFAULT_HASH_SIZE 1940,63956
+enum DEFAULT_HASH_SIZE { DEFAULT_HASH_SIZE 1940,63956
+static double const DEFAULT_REHASH_THRESHOLD 1946,64176
+static double const DEFAULT_REHASH_SIZE 1950,64299
+sxhash_combine 1956,64465
+SXHASH_REDUCE 1964,64648
+struct Lisp_Misc_Any   1971,64806
+  ENUM_BF 1973,64866
+struct Lisp_Marker1978,64980
+  ENUM_BF 1980,65001
+struct Lisp_Overlay2021,66838
+    ENUM_BF 2034,67346
+    SAVE_UNUSED,2047,67641
+    SAVE_INTEGER,2048,67658
+    SAVE_FUNCPOINTER,2049,67676
+    SAVE_POINTER,2050,67698
+    SAVE_OBJECT2051,67716
+enum { SAVE_SLOT_BITS 2055,67801
+enum { SAVE_VALUE_SLOTS 2058,67898
+enum { SAVE_TYPE_BITS 2062,68006
+enum Lisp_Save_Type2064,68072
+    SAVE_TYPE_INT_INT 2066,68096
+    SAVE_TYPE_INT_INT_INT2067,68169
+    SAVE_TYPE_OBJ_OBJ 2069,68259
+    SAVE_TYPE_OBJ_OBJ_OBJ 2070,68330
+    SAVE_TYPE_OBJ_OBJ_OBJ_OBJ2071,68411
+    SAVE_TYPE_PTR_INT 2073,68506
+    SAVE_TYPE_PTR_OBJ 2074,68579
+    SAVE_TYPE_PTR_PTR 2075,68651
+    SAVE_TYPE_FUNCPTR_PTR_OBJ2076,68724
+    SAVE_TYPE_MEMORY 2080,68882
+typedef void (*voidfuncptr)voidfuncptr2108,69836
+struct Lisp_Save_Value2110,69873
+    ENUM_BF 2112,69900
+save_type 2134,70752
+XSAVE_POINTER 2143,70982
+set_save_pointer 2149,71144
+XSAVE_FUNCPOINTER 2155,71326
+XSAVE_INTEGER 2164,71546
+set_save_integer 2170,71708
+XSAVE_OBJECT 2179,71929
+struct Lisp_Finalizer2186,72106
+struct Lisp_Free2201,72581
+    ENUM_BF 2203,72602
+union Lisp_Misc2212,72882
+XMISC 2223,73181
+XMISCANY 2229,73270
+XMISCTYPE 2236,73379
+XMARKER 2242,73467
+XOVERLAY 2249,73582
+XSAVE_VALUE 2256,73703
+XFINALIZER 2263,73832
+struct Lisp_Intfwd2274,74117
+struct Lisp_Boolfwd2284,74411
+struct Lisp_Objfwd2294,74702
+struct Lisp_Buffer_Objfwd2302,74934
+struct Lisp_Buffer_Local_Value2334,76470
+struct Lisp_Kboard_Objfwd2362,77729
+union Lisp_Fwd2368,77838
+XFWDTYPE 2378,78084
+XBUFFER_OBJFWD 2384,78180
+struct Lisp_Float2391,78316
+XFLOAT_DATA 2401,78434
+    IEEE_FLOATING_POINT2415,78943
+#define _UCHAR_T2423,79266
+typedef unsigned char UCHAR;2424,79283
+enum Lisp_Compiled2429,79366
+    COMPILED_ARGLIST 2431,79389
+    COMPILED_BYTECODE 2432,79415
+    COMPILED_CONSTANTS 2433,79442
+    COMPILED_STACK_DEPTH 2434,79470
+    COMPILED_DOC_STRING 2435,79500
+    COMPILED_INTERACTIVE 2436,79529
+enum char_bits2443,79831
+    CHAR_ALT 2445,79850
+    CHAR_SUPER 2446,79876
+    CHAR_HYPER 2447,79904
+    CHAR_SHIFT 2448,79932
+    CHAR_CTL 2449,79960
+    CHAR_META 2450,79986
+    CHAR_MODIFIER_MASK 2452,80014
+    CHARACTERBITS 2457,80209
+LISP_MACRO_DEFUN 2462,80267
+NATNUMP 2470,80409
+RANGED_INTEGERP 2476,80490
+#define TYPE_RANGED_INTEGERP(2481,80612
+LISP_MACRO_DEFUN 2486,80797
+VECTORP 2500,81270
+OVERLAYP 2505,81373
+SAVE_VALUEP 2510,81472
+FINALIZERP 2516,81578
+AUTOLOADP 2522,81682
+BUFFER_OBJFWDP 2528,81773
+PSEUDOVECTOR_TYPEP 2534,81871
+PSEUDOVECTORP 2542,82124
+WINDOW_CONFIGURATIONP 2558,82476
+PROCESSP 2564,82586
+WINDOWP 2570,82670
+TERMINALP 2576,82752
+SUBRP 2582,82838
+COMPILEDP 2588,82916
+BUFFERP 2594,83002
+CHAR_TABLE_P 2600,83084
+SUB_CHAR_TABLE_P 2606,83175
+BOOL_VECTOR_P 2612,83274
+FRAMEP 2618,83367
+IMAGEP 2625,83484
+ARRAYP 2632,83589
+CHECK_LIST 2638,83708
+LISP_MACRO_DEFUN_VOID 2643,83789
+CHECK_STRING_CAR 2653,84086
+CHECK_CONS 2658,84190
+CHECK_VECTOR 2663,84270
+CHECK_BOOL_VECTOR 2668,84356
+CHECK_VECTOR_OR_STRING 2674,84533
+CHECK_ARRAY 2683,84707
+CHECK_BUFFER 2688,84815
+CHECK_WINDOW 2693,84901
+CHECK_PROCESS 2699,85007
+CHECK_NATNUM 2705,85103
+#define CHECK_RANGED_INTEGER(2710,85180
+#define CHECK_TYPE_RANGED_INTEGER(2721,85563
+#define CHECK_NUMBER_COERCE_MARKER(2729,85833
+XFLOATINT 2738,86086
+CHECK_NUMBER_OR_FLOAT 2744,86157
+#define CHECK_NUMBER_OR_FLOAT_COERCE_MARKER(2749,86256
+CHECK_NUMBER_CAR 2760,86666
+CHECK_NUMBER_CDR 2768,86788
+#define DEFUN(2803,88383
+#define DEFUN(2812,88851
+FUNCTIONP 2822,89206
+extern void defsubr 2829,89358
+enum maxargs2831,89401
+    MANY 2833,89418
+    UNEVALLED 2834,89433
+#define CALLMANY(2838,89536
+#define CALLN(2844,89889
+extern void defvar_lisp 2846,89959
+extern void defvar_lisp_nopro 2847,90036
+extern void defvar_bool 2848,90119
+extern void defvar_int 2849,90190
+extern void defvar_kboard 2850,90264
+#define DEFVAR_LISP(2869,91094
+#define DEFVAR_LISP_NOPRO(2874,91266
+#define DEFVAR_BOOL(2879,91448
+#define DEFVAR_INT(2884,91621
+#define DEFVAR_BUFFER_DEFAULTS(2890,91792
+#define DEFVAR_KBOARD(2896,91996
+typedef jmp_buf sys_jmp_buf;2906,92320
+# define sys_setjmp(2907,92349
+# define sys_longjmp(2908,92384
+typedef sigjmp_buf sys_jmp_buf;2910,92456
+# define sys_setjmp(2911,92488
+# define sys_longjmp(2912,92528
+typedef jmp_buf sys_jmp_buf;2916,92687
+# define sys_setjmp(2917,92716
+# define sys_longjmp(2918,92750
+enum specbind_tag 2943,93802
+  SPECPDL_UNWIND,2944,93822
+  SPECPDL_UNWIND_PTR,2945,93891
+  SPECPDL_UNWIND_INT,2946,93942
+  SPECPDL_UNWIND_VOID,2947,93990
+  SPECPDL_BACKTRACE,2948,94044
+  SPECPDL_LET,2949,94102
+  SPECPDL_LET_LOCAL,2951,94232
+  SPECPDL_LET_DEFAULT  2952,94289
+union specbinding2955,94361
+    ENUM_BF 2957,94383
+      ENUM_BF 2959,94440
+      ENUM_BF 2964,94570
+      ENUM_BF 2969,94693
+      ENUM_BF 2974,94811
+      ENUM_BF 2978,94916
+      ENUM_BF 2983,95091
+enum handlertype 3021,96407
+enum handlertype { CATCHER,3021,96407
+enum handlertype { CATCHER, CONDITION_CASE 3021,96407
+struct handler3023,96454
+#define PUSH_HANDLER(3053,97443
+extern Lisp_Object memory_signal_data;3075,98149
+extern char *stack_bottom;stack_bottom3079,98282
+extern void process_pending_signals 3097,99099
+extern bool volatile pending_signals;3098,99143
+extern void process_quit_flag 3100,99182
+#define QUIT   3101,99220
+#define QUITP 3112,99470
+extern Lisp_Object Vascii_downcase_table;3114,99531
+extern Lisp_Object Vascii_canon_table;3115,99573
+extern struct gcpro *gcprolist;gcprolist3130,100280
+struct gcpro3132,100313
+#define GC_USE_GCPROS_AS_BEFORE        3171,101294
+#define GC_MAKE_GCPROS_NOOPS   3172,101329
+#define GC_MARK_STACK_CHECK_GCPROS     3173,101361
+#define GC_USE_GCPROS_CHECK_ZOMBIES    3174,101398
+#define GC_MARK_STACK 3177,101459
+#define BYTE_MARK_STACK 3181,101559
+#define GCPRO1(3190,101830
+#define GCPRO2(3191,101870
+#define GCPRO3(3192,101936
+#define GCPRO4(3194,102031
+#define GCPRO5(3196,102151
+#define GCPRO6(3198,102296
+#define GCPRO7(3201,102471
+#define UNGCPRO 3202,102550
+#define GCPRO1(3208,102650
+#define GCPRO2(3212,102772
+#define GCPRO3(3217,102964
+#define GCPRO4(3223,103226
+#define GCPRO5(3230,103557
+#define GCPRO6(3238,103958
+#define GCPRO7(3247,104428
+#define UNGCPRO 3257,104968
+extern int gcpro_level;3261,105037
+#define GCPRO1(3263,105062
+#define GCPRO2(3269,105296
+#define GCPRO3(3278,105714
+#define GCPRO4(3289,106271
+#define GCPRO5(3302,106969
+#define GCPRO6(3317,107809
+#define GCPRO7(3334,108790
+#define UNGCPRO        3353,109913
+#define RETURN_UNGCPRO(3363,110180
+void staticpro 3375,110453
+vcopy 3384,110654
+set_hash_key_slot 3393,110929
+set_hash_value_slot 3399,111068
+set_symbol_function 3408,111303
+set_symbol_plist 3414,111418
+set_symbol_next 3420,111521
+blv_found 3428,111694
+set_overlay_plist 3437,111877
+string_intervals 3445,112028
+set_string_intervals 3453,112150
+set_char_table_defalt 3462,112352
+set_char_table_purpose 3467,112464
+set_char_table_extras 3475,112633
+set_char_table_contents 3482,112842
+set_sub_char_table_contents 3489,113037
+extern Lisp_Object indirect_function 3495,113196
+extern Lisp_Object find_symbol_value 3496,113248
+enum Arith_Comparison 3497,113300
+  ARITH_EQUAL,3498,113324
+  ARITH_NOTEQUAL,3499,113339
+  ARITH_LESS,3500,113357
+  ARITH_GRTR,3501,113371
+  ARITH_LESS_OR_EQUAL,3502,113385
+  ARITH_GRTR_OR_EQUAL3503,113408
+extern Lisp_Object arithcompare 3505,113433
+#define INTEGER_TO_CONS(3511,113759
+#define CONS_TO_INTEGER(3529,114622
+extern intmax_t cons_to_signed 3533,114837
+extern uintmax_t cons_to_unsigned 3534,114903
+extern struct Lisp_Symbol *indirect_variable indirect_variable3536,114964
+extern _Noreturn void args_out_of_range 3537,115033
+extern _Noreturn void args_out_of_range_3 3538,115101
+extern Lisp_Object do_symval_forwarding 3540,115192
+extern void set_internal 3541,115252
+extern void syms_of_data 3542,115324
+extern void swap_in_global_binding 3543,115357
+extern void syms_of_cmds 3546,115441
+extern void keys_of_cmds 3547,115474
+extern Lisp_Object detect_coding_system 3550,115536
+extern void init_coding 3552,115689
+extern void init_coding_once 3553,115721
+extern void syms_of_coding 3554,115758
+extern ptrdiff_t chars_in_text 3557,115825
+extern ptrdiff_t multibyte_chars_in_text 3558,115892
+extern void syms_of_character 3559,115969
+extern void init_charset 3562,116037
+extern void init_charset_once 3563,116070
+extern void syms_of_charset 3564,116108
+extern void init_syntax_once 3569,116228
+extern void syms_of_syntax 3570,116265
+enum { NEXT_ALMOST_PRIME_LIMIT 3573,116326
+extern EMACS_INT next_almost_prime 3574,116365
+enum constype 3739,123817
+enum constype {CONSTYPE_HEAP,CONSTYPE_HEAP3739,123817
+enum constype {CONSTYPE_HEAP, CONSTYPE_PURE}CONSTYPE_PURE3739,123817
+extern Lisp_Object listn 3740,123863
+list2i 3745,124007
+list3i 3751,124116
+list4i 3757,124255
+extern Lisp_Object make_uninit_bool_vector 3763,124407
+extern Lisp_Object bool_vector_fill 3764,124463
+extern _Noreturn void string_overflow 3765,124527
+extern Lisp_Object make_string 3766,124573
+extern Lisp_Object make_formatted_string 3767,124631
+extern Lisp_Object make_multibyte_string 3779,124985
+extern Lisp_Object make_event_array 3780,125064
+extern Lisp_Object make_uninit_string 3781,125128
+extern Lisp_Object make_uninit_multibyte_string 3782,125179
+extern Lisp_Object make_string_from_bytes 3783,125251
+extern Lisp_Object make_specified_string 3784,125331
+extern Lisp_Object make_pure_string 3786,125423
+extern Lisp_Object make_pure_c_string 3787,125503
+build_pure_c_string 3792,125659
+build_string 3801,125864
+extern Lisp_Object pure_cons 3806,125942
+extern void make_byte_code 3807,125999
+extern struct Lisp_Vector *allocate_vector allocate_vector3808,126050
+make_uninit_vector 3820,126435
+make_uninit_sub_char_table 3833,126654
+extern struct Lisp_Vector *allocate_pseudovector 
allocate_pseudovector3844,126963
+#define ALLOCATE_PSEUDOVECTOR(3850,127198
+#define ALLOCATE_ZEROED_PSEUDOVECTOR(3858,127534
+extern bool gc_in_progress;3863,127735
+extern bool abort_on_gc;3864,127763
+extern Lisp_Object make_float 3865,127788
+extern void display_malloc_warning 3866,127828
+extern ptrdiff_t inhibit_garbage_collection 3867,127871
+extern Lisp_Object make_save_int_int_int 3868,127923
+extern Lisp_Object make_save_obj_obj_obj_obj 3869,127999
+extern Lisp_Object make_save_ptr 3871,128109
+extern Lisp_Object make_save_ptr_int 3872,128152
+extern Lisp_Object make_save_ptr_ptr 3873,128210
+extern Lisp_Object make_save_funcptr_ptr_obj 3874,128265
+extern Lisp_Object make_save_memory 3876,128361
+extern void free_save_value 3877,128425
+extern Lisp_Object build_overlay 3878,128468
+extern void free_marker 3879,128542
+extern void free_cons 3880,128581
+extern void init_alloc_once 3881,128625
+extern void init_alloc 3882,128661
+extern void syms_of_alloc 3883,128692
+extern struct buffer * allocate_buffer 3884,128726
+extern int valid_lisp_object_p 3885,128773
+extern int relocatable_string_data_p 3886,128819
+extern void check_cons_list 3888,128898
+INLINE void 3890,128940
+extern void *r_alloc r_alloc3895,129061
+#define FLOAT_TO_STRING_BUFSIZE 3927,130524
+extern int openp 3957,131673
+extern Lisp_Object string_to_number 3959,131783
+extern void map_obarray 3960,131846
+extern void dir_warning 3962,131960
+extern void init_obarray 3963,132013
+extern void init_lread 3964,132046
+extern void syms_of_lread 3965,132077
+intern 3968,132131
+intern_c_string 3974,132219
+extern EMACS_INT lisp_eval_depth;3980,132332
+extern Lisp_Object Vautoload_queue;3981,132366
+extern Lisp_Object Vrun_hooks;3982,132402
+extern Lisp_Object Vsignaling_function;3983,132433
+extern Lisp_Object inhibit_lisp_code;3984,132473
+extern struct handler *handlerlist;handlerlist3985,132511
+extern void run_hook 3994,132753
+extern void run_hook_with_args_2 3995,132789
+extern Lisp_Object run_hook_with_args 3996,132863
+extern _Noreturn void xsignal 3999,133022
+extern _Noreturn void xsignal0 4000,133080
+extern _Noreturn void xsignal1 4001,133126
+extern _Noreturn void xsignal2 4002,133185
+extern _Noreturn void xsignal3 4003,133257
+extern _Noreturn void signal_error 4005,133346
+extern Lisp_Object eval_sub 4006,133410
+extern Lisp_Object apply1 4007,133458
+extern Lisp_Object call0 4008,133512
+extern Lisp_Object call1 4009,133552
+extern Lisp_Object call2 4010,133605
+extern Lisp_Object call3 4011,133671
+extern Lisp_Object call4 4012,133750
+extern Lisp_Object call5 4013,133842
+extern Lisp_Object call6 4014,133947
+extern Lisp_Object call7 4015,134065
+extern Lisp_Object internal_catch 4016,134196
+extern Lisp_Object internal_lisp_condition_case 4017,134289
+extern Lisp_Object internal_condition_case 4018,134378
+extern Lisp_Object internal_condition_case_1 4019,134491
+extern Lisp_Object internal_condition_case_2 4020,134626
+extern Lisp_Object internal_condition_case_n4021,134787
+extern void specbind 4024,134983
+extern void record_unwind_protect 4025,135032
+extern void record_unwind_protect_ptr 4026,135105
+extern void record_unwind_protect_int 4027,135172
+extern void record_unwind_protect_void 4028,135233
+extern void record_unwind_protect_nothing 4029,135291
+extern void clear_unwind_protect 4030,135341
+extern void set_unwind_protect 4031,135387
+extern void set_unwind_protect_ptr 4032,135468
+extern Lisp_Object unbind_to 4033,135543
+extern _Noreturn void error 4034,135598
+fast_string_match_ignore_case 4136,140086
+extern ptrdiff_t fast_c_string_match_ignore_case 4141,140236
+extern ptrdiff_t fast_looking_at 4143,140333
+extern ptrdiff_t find_newline 4145,140472
+extern ptrdiff_t scan_newline 4147,140601
+extern ptrdiff_t scan_newline_from_point 4149,140704
+extern ptrdiff_t find_newline_no_quit 4150,140784
+extern ptrdiff_t find_before_next_newline 4152,140881
+extern void syms_of_search 4154,140979
+extern void clear_regexp_cache 4155,141014
+extern Lisp_Object Vminibuffer_list;4159,141084
+extern Lisp_Object last_minibuf_string;4160,141121
+extern Lisp_Object get_minibuffer 4161,141161
+extern void init_minibuf_once 4162,141208
+extern void syms_of_minibuf 4163,141246
+extern void syms_of_callint 4167,141313
+extern void syms_of_casefiddle 4171,141383
+extern void keys_of_casefiddle 4172,141422
+extern void init_casetab_once 4176,141492
+extern void syms_of_casetab 4177,141530
+extern Lisp_Object echo_message_buffer;4181,141598
+extern struct kboard *echo_kboard;echo_kboard4182,141638
+extern void cancel_echoing 4183,141673
+extern Lisp_Object last_undo_boundary;4184,141708
+extern bool input_pending;4185,141747
+extern sigjmp_buf return_to_command_loop;4187,141810
+extern Lisp_Object menu_bar_items 4189,141859
+extern Lisp_Object tool_bar_items 4190,141908
+extern void discard_mouse_events 4191,141964
+void handle_input_available_signal 4193,142025
+extern Lisp_Object pending_funcalls;4195,142074
+extern bool detect_input_pending 4196,142111
+extern bool detect_input_pending_ignore_squeezables 4197,142152
+extern bool detect_input_pending_run_timers 4198,142212
+extern void safe_run_hooks 4199,142264
+extern void cmd_error_internal 4200,142306
+extern Lisp_Object command_loop_1 4201,142366
+extern Lisp_Object read_menu_command 4202,142408
+extern Lisp_Object recursive_edit_1 4203,142453
+extern void record_auto_save 4204,142497
+extern void force_auto_save_soon 4205,142534
+extern void init_keyboard 4206,142575
+extern void syms_of_keyboard 4207,142609
+extern void keys_of_keyboard 4208,142646
+extern ptrdiff_t current_column 4211,142712
+extern void invalidate_current_column 4212,142752
+extern bool indented_beyond_p 4213,142798
+extern void syms_of_indent 4214,142863
+extern void store_frame_param 4217,142926
+extern void store_in_alist 4218,143000
+extern Lisp_Object do_switch_frame 4219,143070
+extern Lisp_Object get_frame_param 4220,143143
+extern void frames_discard_buffer 4221,143209
+extern void syms_of_frame 4222,143258
+extern char **initial_argv;initial_argv4225,143320
+extern int initial_argc;4226,143348
+extern bool display_arg;4228,143423
+extern Lisp_Object decode_env_path 4230,143455
+extern Lisp_Object empty_unibyte_string,4231,143526
+extern Lisp_Object empty_unibyte_string, empty_multibyte_string;4231,143526
+extern _Noreturn void terminate_due_to_signal 4232,143591
+extern Lisp_Object Vlibrary_cache;4234,143666
+void fixup_locale 4237,143727
+void synchronize_system_messages_locale 4238,143753
+void synchronize_system_time_locale 4239,143801
+INLINE void fixup_locale 4241,143851
+INLINE void synchronize_system_messages_locale 4242,143886
+INLINE void synchronize_system_time_locale 4243,143943
+extern void shut_down_emacs 4245,144003
+extern bool noninteractive;4248,144129
+extern bool no_site_lisp;4251,144221
+extern int daemon_pipe[daemon_pipe4256,144389
+#define IS_DAEMON 4257,144416
+#define DAEMON_RUNNING 4258,144456
+extern void *w32_daemon_event;w32_daemon_event4260,144524
+#define IS_DAEMON 4261,144555
+#define DAEMON_RUNNING 4262,144600
+extern bool fatal_error_in_progress;4266,144721
+extern bool inhibit_window_system;4269,144827
+extern bool running_asynch_code;4271,144920
+extern void kill_buffer_processes 4274,144983
+extern int wait_reading_process_output 4275,145032
+# define WAIT_READING_MAX 4281,145419
+# define WAIT_READING_MAX 4283,145491
+extern void add_timer_wait_descriptor 4286,145555
+extern void add_keyboard_wait_descriptor 4288,145607
+extern void delete_keyboard_wait_descriptor 4289,145655
+extern void add_gpm_wait_descriptor 4291,145722
+extern void delete_gpm_wait_descriptor 4292,145765
+extern void init_process_emacs 4294,145818
+extern void syms_of_process 4295,145857
+extern void setup_process_coding_systems 4296,145893
+extern int child_setup 4302,146013
+extern void init_callproc_1 4303,146081
+extern void init_callproc 4304,146117
+extern void set_initial_environment 4305,146151
+extern void syms_of_callproc 4306,146195
+extern Lisp_Object read_doc_string 4309,146258
+extern Lisp_Object get_doc_string 4310,146308
+extern void syms_of_doc 4311,146369
+extern int read_bytecode_char 4312,146401
+extern void syms_of_bytecode 4315,146470
+extern struct byte_stack *byte_stack_list;byte_stack_list4316,146507
+extern void mark_byte_stack 4318,146570
+extern void unmark_byte_stack 4320,146613
+extern Lisp_Object exec_byte_code 4321,146651
+extern void init_macros 4325,146801
+extern void syms_of_macros 4326,146833
+extern void truncate_undo_list 4329,146895
+extern void record_insert 4330,146945
+extern void record_delete 4331,146995
+extern void record_first_change 4332,147053
+extern void record_change 4333,147093
+extern void record_property_change 4334,147143
+extern void syms_of_undo 4337,147285
+extern void report_interval_modification 4340,147349
+extern void syms_of_menu 4343,147445
+extern void syms_of_xmenu 4346,147506
+extern char *get_current_dir_name get_current_dir_name4356,147708
+extern void stuff_char 4358,147757
+extern void init_foreground_group 4359,147790
+extern void sys_subshell 4360,147832
+extern void sys_suspend 4361,147865
+extern void discard_tty_input 4362,147897
+extern void init_sys_modes 4363,147935
+extern void reset_sys_modes 4364,147991
+extern void init_all_sys_modes 4365,148048
+extern void reset_all_sys_modes 4366,148087
+extern void child_setup_tty 4367,148127
+extern void setup_pty 4368,148162
+extern int set_window_size 4369,148191
+extern EMACS_INT get_random 4370,148235
+extern void seed_random 4371,148271
+extern void init_random 4372,148316
+extern void emacs_backtrace 4373,148348
+extern _Noreturn void emacs_abort 4374,148383
+extern void xputenv 4527,152697
+extern char *egetenv_internal egetenv_internal4529,152734
+egetenv 4532,152806
+extern void init_system_name 4539,153009
+#define eabs(4545,153302
+#define make_fixnum_or_float(4550,153435
+enum MAX_ALLOCA 4556,153686
+enum MAX_ALLOCA { MAX_ALLOCA 4556,153686
+extern void *record_xmalloc record_xmalloc4558,153731
+#define USE_SAFE_ALLOCA        4560,153797
+#define AVAIL_ALLOCA(4564,153930
+#define SAFE_ALLOCA(4568,154041
+#define SAFE_NALLOCA(4576,154382
+#define SAFE_ALLOCA_STRING(4590,154858
+#define SAFE_FREE(4598,155110
+#define SAFE_ALLOCA_LISP(4625,155688
+# define USE_STACK_LISP_OBJECTS 4652,156810
+# undef USE_STACK_LISP_OBJECTS4658,156976
+# define USE_STACK_LISP_OBJECTS 4659,157007
+enum { defined_GC_CHECK_STRING_BYTES 4663,157082
+enum { defined_GC_CHECK_STRING_BYTES 4665,157135
+union Aligned_Cons4670,157269
+union Aligned_String4676,157349
+    USE_STACK_CONS 4689,157704
+    USE_STACK_STRING 4691,157810
+#define STACK_CONS(4699,158147
+#define AUTO_CONS_EXPR(4701,158244
+#define AUTO_CONS(4709,158607
+#define AUTO_LIST1(4710,158678
+#define AUTO_LIST2(4712,158786
+#define AUTO_LIST3(4716,158941
+#define AUTO_LIST4(4720,159116
+extern const char *verify_ascii verify_ascii4730,159453
+# define verify_ascii(4732,159507
+#define AUTO_STRING(4740,159815
+#define FOR_EACH_TAIL(4752,160279
+#define FOR_EACH_ALIST_VALUE(4766,160770
+maybe_gc 4774,161057
+functionp 4784,161296
+
+c-src/machsyscalls.c,23
+#define        SYSCALL(6,113
+
+c-src/machsyscalls.h,159
+SYSCALL (mach_msg_trap,1,0
+SYSCALL (mach_reply_port,13,314
+SYSCALL (mach_thread_self,18,377
+SYSCALL (mach_task_self,23,441
+SYSCALL (mach_host_self,28,503
+
+c-src/fail.c,30
+void (*prt_call(prt_call1,0
+
+c-src/h.h,1962
+   ELEM_I/ELEM_I3,15
+} Fails_t;5,85
+typedef void Lang_function 6,96
+void Asm_labels 7,127
+typedef struct tpcmd8,147
+#define ggg 10,170
+tpcmd;15,209
+typedef struct foobar2_ 16,216
+} foobar2;20,307
+    DEVICE_SWP,23,333
+    DEVICE_LAST24,349
+} bsp_DevId;25,365
+  struct constant_args 27,394
+} args;30,457
+typedef int *regset;regset31,465
+typedef int INT;32,486
+typedef union abc33,503
+} ghi1;36,534
+typedef union abc 37,542
+} ghi2;39,573
+typedef struct a 40,581
+} b;41,600
+#define c(42,605
+typedef struct an_extern_linkage 
*an_extern_linkage_ptr;an_extern_linkage_ptr43,619
+typedef struct an_extern_linkage 44,676
+} an_extern_linkage;56,1054
+typedef struct pollfd   pfdset[pfdset57,1075
+typedef union rtunion_def58,1119
+  } womboid 63,1206
+typedef union rtunion_def64,1220
+womboid75,1330
+enum {dog,dog81,1416
+enum {dog, cat}cat81,1416
+enum {dog, cat} animals;81,1416
+typedef void (_CALLBACK_ *signal_handler)signal_handler82,1441
+typedef void (_CALLBACK_ *signal_handler1)signal_handler183,1489
+/* comment */ #define ANSIC84,1538
+ #define ANSIC85,1566
+typedef void (proc)87,1588
+typedef void OperatorFun(88,1612
+typedef int f(89,1648
+struct my_struct 91,1691
+typedef struct my_struct my_typedef;93,1713
+typedef RETSIGTYPE (*signal_handler_t)signal_handler_t94,1750
+  Date 04 May 87 235311 PDT 96,1802
+typedef unsigned char unchar;99,1880
+typedef int X,100,1910
+typedef int X, Y,100,1910
+typedef int X, Y, Z;100,1910
+typedef mio mao;101,1931
+extern void ab(102,1948
+typedef struct a 103,1966
+typedef struct a { } b;103,1966
+typedef struct b104,1990
+} c;106,2009
+int    (*oldhup)oldhup107,2014
+request (*oldhup)oldhup108,2031
+int extvar;109,2053
+#define tag1110,2065
+#define aaaaaa 111,2078
+#define bbbbbb\bbbbbb113,2102
+#define cccccccccc115,2125
+#define enter_critical_section 116,2144
+#define exit_critical_to_previous      117,2199
+#define UNDEFINED118,2259
+struct re_pattern_buffer 119,2277
+
+cp-src/c.C,2567
+template <typename ipc3dIslandHierarchy,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType, unsigned 
numOfChannels,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType, unsigned 
numOfChannels, typename ipc3dLinkControl,1,0
+class CMultiChannelCSC19_3D2,151
+        void execute(CMultiChannelCSC19_3D::execute11,493
+static void my_function1(24,984
+int main 25,1026
+double base 26,1088
+operator += operator +=29,1174
+class TestRecord;31,1233
+typedef struct s1 32,1251
+} t1;34,1287
+struct s2 35,1293
+typedef struct s2 t2;38,1324
+class A 39,1346
+  enum { rosso,A::rosso40,1356
+  enum { rosso, giallo,A::giallo40,1356
+  enum { rosso, giallo, verde A::verde40,1356
+  const A& operator+(A::operator+41,1396
+const A& A::operator+(43,1431
+void operator+(44,1467
+void operator -(operator -45,1495
+void operator int(operator int46,1524
+A<int>* f(48,1556
+int f(49,1571
+int A<int>::f(f50,1590
+A<float,B<int> > A<B<float>,int>::f(f51,1618
+template <class C, int n> class AT 52,1668
+class AU 53,1716
+class B<B54,1735
+class B<int> { void f(B::f54,1735
+const A::B::T& abt 55,1765
+class A 56,1791
+class A { class B A::B56,1791
+class A { class B { int f(A::B::f56,1791
+class A 57,1826
+  int get_data(A::get_data58,1836
+  A operator+(A::operator+59,1860
+is_muldiv_operation(61,1887
+domain foo 68,1955
+     void f(foo::f69,1968
+void A::A(72,1989
+struct A 73,2004
+struct A { A(A::A73,2004
+struct B 74,2022
+struct B { B(B::B74,2022
+void B::B(75,2041
+void BE_Node::BE_Node(76,2056
+class BE_Node 77,2083
+struct foo 79,2102
+class test 86,2156
+  int f(test::f87,2169
+  int ff(test::ff89,2231
+  int g(test::g90,2254
+class  AST_Root 92,2278
+class  AST_Root;96,2327
+AST_ConcreteType::AST_ConcreteType(99,2393
+AST_Array::AST_Array(107,2532
+     void f(::f115,2733
+struct A 117,2753
+    ~A(A::~A118,2764
+A::~A(120,2777
+struct B 122,2789
+    ~B(B::~B123,2800
+enum {dog,::dog126,2817
+enum {dog, cat}::cat126,2817
+enum {dog, cat} animals;126,2817
+struct {int teats;} cow;127,2842
+class Boo 129,2868
+    enum {dog,Boo::dog130,2880
+    enum {dog, cat}Boo::cat130,2880
+    foo(Boo::foo133,2954
+    Boo(Boo::Boo137,2995
+    Boo(Boo::Boo138,3052
+Boo::Boo(141,3070
+typedef int should_see_this_one_enclosed_in_extern_C;149,3155
+typedef int 
(*should_see_this_function_pointer)should_see_this_function_pointer153,3228
+typedef int should_see_this_array_type[should_see_this_array_type156,3310
+
+cp-src/abstract.C,11317
+Half_Container::Half_Container(34,703
+void Half_Container::SetPosition(45,941
+void Half_Container::SetDimensions(58,1259
+void Half_Container::SetFather(81,1697
+void Half_Container::SetCollapsed(87,1787
+Specification::Specification(98,1958
+void Specification::SetPosition(119,2453
+void Specification::SetDimensions(164,3742
+void Specification::SetFather(188,4616
+void Specification::SetPath(202,4908
+Coord Specification::GetMaxX(212,5125
+Coord Specification::GetMaxY(215,5174
+Process::Process(222,5298
+void Process::SetPosition(242,5697
+void Process::SetDimensions(291,6959
+void Process::SetFather(315,7913
+void Process::SetPath(326,8123
+Coord Process::GetMaxX(335,8323
+Coord Process::GetMaxY(338,8365
+Choice::Choice(346,8482
+void Choice::SetPosition(357,8698
+void Choice::SetDimensions(405,10053
+void Choice::ChangeH(466,12014
+void Choice::ChangeW(495,12947
+void Choice::SetFather(522,13700
+void Choice::SetTextual(532,13918
+void Choice::SetCollapsed(540,14041
+int Choice::Get_Textual_H(549,14168
+int Choice::Get_Textual_W(557,14408
+void Choice::SetTerminalPos(566,14615
+Stop::Stop(588,15087
+void Stop::SetPosition(595,15207
+void Stop::SetDimensions(605,15373
+void Stop::SetFather(644,16369
+void Stop::SetTextual(652,16537
+void Stop::SetCollapsed(655,16616
+Exit::Exit(667,16768
+void Exit::SetPosition(676,16935
+void Exit::SetDimensions(687,17164
+void Exit::SetFather(695,17350
+Exit_Bex::Exit_Bex(703,17476
+void Exit_Bex::SetPosition(713,17678
+void Exit_Bex::SetDimensions(740,18430
+void Exit_Bex::SetFather(798,20444
+void Exit_Bex::SetTextual(807,20646
+void Exit_Bex::SetCollapsed(814,20757
+NoExit::NoExit(826,20943
+void NoExit::SetPosition(835,21092
+void NoExit::SetDimensions(845,21266
+void NoExit::SetFather(852,21359
+ID_Place::ID_Place(861,21488
+void ID_Place::SetIdent(875,21745
+void ID_Place::SetPosition(886,21936
+void ID_Place::SetDimensions(897,22173
+void ID_Place::SetFather(928,23017
+ID_Place::~ID_Place(932,23073
+void ID_Place::SetVisible(935,23112
+void ID_Place::ClearID(941,23193
+ID_List::ID_List(953,23379
+void ID_List::SetPosition(967,23644
+void ID_List::SetDimensions(999,24385
+void ID_List::SetFather(1038,25456
+void ID_List::SetCollapsed(1047,25595
+void ID_List::HideMe(1056,25734
+void ID_List::SetRBubble(1065,25862
+void ID_List::SetAlignement(1073,25980
+int ID_List::GetCardinality(1082,26123
+void ID_List::SetVisible(1093,26291
+void ID_List::BuildSigSorts(1103,26518
+void ID_List::ClearIDs(1126,27081
+Id_Decl::Id_Decl(1139,27280
+void Id_Decl::SetPosition(1156,27659
+void Id_Decl::SetDimensions(1174,28016
+void Id_Decl::SetFather(1191,28417
+void Id_Decl::SetCollapsed(1200,28568
+Id_Decl_List::Id_Decl_List(1214,28799
+void Id_Decl_List::SetPosition(1227,29069
+void Id_Decl_List::SetDimensions(1245,29424
+void Id_Decl_List::SetFather(1262,29844
+void Id_Decl_List::SetCollapsed(1271,29988
+Comment::Comment(1286,30209
+void Comment::SetComment(1299,30446
+void Comment::SetFather(1317,30800
+void Comment::SetPosition(1321,30854
+void Comment::SetDimensions(1331,31031
+Comment::~Comment(1345,31265
+Comment_List::Comment_List(1352,31382
+void Comment_List::SetPosition(1362,31541
+void Comment_List::SetDimensions(1380,31860
+void Comment_List::SetFather(1392,32139
+Parallel::Parallel(1406,32360
+void Parallel::SetPosition(1417,32573
+void Parallel::SetDimensions(1473,34272
+void Parallel::SetTextual(1534,36167
+int Parallel::Get_Textual_W(1543,36313
+int Parallel::Get_Textual_H(1559,36722
+void Parallel::SetTerminalPos(1570,37191
+void Parallel::SetFather(1590,37698
+void Parallel::SetCollapsed(1601,37950
+Ident_Eq::Ident_Eq(1615,38177
+void Ident_Eq::SetPosition(1632,38546
+void Ident_Eq::SetDimensions(1647,38851
+void Ident_Eq::SetFather(1662,39191
+void Ident_Eq::SetCollapsed(1669,39295
+Ident_Eq_List::Ident_Eq_List(1681,39480
+void Ident_Eq_List::SetPosition(1694,39753
+void Ident_Eq_List::SetDimensions(1712,40111
+void Ident_Eq_List::SetCollapsed(1729,40538
+void Ident_Eq_List::SetFather(1738,40683
+Local_Def::Local_Def(1751,40904
+void Local_Def::SetPosition(1761,41102
+void Local_Def::SetDimensions(1791,41833
+void Local_Def::SetFather(1832,43262
+void Local_Def::SetCollapsed(1839,43370
+void Local_Def::SetTextual(1848,43504
+Hide::Hide(1860,43681
+void Hide::SetPosition(1871,43872
+void Hide::SetDimensions(1901,44569
+void Hide::SetFather(1944,45771
+void Hide::SetCollapsed(1951,45873
+void Hide::SetTextual(1961,46003
+Interl::Interl(1972,46175
+void Interl::SetPosition(1982,46361
+void Interl::SetDimensions(1993,46593
+void Interl::SetFather(2021,47103
+Syncr::Syncr(2031,47257
+void Syncr::SetPosition(2041,47438
+void Syncr::SetDimensions(2051,47609
+void Syncr::SetFather(2079,48153
+Enable::Enable(2090,48436
+void Enable::SetPosition(2102,48690
+void Enable::SetDimensions(2169,50473
+void Enable::SetTextual(2243,53017
+void Enable::SetTerminalPos(2251,53140
+int Enable::Get_Textual_W(2271,53720
+int Enable::Get_Textual_H(2282,53985
+void Enable::SetFather(2285,54104
+void Enable::SetCollapsed(2298,54418
+Disable::Disable(2314,54780
+void Disable::SetPosition(2325,55001
+void Disable::SetDimensions(2376,56251
+void Disable::SetFather(2436,58064
+void Disable::SetCollapsed(2446,58284
+void Disable::SetTextual(2455,58412
+void Disable::SetTerminalPos(2463,58536
+int Disable::Get_Textual_W(2479,58987
+int Disable::Get_Textual_H(2488,59190
+Gen_Paral::Gen_Paral(2500,59630
+void Gen_Paral::SetPosition(2513,59899
+void Gen_Paral::SetDimensions(2540,60659
+void Gen_Paral::SetFather(2590,62171
+void Gen_Paral::SetCollapsed(2597,62290
+Action_Pref::Action_Pref(2609,62583
+void Action_Pref::SetPosition(2620,62829
+void Action_Pref::SetDimensions(2669,63937
+void Action_Pref::SetFather(2724,65777
+void Action_Pref::SetCollapsed(2734,66010
+void Action_Pref::SetTextual(2743,66147
+Internal::Internal(2757,66484
+void Internal::SetPosition(2768,66658
+void Internal::SetDimensions(2778,66838
+void Internal::SetFather(2806,67442
+Communication::Communication(2816,67702
+void Communication::SetPosition(2827,67956
+void Communication::SetDimensions(2897,70390
+void Communication::SetFather(2935,71706
+void Communication::SetCollapsed(2942,71837
+void Communication::SetTextual(2949,71968
+NoGuard::NoGuard(2961,72262
+void NoGuard::SetPosition(2974,72462
+void NoGuard::SetDimensions(2984,72639
+void NoGuard::SetFather(2987,72678
+Guard::Guard(2996,72929
+void Guard::SetPosition(3008,73118
+void Guard::SetDimensions(3022,73428
+void Guard::SetFather(3044,73894
+void Guard::SetCollapsed(3050,73974
+NoExperiment::NoExperiment(3062,74258
+void NoExperiment::SetPosition(3075,74478
+void NoExperiment::SetDimensions(3085,74670
+void NoExperiment::SetFather(3088,74714
+Experiment::Experiment(3097,74978
+void Experiment::SetPosition(3110,75245
+void Experiment::SetDimensions(3128,75611
+void Experiment::SetFather(3150,76066
+void Experiment::SetCollapsed(3157,76188
+void Experiment::SetTextual(3165,76311
+Proc_Inst::Proc_Inst(3175,76476
+void Proc_Inst::SetPosition(3191,76777
+void Proc_Inst::SetDimensions(3236,77965
+void Proc_Inst::SetFather(3286,79596
+void Proc_Inst::SetCollapsed(3294,79739
+void Proc_Inst::SetTextual(3304,79909
+Value_Expr::Value_Expr(3316,80100
+void Value_Expr::SetPosition(3329,80327
+void Value_Expr::SetDimensions(3340,80572
+void Value_Expr::SetFather(3343,80614
+Value_Expr_List::Value_Expr_List(3351,80755
+void Value_Expr_List::SetPosition(3364,81042
+void Value_Expr_List::SetDimensions(3382,81406
+void Value_Expr_List::SetFather(3399,81830
+void Value_Expr_List::SetCollapsed(3408,81977
+Sum_Ident::Sum_Ident(3423,82203
+void Sum_Ident::SetPosition(3435,82445
+void Sum_Ident::SetDimensions(3466,83196
+void Sum_Ident::SetFather(3509,84540
+void Sum_Ident::SetCollapsed(3516,84653
+void Sum_Ident::SetTextual(3525,84793
+void Sum_Ident::SetTerminalPos(3532,84897
+Value::Value(3552,85432
+void Value::SetPosition(3569,85792
+void Value::SetDimensions(3583,86091
+void Value::SetFather(3606,86628
+void Value::SetCollapsed(3613,86731
+Term::Term(3626,86908
+void Term::SetPosition(3646,87323
+void Term::SetDimensions(3671,87942
+void Term::SetFather(3697,88599
+void Term::SetCollapsed(3705,88732
+Exit_Entry::Exit_Entry(3719,88947
+void Exit_Entry::SetPosition(3732,89176
+void Exit_Entry::SetDimensions(3743,89421
+void Exit_Entry::SetFather(3746,89463
+Exit_Entry_List::Exit_Entry_List(3754,89604
+void Exit_Entry_List::SetPosition(3766,89875
+void Exit_Entry_List::SetDimensions(3785,90304
+void Exit_Entry_List::SetFather(3802,90753
+void Exit_Entry_List::SetCollapsed(3811,90900
+Sum_Gate::Sum_Gate(3826,91125
+void Sum_Gate::SetPosition(3837,91363
+void Sum_Gate::SetDimensions(3873,92120
+void Sum_Gate::SetFather(3915,93438
+void Sum_Gate::SetCollapsed(3922,93549
+void Sum_Gate::SetTextual(3931,93687
+void Sum_Gate::SetTerminalPos(3938,93790
+Gate_Decl::Gate_Decl(3959,94421
+void Gate_Decl::SetPosition(3977,94900
+void Gate_Decl::SetDimensions(3995,95298
+void Gate_Decl::SetFather(4011,95694
+void Gate_Decl::SetCollapsed(4020,95871
+Gate_Decl_List::Gate_Decl_List(4034,96130
+void Gate_Decl_List::SetPosition(4047,96414
+void Gate_Decl_List::SetDimensions(4065,96779
+void Gate_Decl_List::SetFather(4082,97207
+void Gate_Decl_List::SetCollapsed(4091,97353
+Par::Par(4106,97572
+void Par::SetPosition(4126,97957
+void Par::SetDimensions(4174,99236
+void Par::SetFather(4226,100814
+void Par::SetCollapsed(4234,100943
+void Par::SetTextual(4245,101100
+Sort_Id_Exit::Sort_Id_Exit(4258,101329
+void Sort_Id_Exit::SetPosition(4270,101556
+void Sort_Id_Exit::SetDimensions(4283,101834
+void Sort_Id_Exit::SetFather(4297,102142
+void Sort_Id_Exit::SetCollapsed(4303,102228
+Equality::Equality(4314,102512
+Equality::Equality(4327,102736
+void Equality::SetPosition(4340,102987
+void Equality::SetDimensions(4357,103329
+void Equality::SetFather(4377,103720
+void Equality::SetCollapsed(4387,103858
+Guarded::Guarded(4401,104167
+void Guarded::SetPosition(4413,104384
+void Guarded::SetDimensions(4441,105084
+void Guarded::SetFather(4482,106273
+void Guarded::SetCollapsed(4489,106377
+void Guarded::SetTextual(4499,106509
+Exper_Off::Exper_Off(4510,106813
+void Exper_Off::SetPosition(4523,107035
+void Exper_Off::SetDimensions(4533,107220
+void Exper_Off::SetFather(4536,107261
+Exper_Off_List::Exper_Off_List(4544,107521
+void Exper_Off_List::SetPosition(4557,107802
+void Exper_Off_List::SetDimensions(4575,108167
+void Exper_Off_List::SetFather(4592,108594
+void Exper_Off_List::SetCollapsed(4601,108740
+Exclam::Exclam(4616,109087
+void Exclam::SetPosition(4629,109300
+void Exclam::SetDimensions(4641,109541
+void Exclam::SetFather(4655,109830
+void Exclam::SetCollapsed(4661,109912
+Query::Query(4673,110194
+void Query::SetPosition(4686,110399
+void Query::SetDimensions(4698,110636
+void Query::SetFather(4712,110918
+void Query::SetCollapsed(4718,110997
+Definition::Definition(4729,111279
+void Definition::SetPosition(4741,111448
+void Definition::SetDimensions(4752,111658
+void Definition::SetFather(4766,111896
+void Definition::SetPath(4777,112089
+Proc_List::Proc_List(4790,112374
+void Proc_List::SetPosition(4799,112505
+void Proc_List::SetDimensions(4809,112686
+void Proc_List::SetFather(4815,112767
+void Proc_List::SetPath(4824,112908
+char *Proc_List::GetPath(Proc_List::GetPath4832,113068
+
+cp-src/abstract.H,17065
+#define abstract_hh16,453
+class SignatureSorts;21,513
+class ID_Place:ID_Place23,536
+ ID_Place(ID_Place::ID_Place31,637
+ void  SetIdent(ID_Place::SetIdent32,650
+ void SetPosition(ID_Place::SetPosition33,675
+ void SetDimensions(ID_Place::SetDimensions34,708
+ void SetVisible(ID_Place::SetVisible35,735
+ void SetFather(ID_Place::SetFather36,759
+ void ClearID(ID_Place::ClearID37,789
+ virtual ~ID_Place(ID_Place::~ID_Place38,810
+ char *GetIdent(ID_Place::GetIdent41,857
+ void SetRBubble(ID_Place::SetRBubble42,891
+ char GetRBubble(ID_Place::GetRBubble43,934
+class ID_List:ID_List47,1012
+ ID_List(ID_List::ID_List57,1134
+ void SetPosition(ID_List::SetPosition58,1167
+ void SetDimensions(ID_List::SetDimensions59,1200
+ void SetFather(ID_List::SetFather60,1227
+ ID_Place *GetElem(ID_List::GetElem61,1257
+ void HideMe(ID_List::HideMe62,1279
+ void SetCollapsed(ID_List::SetCollapsed63,1299
+ void SetRBubble(ID_List::SetRBubble64,1325
+ void BuildSigSorts(ID_List::BuildSigSorts65,1349
+ void SetVisible(ID_List::SetVisible66,1409
+ void SetAlignement(ID_List::SetAlignement67,1433
+ void ClearIDs(ID_List::ClearIDs68,1460
+ int GetCardinality(ID_List::GetCardinality69,1482
+class Id_Decl:Id_Decl73,1540
+ Id_Decl(Id_Decl::Id_Decl81,1648
+ void SetPosition(Id_Decl::SetPosition82,1681
+ void SetDimensions(Id_Decl::SetDimensions83,1714
+ void SetFather(Id_Decl::SetFather84,1741
+ void SetCollapsed(Id_Decl::SetCollapsed85,1771
+class Id_Decl_List:Id_Decl_List89,1829
+ Id_Decl_List(Id_Decl_List::Id_Decl_List97,1945
+ void SetPosition(Id_Decl_List::SetPosition98,1987
+ void SetDimensions(Id_Decl_List::SetDimensions99,2020
+ void SetFather(Id_Decl_List::SetFather100,2047
+ void SetCollapsed(Id_Decl_List::SetCollapsed101,2077
+class Comment:Comment105,2140
+ Comment(Comment::Comment112,2222
+ Comment(Comment::Comment113,2234
+ void SetComment(Comment::SetComment114,2271
+ void SetPosition(Comment::SetPosition115,2297
+ void SetDimensions(Comment::SetDimensions116,2330
+ void SetFather(Comment::SetFather117,2357
+ virtual ~Comment(Comment::~Comment118,2387
+class Comment_List:Comment_List122,2440
+ Comment_List(Comment_List::Comment_List128,2525
+ void SetPosition(Comment_List::SetPosition129,2567
+ void SetDimensions(Comment_List::SetDimensions130,2600
+ void SetFather(Comment_List::SetFather131,2627
+class Value_Expr:Value_Expr135,2694
+ Value_Expr(Value_Expr::Value_Expr141,2769
+ void SetPosition(Value_Expr::SetPosition142,2784
+ void SetDimensions(Value_Expr::SetDimensions143,2817
+ void SetFather(Value_Expr::SetFather144,2844
+class Value_Expr_List:Value_Expr_List149,2911
+ Value_Expr_List(Value_Expr_List::Value_Expr_List157,3038
+ void SetPosition(Value_Expr_List::SetPosition158,3088
+ void SetDimensions(Value_Expr_List::SetDimensions159,3121
+ void SetFather(Value_Expr_List::SetFather160,3148
+ void SetCollapsed(Value_Expr_List::SetCollapsed161,3178
+class Exit_Entry:Exit_Entry165,3244
+ Exit_Entry(Exit_Entry::Exit_Entry171,3319
+ void SetPosition(Exit_Entry::SetPosition172,3334
+ void SetDimensions(Exit_Entry::SetDimensions173,3367
+ void SetFather(Exit_Entry::SetFather174,3394
+class Exit_Entry_List:Exit_Entry_List179,3460
+ Exit_Entry_List(Exit_Entry_List::Exit_Entry_List187,3587
+ void SetPosition(Exit_Entry_List::SetPosition188,3637
+ void SetDimensions(Exit_Entry_List::SetDimensions189,3670
+ void SetFather(Exit_Entry_List::SetFather190,3697
+ void SetCollapsed(Exit_Entry_List::SetCollapsed191,3727
+class Exper_Off:Exper_Off195,3793
+ Exper_Off(Exper_Off::Exper_Off199,3838
+ void SetPosition(Exper_Off::SetPosition200,3852
+ void SetDimensions(Exper_Off::SetDimensions201,3885
+ void SetFather(Exper_Off::SetFather202,3912
+class Exper_Off_List:Exper_Off_List207,3977
+ Exper_Off_List(Exper_Off_List::Exper_Off_List215,4115
+ void SetPosition(Exper_Off_List::SetPosition216,4163
+ void SetDimensions(Exper_Off_List::SetDimensions217,4196
+ void SetFather(Exper_Off_List::SetFather218,4223
+ void SetCollapsed(Exper_Off_List::SetCollapsed219,4253
+class Gate_Decl:Gate_Decl223,4323
+ Gate_Decl(Gate_Decl::Gate_Decl231,4446
+ void SetPosition(Gate_Decl::SetPosition232,4480
+ void SetDimensions(Gate_Decl::SetDimensions233,4513
+ void SetFather(Gate_Decl::SetFather234,4540
+ void SetCollapsed(Gate_Decl::SetCollapsed235,4570
+class Gate_Decl_List:Gate_Decl_List239,4630
+ Gate_Decl_List(Gate_Decl_List::Gate_Decl_List247,4754
+ void SetPosition(Gate_Decl_List::SetPosition248,4802
+ void SetDimensions(Gate_Decl_List::SetDimensions249,4835
+ void SetFather(Gate_Decl_List::SetFather250,4862
+ void SetCollapsed(Gate_Decl_List::SetCollapsed251,4892
+class Ident_Eq:Ident_Eq255,4957
+ Ident_Eq(Ident_Eq::Ident_Eq263,5079
+ void SetPosition(Ident_Eq::SetPosition264,5116
+ void SetDimensions(Ident_Eq::SetDimensions265,5149
+ void SetFather(Ident_Eq::SetFather266,5176
+ void SetCollapsed(Ident_Eq::SetCollapsed267,5206
+class Ident_Eq_List:Ident_Eq_List271,5270
+ Ident_Eq_List(Ident_Eq_List::Ident_Eq_List279,5404
+ void SetPosition(Ident_Eq_List::SetPosition280,5449
+ void SetDimensions(Ident_Eq_List::SetDimensions281,5482
+ void SetFather(Ident_Eq_List::SetFather282,5509
+ void SetCollapsed(Ident_Eq_List::SetCollapsed283,5539
+class Half_Container:Half_Container287,5608
+ Half_Container(Half_Container::Half_Container294,5712
+ void SetPosition(Half_Container::SetPosition295,5740
+ void SetDimensions(Half_Container::SetDimensions296,5773
+ void SetFather(Half_Container::SetFather297,5800
+ void SetCollapsed(Half_Container::SetCollapsed298,5830
+class Specification:Specification308,5954
+class Definition;Specification::Definition310,5994
+ Specification(Specification::Specification326,6283
+ void SetPosition(Specification::SetPosition328,6418
+ void SetDimensions(Specification::SetDimensions329,6451
+ void SetFather(Specification::SetFather330,6478
+ void SetPath(Specification::SetPath331,6508
+ Coord GetMaxX(Specification::GetMaxX332,6535
+ Coord GetMaxY(Specification::GetMaxY333,6553
+class Process:Process337,6609
+ Process(Process::Process352,6874
+ void SetPosition(Process::SetPosition353,6966
+ void SetDimensions(Process::SetDimensions354,6999
+ void SetFather(Process::SetFather355,7026
+ void SetPath(Process::SetPath356,7056
+ void NewBex(Process::NewBex357,7097
+ Coord GetMaxY(Process::GetMaxY359,7125
+ Coord GetMaxX(Process::GetMaxX360,7143
+ char GetNesting(Process::GetNesting363,7186
+class Proc_List:Proc_List367,7257
+ Proc_List(Proc_List::Proc_List373,7350
+ void SetPosition(Proc_List::SetPosition374,7386
+ void SetDimensions(Proc_List::SetDimensions375,7419
+ void SetFather(Proc_List::SetFather376,7446
+ void SetPath(Proc_List::SetPath377,7476
+ char *GetPath(Proc_List::GetPath378,7517
+class Definition:Definition382,7574
+ Definition(Definition::Definition390,7732
+ void SetPosition(Definition::SetPosition391,7784
+ void SetDimensions(Definition::SetDimensions392,7817
+ void SetFather(Definition::SetFather393,7844
+ void SetPath(Definition::SetPath394,7874
+ char *GetPath(Definition::GetPath397,7940
+class Exit:Exit407,8071
+ Exit(Exit::Exit414,8155
+ void SetPosition(Exit::SetPosition415,8173
+ void SetDimensions(Exit::SetDimensions416,8220
+ void SetFather(Exit::SetFather417,8247
+class NoExit:NoExit421,8305
+ NoExit(NoExit::NoExit427,8372
+ void SetPosition(NoExit::SetPosition428,8383
+ void SetDimensions(NoExit::SetDimensions429,8416
+ void SetFather(NoExit::SetFather430,8443
+class Value:Value440,8560
+ Value(Value::Value448,8663
+ void SetPosition(Value::SetPosition449,8695
+ void SetDimensions(Value::SetDimensions450,8728
+ void SetFather(Value::SetFather451,8755
+ void SetCollapsed(Value::SetCollapsed452,8785
+class Term:Term456,8841
+ Term(Term::Term465,8974
+ void SetPosition(Term::SetPosition466,9024
+ void SetDimensions(Term::SetDimensions467,9057
+ void SetFather(Term::SetFather468,9084
+ void SetCollapsed(Term::SetCollapsed469,9114
+class Equality:Equality473,9169
+ Equality(Equality::Equality481,9298
+ Equality(Equality::Equality482,9311
+ void SetPosition(Equality::SetPosition483,9348
+ void SetDimensions(Equality::SetDimensions484,9381
+ void SetFather(Equality::SetFather485,9408
+ void SetCollapsed(Equality::SetCollapsed486,9438
+class Sort_Id_Exit:Sort_Id_Exit490,9504
+ Sort_Id_Exit(Sort_Id_Exit::Sort_Id_Exit497,9603
+ void SetPosition(Sort_Id_Exit::SetPosition498,9630
+ void SetDimensions(Sort_Id_Exit::SetDimensions499,9663
+ void SetFather(Sort_Id_Exit::SetFather500,9690
+ void SetCollapsed(Sort_Id_Exit::SetCollapsed501,9720
+class NoGuard:NoGuard511,9837
+ NoGuard(NoGuard::NoGuard517,9906
+ void SetPosition(NoGuard::SetPosition518,9918
+ void SetDimensions(NoGuard::SetDimensions519,9951
+ void SetFather(NoGuard::SetFather520,9978
+class Guard:Guard524,10045
+ Guard(Guard::Guard531,10138
+ void SetPosition(Guard::SetPosition532,10158
+ void SetDimensions(Guard::SetDimensions533,10191
+ void SetFather(Guard::SetFather534,10218
+ void SetCollapsed(Guard::SetCollapsed535,10248
+class NoExperiment:NoExperiment545,10368
+ NoExperiment(NoExperiment::NoExperiment551,10447
+ void SetPosition(NoExperiment::SetPosition552,10464
+ void SetDimensions(NoExperiment::SetDimensions553,10497
+ void SetFather(NoExperiment::SetFather554,10524
+class Experiment:Experiment558,10591
+ Experiment(Experiment::Experiment566,10739
+ void SetPosition(Experiment::SetPosition567,10783
+ void SetDimensions(Experiment::SetDimensions568,10816
+ void SetFather(Experiment::SetFather569,10843
+ void SetTextual(Experiment::SetTextual570,10873
+ void SetCollapsed(Experiment::SetCollapsed571,10911
+ Tree_Node *GetGuard(Experiment::GetGuard574,10962
+class Exclam:Exclam578,11053
+ Exclam(Exclam::Exclam585,11150
+ void SetPosition(Exclam::SetPosition586,11172
+ void SetDimensions(Exclam::SetDimensions587,11205
+ void SetFather(Exclam::SetFather588,11232
+ void SetCollapsed(Exclam::SetCollapsed589,11262
+class Query:Query593,11324
+ Query(Query::Query600,11415
+ void SetPosition(Query::SetPosition601,11434
+ void SetDimensions(Query::SetDimensions602,11467
+ void SetFather(Query::SetFather603,11494
+ void SetCollapsed(Query::SetCollapsed604,11524
+class Internal:Internal614,11643
+ Internal(Internal::Internal620,11714
+ void SetPosition(Internal::SetPosition621,11727
+ void SetDimensions(Internal::SetDimensions622,11760
+ void SetFather(Internal::SetFather623,11787
+class Communication:Communication627,11854
+ Communication(Communication::Communication637,12039
+ void SetPosition(Communication::SetPosition638,12080
+ void SetDimensions(Communication::SetDimensions639,12113
+ void SetFather(Communication::SetFather640,12140
+ void SetTextual(Communication::SetTextual641,12170
+ void SetCollapsed(Communication::SetCollapsed642,12208
+class Gen_Paral:Gen_Paral652,12337
+ Gen_Paral(Gen_Paral::Gen_Paral661,12470
+ void SetPosition(Gen_Paral::SetPosition662,12493
+ void SetDimensions(Gen_Paral::SetDimensions663,12526
+ void SetFather(Gen_Paral::SetFather664,12553
+ void SetCollapsed(Gen_Paral::SetCollapsed665,12583
+ void HideGate(Gen_Paral::HideGate668,12634
+class Interl:Interl672,12730
+ Interl(Interl::Interl678,12797
+ void SetPosition(Interl::SetPosition679,12808
+ void SetDimensions(Interl::SetDimensions680,12841
+ void SetFather(Interl::SetFather681,12868
+class Syncr:Syncr685,12929
+ Syncr(Syncr::Syncr691,12994
+ void SetPosition(Syncr::SetPosition692,13004
+ void SetDimensions(Syncr::SetDimensions693,13037
+ void SetFather(Syncr::SetFather694,13064
+class Action_Pref:Action_Pref704,13185
+ Action_Pref(Action_Pref::Action_Pref714,13346
+ void SetPosition(Action_Pref::SetPosition715,13386
+ void SetDimensions(Action_Pref::SetDimensions716,13419
+ void SetFather(Action_Pref::SetFather717,13446
+ void SetTextual(Action_Pref::SetTextual718,13476
+ void SetCollapsed(Action_Pref::SetCollapsed719,13514
+class Enable:Enable723,13577
+ Enable(Enable::Enable734,13780
+ void SetPosition(Enable::SetPosition735,13826
+ void SetDimensions(Enable::SetDimensions736,13859
+ void SetFather(Enable::SetFather737,13886
+ void SetTextual(Enable::SetTextual738,13916
+ int Get_Textual_H(Enable::Get_Textual_H739,13954
+ int Get_Textual_W(Enable::Get_Textual_W740,13980
+ void SetTerminalPos(Enable::SetTerminalPos741,14006
+ void SetCollapsed(Enable::SetCollapsed742,14034
+class Disable:Disable746,14097
+ Disable(Disable::Disable756,14254
+ void SetPosition(Disable::SetPosition757,14290
+ void SetDimensions(Disable::SetDimensions758,14323
+ void SetFather(Disable::SetFather759,14350
+ void SetTextual(Disable::SetTextual760,14380
+ int Get_Textual_H(Disable::Get_Textual_H761,14418
+ int Get_Textual_W(Disable::Get_Textual_W762,14444
+ void SetTerminalPos(Disable::SetTerminalPos763,14470
+ void SetCollapsed(Disable::SetCollapsed764,14498
+class Choice:Choice768,14561
+ Choice(Choice::Choice779,14714
+ void SetPosition(Choice::SetPosition780,14749
+ void SetDimensions(Choice::SetDimensions781,14782
+ void SetFather(Choice::SetFather782,14809
+ void SetTextual(Choice::SetTextual783,14839
+ void SetCollapsed(Choice::SetCollapsed784,14877
+ int Get_Textual_H(Choice::Get_Textual_H785,14903
+ int Get_Textual_W(Choice::Get_Textual_W786,14929
+ void SetTerminalPos(Choice::SetTerminalPos787,14955
+ void ChangeH(Choice::ChangeH788,14983
+ void ChangeW(Choice::ChangeW789,15003
+class Stop:Stop793,15054
+ Stop(Stop::Stop801,15146
+ void SetPosition(Stop::SetPosition802,15155
+ void SetDimensions(Stop::SetDimensions803,15188
+ void SetFather(Stop::SetFather804,15215
+ void SetTextual(Stop::SetTextual805,15245
+ void SetCollapsed(Stop::SetCollapsed806,15283
+class Exit_Bex:Exit_Bex810,15338
+ Exit_Bex(Exit_Bex::Exit_Bex820,15491
+ void SetPosition(Exit_Bex::SetPosition821,15521
+ void SetDimensions(Exit_Bex::SetDimensions822,15554
+ void SetFather(Exit_Bex::SetFather823,15581
+ void SetTextual(Exit_Bex::SetTextual824,15611
+ void SetCollapsed(Exit_Bex::SetCollapsed825,15649
+class Hide:Hide829,15707
+ Hide(Hide::Hide839,15833
+ void SetPosition(Hide::SetPosition840,15864
+ void SetDimensions(Hide::SetDimensions841,15897
+ void SetFather(Hide::SetFather842,15924
+ void SetTextual(Hide::SetTextual843,15954
+ void SetCollapsed(Hide::SetCollapsed844,15992
+class Guarded:Guarded848,16047
+ Guarded(Guarded::Guarded858,16197
+ void SetPosition(Guarded::SetPosition859,16232
+ void SetDimensions(Guarded::SetDimensions860,16265
+ void SetFather(Guarded::SetFather861,16292
+ void SetTextual(Guarded::SetTextual862,16322
+ void SetCollapsed(Guarded::SetCollapsed863,16360
+class Proc_Inst:Proc_Inst867,16425
+  Proc_Inst(Proc_Inst::Proc_Inst879,16626
+ void SetPosition(Proc_Inst::SetPosition880,16681
+ void SetDimensions(Proc_Inst::SetDimensions881,16714
+ void SetFather(Proc_Inst::SetFather882,16741
+ void SetTextual(Proc_Inst::SetTextual883,16771
+ void SetCollapsed(Proc_Inst::SetCollapsed884,16809
+class Parallel:Parallel888,16870
+ Parallel(Parallel::Parallel899,17034
+ void SetPosition(Parallel::SetPosition900,17084
+ void SetDimensions(Parallel::SetDimensions901,17117
+ void SetFather(Parallel::SetFather902,17144
+ void SetTextual(Parallel::SetTextual903,17174
+ int Get_Textual_W(Parallel::Get_Textual_W904,17212
+ int Get_Textual_H(Parallel::Get_Textual_H905,17238
+ void SetTerminalPos(Parallel::SetTerminalPos906,17264
+ void SetCollapsed(Parallel::SetCollapsed907,17292
+ char GetOperType(Parallel::GetOperType910,17343
+class Local_Def:Local_Def914,17429
+ Local_Def(Local_Def::Local_Def924,17571
+ void SetPosition(Local_Def::SetPosition925,17613
+ void SetDimensions(Local_Def::SetDimensions926,17646
+ void SetFather(Local_Def::SetFather927,17673
+ void SetTextual(Local_Def::SetTextual928,17703
+ void SetCollapsed(Local_Def::SetCollapsed929,17741
+class Par:Par933,17801
+ Par(Par::Par943,17948
+ void SetPosition(Par::SetPosition944,17998
+ void SetDimensions(Par::SetDimensions945,18031
+ void SetFather(Par::SetFather946,18058
+ void SetTextual(Par::SetTextual947,18088
+ void SetCollapsed(Par::SetCollapsed948,18126
+class Sum_Gate:Sum_Gate952,18180
+ Sum_Gate(Sum_Gate::Sum_Gate962,18356
+ void SetPosition(Sum_Gate::SetPosition963,18398
+ void SetDimensions(Sum_Gate::SetDimensions964,18431
+ void SetFather(Sum_Gate::SetFather965,18458
+ void SetTextual(Sum_Gate::SetTextual966,18488
+ void SetTerminalPos(Sum_Gate::SetTerminalPos967,18526
+ void SetCollapsed(Sum_Gate::SetCollapsed968,18554
+class Sum_Ident:Sum_Ident972,18613
+ Sum_Ident(Sum_Ident::Sum_Ident982,18790
+ void SetPosition(Sum_Ident::SetPosition983,18831
+ void SetDimensions(Sum_Ident::SetDimensions984,18864
+ void SetFather(Sum_Ident::SetFather985,18891
+ void SetTextual(Sum_Ident::SetTextual986,18921
+ void SetTerminalPos(Sum_Ident::SetTerminalPos987,18959
+ void SetCollapsed(Sum_Ident::SetCollapsed988,18987
+
+cp-src/cfront.H,12673
+extern bit old_fct_accepted;28,897
+extern bit fct_void;32,1028
+extern char* prog_name;42,1297
+extern int inline_restr;43,1351
+extern bit emode;44,1410
+extern Pname name_free;47,1457
+extern Pexpr expr_free;48,1496
+extern Pstmt stmt_free;49,1520
+extern int Nspy;52,1569
+extern int Nfile,53,1586
+extern int Nfile, Nline,53,1586
+extern int Nfile, Nline, Ntoken,53,1586
+extern int Nfile, Nline, Ntoken, Nname,53,1586
+extern int Nfile, Nline, Ntoken, Nname, Nfree_store,53,1586
+extern int Nfile, Nline, Ntoken, Nname, Nfree_store, Nalloc,53,1586
+extern int Nfile, Nline, Ntoken, Nname, Nfree_store, Nalloc, Nfree;53,1586
+extern int Nn,54,1654
+extern int Nn, Nbt,54,1654
+extern int Nn, Nbt, Nt,54,1654
+extern int Nn, Nbt, Nt, Ne,54,1654
+extern int Nn, Nbt, Nt, Ne, Ns,54,1654
+extern int Nn, Nbt, Nt, Ne, Ns, Nstr,54,1654
+extern int Nn, Nbt, Nt, Ne, Ns, Nstr, Nc,54,1654
+extern int Nn, Nbt, Nt, Ne, Ns, Nstr, Nc, Nl;54,1654
+extern int NFn,55,1700
+extern int NFn, NFtn,55,1700
+extern int NFn, NFtn, NFpv,55,1700
+extern int NFn, NFtn, NFpv, NFbt,55,1700
+extern int NFn, NFtn, NFpv, NFbt, NFf,55,1700
+extern int NFn, NFtn, NFpv, NFbt, NFf, NFs,55,1700
+extern int NFn, NFtn, NFpv, NFbt, NFf, NFs, NFc,55,1700
+extern int NFn, NFtn, NFpv, NFbt, NFf, NFs, NFc, NFe,55,1700
+extern int NFn, NFtn, NFpv, NFbt, NFf, NFs, NFc, NFe, NFl;55,1700
+extern TOK     lex(57,1760
+extern Pname   syn(58,1778
+extern void    init_print(60,1799
+extern void    init_lex(61,1847
+extern void    int_syn(62,1871
+extern void    ext(63,1894
+extern char*   make_name(65,1917
+struct loc     67,1948
+       void    put(loc::put72,2062
+       void    putline(loc::putline73,2080
+extern Loc curloc;77,2108
+extern int curr_file;78,2127
+struct ea 80,2150
+       ea(ea::ea86,2249
+       ea(ea::ea87,2275
+       ea(ea::ea88,2301
+       ea(ea::ea89,2310
+extern ea* ea0;92,2332
+overload error;94,2349
+int error(95,2365
+int error(96,2437
+int error(97,2515
+int error(98,2592
+extern int error_count;101,2689
+extern bit debug;102,2713
+extern int vtbl_opt;103,2731
+extern FILE* out_file;104,2752
+extern FILE* in_file;105,2775
+extern char scan_started;106,2797
+extern bit warn;107,2823
+extern int br_level;110,2848
+extern int bl_level;111,2869
+extern Ptable ktbl;112,2890
+extern Ptable gtbl;113,2941
+extern char* oper_name(114,2978
+extern Pclass ccl;115,3007
+extern Pbase defa_type;116,3026
+extern Pbase moe_type;117,3050
+extern Pstmt Cstmt;120,3087
+extern Pname Cdcl;121,3135
+extern void put_dcl_context(122,3194
+extern Ptable any_tbl;124,3226
+extern Pbase any_type;125,3287
+extern Pbase int_type;128,3318
+extern Pbase char_type;129,3341
+extern Pbase short_type;130,3365
+extern Pbase long_type;131,3390
+extern Pbase uint_type;132,3414
+extern Pbase float_type;133,3438
+extern Pbase double_type;134,3463
+extern Pbase void_type;135,3489
+extern Pbase uchar_type;138,3527
+extern Pbase ushort_type;139,3552
+extern Pbase ulong_type;140,3578
+extern Ptype Pchar_type;141,3603
+extern Ptype Pint_type;142,3628
+extern Ptype Pfctvec_type;143,3652
+extern Ptype Pfctchar_type;144,3679
+extern Ptype Pvoid_type;145,3707
+extern Pbase zero_type;146,3732
+extern int byte_offset;148,3757
+extern int bit_offset;149,3781
+extern int max_align;150,3804
+extern int stack_size;151,3826
+extern int enum_count;152,3849
+extern int const_save;153,3872
+extern Pexpr dummy;156,3903
+extern Pexpr zero;157,3950
+extern Pexpr one;158,3969
+extern Pname sta_name;159,3987
+#define DEL(161,4040
+#define PERM(162,4092
+#define UNPERM(163,4123
+struct node 165,4157
+extern Pclass Ebase,172,4259
+extern Pclass Ebase, Epriv;172,4259
+struct table 175,4321
+       table(table::table192,4875
+       Pname   look(table::look194,4906
+       Pname   insert(table::insert195,4931
+       void    grow(table::grow197,4971
+       void    set_scope(table::set_scope198,4988
+       void    set_name(table::set_name199,5029
+       Pname   get_mem(table::get_mem200,5070
+       int     max(table::max201,5091
+       void    dcl_print(table::dcl_print202,5129
+       Pname   lookc(table::lookc203,5155
+       Pexpr   find_name(table::find_name204,5181
+       void    del(table::del205,5218
+extern bit Nold;210,5255
+extern bit vec_const,211,5272
+extern bit vec_const, fct_const;211,5272
+extern void restore(214,5313
+extern void set_scope(215,5336
+extern Plist modified_tn;216,5366
+extern Pbase start_cl(217,5392
+extern void end_cl(218,5434
+extern Pbase end_enum(219,5456
+extern bit new_type;224,5581
+extern Pname cl_obj_vec;225,5602
+extern Pname eobj;226,5627
+#define DEFINED 230,5655
+#define SIMPLIFIED 231,5712
+#define DEF_SEEN 232,5754
+#define IN_ERROR 234,5859
+struct type 236,5881
+       char*   signature(type::signature240,6005
+       void    print(type::print242,6043
+       void    dcl_print(type::dcl_print243,6058
+       void    base_print(type::base_print244,6082
+       void    del(type::del245,6102
+       Pname   is_cl_obj(type::is_cl_obj247,6116
+       int     is_ref(type::is_ref248,6158
+       void    dcl(type::dcl249,6173
+       int     tsizeof(type::tsizeof250,6192
+       bit     tconst(type::tconst251,6208
+       TOK     set_const(type::set_const252,6223
+       int     align(type::align253,6244
+       TOK     kind(type::kind254,6258
+       TOK     integral(type::integral255,6278
+       TOK     numeric(type::numeric256,6324
+       TOK     num_ptr(type::num_ptr257,6370
+       bit     vec_type(type::vec_type258,6416
+       bit     check(type::check259,6433
+       Ptype   deref(type::deref260,6457
+       Pptr    addrof(type::addrof261,6473
+struct enumdef 265,6500
+               enumdef(enumdef::enumdef269,6586
+       void    print(enumdef::print271,6641
+       void    dcl_print(enumdef::dcl_print272,6656
+       void    dcl(enumdef::dcl273,6680
+       void    simpl(enumdef::simpl274,6706
+struct classdef 278,6732
+       classdef(classdef::classdef301,7490
+       TOK     is_simple(classdef::is_simple302,7506
+       void    print(classdef::print304,7568
+       void    dcl_print(classdef::dcl_print305,7583
+       void    simpl(classdef::simpl306,7607
+       void    print_members(classdef::print_members308,7623
+       void    dcl(classdef::dcl309,7646
+       bit     has_friend(classdef::has_friend310,7672
+       bit     baseof(classdef::baseof311,7696
+       bit     baseof(classdef::baseof312,7716
+       Pname   has_oper(classdef::has_oper313,7737
+       Pname   has_ctor(classdef::has_ctor314,7759
+       Pname   has_dtor(classdef::has_dtor315,7813
+       Pname   has_itor(classdef::has_itor316,7867
+       Pname   has_ictor(classdef::has_ictor317,7902
+struct basetype 323,7935
+       basetype(basetype::basetype350,8636
+       Pbase   type_adj(basetype::type_adj352,8660
+       Pbase   base_adj(basetype::base_adj353,8682
+       Pbase   name_adj(basetype::name_adj354,8706
+       Pname   aggr(basetype::aggr355,8730
+       void    normalize(basetype::normalize356,8747
+       Pbase   check(basetype::check358,8779
+       void    dcl_print(basetype::dcl_print359,8800
+       Pbase   arit_conv(basetype::arit_conv360,8819
+struct fct 365,8857
+       fct(fct::fct387,9517
+       void    argdcl(fct::argdcl389,9543
+       Ptype   normalize(fct::normalize391,9583
+       void    dcl_print(fct::dcl_print392,9608
+       void    dcl(fct::dcl393,9627
+       Pexpr   base_init(fct::base_init394,9645
+       Pexpr   mem_init(fct::mem_init395,9685
+       bit     declared(fct::declared396,9724
+       void    simpl(fct::simpl397,9765
+       Pexpr   expand(fct::expand398,9780
+struct name_list 403,9827
+       name_list(name_list::name_list406,9866
+struct gen 410,9931
+               gen(gen::gen413,9996
+       Pname   add(gen::add414,10010
+       Pname   find(gen::find415,10034
+struct pvtyp 419,10071
+struct vec 423,10109
+       vec(vec::vec429,10182
+       Ptype   normalize(vec::normalize431,10253
+struct ptr 435,10289
+       ptr(ptr::ptr440,10419
+       Ptype   normalize(ptr::normalize442,10497
+inline Pptr type::addrof(447,10546
+extern bit vrp_equiv;449,10606
+extern Pexpr next_elem(461,10867
+extern void new_list(462,10893
+extern void list_check(463,10922
+extern Pexpr ref_init(464,10967
+extern Pexpr class_init(465,11009
+extern Pexpr check_cond(466,11060
+struct expr 469,11113
+       expr(expr::expr504,11716
+       ~expr(expr::~expr505,11742
+       void    del(expr::del507,11765
+       void    print(expr::print508,11778
+       Pexpr   typ(expr::typ509,11793
+       int     eval(expr::eval510,11813
+       int     lval(expr::lval511,11826
+       Ptype   fct_call(expr::fct_call512,11842
+       Pexpr   address(expr::address513,11867
+       Pexpr   contents(expr::contents514,11885
+       void    simpl(expr::simpl515,11904
+       Pexpr   expand(expr::expand516,11919
+       bit     not_simple(expr::not_simple517,11936
+       Pexpr   try_to_overload(expr::try_to_overload518,11955
+       Pexpr   docast(expr::docast519,11987
+       Pexpr   dovalue(expr::dovalue520,12010
+       Pexpr   donew(expr::donew521,12034
+       void    simpl_new(expr::simpl_new522,12056
+       void    simpl_delete(expr::simpl_delete523,12075
+struct texpr 527,12108
+       texpr(texpr::texpr528,12149
+struct ival 531,12218
+       ival(ival::ival532,12258
+struct call 535,12308
+       call(call::call536,12338
+       void    simpl(call::simpl538,12404
+       Pexpr   expand(call::expand539,12419
+struct qexpr 543,12453
+       qexpr(qexpr::qexpr544,12500
+struct ref 547,12582
+       ref(ref::ref548,12632
+struct text_expr 551,12697
+       text_expr(text_expr::text_expr552,12731
+struct name 557,12884
+       name(name::name585,13815
+       ~name(name::~name586,13832
+       Pname   normalize(name::normalize588,13843
+       Pname   tdef(name::tdef589,13881
+       Pname   tname(name::tname590,13896
+       void    hide(name::hide591,13915
+       void    unhide(name::unhide592,13929
+       Pname   dcl(name::dcl594,13981
+       int     no_of_names(name::no_of_names595,14005
+       void    use(name::use596,14025
+       void    assign(name::assign597,14053
+       void    take_addr(name::take_addr598,14069
+       void    check_oper(name::check_oper599,14108
+       void    simpl(name::simpl600,14133
+       void    del(name::del601,14148
+       void    print(name::print602,14161
+       void    dcl_print(name::dcl_print603,14176
+       void    field_align(name::field_align604,14198
+       Pname   dofct(name::dofct605,14219
+extern int friend_in_class;610,14269
+struct stmt 615,14374
+       stmt(stmt::stmt640,14757
+       ~stmt(stmt::~stmt641,14781
+       void    del(stmt::del643,14804
+       void    print(stmt::print644,14817
+       void    dcl(stmt::dcl645,14832
+       void    reached(stmt::reached646,14845
+       Pstmt   simpl(stmt::simpl647,14862
+       Pstmt   expand(stmt::expand648,14878
+       Pstmt   copy(stmt::copy649,14895
+extern char* Neval;654,14934
+extern Pname dcl_temp(655,14954
+extern char* temp(656,14992
+extern Ptable scope;657,15032
+extern Ptable expand_tbl;658,15053
+extern Pname expand_fn;659,15079
+struct estmt 662,15111
+       estmt(estmt::estmt669,15303
+struct ifstmt 672,15379
+       ifstmt(ifstmt::ifstmt676,15484
+struct lstmt 680,15586
+       lstmt(lstmt::lstmt686,15650
+struct forstmt 689,15728
+       forstmt(forstmt::forstmt690,15759
+struct block 694,15880
+       block(block::block695,15919
+       void    dcl(block::dcl697,16001
+       Pstmt   simpl(block::simpl698,16020
+struct pair 703,16060
+       pair(pair::pair704,16096
+struct nlist 708,16173
+               nlist(nlist::nlist711,16214
+       void    add(nlist::add712,16230
+       void    add_list(nlist::add_list713,16282
+extern Pname name_unlist(716,16309
+struct slist 718,16344
+               slist(slist::slist721,16385
+       void    add(slist::add722,16430
+extern Pstmt stmt_unlist(725,16486
+struct elist 727,16521
+               elist(elist::elist730,16562
+       void    add(elist::add731,16607
+extern Pexpr expr_unlist(734,16659
+extern class dcl_context * cc;737,16707
+struct dcl_context 739,16739
+       void    stack(dcl_context::stack747,17023
+       void    unstack(dcl_context::unstack748,17064
+#define MAXCONT        751,17095
+extern dcl_context ccvec[ccvec752,17114
+extern void yyerror(755,17157
+extern TOK back;756,17185
+extern char* line_format;760,17217
+extern Plist isf_list;762,17244
+extern Pstmt st_ilist;763,17267
+extern Pstmt st_dlist;764,17290
+extern Ptable sti_tbl;765,17313
+extern Ptable std_tbl;766,17336
+Pexpr try_to_coerce(767,17359
+extern bit can_coerce(768,17409
+extern Ptype np_promote(769,17446
+extern void new_key(770,17505
+extern Pname dcl_list;772,17544
+extern int over_call(773,17567
+extern Pname Nover;774,17603
+extern Pname Ntncheck;775,17623
+extern Pname Ncoerce;776,17646
+extern Nover_coerce;777,17668
+const MIA 779,17690
+struct iline 780,17705
+extern Pexpr curr_expr;789,17938
+extern Pin curr_icall;790,17962
+#define FUDGE111 791,17985
+extern Pstmt curr_loop;793,18007
+extern Pblock curr_block;794,18031
+extern Pstmt curr_switch;795,18057
+extern bit arg_err_suppress;796,18083
+extern loc last_line;797,18112
+extern no_of_undcl;799,18135
+extern no_of_badcall;800,18155
+extern Pname undcl,801,18177
+extern Pname undcl, badcall;801,18177
+extern int strlen(803,18207
+extern char* strcpy(804,18239
+extern int str_to_int(805,18280
+extern int c_strlen(806,18316
+extern int strcmp(809,18360
+extern Pname vec_new_fct;812,18419
+extern Pname vec_del_fct;813,18445
+extern int Nstd;815,18472
+extern int stcount;817,18555
+extern Pname find_hidden(819,18623
+Pexpr replace_temp(820,18656
+void make_res(821,18689
+Pexpr ptr_init(822,18710
+extern bit fake_sizeof;826,18755
+extern TOK lalex(828,18823
+extern fprintf(830,18856
+#define DB(831,18890
+#define DB(833,18920
+
+cp-src/burton.cpp,103
+::dummy::dummy test::dummy1(1,0
+::dummy::dummy test::dummy2(6,64
+::dummy::dummy test::dummy3(11,143
+
+cp-src/functions.cpp,807
+void Date::setDate 5,148
+void Date::plus 32,939
+void Date::minus 42,1229
+void Date::shift 52,1407
+Date & Date::operator = Date::operator =62,1628
+Date & Date::operator += Date::operator +=69,1789
+Date & Date::operator -= Date::operator -=78,1939
+Date & Date::operator ++ Date::operator ++87,2080
+Date & Date::operator -- Date::operator --96,2216
+int Date::operator - Date::operator -104,2331
+int Date::operator < Date::operator <112,2483
+int Date::operator > Date::operator >116,2557
+int Date::operator == Date::operator ==120,2631
+ostream& operator << operator <<124,2707
+istream& operator >> operator >>133,2943
+bool isLeap 159,3543
+bool isHoliday 163,3629
+void asort(173,3865
+void ReadVacation 186,4064
+void Debug 201,4523
+int WorkingDays(211,4867
+Date StartDay(226,5129
+
+cp-src/MDiagArray2.h,1538
+#define octave_MDiagArray2_h 29,870
+#undef LTGT35,967
+#define LTGT39,1031
+#define LTGT 42,1051
+class MDiagArray2;45,1087
+operator += operator +=48,1145
+operator -= operator -=51,1242
+operator * operator *54,1339
+operator / operator /57,1428
+operator * operator *60,1517
+operator + operator +63,1605
+operator - operator -66,1707
+product 69,1808
+operator - operator -72,1907
+class MDiagArray2 78,2022
+  MDiagArray2 MDiagArray2::MDiagArray282,2077
+  MDiagArray2 MDiagArray2::MDiagArray286,2154
+  MDiagArray2 MDiagArray2::MDiagArray287,2198
+  MDiagArray2 MDiagArray2::MDiagArray288,2254
+  MDiagArray2 MDiagArray2::MDiagArray289,2329
+  MDiagArray2 MDiagArray2::MDiagArray290,2387
+  MDiagArray2 MDiagArray2::MDiagArray291,2450
+  ~MDiagArray2 MDiagArray2::~MDiagArray293,2515
+  MDiagArray2<T>& operator = MDiagArray2::operator =95,2542
+      DiagArray2<T>::operator = MDiagArray2::operator =97,2603
+  operator MArray2<T> MDiagArray2::operator MArray2<T>101,2667
+  operator += MDiagArray2::operator +=116,2966
+  operator -= MDiagArray2::operator -=119,3057
+  friend MDiagArray2<T> operator * MDiagArray2::operator *123,3174
+  friend MDiagArray2<T> operator / MDiagArray2::operator /124,3253
+  friend MDiagArray2<T> operator * MDiagArray2::operator *128,3384
+  operator + MDiagArray2::operator +133,3544
+  operator - MDiagArray2::operator -136,3640
+  friend MDiagArray2<T> operator - MDiagArray2::operator -141,3803
+#undef LTGT144,3874
+#define INSTANTIATE_MDIAGARRAY_FRIENDS(146,3887
+
+cp-src/Pctest.h,658
+#define PCTEST_H24,837
+class TestRecord;42,1118
+    PctestActionValid,::PctestActionValid47,1286
+    PctestActionValidLasthop,::PctestActionValidLasthop49,1370
+    PctestActionFiltered,::PctestActionFiltered51,1481
+    PctestActionAbort  ::PctestActionAbort53,1566
+} PctestActionType;54,1616
+class Pctest 56,1637
+    Pctest(Pctest::Pctest59,1663
+    virtual ~Pctest(Pctest::~Pctest65,1813
+    virtual void TimeSyscall(Pctest::TimeSyscall68,1889
+    virtual char *GeneratePayload(Pctest::GeneratePayload71,1975
+    virtual char *GetTargetName(Pctest::GetTargetName77,2171
+    virtual PctestActionType GetAction(Pctest::GetAction86,2555
+
+cp-src/Range.h,965
+#define octave_Range_h 24,765
+class istream;30,840
+class ostream;31,855
+class Matrix;32,870
+Range35,891
+  Range Range::Range39,909
+  Range Range::Range42,995
+  Range Range::Range46,1130
+  Range Range::Range50,1248
+  double base Range::base54,1376
+  double limit Range::limit55,1425
+  double inc Range::inc56,1475
+  int nelem Range::nelem57,1523
+  bool all_elements_are_ints Range::all_elements_are_ints59,1571
+  Matrix matrix_value Range::matrix_value61,1615
+  double min Range::min63,1652
+  double max Range::max64,1679
+  void sort Range::sort66,1707
+  void set_base Range::set_base68,1728
+  void set_limit Range::set_limit69,1774
+  void set_inc Range::set_inc70,1821
+  friend ostream& operator << Range::operator <<72,1867
+  friend istream& operator >> Range::operator >>73,1928
+  void print_range Range::print_range75,1984
+  int nelem_internal Range::nelem_internal85,2099
+extern Range operator - operator -88,2138
+
+cp-src/screen.cpp,228
+unsigned char cursor_x,15,548
+unsigned char cursor_x, cursor_y;15,548
+static union REGS regs;16,582
+void goto_xy(18,607
+void hide_cursor(27,774
+void cursor_position(32,836
+void clear_screen(41,997
+void write_xyc(55,1247
+
+cp-src/screen.hpp,791
+#define __COLORS9,401
+enum COLORS 11,419
+    BLACK,COLORS::BLACK12,433
+    BLUE,COLORS::BLUE13,471
+    GREEN,COLORS::GREEN14,481
+    CYAN,COLORS::CYAN15,492
+    RED,COLORS::RED16,502
+    MAGENTA,COLORS::MAGENTA17,511
+    BROWN,COLORS::BROWN18,524
+    LIGHTGRAY,COLORS::LIGHTGRAY19,535
+    DARKGRAY,COLORS::DARKGRAY20,550
+    LIGHTBLUE,COLORS::LIGHTBLUE21,589
+    LIGHTGREEN,COLORS::LIGHTGREEN22,604
+    LIGHTCYAN,COLORS::LIGHTCYAN23,620
+    LIGHTRED,COLORS::LIGHTRED24,635
+    LIGHTMAGENTA,COLORS::LIGHTMAGENTA25,649
+    YELLOW,COLORS::YELLOW26,667
+    WHITECOLORS::WHITE27,679
+#define SCREEN_FP(31,700
+#define SCREEN_START 33,795
+void goto_xy(35,835
+void hide_cursor(36,883
+void cursor_position(37,907
+void clear_screen(38,935
+void write_xyc(39,960
+
+cp-src/conway.cpp,270
+#define max(12,357
+#define min(13,393
+const int num_rows 15,430
+const int num_columns 16,470
+class site *field_of_play[field_of_play18,499
+int site::total_surrounding(20,550
+void display(37,958
+void glider(50,1239
+void traffic_light(59,1478
+void main(67,1633
+
+cp-src/conway.hpp,331
+class site:site5,235
+    int total_surrounding(site::total_surrounding8,303
+    site(site::site10,344
+    ~site(site::~site11,397
+    char read(site::read12,410
+    void set(site::set13,444
+    void clear(site::clear14,478
+    void compute_next_state(site::compute_next_state15,514
+    void step(site::step22,717
+
+cp-src/clheir.cpp,307
+const int max_num_generic_objects 9,298
+generic_object * object_registry[object_registry10,340
+void init_registry(12,400
+void step_everybody(19,527
+void discrete_location::clear_neighbors(31,852
+generic_object::generic_object(36,981
+generic_object::~generic_object(48,1255
+void agent::move(53,1353
+
+cp-src/clheir.hpp,1152
+extern void init_registry(10,452
+extern void step_everybody(11,485
+class generic_object13,520
+    generic_object(generic_object::generic_object17,582
+    ~generic_object(generic_object::~generic_object19,724
+    virtual void compute_next_state(generic_object::compute_next_state21,842
+    virtual void step(generic_object::step22,888
+const int max_num_directions 31,1219
+class location:location33,1289
+    location(location::location43,1642
+    ~location(location::~location44,1661
+class irregular_location:irregular_location47,1686
+    irregular_location(irregular_location::irregular_location51,1762
+    ~irregular_location(irregular_location::~irregular_location53,1854
+class discrete_location:discrete_location56,1889
+    void clear_neighbors(discrete_location::clear_neighbors60,2004
+    discrete_location(discrete_location::discrete_location62,2044
+    ~discrete_location(discrete_location::~discrete_location65,2154
+    void assign_neighbor(discrete_location::assign_neighbor66,2184
+class agent:agent75,2508
+    agent(agent::agent79,2578
+    ~agent(agent::~agent80,2591
+    void move(agent::move81,2605
+
+cp-src/fail.C,386
+struct A 7,263
+          struct B A::B8,274
+                  struct C A::B::C9,289
+                          C(A::B::C::C11,318
+                          operator int(A::B::C::operator int12,342
+                  typedef C T;A::B::T14,389
+          typedef B T2;A::T216,414
+class String;20,437
+class A 23,453
+       class B A::B24,463
+               class C A::B::C25,474
+               int f(A::B::f26,488
+int A::B::f(31,521
+main(37,571
+       class D 41,622
+               D(D::D43,659
+
+el-src/TAGTEST.EL,148
+(foo::defmumble bletch 1,0
+(defalias 'pending-delete-mode pending-delete-mode5,102
+(defalias (quote explicitly-quoted-pending-delete-mode)8,175
+
+el-src/emacs/lisp/progmodes/etags.el,5188
+(defvar tags-file-name 34,1034
+(defgroup etags 43,1498
+(defcustom tags-case-fold-search 47,1566
+(defcustom tags-table-list 59,2051
+(defcustom tags-compression-info-list69,2449
+(defcustom tags-add-tables 88,3231
+(defcustom tags-revert-without-query 98,3627
+(defvar tags-table-computed-list 103,3778
+(defvar tags-table-computed-list-for 112,4262
+(defvar tags-table-list-pointer 117,4510
+(defvar tags-table-list-started-at 121,4701
+(defvar tags-table-set-list 124,4821
+(defcustom find-tag-hook 129,5000
+(defcustom find-tag-default-function 137,5263
+(define-obsolete-variable-alias 
'find-tag-marker-ring-lengthfind-tag-marker-ring-length145,5602
+(defcustom tags-tag-face 148,5699
+(defcustom tags-apropos-verbose 154,5834
+(defcustom tags-apropos-additional-actions 160,5998
+(defvaralias 'find-tag-marker-ring find-tag-marker-ring183,6917
+(defvar default-tags-table-function 189,7097
+(defvar tags-location-ring 194,7323
+(defvar tags-table-files 201,7599
+(defvar tags-completion-table 206,7766
+(defvar tags-included-tables 209,7858
+(defvar next-file-list 212,7953
+(defvar tags-table-format-functions 217,8059
+(defvar file-of-tag-function 224,8440
+(defvar tags-table-files-function 228,8634
+(defvar tags-completion-table-function 230,8745
+(defvar snarf-tag-function 232,8840
+(defvar goto-tag-location-function 236,9049
+(defvar find-tag-regexp-search-function 239,9222
+(defvar find-tag-regexp-tag-order 241,9343
+(defvar find-tag-regexp-next-line-after-failure-p 243,9452
+(defvar find-tag-search-function 245,9572
+(defvar find-tag-tag-order 247,9679
+(defvar find-tag-next-line-after-failure-p 249,9774
+(defvar list-tags-function 251,9880
+(defvar tags-apropos-function 253,9968
+(defvar tags-included-tables-function 255,10062
+(defvar verify-tags-table-function 257,10181
+(defun initialize-new-tags-table 260,10292
+(defun tags-table-mode 276,10980
+(defun visit-tags-table 285,11245
+(defun tags-table-check-computed-list 321,12783
+(defun tags-table-extend-computed-list 360,14654
+(defun tags-expand-table-name 400,16367
+(defun tags-table-list-member 409,16710
+(defun tags-verify-table 421,17182
+(defun tags-table-including 470,19302
+(defun tags-next-table 522,21346
+(defun visit-tags-table-buffer 543,22203
+(defun tags-reset-tags-tables 712,28513
+(defun file-of-tag 731,29170
+(defun tags-table-files 740,29519
+(defun tags-included-tables 749,29869
+(defun tags-completion-table 755,30115
+(defun tags-lazy-completion-table 783,31309
+(defun tags-completion-at-point-function 799,31944
+(defun find-tag-tag 818,32694
+(defvar last-tag 837,33367
+(defun find-tag-interactive 840,33426
+(defvar find-tag-history 852,33841
+(defvar etags-case-fold-search)855,33906
+(defvar etags-syntax-table)856,33938
+(defvar local-find-tag-hook)857,33966
+(defun find-tag-noselect 860,34011
+(defun find-tag 932,37125
+(defun find-tag-other-window 959,38341
+(defun find-tag-other-frame 1000,40269
+(defun find-tag-regexp 1025,41443
+(defalias 'pop-tag-mark pop-tag-mark1049,42605
+(defvar tag-lines-already-matched 1052,42656
+(defun find-tag-in-order 1055,42763
+(defun tag-find-file-of-tag-noselect 1167,47109
+(defun tag-find-file-of-tag 1200,48955
+(defun etags-recognize-tags-table 1208,49181
+(defun etags-verify-tags-table 1241,50812
+(defun etags-file-of-tag 1246,51010
+(defun etags-tags-completion-table 1256,51345
+(defun etags-snarf-tag 1286,52551
+(defun etags-goto-tag-location 1324,54120
+(defun etags-list-tags 1388,56563
+(defmacro tags-with-face 1423,57838
+(defun etags-tags-apropos-additional 1431,58171
+(defun etags-tags-apropos 1465,59408
+(defun etags-tags-table-files 1527,61617
+(defun etags-tags-included-tables 1542,62053
+(defun tags-recognize-empty-tags-table 1559,62593
+(defun tag-exact-file-name-match-p 1587,63739
+(defun tag-file-name-match-p 1596,64132
+(defun tag-exact-match-p 1609,64688
+(defun tag-implicit-name-match-p 1620,65256
+(defun tag-symbol-match-p 1633,65856
+(defun tag-word-match-p 1643,66292
+(defun tag-partial-file-name-match-p 1652,66690
+(defun tag-any-match-p 1662,67134
+(defun tag-re-match-p 1667,67318
+(defcustom tags-loop-revert-buffers 1675,67567
+(defun next-file 1685,67976
+(defvar tags-loop-operate 1760,70890
+(defvar tags-loop-scan1763,70984
+(defun tags-loop-eval 1771,71314
+(defun tags-loop-continue 1782,71643
+(defun tags-search 1850,73949
+(defun tags-query-replace 1871,74775
+(defun tags-complete-tags-table-file 1896,75999
+(defun list-tags 1906,76378
+(defun tags-apropos 1934,77331
+(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78157
+(defun select-tags-table 1964,78396
+(defvar select-tags-table-mode-map 2019,80523
+(define-derived-mode select-tags-table-mode 2030,80906
+(defun select-tags-table-select 2034,81090
+(defun select-tags-table-quit 2043,81456
+(defun complete-tag 2049,81611
+(defconst etags--xref-limit 2074,82552
+(defvar etags-xref-find-definitions-tag-order 2076,82587
+(defun etags-xref-find 2082,82877
+(defun etags--xref-find-definitions 2096,83406
+(defclass xref-etags-location 2129,85121
+(defun xref-make-etags-location 2135,85344
+(cl-defmethod xref-location-marker 2139,85499
+(cl-defmethod xref-location-line 2146,85743
+
+erl-src/gs_dialog.erl,98
+-define(VERSION2,32
+behaviour_info(51,2177
+show(124,5458
+dialog_loop(219,9529
+test(252,10806
+
+erl-src/lines.erl,386
+-define(BREAK66,2377
+-define(dbg68,2437
+new(73,2565
+count(80,2686
+nth(87,2815
+append(104,3301
+replace(119,3816
+insert(138,4559
+insert_after(165,5501
+delete(192,6456
+convert_to_list(215,7110
+convert_from_list(220,7259
+replace_nth(229,7518
+insert_nth(234,7618
+insert_after_nth(239,7711
+delete_nth(244,7828
+split_at(252,8027
+balance_left(267,8451
+balance_right(282,8865
+
+erl-src/lists.erl,593
+member(21,663
+append(30,790
+reverse(48,1099
+nth(59,1310
+nthtail(64,1382
+prefix(73,1546
+suffix(83,1707
+last(92,1882
+seq(101,2058
+sum(109,2265
+duplicate(116,2432
+min(124,2628
+max(132,2837
+sublist(141,3083
+delete(152,3329
+sort(161,3483
+split_and_sort(165,3559
+merge(175,3811
+concat(190,4219
+thing_to_list(195,4300
+flatten(204,4606
+flat_length(222,5003
+keymember(239,5451
+keysearch(246,5609
+keydelete(253,5770
+keyreplace(260,5923
+keysort(266,6113
+split_and_keysort(270,6229
+keymerge(277,6504
+keymap(288,6851
+map(311,7829
+foldl(315,7919
+foldr(320,8037
+zf(325,8155
+
+f-src/entry.for,172
+      LOGICAL FUNCTION PRTPKG 3,75
+       ENTRY  SETPRT 194,3866
+       ENTRY  MSGSEL 395,8478
+     & intensity1(577,12231
+       character*(*) function foo(579,12307
+
+f-src/entry.strange_suffix,172
+      LOGICAL FUNCTION PRTPKG 3,75
+       ENTRY  SETPRT 194,3866
+       ENTRY  MSGSEL 395,8478
+     & intensity1(577,12231
+       character*(*) function foo(579,12307
+
+f-src/entry.strange,103
+       ENTRY  MSGSEL 193,4382
+     & intensity1(375,8135
+       character*(*) function foo(377,8211
+
+forth-src/test-forth.fth,408
+: a-forth-word 20,301
+99 constant a-forth-constant!22,343
+55 value a-forth-value?23,373
+create :a-forth-dictionary-entry24,397
+defer #a-defer-word27,460
+: (another-forth-word)(another-forth-word29,481
+   9   field   >field136,582
+   5   field   >field237,605
+constant (a-forth-constant(a-forth-constant38,628
+2000 buffer: #some-storage41,657
+code assemby-code-word 43,685
+: a-forth-word 50,870
+
+html-src/softwarelibero.html,198
+Cos'� il software libero?4,38
+Licenze d'uso di un programmalicenze65,2474
+Sfatiamo alcuni miti138,6064
+Il movimento open sourceoss191,7968
+Impatto pratico del software liberoimpatto231,9986
+
+html-src/index.shtml,104
+&nbsp;8,281
+In evidenza15,446
+Comunicati e iniziative32,974
+Ultime notizie dall'associazione63,2027
+
+html-src/algrthms.html,467
+Tutorial on Convolutional Coding with Viterbi Decoding--Description of the 
Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and 
Quantizing Algorithms7,276
+Descriptionalgorithms10,477
+Generating the Datagenalgorithm48,1953
+Convolutionallyconalgorithm55,2463
+Nextstatetable262,11331
+Outputoutputtable350,13571
+Mapping the Channel Symbolsmapping433,15786
+Adding Noise to theaddnoise439,16174
+Quantizing the Receivedquantizing469,18637
+
+html-src/software.html,438
+Francesco Potort� Software Page9,280
+Software that I wrote for supporting my research activitysimulation36,1400
+MTGmtg41,1484
+Fracasfracas65,2626
+GaliLEOgalileo101,4234
+Leasqrleasqr114,4679
+Free software that I wrote for the GNU project or for my personal or 
workgnu142,6067
+Etagsetags148,6182
+checkiso161,6731
+cgrep178,7549
+debian-bug.eldebian-bug190,7981
+tcpdump205,8566
+Links to interesting softwarelinks216,8893
+
+java-src/AWTEMul.java,4356
+public class AWTEventMulticaster 63,2111
+    protected 
AWTEventMulticaster(AWTEventMulticaster.AWTEventMulticaster77,2555
+    protected EventListener remove(AWTEventMulticaster.remove86,2820
+    public void componentResized(AWTEventMulticaster.componentResized102,3294
+    public void componentMoved(AWTEventMulticaster.componentMoved112,3626
+    public void componentShown(AWTEventMulticaster.componentShown122,3952
+    public void componentHidden(AWTEventMulticaster.componentHidden132,4280
+    public void componentAdded(AWTEventMulticaster.componentAdded142,4619
+    public void componentRemoved(AWTEventMulticaster.componentRemoved152,4959
+    public void focusGained(AWTEventMulticaster.focusGained162,5281
+    public void focusLost(AWTEventMulticaster.focusLost172,5572
+    public void keyTyped(AWTEventMulticaster.keyTyped182,5853
+    public void keyPressed(AWTEventMulticaster.keyPressed192,6129
+    public void keyReleased(AWTEventMulticaster.keyReleased202,6413
+    public void mouseClicked(AWTEventMulticaster.mouseClicked212,6704
+    public void mousePressed(AWTEventMulticaster.mousePressed222,7004
+    public void mouseReleased(AWTEventMulticaster.mouseReleased232,7306
+    public void mouseEntered(AWTEventMulticaster.mouseEntered242,7609
+    public void mouseExited(AWTEventMulticaster.mouseExited252,7907
+    public void mouseDragged(AWTEventMulticaster.mouseDragged262,8204
+    public void mouseMoved(AWTEventMulticaster.mouseMoved272,8512
+    public void windowOpened(AWTEventMulticaster.windowOpened282,8819
+    public void windowClosing(AWTEventMulticaster.windowClosing292,9125
+    public void windowClosed(AWTEventMulticaster.windowClosed302,9432
+    public void windowIconified(AWTEventMulticaster.windowIconified312,9742
+    public void 
windowDeiconified(AWTEventMulticaster.windowDeiconified322,10064
+    public void windowActivated(AWTEventMulticaster.windowActivated332,10389
+    public void 
windowDeactivated(AWTEventMulticaster.windowDeactivated342,10712
+    public void actionPerformed(AWTEventMulticaster.actionPerformed352,11037
+    public void 
itemStateChanged(AWTEventMulticaster.itemStateChanged362,11356
+    public void 
adjustmentValueChanged(AWTEventMulticaster.adjustmentValueChanged372,11690
+    public void 
textValueChanged(AWTEventMulticaster.textValueChanged376,11874
+    public static ComponentListener add(AWTEventMulticaster.add387,12225
+    public static ContainerListener add(AWTEventMulticaster.add397,12571
+    public static FocusListener add(AWTEventMulticaster.add407,12901
+    public static KeyListener add(AWTEventMulticaster.add417,13207
+    public static MouseListener add(AWTEventMulticaster.add427,13513
+    public static MouseMotionListener add(AWTEventMulticaster.add437,13855
+    public static WindowListener add(AWTEventMulticaster.add447,14197
+    public static ActionListener add(AWTEventMulticaster.add457,14519
+    public static ItemListener add(AWTEventMulticaster.add467,14833
+    public static AdjustmentListener add(AWTEventMulticaster.add477,15163
+    public static TextListener add(AWTEventMulticaster.add480,15310
+    public static ComponentListener 
remove(AWTEventMulticaster.remove490,15664
+    public static ContainerListener 
remove(AWTEventMulticaster.remove500,16044
+    public static FocusListener remove(AWTEventMulticaster.remove510,16408
+    public static KeyListener remove(AWTEventMulticaster.remove520,16748
+    public static MouseListener remove(AWTEventMulticaster.remove530,17088
+    public static MouseMotionListener 
remove(AWTEventMulticaster.remove540,17465
+    public static WindowListener remove(AWTEventMulticaster.remove550,17841
+    public static ActionListener remove(AWTEventMulticaster.remove560,18197
+    public static ItemListener remove(AWTEventMulticaster.remove570,18545
+    public static AdjustmentListener 
remove(AWTEventMulticaster.remove580,18909
+    public static TextListener remove(AWTEventMulticaster.remove583,19062
+    protected static EventListener 
addInternal(AWTEventMulticaster.addInternal597,19608
+    protected static EventListener 
removeInternal(AWTEventMulticaster.removeInternal614,20244
+    protected void saveInternal(AWTEventMulticaster.saveInternal628,20582
+    static void save(AWTEventMulticaster.save646,21131
+
+java-src/KeyEve.java,698
+public class KeyEvent 36,1075
+    public KeyEvent(KeyEvent.KeyEvent234,9912
+    public KeyEvent(KeyEvent.KeyEvent252,10510
+    public int getKeyCode(KeyEvent.getKeyCode261,10836
+    public void setKeyCode(KeyEvent.setKeyCode265,10897
+    public void setKeyChar(KeyEvent.setKeyChar269,10978
+    public void setModifiers(KeyEvent.setModifiers273,11060
+    public char getKeyChar(KeyEvent.getKeyChar282,11331
+    public static String getKeyText(KeyEvent.getKeyText290,11561
+    public static String 
getKeyModifiersText(KeyEvent.getKeyModifiersText377,16662
+    public boolean isActionKey(KeyEvent.isActionKey403,17618
+    public String paramString(KeyEvent.paramString407,17704
+
+java-src/SMan.java,5533
+class SecurityManager 80,3387
+    public boolean getInCheck(SecurityManager.getInCheck101,4075
+    protected SecurityManager(SecurityManager.SecurityManager114,4497
+    protected native Class[] 
getClassContext(SecurityManager.getClassContext130,5038
+    protected native ClassLoader 
currentClassLoader(SecurityManager.currentClassLoader142,5529
+    protected Class 
currentLoadedClass(SecurityManager.currentLoadedClass149,5707
+    protected native int classDepth(SecurityManager.classDepth162,6167
+    protected native int 
classLoaderDepth(SecurityManager.classLoaderDepth174,6668
+    protected boolean inClass(SecurityManager.inClass184,7034
+    protected boolean inClassLoader(SecurityManager.inClassLoader196,7372
+    public Object 
getSecurityContext(SecurityManager.getSecurityContext221,8485
+    public void 
checkCreateClassLoader(SecurityManager.checkCreateClassLoader238,9069
+    public void checkAccess(SecurityManager.checkAccess268,10298
+    public void checkAccess(SecurityManager.checkAccess298,11632
+    public void checkExit(SecurityManager.checkExit323,12649
+    public void checkExec(SecurityManager.checkExec349,13734
+    public void checkLink(SecurityManager.checkLink375,14813
+    public void checkRead(SecurityManager.checkRead394,15485
+    public void checkRead(SecurityManager.checkRead412,16111
+    public void checkRead(SecurityManager.checkRead434,17017
+    public void checkWrite(SecurityManager.checkWrite453,17706
+    public void checkWrite(SecurityManager.checkWrite471,18337
+    public void checkDelete(SecurityManager.checkDelete493,19165
+    public void checkConnect(SecurityManager.checkConnect517,20119
+    public void checkConnect(SecurityManager.checkConnect543,21254
+    public void checkListen(SecurityManager.checkListen561,21910
+    public void checkAccept(SecurityManager.checkAccept585,22887
+    public void checkMulticast(SecurityManager.checkMulticast597,23272
+    public void checkMulticast(SecurityManager.checkMulticast610,23732
+    public void 
checkPropertiesAccess(SecurityManager.checkPropertiesAccess632,24609
+    public void 
checkPropertyAccess(SecurityManager.checkPropertyAccess654,25449
+    public boolean 
checkTopLevelWindow(SecurityManager.checkTopLevelWindow680,26580
+    public void 
checkPrintJobAccess(SecurityManager.checkPrintJobAccess689,26763
+    public void 
checkSystemClipboardAccess(SecurityManager.checkSystemClipboardAccess698,26958
+    public void 
checkAwtEventQueueAccess(SecurityManager.checkAwtEventQueueAccess707,27159
+    public void 
checkPackageAccess(SecurityManager.checkPackageAccess729,27966
+    public void 
checkPackageDefinition(SecurityManager.checkPackageDefinition751,28803
+    public void checkSetFactory(SecurityManager.checkSetFactory775,29929
+    public void checkMemberAccess(SecurityManager.checkMemberAccess786,30209
+    public void 
checkSecurityAccess(SecurityManager.checkSecurityAccess796,30430
+    private native Class 
currentLoadedClass0(SecurityManager.currentLoadedClass0800,30522
+    public ThreadGroup getThreadGroup(SecurityManager.getThreadGroup811,30923
+class NullSecurityManager 817,31025
+    public void 
checkCreateClassLoader(NullSecurityManager.checkCreateClassLoader818,31077
+    public void checkAccess(NullSecurityManager.checkAccess819,31123
+    public void checkAccess(NullSecurityManager.checkAccess820,31165
+    public void checkExit(NullSecurityManager.checkExit821,31212
+    public void checkExec(NullSecurityManager.checkExec822,31254
+    public void checkLink(NullSecurityManager.checkLink823,31296
+    public void checkRead(NullSecurityManager.checkRead824,31338
+    public void checkRead(NullSecurityManager.checkRead825,31387
+    public void checkRead(NullSecurityManager.checkRead826,31430
+    public void checkWrite(NullSecurityManager.checkWrite827,31489
+    public void checkWrite(NullSecurityManager.checkWrite828,31539
+    public void checkDelete(NullSecurityManager.checkDelete829,31583
+    public void checkConnect(NullSecurityManager.checkConnect830,31628
+    public void checkConnect(NullSecurityManager.checkConnect831,31684
+    public void checkListen(NullSecurityManager.checkListen832,31756
+    public void checkAccept(NullSecurityManager.checkAccept833,31798
+    public void checkMulticast(NullSecurityManager.checkMulticast834,31853
+    public void checkMulticast(NullSecurityManager.checkMulticast835,31907
+    public void 
checkPropertiesAccess(NullSecurityManager.checkPropertiesAccess836,31971
+    public void 
checkPropertyAccess(NullSecurityManager.checkPropertyAccess837,32015
+    public void 
checkPropertyAccess(NullSecurityManager.checkPropertyAccess838,32067
+    public boolean 
checkTopLevelWindow(NullSecurityManager.checkTopLevelWindow839,32131
+    public void 
checkPrintJobAccess(NullSecurityManager.checkPrintJobAccess840,32202
+    public void 
checkSystemClipboardAccess(NullSecurityManager.checkSystemClipboardAccess841,32244
+    public void 
checkAwtEventQueueAccess(NullSecurityManager.checkAwtEventQueueAccess842,32293
+    public void 
checkPackageAccess(NullSecurityManager.checkPackageAccess843,32340
+    public void 
checkPackageDefinition(NullSecurityManager.checkPackageDefinition844,32391
+    public void checkSetFactory(NullSecurityManager.checkSetFactory845,32446
+    public void 
checkMemberAccess(NullSecurityManager.checkMemberAccess846,32484
+    public void 
checkSecurityAccess(NullSecurityManager.checkSecurityAccess847,32546
+
+java-src/SysCol.java,336
+public final class SystemColor 37,1402
+    static SystemColor.static342,10478
+    private static void 
updateSystemColors(SystemColor.updateSystemColors349,10617
+    private SystemColor(SystemColor.SystemColor357,10885
+    public int getRGB(SystemColor.getRGB370,11245
+    public String toString(SystemColor.toString377,11388
+
+java-src/TG.java,2041
+class ThreadGroup 54,2104
+    private ThreadGroup(ThreadGroup.ThreadGroup72,2495
+    public ThreadGroup(ThreadGroup.ThreadGroup84,2848
+    public ThreadGroup(ThreadGroup.ThreadGroup105,3714
+    public final String getName(ThreadGroup.getName124,4189
+    public final ThreadGroup getParent(ThreadGroup.getParent135,4492
+    public final int getMaxPriority(ThreadGroup.getMaxPriority148,4867
+    public final boolean isDaemon(ThreadGroup.isDaemon161,5305
+    public synchronized boolean isDestroyed(ThreadGroup.isDestroyed170,5470
+    public final void setDaemon(ThreadGroup.setDaemon192,6368
+    public final void setMaxPriority(ThreadGroup.setMaxPriority213,7110
+    public final boolean parentOf(ThreadGroup.parentOf246,8106
+    public final void checkAccess(ThreadGroup.checkAccess268,8834
+    public int activeCount(ThreadGroup.activeCount283,9286
+    public int enumerate(ThreadGroup.enumerate322,10497
+    public int enumerate(ThreadGroup.enumerate344,11481
+    private int enumerate(ThreadGroup.enumerate348,11584
+    public int activeGroupCount(ThreadGroup.activeGroupCount389,12588
+    public int enumerate(ThreadGroup.enumerate425,13727
+    public int enumerate(ThreadGroup.enumerate445,14595
+    private int enumerate(ThreadGroup.enumerate449,14703
+    public final void stop(ThreadGroup.stop499,16212
+    public final void suspend(ThreadGroup.suspend537,17477
+    public final void resume(ThreadGroup.resume575,18749
+    public final void destroy(ThreadGroup.destroy607,19779
+    private final void add(ThreadGroup.add643,20704
+    private void remove(ThreadGroup.remove668,21402
+    void add(ThreadGroup.add697,22142
+    void remove(ThreadGroup.remove722,22808
+    public void list(ThreadGroup.list751,23503
+    void list(ThreadGroup.list754,23556
+    public void uncaughtException(ThreadGroup.uncaughtException810,25512
+    public boolean 
allowThreadSuspension(ThreadGroup.allowThreadSuspension823,25823
+    public String toString(ThreadGroup.toString837,26142
+
+lua-src/allegro.lua,400
+local function get_layer_by_name 7,175
+local function count_layers 33,621
+function GetLayerByName 54,980
+function GetUniqueLayerName 65,1204
+function SelectLayer 76,1415
+function NewLayer 86,1773
+function NewLayerSet 144,3226
+function RemoveLayer 170,3750
+function MoveLayerTop 211,4767
+function MoveLayerBottom 223,5079
+function MoveLayerBefore 236,5457
+function MoveLayerAfter 258,6090
+
+make-src/Makefile,1156
+LATEST=1,0
+NONSRCS=35,1578
+CPPFLAGS=49,2191
+LDFLAGS=50,2260
+FASTCFLAGS=55,2531
+FILTER=58,2642
+       @-$($72,3064
+       @-$($73,3113
+       @-$($74,3177
+       @-$($75,3223
+       @-$($76,3291
+       @-$($77,3383
+       @$(81,3466
+       @$(82,3514
+       @$(83,3577
+       @$(84,3622
+       @$(85,3689
+       @$(86,3780
+${CHECKOBJS}: CFLAGS=88,3806
+       @env CHECKEROPTS=92,3922
+       @$(98,4094
+       @$(106,4250
+       @$(110,4374
+       @$(114,4500
+       @for i in $(140,5315
+       @for i in $(SRCS); do echo $$i;140,5315
+       $(160,6053
+       $(163,6114
+       $(166,6177
+       $(169,6228
+       $(172,6317
+       sdiff --suppress-common-lines --width=width186,6614
+       sdiff --suppress-common-lines --width=width189,6703
+       sdiff --suppress-common-lines --width=width192,6791
+       sdiff --suppress-common-lines --width=width195,6880
+       TEXTAGS=204,7122
+       TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* 
--regex=regex204,7122
+       ${RUN} etags12 --members -o $@ --regex=regex207,7239
+       ${RUN} ./ctags -o $@ --regex=regex213,7388
+       ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=regex216,7464
+       TEXTAGS=219,7583
+       TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ 
--regex=regex219,7583
+       ${RUN} ./extags -e --regex-c=c222,7710
+
+objc-src/Subprocess.h,98
+#define Subprocess 41,1217
+#define BUFFERSIZE 43,1267
address@hidden Subprocess:Subprocess45,1292
+
+objc-src/Subprocess.m,505
+#define        PTY_TEMPLATE 20,494
+#define        PTY_LENGTH 21,528
+static void showError(23,551
address@hidden Subprocess(Private)Subprocess(Private)32,737
+- childDidExit39,851
+- fdHandler:67,1589
+showError 98,2360
+fdHandler 112,2785
+getptys 119,2907
+- init:183,4815
+    andStdErr:init:withDelegate:andPtySupport:andStdErr:197,5147
+- send:(const char *)string withNewline:send:withNewline:300,7436
+- send:308,7599
+- terminateInput314,7689
+- terminate:321,7810
+- setDelegate:332,7961
+- delegate338,8031
+
+objc-src/PackInsp.h,109
+#define NUMSTATS       36,1101
+#define TYPESTOSTAT    37,1120
address@hidden PackageInspector:PackageInspector39,1172
+
+objc-src/PackInsp.m,1360
+static const char RCSid[RCSid30,1032
+#define VERSION        34,1116
+#   define DEBUG 37,1155
+#define LISTCONTENTS   39,1181
+#define OPENBUTTON     47,1352
+#define LISTCONTENTSBUTTON     48,1449
+#define LISTDESCRIPTIONBUTTON  49,1562
+#define STATE_UNINSTALLED      52,1687
+#define STATE_INSTALLED        53,1807
+#define STATE_COMPRESSD        54,1948
+#define SIZEFORMAT     57,2152
+#define KBYTES 58,2362
+#define MBYTES 59,2473
+#define LOCALIZE(61,2585
+#define LOCALIZE_ARCH(62,2668
++newnew67,2802
+-showInfo:showInfo:93,3417
+-revert:revert:107,3737
+-ok:ok:136,4297
+-loadload143,4424
+#define LOOKUP(156,4826
+#undef LOOKUP176,5694
+-loadKeyValuesFrom:(const char *)type 
inTable:loadKeyValuesFrom:inTable:186,5852
+-loadContentsOf:(const char *)type inTable:loadContentsOf:inTable:238,7079
+-loadImageloadImage257,7552
+#define STAT_EQ(275,7940
+-(BOOL)shouldLoad280,8116
+-toggleDescriptiontoggleDescription301,8626
+-(const char *)getPath:(char *)buf forType:getPath:forType:317,8899
+-setRevertButtonTitlesetRevertButtonTitle333,9320
+-(const char *)formatSize:(const char *)size inBuf:formatSize:inBuf:344,9525
+#define WORKING        368,10045
+-(void)getArchs370,10100
+-(void)addArchs:385,10520
+-subprocess:(Subprocess *)sender output:subprocess:output:428,11351
+-subprocessDone:subprocessDone:436,11484
+static void openInWorkspace(446,11634
+-open:open:464,12063
+
+objcpp-src/SimpleCalc.H,41
address@hidden SimpleCalc:SimpleCalc14,400
+
+objcpp-src/SimpleCalc.M,300
+- init52,1747
+- appendToDisplay:60,1933
+- registerAction:70,2210
+- decimalKey:77,2348
+- numberKeys:91,2661
+- equalsKey:112,3192
+- operationKeys:131,3680
+- clearKey:153,4301
+- clearAllKey:160,4410
+- appDidInit:168,4591
+- windowWillClose:178,4882
+- infoPanel:186,5132
+- helpPanel:198,5482
+
+pas-src/common.pas,1875
+procedure InitializeStringPackage;26,527
+function newtextstring;34,874
+procedure disposetextstring;52,1404
+function ConcatT;78,2066
+function AppendTextString;112,3238
+function CopyTextString;132,3947
+procedure CONVERT_CHARSTRING_TO_VALUE;151,4505
+procedure append_string;172,5166
+function To_Upper;186,5462
+function To_Lower;194,5617
+function EmptyNmStr(209,6213
+function chartonmstr;219,6436
+function LowerCaseNmStr;230,6682
+function concatenatenamestrings;242,7007
+procedure writenamestring;263,7517
+function IsControlChar;277,7928
+function namestringequal;283,8079
+function NameStringLess;302,8539
+function IsControlCharName(343,9710
+function SubString;358,10208
+function SkipChars;379,10791
+function RemoveUnderlineControl;397,11311
+procedure First100Chars;427,12162
+procedure SkipSpaces;462,13298
+function SkipBlanks;477,13782
+function stripname;505,14595
+function Locate;522,15039
+function NameHasChar;543,15581
+function integertonmstr;561,16134
+function NmStrToInteger;585,16901
+function AddNullToNmStr;600,17317
+function ValToNmStr;611,17585
+function ChangeFileType;625,18037
+function StripPath;647,18734
+function ReprOfChar;675,19343
+procedure ExtractCommentInfo;702,20749
+procedure INSERT_TREE_NODE;784,24053
+function GetNameList;920,27926
+procedure DisposeANameList(925,28010
+procedure DisposeNameList;938,28340
+function GetNewNameListNode;943,28409
+function insertname;972,29051
+procedure InitNameList;988,29471
+procedure InitNameStringPool;998,29767
+procedure NewNameString;1004,29867
+procedure ReleaseNameString;1022,30232
+procedure SDTrefStringToRec 1045,30741
+procedure SDTrefSkipSpaces;1059,31092
+function SDTrefIsEnd 1070,31323
+function SDTrefGetInteger 1082,31529
+procedure SDTrefRecToString 1303,37546
+function NmStrToErrStr;1497,42305
+function ErrStrToNmStr;1509,42557
+function GetTextRef;1529,43112
+
+php-src/lce_functions.php,2152
+  define("LCE_FUNCTIONS"LCE_FUNCTIONS4,38
+  define("LCE_UNKNOWN"LCE_UNKNOWN9,145
+  define("LCE_WS"LCE_WS11,194
+  define("LCE_COMMENT"LCE_COMMENT13,244
+  define("LCE_COMMENT_USER"LCE_COMMENT_USER15,303
+  define("LCE_COMMENT_TOOL"LCE_COMMENT_TOOL17,366
+  define("LCE_MSGID"LCE_MSGID19,430
+  define("LCE_MSGSTR"LCE_MSGSTR21,488
+  define("LCE_TEXT"LCE_TEXT23,541
+  define("STATE_ABORT"STATE_ABORT25,567
+  define("STATE_OK"STATE_OK26,595
+  define("STATE_LOOP"STATE_LOOP27,620
+  class POEntryAD 29,648
+      function validate(31,683
+      function checkQuotation(59,1384
+  class CommentAD 70,1639
+      function CommentAD(73,1693
+      function validate(83,1944
+  class POEntry 105,2410
+      function POEntry(119,2711
+      function lineCount(135,3255
+      function serializeToVars(141,3365
+      function write(151,3800
+  class POReader 163,4178
+      function gettext(177,4457
+      function parseFromVars(189,4705
+      function serializeToVars(215,5331
+      function POReader(229,5613
+      function read(243,5983
+      function write(259,6307
+      function isComment(277,6645
+      function comment(284,6822
+      function msgid(304,7247
+      function msgstr(320,7574
+      function start(340,8232
+      function createPOEntries(360,8644
+      function stripLine(394,9472
+      function printClassification(421,10056
+      function classifyLine(432,10301
+  function getTextDomains(471,11094
+  class PORManager 498,11756
+      function PORManager(502,11822
+      function addPOReader(507,11896
+      function &getPOReader(getPOReader512,11992
+      function getDomainNames(517,12081
+  function &loadPORManager(loadPORManager523,12174
+  function fileJoin(536,12436
+      function lce_bindtextdomain(557,12839
+      function lce_textdomain(614,14530
+      function lce_gettext(620,14641
+      function lce_dgettext(626,14767
+      function lce(634,14966
+      function lce_bindtextdomain(651,15488
+      function lce_textdomain(656,15592
+      function lce_gettext(661,15674
+      function lce_dgettext(666,15755
+      function lce(670,15855
+  function lce_geteditcode(676,15898
+
+php-src/ptest.php,46
+define("TEST"TEST1,0
+test 4,26
+foo(16,200
+
+perl-src/htlmify-cystic,1443
+my @section_name;section_name12,236
+my @appendix_name;appendix_name13,254
+my @section_toc;section_toc15,274
+my @appendix_toc;appendix_toc16,291
+my $new_tag new_tag18,310
+my $appendix;appendix24,409
+my $section;section25,423
+my $subsection;subsection26,436
+my $subsubsection;subsubsection27,452
+my $this_file_toc this_file_toc29,472
+my %file_tocs;file_tocs30,496
+my @output_files output_files32,512
+my $file_index file_index33,535
+my $output_file;output_file35,556
+my $line;line37,574
+my $subsection_marker;subsection_marker161,3883
+my $new;new163,3907
+sub read_toc main::read_toc165,3917
+         my $entry entry218,5621
+         my $entry entry234,6077
+             my $entry entry245,6351
+         my $entry entry252,6536
+         my $entry entry268,7010
+             my $entry entry276,7204
+         my $entry entry281,7328
+      my $entry entry296,7698
+sub finish_subsubsections main::finish_subsubsections302,7805
+sub finish_subsections main::finish_subsections309,7987
+sub finish_sections main::finish_sections320,8310
+sub finish_appendices main::finish_appendices331,8599
+sub section_url_base main::section_url_base337,8724
+sub section_url_name main::section_url_name342,8922
+sub section_url main::section_url355,9284
+  my $name name357,9336
+sub section_href main::section_href364,9452
+sub section_name main::section_name368,9551
+sub toc_line main::toc_line372,9655
+sub file_end main::file_end375,9750
+
+perl-src/yagrip.pl,258
+sub getopt main::getopt7,156
+       local($_,$flag,$opt,$f,$r,@temp)($_,$flag,$opt,$f,$r,@temp8,169
+sub usage main::usage38,856
+       local($prog,$_,@list)($prog,$_,@list39,868
+       
local($string,$flag,@string,@temp,@last)($string,$flag,@string,@temp,@last40,897
+
+perl-src/kai-test.pl,244
+sub f1 main::f12,16
+sub main::f2 6,50
+package Foo;10,90
+sub f3 Foo::f312,104
+sub Bar::f4 16,138
+package Bar;20,177
+sub f5 Bar::f522,191
+package Foo::Bar;26,225
+sub f6 Foo::Bar::f628,244
+package main;32,278
+sub f7 main::f734,293
+
+perl-src/mirror.pl,13410
+sub msg_versionmain::msg_version459,18271
+       local( $arg )( $arg 468,18582
+               local( $flag, $p )( $flag, $p 480,18757
+               local( $site_path )( $site_path 525,19687
+                       local( $site, $path )( $site, $path 539,19958
+               local( $key_val )( $key_val 578,20743
+               local( $user )( $user 595,21097
+               local( $c )( $c 634,21853
+                       local( $sec,$min,$hour,$mday,$mon,$year,( 
$sec,$min,$hour,$mday,$mon,$year,678,22807
+       local( $c )( $c 706,23393
+       local( $dir, $mp )( $dir, $mp 723,23695
+               local( $f )( $f 725,23740
+sub interpret_config_filesmain::interpret_config_files756,24304
+       local( $fname )( $fname 758,24333
+sub interpret_configmain::interpret_config785,24927
+sub parse_linemain::parse_line827,25710
+       local( $eqpl )( $eqpl 829,25727
+       local( $cont )( $cont 830,25744
+                       local( $v )( $v 839,26029
+sub set_defaultsmain::set_defaults860,26448
+sub command_line_overridemain::command_line_override868,26579
+       local( $key, $val, $overrides )( $key, $val, $overrides 870,26607
+sub set_variablesmain::set_variables894,27072
+       local( $key, $val )( $key, $val 896,27092
+                       local( $val_name )( $val_name 902,27259
+               local( $val )( $val 953,28825
+sub upd_valmain::upd_val962,28974
+       local( $key )( $key 964,28988
+sub pr_variablesmain::pr_variables970,29083
+       local( $msg )( $msg 972,29102
+       local( $nle )( $nle 973,29123
+       local( $out )( $out 974,29144
+       local( $key, $val, $str )( $key, $val, $str 975,29164
+sub do_mirrormain::do_mirror1007,29923
+       local( $get_one_package )( $get_one_package 1009,29939
+       local( $exit_status )( $exit_status 1030,30384
+                       local( @t )( @t 1154,33165
+       local( $con )( $con 1241,35499
+               local( @rhelp )( @rhelp 1289,36702
+       local( @sub_dirs )( @sub_dirs 1329,37778
+       local( $now )( $now 1493,41348
+               local( $arg )( $arg 1506,41774
+sub disconnectmain::disconnect1528,42250
+sub connectmain::connect1546,42576
+       local( $attempts )( $attempts 1548,42590
+       local( $res )( $res 1549,42642
+sub prodmain::prod1573,43156
+sub checkout_regexpsmain::checkout_regexps1585,43327
+       local( $ret )( $ret 1587,43350
+       local( $t )( $t 1589,43395
+               local( $val )( $val 1597,43701
+                       local( $err )( $err 1601,43786
+sub clear_localmain::clear_local1610,43909
+sub clear_remotemain::clear_remote1625,44172
+sub get_local_directory_detailsmain::get_local_directory_details1640,44445
+       local( @dirs, $dir )( @dirs, $dir 1642,44479
+       local( $last_prodded )( $last_prodded 1643,44502
+       local( $dir_level )( $dir_level 1691,45615
+       local( $i )( $i 1692,45641
+       local( $path, $time, $size, $type, $mode, $name, $isdir, $value, 
$follow )( $path, $time, $size, $type, $mode, $name, $isdir, $value, $follow 
1693,45659
+       local( $dev,$ino,$fmode,$nlink,$uid,$gid,$rdev,$ssize,( 
$dev,$ino,$fmode,$nlink,$uid,$gid,$rdev,$ssize,1694,45736
+                       local( $mapi )( $mapi 1763,47586
+sub get_remote_directory_detailsmain::get_remote_directory_details1789,48122
+       local( $type_changed )( $type_changed 1791,48157
+       local( $udirtmp )( $udirtmp 1792,48186
+       local( $storename )( $storename 1793,48206
+       local( $rls )( $rls 1825,48944
+               local( $dirtmp )( $dirtmp 1830,49002
+               local( $unsquish )( $unsquish 1832,49130
+                       local( $f )( $f 1840,49360
+               local( $dirtmp )( $dirtmp 1859,49866
+               local( $unsquish )( $unsquish 1870,50215
+                       local( $f, $uf )( $f, $uf 1878,50445
+               local( $flags )( $flags 1912,51259
+       local( $parse_state )( $parse_state 1946,52111
+                       local( $msg )( $msg 1963,52486
+sub patch_ls_lR_filemain::patch_ls_lR_file1984,52955
+       local( $f, $fr, $flb, $flt, $flp, $flz, $frb, $frt )( $f, $fr, $flb, 
$flt, $flp, $flz, $frb, $frt 1990,53055
+       local( $to , $tn )( $to , $tn 1991,53110
+       local( $tlb )( $tlb 1995,53225
+               local( $p, $s, $trz, $t, $m )( $p, $s, $trz, $t, $m 2030,54182
+               local( $tlz )( $tlz 2037,54467
+sub parse_timeoutmain::parse_timeout2089,55670
+sub parse_remote_detailsmain::parse_remote_details2095,55754
+       local( $ret )( $ret 2097,55781
+       local( $old_sig )( $old_sig 2098,55797
+sub parse_remote_details_realmain::parse_remote_details_real2125,56234
+       local( $path, $size, $time, $type, $mode, $rdir, $rcwd )( $path, 
$size, $time, $type, $mode, $rdir, $rcwd 2127,56266
+       local( @dir_list )( @dir_list 2128,56325
+       local( $i )( $i 2129,56346
+       local( $old_path )( $old_path 2130,56364
+                               local( $old_path )( $old_path 2143,56630
+                               local( $ri )( $ri 2203,58078
+                       local( $mapi )( $mapi 2214,58335
+                       local( $done )( $done 2239,58911
+sub compare_dirsmain::compare_dirs2283,59825
+       local( *src_paths,( *src_paths,2286,59915
+       local( $src_path, $dest_path, $i )( $src_path, $dest_path, $i 
2293,60099
+       local( $last_prodded )( $last_prodded 2294,60136
+       local( $desti, $srci, $compress, $srciZ, $srcigz, $split, 
$dest_path_real )( $desti, $srci, $compress, $srciZ, $srcigz, $split, 
$dest_path_real 2299,60350
+       local( $old_dest_path, $existing_path, $tmp, $restart )( 
$old_dest_path, $existing_path, $tmp, $restart 2300,60428
+       local( $sp, $dp )( $sp, $dp 2301,60486
+                  local( $real, $reali, $reali1 )( $real, $reali, $reali1 
2352,62034
+                  local( $count )( $count 2353,62072
+                       local( $value )( $value 2408,63996
+                       local( $real )( $real 2409,64028
+                       local( $reali )( $reali 2410,64086
+                               local( $old )( $old 2421,64571
+                       local( $old_dest_path )( $old_dest_path 2432,64842
+                               local( $dpp, $dps )( $dpp, $dps 2509,67031
+               local( $update )( $update 2534,67671
+sub map_namemain::map_name2651,71028
+       local( $name )( $name 2653,71043
+               local( $old_name )( $old_name 2656,71089
+               local( $tmp )( $tmp 2666,71252
+sub set_timestampsmain::set_timestamps2675,71362
+       local( $src_path )( $src_path 2677,71383
+       local( $dest_path, $dest_loc_mapi, $src_rem_mapi,  $rtime )( 
$dest_path, $dest_loc_mapi, $src_rem_mapi,  $rtime 2685,71517
+sub set_timestampmain::set_timestamp2699,71901
+       local( $path, $time )( $path, $time 2701,71921
+       local( $pr_time )( $pr_time 2703,71953
+sub make_dirsmain::make_dirs2719,72284
+       local( $thing )( $thing 2721,72300
+sub make_symlinksmain::make_symlinks2736,72489
+       local( $thing )( $thing 2738,72509
+               local( $dest, $existing )( $dest, $existing 2745,72623
+               local( $dirpart )( $dirpart 2746,72663
+               local( $ft )( $ft 2747,72704
+               local( $p )( $p 2762,73261
+                       local( $f )( $f 2770,73467
+                       local( $dl )( $dl 2788,74038
+sub do_all_transfersmain::do_all_transfers2806,74439
+       local( $src_path )( $src_path 2808,74462
+       local( $dest_path, $attribs )( $dest_path, $attribs 2809,74483
+       local( $srci )( $srci 2810,74515
+               local( $newpath )( $newpath 2838,75124
+sub transfer_filemain::transfer_file2869,75847
+       local( $src_path, $dest_path, $attribs, $timestamp )( $src_path, 
$dest_path, $attribs, $timestamp 2871,75867
+       local( $dir, $file, $temp, $compress, $split, $restart, $mesg, 
$got_mesg )( $dir, $file, $temp, $compress, $split, $restart, $mesg, $got_mesg 
2872,75927
+               local( $src_file )( $src_file 2915,76782
+               local( $comptemp )( $comptemp 2916,76816
+                       local( $f )( $f 2921,76964
+               local($filesize)($filesize2944,77569
+                       local( $ti )( $ti 2975,78401
+               local( $f )( $f 2997,78887
+               local( $comp )( $comp 2998,78912
+       local( $filesize )( $filesize 3015,79427
+       local( $sizemsg )( $sizemsg 3016,79469
+       local( $srcsize )( $srcsize 3017,79501
+               local( $time )( $time 3029,79865
+       local( $as )( $as 3046,80223
+       local( $locali )( $locali 3054,80499
+sub filename_to_tempnamemain::filename_to_tempname3062,80713
+       local( $dir, $file )( $dir, $file 3064,80740
+       local ( $dest_path )( $dest_path 3066,80769
+sub log_uploadmain::log_upload3090,81228
+       local( $src_path, $dest_path, $got_mesg, $size )( $src_path, 
$dest_path, $got_mesg, $size 3092,81245
+sub do_deletesmain::do_deletes3118,81773
+       local( *src_paths,( *src_paths,3121,81861
+       local( $files_to_go, $dirs_to_go )( $files_to_go, $dirs_to_go 
3125,81960
+       local( $src_path, $i )( $src_path, $i 3131,82055
+       local( $orig_do_deletes )( $orig_do_deletes 3132,82080
+       local( $orig_save_deletes )( $orig_save_deletes 3133,82122
+       local( $del_patt )( $del_patt 3135,82169
+               local( $per )( $per 3162,82843
+               local( $per )( $per 3184,83513
+                       local( $save_dir_tail )( $save_dir_tail 3226,84617
+sub save_deletemain::save_delete3245,85019
+       local( $save, $kind )( $save, $kind 3247,85037
+       local( $real_save_dir, $save_dest )( $real_save_dir, $save_dest 
3249,85067
+       local( $dirname )( $dirname 3284,85704
+sub save_mkdirmain::save_mkdir3304,86155
+       local( $dir )( $dir 3306,86172
+sub do_deletemain::do_delete3320,86459
+       local( $del, $kind )( $del, $kind 3322,86475
+sub filesizemain::filesize3377,87532
+       local( $fname )( $fname 3379,87547
+sub istruemain::istrue3390,87654
+       local( $val )( $val 3392,87667
+sub mksymlinkmain::mksymlink3398,87773
+       local( $dest_path, $existing_path )( $dest_path, $existing_path 
3400,87789
+               local( $msg )( $msg 3417,88246
+               local( $msg )( $msg 3431,88590
+               local( $status )( $status 3442,88816
+sub mkdirsmain::mkdirs3457,89196
+       local( $dir )( $dir 3459,89209
+       local( @dir, $d, $path )( @dir, $d, $path 3460,89230
+sub make_dirmain::make_dir3497,90042
+       local( $dir, $mode )( $dir, $mode 3499,90057
+       local( $val )( $val 3500,90085
+sub dir_existsmain::dir_exists3528,90573
+       local( $dir )( $dir 3530,90590
+       local( $val )( $val 3531,90611
+               local($old_dir)($old_dir3539,90750
+sub set_attribsmain::set_attribs3553,91053
+       local( $path, $src_path, $type )( $path, $src_path, $type 3555,91071
+       local( $mode )( $mode 3556,91111
+               local( $pathi )( $pathi 3564,91229
+               local( $pathi )( $pathi 3568,91320
+sub get_passwdmain::get_passwd3606,91977
+       local( $user )( $user 3608,91994
+       local( $pass )( $pass 3609,92016
+       local( $| )( $| 3610,92033
+sub compare_timesmain::compare_times3631,92384
+       local( $t1, $t2 )( $t1, $t2 3637,92564
+       local( $diff )( $diff 3638,92589
+sub create_assocsmain::create_assocs3643,92688
+       local( $map )( $map 3645,92708
+sub delete_assocsmain::delete_assocs3657,92957
+       local( $map )( $map 3659,92977
+sub unlink_dbmmain::unlink_dbm3671,93247
+       local( $file )( $file 3673,93264
+sub bsplitmain::bsplit3681,93462
+       local( $temp, $dest_path, $time )( $temp, $dest_path, $time 3683,93475
+       local( $dest_dir )( $dest_dir 3684,93516
+       local( $bufsiz )( $bufsiz 3685,93558
+       local( $buffer, $in, $sofar )( $buffer, $in, $sofar 3686,93583
+       local( $d )( $d 3691,93721
+       local( $index )( $index 3697,93840
+       local( $part )( $part 3698,93865
+                       local( $locali )( $locali 3714,94336
+       local( $readme )( $readme 3730,94740
+sub sysmain::sys3739,95116
+       local( $com )( $com 3741,95126
+sub set_assoc_from_arraymain::set_assoc_from_array3751,95355
+       local( *things )( *things 3754,95453
+sub find_progmain::find_prog3760,95537
+       local( $prog )( $prog 3762,95553
+       local( $path )( $path 3763,95575
+               local( $path )( $path 3766,95657
+sub real_dir_from_pathmain::real_dir_from_path3780,95842
+       local( $program )( $program 3782,95867
+       local( @prog_path )( @prog_path 3783,95892
+       local( $dir )( $dir 3784,95970
+sub msgmain::msg3807,96489
+       local( $todo, $msg )( $todo, $msg 3809,96499
+sub to_bytesmain::to_bytes3838,96979
+       local( $size )( $size 3840,96994
+sub unix2vmsmain::unix2vms3858,97332
+       local( $v, $kind )( $v, $kind 3860,97347
+                       local( $dir, $rest )( $dir, $rest 3873,97559
+sub dirpartmain::dirpart3886,97730
+       local( $path )( $path 3888,97744
+sub expand_symlinkmain::expand_symlink3902,98076
+       local( $orig_path, $points_to )( $orig_path, $points_to 3904,98097
+       local( $dirpart )( $dirpart 3905,98136
+sub flatten_pathmain::flatten_path3913,98365
+       local( $path )( $path 3915,98384
+       local( $changed )( $changed 3916,98406
+       local( $i )( $i 3917,98430
+       local( $rooted )( $rooted 3919,98446
+       local( $count )( $count 3920,98482
+       local( $orig_path )( $orig_path 3921,98504
+               local( $in )( $in 3932,98741
+               local( @parts )( @parts 3933,98765
+sub fix_packagemain::fix_package3963,99438
+       local( $package )( $package 3965,99456
+sub will_compressmain::will_compress3970,99529
+sub will_splitmain::will_split3981,99859
+sub myflockmain::myflock3989,100001
+       local( $file, $kind )( $file, $kind 3991,100015
+sub t2strmain::t2str4004,100221
+       local( @t )( @t 4006,100233
+       
local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst4013,100335
+sub handlermain::handler4022,100583
+        local( $sig )( $sig 4029,100651
+        local( $msg )( $msg 4030,100679
+        local( $package, $filename, $line )( $package, $filename, $line 
4031,100737
+sub trap_signalsmain::trap_signals4036,100859
+       local( $sig )( $sig 4038,100878
+sub map_user_groupmain::map_user_group4047,101158
+sub keepmain::keep4069,101537
+       local( $pathi, $path, *keep, *keep_totals, *keep_map, $kind )( $pathi, 
$path, *keep, *keep_totals, *keep_map, $kind 4071,101548
+sub alarmmain::alarm4104,102330
+       local( $time_to_sig )( $time_to_sig 4106,102342
+sub chownmain::chown4110,102405
+       local( $uid, $gid, $path )( $uid, $gid, $path 4112,102417
+sub utimemain::utime4116,102494
+       local( $atime, $mtime, $path )( $atime, $mtime, $path 4118,102506
+       local( $old_mode )( $old_mode 4124,102685
+       local( $tmp_mode )( $tmp_mode 4125,102730
+       local( $ret )( $ret 4126,102763
+sub cwdmain::cwd4135,102913
+       local( $lcwd )( $lcwd 4137,102923
+
+ps-src/rfc1245.ps,2478
+/FMversion 12,311
+/FrameDict 17,500
+/FMVERSION 47,1307
+/FMLOCAL 56,1494
+/FMDOCUMENT 73,1766
+/FMBEGINPAGE 95,2279
+/FMENDPAGE 109,2516
+/FMDEFINEFONT 115,2582
+/FMNORMALIZEGRAPHICS 126,2725
+/FMBEGINEPSF 142,2955
+/FMENDEPSF 153,3207
+/setmanualfeed 158,3283
+/max 163,3386
+/min 164,3426
+/inch 165,3466
+/pagedimen 166,3485
+/setpapername 172,3629
+/papersize 190,4214
+/manualpapersize 211,4789
+/desperatepapersize 230,5211
+/savematrix 239,5370
+/restorematrix 242,5425
+/dmatrix 245,5475
+/dpi 246,5495
+/freq 248,5583
+/sangle 249,5658
+/DiacriticEncoding 250,5717
+/.notdef 251,5738
+/.notdef 252,5801
+/.notdef 253,5864
+/.notdef 254,5927
+/.notdef 255,5990
+/numbersign 256,6051
+/parenright 257,6115
+/two 258,6184
+/less 259,6251
+/L 260,6320
+/bracketright 261,6389
+/i 262,6459
+/braceright 263,6529
+/Ntilde 264,6598
+/atilde 265,6668
+/iacute 266,6733
+/ocircumflex 267,6797
+/udieresis 268,6858
+/paragraph 269,6919
+/dieresis 270,6983
+/yen 271,7050
+/ordfeminine 272,7109
+/exclamdown 273,7171
+/guillemotleft 274,7230
+/Otilde 275,7296
+/quoteleft 276,7357
+/fraction 277,7420
+/periodcentered 278,7490
+/Acircumflex 279,7549
+/Icircumflex 280,7610
+/Uacute 281,7680
+/breve 282,7746
+/ReEncode 284,7814
+/graymode 300,8020
+/setpattern 310,8184
+/grayness 331,8725
+/normalize 394,9873
+/dnormalize 397,9942
+/lnormalize 400,10014
+/H 403,10104
+/Z 406,10147
+/X 409,10176
+/V 412,10219
+/N 415,10260
+/M 418,10286
+/E 419,10315
+/D 420,10336
+/O 421,10358
+/L 423,10394
+/Y 430,10489
+/R 439,10588
+/RR 450,10696
+/C 467,10959
+/U 473,11004
+/F 477,11039
+/T 481,11084
+/RF 484,11115
+/TF 488,11164
+/P 495,11219
+/PF 499,11270
+/S 506,11344
+/SF 510,11384
+/B 517,11446
+/BF 521,11505
+/W 538,11714
+/G 573,12382
+/A 582,12525
+/BEGINPRINTCODE 606,12918
+/ENDPRINTCODE 615,13131
+/gn 620,13259
+/cfs 631,13384
+/ic 636,13473
+/ms 658,14285
+/ip 668,14395
+/wh 678,14492
+/bl 684,14607
+/s1 690,14722
+/fl 691,14739
+/hx 698,14887
+/wbytes 709,15055
+/BEGINBITMAPBWc 713,15147
+/BEGINBITMAPGRAYc 716,15198
+/BEGINBITMAP2BITc 719,15251
+/COMMONBITMAPc 722,15304
+/BEGINBITMAPBW 739,15660
+/BEGINBITMAPGRAY 742,15709
+/BEGINBITMAP2BIT 745,15760
+/COMMONBITMAP 748,15811
+/Fmcc 765,16156
+/ngrayt 773,16371
+/nredt 774,16393
+/nbluet 775,16414
+/ngreent 776,16436
+/colorsetup 787,16603
+/fakecolorsetup 814,17370
+/BITMAPCOLOR 826,17636
+/BITMAPCOLORc 839,17926
+/BITMAPGRAY 855,18275
+/BITMAPGRAYc 858,18335
+/ENDBITMAP 861,18397
+/fillprocs 868,18497
+
+prol-src/ordsets.prolog,525
+is_ordset(47,1310
+list_to_ord_set(63,1688
+ord_add_element(71,1867
+ord_del_element(85,2344
+ord_disjoint(100,2783
+ord_intersect(108,2953
+ord_intersection(126,3552
+ord_intersection3(130,3691
+ord_intersection(150,4531
+ord_intersection4(154,4703
+ord_intersection(176,5664
+ord_intersection2(181,5812
+ord_member(200,6318
+ord_seteq(216,6683
+ord_setproduct(225,6971
+ord_subset(240,7377
+ord_subtract(257,7861
+ord_symdiff(265,8054
+ord_union(288,8887
+ord_union4(303,9352
+ord_union(324,10171
+ord_union_all(329,10313
+
+prol-src/natded.prolog,2319
+expandmng(100,2879
+normalize(116,3359
+fresh_vars(125,3716
+subst(138,4134
+normalize_fresh(159,4660
+reduce_subterm(171,5112
+reduce(185,5559
+free_var(196,5903
+free_for(209,6246
+compile_lex(231,6875
+consult_lex:-consult_lex248,7384
+lex(259,7754
+expandsyn(267,8068
+bas_syn(292,8897
+compile_empty:-compile_empty310,9376
+complete(328,10055
+add_active(340,10527
+parse(353,10949
+derived_analyses(364,11341
+build(378,11965
+buildact(392,12521
+mapsyn(412,13542
+add_edge(434,14278
+findcats(447,14758
+normalize_tree(465,15478
+normalize_trees(475,15856
+expandmng_tree(486,16248
+expandmng_trees(496,16614
+cat(511,17013
+subtree(644,21266
+hypothetical_mem(653,21565
+make_coor(667,22130
+start_up:-start_up688,23013
+tokenizeatom(710,23921
+tokenize(720,24348
+isoperator(752,25377
+isoptab(756,25431
+specialsymbol(765,25756
+sstab(771,25861
+parse_cgi(787,26347
+keyvalseq(792,26510
+andkeyvalseq(796,26609
+keyval(799,26688
+valseq(807,26920
+plusvalseq(810,27007
+val(816,27109
+argvals(824,27426
+commaargvals(828,27503
+atomval(833,27578
+atom(836,27640
+action(846,28004
+keyvalcgi(864,28649
+keyvalscgi(865,28670
+outsyn(868,28726
+act(876,29060
+actout(901,29906
+texttreelist(912,30089
+htmltreelist(918,30190
+fitchtreelist(924,30304
+pp_html_table_tree(938,30759
+pp_html_tree(949,31113
+pp_html_trees(988,32381
+pp_html_table_fitch_tree(999,32769
+pp_html_fitch_tree(1017,33672
+removeexp(1129,39002
+splitexp(1142,39490
+pp_exp(1155,39990
+map_word(1168,40249
+pp_exps(1180,40474
+pp_tree(1188,40777
+pp_trees(1216,41807
+pp_word_list(1225,42128
+pp_word(1231,42262
+pp_word_list_rest(1238,42569
+pp_cat(1248,42929
+pp_syn(1255,43196
+pp_syn_paren(1276,43899
+pp_paren(1293,44377
+pp_syn_back(1300,44661
+pp_bas_cat(1311,45001
+writecat(1322,45409
+writesubs(1351,46455
+writesups(1361,46757
+writelistsubs(1371,47090
+pp_lam(1380,47408
+pp_lam_bracket(1398,48022
+pp_lam_paren(1407,48338
+pp_rule(1429,49238
+member(1447,49866
+append_list(1451,49919
+append(1456,50010
+at_least_one_member(1460,50076
+numbervars(1464,50171
+reverse(1467,50209
+select(1471,50290
+select_last(1475,50357
+cat_atoms(1479,50436
+writelist(1485,50524
+write_lex_cat(1492,50676
+writebreaklex(1500,50988
+write_lex(1513,51265
+writebreak(1521,51541
+tt:-tt1531,51713
+mt:-mt1534,51784
+cmt:-cmt1537,51878
+
+pyt-src/server.py,1438
+class Controls:Controls17,358
+    def __init__(18,374
+    def __repr__(24,590
+    def __str__(34,871
+class Server:Server37,934
+    def __init__(38,948
+    def dump(73,2198
+    def __repr__(125,3896
+    def __str__(128,3945
+class User:User131,4014
+    def __init__(132,4026
+    def __repr__(172,5445
+    def __str__(206,6883
+def flag2str(223,7212
+class LabeledEntry(232,7442
+    def bind(234,7525
+    def focus_set(236,7584
+    def __init__(238,7629
+def ButtonBar(245,7909
+def helpwin(255,8280
+class ListEdit(267,8707
+    def __init__(269,8808
+    def handleList(303,10042
+    def handleNew(306,10094
+    def editItem(314,10426
+    def deleteItem(320,10596
+def ConfirmQuit(326,10760
+class ControlEdit(375,12377
+    def PostControls(376,12403
+    def GatherControls(421,13530
+class ServerEdit(512,16264
+    def __init__(513,16289
+    def post(525,16629
+    def gather(543,17191
+    def nosave(547,17304
+    def save(551,17408
+    def refreshPort(556,17509
+    def createWidgets(561,17663
+    def edituser(631,20708
+class UserEdit(645,20921
+    def __init__(646,20944
+    def post(658,21283
+    def gather(676,21841
+    def nosave(680,21950
+    def save(684,22052
+    def createWidgets(689,22151
+class Configure(760,24879
+    def __init__(761,24916
+    def MakeDispose(772,25211
+    def MakeSitelist(786,25706
+    def editsite(794,25949
+    def save(797,26022
+    def nosave(807,26310
+
+tex-src/testenv.tex,52
+\newcommand{\nm}\nm4,77
+\section{blah}blah8,139
+
+tex-src/gzip.texi,303
address@hidden Top,62,2139
address@hidden Copying,80,2652
address@hidden Overview,83,2705
address@hidden Sample,166,7272
address@hidden Invoking gzip,Invoking gzip210,8828
address@hidden Advanced usage,Advanced usage357,13495
address@hidden Environment,420,15207
address@hidden Tapes,437,15768
address@hidden Problems,460,16767
address@hidden Concept Index,Concept Index473,17287
+
+tex-src/texinfo.tex,30626
+\def\texinfoversion{\texinfoversion25,1019
+\def\tie{\tie48,1510
+\def\gloggingall{\gloggingall71,2260
+\def\loggingall{\loggingall72,2329
+\def\onepageout#1{\onepageout98,3266
+\def\croppageout#1{\croppageout114,4016
+\def\cropmarks{\cropmarks141,5076
+\def\pagebody#1{\pagebody143,5123
+\def\ewtop{\ewtop156,5578
+\def\nstop{\nstop157,5642
+\def\ewbot{\ewbot159,5725
+\def\nsbot{\nsbot160,5789
+\def\parsearg #1{\parsearg169,6088
+\def\parseargx{\parseargx171,6166
+\def\parseargline{\parseargline181,6406
+\def\flushcr{\flushcr185,6527
+\newif\ifENV \ENVfalse \def\inENV{\inENV189,6726
+\def\ENVcheck{\ENVcheck190,6790
+\outer\def\begin{\begin197,7037
+\def\beginxxx #1{\beginxxx199,7075
+\def\end{\end207,7330
+\def\endxxx #1{\endxxx209,7358
+\def\errorE#1{\errorE215,7547
+\def\singlespace{\singlespace221,7741
address@hidden@231,7964
+\def\`{\`235,8064
+\def\'{\'236,8076
+\def\mylbrace {\mylbrace240,8124
+\def\myrbrace {\myrbrace241,8157
+\def\:{\:246,8271
+\def\*{\*249,8325
+\def\.{\.252,8401
+\def\w#1{\w257,8632
+\def\group{\group267,9115
+  \def\Egroup{\Egroup272,9279
+\def\need{\need288,9721
+\def\needx#1{\needx299,9998
+\def\dots{\dots338,11384
+\def\page{\page342,11448
+\def\exdent{\exdent352,11775
+\def\exdentyyy #1{\exdentyyy353,11808
+\def\nofillexdent{\nofillexdent356,11952
+\def\nofillexdentyyy #1{\nofillexdentyyy357,11997
+\def\include{\include364,12181
+\def\includezzz #1{\includezzz365,12216
+\def\thisfile{\thisfile368,12267
+\def\center{\center372,12330
+\def\centerzzz #1{\centerzzz373,12363
+\def\sp{\sp379,12505
+\def\spxxx #1{\spxxx380,12530
+\def\comment{\comment386,12704
+\def\commentxxx #1{\commentxxx389,12801
+\def\ignoresections{\ignoresections395,12970
+\let\chapter=\relax=\relax396,12992
+\let\section=\relax=\relax405,13237
+\let\subsection=\relax=\relax408,13298
+\let\subsubsection=\relax=\relax409,13321
+\let\appendix=\relax=\relax410,13347
+\let\appendixsec=\relaxsec=\relax411,13368
+\let\appendixsection=\relaxsection=\relax412,13392
+\let\appendixsubsec=\relaxsubsec=\relax413,13420
+\let\appendixsubsection=\relaxsubsection=\relax414,13447
+\let\appendixsubsubsec=\relaxsubsubsec=\relax415,13478
+\let\appendixsubsubsection=\relaxsubsubsection=\relax416,13508
+\def\ignore{\ignore422,13610
+\long\def\ignorexxx #1\end ignore{\ignorexxx426,13750
+\def\direntry{\direntry428,13809
+\long\def\direntryxxx #1\end direntry{\direntryxxx429,13848
+\def\ifset{\ifset433,13958
+\def\ifsetxxx #1{\ifsetxxx435,14016
+\def\Eifset{\Eifset439,14143
+\def\ifsetfail{\ifsetfail440,14157
+\long\def\ifsetfailxxx #1\end ifset{\ifsetfailxxx441,14213
+\def\ifclear{\ifclear443,14274
+\def\ifclearxxx #1{\ifclearxxx445,14336
+\def\Eifclear{\Eifclear449,14467
+\def\ifclearfail{\ifclearfail450,14483
+\long\def\ifclearfailxxx #1\end ifclear{\ifclearfailxxx451,14543
+\def\set{\set455,14694
+\def\setxxx #1{\setxxx456,14721
+\def\clear{\clear459,14783
+\def\clearxxx #1{\clearxxx460,14814
+\def\iftex{\iftex465,14931
+\def\Eiftex{\Eiftex466,14944
+\def\ifinfo{\ifinfo467,14958
+\long\def\ifinfoxxx #1\end ifinfo{\ifinfoxxx468,15008
+\long\def\menu #1\end menu{\menu470,15067
+\def\asis#1{\asis471,15096
+\def\math#1{\math484,15639
+\def\node{\node486,15683
+\def\nodezzz#1{\nodezzz487,15721
+\def\nodexxx[#1,#2]{\nodexxx[488,15752
+\def\donoderef{\donoderef491,15814
+\def\unnumbnoderef{\unnumbnoderef495,15935
+\def\appendixnoderef{\appendixnoderef499,16066
+\expandafter\expandafter\expandafter\appendixsetref{setref500,16112
+\let\refill=\relaxill=\relax503,16201
+\def\setfilename{\setfilename508,16415
+\outer\def\bye{\bye517,16661
+\def\inforef #1{\inforef519,16717
+\def\inforefzzz #1,#2,#3,#4**{\inforefzzz520,16755
+\def\losespace #1{\losespace522,16852
+\def\sf{\sf531,17056
+\font\defbf=cmbx10 scaled \magstep1 %was 1314bf=cmbx10557,17851
+\font\deftt=cmtt10 scaled \magstep1tt=cmtt10558,17897
+\def\df{\df559,17933
+\def\resetmathfonts{\resetmathfonts634,20527
+\def\textfonts{\textfonts647,21116
+\def\chapfonts{\chapfonts652,21331
+\def\secfonts{\secfonts657,21547
+\def\subsecfonts{\subsecfonts662,21752
+\def\indexfonts{\indexfonts667,21969
+\def\smartitalicx{\smartitalicx690,22701
+\def\smartitalic#1{\smartitalic691,22777
+\let\cite=\smartitalic=\smartitalic697,22922
+\def\b#1{\b699,22946
+\def\t#1{\t702,22981
+\def\samp #1{\samp705,23133
+\def\key #1{\key706,23166
+\def\ctrl #1{\ctrl707,23227
+\def\tclose#1{\tclose715,23429
+\def\ {\719,23595
+\def\xkey{\xkey727,23864
+\def\kbdfoo#1#2#3\par{\kbdfoo728,23880
+\def\dmn#1{\dmn737,24181
+\def\kbd#1{\kbd739,24208
+\def\l#1{\l741,24265
+\def\r#1{\r743,24294
+\def\sc#1{\sc745,24362
+\def\ii#1{\ii746,24405
+\def\titlefont#1{\titlefont754,24638
+\def\titlepage{\titlepage760,24741
+   \def\subtitlefont{\subtitlefont765,24968
+   \def\authorfont{\authorfont767,25052
+   \def\title{\title773,25262
+   \def\titlezzz##1{\titlezzz774,25297
+   \def\subtitle{\subtitle782,25612
+   \def\subtitlezzz##1{\subtitlezzz783,25653
+   \def\author{\author786,25771
+   \def\authorzzz##1{\authorzzz787,25808
+   \def\page{\page793,26099
+\def\Etitlepage{\Etitlepage803,26268
+\def\finishtitlepage{\finishtitlepage816,26656
+\def\evenheading{\evenheading845,27664
+\def\oddheading{\oddheading846,27707
+\def\everyheading{\everyheading847,27748
+\def\evenfooting{\evenfooting849,27794
+\def\oddfooting{\oddfooting850,27837
+\def\everyfooting{\everyfooting851,27878
+\def\headings #1 {\headings892,29570
+\def\HEADINGSoff{\HEADINGSoff894,29619
+\def\HEADINGSdouble{\HEADINGSdouble903,30046
+\def\HEADINGSsingle{\HEADINGSsingle913,30366
+\def\HEADINGSon{\HEADINGSon921,30587
+\def\HEADINGSafter{\HEADINGSafter923,30621
+\def\HEADINGSdoublex{\HEADINGSdoublex925,30716
+\def\HEADINGSsingleafter{\HEADINGSsingleafter932,30904
+\def\HEADINGSsinglex{\HEADINGSsinglex933,30965
+\def\today{\today942,31240
+\def\thistitle{\thistitle957,31785
+\def\settitle{\settitle958,31810
+\def\settitlezzz #1{\settitlezzz959,31847
+\def\internalBitem{\internalBitem991,32777
+\def\internalBitemx{\internalBitemx992,32827
+\def\internalBxitem "#1"{\internalBxitem994,32872
+\def\internalBxitemx "#1"{\internalBxitemx995,32952
+\def\internalBkitem{\internalBkitem997,33027
+\def\internalBkitemx{\internalBkitemx998,33079
+\def\kitemzzz #1{\kitemzzz1000,33126
+\def\xitemzzz #1{\xitemzzz1003,33228
+\def\itemzzz #1{\itemzzz1006,33331
+\def\item{\item1036,34402
+\def\itemx{\itemx1037,34453
+\def\kitem{\kitem1038,34506
+\def\kitemx{\kitemx1039,34559
+\def\xitem{\xitem1040,34614
+\def\xitemx{\xitemx1041,34667
+\def\description{\description1044,34777
+\def\table{\table1046,34827
+\def\ftable{\ftable1051,34971
+\def\Eftable{\Eftable1055,35117
+\def\vtable{\vtable1058,35186
+\def\Evtable{\Evtable1062,35332
+\def\dontindex #1{\dontindex1065,35401
+\def\fnitemindex #1{\fnitemindex1066,35421
+\def\vritemindex #1{\vritemindex1067,35466
+\def\tablez #1#2#3#4#5#6{\tablez1073,35615
+\def\Edescription{\Edescription1076,35673
+\def\itemfont{\itemfont1081,35875
+\def\Etable{\Etable1089,36101
+\def\itemize{\itemize1102,36425
+\def\itemizezzz #1{\itemizezzz1104,36461
+\def\itemizey #1#2{\itemizey1109,36556
+\def#2{1118,36802
+\def\itemcontents{\itemcontents1119,36843
+\def\bullet{\bullet1122,36891
+\def\minus{\minus1123,36918
+\def\frenchspacing{\frenchspacing1127,37026
+\def\splitoff#1#2\endmark{\splitoff1133,37251
+\def\enumerate{\enumerate1139,37481
+\def\enumeratezzz #1{\enumeratezzz1140,37520
+\def\enumeratey #1 #2\endenumeratey{\enumeratey1141,37573
+  \def\thearg{\thearg1145,37720
+  \ifx\thearg\empty \def\thearg{\thearg1146,37739
+\def\numericenumerate{\numericenumerate1183,39073
+\def\lowercaseenumerate{\lowercaseenumerate1189,39203
+\def\uppercaseenumerate{\uppercaseenumerate1202,39550
+\def\startenumeration#1{\startenumeration1218,40040
+\def\alphaenumerate{\alphaenumerate1226,40222
+\def\capsenumerate{\capsenumerate1227,40257
+\def\Ealphaenumerate{\Ealphaenumerate1228,40291
+\def\Ecapsenumerate{\Ecapsenumerate1229,40325
+\def\itemizeitem{\itemizeitem1233,40405
+\def\newindex #1{\newindex1258,41262
+\def\defindex{\defindex1267,41551
+\def\newcodeindex #1{\newcodeindex1271,41659
+\def\defcodeindex{\defcodeindex1278,41919
+\def\synindex #1 #2 {\synindex1282,42099
+\def\syncodeindex #1 #2 {\syncodeindex1291,42439
+\def\doindex#1{\doindex1308,43118
+\def\singleindexer #1{\singleindexer1309,43177
+\def\docodeindex#1{\docodeindex1312,43289
+\def\singlecodeindexer #1{\singlecodeindexer1313,43356
+\def\indexdummies{\indexdummies1315,43414
+\def\_{\_1316,43434
+\def\w{\w1317,43462
+\def\bf{\bf1318,43489
+\def\rm{\rm1319,43518
+\def\sl{\sl1320,43547
+\def\sf{\sf1321,43576
+\def\tt{\tt1322,43604
+\def\gtr{\gtr1323,43632
+\def\less{\less1324,43662
+\def\hat{\hat1325,43694
+\def\char{\char1326,43724
+\def\TeX{\TeX1327,43756
+\def\dots{\dots1328,43786
+\def\copyright{\copyright1329,43819
+\def\tclose##1{\tclose1330,43862
+\def\code##1{\code1331,43907
+\def\samp##1{\samp1332,43948
+\def\t##1{\t1333,43989
+\def\r##1{\r1334,44024
+\def\i##1{\i1335,44059
+\def\b##1{\b1336,44094
+\def\cite##1{\cite1337,44129
+\def\key##1{\key1338,44170
+\def\file##1{\file1339,44209
+\def\var##1{\var1340,44250
+\def\kbd##1{\kbd1341,44289
+\def\indexdummyfont#1{\indexdummyfont1346,44445
+\def\indexdummytex{\indexdummytex1347,44471
+\def\indexdummydots{\indexdummydots1348,44495
+\def\indexnofonts{\indexnofonts1350,44521
+\let\w=\indexdummyfontdummyfont1351,44541
+\let\t=\indexdummyfontdummyfont1352,44564
+\let\r=\indexdummyfontdummyfont1353,44587
+\let\i=\indexdummyfontdummyfont1354,44610
+\let\b=\indexdummyfontdummyfont1355,44633
+\let\emph=\indexdummyfontdummyfont1356,44656
+\let\strong=\indexdummyfontdummyfont1357,44682
+\let\cite=\indexdummyfont=\indexdummyfont1358,44710
+\let\sc=\indexdummyfontdummyfont1359,44736
+\let\tclose=\indexdummyfontdummyfont1363,44908
+\let\code=\indexdummyfontdummyfont1364,44936
+\let\file=\indexdummyfontdummyfont1365,44962
+\let\samp=\indexdummyfontdummyfont1366,44988
+\let\kbd=\indexdummyfontdummyfont1367,45014
+\let\key=\indexdummyfontdummyfont1368,45039
+\let\var=\indexdummyfontdummyfont1369,45064
+\let\TeX=\indexdummytexdummytex1370,45089
+\let\dots=\indexdummydotsdummydots1371,45113
+\let\indexbackslash=0  %overridden during \printindex.backslash=01381,45365
+\def\doind #1#2{\doind1383,45421
+{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1385,45464
+\def\rawbackslashxx{\rawbackslashxx1388,45604
+{\indexnofontsnofonts1393,45866
+\def\dosubind #1#2#3{\dosubind1404,46177
+{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1406,46225
+\def\rawbackslashxx{\rawbackslashxx1409,46329
+{\indexnofontsnofonts1413,46483
+\def\findex {\findex1442,47414
+\def\kindex {\kindex1443,47437
+\def\cindex {\cindex1444,47460
+\def\vindex {\vindex1445,47483
+\def\tindex {\tindex1446,47506
+\def\pindex {\pindex1447,47529
+\def\cindexsub {\cindexsub1449,47553
+\def\printindex{\printindex1461,47880
+\def\doprintindex#1{\doprintindex1463,47921
+  \def\indexbackslash{\indexbackslash1480,48406
+  \indexfonts\rm \tolerance=9500 \advance\baselineskip -1ptfonts\rm1481,48445
+\def\initial #1{\initial1516,49517
+\def\entry #1#2{\entry1522,49724
+  \null\nobreak\indexdotfill % Have leaders before the page 
number.dotfill1539,50371
+\def\indexdotfill{\indexdotfill1548,50699
+\def\primary #1{\primary1551,50805
+\def\secondary #1#2{\secondary1555,50887
+\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\pardotfill1558,50969
+\newbox\partialpageialpage1565,51142
+\def\begindoublecolumns{\begindoublecolumns1571,51300
+  \output={\global\setbox\partialpage=ialpage=1572,51336
+\def\enddoublecolumns{\enddoublecolumns1576,51524
+\def\doublecolumnout{\doublecolumnout1579,51609
+  address@hidden \advance\dimen@ by-\ht\partialpageialpage1580,51678
+\def\pagesofar{\pagesofar1583,51856
+\def\balancecolumns{\balancecolumns1587,52093
+  address@hidden \advance\availdimen@ by-\ht\partialpageialpage1593,52264
+     address@hidden \advance\dimen@ by-\ht\partialpageialpage1599,52525
+\newcount \appendixno  \appendixno = address@hidden,53430
+\def\appendixletter{\appendixletter1627,53471
+\def\opencontents{\opencontents1631,53574
+\def\thischapter{\thischapter1636,53755
+\def\seccheck#1{\seccheck1637,53793
+\def\chapternofonts{\chapternofonts1642,53897
+\def\result{\result1645,53972
+\def\equiv{\equiv1646,54007
+\def\expansion{\expansion1647,54040
+\def\print{\print1648,54081
+\def\TeX{\TeX1649,54114
+\def\dots{\dots1650,54143
+\def\copyright{\copyright1651,54174
+\def\tt{\tt1652,54215
+\def\bf{\bf1653,54242
+\def\w{\w1654,54270
+\def\less{\less1655,54295
+\def\gtr{\gtr1656,54326
+\def\hat{\hat1657,54355
+\def\char{\char1658,54384
+\def\tclose##1{\tclose1659,54415
+\def\code##1{\code1660,54459
+\def\samp##1{\samp1661,54499
+\def\r##1{\r1662,54539
+\def\b##1{\b1663,54573
+\def\key##1{\key1664,54607
+\def\file##1{\file1665,54645
+\def\kbd##1{\kbd1666,54685
+\def\i##1{\i1668,54793
+\def\cite##1{\cite1669,54827
+\def\var##1{\var1670,54867
+\def\emph##1{\emph1671,54905
+\def\dfn##1{\dfn1672,54945
+\def\thischaptername{\thischaptername1675,54986
+\outer\def\chapter{\chapter1676,55025
+\def\chapterzzz #1{\chapterzzz1677,55066
+{\chapternofonts%nofonts%1686,55462
+\global\let\section = \numberedsec=1691,55615
+\global\let\subsection = \numberedsubsec=1692,55650
+\global\let\subsubsection = \numberedsubsubsec=1693,55691
+\outer\def\appendix{\appendix1696,55742
+\def\appendixzzz #1{\appendixzzz1697,55785
+\global\advance \appendixno by 1 \message{no1699,55862
+\chapmacro {#1}{Appendix \appendixletter}letter1700,55931
+\xdef\thischapter{Appendix \appendixletter: 
\noexpand\thischaptername}letter:1703,56024
+{\chapternofonts%nofonts%1704,56096
+  {#1}{Appendix \appendixletter}letter1706,56152
+\appendixnoderef %noderef1709,56252
+\global\let\section = \appendixsec=1710,56271
+\global\let\subsection = \appendixsubsec=1711,56306
+\global\let\subsubsection = \appendixsubsubsec=1712,56347
+\outer\def\top{\top1715,56398
+\outer\def\unnumbered{\unnumbered1716,56438
+\def\unnumberedzzz #1{\unnumberedzzz1717,56485
+{\chapternofonts%nofonts%1721,56648
+\global\let\section = \unnumberedsec=1726,56798
+\global\let\subsection = \unnumberedsubsec=1727,56835
+\global\let\subsubsection = \unnumberedsubsubsec=1728,56878
+\outer\def\numberedsec{\numberedsec1731,56931
+\def\seczzz #1{\seczzz1732,56972
+{\chapternofonts%nofonts%1735,57128
+\outer\def\appendixsection{\appendixsection1744,57314
+\outer\def\appendixsec{\appendixsec1745,57371
+\def\appendixsectionzzz #1{\appendixsectionzzz1746,57424
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}letter1748,57536
+{\chapternofonts%nofonts%1749,57604
+{#1}{\appendixletter}letter1751,57660
+\appendixnoderef %noderef1754,57760
+\outer\def\unnumberedsec{\unnumberedsec1758,57800
+\def\unnumberedseczzz #1{\unnumberedseczzz1759,57853
+{\chapternofonts%nofonts%1761,57948
+\outer\def\numberedsubsec{\numberedsubsec1769,58116
+\def\numberedsubseczzz #1{\numberedsubseczzz1770,58171
+{\chapternofonts%nofonts%1773,58350
+\outer\def\appendixsubsec{\appendixsubsec1782,58554
+\def\appendixsubseczzz #1{\appendixsubseczzz1783,58609
+\subsecheading {#1}{\appendixletter}letter1785,58731
+{\chapternofonts%nofonts%1786,58796
+{#1}{\appendixletter}letter1788,58855
+\appendixnoderef %noderef1791,58970
+\outer\def\unnumberedsubsec{\unnumberedsubsec1795,59010
+\def\unnumberedsubseczzz #1{\unnumberedsubseczzz1796,59069
+{\chapternofonts%nofonts%1798,59170
+\outer\def\numberedsubsubsec{\numberedsubsubsec1806,59341
+\def\numberedsubsubseczzz #1{\numberedsubsubseczzz1807,59402
+{\chapternofonts%nofonts%1811,59599
+\outer\def\appendixsubsubsec{\appendixsubsubsec1822,59832
+\def\appendixsubsubseczzz #1{\appendixsubsubseczzz1823,59893
+  {\appendixletter}letter1826,60032
+{\chapternofonts%nofonts%1827,60098
+  {\appendixletter}letter1829,60163
+\appendixnoderef %noderef1833,60297
+\outer\def\unnumberedsubsubsec{\unnumberedsubsubsec1837,60337
+\def\unnumberedsubsubseczzz #1{\unnumberedsubsubseczzz1838,60402
+{\chapternofonts%nofonts%1840,60509
+\def\infotop{\infotop1850,60838
+\def\infounnumbered{\infounnumbered1851,60876
+\def\infounnumberedsec{\infounnumberedsec1852,60921
+\def\infounnumberedsubsec{\infounnumberedsubsec1853,60972
+\def\infounnumberedsubsubsec{\infounnumberedsubsubsec1854,61029
+\def\infoappendix{\infoappendix1856,61093
+\def\infoappendixsec{\infoappendixsec1857,61134
+\def\infoappendixsubsec{\infoappendixsubsec1858,61181
+\def\infoappendixsubsubsec{\infoappendixsubsubsec1859,61234
+\def\infochapter{\infochapter1861,61294
+\def\infosection{\infosection1862,61333
+\def\infosubsection{\infosubsection1863,61372
+\def\infosubsubsection{\infosubsubsection1864,61417
+\global\let\section = \numberedsec=1869,61654
+\global\let\subsection = \numberedsubsec=1870,61689
+\global\let\subsubsection = \numberedsubsubsec=1871,61730
+\def\majorheading{\majorheading1885,62237
+\def\majorheadingzzz #1{\majorheadingzzz1886,62282
+\def\chapheading{\chapheading1892,62515
+\def\chapheadingzzz #1{\chapheadingzzz1893,62558
+\def\heading{\heading1898,62753
+\def\subheading{\subheading1900,62790
+\def\subsubheading{\subsubheading1902,62833
+\def\dobreak#1#2{\dobreak1909,63110
+\def\setchapterstyle #1 {\setchapterstyle1911,63188
+\def\chapbreak{\chapbreak1918,63443
+\def\chappager{\chappager1919,63493
+\def\chapoddpage{\chapoddpage1920,63531
+\def\setchapternewpage #1 {\setchapternewpage1922,63610
+\def\CHAPPAGoff{\CHAPPAGoff1924,63667
+\def\CHAPPAGon{\CHAPPAGon1928,63761
+\global\def\HEADINGSon{\HEADINGSon1931,63852
+\def\CHAPPAGodd{\CHAPPAGodd1933,63894
+\global\def\HEADINGSon{\HEADINGSon1936,63990
+\def\CHAPFplain{\CHAPFplain1940,64044
+\def\chfplain #1#2{\chfplain1944,64136
+\def\unnchfplain #1{\unnchfplain1955,64359
+\def\unnchfopen #1{\unnchfopen1963,64588
+\def\chfopen #1#2{\chfopen1969,64796
+\def\CHAPFopen{\CHAPFopen1974,64940
+\def\subsecheadingbreak{\subsecheadingbreak1981,65158
+\def\secheadingbreak{\secheadingbreak1984,65287
+\def\secheading #1#2#3{\secheading1992,65569
+\def\plainsecheading #1{\plainsecheading1993,65625
+\def\secheadingi #1{\secheadingi1994,65668
+\def\subsecheading #1#2#3#4{\subsecheading2005,66036
+\def\subsecheadingi #1{\subsecheadingi2006,66103
+\def\subsubsecfonts{\subsubsecfonts2013,66400
+\def\subsubsecheading #1#2#3#4#5{\subsubsecheading2016,66523
+\def\subsubsecheadingi #1{\subsubsecheadingi2017,66601
+\def\startcontents#1{\startcontents2031,67073
+   \unnumbchapmacro{#1}\def\thischapter{\thischapter2039,67346
+\outer\def\contents{\contents2048,67705
+\outer\def\summarycontents{\summarycontents2056,67849
+      \def\secentry ##1##2##3##4{\secentry2066,68220
+      \def\unnumbsecentry ##1##2{\unnumbsecentry2067,68255
+      \def\subsecentry ##1##2##3##4##5{\subsecentry2068,68290
+      \def\unnumbsubsecentry ##1##2{\unnumbsubsecentry2069,68331
+      \def\subsubsecentry ##1##2##3##4##5##6{\subsubsecentry2070,68369
+      \def\unnumbsubsubsecentry ##1##2{\unnumbsubsubsecentry2071,68416
+\def\chapentry#1#2#3{\chapentry2084,68850
+\def\shortchapentry#1#2#3{\shortchapentry2087,68967
+    {#2\labelspace #1}space2090,69077
+\def\unnumbchapentry#1#2{\unnumbchapentry2093,69131
+\def\shortunnumberedentry#1#2{\shortunnumberedentry2094,69178
+\def\secentry#1#2#3#4{\secentry2101,69342
+\def\unnumbsecentry#1#2{\unnumbsecentry2102,69401
+\def\subsecentry#1#2#3#4#5{\subsecentry2105,69462
+\def\unnumbsubsecentry#1#2{\unnumbsubsecentry2106,69532
+\def\subsubsecentry#1#2#3#4#5#6{\subsubsecentry2109,69606
+  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}space2110,69640
+\def\unnumbsubsubsecentry#1#2{\unnumbsubsubsecentry2111,69691
+\def\dochapentry#1#2{\dochapentry2122,70065
+\def\dosecentry#1#2{\dosecentry2137,70670
+\def\dosubsecentry#1#2{\dosubsecentry2144,70848
+\def\dosubsubsecentry#1#2{\dosubsubsecentry2151,71033
+\def\labelspace{\labelspace2159,71284
+\def\dopageno#1{\dopageno2161,71319
+\def\doshortpageno#1{\doshortpageno2162,71345
+\def\chapentryfonts{\chapentryfonts2164,71377
+\def\secentryfonts{\secentryfonts2165,71412
+\def\point{\point2191,72371
+\def\result{\result2193,72392
+\def\expansion{\expansion2194,72465
+\def\print{\print2195,72536
+\def\equiv{\equiv2197,72603
+\def\error{\error2217,73376
+\def\tex{\tex2223,73605
address@hidden@2241,73988
+\gdef\sepspaces{\def {\ }}}\2264,74720
+\def\aboveenvbreak{\aboveenvbreak2267,74802
+\def\afterenvbreak{\afterenvbreak2271,74968
+\def\ctl{\ctl2285,75479
+\def\ctr{\ctr2286,75551
+\def\cbl{\cbl2287,75590
+\def\cbr{\cbr2288,75630
+\def\carttop{\carttop2289,75669
+\def\cartbot{\cartbot2292,75777
+\long\def\cartouche{\cartouche2298,75917
+\def\Ecartouche{\Ecartouche2325,76705
+\def\lisp{\lisp2337,76840
+\def\Elisp{\Elisp2347,77187
+\def\next##1{\next2359,77513
+\def\Eexample{\Eexample2363,77555
+\def\Esmallexample{\Esmallexample2366,77602
+\def\smalllispx{\smalllispx2372,77780
+\def\Esmalllisp{\Esmalllisp2382,78134
+\obeyspaces \obeylines \ninett \indexfonts \rawbackslashfonts2395,78490
+\def\next##1{\next2396,78547
+\def\display{\display2400,78627
+\def\Edisplay{\Edisplay2409,78946
+\def\next##1{\next2421,79257
+\def\format{\format2425,79360
+\def\Eformat{\Eformat2433,79656
+\def\next##1{\next2436,79745
+\def\flushleft{\flushleft2440,79797
+\def\Eflushleft{\Eflushleft2450,80168
+\def\next##1{\next2453,80261
+\def\flushright{\flushright2455,80283
+\def\Eflushright{\Eflushright2465,80655
+\def\next##1{\next2469,80786
+\def\quotation{\quotation2473,80844
+\def\Equotation{\Equotation2479,81036
+\def\setdeffont #1 {\setdeffont2492,81434
+\newskip\defbodyindent \defbodyindent=.4inbodyindent2494,81480
+\newskip\defargsindent \defargsindent=50ptargsindent2495,81523
+\newskip\deftypemargin \deftypemargin=12pttypemargin2496,81566
+\newskip\deflastargmargin \deflastargmargin=18ptlastargmargin2497,81609
+\def\activeparens{\activeparens2502,81807
+\def\opnr{\opnr2528,83019
+\def\lbrb{\lbrb2529,83084
+\def\defname #1#2{\defname2535,83285
+\advance\dimen2 by -\defbodyindentbodyindent2539,83403
+\advance\dimen3 by -\defbodyindentbodyindent2541,83457
+\setbox0=\hbox{\hskip \deflastargmargin{lastargmargin2543,83511
+\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for 
continuationsargsindent2545,83653
+\parshape 2 0in \dimen0 \defargsindent \dimen1     %argsindent2546,83728
+\rlap{\rightline{{\rm #2}\hskip \deftypemargin}typemargin2553,84097
+\advance\leftskip by -\defbodyindentbodyindent2556,84231
+\exdentamount=\defbodyindentbodyindent2557,84268
+\def\defparsebody #1#2#3{\defparsebody2567,84627
+\def#1{2571,84811
+\def#2{2572,84847
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2574,84919
+\exdentamount=\defbodyindentbodyindent2575,84993
+\def\defmethparsebody #1#2#3#4 {\defmethparsebody2580,85097
+\def#1{2584,85258
+\def#2##1 {2585,85294
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2587,85377
+\exdentamount=\defbodyindentbodyindent2588,85451
+\def\defopparsebody #1#2#3#4#5 {\defopparsebody2591,85536
+\def#1{2595,85697
+\def#2##1 ##2 {2596,85733
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2599,85833
+\exdentamount=\defbodyindentbodyindent2600,85907
+\def\defvarparsebody #1#2#3{\defvarparsebody2607,86178
+\def#1{2611,86365
+\def#2{2612,86401
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2614,86460
+\exdentamount=\defbodyindentbodyindent2615,86534
+\def\defvrparsebody #1#2#3#4 {\defvrparsebody2620,86625
+\def#1{2624,86784
+\def#2##1 {2625,86820
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2627,86890
+\exdentamount=\defbodyindentbodyindent2628,86964
+\def\defopvarparsebody #1#2#3#4#5 {\defopvarparsebody2631,87036
+\def#1{2635,87200
+\def#2##1 ##2 {2636,87236
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2639,87323
+\exdentamount=\defbodyindentbodyindent2640,87397
+\def\defunargs #1{\defunargs2663,88157
+\def\deftypefunargs #1{\deftypefunargs2675,88539
+\def\deffn{\deffn2689,88921
+\def\deffnheader #1#2#3{\deffnheader2691,88978
+\begingroup\defname {name2692,89026
+\def\defun{\defun2698,89171
+\def\defunheader #1#2{\defunheader2700,89224
+\begingroup\defname {name2701,89299
+\defunargs {unargs2702,89335
+\def\deftypefun{\deftypefun2708,89483
+\def\deftypefunheader #1#2{\deftypefunheader2711,89605
+\def\deftypefunheaderx #1#2 #3\relax{\deftypefunheaderx2713,89714
+\begingroup\defname {name2715,89806
+\deftypefunargs {typefunargs2716,89852
+\def\deftypefn{\deftypefn2722,90023
+\def\deftypefnheader #1#2#3{\deftypefnheader2725,90172
+\def\deftypefnheaderx #1#2#3 #4\relax{\deftypefnheaderx2727,90308
+\begingroup\defname {name2729,90401
+\deftypefunargs {typefunargs2730,90441
+\def\defmac{\defmac2736,90562
+\def\defmacheader #1#2{\defmacheader2738,90619
+\begingroup\defname {name2739,90695
+\defunargs {unargs2740,90728
+\def\defspec{\defspec2746,90852
+\def\defspecheader #1#2{\defspecheader2748,90913
+\begingroup\defname {name2749,90990
+\defunargs {unargs2750,91030
+\def\deffnx #1 {\deffnx2757,91225
+\def\defunx #1 {\defunx2758,91282
+\def\defmacx #1 {\defmacx2759,91339
+\def\defspecx #1 {\defspecx2760,91398
+\def\deftypefnx #1 {\deftypefnx2761,91459
+\def\deftypeunx #1 {\deftypeunx2762,91524
+\def\defop #1 {\defop2768,91670
+\defopparsebody\Edefop\defopx\defopheader\defoptype}opparsebody\Edefop\defopx\defopheader\defoptype2769,91705
+\def\defopheader #1#2#3{\defopheader2771,91759
+\begingroup\defname {name2773,91848
+\defunargs {unargs2774,91894
+\def\defmethod{\defmethod2779,91955
+\def\defmethodheader #1#2#3{\defmethodheader2781,92028
+\begingroup\defname {name2783,92116
+\defunargs {unargs2784,92156
+\def\defcv #1 {\defcv2789,92230
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype2790,92265
+\def\defcvarheader #1#2#3{\defcvarheader2792,92324
+\begingroup\defname {name2794,92410
+\defvarargs {varargs2795,92456
+\def\defivar{\defivar2800,92529
+\def\defivarheader #1#2#3{\defivarheader2802,92592
+\begingroup\defname {name2804,92678
+\defvarargs {varargs2805,92729
+\def\defopx #1 {\defopx2811,92878
+\def\defmethodx #1 {\defmethodx2812,92935
+\def\defcvx #1 {\defcvx2813,93000
+\def\defivarx #1 {\defivarx2814,93057
+\def\defvarargs #1{\defvarargs2821,93328
+\def\defvr{\defvr2827,93472
+\def\defvrheader #1#2#3{\defvrheader2829,93527
+\begingroup\defname {name2830,93575
+\def\defvar{\defvar2834,93660
+\def\defvarheader #1#2{\defvarheader2836,93720
+\begingroup\defname {name2837,93791
+\defvarargs {varargs2838,93827
+\def\defopt{\defopt2843,93893
+\def\defoptheader #1#2{\defoptheader2845,93953
+\begingroup\defname {name2846,94024
+\defvarargs {varargs2847,94063
+\def\deftypevar{\deftypevar2852,94120
+\def\deftypevarheader #1#2{\deftypevarheader2855,94236
+\begingroup\defname {name2857,94319
+\def\deftypevr{\deftypevr2864,94493
+\def\deftypevrheader #1#2#3{\deftypevrheader2866,94564
+\begingroup\defname {name2867,94616
+\def\defvrx #1 {\defvrx2875,94853
+\def\defvarx #1 {\defvarx2876,94910
+\def\defoptx #1 {\defoptx2877,94969
+\def\deftypevarx #1 {\deftypevarx2878,95028
+\def\deftypevrx #1 {\deftypevrx2879,95095
+\def\deftpargs #1{\deftpargs2884,95244
+\def\deftp{\deftp2888,95324
+\def\deftpheader #1#2#3{\deftpheader2890,95379
+\begingroup\defname {name2891,95427
+\def\deftpx #1 {\deftpx2896,95586
+\def\setref#1{\setref2907,95907
+\def\unnumbsetref#1{\unnumbsetref2912,96021
+\def\appendixsetref#1{\appendixsetref2917,96128
+\def\pxref#1{\pxref2928,96539
+\def\xref#1{\xref2929,96575
+\def\ref#1{\ref2930,96610
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\xrefX[2931,96640
+\def\printedmanual{\printedmanual2932,96683
+\def\printednodename{\printednodename2933,96721
+\def\printednodename{\printednodename2938,96846
+section ``\printednodename'' in \cite{\printedmanual}\printedmanual2953,97479
+\refx{x2956,97557
+\def\dosetq #1#2{\dosetq2964,97777
+\def\internalsetq #1#2{\internalsetq2972,98035
+\def\Ypagenumber{\Ypagenumber2976,98136
+\def\Ytitle{\Ytitle2978,98162
+\def\Ynothing{\Ynothing2980,98189
+\def\Ysectionnumberandtype{\Ysectionnumberandtype2982,98206
+\def\Yappendixletterandtype{\Yappendixletterandtype2991,98522
+\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{no2992,98552
+\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno 
%no.\the\secno2993,98607
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno 
%no.\the\secno.\the\subsecno2995,98711
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno 
%no.\the\secno.\the\subsecno.\the\subsubsecno2997,98782
+  \def\linenumber{\linenumber3008,99121
+\def\refx#1#2{\refx3014,99305
+\def\xrdef #1#2{\xrdef3036,99931
+\def\readauxfile{\readauxfile3039,100016
+\def\supereject{\supereject3109,101797
+\footstrut\parindent=\defaultparindent\hang\textindent{aultparindent\hang\textindent3130,102482
+\def\openindices{\openindices3138,102668
+\newdimen\defaultparindent \defaultparindent = 15ptaultparindent3150,102893
+\parindent = \defaultparindentaultparindent3151,102945
+\def\smallbook{\smallbook3174,103669
+\global\def\Esmallexample{\Esmallexample3191,104096
+\def\afourpaper{\afourpaper3195,104187
+\def\finalout{\finalout3223,104995
+\def\normaldoublequote{\normaldoublequote3234,105256
+\def\normaltilde{\normaltilde3235,105282
+\def\normalcaret{\normalcaret3236,105302
+\def\normalunderscore{\normalunderscore3237,105322
+\def\normalverticalbar{\normalverticalbar3238,105347
+\def\normalless{\normalless3239,105373
+\def\normalgreater{\normalgreater3240,105392
+\def\normalplus{\normalplus3241,105414
+\def\ifusingtt#1#2{\ifusingtt3252,105906
+\def\activedoublequote{\activedoublequote3260,106234
+\def~{~3263,106320
+\def^{^3266,106381
+\def_{_3269,106420
+\def\_{\_3271,106494
+\def\lvvmode{\lvvmode3278,106831
+\def|{|3281,106881
+\def<{<3284,106944
+\def>{>3287,107001
+\def+{+3289,107039
+\def\turnoffactive{\turnoffactive3295,107200
+\global\def={=3306,107486
+\def\normalbackslash{\normalbackslash3320,107868
+
+c-src//c.c,76
+T f(1,0
+}T i;2,14
+void bar(5,69
+int foobar(6,94
+interface_locate(9,131
+
+c.c,1836
+void (*fa)fa131,
+void 132,
+my_printf 135,
+void fatala 138,
+void fatalb 139,
+max 141,
+struct bar 143,
+__attribute__ ((always_inline)) max 147,
+extern int old_var 149,
+struct foo150,
+char stack[stack155,
+struct S 156,
+} wait_status_ptr_t 161,
+Some_Class  A 162,
+typedef T1 T3 163,
+T3 z 164,
+typedef int more_aligned_int 165,
+struct S  __attribute__ ((vector_size (16))) foo;166,
+int foo 167,
+char *__attribute__((aligned(8))) *f;f168,
+int i 169,
+extern void foobar 170,
+typedef struct cacheLRUEntry_s172,
+__attribute__ ((packed)) cacheLRUEntry_t;177,
+struct foo 178,
+     f1 183,
+void f2 184,
+__attribute__((noreturn)) void d0 185,
+  __attribute__((format(printf, 1, 2))) d1 186,
+  d2 187,
+int x 188,
+struct foo 189,
+short array[array190,
+int f193,
+DEAFUN 196,
+XDEFUN 203,
+DEFUN ("x-get-selection-internal", 
Fx_get_selection_internal,x-get-selection-internal206,
+       Fx_get_selection_internal,x-get-selection-internal212,
+      Fy_get_selection_internal,y-get-selection-internal216,
+defun_func1(218,
+DEFUN_func2(220,
+typedef int bool;222,
+bool funcboo 223,
+struct my_struct 226,
+typedef struct my_struct my_typedef;228,
+int bla 229,
+a(234,
+int func1237,
+static struct cca_control init_control 239,
+static tpcmd rbtp 240,
+static byte ring1 241,
+static byte ring2 242,
+request request 243,
+int func2 246,
+  aaa;249,
+  bbb;251,
+struct sss1 252,
+struct sss2253,
+  struct ss3255,
+struct a b;259,
+struct aa *b;b260,
+  **b;b262,
+caccacacca 263,
+a 267,
+  typedef struct aa 269,
+  typedef struct aa {} aaa;269,
+static void inita 271,
+node *lasta lasta272,
+b 273,
+  typedef  int bb;275,
+static void initb 277,
+node *lastb lastb278,
+typedef enum { REG_ENOSYS 279,
+typedef enum { REG_ENOSYS = -1, aa 279,
+typedef enum { REG_ENOSYS = -1, aa } reg_errcode_t;279,
+
+c-src/a/b/b.c,18
+#define this 1,0
+
+../c/c.web,20
+#define questo 34,
+
+y-src/parse.y,1061
+#define obstack_chunk_alloc 46,1111
+#define obstack_chunk_free 47,1149
+int yylex 57,1317
+void yyerror 59,1347
+void yyerror 61,1376
+VOIDSTAR parse_hash;63,1400
+extern VOIDSTAR hash_find(64,1421
+unsigned char fnin[fnin67,1519
+#define YYSTYPE 71,1617
+typedef struct node *YYSTYPE;YYSTYPE72,1648
+YYSTYPE parse_return;73,1678
+YYSTYPE make_list 75,1716
+YYSTYPE make_list 77,1760
+char *instr;instr80,1790
+int parse_error 81,1803
+extern struct obstack tmp_mem;82,1824
+line:line86,1862
+exp:exp94,1975
+exp_list:exp_list262,5642
+range_exp:range_exp268,5740
+range_exp_list:range_exp_list272,5770
+cell:cell278,5888
+yyerror FUN1(285,5935
+make_list FUN2(292,6015
+#define ERROR 303,6215
+extern struct node *yylval;yylval305,6233
+unsigned char parse_cell_or_range 308,6278
+unsigned char parse_cell_or_range 310,6342
+yylex FUN0(314,6392
+parse_cell_or_range FUN2(586,11758
+#define CK_ABS_R(670,13200
+#define CK_REL_R(674,13279
+#define CK_ABS_C(679,13408
+#define CK_REL_C(683,13487
+#define MAYBEREL(688,13616
+str_to_col FUN1(846,16817
+
+y-src/parse.c,520
+#define YYBISON 4,64
+# define       NE      6,114
+# define       LE      7,130
+# define       GE      8,146
+# define       NEG     9,162
+# define       L_CELL  10,179
+# define       L_RANGE 11,199
+# define       L_VAR   12,220
+# define       L_CONST 13,239
+# define       L_FN0   14,260
+# define       L_FN1   15,279
+# define       L_FN2   16,298
+# define       L_FN3   17,317
+# define       L_FN4   18,336
+# define       L_FNN   19,355
+# define       L_FN1R  20,374
+# define       L_FN2R  21,394
+# define       L_FN3R  22,414
+# define       L_FN4R  23,434
+# define       L_FNNR  24,454
+# define       L_LE    25,474
+# define       L_NE    26,492
+# define       L_GE    27,510
+
+parse.y,1464
+#define obstack_chunk_alloc 46,
+#define obstack_chunk_free 47,
+int yylex 57,
+void yyerror 59,
+void yyerror 61,
+VOIDSTAR parse_hash;63,
+extern VOIDSTAR hash_find(64,
+unsigned char fnin[fnin67,
+#define YYSTYPE 71,
+typedef struct node *YYSTYPE;YYSTYPE72,
+YYSTYPE parse_return;73,
+YYSTYPE make_list 75,
+YYSTYPE make_list 77,
+char *instr;instr80,
+int parse_error 81,
+extern struct obstack tmp_mem;82,
+#define YYSTYPE 85,
+# define YYDEBUG 88,
+#define        YYFINAL 93,
+#define        YYFLAG  94,
+#define        YYNTBASE        95,
+#define YYTRANSLATE(98,
+static const char yytranslate[yytranslate101,
+static const short yyprhs[yyprhs134,
+static const short yyrhs[yyrhs142,
+static const short yyrline[yyrline171,
+static const char *const yytname[yytname185,
+static const short yyr1[yyr1197,
+static const short yyr2[yyr2207,
+static const short yydefact[yydefact219,
+static const short yydefgoto[yydefgoto237,
+static const short yypact[yypact242,
+static const short yypgoto[yypgoto260,
+#define        YYLAST  266,
+static const short yytable[yytable269,
+static const short yycheck[yycheck330,
+yyerror FUN1(285,
+make_list FUN2(292,
+#define ERROR 303,
+extern struct node *yylval;yylval305,
+unsigned char parse_cell_or_range 308,
+unsigned char parse_cell_or_range 310,
+yylex FUN0(314,
+parse_cell_or_range FUN2(586,
+#define CK_ABS_R(670,
+#define CK_REL_R(674,
+#define CK_ABS_C(679,
+#define CK_REL_C(683,
+#define MAYBEREL(688,
+str_to_col FUN1(846,
+
+/usr/share/bison/bison.simple,2180
+# define YYSTD(40,
+# define YYSTD(42,
+#  define YYSTACK_ALLOC 50,
+#  define YYSIZE_T 51,
+#    define YYSTACK_ALLOC 55,
+#    define YYSIZE_T 56,
+#     define YYSTACK_ALLOC 59,
+#  define YYSTACK_FREE(67,
+#   define YYSIZE_T 71,
+#    define YYSIZE_T 75,
+#  define YYSTACK_ALLOC 78,
+#  define YYSTACK_FREE 79,
+union yyalloc83,
+# define YYSTACK_GAP_MAX 93,
+#  define YYSTACK_BYTES(98,
+#  define YYSTACK_BYTES(102,
+# define YYSTACK_RELOCATE(112,
+# define YYSIZE_T 128,
+# define YYSIZE_T 131,
+#  define YYSIZE_T 136,
+#   define YYSIZE_T 140,
+# define YYSIZE_T 145,
+#define yyerrok        148,
+#define yyclearin      149,
+#define YYEMPTY        150,
+#define YYEOF  151,
+#define YYACCEPT       152,
+#define YYABORT 153,
+#define YYERROR        154,
+#define YYFAIL 158,
+#define YYRECOVERING(159,
+#define YYBACKUP(160,
+#define YYTERROR       177,
+#define YYERRCODE      178,
+# define YYLLOC_DEFAULT(189,
+#   define YYLEX       200,
+#   define YYLEX       202,
+#   define YYLEX       206,
+#   define YYLEX       208,
+# define YYLEX 212,
+#  define YYFPRINTF 225,
+# define YYDPRINTF(228,
+int yydebug;237,
+# define YYDPRINTF(239,
+# define YYINITDEPTH 244,
+# undef YYMAXDEPTH255,
+# define YYMAXDEPTH 259,
+#  define yymemcpy 264,
+yymemcpy 271,
+#   define yystrlen 293,
+yystrlen 298,
+#   define yystpcpy 316,
+yystpcpy 322,
+#  define YYPARSE_PARAM_ARG 351,
+#  define YYPARSE_PARAM_DECL352,
+#  define YYPARSE_PARAM_ARG 354,
+#  define YYPARSE_PARAM_DECL 355,
+# define YYPARSE_PARAM_ARG358,
+# define YYPARSE_PARAM_DECL359,
+int yyparse 365,
+int yyparse 367,
+#define YY_DECL_NON_LSP_VARIABLES      374,
+# define YY_DECL_VARIABLES     385,
+# define YY_DECL_VARIABLES     391,
+yyparse 403,
+# define YYPOPSTACK 445,
+# define YYPOPSTACK 447,
+# undef YYSTACK_RELOCATE548,
+  *++yyvsp yyvsp746,
+  *++yylsp yylsp748,
+  yyn 755,
+  yystate 757,
+    yystate 761,
+  goto yynewstate;763,
+  goto yyerrlab1;823,
+  yyerrstatus 846,
+  goto yyerrhandle;848,
+  yyn 861,
+  yystate 875,
+  yyn 895,
+  yyn 903,
+  YYDPRINTF 917,
+  *++yyvsp yyvsp919,
+  *++yylsp yylsp921,
+  yystate 924,
+  goto yynewstate;925,
+  yyresult 932,
+  goto yyreturn;933,
+  yyresult 939,
+  goto yyreturn;940,
+  yyerror 946,
+  yyresult 947,
+
+y-src/atest.y,9
+exp    2,3
+
+y-src/cccp.c,303
+#define YYBISON 4,63
+# define       INT     6,113
+# define       CHAR    7,130
+# define       NAME    8,148
+# define       ERROR   9,166
+# define       OR      10,185
+# define       AND     11,201
+# define       EQUAL   12,218
+# define       NOTEQUAL        13,237
+# define       LEQ     14,259
+# define       GEQ     15,276
+# define       LSH     16,293
+# define       RSH     17,310
+# define       UNARY   18,327
+
+cccp.y,2005
+typedef unsigned char U_CHAR;38,
+struct arglist 41,
+#define NULL 51,
+#define GENERIC_PTR 56,
+#define GENERIC_PTR 58,
+#define NULL_PTR 63,
+int yylex 66,
+void yyerror 67,
+int expression_value;68,
+static jmp_buf parse_return_error;70,
+static int keyword_parsing 73,
+extern unsigned char is_idstart[is_idstart76,
+extern unsigned char is_idstart[], is_idchar[is_idchar76,
+extern unsigned char is_idstart[], is_idchar[], is_hor_space[is_hor_space76,
+extern char *xmalloc xmalloc78,
+extern int pedantic;81,
+extern int traditional;84,
+#define CHAR_TYPE_SIZE 87,
+#define INT_TYPE_SIZE 91,
+#define LONG_TYPE_SIZE 95,
+#define WCHAR_TYPE_SIZE 99,
+#define possible_sum_sign(104,
+static void integer_overflow 106,
+static long left_shift 107,
+static long right_shift 108,
+  struct constant 113,
+  struct name 114,
+} yystype;118,
+# define YYSTYPE 119,
+# define YYDEBUG 122,
+#define        YYFINAL 127,
+#define        YYFLAG  128,
+#define        YYNTBASE        129,
+#define YYTRANSLATE(132,
+static const char yytranslate[yytranslate135,
+static const short yyprhs[yyprhs167,
+static const short yyrhs[yyrhs174,
+static const short yyrline[yyrline195,
+static const char *const yytname[yytname208,
+static const short yyr1[yyr1219,
+static const short yyr2[yyr2228,
+static const short yydefact[yydefact239,
+static const short yydefgoto[yydefgoto251,
+static const short yypact[yypact256,
+static const short yypgoto[yypgoto268,
+#define        YYLAST  274,
+static const short yytable[yytable277,
+static const short yycheck[yycheck301,
+static char *lexptr;lexptr332,
+parse_number 341,
+struct token 437,
+static struct token tokentab2[tokentab2442,
+yylex 459,
+parse_escape 740,
+yyerror 836,
+integer_overflow 844,
+left_shift 851,
+right_shift 873,
+parse_c_expression 893,
+extern int yydebug;919,
+main 923,
+unsigned char is_idchar[is_idchar948,
+unsigned char is_idstart[is_idstart950,
+char is_hor_space[is_hor_space953,
+initialize_random_junk 958,
+error 988,
+warning 993,
+lookup 999,
+
+/usr/share/bison/bison.simple,2180
+# define YYSTD(40,
+# define YYSTD(42,
+#  define YYSTACK_ALLOC 50,
+#  define YYSIZE_T 51,
+#    define YYSTACK_ALLOC 55,
+#    define YYSIZE_T 56,
+#     define YYSTACK_ALLOC 59,
+#  define YYSTACK_FREE(67,
+#   define YYSIZE_T 71,
+#    define YYSIZE_T 75,
+#  define YYSTACK_ALLOC 78,
+#  define YYSTACK_FREE 79,
+union yyalloc83,
+# define YYSTACK_GAP_MAX 93,
+#  define YYSTACK_BYTES(98,
+#  define YYSTACK_BYTES(102,
+# define YYSTACK_RELOCATE(112,
+# define YYSIZE_T 128,
+# define YYSIZE_T 131,
+#  define YYSIZE_T 136,
+#   define YYSIZE_T 140,
+# define YYSIZE_T 145,
+#define yyerrok        148,
+#define yyclearin      149,
+#define YYEMPTY        150,
+#define YYEOF  151,
+#define YYACCEPT       152,
+#define YYABORT 153,
+#define YYERROR        154,
+#define YYFAIL 158,
+#define YYRECOVERING(159,
+#define YYBACKUP(160,
+#define YYTERROR       177,
+#define YYERRCODE      178,
+# define YYLLOC_DEFAULT(189,
+#   define YYLEX       200,
+#   define YYLEX       202,
+#   define YYLEX       206,
+#   define YYLEX       208,
+# define YYLEX 212,
+#  define YYFPRINTF 225,
+# define YYDPRINTF(228,
+int yydebug;237,
+# define YYDPRINTF(239,
+# define YYINITDEPTH 244,
+# undef YYMAXDEPTH255,
+# define YYMAXDEPTH 259,
+#  define yymemcpy 264,
+yymemcpy 271,
+#   define yystrlen 293,
+yystrlen 298,
+#   define yystpcpy 316,
+yystpcpy 322,
+#  define YYPARSE_PARAM_ARG 351,
+#  define YYPARSE_PARAM_DECL352,
+#  define YYPARSE_PARAM_ARG 354,
+#  define YYPARSE_PARAM_DECL 355,
+# define YYPARSE_PARAM_ARG358,
+# define YYPARSE_PARAM_DECL359,
+int yyparse 365,
+int yyparse 367,
+#define YY_DECL_NON_LSP_VARIABLES      374,
+# define YY_DECL_VARIABLES     385,
+# define YY_DECL_VARIABLES     391,
+yyparse 403,
+# define YYPOPSTACK 445,
+# define YYPOPSTACK 447,
+# undef YYSTACK_RELOCATE548,
+  *++yyvsp yyvsp746,
+  *++yylsp yylsp748,
+  yyn 755,
+  yystate 757,
+    yystate 761,
+  goto yynewstate;763,
+  goto yyerrlab1;823,
+  yyerrstatus 846,
+  goto yyerrhandle;848,
+  yyn 861,
+  yystate 875,
+  yyn 895,
+  yyn 903,
+  YYDPRINTF 917,
+  *++yyvsp yyvsp919,
+  *++yylsp yylsp921,
+  yystate 924,
+  goto yynewstate;925,
+  yyresult 932,
+  goto yyreturn;933,
+  yyresult 939,
+  goto yyreturn;940,
+  yyerror 946,
+  yyresult 947,
+
+y-src/cccp.y,1582
+typedef unsigned char U_CHAR;38,1201
+struct arglist 41,1301
+#define NULL 51,1468
+#define GENERIC_PTR 56,1578
+#define GENERIC_PTR 58,1611
+#define NULL_PTR 63,1670
+int yylex 66,1712
+void yyerror 67,1726
+int expression_value;68,1743
+static jmp_buf parse_return_error;70,1766
+static int keyword_parsing 73,1865
+extern unsigned char is_idstart[is_idstart76,1944
+extern unsigned char is_idstart[], is_idchar[is_idchar76,1944
+extern unsigned char is_idstart[], is_idchar[], 
is_hor_space[is_hor_space76,1944
+extern char *xmalloc xmalloc78,2009
+extern int pedantic;81,2062
+extern int traditional;84,2114
+#define CHAR_TYPE_SIZE 87,2162
+#define INT_TYPE_SIZE 91,2229
+#define LONG_TYPE_SIZE 95,2296
+#define WCHAR_TYPE_SIZE 99,2365
+#define possible_sum_sign(104,2556
+static void integer_overflow 106,2632
+static long left_shift 107,2665
+static long right_shift 108,2692
+  struct constant 112,2733
+  struct name 113,2789
+start 143,3226
+exp1   148,3330
+exp    156,3505
+exp    185,4295
+keywords 306,7835
+static char *lexptr;lexptr332,8579
+parse_number 341,8842
+struct token 437,11038
+static struct token tokentab2[tokentab2442,11088
+yylex 459,11367
+parse_escape 740,17718
+yyerror 836,19599
+integer_overflow 844,19690
+left_shift 851,19804
+right_shift 873,20194
+parse_c_expression 893,20732
+extern int yydebug;919,21416
+main 923,21483
+unsigned char is_idchar[is_idchar948,21901
+unsigned char is_idstart[is_idstart950,21996
+char is_hor_space[is_hor_space953,22160
+initialize_random_junk 958,22259
+error 988,22915
+warning 993,22963
+lookup 999,23033
+
+tex-src/nonewline.tex,0
+
+php-src/sendmail.php,0
+
+a-src/empty.zz,0
diff --git a/test/etags/ETAGS.good_3 b/test/etags/ETAGS.good_3
new file mode 100644
index 0000000..1e4d565
--- /dev/null
+++ b/test/etags/ETAGS.good_3
@@ -0,0 +1,6118 @@
+
+Makefile,701
+ADASRC=1,0
+ASRC=2,91
+CSRC=3,139
+CPSRC=7,410
+ELSRC=10,624
+ERLSRC=11,694
+FORTHSRC=12,759
+FSRC=13,809
+HTMLSRC=14,881
+JAVASRC=15,974
+LUASRC=16,1062
+MAKESRC=17,1105
+OBJCSRC=18,1147
+OBJCPPSRC=19,1228
+PASSRC=20,1291
+PERLSRC=21,1333
+PHPSRC=22,1413
+PSSRC=23,1485
+PROLSRC=24,1525
+PYTSRC=25,1587
+TEXSRC=26,1628
+YSRC=27,1707
+SRCS=28,1772
+NONSRCS=32,2024
+ETAGS_PROG=34,2098
+CTAGS_PROG=35,2129
+REGEX=37,2161
+xx=38,2207
+RUN=40,2256
+OPTIONS=42,2262
+ARGS=43,2314
+infiles 45,2332
+check:check47,2394
+ediff%:ediff%55,2697
+cdiff:cdiff58,2798
+ETAGS:ETAGS61,2895
+CTAGS:CTAGS64,2965
+srclist:srclist67,3043
+regexfile:regexfile71,3134
+.PRECIOUS:.PRECIOUS77,3311
+FRC:FRC79,3345
+
+ada-src/etags-test-for.ada,1969
+   type LL_Task_Procedure_Access LL_Task_Procedure_Access/t1,0
+   function Body_RequiredBody_Required/f3,78
+   type Type_Specific_Data Type_Specific_Data/t11,280
+   function "abs"abs/f19,504
+   type Barrier_Function_Pointer Barrier_Function_Pointer/t21,577
+   function "="=/f27,722
+   type usfreelock_ptr usfreelock_ptr/t30,803
+   function p p/f33,891
+   procedure LL_Wrapper LL_Wrapper/p37,1054
+function p p/f39,1094
+package Pkg1 Pkg1/s44,1203
+  type Private_T Private_T/t46,1220
+  package Inner1 Inner1/s48,1250
+    procedure Private_T;Private_T/p49,1270
+  package Inner2 Inner2/s52,1310
+    task Private_T;Private_T/k53,1330
+  type Public_T Public_T/t56,1365
+  procedure Pkg1_Proc1;Pkg1_Proc1/p62,1450
+  procedure Pkg1_Proc2 Pkg1_Proc2/p64,1475
+  function Pkg1_Func1 Pkg1_Func1/f66,1514
+  function Pkg1_Func2 Pkg1_Func2/f68,1553
+  package Pkg1_Pkg1 Pkg1_Pkg1/s71,1622
+    procedure Pkg1_Pkg1_Proc1;Pkg1_Pkg1_Proc1/p72,1645
+  task type Task_Type Task_Type/k75,1694
+  type Private_T Private_T/t82,1786
+package body Pkg1 Pkg1/b89,1882
+  procedure Pkg1_Proc1 Pkg1_Proc1/p91,1904
+  package body Inner1 Inner1/b96,1956
+    procedure Private_T Private_T/p97,1981
+  package body Inner2 Inner2/b103,2054
+    task body Private_T Private_T/b104,2079
+  task body Task_Type Task_Type/b112,2181
+  procedure Pkg1_Proc2 Pkg1_Proc2/p126,2367
+  function Pkg1_Func1 Pkg1_Func1/f132,2445
+  function Pkg1_Func2 Pkg1_Func2/f134,2496
+  package body Pkg1_Pkg1 Pkg1_Pkg1/b140,2596
+package body Pkg1_Pkg1 Pkg1_Pkg1/b146,2663
+  procedure Pkg1_Pkg1_Proc1 Pkg1_Pkg1_Proc1/p147,2689
+function  Pkg1_Func1 Pkg1_Func1/f155,2778
+package Truc Truc/s162,2887
+package Truc.Bidule Truc.Bidule/s166,2929
+  protected Bidule Bidule/t168,2953
+  protected type Machin_T Machin_T/t172,3007
+package body Truc.Bidule Truc.Bidule/b178,3087
+  protected body Bidule Bidule/b179,3115
+  protected Machin_T Machin_T/t186,3207
+
+ada-src/2ataspri.adb,2190
+package body System.Task_Primitives System.Task_Primitives/b64,2603
+   package RTE RTE/s69,2712
+   package TSL TSL/s70,2759
+   function To_void_ptr To_void_ptr/f86,3287
+   function To_TCB_Ptr To_TCB_Ptr/f89,3366
+   function 
pthread_mutexattr_setprotocolpthread_mutexattr_setprotocol/f92,3444
+   function 
pthread_mutexattr_setprio_ceilingpthread_mutexattr_setprio_ceiling/f99,3728
+   procedure Abort_WrapperAbort_Wrapper/p115,4302
+   procedure LL_Wrapper LL_Wrapper/p122,4526
+   procedure Initialize_LL_Tasks Initialize_LL_Tasks/p131,4830
+   function Self Self/f160,5586
+   procedure Initialize_LockInitialize_Lock/p174,5958
+   procedure Finalize_Lock Finalize_Lock/p210,6927
+   procedure Write_Lock Write_Lock/p226,7338
+   procedure Read_Lock Read_Lock/p239,7700
+   procedure Unlock Unlock/p246,7850
+   procedure Initialize_Cond Initialize_Cond/p258,8160
+   procedure Finalize_Cond Finalize_Cond/p286,8979
+   procedure Cond_Wait Cond_Wait/p300,9303
+   procedure Cond_Timed_WaitCond_Timed_Wait/p312,9661
+   procedure Cond_Signal Cond_Signal/p343,10510
+   procedure Set_PrioritySet_Priority/p355,10836
+   procedure Set_Own_Priority Set_Own_Priority/p372,11243
+   function Get_Priority Get_Priority/f385,11598
+   function Get_Own_Priority Get_Own_Priority/f398,12023
+   procedure Create_LL_TaskCreate_LL_Task/p412,12438
+      function To_Start_Addr To_Start_Addr/f426,12873
+   procedure Exit_LL_Task Exit_LL_Task/p491,14995
+   procedure Abort_Task Abort_Task/p500,15158
+   procedure Test_Abort Test_Abort/p518,15716
+   procedure Install_Abort_Handler Install_Abort_Handler/p527,15878
+   procedure Abort_WrapperAbort_Wrapper/p557,16939
+      function Address_To_Call_State Address_To_Call_State/f562,17062
+   procedure Install_Error_Handler Install_Error_Handler/p573,17351
+   procedure LL_Assert LL_Assert/p599,18146
+   procedure LL_Wrapper LL_Wrapper/p608,18299
+   procedure Initialize_TAS_Cell Initialize_TAS_Cell/p630,19010
+   procedure Finalize_TAS_Cell Finalize_TAS_Cell/p635,19129
+   procedure Clear Clear/p640,19236
+   procedure Test_And_Set Test_And_Set/p645,19330
+   function  Is_Set Is_Set/f659,19676
+
+ada-src/2ataspri.ads,2313
+package System.Task_Primitives System.Task_Primitives/s58,3169
+   type LL_Task_Procedure_Access LL_Task_Procedure_Access/t62,3253
+   type Pre_Call_State Pre_Call_State/t64,3331
+   type Task_Storage_Size Task_Storage_Size/t66,3378
+   type Machine_Exceptions Machine_Exceptions/t68,3433
+   type Error_Information Error_Information/t70,3499
+   type Lock Lock/t72,3569
+   type Condition_Variable Condition_Variable/t73,3594
+   type Task_Control_Block Task_Control_Block/t81,3955
+   type TCB_Ptr TCB_Ptr/t89,4241
+   function Address_To_TCB_Ptr Address_To_TCB_Ptr/f93,4333
+   procedure Initialize_LL_Tasks Initialize_LL_Tasks/p96,4425
+   function Self Self/f100,4602
+   procedure Initialize_Lock Initialize_Lock/p103,4707
+   procedure Finalize_Lock Finalize_Lock/p107,4879
+   procedure Write_Lock Write_Lock/p111,5034
+   procedure Read_Lock Read_Lock/p118,5428
+   procedure Unlock Unlock/p128,5995
+   procedure Initialize_Cond Initialize_Cond/p135,6300
+   procedure Finalize_Cond Finalize_Cond/p138,6413
+   procedure Cond_Wait Cond_Wait/p142,6591
+   procedure Cond_Timed_WaitCond_Timed_Wait/p155,7396
+   procedure Cond_Signal Cond_Signal/p164,7812
+   procedure Set_Priority Set_Priority/p169,8040
+   procedure Set_Own_Priority Set_Own_Priority/p173,8200
+   function Get_Priority Get_Priority/f177,8348
+   function Get_Own_Priority Get_Own_Priority/f181,8504
+   procedure Create_LL_TaskCreate_LL_Task/p185,8647
+   procedure Exit_LL_Task;Exit_LL_Task/p198,9282
+   procedure Abort_Task Abort_Task/p203,9516
+   procedure Test_Abort;Test_Abort/p210,9878
+   type Abort_Handler_Pointer Abort_Handler_Pointer/t217,10233
+   procedure Install_Abort_Handler Install_Abort_Handler/p219,10312
+   procedure Install_Error_Handler Install_Error_Handler/p226,10741
+   procedure LL_Assert LL_Assert/p231,10983
+   type Proc Proc/t238,11240
+   type TAS_Cell TAS_Cell/t242,11328
+   procedure Initialize_TAS_Cell Initialize_TAS_Cell/p249,11670
+   procedure Finalize_TAS_Cell Finalize_TAS_Cell/p255,11941
+   procedure Clear Clear/p260,12157
+   procedure Test_And_Set Test_And_Set/p267,12462
+   function  Is_Set Is_Set/f275,12877
+   type Lock Lock/t283,13155
+   type Condition_Variable Condition_Variable/t288,13267
+   type TAS_Cell TAS_Cell/t293,13389
+
+ada-src/waroquiers.ada,1503
+package Pkg1 Pkg1/s3,89
+  type Private_T Private_T/t5,106
+  package Inner1 Inner1/s7,136
+    procedure Private_T;Private_T/p8,156
+  package Inner2 Inner2/s11,196
+    task Private_T;Private_T/k12,216
+  type Public_T Public_T/t15,251
+  procedure Pkg1_Proc1;Pkg1_Proc1/p21,336
+  procedure Pkg1_Proc2 Pkg1_Proc2/p23,361
+  function Pkg1_Func1 Pkg1_Func1/f25,400
+  function Pkg1_Func2 Pkg1_Func2/f27,439
+  package Pkg1_Pkg1 Pkg1_Pkg1/s30,508
+    procedure Pkg1_Pkg1_Proc1;Pkg1_Pkg1_Proc1/p31,531
+  task type Task_Type Task_Type/k34,580
+  type Private_T Private_T/t40,671
+package body Pkg1 Pkg1/b46,766
+  procedure Pkg1_Proc1 Pkg1_Proc1/p48,788
+  package body Inner1 Inner1/b53,840
+    procedure Private_T Private_T/p54,865
+  package body Inner2 Inner2/b60,938
+    task body Private_T Private_T/b61,963
+  task body Task_Type Task_Type/b68,1064
+  procedure Pkg1_Proc2 Pkg1_Proc2/p82,1250
+  function Pkg1_Func1 Pkg1_Func1/f88,1328
+  function Pkg1_Func2 Pkg1_Func2/f90,1379
+  package body Pkg1_Pkg1 Pkg1_Pkg1/b96,1479
+package body Pkg1_Pkg1 Pkg1_Pkg1/b100,1544
+  procedure Pkg1_Pkg1_Proc1 Pkg1_Pkg1_Proc1/p101,1570
+function  Pkg1_Func1 Pkg1_Func1/f107,1657
+package Truc Truc/s112,1764
+package Truc.Bidule Truc.Bidule/s116,1816
+  protected Bidule Bidule/t125,1964
+  protected type Machin_T Machin_T/t131,2046
+package body Truc.Bidule Truc.Bidule/b138,2153
+  protected body Bidule Bidule/b139,2181
+  protected body Machin_T Machin_T/b146,2281
+
+c-src/abbrev.c,1432
+Lisp_Object Vabbrev_table_name_list;42,1416
+Lisp_Object Vglobal_abbrev_table;47,1561
+Lisp_Object Vfundamental_mode_abbrev_table;51,1672
+int abbrevs_changed;55,1773
+int abbrev_all_caps;57,1795
+Lisp_Object Vabbrev_start_location;62,1944
+Lisp_Object Vabbrev_start_location_buffer;65,2033
+Lisp_Object Vlast_abbrev;69,2142
+Lisp_Object Vlast_abbrev_text;74,2311
+int last_abbrev_point;78,2401
+Lisp_Object Vpre_abbrev_expand_hook,82,2474
+Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;82,2474
+DEFUN ("make-abbrev-table", Fmake_abbrev_table,make-abbrev-table84,2538
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table,clear-abbrev-table91,2730
+DEFUN ("define-abbrev", Fdefine_abbrev,define-abbrev106,3111
+DEFUN ("define-global-abbrev", 
Fdefine_global_abbrev,define-global-abbrev148,4430
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,define-mode-abbrev159,4801
+DEFUN ("abbrev-symbol", Fabbrev_symbol,abbrev-symbol173,5269
+DEFUN ("abbrev-expansion", Fabbrev_expansion,abbrev-expansion201,6233
+DEFUN ("expand-abbrev", Fexpand_abbrev,expand-abbrev217,6748
+DEFUN ("unexpand-abbrev", Funexpand_abbrev,unexpand-abbrev388,11669
+write_abbrev 425,12876
+describe_abbrev 444,13311
+DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,insert-abbrev-table-description465,13826
+DEFUN ("define-abbrev-table", 
Fdefine_abbrev_table,define-abbrev-table505,14982
+syms_of_abbrev 539,16059
+
+c-src/torture.c,197
+(*tag1 tag118,452
+#define notag2 26,553
+(*tag2 tag229,630
+(*tag3 tag339,772
+#define notag4 45,861
+(*tag4 tag448,955
+tag5 57,1081
+tag6 66,1208
+int pp1(74,1317
+pp287,1419
+pp3(100,1518
+
+c-src/getopt.h,275
+#define _GETOPT_H 19,801
+struct option73,2797
+  const char *name;name76,2826
+  char *name;name78,2852
+  int has_arg;82,3009
+  int *flag;flag83,3024
+  int val;84,3037
+#define        no_argument     89,3124
+#define required_argument      90,3147
+#define optional_argument      91,3175
+
+c-src/etags.c,12045
+char pot_etags_version[pot_etags_version81,3470
+#  undef DEBUG84,3552
+#  define DEBUG 85,3567
+#  define DEBUG 87,3594
+#  define NDEBUG       88,3617
+# define _GNU_SOURCE 94,3705
+# undef MSDOS100,3876
+# undef  WINDOWSNT101,3890
+# define WINDOWSNT102,3909
+# undef MSDOS106,3968
+# define MSDOS 107,3982
+# define MSDOS 110,4032
+# define MAXPATHLEN 115,4111
+# undef HAVE_NTGUI116,4141
+# undef  DOS_NT117,4160
+# define DOS_NT118,4176
+# undef  assert        135,4482
+# define assert(136,4541
+# undef  CTAGS146,4857
+# define CTAGS 147,4872
+# define CTAGS 149,4898
+#define streq(152,4927
+#define strcaseeq(153,4996
+#define strneq(154,5075
+#define strncaseeq(155,5151
+#define CHARS 157,5238
+#define CHAR(158,5278
+#define        iswhite(159,5329
+#define notinname(160,5394
+#define        begtoken(161,5469
+#define        intoken(162,5542
+#define        endtoken(163,5614
+#define ISALNUM(165,5684
+#define ISALPHA(166,5722
+#define ISDIGIT(167,5760
+#define ISLOWER(168,5798
+#define lowcase(170,5837
+#define xnew(179,6015
+#define xrnew(180,6083
+typedef void Lang_function 182,6164
+  const char *suffix;suffix186,6219
+  const char *command;command187,6294
+} compressor;188,6365
+  const char *name;name192,6397
+  const char *help;help193,6449
+  Lang_function *function;function194,6508
+  const char **suffixes;suffixes195,6556
+  const char **filenames;filenames196,6633
+  const char **interpreters;interpreters197,6702
+  bool metasource;198,6771
+} language;199,6835
+typedef struct fdesc201,6848
+  struct fdesc *next;next203,6871
+  char *infname;infname204,6920
+  char *infabsname;infabsname205,6973
+  char *infabsdir;infabsdir206,7038
+  char *taggedfname;taggedfname207,7091
+  language *lang;lang208,7149
+  char *prop;prop209,7191
+  bool usecharno;210,7249
+  bool written;211,7311
+} fdesc;212,7366
+typedef struct node_st214,7376
+  struct node_st *left,left216,7428
+  struct node_st *left, *right;right216,7428
+  fdesc *fdp;fdp217,7486
+  char *name;name218,7548
+  char *regex;regex219,7580
+  bool valid;220,7617
+  bool is_func;221,7670
+  bool been_warned;222,7733
+  int lno;223,7801
+  long cno;224,7842
+} node;225,7894
+  long size;236,8208
+  int len;237,8221
+  char *buffer;buffer238,8232
+} linebuffer;239,8248
+    at_language,245,8344
+    at_regexp,246,8393
+    at_filename,247,8437
+    at_stdin,248,8473
+    at_end     249,8516
+  } arg_type;250,8557
+  language *lang;lang251,8593
+  char *what;what252,8656
+} argument;253,8698
+typedef struct regexp256,8758
+  struct regexp *p_next;p_next258,8782
+  language *lang;lang259,8837
+  char *pattern;pattern260,8897
+  char *name;name261,8940
+  struct re_pattern_buffer *pat;pat262,8971
+  struct re_registers regs;263,9031
+  bool error_signaled;264,9078
+  bool force_explicit_name;265,9141
+  bool ignore_case;266,9206
+  bool multi_line;267,9259
+} regexp;268,9325
+static void error 311,10780
+# undef STDIN408,15073
+#define STDIN 411,15095
+static compressor compressors[compressors457,17664
+static const char *Ada_suffixes Ada_suffixes473,17907
+static const char Ada_help 475,17977
+static const char *Asm_suffixes Asm_suffixes493,18580
+static const char Asm_help 504,18976
+static const char *default_C_suffixes default_C_suffixes512,19312
+static const char default_C_help 515,19413
+static const char default_C_help 523,19850
+static const char *Cplusplus_suffixes Cplusplus_suffixes535,20460
+static const char Cplusplus_help 540,20658
+static const char *Cjava_suffixes Cjava_suffixes549,21113
+static char Cjava_help 551,21172
+static const char *Cobol_suffixes Cobol_suffixes556,21337
+static char Cobol_help 558,21402
+static const char *Cstar_suffixes Cstar_suffixes562,21543
+static const char *Erlang_suffixes Erlang_suffixes565,21607
+static const char Erlang_help 567,21673
+const char *Forth_suffixes Forth_suffixes571,21799
+static const char Forth_help 573,21857
+static const char *Fortran_suffixes Fortran_suffixes577,22008
+static const char Fortran_help 579,22085
+static const char *HTML_suffixes HTML_suffixes582,22190
+static const char HTML_help 584,22264
+static const char *Lisp_suffixes Lisp_suffixes589,22452
+static const char Lisp_help 591,22556
+static const char *Lua_suffixes Lua_suffixes598,22871
+static const char Lua_help 600,22934
+static const char *Makefile_filenames Makefile_filenames603,23010
+static const char Makefile_help 605,23133
+static const char *Objc_suffixes Objc_suffixes609,23277
+static const char Objc_help 613,23399
+static const char *Pascal_suffixes Pascal_suffixes619,23714
+static const char Pascal_help 621,23778
+static const char *Perl_suffixes Perl_suffixes626,23966
+static const char *Perl_interpreters Perl_interpreters628,24028
+static const char Perl_help 630,24100
+static const char *PHP_suffixes PHP_suffixes637,24451
+static const char PHP_help 639,24523
+static const char *plain_C_suffixes plain_C_suffixes643,24678
+static const char *PS_suffixes PS_suffixes647,24762
+static const char PS_help 649,24848
+static const char *Prolog_suffixes Prolog_suffixes652,24931
+static const char Prolog_help 654,24993
+static const char *Python_suffixes Python_suffixes658,25107
+static const char Python_help 660,25165
+static const char *Scheme_suffixes Scheme_suffixes665,25347
+static const char Scheme_help 667,25460
+static const char *TeX_suffixes TeX_suffixes672,25683
+static const char TeX_help 674,25781
+static const char *Texinfo_suffixes Texinfo_suffixes686,26316
+static const char Texinfo_help 688,26395
+static const char *Yacc_suffixes Yacc_suffixes691,26492
+static const char Yacc_help 693,26606
+static const char auto_help 699,26856
+static const char none_help 703,27020
+static const char no_lang_help 707,27143
+static language lang_names 718,27355
+print_language_names 753,29532
+# define EMACS_NAME 786,30755
+# define VERSION 789,30811
+print_version 792,30869
+# define PRINT_UNDOCUMENTED_OPTIONS_HELP 804,31173
+print_help 808,31250
+main 981,37438
+get_compressor_from_suffix 1319,46217
+get_language_from_langname 1355,47158
+get_language_from_interpreter 1377,47545
+get_language_from_filename 1399,47976
+process_file_name 1433,48834
+process_file 1555,51665
+init 1632,54150
+find_entries 1656,54901
+make_tag 1814,59707
+pfnote 1856,60942
+free_tree 1917,62744
+free_fdesc 1935,63029
+add_node 1955,63472
+invalidate_nodes 2035,65537
+static int number_len 2068,66193
+total_size_of_entries 2087,66694
+put_entries 2107,67154
+#define C_EXT  2193,68995
+#define C_PLAIN 2194,69037
+#define C_PLPL 2195,69070
+#define C_STAR 2196,69104
+#define C_JAVA 2197,69137
+#define C_AUTO 2198,69172
+#define YACC   2199,69242
+enum sym_type2204,69312
+  st_none,2206,69328
+  st_C_objprot,2207,69339
+  st_C_objprot, st_C_objimpl,2207,69339
+  st_C_objprot, st_C_objimpl, st_C_objend,2207,69339
+  st_C_gnumacro,2208,69382
+  st_C_ignore,2209,69399
+  st_C_ignore, st_C_attribute,2209,69399
+  st_C_javastruct,2210,69430
+  st_C_operator,2211,69449
+  st_C_class,2212,69466
+  st_C_class, st_C_template,2212,69466
+  st_C_struct,2213,69495
+  st_C_struct, st_C_extern,2213,69495
+  st_C_struct, st_C_extern, st_C_enum,2213,69495
+  st_C_struct, st_C_extern, st_C_enum, st_C_define,2213,69495
+  st_C_struct, st_C_extern, st_C_enum, st_C_define, st_C_typedef2213,69495
+struct C_stab_entry 2271,71278
+struct C_stab_entry { const char *name;name2271,71278
+struct C_stab_entry { const char *name; int c_ext;2271,71278
+struct C_stab_entry { const char *name; int c_ext; enum sym_type 
type;2271,71278
+hash 2275,71409
+in_word_set 2321,72937
+      TOTAL_KEYWORDS 2325,73018
+      MIN_WORD_LENGTH 2326,73045
+      MAX_WORD_LENGTH 2327,73072
+      MIN_HASH_VALUE 2328,73100
+      MAX_HASH_VALUE 2329,73126
+C_symtype 2387,74985
+static bool inattribute;2400,75234
+  fvnone,2408,75435
+  fdefunkey,2409,75466
+  fdefunname,2410,75512
+  foperator,2411,75556
+  fvnameseen,2412,75613
+  fstartlist,2413,75666
+  finlist,2414,75722
+  flistseen,2415,75765
+  fignore,2416,75813
+  vignore      2417,75856
+} fvdef;2418,75901
+static bool fvextern;2420,75911
+  tnone,2428,76089
+  tkeyseen,2429,76119
+  ttypeseen,2430,76160
+  tinbody,2431,76199
+  tend,2432,76238
+  tignore      2433,76279
+} typdef;2434,76320
+  snone,2443,76499
+  skeyseen,2445,76575
+  stagseen,2446,76620
+  scolonseen   2447,76661
+} structdef;2448,76715
+static const char *objtag objtag2453,76809
+  dnone,2460,76942
+  dsharpseen,2461,76972
+  ddefineseen,2462,77025
+  dignorerest  2463,77070
+} definedef;2464,77112
+  onone,2472,77267
+  oprotocol,2473,77297
+  oimplementation,2474,77347
+  otagseen,2475,77395
+  oparenseen,2476,77431
+  ocatseen,2477,77486
+  oinbody,2478,77525
+  omethodsign,2479,77568
+  omethodtag,2480,77626
+  omethodcolon,2481,77666
+  omethodparm,2482,77709
+  oignore      2483,77755
+} objdef;2484,77787
+static struct tok2491,77944
+  char *line;line2493,77964
+  int offset;2494,78014
+  int length;2495,78067
+  bool valid;2502,78352
+  bool named;2505,78487
+  int lineno;2506,78528
+  long linepos;2507,78576
+} token;2508,78626
+  char **cname;cname2519,78950
+  int *bracelev;bracelev2520,78993
+  int nl;2521,79042
+  int size;2522,79096
+} cstack;2523,79136
+#define nestlev        2525,79264
+#define instruct       2527,79369
+pushclass_above 2531,79489
+popclass_above 2550,79948
+write_classname 2564,80162
+consider_token 2613,81341
+  long linepos;2922,88499
+  linebuffer lb;2923,88515
+} lbs[lbs2924,88532
+#define current_lb_is_new 2926,88543
+#define switch_line_buffers(2927,88588
+#define curlb 2929,88641
+#define newlb 2930,88672
+#define curlinepos 2931,88703
+#define newlinepos 2932,88744
+#define plainc 2934,88786
+#define cplpl 2935,88830
+#define cjava 2936,88861
+#define CNL_SAVE_DEFINEDEF(2938,88905
+#define CNL(2947,89117
+make_C_tag 2960,89375
+C_entries 2986,90194
+default_C_entries 3833,110156
+plain_C_entries 3840,110276
+Cplusplus_entries 3847,110364
+Cjava_entries 3854,110460
+Cstar_entries 3861,110550
+Yacc_entries 3868,110642
+#define LOOP_ON_INPUT_LINES(3875,110720
+#define LOOKING_AT(3884,111056
+#define LOOKING_AT_NOCASE(3891,111461
+just_read_file 3901,111861
+F_takeprec 3914,112039
+F_getit 3937,112366
+Fortran_functions 3961,112840
+Ada_getit 4052,114669
+Ada_funcs 4115,116044
+Asm_labels 4228,118582
+Perl_functions 4261,119549
+Python_functions 4357,122057
+PHP_functions 4387,122684
+Cobol_paragraphs 4466,124471
+Makefile_targets 4494,125029
+Pascal_functions 4529,125950
+L_getit 4709,130318
+Lisp_functions 4725,130664
+Lua_functions 4785,131850
+PS_functions 4811,132385
+Forth_words 4841,133053
+Scheme_functions 4877,134092
+static linebuffer *TEX_toktab TEX_toktab4908,134781
+static const char *TEX_defenv TEX_defenv4912,134974
+static char TEX_esc 4920,135261
+static char TEX_opgrp 4921,135289
+static char TEX_clgrp 4922,135318
+TeX_commands 4928,135395
+#define TEX_LESC 4986,136652
+#define TEX_SESC 4987,136674
+TEX_mode 4992,136804
+TEX_decode_env 5026,137509
+Texinfo_nodes 5071,138554
+HTML_labels 5094,139013
+Prolog_functions 5219,142347
+prolog_skip_comment 5255,143128
+prolog_pr 5281,143736
+prolog_atom 5319,144628
+Erlang_functions 5379,145666
+erlang_func 5438,146965
+erlang_attribute 5476,147642
+erlang_atom 5496,148061
+scan_separators 5534,149080
+analyze_regex 5586,150460
+add_regex 5654,152050
+substitute 5767,154797
+free_regexps 5814,155837
+regex_tag_multiline 5836,156291
+nocase_tail 5913,158263
+get_tag 5928,158519
+readline_internal 5959,159455
+readline 6037,161296
+savestr 6230,167243
+savenstr 6240,167473
+skip_spaces 6249,167679
+skip_non_spaces 6258,167833
+skip_name 6267,167983
+fatal 6277,168156
+pfatal 6284,168253
+suggest_asking_for_help 6291,168332
+error 6300,168554
+concat 6313,168846
+etags_getcwd 6329,169259
+relative_filename 6350,169725
+absolute_filename 6389,170751
+absolute_dirname 6453,172416
+filename_is_absolute 6472,172845
+canonicalize_filename 6484,173096
+# define ISUPPER(6491,173235
+linebuffer_init 6514,173656
+linebuffer_setlen 6524,173887
+xmalloc 6536,174148
+xrealloc 6545,174314
+
+c-src/exit.c,99
+    size_t n;28,961
+    void EXFUN((*fn[fn29,975
+  } __libc_atexit;30,1011
+DEFUN(exit,38,1252
+
+c-src/exit.strange_suffix,99
+    size_t n;28,961
+    void EXFUN((*fn[fn29,975
+  } __libc_atexit;30,1011
+DEFUN(exit,38,1252
+
+c-src/sysdep.h,491
+#define        ENTRY(21,865
+#define        PSEUDO(26,972
+    movl $SYS_##syscall_nam$SYS_##syscall_na31,1132
+    movl $SYS_##syscall_name, %eax;eax31,1132
+    int $0x80;32,1180
+    test %eax,eax33,1210
+    test %eax, %eax;eax33,1210
+    jl syscall_error;34,1245
+#define        XCHG_0  47,1562
+#define        XCHG_1  48,1606
+#define        XCHG_2  49,1648
+#define        XCHG_3  50,1691
+#define        XCHG_4  51,1734
+#define        XCHG_5  52,1777
+#define        r0      54,1821
+#define        r1      55,1875
+#define scratch 56,1932
+#define MOVE(57,2001
+
+c-src/tab.c,196
+static int             count_words(15,263
+static char            *get_word(get_word35,553
+void                   tab_free(59,966
+char                   **tab_fill(tab_fill70,1129
+int                    tab_delete_first(91,1638
+int                    tab_count_words(103,1820
+
+c-src/dostorture.c,197
+(*tag1 tag118,451
+#define notag2 26,552
+(*tag2 tag229,629
+(*tag3 tag339,771
+#define notag4 45,860
+(*tag4 tag448,954
+tag5 57,1080
+tag6 66,1207
+int pp1(74,1316
+pp287,1418
+pp3(100,1517
+
+c-src/emacs/src/gmalloc.c,4207
+#define USE_PTHREAD25,1002
+#undef get_current_dir_name33,1126
+#undef malloc64,2110
+#undef realloc65,2124
+#undef calloc66,2139
+#undef free67,2153
+#define malloc 68,2165
+#define realloc 69,2188
+#define calloc 70,2213
+#define aligned_alloc 71,2236
+#define free 72,2273
+#define DUMPED 80,2472
+#define ALLOCATED_BEFORE_DUMPING(81,2507
+extern void *malloc malloc94,2718
+#define INT_BIT        124,3934
+#define BLOCKLOG       125,3977
+#define BLOCKSIZE      126,4018
+#define BLOCKIFY(127,4052
+#define HEAP   131,4215
+#define FINAL_FREE_BLOCKS      135,4391
+       int type;145,4676
+               size_t nfree;150,4720
+               size_t first;151,4777
+             } frag;152,4834
+           ptrdiff_t size;156,5055
+         } info;157,5076
+      } busy;158,5087
+       size_t size;163,5215
+       size_t next;164,5272
+       size_t prev;165,5321
+      } free;166,5374
+  } malloc_info;167,5388
+#define BLOCK(176,5620
+#define ADDRESS(177,5682
+struct list186,5939
+    struct list *next;next188,5955
+    struct list *prev;prev189,5978
+struct alignlist196,6153
+    struct alignlist *next;next198,6174
+    void *aligned;aligned199,6202
+    void *exact;exact200,6270
+#define LOCK(223,7064
+#define UNLOCK(228,7195
+#define LOCK_ALIGNED_BLOCKS(233,7329
+#define UNLOCK_ALIGNED_BLOCKS(238,7484
+#define LOCK(244,7649
+#define UNLOCK(245,7664
+#define LOCK_ALIGNED_BLOCKS(246,7681
+#define UNLOCK_ALIGNED_BLOCKS(247,7711
+enum mcheck_status283,9092
+    MCHECK_DISABLED 285,9115
+    MCHECK_OK,286,9187
+    MCHECK_FREE,287,9226
+    MCHECK_HEAD,288,9270
+    MCHECK_TAIL        289,9334
+struct mstats308,10153
+    size_t bytes_total;310,10171
+    size_t chunks_used;311,10225
+    size_t bytes_used;312,10285
+    size_t chunks_free;313,10351
+    size_t bytes_free;314,10406
+char *_heapbase;_heapbase355,11829
+malloc_info *_heapinfo;_heapinfo358,11927
+static size_t heapsize;361,11983
+size_t _heapindex;364,12047
+size_t _heaplimit;367,12109
+struct list _fraghead[_fraghead370,12171
+size_t _chunks_used;373,12229
+size_t _bytes_used;374,12250
+size_t _chunks_free;375,12270
+size_t _bytes_free;376,12291
+int __malloc_initialized;379,12340
+size_t __malloc_extra_blocks;381,12367
+static int state_protected_p;400,12912
+static size_t last_state_size;401,12942
+static malloc_info *last_heapinfo;last_heapinfo402,12973
+protect_malloc_state 405,13014
+#define PROTECT_MALLOC_STATE(426,13627
+#define PROTECT_MALLOC_STATE(429,13697
+align 435,13794
+get_contiguous_space 466,14616
+register_heapinfo 497,15325
+pthread_mutex_t _malloc_mutex 517,15879
+pthread_mutex_t _aligned_blocks_mutex 518,15938
+int _malloc_thread_enabled_p;519,16005
+malloc_atfork_handler_prepare 522,16048
+malloc_atfork_handler_parent 529,16139
+malloc_atfork_handler_child 536,16233
+malloc_enable_thread 544,16375
+malloc_initialize_1 563,16961
+__malloc_initialize 594,17793
+static int morecore_recursing;604,17926
+morecore_nolock 609,18066
+_malloc_internal_nolock 722,21584
+_malloc_internal 920,28102
+malloc 932,28247
+_malloc 961,29140
+_free 967,29196
+_realloc 973,29240
+struct alignlist *_aligned_blocks _aligned_blocks1004,30345
+_free_internal_nolock 1009,30474
+_free_internal 1255,38476
+free 1265,38603
+weak_alias 1277,38799
+#define min(1306,39813
+_realloc_internal_nolock 1319,40309
+_realloc_internal 1435,43563
+realloc 1447,43726
+calloc 1478,44894
+#define        __sbrk  1513,46042
+__default_morecore 1525,46511
+aligned_alloc 1557,47522
+memalign 1647,49704
+posix_memalign 1656,49909
+static size_t pagesize;1703,51317
+valloc 1706,51349
+#undef malloc1715,51490
+#undef realloc1716,51504
+#undef calloc1717,51519
+#undef aligned_alloc1718,51533
+#undef free1719,51554
+hybrid_malloc 1736,52083
+hybrid_calloc 1744,52188
+hybrid_free 1752,52319
+hybrid_aligned_alloc 1765,52626
+hybrid_realloc 1780,52984
+hybrid_get_current_dir_name 1811,53797
+#define MAGICWORD      1854,55206
+#define MAGICFREE      1855,55261
+#define MAGICBYTE      1856,55316
+#define MALLOCFLOOD    1857,55348
+#define FREEFLOOD      1858,55382
+struct hdr1860,55415
+    size_t size;1862,55430
+    size_t magic;1863,55484
+checkhdr 1867,55581
+freehook 1891,56022
+mallochook 1927,56804
+reallochook 1944,57143
+mabort 1978,57901
+static int mcheck_used 2012,58586
+mcheck 2015,58619
+mprobe 2035,59138
+
+c-src/emacs/src/regex.h,4485
+#define _REGEX_H 21,836
+typedef unsigned long reg_syntax_t;43,1577
+#define RE_BACKSLASH_ESCAPE_IN_LISTS 47,1749
+#define RE_BK_PLUS_QM 52,1969
+#define RE_CHAR_CLASSES 58,2298
+#define RE_CONTEXT_INDEP_ANCHORS 72,3032
+#define RE_CONTEXT_INDEP_OPS 80,3458
+#define RE_CONTEXT_INVALID_OPS 84,3658
+#define RE_DOT_NEWLINE 88,3801
+#define RE_DOT_NOT_NULL 92,3937
+#define RE_HAT_LISTS_NOT_NEWLINE 96,4082
+#define RE_INTERVALS 101,4292
+#define RE_LIMITED_OPS 105,4441
+#define RE_NEWLINE_ALT 109,4583
+#define RE_NO_BK_BRACES 114,4773
+#define RE_NO_BK_PARENS 118,4964
+#define RE_NO_BK_REFS 122,5120
+#define RE_NO_BK_VBAR 126,5316
+#define RE_NO_EMPTY_RANGES 132,5610
+#define RE_UNMATCHED_RIGHT_PAREN_ORD 136,5766
+#define RE_NO_POSIX_BACKTRACKING 140,5937
+#define RE_NO_GNU_OPS 144,6133
+#define RE_FRUGAL 147,6253
+#define RE_SHY_GROUPS 150,6360
+#define RE_NO_NEWLINE_ANCHOR 153,6468
+#define RE_DEBUG 161,6884
+#define RE_SYNTAX_EMACS        183,7684
+#define RE_SYNTAX_AWK  186,7780
+#define RE_SYNTAX_GNU_AWK      193,8084
+#define RE_SYNTAX_POSIX_AWK 197,8255
+#define RE_SYNTAX_GREP 201,8393
+#define RE_SYNTAX_EGREP        206,8549
+#define RE_SYNTAX_POSIX_EGREP  212,8765
+#define RE_SYNTAX_ED 216,8910
+#define RE_SYNTAX_SED 218,8954
+#define _RE_SYNTAX_POSIX_COMMON        221,9072
+#define RE_SYNTAX_POSIX_BASIC  225,9215
+#define RE_SYNTAX_POSIX_MINIMAL_BASIC  231,9508
+#define RE_SYNTAX_POSIX_EXTENDED       234,9598
+#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED       242,9967
+# undef RE_DUP_MAX253,10454
+#define RE_DUP_MAX 256,10540
+#define REG_EXTENDED 263,10762
+#define REG_ICASE 267,10886
+#define REG_NEWLINE 272,11070
+#define REG_NOSUB 276,11248
+#define REG_NOTBOL 286,11614
+#define REG_NOTEOL 289,11688
+  REG_ENOSYS 297,11859
+  REG_NOERROR 300,11941
+  REG_NOMATCH,301,11976
+  REG_BADPAT,305,12123
+  REG_ECOLLATE,306,12162
+  REG_ECTYPE,307,12203
+  REG_EESCAPE,308,12255
+  REG_ESUBREG,309,12298
+  REG_EBRACK,310,12345
+  REG_EPAREN,311,12391
+  REG_EBRACE,312,12436
+  REG_BADBR,313,12472
+  REG_ERANGE,314,12519
+  REG_ESPACE,315,12560
+  REG_BADRPT,316,12601
+  REG_EEND,319,12693
+  REG_ESIZE,320,12728
+  REG_ERPAREN,321,12790
+  REG_ERANGEX  322,12859
+} reg_errcode_t;323,12911
+# define RE_TRANSLATE_TYPE 332,13273
+struct re_pattern_buffer335,13315
+  unsigned char *buffer;buffer341,13538
+  size_t allocated;344,13614
+  size_t used;347,13686
+  reg_syntax_t syntax;350,13769
+  char *fastmap;fastmap355,13975
+  RE_TRANSLATE_TYPE translate;361,14241
+  size_t re_nsub;364,14329
+  unsigned can_be_null 370,14624
+#define REGS_UNALLOCATED 376,14889
+#define REGS_REALLOCATE 377,14916
+#define REGS_FIXED 378,14942
+  unsigned regs_allocated 379,14963
+  unsigned fastmap_accurate 383,15136
+  unsigned no_sub 387,15267
+  unsigned not_bol 391,15398
+  unsigned not_eol 394,15475
+  unsigned used_syntax 398,15655
+  unsigned multibyte 403,15805
+  unsigned target_multibyte 407,15941
+  int charset_unibyte;410,16032
+typedef struct re_pattern_buffer regex_t;416,16098
+typedef ssize_t regoff_t;423,16492
+struct re_registers428,16652
+  unsigned num_regs;430,16674
+  regoff_t *start;start431,16695
+  regoff_t *end;end432,16714
+# define RE_NREGS 440,16942
+  regoff_t rm_so;449,17159
+  regoff_t rm_eo;450,17239
+} regmatch_t;451,17317
+#  define _Restrict_ 540,20886
+#  define _Restrict_ 542,20979
+#  define _Restrict_544,21018
+#  define _Restrict_arr_ 555,21418
+#  define _Restrict_arr_557,21461
+#  define CHAR_CLASS_MAX_LENGTH 593,22470
+#  define CHAR_CLASS_MAX_LENGTH 597,22648
+typedef wctype_t re_wctype_t;599,22692
+typedef wchar_t re_wchar_t;600,22722
+# define re_wctype 601,22750
+# define re_iswctype 602,22776
+# define re_wctype_to_bit(603,22806
+# define CHAR_CLASS_MAX_LENGTH 605,22844
+# define btowc(606,22906
+typedef enum { RECC_ERROR 609,22953
+              RECC_ALNUM,610,22984
+              RECC_ALNUM, RECC_ALPHA,610,22984
+              RECC_ALNUM, RECC_ALPHA, RECC_WORD,610,22984
+              RECC_GRAPH,611,23027
+              RECC_GRAPH, RECC_PRINT,611,23027
+              RECC_LOWER,612,23059
+              RECC_LOWER, RECC_UPPER,612,23059
+              RECC_PUNCT,613,23091
+              RECC_PUNCT, RECC_CNTRL,613,23091
+              RECC_DIGIT,614,23123
+              RECC_DIGIT, RECC_XDIGIT,614,23123
+              RECC_BLANK,615,23156
+              RECC_BLANK, RECC_SPACE,615,23156
+              RECC_MULTIBYTE,616,23188
+              RECC_MULTIBYTE, RECC_NONASCII,616,23188
+              RECC_ASCII,617,23227
+              RECC_ASCII, RECC_UNIBYTE617,23227
+} re_wctype_t;618,23260
+typedef int re_wchar_t;623,23387
+
+c-src/emacs/src/keyboard.c,13949
+volatile int interrupt_input_blocked;76,1808
+volatile bool pending_signals;80,1944
+#define KBD_BUFFER_SIZE 82,1976
+KBOARD *initial_kboard;initial_kboard84,2006
+KBOARD *current_kboard;current_kboard85,2030
+static KBOARD *all_kboards;all_kboards86,2054
+static bool single_kboard;89,2154
+#define NUM_RECENT_KEYS 91,2182
+static int recent_keys_index;94,2269
+static int total_keys;97,2357
+static Lisp_Object recent_keys;100,2443
+Lisp_Object this_command_keys;107,2777
+ptrdiff_t this_command_key_count;108,2808
+static bool this_command_key_count_reset;112,2922
+static Lisp_Object raw_keybuf;116,3074
+static int raw_keybuf_count;117,3105
+#define GROW_RAW_KEYBUF        119,3135
+static ptrdiff_t this_single_command_key_start;125,3350
+static ptrdiff_t before_command_key_count;129,3498
+static ptrdiff_t before_command_echo_length;130,3541
+sigjmp_buf return_to_command_loop;135,3677
+static Lisp_Object recover_top_level_message;138,3791
+static Lisp_Object regular_top_level_message;143,3930
+static sys_jmp_buf getcjmp;147,4031
+bool waiting_for_input;150,4095
+static bool echoing;154,4186
+static struct kboard 
*ok_to_echo_at_next_pause;ok_to_echo_at_next_pause159,4328
+struct kboard *echo_kboard;echo_kboard166,4632
+Lisp_Object echo_message_buffer;171,4744
+bool immediate_quit;174,4837
+int quit_char;192,5623
+EMACS_INT command_loop_level;195,5680
+Lisp_Object unread_switch_frame;204,6108
+static ptrdiff_t last_non_minibuf_size;207,6216
+uintmax_t num_input_events;210,6334
+static EMACS_INT last_auto_save;214,6428
+static ptrdiff_t last_point_position;217,6523
+Lisp_Object internal_last_event_frame;228,7028
+static Lisp_Object read_key_sequence_cmd;232,7168
+static Lisp_Object read_key_sequence_remapped;233,7210
+static FILE *dribble;dribble236,7310
+bool input_pending;239,7368
+static bool input_was_pending;287,10022
+static struct input_event kbd_buffer[kbd_buffer291,10107
+static struct input_event *kbd_fetch_ptr;kbd_fetch_ptr297,10386
+static struct input_event * volatile kbd_store_ptr;302,10601
+unsigned timers_run;320,11296
+struct timespec 
*input_available_clear_time;input_available_clear_time324,11408
+bool interrupt_input;328,11573
+bool interrupts_deferred;331,11671
+static struct timespec timer_idleness_start_time;335,11746
+static struct timespec timer_last_idleness_start_time;340,11916
+#define READABLE_EVENTS_DO_TIMERS_NOW  346,12046
+#define READABLE_EVENTS_FILTER_EVENTS  347,12094
+#define READABLE_EVENTS_IGNORE_SQUEEZABLES     348,12142
+kset_echo_string 392,14088
+kset_kbd_queue 397,14184
+kset_keyboard_translate_table 402,14276
+kset_last_prefix_arg 407,14399
+kset_last_repeatable_command 412,14504
+kset_local_function_key_map 417,14625
+kset_overriding_terminal_local_map 422,14744
+kset_real_last_command 427,14877
+kset_system_key_syms 432,14986
+echo_add_key 443,15249
+echo_char 527,17527
+echo_dash 541,17813
+echo_now 586,19140
+cancel_echoing 635,20614
+echo_length 648,20922
+echo_truncate 660,21253
+add_command_key 672,21582
+recursive_edit_1 697,22406
+record_auto_save 742,23848
+force_auto_save_soon 751,24016
+DEFUN ("recursive-edit", Frecursive_edit,recursive-edit759,24137
+recursive_edit_unwind 804,25747
+any_kboard_state 817,26013
+single_kboard_state 838,26665
+not_single_kboard_state 848,26803
+struct kboard_stack858,27065
+  KBOARD *kboard;kboard860,27087
+  struct kboard_stack *next;next861,27105
+static struct kboard_stack *kboard_stack;kboard_stack864,27138
+push_kboard 867,27186
+pop_kboard 879,27375
+temporarily_switch_to_single_kboard 914,28263
+record_single_kboard_state 943,29437
+restore_kboard_configuration 952,29621
+cmd_error 970,30077
+cmd_error_internal 1024,31510
+DEFUN ("command-error-default-function", 
Fcommand_error_default_function,command-error-default-function1043,32030
+command_loop 1094,33916
+command_loop_2 1134,35135
+top_level_2 1146,35339
+top_level_1 1152,35417
+DEFUN ("top-level", Ftop_level,top-level1164,35787
+user_error 1183,36288
+DEFUN ("exit-recursive-edit", 
Fexit_recursive_edit,exit-recursive-edit1189,36429
+DEFUN ("abort-recursive-edit", 
Fabort_recursive_edit,abort-recursive-edit1201,36819
+tracking_off 1216,37281
+DEFUN ("internal--track-mouse", Ftrack_mouse,track-mouse1234,37816
+bool ignore_mouse_drag_p;1256,38392
+some_mouse_moved 1259,38441
+Lisp_Object last_undo_boundary;1287,39032
+command_loop_1 1294,39273
+read_menu_command 1649,50889
+adjust_point_for_property 1678,51617
+safe_run_hooks_1 1831,57339
+safe_run_hooks_error 1841,57569
+safe_run_hook_funcall 1878,58576
+safe_run_hooks 1893,59058
+int poll_suppress_count;1908,59397
+static struct atimer *poll_timer;poll_timer1915,59487
+poll_for_input_1 1919,59589
+poll_for_input 1930,59789
+start_polling 1942,60053
+input_polling_used 1979,61091
+stop_polling 1994,61390
+set_poll_suppress_count 2009,61759
+bind_polling_period 2029,62141
+make_ctrl_char 2048,62492
+show_help_echo 2113,64455
+static Lisp_Object help_form_saved_window_configs;2156,65638
+read_char_help_form_unwind 2158,65701
+#define STOP_POLLING   2166,65959
+#define RESUME_POLLING 2170,66084
+read_event_from_main_queue 2175,66229
+read_decoded_event_from_main_queue 2249,68417
+#define MAX_ENCODED_BYTES 2254,68664
+echo_keystrokes_p 2342,71556
+read_char 2376,72848
+record_menu_key 3225,98949
+help_char_p 3258,99674
+record_char 3273,99953
+save_getcjmp 3412,104235
+restore_getcjmp 3418,104326
+readable_events 3430,104697
+int stop_character EXTERNALLY_VISIBLE;3497,106437
+event_to_kboard 3500,106493
+kbd_buffer_nr_stored 3522,107142
+kbd_buffer_store_event 3534,107483
+kbd_buffer_store_event_hold 3550,108025
+kbd_buffer_unget_event 3684,111617
+#define INPUT_EVENT_POS_MAX 3698,112018
+#define INPUT_EVENT_POS_MIN 3701,112147
+position_to_Time 3706,112287
+Time_to_position 3716,112514
+gen_help_event 3738,113171
+kbd_buffer_store_help_event 3756,113611
+discard_mouse_events 3773,113976
+kbd_buffer_events_waiting 3803,114711
+clear_event 3823,115068
+kbd_buffer_get_event 3836,115408
+process_special_events 4258,127881
+swallow_events 4322,129705
+timer_start_idle 4339,130098
+timer_stop_idle 4355,130576
+timer_resume_idle 4363,130720
+struct input_event last_timer_event EXTERNALLY_VISIBLE;4372,130912
+Lisp_Object pending_funcalls;4377,131172
+decode_timer 4381,131293
+timer_check_2 4414,132246
+timer_check 4572,136817
+DEFUN ("current-idle-time", Fcurrent_idle_time,current-idle-time4607,137662
+static Lisp_Object accent_key_syms;4625,138239
+static Lisp_Object func_key_syms;4626,138275
+static Lisp_Object mouse_syms;4627,138309
+static Lisp_Object wheel_syms;4628,138340
+static Lisp_Object drag_n_drop_syms;4629,138371
+static const int lispy_accent_codes[lispy_accent_codes4634,138516
+static const char *const lispy_accent_keys[lispy_accent_keys4741,139878
+#define FUNCTION_KEY_OFFSET 4766,140314
+const char *const lispy_function_keys[lispy_function_keys4768,140347
+static const char *const 
lispy_multimedia_keys[lispy_multimedia_keys4962,148901
+static const char *const lispy_kana_keys[lispy_kana_keys5026,150135
+#define FUNCTION_KEY_OFFSET 5061,151751
+static const char *const lispy_function_keys[lispy_function_keys5065,151894
+#define ISO_FUNCTION_KEY_OFFSET 5149,154429
+static const char *const 
iso_lispy_function_keys[iso_lispy_function_keys5151,154469
+static Lisp_Object Vlispy_mouse_stem;5172,155328
+static const char *const lispy_wheel_names[lispy_wheel_names5174,155367
+static const char *const 
lispy_drag_n_drop_names[lispy_drag_n_drop_names5181,155619
+static short const scroll_bar_parts[scroll_bar_parts5189,155885
+static Lisp_Object button_down_location;5210,156910
+static int last_mouse_button;5215,157065
+static int last_mouse_x;5216,157095
+static int last_mouse_y;5217,157120
+static Time button_down_time;5218,157145
+static int double_click_count;5222,157229
+make_lispy_position 5228,157390
+toolkit_menubar_in_use 5456,163953
+make_scroll_bar_position 5469,164321
+make_lispy_event 5485,164967
+make_lispy_movement 6104,183531
+make_lispy_switch_frame 6131,184262
+make_lispy_focus_in 6137,184369
+make_lispy_focus_out 6145,184495
+parse_modifiers_uncached 6163,184945
+#define SINGLE_LETTER_MOD(6185,185465
+#undef SINGLE_LETTER_MOD6212,185906
+#define MULTI_LETTER_MOD(6214,185932
+#undef MULTI_LETTER_MOD6231,186400
+apply_modifiers_uncached 6273,187574
+static const char *const modifier_names[modifier_names6319,189193
+#define NUM_MOD_NAMES 6325,189399
+static Lisp_Object modifier_symbols;6327,189449
+lispy_modifier_list 6331,189586
+#define KEY_TO_CHAR(6353,190252
+parse_modifiers 6356,190328
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191517
+apply_modifiers 6422,192391
+reorder_modifiers 6491,194720
+modify_event_symbol 6536,196528
+DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199244
+parse_solitary_modifier 6695,201135
+#define SINGLE_LETTER_MOD(6701,201258
+#define MULTI_LETTER_MOD(6705,201343
+#undef SINGLE_LETTER_MOD6763,202641
+#undef MULTI_LETTER_MOD6764,202666
+lucid_event_type_list_p 6775,202889
+get_input_pending 6814,203960
+record_asynch_buffer_change 6834,204579
+gobble_input 6872,205702
+tty_read_avail_input 6967,208310
+handle_async_input 7149,214039
+process_pending_signals 7165,214359
+unblock_input_to 7177,214645
+unblock_input 7200,215277
+totally_unblock_input 7209,215445
+handle_input_available_signal 7217,215529
+deliver_input_available_signal 7226,215700
+struct user_signal_info7235,215865
+  int sig;7238,215915
+  char *name;name7241,215956
+  int npending;7244,216007
+  struct user_signal_info *next;next7246,216024
+static struct user_signal_info *user_signals user_signals7250,216090
+add_user_signal 7253,216149
+handle_user_signal 7275,216598
+deliver_user_signal 7316,217558
+find_user_signal_name 7322,217659
+store_user_signal_events 7334,217841
+static Lisp_Object menu_bar_one_keymap_changed_items;7363,218416
+static Lisp_Object menu_bar_items_vector;7368,218630
+static int menu_bar_items_index;7369,218672
+static const char *separator_names[separator_names7372,218707
+menu_separator_name_p 7393,219148
+menu_bar_items 7426,219852
+Lisp_Object item_properties;7568,224603
+menu_bar_item 7571,224645
+menu_item_eval_property_1 7647,227175
+eval_dyn 7658,227465
+menu_item_eval_property 7666,227675
+parse_menu_item 7686,228341
+static Lisp_Object tool_bar_items_vector;7965,236336
+static Lisp_Object tool_bar_item_properties;7970,236510
+static int ntool_bar_items;7974,236606
+tool_bar_items 7990,237083
+process_tool_bar_item 8075,239892
+#define PROP(8112,240969
+set_prop 8114,241038
+parse_tool_bar_item 8167,242453
+#undef PROP8379,248844
+init_tool_bar_items 8387,248969
+append_tool_bar_item 8401,249261
+read_char_x_menu_prompt 8443,250771
+read_char_minibuf_menu_prompt 8503,252445
+#define PUSH_C_STR(8527,253014
+follow_key 8726,258553
+active_maps 8733,258695
+typedef struct keyremap8742,259021
+  Lisp_Object parent;8745,259107
+  Lisp_Object map;8748,259224
+  int start,8753,259446
+  int start, end;8753,259446
+} keyremap;8754,259464
+access_keymap_keyremap 8764,259808
+keyremap_step 8811,261450
+test_undefined 8867,262934
+read_key_sequence 8916,264861
+read_key_sequence_vs 9826,295821
+DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297294
+DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299982
+detect_input_pending 9950,300488
+detect_input_pending_ignore_squeezables 9959,300654
+detect_input_pending_run_timers 9967,300870
+clear_input_pending 9985,301362
+requeued_events_pending_p 9997,301732
+DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301813
+DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302596
+DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303517
+DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303958
+DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304380
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304955
+DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305495
+DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306510
+DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307069
+DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307406
+DEFUN ("discard-input", Fdiscard_input,discard-input10203,308447
+DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308949
+stuff_buffered_input 10285,311045
+set_waiting_for_input 10323,312016
+clear_waiting_for_input 10337,312390
+handle_interrupt_signal 10351,312754
+deliver_interrupt_signal 10378,313642
+static int volatile force_quit_count;10387,313932
+handle_interrupt 10401,314414
+quit_throw_to_read_char 10541,318711
+DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319288
+DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320516
+DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321432
+DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322706
+DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323570
+DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324459
+DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325837
+DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327060
+init_kboard 10861,328214
+allocate_kboard 10893,329284
+wipe_kboard 10909,329637
+delete_kboard 10917,329751
+init_keyboard 10942,330281
+struct event_head11021,332696
+  short var;11023,332716
+  short kind;11024,332729
+static const struct event_head head_table[head_table11027,332747
+syms_of_keyboard 11045,333577
+keys_of_keyboard 11841,367115
+mark_kboards 11916,370434
+
+c-src/emacs/src/lisp.h,25767
+#define EMACS_LISP_H22,800
+#define DECLARE_GDB_SYM(47,1421
+# define DEFINE_GDB_SYMBOL_BEGIN(49,1508
+# define DEFINE_GDB_SYMBOL_END(50,1578
+# define DEFINE_GDB_SYMBOL_BEGIN(52,1625
+# define DEFINE_GDB_SYMBOL_END(53,1702
+#undef min57,1790
+#undef max58,1801
+#define max(59,1812
+#define min(60,1854
+#define ARRAYELTS(63,1936
+#define GCTYPEBITS 67,2079
+DEFINE_GDB_SYMBOL_BEGIN GCTYPEBITS66,2037
+# define NONPOINTER_BITS 78,2567
+# define NONPOINTER_BITS 80,2600
+typedef int EMACS_INT;91,3023
+typedef unsigned int EMACS_UINT;92,3046
+#  define EMACS_INT_MAX 93,3079
+#  define pI 94,3111
+typedef long int EMACS_INT;96,3203
+typedef unsigned long EMACS_UINT;97,3231
+#  define EMACS_INT_MAX 98,3265
+#  define pI 99,3298
+typedef long long int EMACS_INT;103,3477
+typedef unsigned long long int EMACS_UINT;104,3510
+#  define EMACS_INT_MAX 105,3553
+#  define pI 106,3587
+enum {  BOOL_VECTOR_BITS_PER_CHAR 114,3804
+#define BOOL_VECTOR_BITS_PER_CHAR 115,3840
+typedef size_t bits_word;123,4165
+# define BITS_WORD_MAX 124,4191
+enum { BITS_PER_BITS_WORD 125,4223
+typedef unsigned char bits_word;127,4290
+# define BITS_WORD_MAX 128,4323
+enum { BITS_PER_BITS_WORD 129,4386
+    BITS_PER_CHAR 136,4570
+    BITS_PER_SHORT 137,4605
+    BITS_PER_LONG 138,4657
+    BITS_PER_EMACS_INT 139,4712
+typedef intmax_t printmax_t;148,5089
+typedef uintmax_t uprintmax_t;149,5118
+# define pMd 150,5149
+# define pMu 151,5170
+typedef EMACS_INT printmax_t;153,5197
+typedef EMACS_UINT uprintmax_t;154,5227
+# define pMd 155,5259
+# define pMu 156,5278
+# define pD 165,5664
+# define pD 167,5709
+# define pD 169,5756
+# define pD 171,5779
+# define eassert(200,7062
+# define eassume(201,7140
+# define eassert(208,7319
+# define eassume(212,7450
+enum Lisp_Bits239,8519
+#define GCALIGNMENT 243,8647
+    VALBITS 246,8742
+    INTTYPEBITS 249,8838
+    FIXNUM_BITS 252,8945
+#define VAL_MAX 263,9327
+#define USE_LSB_TAG 271,9777
+DEFINE_GDB_SYMBOL_BEGIN USE_LSB_TAG270,9733
+# define alignas(281,10077
+# define GCALIGNED 288,10227
+# define GCALIGNED 290,10292
+# define lisp_h_XLI(327,11642
+# define lisp_h_XIL(328,11673
+# define lisp_h_XLI(330,11724
+# define lisp_h_XIL(331,11751
+#define lisp_h_CHECK_LIST_CONS(333,11785
+#define lisp_h_CHECK_NUMBER(334,11856
+#define lisp_h_CHECK_SYMBOL(335,11927
+#define lisp_h_CHECK_TYPE(336,11996
+#define lisp_h_CONSP(338,12107
+#define lisp_h_EQ(339,12156
+#define lisp_h_FLOATP(340,12201
+#define lisp_h_INTEGERP(341,12252
+#define lisp_h_MARKERP(342,12333
+#define lisp_h_MISCP(343,12408
+#define lisp_h_NILP(344,12457
+#define lisp_h_SET_SYMBOL_VAL(345,12493
+#define lisp_h_SYMBOL_CONSTANT_P(347,12607
+#define lisp_h_SYMBOL_VAL(348,12671
+#define lisp_h_SYMBOLP(350,12772
+#define lisp_h_VECTORLIKEP(351,12825
+#define lisp_h_XCAR(352,12886
+#define lisp_h_XCDR(353,12924
+#define lisp_h_XCONS(354,12964
+#define lisp_h_XHASH(356,13059
+#define lisp_h_XPNTR(357,13093
+# define lisp_h_check_cons_list(360,13221
+# define lisp_h_make_number(363,13289
+# define lisp_h_XFASTINT(365,13392
+# define lisp_h_XINT(366,13429
+# define lisp_h_XSYMBOL(367,13478
+# define lisp_h_XTYPE(371,13631
+# define lisp_h_XUNTAG(372,13696
+# define XLI(381,14086
+# define XIL(382,14117
+# define CHECK_LIST_CONS(383,14148
+# define CHECK_NUMBER(384,14209
+# define CHECK_SYMBOL(385,14258
+# define CHECK_TYPE(386,14307
+# define CONSP(387,14382
+# define EQ(388,14417
+# define FLOATP(389,14452
+# define INTEGERP(390,14489
+# define MARKERP(391,14530
+# define MISCP(392,14569
+# define NILP(393,14604
+# define SET_SYMBOL_VAL(394,14637
+# define SYMBOL_CONSTANT_P(395,14700
+# define SYMBOL_VAL(396,14763
+# define SYMBOLP(397,14812
+# define VECTORLIKEP(398,14851
+# define XCAR(399,14898
+# define XCDR(400,14931
+# define XCONS(401,14964
+# define XHASH(402,14999
+# define XPNTR(403,15034
+#  define check_cons_list(405,15097
+#  define make_number(408,15176
+#  define XFASTINT(409,15224
+#  define XINT(410,15266
+#  define XSYMBOL(411,15300
+#  define XTYPE(412,15340
+#  define XUNTAG(413,15376
+#define LISP_MACRO_DEFUN(421,15672
+#define LISP_MACRO_DEFUN_VOID(425,15845
+#define INTMASK 437,16289
+#define case_Lisp_Int 438,16342
+#define ENUM_BF(445,16681
+#define ENUM_BF(447,16722
+enum Lisp_Type451,16763
+    Lisp_Symbol 454,16851
+    Lisp_Misc 458,16993
+    Lisp_Int0 461,17067
+    Lisp_Int1 462,17086
+    Lisp_String 466,17264
+    Lisp_Vectorlike 472,17543
+    Lisp_Cons 475,17632
+    Lisp_Float 477,17670
+enum Lisp_Misc_Type485,18016
+    Lisp_Misc_Free 487,18040
+    Lisp_Misc_Marker,488,18069
+    Lisp_Misc_Overlay,489,18091
+    Lisp_Misc_Save_Value,490,18114
+    Lisp_Misc_Finalizer,491,18140
+    Lisp_Misc_Float,494,18275
+    Lisp_Misc_Limit496,18359
+enum Lisp_Fwd_Type502,18543
+    Lisp_Fwd_Int,504,18566
+    Lisp_Fwd_Bool,505,18619
+    Lisp_Fwd_Obj,506,18670
+    Lisp_Fwd_Buffer_Obj,507,18729
+    Lisp_Fwd_Kboard_Obj        508,18800
+typedef struct { EMACS_INT i;567,21781
+typedef struct { EMACS_INT i; } Lisp_Object;567,21781
+#define LISP_INITIALLY(569,21827
+#undef CHECK_LISP_OBJECT_TYPE571,21858
+enum CHECK_LISP_OBJECT_TYPE 572,21888
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE 572,21888
+typedef EMACS_INT Lisp_Object;577,22064
+#define LISP_INITIALLY(578,22095
+enum CHECK_LISP_OBJECT_TYPE 579,22125
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE 579,22125
+#define LISP_INITIALLY_ZERO 582,22226
+enum symbol_interned639,24199
+  SYMBOL_UNINTERNED 641,24222
+  SYMBOL_INTERNED 642,24247
+  SYMBOL_INTERNED_IN_INITIAL_OBARRAY 643,24270
+enum symbol_redirect646,24315
+  SYMBOL_PLAINVAL 648,24338
+  SYMBOL_VARALIAS 649,24362
+  SYMBOL_LOCALIZED 650,24386
+  SYMBOL_FORWARDED 651,24410
+struct Lisp_Symbol654,24437
+  bool_bf gcmarkbit 656,24458
+  ENUM_BF 663,24793
+    Lisp_Object value;687,25631
+    struct Lisp_Symbol *alias;alias688,25654
+    struct Lisp_Buffer_Local_Value *blv;blv689,25685
+    union Lisp_Fwd *fwd;fwd690,25726
+  } val;691,25751
+  Lisp_Object function;694,25823
+  Lisp_Object plist;697,25885
+  struct Lisp_Symbol *next;next700,25974
+#define EXFUN(707,26252
+#define DEFUN_ARGS_MANY        712,26446
+#define DEFUN_ARGS_UNEVALLED   713,26498
+#define DEFUN_ARGS_0   714,26541
+#define DEFUN_ARGS_1   715,26569
+#define DEFUN_ARGS_2   716,26604
+#define DEFUN_ARGS_3   717,26652
+#define DEFUN_ARGS_4   718,26713
+#define DEFUN_ARGS_5   719,26787
+#define DEFUN_ARGS_6   721,26880
+#define DEFUN_ARGS_7   723,26986
+#define DEFUN_ARGS_8   725,27105
+#define TAG_PTR(729,27296
+#define TAG_SYMOFFSET(734,27543
+#define XLI_BUILTIN_LISPSYM(741,27842
+#define DEFINE_LISP_SYMBOL(746,28101
+# define DEFINE_NON_NIL_Q_SYMBOL_MACROS 755,28572
+LISP_MACRO_DEFUN 762,28777
+# define ARRAY_MARK_FLAG 768,29024
+# define PSEUDOVECTOR_FLAG 774,29267
+enum pvec_type780,29568
+  PVEC_NORMAL_VECTOR,782,29585
+  PVEC_FREE,783,29607
+  PVEC_PROCESS,784,29620
+  PVEC_FRAME,785,29636
+  PVEC_WINDOW,786,29650
+  PVEC_BOOL_VECTOR,787,29665
+  PVEC_BUFFER,788,29685
+  PVEC_HASH_TABLE,789,29700
+  PVEC_TERMINAL,790,29719
+  PVEC_WINDOW_CONFIGURATION,791,29736
+  PVEC_SUBR,792,29765
+  PVEC_OTHER,793,29778
+  PVEC_COMPILED,795,29856
+  PVEC_CHAR_TABLE,796,29873
+  PVEC_SUB_CHAR_TABLE,797,29892
+  PVEC_FONT 798,29915
+enum More_Lisp_Bits801,29991
+    PSEUDOVECTOR_SIZE_BITS 808,30382
+    PSEUDOVECTOR_SIZE_MASK 809,30415
+    PSEUDOVECTOR_REST_BITS 813,30625
+    PSEUDOVECTOR_REST_MASK 814,30658
+    PSEUDOVECTOR_AREA_BITS 818,30823
+    PVEC_TYPE_MASK 819,30901
+# define VALMASK 829,31302
+DEFINE_GDB_SYMBOL_BEGIN VALMASK828,31257
+#define MOST_POSITIVE_FIXNUM 834,31532
+#define MOST_NEGATIVE_FIXNUM 835,31592
+XINT 874,32684
+XFASTINT 889,33035
+XSYMBOL 899,33263
+XTYPE 910,33481
+XUNTAG 918,33661
+LISP_MACRO_DEFUN 927,33857
+LISP_MACRO_DEFUN 940,34242
+#define FIXNUM_OVERFLOW_P(958,34855
+LISP_MACRO_DEFUN FIXNUM_OVERFLOW_P952,34632
+LISP_MACRO_DEFUN 970,35171
+XSTRING 980,35391
+#define SYMBOL_INDEX(988,35575
+XFLOAT 991,35636
+XPROCESS 1000,35778
+XWINDOW 1007,35895
+XTERMINAL 1014,36012
+XSUBR 1021,36134
+XBUFFER 1028,36245
+XCHAR_TABLE 1035,36369
+XSUB_CHAR_TABLE 1042,36506
+XBOOL_VECTOR 1049,36648
+make_lisp_ptr 1058,36827
+make_lisp_symbol 1066,37013
+builtin_lisp_symbol 1074,37197
+#define XSETINT(1079,37279
+#define XSETFASTINT(1080,37325
+#define XSETCONS(1081,37375
+#define XSETVECTOR(1082,37435
+#define XSETSTRING(1083,37503
+#define XSETSYMBOL(1084,37567
+#define XSETFLOAT(1085,37621
+#define XSETMISC(1086,37683
+#define XSETPVECTYPE(1090,37772
+#define XSETPVECTYPESIZE(1092,37888
+#define XSETPSEUDOVECTOR(1099,38185
+#define XSETTYPED_PSEUDOVECTOR(1105,38369
+#define XSETWINDOW_CONFIGURATION(1110,38579
+#define XSETPROCESS(1112,38675
+#define XSETWINDOW(1113,38741
+#define XSETTERMINAL(1114,38805
+#define XSETSUBR(1115,38873
+#define XSETCOMPILED(1116,38933
+#define XSETBUFFER(1117,39001
+#define XSETCHAR_TABLE(1118,39065
+#define XSETBOOL_VECTOR(1119,39137
+#define XSETSUB_CHAR_TABLE(1120,39211
+XINTPTR 1128,39581
+make_pointer_integer 1134,39661
+LISP_MACRO_DEFUN_VOID 1143,39826
+typedef struct interval *INTERVAL;INTERVAL1149,39987
+      Lisp_Object cdr;1159,40162
+      struct Lisp_Cons *chain;chain1162,40236
+xcar_addr 1174,40760
+xcdr_addr 1179,40837
+LISP_MACRO_DEFUN 1185,40931
+XSETCDR 1198,41307
+CAR 1205,41457
+CDR 1212,41591
+CAR_SAFE 1221,41791
+CDR_SAFE 1226,41877
+STRING_MULTIBYTE 1243,42250
+#define STRING_BYTES_BOUND 1261,43057
+#define STRING_SET_UNIBYTE(1265,43201
+#define STRING_SET_MULTIBYTE(1275,43516
+SDATA 1286,43830
+SSDATA 1291,43908
+SREF 1297,44037
+SSET 1302,44128
+SCHARS 1307,44242
+STRING_BYTES 1316,44415
+SBYTES 1326,44595
+STRING_SET_CHARS 1331,44681
+struct vectorlike_header1343,45232
+    ptrdiff_t size;1364,46383
+struct Lisp_Vector1369,46482
+    struct vectorlike_header header;1371,46505
+    Lisp_Object contents[contents1372,46542
+    ALIGNOF_STRUCT_LISP_VECTOR1378,46681
+struct Lisp_Bool_Vector1384,46864
+    struct vectorlike_header header;1388,47012
+    EMACS_INT size;1390,47086
+    bits_word data[data1395,47319
+bool_vector_size 1399,47385
+bool_vector_data 1407,47523
+bool_vector_uchar_data 1413,47617
+bool_vector_words 1421,47803
+bool_vector_bytes 1428,47998
+bool_vector_bitref 1437,48238
+bool_vector_ref 1445,48478
+bool_vector_set 1453,48618
+    header_size 1471,49047
+    bool_header_size 1472,49106
+    word_size 1473,49171
+AREF 1479,49284
+aref_addr 1485,49391
+ASIZE 1491,49501
+ASET 1497,49583
+gc_aset 1504,49742
+enum { NIL_IS_ZERO 1515,50269
+memclear 1520,50464
+#define VECSIZE(1531,50762
+#define PSEUDOVECSIZE(1538,51047
+#define UNSIGNED_CMP(1546,51480
+#define ASCII_CHAR_P(1552,51734
+enum CHARTAB_SIZE_BITS1565,52489
+    CHARTAB_SIZE_BITS_0 1567,52516
+    CHARTAB_SIZE_BITS_1 1568,52545
+    CHARTAB_SIZE_BITS_2 1569,52574
+    CHARTAB_SIZE_BITS_3 1570,52603
+struct Lisp_Char_Table1575,52672
+    struct vectorlike_header header;1581,52928
+    Lisp_Object defalt;1585,53078
+    Lisp_Object parent;1590,53280
+    Lisp_Object purpose;1594,53398
+    Lisp_Object ascii;1598,53564
+    Lisp_Object contents[contents1600,53588
+    Lisp_Object extras[extras1603,53699
+struct Lisp_Sub_Char_Table1606,53752
+    struct vectorlike_header header;1610,53918
+    int depth;1618,54341
+    int min_char;1621,54417
+    Lisp_Object contents[contents1624,54492
+CHAR_TABLE_REF_ASCII 1628,54566
+CHAR_TABLE_REF 1648,55113
+CHAR_TABLE_SET 1658,55402
+struct Lisp_Subr1670,55786
+    struct vectorlike_header header;1672,55807
+      Lisp_Object (*a0)a01674,55856
+      Lisp_Object (*a1)a11675,55888
+      Lisp_Object (*a2)a21676,55927
+      Lisp_Object (*a3)a31677,55979
+      Lisp_Object (*a4)a41678,56044
+      Lisp_Object (*a5)a51679,56122
+      Lisp_Object (*a6)a61680,56213
+      Lisp_Object (*a7)a71681,56317
+      Lisp_Object (*a8)a81682,56434
+      Lisp_Object (*aUNEVALLED)aUNEVALLED1683,56564
+      Lisp_Object (*aMANY)aMANY1684,56616
+    } function;1685,56671
+    short min_args,1686,56687
+    short min_args, max_args;1686,56687
+    const char *symbol_name;symbol_name1687,56717
+    const char *intspec;intspec1688,56746
+    const char *doc;doc1689,56771
+enum char_table_specials1692,56798
+    CHAR_TABLE_STANDARD_SLOTS 1697,56993
+    SUB_CHAR_TABLE_OFFSET 1701,57214
+CHAR_TABLE_EXTRA_SLOTS 1707,57377
+LISP_MACRO_DEFUN 1723,57921
+SYMBOL_BLV 1732,58181
+SYMBOL_FWD 1738,58316
+LISP_MACRO_DEFUN_VOID 1744,58428
+SET_SYMBOL_BLV 1754,58691
+SET_SYMBOL_FWD 1760,58850
+SYMBOL_NAME 1767,59001
+SYMBOL_INTERNED_P 1775,59130
+SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P 1783,59299
+#define DEFSYM(1796,59809
+LISP_MACRO_DEFUN DEFSYM1792,59630
+struct hash_table_test1805,60062
+  Lisp_Object name;1808,60139
+  Lisp_Object user_hash_function;1811,60206
+  Lisp_Object user_cmp_function;1814,60297
+  bool (*cmpfn)cmpfn1817,60372
+  EMACS_UINT (*hashfn)hashfn1820,60486
+struct Lisp_Hash_Table1823,60555
+  struct vectorlike_header header;1826,60649
+  Lisp_Object weak;1830,60783
+  Lisp_Object rehash_size;1835,61007
+  Lisp_Object rehash_threshold;1839,61129
+  Lisp_Object hash;1843,61260
+  Lisp_Object next;1848,61490
+  Lisp_Object next_free;1851,61560
+  Lisp_Object index;1856,61771
+  ptrdiff_t count;1863,62041
+  Lisp_Object key_and_value;1868,62240
+  struct hash_table_test test;1871,62314
+  struct Lisp_Hash_Table *next_weak;next_weak1875,62457
+XHASH_TABLE 1880,62531
+#define XSET_HASH_TABLE(1885,62602
+HASH_TABLE_P 1889,62703
+HASH_KEY 1896,62860
+HASH_VALUE 1903,63040
+HASH_NEXT 1911,63254
+HASH_HASH 1918,63431
+HASH_INDEX 1926,63677
+HASH_TABLE_SIZE 1933,63826
+enum DEFAULT_HASH_SIZE 1940,63956
+enum DEFAULT_HASH_SIZE { DEFAULT_HASH_SIZE 1940,63956
+static double const DEFAULT_REHASH_THRESHOLD 1946,64176
+static double const DEFAULT_REHASH_SIZE 1950,64299
+sxhash_combine 1956,64465
+SXHASH_REDUCE 1964,64648
+struct Lisp_Misc_Any   1971,64806
+  ENUM_BF 1973,64866
+struct Lisp_Marker1978,64980
+  ENUM_BF 1980,65001
+struct Lisp_Overlay2021,66838
+    ENUM_BF 2034,67346
+    SAVE_UNUSED,2047,67641
+    SAVE_INTEGER,2048,67658
+    SAVE_FUNCPOINTER,2049,67676
+    SAVE_POINTER,2050,67698
+    SAVE_OBJECT2051,67716
+enum { SAVE_SLOT_BITS 2055,67801
+enum { SAVE_VALUE_SLOTS 2058,67898
+enum { SAVE_TYPE_BITS 2062,68006
+enum Lisp_Save_Type2064,68072
+    SAVE_TYPE_INT_INT 2066,68096
+    SAVE_TYPE_INT_INT_INT2067,68169
+    SAVE_TYPE_OBJ_OBJ 2069,68259
+    SAVE_TYPE_OBJ_OBJ_OBJ 2070,68330
+    SAVE_TYPE_OBJ_OBJ_OBJ_OBJ2071,68411
+    SAVE_TYPE_PTR_INT 2073,68506
+    SAVE_TYPE_PTR_OBJ 2074,68579
+    SAVE_TYPE_PTR_PTR 2075,68651
+    SAVE_TYPE_FUNCPTR_PTR_OBJ2076,68724
+    SAVE_TYPE_MEMORY 2080,68882
+typedef void (*voidfuncptr)voidfuncptr2108,69836
+struct Lisp_Save_Value2110,69873
+    ENUM_BF 2112,69900
+      void *pointer;pointer2125,70555
+      voidfuncptr funcpointer;2126,70576
+      ptrdiff_t integer;2127,70607
+      Lisp_Object object;2128,70632
+    } data[data2129,70658
+save_type 2134,70752
+XSAVE_POINTER 2143,70982
+set_save_pointer 2149,71144
+XSAVE_FUNCPOINTER 2155,71326
+XSAVE_INTEGER 2164,71546
+set_save_integer 2170,71708
+XSAVE_OBJECT 2179,71929
+struct Lisp_Finalizer2186,72106
+    struct Lisp_Misc_Any base;2188,72132
+    struct Lisp_Finalizer *prev;prev2191,72220
+    struct Lisp_Finalizer *next;next2192,72253
+    Lisp_Object function;2197,72490
+struct Lisp_Free2201,72581
+    ENUM_BF 2203,72602
+union Lisp_Misc2212,72882
+    struct Lisp_Misc_Any u_any;2214,72902
+    struct Lisp_Free u_free;2215,72973
+    struct Lisp_Marker u_marker;2216,73002
+    struct Lisp_Overlay u_overlay;2217,73035
+    struct Lisp_Save_Value u_save_value;2218,73070
+    struct Lisp_Finalizer u_finalizer;2219,73111
+XMISC 2223,73181
+XMISCANY 2229,73270
+XMISCTYPE 2236,73379
+XMARKER 2242,73467
+XOVERLAY 2249,73582
+XSAVE_VALUE 2256,73703
+XFINALIZER 2263,73832
+struct Lisp_Intfwd2274,74117
+    enum Lisp_Fwd_Type type;2276,74140
+    EMACS_INT *intvar;intvar2277,74190
+struct Lisp_Boolfwd2284,74411
+    enum Lisp_Fwd_Type type;2286,74435
+    bool *boolvar;boolvar2287,74486
+struct Lisp_Objfwd2294,74702
+    enum Lisp_Fwd_Type type;2296,74725
+    Lisp_Object *objvar;objvar2297,74775
+struct Lisp_Buffer_Objfwd2302,74934
+    enum Lisp_Fwd_Type type;2304,74964
+    int offset;2305,75021
+    Lisp_Object predicate;2307,75113
+struct Lisp_Buffer_Local_Value2334,76470
+    bool_bf local_if_set 2338,76615
+    bool_bf frame_local 2341,76797
+    bool_bf found 2344,76939
+    union Lisp_Fwd *fwd;fwd2346,77041
+    Lisp_Object where;2348,77184
+    Lisp_Object defcell;2351,77310
+    Lisp_Object valcell;2357,77614
+struct Lisp_Kboard_Objfwd2362,77729
+    enum Lisp_Fwd_Type type;2364,77759
+    int offset;2365,77816
+union Lisp_Fwd2368,77838
+    struct Lisp_Intfwd u_intfwd;2370,77857
+    struct Lisp_Boolfwd u_boolfwd;2371,77890
+    struct Lisp_Objfwd u_objfwd;2372,77925
+    struct Lisp_Buffer_Objfwd u_buffer_objfwd;2373,77958
+    struct Lisp_Kboard_Objfwd u_kboard_objfwd;2374,78005
+XFWDTYPE 2378,78084
+XBUFFER_OBJFWD 2384,78180
+struct Lisp_Float2391,78316
+      double data;2395,78354
+      struct Lisp_Float *chain;chain2396,78373
+    } u;2397,78405
+XFLOAT_DATA 2401,78434
+    IEEE_FLOATING_POINT2415,78943
+#define _UCHAR_T2423,79266
+typedef unsigned char UCHAR;2424,79283
+enum Lisp_Compiled2429,79366
+    COMPILED_ARGLIST 2431,79389
+    COMPILED_BYTECODE 2432,79415
+    COMPILED_CONSTANTS 2433,79442
+    COMPILED_STACK_DEPTH 2434,79470
+    COMPILED_DOC_STRING 2435,79500
+    COMPILED_INTERACTIVE 2436,79529
+enum char_bits2443,79831
+    CHAR_ALT 2445,79850
+    CHAR_SUPER 2446,79876
+    CHAR_HYPER 2447,79904
+    CHAR_SHIFT 2448,79932
+    CHAR_CTL 2449,79960
+    CHAR_META 2450,79986
+    CHAR_MODIFIER_MASK 2452,80014
+    CHARACTERBITS 2457,80209
+LISP_MACRO_DEFUN 2462,80267
+NATNUMP 2470,80409
+RANGED_INTEGERP 2476,80490
+#define TYPE_RANGED_INTEGERP(2481,80612
+LISP_MACRO_DEFUN 2486,80797
+VECTORP 2500,81270
+OVERLAYP 2505,81373
+SAVE_VALUEP 2510,81472
+FINALIZERP 2516,81578
+AUTOLOADP 2522,81682
+BUFFER_OBJFWDP 2528,81773
+PSEUDOVECTOR_TYPEP 2534,81871
+PSEUDOVECTORP 2542,82124
+WINDOW_CONFIGURATIONP 2558,82476
+PROCESSP 2564,82586
+WINDOWP 2570,82670
+TERMINALP 2576,82752
+SUBRP 2582,82838
+COMPILEDP 2588,82916
+BUFFERP 2594,83002
+CHAR_TABLE_P 2600,83084
+SUB_CHAR_TABLE_P 2606,83175
+BOOL_VECTOR_P 2612,83274
+FRAMEP 2618,83367
+IMAGEP 2625,83484
+ARRAYP 2632,83589
+CHECK_LIST 2638,83708
+LISP_MACRO_DEFUN_VOID 2643,83789
+CHECK_STRING_CAR 2653,84086
+CHECK_CONS 2658,84190
+CHECK_VECTOR 2663,84270
+CHECK_BOOL_VECTOR 2668,84356
+CHECK_VECTOR_OR_STRING 2674,84533
+CHECK_ARRAY 2683,84707
+CHECK_BUFFER 2688,84815
+CHECK_WINDOW 2693,84901
+CHECK_PROCESS 2699,85007
+CHECK_NATNUM 2705,85103
+#define CHECK_RANGED_INTEGER(2710,85180
+#define CHECK_TYPE_RANGED_INTEGER(2721,85563
+#define CHECK_NUMBER_COERCE_MARKER(2729,85833
+XFLOATINT 2738,86086
+CHECK_NUMBER_OR_FLOAT 2744,86157
+#define CHECK_NUMBER_OR_FLOAT_COERCE_MARKER(2749,86256
+CHECK_NUMBER_CAR 2760,86666
+CHECK_NUMBER_CDR 2768,86788
+#define DEFUN(2803,88383
+#define DEFUN(2812,88851
+FUNCTIONP 2822,89206
+enum maxargs2831,89401
+    MANY 2833,89418
+    UNEVALLED 2834,89433
+#define CALLMANY(2838,89536
+#define CALLN(2844,89889
+#define DEFVAR_LISP(2869,91094
+#define DEFVAR_LISP_NOPRO(2874,91266
+#define DEFVAR_BOOL(2879,91448
+#define DEFVAR_INT(2884,91621
+#define DEFVAR_BUFFER_DEFAULTS(2890,91792
+#define DEFVAR_KBOARD(2896,91996
+typedef jmp_buf sys_jmp_buf;2906,92320
+# define sys_setjmp(2907,92349
+# define sys_longjmp(2908,92384
+typedef sigjmp_buf sys_jmp_buf;2910,92456
+# define sys_setjmp(2911,92488
+# define sys_longjmp(2912,92528
+typedef jmp_buf sys_jmp_buf;2916,92687
+# define sys_setjmp(2917,92716
+# define sys_longjmp(2918,92750
+enum specbind_tag 2943,93802
+  SPECPDL_UNWIND,2944,93822
+  SPECPDL_UNWIND_PTR,2945,93891
+  SPECPDL_UNWIND_INT,2946,93942
+  SPECPDL_UNWIND_VOID,2947,93990
+  SPECPDL_BACKTRACE,2948,94044
+  SPECPDL_LET,2949,94102
+  SPECPDL_LET_LOCAL,2951,94232
+  SPECPDL_LET_DEFAULT  2952,94289
+union specbinding2955,94361
+    ENUM_BF 2957,94383
+      ENUM_BF 2959,94440
+      ENUM_BF 2964,94570
+      ENUM_BF 2969,94693
+      ENUM_BF 2974,94811
+      ENUM_BF 2978,94916
+      ENUM_BF 2983,95091
+enum handlertype 3021,96407
+enum handlertype { CATCHER,3021,96407
+enum handlertype { CATCHER, CONDITION_CASE 3021,96407
+struct handler3023,96454
+  enum handlertype type;3025,96471
+  Lisp_Object tag_or_ch;3026,96496
+  Lisp_Object val;3027,96521
+  struct handler *next;next3028,96540
+  struct handler *nextfree;nextfree3029,96564
+  Lisp_Object *bytecode_top;bytecode_top3036,96922
+  int bytecode_dest;3037,96951
+  struct gcpro *gcpro;gcpro3042,97188
+  sys_jmp_buf jmp;3044,97218
+  EMACS_INT lisp_eval_depth;3045,97237
+  ptrdiff_t pdlcount;3046,97266
+  int poll_suppress_count;3047,97288
+  int interrupt_input_blocked;3048,97315
+  struct byte_stack *byte_stack;byte_stack3049,97346
+#define PUSH_HANDLER(3053,97443
+#define QUIT   3101,99220
+#define QUITP 3112,99470
+struct gcpro3132,100313
+  struct gcpro *next;next3134,100328
+  volatile Lisp_Object *var;var3137,100397
+  ptrdiff_t nvars;3140,100479
+  const char *name;name3144,100564
+  int lineno;3147,100620
+  int idx;3150,100681
+  int level;3153,100717
+#define GC_USE_GCPROS_AS_BEFORE        3171,101294
+#define GC_MAKE_GCPROS_NOOPS   3172,101329
+#define GC_MARK_STACK_CHECK_GCPROS     3173,101361
+#define GC_USE_GCPROS_CHECK_ZOMBIES    3174,101398
+#define GC_MARK_STACK 3177,101459
+#define BYTE_MARK_STACK 3181,101559
+#define GCPRO1(3190,101830
+#define GCPRO2(3191,101870
+#define GCPRO3(3192,101936
+#define GCPRO4(3194,102031
+#define GCPRO5(3196,102151
+#define GCPRO6(3198,102296
+#define GCPRO7(3201,102471
+#define UNGCPRO 3202,102550
+#define GCPRO1(3208,102650
+#define GCPRO2(3212,102772
+#define GCPRO3(3217,102964
+#define GCPRO4(3223,103226
+#define GCPRO5(3230,103557
+#define GCPRO6(3238,103958
+#define GCPRO7(3247,104428
+#define UNGCPRO 3257,104968
+#define GCPRO1(3263,105062
+#define GCPRO2(3269,105296
+#define GCPRO3(3278,105714
+#define GCPRO4(3289,106271
+#define GCPRO5(3302,106969
+#define GCPRO6(3317,107809
+#define GCPRO7(3334,108790
+#define UNGCPRO        3353,109913
+#define RETURN_UNGCPRO(3363,110180
+vcopy 3384,110654
+set_hash_key_slot 3393,110929
+set_hash_value_slot 3399,111068
+set_symbol_function 3408,111303
+set_symbol_plist 3414,111418
+set_symbol_next 3420,111521
+blv_found 3428,111694
+set_overlay_plist 3437,111877
+string_intervals 3445,112028
+set_string_intervals 3453,112150
+set_char_table_defalt 3462,112352
+set_char_table_purpose 3467,112464
+set_char_table_extras 3475,112633
+set_char_table_contents 3482,112842
+set_sub_char_table_contents 3489,113037
+enum Arith_Comparison 3497,113300
+  ARITH_EQUAL,3498,113324
+  ARITH_NOTEQUAL,3499,113339
+  ARITH_LESS,3500,113357
+  ARITH_GRTR,3501,113371
+  ARITH_LESS_OR_EQUAL,3502,113385
+  ARITH_GRTR_OR_EQUAL3503,113408
+#define INTEGER_TO_CONS(3511,113759
+#define CONS_TO_INTEGER(3529,114622
+enum { NEXT_ALMOST_PRIME_LIMIT 3573,116326
+extern EMACS_INT next_almost_prime 3574,116365
+enum constype 3739,123817
+enum constype {CONSTYPE_HEAP,CONSTYPE_HEAP3739,123817
+enum constype {CONSTYPE_HEAP, CONSTYPE_PURE}CONSTYPE_PURE3739,123817
+list2i 3745,124007
+list3i 3751,124116
+list4i 3757,124255
+extern Lisp_Object make_formatted_string 3767,124631
+build_pure_c_string 3792,125659
+build_string 3801,125864
+make_uninit_vector 3820,126435
+make_uninit_sub_char_table 3833,126654
+#define ALLOCATE_PSEUDOVECTOR(3850,127198
+#define ALLOCATE_ZEROED_PSEUDOVECTOR(3858,127534
+INLINE void 3890,128940
+extern void *r_alloc r_alloc3895,129061
+#define FLOAT_TO_STRING_BUFSIZE 3927,130524
+intern 3968,132131
+intern_c_string 3974,132219
+extern _Noreturn void error 4034,135598
+fast_string_match_ignore_case 4136,140086
+INLINE void fixup_locale 4241,143851
+INLINE void synchronize_system_messages_locale 4242,143886
+INLINE void synchronize_system_time_locale 4243,143943
+#define IS_DAEMON 4257,144416
+#define DAEMON_RUNNING 4258,144456
+#define IS_DAEMON 4261,144555
+#define DAEMON_RUNNING 4262,144600
+# define WAIT_READING_MAX 4281,145419
+# define WAIT_READING_MAX 4283,145491
+extern _Noreturn void emacs_abort 4374,148383
+egetenv 4532,152806
+#define eabs(4545,153302
+#define make_fixnum_or_float(4550,153435
+enum MAX_ALLOCA 4556,153686
+enum MAX_ALLOCA { MAX_ALLOCA 4556,153686
+extern void *record_xmalloc record_xmalloc4558,153731
+#define USE_SAFE_ALLOCA        4560,153797
+#define AVAIL_ALLOCA(4564,153930
+#define SAFE_ALLOCA(4568,154041
+#define SAFE_NALLOCA(4576,154382
+#define SAFE_ALLOCA_STRING(4590,154858
+#define SAFE_FREE(4598,155110
+#define SAFE_ALLOCA_LISP(4625,155688
+# define USE_STACK_LISP_OBJECTS 4652,156810
+# undef USE_STACK_LISP_OBJECTS4658,156976
+# define USE_STACK_LISP_OBJECTS 4659,157007
+enum { defined_GC_CHECK_STRING_BYTES 4663,157082
+enum { defined_GC_CHECK_STRING_BYTES 4665,157135
+union Aligned_Cons4670,157269
+  struct Lisp_Cons s;4672,157290
+  double d;4673,157312
+  double d; intmax_t i;4673,157312
+  double d; intmax_t i; void *p;p4673,157312
+union Aligned_String4676,157349
+  struct Lisp_String s;4678,157372
+  double d;4679,157396
+  double d; intmax_t i;4679,157396
+  double d; intmax_t i; void *p;p4679,157396
+    USE_STACK_CONS 4689,157704
+    USE_STACK_STRING 4691,157810
+#define STACK_CONS(4699,158147
+#define AUTO_CONS_EXPR(4701,158244
+#define AUTO_CONS(4709,158607
+#define AUTO_LIST1(4710,158678
+#define AUTO_LIST2(4712,158786
+#define AUTO_LIST3(4716,158941
+#define AUTO_LIST4(4720,159116
+# define verify_ascii(4732,159507
+#define AUTO_STRING(4740,159815
+#define FOR_EACH_TAIL(4752,160279
+#define FOR_EACH_ALIST_VALUE(4766,160770
+maybe_gc 4774,161057
+functionp 4784,161296
+
+c-src/machsyscalls.c,23
+#define        SYSCALL(6,113
+
+c-src/machsyscalls.h,159
+SYSCALL (mach_msg_trap,1,0
+SYSCALL (mach_reply_port,13,314
+SYSCALL (mach_thread_self,18,377
+SYSCALL (mach_task_self,23,441
+SYSCALL (mach_host_self,28,503
+
+c-src/h.h,2394
+   ELEM_I/ELEM_I3,15
+} Fails_t;5,85
+typedef void Lang_function 6,96
+typedef struct tpcmd8,147
+#define ggg 10,170
+  } arg;13,198
+tpcmd;15,209
+typedef struct foobar2_ 16,216
+    fu   int (*funcptr)funcptr17,242
+    long foo;18,279
+    char bar;19,293
+} foobar2;20,307
+    DEVICE_SWP,23,333
+    DEVICE_LAST24,349
+} bsp_DevId;25,365
+  struct constant_args 27,394
+    unsigned int burst;28,419
+  } constant;29,443
+} args;30,457
+typedef int *regset;regset31,465
+typedef int INT;32,486
+typedef union abc33,503
+  int def;35,523
+} ghi1;36,534
+typedef union abc 37,542
+  int def;38,562
+} ghi2;39,573
+typedef struct a 40,581
+} b;41,600
+#define c(42,605
+typedef struct an_extern_linkage 
*an_extern_linkage_ptr;an_extern_linkage_ptr43,619
+typedef struct an_extern_linkage 44,676
+               kind;46,733
+               is_explicit;49,812
+  a_byte_boolean is_curly_brace_form;54,1009
+} an_extern_linkage;56,1054
+typedef struct pollfd   pfdset[pfdset57,1075
+typedef union rtunion_def58,1119
+    int rtint;60,1149
+    char *rtstr;rtstr61,1164
+    struct rtx_def *rtx;rtx62,1181
+  } womboid 63,1206
+typedef union rtunion_def64,1220
+  int rtint;68,1250
+  char *rtstr;rtstr69,1263
+  struct rtx_def *rtxp;rtxp70,1278
+  struct rtx_def rtxnp;71,1302
+womboid75,1330
+enum {dog,dog81,1416
+enum {dog, cat}cat81,1416
+enum {dog, cat} animals;81,1416
+typedef void (_CALLBACK_ *signal_handler)signal_handler82,1441
+typedef void (_CALLBACK_ *signal_handler1)signal_handler183,1489
+/* comment */ #define ANSIC84,1538
+ #define ANSIC85,1566
+typedef void (proc)87,1588
+typedef void OperatorFun(88,1612
+typedef int f(89,1648
+struct my_struct 91,1691
+typedef struct my_struct my_typedef;93,1713
+typedef RETSIGTYPE (*signal_handler_t)signal_handler_t94,1750
+  Date 04 May 87 235311 PDT 96,1802
+typedef unsigned char unchar;99,1880
+typedef int X,100,1910
+typedef int X, Y,100,1910
+typedef int X, Y, Z;100,1910
+typedef mio mao;101,1931
+typedef struct a 103,1966
+typedef struct a { } b;103,1966
+typedef struct b104,1990
+} c;106,2009
+int extvar;109,2053
+#define tag1110,2065
+#define aaaaaa 111,2078
+#define bbbbbb\bbbbbb113,2102
+#define cccccccccc115,2125
+#define enter_critical_section 116,2144
+#define exit_critical_to_previous      117,2199
+#define UNDEFINED118,2259
+struct re_pattern_buffer 119,2277
+struct re_pattern_buffer { unsigned char *buffer;buffer119,2277
+
+cp-src/c.C,3287
+template <typename ipc3dIslandHierarchy,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType, unsigned 
numOfChannels,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType, unsigned 
numOfChannels, typename ipc3dLinkControl,1,0
+class CMultiChannelCSC19_3D2,151
+        ipc3dLinkControlSetup setup;CMultiChannelCSC19_3D::setup5,190
+        ipc3dCSC19<CMultiChannelCSC19_3D::ipc3dCSC196,227
+        
ipc3dCSC19<ipc3dIslandHierarchy,ipcMultiChannel<ipc3dChannelType,numOfChannels>,ipcMultiChannel<ipc3dChannelType,numOfChannels>,ipc3dLinkControl>
 mcCSC;CMultiChannelCSC19_3D::mcCSC6,227
+        advTimer cscInitTime;CMultiChannelCSC19_3D::cscInitTime7,388
+        advTimer 
cscSegmentationTime;CMultiChannelCSC19_3D::cscSegmentationTime8,418
+        advTimer outputTime;CMultiChannelCSC19_3D::outputTime9,456
+        void execute(CMultiChannelCSC19_3D::execute11,493
+int main 25,1026
+double base 26,1088
+typedef struct s1 32,1251
+   int counter;s1::counter33,1271
+} t1;34,1287
+struct s2 35,1293
+   int counter;s2::counter36,1305
+typedef struct s2 t2;38,1324
+class A 39,1346
+  enum { rosso,A::rosso40,1356
+  enum { rosso, giallo,A::giallo40,1356
+  enum { rosso, giallo, verde A::verde40,1356
+  enum { rosso, giallo, verde } colori;A::colori40,1356
+const A& A::operator+(43,1431
+void operator+(44,1467
+void operator -(operator -45,1495
+void operator int(operator int46,1524
+A<int>* f(48,1556
+int f(49,1571
+int A<int>::f(f50,1590
+A<float,B<int> > A<B<float>,int>::f(f51,1618
+template <class C, int n> class AT 52,1668
+template <class C, int n> class AT { C t[AT::t52,1668
+class AU 53,1716
+class AU { T x;AU::x53,1716
+class B<B54,1735
+class B<int> { void f(B::f54,1735
+const A::B::T& abt 55,1765
+class A 56,1791
+class A { class B A::B56,1791
+class A 57,1826
+  A operator+(A::operator+59,1860
+is_muldiv_operation(61,1887
+domain foo 68,1955
+     void f(foo::f69,1968
+void A::A(72,1989
+struct A 73,2004
+struct B 74,2022
+void B::B(75,2041
+void BE_Node::BE_Node(76,2056
+class BE_Node 77,2083
+struct foo 79,2102
+  int x;foo::x80,2115
+class test 86,2156
+  int f(test::f87,2169
+  int ff(test::ff89,2231
+  int g(test::g90,2254
+class  AST_Root 92,2278
+AST_ConcreteType::AST_ConcreteType(99,2393
+AST_Array::AST_Array(107,2532
+     void f(::f115,2733
+struct A 117,2753
+A::~A(120,2777
+struct B 122,2789
+    ~B(B::~B123,2800
+enum {dog,::dog126,2817
+enum {dog, cat}::cat126,2817
+enum {dog, cat} animals;126,2817
+struct {int teats;::teats127,2842
+struct {int teats;} cow;127,2842
+class Boo 129,2868
+    enum {dog,Boo::dog130,2880
+    enum {dog, cat}Boo::cat130,2880
+    enum {dog, cat} animals;Boo::animals130,2880
+    struct {int treats;Boo::treats131,2909
+    struct {int treats;} cow;Boo::cow131,2909
+    int i,Boo::i132,2939
+    int i,a,Boo::a132,2939
+    int i,a,b;Boo::b132,2939
+    foo(Boo::foo133,2954
+    Boo(Boo::Boo137,2995
+Boo::Boo(141,3070
+typedef int should_see_this_one_enclosed_in_extern_C;149,3155
+typedef int 
(*should_see_this_function_pointer)should_see_this_function_pointer153,3228
+typedef int should_see_this_array_type[should_see_this_array_type156,3310
+
+cp-src/abstract.C,11317
+Half_Container::Half_Container(34,703
+void Half_Container::SetPosition(45,941
+void Half_Container::SetDimensions(58,1259
+void Half_Container::SetFather(81,1697
+void Half_Container::SetCollapsed(87,1787
+Specification::Specification(98,1958
+void Specification::SetPosition(119,2453
+void Specification::SetDimensions(164,3742
+void Specification::SetFather(188,4616
+void Specification::SetPath(202,4908
+Coord Specification::GetMaxX(212,5125
+Coord Specification::GetMaxY(215,5174
+Process::Process(222,5298
+void Process::SetPosition(242,5697
+void Process::SetDimensions(291,6959
+void Process::SetFather(315,7913
+void Process::SetPath(326,8123
+Coord Process::GetMaxX(335,8323
+Coord Process::GetMaxY(338,8365
+Choice::Choice(346,8482
+void Choice::SetPosition(357,8698
+void Choice::SetDimensions(405,10053
+void Choice::ChangeH(466,12014
+void Choice::ChangeW(495,12947
+void Choice::SetFather(522,13700
+void Choice::SetTextual(532,13918
+void Choice::SetCollapsed(540,14041
+int Choice::Get_Textual_H(549,14168
+int Choice::Get_Textual_W(557,14408
+void Choice::SetTerminalPos(566,14615
+Stop::Stop(588,15087
+void Stop::SetPosition(595,15207
+void Stop::SetDimensions(605,15373
+void Stop::SetFather(644,16369
+void Stop::SetTextual(652,16537
+void Stop::SetCollapsed(655,16616
+Exit::Exit(667,16768
+void Exit::SetPosition(676,16935
+void Exit::SetDimensions(687,17164
+void Exit::SetFather(695,17350
+Exit_Bex::Exit_Bex(703,17476
+void Exit_Bex::SetPosition(713,17678
+void Exit_Bex::SetDimensions(740,18430
+void Exit_Bex::SetFather(798,20444
+void Exit_Bex::SetTextual(807,20646
+void Exit_Bex::SetCollapsed(814,20757
+NoExit::NoExit(826,20943
+void NoExit::SetPosition(835,21092
+void NoExit::SetDimensions(845,21266
+void NoExit::SetFather(852,21359
+ID_Place::ID_Place(861,21488
+void ID_Place::SetIdent(875,21745
+void ID_Place::SetPosition(886,21936
+void ID_Place::SetDimensions(897,22173
+void ID_Place::SetFather(928,23017
+ID_Place::~ID_Place(932,23073
+void ID_Place::SetVisible(935,23112
+void ID_Place::ClearID(941,23193
+ID_List::ID_List(953,23379
+void ID_List::SetPosition(967,23644
+void ID_List::SetDimensions(999,24385
+void ID_List::SetFather(1038,25456
+void ID_List::SetCollapsed(1047,25595
+void ID_List::HideMe(1056,25734
+void ID_List::SetRBubble(1065,25862
+void ID_List::SetAlignement(1073,25980
+int ID_List::GetCardinality(1082,26123
+void ID_List::SetVisible(1093,26291
+void ID_List::BuildSigSorts(1103,26518
+void ID_List::ClearIDs(1126,27081
+Id_Decl::Id_Decl(1139,27280
+void Id_Decl::SetPosition(1156,27659
+void Id_Decl::SetDimensions(1174,28016
+void Id_Decl::SetFather(1191,28417
+void Id_Decl::SetCollapsed(1200,28568
+Id_Decl_List::Id_Decl_List(1214,28799
+void Id_Decl_List::SetPosition(1227,29069
+void Id_Decl_List::SetDimensions(1245,29424
+void Id_Decl_List::SetFather(1262,29844
+void Id_Decl_List::SetCollapsed(1271,29988
+Comment::Comment(1286,30209
+void Comment::SetComment(1299,30446
+void Comment::SetFather(1317,30800
+void Comment::SetPosition(1321,30854
+void Comment::SetDimensions(1331,31031
+Comment::~Comment(1345,31265
+Comment_List::Comment_List(1352,31382
+void Comment_List::SetPosition(1362,31541
+void Comment_List::SetDimensions(1380,31860
+void Comment_List::SetFather(1392,32139
+Parallel::Parallel(1406,32360
+void Parallel::SetPosition(1417,32573
+void Parallel::SetDimensions(1473,34272
+void Parallel::SetTextual(1534,36167
+int Parallel::Get_Textual_W(1543,36313
+int Parallel::Get_Textual_H(1559,36722
+void Parallel::SetTerminalPos(1570,37191
+void Parallel::SetFather(1590,37698
+void Parallel::SetCollapsed(1601,37950
+Ident_Eq::Ident_Eq(1615,38177
+void Ident_Eq::SetPosition(1632,38546
+void Ident_Eq::SetDimensions(1647,38851
+void Ident_Eq::SetFather(1662,39191
+void Ident_Eq::SetCollapsed(1669,39295
+Ident_Eq_List::Ident_Eq_List(1681,39480
+void Ident_Eq_List::SetPosition(1694,39753
+void Ident_Eq_List::SetDimensions(1712,40111
+void Ident_Eq_List::SetCollapsed(1729,40538
+void Ident_Eq_List::SetFather(1738,40683
+Local_Def::Local_Def(1751,40904
+void Local_Def::SetPosition(1761,41102
+void Local_Def::SetDimensions(1791,41833
+void Local_Def::SetFather(1832,43262
+void Local_Def::SetCollapsed(1839,43370
+void Local_Def::SetTextual(1848,43504
+Hide::Hide(1860,43681
+void Hide::SetPosition(1871,43872
+void Hide::SetDimensions(1901,44569
+void Hide::SetFather(1944,45771
+void Hide::SetCollapsed(1951,45873
+void Hide::SetTextual(1961,46003
+Interl::Interl(1972,46175
+void Interl::SetPosition(1982,46361
+void Interl::SetDimensions(1993,46593
+void Interl::SetFather(2021,47103
+Syncr::Syncr(2031,47257
+void Syncr::SetPosition(2041,47438
+void Syncr::SetDimensions(2051,47609
+void Syncr::SetFather(2079,48153
+Enable::Enable(2090,48436
+void Enable::SetPosition(2102,48690
+void Enable::SetDimensions(2169,50473
+void Enable::SetTextual(2243,53017
+void Enable::SetTerminalPos(2251,53140
+int Enable::Get_Textual_W(2271,53720
+int Enable::Get_Textual_H(2282,53985
+void Enable::SetFather(2285,54104
+void Enable::SetCollapsed(2298,54418
+Disable::Disable(2314,54780
+void Disable::SetPosition(2325,55001
+void Disable::SetDimensions(2376,56251
+void Disable::SetFather(2436,58064
+void Disable::SetCollapsed(2446,58284
+void Disable::SetTextual(2455,58412
+void Disable::SetTerminalPos(2463,58536
+int Disable::Get_Textual_W(2479,58987
+int Disable::Get_Textual_H(2488,59190
+Gen_Paral::Gen_Paral(2500,59630
+void Gen_Paral::SetPosition(2513,59899
+void Gen_Paral::SetDimensions(2540,60659
+void Gen_Paral::SetFather(2590,62171
+void Gen_Paral::SetCollapsed(2597,62290
+Action_Pref::Action_Pref(2609,62583
+void Action_Pref::SetPosition(2620,62829
+void Action_Pref::SetDimensions(2669,63937
+void Action_Pref::SetFather(2724,65777
+void Action_Pref::SetCollapsed(2734,66010
+void Action_Pref::SetTextual(2743,66147
+Internal::Internal(2757,66484
+void Internal::SetPosition(2768,66658
+void Internal::SetDimensions(2778,66838
+void Internal::SetFather(2806,67442
+Communication::Communication(2816,67702
+void Communication::SetPosition(2827,67956
+void Communication::SetDimensions(2897,70390
+void Communication::SetFather(2935,71706
+void Communication::SetCollapsed(2942,71837
+void Communication::SetTextual(2949,71968
+NoGuard::NoGuard(2961,72262
+void NoGuard::SetPosition(2974,72462
+void NoGuard::SetDimensions(2984,72639
+void NoGuard::SetFather(2987,72678
+Guard::Guard(2996,72929
+void Guard::SetPosition(3008,73118
+void Guard::SetDimensions(3022,73428
+void Guard::SetFather(3044,73894
+void Guard::SetCollapsed(3050,73974
+NoExperiment::NoExperiment(3062,74258
+void NoExperiment::SetPosition(3075,74478
+void NoExperiment::SetDimensions(3085,74670
+void NoExperiment::SetFather(3088,74714
+Experiment::Experiment(3097,74978
+void Experiment::SetPosition(3110,75245
+void Experiment::SetDimensions(3128,75611
+void Experiment::SetFather(3150,76066
+void Experiment::SetCollapsed(3157,76188
+void Experiment::SetTextual(3165,76311
+Proc_Inst::Proc_Inst(3175,76476
+void Proc_Inst::SetPosition(3191,76777
+void Proc_Inst::SetDimensions(3236,77965
+void Proc_Inst::SetFather(3286,79596
+void Proc_Inst::SetCollapsed(3294,79739
+void Proc_Inst::SetTextual(3304,79909
+Value_Expr::Value_Expr(3316,80100
+void Value_Expr::SetPosition(3329,80327
+void Value_Expr::SetDimensions(3340,80572
+void Value_Expr::SetFather(3343,80614
+Value_Expr_List::Value_Expr_List(3351,80755
+void Value_Expr_List::SetPosition(3364,81042
+void Value_Expr_List::SetDimensions(3382,81406
+void Value_Expr_List::SetFather(3399,81830
+void Value_Expr_List::SetCollapsed(3408,81977
+Sum_Ident::Sum_Ident(3423,82203
+void Sum_Ident::SetPosition(3435,82445
+void Sum_Ident::SetDimensions(3466,83196
+void Sum_Ident::SetFather(3509,84540
+void Sum_Ident::SetCollapsed(3516,84653
+void Sum_Ident::SetTextual(3525,84793
+void Sum_Ident::SetTerminalPos(3532,84897
+Value::Value(3552,85432
+void Value::SetPosition(3569,85792
+void Value::SetDimensions(3583,86091
+void Value::SetFather(3606,86628
+void Value::SetCollapsed(3613,86731
+Term::Term(3626,86908
+void Term::SetPosition(3646,87323
+void Term::SetDimensions(3671,87942
+void Term::SetFather(3697,88599
+void Term::SetCollapsed(3705,88732
+Exit_Entry::Exit_Entry(3719,88947
+void Exit_Entry::SetPosition(3732,89176
+void Exit_Entry::SetDimensions(3743,89421
+void Exit_Entry::SetFather(3746,89463
+Exit_Entry_List::Exit_Entry_List(3754,89604
+void Exit_Entry_List::SetPosition(3766,89875
+void Exit_Entry_List::SetDimensions(3785,90304
+void Exit_Entry_List::SetFather(3802,90753
+void Exit_Entry_List::SetCollapsed(3811,90900
+Sum_Gate::Sum_Gate(3826,91125
+void Sum_Gate::SetPosition(3837,91363
+void Sum_Gate::SetDimensions(3873,92120
+void Sum_Gate::SetFather(3915,93438
+void Sum_Gate::SetCollapsed(3922,93549
+void Sum_Gate::SetTextual(3931,93687
+void Sum_Gate::SetTerminalPos(3938,93790
+Gate_Decl::Gate_Decl(3959,94421
+void Gate_Decl::SetPosition(3977,94900
+void Gate_Decl::SetDimensions(3995,95298
+void Gate_Decl::SetFather(4011,95694
+void Gate_Decl::SetCollapsed(4020,95871
+Gate_Decl_List::Gate_Decl_List(4034,96130
+void Gate_Decl_List::SetPosition(4047,96414
+void Gate_Decl_List::SetDimensions(4065,96779
+void Gate_Decl_List::SetFather(4082,97207
+void Gate_Decl_List::SetCollapsed(4091,97353
+Par::Par(4106,97572
+void Par::SetPosition(4126,97957
+void Par::SetDimensions(4174,99236
+void Par::SetFather(4226,100814
+void Par::SetCollapsed(4234,100943
+void Par::SetTextual(4245,101100
+Sort_Id_Exit::Sort_Id_Exit(4258,101329
+void Sort_Id_Exit::SetPosition(4270,101556
+void Sort_Id_Exit::SetDimensions(4283,101834
+void Sort_Id_Exit::SetFather(4297,102142
+void Sort_Id_Exit::SetCollapsed(4303,102228
+Equality::Equality(4314,102512
+Equality::Equality(4327,102736
+void Equality::SetPosition(4340,102987
+void Equality::SetDimensions(4357,103329
+void Equality::SetFather(4377,103720
+void Equality::SetCollapsed(4387,103858
+Guarded::Guarded(4401,104167
+void Guarded::SetPosition(4413,104384
+void Guarded::SetDimensions(4441,105084
+void Guarded::SetFather(4482,106273
+void Guarded::SetCollapsed(4489,106377
+void Guarded::SetTextual(4499,106509
+Exper_Off::Exper_Off(4510,106813
+void Exper_Off::SetPosition(4523,107035
+void Exper_Off::SetDimensions(4533,107220
+void Exper_Off::SetFather(4536,107261
+Exper_Off_List::Exper_Off_List(4544,107521
+void Exper_Off_List::SetPosition(4557,107802
+void Exper_Off_List::SetDimensions(4575,108167
+void Exper_Off_List::SetFather(4592,108594
+void Exper_Off_List::SetCollapsed(4601,108740
+Exclam::Exclam(4616,109087
+void Exclam::SetPosition(4629,109300
+void Exclam::SetDimensions(4641,109541
+void Exclam::SetFather(4655,109830
+void Exclam::SetCollapsed(4661,109912
+Query::Query(4673,110194
+void Query::SetPosition(4686,110399
+void Query::SetDimensions(4698,110636
+void Query::SetFather(4712,110918
+void Query::SetCollapsed(4718,110997
+Definition::Definition(4729,111279
+void Definition::SetPosition(4741,111448
+void Definition::SetDimensions(4752,111658
+void Definition::SetFather(4766,111896
+void Definition::SetPath(4777,112089
+Proc_List::Proc_List(4790,112374
+void Proc_List::SetPosition(4799,112505
+void Proc_List::SetDimensions(4809,112686
+void Proc_List::SetFather(4815,112767
+void Proc_List::SetPath(4824,112908
+char *Proc_List::GetPath(Proc_List::GetPath4832,113068
+
+cp-src/abstract.H,10509
+#define abstract_hh16,453
+class ID_Place:ID_Place23,536
+       char *str;ID_Place::str25,571
+       char RBubble;ID_Place::RBubble26,583
+ char *GetIdent(ID_Place::GetIdent41,857
+ void SetRBubble(ID_Place::SetRBubble42,891
+ char GetRBubble(ID_Place::GetRBubble43,934
+class ID_List:ID_List47,1012
+       ID_Place *elem;ID_List::elem49,1046
+       ID_List *next;ID_List::next50,1063
+class Id_Decl:Id_Decl73,1540
+       ID_List *id_list;Id_Decl::id_list75,1574
+       ID_Place *sort_id;Id_Decl::sort_id76,1593
+class Id_Decl_List:Id_Decl_List89,1829
+       Id_Decl *elem;Id_Decl_List::elem91,1868
+       Id_Decl_List *next;Id_Decl_List::next92,1884
+class Comment:Comment105,2140
+       char *comm;Comment::comm107,2174
+class Comment_List:Comment_List122,2440
+       Comment *elem;Comment_List::elem124,2479
+       Comment_List *next;Comment_List::next125,2495
+class Value_Expr:Value_Expr135,2694
+class Value_Expr_List:Value_Expr_List149,2911
+       Tree_Node *elem;Value_Expr_List::elem151,2953
+       Value_Expr_List *next;Value_Expr_List::next152,2971
+class Exit_Entry:Exit_Entry165,3244
+class Exit_Entry_List:Exit_Entry_List179,3460
+       Tree_Node *elem;Exit_Entry_List::elem181,3502
+       Exit_Entry_List *next;Exit_Entry_List::next182,3520
+class Exper_Off:Exper_Off195,3793
+class Exper_Off_List:Exper_Off_List207,3977
+        Exper_Off *elem;Exper_Off_List::elem209,4018
+        Exper_Off_List *next;Exper_Off_List::next210,4043
+class Gate_Decl:Gate_Decl223,4323
+       ID_List *gate_id_list1;Gate_Decl::gate_id_list1225,4359
+       ID_List *gate_id_list2;Gate_Decl::gate_id_list2226,4384
+class Gate_Decl_List:Gate_Decl_List239,4630
+       Gate_Decl *elem;Gate_Decl_List::elem241,4671
+       Gate_Decl_List *next;Gate_Decl_List::next242,4689
+class Ident_Eq:Ident_Eq255,4957
+        Id_Decl *iddecl;Ident_Eq::iddecl257,4992
+        Value_Expr *expr;Ident_Eq::expr258,5017
+class Ident_Eq_List:Ident_Eq_List271,5270
+        Ident_Eq *elem;Ident_Eq_List::elem273,5310
+        Ident_Eq_List *next;Ident_Eq_List::next274,5334
+class Half_Container:Half_Container287,5608
+       ID_List *gate_list;Half_Container::gate_list289,5649
+class Specification:Specification308,5954
+        Comment_List *com_list;Specification::com_list312,6013
+       ID_Place *ident;Specification::ident313,6045
+       ID_List *gate_list;Specification::gate_list314,6063
+       Id_Decl_List *id_decl_list;Specification::id_decl_list315,6084
+        Comment_List *com_list1;Specification::com_list1316,6113
+       Tree_Node *func;Specification::func317,6146
+       Data_List *dt_list;Specification::dt_list318,6164
+       Definition *def;Specification::def319,6185
+       Coord yl1,Specification::yl1320,6203
+       Coord yl1,yl2,Specification::yl2320,6203
+       Coord yl1,yl2,yl3;Specification::yl3320,6203
+       Coord MaxX,Specification::MaxX321,6223
+       Coord MaxX, MaxY;Specification::MaxY321,6223
+class Process:Process337,6609
+        Comment_List *com_list;Process::com_list339,6643
+       ID_Place *ident;Process::ident340,6675
+       ID_List *gate_list;Process::gate_list341,6693
+       Id_Decl_List *id_decl_list;Process::id_decl_list342,6714
+       Definition *def;Process::def343,6743
+       Tree_Node *func;Process::func344,6761
+       char nesting;Process::nesting345,6779
+       Coord yl1,Process::yl1346,6794
+       Coord yl1,yl2,Process::yl2346,6794
+       Coord yl1,yl2,yl3,Process::yl3346,6794
+       Coord yl1,yl2,yl3,ypath;Process::ypath346,6794
+       Coord MaxX,Process::MaxX347,6820
+       Coord MaxX, MaxY;Process::MaxY347,6820
+ char GetNesting(Process::GetNesting363,7186
+class Proc_List:Proc_List367,7257
+        Process *elem;Proc_List::elem369,7293
+        Proc_List *next;Proc_List::next370,7316
+class Definition:Definition382,7574
+        Tree_Node *bex;Definition::bex384,7611
+        Proc_List *process_list;Definition::process_list385,7635
+        Data_List *data_list;Definition::data_list386,7668
+       char path[Definition::path387,7698
+ char *GetPath(Definition::GetPath397,7940
+class Exit:Exit407,8071
+       ID_List *sort_list;Exit::sort_list409,8102
+class NoExit:NoExit421,8305
+class Value:Value440,8560
+       ID_Place *ident;Value::ident442,8592
+       ID_Place *sort_id;Value::sort_id443,8610
+class Term:Term456,8841
+       ID_Place *op_ident;Term::op_ident458,8872
+       Value_Expr_List *expr_list;Term::expr_list459,8893
+       ID_Place *sort_id;Term::sort_id460,8922
+class Equality:Equality473,9169
+        Tree_Node *express1;Equality::express1475,9204
+        Tree_Node *express2;Equality::express2476,9233
+class Sort_Id_Exit:Sort_Id_Exit490,9504
+       ID_Place *sort_id;Sort_Id_Exit::sort_id492,9543
+class NoGuard:NoGuard511,9837
+class Guard:Guard524,10045
+        Equality *equality;Guard::equality526,10077
+class NoExperiment:NoExperiment545,10368
+class Experiment:Experiment558,10591
+        Exper_Off_List *exp_offer_list;Experiment::exp_offer_list560,10628
+        Tree_Node *guard_option;Experiment::guard_option561,10668
+ Tree_Node *GetGuard(Experiment::GetGuard574,10962
+class Exclam:Exclam578,11053
+        Tree_Node *value_exp;Exclam::value_exp580,11086
+class Query:Query593,11324
+        Id_Decl *id_decl;Query::id_decl595,11356
+class Internal:Internal614,11643
+class Communication:Communication627,11854
+       ID_Place *gate_identifier;Communication::gate_identifier629,11894
+        Tree_Node 
*experiment_option;Communication::experiment_option630,11922
+        Coord xl,Communication::xl631,11960
+        Coord xl, yl;Communication::yl631,11960
+        int hr;Communication::hr632,11982
+class Gen_Paral:Gen_Paral652,12337
+        ID_List *gate_id_list;Gen_Paral::gate_id_list654,12373
+       Coord Xclose;Gen_Paral::Xclose655,12404
+       char border;Gen_Paral::border656,12419
+ void HideGate(Gen_Paral::HideGate668,12634
+class Interl:Interl672,12730
+class Syncr:Syncr685,12929
+class Action_Pref:Action_Pref704,13185
+        Tree_Node *action_den;Action_Pref::action_den706,13223
+        Tree_Node *bex;Action_Pref::bex707,13254
+       char havebox;Action_Pref::havebox708,13278
+       char border;Action_Pref::border709,13293
+class Enable:Enable723,13577
+        Tree_Node *bex1,Enable::bex1725,13610
+        Tree_Node *bex1, *bex2;Enable::bex2725,13610
+       ID_List *gate_id_list;Enable::gate_id_list726,13642
+        Coord xl,Enable::xl727,13666
+        Coord xl, yl1,Enable::yl1727,13666
+        Coord xl, yl1, xl2,Enable::xl2727,13666
+        Coord xl, yl1, xl2, yl2,Enable::yl2727,13666
+        Coord xl, yl1, xl2, yl2, xid,Enable::xid727,13666
+        Coord xl, yl1, xl2, yl2, xid, yid,Enable::yid727,13666
+        Coord xl, yl1, xl2, yl2, xid, yid, Yclose;Enable::Yclose727,13666
+       char havebox;Enable::havebox728,13717
+       char border;Enable::border729,13732
+class Disable:Disable746,14097
+        Tree_Node *bex1,Disable::bex1748,14131
+        Tree_Node *bex1, *bex2;Disable::bex2748,14131
+        Coord xl,Disable::xl749,14163
+        Coord xl, yl,Disable::yl749,14163
+        Coord xl, yl, yl2;Disable::yl2749,14163
+       char havebox;Disable::havebox750,14190
+       char border;Disable::border751,14205
+class Choice:Choice768,14561
+       Tree_Node *bex1,Choice::bex1770,14594
+       Tree_Node *bex1, *bex2;Choice::bex2770,14594
+       Coord xl,Choice::xl771,14619
+       Coord xl, yl,Choice::yl771,14619
+       Coord xl, yl, yl1;Choice::yl1771,14619
+       char havebox;Choice::havebox772,14639
+       int delta;Choice::delta773,14654
+       char border;Choice::border774,14666
+class Stop:Stop793,15054
+       char havebox;Stop::havebox795,15085
+       char border;Stop::border796,15100
+class Exit_Bex:Exit_Bex810,15338
+       Exit_Entry_List *entry_list;Exit_Bex::entry_list812,15373
+       Coord Xopen,Exit_Bex::Xopen813,15404
+       Coord Xopen, Xclose;Exit_Bex::Xclose813,15404
+       char havebox;Exit_Bex::havebox814,15426
+       char border;Exit_Bex::border815,15441
+class Hide:Hide829,15707
+       ID_List *gate_list;Hide::gate_list831,15738
+       Tree_Node *bex;Hide::bex832,15759
+       char border;Hide::border833,15776
+       Coord yl;Hide::yl834,15790
+class Guarded:Guarded848,16047
+        Equality *equality;Guarded::equality850,16081
+        Tree_Node *bex;Guarded::bex851,16109
+       Coord Xclose;Guarded::Xclose852,16133
+       char border;Guarded::border853,16148
+class Proc_Inst:Proc_Inst867,16425
+       ID_List *gate_list;Proc_Inst::gate_list869,16461
+       ID_Place *ident;Proc_Inst::ident870,16482
+       Value_Expr_List *value_expr_list;Proc_Inst::value_expr_list871,16500
+       Coord yp,Proc_Inst::yp872,16535
+       Coord yp, yl1,Proc_Inst::yl1872,16535
+       Coord yp, yl1, Xopen,Proc_Inst::Xopen872,16535
+       Coord yp, yl1, Xopen, Xclose;Proc_Inst::Xclose872,16535
+       int hp;Proc_Inst::hp873,16566
+       char border;Proc_Inst::border874,16575
+class Parallel:Parallel888,16870
+       Tree_Node *bex1,Parallel::bex1890,16905
+       Tree_Node *bex1, *bex2,Parallel::bex2890,16905
+       Tree_Node *bex1, *bex2, *oper;Parallel::oper890,16905
+       Coord xl,Parallel::xl891,16937
+       Coord xl, yl,Parallel::yl891,16937
+       Coord xl, yl, yl1;Parallel::yl1891,16937
+       char havebox;Parallel::havebox892,16957
+       int delta;Parallel::delta893,16972
+       char border;Parallel::border894,16984
+ char GetOperType(Parallel::GetOperType910,17343
+class Local_Def:Local_Def914,17429
+       Ident_Eq_List *equa_list;Local_Def::equa_list916,17465
+       Tree_Node *bex;Local_Def::bex917,17492
+       Coord yl;Local_Def::yl918,17509
+       char border;Local_Def::border919,17520
+class Par:Par933,17801
+       Gate_Decl_List *gate_decl_list;Par::gate_decl_list935,17831
+       Tree_Node *oper,Par::oper936,17864
+       Tree_Node *oper, *bex;Par::bex936,17864
+       Coord xl,Par::xl937,17888
+       Coord xl, yl;Par::yl937,17888
+       char border;Par::border938,17903
+class Sum_Gate:Sum_Gate952,18180
+       Gate_Decl_List *gate_decl_list;Sum_Gate::gate_decl_list954,18215
+       Tree_Node *bex;Sum_Gate::bex955,18248
+       Coord xl,Sum_Gate::xl956,18265
+       Coord xl, yl,Sum_Gate::yl956,18265
+       Coord xl, yl, Xch,Sum_Gate::Xch956,18265
+       Coord xl, yl, Xch, Ych,Sum_Gate::Ych956,18265
+       Coord xl, yl, Xch, Ych, Xclose,Sum_Gate::Xclose956,18265
+       Coord xl, yl, Xch, Ych, Xclose, Yclose;Sum_Gate::Yclose956,18265
+       char border;Sum_Gate::border957,18306
+class Sum_Ident:Sum_Ident972,18613
+       Id_Decl_List *ident_decl_list;Sum_Ident::ident_decl_list974,18649
+       Tree_Node *bex;Sum_Ident::bex975,18681
+       Coord xl,Sum_Ident::xl976,18698
+       Coord xl, yl,Sum_Ident::yl976,18698
+       Coord xl, yl, Xch,Sum_Ident::Xch976,18698
+       Coord xl, yl, Xch, Ych,Sum_Ident::Ych976,18698
+       Coord xl, yl, Xch, Ych, Xclose,Sum_Ident::Xclose976,18698
+       Coord xl, yl, Xch, Ych, Xclose, Yclose;Sum_Ident::Yclose976,18698
+       char border;Sum_Ident::border977,18739
+
+cp-src/cfront.H,8316
+struct loc     67,1948
+       short   file;loc::file69,1988
+       short   line;loc::line70,2036
+struct ea 80,2150
+               void* p;ea::p82,2224
+               int i;ea::i83,2235
+       ea(ea::ea86,2249
+       ea(ea::ea87,2275
+       ea(ea::ea88,2301
+       ea(ea::ea89,2310
+overload error;94,2349
+#define DEL(161,4040
+#define PERM(162,4092
+#define UNPERM(163,4123
+struct node 165,4157
+       TOK     base;node::base166,4171
+       TOK     n_key;node::n_key167,4182
+       bit     permanent;node::permanent168,4226
+struct table 175,4321
+       char    init_stat;table::init_stat177,4406
+       short   size;table::size181,4571
+       short   hashsize;table::hashsize182,4584
+       short   free_slot;table::free_slot183,4601
+       Pname*  entries;table::entries184,4651
+       short*  hashtbl;table::hashtbl185,4668
+       Pstmt   real_block;table::real_block186,4685
+       Ptable  next;table::next189,4787
+       Pname   t_name;table::t_name190,4834
+       void    set_scope(table::set_scope198,4988
+       void    set_name(table::set_name199,5029
+       int     max(table::max201,5091
+#define DEFINED 230,5655
+#define SIMPLIFIED 231,5712
+#define DEF_SEEN 232,5754
+#define IN_ERROR 234,5859
+struct type 236,5881
+       bit     defined;type::defined237,5902
+       TOK     integral(type::integral255,6278
+       TOK     numeric(type::numeric256,6324
+       TOK     num_ptr(type::num_ptr257,6370
+struct enumdef 265,6500
+       bit     e_body;enumdef::e_body266,6535
+       short   no_of_enumerators;enumdef::no_of_enumerators267,6548
+       Pname   mem;enumdef::mem268,6574
+               enumdef(enumdef::enumdef269,6586
+struct classdef 278,6732
+       bit     pubbase;classdef::pubbase279,6769
+       bit     c_body;classdef::c_body280,6783
+       TOK     csu;classdef::csu281,6830
+       char    obj_align;classdef::obj_align282,6877
+       char    bit_ass;classdef::bit_ass283,6894
+       char    virt_count;classdef::virt_count284,6943
+       Pname   clbase;classdef::clbase286,7033
+       char*   string;classdef::string287,7063
+       Pname   mem_list;classdef::mem_list288,7099
+       Ptable  memtbl;classdef::memtbl289,7116
+       int     obj_size;classdef::obj_size290,7132
+       int     real_size;classdef::real_size291,7147
+       Plist   friend_list;classdef::friend_list292,7196
+       Pname   pubdef;classdef::pubdef293,7216
+       Plist   tn_list;classdef::tn_list294,7231
+       Pclass  in_class;classdef::in_class295,7289
+       Ptype   this_type;classdef::this_type296,7335
+       Pname*  virt_init;classdef::virt_init297,7353
+       Pname   itor;classdef::itor298,7412
+       Pname   conv;classdef::conv299,7450
+       TOK     is_simple(classdef::is_simple302,7506
+       Pname   has_ctor(classdef::has_ctor314,7759
+       Pname   has_dtor(classdef::has_dtor315,7813
+       Pname   has_itor(classdef::has_itor316,7867
+struct basetype 323,7935
+       bit     b_unsigned;basetype::b_unsigned334,8195
+       bit     b_const;basetype::b_const335,8212
+       bit     b_typedef;basetype::b_typedef336,8226
+       bit     b_inline;basetype::b_inline337,8242
+       bit     b_virtual;basetype::b_virtual338,8257
+       bit     b_short;basetype::b_short339,8273
+       bit     b_long;basetype::b_long340,8287
+       char    b_bits;basetype::b_bits341,8300
+       char    b_offset;basetype::b_offset342,8345
+       TOK     b_sto;basetype::b_sto343,8384
+       Pname   b_name;basetype::b_name344,8433
+       Ptable  b_table;basetype::b_table345,8478
+       Pexpr   b_field;basetype::b_field346,8525
+       Pname   b_xname;basetype::b_xname347,8582
+       Ptype   b_fieldtype;basetype::b_fieldtype348,8615
+struct fct 365,8857
+       TOK     nargs;fct::nargs367,8885
+       TOK     nargs_known;fct::nargs_known368,8897
+       char    f_virtual;fct::f_virtual369,8940
+       char    f_inline;fct::f_inline370,8991
+       Ptype   returns;fct::returns371,9052
+       Pname   argtype;fct::argtype372,9068
+       Ptype   s_returns;fct::s_returns373,9084
+       Pname   f_this;fct::f_this374,9102
+       Pclass  memof;fct::memof375,9117
+       Pblock  body;fct::body376,9158
+       Pname   f_init;fct::f_init377,9172
+       Pexpr   b_init;fct::b_init380,9295
+       Pexpr   f_expr;fct::f_expr383,9389
+       Pexpr   last_expanded;fct::last_expanded384,9441
+       Pname   f_result;fct::f_result385,9463
+       bit     declared(fct::declared396,9724
+struct name_list 403,9827
+       Pname   f;name_list::f404,9846
+       Plist   l;name_list::l405,9856
+       name_list(name_list::name_list406,9866
+struct gen 410,9931
+       Plist   fct_list;gen::fct_list411,9964
+       char*   string;gen::string412,9981
+struct pvtyp 419,10071
+       Ptype typ;pvtyp::typ420,10093
+struct vec 423,10109
+       Pexpr   dim;vec::dim426,10157
+       int     size;vec::size427,10169
+       vec(vec::vec429,10182
+struct ptr 435,10289
+       Pclass  memof;ptr::memof437,10339
+       bit     rdo;ptr::rdo438,10395
+       ptr(ptr::ptr440,10419
+inline Pptr type::addrof(447,10546
+struct expr 469,11113
+               Ptype   tp;expr::tp481,11414
+               int     syn_class;expr::syn_class482,11426
+               Pexpr   e1;expr::e1485,11456
+               char*   string;expr::string486,11468
+               int     i1;expr::i1487,11484
+               Pexpr   e2;expr::e2490,11507
+               Pexpr   n_initializer;expr::n_initializer491,11519
+               char*   string2;expr::string2492,11542
+               Ptype   tp2;expr::tp2495,11608
+               Pname   fct_name;expr::fct_name496,11621
+               Pexpr   cond;expr::cond497,11639
+               Pname   mem;expr::mem498,11653
+               Ptype   as_type;expr::as_type499,11666
+               Ptable  n_table;expr::n_table500,11683
+               Pin     il;expr::il501,11701
+struct texpr 527,12108
+       texpr(texpr::texpr528,12149
+struct ival 531,12218
+       ival(ival::ival532,12258
+struct call 535,12308
+       call(call::call536,12338
+struct qexpr 543,12453
+       qexpr(qexpr::qexpr544,12500
+struct ref 547,12582
+       ref(ref::ref548,12632
+struct text_expr 551,12697
+       text_expr(text_expr::text_expr552,12731
+struct name 557,12884
+       TOK     n_oper;name::n_oper558,12948
+       TOK     n_sto;name::n_sto559,12987
+       TOK     n_stclass;name::n_stclass560,13038
+       TOK     n_scope;name::n_scope561,13080
+       unsigned char   n_union;name::n_union562,13129
+       bit     n_evaluated;name::n_evaluated563,13173
+       bit     n_xref;name::n_xref564,13221
+       unsigned char   lex_level;name::lex_level565,13261
+       TOK     n_protect;name::n_protect566,13287
+       short   n_addr_taken;name::n_addr_taken567,13337
+       short   n_used;name::n_used568,13358
+       short   n_assigned_to;name::n_assigned_to569,13373
+       Loc     where;name::where570,13395
+       int     n_val;name::n_val571,13407
+       int     n_offset;name::n_offset574,13518
+       Pname   n_list;name::n_list575,13567
+       Pname   n_tbl_list;name::n_tbl_list576,13582
+               Pname   n_qualifier;name::n_qualifier578,13610
+               Ptable  n_realscope;name::n_realscope579,13659
+       void    unhide(name::unhide592,13929
+       void    use(name::use596,14025
+       void    take_addr(name::take_addr598,14069
+struct stmt 615,14374
+       Pstmt   s;stmt::s617,14479
+       Pstmt   s_list;stmt::s_list618,14489
+       Loc     where;stmt::where619,14504
+               Pname   d;stmt::d621,14525
+               Pexpr   e2;stmt::e2622,14536
+               Pstmt   has_default;stmt::has_default623,14548
+               int     case_value;stmt::case_value624,14569
+               Ptype   ret_tp;stmt::ret_tp625,14587
+               Pexpr   e;stmt::e628,14616
+               bit     own_tbl;stmt::own_tbl629,14627
+               Pstmt   s2;stmt::s2630,14642
+       Ptable  memtbl;stmt::memtbl632,14658
+               Pstmt   for_init;stmt::for_init634,14683
+               Pstmt   else_stmt;stmt::else_stmt635,14701
+               Pstmt   case_list;stmt::case_list636,14720
+               bit     empty;stmt::empty637,14739
+struct estmt 662,15111
+       estmt(estmt::estmt669,15303
+struct ifstmt 672,15379
+       ifstmt(ifstmt::ifstmt676,15484
+struct lstmt 680,15586
+       lstmt(lstmt::lstmt686,15650
+struct forstmt 689,15728
+       forstmt(forstmt::forstmt690,15759
+struct block 694,15880
+       block(block::block695,15919
+struct pair 703,16060
+       pair(pair::pair704,16096
+struct nlist 708,16173
+       Pname   head;nlist::head709,16188
+       Pname   tail;nlist::tail710,16201
+       void    add(nlist::add712,16230
+struct slist 718,16344
+       Pstmt   head;slist::head719,16359
+       Pstmt   tail;slist::tail720,16372
+               slist(slist::slist721,16385
+       void    add(slist::add722,16430
+struct elist 727,16521
+       Pexpr   head;elist::head728,16536
+       Pexpr   tail;elist::tail729,16549
+               elist(elist::elist730,16562
+       void    add(elist::add731,16607
+struct dcl_context 739,16739
+       Pname   c_this;dcl_context::c_this740,16760
+       Ptype   tot;dcl_context::tot741,16802
+       Pname   not;dcl_context::not742,16840
+       Pclass  cot;dcl_context::cot743,16886
+       Ptable  ftbl;dcl_context::ftbl744,16938
+       Pname   nof;dcl_context::nof745,16985
+       void    stack(dcl_context::stack747,17023
+       void    unstack(dcl_context::unstack748,17064
+#define MAXCONT        751,17095
+const MIA 779,17690
+struct iline 780,17705
+       Pname   fct_name;iline::fct_name781,17720
+       Pin     i_next;iline::i_next782,17754
+       Ptable  i_table;iline::i_table783,17767
+       Pname   local[iline::local784,17784
+       Pexpr   arg[iline::arg785,17838
+       Ptype   tp[iline::tp786,17887
+#define FUDGE111 791,17985
+#define DB(831,18890
+#define DB(833,18920
+
+cp-src/burton.cpp,103
+::dummy::dummy test::dummy1(1,0
+::dummy::dummy test::dummy2(6,64
+::dummy::dummy test::dummy3(11,143
+
+cp-src/functions.cpp,807
+void Date::setDate 5,148
+void Date::plus 32,939
+void Date::minus 42,1229
+void Date::shift 52,1407
+Date & Date::operator = Date::operator =62,1628
+Date & Date::operator += Date::operator +=69,1789
+Date & Date::operator -= Date::operator -=78,1939
+Date & Date::operator ++ Date::operator ++87,2080
+Date & Date::operator -- Date::operator --96,2216
+int Date::operator - Date::operator -104,2331
+int Date::operator < Date::operator <112,2483
+int Date::operator > Date::operator >116,2557
+int Date::operator == Date::operator ==120,2631
+ostream& operator << operator <<124,2707
+istream& operator >> operator >>133,2943
+bool isLeap 159,3543
+bool isHoliday 163,3629
+void asort(173,3865
+void ReadVacation 186,4064
+void Debug 201,4523
+int WorkingDays(211,4867
+Date StartDay(226,5129
+
+cp-src/MDiagArray2.h,709
+#define octave_MDiagArray2_h 29,870
+#undef LTGT35,967
+#define LTGT39,1031
+#define LTGT 42,1051
+class MDiagArray2 78,2022
+  MDiagArray2 MDiagArray2::MDiagArray282,2077
+  MDiagArray2 MDiagArray2::MDiagArray286,2154
+  MDiagArray2 MDiagArray2::MDiagArray287,2198
+  MDiagArray2 MDiagArray2::MDiagArray288,2254
+  MDiagArray2 MDiagArray2::MDiagArray289,2329
+  MDiagArray2 MDiagArray2::MDiagArray290,2387
+  MDiagArray2 MDiagArray2::MDiagArray291,2450
+  ~MDiagArray2 MDiagArray2::~MDiagArray293,2515
+  MDiagArray2<T>& operator = MDiagArray2::operator =95,2542
+  operator MArray2<T> MDiagArray2::operator MArray2<T>101,2667
+#undef LTGT144,3874
+#define INSTANTIATE_MDIAGARRAY_FRIENDS(146,3887
+
+cp-src/Pctest.h,665
+#define PCTEST_H24,837
+    PctestActionValid,::PctestActionValid47,1286
+    PctestActionValidLasthop,::PctestActionValidLasthop49,1370
+    PctestActionFiltered,::PctestActionFiltered51,1481
+    PctestActionAbort  ::PctestActionAbort53,1566
+} PctestActionType;54,1616
+class Pctest 56,1637
+    Pctest(Pctest::Pctest59,1663
+    virtual ~Pctest(Pctest::~Pctest65,1813
+    virtual char *GetTargetName(Pctest::GetTargetName77,2171
+    virtual PctestActionType GetAction(Pctest::GetAction86,2555
+    int initialized;Pctest::initialized93,2698
+    char *targetName;Pctest::targetName94,2743
+    struct timeval syscallTime;Pctest::syscallTime95,2785
+
+cp-src/Range.h,595
+#define octave_Range_h 24,765
+Range35,891
+  Range Range::Range39,909
+  Range Range::Range42,995
+  Range Range::Range46,1130
+  Range Range::Range50,1248
+  double base Range::base54,1376
+  double limit Range::limit55,1425
+  double inc Range::inc56,1475
+  int nelem Range::nelem57,1523
+  void set_base Range::set_base68,1728
+  void set_limit Range::set_limit69,1774
+  void set_inc Range::set_inc70,1821
+  double rng_base;Range::rng_base79,2023
+  double rng_limit;Range::rng_limit80,2042
+  double rng_inc;Range::rng_inc81,2062
+  int rng_nelem;Range::rng_nelem83,2081
+
+cp-src/screen.cpp,228
+unsigned char cursor_x,15,548
+unsigned char cursor_x, cursor_y;15,548
+static union REGS regs;16,582
+void goto_xy(18,607
+void hide_cursor(27,774
+void cursor_position(32,836
+void clear_screen(41,997
+void write_xyc(55,1247
+
+cp-src/screen.hpp,667
+#define __COLORS9,401
+enum COLORS 11,419
+    BLACK,COLORS::BLACK12,433
+    BLUE,COLORS::BLUE13,471
+    GREEN,COLORS::GREEN14,481
+    CYAN,COLORS::CYAN15,492
+    RED,COLORS::RED16,502
+    MAGENTA,COLORS::MAGENTA17,511
+    BROWN,COLORS::BROWN18,524
+    LIGHTGRAY,COLORS::LIGHTGRAY19,535
+    DARKGRAY,COLORS::DARKGRAY20,550
+    LIGHTBLUE,COLORS::LIGHTBLUE21,589
+    LIGHTGREEN,COLORS::LIGHTGREEN22,604
+    LIGHTCYAN,COLORS::LIGHTCYAN23,620
+    LIGHTRED,COLORS::LIGHTRED24,635
+    LIGHTMAGENTA,COLORS::LIGHTMAGENTA25,649
+    YELLOW,COLORS::YELLOW26,667
+    WHITECOLORS::WHITE27,679
+#define SCREEN_FP(31,700
+#define SCREEN_START 33,795
+
+cp-src/conway.cpp,270
+#define max(12,357
+#define min(13,393
+const int num_rows 15,430
+const int num_columns 16,470
+class site *field_of_play[field_of_play18,499
+int site::total_surrounding(20,550
+void display(37,958
+void glider(50,1239
+void traffic_light(59,1478
+void main(67,1633
+
+cp-src/conway.hpp,396
+class site:site5,235
+    char x,site::x7,269
+    char x, y,site::y7,269
+    char x, y, alive,site::alive7,269
+    char x, y, alive, next_alive;site::next_alive7,269
+    site(site::site10,344
+    char read(site::read12,410
+    void set(site::set13,444
+    void clear(site::clear14,478
+    void compute_next_state(site::compute_next_state15,514
+    void step(site::step22,717
+
+cp-src/clheir.cpp,307
+const int max_num_generic_objects 9,298
+generic_object * object_registry[object_registry10,340
+void init_registry(12,400
+void step_everybody(19,527
+void discrete_location::clear_neighbors(31,852
+generic_object::generic_object(36,981
+generic_object::~generic_object(48,1255
+void agent::move(53,1353
+
+cp-src/clheir.hpp,1057
+class generic_object13,520
+    int where_in_registry;generic_object::where_in_registry15,547
+    virtual void compute_next_state(generic_object::compute_next_state21,842
+    virtual void step(generic_object::step22,888
+const int max_num_directions 31,1219
+class location:location33,1289
+    location(location::location43,1642
+class irregular_location:irregular_location47,1686
+    double x,irregular_location::x49,1734
+    double x, y,irregular_location::y49,1734
+    double x, y, z;irregular_location::z49,1734
+    irregular_location(irregular_location::irregular_location51,1762
+class discrete_location:discrete_location56,1889
+    int x,discrete_location::x58,1936
+    int x, y,discrete_location::y58,1936
+    int x, y, z;discrete_location::z58,1936
+    class location *neighbors[discrete_location::neighbors59,1953
+    discrete_location(discrete_location::discrete_location62,2044
+    void assign_neighbor(discrete_location::assign_neighbor66,2184
+class agent:agent75,2508
+    location *where;agent::where77,2549
+
+cp-src/fail.C,417
+struct A 7,263
+          struct B A::B8,274
+                  struct C A::B::C9,289
+                          int x;A::B::C::x10,305
+                          C(A::B::C::C11,318
+                          operator int(A::B::C::operator int12,342
+                  typedef C T;A::B::T14,389
+          typedef B T2;A::T216,414
+class A 23,453
+       class B A::B24,463
+               class C A::B::C25,474
+               int f(A::B::f26,488
+int A::B::f(31,521
+main(37,571
+       class D 41,622
+               D(D::D43,659
+               int x;D::x44,694
+
+el-src/TAGTEST.EL,148
+(foo::defmumble bletch 1,0
+(defalias 'pending-delete-mode pending-delete-mode5,102
+(defalias (quote explicitly-quoted-pending-delete-mode)8,175
+
+el-src/emacs/lisp/progmodes/etags.el,5069
+(defvar tags-file-name 34,1034
+(defgroup etags 43,1498
+(defcustom tags-case-fold-search 47,1566
+(defcustom tags-table-list 59,2051
+(defcustom tags-compression-info-list69,2449
+(defcustom tags-add-tables 88,3231
+(defcustom tags-revert-without-query 98,3627
+(defvar tags-table-computed-list 103,3778
+(defvar tags-table-computed-list-for 112,4262
+(defvar tags-table-list-pointer 117,4510
+(defvar tags-table-list-started-at 121,4701
+(defvar tags-table-set-list 124,4821
+(defcustom find-tag-hook 129,5000
+(defcustom find-tag-default-function 137,5263
+(define-obsolete-variable-alias 
'find-tag-marker-ring-lengthfind-tag-marker-ring-length145,5602
+(defcustom tags-tag-face 148,5699
+(defcustom tags-apropos-verbose 154,5834
+(defcustom tags-apropos-additional-actions 160,5998
+(defvaralias 'find-tag-marker-ring find-tag-marker-ring183,6917
+(defvar default-tags-table-function 189,7097
+(defvar tags-location-ring 194,7323
+(defvar tags-table-files 201,7599
+(defvar tags-completion-table 206,7766
+(defvar tags-included-tables 209,7858
+(defvar next-file-list 212,7953
+(defvar tags-table-format-functions 217,8059
+(defvar file-of-tag-function 224,8440
+(defvar tags-table-files-function 228,8634
+(defvar tags-completion-table-function 230,8745
+(defvar snarf-tag-function 232,8840
+(defvar goto-tag-location-function 236,9049
+(defvar find-tag-regexp-search-function 239,9222
+(defvar find-tag-regexp-tag-order 241,9343
+(defvar find-tag-regexp-next-line-after-failure-p 243,9452
+(defvar find-tag-search-function 245,9572
+(defvar find-tag-tag-order 247,9679
+(defvar find-tag-next-line-after-failure-p 249,9774
+(defvar list-tags-function 251,9880
+(defvar tags-apropos-function 253,9968
+(defvar tags-included-tables-function 255,10062
+(defvar verify-tags-table-function 257,10181
+(defun initialize-new-tags-table 260,10292
+(defun tags-table-mode 276,10980
+(defun visit-tags-table 285,11245
+(defun tags-table-check-computed-list 321,12783
+(defun tags-table-extend-computed-list 360,14654
+(defun tags-expand-table-name 400,16367
+(defun tags-table-list-member 409,16710
+(defun tags-verify-table 421,17182
+(defun tags-table-including 470,19302
+(defun tags-next-table 522,21346
+(defun visit-tags-table-buffer 543,22203
+(defun tags-reset-tags-tables 712,28513
+(defun file-of-tag 731,29170
+(defun tags-table-files 740,29519
+(defun tags-included-tables 749,29869
+(defun tags-completion-table 755,30115
+(defun tags-lazy-completion-table 783,31309
+(defun tags-completion-at-point-function 799,31944
+(defun find-tag-tag 818,32694
+(defvar last-tag 837,33367
+(defun find-tag-interactive 840,33426
+(defvar find-tag-history 852,33841
+(defun find-tag-noselect 860,34011
+(defun find-tag 932,37125
+(defun find-tag-other-window 959,38341
+(defun find-tag-other-frame 1000,40269
+(defun find-tag-regexp 1025,41443
+(defalias 'pop-tag-mark pop-tag-mark1049,42605
+(defvar tag-lines-already-matched 1052,42656
+(defun find-tag-in-order 1055,42763
+(defun tag-find-file-of-tag-noselect 1167,47109
+(defun tag-find-file-of-tag 1200,48955
+(defun etags-recognize-tags-table 1208,49181
+(defun etags-verify-tags-table 1241,50812
+(defun etags-file-of-tag 1246,51010
+(defun etags-tags-completion-table 1256,51345
+(defun etags-snarf-tag 1286,52551
+(defun etags-goto-tag-location 1324,54120
+(defun etags-list-tags 1388,56563
+(defmacro tags-with-face 1423,57838
+(defun etags-tags-apropos-additional 1431,58171
+(defun etags-tags-apropos 1465,59408
+(defun etags-tags-table-files 1527,61617
+(defun etags-tags-included-tables 1542,62053
+(defun tags-recognize-empty-tags-table 1559,62593
+(defun tag-exact-file-name-match-p 1587,63739
+(defun tag-file-name-match-p 1596,64132
+(defun tag-exact-match-p 1609,64688
+(defun tag-implicit-name-match-p 1620,65256
+(defun tag-symbol-match-p 1633,65856
+(defun tag-word-match-p 1643,66292
+(defun tag-partial-file-name-match-p 1652,66690
+(defun tag-any-match-p 1662,67134
+(defun tag-re-match-p 1667,67318
+(defcustom tags-loop-revert-buffers 1675,67567
+(defun next-file 1685,67976
+(defvar tags-loop-operate 1760,70890
+(defvar tags-loop-scan1763,70984
+(defun tags-loop-eval 1771,71314
+(defun tags-loop-continue 1782,71643
+(defun tags-search 1850,73949
+(defun tags-query-replace 1871,74775
+(defun tags-complete-tags-table-file 1896,75999
+(defun list-tags 1906,76378
+(defun tags-apropos 1934,77331
+(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78157
+(defun select-tags-table 1964,78396
+(defvar select-tags-table-mode-map 2019,80523
+(define-derived-mode select-tags-table-mode 2030,80906
+(defun select-tags-table-select 2034,81090
+(defun select-tags-table-quit 2043,81456
+(defun complete-tag 2049,81611
+(defconst etags--xref-limit 2074,82552
+(defvar etags-xref-find-definitions-tag-order 2076,82587
+(defun etags-xref-find 2082,82877
+(defun etags--xref-find-definitions 2096,83406
+(defclass xref-etags-location 2129,85121
+(defun xref-make-etags-location 2135,85344
+(cl-defmethod xref-location-marker 2139,85499
+(cl-defmethod xref-location-line 2146,85743
+
+erl-src/gs_dialog.erl,98
+-define(VERSION2,32
+behaviour_info(51,2177
+show(124,5458
+dialog_loop(219,9529
+test(252,10806
+
+erl-src/lines.erl,386
+-define(BREAK66,2377
+-define(dbg68,2437
+new(73,2565
+count(80,2686
+nth(87,2815
+append(104,3301
+replace(119,3816
+insert(138,4559
+insert_after(165,5501
+delete(192,6456
+convert_to_list(215,7110
+convert_from_list(220,7259
+replace_nth(229,7518
+insert_nth(234,7618
+insert_after_nth(239,7711
+delete_nth(244,7828
+split_at(252,8027
+balance_left(267,8451
+balance_right(282,8865
+
+erl-src/lists.erl,593
+member(21,663
+append(30,790
+reverse(48,1099
+nth(59,1310
+nthtail(64,1382
+prefix(73,1546
+suffix(83,1707
+last(92,1882
+seq(101,2058
+sum(109,2265
+duplicate(116,2432
+min(124,2628
+max(132,2837
+sublist(141,3083
+delete(152,3329
+sort(161,3483
+split_and_sort(165,3559
+merge(175,3811
+concat(190,4219
+thing_to_list(195,4300
+flatten(204,4606
+flat_length(222,5003
+keymember(239,5451
+keysearch(246,5609
+keydelete(253,5770
+keyreplace(260,5923
+keysort(266,6113
+split_and_keysort(270,6229
+keymerge(277,6504
+keymap(288,6851
+map(311,7829
+foldl(315,7919
+foldr(320,8037
+zf(325,8155
+
+f-src/entry.for,172
+      LOGICAL FUNCTION PRTPKG 3,75
+       ENTRY  SETPRT 194,3866
+       ENTRY  MSGSEL 395,8478
+     & intensity1(577,12231
+       character*(*) function foo(579,12307
+
+f-src/entry.strange_suffix,172
+      LOGICAL FUNCTION PRTPKG 3,75
+       ENTRY  SETPRT 194,3866
+       ENTRY  MSGSEL 395,8478
+     & intensity1(577,12231
+       character*(*) function foo(579,12307
+
+f-src/entry.strange,103
+       ENTRY  MSGSEL 193,4382
+     & intensity1(375,8135
+       character*(*) function foo(377,8211
+
+forth-src/test-forth.fth,408
+: a-forth-word 20,301
+99 constant a-forth-constant!22,343
+55 value a-forth-value?23,373
+create :a-forth-dictionary-entry24,397
+defer #a-defer-word27,460
+: (another-forth-word)(another-forth-word29,481
+   9   field   >field136,582
+   5   field   >field237,605
+constant (a-forth-constant(a-forth-constant38,628
+2000 buffer: #some-storage41,657
+code assemby-code-word 43,685
+: a-forth-word 50,870
+
+html-src/softwarelibero.html,198
+Cos'� il software libero?4,38
+Licenze d'uso di un programmalicenze65,2474
+Sfatiamo alcuni miti138,6064
+Il movimento open sourceoss191,7968
+Impatto pratico del software liberoimpatto231,9986
+
+html-src/index.shtml,104
+&nbsp;8,281
+In evidenza15,446
+Comunicati e iniziative32,974
+Ultime notizie dall'associazione63,2027
+
+html-src/algrthms.html,467
+Tutorial on Convolutional Coding with Viterbi Decoding--Description of the 
Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and 
Quantizing Algorithms7,276
+Descriptionalgorithms10,477
+Generating the Datagenalgorithm48,1953
+Convolutionallyconalgorithm55,2463
+Nextstatetable262,11331
+Outputoutputtable350,13571
+Mapping the Channel Symbolsmapping433,15786
+Adding Noise to theaddnoise439,16174
+Quantizing the Receivedquantizing469,18637
+
+html-src/software.html,438
+Francesco Potort� Software Page9,280
+Software that I wrote for supporting my research activitysimulation36,1400
+MTGmtg41,1484
+Fracasfracas65,2626
+GaliLEOgalileo101,4234
+Leasqrleasqr114,4679
+Free software that I wrote for the GNU project or for my personal or 
workgnu142,6067
+Etagsetags148,6182
+checkiso161,6731
+cgrep178,7549
+debian-bug.eldebian-bug190,7981
+tcpdump205,8566
+Links to interesting softwarelinks216,8893
+
+java-src/AWTEMul.java,4481
+public class AWTEventMulticaster 63,2111
+    protected EventListener a,AWTEventMulticaster.a69,2356
+    protected EventListener a, b;AWTEventMulticaster.b69,2356
+    protected 
AWTEventMulticaster(AWTEventMulticaster.AWTEventMulticaster77,2555
+    protected EventListener remove(AWTEventMulticaster.remove86,2820
+    public void componentResized(AWTEventMulticaster.componentResized102,3294
+    public void componentMoved(AWTEventMulticaster.componentMoved112,3626
+    public void componentShown(AWTEventMulticaster.componentShown122,3952
+    public void componentHidden(AWTEventMulticaster.componentHidden132,4280
+    public void componentAdded(AWTEventMulticaster.componentAdded142,4619
+    public void componentRemoved(AWTEventMulticaster.componentRemoved152,4959
+    public void focusGained(AWTEventMulticaster.focusGained162,5281
+    public void focusLost(AWTEventMulticaster.focusLost172,5572
+    public void keyTyped(AWTEventMulticaster.keyTyped182,5853
+    public void keyPressed(AWTEventMulticaster.keyPressed192,6129
+    public void keyReleased(AWTEventMulticaster.keyReleased202,6413
+    public void mouseClicked(AWTEventMulticaster.mouseClicked212,6704
+    public void mousePressed(AWTEventMulticaster.mousePressed222,7004
+    public void mouseReleased(AWTEventMulticaster.mouseReleased232,7306
+    public void mouseEntered(AWTEventMulticaster.mouseEntered242,7609
+    public void mouseExited(AWTEventMulticaster.mouseExited252,7907
+    public void mouseDragged(AWTEventMulticaster.mouseDragged262,8204
+    public void mouseMoved(AWTEventMulticaster.mouseMoved272,8512
+    public void windowOpened(AWTEventMulticaster.windowOpened282,8819
+    public void windowClosing(AWTEventMulticaster.windowClosing292,9125
+    public void windowClosed(AWTEventMulticaster.windowClosed302,9432
+    public void windowIconified(AWTEventMulticaster.windowIconified312,9742
+    public void 
windowDeiconified(AWTEventMulticaster.windowDeiconified322,10064
+    public void windowActivated(AWTEventMulticaster.windowActivated332,10389
+    public void 
windowDeactivated(AWTEventMulticaster.windowDeactivated342,10712
+    public void actionPerformed(AWTEventMulticaster.actionPerformed352,11037
+    public void 
itemStateChanged(AWTEventMulticaster.itemStateChanged362,11356
+    public void 
adjustmentValueChanged(AWTEventMulticaster.adjustmentValueChanged372,11690
+    public void 
textValueChanged(AWTEventMulticaster.textValueChanged376,11874
+    public static ComponentListener add(AWTEventMulticaster.add387,12225
+    public static ContainerListener add(AWTEventMulticaster.add397,12571
+    public static FocusListener add(AWTEventMulticaster.add407,12901
+    public static KeyListener add(AWTEventMulticaster.add417,13207
+    public static MouseListener add(AWTEventMulticaster.add427,13513
+    public static MouseMotionListener add(AWTEventMulticaster.add437,13855
+    public static WindowListener add(AWTEventMulticaster.add447,14197
+    public static ActionListener add(AWTEventMulticaster.add457,14519
+    public static ItemListener add(AWTEventMulticaster.add467,14833
+    public static AdjustmentListener add(AWTEventMulticaster.add477,15163
+    public static TextListener add(AWTEventMulticaster.add480,15310
+    public static ComponentListener 
remove(AWTEventMulticaster.remove490,15664
+    public static ContainerListener 
remove(AWTEventMulticaster.remove500,16044
+    public static FocusListener remove(AWTEventMulticaster.remove510,16408
+    public static KeyListener remove(AWTEventMulticaster.remove520,16748
+    public static MouseListener remove(AWTEventMulticaster.remove530,17088
+    public static MouseMotionListener 
remove(AWTEventMulticaster.remove540,17465
+    public static WindowListener remove(AWTEventMulticaster.remove550,17841
+    public static ActionListener remove(AWTEventMulticaster.remove560,18197
+    public static ItemListener remove(AWTEventMulticaster.remove570,18545
+    public static AdjustmentListener 
remove(AWTEventMulticaster.remove580,18909
+    public static TextListener remove(AWTEventMulticaster.remove583,19062
+    protected static EventListener 
addInternal(AWTEventMulticaster.addInternal597,19608
+    protected static EventListener 
removeInternal(AWTEventMulticaster.removeInternal614,20244
+    protected void saveInternal(AWTEventMulticaster.saveInternal628,20582
+    static void save(AWTEventMulticaster.save646,21131
+
+java-src/KeyEve.java,8202
+public class KeyEvent 36,1075
+    public static final int KEY_FIRST KeyEvent.KEY_FIRST41,1201
+    public static final int KEY_LAST KeyEvent.KEY_LAST46,1328
+    public static final int KEY_TYPED KeyEvent.KEY_TYPED52,1513
+    public static final int KEY_PRESSED KeyEvent.KEY_PRESSED57,1616
+    public static final int KEY_RELEASED KeyEvent.KEY_RELEASED62,1744
+    public static final int VK_ENTER KeyEvent.VK_ENTER85,2950
+    public static final int VK_BACK_SPACE KeyEvent.VK_BACK_SPACE86,3004
+    public static final int VK_TAB KeyEvent.VK_TAB87,3058
+    public static final int VK_CANCEL KeyEvent.VK_CANCEL88,3112
+    public static final int VK_CLEAR KeyEvent.VK_CLEAR89,3166
+    public static final int VK_SHIFT KeyEvent.VK_SHIFT90,3220
+    public static final int VK_CONTROL KeyEvent.VK_CONTROL91,3274
+    public static final int VK_ALT KeyEvent.VK_ALT92,3328
+    public static final int VK_PAUSE KeyEvent.VK_PAUSE93,3382
+    public static final int VK_CAPS_LOCK KeyEvent.VK_CAPS_LOCK94,3436
+    public static final int VK_ESCAPE KeyEvent.VK_ESCAPE95,3490
+    public static final int VK_SPACE KeyEvent.VK_SPACE96,3544
+    public static final int VK_PAGE_UP KeyEvent.VK_PAGE_UP97,3598
+    public static final int VK_PAGE_DOWN KeyEvent.VK_PAGE_DOWN98,3652
+    public static final int VK_END KeyEvent.VK_END99,3706
+    public static final int VK_HOME KeyEvent.VK_HOME100,3760
+    public static final int VK_LEFT KeyEvent.VK_LEFT101,3814
+    public static final int VK_UP KeyEvent.VK_UP102,3868
+    public static final int VK_RIGHT KeyEvent.VK_RIGHT103,3922
+    public static final int VK_DOWN KeyEvent.VK_DOWN104,3976
+    public static final int VK_COMMA KeyEvent.VK_COMMA105,4030
+    public static final int VK_PERIOD KeyEvent.VK_PERIOD106,4084
+    public static final int VK_SLASH KeyEvent.VK_SLASH107,4138
+    public static final int VK_0 KeyEvent.VK_0110,4268
+    public static final int VK_1 KeyEvent.VK_1111,4322
+    public static final int VK_2 KeyEvent.VK_2112,4376
+    public static final int VK_3 KeyEvent.VK_3113,4430
+    public static final int VK_4 KeyEvent.VK_4114,4484
+    public static final int VK_5 KeyEvent.VK_5115,4538
+    public static final int VK_6 KeyEvent.VK_6116,4592
+    public static final int VK_7 KeyEvent.VK_7117,4646
+    public static final int VK_8 KeyEvent.VK_8118,4700
+    public static final int VK_9 KeyEvent.VK_9119,4754
+    public static final int VK_SEMICOLON KeyEvent.VK_SEMICOLON121,4809
+    public static final int VK_EQUALS KeyEvent.VK_EQUALS122,4863
+    public static final int VK_A KeyEvent.VK_A125,4993
+    public static final int VK_B KeyEvent.VK_B126,5047
+    public static final int VK_C KeyEvent.VK_C127,5101
+    public static final int VK_D KeyEvent.VK_D128,5155
+    public static final int VK_E KeyEvent.VK_E129,5209
+    public static final int VK_F KeyEvent.VK_F130,5263
+    public static final int VK_G KeyEvent.VK_G131,5317
+    public static final int VK_H KeyEvent.VK_H132,5371
+    public static final int VK_I KeyEvent.VK_I133,5425
+    public static final int VK_J KeyEvent.VK_J134,5479
+    public static final int VK_K KeyEvent.VK_K135,5533
+    public static final int VK_L KeyEvent.VK_L136,5587
+    public static final int VK_M KeyEvent.VK_M137,5641
+    public static final int VK_N KeyEvent.VK_N138,5695
+    public static final int VK_O KeyEvent.VK_O139,5749
+    public static final int VK_P KeyEvent.VK_P140,5803
+    public static final int VK_Q KeyEvent.VK_Q141,5857
+    public static final int VK_R KeyEvent.VK_R142,5911
+    public static final int VK_S KeyEvent.VK_S143,5965
+    public static final int VK_T KeyEvent.VK_T144,6019
+    public static final int VK_U KeyEvent.VK_U145,6073
+    public static final int VK_V KeyEvent.VK_V146,6127
+    public static final int VK_W KeyEvent.VK_W147,6181
+    public static final int VK_X KeyEvent.VK_X148,6235
+    public static final int VK_Y KeyEvent.VK_Y149,6289
+    public static final int VK_Z KeyEvent.VK_Z150,6343
+    public static final int VK_OPEN_BRACKET KeyEvent.VK_OPEN_BRACKET152,6398
+    public static final int VK_BACK_SLASH KeyEvent.VK_BACK_SLASH153,6452
+    public static final int VK_CLOSE_BRACKET 
KeyEvent.VK_CLOSE_BRACKET154,6506
+    public static final int VK_NUMPAD0 KeyEvent.VK_NUMPAD0156,6561
+    public static final int VK_NUMPAD1 KeyEvent.VK_NUMPAD1157,6615
+    public static final int VK_NUMPAD2 KeyEvent.VK_NUMPAD2158,6669
+    public static final int VK_NUMPAD3 KeyEvent.VK_NUMPAD3159,6723
+    public static final int VK_NUMPAD4 KeyEvent.VK_NUMPAD4160,6777
+    public static final int VK_NUMPAD5 KeyEvent.VK_NUMPAD5161,6831
+    public static final int VK_NUMPAD6 KeyEvent.VK_NUMPAD6162,6885
+    public static final int VK_NUMPAD7 KeyEvent.VK_NUMPAD7163,6939
+    public static final int VK_NUMPAD8 KeyEvent.VK_NUMPAD8164,6993
+    public static final int VK_NUMPAD9 KeyEvent.VK_NUMPAD9165,7047
+    public static final int VK_MULTIPLY KeyEvent.VK_MULTIPLY166,7101
+    public static final int VK_ADD KeyEvent.VK_ADD167,7155
+    public static final int VK_SEPARATER KeyEvent.VK_SEPARATER168,7209
+    public static final int VK_SUBTRACT KeyEvent.VK_SUBTRACT169,7263
+    public static final int VK_DECIMAL KeyEvent.VK_DECIMAL170,7317
+    public static final int VK_DIVIDE KeyEvent.VK_DIVIDE171,7371
+    public static final int VK_F1 KeyEvent.VK_F1172,7425
+    public static final int VK_F2 KeyEvent.VK_F2173,7479
+    public static final int VK_F3 KeyEvent.VK_F3174,7533
+    public static final int VK_F4 KeyEvent.VK_F4175,7587
+    public static final int VK_F5 KeyEvent.VK_F5176,7641
+    public static final int VK_F6 KeyEvent.VK_F6177,7695
+    public static final int VK_F7 KeyEvent.VK_F7178,7749
+    public static final int VK_F8 KeyEvent.VK_F8179,7803
+    public static final int VK_F9 KeyEvent.VK_F9180,7857
+    public static final int VK_F10 KeyEvent.VK_F10181,7911
+    public static final int VK_F11 KeyEvent.VK_F11182,7965
+    public static final int VK_F12 KeyEvent.VK_F12183,8019
+    public static final int VK_DELETE KeyEvent.VK_DELETE184,8073
+    public static final int VK_NUM_LOCK KeyEvent.VK_NUM_LOCK185,8143
+    public static final int VK_SCROLL_LOCK KeyEvent.VK_SCROLL_LOCK186,8197
+    public static final int VK_PRINTSCREEN KeyEvent.VK_PRINTSCREEN188,8252
+    public static final int VK_INSERT KeyEvent.VK_INSERT189,8306
+    public static final int VK_HELP KeyEvent.VK_HELP190,8360
+    public static final int VK_META KeyEvent.VK_META191,8414
+    public static final int VK_BACK_QUOTE KeyEvent.VK_BACK_QUOTE193,8469
+    public static final int VK_QUOTE KeyEvent.VK_QUOTE194,8523
+    public static final int VK_FINAL KeyEvent.VK_FINAL197,8608
+    public static final int VK_CONVERT KeyEvent.VK_CONVERT198,8662
+    public static final int VK_NONCONVERT KeyEvent.VK_NONCONVERT199,8716
+    public static final int VK_ACCEPT KeyEvent.VK_ACCEPT200,8770
+    public static final int VK_MODECHANGE KeyEvent.VK_MODECHANGE201,8824
+    public static final int VK_KANA KeyEvent.VK_KANA202,8878
+    public static final int VK_KANJI KeyEvent.VK_KANJI203,8932
+    public static final int VK_UNDEFINED KeyEvent.VK_UNDEFINED208,9062
+    public static final char CHAR_UNDEFINED KeyEvent.CHAR_UNDEFINED214,9259
+    int  keyCode;KeyEvent.keyCode216,9313
+    char keyChar;KeyEvent.keyChar217,9331
+     private static final long serialVersionUID 
KeyEvent.serialVersionUID222,9398
+    public KeyEvent(KeyEvent.KeyEvent234,9912
+    public KeyEvent(KeyEvent.KeyEvent252,10510
+    public int getKeyCode(KeyEvent.getKeyCode261,10836
+    public void setKeyCode(KeyEvent.setKeyCode265,10897
+    public void setKeyChar(KeyEvent.setKeyChar269,10978
+    public void setModifiers(KeyEvent.setModifiers273,11060
+    public char getKeyChar(KeyEvent.getKeyChar282,11331
+    public static String getKeyText(KeyEvent.getKeyText290,11561
+    public static String 
getKeyModifiersText(KeyEvent.getKeyModifiersText377,16662
+    public boolean isActionKey(KeyEvent.isActionKey403,17618
+    public String paramString(KeyEvent.paramString407,17704
+
+java-src/SMan.java,5231
+class SecurityManager 80,3387
+    protected boolean inCheck;SecurityManager.inCheck87,3576
+    private boolean initialized SecurityManager.initialized90,3678
+    public boolean getInCheck(SecurityManager.getInCheck101,4075
+    protected SecurityManager(SecurityManager.SecurityManager114,4497
+    protected Class 
currentLoadedClass(SecurityManager.currentLoadedClass149,5707
+    protected boolean inClass(SecurityManager.inClass184,7034
+    protected boolean inClassLoader(SecurityManager.inClassLoader196,7372
+    public Object 
getSecurityContext(SecurityManager.getSecurityContext221,8485
+    public void 
checkCreateClassLoader(SecurityManager.checkCreateClassLoader238,9069
+    public void checkAccess(SecurityManager.checkAccess268,10298
+    public void checkAccess(SecurityManager.checkAccess298,11632
+    public void checkExit(SecurityManager.checkExit323,12649
+    public void checkExec(SecurityManager.checkExec349,13734
+    public void checkLink(SecurityManager.checkLink375,14813
+    public void checkRead(SecurityManager.checkRead394,15485
+    public void checkRead(SecurityManager.checkRead412,16111
+    public void checkRead(SecurityManager.checkRead434,17017
+    public void checkWrite(SecurityManager.checkWrite453,17706
+    public void checkWrite(SecurityManager.checkWrite471,18337
+    public void checkDelete(SecurityManager.checkDelete493,19165
+    public void checkConnect(SecurityManager.checkConnect517,20119
+    public void checkConnect(SecurityManager.checkConnect543,21254
+    public void checkListen(SecurityManager.checkListen561,21910
+    public void checkAccept(SecurityManager.checkAccept585,22887
+    public void checkMulticast(SecurityManager.checkMulticast597,23272
+    public void checkMulticast(SecurityManager.checkMulticast610,23732
+    public void 
checkPropertiesAccess(SecurityManager.checkPropertiesAccess632,24609
+    public void 
checkPropertyAccess(SecurityManager.checkPropertyAccess654,25449
+    public boolean 
checkTopLevelWindow(SecurityManager.checkTopLevelWindow680,26580
+    public void 
checkPrintJobAccess(SecurityManager.checkPrintJobAccess689,26763
+    public void 
checkSystemClipboardAccess(SecurityManager.checkSystemClipboardAccess698,26958
+    public void 
checkAwtEventQueueAccess(SecurityManager.checkAwtEventQueueAccess707,27159
+    public void 
checkPackageAccess(SecurityManager.checkPackageAccess729,27966
+    public void 
checkPackageDefinition(SecurityManager.checkPackageDefinition751,28803
+    public void checkSetFactory(SecurityManager.checkSetFactory775,29929
+    public void checkMemberAccess(SecurityManager.checkMemberAccess786,30209
+    public void 
checkSecurityAccess(SecurityManager.checkSecurityAccess796,30430
+    public ThreadGroup getThreadGroup(SecurityManager.getThreadGroup811,30923
+class NullSecurityManager 817,31025
+    public void 
checkCreateClassLoader(NullSecurityManager.checkCreateClassLoader818,31077
+    public void checkAccess(NullSecurityManager.checkAccess819,31123
+    public void checkAccess(NullSecurityManager.checkAccess820,31165
+    public void checkExit(NullSecurityManager.checkExit821,31212
+    public void checkExec(NullSecurityManager.checkExec822,31254
+    public void checkLink(NullSecurityManager.checkLink823,31296
+    public void checkRead(NullSecurityManager.checkRead824,31338
+    public void checkRead(NullSecurityManager.checkRead825,31387
+    public void checkRead(NullSecurityManager.checkRead826,31430
+    public void checkWrite(NullSecurityManager.checkWrite827,31489
+    public void checkWrite(NullSecurityManager.checkWrite828,31539
+    public void checkDelete(NullSecurityManager.checkDelete829,31583
+    public void checkConnect(NullSecurityManager.checkConnect830,31628
+    public void checkConnect(NullSecurityManager.checkConnect831,31684
+    public void checkListen(NullSecurityManager.checkListen832,31756
+    public void checkAccept(NullSecurityManager.checkAccept833,31798
+    public void checkMulticast(NullSecurityManager.checkMulticast834,31853
+    public void checkMulticast(NullSecurityManager.checkMulticast835,31907
+    public void 
checkPropertiesAccess(NullSecurityManager.checkPropertiesAccess836,31971
+    public void 
checkPropertyAccess(NullSecurityManager.checkPropertyAccess837,32015
+    public void 
checkPropertyAccess(NullSecurityManager.checkPropertyAccess838,32067
+    public boolean 
checkTopLevelWindow(NullSecurityManager.checkTopLevelWindow839,32131
+    public void 
checkPrintJobAccess(NullSecurityManager.checkPrintJobAccess840,32202
+    public void 
checkSystemClipboardAccess(NullSecurityManager.checkSystemClipboardAccess841,32244
+    public void 
checkAwtEventQueueAccess(NullSecurityManager.checkAwtEventQueueAccess842,32293
+    public void 
checkPackageAccess(NullSecurityManager.checkPackageAccess843,32340
+    public void 
checkPackageDefinition(NullSecurityManager.checkPackageDefinition844,32391
+    public void checkSetFactory(NullSecurityManager.checkSetFactory845,32446
+    public void 
checkMemberAccess(NullSecurityManager.checkMemberAccess846,32484
+    public void 
checkSecurityAccess(NullSecurityManager.checkSecurityAccess847,32546
+
+java-src/SysCol.java,4721
+public final class SystemColor 37,1402
+    public final static int DESKTOP SystemColor.DESKTOP42,1555
+    public final static int ACTIVE_CAPTION SystemColor.ACTIVE_CAPTION47,1677
+    public final static int ACTIVE_CAPTION_TEXT 
SystemColor.ACTIVE_CAPTION_TEXT52,1800
+    public final static int ACTIVE_CAPTION_BORDER 
SystemColor.ACTIVE_CAPTION_BORDER57,1930
+    public final static int INACTIVE_CAPTION 
SystemColor.INACTIVE_CAPTION62,2068
+    public final static int INACTIVE_CAPTION_TEXT 
SystemColor.INACTIVE_CAPTION_TEXT67,2195
+    public final static int INACTIVE_CAPTION_BORDER 
SystemColor.INACTIVE_CAPTION_BORDER72,2329
+    public final static int WINDOW SystemColor.WINDOW77,2459
+    public final static int WINDOW_BORDER SystemColor.WINDOW_BORDER82,2568
+    public final static int WINDOW_TEXT SystemColor.WINDOW_TEXT87,2682
+    public final static int MENU SystemColor.MENU92,2798
+    public final static int MENU_TEXT SystemColor.MENU_TEXT97,2902
+    public final static int TEXT SystemColor.TEXT102,3017
+    public final static int TEXT_TEXT SystemColor.TEXT_TEXT107,3121
+    public final static int TEXT_HIGHLIGHT SystemColor.TEXT_HIGHLIGHT112,3235
+    public final static int TEXT_HIGHLIGHT_TEXT 
SystemColor.TEXT_HIGHLIGHT_TEXT117,3359
+    public final static int TEXT_INACTIVE_TEXT 
SystemColor.TEXT_INACTIVE_TEXT122,3487
+    public final static int CONTROL SystemColor.CONTROL127,3614
+    public final static int CONTROL_TEXT SystemColor.CONTROL_TEXT132,3724
+    public final static int CONTROL_HIGHLIGHT 
SystemColor.CONTROL_HIGHLIGHT137,3844
+    public final static int CONTROL_LT_HIGHLIGHT 
SystemColor.CONTROL_LT_HIGHLIGHT142,3975
+    public final static int CONTROL_SHADOW SystemColor.CONTROL_SHADOW147,4100
+    public final static int CONTROL_DK_SHADOW 
SystemColor.CONTROL_DK_SHADOW152,4224
+    public final static int SCROLLBAR SystemColor.SCROLLBAR157,4352
+    public final static int INFO SystemColor.INFO162,4467
+    public final static int INFO_TEXT SystemColor.INFO_TEXT167,4571
+    public final static int NUM_COLORS SystemColor.NUM_COLORS172,4681
+    public final static SystemColor desktop SystemColor.desktop177,4790
+    public final static SystemColor activeCaption 
SystemColor.activeCaption182,4945
+    public final static SystemColor activeCaptionText 
SystemColor.activeCaptionText187,5107
+    public final static SystemColor activeCaptionBorder 
SystemColor.activeCaptionBorder192,5280
+    public final static SystemColor inactiveCaption 
SystemColor.inactiveCaption197,5470
+    public final static SystemColor inactiveCaptionText 
SystemColor.inactiveCaptionText202,5645
+    public final static SystemColor inactiveCaptionBorder 
SystemColor.inactiveCaptionBorder207,5830
+    public final static SystemColor window SystemColor.window212,5996
+    public final static SystemColor windowBorder 
SystemColor.windowBorder217,6126
+    public final static SystemColor windowText SystemColor.windowText222,6267
+    public final static SystemColor menu SystemColor.menu227,6408
+    public final static SystemColor menuText SystemColor.menuText232,6530
+    public final static SystemColor text SystemColor.text237,6677
+    public final static SystemColor textText SystemColor.textText242,6809
+    public final static SystemColor textHighlight 
SystemColor.textHighlight247,6957
+    public final static SystemColor textHighlightText 
SystemColor.textHighlightText252,7109
+    public final static SystemColor textInactiveText 
SystemColor.textInactiveText257,7267
+    public final static SystemColor control SystemColor.control262,7431
+    public final static SystemColor controlText 
SystemColor.controlText267,7569
+    public final static SystemColor controlHighlight 
SystemColor.controlHighlight272,7727
+    public final static SystemColor controlLtHighlight 
SystemColor.controlLtHighlight277,7897
+    public final static SystemColor controlShadow 
SystemColor.controlShadow282,8069
+    public final static SystemColor controlDkShadow 
SystemColor.controlDkShadow287,8227
+    public final static SystemColor scrollbar SystemColor.scrollbar292,8384
+    public final static SystemColor info SystemColor.info297,8532
+    public final static SystemColor infoText SystemColor.infoText302,8664
+    private static int[] systemColors SystemColor.systemColors308,8885
+    private static final long serialVersionUID 
SystemColor.serialVersionUID340,10406
+    private static void 
updateSystemColors(SystemColor.updateSystemColors349,10617
+    private SystemColor(SystemColor.SystemColor357,10885
+    public int getRGB(SystemColor.getRGB370,11245
+    public String toString(SystemColor.toString377,11388
+
+java-src/TG.java,2547
+class ThreadGroup 54,2104
+    ThreadGroup parent;ThreadGroup.parent55,2124
+    String name;ThreadGroup.name56,2148
+    int maxPriority;ThreadGroup.maxPriority57,2165
+    boolean destroyed;ThreadGroup.destroyed58,2186
+    boolean daemon;ThreadGroup.daemon59,2209
+    boolean vmAllowSuspension;ThreadGroup.vmAllowSuspension60,2229
+    int nthreads;ThreadGroup.nthreads62,2261
+    Thread threads[ThreadGroup.threads63,2279
+    int ngroups;ThreadGroup.ngroups65,2302
+    ThreadGroup groups[ThreadGroup.groups66,2319
+    private ThreadGroup(ThreadGroup.ThreadGroup72,2495
+    public ThreadGroup(ThreadGroup.ThreadGroup84,2848
+    public ThreadGroup(ThreadGroup.ThreadGroup105,3714
+    public final String getName(ThreadGroup.getName124,4189
+    public final ThreadGroup getParent(ThreadGroup.getParent135,4492
+    public final int getMaxPriority(ThreadGroup.getMaxPriority148,4867
+    public final boolean isDaemon(ThreadGroup.isDaemon161,5305
+    public synchronized boolean isDestroyed(ThreadGroup.isDestroyed170,5470
+    public final void setDaemon(ThreadGroup.setDaemon192,6368
+    public final void setMaxPriority(ThreadGroup.setMaxPriority213,7110
+    public final boolean parentOf(ThreadGroup.parentOf246,8106
+    public final void checkAccess(ThreadGroup.checkAccess268,8834
+    public int activeCount(ThreadGroup.activeCount283,9286
+    public int enumerate(ThreadGroup.enumerate322,10497
+    public int enumerate(ThreadGroup.enumerate344,11481
+    private int enumerate(ThreadGroup.enumerate348,11584
+    public int activeGroupCount(ThreadGroup.activeGroupCount389,12588
+    public int enumerate(ThreadGroup.enumerate425,13727
+    public int enumerate(ThreadGroup.enumerate445,14595
+    private int enumerate(ThreadGroup.enumerate449,14703
+    public final void stop(ThreadGroup.stop499,16212
+    public final void suspend(ThreadGroup.suspend537,17477
+    public final void resume(ThreadGroup.resume575,18749
+    public final void destroy(ThreadGroup.destroy607,19779
+    private final void add(ThreadGroup.add643,20704
+    private void remove(ThreadGroup.remove668,21402
+    void add(ThreadGroup.add697,22142
+    void remove(ThreadGroup.remove722,22808
+    public void list(ThreadGroup.list751,23503
+    void list(ThreadGroup.list754,23556
+    public void uncaughtException(ThreadGroup.uncaughtException810,25512
+    public boolean 
allowThreadSuspension(ThreadGroup.allowThreadSuspension823,25823
+    public String toString(ThreadGroup.toString837,26142
+
+lua-src/allegro.lua,400
+local function get_layer_by_name 7,175
+local function count_layers 33,621
+function GetLayerByName 54,980
+function GetUniqueLayerName 65,1204
+function SelectLayer 76,1415
+function NewLayer 86,1773
+function NewLayerSet 144,3226
+function RemoveLayer 170,3750
+function MoveLayerTop 211,4767
+function MoveLayerBottom 223,5079
+function MoveLayerBefore 236,5457
+function MoveLayerAfter 258,6090
+
+make-src/Makefile,1133
+LATEST=1,0
+NONSRCS=35,1578
+CPPFLAGS=49,2191
+LDFLAGS=50,2260
+FASTCFLAGS=55,2531
+FILTER=58,2642
+       @-$($72,3064
+       @-$($73,3113
+       @-$($74,3177
+       @-$($75,3223
+       @-$($76,3291
+       @-$($77,3383
+       @$(81,3466
+       @$(82,3514
+       @$(83,3577
+       @$(84,3622
+       @$(85,3689
+       @$(86,3780
+${CHECKOBJS}: CFLAGS=88,3806
+       @env CHECKEROPTS=92,3922
+       @$(98,4094
+       @$(106,4250
+       @$(110,4374
+       @$(114,4500
+       @for i in $(SRCS); do echo $$i;140,5315
+       $(160,6053
+       $(163,6114
+       $(166,6177
+       $(169,6228
+       $(172,6317
+       sdiff --suppress-common-lines --width=width186,6614
+       sdiff --suppress-common-lines --width=width189,6703
+       sdiff --suppress-common-lines --width=width192,6791
+       sdiff --suppress-common-lines --width=width195,6880
+       TEXTAGS=204,7122
+       TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* 
--regex=regex204,7122
+       ${RUN} etags12 --members -o $@ --regex=regex207,7239
+       ${RUN} ./ctags -o $@ --regex=regex213,7388
+       ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=regex216,7464
+       TEXTAGS=219,7583
+       TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ 
--regex=regex219,7583
+       ${RUN} ./extags -e --regex-c=c222,7710
+
+objc-src/Subprocess.h,98
+#define Subprocess 41,1217
+#define BUFFERSIZE 43,1267
address@hidden Subprocess:Subprocess45,1292
+
+objc-src/Subprocess.m,475
+#define        PTY_TEMPLATE 20,494
+#define        PTY_LENGTH 21,528
address@hidden Subprocess(Private)Subprocess(Private)32,737
+- childDidExit39,851
+- fdHandler:67,1589
+showError 98,2360
+fdHandler 112,2785
+getptys 119,2907
+- init:183,4815
+    andStdErr:init:withDelegate:andPtySupport:andStdErr:197,5147
+- send:(const char *)string withNewline:send:withNewline:300,7436
+- send:308,7599
+- terminateInput314,7689
+- terminate:321,7810
+- setDelegate:332,7961
+- delegate338,8031
+
+objc-src/PackInsp.h,109
+#define NUMSTATS       36,1101
+#define TYPESTOSTAT    37,1120
address@hidden PackageInspector:PackageInspector39,1172
+
+objc-src/PackInsp.m,1360
+static const char RCSid[RCSid30,1032
+#define VERSION        34,1116
+#   define DEBUG 37,1155
+#define LISTCONTENTS   39,1181
+#define OPENBUTTON     47,1352
+#define LISTCONTENTSBUTTON     48,1449
+#define LISTDESCRIPTIONBUTTON  49,1562
+#define STATE_UNINSTALLED      52,1687
+#define STATE_INSTALLED        53,1807
+#define STATE_COMPRESSD        54,1948
+#define SIZEFORMAT     57,2152
+#define KBYTES 58,2362
+#define MBYTES 59,2473
+#define LOCALIZE(61,2585
+#define LOCALIZE_ARCH(62,2668
++newnew67,2802
+-showInfo:showInfo:93,3417
+-revert:revert:107,3737
+-ok:ok:136,4297
+-loadload143,4424
+#define LOOKUP(156,4826
+#undef LOOKUP176,5694
+-loadKeyValuesFrom:(const char *)type 
inTable:loadKeyValuesFrom:inTable:186,5852
+-loadContentsOf:(const char *)type inTable:loadContentsOf:inTable:238,7079
+-loadImageloadImage257,7552
+#define STAT_EQ(275,7940
+-(BOOL)shouldLoad280,8116
+-toggleDescriptiontoggleDescription301,8626
+-(const char *)getPath:(char *)buf forType:getPath:forType:317,8899
+-setRevertButtonTitlesetRevertButtonTitle333,9320
+-(const char *)formatSize:(const char *)size inBuf:formatSize:inBuf:344,9525
+#define WORKING        368,10045
+-(void)getArchs370,10100
+-(void)addArchs:385,10520
+-subprocess:(Subprocess *)sender output:subprocess:output:428,11351
+-subprocessDone:subprocessDone:436,11484
+static void openInWorkspace(446,11634
+-open:open:464,12063
+
+objcpp-src/SimpleCalc.H,41
address@hidden SimpleCalc:SimpleCalc14,400
+
+objcpp-src/SimpleCalc.M,300
+- init52,1747
+- appendToDisplay:60,1933
+- registerAction:70,2210
+- decimalKey:77,2348
+- numberKeys:91,2661
+- equalsKey:112,3192
+- operationKeys:131,3680
+- clearKey:153,4301
+- clearAllKey:160,4410
+- appDidInit:168,4591
+- windowWillClose:178,4882
+- infoPanel:186,5132
+- helpPanel:198,5482
+
+pas-src/common.pas,1875
+procedure InitializeStringPackage;26,527
+function newtextstring;34,874
+procedure disposetextstring;52,1404
+function ConcatT;78,2066
+function AppendTextString;112,3238
+function CopyTextString;132,3947
+procedure CONVERT_CHARSTRING_TO_VALUE;151,4505
+procedure append_string;172,5166
+function To_Upper;186,5462
+function To_Lower;194,5617
+function EmptyNmStr(209,6213
+function chartonmstr;219,6436
+function LowerCaseNmStr;230,6682
+function concatenatenamestrings;242,7007
+procedure writenamestring;263,7517
+function IsControlChar;277,7928
+function namestringequal;283,8079
+function NameStringLess;302,8539
+function IsControlCharName(343,9710
+function SubString;358,10208
+function SkipChars;379,10791
+function RemoveUnderlineControl;397,11311
+procedure First100Chars;427,12162
+procedure SkipSpaces;462,13298
+function SkipBlanks;477,13782
+function stripname;505,14595
+function Locate;522,15039
+function NameHasChar;543,15581
+function integertonmstr;561,16134
+function NmStrToInteger;585,16901
+function AddNullToNmStr;600,17317
+function ValToNmStr;611,17585
+function ChangeFileType;625,18037
+function StripPath;647,18734
+function ReprOfChar;675,19343
+procedure ExtractCommentInfo;702,20749
+procedure INSERT_TREE_NODE;784,24053
+function GetNameList;920,27926
+procedure DisposeANameList(925,28010
+procedure DisposeNameList;938,28340
+function GetNewNameListNode;943,28409
+function insertname;972,29051
+procedure InitNameList;988,29471
+procedure InitNameStringPool;998,29767
+procedure NewNameString;1004,29867
+procedure ReleaseNameString;1022,30232
+procedure SDTrefStringToRec 1045,30741
+procedure SDTrefSkipSpaces;1059,31092
+function SDTrefIsEnd 1070,31323
+function SDTrefGetInteger 1082,31529
+procedure SDTrefRecToString 1303,37546
+function NmStrToErrStr;1497,42305
+function ErrStrToNmStr;1509,42557
+function GetTextRef;1529,43112
+
+php-src/lce_functions.php,2864
+  define("LCE_FUNCTIONS"LCE_FUNCTIONS4,38
+  define("LCE_UNKNOWN"LCE_UNKNOWN9,145
+  define("LCE_WS"LCE_WS11,194
+  define("LCE_COMMENT"LCE_COMMENT13,244
+  define("LCE_COMMENT_USER"LCE_COMMENT_USER15,303
+  define("LCE_COMMENT_TOOL"LCE_COMMENT_TOOL17,366
+  define("LCE_MSGID"LCE_MSGID19,430
+  define("LCE_MSGSTR"LCE_MSGSTR21,488
+  define("LCE_TEXT"LCE_TEXT23,541
+  define("STATE_ABORT"STATE_ABORT25,567
+  define("STATE_OK"STATE_OK26,595
+  define("STATE_LOOP"STATE_LOOP27,620
+  class POEntryAD 29,648
+      function validate(31,683
+      function checkQuotation(59,1384
+  class CommentAD 70,1639
+      var $prefix;72,1674
+      function CommentAD(73,1693
+      function validate(83,1944
+  class POEntry 105,2410
+      var $msgid;107,2454
+      var $msgstr;108,2472
+      var $user_comment;109,2491
+      var $sys_comment;110,2516
+      var $unk_comment;111,2540
+      var $msgid_lc 113,2565
+      var $msgstr_lc 114,2590
+      var $user_comment_lc 115,2616
+      var $sys_comment_lc 116,2648
+      var $unk_comment_lc 117,2679
+      function POEntry(119,2711
+      function lineCount(135,3255
+      function serializeToVars(141,3365
+      function write(151,3800
+  class POReader 163,4178
+      var $msgid;165,4223
+      var $msgstr;166,4241
+      var $user_comment;167,4260
+      var $sys_comment;168,4285
+      var $unk_comment;169,4309
+      var $state;170,4333
+      var $ignore_ws;171,4351
+      var $po_entries;172,4373
+      var $poe_num;173,4396
+      var $filename;174,4416
+      var $domain;175,4437
+      function gettext(177,4457
+      function parseFromVars(189,4705
+      function serializeToVars(215,5331
+      function POReader(229,5613
+      function read(243,5983
+      function write(259,6307
+      function isComment(277,6645
+      function comment(284,6822
+      function msgid(304,7247
+      function msgstr(320,7574
+      function start(340,8232
+      function createPOEntries(360,8644
+      function stripLine(394,9472
+      function printClassification(421,10056
+      function classifyLine(432,10301
+  function getTextDomains(471,11094
+  class PORManager 498,11756
+      var      $por_a;500,11803
+      function PORManager(502,11822
+      function addPOReader(507,11896
+      function &getPOReader(getPOReader512,11992
+      function getDomainNames(517,12081
+  function &loadPORManager(loadPORManager523,12174
+  function fileJoin(536,12436
+      function lce_bindtextdomain(557,12839
+      function lce_textdomain(614,14530
+      function lce_gettext(620,14641
+      function lce_dgettext(626,14767
+      function lce(634,14966
+      function lce_bindtextdomain(651,15488
+      function lce_textdomain(656,15592
+      function lce_gettext(661,15674
+      function lce_dgettext(666,15755
+      function lce(670,15855
+  function lce_geteditcode(676,15898
+
+php-src/ptest.php,135
+define("TEST"TEST1,0
+test 4,26
+       var $member;8,71
+       var $memassign=9,85
+       var $memassign_space 10,110
+       var $test12,176
+foo(16,200
+
+perl-src/htlmify-cystic,1443
+my @section_name;section_name12,236
+my @appendix_name;appendix_name13,254
+my @section_toc;section_toc15,274
+my @appendix_toc;appendix_toc16,291
+my $new_tag new_tag18,310
+my $appendix;appendix24,409
+my $section;section25,423
+my $subsection;subsection26,436
+my $subsubsection;subsubsection27,452
+my $this_file_toc this_file_toc29,472
+my %file_tocs;file_tocs30,496
+my @output_files output_files32,512
+my $file_index file_index33,535
+my $output_file;output_file35,556
+my $line;line37,574
+my $subsection_marker;subsection_marker161,3883
+my $new;new163,3907
+sub read_toc main::read_toc165,3917
+         my $entry entry218,5621
+         my $entry entry234,6077
+             my $entry entry245,6351
+         my $entry entry252,6536
+         my $entry entry268,7010
+             my $entry entry276,7204
+         my $entry entry281,7328
+      my $entry entry296,7698
+sub finish_subsubsections main::finish_subsubsections302,7805
+sub finish_subsections main::finish_subsections309,7987
+sub finish_sections main::finish_sections320,8310
+sub finish_appendices main::finish_appendices331,8599
+sub section_url_base main::section_url_base337,8724
+sub section_url_name main::section_url_name342,8922
+sub section_url main::section_url355,9284
+  my $name name357,9336
+sub section_href main::section_href364,9452
+sub section_name main::section_name368,9551
+sub toc_line main::toc_line372,9655
+sub file_end main::file_end375,9750
+
+perl-src/yagrip.pl,258
+sub getopt main::getopt7,156
+       local($_,$flag,$opt,$f,$r,@temp)($_,$flag,$opt,$f,$r,@temp8,169
+sub usage main::usage38,856
+       local($prog,$_,@list)($prog,$_,@list39,868
+       
local($string,$flag,@string,@temp,@last)($string,$flag,@string,@temp,@last40,897
+
+perl-src/kai-test.pl,244
+sub f1 main::f12,16
+sub main::f2 6,50
+package Foo;10,90
+sub f3 Foo::f312,104
+sub Bar::f4 16,138
+package Bar;20,177
+sub f5 Bar::f522,191
+package Foo::Bar;26,225
+sub f6 Foo::Bar::f628,244
+package main;32,278
+sub f7 main::f734,293
+
+perl-src/mirror.pl,13410
+sub msg_versionmain::msg_version459,18271
+       local( $arg )( $arg 468,18582
+               local( $flag, $p )( $flag, $p 480,18757
+               local( $site_path )( $site_path 525,19687
+                       local( $site, $path )( $site, $path 539,19958
+               local( $key_val )( $key_val 578,20743
+               local( $user )( $user 595,21097
+               local( $c )( $c 634,21853
+                       local( $sec,$min,$hour,$mday,$mon,$year,( 
$sec,$min,$hour,$mday,$mon,$year,678,22807
+       local( $c )( $c 706,23393
+       local( $dir, $mp )( $dir, $mp 723,23695
+               local( $f )( $f 725,23740
+sub interpret_config_filesmain::interpret_config_files756,24304
+       local( $fname )( $fname 758,24333
+sub interpret_configmain::interpret_config785,24927
+sub parse_linemain::parse_line827,25710
+       local( $eqpl )( $eqpl 829,25727
+       local( $cont )( $cont 830,25744
+                       local( $v )( $v 839,26029
+sub set_defaultsmain::set_defaults860,26448
+sub command_line_overridemain::command_line_override868,26579
+       local( $key, $val, $overrides )( $key, $val, $overrides 870,26607
+sub set_variablesmain::set_variables894,27072
+       local( $key, $val )( $key, $val 896,27092
+                       local( $val_name )( $val_name 902,27259
+               local( $val )( $val 953,28825
+sub upd_valmain::upd_val962,28974
+       local( $key )( $key 964,28988
+sub pr_variablesmain::pr_variables970,29083
+       local( $msg )( $msg 972,29102
+       local( $nle )( $nle 973,29123
+       local( $out )( $out 974,29144
+       local( $key, $val, $str )( $key, $val, $str 975,29164
+sub do_mirrormain::do_mirror1007,29923
+       local( $get_one_package )( $get_one_package 1009,29939
+       local( $exit_status )( $exit_status 1030,30384
+                       local( @t )( @t 1154,33165
+       local( $con )( $con 1241,35499
+               local( @rhelp )( @rhelp 1289,36702
+       local( @sub_dirs )( @sub_dirs 1329,37778
+       local( $now )( $now 1493,41348
+               local( $arg )( $arg 1506,41774
+sub disconnectmain::disconnect1528,42250
+sub connectmain::connect1546,42576
+       local( $attempts )( $attempts 1548,42590
+       local( $res )( $res 1549,42642
+sub prodmain::prod1573,43156
+sub checkout_regexpsmain::checkout_regexps1585,43327
+       local( $ret )( $ret 1587,43350
+       local( $t )( $t 1589,43395
+               local( $val )( $val 1597,43701
+                       local( $err )( $err 1601,43786
+sub clear_localmain::clear_local1610,43909
+sub clear_remotemain::clear_remote1625,44172
+sub get_local_directory_detailsmain::get_local_directory_details1640,44445
+       local( @dirs, $dir )( @dirs, $dir 1642,44479
+       local( $last_prodded )( $last_prodded 1643,44502
+       local( $dir_level )( $dir_level 1691,45615
+       local( $i )( $i 1692,45641
+       local( $path, $time, $size, $type, $mode, $name, $isdir, $value, 
$follow )( $path, $time, $size, $type, $mode, $name, $isdir, $value, $follow 
1693,45659
+       local( $dev,$ino,$fmode,$nlink,$uid,$gid,$rdev,$ssize,( 
$dev,$ino,$fmode,$nlink,$uid,$gid,$rdev,$ssize,1694,45736
+                       local( $mapi )( $mapi 1763,47586
+sub get_remote_directory_detailsmain::get_remote_directory_details1789,48122
+       local( $type_changed )( $type_changed 1791,48157
+       local( $udirtmp )( $udirtmp 1792,48186
+       local( $storename )( $storename 1793,48206
+       local( $rls )( $rls 1825,48944
+               local( $dirtmp )( $dirtmp 1830,49002
+               local( $unsquish )( $unsquish 1832,49130
+                       local( $f )( $f 1840,49360
+               local( $dirtmp )( $dirtmp 1859,49866
+               local( $unsquish )( $unsquish 1870,50215
+                       local( $f, $uf )( $f, $uf 1878,50445
+               local( $flags )( $flags 1912,51259
+       local( $parse_state )( $parse_state 1946,52111
+                       local( $msg )( $msg 1963,52486
+sub patch_ls_lR_filemain::patch_ls_lR_file1984,52955
+       local( $f, $fr, $flb, $flt, $flp, $flz, $frb, $frt )( $f, $fr, $flb, 
$flt, $flp, $flz, $frb, $frt 1990,53055
+       local( $to , $tn )( $to , $tn 1991,53110
+       local( $tlb )( $tlb 1995,53225
+               local( $p, $s, $trz, $t, $m )( $p, $s, $trz, $t, $m 2030,54182
+               local( $tlz )( $tlz 2037,54467
+sub parse_timeoutmain::parse_timeout2089,55670
+sub parse_remote_detailsmain::parse_remote_details2095,55754
+       local( $ret )( $ret 2097,55781
+       local( $old_sig )( $old_sig 2098,55797
+sub parse_remote_details_realmain::parse_remote_details_real2125,56234
+       local( $path, $size, $time, $type, $mode, $rdir, $rcwd )( $path, 
$size, $time, $type, $mode, $rdir, $rcwd 2127,56266
+       local( @dir_list )( @dir_list 2128,56325
+       local( $i )( $i 2129,56346
+       local( $old_path )( $old_path 2130,56364
+                               local( $old_path )( $old_path 2143,56630
+                               local( $ri )( $ri 2203,58078
+                       local( $mapi )( $mapi 2214,58335
+                       local( $done )( $done 2239,58911
+sub compare_dirsmain::compare_dirs2283,59825
+       local( *src_paths,( *src_paths,2286,59915
+       local( $src_path, $dest_path, $i )( $src_path, $dest_path, $i 
2293,60099
+       local( $last_prodded )( $last_prodded 2294,60136
+       local( $desti, $srci, $compress, $srciZ, $srcigz, $split, 
$dest_path_real )( $desti, $srci, $compress, $srciZ, $srcigz, $split, 
$dest_path_real 2299,60350
+       local( $old_dest_path, $existing_path, $tmp, $restart )( 
$old_dest_path, $existing_path, $tmp, $restart 2300,60428
+       local( $sp, $dp )( $sp, $dp 2301,60486
+                  local( $real, $reali, $reali1 )( $real, $reali, $reali1 
2352,62034
+                  local( $count )( $count 2353,62072
+                       local( $value )( $value 2408,63996
+                       local( $real )( $real 2409,64028
+                       local( $reali )( $reali 2410,64086
+                               local( $old )( $old 2421,64571
+                       local( $old_dest_path )( $old_dest_path 2432,64842
+                               local( $dpp, $dps )( $dpp, $dps 2509,67031
+               local( $update )( $update 2534,67671
+sub map_namemain::map_name2651,71028
+       local( $name )( $name 2653,71043
+               local( $old_name )( $old_name 2656,71089
+               local( $tmp )( $tmp 2666,71252
+sub set_timestampsmain::set_timestamps2675,71362
+       local( $src_path )( $src_path 2677,71383
+       local( $dest_path, $dest_loc_mapi, $src_rem_mapi,  $rtime )( 
$dest_path, $dest_loc_mapi, $src_rem_mapi,  $rtime 2685,71517
+sub set_timestampmain::set_timestamp2699,71901
+       local( $path, $time )( $path, $time 2701,71921
+       local( $pr_time )( $pr_time 2703,71953
+sub make_dirsmain::make_dirs2719,72284
+       local( $thing )( $thing 2721,72300
+sub make_symlinksmain::make_symlinks2736,72489
+       local( $thing )( $thing 2738,72509
+               local( $dest, $existing )( $dest, $existing 2745,72623
+               local( $dirpart )( $dirpart 2746,72663
+               local( $ft )( $ft 2747,72704
+               local( $p )( $p 2762,73261
+                       local( $f )( $f 2770,73467
+                       local( $dl )( $dl 2788,74038
+sub do_all_transfersmain::do_all_transfers2806,74439
+       local( $src_path )( $src_path 2808,74462
+       local( $dest_path, $attribs )( $dest_path, $attribs 2809,74483
+       local( $srci )( $srci 2810,74515
+               local( $newpath )( $newpath 2838,75124
+sub transfer_filemain::transfer_file2869,75847
+       local( $src_path, $dest_path, $attribs, $timestamp )( $src_path, 
$dest_path, $attribs, $timestamp 2871,75867
+       local( $dir, $file, $temp, $compress, $split, $restart, $mesg, 
$got_mesg )( $dir, $file, $temp, $compress, $split, $restart, $mesg, $got_mesg 
2872,75927
+               local( $src_file )( $src_file 2915,76782
+               local( $comptemp )( $comptemp 2916,76816
+                       local( $f )( $f 2921,76964
+               local($filesize)($filesize2944,77569
+                       local( $ti )( $ti 2975,78401
+               local( $f )( $f 2997,78887
+               local( $comp )( $comp 2998,78912
+       local( $filesize )( $filesize 3015,79427
+       local( $sizemsg )( $sizemsg 3016,79469
+       local( $srcsize )( $srcsize 3017,79501
+               local( $time )( $time 3029,79865
+       local( $as )( $as 3046,80223
+       local( $locali )( $locali 3054,80499
+sub filename_to_tempnamemain::filename_to_tempname3062,80713
+       local( $dir, $file )( $dir, $file 3064,80740
+       local ( $dest_path )( $dest_path 3066,80769
+sub log_uploadmain::log_upload3090,81228
+       local( $src_path, $dest_path, $got_mesg, $size )( $src_path, 
$dest_path, $got_mesg, $size 3092,81245
+sub do_deletesmain::do_deletes3118,81773
+       local( *src_paths,( *src_paths,3121,81861
+       local( $files_to_go, $dirs_to_go )( $files_to_go, $dirs_to_go 
3125,81960
+       local( $src_path, $i )( $src_path, $i 3131,82055
+       local( $orig_do_deletes )( $orig_do_deletes 3132,82080
+       local( $orig_save_deletes )( $orig_save_deletes 3133,82122
+       local( $del_patt )( $del_patt 3135,82169
+               local( $per )( $per 3162,82843
+               local( $per )( $per 3184,83513
+                       local( $save_dir_tail )( $save_dir_tail 3226,84617
+sub save_deletemain::save_delete3245,85019
+       local( $save, $kind )( $save, $kind 3247,85037
+       local( $real_save_dir, $save_dest )( $real_save_dir, $save_dest 
3249,85067
+       local( $dirname )( $dirname 3284,85704
+sub save_mkdirmain::save_mkdir3304,86155
+       local( $dir )( $dir 3306,86172
+sub do_deletemain::do_delete3320,86459
+       local( $del, $kind )( $del, $kind 3322,86475
+sub filesizemain::filesize3377,87532
+       local( $fname )( $fname 3379,87547
+sub istruemain::istrue3390,87654
+       local( $val )( $val 3392,87667
+sub mksymlinkmain::mksymlink3398,87773
+       local( $dest_path, $existing_path )( $dest_path, $existing_path 
3400,87789
+               local( $msg )( $msg 3417,88246
+               local( $msg )( $msg 3431,88590
+               local( $status )( $status 3442,88816
+sub mkdirsmain::mkdirs3457,89196
+       local( $dir )( $dir 3459,89209
+       local( @dir, $d, $path )( @dir, $d, $path 3460,89230
+sub make_dirmain::make_dir3497,90042
+       local( $dir, $mode )( $dir, $mode 3499,90057
+       local( $val )( $val 3500,90085
+sub dir_existsmain::dir_exists3528,90573
+       local( $dir )( $dir 3530,90590
+       local( $val )( $val 3531,90611
+               local($old_dir)($old_dir3539,90750
+sub set_attribsmain::set_attribs3553,91053
+       local( $path, $src_path, $type )( $path, $src_path, $type 3555,91071
+       local( $mode )( $mode 3556,91111
+               local( $pathi )( $pathi 3564,91229
+               local( $pathi )( $pathi 3568,91320
+sub get_passwdmain::get_passwd3606,91977
+       local( $user )( $user 3608,91994
+       local( $pass )( $pass 3609,92016
+       local( $| )( $| 3610,92033
+sub compare_timesmain::compare_times3631,92384
+       local( $t1, $t2 )( $t1, $t2 3637,92564
+       local( $diff )( $diff 3638,92589
+sub create_assocsmain::create_assocs3643,92688
+       local( $map )( $map 3645,92708
+sub delete_assocsmain::delete_assocs3657,92957
+       local( $map )( $map 3659,92977
+sub unlink_dbmmain::unlink_dbm3671,93247
+       local( $file )( $file 3673,93264
+sub bsplitmain::bsplit3681,93462
+       local( $temp, $dest_path, $time )( $temp, $dest_path, $time 3683,93475
+       local( $dest_dir )( $dest_dir 3684,93516
+       local( $bufsiz )( $bufsiz 3685,93558
+       local( $buffer, $in, $sofar )( $buffer, $in, $sofar 3686,93583
+       local( $d )( $d 3691,93721
+       local( $index )( $index 3697,93840
+       local( $part )( $part 3698,93865
+                       local( $locali )( $locali 3714,94336
+       local( $readme )( $readme 3730,94740
+sub sysmain::sys3739,95116
+       local( $com )( $com 3741,95126
+sub set_assoc_from_arraymain::set_assoc_from_array3751,95355
+       local( *things )( *things 3754,95453
+sub find_progmain::find_prog3760,95537
+       local( $prog )( $prog 3762,95553
+       local( $path )( $path 3763,95575
+               local( $path )( $path 3766,95657
+sub real_dir_from_pathmain::real_dir_from_path3780,95842
+       local( $program )( $program 3782,95867
+       local( @prog_path )( @prog_path 3783,95892
+       local( $dir )( $dir 3784,95970
+sub msgmain::msg3807,96489
+       local( $todo, $msg )( $todo, $msg 3809,96499
+sub to_bytesmain::to_bytes3838,96979
+       local( $size )( $size 3840,96994
+sub unix2vmsmain::unix2vms3858,97332
+       local( $v, $kind )( $v, $kind 3860,97347
+                       local( $dir, $rest )( $dir, $rest 3873,97559
+sub dirpartmain::dirpart3886,97730
+       local( $path )( $path 3888,97744
+sub expand_symlinkmain::expand_symlink3902,98076
+       local( $orig_path, $points_to )( $orig_path, $points_to 3904,98097
+       local( $dirpart )( $dirpart 3905,98136
+sub flatten_pathmain::flatten_path3913,98365
+       local( $path )( $path 3915,98384
+       local( $changed )( $changed 3916,98406
+       local( $i )( $i 3917,98430
+       local( $rooted )( $rooted 3919,98446
+       local( $count )( $count 3920,98482
+       local( $orig_path )( $orig_path 3921,98504
+               local( $in )( $in 3932,98741
+               local( @parts )( @parts 3933,98765
+sub fix_packagemain::fix_package3963,99438
+       local( $package )( $package 3965,99456
+sub will_compressmain::will_compress3970,99529
+sub will_splitmain::will_split3981,99859
+sub myflockmain::myflock3989,100001
+       local( $file, $kind )( $file, $kind 3991,100015
+sub t2strmain::t2str4004,100221
+       local( @t )( @t 4006,100233
+       
local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst4013,100335
+sub handlermain::handler4022,100583
+        local( $sig )( $sig 4029,100651
+        local( $msg )( $msg 4030,100679
+        local( $package, $filename, $line )( $package, $filename, $line 
4031,100737
+sub trap_signalsmain::trap_signals4036,100859
+       local( $sig )( $sig 4038,100878
+sub map_user_groupmain::map_user_group4047,101158
+sub keepmain::keep4069,101537
+       local( $pathi, $path, *keep, *keep_totals, *keep_map, $kind )( $pathi, 
$path, *keep, *keep_totals, *keep_map, $kind 4071,101548
+sub alarmmain::alarm4104,102330
+       local( $time_to_sig )( $time_to_sig 4106,102342
+sub chownmain::chown4110,102405
+       local( $uid, $gid, $path )( $uid, $gid, $path 4112,102417
+sub utimemain::utime4116,102494
+       local( $atime, $mtime, $path )( $atime, $mtime, $path 4118,102506
+       local( $old_mode )( $old_mode 4124,102685
+       local( $tmp_mode )( $tmp_mode 4125,102730
+       local( $ret )( $ret 4126,102763
+sub cwdmain::cwd4135,102913
+       local( $lcwd )( $lcwd 4137,102923
+
+ps-src/rfc1245.ps,2478
+/FMversion 12,311
+/FrameDict 17,500
+/FMVERSION 47,1307
+/FMLOCAL 56,1494
+/FMDOCUMENT 73,1766
+/FMBEGINPAGE 95,2279
+/FMENDPAGE 109,2516
+/FMDEFINEFONT 115,2582
+/FMNORMALIZEGRAPHICS 126,2725
+/FMBEGINEPSF 142,2955
+/FMENDEPSF 153,3207
+/setmanualfeed 158,3283
+/max 163,3386
+/min 164,3426
+/inch 165,3466
+/pagedimen 166,3485
+/setpapername 172,3629
+/papersize 190,4214
+/manualpapersize 211,4789
+/desperatepapersize 230,5211
+/savematrix 239,5370
+/restorematrix 242,5425
+/dmatrix 245,5475
+/dpi 246,5495
+/freq 248,5583
+/sangle 249,5658
+/DiacriticEncoding 250,5717
+/.notdef 251,5738
+/.notdef 252,5801
+/.notdef 253,5864
+/.notdef 254,5927
+/.notdef 255,5990
+/numbersign 256,6051
+/parenright 257,6115
+/two 258,6184
+/less 259,6251
+/L 260,6320
+/bracketright 261,6389
+/i 262,6459
+/braceright 263,6529
+/Ntilde 264,6598
+/atilde 265,6668
+/iacute 266,6733
+/ocircumflex 267,6797
+/udieresis 268,6858
+/paragraph 269,6919
+/dieresis 270,6983
+/yen 271,7050
+/ordfeminine 272,7109
+/exclamdown 273,7171
+/guillemotleft 274,7230
+/Otilde 275,7296
+/quoteleft 276,7357
+/fraction 277,7420
+/periodcentered 278,7490
+/Acircumflex 279,7549
+/Icircumflex 280,7610
+/Uacute 281,7680
+/breve 282,7746
+/ReEncode 284,7814
+/graymode 300,8020
+/setpattern 310,8184
+/grayness 331,8725
+/normalize 394,9873
+/dnormalize 397,9942
+/lnormalize 400,10014
+/H 403,10104
+/Z 406,10147
+/X 409,10176
+/V 412,10219
+/N 415,10260
+/M 418,10286
+/E 419,10315
+/D 420,10336
+/O 421,10358
+/L 423,10394
+/Y 430,10489
+/R 439,10588
+/RR 450,10696
+/C 467,10959
+/U 473,11004
+/F 477,11039
+/T 481,11084
+/RF 484,11115
+/TF 488,11164
+/P 495,11219
+/PF 499,11270
+/S 506,11344
+/SF 510,11384
+/B 517,11446
+/BF 521,11505
+/W 538,11714
+/G 573,12382
+/A 582,12525
+/BEGINPRINTCODE 606,12918
+/ENDPRINTCODE 615,13131
+/gn 620,13259
+/cfs 631,13384
+/ic 636,13473
+/ms 658,14285
+/ip 668,14395
+/wh 678,14492
+/bl 684,14607
+/s1 690,14722
+/fl 691,14739
+/hx 698,14887
+/wbytes 709,15055
+/BEGINBITMAPBWc 713,15147
+/BEGINBITMAPGRAYc 716,15198
+/BEGINBITMAP2BITc 719,15251
+/COMMONBITMAPc 722,15304
+/BEGINBITMAPBW 739,15660
+/BEGINBITMAPGRAY 742,15709
+/BEGINBITMAP2BIT 745,15760
+/COMMONBITMAP 748,15811
+/Fmcc 765,16156
+/ngrayt 773,16371
+/nredt 774,16393
+/nbluet 775,16414
+/ngreent 776,16436
+/colorsetup 787,16603
+/fakecolorsetup 814,17370
+/BITMAPCOLOR 826,17636
+/BITMAPCOLORc 839,17926
+/BITMAPGRAY 855,18275
+/BITMAPGRAYc 858,18335
+/ENDBITMAP 861,18397
+/fillprocs 868,18497
+
+prol-src/ordsets.prolog,525
+is_ordset(47,1310
+list_to_ord_set(63,1688
+ord_add_element(71,1867
+ord_del_element(85,2344
+ord_disjoint(100,2783
+ord_intersect(108,2953
+ord_intersection(126,3552
+ord_intersection3(130,3691
+ord_intersection(150,4531
+ord_intersection4(154,4703
+ord_intersection(176,5664
+ord_intersection2(181,5812
+ord_member(200,6318
+ord_seteq(216,6683
+ord_setproduct(225,6971
+ord_subset(240,7377
+ord_subtract(257,7861
+ord_symdiff(265,8054
+ord_union(288,8887
+ord_union4(303,9352
+ord_union(324,10171
+ord_union_all(329,10313
+
+prol-src/natded.prolog,2319
+expandmng(100,2879
+normalize(116,3359
+fresh_vars(125,3716
+subst(138,4134
+normalize_fresh(159,4660
+reduce_subterm(171,5112
+reduce(185,5559
+free_var(196,5903
+free_for(209,6246
+compile_lex(231,6875
+consult_lex:-consult_lex248,7384
+lex(259,7754
+expandsyn(267,8068
+bas_syn(292,8897
+compile_empty:-compile_empty310,9376
+complete(328,10055
+add_active(340,10527
+parse(353,10949
+derived_analyses(364,11341
+build(378,11965
+buildact(392,12521
+mapsyn(412,13542
+add_edge(434,14278
+findcats(447,14758
+normalize_tree(465,15478
+normalize_trees(475,15856
+expandmng_tree(486,16248
+expandmng_trees(496,16614
+cat(511,17013
+subtree(644,21266
+hypothetical_mem(653,21565
+make_coor(667,22130
+start_up:-start_up688,23013
+tokenizeatom(710,23921
+tokenize(720,24348
+isoperator(752,25377
+isoptab(756,25431
+specialsymbol(765,25756
+sstab(771,25861
+parse_cgi(787,26347
+keyvalseq(792,26510
+andkeyvalseq(796,26609
+keyval(799,26688
+valseq(807,26920
+plusvalseq(810,27007
+val(816,27109
+argvals(824,27426
+commaargvals(828,27503
+atomval(833,27578
+atom(836,27640
+action(846,28004
+keyvalcgi(864,28649
+keyvalscgi(865,28670
+outsyn(868,28726
+act(876,29060
+actout(901,29906
+texttreelist(912,30089
+htmltreelist(918,30190
+fitchtreelist(924,30304
+pp_html_table_tree(938,30759
+pp_html_tree(949,31113
+pp_html_trees(988,32381
+pp_html_table_fitch_tree(999,32769
+pp_html_fitch_tree(1017,33672
+removeexp(1129,39002
+splitexp(1142,39490
+pp_exp(1155,39990
+map_word(1168,40249
+pp_exps(1180,40474
+pp_tree(1188,40777
+pp_trees(1216,41807
+pp_word_list(1225,42128
+pp_word(1231,42262
+pp_word_list_rest(1238,42569
+pp_cat(1248,42929
+pp_syn(1255,43196
+pp_syn_paren(1276,43899
+pp_paren(1293,44377
+pp_syn_back(1300,44661
+pp_bas_cat(1311,45001
+writecat(1322,45409
+writesubs(1351,46455
+writesups(1361,46757
+writelistsubs(1371,47090
+pp_lam(1380,47408
+pp_lam_bracket(1398,48022
+pp_lam_paren(1407,48338
+pp_rule(1429,49238
+member(1447,49866
+append_list(1451,49919
+append(1456,50010
+at_least_one_member(1460,50076
+numbervars(1464,50171
+reverse(1467,50209
+select(1471,50290
+select_last(1475,50357
+cat_atoms(1479,50436
+writelist(1485,50524
+write_lex_cat(1492,50676
+writebreaklex(1500,50988
+write_lex(1513,51265
+writebreak(1521,51541
+tt:-tt1531,51713
+mt:-mt1534,51784
+cmt:-cmt1537,51878
+
+pyt-src/server.py,1438
+class Controls:Controls17,358
+    def __init__(18,374
+    def __repr__(24,590
+    def __str__(34,871
+class Server:Server37,934
+    def __init__(38,948
+    def dump(73,2198
+    def __repr__(125,3896
+    def __str__(128,3945
+class User:User131,4014
+    def __init__(132,4026
+    def __repr__(172,5445
+    def __str__(206,6883
+def flag2str(223,7212
+class LabeledEntry(232,7442
+    def bind(234,7525
+    def focus_set(236,7584
+    def __init__(238,7629
+def ButtonBar(245,7909
+def helpwin(255,8280
+class ListEdit(267,8707
+    def __init__(269,8808
+    def handleList(303,10042
+    def handleNew(306,10094
+    def editItem(314,10426
+    def deleteItem(320,10596
+def ConfirmQuit(326,10760
+class ControlEdit(375,12377
+    def PostControls(376,12403
+    def GatherControls(421,13530
+class ServerEdit(512,16264
+    def __init__(513,16289
+    def post(525,16629
+    def gather(543,17191
+    def nosave(547,17304
+    def save(551,17408
+    def refreshPort(556,17509
+    def createWidgets(561,17663
+    def edituser(631,20708
+class UserEdit(645,20921
+    def __init__(646,20944
+    def post(658,21283
+    def gather(676,21841
+    def nosave(680,21950
+    def save(684,22052
+    def createWidgets(689,22151
+class Configure(760,24879
+    def __init__(761,24916
+    def MakeDispose(772,25211
+    def MakeSitelist(786,25706
+    def editsite(794,25949
+    def save(797,26022
+    def nosave(807,26310
+
+tex-src/testenv.tex,52
+\newcommand{\nm}\nm4,77
+\section{blah}blah8,139
+
+tex-src/gzip.texi,303
address@hidden Top,62,2139
address@hidden Copying,80,2652
address@hidden Overview,83,2705
address@hidden Sample,166,7272
address@hidden Invoking gzip,Invoking gzip210,8828
address@hidden Advanced usage,Advanced usage357,13495
address@hidden Environment,420,15207
address@hidden Tapes,437,15768
address@hidden Problems,460,16767
address@hidden Concept Index,Concept Index473,17287
+
+tex-src/texinfo.tex,30626
+\def\texinfoversion{\texinfoversion25,1019
+\def\tie{\tie48,1510
+\def\gloggingall{\gloggingall71,2260
+\def\loggingall{\loggingall72,2329
+\def\onepageout#1{\onepageout98,3266
+\def\croppageout#1{\croppageout114,4016
+\def\cropmarks{\cropmarks141,5076
+\def\pagebody#1{\pagebody143,5123
+\def\ewtop{\ewtop156,5578
+\def\nstop{\nstop157,5642
+\def\ewbot{\ewbot159,5725
+\def\nsbot{\nsbot160,5789
+\def\parsearg #1{\parsearg169,6088
+\def\parseargx{\parseargx171,6166
+\def\parseargline{\parseargline181,6406
+\def\flushcr{\flushcr185,6527
+\newif\ifENV \ENVfalse \def\inENV{\inENV189,6726
+\def\ENVcheck{\ENVcheck190,6790
+\outer\def\begin{\begin197,7037
+\def\beginxxx #1{\beginxxx199,7075
+\def\end{\end207,7330
+\def\endxxx #1{\endxxx209,7358
+\def\errorE#1{\errorE215,7547
+\def\singlespace{\singlespace221,7741
address@hidden@231,7964
+\def\`{\`235,8064
+\def\'{\'236,8076
+\def\mylbrace {\mylbrace240,8124
+\def\myrbrace {\myrbrace241,8157
+\def\:{\:246,8271
+\def\*{\*249,8325
+\def\.{\.252,8401
+\def\w#1{\w257,8632
+\def\group{\group267,9115
+  \def\Egroup{\Egroup272,9279
+\def\need{\need288,9721
+\def\needx#1{\needx299,9998
+\def\dots{\dots338,11384
+\def\page{\page342,11448
+\def\exdent{\exdent352,11775
+\def\exdentyyy #1{\exdentyyy353,11808
+\def\nofillexdent{\nofillexdent356,11952
+\def\nofillexdentyyy #1{\nofillexdentyyy357,11997
+\def\include{\include364,12181
+\def\includezzz #1{\includezzz365,12216
+\def\thisfile{\thisfile368,12267
+\def\center{\center372,12330
+\def\centerzzz #1{\centerzzz373,12363
+\def\sp{\sp379,12505
+\def\spxxx #1{\spxxx380,12530
+\def\comment{\comment386,12704
+\def\commentxxx #1{\commentxxx389,12801
+\def\ignoresections{\ignoresections395,12970
+\let\chapter=\relax=\relax396,12992
+\let\section=\relax=\relax405,13237
+\let\subsection=\relax=\relax408,13298
+\let\subsubsection=\relax=\relax409,13321
+\let\appendix=\relax=\relax410,13347
+\let\appendixsec=\relaxsec=\relax411,13368
+\let\appendixsection=\relaxsection=\relax412,13392
+\let\appendixsubsec=\relaxsubsec=\relax413,13420
+\let\appendixsubsection=\relaxsubsection=\relax414,13447
+\let\appendixsubsubsec=\relaxsubsubsec=\relax415,13478
+\let\appendixsubsubsection=\relaxsubsubsection=\relax416,13508
+\def\ignore{\ignore422,13610
+\long\def\ignorexxx #1\end ignore{\ignorexxx426,13750
+\def\direntry{\direntry428,13809
+\long\def\direntryxxx #1\end direntry{\direntryxxx429,13848
+\def\ifset{\ifset433,13958
+\def\ifsetxxx #1{\ifsetxxx435,14016
+\def\Eifset{\Eifset439,14143
+\def\ifsetfail{\ifsetfail440,14157
+\long\def\ifsetfailxxx #1\end ifset{\ifsetfailxxx441,14213
+\def\ifclear{\ifclear443,14274
+\def\ifclearxxx #1{\ifclearxxx445,14336
+\def\Eifclear{\Eifclear449,14467
+\def\ifclearfail{\ifclearfail450,14483
+\long\def\ifclearfailxxx #1\end ifclear{\ifclearfailxxx451,14543
+\def\set{\set455,14694
+\def\setxxx #1{\setxxx456,14721
+\def\clear{\clear459,14783
+\def\clearxxx #1{\clearxxx460,14814
+\def\iftex{\iftex465,14931
+\def\Eiftex{\Eiftex466,14944
+\def\ifinfo{\ifinfo467,14958
+\long\def\ifinfoxxx #1\end ifinfo{\ifinfoxxx468,15008
+\long\def\menu #1\end menu{\menu470,15067
+\def\asis#1{\asis471,15096
+\def\math#1{\math484,15639
+\def\node{\node486,15683
+\def\nodezzz#1{\nodezzz487,15721
+\def\nodexxx[#1,#2]{\nodexxx[488,15752
+\def\donoderef{\donoderef491,15814
+\def\unnumbnoderef{\unnumbnoderef495,15935
+\def\appendixnoderef{\appendixnoderef499,16066
+\expandafter\expandafter\expandafter\appendixsetref{setref500,16112
+\let\refill=\relaxill=\relax503,16201
+\def\setfilename{\setfilename508,16415
+\outer\def\bye{\bye517,16661
+\def\inforef #1{\inforef519,16717
+\def\inforefzzz #1,#2,#3,#4**{\inforefzzz520,16755
+\def\losespace #1{\losespace522,16852
+\def\sf{\sf531,17056
+\font\defbf=cmbx10 scaled \magstep1 %was 1314bf=cmbx10557,17851
+\font\deftt=cmtt10 scaled \magstep1tt=cmtt10558,17897
+\def\df{\df559,17933
+\def\resetmathfonts{\resetmathfonts634,20527
+\def\textfonts{\textfonts647,21116
+\def\chapfonts{\chapfonts652,21331
+\def\secfonts{\secfonts657,21547
+\def\subsecfonts{\subsecfonts662,21752
+\def\indexfonts{\indexfonts667,21969
+\def\smartitalicx{\smartitalicx690,22701
+\def\smartitalic#1{\smartitalic691,22777
+\let\cite=\smartitalic=\smartitalic697,22922
+\def\b#1{\b699,22946
+\def\t#1{\t702,22981
+\def\samp #1{\samp705,23133
+\def\key #1{\key706,23166
+\def\ctrl #1{\ctrl707,23227
+\def\tclose#1{\tclose715,23429
+\def\ {\719,23595
+\def\xkey{\xkey727,23864
+\def\kbdfoo#1#2#3\par{\kbdfoo728,23880
+\def\dmn#1{\dmn737,24181
+\def\kbd#1{\kbd739,24208
+\def\l#1{\l741,24265
+\def\r#1{\r743,24294
+\def\sc#1{\sc745,24362
+\def\ii#1{\ii746,24405
+\def\titlefont#1{\titlefont754,24638
+\def\titlepage{\titlepage760,24741
+   \def\subtitlefont{\subtitlefont765,24968
+   \def\authorfont{\authorfont767,25052
+   \def\title{\title773,25262
+   \def\titlezzz##1{\titlezzz774,25297
+   \def\subtitle{\subtitle782,25612
+   \def\subtitlezzz##1{\subtitlezzz783,25653
+   \def\author{\author786,25771
+   \def\authorzzz##1{\authorzzz787,25808
+   \def\page{\page793,26099
+\def\Etitlepage{\Etitlepage803,26268
+\def\finishtitlepage{\finishtitlepage816,26656
+\def\evenheading{\evenheading845,27664
+\def\oddheading{\oddheading846,27707
+\def\everyheading{\everyheading847,27748
+\def\evenfooting{\evenfooting849,27794
+\def\oddfooting{\oddfooting850,27837
+\def\everyfooting{\everyfooting851,27878
+\def\headings #1 {\headings892,29570
+\def\HEADINGSoff{\HEADINGSoff894,29619
+\def\HEADINGSdouble{\HEADINGSdouble903,30046
+\def\HEADINGSsingle{\HEADINGSsingle913,30366
+\def\HEADINGSon{\HEADINGSon921,30587
+\def\HEADINGSafter{\HEADINGSafter923,30621
+\def\HEADINGSdoublex{\HEADINGSdoublex925,30716
+\def\HEADINGSsingleafter{\HEADINGSsingleafter932,30904
+\def\HEADINGSsinglex{\HEADINGSsinglex933,30965
+\def\today{\today942,31240
+\def\thistitle{\thistitle957,31785
+\def\settitle{\settitle958,31810
+\def\settitlezzz #1{\settitlezzz959,31847
+\def\internalBitem{\internalBitem991,32777
+\def\internalBitemx{\internalBitemx992,32827
+\def\internalBxitem "#1"{\internalBxitem994,32872
+\def\internalBxitemx "#1"{\internalBxitemx995,32952
+\def\internalBkitem{\internalBkitem997,33027
+\def\internalBkitemx{\internalBkitemx998,33079
+\def\kitemzzz #1{\kitemzzz1000,33126
+\def\xitemzzz #1{\xitemzzz1003,33228
+\def\itemzzz #1{\itemzzz1006,33331
+\def\item{\item1036,34402
+\def\itemx{\itemx1037,34453
+\def\kitem{\kitem1038,34506
+\def\kitemx{\kitemx1039,34559
+\def\xitem{\xitem1040,34614
+\def\xitemx{\xitemx1041,34667
+\def\description{\description1044,34777
+\def\table{\table1046,34827
+\def\ftable{\ftable1051,34971
+\def\Eftable{\Eftable1055,35117
+\def\vtable{\vtable1058,35186
+\def\Evtable{\Evtable1062,35332
+\def\dontindex #1{\dontindex1065,35401
+\def\fnitemindex #1{\fnitemindex1066,35421
+\def\vritemindex #1{\vritemindex1067,35466
+\def\tablez #1#2#3#4#5#6{\tablez1073,35615
+\def\Edescription{\Edescription1076,35673
+\def\itemfont{\itemfont1081,35875
+\def\Etable{\Etable1089,36101
+\def\itemize{\itemize1102,36425
+\def\itemizezzz #1{\itemizezzz1104,36461
+\def\itemizey #1#2{\itemizey1109,36556
+\def#2{1118,36802
+\def\itemcontents{\itemcontents1119,36843
+\def\bullet{\bullet1122,36891
+\def\minus{\minus1123,36918
+\def\frenchspacing{\frenchspacing1127,37026
+\def\splitoff#1#2\endmark{\splitoff1133,37251
+\def\enumerate{\enumerate1139,37481
+\def\enumeratezzz #1{\enumeratezzz1140,37520
+\def\enumeratey #1 #2\endenumeratey{\enumeratey1141,37573
+  \def\thearg{\thearg1145,37720
+  \ifx\thearg\empty \def\thearg{\thearg1146,37739
+\def\numericenumerate{\numericenumerate1183,39073
+\def\lowercaseenumerate{\lowercaseenumerate1189,39203
+\def\uppercaseenumerate{\uppercaseenumerate1202,39550
+\def\startenumeration#1{\startenumeration1218,40040
+\def\alphaenumerate{\alphaenumerate1226,40222
+\def\capsenumerate{\capsenumerate1227,40257
+\def\Ealphaenumerate{\Ealphaenumerate1228,40291
+\def\Ecapsenumerate{\Ecapsenumerate1229,40325
+\def\itemizeitem{\itemizeitem1233,40405
+\def\newindex #1{\newindex1258,41262
+\def\defindex{\defindex1267,41551
+\def\newcodeindex #1{\newcodeindex1271,41659
+\def\defcodeindex{\defcodeindex1278,41919
+\def\synindex #1 #2 {\synindex1282,42099
+\def\syncodeindex #1 #2 {\syncodeindex1291,42439
+\def\doindex#1{\doindex1308,43118
+\def\singleindexer #1{\singleindexer1309,43177
+\def\docodeindex#1{\docodeindex1312,43289
+\def\singlecodeindexer #1{\singlecodeindexer1313,43356
+\def\indexdummies{\indexdummies1315,43414
+\def\_{\_1316,43434
+\def\w{\w1317,43462
+\def\bf{\bf1318,43489
+\def\rm{\rm1319,43518
+\def\sl{\sl1320,43547
+\def\sf{\sf1321,43576
+\def\tt{\tt1322,43604
+\def\gtr{\gtr1323,43632
+\def\less{\less1324,43662
+\def\hat{\hat1325,43694
+\def\char{\char1326,43724
+\def\TeX{\TeX1327,43756
+\def\dots{\dots1328,43786
+\def\copyright{\copyright1329,43819
+\def\tclose##1{\tclose1330,43862
+\def\code##1{\code1331,43907
+\def\samp##1{\samp1332,43948
+\def\t##1{\t1333,43989
+\def\r##1{\r1334,44024
+\def\i##1{\i1335,44059
+\def\b##1{\b1336,44094
+\def\cite##1{\cite1337,44129
+\def\key##1{\key1338,44170
+\def\file##1{\file1339,44209
+\def\var##1{\var1340,44250
+\def\kbd##1{\kbd1341,44289
+\def\indexdummyfont#1{\indexdummyfont1346,44445
+\def\indexdummytex{\indexdummytex1347,44471
+\def\indexdummydots{\indexdummydots1348,44495
+\def\indexnofonts{\indexnofonts1350,44521
+\let\w=\indexdummyfontdummyfont1351,44541
+\let\t=\indexdummyfontdummyfont1352,44564
+\let\r=\indexdummyfontdummyfont1353,44587
+\let\i=\indexdummyfontdummyfont1354,44610
+\let\b=\indexdummyfontdummyfont1355,44633
+\let\emph=\indexdummyfontdummyfont1356,44656
+\let\strong=\indexdummyfontdummyfont1357,44682
+\let\cite=\indexdummyfont=\indexdummyfont1358,44710
+\let\sc=\indexdummyfontdummyfont1359,44736
+\let\tclose=\indexdummyfontdummyfont1363,44908
+\let\code=\indexdummyfontdummyfont1364,44936
+\let\file=\indexdummyfontdummyfont1365,44962
+\let\samp=\indexdummyfontdummyfont1366,44988
+\let\kbd=\indexdummyfontdummyfont1367,45014
+\let\key=\indexdummyfontdummyfont1368,45039
+\let\var=\indexdummyfontdummyfont1369,45064
+\let\TeX=\indexdummytexdummytex1370,45089
+\let\dots=\indexdummydotsdummydots1371,45113
+\let\indexbackslash=0  %overridden during \printindex.backslash=01381,45365
+\def\doind #1#2{\doind1383,45421
+{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1385,45464
+\def\rawbackslashxx{\rawbackslashxx1388,45604
+{\indexnofontsnofonts1393,45866
+\def\dosubind #1#2#3{\dosubind1404,46177
+{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1406,46225
+\def\rawbackslashxx{\rawbackslashxx1409,46329
+{\indexnofontsnofonts1413,46483
+\def\findex {\findex1442,47414
+\def\kindex {\kindex1443,47437
+\def\cindex {\cindex1444,47460
+\def\vindex {\vindex1445,47483
+\def\tindex {\tindex1446,47506
+\def\pindex {\pindex1447,47529
+\def\cindexsub {\cindexsub1449,47553
+\def\printindex{\printindex1461,47880
+\def\doprintindex#1{\doprintindex1463,47921
+  \def\indexbackslash{\indexbackslash1480,48406
+  \indexfonts\rm \tolerance=9500 \advance\baselineskip -1ptfonts\rm1481,48445
+\def\initial #1{\initial1516,49517
+\def\entry #1#2{\entry1522,49724
+  \null\nobreak\indexdotfill % Have leaders before the page 
number.dotfill1539,50371
+\def\indexdotfill{\indexdotfill1548,50699
+\def\primary #1{\primary1551,50805
+\def\secondary #1#2{\secondary1555,50887
+\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\pardotfill1558,50969
+\newbox\partialpageialpage1565,51142
+\def\begindoublecolumns{\begindoublecolumns1571,51300
+  \output={\global\setbox\partialpage=ialpage=1572,51336
+\def\enddoublecolumns{\enddoublecolumns1576,51524
+\def\doublecolumnout{\doublecolumnout1579,51609
+  address@hidden \advance\dimen@ by-\ht\partialpageialpage1580,51678
+\def\pagesofar{\pagesofar1583,51856
+\def\balancecolumns{\balancecolumns1587,52093
+  address@hidden \advance\availdimen@ by-\ht\partialpageialpage1593,52264
+     address@hidden \advance\dimen@ by-\ht\partialpageialpage1599,52525
+\newcount \appendixno  \appendixno = address@hidden,53430
+\def\appendixletter{\appendixletter1627,53471
+\def\opencontents{\opencontents1631,53574
+\def\thischapter{\thischapter1636,53755
+\def\seccheck#1{\seccheck1637,53793
+\def\chapternofonts{\chapternofonts1642,53897
+\def\result{\result1645,53972
+\def\equiv{\equiv1646,54007
+\def\expansion{\expansion1647,54040
+\def\print{\print1648,54081
+\def\TeX{\TeX1649,54114
+\def\dots{\dots1650,54143
+\def\copyright{\copyright1651,54174
+\def\tt{\tt1652,54215
+\def\bf{\bf1653,54242
+\def\w{\w1654,54270
+\def\less{\less1655,54295
+\def\gtr{\gtr1656,54326
+\def\hat{\hat1657,54355
+\def\char{\char1658,54384
+\def\tclose##1{\tclose1659,54415
+\def\code##1{\code1660,54459
+\def\samp##1{\samp1661,54499
+\def\r##1{\r1662,54539
+\def\b##1{\b1663,54573
+\def\key##1{\key1664,54607
+\def\file##1{\file1665,54645
+\def\kbd##1{\kbd1666,54685
+\def\i##1{\i1668,54793
+\def\cite##1{\cite1669,54827
+\def\var##1{\var1670,54867
+\def\emph##1{\emph1671,54905
+\def\dfn##1{\dfn1672,54945
+\def\thischaptername{\thischaptername1675,54986
+\outer\def\chapter{\chapter1676,55025
+\def\chapterzzz #1{\chapterzzz1677,55066
+{\chapternofonts%nofonts%1686,55462
+\global\let\section = \numberedsec=1691,55615
+\global\let\subsection = \numberedsubsec=1692,55650
+\global\let\subsubsection = \numberedsubsubsec=1693,55691
+\outer\def\appendix{\appendix1696,55742
+\def\appendixzzz #1{\appendixzzz1697,55785
+\global\advance \appendixno by 1 \message{no1699,55862
+\chapmacro {#1}{Appendix \appendixletter}letter1700,55931
+\xdef\thischapter{Appendix \appendixletter: 
\noexpand\thischaptername}letter:1703,56024
+{\chapternofonts%nofonts%1704,56096
+  {#1}{Appendix \appendixletter}letter1706,56152
+\appendixnoderef %noderef1709,56252
+\global\let\section = \appendixsec=1710,56271
+\global\let\subsection = \appendixsubsec=1711,56306
+\global\let\subsubsection = \appendixsubsubsec=1712,56347
+\outer\def\top{\top1715,56398
+\outer\def\unnumbered{\unnumbered1716,56438
+\def\unnumberedzzz #1{\unnumberedzzz1717,56485
+{\chapternofonts%nofonts%1721,56648
+\global\let\section = \unnumberedsec=1726,56798
+\global\let\subsection = \unnumberedsubsec=1727,56835
+\global\let\subsubsection = \unnumberedsubsubsec=1728,56878
+\outer\def\numberedsec{\numberedsec1731,56931
+\def\seczzz #1{\seczzz1732,56972
+{\chapternofonts%nofonts%1735,57128
+\outer\def\appendixsection{\appendixsection1744,57314
+\outer\def\appendixsec{\appendixsec1745,57371
+\def\appendixsectionzzz #1{\appendixsectionzzz1746,57424
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}letter1748,57536
+{\chapternofonts%nofonts%1749,57604
+{#1}{\appendixletter}letter1751,57660
+\appendixnoderef %noderef1754,57760
+\outer\def\unnumberedsec{\unnumberedsec1758,57800
+\def\unnumberedseczzz #1{\unnumberedseczzz1759,57853
+{\chapternofonts%nofonts%1761,57948
+\outer\def\numberedsubsec{\numberedsubsec1769,58116
+\def\numberedsubseczzz #1{\numberedsubseczzz1770,58171
+{\chapternofonts%nofonts%1773,58350
+\outer\def\appendixsubsec{\appendixsubsec1782,58554
+\def\appendixsubseczzz #1{\appendixsubseczzz1783,58609
+\subsecheading {#1}{\appendixletter}letter1785,58731
+{\chapternofonts%nofonts%1786,58796
+{#1}{\appendixletter}letter1788,58855
+\appendixnoderef %noderef1791,58970
+\outer\def\unnumberedsubsec{\unnumberedsubsec1795,59010
+\def\unnumberedsubseczzz #1{\unnumberedsubseczzz1796,59069
+{\chapternofonts%nofonts%1798,59170
+\outer\def\numberedsubsubsec{\numberedsubsubsec1806,59341
+\def\numberedsubsubseczzz #1{\numberedsubsubseczzz1807,59402
+{\chapternofonts%nofonts%1811,59599
+\outer\def\appendixsubsubsec{\appendixsubsubsec1822,59832
+\def\appendixsubsubseczzz #1{\appendixsubsubseczzz1823,59893
+  {\appendixletter}letter1826,60032
+{\chapternofonts%nofonts%1827,60098
+  {\appendixletter}letter1829,60163
+\appendixnoderef %noderef1833,60297
+\outer\def\unnumberedsubsubsec{\unnumberedsubsubsec1837,60337
+\def\unnumberedsubsubseczzz #1{\unnumberedsubsubseczzz1838,60402
+{\chapternofonts%nofonts%1840,60509
+\def\infotop{\infotop1850,60838
+\def\infounnumbered{\infounnumbered1851,60876
+\def\infounnumberedsec{\infounnumberedsec1852,60921
+\def\infounnumberedsubsec{\infounnumberedsubsec1853,60972
+\def\infounnumberedsubsubsec{\infounnumberedsubsubsec1854,61029
+\def\infoappendix{\infoappendix1856,61093
+\def\infoappendixsec{\infoappendixsec1857,61134
+\def\infoappendixsubsec{\infoappendixsubsec1858,61181
+\def\infoappendixsubsubsec{\infoappendixsubsubsec1859,61234
+\def\infochapter{\infochapter1861,61294
+\def\infosection{\infosection1862,61333
+\def\infosubsection{\infosubsection1863,61372
+\def\infosubsubsection{\infosubsubsection1864,61417
+\global\let\section = \numberedsec=1869,61654
+\global\let\subsection = \numberedsubsec=1870,61689
+\global\let\subsubsection = \numberedsubsubsec=1871,61730
+\def\majorheading{\majorheading1885,62237
+\def\majorheadingzzz #1{\majorheadingzzz1886,62282
+\def\chapheading{\chapheading1892,62515
+\def\chapheadingzzz #1{\chapheadingzzz1893,62558
+\def\heading{\heading1898,62753
+\def\subheading{\subheading1900,62790
+\def\subsubheading{\subsubheading1902,62833
+\def\dobreak#1#2{\dobreak1909,63110
+\def\setchapterstyle #1 {\setchapterstyle1911,63188
+\def\chapbreak{\chapbreak1918,63443
+\def\chappager{\chappager1919,63493
+\def\chapoddpage{\chapoddpage1920,63531
+\def\setchapternewpage #1 {\setchapternewpage1922,63610
+\def\CHAPPAGoff{\CHAPPAGoff1924,63667
+\def\CHAPPAGon{\CHAPPAGon1928,63761
+\global\def\HEADINGSon{\HEADINGSon1931,63852
+\def\CHAPPAGodd{\CHAPPAGodd1933,63894
+\global\def\HEADINGSon{\HEADINGSon1936,63990
+\def\CHAPFplain{\CHAPFplain1940,64044
+\def\chfplain #1#2{\chfplain1944,64136
+\def\unnchfplain #1{\unnchfplain1955,64359
+\def\unnchfopen #1{\unnchfopen1963,64588
+\def\chfopen #1#2{\chfopen1969,64796
+\def\CHAPFopen{\CHAPFopen1974,64940
+\def\subsecheadingbreak{\subsecheadingbreak1981,65158
+\def\secheadingbreak{\secheadingbreak1984,65287
+\def\secheading #1#2#3{\secheading1992,65569
+\def\plainsecheading #1{\plainsecheading1993,65625
+\def\secheadingi #1{\secheadingi1994,65668
+\def\subsecheading #1#2#3#4{\subsecheading2005,66036
+\def\subsecheadingi #1{\subsecheadingi2006,66103
+\def\subsubsecfonts{\subsubsecfonts2013,66400
+\def\subsubsecheading #1#2#3#4#5{\subsubsecheading2016,66523
+\def\subsubsecheadingi #1{\subsubsecheadingi2017,66601
+\def\startcontents#1{\startcontents2031,67073
+   \unnumbchapmacro{#1}\def\thischapter{\thischapter2039,67346
+\outer\def\contents{\contents2048,67705
+\outer\def\summarycontents{\summarycontents2056,67849
+      \def\secentry ##1##2##3##4{\secentry2066,68220
+      \def\unnumbsecentry ##1##2{\unnumbsecentry2067,68255
+      \def\subsecentry ##1##2##3##4##5{\subsecentry2068,68290
+      \def\unnumbsubsecentry ##1##2{\unnumbsubsecentry2069,68331
+      \def\subsubsecentry ##1##2##3##4##5##6{\subsubsecentry2070,68369
+      \def\unnumbsubsubsecentry ##1##2{\unnumbsubsubsecentry2071,68416
+\def\chapentry#1#2#3{\chapentry2084,68850
+\def\shortchapentry#1#2#3{\shortchapentry2087,68967
+    {#2\labelspace #1}space2090,69077
+\def\unnumbchapentry#1#2{\unnumbchapentry2093,69131
+\def\shortunnumberedentry#1#2{\shortunnumberedentry2094,69178
+\def\secentry#1#2#3#4{\secentry2101,69342
+\def\unnumbsecentry#1#2{\unnumbsecentry2102,69401
+\def\subsecentry#1#2#3#4#5{\subsecentry2105,69462
+\def\unnumbsubsecentry#1#2{\unnumbsubsecentry2106,69532
+\def\subsubsecentry#1#2#3#4#5#6{\subsubsecentry2109,69606
+  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}space2110,69640
+\def\unnumbsubsubsecentry#1#2{\unnumbsubsubsecentry2111,69691
+\def\dochapentry#1#2{\dochapentry2122,70065
+\def\dosecentry#1#2{\dosecentry2137,70670
+\def\dosubsecentry#1#2{\dosubsecentry2144,70848
+\def\dosubsubsecentry#1#2{\dosubsubsecentry2151,71033
+\def\labelspace{\labelspace2159,71284
+\def\dopageno#1{\dopageno2161,71319
+\def\doshortpageno#1{\doshortpageno2162,71345
+\def\chapentryfonts{\chapentryfonts2164,71377
+\def\secentryfonts{\secentryfonts2165,71412
+\def\point{\point2191,72371
+\def\result{\result2193,72392
+\def\expansion{\expansion2194,72465
+\def\print{\print2195,72536
+\def\equiv{\equiv2197,72603
+\def\error{\error2217,73376
+\def\tex{\tex2223,73605
address@hidden@2241,73988
+\gdef\sepspaces{\def {\ }}}\2264,74720
+\def\aboveenvbreak{\aboveenvbreak2267,74802
+\def\afterenvbreak{\afterenvbreak2271,74968
+\def\ctl{\ctl2285,75479
+\def\ctr{\ctr2286,75551
+\def\cbl{\cbl2287,75590
+\def\cbr{\cbr2288,75630
+\def\carttop{\carttop2289,75669
+\def\cartbot{\cartbot2292,75777
+\long\def\cartouche{\cartouche2298,75917
+\def\Ecartouche{\Ecartouche2325,76705
+\def\lisp{\lisp2337,76840
+\def\Elisp{\Elisp2347,77187
+\def\next##1{\next2359,77513
+\def\Eexample{\Eexample2363,77555
+\def\Esmallexample{\Esmallexample2366,77602
+\def\smalllispx{\smalllispx2372,77780
+\def\Esmalllisp{\Esmalllisp2382,78134
+\obeyspaces \obeylines \ninett \indexfonts \rawbackslashfonts2395,78490
+\def\next##1{\next2396,78547
+\def\display{\display2400,78627
+\def\Edisplay{\Edisplay2409,78946
+\def\next##1{\next2421,79257
+\def\format{\format2425,79360
+\def\Eformat{\Eformat2433,79656
+\def\next##1{\next2436,79745
+\def\flushleft{\flushleft2440,79797
+\def\Eflushleft{\Eflushleft2450,80168
+\def\next##1{\next2453,80261
+\def\flushright{\flushright2455,80283
+\def\Eflushright{\Eflushright2465,80655
+\def\next##1{\next2469,80786
+\def\quotation{\quotation2473,80844
+\def\Equotation{\Equotation2479,81036
+\def\setdeffont #1 {\setdeffont2492,81434
+\newskip\defbodyindent \defbodyindent=.4inbodyindent2494,81480
+\newskip\defargsindent \defargsindent=50ptargsindent2495,81523
+\newskip\deftypemargin \deftypemargin=12pttypemargin2496,81566
+\newskip\deflastargmargin \deflastargmargin=18ptlastargmargin2497,81609
+\def\activeparens{\activeparens2502,81807
+\def\opnr{\opnr2528,83019
+\def\lbrb{\lbrb2529,83084
+\def\defname #1#2{\defname2535,83285
+\advance\dimen2 by -\defbodyindentbodyindent2539,83403
+\advance\dimen3 by -\defbodyindentbodyindent2541,83457
+\setbox0=\hbox{\hskip \deflastargmargin{lastargmargin2543,83511
+\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for 
continuationsargsindent2545,83653
+\parshape 2 0in \dimen0 \defargsindent \dimen1     %argsindent2546,83728
+\rlap{\rightline{{\rm #2}\hskip \deftypemargin}typemargin2553,84097
+\advance\leftskip by -\defbodyindentbodyindent2556,84231
+\exdentamount=\defbodyindentbodyindent2557,84268
+\def\defparsebody #1#2#3{\defparsebody2567,84627
+\def#1{2571,84811
+\def#2{2572,84847
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2574,84919
+\exdentamount=\defbodyindentbodyindent2575,84993
+\def\defmethparsebody #1#2#3#4 {\defmethparsebody2580,85097
+\def#1{2584,85258
+\def#2##1 {2585,85294
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2587,85377
+\exdentamount=\defbodyindentbodyindent2588,85451
+\def\defopparsebody #1#2#3#4#5 {\defopparsebody2591,85536
+\def#1{2595,85697
+\def#2##1 ##2 {2596,85733
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2599,85833
+\exdentamount=\defbodyindentbodyindent2600,85907
+\def\defvarparsebody #1#2#3{\defvarparsebody2607,86178
+\def#1{2611,86365
+\def#2{2612,86401
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2614,86460
+\exdentamount=\defbodyindentbodyindent2615,86534
+\def\defvrparsebody #1#2#3#4 {\defvrparsebody2620,86625
+\def#1{2624,86784
+\def#2##1 {2625,86820
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2627,86890
+\exdentamount=\defbodyindentbodyindent2628,86964
+\def\defopvarparsebody #1#2#3#4#5 {\defopvarparsebody2631,87036
+\def#1{2635,87200
+\def#2##1 ##2 {2636,87236
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2639,87323
+\exdentamount=\defbodyindentbodyindent2640,87397
+\def\defunargs #1{\defunargs2663,88157
+\def\deftypefunargs #1{\deftypefunargs2675,88539
+\def\deffn{\deffn2689,88921
+\def\deffnheader #1#2#3{\deffnheader2691,88978
+\begingroup\defname {name2692,89026
+\def\defun{\defun2698,89171
+\def\defunheader #1#2{\defunheader2700,89224
+\begingroup\defname {name2701,89299
+\defunargs {unargs2702,89335
+\def\deftypefun{\deftypefun2708,89483
+\def\deftypefunheader #1#2{\deftypefunheader2711,89605
+\def\deftypefunheaderx #1#2 #3\relax{\deftypefunheaderx2713,89714
+\begingroup\defname {name2715,89806
+\deftypefunargs {typefunargs2716,89852
+\def\deftypefn{\deftypefn2722,90023
+\def\deftypefnheader #1#2#3{\deftypefnheader2725,90172
+\def\deftypefnheaderx #1#2#3 #4\relax{\deftypefnheaderx2727,90308
+\begingroup\defname {name2729,90401
+\deftypefunargs {typefunargs2730,90441
+\def\defmac{\defmac2736,90562
+\def\defmacheader #1#2{\defmacheader2738,90619
+\begingroup\defname {name2739,90695
+\defunargs {unargs2740,90728
+\def\defspec{\defspec2746,90852
+\def\defspecheader #1#2{\defspecheader2748,90913
+\begingroup\defname {name2749,90990
+\defunargs {unargs2750,91030
+\def\deffnx #1 {\deffnx2757,91225
+\def\defunx #1 {\defunx2758,91282
+\def\defmacx #1 {\defmacx2759,91339
+\def\defspecx #1 {\defspecx2760,91398
+\def\deftypefnx #1 {\deftypefnx2761,91459
+\def\deftypeunx #1 {\deftypeunx2762,91524
+\def\defop #1 {\defop2768,91670
+\defopparsebody\Edefop\defopx\defopheader\defoptype}opparsebody\Edefop\defopx\defopheader\defoptype2769,91705
+\def\defopheader #1#2#3{\defopheader2771,91759
+\begingroup\defname {name2773,91848
+\defunargs {unargs2774,91894
+\def\defmethod{\defmethod2779,91955
+\def\defmethodheader #1#2#3{\defmethodheader2781,92028
+\begingroup\defname {name2783,92116
+\defunargs {unargs2784,92156
+\def\defcv #1 {\defcv2789,92230
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype2790,92265
+\def\defcvarheader #1#2#3{\defcvarheader2792,92324
+\begingroup\defname {name2794,92410
+\defvarargs {varargs2795,92456
+\def\defivar{\defivar2800,92529
+\def\defivarheader #1#2#3{\defivarheader2802,92592
+\begingroup\defname {name2804,92678
+\defvarargs {varargs2805,92729
+\def\defopx #1 {\defopx2811,92878
+\def\defmethodx #1 {\defmethodx2812,92935
+\def\defcvx #1 {\defcvx2813,93000
+\def\defivarx #1 {\defivarx2814,93057
+\def\defvarargs #1{\defvarargs2821,93328
+\def\defvr{\defvr2827,93472
+\def\defvrheader #1#2#3{\defvrheader2829,93527
+\begingroup\defname {name2830,93575
+\def\defvar{\defvar2834,93660
+\def\defvarheader #1#2{\defvarheader2836,93720
+\begingroup\defname {name2837,93791
+\defvarargs {varargs2838,93827
+\def\defopt{\defopt2843,93893
+\def\defoptheader #1#2{\defoptheader2845,93953
+\begingroup\defname {name2846,94024
+\defvarargs {varargs2847,94063
+\def\deftypevar{\deftypevar2852,94120
+\def\deftypevarheader #1#2{\deftypevarheader2855,94236
+\begingroup\defname {name2857,94319
+\def\deftypevr{\deftypevr2864,94493
+\def\deftypevrheader #1#2#3{\deftypevrheader2866,94564
+\begingroup\defname {name2867,94616
+\def\defvrx #1 {\defvrx2875,94853
+\def\defvarx #1 {\defvarx2876,94910
+\def\defoptx #1 {\defoptx2877,94969
+\def\deftypevarx #1 {\deftypevarx2878,95028
+\def\deftypevrx #1 {\deftypevrx2879,95095
+\def\deftpargs #1{\deftpargs2884,95244
+\def\deftp{\deftp2888,95324
+\def\deftpheader #1#2#3{\deftpheader2890,95379
+\begingroup\defname {name2891,95427
+\def\deftpx #1 {\deftpx2896,95586
+\def\setref#1{\setref2907,95907
+\def\unnumbsetref#1{\unnumbsetref2912,96021
+\def\appendixsetref#1{\appendixsetref2917,96128
+\def\pxref#1{\pxref2928,96539
+\def\xref#1{\xref2929,96575
+\def\ref#1{\ref2930,96610
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\xrefX[2931,96640
+\def\printedmanual{\printedmanual2932,96683
+\def\printednodename{\printednodename2933,96721
+\def\printednodename{\printednodename2938,96846
+section ``\printednodename'' in \cite{\printedmanual}\printedmanual2953,97479
+\refx{x2956,97557
+\def\dosetq #1#2{\dosetq2964,97777
+\def\internalsetq #1#2{\internalsetq2972,98035
+\def\Ypagenumber{\Ypagenumber2976,98136
+\def\Ytitle{\Ytitle2978,98162
+\def\Ynothing{\Ynothing2980,98189
+\def\Ysectionnumberandtype{\Ysectionnumberandtype2982,98206
+\def\Yappendixletterandtype{\Yappendixletterandtype2991,98522
+\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{no2992,98552
+\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno 
%no.\the\secno2993,98607
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno 
%no.\the\secno.\the\subsecno2995,98711
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno 
%no.\the\secno.\the\subsecno.\the\subsubsecno2997,98782
+  \def\linenumber{\linenumber3008,99121
+\def\refx#1#2{\refx3014,99305
+\def\xrdef #1#2{\xrdef3036,99931
+\def\readauxfile{\readauxfile3039,100016
+\def\supereject{\supereject3109,101797
+\footstrut\parindent=\defaultparindent\hang\textindent{aultparindent\hang\textindent3130,102482
+\def\openindices{\openindices3138,102668
+\newdimen\defaultparindent \defaultparindent = 15ptaultparindent3150,102893
+\parindent = \defaultparindentaultparindent3151,102945
+\def\smallbook{\smallbook3174,103669
+\global\def\Esmallexample{\Esmallexample3191,104096
+\def\afourpaper{\afourpaper3195,104187
+\def\finalout{\finalout3223,104995
+\def\normaldoublequote{\normaldoublequote3234,105256
+\def\normaltilde{\normaltilde3235,105282
+\def\normalcaret{\normalcaret3236,105302
+\def\normalunderscore{\normalunderscore3237,105322
+\def\normalverticalbar{\normalverticalbar3238,105347
+\def\normalless{\normalless3239,105373
+\def\normalgreater{\normalgreater3240,105392
+\def\normalplus{\normalplus3241,105414
+\def\ifusingtt#1#2{\ifusingtt3252,105906
+\def\activedoublequote{\activedoublequote3260,106234
+\def~{~3263,106320
+\def^{^3266,106381
+\def_{_3269,106420
+\def\_{\_3271,106494
+\def\lvvmode{\lvvmode3278,106831
+\def|{|3281,106881
+\def<{<3284,106944
+\def>{>3287,107001
+\def+{+3289,107039
+\def\turnoffactive{\turnoffactive3295,107200
+\global\def={=3306,107486
+\def\normalbackslash{\normalbackslash3320,107868
+
+c-src//c.c,76
+T f(1,0
+}T i;2,14
+void bar(5,69
+int foobar(6,94
+interface_locate(9,131
+
+c.c,1963
+my_printf 135,
+void fatala 138,
+max 141,
+struct bar 143,
+  char z;144,
+  struct foo f;145,
+__attribute__ ((always_inline)) max 147,
+struct foo150,
+  char a;152,
+  int x[x153,
+char stack[stack155,
+struct S 156,
+struct S { short f[f156,
+  int *__ip;__ip159,
+  union wait *__up;__up160,
+} wait_status_ptr_t 161,
+Some_Class  A 162,
+typedef T1 T3 163,
+T3 z 164,
+typedef int more_aligned_int 165,
+struct S  __attribute__ ((vector_size (16))) foo;166,
+int foo 167,
+char *__attribute__((aligned(8))) *f;f168,
+int i 169,
+extern void foobar 170,
+typedef struct cacheLRUEntry_s172,
+  U16 next;174,
+  U16 prev;175,
+__attribute__ ((packed)) cacheLRUEntry_t;177,
+struct foo 178,
+  int x;179,
+  char a,180,
+  char a, b,180,
+  char a, b, c,180,
+  char a, b, c, d;180,
+     f1 183,
+void f2 184,
+int x 188,
+struct foo 189,
+struct foo { int x[x189,
+short array[array190,
+int f193,
+DEAFUN 196,
+XDEFUN 203,
+DEFUN ("x-get-selection-internal", 
Fx_get_selection_internal,x-get-selection-internal206,
+       Fx_get_selection_internal,x-get-selection-internal212,
+      Fy_get_selection_internal,y-get-selection-internal216,
+defun_func1(218,
+DEFUN_func2(220,
+typedef int bool;222,
+bool funcboo 223,
+struct my_struct 226,
+typedef struct my_struct my_typedef;228,
+int bla 229,
+a(234,
+int func1237,
+static struct cca_control init_control 239,
+static tpcmd rbtp 240,
+static byte ring1 241,
+static byte ring2 242,
+request request 243,
+int func2 246,
+  aaa;249,
+  bbb;251,
+struct sss1 252,
+struct sss2253,
+  struct ss3255,
+struct a b;259,
+struct aa *b;b260,
+  **b;b262,
+caccacacca 263,
+a 267,
+  typedef struct aa 269,
+  typedef struct aa {} aaa;269,
+static void inita 271,
+node *lasta lasta272,
+b 273,
+  typedef  int bb;275,
+static void initb 277,
+node *lastb lastb278,
+typedef enum { REG_ENOSYS 279,
+typedef enum { REG_ENOSYS = -1, aa 279,
+typedef enum { REG_ENOSYS = -1, aa } reg_errcode_t;279,
+
+c-src/a/b/b.c,18
+#define this 1,0
+
+../c/c.web,20
+#define questo 34,
+
+y-src/parse.y,738
+#define obstack_chunk_alloc 46,1111
+#define obstack_chunk_free 47,1149
+VOIDSTAR parse_hash;63,1400
+unsigned char fnin[fnin67,1519
+#define YYSTYPE 71,1617
+typedef struct node *YYSTYPE;YYSTYPE72,1648
+YYSTYPE parse_return;73,1678
+char *instr;instr80,1790
+int parse_error 81,1803
+line:line86,1862
+exp:exp94,1975
+exp_list:exp_list262,5642
+range_exp:range_exp268,5740
+range_exp_list:range_exp_list272,5770
+cell:cell278,5888
+yyerror FUN1(285,5935
+make_list FUN2(292,6015
+#define ERROR 303,6215
+yylex FUN0(314,6392
+parse_cell_or_range FUN2(586,11758
+#define CK_ABS_R(670,13200
+#define CK_REL_R(674,13279
+#define CK_ABS_C(679,13408
+#define CK_REL_C(683,13487
+#define MAYBEREL(688,13616
+str_to_col FUN1(846,16817
+
+y-src/parse.c,520
+#define YYBISON 4,64
+# define       NE      6,114
+# define       LE      7,130
+# define       GE      8,146
+# define       NEG     9,162
+# define       L_CELL  10,179
+# define       L_RANGE 11,199
+# define       L_VAR   12,220
+# define       L_CONST 13,239
+# define       L_FN0   14,260
+# define       L_FN1   15,279
+# define       L_FN2   16,298
+# define       L_FN3   17,317
+# define       L_FN4   18,336
+# define       L_FNN   19,355
+# define       L_FN1R  20,374
+# define       L_FN2R  21,394
+# define       L_FN3R  22,414
+# define       L_FN4R  23,434
+# define       L_FNNR  24,454
+# define       L_LE    25,474
+# define       L_NE    26,492
+# define       L_GE    27,510
+
+parse.y,1181
+#define obstack_chunk_alloc 46,
+#define obstack_chunk_free 47,
+VOIDSTAR parse_hash;63,
+unsigned char fnin[fnin67,
+#define YYSTYPE 71,
+typedef struct node *YYSTYPE;YYSTYPE72,
+YYSTYPE parse_return;73,
+char *instr;instr80,
+int parse_error 81,
+#define YYSTYPE 85,
+# define YYDEBUG 88,
+#define        YYFINAL 93,
+#define        YYFLAG  94,
+#define        YYNTBASE        95,
+#define YYTRANSLATE(98,
+static const char yytranslate[yytranslate101,
+static const short yyprhs[yyprhs134,
+static const short yyrhs[yyrhs142,
+static const short yyrline[yyrline171,
+static const char *const yytname[yytname185,
+static const short yyr1[yyr1197,
+static const short yyr2[yyr2207,
+static const short yydefact[yydefact219,
+static const short yydefgoto[yydefgoto237,
+static const short yypact[yypact242,
+static const short yypgoto[yypgoto260,
+#define        YYLAST  266,
+static const short yytable[yytable269,
+static const short yycheck[yycheck330,
+yyerror FUN1(285,
+make_list FUN2(292,
+#define ERROR 303,
+yylex FUN0(314,
+parse_cell_or_range FUN2(586,
+#define CK_ABS_R(670,
+#define CK_REL_R(674,
+#define CK_ABS_C(679,
+#define CK_REL_C(683,
+#define MAYBEREL(688,
+str_to_col FUN1(846,
+
+/usr/share/bison/bison.simple,2168
+# define YYSTD(40,
+# define YYSTD(42,
+#  define YYSTACK_ALLOC 50,
+#  define YYSIZE_T 51,
+#    define YYSTACK_ALLOC 55,
+#    define YYSIZE_T 56,
+#     define YYSTACK_ALLOC 59,
+#  define YYSTACK_FREE(67,
+#   define YYSIZE_T 71,
+#    define YYSIZE_T 75,
+#  define YYSTACK_ALLOC 78,
+#  define YYSTACK_FREE 79,
+union yyalloc83,
+  short yyss;85,
+  YYSTYPE yyvs;86,
+  YYLTYPE yyls;88,
+# define YYSTACK_GAP_MAX 93,
+#  define YYSTACK_BYTES(98,
+#  define YYSTACK_BYTES(102,
+# define YYSTACK_RELOCATE(112,
+# define YYSIZE_T 128,
+# define YYSIZE_T 131,
+#  define YYSIZE_T 136,
+#   define YYSIZE_T 140,
+# define YYSIZE_T 145,
+#define yyerrok        148,
+#define yyclearin      149,
+#define YYEMPTY        150,
+#define YYEOF  151,
+#define YYACCEPT       152,
+#define YYABORT 153,
+#define YYERROR        154,
+#define YYFAIL 158,
+#define YYRECOVERING(159,
+#define YYBACKUP(160,
+#define YYTERROR       177,
+#define YYERRCODE      178,
+# define YYLLOC_DEFAULT(189,
+#   define YYLEX       200,
+#   define YYLEX       202,
+#   define YYLEX       206,
+#   define YYLEX       208,
+# define YYLEX 212,
+#  define YYFPRINTF 225,
+# define YYDPRINTF(228,
+int yydebug;237,
+# define YYDPRINTF(239,
+# define YYINITDEPTH 244,
+# undef YYMAXDEPTH255,
+# define YYMAXDEPTH 259,
+#  define yymemcpy 264,
+yymemcpy 271,
+#   define yystrlen 293,
+yystrlen 298,
+#   define yystpcpy 316,
+yystpcpy 322,
+#  define YYPARSE_PARAM_ARG 351,
+#  define YYPARSE_PARAM_DECL352,
+#  define YYPARSE_PARAM_ARG 354,
+#  define YYPARSE_PARAM_DECL 355,
+# define YYPARSE_PARAM_ARG358,
+# define YYPARSE_PARAM_DECL359,
+#define YY_DECL_NON_LSP_VARIABLES      374,
+# define YY_DECL_VARIABLES     385,
+# define YY_DECL_VARIABLES     391,
+yyparse 403,
+# define YYPOPSTACK 445,
+# define YYPOPSTACK 447,
+# undef YYSTACK_RELOCATE548,
+  *++yyvsp yyvsp746,
+  *++yylsp yylsp748,
+  yyn 755,
+  yystate 757,
+    yystate 761,
+  goto yynewstate;763,
+  goto yyerrlab1;823,
+  yyerrstatus 846,
+  goto yyerrhandle;848,
+  yyn 861,
+  yystate 875,
+  yyn 895,
+  yyn 903,
+  *++yyvsp yyvsp919,
+  *++yylsp yylsp921,
+  yystate 924,
+  goto yynewstate;925,
+  yyresult 932,
+  goto yyreturn;933,
+  yyresult 939,
+  goto yyreturn;940,
+  yyresult 947,
+
+y-src/atest.y,9
+exp    2,3
+
+y-src/cccp.c,303
+#define YYBISON 4,63
+# define       INT     6,113
+# define       CHAR    7,130
+# define       NAME    8,148
+# define       ERROR   9,166
+# define       OR      10,185
+# define       AND     11,201
+# define       EQUAL   12,218
+# define       NOTEQUAL        13,237
+# define       LEQ     14,259
+# define       GEQ     15,276
+# define       LSH     16,293
+# define       RSH     17,310
+# define       UNARY   18,327
+
+cccp.y,2106
+typedef unsigned char U_CHAR;38,
+struct arglist 41,
+  struct arglist *next;next42,
+  U_CHAR *name;name43,
+  int length;44,
+  int argno;45,
+#define NULL 51,
+#define GENERIC_PTR 56,
+#define GENERIC_PTR 58,
+#define NULL_PTR 63,
+int expression_value;68,
+static jmp_buf parse_return_error;70,
+static int keyword_parsing 73,
+#define CHAR_TYPE_SIZE 87,
+#define INT_TYPE_SIZE 91,
+#define LONG_TYPE_SIZE 95,
+#define WCHAR_TYPE_SIZE 99,
+#define possible_sum_sign(104,
+  struct constant 113,
+  struct constant {long value;113,
+  struct constant {long value; int unsignedp;113,
+  struct constant {long value; int unsignedp;} integer;113,
+  struct name 114,
+  struct name {U_CHAR *address;address114,
+  struct name {U_CHAR *address; int length;114,
+  struct name {U_CHAR *address; int length;} name;114,
+  struct arglist *keywords;keywords115,
+  int voidval;116,
+  char *sval;sval117,
+} yystype;118,
+# define YYSTYPE 119,
+# define YYDEBUG 122,
+#define        YYFINAL 127,
+#define        YYFLAG  128,
+#define        YYNTBASE        129,
+#define YYTRANSLATE(132,
+static const char yytranslate[yytranslate135,
+static const short yyprhs[yyprhs167,
+static const short yyrhs[yyrhs174,
+static const short yyrline[yyrline195,
+static const char *const yytname[yytname208,
+static const short yyr1[yyr1219,
+static const short yyr2[yyr2228,
+static const short yydefact[yydefact239,
+static const short yydefgoto[yydefgoto251,
+static const short yypact[yypact256,
+static const short yypgoto[yypgoto268,
+#define        YYLAST  274,
+static const short yytable[yytable277,
+static const short yycheck[yycheck301,
+static char *lexptr;lexptr332,
+parse_number 341,
+struct token 437,
+  char *operator;operator438,
+  int token;439,
+static struct token tokentab2[tokentab2442,
+yylex 459,
+parse_escape 740,
+yyerror 836,
+integer_overflow 844,
+left_shift 851,
+right_shift 873,
+parse_c_expression 893,
+main 923,
+unsigned char is_idchar[is_idchar948,
+unsigned char is_idstart[is_idstart950,
+char is_hor_space[is_hor_space953,
+initialize_random_junk 958,
+error 988,
+warning 993,
+lookup 999,
+
+/usr/share/bison/bison.simple,2168
+# define YYSTD(40,
+# define YYSTD(42,
+#  define YYSTACK_ALLOC 50,
+#  define YYSIZE_T 51,
+#    define YYSTACK_ALLOC 55,
+#    define YYSIZE_T 56,
+#     define YYSTACK_ALLOC 59,
+#  define YYSTACK_FREE(67,
+#   define YYSIZE_T 71,
+#    define YYSIZE_T 75,
+#  define YYSTACK_ALLOC 78,
+#  define YYSTACK_FREE 79,
+union yyalloc83,
+  short yyss;85,
+  YYSTYPE yyvs;86,
+  YYLTYPE yyls;88,
+# define YYSTACK_GAP_MAX 93,
+#  define YYSTACK_BYTES(98,
+#  define YYSTACK_BYTES(102,
+# define YYSTACK_RELOCATE(112,
+# define YYSIZE_T 128,
+# define YYSIZE_T 131,
+#  define YYSIZE_T 136,
+#   define YYSIZE_T 140,
+# define YYSIZE_T 145,
+#define yyerrok        148,
+#define yyclearin      149,
+#define YYEMPTY        150,
+#define YYEOF  151,
+#define YYACCEPT       152,
+#define YYABORT 153,
+#define YYERROR        154,
+#define YYFAIL 158,
+#define YYRECOVERING(159,
+#define YYBACKUP(160,
+#define YYTERROR       177,
+#define YYERRCODE      178,
+# define YYLLOC_DEFAULT(189,
+#   define YYLEX       200,
+#   define YYLEX       202,
+#   define YYLEX       206,
+#   define YYLEX       208,
+# define YYLEX 212,
+#  define YYFPRINTF 225,
+# define YYDPRINTF(228,
+int yydebug;237,
+# define YYDPRINTF(239,
+# define YYINITDEPTH 244,
+# undef YYMAXDEPTH255,
+# define YYMAXDEPTH 259,
+#  define yymemcpy 264,
+yymemcpy 271,
+#   define yystrlen 293,
+yystrlen 298,
+#   define yystpcpy 316,
+yystpcpy 322,
+#  define YYPARSE_PARAM_ARG 351,
+#  define YYPARSE_PARAM_DECL352,
+#  define YYPARSE_PARAM_ARG 354,
+#  define YYPARSE_PARAM_DECL 355,
+# define YYPARSE_PARAM_ARG358,
+# define YYPARSE_PARAM_DECL359,
+#define YY_DECL_NON_LSP_VARIABLES      374,
+# define YY_DECL_VARIABLES     385,
+# define YY_DECL_VARIABLES     391,
+yyparse 403,
+# define YYPOPSTACK 445,
+# define YYPOPSTACK 447,
+# undef YYSTACK_RELOCATE548,
+  *++yyvsp yyvsp746,
+  *++yylsp yylsp748,
+  yyn 755,
+  yystate 757,
+    yystate 761,
+  goto yynewstate;763,
+  goto yyerrlab1;823,
+  yyerrstatus 846,
+  goto yyerrhandle;848,
+  yyn 861,
+  yystate 875,
+  yyn 895,
+  yyn 903,
+  *++yyvsp yyvsp919,
+  *++yylsp yylsp921,
+  yystate 924,
+  goto yynewstate;925,
+  yyresult 932,
+  goto yyreturn;933,
+  yyresult 939,
+  goto yyreturn;940,
+  yyresult 947,
+
+y-src/cccp.y,1696
+typedef unsigned char U_CHAR;38,1201
+struct arglist 41,1301
+  struct arglist *next;next42,1318
+  U_CHAR *name;name43,1342
+  int length;44,1358
+  int argno;45,1372
+#define NULL 51,1468
+#define GENERIC_PTR 56,1578
+#define GENERIC_PTR 58,1611
+#define NULL_PTR 63,1670
+int expression_value;68,1743
+static jmp_buf parse_return_error;70,1766
+static int keyword_parsing 73,1865
+#define CHAR_TYPE_SIZE 87,2162
+#define INT_TYPE_SIZE 91,2229
+#define LONG_TYPE_SIZE 95,2296
+#define WCHAR_TYPE_SIZE 99,2365
+#define possible_sum_sign(104,2556
+  struct constant 112,2733
+  struct constant {long value;112,2733
+  struct constant {long value; int unsignedp;112,2733
+  struct constant {long value; int unsignedp;} integer;112,2733
+  struct name 113,2789
+  struct name {U_CHAR *address;address113,2789
+  struct name {U_CHAR *address; int length;113,2789
+  struct name {U_CHAR *address; int length;} name;113,2789
+  struct arglist *keywords;keywords114,2840
+  int voidval;115,2868
+  char *sval;sval116,2883
+start 143,3226
+exp1   148,3330
+exp    156,3505
+exp    185,4295
+keywords 306,7835
+static char *lexptr;lexptr332,8579
+parse_number 341,8842
+struct token 437,11038
+  char *operator;operator438,11053
+  int token;439,11071
+static struct token tokentab2[tokentab2442,11088
+yylex 459,11367
+parse_escape 740,17718
+yyerror 836,19599
+integer_overflow 844,19690
+left_shift 851,19804
+right_shift 873,20194
+parse_c_expression 893,20732
+main 923,21483
+unsigned char is_idchar[is_idchar948,21901
+unsigned char is_idstart[is_idstart950,21996
+char is_hor_space[is_hor_space953,22160
+initialize_random_junk 958,22259
+error 988,22915
+warning 993,22963
+lookup 999,23033
+
+tex-src/nonewline.tex,0
+
+php-src/sendmail.php,0
+
+c-src/fail.c,0
+
+a-src/empty.zz,0
diff --git a/test/etags/ETAGS.good_4 b/test/etags/ETAGS.good_4
new file mode 100644
index 0000000..4468cdb
--- /dev/null
+++ b/test/etags/ETAGS.good_4
@@ -0,0 +1,5378 @@
+
+Makefile,701
+ADASRC=1,0
+ASRC=2,91
+CSRC=3,139
+CPSRC=7,410
+ELSRC=10,624
+ERLSRC=11,694
+FORTHSRC=12,759
+FSRC=13,809
+HTMLSRC=14,881
+JAVASRC=15,974
+LUASRC=16,1062
+MAKESRC=17,1105
+OBJCSRC=18,1147
+OBJCPPSRC=19,1228
+PASSRC=20,1291
+PERLSRC=21,1333
+PHPSRC=22,1413
+PSSRC=23,1485
+PROLSRC=24,1525
+PYTSRC=25,1587
+TEXSRC=26,1628
+YSRC=27,1707
+SRCS=28,1772
+NONSRCS=32,2024
+ETAGS_PROG=34,2098
+CTAGS_PROG=35,2129
+REGEX=37,2161
+xx=38,2207
+RUN=40,2256
+OPTIONS=42,2262
+ARGS=43,2314
+infiles 45,2332
+check:check47,2394
+ediff%:ediff%55,2697
+cdiff:cdiff58,2798
+ETAGS:ETAGS61,2895
+CTAGS:CTAGS64,2965
+srclist:srclist67,3043
+regexfile:regexfile71,3134
+.PRECIOUS:.PRECIOUS77,3311
+FRC:FRC79,3345
+
+ada-src/etags-test-for.ada,1969
+   type LL_Task_Procedure_Access LL_Task_Procedure_Access/t1,0
+   function Body_RequiredBody_Required/f3,78
+   type Type_Specific_Data Type_Specific_Data/t11,280
+   function "abs"abs/f19,504
+   type Barrier_Function_Pointer Barrier_Function_Pointer/t21,577
+   function "="=/f27,722
+   type usfreelock_ptr usfreelock_ptr/t30,803
+   function p p/f33,891
+   procedure LL_Wrapper LL_Wrapper/p37,1054
+function p p/f39,1094
+package Pkg1 Pkg1/s44,1203
+  type Private_T Private_T/t46,1220
+  package Inner1 Inner1/s48,1250
+    procedure Private_T;Private_T/p49,1270
+  package Inner2 Inner2/s52,1310
+    task Private_T;Private_T/k53,1330
+  type Public_T Public_T/t56,1365
+  procedure Pkg1_Proc1;Pkg1_Proc1/p62,1450
+  procedure Pkg1_Proc2 Pkg1_Proc2/p64,1475
+  function Pkg1_Func1 Pkg1_Func1/f66,1514
+  function Pkg1_Func2 Pkg1_Func2/f68,1553
+  package Pkg1_Pkg1 Pkg1_Pkg1/s71,1622
+    procedure Pkg1_Pkg1_Proc1;Pkg1_Pkg1_Proc1/p72,1645
+  task type Task_Type Task_Type/k75,1694
+  type Private_T Private_T/t82,1786
+package body Pkg1 Pkg1/b89,1882
+  procedure Pkg1_Proc1 Pkg1_Proc1/p91,1904
+  package body Inner1 Inner1/b96,1956
+    procedure Private_T Private_T/p97,1981
+  package body Inner2 Inner2/b103,2054
+    task body Private_T Private_T/b104,2079
+  task body Task_Type Task_Type/b112,2181
+  procedure Pkg1_Proc2 Pkg1_Proc2/p126,2367
+  function Pkg1_Func1 Pkg1_Func1/f132,2445
+  function Pkg1_Func2 Pkg1_Func2/f134,2496
+  package body Pkg1_Pkg1 Pkg1_Pkg1/b140,2596
+package body Pkg1_Pkg1 Pkg1_Pkg1/b146,2663
+  procedure Pkg1_Pkg1_Proc1 Pkg1_Pkg1_Proc1/p147,2689
+function  Pkg1_Func1 Pkg1_Func1/f155,2778
+package Truc Truc/s162,2887
+package Truc.Bidule Truc.Bidule/s166,2929
+  protected Bidule Bidule/t168,2953
+  protected type Machin_T Machin_T/t172,3007
+package body Truc.Bidule Truc.Bidule/b178,3087
+  protected body Bidule Bidule/b179,3115
+  protected Machin_T Machin_T/t186,3207
+
+ada-src/2ataspri.adb,2190
+package body System.Task_Primitives System.Task_Primitives/b64,2603
+   package RTE RTE/s69,2712
+   package TSL TSL/s70,2759
+   function To_void_ptr To_void_ptr/f86,3287
+   function To_TCB_Ptr To_TCB_Ptr/f89,3366
+   function 
pthread_mutexattr_setprotocolpthread_mutexattr_setprotocol/f92,3444
+   function 
pthread_mutexattr_setprio_ceilingpthread_mutexattr_setprio_ceiling/f99,3728
+   procedure Abort_WrapperAbort_Wrapper/p115,4302
+   procedure LL_Wrapper LL_Wrapper/p122,4526
+   procedure Initialize_LL_Tasks Initialize_LL_Tasks/p131,4830
+   function Self Self/f160,5586
+   procedure Initialize_LockInitialize_Lock/p174,5958
+   procedure Finalize_Lock Finalize_Lock/p210,6927
+   procedure Write_Lock Write_Lock/p226,7338
+   procedure Read_Lock Read_Lock/p239,7700
+   procedure Unlock Unlock/p246,7850
+   procedure Initialize_Cond Initialize_Cond/p258,8160
+   procedure Finalize_Cond Finalize_Cond/p286,8979
+   procedure Cond_Wait Cond_Wait/p300,9303
+   procedure Cond_Timed_WaitCond_Timed_Wait/p312,9661
+   procedure Cond_Signal Cond_Signal/p343,10510
+   procedure Set_PrioritySet_Priority/p355,10836
+   procedure Set_Own_Priority Set_Own_Priority/p372,11243
+   function Get_Priority Get_Priority/f385,11598
+   function Get_Own_Priority Get_Own_Priority/f398,12023
+   procedure Create_LL_TaskCreate_LL_Task/p412,12438
+      function To_Start_Addr To_Start_Addr/f426,12873
+   procedure Exit_LL_Task Exit_LL_Task/p491,14995
+   procedure Abort_Task Abort_Task/p500,15158
+   procedure Test_Abort Test_Abort/p518,15716
+   procedure Install_Abort_Handler Install_Abort_Handler/p527,15878
+   procedure Abort_WrapperAbort_Wrapper/p557,16939
+      function Address_To_Call_State Address_To_Call_State/f562,17062
+   procedure Install_Error_Handler Install_Error_Handler/p573,17351
+   procedure LL_Assert LL_Assert/p599,18146
+   procedure LL_Wrapper LL_Wrapper/p608,18299
+   procedure Initialize_TAS_Cell Initialize_TAS_Cell/p630,19010
+   procedure Finalize_TAS_Cell Finalize_TAS_Cell/p635,19129
+   procedure Clear Clear/p640,19236
+   procedure Test_And_Set Test_And_Set/p645,19330
+   function  Is_Set Is_Set/f659,19676
+
+ada-src/2ataspri.ads,2313
+package System.Task_Primitives System.Task_Primitives/s58,3169
+   type LL_Task_Procedure_Access LL_Task_Procedure_Access/t62,3253
+   type Pre_Call_State Pre_Call_State/t64,3331
+   type Task_Storage_Size Task_Storage_Size/t66,3378
+   type Machine_Exceptions Machine_Exceptions/t68,3433
+   type Error_Information Error_Information/t70,3499
+   type Lock Lock/t72,3569
+   type Condition_Variable Condition_Variable/t73,3594
+   type Task_Control_Block Task_Control_Block/t81,3955
+   type TCB_Ptr TCB_Ptr/t89,4241
+   function Address_To_TCB_Ptr Address_To_TCB_Ptr/f93,4333
+   procedure Initialize_LL_Tasks Initialize_LL_Tasks/p96,4425
+   function Self Self/f100,4602
+   procedure Initialize_Lock Initialize_Lock/p103,4707
+   procedure Finalize_Lock Finalize_Lock/p107,4879
+   procedure Write_Lock Write_Lock/p111,5034
+   procedure Read_Lock Read_Lock/p118,5428
+   procedure Unlock Unlock/p128,5995
+   procedure Initialize_Cond Initialize_Cond/p135,6300
+   procedure Finalize_Cond Finalize_Cond/p138,6413
+   procedure Cond_Wait Cond_Wait/p142,6591
+   procedure Cond_Timed_WaitCond_Timed_Wait/p155,7396
+   procedure Cond_Signal Cond_Signal/p164,7812
+   procedure Set_Priority Set_Priority/p169,8040
+   procedure Set_Own_Priority Set_Own_Priority/p173,8200
+   function Get_Priority Get_Priority/f177,8348
+   function Get_Own_Priority Get_Own_Priority/f181,8504
+   procedure Create_LL_TaskCreate_LL_Task/p185,8647
+   procedure Exit_LL_Task;Exit_LL_Task/p198,9282
+   procedure Abort_Task Abort_Task/p203,9516
+   procedure Test_Abort;Test_Abort/p210,9878
+   type Abort_Handler_Pointer Abort_Handler_Pointer/t217,10233
+   procedure Install_Abort_Handler Install_Abort_Handler/p219,10312
+   procedure Install_Error_Handler Install_Error_Handler/p226,10741
+   procedure LL_Assert LL_Assert/p231,10983
+   type Proc Proc/t238,11240
+   type TAS_Cell TAS_Cell/t242,11328
+   procedure Initialize_TAS_Cell Initialize_TAS_Cell/p249,11670
+   procedure Finalize_TAS_Cell Finalize_TAS_Cell/p255,11941
+   procedure Clear Clear/p260,12157
+   procedure Test_And_Set Test_And_Set/p267,12462
+   function  Is_Set Is_Set/f275,12877
+   type Lock Lock/t283,13155
+   type Condition_Variable Condition_Variable/t288,13267
+   type TAS_Cell TAS_Cell/t293,13389
+
+ada-src/waroquiers.ada,1503
+package Pkg1 Pkg1/s3,89
+  type Private_T Private_T/t5,106
+  package Inner1 Inner1/s7,136
+    procedure Private_T;Private_T/p8,156
+  package Inner2 Inner2/s11,196
+    task Private_T;Private_T/k12,216
+  type Public_T Public_T/t15,251
+  procedure Pkg1_Proc1;Pkg1_Proc1/p21,336
+  procedure Pkg1_Proc2 Pkg1_Proc2/p23,361
+  function Pkg1_Func1 Pkg1_Func1/f25,400
+  function Pkg1_Func2 Pkg1_Func2/f27,439
+  package Pkg1_Pkg1 Pkg1_Pkg1/s30,508
+    procedure Pkg1_Pkg1_Proc1;Pkg1_Pkg1_Proc1/p31,531
+  task type Task_Type Task_Type/k34,580
+  type Private_T Private_T/t40,671
+package body Pkg1 Pkg1/b46,766
+  procedure Pkg1_Proc1 Pkg1_Proc1/p48,788
+  package body Inner1 Inner1/b53,840
+    procedure Private_T Private_T/p54,865
+  package body Inner2 Inner2/b60,938
+    task body Private_T Private_T/b61,963
+  task body Task_Type Task_Type/b68,1064
+  procedure Pkg1_Proc2 Pkg1_Proc2/p82,1250
+  function Pkg1_Func1 Pkg1_Func1/f88,1328
+  function Pkg1_Func2 Pkg1_Func2/f90,1379
+  package body Pkg1_Pkg1 Pkg1_Pkg1/b96,1479
+package body Pkg1_Pkg1 Pkg1_Pkg1/b100,1544
+  procedure Pkg1_Pkg1_Proc1 Pkg1_Pkg1_Proc1/p101,1570
+function  Pkg1_Func1 Pkg1_Func1/f107,1657
+package Truc Truc/s112,1764
+package Truc.Bidule Truc.Bidule/s116,1816
+  protected Bidule Bidule/t125,1964
+  protected type Machin_T Machin_T/t131,2046
+package body Truc.Bidule Truc.Bidule/b138,2153
+  protected body Bidule Bidule/b139,2181
+  protected body Machin_T Machin_T/b146,2281
+
+c-src/abbrev.c,2634
+Lisp_Object Vabbrev_table_name_list;42,1416
+Lisp_Object Vglobal_abbrev_table;47,1561
+Lisp_Object Vfundamental_mode_abbrev_table;51,1672
+int abbrevs_changed;55,1773
+int abbrev_all_caps;57,1795
+Lisp_Object Vabbrev_start_location;62,1944
+Lisp_Object Vabbrev_start_location_buffer;65,2033
+Lisp_Object Vlast_abbrev;69,2142
+Lisp_Object Vlast_abbrev_text;74,2311
+int last_abbrev_point;78,2401
+Lisp_Object Vpre_abbrev_expand_hook,82,2474
+Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;82,2474
+DEFUN ("make-abbrev-table", Fmake_abbrev_table,make-abbrev-table84,2538
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table,clear-abbrev-table91,2730
+DEFUN ("define-abbrev", Fdefine_abbrev,define-abbrev106,3111
+DEFUN ("define-global-abbrev", 
Fdefine_global_abbrev,define-global-abbrev148,4430
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,define-mode-abbrev159,4801
+DEFUN ("abbrev-symbol", Fabbrev_symbol,abbrev-symbol173,5269
+DEFUN ("abbrev-expansion", Fabbrev_expansion,abbrev-expansion201,6233
+DEFUN ("expand-abbrev", Fexpand_abbrev,expand-abbrev217,6748
+DEFUN ("unexpand-abbrev", Funexpand_abbrev,unexpand-abbrev388,11669
+write_abbrev 425,12876
+describe_abbrev 444,13311
+DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,insert-abbrev-table-description465,13826
+DEFUN ("define-abbrev-table", 
Fdefine_abbrev_table,define-abbrev-table505,14982
+syms_of_abbrev 539,16059
+  DEFVAR_LISP ("abbrev-table-name-list"541,16079
+  DEFVAR_LISP ("global-abbrev-table"547,16341
+  DEFVAR_LISP ("fundamental-mode-abbrev-table"554,16663
+  DEFVAR_LISP ("last-abbrev"560,17005
+  DEFVAR_LISP ("last-abbrev-text"563,17128
+  DEFVAR_INT ("last-abbrev-location"567,17286
+  DEFVAR_LISP ("abbrev-start-location"574,17485
+  DEFVAR_LISP ("abbrev-start-location-buffer"580,17762
+  DEFVAR_PER_BUFFER ("local-abbrev-table"585,18026
+  DEFVAR_BOOL ("abbrevs-changed"588,18169
+  DEFVAR_BOOL ("abbrev-all-caps"593,18372
+  DEFVAR_LISP ("pre-abbrev-expand-hook"597,18528
+  DEFVAR_LISP ("abbrev-table-name-list",\1541,16079
+  DEFVAR_LISP ("global-abbrev-table",\1547,16341
+  DEFVAR_LISP ("fundamental-mode-abbrev-table",\1554,16663
+  DEFVAR_LISP ("last-abbrev",\1560,17005
+  DEFVAR_LISP ("last-abbrev-text",\1563,17128
+  DEFVAR_INT ("last-abbrev-location",\1567,17286
+  DEFVAR_LISP ("abbrev-start-location",\1574,17485
+  DEFVAR_LISP ("abbrev-start-location-buffer",\1580,17762
+  DEFVAR_PER_BUFFER ("local-abbrev-table",\1585,18026
+  DEFVAR_BOOL ("abbrevs-changed",\1588,18169
+  DEFVAR_BOOL ("abbrev-all-caps",\1593,18372
+  DEFVAR_LISP ("pre-abbrev-expand-hook",\1597,18528
+
+c-src/torture.c,197
+(*tag1 tag118,452
+#define notag2 26,553
+(*tag2 tag229,630
+(*tag3 tag339,772
+#define notag4 45,861
+(*tag4 tag448,955
+tag5 57,1081
+tag6 66,1208
+int pp1(74,1317
+pp287,1419
+pp3(100,1518
+
+c-src/getopt.h,147
+#define _GETOPT_H 19,801
+struct option73,2797
+#define        no_argument     89,3124
+#define required_argument      90,3147
+#define optional_argument      91,3175
+
+c-src/etags.c,10045
+char pot_etags_version[pot_etags_version81,3470
+#  undef DEBUG84,3552
+#  define DEBUG 85,3567
+#  define DEBUG 87,3594
+#  define NDEBUG       88,3617
+# define _GNU_SOURCE 94,3705
+# undef MSDOS100,3876
+# undef  WINDOWSNT101,3890
+# define WINDOWSNT102,3909
+# undef MSDOS106,3968
+# define MSDOS 107,3982
+# define MSDOS 110,4032
+# define MAXPATHLEN 115,4111
+# undef HAVE_NTGUI116,4141
+# undef  DOS_NT117,4160
+# define DOS_NT118,4176
+# undef  assert        135,4482
+# define assert(136,4541
+# undef  CTAGS146,4857
+# define CTAGS 147,4872
+# define CTAGS 149,4898
+#define streq(152,4927
+#define strcaseeq(153,4996
+#define strneq(154,5075
+#define strncaseeq(155,5151
+#define CHARS 157,5238
+#define CHAR(158,5278
+#define        iswhite(159,5329
+#define notinname(160,5394
+#define        begtoken(161,5469
+#define        intoken(162,5542
+#define        endtoken(163,5614
+#define ISALNUM(165,5684
+#define ISALPHA(166,5722
+#define ISDIGIT(167,5760
+#define ISLOWER(168,5798
+#define lowcase(170,5837
+#define xnew(179,6015
+#define xrnew(180,6083
+typedef void Lang_function 182,6164
+} compressor;188,6365
+} language;199,6835
+typedef struct fdesc201,6848
+} fdesc;212,7366
+typedef struct node_st214,7376
+} node;225,7894
+} linebuffer;239,8248
+    at_language,245,8344
+    at_regexp,246,8393
+    at_filename,247,8437
+    at_stdin,248,8473
+    at_end     249,8516
+} argument;253,8698
+typedef struct regexp256,8758
+} regexp;268,9325
+static void error 311,10780
+# undef STDIN408,15073
+#define STDIN 411,15095
+static compressor compressors[compressors457,17664
+static const char *Ada_suffixes Ada_suffixes473,17907
+static const char Ada_help 475,17977
+static const char *Asm_suffixes Asm_suffixes493,18580
+static const char Asm_help 504,18976
+static const char *default_C_suffixes default_C_suffixes512,19312
+static const char default_C_help 515,19413
+static const char default_C_help 523,19850
+static const char *Cplusplus_suffixes Cplusplus_suffixes535,20460
+static const char Cplusplus_help 540,20658
+static const char *Cjava_suffixes Cjava_suffixes549,21113
+static char Cjava_help 551,21172
+static const char *Cobol_suffixes Cobol_suffixes556,21337
+static char Cobol_help 558,21402
+static const char *Cstar_suffixes Cstar_suffixes562,21543
+static const char *Erlang_suffixes Erlang_suffixes565,21607
+static const char Erlang_help 567,21673
+const char *Forth_suffixes Forth_suffixes571,21799
+static const char Forth_help 573,21857
+static const char *Fortran_suffixes Fortran_suffixes577,22008
+static const char Fortran_help 579,22085
+static const char *HTML_suffixes HTML_suffixes582,22190
+static const char HTML_help 584,22264
+static const char *Lisp_suffixes Lisp_suffixes589,22452
+static const char Lisp_help 591,22556
+static const char *Lua_suffixes Lua_suffixes598,22871
+static const char Lua_help 600,22934
+static const char *Makefile_filenames Makefile_filenames603,23010
+static const char Makefile_help 605,23133
+static const char *Objc_suffixes Objc_suffixes609,23277
+static const char Objc_help 613,23399
+static const char *Pascal_suffixes Pascal_suffixes619,23714
+static const char Pascal_help 621,23778
+static const char *Perl_suffixes Perl_suffixes626,23966
+static const char *Perl_interpreters Perl_interpreters628,24028
+static const char Perl_help 630,24100
+static const char *PHP_suffixes PHP_suffixes637,24451
+static const char PHP_help 639,24523
+static const char *plain_C_suffixes plain_C_suffixes643,24678
+static const char *PS_suffixes PS_suffixes647,24762
+static const char PS_help 649,24848
+static const char *Prolog_suffixes Prolog_suffixes652,24931
+static const char Prolog_help 654,24993
+static const char *Python_suffixes Python_suffixes658,25107
+static const char Python_help 660,25165
+static const char *Scheme_suffixes Scheme_suffixes665,25347
+static const char Scheme_help 667,25460
+static const char *TeX_suffixes TeX_suffixes672,25683
+static const char TeX_help 674,25781
+static const char *Texinfo_suffixes Texinfo_suffixes686,26316
+static const char Texinfo_help 688,26395
+static const char *Yacc_suffixes Yacc_suffixes691,26492
+static const char Yacc_help 693,26606
+static const char auto_help 699,26856
+static const char none_help 703,27020
+static const char no_lang_help 707,27143
+static language lang_names 718,27355
+print_language_names 753,29532
+# define EMACS_NAME 786,30755
+# define VERSION 789,30811
+print_version 792,30869
+# define PRINT_UNDOCUMENTED_OPTIONS_HELP 804,31173
+print_help 808,31250
+main 981,37438
+get_compressor_from_suffix 1319,46217
+get_language_from_langname 1355,47158
+get_language_from_interpreter 1377,47545
+get_language_from_filename 1399,47976
+process_file_name 1433,48834
+process_file 1555,51665
+init 1632,54150
+find_entries 1656,54901
+make_tag 1814,59707
+pfnote 1856,60942
+free_tree 1917,62744
+free_fdesc 1935,63029
+add_node 1955,63472
+invalidate_nodes 2035,65537
+static int number_len 2068,66193
+total_size_of_entries 2087,66694
+put_entries 2107,67154
+#define C_EXT  2193,68995
+#define C_PLAIN 2194,69037
+#define C_PLPL 2195,69070
+#define C_STAR 2196,69104
+#define C_JAVA 2197,69137
+#define C_AUTO 2198,69172
+#define YACC   2199,69242
+enum sym_type2204,69312
+  st_none,2206,69328
+  st_C_objprot,2207,69339
+  st_C_objprot, st_C_objimpl,2207,69339
+  st_C_objprot, st_C_objimpl, st_C_objend,2207,69339
+  st_C_gnumacro,2208,69382
+  st_C_ignore,2209,69399
+  st_C_ignore, st_C_attribute,2209,69399
+  st_C_javastruct,2210,69430
+  st_C_operator,2211,69449
+  st_C_class,2212,69466
+  st_C_class, st_C_template,2212,69466
+  st_C_struct,2213,69495
+  st_C_struct, st_C_extern,2213,69495
+  st_C_struct, st_C_extern, st_C_enum,2213,69495
+  st_C_struct, st_C_extern, st_C_enum, st_C_define,2213,69495
+  st_C_struct, st_C_extern, st_C_enum, st_C_define, st_C_typedef2213,69495
+struct C_stab_entry 2271,71278
+hash 2275,71409
+in_word_set 2321,72937
+      TOTAL_KEYWORDS 2325,73018
+      MIN_WORD_LENGTH 2326,73045
+      MAX_WORD_LENGTH 2327,73072
+      MIN_HASH_VALUE 2328,73100
+      MAX_HASH_VALUE 2329,73126
+C_symtype 2387,74985
+static bool inattribute;2400,75234
+  fvnone,2408,75435
+  fdefunkey,2409,75466
+  fdefunname,2410,75512
+  foperator,2411,75556
+  fvnameseen,2412,75613
+  fstartlist,2413,75666
+  finlist,2414,75722
+  flistseen,2415,75765
+  fignore,2416,75813
+  vignore      2417,75856
+} fvdef;2418,75901
+static bool fvextern;2420,75911
+  tnone,2428,76089
+  tkeyseen,2429,76119
+  ttypeseen,2430,76160
+  tinbody,2431,76199
+  tend,2432,76238
+  tignore      2433,76279
+} typdef;2434,76320
+  snone,2443,76499
+  skeyseen,2445,76575
+  stagseen,2446,76620
+  scolonseen   2447,76661
+} structdef;2448,76715
+static const char *objtag objtag2453,76809
+  dnone,2460,76942
+  dsharpseen,2461,76972
+  ddefineseen,2462,77025
+  dignorerest  2463,77070
+} definedef;2464,77112
+  onone,2472,77267
+  oprotocol,2473,77297
+  oimplementation,2474,77347
+  otagseen,2475,77395
+  oparenseen,2476,77431
+  ocatseen,2477,77486
+  oinbody,2478,77525
+  omethodsign,2479,77568
+  omethodtag,2480,77626
+  omethodcolon,2481,77666
+  omethodparm,2482,77709
+  oignore      2483,77755
+} objdef;2484,77787
+static struct tok2491,77944
+} token;2508,78626
+} cstack;2523,79136
+#define nestlev        2525,79264
+#define instruct       2527,79369
+pushclass_above 2531,79489
+popclass_above 2550,79948
+write_classname 2564,80162
+consider_token 2613,81341
+} lbs[lbs2924,88532
+#define current_lb_is_new 2926,88543
+#define switch_line_buffers(2927,88588
+#define curlb 2929,88641
+#define newlb 2930,88672
+#define curlinepos 2931,88703
+#define newlinepos 2932,88744
+#define plainc 2934,88786
+#define cplpl 2935,88830
+#define cjava 2936,88861
+#define CNL_SAVE_DEFINEDEF(2938,88905
+#define CNL(2947,89117
+make_C_tag 2960,89375
+C_entries 2986,90194
+default_C_entries 3833,110156
+plain_C_entries 3840,110276
+Cplusplus_entries 3847,110364
+Cjava_entries 3854,110460
+Cstar_entries 3861,110550
+Yacc_entries 3868,110642
+#define LOOP_ON_INPUT_LINES(3875,110720
+#define LOOKING_AT(3884,111056
+#define LOOKING_AT_NOCASE(3891,111461
+just_read_file 3901,111861
+F_takeprec 3914,112039
+F_getit 3937,112366
+Fortran_functions 3961,112840
+Ada_getit 4052,114669
+Ada_funcs 4115,116044
+Asm_labels 4228,118582
+Perl_functions 4261,119549
+Python_functions 4357,122057
+PHP_functions 4387,122684
+Cobol_paragraphs 4466,124471
+Makefile_targets 4494,125029
+Pascal_functions 4529,125950
+L_getit 4709,130318
+Lisp_functions 4725,130664
+Lua_functions 4785,131850
+PS_functions 4811,132385
+Forth_words 4841,133053
+Scheme_functions 4877,134092
+static linebuffer *TEX_toktab TEX_toktab4908,134781
+static const char *TEX_defenv TEX_defenv4912,134974
+static char TEX_esc 4920,135261
+static char TEX_opgrp 4921,135289
+static char TEX_clgrp 4922,135318
+TeX_commands 4928,135395
+#define TEX_LESC 4986,136652
+#define TEX_SESC 4987,136674
+TEX_mode 4992,136804
+TEX_decode_env 5026,137509
+Texinfo_nodes 5071,138554
+HTML_labels 5094,139013
+Prolog_functions 5219,142347
+prolog_skip_comment 5255,143128
+prolog_pr 5281,143736
+prolog_atom 5319,144628
+Erlang_functions 5379,145666
+erlang_func 5438,146965
+erlang_attribute 5476,147642
+erlang_atom 5496,148061
+scan_separators 5534,149080
+analyze_regex 5586,150460
+add_regex 5654,152050
+substitute 5767,154797
+free_regexps 5814,155837
+regex_tag_multiline 5836,156291
+nocase_tail 5913,158263
+get_tag 5928,158519
+readline_internal 5959,159455
+readline 6037,161296
+savestr 6230,167243
+savenstr 6240,167473
+skip_spaces 6249,167679
+skip_non_spaces 6258,167833
+skip_name 6267,167983
+fatal 6277,168156
+pfatal 6284,168253
+suggest_asking_for_help 6291,168332
+error 6300,168554
+concat 6313,168846
+etags_getcwd 6329,169259
+relative_filename 6350,169725
+absolute_filename 6389,170751
+absolute_dirname 6453,172416
+filename_is_absolute 6472,172845
+canonicalize_filename 6484,173096
+# define ISUPPER(6491,173235
+linebuffer_init 6514,173656
+linebuffer_setlen 6524,173887
+xmalloc 6536,174148
+xrealloc 6545,174314
+
+c-src/exit.c,47
+  } __libc_atexit;30,1011
+DEFUN(exit,38,1252
+
+c-src/exit.strange_suffix,47
+  } __libc_atexit;30,1011
+DEFUN(exit,38,1252
+
+c-src/sysdep.h,491
+#define        ENTRY(21,865
+#define        PSEUDO(26,972
+    movl $SYS_##syscall_nam$SYS_##syscall_na31,1132
+    movl $SYS_##syscall_name, %eax;eax31,1132
+    int $0x80;32,1180
+    test %eax,eax33,1210
+    test %eax, %eax;eax33,1210
+    jl syscall_error;34,1245
+#define        XCHG_0  47,1562
+#define        XCHG_1  48,1606
+#define        XCHG_2  49,1648
+#define        XCHG_3  50,1691
+#define        XCHG_4  51,1734
+#define        XCHG_5  52,1777
+#define        r0      54,1821
+#define        r1      55,1875
+#define scratch 56,1932
+#define MOVE(57,2001
+
+c-src/tab.c,196
+static int             count_words(15,263
+static char            *get_word(get_word35,553
+void                   tab_free(59,966
+char                   **tab_fill(tab_fill70,1129
+int                    tab_delete_first(91,1638
+int                    tab_count_words(103,1820
+
+c-src/dostorture.c,197
+(*tag1 tag118,451
+#define notag2 26,552
+(*tag2 tag229,629
+(*tag3 tag339,771
+#define notag4 45,860
+(*tag4 tag448,954
+tag5 57,1080
+tag6 66,1207
+int pp1(74,1316
+pp287,1418
+pp3(100,1517
+
+c-src/emacs/src/gmalloc.c,3539
+#define USE_PTHREAD25,1002
+#undef get_current_dir_name33,1126
+#undef malloc64,2110
+#undef realloc65,2124
+#undef calloc66,2139
+#undef free67,2153
+#define malloc 68,2165
+#define realloc 69,2188
+#define calloc 70,2213
+#define aligned_alloc 71,2236
+#define free 72,2273
+#define DUMPED 80,2472
+#define ALLOCATED_BEFORE_DUMPING(81,2507
+extern void *malloc malloc94,2718
+#define INT_BIT        124,3934
+#define BLOCKLOG       125,3977
+#define BLOCKSIZE      126,4018
+#define BLOCKIFY(127,4052
+#define HEAP   131,4215
+#define FINAL_FREE_BLOCKS      135,4391
+  } malloc_info;167,5388
+#define BLOCK(176,5620
+#define ADDRESS(177,5682
+struct list186,5939
+struct alignlist196,6153
+#define LOCK(223,7064
+#define UNLOCK(228,7195
+#define LOCK_ALIGNED_BLOCKS(233,7329
+#define UNLOCK_ALIGNED_BLOCKS(238,7484
+#define LOCK(244,7649
+#define UNLOCK(245,7664
+#define LOCK_ALIGNED_BLOCKS(246,7681
+#define UNLOCK_ALIGNED_BLOCKS(247,7711
+enum mcheck_status283,9092
+    MCHECK_DISABLED 285,9115
+    MCHECK_OK,286,9187
+    MCHECK_FREE,287,9226
+    MCHECK_HEAD,288,9270
+    MCHECK_TAIL        289,9334
+struct mstats308,10153
+char *_heapbase;_heapbase355,11829
+malloc_info *_heapinfo;_heapinfo358,11927
+static size_t heapsize;361,11983
+size_t _heapindex;364,12047
+size_t _heaplimit;367,12109
+struct list _fraghead[_fraghead370,12171
+size_t _chunks_used;373,12229
+size_t _bytes_used;374,12250
+size_t _chunks_free;375,12270
+size_t _bytes_free;376,12291
+int __malloc_initialized;379,12340
+size_t __malloc_extra_blocks;381,12367
+static int state_protected_p;400,12912
+static size_t last_state_size;401,12942
+static malloc_info *last_heapinfo;last_heapinfo402,12973
+protect_malloc_state 405,13014
+#define PROTECT_MALLOC_STATE(426,13627
+#define PROTECT_MALLOC_STATE(429,13697
+align 435,13794
+get_contiguous_space 466,14616
+register_heapinfo 497,15325
+pthread_mutex_t _malloc_mutex 517,15879
+pthread_mutex_t _aligned_blocks_mutex 518,15938
+int _malloc_thread_enabled_p;519,16005
+malloc_atfork_handler_prepare 522,16048
+malloc_atfork_handler_parent 529,16139
+malloc_atfork_handler_child 536,16233
+malloc_enable_thread 544,16375
+malloc_initialize_1 563,16961
+__malloc_initialize 594,17793
+static int morecore_recursing;604,17926
+morecore_nolock 609,18066
+_malloc_internal_nolock 722,21584
+_malloc_internal 920,28102
+malloc 932,28247
+_malloc 961,29140
+_free 967,29196
+_realloc 973,29240
+struct alignlist *_aligned_blocks _aligned_blocks1004,30345
+_free_internal_nolock 1009,30474
+_free_internal 1255,38476
+free 1265,38603
+weak_alias 1277,38799
+#define min(1306,39813
+_realloc_internal_nolock 1319,40309
+_realloc_internal 1435,43563
+realloc 1447,43726
+calloc 1478,44894
+#define        __sbrk  1513,46042
+__default_morecore 1525,46511
+aligned_alloc 1557,47522
+memalign 1647,49704
+posix_memalign 1656,49909
+static size_t pagesize;1703,51317
+valloc 1706,51349
+#undef malloc1715,51490
+#undef realloc1716,51504
+#undef calloc1717,51519
+#undef aligned_alloc1718,51533
+#undef free1719,51554
+hybrid_malloc 1736,52083
+hybrid_calloc 1744,52188
+hybrid_free 1752,52319
+hybrid_aligned_alloc 1765,52626
+hybrid_realloc 1780,52984
+hybrid_get_current_dir_name 1811,53797
+#define MAGICWORD      1854,55206
+#define MAGICFREE      1855,55261
+#define MAGICBYTE      1856,55316
+#define MALLOCFLOOD    1857,55348
+#define FREEFLOOD      1858,55382
+struct hdr1860,55415
+checkhdr 1867,55581
+freehook 1891,56022
+mallochook 1927,56804
+reallochook 1944,57143
+mabort 1978,57901
+static int mcheck_used 2012,58586
+mcheck 2015,58619
+mprobe 2035,59138
+
+c-src/emacs/src/regex.h,3761
+#define _REGEX_H 21,836
+typedef unsigned long reg_syntax_t;43,1577
+#define RE_BACKSLASH_ESCAPE_IN_LISTS 47,1749
+#define RE_BK_PLUS_QM 52,1969
+#define RE_CHAR_CLASSES 58,2298
+#define RE_CONTEXT_INDEP_ANCHORS 72,3032
+#define RE_CONTEXT_INDEP_OPS 80,3458
+#define RE_CONTEXT_INVALID_OPS 84,3658
+#define RE_DOT_NEWLINE 88,3801
+#define RE_DOT_NOT_NULL 92,3937
+#define RE_HAT_LISTS_NOT_NEWLINE 96,4082
+#define RE_INTERVALS 101,4292
+#define RE_LIMITED_OPS 105,4441
+#define RE_NEWLINE_ALT 109,4583
+#define RE_NO_BK_BRACES 114,4773
+#define RE_NO_BK_PARENS 118,4964
+#define RE_NO_BK_REFS 122,5120
+#define RE_NO_BK_VBAR 126,5316
+#define RE_NO_EMPTY_RANGES 132,5610
+#define RE_UNMATCHED_RIGHT_PAREN_ORD 136,5766
+#define RE_NO_POSIX_BACKTRACKING 140,5937
+#define RE_NO_GNU_OPS 144,6133
+#define RE_FRUGAL 147,6253
+#define RE_SHY_GROUPS 150,6360
+#define RE_NO_NEWLINE_ANCHOR 153,6468
+#define RE_DEBUG 161,6884
+#define RE_SYNTAX_EMACS        183,7684
+#define RE_SYNTAX_AWK  186,7780
+#define RE_SYNTAX_GNU_AWK      193,8084
+#define RE_SYNTAX_POSIX_AWK 197,8255
+#define RE_SYNTAX_GREP 201,8393
+#define RE_SYNTAX_EGREP        206,8549
+#define RE_SYNTAX_POSIX_EGREP  212,8765
+#define RE_SYNTAX_ED 216,8910
+#define RE_SYNTAX_SED 218,8954
+#define _RE_SYNTAX_POSIX_COMMON        221,9072
+#define RE_SYNTAX_POSIX_BASIC  225,9215
+#define RE_SYNTAX_POSIX_MINIMAL_BASIC  231,9508
+#define RE_SYNTAX_POSIX_EXTENDED       234,9598
+#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED       242,9967
+# undef RE_DUP_MAX253,10454
+#define RE_DUP_MAX 256,10540
+#define REG_EXTENDED 263,10762
+#define REG_ICASE 267,10886
+#define REG_NEWLINE 272,11070
+#define REG_NOSUB 276,11248
+#define REG_NOTBOL 286,11614
+#define REG_NOTEOL 289,11688
+  REG_ENOSYS 297,11859
+  REG_NOERROR 300,11941
+  REG_NOMATCH,301,11976
+  REG_BADPAT,305,12123
+  REG_ECOLLATE,306,12162
+  REG_ECTYPE,307,12203
+  REG_EESCAPE,308,12255
+  REG_ESUBREG,309,12298
+  REG_EBRACK,310,12345
+  REG_EPAREN,311,12391
+  REG_EBRACE,312,12436
+  REG_BADBR,313,12472
+  REG_ERANGE,314,12519
+  REG_ESPACE,315,12560
+  REG_BADRPT,316,12601
+  REG_EEND,319,12693
+  REG_ESIZE,320,12728
+  REG_ERPAREN,321,12790
+  REG_ERANGEX  322,12859
+} reg_errcode_t;323,12911
+# define RE_TRANSLATE_TYPE 332,13273
+struct re_pattern_buffer335,13315
+#define REGS_UNALLOCATED 376,14889
+#define REGS_REALLOCATE 377,14916
+#define REGS_FIXED 378,14942
+typedef struct re_pattern_buffer regex_t;416,16098
+typedef ssize_t regoff_t;423,16492
+struct re_registers428,16652
+# define RE_NREGS 440,16942
+} regmatch_t;451,17317
+#  define _Restrict_ 540,20886
+#  define _Restrict_ 542,20979
+#  define _Restrict_544,21018
+#  define _Restrict_arr_ 555,21418
+#  define _Restrict_arr_557,21461
+#  define CHAR_CLASS_MAX_LENGTH 593,22470
+#  define CHAR_CLASS_MAX_LENGTH 597,22648
+typedef wctype_t re_wctype_t;599,22692
+typedef wchar_t re_wchar_t;600,22722
+# define re_wctype 601,22750
+# define re_iswctype 602,22776
+# define re_wctype_to_bit(603,22806
+# define CHAR_CLASS_MAX_LENGTH 605,22844
+# define btowc(606,22906
+typedef enum { RECC_ERROR 609,22953
+              RECC_ALNUM,610,22984
+              RECC_ALNUM, RECC_ALPHA,610,22984
+              RECC_ALNUM, RECC_ALPHA, RECC_WORD,610,22984
+              RECC_GRAPH,611,23027
+              RECC_GRAPH, RECC_PRINT,611,23027
+              RECC_LOWER,612,23059
+              RECC_LOWER, RECC_UPPER,612,23059
+              RECC_PUNCT,613,23091
+              RECC_PUNCT, RECC_CNTRL,613,23091
+              RECC_DIGIT,614,23123
+              RECC_DIGIT, RECC_XDIGIT,614,23123
+              RECC_BLANK,615,23156
+              RECC_BLANK, RECC_SPACE,615,23156
+              RECC_MULTIBYTE,616,23188
+              RECC_MULTIBYTE, RECC_NONASCII,616,23188
+              RECC_ASCII,617,23227
+              RECC_ASCII, RECC_UNIBYTE617,23227
+} re_wctype_t;618,23260
+typedef int re_wchar_t;623,23387
+
+c-src/emacs/src/keyboard.c,20957
+volatile int interrupt_input_blocked;76,1808
+volatile bool pending_signals;80,1944
+#define KBD_BUFFER_SIZE 82,1976
+KBOARD *initial_kboard;initial_kboard84,2006
+KBOARD *current_kboard;current_kboard85,2030
+static KBOARD *all_kboards;all_kboards86,2054
+static bool single_kboard;89,2154
+#define NUM_RECENT_KEYS 91,2182
+static int recent_keys_index;94,2269
+static int total_keys;97,2357
+static Lisp_Object recent_keys;100,2443
+Lisp_Object this_command_keys;107,2777
+ptrdiff_t this_command_key_count;108,2808
+static bool this_command_key_count_reset;112,2922
+static Lisp_Object raw_keybuf;116,3074
+static int raw_keybuf_count;117,3105
+#define GROW_RAW_KEYBUF        119,3135
+static ptrdiff_t this_single_command_key_start;125,3350
+static ptrdiff_t before_command_key_count;129,3498
+static ptrdiff_t before_command_echo_length;130,3541
+sigjmp_buf return_to_command_loop;135,3677
+static Lisp_Object recover_top_level_message;138,3791
+static Lisp_Object regular_top_level_message;143,3930
+static sys_jmp_buf getcjmp;147,4031
+bool waiting_for_input;150,4095
+static bool echoing;154,4186
+static struct kboard 
*ok_to_echo_at_next_pause;ok_to_echo_at_next_pause159,4328
+struct kboard *echo_kboard;echo_kboard166,4632
+Lisp_Object echo_message_buffer;171,4744
+bool immediate_quit;174,4837
+int quit_char;192,5623
+EMACS_INT command_loop_level;195,5680
+Lisp_Object unread_switch_frame;204,6108
+static ptrdiff_t last_non_minibuf_size;207,6216
+uintmax_t num_input_events;210,6334
+static EMACS_INT last_auto_save;214,6428
+static ptrdiff_t last_point_position;217,6523
+Lisp_Object internal_last_event_frame;228,7028
+static Lisp_Object read_key_sequence_cmd;232,7168
+static Lisp_Object read_key_sequence_remapped;233,7210
+static FILE *dribble;dribble236,7310
+bool input_pending;239,7368
+static bool input_was_pending;287,10022
+static struct input_event kbd_buffer[kbd_buffer291,10107
+static struct input_event *kbd_fetch_ptr;kbd_fetch_ptr297,10386
+static struct input_event * volatile kbd_store_ptr;302,10601
+unsigned timers_run;320,11296
+struct timespec 
*input_available_clear_time;input_available_clear_time324,11408
+bool interrupt_input;328,11573
+bool interrupts_deferred;331,11671
+static struct timespec timer_idleness_start_time;335,11746
+static struct timespec timer_last_idleness_start_time;340,11916
+#define READABLE_EVENTS_DO_TIMERS_NOW  346,12046
+#define READABLE_EVENTS_FILTER_EVENTS  347,12094
+#define READABLE_EVENTS_IGNORE_SQUEEZABLES     348,12142
+kset_echo_string 392,14088
+kset_kbd_queue 397,14184
+kset_keyboard_translate_table 402,14276
+kset_last_prefix_arg 407,14399
+kset_last_repeatable_command 412,14504
+kset_local_function_key_map 417,14625
+kset_overriding_terminal_local_map 422,14744
+kset_real_last_command 427,14877
+kset_system_key_syms 432,14986
+echo_add_key 443,15249
+echo_char 527,17527
+echo_dash 541,17813
+echo_now 586,19140
+cancel_echoing 635,20614
+echo_length 648,20922
+echo_truncate 660,21253
+add_command_key 672,21582
+recursive_edit_1 697,22406
+record_auto_save 742,23848
+force_auto_save_soon 751,24016
+DEFUN ("recursive-edit", Frecursive_edit,recursive-edit759,24137
+recursive_edit_unwind 804,25747
+any_kboard_state 817,26013
+single_kboard_state 838,26665
+not_single_kboard_state 848,26803
+struct kboard_stack858,27065
+static struct kboard_stack *kboard_stack;kboard_stack864,27138
+push_kboard 867,27186
+pop_kboard 879,27375
+temporarily_switch_to_single_kboard 914,28263
+record_single_kboard_state 943,29437
+restore_kboard_configuration 952,29621
+cmd_error 970,30077
+cmd_error_internal 1024,31510
+DEFUN ("command-error-default-function", 
Fcommand_error_default_function,command-error-default-function1043,32030
+command_loop 1094,33916
+command_loop_2 1134,35135
+top_level_2 1146,35339
+top_level_1 1152,35417
+DEFUN ("top-level", Ftop_level,top-level1164,35787
+user_error 1183,36288
+DEFUN ("exit-recursive-edit", 
Fexit_recursive_edit,exit-recursive-edit1189,36429
+DEFUN ("abort-recursive-edit", 
Fabort_recursive_edit,abort-recursive-edit1201,36819
+tracking_off 1216,37281
+DEFUN ("internal--track-mouse", Ftrack_mouse,track-mouse1234,37816
+bool ignore_mouse_drag_p;1256,38392
+some_mouse_moved 1259,38441
+Lisp_Object last_undo_boundary;1287,39032
+command_loop_1 1294,39273
+read_menu_command 1649,50889
+adjust_point_for_property 1678,51617
+safe_run_hooks_1 1831,57339
+safe_run_hooks_error 1841,57569
+safe_run_hook_funcall 1878,58576
+safe_run_hooks 1893,59058
+int poll_suppress_count;1908,59397
+static struct atimer *poll_timer;poll_timer1915,59487
+poll_for_input_1 1919,59589
+poll_for_input 1930,59789
+start_polling 1942,60053
+input_polling_used 1979,61091
+stop_polling 1994,61390
+set_poll_suppress_count 2009,61759
+bind_polling_period 2029,62141
+make_ctrl_char 2048,62492
+show_help_echo 2113,64455
+static Lisp_Object help_form_saved_window_configs;2156,65638
+read_char_help_form_unwind 2158,65701
+#define STOP_POLLING   2166,65959
+#define RESUME_POLLING 2170,66084
+read_event_from_main_queue 2175,66229
+read_decoded_event_from_main_queue 2249,68417
+#define MAX_ENCODED_BYTES 2254,68664
+echo_keystrokes_p 2342,71556
+read_char 2376,72848
+record_menu_key 3225,98949
+help_char_p 3258,99674
+record_char 3273,99953
+save_getcjmp 3412,104235
+restore_getcjmp 3418,104326
+readable_events 3430,104697
+int stop_character EXTERNALLY_VISIBLE;3497,106437
+event_to_kboard 3500,106493
+kbd_buffer_nr_stored 3522,107142
+kbd_buffer_store_event 3534,107483
+kbd_buffer_store_event_hold 3550,108025
+kbd_buffer_unget_event 3684,111617
+#define INPUT_EVENT_POS_MAX 3698,112018
+#define INPUT_EVENT_POS_MIN 3701,112147
+position_to_Time 3706,112287
+Time_to_position 3716,112514
+gen_help_event 3738,113171
+kbd_buffer_store_help_event 3756,113611
+discard_mouse_events 3773,113976
+kbd_buffer_events_waiting 3803,114711
+clear_event 3823,115068
+kbd_buffer_get_event 3836,115408
+process_special_events 4258,127881
+swallow_events 4322,129705
+timer_start_idle 4339,130098
+timer_stop_idle 4355,130576
+timer_resume_idle 4363,130720
+struct input_event last_timer_event EXTERNALLY_VISIBLE;4372,130912
+Lisp_Object pending_funcalls;4377,131172
+decode_timer 4381,131293
+timer_check_2 4414,132246
+timer_check 4572,136817
+DEFUN ("current-idle-time", Fcurrent_idle_time,current-idle-time4607,137662
+static Lisp_Object accent_key_syms;4625,138239
+static Lisp_Object func_key_syms;4626,138275
+static Lisp_Object mouse_syms;4627,138309
+static Lisp_Object wheel_syms;4628,138340
+static Lisp_Object drag_n_drop_syms;4629,138371
+static const int lispy_accent_codes[lispy_accent_codes4634,138516
+static const char *const lispy_accent_keys[lispy_accent_keys4741,139878
+#define FUNCTION_KEY_OFFSET 4766,140314
+const char *const lispy_function_keys[lispy_function_keys4768,140347
+static const char *const 
lispy_multimedia_keys[lispy_multimedia_keys4962,148901
+static const char *const lispy_kana_keys[lispy_kana_keys5026,150135
+#define FUNCTION_KEY_OFFSET 5061,151751
+static const char *const lispy_function_keys[lispy_function_keys5065,151894
+#define ISO_FUNCTION_KEY_OFFSET 5149,154429
+static const char *const 
iso_lispy_function_keys[iso_lispy_function_keys5151,154469
+static Lisp_Object Vlispy_mouse_stem;5172,155328
+static const char *const lispy_wheel_names[lispy_wheel_names5174,155367
+static const char *const 
lispy_drag_n_drop_names[lispy_drag_n_drop_names5181,155619
+static short const scroll_bar_parts[scroll_bar_parts5189,155885
+static Lisp_Object button_down_location;5210,156910
+static int last_mouse_button;5215,157065
+static int last_mouse_x;5216,157095
+static int last_mouse_y;5217,157120
+static Time button_down_time;5218,157145
+static int double_click_count;5222,157229
+make_lispy_position 5228,157390
+toolkit_menubar_in_use 5456,163953
+make_scroll_bar_position 5469,164321
+make_lispy_event 5485,164967
+make_lispy_movement 6104,183531
+make_lispy_switch_frame 6131,184262
+make_lispy_focus_in 6137,184369
+make_lispy_focus_out 6145,184495
+parse_modifiers_uncached 6163,184945
+#define SINGLE_LETTER_MOD(6185,185465
+#undef SINGLE_LETTER_MOD6212,185906
+#define MULTI_LETTER_MOD(6214,185932
+#undef MULTI_LETTER_MOD6231,186400
+apply_modifiers_uncached 6273,187574
+static const char *const modifier_names[modifier_names6319,189193
+#define NUM_MOD_NAMES 6325,189399
+static Lisp_Object modifier_symbols;6327,189449
+lispy_modifier_list 6331,189586
+#define KEY_TO_CHAR(6353,190252
+parse_modifiers 6356,190328
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191517
+apply_modifiers 6422,192391
+reorder_modifiers 6491,194720
+modify_event_symbol 6536,196528
+DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199244
+parse_solitary_modifier 6695,201135
+#define SINGLE_LETTER_MOD(6701,201258
+#define MULTI_LETTER_MOD(6705,201343
+#undef SINGLE_LETTER_MOD6763,202641
+#undef MULTI_LETTER_MOD6764,202666
+lucid_event_type_list_p 6775,202889
+get_input_pending 6814,203960
+record_asynch_buffer_change 6834,204579
+gobble_input 6872,205702
+tty_read_avail_input 6967,208310
+handle_async_input 7149,214039
+process_pending_signals 7165,214359
+unblock_input_to 7177,214645
+unblock_input 7200,215277
+totally_unblock_input 7209,215445
+handle_input_available_signal 7217,215529
+deliver_input_available_signal 7226,215700
+struct user_signal_info7235,215865
+static struct user_signal_info *user_signals user_signals7250,216090
+add_user_signal 7253,216149
+handle_user_signal 7275,216598
+deliver_user_signal 7316,217558
+find_user_signal_name 7322,217659
+store_user_signal_events 7334,217841
+static Lisp_Object menu_bar_one_keymap_changed_items;7363,218416
+static Lisp_Object menu_bar_items_vector;7368,218630
+static int menu_bar_items_index;7369,218672
+static const char *separator_names[separator_names7372,218707
+menu_separator_name_p 7393,219148
+menu_bar_items 7426,219852
+Lisp_Object item_properties;7568,224603
+menu_bar_item 7571,224645
+menu_item_eval_property_1 7647,227175
+eval_dyn 7658,227465
+menu_item_eval_property 7666,227675
+parse_menu_item 7686,228341
+static Lisp_Object tool_bar_items_vector;7965,236336
+static Lisp_Object tool_bar_item_properties;7970,236510
+static int ntool_bar_items;7974,236606
+tool_bar_items 7990,237083
+process_tool_bar_item 8075,239892
+#define PROP(8112,240969
+set_prop 8114,241038
+parse_tool_bar_item 8167,242453
+#undef PROP8379,248844
+init_tool_bar_items 8387,248969
+append_tool_bar_item 8401,249261
+read_char_x_menu_prompt 8443,250771
+read_char_minibuf_menu_prompt 8503,252445
+#define PUSH_C_STR(8527,253014
+follow_key 8726,258553
+active_maps 8733,258695
+typedef struct keyremap8742,259021
+} keyremap;8754,259464
+access_keymap_keyremap 8764,259808
+keyremap_step 8811,261450
+test_undefined 8867,262934
+read_key_sequence 8916,264861
+read_key_sequence_vs 9826,295821
+DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297294
+DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299982
+detect_input_pending 9950,300488
+detect_input_pending_ignore_squeezables 9959,300654
+detect_input_pending_run_timers 9967,300870
+clear_input_pending 9985,301362
+requeued_events_pending_p 9997,301732
+DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301813
+DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302596
+DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303517
+DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303958
+DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304380
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304955
+DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305495
+DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306510
+DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307069
+DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307406
+DEFUN ("discard-input", Fdiscard_input,discard-input10203,308447
+DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308949
+stuff_buffered_input 10285,311045
+set_waiting_for_input 10323,312016
+clear_waiting_for_input 10337,312390
+handle_interrupt_signal 10351,312754
+deliver_interrupt_signal 10378,313642
+static int volatile force_quit_count;10387,313932
+handle_interrupt 10401,314414
+quit_throw_to_read_char 10541,318711
+DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319288
+DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320516
+DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321432
+DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322706
+DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323570
+DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324459
+DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325837
+DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327060
+init_kboard 10861,328214
+allocate_kboard 10893,329284
+wipe_kboard 10909,329637
+delete_kboard 10917,329751
+init_keyboard 10942,330281
+struct event_head11021,332696
+static const struct event_head head_table[head_table11027,332747
+syms_of_keyboard 11045,333577
+  DEFVAR_LISP ("internal--top-level-message"11058,333972
+  DEFVAR_LISP ("last-command-event"11312,342173
+  DEFVAR_LISP ("last-nonmenu-event"11315,342297
+  DEFVAR_LISP ("last-input-event"11321,342636
+  DEFVAR_LISP ("unread-command-events"11324,342730
+  DEFVAR_LISP ("unread-post-input-method-events"11332,343190
+  DEFVAR_LISP ("unread-input-method-events"11338,343529
+  DEFVAR_LISP ("meta-prefix-char"11346,343898
+  DEFVAR_KBOARD ("last-command"11351,344106
+  DEFVAR_KBOARD ("real-last-command"11368,344787
+  DEFVAR_KBOARD ("last-repeatable-command"11372,344973
+  DEFVAR_LISP ("this-command"11378,345261
+  DEFVAR_LISP ("real-this-command"11384,345498
+  DEFVAR_LISP ("this-command-keys-shift-translated"11388,345680
+  DEFVAR_LISP ("this-original-command"11396,346123
+  DEFVAR_INT ("auto-save-interval"11403,346520
+  DEFVAR_LISP ("auto-save-timeout"11408,346734
+  DEFVAR_LISP ("echo-keystrokes"11415,347079
+  DEFVAR_INT ("polling-period"11421,347350
+  DEFVAR_LISP ("double-click-time"11428,347693
+  DEFVAR_INT ("double-click-fuzz"11435,348029
+  DEFVAR_INT ("num-input-keys"11446,348519
+  DEFVAR_INT ("num-nonmacro-input-events"11452,348794
+  DEFVAR_LISP ("last-event-frame"11457,349032
+  DEFVAR_LISP ("tty-erase-char"11463,349311
+  DEFVAR_LISP ("help-char"11466,349434
+  DEFVAR_LISP ("help-event-list"11472,349717
+  DEFVAR_LISP ("help-form"11477,349928
+  DEFVAR_LISP ("prefix-help-command"11483,350176
+  DEFVAR_LISP ("top-level"11489,350454
+  DEFVAR_KBOARD ("keyboard-translate-table"11495,350675
+  DEFVAR_BOOL ("cannot-suspend"11511,351488
+  DEFVAR_BOOL ("menu-prompting"11516,351715
+  DEFVAR_LISP ("menu-prompt-more-char"11526,352145
+  DEFVAR_INT ("extra-keyboard-modifiers"11531,352391
+  DEFVAR_LISP ("deactivate-mark"11545,353117
+  DEFVAR_LISP ("pre-command-hook"11553,353486
+  DEFVAR_LISP ("post-command-hook"11560,353841
+  DEFVAR_LISP ("echo-area-clear-hook"11568,354204
+  DEFVAR_LISP ("lucid-menu-bar-dirty-flag"11574,354419
+  DEFVAR_LISP ("menu-bar-final-items"11578,354622
+  DEFVAR_LISP ("tool-bar-separator-image-expression"11583,354872
+  DEFVAR_KBOARD ("overriding-terminal-local-map"11589,355230
+  DEFVAR_LISP ("overriding-local-map"11598,355652
+  DEFVAR_LISP ("overriding-local-map-menu-flag"11607,356103
+  DEFVAR_LISP ("special-event-map"11613,356442
+  DEFVAR_LISP ("track-mouse"11617,356630
+  DEFVAR_KBOARD ("system-key-alist"11620,356757
+  DEFVAR_KBOARD ("local-function-key-map"11629,357138
+  DEFVAR_KBOARD ("input-decode-map"11658,358597
+  DEFVAR_LISP ("function-key-map"11675,359385
+  DEFVAR_LISP ("key-translation-map"11683,359801
+  DEFVAR_LISP ("deferred-action-list"11689,360145
+  DEFVAR_LISP ("deferred-action-function"11694,360393
+  DEFVAR_LISP ("delayed-warnings-list"11700,360692
+  DEFVAR_LISP ("timer-list"11708,361100
+  DEFVAR_LISP ("timer-idle-list"11712,361252
+  DEFVAR_LISP ("input-method-function"11716,361415
+  DEFVAR_LISP ("input-method-previous-message"11737,362384
+  DEFVAR_LISP ("show-help-function"11744,362745
+  DEFVAR_LISP ("disable-point-adjustment"11749,362977
+  DEFVAR_LISP ("global-disable-point-adjustment"11761,363527
+  DEFVAR_LISP ("minibuffer-message-timeout"11770,363893
+  DEFVAR_LISP ("throw-on-input"11775,364171
+  DEFVAR_LISP ("command-error-function"11781,364422
+  DEFVAR_LISP ("enable-disabled-menus-and-buttons"11790,364909
+  DEFVAR_LISP ("select-active-regions"11798,365236
+  DEFVAR_LISP ("saved-region-selection"11807,365628
+  DEFVAR_LISP ("selection-inhibit-update-commands"11815,366013
+  DEFVAR_LISP ("debug-on-event"11825,366554
+keys_of_keyboard 11841,367115
+mark_kboards 11916,370434
+  DEFVAR_LISP ("internal--top-level-message",\111058,333972
+  DEFVAR_LISP ("last-command-event",\111312,342173
+  DEFVAR_LISP ("last-nonmenu-event",\111315,342297
+  DEFVAR_LISP ("last-input-event",\111321,342636
+  DEFVAR_LISP ("unread-command-events",\111324,342730
+  DEFVAR_LISP ("unread-post-input-method-events",\111332,343190
+  DEFVAR_LISP ("unread-input-method-events",\111338,343529
+  DEFVAR_LISP ("meta-prefix-char",\111346,343898
+  DEFVAR_KBOARD ("last-command",\111351,344106
+  DEFVAR_KBOARD ("real-last-command",\111368,344787
+  DEFVAR_KBOARD ("last-repeatable-command",\111372,344973
+  DEFVAR_LISP ("this-command",\111378,345261
+  DEFVAR_LISP ("real-this-command",\111384,345498
+  DEFVAR_LISP ("this-command-keys-shift-translated",\111388,345680
+  DEFVAR_LISP ("this-original-command",\111396,346123
+  DEFVAR_INT ("auto-save-interval",\111403,346520
+  DEFVAR_LISP ("auto-save-timeout",\111408,346734
+  DEFVAR_LISP ("echo-keystrokes",\111415,347079
+  DEFVAR_INT ("polling-period",\111421,347350
+  DEFVAR_LISP ("double-click-time",\111428,347693
+  DEFVAR_INT ("double-click-fuzz",\111435,348029
+  DEFVAR_INT ("num-input-keys",\111446,348519
+  DEFVAR_INT ("num-nonmacro-input-events",\111452,348794
+  DEFVAR_LISP ("last-event-frame",\111457,349032
+  DEFVAR_LISP ("tty-erase-char",\111463,349311
+  DEFVAR_LISP ("help-char",\111466,349434
+  DEFVAR_LISP ("help-event-list",\111472,349717
+  DEFVAR_LISP ("help-form",\111477,349928
+  DEFVAR_LISP ("prefix-help-command",\111483,350176
+  DEFVAR_LISP ("top-level",\111489,350454
+  DEFVAR_KBOARD ("keyboard-translate-table",\111495,350675
+  DEFVAR_BOOL ("cannot-suspend",\111511,351488
+  DEFVAR_BOOL ("menu-prompting",\111516,351715
+  DEFVAR_LISP ("menu-prompt-more-char",\111526,352145
+  DEFVAR_INT ("extra-keyboard-modifiers",\111531,352391
+  DEFVAR_LISP ("deactivate-mark",\111545,353117
+  DEFVAR_LISP ("pre-command-hook",\111553,353486
+  DEFVAR_LISP ("post-command-hook",\111560,353841
+  DEFVAR_LISP ("echo-area-clear-hook",\111568,354204
+  DEFVAR_LISP ("lucid-menu-bar-dirty-flag",\111574,354419
+  DEFVAR_LISP ("menu-bar-final-items",\111578,354622
+  DEFVAR_LISP ("tool-bar-separator-image-expression",\111583,354872
+  DEFVAR_KBOARD ("overriding-terminal-local-map",\111589,355230
+  DEFVAR_LISP ("overriding-local-map",\111598,355652
+  DEFVAR_LISP ("overriding-local-map-menu-flag",\111607,356103
+  DEFVAR_LISP ("special-event-map",\111613,356442
+  DEFVAR_LISP ("track-mouse",\111617,356630
+  DEFVAR_KBOARD ("system-key-alist",\111620,356757
+  DEFVAR_KBOARD ("local-function-key-map",\111629,357138
+  DEFVAR_KBOARD ("input-decode-map",\111658,358597
+  DEFVAR_LISP ("function-key-map",\111675,359385
+  DEFVAR_LISP ("key-translation-map",\111683,359801
+  DEFVAR_LISP ("deferred-action-list",\111689,360145
+  DEFVAR_LISP ("deferred-action-function",\111694,360393
+  DEFVAR_LISP ("delayed-warnings-list",\111700,360692
+  DEFVAR_LISP ("timer-list",\111708,361100
+  DEFVAR_LISP ("timer-idle-list",\111712,361252
+  DEFVAR_LISP ("input-method-function",\111716,361415
+  DEFVAR_LISP ("input-method-previous-message",\111737,362384
+  DEFVAR_LISP ("show-help-function",\111744,362745
+  DEFVAR_LISP ("disable-point-adjustment",\111749,362977
+  DEFVAR_LISP ("global-disable-point-adjustment",\111761,363527
+  DEFVAR_LISP ("minibuffer-message-timeout",\111770,363893
+  DEFVAR_LISP ("throw-on-input",\111775,364171
+  DEFVAR_LISP ("command-error-function",\111781,364422
+  DEFVAR_LISP ("enable-disabled-menus-and-buttons",\111790,364909
+  DEFVAR_LISP ("select-active-regions",\111798,365236
+  DEFVAR_LISP ("saved-region-selection",\111807,365628
+  DEFVAR_LISP ("selection-inhibit-update-commands",\111815,366013
+  DEFVAR_LISP ("debug-on-event",\111825,366554
+
+c-src/emacs/src/lisp.h,20567
+#define EMACS_LISP_H22,800
+#define DECLARE_GDB_SYM(47,1421
+# define DEFINE_GDB_SYMBOL_BEGIN(49,1508
+# define DEFINE_GDB_SYMBOL_END(50,1578
+# define DEFINE_GDB_SYMBOL_BEGIN(52,1625
+# define DEFINE_GDB_SYMBOL_END(53,1702
+#undef min57,1790
+#undef max58,1801
+#define max(59,1812
+#define min(60,1854
+#define ARRAYELTS(63,1936
+#define GCTYPEBITS 67,2079
+DEFINE_GDB_SYMBOL_BEGIN GCTYPEBITS66,2037
+# define NONPOINTER_BITS 78,2567
+# define NONPOINTER_BITS 80,2600
+typedef int EMACS_INT;91,3023
+typedef unsigned int EMACS_UINT;92,3046
+#  define EMACS_INT_MAX 93,3079
+#  define pI 94,3111
+typedef long int EMACS_INT;96,3203
+typedef unsigned long EMACS_UINT;97,3231
+#  define EMACS_INT_MAX 98,3265
+#  define pI 99,3298
+typedef long long int EMACS_INT;103,3477
+typedef unsigned long long int EMACS_UINT;104,3510
+#  define EMACS_INT_MAX 105,3553
+#  define pI 106,3587
+enum {  BOOL_VECTOR_BITS_PER_CHAR 114,3804
+#define BOOL_VECTOR_BITS_PER_CHAR 115,3840
+typedef size_t bits_word;123,4165
+# define BITS_WORD_MAX 124,4191
+enum { BITS_PER_BITS_WORD 125,4223
+typedef unsigned char bits_word;127,4290
+# define BITS_WORD_MAX 128,4323
+enum { BITS_PER_BITS_WORD 129,4386
+    BITS_PER_CHAR 136,4570
+    BITS_PER_SHORT 137,4605
+    BITS_PER_LONG 138,4657
+    BITS_PER_EMACS_INT 139,4712
+typedef intmax_t printmax_t;148,5089
+typedef uintmax_t uprintmax_t;149,5118
+# define pMd 150,5149
+# define pMu 151,5170
+typedef EMACS_INT printmax_t;153,5197
+typedef EMACS_UINT uprintmax_t;154,5227
+# define pMd 155,5259
+# define pMu 156,5278
+# define pD 165,5664
+# define pD 167,5709
+# define pD 169,5756
+# define pD 171,5779
+# define eassert(200,7062
+# define eassume(201,7140
+# define eassert(208,7319
+# define eassume(212,7450
+enum Lisp_Bits239,8519
+#define GCALIGNMENT 243,8647
+    VALBITS 246,8742
+    INTTYPEBITS 249,8838
+    FIXNUM_BITS 252,8945
+#define VAL_MAX 263,9327
+#define USE_LSB_TAG 271,9777
+DEFINE_GDB_SYMBOL_BEGIN USE_LSB_TAG270,9733
+# define alignas(281,10077
+# define GCALIGNED 288,10227
+# define GCALIGNED 290,10292
+# define lisp_h_XLI(327,11642
+# define lisp_h_XIL(328,11673
+# define lisp_h_XLI(330,11724
+# define lisp_h_XIL(331,11751
+#define lisp_h_CHECK_LIST_CONS(333,11785
+#define lisp_h_CHECK_NUMBER(334,11856
+#define lisp_h_CHECK_SYMBOL(335,11927
+#define lisp_h_CHECK_TYPE(336,11996
+#define lisp_h_CONSP(338,12107
+#define lisp_h_EQ(339,12156
+#define lisp_h_FLOATP(340,12201
+#define lisp_h_INTEGERP(341,12252
+#define lisp_h_MARKERP(342,12333
+#define lisp_h_MISCP(343,12408
+#define lisp_h_NILP(344,12457
+#define lisp_h_SET_SYMBOL_VAL(345,12493
+#define lisp_h_SYMBOL_CONSTANT_P(347,12607
+#define lisp_h_SYMBOL_VAL(348,12671
+#define lisp_h_SYMBOLP(350,12772
+#define lisp_h_VECTORLIKEP(351,12825
+#define lisp_h_XCAR(352,12886
+#define lisp_h_XCDR(353,12924
+#define lisp_h_XCONS(354,12964
+#define lisp_h_XHASH(356,13059
+#define lisp_h_XPNTR(357,13093
+# define lisp_h_check_cons_list(360,13221
+# define lisp_h_make_number(363,13289
+# define lisp_h_XFASTINT(365,13392
+# define lisp_h_XINT(366,13429
+# define lisp_h_XSYMBOL(367,13478
+# define lisp_h_XTYPE(371,13631
+# define lisp_h_XUNTAG(372,13696
+# define XLI(381,14086
+# define XIL(382,14117
+# define CHECK_LIST_CONS(383,14148
+# define CHECK_NUMBER(384,14209
+# define CHECK_SYMBOL(385,14258
+# define CHECK_TYPE(386,14307
+# define CONSP(387,14382
+# define EQ(388,14417
+# define FLOATP(389,14452
+# define INTEGERP(390,14489
+# define MARKERP(391,14530
+# define MISCP(392,14569
+# define NILP(393,14604
+# define SET_SYMBOL_VAL(394,14637
+# define SYMBOL_CONSTANT_P(395,14700
+# define SYMBOL_VAL(396,14763
+# define SYMBOLP(397,14812
+# define VECTORLIKEP(398,14851
+# define XCAR(399,14898
+# define XCDR(400,14931
+# define XCONS(401,14964
+# define XHASH(402,14999
+# define XPNTR(403,15034
+#  define check_cons_list(405,15097
+#  define make_number(408,15176
+#  define XFASTINT(409,15224
+#  define XINT(410,15266
+#  define XSYMBOL(411,15300
+#  define XTYPE(412,15340
+#  define XUNTAG(413,15376
+#define LISP_MACRO_DEFUN(421,15672
+#define LISP_MACRO_DEFUN_VOID(425,15845
+#define INTMASK 437,16289
+#define case_Lisp_Int 438,16342
+#define ENUM_BF(445,16681
+#define ENUM_BF(447,16722
+enum Lisp_Type451,16763
+    Lisp_Symbol 454,16851
+    Lisp_Misc 458,16993
+    Lisp_Int0 461,17067
+    Lisp_Int1 462,17086
+    Lisp_String 466,17264
+    Lisp_Vectorlike 472,17543
+    Lisp_Cons 475,17632
+    Lisp_Float 477,17670
+enum Lisp_Misc_Type485,18016
+    Lisp_Misc_Free 487,18040
+    Lisp_Misc_Marker,488,18069
+    Lisp_Misc_Overlay,489,18091
+    Lisp_Misc_Save_Value,490,18114
+    Lisp_Misc_Finalizer,491,18140
+    Lisp_Misc_Float,494,18275
+    Lisp_Misc_Limit496,18359
+enum Lisp_Fwd_Type502,18543
+    Lisp_Fwd_Int,504,18566
+    Lisp_Fwd_Bool,505,18619
+    Lisp_Fwd_Obj,506,18670
+    Lisp_Fwd_Buffer_Obj,507,18729
+    Lisp_Fwd_Kboard_Obj        508,18800
+typedef struct { EMACS_INT i; } Lisp_Object;567,21781
+#define LISP_INITIALLY(569,21827
+#undef CHECK_LISP_OBJECT_TYPE571,21858
+enum CHECK_LISP_OBJECT_TYPE 572,21888
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE 572,21888
+typedef EMACS_INT Lisp_Object;577,22064
+#define LISP_INITIALLY(578,22095
+enum CHECK_LISP_OBJECT_TYPE 579,22125
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE 579,22125
+#define LISP_INITIALLY_ZERO 582,22226
+enum symbol_interned639,24199
+  SYMBOL_UNINTERNED 641,24222
+  SYMBOL_INTERNED 642,24247
+  SYMBOL_INTERNED_IN_INITIAL_OBARRAY 643,24270
+enum symbol_redirect646,24315
+  SYMBOL_PLAINVAL 648,24338
+  SYMBOL_VARALIAS 649,24362
+  SYMBOL_LOCALIZED 650,24386
+  SYMBOL_FORWARDED 651,24410
+struct Lisp_Symbol654,24437
+  ENUM_BF 663,24793
+#define EXFUN(707,26252
+#define DEFUN_ARGS_MANY        712,26446
+#define DEFUN_ARGS_UNEVALLED   713,26498
+#define DEFUN_ARGS_0   714,26541
+#define DEFUN_ARGS_1   715,26569
+#define DEFUN_ARGS_2   716,26604
+#define DEFUN_ARGS_3   717,26652
+#define DEFUN_ARGS_4   718,26713
+#define DEFUN_ARGS_5   719,26787
+#define DEFUN_ARGS_6   721,26880
+#define DEFUN_ARGS_7   723,26986
+#define DEFUN_ARGS_8   725,27105
+#define TAG_PTR(729,27296
+#define TAG_SYMOFFSET(734,27543
+#define XLI_BUILTIN_LISPSYM(741,27842
+#define DEFINE_LISP_SYMBOL(746,28101
+# define DEFINE_NON_NIL_Q_SYMBOL_MACROS 755,28572
+LISP_MACRO_DEFUN 762,28777
+# define ARRAY_MARK_FLAG 768,29024
+# define PSEUDOVECTOR_FLAG 774,29267
+enum pvec_type780,29568
+  PVEC_NORMAL_VECTOR,782,29585
+  PVEC_FREE,783,29607
+  PVEC_PROCESS,784,29620
+  PVEC_FRAME,785,29636
+  PVEC_WINDOW,786,29650
+  PVEC_BOOL_VECTOR,787,29665
+  PVEC_BUFFER,788,29685
+  PVEC_HASH_TABLE,789,29700
+  PVEC_TERMINAL,790,29719
+  PVEC_WINDOW_CONFIGURATION,791,29736
+  PVEC_SUBR,792,29765
+  PVEC_OTHER,793,29778
+  PVEC_COMPILED,795,29856
+  PVEC_CHAR_TABLE,796,29873
+  PVEC_SUB_CHAR_TABLE,797,29892
+  PVEC_FONT 798,29915
+enum More_Lisp_Bits801,29991
+    PSEUDOVECTOR_SIZE_BITS 808,30382
+    PSEUDOVECTOR_SIZE_MASK 809,30415
+    PSEUDOVECTOR_REST_BITS 813,30625
+    PSEUDOVECTOR_REST_MASK 814,30658
+    PSEUDOVECTOR_AREA_BITS 818,30823
+    PVEC_TYPE_MASK 819,30901
+# define VALMASK 829,31302
+DEFINE_GDB_SYMBOL_BEGIN VALMASK828,31257
+#define MOST_POSITIVE_FIXNUM 834,31532
+#define MOST_NEGATIVE_FIXNUM 835,31592
+XINT 874,32684
+XFASTINT 889,33035
+XSYMBOL 899,33263
+XTYPE 910,33481
+XUNTAG 918,33661
+LISP_MACRO_DEFUN 927,33857
+LISP_MACRO_DEFUN 940,34242
+#define FIXNUM_OVERFLOW_P(958,34855
+LISP_MACRO_DEFUN FIXNUM_OVERFLOW_P952,34632
+LISP_MACRO_DEFUN 970,35171
+XSTRING 980,35391
+#define SYMBOL_INDEX(988,35575
+XFLOAT 991,35636
+XPROCESS 1000,35778
+XWINDOW 1007,35895
+XTERMINAL 1014,36012
+XSUBR 1021,36134
+XBUFFER 1028,36245
+XCHAR_TABLE 1035,36369
+XSUB_CHAR_TABLE 1042,36506
+XBOOL_VECTOR 1049,36648
+make_lisp_ptr 1058,36827
+make_lisp_symbol 1066,37013
+builtin_lisp_symbol 1074,37197
+#define XSETINT(1079,37279
+#define XSETFASTINT(1080,37325
+#define XSETCONS(1081,37375
+#define XSETVECTOR(1082,37435
+#define XSETSTRING(1083,37503
+#define XSETSYMBOL(1084,37567
+#define XSETFLOAT(1085,37621
+#define XSETMISC(1086,37683
+#define XSETPVECTYPE(1090,37772
+#define XSETPVECTYPESIZE(1092,37888
+#define XSETPSEUDOVECTOR(1099,38185
+#define XSETTYPED_PSEUDOVECTOR(1105,38369
+#define XSETWINDOW_CONFIGURATION(1110,38579
+#define XSETPROCESS(1112,38675
+#define XSETWINDOW(1113,38741
+#define XSETTERMINAL(1114,38805
+#define XSETSUBR(1115,38873
+#define XSETCOMPILED(1116,38933
+#define XSETBUFFER(1117,39001
+#define XSETCHAR_TABLE(1118,39065
+#define XSETBOOL_VECTOR(1119,39137
+#define XSETSUB_CHAR_TABLE(1120,39211
+XINTPTR 1128,39581
+make_pointer_integer 1134,39661
+LISP_MACRO_DEFUN_VOID 1143,39826
+typedef struct interval *INTERVAL;INTERVAL1149,39987
+xcar_addr 1174,40760
+xcdr_addr 1179,40837
+LISP_MACRO_DEFUN 1185,40931
+XSETCDR 1198,41307
+CAR 1205,41457
+CDR 1212,41591
+CAR_SAFE 1221,41791
+CDR_SAFE 1226,41877
+STRING_MULTIBYTE 1243,42250
+#define STRING_BYTES_BOUND 1261,43057
+#define STRING_SET_UNIBYTE(1265,43201
+#define STRING_SET_MULTIBYTE(1275,43516
+SDATA 1286,43830
+SSDATA 1291,43908
+SREF 1297,44037
+SSET 1302,44128
+SCHARS 1307,44242
+STRING_BYTES 1316,44415
+SBYTES 1326,44595
+STRING_SET_CHARS 1331,44681
+struct vectorlike_header1343,45232
+struct Lisp_Vector1369,46482
+    ALIGNOF_STRUCT_LISP_VECTOR1378,46681
+struct Lisp_Bool_Vector1384,46864
+bool_vector_size 1399,47385
+bool_vector_data 1407,47523
+bool_vector_uchar_data 1413,47617
+bool_vector_words 1421,47803
+bool_vector_bytes 1428,47998
+bool_vector_bitref 1437,48238
+bool_vector_ref 1445,48478
+bool_vector_set 1453,48618
+    header_size 1471,49047
+    bool_header_size 1472,49106
+    word_size 1473,49171
+AREF 1479,49284
+aref_addr 1485,49391
+ASIZE 1491,49501
+ASET 1497,49583
+gc_aset 1504,49742
+enum { NIL_IS_ZERO 1515,50269
+memclear 1520,50464
+#define VECSIZE(1531,50762
+#define PSEUDOVECSIZE(1538,51047
+#define UNSIGNED_CMP(1546,51480
+#define ASCII_CHAR_P(1552,51734
+enum CHARTAB_SIZE_BITS1565,52489
+    CHARTAB_SIZE_BITS_0 1567,52516
+    CHARTAB_SIZE_BITS_1 1568,52545
+    CHARTAB_SIZE_BITS_2 1569,52574
+    CHARTAB_SIZE_BITS_3 1570,52603
+struct Lisp_Char_Table1575,52672
+struct Lisp_Sub_Char_Table1606,53752
+CHAR_TABLE_REF_ASCII 1628,54566
+CHAR_TABLE_REF 1648,55113
+CHAR_TABLE_SET 1658,55402
+struct Lisp_Subr1670,55786
+enum char_table_specials1692,56798
+    CHAR_TABLE_STANDARD_SLOTS 1697,56993
+    SUB_CHAR_TABLE_OFFSET 1701,57214
+CHAR_TABLE_EXTRA_SLOTS 1707,57377
+LISP_MACRO_DEFUN 1723,57921
+SYMBOL_BLV 1732,58181
+SYMBOL_FWD 1738,58316
+LISP_MACRO_DEFUN_VOID 1744,58428
+SET_SYMBOL_BLV 1754,58691
+SET_SYMBOL_FWD 1760,58850
+SYMBOL_NAME 1767,59001
+SYMBOL_INTERNED_P 1775,59130
+SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P 1783,59299
+#define DEFSYM(1796,59809
+LISP_MACRO_DEFUN DEFSYM1792,59630
+struct hash_table_test1805,60062
+struct Lisp_Hash_Table1823,60555
+XHASH_TABLE 1880,62531
+#define XSET_HASH_TABLE(1885,62602
+HASH_TABLE_P 1889,62703
+HASH_KEY 1896,62860
+HASH_VALUE 1903,63040
+HASH_NEXT 1911,63254
+HASH_HASH 1918,63431
+HASH_INDEX 1926,63677
+HASH_TABLE_SIZE 1933,63826
+enum DEFAULT_HASH_SIZE 1940,63956
+enum DEFAULT_HASH_SIZE { DEFAULT_HASH_SIZE 1940,63956
+static double const DEFAULT_REHASH_THRESHOLD 1946,64176
+static double const DEFAULT_REHASH_SIZE 1950,64299
+sxhash_combine 1956,64465
+SXHASH_REDUCE 1964,64648
+struct Lisp_Misc_Any   1971,64806
+  ENUM_BF 1973,64866
+struct Lisp_Marker1978,64980
+  ENUM_BF 1980,65001
+struct Lisp_Overlay2021,66838
+    ENUM_BF 2034,67346
+    SAVE_UNUSED,2047,67641
+    SAVE_INTEGER,2048,67658
+    SAVE_FUNCPOINTER,2049,67676
+    SAVE_POINTER,2050,67698
+    SAVE_OBJECT2051,67716
+enum { SAVE_SLOT_BITS 2055,67801
+enum { SAVE_VALUE_SLOTS 2058,67898
+enum { SAVE_TYPE_BITS 2062,68006
+enum Lisp_Save_Type2064,68072
+    SAVE_TYPE_INT_INT 2066,68096
+    SAVE_TYPE_INT_INT_INT2067,68169
+    SAVE_TYPE_OBJ_OBJ 2069,68259
+    SAVE_TYPE_OBJ_OBJ_OBJ 2070,68330
+    SAVE_TYPE_OBJ_OBJ_OBJ_OBJ2071,68411
+    SAVE_TYPE_PTR_INT 2073,68506
+    SAVE_TYPE_PTR_OBJ 2074,68579
+    SAVE_TYPE_PTR_PTR 2075,68651
+    SAVE_TYPE_FUNCPTR_PTR_OBJ2076,68724
+    SAVE_TYPE_MEMORY 2080,68882
+typedef void (*voidfuncptr)voidfuncptr2108,69836
+struct Lisp_Save_Value2110,69873
+    ENUM_BF 2112,69900
+save_type 2134,70752
+XSAVE_POINTER 2143,70982
+set_save_pointer 2149,71144
+XSAVE_FUNCPOINTER 2155,71326
+XSAVE_INTEGER 2164,71546
+set_save_integer 2170,71708
+XSAVE_OBJECT 2179,71929
+struct Lisp_Finalizer2186,72106
+struct Lisp_Free2201,72581
+    ENUM_BF 2203,72602
+union Lisp_Misc2212,72882
+XMISC 2223,73181
+XMISCANY 2229,73270
+XMISCTYPE 2236,73379
+XMARKER 2242,73467
+XOVERLAY 2249,73582
+XSAVE_VALUE 2256,73703
+XFINALIZER 2263,73832
+struct Lisp_Intfwd2274,74117
+struct Lisp_Boolfwd2284,74411
+struct Lisp_Objfwd2294,74702
+struct Lisp_Buffer_Objfwd2302,74934
+struct Lisp_Buffer_Local_Value2334,76470
+struct Lisp_Kboard_Objfwd2362,77729
+union Lisp_Fwd2368,77838
+XFWDTYPE 2378,78084
+XBUFFER_OBJFWD 2384,78180
+struct Lisp_Float2391,78316
+XFLOAT_DATA 2401,78434
+    IEEE_FLOATING_POINT2415,78943
+#define _UCHAR_T2423,79266
+typedef unsigned char UCHAR;2424,79283
+enum Lisp_Compiled2429,79366
+    COMPILED_ARGLIST 2431,79389
+    COMPILED_BYTECODE 2432,79415
+    COMPILED_CONSTANTS 2433,79442
+    COMPILED_STACK_DEPTH 2434,79470
+    COMPILED_DOC_STRING 2435,79500
+    COMPILED_INTERACTIVE 2436,79529
+enum char_bits2443,79831
+    CHAR_ALT 2445,79850
+    CHAR_SUPER 2446,79876
+    CHAR_HYPER 2447,79904
+    CHAR_SHIFT 2448,79932
+    CHAR_CTL 2449,79960
+    CHAR_META 2450,79986
+    CHAR_MODIFIER_MASK 2452,80014
+    CHARACTERBITS 2457,80209
+LISP_MACRO_DEFUN 2462,80267
+NATNUMP 2470,80409
+RANGED_INTEGERP 2476,80490
+#define TYPE_RANGED_INTEGERP(2481,80612
+LISP_MACRO_DEFUN 2486,80797
+VECTORP 2500,81270
+OVERLAYP 2505,81373
+SAVE_VALUEP 2510,81472
+FINALIZERP 2516,81578
+AUTOLOADP 2522,81682
+BUFFER_OBJFWDP 2528,81773
+PSEUDOVECTOR_TYPEP 2534,81871
+PSEUDOVECTORP 2542,82124
+WINDOW_CONFIGURATIONP 2558,82476
+PROCESSP 2564,82586
+WINDOWP 2570,82670
+TERMINALP 2576,82752
+SUBRP 2582,82838
+COMPILEDP 2588,82916
+BUFFERP 2594,83002
+CHAR_TABLE_P 2600,83084
+SUB_CHAR_TABLE_P 2606,83175
+BOOL_VECTOR_P 2612,83274
+FRAMEP 2618,83367
+IMAGEP 2625,83484
+ARRAYP 2632,83589
+CHECK_LIST 2638,83708
+LISP_MACRO_DEFUN_VOID 2643,83789
+CHECK_STRING_CAR 2653,84086
+CHECK_CONS 2658,84190
+CHECK_VECTOR 2663,84270
+CHECK_BOOL_VECTOR 2668,84356
+CHECK_VECTOR_OR_STRING 2674,84533
+CHECK_ARRAY 2683,84707
+CHECK_BUFFER 2688,84815
+CHECK_WINDOW 2693,84901
+CHECK_PROCESS 2699,85007
+CHECK_NATNUM 2705,85103
+#define CHECK_RANGED_INTEGER(2710,85180
+#define CHECK_TYPE_RANGED_INTEGER(2721,85563
+#define CHECK_NUMBER_COERCE_MARKER(2729,85833
+XFLOATINT 2738,86086
+CHECK_NUMBER_OR_FLOAT 2744,86157
+#define CHECK_NUMBER_OR_FLOAT_COERCE_MARKER(2749,86256
+CHECK_NUMBER_CAR 2760,86666
+CHECK_NUMBER_CDR 2768,86788
+#define DEFUN(2803,88383
+#define DEFUN(2812,88851
+FUNCTIONP 2822,89206
+enum maxargs2831,89401
+    MANY 2833,89418
+    UNEVALLED 2834,89433
+#define CALLMANY(2838,89536
+#define CALLN(2844,89889
+#define DEFVAR_LISP(2869,91094
+#define DEFVAR_LISP_NOPRO(2874,91266
+#define DEFVAR_BOOL(2879,91448
+#define DEFVAR_INT(2884,91621
+#define DEFVAR_BUFFER_DEFAULTS(2890,91792
+#define DEFVAR_KBOARD(2896,91996
+typedef jmp_buf sys_jmp_buf;2906,92320
+# define sys_setjmp(2907,92349
+# define sys_longjmp(2908,92384
+typedef sigjmp_buf sys_jmp_buf;2910,92456
+# define sys_setjmp(2911,92488
+# define sys_longjmp(2912,92528
+typedef jmp_buf sys_jmp_buf;2916,92687
+# define sys_setjmp(2917,92716
+# define sys_longjmp(2918,92750
+enum specbind_tag 2943,93802
+  SPECPDL_UNWIND,2944,93822
+  SPECPDL_UNWIND_PTR,2945,93891
+  SPECPDL_UNWIND_INT,2946,93942
+  SPECPDL_UNWIND_VOID,2947,93990
+  SPECPDL_BACKTRACE,2948,94044
+  SPECPDL_LET,2949,94102
+  SPECPDL_LET_LOCAL,2951,94232
+  SPECPDL_LET_DEFAULT  2952,94289
+union specbinding2955,94361
+    ENUM_BF 2957,94383
+      ENUM_BF 2959,94440
+      ENUM_BF 2964,94570
+      ENUM_BF 2969,94693
+      ENUM_BF 2974,94811
+      ENUM_BF 2978,94916
+      ENUM_BF 2983,95091
+enum handlertype 3021,96407
+enum handlertype { CATCHER,3021,96407
+enum handlertype { CATCHER, CONDITION_CASE 3021,96407
+struct handler3023,96454
+#define PUSH_HANDLER(3053,97443
+#define QUIT   3101,99220
+#define QUITP 3112,99470
+struct gcpro3132,100313
+#define GC_USE_GCPROS_AS_BEFORE        3171,101294
+#define GC_MAKE_GCPROS_NOOPS   3172,101329
+#define GC_MARK_STACK_CHECK_GCPROS     3173,101361
+#define GC_USE_GCPROS_CHECK_ZOMBIES    3174,101398
+#define GC_MARK_STACK 3177,101459
+#define BYTE_MARK_STACK 3181,101559
+#define GCPRO1(3190,101830
+#define GCPRO2(3191,101870
+#define GCPRO3(3192,101936
+#define GCPRO4(3194,102031
+#define GCPRO5(3196,102151
+#define GCPRO6(3198,102296
+#define GCPRO7(3201,102471
+#define UNGCPRO 3202,102550
+#define GCPRO1(3208,102650
+#define GCPRO2(3212,102772
+#define GCPRO3(3217,102964
+#define GCPRO4(3223,103226
+#define GCPRO5(3230,103557
+#define GCPRO6(3238,103958
+#define GCPRO7(3247,104428
+#define UNGCPRO 3257,104968
+#define GCPRO1(3263,105062
+#define GCPRO2(3269,105296
+#define GCPRO3(3278,105714
+#define GCPRO4(3289,106271
+#define GCPRO5(3302,106969
+#define GCPRO6(3317,107809
+#define GCPRO7(3334,108790
+#define UNGCPRO        3353,109913
+#define RETURN_UNGCPRO(3363,110180
+vcopy 3384,110654
+set_hash_key_slot 3393,110929
+set_hash_value_slot 3399,111068
+set_symbol_function 3408,111303
+set_symbol_plist 3414,111418
+set_symbol_next 3420,111521
+blv_found 3428,111694
+set_overlay_plist 3437,111877
+string_intervals 3445,112028
+set_string_intervals 3453,112150
+set_char_table_defalt 3462,112352
+set_char_table_purpose 3467,112464
+set_char_table_extras 3475,112633
+set_char_table_contents 3482,112842
+set_sub_char_table_contents 3489,113037
+enum Arith_Comparison 3497,113300
+  ARITH_EQUAL,3498,113324
+  ARITH_NOTEQUAL,3499,113339
+  ARITH_LESS,3500,113357
+  ARITH_GRTR,3501,113371
+  ARITH_LESS_OR_EQUAL,3502,113385
+  ARITH_GRTR_OR_EQUAL3503,113408
+#define INTEGER_TO_CONS(3511,113759
+#define CONS_TO_INTEGER(3529,114622
+enum { NEXT_ALMOST_PRIME_LIMIT 3573,116326
+extern EMACS_INT next_almost_prime 3574,116365
+enum constype 3739,123817
+enum constype {CONSTYPE_HEAP,CONSTYPE_HEAP3739,123817
+enum constype {CONSTYPE_HEAP, CONSTYPE_PURE}CONSTYPE_PURE3739,123817
+list2i 3745,124007
+list3i 3751,124116
+list4i 3757,124255
+extern Lisp_Object make_formatted_string 3767,124631
+build_pure_c_string 3792,125659
+build_string 3801,125864
+make_uninit_vector 3820,126435
+make_uninit_sub_char_table 3833,126654
+#define ALLOCATE_PSEUDOVECTOR(3850,127198
+#define ALLOCATE_ZEROED_PSEUDOVECTOR(3858,127534
+INLINE void 3890,128940
+extern void *r_alloc r_alloc3895,129061
+#define FLOAT_TO_STRING_BUFSIZE 3927,130524
+intern 3968,132131
+intern_c_string 3974,132219
+extern _Noreturn void error 4034,135598
+fast_string_match_ignore_case 4136,140086
+INLINE void fixup_locale 4241,143851
+INLINE void synchronize_system_messages_locale 4242,143886
+INLINE void synchronize_system_time_locale 4243,143943
+#define IS_DAEMON 4257,144416
+#define DAEMON_RUNNING 4258,144456
+#define IS_DAEMON 4261,144555
+#define DAEMON_RUNNING 4262,144600
+# define WAIT_READING_MAX 4281,145419
+# define WAIT_READING_MAX 4283,145491
+extern _Noreturn void emacs_abort 4374,148383
+egetenv 4532,152806
+#define eabs(4545,153302
+#define make_fixnum_or_float(4550,153435
+enum MAX_ALLOCA 4556,153686
+enum MAX_ALLOCA { MAX_ALLOCA 4556,153686
+extern void *record_xmalloc record_xmalloc4558,153731
+#define USE_SAFE_ALLOCA        4560,153797
+#define AVAIL_ALLOCA(4564,153930
+#define SAFE_ALLOCA(4568,154041
+#define SAFE_NALLOCA(4576,154382
+#define SAFE_ALLOCA_STRING(4590,154858
+#define SAFE_FREE(4598,155110
+#define SAFE_ALLOCA_LISP(4625,155688
+# define USE_STACK_LISP_OBJECTS 4652,156810
+# undef USE_STACK_LISP_OBJECTS4658,156976
+# define USE_STACK_LISP_OBJECTS 4659,157007
+enum { defined_GC_CHECK_STRING_BYTES 4663,157082
+enum { defined_GC_CHECK_STRING_BYTES 4665,157135
+union Aligned_Cons4670,157269
+union Aligned_String4676,157349
+    USE_STACK_CONS 4689,157704
+    USE_STACK_STRING 4691,157810
+#define STACK_CONS(4699,158147
+#define AUTO_CONS_EXPR(4701,158244
+#define AUTO_CONS(4709,158607
+#define AUTO_LIST1(4710,158678
+#define AUTO_LIST2(4712,158786
+#define AUTO_LIST3(4716,158941
+#define AUTO_LIST4(4720,159116
+# define verify_ascii(4732,159507
+#define AUTO_STRING(4740,159815
+#define FOR_EACH_TAIL(4752,160279
+#define FOR_EACH_ALIST_VALUE(4766,160770
+maybe_gc 4774,161057
+functionp 4784,161296
+
+c-src/machsyscalls.c,23
+#define        SYSCALL(6,113
+
+c-src/machsyscalls.h,159
+SYSCALL (mach_msg_trap,1,0
+SYSCALL (mach_reply_port,13,314
+SYSCALL (mach_thread_self,18,377
+SYSCALL (mach_task_self,23,441
+SYSCALL (mach_host_self,28,503
+
+c-src/h.h,1850
+   ELEM_I/ELEM_I3,15
+} Fails_t;5,85
+typedef void Lang_function 6,96
+typedef struct tpcmd8,147
+#define ggg 10,170
+tpcmd;15,209
+typedef struct foobar2_ 16,216
+} foobar2;20,307
+    DEVICE_SWP,23,333
+    DEVICE_LAST24,349
+} bsp_DevId;25,365
+  struct constant_args 27,394
+} args;30,457
+typedef int *regset;regset31,465
+typedef int INT;32,486
+typedef union abc33,503
+} ghi1;36,534
+typedef union abc 37,542
+} ghi2;39,573
+typedef struct a 40,581
+} b;41,600
+#define c(42,605
+typedef struct an_extern_linkage 
*an_extern_linkage_ptr;an_extern_linkage_ptr43,619
+typedef struct an_extern_linkage 44,676
+} an_extern_linkage;56,1054
+typedef struct pollfd   pfdset[pfdset57,1075
+typedef union rtunion_def58,1119
+  } womboid 63,1206
+typedef union rtunion_def64,1220
+womboid75,1330
+enum {dog,dog81,1416
+enum {dog, cat}cat81,1416
+enum {dog, cat} animals;81,1416
+typedef void (_CALLBACK_ *signal_handler)signal_handler82,1441
+typedef void (_CALLBACK_ *signal_handler1)signal_handler183,1489
+/* comment */ #define ANSIC84,1538
+ #define ANSIC85,1566
+typedef void (proc)87,1588
+typedef void OperatorFun(88,1612
+typedef int f(89,1648
+struct my_struct 91,1691
+typedef struct my_struct my_typedef;93,1713
+typedef RETSIGTYPE (*signal_handler_t)signal_handler_t94,1750
+  Date 04 May 87 235311 PDT 96,1802
+typedef unsigned char unchar;99,1880
+typedef int X,100,1910
+typedef int X, Y,100,1910
+typedef int X, Y, Z;100,1910
+typedef mio mao;101,1931
+typedef struct a 103,1966
+typedef struct a { } b;103,1966
+typedef struct b104,1990
+} c;106,2009
+int extvar;109,2053
+#define tag1110,2065
+#define aaaaaa 111,2078
+#define bbbbbb\bbbbbb113,2102
+#define cccccccccc115,2125
+#define enter_critical_section 116,2144
+#define exit_critical_to_previous      117,2199
+#define UNDEFINED118,2259
+struct re_pattern_buffer 119,2277
+
+cp-src/c.C,2225
+template <typename ipc3dIslandHierarchy,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType, unsigned 
numOfChannels,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType, unsigned 
numOfChannels, typename ipc3dLinkControl,1,0
+class CMultiChannelCSC19_3D2,151
+        void execute(CMultiChannelCSC19_3D::execute11,493
+int main 25,1026
+double base 26,1088
+typedef struct s1 32,1251
+} t1;34,1287
+struct s2 35,1293
+typedef struct s2 t2;38,1324
+class A 39,1346
+  enum { rosso,A::rosso40,1356
+  enum { rosso, giallo,A::giallo40,1356
+  enum { rosso, giallo, verde A::verde40,1356
+const A& A::operator+(43,1431
+void operator+(44,1467
+void operator -(operator -45,1495
+void operator int(operator int46,1524
+A<int>* f(48,1556
+int f(49,1571
+int A<int>::f(f50,1590
+A<float,B<int> > A<B<float>,int>::f(f51,1618
+template <class C, int n> class AT 52,1668
+class AU 53,1716
+class B<B54,1735
+class B<int> { void f(B::f54,1735
+const A::B::T& abt 55,1765
+class A 56,1791
+class A { class B A::B56,1791
+class A 57,1826
+  A operator+(A::operator+59,1860
+is_muldiv_operation(61,1887
+domain foo 68,1955
+     void f(foo::f69,1968
+void A::A(72,1989
+struct A 73,2004
+struct B 74,2022
+void B::B(75,2041
+void BE_Node::BE_Node(76,2056
+class BE_Node 77,2083
+struct foo 79,2102
+class test 86,2156
+  int f(test::f87,2169
+  int ff(test::ff89,2231
+  int g(test::g90,2254
+class  AST_Root 92,2278
+AST_ConcreteType::AST_ConcreteType(99,2393
+AST_Array::AST_Array(107,2532
+     void f(::f115,2733
+struct A 117,2753
+A::~A(120,2777
+struct B 122,2789
+    ~B(B::~B123,2800
+enum {dog,::dog126,2817
+enum {dog, cat}::cat126,2817
+enum {dog, cat} animals;126,2817
+struct {int teats;} cow;127,2842
+class Boo 129,2868
+    enum {dog,Boo::dog130,2880
+    enum {dog, cat}Boo::cat130,2880
+    foo(Boo::foo133,2954
+    Boo(Boo::Boo137,2995
+Boo::Boo(141,3070
+typedef int should_see_this_one_enclosed_in_extern_C;149,3155
+typedef int 
(*should_see_this_function_pointer)should_see_this_function_pointer153,3228
+typedef int should_see_this_array_type[should_see_this_array_type156,3310
+
+cp-src/abstract.C,11317
+Half_Container::Half_Container(34,703
+void Half_Container::SetPosition(45,941
+void Half_Container::SetDimensions(58,1259
+void Half_Container::SetFather(81,1697
+void Half_Container::SetCollapsed(87,1787
+Specification::Specification(98,1958
+void Specification::SetPosition(119,2453
+void Specification::SetDimensions(164,3742
+void Specification::SetFather(188,4616
+void Specification::SetPath(202,4908
+Coord Specification::GetMaxX(212,5125
+Coord Specification::GetMaxY(215,5174
+Process::Process(222,5298
+void Process::SetPosition(242,5697
+void Process::SetDimensions(291,6959
+void Process::SetFather(315,7913
+void Process::SetPath(326,8123
+Coord Process::GetMaxX(335,8323
+Coord Process::GetMaxY(338,8365
+Choice::Choice(346,8482
+void Choice::SetPosition(357,8698
+void Choice::SetDimensions(405,10053
+void Choice::ChangeH(466,12014
+void Choice::ChangeW(495,12947
+void Choice::SetFather(522,13700
+void Choice::SetTextual(532,13918
+void Choice::SetCollapsed(540,14041
+int Choice::Get_Textual_H(549,14168
+int Choice::Get_Textual_W(557,14408
+void Choice::SetTerminalPos(566,14615
+Stop::Stop(588,15087
+void Stop::SetPosition(595,15207
+void Stop::SetDimensions(605,15373
+void Stop::SetFather(644,16369
+void Stop::SetTextual(652,16537
+void Stop::SetCollapsed(655,16616
+Exit::Exit(667,16768
+void Exit::SetPosition(676,16935
+void Exit::SetDimensions(687,17164
+void Exit::SetFather(695,17350
+Exit_Bex::Exit_Bex(703,17476
+void Exit_Bex::SetPosition(713,17678
+void Exit_Bex::SetDimensions(740,18430
+void Exit_Bex::SetFather(798,20444
+void Exit_Bex::SetTextual(807,20646
+void Exit_Bex::SetCollapsed(814,20757
+NoExit::NoExit(826,20943
+void NoExit::SetPosition(835,21092
+void NoExit::SetDimensions(845,21266
+void NoExit::SetFather(852,21359
+ID_Place::ID_Place(861,21488
+void ID_Place::SetIdent(875,21745
+void ID_Place::SetPosition(886,21936
+void ID_Place::SetDimensions(897,22173
+void ID_Place::SetFather(928,23017
+ID_Place::~ID_Place(932,23073
+void ID_Place::SetVisible(935,23112
+void ID_Place::ClearID(941,23193
+ID_List::ID_List(953,23379
+void ID_List::SetPosition(967,23644
+void ID_List::SetDimensions(999,24385
+void ID_List::SetFather(1038,25456
+void ID_List::SetCollapsed(1047,25595
+void ID_List::HideMe(1056,25734
+void ID_List::SetRBubble(1065,25862
+void ID_List::SetAlignement(1073,25980
+int ID_List::GetCardinality(1082,26123
+void ID_List::SetVisible(1093,26291
+void ID_List::BuildSigSorts(1103,26518
+void ID_List::ClearIDs(1126,27081
+Id_Decl::Id_Decl(1139,27280
+void Id_Decl::SetPosition(1156,27659
+void Id_Decl::SetDimensions(1174,28016
+void Id_Decl::SetFather(1191,28417
+void Id_Decl::SetCollapsed(1200,28568
+Id_Decl_List::Id_Decl_List(1214,28799
+void Id_Decl_List::SetPosition(1227,29069
+void Id_Decl_List::SetDimensions(1245,29424
+void Id_Decl_List::SetFather(1262,29844
+void Id_Decl_List::SetCollapsed(1271,29988
+Comment::Comment(1286,30209
+void Comment::SetComment(1299,30446
+void Comment::SetFather(1317,30800
+void Comment::SetPosition(1321,30854
+void Comment::SetDimensions(1331,31031
+Comment::~Comment(1345,31265
+Comment_List::Comment_List(1352,31382
+void Comment_List::SetPosition(1362,31541
+void Comment_List::SetDimensions(1380,31860
+void Comment_List::SetFather(1392,32139
+Parallel::Parallel(1406,32360
+void Parallel::SetPosition(1417,32573
+void Parallel::SetDimensions(1473,34272
+void Parallel::SetTextual(1534,36167
+int Parallel::Get_Textual_W(1543,36313
+int Parallel::Get_Textual_H(1559,36722
+void Parallel::SetTerminalPos(1570,37191
+void Parallel::SetFather(1590,37698
+void Parallel::SetCollapsed(1601,37950
+Ident_Eq::Ident_Eq(1615,38177
+void Ident_Eq::SetPosition(1632,38546
+void Ident_Eq::SetDimensions(1647,38851
+void Ident_Eq::SetFather(1662,39191
+void Ident_Eq::SetCollapsed(1669,39295
+Ident_Eq_List::Ident_Eq_List(1681,39480
+void Ident_Eq_List::SetPosition(1694,39753
+void Ident_Eq_List::SetDimensions(1712,40111
+void Ident_Eq_List::SetCollapsed(1729,40538
+void Ident_Eq_List::SetFather(1738,40683
+Local_Def::Local_Def(1751,40904
+void Local_Def::SetPosition(1761,41102
+void Local_Def::SetDimensions(1791,41833
+void Local_Def::SetFather(1832,43262
+void Local_Def::SetCollapsed(1839,43370
+void Local_Def::SetTextual(1848,43504
+Hide::Hide(1860,43681
+void Hide::SetPosition(1871,43872
+void Hide::SetDimensions(1901,44569
+void Hide::SetFather(1944,45771
+void Hide::SetCollapsed(1951,45873
+void Hide::SetTextual(1961,46003
+Interl::Interl(1972,46175
+void Interl::SetPosition(1982,46361
+void Interl::SetDimensions(1993,46593
+void Interl::SetFather(2021,47103
+Syncr::Syncr(2031,47257
+void Syncr::SetPosition(2041,47438
+void Syncr::SetDimensions(2051,47609
+void Syncr::SetFather(2079,48153
+Enable::Enable(2090,48436
+void Enable::SetPosition(2102,48690
+void Enable::SetDimensions(2169,50473
+void Enable::SetTextual(2243,53017
+void Enable::SetTerminalPos(2251,53140
+int Enable::Get_Textual_W(2271,53720
+int Enable::Get_Textual_H(2282,53985
+void Enable::SetFather(2285,54104
+void Enable::SetCollapsed(2298,54418
+Disable::Disable(2314,54780
+void Disable::SetPosition(2325,55001
+void Disable::SetDimensions(2376,56251
+void Disable::SetFather(2436,58064
+void Disable::SetCollapsed(2446,58284
+void Disable::SetTextual(2455,58412
+void Disable::SetTerminalPos(2463,58536
+int Disable::Get_Textual_W(2479,58987
+int Disable::Get_Textual_H(2488,59190
+Gen_Paral::Gen_Paral(2500,59630
+void Gen_Paral::SetPosition(2513,59899
+void Gen_Paral::SetDimensions(2540,60659
+void Gen_Paral::SetFather(2590,62171
+void Gen_Paral::SetCollapsed(2597,62290
+Action_Pref::Action_Pref(2609,62583
+void Action_Pref::SetPosition(2620,62829
+void Action_Pref::SetDimensions(2669,63937
+void Action_Pref::SetFather(2724,65777
+void Action_Pref::SetCollapsed(2734,66010
+void Action_Pref::SetTextual(2743,66147
+Internal::Internal(2757,66484
+void Internal::SetPosition(2768,66658
+void Internal::SetDimensions(2778,66838
+void Internal::SetFather(2806,67442
+Communication::Communication(2816,67702
+void Communication::SetPosition(2827,67956
+void Communication::SetDimensions(2897,70390
+void Communication::SetFather(2935,71706
+void Communication::SetCollapsed(2942,71837
+void Communication::SetTextual(2949,71968
+NoGuard::NoGuard(2961,72262
+void NoGuard::SetPosition(2974,72462
+void NoGuard::SetDimensions(2984,72639
+void NoGuard::SetFather(2987,72678
+Guard::Guard(2996,72929
+void Guard::SetPosition(3008,73118
+void Guard::SetDimensions(3022,73428
+void Guard::SetFather(3044,73894
+void Guard::SetCollapsed(3050,73974
+NoExperiment::NoExperiment(3062,74258
+void NoExperiment::SetPosition(3075,74478
+void NoExperiment::SetDimensions(3085,74670
+void NoExperiment::SetFather(3088,74714
+Experiment::Experiment(3097,74978
+void Experiment::SetPosition(3110,75245
+void Experiment::SetDimensions(3128,75611
+void Experiment::SetFather(3150,76066
+void Experiment::SetCollapsed(3157,76188
+void Experiment::SetTextual(3165,76311
+Proc_Inst::Proc_Inst(3175,76476
+void Proc_Inst::SetPosition(3191,76777
+void Proc_Inst::SetDimensions(3236,77965
+void Proc_Inst::SetFather(3286,79596
+void Proc_Inst::SetCollapsed(3294,79739
+void Proc_Inst::SetTextual(3304,79909
+Value_Expr::Value_Expr(3316,80100
+void Value_Expr::SetPosition(3329,80327
+void Value_Expr::SetDimensions(3340,80572
+void Value_Expr::SetFather(3343,80614
+Value_Expr_List::Value_Expr_List(3351,80755
+void Value_Expr_List::SetPosition(3364,81042
+void Value_Expr_List::SetDimensions(3382,81406
+void Value_Expr_List::SetFather(3399,81830
+void Value_Expr_List::SetCollapsed(3408,81977
+Sum_Ident::Sum_Ident(3423,82203
+void Sum_Ident::SetPosition(3435,82445
+void Sum_Ident::SetDimensions(3466,83196
+void Sum_Ident::SetFather(3509,84540
+void Sum_Ident::SetCollapsed(3516,84653
+void Sum_Ident::SetTextual(3525,84793
+void Sum_Ident::SetTerminalPos(3532,84897
+Value::Value(3552,85432
+void Value::SetPosition(3569,85792
+void Value::SetDimensions(3583,86091
+void Value::SetFather(3606,86628
+void Value::SetCollapsed(3613,86731
+Term::Term(3626,86908
+void Term::SetPosition(3646,87323
+void Term::SetDimensions(3671,87942
+void Term::SetFather(3697,88599
+void Term::SetCollapsed(3705,88732
+Exit_Entry::Exit_Entry(3719,88947
+void Exit_Entry::SetPosition(3732,89176
+void Exit_Entry::SetDimensions(3743,89421
+void Exit_Entry::SetFather(3746,89463
+Exit_Entry_List::Exit_Entry_List(3754,89604
+void Exit_Entry_List::SetPosition(3766,89875
+void Exit_Entry_List::SetDimensions(3785,90304
+void Exit_Entry_List::SetFather(3802,90753
+void Exit_Entry_List::SetCollapsed(3811,90900
+Sum_Gate::Sum_Gate(3826,91125
+void Sum_Gate::SetPosition(3837,91363
+void Sum_Gate::SetDimensions(3873,92120
+void Sum_Gate::SetFather(3915,93438
+void Sum_Gate::SetCollapsed(3922,93549
+void Sum_Gate::SetTextual(3931,93687
+void Sum_Gate::SetTerminalPos(3938,93790
+Gate_Decl::Gate_Decl(3959,94421
+void Gate_Decl::SetPosition(3977,94900
+void Gate_Decl::SetDimensions(3995,95298
+void Gate_Decl::SetFather(4011,95694
+void Gate_Decl::SetCollapsed(4020,95871
+Gate_Decl_List::Gate_Decl_List(4034,96130
+void Gate_Decl_List::SetPosition(4047,96414
+void Gate_Decl_List::SetDimensions(4065,96779
+void Gate_Decl_List::SetFather(4082,97207
+void Gate_Decl_List::SetCollapsed(4091,97353
+Par::Par(4106,97572
+void Par::SetPosition(4126,97957
+void Par::SetDimensions(4174,99236
+void Par::SetFather(4226,100814
+void Par::SetCollapsed(4234,100943
+void Par::SetTextual(4245,101100
+Sort_Id_Exit::Sort_Id_Exit(4258,101329
+void Sort_Id_Exit::SetPosition(4270,101556
+void Sort_Id_Exit::SetDimensions(4283,101834
+void Sort_Id_Exit::SetFather(4297,102142
+void Sort_Id_Exit::SetCollapsed(4303,102228
+Equality::Equality(4314,102512
+Equality::Equality(4327,102736
+void Equality::SetPosition(4340,102987
+void Equality::SetDimensions(4357,103329
+void Equality::SetFather(4377,103720
+void Equality::SetCollapsed(4387,103858
+Guarded::Guarded(4401,104167
+void Guarded::SetPosition(4413,104384
+void Guarded::SetDimensions(4441,105084
+void Guarded::SetFather(4482,106273
+void Guarded::SetCollapsed(4489,106377
+void Guarded::SetTextual(4499,106509
+Exper_Off::Exper_Off(4510,106813
+void Exper_Off::SetPosition(4523,107035
+void Exper_Off::SetDimensions(4533,107220
+void Exper_Off::SetFather(4536,107261
+Exper_Off_List::Exper_Off_List(4544,107521
+void Exper_Off_List::SetPosition(4557,107802
+void Exper_Off_List::SetDimensions(4575,108167
+void Exper_Off_List::SetFather(4592,108594
+void Exper_Off_List::SetCollapsed(4601,108740
+Exclam::Exclam(4616,109087
+void Exclam::SetPosition(4629,109300
+void Exclam::SetDimensions(4641,109541
+void Exclam::SetFather(4655,109830
+void Exclam::SetCollapsed(4661,109912
+Query::Query(4673,110194
+void Query::SetPosition(4686,110399
+void Query::SetDimensions(4698,110636
+void Query::SetFather(4712,110918
+void Query::SetCollapsed(4718,110997
+Definition::Definition(4729,111279
+void Definition::SetPosition(4741,111448
+void Definition::SetDimensions(4752,111658
+void Definition::SetFather(4766,111896
+void Definition::SetPath(4777,112089
+Proc_List::Proc_List(4790,112374
+void Proc_List::SetPosition(4799,112505
+void Proc_List::SetDimensions(4809,112686
+void Proc_List::SetFather(4815,112767
+void Proc_List::SetPath(4824,112908
+char *Proc_List::GetPath(Proc_List::GetPath4832,113068
+
+cp-src/abstract.H,2253
+#define abstract_hh16,453
+class ID_Place:ID_Place23,536
+ char *GetIdent(ID_Place::GetIdent41,857
+ void SetRBubble(ID_Place::SetRBubble42,891
+ char GetRBubble(ID_Place::GetRBubble43,934
+class ID_List:ID_List47,1012
+class Id_Decl:Id_Decl73,1540
+class Id_Decl_List:Id_Decl_List89,1829
+class Comment:Comment105,2140
+class Comment_List:Comment_List122,2440
+class Value_Expr:Value_Expr135,2694
+class Value_Expr_List:Value_Expr_List149,2911
+class Exit_Entry:Exit_Entry165,3244
+class Exit_Entry_List:Exit_Entry_List179,3460
+class Exper_Off:Exper_Off195,3793
+class Exper_Off_List:Exper_Off_List207,3977
+class Gate_Decl:Gate_Decl223,4323
+class Gate_Decl_List:Gate_Decl_List239,4630
+class Ident_Eq:Ident_Eq255,4957
+class Ident_Eq_List:Ident_Eq_List271,5270
+class Half_Container:Half_Container287,5608
+class Specification:Specification308,5954
+class Process:Process337,6609
+ char GetNesting(Process::GetNesting363,7186
+class Proc_List:Proc_List367,7257
+class Definition:Definition382,7574
+ char *GetPath(Definition::GetPath397,7940
+class Exit:Exit407,8071
+class NoExit:NoExit421,8305
+class Value:Value440,8560
+class Term:Term456,8841
+class Equality:Equality473,9169
+class Sort_Id_Exit:Sort_Id_Exit490,9504
+class NoGuard:NoGuard511,9837
+class Guard:Guard524,10045
+class NoExperiment:NoExperiment545,10368
+class Experiment:Experiment558,10591
+ Tree_Node *GetGuard(Experiment::GetGuard574,10962
+class Exclam:Exclam578,11053
+class Query:Query593,11324
+class Internal:Internal614,11643
+class Communication:Communication627,11854
+class Gen_Paral:Gen_Paral652,12337
+ void HideGate(Gen_Paral::HideGate668,12634
+class Interl:Interl672,12730
+class Syncr:Syncr685,12929
+class Action_Pref:Action_Pref704,13185
+class Enable:Enable723,13577
+class Disable:Disable746,14097
+class Choice:Choice768,14561
+class Stop:Stop793,15054
+class Exit_Bex:Exit_Bex810,15338
+class Hide:Hide829,15707
+class Guarded:Guarded848,16047
+class Proc_Inst:Proc_Inst867,16425
+class Parallel:Parallel888,16870
+ char GetOperType(Parallel::GetOperType910,17343
+class Local_Def:Local_Def914,17429
+class Par:Par933,17801
+class Sum_Gate:Sum_Gate952,18180
+class Sum_Ident:Sum_Ident972,18613
+
+cp-src/cfront.H,2555
+struct loc     67,1948
+struct ea 80,2150
+       ea(ea::ea86,2249
+       ea(ea::ea87,2275
+       ea(ea::ea88,2301
+       ea(ea::ea89,2310
+overload error;94,2349
+#define DEL(161,4040
+#define PERM(162,4092
+#define UNPERM(163,4123
+struct node 165,4157
+struct table 175,4321
+       void    set_scope(table::set_scope198,4988
+       void    set_name(table::set_name199,5029
+       int     max(table::max201,5091
+#define DEFINED 230,5655
+#define SIMPLIFIED 231,5712
+#define DEF_SEEN 232,5754
+#define IN_ERROR 234,5859
+struct type 236,5881
+       TOK     integral(type::integral255,6278
+       TOK     numeric(type::numeric256,6324
+       TOK     num_ptr(type::num_ptr257,6370
+struct enumdef 265,6500
+               enumdef(enumdef::enumdef269,6586
+struct classdef 278,6732
+       TOK     is_simple(classdef::is_simple302,7506
+       Pname   has_ctor(classdef::has_ctor314,7759
+       Pname   has_dtor(classdef::has_dtor315,7813
+       Pname   has_itor(classdef::has_itor316,7867
+struct basetype 323,7935
+struct fct 365,8857
+       bit     declared(fct::declared396,9724
+struct name_list 403,9827
+       name_list(name_list::name_list406,9866
+struct gen 410,9931
+struct pvtyp 419,10071
+struct vec 423,10109
+       vec(vec::vec429,10182
+struct ptr 435,10289
+       ptr(ptr::ptr440,10419
+inline Pptr type::addrof(447,10546
+struct expr 469,11113
+struct texpr 527,12108
+       texpr(texpr::texpr528,12149
+struct ival 531,12218
+       ival(ival::ival532,12258
+struct call 535,12308
+       call(call::call536,12338
+struct qexpr 543,12453
+       qexpr(qexpr::qexpr544,12500
+struct ref 547,12582
+       ref(ref::ref548,12632
+struct text_expr 551,12697
+       text_expr(text_expr::text_expr552,12731
+struct name 557,12884
+       void    unhide(name::unhide592,13929
+       void    use(name::use596,14025
+       void    take_addr(name::take_addr598,14069
+struct stmt 615,14374
+struct estmt 662,15111
+       estmt(estmt::estmt669,15303
+struct ifstmt 672,15379
+       ifstmt(ifstmt::ifstmt676,15484
+struct lstmt 680,15586
+       lstmt(lstmt::lstmt686,15650
+struct forstmt 689,15728
+       forstmt(forstmt::forstmt690,15759
+struct block 694,15880
+       block(block::block695,15919
+struct pair 703,16060
+       pair(pair::pair704,16096
+struct nlist 708,16173
+       void    add(nlist::add712,16230
+struct slist 718,16344
+               slist(slist::slist721,16385
+       void    add(slist::add722,16430
+struct elist 727,16521
+               elist(elist::elist730,16562
+       void    add(elist::add731,16607
+struct dcl_context 739,16739
+       void    stack(dcl_context::stack747,17023
+       void    unstack(dcl_context::unstack748,17064
+#define MAXCONT        751,17095
+const MIA 779,17690
+struct iline 780,17705
+#define FUDGE111 791,17985
+#define DB(831,18890
+#define DB(833,18920
+
+cp-src/burton.cpp,103
+::dummy::dummy test::dummy1(1,0
+::dummy::dummy test::dummy2(6,64
+::dummy::dummy test::dummy3(11,143
+
+cp-src/functions.cpp,807
+void Date::setDate 5,148
+void Date::plus 32,939
+void Date::minus 42,1229
+void Date::shift 52,1407
+Date & Date::operator = Date::operator =62,1628
+Date & Date::operator += Date::operator +=69,1789
+Date & Date::operator -= Date::operator -=78,1939
+Date & Date::operator ++ Date::operator ++87,2080
+Date & Date::operator -- Date::operator --96,2216
+int Date::operator - Date::operator -104,2331
+int Date::operator < Date::operator <112,2483
+int Date::operator > Date::operator >116,2557
+int Date::operator == Date::operator ==120,2631
+ostream& operator << operator <<124,2707
+istream& operator >> operator >>133,2943
+bool isLeap 159,3543
+bool isHoliday 163,3629
+void asort(173,3865
+void ReadVacation 186,4064
+void Debug 201,4523
+int WorkingDays(211,4867
+Date StartDay(226,5129
+
+cp-src/MDiagArray2.h,709
+#define octave_MDiagArray2_h 29,870
+#undef LTGT35,967
+#define LTGT39,1031
+#define LTGT 42,1051
+class MDiagArray2 78,2022
+  MDiagArray2 MDiagArray2::MDiagArray282,2077
+  MDiagArray2 MDiagArray2::MDiagArray286,2154
+  MDiagArray2 MDiagArray2::MDiagArray287,2198
+  MDiagArray2 MDiagArray2::MDiagArray288,2254
+  MDiagArray2 MDiagArray2::MDiagArray289,2329
+  MDiagArray2 MDiagArray2::MDiagArray290,2387
+  MDiagArray2 MDiagArray2::MDiagArray291,2450
+  ~MDiagArray2 MDiagArray2::~MDiagArray293,2515
+  MDiagArray2<T>& operator = MDiagArray2::operator =95,2542
+  operator MArray2<T> MDiagArray2::operator MArray2<T>101,2667
+#undef LTGT144,3874
+#define INSTANTIATE_MDIAGARRAY_FRIENDS(146,3887
+
+cp-src/Pctest.h,507
+#define PCTEST_H24,837
+    PctestActionValid,::PctestActionValid47,1286
+    PctestActionValidLasthop,::PctestActionValidLasthop49,1370
+    PctestActionFiltered,::PctestActionFiltered51,1481
+    PctestActionAbort  ::PctestActionAbort53,1566
+} PctestActionType;54,1616
+class Pctest 56,1637
+    Pctest(Pctest::Pctest59,1663
+    virtual ~Pctest(Pctest::~Pctest65,1813
+    virtual char *GetTargetName(Pctest::GetTargetName77,2171
+    virtual PctestActionType GetAction(Pctest::GetAction86,2555
+
+cp-src/Range.h,424
+#define octave_Range_h 24,765
+Range35,891
+  Range Range::Range39,909
+  Range Range::Range42,995
+  Range Range::Range46,1130
+  Range Range::Range50,1248
+  double base Range::base54,1376
+  double limit Range::limit55,1425
+  double inc Range::inc56,1475
+  int nelem Range::nelem57,1523
+  void set_base Range::set_base68,1728
+  void set_limit Range::set_limit69,1774
+  void set_inc Range::set_inc70,1821
+
+cp-src/screen.cpp,228
+unsigned char cursor_x,15,548
+unsigned char cursor_x, cursor_y;15,548
+static union REGS regs;16,582
+void goto_xy(18,607
+void hide_cursor(27,774
+void cursor_position(32,836
+void clear_screen(41,997
+void write_xyc(55,1247
+
+cp-src/screen.hpp,667
+#define __COLORS9,401
+enum COLORS 11,419
+    BLACK,COLORS::BLACK12,433
+    BLUE,COLORS::BLUE13,471
+    GREEN,COLORS::GREEN14,481
+    CYAN,COLORS::CYAN15,492
+    RED,COLORS::RED16,502
+    MAGENTA,COLORS::MAGENTA17,511
+    BROWN,COLORS::BROWN18,524
+    LIGHTGRAY,COLORS::LIGHTGRAY19,535
+    DARKGRAY,COLORS::DARKGRAY20,550
+    LIGHTBLUE,COLORS::LIGHTBLUE21,589
+    LIGHTGREEN,COLORS::LIGHTGREEN22,604
+    LIGHTCYAN,COLORS::LIGHTCYAN23,620
+    LIGHTRED,COLORS::LIGHTRED24,635
+    LIGHTMAGENTA,COLORS::LIGHTMAGENTA25,649
+    YELLOW,COLORS::YELLOW26,667
+    WHITECOLORS::WHITE27,679
+#define SCREEN_FP(31,700
+#define SCREEN_START 33,795
+
+cp-src/conway.cpp,270
+#define max(12,357
+#define min(13,393
+const int num_rows 15,430
+const int num_columns 16,470
+class site *field_of_play[field_of_play18,499
+int site::total_surrounding(20,550
+void display(37,958
+void glider(50,1239
+void traffic_light(59,1478
+void main(67,1633
+
+cp-src/conway.hpp,244
+class site:site5,235
+    site(site::site10,344
+    char read(site::read12,410
+    void set(site::set13,444
+    void clear(site::clear14,478
+    void compute_next_state(site::compute_next_state15,514
+    void step(site::step22,717
+
+cp-src/clheir.cpp,307
+const int max_num_generic_objects 9,298
+generic_object * object_registry[object_registry10,340
+void init_registry(12,400
+void step_everybody(19,527
+void discrete_location::clear_neighbors(31,852
+generic_object::generic_object(36,981
+generic_object::~generic_object(48,1255
+void agent::move(53,1353
+
+cp-src/clheir.hpp,609
+class generic_object13,520
+    virtual void compute_next_state(generic_object::compute_next_state21,842
+    virtual void step(generic_object::step22,888
+const int max_num_directions 31,1219
+class location:location33,1289
+    location(location::location43,1642
+class irregular_location:irregular_location47,1686
+    irregular_location(irregular_location::irregular_location51,1762
+class discrete_location:discrete_location56,1889
+    discrete_location(discrete_location::discrete_location62,2044
+    void assign_neighbor(discrete_location::assign_neighbor66,2184
+class agent:agent75,2508
+
+cp-src/fail.C,365
+struct A 7,263
+          struct B A::B8,274
+                  struct C A::B::C9,289
+                          C(A::B::C::C11,318
+                          operator int(A::B::C::operator int12,342
+                  typedef C T;A::B::T14,389
+          typedef B T2;A::T216,414
+class A 23,453
+       class B A::B24,463
+               class C A::B::C25,474
+               int f(A::B::f26,488
+int A::B::f(31,521
+main(37,571
+       class D 41,622
+               D(D::D43,659
+
+el-src/TAGTEST.EL,148
+(foo::defmumble bletch 1,0
+(defalias 'pending-delete-mode pending-delete-mode5,102
+(defalias (quote explicitly-quoted-pending-delete-mode)8,175
+
+el-src/emacs/lisp/progmodes/etags.el,5069
+(defvar tags-file-name 34,1034
+(defgroup etags 43,1498
+(defcustom tags-case-fold-search 47,1566
+(defcustom tags-table-list 59,2051
+(defcustom tags-compression-info-list69,2449
+(defcustom tags-add-tables 88,3231
+(defcustom tags-revert-without-query 98,3627
+(defvar tags-table-computed-list 103,3778
+(defvar tags-table-computed-list-for 112,4262
+(defvar tags-table-list-pointer 117,4510
+(defvar tags-table-list-started-at 121,4701
+(defvar tags-table-set-list 124,4821
+(defcustom find-tag-hook 129,5000
+(defcustom find-tag-default-function 137,5263
+(define-obsolete-variable-alias 
'find-tag-marker-ring-lengthfind-tag-marker-ring-length145,5602
+(defcustom tags-tag-face 148,5699
+(defcustom tags-apropos-verbose 154,5834
+(defcustom tags-apropos-additional-actions 160,5998
+(defvaralias 'find-tag-marker-ring find-tag-marker-ring183,6917
+(defvar default-tags-table-function 189,7097
+(defvar tags-location-ring 194,7323
+(defvar tags-table-files 201,7599
+(defvar tags-completion-table 206,7766
+(defvar tags-included-tables 209,7858
+(defvar next-file-list 212,7953
+(defvar tags-table-format-functions 217,8059
+(defvar file-of-tag-function 224,8440
+(defvar tags-table-files-function 228,8634
+(defvar tags-completion-table-function 230,8745
+(defvar snarf-tag-function 232,8840
+(defvar goto-tag-location-function 236,9049
+(defvar find-tag-regexp-search-function 239,9222
+(defvar find-tag-regexp-tag-order 241,9343
+(defvar find-tag-regexp-next-line-after-failure-p 243,9452
+(defvar find-tag-search-function 245,9572
+(defvar find-tag-tag-order 247,9679
+(defvar find-tag-next-line-after-failure-p 249,9774
+(defvar list-tags-function 251,9880
+(defvar tags-apropos-function 253,9968
+(defvar tags-included-tables-function 255,10062
+(defvar verify-tags-table-function 257,10181
+(defun initialize-new-tags-table 260,10292
+(defun tags-table-mode 276,10980
+(defun visit-tags-table 285,11245
+(defun tags-table-check-computed-list 321,12783
+(defun tags-table-extend-computed-list 360,14654
+(defun tags-expand-table-name 400,16367
+(defun tags-table-list-member 409,16710
+(defun tags-verify-table 421,17182
+(defun tags-table-including 470,19302
+(defun tags-next-table 522,21346
+(defun visit-tags-table-buffer 543,22203
+(defun tags-reset-tags-tables 712,28513
+(defun file-of-tag 731,29170
+(defun tags-table-files 740,29519
+(defun tags-included-tables 749,29869
+(defun tags-completion-table 755,30115
+(defun tags-lazy-completion-table 783,31309
+(defun tags-completion-at-point-function 799,31944
+(defun find-tag-tag 818,32694
+(defvar last-tag 837,33367
+(defun find-tag-interactive 840,33426
+(defvar find-tag-history 852,33841
+(defun find-tag-noselect 860,34011
+(defun find-tag 932,37125
+(defun find-tag-other-window 959,38341
+(defun find-tag-other-frame 1000,40269
+(defun find-tag-regexp 1025,41443
+(defalias 'pop-tag-mark pop-tag-mark1049,42605
+(defvar tag-lines-already-matched 1052,42656
+(defun find-tag-in-order 1055,42763
+(defun tag-find-file-of-tag-noselect 1167,47109
+(defun tag-find-file-of-tag 1200,48955
+(defun etags-recognize-tags-table 1208,49181
+(defun etags-verify-tags-table 1241,50812
+(defun etags-file-of-tag 1246,51010
+(defun etags-tags-completion-table 1256,51345
+(defun etags-snarf-tag 1286,52551
+(defun etags-goto-tag-location 1324,54120
+(defun etags-list-tags 1388,56563
+(defmacro tags-with-face 1423,57838
+(defun etags-tags-apropos-additional 1431,58171
+(defun etags-tags-apropos 1465,59408
+(defun etags-tags-table-files 1527,61617
+(defun etags-tags-included-tables 1542,62053
+(defun tags-recognize-empty-tags-table 1559,62593
+(defun tag-exact-file-name-match-p 1587,63739
+(defun tag-file-name-match-p 1596,64132
+(defun tag-exact-match-p 1609,64688
+(defun tag-implicit-name-match-p 1620,65256
+(defun tag-symbol-match-p 1633,65856
+(defun tag-word-match-p 1643,66292
+(defun tag-partial-file-name-match-p 1652,66690
+(defun tag-any-match-p 1662,67134
+(defun tag-re-match-p 1667,67318
+(defcustom tags-loop-revert-buffers 1675,67567
+(defun next-file 1685,67976
+(defvar tags-loop-operate 1760,70890
+(defvar tags-loop-scan1763,70984
+(defun tags-loop-eval 1771,71314
+(defun tags-loop-continue 1782,71643
+(defun tags-search 1850,73949
+(defun tags-query-replace 1871,74775
+(defun tags-complete-tags-table-file 1896,75999
+(defun list-tags 1906,76378
+(defun tags-apropos 1934,77331
+(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78157
+(defun select-tags-table 1964,78396
+(defvar select-tags-table-mode-map 2019,80523
+(define-derived-mode select-tags-table-mode 2030,80906
+(defun select-tags-table-select 2034,81090
+(defun select-tags-table-quit 2043,81456
+(defun complete-tag 2049,81611
+(defconst etags--xref-limit 2074,82552
+(defvar etags-xref-find-definitions-tag-order 2076,82587
+(defun etags-xref-find 2082,82877
+(defun etags--xref-find-definitions 2096,83406
+(defclass xref-etags-location 2129,85121
+(defun xref-make-etags-location 2135,85344
+(cl-defmethod xref-location-marker 2139,85499
+(cl-defmethod xref-location-line 2146,85743
+
+erl-src/gs_dialog.erl,98
+-define(VERSION2,32
+behaviour_info(51,2177
+show(124,5458
+dialog_loop(219,9529
+test(252,10806
+
+erl-src/lines.erl,386
+-define(BREAK66,2377
+-define(dbg68,2437
+new(73,2565
+count(80,2686
+nth(87,2815
+append(104,3301
+replace(119,3816
+insert(138,4559
+insert_after(165,5501
+delete(192,6456
+convert_to_list(215,7110
+convert_from_list(220,7259
+replace_nth(229,7518
+insert_nth(234,7618
+insert_after_nth(239,7711
+delete_nth(244,7828
+split_at(252,8027
+balance_left(267,8451
+balance_right(282,8865
+
+erl-src/lists.erl,593
+member(21,663
+append(30,790
+reverse(48,1099
+nth(59,1310
+nthtail(64,1382
+prefix(73,1546
+suffix(83,1707
+last(92,1882
+seq(101,2058
+sum(109,2265
+duplicate(116,2432
+min(124,2628
+max(132,2837
+sublist(141,3083
+delete(152,3329
+sort(161,3483
+split_and_sort(165,3559
+merge(175,3811
+concat(190,4219
+thing_to_list(195,4300
+flatten(204,4606
+flat_length(222,5003
+keymember(239,5451
+keysearch(246,5609
+keydelete(253,5770
+keyreplace(260,5923
+keysort(266,6113
+split_and_keysort(270,6229
+keymerge(277,6504
+keymap(288,6851
+map(311,7829
+foldl(315,7919
+foldr(320,8037
+zf(325,8155
+
+f-src/entry.for,172
+      LOGICAL FUNCTION PRTPKG 3,75
+       ENTRY  SETPRT 194,3866
+       ENTRY  MSGSEL 395,8478
+     & intensity1(577,12231
+       character*(*) function foo(579,12307
+
+f-src/entry.strange_suffix,172
+      LOGICAL FUNCTION PRTPKG 3,75
+       ENTRY  SETPRT 194,3866
+       ENTRY  MSGSEL 395,8478
+     & intensity1(577,12231
+       character*(*) function foo(579,12307
+
+f-src/entry.strange,103
+       ENTRY  MSGSEL 193,4382
+     & intensity1(375,8135
+       character*(*) function foo(377,8211
+
+forth-src/test-forth.fth,408
+: a-forth-word 20,301
+99 constant a-forth-constant!22,343
+55 value a-forth-value?23,373
+create :a-forth-dictionary-entry24,397
+defer #a-defer-word27,460
+: (another-forth-word)(another-forth-word29,481
+   9   field   >field136,582
+   5   field   >field237,605
+constant (a-forth-constant(a-forth-constant38,628
+2000 buffer: #some-storage41,657
+code assemby-code-word 43,685
+: a-forth-word 50,870
+
+html-src/softwarelibero.html,198
+Cos'� il software libero?4,38
+Licenze d'uso di un programmalicenze65,2474
+Sfatiamo alcuni miti138,6064
+Il movimento open sourceoss191,7968
+Impatto pratico del software liberoimpatto231,9986
+
+html-src/index.shtml,104
+&nbsp;8,281
+In evidenza15,446
+Comunicati e iniziative32,974
+Ultime notizie dall'associazione63,2027
+
+html-src/algrthms.html,467
+Tutorial on Convolutional Coding with Viterbi Decoding--Description of the 
Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and 
Quantizing Algorithms7,276
+Descriptionalgorithms10,477
+Generating the Datagenalgorithm48,1953
+Convolutionallyconalgorithm55,2463
+Nextstatetable262,11331
+Outputoutputtable350,13571
+Mapping the Channel Symbolsmapping433,15786
+Adding Noise to theaddnoise439,16174
+Quantizing the Receivedquantizing469,18637
+
+html-src/software.html,438
+Francesco Potort� Software Page9,280
+Software that I wrote for supporting my research activitysimulation36,1400
+MTGmtg41,1484
+Fracasfracas65,2626
+GaliLEOgalileo101,4234
+Leasqrleasqr114,4679
+Free software that I wrote for the GNU project or for my personal or 
workgnu142,6067
+Etagsetags148,6182
+checkiso161,6731
+cgrep178,7549
+debian-bug.eldebian-bug190,7981
+tcpdump205,8566
+Links to interesting softwarelinks216,8893
+
+java-src/AWTEMul.java,4356
+public class AWTEventMulticaster 63,2111
+    protected 
AWTEventMulticaster(AWTEventMulticaster.AWTEventMulticaster77,2555
+    protected EventListener remove(AWTEventMulticaster.remove86,2820
+    public void componentResized(AWTEventMulticaster.componentResized102,3294
+    public void componentMoved(AWTEventMulticaster.componentMoved112,3626
+    public void componentShown(AWTEventMulticaster.componentShown122,3952
+    public void componentHidden(AWTEventMulticaster.componentHidden132,4280
+    public void componentAdded(AWTEventMulticaster.componentAdded142,4619
+    public void componentRemoved(AWTEventMulticaster.componentRemoved152,4959
+    public void focusGained(AWTEventMulticaster.focusGained162,5281
+    public void focusLost(AWTEventMulticaster.focusLost172,5572
+    public void keyTyped(AWTEventMulticaster.keyTyped182,5853
+    public void keyPressed(AWTEventMulticaster.keyPressed192,6129
+    public void keyReleased(AWTEventMulticaster.keyReleased202,6413
+    public void mouseClicked(AWTEventMulticaster.mouseClicked212,6704
+    public void mousePressed(AWTEventMulticaster.mousePressed222,7004
+    public void mouseReleased(AWTEventMulticaster.mouseReleased232,7306
+    public void mouseEntered(AWTEventMulticaster.mouseEntered242,7609
+    public void mouseExited(AWTEventMulticaster.mouseExited252,7907
+    public void mouseDragged(AWTEventMulticaster.mouseDragged262,8204
+    public void mouseMoved(AWTEventMulticaster.mouseMoved272,8512
+    public void windowOpened(AWTEventMulticaster.windowOpened282,8819
+    public void windowClosing(AWTEventMulticaster.windowClosing292,9125
+    public void windowClosed(AWTEventMulticaster.windowClosed302,9432
+    public void windowIconified(AWTEventMulticaster.windowIconified312,9742
+    public void 
windowDeiconified(AWTEventMulticaster.windowDeiconified322,10064
+    public void windowActivated(AWTEventMulticaster.windowActivated332,10389
+    public void 
windowDeactivated(AWTEventMulticaster.windowDeactivated342,10712
+    public void actionPerformed(AWTEventMulticaster.actionPerformed352,11037
+    public void 
itemStateChanged(AWTEventMulticaster.itemStateChanged362,11356
+    public void 
adjustmentValueChanged(AWTEventMulticaster.adjustmentValueChanged372,11690
+    public void 
textValueChanged(AWTEventMulticaster.textValueChanged376,11874
+    public static ComponentListener add(AWTEventMulticaster.add387,12225
+    public static ContainerListener add(AWTEventMulticaster.add397,12571
+    public static FocusListener add(AWTEventMulticaster.add407,12901
+    public static KeyListener add(AWTEventMulticaster.add417,13207
+    public static MouseListener add(AWTEventMulticaster.add427,13513
+    public static MouseMotionListener add(AWTEventMulticaster.add437,13855
+    public static WindowListener add(AWTEventMulticaster.add447,14197
+    public static ActionListener add(AWTEventMulticaster.add457,14519
+    public static ItemListener add(AWTEventMulticaster.add467,14833
+    public static AdjustmentListener add(AWTEventMulticaster.add477,15163
+    public static TextListener add(AWTEventMulticaster.add480,15310
+    public static ComponentListener 
remove(AWTEventMulticaster.remove490,15664
+    public static ContainerListener 
remove(AWTEventMulticaster.remove500,16044
+    public static FocusListener remove(AWTEventMulticaster.remove510,16408
+    public static KeyListener remove(AWTEventMulticaster.remove520,16748
+    public static MouseListener remove(AWTEventMulticaster.remove530,17088
+    public static MouseMotionListener 
remove(AWTEventMulticaster.remove540,17465
+    public static WindowListener remove(AWTEventMulticaster.remove550,17841
+    public static ActionListener remove(AWTEventMulticaster.remove560,18197
+    public static ItemListener remove(AWTEventMulticaster.remove570,18545
+    public static AdjustmentListener 
remove(AWTEventMulticaster.remove580,18909
+    public static TextListener remove(AWTEventMulticaster.remove583,19062
+    protected static EventListener 
addInternal(AWTEventMulticaster.addInternal597,19608
+    protected static EventListener 
removeInternal(AWTEventMulticaster.removeInternal614,20244
+    protected void saveInternal(AWTEventMulticaster.saveInternal628,20582
+    static void save(AWTEventMulticaster.save646,21131
+
+java-src/KeyEve.java,698
+public class KeyEvent 36,1075
+    public KeyEvent(KeyEvent.KeyEvent234,9912
+    public KeyEvent(KeyEvent.KeyEvent252,10510
+    public int getKeyCode(KeyEvent.getKeyCode261,10836
+    public void setKeyCode(KeyEvent.setKeyCode265,10897
+    public void setKeyChar(KeyEvent.setKeyChar269,10978
+    public void setModifiers(KeyEvent.setModifiers273,11060
+    public char getKeyChar(KeyEvent.getKeyChar282,11331
+    public static String getKeyText(KeyEvent.getKeyText290,11561
+    public static String 
getKeyModifiersText(KeyEvent.getKeyModifiersText377,16662
+    public boolean isActionKey(KeyEvent.isActionKey403,17618
+    public String paramString(KeyEvent.paramString407,17704
+
+java-src/SMan.java,5099
+class SecurityManager 80,3387
+    public boolean getInCheck(SecurityManager.getInCheck101,4075
+    protected SecurityManager(SecurityManager.SecurityManager114,4497
+    protected Class 
currentLoadedClass(SecurityManager.currentLoadedClass149,5707
+    protected boolean inClass(SecurityManager.inClass184,7034
+    protected boolean inClassLoader(SecurityManager.inClassLoader196,7372
+    public Object 
getSecurityContext(SecurityManager.getSecurityContext221,8485
+    public void 
checkCreateClassLoader(SecurityManager.checkCreateClassLoader238,9069
+    public void checkAccess(SecurityManager.checkAccess268,10298
+    public void checkAccess(SecurityManager.checkAccess298,11632
+    public void checkExit(SecurityManager.checkExit323,12649
+    public void checkExec(SecurityManager.checkExec349,13734
+    public void checkLink(SecurityManager.checkLink375,14813
+    public void checkRead(SecurityManager.checkRead394,15485
+    public void checkRead(SecurityManager.checkRead412,16111
+    public void checkRead(SecurityManager.checkRead434,17017
+    public void checkWrite(SecurityManager.checkWrite453,17706
+    public void checkWrite(SecurityManager.checkWrite471,18337
+    public void checkDelete(SecurityManager.checkDelete493,19165
+    public void checkConnect(SecurityManager.checkConnect517,20119
+    public void checkConnect(SecurityManager.checkConnect543,21254
+    public void checkListen(SecurityManager.checkListen561,21910
+    public void checkAccept(SecurityManager.checkAccept585,22887
+    public void checkMulticast(SecurityManager.checkMulticast597,23272
+    public void checkMulticast(SecurityManager.checkMulticast610,23732
+    public void 
checkPropertiesAccess(SecurityManager.checkPropertiesAccess632,24609
+    public void 
checkPropertyAccess(SecurityManager.checkPropertyAccess654,25449
+    public boolean 
checkTopLevelWindow(SecurityManager.checkTopLevelWindow680,26580
+    public void 
checkPrintJobAccess(SecurityManager.checkPrintJobAccess689,26763
+    public void 
checkSystemClipboardAccess(SecurityManager.checkSystemClipboardAccess698,26958
+    public void 
checkAwtEventQueueAccess(SecurityManager.checkAwtEventQueueAccess707,27159
+    public void 
checkPackageAccess(SecurityManager.checkPackageAccess729,27966
+    public void 
checkPackageDefinition(SecurityManager.checkPackageDefinition751,28803
+    public void checkSetFactory(SecurityManager.checkSetFactory775,29929
+    public void checkMemberAccess(SecurityManager.checkMemberAccess786,30209
+    public void 
checkSecurityAccess(SecurityManager.checkSecurityAccess796,30430
+    public ThreadGroup getThreadGroup(SecurityManager.getThreadGroup811,30923
+class NullSecurityManager 817,31025
+    public void 
checkCreateClassLoader(NullSecurityManager.checkCreateClassLoader818,31077
+    public void checkAccess(NullSecurityManager.checkAccess819,31123
+    public void checkAccess(NullSecurityManager.checkAccess820,31165
+    public void checkExit(NullSecurityManager.checkExit821,31212
+    public void checkExec(NullSecurityManager.checkExec822,31254
+    public void checkLink(NullSecurityManager.checkLink823,31296
+    public void checkRead(NullSecurityManager.checkRead824,31338
+    public void checkRead(NullSecurityManager.checkRead825,31387
+    public void checkRead(NullSecurityManager.checkRead826,31430
+    public void checkWrite(NullSecurityManager.checkWrite827,31489
+    public void checkWrite(NullSecurityManager.checkWrite828,31539
+    public void checkDelete(NullSecurityManager.checkDelete829,31583
+    public void checkConnect(NullSecurityManager.checkConnect830,31628
+    public void checkConnect(NullSecurityManager.checkConnect831,31684
+    public void checkListen(NullSecurityManager.checkListen832,31756
+    public void checkAccept(NullSecurityManager.checkAccept833,31798
+    public void checkMulticast(NullSecurityManager.checkMulticast834,31853
+    public void checkMulticast(NullSecurityManager.checkMulticast835,31907
+    public void 
checkPropertiesAccess(NullSecurityManager.checkPropertiesAccess836,31971
+    public void 
checkPropertyAccess(NullSecurityManager.checkPropertyAccess837,32015
+    public void 
checkPropertyAccess(NullSecurityManager.checkPropertyAccess838,32067
+    public boolean 
checkTopLevelWindow(NullSecurityManager.checkTopLevelWindow839,32131
+    public void 
checkPrintJobAccess(NullSecurityManager.checkPrintJobAccess840,32202
+    public void 
checkSystemClipboardAccess(NullSecurityManager.checkSystemClipboardAccess841,32244
+    public void 
checkAwtEventQueueAccess(NullSecurityManager.checkAwtEventQueueAccess842,32293
+    public void 
checkPackageAccess(NullSecurityManager.checkPackageAccess843,32340
+    public void 
checkPackageDefinition(NullSecurityManager.checkPackageDefinition844,32391
+    public void checkSetFactory(NullSecurityManager.checkSetFactory845,32446
+    public void 
checkMemberAccess(NullSecurityManager.checkMemberAccess846,32484
+    public void 
checkSecurityAccess(NullSecurityManager.checkSecurityAccess847,32546
+
+java-src/SysCol.java,295
+public final class SystemColor 37,1402
+    private static void 
updateSystemColors(SystemColor.updateSystemColors349,10617
+    private SystemColor(SystemColor.SystemColor357,10885
+    public int getRGB(SystemColor.getRGB370,11245
+    public String toString(SystemColor.toString377,11388
+
+java-src/TG.java,2041
+class ThreadGroup 54,2104
+    private ThreadGroup(ThreadGroup.ThreadGroup72,2495
+    public ThreadGroup(ThreadGroup.ThreadGroup84,2848
+    public ThreadGroup(ThreadGroup.ThreadGroup105,3714
+    public final String getName(ThreadGroup.getName124,4189
+    public final ThreadGroup getParent(ThreadGroup.getParent135,4492
+    public final int getMaxPriority(ThreadGroup.getMaxPriority148,4867
+    public final boolean isDaemon(ThreadGroup.isDaemon161,5305
+    public synchronized boolean isDestroyed(ThreadGroup.isDestroyed170,5470
+    public final void setDaemon(ThreadGroup.setDaemon192,6368
+    public final void setMaxPriority(ThreadGroup.setMaxPriority213,7110
+    public final boolean parentOf(ThreadGroup.parentOf246,8106
+    public final void checkAccess(ThreadGroup.checkAccess268,8834
+    public int activeCount(ThreadGroup.activeCount283,9286
+    public int enumerate(ThreadGroup.enumerate322,10497
+    public int enumerate(ThreadGroup.enumerate344,11481
+    private int enumerate(ThreadGroup.enumerate348,11584
+    public int activeGroupCount(ThreadGroup.activeGroupCount389,12588
+    public int enumerate(ThreadGroup.enumerate425,13727
+    public int enumerate(ThreadGroup.enumerate445,14595
+    private int enumerate(ThreadGroup.enumerate449,14703
+    public final void stop(ThreadGroup.stop499,16212
+    public final void suspend(ThreadGroup.suspend537,17477
+    public final void resume(ThreadGroup.resume575,18749
+    public final void destroy(ThreadGroup.destroy607,19779
+    private final void add(ThreadGroup.add643,20704
+    private void remove(ThreadGroup.remove668,21402
+    void add(ThreadGroup.add697,22142
+    void remove(ThreadGroup.remove722,22808
+    public void list(ThreadGroup.list751,23503
+    void list(ThreadGroup.list754,23556
+    public void uncaughtException(ThreadGroup.uncaughtException810,25512
+    public boolean 
allowThreadSuspension(ThreadGroup.allowThreadSuspension823,25823
+    public String toString(ThreadGroup.toString837,26142
+
+lua-src/allegro.lua,400
+local function get_layer_by_name 7,175
+local function count_layers 33,621
+function GetLayerByName 54,980
+function GetUniqueLayerName 65,1204
+function SelectLayer 76,1415
+function NewLayer 86,1773
+function NewLayerSet 144,3226
+function RemoveLayer 170,3750
+function MoveLayerTop 211,4767
+function MoveLayerBottom 223,5079
+function MoveLayerBefore 236,5457
+function MoveLayerAfter 258,6090
+
+make-src/Makefile,1133
+LATEST=1,0
+NONSRCS=35,1578
+CPPFLAGS=49,2191
+LDFLAGS=50,2260
+FASTCFLAGS=55,2531
+FILTER=58,2642
+       @-$($72,3064
+       @-$($73,3113
+       @-$($74,3177
+       @-$($75,3223
+       @-$($76,3291
+       @-$($77,3383
+       @$(81,3466
+       @$(82,3514
+       @$(83,3577
+       @$(84,3622
+       @$(85,3689
+       @$(86,3780
+${CHECKOBJS}: CFLAGS=88,3806
+       @env CHECKEROPTS=92,3922
+       @$(98,4094
+       @$(106,4250
+       @$(110,4374
+       @$(114,4500
+       @for i in $(SRCS); do echo $$i;140,5315
+       $(160,6053
+       $(163,6114
+       $(166,6177
+       $(169,6228
+       $(172,6317
+       sdiff --suppress-common-lines --width=width186,6614
+       sdiff --suppress-common-lines --width=width189,6703
+       sdiff --suppress-common-lines --width=width192,6791
+       sdiff --suppress-common-lines --width=width195,6880
+       TEXTAGS=204,7122
+       TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* 
--regex=regex204,7122
+       ${RUN} etags12 --members -o $@ --regex=regex207,7239
+       ${RUN} ./ctags -o $@ --regex=regex213,7388
+       ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=regex216,7464
+       TEXTAGS=219,7583
+       TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ 
--regex=regex219,7583
+       ${RUN} ./extags -e --regex-c=c222,7710
+
+objc-src/Subprocess.h,98
+#define Subprocess 41,1217
+#define BUFFERSIZE 43,1267
address@hidden Subprocess:Subprocess45,1292
+
+objc-src/Subprocess.m,475
+#define        PTY_TEMPLATE 20,494
+#define        PTY_LENGTH 21,528
address@hidden Subprocess(Private)Subprocess(Private)32,737
+- childDidExit39,851
+- fdHandler:67,1589
+showError 98,2360
+fdHandler 112,2785
+getptys 119,2907
+- init:183,4815
+    andStdErr:init:withDelegate:andPtySupport:andStdErr:197,5147
+- send:(const char *)string withNewline:send:withNewline:300,7436
+- send:308,7599
+- terminateInput314,7689
+- terminate:321,7810
+- setDelegate:332,7961
+- delegate338,8031
+
+objc-src/PackInsp.h,109
+#define NUMSTATS       36,1101
+#define TYPESTOSTAT    37,1120
address@hidden PackageInspector:PackageInspector39,1172
+
+objc-src/PackInsp.m,1360
+static const char RCSid[RCSid30,1032
+#define VERSION        34,1116
+#   define DEBUG 37,1155
+#define LISTCONTENTS   39,1181
+#define OPENBUTTON     47,1352
+#define LISTCONTENTSBUTTON     48,1449
+#define LISTDESCRIPTIONBUTTON  49,1562
+#define STATE_UNINSTALLED      52,1687
+#define STATE_INSTALLED        53,1807
+#define STATE_COMPRESSD        54,1948
+#define SIZEFORMAT     57,2152
+#define KBYTES 58,2362
+#define MBYTES 59,2473
+#define LOCALIZE(61,2585
+#define LOCALIZE_ARCH(62,2668
++newnew67,2802
+-showInfo:showInfo:93,3417
+-revert:revert:107,3737
+-ok:ok:136,4297
+-loadload143,4424
+#define LOOKUP(156,4826
+#undef LOOKUP176,5694
+-loadKeyValuesFrom:(const char *)type 
inTable:loadKeyValuesFrom:inTable:186,5852
+-loadContentsOf:(const char *)type inTable:loadContentsOf:inTable:238,7079
+-loadImageloadImage257,7552
+#define STAT_EQ(275,7940
+-(BOOL)shouldLoad280,8116
+-toggleDescriptiontoggleDescription301,8626
+-(const char *)getPath:(char *)buf forType:getPath:forType:317,8899
+-setRevertButtonTitlesetRevertButtonTitle333,9320
+-(const char *)formatSize:(const char *)size inBuf:formatSize:inBuf:344,9525
+#define WORKING        368,10045
+-(void)getArchs370,10100
+-(void)addArchs:385,10520
+-subprocess:(Subprocess *)sender output:subprocess:output:428,11351
+-subprocessDone:subprocessDone:436,11484
+static void openInWorkspace(446,11634
+-open:open:464,12063
+
+objcpp-src/SimpleCalc.H,41
address@hidden SimpleCalc:SimpleCalc14,400
+
+objcpp-src/SimpleCalc.M,300
+- init52,1747
+- appendToDisplay:60,1933
+- registerAction:70,2210
+- decimalKey:77,2348
+- numberKeys:91,2661
+- equalsKey:112,3192
+- operationKeys:131,3680
+- clearKey:153,4301
+- clearAllKey:160,4410
+- appDidInit:168,4591
+- windowWillClose:178,4882
+- infoPanel:186,5132
+- helpPanel:198,5482
+
+pas-src/common.pas,1875
+procedure InitializeStringPackage;26,527
+function newtextstring;34,874
+procedure disposetextstring;52,1404
+function ConcatT;78,2066
+function AppendTextString;112,3238
+function CopyTextString;132,3947
+procedure CONVERT_CHARSTRING_TO_VALUE;151,4505
+procedure append_string;172,5166
+function To_Upper;186,5462
+function To_Lower;194,5617
+function EmptyNmStr(209,6213
+function chartonmstr;219,6436
+function LowerCaseNmStr;230,6682
+function concatenatenamestrings;242,7007
+procedure writenamestring;263,7517
+function IsControlChar;277,7928
+function namestringequal;283,8079
+function NameStringLess;302,8539
+function IsControlCharName(343,9710
+function SubString;358,10208
+function SkipChars;379,10791
+function RemoveUnderlineControl;397,11311
+procedure First100Chars;427,12162
+procedure SkipSpaces;462,13298
+function SkipBlanks;477,13782
+function stripname;505,14595
+function Locate;522,15039
+function NameHasChar;543,15581
+function integertonmstr;561,16134
+function NmStrToInteger;585,16901
+function AddNullToNmStr;600,17317
+function ValToNmStr;611,17585
+function ChangeFileType;625,18037
+function StripPath;647,18734
+function ReprOfChar;675,19343
+procedure ExtractCommentInfo;702,20749
+procedure INSERT_TREE_NODE;784,24053
+function GetNameList;920,27926
+procedure DisposeANameList(925,28010
+procedure DisposeNameList;938,28340
+function GetNewNameListNode;943,28409
+function insertname;972,29051
+procedure InitNameList;988,29471
+procedure InitNameStringPool;998,29767
+procedure NewNameString;1004,29867
+procedure ReleaseNameString;1022,30232
+procedure SDTrefStringToRec 1045,30741
+procedure SDTrefSkipSpaces;1059,31092
+function SDTrefIsEnd 1070,31323
+function SDTrefGetInteger 1082,31529
+procedure SDTrefRecToString 1303,37546
+function NmStrToErrStr;1497,42305
+function ErrStrToNmStr;1509,42557
+function GetTextRef;1529,43112
+
+php-src/lce_functions.php,2152
+  define("LCE_FUNCTIONS"LCE_FUNCTIONS4,38
+  define("LCE_UNKNOWN"LCE_UNKNOWN9,145
+  define("LCE_WS"LCE_WS11,194
+  define("LCE_COMMENT"LCE_COMMENT13,244
+  define("LCE_COMMENT_USER"LCE_COMMENT_USER15,303
+  define("LCE_COMMENT_TOOL"LCE_COMMENT_TOOL17,366
+  define("LCE_MSGID"LCE_MSGID19,430
+  define("LCE_MSGSTR"LCE_MSGSTR21,488
+  define("LCE_TEXT"LCE_TEXT23,541
+  define("STATE_ABORT"STATE_ABORT25,567
+  define("STATE_OK"STATE_OK26,595
+  define("STATE_LOOP"STATE_LOOP27,620
+  class POEntryAD 29,648
+      function validate(31,683
+      function checkQuotation(59,1384
+  class CommentAD 70,1639
+      function CommentAD(73,1693
+      function validate(83,1944
+  class POEntry 105,2410
+      function POEntry(119,2711
+      function lineCount(135,3255
+      function serializeToVars(141,3365
+      function write(151,3800
+  class POReader 163,4178
+      function gettext(177,4457
+      function parseFromVars(189,4705
+      function serializeToVars(215,5331
+      function POReader(229,5613
+      function read(243,5983
+      function write(259,6307
+      function isComment(277,6645
+      function comment(284,6822
+      function msgid(304,7247
+      function msgstr(320,7574
+      function start(340,8232
+      function createPOEntries(360,8644
+      function stripLine(394,9472
+      function printClassification(421,10056
+      function classifyLine(432,10301
+  function getTextDomains(471,11094
+  class PORManager 498,11756
+      function PORManager(502,11822
+      function addPOReader(507,11896
+      function &getPOReader(getPOReader512,11992
+      function getDomainNames(517,12081
+  function &loadPORManager(loadPORManager523,12174
+  function fileJoin(536,12436
+      function lce_bindtextdomain(557,12839
+      function lce_textdomain(614,14530
+      function lce_gettext(620,14641
+      function lce_dgettext(626,14767
+      function lce(634,14966
+      function lce_bindtextdomain(651,15488
+      function lce_textdomain(656,15592
+      function lce_gettext(661,15674
+      function lce_dgettext(666,15755
+      function lce(670,15855
+  function lce_geteditcode(676,15898
+
+php-src/ptest.php,46
+define("TEST"TEST1,0
+test 4,26
+foo(16,200
+
+perl-src/htlmify-cystic,1443
+my @section_name;section_name12,236
+my @appendix_name;appendix_name13,254
+my @section_toc;section_toc15,274
+my @appendix_toc;appendix_toc16,291
+my $new_tag new_tag18,310
+my $appendix;appendix24,409
+my $section;section25,423
+my $subsection;subsection26,436
+my $subsubsection;subsubsection27,452
+my $this_file_toc this_file_toc29,472
+my %file_tocs;file_tocs30,496
+my @output_files output_files32,512
+my $file_index file_index33,535
+my $output_file;output_file35,556
+my $line;line37,574
+my $subsection_marker;subsection_marker161,3883
+my $new;new163,3907
+sub read_toc main::read_toc165,3917
+         my $entry entry218,5621
+         my $entry entry234,6077
+             my $entry entry245,6351
+         my $entry entry252,6536
+         my $entry entry268,7010
+             my $entry entry276,7204
+         my $entry entry281,7328
+      my $entry entry296,7698
+sub finish_subsubsections main::finish_subsubsections302,7805
+sub finish_subsections main::finish_subsections309,7987
+sub finish_sections main::finish_sections320,8310
+sub finish_appendices main::finish_appendices331,8599
+sub section_url_base main::section_url_base337,8724
+sub section_url_name main::section_url_name342,8922
+sub section_url main::section_url355,9284
+  my $name name357,9336
+sub section_href main::section_href364,9452
+sub section_name main::section_name368,9551
+sub toc_line main::toc_line372,9655
+sub file_end main::file_end375,9750
+
+perl-src/yagrip.pl,258
+sub getopt main::getopt7,156
+       local($_,$flag,$opt,$f,$r,@temp)($_,$flag,$opt,$f,$r,@temp8,169
+sub usage main::usage38,856
+       local($prog,$_,@list)($prog,$_,@list39,868
+       
local($string,$flag,@string,@temp,@last)($string,$flag,@string,@temp,@last40,897
+
+perl-src/kai-test.pl,244
+sub f1 main::f12,16
+sub main::f2 6,50
+package Foo;10,90
+sub f3 Foo::f312,104
+sub Bar::f4 16,138
+package Bar;20,177
+sub f5 Bar::f522,191
+package Foo::Bar;26,225
+sub f6 Foo::Bar::f628,244
+package main;32,278
+sub f7 main::f734,293
+
+perl-src/mirror.pl,13410
+sub msg_versionmain::msg_version459,18271
+       local( $arg )( $arg 468,18582
+               local( $flag, $p )( $flag, $p 480,18757
+               local( $site_path )( $site_path 525,19687
+                       local( $site, $path )( $site, $path 539,19958
+               local( $key_val )( $key_val 578,20743
+               local( $user )( $user 595,21097
+               local( $c )( $c 634,21853
+                       local( $sec,$min,$hour,$mday,$mon,$year,( 
$sec,$min,$hour,$mday,$mon,$year,678,22807
+       local( $c )( $c 706,23393
+       local( $dir, $mp )( $dir, $mp 723,23695
+               local( $f )( $f 725,23740
+sub interpret_config_filesmain::interpret_config_files756,24304
+       local( $fname )( $fname 758,24333
+sub interpret_configmain::interpret_config785,24927
+sub parse_linemain::parse_line827,25710
+       local( $eqpl )( $eqpl 829,25727
+       local( $cont )( $cont 830,25744
+                       local( $v )( $v 839,26029
+sub set_defaultsmain::set_defaults860,26448
+sub command_line_overridemain::command_line_override868,26579
+       local( $key, $val, $overrides )( $key, $val, $overrides 870,26607
+sub set_variablesmain::set_variables894,27072
+       local( $key, $val )( $key, $val 896,27092
+                       local( $val_name )( $val_name 902,27259
+               local( $val )( $val 953,28825
+sub upd_valmain::upd_val962,28974
+       local( $key )( $key 964,28988
+sub pr_variablesmain::pr_variables970,29083
+       local( $msg )( $msg 972,29102
+       local( $nle )( $nle 973,29123
+       local( $out )( $out 974,29144
+       local( $key, $val, $str )( $key, $val, $str 975,29164
+sub do_mirrormain::do_mirror1007,29923
+       local( $get_one_package )( $get_one_package 1009,29939
+       local( $exit_status )( $exit_status 1030,30384
+                       local( @t )( @t 1154,33165
+       local( $con )( $con 1241,35499
+               local( @rhelp )( @rhelp 1289,36702
+       local( @sub_dirs )( @sub_dirs 1329,37778
+       local( $now )( $now 1493,41348
+               local( $arg )( $arg 1506,41774
+sub disconnectmain::disconnect1528,42250
+sub connectmain::connect1546,42576
+       local( $attempts )( $attempts 1548,42590
+       local( $res )( $res 1549,42642
+sub prodmain::prod1573,43156
+sub checkout_regexpsmain::checkout_regexps1585,43327
+       local( $ret )( $ret 1587,43350
+       local( $t )( $t 1589,43395
+               local( $val )( $val 1597,43701
+                       local( $err )( $err 1601,43786
+sub clear_localmain::clear_local1610,43909
+sub clear_remotemain::clear_remote1625,44172
+sub get_local_directory_detailsmain::get_local_directory_details1640,44445
+       local( @dirs, $dir )( @dirs, $dir 1642,44479
+       local( $last_prodded )( $last_prodded 1643,44502
+       local( $dir_level )( $dir_level 1691,45615
+       local( $i )( $i 1692,45641
+       local( $path, $time, $size, $type, $mode, $name, $isdir, $value, 
$follow )( $path, $time, $size, $type, $mode, $name, $isdir, $value, $follow 
1693,45659
+       local( $dev,$ino,$fmode,$nlink,$uid,$gid,$rdev,$ssize,( 
$dev,$ino,$fmode,$nlink,$uid,$gid,$rdev,$ssize,1694,45736
+                       local( $mapi )( $mapi 1763,47586
+sub get_remote_directory_detailsmain::get_remote_directory_details1789,48122
+       local( $type_changed )( $type_changed 1791,48157
+       local( $udirtmp )( $udirtmp 1792,48186
+       local( $storename )( $storename 1793,48206
+       local( $rls )( $rls 1825,48944
+               local( $dirtmp )( $dirtmp 1830,49002
+               local( $unsquish )( $unsquish 1832,49130
+                       local( $f )( $f 1840,49360
+               local( $dirtmp )( $dirtmp 1859,49866
+               local( $unsquish )( $unsquish 1870,50215
+                       local( $f, $uf )( $f, $uf 1878,50445
+               local( $flags )( $flags 1912,51259
+       local( $parse_state )( $parse_state 1946,52111
+                       local( $msg )( $msg 1963,52486
+sub patch_ls_lR_filemain::patch_ls_lR_file1984,52955
+       local( $f, $fr, $flb, $flt, $flp, $flz, $frb, $frt )( $f, $fr, $flb, 
$flt, $flp, $flz, $frb, $frt 1990,53055
+       local( $to , $tn )( $to , $tn 1991,53110
+       local( $tlb )( $tlb 1995,53225
+               local( $p, $s, $trz, $t, $m )( $p, $s, $trz, $t, $m 2030,54182
+               local( $tlz )( $tlz 2037,54467
+sub parse_timeoutmain::parse_timeout2089,55670
+sub parse_remote_detailsmain::parse_remote_details2095,55754
+       local( $ret )( $ret 2097,55781
+       local( $old_sig )( $old_sig 2098,55797
+sub parse_remote_details_realmain::parse_remote_details_real2125,56234
+       local( $path, $size, $time, $type, $mode, $rdir, $rcwd )( $path, 
$size, $time, $type, $mode, $rdir, $rcwd 2127,56266
+       local( @dir_list )( @dir_list 2128,56325
+       local( $i )( $i 2129,56346
+       local( $old_path )( $old_path 2130,56364
+                               local( $old_path )( $old_path 2143,56630
+                               local( $ri )( $ri 2203,58078
+                       local( $mapi )( $mapi 2214,58335
+                       local( $done )( $done 2239,58911
+sub compare_dirsmain::compare_dirs2283,59825
+       local( *src_paths,( *src_paths,2286,59915
+       local( $src_path, $dest_path, $i )( $src_path, $dest_path, $i 
2293,60099
+       local( $last_prodded )( $last_prodded 2294,60136
+       local( $desti, $srci, $compress, $srciZ, $srcigz, $split, 
$dest_path_real )( $desti, $srci, $compress, $srciZ, $srcigz, $split, 
$dest_path_real 2299,60350
+       local( $old_dest_path, $existing_path, $tmp, $restart )( 
$old_dest_path, $existing_path, $tmp, $restart 2300,60428
+       local( $sp, $dp )( $sp, $dp 2301,60486
+                  local( $real, $reali, $reali1 )( $real, $reali, $reali1 
2352,62034
+                  local( $count )( $count 2353,62072
+                       local( $value )( $value 2408,63996
+                       local( $real )( $real 2409,64028
+                       local( $reali )( $reali 2410,64086
+                               local( $old )( $old 2421,64571
+                       local( $old_dest_path )( $old_dest_path 2432,64842
+                               local( $dpp, $dps )( $dpp, $dps 2509,67031
+               local( $update )( $update 2534,67671
+sub map_namemain::map_name2651,71028
+       local( $name )( $name 2653,71043
+               local( $old_name )( $old_name 2656,71089
+               local( $tmp )( $tmp 2666,71252
+sub set_timestampsmain::set_timestamps2675,71362
+       local( $src_path )( $src_path 2677,71383
+       local( $dest_path, $dest_loc_mapi, $src_rem_mapi,  $rtime )( 
$dest_path, $dest_loc_mapi, $src_rem_mapi,  $rtime 2685,71517
+sub set_timestampmain::set_timestamp2699,71901
+       local( $path, $time )( $path, $time 2701,71921
+       local( $pr_time )( $pr_time 2703,71953
+sub make_dirsmain::make_dirs2719,72284
+       local( $thing )( $thing 2721,72300
+sub make_symlinksmain::make_symlinks2736,72489
+       local( $thing )( $thing 2738,72509
+               local( $dest, $existing )( $dest, $existing 2745,72623
+               local( $dirpart )( $dirpart 2746,72663
+               local( $ft )( $ft 2747,72704
+               local( $p )( $p 2762,73261
+                       local( $f )( $f 2770,73467
+                       local( $dl )( $dl 2788,74038
+sub do_all_transfersmain::do_all_transfers2806,74439
+       local( $src_path )( $src_path 2808,74462
+       local( $dest_path, $attribs )( $dest_path, $attribs 2809,74483
+       local( $srci )( $srci 2810,74515
+               local( $newpath )( $newpath 2838,75124
+sub transfer_filemain::transfer_file2869,75847
+       local( $src_path, $dest_path, $attribs, $timestamp )( $src_path, 
$dest_path, $attribs, $timestamp 2871,75867
+       local( $dir, $file, $temp, $compress, $split, $restart, $mesg, 
$got_mesg )( $dir, $file, $temp, $compress, $split, $restart, $mesg, $got_mesg 
2872,75927
+               local( $src_file )( $src_file 2915,76782
+               local( $comptemp )( $comptemp 2916,76816
+                       local( $f )( $f 2921,76964
+               local($filesize)($filesize2944,77569
+                       local( $ti )( $ti 2975,78401
+               local( $f )( $f 2997,78887
+               local( $comp )( $comp 2998,78912
+       local( $filesize )( $filesize 3015,79427
+       local( $sizemsg )( $sizemsg 3016,79469
+       local( $srcsize )( $srcsize 3017,79501
+               local( $time )( $time 3029,79865
+       local( $as )( $as 3046,80223
+       local( $locali )( $locali 3054,80499
+sub filename_to_tempnamemain::filename_to_tempname3062,80713
+       local( $dir, $file )( $dir, $file 3064,80740
+       local ( $dest_path )( $dest_path 3066,80769
+sub log_uploadmain::log_upload3090,81228
+       local( $src_path, $dest_path, $got_mesg, $size )( $src_path, 
$dest_path, $got_mesg, $size 3092,81245
+sub do_deletesmain::do_deletes3118,81773
+       local( *src_paths,( *src_paths,3121,81861
+       local( $files_to_go, $dirs_to_go )( $files_to_go, $dirs_to_go 
3125,81960
+       local( $src_path, $i )( $src_path, $i 3131,82055
+       local( $orig_do_deletes )( $orig_do_deletes 3132,82080
+       local( $orig_save_deletes )( $orig_save_deletes 3133,82122
+       local( $del_patt )( $del_patt 3135,82169
+               local( $per )( $per 3162,82843
+               local( $per )( $per 3184,83513
+                       local( $save_dir_tail )( $save_dir_tail 3226,84617
+sub save_deletemain::save_delete3245,85019
+       local( $save, $kind )( $save, $kind 3247,85037
+       local( $real_save_dir, $save_dest )( $real_save_dir, $save_dest 
3249,85067
+       local( $dirname )( $dirname 3284,85704
+sub save_mkdirmain::save_mkdir3304,86155
+       local( $dir )( $dir 3306,86172
+sub do_deletemain::do_delete3320,86459
+       local( $del, $kind )( $del, $kind 3322,86475
+sub filesizemain::filesize3377,87532
+       local( $fname )( $fname 3379,87547
+sub istruemain::istrue3390,87654
+       local( $val )( $val 3392,87667
+sub mksymlinkmain::mksymlink3398,87773
+       local( $dest_path, $existing_path )( $dest_path, $existing_path 
3400,87789
+               local( $msg )( $msg 3417,88246
+               local( $msg )( $msg 3431,88590
+               local( $status )( $status 3442,88816
+sub mkdirsmain::mkdirs3457,89196
+       local( $dir )( $dir 3459,89209
+       local( @dir, $d, $path )( @dir, $d, $path 3460,89230
+sub make_dirmain::make_dir3497,90042
+       local( $dir, $mode )( $dir, $mode 3499,90057
+       local( $val )( $val 3500,90085
+sub dir_existsmain::dir_exists3528,90573
+       local( $dir )( $dir 3530,90590
+       local( $val )( $val 3531,90611
+               local($old_dir)($old_dir3539,90750
+sub set_attribsmain::set_attribs3553,91053
+       local( $path, $src_path, $type )( $path, $src_path, $type 3555,91071
+       local( $mode )( $mode 3556,91111
+               local( $pathi )( $pathi 3564,91229
+               local( $pathi )( $pathi 3568,91320
+sub get_passwdmain::get_passwd3606,91977
+       local( $user )( $user 3608,91994
+       local( $pass )( $pass 3609,92016
+       local( $| )( $| 3610,92033
+sub compare_timesmain::compare_times3631,92384
+       local( $t1, $t2 )( $t1, $t2 3637,92564
+       local( $diff )( $diff 3638,92589
+sub create_assocsmain::create_assocs3643,92688
+       local( $map )( $map 3645,92708
+sub delete_assocsmain::delete_assocs3657,92957
+       local( $map )( $map 3659,92977
+sub unlink_dbmmain::unlink_dbm3671,93247
+       local( $file )( $file 3673,93264
+sub bsplitmain::bsplit3681,93462
+       local( $temp, $dest_path, $time )( $temp, $dest_path, $time 3683,93475
+       local( $dest_dir )( $dest_dir 3684,93516
+       local( $bufsiz )( $bufsiz 3685,93558
+       local( $buffer, $in, $sofar )( $buffer, $in, $sofar 3686,93583
+       local( $d )( $d 3691,93721
+       local( $index )( $index 3697,93840
+       local( $part )( $part 3698,93865
+                       local( $locali )( $locali 3714,94336
+       local( $readme )( $readme 3730,94740
+sub sysmain::sys3739,95116
+       local( $com )( $com 3741,95126
+sub set_assoc_from_arraymain::set_assoc_from_array3751,95355
+       local( *things )( *things 3754,95453
+sub find_progmain::find_prog3760,95537
+       local( $prog )( $prog 3762,95553
+       local( $path )( $path 3763,95575
+               local( $path )( $path 3766,95657
+sub real_dir_from_pathmain::real_dir_from_path3780,95842
+       local( $program )( $program 3782,95867
+       local( @prog_path )( @prog_path 3783,95892
+       local( $dir )( $dir 3784,95970
+sub msgmain::msg3807,96489
+       local( $todo, $msg )( $todo, $msg 3809,96499
+sub to_bytesmain::to_bytes3838,96979
+       local( $size )( $size 3840,96994
+sub unix2vmsmain::unix2vms3858,97332
+       local( $v, $kind )( $v, $kind 3860,97347
+                       local( $dir, $rest )( $dir, $rest 3873,97559
+sub dirpartmain::dirpart3886,97730
+       local( $path )( $path 3888,97744
+sub expand_symlinkmain::expand_symlink3902,98076
+       local( $orig_path, $points_to )( $orig_path, $points_to 3904,98097
+       local( $dirpart )( $dirpart 3905,98136
+sub flatten_pathmain::flatten_path3913,98365
+       local( $path )( $path 3915,98384
+       local( $changed )( $changed 3916,98406
+       local( $i )( $i 3917,98430
+       local( $rooted )( $rooted 3919,98446
+       local( $count )( $count 3920,98482
+       local( $orig_path )( $orig_path 3921,98504
+               local( $in )( $in 3932,98741
+               local( @parts )( @parts 3933,98765
+sub fix_packagemain::fix_package3963,99438
+       local( $package )( $package 3965,99456
+sub will_compressmain::will_compress3970,99529
+sub will_splitmain::will_split3981,99859
+sub myflockmain::myflock3989,100001
+       local( $file, $kind )( $file, $kind 3991,100015
+sub t2strmain::t2str4004,100221
+       local( @t )( @t 4006,100233
+       
local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst4013,100335
+sub handlermain::handler4022,100583
+        local( $sig )( $sig 4029,100651
+        local( $msg )( $msg 4030,100679
+        local( $package, $filename, $line )( $package, $filename, $line 
4031,100737
+sub trap_signalsmain::trap_signals4036,100859
+       local( $sig )( $sig 4038,100878
+sub map_user_groupmain::map_user_group4047,101158
+sub keepmain::keep4069,101537
+       local( $pathi, $path, *keep, *keep_totals, *keep_map, $kind )( $pathi, 
$path, *keep, *keep_totals, *keep_map, $kind 4071,101548
+sub alarmmain::alarm4104,102330
+       local( $time_to_sig )( $time_to_sig 4106,102342
+sub chownmain::chown4110,102405
+       local( $uid, $gid, $path )( $uid, $gid, $path 4112,102417
+sub utimemain::utime4116,102494
+       local( $atime, $mtime, $path )( $atime, $mtime, $path 4118,102506
+       local( $old_mode )( $old_mode 4124,102685
+       local( $tmp_mode )( $tmp_mode 4125,102730
+       local( $ret )( $ret 4126,102763
+sub cwdmain::cwd4135,102913
+       local( $lcwd )( $lcwd 4137,102923
+
+ps-src/rfc1245.ps,2478
+/FMversion 12,311
+/FrameDict 17,500
+/FMVERSION 47,1307
+/FMLOCAL 56,1494
+/FMDOCUMENT 73,1766
+/FMBEGINPAGE 95,2279
+/FMENDPAGE 109,2516
+/FMDEFINEFONT 115,2582
+/FMNORMALIZEGRAPHICS 126,2725
+/FMBEGINEPSF 142,2955
+/FMENDEPSF 153,3207
+/setmanualfeed 158,3283
+/max 163,3386
+/min 164,3426
+/inch 165,3466
+/pagedimen 166,3485
+/setpapername 172,3629
+/papersize 190,4214
+/manualpapersize 211,4789
+/desperatepapersize 230,5211
+/savematrix 239,5370
+/restorematrix 242,5425
+/dmatrix 245,5475
+/dpi 246,5495
+/freq 248,5583
+/sangle 249,5658
+/DiacriticEncoding 250,5717
+/.notdef 251,5738
+/.notdef 252,5801
+/.notdef 253,5864
+/.notdef 254,5927
+/.notdef 255,5990
+/numbersign 256,6051
+/parenright 257,6115
+/two 258,6184
+/less 259,6251
+/L 260,6320
+/bracketright 261,6389
+/i 262,6459
+/braceright 263,6529
+/Ntilde 264,6598
+/atilde 265,6668
+/iacute 266,6733
+/ocircumflex 267,6797
+/udieresis 268,6858
+/paragraph 269,6919
+/dieresis 270,6983
+/yen 271,7050
+/ordfeminine 272,7109
+/exclamdown 273,7171
+/guillemotleft 274,7230
+/Otilde 275,7296
+/quoteleft 276,7357
+/fraction 277,7420
+/periodcentered 278,7490
+/Acircumflex 279,7549
+/Icircumflex 280,7610
+/Uacute 281,7680
+/breve 282,7746
+/ReEncode 284,7814
+/graymode 300,8020
+/setpattern 310,8184
+/grayness 331,8725
+/normalize 394,9873
+/dnormalize 397,9942
+/lnormalize 400,10014
+/H 403,10104
+/Z 406,10147
+/X 409,10176
+/V 412,10219
+/N 415,10260
+/M 418,10286
+/E 419,10315
+/D 420,10336
+/O 421,10358
+/L 423,10394
+/Y 430,10489
+/R 439,10588
+/RR 450,10696
+/C 467,10959
+/U 473,11004
+/F 477,11039
+/T 481,11084
+/RF 484,11115
+/TF 488,11164
+/P 495,11219
+/PF 499,11270
+/S 506,11344
+/SF 510,11384
+/B 517,11446
+/BF 521,11505
+/W 538,11714
+/G 573,12382
+/A 582,12525
+/BEGINPRINTCODE 606,12918
+/ENDPRINTCODE 615,13131
+/gn 620,13259
+/cfs 631,13384
+/ic 636,13473
+/ms 658,14285
+/ip 668,14395
+/wh 678,14492
+/bl 684,14607
+/s1 690,14722
+/fl 691,14739
+/hx 698,14887
+/wbytes 709,15055
+/BEGINBITMAPBWc 713,15147
+/BEGINBITMAPGRAYc 716,15198
+/BEGINBITMAP2BITc 719,15251
+/COMMONBITMAPc 722,15304
+/BEGINBITMAPBW 739,15660
+/BEGINBITMAPGRAY 742,15709
+/BEGINBITMAP2BIT 745,15760
+/COMMONBITMAP 748,15811
+/Fmcc 765,16156
+/ngrayt 773,16371
+/nredt 774,16393
+/nbluet 775,16414
+/ngreent 776,16436
+/colorsetup 787,16603
+/fakecolorsetup 814,17370
+/BITMAPCOLOR 826,17636
+/BITMAPCOLORc 839,17926
+/BITMAPGRAY 855,18275
+/BITMAPGRAYc 858,18335
+/ENDBITMAP 861,18397
+/fillprocs 868,18497
+
+prol-src/ordsets.prolog,525
+is_ordset(47,1310
+list_to_ord_set(63,1688
+ord_add_element(71,1867
+ord_del_element(85,2344
+ord_disjoint(100,2783
+ord_intersect(108,2953
+ord_intersection(126,3552
+ord_intersection3(130,3691
+ord_intersection(150,4531
+ord_intersection4(154,4703
+ord_intersection(176,5664
+ord_intersection2(181,5812
+ord_member(200,6318
+ord_seteq(216,6683
+ord_setproduct(225,6971
+ord_subset(240,7377
+ord_subtract(257,7861
+ord_symdiff(265,8054
+ord_union(288,8887
+ord_union4(303,9352
+ord_union(324,10171
+ord_union_all(329,10313
+
+prol-src/natded.prolog,2319
+expandmng(100,2879
+normalize(116,3359
+fresh_vars(125,3716
+subst(138,4134
+normalize_fresh(159,4660
+reduce_subterm(171,5112
+reduce(185,5559
+free_var(196,5903
+free_for(209,6246
+compile_lex(231,6875
+consult_lex:-consult_lex248,7384
+lex(259,7754
+expandsyn(267,8068
+bas_syn(292,8897
+compile_empty:-compile_empty310,9376
+complete(328,10055
+add_active(340,10527
+parse(353,10949
+derived_analyses(364,11341
+build(378,11965
+buildact(392,12521
+mapsyn(412,13542
+add_edge(434,14278
+findcats(447,14758
+normalize_tree(465,15478
+normalize_trees(475,15856
+expandmng_tree(486,16248
+expandmng_trees(496,16614
+cat(511,17013
+subtree(644,21266
+hypothetical_mem(653,21565
+make_coor(667,22130
+start_up:-start_up688,23013
+tokenizeatom(710,23921
+tokenize(720,24348
+isoperator(752,25377
+isoptab(756,25431
+specialsymbol(765,25756
+sstab(771,25861
+parse_cgi(787,26347
+keyvalseq(792,26510
+andkeyvalseq(796,26609
+keyval(799,26688
+valseq(807,26920
+plusvalseq(810,27007
+val(816,27109
+argvals(824,27426
+commaargvals(828,27503
+atomval(833,27578
+atom(836,27640
+action(846,28004
+keyvalcgi(864,28649
+keyvalscgi(865,28670
+outsyn(868,28726
+act(876,29060
+actout(901,29906
+texttreelist(912,30089
+htmltreelist(918,30190
+fitchtreelist(924,30304
+pp_html_table_tree(938,30759
+pp_html_tree(949,31113
+pp_html_trees(988,32381
+pp_html_table_fitch_tree(999,32769
+pp_html_fitch_tree(1017,33672
+removeexp(1129,39002
+splitexp(1142,39490
+pp_exp(1155,39990
+map_word(1168,40249
+pp_exps(1180,40474
+pp_tree(1188,40777
+pp_trees(1216,41807
+pp_word_list(1225,42128
+pp_word(1231,42262
+pp_word_list_rest(1238,42569
+pp_cat(1248,42929
+pp_syn(1255,43196
+pp_syn_paren(1276,43899
+pp_paren(1293,44377
+pp_syn_back(1300,44661
+pp_bas_cat(1311,45001
+writecat(1322,45409
+writesubs(1351,46455
+writesups(1361,46757
+writelistsubs(1371,47090
+pp_lam(1380,47408
+pp_lam_bracket(1398,48022
+pp_lam_paren(1407,48338
+pp_rule(1429,49238
+member(1447,49866
+append_list(1451,49919
+append(1456,50010
+at_least_one_member(1460,50076
+numbervars(1464,50171
+reverse(1467,50209
+select(1471,50290
+select_last(1475,50357
+cat_atoms(1479,50436
+writelist(1485,50524
+write_lex_cat(1492,50676
+writebreaklex(1500,50988
+write_lex(1513,51265
+writebreak(1521,51541
+tt:-tt1531,51713
+mt:-mt1534,51784
+cmt:-cmt1537,51878
+
+pyt-src/server.py,1438
+class Controls:Controls17,358
+    def __init__(18,374
+    def __repr__(24,590
+    def __str__(34,871
+class Server:Server37,934
+    def __init__(38,948
+    def dump(73,2198
+    def __repr__(125,3896
+    def __str__(128,3945
+class User:User131,4014
+    def __init__(132,4026
+    def __repr__(172,5445
+    def __str__(206,6883
+def flag2str(223,7212
+class LabeledEntry(232,7442
+    def bind(234,7525
+    def focus_set(236,7584
+    def __init__(238,7629
+def ButtonBar(245,7909
+def helpwin(255,8280
+class ListEdit(267,8707
+    def __init__(269,8808
+    def handleList(303,10042
+    def handleNew(306,10094
+    def editItem(314,10426
+    def deleteItem(320,10596
+def ConfirmQuit(326,10760
+class ControlEdit(375,12377
+    def PostControls(376,12403
+    def GatherControls(421,13530
+class ServerEdit(512,16264
+    def __init__(513,16289
+    def post(525,16629
+    def gather(543,17191
+    def nosave(547,17304
+    def save(551,17408
+    def refreshPort(556,17509
+    def createWidgets(561,17663
+    def edituser(631,20708
+class UserEdit(645,20921
+    def __init__(646,20944
+    def post(658,21283
+    def gather(676,21841
+    def nosave(680,21950
+    def save(684,22052
+    def createWidgets(689,22151
+class Configure(760,24879
+    def __init__(761,24916
+    def MakeDispose(772,25211
+    def MakeSitelist(786,25706
+    def editsite(794,25949
+    def save(797,26022
+    def nosave(807,26310
+
+tex-src/testenv.tex,52
+\newcommand{\nm}\nm4,77
+\section{blah}blah8,139
+
+tex-src/gzip.texi,303
address@hidden Top,62,2139
address@hidden Copying,80,2652
address@hidden Overview,83,2705
address@hidden Sample,166,7272
address@hidden Invoking gzip,Invoking gzip210,8828
address@hidden Advanced usage,Advanced usage357,13495
address@hidden Environment,420,15207
address@hidden Tapes,437,15768
address@hidden Problems,460,16767
address@hidden Concept Index,Concept Index473,17287
+
+tex-src/texinfo.tex,30626
+\def\texinfoversion{\texinfoversion25,1019
+\def\tie{\tie48,1510
+\def\gloggingall{\gloggingall71,2260
+\def\loggingall{\loggingall72,2329
+\def\onepageout#1{\onepageout98,3266
+\def\croppageout#1{\croppageout114,4016
+\def\cropmarks{\cropmarks141,5076
+\def\pagebody#1{\pagebody143,5123
+\def\ewtop{\ewtop156,5578
+\def\nstop{\nstop157,5642
+\def\ewbot{\ewbot159,5725
+\def\nsbot{\nsbot160,5789
+\def\parsearg #1{\parsearg169,6088
+\def\parseargx{\parseargx171,6166
+\def\parseargline{\parseargline181,6406
+\def\flushcr{\flushcr185,6527
+\newif\ifENV \ENVfalse \def\inENV{\inENV189,6726
+\def\ENVcheck{\ENVcheck190,6790
+\outer\def\begin{\begin197,7037
+\def\beginxxx #1{\beginxxx199,7075
+\def\end{\end207,7330
+\def\endxxx #1{\endxxx209,7358
+\def\errorE#1{\errorE215,7547
+\def\singlespace{\singlespace221,7741
address@hidden@231,7964
+\def\`{\`235,8064
+\def\'{\'236,8076
+\def\mylbrace {\mylbrace240,8124
+\def\myrbrace {\myrbrace241,8157
+\def\:{\:246,8271
+\def\*{\*249,8325
+\def\.{\.252,8401
+\def\w#1{\w257,8632
+\def\group{\group267,9115
+  \def\Egroup{\Egroup272,9279
+\def\need{\need288,9721
+\def\needx#1{\needx299,9998
+\def\dots{\dots338,11384
+\def\page{\page342,11448
+\def\exdent{\exdent352,11775
+\def\exdentyyy #1{\exdentyyy353,11808
+\def\nofillexdent{\nofillexdent356,11952
+\def\nofillexdentyyy #1{\nofillexdentyyy357,11997
+\def\include{\include364,12181
+\def\includezzz #1{\includezzz365,12216
+\def\thisfile{\thisfile368,12267
+\def\center{\center372,12330
+\def\centerzzz #1{\centerzzz373,12363
+\def\sp{\sp379,12505
+\def\spxxx #1{\spxxx380,12530
+\def\comment{\comment386,12704
+\def\commentxxx #1{\commentxxx389,12801
+\def\ignoresections{\ignoresections395,12970
+\let\chapter=\relax=\relax396,12992
+\let\section=\relax=\relax405,13237
+\let\subsection=\relax=\relax408,13298
+\let\subsubsection=\relax=\relax409,13321
+\let\appendix=\relax=\relax410,13347
+\let\appendixsec=\relaxsec=\relax411,13368
+\let\appendixsection=\relaxsection=\relax412,13392
+\let\appendixsubsec=\relaxsubsec=\relax413,13420
+\let\appendixsubsection=\relaxsubsection=\relax414,13447
+\let\appendixsubsubsec=\relaxsubsubsec=\relax415,13478
+\let\appendixsubsubsection=\relaxsubsubsection=\relax416,13508
+\def\ignore{\ignore422,13610
+\long\def\ignorexxx #1\end ignore{\ignorexxx426,13750
+\def\direntry{\direntry428,13809
+\long\def\direntryxxx #1\end direntry{\direntryxxx429,13848
+\def\ifset{\ifset433,13958
+\def\ifsetxxx #1{\ifsetxxx435,14016
+\def\Eifset{\Eifset439,14143
+\def\ifsetfail{\ifsetfail440,14157
+\long\def\ifsetfailxxx #1\end ifset{\ifsetfailxxx441,14213
+\def\ifclear{\ifclear443,14274
+\def\ifclearxxx #1{\ifclearxxx445,14336
+\def\Eifclear{\Eifclear449,14467
+\def\ifclearfail{\ifclearfail450,14483
+\long\def\ifclearfailxxx #1\end ifclear{\ifclearfailxxx451,14543
+\def\set{\set455,14694
+\def\setxxx #1{\setxxx456,14721
+\def\clear{\clear459,14783
+\def\clearxxx #1{\clearxxx460,14814
+\def\iftex{\iftex465,14931
+\def\Eiftex{\Eiftex466,14944
+\def\ifinfo{\ifinfo467,14958
+\long\def\ifinfoxxx #1\end ifinfo{\ifinfoxxx468,15008
+\long\def\menu #1\end menu{\menu470,15067
+\def\asis#1{\asis471,15096
+\def\math#1{\math484,15639
+\def\node{\node486,15683
+\def\nodezzz#1{\nodezzz487,15721
+\def\nodexxx[#1,#2]{\nodexxx[488,15752
+\def\donoderef{\donoderef491,15814
+\def\unnumbnoderef{\unnumbnoderef495,15935
+\def\appendixnoderef{\appendixnoderef499,16066
+\expandafter\expandafter\expandafter\appendixsetref{setref500,16112
+\let\refill=\relaxill=\relax503,16201
+\def\setfilename{\setfilename508,16415
+\outer\def\bye{\bye517,16661
+\def\inforef #1{\inforef519,16717
+\def\inforefzzz #1,#2,#3,#4**{\inforefzzz520,16755
+\def\losespace #1{\losespace522,16852
+\def\sf{\sf531,17056
+\font\defbf=cmbx10 scaled \magstep1 %was 1314bf=cmbx10557,17851
+\font\deftt=cmtt10 scaled \magstep1tt=cmtt10558,17897
+\def\df{\df559,17933
+\def\resetmathfonts{\resetmathfonts634,20527
+\def\textfonts{\textfonts647,21116
+\def\chapfonts{\chapfonts652,21331
+\def\secfonts{\secfonts657,21547
+\def\subsecfonts{\subsecfonts662,21752
+\def\indexfonts{\indexfonts667,21969
+\def\smartitalicx{\smartitalicx690,22701
+\def\smartitalic#1{\smartitalic691,22777
+\let\cite=\smartitalic=\smartitalic697,22922
+\def\b#1{\b699,22946
+\def\t#1{\t702,22981
+\def\samp #1{\samp705,23133
+\def\key #1{\key706,23166
+\def\ctrl #1{\ctrl707,23227
+\def\tclose#1{\tclose715,23429
+\def\ {\719,23595
+\def\xkey{\xkey727,23864
+\def\kbdfoo#1#2#3\par{\kbdfoo728,23880
+\def\dmn#1{\dmn737,24181
+\def\kbd#1{\kbd739,24208
+\def\l#1{\l741,24265
+\def\r#1{\r743,24294
+\def\sc#1{\sc745,24362
+\def\ii#1{\ii746,24405
+\def\titlefont#1{\titlefont754,24638
+\def\titlepage{\titlepage760,24741
+   \def\subtitlefont{\subtitlefont765,24968
+   \def\authorfont{\authorfont767,25052
+   \def\title{\title773,25262
+   \def\titlezzz##1{\titlezzz774,25297
+   \def\subtitle{\subtitle782,25612
+   \def\subtitlezzz##1{\subtitlezzz783,25653
+   \def\author{\author786,25771
+   \def\authorzzz##1{\authorzzz787,25808
+   \def\page{\page793,26099
+\def\Etitlepage{\Etitlepage803,26268
+\def\finishtitlepage{\finishtitlepage816,26656
+\def\evenheading{\evenheading845,27664
+\def\oddheading{\oddheading846,27707
+\def\everyheading{\everyheading847,27748
+\def\evenfooting{\evenfooting849,27794
+\def\oddfooting{\oddfooting850,27837
+\def\everyfooting{\everyfooting851,27878
+\def\headings #1 {\headings892,29570
+\def\HEADINGSoff{\HEADINGSoff894,29619
+\def\HEADINGSdouble{\HEADINGSdouble903,30046
+\def\HEADINGSsingle{\HEADINGSsingle913,30366
+\def\HEADINGSon{\HEADINGSon921,30587
+\def\HEADINGSafter{\HEADINGSafter923,30621
+\def\HEADINGSdoublex{\HEADINGSdoublex925,30716
+\def\HEADINGSsingleafter{\HEADINGSsingleafter932,30904
+\def\HEADINGSsinglex{\HEADINGSsinglex933,30965
+\def\today{\today942,31240
+\def\thistitle{\thistitle957,31785
+\def\settitle{\settitle958,31810
+\def\settitlezzz #1{\settitlezzz959,31847
+\def\internalBitem{\internalBitem991,32777
+\def\internalBitemx{\internalBitemx992,32827
+\def\internalBxitem "#1"{\internalBxitem994,32872
+\def\internalBxitemx "#1"{\internalBxitemx995,32952
+\def\internalBkitem{\internalBkitem997,33027
+\def\internalBkitemx{\internalBkitemx998,33079
+\def\kitemzzz #1{\kitemzzz1000,33126
+\def\xitemzzz #1{\xitemzzz1003,33228
+\def\itemzzz #1{\itemzzz1006,33331
+\def\item{\item1036,34402
+\def\itemx{\itemx1037,34453
+\def\kitem{\kitem1038,34506
+\def\kitemx{\kitemx1039,34559
+\def\xitem{\xitem1040,34614
+\def\xitemx{\xitemx1041,34667
+\def\description{\description1044,34777
+\def\table{\table1046,34827
+\def\ftable{\ftable1051,34971
+\def\Eftable{\Eftable1055,35117
+\def\vtable{\vtable1058,35186
+\def\Evtable{\Evtable1062,35332
+\def\dontindex #1{\dontindex1065,35401
+\def\fnitemindex #1{\fnitemindex1066,35421
+\def\vritemindex #1{\vritemindex1067,35466
+\def\tablez #1#2#3#4#5#6{\tablez1073,35615
+\def\Edescription{\Edescription1076,35673
+\def\itemfont{\itemfont1081,35875
+\def\Etable{\Etable1089,36101
+\def\itemize{\itemize1102,36425
+\def\itemizezzz #1{\itemizezzz1104,36461
+\def\itemizey #1#2{\itemizey1109,36556
+\def#2{1118,36802
+\def\itemcontents{\itemcontents1119,36843
+\def\bullet{\bullet1122,36891
+\def\minus{\minus1123,36918
+\def\frenchspacing{\frenchspacing1127,37026
+\def\splitoff#1#2\endmark{\splitoff1133,37251
+\def\enumerate{\enumerate1139,37481
+\def\enumeratezzz #1{\enumeratezzz1140,37520
+\def\enumeratey #1 #2\endenumeratey{\enumeratey1141,37573
+  \def\thearg{\thearg1145,37720
+  \ifx\thearg\empty \def\thearg{\thearg1146,37739
+\def\numericenumerate{\numericenumerate1183,39073
+\def\lowercaseenumerate{\lowercaseenumerate1189,39203
+\def\uppercaseenumerate{\uppercaseenumerate1202,39550
+\def\startenumeration#1{\startenumeration1218,40040
+\def\alphaenumerate{\alphaenumerate1226,40222
+\def\capsenumerate{\capsenumerate1227,40257
+\def\Ealphaenumerate{\Ealphaenumerate1228,40291
+\def\Ecapsenumerate{\Ecapsenumerate1229,40325
+\def\itemizeitem{\itemizeitem1233,40405
+\def\newindex #1{\newindex1258,41262
+\def\defindex{\defindex1267,41551
+\def\newcodeindex #1{\newcodeindex1271,41659
+\def\defcodeindex{\defcodeindex1278,41919
+\def\synindex #1 #2 {\synindex1282,42099
+\def\syncodeindex #1 #2 {\syncodeindex1291,42439
+\def\doindex#1{\doindex1308,43118
+\def\singleindexer #1{\singleindexer1309,43177
+\def\docodeindex#1{\docodeindex1312,43289
+\def\singlecodeindexer #1{\singlecodeindexer1313,43356
+\def\indexdummies{\indexdummies1315,43414
+\def\_{\_1316,43434
+\def\w{\w1317,43462
+\def\bf{\bf1318,43489
+\def\rm{\rm1319,43518
+\def\sl{\sl1320,43547
+\def\sf{\sf1321,43576
+\def\tt{\tt1322,43604
+\def\gtr{\gtr1323,43632
+\def\less{\less1324,43662
+\def\hat{\hat1325,43694
+\def\char{\char1326,43724
+\def\TeX{\TeX1327,43756
+\def\dots{\dots1328,43786
+\def\copyright{\copyright1329,43819
+\def\tclose##1{\tclose1330,43862
+\def\code##1{\code1331,43907
+\def\samp##1{\samp1332,43948
+\def\t##1{\t1333,43989
+\def\r##1{\r1334,44024
+\def\i##1{\i1335,44059
+\def\b##1{\b1336,44094
+\def\cite##1{\cite1337,44129
+\def\key##1{\key1338,44170
+\def\file##1{\file1339,44209
+\def\var##1{\var1340,44250
+\def\kbd##1{\kbd1341,44289
+\def\indexdummyfont#1{\indexdummyfont1346,44445
+\def\indexdummytex{\indexdummytex1347,44471
+\def\indexdummydots{\indexdummydots1348,44495
+\def\indexnofonts{\indexnofonts1350,44521
+\let\w=\indexdummyfontdummyfont1351,44541
+\let\t=\indexdummyfontdummyfont1352,44564
+\let\r=\indexdummyfontdummyfont1353,44587
+\let\i=\indexdummyfontdummyfont1354,44610
+\let\b=\indexdummyfontdummyfont1355,44633
+\let\emph=\indexdummyfontdummyfont1356,44656
+\let\strong=\indexdummyfontdummyfont1357,44682
+\let\cite=\indexdummyfont=\indexdummyfont1358,44710
+\let\sc=\indexdummyfontdummyfont1359,44736
+\let\tclose=\indexdummyfontdummyfont1363,44908
+\let\code=\indexdummyfontdummyfont1364,44936
+\let\file=\indexdummyfontdummyfont1365,44962
+\let\samp=\indexdummyfontdummyfont1366,44988
+\let\kbd=\indexdummyfontdummyfont1367,45014
+\let\key=\indexdummyfontdummyfont1368,45039
+\let\var=\indexdummyfontdummyfont1369,45064
+\let\TeX=\indexdummytexdummytex1370,45089
+\let\dots=\indexdummydotsdummydots1371,45113
+\let\indexbackslash=0  %overridden during \printindex.backslash=01381,45365
+\def\doind #1#2{\doind1383,45421
+{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1385,45464
+\def\rawbackslashxx{\rawbackslashxx1388,45604
+{\indexnofontsnofonts1393,45866
+\def\dosubind #1#2#3{\dosubind1404,46177
+{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1406,46225
+\def\rawbackslashxx{\rawbackslashxx1409,46329
+{\indexnofontsnofonts1413,46483
+\def\findex {\findex1442,47414
+\def\kindex {\kindex1443,47437
+\def\cindex {\cindex1444,47460
+\def\vindex {\vindex1445,47483
+\def\tindex {\tindex1446,47506
+\def\pindex {\pindex1447,47529
+\def\cindexsub {\cindexsub1449,47553
+\def\printindex{\printindex1461,47880
+\def\doprintindex#1{\doprintindex1463,47921
+  \def\indexbackslash{\indexbackslash1480,48406
+  \indexfonts\rm \tolerance=9500 \advance\baselineskip -1ptfonts\rm1481,48445
+\def\initial #1{\initial1516,49517
+\def\entry #1#2{\entry1522,49724
+  \null\nobreak\indexdotfill % Have leaders before the page 
number.dotfill1539,50371
+\def\indexdotfill{\indexdotfill1548,50699
+\def\primary #1{\primary1551,50805
+\def\secondary #1#2{\secondary1555,50887
+\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\pardotfill1558,50969
+\newbox\partialpageialpage1565,51142
+\def\begindoublecolumns{\begindoublecolumns1571,51300
+  \output={\global\setbox\partialpage=ialpage=1572,51336
+\def\enddoublecolumns{\enddoublecolumns1576,51524
+\def\doublecolumnout{\doublecolumnout1579,51609
+  address@hidden \advance\dimen@ by-\ht\partialpageialpage1580,51678
+\def\pagesofar{\pagesofar1583,51856
+\def\balancecolumns{\balancecolumns1587,52093
+  address@hidden \advance\availdimen@ by-\ht\partialpageialpage1593,52264
+     address@hidden \advance\dimen@ by-\ht\partialpageialpage1599,52525
+\newcount \appendixno  \appendixno = address@hidden,53430
+\def\appendixletter{\appendixletter1627,53471
+\def\opencontents{\opencontents1631,53574
+\def\thischapter{\thischapter1636,53755
+\def\seccheck#1{\seccheck1637,53793
+\def\chapternofonts{\chapternofonts1642,53897
+\def\result{\result1645,53972
+\def\equiv{\equiv1646,54007
+\def\expansion{\expansion1647,54040
+\def\print{\print1648,54081
+\def\TeX{\TeX1649,54114
+\def\dots{\dots1650,54143
+\def\copyright{\copyright1651,54174
+\def\tt{\tt1652,54215
+\def\bf{\bf1653,54242
+\def\w{\w1654,54270
+\def\less{\less1655,54295
+\def\gtr{\gtr1656,54326
+\def\hat{\hat1657,54355
+\def\char{\char1658,54384
+\def\tclose##1{\tclose1659,54415
+\def\code##1{\code1660,54459
+\def\samp##1{\samp1661,54499
+\def\r##1{\r1662,54539
+\def\b##1{\b1663,54573
+\def\key##1{\key1664,54607
+\def\file##1{\file1665,54645
+\def\kbd##1{\kbd1666,54685
+\def\i##1{\i1668,54793
+\def\cite##1{\cite1669,54827
+\def\var##1{\var1670,54867
+\def\emph##1{\emph1671,54905
+\def\dfn##1{\dfn1672,54945
+\def\thischaptername{\thischaptername1675,54986
+\outer\def\chapter{\chapter1676,55025
+\def\chapterzzz #1{\chapterzzz1677,55066
+{\chapternofonts%nofonts%1686,55462
+\global\let\section = \numberedsec=1691,55615
+\global\let\subsection = \numberedsubsec=1692,55650
+\global\let\subsubsection = \numberedsubsubsec=1693,55691
+\outer\def\appendix{\appendix1696,55742
+\def\appendixzzz #1{\appendixzzz1697,55785
+\global\advance \appendixno by 1 \message{no1699,55862
+\chapmacro {#1}{Appendix \appendixletter}letter1700,55931
+\xdef\thischapter{Appendix \appendixletter: 
\noexpand\thischaptername}letter:1703,56024
+{\chapternofonts%nofonts%1704,56096
+  {#1}{Appendix \appendixletter}letter1706,56152
+\appendixnoderef %noderef1709,56252
+\global\let\section = \appendixsec=1710,56271
+\global\let\subsection = \appendixsubsec=1711,56306
+\global\let\subsubsection = \appendixsubsubsec=1712,56347
+\outer\def\top{\top1715,56398
+\outer\def\unnumbered{\unnumbered1716,56438
+\def\unnumberedzzz #1{\unnumberedzzz1717,56485
+{\chapternofonts%nofonts%1721,56648
+\global\let\section = \unnumberedsec=1726,56798
+\global\let\subsection = \unnumberedsubsec=1727,56835
+\global\let\subsubsection = \unnumberedsubsubsec=1728,56878
+\outer\def\numberedsec{\numberedsec1731,56931
+\def\seczzz #1{\seczzz1732,56972
+{\chapternofonts%nofonts%1735,57128
+\outer\def\appendixsection{\appendixsection1744,57314
+\outer\def\appendixsec{\appendixsec1745,57371
+\def\appendixsectionzzz #1{\appendixsectionzzz1746,57424
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}letter1748,57536
+{\chapternofonts%nofonts%1749,57604
+{#1}{\appendixletter}letter1751,57660
+\appendixnoderef %noderef1754,57760
+\outer\def\unnumberedsec{\unnumberedsec1758,57800
+\def\unnumberedseczzz #1{\unnumberedseczzz1759,57853
+{\chapternofonts%nofonts%1761,57948
+\outer\def\numberedsubsec{\numberedsubsec1769,58116
+\def\numberedsubseczzz #1{\numberedsubseczzz1770,58171
+{\chapternofonts%nofonts%1773,58350
+\outer\def\appendixsubsec{\appendixsubsec1782,58554
+\def\appendixsubseczzz #1{\appendixsubseczzz1783,58609
+\subsecheading {#1}{\appendixletter}letter1785,58731
+{\chapternofonts%nofonts%1786,58796
+{#1}{\appendixletter}letter1788,58855
+\appendixnoderef %noderef1791,58970
+\outer\def\unnumberedsubsec{\unnumberedsubsec1795,59010
+\def\unnumberedsubseczzz #1{\unnumberedsubseczzz1796,59069
+{\chapternofonts%nofonts%1798,59170
+\outer\def\numberedsubsubsec{\numberedsubsubsec1806,59341
+\def\numberedsubsubseczzz #1{\numberedsubsubseczzz1807,59402
+{\chapternofonts%nofonts%1811,59599
+\outer\def\appendixsubsubsec{\appendixsubsubsec1822,59832
+\def\appendixsubsubseczzz #1{\appendixsubsubseczzz1823,59893
+  {\appendixletter}letter1826,60032
+{\chapternofonts%nofonts%1827,60098
+  {\appendixletter}letter1829,60163
+\appendixnoderef %noderef1833,60297
+\outer\def\unnumberedsubsubsec{\unnumberedsubsubsec1837,60337
+\def\unnumberedsubsubseczzz #1{\unnumberedsubsubseczzz1838,60402
+{\chapternofonts%nofonts%1840,60509
+\def\infotop{\infotop1850,60838
+\def\infounnumbered{\infounnumbered1851,60876
+\def\infounnumberedsec{\infounnumberedsec1852,60921
+\def\infounnumberedsubsec{\infounnumberedsubsec1853,60972
+\def\infounnumberedsubsubsec{\infounnumberedsubsubsec1854,61029
+\def\infoappendix{\infoappendix1856,61093
+\def\infoappendixsec{\infoappendixsec1857,61134
+\def\infoappendixsubsec{\infoappendixsubsec1858,61181
+\def\infoappendixsubsubsec{\infoappendixsubsubsec1859,61234
+\def\infochapter{\infochapter1861,61294
+\def\infosection{\infosection1862,61333
+\def\infosubsection{\infosubsection1863,61372
+\def\infosubsubsection{\infosubsubsection1864,61417
+\global\let\section = \numberedsec=1869,61654
+\global\let\subsection = \numberedsubsec=1870,61689
+\global\let\subsubsection = \numberedsubsubsec=1871,61730
+\def\majorheading{\majorheading1885,62237
+\def\majorheadingzzz #1{\majorheadingzzz1886,62282
+\def\chapheading{\chapheading1892,62515
+\def\chapheadingzzz #1{\chapheadingzzz1893,62558
+\def\heading{\heading1898,62753
+\def\subheading{\subheading1900,62790
+\def\subsubheading{\subsubheading1902,62833
+\def\dobreak#1#2{\dobreak1909,63110
+\def\setchapterstyle #1 {\setchapterstyle1911,63188
+\def\chapbreak{\chapbreak1918,63443
+\def\chappager{\chappager1919,63493
+\def\chapoddpage{\chapoddpage1920,63531
+\def\setchapternewpage #1 {\setchapternewpage1922,63610
+\def\CHAPPAGoff{\CHAPPAGoff1924,63667
+\def\CHAPPAGon{\CHAPPAGon1928,63761
+\global\def\HEADINGSon{\HEADINGSon1931,63852
+\def\CHAPPAGodd{\CHAPPAGodd1933,63894
+\global\def\HEADINGSon{\HEADINGSon1936,63990
+\def\CHAPFplain{\CHAPFplain1940,64044
+\def\chfplain #1#2{\chfplain1944,64136
+\def\unnchfplain #1{\unnchfplain1955,64359
+\def\unnchfopen #1{\unnchfopen1963,64588
+\def\chfopen #1#2{\chfopen1969,64796
+\def\CHAPFopen{\CHAPFopen1974,64940
+\def\subsecheadingbreak{\subsecheadingbreak1981,65158
+\def\secheadingbreak{\secheadingbreak1984,65287
+\def\secheading #1#2#3{\secheading1992,65569
+\def\plainsecheading #1{\plainsecheading1993,65625
+\def\secheadingi #1{\secheadingi1994,65668
+\def\subsecheading #1#2#3#4{\subsecheading2005,66036
+\def\subsecheadingi #1{\subsecheadingi2006,66103
+\def\subsubsecfonts{\subsubsecfonts2013,66400
+\def\subsubsecheading #1#2#3#4#5{\subsubsecheading2016,66523
+\def\subsubsecheadingi #1{\subsubsecheadingi2017,66601
+\def\startcontents#1{\startcontents2031,67073
+   \unnumbchapmacro{#1}\def\thischapter{\thischapter2039,67346
+\outer\def\contents{\contents2048,67705
+\outer\def\summarycontents{\summarycontents2056,67849
+      \def\secentry ##1##2##3##4{\secentry2066,68220
+      \def\unnumbsecentry ##1##2{\unnumbsecentry2067,68255
+      \def\subsecentry ##1##2##3##4##5{\subsecentry2068,68290
+      \def\unnumbsubsecentry ##1##2{\unnumbsubsecentry2069,68331
+      \def\subsubsecentry ##1##2##3##4##5##6{\subsubsecentry2070,68369
+      \def\unnumbsubsubsecentry ##1##2{\unnumbsubsubsecentry2071,68416
+\def\chapentry#1#2#3{\chapentry2084,68850
+\def\shortchapentry#1#2#3{\shortchapentry2087,68967
+    {#2\labelspace #1}space2090,69077
+\def\unnumbchapentry#1#2{\unnumbchapentry2093,69131
+\def\shortunnumberedentry#1#2{\shortunnumberedentry2094,69178
+\def\secentry#1#2#3#4{\secentry2101,69342
+\def\unnumbsecentry#1#2{\unnumbsecentry2102,69401
+\def\subsecentry#1#2#3#4#5{\subsecentry2105,69462
+\def\unnumbsubsecentry#1#2{\unnumbsubsecentry2106,69532
+\def\subsubsecentry#1#2#3#4#5#6{\subsubsecentry2109,69606
+  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}space2110,69640
+\def\unnumbsubsubsecentry#1#2{\unnumbsubsubsecentry2111,69691
+\def\dochapentry#1#2{\dochapentry2122,70065
+\def\dosecentry#1#2{\dosecentry2137,70670
+\def\dosubsecentry#1#2{\dosubsecentry2144,70848
+\def\dosubsubsecentry#1#2{\dosubsubsecentry2151,71033
+\def\labelspace{\labelspace2159,71284
+\def\dopageno#1{\dopageno2161,71319
+\def\doshortpageno#1{\doshortpageno2162,71345
+\def\chapentryfonts{\chapentryfonts2164,71377
+\def\secentryfonts{\secentryfonts2165,71412
+\def\point{\point2191,72371
+\def\result{\result2193,72392
+\def\expansion{\expansion2194,72465
+\def\print{\print2195,72536
+\def\equiv{\equiv2197,72603
+\def\error{\error2217,73376
+\def\tex{\tex2223,73605
address@hidden@2241,73988
+\gdef\sepspaces{\def {\ }}}\2264,74720
+\def\aboveenvbreak{\aboveenvbreak2267,74802
+\def\afterenvbreak{\afterenvbreak2271,74968
+\def\ctl{\ctl2285,75479
+\def\ctr{\ctr2286,75551
+\def\cbl{\cbl2287,75590
+\def\cbr{\cbr2288,75630
+\def\carttop{\carttop2289,75669
+\def\cartbot{\cartbot2292,75777
+\long\def\cartouche{\cartouche2298,75917
+\def\Ecartouche{\Ecartouche2325,76705
+\def\lisp{\lisp2337,76840
+\def\Elisp{\Elisp2347,77187
+\def\next##1{\next2359,77513
+\def\Eexample{\Eexample2363,77555
+\def\Esmallexample{\Esmallexample2366,77602
+\def\smalllispx{\smalllispx2372,77780
+\def\Esmalllisp{\Esmalllisp2382,78134
+\obeyspaces \obeylines \ninett \indexfonts \rawbackslashfonts2395,78490
+\def\next##1{\next2396,78547
+\def\display{\display2400,78627
+\def\Edisplay{\Edisplay2409,78946
+\def\next##1{\next2421,79257
+\def\format{\format2425,79360
+\def\Eformat{\Eformat2433,79656
+\def\next##1{\next2436,79745
+\def\flushleft{\flushleft2440,79797
+\def\Eflushleft{\Eflushleft2450,80168
+\def\next##1{\next2453,80261
+\def\flushright{\flushright2455,80283
+\def\Eflushright{\Eflushright2465,80655
+\def\next##1{\next2469,80786
+\def\quotation{\quotation2473,80844
+\def\Equotation{\Equotation2479,81036
+\def\setdeffont #1 {\setdeffont2492,81434
+\newskip\defbodyindent \defbodyindent=.4inbodyindent2494,81480
+\newskip\defargsindent \defargsindent=50ptargsindent2495,81523
+\newskip\deftypemargin \deftypemargin=12pttypemargin2496,81566
+\newskip\deflastargmargin \deflastargmargin=18ptlastargmargin2497,81609
+\def\activeparens{\activeparens2502,81807
+\def\opnr{\opnr2528,83019
+\def\lbrb{\lbrb2529,83084
+\def\defname #1#2{\defname2535,83285
+\advance\dimen2 by -\defbodyindentbodyindent2539,83403
+\advance\dimen3 by -\defbodyindentbodyindent2541,83457
+\setbox0=\hbox{\hskip \deflastargmargin{lastargmargin2543,83511
+\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for 
continuationsargsindent2545,83653
+\parshape 2 0in \dimen0 \defargsindent \dimen1     %argsindent2546,83728
+\rlap{\rightline{{\rm #2}\hskip \deftypemargin}typemargin2553,84097
+\advance\leftskip by -\defbodyindentbodyindent2556,84231
+\exdentamount=\defbodyindentbodyindent2557,84268
+\def\defparsebody #1#2#3{\defparsebody2567,84627
+\def#1{2571,84811
+\def#2{2572,84847
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2574,84919
+\exdentamount=\defbodyindentbodyindent2575,84993
+\def\defmethparsebody #1#2#3#4 {\defmethparsebody2580,85097
+\def#1{2584,85258
+\def#2##1 {2585,85294
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2587,85377
+\exdentamount=\defbodyindentbodyindent2588,85451
+\def\defopparsebody #1#2#3#4#5 {\defopparsebody2591,85536
+\def#1{2595,85697
+\def#2##1 ##2 {2596,85733
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2599,85833
+\exdentamount=\defbodyindentbodyindent2600,85907
+\def\defvarparsebody #1#2#3{\defvarparsebody2607,86178
+\def#1{2611,86365
+\def#2{2612,86401
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2614,86460
+\exdentamount=\defbodyindentbodyindent2615,86534
+\def\defvrparsebody #1#2#3#4 {\defvrparsebody2620,86625
+\def#1{2624,86784
+\def#2##1 {2625,86820
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2627,86890
+\exdentamount=\defbodyindentbodyindent2628,86964
+\def\defopvarparsebody #1#2#3#4#5 {\defopvarparsebody2631,87036
+\def#1{2635,87200
+\def#2##1 ##2 {2636,87236
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2639,87323
+\exdentamount=\defbodyindentbodyindent2640,87397
+\def\defunargs #1{\defunargs2663,88157
+\def\deftypefunargs #1{\deftypefunargs2675,88539
+\def\deffn{\deffn2689,88921
+\def\deffnheader #1#2#3{\deffnheader2691,88978
+\begingroup\defname {name2692,89026
+\def\defun{\defun2698,89171
+\def\defunheader #1#2{\defunheader2700,89224
+\begingroup\defname {name2701,89299
+\defunargs {unargs2702,89335
+\def\deftypefun{\deftypefun2708,89483
+\def\deftypefunheader #1#2{\deftypefunheader2711,89605
+\def\deftypefunheaderx #1#2 #3\relax{\deftypefunheaderx2713,89714
+\begingroup\defname {name2715,89806
+\deftypefunargs {typefunargs2716,89852
+\def\deftypefn{\deftypefn2722,90023
+\def\deftypefnheader #1#2#3{\deftypefnheader2725,90172
+\def\deftypefnheaderx #1#2#3 #4\relax{\deftypefnheaderx2727,90308
+\begingroup\defname {name2729,90401
+\deftypefunargs {typefunargs2730,90441
+\def\defmac{\defmac2736,90562
+\def\defmacheader #1#2{\defmacheader2738,90619
+\begingroup\defname {name2739,90695
+\defunargs {unargs2740,90728
+\def\defspec{\defspec2746,90852
+\def\defspecheader #1#2{\defspecheader2748,90913
+\begingroup\defname {name2749,90990
+\defunargs {unargs2750,91030
+\def\deffnx #1 {\deffnx2757,91225
+\def\defunx #1 {\defunx2758,91282
+\def\defmacx #1 {\defmacx2759,91339
+\def\defspecx #1 {\defspecx2760,91398
+\def\deftypefnx #1 {\deftypefnx2761,91459
+\def\deftypeunx #1 {\deftypeunx2762,91524
+\def\defop #1 {\defop2768,91670
+\defopparsebody\Edefop\defopx\defopheader\defoptype}opparsebody\Edefop\defopx\defopheader\defoptype2769,91705
+\def\defopheader #1#2#3{\defopheader2771,91759
+\begingroup\defname {name2773,91848
+\defunargs {unargs2774,91894
+\def\defmethod{\defmethod2779,91955
+\def\defmethodheader #1#2#3{\defmethodheader2781,92028
+\begingroup\defname {name2783,92116
+\defunargs {unargs2784,92156
+\def\defcv #1 {\defcv2789,92230
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype2790,92265
+\def\defcvarheader #1#2#3{\defcvarheader2792,92324
+\begingroup\defname {name2794,92410
+\defvarargs {varargs2795,92456
+\def\defivar{\defivar2800,92529
+\def\defivarheader #1#2#3{\defivarheader2802,92592
+\begingroup\defname {name2804,92678
+\defvarargs {varargs2805,92729
+\def\defopx #1 {\defopx2811,92878
+\def\defmethodx #1 {\defmethodx2812,92935
+\def\defcvx #1 {\defcvx2813,93000
+\def\defivarx #1 {\defivarx2814,93057
+\def\defvarargs #1{\defvarargs2821,93328
+\def\defvr{\defvr2827,93472
+\def\defvrheader #1#2#3{\defvrheader2829,93527
+\begingroup\defname {name2830,93575
+\def\defvar{\defvar2834,93660
+\def\defvarheader #1#2{\defvarheader2836,93720
+\begingroup\defname {name2837,93791
+\defvarargs {varargs2838,93827
+\def\defopt{\defopt2843,93893
+\def\defoptheader #1#2{\defoptheader2845,93953
+\begingroup\defname {name2846,94024
+\defvarargs {varargs2847,94063
+\def\deftypevar{\deftypevar2852,94120
+\def\deftypevarheader #1#2{\deftypevarheader2855,94236
+\begingroup\defname {name2857,94319
+\def\deftypevr{\deftypevr2864,94493
+\def\deftypevrheader #1#2#3{\deftypevrheader2866,94564
+\begingroup\defname {name2867,94616
+\def\defvrx #1 {\defvrx2875,94853
+\def\defvarx #1 {\defvarx2876,94910
+\def\defoptx #1 {\defoptx2877,94969
+\def\deftypevarx #1 {\deftypevarx2878,95028
+\def\deftypevrx #1 {\deftypevrx2879,95095
+\def\deftpargs #1{\deftpargs2884,95244
+\def\deftp{\deftp2888,95324
+\def\deftpheader #1#2#3{\deftpheader2890,95379
+\begingroup\defname {name2891,95427
+\def\deftpx #1 {\deftpx2896,95586
+\def\setref#1{\setref2907,95907
+\def\unnumbsetref#1{\unnumbsetref2912,96021
+\def\appendixsetref#1{\appendixsetref2917,96128
+\def\pxref#1{\pxref2928,96539
+\def\xref#1{\xref2929,96575
+\def\ref#1{\ref2930,96610
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\xrefX[2931,96640
+\def\printedmanual{\printedmanual2932,96683
+\def\printednodename{\printednodename2933,96721
+\def\printednodename{\printednodename2938,96846
+section ``\printednodename'' in \cite{\printedmanual}\printedmanual2953,97479
+\refx{x2956,97557
+\def\dosetq #1#2{\dosetq2964,97777
+\def\internalsetq #1#2{\internalsetq2972,98035
+\def\Ypagenumber{\Ypagenumber2976,98136
+\def\Ytitle{\Ytitle2978,98162
+\def\Ynothing{\Ynothing2980,98189
+\def\Ysectionnumberandtype{\Ysectionnumberandtype2982,98206
+\def\Yappendixletterandtype{\Yappendixletterandtype2991,98522
+\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{no2992,98552
+\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno 
%no.\the\secno2993,98607
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno 
%no.\the\secno.\the\subsecno2995,98711
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno 
%no.\the\secno.\the\subsecno.\the\subsubsecno2997,98782
+  \def\linenumber{\linenumber3008,99121
+\def\refx#1#2{\refx3014,99305
+\def\xrdef #1#2{\xrdef3036,99931
+\def\readauxfile{\readauxfile3039,100016
+\def\supereject{\supereject3109,101797
+\footstrut\parindent=\defaultparindent\hang\textindent{aultparindent\hang\textindent3130,102482
+\def\openindices{\openindices3138,102668
+\newdimen\defaultparindent \defaultparindent = 15ptaultparindent3150,102893
+\parindent = \defaultparindentaultparindent3151,102945
+\def\smallbook{\smallbook3174,103669
+\global\def\Esmallexample{\Esmallexample3191,104096
+\def\afourpaper{\afourpaper3195,104187
+\def\finalout{\finalout3223,104995
+\def\normaldoublequote{\normaldoublequote3234,105256
+\def\normaltilde{\normaltilde3235,105282
+\def\normalcaret{\normalcaret3236,105302
+\def\normalunderscore{\normalunderscore3237,105322
+\def\normalverticalbar{\normalverticalbar3238,105347
+\def\normalless{\normalless3239,105373
+\def\normalgreater{\normalgreater3240,105392
+\def\normalplus{\normalplus3241,105414
+\def\ifusingtt#1#2{\ifusingtt3252,105906
+\def\activedoublequote{\activedoublequote3260,106234
+\def~{~3263,106320
+\def^{^3266,106381
+\def_{_3269,106420
+\def\_{\_3271,106494
+\def\lvvmode{\lvvmode3278,106831
+\def|{|3281,106881
+\def<{<3284,106944
+\def>{>3287,107001
+\def+{+3289,107039
+\def\turnoffactive{\turnoffactive3295,107200
+\global\def={=3306,107486
+\def\normalbackslash{\normalbackslash3320,107868
+
+c-src//c.c,76
+T f(1,0
+}T i;2,14
+void bar(5,69
+int foobar(6,94
+interface_locate(9,131
+
+c.c,1663
+my_printf 135,
+void fatala 138,
+max 141,
+struct bar 143,
+__attribute__ ((always_inline)) max 147,
+struct foo150,
+char stack[stack155,
+struct S 156,
+} wait_status_ptr_t 161,
+Some_Class  A 162,
+typedef T1 T3 163,
+T3 z 164,
+typedef int more_aligned_int 165,
+struct S  __attribute__ ((vector_size (16))) foo;166,
+int foo 167,
+char *__attribute__((aligned(8))) *f;f168,
+int i 169,
+extern void foobar 170,
+typedef struct cacheLRUEntry_s172,
+__attribute__ ((packed)) cacheLRUEntry_t;177,
+struct foo 178,
+     f1 183,
+void f2 184,
+int x 188,
+struct foo 189,
+short array[array190,
+int f193,
+DEAFUN 196,
+XDEFUN 203,
+DEFUN ("x-get-selection-internal", 
Fx_get_selection_internal,x-get-selection-internal206,
+       Fx_get_selection_internal,x-get-selection-internal212,
+      Fy_get_selection_internal,y-get-selection-internal216,
+defun_func1(218,
+DEFUN_func2(220,
+typedef int bool;222,
+bool funcboo 223,
+struct my_struct 226,
+typedef struct my_struct my_typedef;228,
+int bla 229,
+a(234,
+int func1237,
+static struct cca_control init_control 239,
+static tpcmd rbtp 240,
+static byte ring1 241,
+static byte ring2 242,
+request request 243,
+int func2 246,
+  aaa;249,
+  bbb;251,
+struct sss1 252,
+struct sss2253,
+  struct ss3255,
+struct a b;259,
+struct aa *b;b260,
+  **b;b262,
+caccacacca 263,
+a 267,
+  typedef struct aa 269,
+  typedef struct aa {} aaa;269,
+static void inita 271,
+node *lasta lasta272,
+b 273,
+  typedef  int bb;275,
+static void initb 277,
+node *lastb lastb278,
+typedef enum { REG_ENOSYS 279,
+typedef enum { REG_ENOSYS = -1, aa 279,
+typedef enum { REG_ENOSYS = -1, aa } reg_errcode_t;279,
+
+c-src/a/b/b.c,18
+#define this 1,0
+
+../c/c.web,20
+#define questo 34,
+
+y-src/parse.y,738
+#define obstack_chunk_alloc 46,1111
+#define obstack_chunk_free 47,1149
+VOIDSTAR parse_hash;63,1400
+unsigned char fnin[fnin67,1519
+#define YYSTYPE 71,1617
+typedef struct node *YYSTYPE;YYSTYPE72,1648
+YYSTYPE parse_return;73,1678
+char *instr;instr80,1790
+int parse_error 81,1803
+line:line86,1862
+exp:exp94,1975
+exp_list:exp_list262,5642
+range_exp:range_exp268,5740
+range_exp_list:range_exp_list272,5770
+cell:cell278,5888
+yyerror FUN1(285,5935
+make_list FUN2(292,6015
+#define ERROR 303,6215
+yylex FUN0(314,6392
+parse_cell_or_range FUN2(586,11758
+#define CK_ABS_R(670,13200
+#define CK_REL_R(674,13279
+#define CK_ABS_C(679,13408
+#define CK_REL_C(683,13487
+#define MAYBEREL(688,13616
+str_to_col FUN1(846,16817
+
+y-src/parse.c,520
+#define YYBISON 4,64
+# define       NE      6,114
+# define       LE      7,130
+# define       GE      8,146
+# define       NEG     9,162
+# define       L_CELL  10,179
+# define       L_RANGE 11,199
+# define       L_VAR   12,220
+# define       L_CONST 13,239
+# define       L_FN0   14,260
+# define       L_FN1   15,279
+# define       L_FN2   16,298
+# define       L_FN3   17,317
+# define       L_FN4   18,336
+# define       L_FNN   19,355
+# define       L_FN1R  20,374
+# define       L_FN2R  21,394
+# define       L_FN3R  22,414
+# define       L_FN4R  23,434
+# define       L_FNNR  24,454
+# define       L_LE    25,474
+# define       L_NE    26,492
+# define       L_GE    27,510
+
+parse.y,1181
+#define obstack_chunk_alloc 46,
+#define obstack_chunk_free 47,
+VOIDSTAR parse_hash;63,
+unsigned char fnin[fnin67,
+#define YYSTYPE 71,
+typedef struct node *YYSTYPE;YYSTYPE72,
+YYSTYPE parse_return;73,
+char *instr;instr80,
+int parse_error 81,
+#define YYSTYPE 85,
+# define YYDEBUG 88,
+#define        YYFINAL 93,
+#define        YYFLAG  94,
+#define        YYNTBASE        95,
+#define YYTRANSLATE(98,
+static const char yytranslate[yytranslate101,
+static const short yyprhs[yyprhs134,
+static const short yyrhs[yyrhs142,
+static const short yyrline[yyrline171,
+static const char *const yytname[yytname185,
+static const short yyr1[yyr1197,
+static const short yyr2[yyr2207,
+static const short yydefact[yydefact219,
+static const short yydefgoto[yydefgoto237,
+static const short yypact[yypact242,
+static const short yypgoto[yypgoto260,
+#define        YYLAST  266,
+static const short yytable[yytable269,
+static const short yycheck[yycheck330,
+yyerror FUN1(285,
+make_list FUN2(292,
+#define ERROR 303,
+yylex FUN0(314,
+parse_cell_or_range FUN2(586,
+#define CK_ABS_R(670,
+#define CK_REL_R(674,
+#define CK_ABS_C(679,
+#define CK_REL_C(683,
+#define MAYBEREL(688,
+str_to_col FUN1(846,
+
+/usr/share/bison/bison.simple,2110
+# define YYSTD(40,
+# define YYSTD(42,
+#  define YYSTACK_ALLOC 50,
+#  define YYSIZE_T 51,
+#    define YYSTACK_ALLOC 55,
+#    define YYSIZE_T 56,
+#     define YYSTACK_ALLOC 59,
+#  define YYSTACK_FREE(67,
+#   define YYSIZE_T 71,
+#    define YYSIZE_T 75,
+#  define YYSTACK_ALLOC 78,
+#  define YYSTACK_FREE 79,
+union yyalloc83,
+# define YYSTACK_GAP_MAX 93,
+#  define YYSTACK_BYTES(98,
+#  define YYSTACK_BYTES(102,
+# define YYSTACK_RELOCATE(112,
+# define YYSIZE_T 128,
+# define YYSIZE_T 131,
+#  define YYSIZE_T 136,
+#   define YYSIZE_T 140,
+# define YYSIZE_T 145,
+#define yyerrok        148,
+#define yyclearin      149,
+#define YYEMPTY        150,
+#define YYEOF  151,
+#define YYACCEPT       152,
+#define YYABORT 153,
+#define YYERROR        154,
+#define YYFAIL 158,
+#define YYRECOVERING(159,
+#define YYBACKUP(160,
+#define YYTERROR       177,
+#define YYERRCODE      178,
+# define YYLLOC_DEFAULT(189,
+#   define YYLEX       200,
+#   define YYLEX       202,
+#   define YYLEX       206,
+#   define YYLEX       208,
+# define YYLEX 212,
+#  define YYFPRINTF 225,
+# define YYDPRINTF(228,
+int yydebug;237,
+# define YYDPRINTF(239,
+# define YYINITDEPTH 244,
+# undef YYMAXDEPTH255,
+# define YYMAXDEPTH 259,
+#  define yymemcpy 264,
+yymemcpy 271,
+#   define yystrlen 293,
+yystrlen 298,
+#   define yystpcpy 316,
+yystpcpy 322,
+#  define YYPARSE_PARAM_ARG 351,
+#  define YYPARSE_PARAM_DECL352,
+#  define YYPARSE_PARAM_ARG 354,
+#  define YYPARSE_PARAM_DECL 355,
+# define YYPARSE_PARAM_ARG358,
+# define YYPARSE_PARAM_DECL359,
+#define YY_DECL_NON_LSP_VARIABLES      374,
+# define YY_DECL_VARIABLES     385,
+# define YY_DECL_VARIABLES     391,
+yyparse 403,
+# define YYPOPSTACK 445,
+# define YYPOPSTACK 447,
+# undef YYSTACK_RELOCATE548,
+  *++yyvsp yyvsp746,
+  *++yylsp yylsp748,
+  yyn 755,
+  yystate 757,
+    yystate 761,
+  goto yynewstate;763,
+  goto yyerrlab1;823,
+  yyerrstatus 846,
+  goto yyerrhandle;848,
+  yyn 861,
+  yystate 875,
+  yyn 895,
+  yyn 903,
+  *++yyvsp yyvsp919,
+  *++yylsp yylsp921,
+  yystate 924,
+  goto yynewstate;925,
+  yyresult 932,
+  goto yyreturn;933,
+  yyresult 939,
+  goto yyreturn;940,
+  yyresult 947,
+
+y-src/atest.y,9
+exp    2,3
+
+y-src/cccp.c,303
+#define YYBISON 4,63
+# define       INT     6,113
+# define       CHAR    7,130
+# define       NAME    8,148
+# define       ERROR   9,166
+# define       OR      10,185
+# define       AND     11,201
+# define       EQUAL   12,218
+# define       NOTEQUAL        13,237
+# define       LEQ     14,259
+# define       GEQ     15,276
+# define       LSH     16,293
+# define       RSH     17,310
+# define       UNARY   18,327
+
+cccp.y,1579
+typedef unsigned char U_CHAR;38,
+struct arglist 41,
+#define NULL 51,
+#define GENERIC_PTR 56,
+#define GENERIC_PTR 58,
+#define NULL_PTR 63,
+int expression_value;68,
+static jmp_buf parse_return_error;70,
+static int keyword_parsing 73,
+#define CHAR_TYPE_SIZE 87,
+#define INT_TYPE_SIZE 91,
+#define LONG_TYPE_SIZE 95,
+#define WCHAR_TYPE_SIZE 99,
+#define possible_sum_sign(104,
+  struct constant 113,
+  struct name 114,
+} yystype;118,
+# define YYSTYPE 119,
+# define YYDEBUG 122,
+#define        YYFINAL 127,
+#define        YYFLAG  128,
+#define        YYNTBASE        129,
+#define YYTRANSLATE(132,
+static const char yytranslate[yytranslate135,
+static const short yyprhs[yyprhs167,
+static const short yyrhs[yyrhs174,
+static const short yyrline[yyrline195,
+static const char *const yytname[yytname208,
+static const short yyr1[yyr1219,
+static const short yyr2[yyr2228,
+static const short yydefact[yydefact239,
+static const short yydefgoto[yydefgoto251,
+static const short yypact[yypact256,
+static const short yypgoto[yypgoto268,
+#define        YYLAST  274,
+static const short yytable[yytable277,
+static const short yycheck[yycheck301,
+static char *lexptr;lexptr332,
+parse_number 341,
+struct token 437,
+static struct token tokentab2[tokentab2442,
+yylex 459,
+parse_escape 740,
+yyerror 836,
+integer_overflow 844,
+left_shift 851,
+right_shift 873,
+parse_c_expression 893,
+main 923,
+unsigned char is_idchar[is_idchar948,
+unsigned char is_idstart[is_idstart950,
+char is_hor_space[is_hor_space953,
+initialize_random_junk 958,
+error 988,
+warning 993,
+lookup 999,
+
+/usr/share/bison/bison.simple,2110
+# define YYSTD(40,
+# define YYSTD(42,
+#  define YYSTACK_ALLOC 50,
+#  define YYSIZE_T 51,
+#    define YYSTACK_ALLOC 55,
+#    define YYSIZE_T 56,
+#     define YYSTACK_ALLOC 59,
+#  define YYSTACK_FREE(67,
+#   define YYSIZE_T 71,
+#    define YYSIZE_T 75,
+#  define YYSTACK_ALLOC 78,
+#  define YYSTACK_FREE 79,
+union yyalloc83,
+# define YYSTACK_GAP_MAX 93,
+#  define YYSTACK_BYTES(98,
+#  define YYSTACK_BYTES(102,
+# define YYSTACK_RELOCATE(112,
+# define YYSIZE_T 128,
+# define YYSIZE_T 131,
+#  define YYSIZE_T 136,
+#   define YYSIZE_T 140,
+# define YYSIZE_T 145,
+#define yyerrok        148,
+#define yyclearin      149,
+#define YYEMPTY        150,
+#define YYEOF  151,
+#define YYACCEPT       152,
+#define YYABORT 153,
+#define YYERROR        154,
+#define YYFAIL 158,
+#define YYRECOVERING(159,
+#define YYBACKUP(160,
+#define YYTERROR       177,
+#define YYERRCODE      178,
+# define YYLLOC_DEFAULT(189,
+#   define YYLEX       200,
+#   define YYLEX       202,
+#   define YYLEX       206,
+#   define YYLEX       208,
+# define YYLEX 212,
+#  define YYFPRINTF 225,
+# define YYDPRINTF(228,
+int yydebug;237,
+# define YYDPRINTF(239,
+# define YYINITDEPTH 244,
+# undef YYMAXDEPTH255,
+# define YYMAXDEPTH 259,
+#  define yymemcpy 264,
+yymemcpy 271,
+#   define yystrlen 293,
+yystrlen 298,
+#   define yystpcpy 316,
+yystpcpy 322,
+#  define YYPARSE_PARAM_ARG 351,
+#  define YYPARSE_PARAM_DECL352,
+#  define YYPARSE_PARAM_ARG 354,
+#  define YYPARSE_PARAM_DECL 355,
+# define YYPARSE_PARAM_ARG358,
+# define YYPARSE_PARAM_DECL359,
+#define YY_DECL_NON_LSP_VARIABLES      374,
+# define YY_DECL_VARIABLES     385,
+# define YY_DECL_VARIABLES     391,
+yyparse 403,
+# define YYPOPSTACK 445,
+# define YYPOPSTACK 447,
+# undef YYSTACK_RELOCATE548,
+  *++yyvsp yyvsp746,
+  *++yylsp yylsp748,
+  yyn 755,
+  yystate 757,
+    yystate 761,
+  goto yynewstate;763,
+  goto yyerrlab1;823,
+  yyerrstatus 846,
+  goto yyerrhandle;848,
+  yyn 861,
+  yystate 875,
+  yyn 895,
+  yyn 903,
+  *++yyvsp yyvsp919,
+  *++yylsp yylsp921,
+  yystate 924,
+  goto yynewstate;925,
+  yyresult 932,
+  goto yyreturn;933,
+  yyresult 939,
+  goto yyreturn;940,
+  yyresult 947,
+
+y-src/cccp.y,1107
+typedef unsigned char U_CHAR;38,1201
+struct arglist 41,1301
+#define NULL 51,1468
+#define GENERIC_PTR 56,1578
+#define GENERIC_PTR 58,1611
+#define NULL_PTR 63,1670
+int expression_value;68,1743
+static jmp_buf parse_return_error;70,1766
+static int keyword_parsing 73,1865
+#define CHAR_TYPE_SIZE 87,2162
+#define INT_TYPE_SIZE 91,2229
+#define LONG_TYPE_SIZE 95,2296
+#define WCHAR_TYPE_SIZE 99,2365
+#define possible_sum_sign(104,2556
+  struct constant 112,2733
+  struct name 113,2789
+start 143,3226
+exp1   148,3330
+exp    156,3505
+exp    185,4295
+keywords 306,7835
+static char *lexptr;lexptr332,8579
+parse_number 341,8842
+struct token 437,11038
+static struct token tokentab2[tokentab2442,11088
+yylex 459,11367
+parse_escape 740,17718
+yyerror 836,19599
+integer_overflow 844,19690
+left_shift 851,19804
+right_shift 873,20194
+parse_c_expression 893,20732
+main 923,21483
+unsigned char is_idchar[is_idchar948,21901
+unsigned char is_idstart[is_idstart950,21996
+char is_hor_space[is_hor_space953,22160
+initialize_random_junk 958,22259
+error 988,22915
+warning 993,22963
+lookup 999,23033
+
+tex-src/nonewline.tex,0
+
+php-src/sendmail.php,0
+
+c-src/fail.c,0
+
+a-src/empty.zz,0
diff --git a/test/etags/ETAGS.good_5 b/test/etags/ETAGS.good_5
new file mode 100644
index 0000000..3291bf3
--- /dev/null
+++ b/test/etags/ETAGS.good_5
@@ -0,0 +1,7508 @@
+
+Makefile,701
+ADASRC=1,0
+ASRC=2,91
+CSRC=3,139
+CPSRC=7,410
+ELSRC=10,624
+ERLSRC=11,694
+FORTHSRC=12,759
+FSRC=13,809
+HTMLSRC=14,881
+JAVASRC=15,974
+LUASRC=16,1062
+MAKESRC=17,1105
+OBJCSRC=18,1147
+OBJCPPSRC=19,1228
+PASSRC=20,1291
+PERLSRC=21,1333
+PHPSRC=22,1413
+PSSRC=23,1485
+PROLSRC=24,1525
+PYTSRC=25,1587
+TEXSRC=26,1628
+YSRC=27,1707
+SRCS=28,1772
+NONSRCS=32,2024
+ETAGS_PROG=34,2098
+CTAGS_PROG=35,2129
+REGEX=37,2161
+xx=38,2207
+RUN=40,2256
+OPTIONS=42,2262
+ARGS=43,2314
+infiles 45,2332
+check:check47,2394
+ediff%:ediff%55,2697
+cdiff:cdiff58,2798
+ETAGS:ETAGS61,2895
+CTAGS:CTAGS64,2965
+srclist:srclist67,3043
+regexfile:regexfile71,3134
+.PRECIOUS:.PRECIOUS77,3311
+FRC:FRC79,3345
+
+ada-src/etags-test-for.ada,1969
+   type LL_Task_Procedure_Access LL_Task_Procedure_Access/t1,0
+   function Body_RequiredBody_Required/f3,78
+   type Type_Specific_Data Type_Specific_Data/t11,280
+   function "abs"abs/f19,504
+   type Barrier_Function_Pointer Barrier_Function_Pointer/t21,577
+   function "="=/f27,722
+   type usfreelock_ptr usfreelock_ptr/t30,803
+   function p p/f33,891
+   procedure LL_Wrapper LL_Wrapper/p37,1054
+function p p/f39,1094
+package Pkg1 Pkg1/s44,1203
+  type Private_T Private_T/t46,1220
+  package Inner1 Inner1/s48,1250
+    procedure Private_T;Private_T/p49,1270
+  package Inner2 Inner2/s52,1310
+    task Private_T;Private_T/k53,1330
+  type Public_T Public_T/t56,1365
+  procedure Pkg1_Proc1;Pkg1_Proc1/p62,1450
+  procedure Pkg1_Proc2 Pkg1_Proc2/p64,1475
+  function Pkg1_Func1 Pkg1_Func1/f66,1514
+  function Pkg1_Func2 Pkg1_Func2/f68,1553
+  package Pkg1_Pkg1 Pkg1_Pkg1/s71,1622
+    procedure Pkg1_Pkg1_Proc1;Pkg1_Pkg1_Proc1/p72,1645
+  task type Task_Type Task_Type/k75,1694
+  type Private_T Private_T/t82,1786
+package body Pkg1 Pkg1/b89,1882
+  procedure Pkg1_Proc1 Pkg1_Proc1/p91,1904
+  package body Inner1 Inner1/b96,1956
+    procedure Private_T Private_T/p97,1981
+  package body Inner2 Inner2/b103,2054
+    task body Private_T Private_T/b104,2079
+  task body Task_Type Task_Type/b112,2181
+  procedure Pkg1_Proc2 Pkg1_Proc2/p126,2367
+  function Pkg1_Func1 Pkg1_Func1/f132,2445
+  function Pkg1_Func2 Pkg1_Func2/f134,2496
+  package body Pkg1_Pkg1 Pkg1_Pkg1/b140,2596
+package body Pkg1_Pkg1 Pkg1_Pkg1/b146,2663
+  procedure Pkg1_Pkg1_Proc1 Pkg1_Pkg1_Proc1/p147,2689
+function  Pkg1_Func1 Pkg1_Func1/f155,2778
+package Truc Truc/s162,2887
+package Truc.Bidule Truc.Bidule/s166,2929
+  protected Bidule Bidule/t168,2953
+  protected type Machin_T Machin_T/t172,3007
+package body Truc.Bidule Truc.Bidule/b178,3087
+  protected body Bidule Bidule/b179,3115
+  protected Machin_T Machin_T/t186,3207
+
+ada-src/2ataspri.adb,2190
+package body System.Task_Primitives System.Task_Primitives/b64,2603
+   package RTE RTE/s69,2712
+   package TSL TSL/s70,2759
+   function To_void_ptr To_void_ptr/f86,3287
+   function To_TCB_Ptr To_TCB_Ptr/f89,3366
+   function 
pthread_mutexattr_setprotocolpthread_mutexattr_setprotocol/f92,3444
+   function 
pthread_mutexattr_setprio_ceilingpthread_mutexattr_setprio_ceiling/f99,3728
+   procedure Abort_WrapperAbort_Wrapper/p115,4302
+   procedure LL_Wrapper LL_Wrapper/p122,4526
+   procedure Initialize_LL_Tasks Initialize_LL_Tasks/p131,4830
+   function Self Self/f160,5586
+   procedure Initialize_LockInitialize_Lock/p174,5958
+   procedure Finalize_Lock Finalize_Lock/p210,6927
+   procedure Write_Lock Write_Lock/p226,7338
+   procedure Read_Lock Read_Lock/p239,7700
+   procedure Unlock Unlock/p246,7850
+   procedure Initialize_Cond Initialize_Cond/p258,8160
+   procedure Finalize_Cond Finalize_Cond/p286,8979
+   procedure Cond_Wait Cond_Wait/p300,9303
+   procedure Cond_Timed_WaitCond_Timed_Wait/p312,9661
+   procedure Cond_Signal Cond_Signal/p343,10510
+   procedure Set_PrioritySet_Priority/p355,10836
+   procedure Set_Own_Priority Set_Own_Priority/p372,11243
+   function Get_Priority Get_Priority/f385,11598
+   function Get_Own_Priority Get_Own_Priority/f398,12023
+   procedure Create_LL_TaskCreate_LL_Task/p412,12438
+      function To_Start_Addr To_Start_Addr/f426,12873
+   procedure Exit_LL_Task Exit_LL_Task/p491,14995
+   procedure Abort_Task Abort_Task/p500,15158
+   procedure Test_Abort Test_Abort/p518,15716
+   procedure Install_Abort_Handler Install_Abort_Handler/p527,15878
+   procedure Abort_WrapperAbort_Wrapper/p557,16939
+      function Address_To_Call_State Address_To_Call_State/f562,17062
+   procedure Install_Error_Handler Install_Error_Handler/p573,17351
+   procedure LL_Assert LL_Assert/p599,18146
+   procedure LL_Wrapper LL_Wrapper/p608,18299
+   procedure Initialize_TAS_Cell Initialize_TAS_Cell/p630,19010
+   procedure Finalize_TAS_Cell Finalize_TAS_Cell/p635,19129
+   procedure Clear Clear/p640,19236
+   procedure Test_And_Set Test_And_Set/p645,19330
+   function  Is_Set Is_Set/f659,19676
+
+ada-src/2ataspri.ads,2313
+package System.Task_Primitives System.Task_Primitives/s58,3169
+   type LL_Task_Procedure_Access LL_Task_Procedure_Access/t62,3253
+   type Pre_Call_State Pre_Call_State/t64,3331
+   type Task_Storage_Size Task_Storage_Size/t66,3378
+   type Machine_Exceptions Machine_Exceptions/t68,3433
+   type Error_Information Error_Information/t70,3499
+   type Lock Lock/t72,3569
+   type Condition_Variable Condition_Variable/t73,3594
+   type Task_Control_Block Task_Control_Block/t81,3955
+   type TCB_Ptr TCB_Ptr/t89,4241
+   function Address_To_TCB_Ptr Address_To_TCB_Ptr/f93,4333
+   procedure Initialize_LL_Tasks Initialize_LL_Tasks/p96,4425
+   function Self Self/f100,4602
+   procedure Initialize_Lock Initialize_Lock/p103,4707
+   procedure Finalize_Lock Finalize_Lock/p107,4879
+   procedure Write_Lock Write_Lock/p111,5034
+   procedure Read_Lock Read_Lock/p118,5428
+   procedure Unlock Unlock/p128,5995
+   procedure Initialize_Cond Initialize_Cond/p135,6300
+   procedure Finalize_Cond Finalize_Cond/p138,6413
+   procedure Cond_Wait Cond_Wait/p142,6591
+   procedure Cond_Timed_WaitCond_Timed_Wait/p155,7396
+   procedure Cond_Signal Cond_Signal/p164,7812
+   procedure Set_Priority Set_Priority/p169,8040
+   procedure Set_Own_Priority Set_Own_Priority/p173,8200
+   function Get_Priority Get_Priority/f177,8348
+   function Get_Own_Priority Get_Own_Priority/f181,8504
+   procedure Create_LL_TaskCreate_LL_Task/p185,8647
+   procedure Exit_LL_Task;Exit_LL_Task/p198,9282
+   procedure Abort_Task Abort_Task/p203,9516
+   procedure Test_Abort;Test_Abort/p210,9878
+   type Abort_Handler_Pointer Abort_Handler_Pointer/t217,10233
+   procedure Install_Abort_Handler Install_Abort_Handler/p219,10312
+   procedure Install_Error_Handler Install_Error_Handler/p226,10741
+   procedure LL_Assert LL_Assert/p231,10983
+   type Proc Proc/t238,11240
+   type TAS_Cell TAS_Cell/t242,11328
+   procedure Initialize_TAS_Cell Initialize_TAS_Cell/p249,11670
+   procedure Finalize_TAS_Cell Finalize_TAS_Cell/p255,11941
+   procedure Clear Clear/p260,12157
+   procedure Test_And_Set Test_And_Set/p267,12462
+   function  Is_Set Is_Set/f275,12877
+   type Lock Lock/t283,13155
+   type Condition_Variable Condition_Variable/t288,13267
+   type TAS_Cell TAS_Cell/t293,13389
+
+ada-src/waroquiers.ada,1503
+package Pkg1 Pkg1/s3,89
+  type Private_T Private_T/t5,106
+  package Inner1 Inner1/s7,136
+    procedure Private_T;Private_T/p8,156
+  package Inner2 Inner2/s11,196
+    task Private_T;Private_T/k12,216
+  type Public_T Public_T/t15,251
+  procedure Pkg1_Proc1;Pkg1_Proc1/p21,336
+  procedure Pkg1_Proc2 Pkg1_Proc2/p23,361
+  function Pkg1_Func1 Pkg1_Func1/f25,400
+  function Pkg1_Func2 Pkg1_Func2/f27,439
+  package Pkg1_Pkg1 Pkg1_Pkg1/s30,508
+    procedure Pkg1_Pkg1_Proc1;Pkg1_Pkg1_Proc1/p31,531
+  task type Task_Type Task_Type/k34,580
+  type Private_T Private_T/t40,671
+package body Pkg1 Pkg1/b46,766
+  procedure Pkg1_Proc1 Pkg1_Proc1/p48,788
+  package body Inner1 Inner1/b53,840
+    procedure Private_T Private_T/p54,865
+  package body Inner2 Inner2/b60,938
+    task body Private_T Private_T/b61,963
+  task body Task_Type Task_Type/b68,1064
+  procedure Pkg1_Proc2 Pkg1_Proc2/p82,1250
+  function Pkg1_Func1 Pkg1_Func1/f88,1328
+  function Pkg1_Func2 Pkg1_Func2/f90,1379
+  package body Pkg1_Pkg1 Pkg1_Pkg1/b96,1479
+package body Pkg1_Pkg1 Pkg1_Pkg1/b100,1544
+  procedure Pkg1_Pkg1_Proc1 Pkg1_Pkg1_Proc1/p101,1570
+function  Pkg1_Func1 Pkg1_Func1/f107,1657
+package Truc Truc/s112,1764
+package Truc.Bidule Truc.Bidule/s116,1816
+  protected Bidule Bidule/t125,1964
+  protected type Machin_T Machin_T/t131,2046
+package body Truc.Bidule Truc.Bidule/b138,2153
+  protected body Bidule Bidule/b139,2181
+  protected body Machin_T Machin_T/b146,2281
+
+c-src/abbrev.c,2634
+Lisp_Object Vabbrev_table_name_list;42,1416
+Lisp_Object Vglobal_abbrev_table;47,1561
+Lisp_Object Vfundamental_mode_abbrev_table;51,1672
+int abbrevs_changed;55,1773
+int abbrev_all_caps;57,1795
+Lisp_Object Vabbrev_start_location;62,1944
+Lisp_Object Vabbrev_start_location_buffer;65,2033
+Lisp_Object Vlast_abbrev;69,2142
+Lisp_Object Vlast_abbrev_text;74,2311
+int last_abbrev_point;78,2401
+Lisp_Object Vpre_abbrev_expand_hook,82,2474
+Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;82,2474
+DEFUN ("make-abbrev-table", Fmake_abbrev_table,make-abbrev-table84,2538
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table,clear-abbrev-table91,2730
+DEFUN ("define-abbrev", Fdefine_abbrev,define-abbrev106,3111
+DEFUN ("define-global-abbrev", 
Fdefine_global_abbrev,define-global-abbrev148,4430
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev,define-mode-abbrev159,4801
+DEFUN ("abbrev-symbol", Fabbrev_symbol,abbrev-symbol173,5269
+DEFUN ("abbrev-expansion", Fabbrev_expansion,abbrev-expansion201,6233
+DEFUN ("expand-abbrev", Fexpand_abbrev,expand-abbrev217,6748
+DEFUN ("unexpand-abbrev", Funexpand_abbrev,unexpand-abbrev388,11669
+write_abbrev 425,12876
+describe_abbrev 444,13311
+DEFUN ("insert-abbrev-table-description", 
Finsert_abbrev_table_description,insert-abbrev-table-description465,13826
+DEFUN ("define-abbrev-table", 
Fdefine_abbrev_table,define-abbrev-table505,14982
+syms_of_abbrev 539,16059
+  DEFVAR_LISP ("abbrev-table-name-list"541,16079
+  DEFVAR_LISP ("global-abbrev-table"547,16341
+  DEFVAR_LISP ("fundamental-mode-abbrev-table"554,16663
+  DEFVAR_LISP ("last-abbrev"560,17005
+  DEFVAR_LISP ("last-abbrev-text"563,17128
+  DEFVAR_INT ("last-abbrev-location"567,17286
+  DEFVAR_LISP ("abbrev-start-location"574,17485
+  DEFVAR_LISP ("abbrev-start-location-buffer"580,17762
+  DEFVAR_PER_BUFFER ("local-abbrev-table"585,18026
+  DEFVAR_BOOL ("abbrevs-changed"588,18169
+  DEFVAR_BOOL ("abbrev-all-caps"593,18372
+  DEFVAR_LISP ("pre-abbrev-expand-hook"597,18528
+  DEFVAR_LISP ("abbrev-table-name-list",\1541,16079
+  DEFVAR_LISP ("global-abbrev-table",\1547,16341
+  DEFVAR_LISP ("fundamental-mode-abbrev-table",\1554,16663
+  DEFVAR_LISP ("last-abbrev",\1560,17005
+  DEFVAR_LISP ("last-abbrev-text",\1563,17128
+  DEFVAR_INT ("last-abbrev-location",\1567,17286
+  DEFVAR_LISP ("abbrev-start-location",\1574,17485
+  DEFVAR_LISP ("abbrev-start-location-buffer",\1580,17762
+  DEFVAR_PER_BUFFER ("local-abbrev-table",\1585,18026
+  DEFVAR_BOOL ("abbrevs-changed",\1588,18169
+  DEFVAR_BOOL ("abbrev-all-caps",\1593,18372
+  DEFVAR_LISP ("pre-abbrev-expand-hook",\1597,18528
+
+c-src/torture.c,197
+(*tag1 tag118,452
+#define notag2 26,553
+(*tag2 tag229,630
+(*tag3 tag339,772
+#define notag4 45,861
+(*tag4 tag448,955
+tag5 57,1081
+tag6 66,1208
+int pp1(74,1317
+pp287,1419
+pp3(100,1518
+
+c-src/getopt.h,666
+#define _GETOPT_H 19,801
+extern char *optarg;optarg31,1109
+extern int optind;45,1617
+extern int opterr;50,1743
+struct option73,2797
+  const char *name;name76,2826
+  char *name;name78,2852
+  int has_arg;82,3009
+  int *flag;flag83,3024
+  int val;84,3037
+#define        no_argument     89,3124
+#define required_argument      90,3147
+#define optional_argument      91,3175
+extern int getopt 98,3440
+extern int getopt 100,3544
+extern int getopt_long 102,3599
+extern int getopt_long_only 104,3731
+extern int _getopt_internal 109,3942
+extern int getopt 114,4140
+extern int getopt_long 115,4162
+extern int getopt_long_only 116,4189
+extern int _getopt_internal 118,4222
+
+c-src/etags.c,14175
+char pot_etags_version[pot_etags_version81,3470
+#  undef DEBUG84,3552
+#  define DEBUG 85,3567
+#  define DEBUG 87,3594
+#  define NDEBUG       88,3617
+# define _GNU_SOURCE 94,3705
+# undef MSDOS100,3876
+# undef  WINDOWSNT101,3890
+# define WINDOWSNT102,3909
+# undef MSDOS106,3968
+# define MSDOS 107,3982
+# define MSDOS 110,4032
+# define MAXPATHLEN 115,4111
+# undef HAVE_NTGUI116,4141
+# undef  DOS_NT117,4160
+# define DOS_NT118,4176
+# undef  assert        135,4482
+# define assert(136,4541
+# undef  CTAGS146,4857
+# define CTAGS 147,4872
+# define CTAGS 149,4898
+#define streq(152,4927
+#define strcaseeq(153,4996
+#define strneq(154,5075
+#define strncaseeq(155,5151
+#define CHARS 157,5238
+#define CHAR(158,5278
+#define        iswhite(159,5329
+#define notinname(160,5394
+#define        begtoken(161,5469
+#define        intoken(162,5542
+#define        endtoken(163,5614
+#define ISALNUM(165,5684
+#define ISALPHA(166,5722
+#define ISDIGIT(167,5760
+#define ISLOWER(168,5798
+#define lowcase(170,5837
+#define xnew(179,6015
+#define xrnew(180,6083
+typedef void Lang_function 182,6164
+  const char *suffix;suffix186,6219
+  const char *command;command187,6294
+} compressor;188,6365
+  const char *name;name192,6397
+  const char *help;help193,6449
+  Lang_function *function;function194,6508
+  const char **suffixes;suffixes195,6556
+  const char **filenames;filenames196,6633
+  const char **interpreters;interpreters197,6702
+  bool metasource;198,6771
+} language;199,6835
+typedef struct fdesc201,6848
+  struct fdesc *next;next203,6871
+  char *infname;infname204,6920
+  char *infabsname;infabsname205,6973
+  char *infabsdir;infabsdir206,7038
+  char *taggedfname;taggedfname207,7091
+  language *lang;lang208,7149
+  char *prop;prop209,7191
+  bool usecharno;210,7249
+  bool written;211,7311
+} fdesc;212,7366
+typedef struct node_st214,7376
+  struct node_st *left,left216,7428
+  struct node_st *left, *right;right216,7428
+  fdesc *fdp;fdp217,7486
+  char *name;name218,7548
+  char *regex;regex219,7580
+  bool valid;220,7617
+  bool is_func;221,7670
+  bool been_warned;222,7733
+  int lno;223,7801
+  long cno;224,7842
+} node;225,7894
+  long size;236,8208
+  int len;237,8221
+  char *buffer;buffer238,8232
+} linebuffer;239,8248
+    at_language,245,8344
+    at_regexp,246,8393
+    at_filename,247,8437
+    at_stdin,248,8473
+    at_end     249,8516
+  } arg_type;250,8557
+  language *lang;lang251,8593
+  char *what;what252,8656
+} argument;253,8698
+typedef struct regexp256,8758
+  struct regexp *p_next;p_next258,8782
+  language *lang;lang259,8837
+  char *pattern;pattern260,8897
+  char *name;name261,8940
+  struct re_pattern_buffer *pat;pat262,8971
+  struct re_registers regs;263,9031
+  bool error_signaled;264,9078
+  bool force_explicit_name;265,9141
+  bool ignore_case;266,9206
+  bool multi_line;267,9259
+} regexp;268,9325
+static void Ada_funcs 274,9428
+static void Asm_labels 275,9460
+static void C_entries 276,9493
+static void default_C_entries 277,9536
+static void plain_C_entries 278,9576
+static void Cjava_entries 279,9614
+static void Cobol_paragraphs 280,9650
+static void Cplusplus_entries 281,9689
+static void Cstar_entries 282,9729
+static void Erlang_functions 283,9765
+static void Forth_words 284,9804
+static void Fortran_functions 285,9838
+static void HTML_labels 286,9878
+static void Lisp_functions 287,9912
+static void Lua_functions 288,9949
+static void Makefile_targets 289,9985
+static void Pascal_functions 290,10024
+static void Perl_functions 291,10063
+static void PHP_functions 292,10100
+static void PS_functions 293,10136
+static void Prolog_functions 294,10171
+static void Python_functions 295,10210
+static void Scheme_functions 296,10249
+static void TeX_commands 297,10288
+static void Texinfo_nodes 298,10323
+static void Yacc_entries 299,10359
+static void just_read_file 300,10394
+static language *get_language_from_langname 
get_language_from_langname302,10432
+static void readline 303,10492
+static long readline_internal 304,10537
+static bool nocase_tail 305,10591
+static void get_tag 306,10631
+static void analyze_regex 308,10671
+static void free_regexps 309,10707
+static void regex_tag_multiline 310,10740
+static void error 311,10780
+# undef STDIN408,15073
+#define STDIN 411,15095
+static compressor compressors[compressors457,17664
+static const char *Ada_suffixes Ada_suffixes473,17907
+static const char Ada_help 475,17977
+static const char *Asm_suffixes Asm_suffixes493,18580
+static const char Asm_help 504,18976
+static const char *default_C_suffixes default_C_suffixes512,19312
+static const char default_C_help 515,19413
+static const char default_C_help 523,19850
+static const char *Cplusplus_suffixes Cplusplus_suffixes535,20460
+static const char Cplusplus_help 540,20658
+static const char *Cjava_suffixes Cjava_suffixes549,21113
+static char Cjava_help 551,21172
+static const char *Cobol_suffixes Cobol_suffixes556,21337
+static char Cobol_help 558,21402
+static const char *Cstar_suffixes Cstar_suffixes562,21543
+static const char *Erlang_suffixes Erlang_suffixes565,21607
+static const char Erlang_help 567,21673
+const char *Forth_suffixes Forth_suffixes571,21799
+static const char Forth_help 573,21857
+static const char *Fortran_suffixes Fortran_suffixes577,22008
+static const char Fortran_help 579,22085
+static const char *HTML_suffixes HTML_suffixes582,22190
+static const char HTML_help 584,22264
+static const char *Lisp_suffixes Lisp_suffixes589,22452
+static const char Lisp_help 591,22556
+static const char *Lua_suffixes Lua_suffixes598,22871
+static const char Lua_help 600,22934
+static const char *Makefile_filenames Makefile_filenames603,23010
+static const char Makefile_help 605,23133
+static const char *Objc_suffixes Objc_suffixes609,23277
+static const char Objc_help 613,23399
+static const char *Pascal_suffixes Pascal_suffixes619,23714
+static const char Pascal_help 621,23778
+static const char *Perl_suffixes Perl_suffixes626,23966
+static const char *Perl_interpreters Perl_interpreters628,24028
+static const char Perl_help 630,24100
+static const char *PHP_suffixes PHP_suffixes637,24451
+static const char PHP_help 639,24523
+static const char *plain_C_suffixes plain_C_suffixes643,24678
+static const char *PS_suffixes PS_suffixes647,24762
+static const char PS_help 649,24848
+static const char *Prolog_suffixes Prolog_suffixes652,24931
+static const char Prolog_help 654,24993
+static const char *Python_suffixes Python_suffixes658,25107
+static const char Python_help 660,25165
+static const char *Scheme_suffixes Scheme_suffixes665,25347
+static const char Scheme_help 667,25460
+static const char *TeX_suffixes TeX_suffixes672,25683
+static const char TeX_help 674,25781
+static const char *Texinfo_suffixes Texinfo_suffixes686,26316
+static const char Texinfo_help 688,26395
+static const char *Yacc_suffixes Yacc_suffixes691,26492
+static const char Yacc_help 693,26606
+static const char auto_help 699,26856
+static const char none_help 703,27020
+static const char no_lang_help 707,27143
+static language lang_names 718,27355
+print_language_names 753,29532
+# define EMACS_NAME 786,30755
+# define VERSION 789,30811
+print_version 792,30869
+# define PRINT_UNDOCUMENTED_OPTIONS_HELP 804,31173
+print_help 808,31250
+main 981,37438
+get_compressor_from_suffix 1319,46217
+get_language_from_langname 1355,47158
+get_language_from_interpreter 1377,47545
+get_language_from_filename 1399,47976
+process_file_name 1433,48834
+process_file 1555,51665
+init 1632,54150
+find_entries 1656,54901
+make_tag 1814,59707
+pfnote 1856,60942
+free_tree 1917,62744
+free_fdesc 1935,63029
+add_node 1955,63472
+invalidate_nodes 2035,65537
+static int total_size_of_entries 2067,66150
+static int number_len 2068,66193
+total_size_of_entries 2087,66694
+put_entries 2107,67154
+#define C_EXT  2193,68995
+#define C_PLAIN 2194,69037
+#define C_PLPL 2195,69070
+#define C_STAR 2196,69104
+#define C_JAVA 2197,69137
+#define C_AUTO 2198,69172
+#define YACC   2199,69242
+enum sym_type2204,69312
+  st_none,2206,69328
+  st_C_objprot,2207,69339
+  st_C_objprot, st_C_objimpl,2207,69339
+  st_C_objprot, st_C_objimpl, st_C_objend,2207,69339
+  st_C_gnumacro,2208,69382
+  st_C_ignore,2209,69399
+  st_C_ignore, st_C_attribute,2209,69399
+  st_C_javastruct,2210,69430
+  st_C_operator,2211,69449
+  st_C_class,2212,69466
+  st_C_class, st_C_template,2212,69466
+  st_C_struct,2213,69495
+  st_C_struct, st_C_extern,2213,69495
+  st_C_struct, st_C_extern, st_C_enum,2213,69495
+  st_C_struct, st_C_extern, st_C_enum, st_C_define,2213,69495
+  st_C_struct, st_C_extern, st_C_enum, st_C_define, st_C_typedef2213,69495
+struct C_stab_entry 2271,71278
+struct C_stab_entry { const char *name;name2271,71278
+struct C_stab_entry { const char *name; int c_ext;2271,71278
+struct C_stab_entry { const char *name; int c_ext; enum sym_type 
type;2271,71278
+hash 2275,71409
+in_word_set 2321,72937
+      TOTAL_KEYWORDS 2325,73018
+      MIN_WORD_LENGTH 2326,73045
+      MAX_WORD_LENGTH 2327,73072
+      MIN_HASH_VALUE 2328,73100
+      MAX_HASH_VALUE 2329,73126
+C_symtype 2387,74985
+static bool inattribute;2400,75234
+  fvnone,2408,75435
+  fdefunkey,2409,75466
+  fdefunname,2410,75512
+  foperator,2411,75556
+  fvnameseen,2412,75613
+  fstartlist,2413,75666
+  finlist,2414,75722
+  flistseen,2415,75765
+  fignore,2416,75813
+  vignore      2417,75856
+} fvdef;2418,75901
+static bool fvextern;2420,75911
+  tnone,2428,76089
+  tkeyseen,2429,76119
+  ttypeseen,2430,76160
+  tinbody,2431,76199
+  tend,2432,76238
+  tignore      2433,76279
+} typdef;2434,76320
+  snone,2443,76499
+  skeyseen,2445,76575
+  stagseen,2446,76620
+  scolonseen   2447,76661
+} structdef;2448,76715
+static const char *objtag objtag2453,76809
+  dnone,2460,76942
+  dsharpseen,2461,76972
+  ddefineseen,2462,77025
+  dignorerest  2463,77070
+} definedef;2464,77112
+  onone,2472,77267
+  oprotocol,2473,77297
+  oimplementation,2474,77347
+  otagseen,2475,77395
+  oparenseen,2476,77431
+  ocatseen,2477,77486
+  oinbody,2478,77525
+  omethodsign,2479,77568
+  omethodtag,2480,77626
+  omethodcolon,2481,77666
+  omethodparm,2482,77709
+  oignore      2483,77755
+} objdef;2484,77787
+static struct tok2491,77944
+  char *line;line2493,77964
+  int offset;2494,78014
+  int length;2495,78067
+  bool valid;2502,78352
+  bool named;2505,78487
+  int lineno;2506,78528
+  long linepos;2507,78576
+} token;2508,78626
+static void pushclass_above 2514,78784
+static void popclass_above 2515,78832
+static void write_classname 2516,78866
+  char **cname;cname2519,78950
+  int *bracelev;bracelev2520,78993
+  int nl;2521,79042
+  int size;2522,79096
+} cstack;2523,79136
+#define nestlev        2525,79264
+#define instruct       2527,79369
+pushclass_above 2531,79489
+popclass_above 2550,79948
+write_classname 2564,80162
+static bool consider_token 2592,80761
+static void make_C_tag 2593,80833
+consider_token 2613,81341
+  long linepos;2922,88499
+  linebuffer lb;2923,88515
+} lbs[lbs2924,88532
+#define current_lb_is_new 2926,88543
+#define switch_line_buffers(2927,88588
+#define curlb 2929,88641
+#define newlb 2930,88672
+#define curlinepos 2931,88703
+#define newlinepos 2932,88744
+#define plainc 2934,88786
+#define cplpl 2935,88830
+#define cjava 2936,88861
+#define CNL_SAVE_DEFINEDEF(2938,88905
+#define CNL(2947,89117
+make_C_tag 2960,89375
+C_entries 2986,90194
+default_C_entries 3833,110156
+plain_C_entries 3840,110276
+Cplusplus_entries 3847,110364
+Cjava_entries 3854,110460
+Cstar_entries 3861,110550
+Yacc_entries 3868,110642
+#define LOOP_ON_INPUT_LINES(3875,110720
+#define LOOKING_AT(3884,111056
+#define LOOKING_AT_NOCASE(3891,111461
+just_read_file 3901,111861
+static void F_takeprec 3910,111965
+static void F_getit 3911,111996
+F_takeprec 3914,112039
+F_getit 3937,112366
+Fortran_functions 3961,112840
+Ada_getit 4052,114669
+Ada_funcs 4115,116044
+Asm_labels 4228,118582
+Perl_functions 4261,119549
+Python_functions 4357,122057
+PHP_functions 4387,122684
+Cobol_paragraphs 4466,124471
+Makefile_targets 4494,125029
+Pascal_functions 4529,125950
+static void L_getit 4706,130277
+L_getit 4709,130318
+Lisp_functions 4725,130664
+Lua_functions 4785,131850
+PS_functions 4811,132385
+Forth_words 4841,133053
+Scheme_functions 4877,134092
+static linebuffer *TEX_toktab TEX_toktab4908,134781
+static const char *TEX_defenv TEX_defenv4912,134974
+static void TEX_mode 4917,135172
+static void TEX_decode_env 4918,135203
+static char TEX_esc 4920,135261
+static char TEX_opgrp 4921,135289
+static char TEX_clgrp 4922,135318
+TeX_commands 4928,135395
+#define TEX_LESC 4986,136652
+#define TEX_SESC 4987,136674
+TEX_mode 4992,136804
+TEX_decode_env 5026,137509
+Texinfo_nodes 5071,138554
+HTML_labels 5094,139013
+static size_t prolog_pr 5214,142192
+static void prolog_skip_comment 5215,142234
+static size_t prolog_atom 5216,142290
+Prolog_functions 5219,142347
+prolog_skip_comment 5255,143128
+prolog_pr 5281,143736
+prolog_atom 5319,144628
+static int erlang_func 5374,145540
+static void erlang_attribute 5375,145581
+static int erlang_atom 5376,145620
+Erlang_functions 5379,145666
+erlang_func 5438,146965
+erlang_attribute 5476,147642
+erlang_atom 5496,148061
+static char *scan_separators scan_separators5520,148487
+static void add_regex 5521,148526
+static char *substitute substitute5522,148570
+scan_separators 5534,149080
+analyze_regex 5586,150460
+add_regex 5654,152050
+substitute 5767,154797
+free_regexps 5814,155837
+regex_tag_multiline 5836,156291
+nocase_tail 5913,158263
+get_tag 5928,158519
+readline_internal 5959,159455
+readline 6037,161296
+savestr 6230,167243
+savenstr 6240,167473
+skip_spaces 6249,167679
+skip_non_spaces 6258,167833
+skip_name 6267,167983
+fatal 6277,168156
+pfatal 6284,168253
+suggest_asking_for_help 6291,168332
+error 6300,168554
+concat 6313,168846
+etags_getcwd 6329,169259
+relative_filename 6350,169725
+absolute_filename 6389,170751
+absolute_dirname 6453,172416
+filename_is_absolute 6472,172845
+canonicalize_filename 6484,173096
+# define ISUPPER(6491,173235
+linebuffer_init 6514,173656
+linebuffer_setlen 6524,173887
+xmalloc 6536,174148
+xrealloc 6545,174314
+
+c-src/exit.c,99
+    size_t n;28,961
+    void EXFUN((*fn[fn29,975
+  } __libc_atexit;30,1011
+DEFUN(exit,38,1252
+
+c-src/exit.strange_suffix,99
+    size_t n;28,961
+    void EXFUN((*fn[fn29,975
+  } __libc_atexit;30,1011
+DEFUN(exit,38,1252
+
+c-src/sysdep.h,491
+#define        ENTRY(21,865
+#define        PSEUDO(26,972
+    movl $SYS_##syscall_nam$SYS_##syscall_na31,1132
+    movl $SYS_##syscall_name, %eax;eax31,1132
+    int $0x80;32,1180
+    test %eax,eax33,1210
+    test %eax, %eax;eax33,1210
+    jl syscall_error;34,1245
+#define        XCHG_0  47,1562
+#define        XCHG_1  48,1606
+#define        XCHG_2  49,1648
+#define        XCHG_3  50,1691
+#define        XCHG_4  51,1734
+#define        XCHG_5  52,1777
+#define        r0      54,1821
+#define        r1      55,1875
+#define scratch 56,1932
+#define MOVE(57,2001
+
+c-src/tab.c,196
+static int             count_words(15,263
+static char            *get_word(get_word35,553
+void                   tab_free(59,966
+char                   **tab_fill(tab_fill70,1129
+int                    tab_delete_first(91,1638
+int                    tab_count_words(103,1820
+
+c-src/dostorture.c,197
+(*tag1 tag118,451
+#define notag2 26,552
+(*tag2 tag229,629
+(*tag3 tag339,771
+#define notag4 45,860
+(*tag4 tag448,954
+tag5 57,1080
+tag6 66,1207
+int pp1(74,1316
+pp287,1418
+pp3(100,1517
+
+c-src/emacs/src/gmalloc.c,7311
+#define USE_PTHREAD25,1002
+#undef get_current_dir_name33,1126
+extern void emacs_abort 47,1305
+#undef malloc64,2110
+#undef realloc65,2124
+#undef calloc66,2139
+#undef free67,2153
+#define malloc 68,2165
+#define realloc 69,2188
+#define calloc 70,2213
+#define aligned_alloc 71,2236
+#define free 72,2273
+extern void *bss_sbrk bss_sbrk76,2335
+extern int bss_sbrk_did_unexec;77,2375
+extern char bss_sbrk_buffer[bss_sbrk_buffer78,2407
+extern void *bss_sbrk_buffer_end;bss_sbrk_buffer_end79,2438
+#define DUMPED 80,2472
+#define ALLOCATED_BEFORE_DUMPING(81,2507
+extern void *malloc malloc94,2718
+#define INT_BIT        124,3934
+#define BLOCKLOG       125,3977
+#define BLOCKSIZE      126,4018
+#define BLOCKIFY(127,4052
+#define HEAP   131,4215
+#define FINAL_FREE_BLOCKS      135,4391
+       int type;145,4676
+               size_t nfree;150,4720
+               size_t first;151,4777
+             } frag;152,4834
+           ptrdiff_t size;156,5055
+         } info;157,5076
+      } busy;158,5087
+       size_t size;163,5215
+       size_t next;164,5272
+       size_t prev;165,5321
+      } free;166,5374
+  } malloc_info;167,5388
+extern char *_heapbase;_heapbase170,5449
+extern malloc_info *_heapinfo;_heapinfo173,5541
+#define BLOCK(176,5620
+#define ADDRESS(177,5682
+extern size_t _heapindex;180,5797
+extern size_t _heaplimit;183,5866
+struct list186,5939
+    struct list *next;next188,5955
+    struct list *prev;prev189,5978
+extern struct list _fraghead[_fraghead193,6056
+struct alignlist196,6153
+    struct alignlist *next;next198,6174
+    void *aligned;aligned199,6202
+    void *exact;exact200,6270
+extern struct alignlist *_aligned_blocks;_aligned_blocks202,6334
+extern size_t _chunks_used;205,6401
+extern size_t _bytes_used;206,6429
+extern size_t _chunks_free;207,6456
+extern size_t _bytes_free;208,6484
+extern void *_malloc_internal _malloc_internal213,6673
+extern void *_realloc_internal _realloc_internal214,6713
+extern void _free_internal 215,6762
+extern void *_malloc_internal_nolock _malloc_internal_nolock216,6799
+extern void *_realloc_internal_nolock _realloc_internal_nolock217,6846
+extern void _free_internal_nolock 218,6902
+extern pthread_mutex_t _malloc_mutex,221,6966
+extern pthread_mutex_t _malloc_mutex, _aligned_blocks_mutex;221,6966
+extern int _malloc_thread_enabled_p;222,7027
+#define LOCK(223,7064
+#define UNLOCK(228,7195
+#define LOCK_ALIGNED_BLOCKS(233,7329
+#define UNLOCK_ALIGNED_BLOCKS(238,7484
+#define LOCK(244,7649
+#define UNLOCK(245,7664
+#define LOCK_ALIGNED_BLOCKS(246,7681
+#define UNLOCK_ALIGNED_BLOCKS(247,7711
+extern void *malloc_find_object_address malloc_find_object_address252,7865
+extern void *(*__morecore)__morecore256,8021
+extern void *__default_morecore __default_morecore259,8105
+extern void (*__after_morecore_hook)__after_morecore_hook263,8269
+extern size_t __malloc_extra_blocks;267,8442
+extern int __malloc_initialized;270,8552
+extern int __malloc_initialize 272,8646
+extern void (*__malloc_initialize_hook)__malloc_initialize_hook275,8723
+extern void (*__free_hook)__free_hook276,8771
+extern void *(*__malloc_hook)__malloc_hook277,8811
+extern void *(*__realloc_hook)__realloc_hook278,8856
+extern void *(*__memalign_hook)__memalign_hook279,8913
+enum mcheck_status283,9092
+    MCHECK_DISABLED 285,9115
+    MCHECK_OK,286,9187
+    MCHECK_FREE,287,9226
+    MCHECK_HEAD,288,9270
+    MCHECK_TAIL        289,9334
+extern int mcheck 296,9701
+extern enum mcheck_status mprobe 301,9952
+extern void mtrace 304,10055
+extern void muntrace 305,10082
+struct mstats308,10153
+    size_t bytes_total;310,10171
+    size_t chunks_used;311,10225
+    size_t bytes_used;312,10285
+    size_t chunks_free;313,10351
+    size_t bytes_free;314,10406
+extern struct mstats mstats 318,10518
+extern void memory_warnings 321,10625
+void *(*__malloc_hook)__malloc_hook352,11743
+char *_heapbase;_heapbase355,11829
+malloc_info *_heapinfo;_heapinfo358,11927
+static size_t heapsize;361,11983
+size_t _heapindex;364,12047
+size_t _heaplimit;367,12109
+struct list _fraghead[_fraghead370,12171
+size_t _chunks_used;373,12229
+size_t _bytes_used;374,12250
+size_t _chunks_free;375,12270
+size_t _bytes_free;376,12291
+int __malloc_initialized;379,12340
+size_t __malloc_extra_blocks;381,12367
+void (*__malloc_initialize_hook)__malloc_initialize_hook383,12398
+void (*__after_morecore_hook)__after_morecore_hook384,12439
+static int state_protected_p;400,12912
+static size_t last_state_size;401,12942
+static malloc_info *last_heapinfo;last_heapinfo402,12973
+protect_malloc_state 405,13014
+#define PROTECT_MALLOC_STATE(426,13627
+#define PROTECT_MALLOC_STATE(429,13697
+align 435,13794
+get_contiguous_space 466,14616
+register_heapinfo 497,15325
+pthread_mutex_t _malloc_mutex 517,15879
+pthread_mutex_t _aligned_blocks_mutex 518,15938
+int _malloc_thread_enabled_p;519,16005
+malloc_atfork_handler_prepare 522,16048
+malloc_atfork_handler_parent 529,16139
+malloc_atfork_handler_child 536,16233
+malloc_enable_thread 544,16375
+malloc_initialize_1 563,16961
+__malloc_initialize 594,17793
+static int morecore_recursing;604,17926
+morecore_nolock 609,18066
+_malloc_internal_nolock 722,21584
+_malloc_internal 920,28102
+malloc 932,28247
+extern void *_malloc _malloc956,29033
+extern void _free 957,29064
+extern void *_realloc _realloc958,29092
+_malloc 961,29140
+_free 967,29196
+_realloc 973,29240
+void (*__free_hook)__free_hook1001,30259
+struct alignlist *_aligned_blocks _aligned_blocks1004,30345
+_free_internal_nolock 1009,30474
+_free_internal 1255,38476
+free 1265,38603
+weak_alias 1277,38799
+#define min(1306,39813
+void *(*__realloc_hook)__realloc_hook1310,39898
+_realloc_internal_nolock 1319,40309
+_realloc_internal 1435,43563
+realloc 1447,43726
+calloc 1478,44894
+#define        __sbrk  1513,46042
+extern void *__sbrk __sbrk1518,46247
+__default_morecore 1525,46511
+void *(*__memalign_hook)__memalign_hook1554,47456
+aligned_alloc 1557,47522
+memalign 1647,49704
+posix_memalign 1656,49909
+extern void *valloc valloc1695,51140
+extern int getpagesize 1700,51278
+static size_t pagesize;1703,51317
+valloc 1706,51349
+#undef malloc1715,51490
+#undef realloc1716,51504
+#undef calloc1717,51519
+#undef aligned_alloc1718,51533
+#undef free1719,51554
+extern void *malloc malloc1722,51609
+extern void *realloc realloc1723,51644
+extern void *calloc calloc1724,51691
+extern void free 1725,51740
+extern void *aligned_alloc aligned_alloc1727,51796
+extern int posix_memalign 1729,51890
+hybrid_malloc 1736,52083
+hybrid_calloc 1744,52188
+hybrid_free 1752,52319
+hybrid_aligned_alloc 1765,52626
+hybrid_realloc 1780,52984
+char *gget_current_dir_name gget_current_dir_name1808,53753
+hybrid_get_current_dir_name 1811,53797
+static void (*old_free_hook)old_free_hook1846,54921
+static void *(*old_malloc_hook)old_malloc_hook1847,54963
+static void *(*old_realloc_hook)old_realloc_hook1848,55010
+static void (*abortfunc)abortfunc1851,55124
+#define MAGICWORD      1854,55206
+#define MAGICFREE      1855,55261
+#define MAGICBYTE      1856,55316
+#define MALLOCFLOOD    1857,55348
+#define FREEFLOOD      1858,55382
+struct hdr1860,55415
+    size_t size;1862,55430
+    size_t magic;1863,55484
+checkhdr 1867,55581
+freehook 1891,56022
+mallochook 1927,56804
+reallochook 1944,57143
+mabort 1978,57901
+static int mcheck_used 2012,58586
+mcheck 2015,58619
+mprobe 2035,59138
+
+c-src/emacs/src/regex.h,5300
+#define _REGEX_H 21,836
+typedef unsigned long reg_syntax_t;43,1577
+#define RE_BACKSLASH_ESCAPE_IN_LISTS 47,1749
+#define RE_BK_PLUS_QM 52,1969
+#define RE_CHAR_CLASSES 58,2298
+#define RE_CONTEXT_INDEP_ANCHORS 72,3032
+#define RE_CONTEXT_INDEP_OPS 80,3458
+#define RE_CONTEXT_INVALID_OPS 84,3658
+#define RE_DOT_NEWLINE 88,3801
+#define RE_DOT_NOT_NULL 92,3937
+#define RE_HAT_LISTS_NOT_NEWLINE 96,4082
+#define RE_INTERVALS 101,4292
+#define RE_LIMITED_OPS 105,4441
+#define RE_NEWLINE_ALT 109,4583
+#define RE_NO_BK_BRACES 114,4773
+#define RE_NO_BK_PARENS 118,4964
+#define RE_NO_BK_REFS 122,5120
+#define RE_NO_BK_VBAR 126,5316
+#define RE_NO_EMPTY_RANGES 132,5610
+#define RE_UNMATCHED_RIGHT_PAREN_ORD 136,5766
+#define RE_NO_POSIX_BACKTRACKING 140,5937
+#define RE_NO_GNU_OPS 144,6133
+#define RE_FRUGAL 147,6253
+#define RE_SHY_GROUPS 150,6360
+#define RE_NO_NEWLINE_ANCHOR 153,6468
+#define RE_DEBUG 161,6884
+extern reg_syntax_t re_syntax_options;167,7170
+extern Lisp_Object re_match_object;172,7344
+extern size_t re_max_failures;176,7454
+#define RE_SYNTAX_EMACS        183,7684
+#define RE_SYNTAX_AWK  186,7780
+#define RE_SYNTAX_GNU_AWK      193,8084
+#define RE_SYNTAX_POSIX_AWK 197,8255
+#define RE_SYNTAX_GREP 201,8393
+#define RE_SYNTAX_EGREP        206,8549
+#define RE_SYNTAX_POSIX_EGREP  212,8765
+#define RE_SYNTAX_ED 216,8910
+#define RE_SYNTAX_SED 218,8954
+#define _RE_SYNTAX_POSIX_COMMON        221,9072
+#define RE_SYNTAX_POSIX_BASIC  225,9215
+#define RE_SYNTAX_POSIX_MINIMAL_BASIC  231,9508
+#define RE_SYNTAX_POSIX_EXTENDED       234,9598
+#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED       242,9967
+# undef RE_DUP_MAX253,10454
+#define RE_DUP_MAX 256,10540
+#define REG_EXTENDED 263,10762
+#define REG_ICASE 267,10886
+#define REG_NEWLINE 272,11070
+#define REG_NOSUB 276,11248
+#define REG_NOTBOL 286,11614
+#define REG_NOTEOL 289,11688
+  REG_ENOSYS 297,11859
+  REG_NOERROR 300,11941
+  REG_NOMATCH,301,11976
+  REG_BADPAT,305,12123
+  REG_ECOLLATE,306,12162
+  REG_ECTYPE,307,12203
+  REG_EESCAPE,308,12255
+  REG_ESUBREG,309,12298
+  REG_EBRACK,310,12345
+  REG_EPAREN,311,12391
+  REG_EBRACE,312,12436
+  REG_BADBR,313,12472
+  REG_ERANGE,314,12519
+  REG_ESPACE,315,12560
+  REG_BADRPT,316,12601
+  REG_EEND,319,12693
+  REG_ESIZE,320,12728
+  REG_ERPAREN,321,12790
+  REG_ERANGEX  322,12859
+} reg_errcode_t;323,12911
+# define RE_TRANSLATE_TYPE 332,13273
+struct re_pattern_buffer335,13315
+  unsigned char *buffer;buffer341,13538
+  size_t allocated;344,13614
+  size_t used;347,13686
+  reg_syntax_t syntax;350,13769
+  char *fastmap;fastmap355,13975
+  RE_TRANSLATE_TYPE translate;361,14241
+  size_t re_nsub;364,14329
+  unsigned can_be_null 370,14624
+#define REGS_UNALLOCATED 376,14889
+#define REGS_REALLOCATE 377,14916
+#define REGS_FIXED 378,14942
+  unsigned regs_allocated 379,14963
+  unsigned fastmap_accurate 383,15136
+  unsigned no_sub 387,15267
+  unsigned not_bol 391,15398
+  unsigned not_eol 394,15475
+  unsigned used_syntax 398,15655
+  unsigned multibyte 403,15805
+  unsigned target_multibyte 407,15941
+  int charset_unibyte;410,16032
+typedef struct re_pattern_buffer regex_t;416,16098
+typedef ssize_t regoff_t;423,16492
+struct re_registers428,16652
+  unsigned num_regs;430,16674
+  regoff_t *start;start431,16695
+  regoff_t *end;end432,16714
+# define RE_NREGS 440,16942
+  regoff_t rm_so;449,17159
+  regoff_t rm_eo;450,17239
+} regmatch_t;451,17317
+extern reg_syntax_t re_set_syntax 457,17512
+extern const char *re_compile_pattern re_compile_pattern462,17776
+extern int re_compile_fastmap 469,18058
+extern regoff_t re_search 477,18466
+extern regoff_t re_search_2 485,18781
+extern regoff_t re_match 495,19177
+extern regoff_t re_match_2 501,19407
+extern void re_set_registers 520,20197
+extern char *re_comp re_comp528,20469
+extern int re_exec 529,20506
+#  define _Restrict_ 540,20886
+#  define _Restrict_ 542,20979
+#  define _Restrict_544,21018
+#  define _Restrict_arr_ 555,21418
+#  define _Restrict_arr_557,21461
+extern reg_errcode_t regcomp 562,21530
+extern reg_errcode_t regexec 566,21656
+extern size_t regerror 571,21850
+extern void regfree 574,21956
+#  define CHAR_CLASS_MAX_LENGTH 593,22470
+#  define CHAR_CLASS_MAX_LENGTH 597,22648
+typedef wctype_t re_wctype_t;599,22692
+typedef wchar_t re_wchar_t;600,22722
+# define re_wctype 601,22750
+# define re_iswctype 602,22776
+# define re_wctype_to_bit(603,22806
+# define CHAR_CLASS_MAX_LENGTH 605,22844
+# define btowc(606,22906
+typedef enum { RECC_ERROR 609,22953
+              RECC_ALNUM,610,22984
+              RECC_ALNUM, RECC_ALPHA,610,22984
+              RECC_ALNUM, RECC_ALPHA, RECC_WORD,610,22984
+              RECC_GRAPH,611,23027
+              RECC_GRAPH, RECC_PRINT,611,23027
+              RECC_LOWER,612,23059
+              RECC_LOWER, RECC_UPPER,612,23059
+              RECC_PUNCT,613,23091
+              RECC_PUNCT, RECC_CNTRL,613,23091
+              RECC_DIGIT,614,23123
+              RECC_DIGIT, RECC_XDIGIT,614,23123
+              RECC_BLANK,615,23156
+              RECC_BLANK, RECC_SPACE,615,23156
+              RECC_MULTIBYTE,616,23188
+              RECC_MULTIBYTE, RECC_NONASCII,616,23188
+              RECC_ASCII,617,23227
+              RECC_ASCII, RECC_UNIBYTE617,23227
+} re_wctype_t;618,23260
+extern char re_iswctype 620,23276
+extern re_wctype_t re_wctype 621,23329
+typedef int re_wchar_t;623,23387
+extern void re_set_whitespace_regexp 625,23412
+
+c-src/emacs/src/keyboard.c,23269
+volatile int interrupt_input_blocked;76,1808
+volatile bool pending_signals;80,1944
+#define KBD_BUFFER_SIZE 82,1976
+KBOARD *initial_kboard;initial_kboard84,2006
+KBOARD *current_kboard;current_kboard85,2030
+static KBOARD *all_kboards;all_kboards86,2054
+static bool single_kboard;89,2154
+#define NUM_RECENT_KEYS 91,2182
+static int recent_keys_index;94,2269
+static int total_keys;97,2357
+static Lisp_Object recent_keys;100,2443
+Lisp_Object this_command_keys;107,2777
+ptrdiff_t this_command_key_count;108,2808
+static bool this_command_key_count_reset;112,2922
+static Lisp_Object raw_keybuf;116,3074
+static int raw_keybuf_count;117,3105
+#define GROW_RAW_KEYBUF        119,3135
+static ptrdiff_t this_single_command_key_start;125,3350
+static ptrdiff_t before_command_key_count;129,3498
+static ptrdiff_t before_command_echo_length;130,3541
+sigjmp_buf return_to_command_loop;135,3677
+static Lisp_Object recover_top_level_message;138,3791
+static Lisp_Object regular_top_level_message;143,3930
+static sys_jmp_buf getcjmp;147,4031
+bool waiting_for_input;150,4095
+static bool echoing;154,4186
+static struct kboard 
*ok_to_echo_at_next_pause;ok_to_echo_at_next_pause159,4328
+struct kboard *echo_kboard;echo_kboard166,4632
+Lisp_Object echo_message_buffer;171,4744
+bool immediate_quit;174,4837
+int quit_char;192,5623
+EMACS_INT command_loop_level;195,5680
+Lisp_Object unread_switch_frame;204,6108
+static ptrdiff_t last_non_minibuf_size;207,6216
+uintmax_t num_input_events;210,6334
+static EMACS_INT last_auto_save;214,6428
+static ptrdiff_t last_point_position;217,6523
+Lisp_Object internal_last_event_frame;228,7028
+static Lisp_Object read_key_sequence_cmd;232,7168
+static Lisp_Object read_key_sequence_remapped;233,7210
+static FILE *dribble;dribble236,7310
+bool input_pending;239,7368
+static bool input_was_pending;287,10022
+static struct input_event kbd_buffer[kbd_buffer291,10107
+static struct input_event *kbd_fetch_ptr;kbd_fetch_ptr297,10386
+static struct input_event * volatile kbd_store_ptr;302,10601
+static void recursive_edit_unwind 313,11088
+static Lisp_Object command_loop 314,11144
+static void echo_now 316,11185
+static ptrdiff_t echo_length 317,11214
+unsigned timers_run;320,11296
+struct timespec 
*input_available_clear_time;input_available_clear_time324,11408
+bool interrupt_input;328,11573
+bool interrupts_deferred;331,11671
+static struct timespec timer_idleness_start_time;335,11746
+static struct timespec timer_last_idleness_start_time;340,11916
+#define READABLE_EVENTS_DO_TIMERS_NOW  346,12046
+#define READABLE_EVENTS_FILTER_EVENTS  347,12094
+#define READABLE_EVENTS_IGNORE_SQUEEZABLES     348,12142
+static void (*keyboard_init_hook)keyboard_init_hook351,12264
+static bool get_input_pending 353,12307
+static bool readable_events 354,12344
+static Lisp_Object read_char_x_menu_prompt 355,12379
+static Lisp_Object read_char_minibuf_menu_prompt 357,12502
+static Lisp_Object make_lispy_event 358,12571
+static Lisp_Object make_lispy_movement 359,12631
+static Lisp_Object modify_event_symbol 363,12840
+static Lisp_Object make_lispy_switch_frame 366,13050
+static Lisp_Object make_lispy_focus_in 367,13108
+static Lisp_Object make_lispy_focus_out 369,13188
+static bool help_char_p 371,13275
+static void save_getcjmp 372,13314
+static void restore_getcjmp 373,13354
+static Lisp_Object apply_modifiers 374,13397
+static void clear_event 375,13452
+static void restore_kboard_configuration 376,13500
+static void deliver_input_available_signal 378,13568
+static void handle_interrupt 380,13631
+static _Noreturn void quit_throw_to_read_char 381,13668
+static void process_special_events 382,13722
+static void timer_start_idle 383,13765
+static void timer_stop_idle 384,13802
+static void timer_resume_idle 385,13838
+static void deliver_user_signal 386,13876
+static char *find_user_signal_name find_user_signal_name387,13915
+static void store_user_signal_events 388,13957
+kset_echo_string 392,14088
+kset_kbd_queue 397,14184
+kset_keyboard_translate_table 402,14276
+kset_last_prefix_arg 407,14399
+kset_last_repeatable_command 412,14504
+kset_local_function_key_map 417,14625
+kset_overriding_terminal_local_map 422,14744
+kset_real_last_command 427,14877
+kset_system_key_syms 432,14986
+echo_add_key 443,15249
+echo_char 527,17527
+echo_dash 541,17813
+echo_now 586,19140
+cancel_echoing 635,20614
+echo_length 648,20922
+echo_truncate 660,21253
+add_command_key 672,21582
+recursive_edit_1 697,22406
+record_auto_save 742,23848
+force_auto_save_soon 751,24016
+DEFUN ("recursive-edit", Frecursive_edit,recursive-edit759,24137
+recursive_edit_unwind 804,25747
+any_kboard_state 817,26013
+single_kboard_state 838,26665
+not_single_kboard_state 848,26803
+struct kboard_stack858,27065
+  KBOARD *kboard;kboard860,27087
+  struct kboard_stack *next;next861,27105
+static struct kboard_stack *kboard_stack;kboard_stack864,27138
+push_kboard 867,27186
+pop_kboard 879,27375
+temporarily_switch_to_single_kboard 914,28263
+record_single_kboard_state 943,29437
+restore_kboard_configuration 952,29621
+cmd_error 970,30077
+cmd_error_internal 1024,31510
+DEFUN ("command-error-default-function", 
Fcommand_error_default_function,command-error-default-function1043,32030
+static Lisp_Object command_loop_2 1086,33637
+static Lisp_Object top_level_1 1087,33686
+command_loop 1094,33916
+command_loop_2 1134,35135
+top_level_2 1146,35339
+top_level_1 1152,35417
+DEFUN ("top-level", Ftop_level,top-level1164,35787
+user_error 1183,36288
+DEFUN ("exit-recursive-edit", 
Fexit_recursive_edit,exit-recursive-edit1189,36429
+DEFUN ("abort-recursive-edit", 
Fabort_recursive_edit,abort-recursive-edit1201,36819
+tracking_off 1216,37281
+DEFUN ("internal--track-mouse", Ftrack_mouse,track-mouse1234,37816
+bool ignore_mouse_drag_p;1256,38392
+some_mouse_moved 1259,38441
+static int read_key_sequence 1282,38799
+static void adjust_point_for_property 1284,38917
+Lisp_Object last_undo_boundary;1287,39032
+command_loop_1 1294,39273
+read_menu_command 1649,50889
+adjust_point_for_property 1678,51617
+safe_run_hooks_1 1831,57339
+safe_run_hooks_error 1841,57569
+safe_run_hook_funcall 1878,58576
+safe_run_hooks 1893,59058
+int poll_suppress_count;1908,59397
+static struct atimer *poll_timer;poll_timer1915,59487
+poll_for_input_1 1919,59589
+poll_for_input 1930,59789
+start_polling 1942,60053
+input_polling_used 1979,61091
+stop_polling 1994,61390
+set_poll_suppress_count 2009,61759
+bind_polling_period 2029,62141
+make_ctrl_char 2048,62492
+show_help_echo 2113,64455
+static Lisp_Object kbd_buffer_get_event 2152,65484
+static void record_char 2154,65596
+static Lisp_Object help_form_saved_window_configs;2156,65638
+read_char_help_form_unwind 2158,65701
+#define STOP_POLLING   2166,65959
+#define RESUME_POLLING 2170,66084
+read_event_from_main_queue 2175,66229
+read_decoded_event_from_main_queue 2249,68417
+#define MAX_ENCODED_BYTES 2254,68664
+echo_keystrokes_p 2342,71556
+read_char 2376,72848
+record_menu_key 3225,98949
+help_char_p 3258,99674
+record_char 3273,99953
+save_getcjmp 3412,104235
+restore_getcjmp 3418,104326
+readable_events 3430,104697
+int stop_character EXTERNALLY_VISIBLE;3497,106437
+event_to_kboard 3500,106493
+kbd_buffer_nr_stored 3522,107142
+kbd_buffer_store_event 3534,107483
+kbd_buffer_store_event_hold 3550,108025
+kbd_buffer_unget_event 3684,111617
+#define INPUT_EVENT_POS_MAX 3698,112018
+#define INPUT_EVENT_POS_MIN 3701,112147
+position_to_Time 3706,112287
+Time_to_position 3716,112514
+gen_help_event 3738,113171
+kbd_buffer_store_help_event 3756,113611
+discard_mouse_events 3773,113976
+kbd_buffer_events_waiting 3803,114711
+clear_event 3823,115068
+kbd_buffer_get_event 3836,115408
+process_special_events 4258,127881
+swallow_events 4322,129705
+timer_start_idle 4339,130098
+timer_stop_idle 4355,130576
+timer_resume_idle 4363,130720
+struct input_event last_timer_event EXTERNALLY_VISIBLE;4372,130912
+Lisp_Object pending_funcalls;4377,131172
+decode_timer 4381,131293
+timer_check_2 4414,132246
+timer_check 4572,136817
+DEFUN ("current-idle-time", Fcurrent_idle_time,current-idle-time4607,137662
+static Lisp_Object accent_key_syms;4625,138239
+static Lisp_Object func_key_syms;4626,138275
+static Lisp_Object mouse_syms;4627,138309
+static Lisp_Object wheel_syms;4628,138340
+static Lisp_Object drag_n_drop_syms;4629,138371
+static const int lispy_accent_codes[lispy_accent_codes4634,138516
+static const char *const lispy_accent_keys[lispy_accent_keys4741,139878
+#define FUNCTION_KEY_OFFSET 4766,140314
+const char *const lispy_function_keys[lispy_function_keys4768,140347
+static const char *const 
lispy_multimedia_keys[lispy_multimedia_keys4962,148901
+static const char *const lispy_kana_keys[lispy_kana_keys5026,150135
+#define FUNCTION_KEY_OFFSET 5061,151751
+static const char *const lispy_function_keys[lispy_function_keys5065,151894
+#define ISO_FUNCTION_KEY_OFFSET 5149,154429
+static const char *const 
iso_lispy_function_keys[iso_lispy_function_keys5151,154469
+static Lisp_Object Vlispy_mouse_stem;5172,155328
+static const char *const lispy_wheel_names[lispy_wheel_names5174,155367
+static const char *const 
lispy_drag_n_drop_names[lispy_drag_n_drop_names5181,155619
+static short const scroll_bar_parts[scroll_bar_parts5189,155885
+static Lisp_Object button_down_location;5210,156910
+static int last_mouse_button;5215,157065
+static int last_mouse_x;5216,157095
+static int last_mouse_y;5217,157120
+static Time button_down_time;5218,157145
+static int double_click_count;5222,157229
+make_lispy_position 5228,157390
+toolkit_menubar_in_use 5456,163953
+make_scroll_bar_position 5469,164321
+make_lispy_event 5485,164967
+make_lispy_movement 6104,183531
+make_lispy_switch_frame 6131,184262
+make_lispy_focus_in 6137,184369
+make_lispy_focus_out 6145,184495
+parse_modifiers_uncached 6163,184945
+#define SINGLE_LETTER_MOD(6185,185465
+#undef SINGLE_LETTER_MOD6212,185906
+#define MULTI_LETTER_MOD(6214,185932
+#undef MULTI_LETTER_MOD6231,186400
+apply_modifiers_uncached 6273,187574
+static const char *const modifier_names[modifier_names6319,189193
+#define NUM_MOD_NAMES 6325,189399
+static Lisp_Object modifier_symbols;6327,189449
+lispy_modifier_list 6331,189586
+#define KEY_TO_CHAR(6353,190252
+parse_modifiers 6356,190328
+DEFUN ("internal-event-symbol-parse-modifiers", 
Fevent_symbol_parse_modifiers,event-symbol-parse-modifiers6399,191517
+apply_modifiers 6422,192391
+reorder_modifiers 6491,194720
+modify_event_symbol 6536,196528
+DEFUN ("event-convert-list", 
Fevent_convert_list,event-convert-list6628,199244
+parse_solitary_modifier 6695,201135
+#define SINGLE_LETTER_MOD(6701,201258
+#define MULTI_LETTER_MOD(6705,201343
+#undef SINGLE_LETTER_MOD6763,202641
+#undef MULTI_LETTER_MOD6764,202666
+lucid_event_type_list_p 6775,202889
+get_input_pending 6814,203960
+record_asynch_buffer_change 6834,204579
+gobble_input 6872,205702
+tty_read_avail_input 6967,208310
+handle_async_input 7149,214039
+process_pending_signals 7165,214359
+unblock_input_to 7177,214645
+unblock_input 7200,215277
+totally_unblock_input 7209,215445
+handle_input_available_signal 7217,215529
+deliver_input_available_signal 7226,215700
+struct user_signal_info7235,215865
+  int sig;7238,215915
+  char *name;name7241,215956
+  int npending;7244,216007
+  struct user_signal_info *next;next7246,216024
+static struct user_signal_info *user_signals user_signals7250,216090
+add_user_signal 7253,216149
+handle_user_signal 7275,216598
+deliver_user_signal 7316,217558
+find_user_signal_name 7322,217659
+store_user_signal_events 7334,217841
+static void menu_bar_item 7362,218341
+static Lisp_Object menu_bar_one_keymap_changed_items;7363,218416
+static Lisp_Object menu_bar_items_vector;7368,218630
+static int menu_bar_items_index;7369,218672
+static const char *separator_names[separator_names7372,218707
+menu_separator_name_p 7393,219148
+menu_bar_items 7426,219852
+Lisp_Object item_properties;7568,224603
+menu_bar_item 7571,224645
+menu_item_eval_property_1 7647,227175
+eval_dyn 7658,227465
+menu_item_eval_property 7666,227675
+parse_menu_item 7686,228341
+static Lisp_Object tool_bar_items_vector;7965,236336
+static Lisp_Object tool_bar_item_properties;7970,236510
+static int ntool_bar_items;7974,236606
+static void init_tool_bar_items 7978,236664
+static void process_tool_bar_item 7979,236711
+static bool parse_tool_bar_item 7981,236801
+static void append_tool_bar_item 7982,236861
+tool_bar_items 7990,237083
+process_tool_bar_item 8075,239892
+#define PROP(8112,240969
+set_prop 8114,241038
+parse_tool_bar_item 8167,242453
+#undef PROP8379,248844
+init_tool_bar_items 8387,248969
+append_tool_bar_item 8401,249261
+read_char_x_menu_prompt 8443,250771
+read_char_minibuf_menu_prompt 8503,252445
+#define PUSH_C_STR(8527,253014
+follow_key 8726,258553
+active_maps 8733,258695
+typedef struct keyremap8742,259021
+  Lisp_Object parent;8745,259107
+  Lisp_Object map;8748,259224
+  int start,8753,259446
+  int start, end;8753,259446
+} keyremap;8754,259464
+access_keymap_keyremap 8764,259808
+keyremap_step 8811,261450
+test_undefined 8867,262934
+read_key_sequence 8916,264861
+read_key_sequence_vs 9826,295821
+DEFUN ("read-key-sequence", Fread_key_sequence,read-key-sequence9885,297294
+DEFUN ("read-key-sequence-vector", 
Fread_key_sequence_vector,read-key-sequence-vector9938,299982
+detect_input_pending 9950,300488
+detect_input_pending_ignore_squeezables 9959,300654
+detect_input_pending_run_timers 9967,300870
+clear_input_pending 9985,301362
+requeued_events_pending_p 9997,301732
+DEFUN ("input-pending-p", Finput_pending_p,input-pending-p10002,301813
+DEFUN ("recent-keys", Frecent_keys,recent-keys10024,302596
+DEFUN ("this-command-keys", Fthis_command_keys,this-command-keys10055,303517
+DEFUN ("this-command-keys-vector", 
Fthis_command_keys_vector,this-command-keys-vector10068,303958
+DEFUN ("this-single-command-keys", 
Fthis_single_command_keys,this-single-command-keys10080,304380
+DEFUN ("this-single-command-raw-keys", 
Fthis_single_command_raw_keys,this-single-command-raw-keys10096,304955
+DEFUN ("reset-this-command-lengths", 
Freset_this_command_lengths,reset-this-command-lengths10109,305495
+DEFUN ("clear-this-command-keys", 
Fclear_this_command_keys,clear-this-command-keys10136,306510
+DEFUN ("recursion-depth", Frecursion_depth,recursion-depth10158,307069
+DEFUN ("open-dribble-file", Fopen_dribble_file,open-dribble-file10169,307406
+DEFUN ("discard-input", Fdiscard_input,discard-input10203,308447
+DEFUN ("suspend-emacs", Fsuspend_emacs,suspend-emacs10225,308949
+stuff_buffered_input 10285,311045
+set_waiting_for_input 10323,312016
+clear_waiting_for_input 10337,312390
+handle_interrupt_signal 10351,312754
+deliver_interrupt_signal 10378,313642
+static int volatile force_quit_count;10387,313932
+handle_interrupt 10401,314414
+quit_throw_to_read_char 10541,318711
+DEFUN ("set-input-interrupt-mode", 
Fset_input_interrupt_mode,set-input-interrupt-mode10562,319288
+DEFUN ("set-output-flow-control", 
Fset_output_flow_control,set-output-flow-control10609,320516
+DEFUN ("set-input-meta-mode", 
Fset_input_meta_mode,set-input-meta-mode10643,321432
+DEFUN ("set-quit-char", Fset_quit_char,set-quit-char10694,322706
+DEFUN ("set-input-mode", Fset_input_mode,set-input-mode10729,323570
+DEFUN ("current-input-mode", 
Fcurrent_input_mode,current-input-mode10750,324459
+DEFUN ("posn-at-x-y", Fposn_at_x_y,posn-at-x-y10787,325837
+DEFUN ("posn-at-point", Fposn_at_point,posn-at-point10824,327060
+init_kboard 10861,328214
+allocate_kboard 10893,329284
+wipe_kboard 10909,329637
+delete_kboard 10917,329751
+init_keyboard 10942,330281
+struct event_head11021,332696
+  short var;11023,332716
+  short kind;11024,332729
+static const struct event_head head_table[head_table11027,332747
+syms_of_keyboard 11045,333577
+  DEFVAR_LISP ("internal--top-level-message"11058,333972
+  DEFVAR_LISP ("last-command-event"11312,342173
+  DEFVAR_LISP ("last-nonmenu-event"11315,342297
+  DEFVAR_LISP ("last-input-event"11321,342636
+  DEFVAR_LISP ("unread-command-events"11324,342730
+  DEFVAR_LISP ("unread-post-input-method-events"11332,343190
+  DEFVAR_LISP ("unread-input-method-events"11338,343529
+  DEFVAR_LISP ("meta-prefix-char"11346,343898
+  DEFVAR_KBOARD ("last-command"11351,344106
+  DEFVAR_KBOARD ("real-last-command"11368,344787
+  DEFVAR_KBOARD ("last-repeatable-command"11372,344973
+  DEFVAR_LISP ("this-command"11378,345261
+  DEFVAR_LISP ("real-this-command"11384,345498
+  DEFVAR_LISP ("this-command-keys-shift-translated"11388,345680
+  DEFVAR_LISP ("this-original-command"11396,346123
+  DEFVAR_INT ("auto-save-interval"11403,346520
+  DEFVAR_LISP ("auto-save-timeout"11408,346734
+  DEFVAR_LISP ("echo-keystrokes"11415,347079
+  DEFVAR_INT ("polling-period"11421,347350
+  DEFVAR_LISP ("double-click-time"11428,347693
+  DEFVAR_INT ("double-click-fuzz"11435,348029
+  DEFVAR_INT ("num-input-keys"11446,348519
+  DEFVAR_INT ("num-nonmacro-input-events"11452,348794
+  DEFVAR_LISP ("last-event-frame"11457,349032
+  DEFVAR_LISP ("tty-erase-char"11463,349311
+  DEFVAR_LISP ("help-char"11466,349434
+  DEFVAR_LISP ("help-event-list"11472,349717
+  DEFVAR_LISP ("help-form"11477,349928
+  DEFVAR_LISP ("prefix-help-command"11483,350176
+  DEFVAR_LISP ("top-level"11489,350454
+  DEFVAR_KBOARD ("keyboard-translate-table"11495,350675
+  DEFVAR_BOOL ("cannot-suspend"11511,351488
+  DEFVAR_BOOL ("menu-prompting"11516,351715
+  DEFVAR_LISP ("menu-prompt-more-char"11526,352145
+  DEFVAR_INT ("extra-keyboard-modifiers"11531,352391
+  DEFVAR_LISP ("deactivate-mark"11545,353117
+  DEFVAR_LISP ("pre-command-hook"11553,353486
+  DEFVAR_LISP ("post-command-hook"11560,353841
+  DEFVAR_LISP ("echo-area-clear-hook"11568,354204
+  DEFVAR_LISP ("lucid-menu-bar-dirty-flag"11574,354419
+  DEFVAR_LISP ("menu-bar-final-items"11578,354622
+  DEFVAR_LISP ("tool-bar-separator-image-expression"11583,354872
+  DEFVAR_KBOARD ("overriding-terminal-local-map"11589,355230
+  DEFVAR_LISP ("overriding-local-map"11598,355652
+  DEFVAR_LISP ("overriding-local-map-menu-flag"11607,356103
+  DEFVAR_LISP ("special-event-map"11613,356442
+  DEFVAR_LISP ("track-mouse"11617,356630
+  DEFVAR_KBOARD ("system-key-alist"11620,356757
+  DEFVAR_KBOARD ("local-function-key-map"11629,357138
+  DEFVAR_KBOARD ("input-decode-map"11658,358597
+  DEFVAR_LISP ("function-key-map"11675,359385
+  DEFVAR_LISP ("key-translation-map"11683,359801
+  DEFVAR_LISP ("deferred-action-list"11689,360145
+  DEFVAR_LISP ("deferred-action-function"11694,360393
+  DEFVAR_LISP ("delayed-warnings-list"11700,360692
+  DEFVAR_LISP ("timer-list"11708,361100
+  DEFVAR_LISP ("timer-idle-list"11712,361252
+  DEFVAR_LISP ("input-method-function"11716,361415
+  DEFVAR_LISP ("input-method-previous-message"11737,362384
+  DEFVAR_LISP ("show-help-function"11744,362745
+  DEFVAR_LISP ("disable-point-adjustment"11749,362977
+  DEFVAR_LISP ("global-disable-point-adjustment"11761,363527
+  DEFVAR_LISP ("minibuffer-message-timeout"11770,363893
+  DEFVAR_LISP ("throw-on-input"11775,364171
+  DEFVAR_LISP ("command-error-function"11781,364422
+  DEFVAR_LISP ("enable-disabled-menus-and-buttons"11790,364909
+  DEFVAR_LISP ("select-active-regions"11798,365236
+  DEFVAR_LISP ("saved-region-selection"11807,365628
+  DEFVAR_LISP ("selection-inhibit-update-commands"11815,366013
+  DEFVAR_LISP ("debug-on-event"11825,366554
+keys_of_keyboard 11841,367115
+mark_kboards 11916,370434
+  DEFVAR_LISP ("internal--top-level-message",\111058,333972
+  DEFVAR_LISP ("last-command-event",\111312,342173
+  DEFVAR_LISP ("last-nonmenu-event",\111315,342297
+  DEFVAR_LISP ("last-input-event",\111321,342636
+  DEFVAR_LISP ("unread-command-events",\111324,342730
+  DEFVAR_LISP ("unread-post-input-method-events",\111332,343190
+  DEFVAR_LISP ("unread-input-method-events",\111338,343529
+  DEFVAR_LISP ("meta-prefix-char",\111346,343898
+  DEFVAR_KBOARD ("last-command",\111351,344106
+  DEFVAR_KBOARD ("real-last-command",\111368,344787
+  DEFVAR_KBOARD ("last-repeatable-command",\111372,344973
+  DEFVAR_LISP ("this-command",\111378,345261
+  DEFVAR_LISP ("real-this-command",\111384,345498
+  DEFVAR_LISP ("this-command-keys-shift-translated",\111388,345680
+  DEFVAR_LISP ("this-original-command",\111396,346123
+  DEFVAR_INT ("auto-save-interval",\111403,346520
+  DEFVAR_LISP ("auto-save-timeout",\111408,346734
+  DEFVAR_LISP ("echo-keystrokes",\111415,347079
+  DEFVAR_INT ("polling-period",\111421,347350
+  DEFVAR_LISP ("double-click-time",\111428,347693
+  DEFVAR_INT ("double-click-fuzz",\111435,348029
+  DEFVAR_INT ("num-input-keys",\111446,348519
+  DEFVAR_INT ("num-nonmacro-input-events",\111452,348794
+  DEFVAR_LISP ("last-event-frame",\111457,349032
+  DEFVAR_LISP ("tty-erase-char",\111463,349311
+  DEFVAR_LISP ("help-char",\111466,349434
+  DEFVAR_LISP ("help-event-list",\111472,349717
+  DEFVAR_LISP ("help-form",\111477,349928
+  DEFVAR_LISP ("prefix-help-command",\111483,350176
+  DEFVAR_LISP ("top-level",\111489,350454
+  DEFVAR_KBOARD ("keyboard-translate-table",\111495,350675
+  DEFVAR_BOOL ("cannot-suspend",\111511,351488
+  DEFVAR_BOOL ("menu-prompting",\111516,351715
+  DEFVAR_LISP ("menu-prompt-more-char",\111526,352145
+  DEFVAR_INT ("extra-keyboard-modifiers",\111531,352391
+  DEFVAR_LISP ("deactivate-mark",\111545,353117
+  DEFVAR_LISP ("pre-command-hook",\111553,353486
+  DEFVAR_LISP ("post-command-hook",\111560,353841
+  DEFVAR_LISP ("echo-area-clear-hook",\111568,354204
+  DEFVAR_LISP ("lucid-menu-bar-dirty-flag",\111574,354419
+  DEFVAR_LISP ("menu-bar-final-items",\111578,354622
+  DEFVAR_LISP ("tool-bar-separator-image-expression",\111583,354872
+  DEFVAR_KBOARD ("overriding-terminal-local-map",\111589,355230
+  DEFVAR_LISP ("overriding-local-map",\111598,355652
+  DEFVAR_LISP ("overriding-local-map-menu-flag",\111607,356103
+  DEFVAR_LISP ("special-event-map",\111613,356442
+  DEFVAR_LISP ("track-mouse",\111617,356630
+  DEFVAR_KBOARD ("system-key-alist",\111620,356757
+  DEFVAR_KBOARD ("local-function-key-map",\111629,357138
+  DEFVAR_KBOARD ("input-decode-map",\111658,358597
+  DEFVAR_LISP ("function-key-map",\111675,359385
+  DEFVAR_LISP ("key-translation-map",\111683,359801
+  DEFVAR_LISP ("deferred-action-list",\111689,360145
+  DEFVAR_LISP ("deferred-action-function",\111694,360393
+  DEFVAR_LISP ("delayed-warnings-list",\111700,360692
+  DEFVAR_LISP ("timer-list",\111708,361100
+  DEFVAR_LISP ("timer-idle-list",\111712,361252
+  DEFVAR_LISP ("input-method-function",\111716,361415
+  DEFVAR_LISP ("input-method-previous-message",\111737,362384
+  DEFVAR_LISP ("show-help-function",\111744,362745
+  DEFVAR_LISP ("disable-point-adjustment",\111749,362977
+  DEFVAR_LISP ("global-disable-point-adjustment",\111761,363527
+  DEFVAR_LISP ("minibuffer-message-timeout",\111770,363893
+  DEFVAR_LISP ("throw-on-input",\111775,364171
+  DEFVAR_LISP ("command-error-function",\111781,364422
+  DEFVAR_LISP ("enable-disabled-menus-and-buttons",\111790,364909
+  DEFVAR_LISP ("select-active-regions",\111798,365236
+  DEFVAR_LISP ("saved-region-selection",\111807,365628
+  DEFVAR_LISP ("selection-inhibit-update-commands",\111815,366013
+  DEFVAR_LISP ("debug-on-event",\111825,366554
+
+c-src/emacs/src/lisp.h,39173
+#define EMACS_LISP_H22,800
+#define DECLARE_GDB_SYM(47,1421
+# define DEFINE_GDB_SYMBOL_BEGIN(49,1508
+# define DEFINE_GDB_SYMBOL_END(50,1578
+# define DEFINE_GDB_SYMBOL_BEGIN(52,1625
+# define DEFINE_GDB_SYMBOL_END(53,1702
+#undef min57,1790
+#undef max58,1801
+#define max(59,1812
+#define min(60,1854
+#define ARRAYELTS(63,1936
+#define GCTYPEBITS 67,2079
+DEFINE_GDB_SYMBOL_BEGIN GCTYPEBITS66,2037
+# define NONPOINTER_BITS 78,2567
+# define NONPOINTER_BITS 80,2600
+typedef int EMACS_INT;91,3023
+typedef unsigned int EMACS_UINT;92,3046
+#  define EMACS_INT_MAX 93,3079
+#  define pI 94,3111
+typedef long int EMACS_INT;96,3203
+typedef unsigned long EMACS_UINT;97,3231
+#  define EMACS_INT_MAX 98,3265
+#  define pI 99,3298
+typedef long long int EMACS_INT;103,3477
+typedef unsigned long long int EMACS_UINT;104,3510
+#  define EMACS_INT_MAX 105,3553
+#  define pI 106,3587
+enum {  BOOL_VECTOR_BITS_PER_CHAR 114,3804
+#define BOOL_VECTOR_BITS_PER_CHAR 115,3840
+typedef size_t bits_word;123,4165
+# define BITS_WORD_MAX 124,4191
+enum { BITS_PER_BITS_WORD 125,4223
+typedef unsigned char bits_word;127,4290
+# define BITS_WORD_MAX 128,4323
+enum { BITS_PER_BITS_WORD 129,4386
+verify 131,4450
+    BITS_PER_CHAR 136,4570
+    BITS_PER_SHORT 137,4605
+    BITS_PER_LONG 138,4657
+    BITS_PER_EMACS_INT 139,4712
+typedef intmax_t printmax_t;148,5089
+typedef uintmax_t uprintmax_t;149,5118
+# define pMd 150,5149
+# define pMu 151,5170
+typedef EMACS_INT printmax_t;153,5197
+typedef EMACS_UINT uprintmax_t;154,5227
+# define pMd 155,5259
+# define pMu 156,5278
+# define pD 165,5664
+# define pD 167,5709
+# define pD 169,5756
+# define pD 171,5779
+# define eassert(200,7062
+# define eassume(201,7140
+extern _Noreturn void die 204,7206
+extern bool suppress_checking EXTERNALLY_VISIBLE;206,7268
+# define eassert(208,7319
+# define eassume(212,7450
+enum Lisp_Bits239,8519
+#define GCALIGNMENT 243,8647
+    VALBITS 246,8742
+    INTTYPEBITS 249,8838
+    FIXNUM_BITS 252,8945
+#define VAL_MAX 263,9327
+#define USE_LSB_TAG 271,9777
+DEFINE_GDB_SYMBOL_BEGIN USE_LSB_TAG270,9733
+# define alignas(281,10077
+# define GCALIGNED 288,10227
+# define GCALIGNED 290,10292
+# define lisp_h_XLI(327,11642
+# define lisp_h_XIL(328,11673
+# define lisp_h_XLI(330,11724
+# define lisp_h_XIL(331,11751
+#define lisp_h_CHECK_LIST_CONS(333,11785
+#define lisp_h_CHECK_NUMBER(334,11856
+#define lisp_h_CHECK_SYMBOL(335,11927
+#define lisp_h_CHECK_TYPE(336,11996
+#define lisp_h_CONSP(338,12107
+#define lisp_h_EQ(339,12156
+#define lisp_h_FLOATP(340,12201
+#define lisp_h_INTEGERP(341,12252
+#define lisp_h_MARKERP(342,12333
+#define lisp_h_MISCP(343,12408
+#define lisp_h_NILP(344,12457
+#define lisp_h_SET_SYMBOL_VAL(345,12493
+#define lisp_h_SYMBOL_CONSTANT_P(347,12607
+#define lisp_h_SYMBOL_VAL(348,12671
+#define lisp_h_SYMBOLP(350,12772
+#define lisp_h_VECTORLIKEP(351,12825
+#define lisp_h_XCAR(352,12886
+#define lisp_h_XCDR(353,12924
+#define lisp_h_XCONS(354,12964
+#define lisp_h_XHASH(356,13059
+#define lisp_h_XPNTR(357,13093
+# define lisp_h_check_cons_list(360,13221
+# define lisp_h_make_number(363,13289
+# define lisp_h_XFASTINT(365,13392
+# define lisp_h_XINT(366,13429
+# define lisp_h_XSYMBOL(367,13478
+# define lisp_h_XTYPE(371,13631
+# define lisp_h_XUNTAG(372,13696
+# define XLI(381,14086
+# define XIL(382,14117
+# define CHECK_LIST_CONS(383,14148
+# define CHECK_NUMBER(384,14209
+# define CHECK_SYMBOL(385,14258
+# define CHECK_TYPE(386,14307
+# define CONSP(387,14382
+# define EQ(388,14417
+# define FLOATP(389,14452
+# define INTEGERP(390,14489
+# define MARKERP(391,14530
+# define MISCP(392,14569
+# define NILP(393,14604
+# define SET_SYMBOL_VAL(394,14637
+# define SYMBOL_CONSTANT_P(395,14700
+# define SYMBOL_VAL(396,14763
+# define SYMBOLP(397,14812
+# define VECTORLIKEP(398,14851
+# define XCAR(399,14898
+# define XCDR(400,14931
+# define XCONS(401,14964
+# define XHASH(402,14999
+# define XPNTR(403,15034
+#  define check_cons_list(405,15097
+#  define make_number(408,15176
+#  define XFASTINT(409,15224
+#  define XINT(410,15266
+#  define XSYMBOL(411,15300
+#  define XTYPE(412,15340
+#  define XUNTAG(413,15376
+#define LISP_MACRO_DEFUN(421,15672
+#define LISP_MACRO_DEFUN_VOID(425,15845
+#define INTMASK 437,16289
+#define case_Lisp_Int 438,16342
+#define ENUM_BF(445,16681
+#define ENUM_BF(447,16722
+enum Lisp_Type451,16763
+    Lisp_Symbol 454,16851
+    Lisp_Misc 458,16993
+    Lisp_Int0 461,17067
+    Lisp_Int1 462,17086
+    Lisp_String 466,17264
+    Lisp_Vectorlike 472,17543
+    Lisp_Cons 475,17632
+    Lisp_Float 477,17670
+enum Lisp_Misc_Type485,18016
+    Lisp_Misc_Free 487,18040
+    Lisp_Misc_Marker,488,18069
+    Lisp_Misc_Overlay,489,18091
+    Lisp_Misc_Save_Value,490,18114
+    Lisp_Misc_Finalizer,491,18140
+    Lisp_Misc_Float,494,18275
+    Lisp_Misc_Limit496,18359
+enum Lisp_Fwd_Type502,18543
+    Lisp_Fwd_Int,504,18566
+    Lisp_Fwd_Bool,505,18619
+    Lisp_Fwd_Obj,506,18670
+    Lisp_Fwd_Buffer_Obj,507,18729
+    Lisp_Fwd_Kboard_Obj        508,18800
+typedef struct { EMACS_INT i;567,21781
+typedef struct { EMACS_INT i; } Lisp_Object;567,21781
+#define LISP_INITIALLY(569,21827
+#undef CHECK_LISP_OBJECT_TYPE571,21858
+enum CHECK_LISP_OBJECT_TYPE 572,21888
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE 572,21888
+typedef EMACS_INT Lisp_Object;577,22064
+#define LISP_INITIALLY(578,22095
+enum CHECK_LISP_OBJECT_TYPE 579,22125
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE 579,22125
+#define LISP_INITIALLY_ZERO 582,22226
+INLINE bool BOOL_VECTOR_P 588,22350
+INLINE bool BUFFER_OBJFWDP 589,22391
+INLINE bool BUFFERP 590,22438
+INLINE bool CHAR_TABLE_P 591,22473
+INLINE Lisp_Object CHAR_TABLE_REF_ASCII 592,22513
+INLINE bool 593,22579
+INLINE bool 594,22614
+INLINE bool functionp 595,22650
+INLINE bool 596,22687
+INLINE bool 597,22725
+INLINE bool 598,22762
+INLINE bool 599,22797
+INLINE bool OVERLAYP 600,22831
+INLINE bool PROCESSP 601,22867
+INLINE bool PSEUDOVECTORP 602,22903
+INLINE bool SAVE_VALUEP 603,22949
+INLINE bool FINALIZERP 604,22988
+INLINE void set_sub_char_table_contents 605,23026
+INLINE bool STRINGP 607,23116
+INLINE bool SUB_CHAR_TABLE_P 608,23151
+INLINE bool SUBRP 609,23195
+INLINE bool 610,23228
+INLINE bool 611,23265
+INLINE bool WINDOWP 612,23306
+INLINE bool TERMINALP 613,23341
+INLINE struct Lisp_Save_Value *XSAVE_VALUE XSAVE_VALUE614,23378
+INLINE struct Lisp_Finalizer *XFINALIZER XFINALIZER615,23436
+INLINE struct Lisp_Symbol *(XSYMBOL)616,23492
+INLINE void 617,23544
+extern Lisp_Object char_table_ref 620,23616
+extern void char_table_set 621,23670
+extern _Noreturn Lisp_Object wrong_type_argument 624,23757
+extern _Noreturn void wrong_choice 625,23834
+extern bool might_dump;628,23925
+extern bool initialized;631,24061
+extern double extract_float 634,24117
+enum symbol_interned639,24199
+  SYMBOL_UNINTERNED 641,24222
+  SYMBOL_INTERNED 642,24247
+  SYMBOL_INTERNED_IN_INITIAL_OBARRAY 643,24270
+enum symbol_redirect646,24315
+  SYMBOL_PLAINVAL 648,24338
+  SYMBOL_VARALIAS 649,24362
+  SYMBOL_LOCALIZED 650,24386
+  SYMBOL_FORWARDED 651,24410
+struct Lisp_Symbol654,24437
+  bool_bf gcmarkbit 656,24458
+  ENUM_BF 663,24793
+    Lisp_Object value;687,25631
+    struct Lisp_Symbol *alias;alias688,25654
+    struct Lisp_Buffer_Local_Value *blv;blv689,25685
+    union Lisp_Fwd *fwd;fwd690,25726
+  } val;691,25751
+  Lisp_Object function;694,25823
+  Lisp_Object plist;697,25885
+  struct Lisp_Symbol *next;next700,25974
+#define EXFUN(707,26252
+#define DEFUN_ARGS_MANY        712,26446
+#define DEFUN_ARGS_UNEVALLED   713,26498
+#define DEFUN_ARGS_0   714,26541
+#define DEFUN_ARGS_1   715,26569
+#define DEFUN_ARGS_2   716,26604
+#define DEFUN_ARGS_3   717,26652
+#define DEFUN_ARGS_4   718,26713
+#define DEFUN_ARGS_5   719,26787
+#define DEFUN_ARGS_6   721,26880
+#define DEFUN_ARGS_7   723,26986
+#define DEFUN_ARGS_8   725,27105
+#define TAG_PTR(729,27296
+#define TAG_SYMOFFSET(734,27543
+#define XLI_BUILTIN_LISPSYM(741,27842
+#define DEFINE_LISP_SYMBOL(746,28101
+# define DEFINE_NON_NIL_Q_SYMBOL_MACROS 755,28572
+LISP_MACRO_DEFUN 762,28777
+# define ARRAY_MARK_FLAG 768,29024
+# define PSEUDOVECTOR_FLAG 774,29267
+enum pvec_type780,29568
+  PVEC_NORMAL_VECTOR,782,29585
+  PVEC_FREE,783,29607
+  PVEC_PROCESS,784,29620
+  PVEC_FRAME,785,29636
+  PVEC_WINDOW,786,29650
+  PVEC_BOOL_VECTOR,787,29665
+  PVEC_BUFFER,788,29685
+  PVEC_HASH_TABLE,789,29700
+  PVEC_TERMINAL,790,29719
+  PVEC_WINDOW_CONFIGURATION,791,29736
+  PVEC_SUBR,792,29765
+  PVEC_OTHER,793,29778
+  PVEC_COMPILED,795,29856
+  PVEC_CHAR_TABLE,796,29873
+  PVEC_SUB_CHAR_TABLE,797,29892
+  PVEC_FONT 798,29915
+enum More_Lisp_Bits801,29991
+    PSEUDOVECTOR_SIZE_BITS 808,30382
+    PSEUDOVECTOR_SIZE_MASK 809,30415
+    PSEUDOVECTOR_REST_BITS 813,30625
+    PSEUDOVECTOR_REST_MASK 814,30658
+    PSEUDOVECTOR_AREA_BITS 818,30823
+    PVEC_TYPE_MASK 819,30901
+# define VALMASK 829,31302
+DEFINE_GDB_SYMBOL_BEGIN VALMASK828,31257
+#define MOST_POSITIVE_FIXNUM 834,31532
+#define MOST_NEGATIVE_FIXNUM 835,31592
+XINT 874,32684
+XFASTINT 889,33035
+XSYMBOL 899,33263
+XTYPE 910,33481
+XUNTAG 918,33661
+LISP_MACRO_DEFUN 927,33857
+LISP_MACRO_DEFUN 940,34242
+#define FIXNUM_OVERFLOW_P(958,34855
+LISP_MACRO_DEFUN FIXNUM_OVERFLOW_P952,34632
+LISP_MACRO_DEFUN 970,35171
+XSTRING 980,35391
+#define SYMBOL_INDEX(988,35575
+XFLOAT 991,35636
+XPROCESS 1000,35778
+XWINDOW 1007,35895
+XTERMINAL 1014,36012
+XSUBR 1021,36134
+XBUFFER 1028,36245
+XCHAR_TABLE 1035,36369
+XSUB_CHAR_TABLE 1042,36506
+XBOOL_VECTOR 1049,36648
+make_lisp_ptr 1058,36827
+make_lisp_symbol 1066,37013
+builtin_lisp_symbol 1074,37197
+#define XSETINT(1079,37279
+#define XSETFASTINT(1080,37325
+#define XSETCONS(1081,37375
+#define XSETVECTOR(1082,37435
+#define XSETSTRING(1083,37503
+#define XSETSYMBOL(1084,37567
+#define XSETFLOAT(1085,37621
+#define XSETMISC(1086,37683
+#define XSETPVECTYPE(1090,37772
+#define XSETPVECTYPESIZE(1092,37888
+#define XSETPSEUDOVECTOR(1099,38185
+#define XSETTYPED_PSEUDOVECTOR(1105,38369
+#define XSETWINDOW_CONFIGURATION(1110,38579
+#define XSETPROCESS(1112,38675
+#define XSETWINDOW(1113,38741
+#define XSETTERMINAL(1114,38805
+#define XSETSUBR(1115,38873
+#define XSETCOMPILED(1116,38933
+#define XSETBUFFER(1117,39001
+#define XSETCHAR_TABLE(1118,39065
+#define XSETBOOL_VECTOR(1119,39137
+#define XSETSUB_CHAR_TABLE(1120,39211
+XINTPTR 1128,39581
+make_pointer_integer 1134,39661
+LISP_MACRO_DEFUN_VOID 1143,39826
+typedef struct interval *INTERVAL;INTERVAL1149,39987
+      Lisp_Object cdr;1159,40162
+      struct Lisp_Cons *chain;chain1162,40236
+xcar_addr 1174,40760
+xcdr_addr 1179,40837
+LISP_MACRO_DEFUN 1185,40931
+XSETCDR 1198,41307
+CAR 1205,41457
+CDR 1212,41591
+CAR_SAFE 1221,41791
+CDR_SAFE 1226,41877
+STRING_MULTIBYTE 1243,42250
+#define STRING_BYTES_BOUND 1261,43057
+#define STRING_SET_UNIBYTE(1265,43201
+#define STRING_SET_MULTIBYTE(1275,43516
+SDATA 1286,43830
+SSDATA 1291,43908
+SREF 1297,44037
+SSET 1302,44128
+SCHARS 1307,44242
+extern ptrdiff_t string_bytes 1313,44337
+STRING_BYTES 1316,44415
+SBYTES 1326,44595
+STRING_SET_CHARS 1331,44681
+struct vectorlike_header1343,45232
+    ptrdiff_t size;1364,46383
+struct Lisp_Vector1369,46482
+    struct vectorlike_header header;1371,46505
+    Lisp_Object contents[contents1372,46542
+    ALIGNOF_STRUCT_LISP_VECTOR1378,46681
+struct Lisp_Bool_Vector1384,46864
+    struct vectorlike_header header;1388,47012
+    EMACS_INT size;1390,47086
+    bits_word data[data1395,47319
+bool_vector_size 1399,47385
+bool_vector_data 1407,47523
+bool_vector_uchar_data 1413,47617
+bool_vector_words 1421,47803
+bool_vector_bytes 1428,47998
+bool_vector_bitref 1437,48238
+bool_vector_ref 1445,48478
+bool_vector_set 1453,48618
+    header_size 1471,49047
+    bool_header_size 1472,49106
+    word_size 1473,49171
+AREF 1479,49284
+aref_addr 1485,49391
+ASIZE 1491,49501
+ASET 1497,49583
+gc_aset 1504,49742
+enum { NIL_IS_ZERO 1515,50269
+memclear 1520,50464
+#define VECSIZE(1531,50762
+#define PSEUDOVECSIZE(1538,51047
+#define UNSIGNED_CMP(1546,51480
+#define ASCII_CHAR_P(1552,51734
+enum CHARTAB_SIZE_BITS1565,52489
+    CHARTAB_SIZE_BITS_0 1567,52516
+    CHARTAB_SIZE_BITS_1 1568,52545
+    CHARTAB_SIZE_BITS_2 1569,52574
+    CHARTAB_SIZE_BITS_3 1570,52603
+extern const int chartab_size[chartab_size1573,52637
+struct Lisp_Char_Table1575,52672
+    struct vectorlike_header header;1581,52928
+    Lisp_Object defalt;1585,53078
+    Lisp_Object parent;1590,53280
+    Lisp_Object purpose;1594,53398
+    Lisp_Object ascii;1598,53564
+    Lisp_Object contents[contents1600,53588
+    Lisp_Object extras[extras1603,53699
+struct Lisp_Sub_Char_Table1606,53752
+    struct vectorlike_header header;1610,53918
+    int depth;1618,54341
+    int min_char;1621,54417
+    Lisp_Object contents[contents1624,54492
+CHAR_TABLE_REF_ASCII 1628,54566
+CHAR_TABLE_REF 1648,55113
+CHAR_TABLE_SET 1658,55402
+struct Lisp_Subr1670,55786
+    struct vectorlike_header header;1672,55807
+      Lisp_Object (*a0)a01674,55856
+      Lisp_Object (*a1)a11675,55888
+      Lisp_Object (*a2)a21676,55927
+      Lisp_Object (*a3)a31677,55979
+      Lisp_Object (*a4)a41678,56044
+      Lisp_Object (*a5)a51679,56122
+      Lisp_Object (*a6)a61680,56213
+      Lisp_Object (*a7)a71681,56317
+      Lisp_Object (*a8)a81682,56434
+      Lisp_Object (*aUNEVALLED)aUNEVALLED1683,56564
+      Lisp_Object (*aMANY)aMANY1684,56616
+    } function;1685,56671
+    short min_args,1686,56687
+    short min_args, max_args;1686,56687
+    const char *symbol_name;symbol_name1687,56717
+    const char *intspec;intspec1688,56746
+    const char *doc;doc1689,56771
+enum char_table_specials1692,56798
+    CHAR_TABLE_STANDARD_SLOTS 1697,56993
+    SUB_CHAR_TABLE_OFFSET 1701,57214
+CHAR_TABLE_EXTRA_SLOTS 1707,57377
+verify 1714,57596
+LISP_MACRO_DEFUN 1723,57921
+SYMBOL_BLV 1732,58181
+SYMBOL_FWD 1738,58316
+LISP_MACRO_DEFUN_VOID 1744,58428
+SET_SYMBOL_BLV 1754,58691
+SET_SYMBOL_FWD 1760,58850
+SYMBOL_NAME 1767,59001
+SYMBOL_INTERNED_P 1775,59130
+SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P 1783,59299
+#define DEFSYM(1796,59809
+LISP_MACRO_DEFUN DEFSYM1792,59630
+struct hash_table_test1805,60062
+  Lisp_Object name;1808,60139
+  Lisp_Object user_hash_function;1811,60206
+  Lisp_Object user_cmp_function;1814,60297
+  bool (*cmpfn)cmpfn1817,60372
+  EMACS_UINT (*hashfn)hashfn1820,60486
+struct Lisp_Hash_Table1823,60555
+  struct vectorlike_header header;1826,60649
+  Lisp_Object weak;1830,60783
+  Lisp_Object rehash_size;1835,61007
+  Lisp_Object rehash_threshold;1839,61129
+  Lisp_Object hash;1843,61260
+  Lisp_Object next;1848,61490
+  Lisp_Object next_free;1851,61560
+  Lisp_Object index;1856,61771
+  ptrdiff_t count;1863,62041
+  Lisp_Object key_and_value;1868,62240
+  struct hash_table_test test;1871,62314
+  struct Lisp_Hash_Table *next_weak;next_weak1875,62457
+XHASH_TABLE 1880,62531
+#define XSET_HASH_TABLE(1885,62602
+HASH_TABLE_P 1889,62703
+HASH_KEY 1896,62860
+HASH_VALUE 1903,63040
+HASH_NEXT 1911,63254
+HASH_HASH 1918,63431
+HASH_INDEX 1926,63677
+HASH_TABLE_SIZE 1933,63826
+enum DEFAULT_HASH_SIZE 1940,63956
+enum DEFAULT_HASH_SIZE { DEFAULT_HASH_SIZE 1940,63956
+static double const DEFAULT_REHASH_THRESHOLD 1946,64176
+static double const DEFAULT_REHASH_SIZE 1950,64299
+sxhash_combine 1956,64465
+SXHASH_REDUCE 1964,64648
+struct Lisp_Misc_Any   1971,64806
+  ENUM_BF 1973,64866
+struct Lisp_Marker1978,64980
+  ENUM_BF 1980,65001
+struct Lisp_Overlay2021,66838
+    ENUM_BF 2034,67346
+    SAVE_UNUSED,2047,67641
+    SAVE_INTEGER,2048,67658
+    SAVE_FUNCPOINTER,2049,67676
+    SAVE_POINTER,2050,67698
+    SAVE_OBJECT2051,67716
+enum { SAVE_SLOT_BITS 2055,67801
+enum { SAVE_VALUE_SLOTS 2058,67898
+enum { SAVE_TYPE_BITS 2062,68006
+enum Lisp_Save_Type2064,68072
+    SAVE_TYPE_INT_INT 2066,68096
+    SAVE_TYPE_INT_INT_INT2067,68169
+    SAVE_TYPE_OBJ_OBJ 2069,68259
+    SAVE_TYPE_OBJ_OBJ_OBJ 2070,68330
+    SAVE_TYPE_OBJ_OBJ_OBJ_OBJ2071,68411
+    SAVE_TYPE_PTR_INT 2073,68506
+    SAVE_TYPE_PTR_OBJ 2074,68579
+    SAVE_TYPE_PTR_PTR 2075,68651
+    SAVE_TYPE_FUNCPTR_PTR_OBJ2076,68724
+    SAVE_TYPE_MEMORY 2080,68882
+typedef void (*voidfuncptr)voidfuncptr2108,69836
+struct Lisp_Save_Value2110,69873
+    ENUM_BF 2112,69900
+      void *pointer;pointer2125,70555
+      voidfuncptr funcpointer;2126,70576
+      ptrdiff_t integer;2127,70607
+      Lisp_Object object;2128,70632
+    } data[data2129,70658
+save_type 2134,70752
+XSAVE_POINTER 2143,70982
+set_save_pointer 2149,71144
+XSAVE_FUNCPOINTER 2155,71326
+XSAVE_INTEGER 2164,71546
+set_save_integer 2170,71708
+XSAVE_OBJECT 2179,71929
+struct Lisp_Finalizer2186,72106
+    struct Lisp_Misc_Any base;2188,72132
+    struct Lisp_Finalizer *prev;prev2191,72220
+    struct Lisp_Finalizer *next;next2192,72253
+    Lisp_Object function;2197,72490
+struct Lisp_Free2201,72581
+    ENUM_BF 2203,72602
+union Lisp_Misc2212,72882
+    struct Lisp_Misc_Any u_any;2214,72902
+    struct Lisp_Free u_free;2215,72973
+    struct Lisp_Marker u_marker;2216,73002
+    struct Lisp_Overlay u_overlay;2217,73035
+    struct Lisp_Save_Value u_save_value;2218,73070
+    struct Lisp_Finalizer u_finalizer;2219,73111
+XMISC 2223,73181
+XMISCANY 2229,73270
+XMISCTYPE 2236,73379
+XMARKER 2242,73467
+XOVERLAY 2249,73582
+XSAVE_VALUE 2256,73703
+XFINALIZER 2263,73832
+struct Lisp_Intfwd2274,74117
+    enum Lisp_Fwd_Type type;2276,74140
+    EMACS_INT *intvar;intvar2277,74190
+struct Lisp_Boolfwd2284,74411
+    enum Lisp_Fwd_Type type;2286,74435
+    bool *boolvar;boolvar2287,74486
+struct Lisp_Objfwd2294,74702
+    enum Lisp_Fwd_Type type;2296,74725
+    Lisp_Object *objvar;objvar2297,74775
+struct Lisp_Buffer_Objfwd2302,74934
+    enum Lisp_Fwd_Type type;2304,74964
+    int offset;2305,75021
+    Lisp_Object predicate;2307,75113
+struct Lisp_Buffer_Local_Value2334,76470
+    bool_bf local_if_set 2338,76615
+    bool_bf frame_local 2341,76797
+    bool_bf found 2344,76939
+    union Lisp_Fwd *fwd;fwd2346,77041
+    Lisp_Object where;2348,77184
+    Lisp_Object defcell;2351,77310
+    Lisp_Object valcell;2357,77614
+struct Lisp_Kboard_Objfwd2362,77729
+    enum Lisp_Fwd_Type type;2364,77759
+    int offset;2365,77816
+union Lisp_Fwd2368,77838
+    struct Lisp_Intfwd u_intfwd;2370,77857
+    struct Lisp_Boolfwd u_boolfwd;2371,77890
+    struct Lisp_Objfwd u_objfwd;2372,77925
+    struct Lisp_Buffer_Objfwd u_buffer_objfwd;2373,77958
+    struct Lisp_Kboard_Objfwd u_kboard_objfwd;2374,78005
+XFWDTYPE 2378,78084
+XBUFFER_OBJFWD 2384,78180
+struct Lisp_Float2391,78316
+      double data;2395,78354
+      struct Lisp_Float *chain;chain2396,78373
+    } u;2397,78405
+XFLOAT_DATA 2401,78434
+    IEEE_FLOATING_POINT2415,78943
+#define _UCHAR_T2423,79266
+typedef unsigned char UCHAR;2424,79283
+enum Lisp_Compiled2429,79366
+    COMPILED_ARGLIST 2431,79389
+    COMPILED_BYTECODE 2432,79415
+    COMPILED_CONSTANTS 2433,79442
+    COMPILED_STACK_DEPTH 2434,79470
+    COMPILED_DOC_STRING 2435,79500
+    COMPILED_INTERACTIVE 2436,79529
+enum char_bits2443,79831
+    CHAR_ALT 2445,79850
+    CHAR_SUPER 2446,79876
+    CHAR_HYPER 2447,79904
+    CHAR_SHIFT 2448,79932
+    CHAR_CTL 2449,79960
+    CHAR_META 2450,79986
+    CHAR_MODIFIER_MASK 2452,80014
+    CHARACTERBITS 2457,80209
+LISP_MACRO_DEFUN 2462,80267
+NATNUMP 2470,80409
+RANGED_INTEGERP 2476,80490
+#define TYPE_RANGED_INTEGERP(2481,80612
+LISP_MACRO_DEFUN 2486,80797
+VECTORP 2500,81270
+OVERLAYP 2505,81373
+SAVE_VALUEP 2510,81472
+FINALIZERP 2516,81578
+AUTOLOADP 2522,81682
+BUFFER_OBJFWDP 2528,81773
+PSEUDOVECTOR_TYPEP 2534,81871
+PSEUDOVECTORP 2542,82124
+WINDOW_CONFIGURATIONP 2558,82476
+PROCESSP 2564,82586
+WINDOWP 2570,82670
+TERMINALP 2576,82752
+SUBRP 2582,82838
+COMPILEDP 2588,82916
+BUFFERP 2594,83002
+CHAR_TABLE_P 2600,83084
+SUB_CHAR_TABLE_P 2606,83175
+BOOL_VECTOR_P 2612,83274
+FRAMEP 2618,83367
+IMAGEP 2625,83484
+ARRAYP 2632,83589
+CHECK_LIST 2638,83708
+LISP_MACRO_DEFUN_VOID 2643,83789
+CHECK_STRING_CAR 2653,84086
+CHECK_CONS 2658,84190
+CHECK_VECTOR 2663,84270
+CHECK_BOOL_VECTOR 2668,84356
+CHECK_VECTOR_OR_STRING 2674,84533
+CHECK_ARRAY 2683,84707
+CHECK_BUFFER 2688,84815
+CHECK_WINDOW 2693,84901
+CHECK_PROCESS 2699,85007
+CHECK_NATNUM 2705,85103
+#define CHECK_RANGED_INTEGER(2710,85180
+#define CHECK_TYPE_RANGED_INTEGER(2721,85563
+#define CHECK_NUMBER_COERCE_MARKER(2729,85833
+XFLOATINT 2738,86086
+CHECK_NUMBER_OR_FLOAT 2744,86157
+#define CHECK_NUMBER_OR_FLOAT_COERCE_MARKER(2749,86256
+CHECK_NUMBER_CAR 2760,86666
+CHECK_NUMBER_CDR 2768,86788
+#define DEFUN(2803,88383
+#define DEFUN(2812,88851
+FUNCTIONP 2822,89206
+extern void defsubr 2829,89358
+enum maxargs2831,89401
+    MANY 2833,89418
+    UNEVALLED 2834,89433
+#define CALLMANY(2838,89536
+#define CALLN(2844,89889
+extern void defvar_lisp 2846,89959
+extern void defvar_lisp_nopro 2847,90036
+extern void defvar_bool 2848,90119
+extern void defvar_int 2849,90190
+extern void defvar_kboard 2850,90264
+#define DEFVAR_LISP(2869,91094
+#define DEFVAR_LISP_NOPRO(2874,91266
+#define DEFVAR_BOOL(2879,91448
+#define DEFVAR_INT(2884,91621
+#define DEFVAR_BUFFER_DEFAULTS(2890,91792
+#define DEFVAR_KBOARD(2896,91996
+typedef jmp_buf sys_jmp_buf;2906,92320
+# define sys_setjmp(2907,92349
+# define sys_longjmp(2908,92384
+typedef sigjmp_buf sys_jmp_buf;2910,92456
+# define sys_setjmp(2911,92488
+# define sys_longjmp(2912,92528
+typedef jmp_buf sys_jmp_buf;2916,92687
+# define sys_setjmp(2917,92716
+# define sys_longjmp(2918,92750
+enum specbind_tag 2943,93802
+  SPECPDL_UNWIND,2944,93822
+  SPECPDL_UNWIND_PTR,2945,93891
+  SPECPDL_UNWIND_INT,2946,93942
+  SPECPDL_UNWIND_VOID,2947,93990
+  SPECPDL_BACKTRACE,2948,94044
+  SPECPDL_LET,2949,94102
+  SPECPDL_LET_LOCAL,2951,94232
+  SPECPDL_LET_DEFAULT  2952,94289
+union specbinding2955,94361
+    ENUM_BF 2957,94383
+      ENUM_BF 2959,94440
+      ENUM_BF 2964,94570
+      ENUM_BF 2969,94693
+      ENUM_BF 2974,94811
+      ENUM_BF 2978,94916
+      ENUM_BF 2983,95091
+enum handlertype 3021,96407
+enum handlertype { CATCHER,3021,96407
+enum handlertype { CATCHER, CONDITION_CASE 3021,96407
+struct handler3023,96454
+  enum handlertype type;3025,96471
+  Lisp_Object tag_or_ch;3026,96496
+  Lisp_Object val;3027,96521
+  struct handler *next;next3028,96540
+  struct handler *nextfree;nextfree3029,96564
+  Lisp_Object *bytecode_top;bytecode_top3036,96922
+  int bytecode_dest;3037,96951
+  struct gcpro *gcpro;gcpro3042,97188
+  sys_jmp_buf jmp;3044,97218
+  EMACS_INT lisp_eval_depth;3045,97237
+  ptrdiff_t pdlcount;3046,97266
+  int poll_suppress_count;3047,97288
+  int interrupt_input_blocked;3048,97315
+  struct byte_stack *byte_stack;byte_stack3049,97346
+#define PUSH_HANDLER(3053,97443
+extern Lisp_Object memory_signal_data;3075,98149
+extern char *stack_bottom;stack_bottom3079,98282
+extern void process_pending_signals 3097,99099
+extern bool volatile pending_signals;3098,99143
+extern void process_quit_flag 3100,99182
+#define QUIT   3101,99220
+#define QUITP 3112,99470
+extern Lisp_Object Vascii_downcase_table;3114,99531
+extern Lisp_Object Vascii_canon_table;3115,99573
+extern struct gcpro *gcprolist;gcprolist3130,100280
+struct gcpro3132,100313
+  struct gcpro *next;next3134,100328
+  volatile Lisp_Object *var;var3137,100397
+  ptrdiff_t nvars;3140,100479
+  const char *name;name3144,100564
+  int lineno;3147,100620
+  int idx;3150,100681
+  int level;3153,100717
+#define GC_USE_GCPROS_AS_BEFORE        3171,101294
+#define GC_MAKE_GCPROS_NOOPS   3172,101329
+#define GC_MARK_STACK_CHECK_GCPROS     3173,101361
+#define GC_USE_GCPROS_CHECK_ZOMBIES    3174,101398
+#define GC_MARK_STACK 3177,101459
+#define BYTE_MARK_STACK 3181,101559
+#define GCPRO1(3190,101830
+#define GCPRO2(3191,101870
+#define GCPRO3(3192,101936
+#define GCPRO4(3194,102031
+#define GCPRO5(3196,102151
+#define GCPRO6(3198,102296
+#define GCPRO7(3201,102471
+#define UNGCPRO 3202,102550
+#define GCPRO1(3208,102650
+#define GCPRO2(3212,102772
+#define GCPRO3(3217,102964
+#define GCPRO4(3223,103226
+#define GCPRO5(3230,103557
+#define GCPRO6(3238,103958
+#define GCPRO7(3247,104428
+#define UNGCPRO 3257,104968
+extern int gcpro_level;3261,105037
+#define GCPRO1(3263,105062
+#define GCPRO2(3269,105296
+#define GCPRO3(3278,105714
+#define GCPRO4(3289,106271
+#define GCPRO5(3302,106969
+#define GCPRO6(3317,107809
+#define GCPRO7(3334,108790
+#define UNGCPRO        3353,109913
+#define RETURN_UNGCPRO(3363,110180
+void staticpro 3375,110453
+vcopy 3384,110654
+set_hash_key_slot 3393,110929
+set_hash_value_slot 3399,111068
+set_symbol_function 3408,111303
+set_symbol_plist 3414,111418
+set_symbol_next 3420,111521
+blv_found 3428,111694
+set_overlay_plist 3437,111877
+string_intervals 3445,112028
+set_string_intervals 3453,112150
+set_char_table_defalt 3462,112352
+set_char_table_purpose 3467,112464
+set_char_table_extras 3475,112633
+set_char_table_contents 3482,112842
+set_sub_char_table_contents 3489,113037
+extern Lisp_Object indirect_function 3495,113196
+extern Lisp_Object find_symbol_value 3496,113248
+enum Arith_Comparison 3497,113300
+  ARITH_EQUAL,3498,113324
+  ARITH_NOTEQUAL,3499,113339
+  ARITH_LESS,3500,113357
+  ARITH_GRTR,3501,113371
+  ARITH_LESS_OR_EQUAL,3502,113385
+  ARITH_GRTR_OR_EQUAL3503,113408
+extern Lisp_Object arithcompare 3505,113433
+#define INTEGER_TO_CONS(3511,113759
+#define CONS_TO_INTEGER(3529,114622
+extern intmax_t cons_to_signed 3533,114837
+extern uintmax_t cons_to_unsigned 3534,114903
+extern struct Lisp_Symbol *indirect_variable indirect_variable3536,114964
+extern _Noreturn void args_out_of_range 3537,115033
+extern _Noreturn void args_out_of_range_3 3538,115101
+extern Lisp_Object do_symval_forwarding 3540,115192
+extern void set_internal 3541,115252
+extern void syms_of_data 3542,115324
+extern void swap_in_global_binding 3543,115357
+extern void syms_of_cmds 3546,115441
+extern void keys_of_cmds 3547,115474
+extern Lisp_Object detect_coding_system 3550,115536
+extern void init_coding 3552,115689
+extern void init_coding_once 3553,115721
+extern void syms_of_coding 3554,115758
+extern ptrdiff_t chars_in_text 3557,115825
+extern ptrdiff_t multibyte_chars_in_text 3558,115892
+extern void syms_of_character 3559,115969
+extern void init_charset 3562,116037
+extern void init_charset_once 3563,116070
+extern void syms_of_charset 3564,116108
+extern void init_syntax_once 3569,116228
+extern void syms_of_syntax 3570,116265
+enum { NEXT_ALMOST_PRIME_LIMIT 3573,116326
+extern EMACS_INT next_almost_prime 3574,116365
+enum constype 3739,123817
+enum constype {CONSTYPE_HEAP,CONSTYPE_HEAP3739,123817
+enum constype {CONSTYPE_HEAP, CONSTYPE_PURE}CONSTYPE_PURE3739,123817
+extern Lisp_Object listn 3740,123863
+list2i 3745,124007
+list3i 3751,124116
+list4i 3757,124255
+extern Lisp_Object make_uninit_bool_vector 3763,124407
+extern Lisp_Object bool_vector_fill 3764,124463
+extern _Noreturn void string_overflow 3765,124527
+extern Lisp_Object make_string 3766,124573
+extern Lisp_Object make_formatted_string 3767,124631
+extern Lisp_Object make_multibyte_string 3779,124985
+extern Lisp_Object make_event_array 3780,125064
+extern Lisp_Object make_uninit_string 3781,125128
+extern Lisp_Object make_uninit_multibyte_string 3782,125179
+extern Lisp_Object make_string_from_bytes 3783,125251
+extern Lisp_Object make_specified_string 3784,125331
+extern Lisp_Object make_pure_string 3786,125423
+extern Lisp_Object make_pure_c_string 3787,125503
+build_pure_c_string 3792,125659
+build_string 3801,125864
+extern Lisp_Object pure_cons 3806,125942
+extern void make_byte_code 3807,125999
+extern struct Lisp_Vector *allocate_vector allocate_vector3808,126050
+make_uninit_vector 3820,126435
+make_uninit_sub_char_table 3833,126654
+extern struct Lisp_Vector *allocate_pseudovector 
allocate_pseudovector3844,126963
+#define ALLOCATE_PSEUDOVECTOR(3850,127198
+#define ALLOCATE_ZEROED_PSEUDOVECTOR(3858,127534
+extern bool gc_in_progress;3863,127735
+extern bool abort_on_gc;3864,127763
+extern Lisp_Object make_float 3865,127788
+extern void display_malloc_warning 3866,127828
+extern ptrdiff_t inhibit_garbage_collection 3867,127871
+extern Lisp_Object make_save_int_int_int 3868,127923
+extern Lisp_Object make_save_obj_obj_obj_obj 3869,127999
+extern Lisp_Object make_save_ptr 3871,128109
+extern Lisp_Object make_save_ptr_int 3872,128152
+extern Lisp_Object make_save_ptr_ptr 3873,128210
+extern Lisp_Object make_save_funcptr_ptr_obj 3874,128265
+extern Lisp_Object make_save_memory 3876,128361
+extern void free_save_value 3877,128425
+extern Lisp_Object build_overlay 3878,128468
+extern void free_marker 3879,128542
+extern void free_cons 3880,128581
+extern void init_alloc_once 3881,128625
+extern void init_alloc 3882,128661
+extern void syms_of_alloc 3883,128692
+extern struct buffer * allocate_buffer 3884,128726
+extern int valid_lisp_object_p 3885,128773
+extern int relocatable_string_data_p 3886,128819
+extern void check_cons_list 3888,128898
+INLINE void 3890,128940
+extern void *r_alloc r_alloc3895,129061
+#define FLOAT_TO_STRING_BUFSIZE 3927,130524
+extern int openp 3957,131673
+extern Lisp_Object string_to_number 3959,131783
+extern void map_obarray 3960,131846
+extern void dir_warning 3962,131960
+extern void init_obarray 3963,132013
+extern void init_lread 3964,132046
+extern void syms_of_lread 3965,132077
+intern 3968,132131
+intern_c_string 3974,132219
+extern EMACS_INT lisp_eval_depth;3980,132332
+extern Lisp_Object Vautoload_queue;3981,132366
+extern Lisp_Object Vrun_hooks;3982,132402
+extern Lisp_Object Vsignaling_function;3983,132433
+extern Lisp_Object inhibit_lisp_code;3984,132473
+extern struct handler *handlerlist;handlerlist3985,132511
+extern void run_hook 3994,132753
+extern void run_hook_with_args_2 3995,132789
+extern Lisp_Object run_hook_with_args 3996,132863
+extern _Noreturn void xsignal 3999,133022
+extern _Noreturn void xsignal0 4000,133080
+extern _Noreturn void xsignal1 4001,133126
+extern _Noreturn void xsignal2 4002,133185
+extern _Noreturn void xsignal3 4003,133257
+extern _Noreturn void signal_error 4005,133346
+extern Lisp_Object eval_sub 4006,133410
+extern Lisp_Object apply1 4007,133458
+extern Lisp_Object call0 4008,133512
+extern Lisp_Object call1 4009,133552
+extern Lisp_Object call2 4010,133605
+extern Lisp_Object call3 4011,133671
+extern Lisp_Object call4 4012,133750
+extern Lisp_Object call5 4013,133842
+extern Lisp_Object call6 4014,133947
+extern Lisp_Object call7 4015,134065
+extern Lisp_Object internal_catch 4016,134196
+extern Lisp_Object internal_lisp_condition_case 4017,134289
+extern Lisp_Object internal_condition_case 4018,134378
+extern Lisp_Object internal_condition_case_1 4019,134491
+extern Lisp_Object internal_condition_case_2 4020,134626
+extern Lisp_Object internal_condition_case_n4021,134787
+extern void specbind 4024,134983
+extern void record_unwind_protect 4025,135032
+extern void record_unwind_protect_ptr 4026,135105
+extern void record_unwind_protect_int 4027,135172
+extern void record_unwind_protect_void 4028,135233
+extern void record_unwind_protect_nothing 4029,135291
+extern void clear_unwind_protect 4030,135341
+extern void set_unwind_protect 4031,135387
+extern void set_unwind_protect_ptr 4032,135468
+extern Lisp_Object unbind_to 4033,135543
+extern _Noreturn void error 4034,135598
+fast_string_match_ignore_case 4136,140086
+extern ptrdiff_t fast_c_string_match_ignore_case 4141,140236
+extern ptrdiff_t fast_looking_at 4143,140333
+extern ptrdiff_t find_newline 4145,140472
+extern ptrdiff_t scan_newline 4147,140601
+extern ptrdiff_t scan_newline_from_point 4149,140704
+extern ptrdiff_t find_newline_no_quit 4150,140784
+extern ptrdiff_t find_before_next_newline 4152,140881
+extern void syms_of_search 4154,140979
+extern void clear_regexp_cache 4155,141014
+extern Lisp_Object Vminibuffer_list;4159,141084
+extern Lisp_Object last_minibuf_string;4160,141121
+extern Lisp_Object get_minibuffer 4161,141161
+extern void init_minibuf_once 4162,141208
+extern void syms_of_minibuf 4163,141246
+extern void syms_of_callint 4167,141313
+extern void syms_of_casefiddle 4171,141383
+extern void keys_of_casefiddle 4172,141422
+extern void init_casetab_once 4176,141492
+extern void syms_of_casetab 4177,141530
+extern Lisp_Object echo_message_buffer;4181,141598
+extern struct kboard *echo_kboard;echo_kboard4182,141638
+extern void cancel_echoing 4183,141673
+extern Lisp_Object last_undo_boundary;4184,141708
+extern bool input_pending;4185,141747
+extern sigjmp_buf return_to_command_loop;4187,141810
+extern Lisp_Object menu_bar_items 4189,141859
+extern Lisp_Object tool_bar_items 4190,141908
+extern void discard_mouse_events 4191,141964
+void handle_input_available_signal 4193,142025
+extern Lisp_Object pending_funcalls;4195,142074
+extern bool detect_input_pending 4196,142111
+extern bool detect_input_pending_ignore_squeezables 4197,142152
+extern bool detect_input_pending_run_timers 4198,142212
+extern void safe_run_hooks 4199,142264
+extern void cmd_error_internal 4200,142306
+extern Lisp_Object command_loop_1 4201,142366
+extern Lisp_Object read_menu_command 4202,142408
+extern Lisp_Object recursive_edit_1 4203,142453
+extern void record_auto_save 4204,142497
+extern void force_auto_save_soon 4205,142534
+extern void init_keyboard 4206,142575
+extern void syms_of_keyboard 4207,142609
+extern void keys_of_keyboard 4208,142646
+extern ptrdiff_t current_column 4211,142712
+extern void invalidate_current_column 4212,142752
+extern bool indented_beyond_p 4213,142798
+extern void syms_of_indent 4214,142863
+extern void store_frame_param 4217,142926
+extern void store_in_alist 4218,143000
+extern Lisp_Object do_switch_frame 4219,143070
+extern Lisp_Object get_frame_param 4220,143143
+extern void frames_discard_buffer 4221,143209
+extern void syms_of_frame 4222,143258
+extern char **initial_argv;initial_argv4225,143320
+extern int initial_argc;4226,143348
+extern bool display_arg;4228,143423
+extern Lisp_Object decode_env_path 4230,143455
+extern Lisp_Object empty_unibyte_string,4231,143526
+extern Lisp_Object empty_unibyte_string, empty_multibyte_string;4231,143526
+extern _Noreturn void terminate_due_to_signal 4232,143591
+extern Lisp_Object Vlibrary_cache;4234,143666
+void fixup_locale 4237,143727
+void synchronize_system_messages_locale 4238,143753
+void synchronize_system_time_locale 4239,143801
+INLINE void fixup_locale 4241,143851
+INLINE void synchronize_system_messages_locale 4242,143886
+INLINE void synchronize_system_time_locale 4243,143943
+extern void shut_down_emacs 4245,144003
+extern bool noninteractive;4248,144129
+extern bool no_site_lisp;4251,144221
+extern int daemon_pipe[daemon_pipe4256,144389
+#define IS_DAEMON 4257,144416
+#define DAEMON_RUNNING 4258,144456
+extern void *w32_daemon_event;w32_daemon_event4260,144524
+#define IS_DAEMON 4261,144555
+#define DAEMON_RUNNING 4262,144600
+extern bool fatal_error_in_progress;4266,144721
+extern bool inhibit_window_system;4269,144827
+extern bool running_asynch_code;4271,144920
+extern void kill_buffer_processes 4274,144983
+extern int wait_reading_process_output 4275,145032
+# define WAIT_READING_MAX 4281,145419
+# define WAIT_READING_MAX 4283,145491
+extern void add_timer_wait_descriptor 4286,145555
+extern void add_keyboard_wait_descriptor 4288,145607
+extern void delete_keyboard_wait_descriptor 4289,145655
+extern void add_gpm_wait_descriptor 4291,145722
+extern void delete_gpm_wait_descriptor 4292,145765
+extern void init_process_emacs 4294,145818
+extern void syms_of_process 4295,145857
+extern void setup_process_coding_systems 4296,145893
+extern int child_setup 4302,146013
+extern void init_callproc_1 4303,146081
+extern void init_callproc 4304,146117
+extern void set_initial_environment 4305,146151
+extern void syms_of_callproc 4306,146195
+extern Lisp_Object read_doc_string 4309,146258
+extern Lisp_Object get_doc_string 4310,146308
+extern void syms_of_doc 4311,146369
+extern int read_bytecode_char 4312,146401
+extern void syms_of_bytecode 4315,146470
+extern struct byte_stack *byte_stack_list;byte_stack_list4316,146507
+extern void mark_byte_stack 4318,146570
+extern void unmark_byte_stack 4320,146613
+extern Lisp_Object exec_byte_code 4321,146651
+extern void init_macros 4325,146801
+extern void syms_of_macros 4326,146833
+extern void truncate_undo_list 4329,146895
+extern void record_insert 4330,146945
+extern void record_delete 4331,146995
+extern void record_first_change 4332,147053
+extern void record_change 4333,147093
+extern void record_property_change 4334,147143
+extern void syms_of_undo 4337,147285
+extern void report_interval_modification 4340,147349
+extern void syms_of_menu 4343,147445
+extern void syms_of_xmenu 4346,147506
+extern char *get_current_dir_name get_current_dir_name4356,147708
+extern void stuff_char 4358,147757
+extern void init_foreground_group 4359,147790
+extern void sys_subshell 4360,147832
+extern void sys_suspend 4361,147865
+extern void discard_tty_input 4362,147897
+extern void init_sys_modes 4363,147935
+extern void reset_sys_modes 4364,147991
+extern void init_all_sys_modes 4365,148048
+extern void reset_all_sys_modes 4366,148087
+extern void child_setup_tty 4367,148127
+extern void setup_pty 4368,148162
+extern int set_window_size 4369,148191
+extern EMACS_INT get_random 4370,148235
+extern void seed_random 4371,148271
+extern void init_random 4372,148316
+extern void emacs_backtrace 4373,148348
+extern _Noreturn void emacs_abort 4374,148383
+extern void xputenv 4527,152697
+extern char *egetenv_internal egetenv_internal4529,152734
+egetenv 4532,152806
+extern void init_system_name 4539,153009
+#define eabs(4545,153302
+#define make_fixnum_or_float(4550,153435
+enum MAX_ALLOCA 4556,153686
+enum MAX_ALLOCA { MAX_ALLOCA 4556,153686
+extern void *record_xmalloc record_xmalloc4558,153731
+#define USE_SAFE_ALLOCA        4560,153797
+#define AVAIL_ALLOCA(4564,153930
+#define SAFE_ALLOCA(4568,154041
+#define SAFE_NALLOCA(4576,154382
+#define SAFE_ALLOCA_STRING(4590,154858
+#define SAFE_FREE(4598,155110
+#define SAFE_ALLOCA_LISP(4625,155688
+# define USE_STACK_LISP_OBJECTS 4652,156810
+# undef USE_STACK_LISP_OBJECTS4658,156976
+# define USE_STACK_LISP_OBJECTS 4659,157007
+enum { defined_GC_CHECK_STRING_BYTES 4663,157082
+enum { defined_GC_CHECK_STRING_BYTES 4665,157135
+union Aligned_Cons4670,157269
+  struct Lisp_Cons s;4672,157290
+  double d;4673,157312
+  double d; intmax_t i;4673,157312
+  double d; intmax_t i; void *p;p4673,157312
+union Aligned_String4676,157349
+  struct Lisp_String s;4678,157372
+  double d;4679,157396
+  double d; intmax_t i;4679,157396
+  double d; intmax_t i; void *p;p4679,157396
+    USE_STACK_CONS 4689,157704
+    USE_STACK_STRING 4691,157810
+#define STACK_CONS(4699,158147
+#define AUTO_CONS_EXPR(4701,158244
+#define AUTO_CONS(4709,158607
+#define AUTO_LIST1(4710,158678
+#define AUTO_LIST2(4712,158786
+#define AUTO_LIST3(4716,158941
+#define AUTO_LIST4(4720,159116
+extern const char *verify_ascii verify_ascii4730,159453
+# define verify_ascii(4732,159507
+#define AUTO_STRING(4740,159815
+#define FOR_EACH_TAIL(4752,160279
+#define FOR_EACH_ALIST_VALUE(4766,160770
+maybe_gc 4774,161057
+functionp 4784,161296
+
+c-src/machsyscalls.c,23
+#define        SYSCALL(6,113
+
+c-src/machsyscalls.h,159
+SYSCALL (mach_msg_trap,1,0
+SYSCALL (mach_reply_port,13,314
+SYSCALL (mach_thread_self,18,377
+SYSCALL (mach_task_self,23,441
+SYSCALL (mach_host_self,28,503
+
+c-src/fail.c,30
+void (*prt_call(prt_call1,0
+
+c-src/h.h,2506
+   ELEM_I/ELEM_I3,15
+} Fails_t;5,85
+typedef void Lang_function 6,96
+void Asm_labels 7,127
+typedef struct tpcmd8,147
+#define ggg 10,170
+  } arg;13,198
+tpcmd;15,209
+typedef struct foobar2_ 16,216
+    fu   int (*funcptr)funcptr17,242
+    long foo;18,279
+    char bar;19,293
+} foobar2;20,307
+    DEVICE_SWP,23,333
+    DEVICE_LAST24,349
+} bsp_DevId;25,365
+  struct constant_args 27,394
+    unsigned int burst;28,419
+  } constant;29,443
+} args;30,457
+typedef int *regset;regset31,465
+typedef int INT;32,486
+typedef union abc33,503
+  int def;35,523
+} ghi1;36,534
+typedef union abc 37,542
+  int def;38,562
+} ghi2;39,573
+typedef struct a 40,581
+} b;41,600
+#define c(42,605
+typedef struct an_extern_linkage 
*an_extern_linkage_ptr;an_extern_linkage_ptr43,619
+typedef struct an_extern_linkage 44,676
+               kind;46,733
+               is_explicit;49,812
+  a_byte_boolean is_curly_brace_form;54,1009
+} an_extern_linkage;56,1054
+typedef struct pollfd   pfdset[pfdset57,1075
+typedef union rtunion_def58,1119
+    int rtint;60,1149
+    char *rtstr;rtstr61,1164
+    struct rtx_def *rtx;rtx62,1181
+  } womboid 63,1206
+typedef union rtunion_def64,1220
+  int rtint;68,1250
+  char *rtstr;rtstr69,1263
+  struct rtx_def *rtxp;rtxp70,1278
+  struct rtx_def rtxnp;71,1302
+womboid75,1330
+enum {dog,dog81,1416
+enum {dog, cat}cat81,1416
+enum {dog, cat} animals;81,1416
+typedef void (_CALLBACK_ *signal_handler)signal_handler82,1441
+typedef void (_CALLBACK_ *signal_handler1)signal_handler183,1489
+/* comment */ #define ANSIC84,1538
+ #define ANSIC85,1566
+typedef void (proc)87,1588
+typedef void OperatorFun(88,1612
+typedef int f(89,1648
+struct my_struct 91,1691
+typedef struct my_struct my_typedef;93,1713
+typedef RETSIGTYPE (*signal_handler_t)signal_handler_t94,1750
+  Date 04 May 87 235311 PDT 96,1802
+typedef unsigned char unchar;99,1880
+typedef int X,100,1910
+typedef int X, Y,100,1910
+typedef int X, Y, Z;100,1910
+typedef mio mao;101,1931
+extern void ab(102,1948
+typedef struct a 103,1966
+typedef struct a { } b;103,1966
+typedef struct b104,1990
+} c;106,2009
+int    (*oldhup)oldhup107,2014
+request (*oldhup)oldhup108,2031
+int extvar;109,2053
+#define tag1110,2065
+#define aaaaaa 111,2078
+#define bbbbbb\bbbbbb113,2102
+#define cccccccccc115,2125
+#define enter_critical_section 116,2144
+#define exit_critical_to_previous      117,2199
+#define UNDEFINED118,2259
+struct re_pattern_buffer 119,2277
+struct re_pattern_buffer { unsigned char *buffer;buffer119,2277
+
+cp-src/c.C,3629
+template <typename ipc3dIslandHierarchy,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType, unsigned 
numOfChannels,1,0
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType, unsigned 
numOfChannels, typename ipc3dLinkControl,1,0
+class CMultiChannelCSC19_3D2,151
+        ipc3dLinkControlSetup setup;CMultiChannelCSC19_3D::setup5,190
+        ipc3dCSC19<CMultiChannelCSC19_3D::ipc3dCSC196,227
+        
ipc3dCSC19<ipc3dIslandHierarchy,ipcMultiChannel<ipc3dChannelType,numOfChannels>,ipcMultiChannel<ipc3dChannelType,numOfChannels>,ipc3dLinkControl>
 mcCSC;CMultiChannelCSC19_3D::mcCSC6,227
+        advTimer cscInitTime;CMultiChannelCSC19_3D::cscInitTime7,388
+        advTimer 
cscSegmentationTime;CMultiChannelCSC19_3D::cscSegmentationTime8,418
+        advTimer outputTime;CMultiChannelCSC19_3D::outputTime9,456
+        void execute(CMultiChannelCSC19_3D::execute11,493
+static void my_function1(24,984
+int main 25,1026
+double base 26,1088
+operator += operator +=29,1174
+class TestRecord;31,1233
+typedef struct s1 32,1251
+   int counter;s1::counter33,1271
+} t1;34,1287
+struct s2 35,1293
+   int counter;s2::counter36,1305
+typedef struct s2 t2;38,1324
+class A 39,1346
+  enum { rosso,A::rosso40,1356
+  enum { rosso, giallo,A::giallo40,1356
+  enum { rosso, giallo, verde A::verde40,1356
+  enum { rosso, giallo, verde } colori;A::colori40,1356
+  const A& operator+(A::operator+41,1396
+const A& A::operator+(43,1431
+void operator+(44,1467
+void operator -(operator -45,1495
+void operator int(operator int46,1524
+A<int>* f(48,1556
+int f(49,1571
+int A<int>::f(f50,1590
+A<float,B<int> > A<B<float>,int>::f(f51,1618
+template <class C, int n> class AT 52,1668
+template <class C, int n> class AT { C t[AT::t52,1668
+class AU 53,1716
+class AU { T x;AU::x53,1716
+class B<B54,1735
+class B<int> { void f(B::f54,1735
+const A::B::T& abt 55,1765
+class A 56,1791
+class A { class B A::B56,1791
+class A { class B { int f(A::B::f56,1791
+class A 57,1826
+  int get_data(A::get_data58,1836
+  A operator+(A::operator+59,1860
+is_muldiv_operation(61,1887
+domain foo 68,1955
+     void f(foo::f69,1968
+void A::A(72,1989
+struct A 73,2004
+struct A { A(A::A73,2004
+struct B 74,2022
+struct B { B(B::B74,2022
+void B::B(75,2041
+void BE_Node::BE_Node(76,2056
+class BE_Node 77,2083
+struct foo 79,2102
+  int x;foo::x80,2115
+class test 86,2156
+  int f(test::f87,2169
+  int ff(test::ff89,2231
+  int g(test::g90,2254
+class  AST_Root 92,2278
+class  AST_Root;96,2327
+AST_ConcreteType::AST_ConcreteType(99,2393
+AST_Array::AST_Array(107,2532
+     void f(::f115,2733
+struct A 117,2753
+    ~A(A::~A118,2764
+A::~A(120,2777
+struct B 122,2789
+    ~B(B::~B123,2800
+enum {dog,::dog126,2817
+enum {dog, cat}::cat126,2817
+enum {dog, cat} animals;126,2817
+struct {int teats;::teats127,2842
+struct {int teats;} cow;127,2842
+class Boo 129,2868
+    enum {dog,Boo::dog130,2880
+    enum {dog, cat}Boo::cat130,2880
+    enum {dog, cat} animals;Boo::animals130,2880
+    struct {int treats;Boo::treats131,2909
+    struct {int treats;} cow;Boo::cow131,2909
+    int i,Boo::i132,2939
+    int i,a,Boo::a132,2939
+    int i,a,b;Boo::b132,2939
+    foo(Boo::foo133,2954
+    Boo(Boo::Boo137,2995
+    Boo(Boo::Boo138,3052
+Boo::Boo(141,3070
+typedef int should_see_this_one_enclosed_in_extern_C;149,3155
+typedef int 
(*should_see_this_function_pointer)should_see_this_function_pointer153,3228
+typedef int should_see_this_array_type[should_see_this_array_type156,3310
+
+cp-src/abstract.C,11317
+Half_Container::Half_Container(34,703
+void Half_Container::SetPosition(45,941
+void Half_Container::SetDimensions(58,1259
+void Half_Container::SetFather(81,1697
+void Half_Container::SetCollapsed(87,1787
+Specification::Specification(98,1958
+void Specification::SetPosition(119,2453
+void Specification::SetDimensions(164,3742
+void Specification::SetFather(188,4616
+void Specification::SetPath(202,4908
+Coord Specification::GetMaxX(212,5125
+Coord Specification::GetMaxY(215,5174
+Process::Process(222,5298
+void Process::SetPosition(242,5697
+void Process::SetDimensions(291,6959
+void Process::SetFather(315,7913
+void Process::SetPath(326,8123
+Coord Process::GetMaxX(335,8323
+Coord Process::GetMaxY(338,8365
+Choice::Choice(346,8482
+void Choice::SetPosition(357,8698
+void Choice::SetDimensions(405,10053
+void Choice::ChangeH(466,12014
+void Choice::ChangeW(495,12947
+void Choice::SetFather(522,13700
+void Choice::SetTextual(532,13918
+void Choice::SetCollapsed(540,14041
+int Choice::Get_Textual_H(549,14168
+int Choice::Get_Textual_W(557,14408
+void Choice::SetTerminalPos(566,14615
+Stop::Stop(588,15087
+void Stop::SetPosition(595,15207
+void Stop::SetDimensions(605,15373
+void Stop::SetFather(644,16369
+void Stop::SetTextual(652,16537
+void Stop::SetCollapsed(655,16616
+Exit::Exit(667,16768
+void Exit::SetPosition(676,16935
+void Exit::SetDimensions(687,17164
+void Exit::SetFather(695,17350
+Exit_Bex::Exit_Bex(703,17476
+void Exit_Bex::SetPosition(713,17678
+void Exit_Bex::SetDimensions(740,18430
+void Exit_Bex::SetFather(798,20444
+void Exit_Bex::SetTextual(807,20646
+void Exit_Bex::SetCollapsed(814,20757
+NoExit::NoExit(826,20943
+void NoExit::SetPosition(835,21092
+void NoExit::SetDimensions(845,21266
+void NoExit::SetFather(852,21359
+ID_Place::ID_Place(861,21488
+void ID_Place::SetIdent(875,21745
+void ID_Place::SetPosition(886,21936
+void ID_Place::SetDimensions(897,22173
+void ID_Place::SetFather(928,23017
+ID_Place::~ID_Place(932,23073
+void ID_Place::SetVisible(935,23112
+void ID_Place::ClearID(941,23193
+ID_List::ID_List(953,23379
+void ID_List::SetPosition(967,23644
+void ID_List::SetDimensions(999,24385
+void ID_List::SetFather(1038,25456
+void ID_List::SetCollapsed(1047,25595
+void ID_List::HideMe(1056,25734
+void ID_List::SetRBubble(1065,25862
+void ID_List::SetAlignement(1073,25980
+int ID_List::GetCardinality(1082,26123
+void ID_List::SetVisible(1093,26291
+void ID_List::BuildSigSorts(1103,26518
+void ID_List::ClearIDs(1126,27081
+Id_Decl::Id_Decl(1139,27280
+void Id_Decl::SetPosition(1156,27659
+void Id_Decl::SetDimensions(1174,28016
+void Id_Decl::SetFather(1191,28417
+void Id_Decl::SetCollapsed(1200,28568
+Id_Decl_List::Id_Decl_List(1214,28799
+void Id_Decl_List::SetPosition(1227,29069
+void Id_Decl_List::SetDimensions(1245,29424
+void Id_Decl_List::SetFather(1262,29844
+void Id_Decl_List::SetCollapsed(1271,29988
+Comment::Comment(1286,30209
+void Comment::SetComment(1299,30446
+void Comment::SetFather(1317,30800
+void Comment::SetPosition(1321,30854
+void Comment::SetDimensions(1331,31031
+Comment::~Comment(1345,31265
+Comment_List::Comment_List(1352,31382
+void Comment_List::SetPosition(1362,31541
+void Comment_List::SetDimensions(1380,31860
+void Comment_List::SetFather(1392,32139
+Parallel::Parallel(1406,32360
+void Parallel::SetPosition(1417,32573
+void Parallel::SetDimensions(1473,34272
+void Parallel::SetTextual(1534,36167
+int Parallel::Get_Textual_W(1543,36313
+int Parallel::Get_Textual_H(1559,36722
+void Parallel::SetTerminalPos(1570,37191
+void Parallel::SetFather(1590,37698
+void Parallel::SetCollapsed(1601,37950
+Ident_Eq::Ident_Eq(1615,38177
+void Ident_Eq::SetPosition(1632,38546
+void Ident_Eq::SetDimensions(1647,38851
+void Ident_Eq::SetFather(1662,39191
+void Ident_Eq::SetCollapsed(1669,39295
+Ident_Eq_List::Ident_Eq_List(1681,39480
+void Ident_Eq_List::SetPosition(1694,39753
+void Ident_Eq_List::SetDimensions(1712,40111
+void Ident_Eq_List::SetCollapsed(1729,40538
+void Ident_Eq_List::SetFather(1738,40683
+Local_Def::Local_Def(1751,40904
+void Local_Def::SetPosition(1761,41102
+void Local_Def::SetDimensions(1791,41833
+void Local_Def::SetFather(1832,43262
+void Local_Def::SetCollapsed(1839,43370
+void Local_Def::SetTextual(1848,43504
+Hide::Hide(1860,43681
+void Hide::SetPosition(1871,43872
+void Hide::SetDimensions(1901,44569
+void Hide::SetFather(1944,45771
+void Hide::SetCollapsed(1951,45873
+void Hide::SetTextual(1961,46003
+Interl::Interl(1972,46175
+void Interl::SetPosition(1982,46361
+void Interl::SetDimensions(1993,46593
+void Interl::SetFather(2021,47103
+Syncr::Syncr(2031,47257
+void Syncr::SetPosition(2041,47438
+void Syncr::SetDimensions(2051,47609
+void Syncr::SetFather(2079,48153
+Enable::Enable(2090,48436
+void Enable::SetPosition(2102,48690
+void Enable::SetDimensions(2169,50473
+void Enable::SetTextual(2243,53017
+void Enable::SetTerminalPos(2251,53140
+int Enable::Get_Textual_W(2271,53720
+int Enable::Get_Textual_H(2282,53985
+void Enable::SetFather(2285,54104
+void Enable::SetCollapsed(2298,54418
+Disable::Disable(2314,54780
+void Disable::SetPosition(2325,55001
+void Disable::SetDimensions(2376,56251
+void Disable::SetFather(2436,58064
+void Disable::SetCollapsed(2446,58284
+void Disable::SetTextual(2455,58412
+void Disable::SetTerminalPos(2463,58536
+int Disable::Get_Textual_W(2479,58987
+int Disable::Get_Textual_H(2488,59190
+Gen_Paral::Gen_Paral(2500,59630
+void Gen_Paral::SetPosition(2513,59899
+void Gen_Paral::SetDimensions(2540,60659
+void Gen_Paral::SetFather(2590,62171
+void Gen_Paral::SetCollapsed(2597,62290
+Action_Pref::Action_Pref(2609,62583
+void Action_Pref::SetPosition(2620,62829
+void Action_Pref::SetDimensions(2669,63937
+void Action_Pref::SetFather(2724,65777
+void Action_Pref::SetCollapsed(2734,66010
+void Action_Pref::SetTextual(2743,66147
+Internal::Internal(2757,66484
+void Internal::SetPosition(2768,66658
+void Internal::SetDimensions(2778,66838
+void Internal::SetFather(2806,67442
+Communication::Communication(2816,67702
+void Communication::SetPosition(2827,67956
+void Communication::SetDimensions(2897,70390
+void Communication::SetFather(2935,71706
+void Communication::SetCollapsed(2942,71837
+void Communication::SetTextual(2949,71968
+NoGuard::NoGuard(2961,72262
+void NoGuard::SetPosition(2974,72462
+void NoGuard::SetDimensions(2984,72639
+void NoGuard::SetFather(2987,72678
+Guard::Guard(2996,72929
+void Guard::SetPosition(3008,73118
+void Guard::SetDimensions(3022,73428
+void Guard::SetFather(3044,73894
+void Guard::SetCollapsed(3050,73974
+NoExperiment::NoExperiment(3062,74258
+void NoExperiment::SetPosition(3075,74478
+void NoExperiment::SetDimensions(3085,74670
+void NoExperiment::SetFather(3088,74714
+Experiment::Experiment(3097,74978
+void Experiment::SetPosition(3110,75245
+void Experiment::SetDimensions(3128,75611
+void Experiment::SetFather(3150,76066
+void Experiment::SetCollapsed(3157,76188
+void Experiment::SetTextual(3165,76311
+Proc_Inst::Proc_Inst(3175,76476
+void Proc_Inst::SetPosition(3191,76777
+void Proc_Inst::SetDimensions(3236,77965
+void Proc_Inst::SetFather(3286,79596
+void Proc_Inst::SetCollapsed(3294,79739
+void Proc_Inst::SetTextual(3304,79909
+Value_Expr::Value_Expr(3316,80100
+void Value_Expr::SetPosition(3329,80327
+void Value_Expr::SetDimensions(3340,80572
+void Value_Expr::SetFather(3343,80614
+Value_Expr_List::Value_Expr_List(3351,80755
+void Value_Expr_List::SetPosition(3364,81042
+void Value_Expr_List::SetDimensions(3382,81406
+void Value_Expr_List::SetFather(3399,81830
+void Value_Expr_List::SetCollapsed(3408,81977
+Sum_Ident::Sum_Ident(3423,82203
+void Sum_Ident::SetPosition(3435,82445
+void Sum_Ident::SetDimensions(3466,83196
+void Sum_Ident::SetFather(3509,84540
+void Sum_Ident::SetCollapsed(3516,84653
+void Sum_Ident::SetTextual(3525,84793
+void Sum_Ident::SetTerminalPos(3532,84897
+Value::Value(3552,85432
+void Value::SetPosition(3569,85792
+void Value::SetDimensions(3583,86091
+void Value::SetFather(3606,86628
+void Value::SetCollapsed(3613,86731
+Term::Term(3626,86908
+void Term::SetPosition(3646,87323
+void Term::SetDimensions(3671,87942
+void Term::SetFather(3697,88599
+void Term::SetCollapsed(3705,88732
+Exit_Entry::Exit_Entry(3719,88947
+void Exit_Entry::SetPosition(3732,89176
+void Exit_Entry::SetDimensions(3743,89421
+void Exit_Entry::SetFather(3746,89463
+Exit_Entry_List::Exit_Entry_List(3754,89604
+void Exit_Entry_List::SetPosition(3766,89875
+void Exit_Entry_List::SetDimensions(3785,90304
+void Exit_Entry_List::SetFather(3802,90753
+void Exit_Entry_List::SetCollapsed(3811,90900
+Sum_Gate::Sum_Gate(3826,91125
+void Sum_Gate::SetPosition(3837,91363
+void Sum_Gate::SetDimensions(3873,92120
+void Sum_Gate::SetFather(3915,93438
+void Sum_Gate::SetCollapsed(3922,93549
+void Sum_Gate::SetTextual(3931,93687
+void Sum_Gate::SetTerminalPos(3938,93790
+Gate_Decl::Gate_Decl(3959,94421
+void Gate_Decl::SetPosition(3977,94900
+void Gate_Decl::SetDimensions(3995,95298
+void Gate_Decl::SetFather(4011,95694
+void Gate_Decl::SetCollapsed(4020,95871
+Gate_Decl_List::Gate_Decl_List(4034,96130
+void Gate_Decl_List::SetPosition(4047,96414
+void Gate_Decl_List::SetDimensions(4065,96779
+void Gate_Decl_List::SetFather(4082,97207
+void Gate_Decl_List::SetCollapsed(4091,97353
+Par::Par(4106,97572
+void Par::SetPosition(4126,97957
+void Par::SetDimensions(4174,99236
+void Par::SetFather(4226,100814
+void Par::SetCollapsed(4234,100943
+void Par::SetTextual(4245,101100
+Sort_Id_Exit::Sort_Id_Exit(4258,101329
+void Sort_Id_Exit::SetPosition(4270,101556
+void Sort_Id_Exit::SetDimensions(4283,101834
+void Sort_Id_Exit::SetFather(4297,102142
+void Sort_Id_Exit::SetCollapsed(4303,102228
+Equality::Equality(4314,102512
+Equality::Equality(4327,102736
+void Equality::SetPosition(4340,102987
+void Equality::SetDimensions(4357,103329
+void Equality::SetFather(4377,103720
+void Equality::SetCollapsed(4387,103858
+Guarded::Guarded(4401,104167
+void Guarded::SetPosition(4413,104384
+void Guarded::SetDimensions(4441,105084
+void Guarded::SetFather(4482,106273
+void Guarded::SetCollapsed(4489,106377
+void Guarded::SetTextual(4499,106509
+Exper_Off::Exper_Off(4510,106813
+void Exper_Off::SetPosition(4523,107035
+void Exper_Off::SetDimensions(4533,107220
+void Exper_Off::SetFather(4536,107261
+Exper_Off_List::Exper_Off_List(4544,107521
+void Exper_Off_List::SetPosition(4557,107802
+void Exper_Off_List::SetDimensions(4575,108167
+void Exper_Off_List::SetFather(4592,108594
+void Exper_Off_List::SetCollapsed(4601,108740
+Exclam::Exclam(4616,109087
+void Exclam::SetPosition(4629,109300
+void Exclam::SetDimensions(4641,109541
+void Exclam::SetFather(4655,109830
+void Exclam::SetCollapsed(4661,109912
+Query::Query(4673,110194
+void Query::SetPosition(4686,110399
+void Query::SetDimensions(4698,110636
+void Query::SetFather(4712,110918
+void Query::SetCollapsed(4718,110997
+Definition::Definition(4729,111279
+void Definition::SetPosition(4741,111448
+void Definition::SetDimensions(4752,111658
+void Definition::SetFather(4766,111896
+void Definition::SetPath(4777,112089
+Proc_List::Proc_List(4790,112374
+void Proc_List::SetPosition(4799,112505
+void Proc_List::SetDimensions(4809,112686
+void Proc_List::SetFather(4815,112767
+void Proc_List::SetPath(4824,112908
+char *Proc_List::GetPath(Proc_List::GetPath4832,113068
+
+cp-src/abstract.H,25321
+#define abstract_hh16,453
+class SignatureSorts;21,513
+class ID_Place:ID_Place23,536
+       char *str;ID_Place::str25,571
+       char RBubble;ID_Place::RBubble26,583
+ ID_Place(ID_Place::ID_Place31,637
+ void  SetIdent(ID_Place::SetIdent32,650
+ void SetPosition(ID_Place::SetPosition33,675
+ void SetDimensions(ID_Place::SetDimensions34,708
+ void SetVisible(ID_Place::SetVisible35,735
+ void SetFather(ID_Place::SetFather36,759
+ void ClearID(ID_Place::ClearID37,789
+ virtual ~ID_Place(ID_Place::~ID_Place38,810
+ char *GetIdent(ID_Place::GetIdent41,857
+ void SetRBubble(ID_Place::SetRBubble42,891
+ char GetRBubble(ID_Place::GetRBubble43,934
+class ID_List:ID_List47,1012
+       ID_Place *elem;ID_List::elem49,1046
+       ID_List *next;ID_List::next50,1063
+ ID_List(ID_List::ID_List57,1134
+ void SetPosition(ID_List::SetPosition58,1167
+ void SetDimensions(ID_List::SetDimensions59,1200
+ void SetFather(ID_List::SetFather60,1227
+ ID_Place *GetElem(ID_List::GetElem61,1257
+ void HideMe(ID_List::HideMe62,1279
+ void SetCollapsed(ID_List::SetCollapsed63,1299
+ void SetRBubble(ID_List::SetRBubble64,1325
+ void BuildSigSorts(ID_List::BuildSigSorts65,1349
+ void SetVisible(ID_List::SetVisible66,1409
+ void SetAlignement(ID_List::SetAlignement67,1433
+ void ClearIDs(ID_List::ClearIDs68,1460
+ int GetCardinality(ID_List::GetCardinality69,1482
+class Id_Decl:Id_Decl73,1540
+       ID_List *id_list;Id_Decl::id_list75,1574
+       ID_Place *sort_id;Id_Decl::sort_id76,1593
+ Id_Decl(Id_Decl::Id_Decl81,1648
+ void SetPosition(Id_Decl::SetPosition82,1681
+ void SetDimensions(Id_Decl::SetDimensions83,1714
+ void SetFather(Id_Decl::SetFather84,1741
+ void SetCollapsed(Id_Decl::SetCollapsed85,1771
+class Id_Decl_List:Id_Decl_List89,1829
+       Id_Decl *elem;Id_Decl_List::elem91,1868
+       Id_Decl_List *next;Id_Decl_List::next92,1884
+ Id_Decl_List(Id_Decl_List::Id_Decl_List97,1945
+ void SetPosition(Id_Decl_List::SetPosition98,1987
+ void SetDimensions(Id_Decl_List::SetDimensions99,2020
+ void SetFather(Id_Decl_List::SetFather100,2047
+ void SetCollapsed(Id_Decl_List::SetCollapsed101,2077
+class Comment:Comment105,2140
+       char *comm;Comment::comm107,2174
+ Comment(Comment::Comment112,2222
+ Comment(Comment::Comment113,2234
+ void SetComment(Comment::SetComment114,2271
+ void SetPosition(Comment::SetPosition115,2297
+ void SetDimensions(Comment::SetDimensions116,2330
+ void SetFather(Comment::SetFather117,2357
+ virtual ~Comment(Comment::~Comment118,2387
+class Comment_List:Comment_List122,2440
+       Comment *elem;Comment_List::elem124,2479
+       Comment_List *next;Comment_List::next125,2495
+ Comment_List(Comment_List::Comment_List128,2525
+ void SetPosition(Comment_List::SetPosition129,2567
+ void SetDimensions(Comment_List::SetDimensions130,2600
+ void SetFather(Comment_List::SetFather131,2627
+class Value_Expr:Value_Expr135,2694
+ Value_Expr(Value_Expr::Value_Expr141,2769
+ void SetPosition(Value_Expr::SetPosition142,2784
+ void SetDimensions(Value_Expr::SetDimensions143,2817
+ void SetFather(Value_Expr::SetFather144,2844
+class Value_Expr_List:Value_Expr_List149,2911
+       Tree_Node *elem;Value_Expr_List::elem151,2953
+       Value_Expr_List *next;Value_Expr_List::next152,2971
+ Value_Expr_List(Value_Expr_List::Value_Expr_List157,3038
+ void SetPosition(Value_Expr_List::SetPosition158,3088
+ void SetDimensions(Value_Expr_List::SetDimensions159,3121
+ void SetFather(Value_Expr_List::SetFather160,3148
+ void SetCollapsed(Value_Expr_List::SetCollapsed161,3178
+class Exit_Entry:Exit_Entry165,3244
+ Exit_Entry(Exit_Entry::Exit_Entry171,3319
+ void SetPosition(Exit_Entry::SetPosition172,3334
+ void SetDimensions(Exit_Entry::SetDimensions173,3367
+ void SetFather(Exit_Entry::SetFather174,3394
+class Exit_Entry_List:Exit_Entry_List179,3460
+       Tree_Node *elem;Exit_Entry_List::elem181,3502
+       Exit_Entry_List *next;Exit_Entry_List::next182,3520
+ Exit_Entry_List(Exit_Entry_List::Exit_Entry_List187,3587
+ void SetPosition(Exit_Entry_List::SetPosition188,3637
+ void SetDimensions(Exit_Entry_List::SetDimensions189,3670
+ void SetFather(Exit_Entry_List::SetFather190,3697
+ void SetCollapsed(Exit_Entry_List::SetCollapsed191,3727
+class Exper_Off:Exper_Off195,3793
+ Exper_Off(Exper_Off::Exper_Off199,3838
+ void SetPosition(Exper_Off::SetPosition200,3852
+ void SetDimensions(Exper_Off::SetDimensions201,3885
+ void SetFather(Exper_Off::SetFather202,3912
+class Exper_Off_List:Exper_Off_List207,3977
+        Exper_Off *elem;Exper_Off_List::elem209,4018
+        Exper_Off_List *next;Exper_Off_List::next210,4043
+ Exper_Off_List(Exper_Off_List::Exper_Off_List215,4115
+ void SetPosition(Exper_Off_List::SetPosition216,4163
+ void SetDimensions(Exper_Off_List::SetDimensions217,4196
+ void SetFather(Exper_Off_List::SetFather218,4223
+ void SetCollapsed(Exper_Off_List::SetCollapsed219,4253
+class Gate_Decl:Gate_Decl223,4323
+       ID_List *gate_id_list1;Gate_Decl::gate_id_list1225,4359
+       ID_List *gate_id_list2;Gate_Decl::gate_id_list2226,4384
+ Gate_Decl(Gate_Decl::Gate_Decl231,4446
+ void SetPosition(Gate_Decl::SetPosition232,4480
+ void SetDimensions(Gate_Decl::SetDimensions233,4513
+ void SetFather(Gate_Decl::SetFather234,4540
+ void SetCollapsed(Gate_Decl::SetCollapsed235,4570
+class Gate_Decl_List:Gate_Decl_List239,4630
+       Gate_Decl *elem;Gate_Decl_List::elem241,4671
+       Gate_Decl_List *next;Gate_Decl_List::next242,4689
+ Gate_Decl_List(Gate_Decl_List::Gate_Decl_List247,4754
+ void SetPosition(Gate_Decl_List::SetPosition248,4802
+ void SetDimensions(Gate_Decl_List::SetDimensions249,4835
+ void SetFather(Gate_Decl_List::SetFather250,4862
+ void SetCollapsed(Gate_Decl_List::SetCollapsed251,4892
+class Ident_Eq:Ident_Eq255,4957
+        Id_Decl *iddecl;Ident_Eq::iddecl257,4992
+        Value_Expr *expr;Ident_Eq::expr258,5017
+ Ident_Eq(Ident_Eq::Ident_Eq263,5079
+ void SetPosition(Ident_Eq::SetPosition264,5116
+ void SetDimensions(Ident_Eq::SetDimensions265,5149
+ void SetFather(Ident_Eq::SetFather266,5176
+ void SetCollapsed(Ident_Eq::SetCollapsed267,5206
+class Ident_Eq_List:Ident_Eq_List271,5270
+        Ident_Eq *elem;Ident_Eq_List::elem273,5310
+        Ident_Eq_List *next;Ident_Eq_List::next274,5334
+ Ident_Eq_List(Ident_Eq_List::Ident_Eq_List279,5404
+ void SetPosition(Ident_Eq_List::SetPosition280,5449
+ void SetDimensions(Ident_Eq_List::SetDimensions281,5482
+ void SetFather(Ident_Eq_List::SetFather282,5509
+ void SetCollapsed(Ident_Eq_List::SetCollapsed283,5539
+class Half_Container:Half_Container287,5608
+       ID_List *gate_list;Half_Container::gate_list289,5649
+ Half_Container(Half_Container::Half_Container294,5712
+ void SetPosition(Half_Container::SetPosition295,5740
+ void SetDimensions(Half_Container::SetDimensions296,5773
+ void SetFather(Half_Container::SetFather297,5800
+ void SetCollapsed(Half_Container::SetCollapsed298,5830
+class Specification:Specification308,5954
+class Definition;Specification::Definition310,5994
+        Comment_List *com_list;Specification::com_list312,6013
+       ID_Place *ident;Specification::ident313,6045
+       ID_List *gate_list;Specification::gate_list314,6063
+       Id_Decl_List *id_decl_list;Specification::id_decl_list315,6084
+        Comment_List *com_list1;Specification::com_list1316,6113
+       Tree_Node *func;Specification::func317,6146
+       Data_List *dt_list;Specification::dt_list318,6164
+       Definition *def;Specification::def319,6185
+       Coord yl1,Specification::yl1320,6203
+       Coord yl1,yl2,Specification::yl2320,6203
+       Coord yl1,yl2,yl3;Specification::yl3320,6203
+       Coord MaxX,Specification::MaxX321,6223
+       Coord MaxX, MaxY;Specification::MaxY321,6223
+ Specification(Specification::Specification326,6283
+ void SetPosition(Specification::SetPosition328,6418
+ void SetDimensions(Specification::SetDimensions329,6451
+ void SetFather(Specification::SetFather330,6478
+ void SetPath(Specification::SetPath331,6508
+ Coord GetMaxX(Specification::GetMaxX332,6535
+ Coord GetMaxY(Specification::GetMaxY333,6553
+class Process:Process337,6609
+        Comment_List *com_list;Process::com_list339,6643
+       ID_Place *ident;Process::ident340,6675
+       ID_List *gate_list;Process::gate_list341,6693
+       Id_Decl_List *id_decl_list;Process::id_decl_list342,6714
+       Definition *def;Process::def343,6743
+       Tree_Node *func;Process::func344,6761
+       char nesting;Process::nesting345,6779
+       Coord yl1,Process::yl1346,6794
+       Coord yl1,yl2,Process::yl2346,6794
+       Coord yl1,yl2,yl3,Process::yl3346,6794
+       Coord yl1,yl2,yl3,ypath;Process::ypath346,6794
+       Coord MaxX,Process::MaxX347,6820
+       Coord MaxX, MaxY;Process::MaxY347,6820
+ Process(Process::Process352,6874
+ void SetPosition(Process::SetPosition353,6966
+ void SetDimensions(Process::SetDimensions354,6999
+ void SetFather(Process::SetFather355,7026
+ void SetPath(Process::SetPath356,7056
+ void NewBex(Process::NewBex357,7097
+ Coord GetMaxY(Process::GetMaxY359,7125
+ Coord GetMaxX(Process::GetMaxX360,7143
+ char GetNesting(Process::GetNesting363,7186
+class Proc_List:Proc_List367,7257
+        Process *elem;Proc_List::elem369,7293
+        Proc_List *next;Proc_List::next370,7316
+ Proc_List(Proc_List::Proc_List373,7350
+ void SetPosition(Proc_List::SetPosition374,7386
+ void SetDimensions(Proc_List::SetDimensions375,7419
+ void SetFather(Proc_List::SetFather376,7446
+ void SetPath(Proc_List::SetPath377,7476
+ char *GetPath(Proc_List::GetPath378,7517
+class Definition:Definition382,7574
+        Tree_Node *bex;Definition::bex384,7611
+        Proc_List *process_list;Definition::process_list385,7635
+        Data_List *data_list;Definition::data_list386,7668
+       char path[Definition::path387,7698
+ Definition(Definition::Definition390,7732
+ void SetPosition(Definition::SetPosition391,7784
+ void SetDimensions(Definition::SetDimensions392,7817
+ void SetFather(Definition::SetFather393,7844
+ void SetPath(Definition::SetPath394,7874
+ char *GetPath(Definition::GetPath397,7940
+class Exit:Exit407,8071
+       ID_List *sort_list;Exit::sort_list409,8102
+ Exit(Exit::Exit414,8155
+ void SetPosition(Exit::SetPosition415,8173
+ void SetDimensions(Exit::SetDimensions416,8220
+ void SetFather(Exit::SetFather417,8247
+class NoExit:NoExit421,8305
+ NoExit(NoExit::NoExit427,8372
+ void SetPosition(NoExit::SetPosition428,8383
+ void SetDimensions(NoExit::SetDimensions429,8416
+ void SetFather(NoExit::SetFather430,8443
+class Value:Value440,8560
+       ID_Place *ident;Value::ident442,8592
+       ID_Place *sort_id;Value::sort_id443,8610
+ Value(Value::Value448,8663
+ void SetPosition(Value::SetPosition449,8695
+ void SetDimensions(Value::SetDimensions450,8728
+ void SetFather(Value::SetFather451,8755
+ void SetCollapsed(Value::SetCollapsed452,8785
+class Term:Term456,8841
+       ID_Place *op_ident;Term::op_ident458,8872
+       Value_Expr_List *expr_list;Term::expr_list459,8893
+       ID_Place *sort_id;Term::sort_id460,8922
+ Term(Term::Term465,8974
+ void SetPosition(Term::SetPosition466,9024
+ void SetDimensions(Term::SetDimensions467,9057
+ void SetFather(Term::SetFather468,9084
+ void SetCollapsed(Term::SetCollapsed469,9114
+class Equality:Equality473,9169
+        Tree_Node *express1;Equality::express1475,9204
+        Tree_Node *express2;Equality::express2476,9233
+ Equality(Equality::Equality481,9298
+ Equality(Equality::Equality482,9311
+ void SetPosition(Equality::SetPosition483,9348
+ void SetDimensions(Equality::SetDimensions484,9381
+ void SetFather(Equality::SetFather485,9408
+ void SetCollapsed(Equality::SetCollapsed486,9438
+class Sort_Id_Exit:Sort_Id_Exit490,9504
+       ID_Place *sort_id;Sort_Id_Exit::sort_id492,9543
+ Sort_Id_Exit(Sort_Id_Exit::Sort_Id_Exit497,9603
+ void SetPosition(Sort_Id_Exit::SetPosition498,9630
+ void SetDimensions(Sort_Id_Exit::SetDimensions499,9663
+ void SetFather(Sort_Id_Exit::SetFather500,9690
+ void SetCollapsed(Sort_Id_Exit::SetCollapsed501,9720
+class NoGuard:NoGuard511,9837
+ NoGuard(NoGuard::NoGuard517,9906
+ void SetPosition(NoGuard::SetPosition518,9918
+ void SetDimensions(NoGuard::SetDimensions519,9951
+ void SetFather(NoGuard::SetFather520,9978
+class Guard:Guard524,10045
+        Equality *equality;Guard::equality526,10077
+ Guard(Guard::Guard531,10138
+ void SetPosition(Guard::SetPosition532,10158
+ void SetDimensions(Guard::SetDimensions533,10191
+ void SetFather(Guard::SetFather534,10218
+ void SetCollapsed(Guard::SetCollapsed535,10248
+class NoExperiment:NoExperiment545,10368
+ NoExperiment(NoExperiment::NoExperiment551,10447
+ void SetPosition(NoExperiment::SetPosition552,10464
+ void SetDimensions(NoExperiment::SetDimensions553,10497
+ void SetFather(NoExperiment::SetFather554,10524
+class Experiment:Experiment558,10591
+        Exper_Off_List *exp_offer_list;Experiment::exp_offer_list560,10628
+        Tree_Node *guard_option;Experiment::guard_option561,10668
+ Experiment(Experiment::Experiment566,10739
+ void SetPosition(Experiment::SetPosition567,10783
+ void SetDimensions(Experiment::SetDimensions568,10816
+ void SetFather(Experiment::SetFather569,10843
+ void SetTextual(Experiment::SetTextual570,10873
+ void SetCollapsed(Experiment::SetCollapsed571,10911
+ Tree_Node *GetGuard(Experiment::GetGuard574,10962
+class Exclam:Exclam578,11053
+        Tree_Node *value_exp;Exclam::value_exp580,11086
+ Exclam(Exclam::Exclam585,11150
+ void SetPosition(Exclam::SetPosition586,11172
+ void SetDimensions(Exclam::SetDimensions587,11205
+ void SetFather(Exclam::SetFather588,11232
+ void SetCollapsed(Exclam::SetCollapsed589,11262
+class Query:Query593,11324
+        Id_Decl *id_decl;Query::id_decl595,11356
+ Query(Query::Query600,11415
+ void SetPosition(Query::SetPosition601,11434
+ void SetDimensions(Query::SetDimensions602,11467
+ void SetFather(Query::SetFather603,11494
+ void SetCollapsed(Query::SetCollapsed604,11524
+class Internal:Internal614,11643
+ Internal(Internal::Internal620,11714
+ void SetPosition(Internal::SetPosition621,11727
+ void SetDimensions(Internal::SetDimensions622,11760
+ void SetFather(Internal::SetFather623,11787
+class Communication:Communication627,11854
+       ID_Place *gate_identifier;Communication::gate_identifier629,11894
+        Tree_Node 
*experiment_option;Communication::experiment_option630,11922
+        Coord xl,Communication::xl631,11960
+        Coord xl, yl;Communication::yl631,11960
+        int hr;Communication::hr632,11982
+ Communication(Communication::Communication637,12039
+ void SetPosition(Communication::SetPosition638,12080
+ void SetDimensions(Communication::SetDimensions639,12113
+ void SetFather(Communication::SetFather640,12140
+ void SetTextual(Communication::SetTextual641,12170
+ void SetCollapsed(Communication::SetCollapsed642,12208
+class Gen_Paral:Gen_Paral652,12337
+        ID_List *gate_id_list;Gen_Paral::gate_id_list654,12373
+       Coord Xclose;Gen_Paral::Xclose655,12404
+       char border;Gen_Paral::border656,12419
+ Gen_Paral(Gen_Paral::Gen_Paral661,12470
+ void SetPosition(Gen_Paral::SetPosition662,12493
+ void SetDimensions(Gen_Paral::SetDimensions663,12526
+ void SetFather(Gen_Paral::SetFather664,12553
+ void SetCollapsed(Gen_Paral::SetCollapsed665,12583
+ void HideGate(Gen_Paral::HideGate668,12634
+class Interl:Interl672,12730
+ Interl(Interl::Interl678,12797
+ void SetPosition(Interl::SetPosition679,12808
+ void SetDimensions(Interl::SetDimensions680,12841
+ void SetFather(Interl::SetFather681,12868
+class Syncr:Syncr685,12929
+ Syncr(Syncr::Syncr691,12994
+ void SetPosition(Syncr::SetPosition692,13004
+ void SetDimensions(Syncr::SetDimensions693,13037
+ void SetFather(Syncr::SetFather694,13064
+class Action_Pref:Action_Pref704,13185
+        Tree_Node *action_den;Action_Pref::action_den706,13223
+        Tree_Node *bex;Action_Pref::bex707,13254
+       char havebox;Action_Pref::havebox708,13278
+       char border;Action_Pref::border709,13293
+ Action_Pref(Action_Pref::Action_Pref714,13346
+ void SetPosition(Action_Pref::SetPosition715,13386
+ void SetDimensions(Action_Pref::SetDimensions716,13419
+ void SetFather(Action_Pref::SetFather717,13446
+ void SetTextual(Action_Pref::SetTextual718,13476
+ void SetCollapsed(Action_Pref::SetCollapsed719,13514
+class Enable:Enable723,13577
+        Tree_Node *bex1,Enable::bex1725,13610
+        Tree_Node *bex1, *bex2;Enable::bex2725,13610
+       ID_List *gate_id_list;Enable::gate_id_list726,13642
+        Coord xl,Enable::xl727,13666
+        Coord xl, yl1,Enable::yl1727,13666
+        Coord xl, yl1, xl2,Enable::xl2727,13666
+        Coord xl, yl1, xl2, yl2,Enable::yl2727,13666
+        Coord xl, yl1, xl2, yl2, xid,Enable::xid727,13666
+        Coord xl, yl1, xl2, yl2, xid, yid,Enable::yid727,13666
+        Coord xl, yl1, xl2, yl2, xid, yid, Yclose;Enable::Yclose727,13666
+       char havebox;Enable::havebox728,13717
+       char border;Enable::border729,13732
+ Enable(Enable::Enable734,13780
+ void SetPosition(Enable::SetPosition735,13826
+ void SetDimensions(Enable::SetDimensions736,13859
+ void SetFather(Enable::SetFather737,13886
+ void SetTextual(Enable::SetTextual738,13916
+ int Get_Textual_H(Enable::Get_Textual_H739,13954
+ int Get_Textual_W(Enable::Get_Textual_W740,13980
+ void SetTerminalPos(Enable::SetTerminalPos741,14006
+ void SetCollapsed(Enable::SetCollapsed742,14034
+class Disable:Disable746,14097
+        Tree_Node *bex1,Disable::bex1748,14131
+        Tree_Node *bex1, *bex2;Disable::bex2748,14131
+        Coord xl,Disable::xl749,14163
+        Coord xl, yl,Disable::yl749,14163
+        Coord xl, yl, yl2;Disable::yl2749,14163
+       char havebox;Disable::havebox750,14190
+       char border;Disable::border751,14205
+ Disable(Disable::Disable756,14254
+ void SetPosition(Disable::SetPosition757,14290
+ void SetDimensions(Disable::SetDimensions758,14323
+ void SetFather(Disable::SetFather759,14350
+ void SetTextual(Disable::SetTextual760,14380
+ int Get_Textual_H(Disable::Get_Textual_H761,14418
+ int Get_Textual_W(Disable::Get_Textual_W762,14444
+ void SetTerminalPos(Disable::SetTerminalPos763,14470
+ void SetCollapsed(Disable::SetCollapsed764,14498
+class Choice:Choice768,14561
+       Tree_Node *bex1,Choice::bex1770,14594
+       Tree_Node *bex1, *bex2;Choice::bex2770,14594
+       Coord xl,Choice::xl771,14619
+       Coord xl, yl,Choice::yl771,14619
+       Coord xl, yl, yl1;Choice::yl1771,14619
+       char havebox;Choice::havebox772,14639
+       int delta;Choice::delta773,14654
+       char border;Choice::border774,14666
+ Choice(Choice::Choice779,14714
+ void SetPosition(Choice::SetPosition780,14749
+ void SetDimensions(Choice::SetDimensions781,14782
+ void SetFather(Choice::SetFather782,14809
+ void SetTextual(Choice::SetTextual783,14839
+ void SetCollapsed(Choice::SetCollapsed784,14877
+ int Get_Textual_H(Choice::Get_Textual_H785,14903
+ int Get_Textual_W(Choice::Get_Textual_W786,14929
+ void SetTerminalPos(Choice::SetTerminalPos787,14955
+ void ChangeH(Choice::ChangeH788,14983
+ void ChangeW(Choice::ChangeW789,15003
+class Stop:Stop793,15054
+       char havebox;Stop::havebox795,15085
+       char border;Stop::border796,15100
+ Stop(Stop::Stop801,15146
+ void SetPosition(Stop::SetPosition802,15155
+ void SetDimensions(Stop::SetDimensions803,15188
+ void SetFather(Stop::SetFather804,15215
+ void SetTextual(Stop::SetTextual805,15245
+ void SetCollapsed(Stop::SetCollapsed806,15283
+class Exit_Bex:Exit_Bex810,15338
+       Exit_Entry_List *entry_list;Exit_Bex::entry_list812,15373
+       Coord Xopen,Exit_Bex::Xopen813,15404
+       Coord Xopen, Xclose;Exit_Bex::Xclose813,15404
+       char havebox;Exit_Bex::havebox814,15426
+       char border;Exit_Bex::border815,15441
+ Exit_Bex(Exit_Bex::Exit_Bex820,15491
+ void SetPosition(Exit_Bex::SetPosition821,15521
+ void SetDimensions(Exit_Bex::SetDimensions822,15554
+ void SetFather(Exit_Bex::SetFather823,15581
+ void SetTextual(Exit_Bex::SetTextual824,15611
+ void SetCollapsed(Exit_Bex::SetCollapsed825,15649
+class Hide:Hide829,15707
+       ID_List *gate_list;Hide::gate_list831,15738
+       Tree_Node *bex;Hide::bex832,15759
+       char border;Hide::border833,15776
+       Coord yl;Hide::yl834,15790
+ Hide(Hide::Hide839,15833
+ void SetPosition(Hide::SetPosition840,15864
+ void SetDimensions(Hide::SetDimensions841,15897
+ void SetFather(Hide::SetFather842,15924
+ void SetTextual(Hide::SetTextual843,15954
+ void SetCollapsed(Hide::SetCollapsed844,15992
+class Guarded:Guarded848,16047
+        Equality *equality;Guarded::equality850,16081
+        Tree_Node *bex;Guarded::bex851,16109
+       Coord Xclose;Guarded::Xclose852,16133
+       char border;Guarded::border853,16148
+ Guarded(Guarded::Guarded858,16197
+ void SetPosition(Guarded::SetPosition859,16232
+ void SetDimensions(Guarded::SetDimensions860,16265
+ void SetFather(Guarded::SetFather861,16292
+ void SetTextual(Guarded::SetTextual862,16322
+ void SetCollapsed(Guarded::SetCollapsed863,16360
+class Proc_Inst:Proc_Inst867,16425
+       ID_List *gate_list;Proc_Inst::gate_list869,16461
+       ID_Place *ident;Proc_Inst::ident870,16482
+       Value_Expr_List *value_expr_list;Proc_Inst::value_expr_list871,16500
+       Coord yp,Proc_Inst::yp872,16535
+       Coord yp, yl1,Proc_Inst::yl1872,16535
+       Coord yp, yl1, Xopen,Proc_Inst::Xopen872,16535
+       Coord yp, yl1, Xopen, Xclose;Proc_Inst::Xclose872,16535
+       int hp;Proc_Inst::hp873,16566
+       char border;Proc_Inst::border874,16575
+  Proc_Inst(Proc_Inst::Proc_Inst879,16626
+ void SetPosition(Proc_Inst::SetPosition880,16681
+ void SetDimensions(Proc_Inst::SetDimensions881,16714
+ void SetFather(Proc_Inst::SetFather882,16741
+ void SetTextual(Proc_Inst::SetTextual883,16771
+ void SetCollapsed(Proc_Inst::SetCollapsed884,16809
+class Parallel:Parallel888,16870
+       Tree_Node *bex1,Parallel::bex1890,16905
+       Tree_Node *bex1, *bex2,Parallel::bex2890,16905
+       Tree_Node *bex1, *bex2, *oper;Parallel::oper890,16905
+       Coord xl,Parallel::xl891,16937
+       Coord xl, yl,Parallel::yl891,16937
+       Coord xl, yl, yl1;Parallel::yl1891,16937
+       char havebox;Parallel::havebox892,16957
+       int delta;Parallel::delta893,16972
+       char border;Parallel::border894,16984
+ Parallel(Parallel::Parallel899,17034
+ void SetPosition(Parallel::SetPosition900,17084
+ void SetDimensions(Parallel::SetDimensions901,17117
+ void SetFather(Parallel::SetFather902,17144
+ void SetTextual(Parallel::SetTextual903,17174
+ int Get_Textual_W(Parallel::Get_Textual_W904,17212
+ int Get_Textual_H(Parallel::Get_Textual_H905,17238
+ void SetTerminalPos(Parallel::SetTerminalPos906,17264
+ void SetCollapsed(Parallel::SetCollapsed907,17292
+ char GetOperType(Parallel::GetOperType910,17343
+class Local_Def:Local_Def914,17429
+       Ident_Eq_List *equa_list;Local_Def::equa_list916,17465
+       Tree_Node *bex;Local_Def::bex917,17492
+       Coord yl;Local_Def::yl918,17509
+       char border;Local_Def::border919,17520
+ Local_Def(Local_Def::Local_Def924,17571
+ void SetPosition(Local_Def::SetPosition925,17613
+ void SetDimensions(Local_Def::SetDimensions926,17646
+ void SetFather(Local_Def::SetFather927,17673
+ void SetTextual(Local_Def::SetTextual928,17703
+ void SetCollapsed(Local_Def::SetCollapsed929,17741
+class Par:Par933,17801
+       Gate_Decl_List *gate_decl_list;Par::gate_decl_list935,17831
+       Tree_Node *oper,Par::oper936,17864
+       Tree_Node *oper, *bex;Par::bex936,17864
+       Coord xl,Par::xl937,17888
+       Coord xl, yl;Par::yl937,17888
+       char border;Par::border938,17903
+ Par(Par::Par943,17948
+ void SetPosition(Par::SetPosition944,17998
+ void SetDimensions(Par::SetDimensions945,18031
+ void SetFather(Par::SetFather946,18058
+ void SetTextual(Par::SetTextual947,18088
+ void SetCollapsed(Par::SetCollapsed948,18126
+class Sum_Gate:Sum_Gate952,18180
+       Gate_Decl_List *gate_decl_list;Sum_Gate::gate_decl_list954,18215
+       Tree_Node *bex;Sum_Gate::bex955,18248
+       Coord xl,Sum_Gate::xl956,18265
+       Coord xl, yl,Sum_Gate::yl956,18265
+       Coord xl, yl, Xch,Sum_Gate::Xch956,18265
+       Coord xl, yl, Xch, Ych,Sum_Gate::Ych956,18265
+       Coord xl, yl, Xch, Ych, Xclose,Sum_Gate::Xclose956,18265
+       Coord xl, yl, Xch, Ych, Xclose, Yclose;Sum_Gate::Yclose956,18265
+       char border;Sum_Gate::border957,18306
+ Sum_Gate(Sum_Gate::Sum_Gate962,18356
+ void SetPosition(Sum_Gate::SetPosition963,18398
+ void SetDimensions(Sum_Gate::SetDimensions964,18431
+ void SetFather(Sum_Gate::SetFather965,18458
+ void SetTextual(Sum_Gate::SetTextual966,18488
+ void SetTerminalPos(Sum_Gate::SetTerminalPos967,18526
+ void SetCollapsed(Sum_Gate::SetCollapsed968,18554
+class Sum_Ident:Sum_Ident972,18613
+       Id_Decl_List *ident_decl_list;Sum_Ident::ident_decl_list974,18649
+       Tree_Node *bex;Sum_Ident::bex975,18681
+       Coord xl,Sum_Ident::xl976,18698
+       Coord xl, yl,Sum_Ident::yl976,18698
+       Coord xl, yl, Xch,Sum_Ident::Xch976,18698
+       Coord xl, yl, Xch, Ych,Sum_Ident::Ych976,18698
+       Coord xl, yl, Xch, Ych, Xclose,Sum_Ident::Xclose976,18698
+       Coord xl, yl, Xch, Ych, Xclose, Yclose;Sum_Ident::Yclose976,18698
+       char border;Sum_Ident::border977,18739
+ Sum_Ident(Sum_Ident::Sum_Ident982,18790
+ void SetPosition(Sum_Ident::SetPosition983,18831
+ void SetDimensions(Sum_Ident::SetDimensions984,18864
+ void SetFather(Sum_Ident::SetFather985,18891
+ void SetTextual(Sum_Ident::SetTextual986,18921
+ void SetTerminalPos(Sum_Ident::SetTerminalPos987,18959
+ void SetCollapsed(Sum_Ident::SetCollapsed988,18987
+
+cp-src/cfront.H,18434
+extern bit old_fct_accepted;28,897
+extern bit fct_void;32,1028
+extern char* prog_name;42,1297
+extern int inline_restr;43,1351
+extern bit emode;44,1410
+extern Pname name_free;47,1457
+extern Pexpr expr_free;48,1496
+extern Pstmt stmt_free;49,1520
+extern int Nspy;52,1569
+extern int Nfile,53,1586
+extern int Nfile, Nline,53,1586
+extern int Nfile, Nline, Ntoken,53,1586
+extern int Nfile, Nline, Ntoken, Nname,53,1586
+extern int Nfile, Nline, Ntoken, Nname, Nfree_store,53,1586
+extern int Nfile, Nline, Ntoken, Nname, Nfree_store, Nalloc,53,1586
+extern int Nfile, Nline, Ntoken, Nname, Nfree_store, Nalloc, Nfree;53,1586
+extern int Nn,54,1654
+extern int Nn, Nbt,54,1654
+extern int Nn, Nbt, Nt,54,1654
+extern int Nn, Nbt, Nt, Ne,54,1654
+extern int Nn, Nbt, Nt, Ne, Ns,54,1654
+extern int Nn, Nbt, Nt, Ne, Ns, Nstr,54,1654
+extern int Nn, Nbt, Nt, Ne, Ns, Nstr, Nc,54,1654
+extern int Nn, Nbt, Nt, Ne, Ns, Nstr, Nc, Nl;54,1654
+extern int NFn,55,1700
+extern int NFn, NFtn,55,1700
+extern int NFn, NFtn, NFpv,55,1700
+extern int NFn, NFtn, NFpv, NFbt,55,1700
+extern int NFn, NFtn, NFpv, NFbt, NFf,55,1700
+extern int NFn, NFtn, NFpv, NFbt, NFf, NFs,55,1700
+extern int NFn, NFtn, NFpv, NFbt, NFf, NFs, NFc,55,1700
+extern int NFn, NFtn, NFpv, NFbt, NFf, NFs, NFc, NFe,55,1700
+extern int NFn, NFtn, NFpv, NFbt, NFf, NFs, NFc, NFe, NFl;55,1700
+extern TOK     lex(57,1760
+extern Pname   syn(58,1778
+extern void    init_print(60,1799
+extern void    init_lex(61,1847
+extern void    int_syn(62,1871
+extern void    ext(63,1894
+extern char*   make_name(65,1917
+struct loc     67,1948
+       short   file;loc::file69,1988
+       short   line;loc::line70,2036
+       void    put(loc::put72,2062
+       void    putline(loc::putline73,2080
+extern Loc curloc;77,2108
+extern int curr_file;78,2127
+struct ea 80,2150
+               void* p;ea::p82,2224
+               int i;ea::i83,2235
+       ea(ea::ea86,2249
+       ea(ea::ea87,2275
+       ea(ea::ea88,2301
+       ea(ea::ea89,2310
+extern ea* ea0;92,2332
+overload error;94,2349
+int error(95,2365
+int error(96,2437
+int error(97,2515
+int error(98,2592
+extern int error_count;101,2689
+extern bit debug;102,2713
+extern int vtbl_opt;103,2731
+extern FILE* out_file;104,2752
+extern FILE* in_file;105,2775
+extern char scan_started;106,2797
+extern bit warn;107,2823
+extern int br_level;110,2848
+extern int bl_level;111,2869
+extern Ptable ktbl;112,2890
+extern Ptable gtbl;113,2941
+extern char* oper_name(114,2978
+extern Pclass ccl;115,3007
+extern Pbase defa_type;116,3026
+extern Pbase moe_type;117,3050
+extern Pstmt Cstmt;120,3087
+extern Pname Cdcl;121,3135
+extern void put_dcl_context(122,3194
+extern Ptable any_tbl;124,3226
+extern Pbase any_type;125,3287
+extern Pbase int_type;128,3318
+extern Pbase char_type;129,3341
+extern Pbase short_type;130,3365
+extern Pbase long_type;131,3390
+extern Pbase uint_type;132,3414
+extern Pbase float_type;133,3438
+extern Pbase double_type;134,3463
+extern Pbase void_type;135,3489
+extern Pbase uchar_type;138,3527
+extern Pbase ushort_type;139,3552
+extern Pbase ulong_type;140,3578
+extern Ptype Pchar_type;141,3603
+extern Ptype Pint_type;142,3628
+extern Ptype Pfctvec_type;143,3652
+extern Ptype Pfctchar_type;144,3679
+extern Ptype Pvoid_type;145,3707
+extern Pbase zero_type;146,3732
+extern int byte_offset;148,3757
+extern int bit_offset;149,3781
+extern int max_align;150,3804
+extern int stack_size;151,3826
+extern int enum_count;152,3849
+extern int const_save;153,3872
+extern Pexpr dummy;156,3903
+extern Pexpr zero;157,3950
+extern Pexpr one;158,3969
+extern Pname sta_name;159,3987
+#define DEL(161,4040
+#define PERM(162,4092
+#define UNPERM(163,4123
+struct node 165,4157
+       TOK     base;node::base166,4171
+       TOK     n_key;node::n_key167,4182
+       bit     permanent;node::permanent168,4226
+extern Pclass Ebase,172,4259
+extern Pclass Ebase, Epriv;172,4259
+struct table 175,4321
+       char    init_stat;table::init_stat177,4406
+       short   size;table::size181,4571
+       short   hashsize;table::hashsize182,4584
+       short   free_slot;table::free_slot183,4601
+       Pname*  entries;table::entries184,4651
+       short*  hashtbl;table::hashtbl185,4668
+       Pstmt   real_block;table::real_block186,4685
+       Ptable  next;table::next189,4787
+       Pname   t_name;table::t_name190,4834
+       table(table::table192,4875
+       Pname   look(table::look194,4906
+       Pname   insert(table::insert195,4931
+       void    grow(table::grow197,4971
+       void    set_scope(table::set_scope198,4988
+       void    set_name(table::set_name199,5029
+       Pname   get_mem(table::get_mem200,5070
+       int     max(table::max201,5091
+       void    dcl_print(table::dcl_print202,5129
+       Pname   lookc(table::lookc203,5155
+       Pexpr   find_name(table::find_name204,5181
+       void    del(table::del205,5218
+extern bit Nold;210,5255
+extern bit vec_const,211,5272
+extern bit vec_const, fct_const;211,5272
+extern void restore(214,5313
+extern void set_scope(215,5336
+extern Plist modified_tn;216,5366
+extern Pbase start_cl(217,5392
+extern void end_cl(218,5434
+extern Pbase end_enum(219,5456
+extern bit new_type;224,5581
+extern Pname cl_obj_vec;225,5602
+extern Pname eobj;226,5627
+#define DEFINED 230,5655
+#define SIMPLIFIED 231,5712
+#define DEF_SEEN 232,5754
+#define IN_ERROR 234,5859
+struct type 236,5881
+       bit     defined;type::defined237,5902
+       char*   signature(type::signature240,6005
+       void    print(type::print242,6043
+       void    dcl_print(type::dcl_print243,6058
+       void    base_print(type::base_print244,6082
+       void    del(type::del245,6102
+       Pname   is_cl_obj(type::is_cl_obj247,6116
+       int     is_ref(type::is_ref248,6158
+       void    dcl(type::dcl249,6173
+       int     tsizeof(type::tsizeof250,6192
+       bit     tconst(type::tconst251,6208
+       TOK     set_const(type::set_const252,6223
+       int     align(type::align253,6244
+       TOK     kind(type::kind254,6258
+       TOK     integral(type::integral255,6278
+       TOK     numeric(type::numeric256,6324
+       TOK     num_ptr(type::num_ptr257,6370
+       bit     vec_type(type::vec_type258,6416
+       bit     check(type::check259,6433
+       Ptype   deref(type::deref260,6457
+       Pptr    addrof(type::addrof261,6473
+struct enumdef 265,6500
+       bit     e_body;enumdef::e_body266,6535
+       short   no_of_enumerators;enumdef::no_of_enumerators267,6548
+       Pname   mem;enumdef::mem268,6574
+               enumdef(enumdef::enumdef269,6586
+       void    print(enumdef::print271,6641
+       void    dcl_print(enumdef::dcl_print272,6656
+       void    dcl(enumdef::dcl273,6680
+       void    simpl(enumdef::simpl274,6706
+struct classdef 278,6732
+       bit     pubbase;classdef::pubbase279,6769
+       bit     c_body;classdef::c_body280,6783
+       TOK     csu;classdef::csu281,6830
+       char    obj_align;classdef::obj_align282,6877
+       char    bit_ass;classdef::bit_ass283,6894
+       char    virt_count;classdef::virt_count284,6943
+       Pname   clbase;classdef::clbase286,7033
+       char*   string;classdef::string287,7063
+       Pname   mem_list;classdef::mem_list288,7099
+       Ptable  memtbl;classdef::memtbl289,7116
+       int     obj_size;classdef::obj_size290,7132
+       int     real_size;classdef::real_size291,7147
+       Plist   friend_list;classdef::friend_list292,7196
+       Pname   pubdef;classdef::pubdef293,7216
+       Plist   tn_list;classdef::tn_list294,7231
+       Pclass  in_class;classdef::in_class295,7289
+       Ptype   this_type;classdef::this_type296,7335
+       Pname*  virt_init;classdef::virt_init297,7353
+       Pname   itor;classdef::itor298,7412
+       Pname   conv;classdef::conv299,7450
+       classdef(classdef::classdef301,7490
+       TOK     is_simple(classdef::is_simple302,7506
+       void    print(classdef::print304,7568
+       void    dcl_print(classdef::dcl_print305,7583
+       void    simpl(classdef::simpl306,7607
+       void    print_members(classdef::print_members308,7623
+       void    dcl(classdef::dcl309,7646
+       bit     has_friend(classdef::has_friend310,7672
+       bit     baseof(classdef::baseof311,7696
+       bit     baseof(classdef::baseof312,7716
+       Pname   has_oper(classdef::has_oper313,7737
+       Pname   has_ctor(classdef::has_ctor314,7759
+       Pname   has_dtor(classdef::has_dtor315,7813
+       Pname   has_itor(classdef::has_itor316,7867
+       Pname   has_ictor(classdef::has_ictor317,7902
+struct basetype 323,7935
+       bit     b_unsigned;basetype::b_unsigned334,8195
+       bit     b_const;basetype::b_const335,8212
+       bit     b_typedef;basetype::b_typedef336,8226
+       bit     b_inline;basetype::b_inline337,8242
+       bit     b_virtual;basetype::b_virtual338,8257
+       bit     b_short;basetype::b_short339,8273
+       bit     b_long;basetype::b_long340,8287
+       char    b_bits;basetype::b_bits341,8300
+       char    b_offset;basetype::b_offset342,8345
+       TOK     b_sto;basetype::b_sto343,8384
+       Pname   b_name;basetype::b_name344,8433
+       Ptable  b_table;basetype::b_table345,8478
+       Pexpr   b_field;basetype::b_field346,8525
+       Pname   b_xname;basetype::b_xname347,8582
+       Ptype   b_fieldtype;basetype::b_fieldtype348,8615
+       basetype(basetype::basetype350,8636
+       Pbase   type_adj(basetype::type_adj352,8660
+       Pbase   base_adj(basetype::base_adj353,8682
+       Pbase   name_adj(basetype::name_adj354,8706
+       Pname   aggr(basetype::aggr355,8730
+       void    normalize(basetype::normalize356,8747
+       Pbase   check(basetype::check358,8779
+       void    dcl_print(basetype::dcl_print359,8800
+       Pbase   arit_conv(basetype::arit_conv360,8819
+struct fct 365,8857
+       TOK     nargs;fct::nargs367,8885
+       TOK     nargs_known;fct::nargs_known368,8897
+       char    f_virtual;fct::f_virtual369,8940
+       char    f_inline;fct::f_inline370,8991
+       Ptype   returns;fct::returns371,9052
+       Pname   argtype;fct::argtype372,9068
+       Ptype   s_returns;fct::s_returns373,9084
+       Pname   f_this;fct::f_this374,9102
+       Pclass  memof;fct::memof375,9117
+       Pblock  body;fct::body376,9158
+       Pname   f_init;fct::f_init377,9172
+       Pexpr   b_init;fct::b_init380,9295
+       Pexpr   f_expr;fct::f_expr383,9389
+       Pexpr   last_expanded;fct::last_expanded384,9441
+       Pname   f_result;fct::f_result385,9463
+       fct(fct::fct387,9517
+       void    argdcl(fct::argdcl389,9543
+       Ptype   normalize(fct::normalize391,9583
+       void    dcl_print(fct::dcl_print392,9608
+       void    dcl(fct::dcl393,9627
+       Pexpr   base_init(fct::base_init394,9645
+       Pexpr   mem_init(fct::mem_init395,9685
+       bit     declared(fct::declared396,9724
+       void    simpl(fct::simpl397,9765
+       Pexpr   expand(fct::expand398,9780
+struct name_list 403,9827
+       Pname   f;name_list::f404,9846
+       Plist   l;name_list::l405,9856
+       name_list(name_list::name_list406,9866
+struct gen 410,9931
+       Plist   fct_list;gen::fct_list411,9964
+       char*   string;gen::string412,9981
+               gen(gen::gen413,9996
+       Pname   add(gen::add414,10010
+       Pname   find(gen::find415,10034
+struct pvtyp 419,10071
+       Ptype typ;pvtyp::typ420,10093
+struct vec 423,10109
+       Pexpr   dim;vec::dim426,10157
+       int     size;vec::size427,10169
+       vec(vec::vec429,10182
+       Ptype   normalize(vec::normalize431,10253
+struct ptr 435,10289
+       Pclass  memof;ptr::memof437,10339
+       bit     rdo;ptr::rdo438,10395
+       ptr(ptr::ptr440,10419
+       Ptype   normalize(ptr::normalize442,10497
+inline Pptr type::addrof(447,10546
+extern bit vrp_equiv;449,10606
+extern Pexpr next_elem(461,10867
+extern void new_list(462,10893
+extern void list_check(463,10922
+extern Pexpr ref_init(464,10967
+extern Pexpr class_init(465,11009
+extern Pexpr check_cond(466,11060
+struct expr 469,11113
+               Ptype   tp;expr::tp481,11414
+               int     syn_class;expr::syn_class482,11426
+               Pexpr   e1;expr::e1485,11456
+               char*   string;expr::string486,11468
+               int     i1;expr::i1487,11484
+               Pexpr   e2;expr::e2490,11507
+               Pexpr   n_initializer;expr::n_initializer491,11519
+               char*   string2;expr::string2492,11542
+               Ptype   tp2;expr::tp2495,11608
+               Pname   fct_name;expr::fct_name496,11621
+               Pexpr   cond;expr::cond497,11639
+               Pname   mem;expr::mem498,11653
+               Ptype   as_type;expr::as_type499,11666
+               Ptable  n_table;expr::n_table500,11683
+               Pin     il;expr::il501,11701
+       expr(expr::expr504,11716
+       ~expr(expr::~expr505,11742
+       void    del(expr::del507,11765
+       void    print(expr::print508,11778
+       Pexpr   typ(expr::typ509,11793
+       int     eval(expr::eval510,11813
+       int     lval(expr::lval511,11826
+       Ptype   fct_call(expr::fct_call512,11842
+       Pexpr   address(expr::address513,11867
+       Pexpr   contents(expr::contents514,11885
+       void    simpl(expr::simpl515,11904
+       Pexpr   expand(expr::expand516,11919
+       bit     not_simple(expr::not_simple517,11936
+       Pexpr   try_to_overload(expr::try_to_overload518,11955
+       Pexpr   docast(expr::docast519,11987
+       Pexpr   dovalue(expr::dovalue520,12010
+       Pexpr   donew(expr::donew521,12034
+       void    simpl_new(expr::simpl_new522,12056
+       void    simpl_delete(expr::simpl_delete523,12075
+struct texpr 527,12108
+       texpr(texpr::texpr528,12149
+struct ival 531,12218
+       ival(ival::ival532,12258
+struct call 535,12308
+       call(call::call536,12338
+       void    simpl(call::simpl538,12404
+       Pexpr   expand(call::expand539,12419
+struct qexpr 543,12453
+       qexpr(qexpr::qexpr544,12500
+struct ref 547,12582
+       ref(ref::ref548,12632
+struct text_expr 551,12697
+       text_expr(text_expr::text_expr552,12731
+struct name 557,12884
+       TOK     n_oper;name::n_oper558,12948
+       TOK     n_sto;name::n_sto559,12987
+       TOK     n_stclass;name::n_stclass560,13038
+       TOK     n_scope;name::n_scope561,13080
+       unsigned char   n_union;name::n_union562,13129
+       bit     n_evaluated;name::n_evaluated563,13173
+       bit     n_xref;name::n_xref564,13221
+       unsigned char   lex_level;name::lex_level565,13261
+       TOK     n_protect;name::n_protect566,13287
+       short   n_addr_taken;name::n_addr_taken567,13337
+       short   n_used;name::n_used568,13358
+       short   n_assigned_to;name::n_assigned_to569,13373
+       Loc     where;name::where570,13395
+       int     n_val;name::n_val571,13407
+       int     n_offset;name::n_offset574,13518
+       Pname   n_list;name::n_list575,13567
+       Pname   n_tbl_list;name::n_tbl_list576,13582
+               Pname   n_qualifier;name::n_qualifier578,13610
+               Ptable  n_realscope;name::n_realscope579,13659
+       name(name::name585,13815
+       ~name(name::~name586,13832
+       Pname   normalize(name::normalize588,13843
+       Pname   tdef(name::tdef589,13881
+       Pname   tname(name::tname590,13896
+       void    hide(name::hide591,13915
+       void    unhide(name::unhide592,13929
+       Pname   dcl(name::dcl594,13981
+       int     no_of_names(name::no_of_names595,14005
+       void    use(name::use596,14025
+       void    assign(name::assign597,14053
+       void    take_addr(name::take_addr598,14069
+       void    check_oper(name::check_oper599,14108
+       void    simpl(name::simpl600,14133
+       void    del(name::del601,14148
+       void    print(name::print602,14161
+       void    dcl_print(name::dcl_print603,14176
+       void    field_align(name::field_align604,14198
+       Pname   dofct(name::dofct605,14219
+extern int friend_in_class;610,14269
+struct stmt 615,14374
+       Pstmt   s;stmt::s617,14479
+       Pstmt   s_list;stmt::s_list618,14489
+       Loc     where;stmt::where619,14504
+               Pname   d;stmt::d621,14525
+               Pexpr   e2;stmt::e2622,14536
+               Pstmt   has_default;stmt::has_default623,14548
+               int     case_value;stmt::case_value624,14569
+               Ptype   ret_tp;stmt::ret_tp625,14587
+               Pexpr   e;stmt::e628,14616
+               bit     own_tbl;stmt::own_tbl629,14627
+               Pstmt   s2;stmt::s2630,14642
+       Ptable  memtbl;stmt::memtbl632,14658
+               Pstmt   for_init;stmt::for_init634,14683
+               Pstmt   else_stmt;stmt::else_stmt635,14701
+               Pstmt   case_list;stmt::case_list636,14720
+               bit     empty;stmt::empty637,14739
+       stmt(stmt::stmt640,14757
+       ~stmt(stmt::~stmt641,14781
+       void    del(stmt::del643,14804
+       void    print(stmt::print644,14817
+       void    dcl(stmt::dcl645,14832
+       void    reached(stmt::reached646,14845
+       Pstmt   simpl(stmt::simpl647,14862
+       Pstmt   expand(stmt::expand648,14878
+       Pstmt   copy(stmt::copy649,14895
+extern char* Neval;654,14934
+extern Pname dcl_temp(655,14954
+extern char* temp(656,14992
+extern Ptable scope;657,15032
+extern Ptable expand_tbl;658,15053
+extern Pname expand_fn;659,15079
+struct estmt 662,15111
+       estmt(estmt::estmt669,15303
+struct ifstmt 672,15379
+       ifstmt(ifstmt::ifstmt676,15484
+struct lstmt 680,15586
+       lstmt(lstmt::lstmt686,15650
+struct forstmt 689,15728
+       forstmt(forstmt::forstmt690,15759
+struct block 694,15880
+       block(block::block695,15919
+       void    dcl(block::dcl697,16001
+       Pstmt   simpl(block::simpl698,16020
+struct pair 703,16060
+       pair(pair::pair704,16096
+struct nlist 708,16173
+       Pname   head;nlist::head709,16188
+       Pname   tail;nlist::tail710,16201
+               nlist(nlist::nlist711,16214
+       void    add(nlist::add712,16230
+       void    add_list(nlist::add_list713,16282
+extern Pname name_unlist(716,16309
+struct slist 718,16344
+       Pstmt   head;slist::head719,16359
+       Pstmt   tail;slist::tail720,16372
+               slist(slist::slist721,16385
+       void    add(slist::add722,16430
+extern Pstmt stmt_unlist(725,16486
+struct elist 727,16521
+       Pexpr   head;elist::head728,16536
+       Pexpr   tail;elist::tail729,16549
+               elist(elist::elist730,16562
+       void    add(elist::add731,16607
+extern Pexpr expr_unlist(734,16659
+extern class dcl_context * cc;737,16707
+struct dcl_context 739,16739
+       Pname   c_this;dcl_context::c_this740,16760
+       Ptype   tot;dcl_context::tot741,16802
+       Pname   not;dcl_context::not742,16840
+       Pclass  cot;dcl_context::cot743,16886
+       Ptable  ftbl;dcl_context::ftbl744,16938
+       Pname   nof;dcl_context::nof745,16985
+       void    stack(dcl_context::stack747,17023
+       void    unstack(dcl_context::unstack748,17064
+#define MAXCONT        751,17095
+extern dcl_context ccvec[ccvec752,17114
+extern void yyerror(755,17157
+extern TOK back;756,17185
+extern char* line_format;760,17217
+extern Plist isf_list;762,17244
+extern Pstmt st_ilist;763,17267
+extern Pstmt st_dlist;764,17290
+extern Ptable sti_tbl;765,17313
+extern Ptable std_tbl;766,17336
+Pexpr try_to_coerce(767,17359
+extern bit can_coerce(768,17409
+extern Ptype np_promote(769,17446
+extern void new_key(770,17505
+extern Pname dcl_list;772,17544
+extern int over_call(773,17567
+extern Pname Nover;774,17603
+extern Pname Ntncheck;775,17623
+extern Pname Ncoerce;776,17646
+extern Nover_coerce;777,17668
+const MIA 779,17690
+struct iline 780,17705
+       Pname   fct_name;iline::fct_name781,17720
+       Pin     i_next;iline::i_next782,17754
+       Ptable  i_table;iline::i_table783,17767
+       Pname   local[iline::local784,17784
+       Pexpr   arg[iline::arg785,17838
+       Ptype   tp[iline::tp786,17887
+extern Pexpr curr_expr;789,17938
+extern Pin curr_icall;790,17962
+#define FUDGE111 791,17985
+extern Pstmt curr_loop;793,18007
+extern Pblock curr_block;794,18031
+extern Pstmt curr_switch;795,18057
+extern bit arg_err_suppress;796,18083
+extern loc last_line;797,18112
+extern no_of_undcl;799,18135
+extern no_of_badcall;800,18155
+extern Pname undcl,801,18177
+extern Pname undcl, badcall;801,18177
+extern int strlen(803,18207
+extern char* strcpy(804,18239
+extern int str_to_int(805,18280
+extern int c_strlen(806,18316
+extern int strcmp(809,18360
+extern Pname vec_new_fct;812,18419
+extern Pname vec_del_fct;813,18445
+extern int Nstd;815,18472
+extern int stcount;817,18555
+extern Pname find_hidden(819,18623
+Pexpr replace_temp(820,18656
+void make_res(821,18689
+Pexpr ptr_init(822,18710
+extern bit fake_sizeof;826,18755
+extern TOK lalex(828,18823
+extern fprintf(830,18856
+#define DB(831,18890
+#define DB(833,18920
+
+cp-src/burton.cpp,103
+::dummy::dummy test::dummy1(1,0
+::dummy::dummy test::dummy2(6,64
+::dummy::dummy test::dummy3(11,143
+
+cp-src/functions.cpp,807
+void Date::setDate 5,148
+void Date::plus 32,939
+void Date::minus 42,1229
+void Date::shift 52,1407
+Date & Date::operator = Date::operator =62,1628
+Date & Date::operator += Date::operator +=69,1789
+Date & Date::operator -= Date::operator -=78,1939
+Date & Date::operator ++ Date::operator ++87,2080
+Date & Date::operator -- Date::operator --96,2216
+int Date::operator - Date::operator -104,2331
+int Date::operator < Date::operator <112,2483
+int Date::operator > Date::operator >116,2557
+int Date::operator == Date::operator ==120,2631
+ostream& operator << operator <<124,2707
+istream& operator >> operator >>133,2943
+bool isLeap 159,3543
+bool isHoliday 163,3629
+void asort(173,3865
+void ReadVacation 186,4064
+void Debug 201,4523
+int WorkingDays(211,4867
+Date StartDay(226,5129
+
+cp-src/MDiagArray2.h,1538
+#define octave_MDiagArray2_h 29,870
+#undef LTGT35,967
+#define LTGT39,1031
+#define LTGT 42,1051
+class MDiagArray2;45,1087
+operator += operator +=48,1145
+operator -= operator -=51,1242
+operator * operator *54,1339
+operator / operator /57,1428
+operator * operator *60,1517
+operator + operator +63,1605
+operator - operator -66,1707
+product 69,1808
+operator - operator -72,1907
+class MDiagArray2 78,2022
+  MDiagArray2 MDiagArray2::MDiagArray282,2077
+  MDiagArray2 MDiagArray2::MDiagArray286,2154
+  MDiagArray2 MDiagArray2::MDiagArray287,2198
+  MDiagArray2 MDiagArray2::MDiagArray288,2254
+  MDiagArray2 MDiagArray2::MDiagArray289,2329
+  MDiagArray2 MDiagArray2::MDiagArray290,2387
+  MDiagArray2 MDiagArray2::MDiagArray291,2450
+  ~MDiagArray2 MDiagArray2::~MDiagArray293,2515
+  MDiagArray2<T>& operator = MDiagArray2::operator =95,2542
+      DiagArray2<T>::operator = MDiagArray2::operator =97,2603
+  operator MArray2<T> MDiagArray2::operator MArray2<T>101,2667
+  operator += MDiagArray2::operator +=116,2966
+  operator -= MDiagArray2::operator -=119,3057
+  friend MDiagArray2<T> operator * MDiagArray2::operator *123,3174
+  friend MDiagArray2<T> operator / MDiagArray2::operator /124,3253
+  friend MDiagArray2<T> operator * MDiagArray2::operator *128,3384
+  operator + MDiagArray2::operator +133,3544
+  operator - MDiagArray2::operator -136,3640
+  friend MDiagArray2<T> operator - MDiagArray2::operator -141,3803
+#undef LTGT144,3874
+#define INSTANTIATE_MDIAGARRAY_FRIENDS(146,3887
+
+cp-src/Pctest.h,816
+#define PCTEST_H24,837
+class TestRecord;42,1118
+    PctestActionValid,::PctestActionValid47,1286
+    PctestActionValidLasthop,::PctestActionValidLasthop49,1370
+    PctestActionFiltered,::PctestActionFiltered51,1481
+    PctestActionAbort  ::PctestActionAbort53,1566
+} PctestActionType;54,1616
+class Pctest 56,1637
+    Pctest(Pctest::Pctest59,1663
+    virtual ~Pctest(Pctest::~Pctest65,1813
+    virtual void TimeSyscall(Pctest::TimeSyscall68,1889
+    virtual char *GeneratePayload(Pctest::GeneratePayload71,1975
+    virtual char *GetTargetName(Pctest::GetTargetName77,2171
+    virtual PctestActionType GetAction(Pctest::GetAction86,2555
+    int initialized;Pctest::initialized93,2698
+    char *targetName;Pctest::targetName94,2743
+    struct timeval syscallTime;Pctest::syscallTime95,2785
+
+cp-src/Range.h,1136
+#define octave_Range_h 24,765
+class istream;30,840
+class ostream;31,855
+class Matrix;32,870
+Range35,891
+  Range Range::Range39,909
+  Range Range::Range42,995
+  Range Range::Range46,1130
+  Range Range::Range50,1248
+  double base Range::base54,1376
+  double limit Range::limit55,1425
+  double inc Range::inc56,1475
+  int nelem Range::nelem57,1523
+  bool all_elements_are_ints Range::all_elements_are_ints59,1571
+  Matrix matrix_value Range::matrix_value61,1615
+  double min Range::min63,1652
+  double max Range::max64,1679
+  void sort Range::sort66,1707
+  void set_base Range::set_base68,1728
+  void set_limit Range::set_limit69,1774
+  void set_inc Range::set_inc70,1821
+  friend ostream& operator << Range::operator <<72,1867
+  friend istream& operator >> Range::operator >>73,1928
+  void print_range Range::print_range75,1984
+  double rng_base;Range::rng_base79,2023
+  double rng_limit;Range::rng_limit80,2042
+  double rng_inc;Range::rng_inc81,2062
+  int rng_nelem;Range::rng_nelem83,2081
+  int nelem_internal Range::nelem_internal85,2099
+extern Range operator - operator -88,2138
+
+cp-src/screen.cpp,228
+unsigned char cursor_x,15,548
+unsigned char cursor_x, cursor_y;15,548
+static union REGS regs;16,582
+void goto_xy(18,607
+void hide_cursor(27,774
+void cursor_position(32,836
+void clear_screen(41,997
+void write_xyc(55,1247
+
+cp-src/screen.hpp,791
+#define __COLORS9,401
+enum COLORS 11,419
+    BLACK,COLORS::BLACK12,433
+    BLUE,COLORS::BLUE13,471
+    GREEN,COLORS::GREEN14,481
+    CYAN,COLORS::CYAN15,492
+    RED,COLORS::RED16,502
+    MAGENTA,COLORS::MAGENTA17,511
+    BROWN,COLORS::BROWN18,524
+    LIGHTGRAY,COLORS::LIGHTGRAY19,535
+    DARKGRAY,COLORS::DARKGRAY20,550
+    LIGHTBLUE,COLORS::LIGHTBLUE21,589
+    LIGHTGREEN,COLORS::LIGHTGREEN22,604
+    LIGHTCYAN,COLORS::LIGHTCYAN23,620
+    LIGHTRED,COLORS::LIGHTRED24,635
+    LIGHTMAGENTA,COLORS::LIGHTMAGENTA25,649
+    YELLOW,COLORS::YELLOW26,667
+    WHITECOLORS::WHITE27,679
+#define SCREEN_FP(31,700
+#define SCREEN_START 33,795
+void goto_xy(35,835
+void hide_cursor(36,883
+void cursor_position(37,907
+void clear_screen(38,935
+void write_xyc(39,960
+
+cp-src/conway.cpp,270
+#define max(12,357
+#define min(13,393
+const int num_rows 15,430
+const int num_columns 16,470
+class site *field_of_play[field_of_play18,499
+int site::total_surrounding(20,550
+void display(37,958
+void glider(50,1239
+void traffic_light(59,1478
+void main(67,1633
+
+cp-src/conway.hpp,483
+class site:site5,235
+    char x,site::x7,269
+    char x, y,site::y7,269
+    char x, y, alive,site::alive7,269
+    char x, y, alive, next_alive;site::next_alive7,269
+    int total_surrounding(site::total_surrounding8,303
+    site(site::site10,344
+    ~site(site::~site11,397
+    char read(site::read12,410
+    void set(site::set13,444
+    void clear(site::clear14,478
+    void compute_next_state(site::compute_next_state15,514
+    void step(site::step22,717
+
+cp-src/clheir.cpp,307
+const int max_num_generic_objects 9,298
+generic_object * object_registry[object_registry10,340
+void init_registry(12,400
+void step_everybody(19,527
+void discrete_location::clear_neighbors(31,852
+generic_object::generic_object(36,981
+generic_object::~generic_object(48,1255
+void agent::move(53,1353
+
+cp-src/clheir.hpp,1600
+extern void init_registry(10,452
+extern void step_everybody(11,485
+class generic_object13,520
+    int where_in_registry;generic_object::where_in_registry15,547
+    generic_object(generic_object::generic_object17,582
+    ~generic_object(generic_object::~generic_object19,724
+    virtual void compute_next_state(generic_object::compute_next_state21,842
+    virtual void step(generic_object::step22,888
+const int max_num_directions 31,1219
+class location:location33,1289
+    location(location::location43,1642
+    ~location(location::~location44,1661
+class irregular_location:irregular_location47,1686
+    double x,irregular_location::x49,1734
+    double x, y,irregular_location::y49,1734
+    double x, y, z;irregular_location::z49,1734
+    irregular_location(irregular_location::irregular_location51,1762
+    ~irregular_location(irregular_location::~irregular_location53,1854
+class discrete_location:discrete_location56,1889
+    int x,discrete_location::x58,1936
+    int x, y,discrete_location::y58,1936
+    int x, y, z;discrete_location::z58,1936
+    class location *neighbors[discrete_location::neighbors59,1953
+    void clear_neighbors(discrete_location::clear_neighbors60,2004
+    discrete_location(discrete_location::discrete_location62,2044
+    ~discrete_location(discrete_location::~discrete_location65,2154
+    void assign_neighbor(discrete_location::assign_neighbor66,2184
+class agent:agent75,2508
+    location *where;agent::where77,2549
+    agent(agent::agent79,2578
+    ~agent(agent::~agent80,2591
+    void move(agent::move81,2605
+
+cp-src/fail.C,438
+struct A 7,263
+          struct B A::B8,274
+                  struct C A::B::C9,289
+                          int x;A::B::C::x10,305
+                          C(A::B::C::C11,318
+                          operator int(A::B::C::operator int12,342
+                  typedef C T;A::B::T14,389
+          typedef B T2;A::T216,414
+class String;20,437
+class A 23,453
+       class B A::B24,463
+               class C A::B::C25,474
+               int f(A::B::f26,488
+int A::B::f(31,521
+main(37,571
+       class D 41,622
+               D(D::D43,659
+               int x;D::x44,694
+
+el-src/TAGTEST.EL,148
+(foo::defmumble bletch 1,0
+(defalias 'pending-delete-mode pending-delete-mode5,102
+(defalias (quote explicitly-quoted-pending-delete-mode)8,175
+
+el-src/emacs/lisp/progmodes/etags.el,5188
+(defvar tags-file-name 34,1034
+(defgroup etags 43,1498
+(defcustom tags-case-fold-search 47,1566
+(defcustom tags-table-list 59,2051
+(defcustom tags-compression-info-list69,2449
+(defcustom tags-add-tables 88,3231
+(defcustom tags-revert-without-query 98,3627
+(defvar tags-table-computed-list 103,3778
+(defvar tags-table-computed-list-for 112,4262
+(defvar tags-table-list-pointer 117,4510
+(defvar tags-table-list-started-at 121,4701
+(defvar tags-table-set-list 124,4821
+(defcustom find-tag-hook 129,5000
+(defcustom find-tag-default-function 137,5263
+(define-obsolete-variable-alias 
'find-tag-marker-ring-lengthfind-tag-marker-ring-length145,5602
+(defcustom tags-tag-face 148,5699
+(defcustom tags-apropos-verbose 154,5834
+(defcustom tags-apropos-additional-actions 160,5998
+(defvaralias 'find-tag-marker-ring find-tag-marker-ring183,6917
+(defvar default-tags-table-function 189,7097
+(defvar tags-location-ring 194,7323
+(defvar tags-table-files 201,7599
+(defvar tags-completion-table 206,7766
+(defvar tags-included-tables 209,7858
+(defvar next-file-list 212,7953
+(defvar tags-table-format-functions 217,8059
+(defvar file-of-tag-function 224,8440
+(defvar tags-table-files-function 228,8634
+(defvar tags-completion-table-function 230,8745
+(defvar snarf-tag-function 232,8840
+(defvar goto-tag-location-function 236,9049
+(defvar find-tag-regexp-search-function 239,9222
+(defvar find-tag-regexp-tag-order 241,9343
+(defvar find-tag-regexp-next-line-after-failure-p 243,9452
+(defvar find-tag-search-function 245,9572
+(defvar find-tag-tag-order 247,9679
+(defvar find-tag-next-line-after-failure-p 249,9774
+(defvar list-tags-function 251,9880
+(defvar tags-apropos-function 253,9968
+(defvar tags-included-tables-function 255,10062
+(defvar verify-tags-table-function 257,10181
+(defun initialize-new-tags-table 260,10292
+(defun tags-table-mode 276,10980
+(defun visit-tags-table 285,11245
+(defun tags-table-check-computed-list 321,12783
+(defun tags-table-extend-computed-list 360,14654
+(defun tags-expand-table-name 400,16367
+(defun tags-table-list-member 409,16710
+(defun tags-verify-table 421,17182
+(defun tags-table-including 470,19302
+(defun tags-next-table 522,21346
+(defun visit-tags-table-buffer 543,22203
+(defun tags-reset-tags-tables 712,28513
+(defun file-of-tag 731,29170
+(defun tags-table-files 740,29519
+(defun tags-included-tables 749,29869
+(defun tags-completion-table 755,30115
+(defun tags-lazy-completion-table 783,31309
+(defun tags-completion-at-point-function 799,31944
+(defun find-tag-tag 818,32694
+(defvar last-tag 837,33367
+(defun find-tag-interactive 840,33426
+(defvar find-tag-history 852,33841
+(defvar etags-case-fold-search)855,33906
+(defvar etags-syntax-table)856,33938
+(defvar local-find-tag-hook)857,33966
+(defun find-tag-noselect 860,34011
+(defun find-tag 932,37125
+(defun find-tag-other-window 959,38341
+(defun find-tag-other-frame 1000,40269
+(defun find-tag-regexp 1025,41443
+(defalias 'pop-tag-mark pop-tag-mark1049,42605
+(defvar tag-lines-already-matched 1052,42656
+(defun find-tag-in-order 1055,42763
+(defun tag-find-file-of-tag-noselect 1167,47109
+(defun tag-find-file-of-tag 1200,48955
+(defun etags-recognize-tags-table 1208,49181
+(defun etags-verify-tags-table 1241,50812
+(defun etags-file-of-tag 1246,51010
+(defun etags-tags-completion-table 1256,51345
+(defun etags-snarf-tag 1286,52551
+(defun etags-goto-tag-location 1324,54120
+(defun etags-list-tags 1388,56563
+(defmacro tags-with-face 1423,57838
+(defun etags-tags-apropos-additional 1431,58171
+(defun etags-tags-apropos 1465,59408
+(defun etags-tags-table-files 1527,61617
+(defun etags-tags-included-tables 1542,62053
+(defun tags-recognize-empty-tags-table 1559,62593
+(defun tag-exact-file-name-match-p 1587,63739
+(defun tag-file-name-match-p 1596,64132
+(defun tag-exact-match-p 1609,64688
+(defun tag-implicit-name-match-p 1620,65256
+(defun tag-symbol-match-p 1633,65856
+(defun tag-word-match-p 1643,66292
+(defun tag-partial-file-name-match-p 1652,66690
+(defun tag-any-match-p 1662,67134
+(defun tag-re-match-p 1667,67318
+(defcustom tags-loop-revert-buffers 1675,67567
+(defun next-file 1685,67976
+(defvar tags-loop-operate 1760,70890
+(defvar tags-loop-scan1763,70984
+(defun tags-loop-eval 1771,71314
+(defun tags-loop-continue 1782,71643
+(defun tags-search 1850,73949
+(defun tags-query-replace 1871,74775
+(defun tags-complete-tags-table-file 1896,75999
+(defun list-tags 1906,76378
+(defun tags-apropos 1934,77331
+(define-button-type 'tags-select-tags-tabletags-select-tags-table1957,78157
+(defun select-tags-table 1964,78396
+(defvar select-tags-table-mode-map 2019,80523
+(define-derived-mode select-tags-table-mode 2030,80906
+(defun select-tags-table-select 2034,81090
+(defun select-tags-table-quit 2043,81456
+(defun complete-tag 2049,81611
+(defconst etags--xref-limit 2074,82552
+(defvar etags-xref-find-definitions-tag-order 2076,82587
+(defun etags-xref-find 2082,82877
+(defun etags--xref-find-definitions 2096,83406
+(defclass xref-etags-location 2129,85121
+(defun xref-make-etags-location 2135,85344
+(cl-defmethod xref-location-marker 2139,85499
+(cl-defmethod xref-location-line 2146,85743
+
+erl-src/gs_dialog.erl,98
+-define(VERSION2,32
+behaviour_info(51,2177
+show(124,5458
+dialog_loop(219,9529
+test(252,10806
+
+erl-src/lines.erl,386
+-define(BREAK66,2377
+-define(dbg68,2437
+new(73,2565
+count(80,2686
+nth(87,2815
+append(104,3301
+replace(119,3816
+insert(138,4559
+insert_after(165,5501
+delete(192,6456
+convert_to_list(215,7110
+convert_from_list(220,7259
+replace_nth(229,7518
+insert_nth(234,7618
+insert_after_nth(239,7711
+delete_nth(244,7828
+split_at(252,8027
+balance_left(267,8451
+balance_right(282,8865
+
+erl-src/lists.erl,593
+member(21,663
+append(30,790
+reverse(48,1099
+nth(59,1310
+nthtail(64,1382
+prefix(73,1546
+suffix(83,1707
+last(92,1882
+seq(101,2058
+sum(109,2265
+duplicate(116,2432
+min(124,2628
+max(132,2837
+sublist(141,3083
+delete(152,3329
+sort(161,3483
+split_and_sort(165,3559
+merge(175,3811
+concat(190,4219
+thing_to_list(195,4300
+flatten(204,4606
+flat_length(222,5003
+keymember(239,5451
+keysearch(246,5609
+keydelete(253,5770
+keyreplace(260,5923
+keysort(266,6113
+split_and_keysort(270,6229
+keymerge(277,6504
+keymap(288,6851
+map(311,7829
+foldl(315,7919
+foldr(320,8037
+zf(325,8155
+
+f-src/entry.for,172
+      LOGICAL FUNCTION PRTPKG 3,75
+       ENTRY  SETPRT 194,3866
+       ENTRY  MSGSEL 395,8478
+     & intensity1(577,12231
+       character*(*) function foo(579,12307
+
+f-src/entry.strange_suffix,172
+      LOGICAL FUNCTION PRTPKG 3,75
+       ENTRY  SETPRT 194,3866
+       ENTRY  MSGSEL 395,8478
+     & intensity1(577,12231
+       character*(*) function foo(579,12307
+
+f-src/entry.strange,103
+       ENTRY  MSGSEL 193,4382
+     & intensity1(375,8135
+       character*(*) function foo(377,8211
+
+forth-src/test-forth.fth,408
+: a-forth-word 20,301
+99 constant a-forth-constant!22,343
+55 value a-forth-value?23,373
+create :a-forth-dictionary-entry24,397
+defer #a-defer-word27,460
+: (another-forth-word)(another-forth-word29,481
+   9   field   >field136,582
+   5   field   >field237,605
+constant (a-forth-constant(a-forth-constant38,628
+2000 buffer: #some-storage41,657
+code assemby-code-word 43,685
+: a-forth-word 50,870
+
+html-src/softwarelibero.html,198
+Cos'� il software libero?4,38
+Licenze d'uso di un programmalicenze65,2474
+Sfatiamo alcuni miti138,6064
+Il movimento open sourceoss191,7968
+Impatto pratico del software liberoimpatto231,9986
+
+html-src/index.shtml,104
+&nbsp;8,281
+In evidenza15,446
+Comunicati e iniziative32,974
+Ultime notizie dall'associazione63,2027
+
+html-src/algrthms.html,467
+Tutorial on Convolutional Coding with Viterbi Decoding--Description of the 
Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and 
Quantizing Algorithms7,276
+Descriptionalgorithms10,477
+Generating the Datagenalgorithm48,1953
+Convolutionallyconalgorithm55,2463
+Nextstatetable262,11331
+Outputoutputtable350,13571
+Mapping the Channel Symbolsmapping433,15786
+Adding Noise to theaddnoise439,16174
+Quantizing the Receivedquantizing469,18637
+
+html-src/software.html,438
+Francesco Potort� Software Page9,280
+Software that I wrote for supporting my research activitysimulation36,1400
+MTGmtg41,1484
+Fracasfracas65,2626
+GaliLEOgalileo101,4234
+Leasqrleasqr114,4679
+Free software that I wrote for the GNU project or for my personal or 
workgnu142,6067
+Etagsetags148,6182
+checkiso161,6731
+cgrep178,7549
+debian-bug.eldebian-bug190,7981
+tcpdump205,8566
+Links to interesting softwarelinks216,8893
+
+java-src/AWTEMul.java,4481
+public class AWTEventMulticaster 63,2111
+    protected EventListener a,AWTEventMulticaster.a69,2356
+    protected EventListener a, b;AWTEventMulticaster.b69,2356
+    protected 
AWTEventMulticaster(AWTEventMulticaster.AWTEventMulticaster77,2555
+    protected EventListener remove(AWTEventMulticaster.remove86,2820
+    public void componentResized(AWTEventMulticaster.componentResized102,3294
+    public void componentMoved(AWTEventMulticaster.componentMoved112,3626
+    public void componentShown(AWTEventMulticaster.componentShown122,3952
+    public void componentHidden(AWTEventMulticaster.componentHidden132,4280
+    public void componentAdded(AWTEventMulticaster.componentAdded142,4619
+    public void componentRemoved(AWTEventMulticaster.componentRemoved152,4959
+    public void focusGained(AWTEventMulticaster.focusGained162,5281
+    public void focusLost(AWTEventMulticaster.focusLost172,5572
+    public void keyTyped(AWTEventMulticaster.keyTyped182,5853
+    public void keyPressed(AWTEventMulticaster.keyPressed192,6129
+    public void keyReleased(AWTEventMulticaster.keyReleased202,6413
+    public void mouseClicked(AWTEventMulticaster.mouseClicked212,6704
+    public void mousePressed(AWTEventMulticaster.mousePressed222,7004
+    public void mouseReleased(AWTEventMulticaster.mouseReleased232,7306
+    public void mouseEntered(AWTEventMulticaster.mouseEntered242,7609
+    public void mouseExited(AWTEventMulticaster.mouseExited252,7907
+    public void mouseDragged(AWTEventMulticaster.mouseDragged262,8204
+    public void mouseMoved(AWTEventMulticaster.mouseMoved272,8512
+    public void windowOpened(AWTEventMulticaster.windowOpened282,8819
+    public void windowClosing(AWTEventMulticaster.windowClosing292,9125
+    public void windowClosed(AWTEventMulticaster.windowClosed302,9432
+    public void windowIconified(AWTEventMulticaster.windowIconified312,9742
+    public void 
windowDeiconified(AWTEventMulticaster.windowDeiconified322,10064
+    public void windowActivated(AWTEventMulticaster.windowActivated332,10389
+    public void 
windowDeactivated(AWTEventMulticaster.windowDeactivated342,10712
+    public void actionPerformed(AWTEventMulticaster.actionPerformed352,11037
+    public void 
itemStateChanged(AWTEventMulticaster.itemStateChanged362,11356
+    public void 
adjustmentValueChanged(AWTEventMulticaster.adjustmentValueChanged372,11690
+    public void 
textValueChanged(AWTEventMulticaster.textValueChanged376,11874
+    public static ComponentListener add(AWTEventMulticaster.add387,12225
+    public static ContainerListener add(AWTEventMulticaster.add397,12571
+    public static FocusListener add(AWTEventMulticaster.add407,12901
+    public static KeyListener add(AWTEventMulticaster.add417,13207
+    public static MouseListener add(AWTEventMulticaster.add427,13513
+    public static MouseMotionListener add(AWTEventMulticaster.add437,13855
+    public static WindowListener add(AWTEventMulticaster.add447,14197
+    public static ActionListener add(AWTEventMulticaster.add457,14519
+    public static ItemListener add(AWTEventMulticaster.add467,14833
+    public static AdjustmentListener add(AWTEventMulticaster.add477,15163
+    public static TextListener add(AWTEventMulticaster.add480,15310
+    public static ComponentListener 
remove(AWTEventMulticaster.remove490,15664
+    public static ContainerListener 
remove(AWTEventMulticaster.remove500,16044
+    public static FocusListener remove(AWTEventMulticaster.remove510,16408
+    public static KeyListener remove(AWTEventMulticaster.remove520,16748
+    public static MouseListener remove(AWTEventMulticaster.remove530,17088
+    public static MouseMotionListener 
remove(AWTEventMulticaster.remove540,17465
+    public static WindowListener remove(AWTEventMulticaster.remove550,17841
+    public static ActionListener remove(AWTEventMulticaster.remove560,18197
+    public static ItemListener remove(AWTEventMulticaster.remove570,18545
+    public static AdjustmentListener 
remove(AWTEventMulticaster.remove580,18909
+    public static TextListener remove(AWTEventMulticaster.remove583,19062
+    protected static EventListener 
addInternal(AWTEventMulticaster.addInternal597,19608
+    protected static EventListener 
removeInternal(AWTEventMulticaster.removeInternal614,20244
+    protected void saveInternal(AWTEventMulticaster.saveInternal628,20582
+    static void save(AWTEventMulticaster.save646,21131
+
+java-src/KeyEve.java,8202
+public class KeyEvent 36,1075
+    public static final int KEY_FIRST KeyEvent.KEY_FIRST41,1201
+    public static final int KEY_LAST KeyEvent.KEY_LAST46,1328
+    public static final int KEY_TYPED KeyEvent.KEY_TYPED52,1513
+    public static final int KEY_PRESSED KeyEvent.KEY_PRESSED57,1616
+    public static final int KEY_RELEASED KeyEvent.KEY_RELEASED62,1744
+    public static final int VK_ENTER KeyEvent.VK_ENTER85,2950
+    public static final int VK_BACK_SPACE KeyEvent.VK_BACK_SPACE86,3004
+    public static final int VK_TAB KeyEvent.VK_TAB87,3058
+    public static final int VK_CANCEL KeyEvent.VK_CANCEL88,3112
+    public static final int VK_CLEAR KeyEvent.VK_CLEAR89,3166
+    public static final int VK_SHIFT KeyEvent.VK_SHIFT90,3220
+    public static final int VK_CONTROL KeyEvent.VK_CONTROL91,3274
+    public static final int VK_ALT KeyEvent.VK_ALT92,3328
+    public static final int VK_PAUSE KeyEvent.VK_PAUSE93,3382
+    public static final int VK_CAPS_LOCK KeyEvent.VK_CAPS_LOCK94,3436
+    public static final int VK_ESCAPE KeyEvent.VK_ESCAPE95,3490
+    public static final int VK_SPACE KeyEvent.VK_SPACE96,3544
+    public static final int VK_PAGE_UP KeyEvent.VK_PAGE_UP97,3598
+    public static final int VK_PAGE_DOWN KeyEvent.VK_PAGE_DOWN98,3652
+    public static final int VK_END KeyEvent.VK_END99,3706
+    public static final int VK_HOME KeyEvent.VK_HOME100,3760
+    public static final int VK_LEFT KeyEvent.VK_LEFT101,3814
+    public static final int VK_UP KeyEvent.VK_UP102,3868
+    public static final int VK_RIGHT KeyEvent.VK_RIGHT103,3922
+    public static final int VK_DOWN KeyEvent.VK_DOWN104,3976
+    public static final int VK_COMMA KeyEvent.VK_COMMA105,4030
+    public static final int VK_PERIOD KeyEvent.VK_PERIOD106,4084
+    public static final int VK_SLASH KeyEvent.VK_SLASH107,4138
+    public static final int VK_0 KeyEvent.VK_0110,4268
+    public static final int VK_1 KeyEvent.VK_1111,4322
+    public static final int VK_2 KeyEvent.VK_2112,4376
+    public static final int VK_3 KeyEvent.VK_3113,4430
+    public static final int VK_4 KeyEvent.VK_4114,4484
+    public static final int VK_5 KeyEvent.VK_5115,4538
+    public static final int VK_6 KeyEvent.VK_6116,4592
+    public static final int VK_7 KeyEvent.VK_7117,4646
+    public static final int VK_8 KeyEvent.VK_8118,4700
+    public static final int VK_9 KeyEvent.VK_9119,4754
+    public static final int VK_SEMICOLON KeyEvent.VK_SEMICOLON121,4809
+    public static final int VK_EQUALS KeyEvent.VK_EQUALS122,4863
+    public static final int VK_A KeyEvent.VK_A125,4993
+    public static final int VK_B KeyEvent.VK_B126,5047
+    public static final int VK_C KeyEvent.VK_C127,5101
+    public static final int VK_D KeyEvent.VK_D128,5155
+    public static final int VK_E KeyEvent.VK_E129,5209
+    public static final int VK_F KeyEvent.VK_F130,5263
+    public static final int VK_G KeyEvent.VK_G131,5317
+    public static final int VK_H KeyEvent.VK_H132,5371
+    public static final int VK_I KeyEvent.VK_I133,5425
+    public static final int VK_J KeyEvent.VK_J134,5479
+    public static final int VK_K KeyEvent.VK_K135,5533
+    public static final int VK_L KeyEvent.VK_L136,5587
+    public static final int VK_M KeyEvent.VK_M137,5641
+    public static final int VK_N KeyEvent.VK_N138,5695
+    public static final int VK_O KeyEvent.VK_O139,5749
+    public static final int VK_P KeyEvent.VK_P140,5803
+    public static final int VK_Q KeyEvent.VK_Q141,5857
+    public static final int VK_R KeyEvent.VK_R142,5911
+    public static final int VK_S KeyEvent.VK_S143,5965
+    public static final int VK_T KeyEvent.VK_T144,6019
+    public static final int VK_U KeyEvent.VK_U145,6073
+    public static final int VK_V KeyEvent.VK_V146,6127
+    public static final int VK_W KeyEvent.VK_W147,6181
+    public static final int VK_X KeyEvent.VK_X148,6235
+    public static final int VK_Y KeyEvent.VK_Y149,6289
+    public static final int VK_Z KeyEvent.VK_Z150,6343
+    public static final int VK_OPEN_BRACKET KeyEvent.VK_OPEN_BRACKET152,6398
+    public static final int VK_BACK_SLASH KeyEvent.VK_BACK_SLASH153,6452
+    public static final int VK_CLOSE_BRACKET 
KeyEvent.VK_CLOSE_BRACKET154,6506
+    public static final int VK_NUMPAD0 KeyEvent.VK_NUMPAD0156,6561
+    public static final int VK_NUMPAD1 KeyEvent.VK_NUMPAD1157,6615
+    public static final int VK_NUMPAD2 KeyEvent.VK_NUMPAD2158,6669
+    public static final int VK_NUMPAD3 KeyEvent.VK_NUMPAD3159,6723
+    public static final int VK_NUMPAD4 KeyEvent.VK_NUMPAD4160,6777
+    public static final int VK_NUMPAD5 KeyEvent.VK_NUMPAD5161,6831
+    public static final int VK_NUMPAD6 KeyEvent.VK_NUMPAD6162,6885
+    public static final int VK_NUMPAD7 KeyEvent.VK_NUMPAD7163,6939
+    public static final int VK_NUMPAD8 KeyEvent.VK_NUMPAD8164,6993
+    public static final int VK_NUMPAD9 KeyEvent.VK_NUMPAD9165,7047
+    public static final int VK_MULTIPLY KeyEvent.VK_MULTIPLY166,7101
+    public static final int VK_ADD KeyEvent.VK_ADD167,7155
+    public static final int VK_SEPARATER KeyEvent.VK_SEPARATER168,7209
+    public static final int VK_SUBTRACT KeyEvent.VK_SUBTRACT169,7263
+    public static final int VK_DECIMAL KeyEvent.VK_DECIMAL170,7317
+    public static final int VK_DIVIDE KeyEvent.VK_DIVIDE171,7371
+    public static final int VK_F1 KeyEvent.VK_F1172,7425
+    public static final int VK_F2 KeyEvent.VK_F2173,7479
+    public static final int VK_F3 KeyEvent.VK_F3174,7533
+    public static final int VK_F4 KeyEvent.VK_F4175,7587
+    public static final int VK_F5 KeyEvent.VK_F5176,7641
+    public static final int VK_F6 KeyEvent.VK_F6177,7695
+    public static final int VK_F7 KeyEvent.VK_F7178,7749
+    public static final int VK_F8 KeyEvent.VK_F8179,7803
+    public static final int VK_F9 KeyEvent.VK_F9180,7857
+    public static final int VK_F10 KeyEvent.VK_F10181,7911
+    public static final int VK_F11 KeyEvent.VK_F11182,7965
+    public static final int VK_F12 KeyEvent.VK_F12183,8019
+    public static final int VK_DELETE KeyEvent.VK_DELETE184,8073
+    public static final int VK_NUM_LOCK KeyEvent.VK_NUM_LOCK185,8143
+    public static final int VK_SCROLL_LOCK KeyEvent.VK_SCROLL_LOCK186,8197
+    public static final int VK_PRINTSCREEN KeyEvent.VK_PRINTSCREEN188,8252
+    public static final int VK_INSERT KeyEvent.VK_INSERT189,8306
+    public static final int VK_HELP KeyEvent.VK_HELP190,8360
+    public static final int VK_META KeyEvent.VK_META191,8414
+    public static final int VK_BACK_QUOTE KeyEvent.VK_BACK_QUOTE193,8469
+    public static final int VK_QUOTE KeyEvent.VK_QUOTE194,8523
+    public static final int VK_FINAL KeyEvent.VK_FINAL197,8608
+    public static final int VK_CONVERT KeyEvent.VK_CONVERT198,8662
+    public static final int VK_NONCONVERT KeyEvent.VK_NONCONVERT199,8716
+    public static final int VK_ACCEPT KeyEvent.VK_ACCEPT200,8770
+    public static final int VK_MODECHANGE KeyEvent.VK_MODECHANGE201,8824
+    public static final int VK_KANA KeyEvent.VK_KANA202,8878
+    public static final int VK_KANJI KeyEvent.VK_KANJI203,8932
+    public static final int VK_UNDEFINED KeyEvent.VK_UNDEFINED208,9062
+    public static final char CHAR_UNDEFINED KeyEvent.CHAR_UNDEFINED214,9259
+    int  keyCode;KeyEvent.keyCode216,9313
+    char keyChar;KeyEvent.keyChar217,9331
+     private static final long serialVersionUID 
KeyEvent.serialVersionUID222,9398
+    public KeyEvent(KeyEvent.KeyEvent234,9912
+    public KeyEvent(KeyEvent.KeyEvent252,10510
+    public int getKeyCode(KeyEvent.getKeyCode261,10836
+    public void setKeyCode(KeyEvent.setKeyCode265,10897
+    public void setKeyChar(KeyEvent.setKeyChar269,10978
+    public void setModifiers(KeyEvent.setModifiers273,11060
+    public char getKeyChar(KeyEvent.getKeyChar282,11331
+    public static String getKeyText(KeyEvent.getKeyText290,11561
+    public static String 
getKeyModifiersText(KeyEvent.getKeyModifiersText377,16662
+    public boolean isActionKey(KeyEvent.isActionKey403,17618
+    public String paramString(KeyEvent.paramString407,17704
+
+java-src/SMan.java,5665
+class SecurityManager 80,3387
+    protected boolean inCheck;SecurityManager.inCheck87,3576
+    private boolean initialized SecurityManager.initialized90,3678
+    public boolean getInCheck(SecurityManager.getInCheck101,4075
+    protected SecurityManager(SecurityManager.SecurityManager114,4497
+    protected native Class[] 
getClassContext(SecurityManager.getClassContext130,5038
+    protected native ClassLoader 
currentClassLoader(SecurityManager.currentClassLoader142,5529
+    protected Class 
currentLoadedClass(SecurityManager.currentLoadedClass149,5707
+    protected native int classDepth(SecurityManager.classDepth162,6167
+    protected native int 
classLoaderDepth(SecurityManager.classLoaderDepth174,6668
+    protected boolean inClass(SecurityManager.inClass184,7034
+    protected boolean inClassLoader(SecurityManager.inClassLoader196,7372
+    public Object 
getSecurityContext(SecurityManager.getSecurityContext221,8485
+    public void 
checkCreateClassLoader(SecurityManager.checkCreateClassLoader238,9069
+    public void checkAccess(SecurityManager.checkAccess268,10298
+    public void checkAccess(SecurityManager.checkAccess298,11632
+    public void checkExit(SecurityManager.checkExit323,12649
+    public void checkExec(SecurityManager.checkExec349,13734
+    public void checkLink(SecurityManager.checkLink375,14813
+    public void checkRead(SecurityManager.checkRead394,15485
+    public void checkRead(SecurityManager.checkRead412,16111
+    public void checkRead(SecurityManager.checkRead434,17017
+    public void checkWrite(SecurityManager.checkWrite453,17706
+    public void checkWrite(SecurityManager.checkWrite471,18337
+    public void checkDelete(SecurityManager.checkDelete493,19165
+    public void checkConnect(SecurityManager.checkConnect517,20119
+    public void checkConnect(SecurityManager.checkConnect543,21254
+    public void checkListen(SecurityManager.checkListen561,21910
+    public void checkAccept(SecurityManager.checkAccept585,22887
+    public void checkMulticast(SecurityManager.checkMulticast597,23272
+    public void checkMulticast(SecurityManager.checkMulticast610,23732
+    public void 
checkPropertiesAccess(SecurityManager.checkPropertiesAccess632,24609
+    public void 
checkPropertyAccess(SecurityManager.checkPropertyAccess654,25449
+    public boolean 
checkTopLevelWindow(SecurityManager.checkTopLevelWindow680,26580
+    public void 
checkPrintJobAccess(SecurityManager.checkPrintJobAccess689,26763
+    public void 
checkSystemClipboardAccess(SecurityManager.checkSystemClipboardAccess698,26958
+    public void 
checkAwtEventQueueAccess(SecurityManager.checkAwtEventQueueAccess707,27159
+    public void 
checkPackageAccess(SecurityManager.checkPackageAccess729,27966
+    public void 
checkPackageDefinition(SecurityManager.checkPackageDefinition751,28803
+    public void checkSetFactory(SecurityManager.checkSetFactory775,29929
+    public void checkMemberAccess(SecurityManager.checkMemberAccess786,30209
+    public void 
checkSecurityAccess(SecurityManager.checkSecurityAccess796,30430
+    private native Class 
currentLoadedClass0(SecurityManager.currentLoadedClass0800,30522
+    public ThreadGroup getThreadGroup(SecurityManager.getThreadGroup811,30923
+class NullSecurityManager 817,31025
+    public void 
checkCreateClassLoader(NullSecurityManager.checkCreateClassLoader818,31077
+    public void checkAccess(NullSecurityManager.checkAccess819,31123
+    public void checkAccess(NullSecurityManager.checkAccess820,31165
+    public void checkExit(NullSecurityManager.checkExit821,31212
+    public void checkExec(NullSecurityManager.checkExec822,31254
+    public void checkLink(NullSecurityManager.checkLink823,31296
+    public void checkRead(NullSecurityManager.checkRead824,31338
+    public void checkRead(NullSecurityManager.checkRead825,31387
+    public void checkRead(NullSecurityManager.checkRead826,31430
+    public void checkWrite(NullSecurityManager.checkWrite827,31489
+    public void checkWrite(NullSecurityManager.checkWrite828,31539
+    public void checkDelete(NullSecurityManager.checkDelete829,31583
+    public void checkConnect(NullSecurityManager.checkConnect830,31628
+    public void checkConnect(NullSecurityManager.checkConnect831,31684
+    public void checkListen(NullSecurityManager.checkListen832,31756
+    public void checkAccept(NullSecurityManager.checkAccept833,31798
+    public void checkMulticast(NullSecurityManager.checkMulticast834,31853
+    public void checkMulticast(NullSecurityManager.checkMulticast835,31907
+    public void 
checkPropertiesAccess(NullSecurityManager.checkPropertiesAccess836,31971
+    public void 
checkPropertyAccess(NullSecurityManager.checkPropertyAccess837,32015
+    public void 
checkPropertyAccess(NullSecurityManager.checkPropertyAccess838,32067
+    public boolean 
checkTopLevelWindow(NullSecurityManager.checkTopLevelWindow839,32131
+    public void 
checkPrintJobAccess(NullSecurityManager.checkPrintJobAccess840,32202
+    public void 
checkSystemClipboardAccess(NullSecurityManager.checkSystemClipboardAccess841,32244
+    public void 
checkAwtEventQueueAccess(NullSecurityManager.checkAwtEventQueueAccess842,32293
+    public void 
checkPackageAccess(NullSecurityManager.checkPackageAccess843,32340
+    public void 
checkPackageDefinition(NullSecurityManager.checkPackageDefinition844,32391
+    public void checkSetFactory(NullSecurityManager.checkSetFactory845,32446
+    public void 
checkMemberAccess(NullSecurityManager.checkMemberAccess846,32484
+    public void 
checkSecurityAccess(NullSecurityManager.checkSecurityAccess847,32546
+
+java-src/SysCol.java,4762
+public final class SystemColor 37,1402
+    public final static int DESKTOP SystemColor.DESKTOP42,1555
+    public final static int ACTIVE_CAPTION SystemColor.ACTIVE_CAPTION47,1677
+    public final static int ACTIVE_CAPTION_TEXT 
SystemColor.ACTIVE_CAPTION_TEXT52,1800
+    public final static int ACTIVE_CAPTION_BORDER 
SystemColor.ACTIVE_CAPTION_BORDER57,1930
+    public final static int INACTIVE_CAPTION 
SystemColor.INACTIVE_CAPTION62,2068
+    public final static int INACTIVE_CAPTION_TEXT 
SystemColor.INACTIVE_CAPTION_TEXT67,2195
+    public final static int INACTIVE_CAPTION_BORDER 
SystemColor.INACTIVE_CAPTION_BORDER72,2329
+    public final static int WINDOW SystemColor.WINDOW77,2459
+    public final static int WINDOW_BORDER SystemColor.WINDOW_BORDER82,2568
+    public final static int WINDOW_TEXT SystemColor.WINDOW_TEXT87,2682
+    public final static int MENU SystemColor.MENU92,2798
+    public final static int MENU_TEXT SystemColor.MENU_TEXT97,2902
+    public final static int TEXT SystemColor.TEXT102,3017
+    public final static int TEXT_TEXT SystemColor.TEXT_TEXT107,3121
+    public final static int TEXT_HIGHLIGHT SystemColor.TEXT_HIGHLIGHT112,3235
+    public final static int TEXT_HIGHLIGHT_TEXT 
SystemColor.TEXT_HIGHLIGHT_TEXT117,3359
+    public final static int TEXT_INACTIVE_TEXT 
SystemColor.TEXT_INACTIVE_TEXT122,3487
+    public final static int CONTROL SystemColor.CONTROL127,3614
+    public final static int CONTROL_TEXT SystemColor.CONTROL_TEXT132,3724
+    public final static int CONTROL_HIGHLIGHT 
SystemColor.CONTROL_HIGHLIGHT137,3844
+    public final static int CONTROL_LT_HIGHLIGHT 
SystemColor.CONTROL_LT_HIGHLIGHT142,3975
+    public final static int CONTROL_SHADOW SystemColor.CONTROL_SHADOW147,4100
+    public final static int CONTROL_DK_SHADOW 
SystemColor.CONTROL_DK_SHADOW152,4224
+    public final static int SCROLLBAR SystemColor.SCROLLBAR157,4352
+    public final static int INFO SystemColor.INFO162,4467
+    public final static int INFO_TEXT SystemColor.INFO_TEXT167,4571
+    public final static int NUM_COLORS SystemColor.NUM_COLORS172,4681
+    public final static SystemColor desktop SystemColor.desktop177,4790
+    public final static SystemColor activeCaption 
SystemColor.activeCaption182,4945
+    public final static SystemColor activeCaptionText 
SystemColor.activeCaptionText187,5107
+    public final static SystemColor activeCaptionBorder 
SystemColor.activeCaptionBorder192,5280
+    public final static SystemColor inactiveCaption 
SystemColor.inactiveCaption197,5470
+    public final static SystemColor inactiveCaptionText 
SystemColor.inactiveCaptionText202,5645
+    public final static SystemColor inactiveCaptionBorder 
SystemColor.inactiveCaptionBorder207,5830
+    public final static SystemColor window SystemColor.window212,5996
+    public final static SystemColor windowBorder 
SystemColor.windowBorder217,6126
+    public final static SystemColor windowText SystemColor.windowText222,6267
+    public final static SystemColor menu SystemColor.menu227,6408
+    public final static SystemColor menuText SystemColor.menuText232,6530
+    public final static SystemColor text SystemColor.text237,6677
+    public final static SystemColor textText SystemColor.textText242,6809
+    public final static SystemColor textHighlight 
SystemColor.textHighlight247,6957
+    public final static SystemColor textHighlightText 
SystemColor.textHighlightText252,7109
+    public final static SystemColor textInactiveText 
SystemColor.textInactiveText257,7267
+    public final static SystemColor control SystemColor.control262,7431
+    public final static SystemColor controlText 
SystemColor.controlText267,7569
+    public final static SystemColor controlHighlight 
SystemColor.controlHighlight272,7727
+    public final static SystemColor controlLtHighlight 
SystemColor.controlLtHighlight277,7897
+    public final static SystemColor controlShadow 
SystemColor.controlShadow282,8069
+    public final static SystemColor controlDkShadow 
SystemColor.controlDkShadow287,8227
+    public final static SystemColor scrollbar SystemColor.scrollbar292,8384
+    public final static SystemColor info SystemColor.info297,8532
+    public final static SystemColor infoText SystemColor.infoText302,8664
+    private static int[] systemColors SystemColor.systemColors308,8885
+    private static final long serialVersionUID 
SystemColor.serialVersionUID340,10406
+    static SystemColor.static342,10478
+    private static void 
updateSystemColors(SystemColor.updateSystemColors349,10617
+    private SystemColor(SystemColor.SystemColor357,10885
+    public int getRGB(SystemColor.getRGB370,11245
+    public String toString(SystemColor.toString377,11388
+
+java-src/TG.java,2547
+class ThreadGroup 54,2104
+    ThreadGroup parent;ThreadGroup.parent55,2124
+    String name;ThreadGroup.name56,2148
+    int maxPriority;ThreadGroup.maxPriority57,2165
+    boolean destroyed;ThreadGroup.destroyed58,2186
+    boolean daemon;ThreadGroup.daemon59,2209
+    boolean vmAllowSuspension;ThreadGroup.vmAllowSuspension60,2229
+    int nthreads;ThreadGroup.nthreads62,2261
+    Thread threads[ThreadGroup.threads63,2279
+    int ngroups;ThreadGroup.ngroups65,2302
+    ThreadGroup groups[ThreadGroup.groups66,2319
+    private ThreadGroup(ThreadGroup.ThreadGroup72,2495
+    public ThreadGroup(ThreadGroup.ThreadGroup84,2848
+    public ThreadGroup(ThreadGroup.ThreadGroup105,3714
+    public final String getName(ThreadGroup.getName124,4189
+    public final ThreadGroup getParent(ThreadGroup.getParent135,4492
+    public final int getMaxPriority(ThreadGroup.getMaxPriority148,4867
+    public final boolean isDaemon(ThreadGroup.isDaemon161,5305
+    public synchronized boolean isDestroyed(ThreadGroup.isDestroyed170,5470
+    public final void setDaemon(ThreadGroup.setDaemon192,6368
+    public final void setMaxPriority(ThreadGroup.setMaxPriority213,7110
+    public final boolean parentOf(ThreadGroup.parentOf246,8106
+    public final void checkAccess(ThreadGroup.checkAccess268,8834
+    public int activeCount(ThreadGroup.activeCount283,9286
+    public int enumerate(ThreadGroup.enumerate322,10497
+    public int enumerate(ThreadGroup.enumerate344,11481
+    private int enumerate(ThreadGroup.enumerate348,11584
+    public int activeGroupCount(ThreadGroup.activeGroupCount389,12588
+    public int enumerate(ThreadGroup.enumerate425,13727
+    public int enumerate(ThreadGroup.enumerate445,14595
+    private int enumerate(ThreadGroup.enumerate449,14703
+    public final void stop(ThreadGroup.stop499,16212
+    public final void suspend(ThreadGroup.suspend537,17477
+    public final void resume(ThreadGroup.resume575,18749
+    public final void destroy(ThreadGroup.destroy607,19779
+    private final void add(ThreadGroup.add643,20704
+    private void remove(ThreadGroup.remove668,21402
+    void add(ThreadGroup.add697,22142
+    void remove(ThreadGroup.remove722,22808
+    public void list(ThreadGroup.list751,23503
+    void list(ThreadGroup.list754,23556
+    public void uncaughtException(ThreadGroup.uncaughtException810,25512
+    public boolean 
allowThreadSuspension(ThreadGroup.allowThreadSuspension823,25823
+    public String toString(ThreadGroup.toString837,26142
+
+lua-src/allegro.lua,400
+local function get_layer_by_name 7,175
+local function count_layers 33,621
+function GetLayerByName 54,980
+function GetUniqueLayerName 65,1204
+function SelectLayer 76,1415
+function NewLayer 86,1773
+function NewLayerSet 144,3226
+function RemoveLayer 170,3750
+function MoveLayerTop 211,4767
+function MoveLayerBottom 223,5079
+function MoveLayerBefore 236,5457
+function MoveLayerAfter 258,6090
+
+make-src/Makefile,1156
+LATEST=1,0
+NONSRCS=35,1578
+CPPFLAGS=49,2191
+LDFLAGS=50,2260
+FASTCFLAGS=55,2531
+FILTER=58,2642
+       @-$($72,3064
+       @-$($73,3113
+       @-$($74,3177
+       @-$($75,3223
+       @-$($76,3291
+       @-$($77,3383
+       @$(81,3466
+       @$(82,3514
+       @$(83,3577
+       @$(84,3622
+       @$(85,3689
+       @$(86,3780
+${CHECKOBJS}: CFLAGS=88,3806
+       @env CHECKEROPTS=92,3922
+       @$(98,4094
+       @$(106,4250
+       @$(110,4374
+       @$(114,4500
+       @for i in $(140,5315
+       @for i in $(SRCS); do echo $$i;140,5315
+       $(160,6053
+       $(163,6114
+       $(166,6177
+       $(169,6228
+       $(172,6317
+       sdiff --suppress-common-lines --width=width186,6614
+       sdiff --suppress-common-lines --width=width189,6703
+       sdiff --suppress-common-lines --width=width192,6791
+       sdiff --suppress-common-lines --width=width195,6880
+       TEXTAGS=204,7122
+       TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* 
--regex=regex204,7122
+       ${RUN} etags12 --members -o $@ --regex=regex207,7239
+       ${RUN} ./ctags -o $@ --regex=regex213,7388
+       ${RUN} ctags$* -wtTd --globals --members -o $@ --regex=regex216,7464
+       TEXTAGS=219,7583
+       TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ 
--regex=regex219,7583
+       ${RUN} ./extags -e --regex-c=c222,7710
+
+objc-src/Subprocess.h,98
+#define Subprocess 41,1217
+#define BUFFERSIZE 43,1267
address@hidden Subprocess:Subprocess45,1292
+
+objc-src/Subprocess.m,505
+#define        PTY_TEMPLATE 20,494
+#define        PTY_LENGTH 21,528
+static void showError(23,551
address@hidden Subprocess(Private)Subprocess(Private)32,737
+- childDidExit39,851
+- fdHandler:67,1589
+showError 98,2360
+fdHandler 112,2785
+getptys 119,2907
+- init:183,4815
+    andStdErr:init:withDelegate:andPtySupport:andStdErr:197,5147
+- send:(const char *)string withNewline:send:withNewline:300,7436
+- send:308,7599
+- terminateInput314,7689
+- terminate:321,7810
+- setDelegate:332,7961
+- delegate338,8031
+
+objc-src/PackInsp.h,109
+#define NUMSTATS       36,1101
+#define TYPESTOSTAT    37,1120
address@hidden PackageInspector:PackageInspector39,1172
+
+objc-src/PackInsp.m,1360
+static const char RCSid[RCSid30,1032
+#define VERSION        34,1116
+#   define DEBUG 37,1155
+#define LISTCONTENTS   39,1181
+#define OPENBUTTON     47,1352
+#define LISTCONTENTSBUTTON     48,1449
+#define LISTDESCRIPTIONBUTTON  49,1562
+#define STATE_UNINSTALLED      52,1687
+#define STATE_INSTALLED        53,1807
+#define STATE_COMPRESSD        54,1948
+#define SIZEFORMAT     57,2152
+#define KBYTES 58,2362
+#define MBYTES 59,2473
+#define LOCALIZE(61,2585
+#define LOCALIZE_ARCH(62,2668
++newnew67,2802
+-showInfo:showInfo:93,3417
+-revert:revert:107,3737
+-ok:ok:136,4297
+-loadload143,4424
+#define LOOKUP(156,4826
+#undef LOOKUP176,5694
+-loadKeyValuesFrom:(const char *)type 
inTable:loadKeyValuesFrom:inTable:186,5852
+-loadContentsOf:(const char *)type inTable:loadContentsOf:inTable:238,7079
+-loadImageloadImage257,7552
+#define STAT_EQ(275,7940
+-(BOOL)shouldLoad280,8116
+-toggleDescriptiontoggleDescription301,8626
+-(const char *)getPath:(char *)buf forType:getPath:forType:317,8899
+-setRevertButtonTitlesetRevertButtonTitle333,9320
+-(const char *)formatSize:(const char *)size inBuf:formatSize:inBuf:344,9525
+#define WORKING        368,10045
+-(void)getArchs370,10100
+-(void)addArchs:385,10520
+-subprocess:(Subprocess *)sender output:subprocess:output:428,11351
+-subprocessDone:subprocessDone:436,11484
+static void openInWorkspace(446,11634
+-open:open:464,12063
+
+objcpp-src/SimpleCalc.H,41
address@hidden SimpleCalc:SimpleCalc14,400
+
+objcpp-src/SimpleCalc.M,300
+- init52,1747
+- appendToDisplay:60,1933
+- registerAction:70,2210
+- decimalKey:77,2348
+- numberKeys:91,2661
+- equalsKey:112,3192
+- operationKeys:131,3680
+- clearKey:153,4301
+- clearAllKey:160,4410
+- appDidInit:168,4591
+- windowWillClose:178,4882
+- infoPanel:186,5132
+- helpPanel:198,5482
+
+pas-src/common.pas,1875
+procedure InitializeStringPackage;26,527
+function newtextstring;34,874
+procedure disposetextstring;52,1404
+function ConcatT;78,2066
+function AppendTextString;112,3238
+function CopyTextString;132,3947
+procedure CONVERT_CHARSTRING_TO_VALUE;151,4505
+procedure append_string;172,5166
+function To_Upper;186,5462
+function To_Lower;194,5617
+function EmptyNmStr(209,6213
+function chartonmstr;219,6436
+function LowerCaseNmStr;230,6682
+function concatenatenamestrings;242,7007
+procedure writenamestring;263,7517
+function IsControlChar;277,7928
+function namestringequal;283,8079
+function NameStringLess;302,8539
+function IsControlCharName(343,9710
+function SubString;358,10208
+function SkipChars;379,10791
+function RemoveUnderlineControl;397,11311
+procedure First100Chars;427,12162
+procedure SkipSpaces;462,13298
+function SkipBlanks;477,13782
+function stripname;505,14595
+function Locate;522,15039
+function NameHasChar;543,15581
+function integertonmstr;561,16134
+function NmStrToInteger;585,16901
+function AddNullToNmStr;600,17317
+function ValToNmStr;611,17585
+function ChangeFileType;625,18037
+function StripPath;647,18734
+function ReprOfChar;675,19343
+procedure ExtractCommentInfo;702,20749
+procedure INSERT_TREE_NODE;784,24053
+function GetNameList;920,27926
+procedure DisposeANameList(925,28010
+procedure DisposeNameList;938,28340
+function GetNewNameListNode;943,28409
+function insertname;972,29051
+procedure InitNameList;988,29471
+procedure InitNameStringPool;998,29767
+procedure NewNameString;1004,29867
+procedure ReleaseNameString;1022,30232
+procedure SDTrefStringToRec 1045,30741
+procedure SDTrefSkipSpaces;1059,31092
+function SDTrefIsEnd 1070,31323
+function SDTrefGetInteger 1082,31529
+procedure SDTrefRecToString 1303,37546
+function NmStrToErrStr;1497,42305
+function ErrStrToNmStr;1509,42557
+function GetTextRef;1529,43112
+
+php-src/lce_functions.php,2864
+  define("LCE_FUNCTIONS"LCE_FUNCTIONS4,38
+  define("LCE_UNKNOWN"LCE_UNKNOWN9,145
+  define("LCE_WS"LCE_WS11,194
+  define("LCE_COMMENT"LCE_COMMENT13,244
+  define("LCE_COMMENT_USER"LCE_COMMENT_USER15,303
+  define("LCE_COMMENT_TOOL"LCE_COMMENT_TOOL17,366
+  define("LCE_MSGID"LCE_MSGID19,430
+  define("LCE_MSGSTR"LCE_MSGSTR21,488
+  define("LCE_TEXT"LCE_TEXT23,541
+  define("STATE_ABORT"STATE_ABORT25,567
+  define("STATE_OK"STATE_OK26,595
+  define("STATE_LOOP"STATE_LOOP27,620
+  class POEntryAD 29,648
+      function validate(31,683
+      function checkQuotation(59,1384
+  class CommentAD 70,1639
+      var $prefix;72,1674
+      function CommentAD(73,1693
+      function validate(83,1944
+  class POEntry 105,2410
+      var $msgid;107,2454
+      var $msgstr;108,2472
+      var $user_comment;109,2491
+      var $sys_comment;110,2516
+      var $unk_comment;111,2540
+      var $msgid_lc 113,2565
+      var $msgstr_lc 114,2590
+      var $user_comment_lc 115,2616
+      var $sys_comment_lc 116,2648
+      var $unk_comment_lc 117,2679
+      function POEntry(119,2711
+      function lineCount(135,3255
+      function serializeToVars(141,3365
+      function write(151,3800
+  class POReader 163,4178
+      var $msgid;165,4223
+      var $msgstr;166,4241
+      var $user_comment;167,4260
+      var $sys_comment;168,4285
+      var $unk_comment;169,4309
+      var $state;170,4333
+      var $ignore_ws;171,4351
+      var $po_entries;172,4373
+      var $poe_num;173,4396
+      var $filename;174,4416
+      var $domain;175,4437
+      function gettext(177,4457
+      function parseFromVars(189,4705
+      function serializeToVars(215,5331
+      function POReader(229,5613
+      function read(243,5983
+      function write(259,6307
+      function isComment(277,6645
+      function comment(284,6822
+      function msgid(304,7247
+      function msgstr(320,7574
+      function start(340,8232
+      function createPOEntries(360,8644
+      function stripLine(394,9472
+      function printClassification(421,10056
+      function classifyLine(432,10301
+  function getTextDomains(471,11094
+  class PORManager 498,11756
+      var      $por_a;500,11803
+      function PORManager(502,11822
+      function addPOReader(507,11896
+      function &getPOReader(getPOReader512,11992
+      function getDomainNames(517,12081
+  function &loadPORManager(loadPORManager523,12174
+  function fileJoin(536,12436
+      function lce_bindtextdomain(557,12839
+      function lce_textdomain(614,14530
+      function lce_gettext(620,14641
+      function lce_dgettext(626,14767
+      function lce(634,14966
+      function lce_bindtextdomain(651,15488
+      function lce_textdomain(656,15592
+      function lce_gettext(661,15674
+      function lce_dgettext(666,15755
+      function lce(670,15855
+  function lce_geteditcode(676,15898
+
+php-src/ptest.php,135
+define("TEST"TEST1,0
+test 4,26
+       var $member;8,71
+       var $memassign=9,85
+       var $memassign_space 10,110
+       var $test12,176
+foo(16,200
+
+perl-src/htlmify-cystic,1443
+my @section_name;section_name12,236
+my @appendix_name;appendix_name13,254
+my @section_toc;section_toc15,274
+my @appendix_toc;appendix_toc16,291
+my $new_tag new_tag18,310
+my $appendix;appendix24,409
+my $section;section25,423
+my $subsection;subsection26,436
+my $subsubsection;subsubsection27,452
+my $this_file_toc this_file_toc29,472
+my %file_tocs;file_tocs30,496
+my @output_files output_files32,512
+my $file_index file_index33,535
+my $output_file;output_file35,556
+my $line;line37,574
+my $subsection_marker;subsection_marker161,3883
+my $new;new163,3907
+sub read_toc main::read_toc165,3917
+         my $entry entry218,5621
+         my $entry entry234,6077
+             my $entry entry245,6351
+         my $entry entry252,6536
+         my $entry entry268,7010
+             my $entry entry276,7204
+         my $entry entry281,7328
+      my $entry entry296,7698
+sub finish_subsubsections main::finish_subsubsections302,7805
+sub finish_subsections main::finish_subsections309,7987
+sub finish_sections main::finish_sections320,8310
+sub finish_appendices main::finish_appendices331,8599
+sub section_url_base main::section_url_base337,8724
+sub section_url_name main::section_url_name342,8922
+sub section_url main::section_url355,9284
+  my $name name357,9336
+sub section_href main::section_href364,9452
+sub section_name main::section_name368,9551
+sub toc_line main::toc_line372,9655
+sub file_end main::file_end375,9750
+
+perl-src/yagrip.pl,258
+sub getopt main::getopt7,156
+       local($_,$flag,$opt,$f,$r,@temp)($_,$flag,$opt,$f,$r,@temp8,169
+sub usage main::usage38,856
+       local($prog,$_,@list)($prog,$_,@list39,868
+       
local($string,$flag,@string,@temp,@last)($string,$flag,@string,@temp,@last40,897
+
+perl-src/kai-test.pl,244
+sub f1 main::f12,16
+sub main::f2 6,50
+package Foo;10,90
+sub f3 Foo::f312,104
+sub Bar::f4 16,138
+package Bar;20,177
+sub f5 Bar::f522,191
+package Foo::Bar;26,225
+sub f6 Foo::Bar::f628,244
+package main;32,278
+sub f7 main::f734,293
+
+perl-src/mirror.pl,13410
+sub msg_versionmain::msg_version459,18271
+       local( $arg )( $arg 468,18582
+               local( $flag, $p )( $flag, $p 480,18757
+               local( $site_path )( $site_path 525,19687
+                       local( $site, $path )( $site, $path 539,19958
+               local( $key_val )( $key_val 578,20743
+               local( $user )( $user 595,21097
+               local( $c )( $c 634,21853
+                       local( $sec,$min,$hour,$mday,$mon,$year,( 
$sec,$min,$hour,$mday,$mon,$year,678,22807
+       local( $c )( $c 706,23393
+       local( $dir, $mp )( $dir, $mp 723,23695
+               local( $f )( $f 725,23740
+sub interpret_config_filesmain::interpret_config_files756,24304
+       local( $fname )( $fname 758,24333
+sub interpret_configmain::interpret_config785,24927
+sub parse_linemain::parse_line827,25710
+       local( $eqpl )( $eqpl 829,25727
+       local( $cont )( $cont 830,25744
+                       local( $v )( $v 839,26029
+sub set_defaultsmain::set_defaults860,26448
+sub command_line_overridemain::command_line_override868,26579
+       local( $key, $val, $overrides )( $key, $val, $overrides 870,26607
+sub set_variablesmain::set_variables894,27072
+       local( $key, $val )( $key, $val 896,27092
+                       local( $val_name )( $val_name 902,27259
+               local( $val )( $val 953,28825
+sub upd_valmain::upd_val962,28974
+       local( $key )( $key 964,28988
+sub pr_variablesmain::pr_variables970,29083
+       local( $msg )( $msg 972,29102
+       local( $nle )( $nle 973,29123
+       local( $out )( $out 974,29144
+       local( $key, $val, $str )( $key, $val, $str 975,29164
+sub do_mirrormain::do_mirror1007,29923
+       local( $get_one_package )( $get_one_package 1009,29939
+       local( $exit_status )( $exit_status 1030,30384
+                       local( @t )( @t 1154,33165
+       local( $con )( $con 1241,35499
+               local( @rhelp )( @rhelp 1289,36702
+       local( @sub_dirs )( @sub_dirs 1329,37778
+       local( $now )( $now 1493,41348
+               local( $arg )( $arg 1506,41774
+sub disconnectmain::disconnect1528,42250
+sub connectmain::connect1546,42576
+       local( $attempts )( $attempts 1548,42590
+       local( $res )( $res 1549,42642
+sub prodmain::prod1573,43156
+sub checkout_regexpsmain::checkout_regexps1585,43327
+       local( $ret )( $ret 1587,43350
+       local( $t )( $t 1589,43395
+               local( $val )( $val 1597,43701
+                       local( $err )( $err 1601,43786
+sub clear_localmain::clear_local1610,43909
+sub clear_remotemain::clear_remote1625,44172
+sub get_local_directory_detailsmain::get_local_directory_details1640,44445
+       local( @dirs, $dir )( @dirs, $dir 1642,44479
+       local( $last_prodded )( $last_prodded 1643,44502
+       local( $dir_level )( $dir_level 1691,45615
+       local( $i )( $i 1692,45641
+       local( $path, $time, $size, $type, $mode, $name, $isdir, $value, 
$follow )( $path, $time, $size, $type, $mode, $name, $isdir, $value, $follow 
1693,45659
+       local( $dev,$ino,$fmode,$nlink,$uid,$gid,$rdev,$ssize,( 
$dev,$ino,$fmode,$nlink,$uid,$gid,$rdev,$ssize,1694,45736
+                       local( $mapi )( $mapi 1763,47586
+sub get_remote_directory_detailsmain::get_remote_directory_details1789,48122
+       local( $type_changed )( $type_changed 1791,48157
+       local( $udirtmp )( $udirtmp 1792,48186
+       local( $storename )( $storename 1793,48206
+       local( $rls )( $rls 1825,48944
+               local( $dirtmp )( $dirtmp 1830,49002
+               local( $unsquish )( $unsquish 1832,49130
+                       local( $f )( $f 1840,49360
+               local( $dirtmp )( $dirtmp 1859,49866
+               local( $unsquish )( $unsquish 1870,50215
+                       local( $f, $uf )( $f, $uf 1878,50445
+               local( $flags )( $flags 1912,51259
+       local( $parse_state )( $parse_state 1946,52111
+                       local( $msg )( $msg 1963,52486
+sub patch_ls_lR_filemain::patch_ls_lR_file1984,52955
+       local( $f, $fr, $flb, $flt, $flp, $flz, $frb, $frt )( $f, $fr, $flb, 
$flt, $flp, $flz, $frb, $frt 1990,53055
+       local( $to , $tn )( $to , $tn 1991,53110
+       local( $tlb )( $tlb 1995,53225
+               local( $p, $s, $trz, $t, $m )( $p, $s, $trz, $t, $m 2030,54182
+               local( $tlz )( $tlz 2037,54467
+sub parse_timeoutmain::parse_timeout2089,55670
+sub parse_remote_detailsmain::parse_remote_details2095,55754
+       local( $ret )( $ret 2097,55781
+       local( $old_sig )( $old_sig 2098,55797
+sub parse_remote_details_realmain::parse_remote_details_real2125,56234
+       local( $path, $size, $time, $type, $mode, $rdir, $rcwd )( $path, 
$size, $time, $type, $mode, $rdir, $rcwd 2127,56266
+       local( @dir_list )( @dir_list 2128,56325
+       local( $i )( $i 2129,56346
+       local( $old_path )( $old_path 2130,56364
+                               local( $old_path )( $old_path 2143,56630
+                               local( $ri )( $ri 2203,58078
+                       local( $mapi )( $mapi 2214,58335
+                       local( $done )( $done 2239,58911
+sub compare_dirsmain::compare_dirs2283,59825
+       local( *src_paths,( *src_paths,2286,59915
+       local( $src_path, $dest_path, $i )( $src_path, $dest_path, $i 
2293,60099
+       local( $last_prodded )( $last_prodded 2294,60136
+       local( $desti, $srci, $compress, $srciZ, $srcigz, $split, 
$dest_path_real )( $desti, $srci, $compress, $srciZ, $srcigz, $split, 
$dest_path_real 2299,60350
+       local( $old_dest_path, $existing_path, $tmp, $restart )( 
$old_dest_path, $existing_path, $tmp, $restart 2300,60428
+       local( $sp, $dp )( $sp, $dp 2301,60486
+                  local( $real, $reali, $reali1 )( $real, $reali, $reali1 
2352,62034
+                  local( $count )( $count 2353,62072
+                       local( $value )( $value 2408,63996
+                       local( $real )( $real 2409,64028
+                       local( $reali )( $reali 2410,64086
+                               local( $old )( $old 2421,64571
+                       local( $old_dest_path )( $old_dest_path 2432,64842
+                               local( $dpp, $dps )( $dpp, $dps 2509,67031
+               local( $update )( $update 2534,67671
+sub map_namemain::map_name2651,71028
+       local( $name )( $name 2653,71043
+               local( $old_name )( $old_name 2656,71089
+               local( $tmp )( $tmp 2666,71252
+sub set_timestampsmain::set_timestamps2675,71362
+       local( $src_path )( $src_path 2677,71383
+       local( $dest_path, $dest_loc_mapi, $src_rem_mapi,  $rtime )( 
$dest_path, $dest_loc_mapi, $src_rem_mapi,  $rtime 2685,71517
+sub set_timestampmain::set_timestamp2699,71901
+       local( $path, $time )( $path, $time 2701,71921
+       local( $pr_time )( $pr_time 2703,71953
+sub make_dirsmain::make_dirs2719,72284
+       local( $thing )( $thing 2721,72300
+sub make_symlinksmain::make_symlinks2736,72489
+       local( $thing )( $thing 2738,72509
+               local( $dest, $existing )( $dest, $existing 2745,72623
+               local( $dirpart )( $dirpart 2746,72663
+               local( $ft )( $ft 2747,72704
+               local( $p )( $p 2762,73261
+                       local( $f )( $f 2770,73467
+                       local( $dl )( $dl 2788,74038
+sub do_all_transfersmain::do_all_transfers2806,74439
+       local( $src_path )( $src_path 2808,74462
+       local( $dest_path, $attribs )( $dest_path, $attribs 2809,74483
+       local( $srci )( $srci 2810,74515
+               local( $newpath )( $newpath 2838,75124
+sub transfer_filemain::transfer_file2869,75847
+       local( $src_path, $dest_path, $attribs, $timestamp )( $src_path, 
$dest_path, $attribs, $timestamp 2871,75867
+       local( $dir, $file, $temp, $compress, $split, $restart, $mesg, 
$got_mesg )( $dir, $file, $temp, $compress, $split, $restart, $mesg, $got_mesg 
2872,75927
+               local( $src_file )( $src_file 2915,76782
+               local( $comptemp )( $comptemp 2916,76816
+                       local( $f )( $f 2921,76964
+               local($filesize)($filesize2944,77569
+                       local( $ti )( $ti 2975,78401
+               local( $f )( $f 2997,78887
+               local( $comp )( $comp 2998,78912
+       local( $filesize )( $filesize 3015,79427
+       local( $sizemsg )( $sizemsg 3016,79469
+       local( $srcsize )( $srcsize 3017,79501
+               local( $time )( $time 3029,79865
+       local( $as )( $as 3046,80223
+       local( $locali )( $locali 3054,80499
+sub filename_to_tempnamemain::filename_to_tempname3062,80713
+       local( $dir, $file )( $dir, $file 3064,80740
+       local ( $dest_path )( $dest_path 3066,80769
+sub log_uploadmain::log_upload3090,81228
+       local( $src_path, $dest_path, $got_mesg, $size )( $src_path, 
$dest_path, $got_mesg, $size 3092,81245
+sub do_deletesmain::do_deletes3118,81773
+       local( *src_paths,( *src_paths,3121,81861
+       local( $files_to_go, $dirs_to_go )( $files_to_go, $dirs_to_go 
3125,81960
+       local( $src_path, $i )( $src_path, $i 3131,82055
+       local( $orig_do_deletes )( $orig_do_deletes 3132,82080
+       local( $orig_save_deletes )( $orig_save_deletes 3133,82122
+       local( $del_patt )( $del_patt 3135,82169
+               local( $per )( $per 3162,82843
+               local( $per )( $per 3184,83513
+                       local( $save_dir_tail )( $save_dir_tail 3226,84617
+sub save_deletemain::save_delete3245,85019
+       local( $save, $kind )( $save, $kind 3247,85037
+       local( $real_save_dir, $save_dest )( $real_save_dir, $save_dest 
3249,85067
+       local( $dirname )( $dirname 3284,85704
+sub save_mkdirmain::save_mkdir3304,86155
+       local( $dir )( $dir 3306,86172
+sub do_deletemain::do_delete3320,86459
+       local( $del, $kind )( $del, $kind 3322,86475
+sub filesizemain::filesize3377,87532
+       local( $fname )( $fname 3379,87547
+sub istruemain::istrue3390,87654
+       local( $val )( $val 3392,87667
+sub mksymlinkmain::mksymlink3398,87773
+       local( $dest_path, $existing_path )( $dest_path, $existing_path 
3400,87789
+               local( $msg )( $msg 3417,88246
+               local( $msg )( $msg 3431,88590
+               local( $status )( $status 3442,88816
+sub mkdirsmain::mkdirs3457,89196
+       local( $dir )( $dir 3459,89209
+       local( @dir, $d, $path )( @dir, $d, $path 3460,89230
+sub make_dirmain::make_dir3497,90042
+       local( $dir, $mode )( $dir, $mode 3499,90057
+       local( $val )( $val 3500,90085
+sub dir_existsmain::dir_exists3528,90573
+       local( $dir )( $dir 3530,90590
+       local( $val )( $val 3531,90611
+               local($old_dir)($old_dir3539,90750
+sub set_attribsmain::set_attribs3553,91053
+       local( $path, $src_path, $type )( $path, $src_path, $type 3555,91071
+       local( $mode )( $mode 3556,91111
+               local( $pathi )( $pathi 3564,91229
+               local( $pathi )( $pathi 3568,91320
+sub get_passwdmain::get_passwd3606,91977
+       local( $user )( $user 3608,91994
+       local( $pass )( $pass 3609,92016
+       local( $| )( $| 3610,92033
+sub compare_timesmain::compare_times3631,92384
+       local( $t1, $t2 )( $t1, $t2 3637,92564
+       local( $diff )( $diff 3638,92589
+sub create_assocsmain::create_assocs3643,92688
+       local( $map )( $map 3645,92708
+sub delete_assocsmain::delete_assocs3657,92957
+       local( $map )( $map 3659,92977
+sub unlink_dbmmain::unlink_dbm3671,93247
+       local( $file )( $file 3673,93264
+sub bsplitmain::bsplit3681,93462
+       local( $temp, $dest_path, $time )( $temp, $dest_path, $time 3683,93475
+       local( $dest_dir )( $dest_dir 3684,93516
+       local( $bufsiz )( $bufsiz 3685,93558
+       local( $buffer, $in, $sofar )( $buffer, $in, $sofar 3686,93583
+       local( $d )( $d 3691,93721
+       local( $index )( $index 3697,93840
+       local( $part )( $part 3698,93865
+                       local( $locali )( $locali 3714,94336
+       local( $readme )( $readme 3730,94740
+sub sysmain::sys3739,95116
+       local( $com )( $com 3741,95126
+sub set_assoc_from_arraymain::set_assoc_from_array3751,95355
+       local( *things )( *things 3754,95453
+sub find_progmain::find_prog3760,95537
+       local( $prog )( $prog 3762,95553
+       local( $path )( $path 3763,95575
+               local( $path )( $path 3766,95657
+sub real_dir_from_pathmain::real_dir_from_path3780,95842
+       local( $program )( $program 3782,95867
+       local( @prog_path )( @prog_path 3783,95892
+       local( $dir )( $dir 3784,95970
+sub msgmain::msg3807,96489
+       local( $todo, $msg )( $todo, $msg 3809,96499
+sub to_bytesmain::to_bytes3838,96979
+       local( $size )( $size 3840,96994
+sub unix2vmsmain::unix2vms3858,97332
+       local( $v, $kind )( $v, $kind 3860,97347
+                       local( $dir, $rest )( $dir, $rest 3873,97559
+sub dirpartmain::dirpart3886,97730
+       local( $path )( $path 3888,97744
+sub expand_symlinkmain::expand_symlink3902,98076
+       local( $orig_path, $points_to )( $orig_path, $points_to 3904,98097
+       local( $dirpart )( $dirpart 3905,98136
+sub flatten_pathmain::flatten_path3913,98365
+       local( $path )( $path 3915,98384
+       local( $changed )( $changed 3916,98406
+       local( $i )( $i 3917,98430
+       local( $rooted )( $rooted 3919,98446
+       local( $count )( $count 3920,98482
+       local( $orig_path )( $orig_path 3921,98504
+               local( $in )( $in 3932,98741
+               local( @parts )( @parts 3933,98765
+sub fix_packagemain::fix_package3963,99438
+       local( $package )( $package 3965,99456
+sub will_compressmain::will_compress3970,99529
+sub will_splitmain::will_split3981,99859
+sub myflockmain::myflock3989,100001
+       local( $file, $kind )( $file, $kind 3991,100015
+sub t2strmain::t2str4004,100221
+       local( @t )( @t 4006,100233
+       
local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst4013,100335
+sub handlermain::handler4022,100583
+        local( $sig )( $sig 4029,100651
+        local( $msg )( $msg 4030,100679
+        local( $package, $filename, $line )( $package, $filename, $line 
4031,100737
+sub trap_signalsmain::trap_signals4036,100859
+       local( $sig )( $sig 4038,100878
+sub map_user_groupmain::map_user_group4047,101158
+sub keepmain::keep4069,101537
+       local( $pathi, $path, *keep, *keep_totals, *keep_map, $kind )( $pathi, 
$path, *keep, *keep_totals, *keep_map, $kind 4071,101548
+sub alarmmain::alarm4104,102330
+       local( $time_to_sig )( $time_to_sig 4106,102342
+sub chownmain::chown4110,102405
+       local( $uid, $gid, $path )( $uid, $gid, $path 4112,102417
+sub utimemain::utime4116,102494
+       local( $atime, $mtime, $path )( $atime, $mtime, $path 4118,102506
+       local( $old_mode )( $old_mode 4124,102685
+       local( $tmp_mode )( $tmp_mode 4125,102730
+       local( $ret )( $ret 4126,102763
+sub cwdmain::cwd4135,102913
+       local( $lcwd )( $lcwd 4137,102923
+
+ps-src/rfc1245.ps,2478
+/FMversion 12,311
+/FrameDict 17,500
+/FMVERSION 47,1307
+/FMLOCAL 56,1494
+/FMDOCUMENT 73,1766
+/FMBEGINPAGE 95,2279
+/FMENDPAGE 109,2516
+/FMDEFINEFONT 115,2582
+/FMNORMALIZEGRAPHICS 126,2725
+/FMBEGINEPSF 142,2955
+/FMENDEPSF 153,3207
+/setmanualfeed 158,3283
+/max 163,3386
+/min 164,3426
+/inch 165,3466
+/pagedimen 166,3485
+/setpapername 172,3629
+/papersize 190,4214
+/manualpapersize 211,4789
+/desperatepapersize 230,5211
+/savematrix 239,5370
+/restorematrix 242,5425
+/dmatrix 245,5475
+/dpi 246,5495
+/freq 248,5583
+/sangle 249,5658
+/DiacriticEncoding 250,5717
+/.notdef 251,5738
+/.notdef 252,5801
+/.notdef 253,5864
+/.notdef 254,5927
+/.notdef 255,5990
+/numbersign 256,6051
+/parenright 257,6115
+/two 258,6184
+/less 259,6251
+/L 260,6320
+/bracketright 261,6389
+/i 262,6459
+/braceright 263,6529
+/Ntilde 264,6598
+/atilde 265,6668
+/iacute 266,6733
+/ocircumflex 267,6797
+/udieresis 268,6858
+/paragraph 269,6919
+/dieresis 270,6983
+/yen 271,7050
+/ordfeminine 272,7109
+/exclamdown 273,7171
+/guillemotleft 274,7230
+/Otilde 275,7296
+/quoteleft 276,7357
+/fraction 277,7420
+/periodcentered 278,7490
+/Acircumflex 279,7549
+/Icircumflex 280,7610
+/Uacute 281,7680
+/breve 282,7746
+/ReEncode 284,7814
+/graymode 300,8020
+/setpattern 310,8184
+/grayness 331,8725
+/normalize 394,9873
+/dnormalize 397,9942
+/lnormalize 400,10014
+/H 403,10104
+/Z 406,10147
+/X 409,10176
+/V 412,10219
+/N 415,10260
+/M 418,10286
+/E 419,10315
+/D 420,10336
+/O 421,10358
+/L 423,10394
+/Y 430,10489
+/R 439,10588
+/RR 450,10696
+/C 467,10959
+/U 473,11004
+/F 477,11039
+/T 481,11084
+/RF 484,11115
+/TF 488,11164
+/P 495,11219
+/PF 499,11270
+/S 506,11344
+/SF 510,11384
+/B 517,11446
+/BF 521,11505
+/W 538,11714
+/G 573,12382
+/A 582,12525
+/BEGINPRINTCODE 606,12918
+/ENDPRINTCODE 615,13131
+/gn 620,13259
+/cfs 631,13384
+/ic 636,13473
+/ms 658,14285
+/ip 668,14395
+/wh 678,14492
+/bl 684,14607
+/s1 690,14722
+/fl 691,14739
+/hx 698,14887
+/wbytes 709,15055
+/BEGINBITMAPBWc 713,15147
+/BEGINBITMAPGRAYc 716,15198
+/BEGINBITMAP2BITc 719,15251
+/COMMONBITMAPc 722,15304
+/BEGINBITMAPBW 739,15660
+/BEGINBITMAPGRAY 742,15709
+/BEGINBITMAP2BIT 745,15760
+/COMMONBITMAP 748,15811
+/Fmcc 765,16156
+/ngrayt 773,16371
+/nredt 774,16393
+/nbluet 775,16414
+/ngreent 776,16436
+/colorsetup 787,16603
+/fakecolorsetup 814,17370
+/BITMAPCOLOR 826,17636
+/BITMAPCOLORc 839,17926
+/BITMAPGRAY 855,18275
+/BITMAPGRAYc 858,18335
+/ENDBITMAP 861,18397
+/fillprocs 868,18497
+
+prol-src/ordsets.prolog,525
+is_ordset(47,1310
+list_to_ord_set(63,1688
+ord_add_element(71,1867
+ord_del_element(85,2344
+ord_disjoint(100,2783
+ord_intersect(108,2953
+ord_intersection(126,3552
+ord_intersection3(130,3691
+ord_intersection(150,4531
+ord_intersection4(154,4703
+ord_intersection(176,5664
+ord_intersection2(181,5812
+ord_member(200,6318
+ord_seteq(216,6683
+ord_setproduct(225,6971
+ord_subset(240,7377
+ord_subtract(257,7861
+ord_symdiff(265,8054
+ord_union(288,8887
+ord_union4(303,9352
+ord_union(324,10171
+ord_union_all(329,10313
+
+prol-src/natded.prolog,2319
+expandmng(100,2879
+normalize(116,3359
+fresh_vars(125,3716
+subst(138,4134
+normalize_fresh(159,4660
+reduce_subterm(171,5112
+reduce(185,5559
+free_var(196,5903
+free_for(209,6246
+compile_lex(231,6875
+consult_lex:-consult_lex248,7384
+lex(259,7754
+expandsyn(267,8068
+bas_syn(292,8897
+compile_empty:-compile_empty310,9376
+complete(328,10055
+add_active(340,10527
+parse(353,10949
+derived_analyses(364,11341
+build(378,11965
+buildact(392,12521
+mapsyn(412,13542
+add_edge(434,14278
+findcats(447,14758
+normalize_tree(465,15478
+normalize_trees(475,15856
+expandmng_tree(486,16248
+expandmng_trees(496,16614
+cat(511,17013
+subtree(644,21266
+hypothetical_mem(653,21565
+make_coor(667,22130
+start_up:-start_up688,23013
+tokenizeatom(710,23921
+tokenize(720,24348
+isoperator(752,25377
+isoptab(756,25431
+specialsymbol(765,25756
+sstab(771,25861
+parse_cgi(787,26347
+keyvalseq(792,26510
+andkeyvalseq(796,26609
+keyval(799,26688
+valseq(807,26920
+plusvalseq(810,27007
+val(816,27109
+argvals(824,27426
+commaargvals(828,27503
+atomval(833,27578
+atom(836,27640
+action(846,28004
+keyvalcgi(864,28649
+keyvalscgi(865,28670
+outsyn(868,28726
+act(876,29060
+actout(901,29906
+texttreelist(912,30089
+htmltreelist(918,30190
+fitchtreelist(924,30304
+pp_html_table_tree(938,30759
+pp_html_tree(949,31113
+pp_html_trees(988,32381
+pp_html_table_fitch_tree(999,32769
+pp_html_fitch_tree(1017,33672
+removeexp(1129,39002
+splitexp(1142,39490
+pp_exp(1155,39990
+map_word(1168,40249
+pp_exps(1180,40474
+pp_tree(1188,40777
+pp_trees(1216,41807
+pp_word_list(1225,42128
+pp_word(1231,42262
+pp_word_list_rest(1238,42569
+pp_cat(1248,42929
+pp_syn(1255,43196
+pp_syn_paren(1276,43899
+pp_paren(1293,44377
+pp_syn_back(1300,44661
+pp_bas_cat(1311,45001
+writecat(1322,45409
+writesubs(1351,46455
+writesups(1361,46757
+writelistsubs(1371,47090
+pp_lam(1380,47408
+pp_lam_bracket(1398,48022
+pp_lam_paren(1407,48338
+pp_rule(1429,49238
+member(1447,49866
+append_list(1451,49919
+append(1456,50010
+at_least_one_member(1460,50076
+numbervars(1464,50171
+reverse(1467,50209
+select(1471,50290
+select_last(1475,50357
+cat_atoms(1479,50436
+writelist(1485,50524
+write_lex_cat(1492,50676
+writebreaklex(1500,50988
+write_lex(1513,51265
+writebreak(1521,51541
+tt:-tt1531,51713
+mt:-mt1534,51784
+cmt:-cmt1537,51878
+
+pyt-src/server.py,1438
+class Controls:Controls17,358
+    def __init__(18,374
+    def __repr__(24,590
+    def __str__(34,871
+class Server:Server37,934
+    def __init__(38,948
+    def dump(73,2198
+    def __repr__(125,3896
+    def __str__(128,3945
+class User:User131,4014
+    def __init__(132,4026
+    def __repr__(172,5445
+    def __str__(206,6883
+def flag2str(223,7212
+class LabeledEntry(232,7442
+    def bind(234,7525
+    def focus_set(236,7584
+    def __init__(238,7629
+def ButtonBar(245,7909
+def helpwin(255,8280
+class ListEdit(267,8707
+    def __init__(269,8808
+    def handleList(303,10042
+    def handleNew(306,10094
+    def editItem(314,10426
+    def deleteItem(320,10596
+def ConfirmQuit(326,10760
+class ControlEdit(375,12377
+    def PostControls(376,12403
+    def GatherControls(421,13530
+class ServerEdit(512,16264
+    def __init__(513,16289
+    def post(525,16629
+    def gather(543,17191
+    def nosave(547,17304
+    def save(551,17408
+    def refreshPort(556,17509
+    def createWidgets(561,17663
+    def edituser(631,20708
+class UserEdit(645,20921
+    def __init__(646,20944
+    def post(658,21283
+    def gather(676,21841
+    def nosave(680,21950
+    def save(684,22052
+    def createWidgets(689,22151
+class Configure(760,24879
+    def __init__(761,24916
+    def MakeDispose(772,25211
+    def MakeSitelist(786,25706
+    def editsite(794,25949
+    def save(797,26022
+    def nosave(807,26310
+
+tex-src/testenv.tex,52
+\newcommand{\nm}\nm4,77
+\section{blah}blah8,139
+
+tex-src/gzip.texi,303
address@hidden Top,62,2139
address@hidden Copying,80,2652
address@hidden Overview,83,2705
address@hidden Sample,166,7272
address@hidden Invoking gzip,Invoking gzip210,8828
address@hidden Advanced usage,Advanced usage357,13495
address@hidden Environment,420,15207
address@hidden Tapes,437,15768
address@hidden Problems,460,16767
address@hidden Concept Index,Concept Index473,17287
+
+tex-src/texinfo.tex,30626
+\def\texinfoversion{\texinfoversion25,1019
+\def\tie{\tie48,1510
+\def\gloggingall{\gloggingall71,2260
+\def\loggingall{\loggingall72,2329
+\def\onepageout#1{\onepageout98,3266
+\def\croppageout#1{\croppageout114,4016
+\def\cropmarks{\cropmarks141,5076
+\def\pagebody#1{\pagebody143,5123
+\def\ewtop{\ewtop156,5578
+\def\nstop{\nstop157,5642
+\def\ewbot{\ewbot159,5725
+\def\nsbot{\nsbot160,5789
+\def\parsearg #1{\parsearg169,6088
+\def\parseargx{\parseargx171,6166
+\def\parseargline{\parseargline181,6406
+\def\flushcr{\flushcr185,6527
+\newif\ifENV \ENVfalse \def\inENV{\inENV189,6726
+\def\ENVcheck{\ENVcheck190,6790
+\outer\def\begin{\begin197,7037
+\def\beginxxx #1{\beginxxx199,7075
+\def\end{\end207,7330
+\def\endxxx #1{\endxxx209,7358
+\def\errorE#1{\errorE215,7547
+\def\singlespace{\singlespace221,7741
address@hidden@231,7964
+\def\`{\`235,8064
+\def\'{\'236,8076
+\def\mylbrace {\mylbrace240,8124
+\def\myrbrace {\myrbrace241,8157
+\def\:{\:246,8271
+\def\*{\*249,8325
+\def\.{\.252,8401
+\def\w#1{\w257,8632
+\def\group{\group267,9115
+  \def\Egroup{\Egroup272,9279
+\def\need{\need288,9721
+\def\needx#1{\needx299,9998
+\def\dots{\dots338,11384
+\def\page{\page342,11448
+\def\exdent{\exdent352,11775
+\def\exdentyyy #1{\exdentyyy353,11808
+\def\nofillexdent{\nofillexdent356,11952
+\def\nofillexdentyyy #1{\nofillexdentyyy357,11997
+\def\include{\include364,12181
+\def\includezzz #1{\includezzz365,12216
+\def\thisfile{\thisfile368,12267
+\def\center{\center372,12330
+\def\centerzzz #1{\centerzzz373,12363
+\def\sp{\sp379,12505
+\def\spxxx #1{\spxxx380,12530
+\def\comment{\comment386,12704
+\def\commentxxx #1{\commentxxx389,12801
+\def\ignoresections{\ignoresections395,12970
+\let\chapter=\relax=\relax396,12992
+\let\section=\relax=\relax405,13237
+\let\subsection=\relax=\relax408,13298
+\let\subsubsection=\relax=\relax409,13321
+\let\appendix=\relax=\relax410,13347
+\let\appendixsec=\relaxsec=\relax411,13368
+\let\appendixsection=\relaxsection=\relax412,13392
+\let\appendixsubsec=\relaxsubsec=\relax413,13420
+\let\appendixsubsection=\relaxsubsection=\relax414,13447
+\let\appendixsubsubsec=\relaxsubsubsec=\relax415,13478
+\let\appendixsubsubsection=\relaxsubsubsection=\relax416,13508
+\def\ignore{\ignore422,13610
+\long\def\ignorexxx #1\end ignore{\ignorexxx426,13750
+\def\direntry{\direntry428,13809
+\long\def\direntryxxx #1\end direntry{\direntryxxx429,13848
+\def\ifset{\ifset433,13958
+\def\ifsetxxx #1{\ifsetxxx435,14016
+\def\Eifset{\Eifset439,14143
+\def\ifsetfail{\ifsetfail440,14157
+\long\def\ifsetfailxxx #1\end ifset{\ifsetfailxxx441,14213
+\def\ifclear{\ifclear443,14274
+\def\ifclearxxx #1{\ifclearxxx445,14336
+\def\Eifclear{\Eifclear449,14467
+\def\ifclearfail{\ifclearfail450,14483
+\long\def\ifclearfailxxx #1\end ifclear{\ifclearfailxxx451,14543
+\def\set{\set455,14694
+\def\setxxx #1{\setxxx456,14721
+\def\clear{\clear459,14783
+\def\clearxxx #1{\clearxxx460,14814
+\def\iftex{\iftex465,14931
+\def\Eiftex{\Eiftex466,14944
+\def\ifinfo{\ifinfo467,14958
+\long\def\ifinfoxxx #1\end ifinfo{\ifinfoxxx468,15008
+\long\def\menu #1\end menu{\menu470,15067
+\def\asis#1{\asis471,15096
+\def\math#1{\math484,15639
+\def\node{\node486,15683
+\def\nodezzz#1{\nodezzz487,15721
+\def\nodexxx[#1,#2]{\nodexxx[488,15752
+\def\donoderef{\donoderef491,15814
+\def\unnumbnoderef{\unnumbnoderef495,15935
+\def\appendixnoderef{\appendixnoderef499,16066
+\expandafter\expandafter\expandafter\appendixsetref{setref500,16112
+\let\refill=\relaxill=\relax503,16201
+\def\setfilename{\setfilename508,16415
+\outer\def\bye{\bye517,16661
+\def\inforef #1{\inforef519,16717
+\def\inforefzzz #1,#2,#3,#4**{\inforefzzz520,16755
+\def\losespace #1{\losespace522,16852
+\def\sf{\sf531,17056
+\font\defbf=cmbx10 scaled \magstep1 %was 1314bf=cmbx10557,17851
+\font\deftt=cmtt10 scaled \magstep1tt=cmtt10558,17897
+\def\df{\df559,17933
+\def\resetmathfonts{\resetmathfonts634,20527
+\def\textfonts{\textfonts647,21116
+\def\chapfonts{\chapfonts652,21331
+\def\secfonts{\secfonts657,21547
+\def\subsecfonts{\subsecfonts662,21752
+\def\indexfonts{\indexfonts667,21969
+\def\smartitalicx{\smartitalicx690,22701
+\def\smartitalic#1{\smartitalic691,22777
+\let\cite=\smartitalic=\smartitalic697,22922
+\def\b#1{\b699,22946
+\def\t#1{\t702,22981
+\def\samp #1{\samp705,23133
+\def\key #1{\key706,23166
+\def\ctrl #1{\ctrl707,23227
+\def\tclose#1{\tclose715,23429
+\def\ {\719,23595
+\def\xkey{\xkey727,23864
+\def\kbdfoo#1#2#3\par{\kbdfoo728,23880
+\def\dmn#1{\dmn737,24181
+\def\kbd#1{\kbd739,24208
+\def\l#1{\l741,24265
+\def\r#1{\r743,24294
+\def\sc#1{\sc745,24362
+\def\ii#1{\ii746,24405
+\def\titlefont#1{\titlefont754,24638
+\def\titlepage{\titlepage760,24741
+   \def\subtitlefont{\subtitlefont765,24968
+   \def\authorfont{\authorfont767,25052
+   \def\title{\title773,25262
+   \def\titlezzz##1{\titlezzz774,25297
+   \def\subtitle{\subtitle782,25612
+   \def\subtitlezzz##1{\subtitlezzz783,25653
+   \def\author{\author786,25771
+   \def\authorzzz##1{\authorzzz787,25808
+   \def\page{\page793,26099
+\def\Etitlepage{\Etitlepage803,26268
+\def\finishtitlepage{\finishtitlepage816,26656
+\def\evenheading{\evenheading845,27664
+\def\oddheading{\oddheading846,27707
+\def\everyheading{\everyheading847,27748
+\def\evenfooting{\evenfooting849,27794
+\def\oddfooting{\oddfooting850,27837
+\def\everyfooting{\everyfooting851,27878
+\def\headings #1 {\headings892,29570
+\def\HEADINGSoff{\HEADINGSoff894,29619
+\def\HEADINGSdouble{\HEADINGSdouble903,30046
+\def\HEADINGSsingle{\HEADINGSsingle913,30366
+\def\HEADINGSon{\HEADINGSon921,30587
+\def\HEADINGSafter{\HEADINGSafter923,30621
+\def\HEADINGSdoublex{\HEADINGSdoublex925,30716
+\def\HEADINGSsingleafter{\HEADINGSsingleafter932,30904
+\def\HEADINGSsinglex{\HEADINGSsinglex933,30965
+\def\today{\today942,31240
+\def\thistitle{\thistitle957,31785
+\def\settitle{\settitle958,31810
+\def\settitlezzz #1{\settitlezzz959,31847
+\def\internalBitem{\internalBitem991,32777
+\def\internalBitemx{\internalBitemx992,32827
+\def\internalBxitem "#1"{\internalBxitem994,32872
+\def\internalBxitemx "#1"{\internalBxitemx995,32952
+\def\internalBkitem{\internalBkitem997,33027
+\def\internalBkitemx{\internalBkitemx998,33079
+\def\kitemzzz #1{\kitemzzz1000,33126
+\def\xitemzzz #1{\xitemzzz1003,33228
+\def\itemzzz #1{\itemzzz1006,33331
+\def\item{\item1036,34402
+\def\itemx{\itemx1037,34453
+\def\kitem{\kitem1038,34506
+\def\kitemx{\kitemx1039,34559
+\def\xitem{\xitem1040,34614
+\def\xitemx{\xitemx1041,34667
+\def\description{\description1044,34777
+\def\table{\table1046,34827
+\def\ftable{\ftable1051,34971
+\def\Eftable{\Eftable1055,35117
+\def\vtable{\vtable1058,35186
+\def\Evtable{\Evtable1062,35332
+\def\dontindex #1{\dontindex1065,35401
+\def\fnitemindex #1{\fnitemindex1066,35421
+\def\vritemindex #1{\vritemindex1067,35466
+\def\tablez #1#2#3#4#5#6{\tablez1073,35615
+\def\Edescription{\Edescription1076,35673
+\def\itemfont{\itemfont1081,35875
+\def\Etable{\Etable1089,36101
+\def\itemize{\itemize1102,36425
+\def\itemizezzz #1{\itemizezzz1104,36461
+\def\itemizey #1#2{\itemizey1109,36556
+\def#2{1118,36802
+\def\itemcontents{\itemcontents1119,36843
+\def\bullet{\bullet1122,36891
+\def\minus{\minus1123,36918
+\def\frenchspacing{\frenchspacing1127,37026
+\def\splitoff#1#2\endmark{\splitoff1133,37251
+\def\enumerate{\enumerate1139,37481
+\def\enumeratezzz #1{\enumeratezzz1140,37520
+\def\enumeratey #1 #2\endenumeratey{\enumeratey1141,37573
+  \def\thearg{\thearg1145,37720
+  \ifx\thearg\empty \def\thearg{\thearg1146,37739
+\def\numericenumerate{\numericenumerate1183,39073
+\def\lowercaseenumerate{\lowercaseenumerate1189,39203
+\def\uppercaseenumerate{\uppercaseenumerate1202,39550
+\def\startenumeration#1{\startenumeration1218,40040
+\def\alphaenumerate{\alphaenumerate1226,40222
+\def\capsenumerate{\capsenumerate1227,40257
+\def\Ealphaenumerate{\Ealphaenumerate1228,40291
+\def\Ecapsenumerate{\Ecapsenumerate1229,40325
+\def\itemizeitem{\itemizeitem1233,40405
+\def\newindex #1{\newindex1258,41262
+\def\defindex{\defindex1267,41551
+\def\newcodeindex #1{\newcodeindex1271,41659
+\def\defcodeindex{\defcodeindex1278,41919
+\def\synindex #1 #2 {\synindex1282,42099
+\def\syncodeindex #1 #2 {\syncodeindex1291,42439
+\def\doindex#1{\doindex1308,43118
+\def\singleindexer #1{\singleindexer1309,43177
+\def\docodeindex#1{\docodeindex1312,43289
+\def\singlecodeindexer #1{\singlecodeindexer1313,43356
+\def\indexdummies{\indexdummies1315,43414
+\def\_{\_1316,43434
+\def\w{\w1317,43462
+\def\bf{\bf1318,43489
+\def\rm{\rm1319,43518
+\def\sl{\sl1320,43547
+\def\sf{\sf1321,43576
+\def\tt{\tt1322,43604
+\def\gtr{\gtr1323,43632
+\def\less{\less1324,43662
+\def\hat{\hat1325,43694
+\def\char{\char1326,43724
+\def\TeX{\TeX1327,43756
+\def\dots{\dots1328,43786
+\def\copyright{\copyright1329,43819
+\def\tclose##1{\tclose1330,43862
+\def\code##1{\code1331,43907
+\def\samp##1{\samp1332,43948
+\def\t##1{\t1333,43989
+\def\r##1{\r1334,44024
+\def\i##1{\i1335,44059
+\def\b##1{\b1336,44094
+\def\cite##1{\cite1337,44129
+\def\key##1{\key1338,44170
+\def\file##1{\file1339,44209
+\def\var##1{\var1340,44250
+\def\kbd##1{\kbd1341,44289
+\def\indexdummyfont#1{\indexdummyfont1346,44445
+\def\indexdummytex{\indexdummytex1347,44471
+\def\indexdummydots{\indexdummydots1348,44495
+\def\indexnofonts{\indexnofonts1350,44521
+\let\w=\indexdummyfontdummyfont1351,44541
+\let\t=\indexdummyfontdummyfont1352,44564
+\let\r=\indexdummyfontdummyfont1353,44587
+\let\i=\indexdummyfontdummyfont1354,44610
+\let\b=\indexdummyfontdummyfont1355,44633
+\let\emph=\indexdummyfontdummyfont1356,44656
+\let\strong=\indexdummyfontdummyfont1357,44682
+\let\cite=\indexdummyfont=\indexdummyfont1358,44710
+\let\sc=\indexdummyfontdummyfont1359,44736
+\let\tclose=\indexdummyfontdummyfont1363,44908
+\let\code=\indexdummyfontdummyfont1364,44936
+\let\file=\indexdummyfontdummyfont1365,44962
+\let\samp=\indexdummyfontdummyfont1366,44988
+\let\kbd=\indexdummyfontdummyfont1367,45014
+\let\key=\indexdummyfontdummyfont1368,45039
+\let\var=\indexdummyfontdummyfont1369,45064
+\let\TeX=\indexdummytexdummytex1370,45089
+\let\dots=\indexdummydotsdummydots1371,45113
+\let\indexbackslash=0  %overridden during \printindex.backslash=01381,45365
+\def\doind #1#2{\doind1383,45421
+{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1385,45464
+\def\rawbackslashxx{\rawbackslashxx1388,45604
+{\indexnofontsnofonts1393,45866
+\def\dosubind #1#2#3{\dosubind1404,46177
+{\indexdummies % Must do this here, since \bf, etc expand at this 
stagedummies1406,46225
+\def\rawbackslashxx{\rawbackslashxx1409,46329
+{\indexnofontsnofonts1413,46483
+\def\findex {\findex1442,47414
+\def\kindex {\kindex1443,47437
+\def\cindex {\cindex1444,47460
+\def\vindex {\vindex1445,47483
+\def\tindex {\tindex1446,47506
+\def\pindex {\pindex1447,47529
+\def\cindexsub {\cindexsub1449,47553
+\def\printindex{\printindex1461,47880
+\def\doprintindex#1{\doprintindex1463,47921
+  \def\indexbackslash{\indexbackslash1480,48406
+  \indexfonts\rm \tolerance=9500 \advance\baselineskip -1ptfonts\rm1481,48445
+\def\initial #1{\initial1516,49517
+\def\entry #1#2{\entry1522,49724
+  \null\nobreak\indexdotfill % Have leaders before the page 
number.dotfill1539,50371
+\def\indexdotfill{\indexdotfill1548,50699
+\def\primary #1{\primary1551,50805
+\def\secondary #1#2{\secondary1555,50887
+\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\pardotfill1558,50969
+\newbox\partialpageialpage1565,51142
+\def\begindoublecolumns{\begindoublecolumns1571,51300
+  \output={\global\setbox\partialpage=ialpage=1572,51336
+\def\enddoublecolumns{\enddoublecolumns1576,51524
+\def\doublecolumnout{\doublecolumnout1579,51609
+  address@hidden \advance\dimen@ by-\ht\partialpageialpage1580,51678
+\def\pagesofar{\pagesofar1583,51856
+\def\balancecolumns{\balancecolumns1587,52093
+  address@hidden \advance\availdimen@ by-\ht\partialpageialpage1593,52264
+     address@hidden \advance\dimen@ by-\ht\partialpageialpage1599,52525
+\newcount \appendixno  \appendixno = address@hidden,53430
+\def\appendixletter{\appendixletter1627,53471
+\def\opencontents{\opencontents1631,53574
+\def\thischapter{\thischapter1636,53755
+\def\seccheck#1{\seccheck1637,53793
+\def\chapternofonts{\chapternofonts1642,53897
+\def\result{\result1645,53972
+\def\equiv{\equiv1646,54007
+\def\expansion{\expansion1647,54040
+\def\print{\print1648,54081
+\def\TeX{\TeX1649,54114
+\def\dots{\dots1650,54143
+\def\copyright{\copyright1651,54174
+\def\tt{\tt1652,54215
+\def\bf{\bf1653,54242
+\def\w{\w1654,54270
+\def\less{\less1655,54295
+\def\gtr{\gtr1656,54326
+\def\hat{\hat1657,54355
+\def\char{\char1658,54384
+\def\tclose##1{\tclose1659,54415
+\def\code##1{\code1660,54459
+\def\samp##1{\samp1661,54499
+\def\r##1{\r1662,54539
+\def\b##1{\b1663,54573
+\def\key##1{\key1664,54607
+\def\file##1{\file1665,54645
+\def\kbd##1{\kbd1666,54685
+\def\i##1{\i1668,54793
+\def\cite##1{\cite1669,54827
+\def\var##1{\var1670,54867
+\def\emph##1{\emph1671,54905
+\def\dfn##1{\dfn1672,54945
+\def\thischaptername{\thischaptername1675,54986
+\outer\def\chapter{\chapter1676,55025
+\def\chapterzzz #1{\chapterzzz1677,55066
+{\chapternofonts%nofonts%1686,55462
+\global\let\section = \numberedsec=1691,55615
+\global\let\subsection = \numberedsubsec=1692,55650
+\global\let\subsubsection = \numberedsubsubsec=1693,55691
+\outer\def\appendix{\appendix1696,55742
+\def\appendixzzz #1{\appendixzzz1697,55785
+\global\advance \appendixno by 1 \message{no1699,55862
+\chapmacro {#1}{Appendix \appendixletter}letter1700,55931
+\xdef\thischapter{Appendix \appendixletter: 
\noexpand\thischaptername}letter:1703,56024
+{\chapternofonts%nofonts%1704,56096
+  {#1}{Appendix \appendixletter}letter1706,56152
+\appendixnoderef %noderef1709,56252
+\global\let\section = \appendixsec=1710,56271
+\global\let\subsection = \appendixsubsec=1711,56306
+\global\let\subsubsection = \appendixsubsubsec=1712,56347
+\outer\def\top{\top1715,56398
+\outer\def\unnumbered{\unnumbered1716,56438
+\def\unnumberedzzz #1{\unnumberedzzz1717,56485
+{\chapternofonts%nofonts%1721,56648
+\global\let\section = \unnumberedsec=1726,56798
+\global\let\subsection = \unnumberedsubsec=1727,56835
+\global\let\subsubsection = \unnumberedsubsubsec=1728,56878
+\outer\def\numberedsec{\numberedsec1731,56931
+\def\seczzz #1{\seczzz1732,56972
+{\chapternofonts%nofonts%1735,57128
+\outer\def\appendixsection{\appendixsection1744,57314
+\outer\def\appendixsec{\appendixsec1745,57371
+\def\appendixsectionzzz #1{\appendixsectionzzz1746,57424
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}letter1748,57536
+{\chapternofonts%nofonts%1749,57604
+{#1}{\appendixletter}letter1751,57660
+\appendixnoderef %noderef1754,57760
+\outer\def\unnumberedsec{\unnumberedsec1758,57800
+\def\unnumberedseczzz #1{\unnumberedseczzz1759,57853
+{\chapternofonts%nofonts%1761,57948
+\outer\def\numberedsubsec{\numberedsubsec1769,58116
+\def\numberedsubseczzz #1{\numberedsubseczzz1770,58171
+{\chapternofonts%nofonts%1773,58350
+\outer\def\appendixsubsec{\appendixsubsec1782,58554
+\def\appendixsubseczzz #1{\appendixsubseczzz1783,58609
+\subsecheading {#1}{\appendixletter}letter1785,58731
+{\chapternofonts%nofonts%1786,58796
+{#1}{\appendixletter}letter1788,58855
+\appendixnoderef %noderef1791,58970
+\outer\def\unnumberedsubsec{\unnumberedsubsec1795,59010
+\def\unnumberedsubseczzz #1{\unnumberedsubseczzz1796,59069
+{\chapternofonts%nofonts%1798,59170
+\outer\def\numberedsubsubsec{\numberedsubsubsec1806,59341
+\def\numberedsubsubseczzz #1{\numberedsubsubseczzz1807,59402
+{\chapternofonts%nofonts%1811,59599
+\outer\def\appendixsubsubsec{\appendixsubsubsec1822,59832
+\def\appendixsubsubseczzz #1{\appendixsubsubseczzz1823,59893
+  {\appendixletter}letter1826,60032
+{\chapternofonts%nofonts%1827,60098
+  {\appendixletter}letter1829,60163
+\appendixnoderef %noderef1833,60297
+\outer\def\unnumberedsubsubsec{\unnumberedsubsubsec1837,60337
+\def\unnumberedsubsubseczzz #1{\unnumberedsubsubseczzz1838,60402
+{\chapternofonts%nofonts%1840,60509
+\def\infotop{\infotop1850,60838
+\def\infounnumbered{\infounnumbered1851,60876
+\def\infounnumberedsec{\infounnumberedsec1852,60921
+\def\infounnumberedsubsec{\infounnumberedsubsec1853,60972
+\def\infounnumberedsubsubsec{\infounnumberedsubsubsec1854,61029
+\def\infoappendix{\infoappendix1856,61093
+\def\infoappendixsec{\infoappendixsec1857,61134
+\def\infoappendixsubsec{\infoappendixsubsec1858,61181
+\def\infoappendixsubsubsec{\infoappendixsubsubsec1859,61234
+\def\infochapter{\infochapter1861,61294
+\def\infosection{\infosection1862,61333
+\def\infosubsection{\infosubsection1863,61372
+\def\infosubsubsection{\infosubsubsection1864,61417
+\global\let\section = \numberedsec=1869,61654
+\global\let\subsection = \numberedsubsec=1870,61689
+\global\let\subsubsection = \numberedsubsubsec=1871,61730
+\def\majorheading{\majorheading1885,62237
+\def\majorheadingzzz #1{\majorheadingzzz1886,62282
+\def\chapheading{\chapheading1892,62515
+\def\chapheadingzzz #1{\chapheadingzzz1893,62558
+\def\heading{\heading1898,62753
+\def\subheading{\subheading1900,62790
+\def\subsubheading{\subsubheading1902,62833
+\def\dobreak#1#2{\dobreak1909,63110
+\def\setchapterstyle #1 {\setchapterstyle1911,63188
+\def\chapbreak{\chapbreak1918,63443
+\def\chappager{\chappager1919,63493
+\def\chapoddpage{\chapoddpage1920,63531
+\def\setchapternewpage #1 {\setchapternewpage1922,63610
+\def\CHAPPAGoff{\CHAPPAGoff1924,63667
+\def\CHAPPAGon{\CHAPPAGon1928,63761
+\global\def\HEADINGSon{\HEADINGSon1931,63852
+\def\CHAPPAGodd{\CHAPPAGodd1933,63894
+\global\def\HEADINGSon{\HEADINGSon1936,63990
+\def\CHAPFplain{\CHAPFplain1940,64044
+\def\chfplain #1#2{\chfplain1944,64136
+\def\unnchfplain #1{\unnchfplain1955,64359
+\def\unnchfopen #1{\unnchfopen1963,64588
+\def\chfopen #1#2{\chfopen1969,64796
+\def\CHAPFopen{\CHAPFopen1974,64940
+\def\subsecheadingbreak{\subsecheadingbreak1981,65158
+\def\secheadingbreak{\secheadingbreak1984,65287
+\def\secheading #1#2#3{\secheading1992,65569
+\def\plainsecheading #1{\plainsecheading1993,65625
+\def\secheadingi #1{\secheadingi1994,65668
+\def\subsecheading #1#2#3#4{\subsecheading2005,66036
+\def\subsecheadingi #1{\subsecheadingi2006,66103
+\def\subsubsecfonts{\subsubsecfonts2013,66400
+\def\subsubsecheading #1#2#3#4#5{\subsubsecheading2016,66523
+\def\subsubsecheadingi #1{\subsubsecheadingi2017,66601
+\def\startcontents#1{\startcontents2031,67073
+   \unnumbchapmacro{#1}\def\thischapter{\thischapter2039,67346
+\outer\def\contents{\contents2048,67705
+\outer\def\summarycontents{\summarycontents2056,67849
+      \def\secentry ##1##2##3##4{\secentry2066,68220
+      \def\unnumbsecentry ##1##2{\unnumbsecentry2067,68255
+      \def\subsecentry ##1##2##3##4##5{\subsecentry2068,68290
+      \def\unnumbsubsecentry ##1##2{\unnumbsubsecentry2069,68331
+      \def\subsubsecentry ##1##2##3##4##5##6{\subsubsecentry2070,68369
+      \def\unnumbsubsubsecentry ##1##2{\unnumbsubsubsecentry2071,68416
+\def\chapentry#1#2#3{\chapentry2084,68850
+\def\shortchapentry#1#2#3{\shortchapentry2087,68967
+    {#2\labelspace #1}space2090,69077
+\def\unnumbchapentry#1#2{\unnumbchapentry2093,69131
+\def\shortunnumberedentry#1#2{\shortunnumberedentry2094,69178
+\def\secentry#1#2#3#4{\secentry2101,69342
+\def\unnumbsecentry#1#2{\unnumbsecentry2102,69401
+\def\subsecentry#1#2#3#4#5{\subsecentry2105,69462
+\def\unnumbsubsecentry#1#2{\unnumbsubsecentry2106,69532
+\def\subsubsecentry#1#2#3#4#5#6{\subsubsecentry2109,69606
+  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}space2110,69640
+\def\unnumbsubsubsecentry#1#2{\unnumbsubsubsecentry2111,69691
+\def\dochapentry#1#2{\dochapentry2122,70065
+\def\dosecentry#1#2{\dosecentry2137,70670
+\def\dosubsecentry#1#2{\dosubsecentry2144,70848
+\def\dosubsubsecentry#1#2{\dosubsubsecentry2151,71033
+\def\labelspace{\labelspace2159,71284
+\def\dopageno#1{\dopageno2161,71319
+\def\doshortpageno#1{\doshortpageno2162,71345
+\def\chapentryfonts{\chapentryfonts2164,71377
+\def\secentryfonts{\secentryfonts2165,71412
+\def\point{\point2191,72371
+\def\result{\result2193,72392
+\def\expansion{\expansion2194,72465
+\def\print{\print2195,72536
+\def\equiv{\equiv2197,72603
+\def\error{\error2217,73376
+\def\tex{\tex2223,73605
address@hidden@2241,73988
+\gdef\sepspaces{\def {\ }}}\2264,74720
+\def\aboveenvbreak{\aboveenvbreak2267,74802
+\def\afterenvbreak{\afterenvbreak2271,74968
+\def\ctl{\ctl2285,75479
+\def\ctr{\ctr2286,75551
+\def\cbl{\cbl2287,75590
+\def\cbr{\cbr2288,75630
+\def\carttop{\carttop2289,75669
+\def\cartbot{\cartbot2292,75777
+\long\def\cartouche{\cartouche2298,75917
+\def\Ecartouche{\Ecartouche2325,76705
+\def\lisp{\lisp2337,76840
+\def\Elisp{\Elisp2347,77187
+\def\next##1{\next2359,77513
+\def\Eexample{\Eexample2363,77555
+\def\Esmallexample{\Esmallexample2366,77602
+\def\smalllispx{\smalllispx2372,77780
+\def\Esmalllisp{\Esmalllisp2382,78134
+\obeyspaces \obeylines \ninett \indexfonts \rawbackslashfonts2395,78490
+\def\next##1{\next2396,78547
+\def\display{\display2400,78627
+\def\Edisplay{\Edisplay2409,78946
+\def\next##1{\next2421,79257
+\def\format{\format2425,79360
+\def\Eformat{\Eformat2433,79656
+\def\next##1{\next2436,79745
+\def\flushleft{\flushleft2440,79797
+\def\Eflushleft{\Eflushleft2450,80168
+\def\next##1{\next2453,80261
+\def\flushright{\flushright2455,80283
+\def\Eflushright{\Eflushright2465,80655
+\def\next##1{\next2469,80786
+\def\quotation{\quotation2473,80844
+\def\Equotation{\Equotation2479,81036
+\def\setdeffont #1 {\setdeffont2492,81434
+\newskip\defbodyindent \defbodyindent=.4inbodyindent2494,81480
+\newskip\defargsindent \defargsindent=50ptargsindent2495,81523
+\newskip\deftypemargin \deftypemargin=12pttypemargin2496,81566
+\newskip\deflastargmargin \deflastargmargin=18ptlastargmargin2497,81609
+\def\activeparens{\activeparens2502,81807
+\def\opnr{\opnr2528,83019
+\def\lbrb{\lbrb2529,83084
+\def\defname #1#2{\defname2535,83285
+\advance\dimen2 by -\defbodyindentbodyindent2539,83403
+\advance\dimen3 by -\defbodyindentbodyindent2541,83457
+\setbox0=\hbox{\hskip \deflastargmargin{lastargmargin2543,83511
+\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for 
continuationsargsindent2545,83653
+\parshape 2 0in \dimen0 \defargsindent \dimen1     %argsindent2546,83728
+\rlap{\rightline{{\rm #2}\hskip \deftypemargin}typemargin2553,84097
+\advance\leftskip by -\defbodyindentbodyindent2556,84231
+\exdentamount=\defbodyindentbodyindent2557,84268
+\def\defparsebody #1#2#3{\defparsebody2567,84627
+\def#1{2571,84811
+\def#2{2572,84847
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2574,84919
+\exdentamount=\defbodyindentbodyindent2575,84993
+\def\defmethparsebody #1#2#3#4 {\defmethparsebody2580,85097
+\def#1{2584,85258
+\def#2##1 {2585,85294
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2587,85377
+\exdentamount=\defbodyindentbodyindent2588,85451
+\def\defopparsebody #1#2#3#4#5 {\defopparsebody2591,85536
+\def#1{2595,85697
+\def#2##1 ##2 {2596,85733
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2599,85833
+\exdentamount=\defbodyindentbodyindent2600,85907
+\def\defvarparsebody #1#2#3{\defvarparsebody2607,86178
+\def#1{2611,86365
+\def#2{2612,86401
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2614,86460
+\exdentamount=\defbodyindentbodyindent2615,86534
+\def\defvrparsebody #1#2#3#4 {\defvrparsebody2620,86625
+\def#1{2624,86784
+\def#2##1 {2625,86820
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2627,86890
+\exdentamount=\defbodyindentbodyindent2628,86964
+\def\defopvarparsebody #1#2#3#4#5 {\defopvarparsebody2631,87036
+\def#1{2635,87200
+\def#2##1 ##2 {2636,87236
+\advance\leftskip by \defbodyindent \advance \rightskip by 
\defbodyindentbodyindent2639,87323
+\exdentamount=\defbodyindentbodyindent2640,87397
+\def\defunargs #1{\defunargs2663,88157
+\def\deftypefunargs #1{\deftypefunargs2675,88539
+\def\deffn{\deffn2689,88921
+\def\deffnheader #1#2#3{\deffnheader2691,88978
+\begingroup\defname {name2692,89026
+\def\defun{\defun2698,89171
+\def\defunheader #1#2{\defunheader2700,89224
+\begingroup\defname {name2701,89299
+\defunargs {unargs2702,89335
+\def\deftypefun{\deftypefun2708,89483
+\def\deftypefunheader #1#2{\deftypefunheader2711,89605
+\def\deftypefunheaderx #1#2 #3\relax{\deftypefunheaderx2713,89714
+\begingroup\defname {name2715,89806
+\deftypefunargs {typefunargs2716,89852
+\def\deftypefn{\deftypefn2722,90023
+\def\deftypefnheader #1#2#3{\deftypefnheader2725,90172
+\def\deftypefnheaderx #1#2#3 #4\relax{\deftypefnheaderx2727,90308
+\begingroup\defname {name2729,90401
+\deftypefunargs {typefunargs2730,90441
+\def\defmac{\defmac2736,90562
+\def\defmacheader #1#2{\defmacheader2738,90619
+\begingroup\defname {name2739,90695
+\defunargs {unargs2740,90728
+\def\defspec{\defspec2746,90852
+\def\defspecheader #1#2{\defspecheader2748,90913
+\begingroup\defname {name2749,90990
+\defunargs {unargs2750,91030
+\def\deffnx #1 {\deffnx2757,91225
+\def\defunx #1 {\defunx2758,91282
+\def\defmacx #1 {\defmacx2759,91339
+\def\defspecx #1 {\defspecx2760,91398
+\def\deftypefnx #1 {\deftypefnx2761,91459
+\def\deftypeunx #1 {\deftypeunx2762,91524
+\def\defop #1 {\defop2768,91670
+\defopparsebody\Edefop\defopx\defopheader\defoptype}opparsebody\Edefop\defopx\defopheader\defoptype2769,91705
+\def\defopheader #1#2#3{\defopheader2771,91759
+\begingroup\defname {name2773,91848
+\defunargs {unargs2774,91894
+\def\defmethod{\defmethod2779,91955
+\def\defmethodheader #1#2#3{\defmethodheader2781,92028
+\begingroup\defname {name2783,92116
+\defunargs {unargs2784,92156
+\def\defcv #1 {\defcv2789,92230
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}opvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype2790,92265
+\def\defcvarheader #1#2#3{\defcvarheader2792,92324
+\begingroup\defname {name2794,92410
+\defvarargs {varargs2795,92456
+\def\defivar{\defivar2800,92529
+\def\defivarheader #1#2#3{\defivarheader2802,92592
+\begingroup\defname {name2804,92678
+\defvarargs {varargs2805,92729
+\def\defopx #1 {\defopx2811,92878
+\def\defmethodx #1 {\defmethodx2812,92935
+\def\defcvx #1 {\defcvx2813,93000
+\def\defivarx #1 {\defivarx2814,93057
+\def\defvarargs #1{\defvarargs2821,93328
+\def\defvr{\defvr2827,93472
+\def\defvrheader #1#2#3{\defvrheader2829,93527
+\begingroup\defname {name2830,93575
+\def\defvar{\defvar2834,93660
+\def\defvarheader #1#2{\defvarheader2836,93720
+\begingroup\defname {name2837,93791
+\defvarargs {varargs2838,93827
+\def\defopt{\defopt2843,93893
+\def\defoptheader #1#2{\defoptheader2845,93953
+\begingroup\defname {name2846,94024
+\defvarargs {varargs2847,94063
+\def\deftypevar{\deftypevar2852,94120
+\def\deftypevarheader #1#2{\deftypevarheader2855,94236
+\begingroup\defname {name2857,94319
+\def\deftypevr{\deftypevr2864,94493
+\def\deftypevrheader #1#2#3{\deftypevrheader2866,94564
+\begingroup\defname {name2867,94616
+\def\defvrx #1 {\defvrx2875,94853
+\def\defvarx #1 {\defvarx2876,94910
+\def\defoptx #1 {\defoptx2877,94969
+\def\deftypevarx #1 {\deftypevarx2878,95028
+\def\deftypevrx #1 {\deftypevrx2879,95095
+\def\deftpargs #1{\deftpargs2884,95244
+\def\deftp{\deftp2888,95324
+\def\deftpheader #1#2#3{\deftpheader2890,95379
+\begingroup\defname {name2891,95427
+\def\deftpx #1 {\deftpx2896,95586
+\def\setref#1{\setref2907,95907
+\def\unnumbsetref#1{\unnumbsetref2912,96021
+\def\appendixsetref#1{\appendixsetref2917,96128
+\def\pxref#1{\pxref2928,96539
+\def\xref#1{\xref2929,96575
+\def\ref#1{\ref2930,96610
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\xrefX[2931,96640
+\def\printedmanual{\printedmanual2932,96683
+\def\printednodename{\printednodename2933,96721
+\def\printednodename{\printednodename2938,96846
+section ``\printednodename'' in \cite{\printedmanual}\printedmanual2953,97479
+\refx{x2956,97557
+\def\dosetq #1#2{\dosetq2964,97777
+\def\internalsetq #1#2{\internalsetq2972,98035
+\def\Ypagenumber{\Ypagenumber2976,98136
+\def\Ytitle{\Ytitle2978,98162
+\def\Ynothing{\Ynothing2980,98189
+\def\Ysectionnumberandtype{\Ysectionnumberandtype2982,98206
+\def\Yappendixletterandtype{\Yappendixletterandtype2991,98522
+\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{no2992,98552
+\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno 
%no.\the\secno2993,98607
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno 
%no.\the\secno.\the\subsecno2995,98711
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno 
%no.\the\secno.\the\subsecno.\the\subsubsecno2997,98782
+  \def\linenumber{\linenumber3008,99121
+\def\refx#1#2{\refx3014,99305
+\def\xrdef #1#2{\xrdef3036,99931
+\def\readauxfile{\readauxfile3039,100016
+\def\supereject{\supereject3109,101797
+\footstrut\parindent=\defaultparindent\hang\textindent{aultparindent\hang\textindent3130,102482
+\def\openindices{\openindices3138,102668
+\newdimen\defaultparindent \defaultparindent = 15ptaultparindent3150,102893
+\parindent = \defaultparindentaultparindent3151,102945
+\def\smallbook{\smallbook3174,103669
+\global\def\Esmallexample{\Esmallexample3191,104096
+\def\afourpaper{\afourpaper3195,104187
+\def\finalout{\finalout3223,104995
+\def\normaldoublequote{\normaldoublequote3234,105256
+\def\normaltilde{\normaltilde3235,105282
+\def\normalcaret{\normalcaret3236,105302
+\def\normalunderscore{\normalunderscore3237,105322
+\def\normalverticalbar{\normalverticalbar3238,105347
+\def\normalless{\normalless3239,105373
+\def\normalgreater{\normalgreater3240,105392
+\def\normalplus{\normalplus3241,105414
+\def\ifusingtt#1#2{\ifusingtt3252,105906
+\def\activedoublequote{\activedoublequote3260,106234
+\def~{~3263,106320
+\def^{^3266,106381
+\def_{_3269,106420
+\def\_{\_3271,106494
+\def\lvvmode{\lvvmode3278,106831
+\def|{|3281,106881
+\def<{<3284,106944
+\def>{>3287,107001
+\def+{+3289,107039
+\def\turnoffactive{\turnoffactive3295,107200
+\global\def={=3306,107486
+\def\normalbackslash{\normalbackslash3320,107868
+
+c-src//c.c,76
+T f(1,0
+}T i;2,14
+void bar(5,69
+int foobar(6,94
+interface_locate(9,131
+
+c.c,2136
+void (*fa)fa131,
+void 132,
+my_printf 135,
+void fatala 138,
+void fatalb 139,
+max 141,
+struct bar 143,
+  char z;144,
+  struct foo f;145,
+__attribute__ ((always_inline)) max 147,
+extern int old_var 149,
+struct foo150,
+  char a;152,
+  int x[x153,
+char stack[stack155,
+struct S 156,
+struct S { short f[f156,
+  int *__ip;__ip159,
+  union wait *__up;__up160,
+} wait_status_ptr_t 161,
+Some_Class  A 162,
+typedef T1 T3 163,
+T3 z 164,
+typedef int more_aligned_int 165,
+struct S  __attribute__ ((vector_size (16))) foo;166,
+int foo 167,
+char *__attribute__((aligned(8))) *f;f168,
+int i 169,
+extern void foobar 170,
+typedef struct cacheLRUEntry_s172,
+  U16 next;174,
+  U16 prev;175,
+__attribute__ ((packed)) cacheLRUEntry_t;177,
+struct foo 178,
+  int x;179,
+  char a,180,
+  char a, b,180,
+  char a, b, c,180,
+  char a, b, c, d;180,
+     f1 183,
+void f2 184,
+__attribute__((noreturn)) void d0 185,
+  __attribute__((format(printf, 1, 2))) d1 186,
+  d2 187,
+int x 188,
+struct foo 189,
+struct foo { int x[x189,
+short array[array190,
+int f193,
+DEAFUN 196,
+XDEFUN 203,
+DEFUN ("x-get-selection-internal", 
Fx_get_selection_internal,x-get-selection-internal206,
+       Fx_get_selection_internal,x-get-selection-internal212,
+      Fy_get_selection_internal,y-get-selection-internal216,
+defun_func1(218,
+DEFUN_func2(220,
+typedef int bool;222,
+bool funcboo 223,
+struct my_struct 226,
+typedef struct my_struct my_typedef;228,
+int bla 229,
+a(234,
+int func1237,
+static struct cca_control init_control 239,
+static tpcmd rbtp 240,
+static byte ring1 241,
+static byte ring2 242,
+request request 243,
+int func2 246,
+  aaa;249,
+  bbb;251,
+struct sss1 252,
+struct sss2253,
+  struct ss3255,
+struct a b;259,
+struct aa *b;b260,
+  **b;b262,
+caccacacca 263,
+a 267,
+  typedef struct aa 269,
+  typedef struct aa {} aaa;269,
+static void inita 271,
+node *lasta lasta272,
+b 273,
+  typedef  int bb;275,
+static void initb 277,
+node *lastb lastb278,
+typedef enum { REG_ENOSYS 279,
+typedef enum { REG_ENOSYS = -1, aa 279,
+typedef enum { REG_ENOSYS = -1, aa } reg_errcode_t;279,
+
+c-src/a/b/b.c,18
+#define this 1,0
+
+../c/c.web,20
+#define questo 34,
+
+y-src/parse.y,1061
+#define obstack_chunk_alloc 46,1111
+#define obstack_chunk_free 47,1149
+int yylex 57,1317
+void yyerror 59,1347
+void yyerror 61,1376
+VOIDSTAR parse_hash;63,1400
+extern VOIDSTAR hash_find(64,1421
+unsigned char fnin[fnin67,1519
+#define YYSTYPE 71,1617
+typedef struct node *YYSTYPE;YYSTYPE72,1648
+YYSTYPE parse_return;73,1678
+YYSTYPE make_list 75,1716
+YYSTYPE make_list 77,1760
+char *instr;instr80,1790
+int parse_error 81,1803
+extern struct obstack tmp_mem;82,1824
+line:line86,1862
+exp:exp94,1975
+exp_list:exp_list262,5642
+range_exp:range_exp268,5740
+range_exp_list:range_exp_list272,5770
+cell:cell278,5888
+yyerror FUN1(285,5935
+make_list FUN2(292,6015
+#define ERROR 303,6215
+extern struct node *yylval;yylval305,6233
+unsigned char parse_cell_or_range 308,6278
+unsigned char parse_cell_or_range 310,6342
+yylex FUN0(314,6392
+parse_cell_or_range FUN2(586,11758
+#define CK_ABS_R(670,13200
+#define CK_REL_R(674,13279
+#define CK_ABS_C(679,13408
+#define CK_REL_C(683,13487
+#define MAYBEREL(688,13616
+str_to_col FUN1(846,16817
+
+y-src/parse.c,520
+#define YYBISON 4,64
+# define       NE      6,114
+# define       LE      7,130
+# define       GE      8,146
+# define       NEG     9,162
+# define       L_CELL  10,179
+# define       L_RANGE 11,199
+# define       L_VAR   12,220
+# define       L_CONST 13,239
+# define       L_FN0   14,260
+# define       L_FN1   15,279
+# define       L_FN2   16,298
+# define       L_FN3   17,317
+# define       L_FN4   18,336
+# define       L_FNN   19,355
+# define       L_FN1R  20,374
+# define       L_FN2R  21,394
+# define       L_FN3R  22,414
+# define       L_FN4R  23,434
+# define       L_FNNR  24,454
+# define       L_LE    25,474
+# define       L_NE    26,492
+# define       L_GE    27,510
+
+parse.y,1464
+#define obstack_chunk_alloc 46,
+#define obstack_chunk_free 47,
+int yylex 57,
+void yyerror 59,
+void yyerror 61,
+VOIDSTAR parse_hash;63,
+extern VOIDSTAR hash_find(64,
+unsigned char fnin[fnin67,
+#define YYSTYPE 71,
+typedef struct node *YYSTYPE;YYSTYPE72,
+YYSTYPE parse_return;73,
+YYSTYPE make_list 75,
+YYSTYPE make_list 77,
+char *instr;instr80,
+int parse_error 81,
+extern struct obstack tmp_mem;82,
+#define YYSTYPE 85,
+# define YYDEBUG 88,
+#define        YYFINAL 93,
+#define        YYFLAG  94,
+#define        YYNTBASE        95,
+#define YYTRANSLATE(98,
+static const char yytranslate[yytranslate101,
+static const short yyprhs[yyprhs134,
+static const short yyrhs[yyrhs142,
+static const short yyrline[yyrline171,
+static const char *const yytname[yytname185,
+static const short yyr1[yyr1197,
+static const short yyr2[yyr2207,
+static const short yydefact[yydefact219,
+static const short yydefgoto[yydefgoto237,
+static const short yypact[yypact242,
+static const short yypgoto[yypgoto260,
+#define        YYLAST  266,
+static const short yytable[yytable269,
+static const short yycheck[yycheck330,
+yyerror FUN1(285,
+make_list FUN2(292,
+#define ERROR 303,
+extern struct node *yylval;yylval305,
+unsigned char parse_cell_or_range 308,
+unsigned char parse_cell_or_range 310,
+yylex FUN0(314,
+parse_cell_or_range FUN2(586,
+#define CK_ABS_R(670,
+#define CK_REL_R(674,
+#define CK_ABS_C(679,
+#define CK_REL_C(683,
+#define MAYBEREL(688,
+str_to_col FUN1(846,
+
+/usr/share/bison/bison.simple,2238
+# define YYSTD(40,
+# define YYSTD(42,
+#  define YYSTACK_ALLOC 50,
+#  define YYSIZE_T 51,
+#    define YYSTACK_ALLOC 55,
+#    define YYSIZE_T 56,
+#     define YYSTACK_ALLOC 59,
+#  define YYSTACK_FREE(67,
+#   define YYSIZE_T 71,
+#    define YYSIZE_T 75,
+#  define YYSTACK_ALLOC 78,
+#  define YYSTACK_FREE 79,
+union yyalloc83,
+  short yyss;85,
+  YYSTYPE yyvs;86,
+  YYLTYPE yyls;88,
+# define YYSTACK_GAP_MAX 93,
+#  define YYSTACK_BYTES(98,
+#  define YYSTACK_BYTES(102,
+# define YYSTACK_RELOCATE(112,
+# define YYSIZE_T 128,
+# define YYSIZE_T 131,
+#  define YYSIZE_T 136,
+#   define YYSIZE_T 140,
+# define YYSIZE_T 145,
+#define yyerrok        148,
+#define yyclearin      149,
+#define YYEMPTY        150,
+#define YYEOF  151,
+#define YYACCEPT       152,
+#define YYABORT 153,
+#define YYERROR        154,
+#define YYFAIL 158,
+#define YYRECOVERING(159,
+#define YYBACKUP(160,
+#define YYTERROR       177,
+#define YYERRCODE      178,
+# define YYLLOC_DEFAULT(189,
+#   define YYLEX       200,
+#   define YYLEX       202,
+#   define YYLEX       206,
+#   define YYLEX       208,
+# define YYLEX 212,
+#  define YYFPRINTF 225,
+# define YYDPRINTF(228,
+int yydebug;237,
+# define YYDPRINTF(239,
+# define YYINITDEPTH 244,
+# undef YYMAXDEPTH255,
+# define YYMAXDEPTH 259,
+#  define yymemcpy 264,
+yymemcpy 271,
+#   define yystrlen 293,
+yystrlen 298,
+#   define yystpcpy 316,
+yystpcpy 322,
+#  define YYPARSE_PARAM_ARG 351,
+#  define YYPARSE_PARAM_DECL352,
+#  define YYPARSE_PARAM_ARG 354,
+#  define YYPARSE_PARAM_DECL 355,
+# define YYPARSE_PARAM_ARG358,
+# define YYPARSE_PARAM_DECL359,
+int yyparse 365,
+int yyparse 367,
+#define YY_DECL_NON_LSP_VARIABLES      374,
+# define YY_DECL_VARIABLES     385,
+# define YY_DECL_VARIABLES     391,
+yyparse 403,
+# define YYPOPSTACK 445,
+# define YYPOPSTACK 447,
+# undef YYSTACK_RELOCATE548,
+  *++yyvsp yyvsp746,
+  *++yylsp yylsp748,
+  yyn 755,
+  yystate 757,
+    yystate 761,
+  goto yynewstate;763,
+  goto yyerrlab1;823,
+  yyerrstatus 846,
+  goto yyerrhandle;848,
+  yyn 861,
+  yystate 875,
+  yyn 895,
+  yyn 903,
+  YYDPRINTF 917,
+  *++yyvsp yyvsp919,
+  *++yylsp yylsp921,
+  yystate 924,
+  goto yynewstate;925,
+  yyresult 932,
+  goto yyreturn;933,
+  yyresult 939,
+  goto yyreturn;940,
+  yyerror 946,
+  yyresult 947,
+
+y-src/atest.y,9
+exp    2,3
+
+y-src/cccp.c,303
+#define YYBISON 4,63
+# define       INT     6,113
+# define       CHAR    7,130
+# define       NAME    8,148
+# define       ERROR   9,166
+# define       OR      10,185
+# define       AND     11,201
+# define       EQUAL   12,218
+# define       NOTEQUAL        13,237
+# define       LEQ     14,259
+# define       GEQ     15,276
+# define       LSH     16,293
+# define       RSH     17,310
+# define       UNARY   18,327
+
+cccp.y,2532
+typedef unsigned char U_CHAR;38,
+struct arglist 41,
+  struct arglist *next;next42,
+  U_CHAR *name;name43,
+  int length;44,
+  int argno;45,
+#define NULL 51,
+#define GENERIC_PTR 56,
+#define GENERIC_PTR 58,
+#define NULL_PTR 63,
+int yylex 66,
+void yyerror 67,
+int expression_value;68,
+static jmp_buf parse_return_error;70,
+static int keyword_parsing 73,
+extern unsigned char is_idstart[is_idstart76,
+extern unsigned char is_idstart[], is_idchar[is_idchar76,
+extern unsigned char is_idstart[], is_idchar[], is_hor_space[is_hor_space76,
+extern char *xmalloc xmalloc78,
+extern int pedantic;81,
+extern int traditional;84,
+#define CHAR_TYPE_SIZE 87,
+#define INT_TYPE_SIZE 91,
+#define LONG_TYPE_SIZE 95,
+#define WCHAR_TYPE_SIZE 99,
+#define possible_sum_sign(104,
+static void integer_overflow 106,
+static long left_shift 107,
+static long right_shift 108,
+  struct constant 113,
+  struct constant {long value;113,
+  struct constant {long value; int unsignedp;113,
+  struct constant {long value; int unsignedp;} integer;113,
+  struct name 114,
+  struct name {U_CHAR *address;address114,
+  struct name {U_CHAR *address; int length;114,
+  struct name {U_CHAR *address; int length;} name;114,
+  struct arglist *keywords;keywords115,
+  int voidval;116,
+  char *sval;sval117,
+} yystype;118,
+# define YYSTYPE 119,
+# define YYDEBUG 122,
+#define        YYFINAL 127,
+#define        YYFLAG  128,
+#define        YYNTBASE        129,
+#define YYTRANSLATE(132,
+static const char yytranslate[yytranslate135,
+static const short yyprhs[yyprhs167,
+static const short yyrhs[yyrhs174,
+static const short yyrline[yyrline195,
+static const char *const yytname[yytname208,
+static const short yyr1[yyr1219,
+static const short yyr2[yyr2228,
+static const short yydefact[yydefact239,
+static const short yydefgoto[yydefgoto251,
+static const short yypact[yypact256,
+static const short yypgoto[yypgoto268,
+#define        YYLAST  274,
+static const short yytable[yytable277,
+static const short yycheck[yycheck301,
+static char *lexptr;lexptr332,
+parse_number 341,
+struct token 437,
+  char *operator;operator438,
+  int token;439,
+static struct token tokentab2[tokentab2442,
+yylex 459,
+parse_escape 740,
+yyerror 836,
+integer_overflow 844,
+left_shift 851,
+right_shift 873,
+parse_c_expression 893,
+extern int yydebug;919,
+main 923,
+unsigned char is_idchar[is_idchar948,
+unsigned char is_idstart[is_idstart950,
+char is_hor_space[is_hor_space953,
+initialize_random_junk 958,
+error 988,
+warning 993,
+lookup 999,
+
+/usr/share/bison/bison.simple,2238
+# define YYSTD(40,
+# define YYSTD(42,
+#  define YYSTACK_ALLOC 50,
+#  define YYSIZE_T 51,
+#    define YYSTACK_ALLOC 55,
+#    define YYSIZE_T 56,
+#     define YYSTACK_ALLOC 59,
+#  define YYSTACK_FREE(67,
+#   define YYSIZE_T 71,
+#    define YYSIZE_T 75,
+#  define YYSTACK_ALLOC 78,
+#  define YYSTACK_FREE 79,
+union yyalloc83,
+  short yyss;85,
+  YYSTYPE yyvs;86,
+  YYLTYPE yyls;88,
+# define YYSTACK_GAP_MAX 93,
+#  define YYSTACK_BYTES(98,
+#  define YYSTACK_BYTES(102,
+# define YYSTACK_RELOCATE(112,
+# define YYSIZE_T 128,
+# define YYSIZE_T 131,
+#  define YYSIZE_T 136,
+#   define YYSIZE_T 140,
+# define YYSIZE_T 145,
+#define yyerrok        148,
+#define yyclearin      149,
+#define YYEMPTY        150,
+#define YYEOF  151,
+#define YYACCEPT       152,
+#define YYABORT 153,
+#define YYERROR        154,
+#define YYFAIL 158,
+#define YYRECOVERING(159,
+#define YYBACKUP(160,
+#define YYTERROR       177,
+#define YYERRCODE      178,
+# define YYLLOC_DEFAULT(189,
+#   define YYLEX       200,
+#   define YYLEX       202,
+#   define YYLEX       206,
+#   define YYLEX       208,
+# define YYLEX 212,
+#  define YYFPRINTF 225,
+# define YYDPRINTF(228,
+int yydebug;237,
+# define YYDPRINTF(239,
+# define YYINITDEPTH 244,
+# undef YYMAXDEPTH255,
+# define YYMAXDEPTH 259,
+#  define yymemcpy 264,
+yymemcpy 271,
+#   define yystrlen 293,
+yystrlen 298,
+#   define yystpcpy 316,
+yystpcpy 322,
+#  define YYPARSE_PARAM_ARG 351,
+#  define YYPARSE_PARAM_DECL352,
+#  define YYPARSE_PARAM_ARG 354,
+#  define YYPARSE_PARAM_DECL 355,
+# define YYPARSE_PARAM_ARG358,
+# define YYPARSE_PARAM_DECL359,
+int yyparse 365,
+int yyparse 367,
+#define YY_DECL_NON_LSP_VARIABLES      374,
+# define YY_DECL_VARIABLES     385,
+# define YY_DECL_VARIABLES     391,
+yyparse 403,
+# define YYPOPSTACK 445,
+# define YYPOPSTACK 447,
+# undef YYSTACK_RELOCATE548,
+  *++yyvsp yyvsp746,
+  *++yylsp yylsp748,
+  yyn 755,
+  yystate 757,
+    yystate 761,
+  goto yynewstate;763,
+  goto yyerrlab1;823,
+  yyerrstatus 846,
+  goto yyerrhandle;848,
+  yyn 861,
+  yystate 875,
+  yyn 895,
+  yyn 903,
+  YYDPRINTF 917,
+  *++yyvsp yyvsp919,
+  *++yylsp yylsp921,
+  yystate 924,
+  goto yynewstate;925,
+  yyresult 932,
+  goto yyreturn;933,
+  yyresult 939,
+  goto yyreturn;940,
+  yyerror 946,
+  yyresult 947,
+
+y-src/cccp.y,2171
+typedef unsigned char U_CHAR;38,1201
+struct arglist 41,1301
+  struct arglist *next;next42,1318
+  U_CHAR *name;name43,1342
+  int length;44,1358
+  int argno;45,1372
+#define NULL 51,1468
+#define GENERIC_PTR 56,1578
+#define GENERIC_PTR 58,1611
+#define NULL_PTR 63,1670
+int yylex 66,1712
+void yyerror 67,1726
+int expression_value;68,1743
+static jmp_buf parse_return_error;70,1766
+static int keyword_parsing 73,1865
+extern unsigned char is_idstart[is_idstart76,1944
+extern unsigned char is_idstart[], is_idchar[is_idchar76,1944
+extern unsigned char is_idstart[], is_idchar[], 
is_hor_space[is_hor_space76,1944
+extern char *xmalloc xmalloc78,2009
+extern int pedantic;81,2062
+extern int traditional;84,2114
+#define CHAR_TYPE_SIZE 87,2162
+#define INT_TYPE_SIZE 91,2229
+#define LONG_TYPE_SIZE 95,2296
+#define WCHAR_TYPE_SIZE 99,2365
+#define possible_sum_sign(104,2556
+static void integer_overflow 106,2632
+static long left_shift 107,2665
+static long right_shift 108,2692
+  struct constant 112,2733
+  struct constant {long value;112,2733
+  struct constant {long value; int unsignedp;112,2733
+  struct constant {long value; int unsignedp;} integer;112,2733
+  struct name 113,2789
+  struct name {U_CHAR *address;address113,2789
+  struct name {U_CHAR *address; int length;113,2789
+  struct name {U_CHAR *address; int length;} name;113,2789
+  struct arglist *keywords;keywords114,2840
+  int voidval;115,2868
+  char *sval;sval116,2883
+start 143,3226
+exp1   148,3330
+exp    156,3505
+exp    185,4295
+keywords 306,7835
+static char *lexptr;lexptr332,8579
+parse_number 341,8842
+struct token 437,11038
+  char *operator;operator438,11053
+  int token;439,11071
+static struct token tokentab2[tokentab2442,11088
+yylex 459,11367
+parse_escape 740,17718
+yyerror 836,19599
+integer_overflow 844,19690
+left_shift 851,19804
+right_shift 873,20194
+parse_c_expression 893,20732
+extern int yydebug;919,21416
+main 923,21483
+unsigned char is_idchar[is_idchar948,21901
+unsigned char is_idstart[is_idstart950,21996
+char is_hor_space[is_hor_space953,22160
+initialize_random_junk 958,22259
+error 988,22915
+warning 993,22963
+lookup 999,23033
+
+tex-src/nonewline.tex,0
+
+php-src/sendmail.php,0
+
+a-src/empty.zz,0
diff --git a/test/etags/Makefile b/test/etags/Makefile
new file mode 100644
index 0000000..635d129
--- /dev/null
+++ b/test/etags/Makefile
@@ -0,0 +1,79 @@
+ADASRC=$(addprefix ./ada-src/,etags-test-for.ada 2ataspri.adb 2ataspri.ads 
waroquiers.ada)
+ASRC=$(addprefix ./a-src/,empty.zz empty.zz.gz)
+CSRC=$(addprefix ./c-src/,abbrev.c .//c.c torture.c getopt.h etags.c\
+ exit.c exit.strange_suffix sysdep.h tab.c dostorture.c\
+ emacs/src/gmalloc.c emacs/src/regex.h emacs/src/keyboard.c emacs/src/lisp.h\
+ machsyscalls.c machsyscalls.h fail.c a/b/b.c) ../etags/c-src/h.h
+CPSRC=$(addprefix ./cp-src/,c.C abstract.C abstract.H cfront.H burton.cpp 
burton.cpp\
+ functions.cpp MDiagArray2.h Pctest.h Range.h\
+ screen.cpp screen.hpp conway.cpp conway.hpp clheir.cpp.gz clheir.hpp.gz 
fail.C)
+ELSRC=$(addprefix ./el-src/,TAGTEST.EL emacs/lisp/progmodes/etags.el)
+ERLSRC=$(addprefix ./erl-src/,gs_dialog.erl lines.erl lists.erl)
+FORTHSRC=$(addprefix ./forth-src/,test-forth.fth)
+FSRC=$(addprefix ./f-src/,entry.for entry.strange_suffix entry.strange)
+HTMLSRC=$(addprefix ./html-src/,softwarelibero.html index.shtml algrthms.html 
software.html)
+JAVASRC=$(addprefix ./java-src/,AWTEMul.java KeyEve.java SMan.java SysCol.java 
TG.java)
+LUASRC=$(addprefix ./lua-src/,allegro.lua)
+MAKESRC=$(addprefix ./make-src/,Makefile)
+OBJCSRC=$(addprefix ./objc-src/,Subprocess.h Subprocess.m PackInsp.h 
PackInsp.m)
+OBJCPPSRC=$(addprefix ./objcpp-src/,SimpleCalc.H SimpleCalc.M)
+PASSRC=$(addprefix ./pas-src/,common.pas)
+PERLSRC=$(addprefix ./perl-src/,htlmify-cystic yagrip.pl kai-test.pl mirror.pl)
+PHPSRC=$(addprefix ./php-src/,lce_functions.php ptest.php sendmail.php)
+PSSRC=$(addprefix ./ps-src/,rfc1245.ps)
+PROLSRC=$(addprefix ./prol-src/,ordsets.prolog natded.prolog)
+PYTSRC=$(addprefix ./pyt-src/,server.py)
+TEXSRC=$(addprefix ./tex-src/,testenv.tex gzip.texi texinfo.tex nonewline.tex)
+YSRC=$(addprefix ./y-src/,parse.y parse.c atest.y cccp.c cccp.y)
+SRCS=Makefile ${ADASRC} ${ASRC} ${CSRC} ${CPSRC} ${ELSRC} ${ERLSRC} ${FSRC}\
+     ${FORTHSRC} ${HTMLSRC} ${JAVASRC} ${LUASRC} ${MAKESRC} ${OBJCSRC}\
+     ${OBJCPPSRC} ${PASSRC} ${PHPSRC} ${PERLSRC} ${PSSRC} ${PROLSRC} ${PYTSRC}\
+     ${TEXSRC} ${YSRC}
+NONSRCS=./f-src/entry.strange ./erl-src/lists.erl ./cp-src/clheir.hpp.gz
+
+ETAGS_PROG=../../lib-src/etags
+CTAGS_PROG=../../lib-src/ctags
+
+REGEX=/[ \t]*DEFVAR_[A-Z_ \t\n(]+"\([^"]+\)"/
+xx="this line is here because of a fontlock bug
+
+RUN=
+
+OPTIONS=--members --declarations address@hidden
+ARGS=- < srclist
+
+infiles = $(filter-out ${NONSRCS},${SRCS}) srclist regexfile
+
+check:
+       @$(MAKE) OPTIONS='--no-members' ediff_1
+       @$(MAKE) OPTIONS='--declarations --no-members' ediff_2
+       @$(MAKE) OPTIONS='--members' ediff_3
+       @$(MAKE) OPTIONS='address@hidden --no-members' ediff_4
+       @$(MAKE) OPTIONS='nonexistent --members --declarations address@hidden' 
ediff_5
+       @$(MAKE) cdiff
+
+ediff%: ETAGS.good% ETAGS ${infiles}
+       diff -u --suppress-common-lines --width=80 ETAGS.good$* ETAGS
+
+cdiff: CTAGS.good CTAGS ${infiles}
+       diff -u --suppress-common-lines --width=80 CTAGS.good CTAGS
+
+ETAGS: FRC ${infiles}
+       ${RUN} ${ETAGS_PROG} ${OPTIONS} -o $@ ${ARGS}
+
+CTAGS: FRC ${infiles}
+       ${RUN} ${CTAGS_PROG} -o $@ address@hidden ${ARGS}
+
+srclist: Makefile
+       @for i in $(SRCS); do echo $$i; done > srclist
+       @echo "srclist remade"
+
+regexfile: Makefile
+       @echo ' -- This is for GNU Emacs source files' > regexfile
+       @echo '${REGEX}' >> regexfile
+       @echo '{c}${REGEX}\\1/m' >> regexfile
+       @echo "regexfile remade"
+
+.PRECIOUS: ETAGS.good CTAGS.good
+
+FRC:;
diff --git a/test/etags/a-src/empty.zz b/test/etags/a-src/empty.zz
new file mode 100644
index 0000000..e69de29
diff --git a/test/etags/a-src/empty.zz.gz b/test/etags/a-src/empty.zz.gz
new file mode 100644
index 0000000..e69de29
diff --git a/test/etags/ada-src/2ataspri.adb b/test/etags/ada-src/2ataspri.adb
new file mode 100644
index 0000000..43ca983
--- /dev/null
+++ b/test/etags/ada-src/2ataspri.adb
@@ -0,0 +1,665 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                 GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS               --
+--                                                                          --
+--                S Y S T E M . T A S K _ P R I M I T I V E S               --
+--                                                                          --
+--                                  B o d y                                 --
+--                                                                          --
+--                             $Revision: 1.1 $                             --
+--                                                                          --
+--     Copyright (C) 1991,1992,1993,1994,1996 Florida State University      --
+--                                                                          --
+-- GNARL is free software; you can redistribute it  and/or modify it  under --
+-- terms  of  the  GNU  Library General Public License  as published by the --
+-- Free Software  Foundation;  either version 2, or (at  your  option)  any --
+-- later  version.  GNARL is distributed  in the hope that  it will be use- --
+-- ful, but but WITHOUT ANY WARRANTY;  without even the implied warranty of --
+-- MERCHANTABILITY  or  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Gen- --
+-- eral Library Public License  for more details.  You should have received --
+-- a  copy of the GNU Library General Public License along with GNARL;  see --
+-- file COPYING.LIB.  If not,  write to the  Free Software Foundation,  675 --
+-- Mass Ave, Cambridge, MA 02139, USA.                                      --
+--                                                                          --
+------------------------------------------------------------------------------
+
+with GNAT.IO;
+with Interfaces.C.POSIX_timers;
+
+with Interfaces.C.POSIX_Error;
+use  Interfaces.C.POSIX_Error;
+
+with Interfaces.C.POSIX_RTE;
+use  Interfaces.C.POSIX_RTE;
+
+with Interfaces.C.Pthreads;
+use  Interfaces.C.Pthreads;
+
+with Interfaces.C;
+use  Interfaces.C;
+
+with System.Tasking;
+use  System.Tasking;
+
+with System.Storage_Elements;
+use  System.Storage_Elements;
+
+with System.Compiler_Exceptions;
+use  System.Compiler_Exceptions;
+
+with System.Task_Specific_Data;
+use  System.Task_Specific_Data;
+
+with System.Secondary_Stack;
+use  System.Secondary_Stack;
+
+with System.Tasking_Soft_Links;
+
+with System.Task_Clock;
+use  System.Task_Clock;
+
+with Unchecked_Conversion;
+with Interfaces.C.System_Constants;
+
+package body System.Task_Primitives is
+
+   use Interfaces.C.Pthreads;
+   use Interfaces.C.System_Constants;
+
+   package RTE renames Interfaces.C.POSIX_RTE;
+   package TSL renames System.Tasking_Soft_Links;
+
+   Test_And_Set_Mutex : Lock;
+
+   Abort_Signal : constant := 6;
+
+   Abort_Handler : Abort_Handler_Pointer;
+
+   ATCB_Key : aliased pthread_key_t;
+
+   Unblocked_Signal_Mask : aliased RTE.Signal_Set;
+   --  The set of signals that should be unblocked in a task.
+   --  This is in general the signals that can be generated synchronously,
+   --  and which should therefore be converted into Ada exceptions.
+   --  It also includes the Abort_Signal, to allow asynchronous abortion.
+
+   function To_void_ptr is new
+     Unchecked_Conversion (TCB_Ptr, void_ptr);
+
+   function To_TCB_Ptr is new
+     Unchecked_Conversion (void_ptr, TCB_Ptr);
+
+   function pthread_mutexattr_setprotocol
+     (attr : access pthread_attr_t; priority : integer) return int;
+   pragma Import (C,
+                  pthread_mutexattr_setprotocol,
+                  "pthread_mutexattr_setprotocol",
+                  "pthread_mutexattr_setprotocol");
+
+   function pthread_mutexattr_setprio_ceiling
+     (attr : access pthread_attr_t; priority : int) return int;
+   pragma Import (C,
+                  pthread_mutexattr_setprio_ceiling,
+                  "pthread_mutexattr_setprio_ceiling",
+                  "pthread_mutexattr_setprio_ceiling");
+
+   pthread_mutexattr_default : pthread_mutexattr_t;
+   pragma Import (C, pthread_mutexattr_default,
+                  "pthread_mutexattr_default",
+                  "pthread_mutexattr_default");
+
+   -----------------------
+   -- Local Subprograms --
+   -----------------------
+
+   procedure Abort_Wrapper
+     (signo   : Integer;
+      info    : RTE.siginfo_ptr;
+      context : System.Address);
+   --  This is a signal handler procedure which calls the user-specified
+   --  abort handler procedure.
+
+   procedure LL_Wrapper (T : TCB_Ptr);
+   --  A wrapper procedure that is called from a new low-level task.
+   --  It performs initializations for the new task and calls the
+   --  user-specified startup procedure.
+
+   -------------------------
+   -- Initialize_LL_Tasks --
+   -------------------------
+
+   procedure Initialize_LL_Tasks (T : TCB_Ptr) is
+      Result : int;
+   begin
+      T.LL_Entry_Point := null;
+      T.Thread := pthread_self;
+
+      Result := pthread_key_create (ATCB_Key'Access, null);
+
+      if Result = FUNC_ERR then
+         raise Storage_Error;               --  Insufficient resources.
+      end if;
+
+      T.Thread := pthread_self;
+
+      Result := pthread_setspecific (ATCB_Key, To_void_ptr (T));
+
+      if Result = FUNC_ERR then
+         GNAT.IO.Put_Line ("Get specific failed");
+         raise Storage_Error;               --  Insufficient resources.
+      end if;
+      pragma Assert (Result /= FUNC_ERR,
+         "GNULLI failure---pthread_setspecific");
+
+   end Initialize_LL_Tasks;
+
+   ----------
+   -- Self --
+   ----------
+
+   function Self return TCB_Ptr is
+      Temp   : aliased void_ptr;
+      Result : int;
+   begin
+      Result := pthread_getspecific (ATCB_Key, Temp'Access);
+      pragma Assert (Result /= FUNC_ERR,
+          "GNULLI failure---pthread_getspecific");
+      return To_TCB_Ptr (Temp);
+   end Self;
+
+   ---------------------
+   -- Initialize_Lock --
+   ---------------------
+
+   procedure Initialize_Lock
+     (Prio : System.Any_Priority;
+      L    : in out Lock)
+   is
+
+      Attributes : aliased pthread_mutexattr_t;
+      Result     : int;
+      MUTEX_NONRECURSIVE_NP : constant := 2;
+
+   begin
+      Result := pthread_mutexattr_init (Attributes'Access);
+      if Result = FUNC_ERR then
+         raise STORAGE_ERROR;  --  should be ENOMEM
+      end if;
+
+      Result := pthread_mutexattr_setkind
+        (Attributes'Access, MUTEX_NONRECURSIVE_NP);
+      if Result = FUNC_ERR then
+         raise STORAGE_ERROR;  --  should be ENOMEM
+      end if;
+
+      Result := pthread_mutex_init (L.mutex'Access, Attributes);
+
+      if Result = FUNC_ERR then
+         Result := pthread_mutexattr_destroy (Attributes'Access);
+         raise STORAGE_ERROR;  --  should be ENOMEM ???
+      end if;
+
+      Result := pthread_mutexattr_destroy (Attributes'Access);
+
+   end Initialize_Lock;
+
+   -------------------
+   -- Finalize_Lock --
+   -------------------
+
+   procedure Finalize_Lock (L : in out Lock) is
+      Result : int;
+   begin
+      Result := pthread_mutex_destroy (L.mutex'Access);
+      pragma Assert
+         (Result /= FUNC_ERR, "GNULLI failure---pthread_mutex_destroy");
+   end Finalize_Lock;
+
+   ----------------
+   -- Write_Lock --
+   ----------------
+
+   --
+   --  The current pthreads implementation does not check for Ceiling
+   --  violations.
+   --
+   procedure Write_Lock (L : in out Lock; Ceiling_Violation : out Boolean) is
+      Result : int;
+   begin
+      Ceiling_Violation := False;
+      Result := pthread_mutex_lock (L.mutex'Access);
+      pragma Assert
+        (Result /= FUNC_ERR, "GNULLI FUNC_ERR---pthread_mutex_lock");
+   end Write_Lock;
+
+   ---------------
+   -- Read_Lock --
+   ---------------
+
+   procedure Read_Lock (L : in out Lock; Ceiling_Violation : out Boolean)
+      renames Write_Lock;
+
+   ------------
+   -- Unlock --
+   ------------
+
+   procedure Unlock (L : in out Lock) is
+      Result : int;
+   begin
+      Result := pthread_mutex_unlock (L.mutex'Access);
+      pragma Assert
+         (Result /= FUNC_ERR, "GNULLI FUNC_ERR---pthread_mutex_unlock");
+   end Unlock;
+
+   ---------------------
+   -- Initialize_Cond --
+   ---------------------
+
+   procedure Initialize_Cond (Cond : in out Condition_Variable) is
+      Attributes : aliased Pthreads.pthread_condattr_t;
+      Result     : int;
+   begin
+      Result := pthread_condattr_init (Attributes'Access);
+
+      if Result = FUNC_ERR then
+         raise STORAGE_ERROR;  --  should be ENOMEM ???
+      end if;
+
+      --  Result := pthread_cond_init (Cond.CV'Access, Attributes'Access);
+      Result := pthread_cond_init (Cond.CV'Access, Attributes);
+
+
+      if Result = FUNC_ERR then
+         raise STORAGE_ERROR;  --  should be ENOMEM  ???
+      end if;
+
+      Result := pthread_condattr_destroy (Attributes'Access);
+      pragma Assert
+         (Result /= FUNC_ERR, "GNULLI FUNC_ERR---pthread_condattr_destroy");
+
+   end Initialize_Cond;
+
+   -------------------
+   -- Finalize_Cond --
+   -------------------
+
+   procedure Finalize_Cond (Cond : in out Condition_Variable) is
+      Result : int;
+
+   begin
+      Result := pthread_cond_destroy (Cond.CV'Access);
+      pragma Assert
+         (Result /= FUNC_ERR, "GNULLI failure---pthread_cond_destroy");
+   end Finalize_Cond;
+
+
+   ---------------
+   -- Cond_Wait --
+   ---------------
+
+   procedure Cond_Wait (Cond : in out Condition_Variable; L : in out Lock) is
+      Result : int;
+   begin
+      Result := pthread_cond_wait (Cond.CV'Access, L.mutex'Access);
+      pragma Assert
+        (Result /= FUNC_ERR, "GNULLI failure---pthread_cond_wait");
+   end Cond_Wait;
+
+   ---------------------
+   -- Cond_Timed_Wait --
+   ---------------------
+
+   procedure Cond_Timed_Wait
+     (Cond      : in out Condition_Variable;
+      L         : in out Lock;
+      Abs_Time  : System.Task_Clock.Stimespec;
+      Timed_Out : out Boolean) is
+
+      Result : int;
+      TV     : aliased timespec;
+
+      use POSIX_Error;
+
+   begin
+      Timed_Out := False;  --  Assume success until we know otherwise
+
+      TV.tv_sec := int (Interfaces.C.POSIX_timers.time_t
+        (Task_Clock.Stimespec_Seconds (Abs_Time)));
+
+      TV.tv_nsec := long (Interfaces.C.POSIX_timers.Nanoseconds
+        (Task_Clock.Stimespec_NSeconds (Abs_Time)));
+
+      Result := pthread_cond_timedwait
+        (Cond.CV'Access, L.mutex'Access, TV'Access);
+      pragma Assert
+         (Result /= FUNC_ERR, "GNULLI failure---pthread_cond_timedwait");
+
+   end Cond_Timed_Wait;
+
+   -----------------
+   -- Cond_Signal --
+   -----------------
+
+   procedure Cond_Signal (Cond : in out Condition_Variable) is
+      Result : int;
+   begin
+      Result :=  pthread_cond_signal (Cond.CV'Access);
+      pragma Assert
+         (Result /= FUNC_ERR, "GNULLI failure---pthread_cond_signal");
+   end Cond_Signal;
+
+   ------------------
+   -- Set_Priority --
+   ------------------
+
+   procedure Set_Priority
+     (T : TCB_Ptr;
+      Prio : System.Any_Priority) is
+
+      Result : int;
+      Thread : Pthreads.pthread_t renames T.Thread;
+
+   begin
+      Result := pthread_setprio (Thread, int (Prio));
+      pragma Assert
+         (Result /= FUNC_ERR, "GNULLI failure---pthread_setprio");
+   end Set_Priority;
+
+   ----------------------
+   -- Set_Own_Priority --
+   ----------------------
+
+   procedure Set_Own_Priority (Prio : System.Any_Priority) is
+   begin
+      null;
+      --  ENOSYS Result :=
+      --     pthread_setprio (pthread_self, int (Prio));
+      --  pragma Assert
+      --     (Result /= FUNC_ERR, "GNULLI failure---pthread_setprio");
+   end Set_Own_Priority;
+
+   ------------------
+   -- Get_Priority --
+   ------------------
+
+   function Get_Priority (T : TCB_Ptr) return System.Any_Priority is
+      Priority : aliased int := 0;
+   begin
+      --  ENOSYS Result := pthread_getprio (T.Thread, Priority'Access);
+      --  pragma Assert
+      --     (Result /= FUNC_ERR, "GNULLI failure---pthread_getprio");
+      return System.Priority (Priority);
+   end Get_Priority;
+
+   -----------------------
+   --  Get_Own_Priority --
+   -----------------------
+
+   function Get_Own_Priority return System.Any_Priority is
+      Result : int;
+      Priority : aliased int := 0;
+   begin
+      Result := pthread_getprio (pthread_self, Priority'Access);
+      pragma Assert
+         (Result /= FUNC_ERR, "GNULLI failure---pthread_getprio");
+      return System.Priority (Priority);
+   end Get_Own_Priority;
+
+   --------------------
+   -- Create_LL_Task --
+   --------------------
+
+   procedure Create_LL_Task
+     (Priority       : System.Any_Priority;
+      Stack_Size     : Task_Storage_Size;
+      Task_Info      : System.Task_Info.Task_Info_Type;
+      LL_Entry_Point : LL_Task_Procedure_Access;
+      Arg            : System.Address;
+      T              : TCB_Ptr) is
+
+      use Pthreads;
+
+      Attributes : aliased pthread_attr_t;
+      Result     : int;
+      L_Priority : System.Any_Priority := Priority;
+
+      function To_Start_Addr is new
+        Unchecked_Conversion (System.Address, start_addr);
+
+   begin
+      T.LL_Entry_Point := LL_Entry_Point;
+      T.LL_Arg := Arg;
+      T.Stack_Size := Stack_Size;
+
+      Result := pthread_attr_init (Attributes'Access);
+      pragma Assert (Result /= FUNC_ERR, "GNULLI failure---pthread_attr_init");
+
+--      Result := pthread_attr_setdetachstate (Attributes'Access, 1);
+--      pragma Assert
+--        (Result /= FUNC_ERR, "GNULLI failure---pthread_setdetachstate");
+
+      Result := pthread_attr_setstacksize
+        (Attributes'Access, size_t (Stack_Size));
+      pragma Assert
+        (Result /= FUNC_ERR, "GNULLI failure---pthread_setstacksize");
+
+      Result := pthread_attr_setinheritsched
+        (Attributes'Access, PTHREAD_DEFAULT_SCHED);
+      pragma Assert
+        (Result /= FUNC_ERR, "GNULLI failure---pthread_setinheritsched");
+
+      Result := pthread_attr_setsched
+        (Attributes'Access, SCHED_FIFO);
+      pragma Assert
+        (Result /= FUNC_ERR, "GNULLI failure---pthread_setinheritsched");
+
+      --  The following priority adjustment is a kludge to get around needing
+      --  root privileges to run at higher than 18 for FIFO or 19 for OTHER.
+
+      if (L_Priority > 18) then
+         L_Priority := 18;
+      elsif (L_Priority < 14) then
+         L_Priority := 14;
+      end if;
+
+      Result := pthread_attr_setprio
+        (Attributes'Access, int (L_Priority));
+      pragma Assert
+        (Result /= FUNC_ERR, "GNULLI failure---pthread_attr_setprio");
+
+      Result := pthread_create
+        (T.Thread'Access,
+         Attributes,
+         To_Start_Addr (LL_Wrapper'Address),
+         T.all'Address);
+      if Result = FUNC_ERR then
+         GNAT.IO.Put_Line ("pthread create failed");
+         raise Storage_Error;
+      end if;
+      pragma Assert (Result /= FUNC_ERR, "GNULLI failure---pthread_create");
+
+      Result := pthread_attr_destroy (Attributes'Access);
+      pragma Assert
+        (Result /= FUNC_ERR, "GNULLI failure---pthread_attr_destroy");
+
+   end Create_LL_Task;
+
+   -----------------
+   -- Exit_LL_Task --
+   ------------------
+
+   procedure Exit_LL_Task is
+   begin
+      pthread_exit (System.Null_Address);
+   end Exit_LL_Task;
+
+   ----------------
+   -- Abort_Task --
+   ----------------
+
+   procedure Abort_Task (T : TCB_Ptr) is
+      Result     : int;
+   begin
+--      Result := pthread_kill (T.Thread);
+--      pragma Assert
+--         (Result /= FUNC_ERR, "GNULLI failure---pthread_kill");
+      null;
+   end Abort_Task;
+
+   ----------------
+   -- Test_Abort --
+   ----------------
+
+   --  This procedure does nothing.  It is intended for systems without
+   --  asynchronous abortion, where the runtime system would have to
+   --  synchronously poll for pending abortions.  This should be done
+   --  at least at every synchronization point.
+
+   procedure Test_Abort is
+   begin
+      null;
+   end Test_Abort;
+
+   ---------------------------
+   -- Install_Abort_Handler --
+   ---------------------------
+
+   procedure Install_Abort_Handler (Handler : Abort_Handler_Pointer) is
+      act     : aliased RTE.struct_sigaction;
+      old_act : aliased RTE.struct_sigaction;
+      Result  : POSIX_Error.Return_Code;
+      SA_SIGINFO : constant := 64;
+
+      use type POSIX_Error.Return_Code;
+
+   begin
+      Abort_Handler := Handler;
+
+      act.sa_flags := SA_SIGINFO;
+      act.sa_handler := Abort_Wrapper'Address;
+      RTE.sigemptyset (act.sa_mask'Access, Result);
+      pragma Assert (Result /= FUNC_ERR, "GNULLI failure---sigemptyset");
+
+      RTE.sigaction (Abort_Signal, act'Access, old_act'Access, Result);
+      pragma Assert (Result /= FUNC_ERR, "GNULLI failure---sigaction");
+   end Install_Abort_Handler;
+
+   -------------------
+   -- Abort_Wrapper --
+   -------------------
+
+   --  This is the handler called by the OS when an abort signal is
+   --  received; it in turn calls the handler installed by the client.
+   --  This procedure serves to isolate the client from the
+   --  implementation-specific calling conventions of asynchronous
+   --  handlers.
+
+   procedure Abort_Wrapper
+     (signo   : Integer;
+      info    : RTE.siginfo_ptr;
+      context : System.Address)
+   is
+      function Address_To_Call_State is new
+        Unchecked_Conversion (System.Address, Pre_Call_State);
+
+   begin
+      Abort_Handler (Address_To_Call_State (context));
+   end Abort_Wrapper;
+
+   ---------------------------
+   -- Install_Error_Handler --
+   ---------------------------
+
+   procedure Install_Error_Handler (Handler : System.Address) is
+
+      Temp : Address;
+
+      use Pthreads;
+
+   begin
+      --  Set up the soft links to tasking services used in the absence of
+      --  tasking.  These replace tasking-free defaults.
+
+      Temp := TSL.Get_Jmpbuf_Address.all;
+      --  pthread_set_jumpbuf_address (Temp);
+
+      Temp := TSL.Get_Sec_Stack_Addr.all;
+      --  pthread_set_sec_stack_addr  (Temp);
+
+      --  TSL.Get_Jmpbuf_Address := pthread_get_jumpbuf_address'Access;
+      --  TSL.Set_Jmpbuf_Address := pthread_set_jumpbuf_address'Access;
+      --  TSL.Get_Gnat_Exception := pthread_get_exception'Access;
+      --  TSL.Set_Gnat_Exception := pthread_set_exception'Access;
+   end Install_Error_Handler;
+
+   ---------------
+   -- LL_Assert --
+   ---------------
+
+   procedure LL_Assert (B : Boolean; M : String) is
+   begin
+      null;
+   end LL_Assert;
+
+   ----------------
+   -- LL_Wrapper --
+   ----------------
+
+   procedure LL_Wrapper (T : TCB_Ptr) is
+      Result  : POSIX_Error.Return_Code;
+      Result1 : int;
+      Exc_Stack : String (1 .. 256);
+      Exc_Base  : Address := Exc_Stack (Exc_Stack'Last)'Address + 1;
+      Old_Set : aliased RTE.Signal_Set;
+   begin
+      Result1 := pthread_setspecific (ATCB_Key, T.all'Address);
+
+      RTE.sigprocmask (
+        RTE.SIG_UNBLOCK, Unblocked_Signal_Mask'Access, Old_Set'Access, Result);
+      pragma Assert (
+        Result /= Failure, "GNULLI failure---sigprocmask");
+
+      --  Note that the following call may not return!
+      T.LL_Entry_Point (T.LL_Arg);
+   end LL_Wrapper;
+
+   --------------------------
+   -- Test and Set support --
+   --------------------------
+
+   procedure Initialize_TAS_Cell (Cell : out TAS_Cell) is
+   begin
+      Cell.Value := 0;
+   end Initialize_TAS_Cell;
+
+   procedure Finalize_TAS_Cell (Cell : in out TAS_Cell) is
+   begin
+      null;
+   end Finalize_TAS_Cell;
+
+   procedure Clear (Cell : in out TAS_Cell) is
+   begin
+      Cell.Value := 1;
+   end Clear;
+
+   procedure Test_And_Set (Cell : in out TAS_Cell; Result : out Boolean) is
+      Error   : Boolean;
+   begin
+      Write_Lock (Test_And_Set_Mutex, Error);
+
+      if Cell.Value = 1 then
+         Result := False;
+      else
+         Result :=  True;
+         Cell.Value := 1;
+      end if;
+      Unlock (Test_And_Set_Mutex);
+   end Test_And_Set;
+
+   function  Is_Set (Cell : in TAS_Cell) return Boolean is
+   begin
+      return Cell.Value = 1;
+   end Is_Set;
+begin
+   Initialize_Lock (System.Any_Priority'Last, Test_And_Set_Mutex);
+end System.Task_Primitives;
diff --git a/test/etags/ada-src/2ataspri.ads b/test/etags/ada-src/2ataspri.ads
new file mode 100644
index 0000000..01c7860
--- /dev/null
+++ b/test/etags/ada-src/2ataspri.ads
@@ -0,0 +1,298 @@
+------------------------------------------------------------------------------
+--                                                                          --
+--                 GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS               --
+--                                                                          --
+--                S Y S T E M . T A S K _ P R I M I T I V E S               --
+--                                                                          --
+--                                  S p e c                                 --
+--                                                                          --
+--                             $Revision: 1.1 $                             --
+--                                                                          --
+--   Copyright (C) 1991,1992,1993,1994,1995,1996 Florida State University   --
+--                                                                          --
+-- GNARL is free software; you can  redistribute it  and/or modify it under --
+-- terms of the  GNU General Public License as published  by the Free Soft- --
+-- ware  Foundation;  either version 2,  or (at your option) any later ver- --
+-- sion. GNARL is distributed in the hope that it will be useful, but WITH- --
+-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
+-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
+-- for  more details.  You should have  received  a copy of the GNU General --
+-- Public License  distributed with GNARL; see file COPYING.  If not, write --
+-- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
+-- MA 02111-1307, USA.                                                      --
+--                                                                          --
+-- As a special exception,  if other files  instantiate  generics from this --
+-- unit, or you link  this unit with other files  to produce an executable, --
+-- this  unit  does not  by itself cause  the resulting  executable  to  be --
+-- covered  by the  GNU  General  Public  License.  This exception does not --
+-- however invalidate  any other reasons why  the executable file  might be --
+-- covered by the  GNU Public License.                                      --
+--                                                                          --
+-- GNARL was developed by the GNARL team at Florida State University. It is --
+-- now maintained by Ada Core Technologies Inc. in cooperation with Florida --
+-- State University (http://www.gnat.com).                                  --
+--                                                                          --
+------------------------------------------------------------------------------
+
+with Interfaces.C;
+--  Used for Size_t;
+
+with Interfaces.C.Pthreads;
+--  Used for, size_t,
+--            pthread_mutex_t,
+--            pthread_cond_t,
+--            pthread_t
+
+with Interfaces.C.POSIX_RTE;
+--  Used for, Signal,
+--            siginfo_ptr,
+
+with System.Task_Clock;
+--  Used for, Stimespec
+
+with Unchecked_Conversion;
+
+pragma Elaborate_All (Interfaces.C.Pthreads);
+
+with System.Task_Info;
+package System.Task_Primitives is
+
+   --  Low level Task size and state definition
+
+   type LL_Task_Procedure_Access is access procedure (Arg : System.Address);
+
+   type Pre_Call_State is new System.Address;
+
+   type Task_Storage_Size is new Interfaces.C.size_t;
+
+   type Machine_Exceptions is new Interfaces.C.POSIX_RTE.Signal;
+
+   type Error_Information is new Interfaces.C.POSIX_RTE.siginfo_ptr;
+
+   type Lock is private;
+   type Condition_Variable is private;
+
+   --  The above types should both be limited. They are not due to a hack in
+   --  ATCB allocation which allocates a block of the correct size and then
+   --  assigns an initialized ATCB to it. This won't work with limited types.
+   --  When allocation is done with new, these can become limited once again.
+   --  ???
+
+   type Task_Control_Block is record
+      LL_Entry_Point : LL_Task_Procedure_Access;
+      LL_Arg         : System.Address;
+      Thread         : aliased Interfaces.C.Pthreads.pthread_t;
+      Stack_Size     : Task_Storage_Size;
+      Stack_Limit    : System.Address;
+   end record;
+
+   type TCB_Ptr is access all Task_Control_Block;
+
+   --  Task ATCB related and variables.
+
+   function Address_To_TCB_Ptr is new
+     Unchecked_Conversion (System.Address, TCB_Ptr);
+
+   procedure Initialize_LL_Tasks (T : TCB_Ptr);
+   --  Initialize GNULLI. T points to the Task Control Block that should
+   --  be initialized for use by the environment task.
+
+   function Self return TCB_Ptr;
+   --  Return a pointer to the Task Control Block of the calling task.
+
+   procedure Initialize_Lock (Prio : System.Any_Priority; L : in out Lock);
+   --  Initialize a lock object. Prio is the ceiling priority associated
+   --  with the lock.
+
+   procedure Finalize_Lock (L : in out Lock);
+   --  Finalize a lock object, freeing any resources allocated by the
+   --  corresponding Initialize_Lock.
+
+   procedure Write_Lock (L : in out Lock; Ceiling_Violation : out Boolean);
+   pragma Inline (Write_Lock);
+   --  Lock a lock object for write access to a critical section. After
+   --  this operation returns, the calling task owns the lock, and
+   --  no other Write_Lock or Read_Lock operation on the same object will
+   --  return the owner executes an Unlock operation on the same object.
+
+   procedure Read_Lock (L : in out Lock; Ceiling_Violation : out Boolean);
+   pragma Inline (Read_Lock);
+   --  Lock a lock object for read access to a critical section. After
+   --  this operation returns, the calling task owns the lock, and
+   --  no other Write_Lock operation on the same object will return until
+   --  the owner(s) execute Unlock operation(s) on the same object.
+   --  A Read_Lock to an owned lock object may return while the lock is
+   --  still owned, though an implementation may also implement
+   --  Read_Lock to have the same semantics.
+
+   procedure Unlock (L : in out Lock);
+   pragma Inline (Unlock);
+   --  Unlock a locked lock object. The results are undefined if the
+   --  calling task does not own the lock. Lock/Unlock operations must
+   --  be nested, that is, the argument to Unlock must be the object
+   --  most recently locked.
+
+   procedure Initialize_Cond (Cond : in out Condition_Variable);
+   --  Initialize a condition variable object.
+
+   procedure Finalize_Cond (Cond : in out Condition_Variable);
+   --  Finalize a condition variable object, recovering any resources
+   --  allocated for it by Initialize_Cond.
+
+   procedure Cond_Wait (Cond : in out Condition_Variable; L : in out Lock);
+   pragma Inline (Cond_Wait);
+   --  Wait on a condition variable. The mutex object L is unlocked
+   --  atomically, such that another task that is able to lock the mutex
+   --  can be assured that the wait has actually commenced, and that
+   --  a Cond_Signal operation will cause the waiting task to become
+   --  eligible for execution once again. Before Cond_Wait returns,
+   --  the waiting task will again lock the mutex. The waiting task may become
+   --  eligible for execution at any time, but will become eligible for
+   --  execution when a Cond_Signal operation is performed on the
+   --  same condition variable object. The effect of more than one
+   --  task waiting on the same condition variable is unspecified.
+
+   procedure Cond_Timed_Wait
+     (Cond      : in out Condition_Variable;
+      L         : in out Lock; Abs_Time : System.Task_Clock.Stimespec;
+      Timed_Out : out Boolean);
+   pragma Inline (Cond_Timed_Wait);
+   --  Wait on a condition variable, as for Cond_Wait, above. In addition,
+   --  the waiting task will become eligible for execution again
+   --  when the absolute time specified by Timed_Out arrives.
+
+   procedure Cond_Signal (Cond : in out Condition_Variable);
+   pragma Inline (Cond_Signal);
+   --  Wake up a task waiting on the condition variable object specified
+   --  by Cond, making it eligible for execution once again.
+
+   procedure Set_Priority (T : TCB_Ptr; Prio : System.Any_Priority);
+   pragma Inline (Set_Priority);
+   --  Set the priority of the task specified by T to P.
+
+   procedure Set_Own_Priority (Prio : System.Any_Priority);
+   pragma Inline (Set_Own_Priority);
+   --  Set the priority of the calling task to P.
+
+   function Get_Priority (T : TCB_Ptr) return System.Any_Priority;
+   pragma Inline (Get_Priority);
+   --  Return the priority of the task specified by T.
+
+   function Get_Own_Priority return System.Any_Priority;
+   pragma Inline (Get_Own_Priority);
+   --  Return the priority of the calling task.
+
+   procedure Create_LL_Task
+     (Priority       : System.Any_Priority;
+      Stack_Size     : Task_Storage_Size;
+      Task_Info      : System.Task_Info.Task_Info_Type;
+      LL_Entry_Point : LL_Task_Procedure_Access;
+      Arg            : System.Address;
+      T              : TCB_Ptr);
+   --  Create a new low-level task with priority Priority. A new thread
+   --  of control is created with a stack size of at least Stack_Size,
+   --  and the procedure LL_Entry_Point is called with the argument Arg
+   --  from this new thread of control. The Task Control Block pointed
+   --  to by T is initialized to refer to this new task.
+
+   procedure Exit_LL_Task;
+   --  Exit a low-level task. The resources allocated for the task
+   --  by Create_LL_Task are recovered. The task no longer executes, and
+   --  the effects of further operations on task are unspecified.
+
+   procedure Abort_Task (T : TCB_Ptr);
+   --  Abort the task specified by T (the target task). This causes
+   --  the target task to asynchronously execute the handler procedure
+   --  installed by the target task using Install_Abort_Handler. The
+   --  effect of this operation is unspecified if there is no abort
+   --  handler procedure for the target task.
+
+   procedure Test_Abort;
+   --  ??? Obsolete?  This is intended to allow implementation of
+   --      abortion and ATC in the absence of an asynchronous Abort_Task,
+   --      but I think that we decided that GNARL can handle this on
+   --      its own by making sure that there is an Undefer_Abortion at
+   --      every abortion synchronization point.
+
+   type Abort_Handler_Pointer is access procedure (Context : Pre_Call_State);
+
+   procedure Install_Abort_Handler (Handler : Abort_Handler_Pointer);
+   --  Install an abort handler procedure. This procedure is called
+   --  asynchronously by the calling task whenever a call to Abort_Task
+   --  specifies the calling task as the target. If the abort handler
+   --  procedure is asynchronously executed during a GNULLI operation
+   --  and then calls some other GNULLI operation, the effect is unspecified.
+
+   procedure Install_Error_Handler (Handler : System.Address);
+   --  Install an error handler for the calling task. The handler will
+   --  be called synchronously if an error is encountered during the
+   --  execution of the calling task.
+
+   procedure LL_Assert (B : Boolean; M : String);
+   --  If B is False, print the string M to the console and halt the
+   --  program.
+
+   Task_Wrapper_Frame : constant Integer := 72;
+   --  This is the size of the frame for the Pthread_Wrapper procedure.
+
+   type Proc is access procedure (Addr : System.Address);
+
+
+   --  Test and Set support
+   type TAS_Cell is private;
+   --  On some systems we can not assume that an arbitrary memory location
+   --  can be used in an atomic test and set instruction (e.g. on some
+   --  multiprocessor machines, only memory regions are cache interlocked).
+   --  TAS_Cell is private to facilitate adaption to a variety of
+   --  implementations.
+
+   procedure Initialize_TAS_Cell (Cell :    out TAS_Cell);
+   pragma Inline (Initialize_TAS_Cell);
+   --  Initialize a Test And Set Cell.  On some targets this will allocate
+   --  a system-level lock object from a special pool.  For most systems,
+   --  this is a nop.
+
+   procedure Finalize_TAS_Cell   (Cell : in out TAS_Cell);
+   pragma Inline (Finalize_TAS_Cell);
+   --  Finalize a Test and Set cell, freeing any resources allocated by the
+   --  corresponding Initialize_TAS_Cell.
+
+   procedure Clear        (Cell : in out TAS_Cell);
+   pragma Inline (Clear);
+   --  Set the state of the named TAS_Cell such that a subsequent call to
+   --  Is_Set will return False.  This operation must be atomic with
+   --  respect to the Is_Set and Test_And_Set operations for the same
+   --  cell.
+
+   procedure Test_And_Set (Cell : in out TAS_Cell; Result : out Boolean);
+   pragma Inline (Test_And_Set);
+   --  Modify the state of the named TAS_Cell such that a subsequent call
+   --  to Is_Set will return True.  Result is set to True if Is_Set
+   --  was False prior to the call, False otherwise.  This operation must
+   --  be atomic with respect to the Clear and Is_Set operations for the
+   --  same cell.
+
+   function  Is_Set       (Cell : in     TAS_Cell) return Boolean;
+   pragma Inline (Is_Set);
+   --  Returns the current value of the named TAS_Cell.  This operation
+   --  must be atomic with respect to the Clear and Test_And_Set operations
+   --  for the same cell.
+
+private
+
+   type Lock is
+      record
+         mutex : aliased Interfaces.C.Pthreads.pthread_mutex_t;
+      end record;
+
+   type Condition_Variable is
+      record
+         CV : aliased Interfaces.C.Pthreads.pthread_cond_t;
+      end record;
+
+   type TAS_Cell is
+      record
+         Value : aliased Interfaces.C.unsigned := 0;
+      end record;
+
+end System.Task_Primitives;
diff --git a/test/etags/ada-src/etags-test-for.ada 
b/test/etags/ada-src/etags-test-for.ada
new file mode 100644
index 0000000..09e5a1e
--- /dev/null
+++ b/test/etags/ada-src/etags-test-for.ada
@@ -0,0 +1,193 @@
+   type LL_Task_Procedure_Access is access procedure (Arg : System.Address);
+
+   function Body_Required
+      (N : Node_Id) return Boolean is
+   begin
+      pragma Assert (False
+          or else NT (N).Nkind = N_Compilation_Unit);
+      return Flag13 (N);
+   end Body_Required;
+
+   type Type_Specific_Data is record
+      Idepth        : Natural;
+      Expanded_Name : Cstring_Ptr;
+      External_Tag  : Cstring_Ptr;
+      HT_Link       : Tag;
+      Ancestor_Tags : Tag_Table (Natural);
+   end record;
+
+   function "abs"   (Right : Complex) return Real'Base renames Modulus;
+
+   type Barrier_Function_Pointer is access
+     function
+       (O : System.Address;
+        E : Protected_Entry_Index)
+        return Boolean;
+
+   function "=" (L, R : System.Address) return Boolean
+     renames System."=";
+
+   type usfreelock_ptr is access
+     procedure (lock : ulock_t; arena : usptr_t_ptr);
+
+   function p pragma Import (C,
+                  "pthread_mutexattr_setprio_ceiling",
+                  "pthread_mutexattr_setprio_ceiling");
+   pragma Import ()
+   procedure LL_Wrapper (T : TCB_Ptr);
+
+function p ("p");
+
+-- This file is an Ada file containing test data
+-- for etags (Ada83 and Ada95 support).
+
+package Pkg1 is
+
+  type Private_T is private;
+
+  package Inner1 is
+    procedure Private_T;
+  end Inner1;
+
+  package Inner2 is
+    task Private_T;
+  end Inner2;
+
+  type Public_T is
+    record
+      A : Integer;
+      B : Integer;
+    end record;
+
+  procedure Pkg1_Proc1;
+
+  procedure Pkg1_Proc2 (I : Integer);
+
+  function Pkg1_Func1 return Boolean;
+
+  function Pkg1_Func2 (Ijk : Integer; Z : Integer) return Natural;
+
+
+  package Pkg1_Pkg1 is
+    procedure Pkg1_Pkg1_Proc1;
+  end Pkg1_Pkg1;
+
+  task type Task_Type is
+    entry Entry1;
+    entry Entry2 (I : Integer);
+  end;
+
+private
+
+  type Private_T is
+    record
+      Z : Integer;
+      W : Boolean;
+    end record;
+end Pkg1;
+
+package body Pkg1 is
+
+  procedure Pkg1_Proc1 is
+  begin
+    null;
+  end;
+
+  package body Inner1 is
+    procedure Private_T is
+    begin
+      null;
+    end;
+  end Inner1;
+
+  package body Inner2 is
+    task body Private_T is
+    begin
+      loop
+        null;
+      end loop;
+    end;
+  end Inner2;
+
+  task body Task_Type is
+  begin
+    select
+      accept Entry1 do
+        null;
+      end;
+    or
+      accept Entry2 (I : Integer) do
+        null;
+      end;
+    end select;
+  end;
+
+
+  procedure Pkg1_Proc2 (I : Integer) is
+  begin
+    null;
+  end Pkg1_Proc2;
+
+
+  function Pkg1_Func1 return Boolean is separate;
+
+  function Pkg1_Func2 (Ijk : Integer; Z : Integer) return Natural is
+  begin
+    return 1;
+  end;
+
+
+  package body Pkg1_Pkg1 is separate;
+
+
+end Pkg1;
+
+separate (Pkg1)
+package body Pkg1_Pkg1 is
+  procedure Pkg1_Pkg1_Proc1 is
+  begin
+    null;
+  end;
+end Pkg1_Pkg1;
+
+
+separate (Pkg1)
+function  Pkg1_Func1 return Boolean is
+begin
+  return False;
+end;
+
+
+-- from now on, this is Ada 95 specific.
+package Truc is
+  I : Integer;
+end Truc;
+
+package Truc.Bidule is
+
+  protected Bidule is
+    entry Basar;
+  end Bidule;
+
+  protected type Machin_T is
+    entry Truc;
+  end Machin_T;
+
+end Truc.Bidule;
+
+package body Truc.Bidule is
+  protected body Bidule is
+    entry Basar is
+    begin
+      null;
+    end;
+  end Bidule;
+
+  protected Machin_T is
+    entry Truc is
+    begin
+      null;
+    end;
+  end Machin_T;
+
+end Truc.Bidule;
diff --git a/test/etags/ada-src/waroquiers.ada 
b/test/etags/ada-src/waroquiers.ada
new file mode 100644
index 0000000..3161209
--- /dev/null
+++ b/test/etags/ada-src/waroquiers.ada
@@ -0,0 +1,153 @@
+-- This file is an Ada file containing test data
+-- for etags (Ada83 and Ada95 support).
+package Pkg1 is
+
+  type Private_T is private;
+
+  package Inner1 is
+    procedure Private_T;
+  end Inner1;
+
+  package Inner2 is
+    task Private_T;
+  end Inner2;
+
+  type Public_T is
+    record
+      A : Integer;
+      B : Integer;
+    end record;
+
+  procedure Pkg1_Proc1;
+
+  procedure Pkg1_Proc2 (I : Integer);
+
+  function Pkg1_Func1 return Boolean;
+
+  function Pkg1_Func2 (Ijk : Integer; Z : Integer) return Natural;
+
+
+  package Pkg1_Pkg1 is
+    procedure Pkg1_Pkg1_Proc1;
+  end Pkg1_Pkg1;
+
+  task type Task_Type is
+    entry Entry1;
+    entry Entry2 (I : Integer);
+  end;
+private
+
+  type Private_T is
+    record
+      Z : Integer;
+      W : Boolean;
+    end record;
+end Pkg1;
+package body Pkg1 is
+
+  procedure Pkg1_Proc1 is
+  begin
+    null;
+  end;
+
+  package body Inner1 is
+    procedure Private_T is
+    begin
+      null;
+    end;
+  end Inner1;
+
+  package body Inner2 is
+    task body Private_T is
+    begin
+      loop
+        null;
+      end loop;
+    end;
+  end Inner2;
+  task body Task_Type is
+  begin
+    select
+      accept Entry1 do
+        null;
+      end;
+    or
+      accept Entry2 (I : Integer) do
+        null;
+      end;
+    end select;
+  end;
+
+
+  procedure Pkg1_Proc2 (I : Integer) is
+  begin
+    null;
+  end Pkg1_Proc2;
+
+
+  function Pkg1_Func1 return Boolean is separate;
+
+  function Pkg1_Func2 (Ijk : Integer; Z : Integer) return Natural is
+  begin
+    return 1;
+  end;
+
+
+  package body Pkg1_Pkg1 is separate;
+
+end Pkg1;
+separate (Pkg1)
+package body Pkg1_Pkg1 is
+  procedure Pkg1_Pkg1_Proc1 is
+  begin
+    null;
+  end;
+end Pkg1_Pkg1;
+separate (Pkg1)
+function  Pkg1_Func1 return Boolean is
+begin
+  return False;
+end;
+-- from now on, this is Ada 95 specific.
+package Truc is
+  I : Integer;
+end Truc;
+with Pkg1;
+package Truc.Bidule is
+  use type Pkg1.Public_T;
+  use Pkg1;
+  use
+    type Pkg1.Public_T;
+  use -- comment
+    type -- comment
+    Pkg1.Public_T;
+
+  protected Bidule is
+    entry Basar;
+  private
+    Ok : Boolean;
+  end Bidule;
+
+  protected type Machin_T is
+    entry Truc;
+  private
+    Ok : Boolean;
+  end Machin_T;
+
+end Truc.Bidule;
+package body Truc.Bidule is
+  protected body Bidule is
+    entry Basar when Ok is
+    begin
+      null;
+    end;
+  end Bidule;
+
+  protected body Machin_T is
+    entry Truc when Ok is
+    begin
+      null;
+    end;
+  end Machin_T;
+
+end Truc.Bidule;
diff --git a/test/etags/c-src/a/b/b.c b/test/etags/c-src/a/b/b.c
new file mode 100644
index 0000000..ee3c97c
--- /dev/null
+++ b/test/etags/c-src/a/b/b.c
@@ -0,0 +1,5 @@
+#define this that
+
+#line 33 "../c/c.web"
+
+#define questo quello
diff --git a/test/etags/c-src/abbrev.c b/test/etags/c-src/abbrev.c
new file mode 100644
index 0000000..f30986d
--- /dev/null
+++ b/test/etags/c-src/abbrev.c
@@ -0,0 +1,616 @@
+/* Primitives for word-abbrev mode.
+   Copyright (C) 1985, 1986, 1993, 1996, 1998 Free Software Foundation, Inc.
+
+This file is part of GNU Emacs.
+
+GNU Emacs is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Emacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+
+#include <config.h>
+#include <stdio.h>
+#include "lisp.h"
+#include "commands.h"
+#include "buffer.h"
+#include "window.h"
+#include "charset.h"
+#include "syntax.h"
+
+/* An abbrev table is an obarray.
+ Each defined abbrev is represented by a symbol in that obarray
+ whose print name is the abbreviation.
+ The symbol's value is a string which is the expansion.
+ If its function definition is non-nil, it is called
+  after the expansion is done.
+ The plist slot of the abbrev symbol is its usage count. */
+
+/* List of all abbrev-table name symbols:
+ symbols whose values are abbrev tables.  */
+
+Lisp_Object Vabbrev_table_name_list;
+
+/* The table of global abbrevs.  These are in effect
+ in any buffer in which abbrev mode is turned on. */
+
+Lisp_Object Vglobal_abbrev_table;
+
+/* The local abbrev table used by default (in Fundamental Mode buffers) */
+
+Lisp_Object Vfundamental_mode_abbrev_table;
+
+/* Set nonzero when an abbrev definition is changed */
+
+int abbrevs_changed;
+
+int abbrev_all_caps;
+
+/* Non-nil => use this location as the start of abbrev to expand
+ (rather than taking the word before point as the abbrev) */
+
+Lisp_Object Vabbrev_start_location;
+
+/* Buffer that Vabbrev_start_location applies to */
+Lisp_Object Vabbrev_start_location_buffer;
+
+/* The symbol representing the abbrev most recently expanded */
+
+Lisp_Object Vlast_abbrev;
+
+/* A string for the actual text of the abbrev most recently expanded.
+   This has more info than Vlast_abbrev since case is significant.  */
+
+Lisp_Object Vlast_abbrev_text;
+
+/* Character address of start of last abbrev expanded */
+
+int last_abbrev_point;
+
+/* Hook to run before expanding any abbrev.  */
+
+Lisp_Object Vpre_abbrev_expand_hook, Qpre_abbrev_expand_hook;
+
+DEFUN ("make-abbrev-table", Fmake_abbrev_table, Smake_abbrev_table, 0, 0, 0,
+  "Create a new, empty abbrev table object.")
+  ()
+{
+  return Fmake_vector (make_number (59), make_number (0));
+}
+
+DEFUN ("clear-abbrev-table", Fclear_abbrev_table, Sclear_abbrev_table, 1, 1, 0,
+  "Undefine all abbrevs in abbrev table TABLE, leaving it empty.")
+  (table)
+     Lisp_Object table;
+{
+  int i, size;
+
+  CHECK_VECTOR (table, 0);
+  size = XVECTOR (table)->size;
+  abbrevs_changed = 1;
+  for (i = 0; i < size; i++)
+    XVECTOR (table)->contents[i] = make_number (0);
+  return Qnil;
+}
+
+DEFUN ("define-abbrev", Fdefine_abbrev, Sdefine_abbrev, 3, 5, 0,
+  "Define an abbrev in TABLE named NAME, to expand to EXPANSION and call 
HOOK.\n\
+NAME must be a string.\n\
+EXPANSION should usually be a string.\n\
+To undefine an abbrev, define it with EXPANSION = nil.\n\
+If HOOK is non-nil, it should be a function of no arguments;\n\
+it is called after EXPANSION is inserted.\n\
+If EXPANSION is not a string, the abbrev is a special one,\n\
+ which does not expand in the usual way but only runs HOOK.\n\
+COUNT, if specified, initializes the abbrev's usage-count\n\
+which is incremented each time the abbrev is used.")
+  (table, name, expansion, hook, count)
+     Lisp_Object table, name, expansion, hook, count;
+{
+  Lisp_Object sym, oexp, ohook, tem;
+  CHECK_VECTOR (table, 0);
+  CHECK_STRING (name, 1);
+
+  if (NILP (count))
+    count = make_number (0);
+  else
+    CHECK_NUMBER (count, 0);
+
+  sym = Fintern (name, table);
+
+  oexp = XSYMBOL (sym)->value;
+  ohook = XSYMBOL (sym)->function;
+  if (!((EQ (oexp, expansion)
+        || (STRINGP (oexp) && STRINGP (expansion)
+            && (tem = Fstring_equal (oexp, expansion), !NILP (tem))))
+       &&
+       (EQ (ohook, hook)
+        || (tem = Fequal (ohook, hook), !NILP (tem)))))
+    abbrevs_changed = 1;
+
+  Fset (sym, expansion);
+  Ffset (sym, hook);
+  Fsetplist (sym, count);
+
+  return name;
+}
+
+DEFUN ("define-global-abbrev", Fdefine_global_abbrev, Sdefine_global_abbrev, 
2, 2,
+  "sDefine global abbrev: \nsExpansion for %s: ",
+  "Define ABBREV as a global abbreviation for EXPANSION.")
+  (abbrev, expansion)
+     Lisp_Object abbrev, expansion;
+{
+  Fdefine_abbrev (Vglobal_abbrev_table, Fdowncase (abbrev),
+                 expansion, Qnil, make_number (0));
+  return abbrev;
+}
+
+DEFUN ("define-mode-abbrev", Fdefine_mode_abbrev, Sdefine_mode_abbrev, 2, 2,
+  "sDefine mode abbrev: \nsExpansion for %s: ",
+  "Define ABBREV as a mode-specific abbreviation for EXPANSION.")
+  (abbrev, expansion)
+     Lisp_Object abbrev, expansion;
+{
+  if (NILP (current_buffer->abbrev_table))
+    error ("Major mode has no abbrev table");
+
+  Fdefine_abbrev (current_buffer->abbrev_table, Fdowncase (abbrev),
+                 expansion, Qnil, make_number (0));
+  return abbrev;
+}
+
+DEFUN ("abbrev-symbol", Fabbrev_symbol, Sabbrev_symbol, 1, 2, 0,
+  "Return the symbol representing abbrev named ABBREV.\n\
+This symbol's name is ABBREV, but it is not the canonical symbol of that 
name;\n\
+it is interned in an abbrev-table rather than the normal obarray.\n\
+The value is nil if that abbrev is not defined.\n\
+Optional second arg TABLE is abbrev table to look it up in.\n\
+The default is to try buffer's mode-specific abbrev table, then global table.")
+  (abbrev, table)
+     Lisp_Object abbrev, table;
+{
+  Lisp_Object sym;
+  CHECK_STRING (abbrev, 0);
+  if (!NILP (table))
+    sym = Fintern_soft (abbrev, table);
+  else
+    {
+      sym = Qnil;
+      if (!NILP (current_buffer->abbrev_table))
+       sym = Fintern_soft (abbrev, current_buffer->abbrev_table);
+      if (NILP (XSYMBOL (sym)->value))
+       sym = Qnil;
+      if (NILP (sym))
+       sym = Fintern_soft (abbrev, Vglobal_abbrev_table);
+    }
+  if (NILP (XSYMBOL (sym)->value)) return Qnil;
+  return sym;
+}
+
+DEFUN ("abbrev-expansion", Fabbrev_expansion, Sabbrev_expansion, 1, 2, 0,
+  "Return the string that ABBREV expands into in the current buffer.\n\
+Optionally specify an abbrev table as second arg;\n\
+then ABBREV is looked up in that table only.")
+  (abbrev, table)
+     Lisp_Object abbrev, table;
+{
+  Lisp_Object sym;
+  sym = Fabbrev_symbol (abbrev, table);
+  if (NILP (sym)) return sym;
+  return Fsymbol_value (sym);
+}
+
+/* Expand the word before point, if it is an abbrev.
+  Returns 1 if an expansion is done. */
+
+DEFUN ("expand-abbrev", Fexpand_abbrev, Sexpand_abbrev, 0, 0, "",
+  "Expand the abbrev before point, if there is an abbrev there.\n\
+Effective when explicitly called even when `abbrev-mode' is nil.\n\
+Returns the abbrev symbol, if expansion took place.")
+  ()
+{
+  register char *buffer, *p;
+  int wordstart, wordend;
+  register int wordstart_byte, wordend_byte, idx;
+  int whitecnt;
+  int uccount = 0, lccount = 0;
+  register Lisp_Object sym;
+  Lisp_Object expansion, hook, tem;
+  Lisp_Object value;
+
+  value = Qnil;
+
+  if (!NILP (Vrun_hooks))
+    call1 (Vrun_hooks, Qpre_abbrev_expand_hook);
+
+  wordstart = 0;
+  if (!(BUFFERP (Vabbrev_start_location_buffer)
+       && XBUFFER (Vabbrev_start_location_buffer) == current_buffer))
+    Vabbrev_start_location = Qnil;
+  if (!NILP (Vabbrev_start_location))
+    {
+      tem = Vabbrev_start_location;
+      CHECK_NUMBER_COERCE_MARKER (tem, 0);
+      wordstart = XINT (tem);
+      Vabbrev_start_location = Qnil;
+      if (wordstart < BEGV || wordstart > ZV)
+       wordstart = 0;
+      if (wordstart && wordstart != ZV)
+       {
+         wordstart_byte = CHAR_TO_BYTE (wordstart);
+         if (FETCH_BYTE (wordstart_byte) == '-')
+           del_range (wordstart, wordstart + 1);
+       }
+    }
+  if (!wordstart)
+    wordstart = scan_words (PT, -1);
+
+  if (!wordstart)
+    return value;
+
+  wordstart_byte = CHAR_TO_BYTE (wordstart);
+  wordend = scan_words (wordstart, 1);
+  if (!wordend)
+    return value;
+
+  if (wordend > PT)
+    wordend = PT;
+
+  wordend_byte = CHAR_TO_BYTE (wordend);
+  whitecnt = PT - wordend;
+  if (wordend <= wordstart)
+    return value;
+
+  p = buffer = (char *) alloca (wordend_byte - wordstart_byte);
+
+  for (idx = wordstart_byte; idx < wordend_byte; idx++)
+    {
+      /* ??? This loop needs to go by characters!  */
+      register int c = FETCH_BYTE (idx);
+      if (UPPERCASEP (c))
+       c = DOWNCASE (c), uccount++;
+      else if (! NOCASEP (c))
+       lccount++;
+      *p++ = c;
+    }
+
+  if (VECTORP (current_buffer->abbrev_table))
+    sym = oblookup (current_buffer->abbrev_table, buffer,
+                   wordend - wordstart, wordend_byte - wordstart_byte);
+  else
+    XSETFASTINT (sym, 0);
+  if (INTEGERP (sym) || NILP (XSYMBOL (sym)->value))
+    sym = oblookup (Vglobal_abbrev_table, buffer,
+                   wordend - wordstart, wordend_byte - wordstart_byte);
+  if (INTEGERP (sym) || NILP (XSYMBOL (sym)->value))
+    return value;
+
+  if (INTERACTIVE && !EQ (minibuf_window, selected_window))
+    {
+      /* Add an undo boundary, in case we are doing this for
+        a self-inserting command which has avoided making one so far.  */
+      SET_PT (wordend);
+      Fundo_boundary ();
+    }
+
+  Vlast_abbrev_text
+    = Fbuffer_substring (make_number (wordstart), make_number (wordend));
+
+  /* Now sym is the abbrev symbol.  */
+  Vlast_abbrev = sym;
+  value = sym;
+  last_abbrev_point = wordstart;
+
+  if (INTEGERP (XSYMBOL (sym)->plist))
+    XSETINT (XSYMBOL (sym)->plist,
+            XINT (XSYMBOL (sym)->plist) + 1);  /* Increment use count */
+
+  /* If this abbrev has an expansion, delete the abbrev
+     and insert the expansion.  */
+  expansion = XSYMBOL (sym)->value;
+  if (STRINGP (expansion))
+    {
+      SET_PT (wordstart);
+
+      del_range_both (wordstart, wordstart_byte, wordend, wordend_byte, 1);
+
+      insert_from_string (expansion, 0, 0, XSTRING (expansion)->size,
+                         STRING_BYTES (XSTRING (expansion)), 1);
+      SET_PT (PT + whitecnt);
+
+      if (uccount && !lccount)
+       {
+         /* Abbrev was all caps */
+         /* If expansion is multiple words, normally capitalize each word */
+         /* This used to be if (!... && ... >= ...) Fcapitalize; else Fupcase
+            but Megatest 68000 compiler can't handle that */
+         if (!abbrev_all_caps)
+           if (scan_words (PT, -1) > scan_words (wordstart, 1))
+             {
+               Fupcase_initials_region (make_number (wordstart),
+                                        make_number (PT));
+               goto caped;
+             }
+         /* If expansion is one word, or if user says so, upcase it all. */
+         Fupcase_region (make_number (wordstart), make_number (PT));
+       caped: ;
+       }
+      else if (uccount)
+       {
+         /* Abbrev included some caps.  Cap first initial of expansion */
+         int pos = wordstart_byte;
+
+         /* Find the initial.  */
+         while (pos < PT_BYTE
+                && SYNTAX (*BUF_BYTE_ADDRESS (current_buffer, pos)) != Sword)
+           pos++;
+
+         /* Change just that.  */
+         pos = BYTE_TO_CHAR (pos);
+         Fupcase_initials_region (make_number (pos), make_number (pos + 1));
+       }
+    }
+
+  hook = XSYMBOL (sym)->function;
+  if (!NILP (hook))
+    {
+      Lisp_Object expanded, prop;
+
+      /* If the abbrev has a hook function, run it.  */
+      expanded = call0 (hook);
+
+      /* In addition, if the hook function is a symbol with a a
+        non-nil `no-self-insert' property, let the value it returned
+        specify whether we consider that an expansion took place.  If
+        it returns nil, no expansion has been done.  */
+
+      if (SYMBOLP (hook)
+         && NILP (expanded)
+         && (prop = Fget (hook, intern ("no-self-insert")),
+             !NILP (prop)))
+       value = Qnil;
+    }
+
+  return value;
+}
+
+DEFUN ("unexpand-abbrev", Funexpand_abbrev, Sunexpand_abbrev, 0, 0, "",
+  "Undo the expansion of the last abbrev that expanded.\n\
+This differs from ordinary undo in that other editing done since then\n\
+is not undone.")
+  ()
+{
+  int opoint = PT;
+  int adjust = 0;
+  if (last_abbrev_point < BEGV
+      || last_abbrev_point > ZV)
+    return Qnil;
+  SET_PT (last_abbrev_point);
+  if (STRINGP (Vlast_abbrev_text))
+    {
+      /* This isn't correct if Vlast_abbrev->function was used
+         to do the expansion */
+      Lisp_Object val;
+      int zv_before;
+
+      val = XSYMBOL (Vlast_abbrev)->value;
+      if (!STRINGP (val))
+       error ("value of abbrev-symbol must be a string");
+      zv_before = ZV;
+      del_range_byte (PT_BYTE, PT_BYTE + STRING_BYTES (XSTRING (val)), 1);
+      /* Don't inherit properties here; just copy from old contents.  */
+      insert_from_string (Vlast_abbrev_text, 0, 0,
+                         XSTRING (Vlast_abbrev_text)->size,
+                         STRING_BYTES (XSTRING (Vlast_abbrev_text)), 0);
+      Vlast_abbrev_text = Qnil;
+      /* Total number of characters deleted.  */
+      adjust = ZV - zv_before;
+    }
+  SET_PT (last_abbrev_point < opoint ? opoint + adjust : opoint);
+  return Qnil;
+}
+
+static void
+write_abbrev (sym, stream)
+     Lisp_Object sym, stream;
+{
+  Lisp_Object name;
+  if (NILP (XSYMBOL (sym)->value))
+    return;
+  insert ("    (", 5);
+  XSETSTRING (name, XSYMBOL (sym)->name);
+  Fprin1 (name, stream);
+  insert (" ", 1);
+  Fprin1 (XSYMBOL (sym)->value, stream);
+  insert (" ", 1);
+  Fprin1 (XSYMBOL (sym)->function, stream);
+  insert (" ", 1);
+  Fprin1 (XSYMBOL (sym)->plist, stream);
+  insert (")\n", 2);
+}
+
+static void
+describe_abbrev (sym, stream)
+     Lisp_Object sym, stream;
+{
+  Lisp_Object one;
+
+  if (NILP (XSYMBOL (sym)->value))
+    return;
+  one = make_number (1);
+  Fprin1 (Fsymbol_name (sym), stream);
+  Findent_to (make_number (15), one);
+  Fprin1 (XSYMBOL (sym)->plist, stream);
+  Findent_to (make_number (20), one);
+  Fprin1 (XSYMBOL (sym)->value, stream);
+  if (!NILP (XSYMBOL (sym)->function))
+    {
+      Findent_to (make_number (45), one);
+      Fprin1 (XSYMBOL (sym)->function, stream);
+    }
+  Fterpri (stream);
+}
+
+DEFUN ("insert-abbrev-table-description", Finsert_abbrev_table_description,
+  Sinsert_abbrev_table_description, 1, 2, 0,
+  "Insert before point a full description of abbrev table named NAME.\n\
+NAME is a symbol whose value is an abbrev table.\n\
+If optional 2nd arg READABLE is non-nil, a human-readable description\n\
+is inserted.  Otherwise the description is an expression,\n\
+a call to `define-abbrev-table', which would\n\
+define the abbrev table NAME exactly as it is currently defined.")
+  (name, readable)
+     Lisp_Object name, readable;
+{
+  Lisp_Object table;
+  Lisp_Object stream;
+
+  CHECK_SYMBOL (name, 0);
+  table = Fsymbol_value (name);
+  CHECK_VECTOR (table, 0);
+
+  XSETBUFFER (stream, current_buffer);
+
+  if (!NILP (readable))
+    {
+      insert_string ("(");
+      Fprin1 (name, stream);
+      insert_string (")\n\n");
+      map_obarray (table, describe_abbrev, stream);
+      insert_string ("\n\n");
+    }
+  else
+    {
+      insert_string ("(define-abbrev-table '");
+      Fprin1 (name, stream);
+      insert_string (" '(\n");
+      map_obarray (table, write_abbrev, stream);
+      insert_string ("    ))\n\n");
+    }
+
+  return Qnil;
+}
+
+DEFUN ("define-abbrev-table", Fdefine_abbrev_table, Sdefine_abbrev_table,
+       2, 2, 0,
+  "Define TABLENAME (a symbol) as an abbrev table name.\n\
+Define abbrevs in it according to DEFINITIONS, which is a list of elements\n\
+of the form (ABBREVNAME EXPANSION HOOK USECOUNT).")
+  (tablename, definitions)
+     Lisp_Object tablename, definitions;
+{
+  Lisp_Object name, exp, hook, count;
+  Lisp_Object table, elt;
+
+  CHECK_SYMBOL (tablename, 0);
+  table = Fboundp (tablename);
+  if (NILP (table) || (table = Fsymbol_value (tablename), NILP (table)))
+    {
+      table = Fmake_abbrev_table ();
+      Fset (tablename, table);
+      Vabbrev_table_name_list = Fcons (tablename, Vabbrev_table_name_list);
+    }
+  CHECK_VECTOR (table, 0);
+
+  for (; !NILP (definitions); definitions = Fcdr (definitions))
+    {
+      elt = Fcar (definitions);
+      name  = Fcar (elt);      elt = Fcdr (elt);
+      exp   = Fcar (elt);      elt = Fcdr (elt);
+      hook  = Fcar (elt);      elt = Fcdr (elt);
+      count = Fcar (elt);
+      Fdefine_abbrev (table, name, exp, hook, count);
+    }
+  return Qnil;
+}
+
+void
+syms_of_abbrev ()
+{
+  DEFVAR_LISP ("abbrev-table-name-list", &Vabbrev_table_name_list,
+    "List of symbols whose values are abbrev tables.");
+  Vabbrev_table_name_list = Fcons (intern ("fundamental-mode-abbrev-table"),
+                                  Fcons (intern ("global-abbrev-table"),
+                                         Qnil));
+
+  DEFVAR_LISP ("global-abbrev-table", &Vglobal_abbrev_table,
+    "The abbrev table whose abbrevs affect all buffers.\n\
+Each buffer may also have a local abbrev table.\n\
+If it does, the local table overrides the global one\n\
+for any particular abbrev defined in both.");
+  Vglobal_abbrev_table = Fmake_abbrev_table ();
+
+  DEFVAR_LISP ("fundamental-mode-abbrev-table", 
&Vfundamental_mode_abbrev_table,
+    "The abbrev table of mode-specific abbrevs for Fundamental Mode.");
+  Vfundamental_mode_abbrev_table = Fmake_abbrev_table ();
+  current_buffer->abbrev_table = Vfundamental_mode_abbrev_table;
+  buffer_defaults.abbrev_table = Vfundamental_mode_abbrev_table;
+
+  DEFVAR_LISP ("last-abbrev", &Vlast_abbrev,
+    "The abbrev-symbol of the last abbrev expanded.  See `abbrev-symbol'.");
+
+  DEFVAR_LISP ("last-abbrev-text", &Vlast_abbrev_text,
+    "The exact text of the last abbrev expanded.\n\
+nil if the abbrev has already been unexpanded.");
+
+  DEFVAR_INT ("last-abbrev-location", &last_abbrev_point,
+    "The location of the start of the last abbrev expanded.");
+
+  Vlast_abbrev = Qnil;
+  Vlast_abbrev_text = Qnil;
+  last_abbrev_point = 0;
+
+  DEFVAR_LISP ("abbrev-start-location", &Vabbrev_start_location,
+    "Buffer position for `expand-abbrev' to use as the start of the abbrev.\n\
+nil means use the word before point as the abbrev.\n\
+Calling `expand-abbrev' sets this to nil.");
+  Vabbrev_start_location = Qnil;
+
+  DEFVAR_LISP ("abbrev-start-location-buffer", &Vabbrev_start_location_buffer,
+    "Buffer that `abbrev-start-location' has been set for.\n\
+Trying to expand an abbrev in any other buffer clears 
`abbrev-start-location'.");
+  Vabbrev_start_location_buffer = Qnil;
+
+  DEFVAR_PER_BUFFER ("local-abbrev-table", &current_buffer->abbrev_table, Qnil,
+    "Local (mode-specific) abbrev table of current buffer.");
+
+  DEFVAR_BOOL ("abbrevs-changed", &abbrevs_changed,
+    "Set non-nil by defining or altering any word abbrevs.\n\
+This causes `save-some-buffers' to offer to save the abbrevs.");
+  abbrevs_changed = 0;
+
+  DEFVAR_BOOL ("abbrev-all-caps", &abbrev_all_caps,
+    "*Set non-nil means expand multi-word abbrevs all caps if abbrev was so.");
+  abbrev_all_caps = 0;
+
+  DEFVAR_LISP ("pre-abbrev-expand-hook", &Vpre_abbrev_expand_hook,
+    "Function or functions to be called before abbrev expansion is done.\n\
+This is the first thing that `expand-abbrev' does, and so this may change\n\
+the current abbrev table before abbrev lookup happens.");
+  Vpre_abbrev_expand_hook = Qnil;
+  Qpre_abbrev_expand_hook = intern ("pre-abbrev-expand-hook");
+  staticpro (&Qpre_abbrev_expand_hook);
+
+  defsubr (&Smake_abbrev_table);
+  defsubr (&Sclear_abbrev_table);
+  defsubr (&Sdefine_abbrev);
+  defsubr (&Sdefine_global_abbrev);
+  defsubr (&Sdefine_mode_abbrev);
+  defsubr (&Sabbrev_expansion);
+  defsubr (&Sabbrev_symbol);
+  defsubr (&Sexpand_abbrev);
+  defsubr (&Sunexpand_abbrev);
+  defsubr (&Sinsert_abbrev_table_description);
+  defsubr (&Sdefine_abbrev_table);
+}
diff --git a/test/etags/c-src/c.c b/test/etags/c-src/c.c
new file mode 100644
index 0000000..77c8929
--- /dev/null
+++ b/test/etags/c-src/c.c
@@ -0,0 +1,169 @@
+T f(){if(x){}
+}T i;
+
+// The next two functions must be kept together
+void bar() {while(0) {}}
+int foobar() {;}
+
+struct interface *
+interface_locate(void)
+{ return 0; }
+
+#line 123 "c.c"
+// 7.4: string literal in #line directive shall be a character string
+//      literal.
+//E t_6_062.cpp(21): warning: ill formed #line directive: 123 L"wide"
+#line 123                                      L"wide.c"
+#line 123 L"wide.c"
+#line 123L"wide.c"
+
+
+void (*fa) (void);
+void (__attribute__((noreturn)) *fb) (void);
+
+extern int
+my_printf (void *my_object, const char *my_format, ...)
+     __attribute__ ((format (printf, 2, 3)));
+
+void fatala () __attribute__ ((noreturn));
+void fatalb ();
+
+max (int a, int b)
+{ if (a > b) return a; else return b; }
+struct bar {
+  char z;
+  struct foo f;
+};
+__attribute__ ((always_inline)) max (int a, int b)
+{ if (a > b) return a; else return b }
+extern int old_var __attribute__ ((deprecated));
+struct foo
+{
+  char a;
+  int x[2] __attribute__ ((packed));
+};
+char stack[10000] __attribute__ ((section ("STACK"))) = { 0 };
+struct S { short f[3]; } __attribute__ ((aligned (8)));
+typedef union
+{
+  int *__ip;
+  union wait *__up;
+} wait_status_ptr_t __attribute__ ((__transparent_union__));
+Some_Class  A  __attribute__ ((init_priority (2000)));
+typedef T1 T3 __attribute__ ((deprecated));
+T3 z __attribute__ ((deprecated));
+typedef int more_aligned_int __attribute__ ((aligned (8)));
+struct S  __attribute__ ((vector_size (16))) foo;
+int foo __attribute__ ((vector_size (16)));
+char *__attribute__((aligned(8))) *f;
+int i __attribute__ ((visibility ("hidden")));
+extern void foobar (void) __attribute__ ((section ("bar")));
+
+typedef struct cacheLRUEntry_s
+{
+  U16 next;
+  U16 prev;
+}
+__attribute__ ((packed)) cacheLRUEntry_t;
+struct foo {
+  int x;
+  char a, b, c, d;
+} __attribute__((packed));
+void __attribute__ ((visibility ("protected")))
+     f1 () { /* Do something. */; }
+void f2 () { /* Do something. */; }
+__attribute__((noreturn)) void d0 (void),
+  __attribute__((format(printf, 1, 2))) d1 (const char *, ...),
+  d2 (void);
+int x __attribute__ ((aligned (16))) = 0;
+struct foo { int x[2] __attribute__ ((aligned (8))); };
+short array[3] __attribute__ ((aligned));
+
+asm("  section 10");
+int f
+       () {}
+
+DEAFUN ("expand-file-name", Fexpand_file_name, Sexpand_file_name, 1, 2, 0,
+  "name.")
+     (name, defalt)
+     Lisp_Object name, defalt;
+{
+  unsigned char *nm;
+}
+XDEFUN ("x-get-selection-internal", Fx_get_selection_internal,
+       Sx_get_selection_internal, 2, 2, 0, "")
+{}
+DEFUN ("x-get-selection-internal", Fx_get_selection_internal,
+       Sx_get_selection_internal, 2, 2, 0, "")
+{}
+/* The next two are not tagged correctly.  To prevent this, the code in
+   Emacs should contain the two first args of DEFUN on the same line. */
+DEFUN ("x-get-selection-internal",
+       Fx_get_selection_internal, Sx_get_selection_internal, 2, 2, 0, "")
+{}
+DEFUN
+     ("y-get-selection-internal",
+      Fy_get_selection_internal, Sy_get_selection_internal, 2, 2, 0, "")
+{}
+defun_func1()
+{}
+DEFUN_func2()
+{}
+typedef int bool;
+bool funcboo ()
+{}
+static void (*lang_func) () = NULL;
+struct my_struct {
+};
+typedef struct my_struct my_typedef;
+int bla ()
+{
+  PrkList ExistingOperations =
+      ProcedureOperationSelections(PrkNull, CalledFromDomain);
+}
+a()
+ b c;
+{}
+int func1
+  (a,b,c,d) {};
+static struct cca_control init_control = { 0 };
+static tpcmd rbtp [RB_TPSZ];
+static byte ring1 [(RBUFNO + 1) + 8];
+static byte ring2 [(RBUFNO + 1) * sizeof (struct le_md) + 8];
+request request (a, b)
+{
+}
+int func2 (a,b
+         c,d) {};
+int wrongfunc
+  aaa;
+struct wrongstruct
+  bbb;
+struct sss1 {};
+struct sss2
+{
+  struct ss3
+    {
+    };
+};
+struct a b;
+struct aa *b;
+struct aaa
+  **b;
+caccacacca (a,b,c,d,e,f,g)
+     struct aa *b;
+{
+}
+a ()
+{
+  typedef struct aa {} aaa;
+}
+static void inita () {}
+node *lasta = NULL;
+b ()
+{
+  typedef  int bb;
+}
+static void initb () {}
+node *lastb = NULL;
+typedef enum { REG_ENOSYS = -1, aa } reg_errcode_t;
diff --git a/test/etags/c-src/dostorture.c b/test/etags/c-src/dostorture.c
new file mode 100644
index 0000000..5190734
--- /dev/null
+++ b/test/etags/c-src/dostorture.c
@@ -0,0 +1,107 @@
+/* Date: Thu, 05 Aug 1993 20:28:03 +0200
+   From: "Tom R.Hageman" <address@hidden>
+   Subject: more etags torture;-) [etags 7.3 patch#3]
+   To: address@hidden
+
+   Hi,
+
+   This test file illustrates some more problems with etags (7.3):
+
+
+   1. parentheses are confusing,
+   2. preprocessor directives can disrupt other state machines. */
+
+/* A small torture test for etags. */
+
+/* The classic parenthesis nightmare, based on signal(). */
+void
+(*tag1 (sig, handler)) ()
+  int sig;
+  void (*handler) ();
+{
+  (*handler)(sig);
+  return handler;
+}
+
+#define notag2 void
+/* The classic, with user-defined return type. */
+notag2
+(*tag2 (sig, handler)) ()
+  int sig;
+  void (*handler) ();
+{
+  (*handler)(sig);
+  return handler;
+}
+
+/* The classic, in ANSI C style. */
+void
+(*tag3 (int sig, void (*handler) (int))) (int)
+{
+  (*handler)(sig);
+  return handler;
+}
+
+#define notag4 void
+/* The classic, with user-defined return type, in ANSI C style. */
+notag4
+(*tag4 (int sig, void (*handler) (int))) (int)
+{
+  (*handler)(sig);
+  return handler;
+}
+
+
+/* A less tortuous example. */
+void
+tag5 (handler, arg)
+void (*handler)();
+void *arg;
+{
+  (*handler)(arg);
+}
+
+/* A less tortuous example, in ANSI C style. */
+void
+tag6 (void (*handler) (void *), void *arg)
+{
+  (*handler)(arg);
+}
+
+
+/* Interfering preprocessing torture */
+
+int pp1(
+#if (__STDC__)
+       int
+#endif
+       bar)
+#if (!__STDC__)
+     int bar;
+#endif
+{
+  return bar;
+}
+
+int
+pp2
+#if __STDC__
+  (int bar)
+#else
+  (bar)
+    int bar;
+#endif
+{
+  return bar;
+}
+
+int
+#if __STDC__
+pp3(int bar)
+#else
+pp3(bar)
+  int bar;
+#endif
+{
+  return bar;
+}
diff --git a/test/etags/c-src/emacs/src/gmalloc.c 
b/test/etags/c-src/emacs/src/gmalloc.c
new file mode 100644
index 0000000..a88f4ab
--- /dev/null
+++ b/test/etags/c-src/emacs/src/gmalloc.c
@@ -0,0 +1,2040 @@
+/* Declarations for `malloc' and friends.
+   Copyright (C) 1990-1993, 1995-1996, 1999, 2002-2007, 2013-2015 Free
+   Software Foundation, Inc.
+                 Written May 1989 by Mike Haertel.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public
+License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+
+   The author may be reached (Email) at the address address@hidden,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+#include <config.h>
+
+#if defined HAVE_PTHREAD && !defined HYBRID_MALLOC
+#define USE_PTHREAD
+#endif
+
+#include <string.h>
+#include <limits.h>
+#include <stdint.h>
+
+#ifdef HYBRID_GET_CURRENT_DIR_NAME
+#undef get_current_dir_name
+#endif
+
+#include <unistd.h>
+
+#ifdef USE_PTHREAD
+#include <pthread.h>
+#endif
+
+#ifdef WINDOWSNT
+#include <w32heap.h>   /* for sbrk */
+#endif
+
+#ifdef emacs
+extern void emacs_abort (void);
+#endif
+
+/* If HYBRID_MALLOC is defined, then temacs will use malloc,
+   realloc... as defined in this file (and renamed gmalloc,
+   grealloc... via the macros that follow).  The dumped emacs,
+   however, will use the system malloc, realloc....  In other source
+   files, malloc, realloc... are renamed hybrid_malloc,
+   hybrid_realloc... via macros in conf_post.h.  hybrid_malloc and
+   friends are wrapper functions defined later in this file.
+   aligned_alloc is defined as a macro only in alloc.c.
+
+   As of this writing (August 2014), Cygwin is the only platform on
+   which HYBRID_MACRO is defined.  Any other platform that wants to
+   define it will have to define the macros DUMPED and
+   ALLOCATED_BEFORE_DUMPING, defined below for Cygwin.  */
+#ifdef HYBRID_MALLOC
+#undef malloc
+#undef realloc
+#undef calloc
+#undef free
+#define malloc gmalloc
+#define realloc grealloc
+#define calloc gcalloc
+#define aligned_alloc galigned_alloc
+#define free gfree
+#endif  /* HYBRID_MALLOC */
+
+#ifdef CYGWIN
+extern void *bss_sbrk (ptrdiff_t size);
+extern int bss_sbrk_did_unexec;
+extern char bss_sbrk_buffer[];
+extern void *bss_sbrk_buffer_end;
+#define DUMPED bss_sbrk_did_unexec
+#define ALLOCATED_BEFORE_DUMPING(P) \
+  ((P) < bss_sbrk_buffer_end && (P) >= (void *) bss_sbrk_buffer)
+#endif
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stddef.h>
+
+
+/* Allocate SIZE bytes of memory.  */
+extern void *malloc (size_t size) ATTRIBUTE_MALLOC_SIZE ((1));
+/* Re-allocate the previously allocated block
+   in ptr, making the new block SIZE bytes long.  */
+extern void *realloc (void *ptr, size_t size) ATTRIBUTE_ALLOC_SIZE ((2));
+/* Allocate NMEMB elements of SIZE bytes each, all initialized to 0.  */
+extern void *calloc (size_t nmemb, size_t size) ATTRIBUTE_MALLOC_SIZE ((1,2));
+/* Free a block allocated by `malloc', `realloc' or `calloc'.  */
+extern void free (void *ptr);
+
+/* Allocate SIZE bytes allocated to ALIGNMENT bytes.  */
+#ifdef MSDOS
+extern void *aligned_alloc (size_t, size_t);
+extern void *memalign (size_t, size_t);
+extern int posix_memalign (void **, size_t, size_t);
+#endif
+
+#ifdef USE_PTHREAD
+/* Set up mutexes and make malloc etc. thread-safe.  */
+extern void malloc_enable_thread (void);
+#endif
+
+#ifdef emacs
+extern void emacs_abort (void);
+#endif
+
+/* The allocator divides the heap into blocks of fixed size; large
+   requests receive one or more whole blocks, and small requests
+   receive a fragment of a block.  Fragment sizes are powers of two,
+   and all fragments of a block are the same size.  When all the
+   fragments in a block have been freed, the block itself is freed.  */
+#define INT_BIT                (CHAR_BIT * sizeof (int))
+#define BLOCKLOG       (INT_BIT > 16 ? 12 : 9)
+#define BLOCKSIZE      (1 << BLOCKLOG)
+#define BLOCKIFY(SIZE) (((SIZE) + BLOCKSIZE - 1) / BLOCKSIZE)
+
+/* Determine the amount of memory spanned by the initial heap table
+   (not an absolute limit).  */
+#define HEAP           (INT_BIT > 16 ? 4194304 : 65536)
+
+/* Number of contiguous free blocks allowed to build up at the end of
+   memory before they will be returned to the system.  */
+#define FINAL_FREE_BLOCKS      8
+
+/* Data structure giving per-block information.  */
+typedef union
+  {
+    /* Heap information for a busy block.  */
+    struct
+      {
+       /* Zero for a large (multiblock) object, or positive giving the
+          logarithm to the base two of the fragment size.  */
+       int type;
+       union
+         {
+           struct
+             {
+               size_t nfree; /* Free frags in a fragmented block.  */
+               size_t first; /* First free fragment of the block.  */
+             } frag;
+           /* For a large object, in its first block, this has the number
+              of blocks in the object.  In the other blocks, this has a
+              negative number which says how far back the first block is.  */
+           ptrdiff_t size;
+         } info;
+      } busy;
+    /* Heap information for a free block
+       (that may be the first of a free cluster).  */
+    struct
+      {
+       size_t size;    /* Size (in blocks) of a free cluster.  */
+       size_t next;    /* Index of next free cluster.  */
+       size_t prev;    /* Index of previous free cluster.  */
+      } free;
+  } malloc_info;
+
+/* Pointer to first block of the heap.  */
+extern char *_heapbase;
+
+/* Table indexed by block number giving per-block information.  */
+extern malloc_info *_heapinfo;
+
+/* Address to block number and vice versa.  */
+#define BLOCK(A)       (((char *) (A) - _heapbase) / BLOCKSIZE + 1)
+#define ADDRESS(B)     ((void *) (((B) - 1) * BLOCKSIZE + _heapbase))
+
+/* Current search index for the heap table.  */
+extern size_t _heapindex;
+
+/* Limit of valid info table indices.  */
+extern size_t _heaplimit;
+
+/* Doubly linked lists of free fragments.  */
+struct list
+  {
+    struct list *next;
+    struct list *prev;
+  };
+
+/* Free list headers for each fragment size.  */
+extern struct list _fraghead[];
+
+/* List of blocks allocated with aligned_alloc and friends.  */
+struct alignlist
+  {
+    struct alignlist *next;
+    void *aligned;             /* The address that aligned_alloc returned.  */
+    void *exact;               /* The address that malloc returned.  */
+  };
+extern struct alignlist *_aligned_blocks;
+
+/* Instrumentation.  */
+extern size_t _chunks_used;
+extern size_t _bytes_used;
+extern size_t _chunks_free;
+extern size_t _bytes_free;
+
+/* Internal versions of `malloc', `realloc', and `free'
+   used when these functions need to call each other.
+   They are the same but don't call the hooks.  */
+extern void *_malloc_internal (size_t);
+extern void *_realloc_internal (void *, size_t);
+extern void _free_internal (void *);
+extern void *_malloc_internal_nolock (size_t);
+extern void *_realloc_internal_nolock (void *, size_t);
+extern void _free_internal_nolock (void *);
+
+#ifdef USE_PTHREAD
+extern pthread_mutex_t _malloc_mutex, _aligned_blocks_mutex;
+extern int _malloc_thread_enabled_p;
+#define LOCK()                                 \
+  do {                                         \
+    if (_malloc_thread_enabled_p)              \
+      pthread_mutex_lock (&_malloc_mutex);     \
+  } while (0)
+#define UNLOCK()                               \
+  do {                                         \
+    if (_malloc_thread_enabled_p)              \
+      pthread_mutex_unlock (&_malloc_mutex);   \
+  } while (0)
+#define LOCK_ALIGNED_BLOCKS()                          \
+  do {                                                 \
+    if (_malloc_thread_enabled_p)                      \
+      pthread_mutex_lock (&_aligned_blocks_mutex);     \
+  } while (0)
+#define UNLOCK_ALIGNED_BLOCKS()                                \
+  do {                                                 \
+    if (_malloc_thread_enabled_p)                      \
+      pthread_mutex_unlock (&_aligned_blocks_mutex);   \
+  } while (0)
+#else
+#define LOCK()
+#define UNLOCK()
+#define LOCK_ALIGNED_BLOCKS()
+#define UNLOCK_ALIGNED_BLOCKS()
+#endif
+
+/* Given an address in the middle of a malloc'd object,
+   return the address of the beginning of the object.  */
+extern void *malloc_find_object_address (void *ptr);
+
+/* Underlying allocation function; successive calls should
+   return contiguous pieces of memory.  */
+extern void *(*__morecore) (ptrdiff_t size);
+
+/* Default value of `__morecore'.  */
+extern void *__default_morecore (ptrdiff_t size);
+
+/* If not NULL, this function is called after each time
+   `__morecore' is called to increase the data size.  */
+extern void (*__after_morecore_hook) (void);
+
+/* Number of extra blocks to get each time we ask for more core.
+   This reduces the frequency of calling `(*__morecore)'.  */
+extern size_t __malloc_extra_blocks;
+
+/* Nonzero if `malloc' has been called and done its initialization.  */
+extern int __malloc_initialized;
+/* Function called to initialize malloc data structures.  */
+extern int __malloc_initialize (void);
+
+/* Hooks for debugging versions.  */
+extern void (*__malloc_initialize_hook) (void);
+extern void (*__free_hook) (void *ptr);
+extern void *(*__malloc_hook) (size_t size);
+extern void *(*__realloc_hook) (void *ptr, size_t size);
+extern void *(*__memalign_hook) (size_t size, size_t alignment);
+
+/* Return values for `mprobe': these are the kinds of inconsistencies that
+   `mcheck' enables detection of.  */
+enum mcheck_status
+  {
+    MCHECK_DISABLED = -1,      /* Consistency checking is not turned on.  */
+    MCHECK_OK,                 /* Block is fine.  */
+    MCHECK_FREE,               /* Block freed twice.  */
+    MCHECK_HEAD,               /* Memory before the block was clobbered.  */
+    MCHECK_TAIL                        /* Memory after the block was 
clobbered.  */
+  };
+
+/* Activate a standard collection of debugging hooks.  This must be called
+   before `malloc' is ever called.  ABORTFUNC is called with an error code
+   (see enum above) when an inconsistency is detected.  If ABORTFUNC is
+   null, the standard function prints on stderr and then calls `abort'.  */
+extern int mcheck (void (*abortfunc) (enum mcheck_status));
+
+/* Check for aberrations in a particular malloc'd block.  You must have
+   called `mcheck' already.  These are the same checks that `mcheck' does
+   when you free or reallocate a block.  */
+extern enum mcheck_status mprobe (void *ptr);
+
+/* Activate a standard collection of tracing hooks.  */
+extern void mtrace (void);
+extern void muntrace (void);
+
+/* Statistics available to the user.  */
+struct mstats
+  {
+    size_t bytes_total;        /* Total size of the heap. */
+    size_t chunks_used;        /* Chunks allocated by the user. */
+    size_t bytes_used; /* Byte total of user-allocated chunks. */
+    size_t chunks_free;        /* Chunks in the free list. */
+    size_t bytes_free; /* Byte total of chunks in the free list. */
+  };
+
+/* Pick up the current statistics. */
+extern struct mstats mstats (void);
+
+/* Call WARNFUN with a warning message when memory usage is high.  */
+extern void memory_warnings (void *start, void (*warnfun) (const char *));
+
+#ifdef __cplusplus
+}
+#endif
+
+/* Memory allocator `malloc'.
+   Copyright 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+                 Written May 1989 by Mike Haertel.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public
+License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+
+   The author may be reached (Email) at the address address@hidden,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+#include <errno.h>
+
+void *(*__morecore) (ptrdiff_t size) = __default_morecore;
+
+/* Debugging hook for `malloc'.  */
+void *(*__malloc_hook) (size_t size);
+
+/* Pointer to the base of the first block.  */
+char *_heapbase;
+
+/* Block information table.  Allocated with align/__free (not malloc/free).  */
+malloc_info *_heapinfo;
+
+/* Number of info entries.  */
+static size_t heapsize;
+
+/* Search index in the info table.  */
+size_t _heapindex;
+
+/* Limit of valid info table indices.  */
+size_t _heaplimit;
+
+/* Free lists for each fragment size.  */
+struct list _fraghead[BLOCKLOG];
+
+/* Instrumentation.  */
+size_t _chunks_used;
+size_t _bytes_used;
+size_t _chunks_free;
+size_t _bytes_free;
+
+/* Are you experienced?  */
+int __malloc_initialized;
+
+size_t __malloc_extra_blocks;
+
+void (*__malloc_initialize_hook) (void);
+void (*__after_morecore_hook) (void);
+
+#if defined GC_MALLOC_CHECK && defined GC_PROTECT_MALLOC_STATE
+
+/* Some code for hunting a bug writing into _heapinfo.
+
+   Call this macro with argument PROT non-zero to protect internal
+   malloc state against writing to it, call it with a zero argument to
+   make it readable and writable.
+
+   Note that this only works if BLOCKSIZE == page size, which is
+   the case on the i386.  */
+
+#include <sys/types.h>
+#include <sys/mman.h>
+
+static int state_protected_p;
+static size_t last_state_size;
+static malloc_info *last_heapinfo;
+
+void
+protect_malloc_state (int protect_p)
+{
+  /* If _heapinfo has been relocated, make sure its old location
+     isn't left read-only; it will be reused by malloc.  */
+  if (_heapinfo != last_heapinfo
+      && last_heapinfo
+      && state_protected_p)
+    mprotect (last_heapinfo, last_state_size, PROT_READ | PROT_WRITE);
+
+  last_state_size = _heaplimit * sizeof *_heapinfo;
+  last_heapinfo   = _heapinfo;
+
+  if (protect_p != state_protected_p)
+    {
+      state_protected_p = protect_p;
+      if (mprotect (_heapinfo, last_state_size,
+                   protect_p ? PROT_READ : PROT_READ | PROT_WRITE) != 0)
+       abort ();
+    }
+}
+
+#define PROTECT_MALLOC_STATE(PROT) protect_malloc_state (PROT)
+
+#else
+#define PROTECT_MALLOC_STATE(PROT)     /* empty */
+#endif
+
+
+/* Aligned allocation.  */
+static void *
+align (size_t size)
+{
+  void *result;
+  ptrdiff_t adj;
+
+  /* align accepts an unsigned argument, but __morecore accepts a
+     signed one.  This could lead to trouble if SIZE overflows the
+     ptrdiff_t type accepted by __morecore.  We just punt in that
+     case, since they are requesting a ludicrous amount anyway.  */
+  if (PTRDIFF_MAX < size)
+    result = 0;
+  else
+    result = (*__morecore) (size);
+  adj = (uintptr_t) result % BLOCKSIZE;
+  if (adj != 0)
+    {
+      adj = BLOCKSIZE - adj;
+      (*__morecore) (adj);
+      result = (char *) result + adj;
+    }
+
+  if (__after_morecore_hook)
+    (*__after_morecore_hook) ();
+
+  return result;
+}
+
+/* Get SIZE bytes, if we can get them starting at END.
+   Return the address of the space we got.
+   If we cannot get space at END, fail and return 0.  */
+static void *
+get_contiguous_space (ptrdiff_t size, void *position)
+{
+  void *before;
+  void *after;
+
+  before = (*__morecore) (0);
+  /* If we can tell in advance that the break is at the wrong place,
+     fail now.  */
+  if (before != position)
+    return 0;
+
+  /* Allocate SIZE bytes and get the address of them.  */
+  after = (*__morecore) (size);
+  if (!after)
+    return 0;
+
+  /* It was not contiguous--reject it.  */
+  if (after != position)
+    {
+      (*__morecore) (- size);
+      return 0;
+    }
+
+  return after;
+}
+
+
+/* This is called when `_heapinfo' and `heapsize' have just
+   been set to describe a new info table.  Set up the table
+   to describe itself and account for it in the statistics.  */
+static void
+register_heapinfo (void)
+{
+  size_t block, blocks;
+
+  block = BLOCK (_heapinfo);
+  blocks = BLOCKIFY (heapsize * sizeof (malloc_info));
+
+  /* Account for the _heapinfo block itself in the statistics.  */
+  _bytes_used += blocks * BLOCKSIZE;
+  ++_chunks_used;
+
+  /* Describe the heapinfo block itself in the heapinfo.  */
+  _heapinfo[block].busy.type = 0;
+  _heapinfo[block].busy.info.size = blocks;
+  /* Leave back-pointers for malloc_find_address.  */
+  while (--blocks > 0)
+    _heapinfo[block + blocks].busy.info.size = -blocks;
+}
+
+#ifdef USE_PTHREAD
+pthread_mutex_t _malloc_mutex = PTHREAD_MUTEX_INITIALIZER;
+pthread_mutex_t _aligned_blocks_mutex = PTHREAD_MUTEX_INITIALIZER;
+int _malloc_thread_enabled_p;
+
+static void
+malloc_atfork_handler_prepare (void)
+{
+  LOCK ();
+  LOCK_ALIGNED_BLOCKS ();
+}
+
+static void
+malloc_atfork_handler_parent (void)
+{
+  UNLOCK_ALIGNED_BLOCKS ();
+  UNLOCK ();
+}
+
+static void
+malloc_atfork_handler_child (void)
+{
+  UNLOCK_ALIGNED_BLOCKS ();
+  UNLOCK ();
+}
+
+/* Set up mutexes and make malloc etc. thread-safe.  */
+void
+malloc_enable_thread (void)
+{
+  if (_malloc_thread_enabled_p)
+    return;
+
+  /* Some pthread implementations call malloc for statically
+     initialized mutexes when they are used first.  To avoid such a
+     situation, we initialize mutexes here while their use is
+     disabled in malloc etc.  */
+  pthread_mutex_init (&_malloc_mutex, NULL);
+  pthread_mutex_init (&_aligned_blocks_mutex, NULL);
+  pthread_atfork (malloc_atfork_handler_prepare,
+                 malloc_atfork_handler_parent,
+                 malloc_atfork_handler_child);
+  _malloc_thread_enabled_p = 1;
+}
+#endif /* USE_PTHREAD */
+
+static void
+malloc_initialize_1 (void)
+{
+#ifdef GC_MCHECK
+  mcheck (NULL);
+#endif
+
+  if (__malloc_initialize_hook)
+    (*__malloc_initialize_hook) ();
+
+  heapsize = HEAP / BLOCKSIZE;
+  _heapinfo = align (heapsize * sizeof (malloc_info));
+  if (_heapinfo == NULL)
+    return;
+  memset (_heapinfo, 0, heapsize * sizeof (malloc_info));
+  _heapinfo[0].free.size = 0;
+  _heapinfo[0].free.next = _heapinfo[0].free.prev = 0;
+  _heapindex = 0;
+  _heapbase = (char *) _heapinfo;
+  _heaplimit = BLOCK (_heapbase + heapsize * sizeof (malloc_info));
+
+  register_heapinfo ();
+
+  __malloc_initialized = 1;
+  PROTECT_MALLOC_STATE (1);
+  return;
+}
+
+/* Set everything up and remember that we have.
+   main will call malloc which calls this function.  That is before any threads
+   or signal handlers has been set up, so we don't need thread protection.  */
+int
+__malloc_initialize (void)
+{
+  if (__malloc_initialized)
+    return 0;
+
+  malloc_initialize_1 ();
+
+  return __malloc_initialized;
+}
+
+static int morecore_recursing;
+
+/* Get neatly aligned memory, initializing or
+   growing the heap info table as necessary. */
+static void *
+morecore_nolock (size_t size)
+{
+  void *result;
+  malloc_info *newinfo, *oldinfo;
+  size_t newsize;
+
+  if (morecore_recursing)
+    /* Avoid recursion.  The caller will know how to handle a null return.  */
+    return NULL;
+
+  result = align (size);
+  if (result == NULL)
+    return NULL;
+
+  PROTECT_MALLOC_STATE (0);
+
+  /* Check if we need to grow the info table.  */
+  if ((size_t) BLOCK ((char *) result + size) > heapsize)
+    {
+      /* Calculate the new _heapinfo table size.  We do not account for the
+        added blocks in the table itself, as we hope to place them in
+        existing free space, which is already covered by part of the
+        existing table.  */
+      newsize = heapsize;
+      do
+       newsize *= 2;
+      while ((size_t) BLOCK ((char *) result + size) > newsize);
+
+      /* We must not reuse existing core for the new info table when called
+        from realloc in the case of growing a large block, because the
+        block being grown is momentarily marked as free.  In this case
+        _heaplimit is zero so we know not to reuse space for internal
+        allocation.  */
+      if (_heaplimit != 0)
+       {
+         /* First try to allocate the new info table in core we already
+            have, in the usual way using realloc.  If realloc cannot
+            extend it in place or relocate it to existing sufficient core,
+            we will get called again, and the code above will notice the
+            `morecore_recursing' flag and return null.  */
+         int save = errno;     /* Don't want to clobber errno with ENOMEM.  */
+         morecore_recursing = 1;
+         newinfo = _realloc_internal_nolock (_heapinfo,
+                                             newsize * sizeof (malloc_info));
+         morecore_recursing = 0;
+         if (newinfo == NULL)
+           errno = save;
+         else
+           {
+             /* We found some space in core, and realloc has put the old
+                table's blocks on the free list.  Now zero the new part
+                of the table and install the new table location.  */
+             memset (&newinfo[heapsize], 0,
+                     (newsize - heapsize) * sizeof (malloc_info));
+             _heapinfo = newinfo;
+             heapsize = newsize;
+             goto got_heap;
+           }
+       }
+
+      /* Allocate new space for the malloc info table.  */
+      while (1)
+       {
+         newinfo = align (newsize * sizeof (malloc_info));
+
+         /* Did it fail?  */
+         if (newinfo == NULL)
+           {
+             (*__morecore) (-size);
+             return NULL;
+           }
+
+         /* Is it big enough to record status for its own space?
+            If so, we win.  */
+         if ((size_t) BLOCK ((char *) newinfo
+                             + newsize * sizeof (malloc_info))
+             < newsize)
+           break;
+
+         /* Must try again.  First give back most of what we just got.  */
+         (*__morecore) (- newsize * sizeof (malloc_info));
+         newsize *= 2;
+       }
+
+      /* Copy the old table to the beginning of the new,
+        and zero the rest of the new table.  */
+      memcpy (newinfo, _heapinfo, heapsize * sizeof (malloc_info));
+      memset (&newinfo[heapsize], 0,
+             (newsize - heapsize) * sizeof (malloc_info));
+      oldinfo = _heapinfo;
+      _heapinfo = newinfo;
+      heapsize = newsize;
+
+      register_heapinfo ();
+
+      /* Reset _heaplimit so _free_internal never decides
+        it can relocate or resize the info table.  */
+      _heaplimit = 0;
+      _free_internal_nolock (oldinfo);
+      PROTECT_MALLOC_STATE (0);
+
+      /* The new heap limit includes the new table just allocated.  */
+      _heaplimit = BLOCK ((char *) newinfo + heapsize * sizeof (malloc_info));
+      return result;
+    }
+
+ got_heap:
+  _heaplimit = BLOCK ((char *) result + size);
+  return result;
+}
+
+/* Allocate memory from the heap.  */
+void *
+_malloc_internal_nolock (size_t size)
+{
+  void *result;
+  size_t block, blocks, lastblocks, start;
+  register size_t i;
+  struct list *next;
+
+  /* ANSI C allows `malloc (0)' to either return NULL, or to return a
+     valid address you can realloc and free (though not dereference).
+
+     It turns out that some extant code (sunrpc, at least Ultrix's version)
+     expects `malloc (0)' to return non-NULL and breaks otherwise.
+     Be compatible.  */
+
+#if    0
+  if (size == 0)
+    return NULL;
+#endif
+
+  PROTECT_MALLOC_STATE (0);
+
+  if (size < sizeof (struct list))
+    size = sizeof (struct list);
+
+  /* Determine the allocation policy based on the request size.  */
+  if (size <= BLOCKSIZE / 2)
+    {
+      /* Small allocation to receive a fragment of a block.
+        Determine the logarithm to base two of the fragment size. */
+      register size_t log = 1;
+      --size;
+      while ((size /= 2) != 0)
+       ++log;
+
+      /* Look in the fragment lists for a
+        free fragment of the desired size. */
+      next = _fraghead[log].next;
+      if (next != NULL)
+       {
+         /* There are free fragments of this size.
+            Pop a fragment out of the fragment list and return it.
+            Update the block's nfree and first counters. */
+         result = next;
+         next->prev->next = next->next;
+         if (next->next != NULL)
+           next->next->prev = next->prev;
+         block = BLOCK (result);
+         if (--_heapinfo[block].busy.info.frag.nfree != 0)
+           _heapinfo[block].busy.info.frag.first =
+             (uintptr_t) next->next % BLOCKSIZE >> log;
+
+         /* Update the statistics.  */
+         ++_chunks_used;
+         _bytes_used += 1 << log;
+         --_chunks_free;
+         _bytes_free -= 1 << log;
+       }
+      else
+       {
+         /* No free fragments of the desired size, so get a new block
+            and break it into fragments, returning the first.  */
+#ifdef GC_MALLOC_CHECK
+         result = _malloc_internal_nolock (BLOCKSIZE);
+         PROTECT_MALLOC_STATE (0);
+#elif defined (USE_PTHREAD)
+         result = _malloc_internal_nolock (BLOCKSIZE);
+#else
+         result = malloc (BLOCKSIZE);
+#endif
+         if (result == NULL)
+           {
+             PROTECT_MALLOC_STATE (1);
+             goto out;
+           }
+
+         /* Link all fragments but the first into the free list.  */
+         next = (struct list *) ((char *) result + (1 << log));
+         next->next = NULL;
+         next->prev = &_fraghead[log];
+         _fraghead[log].next = next;
+
+         for (i = 2; i < (size_t) (BLOCKSIZE >> log); ++i)
+           {
+             next = (struct list *) ((char *) result + (i << log));
+             next->next = _fraghead[log].next;
+             next->prev = &_fraghead[log];
+             next->prev->next = next;
+             next->next->prev = next;
+           }
+
+         /* Initialize the nfree and first counters for this block.  */
+         block = BLOCK (result);
+         _heapinfo[block].busy.type = log;
+         _heapinfo[block].busy.info.frag.nfree = i - 1;
+         _heapinfo[block].busy.info.frag.first = i - 1;
+
+         _chunks_free += (BLOCKSIZE >> log) - 1;
+         _bytes_free += BLOCKSIZE - (1 << log);
+         _bytes_used -= BLOCKSIZE - (1 << log);
+       }
+    }
+  else
+    {
+      /* Large allocation to receive one or more blocks.
+        Search the free list in a circle starting at the last place visited.
+        If we loop completely around without finding a large enough
+        space we will have to get more memory from the system.  */
+      blocks = BLOCKIFY (size);
+      start = block = _heapindex;
+      while (_heapinfo[block].free.size < blocks)
+       {
+         block = _heapinfo[block].free.next;
+         if (block == start)
+           {
+             /* Need to get more from the system.  Get a little extra.  */
+             size_t wantblocks = blocks + __malloc_extra_blocks;
+             block = _heapinfo[0].free.prev;
+             lastblocks = _heapinfo[block].free.size;
+             /* Check to see if the new core will be contiguous with the
+                final free block; if so we don't need to get as much.  */
+             if (_heaplimit != 0 && block + lastblocks == _heaplimit &&
+                 /* We can't do this if we will have to make the heap info
+                     table bigger to accommodate the new space.  */
+                 block + wantblocks <= heapsize &&
+                 get_contiguous_space ((wantblocks - lastblocks) * BLOCKSIZE,
+                                       ADDRESS (block + lastblocks)))
+               {
+                 /* We got it contiguously.  Which block we are extending
+                    (the `final free block' referred to above) might have
+                    changed, if it got combined with a freed info table.  */
+                 block = _heapinfo[0].free.prev;
+                 _heapinfo[block].free.size += (wantblocks - lastblocks);
+                 _bytes_free += (wantblocks - lastblocks) * BLOCKSIZE;
+                 _heaplimit += wantblocks - lastblocks;
+                 continue;
+               }
+             result = morecore_nolock (wantblocks * BLOCKSIZE);
+             if (result == NULL)
+               goto out;
+             block = BLOCK (result);
+             /* Put the new block at the end of the free list.  */
+             _heapinfo[block].free.size = wantblocks;
+             _heapinfo[block].free.prev = _heapinfo[0].free.prev;
+             _heapinfo[block].free.next = 0;
+             _heapinfo[0].free.prev = block;
+             _heapinfo[_heapinfo[block].free.prev].free.next = block;
+             ++_chunks_free;
+             /* Now loop to use some of that block for this allocation.  */
+           }
+       }
+
+      /* At this point we have found a suitable free list entry.
+        Figure out how to remove what we need from the list. */
+      result = ADDRESS (block);
+      if (_heapinfo[block].free.size > blocks)
+       {
+         /* The block we found has a bit left over,
+            so relink the tail end back into the free list. */
+         _heapinfo[block + blocks].free.size
+           = _heapinfo[block].free.size - blocks;
+         _heapinfo[block + blocks].free.next
+           = _heapinfo[block].free.next;
+         _heapinfo[block + blocks].free.prev
+           = _heapinfo[block].free.prev;
+         _heapinfo[_heapinfo[block].free.prev].free.next
+           = _heapinfo[_heapinfo[block].free.next].free.prev
+           = _heapindex = block + blocks;
+       }
+      else
+       {
+         /* The block exactly matches our requirements,
+            so just remove it from the list. */
+         _heapinfo[_heapinfo[block].free.next].free.prev
+           = _heapinfo[block].free.prev;
+         _heapinfo[_heapinfo[block].free.prev].free.next
+           = _heapindex = _heapinfo[block].free.next;
+         --_chunks_free;
+       }
+
+      _heapinfo[block].busy.type = 0;
+      _heapinfo[block].busy.info.size = blocks;
+      ++_chunks_used;
+      _bytes_used += blocks * BLOCKSIZE;
+      _bytes_free -= blocks * BLOCKSIZE;
+
+      /* Mark all the blocks of the object just allocated except for the
+        first with a negative number so you can find the first block by
+        adding that adjustment.  */
+      while (--blocks > 0)
+       _heapinfo[block + blocks].busy.info.size = -blocks;
+    }
+
+  PROTECT_MALLOC_STATE (1);
+ out:
+  return result;
+}
+
+void *
+_malloc_internal (size_t size)
+{
+  void *result;
+
+  LOCK ();
+  result = _malloc_internal_nolock (size);
+  UNLOCK ();
+
+  return result;
+}
+
+void *
+malloc (size_t size)
+{
+  void *(*hook) (size_t);
+
+  if (!__malloc_initialized && !__malloc_initialize ())
+    return NULL;
+
+  /* Copy the value of __malloc_hook to an automatic variable in case
+     __malloc_hook is modified in another thread between its
+     NULL-check and the use.
+
+     Note: Strictly speaking, this is not a right solution.  We should
+     use mutexes to access non-read-only variables that are shared
+     among multiple threads.  We just leave it for compatibility with
+     glibc malloc (i.e., assignments to __malloc_hook) for now.  */
+  hook = __malloc_hook;
+  return (hook != NULL ? *hook : _malloc_internal) (size);
+}
+
+#ifndef _LIBC
+
+/* On some ANSI C systems, some libc functions call _malloc, _free
+   and _realloc.  Make them use the GNU functions.  */
+
+extern void *_malloc (size_t);
+extern void _free (void *);
+extern void *_realloc (void *, size_t);
+
+void *
+_malloc (size_t size)
+{
+  return malloc (size);
+}
+
+void
+_free (void *ptr)
+{
+  free (ptr);
+}
+
+void *
+_realloc (void *ptr, size_t size)
+{
+  return realloc (ptr, size);
+}
+
+#endif
+/* Free a block of memory allocated by `malloc'.
+   Copyright 1990, 1991, 1992, 1994, 1995 Free Software Foundation, Inc.
+                 Written May 1989 by Mike Haertel.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public
+License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+
+   The author may be reached (Email) at the address address@hidden,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+
+/* Debugging hook for free.  */
+void (*__free_hook) (void *__ptr);
+
+/* List of blocks allocated by aligned_alloc.  */
+struct alignlist *_aligned_blocks = NULL;
+
+/* Return memory to the heap.
+   Like `_free_internal' but don't lock mutex.  */
+void
+_free_internal_nolock (void *ptr)
+{
+  int type;
+  size_t block, blocks;
+  register size_t i;
+  struct list *prev, *next;
+  void *curbrk;
+  const size_t lesscore_threshold
+    /* Threshold of free space at which we will return some to the system.  */
+    = FINAL_FREE_BLOCKS + 2 * __malloc_extra_blocks;
+
+  register struct alignlist *l;
+
+  if (ptr == NULL)
+    return;
+
+  PROTECT_MALLOC_STATE (0);
+
+  LOCK_ALIGNED_BLOCKS ();
+  for (l = _aligned_blocks; l != NULL; l = l->next)
+    if (l->aligned == ptr)
+      {
+       l->aligned = NULL;      /* Mark the slot in the list as free.  */
+       ptr = l->exact;
+       break;
+      }
+  UNLOCK_ALIGNED_BLOCKS ();
+
+  block = BLOCK (ptr);
+
+  type = _heapinfo[block].busy.type;
+  switch (type)
+    {
+    case 0:
+      /* Get as many statistics as early as we can.  */
+      --_chunks_used;
+      _bytes_used -= _heapinfo[block].busy.info.size * BLOCKSIZE;
+      _bytes_free += _heapinfo[block].busy.info.size * BLOCKSIZE;
+
+      /* Find the free cluster previous to this one in the free list.
+        Start searching at the last block referenced; this may benefit
+        programs with locality of allocation.  */
+      i = _heapindex;
+      if (i > block)
+       while (i > block)
+         i = _heapinfo[i].free.prev;
+      else
+       {
+         do
+           i = _heapinfo[i].free.next;
+         while (i > 0 && i < block);
+         i = _heapinfo[i].free.prev;
+       }
+
+      /* Determine how to link this block into the free list.  */
+      if (block == i + _heapinfo[i].free.size)
+       {
+         /* Coalesce this block with its predecessor.  */
+         _heapinfo[i].free.size += _heapinfo[block].busy.info.size;
+         block = i;
+       }
+      else
+       {
+         /* Really link this block back into the free list.  */
+         _heapinfo[block].free.size = _heapinfo[block].busy.info.size;
+         _heapinfo[block].free.next = _heapinfo[i].free.next;
+         _heapinfo[block].free.prev = i;
+         _heapinfo[i].free.next = block;
+         _heapinfo[_heapinfo[block].free.next].free.prev = block;
+         ++_chunks_free;
+       }
+
+      /* Now that the block is linked in, see if we can coalesce it
+        with its successor (by deleting its successor from the list
+        and adding in its size).  */
+      if (block + _heapinfo[block].free.size == _heapinfo[block].free.next)
+       {
+         _heapinfo[block].free.size
+           += _heapinfo[_heapinfo[block].free.next].free.size;
+         _heapinfo[block].free.next
+           = _heapinfo[_heapinfo[block].free.next].free.next;
+         _heapinfo[_heapinfo[block].free.next].free.prev = block;
+         --_chunks_free;
+       }
+
+      /* How many trailing free blocks are there now?  */
+      blocks = _heapinfo[block].free.size;
+
+      /* Where is the current end of accessible core?  */
+      curbrk = (*__morecore) (0);
+
+      if (_heaplimit != 0 && curbrk == ADDRESS (_heaplimit))
+       {
+         /* The end of the malloc heap is at the end of accessible core.
+            It's possible that moving _heapinfo will allow us to
+            return some space to the system.  */
+
+         size_t info_block = BLOCK (_heapinfo);
+         size_t info_blocks = _heapinfo[info_block].busy.info.size;
+         size_t prev_block = _heapinfo[block].free.prev;
+         size_t prev_blocks = _heapinfo[prev_block].free.size;
+         size_t next_block = _heapinfo[block].free.next;
+         size_t next_blocks = _heapinfo[next_block].free.size;
+
+         if (/* Win if this block being freed is last in core, the info table
+                is just before it, the previous free block is just before the
+                info table, and the two free blocks together form a useful
+                amount to return to the system.  */
+             (block + blocks == _heaplimit &&
+              info_block + info_blocks == block &&
+              prev_block != 0 && prev_block + prev_blocks == info_block &&
+              blocks + prev_blocks >= lesscore_threshold) ||
+             /* Nope, not the case.  We can also win if this block being
+                freed is just before the info table, and the table extends
+                to the end of core or is followed only by a free block,
+                and the total free space is worth returning to the system.  */
+             (block + blocks == info_block &&
+              ((info_block + info_blocks == _heaplimit &&
+                blocks >= lesscore_threshold) ||
+               (info_block + info_blocks == next_block &&
+                next_block + next_blocks == _heaplimit &&
+                blocks + next_blocks >= lesscore_threshold)))
+             )
+           {
+             malloc_info *newinfo;
+             size_t oldlimit = _heaplimit;
+
+             /* Free the old info table, clearing _heaplimit to avoid
+                recursion into this code.  We don't want to return the
+                table's blocks to the system before we have copied them to
+                the new location.  */
+             _heaplimit = 0;
+             _free_internal_nolock (_heapinfo);
+             _heaplimit = oldlimit;
+
+             /* Tell malloc to search from the beginning of the heap for
+                free blocks, so it doesn't reuse the ones just freed.  */
+             _heapindex = 0;
+
+             /* Allocate new space for the info table and move its data.  */
+             newinfo = _malloc_internal_nolock (info_blocks * BLOCKSIZE);
+             PROTECT_MALLOC_STATE (0);
+             memmove (newinfo, _heapinfo, info_blocks * BLOCKSIZE);
+             _heapinfo = newinfo;
+
+             /* We should now have coalesced the free block with the
+                blocks freed from the old info table.  Examine the entire
+                trailing free block to decide below whether to return some
+                to the system.  */
+             block = _heapinfo[0].free.prev;
+             blocks = _heapinfo[block].free.size;
+           }
+
+         /* Now see if we can return stuff to the system.  */
+         if (block + blocks == _heaplimit && blocks >= lesscore_threshold)
+           {
+             register size_t bytes = blocks * BLOCKSIZE;
+             _heaplimit -= blocks;
+             (*__morecore) (-bytes);
+             _heapinfo[_heapinfo[block].free.prev].free.next
+               = _heapinfo[block].free.next;
+             _heapinfo[_heapinfo[block].free.next].free.prev
+               = _heapinfo[block].free.prev;
+             block = _heapinfo[block].free.prev;
+             --_chunks_free;
+             _bytes_free -= bytes;
+           }
+       }
+
+      /* Set the next search to begin at this block.  */
+      _heapindex = block;
+      break;
+
+    default:
+      /* Do some of the statistics.  */
+      --_chunks_used;
+      _bytes_used -= 1 << type;
+      ++_chunks_free;
+      _bytes_free += 1 << type;
+
+      /* Get the address of the first free fragment in this block.  */
+      prev = (struct list *) ((char *) ADDRESS (block) +
+                             (_heapinfo[block].busy.info.frag.first << type));
+
+      if (_heapinfo[block].busy.info.frag.nfree == (BLOCKSIZE >> type) - 1)
+       {
+         /* If all fragments of this block are free, remove them
+            from the fragment list and free the whole block.  */
+         next = prev;
+         for (i = 1; i < (size_t) (BLOCKSIZE >> type); ++i)
+           next = next->next;
+         prev->prev->next = next;
+         if (next != NULL)
+           next->prev = prev->prev;
+         _heapinfo[block].busy.type = 0;
+         _heapinfo[block].busy.info.size = 1;
+
+         /* Keep the statistics accurate.  */
+         ++_chunks_used;
+         _bytes_used += BLOCKSIZE;
+         _chunks_free -= BLOCKSIZE >> type;
+         _bytes_free -= BLOCKSIZE;
+
+#if defined (GC_MALLOC_CHECK) || defined (USE_PTHREAD)
+         _free_internal_nolock (ADDRESS (block));
+#else
+         free (ADDRESS (block));
+#endif
+       }
+      else if (_heapinfo[block].busy.info.frag.nfree != 0)
+       {
+         /* If some fragments of this block are free, link this
+            fragment into the fragment list after the first free
+            fragment of this block. */
+         next = ptr;
+         next->next = prev->next;
+         next->prev = prev;
+         prev->next = next;
+         if (next->next != NULL)
+           next->next->prev = next;
+         ++_heapinfo[block].busy.info.frag.nfree;
+       }
+      else
+       {
+         /* No fragments of this block are free, so link this
+            fragment into the fragment list and announce that
+            it is the first free fragment of this block. */
+         prev = ptr;
+         _heapinfo[block].busy.info.frag.nfree = 1;
+         _heapinfo[block].busy.info.frag.first =
+           (uintptr_t) ptr % BLOCKSIZE >> type;
+         prev->next = _fraghead[type].next;
+         prev->prev = &_fraghead[type];
+         prev->prev->next = prev;
+         if (prev->next != NULL)
+           prev->next->prev = prev;
+       }
+      break;
+    }
+
+  PROTECT_MALLOC_STATE (1);
+}
+
+/* Return memory to the heap.
+   Like `free' but don't call a __free_hook if there is one.  */
+void
+_free_internal (void *ptr)
+{
+  LOCK ();
+  _free_internal_nolock (ptr);
+  UNLOCK ();
+}
+
+/* Return memory to the heap.  */
+
+void
+free (void *ptr)
+{
+  void (*hook) (void *) = __free_hook;
+
+  if (hook != NULL)
+    (*hook) (ptr);
+  else
+    _free_internal (ptr);
+}
+
+/* Define the `cfree' alias for `free'.  */
+#ifdef weak_alias
+weak_alias (free, cfree)
+#else
+void
+cfree (void *ptr)
+{
+  free (ptr);
+}
+#endif
+/* Change the size of a block allocated by `malloc'.
+   Copyright 1990, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+                    Written May 1989 by Mike Haertel.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public
+License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+
+   The author may be reached (Email) at the address address@hidden,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+#ifndef min
+#define min(a, b) ((a) < (b) ? (a) : (b))
+#endif
+
+/* Debugging hook for realloc.  */
+void *(*__realloc_hook) (void *ptr, size_t size);
+
+/* Resize the given region to the new size, returning a pointer
+   to the (possibly moved) region.  This is optimized for speed;
+   some benchmarks seem to indicate that greater compactness is
+   achieved by unconditionally allocating and copying to a
+   new region.  This module has incestuous knowledge of the
+   internals of both free and malloc. */
+void *
+_realloc_internal_nolock (void *ptr, size_t size)
+{
+  void *result;
+  int type;
+  size_t block, blocks, oldlimit;
+
+  if (size == 0)
+    {
+      _free_internal_nolock (ptr);
+      return _malloc_internal_nolock (0);
+    }
+  else if (ptr == NULL)
+    return _malloc_internal_nolock (size);
+
+  block = BLOCK (ptr);
+
+  PROTECT_MALLOC_STATE (0);
+
+  type = _heapinfo[block].busy.type;
+  switch (type)
+    {
+    case 0:
+      /* Maybe reallocate a large block to a small fragment.  */
+      if (size <= BLOCKSIZE / 2)
+       {
+         result = _malloc_internal_nolock (size);
+         if (result != NULL)
+           {
+             memcpy (result, ptr, size);
+             _free_internal_nolock (ptr);
+             goto out;
+           }
+       }
+
+      /* The new size is a large allocation as well;
+        see if we can hold it in place. */
+      blocks = BLOCKIFY (size);
+      if (blocks < _heapinfo[block].busy.info.size)
+       {
+         /* The new size is smaller; return
+            excess memory to the free list. */
+         _heapinfo[block + blocks].busy.type = 0;
+         _heapinfo[block + blocks].busy.info.size
+           = _heapinfo[block].busy.info.size - blocks;
+         _heapinfo[block].busy.info.size = blocks;
+         /* We have just created a new chunk by splitting a chunk in two.
+            Now we will free this chunk; increment the statistics counter
+            so it doesn't become wrong when _free_internal decrements it.  */
+         ++_chunks_used;
+         _free_internal_nolock (ADDRESS (block + blocks));
+         result = ptr;
+       }
+      else if (blocks == _heapinfo[block].busy.info.size)
+       /* No size change necessary.  */
+       result = ptr;
+      else
+       {
+         /* Won't fit, so allocate a new region that will.
+            Free the old region first in case there is sufficient
+            adjacent free space to grow without moving. */
+         blocks = _heapinfo[block].busy.info.size;
+         /* Prevent free from actually returning memory to the system.  */
+         oldlimit = _heaplimit;
+         _heaplimit = 0;
+         _free_internal_nolock (ptr);
+         result = _malloc_internal_nolock (size);
+         PROTECT_MALLOC_STATE (0);
+         if (_heaplimit == 0)
+           _heaplimit = oldlimit;
+         if (result == NULL)
+           {
+             /* Now we're really in trouble.  We have to unfree
+                the thing we just freed.  Unfortunately it might
+                have been coalesced with its neighbors.  */
+             if (_heapindex == block)
+               (void) _malloc_internal_nolock (blocks * BLOCKSIZE);
+             else
+               {
+                 void *previous
+                   = _malloc_internal_nolock ((block - _heapindex) * 
BLOCKSIZE);
+                 (void) _malloc_internal_nolock (blocks * BLOCKSIZE);
+                 _free_internal_nolock (previous);
+               }
+             goto out;
+           }
+         if (ptr != result)
+           memmove (result, ptr, blocks * BLOCKSIZE);
+       }
+      break;
+
+    default:
+      /* Old size is a fragment; type is logarithm
+        to base two of the fragment size.  */
+      if (size > (size_t) (1 << (type - 1)) &&
+         size <= (size_t) (1 << type))
+       /* The new size is the same kind of fragment.  */
+       result = ptr;
+      else
+       {
+         /* The new size is different; allocate a new space,
+            and copy the lesser of the new size and the old. */
+         result = _malloc_internal_nolock (size);
+         if (result == NULL)
+           goto out;
+         memcpy (result, ptr, min (size, (size_t) 1 << type));
+         _free_internal_nolock (ptr);
+       }
+      break;
+    }
+
+  PROTECT_MALLOC_STATE (1);
+ out:
+  return result;
+}
+
+void *
+_realloc_internal (void *ptr, size_t size)
+{
+  void *result;
+
+  LOCK ();
+  result = _realloc_internal_nolock (ptr, size);
+  UNLOCK ();
+
+  return result;
+}
+
+void *
+realloc (void *ptr, size_t size)
+{
+  void *(*hook) (void *, size_t);
+
+  if (!__malloc_initialized && !__malloc_initialize ())
+    return NULL;
+
+  hook = __realloc_hook;
+  return (hook != NULL ? *hook : _realloc_internal) (ptr, size);
+}
+/* Copyright (C) 1991, 1992, 1994 Free Software Foundation, Inc.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public
+License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+
+   The author may be reached (Email) at the address address@hidden,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+/* Allocate an array of NMEMB elements each SIZE bytes long.
+   The entire array is initialized to zeros.  */
+void *
+calloc (size_t nmemb, size_t size)
+{
+  void *result;
+  size_t bytes = nmemb * size;
+
+  if (size != 0 && bytes / size != nmemb)
+    {
+      errno = ENOMEM;
+      return NULL;
+    }
+
+  result = malloc (bytes);
+  if (result)
+    return memset (result, 0, bytes);
+  return result;
+}
+/* Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with the GNU C Library.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/* uClibc defines __GNU_LIBRARY__, but it is not completely
+   compatible.  */
+#if !defined (__GNU_LIBRARY__) || defined (__UCLIBC__)
+#define        __sbrk  sbrk
+#else /* __GNU_LIBRARY__ && ! defined (__UCLIBC__) */
+/* It is best not to declare this and cast its result on foreign operating
+   systems with potentially hostile include files.  */
+
+extern void *__sbrk (ptrdiff_t increment);
+#endif /* __GNU_LIBRARY__ && ! defined (__UCLIBC__) */
+
+/* Allocate INCREMENT more bytes of data space,
+   and return the start of data space, or NULL on errors.
+   If INCREMENT is negative, shrink data space.  */
+void *
+__default_morecore (ptrdiff_t increment)
+{
+  void *result;
+#if defined (CYGWIN)
+  if (!DUMPED)
+    {
+      return bss_sbrk (increment);
+    }
+#endif
+  result = (void *) __sbrk (increment);
+  if (result == (void *) -1)
+    return NULL;
+  return result;
+}
+/* Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public
+License along with this library.  If not, see <http://www.gnu.org/licenses/>.  
*/
+
+void *(*__memalign_hook) (size_t size, size_t alignment);
+
+void *
+aligned_alloc (size_t alignment, size_t size)
+{
+  void *result;
+  size_t adj, lastadj;
+  void *(*hook) (size_t, size_t) = __memalign_hook;
+
+  if (hook)
+    return (*hook) (alignment, size);
+
+  /* Allocate a block with enough extra space to pad the block with up to
+     (ALIGNMENT - 1) bytes if necessary.  */
+  if (- size < alignment)
+    {
+      errno = ENOMEM;
+      return NULL;
+    }
+  result = malloc (size + alignment - 1);
+  if (result == NULL)
+    return NULL;
+
+  /* Figure out how much we will need to pad this particular block
+     to achieve the required alignment.  */
+  adj = alignment - (uintptr_t) result % alignment;
+  if (adj == alignment)
+    adj = 0;
+
+  if (adj != alignment - 1)
+    {
+      do
+       {
+         /* Reallocate the block with only as much excess as it
+            needs.  */
+         free (result);
+         result = malloc (size + adj);
+         if (result == NULL)   /* Impossible unless interrupted.  */
+           return NULL;
+
+         lastadj = adj;
+         adj = alignment - (uintptr_t) result % alignment;
+         if (adj == alignment)
+           adj = 0;
+         /* It's conceivable we might have been so unlucky as to get
+            a different block with weaker alignment.  If so, this
+            block is too short to contain SIZE after alignment
+            correction.  So we must try again and get another block,
+            slightly larger.  */
+       } while (adj > lastadj);
+    }
+
+  if (adj != 0)
+    {
+      /* Record this block in the list of aligned blocks, so that `free'
+        can identify the pointer it is passed, which will be in the middle
+        of an allocated block.  */
+
+      struct alignlist *l;
+      LOCK_ALIGNED_BLOCKS ();
+      for (l = _aligned_blocks; l != NULL; l = l->next)
+       if (l->aligned == NULL)
+         /* This slot is free.  Use it.  */
+         break;
+      if (l == NULL)
+       {
+         l = malloc (sizeof *l);
+         if (l != NULL)
+           {
+             l->next = _aligned_blocks;
+             _aligned_blocks = l;
+           }
+       }
+      if (l != NULL)
+       {
+         l->exact = result;
+         result = l->aligned = (char *) result + adj;
+       }
+      UNLOCK_ALIGNED_BLOCKS ();
+      if (l == NULL)
+       {
+         free (result);
+         result = NULL;
+       }
+    }
+
+  return result;
+}
+
+/* An obsolete alias for aligned_alloc, for any old libraries that use
+   this alias.  */
+
+void *
+memalign (size_t alignment, size_t size)
+{
+  return aligned_alloc (alignment, size);
+}
+
+/* If HYBRID_MALLOC is defined, we may want to use the system
+   posix_memalign below.  */
+#ifndef HYBRID_MALLOC
+int
+posix_memalign (void **memptr, size_t alignment, size_t size)
+{
+  void *mem;
+
+  if (alignment == 0
+      || alignment % sizeof (void *) != 0
+      || (alignment & (alignment - 1)) != 0)
+    return EINVAL;
+
+  mem = aligned_alloc (alignment, size);
+  if (mem == NULL)
+    return ENOMEM;
+
+  *memptr = mem;
+
+  return 0;
+}
+#endif
+
+/* Allocate memory on a page boundary.
+   Copyright (C) 1991, 92, 93, 94, 96 Free Software Foundation, Inc.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public
+License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+
+   The author may be reached (Email) at the address address@hidden,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+/* Allocate SIZE bytes on a page boundary.  */
+extern void *valloc (size_t);
+
+#if defined _SC_PAGESIZE || !defined HAVE_GETPAGESIZE
+# include "getpagesize.h"
+#elif !defined getpagesize
+extern int getpagesize (void);
+#endif
+
+static size_t pagesize;
+
+void *
+valloc (size_t size)
+{
+  if (pagesize == 0)
+    pagesize = getpagesize ();
+
+  return aligned_alloc (pagesize, size);
+}
+
+#ifdef HYBRID_MALLOC
+#undef malloc
+#undef realloc
+#undef calloc
+#undef aligned_alloc
+#undef free
+
+/* Declare system malloc and friends.  */
+extern void *malloc (size_t size);
+extern void *realloc (void *ptr, size_t size);
+extern void *calloc (size_t nmemb, size_t size);
+extern void free (void *ptr);
+#ifdef HAVE_ALIGNED_ALLOC
+extern void *aligned_alloc (size_t alignment, size_t size);
+#elif defined HAVE_POSIX_MEMALIGN
+extern int posix_memalign (void **memptr, size_t alignment, size_t size);
+#endif
+
+/* See the comments near the beginning of this file for explanations
+   of the following functions. */
+
+void *
+hybrid_malloc (size_t size)
+{
+  if (DUMPED)
+    return malloc (size);
+  return gmalloc (size);
+}
+
+void *
+hybrid_calloc (size_t nmemb, size_t size)
+{
+  if (DUMPED)
+    return calloc (nmemb, size);
+  return gcalloc (nmemb, size);
+}
+
+void
+hybrid_free (void *ptr)
+{
+  if (!DUMPED)
+    gfree (ptr);
+  else if (!ALLOCATED_BEFORE_DUMPING (ptr))
+    free (ptr);
+  /* Otherwise the dumped emacs is trying to free something allocated
+     before dumping; do nothing.  */
+  return;
+}
+
+#if defined HAVE_ALIGNED_ALLOC || defined HAVE_POSIX_MEMALIGN
+void *
+hybrid_aligned_alloc (size_t alignment, size_t size)
+{
+  if (!DUMPED)
+    return galigned_alloc (alignment, size);
+  /* The following is copied from alloc.c */
+#ifdef HAVE_ALIGNED_ALLOC
+  return aligned_alloc (alignment, size);
+#else  /* HAVE_POSIX_MEMALIGN */
+  void *p;
+  return posix_memalign (&p, alignment, size) == 0 ? p : 0;
+#endif
+}
+#endif
+  
+void *
+hybrid_realloc (void *ptr, size_t size)
+{
+  void *result;
+  int type;
+  size_t block, oldsize;
+
+  if (!DUMPED)
+    return grealloc (ptr, size);
+  if (!ALLOCATED_BEFORE_DUMPING (ptr))
+    return realloc (ptr, size);
+
+  /* The dumped emacs is trying to realloc storage allocated before
+   dumping.  We just malloc new space and copy the data.  */
+  if (size == 0 || ptr == NULL)
+    return malloc (size);
+  block = ((char *) ptr - _heapbase) / BLOCKSIZE + 1;
+  type = _heapinfo[block].busy.type;
+  oldsize =
+    type == 0 ? _heapinfo[block].busy.info.size * BLOCKSIZE
+    : (size_t) 1 << type;
+  result = malloc (size);
+  if (result)
+    return memcpy (result, ptr, min (oldsize, size));
+  return result;
+}
+
+#ifdef HYBRID_GET_CURRENT_DIR_NAME
+/* Defined in sysdep.c.  */
+char *gget_current_dir_name (void);
+
+char *
+hybrid_get_current_dir_name (void)
+{
+  if (DUMPED)
+    return get_current_dir_name ();
+  return gget_current_dir_name ();
+}
+#endif
+
+#endif /* HYBRID_MALLOC */
+
+#ifdef GC_MCHECK
+
+/* Standard debugging hooks for `malloc'.
+   Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+   Written May 1989 by Mike Haertel.
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public
+License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+
+   The author may be reached (Email) at the address address@hidden,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+#include <stdio.h>
+
+/* Old hook values.  */
+static void (*old_free_hook) (void *ptr);
+static void *(*old_malloc_hook) (size_t size);
+static void *(*old_realloc_hook) (void *ptr, size_t size);
+
+/* Function to call when something awful happens.  */
+static void (*abortfunc) (enum mcheck_status);
+
+/* Arbitrary magical numbers.  */
+#define MAGICWORD      (SIZE_MAX / 11 ^ SIZE_MAX / 13 << 3)
+#define MAGICFREE      (SIZE_MAX / 17 ^ SIZE_MAX / 19 << 4)
+#define MAGICBYTE      ((char) 0xd7)
+#define MALLOCFLOOD    ((char) 0x93)
+#define FREEFLOOD      ((char) 0x95)
+
+struct hdr
+  {
+    size_t size;       /* Exact size requested by user.  */
+    size_t magic;      /* Magic number to check header integrity.  */
+  };
+
+static enum mcheck_status
+checkhdr (const struct hdr *hdr)
+{
+  enum mcheck_status status;
+  switch (hdr->magic)
+    {
+    default:
+      status = MCHECK_HEAD;
+      break;
+    case MAGICFREE:
+      status = MCHECK_FREE;
+      break;
+    case MAGICWORD:
+      if (((char *) &hdr[1])[hdr->size] != MAGICBYTE)
+       status = MCHECK_TAIL;
+      else
+       status = MCHECK_OK;
+      break;
+    }
+  if (status != MCHECK_OK)
+    (*abortfunc) (status);
+  return status;
+}
+
+static void
+freehook (void *ptr)
+{
+  struct hdr *hdr;
+
+  if (ptr)
+    {
+      struct alignlist *l;
+
+      /* If the block was allocated by aligned_alloc, its real pointer
+        to free is recorded in _aligned_blocks; find that.  */
+      PROTECT_MALLOC_STATE (0);
+      LOCK_ALIGNED_BLOCKS ();
+      for (l = _aligned_blocks; l != NULL; l = l->next)
+       if (l->aligned == ptr)
+         {
+           l->aligned = NULL;  /* Mark the slot in the list as free.  */
+           ptr = l->exact;
+           break;
+         }
+      UNLOCK_ALIGNED_BLOCKS ();
+      PROTECT_MALLOC_STATE (1);
+
+      hdr = ((struct hdr *) ptr) - 1;
+      checkhdr (hdr);
+      hdr->magic = MAGICFREE;
+      memset (ptr, FREEFLOOD, hdr->size);
+    }
+  else
+    hdr = NULL;
+
+  __free_hook = old_free_hook;
+  free (hdr);
+  __free_hook = freehook;
+}
+
+static void *
+mallochook (size_t size)
+{
+  struct hdr *hdr;
+
+  __malloc_hook = old_malloc_hook;
+  hdr = malloc (sizeof *hdr + size + 1);
+  __malloc_hook = mallochook;
+  if (hdr == NULL)
+    return NULL;
+
+  hdr->size = size;
+  hdr->magic = MAGICWORD;
+  ((char *) &hdr[1])[size] = MAGICBYTE;
+  return memset (hdr + 1, MALLOCFLOOD, size);
+}
+
+static void *
+reallochook (void *ptr, size_t size)
+{
+  struct hdr *hdr = NULL;
+  size_t osize = 0;
+
+  if (ptr)
+    {
+      hdr = ((struct hdr *) ptr) - 1;
+      osize = hdr->size;
+
+      checkhdr (hdr);
+      if (size < osize)
+       memset ((char *) ptr + size, FREEFLOOD, osize - size);
+    }
+
+  __free_hook = old_free_hook;
+  __malloc_hook = old_malloc_hook;
+  __realloc_hook = old_realloc_hook;
+  hdr = realloc (hdr, sizeof *hdr + size + 1);
+  __free_hook = freehook;
+  __malloc_hook = mallochook;
+  __realloc_hook = reallochook;
+  if (hdr == NULL)
+    return NULL;
+
+  hdr->size = size;
+  hdr->magic = MAGICWORD;
+  ((char *) &hdr[1])[size] = MAGICBYTE;
+  if (size > osize)
+    memset ((char *) (hdr + 1) + osize, MALLOCFLOOD, size - osize);
+  return hdr + 1;
+}
+
+static void
+mabort (enum mcheck_status status)
+{
+  const char *msg;
+  switch (status)
+    {
+    case MCHECK_OK:
+      msg = "memory is consistent, library is buggy";
+      break;
+    case MCHECK_HEAD:
+      msg = "memory clobbered before allocated block";
+      break;
+    case MCHECK_TAIL:
+      msg = "memory clobbered past end of allocated block";
+      break;
+    case MCHECK_FREE:
+      msg = "block freed twice";
+      break;
+    default:
+      msg = "bogus mcheck_status, library is buggy";
+      break;
+    }
+#ifdef __GNU_LIBRARY__
+  __libc_fatal (msg);
+#else
+  fprintf (stderr, "mcheck: %s\n", msg);
+  fflush (stderr);
+# ifdef emacs
+  emacs_abort ();
+# else
+  abort ();
+# endif
+#endif
+}
+
+static int mcheck_used = 0;
+
+int
+mcheck (void (*func) (enum mcheck_status))
+{
+  abortfunc = (func != NULL) ? func : &mabort;
+
+  /* These hooks may not be safely inserted if malloc is already in use.  */
+  if (!__malloc_initialized && !mcheck_used)
+    {
+      old_free_hook = __free_hook;
+      __free_hook = freehook;
+      old_malloc_hook = __malloc_hook;
+      __malloc_hook = mallochook;
+      old_realloc_hook = __realloc_hook;
+      __realloc_hook = reallochook;
+      mcheck_used = 1;
+    }
+
+  return mcheck_used ? 0 : -1;
+}
+
+enum mcheck_status
+mprobe (void *ptr)
+{
+  return mcheck_used ? checkhdr (ptr) : MCHECK_DISABLED;
+}
+
+#endif /* GC_MCHECK */
diff --git a/test/etags/c-src/emacs/src/keyboard.c 
b/test/etags/c-src/emacs/src/keyboard.c
new file mode 100644
index 0000000..77f7fb9
--- /dev/null
+++ b/test/etags/c-src/emacs/src/keyboard.c
@@ -0,0 +1,11960 @@
+/* Keyboard and mouse input; editor command loop.
+
+Copyright (C) 1985-1989, 1993-1997, 1999-2015 Free Software Foundation,
+Inc.
+
+This file is part of GNU Emacs.
+
+GNU Emacs is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include <config.h>
+
+#include "sysstdio.h"
+#include <sys/stat.h>
+
+#include "lisp.h"
+#include "termchar.h"
+#include "termopts.h"
+#include "frame.h"
+#include "termhooks.h"
+#include "macros.h"
+#include "keyboard.h"
+#include "window.h"
+#include "commands.h"
+#include "character.h"
+#include "buffer.h"
+#include "disptab.h"
+#include "dispextern.h"
+#include "syntax.h"
+#include "intervals.h"
+#include "keymap.h"
+#include "blockinput.h"
+#include "puresize.h"
+#include "systime.h"
+#include "atimer.h"
+#include "process.h"
+#include <errno.h>
+
+#ifdef HAVE_PTHREAD
+#include <pthread.h>
+#endif
+#ifdef MSDOS
+#include "msdos.h"
+#include <time.h>
+#else /* not MSDOS */
+#include <sys/ioctl.h>
+#endif /* not MSDOS */
+
+#if defined USABLE_FIONREAD && defined USG5_4
+# include <sys/filio.h>
+#endif
+
+#include "syssignal.h"
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#ifdef HAVE_WINDOW_SYSTEM
+#include TERM_HEADER
+#endif /* HAVE_WINDOW_SYSTEM */
+
+/* Variables for blockinput.h:  */
+
+/* Positive if interrupt input is blocked right now.  */
+volatile int interrupt_input_blocked;
+
+/* True means an input interrupt or alarm signal has arrived.
+   The QUIT macro checks this.  */
+volatile bool pending_signals;
+
+#define KBD_BUFFER_SIZE 4096
+
+KBOARD *initial_kboard;
+KBOARD *current_kboard;
+static KBOARD *all_kboards;
+
+/* True in the single-kboard state, false in the any-kboard state.  */
+static bool single_kboard;
+
+#define NUM_RECENT_KEYS (300)
+
+/* Index for storing next element into recent_keys.  */
+static int recent_keys_index;
+
+/* Total number of elements stored into recent_keys.  */
+static int total_keys;
+
+/* This vector holds the last NUM_RECENT_KEYS keystrokes.  */
+static Lisp_Object recent_keys;
+
+/* Vector holding the key sequence that invoked the current command.
+   It is reused for each command, and it may be longer than the current
+   sequence; this_command_key_count indicates how many elements
+   actually mean something.
+   It's easier to staticpro a single Lisp_Object than an array.  */
+Lisp_Object this_command_keys;
+ptrdiff_t this_command_key_count;
+
+/* True after calling Freset_this_command_lengths.
+   Usually it is false.  */
+static bool this_command_key_count_reset;
+
+/* This vector is used as a buffer to record the events that were actually read
+   by read_key_sequence.  */
+static Lisp_Object raw_keybuf;
+static int raw_keybuf_count;
+
+#define GROW_RAW_KEYBUF                                                        
\
+ if (raw_keybuf_count == ASIZE (raw_keybuf))                           \
+   raw_keybuf = larger_vector (raw_keybuf, 1, -1)
+
+/* Number of elements of this_command_keys
+   that precede this key sequence.  */
+static ptrdiff_t this_single_command_key_start;
+
+/* Record values of this_command_key_count and echo_length ()
+   before this command was read.  */
+static ptrdiff_t before_command_key_count;
+static ptrdiff_t before_command_echo_length;
+
+#ifdef HAVE_STACK_OVERFLOW_HANDLING
+
+/* For longjmp to recover from C stack overflow.  */
+sigjmp_buf return_to_command_loop;
+
+/* Message displayed by Vtop_level when recovering from C stack overflow.  */
+static Lisp_Object recover_top_level_message;
+
+#endif /* HAVE_STACK_OVERFLOW_HANDLING */
+
+/* Message normally displayed by Vtop_level.  */
+static Lisp_Object regular_top_level_message;
+
+/* For longjmp to where kbd input is being done.  */
+
+static sys_jmp_buf getcjmp;
+
+/* True while doing kbd input.  */
+bool waiting_for_input;
+
+/* True while displaying for echoing.   Delays C-g throwing.  */
+
+static bool echoing;
+
+/* Non-null means we can start echoing at the next input pause even
+   though there is something in the echo area.  */
+
+static struct kboard *ok_to_echo_at_next_pause;
+
+/* The kboard last echoing, or null for none.  Reset to 0 in
+   cancel_echoing.  If non-null, and a current echo area message
+   exists, and echo_message_buffer is eq to the current message
+   buffer, we know that the message comes from echo_kboard.  */
+
+struct kboard *echo_kboard;
+
+/* The buffer used for echoing.  Set in echo_now, reset in
+   cancel_echoing.  */
+
+Lisp_Object echo_message_buffer;
+
+/* True means C-g should cause immediate error-signal.  */
+bool immediate_quit;
+
+/* Character that causes a quit.  Normally C-g.
+
+   If we are running on an ordinary terminal, this must be an ordinary
+   ASCII char, since we want to make it our interrupt character.
+
+   If we are not running on an ordinary terminal, it still needs to be
+   an ordinary ASCII char.  This character needs to be recognized in
+   the input interrupt handler.  At this point, the keystroke is
+   represented as a struct input_event, while the desired quit
+   character is specified as a lispy event.  The mapping from struct
+   input_events to lispy events cannot run in an interrupt handler,
+   and the reverse mapping is difficult for anything but ASCII
+   keystrokes.
+
+   FOR THESE ELABORATE AND UNSATISFYING REASONS, quit_char must be an
+   ASCII character.  */
+int quit_char;
+
+/* Current depth in recursive edits.  */
+EMACS_INT command_loop_level;
+
+/* If not Qnil, this is a switch-frame event which we decided to put
+   off until the end of a key sequence.  This should be read as the
+   next command input, after any unread_command_events.
+
+   read_key_sequence uses this to delay switch-frame events until the
+   end of the key sequence; Fread_char uses it to put off switch-frame
+   events until a non-ASCII event is acceptable as input.  */
+Lisp_Object unread_switch_frame;
+
+/* Last size recorded for a current buffer which is not a minibuffer.  */
+static ptrdiff_t last_non_minibuf_size;
+
+/* Total number of times read_char has returned, modulo UINTMAX_MAX + 1.  */
+uintmax_t num_input_events;
+
+/* Value of num_nonmacro_input_events as of last auto save.  */
+
+static EMACS_INT last_auto_save;
+
+/* The value of point when the last command was started.  */
+static ptrdiff_t last_point_position;
+
+/* The frame in which the last input event occurred, or Qmacro if the
+   last event came from a macro.  We use this to determine when to
+   generate switch-frame events.  This may be cleared by functions
+   like Fselect_frame, to make sure that a switch-frame event is
+   generated by the next character.
+
+   FIXME: This is modified by a signal handler so it should be volatile.
+   It's exported to Lisp, though, so it can't simply be marked
+   'volatile' here.  */
+Lisp_Object internal_last_event_frame;
+
+/* `read_key_sequence' stores here the command definition of the
+   key sequence that it reads.  */
+static Lisp_Object read_key_sequence_cmd;
+static Lisp_Object read_key_sequence_remapped;
+
+/* File in which we write all commands we read.  */
+static FILE *dribble;
+
+/* True if input is available.  */
+bool input_pending;
+
+/* True if more input was available last time we read an event.
+
+   Since redisplay can take a significant amount of time and is not
+   indispensable to perform the user's commands, when input arrives
+   "too fast", Emacs skips redisplay.  More specifically, if the next
+   command has already been input when we finish the previous command,
+   we skip the intermediate redisplay.
+
+   This is useful to try and make sure Emacs keeps up with fast input
+   rates, such as auto-repeating keys.  But in some cases, this proves
+   too conservative: we may end up disabling redisplay for the whole
+   duration of a key repetition, even though we could afford to
+   redisplay every once in a while.
+
+   So we "sample" the input_pending flag before running a command and
+   use *that* value after running the command to decide whether to
+   skip redisplay or not.  This way, we only skip redisplay if we
+   really can't keep up with the repeat rate.
+
+   This only makes a difference if the next input arrives while running the
+   command, which is very unlikely if the command is executed quickly.
+   IOW this tends to avoid skipping redisplay after a long running command
+   (which is a case where skipping redisplay is not very useful since the
+   redisplay time is small compared to the time it took to run the command).
+
+   A typical use case is when scrolling.  Scrolling time can be split into:
+   - Time to do jit-lock on the newly displayed portion of buffer.
+   - Time to run the actual scroll command.
+   - Time to perform the redisplay.
+   Jit-lock can happen either during the command or during the redisplay.
+   In the most painful cases, the jit-lock time is the one that dominates.
+   Also jit-lock can be tweaked (via jit-lock-defer) to delay its job, at the
+   cost of temporary inaccuracy in display and scrolling.
+   So without input_was_pending, what typically happens is the following:
+   - when the command starts, there's no pending input (yet).
+   - the scroll command triggers jit-lock.
+   - during the long jit-lock time the next input arrives.
+   - at the end of the command, we check input_pending and hence decide to
+     skip redisplay.
+   - we read the next input and start over.
+   End result: all the hard work of jit-locking is "wasted" since redisplay
+   doesn't actually happens (at least not before the input rate slows down).
+   With input_was_pending redisplay is still skipped if Emacs can't keep up
+   with the input rate, but if it can keep up just enough that there's no
+   input_pending when we begin the command, then redisplay is not skipped
+   which results in better feedback to the user.  */
+static bool input_was_pending;
+
+/* Circular buffer for pre-read keyboard input.  */
+
+static struct input_event kbd_buffer[KBD_BUFFER_SIZE];
+
+/* Pointer to next available character in kbd_buffer.
+   If kbd_fetch_ptr == kbd_store_ptr, the buffer is empty.
+   This may be kbd_buffer + KBD_BUFFER_SIZE, meaning that the
+   next available char is in kbd_buffer[0].  */
+static struct input_event *kbd_fetch_ptr;
+
+/* Pointer to next place to store character in kbd_buffer.  This
+   may be kbd_buffer + KBD_BUFFER_SIZE, meaning that the next
+   character should go in kbd_buffer[0].  */
+static struct input_event * volatile kbd_store_ptr;
+
+/* The above pair of variables forms a "queue empty" flag.  When we
+   enqueue a non-hook event, we increment kbd_store_ptr.  When we
+   dequeue a non-hook event, we increment kbd_fetch_ptr.  We say that
+   there is input available if the two pointers are not equal.
+
+   Why not just have a flag set and cleared by the enqueuing and
+   dequeuing functions?  Such a flag could be screwed up by interrupts
+   at inopportune times.  */
+
+static void recursive_edit_unwind (Lisp_Object buffer);
+static Lisp_Object command_loop (void);
+
+static void echo_now (void);
+static ptrdiff_t echo_length (void);
+
+/* Incremented whenever a timer is run.  */
+unsigned timers_run;
+
+/* Address (if not 0) of struct timespec to zero out if a SIGIO interrupt
+   happens.  */
+struct timespec *input_available_clear_time;
+
+/* True means use SIGIO interrupts; false means use CBREAK mode.
+   Default is true if INTERRUPT_INPUT is defined.  */
+bool interrupt_input;
+
+/* Nonzero while interrupts are temporarily deferred during redisplay.  */
+bool interrupts_deferred;
+
+/* The time when Emacs started being idle.  */
+
+static struct timespec timer_idleness_start_time;
+
+/* After Emacs stops being idle, this saves the last value
+   of timer_idleness_start_time from when it was idle.  */
+
+static struct timespec timer_last_idleness_start_time;
+
+
+/* Global variable declarations.  */
+
+/* Flags for readable_events.  */
+#define READABLE_EVENTS_DO_TIMERS_NOW          (1 << 0)
+#define READABLE_EVENTS_FILTER_EVENTS          (1 << 1)
+#define READABLE_EVENTS_IGNORE_SQUEEZABLES     (1 << 2)
+
+/* Function for init_keyboard to call with no args (if nonzero).  */
+static void (*keyboard_init_hook) (void);
+
+static bool get_input_pending (int);
+static bool readable_events (int);
+static Lisp_Object read_char_x_menu_prompt (Lisp_Object,
+                                            Lisp_Object, bool *);
+static Lisp_Object read_char_minibuf_menu_prompt (int, Lisp_Object);
+static Lisp_Object make_lispy_event (struct input_event *);
+static Lisp_Object make_lispy_movement (struct frame *, Lisp_Object,
+                                        enum scroll_bar_part,
+                                        Lisp_Object, Lisp_Object,
+                                       Time);
+static Lisp_Object modify_event_symbol (ptrdiff_t, int, Lisp_Object,
+                                        Lisp_Object, const char *const *,
+                                        Lisp_Object *, ptrdiff_t);
+static Lisp_Object make_lispy_switch_frame (Lisp_Object);
+static Lisp_Object make_lispy_focus_in (Lisp_Object);
+#ifdef HAVE_WINDOW_SYSTEM
+static Lisp_Object make_lispy_focus_out (Lisp_Object);
+#endif /* HAVE_WINDOW_SYSTEM */
+static bool help_char_p (Lisp_Object);
+static void save_getcjmp (sys_jmp_buf);
+static void restore_getcjmp (sys_jmp_buf);
+static Lisp_Object apply_modifiers (int, Lisp_Object);
+static void clear_event (struct input_event *);
+static void restore_kboard_configuration (int);
+#ifdef USABLE_SIGIO
+static void deliver_input_available_signal (int signo);
+#endif
+static void handle_interrupt (bool);
+static _Noreturn void quit_throw_to_read_char (bool);
+static void process_special_events (void);
+static void timer_start_idle (void);
+static void timer_stop_idle (void);
+static void timer_resume_idle (void);
+static void deliver_user_signal (int);
+static char *find_user_signal_name (int);
+static void store_user_signal_events (void);
+
+/* These setters are used only in this file, so they can be private.  */
+static void
+kset_echo_string (struct kboard *kb, Lisp_Object val)
+{
+  kb->echo_string_ = val;
+}
+static void
+kset_kbd_queue (struct kboard *kb, Lisp_Object val)
+{
+  kb->kbd_queue_ = val;
+}
+static void
+kset_keyboard_translate_table (struct kboard *kb, Lisp_Object val)
+{
+  kb->Vkeyboard_translate_table_ = val;
+}
+static void
+kset_last_prefix_arg (struct kboard *kb, Lisp_Object val)
+{
+  kb->Vlast_prefix_arg_ = val;
+}
+static void
+kset_last_repeatable_command (struct kboard *kb, Lisp_Object val)
+{
+  kb->Vlast_repeatable_command_ = val;
+}
+static void
+kset_local_function_key_map (struct kboard *kb, Lisp_Object val)
+{
+  kb->Vlocal_function_key_map_ = val;
+}
+static void
+kset_overriding_terminal_local_map (struct kboard *kb, Lisp_Object val)
+{
+  kb->Voverriding_terminal_local_map_ = val;
+}
+static void
+kset_real_last_command (struct kboard *kb, Lisp_Object val)
+{
+  kb->Vreal_last_command_ = val;
+}
+static void
+kset_system_key_syms (struct kboard *kb, Lisp_Object val)
+{
+  kb->system_key_syms_ = val;
+}
+
+
+/* Add C to the echo string, without echoing it immediately.  C can be
+   a character, which is pretty-printed, or a symbol, whose name is
+   printed.  */
+
+static void
+echo_add_key (Lisp_Object c)
+{
+  char initbuf[KEY_DESCRIPTION_SIZE + 100];
+  ptrdiff_t size = sizeof initbuf;
+  char *buffer = initbuf;
+  char *ptr = buffer;
+  Lisp_Object echo_string;
+  USE_SAFE_ALLOCA;
+
+  echo_string = KVAR (current_kboard, echo_string);
+
+  /* If someone has passed us a composite event, use its head symbol.  */
+  c = EVENT_HEAD (c);
+
+  if (INTEGERP (c))
+    ptr = push_key_description (XINT (c), ptr);
+  else if (SYMBOLP (c))
+    {
+      Lisp_Object name = SYMBOL_NAME (c);
+      ptrdiff_t nbytes = SBYTES (name);
+
+      if (size - (ptr - buffer) < nbytes)
+       {
+         ptrdiff_t offset = ptr - buffer;
+         size = max (2 * size, size + nbytes);
+         buffer = SAFE_ALLOCA (size);
+         ptr = buffer + offset;
+       }
+
+      ptr += copy_text (SDATA (name), (unsigned char *) ptr, nbytes,
+                       STRING_MULTIBYTE (name), 1);
+    }
+
+  if ((NILP (echo_string) || SCHARS (echo_string) == 0)
+      && help_char_p (c))
+    {
+      static const char text[] = " (Type ? for further options)";
+      int len = sizeof text - 1;
+
+      if (size - (ptr - buffer) < len)
+       {
+         ptrdiff_t offset = ptr - buffer;
+         size += len;
+         buffer = SAFE_ALLOCA (size);
+         ptr = buffer + offset;
+       }
+
+      memcpy (ptr, text, len);
+      ptr += len;
+    }
+
+  /* Replace a dash from echo_dash with a space, otherwise add a space
+     at the end as a separator between keys.  */
+  AUTO_STRING (space, " ");
+  if (STRINGP (echo_string) && SCHARS (echo_string) > 1)
+    {
+      Lisp_Object last_char, prev_char, idx;
+
+      idx = make_number (SCHARS (echo_string) - 2);
+      prev_char = Faref (echo_string, idx);
+
+      idx = make_number (SCHARS (echo_string) - 1);
+      last_char = Faref (echo_string, idx);
+
+      /* We test PREV_CHAR to make sure this isn't the echoing of a
+        minus-sign.  */
+      if (XINT (last_char) == '-' && XINT (prev_char) != ' ')
+       Faset (echo_string, idx, make_number (' '));
+      else
+       echo_string = concat2 (echo_string, space);
+    }
+  else if (STRINGP (echo_string) && SCHARS (echo_string) > 0)
+    echo_string = concat2 (echo_string, space);
+
+  kset_echo_string
+    (current_kboard,
+     concat2 (echo_string, make_string (buffer, ptr - buffer)));
+  SAFE_FREE ();
+}
+
+/* Add C to the echo string, if echoing is going on.  C can be a
+   character or a symbol.  */
+
+static void
+echo_char (Lisp_Object c)
+{
+  if (current_kboard->immediate_echo)
+    {
+      echo_add_key (c);
+      echo_now ();
+    }
+}
+
+/* Temporarily add a dash to the end of the echo string if it's not
+   empty, so that it serves as a mini-prompt for the very next
+   character.  */
+
+static void
+echo_dash (void)
+{
+  /* Do nothing if not echoing at all.  */
+  if (NILP (KVAR (current_kboard, echo_string)))
+    return;
+
+  if (this_command_key_count == 0)
+    return;
+
+  if (!current_kboard->immediate_echo
+      && SCHARS (KVAR (current_kboard, echo_string)) == 0)
+    return;
+
+  /* Do nothing if we just printed a prompt.  */
+  if (current_kboard->echo_after_prompt
+      == SCHARS (KVAR (current_kboard, echo_string)))
+    return;
+
+  /* Do nothing if we have already put a dash at the end.  */
+  if (SCHARS (KVAR (current_kboard, echo_string)) > 1)
+    {
+      Lisp_Object last_char, prev_char, idx;
+
+      idx = make_number (SCHARS (KVAR (current_kboard, echo_string)) - 2);
+      prev_char = Faref (KVAR (current_kboard, echo_string), idx);
+
+      idx = make_number (SCHARS (KVAR (current_kboard, echo_string)) - 1);
+      last_char = Faref (KVAR (current_kboard, echo_string), idx);
+
+      if (XINT (last_char) == '-' && XINT (prev_char) != ' ')
+       return;
+    }
+
+  /* Put a dash at the end of the buffer temporarily,
+     but make it go away when the next character is added.  */
+  AUTO_STRING (dash, "-");
+  kset_echo_string (current_kboard,
+                   concat2 (KVAR (current_kboard, echo_string), dash));
+  echo_now ();
+}
+
+/* Display the current echo string, and begin echoing if not already
+   doing so.  */
+
+static void
+echo_now (void)
+{
+  if (!current_kboard->immediate_echo)
+    {
+      ptrdiff_t i;
+      current_kboard->immediate_echo = 1;
+
+      for (i = 0; i < this_command_key_count; i++)
+       {
+         Lisp_Object c;
+
+         /* Set before_command_echo_length to the value that would
+            have been saved before the start of this subcommand in
+            command_loop_1, if we had already been echoing then.  */
+         if (i == this_single_command_key_start)
+           before_command_echo_length = echo_length ();
+
+         c = AREF (this_command_keys, i);
+         if (! (EVENT_HAS_PARAMETERS (c)
+                && EQ (EVENT_HEAD_KIND (EVENT_HEAD (c)), Qmouse_movement)))
+           echo_char (c);
+       }
+
+      /* Set before_command_echo_length to the value that would
+        have been saved before the start of this subcommand in
+        command_loop_1, if we had already been echoing then.  */
+      if (this_command_key_count == this_single_command_key_start)
+       before_command_echo_length = echo_length ();
+
+      /* Put a dash at the end to invite the user to type more.  */
+      echo_dash ();
+    }
+
+  echoing = 1;
+  /* FIXME: Use call (Qmessage) so it can be advised (e.g. emacspeak).  */
+  message3_nolog (KVAR (current_kboard, echo_string));
+  echoing = 0;
+
+  /* Record in what buffer we echoed, and from which kboard.  */
+  echo_message_buffer = echo_area_buffer[0];
+  echo_kboard = current_kboard;
+
+  if (waiting_for_input && !NILP (Vquit_flag))
+    quit_throw_to_read_char (0);
+}
+
+/* Turn off echoing, for the start of a new command.  */
+
+void
+cancel_echoing (void)
+{
+  current_kboard->immediate_echo = 0;
+  current_kboard->echo_after_prompt = -1;
+  kset_echo_string (current_kboard, Qnil);
+  ok_to_echo_at_next_pause = NULL;
+  echo_kboard = NULL;
+  echo_message_buffer = Qnil;
+}
+
+/* Return the length of the current echo string.  */
+
+static ptrdiff_t
+echo_length (void)
+{
+  return (STRINGP (KVAR (current_kboard, echo_string))
+         ? SCHARS (KVAR (current_kboard, echo_string))
+         : 0);
+}
+
+/* Truncate the current echo message to its first LEN chars.
+   This and echo_char get used by read_key_sequence when the user
+   switches frames while entering a key sequence.  */
+
+static void
+echo_truncate (ptrdiff_t nchars)
+{
+  if (STRINGP (KVAR (current_kboard, echo_string)))
+    kset_echo_string (current_kboard,
+                     Fsubstring (KVAR (current_kboard, echo_string),
+                                 make_number (0), make_number (nchars)));
+  truncate_echo_area (nchars);
+}
+
+
+/* Functions for manipulating this_command_keys.  */
+static void
+add_command_key (Lisp_Object key)
+{
+#if 0 /* Not needed after we made Freset_this_command_lengths
+        do the job immediately.  */
+  /* If reset-this-command-length was called recently, obey it now.
+     See the doc string of that function for an explanation of why.  */
+  if (before_command_restore_flag)
+    {
+      this_command_key_count = before_command_key_count_1;
+      if (this_command_key_count < this_single_command_key_start)
+       this_single_command_key_start = this_command_key_count;
+      echo_truncate (before_command_echo_length_1);
+      before_command_restore_flag = 0;
+    }
+#endif
+
+  if (this_command_key_count >= ASIZE (this_command_keys))
+    this_command_keys = larger_vector (this_command_keys, 1, -1);
+
+  ASET (this_command_keys, this_command_key_count, key);
+  ++this_command_key_count;
+}
+
+
+Lisp_Object
+recursive_edit_1 (void)
+{
+  ptrdiff_t count = SPECPDL_INDEX ();
+  Lisp_Object val;
+
+  if (command_loop_level > 0)
+    {
+      specbind (Qstandard_output, Qt);
+      specbind (Qstandard_input, Qt);
+    }
+
+#ifdef HAVE_WINDOW_SYSTEM
+  /* The command loop has started an hourglass timer, so we have to
+     cancel it here, otherwise it will fire because the recursive edit
+     can take some time.  Do not check for display_hourglass_p here,
+     because it could already be nil.  */
+    cancel_hourglass ();
+#endif
+
+  /* This function may have been called from a debugger called from
+     within redisplay, for instance by Edebugging a function called
+     from fontification-functions.  We want to allow redisplay in
+     the debugging session.
+
+     The recursive edit is left with a `(throw exit ...)'.  The `exit'
+     tag is not caught anywhere in redisplay, i.e. when we leave the
+     recursive edit, the original redisplay leading to the recursive
+     edit will be unwound.  The outcome should therefore be safe.  */
+  specbind (Qinhibit_redisplay, Qnil);
+  redisplaying_p = 0;
+
+  val = command_loop ();
+  if (EQ (val, Qt))
+    Fsignal (Qquit, Qnil);
+  /* Handle throw from read_minibuf when using minibuffer
+     while it's active but we're in another window.  */
+  if (STRINGP (val))
+    xsignal1 (Qerror, val);
+
+  return unbind_to (count, Qnil);
+}
+
+/* When an auto-save happens, record the "time", and don't do again soon.  */
+
+void
+record_auto_save (void)
+{
+  last_auto_save = num_nonmacro_input_events;
+}
+
+/* Make an auto save happen as soon as possible at command level.  */
+
+#ifdef SIGDANGER
+void
+force_auto_save_soon (void)
+{
+  last_auto_save = - auto_save_interval - 1;
+
+  record_asynch_buffer_change ();
+}
+#endif
+
+DEFUN ("recursive-edit", Frecursive_edit, Srecursive_edit, 0, 0, "",
+       doc: /* Invoke the editor command loop recursively.
+To get out of the recursive edit, a command can throw to `exit' -- for
+instance `(throw 'exit nil)'.
+If you throw a value other than t, `recursive-edit' returns normally
+to the function that called it.  Throwing a t value causes
+`recursive-edit' to quit, so that control returns to the command loop
+one level up.
+
+This function is called by the editor initialization to begin editing.  */)
+  (void)
+{
+  ptrdiff_t count = SPECPDL_INDEX ();
+  Lisp_Object buffer;
+
+  /* If we enter while input is blocked, don't lock up here.
+     This may happen through the debugger during redisplay.  */
+  if (input_blocked_p ())
+    return Qnil;
+
+  if (command_loop_level >= 0
+      && current_buffer != XBUFFER (XWINDOW (selected_window)->contents))
+    buffer = Fcurrent_buffer ();
+  else
+    buffer = Qnil;
+
+  /* Don't do anything interesting between the increment and the
+     record_unwind_protect!  Otherwise, we could get distracted and
+     never decrement the counter again.  */
+  command_loop_level++;
+  update_mode_lines = 17;
+  record_unwind_protect (recursive_edit_unwind, buffer);
+
+  /* If we leave recursive_edit_1 below with a `throw' for instance,
+     like it is done in the splash screen display, we have to
+     make sure that we restore single_kboard as command_loop_1
+     would have done if it were left normally.  */
+  if (command_loop_level > 0)
+    temporarily_switch_to_single_kboard (SELECTED_FRAME ());
+
+  recursive_edit_1 ();
+  return unbind_to (count, Qnil);
+}
+
+void
+recursive_edit_unwind (Lisp_Object buffer)
+{
+  if (BUFFERP (buffer))
+    Fset_buffer (buffer);
+
+  command_loop_level--;
+  update_mode_lines = 18;
+}
+
+
+#if 0  /* These two functions are now replaced with
+          temporarily_switch_to_single_kboard.  */
+static void
+any_kboard_state ()
+{
+#if 0 /* Theory: if there's anything in Vunread_command_events,
+        it will right away be read by read_key_sequence,
+        and then if we do switch KBOARDS, it will go into the side
+        queue then.  So we don't need to do anything special here -- rms.  */
+  if (CONSP (Vunread_command_events))
+    {
+      current_kboard->kbd_queue
+       = nconc2 (Vunread_command_events, current_kboard->kbd_queue);
+      current_kboard->kbd_queue_has_data = 1;
+    }
+  Vunread_command_events = Qnil;
+#endif
+  single_kboard = 0;
+}
+
+/* Switch to the single-kboard state, making current_kboard
+   the only KBOARD from which further input is accepted.  */
+
+void
+single_kboard_state ()
+{
+  single_kboard = 1;
+}
+#endif
+
+/* If we're in single_kboard state for kboard KBOARD,
+   get out of it.  */
+
+void
+not_single_kboard_state (KBOARD *kboard)
+{
+  if (kboard == current_kboard)
+    single_kboard = 0;
+}
+
+/* Maintain a stack of kboards, so other parts of Emacs
+   can switch temporarily to the kboard of a given frame
+   and then revert to the previous status.  */
+
+struct kboard_stack
+{
+  KBOARD *kboard;
+  struct kboard_stack *next;
+};
+
+static struct kboard_stack *kboard_stack;
+
+void
+push_kboard (struct kboard *k)
+{
+  struct kboard_stack *p = xmalloc (sizeof *p);
+
+  p->next = kboard_stack;
+  p->kboard = current_kboard;
+  kboard_stack = p;
+
+  current_kboard = k;
+}
+
+void
+pop_kboard (void)
+{
+  struct terminal *t;
+  struct kboard_stack *p = kboard_stack;
+  bool found = 0;
+  for (t = terminal_list; t; t = t->next_terminal)
+    {
+      if (t->kboard == p->kboard)
+        {
+          current_kboard = p->kboard;
+          found = 1;
+          break;
+        }
+    }
+  if (!found)
+    {
+      /* The terminal we remembered has been deleted.  */
+      current_kboard = FRAME_KBOARD (SELECTED_FRAME ());
+      single_kboard = 0;
+    }
+  kboard_stack = p->next;
+  xfree (p);
+}
+
+/* Switch to single_kboard mode, making current_kboard the only KBOARD
+  from which further input is accepted.  If F is non-nil, set its
+  KBOARD as the current keyboard.
+
+  This function uses record_unwind_protect_int to return to the previous
+  state later.
+
+  If Emacs is already in single_kboard mode, and F's keyboard is
+  locked, then this function will throw an error.  */
+
+void
+temporarily_switch_to_single_kboard (struct frame *f)
+{
+  bool was_locked = single_kboard;
+  if (was_locked)
+    {
+      if (f != NULL && FRAME_KBOARD (f) != current_kboard)
+        /* We can not switch keyboards while in single_kboard mode.
+           In rare cases, Lisp code may call `recursive-edit' (or
+           `read-minibuffer' or `y-or-n-p') after it switched to a
+           locked frame.  For example, this is likely to happen
+           when server.el connects to a new terminal while Emacs is in
+           single_kboard mode.  It is best to throw an error instead
+           of presenting the user with a frozen screen.  */
+        error ("Terminal %d is locked, cannot read from it",
+               FRAME_TERMINAL (f)->id);
+      else
+        /* This call is unnecessary, but helps
+           `restore_kboard_configuration' discover if somebody changed
+           `current_kboard' behind our back.  */
+        push_kboard (current_kboard);
+    }
+  else if (f != NULL)
+    current_kboard = FRAME_KBOARD (f);
+  single_kboard = 1;
+  record_unwind_protect_int (restore_kboard_configuration, was_locked);
+}
+
+#if 0 /* This function is not needed anymore.  */
+void
+record_single_kboard_state ()
+{
+  if (single_kboard)
+    push_kboard (current_kboard);
+  record_unwind_protect_int (restore_kboard_configuration, single_kboard);
+}
+#endif
+
+static void
+restore_kboard_configuration (int was_locked)
+{
+  single_kboard = was_locked;
+  if (was_locked)
+    {
+      struct kboard *prev = current_kboard;
+      pop_kboard ();
+      /* The pop should not change the kboard.  */
+      if (single_kboard && current_kboard != prev)
+        emacs_abort ();
+    }
+}
+
+
+/* Handle errors that are not handled at inner levels
+   by printing an error message and returning to the editor command loop.  */
+
+static Lisp_Object
+cmd_error (Lisp_Object data)
+{
+  Lisp_Object old_level, old_length;
+  char macroerror[sizeof "After..kbd macro iterations: "
+                 + INT_STRLEN_BOUND (EMACS_INT)];
+
+#ifdef HAVE_WINDOW_SYSTEM
+  if (display_hourglass_p)
+    cancel_hourglass ();
+#endif
+
+  if (!NILP (executing_kbd_macro))
+    {
+      if (executing_kbd_macro_iterations == 1)
+       sprintf (macroerror, "After 1 kbd macro iteration: ");
+      else
+       sprintf (macroerror, "After %"pI"d kbd macro iterations: ",
+                executing_kbd_macro_iterations);
+    }
+  else
+    *macroerror = 0;
+
+  Vstandard_output = Qt;
+  Vstandard_input = Qt;
+  Vexecuting_kbd_macro = Qnil;
+  executing_kbd_macro = Qnil;
+  kset_prefix_arg (current_kboard, Qnil);
+  kset_last_prefix_arg (current_kboard, Qnil);
+  cancel_echoing ();
+
+  /* Avoid unquittable loop if data contains a circular list.  */
+  old_level = Vprint_level;
+  old_length = Vprint_length;
+  XSETFASTINT (Vprint_level, 10);
+  XSETFASTINT (Vprint_length, 10);
+  cmd_error_internal (data, macroerror);
+  Vprint_level = old_level;
+  Vprint_length = old_length;
+
+  Vquit_flag = Qnil;
+  Vinhibit_quit = Qnil;
+
+  return make_number (0);
+}
+
+/* Take actions on handling an error.  DATA is the data that describes
+   the error.
+
+   CONTEXT is a C-string containing ASCII characters only which
+   describes the context in which the error happened.  If we need to
+   generalize CONTEXT to allow multibyte characters, make it a Lisp
+   string.  */
+
+void
+cmd_error_internal (Lisp_Object data, const char *context)
+{
+  /* The immediate context is not interesting for Quits,
+     since they are asynchronous.  */
+  if (EQ (XCAR (data), Qquit))
+    Vsignaling_function = Qnil;
+
+  Vquit_flag = Qnil;
+  Vinhibit_quit = Qt;
+
+  /* Use user's specified output function if any.  */
+  if (!NILP (Vcommand_error_function))
+    call3 (Vcommand_error_function, data,
+          context ? build_string (context) : empty_unibyte_string,
+          Vsignaling_function);
+
+  Vsignaling_function = Qnil;
+}
+
+DEFUN ("command-error-default-function", Fcommand_error_default_function,
+       Scommand_error_default_function, 3, 3, 0,
+       doc: /* Produce default output for unhandled error message.
+Default value of `command-error-function'.  */)
+  (Lisp_Object data, Lisp_Object context, Lisp_Object signal)
+{
+  struct frame *sf = SELECTED_FRAME ();
+
+  CHECK_STRING (context);
+
+  /* If the window system or terminal frame hasn't been initialized
+     yet, or we're not interactive, write the message to stderr and exit.  */
+  if (!sf->glyphs_initialized_p
+          /* The initial frame is a special non-displaying frame. It
+             will be current in daemon mode when there are no frames
+             to display, and in non-daemon mode before the real frame
+             has finished initializing.  If an error is thrown in the
+             latter case while creating the frame, then the frame
+             will never be displayed, so the safest thing to do is
+             write to stderr and quit.  In daemon mode, there are
+             many other potential errors that do not prevent frames
+             from being created, so continuing as normal is better in
+             that case.  */
+          || (!IS_DAEMON && FRAME_INITIAL_P (sf))
+          || noninteractive)
+    {
+      print_error_message (data, Qexternal_debugging_output,
+                          SSDATA (context), signal);
+      Fterpri (Qexternal_debugging_output, Qnil);
+      Fkill_emacs (make_number (-1));
+    }
+  else
+    {
+      clear_message (1, 0);
+      Fdiscard_input ();
+      message_log_maybe_newline ();
+      bitch_at_user ();
+
+      print_error_message (data, Qt, SSDATA (context), signal);
+    }
+  return Qnil;
+}
+
+static Lisp_Object command_loop_2 (Lisp_Object);
+static Lisp_Object top_level_1 (Lisp_Object);
+
+/* Entry to editor-command-loop.
+   This level has the catches for exiting/returning to editor command loop.
+   It returns nil to exit recursive edit, t to abort it.  */
+
+Lisp_Object
+command_loop (void)
+{
+#ifdef HAVE_STACK_OVERFLOW_HANDLING
+  /* At least on GNU/Linux, saving signal mask is important here.  */
+  if (sigsetjmp (return_to_command_loop, 1) != 0)
+    {
+      /* Comes here from handle_sigsegv, see sysdep.c.  */
+      init_eval ();
+      Vinternal__top_level_message = recover_top_level_message;
+    }
+  else
+    Vinternal__top_level_message = regular_top_level_message;
+#endif /* HAVE_STACK_OVERFLOW_HANDLING */
+  if (command_loop_level > 0 || minibuf_level > 0)
+    {
+      Lisp_Object val;
+      val = internal_catch (Qexit, command_loop_2, Qnil);
+      executing_kbd_macro = Qnil;
+      return val;
+    }
+  else
+    while (1)
+      {
+       internal_catch (Qtop_level, top_level_1, Qnil);
+       internal_catch (Qtop_level, command_loop_2, Qnil);
+       executing_kbd_macro = Qnil;
+
+       /* End of file in -batch run causes exit here.  */
+       if (noninteractive)
+         Fkill_emacs (Qt);
+      }
+}
+
+/* Here we catch errors in execution of commands within the
+   editing loop, and reenter the editing loop.
+   When there is an error, cmd_error runs and returns a non-nil
+   value to us.  A value of nil means that command_loop_1 itself
+   returned due to end of file (or end of kbd macro).  */
+
+static Lisp_Object
+command_loop_2 (Lisp_Object ignore)
+{
+  register Lisp_Object val;
+
+  do
+    val = internal_condition_case (command_loop_1, Qerror, cmd_error);
+  while (!NILP (val));
+
+  return Qnil;
+}
+
+static Lisp_Object
+top_level_2 (void)
+{
+  return Feval (Vtop_level, Qnil);
+}
+
+static Lisp_Object
+top_level_1 (Lisp_Object ignore)
+{
+  /* On entry to the outer level, run the startup file.  */
+  if (!NILP (Vtop_level))
+    internal_condition_case (top_level_2, Qerror, cmd_error);
+  else if (!NILP (Vpurify_flag))
+    message1 ("Bare impure Emacs (standard Lisp code not loaded)");
+  else
+    message1 ("Bare Emacs (standard Lisp code not loaded)");
+  return Qnil;
+}
+
+DEFUN ("top-level", Ftop_level, Stop_level, 0, 0, "",
+       doc: /* Exit all recursive editing levels.
+This also exits all active minibuffers.  */
+       attributes: noreturn)
+  (void)
+{
+#ifdef HAVE_WINDOW_SYSTEM
+  if (display_hourglass_p)
+    cancel_hourglass ();
+#endif
+
+  /* Unblock input if we enter with input blocked.  This may happen if
+     redisplay traps e.g. during tool-bar update with input blocked.  */
+  totally_unblock_input ();
+
+  Fthrow (Qtop_level, Qnil);
+}
+
+static _Noreturn void
+user_error (const char *msg)
+{
+  xsignal1 (Quser_error, build_string (msg));
+}
+
+/* _Noreturn will be added to prototype by make-docfile.  */
+DEFUN ("exit-recursive-edit", Fexit_recursive_edit, Sexit_recursive_edit, 0, 
0, "",
+       doc: /* Exit from the innermost recursive edit or minibuffer.  */
+       attributes: noreturn)
+  (void)
+{
+  if (command_loop_level > 0 || minibuf_level > 0)
+    Fthrow (Qexit, Qnil);
+
+  user_error ("No recursive edit is in progress");
+}
+
+/* _Noreturn will be added to prototype by make-docfile.  */
+DEFUN ("abort-recursive-edit", Fabort_recursive_edit, Sabort_recursive_edit, 
0, 0, "",
+       doc: /* Abort the command that requested this recursive edit or 
minibuffer input.  */
+       attributes: noreturn)
+  (void)
+{
+  if (command_loop_level > 0 || minibuf_level > 0)
+    Fthrow (Qexit, Qt);
+
+  user_error ("No recursive edit is in progress");
+}
+
+/* Restore mouse tracking enablement.  See Ftrack_mouse for the only use
+   of this function.  */
+
+static void
+tracking_off (Lisp_Object old_value)
+{
+  do_mouse_tracking = old_value;
+  if (NILP (old_value))
+    {
+      /* Redisplay may have been preempted because there was input
+        available, and it assumes it will be called again after the
+        input has been processed.  If the only input available was
+        the sort that we have just disabled, then we need to call
+        redisplay.  */
+      if (!readable_events (READABLE_EVENTS_DO_TIMERS_NOW))
+       {
+         redisplay_preserve_echo_area (6);
+         get_input_pending (READABLE_EVENTS_DO_TIMERS_NOW);
+       }
+    }
+}
+
+DEFUN ("internal--track-mouse", Ftrack_mouse, Strack_mouse, 1, 1, 0,
+       doc: /* Call BODYFUN with mouse movement events enabled.  */)
+  (Lisp_Object bodyfun)
+{
+  ptrdiff_t count = SPECPDL_INDEX ();
+  Lisp_Object val;
+
+  record_unwind_protect (tracking_off, do_mouse_tracking);
+
+  do_mouse_tracking = Qt;
+
+  val = call0 (bodyfun);
+  return unbind_to (count, val);
+}
+
+/* If mouse has moved on some frame, return one of those frames.
+
+   Return 0 otherwise.
+
+   If ignore_mouse_drag_p is non-zero, ignore (implicit) mouse movement
+   after resizing the tool-bar window.  */
+
+bool ignore_mouse_drag_p;
+
+static struct frame *
+some_mouse_moved (void)
+{
+  Lisp_Object tail, frame;
+
+  if (ignore_mouse_drag_p)
+    {
+      /* ignore_mouse_drag_p = 0; */
+      return 0;
+    }
+
+  FOR_EACH_FRAME (tail, frame)
+    {
+      if (XFRAME (frame)->mouse_moved)
+       return XFRAME (frame);
+    }
+
+  return 0;
+}
+
+
+/* This is the actual command reading loop,
+   sans error-handling encapsulation.  */
+
+static int read_key_sequence (Lisp_Object *, int, Lisp_Object,
+                              bool, bool, bool, bool);
+static void adjust_point_for_property (ptrdiff_t, bool);
+
+/* The last boundary auto-added to buffer-undo-list.  */
+Lisp_Object last_undo_boundary;
+
+/* FIXME: This is wrong rather than test window-system, we should call
+   a new set-selection, which will then dispatch to x-set-selection, or
+   tty-set-selection, or w32-set-selection, ...  */
+
+Lisp_Object
+command_loop_1 (void)
+{
+  Lisp_Object cmd;
+  Lisp_Object keybuf[30];
+  int i;
+  EMACS_INT prev_modiff = 0;
+  struct buffer *prev_buffer = NULL;
+  bool already_adjusted = 0;
+
+  kset_prefix_arg (current_kboard, Qnil);
+  kset_last_prefix_arg (current_kboard, Qnil);
+  Vdeactivate_mark = Qnil;
+  waiting_for_input = 0;
+  cancel_echoing ();
+
+  this_command_key_count = 0;
+  this_command_key_count_reset = 0;
+  this_single_command_key_start = 0;
+
+  if (NILP (Vmemory_full))
+    {
+      /* Make sure this hook runs after commands that get errors and
+        throw to top level.  */
+      /* Note that the value cell will never directly contain nil
+        if the symbol is a local variable.  */
+      if (!NILP (Vpost_command_hook) && !NILP (Vrun_hooks))
+       safe_run_hooks (Qpost_command_hook);
+
+      /* If displaying a message, resize the echo area window to fit
+        that message's size exactly.  */
+      if (!NILP (echo_area_buffer[0]))
+       resize_echo_area_exactly ();
+
+      /* If there are warnings waiting, process them.  */
+      if (!NILP (Vdelayed_warnings_list))
+        safe_run_hooks (Qdelayed_warnings_hook);
+
+      if (!NILP (Vdeferred_action_list))
+       safe_run_hooks (Qdeferred_action_function);
+    }
+
+  /* Do this after running Vpost_command_hook, for consistency.  */
+  kset_last_command (current_kboard, Vthis_command);
+  kset_real_last_command (current_kboard, Vreal_this_command);
+  if (!CONSP (last_command_event))
+    kset_last_repeatable_command (current_kboard, Vreal_this_command);
+
+  while (1)
+    {
+      if (! FRAME_LIVE_P (XFRAME (selected_frame)))
+       Fkill_emacs (Qnil);
+
+      /* Make sure the current window's buffer is selected.  */
+      set_buffer_internal (XBUFFER (XWINDOW (selected_window)->contents));
+
+      /* Display any malloc warning that just came out.  Use while because
+        displaying one warning can cause another.  */
+
+      while (pending_malloc_warning)
+       display_malloc_warning ();
+
+      Vdeactivate_mark = Qnil;
+
+      /* Don't ignore mouse movements for more than a single command
+        loop.  (This flag is set in xdisp.c whenever the tool bar is
+        resized, because the resize moves text up or down, and would
+        generate false mouse drag events if we don't ignore them.)  */
+      ignore_mouse_drag_p = 0;
+
+      /* If minibuffer on and echo area in use,
+        wait a short time and redraw minibuffer.  */
+
+      if (minibuf_level
+         && !NILP (echo_area_buffer[0])
+         && EQ (minibuf_window, echo_area_window)
+         && NUMBERP (Vminibuffer_message_timeout))
+       {
+         /* Bind inhibit-quit to t so that C-g gets read in
+            rather than quitting back to the minibuffer.  */
+         ptrdiff_t count = SPECPDL_INDEX ();
+         specbind (Qinhibit_quit, Qt);
+
+         sit_for (Vminibuffer_message_timeout, 0, 2);
+
+         /* Clear the echo area.  */
+         message1 (0);
+         safe_run_hooks (Qecho_area_clear_hook);
+
+         unbind_to (count, Qnil);
+
+         /* If a C-g came in before, treat it as input now.  */
+         if (!NILP (Vquit_flag))
+           {
+             Vquit_flag = Qnil;
+             Vunread_command_events = list1 (make_number (quit_char));
+           }
+       }
+
+      /* If it has changed current-menubar from previous value,
+        really recompute the menubar from the value.  */
+      if (! NILP (Vlucid_menu_bar_dirty_flag)
+         && !NILP (Ffboundp (Qrecompute_lucid_menubar)))
+       call0 (Qrecompute_lucid_menubar);
+
+      before_command_key_count = this_command_key_count;
+      before_command_echo_length = echo_length ();
+
+      Vthis_command = Qnil;
+      Vreal_this_command = Qnil;
+      Vthis_original_command = Qnil;
+      Vthis_command_keys_shift_translated = Qnil;
+
+      /* Read next key sequence; i gets its length.  */
+      i = read_key_sequence (keybuf, ARRAYELTS (keybuf),
+                            Qnil, 0, 1, 1, 0);
+
+      /* A filter may have run while we were reading the input.  */
+      if (! FRAME_LIVE_P (XFRAME (selected_frame)))
+       Fkill_emacs (Qnil);
+      set_buffer_internal (XBUFFER (XWINDOW (selected_window)->contents));
+
+      ++num_input_keys;
+
+      /* Now we have read a key sequence of length I,
+        or else I is 0 and we found end of file.  */
+
+      if (i == 0)              /* End of file -- happens only in */
+       return Qnil;            /* a kbd macro, at the end.  */
+      /* -1 means read_key_sequence got a menu that was rejected.
+        Just loop around and read another command.  */
+      if (i == -1)
+       {
+         cancel_echoing ();
+         this_command_key_count = 0;
+         this_command_key_count_reset = 0;
+         this_single_command_key_start = 0;
+         goto finalize;
+       }
+
+      last_command_event = keybuf[i - 1];
+
+      /* If the previous command tried to force a specific window-start,
+        forget about that, in case this command moves point far away
+        from that position.  But also throw away beg_unchanged and
+        end_unchanged information in that case, so that redisplay will
+        update the whole window properly.  */
+      if (XWINDOW (selected_window)->force_start)
+       {
+         struct buffer *b;
+         XWINDOW (selected_window)->force_start = 0;
+         b = XBUFFER (XWINDOW (selected_window)->contents);
+         BUF_BEG_UNCHANGED (b) = BUF_END_UNCHANGED (b) = 0;
+       }
+
+      cmd = read_key_sequence_cmd;
+      if (!NILP (Vexecuting_kbd_macro))
+       {
+         if (!NILP (Vquit_flag))
+           {
+             Vexecuting_kbd_macro = Qt;
+             QUIT;             /* Make some noise.  */
+                               /* Will return since macro now empty.  */
+           }
+       }
+
+      /* Do redisplay processing after this command except in special
+        cases identified below.  */
+      prev_buffer = current_buffer;
+      prev_modiff = MODIFF;
+      last_point_position = PT;
+
+      /* By default, we adjust point to a boundary of a region that
+         has such a property that should be treated intangible
+         (e.g. composition, display).  But, some commands will set
+         this variable differently.  */
+      Vdisable_point_adjustment = Qnil;
+
+      /* Process filters and timers may have messed with deactivate-mark.
+        reset it before we execute the command.  */
+      Vdeactivate_mark = Qnil;
+
+      /* Remap command through active keymaps.  */
+      Vthis_original_command = cmd;
+      if (!NILP (read_key_sequence_remapped))
+       cmd = read_key_sequence_remapped;
+
+      /* Execute the command.  */
+
+      {
+       total_keys += total_keys < NUM_RECENT_KEYS;
+       ASET (recent_keys, recent_keys_index,
+             Fcons (Qnil, cmd));
+       if (++recent_keys_index >= NUM_RECENT_KEYS)
+         recent_keys_index = 0;
+      }
+      Vthis_command = cmd;
+      Vreal_this_command = cmd;
+      safe_run_hooks (Qpre_command_hook);
+
+      already_adjusted = 0;
+
+      if (NILP (Vthis_command))
+       /* nil means key is undefined.  */
+       call0 (Qundefined);
+      else
+       {
+         /* Here for a command that isn't executed directly.  */
+
+#ifdef HAVE_WINDOW_SYSTEM
+            ptrdiff_t scount = SPECPDL_INDEX ();
+
+            if (display_hourglass_p
+                && NILP (Vexecuting_kbd_macro))
+              {
+                record_unwind_protect_void (cancel_hourglass);
+                start_hourglass ();
+              }
+#endif
+
+            if (NILP (KVAR (current_kboard, Vprefix_arg))) /* FIXME: Why?  
--Stef  */
+              {
+               Lisp_Object undo = BVAR (current_buffer, undo_list);
+               Fundo_boundary ();
+               last_undo_boundary
+                 = (EQ (undo, BVAR (current_buffer, undo_list))
+                    ? Qnil : BVAR (current_buffer, undo_list));
+             }
+            call1 (Qcommand_execute, Vthis_command);
+
+#ifdef HAVE_WINDOW_SYSTEM
+         /* Do not check display_hourglass_p here, because
+            `command-execute' could change it, but we should cancel
+            hourglass cursor anyway.
+            But don't cancel the hourglass within a macro
+            just because a command in the macro finishes.  */
+         if (NILP (Vexecuting_kbd_macro))
+            unbind_to (scount, Qnil);
+#endif
+          }
+      kset_last_prefix_arg (current_kboard, Vcurrent_prefix_arg);
+
+      safe_run_hooks (Qpost_command_hook);
+
+      /* If displaying a message, resize the echo area window to fit
+        that message's size exactly.  */
+      if (!NILP (echo_area_buffer[0]))
+       resize_echo_area_exactly ();
+
+      /* If there are warnings waiting, process them.  */
+      if (!NILP (Vdelayed_warnings_list))
+        safe_run_hooks (Qdelayed_warnings_hook);
+
+      safe_run_hooks (Qdeferred_action_function);
+
+      /* If there is a prefix argument,
+        1) We don't want Vlast_command to be ``universal-argument''
+        (that would be dumb), so don't set Vlast_command,
+        2) we want to leave echoing on so that the prefix will be
+        echoed as part of this key sequence, so don't call
+        cancel_echoing, and
+        3) we want to leave this_command_key_count non-zero, so that
+        read_char will realize that it is re-reading a character, and
+        not echo it a second time.
+
+        If the command didn't actually create a prefix arg,
+        but is merely a frame event that is transparent to prefix args,
+        then the above doesn't apply.  */
+      if (NILP (KVAR (current_kboard, Vprefix_arg))
+         || CONSP (last_command_event))
+       {
+         kset_last_command (current_kboard, Vthis_command);
+         kset_real_last_command (current_kboard, Vreal_this_command);
+         if (!CONSP (last_command_event))
+           kset_last_repeatable_command (current_kboard, Vreal_this_command);
+         cancel_echoing ();
+         this_command_key_count = 0;
+         this_command_key_count_reset = 0;
+         this_single_command_key_start = 0;
+       }
+
+      if (!NILP (BVAR (current_buffer, mark_active))
+         && !NILP (Vrun_hooks))
+       {
+         /* In Emacs 22, setting transient-mark-mode to `only' was a
+            way of turning it on for just one command.  This usage is
+            obsolete, but support it anyway.  */
+         if (EQ (Vtransient_mark_mode, Qidentity))
+           Vtransient_mark_mode = Qnil;
+         else if (EQ (Vtransient_mark_mode, Qonly))
+           Vtransient_mark_mode = Qidentity;
+
+         if (!NILP (Vdeactivate_mark))
+           /* If `select-active-regions' is non-nil, this call to
+              `deactivate-mark' also sets the PRIMARY selection.  */
+           call0 (Qdeactivate_mark);
+         else
+           {
+             /* Even if not deactivating the mark, set PRIMARY if
+                `select-active-regions' is non-nil.  */
+             if (!NILP (Fwindow_system (Qnil))
+                 /* Even if mark_active is non-nil, the actual buffer
+                    marker may not have been set yet (Bug#7044).  */
+                 && XMARKER (BVAR (current_buffer, mark))->buffer
+                 && (EQ (Vselect_active_regions, Qonly)
+                     ? EQ (CAR_SAFE (Vtransient_mark_mode), Qonly)
+                     : (!NILP (Vselect_active_regions)
+                        && !NILP (Vtransient_mark_mode)))
+                 && NILP (Fmemq (Vthis_command,
+                                 Vselection_inhibit_update_commands)))
+               {
+                 Lisp_Object txt
+                   = call1 (Fsymbol_value (Qregion_extract_function), Qnil);
+                 if (XINT (Flength (txt)) > 0)
+                   /* Don't set empty selections.  */
+                   call2 (Qgui_set_selection, QPRIMARY, txt);
+               }
+
+             if (current_buffer != prev_buffer || MODIFF != prev_modiff)
+               run_hook (intern ("activate-mark-hook"));
+           }
+
+         Vsaved_region_selection = Qnil;
+       }
+
+    finalize:
+
+      if (current_buffer == prev_buffer
+         && last_point_position != PT
+         && NILP (Vdisable_point_adjustment)
+         && NILP (Vglobal_disable_point_adjustment))
+       {
+         if (last_point_position > BEGV
+             && last_point_position < ZV
+             && (composition_adjust_point (last_point_position,
+                                           last_point_position)
+                 != last_point_position))
+           /* The last point was temporarily set within a grapheme
+              cluster to prevent automatic composition.  To recover
+              the automatic composition, we must update the
+              display.  */
+           windows_or_buffers_changed = 21;
+         if (!already_adjusted)
+           adjust_point_for_property (last_point_position,
+                                      MODIFF != prev_modiff);
+       }
+
+      /* Install chars successfully executed in kbd macro.  */
+
+      if (!NILP (KVAR (current_kboard, defining_kbd_macro))
+         && NILP (KVAR (current_kboard, Vprefix_arg)))
+       finalize_kbd_macro_chars ();
+    }
+}
+
+Lisp_Object
+read_menu_command (void)
+{
+  Lisp_Object keybuf[30];
+  ptrdiff_t count = SPECPDL_INDEX ();
+  int i;
+
+  /* We don't want to echo the keystrokes while navigating the
+     menus.  */
+  specbind (Qecho_keystrokes, make_number (0));
+
+  i = read_key_sequence (keybuf, ARRAYELTS (keybuf),
+                        Qnil, 0, 1, 1, 1);
+
+  unbind_to (count, Qnil);
+
+  if (! FRAME_LIVE_P (XFRAME (selected_frame)))
+    Fkill_emacs (Qnil);
+  if (i == 0 || i == -1)
+    return Qt;
+
+  return read_key_sequence_cmd;
+}
+
+/* Adjust point to a boundary of a region that has such a property
+   that should be treated intangible.  For the moment, we check
+   `composition', `display' and `invisible' properties.
+   LAST_PT is the last position of point.  */
+
+static void
+adjust_point_for_property (ptrdiff_t last_pt, bool modified)
+{
+  ptrdiff_t beg, end;
+  Lisp_Object val, overlay, tmp;
+  /* When called after buffer modification, we should temporarily
+     suppress the point adjustment for automatic composition so that a
+     user can keep inserting another character at point or keep
+     deleting characters around point.  */
+  bool check_composition = ! modified, check_display = 1, check_invisible = 1;
+  ptrdiff_t orig_pt = PT;
+
+  /* FIXME: cycling is probably not necessary because these properties
+     can't be usefully combined anyway.  */
+  while (check_composition || check_display || check_invisible)
+    {
+      /* FIXME: check `intangible'.  */
+      if (check_composition
+         && PT > BEGV && PT < ZV
+         && (beg = composition_adjust_point (last_pt, PT)) != PT)
+       {
+         SET_PT (beg);
+         check_display = check_invisible = 1;
+       }
+      check_composition = 0;
+      if (check_display
+         && PT > BEGV && PT < ZV
+         && !NILP (val = get_char_property_and_overlay
+                             (make_number (PT), Qdisplay, Qnil, &overlay))
+         && display_prop_intangible_p (val, overlay, PT, PT_BYTE)
+         && (!OVERLAYP (overlay)
+             ? get_property_and_range (PT, Qdisplay, &val, &beg, &end, Qnil)
+             : (beg = OVERLAY_POSITION (OVERLAY_START (overlay)),
+                end = OVERLAY_POSITION (OVERLAY_END (overlay))))
+         && (beg < PT /* && end > PT   <- It's always the case.  */
+             || (beg <= PT && STRINGP (val) && SCHARS (val) == 0)))
+       {
+         eassert (end > PT);
+         SET_PT (PT < last_pt
+                 ? (STRINGP (val) && SCHARS (val) == 0
+                    ? max (beg - 1, BEGV)
+                    : beg)
+                 : end);
+         check_composition = check_invisible = 1;
+       }
+      check_display = 0;
+      if (check_invisible && PT > BEGV && PT < ZV)
+       {
+         int inv;
+         bool ellipsis = 0;
+         beg = end = PT;
+
+         /* Find boundaries `beg' and `end' of the invisible area, if any.  */
+         while (end < ZV
+#if 0
+                /* FIXME: We should stop if we find a spot between
+                   two runs of `invisible' where inserted text would
+                   be visible.  This is important when we have two
+                   invisible boundaries that enclose an area: if the
+                   area is empty, we need this test in order to make
+                   it possible to place point in the middle rather
+                   than skip both boundaries.  However, this code
+                   also stops anywhere in a non-sticky text-property,
+                   which breaks (e.g.) Org mode.  */
+                && (val = Fget_pos_property (make_number (end),
+                                             Qinvisible, Qnil),
+                    TEXT_PROP_MEANS_INVISIBLE (val))
+#endif
+                && !NILP (val = get_char_property_and_overlay
+                          (make_number (end), Qinvisible, Qnil, &overlay))
+                && (inv = TEXT_PROP_MEANS_INVISIBLE (val)))
+           {
+             ellipsis = ellipsis || inv > 1
+               || (OVERLAYP (overlay)
+                   && (!NILP (Foverlay_get (overlay, Qafter_string))
+                       || !NILP (Foverlay_get (overlay, Qbefore_string))));
+             tmp = Fnext_single_char_property_change
+               (make_number (end), Qinvisible, Qnil, Qnil);
+             end = NATNUMP (tmp) ? XFASTINT (tmp) : ZV;
+           }
+         while (beg > BEGV
+#if 0
+                && (val = Fget_pos_property (make_number (beg),
+                                             Qinvisible, Qnil),
+                    TEXT_PROP_MEANS_INVISIBLE (val))
+#endif
+                && !NILP (val = get_char_property_and_overlay
+                          (make_number (beg - 1), Qinvisible, Qnil, &overlay))
+                && (inv = TEXT_PROP_MEANS_INVISIBLE (val)))
+           {
+             ellipsis = ellipsis || inv > 1
+               || (OVERLAYP (overlay)
+                   && (!NILP (Foverlay_get (overlay, Qafter_string))
+                       || !NILP (Foverlay_get (overlay, Qbefore_string))));
+             tmp = Fprevious_single_char_property_change
+               (make_number (beg), Qinvisible, Qnil, Qnil);
+             beg = NATNUMP (tmp) ? XFASTINT (tmp) : BEGV;
+           }
+
+         /* Move away from the inside area.  */
+         if (beg < PT && end > PT)
+           {
+             SET_PT ((orig_pt == PT && (last_pt < beg || last_pt > end))
+                     /* We haven't moved yet (so we don't need to fear
+                        infinite-looping) and we were outside the range
+                        before (so either end of the range still corresponds
+                        to a move in the right direction): pretend we moved
+                        less than we actually did, so that we still have
+                        more freedom below in choosing which end of the range
+                        to go to.  */
+                     ? (orig_pt = -1, PT < last_pt ? end : beg)
+                     /* We either have moved already or the last point
+                        was already in the range: we don't get to choose
+                        which end of the range we have to go to.  */
+                     : (PT < last_pt ? beg : end));
+             check_composition = check_display = 1;
+           }
+#if 0 /* This assertion isn't correct, because SET_PT may end up setting
+        the point to something other than its argument, due to
+        point-motion hooks, intangibility, etc.  */
+         eassert (PT == beg || PT == end);
+#endif
+
+         /* Pretend the area doesn't exist if the buffer is not
+            modified.  */
+         if (!modified && !ellipsis && beg < end)
+           {
+             if (last_pt == beg && PT == end && end < ZV)
+               (check_composition = check_display = 1, SET_PT (end + 1));
+             else if (last_pt == end && PT == beg && beg > BEGV)
+               (check_composition = check_display = 1, SET_PT (beg - 1));
+             else if (PT == ((PT < last_pt) ? beg : end))
+               /* We've already moved as far as we can.  Trying to go
+                  to the other end would mean moving backwards and thus
+                  could lead to an infinite loop.  */
+               ;
+             else if (val = Fget_pos_property (make_number (PT),
+                                               Qinvisible, Qnil),
+                      TEXT_PROP_MEANS_INVISIBLE (val)
+                      && (val = (Fget_pos_property
+                                 (make_number (PT == beg ? end : beg),
+                                  Qinvisible, Qnil)),
+                          !TEXT_PROP_MEANS_INVISIBLE (val)))
+               (check_composition = check_display = 1,
+                SET_PT (PT == beg ? end : beg));
+           }
+       }
+      check_invisible = 0;
+    }
+}
+
+/* Subroutine for safe_run_hooks: run the hook, which is ARGS[1].  */
+
+static Lisp_Object
+safe_run_hooks_1 (ptrdiff_t nargs, Lisp_Object *args)
+{
+  eassert (nargs == 2);
+  return call0 (args[1]);
+}
+
+/* Subroutine for safe_run_hooks: handle an error by clearing out the function
+   from the hook.  */
+
+static Lisp_Object
+safe_run_hooks_error (Lisp_Object error, ptrdiff_t nargs, Lisp_Object *args)
+{
+  eassert (nargs == 2);
+  AUTO_STRING (format, "Error in %s (%S): %S");
+  Lisp_Object hook = args[0];
+  Lisp_Object fun = args[1];
+  CALLN (Fmessage, format, hook, fun, error);
+
+  if (SYMBOLP (hook))
+    {
+      Lisp_Object val;
+      bool found = 0;
+      Lisp_Object newval = Qnil;
+      for (val = find_symbol_value (hook); CONSP (val); val = XCDR (val))
+       if (EQ (fun, XCAR (val)))
+         found = 1;
+       else
+         newval = Fcons (XCAR (val), newval);
+      if (found)
+       return Fset (hook, Fnreverse (newval));
+      /* Not found in the local part of the hook.  Let's look at the global
+        part.  */
+      newval = Qnil;
+      for (val = (NILP (Fdefault_boundp (hook)) ? Qnil
+                 : Fdefault_value (hook));
+          CONSP (val); val = XCDR (val))
+       if (EQ (fun, XCAR (val)))
+         found = 1;
+       else
+         newval = Fcons (XCAR (val), newval);
+      if (found)
+       return Fset_default (hook, Fnreverse (newval));
+    }
+  return Qnil;
+}
+
+static Lisp_Object
+safe_run_hook_funcall (ptrdiff_t nargs, Lisp_Object *args)
+{
+  eassert (nargs == 2);
+  /* Yes, run_hook_with_args works with args in the other order.  */
+  internal_condition_case_n (safe_run_hooks_1,
+                            2, ((Lisp_Object []) {args[1], args[0]}),
+                            Qt, safe_run_hooks_error);
+  return Qnil;
+}
+
+/* If we get an error while running the hook, cause the hook variable
+   to be nil.  Also inhibit quits, so that C-g won't cause the hook
+   to mysteriously evaporate.  */
+
+void
+safe_run_hooks (Lisp_Object hook)
+{
+  struct gcpro gcpro1;
+  ptrdiff_t count = SPECPDL_INDEX ();
+
+  GCPRO1 (hook);
+  specbind (Qinhibit_quit, Qt);
+  run_hook_with_args (2, ((Lisp_Object []) {hook, hook}), 
safe_run_hook_funcall);
+  unbind_to (count, Qnil);
+  UNGCPRO;
+}
+
+
+/* Nonzero means polling for input is temporarily suppressed.  */
+
+int poll_suppress_count;
+
+
+#ifdef POLL_FOR_INPUT
+
+/* Asynchronous timer for polling.  */
+
+static struct atimer *poll_timer;
+
+/* Poll for input, so that we catch a C-g if it comes in.  */
+void
+poll_for_input_1 (void)
+{
+  if (! input_blocked_p ()
+      && !waiting_for_input)
+    gobble_input ();
+}
+
+/* Timer callback function for poll_timer.  TIMER is equal to
+   poll_timer.  */
+
+static void
+poll_for_input (struct atimer *timer)
+{
+  if (poll_suppress_count == 0)
+    pending_signals = 1;
+}
+
+#endif /* POLL_FOR_INPUT */
+
+/* Begin signals to poll for input, if they are appropriate.
+   This function is called unconditionally from various places.  */
+
+void
+start_polling (void)
+{
+#ifdef POLL_FOR_INPUT
+  /* XXX This condition was (read_socket_hook && !interrupt_input),
+     but read_socket_hook is not global anymore.  Let's pretend that
+     it's always set.  */
+  if (!interrupt_input)
+    {
+      /* Turn alarm handling on unconditionally.  It might have
+        been turned off in process.c.  */
+      turn_on_atimers (1);
+
+      /* If poll timer doesn't exist, or we need one with
+        a different interval, start a new one.  */
+      if (poll_timer == NULL
+         || poll_timer->interval.tv_sec != polling_period)
+       {
+         time_t period = max (1, min (polling_period, TYPE_MAXIMUM (time_t)));
+         struct timespec interval = make_timespec (period, 0);
+
+         if (poll_timer)
+           cancel_atimer (poll_timer);
+
+         poll_timer = start_atimer (ATIMER_CONTINUOUS, interval,
+                                    poll_for_input, NULL);
+       }
+
+      /* Let the timer's callback function poll for input
+        if this becomes zero.  */
+      --poll_suppress_count;
+    }
+#endif
+}
+
+/* True if we are using polling to handle input asynchronously.  */
+
+bool
+input_polling_used (void)
+{
+#ifdef POLL_FOR_INPUT
+  /* XXX This condition was (read_socket_hook && !interrupt_input),
+     but read_socket_hook is not global anymore.  Let's pretend that
+     it's always set.  */
+  return !interrupt_input;
+#else
+  return 0;
+#endif
+}
+
+/* Turn off polling.  */
+
+void
+stop_polling (void)
+{
+#ifdef POLL_FOR_INPUT
+  /* XXX This condition was (read_socket_hook && !interrupt_input),
+     but read_socket_hook is not global anymore.  Let's pretend that
+     it's always set.  */
+  if (!interrupt_input)
+    ++poll_suppress_count;
+#endif
+}
+
+/* Set the value of poll_suppress_count to COUNT
+   and start or stop polling accordingly.  */
+
+void
+set_poll_suppress_count (int count)
+{
+#ifdef POLL_FOR_INPUT
+  if (count == 0 && poll_suppress_count != 0)
+    {
+      poll_suppress_count = 1;
+      start_polling ();
+    }
+  else if (count != 0 && poll_suppress_count == 0)
+    {
+      stop_polling ();
+    }
+  poll_suppress_count = count;
+#endif
+}
+
+/* Bind polling_period to a value at least N.
+   But don't decrease it.  */
+
+void
+bind_polling_period (int n)
+{
+#ifdef POLL_FOR_INPUT
+  EMACS_INT new = polling_period;
+
+  if (n > new)
+    new = n;
+
+  stop_other_atimers (poll_timer);
+  stop_polling ();
+  specbind (Qpolling_period, make_number (new));
+  /* Start a new alarm with the new period.  */
+  start_polling ();
+#endif
+}
+
+/* Apply the control modifier to CHARACTER.  */
+
+int
+make_ctrl_char (int c)
+{
+  /* Save the upper bits here.  */
+  int upper = c & ~0177;
+
+  if (! ASCII_CHAR_P (c))
+    return c |= ctrl_modifier;
+
+  c &= 0177;
+
+  /* Everything in the columns containing the upper-case letters
+     denotes a control character.  */
+  if (c >= 0100 && c < 0140)
+    {
+      int oc = c;
+      c &= ~0140;
+      /* Set the shift modifier for a control char
+        made from a shifted letter.  But only for letters!  */
+      if (oc >= 'A' && oc <= 'Z')
+       c |= shift_modifier;
+    }
+
+  /* The lower-case letters denote control characters too.  */
+  else if (c >= 'a' && c <= 'z')
+    c &= ~0140;
+
+  /* Include the bits for control and shift
+     only if the basic ASCII code can't indicate them.  */
+  else if (c >= ' ')
+    c |= ctrl_modifier;
+
+  /* Replace the high bits.  */
+  c |= (upper & ~ctrl_modifier);
+
+  return c;
+}
+
+/* Display the help-echo property of the character after the mouse pointer.
+   Either show it in the echo area, or call show-help-function to display
+   it by other means (maybe in a tooltip).
+
+   If HELP is nil, that means clear the previous help echo.
+
+   If HELP is a string, display that string.  If HELP is a function,
+   call it with OBJECT and POS as arguments; the function should
+   return a help string or nil for none.  For all other types of HELP,
+   evaluate it to obtain a string.
+
+   WINDOW is the window in which the help was generated, if any.
+   It is nil if not in a window.
+
+   If OBJECT is a buffer, POS is the position in the buffer where the
+   `help-echo' text property was found.
+
+   If OBJECT is an overlay, that overlay has a `help-echo' property,
+   and POS is the position in the overlay's buffer under the mouse.
+
+   If OBJECT is a string (an overlay string or a string displayed with
+   the `display' property).  POS is the position in that string under
+   the mouse.
+
+   Note: this function may only be called with HELP nil or a string
+   from X code running asynchronously.  */
+
+void
+show_help_echo (Lisp_Object help, Lisp_Object window, Lisp_Object object,
+               Lisp_Object pos)
+{
+  if (!NILP (help) && !STRINGP (help))
+    {
+      if (FUNCTIONP (help))
+       help = safe_call (4, help, window, object, pos);
+      else
+       help = safe_eval (help);
+
+      if (!STRINGP (help))
+       return;
+    }
+
+  if (!noninteractive && STRINGP (help))
+    {
+      /* The mouse-fixup-help-message Lisp function can call
+        mouse_position_hook, which resets the mouse_moved flags.
+        This causes trouble if we are trying to read a mouse motion
+        event (i.e., if we are inside a `track-mouse' form), so we
+        restore the mouse_moved flag.  */
+      struct frame *f = NILP (do_mouse_tracking) ? NULL : some_mouse_moved ();
+      help = call1 (Qmouse_fixup_help_message, help);
+      if (f)
+       f->mouse_moved = 1;
+    }
+
+  if (STRINGP (help) || NILP (help))
+    {
+      if (!NILP (Vshow_help_function))
+       call1 (Vshow_help_function, help);
+      help_echo_showing_p = STRINGP (help);
+    }
+}
+
+
+
+/* Input of single characters from keyboard.  */
+
+static Lisp_Object kbd_buffer_get_event (KBOARD **kbp, bool *used_mouse_menu,
+                                        struct timespec *end_time);
+static void record_char (Lisp_Object c);
+
+static Lisp_Object help_form_saved_window_configs;
+static void
+read_char_help_form_unwind (void)
+{
+  Lisp_Object window_config = XCAR (help_form_saved_window_configs);
+  help_form_saved_window_configs = XCDR (help_form_saved_window_configs);
+  if (!NILP (window_config))
+    Fset_window_configuration (window_config);
+}
+
+#define STOP_POLLING                                   \
+do { if (! polling_stopped_here) stop_polling ();      \
+       polling_stopped_here = 1; } while (0)
+
+#define RESUME_POLLING                                 \
+do { if (polling_stopped_here) start_polling ();       \
+       polling_stopped_here = 0; } while (0)
+
+static Lisp_Object
+read_event_from_main_queue (struct timespec *end_time,
+                            sys_jmp_buf local_getcjmp,
+                            bool *used_mouse_menu)
+{
+  Lisp_Object c = Qnil;
+  sys_jmp_buf save_jump;
+  KBOARD *kb IF_LINT (= NULL);
+
+ start:
+
+  /* Read from the main queue, and if that gives us something we can't use yet,
+     we put it on the appropriate side queue and try again.  */
+
+  if (end_time && timespec_cmp (*end_time, current_timespec ()) <= 0)
+    return c;
+
+  /* Actually read a character, waiting if necessary.  */
+  save_getcjmp (save_jump);
+  restore_getcjmp (local_getcjmp);
+  if (!end_time)
+    timer_start_idle ();
+  c = kbd_buffer_get_event (&kb, used_mouse_menu, end_time);
+  restore_getcjmp (save_jump);
+
+  if (! NILP (c) && (kb != current_kboard))
+    {
+      Lisp_Object last = KVAR (kb, kbd_queue);
+      if (CONSP (last))
+        {
+          while (CONSP (XCDR (last)))
+       last = XCDR (last);
+          if (!NILP (XCDR (last)))
+       emacs_abort ();
+        }
+      if (!CONSP (last))
+        kset_kbd_queue (kb, list1 (c));
+      else
+        XSETCDR (last, list1 (c));
+      kb->kbd_queue_has_data = 1;
+      c = Qnil;
+      if (single_kboard)
+        goto start;
+      current_kboard = kb;
+      /* This is going to exit from read_char
+         so we had better get rid of this frame's stuff.  */
+      return make_number (-2);
+    }
+
+  /* Terminate Emacs in batch mode if at eof.  */
+  if (noninteractive && INTEGERP (c) && XINT (c) < 0)
+    Fkill_emacs (make_number (1));
+
+  if (INTEGERP (c))
+    {
+      /* Add in any extra modifiers, where appropriate.  */
+      if ((extra_keyboard_modifiers & CHAR_CTL)
+         || ((extra_keyboard_modifiers & 0177) < ' '
+             && (extra_keyboard_modifiers & 0177) != 0))
+       XSETINT (c, make_ctrl_char (XINT (c)));
+
+      /* Transfer any other modifier bits directly from
+        extra_keyboard_modifiers to c.  Ignore the actual character code
+        in the low 16 bits of extra_keyboard_modifiers.  */
+      XSETINT (c, XINT (c) | (extra_keyboard_modifiers & ~0xff7f & ~CHAR_CTL));
+    }
+
+  return c;
+}
+
+
+
+/* Like `read_event_from_main_queue' but applies keyboard-coding-system
+   to tty input.  */
+static Lisp_Object
+read_decoded_event_from_main_queue (struct timespec *end_time,
+                                    sys_jmp_buf local_getcjmp,
+                                    Lisp_Object prev_event,
+                                    bool *used_mouse_menu)
+{
+#define MAX_ENCODED_BYTES 16
+#ifndef WINDOWSNT
+  Lisp_Object events[MAX_ENCODED_BYTES];
+  int n = 0;
+#endif
+  while (true)
+    {
+      Lisp_Object nextevt
+        = read_event_from_main_queue (end_time, local_getcjmp,
+                                      used_mouse_menu);
+#ifdef WINDOWSNT
+      /* w32_console already returns decoded events.  It either reads
+        Unicode characters from the Windows keyboard input, or
+        converts characters encoded in the current codepage into
+        Unicode.  See w32inevt.c:key_event, near its end.  */
+      return nextevt;
+#else
+      struct frame *frame = XFRAME (selected_frame);
+      struct terminal *terminal = frame->terminal;
+      if (!((FRAME_TERMCAP_P (frame) || FRAME_MSDOS_P (frame))
+            /* Don't apply decoding if we're just reading a raw event
+               (e.g. reading bytes sent by the xterm to specify the position
+               of a mouse click).  */
+            && (!EQ (prev_event, Qt))
+           && (TERMINAL_KEYBOARD_CODING (terminal)->common_flags
+               & CODING_REQUIRE_DECODING_MASK)))
+       return nextevt;         /* No decoding needed.  */
+      else
+       {
+         int meta_key = terminal->display_info.tty->meta_key;
+         eassert (n < MAX_ENCODED_BYTES);
+         events[n++] = nextevt;
+         if (NATNUMP (nextevt)
+             && XINT (nextevt) < (meta_key == 1 ? 0x80 : 0x100))
+           { /* An encoded byte sequence, let's try to decode it.  */
+             struct coding_system *coding
+               = TERMINAL_KEYBOARD_CODING (terminal);
+
+             if (raw_text_coding_system_p (coding))
+               {
+                 int i;
+                 if (meta_key != 2)
+                   for (i = 0; i < n; i++)
+                     events[i] = make_number (XINT (events[i]) & ~0x80);
+               }
+             else
+               {
+                 unsigned char src[MAX_ENCODED_BYTES];
+                 unsigned char dest[MAX_ENCODED_BYTES * MAX_MULTIBYTE_LENGTH];
+                 int i;
+                 for (i = 0; i < n; i++)
+                   src[i] = XINT (events[i]);
+                 if (meta_key != 2)
+                   for (i = 0; i < n; i++)
+                     src[i] &= ~0x80;
+                 coding->destination = dest;
+                 coding->dst_bytes = sizeof dest;
+                 decode_coding_c_string (coding, src, n, Qnil);
+                 eassert (coding->produced_char <= n);
+                 if (coding->produced_char == 0)
+                   { /* The encoded sequence is incomplete.  */
+                     if (n < MAX_ENCODED_BYTES) /* Avoid buffer overflow.  */
+                       continue;                    /* Read on!  */
+                   }
+                 else
+                   {
+                     const unsigned char *p = coding->destination;
+                     eassert (coding->carryover_bytes == 0);
+                     n = 0;
+                     while (n < coding->produced_char)
+                       events[n++] = make_number (STRING_CHAR_ADVANCE (p));
+                   }
+               }
+           }
+         /* Now `events' should hold decoded events.
+            Normally, n should be equal to 1, but better not rely on it.
+            We can only return one event here, so return the first we
+            had and keep the others (if any) for later.  */
+         while (n > 1)
+           Vunread_command_events
+             = Fcons (events[--n], Vunread_command_events);
+         return events[0];
+       }
+#endif
+    }
+}
+
+static bool
+echo_keystrokes_p (void)
+{
+  return (FLOATP (Vecho_keystrokes) ? XFLOAT_DATA (Vecho_keystrokes) > 0.0
+         : INTEGERP (Vecho_keystrokes) ? XINT (Vecho_keystrokes) > 0 : false);
+}
+
+/* Read a character from the keyboard; call the redisplay if needed.  */
+/* commandflag 0 means do not autosave, but do redisplay.
+   -1 means do not redisplay, but do autosave.
+   -2 means do neither.
+   1 means do both.
+
+   The argument MAP is a keymap for menu prompting.
+
+   PREV_EVENT is the previous input event, or nil if we are reading
+   the first event of a key sequence (or not reading a key sequence).
+   If PREV_EVENT is t, that is a "magic" value that says
+   not to run input methods, but in other respects to act as if
+   not reading a key sequence.
+
+   If USED_MOUSE_MENU is non-null, then set *USED_MOUSE_MENU to true
+   if we used a mouse menu to read the input, or false otherwise.  If
+   USED_MOUSE_MENU is null, don't dereference it.
+
+   Value is -2 when we find input on another keyboard.  A second call
+   to read_char will read it.
+
+   If END_TIME is non-null, it is a pointer to a struct timespec
+   specifying the maximum time to wait until.  If no input arrives by
+   that time, stop waiting and return nil.
+
+   Value is t if we showed a menu and the user rejected it.  */
+
+Lisp_Object
+read_char (int commandflag, Lisp_Object map,
+          Lisp_Object prev_event,
+          bool *used_mouse_menu, struct timespec *end_time)
+{
+  Lisp_Object c;
+  ptrdiff_t jmpcount;
+  sys_jmp_buf local_getcjmp;
+  sys_jmp_buf save_jump;
+  Lisp_Object tem, save;
+  volatile Lisp_Object previous_echo_area_message;
+  volatile Lisp_Object also_record;
+  volatile bool reread;
+  struct gcpro gcpro1, gcpro2;
+  bool volatile polling_stopped_here = 0;
+  struct kboard *orig_kboard = current_kboard;
+
+  also_record = Qnil;
+
+#if 0  /* This was commented out as part of fixing echo for C-u left.  */
+  before_command_key_count = this_command_key_count;
+  before_command_echo_length = echo_length ();
+#endif
+  c = Qnil;
+  previous_echo_area_message = Qnil;
+
+  GCPRO2 (c, previous_echo_area_message);
+
+ retry:
+
+  if (CONSP (Vunread_post_input_method_events))
+    {
+      c = XCAR (Vunread_post_input_method_events);
+      Vunread_post_input_method_events
+       = XCDR (Vunread_post_input_method_events);
+
+      /* Undo what read_char_x_menu_prompt did when it unread
+        additional keys returned by Fx_popup_menu.  */
+      if (CONSP (c)
+         && (SYMBOLP (XCAR (c)) || INTEGERP (XCAR (c)))
+         && NILP (XCDR (c)))
+       c = XCAR (c);
+
+      reread = true;
+      goto reread_first;
+    }
+  else
+    reread = false;
+
+
+  if (CONSP (Vunread_command_events))
+    {
+      bool was_disabled = 0;
+
+      c = XCAR (Vunread_command_events);
+      Vunread_command_events = XCDR (Vunread_command_events);
+
+      /* Undo what sit-for did when it unread additional keys
+        inside universal-argument.  */
+
+      if (CONSP (c) && EQ (XCAR (c), Qt))
+       c = XCDR (c);
+      else
+       reread = true;
+
+      /* Undo what read_char_x_menu_prompt did when it unread
+        additional keys returned by Fx_popup_menu.  */
+      if (CONSP (c)
+         && EQ (XCDR (c), Qdisabled)
+         && (SYMBOLP (XCAR (c)) || INTEGERP (XCAR (c))))
+       {
+         was_disabled = 1;
+         c = XCAR (c);
+       }
+
+      /* If the queued event is something that used the mouse,
+         set used_mouse_menu accordingly.  */
+      if (used_mouse_menu
+         /* Also check was_disabled so last-nonmenu-event won't return
+            a bad value when submenus are involved.  (Bug#447)  */
+         && (EQ (c, Qtool_bar) || EQ (c, Qmenu_bar) || was_disabled))
+       *used_mouse_menu = 1;
+
+      goto reread_for_input_method;
+    }
+
+  if (CONSP (Vunread_input_method_events))
+    {
+      c = XCAR (Vunread_input_method_events);
+      Vunread_input_method_events = XCDR (Vunread_input_method_events);
+
+      /* Undo what read_char_x_menu_prompt did when it unread
+        additional keys returned by Fx_popup_menu.  */
+      if (CONSP (c)
+         && (SYMBOLP (XCAR (c)) || INTEGERP (XCAR (c)))
+         && NILP (XCDR (c)))
+       c = XCAR (c);
+      reread = true;
+      goto reread_for_input_method;
+    }
+
+  this_command_key_count_reset = 0;
+
+  if (!NILP (Vexecuting_kbd_macro))
+    {
+      /* We set this to Qmacro; since that's not a frame, nobody will
+        try to switch frames on us, and the selected window will
+        remain unchanged.
+
+         Since this event came from a macro, it would be misleading to
+        leave internal_last_event_frame set to wherever the last
+        real event came from.  Normally, a switch-frame event selects
+        internal_last_event_frame after each command is read, but
+        events read from a macro should never cause a new frame to be
+        selected.  */
+      Vlast_event_frame = internal_last_event_frame = Qmacro;
+
+      /* Exit the macro if we are at the end.
+        Also, some things replace the macro with t
+        to force an early exit.  */
+      if (EQ (Vexecuting_kbd_macro, Qt)
+         || executing_kbd_macro_index >= XFASTINT (Flength 
(Vexecuting_kbd_macro)))
+       {
+         XSETINT (c, -1);
+         goto exit;
+       }
+
+      c = Faref (Vexecuting_kbd_macro, make_number 
(executing_kbd_macro_index));
+      if (STRINGP (Vexecuting_kbd_macro)
+         && (XFASTINT (c) & 0x80) && (XFASTINT (c) <= 0xff))
+       XSETFASTINT (c, CHAR_META | (XFASTINT (c) & ~0x80));
+
+      executing_kbd_macro_index++;
+
+      goto from_macro;
+    }
+
+  if (!NILP (unread_switch_frame))
+    {
+      c = unread_switch_frame;
+      unread_switch_frame = Qnil;
+
+      /* This event should make it into this_command_keys, and get echoed
+        again, so we do not set `reread'.  */
+      goto reread_first;
+    }
+
+  /* If redisplay was requested.  */
+  if (commandflag >= 0)
+    {
+      bool echo_current = EQ (echo_message_buffer, echo_area_buffer[0]);
+
+       /* If there is pending input, process any events which are not
+          user-visible, such as X selection_request events.  */
+      if (input_pending
+         || detect_input_pending_run_timers (0))
+       swallow_events (false);         /* May clear input_pending.  */
+
+      /* Redisplay if no pending input.  */
+      while (!(input_pending
+              && (input_was_pending || !redisplay_dont_pause)))
+       {
+         input_was_pending = input_pending;
+         if (help_echo_showing_p && !EQ (selected_window, minibuf_window))
+           redisplay_preserve_echo_area (5);
+         else
+           redisplay ();
+
+         if (!input_pending)
+           /* Normal case: no input arrived during redisplay.  */
+           break;
+
+         /* Input arrived and pre-empted redisplay.
+            Process any events which are not user-visible.  */
+         swallow_events (false);
+         /* If that cleared input_pending, try again to redisplay.  */
+       }
+
+      /* Prevent the redisplay we just did
+        from messing up echoing of the input after the prompt.  */
+      if (commandflag == 0 && echo_current)
+       echo_message_buffer = echo_area_buffer[0];
+
+    }
+
+  /* Message turns off echoing unless more keystrokes turn it on again.
+
+     The code in 20.x for the condition was
+
+     1. echo_area_glyphs && *echo_area_glyphs
+     2. && echo_area_glyphs != current_kboard->echobuf
+     3. && ok_to_echo_at_next_pause != echo_area_glyphs
+
+     (1) means there's a current message displayed
+
+     (2) means it's not the message from echoing from the current
+     kboard.
+
+     (3) There's only one place in 20.x where ok_to_echo_at_next_pause
+     is set to a non-null value.  This is done in read_char and it is
+     set to echo_area_glyphs after a call to echo_char.  That means
+     ok_to_echo_at_next_pause is either null or
+     current_kboard->echobuf with the appropriate current_kboard at
+     that time.
+
+     So, condition (3) means in clear text ok_to_echo_at_next_pause
+     must be either null, or the current message isn't from echoing at
+     all, or it's from echoing from a different kboard than the
+     current one.  */
+
+  if (/* There currently is something in the echo area.  */
+      !NILP (echo_area_buffer[0])
+      && (/* It's an echo from a different kboard.  */
+         echo_kboard != current_kboard
+         /* Or we explicitly allow overwriting whatever there is.  */
+         || ok_to_echo_at_next_pause == NULL))
+    cancel_echoing ();
+  else
+    echo_dash ();
+
+  /* Try reading a character via menu prompting in the minibuf.
+     Try this before the sit-for, because the sit-for
+     would do the wrong thing if we are supposed to do
+     menu prompting. If EVENT_HAS_PARAMETERS then we are reading
+     after a mouse event so don't try a minibuf menu.  */
+  c = Qnil;
+  if (KEYMAPP (map) && INTERACTIVE
+      && !NILP (prev_event) && ! EVENT_HAS_PARAMETERS (prev_event)
+      /* Don't bring up a menu if we already have another event.  */
+      && NILP (Vunread_command_events)
+      && !detect_input_pending_run_timers (0))
+    {
+      c = read_char_minibuf_menu_prompt (commandflag, map);
+
+      if (INTEGERP (c) && XINT (c) == -2)
+        return c;               /* wrong_kboard_jmpbuf */
+
+      if (! NILP (c))
+       goto exit;
+    }
+
+  /* Make a longjmp point for quits to use, but don't alter getcjmp just yet.
+     We will do that below, temporarily for short sections of code,
+     when appropriate.  local_getcjmp must be in effect
+     around any call to sit_for or kbd_buffer_get_event;
+     it *must not* be in effect when we call redisplay.  */
+
+  jmpcount = SPECPDL_INDEX ();
+  if (sys_setjmp (local_getcjmp))
+    {
+      /* Handle quits while reading the keyboard.  */
+      /* We must have saved the outer value of getcjmp here,
+        so restore it now.  */
+      restore_getcjmp (save_jump);
+      pthread_sigmask (SIG_SETMASK, &empty_mask, 0);
+      unbind_to (jmpcount, Qnil);
+      XSETINT (c, quit_char);
+      internal_last_event_frame = selected_frame;
+      Vlast_event_frame = internal_last_event_frame;
+      /* If we report the quit char as an event,
+        don't do so more than once.  */
+      if (!NILP (Vinhibit_quit))
+       Vquit_flag = Qnil;
+
+      {
+       KBOARD *kb = FRAME_KBOARD (XFRAME (selected_frame));
+       if (kb != current_kboard)
+         {
+           Lisp_Object last = KVAR (kb, kbd_queue);
+           /* We shouldn't get here if we were in single-kboard mode!  */
+           if (single_kboard)
+             emacs_abort ();
+           if (CONSP (last))
+             {
+               while (CONSP (XCDR (last)))
+                 last = XCDR (last);
+               if (!NILP (XCDR (last)))
+                 emacs_abort ();
+             }
+           if (!CONSP (last))
+             kset_kbd_queue (kb, list1 (c));
+           else
+             XSETCDR (last, list1 (c));
+           kb->kbd_queue_has_data = 1;
+           current_kboard = kb;
+           /* This is going to exit from read_char
+              so we had better get rid of this frame's stuff.  */
+           UNGCPRO;
+            return make_number (-2); /* wrong_kboard_jmpbuf */
+         }
+      }
+      goto non_reread;
+    }
+
+  /* Start idle timers if no time limit is supplied.  We don't do it
+     if a time limit is supplied to avoid an infinite recursion in the
+     situation where an idle timer calls `sit-for'.  */
+
+  if (!end_time)
+    timer_start_idle ();
+
+  /* If in middle of key sequence and minibuffer not active,
+     start echoing if enough time elapses.  */
+
+  if (minibuf_level == 0
+      && !end_time
+      && !current_kboard->immediate_echo
+      && this_command_key_count > 0
+      && ! noninteractive
+      && echo_keystrokes_p ()
+      && (/* No message.  */
+         NILP (echo_area_buffer[0])
+         /* Or empty message.  */
+         || (BUF_BEG (XBUFFER (echo_area_buffer[0]))
+             == BUF_Z (XBUFFER (echo_area_buffer[0])))
+         /* Or already echoing from same kboard.  */
+         || (echo_kboard && ok_to_echo_at_next_pause == echo_kboard)
+         /* Or not echoing before and echoing allowed.  */
+         || (!echo_kboard && ok_to_echo_at_next_pause)))
+    {
+      /* After a mouse event, start echoing right away.
+        This is because we are probably about to display a menu,
+        and we don't want to delay before doing so.  */
+      if (EVENT_HAS_PARAMETERS (prev_event))
+       echo_now ();
+      else
+       {
+         Lisp_Object tem0;
+
+         save_getcjmp (save_jump);
+         restore_getcjmp (local_getcjmp);
+         tem0 = sit_for (Vecho_keystrokes, 1, 1);
+         restore_getcjmp (save_jump);
+         if (EQ (tem0, Qt)
+             && ! CONSP (Vunread_command_events))
+           echo_now ();
+       }
+    }
+
+  /* Maybe auto save due to number of keystrokes.  */
+
+  if (commandflag != 0 && commandflag != -2
+      && auto_save_interval > 0
+      && num_nonmacro_input_events - last_auto_save > max (auto_save_interval, 
20)
+      && !detect_input_pending_run_timers (0))
+    {
+      Fdo_auto_save (Qnil, Qnil);
+      /* Hooks can actually change some buffers in auto save.  */
+      redisplay ();
+    }
+
+  /* Try reading using an X menu.
+     This is never confused with reading using the minibuf
+     because the recursive call of read_char in read_char_minibuf_menu_prompt
+     does not pass on any keymaps.  */
+
+  if (KEYMAPP (map) && INTERACTIVE
+      && !NILP (prev_event)
+      && EVENT_HAS_PARAMETERS (prev_event)
+      && !EQ (XCAR (prev_event), Qmenu_bar)
+      && !EQ (XCAR (prev_event), Qtool_bar)
+      /* Don't bring up a menu if we already have another event.  */
+      && NILP (Vunread_command_events))
+    {
+      c = read_char_x_menu_prompt (map, prev_event, used_mouse_menu);
+
+      /* Now that we have read an event, Emacs is not idle.  */
+      if (!end_time)
+       timer_stop_idle ();
+
+      goto exit;
+    }
+
+  /* Maybe autosave and/or garbage collect due to idleness.  */
+
+  if (INTERACTIVE && NILP (c))
+    {
+      int delay_level;
+      ptrdiff_t buffer_size;
+
+      /* Slow down auto saves logarithmically in size of current buffer,
+        and garbage collect while we're at it.  */
+      if (! MINI_WINDOW_P (XWINDOW (selected_window)))
+       last_non_minibuf_size = Z - BEG;
+      buffer_size = (last_non_minibuf_size >> 8) + 1;
+      delay_level = 0;
+      while (buffer_size > 64)
+       delay_level++, buffer_size -= buffer_size >> 2;
+      if (delay_level < 4) delay_level = 4;
+      /* delay_level is 4 for files under around 50k, 7 at 100k,
+        9 at 200k, 11 at 300k, and 12 at 500k.  It is 15 at 1 meg.  */
+
+      /* Auto save if enough time goes by without input.  */
+      if (commandflag != 0 && commandflag != -2
+         && num_nonmacro_input_events > last_auto_save
+         && INTEGERP (Vauto_save_timeout)
+         && XINT (Vauto_save_timeout) > 0)
+       {
+         Lisp_Object tem0;
+         EMACS_INT timeout = XFASTINT (Vauto_save_timeout);
+
+         timeout = min (timeout, MOST_POSITIVE_FIXNUM / delay_level * 4);
+         timeout = delay_level * timeout / 4;
+         save_getcjmp (save_jump);
+         restore_getcjmp (local_getcjmp);
+         tem0 = sit_for (make_number (timeout), 1, 1);
+         restore_getcjmp (save_jump);
+
+         if (EQ (tem0, Qt)
+             && ! CONSP (Vunread_command_events))
+           {
+             Fdo_auto_save (Qnil, Qnil);
+             redisplay ();
+           }
+       }
+
+      /* If there is still no input available, ask for GC.  */
+      if (!detect_input_pending_run_timers (0))
+       maybe_gc ();
+    }
+
+  /* Notify the caller if an autosave hook, or a timer, sentinel or
+     filter in the sit_for calls above have changed the current
+     kboard.  This could happen if they use the minibuffer or start a
+     recursive edit, like the fancy splash screen in server.el's
+     filter.  If this longjmp wasn't here, read_key_sequence would
+     interpret the next key sequence using the wrong translation
+     tables and function keymaps.  */
+  if (NILP (c) && current_kboard != orig_kboard)
+    {
+      UNGCPRO;
+      return make_number (-2);  /* wrong_kboard_jmpbuf */
+    }
+
+  /* If this has become non-nil here, it has been set by a timer
+     or sentinel or filter.  */
+  if (CONSP (Vunread_command_events))
+    {
+      c = XCAR (Vunread_command_events);
+      Vunread_command_events = XCDR (Vunread_command_events);
+
+      if (CONSP (c) && EQ (XCAR (c), Qt))
+       c = XCDR (c);
+      else
+       reread = true;
+    }
+
+  /* Read something from current KBOARD's side queue, if possible.  */
+
+  if (NILP (c))
+    {
+      if (current_kboard->kbd_queue_has_data)
+       {
+         if (!CONSP (KVAR (current_kboard, kbd_queue)))
+           emacs_abort ();
+         c = XCAR (KVAR (current_kboard, kbd_queue));
+         kset_kbd_queue (current_kboard,
+                         XCDR (KVAR (current_kboard, kbd_queue)));
+         if (NILP (KVAR (current_kboard, kbd_queue)))
+           current_kboard->kbd_queue_has_data = 0;
+         input_pending = readable_events (0);
+         if (EVENT_HAS_PARAMETERS (c)
+             && EQ (EVENT_HEAD_KIND (EVENT_HEAD (c)), Qswitch_frame))
+           internal_last_event_frame = XCAR (XCDR (c));
+         Vlast_event_frame = internal_last_event_frame;
+       }
+    }
+
+  /* If current_kboard's side queue is empty check the other kboards.
+     If one of them has data that we have not yet seen here,
+     switch to it and process the data waiting for it.
+
+     Note: if the events queued up for another kboard
+     have already been seen here, and therefore are not a complete command,
+     the kbd_queue_has_data field is 0, so we skip that kboard here.
+     That's to avoid an infinite loop switching between kboards here.  */
+  if (NILP (c) && !single_kboard)
+    {
+      KBOARD *kb;
+      for (kb = all_kboards; kb; kb = kb->next_kboard)
+       if (kb->kbd_queue_has_data)
+         {
+           current_kboard = kb;
+           /* This is going to exit from read_char
+              so we had better get rid of this frame's stuff.  */
+           UNGCPRO;
+            return make_number (-2); /* wrong_kboard_jmpbuf */
+         }
+    }
+
+ wrong_kboard:
+
+  STOP_POLLING;
+
+  if (NILP (c))
+    {
+      c = read_decoded_event_from_main_queue (end_time, local_getcjmp,
+                                              prev_event, used_mouse_menu);
+      if (NILP (c) && end_time
+         && timespec_cmp (*end_time, current_timespec ()) <= 0)
+        {
+          goto exit;
+        }
+
+      if (EQ (c, make_number (-2)))
+        {
+         /* This is going to exit from read_char
+            so we had better get rid of this frame's stuff.  */
+         UNGCPRO;
+          return c;
+        }
+  }
+
+ non_reread:
+
+  if (!end_time)
+    timer_stop_idle ();
+  RESUME_POLLING;
+
+  if (NILP (c))
+    {
+      if (commandflag >= 0
+         && !input_pending && !detect_input_pending_run_timers (0))
+       redisplay ();
+
+      goto wrong_kboard;
+    }
+
+  /* Buffer switch events are only for internal wakeups
+     so don't show them to the user.
+     Also, don't record a key if we already did.  */
+  if (BUFFERP (c))
+    goto exit;
+
+  /* Process special events within read_char
+     and loop around to read another event.  */
+  save = Vquit_flag;
+  Vquit_flag = Qnil;
+  tem = access_keymap (get_keymap (Vspecial_event_map, 0, 1), c, 0, 0, 1);
+  Vquit_flag = save;
+
+  if (!NILP (tem))
+    {
+      struct buffer *prev_buffer = current_buffer;
+      last_input_event = c;
+      call4 (Qcommand_execute, tem, Qnil, Fvector (1, &last_input_event), Qt);
+
+      if (CONSP (c) && EQ (XCAR (c), Qselect_window) && !end_time)
+       /* We stopped being idle for this event; undo that.  This
+          prevents automatic window selection (under
+          mouse_autoselect_window from acting as a real input event, for
+          example banishing the mouse under mouse-avoidance-mode.  */
+       timer_resume_idle ();
+
+      if (current_buffer != prev_buffer)
+       {
+         /* The command may have changed the keymaps.  Pretend there
+            is input in another keyboard and return.  This will
+            recalculate keymaps.  */
+         c = make_number (-2);
+         goto exit;
+       }
+      else
+       goto retry;
+    }
+
+  /* Handle things that only apply to characters.  */
+  if (INTEGERP (c))
+    {
+      /* If kbd_buffer_get_event gave us an EOF, return that.  */
+      if (XINT (c) == -1)
+       goto exit;
+
+      if ((STRINGP (KVAR (current_kboard, Vkeyboard_translate_table))
+          && UNSIGNED_CMP (XFASTINT (c), <,
+                           SCHARS (KVAR (current_kboard,
+                                         Vkeyboard_translate_table))))
+         || (VECTORP (KVAR (current_kboard, Vkeyboard_translate_table))
+             && UNSIGNED_CMP (XFASTINT (c), <,
+                              ASIZE (KVAR (current_kboard,
+                                           Vkeyboard_translate_table))))
+         || (CHAR_TABLE_P (KVAR (current_kboard, Vkeyboard_translate_table))
+             && CHARACTERP (c)))
+       {
+         Lisp_Object d;
+         d = Faref (KVAR (current_kboard, Vkeyboard_translate_table), c);
+         /* nil in keyboard-translate-table means no translation.  */
+         if (!NILP (d))
+           c = d;
+       }
+    }
+
+  /* If this event is a mouse click in the menu bar,
+     return just menu-bar for now.  Modify the mouse click event
+     so we won't do this twice, then queue it up.  */
+  if (EVENT_HAS_PARAMETERS (c)
+      && CONSP (XCDR (c))
+      && CONSP (EVENT_START (c))
+      && CONSP (XCDR (EVENT_START (c))))
+    {
+      Lisp_Object posn;
+
+      posn = POSN_POSN (EVENT_START (c));
+      /* Handle menu-bar events:
+        insert the dummy prefix event `menu-bar'.  */
+      if (EQ (posn, Qmenu_bar) || EQ (posn, Qtool_bar))
+       {
+         /* Change menu-bar to (menu-bar) as the event "position".  */
+         POSN_SET_POSN (EVENT_START (c), list1 (posn));
+
+         also_record = c;
+         Vunread_command_events = Fcons (c, Vunread_command_events);
+         c = posn;
+       }
+    }
+
+  /* Store these characters into recent_keys, the dribble file if any,
+     and the keyboard macro being defined, if any.  */
+  record_char (c);
+  if (! NILP (also_record))
+    record_char (also_record);
+
+  /* Wipe the echo area.
+     But first, if we are about to use an input method,
+     save the echo area contents for it to refer to.  */
+  if (INTEGERP (c)
+      && ! NILP (Vinput_method_function)
+      && ' ' <= XINT (c) && XINT (c) < 256 && XINT (c) != 127)
+    {
+      previous_echo_area_message = Fcurrent_message ();
+      Vinput_method_previous_message = previous_echo_area_message;
+    }
+
+  /* Now wipe the echo area, except for help events which do their
+     own stuff with the echo area.  */
+  if (!CONSP (c)
+      || (!(EQ (Qhelp_echo, XCAR (c)))
+         && !(EQ (Qswitch_frame, XCAR (c)))
+         /* Don't wipe echo area for select window events: These might
+            get delayed via `mouse-autoselect-window' (Bug#11304).  */
+         && !(EQ (Qselect_window, XCAR (c)))))
+    {
+      if (!NILP (echo_area_buffer[0]))
+       {
+         safe_run_hooks (Qecho_area_clear_hook);
+         clear_message (1, 0);
+       }
+    }
+
+ reread_for_input_method:
+ from_macro:
+  /* Pass this to the input method, if appropriate.  */
+  if (INTEGERP (c)
+      && ! NILP (Vinput_method_function)
+      /* Don't run the input method within a key sequence,
+        after the first event of the key sequence.  */
+      && NILP (prev_event)
+      && ' ' <= XINT (c) && XINT (c) < 256 && XINT (c) != 127)
+    {
+      Lisp_Object keys;
+      ptrdiff_t key_count;
+      bool key_count_reset;
+      ptrdiff_t command_key_start;
+      struct gcpro gcpro1;
+      ptrdiff_t count = SPECPDL_INDEX ();
+
+      /* Save the echo status.  */
+      bool saved_immediate_echo = current_kboard->immediate_echo;
+      struct kboard *saved_ok_to_echo = ok_to_echo_at_next_pause;
+      Lisp_Object saved_echo_string = KVAR (current_kboard, echo_string);
+      ptrdiff_t saved_echo_after_prompt = current_kboard->echo_after_prompt;
+
+#if 0
+      if (before_command_restore_flag)
+       {
+         this_command_key_count = before_command_key_count_1;
+         if (this_command_key_count < this_single_command_key_start)
+           this_single_command_key_start = this_command_key_count;
+         echo_truncate (before_command_echo_length_1);
+         before_command_restore_flag = 0;
+       }
+#endif
+
+      /* Save the this_command_keys status.  */
+      key_count = this_command_key_count;
+      key_count_reset = this_command_key_count_reset;
+      command_key_start = this_single_command_key_start;
+
+      if (key_count > 0)
+       keys = Fcopy_sequence (this_command_keys);
+      else
+       keys = Qnil;
+      GCPRO1 (keys);
+
+      /* Clear out this_command_keys.  */
+      this_command_key_count = 0;
+      this_command_key_count_reset = 0;
+      this_single_command_key_start = 0;
+
+      /* Now wipe the echo area.  */
+      if (!NILP (echo_area_buffer[0]))
+       safe_run_hooks (Qecho_area_clear_hook);
+      clear_message (1, 0);
+      echo_truncate (0);
+
+      /* If we are not reading a key sequence,
+        never use the echo area.  */
+      if (!KEYMAPP (map))
+       {
+         specbind (Qinput_method_use_echo_area, Qt);
+       }
+
+      /* Call the input method.  */
+      tem = call1 (Vinput_method_function, c);
+
+      tem = unbind_to (count, tem);
+
+      /* Restore the saved echoing state
+        and this_command_keys state.  */
+      this_command_key_count = key_count;
+      this_command_key_count_reset = key_count_reset;
+      this_single_command_key_start = command_key_start;
+      if (key_count > 0)
+       this_command_keys = keys;
+
+      cancel_echoing ();
+      ok_to_echo_at_next_pause = saved_ok_to_echo;
+      /* Do not restore the echo area string when the user is
+         introducing a prefix argument. Otherwise we end with
+         repetitions of the partially introduced prefix
+         argument. (bug#19875) */
+      if (NILP (intern ("prefix-arg")))
+        {
+          kset_echo_string (current_kboard, saved_echo_string);
+        }
+      current_kboard->echo_after_prompt = saved_echo_after_prompt;
+      if (saved_immediate_echo)
+       echo_now ();
+
+      UNGCPRO;
+
+      /* The input method can return no events.  */
+      if (! CONSP (tem))
+       {
+         /* Bring back the previous message, if any.  */
+         if (! NILP (previous_echo_area_message))
+           message_with_string ("%s", previous_echo_area_message, 0);
+         goto retry;
+       }
+      /* It returned one event or more.  */
+      c = XCAR (tem);
+      Vunread_post_input_method_events
+       = nconc2 (XCDR (tem), Vunread_post_input_method_events);
+    }
+
+ reread_first:
+
+  /* Display help if not echoing.  */
+  if (CONSP (c) && EQ (XCAR (c), Qhelp_echo))
+    {
+      /* (help-echo FRAME HELP WINDOW OBJECT POS).  */
+      Lisp_Object help, object, position, window, htem;
+
+      htem = Fcdr (XCDR (c));
+      help = Fcar (htem);
+      htem = Fcdr (htem);
+      window = Fcar (htem);
+      htem = Fcdr (htem);
+      object = Fcar (htem);
+      htem = Fcdr (htem);
+      position = Fcar (htem);
+
+      show_help_echo (help, window, object, position);
+
+      /* We stopped being idle for this event; undo that.  */
+      if (!end_time)
+       timer_resume_idle ();
+      goto retry;
+    }
+
+  if ((! reread || this_command_key_count == 0
+       || this_command_key_count_reset)
+      && !end_time)
+    {
+
+      /* Don't echo mouse motion events.  */
+      if (echo_keystrokes_p ()
+         && ! (EVENT_HAS_PARAMETERS (c)
+               && EQ (EVENT_HEAD_KIND (EVENT_HEAD (c)), Qmouse_movement)))
+       {
+         echo_char (c);
+         if (! NILP (also_record))
+           echo_char (also_record);
+         /* Once we reread a character, echoing can happen
+            the next time we pause to read a new one.  */
+         ok_to_echo_at_next_pause = current_kboard;
+       }
+
+      /* Record this character as part of the current key.  */
+      add_command_key (c);
+      if (! NILP (also_record))
+       add_command_key (also_record);
+    }
+
+  last_input_event = c;
+  num_input_events++;
+
+  /* Process the help character specially if enabled.  */
+  if (!NILP (Vhelp_form) && help_char_p (c))
+    {
+      ptrdiff_t count = SPECPDL_INDEX ();
+
+      help_form_saved_window_configs
+       = Fcons (Fcurrent_window_configuration (Qnil),
+                help_form_saved_window_configs);
+      record_unwind_protect_void (read_char_help_form_unwind);
+      call0 (Qhelp_form_show);
+
+      cancel_echoing ();
+      do
+       {
+         c = read_char (0, Qnil, Qnil, 0, NULL);
+         if (EVENT_HAS_PARAMETERS (c)
+             && EQ (EVENT_HEAD_KIND (EVENT_HEAD (c)), Qmouse_click))
+           XSETCAR (help_form_saved_window_configs, Qnil);
+       }
+      while (BUFFERP (c));
+      /* Remove the help from the frame.  */
+      unbind_to (count, Qnil);
+
+      redisplay ();
+      if (EQ (c, make_number (040)))
+       {
+         cancel_echoing ();
+         do
+           c = read_char (0, Qnil, Qnil, 0, NULL);
+         while (BUFFERP (c));
+       }
+    }
+
+ exit:
+  RESUME_POLLING;
+  input_was_pending = input_pending;
+  RETURN_UNGCPRO (c);
+}
+
+/* Record a key that came from a mouse menu.
+   Record it for echoing, for this-command-keys, and so on.  */
+
+static void
+record_menu_key (Lisp_Object c)
+{
+  /* Wipe the echo area.  */
+  clear_message (1, 0);
+
+  record_char (c);
+
+#if 0
+  before_command_key_count = this_command_key_count;
+  before_command_echo_length = echo_length ();
+#endif
+
+  /* Don't echo mouse motion events.  */
+  if (echo_keystrokes_p ())
+    {
+      echo_char (c);
+
+      /* Once we reread a character, echoing can happen
+        the next time we pause to read a new one.  */
+      ok_to_echo_at_next_pause = 0;
+    }
+
+  /* Record this character as part of the current key.  */
+  add_command_key (c);
+
+  /* Re-reading in the middle of a command.  */
+  last_input_event = c;
+  num_input_events++;
+}
+
+/* Return true if should recognize C as "the help character".  */
+
+static bool
+help_char_p (Lisp_Object c)
+{
+  Lisp_Object tail;
+
+  if (EQ (c, Vhelp_char))
+    return 1;
+  for (tail = Vhelp_event_list; CONSP (tail); tail = XCDR (tail))
+    if (EQ (c, XCAR (tail)))
+      return 1;
+  return 0;
+}
+
+/* Record the input event C in various ways.  */
+
+static void
+record_char (Lisp_Object c)
+{
+  int recorded = 0;
+
+  if (CONSP (c) && (EQ (XCAR (c), Qhelp_echo) || EQ (XCAR (c), 
Qmouse_movement)))
+    {
+      /* To avoid filling recent_keys with help-echo and mouse-movement
+        events, we filter out repeated help-echo events, only store the
+        first and last in a series of mouse-movement events, and don't
+        store repeated help-echo events which are only separated by
+        mouse-movement events.  */
+
+      Lisp_Object ev1, ev2, ev3;
+      int ix1, ix2, ix3;
+
+      if ((ix1 = recent_keys_index - 1) < 0)
+       ix1 = NUM_RECENT_KEYS - 1;
+      ev1 = AREF (recent_keys, ix1);
+
+      if ((ix2 = ix1 - 1) < 0)
+       ix2 = NUM_RECENT_KEYS - 1;
+      ev2 = AREF (recent_keys, ix2);
+
+      if ((ix3 = ix2 - 1) < 0)
+       ix3 = NUM_RECENT_KEYS - 1;
+      ev3 = AREF (recent_keys, ix3);
+
+      if (EQ (XCAR (c), Qhelp_echo))
+       {
+         /* Don't record `help-echo' in recent_keys unless it shows some help
+            message, and a different help than the previously recorded
+            event.  */
+         Lisp_Object help, last_help;
+
+         help = Fcar_safe (Fcdr_safe (XCDR (c)));
+         if (!STRINGP (help))
+           recorded = 1;
+         else if (CONSP (ev1) && EQ (XCAR (ev1), Qhelp_echo)
+                  && (last_help = Fcar_safe (Fcdr_safe (XCDR (ev1))), EQ 
(last_help, help)))
+           recorded = 1;
+         else if (CONSP (ev1) && EQ (XCAR (ev1), Qmouse_movement)
+                  && CONSP (ev2) && EQ (XCAR (ev2), Qhelp_echo)
+                  && (last_help = Fcar_safe (Fcdr_safe (XCDR (ev2))), EQ 
(last_help, help)))
+           recorded = -1;
+         else if (CONSP (ev1) && EQ (XCAR (ev1), Qmouse_movement)
+                  && CONSP (ev2) && EQ (XCAR (ev2), Qmouse_movement)
+                  && CONSP (ev3) && EQ (XCAR (ev3), Qhelp_echo)
+                  && (last_help = Fcar_safe (Fcdr_safe (XCDR (ev3))), EQ 
(last_help, help)))
+           recorded = -2;
+       }
+      else if (EQ (XCAR (c), Qmouse_movement))
+       {
+         /* Only record one pair of `mouse-movement' on a window in 
recent_keys.
+            So additional mouse movement events replace the last element.  */
+         Lisp_Object last_window, window;
+
+         window = Fcar_safe (Fcar_safe (XCDR (c)));
+         if (CONSP (ev1) && EQ (XCAR (ev1), Qmouse_movement)
+             && (last_window = Fcar_safe (Fcar_safe (XCDR (ev1))), EQ 
(last_window, window))
+             && CONSP (ev2) && EQ (XCAR (ev2), Qmouse_movement)
+             && (last_window = Fcar_safe (Fcar_safe (XCDR (ev2))), EQ 
(last_window, window)))
+           {
+             ASET (recent_keys, ix1, c);
+             recorded = 1;
+           }
+       }
+    }
+  else
+    store_kbd_macro_char (c);
+
+  if (!recorded)
+    {
+      total_keys += total_keys < NUM_RECENT_KEYS;
+      ASET (recent_keys, recent_keys_index, c);
+      if (++recent_keys_index >= NUM_RECENT_KEYS)
+       recent_keys_index = 0;
+    }
+  else if (recorded < 0)
+    {
+      /* We need to remove one or two events from recent_keys.
+         To do this, we simply put nil at those events and move the
+        recent_keys_index backwards over those events.  Usually,
+        users will never see those nil events, as they will be
+        overwritten by the command keys entered to see recent_keys
+        (e.g. C-h l).  */
+
+      while (recorded++ < 0 && total_keys > 0)
+       {
+         if (total_keys < NUM_RECENT_KEYS)
+           total_keys--;
+         if (--recent_keys_index < 0)
+           recent_keys_index = NUM_RECENT_KEYS - 1;
+         ASET (recent_keys, recent_keys_index, Qnil);
+       }
+    }
+
+  num_nonmacro_input_events++;
+
+  /* Write c to the dribble file.  If c is a lispy event, write
+     the event's symbol to the dribble file, in <brackets>.  Bleaugh.
+     If you, dear reader, have a better idea, you've got the source.  :-) */
+  if (dribble)
+    {
+      block_input ();
+      if (INTEGERP (c))
+       {
+         if (XUINT (c) < 0x100)
+           putc (XUINT (c), dribble);
+         else
+           fprintf (dribble, " 0x%"pI"x", XUINT (c));
+       }
+      else
+       {
+         Lisp_Object dribblee;
+
+         /* If it's a structured event, take the event header.  */
+         dribblee = EVENT_HEAD (c);
+
+         if (SYMBOLP (dribblee))
+           {
+             putc ('<', dribble);
+             fwrite (SDATA (SYMBOL_NAME (dribblee)), sizeof (char),
+                     SBYTES (SYMBOL_NAME (dribblee)),
+                     dribble);
+             putc ('>', dribble);
+           }
+       }
+
+      fflush (dribble);
+      unblock_input ();
+    }
+}
+
+/* Copy out or in the info on where C-g should throw to.
+   This is used when running Lisp code from within get_char,
+   in case get_char is called recursively.
+   See read_process_output.  */
+
+static void
+save_getcjmp (sys_jmp_buf temp)
+{
+  memcpy (temp, getcjmp, sizeof getcjmp);
+}
+
+static void
+restore_getcjmp (sys_jmp_buf temp)
+{
+  memcpy (getcjmp, temp, sizeof getcjmp);
+}
+
+/* Low level keyboard/mouse input.
+   kbd_buffer_store_event places events in kbd_buffer, and
+   kbd_buffer_get_event retrieves them.  */
+
+/* Return true if there are any events in the queue that read-char
+   would return.  If this returns false, a read-char would block.  */
+static bool
+readable_events (int flags)
+{
+  if (flags & READABLE_EVENTS_DO_TIMERS_NOW)
+    timer_check ();
+
+  /* If the buffer contains only FOCUS_IN_EVENT events, and
+     READABLE_EVENTS_FILTER_EVENTS is set, report it as empty.  */
+  if (kbd_fetch_ptr != kbd_store_ptr)
+    {
+      if (flags & (READABLE_EVENTS_FILTER_EVENTS
+#ifdef USE_TOOLKIT_SCROLL_BARS
+                  | READABLE_EVENTS_IGNORE_SQUEEZABLES
+#endif
+                  ))
+        {
+          struct input_event *event;
+
+          event = ((kbd_fetch_ptr < kbd_buffer + KBD_BUFFER_SIZE)
+                   ? kbd_fetch_ptr
+                   : kbd_buffer);
+
+         do
+           {
+             if (!(
+#ifdef USE_TOOLKIT_SCROLL_BARS
+                   (flags & READABLE_EVENTS_FILTER_EVENTS) &&
+#endif
+                   event->kind == FOCUS_IN_EVENT)
+#ifdef USE_TOOLKIT_SCROLL_BARS
+                 && !((flags & READABLE_EVENTS_IGNORE_SQUEEZABLES)
+                      && (event->kind == SCROLL_BAR_CLICK_EVENT
+                          || event->kind == HORIZONTAL_SCROLL_BAR_CLICK_EVENT)
+                      && event->part == scroll_bar_handle
+                      && event->modifiers == 0)
+#endif
+                 && !((flags & READABLE_EVENTS_FILTER_EVENTS)
+                      && event->kind == BUFFER_SWITCH_EVENT))
+               return 1;
+             event++;
+              if (event == kbd_buffer + KBD_BUFFER_SIZE)
+                event = kbd_buffer;
+           }
+         while (event != kbd_store_ptr);
+        }
+      else
+       return 1;
+    }
+
+  if (!(flags & READABLE_EVENTS_IGNORE_SQUEEZABLES)
+      && !NILP (do_mouse_tracking) && some_mouse_moved ())
+    return 1;
+  if (single_kboard)
+    {
+      if (current_kboard->kbd_queue_has_data)
+       return 1;
+    }
+  else
+    {
+      KBOARD *kb;
+      for (kb = all_kboards; kb; kb = kb->next_kboard)
+       if (kb->kbd_queue_has_data)
+         return 1;
+    }
+  return 0;
+}
+
+/* Set this for debugging, to have a way to get out */
+int stop_character EXTERNALLY_VISIBLE;
+
+static KBOARD *
+event_to_kboard (struct input_event *event)
+{
+  /* Not applicable for these special events.  */
+  if (event->kind == SELECTION_REQUEST_EVENT
+      || event->kind == SELECTION_CLEAR_EVENT)
+    return NULL;
+  else
+    {
+      Lisp_Object obj = event->frame_or_window;
+      /* There are some events that set this field to nil or string.  */
+      if (WINDOWP (obj))
+       obj = WINDOW_FRAME (XWINDOW (obj));
+      /* Also ignore dead frames here.  */
+      return ((FRAMEP (obj) && FRAME_LIVE_P (XFRAME (obj)))
+             ? FRAME_KBOARD (XFRAME (obj)) : NULL);
+    }
+}
+
+#ifdef subprocesses
+/* Return the number of slots occupied in kbd_buffer.  */
+
+static int
+kbd_buffer_nr_stored (void)
+{
+  return kbd_fetch_ptr == kbd_store_ptr
+    ? 0
+    : (kbd_fetch_ptr < kbd_store_ptr
+       ? kbd_store_ptr - kbd_fetch_ptr
+       : ((kbd_buffer + KBD_BUFFER_SIZE) - kbd_fetch_ptr
+          + (kbd_store_ptr - kbd_buffer)));
+}
+#endif /* Store an event obtained at interrupt level into kbd_buffer, fifo */
+
+void
+kbd_buffer_store_event (register struct input_event *event)
+{
+  kbd_buffer_store_event_hold (event, 0);
+}
+
+/* Store EVENT obtained at interrupt level into kbd_buffer, fifo.
+
+   If HOLD_QUIT is 0, just stuff EVENT into the fifo.
+   Else, if HOLD_QUIT.kind != NO_EVENT, discard EVENT.
+   Else, if EVENT is a quit event, store the quit event
+   in HOLD_QUIT, and return (thus ignoring further events).
+
+   This is used to postpone the processing of the quit event until all
+   subsequent input events have been parsed (and discarded).  */
+
+void
+kbd_buffer_store_event_hold (register struct input_event *event,
+                            struct input_event *hold_quit)
+{
+  if (event->kind == NO_EVENT)
+    emacs_abort ();
+
+  if (hold_quit && hold_quit->kind != NO_EVENT)
+    return;
+
+  if (event->kind == ASCII_KEYSTROKE_EVENT)
+    {
+      register int c = event->code & 0377;
+
+      if (event->modifiers & ctrl_modifier)
+       c = make_ctrl_char (c);
+
+      c |= (event->modifiers
+           & (meta_modifier | alt_modifier
+              | hyper_modifier | super_modifier));
+
+      if (c == quit_char)
+       {
+         KBOARD *kb = FRAME_KBOARD (XFRAME (event->frame_or_window));
+         struct input_event *sp;
+
+         if (single_kboard && kb != current_kboard)
+           {
+             kset_kbd_queue
+               (kb, list2 (make_lispy_switch_frame (event->frame_or_window),
+                           make_number (c)));
+             kb->kbd_queue_has_data = 1;
+             for (sp = kbd_fetch_ptr; sp != kbd_store_ptr; sp++)
+               {
+                 if (sp == kbd_buffer + KBD_BUFFER_SIZE)
+                   sp = kbd_buffer;
+
+                 if (event_to_kboard (sp) == kb)
+                   {
+                     sp->kind = NO_EVENT;
+                     sp->frame_or_window = Qnil;
+                     sp->arg = Qnil;
+                   }
+               }
+             return;
+           }
+
+         if (hold_quit)
+           {
+             *hold_quit = *event;
+             return;
+           }
+
+         /* If this results in a quit_char being returned to Emacs as
+            input, set Vlast_event_frame properly.  If this doesn't
+            get returned to Emacs as an event, the next event read
+            will set Vlast_event_frame again, so this is safe to do.  */
+         {
+           Lisp_Object focus;
+
+           focus = FRAME_FOCUS_FRAME (XFRAME (event->frame_or_window));
+           if (NILP (focus))
+             focus = event->frame_or_window;
+           internal_last_event_frame = focus;
+           Vlast_event_frame = focus;
+         }
+
+         handle_interrupt (0);
+         return;
+       }
+
+      if (c && c == stop_character)
+       {
+         sys_suspend ();
+         return;
+       }
+    }
+  /* Don't insert two BUFFER_SWITCH_EVENT's in a row.
+     Just ignore the second one.  */
+  else if (event->kind == BUFFER_SWITCH_EVENT
+          && kbd_fetch_ptr != kbd_store_ptr
+          && ((kbd_store_ptr == kbd_buffer
+               ? kbd_buffer + KBD_BUFFER_SIZE - 1
+               : kbd_store_ptr - 1)->kind) == BUFFER_SWITCH_EVENT)
+    return;
+
+  if (kbd_store_ptr - kbd_buffer == KBD_BUFFER_SIZE)
+    kbd_store_ptr = kbd_buffer;
+
+  /* Don't let the very last slot in the buffer become full,
+     since that would make the two pointers equal,
+     and that is indistinguishable from an empty buffer.
+     Discard the event if it would fill the last slot.  */
+  if (kbd_fetch_ptr - 1 != kbd_store_ptr)
+    {
+      *kbd_store_ptr = *event;
+      ++kbd_store_ptr;
+#ifdef subprocesses
+      if (kbd_buffer_nr_stored () > KBD_BUFFER_SIZE / 2
+         && ! kbd_on_hold_p ())
+        {
+          /* Don't read keyboard input until we have processed kbd_buffer.
+             This happens when pasting text longer than KBD_BUFFER_SIZE/2.  */
+          hold_keyboard_input ();
+          if (!noninteractive)
+            ignore_sigio ();
+          stop_polling ();
+        }
+#endif /* subprocesses */
+    }
+
+  /* If we're inside while-no-input, and this event qualifies
+     as input, set quit-flag to cause an interrupt.  */
+  if (!NILP (Vthrow_on_input)
+      && event->kind != FOCUS_IN_EVENT
+      && event->kind != FOCUS_OUT_EVENT
+      && event->kind != HELP_EVENT
+      && event->kind != ICONIFY_EVENT
+      && event->kind != DEICONIFY_EVENT)
+    {
+      Vquit_flag = Vthrow_on_input;
+      /* If we're inside a function that wants immediate quits,
+        do it now.  */
+      if (immediate_quit && NILP (Vinhibit_quit))
+       {
+         immediate_quit = 0;
+         QUIT;
+       }
+    }
+}
+
+
+/* Put an input event back in the head of the event queue.  */
+
+void
+kbd_buffer_unget_event (register struct input_event *event)
+{
+  if (kbd_fetch_ptr == kbd_buffer)
+    kbd_fetch_ptr = kbd_buffer + KBD_BUFFER_SIZE;
+
+  /* Don't let the very last slot in the buffer become full,  */
+  if (kbd_fetch_ptr - 1 != kbd_store_ptr)
+    {
+      --kbd_fetch_ptr;
+      *kbd_fetch_ptr = *event;
+    }
+}
+
+/* Limit help event positions to this range, to avoid overflow problems.  */
+#define INPUT_EVENT_POS_MAX \
+  ((ptrdiff_t) min (PTRDIFF_MAX, min (TYPE_MAXIMUM (Time) / 2, \
+                                     MOST_POSITIVE_FIXNUM)))
+#define INPUT_EVENT_POS_MIN (-1 - INPUT_EVENT_POS_MAX)
+
+/* Return a Time that encodes position POS.  POS must be in range.  */
+
+static Time
+position_to_Time (ptrdiff_t pos)
+{
+  eassert (INPUT_EVENT_POS_MIN <= pos && pos <= INPUT_EVENT_POS_MAX);
+  return pos;
+}
+
+/* Return the position that ENCODED_POS encodes.
+   Avoid signed integer overflow.  */
+
+static ptrdiff_t
+Time_to_position (Time encoded_pos)
+{
+  if (encoded_pos <= INPUT_EVENT_POS_MAX)
+    return encoded_pos;
+  Time encoded_pos_min = INPUT_EVENT_POS_MIN;
+  eassert (encoded_pos_min <= encoded_pos);
+  ptrdiff_t notpos = -1 - encoded_pos;
+  return -1 - notpos;
+}
+
+/* Generate a HELP_EVENT input_event and store it in the keyboard
+   buffer.
+
+   HELP is the help form.
+
+   FRAME and WINDOW are the frame and window where the help is
+   generated.  OBJECT is the Lisp object where the help was found (a
+   buffer, a string, an overlay, or nil if neither from a string nor
+   from a buffer).  POS is the position within OBJECT where the help
+   was found.  */
+
+void
+gen_help_event (Lisp_Object help, Lisp_Object frame, Lisp_Object window,
+               Lisp_Object object, ptrdiff_t pos)
+{
+  struct input_event event;
+
+  event.kind = HELP_EVENT;
+  event.frame_or_window = frame;
+  event.arg = object;
+  event.x = WINDOWP (window) ? window : frame;
+  event.y = help;
+  event.timestamp = position_to_Time (pos);
+  kbd_buffer_store_event (&event);
+}
+
+
+/* Store HELP_EVENTs for HELP on FRAME in the input queue.  */
+
+void
+kbd_buffer_store_help_event (Lisp_Object frame, Lisp_Object help)
+{
+  struct input_event event;
+
+  event.kind = HELP_EVENT;
+  event.frame_or_window = frame;
+  event.arg = Qnil;
+  event.x = Qnil;
+  event.y = help;
+  event.timestamp = 0;
+  kbd_buffer_store_event (&event);
+}
+
+
+/* Discard any mouse events in the event buffer by setting them to
+   NO_EVENT.  */
+void
+discard_mouse_events (void)
+{
+  struct input_event *sp;
+  for (sp = kbd_fetch_ptr; sp != kbd_store_ptr; sp++)
+    {
+      if (sp == kbd_buffer + KBD_BUFFER_SIZE)
+       sp = kbd_buffer;
+
+      if (sp->kind == MOUSE_CLICK_EVENT
+         || sp->kind == WHEEL_EVENT
+          || sp->kind == HORIZ_WHEEL_EVENT
+#ifdef HAVE_GPM
+         || sp->kind == GPM_CLICK_EVENT
+#endif
+         || sp->kind == SCROLL_BAR_CLICK_EVENT
+         || sp->kind == HORIZONTAL_SCROLL_BAR_CLICK_EVENT)
+       {
+         sp->kind = NO_EVENT;
+       }
+    }
+}
+
+
+/* Return true if there are any real events waiting in the event
+   buffer, not counting `NO_EVENT's.
+
+   Discard NO_EVENT events at the front of the input queue, possibly
+   leaving the input queue empty if there are no real input events.  */
+
+bool
+kbd_buffer_events_waiting (void)
+{
+  struct input_event *sp;
+
+  for (sp = kbd_fetch_ptr;
+       sp != kbd_store_ptr && sp->kind == NO_EVENT;
+       ++sp)
+    {
+      if (sp == kbd_buffer + KBD_BUFFER_SIZE)
+       sp = kbd_buffer;
+    }
+
+  kbd_fetch_ptr = sp;
+  return sp != kbd_store_ptr && sp->kind != NO_EVENT;
+}
+
+
+/* Clear input event EVENT.  */
+
+static void
+clear_event (struct input_event *event)
+{
+  event->kind = NO_EVENT;
+}
+
+
+/* Read one event from the event buffer, waiting if necessary.
+   The value is a Lisp object representing the event.
+   The value is nil for an event that should be ignored,
+   or that was handled here.
+   We always read and discard one event.  */
+
+static Lisp_Object
+kbd_buffer_get_event (KBOARD **kbp,
+                      bool *used_mouse_menu,
+                      struct timespec *end_time)
+{
+  Lisp_Object obj;
+
+#ifdef subprocesses
+  if (kbd_on_hold_p () && kbd_buffer_nr_stored () < KBD_BUFFER_SIZE / 4)
+    {
+      /* Start reading input again because we have processed enough to
+         be able to accept new events again.  */
+      unhold_keyboard_input ();
+      start_polling ();
+    }
+#endif /* subprocesses */
+
+#if !defined HAVE_DBUS && !defined USE_FILE_NOTIFY
+  if (noninteractive
+      /* In case we are running as a daemon, only do this before
+        detaching from the terminal.  */
+      || (IS_DAEMON && DAEMON_RUNNING))
+    {
+      int c = getchar ();
+      XSETINT (obj, c);
+      *kbp = current_kboard;
+      return obj;
+    }
+#endif /* !defined HAVE_DBUS && !defined USE_FILE_NOTIFY  */
+
+  /* Wait until there is input available.  */
+  for (;;)
+    {
+      /* Break loop if there's an unread command event.  Needed in
+        moused window autoselection which uses a timer to insert such
+        events.  */
+      if (CONSP (Vunread_command_events))
+       break;
+
+      if (kbd_fetch_ptr != kbd_store_ptr)
+       break;
+      if (!NILP (do_mouse_tracking) && some_mouse_moved ())
+       break;
+
+      /* If the quit flag is set, then read_char will return
+        quit_char, so that counts as "available input."  */
+      if (!NILP (Vquit_flag))
+       quit_throw_to_read_char (0);
+
+      /* One way or another, wait until input is available; then, if
+        interrupt handlers have not read it, read it now.  */
+
+#ifdef USABLE_SIGIO
+      gobble_input ();
+#endif
+      if (kbd_fetch_ptr != kbd_store_ptr)
+       break;
+      if (!NILP (do_mouse_tracking) && some_mouse_moved ())
+       break;
+      if (end_time)
+       {
+         struct timespec now = current_timespec ();
+         if (timespec_cmp (*end_time, now) <= 0)
+           return Qnil;        /* Finished waiting.  */
+         else
+           {
+             struct timespec duration = timespec_sub (*end_time, now);
+             wait_reading_process_output (min (duration.tv_sec,
+                                               WAIT_READING_MAX),
+                                          duration.tv_nsec,
+                                          -1, 1, Qnil, NULL, 0);
+           }
+       }
+      else
+       {
+         bool do_display = true;
+
+         if (FRAME_TERMCAP_P (SELECTED_FRAME ()))
+           {
+             struct tty_display_info *tty = CURTTY ();
+
+             /* When this TTY is displaying a menu, we must prevent
+                any redisplay, because we modify the frame's glyph
+                matrix behind the back of the display engine.  */
+             if (tty->showing_menu)
+               do_display = false;
+           }
+
+         wait_reading_process_output (0, 0, -1, do_display, Qnil, NULL, 0);
+       }
+
+      if (!interrupt_input && kbd_fetch_ptr == kbd_store_ptr)
+       gobble_input ();
+    }
+
+  if (CONSP (Vunread_command_events))
+    {
+      Lisp_Object first;
+      first = XCAR (Vunread_command_events);
+      Vunread_command_events = XCDR (Vunread_command_events);
+      *kbp = current_kboard;
+      return first;
+    }
+
+  /* At this point, we know that there is a readable event available
+     somewhere.  If the event queue is empty, then there must be a
+     mouse movement enabled and available.  */
+  if (kbd_fetch_ptr != kbd_store_ptr)
+    {
+      struct input_event *event;
+
+      event = ((kbd_fetch_ptr < kbd_buffer + KBD_BUFFER_SIZE)
+              ? kbd_fetch_ptr
+              : kbd_buffer);
+
+      *kbp = event_to_kboard (event);
+      if (*kbp == 0)
+       *kbp = current_kboard;  /* Better than returning null ptr?  */
+
+      obj = Qnil;
+
+      /* These two kinds of events get special handling
+        and don't actually appear to the command loop.
+        We return nil for them.  */
+      if (event->kind == SELECTION_REQUEST_EVENT
+         || event->kind == SELECTION_CLEAR_EVENT)
+       {
+#ifdef HAVE_X11
+         struct input_event copy;
+
+         /* Remove it from the buffer before processing it,
+            since otherwise swallow_events will see it
+            and process it again.  */
+         copy = *event;
+         kbd_fetch_ptr = event + 1;
+         input_pending = readable_events (0);
+         x_handle_selection_event (&copy);
+#else
+         /* We're getting selection request events, but we don't have
+             a window system.  */
+         emacs_abort ();
+#endif
+       }
+
+#if defined (HAVE_NS)
+      else if (event->kind == NS_TEXT_EVENT)
+        {
+          if (event->code == KEY_NS_PUT_WORKING_TEXT)
+            obj = list1 (intern ("ns-put-working-text"));
+          else
+            obj = list1 (intern ("ns-unput-working-text"));
+         kbd_fetch_ptr = event + 1;
+          if (used_mouse_menu)
+            *used_mouse_menu = 1;
+        }
+#endif
+
+#if defined (HAVE_X11) || defined (HAVE_NTGUI) \
+    || defined (HAVE_NS)
+      else if (event->kind == DELETE_WINDOW_EVENT)
+       {
+         /* Make an event (delete-frame (FRAME)).  */
+         obj = list2 (Qdelete_frame, list1 (event->frame_or_window));
+         kbd_fetch_ptr = event + 1;
+       }
+#endif
+#if defined (HAVE_X11) || defined (HAVE_NTGUI) \
+    || defined (HAVE_NS)
+      else if (event->kind == ICONIFY_EVENT)
+       {
+         /* Make an event (iconify-frame (FRAME)).  */
+         obj = list2 (Qiconify_frame, list1 (event->frame_or_window));
+         kbd_fetch_ptr = event + 1;
+       }
+      else if (event->kind == DEICONIFY_EVENT)
+       {
+         /* Make an event (make-frame-visible (FRAME)).  */
+         obj = list2 (Qmake_frame_visible, list1 (event->frame_or_window));
+         kbd_fetch_ptr = event + 1;
+       }
+#endif
+      else if (event->kind == BUFFER_SWITCH_EVENT)
+       {
+         /* The value doesn't matter here; only the type is tested.  */
+         XSETBUFFER (obj, current_buffer);
+         kbd_fetch_ptr = event + 1;
+       }
+#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) \
+    || defined (HAVE_NS) || defined (USE_GTK)
+      else if (event->kind == MENU_BAR_ACTIVATE_EVENT)
+       {
+         kbd_fetch_ptr = event + 1;
+         input_pending = readable_events (0);
+         if (FRAME_LIVE_P (XFRAME (event->frame_or_window)))
+           x_activate_menubar (XFRAME (event->frame_or_window));
+       }
+#endif
+#ifdef HAVE_NTGUI
+      else if (event->kind == LANGUAGE_CHANGE_EVENT)
+       {
+         /* Make an event (language-change FRAME CODEPAGE LANGUAGE-ID).  */
+         obj = list4 (Qlanguage_change,
+                      event->frame_or_window,
+                      make_number (event->code),
+                      make_number (event->modifiers));
+         kbd_fetch_ptr = event + 1;
+       }
+#endif
+#ifdef USE_FILE_NOTIFY
+      else if (event->kind == FILE_NOTIFY_EVENT)
+       {
+#ifdef HAVE_W32NOTIFY
+         /* Make an event (file-notify (DESCRIPTOR ACTION FILE) CALLBACK).  */
+         obj = list3 (Qfile_notify, event->arg, event->frame_or_window);
+#else
+          obj = make_lispy_event (event);
+#endif
+         kbd_fetch_ptr = event + 1;
+       }
+#endif /* USE_FILE_NOTIFY */
+      else if (event->kind == SAVE_SESSION_EVENT)
+        {
+          obj = list2 (Qsave_session, event->arg);
+         kbd_fetch_ptr = event + 1;
+        }
+      /* Just discard these, by returning nil.
+        With MULTI_KBOARD, these events are used as placeholders
+        when we need to randomly delete events from the queue.
+        (They shouldn't otherwise be found in the buffer,
+        but on some machines it appears they do show up
+        even without MULTI_KBOARD.)  */
+      /* On Windows NT/9X, NO_EVENT is used to delete extraneous
+         mouse events during a popup-menu call.  */
+      else if (event->kind == NO_EVENT)
+       kbd_fetch_ptr = event + 1;
+      else if (event->kind == HELP_EVENT)
+       {
+         Lisp_Object object, position, help, frame, window;
+
+         frame = event->frame_or_window;
+         object = event->arg;
+         position = make_number (Time_to_position (event->timestamp));
+         window = event->x;
+         help = event->y;
+         clear_event (event);
+
+         kbd_fetch_ptr = event + 1;
+         if (!WINDOWP (window))
+           window = Qnil;
+         obj = Fcons (Qhelp_echo,
+                      list5 (frame, help, window, object, position));
+       }
+      else if (event->kind == FOCUS_IN_EVENT)
+       {
+         /* Notification of a FocusIn event.  The frame receiving the
+            focus is in event->frame_or_window.  Generate a
+            switch-frame event if necessary.  */
+         Lisp_Object frame, focus;
+
+          frame = event->frame_or_window;
+          focus = FRAME_FOCUS_FRAME (XFRAME (frame));
+          if (FRAMEP (focus))
+            frame = focus;
+
+          if (
+#ifdef HAVE_X11
+              ! NILP (event->arg)
+              &&
+#endif
+              !EQ (frame, internal_last_event_frame)
+              && !EQ (frame, selected_frame))
+            obj = make_lispy_switch_frame (frame);
+          else
+            obj = make_lispy_focus_in (frame);
+
+          internal_last_event_frame = frame;
+          kbd_fetch_ptr = event + 1;
+        }
+      else if (event->kind == FOCUS_OUT_EVENT)
+        {
+#ifdef HAVE_WINDOW_SYSTEM
+
+          Display_Info *di;
+          Lisp_Object frame = event->frame_or_window;
+          bool focused = false;
+
+          for (di = x_display_list; di && ! focused; di = di->next)
+            focused = di->x_highlight_frame != 0;
+
+          if (!focused)
+           obj = make_lispy_focus_out (frame);
+
+#endif /* HAVE_WINDOW_SYSTEM */
+
+          kbd_fetch_ptr = event + 1;
+        }
+#ifdef HAVE_DBUS
+      else if (event->kind == DBUS_EVENT)
+       {
+         obj = make_lispy_event (event);
+         kbd_fetch_ptr = event + 1;
+       }
+#endif
+      else if (event->kind == CONFIG_CHANGED_EVENT)
+       {
+         obj = make_lispy_event (event);
+         kbd_fetch_ptr = event + 1;
+       }
+      else
+       {
+         /* If this event is on a different frame, return a switch-frame this
+            time, and leave the event in the queue for next time.  */
+         Lisp_Object frame;
+         Lisp_Object focus;
+
+         frame = event->frame_or_window;
+         if (CONSP (frame))
+           frame = XCAR (frame);
+         else if (WINDOWP (frame))
+           frame = WINDOW_FRAME (XWINDOW (frame));
+
+         focus = FRAME_FOCUS_FRAME (XFRAME (frame));
+         if (! NILP (focus))
+           frame = focus;
+
+         if (! EQ (frame, internal_last_event_frame)
+             && !EQ (frame, selected_frame))
+           obj = make_lispy_switch_frame (frame);
+         internal_last_event_frame = frame;
+
+         /* If we didn't decide to make a switch-frame event, go ahead
+            and build a real event from the queue entry.  */
+
+         if (NILP (obj))
+           {
+             obj = make_lispy_event (event);
+
+#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) \
+    || defined (HAVE_NS) || defined (USE_GTK)
+             /* If this was a menu selection, then set the flag to inhibit
+                writing to last_nonmenu_event.  Don't do this if the event
+                we're returning is (menu-bar), though; that indicates the
+                beginning of the menu sequence, and we might as well leave
+                that as the `event with parameters' for this selection.  */
+             if (used_mouse_menu
+                 && !EQ (event->frame_or_window, event->arg)
+                 && (event->kind == MENU_BAR_EVENT
+                     || event->kind == TOOL_BAR_EVENT))
+               *used_mouse_menu = 1;
+#endif
+#ifdef HAVE_NS
+             /* Certain system events are non-key events.  */
+             if (used_mouse_menu
+                  && event->kind == NS_NONKEY_EVENT)
+               *used_mouse_menu = 1;
+#endif
+
+             /* Wipe out this event, to catch bugs.  */
+             clear_event (event);
+             kbd_fetch_ptr = event + 1;
+           }
+       }
+    }
+  /* Try generating a mouse motion event.  */
+  else if (!NILP (do_mouse_tracking) && some_mouse_moved ())
+    {
+      struct frame *f = some_mouse_moved ();
+      Lisp_Object bar_window;
+      enum scroll_bar_part part;
+      Lisp_Object x, y;
+      Time t;
+
+      *kbp = current_kboard;
+      /* Note that this uses F to determine which terminal to look at.
+        If there is no valid info, it does not store anything
+        so x remains nil.  */
+      x = Qnil;
+
+      /* XXX Can f or mouse_position_hook be NULL here?  */
+      if (f && FRAME_TERMINAL (f)->mouse_position_hook)
+        (*FRAME_TERMINAL (f)->mouse_position_hook) (&f, 0, &bar_window,
+                                                    &part, &x, &y, &t);
+
+      obj = Qnil;
+
+      /* Decide if we should generate a switch-frame event.  Don't
+        generate switch-frame events for motion outside of all Emacs
+        frames.  */
+      if (!NILP (x) && f)
+       {
+         Lisp_Object frame;
+
+         frame = FRAME_FOCUS_FRAME (f);
+         if (NILP (frame))
+           XSETFRAME (frame, f);
+
+         if (! EQ (frame, internal_last_event_frame)
+             && !EQ (frame, selected_frame))
+           obj = make_lispy_switch_frame (frame);
+         internal_last_event_frame = frame;
+       }
+
+      /* If we didn't decide to make a switch-frame event, go ahead and
+        return a mouse-motion event.  */
+      if (!NILP (x) && NILP (obj))
+       obj = make_lispy_movement (f, bar_window, part, x, y, t);
+    }
+  else
+    /* We were promised by the above while loop that there was
+       something for us to read!  */
+    emacs_abort ();
+
+  input_pending = readable_events (0);
+
+  Vlast_event_frame = internal_last_event_frame;
+
+  return (obj);
+}
+
+/* Process any non-user-visible events (currently X selection events),
+   without reading any user-visible events.  */
+
+static void
+process_special_events (void)
+{
+  struct input_event *event;
+
+  for (event = kbd_fetch_ptr; event != kbd_store_ptr; ++event)
+    {
+      if (event == kbd_buffer + KBD_BUFFER_SIZE)
+       {
+         event = kbd_buffer;
+         if (event == kbd_store_ptr)
+           break;
+       }
+
+      /* If we find a stored X selection request, handle it now.  */
+      if (event->kind == SELECTION_REQUEST_EVENT
+         || event->kind == SELECTION_CLEAR_EVENT)
+       {
+#ifdef HAVE_X11
+
+         /* Remove the event from the fifo buffer before processing;
+            otherwise swallow_events called recursively could see it
+            and process it again.  To do this, we move the events
+            between kbd_fetch_ptr and EVENT one slot to the right,
+            cyclically.  */
+
+         struct input_event copy = *event;
+         struct input_event *beg
+           = (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE)
+           ? kbd_buffer : kbd_fetch_ptr;
+
+         if (event > beg)
+           memmove (beg + 1, beg, (event - beg) * sizeof (struct input_event));
+         else if (event < beg)
+           {
+             if (event > kbd_buffer)
+               memmove (kbd_buffer + 1, kbd_buffer,
+                        (event - kbd_buffer) * sizeof (struct input_event));
+             *kbd_buffer = *(kbd_buffer + KBD_BUFFER_SIZE - 1);
+             if (beg < kbd_buffer + KBD_BUFFER_SIZE - 1)
+               memmove (beg + 1, beg,
+                        (kbd_buffer + KBD_BUFFER_SIZE - 1 - beg)
+                        * sizeof (struct input_event));
+           }
+
+         if (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE)
+           kbd_fetch_ptr = kbd_buffer + 1;
+         else
+           kbd_fetch_ptr++;
+
+         input_pending = readable_events (0);
+         x_handle_selection_event (&copy);
+#else
+         /* We're getting selection request events, but we don't have
+             a window system.  */
+         emacs_abort ();
+#endif
+       }
+    }
+}
+
+/* Process any events that are not user-visible, run timer events that
+   are ripe, and return, without reading any user-visible events.  */
+
+void
+swallow_events (bool do_display)
+{
+  unsigned old_timers_run;
+
+  process_special_events ();
+
+  old_timers_run = timers_run;
+  get_input_pending (READABLE_EVENTS_DO_TIMERS_NOW);
+
+  if (!input_pending && timers_run != old_timers_run && do_display)
+    redisplay_preserve_echo_area (7);
+}
+
+/* Record the start of when Emacs is idle,
+   for the sake of running idle-time timers.  */
+
+static void
+timer_start_idle (void)
+{
+  /* If we are already in the idle state, do nothing.  */
+  if (timespec_valid_p (timer_idleness_start_time))
+    return;
+
+  timer_idleness_start_time = current_timespec ();
+  timer_last_idleness_start_time = timer_idleness_start_time;
+
+  /* Mark all idle-time timers as once again candidates for running.  */
+  call0 (intern ("internal-timer-start-idle"));
+}
+
+/* Record that Emacs is no longer idle, so stop running idle-time timers.  */
+
+static void
+timer_stop_idle (void)
+{
+  timer_idleness_start_time = invalid_timespec ();
+}
+
+/* Resume idle timer from last idle start time.  */
+
+static void
+timer_resume_idle (void)
+{
+  if (timespec_valid_p (timer_idleness_start_time))
+    return;
+
+  timer_idleness_start_time = timer_last_idleness_start_time;
+}
+
+/* This is only for debugging.  */
+struct input_event last_timer_event EXTERNALLY_VISIBLE;
+
+/* List of elisp functions to call, delayed because they were generated in
+   a context where Elisp could not be safely run (e.g. redisplay, signal,
+   ...).  Each element has the form (FUN . ARGS).  */
+Lisp_Object pending_funcalls;
+
+/* Return true if TIMER is a valid timer, placing its value into *RESULT.  */
+static bool
+decode_timer (Lisp_Object timer, struct timespec *result)
+{
+  Lisp_Object *vec;
+
+  if (! (VECTORP (timer) && ASIZE (timer) == 9))
+    return 0;
+  vec = XVECTOR (timer)->contents;
+  if (! NILP (vec[0]))
+    return 0;
+  if (! INTEGERP (vec[2]))
+    return false;
+
+  struct lisp_time t;
+  if (decode_time_components (vec[1], vec[2], vec[3], vec[8], &t, 0) <= 0)
+    return false;
+  *result = lisp_to_timespec (t);
+  return timespec_valid_p (*result);
+}
+
+
+/* Check whether a timer has fired.  To prevent larger problems we simply
+   disregard elements that are not proper timers.  Do not make a circular
+   timer list for the time being.
+
+   Returns the time to wait until the next timer fires.  If a
+   timer is triggering now, return zero.
+   If no timer is active, return -1.
+
+   If a timer is ripe, we run it, with quitting turned off.
+   In that case we return 0 to indicate that a new timer_check_2 call
+   should be done.  */
+
+static struct timespec
+timer_check_2 (Lisp_Object timers, Lisp_Object idle_timers)
+{
+  struct timespec nexttime;
+  struct timespec now;
+  struct timespec idleness_now;
+  Lisp_Object chosen_timer;
+  struct gcpro gcpro1;
+
+  nexttime = invalid_timespec ();
+
+  chosen_timer = Qnil;
+  GCPRO1 (chosen_timer);
+
+  /* First run the code that was delayed.  */
+  while (CONSP (pending_funcalls))
+    {
+      Lisp_Object funcall = XCAR (pending_funcalls);
+      pending_funcalls = XCDR (pending_funcalls);
+      safe_call2 (Qapply, XCAR (funcall), XCDR (funcall));
+    }
+
+  if (CONSP (timers) || CONSP (idle_timers))
+    {
+      now = current_timespec ();
+      idleness_now = (timespec_valid_p (timer_idleness_start_time)
+                     ? timespec_sub (now, timer_idleness_start_time)
+                     : make_timespec (0, 0));
+    }
+
+  while (CONSP (timers) || CONSP (idle_timers))
+    {
+      Lisp_Object timer = Qnil, idle_timer = Qnil;
+      struct timespec timer_time, idle_timer_time;
+      struct timespec difference;
+      struct timespec timer_difference = invalid_timespec ();
+      struct timespec idle_timer_difference = invalid_timespec ();
+      bool ripe, timer_ripe = 0, idle_timer_ripe = 0;
+
+      /* Set TIMER and TIMER_DIFFERENCE
+        based on the next ordinary timer.
+        TIMER_DIFFERENCE is the distance in time from NOW to when
+        this timer becomes ripe.
+         Skip past invalid timers and timers already handled.  */
+      if (CONSP (timers))
+       {
+         timer = XCAR (timers);
+         if (! decode_timer (timer, &timer_time))
+           {
+             timers = XCDR (timers);
+             continue;
+           }
+
+         timer_ripe = timespec_cmp (timer_time, now) <= 0;
+         timer_difference = (timer_ripe
+                             ? timespec_sub (now, timer_time)
+                             : timespec_sub (timer_time, now));
+       }
+
+      /* Likewise for IDLE_TIMER and IDLE_TIMER_DIFFERENCE
+        based on the next idle timer.  */
+      if (CONSP (idle_timers))
+       {
+         idle_timer = XCAR (idle_timers);
+         if (! decode_timer (idle_timer, &idle_timer_time))
+           {
+             idle_timers = XCDR (idle_timers);
+             continue;
+           }
+
+         idle_timer_ripe = timespec_cmp (idle_timer_time, idleness_now) <= 0;
+         idle_timer_difference
+           = (idle_timer_ripe
+              ? timespec_sub (idleness_now, idle_timer_time)
+              : timespec_sub (idle_timer_time, idleness_now));
+       }
+
+      /* Decide which timer is the next timer,
+        and set CHOSEN_TIMER, DIFFERENCE, and RIPE accordingly.
+        Also step down the list where we found that timer.  */
+
+      if (timespec_valid_p (timer_difference)
+         && (! timespec_valid_p (idle_timer_difference)
+             || idle_timer_ripe < timer_ripe
+             || (idle_timer_ripe == timer_ripe
+                 && ((timer_ripe
+                      ? timespec_cmp (idle_timer_difference,
+                                      timer_difference)
+                      : timespec_cmp (timer_difference,
+                                      idle_timer_difference))
+                     < 0))))
+       {
+         chosen_timer = timer;
+         timers = XCDR (timers);
+         difference = timer_difference;
+         ripe = timer_ripe;
+       }
+      else
+       {
+         chosen_timer = idle_timer;
+         idle_timers = XCDR (idle_timers);
+         difference = idle_timer_difference;
+         ripe = idle_timer_ripe;
+       }
+
+      /* If timer is ripe, run it if it hasn't been run.  */
+      if (ripe)
+       {
+         if (NILP (AREF (chosen_timer, 0)))
+           {
+             ptrdiff_t count = SPECPDL_INDEX ();
+             Lisp_Object old_deactivate_mark = Vdeactivate_mark;
+
+             /* Mark the timer as triggered to prevent problems if the lisp
+                code fails to reschedule it right.  */
+             ASET (chosen_timer, 0, Qt);
+
+             specbind (Qinhibit_quit, Qt);
+
+             call1 (Qtimer_event_handler, chosen_timer);
+             Vdeactivate_mark = old_deactivate_mark;
+             timers_run++;
+             unbind_to (count, Qnil);
+
+             /* Since we have handled the event,
+                we don't need to tell the caller to wake up and do it.  */
+              /* But the caller must still wait for the next timer, so
+                 return 0 to indicate that.  */
+           }
+
+         nexttime = make_timespec (0, 0);
+          break;
+       }
+      else
+       /* When we encounter a timer that is still waiting,
+          return the amount of time to wait before it is ripe.  */
+       {
+         UNGCPRO;
+         return difference;
+       }
+    }
+
+  /* No timers are pending in the future.  */
+  /* Return 0 if we generated an event, and -1 if not.  */
+  UNGCPRO;
+  return nexttime;
+}
+
+
+/* Check whether a timer has fired.  To prevent larger problems we simply
+   disregard elements that are not proper timers.  Do not make a circular
+   timer list for the time being.
+
+   Returns the time to wait until the next timer fires.
+   If no timer is active, return an invalid value.
+
+   As long as any timer is ripe, we run it.  */
+
+struct timespec
+timer_check (void)
+{
+  struct timespec nexttime;
+  Lisp_Object timers, idle_timers;
+  struct gcpro gcpro1, gcpro2;
+
+  Lisp_Object tem = Vinhibit_quit;
+  Vinhibit_quit = Qt;
+
+  /* We use copies of the timers' lists to allow a timer to add itself
+     again, without locking up Emacs if the newly added timer is
+     already ripe when added.  */
+
+  /* Always consider the ordinary timers.  */
+  timers = Fcopy_sequence (Vtimer_list);
+  /* Consider the idle timers only if Emacs is idle.  */
+  if (timespec_valid_p (timer_idleness_start_time))
+    idle_timers = Fcopy_sequence (Vtimer_idle_list);
+  else
+    idle_timers = Qnil;
+
+  Vinhibit_quit = tem;
+
+  GCPRO2 (timers, idle_timers);
+
+  do
+    {
+      nexttime = timer_check_2 (timers, idle_timers);
+    }
+  while (nexttime.tv_sec == 0 && nexttime.tv_nsec == 0);
+
+  UNGCPRO;
+  return nexttime;
+}
+
+DEFUN ("current-idle-time", Fcurrent_idle_time, Scurrent_idle_time, 0, 0, 0,
+       doc: /* Return the current length of Emacs idleness, or nil.
+The value when Emacs is idle is a list of four integers (HIGH LOW USEC PSEC)
+in the same style as (current-time).
+
+The value when Emacs is not idle is nil.
+
+PSEC is a multiple of the system clock resolution.  */)
+  (void)
+{
+  if (timespec_valid_p (timer_idleness_start_time))
+    return make_lisp_time (timespec_sub (current_timespec (),
+                                        timer_idleness_start_time));
+
+  return Qnil;
+}
+
+/* Caches for modify_event_symbol.  */
+static Lisp_Object accent_key_syms;
+static Lisp_Object func_key_syms;
+static Lisp_Object mouse_syms;
+static Lisp_Object wheel_syms;
+static Lisp_Object drag_n_drop_syms;
+
+/* This is a list of keysym codes for special "accent" characters.
+   It parallels lispy_accent_keys.  */
+
+static const int lispy_accent_codes[] =
+{
+#ifdef XK_dead_circumflex
+  XK_dead_circumflex,
+#else
+  0,
+#endif
+#ifdef XK_dead_grave
+  XK_dead_grave,
+#else
+  0,
+#endif
+#ifdef XK_dead_tilde
+  XK_dead_tilde,
+#else
+  0,
+#endif
+#ifdef XK_dead_diaeresis
+  XK_dead_diaeresis,
+#else
+  0,
+#endif
+#ifdef XK_dead_macron
+  XK_dead_macron,
+#else
+  0,
+#endif
+#ifdef XK_dead_degree
+  XK_dead_degree,
+#else
+  0,
+#endif
+#ifdef XK_dead_acute
+  XK_dead_acute,
+#else
+  0,
+#endif
+#ifdef XK_dead_cedilla
+  XK_dead_cedilla,
+#else
+  0,
+#endif
+#ifdef XK_dead_breve
+  XK_dead_breve,
+#else
+  0,
+#endif
+#ifdef XK_dead_ogonek
+  XK_dead_ogonek,
+#else
+  0,
+#endif
+#ifdef XK_dead_caron
+  XK_dead_caron,
+#else
+  0,
+#endif
+#ifdef XK_dead_doubleacute
+  XK_dead_doubleacute,
+#else
+  0,
+#endif
+#ifdef XK_dead_abovedot
+  XK_dead_abovedot,
+#else
+  0,
+#endif
+#ifdef XK_dead_abovering
+  XK_dead_abovering,
+#else
+  0,
+#endif
+#ifdef XK_dead_iota
+  XK_dead_iota,
+#else
+  0,
+#endif
+#ifdef XK_dead_belowdot
+  XK_dead_belowdot,
+#else
+  0,
+#endif
+#ifdef XK_dead_voiced_sound
+  XK_dead_voiced_sound,
+#else
+  0,
+#endif
+#ifdef XK_dead_semivoiced_sound
+  XK_dead_semivoiced_sound,
+#else
+  0,
+#endif
+#ifdef XK_dead_hook
+  XK_dead_hook,
+#else
+  0,
+#endif
+#ifdef XK_dead_horn
+  XK_dead_horn,
+#else
+  0,
+#endif
+};
+
+/* This is a list of Lisp names for special "accent" characters.
+   It parallels lispy_accent_codes.  */
+
+static const char *const lispy_accent_keys[] =
+{
+  "dead-circumflex",
+  "dead-grave",
+  "dead-tilde",
+  "dead-diaeresis",
+  "dead-macron",
+  "dead-degree",
+  "dead-acute",
+  "dead-cedilla",
+  "dead-breve",
+  "dead-ogonek",
+  "dead-caron",
+  "dead-doubleacute",
+  "dead-abovedot",
+  "dead-abovering",
+  "dead-iota",
+  "dead-belowdot",
+  "dead-voiced-sound",
+  "dead-semivoiced-sound",
+  "dead-hook",
+  "dead-horn",
+};
+
+#ifdef HAVE_NTGUI
+#define FUNCTION_KEY_OFFSET 0x0
+
+const char *const lispy_function_keys[] =
+  {
+    0,                /* 0                      */
+
+    0,                /* VK_LBUTTON        0x01 */
+    0,                /* VK_RBUTTON        0x02 */
+    "cancel",         /* VK_CANCEL         0x03 */
+    0,                /* VK_MBUTTON        0x04 */
+
+    0, 0, 0,          /*    0x05 .. 0x07        */
+
+    "backspace",      /* VK_BACK           0x08 */
+    "tab",            /* VK_TAB            0x09 */
+
+    0, 0,             /*    0x0A .. 0x0B        */
+
+    "clear",          /* VK_CLEAR          0x0C */
+    "return",         /* VK_RETURN         0x0D */
+
+    0, 0,             /*    0x0E .. 0x0F        */
+
+    0,                /* VK_SHIFT          0x10 */
+    0,                /* VK_CONTROL        0x11 */
+    0,                /* VK_MENU           0x12 */
+    "pause",          /* VK_PAUSE          0x13 */
+    "capslock",       /* VK_CAPITAL        0x14 */
+    "kana",           /* VK_KANA/VK_HANGUL 0x15 */
+    0,                /*    0x16                */
+    "junja",          /* VK_JUNJA          0x17 */
+    "final",          /* VK_FINAL          0x18 */
+    "kanji",          /* VK_KANJI/VK_HANJA 0x19 */
+    0,                /*    0x1A                */
+    "escape",         /* VK_ESCAPE         0x1B */
+    "convert",        /* VK_CONVERT        0x1C */
+    "non-convert",    /* VK_NONCONVERT     0x1D */
+    "accept",         /* VK_ACCEPT         0x1E */
+    "mode-change",    /* VK_MODECHANGE     0x1F */
+    0,                /* VK_SPACE          0x20 */
+    "prior",          /* VK_PRIOR          0x21 */
+    "next",           /* VK_NEXT           0x22 */
+    "end",            /* VK_END            0x23 */
+    "home",           /* VK_HOME           0x24 */
+    "left",           /* VK_LEFT           0x25 */
+    "up",             /* VK_UP             0x26 */
+    "right",          /* VK_RIGHT          0x27 */
+    "down",           /* VK_DOWN           0x28 */
+    "select",         /* VK_SELECT         0x29 */
+    "print",          /* VK_PRINT          0x2A */
+    "execute",        /* VK_EXECUTE        0x2B */
+    "snapshot",       /* VK_SNAPSHOT       0x2C */
+    "insert",         /* VK_INSERT         0x2D */
+    "delete",         /* VK_DELETE         0x2E */
+    "help",           /* VK_HELP           0x2F */
+
+    /* VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39) */
+
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+    0, 0, 0, 0, 0, 0, 0, /* 0x3A .. 0x40       */
+
+    /* VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A) */
+
+    0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,
+
+    "lwindow",       /* VK_LWIN           0x5B */
+    "rwindow",       /* VK_RWIN           0x5C */
+    "apps",          /* VK_APPS           0x5D */
+    0,               /*    0x5E                */
+    "sleep",
+    "kp-0",          /* VK_NUMPAD0        0x60 */
+    "kp-1",          /* VK_NUMPAD1        0x61 */
+    "kp-2",          /* VK_NUMPAD2        0x62 */
+    "kp-3",          /* VK_NUMPAD3        0x63 */
+    "kp-4",          /* VK_NUMPAD4        0x64 */
+    "kp-5",          /* VK_NUMPAD5        0x65 */
+    "kp-6",          /* VK_NUMPAD6        0x66 */
+    "kp-7",          /* VK_NUMPAD7        0x67 */
+    "kp-8",          /* VK_NUMPAD8        0x68 */
+    "kp-9",          /* VK_NUMPAD9        0x69 */
+    "kp-multiply",   /* VK_MULTIPLY       0x6A */
+    "kp-add",        /* VK_ADD            0x6B */
+    "kp-separator",  /* VK_SEPARATOR      0x6C */
+    "kp-subtract",   /* VK_SUBTRACT       0x6D */
+    "kp-decimal",    /* VK_DECIMAL        0x6E */
+    "kp-divide",     /* VK_DIVIDE         0x6F */
+    "f1",            /* VK_F1             0x70 */
+    "f2",            /* VK_F2             0x71 */
+    "f3",            /* VK_F3             0x72 */
+    "f4",            /* VK_F4             0x73 */
+    "f5",            /* VK_F5             0x74 */
+    "f6",            /* VK_F6             0x75 */
+    "f7",            /* VK_F7             0x76 */
+    "f8",            /* VK_F8             0x77 */
+    "f9",            /* VK_F9             0x78 */
+    "f10",           /* VK_F10            0x79 */
+    "f11",           /* VK_F11            0x7A */
+    "f12",           /* VK_F12            0x7B */
+    "f13",           /* VK_F13            0x7C */
+    "f14",           /* VK_F14            0x7D */
+    "f15",           /* VK_F15            0x7E */
+    "f16",           /* VK_F16            0x7F */
+    "f17",           /* VK_F17            0x80 */
+    "f18",           /* VK_F18            0x81 */
+    "f19",           /* VK_F19            0x82 */
+    "f20",           /* VK_F20            0x83 */
+    "f21",           /* VK_F21            0x84 */
+    "f22",           /* VK_F22            0x85 */
+    "f23",           /* VK_F23            0x86 */
+    "f24",           /* VK_F24            0x87 */
+
+    0, 0, 0, 0,      /*    0x88 .. 0x8B        */
+    0, 0, 0, 0,      /*    0x8C .. 0x8F        */
+
+    "kp-numlock",    /* VK_NUMLOCK        0x90 */
+    "scroll",        /* VK_SCROLL         0x91 */
+    /* Not sure where the following block comes from.
+       Windows headers have NEC and Fujitsu specific keys in
+       this block, but nothing generic.  */
+    "kp-space",             /* VK_NUMPAD_CLEAR   0x92 */
+    "kp-enter",             /* VK_NUMPAD_ENTER   0x93 */
+    "kp-prior",             /* VK_NUMPAD_PRIOR   0x94 */
+    "kp-next",      /* VK_NUMPAD_NEXT    0x95 */
+    "kp-end",       /* VK_NUMPAD_END     0x96 */
+    "kp-home",      /* VK_NUMPAD_HOME    0x97 */
+    "kp-left",      /* VK_NUMPAD_LEFT    0x98 */
+    "kp-up",        /* VK_NUMPAD_UP      0x99 */
+    "kp-right",             /* VK_NUMPAD_RIGHT   0x9A */
+    "kp-down",      /* VK_NUMPAD_DOWN    0x9B */
+    "kp-insert",     /* VK_NUMPAD_INSERT  0x9C */
+    "kp-delete",     /* VK_NUMPAD_DELETE  0x9D */
+
+    0, 0,           /*    0x9E .. 0x9F        */
+
+    /*
+     * VK_L* & VK_R* - left and right Alt, Ctrl and Shift virtual keys.
+     * Used only as parameters to GetAsyncKeyState and GetKeyState.
+     * No other API or message will distinguish left and right keys this way.
+     * 0xA0 .. 0xA5
+     */
+    0, 0, 0, 0, 0, 0,
+
+    /* Multimedia keys. These are handled as WM_APPCOMMAND, which allows us
+       to enable them selectively, and gives access to a few more functions.
+       See lispy_multimedia_keys below.  */
+    0, 0, 0, 0, 0, 0, 0, /* 0xA6 .. 0xAC        Browser */
+    0, 0, 0,             /* 0xAD .. 0xAF         Volume */
+    0, 0, 0, 0,          /* 0xB0 .. 0xB3          Media */
+    0, 0, 0, 0,          /* 0xB4 .. 0xB7           Apps */
+
+    /* 0xB8 .. 0xC0 "OEM" keys - all seem to be punctuation.  */
+    0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+    /* 0xC1 - 0xDA unallocated, 0xDB-0xDF more OEM keys */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+
+    0,               /* 0xE0                   */
+    "ax",            /* VK_OEM_AX         0xE1 */
+    0,               /* VK_OEM_102        0xE2 */
+    "ico-help",      /* VK_ICO_HELP       0xE3 */
+    "ico-00",        /* VK_ICO_00         0xE4 */
+    0,               /* VK_PROCESSKEY     0xE5 - used by IME */
+    "ico-clear",     /* VK_ICO_CLEAR      0xE6 */
+    0,               /* VK_PACKET         0xE7  - used to pass Unicode chars */
+    0,               /*                   0xE8 */
+    "reset",         /* VK_OEM_RESET      0xE9 */
+    "jump",          /* VK_OEM_JUMP       0xEA */
+    "oem-pa1",       /* VK_OEM_PA1        0xEB */
+    "oem-pa2",       /* VK_OEM_PA2        0xEC */
+    "oem-pa3",       /* VK_OEM_PA3        0xED */
+    "wsctrl",        /* VK_OEM_WSCTRL     0xEE */
+    "cusel",         /* VK_OEM_CUSEL      0xEF */
+    "oem-attn",      /* VK_OEM_ATTN       0xF0 */
+    "finish",        /* VK_OEM_FINISH     0xF1 */
+    "copy",          /* VK_OEM_COPY       0xF2 */
+    "auto",          /* VK_OEM_AUTO       0xF3 */
+    "enlw",          /* VK_OEM_ENLW       0xF4 */
+    "backtab",       /* VK_OEM_BACKTAB    0xF5 */
+    "attn",          /* VK_ATTN           0xF6 */
+    "crsel",         /* VK_CRSEL          0xF7 */
+    "exsel",         /* VK_EXSEL          0xF8 */
+    "ereof",         /* VK_EREOF          0xF9 */
+    "play",          /* VK_PLAY           0xFA */
+    "zoom",          /* VK_ZOOM           0xFB */
+    "noname",        /* VK_NONAME         0xFC */
+    "pa1",           /* VK_PA1            0xFD */
+    "oem_clear",     /* VK_OEM_CLEAR      0xFE */
+    0 /* 0xFF */
+  };
+
+/* Some of these duplicate the "Media keys" on newer keyboards,
+   but they are delivered to the application in a different way.  */
+static const char *const lispy_multimedia_keys[] =
+  {
+    0,
+    "browser-back",
+    "browser-forward",
+    "browser-refresh",
+    "browser-stop",
+    "browser-search",
+    "browser-favorites",
+    "browser-home",
+    "volume-mute",
+    "volume-down",
+    "volume-up",
+    "media-next",
+    "media-previous",
+    "media-stop",
+    "media-play-pause",
+    "mail",
+    "media-select",
+    "app-1",
+    "app-2",
+    "bass-down",
+    "bass-boost",
+    "bass-up",
+    "treble-down",
+    "treble-up",
+    "mic-volume-mute",
+    "mic-volume-down",
+    "mic-volume-up",
+    "help",
+    "find",
+    "new",
+    "open",
+    "close",
+    "save",
+    "print",
+    "undo",
+    "redo",
+    "copy",
+    "cut",
+    "paste",
+    "mail-reply",
+    "mail-forward",
+    "mail-send",
+    "spell-check",
+    "toggle-dictate-command",
+    "mic-toggle",
+    "correction-list",
+    "media-play",
+    "media-pause",
+    "media-record",
+    "media-fast-forward",
+    "media-rewind",
+    "media-channel-up",
+    "media-channel-down"
+  };
+
+#else /* not HAVE_NTGUI */
+
+/* This should be dealt with in XTread_socket now, and that doesn't
+   depend on the client system having the Kana syms defined.  See also
+   the XK_kana_A case below.  */
+#if 0
+#ifdef XK_kana_A
+static const char *const lispy_kana_keys[] =
+  {
+    /* X Keysym value */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   /* 0x400 .. 0x40f */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   /* 0x410 .. 0x41f */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   /* 0x420 .. 0x42f */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   /* 0x430 .. 0x43f */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   /* 0x440 .. 0x44f */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   /* 0x450 .. 0x45f */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   /* 0x460 .. 0x46f */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,"overline",0,
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   /* 0x480 .. 0x48f */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   /* 0x490 .. 0x49f */
+    0, "kana-fullstop", "kana-openingbracket", "kana-closingbracket",
+    "kana-comma", "kana-conjunctive", "kana-WO", "kana-a",
+    "kana-i", "kana-u", "kana-e", "kana-o",
+    "kana-ya", "kana-yu", "kana-yo", "kana-tsu",
+    "prolongedsound", "kana-A", "kana-I", "kana-U",
+    "kana-E", "kana-O", "kana-KA", "kana-KI",
+    "kana-KU", "kana-KE", "kana-KO", "kana-SA",
+    "kana-SHI", "kana-SU", "kana-SE", "kana-SO",
+    "kana-TA", "kana-CHI", "kana-TSU", "kana-TE",
+    "kana-TO", "kana-NA", "kana-NI", "kana-NU",
+    "kana-NE", "kana-NO", "kana-HA", "kana-HI",
+    "kana-FU", "kana-HE", "kana-HO", "kana-MA",
+    "kana-MI", "kana-MU", "kana-ME", "kana-MO",
+    "kana-YA", "kana-YU", "kana-YO", "kana-RA",
+    "kana-RI", "kana-RU", "kana-RE", "kana-RO",
+    "kana-WA", "kana-N", "voicedsound", "semivoicedsound",
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   /* 0x4e0 .. 0x4ef */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,   /* 0x4f0 .. 0x4ff */
+  };
+#endif /* XK_kana_A */
+#endif /* 0 */
+
+#define FUNCTION_KEY_OFFSET 0xff00
+
+/* You'll notice that this table is arranged to be conveniently
+   indexed by X Windows keysym values.  */
+static const char *const lispy_function_keys[] =
+  {
+    /* X Keysym value */
+
+    0, 0, 0, 0, 0, 0, 0, 0,                          /* 0xff00...0f */
+    "backspace", "tab", "linefeed", "clear",
+    0, "return", 0, 0,
+    0, 0, 0, "pause",                                /* 0xff10...1f */
+    0, 0, 0, 0, 0, 0, 0, "escape",
+    0, 0, 0, 0,
+    0, "kanji", "muhenkan", "henkan",                /* 0xff20...2f */
+    "romaji", "hiragana", "katakana", "hiragana-katakana",
+    "zenkaku", "hankaku", "zenkaku-hankaku", "touroku",
+    "massyo", "kana-lock", "kana-shift", "eisu-shift",
+    "eisu-toggle",                                   /* 0xff30...3f */
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   /* 0xff40...4f */
+
+    "home", "left", "up", "right", /* 0xff50 */        /* IsCursorKey */
+    "down", "prior", "next", "end",
+    "begin", 0, 0, 0, 0, 0, 0, 0,
+    "select",                  /* 0xff60 */    /* IsMiscFunctionKey */
+    "print",
+    "execute",
+    "insert",
+    0,         /* 0xff64 */
+    "undo",
+    "redo",
+    "menu",
+    "find",
+    "cancel",
+    "help",
+    "break",                   /* 0xff6b */
+
+    0, 0, 0, 0,
+    0, 0, 0, 0, "backtab", 0, 0, 0,            /* 0xff70...  */
+    0, 0, 0, 0, 0, 0, 0, "kp-numlock",         /* 0xff78...  */
+    "kp-space",                        /* 0xff80 */    /* IsKeypadKey */
+    0, 0, 0, 0, 0, 0, 0, 0,
+    "kp-tab",                  /* 0xff89 */
+    0, 0, 0,
+    "kp-enter",                        /* 0xff8d */
+    0, 0, 0,
+    "kp-f1",                   /* 0xff91 */
+    "kp-f2",
+    "kp-f3",
+    "kp-f4",
+    "kp-home",                 /* 0xff95 */
+    "kp-left",
+    "kp-up",
+    "kp-right",
+    "kp-down",
+    "kp-prior",                        /* kp-page-up */
+    "kp-next",                 /* kp-page-down */
+    "kp-end",
+    "kp-begin",
+    "kp-insert",
+    "kp-delete",
+    0,                         /* 0xffa0 */
+    0, 0, 0, 0, 0, 0, 0, 0, 0,
+    "kp-multiply",             /* 0xffaa */
+    "kp-add",
+    "kp-separator",
+    "kp-subtract",
+    "kp-decimal",
+    "kp-divide",               /* 0xffaf */
+    "kp-0",                    /* 0xffb0 */
+    "kp-1",    "kp-2", "kp-3", "kp-4", "kp-5", "kp-6", "kp-7", "kp-8", "kp-9",
+    0,         /* 0xffba */
+    0, 0,
+    "kp-equal",                        /* 0xffbd */
+    "f1",                      /* 0xffbe */    /* IsFunctionKey */
+    "f2",
+    "f3", "f4", "f5", "f6", "f7", "f8",        "f9", "f10", /* 0xffc0 */
+    "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18",
+    "f19", "f20", "f21", "f22", "f23", "f24", "f25", "f26", /* 0xffd0 */
+    "f27", "f28", "f29", "f30", "f31", "f32", "f33", "f34",
+    "f35", 0, 0, 0, 0, 0, 0, 0,        /* 0xffe0 */
+    0, 0, 0, 0, 0, 0, 0, 0,
+    0, 0, 0, 0, 0, 0, 0, 0,     /* 0xfff0 */
+    0, 0, 0, 0, 0, 0, 0, "delete"
+  };
+
+/* ISO 9995 Function and Modifier Keys; the first byte is 0xFE.  */
+#define ISO_FUNCTION_KEY_OFFSET 0xfe00
+
+static const char *const iso_lispy_function_keys[] =
+  {
+    0, 0, 0, 0, 0, 0, 0, 0,    /* 0xfe00 */
+    0, 0, 0, 0, 0, 0, 0, 0,    /* 0xfe08 */
+    0, 0, 0, 0, 0, 0, 0, 0,    /* 0xfe10 */
+    0, 0, 0, 0, 0, 0, 0, 0,    /* 0xfe18 */
+    "iso-lefttab",             /* 0xfe20 */
+    "iso-move-line-up", "iso-move-line-down",
+    "iso-partial-line-up", "iso-partial-line-down",
+    "iso-partial-space-left", "iso-partial-space-right",
+    "iso-set-margin-left", "iso-set-margin-right", /* 0xffe27, 28 */
+    "iso-release-margin-left", "iso-release-margin-right",
+    "iso-release-both-margins",
+    "iso-fast-cursor-left", "iso-fast-cursor-right",
+    "iso-fast-cursor-up", "iso-fast-cursor-down",
+    "iso-continuous-underline", "iso-discontinuous-underline", /* 0xfe30, 31 */
+    "iso-emphasize", "iso-center-object", "iso-enter", /* ... 0xfe34 */
+  };
+
+#endif /* not HAVE_NTGUI */
+
+static Lisp_Object Vlispy_mouse_stem;
+
+static const char *const lispy_wheel_names[] =
+{
+  "wheel-up", "wheel-down", "wheel-left", "wheel-right"
+};
+
+/* drag-n-drop events are generated when a set of selected files are
+   dragged from another application and dropped onto an Emacs window.  */
+static const char *const lispy_drag_n_drop_names[] =
+{
+  "drag-n-drop"
+};
+
+/* An array of symbol indexes of scroll bar parts, indexed by an enum
+   scroll_bar_part value.  Note that Qnil corresponds to
+   scroll_bar_nowhere and should not appear in Lisp events.  */
+static short const scroll_bar_parts[] = {
+  SYMBOL_INDEX (Qnil), SYMBOL_INDEX (Qabove_handle), SYMBOL_INDEX (Qhandle),
+  SYMBOL_INDEX (Qbelow_handle), SYMBOL_INDEX (Qup), SYMBOL_INDEX (Qdown),
+  SYMBOL_INDEX (Qtop), SYMBOL_INDEX (Qbottom), SYMBOL_INDEX (Qend_scroll),
+  SYMBOL_INDEX (Qratio), SYMBOL_INDEX (Qbefore_handle),
+  SYMBOL_INDEX (Qhorizontal_handle), SYMBOL_INDEX (Qafter_handle),
+  SYMBOL_INDEX (Qleft), SYMBOL_INDEX (Qright), SYMBOL_INDEX (Qleftmost),
+  SYMBOL_INDEX (Qrightmost), SYMBOL_INDEX (Qend_scroll), SYMBOL_INDEX (Qratio)
+};
+
+/* A vector, indexed by button number, giving the down-going location
+   of currently depressed buttons, both scroll bar and non-scroll bar.
+
+   The elements have the form
+     (BUTTON-NUMBER MODIFIER-MASK . REST)
+   where REST is the cdr of a position as it would be reported in the event.
+
+   The make_lispy_event function stores positions here to tell the
+   difference between click and drag events, and to store the starting
+   location to be included in drag events.  */
+
+static Lisp_Object button_down_location;
+
+/* Information about the most recent up-going button event:  Which
+   button, what location, and what time.  */
+
+static int last_mouse_button;
+static int last_mouse_x;
+static int last_mouse_y;
+static Time button_down_time;
+
+/* The number of clicks in this multiple-click.  */
+
+static int double_click_count;
+
+/* X and Y are frame-relative coordinates for a click or wheel event.
+   Return a Lisp-style event list.  */
+
+static Lisp_Object
+make_lispy_position (struct frame *f, Lisp_Object x, Lisp_Object y,
+                    Time t)
+{
+  enum window_part part;
+  Lisp_Object posn = Qnil;
+  Lisp_Object extra_info = Qnil;
+  /* Coordinate pixel positions to return.  */
+  int xret = 0, yret = 0;
+  /* The window under frame pixel coordinates (x,y)  */
+  Lisp_Object window = f
+    ? window_from_coordinates (f, XINT (x), XINT (y), &part, 0)
+    : Qnil;
+
+  if (WINDOWP (window))
+    {
+      /* It's a click in window WINDOW at frame coordinates (X,Y)  */
+      struct window *w = XWINDOW (window);
+      Lisp_Object string_info = Qnil;
+      ptrdiff_t textpos = 0;
+      int col = -1, row = -1;
+      int dx  = -1, dy  = -1;
+      int width = -1, height = -1;
+      Lisp_Object object = Qnil;
+
+      /* Pixel coordinates relative to the window corner.  */
+      int wx = XINT (x) - WINDOW_LEFT_EDGE_X (w);
+      int wy = XINT (y) - WINDOW_TOP_EDGE_Y (w);
+
+      /* For text area clicks, return X, Y relative to the corner of
+        this text area.  Note that dX, dY etc are set below, by
+        buffer_posn_from_coords.  */
+      if (part == ON_TEXT)
+       {
+         xret = XINT (x) - window_box_left (w, TEXT_AREA);
+         yret = wy - WINDOW_HEADER_LINE_HEIGHT (w);
+       }
+      /* For mode line and header line clicks, return X, Y relative to
+        the left window edge.  Use mode_line_string to look for a
+        string on the click position.  */
+      else if (part == ON_MODE_LINE || part == ON_HEADER_LINE)
+       {
+         Lisp_Object string;
+         ptrdiff_t charpos;
+
+         posn = (part == ON_MODE_LINE) ? Qmode_line : Qheader_line;
+         /* Note that mode_line_string takes COL, ROW as pixels and
+            converts them to characters.  */
+         col = wx;
+         row = wy;
+         string = mode_line_string (w, part, &col, &row, &charpos,
+                                    &object, &dx, &dy, &width, &height);
+         if (STRINGP (string))
+           string_info = Fcons (string, make_number (charpos));
+         textpos = -1;
+
+         xret = wx;
+         yret = wy;
+       }
+      /* For fringes and margins, Y is relative to the area's (and the
+        window's) top edge, while X is meaningless.  */
+      else if (part == ON_LEFT_MARGIN || part == ON_RIGHT_MARGIN)
+       {
+         Lisp_Object string;
+         ptrdiff_t charpos;
+
+         posn = (part == ON_LEFT_MARGIN) ? Qleft_margin : Qright_margin;
+         col = wx;
+         row = wy;
+         string = marginal_area_string (w, part, &col, &row, &charpos,
+                                        &object, &dx, &dy, &width, &height);
+         if (STRINGP (string))
+           string_info = Fcons (string, make_number (charpos));
+         xret = wx;
+         yret = wy - WINDOW_HEADER_LINE_HEIGHT (w);
+       }
+      else if (part == ON_LEFT_FRINGE)
+       {
+         posn = Qleft_fringe;
+         col = 0;
+         xret = wx;
+         dx = wx
+           - (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w)
+              ? 0 : window_box_width (w, LEFT_MARGIN_AREA));
+         dy = yret = wy - WINDOW_HEADER_LINE_HEIGHT (w);
+       }
+      else if (part == ON_RIGHT_FRINGE)
+       {
+         posn = Qright_fringe;
+         col = 0;
+         xret = wx;
+         dx = wx
+           - window_box_width (w, LEFT_MARGIN_AREA)
+           - window_box_width (w, TEXT_AREA)
+           - (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w)
+              ? window_box_width (w, RIGHT_MARGIN_AREA)
+              : 0);
+         dy = yret = wy - WINDOW_HEADER_LINE_HEIGHT (w);
+       }
+      else if (part == ON_VERTICAL_BORDER)
+       {
+         posn = Qvertical_line;
+         width = 1;
+         dx = 0;
+         xret = wx;
+         dy = yret = wy;
+       }
+      else if (part == ON_VERTICAL_SCROLL_BAR)
+       {
+         posn = Qvertical_scroll_bar;
+         width = WINDOW_SCROLL_BAR_AREA_WIDTH (w);
+         dx = xret = wx;
+         dy = yret = wy;
+       }
+      else if (part == ON_HORIZONTAL_SCROLL_BAR)
+       {
+         posn = Qhorizontal_scroll_bar;
+         width = WINDOW_SCROLL_BAR_AREA_HEIGHT (w);
+         dx = xret = wx;
+         dy = yret = wy;
+       }
+      else if (part == ON_RIGHT_DIVIDER)
+       {
+         posn = Qright_divider;
+         width = WINDOW_RIGHT_DIVIDER_WIDTH (w);
+         dx = xret = wx;
+         dy = yret = wy;
+       }
+      else if (part == ON_BOTTOM_DIVIDER)
+       {
+         posn = Qbottom_divider;
+         width = WINDOW_BOTTOM_DIVIDER_WIDTH (w);
+         dx = xret = wx;
+         dy = yret = wy;
+       }
+
+      /* For clicks in the text area, fringes, margins, or vertical
+        scroll bar, call buffer_posn_from_coords to extract TEXTPOS,
+        the buffer position nearest to the click.  */
+      if (!textpos)
+       {
+         Lisp_Object string2, object2 = Qnil;
+         struct display_pos p;
+         int dx2, dy2;
+         int width2, height2;
+         /* The pixel X coordinate passed to buffer_posn_from_coords
+            is the X coordinate relative to the text area for clicks
+            in text-area, right-margin/fringe and right-side vertical
+            scroll bar, zero otherwise.  */
+         int x2
+           = (part == ON_TEXT) ? xret
+           : (part == ON_RIGHT_FRINGE || part == ON_RIGHT_MARGIN
+              || (part == ON_VERTICAL_SCROLL_BAR
+                  && WINDOW_HAS_VERTICAL_SCROLL_BAR_ON_RIGHT (w)))
+           ? (XINT (x) - window_box_left (w, TEXT_AREA))
+           : 0;
+         int y2 = wy;
+
+         string2 = buffer_posn_from_coords (w, &x2, &y2, &p,
+                                            &object2, &dx2, &dy2,
+                                            &width2, &height2);
+         textpos = CHARPOS (p.pos);
+         if (col < 0) col = x2;
+         if (row < 0) row = y2;
+         if (dx < 0) dx = dx2;
+         if (dy < 0) dy = dy2;
+         if (width < 0) width = width2;
+         if (height < 0) height = height2;
+
+         if (NILP (posn))
+           {
+             posn = make_number (textpos);
+             if (STRINGP (string2))
+               string_info = Fcons (string2,
+                                    make_number (CHARPOS (p.string_pos)));
+           }
+         if (NILP (object))
+           object = object2;
+       }
+
+#ifdef HAVE_WINDOW_SYSTEM
+      if (IMAGEP (object))
+       {
+         Lisp_Object image_map, hotspot;
+         if ((image_map = Fplist_get (XCDR (object), QCmap),
+              !NILP (image_map))
+             && (hotspot = find_hot_spot (image_map, dx, dy),
+                 CONSP (hotspot))
+             && (hotspot = XCDR (hotspot), CONSP (hotspot)))
+           posn = XCAR (hotspot);
+       }
+#endif
+
+      /* Object info.  */
+      extra_info
+       = list3 (object,
+                Fcons (make_number (dx), make_number (dy)),
+                Fcons (make_number (width), make_number (height)));
+
+      /* String info.  */
+      extra_info = Fcons (string_info,
+                         Fcons (textpos < 0 ? Qnil : make_number (textpos),
+                                Fcons (Fcons (make_number (col),
+                                              make_number (row)),
+                                       extra_info)));
+    }
+  else if (f != 0)
+    {
+      /* Return mouse pixel coordinates here.  */
+      XSETFRAME (window, f);
+      xret = XINT (x);
+      yret = XINT (y);
+    }
+  else
+    window = Qnil;
+
+  return Fcons (window,
+               Fcons (posn,
+                      Fcons (Fcons (make_number (xret),
+                                    make_number (yret)),
+                             Fcons (make_number (t),
+                                    extra_info))));
+}
+
+/* Return non-zero if F is a GUI frame that uses some toolkit-managed
+   menu bar.  This really means that Emacs draws and manages the menu
+   bar as part of its normal display, and therefore can compute its
+   geometry.  */
+static bool
+toolkit_menubar_in_use (struct frame *f)
+{
+#if defined (USE_X_TOOLKIT) || defined (USE_GTK) || defined (HAVE_NS) || 
defined (HAVE_NTGUI)
+  return !(!FRAME_WINDOW_P (f));
+#else
+  return false;
+#endif
+}
+
+/* Build the part of Lisp event which represents scroll bar state from
+   EV.  TYPE is one of Qvertical_scroll_bar or Qhorizontal_scroll_bar.  */
+
+static Lisp_Object
+make_scroll_bar_position (struct input_event *ev, Lisp_Object type)
+{
+  return list5 (ev->frame_or_window, type, Fcons (ev->x, ev->y),
+               make_number (ev->timestamp),
+               builtin_lisp_symbol (scroll_bar_parts[ev->part]));
+}
+
+/* Given a struct input_event, build the lisp event which represents
+   it.  If EVENT is 0, build a mouse movement event from the mouse
+   movement buffer, which should have a movement event in it.
+
+   Note that events must be passed to this function in the order they
+   are received; this function stores the location of button presses
+   in order to build drag events when the button is released.  */
+
+static Lisp_Object
+make_lispy_event (struct input_event *event)
+{
+  int i;
+
+  switch (event->kind)
+    {
+      /* A simple keystroke.  */
+    case ASCII_KEYSTROKE_EVENT:
+    case MULTIBYTE_CHAR_KEYSTROKE_EVENT:
+      {
+       Lisp_Object lispy_c;
+       EMACS_INT c = event->code;
+       if (event->kind == ASCII_KEYSTROKE_EVENT)
+         {
+           c &= 0377;
+           eassert (c == event->code);
+           /* Turn ASCII characters into control characters
+              when proper.  */
+           if (event->modifiers & ctrl_modifier)
+             {
+               c = make_ctrl_char (c);
+               event->modifiers &= ~ctrl_modifier;
+             }
+         }
+
+       /* Add in the other modifier bits.  The shift key was taken care
+          of by the X code.  */
+       c |= (event->modifiers
+             & (meta_modifier | alt_modifier
+                | hyper_modifier | super_modifier | ctrl_modifier));
+       /* Distinguish Shift-SPC from SPC.  */
+       if ((event->code) == 040
+           && event->modifiers & shift_modifier)
+         c |= shift_modifier;
+       button_down_time = 0;
+       XSETFASTINT (lispy_c, c);
+       return lispy_c;
+      }
+
+#ifdef HAVE_NS
+      /* NS_NONKEY_EVENTs are just like NON_ASCII_KEYSTROKE_EVENTs,
+        except that they are non-key events (last-nonmenu-event is nil).  */
+    case NS_NONKEY_EVENT:
+#endif
+
+      /* A function key.  The symbol may need to have modifier prefixes
+        tacked onto it.  */
+    case NON_ASCII_KEYSTROKE_EVENT:
+      button_down_time = 0;
+
+      for (i = 0; i < ARRAYELTS (lispy_accent_codes); i++)
+       if (event->code == lispy_accent_codes[i])
+         return modify_event_symbol (i,
+                                     event->modifiers,
+                                     Qfunction_key, Qnil,
+                                     lispy_accent_keys, &accent_key_syms,
+                                      ARRAYELTS (lispy_accent_keys));
+
+#if 0
+#ifdef XK_kana_A
+      if (event->code >= 0x400 && event->code < 0x500)
+       return modify_event_symbol (event->code - 0x400,
+                                   event->modifiers & ~shift_modifier,
+                                   Qfunction_key, Qnil,
+                                   lispy_kana_keys, &func_key_syms,
+                                    ARRAYELTS (lispy_kana_keys));
+#endif /* XK_kana_A */
+#endif /* 0 */
+
+#ifdef ISO_FUNCTION_KEY_OFFSET
+      if (event->code < FUNCTION_KEY_OFFSET
+         && event->code >= ISO_FUNCTION_KEY_OFFSET)
+       return modify_event_symbol (event->code - ISO_FUNCTION_KEY_OFFSET,
+                                   event->modifiers,
+                                   Qfunction_key, Qnil,
+                                   iso_lispy_function_keys, &func_key_syms,
+                                    ARRAYELTS (iso_lispy_function_keys));
+#endif
+
+      if ((FUNCTION_KEY_OFFSET <= event->code
+          && (event->code
+              < FUNCTION_KEY_OFFSET + ARRAYELTS (lispy_function_keys)))
+         && lispy_function_keys[event->code - FUNCTION_KEY_OFFSET])
+       return modify_event_symbol (event->code - FUNCTION_KEY_OFFSET,
+                                   event->modifiers,
+                                   Qfunction_key, Qnil,
+                                   lispy_function_keys, &func_key_syms,
+                                   ARRAYELTS (lispy_function_keys));
+
+      /* Handle system-specific or unknown keysyms.
+        We need to use an alist rather than a vector as the cache
+        since we can't make a vector long enough.  */
+      if (NILP (KVAR (current_kboard, system_key_syms)))
+       kset_system_key_syms (current_kboard, Fcons (Qnil, Qnil));
+      return modify_event_symbol (event->code,
+                                 event->modifiers,
+                                 Qfunction_key,
+                                 KVAR (current_kboard, Vsystem_key_alist),
+                                 0, &KVAR (current_kboard, system_key_syms),
+                                 PTRDIFF_MAX);
+
+#ifdef HAVE_NTGUI
+    case MULTIMEDIA_KEY_EVENT:
+      if (event->code < ARRAYELTS (lispy_multimedia_keys)
+          && event->code > 0 && lispy_multimedia_keys[event->code])
+        {
+          return modify_event_symbol (event->code, event->modifiers,
+                                      Qfunction_key, Qnil,
+                                      lispy_multimedia_keys, &func_key_syms,
+                                      ARRAYELTS (lispy_multimedia_keys));
+        }
+      return Qnil;
+#endif
+
+      /* A mouse click.  Figure out where it is, decide whether it's
+         a press, click or drag, and build the appropriate structure.  */
+    case MOUSE_CLICK_EVENT:
+#ifdef HAVE_GPM
+    case GPM_CLICK_EVENT:
+#endif
+#ifndef USE_TOOLKIT_SCROLL_BARS
+    case SCROLL_BAR_CLICK_EVENT:
+    case HORIZONTAL_SCROLL_BAR_CLICK_EVENT:
+#endif
+      {
+       int button = event->code;
+       bool is_double;
+       Lisp_Object position;
+       Lisp_Object *start_pos_ptr;
+       Lisp_Object start_pos;
+
+       position = Qnil;
+
+       /* Build the position as appropriate for this mouse click.  */
+       if (event->kind == MOUSE_CLICK_EVENT
+#ifdef HAVE_GPM
+           || event->kind == GPM_CLICK_EVENT
+#endif
+           )
+         {
+           struct frame *f = XFRAME (event->frame_or_window);
+           int row, column;
+
+           /* Ignore mouse events that were made on frame that
+              have been deleted.  */
+           if (! FRAME_LIVE_P (f))
+             return Qnil;
+
+           /* EVENT->x and EVENT->y are frame-relative pixel
+              coordinates at this place.  Under old redisplay, COLUMN
+              and ROW are set to frame relative glyph coordinates
+              which are then used to determine whether this click is
+              in a menu (non-toolkit version).  */
+           if (!toolkit_menubar_in_use (f))
+             {
+               pixel_to_glyph_coords (f, XINT (event->x), XINT (event->y),
+                                      &column, &row, NULL, 1);
+
+               /* In the non-toolkit version, clicks on the menu bar
+                  are ordinary button events in the event buffer.
+                  Distinguish them, and invoke the menu.
+
+                  (In the toolkit version, the toolkit handles the
+                  menu bar and Emacs doesn't know about it until
+                  after the user makes a selection.)  */
+               if (row >= 0 && row < FRAME_MENU_BAR_LINES (f)
+                 && (event->modifiers & down_modifier))
+                 {
+                   Lisp_Object items, item;
+
+                   /* Find the menu bar item under `column'.  */
+                   item = Qnil;
+                   items = FRAME_MENU_BAR_ITEMS (f);
+                   for (i = 0; i < ASIZE (items); i += 4)
+                     {
+                       Lisp_Object pos, string;
+                       string = AREF (items, i + 1);
+                       pos = AREF (items, i + 3);
+                       if (NILP (string))
+                         break;
+                       if (column >= XINT (pos)
+                           && column < XINT (pos) + SCHARS (string))
+                         {
+                           item = AREF (items, i);
+                           break;
+                         }
+                     }
+
+                   /* ELisp manual 2.4b says (x y) are window
+                      relative but code says they are
+                      frame-relative.  */
+                   position = list4 (event->frame_or_window,
+                                     Qmenu_bar,
+                                     Fcons (event->x, event->y),
+                                     make_number (event->timestamp));
+
+                   return list2 (item, position);
+                 }
+             }
+
+           position = make_lispy_position (f, event->x, event->y,
+                                           event->timestamp);
+         }
+#ifndef USE_TOOLKIT_SCROLL_BARS
+       else
+         /* It's a scrollbar click.  */
+         position = make_scroll_bar_position (event, Qvertical_scroll_bar);
+#endif /* not USE_TOOLKIT_SCROLL_BARS */
+
+       if (button >= ASIZE (button_down_location))
+         {
+           ptrdiff_t incr = button - ASIZE (button_down_location) + 1;
+           button_down_location = larger_vector (button_down_location,
+                                                 incr, -1);
+           mouse_syms = larger_vector (mouse_syms, incr, -1);
+         }
+
+       start_pos_ptr = aref_addr (button_down_location, button);
+       start_pos = *start_pos_ptr;
+       *start_pos_ptr = Qnil;
+
+       {
+         /* On window-system frames, use the value of
+            double-click-fuzz as is.  On other frames, interpret it
+            as a multiple of 1/8 characters.  */
+         struct frame *f;
+         int fuzz;
+
+         if (WINDOWP (event->frame_or_window))
+           f = XFRAME (XWINDOW (event->frame_or_window)->frame);
+         else if (FRAMEP (event->frame_or_window))
+           f = XFRAME (event->frame_or_window);
+         else
+           emacs_abort ();
+
+         if (FRAME_WINDOW_P (f))
+           fuzz = double_click_fuzz;
+         else
+           fuzz = double_click_fuzz / 8;
+
+         is_double = (button == last_mouse_button
+                      && (eabs (XINT (event->x) - last_mouse_x) <= fuzz)
+                      && (eabs (XINT (event->y) - last_mouse_y) <= fuzz)
+                      && button_down_time != 0
+                      && (EQ (Vdouble_click_time, Qt)
+                          || (NATNUMP (Vdouble_click_time)
+                              && (event->timestamp - button_down_time
+                                  < XFASTINT (Vdouble_click_time)))));
+       }
+
+       last_mouse_button = button;
+       last_mouse_x = XINT (event->x);
+       last_mouse_y = XINT (event->y);
+
+       /* If this is a button press, squirrel away the location, so
+           we can decide later whether it was a click or a drag.  */
+       if (event->modifiers & down_modifier)
+         {
+           if (is_double)
+             {
+               double_click_count++;
+               event->modifiers |= ((double_click_count > 2)
+                                    ? triple_modifier
+                                    : double_modifier);
+             }
+           else
+             double_click_count = 1;
+           button_down_time = event->timestamp;
+           *start_pos_ptr = Fcopy_alist (position);
+           ignore_mouse_drag_p = 0;
+         }
+
+       /* Now we're releasing a button - check the co-ordinates to
+           see if this was a click or a drag.  */
+       else if (event->modifiers & up_modifier)
+         {
+           /* If we did not see a down before this up, ignore the up.
+              Probably this happened because the down event chose a
+              menu item.  It would be an annoyance to treat the
+              release of the button that chose the menu item as a
+              separate event.  */
+
+           if (!CONSP (start_pos))
+             return Qnil;
+
+           event->modifiers &= ~up_modifier;
+
+             {
+               Lisp_Object new_down, down;
+               EMACS_INT xdiff = double_click_fuzz, ydiff = double_click_fuzz;
+
+               /* The third element of every position
+                  should be the (x,y) pair.  */
+               down = Fcar (Fcdr (Fcdr (start_pos)));
+               new_down = Fcar (Fcdr (Fcdr (position)));
+
+               if (CONSP (down)
+                   && INTEGERP (XCAR (down)) && INTEGERP (XCDR (down)))
+                 {
+                   xdiff = XINT (XCAR (new_down)) - XINT (XCAR (down));
+                   ydiff = XINT (XCDR (new_down)) - XINT (XCDR (down));
+                 }
+
+               if (ignore_mouse_drag_p)
+                 {
+                   event->modifiers |= click_modifier;
+                   ignore_mouse_drag_p = 0;
+                 }
+               else if (xdiff < double_click_fuzz && xdiff > - 
double_click_fuzz
+                        && ydiff < double_click_fuzz && ydiff > - 
double_click_fuzz
+                 /* Maybe the mouse has moved a lot, caused scrolling, and
+                    eventually ended up at the same screen position (but
+                    not buffer position) in which case it is a drag, not
+                    a click.  */
+                   /* FIXME: OTOH if the buffer position has changed
+                      because of a timer or process filter rather than
+                      because of mouse movement, it should be considered as
+                      a click.  But mouse-drag-region completely ignores
+                      this case and it hasn't caused any real problem, so
+                      it's probably OK to ignore it as well.  */
+                   && EQ (Fcar (Fcdr (start_pos)), Fcar (Fcdr (position))))
+                 /* Mouse hasn't moved (much).  */
+                 event->modifiers |= click_modifier;
+               else
+                 {
+                   button_down_time = 0;
+                   event->modifiers |= drag_modifier;
+                 }
+
+               /* Don't check is_double; treat this as multiple
+                  if the down-event was multiple.  */
+               if (double_click_count > 1)
+                 event->modifiers |= ((double_click_count > 2)
+                                      ? triple_modifier
+                                      : double_modifier);
+             }
+         }
+       else
+         /* Every mouse event should either have the down_modifier or
+             the up_modifier set.  */
+         emacs_abort ();
+
+       {
+         /* Get the symbol we should use for the mouse click.  */
+         Lisp_Object head;
+
+         head = modify_event_symbol (button,
+                                     event->modifiers,
+                                     Qmouse_click, Vlispy_mouse_stem,
+                                     NULL,
+                                     &mouse_syms,
+                                     ASIZE (mouse_syms));
+         if (event->modifiers & drag_modifier)
+           return list3 (head, start_pos, position);
+         else if (event->modifiers & (double_modifier | triple_modifier))
+           return list3 (head, position, make_number (double_click_count));
+         else
+           return list2 (head, position);
+       }
+      }
+
+    case WHEEL_EVENT:
+    case HORIZ_WHEEL_EVENT:
+      {
+       Lisp_Object position;
+       Lisp_Object head;
+
+       /* Build the position as appropriate for this mouse click.  */
+       struct frame *f = XFRAME (event->frame_or_window);
+
+       /* Ignore wheel events that were made on frame that have been
+          deleted.  */
+       if (! FRAME_LIVE_P (f))
+         return Qnil;
+
+       position = make_lispy_position (f, event->x, event->y,
+                                       event->timestamp);
+
+       /* Set double or triple modifiers to indicate the wheel speed.  */
+       {
+         /* On window-system frames, use the value of
+            double-click-fuzz as is.  On other frames, interpret it
+            as a multiple of 1/8 characters.  */
+         struct frame *fr;
+         int fuzz;
+         int symbol_num;
+         bool is_double;
+
+         if (WINDOWP (event->frame_or_window))
+           fr = XFRAME (XWINDOW (event->frame_or_window)->frame);
+         else if (FRAMEP (event->frame_or_window))
+           fr = XFRAME (event->frame_or_window);
+         else
+           emacs_abort ();
+
+         fuzz = FRAME_WINDOW_P (fr)
+           ? double_click_fuzz : double_click_fuzz / 8;
+
+         if (event->modifiers & up_modifier)
+           {
+             /* Emit a wheel-up event.  */
+             event->modifiers &= ~up_modifier;
+             symbol_num = 0;
+           }
+         else if (event->modifiers & down_modifier)
+           {
+             /* Emit a wheel-down event.  */
+             event->modifiers &= ~down_modifier;
+             symbol_num = 1;
+           }
+         else
+           /* Every wheel event should either have the down_modifier or
+              the up_modifier set.  */
+           emacs_abort ();
+
+          if (event->kind == HORIZ_WHEEL_EVENT)
+            symbol_num += 2;
+
+         is_double = (last_mouse_button == - (1 + symbol_num)
+                      && (eabs (XINT (event->x) - last_mouse_x) <= fuzz)
+                      && (eabs (XINT (event->y) - last_mouse_y) <= fuzz)
+                      && button_down_time != 0
+                      && (EQ (Vdouble_click_time, Qt)
+                          || (NATNUMP (Vdouble_click_time)
+                              && (event->timestamp - button_down_time
+                                  < XFASTINT (Vdouble_click_time)))));
+         if (is_double)
+           {
+             double_click_count++;
+             event->modifiers |= ((double_click_count > 2)
+                                  ? triple_modifier
+                                  : double_modifier);
+           }
+         else
+           {
+             double_click_count = 1;
+             event->modifiers |= click_modifier;
+           }
+
+         button_down_time = event->timestamp;
+         /* Use a negative value to distinguish wheel from mouse button.  */
+         last_mouse_button = - (1 + symbol_num);
+         last_mouse_x = XINT (event->x);
+         last_mouse_y = XINT (event->y);
+
+         /* Get the symbol we should use for the wheel event.  */
+         head = modify_event_symbol (symbol_num,
+                                     event->modifiers,
+                                     Qmouse_click,
+                                     Qnil,
+                                     lispy_wheel_names,
+                                     &wheel_syms,
+                                     ASIZE (wheel_syms));
+       }
+
+       if (event->modifiers & (double_modifier | triple_modifier))
+         return list3 (head, position, make_number (double_click_count));
+       else
+         return list2 (head, position);
+      }
+
+
+#ifdef USE_TOOLKIT_SCROLL_BARS
+
+      /* We don't have down and up events if using toolkit scroll bars,
+        so make this always a click event.  Store in the `part' of
+        the Lisp event a symbol which maps to the following actions:
+
+        `above_handle'         page up
+        `below_handle'         page down
+        `up'                   line up
+        `down'                 line down
+        `top'                  top of buffer
+        `bottom'               bottom of buffer
+        `handle'               thumb has been dragged.
+        `end-scroll'           end of interaction with scroll bar
+
+        The incoming input_event contains in its `part' member an
+        index of type `enum scroll_bar_part' which we can use as an
+        index in scroll_bar_parts to get the appropriate symbol.  */
+
+    case SCROLL_BAR_CLICK_EVENT:
+      {
+       Lisp_Object position, head;
+
+       position = make_scroll_bar_position (event, Qvertical_scroll_bar);
+
+       /* Always treat scroll bar events as clicks.  */
+       event->modifiers |= click_modifier;
+       event->modifiers &= ~up_modifier;
+
+       if (event->code >= ASIZE (mouse_syms))
+          mouse_syms = larger_vector (mouse_syms,
+                                     event->code - ASIZE (mouse_syms) + 1,
+                                     -1);
+
+       /* Get the symbol we should use for the mouse click.  */
+       head = modify_event_symbol (event->code,
+                                   event->modifiers,
+                                   Qmouse_click,
+                                   Vlispy_mouse_stem,
+                                   NULL, &mouse_syms,
+                                   ASIZE (mouse_syms));
+       return list2 (head, position);
+      }
+
+    case HORIZONTAL_SCROLL_BAR_CLICK_EVENT:
+      {
+       Lisp_Object position, head;
+
+       position = make_scroll_bar_position (event, Qhorizontal_scroll_bar);
+
+       /* Always treat scroll bar events as clicks.  */
+       event->modifiers |= click_modifier;
+       event->modifiers &= ~up_modifier;
+
+       if (event->code >= ASIZE (mouse_syms))
+          mouse_syms = larger_vector (mouse_syms,
+                                     event->code - ASIZE (mouse_syms) + 1,
+                                     -1);
+
+       /* Get the symbol we should use for the mouse click.  */
+       head = modify_event_symbol (event->code,
+                                   event->modifiers,
+                                   Qmouse_click,
+                                   Vlispy_mouse_stem,
+                                   NULL, &mouse_syms,
+                                   ASIZE (mouse_syms));
+       return list2 (head, position);
+      }
+
+#endif /* USE_TOOLKIT_SCROLL_BARS */
+
+    case DRAG_N_DROP_EVENT:
+      {
+       struct frame *f;
+       Lisp_Object head, position;
+       Lisp_Object files;
+
+       f = XFRAME (event->frame_or_window);
+       files = event->arg;
+
+       /* Ignore mouse events that were made on frames that
+          have been deleted.  */
+       if (! FRAME_LIVE_P (f))
+         return Qnil;
+
+       position = make_lispy_position (f, event->x, event->y,
+                                       event->timestamp);
+
+       head = modify_event_symbol (0, event->modifiers,
+                                   Qdrag_n_drop, Qnil,
+                                   lispy_drag_n_drop_names,
+                                   &drag_n_drop_syms, 1);
+       return list3 (head, position, files);
+      }
+
+#if defined (USE_X_TOOLKIT) || defined (HAVE_NTGUI) \
+    || defined (HAVE_NS) || defined (USE_GTK)
+    case MENU_BAR_EVENT:
+      if (EQ (event->arg, event->frame_or_window))
+       /* This is the prefix key.  We translate this to
+          `(menu_bar)' because the code in keyboard.c for menu
+          events, which we use, relies on this.  */
+       return list1 (Qmenu_bar);
+      return event->arg;
+#endif
+
+    case SELECT_WINDOW_EVENT:
+      /* Make an event (select-window (WINDOW)).  */
+      return list2 (Qselect_window, list1 (event->frame_or_window));
+
+    case TOOL_BAR_EVENT:
+      if (EQ (event->arg, event->frame_or_window))
+       /* This is the prefix key.  We translate this to
+          `(tool_bar)' because the code in keyboard.c for tool bar
+          events, which we use, relies on this.  */
+       return list1 (Qtool_bar);
+      else if (SYMBOLP (event->arg))
+       return apply_modifiers (event->modifiers, event->arg);
+      return event->arg;
+
+    case USER_SIGNAL_EVENT:
+      /* A user signal.  */
+      {
+       char *name = find_user_signal_name (event->code);
+       if (!name)
+         emacs_abort ();
+       return intern (name);
+      }
+
+    case SAVE_SESSION_EVENT:
+      return Qsave_session;
+
+#ifdef HAVE_DBUS
+    case DBUS_EVENT:
+      {
+       return Fcons (Qdbus_event, event->arg);
+      }
+#endif /* HAVE_DBUS */
+
+#if defined HAVE_GFILENOTIFY || defined HAVE_INOTIFY
+    case FILE_NOTIFY_EVENT:
+      {
+        return Fcons (Qfile_notify, event->arg);
+      }
+#endif /* defined HAVE_GFILENOTIFY || defined HAVE_INOTIFY */
+
+    case CONFIG_CHANGED_EVENT:
+       return list3 (Qconfig_changed_event,
+                     event->arg, event->frame_or_window);
+
+      /* The 'kind' field of the event is something we don't recognize.  */
+    default:
+      emacs_abort ();
+    }
+}
+
+static Lisp_Object
+make_lispy_movement (struct frame *frame, Lisp_Object bar_window, enum 
scroll_bar_part part,
+                    Lisp_Object x, Lisp_Object y, Time t)
+{
+  /* Is it a scroll bar movement?  */
+  if (frame && ! NILP (bar_window))
+    {
+      Lisp_Object part_sym;
+
+      part_sym = builtin_lisp_symbol (scroll_bar_parts[part]);
+      return list2 (Qscroll_bar_movement,
+                   list5 (bar_window,
+                          Qvertical_scroll_bar,
+                          Fcons (x, y),
+                          make_number (t),
+                          part_sym));
+    }
+  /* Or is it an ordinary mouse movement?  */
+  else
+    {
+      Lisp_Object position;
+      position = make_lispy_position (frame, x, y, t);
+      return list2 (Qmouse_movement, position);
+    }
+}
+
+/* Construct a switch frame event.  */
+static Lisp_Object
+make_lispy_switch_frame (Lisp_Object frame)
+{
+  return list2 (Qswitch_frame, frame);
+}
+
+static Lisp_Object
+make_lispy_focus_in (Lisp_Object frame)
+{
+  return list2 (Qfocus_in, frame);
+}
+
+#ifdef HAVE_WINDOW_SYSTEM
+
+static Lisp_Object
+make_lispy_focus_out (Lisp_Object frame)
+{
+  return list2 (Qfocus_out, frame);
+}
+
+#endif /* HAVE_WINDOW_SYSTEM */
+
+/* Manipulating modifiers.  */
+
+/* Parse the name of SYMBOL, and return the set of modifiers it contains.
+
+   If MODIFIER_END is non-zero, set *MODIFIER_END to the position in
+   SYMBOL's name of the end of the modifiers; the string from this
+   position is the unmodified symbol name.
+
+   This doesn't use any caches.  */
+
+static int
+parse_modifiers_uncached (Lisp_Object symbol, ptrdiff_t *modifier_end)
+{
+  Lisp_Object name;
+  ptrdiff_t i;
+  int modifiers;
+
+  CHECK_SYMBOL (symbol);
+
+  modifiers = 0;
+  name = SYMBOL_NAME (symbol);
+
+  for (i = 0; i < SBYTES (name) - 1; )
+    {
+      ptrdiff_t this_mod_end = 0;
+      int this_mod = 0;
+
+      /* See if the name continues with a modifier word.
+        Check that the word appears, but don't check what follows it.
+        Set this_mod and this_mod_end to record what we find.  */
+
+      switch (SREF (name, i))
+       {
+#define SINGLE_LETTER_MOD(BIT)                         \
+         (this_mod_end = i + 1, this_mod = BIT)
+
+       case 'A':
+         SINGLE_LETTER_MOD (alt_modifier);
+         break;
+
+       case 'C':
+         SINGLE_LETTER_MOD (ctrl_modifier);
+         break;
+
+       case 'H':
+         SINGLE_LETTER_MOD (hyper_modifier);
+         break;
+
+       case 'M':
+         SINGLE_LETTER_MOD (meta_modifier);
+         break;
+
+       case 'S':
+         SINGLE_LETTER_MOD (shift_modifier);
+         break;
+
+       case 's':
+         SINGLE_LETTER_MOD (super_modifier);
+         break;
+
+#undef SINGLE_LETTER_MOD
+
+#define MULTI_LETTER_MOD(BIT, NAME, LEN)                       \
+         if (i + LEN + 1 <= SBYTES (name)                      \
+             && ! memcmp (SDATA (name) + i, NAME, LEN))        \
+           {                                                   \
+             this_mod_end = i + LEN;                           \
+             this_mod = BIT;                                   \
+           }
+
+       case 'd':
+         MULTI_LETTER_MOD (drag_modifier, "drag", 4);
+         MULTI_LETTER_MOD (down_modifier, "down", 4);
+         MULTI_LETTER_MOD (double_modifier, "double", 6);
+         break;
+
+       case 't':
+         MULTI_LETTER_MOD (triple_modifier, "triple", 6);
+         break;
+#undef MULTI_LETTER_MOD
+
+       }
+
+      /* If we found no modifier, stop looking for them.  */
+      if (this_mod_end == 0)
+       break;
+
+      /* Check there is a dash after the modifier, so that it
+        really is a modifier.  */
+      if (this_mod_end >= SBYTES (name)
+         || SREF (name, this_mod_end) != '-')
+       break;
+
+      /* This modifier is real; look for another.  */
+      modifiers |= this_mod;
+      i = this_mod_end + 1;
+    }
+
+  /* Should we include the `click' modifier?  */
+  if (! (modifiers & (down_modifier | drag_modifier
+                     | double_modifier | triple_modifier))
+      && i + 7 == SBYTES (name)
+      && memcmp (SDATA (name) + i, "mouse-", 6) == 0
+      && ('0' <= SREF (name, i + 6) && SREF (name, i + 6) <= '9'))
+    modifiers |= click_modifier;
+
+  if (! (modifiers & (double_modifier | triple_modifier))
+      && i + 6 < SBYTES (name)
+      && memcmp (SDATA (name) + i, "wheel-", 6) == 0)
+    modifiers |= click_modifier;
+
+  if (modifier_end)
+    *modifier_end = i;
+
+  return modifiers;
+}
+
+/* Return a symbol whose name is the modifier prefixes for MODIFIERS
+   prepended to the string BASE[0..BASE_LEN-1].
+   This doesn't use any caches.  */
+static Lisp_Object
+apply_modifiers_uncached (int modifiers, char *base, int base_len, int 
base_len_byte)
+{
+  /* Since BASE could contain nulls, we can't use intern here; we have
+     to use Fintern, which expects a genuine Lisp_String, and keeps a
+     reference to it.  */
+  char new_mods[sizeof "A-C-H-M-S-s-down-drag-double-triple-"];
+  int mod_len;
+
+  {
+    char *p = new_mods;
+
+    /* Only the event queue may use the `up' modifier; it should always
+       be turned into a click or drag event before presented to lisp code.  */
+    if (modifiers & up_modifier)
+      emacs_abort ();
+
+    if (modifiers & alt_modifier)   { *p++ = 'A'; *p++ = '-'; }
+    if (modifiers & ctrl_modifier)  { *p++ = 'C'; *p++ = '-'; }
+    if (modifiers & hyper_modifier) { *p++ = 'H'; *p++ = '-'; }
+    if (modifiers & meta_modifier)  { *p++ = 'M'; *p++ = '-'; }
+    if (modifiers & shift_modifier) { *p++ = 'S'; *p++ = '-'; }
+    if (modifiers & super_modifier) { *p++ = 's'; *p++ = '-'; }
+    if (modifiers & double_modifier) p = stpcpy (p, "double-");
+    if (modifiers & triple_modifier) p = stpcpy (p, "triple-");
+    if (modifiers & down_modifier) p = stpcpy (p, "down-");
+    if (modifiers & drag_modifier) p = stpcpy (p, "drag-");
+    /* The click modifier is denoted by the absence of other modifiers.  */
+
+    *p = '\0';
+
+    mod_len = p - new_mods;
+  }
+
+  {
+    Lisp_Object new_name;
+
+    new_name = make_uninit_multibyte_string (mod_len + base_len,
+                                            mod_len + base_len_byte);
+    memcpy (SDATA (new_name), new_mods, mod_len);
+    memcpy (SDATA (new_name) + mod_len, base, base_len_byte);
+
+    return Fintern (new_name, Qnil);
+  }
+}
+
+
+static const char *const modifier_names[] =
+{
+  "up", "down", "drag", "click", "double", "triple", 0, 0,
+  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+  0, 0, "alt", "super", "hyper", "shift", "control", "meta"
+};
+#define NUM_MOD_NAMES ARRAYELTS (modifier_names)
+
+static Lisp_Object modifier_symbols;
+
+/* Return the list of modifier symbols corresponding to the mask MODIFIERS.  */
+static Lisp_Object
+lispy_modifier_list (int modifiers)
+{
+  Lisp_Object modifier_list;
+  int i;
+
+  modifier_list = Qnil;
+  for (i = 0; (1<<i) <= modifiers && i < NUM_MOD_NAMES; i++)
+    if (modifiers & (1<<i))
+      modifier_list = Fcons (AREF (modifier_symbols, i),
+                            modifier_list);
+
+  return modifier_list;
+}
+
+
+/* Parse the modifiers on SYMBOL, and return a list like (UNMODIFIED MASK),
+   where UNMODIFIED is the unmodified form of SYMBOL,
+   MASK is the set of modifiers present in SYMBOL's name.
+   This is similar to parse_modifiers_uncached, but uses the cache in
+   SYMBOL's Qevent_symbol_element_mask property, and maintains the
+   Qevent_symbol_elements property.  */
+
+#define KEY_TO_CHAR(k) (XINT (k) & ((1 << CHARACTERBITS) - 1))
+
+Lisp_Object
+parse_modifiers (Lisp_Object symbol)
+{
+  Lisp_Object elements;
+
+  if (INTEGERP (symbol))
+    return list2i (KEY_TO_CHAR (symbol), XINT (symbol) & CHAR_MODIFIER_MASK);
+  else if (!SYMBOLP (symbol))
+    return Qnil;
+
+  elements = Fget (symbol, Qevent_symbol_element_mask);
+  if (CONSP (elements))
+    return elements;
+  else
+    {
+      ptrdiff_t end;
+      int modifiers = parse_modifiers_uncached (symbol, &end);
+      Lisp_Object unmodified;
+      Lisp_Object mask;
+
+      unmodified = Fintern (make_string (SSDATA (SYMBOL_NAME (symbol)) + end,
+                                        SBYTES (SYMBOL_NAME (symbol)) - end),
+                           Qnil);
+
+      if (modifiers & ~INTMASK)
+       emacs_abort ();
+      XSETFASTINT (mask, modifiers);
+      elements = list2 (unmodified, mask);
+
+      /* Cache the parsing results on SYMBOL.  */
+      Fput (symbol, Qevent_symbol_element_mask,
+           elements);
+      Fput (symbol, Qevent_symbol_elements,
+           Fcons (unmodified, lispy_modifier_list (modifiers)));
+
+      /* Since we know that SYMBOL is modifiers applied to unmodified,
+        it would be nice to put that in unmodified's cache.
+        But we can't, since we're not sure that parse_modifiers is
+        canonical.  */
+
+      return elements;
+    }
+}
+
+DEFUN ("internal-event-symbol-parse-modifiers", Fevent_symbol_parse_modifiers,
+       Sevent_symbol_parse_modifiers, 1, 1, 0,
+       doc: /* Parse the event symbol.  For internal use.  */)
+  (Lisp_Object symbol)
+{
+  /* Fill the cache if needed.  */
+  parse_modifiers (symbol);
+  /* Ignore the result (which is stored on Qevent_symbol_element_mask)
+     and use the Lispier representation stored on Qevent_symbol_elements
+     instead.  */
+  return Fget (symbol, Qevent_symbol_elements);
+}
+
+/* Apply the modifiers MODIFIERS to the symbol BASE.
+   BASE must be unmodified.
+
+   This is like apply_modifiers_uncached, but uses BASE's
+   Qmodifier_cache property, if present.  It also builds
+   Qevent_symbol_elements properties, since it has that info anyway.
+
+   apply_modifiers copies the value of BASE's Qevent_kind property to
+   the modified symbol.  */
+static Lisp_Object
+apply_modifiers (int modifiers, Lisp_Object base)
+{
+  Lisp_Object cache, idx, entry, new_symbol;
+
+  /* Mask out upper bits.  We don't know where this value's been.  */
+  modifiers &= INTMASK;
+
+  if (INTEGERP (base))
+    return make_number (XINT (base) | modifiers);
+
+  /* The click modifier never figures into cache indices.  */
+  cache = Fget (base, Qmodifier_cache);
+  XSETFASTINT (idx, (modifiers & ~click_modifier));
+  entry = assq_no_quit (idx, cache);
+
+  if (CONSP (entry))
+    new_symbol = XCDR (entry);
+  else
+    {
+      /* We have to create the symbol ourselves.  */
+      new_symbol = apply_modifiers_uncached (modifiers,
+                                            SSDATA (SYMBOL_NAME (base)),
+                                            SCHARS (SYMBOL_NAME (base)),
+                                            SBYTES (SYMBOL_NAME (base)));
+
+      /* Add the new symbol to the base's cache.  */
+      entry = Fcons (idx, new_symbol);
+      Fput (base, Qmodifier_cache, Fcons (entry, cache));
+
+      /* We have the parsing info now for free, so we could add it to
+        the caches:
+         XSETFASTINT (idx, modifiers);
+         Fput (new_symbol, Qevent_symbol_element_mask,
+               list2 (base, idx));
+         Fput (new_symbol, Qevent_symbol_elements,
+               Fcons (base, lispy_modifier_list (modifiers)));
+        Sadly, this is only correct if `base' is indeed a base event,
+        which is not necessarily the case.  -stef  */
+    }
+
+  /* Make sure this symbol is of the same kind as BASE.
+
+     You'd think we could just set this once and for all when we
+     intern the symbol above, but reorder_modifiers may call us when
+     BASE's property isn't set right; we can't assume that just
+     because it has a Qmodifier_cache property it must have its
+     Qevent_kind set right as well.  */
+  if (NILP (Fget (new_symbol, Qevent_kind)))
+    {
+      Lisp_Object kind;
+
+      kind = Fget (base, Qevent_kind);
+      if (! NILP (kind))
+       Fput (new_symbol, Qevent_kind, kind);
+    }
+
+  return new_symbol;
+}
+
+
+/* Given a symbol whose name begins with modifiers ("C-", "M-", etc),
+   return a symbol with the modifiers placed in the canonical order.
+   Canonical order is alphabetical, except for down and drag, which
+   always come last.  The 'click' modifier is never written out.
+
+   Fdefine_key calls this to make sure that (for example) C-M-foo
+   and M-C-foo end up being equivalent in the keymap.  */
+
+Lisp_Object
+reorder_modifiers (Lisp_Object symbol)
+{
+  /* It's hopefully okay to write the code this way, since everything
+     will soon be in caches, and no consing will be done at all.  */
+  Lisp_Object parsed;
+
+  parsed = parse_modifiers (symbol);
+  return apply_modifiers (XFASTINT (XCAR (XCDR (parsed))),
+                         XCAR (parsed));
+}
+
+
+/* For handling events, we often want to produce a symbol whose name
+   is a series of modifier key prefixes ("M-", "C-", etcetera) attached
+   to some base, like the name of a function key or mouse button.
+   modify_event_symbol produces symbols of this sort.
+
+   NAME_TABLE should point to an array of strings, such that NAME_TABLE[i]
+   is the name of the i'th symbol.  TABLE_SIZE is the number of elements
+   in the table.
+
+   Alternatively, NAME_ALIST_OR_STEM is either an alist mapping codes
+   into symbol names, or a string specifying a name stem used to
+   construct a symbol name or the form `STEM-N', where N is the decimal
+   representation of SYMBOL_NUM.  NAME_ALIST_OR_STEM is used if it is
+   non-nil; otherwise NAME_TABLE is used.
+
+   SYMBOL_TABLE should be a pointer to a Lisp_Object whose value will
+   persist between calls to modify_event_symbol that it can use to
+   store a cache of the symbols it's generated for this NAME_TABLE
+   before.  The object stored there may be a vector or an alist.
+
+   SYMBOL_NUM is the number of the base name we want from NAME_TABLE.
+
+   MODIFIERS is a set of modifier bits (as given in struct input_events)
+   whose prefixes should be applied to the symbol name.
+
+   SYMBOL_KIND is the value to be placed in the event_kind property of
+   the returned symbol.
+
+   The symbols we create are supposed to have an
+   `event-symbol-elements' property, which lists the modifiers present
+   in the symbol's name.  */
+
+static Lisp_Object
+modify_event_symbol (ptrdiff_t symbol_num, int modifiers, Lisp_Object 
symbol_kind,
+                    Lisp_Object name_alist_or_stem, const char *const 
*name_table,
+                    Lisp_Object *symbol_table, ptrdiff_t table_size)
+{
+  Lisp_Object value;
+  Lisp_Object symbol_int;
+
+  /* Get rid of the "vendor-specific" bit here.  */
+  XSETINT (symbol_int, symbol_num & 0xffffff);
+
+  /* Is this a request for a valid symbol?  */
+  if (symbol_num < 0 || symbol_num >= table_size)
+    return Qnil;
+
+  if (CONSP (*symbol_table))
+    value = Fcdr (assq_no_quit (symbol_int, *symbol_table));
+
+  /* If *symbol_table doesn't seem to be initialized properly, fix that.
+     *symbol_table should be a lisp vector TABLE_SIZE elements long,
+     where the Nth element is the symbol for NAME_TABLE[N], or nil if
+     we've never used that symbol before.  */
+  else
+    {
+      if (! VECTORP (*symbol_table)
+         || ASIZE (*symbol_table) != table_size)
+       {
+         Lisp_Object size;
+
+         XSETFASTINT (size, table_size);
+         *symbol_table = Fmake_vector (size, Qnil);
+       }
+
+      value = AREF (*symbol_table, symbol_num);
+    }
+
+  /* Have we already used this symbol before?  */
+  if (NILP (value))
+    {
+      /* No; let's create it.  */
+      if (CONSP (name_alist_or_stem))
+       value = Fcdr_safe (Fassq (symbol_int, name_alist_or_stem));
+      else if (STRINGP (name_alist_or_stem))
+       {
+         char *buf;
+         ptrdiff_t len = (SBYTES (name_alist_or_stem)
+                          + sizeof "-" + INT_STRLEN_BOUND (EMACS_INT));
+         USE_SAFE_ALLOCA;
+         buf = SAFE_ALLOCA (len);
+         esprintf (buf, "%s-%"pI"d", SDATA (name_alist_or_stem),
+                   XINT (symbol_int) + 1);
+         value = intern (buf);
+         SAFE_FREE ();
+       }
+      else if (name_table != 0 && name_table[symbol_num])
+       value = intern (name_table[symbol_num]);
+
+#ifdef HAVE_WINDOW_SYSTEM
+      if (NILP (value))
+       {
+         char *name = x_get_keysym_name (symbol_num);
+         if (name)
+           value = intern (name);
+       }
+#endif
+
+      if (NILP (value))
+       {
+         char buf[sizeof "key-" + INT_STRLEN_BOUND (EMACS_INT)];
+         sprintf (buf, "key-%"pD"d", symbol_num);
+         value = intern (buf);
+       }
+
+      if (CONSP (*symbol_table))
+        *symbol_table = Fcons (Fcons (symbol_int, value), *symbol_table);
+      else
+       ASET (*symbol_table, symbol_num, value);
+
+      /* Fill in the cache entries for this symbol; this also
+        builds the Qevent_symbol_elements property, which the user
+        cares about.  */
+      apply_modifiers (modifiers & click_modifier, value);
+      Fput (value, Qevent_kind, symbol_kind);
+    }
+
+  /* Apply modifiers to that symbol.  */
+  return apply_modifiers (modifiers, value);
+}
+
+/* Convert a list that represents an event type,
+   such as (ctrl meta backspace), into the usual representation of that
+   event type as a number or a symbol.  */
+
+DEFUN ("event-convert-list", Fevent_convert_list, Sevent_convert_list, 1, 1, 0,
+       doc: /* Convert the event description list EVENT-DESC to an event type.
+EVENT-DESC should contain one base event type (a character or symbol)
+and zero or more modifier names (control, meta, hyper, super, shift, alt,
+drag, down, double or triple).  The base must be last.
+The return value is an event type (a character or symbol) which
+has the same base event type and all the specified modifiers.  */)
+  (Lisp_Object event_desc)
+{
+  Lisp_Object base;
+  int modifiers = 0;
+  Lisp_Object rest;
+
+  base = Qnil;
+  rest = event_desc;
+  while (CONSP (rest))
+    {
+      Lisp_Object elt;
+      int this = 0;
+
+      elt = XCAR (rest);
+      rest = XCDR (rest);
+
+      /* Given a symbol, see if it is a modifier name.  */
+      if (SYMBOLP (elt) && CONSP (rest))
+       this = parse_solitary_modifier (elt);
+
+      if (this != 0)
+       modifiers |= this;
+      else if (!NILP (base))
+       error ("Two bases given in one event");
+      else
+       base = elt;
+
+    }
+
+  /* Let the symbol A refer to the character A.  */
+  if (SYMBOLP (base) && SCHARS (SYMBOL_NAME (base)) == 1)
+    XSETINT (base, SREF (SYMBOL_NAME (base), 0));
+
+  if (INTEGERP (base))
+    {
+      /* Turn (shift a) into A.  */
+      if ((modifiers & shift_modifier) != 0
+         && (XINT (base) >= 'a' && XINT (base) <= 'z'))
+       {
+         XSETINT (base, XINT (base) - ('a' - 'A'));
+         modifiers &= ~shift_modifier;
+       }
+
+      /* Turn (control a) into C-a.  */
+      if (modifiers & ctrl_modifier)
+       return make_number ((modifiers & ~ctrl_modifier)
+                           | make_ctrl_char (XINT (base)));
+      else
+       return make_number (modifiers | XINT (base));
+    }
+  else if (SYMBOLP (base))
+    return apply_modifiers (modifiers, base);
+  else
+    error ("Invalid base event");
+}
+
+/* Try to recognize SYMBOL as a modifier name.
+   Return the modifier flag bit, or 0 if not recognized.  */
+
+int
+parse_solitary_modifier (Lisp_Object symbol)
+{
+  Lisp_Object name = SYMBOL_NAME (symbol);
+
+  switch (SREF (name, 0))
+    {
+#define SINGLE_LETTER_MOD(BIT)                         \
+      if (SBYTES (name) == 1)                          \
+       return BIT;
+
+#define MULTI_LETTER_MOD(BIT, NAME, LEN)               \
+      if (LEN == SBYTES (name)                         \
+         && ! memcmp (SDATA (name), NAME, LEN))        \
+       return BIT;
+
+    case 'A':
+      SINGLE_LETTER_MOD (alt_modifier);
+      break;
+
+    case 'a':
+      MULTI_LETTER_MOD (alt_modifier, "alt", 3);
+      break;
+
+    case 'C':
+      SINGLE_LETTER_MOD (ctrl_modifier);
+      break;
+
+    case 'c':
+      MULTI_LETTER_MOD (ctrl_modifier, "ctrl", 4);
+      MULTI_LETTER_MOD (ctrl_modifier, "control", 7);
+      break;
+
+    case 'H':
+      SINGLE_LETTER_MOD (hyper_modifier);
+      break;
+
+    case 'h':
+      MULTI_LETTER_MOD (hyper_modifier, "hyper", 5);
+      break;
+
+    case 'M':
+      SINGLE_LETTER_MOD (meta_modifier);
+      break;
+
+    case 'm':
+      MULTI_LETTER_MOD (meta_modifier, "meta", 4);
+      break;
+
+    case 'S':
+      SINGLE_LETTER_MOD (shift_modifier);
+      break;
+
+    case 's':
+      MULTI_LETTER_MOD (shift_modifier, "shift", 5);
+      MULTI_LETTER_MOD (super_modifier, "super", 5);
+      SINGLE_LETTER_MOD (super_modifier);
+      break;
+
+    case 'd':
+      MULTI_LETTER_MOD (drag_modifier, "drag", 4);
+      MULTI_LETTER_MOD (down_modifier, "down", 4);
+      MULTI_LETTER_MOD (double_modifier, "double", 6);
+      break;
+
+    case 't':
+      MULTI_LETTER_MOD (triple_modifier, "triple", 6);
+      break;
+
+#undef SINGLE_LETTER_MOD
+#undef MULTI_LETTER_MOD
+    }
+
+  return 0;
+}
+
+/* Return true if EVENT is a list whose elements are all integers or symbols.
+   Such a list is not valid as an event,
+   but it can be a Lucid-style event type list.  */
+
+bool
+lucid_event_type_list_p (Lisp_Object object)
+{
+  Lisp_Object tail;
+
+  if (! CONSP (object))
+    return 0;
+
+  if (EQ (XCAR (object), Qhelp_echo)
+      || EQ (XCAR (object), Qvertical_line)
+      || EQ (XCAR (object), Qmode_line)
+      || EQ (XCAR (object), Qheader_line))
+    return 0;
+
+  for (tail = object; CONSP (tail); tail = XCDR (tail))
+    {
+      Lisp_Object elt;
+      elt = XCAR (tail);
+      if (! (INTEGERP (elt) || SYMBOLP (elt)))
+       return 0;
+    }
+
+  return NILP (tail);
+}
+
+/* Return true if terminal input chars are available.
+   Also, store the return value into INPUT_PENDING.
+
+   Serves the purpose of ioctl (0, FIONREAD, ...)
+   but works even if FIONREAD does not exist.
+   (In fact, this may actually read some input.)
+
+   If READABLE_EVENTS_DO_TIMERS_NOW is set in FLAGS, actually run
+   timer events that are ripe.
+   If READABLE_EVENTS_FILTER_EVENTS is set in FLAGS, ignore internal
+   events (FOCUS_IN_EVENT).
+   If READABLE_EVENTS_IGNORE_SQUEEZABLES is set in FLAGS, ignore mouse
+   movements and toolkit scroll bar thumb drags.  */
+
+static bool
+get_input_pending (int flags)
+{
+  /* First of all, have we already counted some input?  */
+  input_pending = (!NILP (Vquit_flag) || readable_events (flags));
+
+  /* If input is being read as it arrives, and we have none, there is none.  */
+  if (!input_pending && (!interrupt_input || interrupts_deferred))
+    {
+      /* Try to read some input and see how much we get.  */
+      gobble_input ();
+      input_pending = (!NILP (Vquit_flag) || readable_events (flags));
+    }
+
+  return input_pending;
+}
+
+/* Put a BUFFER_SWITCH_EVENT in the buffer
+   so that read_key_sequence will notice the new current buffer.  */
+
+void
+record_asynch_buffer_change (void)
+{
+  /* We don't need a buffer-switch event unless Emacs is waiting for input.
+     The purpose of the event is to make read_key_sequence look up the
+     keymaps again.  If we aren't in read_key_sequence, we don't need one,
+     and the event could cause trouble by messing up (input-pending-p).
+     Note: Fwaiting_for_user_input_p always returns nil when async
+     subprocesses aren't supported.  */
+  if (!NILP (Fwaiting_for_user_input_p ()))
+    {
+      struct input_event event;
+
+      EVENT_INIT (event);
+      event.kind = BUFFER_SWITCH_EVENT;
+      event.frame_or_window = Qnil;
+      event.arg = Qnil;
+
+      /* Make sure no interrupt happens while storing the event.  */
+#ifdef USABLE_SIGIO
+      if (interrupt_input)
+       kbd_buffer_store_event (&event);
+      else
+#endif
+       {
+         stop_polling ();
+         kbd_buffer_store_event (&event);
+         start_polling ();
+       }
+    }
+}
+
+/* Read any terminal input already buffered up by the system
+   into the kbd_buffer, but do not wait.
+
+   Return the number of keyboard chars read, or -1 meaning
+   this is a bad time to try to read input.  */
+
+int
+gobble_input (void)
+{
+  int nread = 0;
+  bool err = 0;
+  struct terminal *t;
+
+  /* Store pending user signal events, if any.  */
+  store_user_signal_events ();
+
+  /* Loop through the available terminals, and call their input hooks.  */
+  t = terminal_list;
+  while (t)
+    {
+      struct terminal *next = t->next_terminal;
+
+      if (t->read_socket_hook)
+        {
+          int nr;
+          struct input_event hold_quit;
+
+         if (input_blocked_p ())
+           {
+             pending_signals = 1;
+             break;
+           }
+
+          EVENT_INIT (hold_quit);
+          hold_quit.kind = NO_EVENT;
+
+          /* No need for FIONREAD or fcntl; just say don't wait.  */
+         while ((nr = (*t->read_socket_hook) (t, &hold_quit)) > 0)
+           nread += nr;
+
+          if (nr == -1)          /* Not OK to read input now.  */
+            {
+              err = 1;
+            }
+          else if (nr == -2)          /* Non-transient error.  */
+            {
+              /* The terminal device terminated; it should be closed.  */
+
+              /* Kill Emacs if this was our last terminal.  */
+              if (!terminal_list->next_terminal)
+                /* Formerly simply reported no input, but that
+                   sometimes led to a failure of Emacs to terminate.
+                   SIGHUP seems appropriate if we can't reach the
+                   terminal.  */
+                /* ??? Is it really right to send the signal just to
+                   this process rather than to the whole process
+                   group?  Perhaps on systems with FIONREAD Emacs is
+                   alone in its group.  */
+               terminate_due_to_signal (SIGHUP, 10);
+
+              /* XXX Is calling delete_terminal safe here?  It calls 
delete_frame.  */
+             {
+               Lisp_Object tmp;
+               XSETTERMINAL (tmp, t);
+               Fdelete_terminal (tmp, Qnoelisp);
+             }
+            }
+
+         /* If there was no error, make sure the pointer
+            is visible for all frames on this terminal.  */
+         if (nr >= 0)
+           {
+             Lisp_Object tail, frame;
+
+             FOR_EACH_FRAME (tail, frame)
+               {
+                 struct frame *f = XFRAME (frame);
+                 if (FRAME_TERMINAL (f) == t)
+                   frame_make_pointer_visible (f);
+               }
+           }
+
+          if (hold_quit.kind != NO_EVENT)
+            kbd_buffer_store_event (&hold_quit);
+        }
+
+      t = next;
+    }
+
+  if (err && !nread)
+    nread = -1;
+
+  return nread;
+}
+
+/* This is the tty way of reading available input.
+
+   Note that each terminal device has its own `struct terminal' object,
+   and so this function is called once for each individual termcap
+   terminal.  The first parameter indicates which terminal to read from.  */
+
+int
+tty_read_avail_input (struct terminal *terminal,
+                      struct input_event *hold_quit)
+{
+  /* Using KBD_BUFFER_SIZE - 1 here avoids reading more than
+     the kbd_buffer can really hold.  That may prevent loss
+     of characters on some systems when input is stuffed at us.  */
+  unsigned char cbuf[KBD_BUFFER_SIZE - 1];
+  int n_to_read, i;
+  struct tty_display_info *tty = terminal->display_info.tty;
+  int nread = 0;
+#ifdef subprocesses
+  int buffer_free = KBD_BUFFER_SIZE - kbd_buffer_nr_stored () - 1;
+
+  if (kbd_on_hold_p () || buffer_free <= 0)
+    return 0;
+#endif /* subprocesses */
+
+  if (!terminal->name)         /* Don't read from a dead terminal.  */
+    return 0;
+
+  if (terminal->type != output_termcap
+      && terminal->type != output_msdos_raw)
+    emacs_abort ();
+
+  /* XXX I think the following code should be moved to separate hook
+     functions in system-dependent files.  */
+#ifdef WINDOWSNT
+  /* FIXME: AFAIK, tty_read_avail_input is not used under w32 since the non-GUI
+     code sets read_socket_hook to w32_console_read_socket instead!  */
+  return 0;
+#else /* not WINDOWSNT */
+  if (! tty->term_initted)      /* In case we get called during bootstrap.  */
+    return 0;
+
+  if (! tty->input)
+    return 0;                   /* The terminal is suspended.  */
+
+#ifdef MSDOS
+  n_to_read = dos_keysns ();
+  if (n_to_read == 0)
+    return 0;
+
+  cbuf[0] = dos_keyread ();
+  nread = 1;
+
+#else /* not MSDOS */
+#ifdef HAVE_GPM
+  if (gpm_tty == tty)
+  {
+      Gpm_Event event;
+      struct input_event gpm_hold_quit;
+      int gpm, fd = gpm_fd;
+
+      EVENT_INIT (gpm_hold_quit);
+      gpm_hold_quit.kind = NO_EVENT;
+
+      /* gpm==1 if event received.
+         gpm==0 if the GPM daemon has closed the connection, in which case
+                Gpm_GetEvent closes gpm_fd and clears it to -1, which is why
+               we save it in `fd' so close_gpm can remove it from the
+               select masks.
+         gpm==-1 if a protocol error or EWOULDBLOCK; the latter is normal.  */
+      while (gpm = Gpm_GetEvent (&event), gpm == 1) {
+         nread += handle_one_term_event (tty, &event, &gpm_hold_quit);
+      }
+      if (gpm == 0)
+       /* Presumably the GPM daemon has closed the connection.  */
+       close_gpm (fd);
+      if (gpm_hold_quit.kind != NO_EVENT)
+         kbd_buffer_store_event (&gpm_hold_quit);
+      if (nread)
+         return nread;
+  }
+#endif /* HAVE_GPM */
+
+/* Determine how many characters we should *try* to read.  */
+#ifdef USABLE_FIONREAD
+  /* Find out how much input is available.  */
+  if (ioctl (fileno (tty->input), FIONREAD, &n_to_read) < 0)
+    {
+      if (! noninteractive)
+        return -2;          /* Close this terminal.  */
+      else
+        n_to_read = 0;
+    }
+  if (n_to_read == 0)
+    return 0;
+  if (n_to_read > sizeof cbuf)
+    n_to_read = sizeof cbuf;
+#elif defined USG || defined CYGWIN
+  /* Read some input if available, but don't wait.  */
+  n_to_read = sizeof cbuf;
+  fcntl (fileno (tty->input), F_SETFL, O_NONBLOCK);
+#else
+# error "Cannot read without possibly delaying"
+#endif
+
+#ifdef subprocesses
+  /* Don't read more than we can store.  */
+  if (n_to_read > buffer_free)
+    n_to_read = buffer_free;
+#endif /* subprocesses */
+
+  /* Now read; for one reason or another, this will not block.
+     NREAD is set to the number of chars read.  */
+  do
+    {
+      nread = emacs_read (fileno (tty->input), (char *) cbuf, n_to_read);
+      /* POSIX infers that processes which are not in the session leader's
+         process group won't get SIGHUPs at logout time.  BSDI adheres to
+         this part standard and returns -1 from read (0) with errno==EIO
+         when the control tty is taken away.
+         Jeffrey Honig <address@hidden> says this is generally safe.  */
+      if (nread == -1 && errno == EIO)
+        return -2;          /* Close this terminal.  */
+#if defined (AIX) && defined (_BSD)
+      /* The kernel sometimes fails to deliver SIGHUP for ptys.
+         This looks incorrect, but it isn't, because _BSD causes
+         O_NDELAY to be defined in fcntl.h as O_NONBLOCK,
+         and that causes a value other than 0 when there is no input.  */
+      if (nread == 0)
+        return -2;          /* Close this terminal.  */
+#endif
+    }
+  while (
+         /* We used to retry the read if it was interrupted.
+            But this does the wrong thing when O_NONBLOCK causes
+            an EAGAIN error.  Does anybody know of a situation
+            where a retry is actually needed?  */
+#if 0
+         nread < 0 && (errno == EAGAIN || errno == EFAULT
+#ifdef EBADSLT
+                       || errno == EBADSLT
+#endif
+                       )
+#else
+         0
+#endif
+         );
+
+#ifndef USABLE_FIONREAD
+#if defined (USG) || defined (CYGWIN)
+  fcntl (fileno (tty->input), F_SETFL, 0);
+#endif /* USG or CYGWIN */
+#endif /* no FIONREAD */
+
+  if (nread <= 0)
+    return nread;
+
+#endif /* not MSDOS */
+#endif /* not WINDOWSNT */
+
+  for (i = 0; i < nread; i++)
+    {
+      struct input_event buf;
+      EVENT_INIT (buf);
+      buf.kind = ASCII_KEYSTROKE_EVENT;
+      buf.modifiers = 0;
+      if (tty->meta_key == 1 && (cbuf[i] & 0x80))
+        buf.modifiers = meta_modifier;
+      if (tty->meta_key != 2)
+        cbuf[i] &= ~0x80;
+
+      buf.code = cbuf[i];
+      /* Set the frame corresponding to the active tty.  Note that the
+         value of selected_frame is not reliable here, redisplay tends
+         to temporarily change it.  */
+      buf.frame_or_window = tty->top_frame;
+      buf.arg = Qnil;
+
+      kbd_buffer_store_event (&buf);
+      /* Don't look at input that follows a C-g too closely.
+         This reduces lossage due to autorepeat on C-g.  */
+      if (buf.kind == ASCII_KEYSTROKE_EVENT
+          && buf.code == quit_char)
+        break;
+    }
+
+  return nread;
+}
+
+static void
+handle_async_input (void)
+{
+#ifdef USABLE_SIGIO
+  while (1)
+    {
+      int nread = gobble_input ();
+      /* -1 means it's not ok to read the input now.
+        UNBLOCK_INPUT will read it later; now, avoid infinite loop.
+        0 means there was no keyboard input available.  */
+      if (nread <= 0)
+       break;
+    }
+#endif
+}
+
+void
+process_pending_signals (void)
+{
+  pending_signals = 0;
+  handle_async_input ();
+  do_pending_atimers ();
+}
+
+/* Undo any number of BLOCK_INPUT calls down to level LEVEL,
+   and reinvoke any pending signal if the level is now 0 and
+   a fatal error is not already in progress.  */
+
+void
+unblock_input_to (int level)
+{
+  interrupt_input_blocked = level;
+  if (level == 0)
+    {
+      if (pending_signals && !fatal_error_in_progress)
+       process_pending_signals ();
+    }
+  else if (level < 0)
+    emacs_abort ();
+}
+
+/* End critical section.
+
+   If doing signal-driven input, and a signal came in when input was
+   blocked, reinvoke the signal handler now to deal with it.
+
+   It will also process queued input, if it was not read before.
+   When a longer code sequence does not use block/unblock input
+   at all, the whole input gathered up to the next call to
+   unblock_input will be processed inside that call. */
+
+void
+unblock_input (void)
+{
+  unblock_input_to (interrupt_input_blocked - 1);
+}
+
+/* Undo any number of BLOCK_INPUT calls,
+   and also reinvoke any pending signal.  */
+
+void
+totally_unblock_input (void)
+{
+  unblock_input_to (0);
+}
+
+#ifdef USABLE_SIGIO
+
+void
+handle_input_available_signal (int sig)
+{
+  pending_signals = 1;
+
+  if (input_available_clear_time)
+    *input_available_clear_time = make_timespec (0, 0);
+}
+
+static void
+deliver_input_available_signal (int sig)
+{
+  deliver_process_signal (sig, handle_input_available_signal);
+}
+#endif /* USABLE_SIGIO */
+
+
+/* User signal events.  */
+
+struct user_signal_info
+{
+  /* Signal number.  */
+  int sig;
+
+  /* Name of the signal.  */
+  char *name;
+
+  /* Number of pending signals.  */
+  int npending;
+
+  struct user_signal_info *next;
+};
+
+/* List of user signals.  */
+static struct user_signal_info *user_signals = NULL;
+
+void
+add_user_signal (int sig, const char *name)
+{
+  struct sigaction action;
+  struct user_signal_info *p;
+
+  for (p = user_signals; p; p = p->next)
+    if (p->sig == sig)
+      /* Already added.  */
+      return;
+
+  p = xmalloc (sizeof *p);
+  p->sig = sig;
+  p->name = xstrdup (name);
+  p->npending = 0;
+  p->next = user_signals;
+  user_signals = p;
+
+  emacs_sigaction_init (&action, deliver_user_signal);
+  sigaction (sig, &action, 0);
+}
+
+static void
+handle_user_signal (int sig)
+{
+  struct user_signal_info *p;
+  const char *special_event_name = NULL;
+
+  if (SYMBOLP (Vdebug_on_event))
+    special_event_name = SSDATA (SYMBOL_NAME (Vdebug_on_event));
+
+  for (p = user_signals; p; p = p->next)
+    if (p->sig == sig)
+      {
+        if (special_event_name
+           && strcmp (special_event_name, p->name) == 0)
+          {
+            /* Enter the debugger in many ways.  */
+            debug_on_next_call = 1;
+            debug_on_quit = 1;
+            Vquit_flag = Qt;
+            Vinhibit_quit = Qnil;
+
+            /* Eat the event.  */
+            break;
+          }
+
+       p->npending++;
+#ifdef USABLE_SIGIO
+       if (interrupt_input)
+         handle_input_available_signal (sig);
+       else
+#endif
+         {
+           /* Tell wait_reading_process_output that it needs to wake
+              up and look around.  */
+           if (input_available_clear_time)
+             *input_available_clear_time = make_timespec (0, 0);
+         }
+       break;
+      }
+}
+
+static void
+deliver_user_signal (int sig)
+{
+  deliver_process_signal (sig, handle_user_signal);
+}
+
+static char *
+find_user_signal_name (int sig)
+{
+  struct user_signal_info *p;
+
+  for (p = user_signals; p; p = p->next)
+    if (p->sig == sig)
+      return p->name;
+
+  return NULL;
+}
+
+static void
+store_user_signal_events (void)
+{
+  struct user_signal_info *p;
+  struct input_event buf;
+  bool buf_initialized = 0;
+
+  for (p = user_signals; p; p = p->next)
+    if (p->npending > 0)
+      {
+       if (! buf_initialized)
+         {
+           memset (&buf, 0, sizeof buf);
+           buf.kind = USER_SIGNAL_EVENT;
+           buf.frame_or_window = selected_frame;
+           buf_initialized = 1;
+         }
+
+       do
+         {
+           buf.code = p->sig;
+           kbd_buffer_store_event (&buf);
+           p->npending--;
+         }
+       while (p->npending > 0);
+      }
+}
+
+
+static void menu_bar_item (Lisp_Object, Lisp_Object, Lisp_Object, void *);
+static Lisp_Object menu_bar_one_keymap_changed_items;
+
+/* These variables hold the vector under construction within
+   menu_bar_items and its subroutines, and the current index
+   for storing into that vector.  */
+static Lisp_Object menu_bar_items_vector;
+static int menu_bar_items_index;
+
+
+static const char *separator_names[] = {
+  "space",
+  "no-line",
+  "single-line",
+  "double-line",
+  "single-dashed-line",
+  "double-dashed-line",
+  "shadow-etched-in",
+  "shadow-etched-out",
+  "shadow-etched-in-dash",
+  "shadow-etched-out-dash",
+  "shadow-double-etched-in",
+  "shadow-double-etched-out",
+  "shadow-double-etched-in-dash",
+  "shadow-double-etched-out-dash",
+  0,
+};
+
+/* Return true if LABEL specifies a separator.  */
+
+bool
+menu_separator_name_p (const char *label)
+{
+  if (!label)
+    return 0;
+  else if (strlen (label) > 3
+          && memcmp (label, "--", 2) == 0
+          && label[2] != '-')
+    {
+      int i;
+      label += 2;
+      for (i = 0; separator_names[i]; ++i)
+       if (strcmp (label, separator_names[i]) == 0)
+          return 1;
+    }
+  else
+    {
+      /* It's a separator if it contains only dashes.  */
+      while (*label == '-')
+       ++label;
+      return (*label == 0);
+    }
+
+  return 0;
+}
+
+
+/* Return a vector of menu items for a menu bar, appropriate
+   to the current buffer.  Each item has three elements in the vector:
+   KEY STRING MAPLIST.
+
+   OLD is an old vector we can optionally reuse, or nil.  */
+
+Lisp_Object
+menu_bar_items (Lisp_Object old)
+{
+  /* The number of keymaps we're scanning right now, and the number of
+     keymaps we have allocated space for.  */
+  ptrdiff_t nmaps;
+
+  /* maps[0..nmaps-1] are the prefix definitions of KEYBUF[0..t-1]
+     in the current keymaps, or nil where it is not a prefix.  */
+  Lisp_Object *maps;
+
+  Lisp_Object mapsbuf[3];
+  Lisp_Object def, tail;
+
+  ptrdiff_t mapno;
+  Lisp_Object oquit;
+
+  USE_SAFE_ALLOCA;
+
+  /* In order to build the menus, we need to call the keymap
+     accessors.  They all call QUIT.  But this function is called
+     during redisplay, during which a quit is fatal.  So inhibit
+     quitting while building the menus.
+     We do this instead of specbind because (1) errors will clear it anyway
+     and (2) this avoids risk of specpdl overflow.  */
+  oquit = Vinhibit_quit;
+  Vinhibit_quit = Qt;
+
+  if (!NILP (old))
+    menu_bar_items_vector = old;
+  else
+    menu_bar_items_vector = Fmake_vector (make_number (24), Qnil);
+  menu_bar_items_index = 0;
+
+  /* Build our list of keymaps.
+     If we recognize a function key and replace its escape sequence in
+     keybuf with its symbol, or if the sequence starts with a mouse
+     click and we need to switch buffers, we jump back here to rebuild
+     the initial keymaps from the current buffer.  */
+  {
+    Lisp_Object *tmaps;
+
+    /* Should overriding-terminal-local-map and overriding-local-map apply?  */
+    if (!NILP (Voverriding_local_map_menu_flag)
+       && !NILP (Voverriding_local_map))
+      {
+       /* Yes, use them (if non-nil) as well as the global map.  */
+       maps = mapsbuf;
+       nmaps = 0;
+       if (!NILP (KVAR (current_kboard, Voverriding_terminal_local_map)))
+         maps[nmaps++] = KVAR (current_kboard, Voverriding_terminal_local_map);
+       if (!NILP (Voverriding_local_map))
+         maps[nmaps++] = Voverriding_local_map;
+      }
+    else
+      {
+       /* No, so use major and minor mode keymaps and keymap property.
+          Note that menu-bar bindings in the local-map and keymap
+          properties may not work reliable, as they are only
+          recognized when the menu-bar (or mode-line) is updated,
+          which does not normally happen after every command.  */
+       Lisp_Object tem;
+       ptrdiff_t nminor;
+       nminor = current_minor_maps (NULL, &tmaps);
+       SAFE_NALLOCA (maps, 1, nminor + 4);
+       nmaps = 0;
+       tem = KVAR (current_kboard, Voverriding_terminal_local_map);
+       if (!NILP (tem) && !NILP (Voverriding_local_map_menu_flag))
+         maps[nmaps++] = tem;
+       if (tem = get_local_map (PT, current_buffer, Qkeymap), !NILP (tem))
+         maps[nmaps++] = tem;
+       memcpy (maps + nmaps, tmaps, nminor * sizeof (maps[0]));
+       nmaps += nminor;
+       maps[nmaps++] = get_local_map (PT, current_buffer, Qlocal_map);
+      }
+    maps[nmaps++] = current_global_map;
+  }
+
+  /* Look up in each map the dummy prefix key `menu-bar'.  */
+
+  for (mapno = nmaps - 1; mapno >= 0; mapno--)
+    if (!NILP (maps[mapno]))
+      {
+       def = get_keymap (access_keymap (maps[mapno], Qmenu_bar, 1, 0, 1),
+                         0, 1);
+       if (CONSP (def))
+         {
+           menu_bar_one_keymap_changed_items = Qnil;
+           map_keymap_canonical (def, menu_bar_item, Qnil, NULL);
+         }
+      }
+
+  /* Move to the end those items that should be at the end.  */
+
+  for (tail = Vmenu_bar_final_items; CONSP (tail); tail = XCDR (tail))
+    {
+      int i;
+      int end = menu_bar_items_index;
+
+      for (i = 0; i < end; i += 4)
+       if (EQ (XCAR (tail), AREF (menu_bar_items_vector, i)))
+         {
+           Lisp_Object tem0, tem1, tem2, tem3;
+           /* Move the item at index I to the end,
+              shifting all the others forward.  */
+           tem0 = AREF (menu_bar_items_vector, i + 0);
+           tem1 = AREF (menu_bar_items_vector, i + 1);
+           tem2 = AREF (menu_bar_items_vector, i + 2);
+           tem3 = AREF (menu_bar_items_vector, i + 3);
+           if (end > i + 4)
+             memmove (aref_addr (menu_bar_items_vector, i),
+                      aref_addr (menu_bar_items_vector, i + 4),
+                      (end - i - 4) * word_size);
+           ASET (menu_bar_items_vector, end - 4, tem0);
+           ASET (menu_bar_items_vector, end - 3, tem1);
+           ASET (menu_bar_items_vector, end - 2, tem2);
+           ASET (menu_bar_items_vector, end - 1, tem3);
+           break;
+         }
+    }
+
+  /* Add nil, nil, nil, nil at the end.  */
+  {
+    int i = menu_bar_items_index;
+    if (i + 4 > ASIZE (menu_bar_items_vector))
+      menu_bar_items_vector
+       = larger_vector (menu_bar_items_vector, 4, -1);
+    /* Add this item.  */
+    ASET (menu_bar_items_vector, i, Qnil); i++;
+    ASET (menu_bar_items_vector, i, Qnil); i++;
+    ASET (menu_bar_items_vector, i, Qnil); i++;
+    ASET (menu_bar_items_vector, i, Qnil); i++;
+    menu_bar_items_index = i;
+  }
+
+  Vinhibit_quit = oquit;
+  SAFE_FREE ();
+  return menu_bar_items_vector;
+}
+
+/* Add one item to menu_bar_items_vector, for KEY, ITEM_STRING and DEF.
+   If there's already an item for KEY, add this DEF to it.  */
+
+Lisp_Object item_properties;
+
+static void
+menu_bar_item (Lisp_Object key, Lisp_Object item, Lisp_Object dummy1, void 
*dummy2)
+{
+  struct gcpro gcpro1;
+  int i;
+  bool parsed;
+  Lisp_Object tem;
+
+  if (EQ (item, Qundefined))
+    {
+      /* If a map has an explicit `undefined' as definition,
+        discard any previously made menu bar item.  */
+
+      for (i = 0; i < menu_bar_items_index; i += 4)
+       if (EQ (key, AREF (menu_bar_items_vector, i)))
+         {
+           if (menu_bar_items_index > i + 4)
+             memmove (aref_addr (menu_bar_items_vector, i),
+                      aref_addr (menu_bar_items_vector, i + 4),
+                      (menu_bar_items_index - i - 4) * word_size);
+           menu_bar_items_index -= 4;
+         }
+    }
+
+  /* If this keymap has already contributed to this KEY,
+     don't contribute to it a second time.  */
+  tem = Fmemq (key, menu_bar_one_keymap_changed_items);
+  if (!NILP (tem) || NILP (item))
+    return;
+
+  menu_bar_one_keymap_changed_items
+    = Fcons (key, menu_bar_one_keymap_changed_items);
+
+  /* We add to menu_bar_one_keymap_changed_items before doing the
+     parse_menu_item, so that if it turns out it wasn't a menu item,
+     it still correctly hides any further menu item.  */
+  GCPRO1 (key);
+  parsed = parse_menu_item (item, 1);
+  UNGCPRO;
+  if (!parsed)
+    return;
+
+  item = AREF (item_properties, ITEM_PROPERTY_DEF);
+
+  /* Find any existing item for this KEY.  */
+  for (i = 0; i < menu_bar_items_index; i += 4)
+    if (EQ (key, AREF (menu_bar_items_vector, i)))
+      break;
+
+  /* If we did not find this KEY, add it at the end.  */
+  if (i == menu_bar_items_index)
+    {
+      /* If vector is too small, get a bigger one.  */
+      if (i + 4 > ASIZE (menu_bar_items_vector))
+       menu_bar_items_vector = larger_vector (menu_bar_items_vector, 4, -1);
+      /* Add this item.  */
+      ASET (menu_bar_items_vector, i, key); i++;
+      ASET (menu_bar_items_vector, i,
+           AREF (item_properties, ITEM_PROPERTY_NAME)); i++;
+      ASET (menu_bar_items_vector, i, list1 (item)); i++;
+      ASET (menu_bar_items_vector, i, make_number (0)); i++;
+      menu_bar_items_index = i;
+    }
+  /* We did find an item for this KEY.  Add ITEM to its list of maps.  */
+  else
+    {
+      Lisp_Object old;
+      old = AREF (menu_bar_items_vector, i + 2);
+      /* If the new and the old items are not both keymaps,
+        the lookup will only find `item'.  */
+      item = Fcons (item, KEYMAPP (item) && KEYMAPP (XCAR (old)) ? old : Qnil);
+      ASET (menu_bar_items_vector, i + 2, item);
+    }
+}
+
+ /* This is used as the handler when calling menu_item_eval_property.  */
+static Lisp_Object
+menu_item_eval_property_1 (Lisp_Object arg)
+{
+  /* If we got a quit from within the menu computation,
+     quit all the way out of it.  This takes care of C-] in the debugger.  */
+  if (CONSP (arg) && EQ (XCAR (arg), Qquit))
+    Fsignal (Qquit, Qnil);
+
+  return Qnil;
+}
+
+static Lisp_Object
+eval_dyn (Lisp_Object form)
+{
+  return Feval (form, Qnil);
+}
+
+/* Evaluate an expression and return the result (or nil if something
+   went wrong).  Used to evaluate dynamic parts of menu items.  */
+Lisp_Object
+menu_item_eval_property (Lisp_Object sexpr)
+{
+  ptrdiff_t count = SPECPDL_INDEX ();
+  Lisp_Object val;
+  specbind (Qinhibit_redisplay, Qt);
+  val = internal_condition_case_1 (eval_dyn, sexpr, Qerror,
+                                  menu_item_eval_property_1);
+  return unbind_to (count, val);
+}
+
+/* This function parses a menu item and leaves the result in the
+   vector item_properties.
+   ITEM is a key binding, a possible menu item.
+   INMENUBAR is > 0 when this is considered for an entry in a menu bar
+   top level.
+   INMENUBAR is < 0 when this is considered for an entry in a keyboard menu.
+   parse_menu_item returns true if the item is a menu item and false
+   otherwise.  */
+
+bool
+parse_menu_item (Lisp_Object item, int inmenubar)
+{
+  Lisp_Object def, tem, item_string, start;
+  Lisp_Object filter;
+  Lisp_Object keyhint;
+  int i;
+
+  filter = Qnil;
+  keyhint = Qnil;
+
+  if (!CONSP (item))
+    return 0;
+
+  /* Create item_properties vector if necessary.  */
+  if (NILP (item_properties))
+    item_properties
+      = Fmake_vector (make_number (ITEM_PROPERTY_ENABLE + 1), Qnil);
+
+  /* Initialize optional entries.  */
+  for (i = ITEM_PROPERTY_DEF; i < ITEM_PROPERTY_ENABLE; i++)
+    ASET (item_properties, i, Qnil);
+  ASET (item_properties, ITEM_PROPERTY_ENABLE, Qt);
+
+  /* Save the item here to protect it from GC.  */
+  ASET (item_properties, ITEM_PROPERTY_ITEM, item);
+
+  item_string = XCAR (item);
+
+  start = item;
+  item = XCDR (item);
+  if (STRINGP (item_string))
+    {
+      /* Old format menu item.  */
+      ASET (item_properties, ITEM_PROPERTY_NAME, item_string);
+
+      /* Maybe help string.  */
+      if (CONSP (item) && STRINGP (XCAR (item)))
+       {
+         ASET (item_properties, ITEM_PROPERTY_HELP, XCAR (item));
+         start = item;
+         item = XCDR (item);
+       }
+
+      /* Maybe an obsolete key binding cache.  */
+      if (CONSP (item) && CONSP (XCAR (item))
+         && (NILP (XCAR (XCAR (item)))
+             || VECTORP (XCAR (XCAR (item)))))
+       item = XCDR (item);
+
+      /* This is the real definition--the function to run.  */
+      ASET (item_properties, ITEM_PROPERTY_DEF, item);
+
+      /* Get enable property, if any.  */
+      if (SYMBOLP (item))
+       {
+         tem = Fget (item, Qmenu_enable);
+         if (!NILP (Venable_disabled_menus_and_buttons))
+           ASET (item_properties, ITEM_PROPERTY_ENABLE, Qt);
+         else if (!NILP (tem))
+           ASET (item_properties, ITEM_PROPERTY_ENABLE, tem);
+       }
+    }
+  else if (EQ (item_string, Qmenu_item) && CONSP (item))
+    {
+      /* New format menu item.  */
+      ASET (item_properties, ITEM_PROPERTY_NAME, XCAR (item));
+      start = XCDR (item);
+      if (CONSP (start))
+       {
+         /* We have a real binding.  */
+         ASET (item_properties, ITEM_PROPERTY_DEF, XCAR (start));
+
+         item = XCDR (start);
+         /* Is there an obsolete cache list with key equivalences.  */
+         if (CONSP (item) && CONSP (XCAR (item)))
+           item = XCDR (item);
+
+         /* Parse properties.  */
+         while (CONSP (item) && CONSP (XCDR (item)))
+           {
+             tem = XCAR (item);
+             item = XCDR (item);
+
+             if (EQ (tem, QCenable))
+               {
+                 if (!NILP (Venable_disabled_menus_and_buttons))
+                   ASET (item_properties, ITEM_PROPERTY_ENABLE, Qt);
+                 else
+                   ASET (item_properties, ITEM_PROPERTY_ENABLE, XCAR (item));
+               }
+             else if (EQ (tem, QCvisible))
+               {
+                 /* If got a visible property and that evaluates to nil
+                    then ignore this item.  */
+                 tem = menu_item_eval_property (XCAR (item));
+                 if (NILP (tem))
+                   return 0;
+               }
+             else if (EQ (tem, QChelp))
+               ASET (item_properties, ITEM_PROPERTY_HELP, XCAR (item));
+             else if (EQ (tem, QCfilter))
+               filter = item;
+             else if (EQ (tem, QCkey_sequence))
+               {
+                 tem = XCAR (item);
+                 if (SYMBOLP (tem) || STRINGP (tem) || VECTORP (tem))
+                   /* Be GC protected. Set keyhint to item instead of tem.  */
+                   keyhint = item;
+               }
+             else if (EQ (tem, QCkeys))
+               {
+                 tem = XCAR (item);
+                 if (CONSP (tem) || STRINGP (tem))
+                   ASET (item_properties, ITEM_PROPERTY_KEYEQ, tem);
+               }
+             else if (EQ (tem, QCbutton) && CONSP (XCAR (item)))
+               {
+                 Lisp_Object type;
+                 tem = XCAR (item);
+                 type = XCAR (tem);
+                 if (EQ (type, QCtoggle) || EQ (type, QCradio))
+                   {
+                     ASET (item_properties, ITEM_PROPERTY_SELECTED,
+                           XCDR (tem));
+                     ASET (item_properties, ITEM_PROPERTY_TYPE, type);
+                   }
+               }
+             item = XCDR (item);
+           }
+       }
+      else if (inmenubar || !NILP (start))
+       return 0;
+    }
+  else
+    return 0;                  /* not a menu item */
+
+  /* If item string is not a string, evaluate it to get string.
+     If we don't get a string, skip this item.  */
+  item_string = AREF (item_properties, ITEM_PROPERTY_NAME);
+  if (!(STRINGP (item_string)))
+    {
+      item_string = menu_item_eval_property (item_string);
+      if (!STRINGP (item_string))
+       return 0;
+      ASET (item_properties, ITEM_PROPERTY_NAME, item_string);
+    }
+
+  /* If got a filter apply it on definition.  */
+  def = AREF (item_properties, ITEM_PROPERTY_DEF);
+  if (!NILP (filter))
+    {
+      def = menu_item_eval_property (list2 (XCAR (filter),
+                                           list2 (Qquote, def)));
+
+      ASET (item_properties, ITEM_PROPERTY_DEF, def);
+    }
+
+  /* Enable or disable selection of item.  */
+  tem = AREF (item_properties, ITEM_PROPERTY_ENABLE);
+  if (!EQ (tem, Qt))
+    {
+      tem = menu_item_eval_property (tem);
+      if (inmenubar && NILP (tem))
+       return 0;               /* Ignore disabled items in menu bar.  */
+      ASET (item_properties, ITEM_PROPERTY_ENABLE, tem);
+    }
+
+  /* If we got no definition, this item is just unselectable text which
+     is OK in a submenu but not in the menubar.  */
+  if (NILP (def))
+    return (!inmenubar);
+
+  /* See if this is a separate pane or a submenu.  */
+  def = AREF (item_properties, ITEM_PROPERTY_DEF);
+  tem = get_keymap (def, 0, 1);
+  /* For a subkeymap, just record its details and exit.  */
+  if (CONSP (tem))
+    {
+      ASET (item_properties, ITEM_PROPERTY_MAP, tem);
+      ASET (item_properties, ITEM_PROPERTY_DEF, tem);
+      return 1;
+    }
+
+  /* At the top level in the menu bar, do likewise for commands also.
+     The menu bar does not display equivalent key bindings anyway.
+     ITEM_PROPERTY_DEF is already set up properly.  */
+  if (inmenubar > 0)
+    return 1;
+
+  { /* This is a command.  See if there is an equivalent key binding.  */
+    Lisp_Object keyeq = AREF (item_properties, ITEM_PROPERTY_KEYEQ);
+    AUTO_STRING (space_space, "  ");
+
+    /* The previous code preferred :key-sequence to :keys, so we
+       preserve this behavior.  */
+    if (STRINGP (keyeq) && !CONSP (keyhint))
+      keyeq = concat2 (space_space, Fsubstitute_command_keys (keyeq));
+    else
+      {
+       Lisp_Object prefix = keyeq;
+       Lisp_Object keys = Qnil;
+
+       if (CONSP (prefix))
+         {
+           def = XCAR (prefix);
+           prefix = XCDR (prefix);
+         }
+       else
+         def = AREF (item_properties, ITEM_PROPERTY_DEF);
+
+       if (CONSP (keyhint) && !NILP (XCAR (keyhint)))
+         {
+           keys = XCAR (keyhint);
+           tem = Fkey_binding (keys, Qnil, Qnil, Qnil);
+
+           /* We have a suggested key.  Is it bound to the command?  */
+           if (NILP (tem)
+               || (!EQ (tem, def)
+                   /* If the command is an alias for another
+                      (such as lmenu.el set it up), check if the
+                      original command matches the cached command.  */
+                   && !(SYMBOLP (def)
+                        && EQ (tem, XSYMBOL (def)->function))))
+             keys = Qnil;
+         }
+
+       if (NILP (keys))
+         keys = Fwhere_is_internal (def, Qnil, Qt, Qnil, Qnil);
+
+       if (!NILP (keys))
+         {
+           tem = Fkey_description (keys, Qnil);
+           if (CONSP (prefix))
+             {
+               if (STRINGP (XCAR (prefix)))
+                 tem = concat2 (XCAR (prefix), tem);
+               if (STRINGP (XCDR (prefix)))
+                 tem = concat2 (tem, XCDR (prefix));
+             }
+           keyeq = concat2 (space_space, tem);
+         }
+       else
+         keyeq = Qnil;
+      }
+
+    /* If we have an equivalent key binding, use that.  */
+    ASET (item_properties, ITEM_PROPERTY_KEYEQ, keyeq);
+  }
+
+  /* Include this when menu help is implemented.
+  tem = XVECTOR (item_properties)->contents[ITEM_PROPERTY_HELP];
+  if (!(NILP (tem) || STRINGP (tem)))
+    {
+      tem = menu_item_eval_property (tem);
+      if (!STRINGP (tem))
+       tem = Qnil;
+      XVECTOR (item_properties)->contents[ITEM_PROPERTY_HELP] = tem;
+    }
+  */
+
+  /* Handle radio buttons or toggle boxes.  */
+  tem = AREF (item_properties, ITEM_PROPERTY_SELECTED);
+  if (!NILP (tem))
+    ASET (item_properties, ITEM_PROPERTY_SELECTED,
+         menu_item_eval_property (tem));
+
+  return 1;
+}
+
+
+
+/***********************************************************************
+                              Tool-bars
+ ***********************************************************************/
+
+/* A vector holding tool bar items while they are parsed in function
+   tool_bar_items. Each item occupies TOOL_BAR_ITEM_NSCLOTS elements
+   in the vector.  */
+
+static Lisp_Object tool_bar_items_vector;
+
+/* A vector holding the result of parse_tool_bar_item.  Layout is like
+   the one for a single item in tool_bar_items_vector.  */
+
+static Lisp_Object tool_bar_item_properties;
+
+/* Next free index in tool_bar_items_vector.  */
+
+static int ntool_bar_items;
+
+/* Function prototypes.  */
+
+static void init_tool_bar_items (Lisp_Object);
+static void process_tool_bar_item (Lisp_Object, Lisp_Object, Lisp_Object,
+                                  void *);
+static bool parse_tool_bar_item (Lisp_Object, Lisp_Object);
+static void append_tool_bar_item (void);
+
+
+/* Return a vector of tool bar items for keymaps currently in effect.
+   Reuse vector REUSE if non-nil.  Return in *NITEMS the number of
+   tool bar items found.  */
+
+Lisp_Object
+tool_bar_items (Lisp_Object reuse, int *nitems)
+{
+  Lisp_Object *maps;
+  Lisp_Object mapsbuf[3];
+  ptrdiff_t nmaps, i;
+  Lisp_Object oquit;
+  Lisp_Object *tmaps;
+  USE_SAFE_ALLOCA;
+
+  *nitems = 0;
+
+  /* In order to build the menus, we need to call the keymap
+     accessors.  They all call QUIT.  But this function is called
+     during redisplay, during which a quit is fatal.  So inhibit
+     quitting while building the menus.  We do this instead of
+     specbind because (1) errors will clear it anyway and (2) this
+     avoids risk of specpdl overflow.  */
+  oquit = Vinhibit_quit;
+  Vinhibit_quit = Qt;
+
+  /* Initialize tool_bar_items_vector and protect it from GC.  */
+  init_tool_bar_items (reuse);
+
+  /* Build list of keymaps in maps.  Set nmaps to the number of maps
+     to process.  */
+
+  /* Should overriding-terminal-local-map and overriding-local-map apply?  */
+  if (!NILP (Voverriding_local_map_menu_flag)
+      && !NILP (Voverriding_local_map))
+    {
+      /* Yes, use them (if non-nil) as well as the global map.  */
+      maps = mapsbuf;
+      nmaps = 0;
+      if (!NILP (KVAR (current_kboard, Voverriding_terminal_local_map)))
+       maps[nmaps++] = KVAR (current_kboard, Voverriding_terminal_local_map);
+      if (!NILP (Voverriding_local_map))
+       maps[nmaps++] = Voverriding_local_map;
+    }
+  else
+    {
+      /* No, so use major and minor mode keymaps and keymap property.
+        Note that tool-bar bindings in the local-map and keymap
+        properties may not work reliable, as they are only
+        recognized when the tool-bar (or mode-line) is updated,
+        which does not normally happen after every command.  */
+      Lisp_Object tem;
+      ptrdiff_t nminor;
+      nminor = current_minor_maps (NULL, &tmaps);
+      SAFE_NALLOCA (maps, 1, nminor + 4);
+      nmaps = 0;
+      tem = KVAR (current_kboard, Voverriding_terminal_local_map);
+      if (!NILP (tem) && !NILP (Voverriding_local_map_menu_flag))
+       maps[nmaps++] = tem;
+      if (tem = get_local_map (PT, current_buffer, Qkeymap), !NILP (tem))
+       maps[nmaps++] = tem;
+      memcpy (maps + nmaps, tmaps, nminor * sizeof (maps[0]));
+      nmaps += nminor;
+      maps[nmaps++] = get_local_map (PT, current_buffer, Qlocal_map);
+    }
+
+  /* Add global keymap at the end.  */
+  maps[nmaps++] = current_global_map;
+
+  /* Process maps in reverse order and look up in each map the prefix
+     key `tool-bar'.  */
+  for (i = nmaps - 1; i >= 0; --i)
+    if (!NILP (maps[i]))
+      {
+       Lisp_Object keymap;
+
+       keymap = get_keymap (access_keymap (maps[i], Qtool_bar, 1, 0, 1), 0, 1);
+       if (CONSP (keymap))
+         map_keymap (keymap, process_tool_bar_item, Qnil, NULL, 1);
+      }
+
+  Vinhibit_quit = oquit;
+  *nitems = ntool_bar_items / TOOL_BAR_ITEM_NSLOTS;
+  SAFE_FREE ();
+  return tool_bar_items_vector;
+}
+
+
+/* Process the definition of KEY which is DEF.  */
+
+static void
+process_tool_bar_item (Lisp_Object key, Lisp_Object def, Lisp_Object data, 
void *args)
+{
+  int i;
+  struct gcpro gcpro1, gcpro2;
+
+  /* Protect KEY and DEF from GC because parse_tool_bar_item may call
+     eval.  */
+  GCPRO2 (key, def);
+
+  if (EQ (def, Qundefined))
+    {
+      /* If a map has an explicit `undefined' as definition,
+        discard any previously made item.  */
+      for (i = 0; i < ntool_bar_items; i += TOOL_BAR_ITEM_NSLOTS)
+       {
+         Lisp_Object *v = XVECTOR (tool_bar_items_vector)->contents + i;
+
+         if (EQ (key, v[TOOL_BAR_ITEM_KEY]))
+           {
+             if (ntool_bar_items > i + TOOL_BAR_ITEM_NSLOTS)
+               memmove (v, v + TOOL_BAR_ITEM_NSLOTS,
+                        ((ntool_bar_items - i - TOOL_BAR_ITEM_NSLOTS)
+                         * word_size));
+             ntool_bar_items -= TOOL_BAR_ITEM_NSLOTS;
+             break;
+           }
+       }
+    }
+  else if (parse_tool_bar_item (key, def))
+    /* Append a new tool bar item to tool_bar_items_vector.  Accept
+       more than one definition for the same key.  */
+    append_tool_bar_item ();
+
+  UNGCPRO;
+}
+
+/* Access slot with index IDX of vector tool_bar_item_properties.  */
+#define PROP(IDX) AREF (tool_bar_item_properties, (IDX))
+static void
+set_prop (ptrdiff_t idx, Lisp_Object val)
+{
+  ASET (tool_bar_item_properties, idx, val);
+}
+
+
+/* Parse a tool bar item specification ITEM for key KEY and return the
+   result in tool_bar_item_properties.  Value is false if ITEM is
+   invalid.
+
+   ITEM is a list `(menu-item CAPTION BINDING PROPS...)'.
+
+   CAPTION is the caption of the item,  If it's not a string, it is
+   evaluated to get a string.
+
+   BINDING is the tool bar item's binding.  Tool-bar items with keymaps
+   as binding are currently ignored.
+
+   The following properties are recognized:
+
+   - `:enable FORM'.
+
+   FORM is evaluated and specifies whether the tool bar item is
+   enabled or disabled.
+
+   - `:visible FORM'
+
+   FORM is evaluated and specifies whether the tool bar item is visible.
+
+   - `:filter FUNCTION'
+
+   FUNCTION is invoked with one parameter `(quote BINDING)'.  Its
+   result is stored as the new binding.
+
+   - `:button (TYPE SELECTED)'
+
+   TYPE must be one of `:radio' or `:toggle'.  SELECTED is evaluated
+   and specifies whether the button is selected (pressed) or not.
+
+   - `:image IMAGES'
+
+   IMAGES is either a single image specification or a vector of four
+   image specifications.  See enum tool_bar_item_images.
+
+   - `:help HELP-STRING'.
+
+   Gives a help string to display for the tool bar item.
+
+   - `:label LABEL-STRING'.
+
+   A text label to show with the tool bar button if labels are enabled.  */
+
+static bool
+parse_tool_bar_item (Lisp_Object key, Lisp_Object item)
+{
+  Lisp_Object filter = Qnil;
+  Lisp_Object caption;
+  int i;
+  bool have_label = 0;
+
+  /* Definition looks like `(menu-item CAPTION BINDING PROPS...)'.
+     Rule out items that aren't lists, don't start with
+     `menu-item' or whose rest following `tool-bar-item' is not a
+     list.  */
+  if (!CONSP (item))
+    return 0;
+
+  /* As an exception, allow old-style menu separators.  */
+  if (STRINGP (XCAR (item)))
+    item = list1 (XCAR (item));
+  else if (!EQ (XCAR (item), Qmenu_item)
+          || (item = XCDR (item), !CONSP (item)))
+    return 0;
+
+  /* Create tool_bar_item_properties vector if necessary.  Reset it to
+     defaults.  */
+  if (VECTORP (tool_bar_item_properties))
+    {
+      for (i = 0; i < TOOL_BAR_ITEM_NSLOTS; ++i)
+       set_prop (i, Qnil);
+    }
+  else
+    tool_bar_item_properties
+      = Fmake_vector (make_number (TOOL_BAR_ITEM_NSLOTS), Qnil);
+
+  /* Set defaults.  */
+  set_prop (TOOL_BAR_ITEM_KEY, key);
+  set_prop (TOOL_BAR_ITEM_ENABLED_P, Qt);
+
+  /* Get the caption of the item.  If the caption is not a string,
+     evaluate it to get a string.  If we don't get a string, skip this
+     item.  */
+  caption = XCAR (item);
+  if (!STRINGP (caption))
+    {
+      caption = menu_item_eval_property (caption);
+      if (!STRINGP (caption))
+       return 0;
+    }
+  set_prop (TOOL_BAR_ITEM_CAPTION, caption);
+
+  /* If the rest following the caption is not a list, the menu item is
+     either a separator, or invalid.  */
+  item = XCDR (item);
+  if (!CONSP (item))
+    {
+      if (menu_separator_name_p (SSDATA (caption)))
+       {
+         set_prop (TOOL_BAR_ITEM_TYPE, Qt);
+#if !defined (USE_GTK) && !defined (HAVE_NS)
+         /* If we use build_desired_tool_bar_string to render the
+            tool bar, the separator is rendered as an image.  */
+         set_prop (TOOL_BAR_ITEM_IMAGES,
+                   (menu_item_eval_property
+                    (Vtool_bar_separator_image_expression)));
+         set_prop (TOOL_BAR_ITEM_ENABLED_P, Qnil);
+         set_prop (TOOL_BAR_ITEM_SELECTED_P, Qnil);
+         set_prop (TOOL_BAR_ITEM_CAPTION, Qnil);
+#endif
+         return 1;
+       }
+      return 0;
+    }
+
+  /* Store the binding.  */
+  set_prop (TOOL_BAR_ITEM_BINDING, XCAR (item));
+  item = XCDR (item);
+
+  /* Ignore cached key binding, if any.  */
+  if (CONSP (item) && CONSP (XCAR (item)))
+    item = XCDR (item);
+
+  /* Process the rest of the properties.  */
+  for (; CONSP (item) && CONSP (XCDR (item)); item = XCDR (XCDR (item)))
+    {
+      Lisp_Object ikey, value;
+
+      ikey = XCAR (item);
+      value = XCAR (XCDR (item));
+
+      if (EQ (ikey, QCenable))
+       {
+         /* `:enable FORM'.  */
+         if (!NILP (Venable_disabled_menus_and_buttons))
+           set_prop (TOOL_BAR_ITEM_ENABLED_P, Qt);
+         else
+           set_prop (TOOL_BAR_ITEM_ENABLED_P, value);
+       }
+      else if (EQ (ikey, QCvisible))
+       {
+         /* `:visible FORM'.  If got a visible property and that
+            evaluates to nil then ignore this item.  */
+         if (NILP (menu_item_eval_property (value)))
+           return 0;
+       }
+      else if (EQ (ikey, QChelp))
+        /* `:help HELP-STRING'.  */
+        set_prop (TOOL_BAR_ITEM_HELP, value);
+      else if (EQ (ikey, QCvert_only))
+        /* `:vert-only t/nil'.  */
+        set_prop (TOOL_BAR_ITEM_VERT_ONLY, value);
+      else if (EQ (ikey, QClabel))
+        {
+          const char *bad_label = "!!?GARBLED ITEM?!!";
+          /* `:label LABEL-STRING'.  */
+          set_prop (TOOL_BAR_ITEM_LABEL,
+                   STRINGP (value) ? value : build_string (bad_label));
+          have_label = 1;
+        }
+      else if (EQ (ikey, QCfilter))
+       /* ':filter FORM'.  */
+       filter = value;
+      else if (EQ (ikey, QCbutton) && CONSP (value))
+       {
+         /* `:button (TYPE . SELECTED)'.  */
+         Lisp_Object type, selected;
+
+         type = XCAR (value);
+         selected = XCDR (value);
+         if (EQ (type, QCtoggle) || EQ (type, QCradio))
+           {
+             set_prop (TOOL_BAR_ITEM_SELECTED_P, selected);
+             set_prop (TOOL_BAR_ITEM_TYPE, type);
+           }
+       }
+      else if (EQ (ikey, QCimage)
+              && (CONSP (value)
+                  || (VECTORP (value) && ASIZE (value) == 4)))
+       /* Value is either a single image specification or a vector
+          of 4 such specifications for the different button states.  */
+       set_prop (TOOL_BAR_ITEM_IMAGES, value);
+      else if (EQ (ikey, QCrtl))
+        /* ':rtl STRING' */
+       set_prop (TOOL_BAR_ITEM_RTL_IMAGE, value);
+    }
+
+
+  if (!have_label)
+    {
+      /* Try to make one from caption and key.  */
+      Lisp_Object tkey = PROP (TOOL_BAR_ITEM_KEY);
+      Lisp_Object tcapt = PROP (TOOL_BAR_ITEM_CAPTION);
+      const char *label = SYMBOLP (tkey) ? SSDATA (SYMBOL_NAME (tkey)) : "";
+      const char *capt = STRINGP (tcapt) ? SSDATA (tcapt) : "";
+      ptrdiff_t max_lbl =
+       2 * max (0, min (tool_bar_max_label_size, STRING_BYTES_BOUND / 2));
+      char *buf = xmalloc (max_lbl + 1);
+      Lisp_Object new_lbl;
+      ptrdiff_t caption_len = strlen (capt);
+
+      if (caption_len <= max_lbl && capt[0] != '\0')
+        {
+          strcpy (buf, capt);
+          while (caption_len > 0 && buf[caption_len - 1] == '.')
+            caption_len--;
+         buf[caption_len] = '\0';
+         label = capt = buf;
+        }
+
+      if (strlen (label) <= max_lbl && label[0] != '\0')
+        {
+          ptrdiff_t j;
+          if (label != buf)
+           strcpy (buf, label);
+
+          for (j = 0; buf[j] != '\0'; ++j)
+           if (buf[j] == '-')
+             buf[j] = ' ';
+          label = buf;
+        }
+      else
+       label = "";
+
+      new_lbl = Fupcase_initials (build_string (label));
+      if (SCHARS (new_lbl) <= tool_bar_max_label_size)
+        set_prop (TOOL_BAR_ITEM_LABEL, new_lbl);
+      else
+        set_prop (TOOL_BAR_ITEM_LABEL, empty_unibyte_string);
+      xfree (buf);
+    }
+
+  /* If got a filter apply it on binding.  */
+  if (!NILP (filter))
+    set_prop (TOOL_BAR_ITEM_BINDING,
+             (menu_item_eval_property
+              (list2 (filter,
+                      list2 (Qquote,
+                             PROP (TOOL_BAR_ITEM_BINDING))))));
+
+  /* See if the binding is a keymap.  Give up if it is.  */
+  if (CONSP (get_keymap (PROP (TOOL_BAR_ITEM_BINDING), 0, 1)))
+    return 0;
+
+  /* Enable or disable selection of item.  */
+  if (!EQ (PROP (TOOL_BAR_ITEM_ENABLED_P), Qt))
+    set_prop (TOOL_BAR_ITEM_ENABLED_P,
+             menu_item_eval_property (PROP (TOOL_BAR_ITEM_ENABLED_P)));
+
+  /* Handle radio buttons or toggle boxes.  */
+  if (!NILP (PROP (TOOL_BAR_ITEM_SELECTED_P)))
+    set_prop (TOOL_BAR_ITEM_SELECTED_P,
+             menu_item_eval_property (PROP (TOOL_BAR_ITEM_SELECTED_P)));
+
+  return 1;
+
+#undef PROP
+}
+
+
+/* Initialize tool_bar_items_vector.  REUSE, if non-nil, is a vector
+   that can be reused.  */
+
+static void
+init_tool_bar_items (Lisp_Object reuse)
+{
+  if (VECTORP (reuse))
+    tool_bar_items_vector = reuse;
+  else
+    tool_bar_items_vector = Fmake_vector (make_number (64), Qnil);
+  ntool_bar_items = 0;
+}
+
+
+/* Append parsed tool bar item properties from
+   tool_bar_item_properties */
+
+static void
+append_tool_bar_item (void)
+{
+  ptrdiff_t incr
+    = (ntool_bar_items
+       - (ASIZE (tool_bar_items_vector) - TOOL_BAR_ITEM_NSLOTS));
+
+  /* Enlarge tool_bar_items_vector if necessary.  */
+  if (incr > 0)
+    tool_bar_items_vector = larger_vector (tool_bar_items_vector, incr, -1);
+
+  /* Append entries from tool_bar_item_properties to the end of
+     tool_bar_items_vector.  */
+  vcopy (tool_bar_items_vector, ntool_bar_items,
+        XVECTOR (tool_bar_item_properties)->contents, TOOL_BAR_ITEM_NSLOTS);
+  ntool_bar_items += TOOL_BAR_ITEM_NSLOTS;
+}
+
+
+
+
+
+/* Read a character using menus based on the keymap MAP.
+   Return nil if there are no menus in the maps.
+   Return t if we displayed a menu but the user rejected it.
+
+   PREV_EVENT is the previous input event, or nil if we are reading
+   the first event of a key sequence.
+
+   If USED_MOUSE_MENU is non-null, set *USED_MOUSE_MENU to true
+   if we used a mouse menu to read the input, or false otherwise.  If
+   USED_MOUSE_MENU is null, don't dereference it.
+
+   The prompting is done based on the prompt-string of the map
+   and the strings associated with various map elements.
+
+   This can be done with X menus or with menus put in the minibuf.
+   These are done in different ways, depending on how the input will be read.
+   Menus using X are done after auto-saving in read-char, getting the input
+   event from Fx_popup_menu; menus using the minibuf use read_char recursively
+   and do auto-saving in the inner call of read_char.  */
+
+static Lisp_Object
+read_char_x_menu_prompt (Lisp_Object map,
+                        Lisp_Object prev_event, bool *used_mouse_menu)
+{
+  if (used_mouse_menu)
+    *used_mouse_menu = 0;
+
+  /* Use local over global Menu maps.  */
+
+  if (! menu_prompting)
+    return Qnil;
+
+  /* If we got to this point via a mouse click,
+     use a real menu for mouse selection.  */
+  if (EVENT_HAS_PARAMETERS (prev_event)
+      && !EQ (XCAR (prev_event), Qmenu_bar)
+      && !EQ (XCAR (prev_event), Qtool_bar))
+    {
+      /* Display the menu and get the selection.  */
+      Lisp_Object value;
+
+      value = Fx_popup_menu (prev_event, get_keymap (map, 0, 1));
+      if (CONSP (value))
+       {
+         Lisp_Object tem;
+
+         record_menu_key (XCAR (value));
+
+         /* If we got multiple events, unread all but
+            the first.
+            There is no way to prevent those unread events
+            from showing up later in last_nonmenu_event.
+            So turn symbol and integer events into lists,
+            to indicate that they came from a mouse menu,
+            so that when present in last_nonmenu_event
+            they won't confuse things.  */
+         for (tem = XCDR (value); CONSP (tem); tem = XCDR (tem))
+           {
+             record_menu_key (XCAR (tem));
+             if (SYMBOLP (XCAR (tem))
+                 || INTEGERP (XCAR (tem)))
+               XSETCAR (tem, Fcons (XCAR (tem), Qdisabled));
+           }
+
+         /* If we got more than one event, put all but the first
+            onto this list to be read later.
+            Return just the first event now.  */
+         Vunread_command_events
+           = nconc2 (XCDR (value), Vunread_command_events);
+         value = XCAR (value);
+       }
+      else if (NILP (value))
+       value = Qt;
+      if (used_mouse_menu)
+       *used_mouse_menu = 1;
+      return value;
+    }
+  return Qnil ;
+}
+
+static Lisp_Object
+read_char_minibuf_menu_prompt (int commandflag,
+                              Lisp_Object map)
+{
+  Lisp_Object name;
+  ptrdiff_t nlength;
+  /* FIXME: Use the minibuffer's frame width.  */
+  ptrdiff_t width = FRAME_COLS (SELECTED_FRAME ()) - 4;
+  ptrdiff_t idx = -1;
+  bool nobindings = 1;
+  Lisp_Object rest, vector;
+  Lisp_Object prompt_strings = Qnil;
+
+  vector = Qnil;
+
+  if (! menu_prompting)
+    return Qnil;
+
+  map = get_keymap (map, 0, 1);
+  name = Fkeymap_prompt (map);
+
+  /* If we don't have any menus, just read a character normally.  */
+  if (!STRINGP (name))
+    return Qnil;
+
+#define PUSH_C_STR(str, listvar) \
+  listvar = Fcons (build_unibyte_string (str), listvar)
+
+  /* Prompt string always starts with map's prompt, and a space.  */
+  prompt_strings = Fcons (name, prompt_strings);
+  PUSH_C_STR (": ", prompt_strings);
+  nlength = SCHARS (name) + 2;
+
+  rest = map;
+
+  /* Present the documented bindings, a line at a time.  */
+  while (1)
+    {
+      bool notfirst = 0;
+      Lisp_Object menu_strings = prompt_strings;
+      ptrdiff_t i = nlength;
+      Lisp_Object obj;
+      Lisp_Object orig_defn_macro;
+
+      /* Loop over elements of map.  */
+      while (i < width)
+       {
+         Lisp_Object elt;
+
+         /* FIXME: Use map_keymap to handle new keymap formats.  */
+
+         /* At end of map, wrap around if just starting,
+            or end this line if already have something on it.  */
+         if (NILP (rest))
+           {
+             if (notfirst || nobindings)
+               break;
+             else
+               rest = map;
+           }
+
+         /* Look at the next element of the map.  */
+         if (idx >= 0)
+           elt = AREF (vector, idx);
+         else
+           elt = Fcar_safe (rest);
+
+         if (idx < 0 && VECTORP (elt))
+           {
+             /* If we found a dense table in the keymap,
+                advanced past it, but start scanning its contents.  */
+             rest = Fcdr_safe (rest);
+             vector = elt;
+             idx = 0;
+           }
+         else
+           {
+             /* An ordinary element.  */
+             Lisp_Object event, tem;
+
+             if (idx < 0)
+               {
+                 event = Fcar_safe (elt); /* alist */
+                 elt = Fcdr_safe (elt);
+               }
+             else
+               {
+                 XSETINT (event, idx); /* vector */
+               }
+
+             /* Ignore the element if it has no prompt string.  */
+             if (INTEGERP (event) && parse_menu_item (elt, -1))
+               {
+                 /* True if the char to type matches the string.  */
+                 bool char_matches;
+                 Lisp_Object upcased_event, downcased_event;
+                 Lisp_Object desc = Qnil;
+                 Lisp_Object s
+                   = AREF (item_properties, ITEM_PROPERTY_NAME);
+
+                 upcased_event = Fupcase (event);
+                 downcased_event = Fdowncase (event);
+                 char_matches = (XINT (upcased_event) == SREF (s, 0)
+                                 || XINT (downcased_event) == SREF (s, 0));
+                 if (! char_matches)
+                   desc = Fsingle_key_description (event, Qnil);
+
+#if 0  /* It is redundant to list the equivalent key bindings because
+         the prefix is what the user has already typed.  */
+                 tem
+                   = XVECTOR (item_properties)->contents[ITEM_PROPERTY_KEYEQ];
+                 if (!NILP (tem))
+                   /* Insert equivalent keybinding.  */
+                   s = concat2 (s, tem);
+#endif
+                 tem
+                   = AREF (item_properties, ITEM_PROPERTY_TYPE);
+                 if (EQ (tem, QCradio) || EQ (tem, QCtoggle))
+                   {
+                     /* Insert button prefix.  */
+                     Lisp_Object selected
+                       = AREF (item_properties, ITEM_PROPERTY_SELECTED);
+                     AUTO_STRING (radio_yes, "(*) ");
+                     AUTO_STRING (radio_no , "( ) ");
+                     AUTO_STRING (check_yes, "[X] ");
+                     AUTO_STRING (check_no , "[ ] ");
+                     if (EQ (tem, QCradio))
+                       tem = NILP (selected) ? radio_yes : radio_no;
+                     else
+                       tem = NILP (selected) ? check_yes : check_no;
+                     s = concat2 (tem, s);
+                   }
+
+
+                 /* If we have room for the prompt string, add it to this line.
+                    If this is the first on the line, always add it.  */
+                 if ((SCHARS (s) + i + 2
+                      + (char_matches ? 0 : SCHARS (desc) + 3))
+                     < width
+                     || !notfirst)
+                   {
+                     ptrdiff_t thiswidth;
+
+                     /* Punctuate between strings.  */
+                     if (notfirst)
+                       {
+                         PUSH_C_STR (", ", menu_strings);
+                         i += 2;
+                       }
+                     notfirst = 1;
+                     nobindings = 0;
+
+                     /* If the char to type doesn't match the string's
+                        first char, explicitly show what char to type.  */
+                     if (! char_matches)
+                       {
+                         /* Add as much of string as fits.  */
+                         thiswidth = min (SCHARS (desc), width - i);
+                         menu_strings
+                           = Fcons (Fsubstring (desc, make_number (0),
+                                                make_number (thiswidth)),
+                                    menu_strings);
+                         i += thiswidth;
+                         PUSH_C_STR (" = ", menu_strings);
+                         i += 3;
+                       }
+
+                     /* Add as much of string as fits.  */
+                     thiswidth = min (SCHARS (s), width - i);
+                     menu_strings
+                       = Fcons (Fsubstring (s, make_number (0),
+                                            make_number (thiswidth)),
+                                menu_strings);
+                     i += thiswidth;
+                   }
+                 else
+                   {
+                     /* If this element does not fit, end the line now,
+                        and save the element for the next line.  */
+                     PUSH_C_STR ("...", menu_strings);
+                     break;
+                   }
+               }
+
+             /* Move past this element.  */
+             if (idx >= 0 && idx + 1 >= ASIZE (vector))
+               /* Handle reaching end of dense table.  */
+               idx = -1;
+             if (idx >= 0)
+               idx++;
+             else
+               rest = Fcdr_safe (rest);
+           }
+       }
+
+      /* Prompt with that and read response.  */
+      message3_nolog (apply1 (intern ("concat"), Fnreverse (menu_strings)));
+
+      /* Make believe it's not a keyboard macro in case the help char
+        is pressed.  Help characters are not recorded because menu prompting
+        is not used on replay.  */
+      orig_defn_macro = KVAR (current_kboard, defining_kbd_macro);
+      kset_defining_kbd_macro (current_kboard, Qnil);
+      do
+       obj = read_char (commandflag, Qnil, Qt, 0, NULL);
+      while (BUFFERP (obj));
+      kset_defining_kbd_macro (current_kboard, orig_defn_macro);
+
+      if (!INTEGERP (obj) || XINT (obj) == -2
+         || (! EQ (obj, menu_prompt_more_char)
+             && (!INTEGERP (menu_prompt_more_char)
+                 || ! EQ (obj, make_number (Ctl (XINT 
(menu_prompt_more_char)))))))
+       {
+         if (!NILP (KVAR (current_kboard, defining_kbd_macro)))
+           store_kbd_macro_char (obj);
+         return obj;
+       }
+      /* Help char - go round again.  */
+    }
+}
+
+/* Reading key sequences.  */
+
+static Lisp_Object
+follow_key (Lisp_Object keymap, Lisp_Object key)
+{
+  return access_keymap (get_keymap (keymap, 0, 1),
+                       key, 1, 0, 1);
+}
+
+static Lisp_Object
+active_maps (Lisp_Object first_event)
+{
+  Lisp_Object position
+    = CONSP (first_event) ? CAR_SAFE (XCDR (first_event)) : Qnil;
+  return Fcons (Qkeymap, Fcurrent_active_maps (Qt, position));
+}
+
+/* Structure used to keep track of partial application of key remapping
+   such as Vfunction_key_map and Vkey_translation_map.  */
+typedef struct keyremap
+{
+  /* This is the map originally specified for this use.  */
+  Lisp_Object parent;
+  /* This is a submap reached by looking up, in PARENT,
+     the events from START to END.  */
+  Lisp_Object map;
+  /* Positions [START, END) in the key sequence buffer
+     are the key that we have scanned so far.
+     Those events are the ones that we will replace
+     if PARENT maps them into a key sequence.  */
+  int start, end;
+} keyremap;
+
+/* Lookup KEY in MAP.
+   MAP is a keymap mapping keys to key vectors or functions.
+   If the mapping is a function and DO_FUNCALL is true,
+   the function is called with PROMPT as parameter and its return
+   value is used as the return value of this function (after checking
+   that it is indeed a vector).  */
+
+static Lisp_Object
+access_keymap_keyremap (Lisp_Object map, Lisp_Object key, Lisp_Object prompt,
+                       bool do_funcall)
+{
+  Lisp_Object next;
+
+  next = access_keymap (map, key, 1, 0, 1);
+
+  /* Handle a symbol whose function definition is a keymap
+     or an array.  */
+  if (SYMBOLP (next) && !NILP (Ffboundp (next))
+      && (ARRAYP (XSYMBOL (next)->function)
+         || KEYMAPP (XSYMBOL (next)->function)))
+    next = Fautoload_do_load (XSYMBOL (next)->function, next, Qnil);
+
+  /* If the keymap gives a function, not an
+     array, then call the function with one arg and use
+     its value instead.  */
+  if (do_funcall && FUNCTIONP (next))
+    {
+      Lisp_Object tem;
+      tem = next;
+
+      next = call1 (next, prompt);
+      /* If the function returned something invalid,
+        barf--don't ignore it.
+        (To ignore it safely, we would need to gcpro a bunch of
+        other variables.)  */
+      if (! (NILP (next) || VECTORP (next) || STRINGP (next)))
+       error ("Function %s returns invalid key sequence",
+              SSDATA (SYMBOL_NAME (tem)));
+    }
+  return next;
+}
+
+/* Do one step of the key remapping used for function-key-map and
+   key-translation-map:
+   KEYBUF is the buffer holding the input events.
+   BUFSIZE is its maximum size.
+   FKEY is a pointer to the keyremap structure to use.
+   INPUT is the index of the last element in KEYBUF.
+   DOIT if true says that the remapping can actually take place.
+   DIFF is used to return the number of keys added/removed by the remapping.
+   PARENT is the root of the keymap.
+   PROMPT is the prompt to use if the remapping happens through a function.
+   Return true if the remapping actually took place.  */
+
+static bool
+keyremap_step (Lisp_Object *keybuf, int bufsize, volatile keyremap *fkey,
+              int input, bool doit, int *diff, Lisp_Object prompt)
+{
+  Lisp_Object next, key;
+
+  key = keybuf[fkey->end++];
+
+  if (KEYMAPP (fkey->parent))
+    next = access_keymap_keyremap (fkey->map, key, prompt, doit);
+  else
+    next = Qnil;
+
+  /* If keybuf[fkey->start..fkey->end] is bound in the
+     map and we're in a position to do the key remapping, replace it with
+     the binding and restart with fkey->start at the end.  */
+  if ((VECTORP (next) || STRINGP (next)) && doit)
+    {
+      int len = XFASTINT (Flength (next));
+      int i;
+
+      *diff = len - (fkey->end - fkey->start);
+
+      if (bufsize - input <= *diff)
+       error ("Key sequence too long");
+
+      /* Shift the keys that follow fkey->end.  */
+      if (*diff < 0)
+       for (i = fkey->end; i < input; i++)
+         keybuf[i + *diff] = keybuf[i];
+      else if (*diff > 0)
+       for (i = input - 1; i >= fkey->end; i--)
+         keybuf[i + *diff] = keybuf[i];
+      /* Overwrite the old keys with the new ones.  */
+      for (i = 0; i < len; i++)
+       keybuf[fkey->start + i]
+         = Faref (next, make_number (i));
+
+      fkey->start = fkey->end += *diff;
+      fkey->map = fkey->parent;
+
+      return 1;
+    }
+
+  fkey->map = get_keymap (next, 0, 1);
+
+  /* If we no longer have a bound suffix, try a new position for
+     fkey->start.  */
+  if (!CONSP (fkey->map))
+    {
+      fkey->end = ++fkey->start;
+      fkey->map = fkey->parent;
+    }
+  return 0;
+}
+
+static bool
+test_undefined (Lisp_Object binding)
+{
+  return (NILP (binding)
+         || EQ (binding, Qundefined)
+         || (SYMBOLP (binding)
+             && EQ (Fcommand_remapping (binding, Qnil, Qnil), Qundefined)));
+}
+
+/* Read a sequence of keys that ends with a non prefix character,
+   storing it in KEYBUF, a buffer of size BUFSIZE.
+   Prompt with PROMPT.
+   Return the length of the key sequence stored.
+   Return -1 if the user rejected a command menu.
+
+   Echo starting immediately unless `prompt' is 0.
+
+   If PREVENT_REDISPLAY is non-zero, avoid redisplay by calling
+   read_char with a suitable COMMANDFLAG argument.
+
+   Where a key sequence ends depends on the currently active keymaps.
+   These include any minor mode keymaps active in the current buffer,
+   the current buffer's local map, and the global map.
+
+   If a key sequence has no other bindings, we check Vfunction_key_map
+   to see if some trailing subsequence might be the beginning of a
+   function key's sequence.  If so, we try to read the whole function
+   key, and substitute its symbolic name into the key sequence.
+
+   We ignore unbound `down-' mouse clicks.  We turn unbound `drag-' and
+   `double-' events into similar click events, if that would make them
+   bound.  We try to turn `triple-' events first into `double-' events,
+   then into clicks.
+
+   If we get a mouse click in a mode line, vertical divider, or other
+   non-text area, we treat the click as if it were prefixed by the
+   symbol denoting that area - `mode-line', `vertical-line', or
+   whatever.
+
+   If the sequence starts with a mouse click, we read the key sequence
+   with respect to the buffer clicked on, not the current buffer.
+
+   If the user switches frames in the midst of a key sequence, we put
+   off the switch-frame event until later; the next call to
+   read_char will return it.
+
+   If FIX_CURRENT_BUFFER, we restore current_buffer
+   from the selected window's buffer.  */
+
+static int
+read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt,
+                  bool dont_downcase_last, bool can_return_switch_frame,
+                  bool fix_current_buffer, bool prevent_redisplay)
+{
+  ptrdiff_t count = SPECPDL_INDEX ();
+
+  /* How many keys there are in the current key sequence.  */
+  int t;
+
+  /* The length of the echo buffer when we started reading, and
+     the length of this_command_keys when we started reading.  */
+  ptrdiff_t echo_start IF_LINT (= 0);
+  ptrdiff_t keys_start;
+
+  Lisp_Object current_binding = Qnil;
+  Lisp_Object first_event = Qnil;
+
+  /* Index of the first key that has no binding.
+     It is useless to try fkey.start larger than that.  */
+  int first_unbound;
+
+  /* If t < mock_input, then KEYBUF[t] should be read as the next
+     input key.
+
+     We use this to recover after recognizing a function key.  Once we
+     realize that a suffix of the current key sequence is actually a
+     function key's escape sequence, we replace the suffix with the
+     function key's binding from Vfunction_key_map.  Now keybuf
+     contains a new and different key sequence, so the echo area,
+     this_command_keys, and the submaps and defs arrays are wrong.  In
+     this situation, we set mock_input to t, set t to 0, and jump to
+     restart_sequence; the loop will read keys from keybuf up until
+     mock_input, thus rebuilding the state; and then it will resume
+     reading characters from the keyboard.  */
+  int mock_input = 0;
+
+  /* If the sequence is unbound in submaps[], then
+     keybuf[fkey.start..fkey.end-1] is a prefix in Vfunction_key_map,
+     and fkey.map is its binding.
+
+     These might be > t, indicating that all function key scanning
+     should hold off until t reaches them.  We do this when we've just
+     recognized a function key, to avoid searching for the function
+     key's again in Vfunction_key_map.  */
+  keyremap fkey;
+
+  /* Likewise, for key_translation_map and input-decode-map.  */
+  keyremap keytran, indec;
+
+  /* True if we are trying to map a key by changing an upper-case
+     letter to lower case, or a shifted function key to an unshifted
+     one.  */
+  bool shift_translated = 0;
+
+  /* If we receive a `switch-frame' or `select-window' event in the middle of
+     a key sequence, we put it off for later.
+     While we're reading, we keep the event here.  */
+  Lisp_Object delayed_switch_frame;
+
+  Lisp_Object original_uppercase IF_LINT (= Qnil);
+  int original_uppercase_position = -1;
+
+  /* Gets around Microsoft compiler limitations.  */
+  bool dummyflag = 0;
+
+  struct buffer *starting_buffer;
+
+  /* List of events for which a fake prefix key has been generated.  */
+  Lisp_Object fake_prefixed_keys = Qnil;
+
+  struct gcpro gcpro1;
+
+  GCPRO1 (fake_prefixed_keys);
+  raw_keybuf_count = 0;
+
+  last_nonmenu_event = Qnil;
+
+  delayed_switch_frame = Qnil;
+
+  if (INTERACTIVE)
+    {
+      if (!NILP (prompt))
+       {
+         /* Install the string PROMPT as the beginning of the string
+            of echoing, so that it serves as a prompt for the next
+            character.  */
+         kset_echo_string (current_kboard, prompt);
+         current_kboard->echo_after_prompt = SCHARS (prompt);
+         echo_now ();
+       }
+      else if (cursor_in_echo_area
+              && echo_keystrokes_p ())
+       /* This doesn't put in a dash if the echo buffer is empty, so
+          you don't always see a dash hanging out in the minibuffer.  */
+       echo_dash ();
+    }
+
+  /* Record the initial state of the echo area and this_command_keys;
+     we will need to restore them if we replay a key sequence.  */
+  if (INTERACTIVE)
+    echo_start = echo_length ();
+  keys_start = this_command_key_count;
+  this_single_command_key_start = keys_start;
+
+  /* We jump here when we need to reinitialize fkey and keytran; this
+     happens if we switch keyboards between rescans.  */
+ replay_entire_sequence:
+
+  indec.map = indec.parent = KVAR (current_kboard, Vinput_decode_map);
+  fkey.map = fkey.parent = KVAR (current_kboard, Vlocal_function_key_map);
+  keytran.map = keytran.parent = Vkey_translation_map;
+  indec.start = indec.end = 0;
+  fkey.start = fkey.end = 0;
+  keytran.start = keytran.end = 0;
+
+  /* We jump here when the key sequence has been thoroughly changed, and
+     we need to rescan it starting from the beginning.  When we jump here,
+     keybuf[0..mock_input] holds the sequence we should reread.  */
+ replay_sequence:
+
+  starting_buffer = current_buffer;
+  first_unbound = bufsize + 1;
+
+  /* Build our list of keymaps.
+     If we recognize a function key and replace its escape sequence in
+     keybuf with its symbol, or if the sequence starts with a mouse
+     click and we need to switch buffers, we jump back here to rebuild
+     the initial keymaps from the current buffer.  */
+  current_binding = active_maps (first_event);
+
+  /* Start from the beginning in keybuf.  */
+  t = 0;
+
+  /* These are no-ops the first time through, but if we restart, they
+     revert the echo area and this_command_keys to their original state.  */
+  this_command_key_count = keys_start;
+  if (INTERACTIVE && t < mock_input)
+    echo_truncate (echo_start);
+
+  /* If the best binding for the current key sequence is a keymap, or
+     we may be looking at a function key's escape sequence, keep on
+     reading.  */
+  while (!NILP (current_binding)
+        /* Keep reading as long as there's a prefix binding.  */
+        ? KEYMAPP (current_binding)
+        /* Don't return in the middle of a possible function key sequence,
+           if the only bindings we found were via case conversion.
+           Thus, if ESC O a has a function-key-map translation
+           and ESC o has a binding, don't return after ESC O,
+           so that we can translate ESC O plus the next character.  */
+        : (/* indec.start < t || fkey.start < t || */ keytran.start < t))
+    {
+      Lisp_Object key;
+      bool used_mouse_menu = 0;
+
+      /* Where the last real key started.  If we need to throw away a
+         key that has expanded into more than one element of keybuf
+         (say, a mouse click on the mode line which is being treated
+         as [mode-line (mouse-...)], then we backtrack to this point
+         of keybuf.  */
+      int last_real_key_start;
+
+      /* These variables are analogous to echo_start and keys_start;
+        while those allow us to restart the entire key sequence,
+        echo_local_start and keys_local_start allow us to throw away
+        just one key.  */
+      ptrdiff_t echo_local_start IF_LINT (= 0);
+      int keys_local_start;
+      Lisp_Object new_binding;
+
+      eassert (indec.end == t || (indec.end > t && indec.end <= mock_input));
+      eassert (indec.start <= indec.end);
+      eassert (fkey.start <= fkey.end);
+      eassert (keytran.start <= keytran.end);
+      /* key-translation-map is applied *after* function-key-map
+        which is itself applied *after* input-decode-map.  */
+      eassert (fkey.end <= indec.start);
+      eassert (keytran.end <= fkey.start);
+
+      if (/* first_unbound < indec.start && first_unbound < fkey.start && */
+         first_unbound < keytran.start)
+       { /* The prefix upto first_unbound has no binding and has
+            no translation left to do either, so we know it's unbound.
+            If we don't stop now, we risk staying here indefinitely
+            (if the user keeps entering fkey or keytran prefixes
+            like C-c ESC ESC ESC ESC ...)  */
+         int i;
+         for (i = first_unbound + 1; i < t; i++)
+           keybuf[i - first_unbound - 1] = keybuf[i];
+         mock_input = t - first_unbound - 1;
+         indec.end = indec.start -= first_unbound + 1;
+         indec.map = indec.parent;
+         fkey.end = fkey.start -= first_unbound + 1;
+         fkey.map = fkey.parent;
+         keytran.end = keytran.start -= first_unbound + 1;
+         keytran.map = keytran.parent;
+         goto replay_sequence;
+       }
+
+      if (t >= bufsize)
+       error ("Key sequence too long");
+
+      if (INTERACTIVE)
+       echo_local_start = echo_length ();
+      keys_local_start = this_command_key_count;
+
+    replay_key:
+      /* These are no-ops, unless we throw away a keystroke below and
+        jumped back up to replay_key; in that case, these restore the
+        variables to their original state, allowing us to replay the
+        loop.  */
+      if (INTERACTIVE && t < mock_input)
+       echo_truncate (echo_local_start);
+      this_command_key_count = keys_local_start;
+
+      /* By default, assume each event is "real".  */
+      last_real_key_start = t;
+
+      /* Does mock_input indicate that we are re-reading a key sequence?  */
+      if (t < mock_input)
+       {
+         key = keybuf[t];
+         add_command_key (key);
+         if (echo_keystrokes_p ()
+             && current_kboard->immediate_echo)
+           {
+             echo_add_key (key);
+             echo_dash ();
+           }
+       }
+
+      /* If not, we should actually read a character.  */
+      else
+       {
+         {
+           KBOARD *interrupted_kboard = current_kboard;
+           struct frame *interrupted_frame = SELECTED_FRAME ();
+           /* Calling read_char with COMMANDFLAG = -2 avoids
+              redisplay in read_char and its subroutines.  */
+           key = read_char (prevent_redisplay ? -2 : NILP (prompt),
+                            current_binding, last_nonmenu_event,
+                             &used_mouse_menu, NULL);
+           if ((INTEGERP (key) && XINT (key) == -2) /* wrong_kboard_jmpbuf */
+               /* When switching to a new tty (with a new keyboard),
+                  read_char returns the new buffer, rather than -2
+                  (Bug#5095).  This is because `terminal-init-xterm'
+                  calls read-char, which eats the wrong_kboard_jmpbuf
+                  return.  Any better way to fix this? -- cyd  */
+               || (interrupted_kboard != current_kboard))
+             {
+               bool found = 0;
+               struct kboard *k;
+
+               for (k = all_kboards; k; k = k->next_kboard)
+                 if (k == interrupted_kboard)
+                   found = 1;
+
+               if (!found)
+                 {
+                   /* Don't touch interrupted_kboard when it's been
+                      deleted.  */
+                   delayed_switch_frame = Qnil;
+                   goto replay_entire_sequence;
+                 }
+
+               if (!NILP (delayed_switch_frame))
+                 {
+                   kset_kbd_queue
+                     (interrupted_kboard,
+                      Fcons (delayed_switch_frame,
+                             KVAR (interrupted_kboard, kbd_queue)));
+                   delayed_switch_frame = Qnil;
+                 }
+
+               while (t > 0)
+                 kset_kbd_queue
+                   (interrupted_kboard,
+                    Fcons (keybuf[--t], KVAR (interrupted_kboard, kbd_queue)));
+
+               /* If the side queue is non-empty, ensure it begins with a
+                  switch-frame, so we'll replay it in the right context.  */
+               if (CONSP (KVAR (interrupted_kboard, kbd_queue))
+                   && (key = XCAR (KVAR (interrupted_kboard, kbd_queue)),
+                       !(EVENT_HAS_PARAMETERS (key)
+                         && EQ (EVENT_HEAD_KIND (EVENT_HEAD (key)),
+                                Qswitch_frame))))
+                 {
+                   Lisp_Object frame;
+                   XSETFRAME (frame, interrupted_frame);
+                   kset_kbd_queue
+                     (interrupted_kboard,
+                      Fcons (make_lispy_switch_frame (frame),
+                             KVAR (interrupted_kboard, kbd_queue)));
+                 }
+               mock_input = 0;
+               goto replay_entire_sequence;
+             }
+         }
+
+         /* read_char returns t when it shows a menu and the user rejects it.
+            Just return -1.  */
+         if (EQ (key, Qt))
+           {
+             unbind_to (count, Qnil);
+             UNGCPRO;
+             return -1;
+           }
+
+         /* read_char returns -1 at the end of a macro.
+            Emacs 18 handles this by returning immediately with a
+            zero, so that's what we'll do.  */
+         if (INTEGERP (key) && XINT (key) == -1)
+           {
+             t = 0;
+             /* The Microsoft C compiler can't handle the goto that
+                would go here.  */
+             dummyflag = 1;
+             break;
+           }
+
+         /* If the current buffer has been changed from under us, the
+            keymap may have changed, so replay the sequence.  */
+         if (BUFFERP (key))
+           {
+             timer_resume_idle ();
+
+             mock_input = t;
+             /* Reset the current buffer from the selected window
+                in case something changed the former and not the latter.
+                This is to be more consistent with the behavior
+                of the command_loop_1.  */
+             if (fix_current_buffer)
+               {
+                 if (! FRAME_LIVE_P (XFRAME (selected_frame)))
+                   Fkill_emacs (Qnil);
+                 if (XBUFFER (XWINDOW (selected_window)->contents)
+                     != current_buffer)
+                   Fset_buffer (XWINDOW (selected_window)->contents);
+               }
+
+             goto replay_sequence;
+           }
+
+         /* If we have a quit that was typed in another frame, and
+            quit_throw_to_read_char switched buffers,
+            replay to get the right keymap.  */
+         if (INTEGERP (key)
+             && XINT (key) == quit_char
+             && current_buffer != starting_buffer)
+           {
+             GROW_RAW_KEYBUF;
+             ASET (raw_keybuf, raw_keybuf_count, key);
+             raw_keybuf_count++;
+             keybuf[t++] = key;
+             mock_input = t;
+             Vquit_flag = Qnil;
+             goto replay_sequence;
+           }
+
+         Vquit_flag = Qnil;
+
+         if (EVENT_HAS_PARAMETERS (key)
+             /* Either a `switch-frame' or a `select-window' event.  */
+             && EQ (EVENT_HEAD_KIND (EVENT_HEAD (key)), Qswitch_frame))
+           {
+             /* If we're at the beginning of a key sequence, and the caller
+                says it's okay, go ahead and return this event.  If we're
+                in the midst of a key sequence, delay it until the end.  */
+             if (t > 0 || !can_return_switch_frame)
+               {
+                 delayed_switch_frame = key;
+                 goto replay_key;
+               }
+           }
+
+         if (NILP (first_event))
+           {
+             first_event = key;
+             /* Even if first_event does not specify a particular
+                window/position, it's important to recompute the maps here
+                since a long time might have passed since we entered
+                read_key_sequence, and a timer (or process-filter or
+                special-event-map, ...) might have switched the current buffer
+                or the selected window from under us in the mean time.  */
+             if (fix_current_buffer
+                 && (XBUFFER (XWINDOW (selected_window)->contents)
+                     != current_buffer))
+               Fset_buffer (XWINDOW (selected_window)->contents);
+             current_binding = active_maps (first_event);
+           }
+
+         GROW_RAW_KEYBUF;
+         ASET (raw_keybuf, raw_keybuf_count, key);
+         raw_keybuf_count++;
+       }
+
+      /* Clicks in non-text areas get prefixed by the symbol
+        in their CHAR-ADDRESS field.  For example, a click on
+        the mode line is prefixed by the symbol `mode-line'.
+
+        Furthermore, key sequences beginning with mouse clicks
+        are read using the keymaps of the buffer clicked on, not
+        the current buffer.  So we may have to switch the buffer
+        here.
+
+        When we turn one event into two events, we must make sure
+        that neither of the two looks like the original--so that,
+        if we replay the events, they won't be expanded again.
+        If not for this, such reexpansion could happen either here
+        or when user programs play with this-command-keys.  */
+      if (EVENT_HAS_PARAMETERS (key))
+       {
+         Lisp_Object kind = EVENT_HEAD_KIND (EVENT_HEAD (key));
+         if (EQ (kind, Qmouse_click))
+           {
+             Lisp_Object window = POSN_WINDOW (EVENT_START (key));
+             Lisp_Object posn = POSN_POSN (EVENT_START (key));
+
+             if (CONSP (posn)
+                 || (!NILP (fake_prefixed_keys)
+                     && !NILP (Fmemq (key, fake_prefixed_keys))))
+               {
+                 /* We're looking a second time at an event for which
+                    we generated a fake prefix key.  Set
+                    last_real_key_start appropriately.  */
+                 if (t > 0)
+                   last_real_key_start = t - 1;
+               }
+
+             if (last_real_key_start == 0)
+               {
+                 /* Key sequences beginning with mouse clicks are
+                    read using the keymaps in the buffer clicked on,
+                    not the current buffer.  If we're at the
+                    beginning of a key sequence, switch buffers.  */
+                 if (WINDOWP (window)
+                     && BUFFERP (XWINDOW (window)->contents)
+                     && XBUFFER (XWINDOW (window)->contents) != current_buffer)
+                   {
+                     ASET (raw_keybuf, raw_keybuf_count, key);
+                     raw_keybuf_count++;
+                     keybuf[t] = key;
+                     mock_input = t + 1;
+
+                     /* Arrange to go back to the original buffer once we're
+                        done reading the key sequence.  Note that we can't
+                        use save_excursion_{save,restore} here, because they
+                        save point as well as the current buffer; we don't
+                        want to save point, because redisplay may change it,
+                        to accommodate a Fset_window_start or something.  We
+                        don't want to do this at the top of the function,
+                        because we may get input from a subprocess which
+                        wants to change the selected window and stuff (say,
+                        emacsclient).  */
+                     record_unwind_current_buffer ();
+
+                     if (! FRAME_LIVE_P (XFRAME (selected_frame)))
+                       Fkill_emacs (Qnil);
+                     set_buffer_internal (XBUFFER (XWINDOW 
(window)->contents));
+                     goto replay_sequence;
+                   }
+               }
+
+             /* Expand mode-line and scroll-bar events into two events:
+                use posn as a fake prefix key.  */
+             if (SYMBOLP (posn)
+                 && (NILP (fake_prefixed_keys)
+                     || NILP (Fmemq (key, fake_prefixed_keys))))
+               {
+                 if (bufsize - t <= 1)
+                   error ("Key sequence too long");
+
+                 keybuf[t]     = posn;
+                 keybuf[t + 1] = key;
+                 mock_input    = t + 2;
+
+                 /* Record that a fake prefix key has been generated
+                    for KEY.  Don't modify the event; this would
+                    prevent proper action when the event is pushed
+                    back into unread-command-events.  */
+                 fake_prefixed_keys = Fcons (key, fake_prefixed_keys);
+                 goto replay_key;
+               }
+           }
+         else if (CONSP (XCDR (key))
+                  && CONSP (EVENT_START (key))
+                  && CONSP (XCDR (EVENT_START (key))))
+           {
+             Lisp_Object posn;
+
+             posn = POSN_POSN (EVENT_START (key));
+             /* Handle menu-bar events:
+                insert the dummy prefix event `menu-bar'.  */
+             if (EQ (posn, Qmenu_bar) || EQ (posn, Qtool_bar))
+               {
+                 if (bufsize - t <= 1)
+                   error ("Key sequence too long");
+                 keybuf[t] = posn;
+                 keybuf[t + 1] = key;
+
+                 /* Zap the position in key, so we know that we've
+                    expanded it, and don't try to do so again.  */
+                 POSN_SET_POSN (EVENT_START (key), list1 (posn));
+
+                 mock_input = t + 2;
+                 goto replay_sequence;
+               }
+             else if (CONSP (posn))
+               {
+                 /* We're looking at the second event of a
+                    sequence which we expanded before.  Set
+                    last_real_key_start appropriately.  */
+                 if (last_real_key_start == t && t > 0)
+                   last_real_key_start = t - 1;
+               }
+           }
+       }
+
+      /* We have finally decided that KEY is something we might want
+        to look up.  */
+      new_binding = follow_key (current_binding, key);
+
+      /* If KEY wasn't bound, we'll try some fallbacks.  */
+      if (!NILP (new_binding))
+       /* This is needed for the following scenario:
+          event 0: a down-event that gets dropped by calling replay_key.
+          event 1: some normal prefix like C-h.
+          After event 0, first_unbound is 0, after event 1 indec.start,
+          fkey.start, and keytran.start are all 1, so when we see that
+          C-h is bound, we need to update first_unbound.  */
+       first_unbound = max (t + 1, first_unbound);
+      else
+       {
+         Lisp_Object head;
+
+         /* Remember the position to put an upper bound on indec.start.  */
+         first_unbound = min (t, first_unbound);
+
+         head = EVENT_HEAD (key);
+
+         if (SYMBOLP (head))
+           {
+             Lisp_Object breakdown;
+             int modifiers;
+
+             breakdown = parse_modifiers (head);
+             modifiers = XINT (XCAR (XCDR (breakdown)));
+             /* Attempt to reduce an unbound mouse event to a simpler
+                event that is bound:
+                  Drags reduce to clicks.
+                  Double-clicks reduce to clicks.
+                  Triple-clicks reduce to double-clicks, then to clicks.
+                  Down-clicks are eliminated.
+                  Double-downs reduce to downs, then are eliminated.
+                  Triple-downs reduce to double-downs, then to downs,
+                    then are eliminated.  */
+             if (modifiers & (down_modifier | drag_modifier
+                              | double_modifier | triple_modifier))
+               {
+                 while (modifiers & (down_modifier | drag_modifier
+                                     | double_modifier | triple_modifier))
+                   {
+                     Lisp_Object new_head, new_click;
+                     if (modifiers & triple_modifier)
+                       modifiers ^= (double_modifier | triple_modifier);
+                     else if (modifiers & double_modifier)
+                       modifiers &= ~double_modifier;
+                     else if (modifiers & drag_modifier)
+                       modifiers &= ~drag_modifier;
+                     else
+                       {
+                         /* Dispose of this `down' event by simply jumping
+                            back to replay_key, to get another event.
+
+                            Note that if this event came from mock input,
+                            then just jumping back to replay_key will just
+                            hand it to us again.  So we have to wipe out any
+                            mock input.
+
+                            We could delete keybuf[t] and shift everything
+                            after that to the left by one spot, but we'd also
+                            have to fix up any variable that points into
+                            keybuf, and shifting isn't really necessary
+                            anyway.
+
+                            Adding prefixes for non-textual mouse clicks
+                            creates two characters of mock input, and both
+                            must be thrown away.  If we're only looking at
+                            the prefix now, we can just jump back to
+                            replay_key.  On the other hand, if we've already
+                            processed the prefix, and now the actual click
+                            itself is giving us trouble, then we've lost the
+                            state of the keymaps we want to backtrack to, and
+                            we need to replay the whole sequence to rebuild
+                            it.
+
+                            Beyond that, only function key expansion could
+                            create more than two keys, but that should never
+                            generate mouse events, so it's okay to zero
+                            mock_input in that case too.
+
+                            FIXME: The above paragraph seems just plain
+                            wrong, if you consider things like
+                            xterm-mouse-mode.  -stef
+
+                            Isn't this just the most wonderful code ever?  */
+
+                         /* If mock_input > t + 1, the above simplification
+                            will actually end up dropping keys on the floor.
+                            This is probably OK for now, but even
+                            if mock_input <= t + 1, we need to adjust indec,
+                            fkey, and keytran.
+                            Typical case [header-line down-mouse-N]:
+                            mock_input = 2, t = 1, fkey.end = 1,
+                            last_real_key_start = 0.  */
+                         if (indec.end > last_real_key_start)
+                           {
+                             indec.end = indec.start
+                               = min (last_real_key_start, indec.start);
+                             indec.map = indec.parent;
+                             if (fkey.end > last_real_key_start)
+                               {
+                                 fkey.end = fkey.start
+                                   = min (last_real_key_start, fkey.start);
+                                 fkey.map = fkey.parent;
+                                 if (keytran.end > last_real_key_start)
+                                   {
+                                     keytran.end = keytran.start
+                                       = min (last_real_key_start, 
keytran.start);
+                                     keytran.map = keytran.parent;
+                                   }
+                               }
+                           }
+                         if (t == last_real_key_start)
+                           {
+                             mock_input = 0;
+                             goto replay_key;
+                           }
+                         else
+                           {
+                             mock_input = last_real_key_start;
+                             goto replay_sequence;
+                           }
+                       }
+
+                     new_head
+                       = apply_modifiers (modifiers, XCAR (breakdown));
+                     new_click = list2 (new_head, EVENT_START (key));
+
+                     /* Look for a binding for this new key.  */
+                     new_binding = follow_key (current_binding, new_click);
+
+                     /* If that click is bound, go for it.  */
+                     if (!NILP (new_binding))
+                       {
+                         current_binding = new_binding;
+                         key = new_click;
+                         break;
+                       }
+                     /* Otherwise, we'll leave key set to the drag event.  */
+                   }
+               }
+           }
+       }
+      current_binding = new_binding;
+
+      keybuf[t++] = key;
+      /* Normally, last_nonmenu_event gets the previous key we read.
+        But when a mouse popup menu is being used,
+        we don't update last_nonmenu_event; it continues to hold the mouse
+        event that preceded the first level of menu.  */
+      if (!used_mouse_menu)
+       last_nonmenu_event = key;
+
+      /* Record what part of this_command_keys is the current key sequence.  */
+      this_single_command_key_start = this_command_key_count - t;
+      /* When 'input-method-function' called above causes events to be
+        put on 'unread-post-input-method-events', and as result
+        'reread' is set to 'true', the value of 't' can become larger
+        than 'this_command_key_count', because 'add_command_key' is
+        not called to update 'this_command_key_count'.  If this
+        happens, 'this_single_command_key_start' will become negative
+        above, and any call to 'this-single-command-keys' will return
+        a garbled vector.  See bug #20223 for one such situation.
+        Here we force 'this_single_command_key_start' to never become
+        negative, to avoid that.  */
+      if (this_single_command_key_start < 0)
+       this_single_command_key_start = 0;
+
+      /* Look for this sequence in input-decode-map.
+        Scan from indec.end until we find a bound suffix.  */
+      while (indec.end < t)
+       {
+         struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+         bool done;
+         int diff;
+
+         GCPRO4 (indec.map, fkey.map, keytran.map, delayed_switch_frame);
+         done = keyremap_step (keybuf, bufsize, &indec, max (t, mock_input),
+                               1, &diff, prompt);
+         UNGCPRO;
+         if (done)
+           {
+             mock_input = diff + max (t, mock_input);
+             goto replay_sequence;
+           }
+       }
+
+      if (!KEYMAPP (current_binding)
+         && !test_undefined (current_binding)
+         && indec.start >= t)
+       /* There is a binding and it's not a prefix.
+          (and it doesn't have any input-decode-map translation pending).
+          There is thus no function-key in this sequence.
+          Moving fkey.start is important in this case to allow keytran.start
+          to go over the sequence before we return (since we keep the
+          invariant that keytran.end <= fkey.start).  */
+       {
+         if (fkey.start < t)
+           (fkey.start = fkey.end = t, fkey.map = fkey.parent);
+       }
+      else
+       /* If the sequence is unbound, see if we can hang a function key
+          off the end of it.  */
+       /* Continue scan from fkey.end until we find a bound suffix.  */
+       while (fkey.end < indec.start)
+         {
+           struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+           bool done;
+           int diff;
+
+           GCPRO4 (indec.map, fkey.map, keytran.map, delayed_switch_frame);
+           done = keyremap_step (keybuf, bufsize, &fkey,
+                                 max (t, mock_input),
+                                 /* If there's a binding (i.e.
+                                    first_binding >= nmaps) we don't want
+                                    to apply this function-key-mapping.  */
+                                 fkey.end + 1 == t
+                                 && (test_undefined (current_binding)),
+                                 &diff, prompt);
+           UNGCPRO;
+           if (done)
+             {
+               mock_input = diff + max (t, mock_input);
+               /* Adjust the input-decode-map counters.  */
+               indec.end += diff;
+               indec.start += diff;
+
+               goto replay_sequence;
+             }
+         }
+
+      /* Look for this sequence in key-translation-map.
+        Scan from keytran.end until we find a bound suffix.  */
+      while (keytran.end < fkey.start)
+       {
+         struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+         bool done;
+         int diff;
+
+         GCPRO4 (indec.map, fkey.map, keytran.map, delayed_switch_frame);
+         done = keyremap_step (keybuf, bufsize, &keytran, max (t, mock_input),
+                               1, &diff, prompt);
+         UNGCPRO;
+         if (done)
+           {
+             mock_input = diff + max (t, mock_input);
+             /* Adjust the function-key-map and input-decode-map counters.  */
+             indec.end += diff;
+             indec.start += diff;
+             fkey.end += diff;
+             fkey.start += diff;
+
+             goto replay_sequence;
+           }
+       }
+
+      /* If KEY is not defined in any of the keymaps,
+        and cannot be part of a function key or translation,
+        and is an upper case letter
+        use the corresponding lower-case letter instead.  */
+      if (NILP (current_binding)
+         && /* indec.start >= t && fkey.start >= t && */ keytran.start >= t
+         && INTEGERP (key)
+         && ((CHARACTERP (make_number (XINT (key) & ~CHAR_MODIFIER_MASK))
+              && uppercasep (XINT (key) & ~CHAR_MODIFIER_MASK))
+             || (XINT (key) & shift_modifier)))
+       {
+         Lisp_Object new_key;
+
+         original_uppercase = key;
+         original_uppercase_position = t - 1;
+
+         if (XINT (key) & shift_modifier)
+           XSETINT (new_key, XINT (key) & ~shift_modifier);
+         else
+           XSETINT (new_key, (downcase (XINT (key) & ~CHAR_MODIFIER_MASK)
+                              | (XINT (key) & CHAR_MODIFIER_MASK)));
+
+         /* We have to do this unconditionally, regardless of whether
+            the lower-case char is defined in the keymaps, because they
+            might get translated through function-key-map.  */
+         keybuf[t - 1] = new_key;
+         mock_input = max (t, mock_input);
+         shift_translated = 1;
+
+         goto replay_sequence;
+       }
+
+      if (NILP (current_binding)
+         && help_char_p (EVENT_HEAD (key)) && t > 1)
+           {
+             read_key_sequence_cmd = Vprefix_help_command;
+             /* The Microsoft C compiler can't handle the goto that
+                would go here.  */
+             dummyflag = 1;
+             break;
+           }
+
+      /* If KEY is not defined in any of the keymaps,
+        and cannot be part of a function key or translation,
+        and is a shifted function key,
+        use the corresponding unshifted function key instead.  */
+      if (NILP (current_binding)
+         && /* indec.start >= t && fkey.start >= t && */ keytran.start >= t)
+       {
+         Lisp_Object breakdown = parse_modifiers (key);
+         int modifiers
+           = CONSP (breakdown) ? (XINT (XCAR (XCDR (breakdown)))) : 0;
+
+         if (modifiers & shift_modifier
+             /* Treat uppercase keys as shifted.  */
+             || (INTEGERP (key)
+                 && (KEY_TO_CHAR (key)
+                     < XCHAR_TABLE (BVAR (current_buffer, 
downcase_table))->header.size)
+                 && uppercasep (KEY_TO_CHAR (key))))
+           {
+             Lisp_Object new_key
+               = (modifiers & shift_modifier
+                  ? apply_modifiers (modifiers & ~shift_modifier,
+                                     XCAR (breakdown))
+                  : make_number (downcase (KEY_TO_CHAR (key)) | modifiers));
+
+             original_uppercase = key;
+             original_uppercase_position = t - 1;
+
+             /* We have to do this unconditionally, regardless of whether
+                the lower-case char is defined in the keymaps, because they
+                might get translated through function-key-map.  */
+             keybuf[t - 1] = new_key;
+             mock_input = max (t, mock_input);
+             /* Reset fkey (and consequently keytran) to apply
+                function-key-map on the result, so that S-backspace is
+                correctly mapped to DEL (via backspace).  OTOH,
+                input-decode-map doesn't need to go through it again.  */
+             fkey.start = fkey.end = 0;
+             keytran.start = keytran.end = 0;
+             shift_translated = 1;
+
+             goto replay_sequence;
+           }
+       }
+    }
+  if (!dummyflag)
+    read_key_sequence_cmd = current_binding;
+  read_key_sequence_remapped
+    /* Remap command through active keymaps.
+       Do the remapping here, before the unbind_to so it uses the keymaps
+       of the appropriate buffer.  */
+    = SYMBOLP (read_key_sequence_cmd)
+    ? Fcommand_remapping (read_key_sequence_cmd, Qnil, Qnil)
+    : Qnil;
+
+  unread_switch_frame = delayed_switch_frame;
+  unbind_to (count, Qnil);
+
+  /* Don't downcase the last character if the caller says don't.
+     Don't downcase it if the result is undefined, either.  */
+  if ((dont_downcase_last || NILP (current_binding))
+      && t > 0
+      && t - 1 == original_uppercase_position)
+    {
+      keybuf[t - 1] = original_uppercase;
+      shift_translated = 0;
+    }
+
+  if (shift_translated)
+    Vthis_command_keys_shift_translated = Qt;
+
+  /* Occasionally we fabricate events, perhaps by expanding something
+     according to function-key-map, or by adding a prefix symbol to a
+     mouse click in the scroll bar or modeline.  In this cases, return
+     the entire generated key sequence, even if we hit an unbound
+     prefix or a definition before the end.  This means that you will
+     be able to push back the event properly, and also means that
+     read-key-sequence will always return a logical unit.
+
+     Better ideas?  */
+  for (; t < mock_input; t++)
+    {
+      if (echo_keystrokes_p ())
+       echo_char (keybuf[t]);
+      add_command_key (keybuf[t]);
+    }
+
+  UNGCPRO;
+  return t;
+}
+
+static Lisp_Object
+read_key_sequence_vs (Lisp_Object prompt, Lisp_Object continue_echo,
+                     Lisp_Object dont_downcase_last,
+                     Lisp_Object can_return_switch_frame,
+                     Lisp_Object cmd_loop, bool allow_string)
+{
+  Lisp_Object keybuf[30];
+  register int i;
+  struct gcpro gcpro1;
+  ptrdiff_t count = SPECPDL_INDEX ();
+
+  if (!NILP (prompt))
+    CHECK_STRING (prompt);
+  QUIT;
+
+  specbind (Qinput_method_exit_on_first_char,
+           (NILP (cmd_loop) ? Qt : Qnil));
+  specbind (Qinput_method_use_echo_area,
+           (NILP (cmd_loop) ? Qt : Qnil));
+
+  memset (keybuf, 0, sizeof keybuf);
+  GCPRO1 (keybuf[0]);
+  gcpro1.nvars = ARRAYELTS (keybuf);
+
+  if (NILP (continue_echo))
+    {
+      this_command_key_count = 0;
+      this_command_key_count_reset = 0;
+      this_single_command_key_start = 0;
+    }
+
+#ifdef HAVE_WINDOW_SYSTEM
+  if (display_hourglass_p)
+    cancel_hourglass ();
+#endif
+
+  i = read_key_sequence (keybuf, ARRAYELTS (keybuf),
+                        prompt, ! NILP (dont_downcase_last),
+                        ! NILP (can_return_switch_frame), 0, 0);
+
+#if 0  /* The following is fine for code reading a key sequence and
+         then proceeding with a lengthy computation, but it's not good
+         for code reading keys in a loop, like an input method.  */
+#ifdef HAVE_WINDOW_SYSTEM
+  if (display_hourglass_p)
+    start_hourglass ();
+#endif
+#endif
+
+  if (i == -1)
+    {
+      Vquit_flag = Qt;
+      QUIT;
+    }
+  UNGCPRO;
+  return unbind_to (count,
+                   ((allow_string ? make_event_array : Fvector)
+                    (i, keybuf)));
+}
+
+DEFUN ("read-key-sequence", Fread_key_sequence, Sread_key_sequence, 1, 5, 0,
+       doc: /* Read a sequence of keystrokes and return as a string or vector.
+The sequence is sufficient to specify a non-prefix command in the
+current local and global maps.
+
+First arg PROMPT is a prompt string.  If nil, do not prompt specially.
+Second (optional) arg CONTINUE-ECHO, if non-nil, means this key echos
+as a continuation of the previous key.
+
+The third (optional) arg DONT-DOWNCASE-LAST, if non-nil, means do not
+convert the last event to lower case.  (Normally any upper case event
+is converted to lower case if the original event is undefined and the lower
+case equivalent is defined.)  A non-nil value is appropriate for reading
+a key sequence to be defined.
+
+A C-g typed while in this function is treated like any other character,
+and `quit-flag' is not set.
+
+If the key sequence starts with a mouse click, then the sequence is read
+using the keymaps of the buffer of the window clicked in, not the buffer
+of the selected window as normal.
+
+`read-key-sequence' drops unbound button-down events, since you normally
+only care about the click or drag events which follow them.  If a drag
+or multi-click event is unbound, but the corresponding click event would
+be bound, `read-key-sequence' turns the event into a click event at the
+drag's starting position.  This means that you don't have to distinguish
+between click and drag, double, or triple events unless you want to.
+
+`read-key-sequence' prefixes mouse events on mode lines, the vertical
+lines separating windows, and scroll bars with imaginary keys
+`mode-line', `vertical-line', and `vertical-scroll-bar'.
+
+Optional fourth argument CAN-RETURN-SWITCH-FRAME non-nil means that this
+function will process a switch-frame event if the user switches frames
+before typing anything.  If the user switches frames in the middle of a
+key sequence, or at the start of the sequence but CAN-RETURN-SWITCH-FRAME
+is nil, then the event will be put off until after the current key sequence.
+
+`read-key-sequence' checks `function-key-map' for function key
+sequences, where they wouldn't conflict with ordinary bindings.  See
+`function-key-map' for more details.
+
+The optional fifth argument CMD-LOOP, if non-nil, means
+that this key sequence is being read by something that will
+read commands one after another.  It should be nil if the caller
+will read just one key sequence.  */)
+  (Lisp_Object prompt, Lisp_Object continue_echo, Lisp_Object 
dont_downcase_last, Lisp_Object can_return_switch_frame, Lisp_Object cmd_loop)
+{
+  return read_key_sequence_vs (prompt, continue_echo, dont_downcase_last,
+                              can_return_switch_frame, cmd_loop, true);
+}
+
+DEFUN ("read-key-sequence-vector", Fread_key_sequence_vector,
+       Sread_key_sequence_vector, 1, 5, 0,
+       doc: /* Like `read-key-sequence' but always return a vector.  */)
+  (Lisp_Object prompt, Lisp_Object continue_echo, Lisp_Object 
dont_downcase_last, Lisp_Object can_return_switch_frame, Lisp_Object cmd_loop)
+{
+  return read_key_sequence_vs (prompt, continue_echo, dont_downcase_last,
+                              can_return_switch_frame, cmd_loop, false);
+}
+
+/* Return true if input events are pending.  */
+
+bool
+detect_input_pending (void)
+{
+  return input_pending || get_input_pending (0);
+}
+
+/* Return true if input events other than mouse movements are
+   pending.  */
+
+bool
+detect_input_pending_ignore_squeezables (void)
+{
+  return input_pending || get_input_pending 
(READABLE_EVENTS_IGNORE_SQUEEZABLES);
+}
+
+/* Return true if input events are pending, and run any pending timers.  */
+
+bool
+detect_input_pending_run_timers (bool do_display)
+{
+  unsigned old_timers_run = timers_run;
+
+  if (!input_pending)
+    get_input_pending (READABLE_EVENTS_DO_TIMERS_NOW);
+
+  if (old_timers_run != timers_run && do_display)
+    redisplay_preserve_echo_area (8);
+
+  return input_pending;
+}
+
+/* This is called in some cases before a possible quit.
+   It cases the next call to detect_input_pending to recompute input_pending.
+   So calling this function unnecessarily can't do any harm.  */
+
+void
+clear_input_pending (void)
+{
+  input_pending = 0;
+}
+
+/* Return true if there are pending requeued events.
+   This isn't used yet.  The hope is to make wait_reading_process_output
+   call it, and return if it runs Lisp code that unreads something.
+   The problem is, kbd_buffer_get_event needs to be fixed to know what
+   to do in that case.  It isn't trivial.  */
+
+bool
+requeued_events_pending_p (void)
+{
+  return (!NILP (Vunread_command_events));
+}
+
+DEFUN ("input-pending-p", Finput_pending_p, Sinput_pending_p, 0, 1, 0,
+       doc: /* Return t if command input is currently available with no wait.
+Actually, the value is nil only if we can be sure that no input is available;
+if there is a doubt, the value is t.
+
+If CHECK-TIMERS is non-nil, timers that are ready to run will do so.  */)
+  (Lisp_Object check_timers)
+{
+  if (!NILP (Vunread_command_events)
+      || !NILP (Vunread_post_input_method_events)
+      || !NILP (Vunread_input_method_events))
+    return (Qt);
+
+  /* Process non-user-visible events (Bug#10195).  */
+  process_special_events ();
+
+  return (get_input_pending ((NILP (check_timers)
+                              ? 0 : READABLE_EVENTS_DO_TIMERS_NOW)
+                            | READABLE_EVENTS_FILTER_EVENTS)
+         ? Qt : Qnil);
+}
+
+DEFUN ("recent-keys", Frecent_keys, Srecent_keys, 0, 1, 0,
+       doc: /* Return vector of last few events, not counting those from 
keyboard macros.
+If INCLUDE-CMDS is non-nil, include the commands that were run,
+represented as events of the form (nil . COMMAND).  */)
+  (Lisp_Object include_cmds)
+{
+  bool cmds = !NILP (include_cmds);
+
+  if (!total_keys
+      || (cmds && total_keys < NUM_RECENT_KEYS))
+    return Fvector (total_keys,
+                   XVECTOR (recent_keys)->contents);
+  else
+    {
+      Lisp_Object es = Qnil;
+      int i = (total_keys < NUM_RECENT_KEYS
+              ? 0 : recent_keys_index);
+      eassert (recent_keys_index < NUM_RECENT_KEYS);
+      do
+       {
+         Lisp_Object e = AREF (recent_keys, i);
+         if (cmds || !CONSP (e) || !NILP (XCAR (e)))
+           es = Fcons (e, es);
+         if (++i >= NUM_RECENT_KEYS)
+           i = 0;
+       } while (i != recent_keys_index);
+      es = Fnreverse (es);
+      return Fvconcat (1, &es);
+    }
+}
+
+DEFUN ("this-command-keys", Fthis_command_keys, Sthis_command_keys, 0, 0, 0,
+       doc: /* Return the key sequence that invoked this command.
+However, if the command has called `read-key-sequence', it returns
+the last key sequence that has been read.
+The value is a string or a vector.
+
+See also `this-command-keys-vector'.  */)
+  (void)
+{
+  return make_event_array (this_command_key_count,
+                          XVECTOR (this_command_keys)->contents);
+}
+
+DEFUN ("this-command-keys-vector", Fthis_command_keys_vector, 
Sthis_command_keys_vector, 0, 0, 0,
+       doc: /* Return the key sequence that invoked this command, as a vector.
+However, if the command has called `read-key-sequence', it returns
+the last key sequence that has been read.
+
+See also `this-command-keys'.  */)
+  (void)
+{
+  return Fvector (this_command_key_count,
+                 XVECTOR (this_command_keys)->contents);
+}
+
+DEFUN ("this-single-command-keys", Fthis_single_command_keys,
+       Sthis_single_command_keys, 0, 0, 0,
+       doc: /* Return the key sequence that invoked this command.
+More generally, it returns the last key sequence read, either by
+the command loop or by `read-key-sequence'.
+Unlike `this-command-keys', this function's value
+does not include prefix arguments.
+The value is always a vector.  */)
+  (void)
+{
+  return Fvector (this_command_key_count
+                 - this_single_command_key_start,
+                 (XVECTOR (this_command_keys)->contents
+                  + this_single_command_key_start));
+}
+
+DEFUN ("this-single-command-raw-keys", Fthis_single_command_raw_keys,
+       Sthis_single_command_raw_keys, 0, 0, 0,
+       doc: /* Return the raw events that were read for this command.
+More generally, it returns the last key sequence read, either by
+the command loop or by `read-key-sequence'.
+Unlike `this-single-command-keys', this function's value
+shows the events before all translations (except for input methods).
+The value is always a vector.  */)
+  (void)
+{
+  return Fvector (raw_keybuf_count, XVECTOR (raw_keybuf)->contents);
+}
+
+DEFUN ("reset-this-command-lengths", Freset_this_command_lengths,
+       Sreset_this_command_lengths, 0, 0, 0,
+       doc: /* Make the unread events replace the last command and echo.
+Used in `universal-argument-other-key'.
+
+`universal-argument-other-key' rereads the event just typed.
+It then gets translated through `function-key-map'.
+The translated event has to replace the real events,
+both in the value of (this-command-keys) and in echoing.
+To achieve this, `universal-argument-other-key' calls
+`reset-this-command-lengths', which discards the record of reading
+these events the first time.  */)
+  (void)
+{
+  this_command_key_count = before_command_key_count;
+  if (this_command_key_count < this_single_command_key_start)
+    this_single_command_key_start = this_command_key_count;
+
+  echo_truncate (before_command_echo_length);
+
+  /* Cause whatever we put into unread-command-events
+     to echo as if it were being freshly read from the keyboard.  */
+  this_command_key_count_reset = 1;
+
+  return Qnil;
+}
+
+DEFUN ("clear-this-command-keys", Fclear_this_command_keys,
+       Sclear_this_command_keys, 0, 1, 0,
+       doc: /* Clear out the vector that `this-command-keys' returns.
+Also clear the record of the last 100 events, unless optional arg
+KEEP-RECORD is non-nil.  */)
+  (Lisp_Object keep_record)
+{
+  int i;
+
+  this_command_key_count = 0;
+  this_command_key_count_reset = 0;
+
+  if (NILP (keep_record))
+    {
+      for (i = 0; i < ASIZE (recent_keys); ++i)
+       ASET (recent_keys, i, Qnil);
+      total_keys = 0;
+      recent_keys_index = 0;
+    }
+  return Qnil;
+}
+
+DEFUN ("recursion-depth", Frecursion_depth, Srecursion_depth, 0, 0, 0,
+       doc: /* Return the current depth in recursive edits.  */)
+  (void)
+{
+  Lisp_Object temp;
+  /* Wrap around reliably on integer overflow.  */
+  EMACS_INT sum = (command_loop_level & INTMASK) + (minibuf_level & INTMASK);
+  XSETINT (temp, sum);
+  return temp;
+}
+
+DEFUN ("open-dribble-file", Fopen_dribble_file, Sopen_dribble_file, 1, 1,
+       "FOpen dribble file: ",
+       doc: /* Start writing all keyboard characters to a dribble file called 
FILE.
+If FILE is nil, close any open dribble file.
+The file will be closed when Emacs exits.
+
+Be aware that this records ALL characters you type!
+This may include sensitive information such as passwords.  */)
+  (Lisp_Object file)
+{
+  if (dribble)
+    {
+      block_input ();
+      fclose (dribble);
+      unblock_input ();
+      dribble = 0;
+    }
+  if (!NILP (file))
+    {
+      int fd;
+      Lisp_Object encfile;
+
+      file = Fexpand_file_name (file, Qnil);
+      encfile = ENCODE_FILE (file);
+      fd = emacs_open (SSDATA (encfile), O_WRONLY | O_CREAT | O_EXCL, 0600);
+      if (fd < 0 && errno == EEXIST && unlink (SSDATA (encfile)) == 0)
+       fd = emacs_open (SSDATA (encfile), O_WRONLY | O_CREAT | O_EXCL, 0600);
+      dribble = fd < 0 ? 0 : fdopen (fd, "w");
+      if (dribble == 0)
+       report_file_error ("Opening dribble", file);
+    }
+  return Qnil;
+}
+
+DEFUN ("discard-input", Fdiscard_input, Sdiscard_input, 0, 0, 0,
+       doc: /* Discard the contents of the terminal input buffer.
+Also end any kbd macro being defined.  */)
+  (void)
+{
+  if (!NILP (KVAR (current_kboard, defining_kbd_macro)))
+    {
+      /* Discard the last command from the macro.  */
+      Fcancel_kbd_macro_events ();
+      end_kbd_macro ();
+    }
+
+  Vunread_command_events = Qnil;
+
+  discard_tty_input ();
+
+  kbd_fetch_ptr =  kbd_store_ptr;
+  input_pending = 0;
+
+  return Qnil;
+}
+
+DEFUN ("suspend-emacs", Fsuspend_emacs, Ssuspend_emacs, 0, 1, "",
+       doc: /* Stop Emacs and return to superior process.  You can resume 
later.
+If `cannot-suspend' is non-nil, or if the system doesn't support job
+control, run a subshell instead.
+
+If optional arg STUFFSTRING is non-nil, its characters are stuffed
+to be read as terminal input by Emacs's parent, after suspension.
+
+Before suspending, run the normal hook `suspend-hook'.
+After resumption run the normal hook `suspend-resume-hook'.
+
+Some operating systems cannot stop the Emacs process and resume it later.
+On such systems, Emacs starts a subshell instead of suspending.  */)
+  (Lisp_Object stuffstring)
+{
+  ptrdiff_t count = SPECPDL_INDEX ();
+  int old_height, old_width;
+  int width, height;
+  struct gcpro gcpro1;
+
+  if (tty_list && tty_list->next)
+    error ("There are other tty frames open; close them before suspending 
Emacs");
+
+  if (!NILP (stuffstring))
+    CHECK_STRING (stuffstring);
+
+  run_hook (intern ("suspend-hook"));
+
+  GCPRO1 (stuffstring);
+  get_tty_size (fileno (CURTTY ()->input), &old_width, &old_height);
+  reset_all_sys_modes ();
+  /* sys_suspend can get an error if it tries to fork a subshell
+     and the system resources aren't available for that.  */
+  record_unwind_protect_void (init_all_sys_modes);
+  stuff_buffered_input (stuffstring);
+  if (cannot_suspend)
+    sys_subshell ();
+  else
+    sys_suspend ();
+  unbind_to (count, Qnil);
+
+  /* Check if terminal/window size has changed.
+     Note that this is not useful when we are running directly
+     with a window system; but suspend should be disabled in that case.  */
+  get_tty_size (fileno (CURTTY ()->input), &width, &height);
+  if (width != old_width || height != old_height)
+    change_frame_size (SELECTED_FRAME (), width,
+                      height - FRAME_MENU_BAR_LINES (SELECTED_FRAME ()),
+                      0, 0, 0, 0);
+
+  run_hook (intern ("suspend-resume-hook"));
+
+  UNGCPRO;
+  return Qnil;
+}
+
+/* If STUFFSTRING is a string, stuff its contents as pending terminal input.
+   Then in any case stuff anything Emacs has read ahead and not used.  */
+
+void
+stuff_buffered_input (Lisp_Object stuffstring)
+{
+#ifdef SIGTSTP  /* stuff_char is defined if SIGTSTP.  */
+  register unsigned char *p;
+
+  if (STRINGP (stuffstring))
+    {
+      register ptrdiff_t count;
+
+      p = SDATA (stuffstring);
+      count = SBYTES (stuffstring);
+      while (count-- > 0)
+       stuff_char (*p++);
+      stuff_char ('\n');
+    }
+
+  /* Anything we have read ahead, put back for the shell to read.  */
+  /* ?? What should this do when we have multiple keyboards??
+     Should we ignore anything that was typed in at the "wrong" kboard?
+
+     rms: we should stuff everything back into the kboard
+     it came from.  */
+  for (; kbd_fetch_ptr != kbd_store_ptr; kbd_fetch_ptr++)
+    {
+
+      if (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE)
+       kbd_fetch_ptr = kbd_buffer;
+      if (kbd_fetch_ptr->kind == ASCII_KEYSTROKE_EVENT)
+       stuff_char (kbd_fetch_ptr->code);
+
+      clear_event (kbd_fetch_ptr);
+    }
+
+  input_pending = 0;
+#endif /* SIGTSTP */
+}
+
+void
+set_waiting_for_input (struct timespec *time_to_clear)
+{
+  input_available_clear_time = time_to_clear;
+
+  /* Tell handle_interrupt to throw back to read_char,  */
+  waiting_for_input = 1;
+
+  /* If handle_interrupt was called before and buffered a C-g,
+     make it run again now, to avoid timing error.  */
+  if (!NILP (Vquit_flag))
+    quit_throw_to_read_char (0);
+}
+
+void
+clear_waiting_for_input (void)
+{
+  /* Tell handle_interrupt not to throw back to read_char,  */
+  waiting_for_input = 0;
+  input_available_clear_time = 0;
+}
+
+/* The SIGINT handler.
+
+   If we have a frame on the controlling tty, we assume that the
+   SIGINT was generated by C-g, so we call handle_interrupt.
+   Otherwise, tell QUIT to kill Emacs.  */
+
+static void
+handle_interrupt_signal (int sig)
+{
+  /* See if we have an active terminal on our controlling tty.  */
+  struct terminal *terminal = get_named_terminal ("/dev/tty");
+  if (!terminal)
+    {
+      /* If there are no frames there, let's pretend that we are a
+         well-behaving UN*X program and quit.  We must not call Lisp
+         in a signal handler, so tell QUIT to exit when it is
+         safe.  */
+      Vquit_flag = Qkill_emacs;
+    }
+  else
+    {
+      /* Otherwise, the SIGINT was probably generated by C-g.  */
+
+      /* Set internal_last_event_frame to the top frame of the
+         controlling tty, if we have a frame there.  We disable the
+         interrupt key on secondary ttys, so the SIGINT must have come
+         from the controlling tty.  */
+      internal_last_event_frame = terminal->display_info.tty->top_frame;
+
+      handle_interrupt (1);
+    }
+}
+
+static void
+deliver_interrupt_signal (int sig)
+{
+  deliver_process_signal (sig, handle_interrupt_signal);
+}
+
+
+/* If Emacs is stuck because `inhibit-quit' is true, then keep track
+   of the number of times C-g has been requested.  If C-g is pressed
+   enough times, then quit anyway.  See bug#6585.  */
+static int volatile force_quit_count;
+
+/* This routine is called at interrupt level in response to C-g.
+
+   It is called from the SIGINT handler or kbd_buffer_store_event.
+
+   If `waiting_for_input' is non zero, then unless `echoing' is
+   nonzero, immediately throw back to read_char.
+
+   Otherwise it sets the Lisp variable quit-flag not-nil.  This causes
+   eval to throw, when it gets a chance.  If quit-flag is already
+   non-nil, it stops the job right away.  */
+
+static void
+handle_interrupt (bool in_signal_handler)
+{
+  char c;
+
+  cancel_echoing ();
+
+  /* XXX This code needs to be revised for multi-tty support.  */
+  if (!NILP (Vquit_flag) && get_named_terminal ("/dev/tty"))
+    {
+      if (! in_signal_handler)
+       {
+         /* If SIGINT isn't blocked, don't let us be interrupted by
+            a SIGINT.  It might be harmful due to non-reentrancy
+            in I/O functions.  */
+         sigset_t blocked;
+         sigemptyset (&blocked);
+         sigaddset (&blocked, SIGINT);
+         pthread_sigmask (SIG_BLOCK, &blocked, 0);
+       }
+
+      fflush (stdout);
+      reset_all_sys_modes ();
+
+#ifdef SIGTSTP
+/*
+ * On systems which can suspend the current process and return to the original
+ * shell, this command causes the user to end up back at the shell.
+ * The "Auto-save" and "Abort" questions are not asked until
+ * the user elects to return to emacs, at which point he can save the current
+ * job and either dump core or continue.
+ */
+      sys_suspend ();
+#else
+      /* Perhaps should really fork an inferior shell?
+        But that would not provide any way to get back
+        to the original shell, ever.  */
+      printf ("No support for stopping a process on this operating system;\n");
+      printf ("you can continue or abort.\n");
+#endif /* not SIGTSTP */
+#ifdef MSDOS
+      /* We must remain inside the screen area when the internal terminal
+        is used.  Note that [Enter] is not echoed by dos.  */
+      cursor_to (SELECTED_FRAME (), 0, 0);
+#endif
+      /* It doesn't work to autosave while GC is in progress;
+        the code used for auto-saving doesn't cope with the mark bit.  */
+      if (!gc_in_progress)
+       {
+         printf ("Auto-save? (y or n) ");
+         fflush (stdout);
+         if (((c = getchar ()) & ~040) == 'Y')
+           {
+             Fdo_auto_save (Qt, Qnil);
+#ifdef MSDOS
+             printf ("\r\nAuto-save done");
+#else /* not MSDOS */
+             printf ("Auto-save done\n");
+#endif /* not MSDOS */
+           }
+         while (c != '\n') c = getchar ();
+       }
+      else
+       {
+         /* During GC, it must be safe to reenable quitting again.  */
+         Vinhibit_quit = Qnil;
+#ifdef MSDOS
+         printf ("\r\n");
+#endif /* not MSDOS */
+         printf ("Garbage collection in progress; cannot auto-save now\r\n");
+         printf ("but will instead do a real quit after garbage collection 
ends\r\n");
+         fflush (stdout);
+       }
+
+#ifdef MSDOS
+      printf ("\r\nAbort?  (y or n) ");
+#else /* not MSDOS */
+      printf ("Abort (and dump core)? (y or n) ");
+#endif /* not MSDOS */
+      fflush (stdout);
+      if (((c = getchar ()) & ~040) == 'Y')
+       emacs_abort ();
+      while (c != '\n') c = getchar ();
+#ifdef MSDOS
+      printf ("\r\nContinuing...\r\n");
+#else /* not MSDOS */
+      printf ("Continuing...\n");
+#endif /* not MSDOS */
+      fflush (stdout);
+      init_all_sys_modes ();
+    }
+  else
+    {
+      /* If executing a function that wants to be interrupted out of
+        and the user has not deferred quitting by binding `inhibit-quit'
+        then quit right away.  */
+      if (immediate_quit && NILP (Vinhibit_quit))
+       {
+         struct gl_state_s saved;
+         struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+
+         immediate_quit = 0;
+         pthread_sigmask (SIG_SETMASK, &empty_mask, 0);
+         saved = gl_state;
+         GCPRO4 (saved.object, saved.global_code,
+                 saved.current_syntax_table, saved.old_prop);
+         Fsignal (Qquit, Qnil);
+         gl_state = saved;
+         UNGCPRO;
+       }
+      else
+        { /* Else request quit when it's safe.  */
+         int count = NILP (Vquit_flag) ? 1 : force_quit_count + 1;
+         force_quit_count = count;
+         if (count == 3)
+            {
+              immediate_quit = 1;
+              Vinhibit_quit = Qnil;
+            }
+          Vquit_flag = Qt;
+        }
+    }
+
+  pthread_sigmask (SIG_SETMASK, &empty_mask, 0);
+
+/* TODO: The longjmp in this call throws the NS event loop integration off,
+         and it seems to do fine without this.  Probably some attention
+        needs to be paid to the setting of waiting_for_input in
+         wait_reading_process_output() under HAVE_NS because of the call
+         to ns_select there (needed because otherwise events aren't picked up
+         outside of polling since we don't get SIGIO like X and we don't have a
+         separate event loop thread like W32.  */
+#ifndef HAVE_NS
+  if (waiting_for_input && !echoing)
+    quit_throw_to_read_char (in_signal_handler);
+#endif
+}
+
+/* Handle a C-g by making read_char return C-g.  */
+
+static void
+quit_throw_to_read_char (bool from_signal)
+{
+  /* When not called from a signal handler it is safe to call
+     Lisp.  */
+  if (!from_signal && EQ (Vquit_flag, Qkill_emacs))
+    Fkill_emacs (Qnil);
+
+  /* Prevent another signal from doing this before we finish.  */
+  clear_waiting_for_input ();
+  input_pending = 0;
+
+  Vunread_command_events = Qnil;
+
+  if (FRAMEP (internal_last_event_frame)
+      && !EQ (internal_last_event_frame, selected_frame))
+    do_switch_frame (make_lispy_switch_frame (internal_last_event_frame),
+                    0, 0, Qnil);
+
+  sys_longjmp (getcjmp, 1);
+}
+
+DEFUN ("set-input-interrupt-mode", Fset_input_interrupt_mode,
+       Sset_input_interrupt_mode, 1, 1, 0,
+       doc: /* Set interrupt mode of reading keyboard input.
+If INTERRUPT is non-nil, Emacs will use input interrupts;
+otherwise Emacs uses CBREAK mode.
+
+See also `current-input-mode'.  */)
+  (Lisp_Object interrupt)
+{
+  bool new_interrupt_input;
+#ifdef USABLE_SIGIO
+#ifdef HAVE_X_WINDOWS
+  if (x_display_list != NULL)
+    {
+      /* When using X, don't give the user a real choice,
+        because we haven't implemented the mechanisms to support it.  */
+      new_interrupt_input = 1;
+    }
+  else
+#endif /* HAVE_X_WINDOWS */
+    new_interrupt_input = !NILP (interrupt);
+#else /* not USABLE_SIGIO */
+  new_interrupt_input = 0;
+#endif /* not USABLE_SIGIO */
+
+  if (new_interrupt_input != interrupt_input)
+    {
+#ifdef POLL_FOR_INPUT
+      stop_polling ();
+#endif
+#ifndef DOS_NT
+      /* this causes startup screen to be restored and messes with the mouse */
+      reset_all_sys_modes ();
+      interrupt_input = new_interrupt_input;
+      init_all_sys_modes ();
+#else
+      interrupt_input = new_interrupt_input;
+#endif
+
+#ifdef POLL_FOR_INPUT
+      poll_suppress_count = 1;
+      start_polling ();
+#endif
+    }
+  return Qnil;
+}
+
+DEFUN ("set-output-flow-control", Fset_output_flow_control, 
Sset_output_flow_control, 1, 2, 0,
+       doc: /* Enable or disable ^S/^Q flow control for output to TERMINAL.
+If FLOW is non-nil, flow control is enabled and you cannot use C-s or
+C-q in key sequences.
+
+This setting only has an effect on tty terminals and only when
+Emacs reads input in CBREAK mode; see `set-input-interrupt-mode'.
+
+See also `current-input-mode'.  */)
+  (Lisp_Object flow, Lisp_Object terminal)
+{
+  struct terminal *t = decode_tty_terminal (terminal);
+  struct tty_display_info *tty;
+
+  if (!t)
+    return Qnil;
+  tty = t->display_info.tty;
+
+  if (tty->flow_control != !NILP (flow))
+    {
+#ifndef DOS_NT
+      /* This causes startup screen to be restored and messes with the mouse.  
*/
+      reset_sys_modes (tty);
+#endif
+
+      tty->flow_control = !NILP (flow);
+
+#ifndef DOS_NT
+      init_sys_modes (tty);
+#endif
+    }
+  return Qnil;
+}
+
+DEFUN ("set-input-meta-mode", Fset_input_meta_mode, Sset_input_meta_mode, 1, 
2, 0,
+       doc: /* Enable or disable 8-bit input on TERMINAL.
+If META is t, Emacs will accept 8-bit input, and interpret the 8th
+bit as the Meta modifier.
+
+If META is nil, Emacs will ignore the top bit, on the assumption it is
+parity.
+
+Otherwise, Emacs will accept and pass through 8-bit input without
+specially interpreting the top bit.
+
+This setting only has an effect on tty terminal devices.
+
+Optional parameter TERMINAL specifies the tty terminal device to use.
+It may be a terminal object, a frame, or nil for the terminal used by
+the currently selected frame.
+
+See also `current-input-mode'.  */)
+  (Lisp_Object meta, Lisp_Object terminal)
+{
+  struct terminal *t = decode_tty_terminal (terminal);
+  struct tty_display_info *tty;
+  int new_meta;
+
+  if (!t)
+    return Qnil;
+  tty = t->display_info.tty;
+
+  if (NILP (meta))
+    new_meta = 0;
+  else if (EQ (meta, Qt))
+    new_meta = 1;
+  else
+    new_meta = 2;
+
+  if (tty->meta_key != new_meta)
+    {
+#ifndef DOS_NT
+      /* this causes startup screen to be restored and messes with the mouse */
+      reset_sys_modes (tty);
+#endif
+
+      tty->meta_key = new_meta;
+
+#ifndef DOS_NT
+      init_sys_modes (tty);
+#endif
+    }
+  return Qnil;
+}
+
+DEFUN ("set-quit-char", Fset_quit_char, Sset_quit_char, 1, 1, 0,
+       doc: /* Specify character used for quitting.
+QUIT must be an ASCII character.
+
+This function only has an effect on the controlling tty of the Emacs
+process.
+
+See also `current-input-mode'.  */)
+  (Lisp_Object quit)
+{
+  struct terminal *t = get_named_terminal ("/dev/tty");
+  struct tty_display_info *tty;
+
+  if (!t)
+    return Qnil;
+  tty = t->display_info.tty;
+
+  if (NILP (quit) || !INTEGERP (quit) || XINT (quit) < 0 || XINT (quit) > 0400)
+    error ("QUIT must be an ASCII character");
+
+#ifndef DOS_NT
+  /* this causes startup screen to be restored and messes with the mouse */
+  reset_sys_modes (tty);
+#endif
+
+  /* Don't let this value be out of range.  */
+  quit_char = XINT (quit) & (tty->meta_key == 0 ? 0177 : 0377);
+
+#ifndef DOS_NT
+  init_sys_modes (tty);
+#endif
+
+  return Qnil;
+}
+
+DEFUN ("set-input-mode", Fset_input_mode, Sset_input_mode, 3, 4, 0,
+       doc: /* Set mode of reading keyboard input.
+First arg INTERRUPT non-nil means use input interrupts;
+ nil means use CBREAK mode.
+Second arg FLOW non-nil means use ^S/^Q flow control for output to terminal
+ (no effect except in CBREAK mode).
+Third arg META t means accept 8-bit input (for a Meta key).
+ META nil means ignore the top bit, on the assumption it is parity.
+ Otherwise, accept 8-bit input and don't use the top bit for Meta.
+Optional fourth arg QUIT if non-nil specifies character to use for quitting.
+See also `current-input-mode'.  */)
+  (Lisp_Object interrupt, Lisp_Object flow, Lisp_Object meta, Lisp_Object quit)
+{
+  Fset_input_interrupt_mode (interrupt);
+  Fset_output_flow_control (flow, Qnil);
+  Fset_input_meta_mode (meta, Qnil);
+  if (!NILP (quit))
+    Fset_quit_char (quit);
+  return Qnil;
+}
+
+DEFUN ("current-input-mode", Fcurrent_input_mode, Scurrent_input_mode, 0, 0, 0,
+       doc: /* Return information about the way Emacs currently reads keyboard 
input.
+The value is a list of the form (INTERRUPT FLOW META QUIT), where
+  INTERRUPT is non-nil if Emacs is using interrupt-driven input; if
+    nil, Emacs is using CBREAK mode.
+  FLOW is non-nil if Emacs uses ^S/^Q flow control for output to the
+    terminal; this does not apply if Emacs uses interrupt-driven input.
+  META is t if accepting 8-bit input with 8th bit as Meta flag.
+    META nil means ignoring the top bit, on the assumption it is parity.
+    META is neither t nor nil if accepting 8-bit input and using
+    all 8 bits as the character code.
+  QUIT is the character Emacs currently uses to quit.
+The elements of this list correspond to the arguments of
+`set-input-mode'.  */)
+  (void)
+{
+  struct frame *sf = XFRAME (selected_frame);
+
+  Lisp_Object interrupt = interrupt_input ? Qt : Qnil;
+  Lisp_Object flow, meta;
+  if (FRAME_TERMCAP_P (sf) || FRAME_MSDOS_P (sf))
+    {
+      flow = FRAME_TTY (sf)->flow_control ? Qt : Qnil;
+      meta = (FRAME_TTY (sf)->meta_key == 2
+             ? make_number (0)
+             : (CURTTY ()->meta_key == 1 ? Qt : Qnil));
+    }
+  else
+    {
+      flow = Qnil;
+      meta = Qt;
+    }
+  Lisp_Object quit = make_number (quit_char);
+
+  return list4 (interrupt, flow, meta, quit);
+}
+
+DEFUN ("posn-at-x-y", Fposn_at_x_y, Sposn_at_x_y, 2, 4, 0,
+       doc: /* Return position information for pixel coordinates X and Y.
+By default, X and Y are relative to text area of the selected window.
+Optional third arg FRAME-OR-WINDOW non-nil specifies frame or window.
+If optional fourth arg WHOLE is non-nil, X is relative to the left
+edge of the window.
+
+The return value is similar to a mouse click position:
+   (WINDOW AREA-OR-POS (X . Y) TIMESTAMP OBJECT POS (COL . ROW)
+    IMAGE (DX . DY) (WIDTH . HEIGHT))
+The `posn-' functions access elements of such lists.  */)
+  (Lisp_Object x, Lisp_Object y, Lisp_Object frame_or_window, Lisp_Object 
whole)
+{
+  CHECK_NATNUM (x);
+  CHECK_NATNUM (y);
+
+  if (NILP (frame_or_window))
+    frame_or_window = selected_window;
+
+  if (WINDOWP (frame_or_window))
+    {
+      struct window *w = decode_live_window (frame_or_window);
+
+      XSETINT (x, (XINT (x)
+                  + WINDOW_LEFT_EDGE_X (w)
+                  + (NILP (whole)
+                     ? window_box_left_offset (w, TEXT_AREA)
+                     : 0)));
+      XSETINT (y, WINDOW_TO_FRAME_PIXEL_Y (w, XINT (y)));
+      frame_or_window = w->frame;
+    }
+
+  CHECK_LIVE_FRAME (frame_or_window);
+
+  return make_lispy_position (XFRAME (frame_or_window), x, y, 0);
+}
+
+DEFUN ("posn-at-point", Fposn_at_point, Sposn_at_point, 0, 2, 0,
+       doc: /* Return position information for buffer POS in WINDOW.
+POS defaults to point in WINDOW; WINDOW defaults to the selected window.
+
+Return nil if position is not visible in window.  Otherwise,
+the return value is similar to that returned by `event-start' for
+a mouse click at the upper left corner of the glyph corresponding
+to the given buffer position:
+   (WINDOW AREA-OR-POS (X . Y) TIMESTAMP OBJECT POS (COL . ROW)
+    IMAGE (DX . DY) (WIDTH . HEIGHT))
+The `posn-' functions access elements of such lists.  */)
+  (Lisp_Object pos, Lisp_Object window)
+{
+  Lisp_Object tem;
+
+  if (NILP (window))
+    window = selected_window;
+
+  tem = Fpos_visible_in_window_p (pos, window, Qt);
+  if (!NILP (tem))
+    {
+      Lisp_Object x = XCAR (tem);
+      Lisp_Object y = XCAR (XCDR (tem));
+
+      /* Point invisible due to hscrolling?  */
+      if (XINT (x) < 0)
+       return Qnil;
+      tem = Fposn_at_x_y (x, y, window, Qnil);
+    }
+
+  return tem;
+}
+
+/* Set up a new kboard object with reasonable initial values.
+   TYPE is a window system for which this keyboard is used.  */
+
+static void
+init_kboard (KBOARD *kb, Lisp_Object type)
+{
+  kset_overriding_terminal_local_map (kb, Qnil);
+  kset_last_command (kb, Qnil);
+  kset_real_last_command (kb, Qnil);
+  kset_keyboard_translate_table (kb, Qnil);
+  kset_last_repeatable_command (kb, Qnil);
+  kset_prefix_arg (kb, Qnil);
+  kset_last_prefix_arg (kb, Qnil);
+  kset_kbd_queue (kb, Qnil);
+  kb->kbd_queue_has_data = 0;
+  kb->immediate_echo = 0;
+  kset_echo_string (kb, Qnil);
+  kb->echo_after_prompt = -1;
+  kb->kbd_macro_buffer = 0;
+  kb->kbd_macro_bufsize = 0;
+  kset_defining_kbd_macro (kb, Qnil);
+  kset_last_kbd_macro (kb, Qnil);
+  kb->reference_count = 0;
+  kset_system_key_alist (kb, Qnil);
+  kset_system_key_syms (kb, Qnil);
+  kset_window_system (kb, type);
+  kset_input_decode_map (kb, Fmake_sparse_keymap (Qnil));
+  kset_local_function_key_map (kb, Fmake_sparse_keymap (Qnil));
+  Fset_keymap_parent (KVAR (kb, Vlocal_function_key_map), Vfunction_key_map);
+  kset_default_minibuffer_frame (kb, Qnil);
+}
+
+/* Allocate and basically initialize keyboard
+   object to use with window system TYPE.  */
+
+KBOARD *
+allocate_kboard (Lisp_Object type)
+{
+  KBOARD *kb = xmalloc (sizeof *kb);
+
+  init_kboard (kb, type);
+  kb->next_kboard = all_kboards;
+  all_kboards = kb;
+  return kb;
+}
+
+/*
+ * Destroy the contents of a kboard object, but not the object itself.
+ * We use this just before deleting it, or if we're going to initialize
+ * it a second time.
+ */
+static void
+wipe_kboard (KBOARD *kb)
+{
+  xfree (kb->kbd_macro_buffer);
+}
+
+/* Free KB and memory referenced from it.  */
+
+void
+delete_kboard (KBOARD *kb)
+{
+  KBOARD **kbp;
+
+  for (kbp = &all_kboards; *kbp != kb; kbp = &(*kbp)->next_kboard)
+    if (*kbp == NULL)
+      emacs_abort ();
+  *kbp = kb->next_kboard;
+
+  /* Prevent a dangling reference to KB.  */
+  if (kb == current_kboard
+      && FRAMEP (selected_frame)
+      && FRAME_LIVE_P (XFRAME (selected_frame)))
+    {
+      current_kboard = FRAME_KBOARD (XFRAME (selected_frame));
+      single_kboard = 0;
+      if (current_kboard == kb)
+       emacs_abort ();
+    }
+
+  wipe_kboard (kb);
+  xfree (kb);
+}
+
+void
+init_keyboard (void)
+{
+  /* This is correct before outermost invocation of the editor loop.  */
+  command_loop_level = -1;
+  immediate_quit = 0;
+  quit_char = Ctl ('g');
+  Vunread_command_events = Qnil;
+  timer_idleness_start_time = invalid_timespec ();
+  total_keys = 0;
+  recent_keys_index = 0;
+  kbd_fetch_ptr = kbd_buffer;
+  kbd_store_ptr = kbd_buffer;
+  do_mouse_tracking = Qnil;
+  input_pending = 0;
+  interrupt_input_blocked = 0;
+  pending_signals = 0;
+
+  /* This means that command_loop_1 won't try to select anything the first
+     time through.  */
+  internal_last_event_frame = Qnil;
+  Vlast_event_frame = internal_last_event_frame;
+
+  current_kboard = initial_kboard;
+  /* Re-initialize the keyboard again.  */
+  wipe_kboard (current_kboard);
+  /* A value of nil for Vwindow_system normally means a tty, but we also use
+     it for the initial terminal since there is no window system there.  */
+  init_kboard (current_kboard, Qnil);
+
+  if (!noninteractive)
+    {
+      /* Before multi-tty support, these handlers used to be installed
+         only if the current session was a tty session.  Now an Emacs
+         session may have multiple display types, so we always handle
+         SIGINT.  There is special code in handle_interrupt_signal to exit
+         Emacs on SIGINT when there are no termcap frames on the
+         controlling terminal.  */
+      struct sigaction action;
+      emacs_sigaction_init (&action, deliver_interrupt_signal);
+      sigaction (SIGINT, &action, 0);
+#ifndef DOS_NT
+      /* For systems with SysV TERMIO, C-g is set up for both SIGINT and
+        SIGQUIT and we can't tell which one it will give us.  */
+      sigaction (SIGQUIT, &action, 0);
+#endif /* not DOS_NT */
+    }
+#ifdef USABLE_SIGIO
+  if (!noninteractive)
+    {
+      struct sigaction action;
+      emacs_sigaction_init (&action, deliver_input_available_signal);
+      sigaction (SIGIO, &action, 0);
+    }
+#endif
+
+/* Use interrupt input by default, if it works and noninterrupt input
+   has deficiencies.  */
+
+#ifdef INTERRUPT_INPUT
+  interrupt_input = 1;
+#else
+  interrupt_input = 0;
+#endif
+
+  pthread_sigmask (SIG_SETMASK, &empty_mask, 0);
+  dribble = 0;
+
+  if (keyboard_init_hook)
+    (*keyboard_init_hook) ();
+
+#ifdef POLL_FOR_INPUT
+  poll_timer = NULL;
+  poll_suppress_count = 1;
+  start_polling ();
+#endif
+}
+
+/* This type's only use is in syms_of_keyboard, to put properties on the
+   event header symbols.  */
+struct event_head
+{
+  short var;
+  short kind;
+};
+
+static const struct event_head head_table[] = {
+  {SYMBOL_INDEX (Qmouse_movement),      SYMBOL_INDEX (Qmouse_movement)},
+  {SYMBOL_INDEX (Qscroll_bar_movement), SYMBOL_INDEX (Qmouse_movement)},
+
+  /* Some of the event heads.  */
+  {SYMBOL_INDEX (Qswitch_frame),        SYMBOL_INDEX (Qswitch_frame)},
+
+  {SYMBOL_INDEX (Qfocus_in),            SYMBOL_INDEX (Qfocus_in)},
+  {SYMBOL_INDEX (Qfocus_out),           SYMBOL_INDEX (Qfocus_out)},
+  {SYMBOL_INDEX (Qdelete_frame),        SYMBOL_INDEX (Qdelete_frame)},
+  {SYMBOL_INDEX (Qiconify_frame),       SYMBOL_INDEX (Qiconify_frame)},
+  {SYMBOL_INDEX (Qmake_frame_visible),  SYMBOL_INDEX (Qmake_frame_visible)},
+  /* `select-window' should be handled just like `switch-frame'
+     in read_key_sequence.  */
+  {SYMBOL_INDEX (Qselect_window),       SYMBOL_INDEX (Qswitch_frame)}
+};
+
+void
+syms_of_keyboard (void)
+{
+  pending_funcalls = Qnil;
+  staticpro (&pending_funcalls);
+
+  Vlispy_mouse_stem = build_pure_c_string ("mouse");
+  staticpro (&Vlispy_mouse_stem);
+
+  regular_top_level_message = build_pure_c_string ("Back to top level");
+#ifdef HAVE_STACK_OVERFLOW_HANDLING
+  recover_top_level_message
+    = build_pure_c_string ("Re-entering top level after C stack overflow");
+#endif
+  DEFVAR_LISP ("internal--top-level-message", Vinternal__top_level_message,
+              doc: /* Message displayed by `normal-top-level'.  */);
+  Vinternal__top_level_message = regular_top_level_message;
+
+  /* Tool-bars.  */
+  DEFSYM (QCimage, ":image");
+  DEFSYM (Qhelp_echo, "help-echo");
+  DEFSYM (QCrtl, ":rtl");
+
+  staticpro (&item_properties);
+  item_properties = Qnil;
+
+  staticpro (&tool_bar_item_properties);
+  tool_bar_item_properties = Qnil;
+  staticpro (&tool_bar_items_vector);
+  tool_bar_items_vector = Qnil;
+
+  DEFSYM (Qtimer_event_handler, "timer-event-handler");
+  DEFSYM (Qdisabled_command_function, "disabled-command-function");
+  DEFSYM (Qself_insert_command, "self-insert-command");
+  DEFSYM (Qforward_char, "forward-char");
+  DEFSYM (Qbackward_char, "backward-char");
+
+  /* Non-nil disable property on a command means do not execute it;
+     call disabled-command-function's value instead.  */
+  DEFSYM (Qdisabled, "disabled");
+
+  DEFSYM (Qundefined, "undefined");
+
+  /* Hooks to run before and after each command.  */
+  DEFSYM (Qpre_command_hook, "pre-command-hook");
+  DEFSYM (Qpost_command_hook, "post-command-hook");
+
+  DEFSYM (Qdeferred_action_function, "deferred-action-function");
+  DEFSYM (Qdelayed_warnings_hook, "delayed-warnings-hook");
+  DEFSYM (Qfunction_key, "function-key");
+
+  /* The values of Qevent_kind properties.  */
+  DEFSYM (Qmouse_click, "mouse-click");
+
+  DEFSYM (Qdrag_n_drop, "drag-n-drop");
+  DEFSYM (Qsave_session, "save-session");
+  DEFSYM (Qconfig_changed_event, "config-changed-event");
+
+  /* Menu and tool bar item parts.  */
+  DEFSYM (Qmenu_enable, "menu-enable");
+
+#ifdef HAVE_NTGUI
+  DEFSYM (Qlanguage_change, "language-change");
+#endif
+
+#ifdef HAVE_DBUS
+  DEFSYM (Qdbus_event, "dbus-event");
+#endif
+
+#ifdef USE_FILE_NOTIFY
+  DEFSYM (Qfile_notify, "file-notify");
+#endif /* USE_FILE_NOTIFY */
+
+  /* Menu and tool bar item parts.  */
+  DEFSYM (QCenable, ":enable");
+  DEFSYM (QCvisible, ":visible");
+  DEFSYM (QChelp, ":help");
+  DEFSYM (QCfilter, ":filter");
+  DEFSYM (QCbutton, ":button");
+  DEFSYM (QCkeys, ":keys");
+  DEFSYM (QCkey_sequence, ":key-sequence");
+
+  /* Non-nil disable property on a command means
+     do not execute it; call disabled-command-function's value instead.  */
+  DEFSYM (QCtoggle, ":toggle");
+  DEFSYM (QCradio, ":radio");
+  DEFSYM (QClabel, ":label");
+  DEFSYM (QCvert_only, ":vert-only");
+
+  /* Symbols to use for parts of windows.  */
+  DEFSYM (Qvertical_line, "vertical-line");
+  DEFSYM (Qright_divider, "right-divider");
+  DEFSYM (Qbottom_divider, "bottom-divider");
+
+  DEFSYM (Qmouse_fixup_help_message, "mouse-fixup-help-message");
+
+  DEFSYM (Qabove_handle, "above-handle");
+  DEFSYM (Qhandle, "handle");
+  DEFSYM (Qbelow_handle, "below-handle");
+  DEFSYM (Qup, "up");
+  DEFSYM (Qdown, "down");
+  DEFSYM (Qtop, "top");
+  DEFSYM (Qbottom, "bottom");
+  DEFSYM (Qend_scroll, "end-scroll");
+  DEFSYM (Qratio, "ratio");
+  DEFSYM (Qbefore_handle, "before-handle");
+  DEFSYM (Qhorizontal_handle, "horizontal-handle");
+  DEFSYM (Qafter_handle, "after-handle");
+  DEFSYM (Qleft, "left");
+  DEFSYM (Qright, "right");
+  DEFSYM (Qleftmost, "leftmost");
+  DEFSYM (Qrightmost, "rightmost");
+
+  /* Properties of event headers.  */
+  DEFSYM (Qevent_kind, "event-kind");
+  DEFSYM (Qevent_symbol_elements, "event-symbol-elements");
+
+  /* An event header symbol HEAD may have a property named
+     Qevent_symbol_element_mask, which is of the form (BASE MODIFIERS);
+     BASE is the base, unmodified version of HEAD, and MODIFIERS is the
+     mask of modifiers applied to it.  If present, this is used to help
+     speed up parse_modifiers.  */
+  DEFSYM (Qevent_symbol_element_mask, "event-symbol-element-mask");
+
+  /* An unmodified event header BASE may have a property named
+     Qmodifier_cache, which is an alist mapping modifier masks onto
+     modified versions of BASE.  If present, this helps speed up
+     apply_modifiers.  */
+  DEFSYM (Qmodifier_cache, "modifier-cache");
+
+  DEFSYM (Qrecompute_lucid_menubar, "recompute-lucid-menubar");
+  DEFSYM (Qactivate_menubar_hook, "activate-menubar-hook");
+
+  DEFSYM (Qpolling_period, "polling-period");
+
+  DEFSYM (Qgui_set_selection, "gui-set-selection");
+
+  /* The primary selection.  */
+  DEFSYM (QPRIMARY, "PRIMARY");
+
+  DEFSYM (Qhandle_switch_frame, "handle-switch-frame");
+  DEFSYM (Qhandle_select_window, "handle-select-window");
+
+  DEFSYM (Qinput_method_function, "input-method-function");
+  DEFSYM (Qinput_method_exit_on_first_char, "input-method-exit-on-first-char");
+  DEFSYM (Qinput_method_use_echo_area, "input-method-use-echo-area");
+
+  DEFSYM (Qhelp_form_show, "help-form-show");
+
+  DEFSYM (Qecho_keystrokes, "echo-keystrokes");
+
+  Fset (Qinput_method_exit_on_first_char, Qnil);
+  Fset (Qinput_method_use_echo_area, Qnil);
+
+  /* Symbols to head events.  */
+  DEFSYM (Qmouse_movement, "mouse-movement");
+  DEFSYM (Qscroll_bar_movement, "scroll-bar-movement");
+  DEFSYM (Qswitch_frame, "switch-frame");
+  DEFSYM (Qfocus_in, "focus-in");
+  DEFSYM (Qfocus_out, "focus-out");
+  DEFSYM (Qdelete_frame, "delete-frame");
+  DEFSYM (Qiconify_frame, "iconify-frame");
+  DEFSYM (Qmake_frame_visible, "make-frame-visible");
+  DEFSYM (Qselect_window, "select-window");
+  {
+    int i;
+
+    for (i = 0; i < ARRAYELTS (head_table); i++)
+      {
+       const struct event_head *p = &head_table[i];
+       Lisp_Object var = builtin_lisp_symbol (p->var);
+       Lisp_Object kind = builtin_lisp_symbol (p->kind);
+       Fput (var, Qevent_kind, kind);
+       Fput (var, Qevent_symbol_elements, list1 (var));
+      }
+  }
+
+  button_down_location = Fmake_vector (make_number (5), Qnil);
+  staticpro (&button_down_location);
+  mouse_syms = Fmake_vector (make_number (5), Qnil);
+  staticpro (&mouse_syms);
+  wheel_syms = Fmake_vector (make_number (ARRAYELTS (lispy_wheel_names)),
+                            Qnil);
+  staticpro (&wheel_syms);
+
+  {
+    int i;
+    int len = ARRAYELTS (modifier_names);
+
+    modifier_symbols = Fmake_vector (make_number (len), Qnil);
+    for (i = 0; i < len; i++)
+      if (modifier_names[i])
+       ASET (modifier_symbols, i, intern_c_string (modifier_names[i]));
+    staticpro (&modifier_symbols);
+  }
+
+  recent_keys = Fmake_vector (make_number (NUM_RECENT_KEYS), Qnil);
+  staticpro (&recent_keys);
+
+  this_command_keys = Fmake_vector (make_number (40), Qnil);
+  staticpro (&this_command_keys);
+
+  raw_keybuf = Fmake_vector (make_number (30), Qnil);
+  staticpro (&raw_keybuf);
+
+  DEFSYM (Qcommand_execute, "command-execute");
+
+  accent_key_syms = Qnil;
+  staticpro (&accent_key_syms);
+
+  func_key_syms = Qnil;
+  staticpro (&func_key_syms);
+
+  drag_n_drop_syms = Qnil;
+  staticpro (&drag_n_drop_syms);
+
+  unread_switch_frame = Qnil;
+  staticpro (&unread_switch_frame);
+
+  internal_last_event_frame = Qnil;
+  staticpro (&internal_last_event_frame);
+
+  read_key_sequence_cmd = Qnil;
+  staticpro (&read_key_sequence_cmd);
+  read_key_sequence_remapped = Qnil;
+  staticpro (&read_key_sequence_remapped);
+
+  menu_bar_one_keymap_changed_items = Qnil;
+  staticpro (&menu_bar_one_keymap_changed_items);
+
+  menu_bar_items_vector = Qnil;
+  staticpro (&menu_bar_items_vector);
+
+  help_form_saved_window_configs = Qnil;
+  staticpro (&help_form_saved_window_configs);
+
+  defsubr (&Scurrent_idle_time);
+  defsubr (&Sevent_symbol_parse_modifiers);
+  defsubr (&Sevent_convert_list);
+  defsubr (&Sread_key_sequence);
+  defsubr (&Sread_key_sequence_vector);
+  defsubr (&Srecursive_edit);
+  defsubr (&Strack_mouse);
+  defsubr (&Sinput_pending_p);
+  defsubr (&Srecent_keys);
+  defsubr (&Sthis_command_keys);
+  defsubr (&Sthis_command_keys_vector);
+  defsubr (&Sthis_single_command_keys);
+  defsubr (&Sthis_single_command_raw_keys);
+  defsubr (&Sreset_this_command_lengths);
+  defsubr (&Sclear_this_command_keys);
+  defsubr (&Ssuspend_emacs);
+  defsubr (&Sabort_recursive_edit);
+  defsubr (&Sexit_recursive_edit);
+  defsubr (&Srecursion_depth);
+  defsubr (&Scommand_error_default_function);
+  defsubr (&Stop_level);
+  defsubr (&Sdiscard_input);
+  defsubr (&Sopen_dribble_file);
+  defsubr (&Sset_input_interrupt_mode);
+  defsubr (&Sset_output_flow_control);
+  defsubr (&Sset_input_meta_mode);
+  defsubr (&Sset_quit_char);
+  defsubr (&Sset_input_mode);
+  defsubr (&Scurrent_input_mode);
+  defsubr (&Sposn_at_point);
+  defsubr (&Sposn_at_x_y);
+
+  DEFVAR_LISP ("last-command-event", last_command_event,
+                    doc: /* Last input event that was part of a command.  */);
+
+  DEFVAR_LISP ("last-nonmenu-event", last_nonmenu_event,
+              doc: /* Last input event in a command, except for mouse menu 
events.
+Mouse menus give back keys that don't look like mouse events;
+this variable holds the actual mouse event that led to the menu,
+so that you can determine whether the command was run by mouse or not.  */);
+
+  DEFVAR_LISP ("last-input-event", last_input_event,
+              doc: /* Last input event.  */);
+
+  DEFVAR_LISP ("unread-command-events", Vunread_command_events,
+              doc: /* List of events to be read as the command input.
+These events are processed first, before actual keyboard input.
+Events read from this list are not normally added to `this-command-keys',
+as they will already have been added once as they were read for the first time.
+An element of the form (t . EVENT) forces EVENT to be added to that list.  */);
+  Vunread_command_events = Qnil;
+
+  DEFVAR_LISP ("unread-post-input-method-events", 
Vunread_post_input_method_events,
+              doc: /* List of events to be processed as input by input methods.
+These events are processed before `unread-command-events'
+and actual keyboard input, but are not given to `input-method-function'.  */);
+  Vunread_post_input_method_events = Qnil;
+
+  DEFVAR_LISP ("unread-input-method-events", Vunread_input_method_events,
+              doc: /* List of events to be processed as input by input methods.
+These events are processed after `unread-command-events', but
+before actual keyboard input.
+If there's an active input method, the events are given to
+`input-method-function'.  */);
+  Vunread_input_method_events = Qnil;
+
+  DEFVAR_LISP ("meta-prefix-char", meta_prefix_char,
+              doc: /* Meta-prefix character code.
+Meta-foo as command input turns into this character followed by foo.  */);
+  XSETINT (meta_prefix_char, 033);
+
+  DEFVAR_KBOARD ("last-command", Vlast_command,
+                doc: /* The last command executed.
+Normally a symbol with a function definition, but can be whatever was found
+in the keymap, or whatever the variable `this-command' was set to by that
+command.
+
+The value `mode-exit' is special; it means that the previous command
+read an event that told it to exit, and it did so and unread that event.
+In other words, the present command is the event that made the previous
+command exit.
+
+The value `kill-region' is special; it means that the previous command
+was a kill command.
+
+`last-command' has a separate binding for each terminal device.
+See Info node `(elisp)Multiple Terminals'.  */);
+
+  DEFVAR_KBOARD ("real-last-command", Vreal_last_command,
+                doc: /* Same as `last-command', but never altered by Lisp code.
+Taken from the previous value of `real-this-command'.  */);
+
+  DEFVAR_KBOARD ("last-repeatable-command", Vlast_repeatable_command,
+                doc: /* Last command that may be repeated.
+The last command executed that was not bound to an input event.
+This is the command `repeat' will try to repeat.
+Taken from a previous value of `real-this-command'.  */);
+
+  DEFVAR_LISP ("this-command", Vthis_command,
+              doc: /* The command now being executed.
+The command can set this variable; whatever is put here
+will be in `last-command' during the following command.  */);
+  Vthis_command = Qnil;
+
+  DEFVAR_LISP ("real-this-command", Vreal_this_command,
+              doc: /* This is like `this-command', except that commands should 
never modify it.  */);
+  Vreal_this_command = Qnil;
+
+  DEFVAR_LISP ("this-command-keys-shift-translated",
+              Vthis_command_keys_shift_translated,
+              doc: /* Non-nil if the key sequence activating this command was 
shift-translated.
+Shift-translation occurs when there is no binding for the key sequence
+as entered, but a binding was found by changing an upper-case letter
+to lower-case, or a shifted function key to an unshifted one.  */);
+  Vthis_command_keys_shift_translated = Qnil;
+
+  DEFVAR_LISP ("this-original-command", Vthis_original_command,
+              doc: /* The command bound to the current key sequence before 
remapping.
+It equals `this-command' if the original command was not remapped through
+any of the active keymaps.  Otherwise, the value of `this-command' is the
+result of looking up the original command in the active keymaps.  */);
+  Vthis_original_command = Qnil;
+
+  DEFVAR_INT ("auto-save-interval", auto_save_interval,
+             doc: /* Number of input events between auto-saves.
+Zero means disable autosaving due to number of characters typed.  */);
+  auto_save_interval = 300;
+
+  DEFVAR_LISP ("auto-save-timeout", Vauto_save_timeout,
+              doc: /* Number of seconds idle time before auto-save.
+Zero or nil means disable auto-saving due to idleness.
+After auto-saving due to this many seconds of idle time,
+Emacs also does a garbage collection if that seems to be warranted.  */);
+  XSETFASTINT (Vauto_save_timeout, 30);
+
+  DEFVAR_LISP ("echo-keystrokes", Vecho_keystrokes,
+              doc: /* Nonzero means echo unfinished commands after this many 
seconds of pause.
+The value may be integer or floating point.
+If the value is zero, don't echo at all.  */);
+  Vecho_keystrokes = make_number (1);
+
+  DEFVAR_INT ("polling-period", polling_period,
+             doc: /* Interval between polling for input during Lisp execution.
+The reason for polling is to make C-g work to stop a running program.
+Polling is needed only when using X windows and SIGIO does not work.
+Polling is automatically disabled in all other cases.  */);
+  polling_period = 2;
+
+  DEFVAR_LISP ("double-click-time", Vdouble_click_time,
+              doc: /* Maximum time between mouse clicks to make a double-click.
+Measured in milliseconds.  The value nil means disable double-click
+recognition; t means double-clicks have no time limit and are detected
+by position only.  */);
+  Vdouble_click_time = make_number (500);
+
+  DEFVAR_INT ("double-click-fuzz", double_click_fuzz,
+             doc: /* Maximum mouse movement between clicks to make a 
double-click.
+On window-system frames, value is the number of pixels the mouse may have
+moved horizontally or vertically between two clicks to make a double-click.
+On non window-system frames, value is interpreted in units of 1/8 characters
+instead of pixels.
+
+This variable is also the threshold for motion of the mouse
+to count as a drag.  */);
+  double_click_fuzz = 3;
+
+  DEFVAR_INT ("num-input-keys", num_input_keys,
+             doc: /* Number of complete key sequences read as input so far.
+This includes key sequences read from keyboard macros.
+The number is effectively the number of interactive command invocations.  */);
+  num_input_keys = 0;
+
+  DEFVAR_INT ("num-nonmacro-input-events", num_nonmacro_input_events,
+             doc: /* Number of input events read from the keyboard so far.
+This does not include events generated by keyboard macros.  */);
+  num_nonmacro_input_events = 0;
+
+  DEFVAR_LISP ("last-event-frame", Vlast_event_frame,
+              doc: /* The frame in which the most recently read event occurred.
+If the last event came from a keyboard macro, this is set to `macro'.  */);
+  Vlast_event_frame = Qnil;
+
+  /* This variable is set up in sysdep.c.  */
+  DEFVAR_LISP ("tty-erase-char", Vtty_erase_char,
+              doc: /* The ERASE character as set by the user with stty.  */);
+
+  DEFVAR_LISP ("help-char", Vhelp_char,
+              doc: /* Character to recognize as meaning Help.
+When it is read, do `(eval help-form)', and display result if it's a string.
+If the value of `help-form' is nil, this char can be read normally.  */);
+  XSETINT (Vhelp_char, Ctl ('H'));
+
+  DEFVAR_LISP ("help-event-list", Vhelp_event_list,
+              doc: /* List of input events to recognize as meaning Help.
+These work just like the value of `help-char' (see that).  */);
+  Vhelp_event_list = Qnil;
+
+  DEFVAR_LISP ("help-form", Vhelp_form,
+              doc: /* Form to execute when character `help-char' is read.
+If the form returns a string, that string is displayed.
+If `help-form' is nil, the help char is not recognized.  */);
+  Vhelp_form = Qnil;
+
+  DEFVAR_LISP ("prefix-help-command", Vprefix_help_command,
+              doc: /* Command to run when `help-char' character follows a 
prefix key.
+This command is used only when there is no actual binding
+for that character after that prefix key.  */);
+  Vprefix_help_command = Qnil;
+
+  DEFVAR_LISP ("top-level", Vtop_level,
+              doc: /* Form to evaluate when Emacs starts up.
+Useful to set before you dump a modified Emacs.  */);
+  Vtop_level = Qnil;
+  XSYMBOL (Qtop_level)->declared_special = false;
+
+  DEFVAR_KBOARD ("keyboard-translate-table", Vkeyboard_translate_table,
+                 doc: /* Translate table for local keyboard input, or nil.
+If non-nil, the value should be a char-table.  Each character read
+from the keyboard is looked up in this char-table.  If the value found
+there is non-nil, then it is used instead of the actual input character.
+
+The value can also be a string or vector, but this is considered obsolete.
+If it is a string or vector of length N, character codes N and up are left
+untranslated.  In a vector, an element which is nil means "no translation".
+
+This is applied to the characters supplied to input methods, not their
+output.  See also `translation-table-for-input'.
+
+This variable has a separate binding for each terminal.
+See Info node `(elisp)Multiple Terminals'.  */);
+
+  DEFVAR_BOOL ("cannot-suspend", cannot_suspend,
+              doc: /* Non-nil means to always spawn a subshell instead of 
suspending.
+\(Even if the operating system has support for stopping a process.\)  */);
+  cannot_suspend = 0;
+
+  DEFVAR_BOOL ("menu-prompting", menu_prompting,
+              doc: /* Non-nil means prompt with menus when appropriate.
+This is done when reading from a keymap that has a prompt string,
+for elements that have prompt strings.
+The menu is displayed on the screen
+if X menus were enabled at configuration
+time and the previous event was a mouse click prefix key.
+Otherwise, menu prompting uses the echo area.  */);
+  menu_prompting = 1;
+
+  DEFVAR_LISP ("menu-prompt-more-char", menu_prompt_more_char,
+              doc: /* Character to see next line of menu prompt.
+Type this character while in a menu prompt to rotate around the lines of it.  
*/);
+  XSETINT (menu_prompt_more_char, ' ');
+
+  DEFVAR_INT ("extra-keyboard-modifiers", extra_keyboard_modifiers,
+             doc: /* A mask of additional modifier keys to use with every 
keyboard character.
+Emacs applies the modifiers of the character stored here to each keyboard
+character it reads.  For example, after evaluating the expression
+    (setq extra-keyboard-modifiers ?\\C-x)
+all input characters will have the control modifier applied to them.
+
+Note that the character ?\\C-@, equivalent to the integer zero, does
+not count as a control character; rather, it counts as a character
+with no modifiers; thus, setting `extra-keyboard-modifiers' to zero
+cancels any modification.  */);
+  extra_keyboard_modifiers = 0;
+
+  DEFSYM (Qdeactivate_mark, "deactivate-mark");
+  DEFVAR_LISP ("deactivate-mark", Vdeactivate_mark,
+              doc: /* If an editing command sets this to t, deactivate the 
mark afterward.
+The command loop sets this to nil before each command,
+and tests the value when the command returns.
+Buffer modification stores t in this variable.  */);
+  Vdeactivate_mark = Qnil;
+  Fmake_variable_buffer_local (Qdeactivate_mark);
+
+  DEFVAR_LISP ("pre-command-hook", Vpre_command_hook,
+              doc: /* Normal hook run before each command is executed.
+If an unhandled error happens in running this hook,
+the function in which the error occurred is unconditionally removed, since
+otherwise the error might happen repeatedly and make Emacs nonfunctional.  */);
+  Vpre_command_hook = Qnil;
+
+  DEFVAR_LISP ("post-command-hook", Vpost_command_hook,
+              doc: /* Normal hook run after each command is executed.
+If an unhandled error happens in running this hook,
+the function in which the error occurred is unconditionally removed, since
+otherwise the error might happen repeatedly and make Emacs nonfunctional.  */);
+  Vpost_command_hook = Qnil;
+
+#if 0
+  DEFVAR_LISP ("echo-area-clear-hook", ...,
+              doc: /* Normal hook run when clearing the echo area.  */);
+#endif
+  DEFSYM (Qecho_area_clear_hook, "echo-area-clear-hook");
+  Fset (Qecho_area_clear_hook, Qnil);
+
+  DEFVAR_LISP ("lucid-menu-bar-dirty-flag", Vlucid_menu_bar_dirty_flag,
+              doc: /* Non-nil means menu bar, specified Lucid style, needs to 
be recomputed.  */);
+  Vlucid_menu_bar_dirty_flag = Qnil;
+
+  DEFVAR_LISP ("menu-bar-final-items", Vmenu_bar_final_items,
+              doc: /* List of menu bar items to move to the end of the menu 
bar.
+The elements of the list are event types that may have menu bar bindings.  */);
+  Vmenu_bar_final_items = Qnil;
+
+  DEFVAR_LISP ("tool-bar-separator-image-expression", 
Vtool_bar_separator_image_expression,
+    doc: /* Expression evaluating to the image spec for a tool-bar separator.
+This is used internally by graphical displays that do not render
+tool-bar separators natively.  Otherwise it is unused (e.g. on GTK).  */);
+  Vtool_bar_separator_image_expression = Qnil;
+
+  DEFVAR_KBOARD ("overriding-terminal-local-map",
+                Voverriding_terminal_local_map,
+                doc: /* Per-terminal keymap that takes precedence over all 
other keymaps.
+This variable is intended to let commands such as `universal-argument'
+set up a different keymap for reading the next command.
+
+`overriding-terminal-local-map' has a separate binding for each
+terminal device.  See Info node `(elisp)Multiple Terminals'.  */);
+
+  DEFVAR_LISP ("overriding-local-map", Voverriding_local_map,
+              doc: /* Keymap that replaces (overrides) local keymaps.
+If this variable is non-nil, Emacs looks up key bindings in this
+keymap INSTEAD OF the keymap char property, minor mode maps, and the
+buffer's local map.  Hence, the only active keymaps would be
+`overriding-terminal-local-map', this keymap, and `global-keymap', in
+order of precedence.  */);
+  Voverriding_local_map = Qnil;
+
+  DEFVAR_LISP ("overriding-local-map-menu-flag", 
Voverriding_local_map_menu_flag,
+              doc: /* Non-nil means `overriding-local-map' applies to the menu 
bar.
+Otherwise, the menu bar continues to reflect the buffer's local map
+and the minor mode maps regardless of `overriding-local-map'.  */);
+  Voverriding_local_map_menu_flag = Qnil;
+
+  DEFVAR_LISP ("special-event-map", Vspecial_event_map,
+              doc: /* Keymap defining bindings for special events to execute 
at low level.  */);
+  Vspecial_event_map = list1 (Qkeymap);
+
+  DEFVAR_LISP ("track-mouse", do_mouse_tracking,
+              doc: /* Non-nil means generate motion events for mouse motion.  
*/);
+
+  DEFVAR_KBOARD ("system-key-alist", Vsystem_key_alist,
+                doc: /* Alist of system-specific X windows key symbols.
+Each element should have the form (N . SYMBOL) where N is the
+numeric keysym code (sans the \"system-specific\" bit 1<<28)
+and SYMBOL is its name.
+
+`system-key-alist' has a separate binding for each terminal device.
+See Info node `(elisp)Multiple Terminals'.  */);
+
+  DEFVAR_KBOARD ("local-function-key-map", Vlocal_function_key_map,
+                 doc: /* Keymap that translates key sequences to key sequences 
during input.
+This is used mainly for mapping key sequences into some preferred
+key events (symbols).
+
+The `read-key-sequence' function replaces any subsequence bound by
+`local-function-key-map' with its binding.  More precisely, when the
+active keymaps have no binding for the current key sequence but
+`local-function-key-map' binds a suffix of the sequence to a vector or
+string, `read-key-sequence' replaces the matching suffix with its
+binding, and continues with the new sequence.
+
+If the binding is a function, it is called with one argument (the prompt)
+and its return value (a key sequence) is used.
+
+The events that come from bindings in `local-function-key-map' are not
+themselves looked up in `local-function-key-map'.
+
+For example, suppose `local-function-key-map' binds `ESC O P' to [f1].
+Typing `ESC O P' to `read-key-sequence' would return [f1].  Typing
+`C-x ESC O P' would return [?\\C-x f1].  If [f1] were a prefix key,
+typing `ESC O P x' would return [f1 x].
+
+`local-function-key-map' has a separate binding for each terminal
+device.  See Info node `(elisp)Multiple Terminals'.  If you need to
+define a binding on all terminals, change `function-key-map'
+instead.  Initially, `local-function-key-map' is an empty keymap that
+has `function-key-map' as its parent on all terminal devices.  */);
+
+  DEFVAR_KBOARD ("input-decode-map", Vinput_decode_map,
+                doc: /* Keymap that decodes input escape sequences.
+This is used mainly for mapping ASCII function key sequences into
+real Emacs function key events (symbols).
+
+The `read-key-sequence' function replaces any subsequence bound by
+`input-decode-map' with its binding.  Contrary to `function-key-map',
+this map applies its rebinding regardless of the presence of an ordinary
+binding.  So it is more like `key-translation-map' except that it applies
+before `function-key-map' rather than after.
+
+If the binding is a function, it is called with one argument (the prompt)
+and its return value (a key sequence) is used.
+
+The events that come from bindings in `input-decode-map' are not
+themselves looked up in `input-decode-map'.  */);
+
+  DEFVAR_LISP ("function-key-map", Vfunction_key_map,
+               doc: /* The parent keymap of all `local-function-key-map' 
instances.
+Function key definitions that apply to all terminal devices should go
+here.  If a mapping is defined in both the current
+`local-function-key-map' binding and this variable, then the local
+definition will take precedence.  */);
+  Vfunction_key_map = Fmake_sparse_keymap (Qnil);
+
+  DEFVAR_LISP ("key-translation-map", Vkey_translation_map,
+               doc: /* Keymap of key translations that can override keymaps.
+This keymap works like `input-decode-map', but comes after `function-key-map'.
+Another difference is that it is global rather than terminal-local.  */);
+  Vkey_translation_map = Fmake_sparse_keymap (Qnil);
+
+  DEFVAR_LISP ("deferred-action-list", Vdeferred_action_list,
+              doc: /* List of deferred actions to be performed at a later time.
+The precise format isn't relevant here; we just check whether it is nil.  */);
+  Vdeferred_action_list = Qnil;
+
+  DEFVAR_LISP ("deferred-action-function", Vdeferred_action_function,
+              doc: /* Function to call to handle deferred actions, after each 
command.
+This function is called with no arguments after each command
+whenever `deferred-action-list' is non-nil.  */);
+  Vdeferred_action_function = Qnil;
+
+  DEFVAR_LISP ("delayed-warnings-list", Vdelayed_warnings_list,
+               doc: /* List of warnings to be displayed after this command.
+Each element must be a list (TYPE MESSAGE [LEVEL [BUFFER-NAME]]),
+as per the args of `display-warning' (which see).
+If this variable is non-nil, `delayed-warnings-hook' will be run
+immediately after running `post-command-hook'.  */);
+  Vdelayed_warnings_list = Qnil;
+
+  DEFVAR_LISP ("timer-list", Vtimer_list,
+              doc: /* List of active absolute time timers in order of 
increasing time.  */);
+  Vtimer_list = Qnil;
+
+  DEFVAR_LISP ("timer-idle-list", Vtimer_idle_list,
+              doc: /* List of active idle-time timers in order of increasing 
time.  */);
+  Vtimer_idle_list = Qnil;
+
+  DEFVAR_LISP ("input-method-function", Vinput_method_function,
+              doc: /* If non-nil, the function that implements the current 
input method.
+It's called with one argument, a printing character that was just read.
+\(That means a character with code 040...0176.)
+Typically this function uses `read-event' to read additional events.
+When it does so, it should first bind `input-method-function' to nil
+so it will not be called recursively.
+
+The function should return a list of zero or more events
+to be used as input.  If it wants to put back some events
+to be reconsidered, separately, by the input method,
+it can add them to the beginning of `unread-command-events'.
+
+The input method function can find in `input-method-previous-message'
+the previous echo area message.
+
+The input method function should refer to the variables
+`input-method-use-echo-area' and `input-method-exit-on-first-char'
+for guidance on what to do.  */);
+  Vinput_method_function = Qlist;
+
+  DEFVAR_LISP ("input-method-previous-message",
+              Vinput_method_previous_message,
+              doc: /* When `input-method-function' is called, hold the 
previous echo area message.
+This variable exists because `read-event' clears the echo area
+before running the input method.  It is nil if there was no message.  */);
+  Vinput_method_previous_message = Qnil;
+
+  DEFVAR_LISP ("show-help-function", Vshow_help_function,
+              doc: /* If non-nil, the function that implements the display of 
help.
+It's called with one argument, the help string to display.  */);
+  Vshow_help_function = Qnil;
+
+  DEFVAR_LISP ("disable-point-adjustment", Vdisable_point_adjustment,
+              doc: /* If non-nil, suppress point adjustment after executing a 
command.
+
+After a command is executed, if point is moved into a region that has
+special properties (e.g. composition, display), we adjust point to
+the boundary of the region.  But, when a command sets this variable to
+non-nil, we suppress the point adjustment.
+
+This variable is set to nil before reading a command, and is checked
+just after executing the command.  */);
+  Vdisable_point_adjustment = Qnil;
+
+  DEFVAR_LISP ("global-disable-point-adjustment",
+              Vglobal_disable_point_adjustment,
+              doc: /* If non-nil, always suppress point adjustment.
+
+The default value is nil, in which case, point adjustment are
+suppressed only after special commands that set
+`disable-point-adjustment' (which see) to non-nil.  */);
+  Vglobal_disable_point_adjustment = Qnil;
+
+  DEFVAR_LISP ("minibuffer-message-timeout", Vminibuffer_message_timeout,
+              doc: /* How long to display an echo-area message when the 
minibuffer is active.
+If the value is not a number, such messages don't time out.  */);
+  Vminibuffer_message_timeout = make_number (2);
+
+  DEFVAR_LISP ("throw-on-input", Vthrow_on_input,
+              doc: /* If non-nil, any keyboard input throws to this symbol.
+The value of that variable is passed to `quit-flag' and later causes a
+peculiar kind of quitting.  */);
+  Vthrow_on_input = Qnil;
+
+  DEFVAR_LISP ("command-error-function", Vcommand_error_function,
+              doc: /* Function to output error messages.
+Called with three arguments:
+- the error data, a list of the form (SIGNALED-CONDITION . SIGNAL-DATA)
+  such as what `condition-case' would bind its variable to,
+- the context (a string which normally goes at the start of the message),
+- the Lisp function within which the error was signaled.  */);
+  Vcommand_error_function = intern ("command-error-default-function");
+
+  DEFVAR_LISP ("enable-disabled-menus-and-buttons",
+              Venable_disabled_menus_and_buttons,
+              doc: /* If non-nil, don't ignore events produced by disabled 
menu items and tool-bar.
+
+Help functions bind this to allow help on disabled menu items
+and tool-bar buttons.  */);
+  Venable_disabled_menus_and_buttons = Qnil;
+
+  DEFVAR_LISP ("select-active-regions",
+              Vselect_active_regions,
+              doc: /* If non-nil, an active region automatically sets the 
primary selection.
+If the value is `only', only temporarily active regions (usually made
+by mouse-dragging or shift-selection) set the window selection.
+
+This takes effect only when Transient Mark mode is enabled.  */);
+  Vselect_active_regions = Qt;
+
+  DEFVAR_LISP ("saved-region-selection",
+              Vsaved_region_selection,
+              doc: /* Contents of active region prior to buffer modification.
+If `select-active-regions' is non-nil, Emacs sets this to the
+text in the region before modifying the buffer.  The next call to
+the function `deactivate-mark' uses this to set the window selection.  */);
+  Vsaved_region_selection = Qnil;
+
+  DEFVAR_LISP ("selection-inhibit-update-commands",
+              Vselection_inhibit_update_commands,
+              doc: /* List of commands which should not update the selection.
+Normally, if `select-active-regions' is non-nil and the mark remains
+active after a command (i.e. the mark was not deactivated), the Emacs
+command loop sets the selection to the text in the region.  However,
+if the command is in this list, the selection is not updated.  */);
+  Vselection_inhibit_update_commands
+    = list2 (Qhandle_switch_frame, Qhandle_select_window);
+
+  DEFVAR_LISP ("debug-on-event",
+               Vdebug_on_event,
+               doc: /* Enter debugger on this event.  When Emacs
+receives the special event specified by this variable, it will try to
+break into the debugger as soon as possible instead of processing the
+event normally through `special-event-map'.
+
+Currently, the only supported values for this
+variable are `sigusr1' and `sigusr2'.  */);
+  Vdebug_on_event = intern_c_string ("sigusr2");
+
+  /* Create the initial keyboard.  Qt means 'unset'.  */
+  initial_kboard = allocate_kboard (Qt);
+}
+
+void
+keys_of_keyboard (void)
+{
+  initial_define_key (global_map, Ctl ('Z'), "suspend-emacs");
+  initial_define_key (control_x_map, Ctl ('Z'), "suspend-emacs");
+  initial_define_key (meta_map, Ctl ('C'), "exit-recursive-edit");
+  initial_define_key (global_map, Ctl (']'), "abort-recursive-edit");
+  initial_define_key (meta_map, 'x', "execute-extended-command");
+
+  initial_define_lispy_key (Vspecial_event_map, "delete-frame",
+                           "handle-delete-frame");
+  initial_define_lispy_key (Vspecial_event_map, "ns-put-working-text",
+                           "ns-put-working-text");
+  initial_define_lispy_key (Vspecial_event_map, "ns-unput-working-text",
+                           "ns-unput-working-text");
+  /* Here we used to use `ignore-event' which would simple set prefix-arg to
+     current-prefix-arg, as is done in `handle-switch-frame'.
+     But `handle-switch-frame is not run from the special-map.
+     Commands from that map are run in a special way that automatically
+     preserves the prefix-arg.  Restoring the prefix arg here is not just
+     redundant but harmful:
+     - C-u C-x v =
+     - current-prefix-arg is set to non-nil, prefix-arg is set to nil.
+     - after the first prompt, the exit-minibuffer-hook is run which may
+       iconify a frame and thus push a `iconify-frame' event.
+     - after running exit-minibuffer-hook, current-prefix-arg is
+       restored to the non-nil value it had before the prompt.
+     - we enter the second prompt.
+       current-prefix-arg is non-nil, prefix-arg is nil.
+     - before running the first real event, we run the special iconify-frame
+       event, but we pass the `special' arg to command-execute so
+       current-prefix-arg and prefix-arg are left untouched.
+     - here we foolishly copy the non-nil current-prefix-arg to prefix-arg.
+     - the next key event will have a spuriously non-nil current-prefix-arg.  
*/
+  initial_define_lispy_key (Vspecial_event_map, "iconify-frame",
+                           "ignore");
+  initial_define_lispy_key (Vspecial_event_map, "make-frame-visible",
+                           "ignore");
+  /* Handling it at such a low-level causes read_key_sequence to get
+   * confused because it doesn't realize that the current_buffer was
+   * changed by read_char.
+   *
+   * initial_define_lispy_key (Vspecial_event_map, "select-window",
+   *                       "handle-select-window"); */
+  initial_define_lispy_key (Vspecial_event_map, "save-session",
+                           "handle-save-session");
+
+#ifdef HAVE_DBUS
+  /* Define a special event which is raised for dbus callback
+     functions.  */
+  initial_define_lispy_key (Vspecial_event_map, "dbus-event",
+                           "dbus-handle-event");
+#endif
+
+#ifdef USE_FILE_NOTIFY
+  /* Define a special event which is raised for notification callback
+     functions.  */
+  initial_define_lispy_key (Vspecial_event_map, "file-notify",
+                            "file-notify-handle-event");
+#endif /* USE_FILE_NOTIFY */
+
+  initial_define_lispy_key (Vspecial_event_map, "config-changed-event",
+                           "ignore");
+#if defined (WINDOWSNT)
+  initial_define_lispy_key (Vspecial_event_map, "language-change",
+                           "ignore");
+#endif
+  initial_define_lispy_key (Vspecial_event_map, "focus-in",
+                           "handle-focus-in");
+  initial_define_lispy_key (Vspecial_event_map, "focus-out",
+                           "handle-focus-out");
+}
+
+/* Mark the pointers in the kboard objects.
+   Called by Fgarbage_collect.  */
+void
+mark_kboards (void)
+{
+  KBOARD *kb;
+  Lisp_Object *p;
+  for (kb = all_kboards; kb; kb = kb->next_kboard)
+    {
+      if (kb->kbd_macro_buffer)
+       for (p = kb->kbd_macro_buffer; p < kb->kbd_macro_ptr; p++)
+         mark_object (*p);
+      mark_object (KVAR (kb, Voverriding_terminal_local_map));
+      mark_object (KVAR (kb, Vlast_command));
+      mark_object (KVAR (kb, Vreal_last_command));
+      mark_object (KVAR (kb, Vkeyboard_translate_table));
+      mark_object (KVAR (kb, Vlast_repeatable_command));
+      mark_object (KVAR (kb, Vprefix_arg));
+      mark_object (KVAR (kb, Vlast_prefix_arg));
+      mark_object (KVAR (kb, kbd_queue));
+      mark_object (KVAR (kb, defining_kbd_macro));
+      mark_object (KVAR (kb, Vlast_kbd_macro));
+      mark_object (KVAR (kb, Vsystem_key_alist));
+      mark_object (KVAR (kb, system_key_syms));
+      mark_object (KVAR (kb, Vwindow_system));
+      mark_object (KVAR (kb, Vinput_decode_map));
+      mark_object (KVAR (kb, Vlocal_function_key_map));
+      mark_object (KVAR (kb, Vdefault_minibuffer_frame));
+      mark_object (KVAR (kb, echo_string));
+    }
+  {
+    struct input_event *event;
+    for (event = kbd_fetch_ptr; event != kbd_store_ptr; event++)
+      {
+       if (event == kbd_buffer + KBD_BUFFER_SIZE)
+         event = kbd_buffer;
+       /* These two special event types has no Lisp_Objects to mark.  */
+       if (event->kind != SELECTION_REQUEST_EVENT
+           && event->kind != SELECTION_CLEAR_EVENT)
+         {
+           mark_object (event->x);
+           mark_object (event->y);
+           mark_object (event->frame_or_window);
+           mark_object (event->arg);
+         }
+      }
+  }
+}
diff --git a/test/etags/c-src/emacs/src/lisp.h 
b/test/etags/c-src/emacs/src/lisp.h
new file mode 100644
index 0000000..6d34ce3
--- /dev/null
+++ b/test/etags/c-src/emacs/src/lisp.h
@@ -0,0 +1,4817 @@
+/* Fundamental definitions for GNU Emacs Lisp interpreter.
+
+Copyright (C) 1985-1987, 1993-1995, 1997-2015 Free Software Foundation,
+Inc.
+
+This file is part of GNU Emacs.
+
+GNU Emacs is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef EMACS_LISP_H
+#define EMACS_LISP_H
+
+#include <setjmp.h>
+#include <stdalign.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <float.h>
+#include <inttypes.h>
+#include <limits.h>
+
+#include <intprops.h>
+#include <verify.h>
+
+INLINE_HEADER_BEGIN
+
+/* Define a TYPE constant ID as an externally visible name.  Use like this:
+
+      DEFINE_GDB_SYMBOL_BEGIN (TYPE, ID)
+      # define ID (some integer preprocessor expression of type TYPE)
+      DEFINE_GDB_SYMBOL_END (ID)
+
+   This hack is for the benefit of compilers that do not make macro
+   definitions or enums visible to the debugger.  It's used for symbols
+   that .gdbinit needs.  */
+
+#define DECLARE_GDB_SYM(type, id) type const id EXTERNALLY_VISIBLE
+#ifdef MAIN_PROGRAM
+# define DEFINE_GDB_SYMBOL_BEGIN(type, id) DECLARE_GDB_SYM (type, id)
+# define DEFINE_GDB_SYMBOL_END(id) = id;
+#else
+# define DEFINE_GDB_SYMBOL_BEGIN(type, id) extern DECLARE_GDB_SYM (type, id)
+# define DEFINE_GDB_SYMBOL_END(val) ;
+#endif
+
+/* The ubiquitous max and min macros.  */
+#undef min
+#undef max
+#define max(a, b) ((a) > (b) ? (a) : (b))
+#define min(a, b) ((a) < (b) ? (a) : (b))
+
+/* Number of elements in an array.  */
+#define ARRAYELTS(arr) (sizeof (arr) / sizeof (arr)[0])
+
+/* Number of bits in a Lisp_Object tag.  */
+DEFINE_GDB_SYMBOL_BEGIN (int, GCTYPEBITS)
+#define GCTYPEBITS 3
+DEFINE_GDB_SYMBOL_END (GCTYPEBITS)
+
+/* The number of bits needed in an EMACS_INT over and above the number
+   of bits in a pointer.  This is 0 on systems where:
+   1.  We can specify multiple-of-8 alignment on static variables.
+   2.  We know malloc returns a multiple of 8.  */
+#if (defined alignas \
+     && (defined GNU_MALLOC || defined DOUG_LEA_MALLOC || defined __GLIBC__ \
+        || defined DARWIN_OS || defined __sun || defined __MINGW32__ \
+        || defined CYGWIN))
+# define NONPOINTER_BITS 0
+#else
+# define NONPOINTER_BITS GCTYPEBITS
+#endif
+
+/* EMACS_INT - signed integer wide enough to hold an Emacs value
+   EMACS_INT_MAX - maximum value of EMACS_INT; can be used in #if
+   pI - printf length modifier for EMACS_INT
+   EMACS_UINT - unsigned variant of EMACS_INT */
+#ifndef EMACS_INT_MAX
+# if INTPTR_MAX <= 0
+#  error "INTPTR_MAX misconfigured"
+# elif INTPTR_MAX <= INT_MAX >> NONPOINTER_BITS && !defined WIDE_EMACS_INT
+typedef int EMACS_INT;
+typedef unsigned int EMACS_UINT;
+#  define EMACS_INT_MAX INT_MAX
+#  define pI ""
+# elif INTPTR_MAX <= LONG_MAX >> NONPOINTER_BITS && !defined WIDE_EMACS_INT
+typedef long int EMACS_INT;
+typedef unsigned long EMACS_UINT;
+#  define EMACS_INT_MAX LONG_MAX
+#  define pI "l"
+/* Check versus LLONG_MAX, not LLONG_MAX >> NONPOINTER_BITS.
+   In theory this is not safe, but in practice it seems to be OK.  */
+# elif INTPTR_MAX <= LLONG_MAX
+typedef long long int EMACS_INT;
+typedef unsigned long long int EMACS_UINT;
+#  define EMACS_INT_MAX LLONG_MAX
+#  define pI "ll"
+# else
+#  error "INTPTR_MAX too large"
+# endif
+#endif
+
+/* Number of bits to put in each character in the internal representation
+   of bool vectors.  This should not vary across implementations.  */
+enum {  BOOL_VECTOR_BITS_PER_CHAR =
+#define BOOL_VECTOR_BITS_PER_CHAR 8
+        BOOL_VECTOR_BITS_PER_CHAR
+};
+
+/* An unsigned integer type representing a fixed-length bit sequence,
+   suitable for bool vector words, GC mark bits, etc.  Normally it is size_t
+   for speed, but it is unsigned char on weird platforms.  */
+#if BOOL_VECTOR_BITS_PER_CHAR == CHAR_BIT
+typedef size_t bits_word;
+# define BITS_WORD_MAX SIZE_MAX
+enum { BITS_PER_BITS_WORD = CHAR_BIT * sizeof (bits_word) };
+#else
+typedef unsigned char bits_word;
+# define BITS_WORD_MAX ((1u << BOOL_VECTOR_BITS_PER_CHAR) - 1)
+enum { BITS_PER_BITS_WORD = BOOL_VECTOR_BITS_PER_CHAR };
+#endif
+verify (BITS_WORD_MAX >> (BITS_PER_BITS_WORD - 1) == 1);
+
+/* Number of bits in some machine integer types.  */
+enum
+  {
+    BITS_PER_CHAR      = CHAR_BIT,
+    BITS_PER_SHORT     = CHAR_BIT * sizeof (short),
+    BITS_PER_LONG      = CHAR_BIT * sizeof (long int),
+    BITS_PER_EMACS_INT = CHAR_BIT * sizeof (EMACS_INT)
+  };
+
+/* printmax_t and uprintmax_t are types for printing large integers.
+   These are the widest integers that are supported for printing.
+   pMd etc. are conversions for printing them.
+   On C99 hosts, there's no problem, as even the widest integers work.
+   Fall back on EMACS_INT on pre-C99 hosts.  */
+#ifdef PRIdMAX
+typedef intmax_t printmax_t;
+typedef uintmax_t uprintmax_t;
+# define pMd PRIdMAX
+# define pMu PRIuMAX
+#else
+typedef EMACS_INT printmax_t;
+typedef EMACS_UINT uprintmax_t;
+# define pMd pI"d"
+# define pMu pI"u"
+#endif
+
+/* Use pD to format ptrdiff_t values, which suffice for indexes into
+   buffers and strings.  Emacs never allocates objects larger than
+   PTRDIFF_MAX bytes, as they cause problems with pointer subtraction.
+   In C99, pD can always be "t"; configure it here for the sake of
+   pre-C99 libraries such as glibc 2.0 and Solaris 8.  */
+#if PTRDIFF_MAX == INT_MAX
+# define pD ""
+#elif PTRDIFF_MAX == LONG_MAX
+# define pD "l"
+#elif PTRDIFF_MAX == LLONG_MAX
+# define pD "ll"
+#else
+# define pD "t"
+#endif
+
+/* Extra internal type checking?  */
+
+/* Define Emacs versions of <assert.h>'s 'assert (COND)' and <verify.h>'s
+   'assume (COND)'.  COND should be free of side effects, as it may or
+   may not be evaluated.
+
+   'eassert (COND)' checks COND at runtime if ENABLE_CHECKING is
+   defined and suppress_checking is false, and does nothing otherwise.
+   Emacs dies if COND is checked and is false.  The suppress_checking
+   variable is initialized to 0 in alloc.c.  Set it to 1 using a
+   debugger to temporarily disable aborting on detected internal
+   inconsistencies or error conditions.
+
+   In some cases, a good compiler may be able to optimize away the
+   eassert macro even if ENABLE_CHECKING is true, e.g., if XSTRING (x)
+   uses eassert to test STRINGP (x), but a particular use of XSTRING
+   is invoked only after testing that STRINGP (x) is true, making the
+   test redundant.
+
+   eassume is like eassert except that it also causes the compiler to
+   assume that COND is true afterwards, regardless of whether runtime
+   checking is enabled.  This can improve performance in some cases,
+   though it can degrade performance in others.  It's often suboptimal
+   for COND to call external functions or access volatile storage.  */
+
+#ifndef ENABLE_CHECKING
+# define eassert(cond) ((void) (false && (cond))) /* Check COND compiles.  */
+# define eassume(cond) assume (cond)
+#else /* ENABLE_CHECKING */
+
+extern _Noreturn void die (const char *, const char *, int);
+
+extern bool suppress_checking EXTERNALLY_VISIBLE;
+
+# define eassert(cond)                                         \
+   (suppress_checking || (cond)                                \
+    ? (void) 0                                                 \
+    : die (# cond, __FILE__, __LINE__))
+# define eassume(cond)                                         \
+   (suppress_checking                                          \
+    ? assume (cond)                                            \
+    : (cond)                                                   \
+    ? (void) 0                                                 \
+    : die (# cond, __FILE__, __LINE__))
+#endif /* ENABLE_CHECKING */
+
+
+/* Use the configure flag --enable-check-lisp-object-type to make
+   Lisp_Object use a struct type instead of the default int.  The flag
+   causes CHECK_LISP_OBJECT_TYPE to be defined.  */
+
+/***** Select the tagging scheme.  *****/
+/* The following option controls the tagging scheme:
+   - USE_LSB_TAG means that we can assume the least 3 bits of pointers are
+     always 0, and we can thus use them to hold tag bits, without
+     restricting our addressing space.
+
+   If ! USE_LSB_TAG, then use the top 3 bits for tagging, thus
+   restricting our possible address range.
+
+   USE_LSB_TAG not only requires the least 3 bits of pointers returned by
+   malloc to be 0 but also needs to be able to impose a mult-of-8 alignment
+   on the few static Lisp_Objects used: lispsym, all the defsubr, and
+   the two special buffers buffer_defaults and buffer_local_symbols.  */
+
+enum Lisp_Bits
+  {
+    /* 2**GCTYPEBITS.  This must be a macro that expands to a literal
+       integer constant, for MSVC.  */
+#define GCALIGNMENT 8
+
+    /* Number of bits in a Lisp_Object value, not counting the tag.  */
+    VALBITS = BITS_PER_EMACS_INT - GCTYPEBITS,
+
+    /* Number of bits in a Lisp fixnum tag.  */
+    INTTYPEBITS = GCTYPEBITS - 1,
+
+    /* Number of bits in a Lisp fixnum value, not counting the tag.  */
+    FIXNUM_BITS = VALBITS + 1
+  };
+
+#if GCALIGNMENT != 1 << GCTYPEBITS
+# error "GCALIGNMENT and GCTYPEBITS are inconsistent"
+#endif
+
+/* The maximum value that can be stored in a EMACS_INT, assuming all
+   bits other than the type bits contribute to a nonnegative signed value.
+   This can be used in #if, e.g., '#if USB_TAG' below expands to an
+   expression involving VAL_MAX.  */
+#define VAL_MAX (EMACS_INT_MAX >> (GCTYPEBITS - 1))
+
+/* Whether the least-significant bits of an EMACS_INT contain the tag.
+   On hosts where pointers-as-ints do not exceed VAL_MAX / 2, USE_LSB_TAG is:
+    a. unnecessary, because the top bits of an EMACS_INT are unused, and
+    b. slower, because it typically requires extra masking.
+   So, USE_LSB_TAG is true only on hosts where it might be useful.  */
+DEFINE_GDB_SYMBOL_BEGIN (bool, USE_LSB_TAG)
+#define USE_LSB_TAG (VAL_MAX / 2 < INTPTR_MAX)
+DEFINE_GDB_SYMBOL_END (USE_LSB_TAG)
+
+#if !USE_LSB_TAG && !defined WIDE_EMACS_INT
+# error "USE_LSB_TAG not supported on this platform; please report this." \
+       "Try 'configure --with-wide-int' to work around the problem."
+error !;
+#endif
+
+#ifndef alignas
+# define alignas(alignment) /* empty */
+# if USE_LSB_TAG
+#  error "USE_LSB_TAG requires alignas"
+# endif
+#endif
+
+#ifdef HAVE_STRUCT_ATTRIBUTE_ALIGNED
+# define GCALIGNED __attribute__ ((aligned (GCALIGNMENT)))
+#else
+# define GCALIGNED /* empty */
+#endif
+
+/* Some operations are so commonly executed that they are implemented
+   as macros, not functions, because otherwise runtime performance would
+   suffer too much when compiling with GCC without optimization.
+   There's no need to inline everything, just the operations that
+   would otherwise cause a serious performance problem.
+
+   For each such operation OP, define a macro lisp_h_OP that contains
+   the operation's implementation.  That way, OP can be implemented
+   via a macro definition like this:
+
+     #define OP(x) lisp_h_OP (x)
+
+   and/or via a function definition like this:
+
+     LISP_MACRO_DEFUN (OP, Lisp_Object, (Lisp_Object x), (x))
+
+   which macro-expands to this:
+
+     Lisp_Object (OP) (Lisp_Object x) { return lisp_h_OP (x); }
+
+   without worrying about the implementations diverging, since
+   lisp_h_OP defines the actual implementation.  The lisp_h_OP macros
+   are intended to be private to this include file, and should not be
+   used elsewhere.
+
+   FIXME: Remove the lisp_h_OP macros, and define just the inline OP
+   functions, once most developers have access to GCC 4.8 or later and
+   can use "gcc -Og" to debug.  Maybe in the year 2016.  See
+   Bug#11935.
+
+   Commentary for these macros can be found near their corresponding
+   functions, below.  */
+
+#if CHECK_LISP_OBJECT_TYPE
+# define lisp_h_XLI(o) ((o).i)
+# define lisp_h_XIL(i) ((Lisp_Object) { i })
+#else
+# define lisp_h_XLI(o) (o)
+# define lisp_h_XIL(i) (i)
+#endif
+#define lisp_h_CHECK_LIST_CONS(x, y) CHECK_TYPE (CONSP (x), Qlistp, y)
+#define lisp_h_CHECK_NUMBER(x) CHECK_TYPE (INTEGERP (x), Qintegerp, x)
+#define lisp_h_CHECK_SYMBOL(x) CHECK_TYPE (SYMBOLP (x), Qsymbolp, x)
+#define lisp_h_CHECK_TYPE(ok, predicate, x) \
+   ((ok) ? (void) 0 : (void) wrong_type_argument (predicate, x))
+#define lisp_h_CONSP(x) (XTYPE (x) == Lisp_Cons)
+#define lisp_h_EQ(x, y) (XLI (x) == XLI (y))
+#define lisp_h_FLOATP(x) (XTYPE (x) == Lisp_Float)
+#define lisp_h_INTEGERP(x) ((XTYPE (x) & (Lisp_Int0 | ~Lisp_Int1)) == 
Lisp_Int0)
+#define lisp_h_MARKERP(x) (MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Marker)
+#define lisp_h_MISCP(x) (XTYPE (x) == Lisp_Misc)
+#define lisp_h_NILP(x) EQ (x, Qnil)
+#define lisp_h_SET_SYMBOL_VAL(sym, v) \
+   (eassert ((sym)->redirect == SYMBOL_PLAINVAL), (sym)->val.value = (v))
+#define lisp_h_SYMBOL_CONSTANT_P(sym) (XSYMBOL (sym)->constant)
+#define lisp_h_SYMBOL_VAL(sym) \
+   (eassert ((sym)->redirect == SYMBOL_PLAINVAL), (sym)->val.value)
+#define lisp_h_SYMBOLP(x) (XTYPE (x) == Lisp_Symbol)
+#define lisp_h_VECTORLIKEP(x) (XTYPE (x) == Lisp_Vectorlike)
+#define lisp_h_XCAR(c) XCONS (c)->car
+#define lisp_h_XCDR(c) XCONS (c)->u.cdr
+#define lisp_h_XCONS(a) \
+   (eassert (CONSP (a)), (struct Lisp_Cons *) XUNTAG (a, Lisp_Cons))
+#define lisp_h_XHASH(a) XUINT (a)
+#define lisp_h_XPNTR(a) \
+   (SYMBOLP (a) ? XSYMBOL (a) : (void *) ((intptr_t) (XLI (a) & VALMASK)))
+#ifndef GC_CHECK_CONS_LIST
+# define lisp_h_check_cons_list() ((void) 0)
+#endif
+#if USE_LSB_TAG
+# define lisp_h_make_number(n) \
+    XIL ((EMACS_INT) (((EMACS_UINT) (n) << INTTYPEBITS) + Lisp_Int0))
+# define lisp_h_XFASTINT(a) XINT (a)
+# define lisp_h_XINT(a) (XLI (a) >> INTTYPEBITS)
+# define lisp_h_XSYMBOL(a) \
+    (eassert (SYMBOLP (a)), \
+     (struct Lisp_Symbol *) ((uintptr_t) XLI (a) - Lisp_Symbol \
+                            + (char *) lispsym))
+# define lisp_h_XTYPE(a) ((enum Lisp_Type) (XLI (a) & ~VALMASK))
+# define lisp_h_XUNTAG(a, type) ((void *) (intptr_t) (XLI (a) - (type)))
+#endif
+
+/* When compiling via gcc -O0, define the key operations as macros, as
+   Emacs is too slow otherwise.  To disable this optimization, compile
+   with -DINLINING=false.  */
+#if (defined __NO_INLINE__ \
+     && ! defined __OPTIMIZE__ && ! defined __OPTIMIZE_SIZE__ \
+     && ! (defined INLINING && ! INLINING))
+# define XLI(o) lisp_h_XLI (o)
+# define XIL(i) lisp_h_XIL (i)
+# define CHECK_LIST_CONS(x, y) lisp_h_CHECK_LIST_CONS (x, y)
+# define CHECK_NUMBER(x) lisp_h_CHECK_NUMBER (x)
+# define CHECK_SYMBOL(x) lisp_h_CHECK_SYMBOL (x)
+# define CHECK_TYPE(ok, predicate, x) lisp_h_CHECK_TYPE (ok, predicate, x)
+# define CONSP(x) lisp_h_CONSP (x)
+# define EQ(x, y) lisp_h_EQ (x, y)
+# define FLOATP(x) lisp_h_FLOATP (x)
+# define INTEGERP(x) lisp_h_INTEGERP (x)
+# define MARKERP(x) lisp_h_MARKERP (x)
+# define MISCP(x) lisp_h_MISCP (x)
+# define NILP(x) lisp_h_NILP (x)
+# define SET_SYMBOL_VAL(sym, v) lisp_h_SET_SYMBOL_VAL (sym, v)
+# define SYMBOL_CONSTANT_P(sym) lisp_h_SYMBOL_CONSTANT_P (sym)
+# define SYMBOL_VAL(sym) lisp_h_SYMBOL_VAL (sym)
+# define SYMBOLP(x) lisp_h_SYMBOLP (x)
+# define VECTORLIKEP(x) lisp_h_VECTORLIKEP (x)
+# define XCAR(c) lisp_h_XCAR (c)
+# define XCDR(c) lisp_h_XCDR (c)
+# define XCONS(a) lisp_h_XCONS (a)
+# define XHASH(a) lisp_h_XHASH (a)
+# define XPNTR(a) lisp_h_XPNTR (a)
+# ifndef GC_CHECK_CONS_LIST
+#  define check_cons_list() lisp_h_check_cons_list ()
+# endif
+# if USE_LSB_TAG
+#  define make_number(n) lisp_h_make_number (n)
+#  define XFASTINT(a) lisp_h_XFASTINT (a)
+#  define XINT(a) lisp_h_XINT (a)
+#  define XSYMBOL(a) lisp_h_XSYMBOL (a)
+#  define XTYPE(a) lisp_h_XTYPE (a)
+#  define XUNTAG(a, type) lisp_h_XUNTAG (a, type)
+# endif
+#endif
+
+/* Define NAME as a lisp.h inline function that returns TYPE and has
+   arguments declared as ARGDECLS and passed as ARGS.  ARGDECLS and
+   ARGS should be parenthesized.  Implement the function by calling
+   lisp_h_NAME ARGS.  */
+#define LISP_MACRO_DEFUN(name, type, argdecls, args) \
+  INLINE type (name) argdecls { return lisp_h_##name args; }
+
+/* like LISP_MACRO_DEFUN, except NAME returns void.  */
+#define LISP_MACRO_DEFUN_VOID(name, argdecls, args) \
+  INLINE void (name) argdecls { lisp_h_##name args; }
+
+
+/* Define the fundamental Lisp data structures.  */
+
+/* This is the set of Lisp data types.  If you want to define a new
+   data type, read the comments after Lisp_Fwd_Type definition
+   below.  */
+
+/* Lisp integers use 2 tags, to give them one extra bit, thus
+   extending their range from, e.g., -2^28..2^28-1 to -2^29..2^29-1.  */
+#define INTMASK (EMACS_INT_MAX >> (INTTYPEBITS - 1))
+#define case_Lisp_Int case Lisp_Int0: case Lisp_Int1
+
+/* Idea stolen from GDB.  Pedantic GCC complains about enum bitfields,
+   MSVC doesn't support them, and xlc and Oracle Studio c99 complain
+   vociferously about them.  */
+#if (defined __STRICT_ANSI__ || defined _MSC_VER || defined __IBMC__ \
+     || (defined __SUNPRO_C && __STDC__))
+#define ENUM_BF(TYPE) unsigned int
+#else
+#define ENUM_BF(TYPE) enum TYPE
+#endif
+
+
+enum Lisp_Type
+  {
+    /* Symbol.  XSYMBOL (object) points to a struct Lisp_Symbol.  */
+    Lisp_Symbol = 0,
+
+    /* Miscellaneous.  XMISC (object) points to a union Lisp_Misc,
+       whose first member indicates the subtype.  */
+    Lisp_Misc = 1,
+
+    /* Integer.  XINT (obj) is the integer value.  */
+    Lisp_Int0 = 2,
+    Lisp_Int1 = USE_LSB_TAG ? 6 : 3,
+
+    /* String.  XSTRING (object) points to a struct Lisp_String.
+       The length of the string, and its contents, are stored therein.  */
+    Lisp_String = 4,
+
+    /* Vector of Lisp objects, or something resembling it.
+       XVECTOR (object) points to a struct Lisp_Vector, which contains
+       the size and contents.  The size field also contains the type
+       information, if it's not a real vector object.  */
+    Lisp_Vectorlike = 5,
+
+    /* Cons.  XCONS (object) points to a struct Lisp_Cons.  */
+    Lisp_Cons = USE_LSB_TAG ? 3 : 6,
+
+    Lisp_Float = 7
+  };
+
+/* This is the set of data types that share a common structure.
+   The first member of the structure is a type code from this set.
+   The enum values are arbitrary, but we'll use large numbers to make it
+   more likely that we'll spot the error if a random word in memory is
+   mistakenly interpreted as a Lisp_Misc.  */
+enum Lisp_Misc_Type
+  {
+    Lisp_Misc_Free = 0x5eab,
+    Lisp_Misc_Marker,
+    Lisp_Misc_Overlay,
+    Lisp_Misc_Save_Value,
+    Lisp_Misc_Finalizer,
+    /* Currently floats are not a misc type,
+       but let's define this in case we want to change that.  */
+    Lisp_Misc_Float,
+    /* This is not a type code.  It is for range checking.  */
+    Lisp_Misc_Limit
+  };
+
+/* These are the types of forwarding objects used in the value slot
+   of symbols for special built-in variables whose value is stored in
+   C variables.  */
+enum Lisp_Fwd_Type
+  {
+    Lisp_Fwd_Int,              /* Fwd to a C `int' variable.  */
+    Lisp_Fwd_Bool,             /* Fwd to a C boolean var.  */
+    Lisp_Fwd_Obj,              /* Fwd to a C Lisp_Object variable.  */
+    Lisp_Fwd_Buffer_Obj,       /* Fwd to a Lisp_Object field of buffers.  */
+    Lisp_Fwd_Kboard_Obj                /* Fwd to a Lisp_Object field of 
kboards.  */
+  };
+
+/* If you want to define a new Lisp data type, here are some
+   instructions.  See the thread at
+   http://lists.gnu.org/archive/html/emacs-devel/2012-10/msg00561.html
+   for more info.
+
+   First, there are already a couple of Lisp types that can be used if
+   your new type does not need to be exposed to Lisp programs nor
+   displayed to users.  These are Lisp_Save_Value, a Lisp_Misc
+   subtype; and PVEC_OTHER, a kind of vectorlike object.  The former
+   is suitable for temporarily stashing away pointers and integers in
+   a Lisp object.  The latter is useful for vector-like Lisp objects
+   that need to be used as part of other objects, but which are never
+   shown to users or Lisp code (search for PVEC_OTHER in xterm.c for
+   an example).
+
+   These two types don't look pretty when printed, so they are
+   unsuitable for Lisp objects that can be exposed to users.
+
+   To define a new data type, add one more Lisp_Misc subtype or one
+   more pseudovector subtype.  Pseudovectors are more suitable for
+   objects with several slots that need to support fast random access,
+   while Lisp_Misc types are for everything else.  A pseudovector object
+   provides one or more slots for Lisp objects, followed by struct
+   members that are accessible only from C.  A Lisp_Misc object is a
+   wrapper for a C struct that can contain anything you like.
+
+   Explicit freeing is discouraged for Lisp objects in general.  But if
+   you really need to exploit this, use Lisp_Misc (check free_misc in
+   alloc.c to see why).  There is no way to free a vectorlike object.
+
+   To add a new pseudovector type, extend the pvec_type enumeration;
+   to add a new Lisp_Misc, extend the Lisp_Misc_Type enumeration.
+
+   For a Lisp_Misc, you will also need to add your entry to union
+   Lisp_Misc (but make sure the first word has the same structure as
+   the others, starting with a 16-bit member of the Lisp_Misc_Type
+   enumeration and a 1-bit GC markbit) and make sure the overall size
+   of the union is not increased by your addition.
+
+   For a new pseudovector, it's highly desirable to limit the size
+   of your data type by VBLOCK_BYTES_MAX bytes (defined in alloc.c).
+   Otherwise you will need to change sweep_vectors (also in alloc.c).
+
+   Then you will need to add switch branches in print.c (in
+   print_object, to print your object, and possibly also in
+   print_preprocess) and to alloc.c, to mark your object (in
+   mark_object) and to free it (in gc_sweep).  The latter is also the
+   right place to call any code specific to your data type that needs
+   to run when the object is recycled -- e.g., free any additional
+   resources allocated for it that are not Lisp objects.  You can even
+   make a pointer to the function that frees the resources a slot in
+   your object -- this way, the same object could be used to represent
+   several disparate C structures.  */
+
+#ifdef CHECK_LISP_OBJECT_TYPE
+
+typedef struct { EMACS_INT i; } Lisp_Object;
+
+#define LISP_INITIALLY(i) {i}
+
+#undef CHECK_LISP_OBJECT_TYPE
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE = true };
+#else /* CHECK_LISP_OBJECT_TYPE */
+
+/* If a struct type is not wanted, define Lisp_Object as just a number.  */
+
+typedef EMACS_INT Lisp_Object;
+#define LISP_INITIALLY(i) (i)
+enum CHECK_LISP_OBJECT_TYPE { CHECK_LISP_OBJECT_TYPE = false };
+#endif /* CHECK_LISP_OBJECT_TYPE */
+
+#define LISP_INITIALLY_ZERO LISP_INITIALLY (0)
+
+/* Forward declarations.  */
+
+/* Defined in this file.  */
+union Lisp_Fwd;
+INLINE bool BOOL_VECTOR_P (Lisp_Object);
+INLINE bool BUFFER_OBJFWDP (union Lisp_Fwd *);
+INLINE bool BUFFERP (Lisp_Object);
+INLINE bool CHAR_TABLE_P (Lisp_Object);
+INLINE Lisp_Object CHAR_TABLE_REF_ASCII (Lisp_Object, ptrdiff_t);
+INLINE bool (CONSP) (Lisp_Object);
+INLINE bool (FLOATP) (Lisp_Object);
+INLINE bool functionp (Lisp_Object);
+INLINE bool (INTEGERP) (Lisp_Object);
+INLINE bool (MARKERP) (Lisp_Object);
+INLINE bool (MISCP) (Lisp_Object);
+INLINE bool (NILP) (Lisp_Object);
+INLINE bool OVERLAYP (Lisp_Object);
+INLINE bool PROCESSP (Lisp_Object);
+INLINE bool PSEUDOVECTORP (Lisp_Object, int);
+INLINE bool SAVE_VALUEP (Lisp_Object);
+INLINE bool FINALIZERP (Lisp_Object);
+INLINE void set_sub_char_table_contents (Lisp_Object, ptrdiff_t,
+                                             Lisp_Object);
+INLINE bool STRINGP (Lisp_Object);
+INLINE bool SUB_CHAR_TABLE_P (Lisp_Object);
+INLINE bool SUBRP (Lisp_Object);
+INLINE bool (SYMBOLP) (Lisp_Object);
+INLINE bool (VECTORLIKEP) (Lisp_Object);
+INLINE bool WINDOWP (Lisp_Object);
+INLINE bool TERMINALP (Lisp_Object);
+INLINE struct Lisp_Save_Value *XSAVE_VALUE (Lisp_Object);
+INLINE struct Lisp_Finalizer *XFINALIZER (Lisp_Object);
+INLINE struct Lisp_Symbol *(XSYMBOL) (Lisp_Object);
+INLINE void *(XUNTAG) (Lisp_Object, int);
+
+/* Defined in chartab.c.  */
+extern Lisp_Object char_table_ref (Lisp_Object, int);
+extern void char_table_set (Lisp_Object, int, Lisp_Object);
+
+/* Defined in data.c.  */
+extern _Noreturn Lisp_Object wrong_type_argument (Lisp_Object, Lisp_Object);
+extern _Noreturn void wrong_choice (Lisp_Object, Lisp_Object);
+
+/* Defined in emacs.c.  */
+extern bool might_dump;
+/* True means Emacs has already been initialized.
+   Used during startup to detect startup of dumped Emacs.  */
+extern bool initialized;
+
+/* Defined in floatfns.c.  */
+extern double extract_float (Lisp_Object);
+
+
+/* Interned state of a symbol.  */
+
+enum symbol_interned
+{
+  SYMBOL_UNINTERNED = 0,
+  SYMBOL_INTERNED = 1,
+  SYMBOL_INTERNED_IN_INITIAL_OBARRAY = 2
+};
+
+enum symbol_redirect
+{
+  SYMBOL_PLAINVAL  = 4,
+  SYMBOL_VARALIAS  = 1,
+  SYMBOL_LOCALIZED = 2,
+  SYMBOL_FORWARDED = 3
+};
+
+struct Lisp_Symbol
+{
+  bool_bf gcmarkbit : 1;
+
+  /* Indicates where the value can be found:
+     0 : it's a plain var, the value is in the `value' field.
+     1 : it's a varalias, the value is really in the `alias' symbol.
+     2 : it's a localized var, the value is in the `blv' object.
+     3 : it's a forwarding variable, the value is in `forward'.  */
+  ENUM_BF (symbol_redirect) redirect : 3;
+
+  /* Non-zero means symbol is constant, i.e. changing its value
+     should signal an error.  If the value is 3, then the var
+     can be changed, but only by `defconst'.  */
+  unsigned constant : 2;
+
+  /* Interned state of the symbol.  This is an enumerator from
+     enum symbol_interned.  */
+  unsigned interned : 2;
+
+  /* True means that this variable has been explicitly declared
+     special (with `defvar' etc), and shouldn't be lexically bound.  */
+  bool_bf declared_special : 1;
+
+  /* True if pointed to from purespace and hence can't be GC'd.  */
+  bool_bf pinned : 1;
+
+  /* The symbol's name, as a Lisp string.  */
+  Lisp_Object name;
+
+  /* Value of the symbol or Qunbound if unbound.  Which alternative of the
+     union is used depends on the `redirect' field above.  */
+  union {
+    Lisp_Object value;
+    struct Lisp_Symbol *alias;
+    struct Lisp_Buffer_Local_Value *blv;
+    union Lisp_Fwd *fwd;
+  } val;
+
+  /* Function value of the symbol or Qnil if not fboundp.  */
+  Lisp_Object function;
+
+  /* The symbol's property list.  */
+  Lisp_Object plist;
+
+  /* Next symbol in obarray bucket, if the symbol is interned.  */
+  struct Lisp_Symbol *next;
+};
+
+/* Declare a Lisp-callable function.  The MAXARGS parameter has the same
+   meaning as in the DEFUN macro, and is used to construct a prototype.  */
+/* We can use the same trick as in the DEFUN macro to generate the
+   appropriate prototype.  */
+#define EXFUN(fnname, maxargs) \
+  extern Lisp_Object fnname DEFUN_ARGS_ ## maxargs
+
+/* Note that the weird token-substitution semantics of ANSI C makes
+   this work for MANY and UNEVALLED.  */
+#define DEFUN_ARGS_MANY                (ptrdiff_t, Lisp_Object *)
+#define DEFUN_ARGS_UNEVALLED   (Lisp_Object)
+#define DEFUN_ARGS_0   (void)
+#define DEFUN_ARGS_1   (Lisp_Object)
+#define DEFUN_ARGS_2   (Lisp_Object, Lisp_Object)
+#define DEFUN_ARGS_3   (Lisp_Object, Lisp_Object, Lisp_Object)
+#define DEFUN_ARGS_4   (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object)
+#define DEFUN_ARGS_5   (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, \
+                        Lisp_Object)
+#define DEFUN_ARGS_6   (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, \
+                        Lisp_Object, Lisp_Object)
+#define DEFUN_ARGS_7   (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, \
+                        Lisp_Object, Lisp_Object, Lisp_Object)
+#define DEFUN_ARGS_8   (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, \
+                        Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object)
+
+/* Yield an integer that contains TAG along with PTR.  */
+#define TAG_PTR(tag, ptr) \
+  ((USE_LSB_TAG ? (tag) : (EMACS_UINT) (tag) << VALBITS) + (uintptr_t) (ptr))
+
+/* Yield an integer that contains a symbol tag along with OFFSET.
+   OFFSET should be the offset in bytes from 'lispsym' to the symbol.  */
+#define TAG_SYMOFFSET(offset)                              \
+  TAG_PTR (Lisp_Symbol,                                            \
+          ((uintptr_t) (offset) >> (USE_LSB_TAG ? 0 : GCTYPEBITS)))
+
+/* XLI_BUILTIN_LISPSYM (iQwhatever) is equivalent to
+   XLI (builtin_lisp_symbol (Qwhatever)),
+   except the former expands to an integer constant expression.  */
+#define XLI_BUILTIN_LISPSYM(iname) TAG_SYMOFFSET ((iname) * sizeof *lispsym)
+
+/* Declare extern constants for Lisp symbols.  These can be helpful
+   when using a debugger like GDB, on older platforms where the debug
+   format does not represent C macros.  */
+#define DEFINE_LISP_SYMBOL(name) \
+  DEFINE_GDB_SYMBOL_BEGIN (Lisp_Object, name) \
+  DEFINE_GDB_SYMBOL_END (LISP_INITIALLY (XLI_BUILTIN_LISPSYM (i##name)))
+
+/* By default, define macros for Qt, etc., as this leads to a bit
+   better performance in the core Emacs interpreter.  A plugin can
+   define DEFINE_NON_NIL_Q_SYMBOL_MACROS to be false, to be portable to
+   other Emacs instances that assign different values to Qt, etc.  */
+#ifndef DEFINE_NON_NIL_Q_SYMBOL_MACROS
+# define DEFINE_NON_NIL_Q_SYMBOL_MACROS true
+#endif
+
+#include "globals.h"
+
+/* Convert a Lisp_Object to the corresponding EMACS_INT and vice versa.
+   At the machine level, these operations are no-ops.  */
+LISP_MACRO_DEFUN (XLI, EMACS_INT, (Lisp_Object o), (o))
+LISP_MACRO_DEFUN (XIL, Lisp_Object, (EMACS_INT i), (i))
+
+/* In the size word of a vector, this bit means the vector has been marked.  */
+
+DEFINE_GDB_SYMBOL_BEGIN (ptrdiff_t, ARRAY_MARK_FLAG)
+# define ARRAY_MARK_FLAG PTRDIFF_MIN
+DEFINE_GDB_SYMBOL_END (ARRAY_MARK_FLAG)
+
+/* In the size word of a struct Lisp_Vector, this bit means it's really
+   some other vector-like object.  */
+DEFINE_GDB_SYMBOL_BEGIN (ptrdiff_t, PSEUDOVECTOR_FLAG)
+# define PSEUDOVECTOR_FLAG (PTRDIFF_MAX - PTRDIFF_MAX / 2)
+DEFINE_GDB_SYMBOL_END (PSEUDOVECTOR_FLAG)
+
+/* In a pseudovector, the size field actually contains a word with one
+   PSEUDOVECTOR_FLAG bit set, and one of the following values extracted
+   with PVEC_TYPE_MASK to indicate the actual type.  */
+enum pvec_type
+{
+  PVEC_NORMAL_VECTOR,
+  PVEC_FREE,
+  PVEC_PROCESS,
+  PVEC_FRAME,
+  PVEC_WINDOW,
+  PVEC_BOOL_VECTOR,
+  PVEC_BUFFER,
+  PVEC_HASH_TABLE,
+  PVEC_TERMINAL,
+  PVEC_WINDOW_CONFIGURATION,
+  PVEC_SUBR,
+  PVEC_OTHER,
+  /* These should be last, check internal_equal to see why.  */
+  PVEC_COMPILED,
+  PVEC_CHAR_TABLE,
+  PVEC_SUB_CHAR_TABLE,
+  PVEC_FONT /* Should be last because it's used for range checking.  */
+};
+
+enum More_Lisp_Bits
+  {
+    /* For convenience, we also store the number of elements in these bits.
+       Note that this size is not necessarily the memory-footprint size, but
+       only the number of Lisp_Object fields (that need to be traced by GC).
+       The distinction is used, e.g., by Lisp_Process, which places extra
+       non-Lisp_Object fields at the end of the structure.  */
+    PSEUDOVECTOR_SIZE_BITS = 12,
+    PSEUDOVECTOR_SIZE_MASK = (1 << PSEUDOVECTOR_SIZE_BITS) - 1,
+
+    /* To calculate the memory footprint of the pseudovector, it's useful
+       to store the size of non-Lisp area in word_size units here.  */
+    PSEUDOVECTOR_REST_BITS = 12,
+    PSEUDOVECTOR_REST_MASK = (((1 << PSEUDOVECTOR_REST_BITS) - 1)
+                             << PSEUDOVECTOR_SIZE_BITS),
+
+    /* Used to extract pseudovector subtype information.  */
+    PSEUDOVECTOR_AREA_BITS = PSEUDOVECTOR_SIZE_BITS + PSEUDOVECTOR_REST_BITS,
+    PVEC_TYPE_MASK = 0x3f << PSEUDOVECTOR_AREA_BITS
+  };
+
+/* These functions extract various sorts of values from a Lisp_Object.
+   For example, if tem is a Lisp_Object whose type is Lisp_Cons,
+   XCONS (tem) is the struct Lisp_Cons * pointing to the memory for
+   that cons.  */
+
+/* Mask for the value (as opposed to the type bits) of a Lisp object.  */
+DEFINE_GDB_SYMBOL_BEGIN (EMACS_INT, VALMASK)
+# define VALMASK (USE_LSB_TAG ? - (1 << GCTYPEBITS) : VAL_MAX)
+DEFINE_GDB_SYMBOL_END (VALMASK)
+
+/* Largest and smallest representable fixnum values.  These are the C
+   values.  They are macros for use in static initializers.  */
+#define MOST_POSITIVE_FIXNUM (EMACS_INT_MAX >> INTTYPEBITS)
+#define MOST_NEGATIVE_FIXNUM (-1 - MOST_POSITIVE_FIXNUM)
+
+#if USE_LSB_TAG
+
+LISP_MACRO_DEFUN (make_number, Lisp_Object, (EMACS_INT n), (n))
+LISP_MACRO_DEFUN (XINT, EMACS_INT, (Lisp_Object a), (a))
+LISP_MACRO_DEFUN (XFASTINT, EMACS_INT, (Lisp_Object a), (a))
+LISP_MACRO_DEFUN (XSYMBOL, struct Lisp_Symbol *, (Lisp_Object a), (a))
+LISP_MACRO_DEFUN (XTYPE, enum Lisp_Type, (Lisp_Object a), (a))
+LISP_MACRO_DEFUN (XUNTAG, void *, (Lisp_Object a, int type), (a, type))
+
+#else /* ! USE_LSB_TAG */
+
+/* Although compiled only if ! USE_LSB_TAG, the following functions
+   also work when USE_LSB_TAG; this is to aid future maintenance when
+   the lisp_h_* macros are eventually removed.  */
+
+/* Make a Lisp integer representing the value of the low order
+   bits of N.  */
+INLINE Lisp_Object
+make_number (EMACS_INT n)
+{
+  EMACS_INT int0 = Lisp_Int0;
+  if (USE_LSB_TAG)
+    {
+      EMACS_UINT u = n;
+      n = u << INTTYPEBITS;
+      n += int0;
+    }
+  else
+    {
+      n &= INTMASK;
+      n += (int0 << VALBITS);
+    }
+  return XIL (n);
+}
+
+/* Extract A's value as a signed integer.  */
+INLINE EMACS_INT
+XINT (Lisp_Object a)
+{
+  EMACS_INT i = XLI (a);
+  if (! USE_LSB_TAG)
+    {
+      EMACS_UINT u = i;
+      i = u << INTTYPEBITS;
+    }
+  return i >> INTTYPEBITS;
+}
+
+/* Like XINT (A), but may be faster.  A must be nonnegative.
+   If ! USE_LSB_TAG, this takes advantage of the fact that Lisp
+   integers have zero-bits in their tags.  */
+INLINE EMACS_INT
+XFASTINT (Lisp_Object a)
+{
+  EMACS_INT int0 = Lisp_Int0;
+  EMACS_INT n = USE_LSB_TAG ? XINT (a) : XLI (a) - (int0 << VALBITS);
+  eassert (0 <= n);
+  return n;
+}
+
+/* Extract A's value as a symbol.  */
+INLINE struct Lisp_Symbol *
+XSYMBOL (Lisp_Object a)
+{
+  uintptr_t i = (uintptr_t) XUNTAG (a, Lisp_Symbol);
+  if (! USE_LSB_TAG)
+    i <<= GCTYPEBITS;
+  void *p = (char *) lispsym + i;
+  return p;
+}
+
+/* Extract A's type.  */
+INLINE enum Lisp_Type
+XTYPE (Lisp_Object a)
+{
+  EMACS_UINT i = XLI (a);
+  return USE_LSB_TAG ? i & ~VALMASK : i >> VALBITS;
+}
+
+/* Extract A's pointer value, assuming A's type is TYPE.  */
+INLINE void *
+XUNTAG (Lisp_Object a, int type)
+{
+  intptr_t i = USE_LSB_TAG ? XLI (a) - type : XLI (a) & VALMASK;
+  return (void *) i;
+}
+
+#endif /* ! USE_LSB_TAG */
+
+/* Extract the pointer hidden within A.  */
+LISP_MACRO_DEFUN (XPNTR, void *, (Lisp_Object a), (a))
+
+/* Extract A's value as an unsigned integer.  */
+INLINE EMACS_UINT
+XUINT (Lisp_Object a)
+{
+  EMACS_UINT i = XLI (a);
+  return USE_LSB_TAG ? i >> INTTYPEBITS : i & INTMASK;
+}
+
+/* Return A's (Lisp-integer sized) hash.  Happens to be like XUINT
+   right now, but XUINT should only be applied to objects we know are
+   integers.  */
+LISP_MACRO_DEFUN (XHASH, EMACS_INT, (Lisp_Object a), (a))
+
+/* Like make_number (N), but may be faster.  N must be in nonnegative range.  
*/
+INLINE Lisp_Object
+make_natnum (EMACS_INT n)
+{
+  eassert (0 <= n && n <= MOST_POSITIVE_FIXNUM);
+  EMACS_INT int0 = Lisp_Int0;
+  return USE_LSB_TAG ? make_number (n) : XIL (n + (int0 << VALBITS));
+}
+
+/* Return true if X and Y are the same object.  */
+LISP_MACRO_DEFUN (EQ, bool, (Lisp_Object x, Lisp_Object y), (x, y))
+
+/* Value is true if I doesn't fit into a Lisp fixnum.  It is
+   written this way so that it also works if I is of unsigned
+   type or if I is a NaN.  */
+
+#define FIXNUM_OVERFLOW_P(i) \
+  (! ((0 <= (i) || MOST_NEGATIVE_FIXNUM <= (i)) && (i) <= 
MOST_POSITIVE_FIXNUM))
+
+INLINE ptrdiff_t
+clip_to_bounds (ptrdiff_t lower, EMACS_INT num, ptrdiff_t upper)
+{
+  return num < lower ? lower : num <= upper ? num : upper;
+}
+
+
+/* Extract a value or address from a Lisp_Object.  */
+
+LISP_MACRO_DEFUN (XCONS, struct Lisp_Cons *, (Lisp_Object a), (a))
+
+INLINE struct Lisp_Vector *
+XVECTOR (Lisp_Object a)
+{
+  eassert (VECTORLIKEP (a));
+  return XUNTAG (a, Lisp_Vectorlike);
+}
+
+INLINE struct Lisp_String *
+XSTRING (Lisp_Object a)
+{
+  eassert (STRINGP (a));
+  return XUNTAG (a, Lisp_String);
+}
+
+/* The index of the C-defined Lisp symbol SYM.
+   This can be used in a static initializer.  */
+#define SYMBOL_INDEX(sym) i##sym
+
+INLINE struct Lisp_Float *
+XFLOAT (Lisp_Object a)
+{
+  eassert (FLOATP (a));
+  return XUNTAG (a, Lisp_Float);
+}
+
+/* Pseudovector types.  */
+
+INLINE struct Lisp_Process *
+XPROCESS (Lisp_Object a)
+{
+  eassert (PROCESSP (a));
+  return XUNTAG (a, Lisp_Vectorlike);
+}
+
+INLINE struct window *
+XWINDOW (Lisp_Object a)
+{
+  eassert (WINDOWP (a));
+  return XUNTAG (a, Lisp_Vectorlike);
+}
+
+INLINE struct terminal *
+XTERMINAL (Lisp_Object a)
+{
+  eassert (TERMINALP (a));
+  return XUNTAG (a, Lisp_Vectorlike);
+}
+
+INLINE struct Lisp_Subr *
+XSUBR (Lisp_Object a)
+{
+  eassert (SUBRP (a));
+  return XUNTAG (a, Lisp_Vectorlike);
+}
+
+INLINE struct buffer *
+XBUFFER (Lisp_Object a)
+{
+  eassert (BUFFERP (a));
+  return XUNTAG (a, Lisp_Vectorlike);
+}
+
+INLINE struct Lisp_Char_Table *
+XCHAR_TABLE (Lisp_Object a)
+{
+  eassert (CHAR_TABLE_P (a));
+  return XUNTAG (a, Lisp_Vectorlike);
+}
+
+INLINE struct Lisp_Sub_Char_Table *
+XSUB_CHAR_TABLE (Lisp_Object a)
+{
+  eassert (SUB_CHAR_TABLE_P (a));
+  return XUNTAG (a, Lisp_Vectorlike);
+}
+
+INLINE struct Lisp_Bool_Vector *
+XBOOL_VECTOR (Lisp_Object a)
+{
+  eassert (BOOL_VECTOR_P (a));
+  return XUNTAG (a, Lisp_Vectorlike);
+}
+
+/* Construct a Lisp_Object from a value or address.  */
+
+INLINE Lisp_Object
+make_lisp_ptr (void *ptr, enum Lisp_Type type)
+{
+  Lisp_Object a = XIL (TAG_PTR (type, ptr));
+  eassert (XTYPE (a) == type && XUNTAG (a, type) == ptr);
+  return a;
+}
+
+INLINE Lisp_Object
+make_lisp_symbol (struct Lisp_Symbol *sym)
+{
+  Lisp_Object a = XIL (TAG_SYMOFFSET ((char *) sym - (char *) lispsym));
+  eassert (XSYMBOL (a) == sym);
+  return a;
+}
+
+INLINE Lisp_Object
+builtin_lisp_symbol (int index)
+{
+  return make_lisp_symbol (lispsym + index);
+}
+
+#define XSETINT(a, b) ((a) = make_number (b))
+#define XSETFASTINT(a, b) ((a) = make_natnum (b))
+#define XSETCONS(a, b) ((a) = make_lisp_ptr (b, Lisp_Cons))
+#define XSETVECTOR(a, b) ((a) = make_lisp_ptr (b, Lisp_Vectorlike))
+#define XSETSTRING(a, b) ((a) = make_lisp_ptr (b, Lisp_String))
+#define XSETSYMBOL(a, b) ((a) = make_lisp_symbol (b))
+#define XSETFLOAT(a, b) ((a) = make_lisp_ptr (b, Lisp_Float))
+#define XSETMISC(a, b) ((a) = make_lisp_ptr (b, Lisp_Misc))
+
+/* Pseudovector types.  */
+
+#define XSETPVECTYPE(v, code)                                          \
+  ((v)->header.size |= PSEUDOVECTOR_FLAG | ((code) << PSEUDOVECTOR_AREA_BITS))
+#define XSETPVECTYPESIZE(v, code, lispsize, restsize)          \
+  ((v)->header.size = (PSEUDOVECTOR_FLAG                       \
+                      | ((code) << PSEUDOVECTOR_AREA_BITS)     \
+                      | ((restsize) << PSEUDOVECTOR_SIZE_BITS) \
+                      | (lispsize)))
+
+/* The cast to struct vectorlike_header * avoids aliasing issues.  */
+#define XSETPSEUDOVECTOR(a, b, code) \
+  XSETTYPED_PSEUDOVECTOR (a, b,                                        \
+                         (((struct vectorlike_header *)        \
+                           XUNTAG (a, Lisp_Vectorlike))        \
+                          ->size),                             \
+                         code)
+#define XSETTYPED_PSEUDOVECTOR(a, b, size, code)                       \
+  (XSETVECTOR (a, b),                                                  \
+   eassert ((size & (PSEUDOVECTOR_FLAG | PVEC_TYPE_MASK))              \
+           == (PSEUDOVECTOR_FLAG | (code << PSEUDOVECTOR_AREA_BITS))))
+
+#define XSETWINDOW_CONFIGURATION(a, b) \
+  (XSETPSEUDOVECTOR (a, b, PVEC_WINDOW_CONFIGURATION))
+#define XSETPROCESS(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_PROCESS))
+#define XSETWINDOW(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_WINDOW))
+#define XSETTERMINAL(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_TERMINAL))
+#define XSETSUBR(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_SUBR))
+#define XSETCOMPILED(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_COMPILED))
+#define XSETBUFFER(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_BUFFER))
+#define XSETCHAR_TABLE(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_CHAR_TABLE))
+#define XSETBOOL_VECTOR(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_BOOL_VECTOR))
+#define XSETSUB_CHAR_TABLE(a, b) (XSETPSEUDOVECTOR (a, b, PVEC_SUB_CHAR_TABLE))
+
+/* Efficiently convert a pointer to a Lisp object and back.  The
+   pointer is represented as a Lisp integer, so the garbage collector
+   does not know about it.  The pointer should not have both Lisp_Int1
+   bits set, which makes this conversion inherently unportable.  */
+
+INLINE void *
+XINTPTR (Lisp_Object a)
+{
+  return XUNTAG (a, Lisp_Int0);
+}
+
+INLINE Lisp_Object
+make_pointer_integer (void *p)
+{
+  Lisp_Object a = XIL (TAG_PTR (Lisp_Int0, p));
+  eassert (INTEGERP (a) && XINTPTR (a) == p);
+  return a;
+}
+
+/* Type checking.  */
+
+LISP_MACRO_DEFUN_VOID (CHECK_TYPE,
+                      (int ok, Lisp_Object predicate, Lisp_Object x),
+                      (ok, predicate, x))
+
+/* See the macros in intervals.h.  */
+
+typedef struct interval *INTERVAL;
+
+struct GCALIGNED Lisp_Cons
+  {
+    /* Car of this cons cell.  */
+    Lisp_Object car;
+
+    union
+    {
+      /* Cdr of this cons cell.  */
+      Lisp_Object cdr;
+
+      /* Used to chain conses on a free list.  */
+      struct Lisp_Cons *chain;
+    } u;
+  };
+
+/* Take the car or cdr of something known to be a cons cell.  */
+/* The _addr functions shouldn't be used outside of the minimal set
+   of code that has to know what a cons cell looks like.  Other code not
+   part of the basic lisp implementation should assume that the car and cdr
+   fields are not accessible.  (What if we want to switch to
+   a copying collector someday?  Cached cons cell field addresses may be
+   invalidated at arbitrary points.)  */
+INLINE Lisp_Object *
+xcar_addr (Lisp_Object c)
+{
+  return &XCONS (c)->car;
+}
+INLINE Lisp_Object *
+xcdr_addr (Lisp_Object c)
+{
+  return &XCONS (c)->u.cdr;
+}
+
+/* Use these from normal code.  */
+LISP_MACRO_DEFUN (XCAR, Lisp_Object, (Lisp_Object c), (c))
+LISP_MACRO_DEFUN (XCDR, Lisp_Object, (Lisp_Object c), (c))
+
+/* Use these to set the fields of a cons cell.
+
+   Note that both arguments may refer to the same object, so 'n'
+   should not be read after 'c' is first modified.  */
+INLINE void
+XSETCAR (Lisp_Object c, Lisp_Object n)
+{
+  *xcar_addr (c) = n;
+}
+INLINE void
+XSETCDR (Lisp_Object c, Lisp_Object n)
+{
+  *xcdr_addr (c) = n;
+}
+
+/* Take the car or cdr of something whose type is not known.  */
+INLINE Lisp_Object
+CAR (Lisp_Object c)
+{
+  return (CONSP (c) ? XCAR (c)
+         : NILP (c) ? Qnil
+         : wrong_type_argument (Qlistp, c));
+}
+INLINE Lisp_Object
+CDR (Lisp_Object c)
+{
+  return (CONSP (c) ? XCDR (c)
+         : NILP (c) ? Qnil
+         : wrong_type_argument (Qlistp, c));
+}
+
+/* Take the car or cdr of something whose type is not known.  */
+INLINE Lisp_Object
+CAR_SAFE (Lisp_Object c)
+{
+  return CONSP (c) ? XCAR (c) : Qnil;
+}
+INLINE Lisp_Object
+CDR_SAFE (Lisp_Object c)
+{
+  return CONSP (c) ? XCDR (c) : Qnil;
+}
+
+/* In a string or vector, the sign bit of the `size' is the gc mark bit.  */
+
+struct GCALIGNED Lisp_String
+  {
+    ptrdiff_t size;
+    ptrdiff_t size_byte;
+    INTERVAL intervals;                /* Text properties in this string.  */
+    unsigned char *data;
+  };
+
+/* True if STR is a multibyte string.  */
+INLINE bool
+STRING_MULTIBYTE (Lisp_Object str)
+{
+  return 0 <= XSTRING (str)->size_byte;
+}
+
+/* An upper bound on the number of bytes in a Lisp string, not
+   counting the terminating null.  This a tight enough bound to
+   prevent integer overflow errors that would otherwise occur during
+   string size calculations.  A string cannot contain more bytes than
+   a fixnum can represent, nor can it be so long that C pointer
+   arithmetic stops working on the string plus its terminating null.
+   Although the actual size limit (see STRING_BYTES_MAX in alloc.c)
+   may be a bit smaller than STRING_BYTES_BOUND, calculating it here
+   would expose alloc.c internal details that we'd rather keep
+   private.
+
+   This is a macro for use in static initializers.  The cast to
+   ptrdiff_t ensures that the macro is signed.  */
+#define STRING_BYTES_BOUND  \
+  ((ptrdiff_t) min (MOST_POSITIVE_FIXNUM, min (SIZE_MAX, PTRDIFF_MAX) - 1))
+
+/* Mark STR as a unibyte string.  */
+#define STRING_SET_UNIBYTE(STR)                                \
+  do {                                                 \
+    if (EQ (STR, empty_multibyte_string))              \
+      (STR) = empty_unibyte_string;                    \
+    else                                               \
+      XSTRING (STR)->size_byte = -1;                   \
+  } while (false)
+
+/* Mark STR as a multibyte string.  Assure that STR contains only
+   ASCII characters in advance.  */
+#define STRING_SET_MULTIBYTE(STR)                      \
+  do {                                                 \
+    if (EQ (STR, empty_unibyte_string))                        \
+      (STR) = empty_multibyte_string;                  \
+    else                                               \
+      XSTRING (STR)->size_byte = XSTRING (STR)->size;  \
+  } while (false)
+
+/* Convenience functions for dealing with Lisp strings.  */
+
+INLINE unsigned char *
+SDATA (Lisp_Object string)
+{
+  return XSTRING (string)->data;
+}
+INLINE char *
+SSDATA (Lisp_Object string)
+{
+  /* Avoid "differ in sign" warnings.  */
+  return (char *) SDATA (string);
+}
+INLINE unsigned char
+SREF (Lisp_Object string, ptrdiff_t index)
+{
+  return SDATA (string)[index];
+}
+INLINE void
+SSET (Lisp_Object string, ptrdiff_t index, unsigned char new)
+{
+  SDATA (string)[index] = new;
+}
+INLINE ptrdiff_t
+SCHARS (Lisp_Object string)
+{
+  return XSTRING (string)->size;
+}
+
+#ifdef GC_CHECK_STRING_BYTES
+extern ptrdiff_t string_bytes (struct Lisp_String *);
+#endif
+INLINE ptrdiff_t
+STRING_BYTES (struct Lisp_String *s)
+{
+#ifdef GC_CHECK_STRING_BYTES
+  return string_bytes (s);
+#else
+  return s->size_byte < 0 ? s->size : s->size_byte;
+#endif
+}
+
+INLINE ptrdiff_t
+SBYTES (Lisp_Object string)
+{
+  return STRING_BYTES (XSTRING (string));
+}
+INLINE void
+STRING_SET_CHARS (Lisp_Object string, ptrdiff_t newsize)
+{
+  XSTRING (string)->size = newsize;
+}
+
+/* Header of vector-like objects.  This documents the layout constraints on
+   vectors and pseudovectors (objects of PVEC_xxx subtype).  It also prevents
+   compilers from being fooled by Emacs's type punning: XSETPSEUDOVECTOR
+   and PSEUDOVECTORP cast their pointers to struct vectorlike_header *,
+   because when two such pointers potentially alias, a compiler won't
+   incorrectly reorder loads and stores to their size fields.  See
+   Bug#8546.  */
+struct vectorlike_header
+  {
+    /* The only field contains various pieces of information:
+       - The MSB (ARRAY_MARK_FLAG) holds the gcmarkbit.
+       - The next bit (PSEUDOVECTOR_FLAG) indicates whether this is a plain
+         vector (0) or a pseudovector (1).
+       - If PSEUDOVECTOR_FLAG is 0, the rest holds the size (number
+         of slots) of the vector.
+       - If PSEUDOVECTOR_FLAG is 1, the rest is subdivided into three fields:
+        - a) pseudovector subtype held in PVEC_TYPE_MASK field;
+        - b) number of Lisp_Objects slots at the beginning of the object
+          held in PSEUDOVECTOR_SIZE_MASK field.  These objects are always
+          traced by the GC;
+        - c) size of the rest fields held in PSEUDOVECTOR_REST_MASK and
+          measured in word_size units.  Rest fields may also include
+          Lisp_Objects, but these objects usually needs some special treatment
+          during GC.
+        There are some exceptions.  For PVEC_FREE, b) is always zero.  For
+        PVEC_BOOL_VECTOR and PVEC_SUBR, both b) and c) are always zero.
+        Current layout limits the pseudovectors to 63 PVEC_xxx subtypes,
+        4095 Lisp_Objects in GC-ed area and 4095 word-sized other slots.  */
+    ptrdiff_t size;
+  };
+
+/* A regular vector is just a header plus an array of Lisp_Objects.  */
+
+struct Lisp_Vector
+  {
+    struct vectorlike_header header;
+    Lisp_Object contents[FLEXIBLE_ARRAY_MEMBER];
+  };
+
+/* C11 prohibits alignof (struct Lisp_Vector), so compute it manually.  */
+enum
+  {
+    ALIGNOF_STRUCT_LISP_VECTOR
+      = alignof (union { struct vectorlike_header a; Lisp_Object b; })
+  };
+
+/* A boolvector is a kind of vectorlike, with contents like a string.  */
+
+struct Lisp_Bool_Vector
+  {
+    /* HEADER.SIZE is the vector's size field.  It doesn't have the real size,
+       just the subtype information.  */
+    struct vectorlike_header header;
+    /* This is the size in bits.  */
+    EMACS_INT size;
+    /* The actual bits, packed into bytes.
+       Zeros fill out the last word if needed.
+       The bits are in little-endian order in the bytes, and
+       the bytes are in little-endian order in the words.  */
+    bits_word data[FLEXIBLE_ARRAY_MEMBER];
+  };
+
+INLINE EMACS_INT
+bool_vector_size (Lisp_Object a)
+{
+  EMACS_INT size = XBOOL_VECTOR (a)->size;
+  eassume (0 <= size);
+  return size;
+}
+
+INLINE bits_word *
+bool_vector_data (Lisp_Object a)
+{
+  return XBOOL_VECTOR (a)->data;
+}
+
+INLINE unsigned char *
+bool_vector_uchar_data (Lisp_Object a)
+{
+  return (unsigned char *) bool_vector_data (a);
+}
+
+/* The number of data words and bytes in a bool vector with SIZE bits.  */
+
+INLINE EMACS_INT
+bool_vector_words (EMACS_INT size)
+{
+  eassume (0 <= size && size <= EMACS_INT_MAX - (BITS_PER_BITS_WORD - 1));
+  return (size + BITS_PER_BITS_WORD - 1) / BITS_PER_BITS_WORD;
+}
+
+INLINE EMACS_INT
+bool_vector_bytes (EMACS_INT size)
+{
+  eassume (0 <= size && size <= EMACS_INT_MAX - (BITS_PER_BITS_WORD - 1));
+  return (size + BOOL_VECTOR_BITS_PER_CHAR - 1) / BOOL_VECTOR_BITS_PER_CHAR;
+}
+
+/* True if A's Ith bit is set.  */
+
+INLINE bool
+bool_vector_bitref (Lisp_Object a, EMACS_INT i)
+{
+  eassume (0 <= i && i < bool_vector_size (a));
+  return !! (bool_vector_uchar_data (a)[i / BOOL_VECTOR_BITS_PER_CHAR]
+            & (1 << (i % BOOL_VECTOR_BITS_PER_CHAR)));
+}
+
+INLINE Lisp_Object
+bool_vector_ref (Lisp_Object a, EMACS_INT i)
+{
+  return bool_vector_bitref (a, i) ? Qt : Qnil;
+}
+
+/* Set A's Ith bit to B.  */
+
+INLINE void
+bool_vector_set (Lisp_Object a, EMACS_INT i, bool b)
+{
+  unsigned char *addr;
+
+  eassume (0 <= i && i < bool_vector_size (a));
+  addr = &bool_vector_uchar_data (a)[i / BOOL_VECTOR_BITS_PER_CHAR];
+
+  if (b)
+    *addr |= 1 << (i % BOOL_VECTOR_BITS_PER_CHAR);
+  else
+    *addr &= ~ (1 << (i % BOOL_VECTOR_BITS_PER_CHAR));
+}
+
+/* Some handy constants for calculating sizes
+   and offsets, mostly of vectorlike objects.   */
+
+enum
+  {
+    header_size = offsetof (struct Lisp_Vector, contents),
+    bool_header_size = offsetof (struct Lisp_Bool_Vector, data),
+    word_size = sizeof (Lisp_Object)
+  };
+
+/* Conveniences for dealing with Lisp arrays.  */
+
+INLINE Lisp_Object
+AREF (Lisp_Object array, ptrdiff_t idx)
+{
+  return XVECTOR (array)->contents[idx];
+}
+
+INLINE Lisp_Object *
+aref_addr (Lisp_Object array, ptrdiff_t idx)
+{
+  return & XVECTOR (array)->contents[idx];
+}
+
+INLINE ptrdiff_t
+ASIZE (Lisp_Object array)
+{
+  return XVECTOR (array)->header.size;
+}
+
+INLINE void
+ASET (Lisp_Object array, ptrdiff_t idx, Lisp_Object val)
+{
+  eassert (0 <= idx && idx < ASIZE (array));
+  XVECTOR (array)->contents[idx] = val;
+}
+
+INLINE void
+gc_aset (Lisp_Object array, ptrdiff_t idx, Lisp_Object val)
+{
+  /* Like ASET, but also can be used in the garbage collector:
+     sweep_weak_table calls set_hash_key etc. while the table is marked.  */
+  eassert (0 <= idx && idx < (ASIZE (array) & ~ARRAY_MARK_FLAG));
+  XVECTOR (array)->contents[idx] = val;
+}
+
+/* True, since Qnil's representation is zero.  Every place in the code
+   that assumes Qnil is zero should verify (NIL_IS_ZERO), to make it easy
+   to find such assumptions later if we change Qnil to be nonzero.  */
+enum { NIL_IS_ZERO = XLI_BUILTIN_LISPSYM (iQnil) == 0 };
+
+/* Clear the object addressed by P, with size NBYTES, so that all its
+   bytes are zero and all its Lisp values are nil.  */
+INLINE void
+memclear (void *p, ptrdiff_t nbytes)
+{
+  eassert (0 <= nbytes);
+  verify (NIL_IS_ZERO);
+  /* Since Qnil is zero, memset suffices.  */
+  memset (p, 0, nbytes);
+}
+
+/* If a struct is made to look like a vector, this macro returns the length
+   of the shortest vector that would hold that struct.  */
+
+#define VECSIZE(type)                                          \
+  ((sizeof (type) - header_size + word_size - 1) / word_size)
+
+/* Like VECSIZE, but used when the pseudo-vector has non-Lisp_Object fields
+   at the end and we need to compute the number of Lisp_Object fields (the
+   ones that the GC needs to trace).  */
+
+#define PSEUDOVECSIZE(type, nonlispfield)                      \
+  ((offsetof (type, nonlispfield) - header_size) / word_size)
+
+/* Compute A OP B, using the unsigned comparison operator OP.  A and B
+   should be integer expressions.  This is not the same as
+   mathematical comparison; for example, UNSIGNED_CMP (0, <, -1)
+   returns true.  For efficiency, prefer plain unsigned comparison if A
+   and B's sizes both fit (after integer promotion).  */
+#define UNSIGNED_CMP(a, op, b)                                         \
+  (max (sizeof ((a) + 0), sizeof ((b) + 0)) <= sizeof (unsigned)       \
+   ? ((a) + (unsigned) 0) op ((b) + (unsigned) 0)                      \
+   : ((a) + (uintmax_t) 0) op ((b) + (uintmax_t) 0))
+
+/* True iff C is an ASCII character.  */
+#define ASCII_CHAR_P(c) UNSIGNED_CMP (c, <, 0x80)
+
+/* A char-table is a kind of vectorlike, with contents are like a
+   vector but with a few other slots.  For some purposes, it makes
+   sense to handle a char-table with type struct Lisp_Vector.  An
+   element of a char table can be any Lisp objects, but if it is a sub
+   char-table, we treat it a table that contains information of a
+   specific range of characters.  A sub char-table is like a vector but
+   with two integer fields between the header and Lisp data, which means
+   that it has to be marked with some precautions (see mark_char_table
+   in alloc.c).  A sub char-table appears only in an element of a char-table,
+   and there's no way to access it directly from Emacs Lisp program.  */
+
+enum CHARTAB_SIZE_BITS
+  {
+    CHARTAB_SIZE_BITS_0 = 6,
+    CHARTAB_SIZE_BITS_1 = 4,
+    CHARTAB_SIZE_BITS_2 = 5,
+    CHARTAB_SIZE_BITS_3 = 7
+  };
+
+extern const int chartab_size[4];
+
+struct Lisp_Char_Table
+  {
+    /* HEADER.SIZE is the vector's size field, which also holds the
+       pseudovector type information.  It holds the size, too.
+       The size counts the defalt, parent, purpose, ascii,
+       contents, and extras slots.  */
+    struct vectorlike_header header;
+
+    /* This holds a default value,
+       which is used whenever the value for a specific character is nil.  */
+    Lisp_Object defalt;
+
+    /* This points to another char table, which we inherit from when the
+       value for a specific character is nil.  The `defalt' slot takes
+       precedence over this.  */
+    Lisp_Object parent;
+
+    /* This is a symbol which says what kind of use this char-table is
+       meant for.  */
+    Lisp_Object purpose;
+
+    /* The bottom sub char-table for characters of the range 0..127.  It
+       is nil if none of ASCII character has a specific value.  */
+    Lisp_Object ascii;
+
+    Lisp_Object contents[(1 << CHARTAB_SIZE_BITS_0)];
+
+    /* These hold additional data.  It is a vector.  */
+    Lisp_Object extras[FLEXIBLE_ARRAY_MEMBER];
+  };
+
+struct Lisp_Sub_Char_Table
+  {
+    /* HEADER.SIZE is the vector's size field, which also holds the
+       pseudovector type information.  It holds the size, too.  */
+    struct vectorlike_header header;
+
+    /* Depth of this sub char-table.  It should be 1, 2, or 3.  A sub
+       char-table of depth 1 contains 16 elements, and each element
+       covers 4096 (128*32) characters.  A sub char-table of depth 2
+       contains 32 elements, and each element covers 128 characters.  A
+       sub char-table of depth 3 contains 128 elements, and each element
+       is for one character.  */
+    int depth;
+
+    /* Minimum character covered by the sub char-table.  */
+    int min_char;
+
+    /* Use set_sub_char_table_contents to set this.  */
+    Lisp_Object contents[FLEXIBLE_ARRAY_MEMBER];
+  };
+
+INLINE Lisp_Object
+CHAR_TABLE_REF_ASCII (Lisp_Object ct, ptrdiff_t idx)
+{
+  struct Lisp_Char_Table *tbl = NULL;
+  Lisp_Object val;
+  do
+    {
+      tbl = tbl ? XCHAR_TABLE (tbl->parent) : XCHAR_TABLE (ct);
+      val = (! SUB_CHAR_TABLE_P (tbl->ascii) ? tbl->ascii
+            : XSUB_CHAR_TABLE (tbl->ascii)->contents[idx]);
+      if (NILP (val))
+       val = tbl->defalt;
+    }
+  while (NILP (val) && ! NILP (tbl->parent));
+
+  return val;
+}
+
+/* Almost equivalent to Faref (CT, IDX) with optimization for ASCII
+   characters.  Do not check validity of CT.  */
+INLINE Lisp_Object
+CHAR_TABLE_REF (Lisp_Object ct, int idx)
+{
+  return (ASCII_CHAR_P (idx)
+         ? CHAR_TABLE_REF_ASCII (ct, idx)
+         : char_table_ref (ct, idx));
+}
+
+/* Equivalent to Faset (CT, IDX, VAL) with optimization for ASCII and
+   8-bit European characters.  Do not check validity of CT.  */
+INLINE void
+CHAR_TABLE_SET (Lisp_Object ct, int idx, Lisp_Object val)
+{
+  if (ASCII_CHAR_P (idx) && SUB_CHAR_TABLE_P (XCHAR_TABLE (ct)->ascii))
+    set_sub_char_table_contents (XCHAR_TABLE (ct)->ascii, idx, val);
+  else
+    char_table_set (ct, idx, val);
+}
+
+/* This structure describes a built-in function.
+   It is generated by the DEFUN macro only.
+   defsubr makes it into a Lisp object.  */
+
+struct Lisp_Subr
+  {
+    struct vectorlike_header header;
+    union {
+      Lisp_Object (*a0) (void);
+      Lisp_Object (*a1) (Lisp_Object);
+      Lisp_Object (*a2) (Lisp_Object, Lisp_Object);
+      Lisp_Object (*a3) (Lisp_Object, Lisp_Object, Lisp_Object);
+      Lisp_Object (*a4) (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
+      Lisp_Object (*a5) (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, 
Lisp_Object);
+      Lisp_Object (*a6) (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, 
Lisp_Object, Lisp_Object);
+      Lisp_Object (*a7) (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, 
Lisp_Object, Lisp_Object, Lisp_Object);
+      Lisp_Object (*a8) (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, 
Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
+      Lisp_Object (*aUNEVALLED) (Lisp_Object args);
+      Lisp_Object (*aMANY) (ptrdiff_t, Lisp_Object *);
+    } function;
+    short min_args, max_args;
+    const char *symbol_name;
+    const char *intspec;
+    const char *doc;
+  };
+
+enum char_table_specials
+  {
+    /* This is the number of slots that every char table must have.  This
+       counts the ordinary slots and the top, defalt, parent, and purpose
+       slots.  */
+    CHAR_TABLE_STANDARD_SLOTS = PSEUDOVECSIZE (struct Lisp_Char_Table, extras),
+
+    /* This is an index of first Lisp_Object field in Lisp_Sub_Char_Table
+       when the latter is treated as an ordinary Lisp_Vector.  */
+    SUB_CHAR_TABLE_OFFSET = PSEUDOVECSIZE (struct Lisp_Sub_Char_Table, 
contents)
+  };
+
+/* Return the number of "extra" slots in the char table CT.  */
+
+INLINE int
+CHAR_TABLE_EXTRA_SLOTS (struct Lisp_Char_Table *ct)
+{
+  return ((ct->header.size & PSEUDOVECTOR_SIZE_MASK)
+         - CHAR_TABLE_STANDARD_SLOTS);
+}
+
+/* Make sure that sub char-table contents slot is where we think it is.  */
+verify (offsetof (struct Lisp_Sub_Char_Table, contents)
+       == offsetof (struct Lisp_Vector, contents[SUB_CHAR_TABLE_OFFSET]));
+
+/***********************************************************************
+                              Symbols
+ ***********************************************************************/
+
+/* Value is name of symbol.  */
+
+LISP_MACRO_DEFUN (SYMBOL_VAL, Lisp_Object, (struct Lisp_Symbol *sym), (sym))
+
+INLINE struct Lisp_Symbol *
+SYMBOL_ALIAS (struct Lisp_Symbol *sym)
+{
+  eassert (sym->redirect == SYMBOL_VARALIAS);
+  return sym->val.alias;
+}
+INLINE struct Lisp_Buffer_Local_Value *
+SYMBOL_BLV (struct Lisp_Symbol *sym)
+{
+  eassert (sym->redirect == SYMBOL_LOCALIZED);
+  return sym->val.blv;
+}
+INLINE union Lisp_Fwd *
+SYMBOL_FWD (struct Lisp_Symbol *sym)
+{
+  eassert (sym->redirect == SYMBOL_FORWARDED);
+  return sym->val.fwd;
+}
+
+LISP_MACRO_DEFUN_VOID (SET_SYMBOL_VAL,
+                      (struct Lisp_Symbol *sym, Lisp_Object v), (sym, v))
+
+INLINE void
+SET_SYMBOL_ALIAS (struct Lisp_Symbol *sym, struct Lisp_Symbol *v)
+{
+  eassert (sym->redirect == SYMBOL_VARALIAS);
+  sym->val.alias = v;
+}
+INLINE void
+SET_SYMBOL_BLV (struct Lisp_Symbol *sym, struct Lisp_Buffer_Local_Value *v)
+{
+  eassert (sym->redirect == SYMBOL_LOCALIZED);
+  sym->val.blv = v;
+}
+INLINE void
+SET_SYMBOL_FWD (struct Lisp_Symbol *sym, union Lisp_Fwd *v)
+{
+  eassert (sym->redirect == SYMBOL_FORWARDED);
+  sym->val.fwd = v;
+}
+
+INLINE Lisp_Object
+SYMBOL_NAME (Lisp_Object sym)
+{
+  return XSYMBOL (sym)->name;
+}
+
+/* Value is true if SYM is an interned symbol.  */
+
+INLINE bool
+SYMBOL_INTERNED_P (Lisp_Object sym)
+{
+  return XSYMBOL (sym)->interned != SYMBOL_UNINTERNED;
+}
+
+/* Value is true if SYM is interned in initial_obarray.  */
+
+INLINE bool
+SYMBOL_INTERNED_IN_INITIAL_OBARRAY_P (Lisp_Object sym)
+{
+  return XSYMBOL (sym)->interned == SYMBOL_INTERNED_IN_INITIAL_OBARRAY;
+}
+
+/* Value is non-zero if symbol is considered a constant, i.e. its
+   value cannot be changed (there is an exception for keyword symbols,
+   whose value can be set to the keyword symbol itself).  */
+
+LISP_MACRO_DEFUN (SYMBOL_CONSTANT_P, int, (Lisp_Object sym), (sym))
+
+/* Placeholder for make-docfile to process.  The actual symbol
+   definition is done by lread.c's defsym.  */
+#define DEFSYM(sym, name) /* empty */
+
+
+/***********************************************************************
+                            Hash Tables
+ ***********************************************************************/
+
+/* The structure of a Lisp hash table.  */
+
+struct hash_table_test
+{
+  /* Name of the function used to compare keys.  */
+  Lisp_Object name;
+
+  /* User-supplied hash function, or nil.  */
+  Lisp_Object user_hash_function;
+
+  /* User-supplied key comparison function, or nil.  */
+  Lisp_Object user_cmp_function;
+
+  /* C function to compare two keys.  */
+  bool (*cmpfn) (struct hash_table_test *t, Lisp_Object, Lisp_Object);
+
+  /* C function to compute hash code.  */
+  EMACS_UINT (*hashfn) (struct hash_table_test *t, Lisp_Object);
+};
+
+struct Lisp_Hash_Table
+{
+  /* This is for Lisp; the hash table code does not refer to it.  */
+  struct vectorlike_header header;
+
+  /* Nil if table is non-weak.  Otherwise a symbol describing the
+     weakness of the table.  */
+  Lisp_Object weak;
+
+  /* When the table is resized, and this is an integer, compute the
+     new size by adding this to the old size.  If a float, compute the
+     new size by multiplying the old size with this factor.  */
+  Lisp_Object rehash_size;
+
+  /* Resize hash table when number of entries/ table size is >= this
+     ratio, a float.  */
+  Lisp_Object rehash_threshold;
+
+  /* Vector of hash codes.  If hash[I] is nil, this means that the
+     I-th entry is unused.  */
+  Lisp_Object hash;
+
+  /* Vector used to chain entries.  If entry I is free, next[I] is the
+     entry number of the next free item.  If entry I is non-free,
+     next[I] is the index of the next entry in the collision chain.  */
+  Lisp_Object next;
+
+  /* Index of first free entry in free list.  */
+  Lisp_Object next_free;
+
+  /* Bucket vector.  A non-nil entry is the index of the first item in
+     a collision chain.  This vector's size can be larger than the
+     hash table size to reduce collisions.  */
+  Lisp_Object index;
+
+  /* Only the fields above are traced normally by the GC.  The ones below
+     `count' are special and are either ignored by the GC or traced in
+     a special way (e.g. because of weakness).  */
+
+  /* Number of key/value entries in the table.  */
+  ptrdiff_t count;
+
+  /* Vector of keys and values.  The key of item I is found at index
+     2 * I, the value is found at index 2 * I + 1.
+     This is gc_marked specially if the table is weak.  */
+  Lisp_Object key_and_value;
+
+  /* The comparison and hash functions.  */
+  struct hash_table_test test;
+
+  /* Next weak hash table if this is a weak hash table.  The head
+     of the list is in weak_hash_tables.  */
+  struct Lisp_Hash_Table *next_weak;
+};
+
+
+INLINE struct Lisp_Hash_Table *
+XHASH_TABLE (Lisp_Object a)
+{
+  return XUNTAG (a, Lisp_Vectorlike);
+}
+
+#define XSET_HASH_TABLE(VAR, PTR) \
+     (XSETPSEUDOVECTOR (VAR, PTR, PVEC_HASH_TABLE))
+
+INLINE bool
+HASH_TABLE_P (Lisp_Object a)
+{
+  return PSEUDOVECTORP (a, PVEC_HASH_TABLE);
+}
+
+/* Value is the key part of entry IDX in hash table H.  */
+INLINE Lisp_Object
+HASH_KEY (struct Lisp_Hash_Table *h, ptrdiff_t idx)
+{
+  return AREF (h->key_and_value, 2 * idx);
+}
+
+/* Value is the value part of entry IDX in hash table H.  */
+INLINE Lisp_Object
+HASH_VALUE (struct Lisp_Hash_Table *h, ptrdiff_t idx)
+{
+  return AREF (h->key_and_value, 2 * idx + 1);
+}
+
+/* Value is the index of the next entry following the one at IDX
+   in hash table H.  */
+INLINE Lisp_Object
+HASH_NEXT (struct Lisp_Hash_Table *h, ptrdiff_t idx)
+{
+  return AREF (h->next, idx);
+}
+
+/* Value is the hash code computed for entry IDX in hash table H.  */
+INLINE Lisp_Object
+HASH_HASH (struct Lisp_Hash_Table *h, ptrdiff_t idx)
+{
+  return AREF (h->hash, idx);
+}
+
+/* Value is the index of the element in hash table H that is the
+   start of the collision list at index IDX in the index vector of H.  */
+INLINE Lisp_Object
+HASH_INDEX (struct Lisp_Hash_Table *h, ptrdiff_t idx)
+{
+  return AREF (h->index, idx);
+}
+
+/* Value is the size of hash table H.  */
+INLINE ptrdiff_t
+HASH_TABLE_SIZE (struct Lisp_Hash_Table *h)
+{
+  return ASIZE (h->next);
+}
+
+/* Default size for hash tables if not specified.  */
+
+enum DEFAULT_HASH_SIZE { DEFAULT_HASH_SIZE = 65 };
+
+/* Default threshold specifying when to resize a hash table.  The
+   value gives the ratio of current entries in the hash table and the
+   size of the hash table.  */
+
+static double const DEFAULT_REHASH_THRESHOLD = 0.8;
+
+/* Default factor by which to increase the size of a hash table.  */
+
+static double const DEFAULT_REHASH_SIZE = 1.5;
+
+/* Combine two integers X and Y for hashing.  The result might not fit
+   into a Lisp integer.  */
+
+INLINE EMACS_UINT
+sxhash_combine (EMACS_UINT x, EMACS_UINT y)
+{
+  return (x << 4) + (x >> (BITS_PER_EMACS_INT - 4)) + y;
+}
+
+/* Hash X, returning a value that fits into a fixnum.  */
+
+INLINE EMACS_UINT
+SXHASH_REDUCE (EMACS_UINT x)
+{
+  return (x ^ x >> (BITS_PER_EMACS_INT - FIXNUM_BITS)) & INTMASK;
+}
+
+/* These structures are used for various misc types.  */
+
+struct Lisp_Misc_Any           /* Supertype of all Misc types.  */
+{
+  ENUM_BF (Lisp_Misc_Type) type : 16;          /* = Lisp_Misc_??? */
+  bool_bf gcmarkbit : 1;
+  unsigned spacer : 15;
+};
+
+struct Lisp_Marker
+{
+  ENUM_BF (Lisp_Misc_Type) type : 16;          /* = Lisp_Misc_Marker */
+  bool_bf gcmarkbit : 1;
+  unsigned spacer : 13;
+  /* This flag is temporarily used in the functions
+     decode/encode_coding_object to record that the marker position
+     must be adjusted after the conversion.  */
+  bool_bf need_adjustment : 1;
+  /* True means normal insertion at the marker's position
+     leaves the marker after the inserted text.  */
+  bool_bf insertion_type : 1;
+  /* This is the buffer that the marker points into, or 0 if it points nowhere.
+     Note: a chain of markers can contain markers pointing into different
+     buffers (the chain is per buffer_text rather than per buffer, so it's
+     shared between indirect buffers).  */
+  /* This is used for (other than NULL-checking):
+     - Fmarker_buffer
+     - Fset_marker: check eq(oldbuf, newbuf) to avoid unchain+rechain.
+     - unchain_marker: to find the list from which to unchain.
+     - Fkill_buffer: to only unchain the markers of current indirect buffer.
+     */
+  struct buffer *buffer;
+
+  /* The remaining fields are meaningless in a marker that
+     does not point anywhere.  */
+
+  /* For markers that point somewhere,
+     this is used to chain of all the markers in a given buffer.  */
+  /* We could remove it and use an array in buffer_text instead.
+     That would also allow to preserve it ordered.  */
+  struct Lisp_Marker *next;
+  /* This is the char position where the marker points.  */
+  ptrdiff_t charpos;
+  /* This is the byte position.
+     It's mostly used as a charpos<->bytepos cache (i.e. it's not directly
+     used to implement the functionality of markers, but rather to (ab)use
+     markers as a cache for char<->byte mappings).  */
+  ptrdiff_t bytepos;
+};
+
+/* START and END are markers in the overlay's buffer, and
+   PLIST is the overlay's property list.  */
+struct Lisp_Overlay
+/* An overlay's real data content is:
+   - plist
+   - buffer (really there are two buffer pointers, one per marker,
+     and both points to the same buffer)
+   - insertion type of both ends (per-marker fields)
+   - start & start byte (of start marker)
+   - end & end byte (of end marker)
+   - next (singly linked list of overlays)
+   - next fields of start and end markers (singly linked list of markers).
+   I.e. 9words plus 2 bits, 3words of which are for external linked lists.
+*/
+  {
+    ENUM_BF (Lisp_Misc_Type) type : 16;        /* = Lisp_Misc_Overlay */
+    bool_bf gcmarkbit : 1;
+    unsigned spacer : 15;
+    struct Lisp_Overlay *next;
+    Lisp_Object start;
+    Lisp_Object end;
+    Lisp_Object plist;
+  };
+
+/* Types of data which may be saved in a Lisp_Save_Value.  */
+
+enum
+  {
+    SAVE_UNUSED,
+    SAVE_INTEGER,
+    SAVE_FUNCPOINTER,
+    SAVE_POINTER,
+    SAVE_OBJECT
+  };
+
+/* Number of bits needed to store one of the above values.  */
+enum { SAVE_SLOT_BITS = 3 };
+
+/* Number of slots in a save value where save_type is nonzero.  */
+enum { SAVE_VALUE_SLOTS = 4 };
+
+/* Bit-width and values for struct Lisp_Save_Value's save_type member.  */
+
+enum { SAVE_TYPE_BITS = SAVE_VALUE_SLOTS * SAVE_SLOT_BITS + 1 };
+
+enum Lisp_Save_Type
+  {
+    SAVE_TYPE_INT_INT = SAVE_INTEGER + (SAVE_INTEGER << SAVE_SLOT_BITS),
+    SAVE_TYPE_INT_INT_INT
+      = (SAVE_INTEGER + (SAVE_TYPE_INT_INT << SAVE_SLOT_BITS)),
+    SAVE_TYPE_OBJ_OBJ = SAVE_OBJECT + (SAVE_OBJECT << SAVE_SLOT_BITS),
+    SAVE_TYPE_OBJ_OBJ_OBJ = SAVE_OBJECT + (SAVE_TYPE_OBJ_OBJ << 
SAVE_SLOT_BITS),
+    SAVE_TYPE_OBJ_OBJ_OBJ_OBJ
+      = SAVE_OBJECT + (SAVE_TYPE_OBJ_OBJ_OBJ << SAVE_SLOT_BITS),
+    SAVE_TYPE_PTR_INT = SAVE_POINTER + (SAVE_INTEGER << SAVE_SLOT_BITS),
+    SAVE_TYPE_PTR_OBJ = SAVE_POINTER + (SAVE_OBJECT << SAVE_SLOT_BITS),
+    SAVE_TYPE_PTR_PTR = SAVE_POINTER + (SAVE_POINTER << SAVE_SLOT_BITS),
+    SAVE_TYPE_FUNCPTR_PTR_OBJ
+      = SAVE_FUNCPOINTER + (SAVE_TYPE_PTR_OBJ << SAVE_SLOT_BITS),
+
+    /* This has an extra bit indicating it's raw memory.  */
+    SAVE_TYPE_MEMORY = SAVE_TYPE_PTR_INT + (1 << (SAVE_TYPE_BITS - 1))
+  };
+
+/* Special object used to hold a different values for later use.
+
+   This is mostly used to package C integers and pointers to call
+   record_unwind_protect when two or more values need to be saved.
+   For example:
+
+   ...
+     struct my_data *md = get_my_data ();
+     ptrdiff_t mi = get_my_integer ();
+     record_unwind_protect (my_unwind, make_save_ptr_int (md, mi));
+   ...
+
+   Lisp_Object my_unwind (Lisp_Object arg)
+   {
+     struct my_data *md = XSAVE_POINTER (arg, 0);
+     ptrdiff_t mi = XSAVE_INTEGER (arg, 1);
+     ...
+   }
+
+   If ENABLE_CHECKING is in effect, XSAVE_xxx macros do type checking of the
+   saved objects and raise eassert if type of the saved object doesn't match
+   the type which is extracted.  In the example above, XSAVE_INTEGER (arg, 2)
+   and XSAVE_OBJECT (arg, 0) are wrong because nothing was saved in slot 2 and
+   slot 0 is a pointer.  */
+
+typedef void (*voidfuncptr) (void);
+
+struct Lisp_Save_Value
+  {
+    ENUM_BF (Lisp_Misc_Type) type : 16;        /* = Lisp_Misc_Save_Value */
+    bool_bf gcmarkbit : 1;
+    unsigned spacer : 32 - (16 + 1 + SAVE_TYPE_BITS);
+
+    /* V->data may hold up to SAVE_VALUE_SLOTS entries.  The type of
+       V's data entries are determined by V->save_type.  E.g., if
+       V->save_type == SAVE_TYPE_PTR_OBJ, V->data[0] is a pointer,
+       V->data[1] is an integer, and V's other data entries are unused.
+
+       If V->save_type == SAVE_TYPE_MEMORY, V->data[0].pointer is the address 
of
+       a memory area containing V->data[1].integer potential Lisp_Objects.  */
+    ENUM_BF (Lisp_Save_Type) save_type : SAVE_TYPE_BITS;
+    union {
+      void *pointer;
+      voidfuncptr funcpointer;
+      ptrdiff_t integer;
+      Lisp_Object object;
+    } data[SAVE_VALUE_SLOTS];
+  };
+
+/* Return the type of V's Nth saved value.  */
+INLINE int
+save_type (struct Lisp_Save_Value *v, int n)
+{
+  eassert (0 <= n && n < SAVE_VALUE_SLOTS);
+  return (v->save_type >> (SAVE_SLOT_BITS * n) & ((1 << SAVE_SLOT_BITS) - 1));
+}
+
+/* Get and set the Nth saved pointer.  */
+
+INLINE void *
+XSAVE_POINTER (Lisp_Object obj, int n)
+{
+  eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_POINTER);
+  return XSAVE_VALUE (obj)->data[n].pointer;
+}
+INLINE void
+set_save_pointer (Lisp_Object obj, int n, void *val)
+{
+  eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_POINTER);
+  XSAVE_VALUE (obj)->data[n].pointer = val;
+}
+INLINE voidfuncptr
+XSAVE_FUNCPOINTER (Lisp_Object obj, int n)
+{
+  eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_FUNCPOINTER);
+  return XSAVE_VALUE (obj)->data[n].funcpointer;
+}
+
+/* Likewise for the saved integer.  */
+
+INLINE ptrdiff_t
+XSAVE_INTEGER (Lisp_Object obj, int n)
+{
+  eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_INTEGER);
+  return XSAVE_VALUE (obj)->data[n].integer;
+}
+INLINE void
+set_save_integer (Lisp_Object obj, int n, ptrdiff_t val)
+{
+  eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_INTEGER);
+  XSAVE_VALUE (obj)->data[n].integer = val;
+}
+
+/* Extract Nth saved object.  */
+
+INLINE Lisp_Object
+XSAVE_OBJECT (Lisp_Object obj, int n)
+{
+  eassert (save_type (XSAVE_VALUE (obj), n) == SAVE_OBJECT);
+  return XSAVE_VALUE (obj)->data[n].object;
+}
+
+/* A finalizer sentinel.  */
+struct Lisp_Finalizer
+  {
+    struct Lisp_Misc_Any base;
+
+    /* Circular list of all active weak references.  */
+    struct Lisp_Finalizer *prev;
+    struct Lisp_Finalizer *next;
+
+    /* Call FUNCTION when the finalizer becomes unreachable, even if
+       FUNCTION contains a reference to the finalizer; i.e., call
+       FUNCTION when it is reachable _only_ through finalizers.  */
+    Lisp_Object function;
+  };
+
+/* A miscellaneous object, when it's on the free list.  */
+struct Lisp_Free
+  {
+    ENUM_BF (Lisp_Misc_Type) type : 16;        /* = Lisp_Misc_Free */
+    bool_bf gcmarkbit : 1;
+    unsigned spacer : 15;
+    union Lisp_Misc *chain;
+  };
+
+/* To get the type field of a union Lisp_Misc, use XMISCTYPE.
+   It uses one of these struct subtypes to get the type field.  */
+
+union Lisp_Misc
+  {
+    struct Lisp_Misc_Any u_any;           /* Supertype of all Misc types.  */
+    struct Lisp_Free u_free;
+    struct Lisp_Marker u_marker;
+    struct Lisp_Overlay u_overlay;
+    struct Lisp_Save_Value u_save_value;
+    struct Lisp_Finalizer u_finalizer;
+  };
+
+INLINE union Lisp_Misc *
+XMISC (Lisp_Object a)
+{
+  return XUNTAG (a, Lisp_Misc);
+}
+
+INLINE struct Lisp_Misc_Any *
+XMISCANY (Lisp_Object a)
+{
+  eassert (MISCP (a));
+  return & XMISC (a)->u_any;
+}
+
+INLINE enum Lisp_Misc_Type
+XMISCTYPE (Lisp_Object a)
+{
+  return XMISCANY (a)->type;
+}
+
+INLINE struct Lisp_Marker *
+XMARKER (Lisp_Object a)
+{
+  eassert (MARKERP (a));
+  return & XMISC (a)->u_marker;
+}
+
+INLINE struct Lisp_Overlay *
+XOVERLAY (Lisp_Object a)
+{
+  eassert (OVERLAYP (a));
+  return & XMISC (a)->u_overlay;
+}
+
+INLINE struct Lisp_Save_Value *
+XSAVE_VALUE (Lisp_Object a)
+{
+  eassert (SAVE_VALUEP (a));
+  return & XMISC (a)->u_save_value;
+}
+
+INLINE struct Lisp_Finalizer *
+XFINALIZER (Lisp_Object a)
+{
+  eassert (FINALIZERP (a));
+  return & XMISC (a)->u_finalizer;
+}
+
+
+/* Forwarding pointer to an int variable.
+   This is allowed only in the value cell of a symbol,
+   and it means that the symbol's value really lives in the
+   specified int variable.  */
+struct Lisp_Intfwd
+  {
+    enum Lisp_Fwd_Type type;   /* = Lisp_Fwd_Int */
+    EMACS_INT *intvar;
+  };
+
+/* Boolean forwarding pointer to an int variable.
+   This is like Lisp_Intfwd except that the ostensible
+   "value" of the symbol is t if the bool variable is true,
+   nil if it is false.  */
+struct Lisp_Boolfwd
+  {
+    enum Lisp_Fwd_Type type;   /* = Lisp_Fwd_Bool */
+    bool *boolvar;
+  };
+
+/* Forwarding pointer to a Lisp_Object variable.
+   This is allowed only in the value cell of a symbol,
+   and it means that the symbol's value really lives in the
+   specified variable.  */
+struct Lisp_Objfwd
+  {
+    enum Lisp_Fwd_Type type;   /* = Lisp_Fwd_Obj */
+    Lisp_Object *objvar;
+  };
+
+/* Like Lisp_Objfwd except that value lives in a slot in the
+   current buffer.  Value is byte index of slot within buffer.  */
+struct Lisp_Buffer_Objfwd
+  {
+    enum Lisp_Fwd_Type type;   /* = Lisp_Fwd_Buffer_Obj */
+    int offset;
+    /* One of Qnil, Qintegerp, Qsymbolp, Qstringp, Qfloatp or Qnumberp.  */
+    Lisp_Object predicate;
+  };
+
+/* struct Lisp_Buffer_Local_Value is used in a symbol value cell when
+   the symbol has buffer-local or frame-local bindings.  (Exception:
+   some buffer-local variables are built-in, with their values stored
+   in the buffer structure itself.  They are handled differently,
+   using struct Lisp_Buffer_Objfwd.)
+
+   The `realvalue' slot holds the variable's current value, or a
+   forwarding pointer to where that value is kept.  This value is the
+   one that corresponds to the loaded binding.  To read or set the
+   variable, you must first make sure the right binding is loaded;
+   then you can access the value in (or through) `realvalue'.
+
+   `buffer' and `frame' are the buffer and frame for which the loaded
+   binding was found.  If those have changed, to make sure the right
+   binding is loaded it is necessary to find which binding goes with
+   the current buffer and selected frame, then load it.  To load it,
+   first unload the previous binding, then copy the value of the new
+   binding into `realvalue' (or through it).  Also update
+   LOADED-BINDING to point to the newly loaded binding.
+
+   `local_if_set' indicates that merely setting the variable creates a
+   local binding for the current buffer.  Otherwise the latter, setting
+   the variable does not do that; only make-local-variable does that.  */
+
+struct Lisp_Buffer_Local_Value
+  {
+    /* True means that merely setting the variable creates a local
+       binding for the current buffer.  */
+    bool_bf local_if_set : 1;
+    /* True means this variable can have frame-local bindings, otherwise, it is
+       can have buffer-local bindings.  The two cannot be combined.  */
+    bool_bf frame_local : 1;
+    /* True means that the binding now loaded was found.
+       Presumably equivalent to (defcell!=valcell).  */
+    bool_bf found : 1;
+    /* If non-NULL, a forwarding to the C var where it should also be set.  */
+    union Lisp_Fwd *fwd;       /* Should never be (Buffer|Kboard)_Objfwd.  */
+    /* The buffer or frame for which the loaded binding was found.  */
+    Lisp_Object where;
+    /* A cons cell that holds the default value.  It has the form
+       (SYMBOL . DEFAULT-VALUE).  */
+    Lisp_Object defcell;
+    /* The cons cell from `where's parameter alist.
+       It always has the form (SYMBOL . VALUE)
+       Note that if `forward' is non-nil, VALUE may be out of date.
+       Also if the currently loaded binding is the default binding, then
+       this is `eq'ual to defcell.  */
+    Lisp_Object valcell;
+  };
+
+/* Like Lisp_Objfwd except that value lives in a slot in the
+   current kboard.  */
+struct Lisp_Kboard_Objfwd
+  {
+    enum Lisp_Fwd_Type type;   /* = Lisp_Fwd_Kboard_Obj */
+    int offset;
+  };
+
+union Lisp_Fwd
+  {
+    struct Lisp_Intfwd u_intfwd;
+    struct Lisp_Boolfwd u_boolfwd;
+    struct Lisp_Objfwd u_objfwd;
+    struct Lisp_Buffer_Objfwd u_buffer_objfwd;
+    struct Lisp_Kboard_Objfwd u_kboard_objfwd;
+  };
+
+INLINE enum Lisp_Fwd_Type
+XFWDTYPE (union Lisp_Fwd *a)
+{
+  return a->u_intfwd.type;
+}
+
+INLINE struct Lisp_Buffer_Objfwd *
+XBUFFER_OBJFWD (union Lisp_Fwd *a)
+{
+  eassert (BUFFER_OBJFWDP (a));
+  return &a->u_buffer_objfwd;
+}
+
+/* Lisp floating point type.  */
+struct Lisp_Float
+  {
+    union
+    {
+      double data;
+      struct Lisp_Float *chain;
+    } u;
+  };
+
+INLINE double
+XFLOAT_DATA (Lisp_Object f)
+{
+  return XFLOAT (f)->u.data;
+}
+
+/* Most hosts nowadays use IEEE floating point, so they use IEC 60559
+   representations, have infinities and NaNs, and do not trap on
+   exceptions.  Define IEEE_FLOATING_POINT if this host is one of the
+   typical ones.  The C11 macro __STDC_IEC_559__ is close to what is
+   wanted here, but is not quite right because Emacs does not require
+   all the features of C11 Annex F (and does not require C11 at all,
+   for that matter).  */
+enum
+  {
+    IEEE_FLOATING_POINT
+      = (FLT_RADIX == 2 && FLT_MANT_DIG == 24
+        && FLT_MIN_EXP == -125 && FLT_MAX_EXP == 128)
+  };
+
+/* A character, declared with the following typedef, is a member
+   of some character set associated with the current buffer.  */
+#ifndef _UCHAR_T  /* Protect against something in ctab.h on AIX.  */
+#define _UCHAR_T
+typedef unsigned char UCHAR;
+#endif
+
+/* Meanings of slots in a Lisp_Compiled:  */
+
+enum Lisp_Compiled
+  {
+    COMPILED_ARGLIST = 0,
+    COMPILED_BYTECODE = 1,
+    COMPILED_CONSTANTS = 2,
+    COMPILED_STACK_DEPTH = 3,
+    COMPILED_DOC_STRING = 4,
+    COMPILED_INTERACTIVE = 5
+  };
+
+/* Flag bits in a character.  These also get used in termhooks.h.
+   Richard Stallman <address@hidden> thinks that MULE
+   (MUlti-Lingual Emacs) might need 22 bits for the character value
+   itself, so we probably shouldn't use any bits lower than 0x0400000.  */
+enum char_bits
+  {
+    CHAR_ALT = 0x0400000,
+    CHAR_SUPER = 0x0800000,
+    CHAR_HYPER = 0x1000000,
+    CHAR_SHIFT = 0x2000000,
+    CHAR_CTL = 0x4000000,
+    CHAR_META = 0x8000000,
+
+    CHAR_MODIFIER_MASK =
+      CHAR_ALT | CHAR_SUPER | CHAR_HYPER | CHAR_SHIFT | CHAR_CTL | CHAR_META,
+
+    /* Actually, the current Emacs uses 22 bits for the character value
+       itself.  */
+    CHARACTERBITS = 22
+  };
+
+/* Data type checking.  */
+
+LISP_MACRO_DEFUN (NILP, bool, (Lisp_Object x), (x))
+
+INLINE bool
+NUMBERP (Lisp_Object x)
+{
+  return INTEGERP (x) || FLOATP (x);
+}
+INLINE bool
+NATNUMP (Lisp_Object x)
+{
+  return INTEGERP (x) && 0 <= XINT (x);
+}
+
+INLINE bool
+RANGED_INTEGERP (intmax_t lo, Lisp_Object x, intmax_t hi)
+{
+  return INTEGERP (x) && lo <= XINT (x) && XINT (x) <= hi;
+}
+
+#define TYPE_RANGED_INTEGERP(type, x) \
+  (INTEGERP (x)                              \
+   && (TYPE_SIGNED (type) ? TYPE_MINIMUM (type) <= XINT (x) : 0 <= XINT (x)) \
+   && XINT (x) <= TYPE_MAXIMUM (type))
+
+LISP_MACRO_DEFUN (CONSP, bool, (Lisp_Object x), (x))
+LISP_MACRO_DEFUN (FLOATP, bool, (Lisp_Object x), (x))
+LISP_MACRO_DEFUN (MISCP, bool, (Lisp_Object x), (x))
+LISP_MACRO_DEFUN (SYMBOLP, bool, (Lisp_Object x), (x))
+LISP_MACRO_DEFUN (INTEGERP, bool, (Lisp_Object x), (x))
+LISP_MACRO_DEFUN (VECTORLIKEP, bool, (Lisp_Object x), (x))
+LISP_MACRO_DEFUN (MARKERP, bool, (Lisp_Object x), (x))
+
+INLINE bool
+STRINGP (Lisp_Object x)
+{
+  return XTYPE (x) == Lisp_String;
+}
+INLINE bool
+VECTORP (Lisp_Object x)
+{
+  return VECTORLIKEP (x) && ! (ASIZE (x) & PSEUDOVECTOR_FLAG);
+}
+INLINE bool
+OVERLAYP (Lisp_Object x)
+{
+  return MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Overlay;
+}
+INLINE bool
+SAVE_VALUEP (Lisp_Object x)
+{
+  return MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Save_Value;
+}
+
+INLINE bool
+FINALIZERP (Lisp_Object x)
+{
+  return MISCP (x) && XMISCTYPE (x) == Lisp_Misc_Finalizer;
+}
+
+INLINE bool
+AUTOLOADP (Lisp_Object x)
+{
+  return CONSP (x) && EQ (Qautoload, XCAR (x));
+}
+
+INLINE bool
+BUFFER_OBJFWDP (union Lisp_Fwd *a)
+{
+  return XFWDTYPE (a) == Lisp_Fwd_Buffer_Obj;
+}
+
+INLINE bool
+PSEUDOVECTOR_TYPEP (struct vectorlike_header *a, int code)
+{
+  return ((a->size & (PSEUDOVECTOR_FLAG | PVEC_TYPE_MASK))
+         == (PSEUDOVECTOR_FLAG | (code << PSEUDOVECTOR_AREA_BITS)));
+}
+
+/* True if A is a pseudovector whose code is CODE.  */
+INLINE bool
+PSEUDOVECTORP (Lisp_Object a, int code)
+{
+  if (! VECTORLIKEP (a))
+    return false;
+  else
+    {
+      /* Converting to struct vectorlike_header * avoids aliasing issues.  */
+      struct vectorlike_header *h = XUNTAG (a, Lisp_Vectorlike);
+      return PSEUDOVECTOR_TYPEP (h, code);
+    }
+}
+
+
+/* Test for specific pseudovector types.  */
+
+INLINE bool
+WINDOW_CONFIGURATIONP (Lisp_Object a)
+{
+  return PSEUDOVECTORP (a, PVEC_WINDOW_CONFIGURATION);
+}
+
+INLINE bool
+PROCESSP (Lisp_Object a)
+{
+  return PSEUDOVECTORP (a, PVEC_PROCESS);
+}
+
+INLINE bool
+WINDOWP (Lisp_Object a)
+{
+  return PSEUDOVECTORP (a, PVEC_WINDOW);
+}
+
+INLINE bool
+TERMINALP (Lisp_Object a)
+{
+  return PSEUDOVECTORP (a, PVEC_TERMINAL);
+}
+
+INLINE bool
+SUBRP (Lisp_Object a)
+{
+  return PSEUDOVECTORP (a, PVEC_SUBR);
+}
+
+INLINE bool
+COMPILEDP (Lisp_Object a)
+{
+  return PSEUDOVECTORP (a, PVEC_COMPILED);
+}
+
+INLINE bool
+BUFFERP (Lisp_Object a)
+{
+  return PSEUDOVECTORP (a, PVEC_BUFFER);
+}
+
+INLINE bool
+CHAR_TABLE_P (Lisp_Object a)
+{
+  return PSEUDOVECTORP (a, PVEC_CHAR_TABLE);
+}
+
+INLINE bool
+SUB_CHAR_TABLE_P (Lisp_Object a)
+{
+  return PSEUDOVECTORP (a, PVEC_SUB_CHAR_TABLE);
+}
+
+INLINE bool
+BOOL_VECTOR_P (Lisp_Object a)
+{
+  return PSEUDOVECTORP (a, PVEC_BOOL_VECTOR);
+}
+
+INLINE bool
+FRAMEP (Lisp_Object a)
+{
+  return PSEUDOVECTORP (a, PVEC_FRAME);
+}
+
+/* Test for image (image . spec)  */
+INLINE bool
+IMAGEP (Lisp_Object x)
+{
+  return CONSP (x) && EQ (XCAR (x), Qimage);
+}
+
+/* Array types.  */
+INLINE bool
+ARRAYP (Lisp_Object x)
+{
+  return VECTORP (x) || STRINGP (x) || CHAR_TABLE_P (x) || BOOL_VECTOR_P (x);
+}
+
+INLINE void
+CHECK_LIST (Lisp_Object x)
+{
+  CHECK_TYPE (CONSP (x) || NILP (x), Qlistp, x);
+}
+
+LISP_MACRO_DEFUN_VOID (CHECK_LIST_CONS, (Lisp_Object x, Lisp_Object y), (x, y))
+LISP_MACRO_DEFUN_VOID (CHECK_SYMBOL, (Lisp_Object x), (x))
+LISP_MACRO_DEFUN_VOID (CHECK_NUMBER, (Lisp_Object x), (x))
+
+INLINE void
+CHECK_STRING (Lisp_Object x)
+{
+  CHECK_TYPE (STRINGP (x), Qstringp, x);
+}
+INLINE void
+CHECK_STRING_CAR (Lisp_Object x)
+{
+  CHECK_TYPE (STRINGP (XCAR (x)), Qstringp, XCAR (x));
+}
+INLINE void
+CHECK_CONS (Lisp_Object x)
+{
+  CHECK_TYPE (CONSP (x), Qconsp, x);
+}
+INLINE void
+CHECK_VECTOR (Lisp_Object x)
+{
+  CHECK_TYPE (VECTORP (x), Qvectorp, x);
+}
+INLINE void
+CHECK_BOOL_VECTOR (Lisp_Object x)
+{
+  CHECK_TYPE (BOOL_VECTOR_P (x), Qbool_vector_p, x);
+}
+/* This is a bit special because we always need size afterwards.  */
+INLINE ptrdiff_t
+CHECK_VECTOR_OR_STRING (Lisp_Object x)
+{
+  if (VECTORP (x))
+    return ASIZE (x);
+  if (STRINGP (x))
+    return SCHARS (x);
+  wrong_type_argument (Qarrayp, x);
+}
+INLINE void
+CHECK_ARRAY (Lisp_Object x, Lisp_Object predicate)
+{
+  CHECK_TYPE (ARRAYP (x), predicate, x);
+}
+INLINE void
+CHECK_BUFFER (Lisp_Object x)
+{
+  CHECK_TYPE (BUFFERP (x), Qbufferp, x);
+}
+INLINE void
+CHECK_WINDOW (Lisp_Object x)
+{
+  CHECK_TYPE (WINDOWP (x), Qwindowp, x);
+}
+#ifdef subprocesses
+INLINE void
+CHECK_PROCESS (Lisp_Object x)
+{
+  CHECK_TYPE (PROCESSP (x), Qprocessp, x);
+}
+#endif
+INLINE void
+CHECK_NATNUM (Lisp_Object x)
+{
+  CHECK_TYPE (NATNUMP (x), Qwholenump, x);
+}
+
+#define CHECK_RANGED_INTEGER(x, lo, hi)                                        
\
+  do {                                                                 \
+    CHECK_NUMBER (x);                                                  \
+    if (! ((lo) <= XINT (x) && XINT (x) <= (hi)))                      \
+      args_out_of_range_3                                              \
+       (x,                                                             \
+        make_number ((lo) < 0 && (lo) < MOST_NEGATIVE_FIXNUM           \
+                     ? MOST_NEGATIVE_FIXNUM                            \
+                     : (lo)),                                          \
+        make_number (min (hi, MOST_POSITIVE_FIXNUM)));                 \
+  } while (false)
+#define CHECK_TYPE_RANGED_INTEGER(type, x) \
+  do {                                                                 \
+    if (TYPE_SIGNED (type))                                            \
+      CHECK_RANGED_INTEGER (x, TYPE_MINIMUM (type), TYPE_MAXIMUM (type)); \
+    else                                                               \
+      CHECK_RANGED_INTEGER (x, 0, TYPE_MAXIMUM (type));                        
\
+  } while (false)
+
+#define CHECK_NUMBER_COERCE_MARKER(x)                                  \
+  do {                                                                 \
+    if (MARKERP ((x)))                                                 \
+      XSETFASTINT (x, marker_position (x));                            \
+    else                                                               \
+      CHECK_TYPE (INTEGERP (x), Qinteger_or_marker_p, x);              \
+  } while (false)
+
+INLINE double
+XFLOATINT (Lisp_Object n)
+{
+  return extract_float (n);
+}
+
+INLINE void
+CHECK_NUMBER_OR_FLOAT (Lisp_Object x)
+{
+  CHECK_TYPE (FLOATP (x) || INTEGERP (x), Qnumberp, x);
+}
+
+#define CHECK_NUMBER_OR_FLOAT_COERCE_MARKER(x)                         \
+  do {                                                                 \
+    if (MARKERP (x))                                                   \
+      XSETFASTINT (x, marker_position (x));                            \
+    else                                                               \
+      CHECK_TYPE (INTEGERP (x) || FLOATP (x), Qnumber_or_marker_p, x); \
+  } while (false)
+
+/* Since we can't assign directly to the CAR or CDR fields of a cons
+   cell, use these when checking that those fields contain numbers.  */
+INLINE void
+CHECK_NUMBER_CAR (Lisp_Object x)
+{
+  Lisp_Object tmp = XCAR (x);
+  CHECK_NUMBER (tmp);
+  XSETCAR (x, tmp);
+}
+
+INLINE void
+CHECK_NUMBER_CDR (Lisp_Object x)
+{
+  Lisp_Object tmp = XCDR (x);
+  CHECK_NUMBER (tmp);
+  XSETCDR (x, tmp);
+}
+
+/* Define a built-in function for calling from Lisp.
+ `lname' should be the name to give the function in Lisp,
+    as a null-terminated C string.
+ `fnname' should be the name of the function in C.
+    By convention, it starts with F.
+ `sname' should be the name for the C constant structure
+    that records information on this function for internal use.
+    By convention, it should be the same as `fnname' but with S instead of F.
+    It's too bad that C macros can't compute this from `fnname'.
+ `minargs' should be a number, the minimum number of arguments allowed.
+ `maxargs' should be a number, the maximum number of arguments allowed,
+    or else MANY or UNEVALLED.
+    MANY means pass a vector of evaluated arguments,
+        in the form of an integer number-of-arguments
+        followed by the address of a vector of Lisp_Objects
+        which contains the argument values.
+    UNEVALLED means pass the list of unevaluated arguments
+ `intspec' says how interactive arguments are to be fetched.
+    If the string starts with a `(', `intspec' is evaluated and the resulting
+    list is the list of arguments.
+    If it's a string that doesn't start with `(', the value should follow
+    the one of the doc string for `interactive'.
+    A null string means call interactively with no arguments.
+ `doc' is documentation for the user.  */
+
+/* This version of DEFUN declares a function prototype with the right
+   arguments, so we can catch errors with maxargs at compile-time.  */
+#ifdef _MSC_VER
+#define DEFUN(lname, fnname, sname, minargs, maxargs, intspec, doc)    \
+   Lisp_Object fnname DEFUN_ARGS_ ## maxargs ;                         \
+   static struct Lisp_Subr alignas (GCALIGNMENT) sname =               \
+   { { (PVEC_SUBR << PSEUDOVECTOR_AREA_BITS)                           \
+       | (sizeof (struct Lisp_Subr) / sizeof (EMACS_INT)) },           \
+      { (Lisp_Object (__cdecl *)(void))fnname },                        \
+       minargs, maxargs, lname, intspec, 0};                           \
+   Lisp_Object fnname
+#else  /* not _MSC_VER */
+#define DEFUN(lname, fnname, sname, minargs, maxargs, intspec, doc)    \
+   static struct Lisp_Subr alignas (GCALIGNMENT) sname =               \
+     { { PVEC_SUBR << PSEUDOVECTOR_AREA_BITS },                                
\
+       { .a ## maxargs = fnname },                                     \
+       minargs, maxargs, lname, intspec, 0};                           \
+   Lisp_Object fnname
+#endif
+
+/* True if OBJ is a Lisp function.  */
+INLINE bool
+FUNCTIONP (Lisp_Object obj)
+{
+  return functionp (obj);
+}
+
+/* defsubr (Sname);
+   is how we define the symbol for function `name' at start-up time.  */
+extern void defsubr (struct Lisp_Subr *);
+
+enum maxargs
+  {
+    MANY = -2,
+    UNEVALLED = -1
+  };
+
+/* Call a function F that accepts many args, passing it ARRAY's elements.  */
+#define CALLMANY(f, array) (f) (ARRAYELTS (array), array)
+
+/* Call a function F that accepts many args, passing it the remaining args,
+   E.g., 'return CALLN (Fformat, fmt, text);' is less error-prone than
+   '{ Lisp_Object a[2]; a[0] = fmt; a[1] = text; return Fformat (2, a); }'.
+   CALLN is overkill for simple usages like 'Finsert (1, &text);'.  */
+#define CALLN(f, ...) CALLMANY (f, ((Lisp_Object []) {__VA_ARGS__}))
+
+extern void defvar_lisp (struct Lisp_Objfwd *, const char *, Lisp_Object *);
+extern void defvar_lisp_nopro (struct Lisp_Objfwd *, const char *, Lisp_Object 
*);
+extern void defvar_bool (struct Lisp_Boolfwd *, const char *, bool *);
+extern void defvar_int (struct Lisp_Intfwd *, const char *, EMACS_INT *);
+extern void defvar_kboard (struct Lisp_Kboard_Objfwd *, const char *, int);
+
+/* Macros we use to define forwarded Lisp variables.
+   These are used in the syms_of_FILENAME functions.
+
+   An ordinary (not in buffer_defaults, per-buffer, or per-keyboard)
+   lisp variable is actually a field in `struct emacs_globals'.  The
+   field's name begins with "f_", which is a convention enforced by
+   these macros.  Each such global has a corresponding #define in
+   globals.h; the plain name should be used in the code.
+
+   E.g., the global "cons_cells_consed" is declared as "int
+   f_cons_cells_consed" in globals.h, but there is a define:
+
+      #define cons_cells_consed globals.f_cons_cells_consed
+
+   All C code uses the `cons_cells_consed' name.  This is all done
+   this way to support indirection for multi-threaded Emacs.  */
+
+#define DEFVAR_LISP(lname, vname, doc)         \
+  do {                                         \
+    static struct Lisp_Objfwd o_fwd;           \
+    defvar_lisp (&o_fwd, lname, &globals.f_ ## vname);         \
+  } while (false)
+#define DEFVAR_LISP_NOPRO(lname, vname, doc)   \
+  do {                                         \
+    static struct Lisp_Objfwd o_fwd;           \
+    defvar_lisp_nopro (&o_fwd, lname, &globals.f_ ## vname);   \
+  } while (false)
+#define DEFVAR_BOOL(lname, vname, doc)         \
+  do {                                         \
+    static struct Lisp_Boolfwd b_fwd;          \
+    defvar_bool (&b_fwd, lname, &globals.f_ ## vname);         \
+  } while (false)
+#define DEFVAR_INT(lname, vname, doc)          \
+  do {                                         \
+    static struct Lisp_Intfwd i_fwd;           \
+    defvar_int (&i_fwd, lname, &globals.f_ ## vname);          \
+  } while (false)
+
+#define DEFVAR_BUFFER_DEFAULTS(lname, vname, doc)              \
+  do {                                                         \
+    static struct Lisp_Objfwd o_fwd;                           \
+    defvar_lisp_nopro (&o_fwd, lname, &BVAR (&buffer_defaults, vname));        
\
+  } while (false)
+
+#define DEFVAR_KBOARD(lname, vname, doc)                       \
+  do {                                                         \
+    static struct Lisp_Kboard_Objfwd ko_fwd;                   \
+    defvar_kboard (&ko_fwd, lname, offsetof (KBOARD, vname ## _)); \
+  } while (false)
+
+/* Save and restore the instruction and environment pointers,
+   without affecting the signal mask.  */
+
+#ifdef HAVE__SETJMP
+typedef jmp_buf sys_jmp_buf;
+# define sys_setjmp(j) _setjmp (j)
+# define sys_longjmp(j, v) _longjmp (j, v)
+#elif defined HAVE_SIGSETJMP
+typedef sigjmp_buf sys_jmp_buf;
+# define sys_setjmp(j) sigsetjmp (j, 0)
+# define sys_longjmp(j, v) siglongjmp (j, v)
+#else
+/* A platform that uses neither _longjmp nor siglongjmp; assume
+   longjmp does not affect the sigmask.  */
+typedef jmp_buf sys_jmp_buf;
+# define sys_setjmp(j) setjmp (j)
+# define sys_longjmp(j, v) longjmp (j, v)
+#endif
+
+
+/* Elisp uses several stacks:
+   - the C stack.
+   - the bytecode stack: used internally by the bytecode interpreter.
+     Allocated from the C stack.
+   - The specpdl stack: keeps track of active unwind-protect and
+     dynamic-let-bindings.  Allocated from the `specpdl' array, a manually
+     managed stack.
+   - The handler stack: keeps track of active catch tags and condition-case
+     handlers.  Allocated in a manually managed stack implemented by a
+     doubly-linked list allocated via xmalloc and never freed.  */
+
+/* Structure for recording Lisp call stack for backtrace purposes.  */
+
+/* The special binding stack holds the outer values of variables while
+   they are bound by a function application or a let form, stores the
+   code to be executed for unwind-protect forms.
+
+   NOTE: The specbinding union is defined here, because SPECPDL_INDEX is
+   used all over the place, needs to be fast, and needs to know the size of
+   union specbinding.  But only eval.c should access it.  */
+
+enum specbind_tag {
+  SPECPDL_UNWIND,              /* An unwind_protect function on Lisp_Object.  
*/
+  SPECPDL_UNWIND_PTR,          /* Likewise, on void *.  */
+  SPECPDL_UNWIND_INT,          /* Likewise, on int.  */
+  SPECPDL_UNWIND_VOID,         /* Likewise, with no arg.  */
+  SPECPDL_BACKTRACE,           /* An element of the backtrace.  */
+  SPECPDL_LET,                 /* A plain and simple dynamic let-binding.  */
+  /* Tags greater than SPECPDL_LET must be "subkinds" of LET.  */
+  SPECPDL_LET_LOCAL,           /* A buffer-local let-binding.  */
+  SPECPDL_LET_DEFAULT          /* A global binding for a localized var.  */
+};
+
+union specbinding
+  {
+    ENUM_BF (specbind_tag) kind : CHAR_BIT;
+    struct {
+      ENUM_BF (specbind_tag) kind : CHAR_BIT;
+      void (*func) (Lisp_Object);
+      Lisp_Object arg;
+    } unwind;
+    struct {
+      ENUM_BF (specbind_tag) kind : CHAR_BIT;
+      void (*func) (void *);
+      void *arg;
+    } unwind_ptr;
+    struct {
+      ENUM_BF (specbind_tag) kind : CHAR_BIT;
+      void (*func) (int);
+      int arg;
+    } unwind_int;
+    struct {
+      ENUM_BF (specbind_tag) kind : CHAR_BIT;
+      void (*func) (void);
+    } unwind_void;
+    struct {
+      ENUM_BF (specbind_tag) kind : CHAR_BIT;
+      /* `where' is not used in the case of SPECPDL_LET.  */
+      Lisp_Object symbol, old_value, where;
+    } let;
+    struct {
+      ENUM_BF (specbind_tag) kind : CHAR_BIT;
+      bool_bf debug_on_exit : 1;
+      Lisp_Object function;
+      Lisp_Object *args;
+      ptrdiff_t nargs;
+    } bt;
+  };
+
+extern union specbinding *specpdl;
+extern union specbinding *specpdl_ptr;
+extern ptrdiff_t specpdl_size;
+
+INLINE ptrdiff_t
+SPECPDL_INDEX (void)
+{
+  return specpdl_ptr - specpdl;
+}
+
+/* This structure helps implement the `catch/throw' and `condition-case/signal'
+   control structures.  A struct handler contains all the information needed to
+   restore the state of the interpreter after a non-local jump.
+
+   handler structures are chained together in a doubly linked list; the `next'
+   member points to the next outer catchtag and the `nextfree' member points in
+   the other direction to the next inner element (which is typically the next
+   free element since we mostly use it on the deepest handler).
+
+   A call like (throw TAG VAL) searches for a catchtag whose `tag_or_ch'
+   member is TAG, and then unbinds to it.  The `val' member is used to
+   hold VAL while the stack is unwound; `val' is returned as the value
+   of the catch form.
+
+   All the other members are concerned with restoring the interpreter
+   state.
+
+   Members are volatile if their values need to survive _longjmp when
+   a 'struct handler' is a local variable.  */
+
+enum handlertype { CATCHER, CONDITION_CASE };
+
+struct handler
+{
+  enum handlertype type;
+  Lisp_Object tag_or_ch;
+  Lisp_Object val;
+  struct handler *next;
+  struct handler *nextfree;
+
+  /* The bytecode interpreter can have several handlers active at the same
+     time, so when we longjmp to one of them, it needs to know which handler
+     this was and what was the corresponding internal state.  This is stored
+     here, and when we longjmp we make sure that handlerlist points to the
+     proper handler.  */
+  Lisp_Object *bytecode_top;
+  int bytecode_dest;
+
+  /* Most global vars are reset to their value via the specpdl mechanism,
+     but a few others are handled by storing their value here.  */
+#if true /* GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS, but defined later.  */
+  struct gcpro *gcpro;
+#endif
+  sys_jmp_buf jmp;
+  EMACS_INT lisp_eval_depth;
+  ptrdiff_t pdlcount;
+  int poll_suppress_count;
+  int interrupt_input_blocked;
+  struct byte_stack *byte_stack;
+};
+
+/* Fill in the components of c, and put it on the list.  */
+#define PUSH_HANDLER(c, tag_ch_val, handlertype)       \
+  if (handlerlist->nextfree)                           \
+    (c) = handlerlist->nextfree;                       \
+  else                                                 \
+    {                                                  \
+      (c) = xmalloc (sizeof (struct handler));         \
+      (c)->nextfree = NULL;                            \
+      handlerlist->nextfree = (c);                     \
+    }                                                  \
+  (c)->type = (handlertype);                           \
+  (c)->tag_or_ch = (tag_ch_val);                       \
+  (c)->val = Qnil;                                     \
+  (c)->next = handlerlist;                             \
+  (c)->lisp_eval_depth = lisp_eval_depth;              \
+  (c)->pdlcount = SPECPDL_INDEX ();                    \
+  (c)->poll_suppress_count = poll_suppress_count;      \
+  (c)->interrupt_input_blocked = interrupt_input_blocked;\
+  (c)->gcpro = gcprolist;                              \
+  (c)->byte_stack = byte_stack_list;                   \
+  handlerlist = (c);
+
+
+extern Lisp_Object memory_signal_data;
+
+/* An address near the bottom of the stack.
+   Tells GC how to save a copy of the stack.  */
+extern char *stack_bottom;
+
+/* Check quit-flag and quit if it is non-nil.
+   Typing C-g does not directly cause a quit; it only sets Vquit_flag.
+   So the program needs to do QUIT at times when it is safe to quit.
+   Every loop that might run for a long time or might not exit
+   ought to do QUIT at least once, at a safe place.
+   Unless that is impossible, of course.
+   But it is very desirable to avoid creating loops where QUIT is impossible.
+
+   Exception: if you set immediate_quit to true,
+   then the handler that responds to the C-g does the quit itself.
+   This is a good thing to do around a loop that has no side effects
+   and (in particular) cannot call arbitrary Lisp code.
+
+   If quit-flag is set to `kill-emacs' the SIGINT handler has received
+   a request to exit Emacs when it is safe to do.  */
+
+extern void process_pending_signals (void);
+extern bool volatile pending_signals;
+
+extern void process_quit_flag (void);
+#define QUIT                                           \
+  do {                                                 \
+    if (!NILP (Vquit_flag) && NILP (Vinhibit_quit))    \
+      process_quit_flag ();                            \
+    else if (pending_signals)                          \
+      process_pending_signals ();                      \
+  } while (false)
+
+
+/* True if ought to quit now.  */
+
+#define QUITP (!NILP (Vquit_flag) && NILP (Vinhibit_quit))
+
+extern Lisp_Object Vascii_downcase_table;
+extern Lisp_Object Vascii_canon_table;
+
+/* Structure for recording stack slots that need marking.  */
+
+/* This is a chain of structures, each of which points at a Lisp_Object
+   variable whose value should be marked in garbage collection.
+   Normally every link of the chain is an automatic variable of a function,
+   and its `val' points to some argument or local variable of the function.
+   On exit to the function, the chain is set back to the value it had on entry.
+   This way, no link remains in the chain when the stack frame containing the
+   link disappears.
+
+   Every function that can call Feval must protect in this fashion all
+   Lisp_Object variables whose contents will be used again.  */
+
+extern struct gcpro *gcprolist;
+
+struct gcpro
+{
+  struct gcpro *next;
+
+  /* Address of first protected variable.  */
+  volatile Lisp_Object *var;
+
+  /* Number of consecutive protected variables.  */
+  ptrdiff_t nvars;
+
+#ifdef DEBUG_GCPRO
+  /* File name where this record is used.  */
+  const char *name;
+
+  /* Line number in this file.  */
+  int lineno;
+
+  /* Index in the local chain of records.  */
+  int idx;
+
+  /* Nesting level.  */
+  int level;
+#endif
+};
+
+/* Values of GC_MARK_STACK during compilation:
+
+   0   Use GCPRO as before
+   1   Do the real thing, make GCPROs and UNGCPRO no-ops.
+   2    Mark the stack, and check that everything GCPRO'd is
+       marked.
+   3   Mark using GCPRO's, mark stack last, and count how many
+       dead objects are kept alive.
+
+   Formerly, method 0 was used.  Currently, method 1 is used unless
+   otherwise specified by hand when building, e.g.,
+   "make CPPFLAGS='-DGC_MARK_STACK=GC_USE_GCPROS_AS_BEFORE'".
+   Methods 2 and 3 are present mainly to debug the transition from 0 to 1.  */
+
+#define GC_USE_GCPROS_AS_BEFORE                0
+#define GC_MAKE_GCPROS_NOOPS           1
+#define GC_MARK_STACK_CHECK_GCPROS     2
+#define GC_USE_GCPROS_CHECK_ZOMBIES    3
+
+#ifndef GC_MARK_STACK
+#define GC_MARK_STACK GC_MAKE_GCPROS_NOOPS
+#endif
+
+/* Whether we do the stack marking manually.  */
+#define BYTE_MARK_STACK !(GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS                
\
+                         || GC_MARK_STACK == GC_MARK_STACK_CHECK_GCPROS)
+
+
+#if GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS
+
+/* Do something silly with gcproN vars just so gcc shuts up.  */
+/* You get warnings from MIPSPro...  */
+
+#define GCPRO1(varname) ((void) gcpro1)
+#define GCPRO2(varname1, varname2) ((void) gcpro2, (void) gcpro1)
+#define GCPRO3(varname1, varname2, varname3) \
+  ((void) gcpro3, (void) gcpro2, (void) gcpro1)
+#define GCPRO4(varname1, varname2, varname3, varname4) \
+  ((void) gcpro4, (void) gcpro3, (void) gcpro2, (void) gcpro1)
+#define GCPRO5(varname1, varname2, varname3, varname4, varname5) \
+  ((void) gcpro5, (void) gcpro4, (void) gcpro3, (void) gcpro2, (void) gcpro1)
+#define GCPRO6(varname1, varname2, varname3, varname4, varname5, varname6) \
+  ((void) gcpro6, (void) gcpro5, (void) gcpro4, (void) gcpro3, (void) gcpro2, \
+   (void) gcpro1)
+#define GCPRO7(a, b, c, d, e, f, g) (GCPRO6 (a, b, c, d, e, f), (void) gcpro7)
+#define UNGCPRO ((void) 0)
+
+#else /* GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS */
+
+#ifndef DEBUG_GCPRO
+
+#define GCPRO1(a)                                                      \
+  { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1;      \
+    gcprolist = &gcpro1; }
+
+#define GCPRO2(a, b)                                                   \
+  { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1;      \
+    gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1;                
\
+    gcprolist = &gcpro2; }
+
+#define GCPRO3(a, b, c)                                                        
\
+  { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1;      \
+    gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1;                
\
+    gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1;                
\
+    gcprolist = &gcpro3; }
+
+#define GCPRO4(a, b, c, d)                                             \
+  { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1;      \
+    gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1;                
\
+    gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1;                
\
+    gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1;                
\
+    gcprolist = &gcpro4; }
+
+#define GCPRO5(a, b, c, d, e)                                          \
+  { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1;      \
+    gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1;                
\
+    gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1;                
\
+    gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1;                
\
+    gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1;                
\
+    gcprolist = &gcpro5; }
+
+#define GCPRO6(a, b, c, d, e, f)                                       \
+  { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1;      \
+    gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1;                
\
+    gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1;                
\
+    gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1;                
\
+    gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1;                
\
+    gcpro6.next = &gcpro5; gcpro6.var = &(f); gcpro6.nvars = 1;                
\
+    gcprolist = &gcpro6; }
+
+#define GCPRO7(a, b, c, d, e, f, g)                                    \
+  { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1;      \
+    gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1;                
\
+    gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1;                
\
+    gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1;                
\
+    gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1;                
\
+    gcpro6.next = &gcpro5; gcpro6.var = &(f); gcpro6.nvars = 1;                
\
+    gcpro7.next = &gcpro6; gcpro7.var = &(g); gcpro7.nvars = 1;                
\
+    gcprolist = &gcpro7; }
+
+#define UNGCPRO (gcprolist = gcpro1.next)
+
+#else /* !DEBUG_GCPRO */
+
+extern int gcpro_level;
+
+#define GCPRO1(a)                                                      \
+  { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1;      \
+    gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1;  \
+    gcpro1.level = gcpro_level++;                                      \
+    gcprolist = &gcpro1; }
+
+#define GCPRO2(a, b)                                                   \
+  { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1;      \
+    gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1;  \
+    gcpro1.level = gcpro_level;                                                
\
+    gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1;                
\
+    gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2;  \
+    gcpro2.level = gcpro_level++;                                      \
+    gcprolist = &gcpro2; }
+
+#define GCPRO3(a, b, c)                                                        
\
+  { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1;      \
+    gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1;  \
+    gcpro1.level = gcpro_level;                                                
\
+    gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1;                
\
+    gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2;  \
+    gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1;                
\
+    gcpro3.name = __FILE__; gcpro3.lineno = __LINE__; gcpro3.idx = 3;  \
+    gcpro3.level = gcpro_level++;                                      \
+    gcprolist = &gcpro3; }
+
+#define GCPRO4(a, b, c, d)                                             \
+  { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1;      \
+    gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1;  \
+    gcpro1.level = gcpro_level;                                                
\
+    gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1;                
\
+    gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2;  \
+    gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1;                
\
+    gcpro3.name = __FILE__; gcpro3.lineno = __LINE__; gcpro3.idx = 3;  \
+    gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1;                
\
+    gcpro4.name = __FILE__; gcpro4.lineno = __LINE__; gcpro4.idx = 4;  \
+    gcpro4.level = gcpro_level++;                                      \
+    gcprolist = &gcpro4; }
+
+#define GCPRO5(a, b, c, d, e)                                          \
+  { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1;      \
+    gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1;  \
+    gcpro1.level = gcpro_level;                                                
\
+    gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1;                
\
+    gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2;  \
+    gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1;                
\
+    gcpro3.name = __FILE__; gcpro3.lineno = __LINE__; gcpro3.idx = 3;  \
+    gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1;                
\
+    gcpro4.name = __FILE__; gcpro4.lineno = __LINE__; gcpro4.idx = 4;  \
+    gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1;                
\
+    gcpro5.name = __FILE__; gcpro5.lineno = __LINE__; gcpro5.idx = 5;  \
+    gcpro5.level = gcpro_level++;                                      \
+    gcprolist = &gcpro5; }
+
+#define GCPRO6(a, b, c, d, e, f)                                       \
+  { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1;      \
+    gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1;  \
+    gcpro1.level = gcpro_level;                                                
\
+    gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1;                
\
+    gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2;  \
+    gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1;                
\
+    gcpro3.name = __FILE__; gcpro3.lineno = __LINE__; gcpro3.idx = 3;  \
+    gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1;                
\
+    gcpro4.name = __FILE__; gcpro4.lineno = __LINE__; gcpro4.idx = 4;  \
+    gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1;                
\
+    gcpro5.name = __FILE__; gcpro5.lineno = __LINE__; gcpro5.idx = 5;  \
+    gcpro6.next = &gcpro5; gcpro6.var = &(f); gcpro6.nvars = 1;                
\
+    gcpro6.name = __FILE__; gcpro6.lineno = __LINE__; gcpro6.idx = 6;  \
+    gcpro6.level = gcpro_level++;                                      \
+    gcprolist = &gcpro6; }
+
+#define GCPRO7(a, b, c, d, e, f, g)                                    \
+  { gcpro1.next = gcprolist; gcpro1.var = &(a); gcpro1.nvars = 1;      \
+    gcpro1.name = __FILE__; gcpro1.lineno = __LINE__; gcpro1.idx = 1;  \
+    gcpro1.level = gcpro_level;                                                
\
+    gcpro2.next = &gcpro1; gcpro2.var = &(b); gcpro2.nvars = 1;                
\
+    gcpro2.name = __FILE__; gcpro2.lineno = __LINE__; gcpro2.idx = 2;  \
+    gcpro3.next = &gcpro2; gcpro3.var = &(c); gcpro3.nvars = 1;                
\
+    gcpro3.name = __FILE__; gcpro3.lineno = __LINE__; gcpro3.idx = 3;  \
+    gcpro4.next = &gcpro3; gcpro4.var = &(d); gcpro4.nvars = 1;                
\
+    gcpro4.name = __FILE__; gcpro4.lineno = __LINE__; gcpro4.idx = 4;  \
+    gcpro5.next = &gcpro4; gcpro5.var = &(e); gcpro5.nvars = 1;                
\
+    gcpro5.name = __FILE__; gcpro5.lineno = __LINE__; gcpro5.idx = 5;  \
+    gcpro6.next = &gcpro5; gcpro6.var = &(f); gcpro6.nvars = 1;                
\
+    gcpro6.name = __FILE__; gcpro6.lineno = __LINE__; gcpro6.idx = 6;  \
+    gcpro7.next = &gcpro6; gcpro7.var = &(g); gcpro7.nvars = 1;                
\
+    gcpro7.name = __FILE__; gcpro7.lineno = __LINE__; gcpro7.idx = 7;  \
+    gcpro7.level = gcpro_level++;                                      \
+    gcprolist = &gcpro7; }
+
+#define UNGCPRO                                        \
+  (--gcpro_level != gcpro1.level               \
+   ? emacs_abort ()                            \
+   : (void) (gcprolist = gcpro1.next))
+
+#endif /* DEBUG_GCPRO */
+#endif /* GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS */
+
+
+/* Evaluate expr, UNGCPRO, and then return the value of expr.  */
+#define RETURN_UNGCPRO(expr)                   \
+  do                                           \
+    {                                          \
+      Lisp_Object ret_ungc_val;                        \
+      ret_ungc_val = (expr);                   \
+      UNGCPRO;                                 \
+      return ret_ungc_val;                     \
+    }                                          \
+  while (false)
+
+/* Call staticpro (&var) to protect static variable `var'.  */
+
+void staticpro (Lisp_Object *);
+
+/* Forward declarations for prototypes.  */
+struct window;
+struct frame;
+
+/* Copy COUNT Lisp_Objects from ARGS to contents of V starting from OFFSET.  */
+
+INLINE void
+vcopy (Lisp_Object v, ptrdiff_t offset, Lisp_Object *args, ptrdiff_t count)
+{
+  eassert (0 <= offset && 0 <= count && offset + count <= ASIZE (v));
+  memcpy (XVECTOR (v)->contents + offset, args, count * sizeof *args);
+}
+
+/* Functions to modify hash tables.  */
+
+INLINE void
+set_hash_key_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val)
+{
+  gc_aset (h->key_and_value, 2 * idx, val);
+}
+
+INLINE void
+set_hash_value_slot (struct Lisp_Hash_Table *h, ptrdiff_t idx, Lisp_Object val)
+{
+  gc_aset (h->key_and_value, 2 * idx + 1, val);
+}
+
+/* Use these functions to set Lisp_Object
+   or pointer slots of struct Lisp_Symbol.  */
+
+INLINE void
+set_symbol_function (Lisp_Object sym, Lisp_Object function)
+{
+  XSYMBOL (sym)->function = function;
+}
+
+INLINE void
+set_symbol_plist (Lisp_Object sym, Lisp_Object plist)
+{
+  XSYMBOL (sym)->plist = plist;
+}
+
+INLINE void
+set_symbol_next (Lisp_Object sym, struct Lisp_Symbol *next)
+{
+  XSYMBOL (sym)->next = next;
+}
+
+/* Buffer-local (also frame-local) variable access functions.  */
+
+INLINE int
+blv_found (struct Lisp_Buffer_Local_Value *blv)
+{
+  eassert (blv->found == !EQ (blv->defcell, blv->valcell));
+  return blv->found;
+}
+
+/* Set overlay's property list.  */
+
+INLINE void
+set_overlay_plist (Lisp_Object overlay, Lisp_Object plist)
+{
+  XOVERLAY (overlay)->plist = plist;
+}
+
+/* Get text properties of S.  */
+
+INLINE INTERVAL
+string_intervals (Lisp_Object s)
+{
+  return XSTRING (s)->intervals;
+}
+
+/* Set text properties of S to I.  */
+
+INLINE void
+set_string_intervals (Lisp_Object s, INTERVAL i)
+{
+  XSTRING (s)->intervals = i;
+}
+
+/* Set a Lisp slot in TABLE to VAL.  Most code should use this instead
+   of setting slots directly.  */
+
+INLINE void
+set_char_table_defalt (Lisp_Object table, Lisp_Object val)
+{
+  XCHAR_TABLE (table)->defalt = val;
+}
+INLINE void
+set_char_table_purpose (Lisp_Object table, Lisp_Object val)
+{
+  XCHAR_TABLE (table)->purpose = val;
+}
+
+/* Set different slots in (sub)character tables.  */
+
+INLINE void
+set_char_table_extras (Lisp_Object table, ptrdiff_t idx, Lisp_Object val)
+{
+  eassert (0 <= idx && idx < CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (table)));
+  XCHAR_TABLE (table)->extras[idx] = val;
+}
+
+INLINE void
+set_char_table_contents (Lisp_Object table, ptrdiff_t idx, Lisp_Object val)
+{
+  eassert (0 <= idx && idx < (1 << CHARTAB_SIZE_BITS_0));
+  XCHAR_TABLE (table)->contents[idx] = val;
+}
+
+INLINE void
+set_sub_char_table_contents (Lisp_Object table, ptrdiff_t idx, Lisp_Object val)
+{
+  XSUB_CHAR_TABLE (table)->contents[idx] = val;
+}
+
+/* Defined in data.c.  */
+extern Lisp_Object indirect_function (Lisp_Object);
+extern Lisp_Object find_symbol_value (Lisp_Object);
+enum Arith_Comparison {
+  ARITH_EQUAL,
+  ARITH_NOTEQUAL,
+  ARITH_LESS,
+  ARITH_GRTR,
+  ARITH_LESS_OR_EQUAL,
+  ARITH_GRTR_OR_EQUAL
+};
+extern Lisp_Object arithcompare (Lisp_Object num1, Lisp_Object num2,
+                                 enum Arith_Comparison comparison);
+
+/* Convert the integer I to an Emacs representation, either the integer
+   itself, or a cons of two or three integers, or if all else fails a float.
+   I should not have side effects.  */
+#define INTEGER_TO_CONS(i)                                         \
+  (! FIXNUM_OVERFLOW_P (i)                                         \
+   ? make_number (i)                                               \
+   : ! ((FIXNUM_OVERFLOW_P (INTMAX_MIN >> 16)                      \
+        || FIXNUM_OVERFLOW_P (UINTMAX_MAX >> 16))                  \
+       && FIXNUM_OVERFLOW_P ((i) >> 16))                           \
+   ? Fcons (make_number ((i) >> 16), make_number ((i) & 0xffff))    \
+   : ! ((FIXNUM_OVERFLOW_P (INTMAX_MIN >> 16 >> 24)                \
+        || FIXNUM_OVERFLOW_P (UINTMAX_MAX >> 16 >> 24))            \
+       && FIXNUM_OVERFLOW_P ((i) >> 16 >> 24))                     \
+   ? Fcons (make_number ((i) >> 16 >> 24),                         \
+           Fcons (make_number ((i) >> 16 & 0xffffff),              \
+                  make_number ((i) & 0xffff)))                     \
+   : make_float (i))
+
+/* Convert the Emacs representation CONS back to an integer of type
+   TYPE, storing the result the variable VAR.  Signal an error if CONS
+   is not a valid representation or is out of range for TYPE.  */
+#define CONS_TO_INTEGER(cons, type, var)                               \
+ (TYPE_SIGNED (type)                                                   \
+  ? ((var) = cons_to_signed (cons, TYPE_MINIMUM (type), TYPE_MAXIMUM (type))) \
+  : ((var) = cons_to_unsigned (cons, TYPE_MAXIMUM (type))))
+extern intmax_t cons_to_signed (Lisp_Object, intmax_t, intmax_t);
+extern uintmax_t cons_to_unsigned (Lisp_Object, uintmax_t);
+
+extern struct Lisp_Symbol *indirect_variable (struct Lisp_Symbol *);
+extern _Noreturn void args_out_of_range (Lisp_Object, Lisp_Object);
+extern _Noreturn void args_out_of_range_3 (Lisp_Object, Lisp_Object,
+                                          Lisp_Object);
+extern Lisp_Object do_symval_forwarding (union Lisp_Fwd *);
+extern void set_internal (Lisp_Object, Lisp_Object, Lisp_Object, bool);
+extern void syms_of_data (void);
+extern void swap_in_global_binding (struct Lisp_Symbol *);
+
+/* Defined in cmds.c */
+extern void syms_of_cmds (void);
+extern void keys_of_cmds (void);
+
+/* Defined in coding.c.  */
+extern Lisp_Object detect_coding_system (const unsigned char *, ptrdiff_t,
+                                         ptrdiff_t, bool, bool, Lisp_Object);
+extern void init_coding (void);
+extern void init_coding_once (void);
+extern void syms_of_coding (void);
+
+/* Defined in character.c.  */
+extern ptrdiff_t chars_in_text (const unsigned char *, ptrdiff_t);
+extern ptrdiff_t multibyte_chars_in_text (const unsigned char *, ptrdiff_t);
+extern void syms_of_character (void);
+
+/* Defined in charset.c.  */
+extern void init_charset (void);
+extern void init_charset_once (void);
+extern void syms_of_charset (void);
+/* Structure forward declarations.  */
+struct charset;
+
+/* Defined in syntax.c.  */
+extern void init_syntax_once (void);
+extern void syms_of_syntax (void);
+
+/* Defined in fns.c.  */
+enum { NEXT_ALMOST_PRIME_LIMIT = 11 };
+extern EMACS_INT next_almost_prime (EMACS_INT) ATTRIBUTE_CONST;
+extern Lisp_Object larger_vector (Lisp_Object, ptrdiff_t, ptrdiff_t);
+extern void sweep_weak_hash_tables (void);
+EMACS_UINT hash_string (char const *, ptrdiff_t);
+EMACS_UINT sxhash (Lisp_Object, int);
+Lisp_Object make_hash_table (struct hash_table_test, Lisp_Object, Lisp_Object,
+                             Lisp_Object, Lisp_Object);
+ptrdiff_t hash_lookup (struct Lisp_Hash_Table *, Lisp_Object, EMACS_UINT *);
+ptrdiff_t hash_put (struct Lisp_Hash_Table *, Lisp_Object, Lisp_Object,
+                   EMACS_UINT);
+extern struct hash_table_test hashtest_eql, hashtest_equal;
+extern void validate_subarray (Lisp_Object, Lisp_Object, Lisp_Object,
+                              ptrdiff_t, ptrdiff_t *, ptrdiff_t *);
+extern Lisp_Object substring_both (Lisp_Object, ptrdiff_t, ptrdiff_t,
+                                  ptrdiff_t, ptrdiff_t);
+extern Lisp_Object merge (Lisp_Object, Lisp_Object, Lisp_Object);
+extern Lisp_Object do_yes_or_no_p (Lisp_Object);
+extern Lisp_Object concat2 (Lisp_Object, Lisp_Object);
+extern Lisp_Object concat3 (Lisp_Object, Lisp_Object, Lisp_Object);
+extern Lisp_Object nconc2 (Lisp_Object, Lisp_Object);
+extern Lisp_Object assq_no_quit (Lisp_Object, Lisp_Object);
+extern Lisp_Object assoc_no_quit (Lisp_Object, Lisp_Object);
+extern void clear_string_char_byte_cache (void);
+extern ptrdiff_t string_char_to_byte (Lisp_Object, ptrdiff_t);
+extern ptrdiff_t string_byte_to_char (Lisp_Object, ptrdiff_t);
+extern Lisp_Object string_to_multibyte (Lisp_Object);
+extern Lisp_Object string_make_unibyte (Lisp_Object);
+extern void syms_of_fns (void);
+
+/* Defined in floatfns.c.  */
+extern void syms_of_floatfns (void);
+extern Lisp_Object fmod_float (Lisp_Object x, Lisp_Object y);
+
+/* Defined in fringe.c.  */
+extern void syms_of_fringe (void);
+extern void init_fringe (void);
+#ifdef HAVE_WINDOW_SYSTEM
+extern void mark_fringe_data (void);
+extern void init_fringe_once (void);
+#endif /* HAVE_WINDOW_SYSTEM */
+
+/* Defined in image.c.  */
+extern int x_bitmap_mask (struct frame *, ptrdiff_t);
+extern void reset_image_types (void);
+extern void syms_of_image (void);
+
+/* Defined in insdel.c.  */
+extern void move_gap_both (ptrdiff_t, ptrdiff_t);
+extern _Noreturn void buffer_overflow (void);
+extern void make_gap (ptrdiff_t);
+extern void make_gap_1 (struct buffer *, ptrdiff_t);
+extern ptrdiff_t copy_text (const unsigned char *, unsigned char *,
+                           ptrdiff_t, bool, bool);
+extern int count_combining_before (const unsigned char *,
+                                  ptrdiff_t, ptrdiff_t, ptrdiff_t);
+extern int count_combining_after (const unsigned char *,
+                                 ptrdiff_t, ptrdiff_t, ptrdiff_t);
+extern void insert (const char *, ptrdiff_t);
+extern void insert_and_inherit (const char *, ptrdiff_t);
+extern void insert_1_both (const char *, ptrdiff_t, ptrdiff_t,
+                          bool, bool, bool);
+extern void insert_from_gap (ptrdiff_t, ptrdiff_t, bool text_at_gap_tail);
+extern void insert_from_string (Lisp_Object, ptrdiff_t, ptrdiff_t,
+                               ptrdiff_t, ptrdiff_t, bool);
+extern void insert_from_buffer (struct buffer *, ptrdiff_t, ptrdiff_t, bool);
+extern void insert_char (int);
+extern void insert_string (const char *);
+extern void insert_before_markers (const char *, ptrdiff_t);
+extern void insert_before_markers_and_inherit (const char *, ptrdiff_t);
+extern void insert_from_string_before_markers (Lisp_Object, ptrdiff_t,
+                                              ptrdiff_t, ptrdiff_t,
+                                              ptrdiff_t, bool);
+extern void del_range (ptrdiff_t, ptrdiff_t);
+extern Lisp_Object del_range_1 (ptrdiff_t, ptrdiff_t, bool, bool);
+extern void del_range_byte (ptrdiff_t, ptrdiff_t, bool);
+extern void del_range_both (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t, bool);
+extern Lisp_Object del_range_2 (ptrdiff_t, ptrdiff_t,
+                               ptrdiff_t, ptrdiff_t, bool);
+extern void modify_text (ptrdiff_t, ptrdiff_t);
+extern void prepare_to_modify_buffer (ptrdiff_t, ptrdiff_t, ptrdiff_t *);
+extern void prepare_to_modify_buffer_1 (ptrdiff_t, ptrdiff_t, ptrdiff_t *);
+extern void invalidate_buffer_caches (struct buffer *, ptrdiff_t, ptrdiff_t);
+extern void signal_after_change (ptrdiff_t, ptrdiff_t, ptrdiff_t);
+extern void adjust_after_insert (ptrdiff_t, ptrdiff_t, ptrdiff_t,
+                                ptrdiff_t, ptrdiff_t);
+extern void adjust_markers_for_delete (ptrdiff_t, ptrdiff_t,
+                                      ptrdiff_t, ptrdiff_t);
+extern void replace_range (ptrdiff_t, ptrdiff_t, Lisp_Object, bool, bool, 
bool);
+extern void replace_range_2 (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t,
+                            const char *, ptrdiff_t, ptrdiff_t, bool);
+extern void syms_of_insdel (void);
+
+/* Defined in dispnew.c.  */
+#if (defined PROFILING \
+     && (defined __FreeBSD__ || defined GNU_LINUX || defined __MINGW32__))
+_Noreturn void __executable_start (void);
+#endif
+extern Lisp_Object Vwindow_system;
+extern Lisp_Object sit_for (Lisp_Object, bool, int);
+
+/* Defined in xdisp.c.  */
+extern bool noninteractive_need_newline;
+extern Lisp_Object echo_area_buffer[2];
+extern void add_to_log (const char *, Lisp_Object, Lisp_Object);
+extern void check_message_stack (void);
+extern void setup_echo_area_for_printing (bool);
+extern bool push_message (void);
+extern void pop_message_unwind (void);
+extern Lisp_Object restore_message_unwind (Lisp_Object);
+extern void restore_message (void);
+extern Lisp_Object current_message (void);
+extern void clear_message (bool, bool);
+extern void message (const char *, ...) ATTRIBUTE_FORMAT_PRINTF (1, 2);
+extern void message1 (const char *);
+extern void message1_nolog (const char *);
+extern void message3 (Lisp_Object);
+extern void message3_nolog (Lisp_Object);
+extern void message_dolog (const char *, ptrdiff_t, bool, bool);
+extern void message_with_string (const char *, Lisp_Object, bool);
+extern void message_log_maybe_newline (void);
+extern void update_echo_area (void);
+extern void truncate_echo_area (ptrdiff_t);
+extern void redisplay (void);
+
+void set_frame_cursor_types (struct frame *, Lisp_Object);
+extern void syms_of_xdisp (void);
+extern void init_xdisp (void);
+extern Lisp_Object safe_eval (Lisp_Object);
+extern bool pos_visible_p (struct window *, ptrdiff_t, int *,
+                          int *, int *, int *, int *, int *);
+
+/* Defined in xsettings.c.  */
+extern void syms_of_xsettings (void);
+
+/* Defined in vm-limit.c.  */
+extern void memory_warnings (void *, void (*warnfun) (const char *));
+
+/* Defined in character.c.  */
+extern void parse_str_as_multibyte (const unsigned char *, ptrdiff_t,
+                                   ptrdiff_t *, ptrdiff_t *);
+
+/* Defined in alloc.c.  */
+extern void check_pure_size (void);
+extern void free_misc (Lisp_Object);
+extern void allocate_string_data (struct Lisp_String *, EMACS_INT, EMACS_INT);
+extern void malloc_warning (const char *);
+extern _Noreturn void memory_full (size_t);
+extern _Noreturn void buffer_memory_full (ptrdiff_t);
+extern bool survives_gc_p (Lisp_Object);
+extern void mark_object (Lisp_Object);
+#if defined REL_ALLOC && !defined SYSTEM_MALLOC && !defined HYBRID_MALLOC
+extern void refill_memory_reserve (void);
+#endif
+extern const char *pending_malloc_warning;
+extern Lisp_Object zero_vector;
+extern Lisp_Object *stack_base;
+extern EMACS_INT consing_since_gc;
+extern EMACS_INT gc_relative_threshold;
+extern EMACS_INT memory_full_cons_threshold;
+extern Lisp_Object list1 (Lisp_Object);
+extern Lisp_Object list2 (Lisp_Object, Lisp_Object);
+extern Lisp_Object list3 (Lisp_Object, Lisp_Object, Lisp_Object);
+extern Lisp_Object list4 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
+extern Lisp_Object list5 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object,
+                         Lisp_Object);
+enum constype {CONSTYPE_HEAP, CONSTYPE_PURE};
+extern Lisp_Object listn (enum constype, ptrdiff_t, Lisp_Object, ...);
+
+/* Build a frequently used 2/3/4-integer lists.  */
+
+INLINE Lisp_Object
+list2i (EMACS_INT x, EMACS_INT y)
+{
+  return list2 (make_number (x), make_number (y));
+}
+
+INLINE Lisp_Object
+list3i (EMACS_INT x, EMACS_INT y, EMACS_INT w)
+{
+  return list3 (make_number (x), make_number (y), make_number (w));
+}
+
+INLINE Lisp_Object
+list4i (EMACS_INT x, EMACS_INT y, EMACS_INT w, EMACS_INT h)
+{
+  return list4 (make_number (x), make_number (y),
+               make_number (w), make_number (h));
+}
+
+extern Lisp_Object make_uninit_bool_vector (EMACS_INT);
+extern Lisp_Object bool_vector_fill (Lisp_Object, Lisp_Object);
+extern _Noreturn void string_overflow (void);
+extern Lisp_Object make_string (const char *, ptrdiff_t);
+extern Lisp_Object make_formatted_string (char *, const char *, ...)
+  ATTRIBUTE_FORMAT_PRINTF (2, 3);
+extern Lisp_Object make_unibyte_string (const char *, ptrdiff_t);
+
+/* Make unibyte string from C string when the length isn't known.  */
+
+INLINE Lisp_Object
+build_unibyte_string (const char *str)
+{
+  return make_unibyte_string (str, strlen (str));
+}
+
+extern Lisp_Object make_multibyte_string (const char *, ptrdiff_t, ptrdiff_t);
+extern Lisp_Object make_event_array (ptrdiff_t, Lisp_Object *);
+extern Lisp_Object make_uninit_string (EMACS_INT);
+extern Lisp_Object make_uninit_multibyte_string (EMACS_INT, EMACS_INT);
+extern Lisp_Object make_string_from_bytes (const char *, ptrdiff_t, ptrdiff_t);
+extern Lisp_Object make_specified_string (const char *,
+                                         ptrdiff_t, ptrdiff_t, bool);
+extern Lisp_Object make_pure_string (const char *, ptrdiff_t, ptrdiff_t, bool);
+extern Lisp_Object make_pure_c_string (const char *, ptrdiff_t);
+
+/* Make a string allocated in pure space, use STR as string data.  */
+
+INLINE Lisp_Object
+build_pure_c_string (const char *str)
+{
+  return make_pure_c_string (str, strlen (str));
+}
+
+/* Make a string from the data at STR, treating it as multibyte if the
+   data warrants.  */
+
+INLINE Lisp_Object
+build_string (const char *str)
+{
+  return make_string (str, strlen (str));
+}
+
+extern Lisp_Object pure_cons (Lisp_Object, Lisp_Object);
+extern void make_byte_code (struct Lisp_Vector *);
+extern struct Lisp_Vector *allocate_vector (EMACS_INT);
+
+/* Make an uninitialized vector for SIZE objects.  NOTE: you must
+   be sure that GC cannot happen until the vector is completely
+   initialized.  E.g. the following code is likely to crash:
+
+   v = make_uninit_vector (3);
+   ASET (v, 0, obj0);
+   ASET (v, 1, Ffunction_can_gc ());
+   ASET (v, 2, obj1);  */
+
+INLINE Lisp_Object
+make_uninit_vector (ptrdiff_t size)
+{
+  Lisp_Object v;
+  struct Lisp_Vector *p;
+
+  p = allocate_vector (size);
+  XSETVECTOR (v, p);
+  return v;
+}
+
+/* Like above, but special for sub char-tables.  */
+
+INLINE Lisp_Object
+make_uninit_sub_char_table (int depth, int min_char)
+{
+  int slots = SUB_CHAR_TABLE_OFFSET + chartab_size[depth];
+  Lisp_Object v = make_uninit_vector (slots);
+
+  XSETPVECTYPE (XVECTOR (v), PVEC_SUB_CHAR_TABLE);
+  XSUB_CHAR_TABLE (v)->depth = depth;
+  XSUB_CHAR_TABLE (v)->min_char = min_char;
+  return v;
+}
+
+extern struct Lisp_Vector *allocate_pseudovector (int, int, int,
+                                                 enum pvec_type);
+
+/* Allocate partially initialized pseudovector where all Lisp_Object
+   slots are set to Qnil but the rest (if any) is left uninitialized.  */
+
+#define ALLOCATE_PSEUDOVECTOR(type, field, tag)                               \
+  ((type *) allocate_pseudovector (VECSIZE (type),                    \
+                                  PSEUDOVECSIZE (type, field),        \
+                                  PSEUDOVECSIZE (type, field), tag))
+
+/* Allocate fully initialized pseudovector where all Lisp_Object
+   slots are set to Qnil and the rest (if any) is zeroed.  */
+
+#define ALLOCATE_ZEROED_PSEUDOVECTOR(type, field, tag)                \
+  ((type *) allocate_pseudovector (VECSIZE (type),                    \
+                                  PSEUDOVECSIZE (type, field),        \
+                                  VECSIZE (type), tag))
+
+extern bool gc_in_progress;
+extern bool abort_on_gc;
+extern Lisp_Object make_float (double);
+extern void display_malloc_warning (void);
+extern ptrdiff_t inhibit_garbage_collection (void);
+extern Lisp_Object make_save_int_int_int (ptrdiff_t, ptrdiff_t, ptrdiff_t);
+extern Lisp_Object make_save_obj_obj_obj_obj (Lisp_Object, Lisp_Object,
+                                             Lisp_Object, Lisp_Object);
+extern Lisp_Object make_save_ptr (void *);
+extern Lisp_Object make_save_ptr_int (void *, ptrdiff_t);
+extern Lisp_Object make_save_ptr_ptr (void *, void *);
+extern Lisp_Object make_save_funcptr_ptr_obj (void (*) (void), void *,
+                                             Lisp_Object);
+extern Lisp_Object make_save_memory (Lisp_Object *, ptrdiff_t);
+extern void free_save_value (Lisp_Object);
+extern Lisp_Object build_overlay (Lisp_Object, Lisp_Object, Lisp_Object);
+extern void free_marker (Lisp_Object);
+extern void free_cons (struct Lisp_Cons *);
+extern void init_alloc_once (void);
+extern void init_alloc (void);
+extern void syms_of_alloc (void);
+extern struct buffer * allocate_buffer (void);
+extern int valid_lisp_object_p (Lisp_Object);
+extern int relocatable_string_data_p (const char *);
+#ifdef GC_CHECK_CONS_LIST
+extern void check_cons_list (void);
+#else
+INLINE void (check_cons_list) (void) { lisp_h_check_cons_list (); }
+#endif
+
+#ifdef REL_ALLOC
+/* Defined in ralloc.c.  */
+extern void *r_alloc (void **, size_t) ATTRIBUTE_ALLOC_SIZE ((2));
+extern void r_alloc_free (void **);
+extern void *r_re_alloc (void **, size_t) ATTRIBUTE_ALLOC_SIZE ((2));
+extern void r_alloc_reset_variable (void **, void **);
+extern void r_alloc_inhibit_buffer_relocation (int);
+#endif
+
+/* Defined in chartab.c.  */
+extern Lisp_Object copy_char_table (Lisp_Object);
+extern Lisp_Object char_table_ref_and_range (Lisp_Object, int,
+                                             int *, int *);
+extern void char_table_set_range (Lisp_Object, int, int, Lisp_Object);
+extern void map_char_table (void (*) (Lisp_Object, Lisp_Object,
+                            Lisp_Object),
+                            Lisp_Object, Lisp_Object, Lisp_Object);
+extern void map_char_table_for_charset (void (*c_function) (Lisp_Object, 
Lisp_Object),
+                                       Lisp_Object, Lisp_Object,
+                                       Lisp_Object, struct charset *,
+                                       unsigned, unsigned);
+extern Lisp_Object uniprop_table (Lisp_Object);
+extern void syms_of_chartab (void);
+
+/* Defined in print.c.  */
+extern Lisp_Object Vprin1_to_string_buffer;
+extern void debug_print (Lisp_Object) EXTERNALLY_VISIBLE;
+extern void temp_output_buffer_setup (const char *);
+extern int print_level;
+extern void write_string (const char *);
+extern void print_error_message (Lisp_Object, Lisp_Object, const char *,
+                                Lisp_Object);
+extern Lisp_Object internal_with_output_to_temp_buffer
+        (const char *, Lisp_Object (*) (Lisp_Object), Lisp_Object);
+#define FLOAT_TO_STRING_BUFSIZE 350
+extern int float_to_string (char *, double);
+extern void init_print_once (void);
+extern void syms_of_print (void);
+
+/* Defined in doprnt.c.  */
+extern ptrdiff_t doprnt (char *, ptrdiff_t, const char *, const char *,
+                        va_list);
+extern ptrdiff_t esprintf (char *, char const *, ...)
+  ATTRIBUTE_FORMAT_PRINTF (2, 3);
+extern ptrdiff_t exprintf (char **, ptrdiff_t *, char const *, ptrdiff_t,
+                          char const *, ...)
+  ATTRIBUTE_FORMAT_PRINTF (5, 6);
+extern ptrdiff_t evxprintf (char **, ptrdiff_t *, char const *, ptrdiff_t,
+                           char const *, va_list)
+  ATTRIBUTE_FORMAT_PRINTF (5, 0);
+
+/* Defined in lread.c.  */
+extern Lisp_Object check_obarray (Lisp_Object);
+extern Lisp_Object intern_1 (const char *, ptrdiff_t);
+extern Lisp_Object intern_c_string_1 (const char *, ptrdiff_t);
+extern Lisp_Object intern_driver (Lisp_Object, Lisp_Object, Lisp_Object);
+extern void init_symbol (Lisp_Object, Lisp_Object);
+extern Lisp_Object oblookup (Lisp_Object, const char *, ptrdiff_t, ptrdiff_t);
+INLINE void
+LOADHIST_ATTACH (Lisp_Object x)
+{
+  if (initialized)
+    Vcurrent_load_list = Fcons (x, Vcurrent_load_list);
+}
+extern int openp (Lisp_Object, Lisp_Object, Lisp_Object,
+                  Lisp_Object *, Lisp_Object, bool);
+extern Lisp_Object string_to_number (char const *, int, bool);
+extern void map_obarray (Lisp_Object, void (*) (Lisp_Object, Lisp_Object),
+                         Lisp_Object);
+extern void dir_warning (const char *, Lisp_Object);
+extern void init_obarray (void);
+extern void init_lread (void);
+extern void syms_of_lread (void);
+
+INLINE Lisp_Object
+intern (const char *str)
+{
+  return intern_1 (str, strlen (str));
+}
+
+INLINE Lisp_Object
+intern_c_string (const char *str)
+{
+  return intern_c_string_1 (str, strlen (str));
+}
+
+/* Defined in eval.c.  */
+extern EMACS_INT lisp_eval_depth;
+extern Lisp_Object Vautoload_queue;
+extern Lisp_Object Vrun_hooks;
+extern Lisp_Object Vsignaling_function;
+extern Lisp_Object inhibit_lisp_code;
+extern struct handler *handlerlist;
+
+/* To run a normal hook, use the appropriate function from the list below.
+   The calling convention:
+
+   if (!NILP (Vrun_hooks))
+     call1 (Vrun_hooks, Qmy_funny_hook);
+
+   should no longer be used.  */
+extern void run_hook (Lisp_Object);
+extern void run_hook_with_args_2 (Lisp_Object, Lisp_Object, Lisp_Object);
+extern Lisp_Object run_hook_with_args (ptrdiff_t nargs, Lisp_Object *args,
+                                      Lisp_Object (*funcall)
+                                      (ptrdiff_t nargs, Lisp_Object *args));
+extern _Noreturn void xsignal (Lisp_Object, Lisp_Object);
+extern _Noreturn void xsignal0 (Lisp_Object);
+extern _Noreturn void xsignal1 (Lisp_Object, Lisp_Object);
+extern _Noreturn void xsignal2 (Lisp_Object, Lisp_Object, Lisp_Object);
+extern _Noreturn void xsignal3 (Lisp_Object, Lisp_Object, Lisp_Object,
+                               Lisp_Object);
+extern _Noreturn void signal_error (const char *, Lisp_Object);
+extern Lisp_Object eval_sub (Lisp_Object form);
+extern Lisp_Object apply1 (Lisp_Object, Lisp_Object);
+extern Lisp_Object call0 (Lisp_Object);
+extern Lisp_Object call1 (Lisp_Object, Lisp_Object);
+extern Lisp_Object call2 (Lisp_Object, Lisp_Object, Lisp_Object);
+extern Lisp_Object call3 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
+extern Lisp_Object call4 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, 
Lisp_Object);
+extern Lisp_Object call5 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, 
Lisp_Object, Lisp_Object);
+extern Lisp_Object call6 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, 
Lisp_Object, Lisp_Object, Lisp_Object);
+extern Lisp_Object call7 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object, 
Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
+extern Lisp_Object internal_catch (Lisp_Object, Lisp_Object (*) (Lisp_Object), 
Lisp_Object);
+extern Lisp_Object internal_lisp_condition_case (Lisp_Object, Lisp_Object, 
Lisp_Object);
+extern Lisp_Object internal_condition_case (Lisp_Object (*) (void), 
Lisp_Object, Lisp_Object (*) (Lisp_Object));
+extern Lisp_Object internal_condition_case_1 (Lisp_Object (*) (Lisp_Object), 
Lisp_Object, Lisp_Object, Lisp_Object (*) (Lisp_Object));
+extern Lisp_Object internal_condition_case_2 (Lisp_Object (*) (Lisp_Object, 
Lisp_Object), Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object (*) 
(Lisp_Object));
+extern Lisp_Object internal_condition_case_n
+    (Lisp_Object (*) (ptrdiff_t, Lisp_Object *), ptrdiff_t, Lisp_Object *,
+     Lisp_Object, Lisp_Object (*) (Lisp_Object, ptrdiff_t, Lisp_Object *));
+extern void specbind (Lisp_Object, Lisp_Object);
+extern void record_unwind_protect (void (*) (Lisp_Object), Lisp_Object);
+extern void record_unwind_protect_ptr (void (*) (void *), void *);
+extern void record_unwind_protect_int (void (*) (int), int);
+extern void record_unwind_protect_void (void (*) (void));
+extern void record_unwind_protect_nothing (void);
+extern void clear_unwind_protect (ptrdiff_t);
+extern void set_unwind_protect (ptrdiff_t, void (*) (Lisp_Object), 
Lisp_Object);
+extern void set_unwind_protect_ptr (ptrdiff_t, void (*) (void *), void *);
+extern Lisp_Object unbind_to (ptrdiff_t, Lisp_Object);
+extern _Noreturn void error (const char *, ...) ATTRIBUTE_FORMAT_PRINTF (1, 2);
+extern _Noreturn void verror (const char *, va_list)
+  ATTRIBUTE_FORMAT_PRINTF (1, 0);
+extern void un_autoload (Lisp_Object);
+extern Lisp_Object call_debugger (Lisp_Object arg);
+extern void init_eval_once (void);
+extern Lisp_Object safe_call (ptrdiff_t, Lisp_Object, ...);
+extern Lisp_Object safe_call1 (Lisp_Object, Lisp_Object);
+extern Lisp_Object safe_call2 (Lisp_Object, Lisp_Object, Lisp_Object);
+extern void init_eval (void);
+extern void syms_of_eval (void);
+extern void unwind_body (Lisp_Object);
+extern ptrdiff_t record_in_backtrace (Lisp_Object, Lisp_Object *, ptrdiff_t);
+extern void mark_specpdl (void);
+extern void get_backtrace (Lisp_Object array);
+Lisp_Object backtrace_top_function (void);
+extern bool let_shadows_buffer_binding_p (struct Lisp_Symbol *symbol);
+extern bool let_shadows_global_binding_p (Lisp_Object symbol);
+
+
+/* Defined in editfns.c.  */
+extern void insert1 (Lisp_Object);
+extern Lisp_Object format2 (const char *, Lisp_Object, Lisp_Object);
+extern Lisp_Object save_excursion_save (void);
+extern Lisp_Object save_restriction_save (void);
+extern void save_excursion_restore (Lisp_Object);
+extern void save_restriction_restore (Lisp_Object);
+extern _Noreturn void time_overflow (void);
+extern Lisp_Object make_buffer_string (ptrdiff_t, ptrdiff_t, bool);
+extern Lisp_Object make_buffer_string_both (ptrdiff_t, ptrdiff_t, ptrdiff_t,
+                                           ptrdiff_t, bool);
+extern void init_editfns (void);
+extern void syms_of_editfns (void);
+
+/* Defined in buffer.c.  */
+extern bool mouse_face_overlay_overlaps (Lisp_Object);
+extern _Noreturn void nsberror (Lisp_Object);
+extern void adjust_overlays_for_insert (ptrdiff_t, ptrdiff_t);
+extern void adjust_overlays_for_delete (ptrdiff_t, ptrdiff_t);
+extern void fix_start_end_in_overlays (ptrdiff_t, ptrdiff_t);
+extern void report_overlay_modification (Lisp_Object, Lisp_Object, bool,
+                                         Lisp_Object, Lisp_Object, 
Lisp_Object);
+extern bool overlay_touches_p (ptrdiff_t);
+extern Lisp_Object other_buffer_safely (Lisp_Object);
+extern Lisp_Object get_truename_buffer (Lisp_Object);
+extern void init_buffer_once (void);
+extern void init_buffer (int);
+extern void syms_of_buffer (void);
+extern void keys_of_buffer (void);
+
+/* Defined in marker.c.  */
+
+extern ptrdiff_t marker_position (Lisp_Object);
+extern ptrdiff_t marker_byte_position (Lisp_Object);
+extern void clear_charpos_cache (struct buffer *);
+extern ptrdiff_t buf_charpos_to_bytepos (struct buffer *, ptrdiff_t);
+extern ptrdiff_t buf_bytepos_to_charpos (struct buffer *, ptrdiff_t);
+extern void unchain_marker (struct Lisp_Marker *marker);
+extern Lisp_Object set_marker_restricted (Lisp_Object, Lisp_Object, 
Lisp_Object);
+extern Lisp_Object set_marker_both (Lisp_Object, Lisp_Object, ptrdiff_t, 
ptrdiff_t);
+extern Lisp_Object set_marker_restricted_both (Lisp_Object, Lisp_Object,
+                                               ptrdiff_t, ptrdiff_t);
+extern Lisp_Object build_marker (struct buffer *, ptrdiff_t, ptrdiff_t);
+extern void syms_of_marker (void);
+
+/* Defined in fileio.c.  */
+
+extern Lisp_Object expand_and_dir_to_file (Lisp_Object, Lisp_Object);
+extern Lisp_Object write_region (Lisp_Object, Lisp_Object, Lisp_Object,
+                                Lisp_Object, Lisp_Object, Lisp_Object,
+                                Lisp_Object, int);
+extern void close_file_unwind (int);
+extern void fclose_unwind (void *);
+extern void restore_point_unwind (Lisp_Object);
+extern _Noreturn void report_file_errno (const char *, Lisp_Object, int);
+extern _Noreturn void report_file_error (const char *, Lisp_Object);
+extern bool internal_delete_file (Lisp_Object);
+extern Lisp_Object emacs_readlinkat (int, const char *);
+extern bool file_directory_p (const char *);
+extern bool file_accessible_directory_p (Lisp_Object);
+extern void init_fileio (void);
+extern void syms_of_fileio (void);
+extern Lisp_Object make_temp_name (Lisp_Object, bool);
+
+/* Defined in search.c.  */
+extern void shrink_regexp_cache (void);
+extern void restore_search_regs (void);
+extern void record_unwind_save_match_data (void);
+struct re_registers;
+extern struct re_pattern_buffer *compile_pattern (Lisp_Object,
+                                                 struct re_registers *,
+                                                 Lisp_Object, bool, bool);
+extern ptrdiff_t fast_string_match_internal (Lisp_Object, Lisp_Object,
+                                            Lisp_Object);
+
+INLINE ptrdiff_t
+fast_string_match (Lisp_Object regexp, Lisp_Object string)
+{
+  return fast_string_match_internal (regexp, string, Qnil);
+}
+
+INLINE ptrdiff_t
+fast_string_match_ignore_case (Lisp_Object regexp, Lisp_Object string)
+{
+  return fast_string_match_internal (regexp, string, Vascii_canon_table);
+}
+
+extern ptrdiff_t fast_c_string_match_ignore_case (Lisp_Object, const char *,
+                                                 ptrdiff_t);
+extern ptrdiff_t fast_looking_at (Lisp_Object, ptrdiff_t, ptrdiff_t,
+                                  ptrdiff_t, ptrdiff_t, Lisp_Object);
+extern ptrdiff_t find_newline (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t,
+                              ptrdiff_t, ptrdiff_t *, ptrdiff_t *, bool);
+extern ptrdiff_t scan_newline (ptrdiff_t, ptrdiff_t, ptrdiff_t, ptrdiff_t,
+                              ptrdiff_t, bool);
+extern ptrdiff_t scan_newline_from_point (ptrdiff_t, ptrdiff_t *, ptrdiff_t *);
+extern ptrdiff_t find_newline_no_quit (ptrdiff_t, ptrdiff_t,
+                                      ptrdiff_t, ptrdiff_t *);
+extern ptrdiff_t find_before_next_newline (ptrdiff_t, ptrdiff_t,
+                                          ptrdiff_t, ptrdiff_t *);
+extern void syms_of_search (void);
+extern void clear_regexp_cache (void);
+
+/* Defined in minibuf.c.  */
+
+extern Lisp_Object Vminibuffer_list;
+extern Lisp_Object last_minibuf_string;
+extern Lisp_Object get_minibuffer (EMACS_INT);
+extern void init_minibuf_once (void);
+extern void syms_of_minibuf (void);
+
+/* Defined in callint.c.  */
+
+extern void syms_of_callint (void);
+
+/* Defined in casefiddle.c.  */
+
+extern void syms_of_casefiddle (void);
+extern void keys_of_casefiddle (void);
+
+/* Defined in casetab.c.  */
+
+extern void init_casetab_once (void);
+extern void syms_of_casetab (void);
+
+/* Defined in keyboard.c.  */
+
+extern Lisp_Object echo_message_buffer;
+extern struct kboard *echo_kboard;
+extern void cancel_echoing (void);
+extern Lisp_Object last_undo_boundary;
+extern bool input_pending;
+#ifdef HAVE_STACK_OVERFLOW_HANDLING
+extern sigjmp_buf return_to_command_loop;
+#endif
+extern Lisp_Object menu_bar_items (Lisp_Object);
+extern Lisp_Object tool_bar_items (Lisp_Object, int *);
+extern void discard_mouse_events (void);
+#ifdef USABLE_SIGIO
+void handle_input_available_signal (int);
+#endif
+extern Lisp_Object pending_funcalls;
+extern bool detect_input_pending (void);
+extern bool detect_input_pending_ignore_squeezables (void);
+extern bool detect_input_pending_run_timers (bool);
+extern void safe_run_hooks (Lisp_Object);
+extern void cmd_error_internal (Lisp_Object, const char *);
+extern Lisp_Object command_loop_1 (void);
+extern Lisp_Object read_menu_command (void);
+extern Lisp_Object recursive_edit_1 (void);
+extern void record_auto_save (void);
+extern void force_auto_save_soon (void);
+extern void init_keyboard (void);
+extern void syms_of_keyboard (void);
+extern void keys_of_keyboard (void);
+
+/* Defined in indent.c.  */
+extern ptrdiff_t current_column (void);
+extern void invalidate_current_column (void);
+extern bool indented_beyond_p (ptrdiff_t, ptrdiff_t, EMACS_INT);
+extern void syms_of_indent (void);
+
+/* Defined in frame.c.  */
+extern void store_frame_param (struct frame *, Lisp_Object, Lisp_Object);
+extern void store_in_alist (Lisp_Object *, Lisp_Object, Lisp_Object);
+extern Lisp_Object do_switch_frame (Lisp_Object, int, int, Lisp_Object);
+extern Lisp_Object get_frame_param (struct frame *, Lisp_Object);
+extern void frames_discard_buffer (Lisp_Object);
+extern void syms_of_frame (void);
+
+/* Defined in emacs.c.  */
+extern char **initial_argv;
+extern int initial_argc;
+#if defined (HAVE_X_WINDOWS) || defined (HAVE_NS)
+extern bool display_arg;
+#endif
+extern Lisp_Object decode_env_path (const char *, const char *, bool);
+extern Lisp_Object empty_unibyte_string, empty_multibyte_string;
+extern _Noreturn void terminate_due_to_signal (int, int);
+#ifdef WINDOWSNT
+extern Lisp_Object Vlibrary_cache;
+#endif
+#if HAVE_SETLOCALE
+void fixup_locale (void);
+void synchronize_system_messages_locale (void);
+void synchronize_system_time_locale (void);
+#else
+INLINE void fixup_locale (void) {}
+INLINE void synchronize_system_messages_locale (void) {}
+INLINE void synchronize_system_time_locale (void) {}
+#endif
+extern void shut_down_emacs (int, Lisp_Object);
+
+/* True means don't do interactive redisplay and don't change tty modes.  */
+extern bool noninteractive;
+
+/* True means remove site-lisp directories from load-path.  */
+extern bool no_site_lisp;
+
+/* Pipe used to send exit notification to the daemon parent at
+   startup.  On Windows, we use a kernel event instead.  */
+#ifndef WINDOWSNT
+extern int daemon_pipe[2];
+#define IS_DAEMON (daemon_pipe[1] != 0)
+#define DAEMON_RUNNING (daemon_pipe[1] >= 0)
+#else  /* WINDOWSNT */
+extern void *w32_daemon_event;
+#define IS_DAEMON (w32_daemon_event != NULL)
+#define DAEMON_RUNNING (w32_daemon_event != INVALID_HANDLE_VALUE)
+#endif
+
+/* True if handling a fatal error already.  */
+extern bool fatal_error_in_progress;
+
+/* True means don't do use window-system-specific display code.  */
+extern bool inhibit_window_system;
+/* True means that a filter or a sentinel is running.  */
+extern bool running_asynch_code;
+
+/* Defined in process.c.  */
+extern void kill_buffer_processes (Lisp_Object);
+extern int wait_reading_process_output (intmax_t, int, int, bool, Lisp_Object,
+                                       struct Lisp_Process *, int);
+/* Max value for the first argument of wait_reading_process_output.  */
+#if __GNUC__ == 3 || (__GNUC__ == 4 && __GNUC_MINOR__ <= 5)
+/* Work around a bug in GCC 3.4.2, known to be fixed in GCC 4.6.3.
+   The bug merely causes a bogus warning, but the warning is annoying.  */
+# define WAIT_READING_MAX min (TYPE_MAXIMUM (time_t), INTMAX_MAX)
+#else
+# define WAIT_READING_MAX INTMAX_MAX
+#endif
+#ifdef HAVE_TIMERFD
+extern void add_timer_wait_descriptor (int);
+#endif
+extern void add_keyboard_wait_descriptor (int);
+extern void delete_keyboard_wait_descriptor (int);
+#ifdef HAVE_GPM
+extern void add_gpm_wait_descriptor (int);
+extern void delete_gpm_wait_descriptor (int);
+#endif
+extern void init_process_emacs (void);
+extern void syms_of_process (void);
+extern void setup_process_coding_systems (Lisp_Object);
+
+/* Defined in callproc.c.  */
+#ifndef DOS_NT
+ _Noreturn
+#endif
+extern int child_setup (int, int, int, char **, bool, Lisp_Object);
+extern void init_callproc_1 (void);
+extern void init_callproc (void);
+extern void set_initial_environment (void);
+extern void syms_of_callproc (void);
+
+/* Defined in doc.c.  */
+extern Lisp_Object read_doc_string (Lisp_Object);
+extern Lisp_Object get_doc_string (Lisp_Object, bool, bool);
+extern void syms_of_doc (void);
+extern int read_bytecode_char (bool);
+
+/* Defined in bytecode.c.  */
+extern void syms_of_bytecode (void);
+extern struct byte_stack *byte_stack_list;
+#if BYTE_MARK_STACK
+extern void mark_byte_stack (void);
+#endif
+extern void unmark_byte_stack (void);
+extern Lisp_Object exec_byte_code (Lisp_Object, Lisp_Object, Lisp_Object,
+                                  Lisp_Object, ptrdiff_t, Lisp_Object *);
+
+/* Defined in macros.c.  */
+extern void init_macros (void);
+extern void syms_of_macros (void);
+
+/* Defined in undo.c.  */
+extern void truncate_undo_list (struct buffer *);
+extern void record_insert (ptrdiff_t, ptrdiff_t);
+extern void record_delete (ptrdiff_t, Lisp_Object, bool);
+extern void record_first_change (void);
+extern void record_change (ptrdiff_t, ptrdiff_t);
+extern void record_property_change (ptrdiff_t, ptrdiff_t,
+                                   Lisp_Object, Lisp_Object,
+                                    Lisp_Object);
+extern void syms_of_undo (void);
+
+/* Defined in textprop.c.  */
+extern void report_interval_modification (Lisp_Object, Lisp_Object);
+
+/* Defined in menu.c.  */
+extern void syms_of_menu (void);
+
+/* Defined in xmenu.c.  */
+extern void syms_of_xmenu (void);
+
+/* Defined in termchar.h.  */
+struct tty_display_info;
+
+/* Defined in termhooks.h.  */
+struct terminal;
+
+/* Defined in sysdep.c.  */
+#ifndef HAVE_GET_CURRENT_DIR_NAME
+extern char *get_current_dir_name (void);
+#endif
+extern void stuff_char (char c);
+extern void init_foreground_group (void);
+extern void sys_subshell (void);
+extern void sys_suspend (void);
+extern void discard_tty_input (void);
+extern void init_sys_modes (struct tty_display_info *);
+extern void reset_sys_modes (struct tty_display_info *);
+extern void init_all_sys_modes (void);
+extern void reset_all_sys_modes (void);
+extern void child_setup_tty (int);
+extern void setup_pty (int);
+extern int set_window_size (int, int, int);
+extern EMACS_INT get_random (void);
+extern void seed_random (void *, ptrdiff_t);
+extern void init_random (void);
+extern void emacs_backtrace (int);
+extern _Noreturn void emacs_abort (void) NO_INLINE;
+extern int emacs_open (const char *, int, int);
+extern int emacs_pipe (int[2]);
+extern int emacs_close (int);
+extern ptrdiff_t emacs_read (int, void *, ptrdiff_t);
+extern ptrdiff_t emacs_write (int, void const *, ptrdiff_t);
+extern ptrdiff_t emacs_write_sig (int, void const *, ptrdiff_t);
+extern void emacs_perror (char const *);
+
+extern void unlock_all_files (void);
+extern void lock_file (Lisp_Object);
+extern void unlock_file (Lisp_Object);
+extern void unlock_buffer (struct buffer *);
+extern void syms_of_filelock (void);
+extern int str_collate (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object);
+
+/* Defined in sound.c.  */
+extern void syms_of_sound (void);
+
+/* Defined in category.c.  */
+extern void init_category_once (void);
+extern Lisp_Object char_category_set (int);
+extern void syms_of_category (void);
+
+/* Defined in ccl.c.  */
+extern void syms_of_ccl (void);
+
+/* Defined in dired.c.  */
+extern void syms_of_dired (void);
+extern Lisp_Object directory_files_internal (Lisp_Object, Lisp_Object,
+                                             Lisp_Object, Lisp_Object,
+                                             bool, Lisp_Object);
+
+/* Defined in term.c.  */
+extern int *char_ins_del_vector;
+extern void syms_of_term (void);
+extern _Noreturn void fatal (const char *msgid, ...)
+  ATTRIBUTE_FORMAT_PRINTF (1, 2);
+
+/* Defined in terminal.c.  */
+extern void syms_of_terminal (void);
+
+/* Defined in font.c.  */
+extern void syms_of_font (void);
+extern void init_font (void);
+
+#ifdef HAVE_WINDOW_SYSTEM
+/* Defined in fontset.c.  */
+extern void syms_of_fontset (void);
+#endif
+
+/* Defined in gfilenotify.c */
+#ifdef HAVE_GFILENOTIFY
+extern void globals_of_gfilenotify (void);
+extern void syms_of_gfilenotify (void);
+#endif
+
+/* Defined in inotify.c */
+#ifdef HAVE_INOTIFY
+extern void syms_of_inotify (void);
+#endif
+
+#ifdef HAVE_W32NOTIFY
+/* Defined on w32notify.c.  */
+extern void syms_of_w32notify (void);
+#endif
+
+/* Defined in xfaces.c.  */
+extern Lisp_Object Vface_alternative_font_family_alist;
+extern Lisp_Object Vface_alternative_font_registry_alist;
+extern void syms_of_xfaces (void);
+
+#ifdef HAVE_X_WINDOWS
+/* Defined in xfns.c.  */
+extern void syms_of_xfns (void);
+
+/* Defined in xsmfns.c.  */
+extern void syms_of_xsmfns (void);
+
+/* Defined in xselect.c.  */
+extern void syms_of_xselect (void);
+
+/* Defined in xterm.c.  */
+extern void init_xterm (void);
+extern void syms_of_xterm (void);
+#endif /* HAVE_X_WINDOWS */
+
+#ifdef HAVE_WINDOW_SYSTEM
+/* Defined in xterm.c, nsterm.m, w32term.c.  */
+extern char *x_get_keysym_name (int);
+#endif /* HAVE_WINDOW_SYSTEM */
+
+#ifdef HAVE_LIBXML2
+/* Defined in xml.c.  */
+extern void syms_of_xml (void);
+extern void xml_cleanup_parser (void);
+#endif
+
+#ifdef HAVE_ZLIB
+/* Defined in decompress.c.  */
+extern void syms_of_decompress (void);
+#endif
+
+#ifdef HAVE_DBUS
+/* Defined in dbusbind.c.  */
+void init_dbusbind (void);
+void syms_of_dbusbind (void);
+#endif
+
+
+/* Defined in profiler.c.  */
+extern bool profiler_memory_running;
+extern void malloc_probe (size_t);
+extern void syms_of_profiler (void);
+
+
+#ifdef DOS_NT
+/* Defined in msdos.c, w32.c.  */
+extern char *emacs_root_dir (void);
+#endif /* DOS_NT */
+
+/* Defined in lastfile.c.  */
+extern char my_edata[];
+extern char my_endbss[];
+extern char *my_endbss_static;
+
+/* True means ^G can quit instantly.  */
+extern bool immediate_quit;
+
+extern void *xmalloc (size_t) ATTRIBUTE_MALLOC_SIZE ((1));
+extern void *xzalloc (size_t) ATTRIBUTE_MALLOC_SIZE ((1));
+extern void *xrealloc (void *, size_t) ATTRIBUTE_ALLOC_SIZE ((2));
+extern void xfree (void *);
+extern void *xnmalloc (ptrdiff_t, ptrdiff_t) ATTRIBUTE_MALLOC_SIZE ((1,2));
+extern void *xnrealloc (void *, ptrdiff_t, ptrdiff_t)
+  ATTRIBUTE_ALLOC_SIZE ((2,3));
+extern void *xpalloc (void *, ptrdiff_t *, ptrdiff_t, ptrdiff_t, ptrdiff_t);
+
+extern char *xstrdup (const char *) ATTRIBUTE_MALLOC;
+extern char *xlispstrdup (Lisp_Object) ATTRIBUTE_MALLOC;
+extern void dupstring (char **, char const *);
+
+/* Make DEST a copy of STRING's data.  Return a pointer to DEST's terminating
+   null byte.  This is like stpcpy, except the source is a Lisp string.  */
+
+INLINE char *
+lispstpcpy (char *dest, Lisp_Object string)
+{
+  ptrdiff_t len = SBYTES (string);
+  memcpy (dest, SDATA (string), len + 1);
+  return dest + len;
+}
+
+extern void xputenv (const char *);
+
+extern char *egetenv_internal (const char *, ptrdiff_t);
+
+INLINE char *
+egetenv (const char *var)
+{
+  /* When VAR is a string literal, strlen can be optimized away.  */
+  return egetenv_internal (var, strlen (var));
+}
+
+/* Set up the name of the machine we're running on.  */
+extern void init_system_name (void);
+
+/* Return the absolute value of X.  X should be a signed integer
+   expression without side effects, and X's absolute value should not
+   exceed the maximum for its promoted type.  This is called 'eabs'
+   because 'abs' is reserved by the C standard.  */
+#define eabs(x)         ((x) < 0 ? -(x) : (x))
+
+/* Return a fixnum or float, depending on whether VAL fits in a Lisp
+   fixnum.  */
+
+#define make_fixnum_or_float(val) \
+   (FIXNUM_OVERFLOW_P (val) ? make_float (val) : make_number (val))
+
+/* SAFE_ALLOCA normally allocates memory on the stack, but if size is
+   larger than MAX_ALLOCA, use xmalloc to avoid overflowing the stack.  */
+
+enum MAX_ALLOCA { MAX_ALLOCA = 16 * 1024 };
+
+extern void *record_xmalloc (size_t) ATTRIBUTE_ALLOC_SIZE ((1));
+
+#define USE_SAFE_ALLOCA                        \
+  ptrdiff_t sa_avail = MAX_ALLOCA;     \
+  ptrdiff_t sa_count = SPECPDL_INDEX (); bool sa_must_free = false
+
+#define AVAIL_ALLOCA(size) (sa_avail -= (size), alloca (size))
+
+/* SAFE_ALLOCA allocates a simple buffer.  */
+
+#define SAFE_ALLOCA(size) ((size) <= sa_avail                          \
+                          ? AVAIL_ALLOCA (size)                        \
+                          : (sa_must_free = true, record_xmalloc (size)))
+
+/* SAFE_NALLOCA sets BUF to a newly allocated array of MULTIPLIER *
+   NITEMS items, each of the same type as *BUF.  MULTIPLIER must
+   positive.  The code is tuned for MULTIPLIER being a constant.  */
+
+#define SAFE_NALLOCA(buf, multiplier, nitems)                   \
+  do {                                                          \
+    if ((nitems) <= sa_avail / sizeof *(buf) / (multiplier))    \
+      (buf) = AVAIL_ALLOCA (sizeof *(buf) * (multiplier) * (nitems)); \
+    else                                                        \
+      {                                                                 \
+       (buf) = xnmalloc (nitems, sizeof *(buf) * (multiplier)); \
+       sa_must_free = true;                                     \
+       record_unwind_protect_ptr (xfree, buf);                  \
+      }                                                                 \
+  } while (false)
+
+/* SAFE_ALLOCA_STRING allocates a C copy of a Lisp string.  */
+
+#define SAFE_ALLOCA_STRING(ptr, string)                        \
+  do {                                                 \
+    (ptr) = SAFE_ALLOCA (SBYTES (string) + 1);         \
+    memcpy (ptr, SDATA (string), SBYTES (string) + 1); \
+  } while (false)
+
+/* SAFE_FREE frees xmalloced memory and enables GC as needed.  */
+
+#define SAFE_FREE()                    \
+  do {                                 \
+    if (sa_must_free) {                        \
+      sa_must_free = false;            \
+      unbind_to (sa_count, Qnil);      \
+    }                                  \
+  } while (false)
+
+
+/* Return floor (NBYTES / WORD_SIZE).  */
+
+INLINE ptrdiff_t
+lisp_word_count (ptrdiff_t nbytes)
+{
+  if (-1 >> 1 == -1)
+    switch (word_size)
+      {
+      case 2: return nbytes >> 1;
+      case 4: return nbytes >> 2;
+      case 8: return nbytes >> 3;
+      case 16: return nbytes >> 4;
+      }
+  return nbytes / word_size - (nbytes % word_size < 0);
+}
+
+/* SAFE_ALLOCA_LISP allocates an array of Lisp_Objects.  */
+
+#define SAFE_ALLOCA_LISP(buf, nelt)                           \
+  do {                                                        \
+    if ((nelt) <= lisp_word_count (sa_avail))                 \
+      (buf) = AVAIL_ALLOCA ((nelt) * word_size);              \
+    else if ((nelt) <= min (PTRDIFF_MAX, SIZE_MAX) / word_size) \
+      {                                                               \
+       Lisp_Object arg_;                                      \
+       (buf) = xmalloc ((nelt) * word_size);                  \
+       arg_ = make_save_memory (buf, nelt);                   \
+       sa_must_free = true;                                   \
+       record_unwind_protect (free_save_value, arg_);         \
+      }                                                               \
+    else                                                      \
+      memory_full (SIZE_MAX);                                 \
+  } while (false)
+
+
+/* If USE_STACK_LISP_OBJECTS, define macros that and functions that allocate
+   block-scoped conses and strings.  These objects are not
+   managed by the garbage collector, so they are dangerous: passing them
+   out of their scope (e.g., to user code) results in undefined behavior.
+   Conversely, they have better performance because GC is not involved.
+
+   This feature is experimental and requires careful debugging.
+   Build with CPPFLAGS='-DUSE_STACK_LISP_OBJECTS=0' to disable it.  */
+
+#ifndef USE_STACK_LISP_OBJECTS
+# define USE_STACK_LISP_OBJECTS true
+#endif
+
+/* USE_STACK_LISP_OBJECTS requires GC_MARK_STACK == GC_MAKE_GCPROS_NOOPS.  */
+
+#if GC_MARK_STACK != GC_MAKE_GCPROS_NOOPS
+# undef USE_STACK_LISP_OBJECTS
+# define USE_STACK_LISP_OBJECTS false
+#endif
+
+#ifdef GC_CHECK_STRING_BYTES
+enum { defined_GC_CHECK_STRING_BYTES = true };
+#else
+enum { defined_GC_CHECK_STRING_BYTES = false };
+#endif
+
+/* Struct inside unions that are typically no larger and aligned enough.  */
+
+union Aligned_Cons
+{
+  struct Lisp_Cons s;
+  double d; intmax_t i; void *p;
+};
+
+union Aligned_String
+{
+  struct Lisp_String s;
+  double d; intmax_t i; void *p;
+};
+
+/* True for stack-based cons and string implementations, respectively.
+   Use stack-based strings only if stack-based cons also works.
+   Otherwise, STACK_CONS would create heap-based cons cells that
+   could point to stack-based strings, which is a no-no.  */
+
+enum
+  {
+    USE_STACK_CONS = (USE_STACK_LISP_OBJECTS
+                     && alignof (union Aligned_Cons) % GCALIGNMENT == 0),
+    USE_STACK_STRING = (USE_STACK_CONS
+                       && !defined_GC_CHECK_STRING_BYTES
+                       && alignof (union Aligned_String) % GCALIGNMENT == 0)
+  };
+
+/* Auxiliary macros used for auto allocation of Lisp objects.  Please
+   use these only in macros like AUTO_CONS that declare a local
+   variable whose lifetime will be clear to the programmer.  */
+#define STACK_CONS(a, b) \
+  make_lisp_ptr (&(union Aligned_Cons) { { a, { b } } }.s, Lisp_Cons)
+#define AUTO_CONS_EXPR(a, b) \
+  (USE_STACK_CONS ? STACK_CONS (a, b) : Fcons (a, b))
+
+/* Declare NAME as an auto Lisp cons or short list if possible, a
+   GC-based one otherwise.  This is in the sense of the C keyword
+   'auto'; i.e., the object has the lifetime of the containing block.
+   The resulting object should not be made visible to user Lisp code.  */
+
+#define AUTO_CONS(name, a, b) Lisp_Object name = AUTO_CONS_EXPR (a, b)
+#define AUTO_LIST1(name, a)                                            \
+  Lisp_Object name = (USE_STACK_CONS ? STACK_CONS (a, Qnil) : list1 (a))
+#define AUTO_LIST2(name, a, b)                                         \
+  Lisp_Object name = (USE_STACK_CONS                                   \
+                     ? STACK_CONS (a, STACK_CONS (b, Qnil))            \
+                     : list2 (a, b))
+#define AUTO_LIST3(name, a, b, c)                                      \
+  Lisp_Object name = (USE_STACK_CONS                                   \
+                     ? STACK_CONS (a, STACK_CONS (b, STACK_CONS (c, Qnil))) \
+                     : list3 (a, b, c))
+#define AUTO_LIST4(name, a, b, c, d)                                   \
+    Lisp_Object name                                                   \
+      = (USE_STACK_CONS                                                        
\
+        ? STACK_CONS (a, STACK_CONS (b, STACK_CONS (c,                 \
+                                                    STACK_CONS (d, Qnil)))) \
+        : list4 (a, b, c, d))
+
+/* Check whether stack-allocated strings are ASCII-only.  */
+
+#if defined (ENABLE_CHECKING) && USE_STACK_LISP_OBJECTS
+extern const char *verify_ascii (const char *);
+#else
+# define verify_ascii(str) (str)
+#endif
+
+/* Declare NAME as an auto Lisp string if possible, a GC-based one if not.
+   Take its value from STR.  STR is not necessarily copied and should
+   contain only ASCII characters.  The resulting Lisp string should
+   not be modified or made visible to user code.  */
+
+#define AUTO_STRING(name, str)                                         \
+  Lisp_Object name =                                                   \
+    (USE_STACK_STRING                                                  \
+     ? (make_lisp_ptr                                                  \
+       ((&(union Aligned_String)                                       \
+         {{strlen (str), -1, 0, (unsigned char *) verify_ascii (str)}}.s), \
+         Lisp_String))                                                 \
+     : build_string (verify_ascii (str)))
+
+/* Loop over all tails of a list, checking for cycles.
+   FIXME: Make tortoise and n internal declarations.
+   FIXME: Unroll the loop body so we don't need `n'.  */
+#define FOR_EACH_TAIL(hare, list, tortoise, n) \
+  for ((tortoise) = (hare) = (list), (n) = true;               \
+       CONSP (hare);                                           \
+       (hare = XCDR (hare), (n) = !(n),                                \
+       ((n)                                                    \
+        ? (EQ (hare, tortoise)                                 \
+           ? xsignal1 (Qcircular_list, list)                   \
+           : (void) 0)                                         \
+        /* Move tortoise before the next iteration, in case */ \
+        /* the next iteration does an Fsetcdr.  */             \
+        : (void) ((tortoise) = XCDR (tortoise)))))
+
+/* Do a `for' loop over alist values.  */
+
+#define FOR_EACH_ALIST_VALUE(head_var, list_var, value_var)            \
+  for ((list_var) = (head_var);                                                
\
+       (CONSP (list_var) && ((value_var) = XCDR (XCAR (list_var)), true)); \
+       (list_var) = XCDR (list_var))
+
+/* Check whether it's time for GC, and run it if so.  */
+
+INLINE void
+maybe_gc (void)
+{
+  if ((consing_since_gc > gc_cons_threshold
+       && consing_since_gc > gc_relative_threshold)
+      || (!NILP (Vmemory_full)
+         && consing_since_gc > memory_full_cons_threshold))
+    Fgarbage_collect ();
+}
+
+INLINE bool
+functionp (Lisp_Object object)
+{
+  if (SYMBOLP (object) && !NILP (Ffboundp (object)))
+    {
+      object = Findirect_function (object, Qt);
+
+      if (CONSP (object) && EQ (XCAR (object), Qautoload))
+       {
+         /* Autoloaded symbols are functions, except if they load
+            macros or keymaps.  */
+         int i;
+         for (i = 0; i < 4 && CONSP (object); i++)
+           object = XCDR (object);
+
+         return ! (CONSP (object) && !NILP (XCAR (object)));
+       }
+    }
+
+  if (SUBRP (object))
+    return XSUBR (object)->max_args != UNEVALLED;
+  else if (COMPILEDP (object))
+    return true;
+  else if (CONSP (object))
+    {
+      Lisp_Object car = XCAR (object);
+      return EQ (car, Qlambda) || EQ (car, Qclosure);
+    }
+  else
+    return false;
+}
+
+INLINE_HEADER_END
+
+#endif /* EMACS_LISP_H */
diff --git a/test/etags/c-src/emacs/src/regex.h 
b/test/etags/c-src/emacs/src/regex.h
new file mode 100644
index 0000000..3dfecf0
--- /dev/null
+++ b/test/etags/c-src/emacs/src/regex.h
@@ -0,0 +1,630 @@
+/* Definitions for data structures and routines for the regular
+   expression library, version 0.12.
+
+   Copyright (C) 1985, 1989-1993, 1995, 2000-2015 Free Software
+   Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef _REGEX_H
+#define _REGEX_H 1
+
+/* Allow the use in C++ code.  */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* POSIX says that <sys/types.h> must be included (by the caller) before
+   <regex.h>.  */
+
+#if !defined _POSIX_C_SOURCE && !defined _POSIX_SOURCE && defined VMS
+/* VMS doesn't have `size_t' in <sys/types.h>, even though POSIX says it
+   should be there.  */
+# include <stddef.h>
+#endif
+
+/* The following bits are used to determine the regexp syntax we
+   recognize.  The set/not-set meanings where historically chosen so
+   that Emacs syntax had the value 0.
+   The bits are given in alphabetical order, and
+   the definitions shifted by one from the previous bit; thus, when we
+   add or remove a bit, only one other definition need change.  */
+typedef unsigned long reg_syntax_t;
+
+/* If this bit is not set, then \ inside a bracket expression is literal.
+   If set, then such a \ quotes the following character.  */
+#define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1)
+
+/* If this bit is not set, then + and ? are operators, and \+ and \? are
+     literals.
+   If set, then \+ and \? are operators and + and ? are literals.  */
+#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1)
+
+/* If this bit is set, then character classes are supported.  They are:
+     [:alpha:], [:upper:], [:lower:],  [:digit:], [:alnum:], [:xdigit:],
+     [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:].
+   If not set, then character classes are not supported.  */
+#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1)
+
+/* If this bit is set, then ^ and $ are always anchors (outside bracket
+     expressions, of course).
+   If this bit is not set, then it depends:
+        ^  is an anchor if it is at the beginning of a regular
+           expression or after an open-group or an alternation operator;
+        $  is an anchor if it is at the end of a regular expression, or
+           before a close-group or an alternation operator.
+
+   This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because
+   POSIX draft 11.2 says that * etc. in leading positions is undefined.
+   We already implemented a previous draft which made those constructs
+   invalid, though, so we haven't changed the code back.  */
+#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1)
+
+/* If this bit is set, then special characters are always special
+     regardless of where they are in the pattern.
+   If this bit is not set, then special characters are special only in
+     some contexts; otherwise they are ordinary.  Specifically,
+     * + ? and intervals are only special when not after the beginning,
+     open-group, or alternation operator.  */
+#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1)
+
+/* If this bit is set, then *, +, ?, and { cannot be first in an re or
+     immediately after an alternation or begin-group operator.  */
+#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1)
+
+/* If this bit is set, then . matches newline.
+   If not set, then it doesn't.  */
+#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1)
+
+/* If this bit is set, then . doesn't match NUL.
+   If not set, then it does.  */
+#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1)
+
+/* If this bit is set, nonmatching lists [^...] do not match newline.
+   If not set, they do.  */
+#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1)
+
+/* If this bit is set, either \{...\} or {...} defines an
+     interval, depending on RE_NO_BK_BRACES.
+   If not set, \{, \}, {, and } are literals.  */
+#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1)
+
+/* If this bit is set, +, ? and | aren't recognized as operators.
+   If not set, they are.  */
+#define RE_LIMITED_OPS (RE_INTERVALS << 1)
+
+/* If this bit is set, newline is an alternation operator.
+   If not set, newline is literal.  */
+#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)
+
+/* If this bit is set, then `{...}' defines an interval, and \{ and \}
+     are literals.
+  If not set, then `\{...\}' defines an interval.  */
+#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)
+
+/* If this bit is set, (...) defines a group, and \( and \) are literals.
+   If not set, \(...\) defines a group, and ( and ) are literals.  */
+#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1)
+
+/* If this bit is set, then \<digit> matches <digit>.
+   If not set, then \<digit> is a back-reference.  */
+#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1)
+
+/* If this bit is set, then | is an alternation operator, and \| is literal.
+   If not set, then \| is an alternation operator, and | is literal.  */
+#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1)
+
+/* If this bit is set, then an ending range point collating higher
+     than the starting range point, as in [z-a], is invalid.
+   If not set, then when ending range point collates higher than the
+     starting range point, the range is ignored.  */
+#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1)
+
+/* If this bit is set, then an unmatched ) is ordinary.
+   If not set, then an unmatched ) is invalid.  */
+#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1)
+
+/* If this bit is set, succeed as soon as we match the whole pattern,
+   without further backtracking.  */
+#define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1)
+
+/* If this bit is set, do not process the GNU regex operators.
+   If not set, then the GNU regex operators are recognized. */
+#define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1)
+
+/* If this bit is set, then *?, +? and ?? match non greedily. */
+#define RE_FRUGAL (RE_NO_GNU_OPS << 1)
+
+/* If this bit is set, then (?:...) is treated as a shy group.  */
+#define RE_SHY_GROUPS (RE_FRUGAL << 1)
+
+/* If this bit is set, ^ and $ only match at beg/end of buffer.  */
+#define RE_NO_NEWLINE_ANCHOR (RE_SHY_GROUPS << 1)
+
+/* If this bit is set, turn on internal regex debugging.
+   If not set, and debugging was on, turn it off.
+   This only works if regex.c is compiled -DDEBUG.
+   We define this bit always, so that all that's needed to turn on
+   debugging is to recompile regex.c; the calling code can always have
+   this bit set, and it won't affect anything in the normal case. */
+#define RE_DEBUG (RE_NO_NEWLINE_ANCHOR << 1)
+
+/* This global variable defines the particular regexp syntax to use (for
+   some interfaces).  When a regexp is compiled, the syntax used is
+   stored in the pattern buffer, so changing this does not affect
+   already-compiled regexps.  */
+extern reg_syntax_t re_syntax_options;
+
+#ifdef emacs
+/* In Emacs, this is the string or buffer in which we
+   are matching.  It is used for looking up syntax properties.  */
+extern Lisp_Object re_match_object;
+#endif
+
+/* Roughly the maximum number of failure points on the stack.  */
+extern size_t re_max_failures;
+
+
+/* Define combinations of the above bits for the standard possibilities.
+   (The [[[ comments delimit what gets put into the Texinfo file, so
+   don't delete them!)  */
+/* [[[begin syntaxes]]] */
+#define RE_SYNTAX_EMACS                                                        
\
+  (RE_CHAR_CLASSES | RE_INTERVALS | RE_SHY_GROUPS | RE_FRUGAL)
+
+#define RE_SYNTAX_AWK                                                  \
+  (RE_BACKSLASH_ESCAPE_IN_LISTS   | RE_DOT_NOT_NULL                    \
+   | RE_NO_BK_PARENS              | RE_NO_BK_REFS                      \
+   | RE_NO_BK_VBAR                | RE_NO_EMPTY_RANGES                 \
+   | RE_DOT_NEWLINE              | RE_CONTEXT_INDEP_ANCHORS            \
+   | RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS)
+
+#define RE_SYNTAX_GNU_AWK                                              \
+  ((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DEBUG)        
\
+   & ~(RE_DOT_NOT_NULL | RE_INTERVALS | RE_CONTEXT_INDEP_OPS))
+
+#define RE_SYNTAX_POSIX_AWK                                            \
+  (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS             \
+   | RE_INTERVALS          | RE_NO_GNU_OPS)
+
+#define RE_SYNTAX_GREP                                                 \
+  (RE_BK_PLUS_QM              | RE_CHAR_CLASSES                                
\
+   | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS                           \
+   | RE_NEWLINE_ALT)
+
+#define RE_SYNTAX_EGREP                                                        
\
+  (RE_CHAR_CLASSES        | RE_CONTEXT_INDEP_ANCHORS                   \
+   | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE                   \
+   | RE_NEWLINE_ALT       | RE_NO_BK_PARENS                            \
+   | RE_NO_BK_VBAR)
+
+#define RE_SYNTAX_POSIX_EGREP                                          \
+  (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES)
+
+/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff.  */
+#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC
+
+#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC
+
+/* Syntax bits common to both basic and extended POSIX regex syntax.  */
+#define _RE_SYNTAX_POSIX_COMMON                                                
\
+  (RE_CHAR_CLASSES | RE_DOT_NEWLINE      | RE_DOT_NOT_NULL             \
+   | RE_INTERVALS  | RE_NO_EMPTY_RANGES)
+
+#define RE_SYNTAX_POSIX_BASIC                                          \
+  (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM)
+
+/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes
+   RE_LIMITED_OPS, i.e., \? \+ \| are not recognized.  Actually, this
+   isn't minimal, since other operators, such as \`, aren't disabled.  */
+#define RE_SYNTAX_POSIX_MINIMAL_BASIC                                  \
+  (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)
+
+#define RE_SYNTAX_POSIX_EXTENDED                                       \
+  (_RE_SYNTAX_POSIX_COMMON  | RE_CONTEXT_INDEP_ANCHORS                 \
+   | RE_CONTEXT_INDEP_OPS   | RE_NO_BK_BRACES                          \
+   | RE_NO_BK_PARENS        | RE_NO_BK_VBAR                            \
+   | RE_CONTEXT_INVALID_OPS | RE_UNMATCHED_RIGHT_PAREN_ORD)
+
+/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INDEP_OPS is
+   removed and RE_NO_BK_REFS is added.  */
+#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED                               \
+  (_RE_SYNTAX_POSIX_COMMON  | RE_CONTEXT_INDEP_ANCHORS                 \
+   | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES                          \
+   | RE_NO_BK_PARENS        | RE_NO_BK_REFS                            \
+   | RE_NO_BK_VBAR         | RE_UNMATCHED_RIGHT_PAREN_ORD)
+/* [[[end syntaxes]]] */
+
+/* Maximum number of duplicates an interval can allow.  Some systems
+   (erroneously) define this in other header files, but we want our
+   value, so remove any previous define.  */
+#ifdef RE_DUP_MAX
+# undef RE_DUP_MAX
+#endif
+/* If sizeof(int) == 2, then ((1 << 15) - 1) overflows.  */
+#define RE_DUP_MAX (0x7fff)
+
+
+/* POSIX `cflags' bits (i.e., information for `regcomp').  */
+
+/* If this bit is set, then use extended regular expression syntax.
+   If not set, then use basic regular expression syntax.  */
+#define REG_EXTENDED 1
+
+/* If this bit is set, then ignore case when matching.
+   If not set, then case is significant.  */
+#define REG_ICASE (REG_EXTENDED << 1)
+
+/* If this bit is set, then anchors do not match at newline
+     characters in the string.
+   If not set, then anchors do match at newlines.  */
+#define REG_NEWLINE (REG_ICASE << 1)
+
+/* If this bit is set, then report only success or fail in regexec.
+   If not set, then returns differ between not matching and errors.  */
+#define REG_NOSUB (REG_NEWLINE << 1)
+
+
+/* POSIX `eflags' bits (i.e., information for regexec).  */
+
+/* If this bit is set, then the beginning-of-line operator doesn't match
+     the beginning of the string (presumably because it's not the
+     beginning of a line).
+   If not set, then the beginning-of-line operator does match the
+     beginning of the string.  */
+#define REG_NOTBOL 1
+
+/* Like REG_NOTBOL, except for the end-of-line.  */
+#define REG_NOTEOL (1 << 1)
+
+
+/* If any error codes are removed, changed, or added, update the
+   `re_error_msg' table in regex.c.  */
+typedef enum
+{
+#ifdef _XOPEN_SOURCE
+  REG_ENOSYS = -1,     /* This will never happen for this implementation.  */
+#endif
+
+  REG_NOERROR = 0,     /* Success.  */
+  REG_NOMATCH,         /* Didn't find a match (for regexec).  */
+
+  /* POSIX regcomp return error codes.  (In the order listed in the
+     standard.)  */
+  REG_BADPAT,          /* Invalid pattern.  */
+  REG_ECOLLATE,                /* Not implemented.  */
+  REG_ECTYPE,          /* Invalid character class name.  */
+  REG_EESCAPE,         /* Trailing backslash.  */
+  REG_ESUBREG,         /* Invalid back reference.  */
+  REG_EBRACK,          /* Unmatched left bracket.  */
+  REG_EPAREN,          /* Parenthesis imbalance.  */
+  REG_EBRACE,          /* Unmatched \{.  */
+  REG_BADBR,           /* Invalid contents of \{\}.  */
+  REG_ERANGE,          /* Invalid range end.  */
+  REG_ESPACE,          /* Ran out of memory.  */
+  REG_BADRPT,          /* No preceding re for repetition op.  */
+
+  /* Error codes we've added.  */
+  REG_EEND,            /* Premature end.  */
+  REG_ESIZE,           /* Compiled pattern bigger than 2^16 bytes.  */
+  REG_ERPAREN,         /* Unmatched ) or \); not returned from regcomp.  */
+  REG_ERANGEX          /* Range striding over charsets.  */
+} reg_errcode_t;
+
+/* This data structure represents a compiled pattern.  Before calling
+   the pattern compiler, the fields `buffer', `allocated', `fastmap',
+   `translate', and `no_sub' can be set.  After the pattern has been
+   compiled, the `re_nsub' field is available.  All other fields are
+   private to the regex routines.  */
+
+#ifndef RE_TRANSLATE_TYPE
+# define RE_TRANSLATE_TYPE char *
+#endif
+
+struct re_pattern_buffer
+{
+/* [[[begin pattern_buffer]]] */
+       /* Space that holds the compiled pattern.  It is declared as
+          `unsigned char *' because its elements are
+           sometimes used as array indexes.  */
+  unsigned char *buffer;
+
+       /* Number of bytes to which `buffer' points.  */
+  size_t allocated;
+
+       /* Number of bytes actually used in `buffer'.  */
+  size_t used;
+
+        /* Syntax setting with which the pattern was compiled.  */
+  reg_syntax_t syntax;
+
+        /* Pointer to a fastmap, if any, otherwise zero.  re_search uses
+           the fastmap, if there is one, to skip over impossible
+           starting points for matches.  */
+  char *fastmap;
+
+        /* Either a translate table to apply to all characters before
+           comparing them, or zero for no translation.  The translation
+           is applied to a pattern when it is compiled and to a string
+           when it is matched.  */
+  RE_TRANSLATE_TYPE translate;
+
+       /* Number of subexpressions found by the compiler.  */
+  size_t re_nsub;
+
+        /* Zero if this pattern cannot match the empty string, one else.
+           Well, in truth it's used only in `re_search_2', to see
+           whether or not we should use the fastmap, so we don't set
+           this absolutely perfectly; see `re_compile_fastmap'.  */
+  unsigned can_be_null : 1;
+
+        /* If REGS_UNALLOCATED, allocate space in the `regs' structure
+             for `max (RE_NREGS, re_nsub + 1)' groups.
+           If REGS_REALLOCATE, reallocate space if necessary.
+           If REGS_FIXED, use what's there.  */
+#define REGS_UNALLOCATED 0
+#define REGS_REALLOCATE 1
+#define REGS_FIXED 2
+  unsigned regs_allocated : 2;
+
+        /* Set to zero when `regex_compile' compiles a pattern; set to one
+           by `re_compile_fastmap' if it updates the fastmap.  */
+  unsigned fastmap_accurate : 1;
+
+        /* If set, `re_match_2' does not return information about
+           subexpressions.  */
+  unsigned no_sub : 1;
+
+        /* If set, a beginning-of-line anchor doesn't match at the
+           beginning of the string.  */
+  unsigned not_bol : 1;
+
+        /* Similarly for an end-of-line anchor.  */
+  unsigned not_eol : 1;
+
+  /* If true, the compilation of the pattern had to look up the syntax table,
+     so the compiled pattern is only valid for the current syntax table.  */
+  unsigned used_syntax : 1;
+
+#ifdef emacs
+  /* If true, multi-byte form in the regexp pattern should be
+     recognized as a multibyte character.  */
+  unsigned multibyte : 1;
+
+  /* If true, multi-byte form in the target of match should be
+     recognized as a multibyte character.  */
+  unsigned target_multibyte : 1;
+
+  /* Charset of unibyte characters at compiling time. */
+  int charset_unibyte;
+#endif
+
+/* [[[end pattern_buffer]]] */
+};
+
+typedef struct re_pattern_buffer regex_t;
+
+/* Type for byte offsets within the string.  POSIX mandates this to be an int,
+   but the Open Group has signaled its intention to change the requirement to
+   be that regoff_t be at least as wide as ptrdiff_t and ssize_t.  Current
+   gnulib sources also use ssize_t, and we need this for supporting buffers and
+   strings > 2GB on 64-bit hosts.  */
+typedef ssize_t regoff_t;
+
+
+/* This is the structure we store register match data in.  See
+   regex.texinfo for a full description of what registers match.  */
+struct re_registers
+{
+  unsigned num_regs;
+  regoff_t *start;
+  regoff_t *end;
+};
+
+
+/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
+   `re_match_2' returns information about at least this many registers
+   the first time a `regs' structure is passed.  */
+#ifndef RE_NREGS
+# define RE_NREGS 30
+#endif
+
+
+/* POSIX specification for registers.  Aside from the different names than
+   `re_registers', POSIX uses an array of structures, instead of a
+   structure of arrays.  */
+typedef struct
+{
+  regoff_t rm_so;  /* Byte offset from string's start to substring's start.  */
+  regoff_t rm_eo;  /* Byte offset from string's start to substring's end.  */
+} regmatch_t;
+
+/* Declarations for routines.  */
+
+/* Sets the current default syntax to SYNTAX, and return the old syntax.
+   You can also simply assign to the `re_syntax_options' variable.  */
+extern reg_syntax_t re_set_syntax (reg_syntax_t __syntax);
+
+/* Compile the regular expression PATTERN, with length LENGTH
+   and syntax given by the global `re_syntax_options', into the buffer
+   BUFFER.  Return NULL if successful, and an error string if not.  */
+extern const char *re_compile_pattern (const char *__pattern, size_t __length,
+                                      struct re_pattern_buffer *__buffer);
+
+
+/* Compile a fastmap for the compiled pattern in BUFFER; used to
+   accelerate searches.  Return 0 if successful and -2 if was an
+   internal error.  */
+extern int re_compile_fastmap (struct re_pattern_buffer *__buffer);
+
+
+/* Search in the string STRING (with length LENGTH) for the pattern
+   compiled into BUFFER.  Start searching at position START, for RANGE
+   characters.  Return the starting position of the match, -1 for no
+   match, or -2 for an internal error.  Also return register
+   information in REGS (if REGS and BUFFER->no_sub are nonzero).  */
+extern regoff_t re_search (struct re_pattern_buffer *__buffer,
+                          const char *__string, size_t __length,
+                          ssize_t __start, ssize_t __range,
+                          struct re_registers *__regs);
+
+
+/* Like `re_search', but search in the concatenation of STRING1 and
+   STRING2.  Also, stop searching at index START + STOP.  */
+extern regoff_t re_search_2 (struct re_pattern_buffer *__buffer,
+                            const char *__string1, size_t __length1,
+                            const char *__string2, size_t __length2,
+                            ssize_t __start, ssize_t __range,
+                            struct re_registers *__regs,
+                            ssize_t __stop);
+
+
+/* Like `re_search', but return how many characters in STRING the regexp
+   in BUFFER matched, starting at position START.  */
+extern regoff_t re_match (struct re_pattern_buffer *__buffer,
+                         const char *__string, size_t __length,
+                         ssize_t __start, struct re_registers *__regs);
+
+
+/* Relates to `re_match' as `re_search_2' relates to `re_search'.  */
+extern regoff_t re_match_2 (struct re_pattern_buffer *__buffer,
+                           const char *__string1, size_t __length1,
+                           const char *__string2, size_t __length2,
+                           ssize_t __start, struct re_registers *__regs,
+                           ssize_t __stop);
+
+
+/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+   ENDS.  Subsequent matches using BUFFER and REGS will use this memory
+   for recording register information.  STARTS and ENDS must be
+   allocated with malloc, and must each be at least `NUM_REGS * sizeof
+   (regoff_t)' bytes long.
+
+   If NUM_REGS == 0, then subsequent matches should allocate their own
+   register data.
+
+   Unless this function is called, the first search or match using
+   PATTERN_BUFFER will allocate its own register data, without
+   freeing the old data.  */
+extern void re_set_registers (struct re_pattern_buffer *__buffer,
+                             struct re_registers *__regs,
+                             unsigned __num_regs,
+                             regoff_t *__starts, regoff_t *__ends);
+
+#if defined _REGEX_RE_COMP || defined _LIBC
+# ifndef _CRAY
+/* 4.2 bsd compatibility.  */
+extern char *re_comp (const char *);
+extern int re_exec (const char *);
+# endif
+#endif
+
+/* GCC 2.95 and later have "__restrict"; C99 compilers have
+   "restrict", and "configure" may have defined "restrict".
+   Other compilers use __restrict, __restrict__, and _Restrict, and
+   'configure' might #define 'restrict' to those words, so pick a
+   different name.  */
+#ifndef _Restrict_
+# if 199901L <= __STDC_VERSION__
+#  define _Restrict_ restrict
+# elif 2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__)
+#  define _Restrict_ __restrict
+# else
+#  define _Restrict_
+# endif
+#endif
+/* gcc 3.1 and up support the [restrict] syntax.  Don't trust
+   sys/cdefs.h's definition of __restrict_arr, though, as it
+   mishandles gcc -ansi -pedantic.  */
+#ifndef _Restrict_arr_
+# if ((199901L <= __STDC_VERSION__                                     \
+       || ((3 < __GNUC__ || (3 == __GNUC__ && 1 <= __GNUC_MINOR__))    \
+          && !defined __STRICT_ANSI__))                                        
\
+      && !defined __GNUG__)
+#  define _Restrict_arr_ _Restrict_
+# else
+#  define _Restrict_arr_
+# endif
+#endif
+
+/* POSIX compatibility.  */
+extern reg_errcode_t regcomp (regex_t *_Restrict_ __preg,
+                             const char *_Restrict_ __pattern,
+                             int __cflags);
+
+extern reg_errcode_t regexec (const regex_t *_Restrict_ __preg,
+                             const char *_Restrict_ __string, size_t __nmatch,
+                             regmatch_t __pmatch[_Restrict_arr_],
+                             int __eflags);
+
+extern size_t regerror (int __errcode, const regex_t * __preg,
+                       char *__errbuf, size_t __errbuf_size);
+
+extern void regfree (regex_t *__preg);
+
+
+#ifdef __cplusplus
+}
+#endif /* C++ */
+
+/* For platform which support the ISO C amendment 1 functionality we
+   support user defined character classes.  */
+#if WIDE_CHAR_SUPPORT
+/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.  */
+# include <wchar.h>
+# include <wctype.h>
+#endif
+
+#if WIDE_CHAR_SUPPORT
+/* The GNU C library provides support for user-defined character classes
+   and the functions from ISO C amendment 1.  */
+# ifdef CHARCLASS_NAME_MAX
+#  define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
+# else
+/* This shouldn't happen but some implementation might still have this
+   problem.  Use a reasonable default value.  */
+#  define CHAR_CLASS_MAX_LENGTH 256
+# endif
+typedef wctype_t re_wctype_t;
+typedef wchar_t re_wchar_t;
+# define re_wctype wctype
+# define re_iswctype iswctype
+# define re_wctype_to_bit(cc) 0
+#else
+# define CHAR_CLASS_MAX_LENGTH  9 /* Namely, `multibyte'.  */
+# define btowc(c) c
+
+/* Character classes.  */
+typedef enum { RECC_ERROR = 0,
+              RECC_ALNUM, RECC_ALPHA, RECC_WORD,
+              RECC_GRAPH, RECC_PRINT,
+              RECC_LOWER, RECC_UPPER,
+              RECC_PUNCT, RECC_CNTRL,
+              RECC_DIGIT, RECC_XDIGIT,
+              RECC_BLANK, RECC_SPACE,
+              RECC_MULTIBYTE, RECC_NONASCII,
+              RECC_ASCII, RECC_UNIBYTE
+} re_wctype_t;
+
+extern char re_iswctype (int ch,    re_wctype_t cc);
+extern re_wctype_t re_wctype (const unsigned char* str);
+
+typedef int re_wchar_t;
+
+extern void re_set_whitespace_regexp (const char *regexp);
+
+#endif /* not WIDE_CHAR_SUPPORT */
+
+#endif /* regex.h */
+
diff --git a/test/etags/c-src/etags.c b/test/etags/c-src/etags.c
new file mode 100644
index 0000000..f243821
--- /dev/null
+++ b/test/etags/c-src/etags.c
@@ -0,0 +1,6563 @@
+/* Tags file maker to go with GNU Emacs           -*- coding: utf-8 -*-
+
+Copyright (C) 1984 The Regents of the University of California
+
+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. 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.
+
+
+Copyright (C) 1984, 1987-1989, 1993-1995, 1998-2015 Free Software
+Foundation, Inc.
+
+This file is not considered part of GNU Emacs.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+
+/* NB To comply with the above BSD license, copyright information is
+reproduced in etc/ETAGS.README.  That file should be updated when the
+above notices are.
+
+To the best of our knowledge, this code was originally based on the
+ctags.c distributed with BSD4.2, which was copyrighted by the
+University of California, as described above. */
+
+
+/*
+ * Authors:
+ * 1983 Ctags originally by Ken Arnold.
+ * 1984 Fortran added by Jim Kleckner.
+ * 1984 Ed Pelegri-Llopart added C typedefs.
+ * 1985 Emacs TAGS format by Richard Stallman.
+ * 1989 Sam Kendall added C++.
+ * 1992 Joseph B. Wells improved C and C++ parsing.
+ * 1993 Francesco Potortì reorganized C and C++.
+ * 1994 Line-by-line regexp tags by Tom Tromey.
+ * 2001 Nested classes by Francesco Potortì (concept by Mykola Dzyuba).
+ * 2002 #line directives by Francesco Potortì.
+ *
+ * Francesco Potortì <address@hidden> has maintained and improved it since 
1993.
+ */
+
+/*
+ * If you want to add support for a new language, start by looking at the LUA
+ * language, which is the simplest.  Alternatively, consider distributing etags
+ * together with a configuration file containing regexp definitions for etags.
+ */
+
+char pot_etags_version[] = "@(#) pot revision number is 17.38.1.4";
+
+#ifdef DEBUG
+#  undef DEBUG
+#  define DEBUG true
+#else
+#  define DEBUG  false
+#  define NDEBUG               /* disable assert */
+#endif
+
+#include <config.h>
+
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1         /* enables some compiler checks on GNU */
+#endif
+
+/* WIN32_NATIVE is for XEmacs.
+   MSDOS, WINDOWSNT, DOS_NT are for Emacs. */
+#ifdef WIN32_NATIVE
+# undef MSDOS
+# undef  WINDOWSNT
+# define WINDOWSNT
+#endif /* WIN32_NATIVE */
+
+#ifdef MSDOS
+# undef MSDOS
+# define MSDOS true
+# include <sys/param.h>
+#else
+# define MSDOS false
+#endif /* MSDOS */
+
+#ifdef WINDOWSNT
+# include <direct.h>
+# define MAXPATHLEN _MAX_PATH
+# undef HAVE_NTGUI
+# undef  DOS_NT
+# define DOS_NT
+#endif /* WINDOWSNT */
+
+#include <unistd.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sysstdio.h>
+#include <ctype.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <binary-io.h>
+#include <c-strcase.h>
+
+#include <assert.h>
+#ifdef NDEBUG
+# undef  assert                        /* some systems have a buggy assert.h */
+# define assert(x) ((void) 0)
+#endif
+
+#include <getopt.h>
+#include <regex.h>
+
+/* Define CTAGS to make the program "ctags" compatible with the usual one.
+ Leave it undefined to make the program "etags", which makes emacs-style
+ tag tables and tags typedefs, #defines and struct/union/enum by default. */
+#ifdef CTAGS
+# undef  CTAGS
+# define CTAGS true
+#else
+# define CTAGS false
+#endif
+
+#define streq(s,t)     (assert ((s)!=NULL || (t)!=NULL), !strcmp (s, t))
+#define strcaseeq(s,t) (assert ((s)!=NULL && (t)!=NULL), !c_strcasecmp (s, t))
+#define strneq(s,t,n)  (assert ((s)!=NULL || (t)!=NULL), !strncmp (s, t, n))
+#define strncaseeq(s,t,n) (assert ((s)!=NULL && (t)!=NULL), !c_strncasecmp (s, 
t, n))
+
+#define CHARS 256              /* 2^sizeof(char) */
+#define CHAR(x)                ((unsigned int)(x) & (CHARS - 1))
+#define        iswhite(c)      (_wht[CHAR (c)]) /* c is white (see white) */
+#define notinname(c)   (_nin[CHAR (c)]) /* c is not in a name (see nonam) */
+#define        begtoken(c)     (_btk[CHAR (c)]) /* c can start token (see 
begtk) */
+#define        intoken(c)      (_itk[CHAR (c)]) /* c can be in token (see 
midtk) */
+#define        endtoken(c)     (_etk[CHAR (c)]) /* c ends tokens (see endtk) */
+
+#define ISALNUM(c)     isalnum (CHAR (c))
+#define ISALPHA(c)     isalpha (CHAR (c))
+#define ISDIGIT(c)     isdigit (CHAR (c))
+#define ISLOWER(c)     islower (CHAR (c))
+
+#define lowcase(c)     tolower (CHAR (c))
+
+
+/*
+ *     xnew, xrnew -- allocate, reallocate storage
+ *
+ * SYNOPSIS:   Type *xnew (int n, Type);
+ *             void xrnew (OldPointer, int n, Type);
+ */
+#define xnew(n, Type)      ((Type *) xmalloc ((n) * sizeof (Type)))
+#define xrnew(op, n, Type) ((op) = (Type *) xrealloc (op, (n) * sizeof (Type)))
+
+typedef void Lang_function (FILE *);
+
+typedef struct
+{
+  const char *suffix;           /* file name suffix for this compressor */
+  const char *command;         /* takes one arg and decompresses to stdout */
+} compressor;
+
+typedef struct
+{
+  const char *name;             /* language name */
+  const char *help;            /* detailed help for the language */
+  Lang_function *function;     /* parse function */
+  const char **suffixes;        /* name suffixes of this language's files */
+  const char **filenames;       /* names of this language's files */
+  const char **interpreters;    /* interpreters for this language */
+  bool metasource;             /* source used to generate other sources */
+} language;
+
+typedef struct fdesc
+{
+  struct fdesc *next;          /* for the linked list */
+  char *infname;               /* uncompressed input file name */
+  char *infabsname;            /* absolute uncompressed input file name */
+  char *infabsdir;             /* absolute dir of input file */
+  char *taggedfname;           /* file name to write in tagfile */
+  language *lang;              /* language of file */
+  char *prop;                  /* file properties to write in tagfile */
+  bool usecharno;              /* etags tags shall contain char number */
+  bool written;                        /* entry written in the tags file */
+} fdesc;
+
+typedef struct node_st
+{                              /* sorting structure */
+  struct node_st *left, *right;        /* left and right sons */
+  fdesc *fdp;                  /* description of file to whom tag belongs */
+  char *name;                  /* tag name */
+  char *regex;                 /* search regexp */
+  bool valid;                  /* write this tag on the tag file */
+  bool is_func;                        /* function tag: use regexp in CTAGS 
mode */
+  bool been_warned;            /* warning already given for duplicated tag */
+  int lno;                     /* line number tag is on */
+  long cno;                    /* character number line starts on */
+} node;
+
+/*
+ * A `linebuffer' is a structure which holds a line of text.
+ * `readline_internal' reads a line from a stream into a linebuffer
+ * and works regardless of the length of the line.
+ * SIZE is the size of BUFFER, LEN is the length of the string in
+ * BUFFER after readline reads it.
+ */
+typedef struct
+{
+  long size;
+  int len;
+  char *buffer;
+} linebuffer;
+
+/* Used to support mixing of --lang and file names. */
+typedef struct
+{
+  enum {
+    at_language,               /* a language specification */
+    at_regexp,                 /* a regular expression */
+    at_filename,               /* a file name */
+    at_stdin,                  /* read from stdin here */
+    at_end                     /* stop parsing the list */
+  } arg_type;                  /* argument type */
+  language *lang;              /* language associated with the argument */
+  char *what;                  /* the argument itself */
+} argument;
+
+/* Structure defining a regular expression. */
+typedef struct regexp
+{
+  struct regexp *p_next;       /* pointer to next in list */
+  language *lang;              /* if set, use only for this language */
+  char *pattern;               /* the regexp pattern */
+  char *name;                  /* tag name */
+  struct re_pattern_buffer *pat; /* the compiled pattern */
+  struct re_registers regs;    /* re registers */
+  bool error_signaled;         /* already signaled for this regexp */
+  bool force_explicit_name;    /* do not allow implicit tag name */
+  bool ignore_case;            /* ignore case when matching */
+  bool multi_line;             /* do a multi-line match on the whole file */
+} regexp;
+
+
+/* Many compilers barf on this:
+       Lang_function Ada_funcs;
+   so let's write it this way */
+static void Ada_funcs (FILE *);
+static void Asm_labels (FILE *);
+static void C_entries (int c_ext, FILE *);
+static void default_C_entries (FILE *);
+static void plain_C_entries (FILE *);
+static void Cjava_entries (FILE *);
+static void Cobol_paragraphs (FILE *);
+static void Cplusplus_entries (FILE *);
+static void Cstar_entries (FILE *);
+static void Erlang_functions (FILE *);
+static void Forth_words (FILE *);
+static void Fortran_functions (FILE *);
+static void HTML_labels (FILE *);
+static void Lisp_functions (FILE *);
+static void Lua_functions (FILE *);
+static void Makefile_targets (FILE *);
+static void Pascal_functions (FILE *);
+static void Perl_functions (FILE *);
+static void PHP_functions (FILE *);
+static void PS_functions (FILE *);
+static void Prolog_functions (FILE *);
+static void Python_functions (FILE *);
+static void Scheme_functions (FILE *);
+static void TeX_commands (FILE *);
+static void Texinfo_nodes (FILE *);
+static void Yacc_entries (FILE *);
+static void just_read_file (FILE *);
+
+static language *get_language_from_langname (const char *);
+static void readline (linebuffer *, FILE *);
+static long readline_internal (linebuffer *, FILE *);
+static bool nocase_tail (const char *);
+static void get_tag (char *, char **);
+
+static void analyze_regex (char *);
+static void free_regexps (void);
+static void regex_tag_multiline (void);
+static void error (const char *, ...) ATTRIBUTE_FORMAT_PRINTF (1, 2);
+static _Noreturn void suggest_asking_for_help (void);
+_Noreturn void fatal (const char *, const char *);
+static _Noreturn void pfatal (const char *);
+static void add_node (node *, node **);
+
+static void init (void);
+static void process_file_name (char *, language *);
+static void process_file (FILE *, char *, language *);
+static void find_entries (FILE *);
+static void free_tree (node *);
+static void free_fdesc (fdesc *);
+static void pfnote (char *, bool, char *, int, int, long);
+static void invalidate_nodes (fdesc *, node **);
+static void put_entries (node *);
+
+static char *concat (const char *, const char *, const char *);
+static char *skip_spaces (char *);
+static char *skip_non_spaces (char *);
+static char *skip_name (char *);
+static char *savenstr (const char *, int);
+static char *savestr (const char *);
+static char *etags_getcwd (void);
+static char *relative_filename (char *, char *);
+static char *absolute_filename (char *, char *);
+static char *absolute_dirname (char *, char *);
+static bool filename_is_absolute (char *f);
+static void canonicalize_filename (char *);
+static void linebuffer_init (linebuffer *);
+static void linebuffer_setlen (linebuffer *, int);
+static void *xmalloc (size_t);
+static void *xrealloc (void *, size_t);
+
+
+static char searchar = '/';    /* use /.../ searches */
+
+static char *tagfile;          /* output file */
+static char *progname;         /* name this program was invoked with */
+static char *cwd;              /* current working directory */
+static char *tagfiledir;       /* directory of tagfile */
+static FILE *tagf;             /* ioptr for tags file */
+static ptrdiff_t whatlen_max;  /* maximum length of any 'what' member */
+
+static fdesc *fdhead;          /* head of file description list */
+static fdesc *curfdp;          /* current file description */
+static int lineno;             /* line number of current line */
+static long charno;            /* current character number */
+static long linecharno;                /* charno of start of current line */
+static char *dbp;              /* pointer to start of current tag */
+
+static const int invalidcharno = -1;
+
+static node *nodehead;         /* the head of the binary tree of tags */
+static node *last_node;                /* the last node created */
+
+static linebuffer lb;          /* the current line */
+static linebuffer filebuf;     /* a buffer containing the whole file */
+static linebuffer token_name;  /* a buffer containing a tag name */
+
+/* boolean "functions" (see init)      */
+static bool _wht[CHARS], _nin[CHARS], _itk[CHARS], _btk[CHARS], _etk[CHARS];
+static const char
+  /* white chars */
+  *white = " \f\t\n\r\v",
+  /* not in a name */
+  *nonam = " \f\t\n\r()=,;",   /* look at make_tag before modifying! */
+  /* token ending chars */
+  *endtk = " \t\n\r\"'#()[]{}=-+%*/&|^~!<>;,.:?",
+  /* token starting chars */
+  *begtk = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz$~@",
+  /* valid in-token chars */
+  *midtk = "ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz$0123456789";
+
+static bool append_to_tagfile; /* -a: append to tags */
+/* The next five default to true in C and derived languages.  */
+static bool typedefs;          /* -t: create tags for C and Ada typedefs */
+static bool typedefs_or_cplusplus; /* -T: create tags for C typedefs, level */
+                               /* 0 struct/enum/union decls, and C++ */
+                               /* member functions. */
+static bool constantypedefs;   /* -d: create tags for C #define, enum */
+                               /* constants and variables. */
+                               /* -D: opposite of -d.  Default under ctags. */
+static int globals;            /* create tags for global variables */
+static int members;            /* create tags for C member variables */
+static int declarations;       /* --declarations: tag them and extern in C&Co*/
+static int no_line_directive;  /* ignore #line directives (undocumented) */
+static int no_duplicates;      /* no duplicate tags for ctags (undocumented) */
+static bool update;            /* -u: update tags */
+static bool vgrind_style;      /* -v: create vgrind style index output */
+static bool no_warnings;       /* -w: suppress warnings (undocumented) */
+static bool cxref_style;       /* -x: create cxref style output */
+static bool cplusplus;         /* .[hc] means C++, not C (undocumented) */
+static bool ignoreindent;      /* -I: ignore indentation in C */
+static int packages_only;      /* --packages-only: in Ada, only tag packages*/
+
+/* STDIN is defined in LynxOS system headers */
+#ifdef STDIN
+# undef STDIN
+#endif
+
+#define STDIN 0x1001           /* returned by getopt_long on --parse-stdin */
+static bool parsing_stdin;     /* --parse-stdin used */
+
+static regexp *p_head;         /* list of all regexps */
+static bool need_filebuf;      /* some regexes are multi-line */
+
+static struct option longopts[] =
+{
+  { "append",             no_argument,       NULL,               'a'   },
+  { "packages-only",      no_argument,       &packages_only,     1     },
+  { "c++",                no_argument,       NULL,               'C'   },
+  { "declarations",       no_argument,       &declarations,      1     },
+  { "no-line-directive",  no_argument,       &no_line_directive, 1     },
+  { "no-duplicates",      no_argument,       &no_duplicates,     1     },
+  { "help",               no_argument,       NULL,               'h'   },
+  { "help",               no_argument,       NULL,               'H'   },
+  { "ignore-indentation", no_argument,       NULL,               'I'   },
+  { "language",           required_argument, NULL,               'l'   },
+  { "members",            no_argument,       &members,           1     },
+  { "no-members",         no_argument,       &members,           0     },
+  { "output",             required_argument, NULL,               'o'   },
+  { "regex",              required_argument, NULL,               'r'   },
+  { "no-regex",           no_argument,       NULL,               'R'   },
+  { "ignore-case-regex",  required_argument, NULL,               'c'   },
+  { "parse-stdin",        required_argument, NULL,               STDIN },
+  { "version",            no_argument,       NULL,               'V'   },
+
+#if CTAGS /* Ctags options */
+  { "backward-search",    no_argument,       NULL,               'B'   },
+  { "cxref",              no_argument,       NULL,               'x'   },
+  { "defines",            no_argument,       NULL,               'd'   },
+  { "globals",            no_argument,       &globals,           1     },
+  { "typedefs",           no_argument,       NULL,               't'   },
+  { "typedefs-and-c++",   no_argument,       NULL,               'T'   },
+  { "update",             no_argument,       NULL,               'u'   },
+  { "vgrind",             no_argument,       NULL,               'v'   },
+  { "no-warn",            no_argument,       NULL,               'w'   },
+
+#else /* Etags options */
+  { "no-defines",         no_argument,       NULL,               'D'   },
+  { "no-globals",         no_argument,       &globals,           0     },
+  { "include",            required_argument, NULL,               'i'   },
+#endif
+  { NULL }
+};
+
+static compressor compressors[] =
+{
+  { "z", "gzip -d -c"},
+  { "Z", "gzip -d -c"},
+  { "gz", "gzip -d -c"},
+  { "GZ", "gzip -d -c"},
+  { "bz2", "bzip2 -d -c" },
+  { "xz", "xz -d -c" },
+  { NULL }
+};
+
+/*
+ * Language stuff.
+ */
+
+/* Ada code */
+static const char *Ada_suffixes [] =
+  { "ads", "adb", "ada", NULL };
+static const char Ada_help [] =
+"In Ada code, functions, procedures, packages, tasks and types are\n\
+tags.  Use the `--packages-only' option to create tags for\n\
+packages only.\n\
+Ada tag names have suffixes indicating the type of entity:\n\
+       Entity type:    Qualifier:\n\
+       ------------    ----------\n\
+       function        /f\n\
+       procedure       /p\n\
+       package spec    /s\n\
+       package body    /b\n\
+       type            /t\n\
+       task            /k\n\
+Thus, `M-x find-tag <RET> bidule/b <RET>' will go directly to the\n\
+body of the package `bidule', while `M-x find-tag <RET> bidule <RET>'\n\
+will just search for any tag `bidule'.";
+
+/* Assembly code */
+static const char *Asm_suffixes [] =
+  { "a",       /* Unix assembler */
+    "asm", /* Microcontroller assembly */
+    "def", /* BSO/Tasking definition includes  */
+    "inc", /* Microcontroller include files */
+    "ins", /* Microcontroller include files */
+    "s", "sa", /* Unix assembler */
+    "S",   /* cpp-processed Unix assembler */
+    "src", /* BSO/Tasking C compiler output */
+    NULL
+  };
+static const char Asm_help [] =
+"In assembler code, labels appearing at the beginning of a line,\n\
+followed by a colon, are tags.";
+
+
+/* Note that .c and .h can be considered C++, if the --c++ flag was
+   given, or if the `class' or `template' keywords are met inside the file.
+   That is why default_C_entries is called for these. */
+static const char *default_C_suffixes [] =
+  { "c", "h", NULL };
+#if CTAGS                              /* C help for Ctags */
+static const char default_C_help [] =
+"In C code, any C function is a tag.  Use -t to tag typedefs.\n\
+Use -T to tag definitions of `struct', `union' and `enum'.\n\
+Use -d to tag `#define' macro definitions and `enum' constants.\n\
+Use --globals to tag global variables.\n\
+You can tag function declarations and external variables by\n\
+using `--declarations', and struct members by using `--members'.";
+#else                                  /* C help for Etags */
+static const char default_C_help [] =
+"In C code, any C function or typedef is a tag, and so are\n\
+definitions of `struct', `union' and `enum'.  `#define' macro\n\
+definitions and `enum' constants are tags unless you specify\n\
+`--no-defines'.  Global variables are tags unless you specify\n\
+`--no-globals' and so are struct members unless you specify\n\
+`--no-members'.  Use of `--no-globals', `--no-defines' and\n\
+`--no-members' can make the tags table file much smaller.\n\
+You can tag function declarations and external variables by\n\
+using `--declarations'.";
+#endif /* C help for Ctags and Etags */
+
+static const char *Cplusplus_suffixes [] =
+  { "C", "c++", "cc", "cpp", "cxx", "H", "h++", "hh", "hpp", "hxx",
+    "M",                       /* Objective C++ */
+    "pdb",                     /* PostScript with C syntax */
+    NULL };
+static const char Cplusplus_help [] =
+"In C++ code, all the tag constructs of C code are tagged.  (Use\n\
+--help --lang=c --lang=c++ for full help.)\n\
+In addition to C tags, member functions are also recognized.  Member\n\
+variables are recognized unless you use the `--no-members' option.\n\
+Tags for variables and functions in classes are named `CLASS::VARIABLE'\n\
+and `CLASS::FUNCTION'.  `operator' definitions have tag names like\n\
+`operator+'.";
+
+static const char *Cjava_suffixes [] =
+  { "java", NULL };
+static char Cjava_help [] =
+"In Java code, all the tags constructs of C and C++ code are\n\
+tagged.  (Use --help --lang=c --lang=c++ --lang=java for full help.)";
+
+
+static const char *Cobol_suffixes [] =
+  { "COB", "cob", NULL };
+static char Cobol_help [] =
+"In Cobol code, tags are paragraph names; that is, any word\n\
+starting in column 8 and followed by a period.";
+
+static const char *Cstar_suffixes [] =
+  { "cs", "hs", NULL };
+
+static const char *Erlang_suffixes [] =
+  { "erl", "hrl", NULL };
+static const char Erlang_help [] =
+"In Erlang code, the tags are the functions, records and macros\n\
+defined in the file.";
+
+const char *Forth_suffixes [] =
+  { "fth", "tok", NULL };
+static const char Forth_help [] =
+"In Forth code, tags are words defined by `:',\n\
+constant, code, create, defer, value, variable, buffer:, field.";
+
+static const char *Fortran_suffixes [] =
+  { "F", "f", "f90", "for", NULL };
+static const char Fortran_help [] =
+"In Fortran code, functions, subroutines and block data are tags.";
+
+static const char *HTML_suffixes [] =
+  { "htm", "html", "shtml", NULL };
+static const char HTML_help [] =
+"In HTML input files, the tags are the `title' and the `h1', `h2',\n\
+`h3' headers.  Also, tags are `name=' in anchors and all\n\
+occurrences of `id='.";
+
+static const char *Lisp_suffixes [] =
+  { "cl", "clisp", "el", "l", "lisp", "LSP", "lsp", "ml", NULL };
+static const char Lisp_help [] =
+"In Lisp code, any function defined with `defun', any variable\n\
+defined with `defvar' or `defconst', and in general the first\n\
+argument of any expression that starts with `(def' in column zero\n\
+is a tag.\n\
+The `--declarations' option tags \"(defvar foo)\" constructs too.";
+
+static const char *Lua_suffixes [] =
+  { "lua", "LUA", NULL };
+static const char Lua_help [] =
+"In Lua scripts, all functions are tags.";
+
+static const char *Makefile_filenames [] =
+  { "Makefile", "makefile", "GNUMakefile", "Makefile.in", "Makefile.am", NULL};
+static const char Makefile_help [] =
+"In makefiles, targets are tags; additionally, variables are tags\n\
+unless you specify `--no-globals'.";
+
+static const char *Objc_suffixes [] =
+  { "lm",                      /* Objective lex file */
+    "m",                       /* Objective C file */
+     NULL };
+static const char Objc_help [] =
+"In Objective C code, tags include Objective C definitions for classes,\n\
+class categories, methods and protocols.  Tags for variables and\n\
+functions in classes are named `CLASS::VARIABLE' and `CLASS::FUNCTION'.\n\
+(Use --help --lang=c --lang=objc --lang=java for full help.)";
+
+static const char *Pascal_suffixes [] =
+  { "p", "pas", NULL };
+static const char Pascal_help [] =
+"In Pascal code, the tags are the functions and procedures defined\n\
+in the file.";
+/* " // this is for working around an Emacs highlighting bug... */
+
+static const char *Perl_suffixes [] =
+  { "pl", "pm", NULL };
+static const char *Perl_interpreters [] =
+  { "perl", "@PERL@", NULL };
+static const char Perl_help [] =
+"In Perl code, the tags are the packages, subroutines and variables\n\
+defined by the `package', `sub', `my' and `local' keywords.  Use\n\
+`--globals' if you want to tag global variables.  Tags for\n\
+subroutines are named `PACKAGE::SUB'.  The name for subroutines\n\
+defined in the default package is `main::SUB'.";
+
+static const char *PHP_suffixes [] =
+  { "php", "php3", "php4", NULL };
+static const char PHP_help [] =
+"In PHP code, tags are functions, classes and defines.  Unless you use\n\
+the `--no-members' option, vars are tags too.";
+
+static const char *plain_C_suffixes [] =
+  { "pc",                      /* Pro*C file */
+     NULL };
+
+static const char *PS_suffixes [] =
+  { "ps", "psw", NULL };       /* .psw is for PSWrap */
+static const char PS_help [] =
+"In PostScript code, the tags are the functions.";
+
+static const char *Prolog_suffixes [] =
+  { "prolog", NULL };
+static const char Prolog_help [] =
+"In Prolog code, tags are predicates and rules at the beginning of\n\
+line.";
+
+static const char *Python_suffixes [] =
+  { "py", NULL };
+static const char Python_help [] =
+"In Python code, `def' or `class' at the beginning of a line\n\
+generate a tag.";
+
+/* Can't do the `SCM' or `scm' prefix with a version number. */
+static const char *Scheme_suffixes [] =
+  { "oak", "sch", "scheme", "SCM", "scm", "SM", "sm", "ss", "t", NULL };
+static const char Scheme_help [] =
+"In Scheme code, tags include anything defined with `def' or with a\n\
+construct whose name starts with `def'.  They also include\n\
+variables set with `set!' at top level in the file.";
+
+static const char *TeX_suffixes [] =
+  { "bib", "clo", "cls", "ltx", "sty", "TeX", "tex", NULL };
+static const char TeX_help [] =
+"In LaTeX text, the argument of any of the commands `\\chapter',\n\
+`\\section', `\\subsection', `\\subsubsection', `\\eqno', `\\label',\n\
+`\\ref', `\\cite', `\\bibitem', `\\part', `\\appendix', `\\entry',\n\
+`\\index', `\\def', `\\newcommand', `\\renewcommand',\n\
+`\\newenvironment' or `\\renewenvironment' is a tag.\n\
+\n\
+Other commands can be specified by setting the environment variable\n\
+`TEXTAGS' to a colon-separated list like, for example,\n\
+     TEXTAGS=\"mycommand:myothercommand\".";
+
+
+static const char *Texinfo_suffixes [] =
+  { "texi", "texinfo", "txi", NULL };
+static const char Texinfo_help [] =
+"for texinfo files, lines starting with @node are tagged.";
+
+static const char *Yacc_suffixes [] =
+  { "y", "y++", "ym", "yxx", "yy", NULL }; /* .ym is Objective yacc file */
+static const char Yacc_help [] =
+"In Bison or Yacc input files, each rule defines as a tag the\n\
+nonterminal it constructs.  The portions of the file that contain\n\
+C code are parsed as C code (use --help --lang=c --lang=yacc\n\
+for full help).";
+
+static const char auto_help [] =
+"`auto' is not a real language, it indicates to use\n\
+a default language for files base on file name suffix and file contents.";
+
+static const char none_help [] =
+"`none' is not a real language, it indicates to only do\n\
+regexp processing on files.";
+
+static const char no_lang_help [] =
+"No detailed help available for this language.";
+
+
+/*
+ * Table of languages.
+ *
+ * It is ok for a given function to be listed under more than one
+ * name.  I just didn't.
+ */
+
+static language lang_names [] =
+{
+  { "ada",       Ada_help,       Ada_funcs,         Ada_suffixes       },
+  { "asm",       Asm_help,       Asm_labels,        Asm_suffixes       },
+  { "c",         default_C_help, default_C_entries, default_C_suffixes },
+  { "c++",       Cplusplus_help, Cplusplus_entries, Cplusplus_suffixes },
+  { "c*",        no_lang_help,   Cstar_entries,     Cstar_suffixes     },
+  { "cobol",     Cobol_help,     Cobol_paragraphs,  Cobol_suffixes     },
+  { "erlang",    Erlang_help,    Erlang_functions,  Erlang_suffixes    },
+  { "forth",     Forth_help,     Forth_words,       Forth_suffixes     },
+  { "fortran",   Fortran_help,   Fortran_functions, Fortran_suffixes   },
+  { "html",      HTML_help,      HTML_labels,       HTML_suffixes      },
+  { "java",      Cjava_help,     Cjava_entries,     Cjava_suffixes     },
+  { "lisp",      Lisp_help,      Lisp_functions,    Lisp_suffixes      },
+  { "lua",       Lua_help,       Lua_functions,     Lua_suffixes       },
+  { "makefile",  Makefile_help,Makefile_targets,NULL,Makefile_filenames},
+  { "objc",      Objc_help,      plain_C_entries,   Objc_suffixes      },
+  { "pascal",    Pascal_help,    Pascal_functions,  Pascal_suffixes    },
+  { "perl",Perl_help,Perl_functions,Perl_suffixes,NULL,Perl_interpreters},
+  { "php",       PHP_help,       PHP_functions,     PHP_suffixes       },
+  { "postscript",PS_help,        PS_functions,      PS_suffixes        },
+  { "proc",      no_lang_help,   plain_C_entries,   plain_C_suffixes   },
+  { "prolog",    Prolog_help,    Prolog_functions,  Prolog_suffixes    },
+  { "python",    Python_help,    Python_functions,  Python_suffixes    },
+  { "scheme",    Scheme_help,    Scheme_functions,  Scheme_suffixes    },
+  { "tex",       TeX_help,       TeX_commands,      TeX_suffixes       },
+  { "texinfo",   Texinfo_help,   Texinfo_nodes,     Texinfo_suffixes   },
+  { "yacc",      Yacc_help,Yacc_entries,Yacc_suffixes,NULL,NULL,true},
+  { "auto",      auto_help },                      /* default guessing scheme 
*/
+  { "none",      none_help,      just_read_file }, /* regexp matching only */
+  { NULL }                /* end of list */
+};
+
+
+static void
+print_language_names (void)
+{
+  language *lang;
+  const char **name, **ext;
+
+  puts ("\nThese are the currently supported languages, along with the\n\
+default file names and dot suffixes:");
+  for (lang = lang_names; lang->name != NULL; lang++)
+    {
+      printf ("  %-*s", 10, lang->name);
+      if (lang->filenames != NULL)
+       for (name = lang->filenames; *name != NULL; name++)
+         printf (" %s", *name);
+      if (lang->suffixes != NULL)
+       for (ext = lang->suffixes; *ext != NULL; ext++)
+         printf (" .%s", *ext);
+      puts ("");
+    }
+  puts ("where `auto' means use default language for files based on file\n\
+name suffix, and `none' means only do regexp processing on files.\n\
+If no language is specified and no matching suffix is found,\n\
+the first line of the file is read for a sharp-bang (#!) sequence\n\
+followed by the name of an interpreter.  If no such sequence is found,\n\
+Fortran is tried first; if no tags are found, C is tried next.\n\
+When parsing any C file, a \"class\" or \"template\" keyword\n\
+switches to C++.");
+  puts ("Compressed files are supported using gzip, bzip2, and xz.\n\
+\n\
+For detailed help on a given language use, for example,\n\
+etags --help --lang=ada.");
+}
+
+#ifndef EMACS_NAME
+# define EMACS_NAME "standalone"
+#endif
+#ifndef VERSION
+# define VERSION "17.38.1.4"
+#endif
+static _Noreturn void
+print_version (void)
+{
+  char emacs_copyright[] = COPYRIGHT;
+
+  printf ("%s (%s %s)\n", (CTAGS) ? "ctags" : "etags", EMACS_NAME, VERSION);
+  puts (emacs_copyright);
+  puts ("This program is distributed under the terms in ETAGS.README");
+
+  exit (EXIT_SUCCESS);
+}
+
+#ifndef PRINT_UNDOCUMENTED_OPTIONS_HELP
+# define PRINT_UNDOCUMENTED_OPTIONS_HELP false
+#endif
+
+static _Noreturn void
+print_help (argument *argbuffer)
+{
+  bool help_for_lang = false;
+
+  for (; argbuffer->arg_type != at_end; argbuffer++)
+    if (argbuffer->arg_type == at_language)
+      {
+       if (help_for_lang)
+         puts ("");
+       puts (argbuffer->lang->help);
+       help_for_lang = true;
+      }
+
+  if (help_for_lang)
+    exit (EXIT_SUCCESS);
+
+  printf ("Usage: %s [options] [[regex-option ...] file-name] ...\n\
+\n\
+These are the options accepted by %s.\n", progname, progname);
+  puts ("You may use unambiguous abbreviations for the long option names.");
+  puts ("  A - as file name means read names from stdin (one per line).\n\
+Absolute names are stored in the output file as they are.\n\
+Relative ones are stored relative to the output file's directory.\n");
+
+  puts ("-a, --append\n\
+        Append tag entries to existing tags file.");
+
+  puts ("--packages-only\n\
+        For Ada files, only generate tags for packages.");
+
+  if (CTAGS)
+    puts ("-B, --backward-search\n\
+        Write the search commands for the tag entries using '?', the\n\
+        backward-search command instead of '/', the forward-search command.");
+
+  /* This option is mostly obsolete, because etags can now automatically
+     detect C++.  Retained for backward compatibility and for debugging and
+     experimentation.  In principle, we could want to tag as C++ even
+     before any "class" or "template" keyword.
+  puts ("-C, --c++\n\
+        Treat files whose name suffix defaults to C language as C++ files.");
+  */
+
+  puts ("--declarations\n\
+       In C and derived languages, create tags for function declarations,");
+  if (CTAGS)
+    puts ("\tand create tags for extern variables if --globals is used.");
+  else
+    puts
+      ("\tand create tags for extern variables unless --no-globals is used.");
+
+  if (CTAGS)
+    puts ("-d, --defines\n\
+        Create tag entries for C #define constants and enum constants, too.");
+  else
+    puts ("-D, --no-defines\n\
+        Don't create tag entries for C #define constants and enum constants.\n\
+       This makes the tags file smaller.");
+
+  if (!CTAGS)
+    puts ("-i FILE, --include=FILE\n\
+        Include a note in tag file indicating that, when searching for\n\
+        a tag, one should also consult the tags file FILE after\n\
+        checking the current file.");
+
+  puts ("-l LANG, --language=LANG\n\
+        Force the following files to be considered as written in the\n\
+       named language up to the next --language=LANG option.");
+
+  if (CTAGS)
+    puts ("--globals\n\
+       Create tag entries for global variables in some languages.");
+  else
+    puts ("--no-globals\n\
+       Do not create tag entries for global variables in some\n\
+       languages.  This makes the tags file smaller.");
+
+  if (PRINT_UNDOCUMENTED_OPTIONS_HELP)
+    puts ("--no-line-directive\n\
+        Ignore #line preprocessor directives in C and derived languages.");
+
+  if (CTAGS)
+    puts ("--members\n\
+       Create tag entries for members of structures in some languages.");
+  else
+    puts ("--no-members\n\
+       Do not create tag entries for members of structures\n\
+       in some languages.");
+
+  puts ("-r REGEXP, --regex=REGEXP or address@hidden
+        Make a tag for each line matching a regular expression pattern\n\
+       in the following files.  {LANGUAGE}REGEXP uses REGEXP for LANGUAGE\n\
+       files only.  REGEXFILE is a file containing one REGEXP per line.\n\
+       REGEXP takes the form /TAGREGEXP/TAGNAME/MODS, where TAGNAME/ is\n\
+       optional.  The TAGREGEXP pattern is anchored (as if preceded by ^).");
+  puts ("      If TAGNAME/ is present, the tags created are named.\n\
+       For example Tcl named tags can be created with:\n\
+         --regex=\"/proc[ \\t]+\\([^ \\t]+\\)/\\1/.\".\n\
+       MODS are optional one-letter modifiers: `i' means to ignore case,\n\
+       `m' means to allow multi-line matches, `s' implies `m' and\n\
+       causes dot to match any character, including newline.");
+
+  puts ("-R, --no-regex\n\
+        Don't create tags from regexps for the following files.");
+
+  puts ("-I, --ignore-indentation\n\
+        In C and C++ do not assume that a closing brace in the first\n\
+        column is the final brace of a function or structure definition.");
+
+  puts ("-o FILE, --output=FILE\n\
+        Write the tags to FILE.");
+
+  puts ("--parse-stdin=NAME\n\
+        Read from standard input and record tags as belonging to file NAME.");
+
+  if (CTAGS)
+    {
+      puts ("-t, --typedefs\n\
+        Generate tag entries for C and Ada typedefs.");
+      puts ("-T, --typedefs-and-c++\n\
+        Generate tag entries for C typedefs, C struct/enum/union tags,\n\
+        and C++ member functions.");
+    }
+
+  if (CTAGS)
+    puts ("-u, --update\n\
+        Update the tag entries for the given files, leaving tag\n\
+        entries for other files in place.  Currently, this is\n\
+        implemented by deleting the existing entries for the given\n\
+        files and then rewriting the new entries at the end of the\n\
+        tags file.  It is often faster to simply rebuild the entire\n\
+        tag file than to use this.");
+
+  if (CTAGS)
+    {
+      puts ("-v, --vgrind\n\
+        Print on the standard output an index of items intended for\n\
+        human consumption, similar to the output of vgrind.  The index\n\
+        is sorted, and gives the page number of each item.");
+
+      if (PRINT_UNDOCUMENTED_OPTIONS_HELP)
+       puts ("-w, --no-duplicates\n\
+        Do not create duplicate tag entries, for compatibility with\n\
+       traditional ctags.");
+
+      if (PRINT_UNDOCUMENTED_OPTIONS_HELP)
+       puts ("-w, --no-warn\n\
+        Suppress warning messages about duplicate tag entries.");
+
+      puts ("-x, --cxref\n\
+        Like --vgrind, but in the style of cxref, rather than vgrind.\n\
+        The output uses line numbers instead of page numbers, but\n\
+        beyond that the differences are cosmetic; try both to see\n\
+        which you like.");
+    }
+
+  puts ("-V, --version\n\
+        Print the version of the program.\n\
+-h, --help\n\
+        Print this help message.\n\
+        Followed by one or more `--language' options prints detailed\n\
+        help about tag generation for the specified languages.");
+
+  print_language_names ();
+
+  puts ("");
+  puts ("Report bugs to address@hidden");
+
+  exit (EXIT_SUCCESS);
+}
+
+
+int
+main (int argc, char **argv)
+{
+  int i;
+  unsigned int nincluded_files;
+  char **included_files;
+  argument *argbuffer;
+  int current_arg, file_count;
+  linebuffer filename_lb;
+  bool help_asked = false;
+  ptrdiff_t len;
+  char *optstring;
+  int opt;
+
+  progname = argv[0];
+  nincluded_files = 0;
+  included_files = xnew (argc, char *);
+  current_arg = 0;
+  file_count = 0;
+
+  /* Allocate enough no matter what happens.  Overkill, but each one
+     is small. */
+  argbuffer = xnew (argc, argument);
+
+  /*
+   * Always find typedefs and structure tags.
+   * Also default to find macro constants, enum constants, struct
+   * members and global variables.  Do it for both etags and ctags.
+   */
+  typedefs = typedefs_or_cplusplus = constantypedefs = true;
+  globals = members = true;
+
+  /* When the optstring begins with a '-' getopt_long does not rearrange the
+     non-options arguments to be at the end, but leaves them alone. */
+  optstring = concat ("-ac:Cf:Il:o:r:RSVhH",
+                     (CTAGS) ? "BxdtTuvw" : "Di:",
+                     "");
+
+  while ((opt = getopt_long (argc, argv, optstring, longopts, NULL)) != EOF)
+    switch (opt)
+      {
+      case 0:
+       /* If getopt returns 0, then it has already processed a
+          long-named option.  We should do nothing.  */
+       break;
+
+      case 1:
+       /* This means that a file name has been seen.  Record it. */
+       argbuffer[current_arg].arg_type = at_filename;
+       argbuffer[current_arg].what     = optarg;
+       len = strlen (optarg);
+       if (whatlen_max < len)
+         whatlen_max = len;
+       ++current_arg;
+       ++file_count;
+       break;
+
+      case STDIN:
+       /* Parse standard input.  Idea by Vivek <address@hidden>. */
+       argbuffer[current_arg].arg_type = at_stdin;
+       argbuffer[current_arg].what     = optarg;
+       len = strlen (optarg);
+       if (whatlen_max < len)
+         whatlen_max = len;
+       ++current_arg;
+       ++file_count;
+       if (parsing_stdin)
+         fatal ("cannot parse standard input more than once", (char *)NULL);
+       parsing_stdin = true;
+       break;
+
+       /* Common options. */
+      case 'a': append_to_tagfile = true;      break;
+      case 'C': cplusplus = true;              break;
+      case 'f':                /* for compatibility with old makefiles */
+      case 'o':
+       if (tagfile)
+         {
+           error ("-o option may only be given once.");
+           suggest_asking_for_help ();
+           /* NOTREACHED */
+         }
+       tagfile = optarg;
+       break;
+      case 'I':
+      case 'S':                /* for backward compatibility */
+       ignoreindent = true;
+       break;
+      case 'l':
+       {
+         language *lang = get_language_from_langname (optarg);
+         if (lang != NULL)
+           {
+             argbuffer[current_arg].lang = lang;
+             argbuffer[current_arg].arg_type = at_language;
+             ++current_arg;
+           }
+       }
+       break;
+      case 'c':
+       /* Backward compatibility: support obsolete --ignore-case-regexp. */
+       optarg = concat (optarg, "i", ""); /* memory leak here */
+       /* FALLTHRU */
+      case 'r':
+       argbuffer[current_arg].arg_type = at_regexp;
+       argbuffer[current_arg].what = optarg;
+       len = strlen (optarg);
+       if (whatlen_max < len)
+         whatlen_max = len;
+       ++current_arg;
+       break;
+      case 'R':
+       argbuffer[current_arg].arg_type = at_regexp;
+       argbuffer[current_arg].what = NULL;
+       ++current_arg;
+       break;
+      case 'V':
+       print_version ();
+       break;
+      case 'h':
+      case 'H':
+       help_asked = true;
+       break;
+
+       /* Etags options */
+      case 'D': constantypedefs = false;                       break;
+      case 'i': included_files[nincluded_files++] = optarg;    break;
+
+       /* Ctags options. */
+      case 'B': searchar = '?';                                        break;
+      case 'd': constantypedefs = true;                                break;
+      case 't': typedefs = true;                               break;
+      case 'T': typedefs = typedefs_or_cplusplus = true;       break;
+      case 'u': update = true;                                 break;
+      case 'v': vgrind_style = true;                     /*FALLTHRU*/
+      case 'x': cxref_style = true;                            break;
+      case 'w': no_warnings = true;                            break;
+      default:
+       suggest_asking_for_help ();
+       /* NOTREACHED */
+      }
+
+  /* No more options.  Store the rest of arguments. */
+  for (; optind < argc; optind++)
+    {
+      argbuffer[current_arg].arg_type = at_filename;
+      argbuffer[current_arg].what = argv[optind];
+      len = strlen (argv[optind]);
+      if (whatlen_max < len)
+       whatlen_max = len;
+      ++current_arg;
+      ++file_count;
+    }
+
+  argbuffer[current_arg].arg_type = at_end;
+
+  if (help_asked)
+    print_help (argbuffer);
+    /* NOTREACHED */
+
+  if (nincluded_files == 0 && file_count == 0)
+    {
+      error ("no input files specified.");
+      suggest_asking_for_help ();
+      /* NOTREACHED */
+    }
+
+  if (tagfile == NULL)
+    tagfile = savestr (CTAGS ? "tags" : "TAGS");
+  cwd = etags_getcwd ();       /* the current working directory */
+  if (cwd[strlen (cwd) - 1] != '/')
+    {
+      char *oldcwd = cwd;
+      cwd = concat (oldcwd, "/", "");
+      free (oldcwd);
+    }
+
+  /* Compute base directory for relative file names. */
+  if (streq (tagfile, "-")
+      || strneq (tagfile, "/dev/", 5))
+    tagfiledir = cwd;           /* relative file names are relative to cwd */
+  else
+    {
+      canonicalize_filename (tagfile);
+      tagfiledir = absolute_dirname (tagfile, cwd);
+    }
+
+  init ();                     /* set up boolean "functions" */
+
+  linebuffer_init (&lb);
+  linebuffer_init (&filename_lb);
+  linebuffer_init (&filebuf);
+  linebuffer_init (&token_name);
+
+  if (!CTAGS)
+    {
+      if (streq (tagfile, "-"))
+       {
+         tagf = stdout;
+         SET_BINARY (fileno (stdout));
+       }
+      else
+       tagf = fopen (tagfile, append_to_tagfile ? "ab" : "wb");
+      if (tagf == NULL)
+       pfatal (tagfile);
+    }
+
+  /*
+   * Loop through files finding functions.
+   */
+  for (i = 0; i < current_arg; i++)
+    {
+      static language *lang;   /* non-NULL if language is forced */
+      char *this_file;
+
+      switch (argbuffer[i].arg_type)
+       {
+       case at_language:
+         lang = argbuffer[i].lang;
+         break;
+       case at_regexp:
+         analyze_regex (argbuffer[i].what);
+         break;
+       case at_filename:
+             this_file = argbuffer[i].what;
+             /* Input file named "-" means read file names from stdin
+                (one per line) and use them. */
+             if (streq (this_file, "-"))
+               {
+                 if (parsing_stdin)
+                   fatal ("cannot parse standard input AND read file names 
from it",
+                          (char *)NULL);
+                 while (readline_internal (&filename_lb, stdin) > 0)
+                   process_file_name (filename_lb.buffer, lang);
+               }
+             else
+               process_file_name (this_file, lang);
+         break;
+        case at_stdin:
+          this_file = argbuffer[i].what;
+          process_file (stdin, this_file, lang);
+          break;
+       }
+    }
+
+  free_regexps ();
+  free (lb.buffer);
+  free (filebuf.buffer);
+  free (token_name.buffer);
+
+  if (!CTAGS || cxref_style)
+    {
+      /* Write the remaining tags to tagf (ETAGS) or stdout (CXREF). */
+      put_entries (nodehead);
+      free_tree (nodehead);
+      nodehead = NULL;
+      if (!CTAGS)
+       {
+         fdesc *fdp;
+
+         /* Output file entries that have no tags. */
+         for (fdp = fdhead; fdp != NULL; fdp = fdp->next)
+           if (!fdp->written)
+             fprintf (tagf, "\f\n%s,0\n", fdp->taggedfname);
+
+         while (nincluded_files-- > 0)
+           fprintf (tagf, "\f\n%s,include\n", *included_files++);
+
+         if (fclose (tagf) == EOF)
+           pfatal (tagfile);
+       }
+
+      exit (EXIT_SUCCESS);
+    }
+
+  /* From here on, we are in (CTAGS && !cxref_style) */
+  if (update)
+    {
+      char *cmd =
+       xmalloc (strlen (tagfile) + whatlen_max +
+                sizeof "mv..OTAGS;fgrep -v '\t\t' OTAGS >;rm OTAGS");
+      for (i = 0; i < current_arg; ++i)
+       {
+         switch (argbuffer[i].arg_type)
+           {
+           case at_filename:
+           case at_stdin:
+             break;
+           default:
+             continue;         /* the for loop */
+           }
+         char *z = stpcpy (cmd, "mv ");
+         z = stpcpy (z, tagfile);
+         z = stpcpy (z, " OTAGS;fgrep -v '\t");
+         z = stpcpy (z, argbuffer[i].what);
+         z = stpcpy (z, "\t' OTAGS >");
+         z = stpcpy (z, tagfile);
+         strcpy (z, ";rm OTAGS");
+         if (system (cmd) != EXIT_SUCCESS)
+           fatal ("failed to execute shell command", (char *)NULL);
+       }
+      free (cmd);
+      append_to_tagfile = true;
+    }
+
+  tagf = fopen (tagfile, append_to_tagfile ? "ab" : "wb");
+  if (tagf == NULL)
+    pfatal (tagfile);
+  put_entries (nodehead);      /* write all the tags (CTAGS) */
+  free_tree (nodehead);
+  nodehead = NULL;
+  if (fclose (tagf) == EOF)
+    pfatal (tagfile);
+
+  if (CTAGS)
+    if (append_to_tagfile || update)
+      {
+       char *cmd = xmalloc (2 * strlen (tagfile) + sizeof "sort -u -o..");
+       /* Maybe these should be used:
+          setenv ("LC_COLLATE", "C", 1);
+          setenv ("LC_ALL", "C", 1); */
+       char *z = stpcpy (cmd, "sort -u -o ");
+       z = stpcpy (z, tagfile);
+       *z++ = ' ';
+       strcpy (z, tagfile);
+       exit (system (cmd));
+      }
+  return EXIT_SUCCESS;
+}
+
+
+/*
+ * Return a compressor given the file name.  If EXTPTR is non-zero,
+ * return a pointer into FILE where the compressor-specific
+ * extension begins.  If no compressor is found, NULL is returned
+ * and EXTPTR is not significant.
+ * Idea by Vladimir Alexiev <address@hidden> (1998)
+ */
+static compressor *
+get_compressor_from_suffix (char *file, char **extptr)
+{
+  compressor *compr;
+  char *slash, *suffix;
+
+  /* File has been processed by canonicalize_filename,
+     so we don't need to consider backslashes on DOS_NT.  */
+  slash = strrchr (file, '/');
+  suffix = strrchr (file, '.');
+  if (suffix == NULL || suffix < slash)
+    return NULL;
+  if (extptr != NULL)
+    *extptr = suffix;
+  suffix += 1;
+  /* Let those poor souls who live with DOS 8+3 file name limits get
+     some solace by treating foo.cgz as if it were foo.c.gz, etc.
+     Only the first do loop is run if not MSDOS */
+  do
+    {
+      for (compr = compressors; compr->suffix != NULL; compr++)
+       if (streq (compr->suffix, suffix))
+         return compr;
+      if (!MSDOS)
+       break;                  /* do it only once: not really a loop */
+      if (extptr != NULL)
+       *extptr = ++suffix;
+    } while (*suffix != '\0');
+  return NULL;
+}
+
+
+
+/*
+ * Return a language given the name.
+ */
+static language *
+get_language_from_langname (const char *name)
+{
+  language *lang;
+
+  if (name == NULL)
+    error ("empty language name");
+  else
+    {
+      for (lang = lang_names; lang->name != NULL; lang++)
+       if (streq (name, lang->name))
+         return lang;
+      error ("unknown language \"%s\"", name);
+    }
+
+  return NULL;
+}
+
+
+/*
+ * Return a language given the interpreter name.
+ */
+static language *
+get_language_from_interpreter (char *interpreter)
+{
+  language *lang;
+  const char **iname;
+
+  if (interpreter == NULL)
+    return NULL;
+  for (lang = lang_names; lang->name != NULL; lang++)
+    if (lang->interpreters != NULL)
+      for (iname = lang->interpreters; *iname != NULL; iname++)
+       if (streq (*iname, interpreter))
+           return lang;
+
+  return NULL;
+}
+
+
+
+/*
+ * Return a language given the file name.
+ */
+static language *
+get_language_from_filename (char *file, int case_sensitive)
+{
+  language *lang;
+  const char **name, **ext, *suffix;
+
+  /* Try whole file name first. */
+  for (lang = lang_names; lang->name != NULL; lang++)
+    if (lang->filenames != NULL)
+      for (name = lang->filenames; *name != NULL; name++)
+       if ((case_sensitive)
+           ? streq (*name, file)
+           : strcaseeq (*name, file))
+         return lang;
+
+  /* If not found, try suffix after last dot. */
+  suffix = strrchr (file, '.');
+  if (suffix == NULL)
+    return NULL;
+  suffix += 1;
+  for (lang = lang_names; lang->name != NULL; lang++)
+    if (lang->suffixes != NULL)
+      for (ext = lang->suffixes; *ext != NULL; ext++)
+       if ((case_sensitive)
+           ? streq (*ext, suffix)
+           : strcaseeq (*ext, suffix))
+         return lang;
+  return NULL;
+}
+
+
+/*
+ * This routine is called on each file argument.
+ */
+static void
+process_file_name (char *file, language *lang)
+{
+  struct stat stat_buf;
+  FILE *inf;
+  fdesc *fdp;
+  compressor *compr;
+  char *compressed_name, *uncompressed_name;
+  char *ext, *real_name;
+  int retval;
+
+  canonicalize_filename (file);
+  if (streq (file, tagfile) && !streq (tagfile, "-"))
+    {
+      error ("skipping inclusion of %s in self.", file);
+      return;
+    }
+  if ((compr = get_compressor_from_suffix (file, &ext)) == NULL)
+    {
+      compressed_name = NULL;
+      real_name = uncompressed_name = savestr (file);
+    }
+  else
+    {
+      real_name = compressed_name = savestr (file);
+      uncompressed_name = savenstr (file, ext - file);
+    }
+
+  /* If the canonicalized uncompressed name
+     has already been dealt with, skip it silently. */
+  for (fdp = fdhead; fdp != NULL; fdp = fdp->next)
+    {
+      assert (fdp->infname != NULL);
+      if (streq (uncompressed_name, fdp->infname))
+       goto cleanup;
+    }
+
+  if (stat (real_name, &stat_buf) != 0)
+    {
+      /* Reset real_name and try with a different name. */
+      real_name = NULL;
+      if (compressed_name != NULL) /* try with the given suffix */
+       {
+         if (stat (uncompressed_name, &stat_buf) == 0)
+           real_name = uncompressed_name;
+       }
+      else                     /* try all possible suffixes */
+       {
+         for (compr = compressors; compr->suffix != NULL; compr++)
+           {
+             compressed_name = concat (file, ".", compr->suffix);
+             if (stat (compressed_name, &stat_buf) != 0)
+               {
+                 if (MSDOS)
+                   {
+                     char *suf = compressed_name + strlen (file);
+                     size_t suflen = strlen (compr->suffix) + 1;
+                     for ( ; suf[1]; suf++, suflen--)
+                       {
+                         memmove (suf, suf + 1, suflen);
+                         if (stat (compressed_name, &stat_buf) == 0)
+                           {
+                             real_name = compressed_name;
+                             break;
+                           }
+                       }
+                     if (real_name != NULL)
+                       break;
+                   } /* MSDOS */
+                 free (compressed_name);
+                 compressed_name = NULL;
+               }
+             else
+               {
+                 real_name = compressed_name;
+                 break;
+               }
+           }
+       }
+      if (real_name == NULL)
+       {
+         perror (file);
+         goto cleanup;
+       }
+    } /* try with a different name */
+
+  if (!S_ISREG (stat_buf.st_mode))
+    {
+      error ("skipping %s: it is not a regular file.", real_name);
+      goto cleanup;
+    }
+  if (real_name == compressed_name)
+    {
+      char *cmd = concat (compr->command, " ", real_name);
+      inf = popen (cmd, "r" FOPEN_BINARY);
+      free (cmd);
+    }
+  else
+    inf = fopen (real_name, "r" FOPEN_BINARY);
+  if (inf == NULL)
+    {
+      perror (real_name);
+      goto cleanup;
+    }
+
+  process_file (inf, uncompressed_name, lang);
+
+  if (real_name == compressed_name)
+    retval = pclose (inf);
+  else
+    retval = fclose (inf);
+  if (retval < 0)
+    pfatal (file);
+
+ cleanup:
+  free (compressed_name);
+  free (uncompressed_name);
+  last_node = NULL;
+  curfdp = NULL;
+  return;
+}
+
+static void
+process_file (FILE *fh, char *fn, language *lang)
+{
+  static const fdesc emptyfdesc;
+  fdesc *fdp;
+
+  /* Create a new input file description entry. */
+  fdp = xnew (1, fdesc);
+  *fdp = emptyfdesc;
+  fdp->next = fdhead;
+  fdp->infname = savestr (fn);
+  fdp->lang = lang;
+  fdp->infabsname = absolute_filename (fn, cwd);
+  fdp->infabsdir = absolute_dirname (fn, cwd);
+  if (filename_is_absolute (fn))
+    {
+      /* An absolute file name.  Canonicalize it. */
+      fdp->taggedfname = absolute_filename (fn, NULL);
+    }
+  else
+    {
+      /* A file name relative to cwd.  Make it relative
+        to the directory of the tags file. */
+      fdp->taggedfname = relative_filename (fn, tagfiledir);
+    }
+  fdp->usecharno = true;       /* use char position when making tags */
+  fdp->prop = NULL;
+  fdp->written = false;                /* not written on tags file yet */
+
+  fdhead = fdp;
+  curfdp = fdhead;             /* the current file description */
+
+  find_entries (fh);
+
+  /* If not Ctags, and if this is not metasource and if it contained no #line
+     directives, we can write the tags and free all nodes pointing to
+     curfdp. */
+  if (!CTAGS
+      && curfdp->usecharno     /* no #line directives in this file */
+      && !curfdp->lang->metasource)
+    {
+      node *np, *prev;
+
+      /* Look for the head of the sublist relative to this file.  See add_node
+        for the structure of the node tree. */
+      prev = NULL;
+      for (np = nodehead; np != NULL; prev = np, np = np->left)
+       if (np->fdp == curfdp)
+         break;
+
+      /* If we generated tags for this file, write and delete them. */
+      if (np != NULL)
+       {
+         /* This is the head of the last sublist, if any.  The following
+            instructions depend on this being true. */
+         assert (np->left == NULL);
+
+         assert (fdhead == curfdp);
+         assert (last_node->fdp == curfdp);
+         put_entries (np);     /* write tags for file curfdp->taggedfname */
+         free_tree (np);       /* remove the written nodes */
+         if (prev == NULL)
+           nodehead = NULL;    /* no nodes left */
+         else
+           prev->left = NULL;  /* delete the pointer to the sublist */
+       }
+    }
+}
+
+/*
+ * This routine sets up the boolean pseudo-functions which work
+ * by setting 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.
+ */
+static void
+init (void)
+{
+  const char *sp;
+  int i;
+
+  for (i = 0; i < CHARS; i++)
+    iswhite (i) = notinname (i) = begtoken (i) = intoken (i) = endtoken (i)
+      = false;
+  for (sp = white; *sp != '\0'; sp++) iswhite (*sp) = true;
+  for (sp = nonam; *sp != '\0'; sp++) notinname (*sp) = true;
+  notinname ('\0') = notinname ('\n');
+  for (sp = begtk; *sp != '\0'; sp++) begtoken (*sp) = true;
+  begtoken ('\0') = begtoken ('\n');
+  for (sp = midtk; *sp != '\0'; sp++) intoken (*sp) = true;
+  intoken ('\0') = intoken ('\n');
+  for (sp = endtk; *sp != '\0'; sp++) endtoken (*sp) = true;
+  endtoken ('\0') = endtoken ('\n');
+}
+
+/*
+ * This routine opens the specified file and calls the function
+ * which finds the function and type definitions.
+ */
+static void
+find_entries (FILE *inf)
+{
+  char *cp;
+  language *lang = curfdp->lang;
+  Lang_function *parser = NULL;
+
+  /* If user specified a language, use it. */
+  if (lang != NULL && lang->function != NULL)
+    {
+      parser = lang->function;
+    }
+
+  /* Else try to guess the language given the file name. */
+  if (parser == NULL)
+    {
+      lang = get_language_from_filename (curfdp->infname, true);
+      if (lang != NULL && lang->function != NULL)
+       {
+         curfdp->lang = lang;
+         parser = lang->function;
+       }
+    }
+
+  /* Else look for sharp-bang as the first two characters. */
+  if (parser == NULL
+      && readline_internal (&lb, inf) > 0
+      && lb.len >= 2
+      && lb.buffer[0] == '#'
+      && lb.buffer[1] == '!')
+    {
+      char *lp;
+
+      /* Set lp to point at the first char after the last slash in the
+         line or, if no slashes, at the first nonblank.  Then set cp to
+        the first successive blank and terminate the string. */
+      lp = strrchr (lb.buffer+2, '/');
+      if (lp != NULL)
+       lp += 1;
+      else
+       lp = skip_spaces (lb.buffer + 2);
+      cp = skip_non_spaces (lp);
+      *cp = '\0';
+
+      if (strlen (lp) > 0)
+       {
+         lang = get_language_from_interpreter (lp);
+         if (lang != NULL && lang->function != NULL)
+           {
+             curfdp->lang = lang;
+             parser = lang->function;
+           }
+       }
+    }
+
+  /* We rewind here, even if inf may be a pipe.  We fail if the
+     length of the first line is longer than the pipe block size,
+     which is unlikely. */
+  rewind (inf);
+
+  /* Else try to guess the language given the case insensitive file name. */
+  if (parser == NULL)
+    {
+      lang = get_language_from_filename (curfdp->infname, false);
+      if (lang != NULL && lang->function != NULL)
+       {
+         curfdp->lang = lang;
+         parser = lang->function;
+       }
+    }
+
+  /* Else try Fortran or C. */
+  if (parser == NULL)
+    {
+      node *old_last_node = last_node;
+
+      curfdp->lang = get_language_from_langname ("fortran");
+      find_entries (inf);
+
+      if (old_last_node == last_node)
+       /* No Fortran entries found.  Try C. */
+       {
+         /* We do not tag if rewind fails.
+            Only the file name will be recorded in the tags file. */
+         rewind (inf);
+         curfdp->lang = get_language_from_langname (cplusplus ? "c++" : "c");
+         find_entries (inf);
+       }
+      return;
+    }
+
+  if (!no_line_directive
+      && curfdp->lang != NULL && curfdp->lang->metasource)
+    /* It may be that this is a bingo.y file, and we already parsed a bingo.c
+       file, or anyway we parsed a file that is automatically generated from
+       this one.  If this is the case, the bingo.c file contained #line
+       directives that generated tags pointing to this file.  Let's delete
+       them all before parsing this file, which is the real source. */
+    {
+      fdesc **fdpp = &fdhead;
+      while (*fdpp != NULL)
+       if (*fdpp != curfdp
+           && streq ((*fdpp)->taggedfname, curfdp->taggedfname))
+         /* We found one of those!  We must delete both the file description
+            and all tags referring to it. */
+         {
+           fdesc *badfdp = *fdpp;
+
+           /* Delete the tags referring to badfdp->taggedfname
+              that were obtained from badfdp->infname. */
+           invalidate_nodes (badfdp, &nodehead);
+
+           *fdpp = badfdp->next; /* remove the bad description from the list */
+           free_fdesc (badfdp);
+         }
+       else
+         fdpp = &(*fdpp)->next; /* advance the list pointer */
+    }
+
+  assert (parser != NULL);
+
+  /* Generic initializations before reading from file. */
+  linebuffer_setlen (&filebuf, 0); /* reset the file buffer */
+
+  /* Generic initializations before parsing file with readline. */
+  lineno = 0;                 /* reset global line number */
+  charno = 0;                 /* reset global char number */
+  linecharno = 0;             /* reset global char number of line start */
+
+  parser (inf);
+
+  regex_tag_multiline ();
+}
+
+
+/*
+ * Check whether an implicitly named tag should be created,
+ * then call `pfnote'.
+ * NAME is a string that is internally copied by this function.
+ *
+ * TAGS format specification
+ * Idea by Sam Kendall <address@hidden> (1997)
+ * The following is explained in some more detail in etc/ETAGS.EBNF.
+ *
+ * make_tag creates tags with "implicit tag names" (unnamed tags)
+ * if the following are all true, assuming NONAM=" \f\t\n\r()=,;":
+ *  1. NAME does not contain any of the characters in NONAM;
+ *  2. LINESTART contains name as either a rightmost, or rightmost but
+ *     one character, substring;
+ *  3. the character, if any, immediately before NAME in LINESTART must
+ *     be a character in NONAM;
+ *  4. the character, if any, immediately after NAME in LINESTART must
+ *     also be a character in NONAM.
+ *
+ * The implementation uses the notinname() macro, which recognizes the
+ * characters stored in the string `nonam'.
+ * etags.el needs to use the same characters that are in NONAM.
+ */
+static void
+make_tag (const char *name,    /* tag name, or NULL if unnamed */
+         int namelen,          /* tag length */
+         bool is_func,         /* tag is a function */
+         char *linestart,      /* start of the line where tag is */
+         int linelen,          /* length of the line where tag is */
+         int lno,              /* line number */
+         long int cno)         /* character number */
+{
+  bool named = (name != NULL && namelen > 0);
+  char *nname = NULL;
+
+  if (!CTAGS && named)         /* maybe set named to false */
+    /* Let's try to make an implicit tag name, that is, create an unnamed tag
+       such that etags.el can guess a name from it. */
+    {
+      int i;
+      register const char *cp = name;
+
+      for (i = 0; i < namelen; i++)
+       if (notinname (*cp++))
+         break;
+      if (i == namelen)                                /* rule #1 */
+       {
+         cp = linestart + linelen - namelen;
+         if (notinname (linestart[linelen-1]))
+           cp -= 1;                            /* rule #4 */
+         if (cp >= linestart                   /* rule #2 */
+             && (cp == linestart
+                 || notinname (cp[-1]))        /* rule #3 */
+             && strneq (name, cp, namelen))    /* rule #2 */
+           named = false;      /* use implicit tag name */
+       }
+    }
+
+  if (named)
+    nname = savenstr (name, namelen);
+
+  pfnote (nname, is_func, linestart, linelen, lno, cno);
+}
+
+/* Record a tag. */
+static void
+pfnote (char *name, bool is_func, char *linestart, int linelen, int lno,
+       long int cno)
+                               /* tag name, or NULL if unnamed */
+                               /* tag is a function */
+                               /* start of the line where tag is */
+                               /* length of the line where tag is */
+                               /* line number */
+                               /* character number */
+{
+  register node *np;
+
+  assert (name == NULL || name[0] != '\0');
+  if (CTAGS && name == NULL)
+    return;
+
+  np = xnew (1, node);
+
+  /* If ctags mode, change name "main" to M<thisfilename>. */
+  if (CTAGS && !cxref_style && streq (name, "main"))
+    {
+      char *fp = strrchr (curfdp->taggedfname, '/');
+      np->name = concat ("M", fp == NULL ? curfdp->taggedfname : fp + 1, "");
+      fp = strrchr (np->name, '.');
+      if (fp != NULL && fp[1] != '\0' && fp[2] == '\0')
+       fp[0] = '\0';
+    }
+  else
+    np->name = name;
+  np->valid = true;
+  np->been_warned = false;
+  np->fdp = curfdp;
+  np->is_func = is_func;
+  np->lno = lno;
+  if (np->fdp->usecharno)
+    /* Our char numbers are 0-base, because of C language tradition?
+       ctags compatibility?  old versions compatibility?   I don't know.
+       Anyway, since emacs's are 1-base we expect etags.el to take care
+       of the difference.  If we wanted to have 1-based numbers, we would
+       uncomment the +1 below. */
+    np->cno = cno /* + 1 */ ;
+  else
+    np->cno = invalidcharno;
+  np->left = np->right = NULL;
+  if (CTAGS && !cxref_style)
+    {
+      if (strlen (linestart) < 50)
+       np->regex = concat (linestart, "$", "");
+      else
+       np->regex = savenstr (linestart, 50);
+    }
+  else
+    np->regex = savenstr (linestart, linelen);
+
+  add_node (np, &nodehead);
+}
+
+/*
+ * free_tree ()
+ *     recurse on left children, iterate on right children.
+ */
+static void
+free_tree (register node *np)
+{
+  while (np)
+    {
+      register node *node_right = np->right;
+      free_tree (np->left);
+      free (np->name);
+      free (np->regex);
+      free (np);
+      np = node_right;
+    }
+}
+
+/*
+ * free_fdesc ()
+ *     delete a file description
+ */
+static void
+free_fdesc (register fdesc *fdp)
+{
+  free (fdp->infname);
+  free (fdp->infabsname);
+  free (fdp->infabsdir);
+  free (fdp->taggedfname);
+  free (fdp->prop);
+  free (fdp);
+}
+
+/*
+ * add_node ()
+ *     Adds a node to the tree of nodes.  In etags mode, sort by file
+ *     name.  In ctags mode, sort by tag name.  Make no attempt at
+ *     balancing.
+ *
+ *     add_node is the only function allowed to add nodes, so it can
+ *     maintain state.
+ */
+static void
+add_node (node *np, node **cur_node_p)
+{
+  register int dif;
+  register node *cur_node = *cur_node_p;
+
+  if (cur_node == NULL)
+    {
+      *cur_node_p = np;
+      last_node = np;
+      return;
+    }
+
+  if (!CTAGS)
+    /* Etags Mode */
+    {
+      /* For each file name, tags are in a linked sublist on the right
+        pointer.  The first tags of different files are a linked list
+        on the left pointer.  last_node points to the end of the last
+        used sublist. */
+      if (last_node != NULL && last_node->fdp == np->fdp)
+       {
+         /* Let's use the same sublist as the last added node. */
+         assert (last_node->right == NULL);
+         last_node->right = np;
+         last_node = np;
+       }
+      else if (cur_node->fdp == np->fdp)
+       {
+         /* Scanning the list we found the head of a sublist which is
+            good for us.  Let's scan this sublist. */
+         add_node (np, &cur_node->right);
+       }
+      else
+       /* The head of this sublist is not good for us.  Let's try the
+          next one. */
+       add_node (np, &cur_node->left);
+    } /* if ETAGS mode */
+
+  else
+    {
+      /* Ctags Mode */
+      dif = strcmp (np->name, cur_node->name);
+
+      /*
+       * If this tag name matches an existing one, then
+       * do not add the node, but maybe print a warning.
+       */
+      if (no_duplicates && !dif)
+       {
+         if (np->fdp == cur_node->fdp)
+           {
+             if (!no_warnings)
+               {
+                 fprintf (stderr, "Duplicate entry in file %s, line %d: %s\n",
+                          np->fdp->infname, lineno, np->name);
+                 fprintf (stderr, "Second entry ignored\n");
+               }
+           }
+         else if (!cur_node->been_warned && !no_warnings)
+           {
+             fprintf
+               (stderr,
+                "Duplicate entry in files %s and %s: %s (Warning only)\n",
+                np->fdp->infname, cur_node->fdp->infname, np->name);
+             cur_node->been_warned = true;
+           }
+         return;
+       }
+
+      /* Actually add the node */
+      add_node (np, dif < 0 ? &cur_node->left : &cur_node->right);
+    } /* if CTAGS mode */
+}
+
+/*
+ * invalidate_nodes ()
+ *     Scan the node tree and invalidate all nodes pointing to the
+ *     given file description (CTAGS case) or free them (ETAGS case).
+ */
+static void
+invalidate_nodes (fdesc *badfdp, node **npp)
+{
+  node *np = *npp;
+
+  if (np == NULL)
+    return;
+
+  if (CTAGS)
+    {
+      if (np->left != NULL)
+       invalidate_nodes (badfdp, &np->left);
+      if (np->fdp == badfdp)
+       np->valid = false;
+      if (np->right != NULL)
+       invalidate_nodes (badfdp, &np->right);
+    }
+  else
+    {
+      assert (np->fdp != NULL);
+      if (np->fdp == badfdp)
+       {
+         *npp = np->left;      /* detach the sublist from the list */
+         np->left = NULL;      /* isolate it */
+         free_tree (np);       /* free it */
+         invalidate_nodes (badfdp, npp);
+       }
+      else
+       invalidate_nodes (badfdp, &np->left);
+    }
+}
+
+
+static int total_size_of_entries (node *);
+static int number_len (long) ATTRIBUTE_CONST;
+
+/* Length of a non-negative number's decimal representation. */
+static int
+number_len (long int num)
+{
+  int len = 1;
+  while ((num /= 10) > 0)
+    len += 1;
+  return len;
+}
+
+/*
+ * Return total number of characters that put_entries will output for
+ * the nodes in the linked list at the right of the specified node.
+ * This count is irrelevant with etags.el since emacs 19.34 at least,
+ * but is still supplied for backward compatibility.
+ */
+static int
+total_size_of_entries (register node *np)
+{
+  register int total = 0;
+
+  for (; np != NULL; np = np->right)
+    if (np->valid)
+      {
+       total += strlen (np->regex) + 1;                /* pat\177 */
+       if (np->name != NULL)
+         total += strlen (np->name) + 1;               /* name\001 */
+       total += number_len ((long) np->lno) + 1;       /* lno, */
+       if (np->cno != invalidcharno)                   /* cno */
+         total += number_len (np->cno);
+       total += 1;                                     /* newline */
+      }
+
+  return total;
+}
+
+static void
+put_entries (register node *np)
+{
+  register char *sp;
+  static fdesc *fdp = NULL;
+
+  if (np == NULL)
+    return;
+
+  /* Output subentries that precede this one */
+  if (CTAGS)
+    put_entries (np->left);
+
+  /* Output this entry */
+  if (np->valid)
+    {
+      if (!CTAGS)
+       {
+         /* Etags mode */
+         if (fdp != np->fdp)
+           {
+             fdp = np->fdp;
+             fprintf (tagf, "\f\n%s,%d\n",
+                      fdp->taggedfname, total_size_of_entries (np));
+             fdp->written = true;
+           }
+         fputs (np->regex, tagf);
+         fputc ('\177', tagf);
+         if (np->name != NULL)
+           {
+             fputs (np->name, tagf);
+             fputc ('\001', tagf);
+           }
+         fprintf (tagf, "%d,", np->lno);
+         if (np->cno != invalidcharno)
+           fprintf (tagf, "%ld", np->cno);
+         fputs ("\n", tagf);
+       }
+      else
+       {
+         /* Ctags mode */
+         if (np->name == NULL)
+           error ("internal error: NULL name in ctags mode.");
+
+         if (cxref_style)
+           {
+             if (vgrind_style)
+               fprintf (stdout, "%s %s %d\n",
+                        np->name, np->fdp->taggedfname, (np->lno + 63) / 64);
+             else
+               fprintf (stdout, "%-16s %3d %-16s %s\n",
+                        np->name, np->lno, np->fdp->taggedfname, np->regex);
+           }
+         else
+           {
+             fprintf (tagf, "%s\t%s\t", np->name, np->fdp->taggedfname);
+
+             if (np->is_func)
+               {               /* function or #define macro with args */
+                 putc (searchar, tagf);
+                 putc ('^', tagf);
+
+                 for (sp = np->regex; *sp; sp++)
+                   {
+                     if (*sp == '\\' || *sp == searchar)
+                       putc ('\\', tagf);
+                     putc (*sp, tagf);
+                   }
+                 putc (searchar, tagf);
+               }
+             else
+               {               /* anything else; text pattern inadequate */
+                 fprintf (tagf, "%d", np->lno);
+               }
+             putc ('\n', tagf);
+           }
+       }
+    } /* if this node contains a valid tag */
+
+  /* Output subentries that follow this one */
+  put_entries (np->right);
+  if (!CTAGS)
+    put_entries (np->left);
+}
+
+
+/* C extensions. */
+#define C_EXT  0x00fff         /* C extensions */
+#define C_PLAIN 0x00000                /* C */
+#define C_PLPL 0x00001         /* C++ */
+#define C_STAR 0x00003         /* C* */
+#define C_JAVA 0x00005         /* JAVA */
+#define C_AUTO  0x01000                /* C, but switch to C++ if `class' is 
met */
+#define YACC   0x10000         /* yacc file */
+
+/*
+ * The C symbol tables.
+ */
+enum sym_type
+{
+  st_none,
+  st_C_objprot, st_C_objimpl, st_C_objend,
+  st_C_gnumacro,
+  st_C_ignore, st_C_attribute,
+  st_C_javastruct,
+  st_C_operator,
+  st_C_class, st_C_template,
+  st_C_struct, st_C_extern, st_C_enum, st_C_define, st_C_typedef
+};
+
+/* Feed stuff between (but not including) %[ and %] lines to:
+     gperf -m 5
+%[
+%compare-strncmp
+%enum
+%struct-type
+struct C_stab_entry { char *name; int c_ext; enum sym_type type; }
+%%
+if,            0,                      st_C_ignore
+for,           0,                      st_C_ignore
+while,         0,                      st_C_ignore
+switch,                0,                      st_C_ignore
+return,                0,                      st_C_ignore
+__attribute__, 0,                      st_C_attribute
+GTY,            0,                      st_C_attribute
address@hidden, 0,                      st_C_objprot
address@hidden, 0,                      st_C_objprot
address@hidden,0,                       st_C_objimpl
address@hidden,         0,                      st_C_objend
+import,                (C_JAVA & ~C_PLPL),     st_C_ignore
+package,       (C_JAVA & ~C_PLPL),     st_C_ignore
+friend,                C_PLPL,                 st_C_ignore
+extends,       (C_JAVA & ~C_PLPL),     st_C_javastruct
+implements,    (C_JAVA & ~C_PLPL),     st_C_javastruct
+interface,     (C_JAVA & ~C_PLPL),     st_C_struct
+class,         0,                      st_C_class
+namespace,     C_PLPL,                 st_C_struct
+domain,                C_STAR,                 st_C_struct
+union,         0,                      st_C_struct
+struct,                0,                      st_C_struct
+extern,                0,                      st_C_extern
+enum,          0,                      st_C_enum
+typedef,       0,                      st_C_typedef
+define,                0,                      st_C_define
+undef,         0,                      st_C_define
+operator,      C_PLPL,                 st_C_operator
+template,      0,                      st_C_template
+# DEFUN used in emacs, the next three used in glibc (SYSCALL only for mach).
+DEFUN,         0,                      st_C_gnumacro
+SYSCALL,       0,                      st_C_gnumacro
+ENTRY,         0,                      st_C_gnumacro
+PSEUDO,                0,                      st_C_gnumacro
+# These are defined inside C functions, so currently they are not met.
+# EXFUN used in glibc, DEFVAR_* in emacs.
+#EXFUN,                0,                      st_C_gnumacro
+#DEFVAR_,      0,                      st_C_gnumacro
+%]
+and replace lines between %< and %> with its output, then:
+ - remove the #if characterset check
+ - make in_word_set static and not inline. */
+/*%<*/
+/* C code produced by gperf version 3.0.1 */
+/* Command-line: gperf -m 5  */
+/* Computed positions: -k'2-3' */
+
+struct C_stab_entry { const char *name; int c_ext; enum sym_type type; };
+/* maximum key range = 33, duplicates = 0 */
+
+static int
+hash (const char *str, int len)
+{
+  static char const asso_values[] =
+    {
+      35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+      35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+      35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+      35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+      35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+      35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+      35, 35, 35, 35, 35, 35, 35, 35, 35,  3,
+      26, 35, 35, 35, 35, 35, 35, 35, 27, 35,
+      35, 35, 35, 24,  0, 35, 35, 35, 35,  0,
+      35, 35, 35, 35, 35,  1, 35, 16, 35,  6,
+      23,  0,  0, 35, 22,  0, 35, 35,  5,  0,
+       0, 15,  1, 35,  6, 35,  8, 19, 35, 16,
+       4,  5, 35, 35, 35, 35, 35, 35, 35, 35,
+      35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+      35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+      35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+      35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+      35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+      35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+      35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+      35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+      35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+      35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+      35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+      35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+      35, 35, 35, 35, 35, 35
+    };
+  int hval = len;
+
+  switch (hval)
+    {
+      default:
+        hval += asso_values[(unsigned char) str[2]];
+      /*FALLTHROUGH*/
+      case 2:
+        hval += asso_values[(unsigned char) str[1]];
+        break;
+    }
+  return hval;
+}
+
+static struct C_stab_entry *
+in_word_set (register const char *str, register unsigned int len)
+{
+  enum
+    {
+      TOTAL_KEYWORDS = 33,
+      MIN_WORD_LENGTH = 2,
+      MAX_WORD_LENGTH = 15,
+      MIN_HASH_VALUE = 2,
+      MAX_HASH_VALUE = 34
+    };
+
+  static struct C_stab_entry wordlist[] =
+    {
+      {""}, {""},
+      {"if",           0,                      st_C_ignore},
+      {"GTY",           0,                      st_C_attribute},
+      {"@end",         0,                      st_C_objend},
+      {"union",                0,                      st_C_struct},
+      {"define",               0,                      st_C_define},
+      {"import",               (C_JAVA & ~C_PLPL),     st_C_ignore},
+      {"template",     0,                      st_C_template},
+      {"operator",     C_PLPL,                 st_C_operator},
+      {"@interface",   0,                      st_C_objprot},
+      {"implements",   (C_JAVA & ~C_PLPL),     st_C_javastruct},
+      {"friend",               C_PLPL,                 st_C_ignore},
+      {"typedef",      0,                      st_C_typedef},
+      {"return",               0,                      st_C_ignore},
+      {"@implementation",0,                    st_C_objimpl},
+      {"@protocol",    0,                      st_C_objprot},
+      {"interface",    (C_JAVA & ~C_PLPL),     st_C_struct},
+      {"extern",               0,                      st_C_extern},
+      {"extends",      (C_JAVA & ~C_PLPL),     st_C_javastruct},
+      {"struct",               0,                      st_C_struct},
+      {"domain",               C_STAR,                 st_C_struct},
+      {"switch",               0,                      st_C_ignore},
+      {"enum",         0,                      st_C_enum},
+      {"for",          0,                      st_C_ignore},
+      {"namespace",    C_PLPL,                 st_C_struct},
+      {"class",                0,                      st_C_class},
+      {"while",                0,                      st_C_ignore},
+      {"undef",                0,                      st_C_define},
+      {"package",      (C_JAVA & ~C_PLPL),     st_C_ignore},
+      {"__attribute__",        0,                      st_C_attribute},
+      {"SYSCALL",      0,                      st_C_gnumacro},
+      {"ENTRY",                0,                      st_C_gnumacro},
+      {"PSEUDO",               0,                      st_C_gnumacro},
+      {"DEFUN",                0,                      st_C_gnumacro}
+    };
+
+  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+    {
+      int key = hash (str, len);
+
+      if (key <= MAX_HASH_VALUE && key >= 0)
+        {
+          const char *s = wordlist[key].name;
+
+          if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == 
'\0')
+            return &wordlist[key];
+        }
+    }
+  return 0;
+}
+/*%>*/
+
+static enum sym_type
+C_symtype (char *str, int len, int c_ext)
+{
+  register struct C_stab_entry *se = in_word_set (str, len);
+
+  if (se == NULL || (se->c_ext && !(c_ext & se->c_ext)))
+    return st_none;
+  return se->type;
+}
+
+
+/*
+ * Ignoring __attribute__ ((list))
+ */
+static bool inattribute;       /* looking at an __attribute__ construct */
+
+/*
+ * C functions and variables are recognized using a simple
+ * finite automaton.  fvdef is its state variable.
+ */
+static enum
+{
+  fvnone,                      /* nothing seen */
+  fdefunkey,                   /* Emacs DEFUN keyword seen */
+  fdefunname,                  /* Emacs DEFUN name seen */
+  foperator,                   /* func: operator keyword seen (cplpl) */
+  fvnameseen,                  /* function or variable name seen */
+  fstartlist,                  /* func: just after open parenthesis */
+  finlist,                     /* func: in parameter list */
+  flistseen,                   /* func: after parameter list */
+  fignore,                     /* func: before open brace */
+  vignore                      /* var-like: ignore until ';' */
+} fvdef;
+
+static bool fvextern;          /* func or var: extern keyword seen; */
+
+/*
+ * typedefs are recognized using a simple finite automaton.
+ * typdef is its state variable.
+ */
+static enum
+{
+  tnone,                       /* nothing seen */
+  tkeyseen,                    /* typedef keyword seen */
+  ttypeseen,                   /* defined type seen */
+  tinbody,                     /* inside typedef body */
+  tend,                                /* just before typedef tag */
+  tignore                      /* junk after typedef tag */
+} typdef;
+
+/*
+ * struct-like structures (enum, struct and union) are recognized
+ * using another simple finite automaton.  `structdef' is its state
+ * variable.
+ */
+static enum
+{
+  snone,                       /* nothing seen yet,
+                                  or in struct body if bracelev > 0 */
+  skeyseen,                    /* struct-like keyword seen */
+  stagseen,                    /* struct-like tag seen */
+  scolonseen                   /* colon seen after struct-like tag */
+} structdef;
+
+/*
+ * When objdef is different from onone, objtag is the name of the class.
+ */
+static const char *objtag = "<uninited>";
+
+/*
+ * Yet another little state machine to deal with preprocessor lines.
+ */
+static enum
+{
+  dnone,                       /* nothing seen */
+  dsharpseen,                  /* '#' seen as first char on line */
+  ddefineseen,                 /* '#' and 'define' seen */
+  dignorerest                  /* ignore rest of line */
+} definedef;
+
+/*
+ * State machine for Objective C protocols and implementations.
+ * Idea by Tom R.Hageman <address@hidden> (1995)
+ */
+static enum
+{
+  onone,                       /* nothing seen */
+  oprotocol,                   /* @interface or @protocol seen */
+  oimplementation,             /* @implementations seen */
+  otagseen,                    /* class name seen */
+  oparenseen,                  /* parenthesis before category seen */
+  ocatseen,                    /* category name seen */
+  oinbody,                     /* in @implementation body */
+  omethodsign,                 /* in @implementation body, after +/- */
+  omethodtag,                  /* after method name */
+  omethodcolon,                        /* after method colon */
+  omethodparm,                 /* after method parameter */
+  oignore                      /* wait for @end */
+} objdef;
+
+
+/*
+ * Use this structure to keep info about the token read, and how it
+ * should be tagged.  Used by the make_C_tag function to build a tag.
+ */
+static struct tok
+{
+  char *line;                  /* string containing the token */
+  int offset;                  /* where the token starts in LINE */
+  int length;                  /* token length */
+  /*
+    The previous members can be used to pass strings around for generic
+    purposes.  The following ones specifically refer to creating tags.  In this
+    case the token contained here is the pattern that will be used to create a
+    tag.
+  */
+  bool valid;                  /* do not create a tag; the token should be
+                                  invalidated whenever a state machine is
+                                  reset prematurely */
+  bool named;                  /* create a named tag */
+  int lineno;                  /* source line number of tag */
+  long linepos;                        /* source char number of tag */
+} token;                       /* latest token read */
+
+/*
+ * Variables and functions for dealing with nested structures.
+ * Idea by Mykola Dzyuba <address@hidden> (2001)
+ */
+static void pushclass_above (int, char *, int);
+static void popclass_above (int);
+static void write_classname (linebuffer *, const char *qualifier);
+
+static struct {
+  char **cname;                        /* nested class names */
+  int *bracelev;               /* nested class brace level */
+  int nl;                      /* class nesting level (elements used) */
+  int size;                    /* length of the array */
+} cstack;                      /* stack for nested declaration tags */
+/* Current struct nesting depth (namespace, class, struct, union, enum). */
+#define nestlev                (cstack.nl)
+/* After struct keyword or in struct body, not inside a nested function. */
+#define instruct       (structdef == snone && nestlev > 0                      
\
+                        && bracelev == cstack.bracelev[nestlev-1] + 1)
+
+static void
+pushclass_above (int bracelev, char *str, int len)
+{
+  int nl;
+
+  popclass_above (bracelev);
+  nl = cstack.nl;
+  if (nl >= cstack.size)
+    {
+      int size = cstack.size *= 2;
+      xrnew (cstack.cname, size, char *);
+      xrnew (cstack.bracelev, size, int);
+    }
+  assert (nl == 0 || cstack.bracelev[nl-1] < bracelev);
+  cstack.cname[nl] = (str == NULL) ? NULL : savenstr (str, len);
+  cstack.bracelev[nl] = bracelev;
+  cstack.nl = nl + 1;
+}
+
+static void
+popclass_above (int bracelev)
+{
+  int nl;
+
+  for (nl = cstack.nl - 1;
+       nl >= 0 && cstack.bracelev[nl] >= bracelev;
+       nl--)
+    {
+      free (cstack.cname[nl]);
+      cstack.nl = nl;
+    }
+}
+
+static void
+write_classname (linebuffer *cn, const char *qualifier)
+{
+  int i, len;
+  int qlen = strlen (qualifier);
+
+  if (cstack.nl == 0 || cstack.cname[0] == NULL)
+    {
+      len = 0;
+      cn->len = 0;
+      cn->buffer[0] = '\0';
+    }
+  else
+    {
+      len = strlen (cstack.cname[0]);
+      linebuffer_setlen (cn, len);
+      strcpy (cn->buffer, cstack.cname[0]);
+    }
+  for (i = 1; i < cstack.nl; i++)
+    {
+      char *s = cstack.cname[i];
+      if (s == NULL)
+       continue;
+      linebuffer_setlen (cn, len + qlen + strlen (s));
+      len += sprintf (cn->buffer + len, "%s%s", qualifier, s);
+    }
+}
+
+
+static bool consider_token (char *, int, int, int *, int, int, bool *);
+static void make_C_tag (bool);
+
+/*
+ * consider_token ()
+ *     checks to see if the current token is at the start of a
+ *     function or variable, or corresponds to a typedef, or
+ *     is a struct/union/enum tag, or #define, or an enum constant.
+ *
+ *     *IS_FUNC_OR_VAR gets true if the token is a function or #define macro
+ *     with args.  C_EXTP points to which language we are looking at.
+ *
+ * Globals
+ *     fvdef                   IN OUT
+ *     structdef               IN OUT
+ *     definedef               IN OUT
+ *     typdef                  IN OUT
+ *     objdef                  IN OUT
+ */
+
+static bool
+consider_token (char *str, int len, int c, int *c_extp,
+               int bracelev, int parlev, bool *is_func_or_var)
+                               /* IN: token pointer */
+                               /* IN: token length */
+                               /* IN: first char after the token */
+                               /* IN, OUT: C extensions mask */
+                               /* IN: brace level */
+                               /* IN: parenthesis level */
+                               /* OUT: function or variable found */
+{
+  /* When structdef is stagseen, scolonseen, or snone with bracelev > 0,
+     structtype is the type of the preceding struct-like keyword, and
+     structbracelev is the brace level where it has been seen. */
+  static enum sym_type structtype;
+  static int structbracelev;
+  static enum sym_type toktype;
+
+
+  toktype = C_symtype (str, len, *c_extp);
+
+  /*
+   * Skip __attribute__
+   */
+  if (toktype == st_C_attribute)
+    {
+      inattribute = true;
+      return false;
+     }
+
+   /*
+    * Advance the definedef state machine.
+    */
+   switch (definedef)
+     {
+     case dnone:
+       /* We're not on a preprocessor line. */
+       if (toktype == st_C_gnumacro)
+        {
+          fvdef = fdefunkey;
+          return false;
+        }
+       break;
+     case dsharpseen:
+       if (toktype == st_C_define)
+        {
+          definedef = ddefineseen;
+        }
+       else
+        {
+          definedef = dignorerest;
+        }
+       return false;
+     case ddefineseen:
+       /*
+       * Make a tag for any macro, unless it is a constant
+       * and constantypedefs is false.
+       */
+       definedef = dignorerest;
+       *is_func_or_var = (c == '(');
+       if (!*is_func_or_var && !constantypedefs)
+        return false;
+       else
+        return true;
+     case dignorerest:
+       return false;
+     default:
+       error ("internal error: definedef value.");
+     }
+
+   /*
+    * Now typedefs
+    */
+   switch (typdef)
+     {
+     case tnone:
+       if (toktype == st_C_typedef)
+        {
+          if (typedefs)
+            typdef = tkeyseen;
+          fvextern = false;
+          fvdef = fvnone;
+          return false;
+        }
+       break;
+     case tkeyseen:
+       switch (toktype)
+        {
+        case st_none:
+        case st_C_class:
+        case st_C_struct:
+        case st_C_enum:
+          typdef = ttypeseen;
+        }
+       break;
+     case ttypeseen:
+       if (structdef == snone && fvdef == fvnone)
+        {
+          fvdef = fvnameseen;
+          return true;
+        }
+       break;
+     case tend:
+       switch (toktype)
+        {
+        case st_C_class:
+        case st_C_struct:
+        case st_C_enum:
+          return false;
+        }
+       return true;
+     }
+
+   switch (toktype)
+     {
+     case st_C_javastruct:
+       if (structdef == stagseen)
+        structdef = scolonseen;
+       return false;
+     case st_C_template:
+     case st_C_class:
+       if ((*c_extp & C_AUTO)  /* automatic detection of C++ language */
+          && bracelev == 0
+          && definedef == dnone && structdef == snone
+          && typdef == tnone && fvdef == fvnone)
+        *c_extp = (*c_extp | C_PLPL) & ~C_AUTO;
+       if (toktype == st_C_template)
+        break;
+       /* FALLTHRU */
+     case st_C_struct:
+     case st_C_enum:
+       if (parlev == 0
+          && fvdef != vignore
+          && (typdef == tkeyseen
+              || (typedefs_or_cplusplus && structdef == snone)))
+        {
+          structdef = skeyseen;
+          structtype = toktype;
+          structbracelev = bracelev;
+          if (fvdef == fvnameseen)
+            fvdef = fvnone;
+        }
+       return false;
+     }
+
+   if (structdef == skeyseen)
+     {
+       structdef = stagseen;
+       return true;
+     }
+
+   if (typdef != tnone)
+     definedef = dnone;
+
+   /* Detect Objective C constructs. */
+   switch (objdef)
+     {
+     case onone:
+       switch (toktype)
+        {
+        case st_C_objprot:
+          objdef = oprotocol;
+          return false;
+        case st_C_objimpl:
+          objdef = oimplementation;
+          return false;
+        }
+       break;
+     case oimplementation:
+       /* Save the class tag for functions or variables defined inside. */
+       objtag = savenstr (str, len);
+       objdef = oinbody;
+       return false;
+     case oprotocol:
+       /* Save the class tag for categories. */
+       objtag = savenstr (str, len);
+       objdef = otagseen;
+       *is_func_or_var = true;
+       return true;
+     case oparenseen:
+       objdef = ocatseen;
+       *is_func_or_var = true;
+       return true;
+     case oinbody:
+       break;
+     case omethodsign:
+       if (parlev == 0)
+        {
+          fvdef = fvnone;
+          objdef = omethodtag;
+          linebuffer_setlen (&token_name, len);
+          memcpy (token_name.buffer, str, len);
+          token_name.buffer[len] = '\0';
+          return true;
+        }
+       return false;
+     case omethodcolon:
+       if (parlev == 0)
+        objdef = omethodparm;
+       return false;
+     case omethodparm:
+       if (parlev == 0)
+        {
+          int oldlen = token_name.len;
+          fvdef = fvnone;
+          objdef = omethodtag;
+          linebuffer_setlen (&token_name, oldlen + len);
+          memcpy (token_name.buffer + oldlen, str, len);
+          token_name.buffer[oldlen + len] = '\0';
+          return true;
+        }
+       return false;
+     case oignore:
+       if (toktype == st_C_objend)
+        {
+          /* Memory leakage here: the string pointed by objtag is
+             never released, because many tests would be needed to
+             avoid breaking on incorrect input code.  The amount of
+             memory leaked here is the sum of the lengths of the
+             class tags.
+          free (objtag); */
+          objdef = onone;
+        }
+       return false;
+     }
+
+   /* A function, variable or enum constant? */
+   switch (toktype)
+     {
+     case st_C_extern:
+       fvextern = true;
+       switch  (fvdef)
+        {
+        case finlist:
+        case flistseen:
+        case fignore:
+        case vignore:
+          break;
+        default:
+          fvdef = fvnone;
+        }
+       return false;
+     case st_C_ignore:
+       fvextern = false;
+       fvdef = vignore;
+       return false;
+     case st_C_operator:
+       fvdef = foperator;
+       *is_func_or_var = true;
+       return true;
+     case st_none:
+       if (constantypedefs
+          && structdef == snone
+          && structtype == st_C_enum && bracelev > structbracelev
+          /* Don't tag tokens in expressions that assign values to enum
+             constants.  */
+          && fvdef != vignore)
+        return true;           /* enum constant */
+       switch (fvdef)
+        {
+        case fdefunkey:
+          if (bracelev > 0)
+            break;
+          fvdef = fdefunname;  /* GNU macro */
+          *is_func_or_var = true;
+          return true;
+        case fvnone:
+          switch (typdef)
+            {
+            case ttypeseen:
+              return false;
+            case tnone:
+              if ((strneq (str, "asm", 3) && endtoken (str[3]))
+                  || (strneq (str, "__asm__", 7) && endtoken (str[7])))
+                {
+                  fvdef = vignore;
+                  return false;
+                }
+              break;
+            }
+         /* FALLTHRU */
+         case fvnameseen:
+         if (len >= 10 && strneq (str+len-10, "::operator", 10))
+           {
+             if (*c_extp & C_AUTO) /* automatic detection of C++ */
+               *c_extp = (*c_extp | C_PLPL) & ~C_AUTO;
+             fvdef = foperator;
+             *is_func_or_var = true;
+             return true;
+           }
+         if (bracelev > 0 && !instruct)
+           break;
+         fvdef = fvnameseen;   /* function or variable */
+         *is_func_or_var = true;
+         return true;
+       }
+      break;
+    }
+
+  return false;
+}
+
+
+/*
+ * C_entries often keeps pointers to tokens or lines which are older than
+ * the line currently read.  By keeping two line buffers, and switching
+ * them at end of line, it is possible to use those pointers.
+ */
+static struct
+{
+  long linepos;
+  linebuffer lb;
+} lbs[2];
+
+#define current_lb_is_new (newndx == curndx)
+#define switch_line_buffers() (curndx = 1 - curndx)
+
+#define curlb (lbs[curndx].lb)
+#define newlb (lbs[newndx].lb)
+#define curlinepos (lbs[curndx].linepos)
+#define newlinepos (lbs[newndx].linepos)
+
+#define plainc ((c_ext & C_EXT) == C_PLAIN)
+#define cplpl (c_ext & C_PLPL)
+#define cjava ((c_ext & C_JAVA) == C_JAVA)
+
+#define CNL_SAVE_DEFINEDEF()                                           \
+do {                                                                   \
+  curlinepos = charno;                                                 \
+  readline (&curlb, inf);                                              \
+  lp = curlb.buffer;                                                   \
+  quotednl = false;                                                    \
+  newndx = curndx;                                                     \
+} while (0)
+
+#define CNL()                                                          \
+do {                                                                   \
+  CNL_SAVE_DEFINEDEF();                                                        
\
+  if (savetoken.valid)                                                 \
+    {                                                                  \
+      token = savetoken;                                               \
+      savetoken.valid = false;                                         \
+    }                                                                  \
+  definedef = dnone;                                                   \
+} while (0)
+
+
+static void
+make_C_tag (bool isfun)
+{
+  /* This function is never called when token.valid is false, but
+     we must protect against invalid input or internal errors. */
+  if (token.valid)
+    make_tag (token_name.buffer, token_name.len, isfun, token.line,
+             token.offset+token.length+1, token.lineno, token.linepos);
+  else if (DEBUG)
+    {                            /* this branch is optimized away if !DEBUG */
+      make_tag (concat ("INVALID TOKEN:-->", token_name.buffer, ""),
+               token_name.len + 17, isfun, token.line,
+               token.offset+token.length+1, token.lineno, token.linepos);
+      error ("INVALID TOKEN");
+    }
+
+  token.valid = false;
+}
+
+
+/*
+ * C_entries ()
+ *     This routine finds functions, variables, typedefs,
+ *     #define's, enum constants and struct/union/enum definitions in
+ *     C syntax and adds them to the list.
+ */
+static void
+C_entries (int c_ext, FILE *inf)
+                                       /* extension of C */
+                                       /* input file */
+{
+  register char c;             /* latest char read; '\0' for end of line */
+  register char *lp;           /* pointer one beyond the character `c' */
+  int curndx, newndx;          /* indices for current and new lb */
+  register int tokoff;         /* offset in line of start of current token */
+  register int toklen;         /* length of current token */
+  const char *qualifier;        /* string used to qualify names */
+  int qlen;                    /* length of qualifier */
+  int bracelev;                        /* current brace level */
+  int bracketlev;              /* current bracket level */
+  int parlev;                  /* current parenthesis level */
+  int attrparlev;              /* __attribute__ parenthesis level */
+  int templatelev;             /* current template level */
+  int typdefbracelev;          /* bracelev where a typedef struct body begun */
+  bool incomm, inquote, inchar, quotednl, midtoken;
+  bool yacc_rules;             /* in the rules part of a yacc file */
+  struct tok savetoken = {0};  /* token saved during preprocessor handling */
+
+
+  linebuffer_init (&lbs[0].lb);
+  linebuffer_init (&lbs[1].lb);
+  if (cstack.size == 0)
+    {
+      cstack.size = (DEBUG) ? 1 : 4;
+      cstack.nl = 0;
+      cstack.cname = xnew (cstack.size, char *);
+      cstack.bracelev = xnew (cstack.size, int);
+    }
+
+  tokoff = toklen = typdefbracelev = 0; /* keep compiler quiet */
+  curndx = newndx = 0;
+  lp = curlb.buffer;
+  *lp = 0;
+
+  fvdef = fvnone; fvextern = false; typdef = tnone;
+  structdef = snone; definedef = dnone; objdef = onone;
+  yacc_rules = false;
+  midtoken = inquote = inchar = incomm = quotednl = false;
+  token.valid = savetoken.valid = false;
+  bracelev = bracketlev = parlev = attrparlev = templatelev = 0;
+  if (cjava)
+    { qualifier = "."; qlen = 1; }
+  else
+    { qualifier = "::"; qlen = 2; }
+
+
+  while (!feof (inf))
+    {
+      c = *lp++;
+      if (c == '\\')
+       {
+         /* If we are at the end of the line, the next character is a
+            '\0'; do not skip it, because it is what tells us
+            to read the next line.  */
+         if (*lp == '\0')
+           {
+             quotednl = true;
+             continue;
+           }
+         lp++;
+         c = ' ';
+       }
+      else if (incomm)
+       {
+         switch (c)
+           {
+           case '*':
+             if (*lp == '/')
+               {
+                 c = *lp++;
+                 incomm = false;
+               }
+             break;
+           case '\0':
+             /* Newlines inside comments do not end macro definitions in
+                traditional cpp. */
+             CNL_SAVE_DEFINEDEF ();
+             break;
+           }
+         continue;
+       }
+      else if (inquote)
+       {
+         switch (c)
+           {
+           case '"':
+             inquote = false;
+             break;
+           case '\0':
+             /* Newlines inside strings do not end macro definitions
+                in traditional cpp, even though compilers don't
+                usually accept them. */
+             CNL_SAVE_DEFINEDEF ();
+             break;
+           }
+         continue;
+       }
+      else if (inchar)
+       {
+         switch (c)
+           {
+           case '\0':
+             /* Hmmm, something went wrong. */
+             CNL ();
+             /* FALLTHRU */
+           case '\'':
+             inchar = false;
+             break;
+           }
+         continue;
+       }
+      else switch (c)
+       {
+       case '"':
+         inquote = true;
+         if (bracketlev > 0)
+           continue;
+         if (inattribute)
+           break;
+         switch (fvdef)
+           {
+           case fdefunkey:
+           case fstartlist:
+           case finlist:
+           case fignore:
+           case vignore:
+             break;
+           default:
+             fvextern = false;
+             fvdef = fvnone;
+           }
+         continue;
+       case '\'':
+         inchar = true;
+         if (bracketlev > 0)
+           continue;
+         if (inattribute)
+           break;
+         if (fvdef != finlist && fvdef != fignore && fvdef != vignore)
+           {
+             fvextern = false;
+             fvdef = fvnone;
+           }
+         continue;
+       case '/':
+         if (*lp == '*')
+           {
+             incomm = true;
+             lp++;
+             c = ' ';
+             if (bracketlev > 0)
+               continue;
+           }
+         else if (/* cplpl && */ *lp == '/')
+           {
+             c = '\0';
+           }
+         break;
+       case '%':
+         if ((c_ext & YACC) && *lp == '%')
+           {
+             /* Entering or exiting rules section in yacc file. */
+             lp++;
+             definedef = dnone; fvdef = fvnone; fvextern = false;
+             typdef = tnone; structdef = snone;
+             midtoken = inquote = inchar = incomm = quotednl = false;
+             bracelev = 0;
+             yacc_rules = !yacc_rules;
+             continue;
+           }
+         else
+           break;
+       case '#':
+         if (definedef == dnone)
+           {
+             char *cp;
+             bool cpptoken = true;
+
+             /* Look back on this line.  If all blanks, or nonblanks
+                followed by an end of comment, this is a preprocessor
+                token. */
+             for (cp = newlb.buffer; cp < lp-1; cp++)
+               if (!iswhite (*cp))
+                 {
+                   if (*cp == '*' && cp[1] == '/')
+                     {
+                       cp++;
+                       cpptoken = true;
+                     }
+                   else
+                     cpptoken = false;
+                 }
+             if (cpptoken)
+               {
+                 definedef = dsharpseen;
+                 /* This is needed for tagging enum values: when there are
+                    preprocessor conditionals inside the enum, we need to
+                    reset the value of fvdef so that the next enum value is
+                    tagged even though the one before it did not end in a
+                    comma.  */
+                 if (fvdef == vignore && instruct && parlev == 0)
+                   {
+                     if (strneq (cp, "#if", 3) || strneq (cp, "#el", 3))
+                       fvdef = fvnone;
+                   }
+               }
+           } /* if (definedef == dnone) */
+         continue;
+       case '[':
+         bracketlev++;
+         continue;
+       default:
+         if (bracketlev > 0)
+           {
+             if (c == ']')
+               --bracketlev;
+             else if (c == '\0')
+               CNL_SAVE_DEFINEDEF ();
+             continue;
+           }
+         break;
+       } /* switch (c) */
+
+
+      /* Consider token only if some involved conditions are satisfied. */
+      if (typdef != tignore
+         && definedef != dignorerest
+         && fvdef != finlist
+         && templatelev == 0
+         && (definedef != dnone
+             || structdef != scolonseen)
+         && !inattribute)
+       {
+         if (midtoken)
+           {
+             if (endtoken (c))
+               {
+                 if (c == ':' && *lp == ':' && begtoken (lp[1]))
+                   /* This handles :: in the middle,
+                      but not at the beginning of an identifier.
+                      Also, space-separated :: is not recognized. */
+                   {
+                     if (c_ext & C_AUTO) /* automatic detection of C++ */
+                       c_ext = (c_ext | C_PLPL) & ~C_AUTO;
+                     lp += 2;
+                     toklen += 2;
+                     c = lp[-1];
+                     goto still_in_token;
+                   }
+                 else
+                   {
+                     bool funorvar = false;
+
+                     if (yacc_rules
+                         || consider_token (newlb.buffer + tokoff, toklen, c,
+                                            &c_ext, bracelev, parlev,
+                                            &funorvar))
+                       {
+                         if (fvdef == foperator)
+                           {
+                             char *oldlp = lp;
+                             lp = skip_spaces (lp-1);
+                             if (*lp != '\0')
+                               lp += 1;
+                             while (*lp != '\0'
+                                    && !iswhite (*lp) && *lp != '(')
+                               lp += 1;
+                             c = *lp++;
+                             toklen += lp - oldlp;
+                           }
+                         token.named = false;
+                         if (!plainc
+                             && nestlev > 0 && definedef == dnone)
+                           /* in struct body */
+                           {
+                             int len;
+                              write_classname (&token_name, qualifier);
+                             len = token_name.len;
+                             linebuffer_setlen (&token_name, len+qlen+toklen);
+                             sprintf (token_name.buffer + len, "%s%.*s",
+                                      qualifier, toklen, newlb.buffer + 
tokoff);
+                             token.named = true;
+                           }
+                         else if (objdef == ocatseen)
+                           /* Objective C category */
+                           {
+                             int len = strlen (objtag) + 2 + toklen;
+                             linebuffer_setlen (&token_name, len);
+                             sprintf (token_name.buffer, "%s(%.*s)",
+                                      objtag, toklen, newlb.buffer + tokoff);
+                             token.named = true;
+                           }
+                         else if (objdef == omethodtag
+                                  || objdef == omethodparm)
+                           /* Objective C method */
+                           {
+                             token.named = true;
+                           }
+                         else if (fvdef == fdefunname)
+                           /* GNU DEFUN and similar macros */
+                           {
+                             bool defun = (newlb.buffer[tokoff] == 'F');
+                             int off = tokoff;
+                             int len = toklen;
+
+                             /* Rewrite the tag so that emacs lisp DEFUNs
+                                can be found by their elisp name */
+                             if (defun)
+                               {
+                                 off += 1;
+                                 len -= 1;
+                               }
+                             linebuffer_setlen (&token_name, len);
+                             memcpy (token_name.buffer,
+                                     newlb.buffer + off, len);
+                             token_name.buffer[len] = '\0';
+                             if (defun)
+                               while (--len >= 0)
+                                 if (token_name.buffer[len] == '_')
+                                   token_name.buffer[len] = '-';
+                             token.named = defun;
+                           }
+                         else
+                           {
+                             linebuffer_setlen (&token_name, toklen);
+                             memcpy (token_name.buffer,
+                                     newlb.buffer + tokoff, toklen);
+                             token_name.buffer[toklen] = '\0';
+                             /* Name macros and members. */
+                             token.named = (structdef == stagseen
+                                            || typdef == ttypeseen
+                                            || typdef == tend
+                                            || (funorvar
+                                                && definedef == dignorerest)
+                                            || (funorvar
+                                                && definedef == dnone
+                                                && structdef == snone
+                                                && bracelev > 0));
+                           }
+                         token.lineno = lineno;
+                         token.offset = tokoff;
+                         token.length = toklen;
+                         token.line = newlb.buffer;
+                         token.linepos = newlinepos;
+                         token.valid = true;
+
+                         if (definedef == dnone
+                             && (fvdef == fvnameseen
+                                 || fvdef == foperator
+                                 || structdef == stagseen
+                                 || typdef == tend
+                                 || typdef == ttypeseen
+                                 || objdef != onone))
+                           {
+                             if (current_lb_is_new)
+                               switch_line_buffers ();
+                           }
+                         else if (definedef != dnone
+                                  || fvdef == fdefunname
+                                  || instruct)
+                           make_C_tag (funorvar);
+                       }
+                     else /* not yacc and consider_token failed */
+                       {
+                         if (inattribute && fvdef == fignore)
+                           {
+                             /* We have just met __attribute__ after a
+                                function parameter list: do not tag the
+                                function again. */
+                             fvdef = fvnone;
+                           }
+                       }
+                     midtoken = false;
+                   }
+               } /* if (endtoken (c)) */
+             else if (intoken (c))
+               still_in_token:
+               {
+                 toklen++;
+                 continue;
+               }
+           } /* if (midtoken) */
+         else if (begtoken (c))
+           {
+             switch (definedef)
+               {
+               case dnone:
+                 switch (fvdef)
+                   {
+                   case fstartlist:
+                     /* This prevents tagging fb in
+                        void (__attribute__((noreturn)) *fb) (void);
+                        Fixing this is not easy and not very important. */
+                     fvdef = finlist;
+                     continue;
+                   case flistseen:
+                     if (plainc || declarations)
+                       {
+                         make_C_tag (true); /* a function */
+                         fvdef = fignore;
+                       }
+                     break;
+                   }
+                 if (structdef == stagseen && !cjava)
+                   {
+                     popclass_above (bracelev);
+                     structdef = snone;
+                   }
+                 break;
+               case dsharpseen:
+                 savetoken = token;
+                 break;
+               }
+             if (!yacc_rules || lp == newlb.buffer + 1)
+               {
+                 tokoff = lp - 1 - newlb.buffer;
+                 toklen = 1;
+                 midtoken = true;
+               }
+             continue;
+           } /* if (begtoken) */
+       } /* if must look at token */
+
+
+      /* Detect end of line, colon, comma, semicolon and various braces
+        after having handled a token.*/
+      switch (c)
+       {
+       case ':':
+         if (inattribute)
+           break;
+         if (yacc_rules && token.offset == 0 && token.valid)
+           {
+             make_C_tag (false); /* a yacc function */
+             break;
+           }
+         if (definedef != dnone)
+           break;
+         switch (objdef)
+           {
+           case  otagseen:
+             objdef = oignore;
+             make_C_tag (true); /* an Objective C class */
+             break;
+           case omethodtag:
+           case omethodparm:
+             objdef = omethodcolon;
+             int toklen = token_name.len;
+             linebuffer_setlen (&token_name, toklen + 1);
+             strcpy (token_name.buffer + toklen, ":");
+             break;
+           }
+         if (structdef == stagseen)
+           {
+             structdef = scolonseen;
+             break;
+           }
+         /* Should be useless, but may be work as a safety net. */
+         if (cplpl && fvdef == flistseen)
+           {
+             make_C_tag (true); /* a function */
+             fvdef = fignore;
+             break;
+           }
+         break;
+       case ';':
+         if (definedef != dnone || inattribute)
+           break;
+         switch (typdef)
+           {
+           case tend:
+           case ttypeseen:
+             make_C_tag (false); /* a typedef */
+             typdef = tnone;
+             fvdef = fvnone;
+             break;
+           case tnone:
+           case tinbody:
+           case tignore:
+             switch (fvdef)
+               {
+               case fignore:
+                 if (typdef == tignore || cplpl)
+                   fvdef = fvnone;
+                 break;
+               case fvnameseen:
+                 if ((globals && bracelev == 0 && (!fvextern || declarations))
+                     || (members && instruct))
+                   make_C_tag (false); /* a variable */
+                 fvextern = false;
+                 fvdef = fvnone;
+                 token.valid = false;
+                 break;
+               case flistseen:
+                 if ((declarations
+                      && (cplpl || !instruct)
+                      && (typdef == tnone || (typdef != tignore && instruct)))
+                     || (members
+                         && plainc && instruct))
+                   make_C_tag (true);  /* a function */
+                 /* FALLTHRU */
+               default:
+                 fvextern = false;
+                 fvdef = fvnone;
+                 if (declarations
+                      && cplpl && structdef == stagseen)
+                   make_C_tag (false); /* forward declaration */
+                 else
+                   token.valid = false;
+               } /* switch (fvdef) */
+             /* FALLTHRU */
+           default:
+             if (!instruct)
+               typdef = tnone;
+           }
+         if (structdef == stagseen)
+           structdef = snone;
+         break;
+       case ',':
+         if (definedef != dnone || inattribute)
+           break;
+         switch (objdef)
+           {
+           case omethodtag:
+           case omethodparm:
+             make_C_tag (true); /* an Objective C method */
+             objdef = oinbody;
+             break;
+           }
+         switch (fvdef)
+           {
+           case fdefunkey:
+           case foperator:
+           case fstartlist:
+           case finlist:
+           case fignore:
+             break;
+           case vignore:
+             if (instruct && parlev == 0)
+               fvdef = fvnone;
+             break;
+           case fdefunname:
+             fvdef = fignore;
+             break;
+           case fvnameseen:
+             if (parlev == 0
+                 && ((globals
+                      && bracelev == 0
+                      && templatelev == 0
+                      && (!fvextern || declarations))
+                     || (members && instruct)))
+                 make_C_tag (false); /* a variable */
+             break;
+           case flistseen:
+             if ((declarations && typdef == tnone && !instruct)
+                 || (members && typdef != tignore && instruct))
+               {
+                 make_C_tag (true); /* a function */
+                 fvdef = fvnameseen;
+               }
+             else if (!declarations)
+               fvdef = fvnone;
+             token.valid = false;
+             break;
+           default:
+             fvdef = fvnone;
+           }
+         if (structdef == stagseen)
+           structdef = snone;
+         break;
+       case ']':
+         if (definedef != dnone || inattribute)
+           break;
+         if (structdef == stagseen)
+           structdef = snone;
+         switch (typdef)
+           {
+           case ttypeseen:
+           case tend:
+             typdef = tignore;
+             make_C_tag (false);       /* a typedef */
+             break;
+           case tnone:
+           case tinbody:
+             switch (fvdef)
+               {
+               case foperator:
+               case finlist:
+               case fignore:
+               case vignore:
+                 break;
+               case fvnameseen:
+                 if ((members && bracelev == 1)
+                     || (globals && bracelev == 0
+                         && (!fvextern || declarations)))
+                   make_C_tag (false); /* a variable */
+                 /* FALLTHRU */
+               default:
+                 fvdef = fvnone;
+               }
+             break;
+           }
+         break;
+       case '(':
+         if (inattribute)
+           {
+             attrparlev++;
+             break;
+           }
+         if (definedef != dnone)
+           break;
+         if (objdef == otagseen && parlev == 0)
+           objdef = oparenseen;
+         switch (fvdef)
+           {
+           case fvnameseen:
+             if (typdef == ttypeseen
+                 && *lp != '*'
+                 && !instruct)
+               {
+                 /* This handles constructs like:
+                    typedef void OperatorFun (int fun); */
+                 make_C_tag (false);
+                 typdef = tignore;
+                 fvdef = fignore;
+                 break;
+               }
+             /* FALLTHRU */
+           case foperator:
+             fvdef = fstartlist;
+             break;
+           case flistseen:
+             fvdef = finlist;
+             break;
+           }
+         parlev++;
+         break;
+       case ')':
+         if (inattribute)
+           {
+             if (--attrparlev == 0)
+               inattribute = false;
+             break;
+           }
+         if (definedef != dnone)
+           break;
+         if (objdef == ocatseen && parlev == 1)
+           {
+             make_C_tag (true); /* an Objective C category */
+             objdef = oignore;
+           }
+         if (--parlev == 0)
+           {
+             switch (fvdef)
+               {
+               case fstartlist:
+               case finlist:
+                 fvdef = flistseen;
+                 break;
+               }
+             if (!instruct
+                 && (typdef == tend
+                     || typdef == ttypeseen))
+               {
+                 typdef = tignore;
+                 make_C_tag (false); /* a typedef */
+               }
+           }
+         else if (parlev < 0)  /* can happen due to ill-conceived #if's. */
+           parlev = 0;
+         break;
+       case '{':
+         if (definedef != dnone)
+           break;
+         if (typdef == ttypeseen)
+           {
+             /* Whenever typdef is set to tinbody (currently only
+                here), typdefbracelev should be set to bracelev. */
+             typdef = tinbody;
+             typdefbracelev = bracelev;
+           }
+         switch (fvdef)
+           {
+           case flistseen:
+             make_C_tag (true);    /* a function */
+             /* FALLTHRU */
+           case fignore:
+             fvdef = fvnone;
+             break;
+           case fvnone:
+             switch (objdef)
+               {
+               case otagseen:
+                 make_C_tag (true); /* an Objective C class */
+                 objdef = oignore;
+                 break;
+               case omethodtag:
+               case omethodparm:
+                 make_C_tag (true); /* an Objective C method */
+                 objdef = oinbody;
+                 break;
+               default:
+                 /* Neutralize `extern "C" {' grot. */
+                 if (bracelev == 0 && structdef == snone && nestlev == 0
+                     && typdef == tnone)
+                   bracelev = -1;
+               }
+             break;
+           }
+         switch (structdef)
+           {
+           case skeyseen:         /* unnamed struct */
+             pushclass_above (bracelev, NULL, 0);
+             structdef = snone;
+             break;
+           case stagseen:         /* named struct or enum */
+           case scolonseen:       /* a class */
+             pushclass_above (bracelev,token.line+token.offset, token.length);
+             structdef = snone;
+             make_C_tag (false);  /* a struct or enum */
+             break;
+           }
+         bracelev += 1;
+         break;
+       case '*':
+         if (definedef != dnone)
+           break;
+         if (fvdef == fstartlist)
+           {
+             fvdef = fvnone;   /* avoid tagging `foo' in `foo (*bar()) ()' */
+             token.valid = false;
+           }
+         break;
+       case '}':
+         if (definedef != dnone)
+           break;
+         bracelev -= 1;
+         if (!ignoreindent && lp == newlb.buffer + 1)
+           {
+             if (bracelev != 0)
+               token.valid = false; /* unexpected value, token unreliable */
+             bracelev = 0;     /* reset brace level if first column */
+             parlev = 0;       /* also reset paren level, just in case... */
+           }
+         else if (bracelev < 0)
+           {
+             token.valid = false; /* something gone amiss, token unreliable */
+             bracelev = 0;
+           }
+         if (bracelev == 0 && fvdef == vignore)
+           fvdef = fvnone;             /* end of function */
+         popclass_above (bracelev);
+         structdef = snone;
+         /* Only if typdef == tinbody is typdefbracelev significant. */
+         if (typdef == tinbody && bracelev <= typdefbracelev)
+           {
+             assert (bracelev == typdefbracelev);
+             typdef = tend;
+           }
+         break;
+       case '=':
+         if (definedef != dnone)
+           break;
+         switch (fvdef)
+           {
+           case foperator:
+           case finlist:
+           case fignore:
+           case vignore:
+             break;
+           case fvnameseen:
+             if ((members && bracelev == 1)
+                 || (globals && bracelev == 0 && (!fvextern || declarations)))
+               make_C_tag (false); /* a variable */
+             /* FALLTHRU */
+           default:
+             fvdef = vignore;
+           }
+         break;
+       case '<':
+         if (cplpl
+             && (structdef == stagseen || fvdef == fvnameseen))
+           {
+             templatelev++;
+             break;
+           }
+         goto resetfvdef;
+       case '>':
+         if (templatelev > 0)
+           {
+             templatelev--;
+             break;
+           }
+         goto resetfvdef;
+       case '+':
+       case '-':
+         if (objdef == oinbody && bracelev == 0)
+           {
+             objdef = omethodsign;
+             break;
+           }
+         /* FALLTHRU */
+       resetfvdef:
+       case '#': case '~': case '&': case '%': case '/':
+       case '|': case '^': case '!': case '.': case '?':
+         if (definedef != dnone)
+           break;
+         /* These surely cannot follow a function tag in C. */
+         switch (fvdef)
+           {
+           case foperator:
+           case finlist:
+           case fignore:
+           case vignore:
+             break;
+           default:
+             fvdef = fvnone;
+           }
+         break;
+       case '\0':
+         if (objdef == otagseen)
+           {
+             make_C_tag (true); /* an Objective C class */
+             objdef = oignore;
+           }
+         /* If a macro spans multiple lines don't reset its state. */
+         if (quotednl)
+           CNL_SAVE_DEFINEDEF ();
+         else
+           CNL ();
+         break;
+       } /* switch (c) */
+
+    } /* while not eof */
+
+  free (lbs[0].lb.buffer);
+  free (lbs[1].lb.buffer);
+}
+
+/*
+ * Process either a C++ file or a C file depending on the setting
+ * of a global flag.
+ */
+static void
+default_C_entries (FILE *inf)
+{
+  C_entries (cplusplus ? C_PLPL : C_AUTO, inf);
+}
+
+/* Always do plain C. */
+static void
+plain_C_entries (FILE *inf)
+{
+  C_entries (0, inf);
+}
+
+/* Always do C++. */
+static void
+Cplusplus_entries (FILE *inf)
+{
+  C_entries (C_PLPL, inf);
+}
+
+/* Always do Java. */
+static void
+Cjava_entries (FILE *inf)
+{
+  C_entries (C_JAVA, inf);
+}
+
+/* Always do C*. */
+static void
+Cstar_entries (FILE *inf)
+{
+  C_entries (C_STAR, inf);
+}
+
+/* Always do Yacc. */
+static void
+Yacc_entries (FILE *inf)
+{
+  C_entries (YACC, inf);
+}
+
+
+/* Useful macros. */
+#define LOOP_ON_INPUT_LINES(file_pointer, line_buffer, char_pointer)   \
+  for (;                       /* loop initialization */               \
+       !feof (file_pointer)    /* loop test */                         \
+       &&                      /* instructions at start of loop */     \
+         (readline (&line_buffer, file_pointer),                       \
+           char_pointer = line_buffer.buffer,                          \
+          true);                                                       \
+      )
+
+#define LOOKING_AT(cp, kw)  /* kw is the keyword, a literal string */  \
+  ((assert ("" kw), true)   /* syntax error if not a literal string */ \
+   && strneq ((cp), kw, sizeof (kw)-1)         /* cp points at kw */   \
+   && notinname ((cp)[sizeof (kw)-1])          /* end of kw */         \
+   && ((cp) = skip_spaces ((cp)+sizeof (kw)-1))) /* skip spaces */
+
+/* Similar to LOOKING_AT but does not use notinname, does not skip */
+#define LOOKING_AT_NOCASE(cp, kw) /* the keyword is a literal string */        
\
+  ((assert ("" kw), true) /* syntax error if not a literal string */   \
+   && strncaseeq ((cp), kw, sizeof (kw)-1)     /* cp points at kw */   \
+   && ((cp) += sizeof (kw)-1))                 /* skip spaces */
+
+/*
+ * Read a file, but do no processing.  This is used to do regexp
+ * matching on files that have no language defined.
+ */
+static void
+just_read_file (FILE *inf)
+{
+  while (!feof (inf))
+    readline (&lb, inf);
+}
+
+
+/* Fortran parsing */
+
+static void F_takeprec (void);
+static void F_getit (FILE *);
+
+static void
+F_takeprec (void)
+{
+  dbp = skip_spaces (dbp);
+  if (*dbp != '*')
+    return;
+  dbp++;
+  dbp = skip_spaces (dbp);
+  if (strneq (dbp, "(*)", 3))
+    {
+      dbp += 3;
+      return;
+    }
+  if (!ISDIGIT (*dbp))
+    {
+      --dbp;                   /* force failure */
+      return;
+    }
+  do
+    dbp++;
+  while (ISDIGIT (*dbp));
+}
+
+static void
+F_getit (FILE *inf)
+{
+  register char *cp;
+
+  dbp = skip_spaces (dbp);
+  if (*dbp == '\0')
+    {
+      readline (&lb, inf);
+      dbp = lb.buffer;
+      if (dbp[5] != '&')
+       return;
+      dbp += 6;
+      dbp = skip_spaces (dbp);
+    }
+  if (!ISALPHA (*dbp) && *dbp != '_' && *dbp != '$')
+    return;
+  for (cp = dbp + 1; *cp != '\0' && intoken (*cp); cp++)
+    continue;
+  make_tag (dbp, cp-dbp, true,
+           lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+}
+
+
+static void
+Fortran_functions (FILE *inf)
+{
+  LOOP_ON_INPUT_LINES (inf, lb, dbp)
+    {
+      if (*dbp == '%')
+       dbp++;                  /* Ratfor escape to fortran */
+      dbp = skip_spaces (dbp);
+      if (*dbp == '\0')
+       continue;
+
+      if (LOOKING_AT_NOCASE (dbp, "recursive"))
+       dbp = skip_spaces (dbp);
+
+      if (LOOKING_AT_NOCASE (dbp, "pure"))
+       dbp = skip_spaces (dbp);
+
+      if (LOOKING_AT_NOCASE (dbp, "elemental"))
+       dbp = skip_spaces (dbp);
+
+      switch (lowcase (*dbp))
+       {
+       case 'i':
+         if (nocase_tail ("integer"))
+           F_takeprec ();
+         break;
+       case 'r':
+         if (nocase_tail ("real"))
+           F_takeprec ();
+         break;
+       case 'l':
+         if (nocase_tail ("logical"))
+           F_takeprec ();
+         break;
+       case 'c':
+         if (nocase_tail ("complex") || nocase_tail ("character"))
+           F_takeprec ();
+         break;
+       case 'd':
+         if (nocase_tail ("double"))
+           {
+             dbp = skip_spaces (dbp);
+             if (*dbp == '\0')
+               continue;
+             if (nocase_tail ("precision"))
+               break;
+             continue;
+           }
+         break;
+       }
+      dbp = skip_spaces (dbp);
+      if (*dbp == '\0')
+       continue;
+      switch (lowcase (*dbp))
+       {
+       case 'f':
+         if (nocase_tail ("function"))
+           F_getit (inf);
+         continue;
+       case 's':
+         if (nocase_tail ("subroutine"))
+           F_getit (inf);
+         continue;
+       case 'e':
+         if (nocase_tail ("entry"))
+           F_getit (inf);
+         continue;
+       case 'b':
+         if (nocase_tail ("blockdata") || nocase_tail ("block data"))
+           {
+             dbp = skip_spaces (dbp);
+             if (*dbp == '\0') /* assume un-named */
+               make_tag ("blockdata", 9, true,
+                         lb.buffer, dbp - lb.buffer, lineno, linecharno);
+             else
+               F_getit (inf);  /* look for name */
+           }
+         continue;
+       }
+    }
+}
+
+
+/*
+ * Ada parsing
+ * Original code by
+ * Philippe Waroquiers (1998)
+ */
+
+/* Once we are positioned after an "interesting" keyword, let's get
+   the real tag value necessary. */
+static void
+Ada_getit (FILE *inf, const char *name_qualifier)
+{
+  register char *cp;
+  char *name;
+  char c;
+
+  while (!feof (inf))
+    {
+      dbp = skip_spaces (dbp);
+      if (*dbp == '\0'
+         || (dbp[0] == '-' && dbp[1] == '-'))
+       {
+         readline (&lb, inf);
+         dbp = lb.buffer;
+       }
+      switch (lowcase (*dbp))
+        {
+        case 'b':
+          if (nocase_tail ("body"))
+            {
+              /* Skipping body of   procedure body   or   package body or ....
+                resetting qualifier to body instead of spec. */
+              name_qualifier = "/b";
+              continue;
+            }
+          break;
+        case 't':
+          /* Skipping type of   task type   or   protected type ... */
+          if (nocase_tail ("type"))
+            continue;
+          break;
+        }
+      if (*dbp == '"')
+       {
+         dbp += 1;
+         for (cp = dbp; *cp != '\0' && *cp != '"'; cp++)
+           continue;
+       }
+      else
+       {
+         dbp = skip_spaces (dbp);
+         for (cp = dbp;
+              (*cp != '\0'
+               && (ISALPHA (*cp) || ISDIGIT (*cp) || *cp == '_' || *cp == 
'.'));
+              cp++)
+           continue;
+         if (cp == dbp)
+           return;
+       }
+      c = *cp;
+      *cp = '\0';
+      name = concat (dbp, name_qualifier, "");
+      *cp = c;
+      make_tag (name, strlen (name), true,
+               lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+      free (name);
+      if (c == '"')
+       dbp = cp + 1;
+      return;
+    }
+}
+
+static void
+Ada_funcs (FILE *inf)
+{
+  bool inquote = false;
+  bool skip_till_semicolumn = false;
+
+  LOOP_ON_INPUT_LINES (inf, lb, dbp)
+    {
+      while (*dbp != '\0')
+       {
+         /* Skip a string i.e. "abcd". */
+         if (inquote || (*dbp == '"'))
+           {
+             dbp = strchr (dbp + !inquote, '"');
+             if (dbp != NULL)
+               {
+                 inquote = false;
+                 dbp += 1;
+                 continue;     /* advance char */
+               }
+             else
+               {
+                 inquote = true;
+                 break;        /* advance line */
+               }
+           }
+
+         /* Skip comments. */
+         if (dbp[0] == '-' && dbp[1] == '-')
+           break;              /* advance line */
+
+         /* Skip character enclosed in single quote i.e. 'a'
+            and skip single quote starting an attribute i.e. 'Image. */
+         if (*dbp == '\'')
+           {
+             dbp++ ;
+             if (*dbp != '\0')
+               dbp++;
+             continue;
+           }
+
+         if (skip_till_semicolumn)
+           {
+             if (*dbp == ';')
+               skip_till_semicolumn = false;
+             dbp++;
+             continue;         /* advance char */
+           }
+
+         /* Search for beginning of a token.  */
+         if (!begtoken (*dbp))
+           {
+             dbp++;
+             continue;         /* advance char */
+           }
+
+         /* We are at the beginning of a token. */
+         switch (lowcase (*dbp))
+           {
+           case 'f':
+             if (!packages_only && nocase_tail ("function"))
+               Ada_getit (inf, "/f");
+             else
+               break;          /* from switch */
+             continue;         /* advance char */
+           case 'p':
+             if (!packages_only && nocase_tail ("procedure"))
+               Ada_getit (inf, "/p");
+             else if (nocase_tail ("package"))
+               Ada_getit (inf, "/s");
+             else if (nocase_tail ("protected")) /* protected type */
+               Ada_getit (inf, "/t");
+             else
+               break;          /* from switch */
+             continue;         /* advance char */
+
+           case 'u':
+             if (typedefs && !packages_only && nocase_tail ("use"))
+               {
+                 /* when tagging types, avoid tagging  use type Pack.Typename;
+                    for this, we will skip everything till a ; */
+                 skip_till_semicolumn = true;
+                 continue;     /* advance char */
+               }
+
+           case 't':
+             if (!packages_only && nocase_tail ("task"))
+               Ada_getit (inf, "/k");
+             else if (typedefs && !packages_only && nocase_tail ("type"))
+               {
+                 Ada_getit (inf, "/t");
+                 while (*dbp != '\0')
+                   dbp += 1;
+               }
+             else
+               break;          /* from switch */
+             continue;         /* advance char */
+           }
+
+         /* Look for the end of the token. */
+         while (!endtoken (*dbp))
+           dbp++;
+
+       } /* advance char */
+    } /* advance line */
+}
+
+
+/*
+ * Unix and microcontroller assembly tag handling
+ * Labels:  /^[a-zA-Z_.$][a-zA_Z0-9_.$]*[: ^I^J]/
+ * Idea by Bob Weiner, Motorola Inc. (1994)
+ */
+static void
+Asm_labels (FILE *inf)
+{
+  register char *cp;
+
+  LOOP_ON_INPUT_LINES (inf, lb, cp)
+    {
+      /* If first char is alphabetic or one of [_.$], test for colon
+        following identifier. */
+      if (ISALPHA (*cp) || *cp == '_' || *cp == '.' || *cp == '$')
+       {
+         /* Read past label. */
+         cp++;
+         while (ISALNUM (*cp) || *cp == '_' || *cp == '.' || *cp == '$')
+           cp++;
+         if (*cp == ':' || iswhite (*cp))
+           /* Found end of label, so copy it and add it to the table. */
+           make_tag (lb.buffer, cp - lb.buffer, true,
+                     lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+       }
+    }
+}
+
+
+/*
+ * Perl support
+ * Perl sub names: /^sub[ \t\n]+[^ \t\n{]+/
+ *                 /^use constant[ \t\n]+[^ \t\n{=,;]+/
+ * Perl variable names: /^(my|local).../
+ * Original code by Bart Robinson <address@hidden> (1995)
+ * Additions by Michael Ernst <address@hidden> (1997)
+ * Ideas by Kai Großjohann <address@hidden> (2001)
+ */
+static void
+Perl_functions (FILE *inf)
+{
+  char *package = savestr ("main"); /* current package name */
+  register char *cp;
+
+  LOOP_ON_INPUT_LINES (inf, lb, cp)
+    {
+      cp = skip_spaces (cp);
+
+      if (LOOKING_AT (cp, "package"))
+       {
+         free (package);
+         get_tag (cp, &package);
+       }
+      else if (LOOKING_AT (cp, "sub"))
+       {
+         char *pos, *sp;
+
+       subr:
+         sp = cp;
+         while (!notinname (*cp))
+           cp++;
+         if (cp == sp)
+           continue;           /* nothing found */
+         if ((pos = strchr (sp, ':')) != NULL
+             && pos < cp && pos[1] == ':')
+           /* The name is already qualified. */
+           make_tag (sp, cp - sp, true,
+                     lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+         else
+           /* Qualify it. */
+           {
+             char savechar, *name;
+
+             savechar = *cp;
+             *cp = '\0';
+             name = concat (package, "::", sp);
+             *cp = savechar;
+             make_tag (name, strlen (name), true,
+                       lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+             free (name);
+           }
+       }
+      else if (LOOKING_AT (cp, "use constant")
+              || LOOKING_AT (cp, "use constant::defer"))
+       {
+         /* For hash style multi-constant like
+               use constant { FOO => 123,
+                              BAR => 456 };
+            only the first FOO is picked up.  Parsing across the value
+            expressions would be difficult in general, due to possible nested
+            hashes, here-documents, etc.  */
+         if (*cp == '{')
+           cp = skip_spaces (cp+1);
+         goto subr;
+       }
+      else if (globals)        /* only if we are tagging global vars */
+       {
+         /* Skip a qualifier, if any. */
+         bool qual = LOOKING_AT (cp, "my") || LOOKING_AT (cp, "local");
+         /* After "my" or "local", but before any following paren or space. */
+         char *varstart = cp;
+
+         if (qual              /* should this be removed?  If yes, how? */
+             && (*cp == '$' || *cp == '@' || *cp == '%'))
+           {
+             varstart += 1;
+             do
+               cp++;
+             while (ISALNUM (*cp) || *cp == '_');
+           }
+         else if (qual)
+           {
+             /* Should be examining a variable list at this point;
+                could insist on seeing an open parenthesis. */
+             while (*cp != '\0' && *cp != ';' && *cp != '=' &&  *cp != ')')
+               cp++;
+           }
+         else
+           continue;
+
+         make_tag (varstart, cp - varstart, false,
+                   lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+       }
+    }
+  free (package);
+}
+
+
+/*
+ * Python support
+ * Look for /^[\t]*def[ \t\n]+[^ \t\n(:]+/ or /^class[ \t\n]+[^ \t\n(:]+/
+ * Idea by Eric S. Raymond <address@hidden> (1997)
+ * More ideas by seb bacon <address@hidden> (2002)
+ */
+static void
+Python_functions (FILE *inf)
+{
+  register char *cp;
+
+  LOOP_ON_INPUT_LINES (inf, lb, cp)
+    {
+      cp = skip_spaces (cp);
+      if (LOOKING_AT (cp, "def") || LOOKING_AT (cp, "class"))
+       {
+         char *name = cp;
+         while (!notinname (*cp) && *cp != ':')
+           cp++;
+         make_tag (name, cp - name, true,
+                   lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+       }
+    }
+}
+
+
+/*
+ * PHP support
+ * Look for:
+ *  - /^[ \t]*function[ \t\n]+[^ \t\n(]+/
+ *  - /^[ \t]*class[ \t\n]+[^ \t\n]+/
+ *  - /^[ \t]*define\(\"[^\"]+/
+ * Only with --members:
+ *  - /^[ \t]*var[ \t\n]+\$[^ \t\n=;]/
+ * Idea by Diez B. Roggisch (2001)
+ */
+static void
+PHP_functions (FILE *inf)
+{
+  char *cp, *name;
+  bool search_identifier = false;
+
+  LOOP_ON_INPUT_LINES (inf, lb, cp)
+    {
+      cp = skip_spaces (cp);
+      name = cp;
+      if (search_identifier
+         && *cp != '\0')
+       {
+         while (!notinname (*cp))
+           cp++;
+         make_tag (name, cp - name, true,
+                   lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+         search_identifier = false;
+       }
+      else if (LOOKING_AT (cp, "function"))
+       {
+         if (*cp == '&')
+           cp = skip_spaces (cp+1);
+         if (*cp != '\0')
+           {
+             name = cp;
+             while (!notinname (*cp))
+               cp++;
+             make_tag (name, cp - name, true,
+                       lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+           }
+         else
+           search_identifier = true;
+       }
+      else if (LOOKING_AT (cp, "class"))
+       {
+         if (*cp != '\0')
+           {
+             name = cp;
+             while (*cp != '\0' && !iswhite (*cp))
+               cp++;
+             make_tag (name, cp - name, false,
+                       lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+           }
+         else
+           search_identifier = true;
+       }
+      else if (strneq (cp, "define", 6)
+              && (cp = skip_spaces (cp+6))
+              && *cp++ == '('
+              && (*cp == '"' || *cp == '\''))
+       {
+         char quote = *cp++;
+         name = cp;
+         while (*cp != quote && *cp != '\0')
+           cp++;
+         make_tag (name, cp - name, false,
+                   lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+       }
+      else if (members
+              && LOOKING_AT (cp, "var")
+              && *cp == '$')
+       {
+         name = cp;
+         while (!notinname (*cp))
+           cp++;
+         make_tag (name, cp - name, false,
+                   lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+       }
+    }
+}
+
+
+/*
+ * Cobol tag functions
+ * We could look for anything that could be a paragraph name.
+ * i.e. anything that starts in column 8 is one word and ends in a full stop.
+ * Idea by Corny de Souza (1993)
+ */
+static void
+Cobol_paragraphs (FILE *inf)
+{
+  register char *bp, *ep;
+
+  LOOP_ON_INPUT_LINES (inf, lb, bp)
+    {
+      if (lb.len < 9)
+       continue;
+      bp += 8;
+
+      /* If eoln, compiler option or comment ignore whole line. */
+      if (bp[-1] != ' ' || !ISALNUM (bp[0]))
+        continue;
+
+      for (ep = bp; ISALNUM (*ep) || *ep == '-'; ep++)
+       continue;
+      if (*ep++ == '.')
+       make_tag (bp, ep - bp, true,
+                 lb.buffer, ep - lb.buffer + 1, lineno, linecharno);
+    }
+}
+
+
+/*
+ * Makefile support
+ * Ideas by Assar Westerlund <address@hidden> (2001)
+ */
+static void
+Makefile_targets (FILE *inf)
+{
+  register char *bp;
+
+  LOOP_ON_INPUT_LINES (inf, lb, bp)
+    {
+      if (*bp == '\t' || *bp == '#')
+       continue;
+      while (*bp != '\0' && *bp != '=' && *bp != ':')
+       bp++;
+      if (*bp == ':' || (globals && *bp == '='))
+       {
+         /* We should detect if there is more than one tag, but we do not.
+            We just skip initial and final spaces. */
+         char * namestart = skip_spaces (lb.buffer);
+         while (--bp > namestart)
+           if (!notinname (*bp))
+             break;
+         make_tag (namestart, bp - namestart + 1, true,
+                   lb.buffer, bp - lb.buffer + 2, lineno, linecharno);
+       }
+    }
+}
+
+
+/*
+ * Pascal parsing
+ * Original code by Mosur K. Mohan (1989)
+ *
+ *  Locates tags for procedures & functions.  Doesn't do any type- or
+ *  var-definitions.  It does look for the keyword "extern" or
+ *  "forward" immediately following the procedure statement; if found,
+ *  the tag is skipped.
+ */
+static void
+Pascal_functions (FILE *inf)
+{
+  linebuffer tline;            /* mostly copied from C_entries */
+  long save_lcno;
+  int save_lineno, namelen, taglen;
+  char c, *name;
+
+  bool                         /* each of these flags is true if: */
+    incomment,                 /* point is inside a comment */
+    inquote,                   /* point is inside '..' string */
+    get_tagname,               /* point is after PROCEDURE/FUNCTION
+                                  keyword, so next item = potential tag */
+    found_tag,                 /* point is after a potential tag */
+    inparms,                   /* point is within parameter-list */
+    verify_tag;                        /* point has passed the parm-list, so 
the
+                                  next token will determine whether this
+                                  is a FORWARD/EXTERN to be ignored, or
+                                  whether it is a real tag */
+
+  save_lcno = save_lineno = namelen = taglen = 0; /* keep compiler quiet */
+  name = NULL;                 /* keep compiler quiet */
+  dbp = lb.buffer;
+  *dbp = '\0';
+  linebuffer_init (&tline);
+
+  incomment = inquote = false;
+  found_tag = false;           /* have a proc name; check if extern */
+  get_tagname = false;         /* found "procedure" keyword         */
+  inparms = false;             /* found '(' after "proc"            */
+  verify_tag = false;          /* check if "extern" is ahead        */
+
+
+  while (!feof (inf))          /* long main loop to get next char */
+    {
+      c = *dbp++;
+      if (c == '\0')           /* if end of line */
+       {
+         readline (&lb, inf);
+         dbp = lb.buffer;
+         if (*dbp == '\0')
+           continue;
+         if (!((found_tag && verify_tag)
+               || get_tagname))
+           c = *dbp++;         /* only if don't need *dbp pointing
+                                  to the beginning of the name of
+                                  the procedure or function */
+       }
+      if (incomment)
+       {
+         if (c == '}')         /* within { } comments */
+           incomment = false;
+         else if (c == '*' && *dbp == ')') /* within (* *) comments */
+           {
+             dbp++;
+             incomment = false;
+           }
+         continue;
+       }
+      else if (inquote)
+       {
+         if (c == '\'')
+           inquote = false;
+         continue;
+       }
+      else
+       switch (c)
+         {
+         case '\'':
+           inquote = true;     /* found first quote */
+           continue;
+         case '{':             /* found open { comment */
+           incomment = true;
+           continue;
+         case '(':
+           if (*dbp == '*')    /* found open (* comment */
+             {
+               incomment = true;
+               dbp++;
+             }
+           else if (found_tag) /* found '(' after tag, i.e., parm-list */
+             inparms = true;
+           continue;
+         case ')':             /* end of parms list */
+           if (inparms)
+             inparms = false;
+           continue;
+         case ';':
+           if (found_tag && !inparms) /* end of proc or fn stmt */
+             {
+               verify_tag = true;
+               break;
+             }
+           continue;
+         }
+      if (found_tag && verify_tag && (*dbp != ' '))
+       {
+         /* Check if this is an "extern" declaration. */
+         if (*dbp == '\0')
+           continue;
+         if (lowcase (*dbp) == 'e')
+           {
+             if (nocase_tail ("extern")) /* superfluous, really! */
+               {
+                 found_tag = false;
+                 verify_tag = false;
+               }
+           }
+         else if (lowcase (*dbp) == 'f')
+           {
+             if (nocase_tail ("forward")) /* check for forward reference */
+               {
+                 found_tag = false;
+                 verify_tag = false;
+               }
+           }
+         if (found_tag && verify_tag) /* not external proc, so make tag */
+           {
+             found_tag = false;
+             verify_tag = false;
+             make_tag (name, namelen, true,
+                       tline.buffer, taglen, save_lineno, save_lcno);
+             continue;
+           }
+       }
+      if (get_tagname)         /* grab name of proc or fn */
+       {
+         char *cp;
+
+         if (*dbp == '\0')
+           continue;
+
+         /* Find block name. */
+         for (cp = dbp + 1; *cp != '\0' && !endtoken (*cp); cp++)
+           continue;
+
+         /* Save all values for later tagging. */
+         linebuffer_setlen (&tline, lb.len);
+         strcpy (tline.buffer, lb.buffer);
+         save_lineno = lineno;
+         save_lcno = linecharno;
+         name = tline.buffer + (dbp - lb.buffer);
+         namelen = cp - dbp;
+         taglen = cp - lb.buffer + 1;
+
+         dbp = cp;             /* set dbp to e-o-token */
+         get_tagname = false;
+         found_tag = true;
+         continue;
+
+         /* And proceed to check for "extern". */
+       }
+      else if (!incomment && !inquote && !found_tag)
+       {
+         /* Check for proc/fn keywords. */
+         switch (lowcase (c))
+           {
+           case 'p':
+             if (nocase_tail ("rocedure")) /* c = 'p', dbp has advanced */
+               get_tagname = true;
+             continue;
+           case 'f':
+             if (nocase_tail ("unction"))
+               get_tagname = true;
+             continue;
+           }
+       }
+    } /* while not eof */
+
+  free (tline.buffer);
+}
+
+
+/*
+ * Lisp tag functions
+ *  look for (def or (DEF, quote or QUOTE
+ */
+
+static void L_getit (void);
+
+static void
+L_getit (void)
+{
+  if (*dbp == '\'')            /* Skip prefix quote */
+    dbp++;
+  else if (*dbp == '(')
+  {
+    dbp++;
+    /* Try to skip "(quote " */
+    if (!LOOKING_AT (dbp, "quote") && !LOOKING_AT (dbp, "QUOTE"))
+      /* Ok, then skip "(" before name in (defstruct (foo)) */
+      dbp = skip_spaces (dbp);
+  }
+  get_tag (dbp, NULL);
+}
+
+static void
+Lisp_functions (FILE *inf)
+{
+  LOOP_ON_INPUT_LINES (inf, lb, dbp)
+    {
+      if (dbp[0] != '(')
+       continue;
+
+      /* "(defvar foo)" is a declaration rather than a definition.  */
+      if (! declarations)
+       {
+         char *p = dbp + 1;
+         if (LOOKING_AT (p, "defvar"))
+           {
+             p = skip_name (p); /* past var name */
+             p = skip_spaces (p);
+             if (*p == ')')
+               continue;
+           }
+       }
+
+      if (strneq (dbp + 1, "cl-", 3) || strneq (dbp + 1, "CL-", 3))
+       dbp += 3;
+
+      if (strneq (dbp+1, "def", 3) || strneq (dbp+1, "DEF", 3))
+       {
+         dbp = skip_non_spaces (dbp);
+         dbp = skip_spaces (dbp);
+         L_getit ();
+       }
+      else
+       {
+         /* Check for (foo::defmumble name-defined ... */
+         do
+           dbp++;
+         while (!notinname (*dbp) && *dbp != ':');
+         if (*dbp == ':')
+           {
+             do
+               dbp++;
+             while (*dbp == ':');
+
+             if (strneq (dbp, "def", 3) || strneq (dbp, "DEF", 3))
+               {
+                 dbp = skip_non_spaces (dbp);
+                 dbp = skip_spaces (dbp);
+                 L_getit ();
+               }
+           }
+       }
+    }
+}
+
+
+/*
+ * Lua script language parsing
+ * Original code by David A. Capello <address@hidden> (2004)
+ *
+ *  "function" and "local function" are tags if they start at column 1.
+ */
+static void
+Lua_functions (FILE *inf)
+{
+  register char *bp;
+
+  LOOP_ON_INPUT_LINES (inf, lb, bp)
+    {
+      if (bp[0] != 'f' && bp[0] != 'l')
+       continue;
+
+      (void)LOOKING_AT (bp, "local"); /* skip possible "local" */
+
+      if (LOOKING_AT (bp, "function"))
+       get_tag (bp, NULL);
+    }
+}
+
+
+/*
+ * PostScript tags
+ * Just look for lines where the first character is '/'
+ * Also look at "defineps" for PSWrap
+ * Ideas by:
+ *   Richard Mlynarik <address@hidden> (1997)
+ *   Masatake Yamato <address@hidden> (1999)
+ */
+static void
+PS_functions (FILE *inf)
+{
+  register char *bp, *ep;
+
+  LOOP_ON_INPUT_LINES (inf, lb, bp)
+    {
+      if (bp[0] == '/')
+       {
+         for (ep = bp+1;
+              *ep != '\0' && *ep != ' ' && *ep != '{';
+              ep++)
+           continue;
+         make_tag (bp, ep - bp, true,
+                   lb.buffer, ep - lb.buffer + 1, lineno, linecharno);
+       }
+      else if (LOOKING_AT (bp, "defineps"))
+       get_tag (bp, NULL);
+    }
+}
+
+
+/*
+ * Forth tags
+ * Ignore anything after \ followed by space or in ( )
+ * Look for words defined by :
+ * Look for constant, code, create, defer, value, and variable
+ * OBP extensions:  Look for buffer:, field,
+ * Ideas by Eduardo Horvath <address@hidden> (2004)
+ */
+static void
+Forth_words (FILE *inf)
+{
+  register char *bp;
+
+  LOOP_ON_INPUT_LINES (inf, lb, bp)
+    while ((bp = skip_spaces (bp))[0] != '\0')
+      if (bp[0] == '\\' && iswhite (bp[1]))
+       break;                  /* read next line */
+      else if (bp[0] == '(' && iswhite (bp[1]))
+       do                      /* skip to ) or eol */
+         bp++;
+       while (*bp != ')' && *bp != '\0');
+      else if ((bp[0] == ':' && iswhite (bp[1]) && bp++)
+              || LOOKING_AT_NOCASE (bp, "constant")
+              || LOOKING_AT_NOCASE (bp, "code")
+              || LOOKING_AT_NOCASE (bp, "create")
+              || LOOKING_AT_NOCASE (bp, "defer")
+              || LOOKING_AT_NOCASE (bp, "value")
+              || LOOKING_AT_NOCASE (bp, "variable")
+              || LOOKING_AT_NOCASE (bp, "buffer:")
+              || LOOKING_AT_NOCASE (bp, "field"))
+       get_tag (skip_spaces (bp), NULL); /* Yay!  A definition! */
+      else
+       bp = skip_non_spaces (bp);
+}
+
+
+/*
+ * Scheme tag functions
+ * look for (def... xyzzy
+ *          (def... (xyzzy
+ *          (def ... ((...(xyzzy ....
+ *          (set! xyzzy
+ * Original code by Ken Haase (1985?)
+ */
+static void
+Scheme_functions (FILE *inf)
+{
+  register char *bp;
+
+  LOOP_ON_INPUT_LINES (inf, lb, bp)
+    {
+      if (strneq (bp, "(def", 4) || strneq (bp, "(DEF", 4))
+       {
+         bp = skip_non_spaces (bp+4);
+         /* Skip over open parens and white space.  Don't continue past
+            '\0'. */
+         while (*bp && notinname (*bp))
+           bp++;
+         get_tag (bp, NULL);
+       }
+      if (LOOKING_AT (bp, "(SET!") || LOOKING_AT (bp, "(set!"))
+       get_tag (bp, NULL);
+    }
+}
+
+
+/* Find tags in TeX and LaTeX input files.  */
+
+/* TEX_toktab is a table of TeX control sequences that define tags.
+ * Each entry records one such control sequence.
+ *
+ * Original code from who knows whom.
+ * Ideas by:
+ *   Stefan Monnier (2002)
+ */
+
+static linebuffer *TEX_toktab = NULL; /* Table with tag tokens */
+
+/* Default set of control sequences to put into TEX_toktab.
+   The value of environment var TEXTAGS is prepended to this.  */
+static const char *TEX_defenv = "\
+:chapter:section:subsection:subsubsection:eqno:label:ref:cite:bibitem\
+:part:appendix:entry:index:def\
+:newcommand:renewcommand:newenvironment:renewenvironment";
+
+static void TEX_mode (FILE *);
+static void TEX_decode_env (const char *, const char *);
+
+static char TEX_esc = '\\';
+static char TEX_opgrp = '{';
+static char TEX_clgrp = '}';
+
+/*
+ * TeX/LaTeX scanning loop.
+ */
+static void
+TeX_commands (FILE *inf)
+{
+  char *cp;
+  linebuffer *key;
+
+  /* Select either \ or ! as escape character.  */
+  TEX_mode (inf);
+
+  /* Initialize token table once from environment. */
+  if (TEX_toktab == NULL)
+    TEX_decode_env ("TEXTAGS", TEX_defenv);
+
+  LOOP_ON_INPUT_LINES (inf, lb, cp)
+    {
+      /* Look at each TEX keyword in line. */
+      for (;;)
+       {
+         /* Look for a TEX escape. */
+         while (*cp++ != TEX_esc)
+           if (cp[-1] == '\0' || cp[-1] == '%')
+             goto tex_next_line;
+
+         for (key = TEX_toktab; key->buffer != NULL; key++)
+           if (strneq (cp, key->buffer, key->len))
+             {
+               char *p;
+               int namelen, linelen;
+               bool opgrp = false;
+
+               cp = skip_spaces (cp + key->len);
+               if (*cp == TEX_opgrp)
+                 {
+                   opgrp = true;
+                   cp++;
+                 }
+               for (p = cp;
+                    (!iswhite (*p) && *p != '#' &&
+                     *p != TEX_opgrp && *p != TEX_clgrp);
+                    p++)
+                 continue;
+               namelen = p - cp;
+               linelen = lb.len;
+               if (!opgrp || *p == TEX_clgrp)
+                 {
+                   while (*p != '\0' && *p != TEX_opgrp && *p != TEX_clgrp)
+                     p++;
+                   linelen = p - lb.buffer + 1;
+                 }
+               make_tag (cp, namelen, true,
+                         lb.buffer, linelen, lineno, linecharno);
+               goto tex_next_line; /* We only tag a line once */
+             }
+       }
+    tex_next_line:
+      ;
+    }
+}
+
+#define TEX_LESC '\\'
+#define TEX_SESC '!'
+
+/* Figure out whether TeX's escapechar is '\\' or '!' and set grouping
+   chars accordingly. */
+static void
+TEX_mode (FILE *inf)
+{
+  int c;
+
+  while ((c = getc (inf)) != EOF)
+    {
+      /* Skip to next line if we hit the TeX comment char. */
+      if (c == '%')
+       while (c != '\n' && c != EOF)
+         c = getc (inf);
+      else if (c == TEX_LESC || c == TEX_SESC )
+       break;
+    }
+
+  if (c == TEX_LESC)
+    {
+      TEX_esc = TEX_LESC;
+      TEX_opgrp = '{';
+      TEX_clgrp = '}';
+    }
+  else
+    {
+      TEX_esc = TEX_SESC;
+      TEX_opgrp = '<';
+      TEX_clgrp = '>';
+    }
+  /* If the input file is compressed, inf is a pipe, and rewind may fail.
+     No attempt is made to correct the situation. */
+  rewind (inf);
+}
+
+/* Read environment and prepend it to the default string.
+   Build token table. */
+static void
+TEX_decode_env (const char *evarname, const char *defenv)
+{
+  register const char *env, *p;
+  int i, len;
+
+  /* Append default string to environment. */
+  env = getenv (evarname);
+  if (!env)
+    env = defenv;
+  else
+    env = concat (env, defenv, "");
+
+  /* Allocate a token table */
+  for (len = 1, p = env; p;)
+    if ((p = strchr (p, ':')) && *++p != '\0')
+      len++;
+  TEX_toktab = xnew (len, linebuffer);
+
+  /* Unpack environment string into token table. Be careful about */
+  /* zero-length strings (leading ':', "::" and trailing ':') */
+  for (i = 0; *env != '\0';)
+    {
+      p = strchr (env, ':');
+      if (!p)                  /* End of environment string. */
+       p = env + strlen (env);
+      if (p - env > 0)
+       {                       /* Only non-zero strings. */
+         TEX_toktab[i].buffer = savenstr (env, p - env);
+         TEX_toktab[i].len = p - env;
+         i++;
+       }
+      if (*p)
+       env = p + 1;
+      else
+       {
+         TEX_toktab[i].buffer = NULL; /* Mark end of table. */
+         TEX_toktab[i].len = 0;
+         break;
+       }
+    }
+}
+
+
+/* Texinfo support.  Dave Love, Mar. 2000.  */
+static void
+Texinfo_nodes (FILE *inf)
+{
+  char *cp, *start;
+  LOOP_ON_INPUT_LINES (inf, lb, cp)
+    if (LOOKING_AT (cp, "@node"))
+      {
+       start = cp;
+       while (*cp != '\0' && *cp != ',')
+         cp++;
+       make_tag (start, cp - start, true,
+                 lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+      }
+}
+
+
+/*
+ * HTML support.
+ * Contents of <title>, <h1>, <h2>, <h3> are tags.
+ * Contents of <a name=xxx> are tags with name xxx.
+ *
+ * Francesco Potortì, 2002.
+ */
+static void
+HTML_labels (FILE *inf)
+{
+  bool getnext = false;                /* next text outside of HTML tags is a 
tag */
+  bool skiptag = false;                /* skip to the end of the current HTML 
tag */
+  bool intag = false;          /* inside an html tag, looking for ID= */
+  bool inanchor = false;       /* when INTAG, is an anchor, look for NAME= */
+  char *end;
+
+
+  linebuffer_setlen (&token_name, 0); /* no name in buffer */
+
+  LOOP_ON_INPUT_LINES (inf, lb, dbp)
+    for (;;)                   /* loop on the same line */
+      {
+       if (skiptag)            /* skip HTML tag */
+         {
+           while (*dbp != '\0' && *dbp != '>')
+             dbp++;
+           if (*dbp == '>')
+             {
+               dbp += 1;
+               skiptag = false;
+               continue;       /* look on the same line */
+             }
+           break;              /* go to next line */
+         }
+
+       else if (intag) /* look for "name=" or "id=" */
+         {
+           while (*dbp != '\0' && *dbp != '>'
+                  && lowcase (*dbp) != 'n' && lowcase (*dbp) != 'i')
+             dbp++;
+           if (*dbp == '\0')
+             break;            /* go to next line */
+           if (*dbp == '>')
+             {
+               dbp += 1;
+               intag = false;
+               continue;       /* look on the same line */
+             }
+           if ((inanchor && LOOKING_AT_NOCASE (dbp, "name="))
+               || LOOKING_AT_NOCASE (dbp, "id="))
+             {
+               bool quoted = (dbp[0] == '"');
+
+               if (quoted)
+                 for (end = ++dbp; *end != '\0' && *end != '"'; end++)
+                   continue;
+               else
+                 for (end = dbp; *end != '\0' && intoken (*end); end++)
+                   continue;
+               linebuffer_setlen (&token_name, end - dbp);
+               memcpy (token_name.buffer, dbp, end - dbp);
+               token_name.buffer[end - dbp] = '\0';
+
+               dbp = end;
+               intag = false;  /* we found what we looked for */
+               skiptag = true; /* skip to the end of the tag */
+               getnext = true; /* then grab the text */
+               continue;       /* look on the same line */
+             }
+           dbp += 1;
+         }
+
+       else if (getnext)       /* grab next tokens and tag them */
+         {
+           dbp = skip_spaces (dbp);
+           if (*dbp == '\0')
+             break;            /* go to next line */
+           if (*dbp == '<')
+             {
+               intag = true;
+               inanchor = (lowcase (dbp[1]) == 'a' && !intoken (dbp[2]));
+               continue;       /* look on the same line */
+             }
+
+           for (end = dbp + 1; *end != '\0' && *end != '<'; end++)
+             continue;
+           make_tag (token_name.buffer, token_name.len, true,
+                     dbp, end - dbp, lineno, linecharno);
+           linebuffer_setlen (&token_name, 0); /* no name in buffer */
+           getnext = false;
+           break;              /* go to next line */
+         }
+
+       else                    /* look for an interesting HTML tag */
+         {
+           while (*dbp != '\0' && *dbp != '<')
+             dbp++;
+           if (*dbp == '\0')
+             break;            /* go to next line */
+           intag = true;
+           if (lowcase (dbp[1]) == 'a' && !intoken (dbp[2]))
+             {
+               inanchor = true;
+               continue;       /* look on the same line */
+             }
+           else if (LOOKING_AT_NOCASE (dbp, "<title>")
+                    || LOOKING_AT_NOCASE (dbp, "<h1>")
+                    || LOOKING_AT_NOCASE (dbp, "<h2>")
+                    || LOOKING_AT_NOCASE (dbp, "<h3>"))
+             {
+               intag = false;
+               getnext = true;
+               continue;       /* look on the same line */
+             }
+           dbp += 1;
+         }
+      }
+}
+
+
+/*
+ * Prolog support
+ *
+ * Assumes that the predicate or rule starts at column 0.
+ * Only the first clause of a predicate or rule is added.
+ * Original code by Sunichirou Sugou (1989)
+ * Rewritten by Anders Lindgren (1996)
+ */
+static size_t prolog_pr (char *, char *);
+static void prolog_skip_comment (linebuffer *, FILE *);
+static size_t prolog_atom (char *, size_t);
+
+static void
+Prolog_functions (FILE *inf)
+{
+  char *cp, *last;
+  size_t len;
+  size_t allocated;
+
+  allocated = 0;
+  len = 0;
+  last = NULL;
+
+  LOOP_ON_INPUT_LINES (inf, lb, cp)
+    {
+      if (cp[0] == '\0')       /* Empty line */
+       continue;
+      else if (iswhite (cp[0])) /* Not a predicate */
+       continue;
+      else if (cp[0] == '/' && cp[1] == '*')   /* comment. */
+       prolog_skip_comment (&lb, inf);
+      else if ((len = prolog_pr (cp, last)) > 0)
+       {
+         /* Predicate or rule.  Store the function name so that we
+            only generate a tag for the first clause.  */
+         if (last == NULL)
+           last = xnew (len + 1, char);
+         else if (len + 1 > allocated)
+           xrnew (last, len + 1, char);
+         allocated = len + 1;
+         memcpy (last, cp, len);
+         last[len] = '\0';
+       }
+    }
+  free (last);
+}
+
+
+static void
+prolog_skip_comment (linebuffer *plb, FILE *inf)
+{
+  char *cp;
+
+  do
+    {
+      for (cp = plb->buffer; *cp != '\0'; cp++)
+       if (cp[0] == '*' && cp[1] == '/')
+         return;
+      readline (plb, inf);
+    }
+  while (!feof (inf));
+}
+
+/*
+ * A predicate or rule definition is added if it matches:
+ *     <beginning of line><Prolog Atom><whitespace>(
+ * or  <beginning of line><Prolog Atom><whitespace>:-
+ *
+ * It is added to the tags database if it doesn't match the
+ * name of the previous clause header.
+ *
+ * Return the size of the name of the predicate or rule, or 0 if no
+ * header was found.
+ */
+static size_t
+prolog_pr (char *s, char *last)
+
+                               /* Name of last clause. */
+{
+  size_t pos;
+  size_t len;
+
+  pos = prolog_atom (s, 0);
+  if (! pos)
+    return 0;
+
+  len = pos;
+  pos = skip_spaces (s + pos) - s;
+
+  if ((s[pos] == '.'
+       || (s[pos] == '(' && (pos += 1))
+       || (s[pos] == ':' && s[pos + 1] == '-' && (pos += 2)))
+      && (last == NULL         /* save only the first clause */
+         || len != strlen (last)
+         || !strneq (s, last, len)))
+       {
+         make_tag (s, len, true, s, pos, lineno, linecharno);
+         return len;
+       }
+  else
+    return 0;
+}
+
+/*
+ * Consume a Prolog atom.
+ * Return the number of bytes consumed, or 0 if there was an error.
+ *
+ * A prolog atom, in this context, could be one of:
+ * - An alphanumeric sequence, starting with a lower case letter.
+ * - A quoted arbitrary string. Single quotes can escape themselves.
+ *   Backslash quotes everything.
+ */
+static size_t
+prolog_atom (char *s, size_t pos)
+{
+  size_t origpos;
+
+  origpos = pos;
+
+  if (ISLOWER (s[pos]) || (s[pos] == '_'))
+    {
+      /* The atom is unquoted. */
+      pos++;
+      while (ISALNUM (s[pos]) || (s[pos] == '_'))
+       {
+         pos++;
+       }
+      return pos - origpos;
+    }
+  else if (s[pos] == '\'')
+    {
+      pos++;
+
+      for (;;)
+       {
+         if (s[pos] == '\'')
+           {
+             pos++;
+             if (s[pos] != '\'')
+               break;
+             pos++;            /* A double quote */
+           }
+         else if (s[pos] == '\0')
+           /* Multiline quoted atoms are ignored. */
+           return 0;
+         else if (s[pos] == '\\')
+           {
+             if (s[pos+1] == '\0')
+               return 0;
+             pos += 2;
+           }
+         else
+           pos++;
+       }
+      return pos - origpos;
+    }
+  else
+    return 0;
+}
+
+
+/*
+ * Support for Erlang
+ *
+ * Generates tags for functions, defines, and records.
+ * Assumes that Erlang functions start at column 0.
+ * Original code by Anders Lindgren (1996)
+ */
+static int erlang_func (char *, char *);
+static void erlang_attribute (char *);
+static int erlang_atom (char *);
+
+static void
+Erlang_functions (FILE *inf)
+{
+  char *cp, *last;
+  int len;
+  int allocated;
+
+  allocated = 0;
+  len = 0;
+  last = NULL;
+
+  LOOP_ON_INPUT_LINES (inf, lb, cp)
+    {
+      if (cp[0] == '\0')       /* Empty line */
+       continue;
+      else if (iswhite (cp[0])) /* Not function nor attribute */
+       continue;
+      else if (cp[0] == '%')   /* comment */
+       continue;
+      else if (cp[0] == '"')   /* Sometimes, strings start in column one */
+       continue;
+      else if (cp[0] == '-')   /* attribute, e.g. "-define" */
+       {
+         erlang_attribute (cp);
+         if (last != NULL)
+           {
+             free (last);
+             last = NULL;
+           }
+       }
+      else if ((len = erlang_func (cp, last)) > 0)
+       {
+         /*
+          * Function.  Store the function name so that we only
+          * generates a tag for the first clause.
+          */
+         if (last == NULL)
+           last = xnew (len + 1, char);
+         else if (len + 1 > allocated)
+           xrnew (last, len + 1, char);
+         allocated = len + 1;
+         memcpy (last, cp, len);
+         last[len] = '\0';
+       }
+    }
+  free (last);
+}
+
+
+/*
+ * A function definition is added if it matches:
+ *     <beginning of line><Erlang Atom><whitespace>(
+ *
+ * It is added to the tags database if it doesn't match the
+ * name of the previous clause header.
+ *
+ * Return the size of the name of the function, or 0 if no function
+ * was found.
+ */
+static int
+erlang_func (char *s, char *last)
+
+                               /* Name of last clause. */
+{
+  int pos;
+  int len;
+
+  pos = erlang_atom (s);
+  if (pos < 1)
+    return 0;
+
+  len = pos;
+  pos = skip_spaces (s + pos) - s;
+
+  /* Save only the first clause. */
+  if (s[pos++] == '('
+      && (last == NULL
+         || len != (int)strlen (last)
+         || !strneq (s, last, len)))
+       {
+         make_tag (s, len, true, s, pos, lineno, linecharno);
+         return len;
+       }
+
+  return 0;
+}
+
+
+/*
+ * Handle attributes.  Currently, tags are generated for defines
+ * and records.
+ *
+ * They are on the form:
+ * -define(foo, bar).
+ * -define(Foo(M, N), M+N).
+ * -record(graph, {vtab = notable, cyclic = true}).
+ */
+static void
+erlang_attribute (char *s)
+{
+  char *cp = s;
+
+  if ((LOOKING_AT (cp, "-define") || LOOKING_AT (cp, "-record"))
+      && *cp++ == '(')
+    {
+      int len = erlang_atom (skip_spaces (cp));
+      if (len > 0)
+       make_tag (cp, len, true, s, cp + len - s, lineno, linecharno);
+    }
+  return;
+}
+
+
+/*
+ * Consume an Erlang atom (or variable).
+ * Return the number of bytes consumed, or -1 if there was an error.
+ */
+static int
+erlang_atom (char *s)
+{
+  int pos = 0;
+
+  if (ISALPHA (s[pos]) || s[pos] == '_')
+    {
+      /* The atom is unquoted. */
+      do
+       pos++;
+      while (ISALNUM (s[pos]) || s[pos] == '_');
+    }
+  else if (s[pos] == '\'')
+    {
+      for (pos++; s[pos] != '\''; pos++)
+       if (s[pos] == '\0'      /* multiline quoted atoms are ignored */
+           || (s[pos] == '\\' && s[++pos] == '\0'))
+         return 0;
+      pos++;
+    }
+
+  return pos;
+}
+
+
+static char *scan_separators (char *);
+static void add_regex (char *, language *);
+static char *substitute (char *, char *, struct re_registers *);
+
+/*
+ * Take a string like "/blah/" and turn it into "blah", verifying
+ * that the first and last characters are the same, and handling
+ * quoted separator characters.  Actually, stops on the occurrence of
+ * an unquoted separator.  Also process \t, \n, etc. and turn into
+ * appropriate characters. Works in place.  Null terminates name string.
+ * Returns pointer to terminating separator, or NULL for
+ * unterminated regexps.
+ */
+static char *
+scan_separators (char *name)
+{
+  char sep = name[0];
+  char *copyto = name;
+  bool quoted = false;
+
+  for (++name; *name != '\0'; ++name)
+    {
+      if (quoted)
+       {
+         switch (*name)
+           {
+           case 'a': *copyto++ = '\007'; break; /* BEL (bell)           */
+           case 'b': *copyto++ = '\b'; break;   /* BS (back space)      */
+           case 'd': *copyto++ = 0177; break;   /* DEL (delete)         */
+           case 'e': *copyto++ = 033; break;    /* ESC (delete)         */
+           case 'f': *copyto++ = '\f'; break;   /* FF (form feed)       */
+           case 'n': *copyto++ = '\n'; break;   /* NL (new line)        */
+           case 'r': *copyto++ = '\r'; break;   /* CR (carriage return) */
+           case 't': *copyto++ = '\t'; break;   /* TAB (horizontal tab) */
+           case 'v': *copyto++ = '\v'; break;   /* VT (vertical tab)    */
+           default:
+             if (*name == sep)
+               *copyto++ = sep;
+             else
+               {
+                 /* Something else is quoted, so preserve the quote. */
+                 *copyto++ = '\\';
+                 *copyto++ = *name;
+               }
+             break;
+           }
+         quoted = false;
+       }
+      else if (*name == '\\')
+       quoted = true;
+      else if (*name == sep)
+       break;
+      else
+       *copyto++ = *name;
+    }
+  if (*name != sep)
+    name = NULL;               /* signal unterminated regexp */
+
+  /* Terminate copied string. */
+  *copyto = '\0';
+  return name;
+}
+
+/* Look at the argument of --regex or --no-regex and do the right
+   thing.  Same for each line of a regexp file. */
+static void
+analyze_regex (char *regex_arg)
+{
+  if (regex_arg == NULL)
+    {
+      free_regexps ();         /* --no-regex: remove existing regexps */
+      return;
+    }
+
+  /* A real --regexp option or a line in a regexp file. */
+  switch (regex_arg[0])
+    {
+      /* Comments in regexp file or null arg to --regex. */
+    case '\0':
+    case ' ':
+    case '\t':
+      break;
+
+      /* Read a regex file.  This is recursive and may result in a
+        loop, which will stop when the file descriptors are exhausted. */
+    case '@':
+      {
+       FILE *regexfp;
+       linebuffer regexbuf;
+       char *regexfile = regex_arg + 1;
+
+       /* regexfile is a file containing regexps, one per line. */
+       regexfp = fopen (regexfile, "r" FOPEN_BINARY);
+       if (regexfp == NULL)
+         pfatal (regexfile);
+       linebuffer_init (&regexbuf);
+       while (readline_internal (&regexbuf, regexfp) > 0)
+         analyze_regex (regexbuf.buffer);
+       free (regexbuf.buffer);
+       fclose (regexfp);
+      }
+      break;
+
+      /* Regexp to be used for a specific language only. */
+    case '{':
+      {
+       language *lang;
+       char *lang_name = regex_arg + 1;
+       char *cp;
+
+       for (cp = lang_name; *cp != '}'; cp++)
+         if (*cp == '\0')
+           {
+             error ("unterminated language name in regex: %s", regex_arg);
+             return;
+           }
+       *cp++ = '\0';
+       lang = get_language_from_langname (lang_name);
+       if (lang == NULL)
+         return;
+       add_regex (cp, lang);
+      }
+      break;
+
+      /* Regexp to be used for any language. */
+    default:
+      add_regex (regex_arg, NULL);
+      break;
+    }
+}
+
+/* Separate the regexp pattern, compile it,
+   and care for optional name and modifiers. */
+static void
+add_regex (char *regexp_pattern, language *lang)
+{
+  static struct re_pattern_buffer zeropattern;
+  char sep, *pat, *name, *modifiers;
+  char empty = '\0';
+  const char *err;
+  struct re_pattern_buffer *patbuf;
+  regexp *rp;
+  bool
+    force_explicit_name = true, /* do not use implicit tag names */
+    ignore_case = false,       /* case is significant */
+    multi_line = false,                /* matches are done one line at a time 
*/
+    single_line = false;       /* dot does not match newline */
+
+
+  if (strlen (regexp_pattern) < 3)
+    {
+      error ("null regexp");
+      return;
+    }
+  sep = regexp_pattern[0];
+  name = scan_separators (regexp_pattern);
+  if (name == NULL)
+    {
+      error ("%s: unterminated regexp", regexp_pattern);
+      return;
+    }
+  if (name[1] == sep)
+    {
+      error ("null name for regexp \"%s\"", regexp_pattern);
+      return;
+    }
+  modifiers = scan_separators (name);
+  if (modifiers == NULL)       /* no terminating separator --> no name */
+    {
+      modifiers = name;
+      name = &empty;
+    }
+  else
+    modifiers += 1;            /* skip separator */
+
+  /* Parse regex modifiers. */
+  for (; modifiers[0] != '\0'; modifiers++)
+    switch (modifiers[0])
+      {
+      case 'N':
+       if (modifiers == name)
+         error ("forcing explicit tag name but no name, ignoring");
+       force_explicit_name = true;
+       break;
+      case 'i':
+       ignore_case = true;
+       break;
+      case 's':
+       single_line = true;
+       /* FALLTHRU */
+      case 'm':
+       multi_line = true;
+       need_filebuf = true;
+       break;
+      default:
+       error ("invalid regexp modifier `%c', ignoring", modifiers[0]);
+       break;
+      }
+
+  patbuf = xnew (1, struct re_pattern_buffer);
+  *patbuf = zeropattern;
+  if (ignore_case)
+    {
+      static char lc_trans[CHARS];
+      int i;
+      for (i = 0; i < CHARS; i++)
+       lc_trans[i] = lowcase (i);
+      patbuf->translate = lc_trans;    /* translation table to fold case  */
+    }
+
+  if (multi_line)
+    pat = concat ("^", regexp_pattern, ""); /* anchor to beginning of line */
+  else
+    pat = regexp_pattern;
+
+  if (single_line)
+    re_set_syntax (RE_SYNTAX_EMACS | RE_DOT_NEWLINE);
+  else
+    re_set_syntax (RE_SYNTAX_EMACS);
+
+  err = re_compile_pattern (pat, strlen (pat), patbuf);
+  if (multi_line)
+    free (pat);
+  if (err != NULL)
+    {
+      error ("%s while compiling pattern", err);
+      return;
+    }
+
+  rp = p_head;
+  p_head = xnew (1, regexp);
+  p_head->pattern = savestr (regexp_pattern);
+  p_head->p_next = rp;
+  p_head->lang = lang;
+  p_head->pat = patbuf;
+  p_head->name = savestr (name);
+  p_head->error_signaled = false;
+  p_head->force_explicit_name = force_explicit_name;
+  p_head->ignore_case = ignore_case;
+  p_head->multi_line = multi_line;
+}
+
+/*
+ * Do the substitutions indicated by the regular expression and
+ * arguments.
+ */
+static char *
+substitute (char *in, char *out, struct re_registers *regs)
+{
+  char *result, *t;
+  int size, dig, diglen;
+
+  result = NULL;
+  size = strlen (out);
+
+  /* Pass 1: figure out how much to allocate by finding all \N strings. */
+  if (out[size - 1] == '\\')
+    fatal ("pattern error in \"%s\"", out);
+  for (t = strchr (out, '\\');
+       t != NULL;
+       t = strchr (t + 2, '\\'))
+    if (ISDIGIT (t[1]))
+      {
+       dig = t[1] - '0';
+       diglen = regs->end[dig] - regs->start[dig];
+       size += diglen - 2;
+      }
+    else
+      size -= 1;
+
+  /* Allocate space and do the substitutions. */
+  assert (size >= 0);
+  result = xnew (size + 1, char);
+
+  for (t = result; *out != '\0'; out++)
+    if (*out == '\\' && ISDIGIT (*++out))
+      {
+       dig = *out - '0';
+       diglen = regs->end[dig] - regs->start[dig];
+       memcpy (t, in + regs->start[dig], diglen);
+       t += diglen;
+      }
+    else
+      *t++ = *out;
+  *t = '\0';
+
+  assert (t <= result + size);
+  assert (t - result == (int)strlen (result));
+
+  return result;
+}
+
+/* Deallocate all regexps. */
+static void
+free_regexps (void)
+{
+  regexp *rp;
+  while (p_head != NULL)
+    {
+      rp = p_head->p_next;
+      free (p_head->pattern);
+      free (p_head->name);
+      free (p_head);
+      p_head = rp;
+    }
+  return;
+}
+
+/*
+ * Reads the whole file as a single string from `filebuf' and looks for
+ * multi-line regular expressions, creating tags on matches.
+ * readline already dealt with normal regexps.
+ *
+ * Idea by Ben Wing <address@hidden> (2002).
+ */
+static void
+regex_tag_multiline (void)
+{
+  char *buffer = filebuf.buffer;
+  regexp *rp;
+  char *name;
+
+  for (rp = p_head; rp != NULL; rp = rp->p_next)
+    {
+      int match = 0;
+
+      if (!rp->multi_line)
+       continue;               /* skip normal regexps */
+
+      /* Generic initializations before parsing file from memory. */
+      lineno = 1;              /* reset global line number */
+      charno = 0;              /* reset global char number */
+      linecharno = 0;          /* reset global char number of line start */
+
+      /* Only use generic regexps or those for the current language. */
+      if (rp->lang != NULL && rp->lang != curfdp->lang)
+       continue;
+
+      while (match >= 0 && match < filebuf.len)
+       {
+         match = re_search (rp->pat, buffer, filebuf.len, charno,
+                            filebuf.len - match, &rp->regs);
+         switch (match)
+           {
+           case -2:
+             /* Some error. */
+             if (!rp->error_signaled)
+               {
+                 error ("regexp stack overflow while matching \"%s\"",
+                        rp->pattern);
+                 rp->error_signaled = true;
+               }
+             break;
+           case -1:
+             /* No match. */
+             break;
+           default:
+             if (match == rp->regs.end[0])
+               {
+                 if (!rp->error_signaled)
+                   {
+                     error ("regexp matches the empty string: \"%s\"",
+                            rp->pattern);
+                     rp->error_signaled = true;
+                   }
+                 match = -3;   /* exit from while loop */
+                 break;
+               }
+
+             /* Match occurred.  Construct a tag. */
+             while (charno < rp->regs.end[0])
+               if (buffer[charno++] == '\n')
+                 lineno++, linecharno = charno;
+             name = rp->name;
+             if (name[0] == '\0')
+               name = NULL;
+             else /* make a named tag */
+               name = substitute (buffer, rp->name, &rp->regs);
+             if (rp->force_explicit_name)
+               /* Force explicit tag name, if a name is there. */
+               pfnote (name, true, buffer + linecharno,
+                       charno - linecharno + 1, lineno, linecharno);
+             else
+               make_tag (name, strlen (name), true, buffer + linecharno,
+                         charno - linecharno + 1, lineno, linecharno);
+             break;
+           }
+       }
+    }
+}
+
+
+static bool
+nocase_tail (const char *cp)
+{
+  register int len = 0;
+
+  while (*cp != '\0' && lowcase (*cp) == lowcase (dbp[len]))
+    cp++, len++;
+  if (*cp == '\0' && !intoken (dbp[len]))
+    {
+      dbp += len;
+      return true;
+    }
+  return false;
+}
+
+static void
+get_tag (register char *bp, char **namepp)
+{
+  register char *cp = bp;
+
+  if (*bp != '\0')
+    {
+      /* Go till you get to white space or a syntactic break */
+      for (cp = bp + 1; !notinname (*cp); cp++)
+       continue;
+      make_tag (bp, cp - bp, true,
+               lb.buffer, cp - lb.buffer + 1, lineno, linecharno);
+    }
+
+  if (namepp != NULL)
+    *namepp = savenstr (bp, cp - bp);
+}
+
+/*
+ * Read a line of text from `stream' into `lbp', excluding the
+ * newline or CR-NL, if any.  Return the number of characters read from
+ * `stream', which is the length of the line including the newline.
+ *
+ * On DOS or Windows we do not count the CR character, if any before the
+ * NL, in the returned length; this mirrors the behavior of Emacs on those
+ * platforms (for text files, it translates CR-NL to NL as it reads in the
+ * file).
+ *
+ * If multi-line regular expressions are requested, each line read is
+ * appended to `filebuf'.
+ */
+static long
+readline_internal (linebuffer *lbp, register FILE *stream)
+{
+  char *buffer = lbp->buffer;
+  register char *p = lbp->buffer;
+  register char *pend;
+  int chars_deleted;
+
+  pend = p + lbp->size;                /* Separate to avoid 386/IX compiler 
bug.  */
+
+  for (;;)
+    {
+      register int c = getc (stream);
+      if (p == pend)
+       {
+         /* We're at the end of linebuffer: expand it. */
+         lbp->size *= 2;
+         xrnew (buffer, lbp->size, char);
+         p += buffer - lbp->buffer;
+         pend = buffer + lbp->size;
+         lbp->buffer = buffer;
+       }
+      if (c == EOF)
+       {
+         *p = '\0';
+         chars_deleted = 0;
+         break;
+       }
+      if (c == '\n')
+       {
+         if (p > buffer && p[-1] == '\r')
+           {
+             p -= 1;
+#ifdef DOS_NT
+            /* Assume CRLF->LF translation will be performed by Emacs
+               when loading this file, so CRs won't appear in the buffer.
+               It would be cleaner to compensate within Emacs;
+               however, Emacs does not know how many CRs were deleted
+               before any given point in the file.  */
+             chars_deleted = 1;
+#else
+             chars_deleted = 2;
+#endif
+           }
+         else
+           {
+             chars_deleted = 1;
+           }
+         *p = '\0';
+         break;
+       }
+      *p++ = c;
+    }
+  lbp->len = p - buffer;
+
+  if (need_filebuf             /* we need filebuf for multi-line regexps */
+      && chars_deleted > 0)    /* not at EOF */
+    {
+      while (filebuf.size <= filebuf.len + lbp->len + 1) /* +1 for \n */
+       {
+         /* Expand filebuf. */
+         filebuf.size *= 2;
+         xrnew (filebuf.buffer, filebuf.size, char);
+       }
+      memcpy (filebuf.buffer + filebuf.len, lbp->buffer, lbp->len);
+      filebuf.len += lbp->len;
+      filebuf.buffer[filebuf.len++] = '\n';
+      filebuf.buffer[filebuf.len] = '\0';
+    }
+
+  return lbp->len + chars_deleted;
+}
+
+/*
+ * Like readline_internal, above, but in addition try to match the
+ * input line against relevant regular expressions and manage #line
+ * directives.
+ */
+static void
+readline (linebuffer *lbp, FILE *stream)
+{
+  long result;
+
+  linecharno = charno;         /* update global char number of line start */
+  result = readline_internal (lbp, stream); /* read line */
+  lineno += 1;                 /* increment global line number */
+  charno += result;            /* increment global char number */
+
+  /* Honor #line directives. */
+  if (!no_line_directive)
+    {
+      static bool discard_until_line_directive;
+
+      /* Check whether this is a #line directive. */
+      if (result > 12 && strneq (lbp->buffer, "#line ", 6))
+       {
+         unsigned int lno;
+         int start = 0;
+
+         if (sscanf (lbp->buffer, "#line %u \"%n", &lno, &start) >= 1
+             && start > 0)     /* double quote character found */
+           {
+             char *endp = lbp->buffer + start;
+
+             while ((endp = strchr (endp, '"')) != NULL
+                    && endp[-1] == '\\')
+               endp++;
+             if (endp != NULL)
+               /* Ok, this is a real #line directive.  Let's deal with it. */
+               {
+                 char *taggedabsname;  /* absolute name of original file */
+                 char *taggedfname;    /* name of original file as given */
+                 char *name;           /* temp var */
+
+                 discard_until_line_directive = false; /* found it */
+                 name = lbp->buffer + start;
+                 *endp = '\0';
+                 canonicalize_filename (name);
+                 taggedabsname = absolute_filename (name, tagfiledir);
+                 if (filename_is_absolute (name)
+                     || filename_is_absolute (curfdp->infname))
+                   taggedfname = savestr (taggedabsname);
+                 else
+                   taggedfname = relative_filename (taggedabsname,tagfiledir);
+
+                 if (streq (curfdp->taggedfname, taggedfname))
+                   /* The #line directive is only a line number change.  We
+                      deal with this afterwards. */
+                   free (taggedfname);
+                 else
+                   /* The tags following this #line directive should be
+                      attributed to taggedfname.  In order to do this, set
+                      curfdp accordingly. */
+                   {
+                     fdesc *fdp; /* file description pointer */
+
+                     /* Go look for a file description already set up for the
+                        file indicated in the #line directive.  If there is
+                        one, use it from now until the next #line
+                        directive. */
+                     for (fdp = fdhead; fdp != NULL; fdp = fdp->next)
+                       if (streq (fdp->infname, curfdp->infname)
+                           && streq (fdp->taggedfname, taggedfname))
+                         /* If we remove the second test above (after the &&)
+                            then all entries pertaining to the same file are
+                            coalesced in the tags file.  If we use it, then
+                            entries pertaining to the same file but generated
+                            from different files (via #line directives) will
+                            go into separate sections in the tags file.  These
+                            alternatives look equivalent.  The first one
+                            destroys some apparently useless information. */
+                         {
+                           curfdp = fdp;
+                           free (taggedfname);
+                           break;
+                         }
+                     /* Else, if we already tagged the real file, skip all
+                        input lines until the next #line directive. */
+                     if (fdp == NULL) /* not found */
+                       for (fdp = fdhead; fdp != NULL; fdp = fdp->next)
+                         if (streq (fdp->infabsname, taggedabsname))
+                           {
+                             discard_until_line_directive = true;
+                             free (taggedfname);
+                             break;
+                           }
+                     /* Else create a new file description and use that from
+                        now on, until the next #line directive. */
+                     if (fdp == NULL) /* not found */
+                       {
+                         fdp = fdhead;
+                         fdhead = xnew (1, fdesc);
+                         *fdhead = *curfdp; /* copy curr. file description */
+                         fdhead->next = fdp;
+                         fdhead->infname = savestr (curfdp->infname);
+                         fdhead->infabsname = savestr (curfdp->infabsname);
+                         fdhead->infabsdir = savestr (curfdp->infabsdir);
+                         fdhead->taggedfname = taggedfname;
+                         fdhead->usecharno = false;
+                         fdhead->prop = NULL;
+                         fdhead->written = false;
+                         curfdp = fdhead;
+                       }
+                   }
+                 free (taggedabsname);
+                 lineno = lno - 1;
+                 readline (lbp, stream);
+                 return;
+               } /* if a real #line directive */
+           } /* if #line is followed by a number */
+       } /* if line begins with "#line " */
+
+      /* If we are here, no #line directive was found. */
+      if (discard_until_line_directive)
+       {
+         if (result > 0)
+           {
+             /* Do a tail recursion on ourselves, thus discarding the contents
+                of the line buffer. */
+             readline (lbp, stream);
+             return;
+           }
+         /* End of file. */
+         discard_until_line_directive = false;
+         return;
+       }
+    } /* if #line directives should be considered */
+
+  {
+    int match;
+    regexp *rp;
+    char *name;
+
+    /* Match against relevant regexps. */
+    if (lbp->len > 0)
+      for (rp = p_head; rp != NULL; rp = rp->p_next)
+       {
+         /* Only use generic regexps or those for the current language.
+            Also do not use multiline regexps, which is the job of
+            regex_tag_multiline. */
+         if ((rp->lang != NULL && rp->lang != fdhead->lang)
+             || rp->multi_line)
+           continue;
+
+         match = re_match (rp->pat, lbp->buffer, lbp->len, 0, &rp->regs);
+         switch (match)
+           {
+           case -2:
+             /* Some error. */
+             if (!rp->error_signaled)
+               {
+                 error ("regexp stack overflow while matching \"%s\"",
+                        rp->pattern);
+                 rp->error_signaled = true;
+               }
+             break;
+           case -1:
+             /* No match. */
+             break;
+           case 0:
+             /* Empty string matched. */
+             if (!rp->error_signaled)
+               {
+                 error ("regexp matches the empty string: \"%s\"", 
rp->pattern);
+                 rp->error_signaled = true;
+               }
+             break;
+           default:
+             /* Match occurred.  Construct a tag. */
+             name = rp->name;
+             if (name[0] == '\0')
+               name = NULL;
+             else /* make a named tag */
+               name = substitute (lbp->buffer, rp->name, &rp->regs);
+             if (rp->force_explicit_name)
+               /* Force explicit tag name, if a name is there. */
+               pfnote (name, true, lbp->buffer, match, lineno, linecharno);
+             else
+               make_tag (name, strlen (name), true,
+                         lbp->buffer, match, lineno, linecharno);
+             break;
+           }
+       }
+  }
+}
+
+
+/*
+ * Return a pointer to a space of size strlen(cp)+1 allocated
+ * with xnew where the string CP has been copied.
+ */
+static char *
+savestr (const char *cp)
+{
+  return savenstr (cp, strlen (cp));
+}
+
+/*
+ * Return a pointer to a space of size LEN+1 allocated with xnew where
+ * the string CP has been copied for at most the first LEN characters.
+ */
+static char *
+savenstr (const char *cp, int len)
+{
+  char *dp = xnew (len + 1, char);
+  dp[len] = '\0';
+  return memcpy (dp, cp, len);
+}
+
+/* Skip spaces (end of string is not space), return new pointer. */
+static char *
+skip_spaces (char *cp)
+{
+  while (iswhite (*cp))
+    cp++;
+  return cp;
+}
+
+/* Skip non spaces, except end of string, return new pointer. */
+static char *
+skip_non_spaces (char *cp)
+{
+  while (*cp != '\0' && !iswhite (*cp))
+    cp++;
+  return cp;
+}
+
+/* Skip any chars in the "name" class.*/
+static char *
+skip_name (char *cp)
+{
+  /* '\0' is a notinname() so loop stops there too */
+  while (! notinname (*cp))
+    cp++;
+  return cp;
+}
+
+/* Print error message and exit.  */
+void
+fatal (const char *s1, const char *s2)
+{
+  error (s1, s2);
+  exit (EXIT_FAILURE);
+}
+
+static void
+pfatal (const char *s1)
+{
+  perror (s1);
+  exit (EXIT_FAILURE);
+}
+
+static void
+suggest_asking_for_help (void)
+{
+  fprintf (stderr, "\tTry `%s --help' for a complete list of options.\n",
+          progname);
+  exit (EXIT_FAILURE);
+}
+
+/* Output a diagnostic with printf-style FORMAT and args.  */
+static void
+error (const char *format, ...)
+{
+  va_list ap;
+  va_start (ap, format);
+  fprintf (stderr, "%s: ", progname);
+  vfprintf (stderr, format, ap);
+  fprintf (stderr, "\n");
+  va_end (ap);
+}
+
+/* Return a newly-allocated string whose contents
+   concatenate those of s1, s2, s3.  */
+static char *
+concat (const char *s1, const char *s2, const char *s3)
+{
+  int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
+  char *result = xnew (len1 + len2 + len3 + 1, char);
+
+  strcpy (result, s1);
+  strcpy (result + len1, s2);
+  strcpy (result + len1 + len2, s3);
+
+  return result;
+}
+
+
+/* Does the same work as the system V getcwd, but does not need to
+   guess the buffer size in advance. */
+static char *
+etags_getcwd (void)
+{
+  int bufsize = 200;
+  char *path = xnew (bufsize, char);
+
+  while (getcwd (path, bufsize) == NULL)
+    {
+      if (errno != ERANGE)
+       pfatal ("getcwd");
+      bufsize *= 2;
+      free (path);
+      path = xnew (bufsize, char);
+    }
+
+  canonicalize_filename (path);
+  return path;
+}
+
+/* Return a newly allocated string containing the file name of FILE
+   relative to the absolute directory DIR (which should end with a slash). */
+static char *
+relative_filename (char *file, char *dir)
+{
+  char *fp, *dp, *afn, *res;
+  int i;
+
+  /* Find the common root of file and dir (with a trailing slash). */
+  afn = absolute_filename (file, cwd);
+  fp = afn;
+  dp = dir;
+  while (*fp++ == *dp++)
+    continue;
+  fp--, dp--;                  /* back to the first differing char */
+#ifdef DOS_NT
+  if (fp == afn && afn[0] != '/') /* cannot build a relative name */
+    return afn;
+#endif
+  do                           /* look at the equal chars until '/' */
+    fp--, dp--;
+  while (*fp != '/');
+
+  /* Build a sequence of "../" strings for the resulting relative file name. */
+  i = 0;
+  while ((dp = strchr (dp + 1, '/')) != NULL)
+    i += 1;
+  res = xnew (3*i + strlen (fp + 1) + 1, char);
+  char *z = res;
+  while (i-- > 0)
+    z = stpcpy (z, "../");
+
+  /* Add the file name relative to the common root of file and dir. */
+  strcpy (z, fp + 1);
+  free (afn);
+
+  return res;
+}
+
+/* Return a newly allocated string containing the absolute file name
+   of FILE given DIR (which should end with a slash). */
+static char *
+absolute_filename (char *file, char *dir)
+{
+  char *slashp, *cp, *res;
+
+  if (filename_is_absolute (file))
+    res = savestr (file);
+#ifdef DOS_NT
+  /* We don't support non-absolute file names with a drive
+     letter, like `d:NAME' (it's too much hassle).  */
+  else if (file[1] == ':')
+    fatal ("%s: relative file names with drive letters not supported", file);
+#endif
+  else
+    res = concat (dir, file, "");
+
+  /* Delete the "/dirname/.." and "/." substrings. */
+  slashp = strchr (res, '/');
+  while (slashp != NULL && slashp[0] != '\0')
+    {
+      if (slashp[1] == '.')
+       {
+         if (slashp[2] == '.'
+             && (slashp[3] == '/' || slashp[3] == '\0'))
+           {
+             cp = slashp;
+             do
+               cp--;
+             while (cp >= res && !filename_is_absolute (cp));
+             if (cp < res)
+               cp = slashp;    /* the absolute name begins with "/.." */
+#ifdef DOS_NT
+             /* Under MSDOS and NT we get `d:/NAME' as absolute
+                file name, so the luser could say `d:/../NAME'.
+                We silently treat this as `d:/NAME'.  */
+             else if (cp[0] != '/')
+               cp = slashp;
+#endif
+              memmove (cp, slashp + 3, strlen (slashp + 2));
+             slashp = cp;
+             continue;
+           }
+         else if (slashp[2] == '/' || slashp[2] == '\0')
+           {
+             memmove (slashp, slashp + 2, strlen (slashp + 1));
+             continue;
+           }
+       }
+
+      slashp = strchr (slashp + 1, '/');
+    }
+
+  if (res[0] == '\0')          /* just a safety net: should never happen */
+    {
+      free (res);
+      return savestr ("/");
+    }
+  else
+    return res;
+}
+
+/* Return a newly allocated string containing the absolute
+   file name of dir where FILE resides given DIR (which should
+   end with a slash). */
+static char *
+absolute_dirname (char *file, char *dir)
+{
+  char *slashp, *res;
+  char save;
+
+  slashp = strrchr (file, '/');
+  if (slashp == NULL)
+    return savestr (dir);
+  save = slashp[1];
+  slashp[1] = '\0';
+  res = absolute_filename (file, dir);
+  slashp[1] = save;
+
+  return res;
+}
+
+/* Whether the argument string is an absolute file name.  The argument
+   string must have been canonicalized with canonicalize_filename. */
+static bool
+filename_is_absolute (char *fn)
+{
+  return (fn[0] == '/'
+#ifdef DOS_NT
+         || (ISALPHA (fn[0]) && fn[1] == ':' && fn[2] == '/')
+#endif
+         );
+}
+
+/* Downcase DOS drive letter and collapse separators into single slashes.
+   Works in place. */
+static void
+canonicalize_filename (register char *fn)
+{
+  register char* cp;
+  char sep = '/';
+
+#ifdef DOS_NT
+  /* Canonicalize drive letter case.  */
+# define ISUPPER(c)    isupper (CHAR (c))
+  if (fn[0] != '\0' && fn[1] == ':' && ISUPPER (fn[0]))
+    fn[0] = lowcase (fn[0]);
+
+  sep = '\\';
+#endif
+
+  /* Collapse multiple separators into a single slash. */
+  for (cp = fn; *cp != '\0'; cp++, fn++)
+    if (*cp == sep)
+      {
+       *fn = '/';
+       while (cp[1] == sep)
+         cp++;
+      }
+    else
+      *fn = *cp;
+  *fn = '\0';
+}
+
+
+/* Initialize a linebuffer for use. */
+static void
+linebuffer_init (linebuffer *lbp)
+{
+  lbp->size = (DEBUG) ? 3 : 200;
+  lbp->buffer = xnew (lbp->size, char);
+  lbp->buffer[0] = '\0';
+  lbp->len = 0;
+}
+
+/* Set the minimum size of a string contained in a linebuffer. */
+static void
+linebuffer_setlen (linebuffer *lbp, int toksize)
+{
+  while (lbp->size <= toksize)
+    {
+      lbp->size *= 2;
+      xrnew (lbp->buffer, lbp->size, char);
+    }
+  lbp->len = toksize;
+}
+
+/* Like malloc but get fatal error if memory is exhausted. */
+static void *
+xmalloc (size_t size)
+{
+  void *result = malloc (size);
+  if (result == NULL)
+    fatal ("virtual memory exhausted", (char *)NULL);
+  return result;
+}
+
+static void *
+xrealloc (void *ptr, size_t size)
+{
+  void *result = realloc (ptr, size);
+  if (result == NULL)
+    fatal ("virtual memory exhausted", (char *)NULL);
+  return result;
+}
+
+/*
+ * Local Variables:
+ * indent-tabs-mode: t
+ * tab-width: 8
+ * fill-column: 79
+ * c-font-lock-extra-types: ("FILE" "bool" "language" "linebuffer" "fdesc" 
"node" "regexp")
+ * c-file-style: "gnu"
+ * End:
+ */
+
+/* etags.c ends here */
diff --git a/test/etags/c-src/exit.c b/test/etags/c-src/exit.c
new file mode 100644
index 0000000..b8cd22b
--- /dev/null
+++ b/test/etags/c-src/exit.c
@@ -0,0 +1,77 @@
+/* Copyright (C) 1991 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#include <ansidecl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "exit.h"
+
+#ifdef HAVE_GNU_LD
+CONST struct
+  {
+    size_t n;
+    void EXFUN((*fn[1]), (NOARGS));
+  } __libc_atexit;
+#endif
+
+/* Call all functions registered with `atexit' and `on_exit',
+   in the reverse of the order in which they were registered
+   perform stdio cleanup, and terminate program execution with STATUS.  */
+__NORETURN
+void
+DEFUN(exit, (status), int status)
+{
+  register CONST struct exit_function_list *l;
+
+  for (l = __exit_funcs; l != NULL; l = l->next)
+    {
+      register size_t i = l->idx;
+      while (i-- > 0)
+       {
+         CONST struct exit_function *CONST f = &l->fns[i];
+         switch (f->flavor)
+           {
+           case ef_free:
+             break;
+           case ef_on:
+             (*f->func.on.fn)(status, f->func.on.arg);
+             break;
+           case ef_at:
+             (*f->func.at)();
+             break;
+           }
+       }
+    }
+
+#ifdef HAVE_GNU_LD
+  {
+    void EXFUN((*CONST *fn), (NOARGS));
+    for (fn = __libc_atexit.fn; *fn != NULL; ++fn)
+      (**fn) ();
+  }
+#else
+  {
+    extern void EXFUN(_cleanup, (NOARGS));
+    _cleanup();
+  }
+#endif
+
+  _exit(status);
+}
+
diff --git a/test/etags/c-src/exit.strange_suffix 
b/test/etags/c-src/exit.strange_suffix
new file mode 100644
index 0000000..b8cd22b
--- /dev/null
+++ b/test/etags/c-src/exit.strange_suffix
@@ -0,0 +1,77 @@
+/* Copyright (C) 1991 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#include <ansidecl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include "exit.h"
+
+#ifdef HAVE_GNU_LD
+CONST struct
+  {
+    size_t n;
+    void EXFUN((*fn[1]), (NOARGS));
+  } __libc_atexit;
+#endif
+
+/* Call all functions registered with `atexit' and `on_exit',
+   in the reverse of the order in which they were registered
+   perform stdio cleanup, and terminate program execution with STATUS.  */
+__NORETURN
+void
+DEFUN(exit, (status), int status)
+{
+  register CONST struct exit_function_list *l;
+
+  for (l = __exit_funcs; l != NULL; l = l->next)
+    {
+      register size_t i = l->idx;
+      while (i-- > 0)
+       {
+         CONST struct exit_function *CONST f = &l->fns[i];
+         switch (f->flavor)
+           {
+           case ef_free:
+             break;
+           case ef_on:
+             (*f->func.on.fn)(status, f->func.on.arg);
+             break;
+           case ef_at:
+             (*f->func.at)();
+             break;
+           }
+       }
+    }
+
+#ifdef HAVE_GNU_LD
+  {
+    void EXFUN((*CONST *fn), (NOARGS));
+    for (fn = __libc_atexit.fn; *fn != NULL; ++fn)
+      (**fn) ();
+  }
+#else
+  {
+    extern void EXFUN(_cleanup, (NOARGS));
+    _cleanup();
+  }
+#endif
+
+  _exit(status);
+}
+
diff --git a/test/etags/c-src/fail.c b/test/etags/c-src/fail.c
new file mode 100644
index 0000000..3248278
--- /dev/null
+++ b/test/etags/c-src/fail.c
@@ -0,0 +1 @@
+void (*prt_call())();
diff --git a/test/etags/c-src/getopt.h b/test/etags/c-src/getopt.h
new file mode 100644
index 0000000..93a5cf7
--- /dev/null
+++ b/test/etags/c-src/getopt.h
@@ -0,0 +1,125 @@
+/* Declarations for getopt.
+   Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by the
+   Free Software Foundation; either version 2, or (at your option) any
+   later version.
+   
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+   
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#ifndef _GETOPT_H
+#define _GETOPT_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+   When `getopt' finds an option that takes an argument,
+   the argument value is returned here.
+   Also, when `ordering' is RETURN_IN_ORDER,
+   each non-option ARGV-element is returned here.  */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+   This is used for communication to and from the caller
+   and for communication between successive calls to `getopt'.
+
+   On entry to `getopt', zero means this is the first call; initialize.
+
+   When `getopt' returns EOF, this is the index of the first of the
+   non-option elements that the caller should itself scan.
+
+   Otherwise, `optind' communicates from one call to the next
+   how much of ARGV has been scanned so far.  */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+   for unrecognized options.  */
+
+extern int opterr;
+
+/* Describe the long-named options requested by the application.
+   The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+   of `struct option' terminated by an element containing a name which is
+   zero.
+
+   The field `has_arg' is:
+   no_argument         (or 0) if the option does not take an argument,
+   required_argument   (or 1) if the option requires an argument,
+   optional_argument   (or 2) if the option takes an optional argument.
+
+   If the field `flag' is not NULL, it points to a variable that is set
+   to the value given in the field `val' when the option is found, but
+   left unchanged if the option is not found.
+
+   To have a long-named option do something other than set an `int' to
+   a compiled-in constant, such as set a value from `optarg', set the
+   option's `flag' field to zero and its `val' field to a nonzero
+   value (the equivalent single-letter option character, if there is
+   one).  For long options that have a zero `flag' field, `getopt'
+   returns the contents of the `val' field.  */
+
+struct option
+{
+#if    __STDC__
+  const char *name;
+#else
+  char *name;
+#endif
+  /* has_arg can't be an enum because some compilers complain about
+     type mismatches in all the code that assumes it is an int.  */
+  int has_arg;
+  int *flag;
+  int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'.  */
+
+#define        no_argument             0
+#define required_argument      1
+#define optional_argument      2
+
+#if __STDC__
+#if defined(__GNU_LIBRARY__)
+/* Many other libraries have conflicting prototypes for getopt, with
+   differences in the consts, in stdlib.h.  To avoid compilation
+   errors, only prototype getopt for the GNU C library.  */
+extern int getopt (int argc, char *const *argv, const char *shortopts);
+#else /* not __GNU_LIBRARY__ */
+extern int getopt ();
+#endif /* not __GNU_LIBRARY__ */
+extern int getopt_long (int argc, char *const *argv, const char *shortopts,
+                       const struct option *longopts, int *longind);
+extern int getopt_long_only (int argc, char *const *argv,
+                            const char *shortopts,
+                            const struct option *longopts, int *longind);
+
+/* Internal only.  Users should not call this directly.  */
+extern int _getopt_internal (int argc, char *const *argv,
+                            const char *shortopts,
+                            const struct option *longopts, int *longind,
+                            int long_only);
+#else /* not __STDC__ */
+extern int getopt ();
+extern int getopt_long ();
+extern int getopt_long_only ();
+
+extern int _getopt_internal ();
+#endif /* not __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GETOPT_H */
diff --git a/test/etags/c-src/h.h b/test/etags/c-src/h.h
new file mode 100644
index 0000000..f86c00d
--- /dev/null
+++ b/test/etags/c-src/h.h
@@ -0,0 +1,119 @@
+typedef enum
+{
+   ELEM_I/**< Comment Element i
+              Second comment line. */
+} Fails_t;
+typedef void Lang_function ();
+void Asm_labels ();
+typedef struct tpcmd
+{
+#define ggg hhh
+  union
+  {
+  } arg;
+}
+tpcmd;
+typedef struct foobar2_ {
+    fu   int (*funcptr) (void *ptr);
+    long foo;
+    char bar;
+} foobar2;
+typedef enum
+{
+    DEVICE_SWP,
+    DEVICE_LAST
+} bsp_DevId;
+typedef union {
+  struct constant_args {
+    unsigned int burst;
+  } constant;
+} args;
+typedef int *regset;
+typedef int INT;
+typedef union abc
+{
+  int def;
+} ghi1;
+typedef union abc {
+  int def;
+} ghi2;
+typedef struct a {
+} b;
+#define c() d
+typedef struct an_extern_linkage *an_extern_linkage_ptr;
+typedef struct an_extern_linkage {
+  a_name_linkage_kind
+               kind;
+                       /* The kind of external linkage ("C++" or "C"). */
+  a_byte_boolean
+               is_explicit;
+                       /* TRUE if the external linkage requirement is
+                          explicitly specified in the source; FALSE for the
+                          default set for the translation unit as a whole. */
+#ifdef CL_CHANGES
+  a_byte_boolean is_curly_brace_form;
+#endif
+} an_extern_linkage;
+typedef struct pollfd   pfdset[FD_SETSIZE];
+typedef union rtunion_def
+  {
+    int rtint;
+    char *rtstr;
+    struct rtx_def *rtx;
+  } womboid ;
+typedef union rtunion_def
+
+{
+
+  int rtint;
+  char *rtstr;
+  struct rtx_def *rtxp;
+  struct rtx_def rtxnp;
+
+}
+
+womboid
+
+;
+
+
+/* Leave the next two lines in that order.  They exercise an old bug. */
+enum {dog, cat} animals;
+typedef void (_CALLBACK_ *signal_handler)(int);
+typedef void (_CALLBACK_ *signal_handler1)(int);
+/* comment */ #define ANSIC
+ #define ANSIC
+ #else
+typedef void (proc) ();
+typedef void OperatorFun(int opId);
+typedef int f(int a,
+              int b);
+struct my_struct {
+};
+typedef struct my_struct my_typedef;
+typedef RETSIGTYPE (*signal_handler_t) (int);
+#if 0
+  Date 04 May 87 235311 PDT (Mon)
+  Date: 04 May 87 23:53:11 PDT (Mon)
+#endif
+typedef unsigned char unchar;
+typedef int X, Y, Z;
+typedef mio mao;
+extern void ab();
+typedef struct a { } b;
+typedef struct b
+{
+} c;
+int    (*oldhup)();
+request (*oldhup) ();
+int extvar;
+#define tag1
+#define aaaaaa \
+bbbbbb
+#define bbbbbb\
+cccccc
+#define cccccccccc
+#define enter_critical_section         do { int pri = spl7();
+#define exit_critical_to_previous      splarg (pri); } while (0)
+#define UNDEFINED
+struct re_pattern_buffer { unsigned char *buffer; };
diff --git a/test/etags/c-src/machsyscalls.c b/test/etags/c-src/machsyscalls.c
new file mode 100644
index 0000000..44930c3
--- /dev/null
+++ b/test/etags/c-src/machsyscalls.c
@@ -0,0 +1,10 @@
+/* Aliases for basic Mach system calls:
+   mach_task_self -> __mach_task_self, etc.  */
+
+#include <gnu-stabs.h>
+
+#define        SYSCALL(name, number, type, args, typed_args) \
+  function_alias (name, __##name, type, args, \
+                 name typed_args)
+
+#include "mach_syscalls.h"
diff --git a/test/etags/c-src/machsyscalls.h b/test/etags/c-src/machsyscalls.h
new file mode 100644
index 0000000..8b33dc4
--- /dev/null
+++ b/test/etags/c-src/machsyscalls.h
@@ -0,0 +1,31 @@
+SYSCALL (mach_msg_trap, -25,
+        mach_msg_return_t,
+        (msg, option, send_size,
+         rcv_size, rcv_name, timeout, notify),
+        (mach_msg_header_t *msg,
+         mach_msg_option_t option,
+         mach_msg_size_t send_size,
+         mach_msg_size_t rcv_size,
+         mach_port_t rcv_name,
+         mach_msg_timeout_t timeout,
+         mach_port_t notify))
+
+SYSCALL (mach_reply_port, -26,
+        mach_port_t,
+        (),
+        (void))
+
+SYSCALL (mach_thread_self, -27,
+        mach_port_t,
+        (),
+        (void))
+
+SYSCALL (mach_task_self, -28,
+        mach_port_t,
+        (),
+        (void))
+
+SYSCALL (mach_host_self, -29,
+        mach_port_t,
+        (),
+        (void))
diff --git a/test/etags/c-src/sysdep.h b/test/etags/c-src/sysdep.h
new file mode 100644
index 0000000..298a0e4
--- /dev/null
+++ b/test/etags/c-src/sysdep.h
@@ -0,0 +1,57 @@
+/* Copyright (C) 1992, 1993 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#include <sysdeps/unix/sysdep.h>
+
+#define        ENTRY(name)                                                     
      \
+  .globl _##name;                                                            \
+  .align 2;                                                                  \
+  _##name##:
+
+#define        PSEUDO(name, syscall_name, args)                                
      \
+  .text;                                                                     \
+  .globl syscall_error;                                                        
      \
+  ENTRY (name)                                                               \
+    XCHG_##args
+    movl $SYS_##syscall_name, %eax;                                          \
+    int $0x80;                                                               \
+    test %eax, %eax;                                                         \
+    jl syscall_error;                                                        \
+    XCHG_##args
+
+/* Linux takes system call arguments in registers:
+       1: %ebx
+       2: %ecx
+       3: %edx
+       4: %esi
+       5: %edi
+   We put the arguments into registers from the stack,
+   and save the registers, by using the 386 `xchg' instruction
+   to swap the values in both directions.  */
+
+#define        XCHG_0  /* No arguments to frob.  */
+#define        XCHG_1  xchg 8(%esp), %ebx; XCHG_0
+#define        XCHG_2  xchg 12(%esp), %ecx; XCHG_1
+#define        XCHG_3  xchg 16(%esp), %edx; XCHG_2
+#define        XCHG_4  xchg 20(%esp), %esi; XCHG_3
+#define        XCHG_5  xchg 24(%esp), %edi; XCHG_3
+
+#define        r0              %eax    /* Normal return-value register.  */
+#define        r1              %edx    /* Secondary return-value register.  */
+#define scratch        %ecx    /* Call-clobbered register for random use.  */
+#define MOVE(x,y)      movl x, y
diff --git a/test/etags/c-src/tab.c b/test/etags/c-src/tab.c
new file mode 100644
index 0000000..b25d55c
--- /dev/null
+++ b/test/etags/c-src/tab.c
@@ -0,0 +1,112 @@
+/*
+** tab.c for  in
+**
+** Made by Pierric
+** Login   <address@hidden>
+**
+** Started on  Thu Jan 24 18:36:47 2002 Pierric
+** Last update Mon Sep 23 18:02:02 2002 Pierric
+*/
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include "my_malloc.h"
+
+static int             count_words(char *str, char delim)
+{
+  int                   count;
+
+  count = 0;
+  while (*str)
+    {
+      if (*str != delim)
+       {
+         count++;
+         if (!strchr(str + 1, delim))
+           return (count);
+         str = strchr(str + 1, delim);
+       }
+      else
+       str++;
+    }
+  return (count);
+}
+
+static char            *get_word(char **str, char delim)
+{
+  char                 *tmp;
+  char                 *new;
+
+  while (**str == delim)
+    (*str)++;
+  if (**str == 0)
+    return (NULL);
+  tmp = strchr(*str, delim);
+  if (!tmp)
+    {
+      new = strdup(*str);
+      while (**str)
+       (*str)++;
+      return (new);
+    }
+  my_malloc(new, tmp - *str + 1);
+  new[tmp - *str] = '\0';
+  strncpy(new, *str, tmp - *str);
+  *str = tmp;
+  return (new);
+}
+
+void                   tab_free(char **tab)
+{
+  int                   index;
+
+  if (!tab)
+    return;
+  for (index = 0; tab[index]; index++)
+    free(tab[index]);
+  free(tab);
+}
+
+char                   **tab_fill(char *str, char delim)
+{
+  int                   count;
+  char                  **tab;
+  int                   index;
+
+  if (!str)
+    return (NULL);
+  count = count_words(str, delim);
+  if (!count)
+    return (NULL);
+  my_malloc(tab, (count + 1) * sizeof(char *));
+  for (index = 0; (tab[index] = get_word(&str, delim)); index++)
+    ;
+  return (tab);
+}
+
+/*
+**             Deletes the first element of a wordtab, shifting the other
+**     elements. The size of the malloced area stays the same, though
+*/
+int                    tab_delete_first(char **tab)
+{
+  int                   i;
+
+  if (!tab[0])
+    return (-1);
+  free(tab[0]);
+  for (i = 0; tab[i]; i++)
+    tab[i] = tab[i + 1];
+  return (0);
+}
+
+int                    tab_count_words(char **tab)
+{
+  int                   count;
+
+  if (!tab)
+    return (0);
+  for (count = 0; tab[count]; count++)
+    ;
+  return (count);
+}
diff --git a/test/etags/c-src/torture.c b/test/etags/c-src/torture.c
new file mode 100644
index 0000000..77c3763
--- /dev/null
+++ b/test/etags/c-src/torture.c
@@ -0,0 +1,107 @@
+/* Date: Thu, 05 Aug 1993 20:28:03 +0200
+   From: "Tom R.Hageman" <address@hidden>
+   Subject: more etags torture;-) [etags 7.3 patch#3]
+   To: address@hidden
+
+   Hi,
+
+   This test file illustrates some more problems with etags (7.3):
+ 
+
+   1. parentheses are confusing,
+   2. preprocessor directives can disrupt other state machines. */
+
+/* A small torture test for etags. */
+
+/* The classic parenthesis nightmare, based on signal(). */
+void
+(*tag1 (sig, handler)) ()
+  int sig;
+  void (*handler) ();
+{
+  (*handler)(sig);
+  return handler;
+}
+
+#define notag2 void
+/* The classic, with user-defined return type. */
+notag2
+(*tag2 (sig, handler)) ()
+  int sig;
+  void (*handler) ();
+{
+  (*handler)(sig);
+  return handler;
+}
+
+/* The classic, in ANSI C style. */
+void
+(*tag3 (int sig, void (*handler) (int))) (int)
+{
+  (*handler)(sig);
+  return handler;
+}
+
+#define notag4 void
+/* The classic, with user-defined return type, in ANSI C style. */
+notag4
+(*tag4 (int sig, void (*handler) (int))) (int)
+{
+  (*handler)(sig);
+  return handler;
+}
+
+
+/* A less tortuous example. */
+void
+tag5 (handler, arg)
+void (*handler)();
+void *arg;
+{
+  (*handler)(arg);
+}
+
+/* A less tortuous example, in ANSI C style. */
+void
+tag6 (void (*handler) (void *), void *arg)
+{
+  (*handler)(arg);
+}
+
+
+/* Interfering preprocessing torture */
+
+int pp1(
+#if (__STDC__)
+       int
+#endif
+       bar)
+#if (!__STDC__)
+     int bar;
+#endif
+{
+  return bar;
+}
+
+int
+pp2
+#if __STDC__
+  (int bar)
+#else
+  (bar)
+    int bar;
+#endif
+{
+  return bar;
+}
+
+int
+#if __STDC__
+pp3(int bar)
+#else
+pp3(bar)
+  int bar;
+#endif
+{
+  return bar;
+}
diff --git a/test/etags/cp-src/MDiagArray2.h b/test/etags/cp-src/MDiagArray2.h
new file mode 100644
index 0000000..78ee5e1
--- /dev/null
+++ b/test/etags/cp-src/MDiagArray2.h
@@ -0,0 +1,163 @@
+// Template array classes with like-type math ops
+/*
+
+Copyright (C) 1996 John W. Eaton
+
+This file is part of Octave.
+
+Octave is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+Octave is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Octave; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if defined (__GNUG__)
+#pragma interface
+#endif
+
+#if !defined (octave_MDiagArray2_h)
+#define octave_MDiagArray2_h 1
+
+#include "DiagArray2.h"
+#include "MArray2.h"
+
+#if defined (LTGT)
+#undef LTGT
+#endif
+
+#if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL)
+#define LTGT
+#else
+
+#define LTGT <>
+
+template <class T>
+class MDiagArray2;
+
+template <typename T> MDiagArray2<T>&
+operator += (MDiagArray2<T>& a, const MDiagArray2<T>& b);
+
+template <typename T> MDiagArray2<T>&
+operator -= (MDiagArray2<T>& a, const MDiagArray2<T>& b);
+
+template <typename T> MDiagArray2<T> 
+operator * (const MDiagArray2<T>& a, const T& s);
+
+template <typename T> MDiagArray2<T> 
+operator / (const MDiagArray2<T>& a, const T& s);
+
+template <typename T> MDiagArray2<T> 
+operator * (const T& s, const MDiagArray2<T>& a);
+
+template <typename T> MDiagArray2<T>
+operator + (const MDiagArray2<T>& a, const MDiagArray2<T>& b); 
+
+template <typename T> MDiagArray2<T>
+operator - (const MDiagArray2<T>& a, const MDiagArray2<T>& b);
+
+template <typename T> MDiagArray2<T>
+product (const MDiagArray2<T>& a, const MDiagArray2<T>& b);
+
+template <typename T> MDiagArray2<T> 
+operator - (const MDiagArray2<T>& a);
+#endif
+
+// Two dimensional diagonal array with math ops.
+
+template <class T>
+class MDiagArray2 : public DiagArray2<T>
+{
+protected:
+
+  MDiagArray2 (T *d, int r, int c) : DiagArray2<T> (d, r, c) { }
+
+public:
+  
+  MDiagArray2 (void) : DiagArray2<T> () { }
+  MDiagArray2 (int r, int c) : DiagArray2<T> (r, c) { }
+  MDiagArray2 (int r, int c, const T& val) : DiagArray2<T> (r, c, val) { }
+  MDiagArray2 (const Array<T>& a) : DiagArray2<T> (a) { }
+  MDiagArray2 (const DiagArray2<T>& a) : DiagArray2<T> (a) { }
+  MDiagArray2 (const MDiagArray2<T>& a) : DiagArray2<T> (a) { }
+
+  ~MDiagArray2 (void) { }
+
+  MDiagArray2<T>& operator = (const MDiagArray2<T>& a)
+    {
+      DiagArray2<T>::operator = (a);
+      return *this;
+    }
+
+  operator MArray2<T> () const
+    {
+      MArray2<T> retval (nr, nc,  T (0));
+
+      int len = nr < nc ? nr : nc;
+
+      for (int i = 0; i < len; i++)
+       retval.xelem (i, i) = xelem (i, i);
+
+      return retval;
+    }
+
+  // element by element MDiagArray2 by MDiagArray2 ops
+
+  friend MDiagArray2<T>&
+  operator += LTGT (MDiagArray2<T>& a, const MDiagArray2<T>& b);
+
+  friend MDiagArray2<T>&
+  operator -= LTGT (MDiagArray2<T>& a, const MDiagArray2<T>& b);
+
+  // element by element MDiagArray2 by scalar ops
+
+  friend MDiagArray2<T> operator * LTGT (const MDiagArray2<T>& a, const T& s);
+  friend MDiagArray2<T> operator / LTGT (const MDiagArray2<T>& a, const T& s);
+
+  // element by element scalar by MDiagArray2 ops
+
+  friend MDiagArray2<T> operator * LTGT (const T& s, const MDiagArray2<T>& a);
+
+  // element by element MDiagArray2 by MDiagArray2 ops
+
+  friend MDiagArray2<T>
+  operator + LTGT (const MDiagArray2<T>& a, const MDiagArray2<T>& b); 
+
+  friend MDiagArray2<T>
+  operator - LTGT (const MDiagArray2<T>& a, const MDiagArray2<T>& b);
+
+  friend MDiagArray2<T>
+  product LTGT (const MDiagArray2<T>& a, const MDiagArray2<T>& b);
+
+  friend MDiagArray2<T> operator - LTGT (const MDiagArray2<T>& a);
+};
+
+#undef LTGT
+
+#define INSTANTIATE_MDIAGARRAY_FRIENDS(T) \
+  template MDiagArray2<T>& operator += (MDiagArray2<T>& a, const 
MDiagArray2<T>& b); \
+  template MDiagArray2<T>& operator -= (MDiagArray2<T>& a, const 
MDiagArray2<T>& b); \
+  template MDiagArray2<T> operator * (const MDiagArray2<T>& a, const T& s); \
+  template MDiagArray2<T> operator / (const MDiagArray2<T>& a, const T& s); \
+  template MDiagArray2<T> operator * (const T& s, const MDiagArray2<T>& a); \
+  template MDiagArray2<T> operator + (const MDiagArray2<T>& a, const 
MDiagArray2<T>& b); \
+  template MDiagArray2<T> operator - (const MDiagArray2<T>& a, const 
MDiagArray2<T>& b); \
+  template MDiagArray2<T> product (const MDiagArray2<T>& a, const 
MDiagArray2<T>& b); \
+  template MDiagArray2<T> operator - (const MDiagArray2<T>& a);
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
diff --git a/test/etags/cp-src/Pctest.h b/test/etags/cp-src/Pctest.h
new file mode 100644
index 0000000..52d68aa
--- /dev/null
+++ b/test/etags/cp-src/Pctest.h
@@ -0,0 +1,99 @@
+// -*- c++ -*-
+//
+// $Id: Pctest.h,v 1.14 2000/01/19 17:14:42 bmah Exp $
+//
+// Pctest.h
+// Bruce A. Mah <address@hidden>
+//
+// This work was first produced by an employee of Sandia National
+// Laboratories under a contract with the U.S. Department of Energy.
+// Sandia National Laboratories dedicates whatever right, title or
+// interest it may have in this software to the public. Although no
+// license from Sandia is needed to copy and use this software,
+// copying and using the software might infringe the rights of
+// others. This software is provided as-is. SANDIA DISCLAIMS ANY
+// WARRANTY OF ANY KIND, EXPRESS OR IMPLIED.
+//
+// Header for virtual base class of tests.  A particular protocol (e.g.
+// IPv4, IPv6) will override the methods of this base class
+// with protocol-specific implementations.
+//
+//
+
+#ifndef PCTEST_H
+#define PCTEST_H
+
+#include <stdio.h>
+
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <string.h>
+#endif /* STDC_HEADERS */
+
+#if HAVE_UNISTD_H
+#include <sys/types.h>
+#endif /* HAVE_UNISTD_H */
+
+#include <sys/socket.h>
+#include <sys/time.h>
+
+#include "pc.h"
+// #include "TestRecord.h"
+class TestRecord;
+
+// Action codes.  ICMPv4 and ICMPv6 have different values for their type
+// and code fields.  The Pctest abstracts these differences.
+typedef enum {
+    PctestActionValid,         // store valid measurement (e.g. ICMP
+                               // time exceeded)
+    PctestActionValidLasthop,  // store valid measurement, this is last hop
+                               // (e.g. ICMP port unreachable)
+    PctestActionFiltered,      // packets filtered, give up (e.g.
+                               // ICMP prohibited)
+    PctestActionAbort          // huh?  we haven't a clue
+} PctestActionType;
+
+class Pctest {
+
+  public:
+    Pctest() {
+       initialized = 0;
+       TimeSyscall(syscallTime);
+
+       IF_DEBUG(3, fprintf(stderr, "syscallTime.tv_usec = %ld\n", 
syscallTime.tv_usec));
+    }
+    virtual ~Pctest() { };
+
+    // Get gettimeofday() system call overhead.
+    virtual void TimeSyscall(struct timeval &diff);
+
+    // Get random payload buffer
+    virtual char *GeneratePayload(int size);
+
+    // Set target host for our tests (resolve if necessary)
+    virtual int SetTargetName(char *target) = 0;
+
+    // Get target host name and address
+    virtual char *GetTargetName() { return targetName; };
+    virtual char *GetPrintableAddress() = 0;
+    virtual char *GetPrintableAddress(void *a) = 0;
+    virtual char *GetName(void *a) = 0;
+    virtual char *GetAddressFamily() = 0;
+
+    // Perform a test and return statistics
+    virtual int Test(TestRecord &tr) = 0;
+    virtual PctestActionType GetAction(TestRecord &tr) = 0;
+    virtual PctestActionType GetAction(TestRecord *tr) {
+       return this->GetAction(*tr);
+    };
+
+    virtual int GetMinSize() = 0;
+
+  protected:
+    int initialized;           // initialization flag
+    char *targetName;          // target hostname
+    struct timeval syscallTime;        // estimated overhead for gettimeofday()
+
+};
+
+#endif /* PCTEST_H */
diff --git a/test/etags/cp-src/Range.h b/test/etags/cp-src/Range.h
new file mode 100644
index 0000000..b8cbab4
--- /dev/null
+++ b/test/etags/cp-src/Range.h
@@ -0,0 +1,96 @@
+/*
+
+Copyright (C) 1996 John W. Eaton
+
+This file is part of Octave.
+
+Octave is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+Octave is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Octave; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#if !defined (octave_Range_h)
+#define octave_Range_h 1
+
+#if defined (__GNUG__)
+#pragma interface
+#endif
+
+class istream;
+class ostream;
+class Matrix;
+
+class
+Range
+{
+ public:
+
+  Range (void)
+    : rng_base (-1), rng_limit (-1), rng_inc (-1), rng_nelem (-1) { }
+
+  Range (const Range& r)
+    : rng_base (r.rng_base), rng_limit (r.rng_limit), rng_inc (r.rng_inc),
+      rng_nelem (r.rng_nelem) { }
+
+  Range (double b, double l)
+    : rng_base (b), rng_limit (l), rng_inc (1),
+      rng_nelem (nelem_internal ()) { }
+
+  Range (double b, double l, double i)
+    : rng_base (b), rng_limit (l), rng_inc (i),
+      rng_nelem (nelem_internal ()) { }
+
+  double base (void) const { return rng_base;  }
+  double limit (void) const { return rng_limit; }
+  double inc (void) const { return rng_inc;   }
+  int nelem (void) const { return rng_nelem; }
+
+  bool all_elements_are_ints (void) const;
+
+  Matrix matrix_value (void) const;
+
+  double min (void) const;
+  double max (void) const;
+
+  void sort (void);
+
+  void set_base (double b) { rng_base = b;  }
+  void set_limit (double l) { rng_limit = l; }
+  void set_inc (double i) { rng_inc = i;   }
+
+  friend ostream& operator << (ostream& os, const Range& r);
+  friend istream& operator >> (istream& is, Range& r);
+
+  void print_range (void);
+
+ private:
+
+  double rng_base;
+  double rng_limit;
+  double rng_inc;
+
+  int rng_nelem;
+
+  int nelem_internal (void) const;
+};
+
+extern Range operator - (const Range& r);
+
+#endif
+
+/*
+;;; Local Variables: ***
+;;; mode: C++ ***
+;;; End: ***
+*/
diff --git a/test/etags/cp-src/abstract.C b/test/etags/cp-src/abstract.C
new file mode 100644
index 0000000..82aded4
--- /dev/null
+++ b/test/etags/cp-src/abstract.C
@@ -0,0 +1,4840 @@
+/*****************************************************************************
+
+  Copyright (c) 1992 Consorzio Pisa Ricerche.
+  Authors: Caneve Maurizio, Salvatori Elena
+
+  This software was produced under the ESPRIT/LOTOSPHERE
+  project. All rights reserved.
+
+*****************************************************************************/
+
+/*                                                             */
+/*     @(#)abstract.c  4.46  2/1/93                            */
+/*                                                             */
+
+#include <defs.h>
+#include <adatat.h>
+#include <abstract.h>
+#include <editor.h>
+#include <graphics.h>
+#include <sheet.h>
+#include <folder.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#ifdef DEBUG
+ #include <stream.h>
+#endif
+
+/*                                                             */
+/*     implementation of class Half_Container                  */
+/*                                                             */
+
+Half_Container::Half_Container(ID_List *g_l)
+{
+gate_list = g_l;
+type = HALFCONTAINER;
+selectable = FALSE;
+visible = g_l->GetVisible();
+
+Set_Unparser(new Gl_Half_Container(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Half_Container::SetPosition(Coord xx, Coord yy)
+{
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "HalfContainer" << x << " " << y << "\n";
+ cout << "HalfContainer" << h << " " << w << "\n";
+#endif
+if(father->GetTextual())
+   gate_list->SetPosition(x,y);
+ else gate_list->SetPosition(x + ROUND_CORNER,y - ROUND_CORNER);
+}
+
+void Half_Container::SetDimensions(void)
+{
+gate_list->SetDimensions();
+
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     
+     if(father->GetTextual())
+       {
+       h = Tree_Node::inUseFont()->Height();
+       w = gate_list->Get_W(); 
+       }
+      else {
+           h = gate_list->Get_H() + ROUND_CORNER + VBORDER;
+           w = gate_list->Get_W() + 2 * ROUND_CORNER;
+           }
+     }
+aligline = round(h/2.0);
+}
+
+void Half_Container::SetFather(Tree_Node *f)
+{
+father = f;
+gate_list->SetFather(this);
+}
+
+void Half_Container::SetCollapsed(char t)
+{
+collapsed = t;
+gate_list->SetCollapsed(t);
+}
+
+
+/*                                                             */
+/*     implementation of class Specification methods           */
+/*                                                             */
+
+Specification::Specification(Comment_List *c_l, ID_Place *id, ID_List *g_i_l, 
+                            Id_Decl_List *i_d_l, Comment_List *c_l1, 
Definition *d,
+                             Tree_Node *f, Data_List *data_l)
+{
+Gl_Sheet *sh;
+type = SPECIFICATION;
+selectable = FALSE;
+com_list = c_l;
+com_list1 = c_l1;
+ident = id;
+gate_list = g_i_l;
+id_decl_list = i_d_l;
+def = d;
+func = f;
+dt_list = data_l; 
+Set_Unparser(new Gl_Specification(this));
+sh = (glow->Get_Folder())->Current();
+sh->Add(Get_Unparser());
+sh->SetRoot(this);
+}
+
+void Specification::SetPosition(Coord xx, Coord yy)
+{
+Coord x1,y1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Specification" << x << " " << y << "\n";
+ cout << "Specification" << h << " " << w << "\n";
+#endif
+com_list->SetPosition(x,y);
+
+y1 = (com_list->Get_H() == 0)?y :y - com_list->Get_H() - SEPARATOR;
+com_list1->SetPosition(x,y1);
+
+x1 = x + round((w - gate_list->Get_W()) / 2.0);
+y1 = (com_list1->Get_H() == 0)?y1 :y1 - com_list1->Get_H() - SEPARATOR;
+gate_list->SetPosition(x1,y1);
+
+y = y1 - gate_list->Get_H();
+
+x1 = x + round((w - ident->Get_W()) / 2.0);
+y1 = y - VBORDER;
+ident->SetPosition(x1,y1);
+yl1 = y1 - ident->Get_H() - VBORDER;
+
+x1 = x + round((w - id_decl_list->Get_W()) / 2.0);
+y1 = yl1 - VBORDER;
+id_decl_list->SetPosition(x1,y1);
+
+yl2 = y1 - id_decl_list->Get_H() - VBORDER;
+
+y1 = (id_decl_list->Get_H() == 0)? yl2 + 2 * VBORDER - BORDER
+                                  : yl2 - BORDER;
+x1 = x + round((w - def->Get_W()) / 2.0);
+def->SetPosition(x1,y1);
+
+if(func->GetType() == EXIT && func->Get_W() != 0)
+   yl3 = y1 - def->Get_H() - BORDER;
+ else yl3 = 0;
+x1 = x + round((w - func->Get_W()) / 2.0);
+if(func->GetType() == EXIT)
+  ((Exit *)func)->SetPosition(x1,y - h + func->Get_H(),x + w,y - h + 
func->Get_H());
+ else func->SetPosition(x + w, y - h + func->Get_H());
+}
+
+void Specification::SetDimensions(void)
+{
+com_list->SetDimensions();
+com_list1->SetDimensions();
+ident->SetDimensions();
+gate_list->SetDimensions();
+id_decl_list->SetDimensions();
+func->SetDimensions();
+def->SetDimensions();
+w = Max4(gate_list->Get_W(),ident->Get_W(),id_decl_list->Get_W(),def->Get_W());
+w = Max(w, func->Get_W());
+w += 2 * BORDER;
+
+h = ident->Get_H()+id_decl_list->Get_H()+def->Get_H();
+h = (func->GetType() == EXIT && func->Get_W() != 0)? h + func->Get_H(): h;
+h = (id_decl_list->Get_H() == 0)? h + 2 * VBORDER + 2 * BORDER
+                          : h + 4 * VBORDER + 2 * BORDER;
+MaxX = com_list->Get_W();
+MaxX = Max(MaxX, w + EXIT_S);
+MaxY = h + gate_list->Get_H(); /* we have also to take in account the gate 
list      */
+if(com_list->Get_H() != 0)
+  MaxY = MaxY + com_list->Get_H() + SEPARATOR;          /* there are also some 
comments         */
+}
+
+void Specification::SetFather(Tree_Node *f)
+{
+father = f;
+com_list->SetFather(this);
+com_list1->SetFather(this);
+ident->SetFather(this);
+gate_list->SetFather(this);
+id_decl_list->SetFather(this);
+def->SetFather(this);
+func->SetFather(this);
+if(dt_list != NULL)
+  dt_list->SetFather(this);
+}
+
+void Specification::SetPath(int& np, int& nd)
+{
+char buff[PATH_LENGHT];
+np = np + 1;
+sprintf(buff,"of %s",ident->GetIdent());
+def->SetPath(buff, 1, np, nd);
+if(dt_list != NULL)
+  dt_list->SetPath(buff, 0, np, nd);
+}
+
+Coord Specification::GetMaxX()
+{ return(MaxX);}
+
+Coord Specification::GetMaxY()
+{ return(MaxY);}
+
+/*                                                             */
+/*     implementation of class Process methods                 */
+/*                                                             */
+
+Process::Process(Comment_List *c_l, ID_Place *id, ID_List *g_i_l, Id_Decl_List 
*i_d_l,
+                            Definition *d, Tree_Node *f)
+{
+Gl_Sheet *sh;
+type = PROCESS;
+selectable = FALSE;
+nesting = 0;
+com_list = c_l;
+ident = id;
+gate_list = g_i_l;
+id_decl_list = i_d_l;
+def = d;
+func = f;
+Set_Unparser(new Gl_Process(this));
+
+sh = (glow->Get_Folder())->Current();
+sh->Add(Get_Unparser());
+sh->SetRoot(this);
+}
+
+void Process::SetPosition(Coord xx, Coord yy)
+{
+Coord x1,y1;
+x = xx;
+ypath = yy;
+y = yy - SEPARATOR - ident->Get_H();                   /* it is equal to the 
height of the path */
+#ifdef DEBUG
+ cout << "Process" << x << " " << y << "\n";
+ cout << "Process" << h << " " << w << "\n";
+#endif
+
+com_list->SetPosition(x,y);
+
+x1 = x + round((w - gate_list->Get_W()) / 2.0);
+y1 = (com_list->Get_H() == 0)?y :y - com_list->Get_H() - SEPARATOR;
+gate_list->SetPosition(x1,y1);
+
+y = y1 - gate_list->Get_H();
+
+x1 = x + round((w - ident->Get_W()) / 2.0);
+y1 = y - VBORDER;
+ident->SetPosition(x1,y1);
+yl1 = y1 - ident->Get_H() - VBORDER;
+
+x1 = x + round((w - id_decl_list->Get_W()) / 2.0);
+y1 = yl1 - VBORDER;
+id_decl_list->SetPosition(x1,y1);
+
+if(id_decl_list->Get_H() != 0)
+  {
+  yl2 = y1 - id_decl_list->Get_H() - VBORDER;
+  y1 = yl2 - BORDER;
+  }
+ else {
+      yl2 = 0;
+      y1 = yl1 - BORDER;
+      }
+x1 = x + round((w - def->Get_W()) / 2.0);
+def->SetPosition(x1,y1);
+
+if(func->GetType() == EXIT && func->Get_W() != 0)
+   yl3 = y1 - def->Get_H() - BORDER;
+ else yl3 = 0;
+x1 = x + round((w - func->Get_W()) / 2.0);
+if(func->GetType() == EXIT)
+  ((Exit *)func)->SetPosition(x1,y - h + func->Get_H(),x + w,y - h + 
func->Get_H());
+ else func->SetPosition(x + w, y - h + func->Get_H());
+}
+
+void Process::SetDimensions(void)
+{
+com_list->SetDimensions();
+ident->SetDimensions();
+gate_list->SetDimensions();
+id_decl_list->SetDimensions();
+func->SetDimensions();
+def->SetDimensions();
+w = Max4(gate_list->Get_W(),ident->Get_W(),id_decl_list->Get_W(),def->Get_W());
+w = Max(w, func->Get_W());
+w += 2 * BORDER;
+
+h = ident->Get_H()+id_decl_list->Get_H()+def->Get_H();
+h = (func->GetType() == EXIT && func->Get_W() != 0)? h + func->Get_H(): h;
+h = (id_decl_list->Get_H() == 0)? h + 2 * VBORDER + 2 * BORDER
+                          : h + 4 * VBORDER + 2 * BORDER;
+MaxX = Max(com_list->Get_W(),Tree_Node::inUseFont()->Width(((Proc_List 
*)GetFather())->GetPath()));
+MaxX = Max(MaxX,w + EXIT_S);
+MaxY = h + SEPARATOR + ident->Get_H() + gate_list->Get_H(); /* we have also to 
take in account         */
+                                                            /* the path and 
the gate list      */
+if(com_list->Get_H() != 0)
+  MaxY = MaxY + com_list->Get_H() + SEPARATOR;         /* there are also some 
comments         */
+}
+
+void Process::SetFather(Tree_Node *f)
+{
+father = f;
+com_list->SetFather(this);
+ident->SetFather(this);
+gate_list->SetFather(this);
+id_decl_list->SetFather(this);
+func->SetFather(this);
+def->SetFather(this);
+}
+
+void Process::SetPath(char *p, char n, int& np, int& nd)
+{
+char buff[PATH_LENGHT];
+nesting = n;
+np = np + 1;
+sprintf(buff,"of %s %s",ident->GetIdent(), p);
+def->SetPath(buff, nesting + 1, np, nd);
+}
+
+Coord Process::GetMaxX()
+{return(MaxX);}
+
+Coord Process::GetMaxY()
+{return(MaxY);}
+
+/*                                                             */
+/*     implementation of class Choice methods                  */
+/*                                                             */
+
+
+Choice::Choice(Tree_Node *b1, Tree_Node *b2)
+{
+type = CHOICE;
+alignement = glow->GetAligs(CHOICE);
+bex1 = b1;
+bex2 = b2;
+
+Set_Unparser(new Gl_Choice(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Choice::SetPosition(Coord xx, Coord yy)
+{
+Coord x1,y1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Choice" << x << " " << y << "\n";
+ cout << "Choice" << h << " " << w << "\n";
+#endif
+if(textual)
+   {                   
+   SetTerminalPos();
+   x1 = xl + Tree_Node::inUseFont()->Width("[] ");
+   bex1->SetPosition(x1,y - border);
+   bex2->SetPosition(x1, yl);
+   }
+ else {                /* graphical            */
+      if(alignement == HOR)
+         {
+         if(!havebox)
+            x1 = x;
+          else x1 = x + BORDER;
+         y1 = round(y - (h - bex1->Get_H())/2.0);
+         bex1->SetPosition(x1,y1);
+         xl = x1 + bex1->Get_W() + BORDER;
+         x1 = xl + BORDER;
+         y1 = round(y - (h - bex2->Get_H())/2.0);
+         bex2->SetPosition(x1,y1);
+         }
+        else {
+             if(!havebox)
+               y1 = y;
+              else y1 = y - BORDER;
+             x1 = round(x + (w - bex1->Get_W())/2.0);
+             bex1->SetPosition(x1,y1);
+             xl = y1 - bex1->Get_H() - BORDER;
+             y1 = xl - BORDER;
+             x1 = round(x + (w - bex2->Get_W())/2.0);
+             bex2->SetPosition(x1,y1);
+             }
+       }
+delta = (!havebox && (father->GetType() != CHOICE))?
+           (father->GetType() == DEFINITION)?
+               round((father->GetFather()->Get_W() - w)/2.0)
+            : round((father->Get_W() - w)/2.0)
+         : BORDER;
+}
+
+void Choice::SetDimensions(void)
+{
+bex1->SetDimensions();
+bex2->SetDimensions();
+border = 0;
+
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:   if(textual)
+                          {
+                          w = Tree_Node::inUseFont()->Width("<Bex>");
+                          h = Tree_Node::inUseFont()->Height();
+                          if(!(father->GetTextual()) && (father->GetType() <= 
PARALLEL ))
+                            {border = VBORDER; w += 2 * VBORDER; h += 2 * 
VBORDER; }
+                          }
+                        else {
+                              w = 
round((Tree_Node::inUseFont()->Width("Bex"))*20.0/9.0);
+                             h = 
round((Tree_Node::inUseFont()->Width("Bex"))*14.0/9.0);
+                             }
+                       break; 
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED: 
+        if(textual)
+           {
+           h = Get_Textual_H(); w = Get_Textual_W();
+           if(!(father->GetTextual()) && (father->GetType() <= PARALLEL))
+              {border = VBORDER; w += 2 * VBORDER; h += 2 * VBORDER; }
+           }
+          else {       /* graphical            */
+              if(alignement == HOR)
+                  {
+                 w = bex1->Get_W() + bex2->Get_W() + 2 * BORDER;
+                 h = Max(bex1->Get_H(), bex2->Get_H());
+                 }
+               else {  
+                    h = bex1->Get_H() + bex2->Get_H() + 2 * BORDER;
+                    w = Max(bex1->Get_W(), bex2->Get_W());
+                    }
+              if(havebox)
+                {w += 2 * BORDER; h += 2 * BORDER;}
+                else {
+                     if((bex1->GetType() == CHOICE) && (bex1->Collapsed() != 
COLLAPSED_VIS))
+                       {
+                      if(alignement == HOR)
+                         ((Choice *)bex1)->ChangeH(h);
+                        else ((Choice *)bex1)->ChangeW(w);
+                      }
+                     if((bex2->GetType() == CHOICE) && (bex2->Collapsed() != 
COLLAPSED_VIS))
+                       {
+                      if(alignement == HOR)
+                         ((Choice *)bex2)->ChangeH(h);
+                        else ((Choice *)bex2)->ChangeW(w);
+                      }
+                     }
+               }
+        break;
+  }
+aligline = round(h/2.0);
+}
+
+void Choice::ChangeH(int nh)
+{
+int bh;                /* it will be the forced height for the second choice 
son       */
+if(!(GetTextual()))
+  {
+  h = nh;
+  bh = h - ((Choice *)bex1)->Get_H();
+  if(alignement == HOR)
+    {
+    if((bex1->GetType() == CHOICE) && (bex1->Collapsed() != COLLAPSED_VIS))
+       ((Choice *)bex1)->ChangeH(h);
+    if((bex2->GetType() == CHOICE) && (bex2->Collapsed() != COLLAPSED_VIS))
+       ((Choice *)bex2)->ChangeH(h);
+    }
+   else {
+        if((bex1->GetType() == CHOICE) && (bex1->Collapsed() != COLLAPSED_VIS))
+           ((Choice *)bex1)->ChangeW(w);
+         else  bh = bh - 2 * BORDER;
+        if((bex2->GetType() == CHOICE) && (bex2->Collapsed() != COLLAPSED_VIS))
+           {
+           ((Choice *)bex2)->ChangeW(w);
+           ((Choice *)bex2)->ChangeH(bh); /* we have to remember the forced    
*/
+                                         /* height, even if the alignwement is 
*/
+                                         /* now vertical                       
        */
+           }
+        }
+  }
+}
+
+void Choice::ChangeW(int nw)
+{
+int bw;
+if(!(GetTextual()))
+  {
+  w = nw;
+  bw =  w - ((Choice *)bex1)->Get_W();
+  if(alignement != HOR)
+     {
+     if((bex1->GetType() == CHOICE) && (bex1->Collapsed() != COLLAPSED_VIS))
+        ((Choice *)bex1)->ChangeW(w);
+     if((bex2->GetType() == CHOICE) && (bex2->Collapsed() != COLLAPSED_VIS))
+        ((Choice *)bex2)->ChangeW(w);
+     }
+   else {
+        if((bex1->GetType() == CHOICE) && (bex1->Collapsed() != COLLAPSED_VIS))
+           ((Choice *)bex1)->ChangeH(h);
+         else bw = bw - 2 * BORDER;
+        if((bex2->GetType() == CHOICE) && (bex2->Collapsed() != COLLAPSED_VIS))
+           {
+           ((Choice *)bex2)->ChangeH(h);
+           ((Choice *)bex2)->ChangeW(bw);
+           }
+        }
+  }
+}
+
+void Choice::SetFather(Tree_Node *f)
+{
+char ft;
+ft = (f->GetType() == PARALLEL)? ((Parallel *)f)->GetOperType(): f->GetType();
+havebox = HaveBox(CHOICE,ft);
+father = f;
+bex1->SetFather(this);
+bex2->SetFather(this);
+}
+
+void Choice::SetTextual(char t, char s)
+{
+textual = t;
+selectable = (!t | s);
+bex1->SetTextual(t);
+bex2->SetTextual(t);
+}
+
+void Choice::SetCollapsed(char t)
+{
+collapsed = t;
+if(t)
+  t = COLLAPSED_INV;
+bex1->SetCollapsed(t);
+bex2->SetCollapsed(t);
+}
+
+int Choice::Get_Textual_H()
+{
+if((father->GetType() == CHOICE) && father->GetTextual())
+   return(bex1->Get_H() + bex2->Get_H() + VBORDER);
+ else return(bex1->Get_H() + bex2->Get_H() + 2 * VBORDER
+                + Tree_Node::inUseFont()->Height());
+}
+
+int Choice::Get_Textual_W()
+{
+int b;
+b = Max(bex1->Get_W(), bex2->Get_W());
+if((father->GetType() == CHOICE) && father->GetTextual())
+   return(b);
+ else return(Tree_Node::inUseFont()->Width("[] ") + b);
+}
+
+void Choice::SetTerminalPos()
+{
+
+xl=yl=yl1=0;
+if((father->GetType() == CHOICE) &&
+    father->GetTextual())      /* xl, yl is the position of [] */
+       {
+       xl = x - Tree_Node::inUseFont()->Width("[] ") + border;
+       yl = y - bex1->Get_H() - VBORDER - border;
+       }
+   else {                              /* x,y is the position of ( */
+       xl = x + border;
+       yl = y - bex1->Get_H() - VBORDER - border;
+       yl1 = yl - bex2->Get_H() - VBORDER;
+       }
+}
+
+
+/*                                                             */
+/*     implementation of class stop methods                    */
+/*                                                             */
+
+Stop::Stop()
+{
+type = STOP;
+Set_Unparser(new Gl_Stop(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Stop::SetPosition(Coord xx, Coord yy)
+{
+x = xx;
+y = yy;
+#ifdef DEBUG
+cout << "Stop" << x << " " << y << "\n";
+cout << "Stop" << h << " " << w << "\n";
+#endif
+}
+
+void Stop::SetDimensions(void)
+{
+border = 0;
+
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:   if(textual)
+                          {
+                          w = Tree_Node::inUseFont()->Width("<Bex>");
+                          h = Tree_Node::inUseFont()->Height();
+                          if(!(father->GetTextual()) && (father->GetType() <= 
PARALLEL))
+                             {border = VBORDER; w += 2 * VBORDER; h += 2 * 
VBORDER; }
+                          }
+                        else {
+                             w = 
round((Tree_Node::inUseFont()->Width("Bex"))*20.0/9.0);
+                             h = 
round((Tree_Node::inUseFont()->Width("Bex"))*14.0/9.0);
+                             }
+                       break; 
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     
+      if(textual)
+       {
+       w = Tree_Node::inUseFont()->Width("stop");
+       h = Tree_Node::inUseFont()->Height();
+       if(!(father->GetTextual()) && (father->GetType() <= PARALLEL))
+         {border = VBORDER; w += 2 * VBORDER; h += 2 * VBORDER; }
+       }
+       else {
+           w = 2 * STOP_R;
+           h = 2 * STOP_R;
+           if(havebox)
+             {w += 2 * BORDER; h += 2 * BORDER;}
+           }
+       break;
+ }
+aligline = round(h/2.0);
+}
+
+void Stop::SetFather(Tree_Node *f)
+{
+char ft;
+ft = (f->GetType() == PARALLEL)? ((Parallel *)f)->GetOperType(): f->GetType();
+havebox = HaveBox(STOP,ft);
+father = f;
+}
+
+void Stop::SetTextual(char t, char s)
+{ textual = t; selectable = (!t | s); }
+
+void Stop::SetCollapsed(char t)
+{
+collapsed = t;
+if(t)
+  t = COLLAPSED_INV;
+}
+
+
+/*                                                             */
+/*     implementation of class Exit methods                    */
+/*                                                             */
+
+Exit::Exit(ID_List *sl)
+{
+type = EXIT;
+selectable = FALSE;
+sort_list = sl;
+Set_Unparser(new Gl_Exit(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Exit::SetPosition(Coord x1, Coord y1, Coord xx, Coord yy)
+{
+x = xx;
+y = yy;
+sort_list->SetPosition(x1,y1 - VBORDER);
+#ifdef DEBUG
+ cout << "Exit" << x << " " << y << "\n";
+ cout << "Exit" << h << " " << w << "\n";
+#endif
+}
+
+void Exit::SetDimensions(void)
+{
+sort_list->SetDimensions();
+w = sort_list->Get_W();
+h = (sort_list->Get_H() == 0)? EXIT_S: sort_list->Get_H() + 2 * VBORDER;
+aligline = round(h/2.0);
+}
+
+void Exit::SetFather(Tree_Node *f)
+{father = f;
+}
+
+/*                                                             */
+/*     implementation of class Exit_Bex methods                */
+/*                                                             */
+
+Exit_Bex::Exit_Bex(Exit_Entry_List *l)
+{
+type = EXIT;
+alignement = glow->GetAligs(EXIT);
+entry_list = l;
+
+Set_Unparser(new Gl_Exit_Bex(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Exit_Bex::SetPosition(Coord xx, Coord yy)
+{
+Coord x1, y1;
+x = xx;
+y = yy;
+if(textual)
+   {
+   x1 = x + border;
+   y1 = y - border;
+   if(entry_list->GetVisible())
+      {
+      Xopen = x1 + Tree_Node::inUseFont()->Width("exit");
+      entry_list->SetPosition(Xopen + Tree_Node::inUseFont()->Width(" (") ,y1);
+      Xclose = Xopen + Tree_Node::inUseFont()->Width(" (") + 
entry_list->Get_W();
+      }
+    else entry_list->SetPosition(x1 + Tree_Node::inUseFont()->Width("exit") 
,y);
+   }
+ else if(havebox)
+        entry_list->SetPosition(x + 2 * BORDER,y - VBORDER - BORDER);
+       else entry_list->SetPosition(x + BORDER,y - VBORDER);
+
+#ifdef DEBUG
+ cout << "Exit_Bex" << x << " " << y << "\n";
+ cout << "Exit_Bex" << h << " " << w << "\n";
+#endif
+}
+
+void Exit_Bex::SetDimensions(void)
+{
+entry_list->SetDimensions();
+border = 0;
+
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:   if(textual)
+                          {
+                          w = Tree_Node::inUseFont()->Width("<Bex>");
+                          h = Tree_Node::inUseFont()->Height();
+                          if(!(father->GetTextual()) && (father->GetType() <= 
PARALLEL))
+                             {border = VBORDER; w += 2 * VBORDER; h += 2 * 
VBORDER; }
+                          }
+                        else {
+                             w = 
round((Tree_Node::inUseFont()->Width("Bex"))*20.0/9.0);
+                             h = 
round((Tree_Node::inUseFont()->Width("Bex"))*14.0/9.0);
+                             }
+                       aligline = round(h/2.0);
+                       break; 
+ case COLLAPSED_INV:   w = 0; h = 0; aligline = 0;
+                       break;
+ case NOCOLLAPSED:
+         if(textual)
+            {
+            w = (entry_list->Get_W() == 0)? 
Tree_Node::inUseFont()->Width("exit")
+                    : entry_list->Get_W() + 
Tree_Node::inUseFont()->Width("exit")
+                     + Tree_Node::inUseFont()->Width(" (") + 
Tree_Node::inUseFont()->Width(")");
+            h = Tree_Node::inUseFont()->Height();
+            if(!(father->GetTextual()) && (father->GetType() <= PARALLEL))
+               {border = VBORDER; w += 2 * VBORDER; h += 2 * VBORDER; }
+            aligline = round(h/2.0);
+            }
+          else {
+               if(alignement == HOR)
+                   {
+                  w = (entry_list->Get_W() == 0)? EXIT_S
+                      : entry_list->Get_W() + 2 * BORDER + EXIT_S;
+                  h = (entry_list->Get_H() == 0)? EXIT_S
+                      : Max(entry_list->Get_H() + 2 * VBORDER,EXIT_S);
+                  aligline = round(h/2.0);
+                  if(havebox)
+                    {w += 2 * BORDER; h += 2 * BORDER; aligline += BORDER;}
+                   }
+                else {
+                     w = (entry_list->Get_W() == 0)? EXIT_S
+                         : Max(entry_list->Get_W() + 2 * BORDER,EXIT_S);
+                     h = (entry_list->Get_H() == 0)? EXIT_S
+                         : entry_list->Get_H() + 2 * VBORDER + EXIT_S;
+                     aligline = (entry_list->Get_H() == 0)? round(EXIT_S/2.0)
+                                : round((h - EXIT_S)/2.0);
+                     if(havebox)
+                        {w += 2 * BORDER; h += 2 * BORDER; aligline += BORDER;}
+                      }
+               }
+ }
+}
+
+void Exit_Bex::SetFather(Tree_Node *f)
+{
+char ft;
+ft = (f->GetType() == PARALLEL)? ((Parallel *)f)->GetOperType(): f->GetType();
+havebox = HaveBox(EXIT,ft);
+father = f; 
+entry_list->SetFather(this);
+}
+
+void Exit_Bex::SetTextual(char t, char s)
+{
+textual = t; 
+selectable = (!t | s);
+entry_list->SetTextual(t);
+}
+
+void Exit_Bex::SetCollapsed(char t)
+{
+collapsed = t;
+if(t)
+  t = COLLAPSED_INV;
+entry_list->SetCollapsed(t);
+}
+
+/*                                                             */
+/*     implementation of class NoExit methods                  */
+/*                                                             */
+
+NoExit::NoExit()
+{
+type = NOEXIT;
+selectable = FALSE;
+
+Set_Unparser(new Gl_NoExit(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void NoExit::SetPosition(Coord xx, Coord yy)
+{
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "NoExit" << x << " " << y << "\n";
+ cout << "NoExit" << h << " " << w << "\n";
+#endif
+}
+
+void NoExit::SetDimensions(void)
+{
+w = NO_EXIT_S;
+h = NO_EXIT_S;
+aligline = round(h/2.0);
+}
+
+void NoExit::SetFather(Tree_Node *f)
+{father = f;
+}
+
+
+/*                                                             */
+/*     implementation of class ID_Place methods                */
+/*                                                             */
+
+ID_Place::ID_Place()
+{
+type = IDPLACE;
+visible = FALSE;
+textual = TRUE;
+RBubble = NORMAL;
+selectable = FALSE;
+str = new char[2];
+str[0] = ' '; str[1] = '\0';
+
+Set_Unparser(new Gl_Identifier(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void ID_Place::SetIdent(char *identifier)
+{
+int i;
+visible = TRUE;
+
+delete str;
+str = new char[strlen(identifier) + 1];
+for(i=0; i<= strlen(identifier); i++)
+  *(str+i) = *(identifier+i);
+}
+
+void ID_Place::SetPosition(Coord xx, Coord yy)
+{
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "IDPlace" << x << " " << y << "\n";
+ cout << "IDPlace" << h << " " << w << "\n";
+ cout << "IDPlace" << visible << " " << collapsed << "\n";
+#endif
+}
+
+void ID_Place::SetDimensions(void)
+{
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED: 
+               switch(RBubble)
+                {
+                case NORMAL:   w = Tree_Node::inUseFont()->Width(str);
+                               h = Tree_Node::inUseFont()->Height();
+                               break;
+                case ROUND:    w = Max(Tree_Node::inUseFont()->Width(str) + 
+                                        2 * ROUND_CORNER, SMALL_DIL);
+                               h = Tree_Node::inUseFont()->Height() + 
+                                         SYNCR_L + SMALL_PEN;
+                               break;
+                case ELLIPSE:
+                case F_ELLIPSE: w = Tree_Node::inUseFont()->Width(str) + 2 * 
ROUND_CORNER;
+                                h = Tree_Node::inUseFont()->Height() + 2 * 
ROUND_CORNER;
+                                break;
+                case D_ELLIPSE: w = Tree_Node::inUseFont()->Width(str) + 2 * 
ROUND_CORNER;
+                                h = Tree_Node::inUseFont()->Height() + 2 * 
ROUND_CORNER 
+                                        + 2 *MAX_VIEWS;
+                                break; 
+               }
+ }
+aligline = round(h/2.0);
+}
+
+void ID_Place::SetFather(Tree_Node *f)
+{ father = f;
+}
+
+ID_Place::~ID_Place()
+{ delete str; }
+
+void ID_Place::SetVisible(char v)
+{ 
+if (strcmp(str, " ") != 0)
+       visible = v;
+}
+
+void ID_Place::ClearID(void)
+{
+visible = FALSE;
+delete str;
+str = new char[2];
+str[0] = ' '; str[1] = '\0';
+}
+
+/*                                                             */
+/*     implementation of class ID_List methods                 */
+/*                                                             */
+
+ID_List::ID_List(ID_Place *el, ID_List *nxt)
+{
+type = IDLIST;
+elem = el;
+next = nxt;
+alignement = HOR;
+textual = TRUE;
+selectable = FALSE;
+visible = elem->GetVisible();
+
+Set_Unparser(new Gl_Id_List(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void ID_List::SetPosition(Coord xx, Coord yy)
+{
+Coord x1,y1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "IDList" << x << " " << y << "\n";
+ cout << "IDList" << h << " " << w << "\n";
+ cout << "IDList" << visible << " " << collapsed << "\n";
+#endif
+if (elem != NULL)
+ {
+ y1 = y;
+ x1 = (alignement == HOR) ? x : x - round(elem->Get_W()/2.0);
+                /* x is the central axis for the Vertical list*/
+ elem->SetPosition(x1,y1);
+ if (next != NULL)
+ {
+  if (elem->GetRBubble() == NORMAL)
+      {
+      x1 = (alignement == VER) ? x:  
+               x1 + elem->Get_W() + Tree_Node::inUseFont()->Width(", ");
+      y1 = (alignement == VER) ? y1 - elem->Get_H() - VBORDER : y;
+      }
+   else
+     x1 = x + elem->Get_W() + ROUND_CORNER;
+ next->SetPosition(x1,y1);
+ }
+
+}
+}
+
+void ID_List::SetDimensions(void)
+{
+elem->SetDimensions();
+if(next!=NULL)
+   next->SetDimensions();
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     if (elem->GetRBubble() == NORMAL)
+                               {
+                               if (alignement == HOR)
+                                {h = Tree_Node::inUseFont()->Height();
+                                w = (next == NULL || next->next == NULL)
+                                   ? elem->Get_W() : elem->Get_W() + 
+                                   next->Get_W() + 
Tree_Node::inUseFont()->Width(", ");
+                                }
+                               else /*op_id_list only*/
+                                {
+                                h = (next == NULL || next->next == NULL)
+                                   ? elem->Get_H() : elem->Get_H() + 
+                                   next->Get_H() + VBORDER;
+                                w = (next == NULL || next->next == NULL)
+                                   ? elem->Get_W() : Max(elem->Get_W(), 
+                                   next->Get_W());
+                                }
+                               
+                               }
+                          else {
+                                h =  elem->Get_H();    
+                                w = (next == NULL || next->next == NULL)
+                                    ? elem->Get_W() : elem->Get_W() + 
+                                    next->Get_W() + ROUND_CORNER;
+                               }       
+ }
+aligline = round(h/2.0);
+}
+
+void ID_List::SetFather(Tree_Node *f)
+{
+father = f;
+if(elem != NULL)
+  elem->SetFather(this);
+if(next != NULL)
+  next->SetFather(this);
+}
+
+void ID_List::SetCollapsed(char t)
+{
+collapsed = t;
+if(elem != NULL)
+  elem->SetCollapsed(t);
+if(next != NULL)
+  next->SetCollapsed(t);
+}
+
+void ID_List::HideMe(void)
+{
+visible = FALSE;
+if(elem != NULL)
+  elem->SetVisible(FALSE);
+if(next != NULL)
+  next->HideMe();
+}
+
+void ID_List::SetRBubble(char r)
+{
+if(elem != NULL)
+  elem->SetRBubble(r);
+if(next != NULL)
+  next->SetRBubble(r);
+}
+
+void ID_List::SetAlignement(char a)
+{
+alignement = a;
+if(elem != NULL)
+  elem->SetAlignement(a);
+if(next != NULL)
+  next->SetAlignement(a);
+}
+
+int ID_List::GetCardinality(int c)
+{
+int card;
+card = c;
+if(elem->GetVisible())
+        card ++;
+if(next != NULL)
+  card = next->GetCardinality(card);
+return(card);
+}
+
+void ID_List::SetVisible(char v)
+{
+if(elem != NULL)
+  elem->SetVisible(v);  
+visible = elem->GetVisible();       /*ID_List is set to visible only if elem 
is 
+                                       not a placeholder */
+if(next != NULL)
+  next->SetVisible(v);
+}
+
+void ID_List::BuildSigSorts(char bubble, SignatureSorts **head, char type, 
Oper *op)
+{
+if((elem != NULL) && elem->GetVisible())
+ {
+ if(*head != NULL)
+    (*head)->Append(bubble, elem, type, op);
+   else {
+       *head = new SignatureSorts(bubble, elem, NULL);
+       switch(type)
+         {
+        case '0': break;
+         case '1': (*head)->cost = op;
+                  break;
+         case '2': (*head)->op_in_l = new OperSig(op, NULL);
+                  break;
+         case '3': (*head)->op_out_l = new OperSig(op, NULL);
+        }      
+       }
+ }
+if(next != NULL)
+ next->BuildSigSorts(bubble, head, type, op);
+}
+
+void ID_List::ClearIDs(void)
+{
+visible = FALSE;
+if(elem != NULL)
+  elem->ClearID();
+if(next != NULL)
+  next->ClearIDs();
+}
+
+/*                                                             */
+/*     implementation of class Id_Decl methods                 */
+/*                                                             */
+
+Id_Decl::Id_Decl(ID_List *l, ID_Place *s)
+{
+type = IDDECL;
+textual = TRUE;
+selectable = FALSE;
+id_list = l;
+sort_id = s;
+if(l == NULL)
+  id_list = new ID_List(new ID_Place(),NULL);
+if(s == NULL)
+  sort_id = new ID_Place();
+visible = (id_list->GetVisible() && sort_id->GetVisible());
+
+Set_Unparser(new Gl_Id_Decl(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Id_Decl::SetPosition(Coord xx, Coord yy)
+{
+Coord x1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "IDDecl" << x << " " << y << "\n";
+ cout << "IDDecl" << h << " " << w << "\n";
+#endif
+if(id_list != NULL)
+ {
+ id_list->SetPosition(x,y);
+ x1 = x + id_list->Get_W() + Tree_Node::inUseFont()->Width(": ");
+ if(sort_id != NULL)
+   sort_id->SetPosition(x1,y);
+ }
+}
+
+void Id_Decl::SetDimensions(void)
+{
+id_list->SetDimensions();
+sort_id->SetDimensions();
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     h = Tree_Node::inUseFont()->Height();
+                       w = (visible)? id_list->Get_W()+sort_id->Get_W()
+                                                      
+Tree_Node::inUseFont()->Width(": ")
+                                    : 0;
+ }
+aligline = round(h/2.0);
+}
+
+void Id_Decl::SetFather(Tree_Node *f)
+{
+father = f;
+if(id_list != NULL)
+  id_list->SetFather(this);
+if(sort_id != NULL)
+  sort_id->SetFather(this);
+}
+
+void Id_Decl::SetCollapsed(char t)
+{
+collapsed = t;
+if(id_list != NULL)
+  id_list->SetCollapsed(t);
+if(sort_id != NULL)
+  sort_id->SetCollapsed(t);
+}
+
+
+/*                                                             */
+/*     implementation of class Id_Decl_List methods            */
+/*                                                             */
+
+Id_Decl_List::Id_Decl_List(Id_Decl *el, Id_Decl_List *nxt)
+{
+type = IDDECLLIST;
+textual = TRUE;
+selectable = FALSE;
+elem = el;
+next = nxt;
+visible = elem->GetVisible();
+
+Set_Unparser(new Gl_Id_Decl_List(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Id_Decl_List::SetPosition(Coord xx, Coord yy)
+{
+Coord x1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "IDDeclList" << x << " " << y << "\n";
+ cout << "IDDeclList" << h << " " << w << "\n";
+#endif
+if(elem != NULL)
+ {
+ elem->SetPosition(x,y);
+ x1 = x + elem->Get_W() + Tree_Node::inUseFont()->Width(", ");
+ if(next != NULL)
+   next->SetPosition(x1,y);
+ }
+}
+
+void Id_Decl_List::SetDimensions(void)
+{
+elem->SetDimensions();
+if(next!=NULL)
+   next->SetDimensions();
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     h = Tree_Node::inUseFont()->Height();
+                       w = (next == NULL || next->next == NULL)? elem->Get_W()
+                             : elem->Get_W() + next->Get_W() + 
Tree_Node::inUseFont()->Width(", ");
+ }
+aligline = round(h/2.0);
+}
+
+void Id_Decl_List::SetFather(Tree_Node *f)
+{
+father = f;
+if(elem != NULL)
+  elem->SetFather(this);
+if(next != NULL)
+  next->SetFather(this);
+}
+
+void Id_Decl_List::SetCollapsed(char t)
+{
+collapsed = t;
+if(elem != NULL)
+  elem->SetCollapsed(t);
+if(next != NULL)
+  next->SetCollapsed(t);
+}
+
+
+
+/*                                                             */
+/*     implementation of class Comment methods                 */
+/*                                                             */
+
+Comment::Comment()
+{
+type = COMMENT;
+textual = TRUE;
+visible = FALSE;
+selectable = FALSE;
+comm = new char[2];
+comm[0] = ' '; comm[1] = '\0';
+
+Set_Unparser(new Gl_Comment(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Comment::SetComment(char *comment)
+{
+visible = TRUE;
+delete comm;
+comm = new char[strlen(comment)+7];
+sprintf(comm, "(* %s *)",comment);
+if(glow->ShowComments())
+  {
+  w = Tree_Node::inUseFont()->Width(comm);
+  h = Tree_Node::inUseFont()->Height();
+  }
+ else {
+      w = 0;
+      h = 0;
+      };
+((glow->Get_Folder())->Current())->YesComments();
+}
+
+void Comment::SetFather(Tree_Node *f)
+{father = f;
+}
+
+void Comment::SetPosition(Coord xx, Coord yy)
+{
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Comment" << x << " " << y << "\n";
+ cout << "Comment" << h << " " << w << "\n";
+#endif
+}
+
+void Comment::SetDimensions(void)
+{
+if(visible && glow->ShowComments())
+  {
+  w = Tree_Node::inUseFont()->Width(comm);
+  h = Tree_Node::inUseFont()->Height();
+  }
+ else {
+      w = 0;
+      h = 0;
+      };
+aligline = round(h/2.0);
+}
+
+Comment::~Comment()
+{ delete comm; }
+
+/*                                                             */
+/*     implementation of class Comment_List methods            */
+/*                                                             */
+
+Comment_List::Comment_List(Comment *el, Comment_List *nxt)
+{
+type = COMMENTLIST;
+textual = TRUE;
+visible = TRUE;
+selectable = FALSE;
+elem = el;
+next = nxt;
+}
+
+void Comment_List::SetPosition(Coord xx, Coord yy)
+{
+Coord y1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "CommentList" << x << " " << y << "\n";
+ cout << "CommentList" << h << " " << w << "\n";
+#endif
+if(elem != NULL)
+ {
+ elem->SetPosition(x,y);
+ y1 = y - elem->Get_H();
+ if(next != NULL)
+   next->SetPosition(x,y1);
+ }
+}
+
+void Comment_List::SetDimensions(void)
+{
+elem->SetDimensions();
+if(next!=NULL)
+   next->SetDimensions();
+h = (next != NULL)? elem->Get_H() + next->Get_H()
+                 : elem->Get_H();
+w = (next != NULL)? Max(elem->Get_W(), next->Get_W())
+                 : elem->Get_W();
+aligline = round(h/2.0);
+}
+
+void Comment_List::SetFather(Tree_Node *f)
+{
+father = f;
+if(elem != NULL)
+  elem->SetFather(this);
+if(next != NULL)
+   next->SetFather(this);
+}
+
+
+/*                                                             */
+/*     implementation of class Parallel methods                */
+/*                                                             */
+
+Parallel::Parallel(Tree_Node *b1, Tree_Node *op, Tree_Node *b2)
+{
+type = PARALLEL;
+bex1 = b1;
+bex2 = b2;
+oper = op;
+
+Set_Unparser(new Gl_Parallel(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Parallel::SetPosition(Coord xx, Coord yy)
+{
+Coord x1,y1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Parallel" << x << " " << y << "\n";
+ cout << "Parallel" << h << " " << w << "\n";
+ cout << "Parallel" << visible << " " << collapsed << "\n";
+#endif
+
+if(textual)
+   {                   
+   SetTerminalPos();
+   x1 = (oper->GetType() == GEN_PARAL)? xl + Tree_Node::inUseFont()->Width("   
 ")
+                                       : xl + oper->Get_W();
+   bex1->SetPosition(x1, y - border);
+   oper->SetPosition(xl, yl);
+   if(oper->GetType() == GEN_PARAL)
+       bex2->SetPosition(x1, yl - oper->Get_H() - VBORDER);    
+    else bex2->SetPosition(x1, yl);    
+   }
+ else {
+      if(alignement == HOR)
+         {
+         if(!havebox)
+            x1 = x;
+          else x1 = x + BORDER;
+         y1 = y - aligline + bex1->GetAligLine();
+         bex1->SetPosition(x1,y1);
+         x1 = x1 + bex1->Get_W();
+         y1 = y - aligline + oper->GetAligLine();
+         oper->SetPosition(x1,y1);
+        x1 = x1 + oper->Get_W();
+         y1 = y - aligline + bex2->GetAligLine();
+         bex2->SetPosition(x1,y1);
+         }
+        else {
+             if(!havebox)
+                y1 = y;
+              else y1 = y - BORDER;
+             x1 = round(x + (w - bex1->Get_W())/2.0);
+             bex1->SetPosition(x1,y1);
+             y1 = y1 - bex1->Get_H();
+             x1 = round(x + (w - oper->Get_W())/2.0);
+             oper->SetPosition(x1,y1);
+            y1 = y1 - oper->Get_H();
+             x1 = round(x + (w - bex2->Get_W())/2.0);
+             bex2->SetPosition(x1,y1);
+             }
+       }
+delta = (father->GetType() == DEFINITION)?
+            round((father->GetFather()->Get_W() - w)/2.0)
+         : BORDER;
+}
+
+void Parallel::SetDimensions(void)
+{
+bex1->SetDimensions();
+bex2->SetDimensions();
+oper->SetDimensions();
+border = 0;
+
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:   if(textual)
+                          {
+                          w = Tree_Node::inUseFont()->Width("<Bex>");
+                          h = Tree_Node::inUseFont()->Height();
+                          if(!(father->GetTextual()) && (father->GetType() <= 
PARALLEL))
+                             {border = VBORDER; w += 2 * VBORDER; h += 2 * 
VBORDER; }
+                          }
+                        else {
+                             w = 
round((Tree_Node::inUseFont()->Width("Bex"))*20.0/9.0);
+                             h = 
round((Tree_Node::inUseFont()->Width("Bex"))*14.0/9.0);
+                             }
+                       aligline = round(h/2.0);
+                       break; 
+ case COLLAPSED_INV:   w = 0; h = 0; aligline = 0;
+                       break;
+ case NOCOLLAPSED: 
+     if(textual)
+       {
+       h = Get_Textual_H(); w = Get_Textual_W();
+       if(!(father->GetTextual()) && (father->GetType() <= PARALLEL))
+          {border = VBORDER; w += 2 * VBORDER; h += 2 * VBORDER; }
+       aligline = round(h/2.0);
+       }
+      else {
+          if(alignement == HOR)
+              {
+             w = bex1->Get_W() + oper->Get_W() + bex2->Get_W();
+
+             aligline = Max(bex1->GetAligLine(),oper->GetAligLine());
+             aligline = Max(aligline,bex2->GetAligLine());
+             if(bex1->Get_H() - bex1->GetAligLine() >
+                 oper->Get_H() - oper->GetAligLine())
+                h = bex1->Get_H() - bex1->GetAligLine();
+              else h = oper->Get_H() - oper->GetAligLine();
+             if(bex2->Get_H() - bex2->GetAligLine() > h)
+               h = bex2->Get_H() - bex2->GetAligLine();
+             h += aligline;
+             if(havebox)
+               {w += 2 * BORDER; h += 2 * BORDER; aligline += BORDER;}
+             }
+           else {
+                h = bex1->Get_H() + oper->Get_H() + bex2->Get_H();
+                w = Max(bex1->Get_W(), bex2->Get_W());
+                 w = Max(w, oper->Get_W());
+                if(havebox)
+                  {h += 2 * BORDER; w += 2 * BORDER;}
+                aligline = round(h/2.0);
+                }
+           }
+ }
+}
+
+void Parallel::SetTextual(char t, char s)
+{
+textual = t;
+selectable = (!t | s);
+bex1->SetTextual(t);
+oper->SetTextual(t);
+bex2->SetTextual(t);
+}
+
+int Parallel::Get_Textual_W()
+{
+int b;
+b = Max(bex1->Get_W(), bex2->Get_W());
+if(oper->GetType() == GEN_PARAL)
+   {
+   b += Tree_Node::inUseFont()->Width("    ");
+   b = Max(oper->Get_W(), b); return(b);
+   }
+ else 
+      if((father->GetType() == PARALLEL) && (((Parallel 
*)father)->GetOperType() == oper->GetType()) 
+         && father->GetTextual())
+         return(b);
+       else return(oper->Get_W() + b); 
+}
+
+int Parallel::Get_Textual_H()
+{
+if(oper->GetType() == GEN_PARAL)
+    return(bex1->Get_H() + bex2->Get_H() + oper->Get_H() +  3 *VBORDER
+           + Tree_Node::inUseFont()->Height());
+ else if((father->GetType() == PARALLEL) && (((Parallel 
*)father)->GetOperType() == oper->GetType())
+         &&  father->GetTextual())
+          return(bex1->Get_H() + bex2->Get_H() + VBORDER);
+       else return(bex1->Get_H() + bex2->Get_H() + 2 *VBORDER + 
Tree_Node::inUseFont()->Height());
+}
+
+void Parallel::SetTerminalPos()
+{
+xl=yl=yl1=0;
+
+yl =  y - bex1->Get_H() - VBORDER - border;
+if(oper->GetType() == GEN_PARAL)
+  {
+  xl = x + border;
+  yl1 =  yl - oper->Get_H() - bex2->Get_H() - 2 * VBORDER;
+  }
+ else 
+      if((father->GetType() == PARALLEL) && (((Parallel 
*)father)->GetOperType() == oper->GetType())
+          && father->GetTextual())
+           xl = x - oper->Get_W() + border;
+       else {
+            xl = x + border;
+            yl1 =  yl - bex2->Get_H() - VBORDER;
+            }
+}
+
+void Parallel::SetFather(Tree_Node *f)
+{
+char ft;
+ft = (f->GetType() == PARALLEL)? ((Parallel *)f)->GetOperType(): f->GetType();
+havebox = HaveBox(oper->GetType(),ft);
+father = f;
+bex1->SetFather(this);
+oper->SetFather(this);
+bex2->SetFather(this);
+}
+
+void Parallel::SetCollapsed(char t)
+{
+collapsed = t;
+if(t)
+  t = COLLAPSED_INV;
+bex1->SetCollapsed(t);
+oper->SetCollapsed(t);
+bex2->SetCollapsed(t);
+}
+
+/*                                                             */
+/*     implementation of class Ident_Eq methods                */
+/*                                                             */
+
+Ident_Eq::Ident_Eq(Id_Decl *idd, Value_Expr *ex)
+{
+type = IDEQ;
+textual = TRUE;
+selectable = FALSE;
+iddecl = idd;
+expr = ex;
+if(idd == NULL)
+  iddecl = new Id_Decl(NULL,NULL);
+if(ex == NULL)
+  expr = new Value_Expr;
+visible = (iddecl->GetVisible() && expr->GetVisible());
+
+Set_Unparser(new Gl_Ident_Eq(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Ident_Eq::SetPosition(Coord xx, Coord yy)
+{
+Coord x1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "IdentEq" << x << " " << y << "\n";
+ cout << "IdentEq" << h << " " << w << "\n";
+#endif
+
+iddecl->SetPosition(x,y);
+x1 = x + iddecl->Get_W() + Tree_Node::inUseFont()->Width(" = ");
+expr->SetPosition(x1,y);
+}
+
+void Ident_Eq::SetDimensions(void)
+{
+iddecl->SetDimensions();
+expr->SetDimensions();
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     w = iddecl->Get_W() + expr->Get_W() + 
Tree_Node::inUseFont()->Width(" = ");
+                       h = Tree_Node::inUseFont()->Height();
+ }
+aligline = round(h/2.0);
+}
+
+void Ident_Eq::SetFather(Tree_Node *f)
+{
+father = f;
+iddecl->SetFather(this);
+expr->SetFather(this);
+}
+
+void Ident_Eq::SetCollapsed(char t)
+{
+collapsed = t;
+iddecl->SetCollapsed(t);
+expr->SetCollapsed(t);
+}
+
+
+/*                                                             */
+/*     implementation of class Ident_Eq_List methods           */
+/*                                                             */
+
+Ident_Eq_List::Ident_Eq_List(Ident_Eq *el, Ident_Eq_List *nxt)
+{
+type = IDEQLIST;
+textual = TRUE;
+selectable = FALSE;
+elem = el;
+next = nxt;
+visible = elem->GetVisible();
+
+Set_Unparser(new Gl_Ident_Eq_List(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Ident_Eq_List::SetPosition(Coord xx, Coord yy)
+{
+Coord x1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "IdentEqList" << x << " " << y << "\n";
+ cout << "IdentEqList" << h << " " << w << "\n";
+#endif
+if(elem != NULL)
+ {
+ elem->SetPosition(x,y);
+ x1 = x + elem->Get_W() + Tree_Node::inUseFont()->Width(", ");
+ if(next != NULL)
+   next->SetPosition(x1,y);
+ }
+}
+
+void Ident_Eq_List::SetDimensions(void)
+{
+elem->SetDimensions();
+if(next!=NULL)
+   next->SetDimensions();
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     h = Tree_Node::inUseFont()->Height();
+                       w = (next == NULL || next->next == NULL)? elem->Get_W()
+                            : elem->Get_W() + next->Get_W() + 
Tree_Node::inUseFont()->Width(", ");
+ }
+aligline = round(h/2.0);
+}
+
+void Ident_Eq_List::SetCollapsed(char t)
+{
+collapsed = t;
+if(elem != NULL)
+  elem->SetCollapsed(t);
+if(next != NULL)
+  next->SetCollapsed(t);
+}
+
+void Ident_Eq_List::SetFather(Tree_Node *f)
+{
+father = f;
+if(elem != NULL)
+  elem->SetFather(this);
+if(next != NULL)
+  next->SetFather(this);
+}
+
+/*                                                             */
+/*     implementation of class Local_Def methods               */
+/*                                                             */
+
+Local_Def::Local_Def(Ident_Eq_List *e_l, Tree_Node *b)
+{
+type = LOCALDEF;
+equa_list = e_l;
+bex = b;
+
+Set_Unparser(new Gl_Local_Def(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Local_Def::SetPosition(Coord xx, Coord yy)
+{
+Coord x1,y1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Local_Def" << x << " " << y << "\n";
+ cout << "Local_Def" << h << " " << w << "\n";
+#endif
+
+if (textual)
+       {                                       /* x is the position og LET */
+       x1 = x + Tree_Node::inUseFont()->Width("let ") + border;
+       equa_list->SetPosition(x1, y - border);
+       yl = x1 + equa_list->Get_W();           /*yl is the position of IN */
+       x1 = x + SMALL_BORDER + border;
+       y1 = y - equa_list->Get_H() - VBORDER - border;
+       bex->SetPosition(x1,y1);
+       }
+     else {
+       x1 = x + BORDER;
+       y1 = y - VBORDER;
+       equa_list->SetPosition(x1,y1);
+       yl = y1 - equa_list->Get_H() - VBORDER;
+       y1 = yl - BORDER;
+       x1 = x + round((w - bex->Get_W())/2.0);
+       bex->SetPosition(x1,y1);
+       }
+}
+
+void Local_Def::SetDimensions(void)
+{
+bex->SetDimensions();
+equa_list->SetDimensions();
+border = 0;
+
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:    if(textual)
+                           {
+                          w = Tree_Node::inUseFont()->Width("<Bex>");
+                           h = Tree_Node::inUseFont()->Height();
+                           if(!(father->GetTextual()) && (father->GetType() <= 
PARALLEL))
+                              {border = VBORDER; w += 2 * VBORDER; h += 2 * 
VBORDER; }
+                          }
+                         else {
+                             w = 
round((Tree_Node::inUseFont()->Width("Bex"))*20.0/9.0);
+                              h = 
round((Tree_Node::inUseFont()->Width("Bex"))*14.0/9.0);
+                             }
+                        break;
+ case COLLAPSED_INV:    w = 0; h = 0;
+                        break;
+ case NOCOLLAPSED:
+       if(textual)
+         {
+         h = equa_list->Get_H() + VBORDER + bex->Get_H();
+         w = Max(equa_list->Get_W() + Tree_Node::inUseFont()->Width("let ") + 
+                  Tree_Node::inUseFont()->Width(" in "), bex->Get_W() + 
SMALL_BORDER);
+          if(!(father->GetTextual()) && (father->GetType() <= PARALLEL))
+            {border = VBORDER; w += 2 * VBORDER; h += 2 * VBORDER; }
+          }
+        else {
+             w = Max(bex->Get_W(), equa_list->Get_W());
+              w += 2 * BORDER;
+              h = bex->Get_H() + equa_list->Get_H() + 2 * (VBORDER + BORDER);
+              }
+       break;
+ }
+aligline = round(h/2.0);
+}
+
+void Local_Def::SetFather(Tree_Node *f)
+{
+father = f;
+equa_list->SetFather(this);
+bex->SetFather(this);
+}
+       
+void Local_Def::SetCollapsed(char t)
+{
+collapsed = t;
+if(t)
+  t = COLLAPSED_INV;
+equa_list->SetCollapsed(t);
+bex->SetCollapsed(t);
+}
+
+void Local_Def::SetTextual(char t, char s)
+{
+textual = t;
+selectable = (!t | s);
+bex->SetTextual(t);
+}
+
+
+/*                                                             */
+/*     implementation of class Hide methods                    */
+/*                                                             */
+
+Hide::Hide(ID_List *g_l, Tree_Node *b)
+{
+type = HIDE;
+alignement = VER;
+gate_list = g_l;
+bex = b;
+
+Set_Unparser(new Gl_Hide(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Hide::SetPosition(Coord xx, Coord yy)
+{
+Coord x1,y1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Hide" << x << " " << y << "\n";
+ cout << "Hide" << h << " " << w << "\n";
+#endif
+
+if (textual)
+       {                                       /* x is the position of Hide */
+       x1 = x + Tree_Node::inUseFont()->Width("hide ") + border;
+       gate_list->SetPosition(x1, y - border);
+       yl = x1 + gate_list->Get_W();           /* position of IN */ 
+       x1 = x + SMALL_BORDER + border;
+       y1 = y - gate_list->Get_H() - VBORDER - border;
+       bex->SetPosition(x1, y1);
+       }
+     else {
+       x1 = x + HIDE_W + BORDER;
+       y1 = y - VBORDER;
+       gate_list->SetPosition(x1,y1);
+       yl = y1 - gate_list->Get_H() - VBORDER;
+       y1 = yl - BORDER;
+       x1 = x + BORDER;
+       bex->SetPosition(x1,y1);
+       }
+}
+
+void Hide::SetDimensions(void)
+{
+int foo;
+
+bex->SetDimensions();
+gate_list->SetDimensions();
+border = 0;
+
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:   if(textual)
+                          {
+                          w = Tree_Node::inUseFont()->Width("<Bex>");
+                          h = Tree_Node::inUseFont()->Height();
+                          if(!(father->GetTextual()) && (father->GetType() <= 
PARALLEL))
+                             {border = VBORDER; w += 2 * VBORDER; h += 2 * 
VBORDER; }
+                          }
+                        else {
+                             w = 
round((Tree_Node::inUseFont()->Width("Bex"))*20.0/9.0);
+                             h = 
round((Tree_Node::inUseFont()->Width("Bex"))*14.0/9.0);
+                             }
+                       break; 
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:
+      if(textual == TRUE)
+       {
+       h = gate_list->Get_H() + VBORDER + bex->Get_H();
+       foo = Tree_Node::inUseFont()->Width("hide ") + gate_list->Get_W() +
+               Tree_Node::inUseFont()->Width(" in ");
+       w = Max(foo, bex->Get_W() + SMALL_BORDER);
+       if(!(father->GetTextual()) && (father->GetType() <= PARALLEL))
+         {border = VBORDER; w += 2 * VBORDER; h += 2 * VBORDER; }
+       }
+     else {
+       w = Max(bex->Get_W(), HIDE_W + gate_list->Get_W());
+       w += 2 * BORDER;
+       h = bex->Get_H() + gate_list->Get_H() + 2 * (VBORDER + BORDER);
+       }
+ }
+aligline = round(h/2.0);
+}
+
+void Hide::SetFather(Tree_Node *f)
+{
+father = f;
+gate_list->SetFather(this);
+bex->SetFather(this);
+}
+
+void Hide::SetCollapsed(char t)
+{
+collapsed = t;
+if(t)
+  t = COLLAPSED_INV;
+gate_list->SetCollapsed(t);
+bex->SetCollapsed(t);
+}
+
+
+void Hide::SetTextual(char t, char s)
+{
+textual = t;
+selectable = (!t | s);
+bex->SetTextual(t);
+}
+
+/*                                                             */
+/*     implementation of class Interl methods          */
+/*                                                             */
+
+Interl::Interl()
+{
+type = INTERL;
+alignement = glow->GetAligs(INTERL);
+selectable = FALSE;
+
+Set_Unparser(new Gl_Interl(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Interl::SetPosition(Coord xx, Coord yy)
+{
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Interl" << x << " " << y << "\n";
+ cout << "Interl" << h << " " << w << "\n";
+ cout << "Interl" << visible << " " << collapsed << "\n";
+#endif
+}
+
+void Interl::SetDimensions(void)
+{
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:
+       if(textual)
+         {
+         w = Tree_Node::inUseFont()->Width("||| ");
+         h = Tree_Node::inUseFont()->Height();
+         }
+         else {
+             if(father->GetAlignement() == HOR)
+                 {
+                w = 2 * BORDER;
+                h = 0;
+                }
+               else {
+                   w = 0;
+                   h = 2 * BORDER;
+                   }
+             }
+ }
+aligline = round(h/2.0);
+}
+
+void Interl::SetFather(Tree_Node *f)
+{
+father = f;
+father->UpdateAlig(INTERL);
+}
+
+/*                                                             */
+/*     implementation of class Syncr methods           */
+/*                                                             */
+
+Syncr::Syncr()
+{
+type = SYNCR;
+alignement = glow->GetAligs(SYNCR);
+selectable = FALSE;
+
+Set_Unparser(new Gl_Syncr(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Syncr::SetPosition(Coord xx, Coord yy)
+{
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Syncr" << x << " " << y << "\n";
+ cout << "Syncr" << h << " " << w << "\n";
+#endif
+}
+
+void Syncr::SetDimensions(void)
+{
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:
+       if(textual)
+         {
+         w = Tree_Node::inUseFont()->Width("|| ");
+         h = Tree_Node::inUseFont()->Height();
+         }
+        else {
+             if(father->GetAlignement() == HOR)
+              {
+              w = 2 * (SYNCR_R + SYNCR_L);
+              h = 2 * SYNCR_R;
+              }
+             else {
+                  w = 2 * SYNCR_R;
+                  h = 2 * (SYNCR_R + SYNCR_L);
+                  }
+            }
+ }
+aligline = round(h/2.0);
+}
+
+void Syncr::SetFather(Tree_Node *f)
+{
+father = f;
+father->UpdateAlig(SYNCR);
+}
+
+/*                                                              */
+/*      implementation of class Enable methods                  */
+/*                                                              */
+
+
+Enable::Enable(Tree_Node *b1, ID_List *g_i_l, Tree_Node *b2)
+{
+type = ENABLE;
+alignement = glow->GetAligs(ENABLE);
+bex1 = b1;
+gate_id_list = g_i_l;
+bex2 = b2;
+
+Set_Unparser(new Gl_Enable(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Enable::SetPosition(Coord xx, Coord yy)
+{
+Coord x1,y1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Enable" << x << " " << y << "\n";
+ cout << "Enable" << h << " " << w << "\n";
+#endif
+
+if(textual)
+   {
+   SetTerminalPos();
+   bex1->SetPosition(xl, y - border);
+   if(gate_id_list->GetVisible())
+      {
+      gate_id_list->SetPosition(xl + Tree_Node::inUseFont()->Width("accept 
"),yid);
+      bex2->SetPosition(xl, yid - gate_id_list->Get_H() - VBORDER);
+      }
+    else bex2->SetPosition(xl, yid);   
+   }
+  else {
+       if(alignement == HOR)
+          {
+         if(havebox)
+           x1 = x + BORDER;
+          else x1 = x;
+         y1 = y - aligline + bex1->GetAligLine();
+         bex1->SetPosition(x1,y1);
+
+         if(havebox)
+           xl = x + bex1->Get_W() + BORDER;
+          else xl = x + bex1->Get_W();
+         yl1 = y - aligline;
+
+         xid = xl + ENAB_L;
+         yid = yl1 + round(gate_id_list->Get_H()/2.0) + VBORDER;
+         gate_id_list->SetPosition(xid + BORDER,yid - VBORDER);
+
+         yl2 = (gate_id_list->Get_W() != 0)? 
+               xid + gate_id_list->Get_W() + 2 * BORDER
+                 : xid;
+         x1 = yl2 + ENAB_L + ENAB_S;
+         y1 = y - aligline + bex2->GetAligLine();
+         bex2->SetPosition(x1,y1);
+          }
+        else {
+            xl = x + round(w/2.0);
+            x1 = x + round((w - bex1->Get_W())/2.0);
+            if(havebox)
+               y1 = y - BORDER;
+             else y1 = y;
+            bex1->SetPosition(x1,y1);
+            yl1 = y1 - bex1->Get_H();
+            xid = x + round((w - gate_id_list->Get_W())/2.0) - BORDER;
+            yid = yl1 - ENAB_L;
+            gate_id_list->SetPosition(xid + BORDER,yid - VBORDER);
+            yl2 = (gate_id_list->Get_H() != 0)? 
+                  yid - gate_id_list->Get_H() - 2 * VBORDER
+                    : yid - gate_id_list->Get_H();
+            x1 = x + round((w - bex2->Get_W())/2.0);
+            y1 = yl2 - ENAB_L - ENAB_S;
+            bex2->SetPosition(x1,y1);
+             }
+       }
+}
+
+void Enable::SetDimensions(void)
+{
+bex1->SetDimensions();
+gate_id_list->SetDimensions();
+bex2->SetDimensions();
+border = 0;
+
+switch(collapsed) 
+ {
+ case COLLAPSED_VIS:   if(textual)
+                          {
+                          w = Tree_Node::inUseFont()->Width("<Bex>");
+                          h = Tree_Node::inUseFont()->Height();
+                          if(!(father->GetTextual()) && (father->GetType() <= 
PARALLEL))
+                             {border = VBORDER; w += 2 * VBORDER; h += 2 * 
VBORDER; }
+                          }
+                        else {
+                             w = 
round((Tree_Node::inUseFont()->Width("Bex"))*20.0/9.0);
+                             h = 
round((Tree_Node::inUseFont()->Width("Bex"))*14.0/9.0);
+                             }
+                       aligline = round(h/2.0);
+                       break; 
+ case COLLAPSED_INV:   w = 0; h = 0; aligline = 0;
+                       break;
+ case NOCOLLAPSED:
+     if(textual)
+       {
+        h = bex1->Get_H() + bex2->Get_H() + 2*VBORDER + 
Tree_Node::inUseFont()->Height();
+       w = Get_Textual_W();
+        if(gate_id_list->GetVisible())
+        h += VBORDER + Tree_Node::inUseFont()->Height();
+       if(!(father->GetTextual()) && (father->GetType() <= PARALLEL))
+         {border = VBORDER; w += 2 * VBORDER; h += 2 * VBORDER; }
+       aligline = round(h/2.0);
+       }
+       else {
+            if(alignement == HOR)
+               {
+              int b1,b2;
+              aligline = 
Max((round(ENAB_S/2.0)),(round(gate_id_list->Get_H()/2.0) + VBORDER));
+              aligline = Max(aligline,bex1->GetAligLine());
+              aligline = Max(aligline,bex2->GetAligLine());
+
+              if((gate_id_list->Get_H() - gate_id_list->GetAligLine()) >
+                 round(ENAB_S/2.0))
+                  b1 = gate_id_list->Get_H() - gate_id_list->GetAligLine();
+               else b1 =  round(ENAB_S/2.0);
+              if((bex1->Get_H() - bex1->GetAligLine()) > 
+                 (bex2->Get_H() - bex1->GetAligLine()))
+                 b2 = bex1->Get_H() - bex1->GetAligLine();
+               else b2 = bex2->Get_H() - bex1->GetAligLine();
+              if(b1 > b2)
+                h = aligline + b1;
+               else h = aligline + b2;
+              w = bex1->Get_W() + gate_id_list->Get_W() + bex2->Get_W();
+              w += (gate_id_list->Get_W() == 0)? 2 * ENAB_L + ENAB_S
+                                   : 2 * ENAB_L + ENAB_S + 2 * BORDER;
+              if(havebox)
+                {w += 2 * BORDER; h += 2 * BORDER; aligline += BORDER;}
+                }
+             else {
+                 w = Max4(bex1->Get_W(), gate_id_list->Get_W() + 2*BORDER, 
+                          bex2->Get_W(), ENAB_S);
+                 h = bex1->Get_H() + gate_id_list->Get_H() + bex2->Get_H();
+                 h += (gate_id_list == 0)? 2 * ENAB_L + ENAB_S
+                                      : 2 * ENAB_L + ENAB_S + 2 * VBORDER;
+                 aligline = round(h/2.0);
+                 if(havebox)
+                   {w += 2 * BORDER; h += 2 * BORDER;}
+                  }
+           }
+ }
+}
+
+void Enable::SetTextual(char t, char s)
+{
+textual = t;
+selectable = (!t | s);
+bex1->SetTextual(t);
+bex2->SetTextual(t);
+}
+
+void Enable::SetTerminalPos()
+
+/* x, y are the coordinate of (                                        */
+/* xid, yid are the coordinate of >>                           */
+/* xl, yl1 are the coordinate of accept                        */
+/* xl2, yl2 are the coordinate of in                           */
+{
+xid = x + border;
+yid = y - bex1->Get_H() - VBORDER - border;
+xl =  xid + Tree_Node::inUseFont()->Width(">> ");
+if(gate_id_list->GetVisible())
+  {
+  yl1 = yid;
+  xl2 = xl + Tree_Node::inUseFont()->Width("accept ") + gate_id_list->Get_W();
+  yl2 = yid;
+  Yclose = yid - gate_id_list->Get_H() -  bex2->Get_H() - 2 * VBORDER;
+  }
+ else Yclose = yid - bex2->Get_H() - VBORDER;
+}
+
+int Enable::Get_Textual_W()
+{
+int b;
+b = (gate_id_list->GetVisible())? Max(bex2->Get_W(), gate_id_list->Get_W() + 
+               Tree_Node::inUseFont()->Width("accept  in "))
+    : bex2->Get_W();
+b = Max(bex1->Get_W(), b);
+return(Tree_Node::inUseFont()->Width(">> ") + b);
+
+}
+
+int Enable::Get_Textual_H()
+{ return(bex1->Get_H() + bex2->Get_H() + 2*VBORDER + 
Tree_Node::inUseFont()->Height()); }
+
+void Enable::SetFather(Tree_Node *f)
+{
+char ft;
+ft = (f->GetType() == PARALLEL)? ((Parallel *)f)->GetOperType(): f->GetType();
+if(gate_id_list->GetVisible())
+   havebox = HaveBox(9,ft);
+ else havebox = HaveBox(ENABLE,ft);
+father = f;
+bex1->SetFather(this);
+gate_id_list->SetFather(this);
+bex2->SetFather(this);
+}
+
+void Enable::SetCollapsed(char t)
+{
+collapsed = t;
+if(t)
+  t = COLLAPSED_INV;
+bex1->SetCollapsed(t);
+gate_id_list->SetCollapsed(t);
+bex2->SetCollapsed(t);
+}
+
+
+/*                                                              */
+/*      implementation of class Disable methods                 */
+/*                                                              */
+
+
+Disable::Disable(Tree_Node *b1, Tree_Node *b2)
+{
+type = DISABLE;
+alignement = glow->GetAligs(DISABLE);
+bex1 = b1;
+bex2 = b2;
+
+Set_Unparser(new Gl_Disable(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Disable::SetPosition(Coord xx, Coord yy)
+{
+Coord x1,y1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Disable" << x << " " << y << "\n";
+ cout << "Disable" << h << " " << w << "\n";
+#endif
+if(textual)
+   {
+   SetTerminalPos();
+   x1 = xl + Tree_Node::inUseFont()->Width("[> ");
+   bex1->SetPosition(x1, y - border);
+   bex2->SetPosition(x1, yl);
+   }
+ else {
+      if(alignement == HOR)
+         {
+        if(havebox)
+            x1 = x + BORDER;
+          else x1 = x;
+        y1 = y - aligline + bex1->GetAligLine();
+        bex1->SetPosition(x1,y1);
+
+        x1 = x1 + bex1->Get_W() + SMALL_PEN + SYNCR_L + 2 * SYNCR_R;
+        y1 = y - aligline + bex2->GetAligLine();
+        bex2->SetPosition(x1,y1);
+        if(havebox)
+          xl = x + bex1->Get_W() + BORDER;
+         else xl = x + bex1->Get_W();
+        yl = y - aligline +  SYNCR_R;
+        }
+       else {
+           if(havebox)
+              y1 = y - BORDER;
+             else y1 = y;
+           x1 = round(x + (w - bex1->Get_W())/2.0);
+           bex1->SetPosition(x1,y1);
+           yl = y1 - bex1->Get_H() - SMALL_PEN - SYNCR_L - 2 * SYNCR_R;
+           xl = round(x + (w - bex2->Get_W())/2.0);
+           bex2->SetPosition(xl,yl);
+           xl = x + round(w/2) - SYNCR_R;
+           if(havebox)
+              yl = y - bex1->Get_H() - BORDER;
+            else yl = y - bex1->Get_H();
+            }
+      }
+
+}
+
+void Disable::SetDimensions(void)
+{
+bex1->SetDimensions();
+bex2->SetDimensions();
+border = 0;
+
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:   if(textual)
+                          {
+                          w = Tree_Node::inUseFont()->Width("<Bex>");
+                          h = Tree_Node::inUseFont()->Height();
+                          if(!(father->GetTextual()) && (father->GetType() <= 
PARALLEL))
+                             {border = VBORDER; w += 2 * VBORDER; h += 2 * 
VBORDER; }
+                          }
+                        else {
+                             w = 
round((Tree_Node::inUseFont()->Width("Bex"))*20.0/9.0);
+                             h = 
round((Tree_Node::inUseFont()->Width("Bex"))*14.0/9.0);
+                             }
+                       aligline = round(h/2.0);
+                       break; 
+ case COLLAPSED_INV:   w = 0; h = 0; aligline = 0;
+                       break;
+ case NOCOLLAPSED:
+       if(textual)
+          {
+          h = Get_Textual_H();
+          w = Get_Textual_W(); 
+          if(!(father->GetTextual()) && (father->GetType() <= PARALLEL))
+             {border = VBORDER; w += 2 * VBORDER; h += 2 * VBORDER; }
+          aligline = round(h/2.0);
+          }
+         else {
+             if(alignement == HOR)
+                 {
+                int b1;
+                w = bex1->Get_W() + bex2->Get_W();
+                w += SYNCR_L + 2 * SYNCR_R + SMALL_PEN;
+
+                aligline = Max(bex1->GetAligLine(), bex2->GetAligLine());
+                if((bex1->Get_H() - bex1->GetAligLine()) >
+                   (bex2->Get_H() - bex2->GetAligLine()))
+                   b1 = bex1->Get_H() - bex1->GetAligLine();
+                 else  b1 = bex2->Get_H() - bex2->GetAligLine();
+                h = aligline + b1;
+                if(havebox)
+                  {w += 2 * BORDER; h += 2 * BORDER; aligline += BORDER;}
+                 }
+               else {
+                   h = bex1->Get_H() + bex2->Get_H();
+                   h += SYNCR_L + 2 * SYNCR_R + SMALL_PEN;
+                   w = Max(bex1->Get_W(), bex2->Get_W());
+                   aligline = bex1->GetAligLine();
+                   if(havebox)
+                     {w += 2 * BORDER; h += 2 * BORDER; aligline += BORDER;}
+                   }
+             }
+ }
+}
+
+void Disable::SetFather(Tree_Node *f)
+{
+char ft;
+ft = (f->GetType() == PARALLEL)? ((Parallel *)f)->GetOperType(): f->GetType();
+havebox = HaveBox(DISABLE,ft);
+father = f;
+bex1->SetFather(this);
+bex2->SetFather(this);
+}
+
+void Disable::SetCollapsed(char t)
+{
+collapsed = t;
+if(t)
+  t = COLLAPSED_INV;
+bex1->SetCollapsed(t);
+bex2->SetCollapsed(t);
+}
+
+void Disable::SetTextual(char t, char s)
+{
+textual = t;
+selectable = (!t | s);
+bex1->SetTextual(t);
+bex2->SetTextual(t);
+}
+
+void Disable::SetTerminalPos()
+{
+
+if(father->GetType() == DISABLE && 
+   father->GetTextual())        /* xl, yl is the position of [> */
+   {
+   xl = x - Tree_Node::inUseFont()->Width("[> ") + border;
+   yl = y - bex1->Get_H() - VBORDER - border;
+   }
+  else {                               /* x,y is the position of ( */
+       xl = x + border;
+       yl = y - bex1->Get_H() - VBORDER - border;
+       yl2 = yl - bex2->Get_H() - VBORDER;
+       }
+}
+
+int Disable::Get_Textual_W()
+{
+int b;
+b = Max(bex1->Get_W(), bex2->Get_W());
+if((father->GetType() == DISABLE) && father->GetTextual())
+   return(b);
+return(Tree_Node::inUseFont()->Width("[> ") + b);
+}
+
+int Disable::Get_Textual_H()
+{
+if(father->GetType() == DISABLE && father->GetTextual())
+   return(bex1->Get_H() + bex2->Get_H() + VBORDER);
+ else return(bex1->Get_H() + bex2->Get_H() + 2 * VBORDER + 
Tree_Node::inUseFont()->Height());
+}
+
+/*                                                              */
+/*      implementation of class Gen_Paral methods               */
+/*                                                              */
+
+
+Gen_Paral::Gen_Paral(ID_List *g_i_l)
+{
+type = GEN_PARAL;
+alignement = glow->GetAligs(GEN_PARAL);
+selectable = FALSE;
+gate_id_list = g_i_l;
+visible = g_i_l->GetVisible();
+
+Set_Unparser(new Gl_Gen_Paral(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+
+}
+
+void Gen_Paral::SetPosition(Coord xx, Coord yy)
+{
+Coord x1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Gen_Paral" << x << " " << y << "\n";
+ cout << "Gen_Paral" << h << " " << w << "\n";
+#endif
+
+if(textual)
+   {                   /* x is the position of |[ */
+   x1 = x + Tree_Node::inUseFont()->Width(" |[");      
+   gate_id_list->SetPosition(x1, y);
+   Xclose = x1 + gate_id_list->Get_W();        /* position of ]| */
+   }
+ else {
+      if(father->GetType() == PAR)
+          gate_id_list->SetPosition(x + ROUND_CORNER, y  - ROUND_CORNER);
+       else {
+            if(father->GetAlignement() == HOR)
+               gate_id_list->SetPosition(x + SYNCR_L + ROUND_CORNER,y 
-ROUND_CORNER);
+             else gate_id_list->SetPosition(x + ROUND_CORNER,y-SYNCR_L - 
ROUND_CORNER);
+            }
+       }
+}
+
+void Gen_Paral::SetDimensions(void)
+{
+gate_id_list->SetDimensions();
+border = 0;
+
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:   if(textual)
+                          {
+                          w = Tree_Node::inUseFont()->Width("<Bex>");
+                          h = Tree_Node::inUseFont()->Height();
+                          if(!(father->GetTextual()) && (father->GetType() <= 
PARALLEL))
+                             {border = VBORDER; w += 2 * VBORDER; h += 2 * 
VBORDER; }
+                          }
+                        else {
+                             w = 
round((Tree_Node::inUseFont()->Width("Bex"))*20.0/9.0);
+                             h = 
round((Tree_Node::inUseFont()->Width("Bex"))*14.0/9.0);
+                             }
+                       break; 
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:
+       if(textual)
+          {
+          h = Tree_Node::inUseFont()->Height();
+          w = Tree_Node::inUseFont()->Width(" |[") + gate_id_list->Get_W() +
+                Tree_Node::inUseFont()->Width("]| ");
+          }
+         else {
+             if(father->GetType() == PAR)
+               {
+               h = gate_id_list->Get_H() + 2 * ROUND_CORNER;
+               w = gate_id_list->Get_W() + 2 * ROUND_CORNER;
+               }
+              else {
+                    if(father->GetAlignement() == HOR)
+                       {
+                      h = gate_id_list->Get_H() + 2 * ROUND_CORNER;
+                      w = gate_id_list->Get_W() + 2 * ROUND_CORNER + 2 * 
SYNCR_L;
+                       }
+                     else {
+                         h = gate_id_list->Get_H() + 2 * ROUND_CORNER + 2 * 
SYNCR_L;
+                         w = gate_id_list->Get_W() + 2 * ROUND_CORNER;
+                          }
+                   }
+             }
+ }
+aligline = round(h/2.0);
+}
+
+void Gen_Paral::SetFather(Tree_Node *f)
+{
+father = f;
+father->UpdateAlig(GEN_PARAL);
+gate_id_list->SetFather(this);
+}
+
+void Gen_Paral::SetCollapsed(char t)
+{
+collapsed = t; 
+gate_id_list->SetCollapsed(t);
+}
+
+
+/*                                                              */
+/*      implementation of class Action_Pref methods             */
+/*                                                              */
+
+
+Action_Pref::Action_Pref(Tree_Node *a_d, Tree_Node *b)
+{
+type = ACTION_PREF;
+alignement = glow->GetAligs(ACTION_PREF);
+action_den = a_d;
+bex = b;
+
+Set_Unparser(new Gl_Action_Pref(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Action_Pref::SetPosition(Coord xx, Coord yy)
+{
+Coord x1,y1;
+
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Action_Pref" << x << " " << y << "\n";
+ cout << "Action_Pref" << h << " " << w << "\n";
+#endif
+
+if(textual)
+   {
+   action_den->SetPosition(x + border, y - border);
+    y1 = y - action_den->Get_H() - VBORDER - border;
+   x1 = x + SMALL_BORDER + border;
+   bex->SetPosition(x1, y1);
+   }
+ else {
+      if(alignement == HOR)
+         {
+         y1 = y - aligline + action_den->GetAligLine();
+        if(havebox)
+           {
+          action_den->SetPosition(x + BORDER,y1);
+          x1 = x + action_den->Get_W() + BORDER;
+          }
+          else 
+           {
+          action_den->SetPosition(x,y1);
+          x1 = x + action_den->Get_W();
+          }
+         y1 = y - aligline + bex->GetAligLine();
+        bex->SetPosition(x1,y1);
+         }
+       else {
+            x1 = round(x + (w - action_den->Get_W())/2.0);
+           if(havebox)
+             y1 = y - BORDER;
+            else y1 = y;
+           action_den->SetPosition(x1,y1);
+           x1 = round(x + (w - bex->Get_W())/2.0);
+           y1 = y1 - action_den->Get_H();
+           bex->SetPosition(x1,y1);
+            }
+       }
+
+}
+
+void Action_Pref::SetDimensions(void)
+{
+action_den->SetDimensions();
+bex->SetDimensions();
+border = 0;
+
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:   if(textual)
+                          {
+                          w = Tree_Node::inUseFont()->Width("<Bex>");
+                          h = Tree_Node::inUseFont()->Height();
+                          if(!(father->GetTextual()) && (father->GetType() <= 
PARALLEL))
+                             {border = VBORDER; w += 2 * VBORDER; h += 2 * 
VBORDER; }
+                          }
+                        else {
+                             w = 
round((Tree_Node::inUseFont()->Width("Bex"))*20.0/9.0);
+                             h = 
round((Tree_Node::inUseFont()->Width("Bex"))*14.0/9.0);
+                             }
+                       aligline = round(h/2.0);
+                       break; 
+ case COLLAPSED_INV:   w = 0; h = 0; aligline = 0;
+                       break;
+ case NOCOLLAPSED:
+       if(textual)
+          {
+          h = action_den->Get_H() + bex->Get_H() + VBORDER;
+          w = Max(action_den->Get_W(), bex->Get_W() + SMALL_BORDER);
+          if(!(father->GetTextual()) && (father->GetType() <= PARALLEL))
+             {border = VBORDER; w += 2 * VBORDER; h += 2 * VBORDER; }
+          aligline = round(h/2.0);
+          }
+         else {
+              if(alignement == HOR)
+                 {
+                w = action_den->Get_W() + bex->Get_W();
+                aligline = Max(action_den->GetAligLine(),bex->GetAligLine());
+                if((action_den->Get_H() - action_den->GetAligLine()) >
+                     (bex->Get_H() - bex->GetAligLine()))
+                   h = aligline + action_den->Get_H() - 
action_den->GetAligLine();
+                  else  h = aligline + bex->Get_H() - bex->GetAligLine();
+                if(havebox)
+                  {w += 2 * BORDER; h += 2 * BORDER; aligline += BORDER;}
+                 }
+               else {
+                   h = action_den->Get_H() + bex->Get_H();
+                   w = Max(action_den->Get_W(), bex->Get_W());
+                   aligline = action_den->GetAligLine();
+                   if(havebox)
+                     {w += 2 * BORDER; h += 2 * BORDER; aligline += BORDER;}
+                    }
+             }
+ }
+}
+
+void Action_Pref::SetFather(Tree_Node *f)
+{
+char ft;
+ft = (f->GetType() == PARALLEL)? ((Parallel *)f)->GetOperType(): f->GetType();
+havebox = HaveBox(ACTION_PREF,ft);
+father = f;
+action_den->SetFather(this);
+bex->SetFather(this);
+}
+
+void Action_Pref::SetCollapsed(char t)
+{
+collapsed = t;
+if(t)
+  t = COLLAPSED_INV;
+action_den->SetCollapsed(t);
+bex->SetCollapsed(t);
+}
+
+void Action_Pref::SetTextual(char t, char s)
+{
+textual = t;
+selectable = (!t | s);
+action_den->SetTextual(t);
+bex->SetTextual(t);
+}
+
+
+/*                                                              */
+/*      implementation of class Internal methods                */
+/*                                                              */
+
+
+Internal::Internal()
+{
+type = INTERNAL;
+selectable = FALSE;
+visible = TRUE;
+
+Set_Unparser(new Gl_Internal(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+
+}
+
+void Internal::SetPosition(Coord xx, Coord yy)
+{
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Internal" << x << " " << y << "\n";
+ cout << "Internal" << h << " " << w << "\n";
+#endif
+}
+
+void Internal::SetDimensions(void)
+{
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     
+        if(textual)
+          {
+          h = Tree_Node::inUseFont()->Height();
+          w = Tree_Node::inUseFont()->Width("i ; ");
+          }
+         else {
+              if(father->GetAlignement() == HOR)
+                 {
+                h = INT_EV_H;
+                w = INT_EV_W + INT_EV_L + SMALL_PEN;
+                 }
+               else {
+                   h = INT_EV_H + INT_EV_L + SMALL_PEN;
+                   w = INT_EV_W;
+                    }
+             }
+ }
+aligline = round(h/2.0);
+}
+
+void Internal::SetFather(Tree_Node *f)
+{ father = f;
+}
+
+
+/*                                                              */
+/*      implementation of class Communication methods           */
+/*                                                              */
+
+
+Communication::Communication(ID_Place *i, Tree_Node *ex_op)
+{
+type = COMMUNICATION;
+selectable = FALSE;
+gate_identifier = i;
+experiment_option = ex_op;
+
+Set_Unparser(new Gl_Communication(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Communication::SetPosition(Coord xx, Coord yy)
+{
+int dum;
+Coord x1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Communication" << x << " " << y << "\n";
+ cout << "Communication" << h << " " << w << "\n";
+#endif
+
+if(textual)
+   {
+   gate_identifier->SetPosition(x, y);
+   dum = x + gate_identifier->Get_W() + Tree_Node::inUseFont()->Width(" ");
+   experiment_option->SetPosition(dum, y) ;
+   yl = dum + experiment_option->Get_W();      /*position of ; */
+   }
+ else {
+      if(father->GetAlignement() == HOR)
+         {
+         int w1;
+         w1 = w - SMALL_PEN - INT_EV_L;
+         if(experiment_option->GetType() == EXPERIMENT &&
+          ((Experiment *)experiment_option)->GetGuard()->Get_W() == w1) 
+          {
+          dum = round((w1 - (gate_identifier->Get_W() +
+                     experiment_option->Get_W() + ROUND_CORNER))/2.0);
+          x1 = x + dum;
+          }
+         else x1 = x + ROUND_CORNER; 
+        gate_identifier->SetPosition(x1, y - ROUND_CORNER);
+       yl = y - round(gate_identifier->Get_H()/2) - ROUND_CORNER;
+       xl = x + w1;
+        if(experiment_option->GetType() == EXPERIMENT)
+          {
+          dum =round((w1 -
+                ((Experiment *)experiment_option)->GetGuard()->Get_W())/2.0);
+          x1 = x1 + gate_identifier->Get_W() + ROUND_CORNER;
+         experiment_option->SetPosition(x1, y - ROUND_CORNER);
+         ((Experiment *)experiment_option)->GetGuard()->SetPosition(x + dum,
+                                       y - gate_identifier->Get_H() - 2 * 
ROUND_CORNER);
+         }
+        }
+      else {
+           if(experiment_option->GetType() == EXPERIMENT &&
+             ((Experiment *)experiment_option)->GetGuard()->Get_W() == w) 
+           {
+           dum = round((w - (gate_identifier->Get_W() +
+                experiment_option->Get_W() + ROUND_CORNER))/2.0);
+           x1 = x + dum;
+           }
+          else x1 = x + ROUND_CORNER; 
+         gate_identifier->SetPosition(x1, y - ROUND_CORNER);
+          yl = y - gate_identifier->Get_H() - 2 * ROUND_CORNER;
+          xl = x + round(w/2.0);
+         if(experiment_option->GetType() == EXPERIMENT)
+           {
+           dum =round((w -
+                ((Experiment *)experiment_option)->GetGuard()->Get_W())/2.0);
+           x1 = x1 + gate_identifier->Get_W() + ROUND_CORNER;
+           experiment_option->SetPosition(x1, y - ROUND_CORNER);
+           ((Experiment *)experiment_option)->GetGuard()->SetPosition(x + dum,
+                                       y - gate_identifier->Get_H() - 2 * 
ROUND_CORNER);
+           yl -= ((Experiment *)experiment_option)->GetGuard()->Get_H();
+           }
+          }
+        }
+}
+
+void Communication::SetDimensions(void)
+{
+gate_identifier->SetDimensions();
+experiment_option->SetDimensions();
+
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0; aligline = 0;
+                       break;
+ case NOCOLLAPSED:
+       if(textual)
+         {
+         h = Tree_Node::inUseFont()->Height();
+         w = gate_identifier->Get_W() + experiment_option->Get_W() +
+               Tree_Node::inUseFont()->Width(" ") + 
Tree_Node::inUseFont()->Width(" ; ");
+         aligline = round(h/2.0);
+         }
+         else {
+             hr  = gate_identifier->Get_H() + 2 * ROUND_CORNER;
+              if(father->GetAlignement() == HOR)
+                 h = gate_identifier->Get_H() + 2 * ROUND_CORNER;
+              else h = gate_identifier->Get_H() + 2 * ROUND_CORNER  + 
SMALL_PEN + INT_EV_L;
+             w = gate_identifier->Get_W() + 2 * ROUND_CORNER;
+             if(experiment_option->GetType() == EXPERIMENT)
+               {
+               w += experiment_option->Get_W() + ROUND_CORNER;
+               if(((Experiment *)experiment_option)->GetGuard()->Get_W() > w)
+                  w = ((Experiment *)experiment_option)->GetGuard()->Get_W();
+               h += ((Experiment *)experiment_option)->GetGuard()->Get_H();
+               }
+               if(father->GetAlignement() == HOR)
+                w += SMALL_PEN + INT_EV_L;
+              aligline = round(gate_identifier->Get_H()/2.0) + ROUND_CORNER;
+               }
+ }
+}
+
+void Communication::SetFather(Tree_Node *f)
+{
+father = f;
+gate_identifier->SetFather(this);
+experiment_option->SetFather(this);
+}
+
+void Communication::SetCollapsed(char t)
+{
+collapsed = t;
+gate_identifier->SetCollapsed(t);
+experiment_option->SetCollapsed(t);
+}
+
+void Communication::SetTextual(char t, char)
+{
+textual = t;
+experiment_option->SetTextual(t);
+}
+
+
+/*                                                              */
+/*      implementation of class NoGuard methods                */
+/*                                                              */
+
+
+NoGuard::NoGuard()
+{
+type = NO_GUARD;
+visible = FALSE;
+selectable = FALSE;
+w = 0; h = 0;
+aligline = 0;
+
+Set_Unparser(new Gl_NoGuard(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+
+}
+
+void NoGuard::SetPosition(Coord xx, Coord yy)
+{
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "NoGuard" << x << " " << y << "\n";
+ cout << "NoGuard" << h << " " << w << "\n";
+#endif
+}
+
+void NoGuard::SetDimensions(void)
+{ }
+
+void NoGuard::SetFather(Tree_Node *f)
+{ father = f; }
+
+
+/*                                                              */
+/*      implementation of class Guard methods           */
+/*                                                              */
+
+
+Guard::Guard(Equality *eq)
+{
+type = GUARD;
+visible = TRUE;
+selectable = FALSE;
+equality = eq;
+
+Set_Unparser(new Gl_Guard(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+
+}
+
+void Guard::SetPosition(Coord xx, Coord yy)
+{
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Guard" << x << " " << y << "\n";
+ cout << "Guard" << h << " " << w << "\n";
+#endif
+if (textual)
+       equality->SetPosition(x + Tree_Node::inUseFont()->Width(" ["), y);
+      else
+       equality->SetPosition(x+BORDER, y - VBORDER);
+}
+
+void Guard::SetDimensions(void)
+{
+equality->SetDimensions();
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     
+      if(textual)
+       {
+       h = Tree_Node::inUseFont()->Height();
+       w = equality->Get_W() + Tree_Node::inUseFont()->Width(" [") + 
Tree_Node::inUseFont()->Width("]");
+       }
+       else {
+           h = equality->Get_H() + 2 * VBORDER;
+           w = equality->Get_W() + 2 * BORDER;
+           }
+ }
+aligline = round(h/2.0);
+}
+
+void Guard::SetFather(Tree_Node *f)
+{
+father = f;
+equality->SetFather(this);
+}
+
+void Guard::SetCollapsed(char t)
+{
+collapsed = t;
+equality->SetCollapsed(t);
+}
+
+
+/*                                                              */
+/*      implementation of class NoExperiment methods            */
+/*                                                              */
+
+
+NoExperiment::NoExperiment()
+{
+type = NO_EXPERIMENT;
+visible = FALSE;
+selectable = FALSE;
+w = 0; h = 0;
+aligline = 0;
+
+Set_Unparser(new Gl_NoExperiment(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+
+}
+
+void NoExperiment::SetPosition(Coord xx, Coord yy)
+{
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "NoExperiment" << x << " " << y << "\n";
+ cout << "NoExperiment" << h << " " << w << "\n";
+#endif
+}
+
+void NoExperiment::SetDimensions(void)
+{ }
+
+void NoExperiment::SetFather(Tree_Node *f)
+{ father = f; }
+
+
+/*                                                              */
+/*      implementation of class Experiment methods              */
+/*                                                              */
+
+
+Experiment::Experiment(Exper_Off_List *e_of_l, Tree_Node *g_op)
+{
+type = EXPERIMENT;
+visible = TRUE;
+selectable = FALSE;
+exp_offer_list = e_of_l;
+guard_option = g_op;
+
+Set_Unparser(new Gl_Experiment(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+
+}
+
+void Experiment::SetPosition(Coord xx, Coord yy)
+{
+
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Experiment" << x << " " << y << "\n";
+ cout << "Experiment" << h << " " << w << "\n";
+#endif
+if (textual)
+       {
+       exp_offer_list->SetPosition(x , y); 
+       guard_option->SetPosition(x + exp_offer_list->Get_W(), y);
+       }
+      else
+       exp_offer_list->SetPosition(x + ROUND_CORNER, y);
+}
+
+void Experiment::SetDimensions(void)
+{
+exp_offer_list->SetDimensions();
+guard_option->SetDimensions();
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     if (textual)
+       {
+       h = Tree_Node::inUseFont()->Height();
+       w = exp_offer_list->Get_W() + guard_option->Get_W();
+       }
+      else {
+          h = exp_offer_list->Get_H();
+          w = exp_offer_list->Get_W() + ROUND_CORNER; 
+          }
+ }
+aligline = round(h/2.0);
+}
+
+void Experiment::SetFather(Tree_Node *f)
+{
+father = f;
+exp_offer_list->SetFather(this);
+guard_option->SetFather(this);
+}
+
+void Experiment::SetCollapsed(char t)
+{
+collapsed = t;
+exp_offer_list->SetCollapsed(t);
+guard_option->SetCollapsed(t);
+}
+
+
+void Experiment::SetTextual(char t, char)
+{
+textual = t;
+guard_option->SetTextual(t);
+}
+
+/*                                                             */
+/*     implementation of class Proc_Inst methods               */
+/*                                                             */
+
+Proc_Inst::Proc_Inst(ID_Place *id, ID_List *g_i_l, Value_Expr_List *v_l)
+{
+Gl_Sheet *sh;
+type = PROCINST;
+visible = TRUE;
+
+ident = id;
+gate_list = g_i_l;
+value_expr_list = v_l;
+
+Set_Unparser(new Gl_Proc_Inst(this));
+sh = (glow->Get_Folder())->Current();
+sh->Add(Get_Unparser());
+sh->SetRoot(this);
+}
+
+void Proc_Inst::SetPosition(Coord xx, Coord yy)
+{
+Coord x1,y1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Proc Inst" << x << " " << y << "\n";
+ cout << "Proc Inst" << h << " " << w << "\n";
+#endif
+
+if ( textual)
+       {
+       ident->SetPosition(x + border,y - border);
+       yp = yl1 = x + ident->Get_W() + border;  /* yp position of [*/  
+       if (gate_list->GetVisible())
+               {
+               x1 = yp + Tree_Node::inUseFont()->Width(" [");
+               gate_list->SetPosition(x1, y - border);
+               yl1 = x1 + gate_list->Get_W();       /* yl1 position of ] */
+               }
+       if (value_expr_list->GetVisible())
+               {
+               Xopen = yl1 + Tree_Node::inUseFont()->Width("] "); /*position 
of ( */
+               x1 = Xopen + Tree_Node::inUseFont()->Width(" (");
+               value_expr_list->SetPosition(x1, y - border);
+               Xclose = x1 + value_expr_list->Get_W(); /*poistion of )*/
+               }
+       }
+
+       else {
+         x1 = x + round((w - gate_list->Get_W()) / 2.0);
+         gate_list->SetPosition(x1,y);
+
+         x1 = x + round((w - ident->Get_W()) / 2.0);
+         yp = y - gate_list->Get_H();
+         y1 = yp  - VBORDER;
+         ident->SetPosition(x1,y1);
+         yl1 = y1 - ident->Get_H() - VBORDER; 
+         x1 = x + round((w - value_expr_list->Get_W()) / 2.0);
+         y1 = yl1  - VBORDER;
+         value_expr_list->SetPosition(x1,y1);
+         }
+
+}
+
+void Proc_Inst::SetDimensions(void)
+{
+ident->SetDimensions();
+gate_list->SetDimensions();
+value_expr_list->SetDimensions();
+border = 0;
+
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:   if(textual)
+                          {
+                          w = Tree_Node::inUseFont()->Width("<Bex>");
+                          h = Tree_Node::inUseFont()->Height();
+                          if(!(father->GetTextual()) && (father->GetType() <= 
PARALLEL))
+                             {border = VBORDER; w += 2 * VBORDER; h += 2 * 
VBORDER; }
+                          }
+                        else {
+                             w = 
round((Tree_Node::inUseFont()->Width("Bex"))*20.0/9.0);
+                             h = 
round((Tree_Node::inUseFont()->Width("Bex"))*14.0/9.0);
+                             }
+                       aligline = round(h/2.0);
+                       break; 
+ case COLLAPSED_INV:   w = 0; h = 0; aligline = 0;
+                       break;
+ case NOCOLLAPSED:     
+     if(textual)
+       {
+       h = Tree_Node::inUseFont()->Height();
+       w = ident->Get_W() + gate_list->Get_W() + value_expr_list->Get_W(); 
+       w += (gate_list->GetVisible())? Tree_Node::inUseFont()->Width(" [") + 
+               Tree_Node::inUseFont()->Width("] "):0; 
+       w += (value_expr_list->GetVisible())? Tree_Node::inUseFont()->Width(" 
(") + 
+               Tree_Node::inUseFont()->Width(") "):0; 
+       if(!(father->GetTextual()) && (father->GetType() <= PARALLEL))
+         {border = VBORDER; w += 2 * VBORDER; h += 2 * VBORDER; }
+       aligline = round(h/2.0);
+       }
+       else {
+         w = Max(ident->Get_W(),value_expr_list->Get_W());
+         w = Max(w, gate_list->Get_W());
+         w += 2 * BORDER;
+         if(value_expr_list->Get_H() != 0)
+           hp = ident->Get_H() + value_expr_list->Get_H() + 4 * VBORDER;
+          else hp = ident->Get_H() + 2 * VBORDER;
+         h = hp + gate_list->Get_H();
+         aligline = gate_list->Get_H() + round(ident->Get_H()/2.0) + VBORDER;
+         }
+ }
+}
+
+void Proc_Inst::SetFather(Tree_Node *f)
+{
+father = f;
+ident->SetFather(this);
+gate_list->SetFather(this);
+value_expr_list->SetFather(this);
+}
+
+void Proc_Inst::SetCollapsed(char t)
+{
+collapsed = t;
+if(t)
+  t = COLLAPSED_INV;
+ident->SetCollapsed(t);
+gate_list->SetCollapsed(t);
+value_expr_list->SetCollapsed(t);
+}
+
+void Proc_Inst::SetTextual(char t, char s)
+{
+textual = t;
+selectable = (!t | s);
+gate_list->SetTextual(t);
+}
+
+
+/*                                                             */ 
+/*     implementation of class Value_Expr methods              */ 
+/*                                                             */ 
+
+Value_Expr::Value_Expr() 
+{ 
+type = VALEXPR; 
+textual = TRUE;
+visible = FALSE; 
+selectable = FALSE;
+w = 0; h = 0;
+aligline = 0;
+
+Set_Unparser(new Gl_Value_Expr(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Value_Expr::SetPosition(Coord xx, Coord yy)
+{
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "ValueExpr" << x << " " << y << "\n";
+ cout << "ValueExpr" << h << " " << w << "\n";
+ cout << "ValueExpr" << visible << " " << collapsed << "\n";
+#endif
+}
+
+void Value_Expr::SetDimensions(void)
+{ }
+
+void Value_Expr::SetFather(Tree_Node *f)
+{ father = f; }
+
+
+/*                                                             */
+/*     implementation of class Value_Expr_List methods         */
+/*                                                             */
+
+Value_Expr_List::Value_Expr_List(Tree_Node *el, Value_Expr_List *nxt)
+{
+type = VALUEEXPRLIST;
+textual = TRUE;
+selectable = FALSE;
+elem = el;
+next = nxt;
+visible = elem->GetVisible();
+
+Set_Unparser(new Gl_Value_Expr_List(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Value_Expr_List::SetPosition(Coord xx, Coord yy)
+{
+Coord x1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "ValueExprList" << x << " " << y << "\n";
+ cout << "ValueExprList" << h << " " << w << "\n";
+#endif
+if(elem != NULL)
+ {
+ elem->SetPosition(x,y);
+ x1 = x + elem->Get_W() + Tree_Node::inUseFont()->Width(", ");
+ if(next != NULL)
+   next->SetPosition(x1,y);
+ }
+}
+
+void Value_Expr_List::SetDimensions(void)
+{
+elem->SetDimensions();
+if(next!=NULL)
+   next->SetDimensions();
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     h = Tree_Node::inUseFont()->Height();
+                       w = (next == NULL || next->next == NULL)? elem->Get_W()
+                               : elem->Get_W() + next->Get_W() + 
Tree_Node::inUseFont()->Width(", ");
+ }
+aligline = round(h/2.0);
+}
+
+void Value_Expr_List::SetFather(Tree_Node *f)
+{
+father = f;
+if(elem != NULL)
+  elem->SetFather(this);
+if(next != NULL)
+  next->SetFather(this);
+}
+
+void Value_Expr_List::SetCollapsed(char t)
+{
+collapsed = t;
+if(elem != NULL)
+  elem->SetCollapsed(t);
+if(next != NULL)
+  next->SetCollapsed(t);
+}
+
+
+/*                                                             */
+/*     implementation of class Sum_Ident methods                       */
+/*                                                             */
+
+
+Sum_Ident::Sum_Ident(Id_Decl_List *i_d_l, Tree_Node *b)
+{
+type = SUM_IDENT;
+visible = TRUE;
+alignement = VER;
+ident_decl_list = i_d_l;
+bex = b;
+
+Set_Unparser(new Gl_Sum_Ident(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Sum_Ident::SetPosition(Coord xx, Coord yy)
+{
+Coord x1,y1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Sum_Ident" << x << " " << y << "\n";
+ cout << "Sum_Ident" << h << " " << w << "\n";
+#endif
+if (textual)
+       {               
+       SetTerminalPos();
+       x1 = Xch + Tree_Node::inUseFont()->Width("choice ");
+       y1 = Ych;
+        ident_decl_list->SetPosition(x1, y1);
+       x1 = x + SMALL_BORDER;
+       y1 = y - ident_decl_list->Get_H() - VBORDER - border;
+       bex->SetPosition(x1, y1);
+       }
+     else {
+       x1 = x + round((w - ident_decl_list->Get_W() - 
+                       2 * LINE_SPACE)/2.0) + BORDER;
+       y1 = y - 2 * VBORDER;
+       ident_decl_list->SetPosition(x1, y1);
+       yl = y1 - 2 * VBORDER - ident_decl_list->Get_H();
+       x1 = x + round((w - bex->Get_W())/2.0);
+       y1 = yl - BORDER; 
+       bex->SetPosition(x1,y1);
+       }
+}
+
+void Sum_Ident::SetDimensions(void)
+
+{
+ident_decl_list->SetDimensions();
+bex->SetDimensions();
+border = 0;
+
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:   if(textual)
+                          {
+                          w = Tree_Node::inUseFont()->Width("<Bex>");
+                          h = Tree_Node::inUseFont()->Height();
+                          if(!(father->GetTextual()) && (father->GetType() <= 
PARALLEL))
+                             {border = VBORDER; w += 2 * VBORDER; h += 2 * 
VBORDER; }
+                          }
+                        else {
+                             w = 
round((Tree_Node::inUseFont()->Width("Bex"))*20.0/9.0);
+                             h = 
round((Tree_Node::inUseFont()->Width("Bex"))*14.0/9.0);
+                             }
+                       break; 
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     
+     if(textual)
+       {
+       h = ident_decl_list->Get_H() + bex->Get_H() +
+                Tree_Node::inUseFont()->Height() + 2 * VBORDER;
+       w = Max4(Tree_Node::inUseFont()->Width("(choice ") +
+                 ident_decl_list->Get_W() + Tree_Node::inUseFont()->Width(" 
[]"),
+                bex->Get_W() + SMALL_BORDER, 
Tree_Node::inUseFont()->Width(")"), 0);
+        if(!(father->GetTextual()) && (father->GetType() <= PARALLEL))
+           {border = VBORDER; w += 2 * VBORDER; h += 2 * VBORDER; }
+       }
+      else {
+          w = Max(ident_decl_list->Get_W() + 2 * LINE_SPACE, bex->Get_W());
+          w += 2*BORDER;
+           h = ident_decl_list->Get_H() + bex->Get_H() + 4*VBORDER + 2*BORDER; 
+           }
+ }
+aligline = round(h/2.0);
+}
+
+void Sum_Ident::SetFather(Tree_Node *f)
+{
+father = f;
+ident_decl_list->SetFather(this);
+bex->SetFather(this);
+}
+
+void Sum_Ident::SetCollapsed(char t)
+{
+collapsed = t;
+if(t)
+  t = COLLAPSED_INV;
+ident_decl_list->SetCollapsed(t);
+bex->SetCollapsed(t);
+}
+
+void Sum_Ident::SetTextual(char t, char s)
+{
+textual = t;
+selectable = (!t | s);
+bex->SetTextual(t);
+}
+
+void Sum_Ident::SetTerminalPos()
+
+/* x, y is the position of (                                   */
+/* Xch, Ych is the position of choice                          */
+/* xl, yl is the position of []                                        */
+/* Xclose, Yclose is the position of )                         */
+{
+Ych = yl = y - border;
+
+Xch = x + Tree_Node::inUseFont()->Width("(") + border; 
+xl = Xch + Tree_Node::inUseFont()->Width("choice ") + ident_decl_list->Get_W();
+Xclose = x + border;
+Yclose = y - ident_decl_list->Get_H() - bex->Get_H() - 2 * VBORDER - border;
+}
+
+
+/*                                                             */
+/*     implementation of class Value methods                   */
+/*                                                             */
+
+Value::Value(ID_Place *i, ID_Place *s)
+{
+type = VALUE;
+textual = TRUE;
+visible = TRUE;
+selectable = FALSE;
+ident = i;
+sort_id = s;
+if(glow->ShowOfSort())
+   sort_id->SetVisible(TRUE);
+ else sort_id->SetVisible(FALSE);
+
+Set_Unparser(new Gl_Value(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+((glow->Get_Folder())->Current())->YesOfSort();
+}
+
+void Value::SetPosition(Coord xx, Coord yy)
+{
+Coord x1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Value" << x << " " << y << "\n";
+ cout << "Value" << h << " " << w << "\n";
+#endif
+ident->SetPosition(x,y);
+x1 = x + ident->Get_W() + Tree_Node::inUseFont()->Width(" of ");
+sort_id->SetPosition(x1,y);
+}
+
+void Value::SetDimensions(void)
+{
+ident->SetDimensions();
+sort_id->SetDimensions();
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     h = Tree_Node::inUseFont()->Height();
+                       if(glow->ShowOfSort())
+                          {
+                          sort_id->SetVisible(TRUE);
+                          w = ident->Get_W() + sort_id->Get_W() + 
Tree_Node::inUseFont()->Width(" of ");
+                          }
+                        else {
+                             w = ident->Get_W();
+                             sort_id->SetVisible(FALSE);
+                             }
+ }
+aligline = round(h/2.0);
+}
+
+void Value::SetFather(Tree_Node *f)
+{
+father = f;
+ident->SetFather(this);
+sort_id->SetFather(this);
+}
+
+void Value::SetCollapsed(char t)
+{
+collapsed = t;
+ident->SetCollapsed(t);
+sort_id->SetCollapsed(t);
+}
+
+
+
+/*                                                             */
+/*     implementation of class Term methods                    */
+/*                                                             */
+
+Term::Term(ID_Place *op, Value_Expr_List *el, ID_Place *s)
+{
+type = TERM;
+textual = TRUE;
+visible = TRUE;
+selectable = FALSE;
+op_ident = op;
+expr_list = el;
+sort_id = s;
+visible = TRUE;
+
+if(glow->ShowOfSort())
+   sort_id->SetVisible(TRUE);
+ else sort_id->SetVisible(FALSE);
+
+Set_Unparser(new Gl_Term(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+((glow->Get_Folder())->Current())->YesOfSort();
+}
+
+void Term::SetPosition(Coord xx, Coord yy)
+{
+Coord x1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Term" << x << " " << y << "\n";
+ cout << "Term" << h << " " << w << "\n";
+#endif
+op_ident->SetPosition(x,y);
+if(expr_list->Get_W() == 0)
+  {
+  x1 = x + op_ident->Get_W();
+  expr_list->SetPosition(x1,y);
+  x1 = x1 + Tree_Node::inUseFont()->Width(" of ");
+  sort_id->SetPosition(x1,y);
+  }
+ else {
+      x1 = x + op_ident->Get_W() + Tree_Node::inUseFont()->Width("(");
+      expr_list->SetPosition(x1,y);
+      x1 = x1 + expr_list->Get_W() + Tree_Node::inUseFont()->Width(") of ");
+      sort_id->SetPosition(x1,y);
+      }
+}
+
+void Term::SetDimensions(void)
+{
+op_ident->SetDimensions();
+expr_list->SetDimensions();
+sort_id->SetDimensions();
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     h = Tree_Node::inUseFont()->Height();
+                       if(glow->ShowOfSort())
+                          {
+                          sort_id->SetVisible(TRUE);
+                          w = op_ident->Get_W() + sort_id->Get_W() + 
Tree_Node::inUseFont()->Width(" of ");
+                          }
+                        else {
+                             w = op_ident->Get_W();
+                             sort_id->SetVisible(FALSE);
+                             }
+                       w = (expr_list->Get_W() == 0)?w : w + 
expr_list->Get_W() + 
+                                         2 * 
Tree_Node::inUseFont()->Width(")");
+ }
+aligline = round(h/2.0);
+}
+
+void Term::SetFather(Tree_Node *f)
+{
+father = f;
+op_ident->SetFather(this);
+expr_list->SetFather(this);
+sort_id->SetFather(this);
+}
+
+void Term::SetCollapsed(char t)
+{
+collapsed = t;
+op_ident->SetCollapsed(t);
+expr_list->SetCollapsed(t);
+sort_id->SetCollapsed(t);
+}
+
+
+
+/*                                                             */ 
+/*     implementation of class Exit_Entry methods              */ 
+/*                                                             */ 
+
+Exit_Entry::Exit_Entry() 
+{ 
+type = EXITENTRY; 
+textual = TRUE;
+visible = FALSE; 
+selectable = FALSE;
+w = 0; h = 0;
+aligline = 0;
+
+Set_Unparser(new Gl_Exit_Entry(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Exit_Entry::SetPosition(Coord xx, Coord yy)
+{
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "ValueExpr" << x << " " << y << "\n";
+ cout << "ValueExpr" << h << " " << w << "\n";
+ cout << "ValueExpr" << visible << " " << collapsed << "\n";
+#endif
+}
+
+void Exit_Entry::SetDimensions(void)
+{ }
+
+void Exit_Entry::SetFather(Tree_Node *f)
+{ father = f; }
+
+
+/*                                                             */
+/*     implementation of class Exit_Entry_List methods         */
+/*                                                             */
+
+Exit_Entry_List::Exit_Entry_List(Tree_Node *el, Exit_Entry_List *nxt)
+{
+type = EXITENTRYLIST;
+selectable = FALSE;
+elem = el;
+next = nxt;
+visible = elem->GetVisible();
+
+Set_Unparser(new Gl_Exit_Entry_List(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Exit_Entry_List::SetPosition(Coord xx, Coord yy)
+{
+Coord x1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "ExitEntryList" << x << " " << y << "\n";
+ cout << "ExitEntryList" << h << " " << w << "\n";
+ cout << "ExitEntryList" << visible << " " << collapsed << "\n";
+#endif
+if(elem != NULL)
+ {
+ elem->SetPosition(x,y);
+ x1 = x + elem->Get_W() + Tree_Node::inUseFont()->Width(", ");
+ if(next != NULL)
+   next->SetPosition(x1,y);
+ }
+}
+
+void Exit_Entry_List::SetDimensions(void)
+{
+elem->SetDimensions();
+if(next!=NULL)
+   next->SetDimensions();
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     h = Tree_Node::inUseFont()->Height();
+                        w = (next == NULL || next->next == NULL)? elem->Get_W()
+                           : elem->Get_W() + next->Get_W() + 
Tree_Node::inUseFont()->Width(", ");
+ }
+aligline = round(h/2.0);
+}
+
+void Exit_Entry_List::SetFather(Tree_Node *f)
+{
+father = f;
+if(elem != NULL)
+  elem->SetFather(this);
+if(next != NULL)
+  next->SetFather(this);
+}
+
+void Exit_Entry_List::SetCollapsed(char t)
+{
+collapsed = t;
+if(elem != NULL)
+  elem->SetCollapsed(t);
+if(next != NULL)
+  next->SetCollapsed(t);
+}
+
+
+
+/*                                                             */
+/*     implementation of class Sum_Gate methods                        */
+/*                                                             */
+
+Sum_Gate::Sum_Gate(Gate_Decl_List *g_d_l, Tree_Node *b)
+{
+type = SUM_GATE;
+visible = TRUE;
+alignement = VER;
+gate_decl_list = g_d_l;
+bex = b;
+Set_Unparser(new Gl_Sum_Gate(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Sum_Gate::SetPosition(Coord xx, Coord yy)
+{
+Coord x1,y1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Sum_Gate" << x << " " << y << "\n";
+ cout << "Sum_Gate" << h << " " << w << "\n";
+#endif
+
+if (textual)
+       {               
+       SetTerminalPos();
+       x1 = Xch + Tree_Node::inUseFont()->Width("choice ");
+       y1 = Ych;
+        gate_decl_list->SetPosition(x1, y1);
+       x1 = x + SMALL_BORDER + border;
+       y1 = y - gate_decl_list->Get_H() - VBORDER - border;
+       bex->SetPosition(x1, y1);
+       }
+     else {
+       x1 = x + round((w - gate_decl_list->Get_W() - 2 * LINE_SPACE)/2.0) 
+                       + BORDER;
+       y1 = y - 2 * VBORDER;
+
+       gate_decl_list->SetPosition(x1, y1);
+
+       yl = y1 - 2 * VBORDER - gate_decl_list->Get_H();
+
+       y1 = yl - BORDER; 
+       x1 = x + round((w - bex->Get_W())/2.0);
+       bex->SetPosition(x1,y1);
+       }
+
+}
+
+void Sum_Gate::SetDimensions(void)
+{
+gate_decl_list->SetDimensions();
+bex->SetDimensions();
+border = 0;
+
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:   if(textual)
+                          {
+                          w = Tree_Node::inUseFont()->Width("<Bex>");
+                          h = Tree_Node::inUseFont()->Height();
+                          if(!(father->GetTextual()) && (father->GetType() <= 
PARALLEL))
+                             {border = VBORDER; w += 2 * VBORDER; h += 2 * 
VBORDER; }
+                          }
+                        else {
+                             w = 
round((Tree_Node::inUseFont()->Width("Bex"))*20.0/9.0);
+                             h = 
round((Tree_Node::inUseFont()->Width("Bex"))*14.0/9.0);
+                             }
+                       break; 
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     
+     if(textual)
+       {
+       h = gate_decl_list->Get_H() + bex->Get_H() +
+                Tree_Node::inUseFont()->Height() + 2 * VBORDER;
+       w = Max4(Tree_Node::inUseFont()->Width("(choice ") +
+               gate_decl_list->Get_W() + Tree_Node::inUseFont()->Width(" []"),
+               bex->Get_W() + SMALL_BORDER, 
Tree_Node::inUseFont()->Width(")"), 0);
+        if(!(father->GetTextual()) && (father->GetType() <= PARALLEL))
+           {border = VBORDER; w += 2 * VBORDER; h += 2 * VBORDER; }
+       }
+     else {
+         w =  Max(gate_decl_list->Get_W() + 2 * LINE_SPACE, bex->Get_W());
+         w += 2*BORDER;
+         h = gate_decl_list->Get_H() + bex->Get_H() + 4*VBORDER + 2*BORDER; 
+         }
+ }
+aligline = round(h/2.0);
+}
+
+void Sum_Gate::SetFather(Tree_Node *f)
+{
+father = f;
+gate_decl_list->SetFather(this);
+bex->SetFather(this);
+}
+
+void Sum_Gate::SetCollapsed(char t)
+{
+collapsed = t;
+if(t)
+  t = COLLAPSED_INV;
+gate_decl_list->SetCollapsed(t);
+bex->SetCollapsed(t);
+}
+
+void Sum_Gate::SetTextual(char t, char s)
+{
+textual = t;
+selectable = (!t | s);
+bex->SetTextual(t);
+}
+
+void Sum_Gate::SetTerminalPos()
+
+/* x, y is the position of (                                    */
+/* Xch, Ych is the position of choice                           */
+/* xl, yl is the position of []                                 */
+/* Xclose, Yclose is the position of )                          */
+{
+Ych = yl = y;
+
+Xch = x + Tree_Node::inUseFont()->Width("(") + border;
+xl = Xch + Tree_Node::inUseFont()->Width("choice ") + gate_decl_list->Get_W();
+Xclose = x + border;
+Yclose = y - gate_decl_list->Get_H() - bex->Get_H() - 2 * VBORDER - border;
+}
+
+
+
+/*                                                             */
+/*     implementation of class Gate_Decl methods                       */
+/*                                                             */
+
+Gate_Decl::Gate_Decl(ID_List *g_id_l1, ID_List *g_id_l2)
+{
+type = GATE_DECL;
+textual = TRUE;
+selectable = FALSE;
+gate_id_list1 = g_id_l1;
+gate_id_list2 = g_id_l2;
+
+if(g_id_l1 == NULL)
+  gate_id_list1 = new ID_List(new ID_Place(),NULL);
+if(g_id_l2 == NULL)
+  gate_id_list2 = new ID_List(new ID_Place(), NULL);
+visible = (gate_id_list1->GetVisible() && gate_id_list2->GetVisible());
+
+Set_Unparser(new Gl_Gate_Decl(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Gate_Decl::SetPosition(Coord xx, Coord yy)
+{
+Coord x1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Gate_Decl" << x << " " << y << "\n";
+ cout << "Gate_Decl" << h << " " << w << "\n";
+#endif
+if(gate_id_list1 != NULL)
+ {
+ gate_id_list1->SetPosition(x,y);
+ x1 = x + gate_id_list1->Get_W() + Tree_Node::inUseFont()->Width(" in [");
+ if(gate_id_list2 != NULL)
+   gate_id_list2->SetPosition(x1,y);
+ }
+}
+
+void Gate_Decl::SetDimensions(void)
+{
+gate_id_list1->SetDimensions();
+gate_id_list2->SetDimensions();
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     h = Tree_Node::inUseFont()->Height();
+                       w = (visible)? gate_id_list1->Get_W() + 
gate_id_list2->Get_W()
+                               + Tree_Node::inUseFont()->Width("in []  ") : 0;
+ }
+aligline = round(h/2.0);
+}
+
+void Gate_Decl::SetFather(Tree_Node *f)
+{
+father = f;
+if(gate_id_list1 != NULL)
+  gate_id_list1->SetFather(this);
+if(gate_id_list2 != NULL)
+  gate_id_list2->SetFather(this);
+}
+
+void Gate_Decl::SetCollapsed(char t)
+{
+collapsed = t;
+if(gate_id_list1 != NULL)
+  gate_id_list1->SetCollapsed(t);
+if(gate_id_list2 != NULL)
+  gate_id_list2->SetCollapsed(t);
+}
+
+
+/*                                                             */
+/*     implementation of class Gate_Decl_List methods          */
+/*                                                             */
+
+Gate_Decl_List::Gate_Decl_List(Gate_Decl *el, Gate_Decl_List *nxt)
+{
+type = GATE_DECL_LIST;
+textual = TRUE;
+selectable = FALSE;
+elem = el;
+next = nxt;
+visible = elem->GetVisible();
+
+Set_Unparser(new Gl_Gate_Decl_List(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Gate_Decl_List::SetPosition(Coord xx, Coord yy)
+{
+Coord x1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Gate_Decl_List" << x << " " << y << "\n";
+ cout << "Gate_Decl_List" << h << " " << w << "\n";
+#endif
+if(elem != NULL)
+ {
+ elem->SetPosition(x,y);
+ x1 = x + elem->Get_W() + Tree_Node::inUseFont()->Width(", ");
+ if(next != NULL)
+   next->SetPosition(x1,y);
+ }
+}
+
+void Gate_Decl_List::SetDimensions(void)
+{
+elem->SetDimensions();
+if(next!=NULL)
+   next->SetDimensions();
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     h = Tree_Node::inUseFont()->Height();
+                       w = (next == NULL || next->next == NULL)? elem->Get_W()
+                            : elem->Get_W() + next->Get_W() + 
Tree_Node::inUseFont()->Width(", ");
+ }
+aligline = round(h/2.0);
+}
+
+void Gate_Decl_List::SetFather(Tree_Node *f)
+{
+father = f;
+if(elem != NULL)
+  elem->SetFather(this);
+if(next != NULL)
+  next->SetFather(this);
+}
+
+void Gate_Decl_List::SetCollapsed(char t)
+{
+collapsed = t;
+if(elem != NULL)
+  elem->SetCollapsed(t);
+if(next != NULL)
+  next->SetCollapsed(t);
+}
+
+
+
+/*                                                             */
+/*     implementation of class Par methods                     */
+/*                                                             */
+
+Par::Par(Gate_Decl_List *g_d_l, Tree_Node *op, Tree_Node *b)
+{
+type = PAR;
+visible = TRUE;
+alignement = VER;
+gate_decl_list = g_d_l;
+bex = b;
+oper = op;
+if (textual)
+ oper->SetVisible(TRUE);
+  else {
+       oper->SetVisible(FALSE);
+       if(oper->GetType() == GEN_PARAL)
+            oper->SetVisible(TRUE);
+       }
+
+Set_Unparser(new Gl_Par(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Par::SetPosition(Coord xx, Coord yy)
+{
+Coord x1,y1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Par" << x << " " << y << "\n";
+ cout << "Par" << h << " " << w << "\n";
+#endif
+
+if (textual)
+       {                       
+       x1 = x + Tree_Node::inUseFont()->Width("(par ") + border;
+       gate_decl_list->SetPosition(x1, y - border);
+       x1 = x1 + gate_decl_list->Get_W();
+       oper->SetPosition(x1, y - border);
+       y1 = y - gate_decl_list->Get_H() - VBORDER - border;
+       x1 = x + SMALL_BORDER + border;
+       bex->SetPosition(x1, y1);
+       xl = x + border;
+       yl = y1 - bex->Get_H() - VBORDER;
+       }
+     else {
+       if(oper->GetType() == GEN_PARAL)
+         {
+         x1 = x + SMALL_BORDER;
+         y1 = y - ROUND_CORNER;
+         oper->SetPosition(x1,y1);
+         x1 = x1 + oper->Get_W() + BORDER; 
+         y1 = y1 - ROUND_CORNER;
+         gate_decl_list->SetPosition(x1,y1); 
+         yl = y1 - gate_decl_list->Get_H() - 2 * ROUND_CORNER;
+         y1 = yl - BORDER;
+         x1 = x + round((w - bex->Get_W())/2.0);
+         bex->SetPosition(x1,y1);
+         }
+        else {
+             x1 = x + round((w - gate_decl_list->Get_W() - 2 * 
LINE_SPACE)/2.0)                                + BORDER;
+             y1 = y - 2 * VBORDER;
+             gate_decl_list->SetPosition(x1, y1);
+             yl = y1 - 2 * VBORDER - gate_decl_list->Get_H();
+             x1 = x + round((w - bex->Get_W())/2.0);
+             y1 = yl - BORDER; 
+             bex->SetPosition(x1,y1);
+             }
+       }
+}
+
+void Par::SetDimensions(void)
+{
+bex->SetDimensions();
+oper->SetDimensions();
+gate_decl_list->SetDimensions();
+border = 0;
+
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:   if(textual)
+                          {
+                          w = Tree_Node::inUseFont()->Width("<Bex>");
+                          h = Tree_Node::inUseFont()->Height();
+                          if(!(father->GetTextual()) && (father->GetType() <= 
PARALLEL))
+                             {border = VBORDER; w += 2 * VBORDER; h += 2 * 
VBORDER; }
+                          }
+                        else {
+                             w = 
round((Tree_Node::inUseFont()->Width("Bex"))*20.0/9.0);
+                             h = 
round((Tree_Node::inUseFont()->Width("Bex"))*14.0/9.0);
+                             }
+                       break; 
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     
+     if(textual)
+       {
+       h = gate_decl_list->Get_H() + bex->Get_H() + 
Tree_Node::inUseFont()->Height() +
+              2 * VBORDER; 
+       w = Max4(Tree_Node::inUseFont()->Width("(par ") + 
gate_decl_list->Get_W() +
+                oper->Get_W(), bex->Get_W(),
+               Tree_Node::inUseFont()->Width(")"), 0);
+       if(!(father->GetTextual()) && (father->GetType() <= PARALLEL))
+         {border = VBORDER; w += 2 * VBORDER; h += 2 * VBORDER; }
+       }
+      else {
+          if(oper->GetType() == GEN_PARAL)
+            {
+            w = Max(bex->Get_W(), oper->Get_W() + gate_decl_list->Get_W() 
+                                     + 2 * BORDER + SMALL_BORDER);
+            h = gate_decl_list->Get_H() + bex->Get_H() + 2*BORDER + 
+                       4*ROUND_CORNER; 
+            }
+           else {
+                w =  Max(gate_decl_list->Get_W() + 2 * LINE_SPACE, 
bex->Get_W());
+                w += 2*BORDER;
+                h = gate_decl_list->Get_H() + bex->Get_H() + 4*VBORDER + 
2*BORDER; 
+                 }
+       }
+ }
+aligline = round(h/2.0);
+}
+
+void Par::SetFather(Tree_Node *f)
+{
+father = f;
+gate_decl_list->SetFather(this);
+bex->SetFather(this);
+oper->SetFather(this);
+}
+
+void Par::SetCollapsed(char t)
+{
+collapsed = t;
+if(t)
+  t = COLLAPSED_INV;
+gate_decl_list->SetCollapsed(t);
+bex->SetCollapsed(t);
+oper->SetCollapsed(t);
+}
+
+
+void Par::SetTextual(char t, char s)
+{
+textual = t;
+selectable = (!t | s);
+gate_decl_list->SetTextual(t);
+bex->SetTextual(t);
+oper->SetTextual(t);
+}
+
+/*                                                             */
+/*     implementation of class Sort_Id_Exit methods            */
+/*                                                             */
+
+Sort_Id_Exit::Sort_Id_Exit(ID_Place *s)
+{
+type = SORTIDEXIT;
+textual = TRUE;
+selectable = FALSE;
+sort_id = s;
+visible = TRUE;
+
+Set_Unparser(new Gl_Sort_Id_Exit(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Sort_Id_Exit::SetPosition(Coord xx, Coord yy)
+{
+Coord x1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Sort_Id_Exit" << x << " " << y << "\n";
+ cout << "Sort_Id_Exit" << h << " " << w << "\n";
+#endif
+x1 = x + Tree_Node::inUseFont()->Width("any ");
+sort_id->SetPosition(x1,y);
+}
+
+void Sort_Id_Exit::SetDimensions(void)
+{
+sort_id->SetDimensions();
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     h = Tree_Node::inUseFont()->Height();
+                       w = sort_id->Get_W() + 
Tree_Node::inUseFont()->Width("any ");
+ }
+aligline = round(h/2.0);
+}
+
+void Sort_Id_Exit::SetFather(Tree_Node *f)
+{
+father = f;
+sort_id->SetFather(this);
+}
+
+void Sort_Id_Exit::SetCollapsed(char t)
+{
+collapsed = t;
+sort_id->SetCollapsed(t);
+}
+
+
+/*                                                              */
+/*      implementation of class Equality methods               */
+/*                                                              */
+
+Equality::Equality()
+{
+type = EQUALITY;
+textual = TRUE;
+selectable = FALSE;
+visible = FALSE;
+express1 = NULL;
+express2 = NULL;
+
+Set_Unparser(new Gl_Equality(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+Equality::Equality(Tree_Node *ex1, Tree_Node *ex2)
+{
+type = EQUALITY;
+textual = TRUE;
+visible = TRUE;
+selectable = FALSE;
+express1 = ex1;
+express2 = ex2;
+
+Set_Unparser(new Gl_Equality(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Equality::SetPosition(Coord xx, Coord yy)
+{
+Coord x1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Equality" << x << " " << y << "\n";
+ cout << "Equality" << h << " " << w << "\n";
+#endif
+if(visible)
+  {
+  express1->SetPosition(x, y);
+  x1 = x + express1->Get_W() + Tree_Node::inUseFont()->Width(" = ");
+  express2->SetPosition(x1, y);
+  }
+}
+
+void Equality::SetDimensions(void)
+{
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     
+     if(visible)
+       {
+       express1->SetDimensions();
+       express2->SetDimensions();
+       h = express1->Get_H();
+       w = express1->Get_W() + express2->Get_W() + 
Tree_Node::inUseFont()->Width(" = ");
+       }
+      else { h = 0; w = 0; }
+ }
+aligline = round(h/2.0);
+}
+
+void Equality::SetFather(Tree_Node *f)
+{
+father = f;
+if(visible)
+   {
+   express1->SetFather(this);
+   express2->SetFather(this);
+   }
+}
+
+void Equality::SetCollapsed(char t)
+{
+collapsed = t;
+express1->SetCollapsed(t);
+express2->SetCollapsed(t);
+}
+
+
+
+/*                                                              */
+/*      implementation of class Guarded methods                */
+/*                                                              */
+
+
+Guarded::Guarded(Equality *eq, Tree_Node *b)
+{
+type = GUARDED;
+visible = TRUE;
+alignement = VER;
+equality = eq;
+bex = b;
+
+Set_Unparser(new Gl_Guarded(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Guarded::SetPosition(Coord xx, Coord yy)
+{
+Coord x1, y1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Guarded" << x << " " << y << "\n";
+ cout << "Guarded" << h << " " << w << "\n";
+#endif
+if (textual)
+       {
+       x1 = x + Tree_Node::inUseFont()->Width("[") + border;
+       equality->SetPosition(x1, y - border);
+       Xclose = x1 + equality->Get_W();        /*position of ] -> */
+       y1 = y - equality->Get_H() - VBORDER - border;
+       x1 = x + SMALL_BORDER + border;
+       bex->SetPosition(x1, y1);
+       }
+     else {    
+       y1 = y - VBORDER;
+       x1 = x + round((w - equality->Get_W())/2.0);
+       equality->SetPosition(x1, y1);
+       y1 = y1 - equality->Get_H() -  VBORDER - BORDER;
+       x1 = x + round((w - bex->Get_W())/2.0);
+       bex->SetPosition(x1, y1);
+       }
+}
+
+void Guarded::SetDimensions(void)
+{
+equality->SetDimensions();
+bex->SetDimensions();
+border = 0;
+
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:   if(textual)
+                          {
+                          w = Tree_Node::inUseFont()->Width("<Bex>");
+                          h = Tree_Node::inUseFont()->Height();
+                          if(!(father->GetTextual()) && (father->GetType() <= 
PARALLEL))
+                             {border = VBORDER; w += 2 * VBORDER; h += 2 * 
VBORDER; }
+                          }
+                        else {
+                             w = 
round((Tree_Node::inUseFont()->Width("Bex"))*20.0/9.0);
+                             h = 
round((Tree_Node::inUseFont()->Width("Bex"))*14.0/9.0);
+                             }
+                       break; 
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     
+     if(textual)
+       {
+       h = equality->Get_H() + bex->Get_H() + VBORDER;
+
+       w = Max(equality->Get_W() + Tree_Node::inUseFont()->Width("[") +
+                    Tree_Node::inUseFont()->Width("] -> "), bex->Get_W());
+       if(!(father->GetTextual()) && (father->GetType() <= PARALLEL))
+         {border = VBORDER; w += 2 * VBORDER; h += 2 * VBORDER; }
+       }
+      else {
+          h = equality->Get_H() + bex->Get_H() + 2 * VBORDER + 2 * BORDER;
+          w = Max(equality->Get_W(), bex->Get_W() + 2 * BORDER);
+          w +=  2 * BORDER;
+          }
+ }
+aligline = round(h/2.0);
+}
+
+void Guarded::SetFather(Tree_Node *f)
+{
+father = f;
+equality->SetFather(this);
+bex->SetFather(this);
+}
+
+void Guarded::SetCollapsed(char t)
+{
+collapsed = t;
+if(t)
+  t = COLLAPSED_INV;
+equality->SetCollapsed(t);
+bex->SetCollapsed(t);
+}
+
+
+void Guarded::SetTextual(char t, char s)
+{
+textual = t;
+selectable = (!t | s);
+bex->SetTextual(t);
+}
+
+/*                                                              */
+/*      implementation of class Exper_Off methods               */
+/*                                                              */
+
+Exper_Off::Exper_Off()
+{
+type = EXPER_OFF;
+textual = TRUE;
+visible = FALSE;
+selectable = FALSE;
+w = 0; h = 0;
+aligline = 0;
+
+Set_Unparser(new Gl_Exper_Off(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Exper_Off::SetPosition(Coord xx, Coord yy)
+{
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "ExperOffer" << x << " " << y << "\n";
+ cout << "ExperOffer" << h << " " << w << "\n";
+#endif
+}
+
+void Exper_Off::SetDimensions(void)
+{ }
+
+void Exper_Off::SetFather(Tree_Node *f)
+{ father = f; }
+
+
+/*                                                              */
+/*      implementation of class Exper_Off_List methods          */
+/*                                                              */
+
+Exper_Off_List::Exper_Off_List(Exper_Off *el, Exper_Off_List *nxt)
+{
+type = EXPER_OFF_L;
+textual = TRUE;
+selectable = FALSE;
+elem = el;
+next = nxt;
+visible = elem->GetVisible();
+
+Set_Unparser(new Gl_Exper_Off_List(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+}
+
+void Exper_Off_List::SetPosition(Coord xx, Coord yy)
+{
+Coord x1;
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Exper_Off_List" << x << " " << y << "\n";
+ cout << "Exper_Off_List" << h << " " << w << "\n";
+#endif
+if(elem != NULL)
+ {
+ elem->SetPosition(x,y);
+ x1 = x + elem->Get_W() + Tree_Node::inUseFont()->Width(", ");
+ if(next != NULL)
+   next->SetPosition(x1,y);
+ }
+}
+
+void Exper_Off_List::SetDimensions(void)
+{
+elem->SetDimensions();
+if(next!=NULL)
+   next->SetDimensions();
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     h = Tree_Node::inUseFont()->Height();
+                       w = (next == NULL || next->next == NULL)? elem->Get_W()
+                            : elem->Get_W() + next->Get_W() + 
Tree_Node::inUseFont()->Width(", ");
+ }
+aligline = round(h/2.0);
+}
+
+void Exper_Off_List::SetFather(Tree_Node *f)
+{
+father = f;
+if(elem != NULL)
+  elem->SetFather(this);
+if(next != NULL)
+  next->SetFather(this);
+}
+
+void Exper_Off_List::SetCollapsed(char t)
+{
+collapsed = t;
+if(elem != NULL)
+  elem->SetCollapsed(t);
+if(next != NULL)
+  next->SetCollapsed(t);
+}
+
+
+/*                                                              */
+/*      implementation of class Exclam methods               */
+/*                                                              */
+
+
+Exclam::Exclam(Tree_Node *v_e)
+{
+type = EXCLAM;
+textual = TRUE;
+selectable = FALSE;
+value_exp = v_e;
+visible = TRUE;
+
+Set_Unparser(new Gl_Exclam(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+
+}
+
+void Exclam::SetPosition(Coord xx, Coord yy)
+{
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Exclam" << x << " " << y << "\n";
+ cout << "Exclam" << h << " " << w << "\n";
+#endif
+
+value_exp->SetPosition(x + Tree_Node::inUseFont()->Width("!"),y);
+}
+
+void Exclam::SetDimensions(void)
+{
+value_exp->SetDimensions();
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     h = value_exp->Get_H();
+                       w = value_exp->Get_W() + 
Tree_Node::inUseFont()->Width("!");
+ }
+aligline = round(h/2.0);
+}
+
+void Exclam::SetFather(Tree_Node *f)
+{
+father = f;
+value_exp->SetFather(this);
+}
+
+void Exclam::SetCollapsed(char t)
+{
+collapsed = t;
+value_exp->SetCollapsed(t);
+}
+
+
+/*                                                              */
+/*      implementation of class Query methods               */
+/*                                                              */
+
+
+Query::Query(Id_Decl *i_d)
+{
+type = QUERY;
+textual = TRUE;
+selectable = FALSE;
+id_decl = i_d;
+visible = TRUE;
+
+Set_Unparser(new Gl_Query(this));
+((glow->Get_Folder())->Current())->Add(Get_Unparser());
+
+}
+
+void Query::SetPosition(Coord xx, Coord yy)
+{
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Query" << x << " " << y << "\n";
+ cout << "Query" << h << " " << w << "\n";
+#endif
+
+id_decl->SetPosition(x + Tree_Node::inUseFont()->Width("?"),y );
+}
+
+void Query::SetDimensions(void)
+{
+id_decl->SetDimensions();
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     h = id_decl->Get_H();
+                       w = id_decl->Get_W() + 
Tree_Node::inUseFont()->Width("?");
+ }
+aligline = round(h/2.0);
+}
+
+void Query::SetFather(Tree_Node *f)
+{
+father = f;
+id_decl->SetFather(this);
+}
+
+void Query::SetCollapsed(char t)
+{
+collapsed = t;
+id_decl->SetCollapsed(t);
+}
+
+
+/*                                                              */
+/*      implementation of class Definition                      */
+/*                                                              */
+
+Definition::Definition(Tree_Node *b, Proc_List *p, Data_List *d)
+{
+selectable = FALSE;
+bex = b;
+process_list = p;
+data_list = d;
+
+type = DEFINITION;
+visible = TRUE;
+
+}
+
+void Definition::SetPosition(Coord xx, Coord yy)
+{
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "Definition" << x << " " << y << "\n";
+ cout << "Definition" << h << " " << w << "\n";
+#endif
+bex->SetPosition(x, y);
+}
+
+void Definition::SetDimensions(void)
+{
+bex->SetDimensions();
+switch(collapsed)
+ {
+ case COLLAPSED_VIS:
+ case COLLAPSED_INV:   w = 0; h = 0;
+                       break;
+ case NOCOLLAPSED:     h = bex->Get_H();
+                       w = bex->Get_W();
+ }
+aligline = round(h/2.0);
+}
+
+void Definition::SetFather(Tree_Node *f)
+{
+father = f;
+bex->SetFather(this);
+if(process_list != NULL)
+   process_list->SetFather(this);
+if(data_list != NULL)
+   data_list->SetFather(this);
+}
+
+
+void Definition::SetPath(char *p, char n, int& np, int& nd)
+{
+strcpy(path,p);
+if(process_list != NULL)
+  process_list->SetPath(path, n, np, nd);
+if(data_list != NULL)
+  data_list->SetPath(path, n, np, nd);
+}
+
+/*                                                             */
+/*     implementation of class Proc_List methods               */
+/*                                                             */
+
+Proc_List::Proc_List(Process *el, Proc_List *nxt)
+{
+type = PROCLIST;
+selectable = FALSE;
+elem = el;
+next = nxt;
+visible = TRUE;
+}
+
+void Proc_List::SetPosition(Coord xx, Coord yy)
+{
+x = xx;
+y = yy;
+#ifdef DEBUG
+ cout << "ProcList" << x << " " << y << "\n";
+ cout << "ProcList" << h << " " << w << "\n";
+#endif
+}
+
+void Proc_List::SetDimensions(void)
+{
+h = 0; w = 0; 
+aligline = round(h/2.0);
+}
+
+void Proc_List::SetFather(Tree_Node *f)
+{
+father = f;
+if(elem != NULL)
+  elem->SetFather(this);
+if(next != NULL)
+  next->SetFather(this);
+}
+
+void Proc_List::SetPath(char *p, char n, int& np, int& nd)
+{
+if(elem != NULL)
+  elem->SetPath(p, n, np, nd);
+if(next != NULL)
+  next->SetPath(p, n, np, nd);
+}
+
+char *Proc_List::GetPath()
+{
+if(father->GetType() == PROCLIST)
+  return(((Proc_List *)father)->GetPath());
+
+if(father->GetType() == DEFINITION)
+  return(((Definition *)father)->GetPath());
+ else return(" ");
+}
diff --git a/test/etags/cp-src/abstract.H b/test/etags/cp-src/abstract.H
new file mode 100644
index 0000000..05d71cb
--- /dev/null
+++ b/test/etags/cp-src/abstract.H
@@ -0,0 +1,993 @@
+/*****************************************************************************
+
+  Copyright (c) 1992 Consorzio Pisa Ricerche.
+  Authors: Caneve Maurizio, Salvatori Elena
+
+  This software was produced under the ESPRIT/LOTOSPHERE
+  project. All rights reserved.
+
+*****************************************************************************/
+
+/*                                                                     */
+/*      @(#)abstract.h 4.31  2/1/93                                    */
+/*                                                                     */
+
+#ifndef abstract_hh
+#define abstract_hh
+
+#include <tree.h>
+#include <adatat.h>
+
+class SignatureSorts;
+
+class ID_Place: public Tree_Node
+{
+       char *str;
+       char RBubble;   
+
+friend class Gl_Identifier;
+
+public:
+ ID_Place();
+ void  SetIdent(char *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetVisible(char);
+ void SetFather(Tree_Node *);
+ void ClearID(void);
+ virtual ~ID_Place();
+
+/* inline functions            */
+ char *GetIdent() {return(str);};
+ void SetRBubble(char r) { RBubble = r; };
+ char GetRBubble(void) { return(RBubble); };
+}; /* end of class ID_Place    */
+
+
+class ID_List: public Tree_Node
+{
+       ID_Place *elem;
+       ID_List *next;
+
+friend class Gl_Id_List;
+friend class Oper;
+
+public:
+
+ ID_List(ID_Place *, ID_List *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ ID_Place *GetElem();
+ void HideMe(void);
+ void SetCollapsed(char);
+ void SetRBubble(char);
+ void BuildSigSorts(char, SignatureSorts **, char, Oper *);
+ void SetVisible(char);
+ void SetAlignement(char);
+ void ClearIDs(void);
+ int GetCardinality(int);
+}; /* end of class ID_List     */
+
+
+class Id_Decl: public Tree_Node
+{
+       ID_List *id_list;
+       ID_Place *sort_id;
+
+friend class Gl_Id_Decl;
+
+public:
+ Id_Decl(ID_List *, ID_Place *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetCollapsed(char);
+}; /* end of class Id_Decl */
+
+
+class Id_Decl_List: public Tree_Node
+{
+       Id_Decl *elem;
+       Id_Decl_List *next;
+
+friend class Gl_Id_Decl_List;
+
+public:
+ Id_Decl_List(Id_Decl *, Id_Decl_List *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetCollapsed(char);
+}; /* end of class Id_Decl_List        */
+
+
+class Comment: public Tree_Node
+{
+       char *comm;
+
+friend class Gl_Comment;
+
+public:
+ Comment();
+ Comment(Tree_Node*, Coord , Coord);
+ void SetComment(char *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ virtual ~Comment();
+}; /* end of class Comment     */
+
+
+class Comment_List: public Tree_Node
+{
+       Comment *elem;
+       Comment_List *next;
+
+public:
+ Comment_List(Comment *, Comment_List *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+}; /* end of class Comment_List        */
+
+
+class Value_Expr: public Tree_Node
+{
+
+friend class Gl_Value_Expr;
+
+public:
+ Value_Expr();
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+
+}; /* end of class Value_Expr  */
+
+
+class Value_Expr_List: public Tree_Node
+{
+       Tree_Node *elem;
+       Value_Expr_List *next;
+
+friend class Gl_Value_Expr_List;
+
+public:
+ Value_Expr_List(Tree_Node *, Value_Expr_List *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetCollapsed(char);
+}; /* end of class Value_Expr_List     */
+
+
+class Exit_Entry: public Tree_Node
+{
+
+friend class Gl_Exit_Entry;
+
+public:
+ Exit_Entry();
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+
+}; /* end of class Exit_Entry  */
+
+
+class Exit_Entry_List: public Tree_Node
+{
+       Tree_Node *elem;
+       Exit_Entry_List *next;
+
+friend class Gl_Exit_Entry_List;
+
+public:
+ Exit_Entry_List(Tree_Node *, Exit_Entry_List *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetCollapsed(char);
+}; /* end of class Exit_Entry_List     */
+
+
+class Exper_Off: public Tree_Node
+{
+
+public:
+ Exper_Off();
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+
+}; /* end of class Exper_Off */
+
+
+class Exper_Off_List: public Tree_Node
+{
+        Exper_Off *elem;
+        Exper_Off_List *next;
+
+friend class Gl_Exper_Off_List;
+
+public:
+ Exper_Off_List(Exper_Off *, Exper_Off_List *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetCollapsed(char);
+}; /* end of class Exper_Off_List      */
+
+
+class Gate_Decl: public Tree_Node
+{
+       ID_List *gate_id_list1;
+       ID_List *gate_id_list2;
+
+friend class Gl_Gate_Decl;
+
+public:
+ Gate_Decl(ID_List *, ID_List *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetCollapsed(char);
+}; /* end of class Gate_Decl */
+
+
+class Gate_Decl_List: public Tree_Node
+{
+       Gate_Decl *elem;
+       Gate_Decl_List *next;
+
+friend class Gl_Gate_Decl_List;
+
+public:
+ Gate_Decl_List(Gate_Decl *, Gate_Decl_List *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetCollapsed(char);
+}; /* end of class Gate_Decl_List */
+
+
+class Ident_Eq: public Tree_Node
+{
+        Id_Decl *iddecl;
+        Value_Expr *expr;
+
+friend class Gl_Ident_Eq;
+
+public:
+ Ident_Eq(Id_Decl *,  Value_Expr *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetCollapsed(char);
+}; /* end of class Ident_Eq      */
+
+
+class Ident_Eq_List: public Tree_Node
+{
+        Ident_Eq *elem;
+        Ident_Eq_List *next;
+
+friend class Gl_Ident_Eq_List;
+
+public:
+ Ident_Eq_List(Ident_Eq *, Ident_Eq_List *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetCollapsed(char);
+}; /* end of class Ident_Eq_List      */
+
+
+class Half_Container: public Tree_Node
+{
+       ID_List *gate_list;
+
+friend class Gl_Half_Container;
+
+public:
+ Half_Container(ID_List *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetCollapsed(char);
+}; /* end of class Half_Container      */
+
+
+
+/*                                                             */
+/*     Process Definitions                                     */
+/*                                                             */
+
+
+class Specification: public Tree_Node
+{
+class Definition;
+
+        Comment_List *com_list;
+       ID_Place *ident;
+       ID_List *gate_list;
+       Id_Decl_List *id_decl_list;
+        Comment_List *com_list1;
+       Tree_Node *func;
+       Data_List *dt_list;
+       Definition *def;
+       Coord yl1,yl2,yl3;
+       Coord MaxX, MaxY;
+
+friend class Gl_Specification;
+
+public:
+ Specification(Comment_List *, ID_Place *, ID_List *, Id_Decl_List *,
+              Comment_List *, Definition *, Tree_Node *, Data_List *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetPath(int&, int&);
+ Coord GetMaxX();
+ Coord GetMaxY();
+}; /* end of class Specification       */
+
+
+class Process: public Tree_Node
+{
+        Comment_List *com_list;
+       ID_Place *ident;
+       ID_List *gate_list;
+       Id_Decl_List *id_decl_list;
+       Definition *def;
+       Tree_Node *func;
+       char nesting;
+       Coord yl1,yl2,yl3,ypath;
+       Coord MaxX, MaxY;
+
+friend class Gl_Process;
+
+public:
+ Process(Comment_List *, ID_Place *, ID_List *,Id_Decl_List  *, Definition *, 
Tree_Node *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetPath(char *, char, int&, int&);
+ void NewBex(Tree_Node *);
+
+ Coord GetMaxY();
+ Coord GetMaxX();
+
+/* inline functions            */
+ char GetNesting() {return(nesting);};
+}; /* end of class Process     */
+
+
+class Proc_List: public Tree_Node
+{
+        Process *elem;
+        Proc_List *next;
+
+public:
+ Proc_List(Process *, Proc_List *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetPath(char *, char, int&, int&);
+ char *GetPath();
+}; /* end of class Proc_List      */
+
+
+class Definition: public Tree_Node
+{
+        Tree_Node *bex;
+        Proc_List *process_list;
+        Data_List *data_list;
+       char path[PATH_LENGHT];
+
+public:
+ Definition(Tree_Node *, Proc_List *, Data_List *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetPath(char *, char, int&, int&);
+
+/* inline functions            */
+ char *GetPath() { return(path);};
+}; /* end of class Definition      */
+
+
+
+/*                                                             */
+/*     Functionalities                                         */
+/*                                                             */
+
+
+class Exit: public Tree_Node
+{
+       ID_List *sort_list;
+
+friend class Gl_Exit;
+
+public:
+ Exit(ID_List *);
+ void SetPosition(Coord, Coord, Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+}; /*end of class Exit */
+
+
+class NoExit: public Tree_Node
+{
+
+friend class Gl_NoExit;
+
+public:
+ NoExit();
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+}; /*end of class NoExit */
+
+
+
+/*                                                             */
+/*     Value Expressions                                       */
+/*                                                             */
+
+
+class Value: public Tree_Node
+{
+       ID_Place *ident;
+       ID_Place *sort_id;
+
+friend class Gl_Value;
+
+public:
+ Value(ID_Place *, ID_Place *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetCollapsed(char);
+}; /* end of class Value */
+
+
+class Term: public Tree_Node
+{
+       ID_Place *op_ident;
+       Value_Expr_List *expr_list;
+       ID_Place *sort_id;
+
+friend class Gl_Term;
+
+public:
+ Term(ID_Place *, Value_Expr_List *, ID_Place *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetCollapsed(char);
+}; /* end of class Term */
+
+
+class Equality: public Tree_Node
+{
+        Tree_Node *express1;
+        Tree_Node *express2;
+
+friend class Gl_Equality;
+
+public:
+ Equality();
+ Equality(Tree_Node *, Tree_Node *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetCollapsed(char);
+}; /* end of class Equality        */
+
+
+class Sort_Id_Exit: public Tree_Node
+{
+       ID_Place *sort_id;
+
+friend class Gl_Sort_Id_Exit;
+
+public:
+ Sort_Id_Exit(ID_Place *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetCollapsed(char);
+}; /* end of class Sort_id_Exit */
+
+
+
+/*                                                             */
+/*     Guard Options                                           */
+/*                                                             */
+
+
+class NoGuard: public Tree_Node
+{
+
+friend class Gl_NoGuard;
+
+public:
+ NoGuard();
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+}; /* end of class NoGuard      */
+
+
+class Guard: public Tree_Node
+{
+        Equality *equality;
+
+friend class Gl_Guard;
+
+public:
+ Guard(Equality *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetCollapsed(char);
+}; /* end of class Guard        */
+
+
+
+/*                                                             */
+/*     Experiment Offers                                       */
+/*                                                             */
+
+
+class NoExperiment: public Tree_Node
+{
+
+friend class Gl_NoExperiment;
+
+public:
+ NoExperiment();
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+}; /* end of class NoExperiment */
+
+
+class Experiment: public Tree_Node
+{
+        Exper_Off_List *exp_offer_list;
+        Tree_Node *guard_option;
+
+friend class Gl_Experiment;
+
+public:
+ Experiment(Exper_Off_List *, Tree_Node *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetTextual(char, char = FALSE);
+ void SetCollapsed(char);
+
+/* inline functions            */
+ Tree_Node *GetGuard(void) { return(guard_option); };
+}; /* end of class Experiment   */
+
+
+class Exclam: public Tree_Node
+{
+        Tree_Node *value_exp;
+
+friend class Gl_Exclam;
+
+public:
+ Exclam(Tree_Node *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetCollapsed(char);
+}; /* end of class Exclam      */
+
+
+class Query: public Tree_Node
+{
+        Id_Decl *id_decl;
+
+friend class Gl_Query;
+
+public:
+ Query(Id_Decl *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetCollapsed(char);
+}; /* end of class Query      */
+
+
+
+/*                                                             */
+/*     Action Denotations                                      */
+/*                                                             */
+
+
+class Internal: public Tree_Node
+{
+
+friend class Gl_Internal;
+
+public:
+ Internal();
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+}; /* end of class Internal     */
+
+
+class Communication: public Tree_Node
+{
+       ID_Place *gate_identifier;
+        Tree_Node *experiment_option;
+        Coord xl, yl;
+        int hr;
+
+friend class Gl_Communication;
+
+public:
+ Communication(ID_Place *, Tree_Node *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetTextual(char, char = FALSE);
+ void SetCollapsed(char);
+}; /* end of class Communication        */
+
+
+
+/*                                                             */
+/*     Parallel Operators                                      */
+/*                                                             */
+
+
+class Gen_Paral: public Tree_Node
+{
+        ID_List *gate_id_list;
+       Coord Xclose;
+       char border;
+
+friend class Gl_Gen_Paral;
+
+public:
+ Gen_Paral(ID_List *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetCollapsed(char);
+
+/* inline functions            */
+ void HideGate() { ((ID_List *)gate_id_list)->HideMe(); };
+}; /* end of class Gen_Paral    */
+
+
+class Interl: public Tree_Node
+{
+
+friend class Gl_Interl;
+
+public:
+ Interl();
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+}; /* end of class Interl      */
+
+
+class Syncr: public Tree_Node
+{
+
+friend class Gl_Syncr;
+
+public:
+ Syncr();
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+}; /* end of class Syncr       */
+
+
+
+/*                                                             */
+/*     Bejhviour Expressions                                   */
+/*                                                             */
+
+
+class Action_Pref: public Tree_Node
+{
+        Tree_Node *action_den;
+        Tree_Node *bex;
+       char havebox;
+       char border;
+
+friend class Gl_Action_Pref;
+
+public:
+ Action_Pref(Tree_Node *, Tree_Node *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetTextual(char, char = FALSE);
+ void SetCollapsed(char);
+}; /* end of class Action_Pref  */
+
+
+class Enable: public Tree_Node
+{
+        Tree_Node *bex1, *bex2;
+       ID_List *gate_id_list;
+        Coord xl, yl1, xl2, yl2, xid, yid, Yclose;
+       char havebox;
+       char border;
+
+friend class Gl_Enable;
+
+public:
+ Enable(Tree_Node *, ID_List *, Tree_Node *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetTextual(char, char = FALSE);
+ int Get_Textual_H(void);
+ int Get_Textual_W(void);
+ void SetTerminalPos(void);
+ void SetCollapsed(char);
+}; /* end of class Enable       */
+
+
+class Disable: public Tree_Node
+{
+        Tree_Node *bex1, *bex2;
+        Coord xl, yl, yl2;
+       char havebox;
+       char border;
+
+friend class Gl_Disable;
+
+public:
+ Disable(Tree_Node *, Tree_Node *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetTextual(char, char = FALSE);
+ int Get_Textual_H(void);
+ int Get_Textual_W(void);
+ void SetTerminalPos(void);
+ void SetCollapsed(char);
+}; /* end of class Disable      */
+
+
+class Choice: public Tree_Node
+{
+       Tree_Node *bex1, *bex2;
+       Coord xl, yl, yl1;
+       char havebox;
+       int delta;
+       char border;
+
+friend class Gl_Choice;
+
+public:
+ Choice(Tree_Node *, Tree_Node *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetTextual(char, char = FALSE);
+ void SetCollapsed(char);
+ int Get_Textual_H(void);
+ int Get_Textual_W(void);
+ void SetTerminalPos(void);
+ void ChangeH(int);
+ void ChangeW(int);
+}; /* end of class Choice      */
+
+
+class Stop: public Tree_Node
+{
+       char havebox;
+       char border;
+
+friend class Gl_Stop;
+
+public:
+ Stop();
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetTextual(char, char = FALSE);
+ void SetCollapsed(char);
+}; /* end of class Stop        */
+
+
+class Exit_Bex: public Tree_Node
+{
+       Exit_Entry_List *entry_list; 
+       Coord Xopen, Xclose;
+       char havebox;
+       char border;
+
+friend class Gl_Exit_Bex;
+
+public:
+ Exit_Bex(Exit_Entry_List *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetTextual(char, char = FALSE);
+ void SetCollapsed(char);
+}; /*end of class Exit_Bex */
+
+
+class Hide: public Tree_Node
+{
+       ID_List *gate_list;
+       Tree_Node *bex;
+       char border;
+       Coord yl;
+
+friend class Gl_Hide;
+
+public:
+ Hide(ID_List *, Tree_Node *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetTextual(char, char = FALSE);
+ void SetCollapsed(char);
+}; /* end of class Hide        */
+
+
+class Guarded: public Tree_Node
+{
+        Equality *equality;
+        Tree_Node *bex;
+       Coord Xclose;
+       char border;
+
+friend class Gl_Guarded;
+
+public:
+ Guarded(Equality *, Tree_Node *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetTextual(char, char = FALSE);
+ void SetCollapsed(char);
+}; /* end of class Guarded        */
+
+
+class Proc_Inst: public Tree_Node
+{
+       ID_List *gate_list;
+       ID_Place *ident;
+       Value_Expr_List *value_expr_list;
+       Coord yp, yl1, Xopen, Xclose;
+       int hp;
+       char border;
+
+friend class Gl_Proc_Inst;
+
+public:
+  Proc_Inst(ID_Place *, ID_List *, Value_Expr_List *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetTextual(char, char = FALSE);
+ void SetCollapsed(char);
+};  /* end of class Proc_inst  */
+
+
+class Parallel: public Tree_Node
+{
+       Tree_Node *bex1, *bex2, *oper;
+       Coord xl, yl, yl1;
+       char havebox;
+       int delta;
+       char border;
+
+friend class Gl_Parallel;
+
+public:
+ Parallel(Tree_Node *, Tree_Node *, Tree_Node *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetTextual(char, char = FALSE);
+ int Get_Textual_W(void);
+ int Get_Textual_H(void);
+ void SetTerminalPos(void);
+ void SetCollapsed(char);
+
+/* inline functions            */
+ char GetOperType(void) { return(oper->GetType());};
+}; /* end of class Parallel    */
+
+
+class Local_Def: public Tree_Node
+{
+       Ident_Eq_List *equa_list;
+       Tree_Node *bex;
+       Coord yl;
+       char border;
+
+friend class Gl_Local_Def;
+
+public:
+ Local_Def(Ident_Eq_List *, Tree_Node *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetTextual(char, char = FALSE);
+ void SetCollapsed(char);
+}; /* end of class Local_Def   */
+
+
+class Par: public Tree_Node
+{
+       Gate_Decl_List *gate_decl_list;
+       Tree_Node *oper, *bex;
+       Coord xl, yl;
+       char border;
+
+friend class Gl_Par;
+
+public:
+ Par(Gate_Decl_List *, Tree_Node *, Tree_Node *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetTextual(char, char = FALSE);
+ void SetCollapsed(char);
+}; /* end of class Par */
+
+
+class Sum_Gate: public Tree_Node
+{
+       Gate_Decl_List *gate_decl_list;
+       Tree_Node *bex;
+       Coord xl, yl, Xch, Ych, Xclose, Yclose;
+       char border;
+
+friend class Gl_Sum_Gate;
+
+public:
+ Sum_Gate(Gate_Decl_List *, Tree_Node *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetTextual(char, char = FALSE);
+ void SetTerminalPos(void);
+ void SetCollapsed(char);
+}; /* end of class Sum_Gate    */
+
+
+class Sum_Ident: public Tree_Node
+{
+       Id_Decl_List *ident_decl_list;
+       Tree_Node *bex;
+       Coord xl, yl, Xch, Ych, Xclose, Yclose;
+       char border;
+
+friend class Gl_Sum_Ident;
+
+public:
+ Sum_Ident(Id_Decl_List *, Tree_Node *);
+ void SetPosition(Coord, Coord);
+ void SetDimensions(void);
+ void SetFather(Tree_Node *);
+ void SetTextual(char, char = FALSE);
+ void SetTerminalPos(void);
+ void SetCollapsed(char);
+}; /* end of class Sum_Ident   */
+
+
+
+#endif
diff --git a/test/etags/cp-src/burton.cpp b/test/etags/cp-src/burton.cpp
new file mode 100644
index 0000000..d86ad75
--- /dev/null
+++ b/test/etags/cp-src/burton.cpp
@@ -0,0 +1,14 @@
+::dummy::dummy test::dummy1(void)
+{
+  return ::dummy::dummy;
+}
+
+::dummy::dummy test::dummy2(::CORBA::Long dummy)
+{
+  return ::dummy::dummy;
+}
+
+::dummy::dummy test::dummy3(char* name, ::CORBA::Long dummy)
+{
+  return ::dummy::dummy;
+}
diff --git a/test/etags/cp-src/c.C b/test/etags/cp-src/c.C
new file mode 100644
index 0000000..2c5f7e0
--- /dev/null
+++ b/test/etags/cp-src/c.C
@@ -0,0 +1,156 @@
+template <typename ipc3dIslandHierarchy, typename ipc3dChannelType, unsigned 
numOfChannels, typename ipc3dLinkControl, typename ipc3dLinkControlSetup>
+class CMultiChannelCSC19_3D
+{
+private:
+        ipc3dLinkControlSetup setup;
+        
ipc3dCSC19<ipc3dIslandHierarchy,ipcMultiChannel<ipc3dChannelType,numOfChannels>,ipcMultiChannel<ipc3dChannelType,numOfChannels>,ipc3dLinkControl>
 mcCSC;
+        advTimer cscInitTime;
+        advTimer cscSegmentationTime;
+        advTimer outputTime;
+public:
+        void execute(CPluginCSCState& p, int w, int h, int d, const 
ipcMultiChannel<ipc3dChannelType,numOfChannels>* orgImage, 
ipcMultiChannel<ipc3dChannelType,numOfChannels>* regionImage, unsigned int* 
mapImage, ipc3dBlockCompressedLabelImage* compressedMapImage=NULL)
+        {
+                if (orgImage!=NULL)
+                {
+                                  //do something
+                }
+        }
+
+class foo {
+  int const_func() const;
+  int b;
+  int non_const_func2(void);
+};
+static void my_function1(int var1) const;
+int main (void) { my_function0(0); my_function1(1); return; }
+double base (void) const { return rng_base;  }
+
+template <typename T> MDiagArray2<T>&
+operator += (MDiagArray2<T>& a, const MDiagArray2<T>& b);
+
+class TestRecord;
+typedef struct s1 {
+   int counter;
+} t1;
+struct s2 {
+   int counter;
+};
+typedef struct s2 t2;
+class A {
+  enum { rosso, giallo, verde } colori;
+  const A& operator+(const A&);
+};
+const A& A::operator+(const A&) { }
+void operator+(int, int) {}
+void operator -(int, int) {}
+void operator int(int, int) {}
+
+A<int>* f() {}
+int f(A<int> x) {}
+int A<int>::f(A<int>* x) {}
+A<float,B<int> > A<B<float>,int>::f(A<int>* x) {}
+template <class C, int n> class AT { C t[n]; };
+class AU { T x; };
+class B<int> { void f() {} };
+const A::B::T& abt = abc;
+class A { class B { int f(); }; };
+class A {
+  int get_data() const;
+  A operator+(A& a) {};
+};
+is_muldiv_operation(pc)
+{
+}
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+domain foo {
+     void f() {}
+};
+
+void A::A() {}
+struct A { A(); }
+struct B { B(); };
+void B::B() {}
+void BE_Node::BE_Node() {}
+class BE_Node {};
+
+struct foo {
+  int x;
+};
+
+#ifdef __cplusplus
+}
+#endif
+class test {
+  int f(){return 0;};          // first comment
+                               // second comment
+  int ff(){return 1;};
+  int g(){return 2;};
+}
+class  AST_Root : public virtual AST_Module
+{
+};
+
+class  AST_Root;                       // The root of an AST 112,3888
+// etags finds
+
+AST_ConcreteType::AST_ConcreteType(AST_Decl::NodeType nt, UTL_ScopedName *n,
+                                    UTL_StrList *p)
+                : AST_Decl(nt, n, p)
+{
+}
+
+// and
+
+AST_Array::AST_Array(UTL_ScopedName *n, unsigned long nd, UTL_ExprList *ds)
+        : pd_n_dims(nd), pd_base_type(NULL),
+          AST_Decl(AST_Decl::NT_array, n, NULL)
+{
+}
+
+// as definitions of AST_Decl.
+class {
+     void f() {}
+};
+struct A {
+    ~A();
+};
+A::~A() {}
+
+struct B {
+    ~B() {};
+};
+
+enum {dog, cat} animals;
+struct {int teats;} cow;
+
+class Boo {
+    enum {dog, cat} animals;
+    struct {int treats;} cow;
+    int i,a,b;
+    foo() {
+        cout << "hi";
+    }
+
+    Boo(int _i, int _a, int _b) : i(_i), a(_a), b(_b) {}
+    Boo(Boo);
+};
+
+Boo::Boo(Boo) :
+    i(i),
+    a(a),
+    b(b)
+{}
+
+/* extern "C" grot: */
+extern "C" {
+typedef int should_see_this_one_enclosed_in_extern_C;
+}
+
+/* Typedefs: */
+typedef int (*should_see_this_function_pointer) (
+       void *but_not_this_argument);
+
+typedef int should_see_this_array_type[but_not_this_subscript];
diff --git a/test/etags/cp-src/cfront.H b/test/etags/cp-src/cfront.H
new file mode 100644
index 0000000..2d79186
--- /dev/null
+++ b/test/etags/cp-src/cfront.H
@@ -0,0 +1,836 @@
+/*ident        "@(#)cfront:src/cfront.h        1.13" */
+/***********************************************************************
+
+       C++ source for cfront, the C++ compiler front-end
+       written in the computer science research center of Bell Labs
+
+       Copyright (c) 1984 AT&T, Inc. All Rights Reserved
+       THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T, INC.
+
+       When reading cfront code please remember that C++ was not available
+       when it was originally written. Out of necessity cfront is written
+       in a style that takes advantage of only few of C++'s features.
+
+cfront.h:
+
+       Here is all the class definitions for cfront, and most of the externs
+
+***********************************************************************/
+
+/*     WARNING:
+       This program relies on non-initialized class members being ZERO.
+       This will be true as long as they are allocated using the "new" operator
+*/
+
+#include "token.h"
+#include "typedef.h"
+
+extern bit old_fct_accepted;   /* if set:
+                                       old style function definitions are 
legal,
+                                       implicit declarations are legal
+                               */
+extern bit fct_void;           /* if set:
+                                       int f(); ... f(1); gives a warning per 
file
+                                       undeclared(); gives a warning per file
+                                  if not:
+                                       int f(); ... f(1); is an error
+                                       undeclared(); is an error               
                                                (currently only a warning)
+                                       
+                               */
+
+#ifndef GRAM
+extern char* prog_name;                // compiler name and version
+extern int inline_restr;       // inline expansion restrictions 
+extern bit emode;              // print_mode error
+#endif
+
+extern Pname name_free;                // free lists
+extern Pexpr expr_free;
+extern Pstmt stmt_free;
+
+               /* "spy" counters: */
+extern int Nspy;
+extern int Nfile, Nline, Ntoken, Nname, Nfree_store, Nalloc, Nfree;
+extern int Nn, Nbt, Nt, Ne, Ns, Nstr, Nc, Nl;
+extern int NFn, NFtn, NFpv, NFbt, NFf, NFs, NFc, NFe, NFl;
+
+extern TOK     lex();
+extern Pname   syn();
+
+extern void    init_print();   // stage initializers
+extern void    init_lex();
+extern void    int_syn();
+extern void    ext(int);
+
+extern char*   make_name(TOK);
+
+struct loc             // a source file location
+{
+       short   file;   // index into file_name[], or zero
+       short   line;
+#ifndef GRAM
+       void    put(FILE*);
+       void    putline();
+#endif
+};
+
+extern Loc curloc;
+extern int curr_file;
+
+struct ea {    // fudge portable printf-like formatting for error()
+       union {
+               void* p;
+               int i;
+       };
+
+       ea(void* pp) { p = pp; }
+       ea(int ii)   { i = ii; }
+       ea() {}
+       ea(int i)       { x; }
+};
+
+extern ea* ea0;
+
+overload error;
+int error(const char*, ea& = *ea0, ea& = *ea0, ea& = *ea0, ea& = *ea0);
+int error(loc*, const char*, ea& = *ea0, ea& = *ea0, ea& = *ea0, ea& = *ea0);
+int error(int, const char*, ea& = *ea0, ea& = *ea0, ea& = *ea0, ea& = *ea0);
+int error(int, loc*, const char*, ea& = *ea0, ea& = *ea0, ea& = *ea0, ea& = 
*ea0);
+
+#ifndef GRAM
+extern int error_count;
+extern bit debug;
+extern int vtbl_opt;
+extern FILE* out_file;
+extern FILE* in_file;
+extern char scan_started;
+extern bit warn;
+#endif
+
+extern int br_level;
+extern int bl_level;
+extern Ptable ktbl;            // keywords and typedef names
+extern Ptable gtbl;            // global names
+extern char* oper_name(TOK);
+extern Pclass ccl;
+extern Pbase defa_type;
+extern Pbase moe_type;
+
+#ifndef GRAM
+extern Pstmt Cstmt;            // current statement, or 0
+extern Pname Cdcl;             // name currently being declared, or 0
+extern void put_dcl_context();
+
+extern Ptable any_tbl;         // table of undefined struct members
+extern Pbase any_type;
+#endif
+
+extern Pbase int_type;
+extern Pbase char_type;
+extern Pbase short_type;
+extern Pbase long_type;
+extern Pbase uint_type;
+extern Pbase float_type;
+extern Pbase double_type;
+extern Pbase void_type;
+
+#ifndef GRAM
+extern Pbase uchar_type;
+extern Pbase ushort_type;
+extern Pbase ulong_type;
+extern Ptype Pchar_type;
+extern Ptype Pint_type;
+extern Ptype Pfctvec_type;
+extern Ptype Pfctchar_type;
+extern Ptype Pvoid_type;
+extern Pbase zero_type;
+
+extern int byte_offset;
+extern int bit_offset;
+extern int max_align;
+extern int stack_size;
+extern int enum_count;
+extern int const_save;
+#endif
+
+extern Pexpr dummy;    /* the empty expression */
+extern Pexpr zero;
+extern Pexpr one;
+extern Pname sta_name; /* qualifier for unary :: */
+
+#define DEL(p) if (p && (p->permanent==0)) p->del()
+#define PERM(p) p->permanent=1
+#define UNPERM(p) p->permanent=0
+
+struct node {
+       TOK     base;
+       TOK     n_key;  /* for names in table: class */
+       bit     permanent;
+};
+
+#ifndef GRAM
+extern Pclass Ebase, Epriv;    /* lookc return values */
+#endif
+
+struct table : node {
+/*     a table is a node only to give it a "base" for debugging */
+       char    init_stat;      /* ==0 if block(s) of table not simplified,
+                                  ==1 if simplified but had no initializers,
+                                  ==2 if simplified and had initializers.
+                               */
+       short   size;
+       short   hashsize;
+       short   free_slot;      /* next free slot in entries */
+       Pname*  entries;
+       short*  hashtbl;
+       Pstmt   real_block;     /* the last block the user wrote,
+                                  not one of the ones cfront created
+                               */
+       Ptable  next;           /* table for enclosing scope */
+       Pname   t_name;         /* name of the table */
+
+       table(short, Ptable, Pname);
+
+       Pname   look(char*, TOK);
+       Pname   insert(Pname, TOK);
+#ifndef GRAM
+       void    grow(int);
+       void    set_scope(Ptable t)     { next = t; };
+       void    set_name(Pname n)       { t_name = n; };
+       Pname   get_mem(int);
+       int     max()                   { return free_slot-1; };
+       void    dcl_print(TOK,TOK);
+       Pname   lookc(char*, TOK);
+       Pexpr   find_name(Pname, bit, Pexpr);
+       void    del();
+#endif
+};
+
+#ifndef GRAM
+extern bit Nold;
+extern bit vec_const, fct_const;
+#endif
+
+extern void restore();
+extern void set_scope(Pname);
+extern Plist modified_tn;
+extern Pbase start_cl(TOK, Pname, Pname);
+extern void end_cl();
+extern Pbase end_enum(Pname, Pname);
+
+/************ types : basic types, aggregates, declarators ************/
+
+#ifndef GRAM
+extern bit new_type;
+extern Pname cl_obj_vec;
+extern Pname eobj;
+#endif
+
+
+#define DEFINED 01     /* definition fed through ?::dcl() */
+#define SIMPLIFIED 02  /* in ?::simpl() */
+#define DEF_SEEN 04    /* definition seen, but not processed */
+                       /*   used for class members in norm.c */
+#define IN_ERROR 010
+
+struct type : node {
+       bit     defined;        /* flags DEF_SEEN, DEFINED, SIMPLIFIED, IN_ERROR
+                                       not used systematically yet
+                               */
+       char*   signature(char*);
+#ifndef GRAM
+       void    print();
+       void    dcl_print(Pname);
+       void    base_print();
+       void    del();
+
+       Pname   is_cl_obj();    /* sets cl_obj_vec */
+       int     is_ref();
+       void    dcl(Ptable);
+       int     tsizeof();
+       bit     tconst();
+       TOK     set_const(bit);
+       int     align();
+       TOK     kind(TOK,TOK);
+       TOK     integral(TOK oo)        { return kind(oo,I); };
+       TOK     numeric(TOK oo)         { return kind(oo,N); };
+       TOK     num_ptr(TOK oo)         { return kind(oo,P); };
+       bit     vec_type();
+       bit     check(Ptype, TOK);
+       Ptype   deref();
+       Pptr    addrof();
+#endif
+};
+
+struct enumdef : type {        /* ENUM */
+       bit     e_body;
+       short   no_of_enumerators;
+       Pname   mem;
+               enumdef(Pname n)        { base=ENUM; mem=n; };
+#ifndef GRAM
+       void    print();
+       void    dcl_print(Pname);
+       void    dcl(Pname, Ptable);
+       void    simpl();
+#endif
+};
+
+struct classdef : type {       /* CLASS */
+       bit     pubbase;
+       bit     c_body;         /* print definition only once */
+       TOK     csu;            /* CLASS, STRUCT, UNION, or ANON */
+       char    obj_align;
+       char    bit_ass;        // 1 if no member has operator=()
+       char    virt_count;     /* number of virtual functions
+                                  incl. virtuals in base classes */
+       Pname   clbase;         // base class
+       char*   string;         /* name of class */
+       Pname   mem_list;
+       Ptable  memtbl;
+       int     obj_size;
+       int     real_size;      /* obj_size - alignment waste */
+       Plist   friend_list;
+       Pname   pubdef;
+       Plist   tn_list;        // list of member names hiding type names
+       Pclass  in_class;       /* enclosing class, or 0 */
+       Ptype   this_type;
+       Pname*  virt_init;      /* vector of jump table initializers */
+       Pname   itor;           /* constructor X(X&) */
+       Pname   conv;           /* operator T() chain */
+
+       classdef(TOK);
+       TOK     is_simple()     { return (csu==CLASS)?0:csu; };
+#ifndef GRAM
+       void    print();
+       void    dcl_print(Pname);
+       void    simpl();
+
+       void    print_members();
+       void    dcl(Pname, Ptable);
+       bit     has_friend(Pname);
+       bit     baseof(Pname);
+       bit     baseof(Pclass);
+       Pname   has_oper(TOK);
+       Pname   has_ctor()      { return memtbl->look("_ctor",0); }
+       Pname   has_dtor()      { return memtbl->look("_dtor",0); }
+       Pname   has_itor()      { return itor; }
+       Pname   has_ictor();
+#endif
+};
+
+
+
+struct basetype : type
+       /*      ZTYPE CHAR SHORT INT LONG FLOAT DOUBLE
+               FIELD EOBJ COBJ TYPE ANY
+       */
+       /*      used for gathering all the attributes
+               for a list of declarators
+
+               ZTYPE is the (generic) type of ZERO
+               ANY is the generic type of an undeclared name
+       */
+{
+       bit     b_unsigned;
+       bit     b_const;
+       bit     b_typedef;
+       bit     b_inline;
+       bit     b_virtual;
+       bit     b_short;
+       bit     b_long;
+       char    b_bits;         /* number of bits in field */
+       char    b_offset;       // bit offset of field
+       TOK     b_sto;          /* AUTO STATIC EXTERN REGISTER 0 */
+       Pname   b_name;         /* name of non-basic type */
+       Ptable  b_table;        /* memtbl for b_name, or 0 */
+       Pexpr   b_field;        /* field size expression for a field */
+       Pname   b_xname;        /* extra name */
+       Ptype   b_fieldtype;
+
+       basetype(TOK, Pname);
+
+       Pbase   type_adj(TOK);
+       Pbase   base_adj(Pbase);
+       Pbase   name_adj(Pname);
+       Pname   aggr();
+       void    normalize();
+#ifndef GRAM
+       Pbase   check(Pname);
+       void    dcl_print();
+       Pbase   arit_conv(Pbase);
+#endif
+};
+
+
+struct fct : type              // FCT
+{
+       TOK     nargs;
+       TOK     nargs_known;    // KNOWN, ELLIPSIS, or 0
+       char    f_virtual;      // 1+index in virtual table, or 0
+       char    f_inline;       // 1 if inline, 2 if being expanded, else 0 
+       Ptype   returns;
+       Pname   argtype;
+       Ptype   s_returns;
+       Pname   f_this;
+       Pclass  memof;          // member of class memof
+       Pblock  body;
+       Pname   f_init;         // base/member initializers
+                               // null name => base class init;
+                               // ids => member classes (with ctors)
+       Pexpr   b_init;         // base class initializer
+                               // ctor call after fct.dcl()
+//     int     frame_size;
+       Pexpr   f_expr;         // body expanded into an expression
+       Pexpr   last_expanded;
+       Pname   f_result;       // extra second argument of type X&
+
+       fct(Ptype, Pname, TOK);
+
+       void    argdcl(Pname,Pname);
+#ifndef GRAM
+       Ptype   normalize(Ptype);
+       void    dcl_print();
+       void    dcl(Pname);
+       Pexpr   base_init(Pname, Pexpr, Ptable);
+       Pexpr   mem_init(Pname, Pexpr, Ptable);
+       bit     declared() { return nargs_known; };
+       void    simpl();
+       Pexpr   expand(Pname,Ptable,Pexpr);
+#endif
+};
+
+
+struct name_list {
+       Pname   f;
+       Plist   l;
+       name_list(Pname ff, Plist ll) { f=ff; l=ll; };
+};
+
+#ifndef GRAM
+struct gen : type {            // OVERLOAD
+       Plist   fct_list;
+       char*   string;
+               gen(char*);
+       Pname   add(Pname, int);
+       Pname   find(Pfct, bit);
+};
+#endif
+
+struct pvtyp : type {
+       Ptype typ;
+};
+
+struct vec : pvtyp             // VEC
+                               // typ [ dim ]
+{
+       Pexpr   dim;
+       int     size;   
+
+       vec(Ptype t, Pexpr e) { Nt++; base=VEC; typ=t; dim=e; };
+#ifndef GRAM
+       Ptype   normalize(Ptype);
+#endif
+};
+
+struct ptr : pvtyp             // PTR, RPTR i.e. reference
+{
+       Pclass  memof;          // pointer to member of memof: memof::*
+       bit     rdo;            // "*const"
+
+       ptr(TOK b, Ptype t, bit r = 0) { Nt++; base=b; typ=t; rdo=r; };
+#ifndef GRAM
+       Ptype   normalize(Ptype);
+#endif
+};
+
+#ifndef GRAM
+inline Pptr type::addrof() { return new ptr(PTR,this,0); }
+
+extern bit vrp_equiv;
+#endif
+
+
+/****************************** constants ********************************/
+
+               /* STRING ZERO ICON FCON CCON ID */
+               /* IVAL FVAL LVAL */
+
+/***************************** expressions ********************************/
+
+#ifndef GRAM
+extern Pexpr next_elem();
+extern void new_list(Pexpr);
+extern void list_check(Pname, Ptype, Pexpr);
+extern Pexpr ref_init(Pptr,Pexpr,Ptable);
+extern Pexpr class_init(Pexpr,Ptype,Pexpr,Ptable);
+extern Pexpr check_cond(Pexpr, TOK, Ptable);
+#endif
+
+struct expr : node     /* PLUS, MINUS, etc. */
+       /* IMPORTANT:   all expressions are of sizeof(expr) */
+       /*      DEREF           =>      *e1 (e2==0) OR e1[e2]
+               UMINUS          =>      -e2
+               INCR (e1==0)    =>      ++e2
+               INCR (e2==0)    =>      e1++
+               CM              =>      e1 , e2
+               ILIST           =>      LC e1 RC   (an initializer list)
+               a Pexpr may denote a name
+       */
+{
+       union {
+               Ptype   tp;
+               int     syn_class;
+       };
+       union {
+               Pexpr   e1;
+               char*   string;
+               int     i1;
+       };
+       union {
+               Pexpr   e2;
+               Pexpr   n_initializer;
+               char*   string2;
+       };
+       union {                 /* used by the derived classes */
+               Ptype   tp2;
+               Pname   fct_name;
+               Pexpr   cond;
+               Pname   mem;
+               Ptype   as_type;
+               Ptable  n_table;
+               Pin     il;
+       };
+
+       expr(TOK, Pexpr, Pexpr);
+       ~expr();
+#ifndef GRAM
+       void    del();
+       void    print();
+       Pexpr   typ(Ptable);
+       int     eval();
+       int     lval(TOK);
+       Ptype   fct_call(Ptable);
+       Pexpr   address();
+       Pexpr   contents();
+       void    simpl();
+       Pexpr   expand();
+       bit     not_simple();
+       Pexpr   try_to_overload(Ptable);
+       Pexpr   docast(Ptable);
+       Pexpr   dovalue(Ptable);
+       Pexpr   donew(Ptable);
+       void    simpl_new();
+       void    simpl_delete();
+#endif
+};
+
+struct texpr : expr {          // NEW CAST VALUE
+       texpr(TOK bb, Ptype tt, Pexpr ee) : (bb,ee,0) {this=0; tp2=tt;}
+};
+
+struct ival : expr {           // NEW CAST VALUE
+       ival(int ii) : (IVAL,0,0) {this=0; i1 = ii;}
+};
+
+struct call : expr {           // CALL
+       call(Pexpr aa, Pexpr bb) : (CALL,aa,bb) { this=0; }
+#ifndef GRAM
+       void    simpl();
+       Pexpr   expand(Ptable);
+#endif
+};
+
+struct qexpr : expr {          // QUEST        cond ? e1 : e2
+       qexpr(Pexpr ee, Pexpr ee1, Pexpr ee2) : (QUEST,ee1,ee2) { this=0; 
cond=ee; }
+};
+
+struct ref : expr {            // REF DOT      e1->mem OR e1.mem
+       ref(TOK ba, Pexpr a, Pname b) : (ba,a,0) { this=0; mem=b; }
+};
+
+struct text_expr : expr        {       // TEXT
+       text_expr(char* a, char* b) : (TEXT,0,0) { string=a; string2=b; }
+};
+
+/************************* names (are expressions) 
****************************/
+
+struct name : expr {   // NAME TNAME and the keywords in the ktbl
+       TOK     n_oper;         // name of operator or 0
+       TOK     n_sto;          // EXTERN STATIC AUTO REGISTER ENUM 0
+       TOK     n_stclass;      // STATIC AUTO REGISTER 0
+       TOK     n_scope;        // EXTERN STATIC FCT ARG PUBLIC 0 
+       unsigned char   n_union;        // 0 or union index
+       bit     n_evaluated;    // 0 or n_val holds the value
+       bit     n_xref;         // argument of type X(X&)
+       unsigned char   lex_level;
+       TOK     n_protect;      // PROTECTED (<=>n_scope==0) or 0
+       short   n_addr_taken;
+       short   n_used;
+       short   n_assigned_to;
+       Loc     where;
+       int     n_val;          // the value of n_initializer
+                               // also used as the argument number
+                               // for inline arguments
+       int     n_offset;       // byte offset in frame or struct
+       Pname   n_list;
+       Pname   n_tbl_list;
+       union {
+               Pname   n_qualifier;    // name of containing class
+               Ptable  n_realscope;    /* for labels (always entered in
+                                          function table) the table for the
+                                          actual scope in which label occurred.
+                                       */
+       };
+
+       name(char* =0);
+       ~name();
+
+       Pname   normalize(Pbase, Pblock, bit);
+       Pname   tdef();
+       Pname   tname(TOK);
+       void    hide();
+       void    unhide()        { n_key=0; n_list=0; };
+#ifndef GRAM
+       Pname   dcl(Ptable,TOK);
+       int     no_of_names();
+       void    use()           { n_used++; };
+       void    assign();
+       void    take_addr()     { n_addr_taken++; };
+       void    check_oper(Pname);
+       void    simpl();
+       void    del();
+       void    print();
+       void    dcl_print(TOK);
+       void    field_align();
+       Pname   dofct(Ptable,TOK);
+#endif
+};
+
+#ifndef GRAM
+extern int friend_in_class;
+#endif
+
+/******************** statements *********************************/
+
+struct stmt : node {   /* BREAK CONTINUE DEFAULT */
+/*     IMPORTANT: all statement nodes have sizeof(stmt) */
+       Pstmt   s;
+       Pstmt   s_list;
+       Loc     where;
+       union {
+               Pname   d;
+               Pexpr   e2;
+               Pstmt   has_default;
+               int     case_value;
+               Ptype   ret_tp;
+       };
+       union {
+               Pexpr   e;
+               bit     own_tbl;
+               Pstmt   s2;
+       };
+       Ptable  memtbl;
+       union {
+               Pstmt   for_init;
+               Pstmt   else_stmt;
+               Pstmt   case_list;
+               bit     empty;
+       };
+
+       stmt(TOK, loc, Pstmt);
+       ~stmt();
+#ifndef GRAM
+       void    del();
+       void    print();
+       void    dcl();
+       void    reached();
+       Pstmt   simpl();
+       Pstmt   expand();
+       Pstmt   copy();
+#endif
+};
+
+#ifndef GRAM
+extern char* Neval;
+extern Pname dcl_temp(Ptable, Pname);
+extern char* temp(char*, char*, char*);
+extern Ptable scope;
+extern Ptable expand_tbl;
+extern Pname expand_fn;
+#endif
+
+struct estmt : stmt    /* SM WHILE DO SWITCH RETURN CASE */
+       /*      SM (e!=0)       =>      e;
+               in particular assignments and function calls
+               SM (e==0)       =>      ;       (the null statement)
+               CASE            =>      case e : s ;
+       */
+{
+       estmt(TOK t, loc ll, Pexpr ee, Pstmt ss) : (t,ll,ss) { this=0; e=ee; }
+};
+
+struct ifstmt : stmt   /* IF */
+       // else_stme==0 =>      if (e) s
+       // else_stmt!=0 =>      if (e) s else else_stmt
+{
+       ifstmt(loc ll, Pexpr ee, Pstmt ss1, Pstmt ss2)
+               : (IF,ll,ss1) { this=0; e=ee; else_stmt=ss2; };
+};
+
+struct lstmt : stmt    /* LABEL GOTO */
+       /*
+               d : s
+               goto d
+       */
+{
+       lstmt(TOK bb, loc ll, Pname nn, Pstmt ss) : (bb,ll,ss) { this=0; d=nn; }
+};
+
+struct forstmt : stmt {        // FOR
+       forstmt(loc ll, Pstmt fss, Pexpr ee1, Pexpr ee2, Pstmt ss)
+               : (FOR,ll,ss) { this=0; for_init=fss; e=ee1; e2=ee2; }
+};
+
+struct block : stmt {  // BLOCK        { d s }
+       block(loc ll, Pname nn, Pstmt ss) : (BLOCK,ll,ss) { this=0; d=nn; }
+#ifndef GRAM
+       void    dcl(Ptable);
+       Pstmt   simpl();
+#endif
+};
+
+#ifndef GRAM
+struct pair : public stmt {    // PAIR
+       pair(loc ll, Pstmt a, Pstmt b) : (PAIR,ll,a) { this=0; s2 = b; }
+};
+#endif
+
+struct nlist {
+       Pname   head;
+       Pname   tail;
+               nlist(Pname);
+       void    add(Pname n)    { tail->n_list = n; tail = n; };
+       void    add_list(Pname);
+};
+
+extern Pname name_unlist(nlist*);
+
+struct slist {
+       Pstmt   head;
+       Pstmt   tail;
+               slist(Pstmt s)  { Nl++; head = tail = s; };
+       void    add(Pstmt s)    { tail->s_list = s; tail = s; };
+};
+
+extern Pstmt stmt_unlist(slist*);
+
+struct elist {
+       Pexpr   head;
+       Pexpr   tail;
+               elist(Pexpr e)  { Nl++; head = tail = e; };
+       void    add(Pexpr e)    { tail->e2 = e; tail = e; };
+};
+
+extern Pexpr expr_unlist(elist*);
+
+#ifndef GRAM
+extern class dcl_context * cc;
+
+struct dcl_context {
+       Pname   c_this; /* current fct's "this" */
+       Ptype   tot;    /* type of "this" or 0 */
+       Pname   not;    /* name of "this"'s class or 0 */
+       Pclass  cot;    /* the definition of "this"'s class */
+       Ptable  ftbl;   /* current fct's symbol table */
+       Pname   nof;    /* current fct's name */
+
+       void    stack()         { cc++; *cc = *(cc-1); };
+       void    unstack()       { cc--; };
+};
+
+#define MAXCONT        20
+extern dcl_context ccvec[MAXCONT];
+#endif
+
+extern void yyerror(char*);
+extern TOK back;
+
+
+#ifndef GRAM
+extern char* line_format;
+
+extern Plist isf_list;
+extern Pstmt st_ilist;
+extern Pstmt st_dlist;
+extern Ptable sti_tbl;
+extern Ptable std_tbl;
+Pexpr try_to_coerce(Ptype, Pexpr, char*, Ptable);
+extern bit can_coerce(Ptype, Ptype);
+extern Ptype np_promote(TOK, TOK, TOK, Ptype, Ptype, TOK);
+extern void new_key(char*, TOK, TOK);
+
+extern Pname dcl_list;
+extern int over_call(Pname, Pexpr);
+extern Pname Nover;
+extern Pname Ntncheck;
+extern Pname Ncoerce;
+extern Nover_coerce;
+
+const MIA = 8;
+struct iline {
+       Pname   fct_name;       /* fct called */
+       Pin     i_next;
+       Ptable  i_table;
+       Pname   local[MIA];     /* local variable for arguments */
+       Pexpr   arg[MIA];       /* actual arguments for call */
+       Ptype   tp[MIA];        /* type of formal arguments */
+};
+
+extern Pexpr curr_expr;
+extern Pin curr_icall;
+#define FUDGE111 111
+
+extern Pstmt curr_loop;
+extern Pblock curr_block;
+extern Pstmt curr_switch;
+extern bit arg_err_suppress;
+extern loc last_line;
+
+extern no_of_undcl;
+extern no_of_badcall;
+extern Pname undcl, badcall;
+
+extern int strlen(const char*);
+extern char* strcpy(char*, const char*);
+extern int str_to_int(const char*);
+extern int c_strlen(const char* s);
+#endif
+
+extern int strcmp(const char*, const char*);
+
+#ifndef GRAM
+extern Pname vec_new_fct;
+extern Pname vec_del_fct;
+
+extern int Nstd; // standard coercion used (derived* =>base* or int=>long or 
...)
+
+extern int stcount;    // number of names generated using make_name()
+
+extern Pname find_hidden(Pname);
+Pexpr replace_temp(Pexpr,Pexpr);
+void make_res(Pfct);
+Pexpr ptr_init(Pptr,Pexpr,Ptable);     
+
+#endif
+
+extern bit fake_sizeof;        // suppress error message for ``int v[];''
+
+extern TOK lalex();
+#ifdef DEBUG
+extern fprintf(FILE*, char* ...);
+#define DB(a) fprintf a
+#else
+#define DB(a) /**/
+#endif
+
+/* end */
diff --git a/test/etags/cp-src/clheir.cpp.gz b/test/etags/cp-src/clheir.cpp.gz
new file mode 100644
index 0000000..38b08a8
Binary files /dev/null and b/test/etags/cp-src/clheir.cpp.gz differ
diff --git a/test/etags/cp-src/clheir.hpp b/test/etags/cp-src/clheir.hpp
new file mode 100644
index 0000000..a924563
--- /dev/null
+++ b/test/etags/cp-src/clheir.hpp
@@ -0,0 +1,82 @@
+/* ======================================================================= */
+/*                                 CLHEIR.H                                */
+/* ======================================================================= */
+
+// CLASS HEIRARCHY
+// Locations or Agents are both of type generic_object. Generic_objects may
+// have states, and are responsible for updating their states appropriately
+// when their step() functions are executed.
+
+extern void init_registry(void);
+extern void step_everybody(void);
+
+class generic_object
+    {
+    int where_in_registry;
+public:
+    generic_object();  // enter generic_object into ObjectRegistry
+    // We never copy generic_objects, so we don't need a copy constructor.
+    ~generic_object(void);  // delete from ObjectRegistry
+    // Simulation steps, accomodate different kinds of time
+    virtual void compute_next_state(void) { }
+    virtual void step(void) { }
+    };
+
+// =======================================================================
+
+// Locations can be regular (like a field of squares or hexagons) or
+// irregular. Regular locations have 2-D or 3-D positions represented
+// by integers. Locations are never copied; no need for copy constructors.
+
+const int max_num_directions = 6; // handles both cubes and hexagons
+
+class location: public generic_object
+    {
+    // Any kind of location needs a physical position, but for a regular
+    // location, this may be implicit, and for an irregular location, it
+    // should be custom-defined.
+
+    // Any kind of location needs a private list of neighbors, but for a
+    // regular location, this may be implicit.
+
+public:
+    location() { }
+    ~location();
+    };
+
+class irregular_location: public location
+    {
+    double x, y, z;
+public:
+    irregular_location(double xi, double yi, double zi)
+        { x = xi; y = yi; z = zi; }
+    ~irregular_location();
+    };
+
+class discrete_location: public location
+    {
+    int x, y, z;
+    class location *neighbors[max_num_directions];
+    void clear_neighbors(void);
+public:
+    discrete_location(int xi, int yi, int zi):
+        x(xi), y(yi), z(zi)
+            { clear_neighbors(); }
+    ~discrete_location(void);
+    void assign_neighbor(int direction, location *x)
+        { neighbors[direction] = x; }
+    };
+
+// =======================================================================
+
+// Agents are generic_objects with locations, who can move. Examples in
+// Pacman would be the protagonist, the monsters, and the monsters' ghosts.
+
+class agent: public generic_object
+    {
+    location *where;
+public:
+    agent();
+    ~agent();
+    void move(int);
+    };
diff --git a/test/etags/cp-src/conway.cpp b/test/etags/cp-src/conway.cpp
new file mode 100644
index 0000000..1e60014
--- /dev/null
+++ b/test/etags/cp-src/conway.cpp
@@ -0,0 +1,95 @@
+/* ======================================================================= */
+/*                                CONWAY.CPP                               */
+/* ======================================================================= */
+
+#include "assert.h"
+#include "iostream.h"
+#include "conio.h"
+#include "clheir.h"
+#include "screen.h"
+#include "conway.h"
+
+#define max(x,y)  ((x > y) ? x : y)
+#define min(x,y)  ((x > y) ? y : x)
+
+const int num_rows = min(50, NUM_ROWS);
+const int num_columns = 40;
+
+class site *field_of_play[num_rows][num_columns];
+
+int site::total_surrounding(void)
+    {
+    int i, j, imin, imax, jmin, jmax, total;
+
+    total = 0;
+    imin = max(0, x - 1);
+    imax = min(num_rows - 1, x + 1);
+    jmin = max(0, y - 1);
+    jmax = min(num_columns - 1, y + 1);
+
+    for (i = imin; i <= imax; i++)
+        for (j = jmin; j <= jmax; j++)
+            if (field_of_play[i][j]->read()) total++;
+    if (alive) total--;
+    return total;
+    }
+
+void display(void)
+    {
+    int i, j;
+
+    for (i = 0; i < num_rows; i++)
+        for (j = 0; j < num_columns; j++)
+            {
+            if (field_of_play[i][j]->read()) write_xyc(2*j, i, 'X');
+            else write_xyc(2*j, i, '.');
+            }
+    hide_cursor();
+    }
+
+void glider(int x, int y)
+    {
+    field_of_play[x - 1][y + 0]->set();
+    field_of_play[x - 1][y + 1]->set();
+    field_of_play[x + 0][y - 1]->set();
+    field_of_play[x + 0][y + 0]->set();
+    field_of_play[x + 1][y + 1]->set();
+    }
+
+void traffic_light(int x, int y)
+    {
+    field_of_play[x - 1][y]->set();
+    field_of_play[x + 0][y]->set();
+    field_of_play[x + 1][y]->set();
+    }
+
+
+void main(void)
+    {
+    int i, j, c;
+
+    init_registry();
+
+    for (i = 0; i < num_rows; i++)
+        for (j = 0; j < num_columns; j++)
+            field_of_play[i][j] = new site(i, j);
+
+start_over:
+    traffic_light(num_rows/2 - 8, num_columns/2 - 8);
+    glider(num_rows/2 + 8, num_columns/2 + 8);
+
+    clear_screen();
+    while (1)
+        {
+        display();
+        if ((c = getch()) == 'q') { clear_screen(); return; }
+        if (c == 'i')
+            {
+            for (i = 0; i < num_rows; i++)
+                for (j = 0; j < num_columns; j++)
+                    field_of_play[i][j]->clear();
+            goto start_over;
+            }
+        step_everybody();
+        }
+    }
diff --git a/test/etags/cp-src/conway.hpp b/test/etags/cp-src/conway.hpp
new file mode 100644
index 0000000..9fbb251
--- /dev/null
+++ b/test/etags/cp-src/conway.hpp
@@ -0,0 +1,23 @@
+/* ======================================================================= */
+/*                                 CONWAY.H                                */
+/* ======================================================================= */
+
+class site: public location
+    {
+    char x, y, alive, next_alive;
+    int total_surrounding(void);
+public:
+    site(int xi, int yi): x(xi), y(yi), alive(0) { }
+    ~site();
+    char read() { return alive; }
+    void set(void) { alive = 1; }
+    void clear(void) { alive = 0; }
+    void compute_next_state(void)
+        {
+        int n = total_surrounding();
+        next_alive = alive;
+        if (n < 2 || n > 3) next_alive = 0;
+        else if (n > 2) next_alive = 1;
+        }
+    void step(void) { alive = next_alive; }
+    };
diff --git a/test/etags/cp-src/fail.C b/test/etags/cp-src/fail.C
new file mode 100644
index 0000000..c602ed2
--- /dev/null
+++ b/test/etags/cp-src/fail.C
@@ -0,0 +1,52 @@
+/* Examples provided by Sam Kendall <address@hidden>, Jan 1997 */
+
+// check use of references with nested/local classes
+
+// This example causes etags 13 to abort when compiled with -DDEBUG.
+// Etags 13 cannot deal with nested structures after the first level.
+struct A {
+          struct B {
+                  struct C {
+                          int x;
+                          C(int i) {x = i;}
+                          operator int() const {return x;}
+                  };
+                  typedef C T;
+          };
+          typedef B T2;
+};
+
+
+class String;
+
+
+class A {
+       class B {
+               class C {};
+               int f() { return 5; }
+       };
+};
+
+
+int A::B::f() { return 2; }
+
+
+A::B::C abc(-37);
+
+
+main()
+{
+       if (abc != -37 || abt != -37) return 1;
+
+       class D : public A::B::C {
+       public:
+               D() : ::A::T2::T(97), x(1066) {}
+               int x;
+       } &d = D();
+
+       if (d.x != 1066 || d.A::T2::T::x != 97) return 2;
+       return 0;
+}
+
+
+template <class T>
diff --git a/test/etags/cp-src/functions.cpp b/test/etags/cp-src/functions.cpp
new file mode 100644
index 0000000..fb546ed
--- /dev/null
+++ b/test/etags/cp-src/functions.cpp
@@ -0,0 +1,239 @@
+#include "main.hpp"
+#pragma ident  "@(#)functions.cpp      1.0     98/11/12 (c) Rupak Rathore"
+
+// Constructor default argument initialises to today's values
+void Date::setDate ( int d , int m , int y ){
+       time_t t;
+       struct tm * ptm;
+       t = time ( NULL ) ;
+       if ( date != NULL )
+               delete date;
+       date = NULL;
+       if ( d == 0 && m == 0 && y == 0 ) // explicity called or default 
constructor hence leave it.
+               return;
+       if ( d < 0 && m < 0 && d < 0 ) // Special instruction to intialise to 
today's value
+               d=m=y=0;
+       date = new tm;
+       ptm=localtime ( &t ) ;
+       *date=(*ptm);
+       if ( d )
+               date->tm_mday = d;
+       if ( m )
+               date->tm_mon = m - 1; // Months are counted from January
+       if ( y > 1900 ) // Complete year specified so take into account
+               y -= 1900;
+       if ( y )
+               date->tm_year = y;
+       date->tm_sec=date->tm_min=date->tm_hour=0;
+       t = mktime ( date ) ;
+}
+
+// Addition operation ::: Warning ::: A combination of addition and 
substraction does not give a proper result
+void Date::plus ( int days , int month , int year ){
+       if ( ! set () )
+               return;
+       date->tm_mday += days ;
+       date->tm_mon += month ;
+       date->tm_year += year ;
+       mktime ( date );
+}
+
+//Substraction operation ::: Warning ::: A combination of addition and 
substraction does not give a proper result
+void Date::minus ( int days , int month , int year ){
+       if ( ! set () )
+               return;
+       date->tm_mday -= days ;
+       date->tm_mon -= month ;
+       date->tm_year -= year ;
+       mktime ( date );
+}
+
+
+void Date::shift ( void ){//Shift this date to previous working days (useful 
for benchmarks)
+       if ( ! set() )
+               return ;
+       while(isHoliday(*this)||isweekend()){
+               date->tm_mday -= 1 ;
+               mktime ( date );
+       }
+}
+
+// Assignment
+Date & Date::operator = ( Date d ){
+       if ( d.set() )
+               setDate ( d.date->tm_mday, d.date->tm_mon + 1, d.date->tm_year 
);
+       return(*this);
+}
+
+// Add number of days
+Date & Date::operator += ( int days ){
+       if ( set () ){
+               date->tm_mday += days ;
+               mktime ( date );
+       }
+       return(*this);
+}
+
+// Substract number of days
+Date & Date::operator -= ( int days ){
+       if ( set () ){
+               date->tm_mday -= days ;
+               mktime ( date );
+       }
+       return(*this);
+}
+
+// Advance one day
+Date & Date::operator ++ ( void ){
+       if ( set () ){
+               date->tm_mday += 1 ;
+               mktime ( date );
+       }
+       return(*this);
+}
+
+// Backwards one day
+Date & Date::operator -- ( void ){
+       if ( set () ){
+               date->tm_mday -= 1 ;
+               mktime ( date );
+       }
+       return(*this);
+}
+
+int Date::operator - ( Date d ){
+       long l;
+       if (( ! set() ) || (! d.set()))
+               return(0);
+       l=(mktime(date)-mktime(d.date))/(3600*24);
+       return((int)l);
+}
+
+int Date::operator < ( Date d ) {
+       return ( unidate() < d.unidate() );
+}
+
+int Date::operator > ( Date d ) {
+       return ( unidate() > d.unidate() );
+}
+
+int Date::operator == ( Date d ) {
+       return ( unidate() == d.unidate() );
+}
+
+ostream& operator <<  ( ostream &c, Date d ) {
+       if ( ! d.set() )
+               c << "Null";
+       else
+               c << d.date->tm_mday << ":" << d.date->tm_mon + 1 << ":" << 
d.date->tm_year + 1900 ;
+       return ( c );
+}
+
+// Modified to read date in yyyymmdd format.
+istream& operator >> ( istream &i, Date & dd ){
+       int d,m,y,tmp;
+       i >> tmp;
+       d=tmp%100;
+       tmp/=100;
+       m=tmp%100;
+       tmp/=100;
+       y=tmp;
+       dd.setDate(d,m,y);
+       return(i);
+}
+/*
+istream& operator >>  ( istream &i, Date &dd ) {
+       char input[11];
+       int d,m,y;
+       cout << "Enter the date ( dd-mm-yyyy ) : ";
+       i >> input ;
+       d = ( input[0] - '0' ) * 10 + ( input[1] - '0' );
+       m = ( input[3] - '0' ) * 10 + ( input[4] - '0' );
+       y = ( input[6] - '0' ) * 1000 + ( input[7] - '0' ) * 100 + ( input[8] - 
'0' ) * 10 + ( input[9] - '0' );
+       dd.setDate ( d, m, y );
+       return ( i );
+}
+*/
+
+// Check whether given year is leap or not
+bool isLeap ( int year ){
+       return ( (year%100==0) ? (year%400==0) : (year%4==0) );
+}
+
+bool isHoliday ( Date d ){
+       long int ld;
+       ld = ( d.year()*100 + d.month() )*100 + d.day();
+       for ( int i=0; i<no_of_vacations;i++)
+               if ( ld == vacation[i] )
+                       return(true);
+       return(false);
+}
+
+// Sort the given array in ascending order
+void asort(int *a, int num){
+       int i,k,mini,tmp;
+       for ( k=1; k<num; k++ ){
+               mini=k-1;
+               for ( i=k; i<num; i++ )
+                       if ( a[mini] > a[i] ) {
+                               tmp=a[i];
+                               a[i]=a[mini];
+                               a[mini]=tmp;
+                       }
+       }
+}
+
+void ReadVacation ( char *filename ) {
+       // cerr << filename;
+       ifstream vacfile(filename);
+       if ( ! vacfile.good() )
+               d_error("ReadVacation","Unable to find the vacation and 
holidays file");
+       // cerr << filename ;
+       d_silent("ReadVacation","vacation file successfully opened.");
+       no_of_vacations = 0;
+       while ( !vacfile.eof() )
+               vacfile >> vacation[no_of_vacations++];
+       --no_of_vacations;
+       d_silent("ReadVacation","Finished Reading file");
+       vacfile.close();
+}
+
+void Debug ( int lineno, int level, char* func , char* mesg ) // error_level, 
function, message
+{
+       if ( debug_level <= level )
+               cerr << PROGNAME << ": " << func << ": " << lineno << ": " << 
debug_string[level] << ": " << mesg << endl;
+       if ( level == ERROR ){
+               cerr << PROGNAME << ": Exiting because of fatal error." <<endl ;
+               exit(2);
+       }
+}
+
+int WorkingDays(Date a, Date b){
+       Date tmp;
+       int wdays=0,days=0;
+       if ( (! a.set()) || (! b.set()) )
+               return(0);
+       days=b-a+1; // Inclusive
+       tmp=a;
+       for ( int i=0;i<days;i++){
+               if((!isHoliday(tmp))&&(!tmp.isweekend()))
+                       wdays++;
+               tmp++;
+       }
+       return(wdays);
+}
+
+Date StartDay(Date a,int days){//Function to calculate the apropriate start 
day to finish in days working days
+       Date tmp;
+       int wdays=0;
+       if ( ! a.set() )
+               return (a);
+       tmp=a;
+       while(wdays<days){
+               if((!isHoliday(tmp))&&(!tmp.isweekend()))
+                       wdays++;
+               tmp--;
+       }
+       tmp++;
+       return(tmp);
+}
diff --git a/test/etags/cp-src/screen.cpp b/test/etags/cp-src/screen.cpp
new file mode 100644
index 0000000..1958a19
--- /dev/null
+++ b/test/etags/cp-src/screen.cpp
@@ -0,0 +1,62 @@
+/* ======================================================================= */
+/*                                SCREEN.CPP                               */
+/* ======================================================================= */
+
+#include "stdio.h"
+#include "stdlib.h"
+#include "dos.h"
+
+#include "screen.h"
+
+/* ----------------------------------------------------------------------- */
+/*              Cursor Position and Screen Buffering Functions             */
+/* ----------------------------------------------------------------------- */
+
+unsigned char cursor_x, cursor_y;
+static union REGS regs;
+
+void goto_xy(unsigned char x, unsigned char y)
+    {
+    regs.h.ah = 2;
+    regs.h.bh = 0;
+    regs.h.dh = y;
+    regs.h.dl = x;
+    int86(0x10, &regs, &regs);
+    }
+
+void hide_cursor(void)
+    {
+    goto_xy(0, NUM_ROWS);
+    }
+
+void cursor_position(void)
+    {
+    regs.h.ah = 3;
+    regs.h.bh = 0;
+    int86(0x10, &regs, &regs);
+    cursor_x = regs.h.dl;
+    cursor_y = regs.h.dh;
+    }
+
+void clear_screen(void)
+    {
+    unsigned int i, j;
+    char far *p;
+
+    p = SCREEN_START;
+    for (i = 0; i < NUM_ROWS; i++)
+        for (j = 0; j < 80; j++)
+            {
+            *p++ = ' ';
+            *p++ = LIGHTGRAY;
+            }
+    }
+
+void write_xyc(int x, int y, char c)
+    {
+    char far *p;
+
+    p = SCREEN_FP(x, y);
+    *p++ = c;
+    *p = LIGHTGRAY;
+    }
diff --git a/test/etags/cp-src/screen.hpp b/test/etags/cp-src/screen.hpp
new file mode 100644
index 0000000..a7099a3
--- /dev/null
+++ b/test/etags/cp-src/screen.hpp
@@ -0,0 +1,39 @@
+/* ======================================================================= */
+/*                                 SCREEN.H                                */
+/* ======================================================================= */
+
+// This stuff is entirely non-portable MSDOS-ish code. Note the hardware
+// address below, for the standard location of the EGA video buffer.
+
+#if !defined(__COLORS)
+#define __COLORS
+
+enum COLORS {
+    BLACK,          /* dark colors */
+    BLUE,
+    GREEN,
+    CYAN,
+    RED,
+    MAGENTA,
+    BROWN,
+    LIGHTGRAY,
+    DARKGRAY,       /* light colors */
+    LIGHTBLUE,
+    LIGHTGREEN,
+    LIGHTCYAN,
+    LIGHTRED,
+    LIGHTMAGENTA,
+    YELLOW,
+    WHITE
+};
+#endif
+
+#define SCREEN_FP(x,y) \
+    ((char far *) (0xB8000000L | ((unsigned) (160 * (y) + 2 * (x)))))
+#define SCREEN_START   SCREEN_FP(0, 0)
+
+void goto_xy(unsigned char x, unsigned char y);
+void hide_cursor(void);
+void cursor_position(void);
+void clear_screen(void);
+void write_xyc(int x, int y, char c);
diff --git a/test/etags/el-src/TAGTEST.EL b/test/etags/el-src/TAGTEST.EL
new file mode 100644
index 0000000..acf0baf
--- /dev/null
+++ b/test/etags/el-src/TAGTEST.EL
@@ -0,0 +1,31 @@
+(foo::defmumble bletch beuarghh)
+;;; Ctags test file for lisp mode.
+
+;; from emacs/lisp/delsel.el:76:
+(defalias 'pending-delete-mode 'delete-selection-mode)
+
+;; compare with:
+(defalias (quote explicitly-quoted-pending-delete-mode) 'delete-selection-mode)
+
+;;
+;; Output from original ctags:
+;;
+;'pending-delete-mode  tagstest.el     /^(defalias 'pending-delete-mode 
'delete-selection-m/
+;(quote        tagstest.el     /^(defalias (quote 
explicitly-quoted-pending-delete-/
+;;
+;; Output from ctags with my patch in L-getit():
+;;
+;pending-delete-mode   tagstest.el     /^(defalias 'pending-delete-mode 
'delete-selection-m/
+;explicitly-quoted-pending-delete-mode tagstest.el     /^(defalias (quote 
explicitly-quoted-pending-delete-/
+;; Output from original etags:
+;;
+;tagstest.el,61
+;(defalias 'pending-delete-mode 4,68
+;(defalias (quote 7,141
+;;
+;; Output from patched etags:
+;;
+;tagstest.el,99
+;(defalias 'pending-delete-mode 4,68
+;(defalias (quote explicitly-quoted-pending-delete-mode)7,141
+;;
diff --git a/test/etags/el-src/emacs/lisp/progmodes/etags.el 
b/test/etags/el-src/emacs/lisp/progmodes/etags.el
new file mode 100644
index 0000000..6acafdb
--- /dev/null
+++ b/test/etags/el-src/emacs/lisp/progmodes/etags.el
@@ -0,0 +1,2153 @@
+;;; etags.el --- etags facility for Emacs  -*- lexical-binding: t -*-
+
+;; Copyright (C) 1985-1986, 1988-1989, 1992-1996, 1998, 2000-2015 Free
+;; Software Foundation, Inc.
+
+;; Author: Roland McGrath <address@hidden>
+;; Maintainer: address@hidden
+;; Keywords: tools
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'ring)
+(require 'button)
+(require 'xref)
+
+;;;###autoload
+(defvar tags-file-name nil
+  "File name of tags table.
+To switch to a new tags table, setting this variable is sufficient.
+If you set this variable, do not also set `tags-table-list'.
+Use the `etags' program to make a tags table file.")
+;; Make M-x set-variable tags-file-name like M-x visit-tags-table.
+;;;###autoload (put 'tags-file-name 'variable-interactive (purecopy "fVisit 
tags table: "))
+;;;###autoload (put 'tags-file-name 'safe-local-variable 'stringp)
+
+(defgroup etags nil "Tags tables."
+  :group 'tools)
+
+;;;###autoload
+(defcustom tags-case-fold-search 'default
+  "Whether tags operations should be case-sensitive.
+A value of t means case-insensitive, a value of nil means case-sensitive.
+Any other value means use the setting of `case-fold-search'."
+  :group 'etags
+  :type '(choice (const :tag "Case-sensitive" nil)
+                (const :tag "Case-insensitive" t)
+                (other :tag "Use default" default))
+  :version "21.1")
+
+;;;###autoload
+;; Use `visit-tags-table-buffer' to cycle through tags tables in this list.
+(defcustom tags-table-list nil
+  "List of file names of tags tables to search.
+An element that is a directory means the file \"TAGS\" in that directory.
+To switch to a new list of tags tables, setting this variable is sufficient.
+If you set this variable, do not also set `tags-file-name'.
+Use the `etags' program to make a tags table file."
+  :group 'etags
+  :type '(repeat file))
+
+;;;###autoload
+(defcustom tags-compression-info-list
+  (purecopy '("" ".Z" ".bz2" ".gz" ".xz" ".tgz"))
+  "List of extensions tried by etags when `auto-compression-mode' is on.
+An empty string means search the non-compressed file."
+  :version "24.1"                      ; added xz
+  :type  '(repeat string)
+  :group 'etags)
+
+;; !!! tags-compression-info-list should probably be replaced by access
+;; to directory list and matching jka-compr-compression-info-list. Currently,
+;; this implementation forces each modification of
+;; jka-compr-compression-info-list to be reflected in this var.
+;; An alternative could be to say that introducing a special
+;; element in this list (e.g. t) means : try at this point
+;; using directory listing and regexp matching using
+;; jka-compr-compression-info-list.
+
+
+;;;###autoload
+(defcustom tags-add-tables 'ask-user
+  "Control whether to add a new tags table to the current list.
+t means do; nil means don't (always start a new list).
+Any other value means ask the user whether to add a new tags table
+to the current list (as opposed to starting a new list)."
+  :group 'etags
+  :type '(choice (const :tag "Do" t)
+                (const :tag "Don't" nil)
+                (other :tag "Ask" ask-user)))
+
+(defcustom tags-revert-without-query nil
+  "Non-nil means reread a TAGS table without querying, if it has changed."
+  :group 'etags
+  :type 'boolean)
+
+(defvar tags-table-computed-list nil
+  "List of tags tables to search, computed from `tags-table-list'.
+This includes tables implicitly included by other tables.  The list is not
+always complete: the included tables of a table are not known until that
+table is read into core.  An element that is t is a placeholder
+indicating that the preceding element is a table that has not been read
+into core and might contain included tables to search.
+See `tags-table-check-computed-list'.")
+
+(defvar tags-table-computed-list-for nil
+  "Value of `tags-table-list' that `tags-table-computed-list' corresponds to.
+If `tags-table-list' changes, `tags-table-computed-list' is thrown away and
+recomputed; see `tags-table-check-computed-list'.")
+
+(defvar tags-table-list-pointer nil
+  "Pointer into `tags-table-computed-list' for the current state of searching.
+Use `visit-tags-table-buffer' to cycle through tags tables in this list.")
+
+(defvar tags-table-list-started-at nil
+  "Pointer into `tags-table-computed-list', where the current search started.")
+
+(defvar tags-table-set-list nil
+  "List of sets of tags table which have been used together in the past.
+Each element is a list of strings which are file names.")
+
+;;;###autoload
+(defcustom find-tag-hook nil
+  "Hook to be run by \\[find-tag] after finding a tag.  See `run-hooks'.
+The value in the buffer in which \\[find-tag] is done is used,
+not the value in the buffer \\[find-tag] goes to."
+  :group 'etags
+  :type 'hook)
+
+;;;###autoload
+(defcustom find-tag-default-function nil
+  "A function of no arguments used by \\[find-tag] to pick a default tag.
+If nil, and the symbol that is the value of `major-mode'
+has a `find-tag-default-function' property (see `put'), that is used.
+Otherwise, `find-tag-default' is used."
+  :group 'etags
+  :type '(choice (const nil) function))
+
+(define-obsolete-variable-alias 'find-tag-marker-ring-length
+  'xref-marker-ring-length "25.1")
+
+(defcustom tags-tag-face 'default
+  "Face for tags in the output of `tags-apropos'."
+  :group 'etags
+  :type 'face
+  :version "21.1")
+
+(defcustom tags-apropos-verbose nil
+  "If non-nil, print the name of the tags file in the *Tags List* buffer."
+  :group 'etags
+  :type 'boolean
+  :version "21.1")
+
+(defcustom tags-apropos-additional-actions nil
+  "Specify additional actions for `tags-apropos'.
+
+If non-nil, value should be a list of triples (TITLE FUNCTION
+TO-SEARCH).  For each triple, `tags-apropos' processes TO-SEARCH and
+lists tags from it.  TO-SEARCH should be an alist, obarray, or symbol.
+If it is a symbol, the symbol's value is used.
+TITLE, a string, is a title used to label the additional list of tags.
+FUNCTION is a function to call when a symbol is selected in the
+*Tags List* buffer.  It will be called with one argument SYMBOL which
+is the symbol being selected.
+
+Example value:
+
+  '((\"Emacs Lisp\" Info-goto-emacs-command-node obarray)
+    (\"Common Lisp\" common-lisp-hyperspec common-lisp-hyperspec-obarray)
+    (\"SCWM\" scwm-documentation scwm-obarray))"
+  :group 'etags
+  :type '(repeat (list (string :tag "Title")
+                      function
+                      (sexp :tag "Tags to search")))
+  :version "21.1")
+
+(defvaralias 'find-tag-marker-ring 'xref--marker-ring)
+(make-obsolete-variable
+ 'find-tag-marker-ring
+ "use `xref-push-marker-stack' or `xref-pop-marker-stack' instead."
+ "25.1")
+
+(defvar default-tags-table-function nil
+  "If non-nil, a function to choose a default tags file for a buffer.
+This function receives no arguments and should return the default
+tags table file to use for the current buffer.")
+
+(defvar tags-location-ring (make-ring xref-marker-ring-length)
+  "Ring of markers which are locations visited by \\[find-tag].
+Pop back to the last location with \\[negative-argument] \\[find-tag].")
+
+;; Tags table state.
+;; These variables are local in tags table buffers.
+
+(defvar tags-table-files nil
+  "List of file names covered by current tags table.
+nil means it has not yet been computed;
+use function `tags-table-files' to do so.")
+
+(defvar tags-completion-table nil
+  "Obarray of tag names defined in current tags table.")
+
+(defvar tags-included-tables nil
+  "List of tags tables included by the current tags table.")
+
+(defvar next-file-list nil
+  "List of files for \\[next-file] to process.")
+
+;; Hooks for file formats.
+
+(defvar tags-table-format-functions '(etags-recognize-tags-table
+                                     tags-recognize-empty-tags-table)
+  "Hook to be called in a tags table buffer to identify the type of tags table.
+The functions are called in order, with no arguments,
+until one returns non-nil.  The function should make buffer-local bindings
+of the format-parsing tags function variables if successful.")
+
+(defvar file-of-tag-function nil
+  "Function to do the work of `file-of-tag' (which see).
+One optional argument, a boolean specifying to return complete path (nil) or
+relative path (non-nil).")
+(defvar tags-table-files-function nil
+  "Function to do the work of function `tags-table-files' (which see).")
+(defvar tags-completion-table-function nil
+  "Function to build the `tags-completion-table'.")
+(defvar snarf-tag-function nil
+  "Function to get info about a matched tag for `goto-tag-location-function'.
+One optional argument, specifying to use explicit tag (non-nil) or not (nil).
+The default is nil.")
+(defvar goto-tag-location-function nil
+  "Function of to go to the location in the buffer specified by a tag.
+One argument, the tag info returned by `snarf-tag-function'.")
+(defvar find-tag-regexp-search-function nil
+  "Search function passed to `find-tag-in-order' for finding a regexp tag.")
+(defvar find-tag-regexp-tag-order nil
+  "Tag order passed to `find-tag-in-order' for finding a regexp tag.")
+(defvar find-tag-regexp-next-line-after-failure-p nil
+  "Flag passed to `find-tag-in-order' for finding a regexp tag.")
+(defvar find-tag-search-function nil
+  "Search function passed to `find-tag-in-order' for finding a tag.")
+(defvar find-tag-tag-order nil
+  "Tag order passed to `find-tag-in-order' for finding a tag.")
+(defvar find-tag-next-line-after-failure-p nil
+  "Flag passed to `find-tag-in-order' for finding a tag.")
+(defvar list-tags-function nil
+  "Function to do the work of `list-tags' (which see).")
+(defvar tags-apropos-function nil
+  "Function to do the work of `tags-apropos' (which see).")
+(defvar tags-included-tables-function nil
+  "Function to do the work of function `tags-included-tables' (which see).")
+(defvar verify-tags-table-function nil
+  "Function to return t if current buffer contains valid tags file.")
+
+(defun initialize-new-tags-table ()
+  "Initialize the tags table in the current buffer.
+Return non-nil if it is a valid tags table, and
+in that case, also make the tags table state variables
+buffer-local and set them to nil."
+  (set (make-local-variable 'tags-table-files) nil)
+  (set (make-local-variable 'tags-completion-table) nil)
+  (set (make-local-variable 'tags-included-tables) nil)
+  ;; We used to initialize find-tag-marker-ring and tags-location-ring
+  ;; here, to new empty rings.  But that is wrong, because those
+  ;; are global.
+
+  ;; Value is t if we have found a valid tags table buffer.
+  (run-hook-with-args-until-success 'tags-table-format-functions))
+
+;;;###autoload
+(defun tags-table-mode ()
+  "Major mode for tags table file buffers."
+  (interactive)
+  (setq major-mode 'tags-table-mode     ;FIXME: Use define-derived-mode.
+        mode-name "Tags Table"
+        buffer-undo-list t)
+  (initialize-new-tags-table))
+
+;;;###autoload
+(defun visit-tags-table (file &optional local)
+  "Tell tags commands to use tags table file FILE.
+FILE should be the name of a file created with the `etags' program.
+A directory name is ok too; it means file TAGS in that directory.
+
+Normally \\[visit-tags-table] sets the global value of `tags-file-name'.
+With a prefix arg, set the buffer-local value instead.
+When you find a tag with \\[find-tag], the buffer it finds the tag
+in is given a local value of this variable which is the name of the tags
+file the tag was in."
+  (interactive (list (read-file-name "Visit tags table (default TAGS): "
+                                    default-directory
+                                    (expand-file-name "TAGS"
+                                                      default-directory)
+                                    t)
+                    current-prefix-arg))
+  (or (stringp file) (signal 'wrong-type-argument (list 'stringp file)))
+  ;; Bind tags-file-name so we can control below whether the local or
+  ;; global value gets set.
+  ;; Calling visit-tags-table-buffer with tags-file-name set to FILE will
+  ;; initialize a buffer for FILE and set tags-file-name to the
+  ;; fully-expanded name.
+  (let ((tags-file-name file))
+    (save-excursion
+      (or (visit-tags-table-buffer file)
+         (signal 'file-error (list "Visiting tags table"
+                                   "No such file or directory"
+                                   file)))
+      ;; Set FILE to the expanded name.
+      (setq file tags-file-name)))
+  (if local
+      ;; Set the local value of tags-file-name.
+      (set (make-local-variable 'tags-file-name) file)
+    ;; Set the global value of tags-file-name.
+    (setq-default tags-file-name file)))
+
+(defun tags-table-check-computed-list ()
+  "Compute `tags-table-computed-list' from `tags-table-list' if necessary."
+  (let ((expanded-list (mapcar 'tags-expand-table-name tags-table-list)))
+    (or (equal tags-table-computed-list-for expanded-list)
+       ;; The list (or default-directory) has changed since last computed.
+       (let* ((compute-for (mapcar 'copy-sequence expanded-list))
+              (tables (copy-sequence compute-for)) ;Mutated in the loop.
+              (computed nil)
+              table-buffer)
+
+         (while tables
+           (setq computed (cons (car tables) computed)
+                 table-buffer (get-file-buffer (car tables)))
+           (if (and table-buffer
+                    ;; There is a buffer visiting the file.  Now make sure
+                    ;; it is initialized as a tag table buffer.
+                    (save-excursion
+                      (tags-verify-table (buffer-file-name table-buffer))))
+               (with-current-buffer table-buffer
+                  ;; Needed so long as etags-tags-included-tables
+                  ;; does not save-excursion.
+                  (save-excursion
+                    (if (tags-included-tables)
+                        ;; Insert the included tables into the list we
+                        ;; are processing.
+                        (setcdr tables (nconc (mapcar 'tags-expand-table-name
+                                                      (tags-included-tables))
+                                              (cdr tables))))))
+             ;; This table is not in core yet.  Insert a placeholder
+             ;; saying we must read it into core to check for included
+             ;; tables before searching the next table in the list.
+             (setq computed (cons t computed)))
+           (setq tables (cdr tables)))
+
+         ;; Record the tags-table-list value (and the context of the
+         ;; current directory) we computed from.
+         (setq tags-table-computed-list-for compute-for
+               tags-table-computed-list (nreverse computed))))))
+
+(defun tags-table-extend-computed-list ()
+  "Extend `tags-table-computed-list' to remove the first t placeholder.
+
+An element of the list that is t is a placeholder indicating that the
+preceding element is a table that has not been read in and might
+contain included tables to search.  This function reads in the first
+such table and puts its included tables into the list."
+  (let ((list tags-table-computed-list))
+    (while (not (eq (nth 1 list) t))
+      (setq list (cdr list)))
+    (save-excursion
+      (if (tags-verify-table (car list))
+         ;; We are now in the buffer visiting (car LIST).  Extract its
+         ;; list of included tables and insert it into the computed list.
+         (let ((tables (tags-included-tables))
+               (computed nil)
+               table-buffer)
+           (while tables
+             (setq computed (cons (car tables) computed)
+                   table-buffer (get-file-buffer (car tables)))
+             (if table-buffer
+                 (with-current-buffer table-buffer
+                   (if (tags-included-tables)
+                       ;; Insert the included tables into the list we
+                       ;; are processing.
+                       (setcdr tables (append (tags-included-tables)
+                                              tables))))
+               ;; This table is not in core yet.  Insert a placeholder
+               ;; saying we must read it into core to check for included
+               ;; tables before searching the next table in the list.
+               (setq computed (cons t computed)))
+             (setq tables (cdr tables)))
+           (setq computed (nreverse computed))
+           ;; COMPUTED now contains the list of included tables (and
+           ;; tables included by them, etc.).  Now splice this into the
+           ;; current list.
+           (setcdr list (nconc computed (cdr (cdr list)))))
+       ;; It was not a valid table, so just remove the following placeholder.
+       (setcdr list (cdr (cdr list)))))))
+
+(defun tags-expand-table-name (file)
+  "Expand tags table name FILE into a complete file name."
+  (setq file (expand-file-name file))
+  (if (file-directory-p file)
+      (expand-file-name "TAGS" file)
+    file))
+
+;; Like member, but comparison is done after tags-expand-table-name on both
+;; sides and elements of LIST that are t are skipped.
+(defun tags-table-list-member (file list)
+  "Like (member FILE LIST) after applying `tags-expand-table-name'.
+More precisely, apply `tags-expand-table-name' to FILE
+and each element of LIST, returning the link whose car is the first match.
+If an element of LIST is t, ignore it."
+  (setq file (tags-expand-table-name file))
+  (while (and list
+             (or (eq (car list) t)
+                 (not (string= file (tags-expand-table-name (car list))))))
+    (setq list (cdr list)))
+  list)
+
+(defun tags-verify-table (file)
+  "Read FILE into a buffer and verify that it is a valid tags table.
+Sets the current buffer to one visiting FILE (if it exists).
+Returns non-nil if it is a valid table."
+  (if (get-file-buffer file)
+      ;; The file is already in a buffer.  Check for the visited file
+      ;; having changed since we last used it.
+      (progn
+       (set-buffer (get-file-buffer file))
+        (or verify-tags-table-function (tags-table-mode))
+       (if (or (verify-visited-file-modtime (current-buffer))
+               ;; Decide whether to revert the file.
+               ;; revert-without-query can say to revert
+               ;; or the user can say to revert.
+               (not (or (let ((tail revert-without-query)
+                              (found nil))
+                          (while tail
+                            (if (string-match (car tail) buffer-file-name)
+                                (setq found t))
+                            (setq tail (cdr tail)))
+                          found)
+                        tags-revert-without-query
+                        (yes-or-no-p
+                         (format "Tags file %s has changed, read new contents? 
"
+                                 file)))))
+           (and verify-tags-table-function
+                (funcall verify-tags-table-function))
+         (revert-buffer t t)
+         (tags-table-mode)))
+    (when (file-exists-p file)
+      (let* ((buf (find-file-noselect file))
+             (newfile (buffer-file-name buf)))
+        (unless (string= file newfile)
+          ;; find-file-noselect has changed the file name.
+          ;; Propagate the change to tags-file-name and tags-table-list.
+          (let ((tail (member file tags-table-list)))
+            (if tail (setcar tail newfile)))
+          (if (eq file tags-file-name) (setq tags-file-name newfile)))
+        ;; Only change buffer now that we're done using potentially
+        ;; buffer-local variables.
+        (set-buffer buf)
+        (tags-table-mode)))))
+
+;; Subroutine of visit-tags-table-buffer.  Search the current tags tables
+;; for one that has tags for THIS-FILE (or that includes a table that
+;; does).  Return the name of the first table listing THIS-FILE; if
+;; the table is one included by another table, it is the master table that
+;; we return.  If CORE-ONLY is non-nil, check only tags tables that are
+;; already in buffers--don't visit any new files.
+(defun tags-table-including (this-file core-only)
+  "Search current tags tables for tags for THIS-FILE.
+Subroutine of `visit-tags-table-buffer'.
+Looks for a tags table that has such tags or that includes a table
+that has them.  Returns the name of the first such table.
+Non-nil CORE-ONLY means check only tags tables that are already in
+buffers.  If CORE-ONLY is nil, it is ignored."
+  (let ((tables tags-table-computed-list)
+       (found nil))
+    ;; Loop over the list, looking for a table containing tags for THIS-FILE.
+    (while (and (not found)
+               tables)
+
+      (if core-only
+         ;; Skip tables not in core.
+         (while (eq (nth 1 tables) t)
+           (setq tables (cdr (cdr tables))))
+       (if (eq (nth 1 tables) t)
+           ;; This table has not been read into core yet.  Read it in now.
+           (tags-table-extend-computed-list)))
+
+      (if tables
+         ;; Select the tags table buffer and get the file list up to date.
+         (let ((tags-file-name (car tables)))
+           (visit-tags-table-buffer 'same)
+           (if (member this-file (mapcar 'expand-file-name
+                                         (tags-table-files)))
+               ;; Found it.
+               (setq found tables))))
+      (setq tables (cdr tables)))
+    (if found
+       ;; Now determine if the table we found was one included by another
+       ;; table, not explicitly listed.  We do this by checking each
+       ;; element of the computed list to see if it appears in the user's
+       ;; explicit list; the last element we will check is FOUND itself.
+       ;; Then we return the last one which did in fact appear in
+       ;; tags-table-list.
+       (let ((could-be nil)
+             (elt tags-table-computed-list))
+         (while (not (eq elt (cdr found)))
+           (if (tags-table-list-member (car elt) tags-table-list)
+               ;; This table appears in the user's list, so it could be
+               ;; the one which includes the table we found.
+               (setq could-be (car elt)))
+           (setq elt (cdr elt))
+           (if (eq t (car elt))
+               (setq elt (cdr elt))))
+         ;; The last element we found in the computed list before FOUND
+         ;; that appears in the user's list will be the table that
+         ;; included the one we found.
+         could-be))))
+
+(defun tags-next-table ()
+  "Move `tags-table-list-pointer' along and set `tags-file-name'.
+Subroutine of `visit-tags-table-buffer'.\
+Returns nil when out of tables."
+  ;; If there is a placeholder element next, compute the list to replace it.
+  (while (eq (nth 1 tags-table-list-pointer) t)
+    (tags-table-extend-computed-list))
+
+  ;; Go to the next table in the list.
+  (setq tags-table-list-pointer (cdr tags-table-list-pointer))
+  (or tags-table-list-pointer
+      ;; Wrap around.
+      (setq tags-table-list-pointer tags-table-computed-list))
+
+  (if (eq tags-table-list-pointer tags-table-list-started-at)
+      ;; We have come full circle.  No more tables.
+      (setq tags-table-list-pointer nil)
+    ;; Set tags-file-name to the name from the list.  It is already expanded.
+    (setq tags-file-name (car tags-table-list-pointer))))
+
+;;;###autoload
+(defun visit-tags-table-buffer (&optional cont)
+  "Select the buffer containing the current tags table.
+If optional arg is a string, visit that file as a tags table.
+If optional arg is t, visit the next table in `tags-table-list'.
+If optional arg is the atom `same', don't look for a new table;
+ just select the buffer visiting `tags-file-name'.
+If arg is nil or absent, choose a first buffer from information in
+ `tags-file-name', `tags-table-list', `tags-table-list-pointer'.
+Returns t if it visits a tags table, or nil if there are no more in the list."
+
+  ;; Set tags-file-name to the tags table file we want to visit.
+  (cond ((eq cont 'same)
+        ;; Use the ambient value of tags-file-name.
+        (or tags-file-name
+            (user-error "%s"
+                         (substitute-command-keys
+                          (concat "No tags table in use; "
+                                  "use \\[visit-tags-table] to select one")))))
+       ((eq t cont)
+        ;; Find the next table.
+        (if (tags-next-table)
+            ;; Skip over nonexistent files.
+            (while (and (not (or (get-file-buffer tags-file-name)
+                                 (file-exists-p tags-file-name)))
+                        (tags-next-table)))))
+       (t
+        ;; Pick a table out of our hat.
+        (tags-table-check-computed-list) ;Get it up to date, we might use it.
+        (setq tags-file-name
+              (or
+               ;; If passed a string, use that.
+               (if (stringp cont)
+                   (prog1 cont
+                     (setq cont nil)))
+               ;; First, try a local variable.
+               (cdr (assq 'tags-file-name (buffer-local-variables)))
+               ;; Second, try a user-specified function to guess.
+               (and default-tags-table-function
+                    (funcall default-tags-table-function))
+               ;; Third, look for a tags table that contains tags for the
+               ;; current buffer's file.  If one is found, the lists will
+               ;; be frobnicated, and CONT will be set non-nil so we don't
+               ;; do it below.
+               (and buffer-file-name
+                    (or
+                     ;; First check only tables already in buffers.
+                     (tags-table-including buffer-file-name t)
+                     ;; Since that didn't find any, now do the
+                     ;; expensive version: reading new files.
+                     (tags-table-including buffer-file-name nil)))
+               ;; Fourth, use the user variable tags-file-name, if it is
+               ;; not already in the current list.
+               (and tags-file-name
+                    (not (tags-table-list-member tags-file-name
+                                                 tags-table-computed-list))
+                    tags-file-name)
+               ;; Fifth, use the user variable giving the table list.
+               ;; Find the first element of the list that actually exists.
+               (let ((list tags-table-list)
+                     file)
+                 (while (and list
+                             (setq file (tags-expand-table-name (car list)))
+                             (not (get-file-buffer file))
+                             (not (file-exists-p file)))
+                   (setq list (cdr list)))
+                 (car list))
+               ;; Finally, prompt the user for a file name.
+               (expand-file-name
+                (read-file-name "Visit tags table (default TAGS): "
+                                default-directory
+                                "TAGS"
+                                t))))))
+
+  ;; Expand the table name into a full file name.
+  (setq tags-file-name (tags-expand-table-name tags-file-name))
+
+  (unless (and (eq cont t) (null tags-table-list-pointer))
+    ;; Verify that tags-file-name names a valid tags table.
+    ;; Bind another variable with the value of tags-file-name
+    ;; before we switch buffers, in case tags-file-name is buffer-local.
+    (let ((curbuf (current-buffer))
+         (local-tags-file-name tags-file-name))
+      (if (tags-verify-table local-tags-file-name)
+
+         ;; We have a valid tags table.
+         (progn
+           ;; Bury the tags table buffer so it
+           ;; doesn't get in the user's way.
+           (bury-buffer (current-buffer))
+
+           ;; If this was a new table selection (CONT is nil), make
+           ;; sure tags-table-list includes the chosen table, and
+           ;; update the list pointer variables.
+           (or cont
+               ;; Look in the list for the table we chose.
+               (let ((found (tags-table-list-member
+                             local-tags-file-name
+                             tags-table-computed-list)))
+                 (if found
+                     ;; There it is.  Just switch to it.
+                     (setq tags-table-list-pointer found
+                           tags-table-list-started-at found)
+
+                   ;; The table is not in the current set.
+                   ;; Try to find it in another previously used set.
+                   (let ((sets tags-table-set-list))
+                     (while (and sets
+                                 (not (tags-table-list-member
+                                       local-tags-file-name
+                                       (car sets))))
+                       (setq sets (cdr sets)))
+                     (if sets
+                         ;; Found in some other set.  Switch to that set.
+                         (progn
+                           (or (memq tags-table-list tags-table-set-list)
+                               ;; Save the current list.
+                               (setq tags-table-set-list
+                                     (cons tags-table-list
+                                           tags-table-set-list)))
+                           (setq tags-table-list (car sets)))
+
+                       ;; Not found in any existing set.
+                       (if (and tags-table-list
+                                (or (eq t tags-add-tables)
+                                    (and tags-add-tables
+                                         (y-or-n-p
+                                          (concat "Keep current list of "
+                                                  "tags tables also? ")))))
+                           ;; Add it to the current list.
+                           (setq tags-table-list (cons local-tags-file-name
+                                                       tags-table-list))
+
+                         ;; Make a fresh list, and store the old one.
+                         (message "Starting a new list of tags tables")
+                         (or (null tags-table-list)
+                             (memq tags-table-list tags-table-set-list)
+                             (setq tags-table-set-list
+                                   (cons tags-table-list
+                                         tags-table-set-list)))
+                         ;; Clear out buffers holding old tables.
+                         (dolist (table tags-table-list)
+                           ;; The list can contain items t.
+                           (if (stringp table)
+                               (let ((buffer (find-buffer-visiting table)))
+                             (if buffer
+                                 (kill-buffer buffer)))))
+                         (setq tags-table-list (list local-tags-file-name))))
+
+                     ;; Recompute tags-table-computed-list.
+                     (tags-table-check-computed-list)
+                     ;; Set the tags table list state variables to start
+                     ;; over from tags-table-computed-list.
+                     (setq tags-table-list-started-at tags-table-computed-list
+                           tags-table-list-pointer
+                           tags-table-computed-list)))))
+
+           ;; Return of t says the tags table is valid.
+           t)
+
+       ;; The buffer was not valid.  Don't use it again.
+       (set-buffer curbuf)
+       (kill-local-variable 'tags-file-name)
+       (if (eq local-tags-file-name tags-file-name)
+           (setq tags-file-name nil))
+       (user-error (if (file-exists-p local-tags-file-name)
+                        "File %s is not a valid tags table"
+                      "File %s does not exist")
+                    local-tags-file-name)))))
+
+(defun tags-reset-tags-tables ()
+  "Reset tags state to cancel effect of any previous \\[visit-tags-table] or 
\\[find-tag]."
+  (interactive)
+  ;; Clear out the markers we are throwing away.
+  (let ((i 0))
+    (while (< i xref-marker-ring-length)
+      (if (aref (cddr tags-location-ring) i)
+         (set-marker (aref (cddr tags-location-ring) i) nil))
+      (setq i (1+ i))))
+  (xref-clear-marker-stack)
+  (setq tags-file-name nil
+       tags-location-ring (make-ring xref-marker-ring-length)
+       tags-table-list nil
+       tags-table-computed-list nil
+       tags-table-computed-list-for nil
+       tags-table-list-pointer nil
+       tags-table-list-started-at nil
+       tags-table-set-list nil))
+
+(defun file-of-tag (&optional relative)
+  "Return the file name of the file whose tags point is within.
+Assumes the tags table is the current buffer.
+If RELATIVE is non-nil, file name returned is relative to tags
+table file's directory. If RELATIVE is nil, file name returned
+is complete."
+  (funcall file-of-tag-function relative))
+
+;;;###autoload
+(defun tags-table-files ()
+  "Return a list of files in the current tags table.
+Assumes the tags table is the current buffer.  The file names are returned
+as they appeared in the `etags' command that created the table, usually
+without directory names."
+  (or tags-table-files
+      (setq tags-table-files
+           (funcall tags-table-files-function))))
+
+(defun tags-included-tables ()
+  "Return a list of tags tables included by the current table.
+Assumes the tags table is the current buffer."
+  (or tags-included-tables
+      (setq tags-included-tables (funcall tags-included-tables-function))))
+
+(defun tags-completion-table ()
+  "Build `tags-completion-table' on demand.
+The tags included in the completion table are those in the current
+tags table and its (recursively) included tags tables."
+  (or tags-completion-table
+      ;; No cached value for this buffer.
+      (condition-case ()
+         (let (current-table combined-table)
+           (message "Making tags completion table for %s..." buffer-file-name)
+           (save-excursion
+             ;; Iterate over the current list of tags tables.
+             (while (visit-tags-table-buffer (and combined-table t))
+               ;; Find possible completions in this table.
+               (setq current-table (funcall tags-completion-table-function))
+               ;; Merge this buffer's completions into the combined table.
+               (if combined-table
+                   (mapatoms
+                    (lambda (sym) (intern (symbol-name sym) combined-table))
+                    current-table)
+                 (setq combined-table current-table))))
+           (message "Making tags completion table for %s...done"
+                    buffer-file-name)
+           ;; Cache the result in a buffer-local variable.
+           (setq tags-completion-table combined-table))
+       (quit (message "Tags completion table construction aborted.")
+             (setq tags-completion-table nil)))))
+
+;;;###autoload
+(defun tags-lazy-completion-table ()
+  (let ((buf (current-buffer)))
+    (lambda (string pred action)
+      (with-current-buffer buf
+        (save-excursion
+          ;; If we need to ask for the tag table, allow that.
+          (let ((enable-recursive-minibuffers t))
+            (visit-tags-table-buffer))
+          (complete-with-action action (tags-completion-table) string 
pred))))))
+
+;;;###autoload (defun tags-completion-at-point-function ()
+;;;###autoload   (if (or tags-table-list tags-file-name)
+;;;###autoload       (progn
+;;;###autoload         (load "etags")
+;;;###autoload         (tags-completion-at-point-function))))
+
+(defun tags-completion-at-point-function ()
+  "Using tags, return a completion table for the text around point.
+If no tags table is loaded, do nothing and return nil."
+  (when (or tags-table-list tags-file-name)
+    (let ((completion-ignore-case (if (memq tags-case-fold-search '(t nil))
+                                     tags-case-fold-search
+                                   case-fold-search))
+         (pattern (funcall (or find-tag-default-function
+                               (get major-mode 'find-tag-default-function)
+                               'find-tag-default)))
+         beg)
+      (when pattern
+       (save-excursion
+          (forward-char (1- (length pattern)))
+          (search-backward pattern)
+          (setq beg (point))
+          (forward-char (length pattern))
+          (list beg (point) (tags-lazy-completion-table) :exclusive 'no))))))
+
+(defun find-tag-tag (string)
+  "Read a tag name, with defaulting and completion."
+  (let* ((completion-ignore-case (if (memq tags-case-fold-search '(t nil))
+                                    tags-case-fold-search
+                                  case-fold-search))
+        (default (funcall (or find-tag-default-function
+                              (get major-mode 'find-tag-default-function)
+                              'find-tag-default)))
+        (spec (completing-read (if default
+                                   (format "%s (default %s): "
+                                           (substring string 0 (string-match 
"[ :]+\\'" string))
+                                           default)
+                                 string)
+                               (tags-lazy-completion-table)
+                               nil nil nil nil default)))
+    (if (equal spec "")
+       (or default (user-error "There is no default tag"))
+      spec)))
+
+(defvar last-tag nil
+  "Last tag found by \\[find-tag].")
+
+(defun find-tag-interactive (prompt &optional no-default)
+  "Get interactive arguments for tag functions.
+The functions using this are `find-tag-noselect',
+`find-tag-other-window', and `find-tag-regexp'."
+  (if (and current-prefix-arg last-tag)
+      (list nil (if (< (prefix-numeric-value current-prefix-arg) 0)
+                   '-
+                 t))
+    (list (if no-default
+             (read-string prompt)
+           (find-tag-tag prompt)))))
+
+(defvar find-tag-history nil) ; Doc string?
+
+;; Dynamic bondage:
+(defvar etags-case-fold-search)
+(defvar etags-syntax-table)
+(defvar local-find-tag-hook)
+
+;;;###autoload
+(defun find-tag-noselect (tagname &optional next-p regexp-p)
+  "Find tag (in current tags table) whose name contains TAGNAME.
+Returns the buffer containing the tag's definition and moves its point there,
+but does not select the buffer.
+The default for TAGNAME is the expression in the buffer near point.
+
+If second arg NEXT-P is t (interactively, with prefix arg), search for
+another tag that matches the last tagname or regexp used.  When there are
+multiple matches for a tag, more exact matches are found first.  If NEXT-P
+is the atom `-' (interactively, with prefix arg that is a negative number
+or just \\[negative-argument]), pop back to the previous tag gone to.
+
+If third arg REGEXP-P is non-nil, treat TAGNAME as a regexp.
+
+A marker representing the point when this command is invoked is pushed
+onto a ring and may be popped back to with \\[pop-tag-mark].
+Contrast this with the ring of marks gone to by the command.
+
+See documentation of variable `tags-file-name'."
+  (interactive (find-tag-interactive "Find tag: "))
+
+  (setq find-tag-history (cons tagname find-tag-history))
+  ;; Save the current buffer's value of `find-tag-hook' before
+  ;; selecting the tags table buffer.  For the same reason, save value
+  ;; of `tags-file-name' in case it has a buffer-local value.
+  (let ((local-find-tag-hook find-tag-hook))
+    (if (eq '- next-p)
+       ;; Pop back to a previous location.
+       (if (ring-empty-p tags-location-ring)
+           (user-error "No previous tag locations")
+         (let ((marker (ring-remove tags-location-ring 0)))
+           (prog1
+               ;; Move to the saved location.
+               (set-buffer (or (marker-buffer marker)
+                                (error "The marked buffer has been deleted")))
+             (goto-char (marker-position marker))
+             ;; Kill that marker so it doesn't slow down editing.
+             (set-marker marker nil nil)
+             ;; Run the user's hook.  Do we really want to do this for pop?
+             (run-hooks 'local-find-tag-hook))))
+      ;; Record whence we came.
+      (xref-push-marker-stack)
+      (if (and next-p last-tag)
+         ;; Find the same table we last used.
+         (visit-tags-table-buffer 'same)
+       ;; Pick a table to use.
+       (visit-tags-table-buffer)
+       ;; Record TAGNAME for a future call with NEXT-P non-nil.
+       (setq last-tag tagname))
+      ;; Record the location so we can pop back to it later.
+      (let ((marker (make-marker)))
+       (with-current-buffer
+            ;; find-tag-in-order does the real work.
+            (find-tag-in-order
+             (if (and next-p last-tag) last-tag tagname)
+             (if regexp-p
+                 find-tag-regexp-search-function
+               find-tag-search-function)
+             (if regexp-p
+                 find-tag-regexp-tag-order
+               find-tag-tag-order)
+             (if regexp-p
+                 find-tag-regexp-next-line-after-failure-p
+               find-tag-next-line-after-failure-p)
+             (if regexp-p "matching" "containing")
+             (or (not next-p) (not last-tag)))
+         (set-marker marker (point))
+         (run-hooks 'local-find-tag-hook)
+         (ring-insert tags-location-ring marker)
+         (current-buffer))))))
+
+;;;###autoload
+(defun find-tag (tagname &optional next-p regexp-p)
+  "Find tag (in current tags table) whose name contains TAGNAME.
+Select the buffer containing the tag's definition, and move point there.
+The default for TAGNAME is the expression in the buffer around or before point.
+
+If second arg NEXT-P is t (interactively, with prefix arg), search for
+another tag that matches the last tagname or regexp used.  When there are
+multiple matches for a tag, more exact matches are found first.  If NEXT-P
+is the atom `-' (interactively, with prefix arg that is a negative number
+or just \\[negative-argument]), pop back to the previous tag gone to.
+
+If third arg REGEXP-P is non-nil, treat TAGNAME as a regexp.
+
+A marker representing the point when this command is invoked is pushed
+onto a ring and may be popped back to with \\[pop-tag-mark].
+Contrast this with the ring of marks gone to by the command.
+
+See documentation of variable `tags-file-name'."
+  (interactive (find-tag-interactive "Find tag: "))
+  (let* ((buf (find-tag-noselect tagname next-p regexp-p))
+        (pos (with-current-buffer buf (point))))
+    (condition-case nil
+       (switch-to-buffer buf)
+      (error (pop-to-buffer buf)))
+    (goto-char pos)))
+
+;;;###autoload
+(defun find-tag-other-window (tagname &optional next-p regexp-p)
+  "Find tag (in current tags table) whose name contains TAGNAME.
+Select the buffer containing the tag's definition in another window, and
+move point there.  The default for TAGNAME is the expression in the buffer
+around or before point.
+
+If second arg NEXT-P is t (interactively, with prefix arg), search for
+another tag that matches the last tagname or regexp used.  When there are
+multiple matches for a tag, more exact matches are found first.  If NEXT-P
+is negative (interactively, with prefix arg that is a negative number or
+just \\[negative-argument]), pop back to the previous tag gone to.
+
+If third arg REGEXP-P is non-nil, treat TAGNAME as a regexp.
+
+A marker representing the point when this command is invoked is pushed
+onto a ring and may be popped back to with \\[pop-tag-mark].
+Contrast this with the ring of marks gone to by the command.
+
+See documentation of variable `tags-file-name'."
+  (declare (obsolete xref-find-definitions-other-window "25.1"))
+  (interactive (find-tag-interactive "Find tag other window: "))
+
+  ;; This hair is to deal with the case where the tag is found in the
+  ;; selected window's buffer; without the hair, point is moved in both
+  ;; windows.  To prevent this, we save the selected window's point before
+  ;; doing find-tag-noselect, and restore it after.
+  (let* ((window-point (window-point))
+        (tagbuf (find-tag-noselect tagname next-p regexp-p))
+        (tagpoint (progn (set-buffer tagbuf) (point))))
+    (set-window-point (prog1
+                         (selected-window)
+                       (switch-to-buffer-other-window tagbuf)
+                       ;; We have to set this new window's point; it
+                       ;; might already have been displaying a
+                       ;; different portion of tagbuf, in which case
+                       ;; switch-to-buffer-other-window doesn't set
+                       ;; the window's point from the buffer.
+                       (set-window-point (selected-window) tagpoint))
+                     window-point)))
+
+;;;###autoload
+(defun find-tag-other-frame (tagname &optional next-p)
+  "Find tag (in current tags table) whose name contains TAGNAME.
+Select the buffer containing the tag's definition in another frame, and
+move point there.  The default for TAGNAME is the expression in the buffer
+around or before point.
+
+If second arg NEXT-P is t (interactively, with prefix arg), search for
+another tag that matches the last tagname or regexp used.  When there are
+multiple matches for a tag, more exact matches are found first.  If NEXT-P
+is negative (interactively, with prefix arg that is a negative number or
+just \\[negative-argument]), pop back to the previous tag gone to.
+
+If third arg REGEXP-P is non-nil, treat TAGNAME as a regexp.
+
+A marker representing the point when this command is invoked is pushed
+onto a ring and may be popped back to with \\[pop-tag-mark].
+Contrast this with the ring of marks gone to by the command.
+
+See documentation of variable `tags-file-name'."
+  (declare (obsolete xref-find-definitions-other-frame "25.1"))
+  (interactive (find-tag-interactive "Find tag other frame: "))
+  (let ((pop-up-frames t))
+    (find-tag-other-window tagname next-p)))
+
+;;;###autoload
+(defun find-tag-regexp (regexp &optional next-p other-window)
+  "Find tag (in current tags table) whose name matches REGEXP.
+Select the buffer containing the tag's definition and move point there.
+
+If second arg NEXT-P is t (interactively, with prefix arg), search for
+another tag that matches the last tagname or regexp used.  When there are
+multiple matches for a tag, more exact matches are found first.  If NEXT-P
+is negative (interactively, with prefix arg that is a negative number or
+just \\[negative-argument]), pop back to the previous tag gone to.
+
+If third arg OTHER-WINDOW is non-nil, select the buffer in another window.
+
+A marker representing the point when this command is invoked is pushed
+onto a ring and may be popped back to with \\[pop-tag-mark].
+Contrast this with the ring of marks gone to by the command.
+
+See documentation of variable `tags-file-name'."
+  (declare (obsolete xref-find-apropos "25.1"))
+  (interactive (find-tag-interactive "Find tag regexp: " t))
+  ;; We go through find-tag-other-window to do all the display hair there.
+  (funcall (if other-window 'find-tag-other-window 'find-tag)
+          regexp next-p t))
+
+;;;###autoload
+(defalias 'pop-tag-mark 'xref-pop-marker-stack)
+
+
+(defvar tag-lines-already-matched nil
+  "Matches remembered between calls.") ; Doc string: calls to what?
+
+(defun find-tag-in-order (pattern
+                         search-forward-func
+                         order
+                         next-line-after-failure-p
+                         matching
+                         first-search)
+  "Internal tag-finding function.
+PATTERN is a string to pass to arg SEARCH-FORWARD-FUNC, and to any
+member of the function list ORDER.  If ORDER is nil, use saved state
+to continue a previous search.
+
+Arg NEXT-LINE-AFTER-FAILURE-P is non-nil if after a failed match,
+point should be moved to the next line.
+
+Arg MATCHING is a string, an English `-ing' word, to be used in an
+error message."
+;; Algorithm is as follows:
+;; For each qualifier-func in ORDER, go to beginning of tags file, and
+;; perform inner loop: for each naive match for PATTERN found using
+;; SEARCH-FORWARD-FUNC, qualify the naive match using qualifier-func.  If
+;; it qualifies, go to the specified line in the specified source file
+;; and return.  Qualified matches are remembered to avoid repetition.
+;; State is saved so that the loop can be continued.
+  (let (file                           ;name of file containing tag
+       tag-info                        ;where to find the tag in FILE
+       (first-table t)
+       (tag-order order)
+       (match-marker (make-marker))
+       goto-func
+       (case-fold-search (if (memq tags-case-fold-search '(nil t))
+                             tags-case-fold-search
+                           case-fold-search))
+       )
+    (save-excursion
+
+      (if first-search
+         ;; This is the start of a search for a fresh tag.
+         ;; Clear the list of tags matched by the previous search.
+         ;; find-tag-noselect has already put us in the first tags table
+         ;; buffer before we got called.
+         (setq tag-lines-already-matched nil)
+       ;; Continuing to search for the tag specified last time.
+       ;; tag-lines-already-matched lists locations matched in previous
+       ;; calls so we don't visit the same tag twice if it matches twice
+       ;; during two passes with different qualification predicates.
+       ;; Switch to the current tags table buffer.
+       (visit-tags-table-buffer 'same))
+
+      ;; Get a qualified match.
+      (catch 'qualified-match-found
+
+       ;; Iterate over the list of tags tables.
+       (while (or first-table
+                  (visit-tags-table-buffer t))
+
+         (and first-search first-table
+              ;; Start at beginning of tags file.
+              (goto-char (point-min)))
+
+         (setq first-table nil)
+
+         ;; Iterate over the list of ordering predicates.
+         (while order
+           (while (funcall search-forward-func pattern nil t)
+             ;; Naive match found.  Qualify the match.
+             (and (funcall (car order) pattern)
+                  ;; Make sure it is not a previous qualified match.
+                  (not (member (set-marker match-marker (point-at-bol))
+                               tag-lines-already-matched))
+                  (throw 'qualified-match-found nil))
+             (if next-line-after-failure-p
+                 (forward-line 1)))
+           ;; Try the next flavor of match.
+           (setq order (cdr order))
+           (goto-char (point-min)))
+         (setq order tag-order))
+       ;; We throw out on match, so only get here if there were no matches.
+       ;; Clear out the markers we use to avoid duplicate matches so they
+       ;; don't slow down editing and are immediately available for GC.
+       (while tag-lines-already-matched
+         (set-marker (car tag-lines-already-matched) nil nil)
+         (setq tag-lines-already-matched (cdr tag-lines-already-matched)))
+       (set-marker match-marker nil nil)
+       (user-error "No %stags %s %s" (if first-search "" "more ")
+                    matching pattern))
+
+      ;; Found a tag; extract location info.
+      (beginning-of-line)
+      (setq tag-lines-already-matched (cons match-marker
+                                           tag-lines-already-matched))
+      ;; Expand the filename, using the tags table buffer's default-directory.
+      ;; We should be able to search for file-name backwards in file-of-tag:
+      ;; the beginning-of-line is ok except when positioned on a "file-name" 
tag.
+      (setq file (expand-file-name
+                 (if (memq (car order) '(tag-exact-file-name-match-p
+                                         tag-file-name-match-p
+                                         tag-partial-file-name-match-p))
+                      (save-excursion (forward-line 1)
+                                      (file-of-tag))
+                    (file-of-tag)))
+           tag-info (funcall snarf-tag-function))
+
+      ;; Get the local value in the tags table buffer before switching buffers.
+      (setq goto-func goto-tag-location-function)
+      (tag-find-file-of-tag-noselect file)
+      (widen)
+      (push-mark)
+      (funcall goto-func tag-info)
+
+      ;; Return the buffer where the tag was found.
+      (current-buffer))))
+
+(defun tag-find-file-of-tag-noselect (file)
+  "Find the right line in the specified FILE."
+  ;; If interested in compressed-files, search files with extensions.
+  ;; Otherwise, search only the real file.
+  (let* ((buffer-search-extensions (if auto-compression-mode
+                                      tags-compression-info-list
+                                    '("")))
+        the-buffer
+        (file-search-extensions buffer-search-extensions))
+    ;; search a buffer visiting the file with each possible extension
+    ;; Note: there is a small inefficiency in find-buffer-visiting :
+    ;;   truename is computed even if not needed. Not too sure about this
+    ;;   but I suspect truename computation accesses the disk.
+    ;;   It is maybe a good idea to optimize this find-buffer-visiting.
+    ;; An alternative would be to use only get-file-buffer
+    ;; but this looks less "sure" to find the buffer for the file.
+    (while (and (not the-buffer) buffer-search-extensions)
+      (setq the-buffer (find-buffer-visiting (concat file (car 
buffer-search-extensions))))
+      (setq buffer-search-extensions (cdr buffer-search-extensions)))
+    ;; if found a buffer but file modified, ensure we re-read !
+    (if (and the-buffer (not (verify-visited-file-modtime the-buffer)))
+       (find-file-noselect (buffer-file-name the-buffer)))
+    ;; if no buffer found, search for files with possible extensions on disk
+    (while (and (not the-buffer) file-search-extensions)
+      (if (not (file-exists-p (concat file (car file-search-extensions))))
+         (setq file-search-extensions (cdr file-search-extensions))
+       (setq the-buffer (find-file-noselect (concat file (car 
file-search-extensions))))))
+    (if (not the-buffer)
+       (if auto-compression-mode
+           (error "File %s (with or without extensions %s) not found" file 
tags-compression-info-list)
+         (error "File %s not found" file))
+      (set-buffer the-buffer))))
+
+(defun tag-find-file-of-tag (file) ; Doc string?
+  (let ((buf (tag-find-file-of-tag-noselect file)))
+    (condition-case nil
+       (switch-to-buffer buf)
+      (error (pop-to-buffer buf)))))
+
+;; `etags' TAGS file format support.
+
+(defun etags-recognize-tags-table ()
+  "If `etags-verify-tags-table', make buffer-local format variables.
+If current buffer is a valid etags TAGS file, then give it
+buffer-local values of tags table format variables."
+  (and (etags-verify-tags-table)
+       ;; It is annoying to flash messages on the screen briefly,
+       ;; and this message is not useful.  -- rms
+       ;; (message "%s is an `etags' TAGS file" buffer-file-name)
+       (mapc (lambda (elt) (set (make-local-variable (car elt)) (cdr elt)))
+            '((file-of-tag-function . etags-file-of-tag)
+              (tags-table-files-function . etags-tags-table-files)
+              (tags-completion-table-function . etags-tags-completion-table)
+              (snarf-tag-function . etags-snarf-tag)
+              (goto-tag-location-function . etags-goto-tag-location)
+              (find-tag-regexp-search-function . re-search-forward)
+              (find-tag-regexp-tag-order . (tag-re-match-p))
+              (find-tag-regexp-next-line-after-failure-p . t)
+              (find-tag-search-function . search-forward)
+              (find-tag-tag-order . (tag-exact-file-name-match-p
+                                      tag-file-name-match-p
+                                     tag-exact-match-p
+                                     tag-implicit-name-match-p
+                                     tag-symbol-match-p
+                                     tag-word-match-p
+                                     tag-partial-file-name-match-p
+                                     tag-any-match-p))
+              (find-tag-next-line-after-failure-p . nil)
+              (list-tags-function . etags-list-tags)
+              (tags-apropos-function . etags-tags-apropos)
+              (tags-included-tables-function . etags-tags-included-tables)
+              (verify-tags-table-function . etags-verify-tags-table)
+              ))))
+
+(defun etags-verify-tags-table ()
+  "Return non-nil if the current buffer is a valid etags TAGS file."
+  ;; Use eq instead of = in case char-after returns nil.
+  (eq (char-after (point-min)) ?\f))
+
+(defun etags-file-of-tag (&optional relative) ; Doc string?
+  (save-excursion
+    (re-search-backward "\f\n\\([^\n]+\\),[0-9]*\n")
+    (let ((str (convert-standard-filename
+                (buffer-substring (match-beginning 1) (match-end 1)))))
+      (if relative
+         str
+       (expand-file-name str (file-truename default-directory))))))
+
+
+(defun etags-tags-completion-table () ; Doc string?
+  (let ((table (make-vector 511 0))
+       (progress-reporter
+        (make-progress-reporter
+         (format "Making tags completion table for %s..." buffer-file-name)
+         (point-min) (point-max))))
+    (save-excursion
+      (goto-char (point-min))
+      ;; This monster regexp matches an etags tag line.
+      ;;   \1 is the string to match;
+      ;;   \2 is not interesting;
+      ;;   \3 is the guessed tag name; XXX guess should be better eg DEFUN
+      ;;   \4 is not interesting;
+      ;;   \5 is the explicitly-specified tag name.
+      ;;   \6 is the line to start searching at;
+      ;;   \7 is the char to start searching at.
+      (while (re-search-forward
+             "^\\(\\([^\177]+[^-a-zA-Z0-9_+*$:\177]+\\)?\
+\\([-a-zA-Z0-9_+*$?:]+\\)[^-a-zA-Z0-9_+*$?:\177]*\\)\177\
+\\(\\([^\n\001]+\\)\001\\)?\\([0-9]+\\)?,\\([0-9]+\\)?\n"
+             nil t)
+       (intern (prog1 (if (match-beginning 5)
+                          ;; There is an explicit tag name.
+                          (buffer-substring (match-beginning 5) (match-end 5))
+                        ;; No explicit tag name.  Best guess.
+                        (buffer-substring (match-beginning 3) (match-end 3)))
+                 (progress-reporter-update progress-reporter (point)))
+               table)))
+    table))
+
+(defun etags-snarf-tag (&optional use-explicit) ; Doc string?
+  (let (tag-text line startpos explicit-start)
+    (if (save-excursion
+         (forward-line -1)
+         (looking-at "\f\n"))
+       ;; The match was for a source file name, not any tag within a file.
+       ;; Give text of t, meaning to go exactly to the location we specify,
+       ;; the beginning of the file.
+       (setq tag-text t
+             line nil
+             startpos (point-min))
+
+      ;; Find the end of the tag and record the whole tag text.
+      (search-forward "\177")
+      (setq tag-text (buffer-substring (1- (point)) (point-at-bol)))
+      ;; If use-explicit is non nil and explicit tag is present, use it as 
part of
+      ;; return value. Else just skip it.
+      (setq explicit-start (point))
+      (when (and (search-forward "\001" (point-at-bol 2) t)
+                use-explicit)
+       (setq tag-text (buffer-substring explicit-start (1- (point)))))
+
+
+      (if (looking-at "[0-9]")
+         (setq line (string-to-number (buffer-substring
+                                        (point)
+                                        (progn (skip-chars-forward "0-9")
+                                               (point))))))
+      (search-forward ",")
+      (if (looking-at "[0-9]")
+         (setq startpos (string-to-number (buffer-substring
+                                            (point)
+                                            (progn (skip-chars-forward "0-9")
+                                                   (point)))))))
+    ;; Leave point on the next line of the tags file.
+    (forward-line 1)
+    (cons tag-text (cons line startpos))))
+
+(defun etags-goto-tag-location (tag-info)
+  "Go to location of tag specified by TAG-INFO.
+TAG-INFO is a cons (TEXT LINE . POSITION).
+TEXT is the initial part of a line containing the tag.
+LINE is the line number.
+POSITION is the (one-based) char position of TEXT within the file.
+
+If TEXT is t, it means the tag refers to exactly LINE or POSITION,
+whichever is present, LINE having preference, no searching.
+Either LINE or POSITION can be nil.  POSITION is used if present.
+
+If the tag isn't exactly at the given position, then look near that
+position using a search window that expands progressively until it
+hits the start of file."
+  (let ((startpos (cdr (cdr tag-info)))
+       (line (car (cdr tag-info)))
+       offset found pat)
+    (if (eq (car tag-info) t)
+       ;; Direct file tag.
+       (cond (line (progn (goto-char (point-min))
+                          (forward-line (1- line))))
+             (startpos (goto-char startpos))
+             (t (error "etags.el BUG: bogus direct file tag")))
+      ;; This constant is 1/2 the initial search window.
+      ;; There is no sense in making it too small,
+      ;; since just going around the loop once probably
+      ;; costs about as much as searching 2000 chars.
+      (setq offset 1000
+           found nil
+           pat (concat (if (eq selective-display t)
+                           "\\(^\\|\^m\\)" "^")
+                       (regexp-quote (car tag-info))))
+      ;; The character position in the tags table is 0-origin.
+      ;; Convert it to a 1-origin Emacs character position.
+      (if startpos (setq startpos (1+ startpos)))
+      ;; If no char pos was given, try the given line number.
+      (or startpos
+         (if line
+             (setq startpos (progn (goto-char (point-min))
+                                   (forward-line (1- line))
+                                   (point)))))
+      (or startpos
+         (setq startpos (point-min)))
+      ;; First see if the tag is right at the specified location.
+      (goto-char startpos)
+      (setq found (looking-at pat))
+      (while (and (not found)
+                 (progn
+                   (goto-char (- startpos offset))
+                   (not (bobp))))
+       (setq found
+             (re-search-forward pat (+ startpos offset) t)
+             offset (* 3 offset)))     ; expand search window
+      (or found
+         (re-search-forward pat nil t)
+         (user-error "Rerun etags: `%s' not found in %s"
+                      pat buffer-file-name)))
+    ;; Position point at the right place
+    ;; if the search string matched an extra Ctrl-m at the beginning.
+    (and (eq selective-display t)
+        (looking-at "\^m")
+        (forward-char 1))
+    (beginning-of-line)))
+
+(defun etags-list-tags (file) ; Doc string?
+  (goto-char (point-min))
+  (when (re-search-forward (concat "\f\n" "\\(" file "\\)" ",") nil t)
+    (let ((path (save-excursion (forward-line 1) (file-of-tag)))
+         ;; Get the local value in the tags table
+         ;; buffer before switching buffers.
+         (goto-func goto-tag-location-function)
+         tag tag-info pt)
+    (forward-line 1)
+    (while (not (or (eobp) (looking-at "\f")))
+      ;; We used to use explicit tags when available, but the current goto-func
+      ;; can only handle implicit tags.
+      (setq tag-info (save-excursion (funcall snarf-tag-function nil))
+           tag (car tag-info)
+           pt (with-current-buffer standard-output (point)))
+      (princ tag)
+      (when (= (aref tag 0) ?\() (princ " ...)"))
+      (with-current-buffer standard-output
+       (make-text-button pt (point)
+                         'tag-info tag-info
+                         'file-path path
+                         'goto-func goto-func
+                         'action (lambda (button)
+                                   (let ((tag-info (button-get button 
'tag-info))
+                                         (goto-func (button-get button 
'goto-func)))
+                                     (tag-find-file-of-tag (button-get button 
'file-path))
+                                     (widen)
+                                     (funcall goto-func tag-info)))
+                         'follow-link t
+                         'face tags-tag-face
+                         'type 'button))
+      (terpri)
+      (forward-line 1))
+    t)))
+
+(defmacro tags-with-face (face &rest body)
+  "Execute BODY, give output to `standard-output' face FACE."
+  (let ((pp (make-symbol "start")))
+    `(let ((,pp (with-current-buffer standard-output (point))))
+       ,@body
+       (put-text-property ,pp (with-current-buffer standard-output (point))
+                         'face ,face standard-output))))
+
+(defun etags-tags-apropos-additional (regexp)
+  "Display tags matching REGEXP from `tags-apropos-additional-actions'."
+  (with-current-buffer standard-output
+    (dolist (oba tags-apropos-additional-actions)
+      (princ "\n\n")
+      (tags-with-face 'highlight (princ (car oba)))
+      (princ":\n\n")
+      (let* ((beg (point))
+            (symbs (car (cddr oba)))
+             (ins-symb (lambda (sy)
+                         (let ((sn (symbol-name sy)))
+                           (when (string-match regexp sn)
+                             (make-text-button (point)
+                                         (progn (princ sy) (point))
+                                         'action-internal(cadr oba)
+                                         'action (lambda (button) (funcall
+                                                                   (button-get 
button 'action-internal)
+                                                                   (button-get 
button 'item)))
+                                         'item sn
+                                         'face tags-tag-face
+                                         'follow-link t
+                                         'type 'button)
+                             (terpri))))))
+        (when (symbolp symbs)
+          (if (boundp symbs)
+             (setq symbs (symbol-value symbs))
+           (insert "symbol `" (symbol-name symbs) "' has no value\n")
+           (setq symbs nil)))
+        (if (vectorp symbs)
+           (mapatoms ins-symb symbs)
+         (dolist (sy symbs)
+           (funcall ins-symb (car sy))))
+        (sort-lines nil beg (point))))))
+
+(defun etags-tags-apropos (string) ; Doc string?
+  (when tags-apropos-verbose
+    (princ "Tags in file `")
+    (tags-with-face 'highlight (princ buffer-file-name))
+    (princ "':\n\n"))
+  (goto-char (point-min))
+  (let ((progress-reporter (make-progress-reporter
+                           (format "Making tags apropos buffer for `%s'..."
+                                   string)
+                           (point-min) (point-max))))
+    (while (re-search-forward string nil t)
+      (progress-reporter-update progress-reporter (point))
+      (beginning-of-line)
+
+      (let* ( ;; Get the local value in the tags table
+            ;; buffer before switching buffers.
+            (goto-func goto-tag-location-function)
+            (tag-info (save-excursion (funcall snarf-tag-function)))
+            (tag (if (eq t (car tag-info)) nil (car tag-info)))
+            (file-path (save-excursion (if tag (file-of-tag)
+                                         (save-excursion (forward-line 1)
+                                                         (file-of-tag)))))
+            (file-label (if tag (file-of-tag t)
+                          (save-excursion (forward-line 1)
+                                          (file-of-tag t))))
+            (pt (with-current-buffer standard-output (point))))
+       (if tag
+           (progn
+             (princ (format "[%s]: " file-label))
+             (princ tag)
+             (when (= (aref tag 0) ?\() (princ " ...)"))
+             (with-current-buffer standard-output
+               (make-text-button pt (point)
+                                 'tag-info tag-info
+                                 'file-path file-path
+                                 'goto-func goto-func
+                                 'action (lambda (button)
+                                           (let ((tag-info (button-get button 
'tag-info))
+                                                 (goto-func (button-get button 
'goto-func)))
+                                             (tag-find-file-of-tag (button-get 
button 'file-path))
+                                             (widen)
+                                             (funcall goto-func tag-info)))
+                                 'follow-link t
+                                 'face tags-tag-face
+                                 'type 'button)))
+         (princ (format "- %s" file-label))
+         (with-current-buffer standard-output
+           (make-text-button pt (point)
+                             'file-path file-path
+                             'action (lambda (button)
+                                       (tag-find-file-of-tag (button-get 
button 'file-path))
+                                       ;; Get the local value in the tags table
+                                       ;; buffer before switching buffers.
+                                       (goto-char (point-min)))
+                             'follow-link t
+                             'face tags-tag-face
+                             'type 'button))))
+      (terpri)
+      (forward-line 1))
+    (message nil))
+  (when tags-apropos-verbose (princ "\n")))
+
+(defun etags-tags-table-files () ; Doc string?
+  (let ((files nil)
+       beg)
+    (goto-char (point-min))
+    (while (search-forward "\f\n" nil t)
+      (setq beg (point))
+      (end-of-line)
+      (skip-chars-backward "^," beg)
+      (or (looking-at "include$")
+         (push (convert-standard-filename
+                 (buffer-substring beg (1- (point))))
+                files)))
+    (nreverse files)))
+
+;; FIXME?  Should this save-excursion?
+(defun etags-tags-included-tables () ; Doc string?
+  (let ((files nil)
+       beg)
+    (goto-char (point-min))
+    (while (search-forward "\f\n" nil t)
+      (setq beg (point))
+      (end-of-line)
+      (skip-chars-backward "^," beg)
+      (when (looking-at "include$")
+        ;; Expand in the default-directory of the tags table buffer.
+        (push (expand-file-name (convert-standard-filename
+                                 (buffer-substring beg (1- (point)))))
+              files)))
+    (nreverse files)))
+
+;; Empty tags file support.
+
+(defun tags-recognize-empty-tags-table ()
+  "Return non-nil if current buffer is empty.
+If empty, make buffer-local values of the tags table format variables
+that do nothing."
+  (and (zerop (buffer-size))
+       (mapc (lambda (sym) (set (make-local-variable sym) 'ignore))
+            '(tags-table-files-function
+              tags-completion-table-function
+              find-tag-regexp-search-function
+              find-tag-search-function
+              tags-apropos-function
+              tags-included-tables-function))
+       (set (make-local-variable 'verify-tags-table-function)
+            (lambda () (zerop (buffer-size))))))
+
+;; Match qualifier functions for tagnames.
+;; These functions assume the etags file format defined in etc/ETAGS.EBNF.
+
+;; This might be a neat idea, but it's too hairy at the moment.
+;;(defmacro tags-with-syntax (&rest body)
+;;   `(with-syntax-table
+;;        (with-current-buffer (find-file-noselect (file-of-tag))
+;;          (syntax-table))
+;;      ,@body))
+;;(put 'tags-with-syntax 'edebug-form-spec '(&rest form))
+
+;; exact file name match, i.e. searched tag must match complete file
+;; name including directories parts if there are some.
+(defun tag-exact-file-name-match-p (tag)
+  "Return non-nil if TAG matches complete file name.
+Any directory part of the file name is also matched."
+  (and (looking-at ",[0-9\n]")
+       (save-excursion (backward-char (+ 2 (length tag)))
+                      (looking-at "\f\n"))))
+
+;; file name match as above, but searched tag must match the file
+;; name not including the directories if there are some.
+(defun tag-file-name-match-p (tag)
+  "Return non-nil if TAG matches file name, excluding directory part."
+  (and (looking-at ",[0-9\n]")
+       (save-excursion (backward-char (1+ (length tag)))
+                      (looking-at "/"))))
+
+;; this / to detect we are after a directory separator is ok for unix,
+;; is there a variable that contains the regexp for directory separator
+;; on whatever operating system ?
+;; Looks like ms-win will lose here :).
+
+;; t if point is at a tag line that matches TAG exactly.
+;; point should be just after a string that matches TAG.
+(defun tag-exact-match-p (tag)
+  "Return non-nil if current tag line matches TAG exactly.
+Point should be just after a string that matches TAG."
+  ;; The match is really exact if there is an explicit tag name.
+  (or (and (eq (char-after (point)) ?\001)
+          (eq (char-after (- (point) (length tag) 1)) ?\177))
+      ;; We are not on the explicit tag name, but perhaps it follows.
+      (looking-at (concat "[^\177\n]*\177" (regexp-quote tag) "\001"))))
+
+;; t if point is at a tag line that has an implicit name.
+;; point should be just after a string that matches TAG.
+(defun tag-implicit-name-match-p (tag)
+  "Return non-nil if current tag line has an implicit name.
+Point should be just after a string that matches TAG."
+  ;; Look at the comment of the make_tag function in lib-src/etags.c for
+  ;; a textual description of the four rules.
+  (and (string-match "^[^ \t()=,;]+$" tag) ;rule #1
+       (looking-at "[ \t()=,;]?\177")  ;rules #2 and #4
+       (save-excursion
+        (backward-char (1+ (length tag)))
+        (looking-at "[\n \t()=,;]")))) ;rule #3
+
+;; t if point is at a tag line that matches TAG as a symbol.
+;; point should be just after a string that matches TAG.
+(defun tag-symbol-match-p (tag)
+  "Return non-nil if current tag line matches TAG as a symbol.
+Point should be just after a string that matches TAG."
+  (and (looking-at "\\Sw.*\177") (looking-at "\\S_.*\177")
+       (save-excursion
+        (backward-char (1+ (length tag)))
+        (and (looking-at "\\Sw") (looking-at "\\S_")))))
+
+;; t if point is at a tag line that matches TAG as a word.
+;; point should be just after a string that matches TAG.
+(defun tag-word-match-p (tag)
+  "Return non-nil if current tag line matches TAG as a word.
+Point should be just after a string that matches TAG."
+  (and (looking-at "\\b.*\177")
+       (save-excursion (backward-char (length tag))
+                      (looking-at "\\b"))))
+
+;; partial file name match, i.e. searched tag must match a substring
+;; of the file name (potentially including a directory separator).
+(defun tag-partial-file-name-match-p (_tag)
+  "Return non-nil if current tag matches file name.
+This is a substring match, and it can include directory separators.
+Point should be just after a string that matches TAG."
+  (and (looking-at ".*,[0-9\n]")
+       (save-excursion (beginning-of-line)
+                       (backward-char 2)
+                      (looking-at "\f\n"))))
+
+;; t if point is in a tag line with a tag containing TAG as a substring.
+(defun tag-any-match-p (_tag)
+  "Return non-nil if current tag line contains TAG as a substring."
+  (looking-at ".*\177"))
+
+;; t if point is at a tag line that matches RE as a regexp.
+(defun tag-re-match-p (re)
+  "Return non-nil if current tag line matches regexp RE."
+  (save-excursion
+    (beginning-of-line)
+    (let ((bol (point)))
+      (and (search-forward "\177" (line-end-position) t)
+          (re-search-backward re bol t)))))
+
+(defcustom tags-loop-revert-buffers nil
+  "Non-nil means tags-scanning loops should offer to reread changed files.
+These loops normally read each file into Emacs, but when a file
+is already visited, they use the existing buffer.
+When this flag is non-nil, they offer to revert the existing buffer
+in the case where the file has changed since you visited it."
+  :type 'boolean
+  :group 'etags)
+
+;;;###autoload
+(defun next-file (&optional initialize novisit)
+  "Select next file among files in current tags table.
+
+A first argument of t (prefix arg, if interactive) initializes to the
+beginning of the list of files in the tags table.  If the argument is
+neither nil nor t, it is evalled to initialize the list of files.
+
+Non-nil second argument NOVISIT means use a temporary buffer
+ to save time and avoid uninteresting warnings.
+
+Value is nil if the file was already visited;
+if the file was newly read in, the value is the filename."
+  ;; Make the interactive arg t if there was any prefix arg.
+  (interactive (list (if current-prefix-arg t)))
+  (cond ((not initialize)
+        ;; Not the first run.
+        )
+       ((eq initialize t)
+        ;; Initialize the list from the tags table.
+        (save-excursion
+          ;; Visit the tags table buffer to get its list of files.
+          (visit-tags-table-buffer)
+          ;; Copy the list so we can setcdr below, and expand the file
+          ;; names while we are at it, in this buffer's default directory.
+          (setq next-file-list (mapcar 'expand-file-name (tags-table-files)))
+          ;; Iterate over all the tags table files, collecting
+          ;; a complete list of referenced file names.
+          (while (visit-tags-table-buffer t)
+            ;; Find the tail of the working list and chain on the new
+            ;; sublist for this tags table.
+            (let ((tail next-file-list))
+              (while (cdr tail)
+                (setq tail (cdr tail)))
+              ;; Use a copy so the next loop iteration will not modify the
+              ;; list later returned by (tags-table-files).
+              (if tail
+                  (setcdr tail (mapcar 'expand-file-name (tags-table-files)))
+                (setq next-file-list (mapcar 'expand-file-name
+                                             (tags-table-files))))))))
+       (t
+        ;; Initialize the list by evalling the argument.
+        (setq next-file-list (eval initialize))))
+  (unless next-file-list
+    (and novisit
+        (get-buffer " *next-file*")
+        (kill-buffer " *next-file*"))
+    (user-error "All files processed"))
+  (let* ((next (car next-file-list))
+        (buffer (get-file-buffer next))
+        (new (not buffer)))
+    ;; Advance the list before trying to find the file.
+    ;; If we get an error finding the file, don't get stuck on it.
+    (setq next-file-list (cdr next-file-list))
+    ;; Optionally offer to revert buffers
+    ;; if the files have changed on disk.
+    (and buffer tags-loop-revert-buffers
+        (not (verify-visited-file-modtime buffer))
+        (y-or-n-p
+         (format
+          (if (buffer-modified-p buffer)
+              "File %s changed on disk.  Discard your edits? "
+            "File %s changed on disk.  Reread from disk? ")
+          next))
+        (with-current-buffer buffer
+          (revert-buffer t t)))
+    (if (not (and new novisit))
+       (find-file next novisit)
+      ;; Like find-file, but avoids random warning messages.
+      (switch-to-buffer (get-buffer-create " *next-file*"))
+      (kill-all-local-variables)
+      (erase-buffer)
+      (setq new next)
+      (insert-file-contents new nil))
+    new))
+
+(defvar tags-loop-operate nil
+  "Form for `tags-loop-continue' to eval to change one file.")
+
+(defvar tags-loop-scan
+  '(user-error "%s"
+              (substitute-command-keys
+               "No \\[tags-search] or \\[tags-query-replace] in progress"))
+  "Form for `tags-loop-continue' to eval to scan one file.
+If it returns non-nil, this file needs processing by evalling
+\`tags-loop-operate'.  Otherwise, move on to the next file.")
+
+(defun tags-loop-eval (form)
+  "Evaluate FORM and return its result.
+Bind `case-fold-search' during the evaluation, depending on the value of
+`tags-case-fold-search'."
+  (let ((case-fold-search (if (memq tags-case-fold-search '(t nil))
+                             tags-case-fold-search
+                           case-fold-search)))
+    (eval form)))
+
+
+;;;###autoload
+(defun tags-loop-continue (&optional first-time)
+  "Continue last \\[tags-search] or \\[tags-query-replace] command.
+Used noninteractively with non-nil argument to begin such a command (the
+argument is passed to `next-file', which see).
+
+Two variables control the processing we do on each file: the value of
+`tags-loop-scan' is a form to be executed on each file to see if it is
+interesting (it returns non-nil if so) and `tags-loop-operate' is a form to
+evaluate to operate on an interesting file.  If the latter evaluates to
+nil, we exit; otherwise we scan the next file."
+  (declare (obsolete "use `xref-find-definitions' interface instead." "25.1"))
+  (interactive)
+  (let (new
+       ;; Non-nil means we have finished one file
+       ;; and should not scan it again.
+       file-finished
+       original-point
+       (messaged nil))
+    (while
+       (progn
+         ;; Scan files quickly for the first or next interesting one.
+         ;; This starts at point in the current buffer.
+         (while (or first-time file-finished
+                    (save-restriction
+                      (widen)
+                      (not (tags-loop-eval tags-loop-scan))))
+           ;; If nothing was found in the previous file, and
+           ;; that file isn't in a temp buffer, restore point to
+           ;; where it was.
+           (when original-point
+             (goto-char original-point))
+
+           (setq file-finished nil)
+           (setq new (next-file first-time t))
+
+           ;; If NEW is non-nil, we got a temp buffer,
+           ;; and NEW is the file name.
+           (when (or messaged
+                     (and (not first-time)
+                          (> baud-rate search-slow-speed)
+                          (setq messaged t)))
+             (message "Scanning file %s..." (or new buffer-file-name)))
+
+           (setq first-time nil)
+           (setq original-point (if new nil (point)))
+           (goto-char (point-min)))
+
+         ;; If we visited it in a temp buffer, visit it now for real.
+         (if new
+             (let ((pos (point)))
+               (erase-buffer)
+               (set-buffer (find-file-noselect new))
+               (setq new nil)          ;No longer in a temp buffer.
+               (widen)
+               (goto-char pos))
+           (push-mark original-point t))
+
+         (switch-to-buffer (current-buffer))
+
+         ;; Now operate on the file.
+         ;; If value is non-nil, continue to scan the next file.
+         (tags-loop-eval tags-loop-operate))
+      (setq file-finished t))
+    (and messaged
+        (null tags-loop-operate)
+        (message "Scanning file %s...found" buffer-file-name))))
+
+;;;###autoload
+(defun tags-search (regexp &optional file-list-form)
+  "Search through all files listed in tags table for match for REGEXP.
+Stops when a match is found.
+To continue searching for next match, use command \\[tags-loop-continue].
+
+If FILE-LIST-FORM is non-nil, it should be a form that, when
+evaluated, will return a list of file names.  The search will be
+restricted to these files.
+
+Also see the documentation of the `tags-file-name' variable."
+  (interactive "sTags search (regexp): ")
+  (if (and (equal regexp "")
+          (eq (car tags-loop-scan) 're-search-forward)
+          (null tags-loop-operate))
+      ;; Continue last tags-search as if by M-,.
+      (tags-loop-continue nil)
+    (setq tags-loop-scan `(re-search-forward ',regexp nil t)
+         tags-loop-operate nil)
+    (tags-loop-continue (or file-list-form t))))
+
+;;;###autoload
+(defun tags-query-replace (from to &optional delimited file-list-form)
+  "Do `query-replace-regexp' of FROM with TO on all files listed in tags table.
+Third arg DELIMITED (prefix arg) means replace only word-delimited matches.
+If you exit (\\[keyboard-quit], RET or q), you can resume the query replace
+with the command \\[tags-loop-continue].
+Fourth arg FILE-LIST-FORM non-nil means initialize the replacement loop.
+Fifth and sixth arguments START and END are accepted, for compatibility
+with `query-replace-regexp', and ignored.
+
+If FILE-LIST-FORM is non-nil, it is a form to evaluate to
+produce the list of files to search.
+
+See also the documentation of the variable `tags-file-name'."
+  (interactive (query-replace-read-args "Tags query replace (regexp)" t t))
+  (setq tags-loop-scan `(let ,(unless (equal from (downcase from))
+                               '((case-fold-search nil)))
+                         (if (re-search-forward ',from nil t)
+                             ;; When we find a match, move back
+                             ;; to the beginning of it so perform-replace
+                             ;; will see it.
+                             (goto-char (match-beginning 0))))
+       tags-loop-operate `(perform-replace ',from ',to t t ',delimited
+                                           nil multi-query-replace-map))
+  (tags-loop-continue (or file-list-form t)))
+
+(defun tags-complete-tags-table-file (string predicate what) ; Doc string?
+  (save-excursion
+    ;; If we need to ask for the tag table, allow that.
+    (let ((enable-recursive-minibuffers t))
+      (visit-tags-table-buffer))
+    (if (eq what t)
+       (all-completions string (tags-table-files) predicate)
+      (try-completion string (tags-table-files) predicate))))
+
+;;;###autoload
+(defun list-tags (file &optional _next-match)
+  "Display list of tags in file FILE.
+This searches only the first table in the list, and no included tables.
+FILE should be as it appeared in the `etags' command, usually without a
+directory specification."
+  (interactive (list (completing-read "List tags in file: "
+                                     'tags-complete-tags-table-file
+                                     nil t nil)))
+  (with-output-to-temp-buffer "*Tags List*"
+    (princ "Tags in file `")
+    (tags-with-face 'highlight (princ file))
+    (princ "':\n\n")
+    (save-excursion
+      (let ((first-time t)
+           (gotany nil))
+       (while (visit-tags-table-buffer (not first-time))
+         (setq first-time nil)
+         (if (funcall list-tags-function file)
+             (setq gotany t)))
+       (or gotany
+           (user-error "File %s not in current tags tables" file)))))
+  (with-current-buffer "*Tags List*"
+    (require 'apropos)
+    (with-no-warnings
+      (apropos-mode))
+    (setq buffer-read-only t)))
+
+;;;###autoload
+(defun tags-apropos (regexp)
+  "Display list of all tags in tags table REGEXP matches."
+  (declare (obsolete xref-find-apropos "25.1"))
+  (interactive "sTags apropos (regexp): ")
+  (with-output-to-temp-buffer "*Tags List*"
+    (princ "Click mouse-2 to follow tags.\n\nTags matching regexp `")
+    (tags-with-face 'highlight (princ regexp))
+    (princ "':\n\n")
+    (save-excursion
+      (let ((first-time t))
+       (while (visit-tags-table-buffer (not first-time))
+         (setq first-time nil)
+         (funcall tags-apropos-function regexp))))
+    (etags-tags-apropos-additional regexp))
+  (with-current-buffer "*Tags List*"
+    (eval-and-compile (require 'apropos))
+    (apropos-mode)
+    ;; apropos-mode is derived from fundamental-mode and it kills
+    ;; all local variables.
+    (setq buffer-read-only t)))
+
+;; XXX Kludge interface.
+
+(define-button-type 'tags-select-tags-table
+  'action 'select-tags-table-select
+  'follow-link t
+  'help-echo "RET, t or mouse-2: select tags table")
+
+;; XXX If a file is in multiple tables, selection may get the wrong one.
+;;;###autoload
+(defun select-tags-table ()
+  "Select a tags table file from a menu of those you have already used.
+The list of tags tables to select from is stored in `tags-table-set-list';
+see the doc of that variable if you want to add names to the list."
+  (interactive)
+  (pop-to-buffer "*Tags Table List*")
+  (setq buffer-read-only nil
+       buffer-undo-list t)
+  (erase-buffer)
+  (let ((set-list tags-table-set-list)
+       (desired-point nil)
+       b)
+    (when tags-table-list
+      (setq desired-point (point-marker))
+      (setq b (point))
+      (princ (mapcar 'abbreviate-file-name tags-table-list) (current-buffer))
+      (make-text-button b (point) 'type 'tags-select-tags-table
+                        'etags-table (car tags-table-list))
+      (insert "\n"))
+    (while set-list
+      (unless (eq (car set-list) tags-table-list)
+       (setq b (point))
+       (princ (mapcar 'abbreviate-file-name (car set-list)) (current-buffer))
+       (make-text-button b (point) 'type 'tags-select-tags-table
+                          'etags-table (car (car set-list)))
+       (insert "\n"))
+      (setq set-list (cdr set-list)))
+    (when tags-file-name
+      (or desired-point
+          (setq desired-point (point-marker)))
+      (setq b (point))
+      (insert (abbreviate-file-name tags-file-name))
+      (make-text-button b (point) 'type 'tags-select-tags-table
+                        'etags-table tags-file-name)
+      (insert "\n"))
+    (setq set-list (delete tags-file-name
+                          (apply 'nconc (cons (copy-sequence tags-table-list)
+                                              (mapcar 'copy-sequence
+                                                      tags-table-set-list)))))
+    (while set-list
+      (setq b (point))
+      (insert (abbreviate-file-name (car set-list)))
+      (make-text-button b (point) 'type 'tags-select-tags-table
+                          'etags-table (car set-list))
+      (insert "\n")
+      (setq set-list (delete (car set-list) set-list)))
+    (goto-char (point-min))
+    (insert-before-markers
+     "Type `t' to select a tags table or set of tags tables:\n\n")
+    (if desired-point
+       (goto-char desired-point))
+    (set-window-start (selected-window) 1 t))
+  (set-buffer-modified-p nil)
+  (select-tags-table-mode))
+
+(defvar select-tags-table-mode-map ; Doc string?
+  (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map button-buffer-map)
+    (define-key map "t" 'push-button)
+    (define-key map " " 'next-line)
+    (define-key map "\^?" 'previous-line)
+    (define-key map "n" 'next-line)
+    (define-key map "p" 'previous-line)
+    (define-key map "q" 'select-tags-table-quit)
+    map))
+
+(define-derived-mode select-tags-table-mode special-mode "Select Tags Table"
+  "Major mode for choosing a current tags table among those already loaded."
+  (setq buffer-read-only t))
+
+(defun select-tags-table-select (button)
+  "Select the tags table named on this line."
+  (interactive (list (or (button-at (line-beginning-position))
+                         (error "No tags table on current line"))))
+  (let ((name (button-get button 'etags-table)))
+    (visit-tags-table name)
+    (select-tags-table-quit)
+    (message "Tags table now %s" name)))
+
+(defun select-tags-table-quit ()
+  "Kill the buffer and delete the selected window."
+  (interactive)
+  (quit-window t (selected-window)))
+
+;;;###autoload
+(defun complete-tag ()
+  "Perform tags completion on the text around point.
+Completes to the set of names listed in the current tags table.
+The string to complete is chosen in the same way as the default
+for \\[find-tag] (which see)."
+  (interactive)
+  (or tags-table-list
+      tags-file-name
+      (user-error "%s"
+                  (substitute-command-keys
+                   "No tags table loaded; try \\[visit-tags-table]")))
+  (let ((comp-data (tags-completion-at-point-function)))
+    (if (null comp-data)
+       (user-error "Nothing to complete")
+      (completion-in-region (car comp-data) (cadr comp-data)
+                           (nth 2 comp-data)
+                           (plist-get (nthcdr 3 comp-data) :predicate)))))
+
+
+;;; Xref backend
+
+;; Stop searching if we find more than xref-limit matches, as the xref
+;; infrastructure is not designed to handle very long lists.
+;; Switching to some kind of lazy list might be better, but hopefully
+;; we hit the limit rarely.
+(defconst etags--xref-limit 1000)
+
+(defvar etags-xref-find-definitions-tag-order '(tag-exact-match-p
+                                                tag-implicit-name-match-p
+                                                tag-symbol-match-p)
+  "Tag order used in `etags-xref-find' to look for definitions.")
+
+;;;###autoload
+(defun etags-xref-find (action id)
+  (pcase action
+    (`definitions (etags--xref-find-definitions id))
+    (`references
+     (let ((dirs (if tags-table-list
+                     (mapcar #'file-name-directory tags-table-list)
+                   ;; If no tags files are loaded, prompt for the dir.
+                   (list (read-directory-name "In directory: " nil nil t)))))
+       (cl-mapcan
+        (lambda (dir)
+          (xref-collect-references id dir))
+        dirs)))
+    (`apropos (etags--xref-find-definitions id t))))
+
+(defun etags--xref-find-definitions (pattern &optional regexp?)
+  ;; This emulates the behaviour of `find-tag-in-order' but instead of
+  ;; returning one match at a time all matches are returned as list.
+  ;; NOTE: find-tag-tag-order is typically a buffer-local variable.
+  (let* ((xrefs '())
+         (first-time t)
+         (search-fun (if regexp? #'re-search-forward #'search-forward))
+         (marks (make-hash-table :test 'equal))
+         (case-fold-search (if (memq tags-case-fold-search '(nil t))
+                               tags-case-fold-search
+                             case-fold-search)))
+    (save-excursion
+      (while (visit-tags-table-buffer (not first-time))
+        (setq first-time nil)
+        (dolist (order-fun (cond (regexp? find-tag-regexp-tag-order)
+                                 (t etags-xref-find-definitions-tag-order)))
+          (goto-char (point-min))
+          (while (and (funcall search-fun pattern nil t)
+                      (< (hash-table-count marks) etags--xref-limit))
+            (when (funcall order-fun pattern)
+              (beginning-of-line)
+              (pcase-let* ((tag-info (etags-snarf-tag))
+                           (`(,hint ,line . _) tag-info))
+                (unless (eq hint t) ; hint==t if we are in a filename line
+                  (let* ((file (file-of-tag))
+                         (mark-key (cons file line)))
+                    (unless (gethash mark-key marks)
+                      (let ((loc (xref-make-etags-location
+                                  tag-info (expand-file-name file))))
+                        (push (xref-make hint loc) xrefs)
+                        (puthash mark-key t marks)))))))))))
+    (nreverse xrefs)))
+
+(defclass xref-etags-location (xref-location)
+  ((tag-info :type list   :initarg :tag-info)
+   (file     :type string :initarg :file
+             :reader xref-location-group))
+  :documentation "Location of an etags tag.")
+
+(defun xref-make-etags-location (tag-info file)
+  (make-instance 'xref-etags-location :tag-info tag-info
+                 :file (expand-file-name file)))
+
+(cl-defmethod xref-location-marker ((l xref-etags-location))
+  (with-slots (tag-info file) l
+    (let ((buffer (find-file-noselect file)))
+      (with-current-buffer buffer
+        (etags-goto-tag-location tag-info)
+        (point-marker)))))
+
+(cl-defmethod xref-location-line ((l xref-etags-location))
+  (with-slots (tag-info) l
+    (nth 1 tag-info)))
+
+
+(provide 'etags)
+
+;;; etags.el ends here
diff --git a/test/etags/erl-src/gs_dialog.erl b/test/etags/erl-src/gs_dialog.erl
new file mode 100644
index 0000000..c04ee8b
--- /dev/null
+++ b/test/etags/erl-src/gs_dialog.erl
@@ -0,0 +1,271 @@
+-module(gs_dialog). % behaviour
+-define(VERSION, '2001.1101').
+-vsn(?VERSION).
+-author('address@hidden').
+-copyright('Copyright (c)2001 Cat`s Eye Technologies. All rights reserved.').
+
+%%% Redistribution and use in source and binary forms, with or without
+%%% modification, are permitted provided that the following conditions
+%%% are met:
+%%%
+%%%   Redistributions of source code must retain the above copyright
+%%%   notice, this list of conditions and the following disclaimer.
+%%%
+%%%   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.
+%%%
+%%%   Neither the name of Cat's Eye Technologies 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 COPYRIGHT HOLDERS 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. 
+
+-export([behaviour_info/1,
+         show/4,
+        test/0]).
+
+%%% BEGIN gs_dialog.erl %%%
+
+%%% This module specifies a common behaviour for "modal" dialog boxes
+%%% using GS.
+
+%%--------------------------------------------------------------------
+%% behaviour_info(callbacks) -> ListOfFunctionArityTuples
+%% Used by R8 to check the implementation modules for consistency
+%% with the behaviour specification, what callbacks this module needs.
+
+behaviour_info(callbacks) ->
+  [
+
+    %%----------------------------------------------------------------
+    %% Module:buttons() -> ListOfAtoms
+    %% Should return the labels used on the main (non-extra) buttons
+    %% of the dialog box.
+    %% e.g. ['OK', 'Cancel'].
+
+    {buttons, 0},
+
+    %%----------------------------------------------------------------
+    %% Module:icon() -> FileNameString | {Text, FgColour, BgColour}
+    %% Should return the the icon displayed in the dialog box.
+    %% This should either be the fully qualified filename of a 32x32 GIF
+    %% file (e.g. in the application's priv dir,) or a 3-tuple
+    %% describing a simple "circle" icon to be rendered by GS itself.
+    %% The latter option was added because some versions of Erlang for
+    %% Windows use a Tk emulation package which is not always on the
+    %% ball when it comes to correct image transparency and colour.
+    %% e.g. filename:join(code:priv_dir(?MODULE), "notify.gif")
+
+    {icon, 0},
+
+    %%----------------------------------------------------------------
+    %% Module:controls(Parent, ArgList) -> {GSControl | nil, NewArgList}
+    %% Used by the implementation to provide extra controls in the dialog
+    %% box, if any.  If not, nil should be returned instead of the control.
+    %% If many controls are added, it is recommended they are placed in a
+    %% frame, with the frame returned as the control.
+    %% The control need not have positioning information, as it will be
+    %% assigned a pack_xy option when it is placed into the Parent frame.
+    %% The list of arguments may be modified by this callback.
+    %% e.g. {nil, Args}
+
+    {controls, 2},
+
+    %%----------------------------------------------------------------
+    %% Module:on_key(ExtraControl, KeyAtom, ArgList) ->
+    %%   {button, ButtonNameAtom} | nil
+    %% Called when a key is pressed in the dialog box.  The return value
+    %% specified whether it is linked to pressing a button, or whether it
+    %% it is ignored and passed on to a further handler (if any.)
+    
+    {on_key, 3},
+
+    %%----------------------------------------------------------------
+    %% Module:on_button(ExtraControl, ButtonNameAtom, ArgList) -> Result
+    %% Called when one of the main (non-extra) buttons are pressed in
+    %% the dialog box.  Since this closes the dialog box, the implementation
+    %% module is expected to provide a final result term with this function.
+
+    {on_button, 3}, 
+
+    %%----------------------------------------------------------------
+    %% Module:on_event(ExtraControl, Event, ArgList) -> Result
+    %% Allows the implementation module to handle other GS events,
+    %% e.g. those generated by the extra controls specified.
+ 
+    {on_event, 3}
+  ].
+
+%%% Public Interface
+
+%%--------------------------------------------------------------------
+%% show(ModuleNameAtom, TitleString, MessageString, ArgList) -> Result
+%% Display a generic modal dialog box, customized by the
+%% callback functions in Module.  This should be called by
+%% the 'show' function in the Module in question.
+%% The argument list is passed back to the callback functions in the
+%% module, for retaining information pertinent to the callback module;
+%% the behaviour itself does not inspect or care about this list.
+
+show(Module, Title, Message, Args) ->
+  Screen = gs:start(),
+  Buttons = Module:buttons(),
+  NumButtons = length(Buttons),
+  application:load(?MODULE),
+  {ok, Font} = application:get_env(?MODULE, font),
+  {ok, {ScreenWidth, ScreenHeight}} =
+    application:get_env(?MODULE, screen_size),
+  {ok, {DialogWidth, DialogHeight}} =
+    application:get_env(?MODULE, dialog_size),
+  Window = gs:create(window, Screen,
+    [{width, DialogWidth}, {height, DialogHeight},
+     {x, (ScreenWidth - DialogWidth) div 2},
+     {y, (ScreenHeight - DialogHeight) div 2},
+     {title, Title},
+     {configure, true}, {keypress, true}]),
+  Frame = gs:create(frame, Window,
+    [{bw, 0},
+     {packer_x, lists:duplicate(NumButtons, {stretch, 1})},
+     {packer_y, [{stretch, 1},{stretch, 2},{stretch, 1}]}]),
+  case Module:icon() of
+    nil ->
+      Label = gs:create(label, Frame,
+        [{label, {text, Message}}, {font, Font}, {justify, center},
+         {pack_xy, {{1, NumButtons}, 1}}]);
+    {Text, Fg, Bg} ->
+      InnerFrame = gs:create(frame, Frame,
+        [{pack_xy, {{1, NumButtons}, 1}}, {bw, 0},
+        {packer_x, [{stretch, 1}, {fixed, 32}, {stretch, 8}]},
+        {packer_y, [{stretch, 1}, {fixed, 32}, {stretch, 1}]}]),
+      IconCanvas = gs:create(canvas, InnerFrame,
+        [{pack_xy, {2, 2}}]),
+      IconCircle = gs:create(oval, IconCanvas,
+        [{coords, [{0, 0}, {31, 31}]}, {fg, black}, {fill, Bg}]),
+      IconFont = {screen, bold, 24},
+      {ITW,ITH} = gs:read(IconCanvas, {font_wh, {IconFont, Text}}),
+      ITX = 16 - ITW div 2,
+      ITY = 16 - ITH div 2,
+      IconText = gs:create(text, IconCanvas,
+        [{coords, [{ITX, ITY}]}, {fg, Fg}, {text, Text}, {font, IconFont}]),
+      Label = gs:create(label, InnerFrame,
+        [{label, {text, Message}}, {font, Font}, {justify, center},
+         {pack_xy, {3, {1,3}}}]);
+    FileName when list(FileName) ->
+      InnerFrame = gs:create(frame, Frame,
+        [{pack_xy, {{1, NumButtons}, 1}}, {bw, 0},
+        {packer_x, [{stretch, 1}, {fixed, 32}, {stretch, 8}]},
+        {packer_y, [{stretch, 1}, {fixed, 32}, {stretch, 1}]}]),
+      IconCanvas = gs:create(canvas, InnerFrame,
+        [{pack_xy, {2, 2}}]),
+      Icon = gs:create(image, IconCanvas, [{coords, [{0, 0}]},
+                                           {load_gif, FileName}]),
+      Label = gs:create(label, InnerFrame,
+        [{label, {text, Message}}, {font, Font}, {justify, center},
+         {pack_xy, {3, {1,3}}}])
+  end,
+  {Extra, NewArgs} = Module:controls(Frame, Args),
+  case Extra of
+    nil -> gs:config(Frame, {packer_y, [{stretch, 2},{fixed, 0},{stretch, 
1}]});
+    _   -> gs:config(Extra, {pack_xy, {{1, NumButtons}, 2}})
+  end,
+  lists:foldl(fun(X, A) ->
+       I = gs:create(frame, Frame, [{packer_x, [{stretch, 1}, {fixed, 80}, 
{stretch, 1}]}, 
+                                    {packer_y, [{stretch, 1}, {fixed, 24}, 
{stretch, 1}]}, 
+                                    {pack_xy, {A, 3}}]),
+       gs:create(button, I, [{label, {text, atom_to_list(X)}}, {font, Font},
+                             {data, {button, X}},
+                             {pack_xy, {2, 2}}]),
+       A + 1
+       end, 1, Buttons),
+  gs:config(Frame, [{width, DialogWidth}, {height, DialogHeight}]),
+  {MessageWidth, MessageHeight} = gs:read(Frame, {font_wh, {Font, Message}}),
+  case MessageWidth of
+    N1 when N1 > trunc(DialogWidth * 0.8) ->
+        NewDialogWidth = trunc(MessageWidth * 1.2),
+        gs:config(Window,
+          [{width, NewDialogWidth},
+          {x, (ScreenWidth - NewDialogWidth) div 2}]);
+    _ -> ok
+  end,
+  case MessageHeight of
+    N2 when N2 > trunc(DialogHeight * 0.666) ->
+        NewDialogHeight = trunc(MessageHeight * 1.666),
+        gs:config(Window,
+          [{height, NewDialogHeight},
+          {y, (ScreenHeight - NewDialogHeight) div 2}]);
+    _ -> ok
+  end,
+  gs:config(Window, {map, true}),
+  dialog_loop(Module, Window, Frame, Extra, NewArgs).
+
+%%--------------------------------------------------------------------
+%% dialog_loop(Module, Window, Frame, Extra, Args) -> Result
+%% Called by show/4, handles generic events in a dialog box.
+
+dialog_loop(Module, Window, Frame, Extra, Args) ->
+  receive
+    {gs, Window, destroy, Data, EventArgs} ->
+       Module:on_button(Extra, 'Cancel', Args);
+    {gs, Window, configure, Data, [W,H | Rest]} ->
+       gs:config(Frame, [{width, W}, {height, H}]),
+       dialog_loop(Module, Window, Frame, Extra, Args);
+    {gs, Window, keypress, Data, [KeyCode | Rest]} ->
+       case Module:on_key(Extra, KeyCode, Args) of
+         {button, ButtonType} ->
+           Return = Module:on_button(Extra, ButtonType, Args),
+           gs:destroy(Window),
+           Return;
+        _ -> dialog_loop(Module, Window, Frame, Extra, Args)
+       end;
+    {gs, Button, click, {button, ButtonType}, EventArgs} ->
+       Return = Module:on_button(Extra, ButtonType, Args),
+       gs:destroy(Window),
+       Return;
+    Other -> % io:fwrite("~w~n", [Other]),
+      case Module:on_event(Extra, Other, Args) of
+         {button, ButtonType} ->
+           Return = Module:on_button(Extra, ButtonType, Args),
+           gs:destroy(Window),
+           Return;
+        _ -> dialog_loop(Module, Window, Frame, Extra, Args)
+      end
+  end.
+
+%%--------------------------------------------------------------------
+%% test() -> ResultTuple.
+%% Tests some of the common dialog boxes implemented with this behaviour.
+
+test() ->
+  A = gs_dialog_notify:show("Notification", "This is a notification dialog."),
+  B = gs_dialog_confirm:show("Confirmation",
+      "Are you sure you want to\ntake some sort of drastic action?"),
+  C = gs_dialog_question:show("Question", "Save your barcodes first?"),
+  D = gs_dialog_entry:show("Text Entry",
+      "Enter the address of this order:", "555 Twenty-third St."),
+  E = gs_dialog_list:show("Select One", "Select a game to play.",
+      ["Chess", "Checkers", "Othello", "Go", "Backgammon", "Kali", "Sink"]),
+  F = gs_dialog_color:show("Choose Colour", "Pick your favourite colour.",
+      {255, 0, 128}),
+  G = gs_dialog_notify:show("Lengthy Notification",
+      "This is an extremely long message with no line breaks.  "
+      "The dialog box should expand to display the entire message."),
+  H = gs_dialog_notify:show("Lengthy Notification",
+      "This is an extremely\nlong message with\nmany lines.\n\n"
+      "The dialog box\nshould\nexpand\nto\ndisplay\nthe\nentire\nmessage."),
+  {A,B,C,D,E,F,G,H}.
+
+%%% END of gs_dialog.erl %%%
diff --git a/test/etags/erl-src/lines.erl b/test/etags/erl-src/lines.erl
new file mode 100644
index 0000000..6ec8750
--- /dev/null
+++ b/test/etags/erl-src/lines.erl
@@ -0,0 +1,297 @@
+%%% The contents of this file are subject to the Erlang Public License,
+%%% Version 1.0, (the "License"); you may not use this file except in
+%%% compliance with the License. You may obtain a copy of the License at
+%%% http://www.erlang.org/license/EPL1_0.txt
+%%%
+%%% Software distributed under the License is distributed on an "AS IS"
+%%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%%% the License for the specific language governing rights and limitations
+%%% under the License.
+%%%
+%%% The Original Code is lines-1.0.
+%%%
+%%% The Initial Developer of the Original Code is Ericsson Telecom
+%%% AB. Portions created by Ericsson are Copyright (C), 1998, Ericsson
+%%% Telecom AB. All Rights Reserved.
+%%%
+%%% Contributor(s): ______________________________________.
+
+%%%----------------------------------------------------------------------
+%%% #0.    BASIC INFORMATION
+%%%----------------------------------------------------------------------
+%%% File:       lines.erl
+%%% Author       : Ulf Wiger <address@hidden>
+%%% Description  : Efficient array of lines (e.g. for text editor)
+%%% 
+%%% Modules used : lists
+%%% 
+%%%----------------------------------------------------------------------
+%%% Efficient array of lines (e.g. for text editor)
+%%% allows for append, as well as insert, replace, delete in any position
+%%% with reasonable access times.
+%%% Rough benchmarking indicates (on a 440MHz Ultra):
+%%%
+%%% NoOfLines  Append (uSec)   Read (uSec)     Delete (uSec)
+%%% 100                9               7               7
+%%% 1,000      14              10              11
+%%% 10,000     22              13              15
+%%% 100,000    30              16              18
+%%%
+%%% Comment on the benchmark: The times for Append and Delete are mean
+%%% times for "growing file" and "shrinking file", that is, starting from
+%%% an empty array and inserting 100,000 lines took ca 3 seconds; deleting
+%%% them took ca 1.8 seconds. The Read test involved accessing all lines
+%%% in the full array and calculating the mean time.
+%%%
+%%% The array doesn't care what goes into each position. In other words,
+%%% it can be used for any datatype -- not just lines of text.
+%%%----------------------------------------------------------------------
+
+-module(lines).
+-vsn('1.0').
+-date('00-03-13').
+-author('address@hidden').
+
+-export([new/0,
+        count/1,
+        nth/2,
+        append/2,
+        replace/3,
+        insert/3,
+        insert_after/3,
+        delete/2,
+        convert_to_list/1,
+        convert_from_list/1]).
+
+-define(BREAK, 10).    % how many lines to store in each leaf
+
+-define(dbg(Fmt, Args), ok=io:format("~p: " ++ Fmt, [?LINE|Args])).
+%% new() -> line_array()
+%%
+%% Creates a new line array.
+%%
+new() ->
+    {0, []}.
+
+%% line_count(line_array()) -> integer()
+%%
+%% Returns the number of lines stored in the array
+%%
+count({N, _}) ->
+    N.
+
+%% nth(LineNo : integer(), Array : line_array()) -> line()
+%%
+%% Returns the line in position LineNo
+%%
+nth(L, _) when L < 1 ->
+    exit({out_of_range, L});
+nth(L, {LMax, _}) when L > LMax ->
+    exit({out_of_range, L});
+nth(L, {LMax, List}) when list(List) ->
+    lists:nth(L, List);
+nth(L, {LMax, {Left = {LL, _}, Right}}) when L > LL ->
+    nth(L-LL, Right);
+nth(L, {_, {Left, _}}) ->
+    nth(L, Left).
+
+%% append(Line : line(), Array : line_array()) -> line_array().
+%%
+%% Appends Line to the end of Array.
+%% e.g. append(x, [1,2,3,4]) -> [1,2,3,4,x].
+%% Returns the modified array.
+%%
+append(Line, {L, List}) when list(List), L < ?BREAK ->
+    {L+1, List ++ [Line]};
+append(Line, {L, List}) when list(List) ->
+    {L+1, {{L, List}, {1, [Line]}}};
+append(Line, {L, {Left = {LL1, L1}, Right}}) ->
+    NewRight = append(Line, Right),
+    balance_left(L+1, Left, NewRight).
+
+%% replace(LineNo : integer(), Array : line_array(), NewLine : line()) ->
+%%     line_array().
+%%
+%% Replaces the line in position LineNo with NewLine.
+%% e.g. replace(3, [1,2,3,4], x) -> [1,2,x,4].
+%% Returns the modified array.
+%%
+replace(Lno, _, _) when Lno < 1 ->
+    exit({out_of_range, Lno});
+replace(Lno, {L, _}, NewLine) when Lno > L ->
+    exit({out_of_range, Lno});
+replace(Lno, {L, List}, NewLine) when list(List) ->
+    {L, replace_nth(Lno, List, NewLine)};
+replace(Lno, {L, {Left={LL1, L1}, Right={LL2, L2}}}, NewLine) when Lno > LL1 ->
+    NewRight = replace(Lno-LL1, Right, NewLine),
+    {L, Left, NewRight};
+replace(Lno, {L, {Left={LL1,L1}, Right={LL2,L2}}}, NewLine) ->
+    NewLeft = replace(Lno, Left, NewLine),
+    {L, NewLeft, Right}.
+
+%% insert(LineNo : integer(), Array : line_array(), NewLine) -> line_array().
+%%
+%% Inserts NewLine *before* the line in position LineNo.
+%% e.g. insert(3, [1,2,3,4], x) -> [1,2,x,3,4].
+%% Returns the modified array.
+%%
+insert(Lno, _, _) when Lno < 1 ->
+    exit({out_of_range, Lno});
+insert(Lno, {L, _}, NewLine) when Lno > L ->
+    exit({out_of_range, Lno});
+insert(Lno, {L, List}, NewLine) when list(List) ->
+    if L < ?BREAK ->
+           {L+1, insert_nth(Lno, List, NewLine)};
+       true ->
+           NewList = insert_nth(Lno, List, NewLine),
+           {L1, L2} = split_at(?BREAK, NewList),
+           NewL = L+1,
+           {NewL, {{?BREAK, L1}, {NewL-?BREAK, L2}}}
+    end;
+insert(Lno, {L, {Left={LL,_}, Right}}, NewLine) when Lno > LL ->
+    NewRight = insert(Lno-LL, Right, NewLine),
+    balance_left(L+1, Left, NewRight);
+insert(Lno, {L, {Left, Right}}, NewLine) ->
+    NewLeft = insert(Lno, Left, NewLine),
+    balance_right(L+1, NewLeft, Right).
+
+%% insert_after(LineNo : integer(), Array : line_array(), NewLine) -> 
+%%     line_array().
+%%
+%% Inserts NewLine *after* the line in position LineNo.
+%% e.g. insert(3, [1,2,3,4], x) -> [1,2,3,x,4].
+%% Returns the modified array.
+%%
+insert_after(Lno, _, _) when Lno < 1 ->
+    exit({out_of_range, Lno});
+insert_after(Lno, {L, _}, NewLine) when Lno > L ->
+    exit({out_of_range, Lno});
+insert_after(Lno, {L, List}, NewLine) when list(List) ->
+    if L < ?BREAK ->
+           {L+1, insert_after_nth(Lno, List, NewLine)};
+       true ->
+           NewList = insert_after_nth(Lno, List, NewLine),
+           {L1, L2} = split_at(?BREAK, NewList),
+           NewL = L+1,
+           {NewL, {{?BREAK, L1}, {NewL-?BREAK, L2}}}
+    end;
+insert_after(Lno, {L, {Left={LL,_}, Right}}, NewLine) when Lno > LL ->
+    NewRight = insert_after(Lno-LL, Right, NewLine),
+    balance_left(L+1, Left, NewRight);
+insert_after(Lno, {L, {Left, Right}}, NewLine) ->
+    NewLeft = insert_after(Lno, Left, NewLine),
+    balance_right(L+1, NewLeft, Right).
+
+
+%% delete(LineNo : integer(), Array : line_array()) -> line_array().
+%%
+%% Deletes the line in position LineNo.
+%% e.g. delete(3, [1,2,3,4]) -> [1,2,4].
+%% Returns the modified array.
+%%
+delete(Lno, _) when Lno < 1 ->
+    exit({out_of_range, Lno});
+delete(Lno, {N_Tot, _}) when Lno > N_Tot ->
+    exit({out_of_range, Lno});
+delete(Lno, {N, List}) when list(List) ->
+    {N-1, delete_nth(Lno, List)};
+delete(Lno, {N, {Left = {N_Left, _}, Right}}) when Lno > N_Left ->
+    case delete(Lno-N_Left, Right) of
+       {0, _} ->
+           case N-1 of N_Left -> ok end,       % Assert
+           Left;
+       NewRight ->
+           balance_right(N-1, Left, NewRight)
+    end;
+delete(Lno, {N, {Left, Right = {N_Right,_}}}) ->
+    case delete(Lno, Left) of
+       {0, _} ->
+           case N-1 of N_Right -> ok end,      % Assert
+           Right;
+       NewLeft ->
+           balance_left(N-1, NewLeft, Right)
+    end.
+
+convert_to_list({_, List}) when list(List) ->
+    List;
+convert_to_list({L, {Left, Right}}) ->
+    convert_to_list(Left) ++ convert_to_list(Right).
+
+convert_from_list(L) when list(L) ->
+    lists:foldl(fun(Ln, Lsx) ->
+                       append(Ln, Lsx)
+               end, new(), L).
+
+%%% ===========================================================
+%%% internal functions
+%%% ===========================================================
+
+replace_nth(1, [H|T], X) ->
+    [X|T];
+replace_nth(N, [H|T], X) ->
+    [H|replace_nth(N-1, T, X)].
+
+insert_nth(1, L, X) ->
+    [X|L];
+insert_nth(N, [H|T], X) ->
+    [H|insert_nth(N-1, T, X)].
+
+insert_after_nth(1, [H|T], X) ->
+    [H,X|T];
+insert_after_nth(N, [H|T], X) ->
+    [H|insert_after_nth(N-1, T, X)].
+
+delete_nth(1, [H|T]) ->
+    T;
+delete_nth(N, [H|T]) ->
+    [H|delete_nth(N-1, T)].
+
+%% split_at(Pos, List) -> {List1, List2}
+%%   split List into two after position Pos (List1 includes List[Pos])
+%%
+split_at(Pos, L) ->
+    split_at(Pos, L, []).
+
+split_at(0, L, Acc) ->
+    {lists:reverse(Acc), L};
+split_at(Pos, [H|T], Acc) ->
+    split_at(Pos-1, T, [H|Acc]).
+
+
+%% Balancing functions
+%% Since we know whether we inserted/deleted in the right or left subtree,
+%% we have explicit balancing functions for each case.
+%% We rebalance if the number of elements in one sub-subtree exceeds the
+%% sum of elements in the others.
+
+balance_left(N_Tot, 
+            Left = {N_Left, _}, 
+            Right = {N_Right, {RLeft = {N_RLeft, _}, 
+                               RRight = {N_RRight, _}}})  ->
+    NewN_Left = N_Left + N_RLeft,
+    if N_RRight > NewN_Left ->
+           NewLeft = {NewN_Left, {Left, RLeft}},
+           NewRight = RRight,
+           {N_Tot, {NewLeft, NewRight}};
+       true ->
+           {N_Tot, {Left, Right}}
+    end;
+balance_left(N_Tot, Left, Right) ->
+    {N_Tot, {Left, Right}}.
+
+balance_right(N_Tot, 
+            Left = {N_Left, {LLeft = {N_LLeft, _},
+                             LRight = {N_LRight, _}}}, 
+            Right = {N_Right, _})  ->
+    NewN_Right = N_Right + N_LRight,
+    if N_LLeft > NewN_Right ->
+           NewLeft = LLeft,
+           NewRight = {NewN_Right, {LRight, Right}},
+           {N_Tot, {NewLeft, NewRight}};
+       true ->
+           {N_Tot, {Left, Right}}
+    end;
+balance_right(N_Tot, Left, Right) ->
+    {N_Tot, {Left, Right}}.
+
+
diff --git a/test/etags/erl-src/lists.erl.gz b/test/etags/erl-src/lists.erl.gz
new file mode 100644
index 0000000..5ba2e16
Binary files /dev/null and b/test/etags/erl-src/lists.erl.gz differ
diff --git a/test/etags/f-src/entry.for b/test/etags/f-src/entry.for
new file mode 100644
index 0000000..52b8a24
--- /dev/null
+++ b/test/etags/f-src/entry.for
@@ -0,0 +1,581 @@
+C$Procedure      PRTPKG ( Declare Arguments for Error Message Routines )
+ 
+      LOGICAL FUNCTION PRTPKG ( SHORT, LONG, EXPL, TRACE, DFAULT, TYPE )
+ 
+C$ Abstract
+C
+C      Declare the arguments for the error message selection entry
+C      points.  DO NOT CALL THIS ROUTINE.
+C
+C$ Required_Reading
+C
+C      ERROR
+C
+C$ Keywords
+C
+C      ERROR
+C
+C$ Declarations
+ 
+       LOGICAL               SHORT
+       LOGICAL               EXPL
+       LOGICAL               LONG
+       LOGICAL               TRACE
+       LOGICAL               DFAULT
+       CHARACTER*(*)         TYPE
+ 
+       INTEGER               FILEN
+       PARAMETER           ( FILEN = 128 )
+ 
+ 
+C$ Brief_I/O
+C
+C      VARIABLE  I/O  ENTRY
+C      --------  ---  --------------------------------------------------
+C
+C      SHORT      I   SETPRT
+C      EXPL       I   SETPRT
+C      LONG       I   SETPRT
+C      TRACE      I   SETPRT
+C      DFAULT     I   SETPRT
+C      TYPE       I   MSGSEL
+C      FILEN      P   MSGSEL
+C
+C$ Detailed_Input
+C
+C      See the ENTRY points for discussions of their arguments.
+C
+C$ Detailed_Output
+C
+C      See the ENTRY points for discussions of their arguments.
+C
+C$ Parameters
+C
+C      See the ENTRY points for discussions of their parameters.
+C
+C$ Exceptions
+C
+C      This routine signals an error IF IT IS CALLED.
+C
+C$ Files
+C
+C      None.
+C
+C$ Particulars
+C
+C      DO NOT CALL THIS ROUTINE.
+C
+C      The entry points declared in this routine are:
+C
+C      SETPRT
+C      MSGSEL
+C
+C      There is no reason to call this subroutine.
+C      The purpose of this subroutine is to make the
+C      declarations required by the various entry points.
+C      This routine has no run-time function.
+C
+C$ Examples
+C
+C      None.  DO NOT CALL THIS ROUTINE.
+C
+C$ Restrictions
+C
+C      DO NOT CALL THIS ROUTINE.
+C
+C$ Literature_References
+C
+C      None.
+C
+C$ Author_and_Institution
+C
+C
+C$ Version
+C
+C-
+C         Comment section for permuted index source lines was added
+C         following the header.
+C
+C
+C-&
+ 
+C$ Index_Entries
+C
+C     None.
+C
+C-&
+ 
+ 
+ 
+C$ Revisions
+C
+C
+C-     Beta Version 1.0.1, 08-FEB-1989
+C
+C         PRTPKG, though it performs no run-time function, must
+C         still return a value, in order to comply with the Fortran
+C         standard.  So, now it does.
+C
+C-     Beta Version 1.0.1, 08-FEB-1989
+C
+C         Warnings added to discourage use of this routine.
+C         Parameter declarations moved to "Declarations" section.
+C         Two local declarations moved to the correct location.
+C-&
+ 
+ 
+ 
+C
+C     SPICELIB functions
+C
+ 
+      LOGICAL               SETPRT
+      LOGICAL               MSGSEL
+ 
+C
+C     Local variables:
+C
+      CHARACTER*(FILEN)     DEVICE
+ 
+      CHARACTER*(10)        LTYPE
+      CHARACTER*(10)        LOCTYP
+ 
+C
+C     Saved variables:
+C
+      LOGICAL               SVSHRT
+      LOGICAL               SVEXPL
+      LOGICAL               SVLONG
+      LOGICAL               SVTRAC
+      LOGICAL               SVDFLT
+ 
+      SAVE                  SVSHRT
+      SAVE                  SVEXPL
+      SAVE                  SVLONG
+      SAVE                  SVTRAC
+      SAVE                  SVDFLT
+ 
+C
+C     Initial values:
+C
+      DATA     SVSHRT   / .TRUE. /
+      DATA     SVEXPL   / .TRUE. /
+      DATA     SVLONG   / .TRUE. /
+      DATA     SVTRAC   / .TRUE. /
+      DATA     SVDFLT   / .TRUE. /
+ 
+C
+C     Executable Code:
+C
+ 
+      CALL GETDEV ( DEVICE )
+ 
+      CALL WRLINE ( DEVICE,
+     .              'PRTPKG:  You have called an entry point which' //
+     .              ' has no run-time function; this may indicate'  //
+     .              ' a program bug.  Please check the PRTPKG'      //
+     .              ' documentation.  ' )
+ 
+      CALL WRLINE ( DEVICE, 'SPICE(BOGUSENTRY)' )
+ 
+      PRTPKG = .FALSE.
+ 
+      RETURN
+ 
+ 
+ 
+ 
+ 
+ 
+C$Procedure      SETPRT ( Store Error Message Types to be Output )
+ 
+C      ENTRY  BOGUS (X, Y, Z)
+
+       ENTRY  SETPRT ( SHORT, EXPL, LONG, TRACE, DFAULT )
+ 
+C$ Abstract
+C
+C      Store (a representation of) the selection of types of error
+C      messages to be output.  DO NOT CALL THIS ROUTINE.
+C
+C$ Required_Reading
+C
+C      ERROR
+C
+C$ Keywords
+C
+C      ERROR
+C
+C$ Declarations
+C
+C      LOGICAL               SHORT
+C      LOGICAL               EXPL
+C      LOGICAL               LONG
+C      LOGICAL               TRACE
+C      LOGICAL               DFAULT
+C
+C$ Brief_I/O
+C
+C      VARIABLE  I/O  DESCRIPTION
+C      --------  ---  --------------------------------------------------
+C
+C      SHORT      I   Select output of short error message?
+C      EXPL       I   Select output of explanation of short message?
+C      LONG       I   Select output of long error message?
+C      TRACE      I   Select output of traceback?
+C      DFAULT     I   Select output of default message?
+C
+C$ Detailed_Input
+C
+C      SHORT    indicates whether the short error message is selected
+C               as one of the error messages to be output when an error
+C               is detected.  A value of .TRUE. indicates that the
+C               short error message IS selected.
+C
+C      EXPL     indicates whether the explanatory text for the short
+C               error message is selected as one of the error messages
+C               to be output when an error is detected.  A value of
+C               .TRUE. indicates that the explanatory text for the
+C               short error message IS selected.
+C
+C      LONG     indicates whether the long error message is selected
+C               as one of the error messages to be output when an error
+C               is detected.  A value of .TRUE. indicates that the
+C               long error message IS selected.
+C
+C      TRACE    indicates whether the traceback is selected
+C               as one of the error messages to be output when an error
+C               is detected.  A value of .TRUE. indicates that the
+C               traceback IS selected.
+C
+C      DFAULT   indicates whether the default message is selected
+C               as one of the error messages to be output when an error
+C               is detected.  A value of .TRUE. indicates that the
+C               default message IS selected.
+C
+C
+C$ Detailed_Output
+C
+C      None.
+C
+C$ Parameters
+C
+C      None.
+C
+C$ Exceptions
+C
+C      None.
+C
+C$ Files
+C
+C      None.
+C
+C$ Particulars
+C
+C      DO NOT CALL THIS ROUTINE.
+C
+C      The effect of this routine is an ENVIRONMENTAL one.  This
+C      routine performs no output;  it stores the error message
+C      selection provided as input.
+C
+C      Note that the actual output of error messages depends not
+C      only on the selection made using this routine, but also
+C      on the selection of the error output device (see ERRDEV)
+C      and the choice of error response action (see ERRACT). If
+C      the action is not 'IGNORE' (possible choices are
+C      'IGNORE', 'ABORT', 'DEFAULT', 'REPORT', and 'RETURN'),
+C      the selected error messages will be written to the chosen
+C      output device when an error is detected.
+C
+C$ Examples
+C
+C      1.  In this example, the short and long messages are selected.
+C
+C      C
+C      C     Select short and long error messages for output
+C      C     (We don't examine the status returned because no
+C      C     errors are detected by SETPRT):
+C      C
+C
+C            STATUS = SETPRT ( .TRUE., .FALSE., .TRUE., .FALSE.,
+C           .                  .FALSE.                          )
+C
+C
+C
+C$ Restrictions
+C
+C      DO NOT CALL THIS ROUTINE.
+C
+C$ Literature_References
+C
+C      None.
+C
+C$ Author_and_Institution
+C
+C
+C$ Version
+C
+C-
+C
+C-&
+ 
+C$ Index_Entries
+C
+C     None.
+C
+C-&
+ 
+ 
+C$ Revisions
+C
+C-
+C         Warnings added to discourage use of this routine in
+C         non-error-handling code.  Parameters section added.
+C
+C-&
+ 
+ 
+ 
+C
+C     Executable Code:
+C
+ 
+ 
+      IF   (  SHORT  )    THEN
+         SVSHRT = .TRUE.
+      ELSE
+         SVSHRT = .FALSE.
+      END IF
+ 
+ 
+ 
+      IF   (  EXPL   )    THEN
+         SVEXPL = .TRUE.
+      ELSE
+         SVEXPL = .FALSE.
+      END IF
+ 
+ 
+ 
+      IF   (  LONG   )    THEN
+         SVLONG = .TRUE.
+      ELSE
+         SVLONG = .FALSE.
+      END IF
+ 
+ 
+ 
+      IF   (  TRACE  )    THEN
+         SVTRAC = .TRUE.
+      ELSE
+         SVTRAC = .FALSE.
+      END IF
+ 
+      IF   (  DFAULT  )    THEN
+         SVDFLT = .TRUE.
+      ELSE
+         SVDFLT = .FALSE.
+      END IF
+ 
+ 
+C
+C     We assign a value to SETPRT, but this value is
+C     not meaningful...
+C
+      SETPRT = .TRUE.
+ 
+ 
+      RETURN
+ 
+ 
+ 
+ 
+C$Procedure      MSGSEL  ( Is This Message Type Selected for Output? )
+ 
+       ENTRY  MSGSEL ( TYPE )
+ 
+C$ Abstract
+C
+C      Indicate whether the specified message type has been selected
+C      for output.
+C
+C$ Required_Reading
+C
+C      ERROR
+C
+C$ Keywords
+C
+C      ERROR
+C
+C$ Declarations
+C
+C      TYPE
+C
+C$ Brief_I/O
+C
+C      VARIABLE  I/O  DESCRIPTION
+C      --------  ---  --------------------------------------------------
+C
+C      TYPE       I   Type of message whose selection status is queried.
+C      FILEN      P   Maximum length of a file name.
+C
+C      The function takes the value .TRUE. if the message type indicated
+C      by TYPE has been selected for output to the error output device.
+C
+C
+C$ Detailed_Input
+C
+C      TYPE   Refers to a type of error message.  Possible values
+C             are 'SHORT', 'EXPLAIN', 'LONG', 'DEFAULT',
+C             and 'TRACEBACK'.
+C
+C$ Detailed_Output
+C
+C      The function takes the value .TRUE. if the message type indicated
+C      by TYPE has been selected for output to the error output device.
+C
+C$ Parameters
+C
+C      FILEN  is the maximum length of a file name.
+C
+C$ Exceptions
+C
+C      Additionally, invalid values of TYPE are detected.
+C
+C      The short error message set in this case is:
+C      'SPICE(INVALIDMSGTYPE)'
+C
+C      The handling of this error is a special case; to avoid recursion
+C      problems, SIGERR is not called when the error is detected.
+C      Instead, the short and long error messages are output directly.
+C
+C
+C$ Files
+C
+C      None.
+C
+C$ Particulars
+C
+C      This routine is part of the SPICELIB error handling mechanism.
+C
+C      Note that even though a given type of message may have been
+C      selected for output, the output device and error response
+C      action must also have been selected appropriately.
+C      Use ERRDEV to choose the output device for error messages.
+C      Use ERRACT to choose the error response action.  Any action
+C      other than 'IGNORE' will result in error messages being
+C      written to the error output device when errors are detected.
+C      See ERRACT for details.
+C
+C$ Examples
+C
+C
+C      1.  We want to know if the short message has been selected
+C          for output:
+C
+C          C
+C          C     Test whether the short message has been selected:
+C          C
+C
+C                SELECT = MSGSEL ( 'SHORT' )
+C
+C
+C$ Restrictions
+C
+C      None.
+C
+C$ Literature_References
+C
+C      None.
+C
+C$ Author_and_Institution
+C
+C
+C$ Version
+C
+C
+C-&
+ 
+C$ Index_Entries
+C
+C     None.
+C
+C-&
+ 
+ 
+C$ Revisions
+C
+C
+C         Parameters section added; parameter declaration added
+C         to brief I/O section as well.
+C
+C-&
+ 
+ 
+ 
+C
+C     Executable Code:
+C
+ 
+      CALL LJUST ( TYPE,  LTYPE )
+      CALL UCASE ( LTYPE, LTYPE )
+ 
+ 
+      IF ( LTYPE  .EQ. 'SHORT' ) THEN
+ 
+         MSGSEL = SVSHRT
+ 
+      ELSE IF ( LTYPE  .EQ. 'EXPLAIN' ) THEN
+ 
+         MSGSEL = SVEXPL
+ 
+      ELSE IF ( LTYPE  .EQ. 'LONG' ) THEN
+ 
+         MSGSEL = SVLONG
+ 
+      ELSE IF ( LTYPE  .EQ. 'TRACEBACK' ) THEN
+ 
+         MSGSEL = SVTRAC
+ 
+      ELSE IF ( LTYPE  .EQ. 'DEFAULT' ) THEN
+ 
+         MSGSEL = SVDFLT
+ 
+      ELSE
+ 
+C
+C        Bad value of type!  We have a special case here; to
+C        avoid recursion, we output the messages directly,
+C        rather than call SIGERR.
+C
+ 
+         CALL GETDEV ( DEVICE )
+ 
+         CALL WRLINE ( DEVICE,  'SPICE(INVALIDMSGTYPE)' )
+ 
+         CALL WRLINE ( DEVICE, ' ' )
+ 
+         LOCTYP = TYPE
+ 
+C
+C        Note:  What looks like a typo below isn't; there's
+C        a line break after the substring 'specified' of
+C        the "word" 'specifiedwas'.
+C
+ 
+         CALL WRLINE ( DEVICE,
+ 
+     .   'MSGSEL:  An invalid error message type was supplied as'     //
+     .   ' input; the type specifiedwas:  ' // LOCTYP
+ 
+     .                )
+ 
+ 
+      END IF
+ 
+       subroutine 
+     & intensity1(efv,fv,svin,svquad,sfpv,maxp,value,jndex,k,kj,jmod,isup)
+
+       character*(*) function foo()
+
+      END
diff --git a/test/etags/f-src/entry.strange.gz 
b/test/etags/f-src/entry.strange.gz
new file mode 100644
index 0000000..5f22edc
Binary files /dev/null and b/test/etags/f-src/entry.strange.gz differ
diff --git a/test/etags/f-src/entry.strange_suffix 
b/test/etags/f-src/entry.strange_suffix
new file mode 100644
index 0000000..52b8a24
--- /dev/null
+++ b/test/etags/f-src/entry.strange_suffix
@@ -0,0 +1,581 @@
+C$Procedure      PRTPKG ( Declare Arguments for Error Message Routines )
+ 
+      LOGICAL FUNCTION PRTPKG ( SHORT, LONG, EXPL, TRACE, DFAULT, TYPE )
+ 
+C$ Abstract
+C
+C      Declare the arguments for the error message selection entry
+C      points.  DO NOT CALL THIS ROUTINE.
+C
+C$ Required_Reading
+C
+C      ERROR
+C
+C$ Keywords
+C
+C      ERROR
+C
+C$ Declarations
+ 
+       LOGICAL               SHORT
+       LOGICAL               EXPL
+       LOGICAL               LONG
+       LOGICAL               TRACE
+       LOGICAL               DFAULT
+       CHARACTER*(*)         TYPE
+ 
+       INTEGER               FILEN
+       PARAMETER           ( FILEN = 128 )
+ 
+ 
+C$ Brief_I/O
+C
+C      VARIABLE  I/O  ENTRY
+C      --------  ---  --------------------------------------------------
+C
+C      SHORT      I   SETPRT
+C      EXPL       I   SETPRT
+C      LONG       I   SETPRT
+C      TRACE      I   SETPRT
+C      DFAULT     I   SETPRT
+C      TYPE       I   MSGSEL
+C      FILEN      P   MSGSEL
+C
+C$ Detailed_Input
+C
+C      See the ENTRY points for discussions of their arguments.
+C
+C$ Detailed_Output
+C
+C      See the ENTRY points for discussions of their arguments.
+C
+C$ Parameters
+C
+C      See the ENTRY points for discussions of their parameters.
+C
+C$ Exceptions
+C
+C      This routine signals an error IF IT IS CALLED.
+C
+C$ Files
+C
+C      None.
+C
+C$ Particulars
+C
+C      DO NOT CALL THIS ROUTINE.
+C
+C      The entry points declared in this routine are:
+C
+C      SETPRT
+C      MSGSEL
+C
+C      There is no reason to call this subroutine.
+C      The purpose of this subroutine is to make the
+C      declarations required by the various entry points.
+C      This routine has no run-time function.
+C
+C$ Examples
+C
+C      None.  DO NOT CALL THIS ROUTINE.
+C
+C$ Restrictions
+C
+C      DO NOT CALL THIS ROUTINE.
+C
+C$ Literature_References
+C
+C      None.
+C
+C$ Author_and_Institution
+C
+C
+C$ Version
+C
+C-
+C         Comment section for permuted index source lines was added
+C         following the header.
+C
+C
+C-&
+ 
+C$ Index_Entries
+C
+C     None.
+C
+C-&
+ 
+ 
+ 
+C$ Revisions
+C
+C
+C-     Beta Version 1.0.1, 08-FEB-1989
+C
+C         PRTPKG, though it performs no run-time function, must
+C         still return a value, in order to comply with the Fortran
+C         standard.  So, now it does.
+C
+C-     Beta Version 1.0.1, 08-FEB-1989
+C
+C         Warnings added to discourage use of this routine.
+C         Parameter declarations moved to "Declarations" section.
+C         Two local declarations moved to the correct location.
+C-&
+ 
+ 
+ 
+C
+C     SPICELIB functions
+C
+ 
+      LOGICAL               SETPRT
+      LOGICAL               MSGSEL
+ 
+C
+C     Local variables:
+C
+      CHARACTER*(FILEN)     DEVICE
+ 
+      CHARACTER*(10)        LTYPE
+      CHARACTER*(10)        LOCTYP
+ 
+C
+C     Saved variables:
+C
+      LOGICAL               SVSHRT
+      LOGICAL               SVEXPL
+      LOGICAL               SVLONG
+      LOGICAL               SVTRAC
+      LOGICAL               SVDFLT
+ 
+      SAVE                  SVSHRT
+      SAVE                  SVEXPL
+      SAVE                  SVLONG
+      SAVE                  SVTRAC
+      SAVE                  SVDFLT
+ 
+C
+C     Initial values:
+C
+      DATA     SVSHRT   / .TRUE. /
+      DATA     SVEXPL   / .TRUE. /
+      DATA     SVLONG   / .TRUE. /
+      DATA     SVTRAC   / .TRUE. /
+      DATA     SVDFLT   / .TRUE. /
+ 
+C
+C     Executable Code:
+C
+ 
+      CALL GETDEV ( DEVICE )
+ 
+      CALL WRLINE ( DEVICE,
+     .              'PRTPKG:  You have called an entry point which' //
+     .              ' has no run-time function; this may indicate'  //
+     .              ' a program bug.  Please check the PRTPKG'      //
+     .              ' documentation.  ' )
+ 
+      CALL WRLINE ( DEVICE, 'SPICE(BOGUSENTRY)' )
+ 
+      PRTPKG = .FALSE.
+ 
+      RETURN
+ 
+ 
+ 
+ 
+ 
+ 
+C$Procedure      SETPRT ( Store Error Message Types to be Output )
+ 
+C      ENTRY  BOGUS (X, Y, Z)
+
+       ENTRY  SETPRT ( SHORT, EXPL, LONG, TRACE, DFAULT )
+ 
+C$ Abstract
+C
+C      Store (a representation of) the selection of types of error
+C      messages to be output.  DO NOT CALL THIS ROUTINE.
+C
+C$ Required_Reading
+C
+C      ERROR
+C
+C$ Keywords
+C
+C      ERROR
+C
+C$ Declarations
+C
+C      LOGICAL               SHORT
+C      LOGICAL               EXPL
+C      LOGICAL               LONG
+C      LOGICAL               TRACE
+C      LOGICAL               DFAULT
+C
+C$ Brief_I/O
+C
+C      VARIABLE  I/O  DESCRIPTION
+C      --------  ---  --------------------------------------------------
+C
+C      SHORT      I   Select output of short error message?
+C      EXPL       I   Select output of explanation of short message?
+C      LONG       I   Select output of long error message?
+C      TRACE      I   Select output of traceback?
+C      DFAULT     I   Select output of default message?
+C
+C$ Detailed_Input
+C
+C      SHORT    indicates whether the short error message is selected
+C               as one of the error messages to be output when an error
+C               is detected.  A value of .TRUE. indicates that the
+C               short error message IS selected.
+C
+C      EXPL     indicates whether the explanatory text for the short
+C               error message is selected as one of the error messages
+C               to be output when an error is detected.  A value of
+C               .TRUE. indicates that the explanatory text for the
+C               short error message IS selected.
+C
+C      LONG     indicates whether the long error message is selected
+C               as one of the error messages to be output when an error
+C               is detected.  A value of .TRUE. indicates that the
+C               long error message IS selected.
+C
+C      TRACE    indicates whether the traceback is selected
+C               as one of the error messages to be output when an error
+C               is detected.  A value of .TRUE. indicates that the
+C               traceback IS selected.
+C
+C      DFAULT   indicates whether the default message is selected
+C               as one of the error messages to be output when an error
+C               is detected.  A value of .TRUE. indicates that the
+C               default message IS selected.
+C
+C
+C$ Detailed_Output
+C
+C      None.
+C
+C$ Parameters
+C
+C      None.
+C
+C$ Exceptions
+C
+C      None.
+C
+C$ Files
+C
+C      None.
+C
+C$ Particulars
+C
+C      DO NOT CALL THIS ROUTINE.
+C
+C      The effect of this routine is an ENVIRONMENTAL one.  This
+C      routine performs no output;  it stores the error message
+C      selection provided as input.
+C
+C      Note that the actual output of error messages depends not
+C      only on the selection made using this routine, but also
+C      on the selection of the error output device (see ERRDEV)
+C      and the choice of error response action (see ERRACT). If
+C      the action is not 'IGNORE' (possible choices are
+C      'IGNORE', 'ABORT', 'DEFAULT', 'REPORT', and 'RETURN'),
+C      the selected error messages will be written to the chosen
+C      output device when an error is detected.
+C
+C$ Examples
+C
+C      1.  In this example, the short and long messages are selected.
+C
+C      C
+C      C     Select short and long error messages for output
+C      C     (We don't examine the status returned because no
+C      C     errors are detected by SETPRT):
+C      C
+C
+C            STATUS = SETPRT ( .TRUE., .FALSE., .TRUE., .FALSE.,
+C           .                  .FALSE.                          )
+C
+C
+C
+C$ Restrictions
+C
+C      DO NOT CALL THIS ROUTINE.
+C
+C$ Literature_References
+C
+C      None.
+C
+C$ Author_and_Institution
+C
+C
+C$ Version
+C
+C-
+C
+C-&
+ 
+C$ Index_Entries
+C
+C     None.
+C
+C-&
+ 
+ 
+C$ Revisions
+C
+C-
+C         Warnings added to discourage use of this routine in
+C         non-error-handling code.  Parameters section added.
+C
+C-&
+ 
+ 
+ 
+C
+C     Executable Code:
+C
+ 
+ 
+      IF   (  SHORT  )    THEN
+         SVSHRT = .TRUE.
+      ELSE
+         SVSHRT = .FALSE.
+      END IF
+ 
+ 
+ 
+      IF   (  EXPL   )    THEN
+         SVEXPL = .TRUE.
+      ELSE
+         SVEXPL = .FALSE.
+      END IF
+ 
+ 
+ 
+      IF   (  LONG   )    THEN
+         SVLONG = .TRUE.
+      ELSE
+         SVLONG = .FALSE.
+      END IF
+ 
+ 
+ 
+      IF   (  TRACE  )    THEN
+         SVTRAC = .TRUE.
+      ELSE
+         SVTRAC = .FALSE.
+      END IF
+ 
+      IF   (  DFAULT  )    THEN
+         SVDFLT = .TRUE.
+      ELSE
+         SVDFLT = .FALSE.
+      END IF
+ 
+ 
+C
+C     We assign a value to SETPRT, but this value is
+C     not meaningful...
+C
+      SETPRT = .TRUE.
+ 
+ 
+      RETURN
+ 
+ 
+ 
+ 
+C$Procedure      MSGSEL  ( Is This Message Type Selected for Output? )
+ 
+       ENTRY  MSGSEL ( TYPE )
+ 
+C$ Abstract
+C
+C      Indicate whether the specified message type has been selected
+C      for output.
+C
+C$ Required_Reading
+C
+C      ERROR
+C
+C$ Keywords
+C
+C      ERROR
+C
+C$ Declarations
+C
+C      TYPE
+C
+C$ Brief_I/O
+C
+C      VARIABLE  I/O  DESCRIPTION
+C      --------  ---  --------------------------------------------------
+C
+C      TYPE       I   Type of message whose selection status is queried.
+C      FILEN      P   Maximum length of a file name.
+C
+C      The function takes the value .TRUE. if the message type indicated
+C      by TYPE has been selected for output to the error output device.
+C
+C
+C$ Detailed_Input
+C
+C      TYPE   Refers to a type of error message.  Possible values
+C             are 'SHORT', 'EXPLAIN', 'LONG', 'DEFAULT',
+C             and 'TRACEBACK'.
+C
+C$ Detailed_Output
+C
+C      The function takes the value .TRUE. if the message type indicated
+C      by TYPE has been selected for output to the error output device.
+C
+C$ Parameters
+C
+C      FILEN  is the maximum length of a file name.
+C
+C$ Exceptions
+C
+C      Additionally, invalid values of TYPE are detected.
+C
+C      The short error message set in this case is:
+C      'SPICE(INVALIDMSGTYPE)'
+C
+C      The handling of this error is a special case; to avoid recursion
+C      problems, SIGERR is not called when the error is detected.
+C      Instead, the short and long error messages are output directly.
+C
+C
+C$ Files
+C
+C      None.
+C
+C$ Particulars
+C
+C      This routine is part of the SPICELIB error handling mechanism.
+C
+C      Note that even though a given type of message may have been
+C      selected for output, the output device and error response
+C      action must also have been selected appropriately.
+C      Use ERRDEV to choose the output device for error messages.
+C      Use ERRACT to choose the error response action.  Any action
+C      other than 'IGNORE' will result in error messages being
+C      written to the error output device when errors are detected.
+C      See ERRACT for details.
+C
+C$ Examples
+C
+C
+C      1.  We want to know if the short message has been selected
+C          for output:
+C
+C          C
+C          C     Test whether the short message has been selected:
+C          C
+C
+C                SELECT = MSGSEL ( 'SHORT' )
+C
+C
+C$ Restrictions
+C
+C      None.
+C
+C$ Literature_References
+C
+C      None.
+C
+C$ Author_and_Institution
+C
+C
+C$ Version
+C
+C
+C-&
+ 
+C$ Index_Entries
+C
+C     None.
+C
+C-&
+ 
+ 
+C$ Revisions
+C
+C
+C         Parameters section added; parameter declaration added
+C         to brief I/O section as well.
+C
+C-&
+ 
+ 
+ 
+C
+C     Executable Code:
+C
+ 
+      CALL LJUST ( TYPE,  LTYPE )
+      CALL UCASE ( LTYPE, LTYPE )
+ 
+ 
+      IF ( LTYPE  .EQ. 'SHORT' ) THEN
+ 
+         MSGSEL = SVSHRT
+ 
+      ELSE IF ( LTYPE  .EQ. 'EXPLAIN' ) THEN
+ 
+         MSGSEL = SVEXPL
+ 
+      ELSE IF ( LTYPE  .EQ. 'LONG' ) THEN
+ 
+         MSGSEL = SVLONG
+ 
+      ELSE IF ( LTYPE  .EQ. 'TRACEBACK' ) THEN
+ 
+         MSGSEL = SVTRAC
+ 
+      ELSE IF ( LTYPE  .EQ. 'DEFAULT' ) THEN
+ 
+         MSGSEL = SVDFLT
+ 
+      ELSE
+ 
+C
+C        Bad value of type!  We have a special case here; to
+C        avoid recursion, we output the messages directly,
+C        rather than call SIGERR.
+C
+ 
+         CALL GETDEV ( DEVICE )
+ 
+         CALL WRLINE ( DEVICE,  'SPICE(INVALIDMSGTYPE)' )
+ 
+         CALL WRLINE ( DEVICE, ' ' )
+ 
+         LOCTYP = TYPE
+ 
+C
+C        Note:  What looks like a typo below isn't; there's
+C        a line break after the substring 'specified' of
+C        the "word" 'specifiedwas'.
+C
+ 
+         CALL WRLINE ( DEVICE,
+ 
+     .   'MSGSEL:  An invalid error message type was supplied as'     //
+     .   ' input; the type specifiedwas:  ' // LOCTYP
+ 
+     .                )
+ 
+ 
+      END IF
+ 
+       subroutine 
+     & intensity1(efv,fv,svin,svquad,sfpv,maxp,value,jndex,k,kj,jmod,isup)
+
+       character*(*) function foo()
+
+      END
diff --git a/test/etags/forth-src/test-forth.fth 
b/test/etags/forth-src/test-forth.fth
new file mode 100644
index 0000000..ce4069d
--- /dev/null
+++ b/test/etags/forth-src/test-forth.fth
@@ -0,0 +1,53 @@
+\
+\ This is a file that tests Forth tags
+\
+\ You should get:
+\      a-forth-word            (twice)
+\      a-forth-constant!
+\      a-forth-value?
+\      :a-forth-dictionary-entry
+\      #a-defer-word
+\      (another-forth-word)
+\      (a-forth-constant
+\      #some-storage
+\      assemby-code-word
+
+
+\ This is a forth comment
+
+( Another forth comment )
+
+: a-forth-word ( a b c -- a*b+c )  + * ;
+
+99 constant a-forth-constant!
+55 value a-forth-value?
+create :a-forth-dictionary-entry
+0 c, 9 c, 5 c, 7 c, 999999 ,
+
+defer #a-defer-word
+
+: (another-forth-word) ( -- )
+    ." Hello world"
+;
+
+' (another-forth-word) to #a-defer-word
+
+struct
+   9   field   >field1
+   5   field   >field2
+constant (a-forth-constant
+
+
+2000 buffer: #some-storage
+
+code assemby-code-word ( dunno what it does )
+    g1 g2 mov          \ Move from here to there
+    sc2 h# 13 sc2 sllx \ shift stuff 'round
+c;
+
+\ And for the heck of it, redefine a-forth-word.
+
+: a-forth-word ( a b c -- )
+    a-forth-word dup 200 > abort" Eek.  The number is too big"
+    ." Result is " . cr
+;
diff --git a/test/etags/html-src/algrthms.html 
b/test/etags/html-src/algrthms.html
new file mode 100644
index 0000000..322dafa
--- /dev/null
+++ b/test/etags/html-src/algrthms.html
@@ -0,0 +1,519 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+   <meta name="Author" content="Chip Fleming">
+   <meta name="GENERATOR" content="Mozilla/4.7 [en] (Win95; U) [Netscape]">
+   <title>Tutorial on Convolutional Coding with Viterbi Decoding--Description 
of the Data Generation, Convolutional Encoding, Channel Mapping and AWGN, and 
Quantizing Algorithms</title>
+</head>
+<body>
+<a NAME="algorithms"></a><b><font face="Arial"><font size=+1>Description
+of the Algorithms&nbsp; (Part 1)</font></font></b>
+<p>&nbsp;The steps involved in simulating a communication channel using
+convolutional encoding and Viterbi decoding are as follows:
+<ul>
+<li>
+<a href="#genalgorithm">Generate the data</a> to be transmitted through
+the channel-result is binary data bits</li>
+
+<li>
+<a href="#conalgorithm">Convolutionally encode</a> the data-result is channel
+symbols</li>
+
+<li>
+<a href="#mapping">Map the one/zero channel symbols</a> onto an antipodal
+baseband signal, producing transmitted channel symbols</li>
+
+<li>
+<a href="#addnoise">Add noise</a> to the transmitted channel symbols-result
+is received channel symbols</li>
+
+<li>
+<a href="#quantizing">Quantize</a> the received channel levels-one bit
+quantization is called hard-decision, and two to n bit quantization is
+called soft-decision (n is usually three or four)</li>
+
+<li>
+<a href="algrthms2.html">Perform Viterbi decoding</a> on the quantized
+received channel symbols-result is again binary data bits</li>
+
+<li>
+Compare the decoded data bits to the transmitted data bits and count the
+number of errors.</li>
+</ul>
+<i>Many of you will notice that I left out the steps of modulating the
+channel symbols onto a transmitted carrier, and then demodulating the received
+carrier to recover the channel symbols. You're right, but we can accurately
+model the effects of AWGN even though we bypass those steps.</i>
+<p><a NAME="genalgorithm"></a><b><i><font face="Arial">Generating the 
Data</font></i></b>
+<p>Generating the data to be transmitted through the channel can be 
accomplished
+quite simply by using a random number generator. One that produces a uniform
+distribution of numbers on the interval 0 to a maximum value is provided
+in C: <tt>rand ()</tt>. Using this function, we can say that any value
+less than half of the maximum value is a zero; any value greater than or
+equal to half of the maximum value is a one.
+<p><a NAME="conalgorithm"></a><b><i><font face="Arial">Convolutionally
+Encoding the Data</font></i></b>
+<p>Convolutionally encoding the data is accomplished using a shift register
+and associated combinatorial logic that performs modulo-two addition. (A
+shift register is merely a chain of flip-flops wherein the output of the
+nth flip-flop is tied to the input of the (n+1)th flip-flop. Every time
+the active edge of the clock occurs, the input to the flip-flop is clocked
+through to the output, and thus the data are shifted over one stage.) The
+combinatorial logic is often in the form of cascaded exclusive-or gates.
+As a reminder, exclusive-or gates are two-input, one-output gates often
+represented by the logic symbol shown below,
+<center>
+<p><img SRC="figs/xor_gate.gif" ALT="exclusive-or gate symbol" height=64 
width=93></center>
+
+<p>that implement the following truth-table:
+<br>&nbsp;
+<br>&nbsp;
+<center><table BORDER CELLPADDING=7 WIDTH="218" >
+<tr>
+<td VALIGN=TOP WIDTH="28%">
+<center><b><tt>Input A</tt></b></center>
+</td>
+
+<td VALIGN=TOP WIDTH="27%">
+<center><b><tt>Input B</tt></b></center>
+</td>
+
+<td VALIGN=TOP WIDTH="45%">
+<center><b><tt>Output</tt></b>
+<p><b><tt>(A xor B)</tt></b></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="28%">
+<center><tt>0</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="27%">
+<center><tt>0</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="45%">
+<center><tt>0</tt></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="28%">
+<center><tt>0</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="27%">
+<center><tt>1</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="45%">
+<center><tt>1</tt></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="28%">
+<center><tt>1</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="27%">
+<center><tt>0</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="45%">
+<center><tt>1</tt></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="28%">
+<center><tt>1</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="27%">
+<center><tt>1</tt></center>
+</td>
+
+<td VALIGN=TOP WIDTH="45%">
+<center><tt>0</tt></center>
+</td>
+</tr>
+</table></center>
+
+<p>The exclusive-or gate performs modulo-two addition of its inputs. When
+you cascade q two-input exclusive-or gates, with the output of the first
+one feeding one of the inputs of the second one, the output of the second
+one feeding one of the inputs of the third one, etc., the output of the
+last one in the chain is the modulo-two sum of the q + 1 inputs.
+<p>Another way to illustrate the modulo-two adder, and the way that is
+most commonly used in textbooks, is as a circle with a + symbol inside,
+thus:
+<center>
+<p><img SRC="figs/ringsum.gif" ALT="modulo-two adder symbol" height=48 
width=48></center>
+
+<p>Now that we have the two basic components of the convolutional encoder
+(flip-flops comprising the shift register and exclusive-or gates comprising
+the associated modulo-two adders) defined, let's look at a picture of a
+convolutional encoder for a rate 1/2, K = 3, m = 2 code:
+<br>&nbsp;
+<br>&nbsp;
+<br>
+<center>
+<p><img SRC="figs/ce_7_5_a.gif" ALT="rate 1/2 K = 3 (7, 5) convolutional 
encoder" height=232 width=600></center>
+
+<p>In this encoder, data bits are provided at a rate of k bits per second.
+Channel symbols are output at a rate of n = 2k symbols per second. The
+input bit is stable during the encoder cycle. The encoder cycle starts
+when an input clock edge occurs. When the input clock edge occurs, the
+output of the left-hand flip-flop is clocked into the right-hand flip-flop,
+the previous input bit is clocked into the left-hand flip-flop, and a new
+input bit becomes available. Then the outputs of the upper and lower modulo-two
+adders become stable. The output selector (SEL A/B block) cycles through
+two states-in the first state, it selects and outputs the output of the
+upper modulo-two adder; in the second state, it selects and outputs the
+output of the lower modulo-two adder.
+<p>The encoder shown above encodes the K = 3, (7, 5) convolutional code.
+The octal numbers 7 and 5 represent the code generator polynomials, which
+when read in binary (111<sub>2</sub> and 101<sub>2</sub>) correspond to
+the shift register connections to the upper and lower modulo-two adders,
+respectively. This code has been determined to be the "best" code for rate
+1/2, K = 3. It is the code I will use for the remaining discussion and
+examples, for reasons that will become readily apparent when we get into
+the Viterbi decoder algorithm.
+<p>Let's look at an example input data stream, and the corresponding output
+data stream:
+<p>Let the input sequence be 010111001010001<sub>2</sub>.
+<p>Assume that the outputs of both of the flip-flops in the shift register
+are initially cleared, i.e. their outputs are zeroes. The first clock cycle
+makes the first input bit, a zero, available to the encoder. The flip-flop
+outputs are both zeroes. The inputs to the modulo-two adders are all zeroes,
+so the output of the encoder is 00<sub>2</sub>.
+<p>The second clock cycle makes the second input bit available to the encoder.
+The left-hand flip-flop clocks in the previous bit, which was a zero, and
+the right-hand flip-flop clocks in the zero output by the left-hand flip-flop.
+The inputs to the top modulo-two adder are 100<sub>2</sub>, so the output
+is a one. The inputs to the bottom modulo-two adder are 10<sub>2</sub>,
+so the output is also a one. So the encoder outputs 11<sub>2</sub> for
+the channel symbols.
+<p>The third clock cycle makes the third input bit, a zero, available to
+the encoder. The left-hand flip-flop clocks in the previous bit, which
+was a one, and the right-hand flip-flop clocks in the zero from two bit-times
+ago. The inputs to the top modulo-two adder are 010<sub>2</sub>, so the
+output is a one. The inputs to the bottom modulo-two adder are 00<sub>2</sub>,
+so the output is zero. So the encoder outputs 10<sub>2</sub> for the channel
+symbols.
+<p>And so on. The timing diagram shown below illustrates the process:
+<br>&nbsp;
+<br>&nbsp;
+<br>
+<center>
+<p><img SRC="figs/ce_td.gif" ALT="timing diagram for rate 1/2 convolutional 
encoder" height=322 width=600></center>
+
+<p><br>
+<br>
+<br>
+<p>After all of the inputs have been presented to the encoder, the output
+sequence will be:
+<p>00 11 10 00 01 10 01 11 11 10 00 10 11 00 11<sub>2</sub>.
+<p>Notice that I have paired the encoder outputs-the first bit in each
+pair is the output of the upper modulo-two adder; the second bit in each
+pair is the output of the lower modulo-two adder.
+<p>You can see from the structure of the rate 1/2 K = 3 convolutional encoder
+and from the example given above that each input bit has an effect on three
+successive pairs of output symbols. That is an extremely important point
+and that is what gives the convolutional code its error-correcting power.
+The reason why will become evident when we get into the Viterbi decoder
+algorithm.
+<p>Now if we are only going to send the 15 data bits given above, in order
+for the last bit to affect three pairs of output symbols, we need to output
+two more pairs of symbols. This is accomplished in our example encoder
+by clocking the convolutional encoder flip-flops two ( = m) more times,
+while holding the input at zero. This is called "flushing" the encoder,
+and results in two more pairs of output symbols. The final binary output
+of the encoder is thus 00 11 10 00 01 10 01 11 11 10 00 10 11 00 11 10
+11<sub>2</sub>. If we don't perform the flushing operation, the last m
+bits of the message have less error-correction capability than the first
+through (m - 1)th bits had. This is a pretty important thing to remember
+if you're going to use this FEC technique in a burst-mode environment.
+So's the step of clearing the shift register at the beginning of each burst.
+The encoder must start in a known state and end in a known state for the
+decoder to be able to reconstruct the input data sequence properly.
+<p>Now, let's look at the encoder from another perspective. You can think
+of the encoder as a simple state machine. The example encoder has two bits
+of memory, so there are four possible states. Let's give the left-hand
+flip-flop a binary weight of 2<sup>1</sup>, and the right-hand flip-flop
+a binary weight of 2<sup>0</sup>. Initially, the encoder is in the all-zeroes
+state. If the first input bit is a zero, the encoder stays in the all zeroes
+state at the next clock edge. But if the input bit is a one, the encoder
+transitions to the 10<sub>2</sub> state at the next clock edge. Then, if
+the next input bit is zero, the encoder transitions to the 01<sub>2</sub>
+state, otherwise, it transitions to the 11<sub>2</sub> state. The following
+table gives the next state given the current state and the input, with
+the states given in binary:
+<br>&nbsp;
+<br>&nbsp;
+<center><table BORDER CELLSPACING=2 CELLPADDING=7 WIDTH="282" >
+<tr>
+<td VALIGN=TOP WIDTH="33%"><font face="Arial"><font 
size=-1>&nbsp;</font></font></td>
+
+<td VALIGN=TOP COLSPAN="2" WIDTH="67%">
+<center><a NAME="statetable"></a><b><font face="Arial"><font size=-1>Next
+State, if&nbsp;</font></font></b></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><b><font face="Arial"><font size=-1>Current 
State</font></font></b></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><b><font face="Arial"><font size=-1>Input = 
0:</font></font></b></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><b><font face="Arial"><font size=-1>Input = 
1:</font></font></b></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>00</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>00</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>10</font></font></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>01</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>00</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>10</font></font></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>10</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>01</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>11</font></font></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>11</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>01</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>11</font></font></center>
+</td>
+</tr>
+</table></center>
+
+<br>&nbsp;
+<p>The above table is often called a state transition table. We'll refer
+to it as the <tt>next state</tt> table.<tt> </tt>Now let us look at a table
+that lists the channel output symbols, given the current state and the
+input data, which we'll refer to as the <tt>output</tt> table:
+<br>&nbsp;
+<br>&nbsp;
+<center><table BORDER CELLSPACING=2 CELLPADDING=7 WIDTH="282" >
+<tr>
+<td VALIGN=TOP WIDTH="33%"></td>
+
+<td VALIGN=TOP COLSPAN="2" WIDTH="67%">
+<center><a NAME="outputtable"></a><b><font face="Arial"><font size=-1>Output
+Symbols, if</font></font></b></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><b><font face="Arial"><font size=-1>Current 
State</font></font></b></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><b><font face="Arial"><font size=-1>Input = 
0:</font></font></b></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><b><font face="Arial"><font size=-1>Input = 
1:</font></font></b></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>00</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>00</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>11</font></font></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>01</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>11</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>00</font></font></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>10</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>10</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>01</font></font></center>
+</td>
+</tr>
+
+<tr>
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>11</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>01</font></font></center>
+</td>
+
+<td VALIGN=TOP WIDTH="33%">
+<center><font face="Arial"><font size=-1>10</font></font></center>
+</td>
+</tr>
+</table></center>
+
+<br>&nbsp;
+<p>You should now see that with these two tables, you can completely describe
+the behavior of the example rate 1/2, K = 3 convolutional encoder. Note
+that both of these tables have 2<sup>(K - 1)</sup> rows, and 2<sup>k</sup>
+columns, where K is the constraint length and k is the number of bits input
+to the encoder for each cycle. These two tables will come in handy when
+we start discussing the Viterbi decoder algorithm.
+<p><a NAME="mapping"></a><b><i><font face="Arial">Mapping the Channel Symbols
+to Signal Levels</font></i></b>
+<p>Mapping the one/zero output of the convolutional encoder onto an antipodal
+baseband signaling scheme is simply a matter of translating zeroes to +1s
+and ones to -1s. This can be accomplished by performing the operation y
+= 1 - 2x on each convolutional encoder output symbol.
+<p><a NAME="addnoise"></a><b><i><font face="Arial">Adding Noise to the
+Transmitted Symbols</font></i></b>
+<p>Adding noise to the transmitted channel symbols produced by the 
convolutional
+encoder involves generating Gaussian random numbers, scaling the numbers
+according to the desired energy per symbol to noise density ratio, 
E<sub>s</sub>/N<sub>0</sub>,
+and adding the scaled Gaussian random numbers to the channel symbol values.
+<p>For the uncoded channel, E<sub>s</sub>/N<sub>0 </sub>= 
E<sub>b</sub>/N<sub>0</sub>,
+since there is one channel symbol per bit.&nbsp; However, for the coded
+channel, E<sub>s</sub>/N<sub>0 </sub>= E<sub>b</sub>/N<sub>0</sub> + 
10log<sub>10</sub>(k/n).&nbsp;
+For example, for rate 1/2 coding, E<sub>s</sub>/N<sub>0 </sub>= 
E<sub>b</sub>/N<sub>0</sub>
++ 10log<sub>10</sub>(1/2) = E<sub>b</sub>/N<sub>0</sub> - 3.01 dB.&nbsp;
+Similarly, for rate 2/3 coding, E<sub>s</sub>/N<sub>0 </sub>= 
E<sub>b</sub>/N<sub>0</sub>
++ 10log<sub>10</sub>(2/3) = E<sub>b</sub>/N<sub>0</sub> - 1.76 dB.
+<p>The Gaussian random number generator is the only interesting part of
+this task. C only provides a uniform random number generator, <tt>rand()</tt>.
+In order to obtain Gaussian random numbers, we take advantage of relationships
+between uniform, Rayleigh, and Gaussian distributions:
+<p>Given a uniform random variable U, a Rayleigh random variable R can
+be obtained by:
+<p><img SRC="figs/eqn01.gif" ALT="equation for Rayleigh random deviate given 
uniform random deviate" height=30 width=297 align=ABSCENTER>
+<p>where&nbsp;<img SRC="figs/eqn02.gif" height=24 width=24 align=ABSCENTER>is
+the variance of the Rayleigh random variable, and given R and a second
+uniform random variable V, two Gaussian random variables G and H can be
+obtained by
+<p><i>G</i> = <i>R</i> cos <i>U</i> and <i>H</i> = <i>R</i> sin <i>V</i>.
+<p>In the AWGN channel, the signal is corrupted by additive noise, n(t),
+which has the power spectrum <i>No</i>/2 watts/Hz. The variance&nbsp;<img 
SRC="figs/eqn02.gif" ALT="variance" height=24 width=24 align=ABSBOTTOM>of
+this noise is equal to&nbsp;<img SRC="figs/eqn03.gif" ALT="noise density div 
by two" height=22 width=38 align=TEXTTOP>.
+If we set the energy per symbol <i>E<sub>s</sub></i> equal to 1, 
then&nbsp;<img SRC="figs/eqn04.gif" ALT="equation relating variance to SNR" 
height=28 width=110 align=ABSBOTTOM>.
+So&nbsp;<img SRC="figs/eqn05.gif" ALT="equation for AWGN st dev given SNR" 
height=28 width=139 align=ABSCENTER>.
+<p><a NAME="quantizing"></a><b><i><font face="Arial">Quantizing the Received
+Channel Symbols</font></i></b>
+<p>An ideal Viterbi decoder would work with infinite precision, or at least
+with floating-point numbers. In practical systems, we quantize the received
+channel symbols with one or a few bits of precision in order to reduce
+the complexity of the Viterbi decoder, not to mention the circuits that
+precede it. If the received channel symbols are quantized to one-bit precision
+(&lt; 0V = 1, <u>></u> 0V = 0), the result is called hard-decision data.
+If the received channel symbols are quantized with more than one bit of
+precision, the result is called soft-decision data. A Viterbi decoder with
+soft decision data inputs quantized to three or four bits of precision
+can perform about 2 dB better than one working with hard-decision inputs.
+The usual quantization precision is three bits. More bits provide little
+additional improvement.
+<p>The selection of the quantizing levels is an important design decision
+because it can have a significant effect on the performance of the link.
+The following is a very brief explanation of one way to set those levels.
+Let's assume our received signal levels in the absence of noise are -1V
+= 1, +1V = 0. With noise, our received signal has mean +/- 1 and standard
+deviation&nbsp;<img SRC="figs/eqn05.gif" ALT="equation for AWGN st dev given 
SNR" height=28 width=139 align=ABSCENTER>.
+Let's use a uniform, three-bit quantizer having the input/output relationship
+shown in the figure below, where D is a decision level that we will calculate
+shortly:
+<center>
+<p><img SRC="figs/quantize.gif" ALT="8-level quantizer function plot" 
height=342 width=384></center>
+
+<p>The decision level, D, can be calculated according to the formula&nbsp;<img 
SRC="figs/eqn06.gif" ALT="equation for quantizer decision level" height=28 
width=228 align=ABSCENTER>,
+where E<sub>s</sub>/N<sub>0</sub> is the energy per symbol to noise density
+ratio<i>. (The above figure was redrawn from Figure 2 of Advanced Hardware
+Architecture's ANRS07-0795, "Soft Decision Thresholds and Effects on Viterbi
+Performance". See the </i><a href="fecbiblio.html">bibliography</a><i>&nbsp;
+for a link to their web pages.)</i>
+<p>Click <a href="algrthms2.html">here</a> to proceed to the description
+of the Viterbi decoding algorithm itself...
+<p>Or click on one of the links below to go to the beginning of that section:
+<p>&nbsp;<a href="tutorial.html">Introduction</a>
+<br>&nbsp;<a href="algrthms2.html">Description of the Algorithms&nbsp;
+(Part 2)</a>
+<br>&nbsp;<a href="examples.html">Simulation Source Code Examples</a>
+<br>&nbsp;<a href="simrslts.html">Example Simulation Results</a>
+<br>&nbsp;<a href="fecbiblio.html">Bibliography</a>
+<br>&nbsp;<a href="tutorial.html#specapps">About Spectrum Applications...</a>
+<br>&nbsp;
+<br>&nbsp;
+<br>
+<br>
+<center>
+<p><img SRC="figs/stripe.gif" height=6 width=600></center>
+
+</body>
+</html>
diff --git a/test/etags/html-src/index.shtml b/test/etags/html-src/index.shtml
new file mode 100644
index 0000000..24f269f
--- /dev/null
+++ b/test/etags/html-src/index.shtml
@@ -0,0 +1,70 @@
+<!--#set var="chiavi" value="
+     prima pagina principale, home page, assoli,
+     free software, open source, italia, italy, italiano" -->
+<!--#include virtual="/inc/h.shtml"-->
+<!--#include virtual="/inc/menu-generico.html"-->
+<!--#include virtual="/inc/content-begin.html"-->
+
+<H3>&nbsp;</H3>        <!-- un po' di spazio in cima -->
+
+<!--
+     La rubrica "in evidenza" va commentata se non c'� niente di serio
+     da mettere in evidenza
+ -->
+<H2>
+  In evidenza
+</H2>
+
+<ul>
+
+  <li>Assieme alla <A HREF="http://www.linux.it/";>Italian Linux
+  Society</A> sollecitiamo una <A
+  HREF="/misc/raccoltafirme.shtml">raccolta di firme</A> per
+  sostenere il <a href="/altri/cortiana.shtml">disegno di legge</a> sul
+  software libero dal titolo "<i>Norme in materia di pluralismo
+  informatico sulla adozione e la diffusione del software libero e sulla
+  portabilit� dei documenti informatici nella Pubblica
+  Amministrazione</i>" (XIV Legislatura Atto Senato n. 1188).<P>
+
+</ul>
+
+<H2>
+  Comunicati e iniziative
+</H2>
+
+<ul>
+
+  <p></p><li>
+    Combattiamo il "bollino SIAE".  Nel <A HREF="/news/">notiziario</A>
+    tutte le nostre iniziative in proposito.  Insieme al <a
+    href="http://www.lugroma.org";>LUG Roma</a> abbiamo scritto il <A
+    HREF="/bollino/">Bollino-HOWTO</A>, istruzioni passo passo su come
+    ottenere l'esenzione dal bollilno SIAE per la distribuzione di
+    software libero a titolo oneroso o gratuito.  <A
+    HREF="/altri/semenzato-pieroni.shtml">Qui</A> il disegno di legge
+    Semenzato Pieroni sul diritto d'autore.  E non � finita.
+
+  <p></p><li>
+    <a href="/altri/adeos.shtml">Salutiamo</a> l'arrivo di ADEOS, kernel
+    real-time per Linux libero da brevetti
+
+  <p></p><li>
+    <a href="/news/news020315_01.shtml">Comunicato</a> stampa di FSF Europa
+    ed Assoli in appoggio al disegno di legge per l'uso del software libero
+    nella pubblica amministrazione
+
+  <p></p><li>
+    <a href="/docs/pirateria.shtml">Posizione dell'Associazione</a> sulle
+    attuali campagna anti-"pirateria"</a>
+
+</ul>
+
+<H2>
+  Ultime notizie dall'associazione
+</H2>
+<P>
+<!--#include virtual="/news/notizie.shtml"-->
+</P>
+
+<!--#include virtual="inc/content-end.html"-->
+<!--#include virtual="inc/f.shtml"-->
diff --git a/test/etags/html-src/software.html 
b/test/etags/html-src/software.html
new file mode 100644
index 0000000..4d174c6
--- /dev/null
+++ b/test/etags/html-src/software.html
@@ -0,0 +1,241 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" 
"http://www.w3.org/TR/REC-html40";>
+<HTML LANG="en">
+<HEAD>
+  <STYLE TYPE="text/css"><!--
+    BODY { font-size: 12pt; }
+    P    { text-indent: 0; text-align: justify }
+    DD   { text-indent: 0; text-align: justify }
+  --></STYLE>
+  <TITLE>Francesco Potort� Software Page</TITLE>
+  <LINK  REV="made" HREF="mailto:address@hidden";>
+  <META NAME="description" CONTENT="Home page of Francesco Potort�.">
+  <META NAME="keywords"
+        CONTENT="Potorti Potort� Potorti' Potorti`
+                satellites MTG fracas simulator LEO MEO GEO
+                GNU emacs etags checkiso debian-bug">
+  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
+</HEAD><BODY>
+
+<CENTER>
+    [<A HREFLANG="en" HREF="/home.html">home</A>]
+    | [<A HREFLANG="en" HREF="/foda/foda.html">FODA/IBEA</A>]
+    | [<A HREFLANG="en" HREF="/galileo/index.html">GaliLEO</A>]
+    | [<A HREFLANG="en" HREF="#fracas">fracas</A>]
+    | [<A HREFLANG="en" HREF="#leasqr">leasqr</A>]<BR>
+    [<A HREFLANG="en" HREF="#etags">etags</A>]
+    | [<A HREFLANG="en" HREF="#checkiso">checkiso</A>]
+    | [<A HREFLANG="en" HREF="#cgrep">cgrep</A>]
+    | [<A HREFLANG="en" HREF="#debian-bug">debian-bug</A>]
+</CENTER>
+
+<HR> <!---------------------------------------------------------------->
+
+<H4 ID="simulation">
+    <IMG SRC="/pictures/cnr-4.png" ALIGN="right"
+         ALT="CNR logo (png 3k)">
+    Software that I wrote for supporting my research activity
+</H4>
+
+
+<H5 ID="mtg">
+  MTG
+</H5>
+
+<P> The <A
+    
HREF="/curriculum/pot-abstracts.html#R05:MTG-RealTimeSystems97"><CITE>M</CITE>ulti-Application
+    <cite>t</CITE>raffic <cite>g</CITE>enerator</A> was written in 1990 to run 
on
+    a proprietary Motorola Delta SysV Unix running on 68030.  It is a
+    programmable packet traffic generator for Ethernet with a
+    <CITE>curses</CITE>-based frontend and a backend that I wrote.  MTG was
+    used to develop, test and evaluate the <A 
HREF="/foda/foda.html">FODA/IBEA</A>
+    satellite access protocol.
+
+<P> The backend of MTG
+    was a Unix device driver which took control of the timer and Lance
+    interrupts, after having programmed them at the unmaskable level.  Since I
+    had no access to the kernel sources, after having studied <CITE>Writing a
+    Unix device driver</CITE> by Egan Teixeira I had to get really well
+    acquainted with the Motorola C compiler and then to disassemble a couple of
+    kernel routines.  For anyone interested in historical programming, <A
+    HREF="ftp://fly.cnuce.cnr.it/pub/software/unix/mtg.tgz";
+    TYPE="application/octet-stream">here</A> is the code.
+
+
+<H5 ID="fracas">
+  Fracas
+</H5>
+
+<P> The <A
+    
HREF="/curriculum/pot-abstracts.html#R12:Fracas-TelCommSystems99"><CITE>Fra</CITE>med
+    <CITE>C</CITE>hannel <CITE>A</CITE>ccess <CITE>S</CITE>imulator</A> was
+    written around 1995 to study MAC protocols to access a geostationary
+    satellite channel.  It is a little more general than that, though, and can
+    be used to simulate any framed multiple access scheme.  It is a very fast,
+    extensible, non-user friendly C program that has been used for several
+    protocol studies:
+    <UL>
+    <LI> <A 
HREF="/curriculum/pot-abstracts.html#R03:FODAIBEAvsDistributed-IJSC96">
+         <i>Comparison between distributed and centralised demand
+        assignment TDMA satellite access schemes</i></A>
+
+    <LI><A HREF="/curriculum/pot-abstracts.html#R07:FODAIBEAvsCFRA-IJSC97">
+        <i>Delay analysis for interlan traffic using two suitable TDMA
+       satellite access schemes</i></A>
+
+    <LI><A HREF="/curriculum/pot-abstracts.html#R17:VnL-IJSC00">
+        <i>A multi-level satellite channel allocation algorithm for
+       real-time VBR data</i></A>
+    </UL>
+
+<P> Everyone is welcome to download the <A
+    HREF="ftp://fly.cnuce.cnr.it/pub/software/C/fracas.tgz";
+    TYPE="application/octet-stream">complete sources</A> and a <A
+    HREF="ftp://fly.cnuce.cnr.it/pub/software/C/fracas-man-0.0.pdf";
+    TYPE="application/pdf">draft manual</A>.  There is also a short <A
+    
HREF="ftp://fly.cnuce.cnr.it/pub/data/docs/Fracas-slides.pdf";>presentation</A>
+    (10 slides, 340KB).  I will be happy to assist those who would like to
+    adapt Fracas to their purposes.
+
+
+<H5 ID="galileo">
+  GaliLEO
+</H5>
+
+<P> A simulator for Low Earth Orbit satellite constellations that I contributed
+    to design and implement in Java. This is work in progress, of which I made
+    a short <A
+    
HREF="ftp://fly.cnuce.cnr.it/pub/data/docs/GaliLEO-slides.pdf";>presentation</A>
+    (10 slides, 500KB).  GaliLEO has <A HREF="http://galileo.tesa.prd.fr/";>its
+    own page</A> and a <A HREF="/galileo/index.html">local mirror</A>.
+
+
+
+<H5 ID="leasqr">
+  Leasqr
+</H5>
+
+<P> This is a package for <A HREF="http://www.octave.org/";>Octave</A>, a
+high-level language which uses a language very similar to that of Matlab.
+Leasqr uses the Levenberg-Marquardt algorithm for doing nonlinear regression.
+I found leasqr on the web, but it did not run on Octave (it was made for
+Matlab) and so I adapted it and <A
+HREF="ftp://fly.cnuce.cnr.it/pub/software/octave/leasqr/";>published</A> it.
+Since then, the original authors Richard I. Shrager, A.Jutan, Ray Muzic, and
+Sean Brennan agreed to put it under the <A
+HREF="http://www.gnu.org/licenses/gpl.html";>GPL</A>.  Matthias Jueschke tested
+the program using a non-linear optimisation <A
+HREF="http://www.itl.nist.gov/div898/strd/nls/nls_main.shtml";>test suite</A>,
+and was satisfied with the results.
+
+<P>The most current version of the leasqr is part of the optimization package
+at <a href="http://octave.sf.net";>octave-forge</a>. You should refer to the
+files leasqr.m, leasqrdemo.m and dfdp.m <a
+href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/octave/octave-forge/main/optim/";>therein</a>.
+The names of the individual files may change in the future.  Please let me know
+if that happens so I can update this page.
+
+<HR> <!---------------------------------------------------------------->
+
+<H4 ID="gnu">
+    <IMG SRC="/pictures/gnu-head-3.png" ALIGN="right"
+         ALT="small GNU Head (png 3k)">
+    Free software that I wrote for the GNU project or for my personal or work
+    interest
+</H4>
+
+
+<H5 ID="etags">
+  Etags
+</H5>
+
+<P> On behalf of the <A HREF="http://www.gnu.org/fsf/fsf.html";>Free
+    Software Foundation (FSF)</A> I currently volunteer to maintain
+    <CITE>etags</CITE>, a program that can be compiled either as a replacement
+    of the classic <CITE>ctags</CITE> Unix program or as <CITE>etags</CITE>,
+    whose output file format is used by Emacs.  The latest (unofficial) version
+    of etags is available for <A HREF="ftp://fly.cnuce.cnr.it/pub/etags.c.gz";
+    TYPE="application/octet-stream">download</A> (30&nbsp;KB).
+
+
+<H5 ID="checkiso">
+  checkiso
+</H5>
+
+<P> A Unix <A HREF="ftp://fly.cnuce.cnr.it/pub/software/unix/checkiso";
+    TYPE="application/octet-stream">shell script</A> for checking a CD against
+    the iso image from which it has been burned.  The comparison is made using
+    an MD5 signature built from the original image or from a known good CD.
+    Shows the location of the first read error detected.  Can extract a disk Id
+    from the image or the CD itself and build a local database of Ids for
+    future checking of archived CDs.  The Id contains the image length, the MD5
+    signature and the Volume ID of the disk, so it can automatically recognise
+    the CD to check.  Contains a small internal database of <A
+    HREF="http://www.debian.org/";>Debian</A> <A
+    HREF="http://cdimage.debian.org/";>CD images</A>.
+
+
+<H5 ID="cgrep">
+  cgrep
+</H5>
+
+<P> A Unix <A HREF="ftp://fly.cnuce.cnr.it/pub/software/unix/cgrep";
+    TYPE="application/octet-stream">shell script</A> that wraps around grep to
+    make it understand files compressed with gzip or bzip2.  You just use it
+    like grep.  If you rename it cegrep or cfgrep it will wrap around egrep or
+    fgrep, respectively.  Instead of renaming it, you can use a symbolic or
+    hard link.
+
+
+<H5 ID="debian-bug">
+  debian-bug.el
+</H5>
+
+<P> An Emacs add-on script in emacs lisp which simplifies
+    the task of submitting a bug report to the <A
+    HREF="http://www.debian.org/Bugs/";>Debian bug tracking system</A>.  Part of
+    the <A
+    
HREF="http://packages.debian.org/testing/utils/debbugs-el.html";>debbugs-el</A>
+    Debian package.  I handed the package over to Peter Galbraith, who is
+    maintaining it much more actively than I was.  You can download its <A
+    HREF="http://people.debian.org/~psg/debian-bug.el";
+    TYPE="application/octet-stream">latest version</A>.
+
+
+<H5 ID="tcpdump">
+  tcpdump
+</H5>
+
+<P> A Unix <A HREF="ftp://fly.cnuce.cnr.it/pub/software/unix/pottcpdump-1.3";
+    TYPE="application/octet-stream">shell wrapper</A> around
+    <CITE>tcpdump</CITE> which optionally displays the contents of the packets.
+
+
+<HR> <!---------------------------------------------------------------->
+
+<H4 ID="links">
+    Links to interesting software
+</H4>
+
+
+<DL>
+ <DT>The Error Correcting Codes (ECC) Page
+  <DD><A
+  HREF="http://www.csl.sony.co.jp/person/morelos/ecc/codes.html";>This</A> is a
+  really good list of free (in various senses) programs for coding and
+  decoding.  I keep a <A HREF="codes.html">mirror</A> of this page.
+
+ <DT>Forward error correcting codes by Phil Karn
+  <DD>Phil Karn's optimised really <A HREF="http://www.ka9q.net/code/fec/";>free
+  codes</A>.
+
+</DL>
+
+</BODY>
+
+<!--
+Local variables:
+fill-column: 79
+end:
+-->
+
+</HTML>
diff --git a/test/etags/html-src/softwarelibero.html 
b/test/etags/html-src/softwarelibero.html
new file mode 100644
index 0000000..7aa74c5
--- /dev/null
+++ b/test/etags/html-src/softwarelibero.html
@@ -0,0 +1,313 @@
+<DIV LANG="it" ALIGN="justify">
+
+<H2>
+  Cos'� il software libero?
+</H2>
+
+<P>
+  Il concetto di software libero discende naturalmente da quello di
+  libert� di scambio di idee e di informazioni.  Negli ambienti
+  scientifici, quest'ultimo principio � tenuto in alta considerazione
+  per la fecondit� che ha dimostrato; ad esso infatti � generalmente
+  attribuita molta parte dell'eccezionale ed imprevedibile crescita del
+  sapere negli ultimi tre secoli.
+</P>
+<P>
+  La libert� di scambio di idee non � tuttavia una questione puramente
+  pratica: essa � anche alla base dei concetti di libert� di pensiero e
+  di espressione.  Analogamente alle idee, il software � immateriale, e
+  pu� essere riprodotto e trasmesso facilmente.  In modo simile a quanto
+  avviene per le idee, parte essenziale del processo che sostiene la
+  crescita e l'evoluzione del software � la sua libera diffusione.  Ed
+  ogni giorno di pi�, come le idee, il software permea il tessuto
+  sociale e lo influenza, produce effetti etici, economici, politici e
+  in un senso pi� generale culturali.
+</P>
+<P>
+  Fu Richard M. Stallman, nei primi anni Ottanta, a formalizzare per la
+  prima volta il concetto di software libero.  La <A TITLE="definizione
+  di software libero secondo FSF"
+  href="http://www.it.gnu.org/philosophy/free-sw.it.html";>definizione</A>
+  di Stallman, che da subito assurse al ruolo di definizione per
+  eccellenza di software libero, assume la forma di quattro principi di
+  libert�:
+</P>
+<P>
+<DL>
+  <DT>Libert� 0, o libert� fondamentale:
+    <DD>La libert� di eseguire il programma per qualunque scopo, senza
+    vincoli sul suo utilizzo.
+
+  <DT>Libert� 1:
+    <DD>La libert� di studiare il funzionamento del programma, e
+    di adattarlo alle proprie esigenze.
+
+  <DT>Libert� 2:
+    <DD>La libert� di redistribuire copie del programma.
+
+  <DT>Libert� 3:
+    <DD>La libert� di migliorare il programma, e di distribuirne
+    i miglioramenti.
+</DL>
+</P>
+<P>
+  Il software distribuito con una licenza che rispetti questi principi �
+  detto <Q><EM>software libero</EM></Q> (in inglese <Q><EM>free
+  software</EM></Q>).  Nel 1984 Richard M. Stallman <A TITLE="storia
+  del progetto GNU"
+  HREF="http://www.it.gnu.org/gnu/thegnuproject.it.html";>diede vita al
+  progetto GNU</A>, con lo scopo di tradurre in pratica il concetto di
+  software libero, e cre� la <Q>Free Software Foundation</Q> per
+  dare supporto logistico, legale ed economico al progetto GNU.
+</P>
+
+<H3><A NAME="licenze">
+  Licenze d'uso di un programma
+</A></H3>
+
+<P>
+  La <EM>licenza d'uso</EM> � un documento legale generalmente
+  distribuito assieme a ogni programma. Essa, appoggiandosi alle norme
+  sul diritto d'autore, specifica diritti e doveri di chi riceve tale
+  programma.
+</P>
+<P>
+  Gran parte delle licenze comunemente usate sono <EM>proprietarie</EM>,
+  cio� non libere, in quanto non garantiscono le quattro libert�. Quasi
+  sempre tali licenze non consentono infatti la libera copia del
+  programma, n� la sua modifica.  Spesso, se il programma � installato
+  sul computer di casa, la licenza impedisce persino di installarlo sul
+  proprio portatile (per utilizzare il programma fuori casa); se il
+  programma � utilizzato in uno studio professionale, non consente di
+  tenerlo installato su un computer di riserva, nel caso che quello
+  principale si guasti.
+</P>
+<P>
+  La licenza del progetto GNU, la <EM>Licenza Pubblica Generica GNU (<A
+  TITLE="traduzione della licenza GNU GPL"
+  HREF="http://softwarelibero.it/gnudoc/gpl.it.txt";>GNU GPL</A>)</EM>,
+  al contrario, concede all'utente del programma tutte e quattro le
+  libert� suddette.  Inoltre si occupa anche di proteggerle: chi
+  modifichi un programma protetto da GPL e lo distribuisca con tali
+  modifiche, deve distribuirlo sotto licenza GPL.  � grazie a questo
+  tipo di protezione che la GPL � attualmente la licenza pi� usata per
+  il software libero.
+</P>
+<P>
+  Con un gioco di parole, il nome dato a questo tipo di protezione
+  � <EM>permesso d'autore</EM> (in inglese <A TITLE="definizione di
+  copyleft (inglese)" LANG="en"
+  HREF="http://www.it.gnu.org/copyleft/copyleft.html";><EM>copyleft</EM></A>):
+  � il criterio che prevede che le modifiche ad un programma possano
+  essere distribuite solo con la stessa licenza del programma originale.
+  Le licenze proprietarie usano le norme sul diritto d'autore (copyright
+  in inglese) per togliere libert� agli utenti di un programma; il
+  permesso d'autore usa le stesse norme per garantire quelle libert� e
+  per proteggerle.
+</P>
+<P>
+  La GNU GPL non � unica nel suo genere.  Diverse <A TITLE="lista di
+  licenze libere e non"
+  HREF="http://www.it.gnu.org/licenses/license-list.it.html";>altre
+  licenze</A> garantiscono le quattro libert� e si possono pertanto
+  qualificare come licenze per il software libero.  Fra queste, merita
+  una speciale menzione per la sua diffusione la <A TITLE="la licenza
+  BSD (in inglese)" LANG="en"
+  HREF="http://www.freebsd.org/copyright/license.html";>licenza BSD</A>,
+  la cui principale differenza dalla GPL � che, non essendo basata sul
+  permesso d'autore, non ha fra i propri obiettivi quello di proteggere
+  la libert� del software cui � applicata.  Chi infatti modifichi un
+  programma protetto da BSD, pu� distribuirlo con le modifiche usando
+  qualunque licenza.
+</P>
+<P>
+  Sia BSD che GPL hanno pro e contro.  La licenza GPL riflette l'idea
+  della cooperazione: se io concedo ad altri la libert� di modificare e
+  redistribuire il mio programma, costoro sono tenuti a concedere le
+  stesse libert� sulle loro modifiche.  Il problema � che alcuni vedono
+  questo vincolo come un'imposizione ingenerosa, se non addirittura una
+  restrizione insopportabile.  La licenza BSD riflette l'idea del dono
+  liberale: chiunque pu� fare ci� che meglio crede del mio programma.
+  Il problema � che questo significa che chiunque pu� redistribuire
+  anche in forma chiusa con una licenza proprietaria un programma BSD
+  modificato, impedendo cos� ai propri acquirenti di modificarlo e
+  redistribuirlo a loro volta.
+</P>
+
+<H3><A NAME="miti">
+  Sfatiamo alcuni miti
+</A></H3>
+
+<P>
+<DL>
+
+  <DT>Il software libero � gratuito
+
+    <DD>� falso: la libert� del software non ha nulla a che vedere con
+    il suo prezzo.  Bench� gran parte del software libero pi� diffuso
+    sia distribuito gratuitamente, ci sono programmatori che vivono
+    della vendita e della manutenzione dei programmi liberi da loro
+    creati.
+
+  <DT>Il software gratuito � libero
+
+    <DD>� falso.  Molti programmi proprietari vengono distribuiti
+    gratuitamente.
+
+  <DT>Il software libero � privo di copyright
+
+    <DD>� falso.  Bench� si possa rinunciare al copyright su un proprio
+    programma e renderlo cos� di pubblico dominio, la gran parte del
+    software libero � distribuito con una licenza.  Per esempio, sono
+    licenze di copyright la licenza BSD e la GNU GPL, anche se per
+    qualificare quest'ultima spesso si parla di permesso d'autore
+    (copyleft).
+
+  <DT>L'introduzione del software libero nella scuola e nella pubblica
+  amministrazione, ma anche nei paesi poveri, ridurrebbe i costi
+  relativi al software
+
+    <DD>Potrebbe essere vero, ma una seria valutazione dei costi � molto
+    difficile.  Qualunque tipo di software, se usato in ambito non
+    domestico, ha dei costi di manutenzione che sono solitamente
+    maggiori del suo prezzo di acquisto.  I motivi per sostenere l'uso
+    del software libero, specie in ambiti pubblici, riguardano anzitutto
+    la libert�, non il prezzo.
+
+<!-- Discorso inadatto ad un documento introduttivo
+  <DT>Chi scrive un programma libero lo deve pubblicare su Internet
+
+    <DD>� una falsa argomentazione spesso usata per scoraggiare
+    un'azienda dall'uso di una licenza libera per i suoi programmi.
+    Sia gli autori che gli acquirenti di un programma libero hanno il
+    diritto di distribuirlo a titolo oneroso o gratuito, ma non hanno
+    alcun obbligo in tal senso.
+-->
+
+</DL>
+</P>
+
+<H3><A NAME="oss">
+  Il movimento open source
+</A></H3>
+
+<P>
+  Nel 1998 Bruce Perens, Eric Raymond e altre personalit� nel campo del
+  software libero si convinsero che i principi di libert� associati ad
+  esso fossero malvisti nel mondo degli affari, a causa della loro
+  carica ideologica.  Decisero perci� di evitare accuratamente ogni
+  riferimento a considerazioni politiche o di principio, e di lanciare
+  una campagna di promozione del software libero che ne mettesse in luce
+  i numerosi <A TITLE="un discorso di Robert Chassell di FSF"
+  HREF="http://softwarelibero.it/altri/economia-sl.shtml";>vantaggi
+  pratici</A>, come la facilit� di adattamento, l'affidabilit�, la
+  sicurezza, la conformit� agli standard, l'indipendenza dai singoli
+  fornitori.  A tal fine scrissero la <Q><A TITLE="la definizione di
+  Open Source (in inglese)" LANG="en"
+  HREF="http://www.opensource.org/docs/definition.html";>Open Source
+  Definition</A></Q>, il documento fondamentale del movimento <A
+  TITLE="il sito di Open Source Initiative (OSI), in inglese" LANG="en"
+  HREF="http://opensource.org/";><EM>open source</EM></A>.
+</P>
+<P>
+  Il movimento open source fu un successo, e contribu� a sdoganare il
+  concetto di software libero in campo aziendale, dove era guardato con
+  sospetto o condiscendenza.  Un esempio di questo successo �
+  l'atteggiamento dell'IBM, l'azienda che ha fatto di gran lunga i
+  maggiori investimenti nel campo del software libero, la quale parla
+  esclusivamente di open source, mai di software libero.
+</P>
+<P>
+  La voluta neutralit� del movimento open source verso gli aspetti
+  etici e politici del software libero � la caratteristica sostanziale
+  che lo distingue dalla filosofia del software libero, che al contrario
+  pone l'accento sulle motivazioni ideali.  Parlare di software libero
+  piuttosto che di open source � una questione politica piuttosto che
+  pratica; i due movimenti concordano infatti sulle licenze considerate
+  accettabili, ed hanno obiettivi e mezzi comuni.
+</P>
+
+<H3><A NAME="impatto">
+  Impatto pratico del software libero
+</A></H3>
+
+<P>
+  La <A TITLE="usi commerciali del software libero, di Alessandro
+  Rubini"
+  
HREF="http://www.it.gnu.org/philosophy/software-libre-commercial-viability.it.html";>rilevanza
+  economica</A> del software libero � ancora molto ridotta, ma � in
+  fortissima crescita ormai da alcuni anni, e tutto consente di supporre
+  che tale crescita <A TITLE="prospettive del software libero, gruppo di
+  studio dell'UE"
+  HREF="http://eu.conecta.it/paper/Economics_open_source.html";>continui
+  nel prossimo futuro</A>, anche grazie ai <A TITLE="vantaggi del
+  software libero, gruppo di studio UE"
+  HREF="http://eu.conecta.it/paper/Advantages_open_source_soft.html";>vantaggi
+  tecnici ed economici</A> del software libero.
+</P>
+<P>
+  Ad oggi, il software libero � ampiamente diffuso in ambito accademico,
+  industriale e fra gli appassionati di calcolatori, soprattutto grazie
+  ai sistemi GNU/Linux.  Questi sistemi liberi sono disponibili a costi
+  molto bassi, ben inferiori a quelli di analoghi sistemi proprietari.
+  Tuttavia, a causa delle loro caratteristiche, il loro uso richiede una
+  buona cultura di base nel campo del software.
+</P>
+<P>
+  In ambito accademico viene molto apprezzata la possibilit� di
+  personalizzare ogni parte del sistema, visto che i programmi liberi
+  sono liberamente modificabili (libert� numero uno).  In ambito
+  industriale, si apprezza l'affidabilit� dei sistemi liberi, dovuta al
+  fatto che quando un utente corregge un errore in un programma
+  solitamente rende disponibile la correzione agli altri utenti (libert�
+  numero tre).  Gli appassionati di calcolatori apprezzano lo spirito di
+  condivisione esistente fra gli utenti di software libero.
+</P>
+<P>
+  Ma le implicazioni dell'uso del software libero non sono soltanto
+  tecniche ed economiche, perch� il software da tempo ormai � avviato ad
+  occupare un ruolo di primo piano nella nostra vita quotidiana, ed �
+  destinato a cambiare in maniera profonda la societ�.
+</P>
+<P>
+  � per queste ragioni che la nostra libert� futura dipender� anche
+  dalla capacit� di ognuno di noi di controllare il software.  � per
+  queste ragioni che ai tradizionali principi di libert� sessuale, di
+  culto, di movimento, di espressione deve essere affiancata la libert�
+  del software.  � per queste ragioni che la nostra libert� futura
+  dipender� anche dall'uso di software libero.
+</P>
+
+<P>
+  <EM>scritto da <A TITLE="address@hidden"
+  HREF="mailto:address@hidden";>Francesco Potort�</A> per l'<A
+  TITLE="il sito dell'Associazione Software Libero"
+  HREF="http://softwarelibero.it/";>Associazione Software
+  Libero</A></EM>
+</P>
+<HR NOSHADE>
+<P>
+  Copyright &copy; 2002 Francesco Potort�
+  <BR>
+  Ultima versione ipertestuale disponibile su <A TITLE="versione
+  stampabile"
+  
HREF="http://softwarelibero.it/documentazione/softwarelibero.html";>&lt;http://softwarelibero.it/documentazione/softwarelibero.html></A>
+</P>
+<P>
+  La copia letterale e integrale e la distribuzione sono permesse con
+  qualsiasi mezzo, a condizione che questa nota sia riprodotta.
+</P>
+
+<!--
+Local variables:
+fill-column: 72
+time-stamp-active: t
+time-stamp-time-zone: "GMT"
+time-stamp-format: "%:y-%02m-%02d"
+time-stamp-line-limit: 30
+time-stamp-start: "ultima\\s-+modifica\\s-+�\\s-+del\\s-+"
+time-stamp-end: "\\."
+End:
+-->
+
+</DIV>
diff --git a/test/etags/java-src/AWTEMul.java b/test/etags/java-src/AWTEMul.java
new file mode 100644
index 0000000..c66f16e
--- /dev/null
+++ b/test/etags/java-src/AWTEMul.java
@@ -0,0 +1,658 @@
+/*
+ * @(#)AWTEventMulticaster.java        1.10 97/01/23
+ * 
+ * Copyright (c) 1996 Sun Microsystems, Inc. All Rights Reserved.
+ * 
+ * This software is the confidential and proprietary information of Sun
+ * Microsystems, Inc. ("Confidential Information").  You shall not
+ * disclose such Confidential Information and shall use it only in
+ * accordance with the terms of the license agreement you entered into
+ * with Sun.
+ * 
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ * 
+ * CopyrightVersion 1.1_beta
+ * 
+ */
+package java.awt;
+
+import java.awt.event.*;
+import java.util.EventListener;
+import java.io.Serializable;
+import java.io.ObjectOutputStream;
+import java.io.IOException;
+
+
+/**
+ * A class which implements efficient multi-cast event dispatching
+ * for the AWT events defined in the java.awt.event package.  This
+ * class will manage the structure of a chain of event listeners
+ * and dispatch events to those listeners.
+ *
+ * An example of how this class could be used to implement a new
+ * component which fires "action" events:
+ *
+ * <pre><code>
+ * public myComponent extends Component {
+ *     ActionListener actionListener = null;
+ *
+ *     public void addActionListener(ActionListener l) {
+ *        actionListener = AWTEventMulticaster.add(actionListener, l);
+ *     }
+ *     public void removeActionListener(ActionListener l) {
+ *        actionListener = AWTEventMulticaster.remove(actionListener, l);
+ *     }
+ *     public void processEvent(AWTEvent e) {
+ *         // when event occurs which causes "action" semantic
+ *         if (actionListener != null) {
+ *             actionListener.actionPerformed(new ActionEvent());
+ *         }         
+ * }
+ * </code></pre>
+ *
+ * @version    1.10, 23 Jan 1997
+ * @author      John Rose
+ * @author     Amy Fowler
+ */
+
+public class AWTEventMulticaster implements 
+    ComponentListener, ContainerListener, FocusListener, KeyListener,
+    MouseListener, MouseMotionListener, WindowListener,
+    ActionListener, ItemListener, AdjustmentListener,
+    TextListener {
+
+    protected EventListener a, b;
+
+    /**
+     * Creates an event multicaster instance which chains listener-a
+     * with listener-b.
+     * @param a listener-a
+     * @param b listener-b
+     */ 
+    protected AWTEventMulticaster(EventListener a, EventListener b) {
+       this.a = a; this.b = b;
+    }
+
+    /**
+     * Removes a listener from this multicaster and returns the
+     * resulting multicast listener.
+     * @param oldl the listener to be removed
+     */
+    protected EventListener remove(EventListener oldl) {
+       if (oldl == a)  return b;
+       if (oldl == b)  return a;
+       EventListener a2 = removeInternal(a, oldl);
+       EventListener b2 = removeInternal(b, oldl);
+       if (a2 == a && b2 == b) {
+           return this;        // it's not here
+       }
+       return addInternal(a2, b2);
+    }
+
+    /**
+     * Handles the componentResized event by invoking the
+     * componentResized methods on listener-a and listener-b.
+     * @param e the component event
+     */
+    public void componentResized(ComponentEvent e) {
+        ((ComponentListener)a).componentResized(e);
+        ((ComponentListener)b).componentResized(e);
+    }
+
+    /**
+     * Handles the componentMoved event by invoking the
+     * componentMoved methods on listener-a and listener-b.
+     * @param e the component event
+     */
+    public void componentMoved(ComponentEvent e) {
+        ((ComponentListener)a).componentMoved(e);
+        ((ComponentListener)b).componentMoved(e);
+    }
+
+    /**
+     * Handles the componentShown event by invoking the
+     * componentShown methods on listener-a and listener-b.
+     * @param e the component event
+     */
+    public void componentShown(ComponentEvent e) {
+        ((ComponentListener)a).componentShown(e);
+        ((ComponentListener)b).componentShown(e);
+    }
+
+    /**
+     * Handles the componentHidden event by invoking the
+     * componentHidden methods on listener-a and listener-b.
+     * @param e the component event
+     */
+    public void componentHidden(ComponentEvent e) {
+        ((ComponentListener)a).componentHidden(e);
+        ((ComponentListener)b).componentHidden(e);
+    }
+
+    /**
+     * Handles the componentAdded container event by invoking the
+     * componentAdded methods on listener-a and listener-b.
+     * @param e the component event
+     */
+    public void componentAdded(ContainerEvent e) {
+        ((ContainerListener)a).componentAdded(e);
+        ((ContainerListener)b).componentAdded(e);
+    }
+
+    /**
+     * Handles the componentRemoved container event by invoking the
+     * componentRemoved methods on listener-a and listener-b.
+     * @param e the component event
+     */
+    public void componentRemoved(ContainerEvent e) {
+        ((ContainerListener)a).componentRemoved(e);
+        ((ContainerListener)b).componentRemoved(e);
+    }
+
+    /**
+     * Handles the focusGained event by invoking the
+     * focusGained methods on listener-a and listener-b.
+     * @param e the focus event
+     */
+    public void focusGained(FocusEvent e) {
+        ((FocusListener)a).focusGained(e);
+        ((FocusListener)b).focusGained(e);
+    }
+
+    /**
+     * Handles the focusLost event by invoking the
+     * focusLost methods on listener-a and listener-b.
+     * @param e the focus event
+     */
+    public void focusLost(FocusEvent e) {
+        ((FocusListener)a).focusLost(e);
+        ((FocusListener)b).focusLost(e);
+    }
+
+    /**
+     * Handles the keyTyped event by invoking the
+     * keyTyped methods on listener-a and listener-b.
+     * @param e the key event
+     */
+    public void keyTyped(KeyEvent e) {
+        ((KeyListener)a).keyTyped(e);
+        ((KeyListener)b).keyTyped(e);
+    }
+
+    /**
+     * Handles the keyPressed event by invoking the
+     * keyPressed methods on listener-a and listener-b.
+     * @param e the key event
+     */
+    public void keyPressed(KeyEvent e) {
+        ((KeyListener)a).keyPressed(e);
+        ((KeyListener)b).keyPressed(e);
+    }
+
+    /**
+     * Handles the keyReleased event by invoking the
+     * keyReleased methods on listener-a and listener-b.
+     * @param e the key event
+     */
+    public void keyReleased(KeyEvent e) {
+        ((KeyListener)a).keyReleased(e);
+        ((KeyListener)b).keyReleased(e);
+    }
+
+    /**
+     * Handles the mouseClicked event by invoking the
+     * mouseClicked methods on listener-a and listener-b.
+     * @param e the mouse event
+     */
+    public void mouseClicked(MouseEvent e) {
+        ((MouseListener)a).mouseClicked(e);
+        ((MouseListener)b).mouseClicked(e);
+    }
+
+    /**
+     * Handles the mousePressed event by invoking the
+     * mousePressed methods on listener-a and listener-b.
+     * @param e the mouse event
+     */
+    public void mousePressed(MouseEvent e) {
+        ((MouseListener)a).mousePressed(e);
+        ((MouseListener)b).mousePressed(e);
+    }
+
+    /**
+     * Handles the mouseReleased event by invoking the
+     * mouseReleased methods on listener-a and listener-b.
+     * @param e the mouse event
+     */
+    public void mouseReleased(MouseEvent e) {
+        ((MouseListener)a).mouseReleased(e);
+        ((MouseListener)b).mouseReleased(e);
+    }
+
+    /**
+     * Handles the mouseEntered event by invoking the
+     * mouseEntered methods on listener-a and listener-b.
+     * @param e the mouse event
+     */
+    public void mouseEntered(MouseEvent e) {
+        ((MouseListener)a).mouseEntered(e);
+        ((MouseListener)b).mouseEntered(e);
+    }
+
+    /**
+     * Handles the mouseExited event by invoking the
+     * mouseExited methods on listener-a and listener-b.
+     * @param e the mouse event
+     */
+    public void mouseExited(MouseEvent e) {
+        ((MouseListener)a).mouseExited(e);
+        ((MouseListener)b).mouseExited(e);
+    }
+
+    /**
+     * Handles the mouseDragged event by invoking the
+     * mouseDragged methods on listener-a and listener-b.
+     * @param e the mouse event
+     */
+    public void mouseDragged(MouseEvent e) {
+        ((MouseMotionListener)a).mouseDragged(e);
+        ((MouseMotionListener)b).mouseDragged(e);
+    }
+
+    /**
+     * Handles the mouseMoved event by invoking the
+     * mouseMoved methods on listener-a and listener-b.
+     * @param e the mouse event
+     */
+    public void mouseMoved(MouseEvent e) {
+        ((MouseMotionListener)a).mouseMoved(e);
+        ((MouseMotionListener)b).mouseMoved(e);
+    }
+
+    /**
+     * Handles the windowOpened event by invoking the
+     * windowOpened methods on listener-a and listener-b.
+     * @param e the window event
+     */
+    public void windowOpened(WindowEvent e) {
+        ((WindowListener)a).windowOpened(e);
+        ((WindowListener)b).windowOpened(e);
+    }
+
+    /**
+     * Handles the windowClosing event by invoking the
+     * windowClosing methods on listener-a and listener-b.
+     * @param e the window event
+     */
+    public void windowClosing(WindowEvent e) {
+        ((WindowListener)a).windowClosing(e);
+        ((WindowListener)b).windowClosing(e);
+    }
+
+    /**
+     * Handles the windowClosed event by invoking the
+     * windowClosed methods on listener-a and listener-b.
+     * @param e the window event
+     */
+    public void windowClosed(WindowEvent e) {
+        ((WindowListener)a).windowClosed(e);
+        ((WindowListener)b).windowClosed(e);
+    }
+
+    /**
+     * Handles the windowIconified event by invoking the
+     * windowIconified methods on listener-a and listener-b.
+     * @param e the window event
+     */
+    public void windowIconified(WindowEvent e) {
+        ((WindowListener)a).windowIconified(e);
+        ((WindowListener)b).windowIconified(e);
+    }
+
+    /**
+     * Handles the windowDeiconfied event by invoking the
+     * windowDeiconified methods on listener-a and listener-b.
+     * @param e the window event
+     */
+    public void windowDeiconified(WindowEvent e) {
+        ((WindowListener)a).windowDeiconified(e);
+        ((WindowListener)b).windowDeiconified(e);
+    }
+
+    /**
+     * Handles the windowActivated event by invoking the
+     * windowActivated methods on listener-a and listener-b.
+     * @param e the window event
+     */
+    public void windowActivated(WindowEvent e) {
+        ((WindowListener)a).windowActivated(e);
+        ((WindowListener)b).windowActivated(e);
+    }
+
+    /**
+     * Handles the windowDeactivated event by invoking the
+     * windowDeactivated methods on listener-a and listener-b.
+     * @param e the window event
+     */
+    public void windowDeactivated(WindowEvent e) {
+        ((WindowListener)a).windowDeactivated(e);
+        ((WindowListener)b).windowDeactivated(e);
+    }
+
+    /**
+     * Handles the actionPerformed event by invoking the
+     * actionPerformed methods on listener-a and listener-b.
+     * @param e the action event
+     */
+    public void actionPerformed(ActionEvent e) {
+        ((ActionListener)a).actionPerformed(e);
+        ((ActionListener)b).actionPerformed(e);
+    }
+
+    /**
+     * Handles the itemStateChanged event by invoking the
+     * itemStateChanged methods on listener-a and listener-b.
+     * @param e the item event
+     */
+    public void itemStateChanged(ItemEvent e) {
+        ((ItemListener)a).itemStateChanged(e);
+        ((ItemListener)b).itemStateChanged(e);
+    }
+
+    /**
+     * Handles the adjustmentValueChanged event by invoking the
+     * adjustmentValueChanged methods on listener-a and listener-b.
+     * @param e the adjustment event
+     */
+    public void adjustmentValueChanged(AdjustmentEvent e) {
+        ((AdjustmentListener)a).adjustmentValueChanged(e);
+        ((AdjustmentListener)b).adjustmentValueChanged(e);
+    }
+    public void textValueChanged(TextEvent e) {
+        ((TextListener)a).textValueChanged(e);
+        ((TextListener)b).textValueChanged(e);
+    }
+
+    /**
+     * Adds component-listener-a with component-listener-b and
+     * returns the resulting multicast listener.
+     * @param a component-listener-a
+     * @param b component-listener-b
+     */
+    public static ComponentListener add(ComponentListener a, ComponentListener 
b) {
+        return (ComponentListener)addInternal(a, b);
+    }
+
+    /**
+     * Adds container-listener-a with container-listener-b and
+     * returns the resulting multicast listener.
+     * @param a container-listener-a
+     * @param b container-listener-b
+     */
+    public static ContainerListener add(ContainerListener a, ContainerListener 
b) {
+        return (ContainerListener)addInternal(a, b);
+    }
+
+    /**
+     * Adds focus-listener-a with focus-listener-b and
+     * returns the resulting multicast listener.
+     * @param a focus-listener-a
+     * @param b focus-listener-b
+     */
+    public static FocusListener add(FocusListener a, FocusListener b) {
+        return (FocusListener)addInternal(a, b);
+    }
+
+    /**
+     * Adds key-listener-a with key-listener-b and
+     * returns the resulting multicast listener.
+     * @param a key-listener-a
+     * @param b key-listener-b
+     */
+    public static KeyListener add(KeyListener a, KeyListener b) {
+        return (KeyListener)addInternal(a, b);
+    }
+
+    /**
+     * Adds mouse-listener-a with mouse-listener-b and
+     * returns the resulting multicast listener.
+     * @param a mouse-listener-a
+     * @param b mouse-listener-b
+     */
+    public static MouseListener add(MouseListener a, MouseListener b) {
+        return (MouseListener)addInternal(a, b);
+    }
+
+    /**
+     * Adds mouse-motion-listener-a with mouse-motion-listener-b and
+     * returns the resulting multicast listener.
+     * @param a mouse-motion-listener-a
+     * @param b mouse-motion-listener-b
+     */
+    public static MouseMotionListener add(MouseMotionListener a, 
MouseMotionListener b) {
+        return (MouseMotionListener)addInternal(a, b);
+    }
+
+    /**
+     * Adds window-listener-a with window-listener-b and
+     * returns the resulting multicast listener.
+     * @param a window-listener-a
+     * @param b window-listener-b
+     */
+    public static WindowListener add(WindowListener a, WindowListener b) {
+        return (WindowListener)addInternal(a, b);
+    }
+
+    /**
+     * Adds action-listener-a with action-listener-b and
+     * returns the resulting multicast listener.
+     * @param a action-listener-a
+     * @param b action-listener-b
+     */
+    public static ActionListener add(ActionListener a, ActionListener b) {
+        return (ActionListener)addInternal(a, b);
+    }
+
+    /**
+     * Adds item-listener-a with item-listener-b and
+     * returns the resulting multicast listener.
+     * @param a item-listener-a
+     * @param b item-listener-b
+     */
+    public static ItemListener add(ItemListener a, ItemListener b) {
+        return (ItemListener)addInternal(a, b);
+    }
+
+    /**
+     * Adds adjustment-listener-a with adjustment-listener-b and
+     * returns the resulting multicast listener.
+     * @param a adjustment-listener-a
+     * @param b adjustment-listener-b
+     */
+    public static AdjustmentListener add(AdjustmentListener a, 
AdjustmentListener b) {
+        return (AdjustmentListener)addInternal(a, b);
+    }
+    public static TextListener add(TextListener a, TextListener b) {
+        return (TextListener)addInternal(a, b);
+    }
+
+    /**
+     * Removes the old component-listener from component-listener-l and
+     * returns the resulting multicast listener.
+     * @param l component-listener-l
+     * @param oldl the component-listener being removed
+     */
+    public static ComponentListener remove(ComponentListener l, 
ComponentListener oldl) {
+       return (ComponentListener) removeInternal(l, oldl);
+    }
+
+    /**
+     * Removes the old container-listener from container-listener-l and
+     * returns the resulting multicast listener.
+     * @param l container-listener-l
+     * @param oldl the container-listener being removed
+     */
+    public static ContainerListener remove(ContainerListener l, 
ContainerListener oldl) {
+       return (ContainerListener) removeInternal(l, oldl);
+    }
+
+    /**
+     * Removes the old focus-listener from focus-listener-l and
+     * returns the resulting multicast listener.
+     * @param l focus-listener-l
+     * @param oldl the focus-listener being removed
+     */
+    public static FocusListener remove(FocusListener l, FocusListener oldl) {
+       return (FocusListener) removeInternal(l, oldl);
+    }
+
+    /**
+     * Removes the old key-listener from key-listener-l and
+     * returns the resulting multicast listener.
+     * @param l key-listener-l
+     * @param oldl the key-listener being removed
+     */
+    public static KeyListener remove(KeyListener l, KeyListener oldl) {
+       return (KeyListener) removeInternal(l, oldl);
+    }
+
+    /**
+     * Removes the old mouse-listener from mouse-listener-l and
+     * returns the resulting multicast listener.
+     * @param l mouse-listener-l
+     * @param oldl the mouse-listener being removed
+     */
+    public static MouseListener remove(MouseListener l, MouseListener oldl) {
+       return (MouseListener) removeInternal(l, oldl);
+    }
+
+    /**
+     * Removes the old mouse-motion-listener from mouse-motion-listener-l 
+     * and returns the resulting multicast listener.
+     * @param l mouse-motion-listener-l
+     * @param oldl the mouse-motion-listener being removed
+     */
+    public static MouseMotionListener remove(MouseMotionListener l, 
MouseMotionListener oldl) {
+       return (MouseMotionListener) removeInternal(l, oldl);
+    }
+
+    /**
+     * Removes the old window-listener from window-listener-l and
+     * returns the resulting multicast listener.
+     * @param l window-listener-l
+     * @param oldl the window-listener being removed
+     */
+    public static WindowListener remove(WindowListener l, WindowListener oldl) 
{
+       return (WindowListener) removeInternal(l, oldl);
+    }
+
+    /**
+     * Removes the old action-listener from action-listener-l and
+     * returns the resulting multicast listener.
+     * @param l action-listener-l
+     * @param oldl the action-listener being removed
+     */
+    public static ActionListener remove(ActionListener l, ActionListener oldl) 
{
+       return (ActionListener) removeInternal(l, oldl);
+    }
+
+    /**
+     * Removes the old item-listener from item-listener-l and
+     * returns the resulting multicast listener.
+     * @param l item-listener-l
+     * @param oldl the item-listener being removed
+     */
+    public static ItemListener remove(ItemListener l, ItemListener oldl) {
+       return (ItemListener) removeInternal(l, oldl);
+    }
+
+    /**
+     * Removes the old adjustment-listener from adjustment-listener-l and
+     * returns the resulting multicast listener.
+     * @param l adjustment-listener-l
+     * @param oldl the adjustment-listener being removed
+     */
+    public static AdjustmentListener remove(AdjustmentListener l, 
AdjustmentListener oldl) {
+       return (AdjustmentListener) removeInternal(l, oldl);
+    }
+    public static TextListener remove(TextListener l, TextListener oldl) {
+       return (TextListener) removeInternal(l, oldl);
+    }
+
+    /** 
+     * Returns the resulting multicast listener from adding listener-a
+     * and listener-b together.  
+     * If listener-a is null, it returns listener-b;  
+     * If listener-b is null, it returns listener-a
+     * If neither are null, then it creates and returns
+     * a new AWTEventMulticaster instance which chains a with b.
+     * @param a event listener-a
+     * @param b event listener-b
+     */
+    protected static EventListener addInternal(EventListener a, EventListener 
b) {
+       if (a == null)  return b;
+       if (b == null)  return a;
+       return new AWTEventMulticaster(a, b);
+    }
+
+    /** 
+     * Returns the resulting multicast listener after removing the
+     * old listener from listener-l.
+     * If listener-l equals the old listener OR listener-l is null, 
+     * returns null.
+     * Else if listener-l is an instance of AWTEventMulticaster, 
+     * then it removes the old listener from it.
+     * Else, returns listener l.
+     * @param l the listener being removed from
+     * @param oldl the listener being removed
+     */
+    protected static EventListener removeInternal(EventListener l, 
EventListener oldl) {
+       if (l == oldl || l == null) {
+           return null;
+       } else if (l instanceof AWTEventMulticaster) {
+           return ((AWTEventMulticaster)l).remove(oldl);
+       } else {
+           return l;           // it's not here
+       }
+    }
+      
+
+    /* Serialization support.  
+     */
+
+    protected void saveInternal(ObjectOutputStream s, String k) throws 
IOException {
+        if (a instanceof AWTEventMulticaster) {
+           ((AWTEventMulticaster)a).saveInternal(s, k);
+        }
+        else if (a instanceof Serializable) {
+            s.writeObject(k);
+            s.writeObject(a);
+        }
+        
+        if (b instanceof AWTEventMulticaster) {
+           ((AWTEventMulticaster)b).saveInternal(s, k);
+        }
+        else if (b instanceof Serializable) {
+            s.writeObject(k);
+            s.writeObject(b);
+        }
+    }
+
+    static void save(ObjectOutputStream s, String k, EventListener l) throws 
IOException {
+      if (l == null) {
+          return;
+      } 
+      else if (l instanceof AWTEventMulticaster) {
+          ((AWTEventMulticaster)l).saveInternal(s, k);
+      }
+      else if (l instanceof Serializable) {
+           s.writeObject(k);
+           s.writeObject(l);
+      }
+    }
+}
diff --git a/test/etags/java-src/KeyEve.java b/test/etags/java-src/KeyEve.java
new file mode 100644
index 0000000..dc07fb2
--- /dev/null
+++ b/test/etags/java-src/KeyEve.java
@@ -0,0 +1,440 @@
+/*
+ * @(#)KeyEvent.java   1.20 97/01/30
+ * 
+ * Copyright (c) 1995, 1996 Sun Microsystems, Inc. All Rights Reserved.
+ * 
+ * This software is the confidential and proprietary information of Sun
+ * Microsystems, Inc. ("Confidential Information").  You shall not
+ * disclose such Confidential Information and shall use it only in
+ * accordance with the terms of the license agreement you entered into
+ * with Sun.
+ * 
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ * 
+ * CopyrightVersion 1.1_beta
+ * 
+ */
+
+package java.awt.event;
+
+import java.awt.Event;
+import java.awt.Component;
+import java.awt.Toolkit;
+
+/**
+ * The component-level keyboard event.
+ *
+ * @version 1.20 30 Jan 1997
+ * @author Carl Quinn
+ * @author Amy Fowler
+ */
+public class KeyEvent extends InputEvent {
+
+    /**
+     * Marks the first integer id for the range of key event ids.
+     */
+    public static final int KEY_FIRST = 400;
+
+    /**
+     * Marks the last integer id for the range of key event ids.
+     */
+    public static final int KEY_LAST  = 402;
+
+    /**
+     * The key typed event type.  This type is generated by a combination
+     * of a key press followed by a key release.
+     */
+    public static final int KEY_TYPED = KEY_FIRST;
+
+    /**
+     * The key pressed event type.
+     */
+    public static final int KEY_PRESSED = 1 + KEY_FIRST; //Event.KEY_PRESS
+
+    /**
+     * The key released event type.
+     */
+    public static final int KEY_RELEASED = 2 + KEY_FIRST; //Event.KEY_RELEASE
+
+    /**
+     * Virtual key codes.  These codes report which keyboard key has
+     * been pressed, rather than any character generated by one or more
+     * keys being pressed.  
+     *
+     * For example, pressing the Shift key will cause a KEY_PRESSED event 
+     * with a VK_SHIFT keyCode, while pressing the 'a' key will result in 
+     * a VK_A keyCode.  After the 'a' key is released, a KEY_RELEASED event 
+     * will be fired with VK_A, followed by a KEY_TYPED event with a keyChar 
+     * value of 'A'.  Key combinations which do not result in characters,
+     * such as action keys like F1, will not generate KEY_TYPED events.
+     *
+     * Note: not all keyboards or systems are capable of generating all
+     * virtual key codes.  No attempt is made in Java to artificially
+     * generate these keys.
+     *
+     * WARNING:  aside from those keys where are defined by the Java language
+     * (VK_ENTER, VK_BACK_SPACE, and VK_TAB), do not rely on the values of 
these
+     * constants.  Sun reserves the right to change these values as needed
+     * to accomodate a wider range of keyboards in the future.  
+     */
+    public static final int VK_ENTER          = '\n';
+    public static final int VK_BACK_SPACE     = '\b';
+    public static final int VK_TAB            = '\t';
+    public static final int VK_CANCEL         = 0x03;
+    public static final int VK_CLEAR          = 0x0C;
+    public static final int VK_SHIFT          = 0x10;
+    public static final int VK_CONTROL        = 0x11;
+    public static final int VK_ALT            = 0x12;
+    public static final int VK_PAUSE          = 0x13;
+    public static final int VK_CAPS_LOCK      = 0x14;
+    public static final int VK_ESCAPE         = 0x1B;
+    public static final int VK_SPACE          = 0x20;
+    public static final int VK_PAGE_UP        = 0x21;
+    public static final int VK_PAGE_DOWN      = 0x22;
+    public static final int VK_END            = 0x23;
+    public static final int VK_HOME           = 0x24;
+    public static final int VK_LEFT           = 0x25;
+    public static final int VK_UP             = 0x26;
+    public static final int VK_RIGHT          = 0x27;
+    public static final int VK_DOWN           = 0x28;
+    public static final int VK_COMMA          = 0x2C;
+    public static final int VK_PERIOD         = 0x2E;
+    public static final int VK_SLASH          = 0x2F;
+
+    /** VK_0 thru VK_9 are the same as ASCII '0' thru '9' (0x30 - 0x39) */
+    public static final int VK_0              = 0x30;
+    public static final int VK_1              = 0x31;
+    public static final int VK_2              = 0x32;
+    public static final int VK_3              = 0x33;
+    public static final int VK_4              = 0x34;
+    public static final int VK_5              = 0x35;
+    public static final int VK_6              = 0x36;
+    public static final int VK_7              = 0x37;
+    public static final int VK_8              = 0x38;
+    public static final int VK_9              = 0x39;
+
+    public static final int VK_SEMICOLON      = 0x3B;
+    public static final int VK_EQUALS         = 0x3D;
+
+    /** VK_A thru VK_Z are the same as ASCII 'A' thru 'Z' (0x41 - 0x5A) */
+    public static final int VK_A              = 0x41;
+    public static final int VK_B              = 0x42;
+    public static final int VK_C              = 0x43;
+    public static final int VK_D              = 0x44;
+    public static final int VK_E              = 0x45;
+    public static final int VK_F              = 0x46;
+    public static final int VK_G              = 0x47;
+    public static final int VK_H              = 0x48;
+    public static final int VK_I              = 0x49;
+    public static final int VK_J              = 0x4A;
+    public static final int VK_K              = 0x4B;
+    public static final int VK_L              = 0x4C;
+    public static final int VK_M              = 0x4D;
+    public static final int VK_N              = 0x4E;
+    public static final int VK_O              = 0x4F;
+    public static final int VK_P              = 0x50;
+    public static final int VK_Q              = 0x51;
+    public static final int VK_R              = 0x52;
+    public static final int VK_S              = 0x53;
+    public static final int VK_T              = 0x54;
+    public static final int VK_U              = 0x55;
+    public static final int VK_V              = 0x56;
+    public static final int VK_W              = 0x57;
+    public static final int VK_X              = 0x58;
+    public static final int VK_Y              = 0x59;
+    public static final int VK_Z              = 0x5A;
+
+    public static final int VK_OPEN_BRACKET   = 0x5B;
+    public static final int VK_BACK_SLASH     = 0x5C;
+    public static final int VK_CLOSE_BRACKET  = 0x5D;
+
+    public static final int VK_NUMPAD0        = 0x60;
+    public static final int VK_NUMPAD1        = 0x61;
+    public static final int VK_NUMPAD2        = 0x62;
+    public static final int VK_NUMPAD3        = 0x63;
+    public static final int VK_NUMPAD4        = 0x64;
+    public static final int VK_NUMPAD5        = 0x65;
+    public static final int VK_NUMPAD6        = 0x66;
+    public static final int VK_NUMPAD7        = 0x67;
+    public static final int VK_NUMPAD8        = 0x68;
+    public static final int VK_NUMPAD9        = 0x69;
+    public static final int VK_MULTIPLY       = 0x6A;
+    public static final int VK_ADD            = 0x6B;
+    public static final int VK_SEPARATER      = 0x6C;
+    public static final int VK_SUBTRACT       = 0x6D;
+    public static final int VK_DECIMAL        = 0x6E;
+    public static final int VK_DIVIDE         = 0x6F;
+    public static final int VK_F1             = 0x70;
+    public static final int VK_F2             = 0x71;
+    public static final int VK_F3             = 0x72;
+    public static final int VK_F4             = 0x73;
+    public static final int VK_F5             = 0x74;
+    public static final int VK_F6             = 0x75;
+    public static final int VK_F7             = 0x76;
+    public static final int VK_F8             = 0x77;
+    public static final int VK_F9             = 0x78;
+    public static final int VK_F10            = 0x79;
+    public static final int VK_F11            = 0x7A;
+    public static final int VK_F12            = 0x7B;
+    public static final int VK_DELETE         = 0x7F; /* ASCII DEL */
+    public static final int VK_NUM_LOCK       = 0x90;
+    public static final int VK_SCROLL_LOCK    = 0x91;
+
+    public static final int VK_PRINTSCREEN    = 0x9A;
+    public static final int VK_INSERT         = 0x9B;
+    public static final int VK_HELP           = 0x9C;
+    public static final int VK_META           = 0x9D;
+
+    public static final int VK_BACK_QUOTE     = 0xC0;
+    public static final int VK_QUOTE          = 0xDE;
+
+    /** for Asian Keyboard */
+    public static final int VK_FINAL          = 0x18;
+    public static final int VK_CONVERT        = 0x1C;
+    public static final int VK_NONCONVERT     = 0x1D;
+    public static final int VK_ACCEPT         = 0x1E;
+    public static final int VK_MODECHANGE     = 0x1F;
+    public static final int VK_KANA           = 0x15;
+    public static final int VK_KANJI          = 0x19;
+    
+    /**
+     * KEY_TYPED events do not have a defined keyCode.
+     */
+    public static final int VK_UNDEFINED      = 0x0;
+
+    /**
+     * KEY_PRESSED and KEY_RELEASED events which do not map to a
+     * valid Unicode character do not have a defined keyChar.
+     */
+    public static final char CHAR_UNDEFINED   = 0x0;
+
+    int  keyCode;
+    char keyChar;
+
+    /*
+     * JDK 1.1 serialVersionUID 
+     */
+     private static final long serialVersionUID = -2352130953028126954L;
+
+    /**
+     * Constructs a KeyEvent object with the specified source component,
+     * type, modifiers, and key.
+     * @param source the object where the event originated
+     * @id the event type
+     * @when the time the event occurred
+     * @modifiers the modifier keys down during event
+     * @keyCode the integer code representing the key of the event 
+     * @keyChar the Unicode character generated by this event, or NUL
+     */
+    public KeyEvent(Component source, int id, long when, int modifiers,
+                    int keyCode, char keyChar) {
+        super(source, id, when, modifiers);
+
+        if (id == KEY_TYPED && keyChar == CHAR_UNDEFINED) {
+            throw new IllegalArgumentException("invalid keyChar");
+        }
+        if (id == KEY_TYPED && keyCode != VK_UNDEFINED) {
+            throw new IllegalArgumentException("invalid keyCode");
+        }
+
+        this.keyCode = keyCode;
+        this.keyChar = keyChar;
+    }
+
+    /*
+     * @deprecated, as of JDK1.1 - Do NOT USE; will be removed in 1.1.1.
+     */
+    public KeyEvent(Component source, int id, long when, int modifiers,
+                    int keyCode) {
+        this(source, id, when, modifiers, keyCode, (char)keyCode);
+    }
+
+    /**
+     * Returns the integer key-code associated with the key in this event.
+     * For KEY_TYPED events, keyCode is VK_UNDEFINED.
+     */
+    public int getKeyCode() {
+        return keyCode;
+    }
+
+    public void setKeyCode(int keyCode) {
+        this.keyCode = keyCode;
+    }
+
+    public void setKeyChar(char keyChar) {
+        this.keyChar = keyChar;
+    }
+
+    public void setModifiers(int modifiers) {
+        this.modifiers = modifiers;
+    }
+
+    /**
+     * Returns the character associated with the key in this event.
+     * If no valid Unicode character exists for this key event, keyChar
+     * is CHAR_UNDEFINED.
+     */
+    public char getKeyChar() {
+        return keyChar;
+    }
+
+    /**
+     * Returns a String describing the keyCode, such as "HOME", "F1" or "A".
+     * These strings can be localized by changing the awt.properties file.
+     */
+    public static String getKeyText(int keyCode) {
+        if (keyCode >= VK_0 && keyCode <= VK_9 || 
+            keyCode >= VK_A && keyCode <= VK_Z) {
+            return String.valueOf((char)keyCode);
+        }
+
+        // Check for other ASCII keyCodes.
+        int index = ",./;=[\\]".indexOf(keyCode);
+        if (index >= 0) {
+            return String.valueOf((char)keyCode);
+        }
+       
+        switch(keyCode) {
+          case VK_ENTER: return Toolkit.getProperty("AWT.enter", "Enter");
+          case VK_BACK_SPACE: return Toolkit.getProperty("AWT.backSpace", 
"Backspace");
+          case VK_TAB: return Toolkit.getProperty("AWT.tab", "Tab");
+          case VK_CANCEL: return Toolkit.getProperty("AWT.cancel", "Cancel");
+          case VK_CLEAR: return Toolkit.getProperty("AWT.clear", "Clear");
+          case VK_SHIFT: return Toolkit.getProperty("AWT.shift", "Shift");
+          case VK_CONTROL: return Toolkit.getProperty("AWT.control", 
"Control");
+          case VK_ALT: return Toolkit.getProperty("AWT.alt", "Alt");
+          case VK_PAUSE: return Toolkit.getProperty("AWT.pause", "Pause");
+          case VK_CAPS_LOCK: return Toolkit.getProperty("AWT.capsLock", "Caps 
Lock");
+          case VK_ESCAPE: return Toolkit.getProperty("AWT.escape", "Escape");
+          case VK_SPACE: return Toolkit.getProperty("AWT.space", "Space");
+          case VK_PAGE_UP: return Toolkit.getProperty("AWT.pgup", "Page Up");
+          case VK_PAGE_DOWN: return Toolkit.getProperty("AWT.pgdn", "Page 
Down");
+          case VK_END: return Toolkit.getProperty("AWT.end", "End");
+          case VK_HOME: return Toolkit.getProperty("AWT.home", "Home");
+          case VK_LEFT: return Toolkit.getProperty("AWT.left", "Left");
+          case VK_UP: return Toolkit.getProperty("AWT.up", "Up");
+          case VK_RIGHT: return Toolkit.getProperty("AWT.right", "Right");
+          case VK_DOWN: return Toolkit.getProperty("AWT.down", "Down");
+
+          case VK_MULTIPLY: return Toolkit.getProperty("AWT.multiply", "NumPad 
*");
+          case VK_ADD: return Toolkit.getProperty("AWT.add", "NumPad +");
+          case VK_SEPARATER: return Toolkit.getProperty("AWT.separater", 
"NumPad ,");
+          case VK_SUBTRACT: return Toolkit.getProperty("AWT.subtract", "NumPad 
-");
+          case VK_DECIMAL: return Toolkit.getProperty("AWT.decimal", "NumPad 
.");
+          case VK_DIVIDE: return Toolkit.getProperty("AWT.divide", "NumPad /");
+
+          case VK_F1: return Toolkit.getProperty("AWT.f1", "F1");
+          case VK_F2: return Toolkit.getProperty("AWT.f2", "F2");
+          case VK_F3: return Toolkit.getProperty("AWT.f3", "F3");
+          case VK_F4: return Toolkit.getProperty("AWT.f4", "F4");
+          case VK_F5: return Toolkit.getProperty("AWT.f5", "F5");
+          case VK_F6: return Toolkit.getProperty("AWT.f6", "F6");
+          case VK_F7: return Toolkit.getProperty("AWT.f7", "F7");
+          case VK_F8: return Toolkit.getProperty("AWT.f8", "F8");
+          case VK_F9: return Toolkit.getProperty("AWT.f9", "F9");
+          case VK_F10: return Toolkit.getProperty("AWT.f10", "F10");
+          case VK_F11: return Toolkit.getProperty("AWT.f11", "F11");
+          case VK_F12: return Toolkit.getProperty("AWT.f12", "F12");
+          case VK_DELETE: return Toolkit.getProperty("AWT.delete", "Delete");
+          case VK_NUM_LOCK: return Toolkit.getProperty("AWT.numLock", "Num 
Lock");
+          case VK_SCROLL_LOCK: return Toolkit.getProperty("AWT.scrollLock", 
"Scroll Lock");
+          case VK_PRINTSCREEN: return Toolkit.getProperty("AWT.printScreen", 
"Print Screen");
+          case VK_INSERT: return Toolkit.getProperty("AWT.insert", "Insert");
+          case VK_HELP: return Toolkit.getProperty("AWT.help", "Help");
+          case VK_META: return Toolkit.getProperty("AWT.meta", "Meta");
+          case VK_BACK_QUOTE: return Toolkit.getProperty("AWT.backQuote", 
"Back Quote");
+          case VK_QUOTE: return Toolkit.getProperty("AWT.quote", "Quote");
+                        
+          case VK_FINAL: return Toolkit.getProperty("AWT.final", "Final");
+          case VK_CONVERT: return Toolkit.getProperty("AWT.convert", 
"Convert");
+          case VK_NONCONVERT: return Toolkit.getProperty("AWT.noconvert", "No 
Convert");
+          case VK_ACCEPT: return Toolkit.getProperty("AWT.accept", "Accept");
+          case VK_MODECHANGE: return Toolkit.getProperty("AWT.modechange", 
"Mode Change");
+          case VK_KANA: return Toolkit.getProperty("AWT.kana", "Kana");
+         case VK_KANJI: return Toolkit.getProperty("AWT.kanji", "Kanji");
+        }
+
+        if (keyCode >= VK_NUMPAD0 && keyCode <= VK_NUMPAD9) {
+            String numpad = Toolkit.getProperty("AWT.numpad", "NumPad");
+           char c = (char)(keyCode - VK_NUMPAD0 + '0');
+            return numpad + "-" + c;
+        }
+
+        String unknown = Toolkit.getProperty("AWT.unknown", "Unknown keyCode");
+        return unknown + ": 0x" + Integer.toString(keyCode, 16);
+    }
+
+    /**
+     * Returns a String describing the modifier key(s), such as "Shift",
+     * or "Ctrl+Shift".  These strings can be localized by changing the 
+     * awt.properties file.
+     */
+    public static String getKeyModifiersText(int modifiers) {
+        StringBuffer buf = new StringBuffer();
+        if ((modifiers & Event.META_MASK) != 0) {
+            buf.append(Toolkit.getProperty("AWT.meta", "Meta"));
+            buf.append("+");
+        }
+        if ((modifiers & Event.CTRL_MASK) != 0) {
+            buf.append(Toolkit.getProperty("AWT.control", "Ctrl"));
+            buf.append("+");
+        }
+        if ((modifiers & Event.META_MASK) != 0) {
+            buf.append(Toolkit.getProperty("AWT.alt", "Alt"));
+            buf.append("+");
+        }
+        if ((modifiers & Event.SHIFT_MASK) != 0) {
+            buf.append(Toolkit.getProperty("AWT.shift", "Shift"));
+            buf.append("+");
+        }
+        if (buf.length() > 0) {
+            buf.setLength(buf.length()-1); // remove trailing '+'
+        }
+        return buf.toString();
+    }
+
+    /** Returns whether or not the key in this event is an "action" key.
+     */
+    public boolean isActionKey() {
+        return (keyChar == CHAR_UNDEFINED);
+    }
+
+    public String paramString() {
+        String typeStr;
+        switch(id) {
+          case KEY_PRESSED:
+              typeStr = "KEY_PRESSED";
+              break;
+          case KEY_RELEASED:
+              typeStr = "KEY_RELEASED";
+              break;
+          case KEY_TYPED:
+              typeStr = "KEY_TYPED";
+              break;
+          default:
+              typeStr = "unknown type";
+        }
+
+        String str = typeStr + ",keyCode=" + keyCode;
+        if (isActionKey() || keyCode == VK_ENTER || keyCode == VK_BACK_SPACE 
|| 
+           keyCode == VK_TAB || keyCode == VK_ESCAPE || keyCode == VK_DELETE ||
+           (keyCode >= VK_NUMPAD0 && keyCode <= VK_NUMPAD9)) {
+            str += "," + getKeyText(keyCode);
+       } else if (keyChar == '\n' || keyChar == '\b' ||
+           keyChar == '\t' || keyChar == VK_ESCAPE || keyChar == VK_DELETE) {
+            str += "," + getKeyText(keyChar);
+        } else {
+            str += ",keyChar='" + keyChar + "'";
+        }
+        if (modifiers > 0) {
+            str += ",modifiers=" + getKeyModifiersText(modifiers);
+        }
+        return str;
+    }
+
+}
diff --git a/test/etags/java-src/SMan.java b/test/etags/java-src/SMan.java
new file mode 100644
index 0000000..ccc9bf1
--- /dev/null
+++ b/test/etags/java-src/SMan.java
@@ -0,0 +1,848 @@
+/*
+ * @(#)SecurityManager.java    1.46 97/01/27
+ * 
+ * Copyright (c) 1995, 1996 Sun Microsystems, Inc. All Rights Reserved.
+ * 
+ * This software is the confidential and proprietary information of Sun
+ * Microsystems, Inc. ("Confidential Information").  You shall not
+ * disclose such Confidential Information and shall use it only in
+ * accordance with the terms of the license agreement you entered into
+ * with Sun.
+ * 
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ * 
+ * CopyrightVersion 1.1_beta
+ * 
+ */
+
+package java.lang;
+
+import java.io.FileDescriptor;
+import java.util.Hashtable;
+import java.net.InetAddress;
+import java.lang.reflect.Member;
+
+/**
+ * The security manager is an abstract class that allows 
+ * applications to implement a security policy. It allows an 
+ * application to determine, before performing a possibly unsafe or 
+ * sensitive operation, what the operation is and whether the 
+ * operation is being performed by a class created via a class loader 
+ * rather than installed locally. Classes loaded via a class loader 
+ * (especially if they have been downloaded over a network) may be 
+ * less trustworthy than classes from files installed locally. The 
+ * application can allow or disallow the operation. 
+ * <p>
+ * The <code>SecurityManager</code> class contains many methods with 
+ * names that begin with the word <code>check</code>. These methods 
+ * are called by various methods in the Java libraries before those 
+ * methods perform certain potentially sensitive operations. The 
+ * invocation of such a check method typically looks like this: 
+ * <p><blockquote><pre>
+ *     SecurityManager security = System.getSecurityManager();
+ *     if (security != null) {
+ *         security.check</code><i>XXX</i><code>(argument, 
&nbsp;.&nbsp;.&nbsp;.&nbsp;);
+ *     }
+ * </pre></blockquote>
+ * <p>
+ * The security manager is thereby given an opportunity to prevent 
+ * completion of the operation by throwing an exception. A security 
+ * manager routine simply returns if the operation is permitted, but 
+ * throws a <code>SecurityException</code> if the operation is not 
+ * permitted. The only exception to this convention is 
+ * <code>checkTopLevelWindow</code>, which returns a 
+ * <code>boolean</code> value. 
+ * <p>
+ * The current security manager is set by the 
+ * <code>setSecurityManager</code> method in class 
+ * <code>System</code>. The current security manager is obtained 
+ * by the <code>getSecurityManager</code> method. 
+ * <p>
+ * The default implementation of each of the 
+ * <code>check</code><i>XXX</i> methods is to assume that the caller 
+ * does <i>not</i> have permission to perform the requested operation. 
+ *
+ * @author  Arthur van Hoff
+ * @version 1.46, 27 Jan 1997
+ * @see     java.lang.ClassLoader
+ * @see     java.lang.SecurityException
+ * @see     java.lang.SecurityManager#checkTopLevelWindow(java.lang.Object)
+ * @see     java.lang.System#getSecurityManager()
+ * @see     java.lang.System#setSecurityManager(java.lang.SecurityManager)
+ * @since   JDK1.0
+ */
+public abstract
+class SecurityManager {
+   /**
+     * This field is <code>true</code> if there is a security check in 
+     * progress; <code>false</code> otherwise. 
+     *
+     * @since   JDK1.0
+     */
+    protected boolean inCheck;
+
+    // Have we been initialized. Effective against finalizer attacks.
+    private boolean initialized = false;
+
+    /** 
+     * Tests if there is a security check in progress.
+     *
+     * @return  the value of the <code>inCheck</code> field. This field should
+     *          contain <code>true</code> if a security check is in progress;
+     *          <code>false</code> otherwise.
+     * @see     java.lang.SecurityManager#inCheck
+     * @since   JDK1.0
+     */
+    public boolean getInCheck() {
+       return inCheck;
+    }
+
+    /**
+     * Constructs a new <code>SecurityManager</code>. An application is 
+     * not allowed to create a new security manager if there is already a 
+     * current security manager. 
+     *
+     * @exception  SecurityException  if a security manager already exists.
+     * @see        java.lang.System#getSecurityManager()
+     * @since      JDK1.0
+     */
+    protected SecurityManager() {
+       // checkCreateSecurityManager(); ? REMIND
+       initialized = true;
+    }
+
+    /**
+     * Returns the current execution stack as an array of classes. 
+     * <p>
+     * The length of the array is the number of methods on the execution 
+     * stack. The element at index <code>0</code> is the class of the 
+     * currently executing method, the element at index <code>1</code> is 
+     * the class of that method's caller, and so on. 
+     *
+     * @return  the execution stack.
+     * @since   JDK1.0
+     */
+    protected native Class[] getClassContext();
+
+    /**
+     * Returns an object describing the most recent class loader executing
+     * on the stack. 
+     *
+     * @return  the class loader of the most recent occurrence on the stack
+     *          of a method from a class defined using a class loader;
+     *          returns <code>null</code> if there is no occurrence on the
+     *          stack of a method from a class defined using a class loader.
+     * @since   JDK1.0
+     */
+    protected native ClassLoader currentClassLoader();
+
+    /**
+     * Returns the current Class with a ClassLoader on the execution stack.
+     *
+     * @since   JDK1.1
+     */
+    protected Class currentLoadedClass() {
+       return currentLoadedClass0();   
+    }
+
+    /**
+     * Returns the stack depth of the specified class. 
+     *
+     * @param   name   the fully qualified name of the class to search for.
+     * @return  the depth on the stack frame of the first occurrence of a
+     *          method from a class with the specified name;
+     *          <code>-1</code> if such a frame cannot be found.
+     * @since   JDK1.0
+     */
+    protected native int classDepth(String name);
+
+    /**
+     * Returns the stack depth of the most recently executing method 
+     * from a class defined using a class loader. 
+     *
+     * @return  the depth on the stack frame of the most recent occurrence of a
+     *          method from a class defined using a class loader; returns
+     *          <code>-1</code> if there is no occurrence of a method from
+     *          a class defined using a class loader.
+     * @since   JDK1.0
+     */
+    protected native int classLoaderDepth();
+
+    /**
+     * Tests if the specified String is in this Class. 
+     *
+     * @param   name   the fully qualified name of the class.
+     * @return  <code>true</code> if a method from a class with the specified
+     *          name is on the execution stack; <code>false</code> otherwise.
+     * @since   JDK1.0
+     */
+    protected boolean inClass(String name) {
+       return classDepth(name) >= 0;
+    }
+
+    /**
+     * Tests if the current ClassLoader is equal to
+     * <code>null</code>.
+     *
+     * @return  <code>true</code> if a method from a class defined using a
+     *          class loader is on the execution stack.
+     * @since   JDK1.0
+     */
+    protected boolean inClassLoader() {
+       return currentClassLoader() != null;
+    }
+
+    /**
+     * Creates an object that encapsulates the current execution 
+     * environment. The result of this method is used by the 
+     * three-argument <code>checkConnect</code> method and by the 
+     * two-argument <code>checkRead</code> method. 
+     * <p>
+     * These methods are needed because a trusted method may be called 
+     * on to read a file or open a socket on behalf of another method. 
+     * The trusted method needs to determine if the other (possibly 
+     * untrusted) method would be allowed to perform the operation on its 
+     * own. 
+     *
+     * @return  an implementation-dependent object that encapsulates
+     *          sufficient information about the current execution environment
+     *          to perform some security checks later.
+     * @see     java.lang.SecurityManager#checkConnect(java.lang.String,
+     *            int, java.lang.Object)
+     * @see     java.lang.SecurityManager#checkRead(java.lang.String,
+     *            java.lang.Object)
+     * @since   JDK1.0
+     */
+    public Object getSecurityContext() {
+       return null;
+    }
+
+    /**
+     * Throws a <code>SecurityException</code> if the 
+     * calling thread is not allowed to create a new class loader. 
+     * <p>
+     * The <code>checkCreateClassLoader</code> method for class 
+     * <code>SecurityManager</code> always throws a 
+     * <code>SecurityException</code>. 
+     *
+     * @exception  SecurityException  if the caller does not have permission
+     *             to create a new class loader.
+     * @see        java.lang.ClassLoader#ClassLoader()
+     * @since      JDK1.0
+     */
+    public void checkCreateClassLoader() {
+       throw new SecurityException();
+    }
+    
+    /**
+     * Throws a <code>SecurityException</code> if the 
+     * calling thread is not allowed to modify the thread argument. 
+     * <p>
+     * This method is invoked for the current security manager by the 
+     * <code>stop</code>, <code>suspend</code>, <code>resume</code>, 
+     * <code>setPriority</code>, <code>setName</code>, and 
+     * <code>setDaemon</code> methods of class <code>Thread</code>. 
+     * <p>
+     * The <code>checkAccess</code> method for class 
+     * <code>SecurityManager</code> always throws a 
+     * <code>SecurityException</code>. 
+     *
+     * @param      g   the thread to be checked.
+
+     * @exception  SecurityException  if the caller does not have permission
+     *               to modify the thread.
+     * @see        java.lang.System#getSecurityManager()
+     * @see        java.lang.Thread#resume()
+     * @see        java.lang.Thread#setDaemon(boolean)
+     * @see        java.lang.Thread#setName(java.lang.String)
+     * @see        java.lang.Thread#setPriority(int)
+     * @see        java.lang.Thread#stop()
+     * @see        java.lang.Thread#suspend()
+     * @since      JDK1.0
+     */
+    public void checkAccess(Thread g) {
+       throw new SecurityException();
+    }
+
+    /**
+     * Throws a <code>SecurityException</code> if the 
+     * calling thread is not allowed to modify the thread group argument. 
+     * <p>
+     * This method is invoked for the current security manager when a 
+     * new child thread or child thread group is created, and by the 
+     * <code>setDaemon</code>, <code>setMaxPriority</code>, 
+     * <code>stop</code>, <code>suspend</code>, <code>resume</code>, and 
+     * <code>destroy</code> methods of class <code>ThreadGroup</code>. 
+     * <p>
+     * The <code>checkAccess</code> method for class 
+     * <code>SecurityManager</code> always throws a 
+     * <code>SecurityException</code>. 
+     *
+     * @param      g   the thread group to be checked.
+     * @exception  SecurityException  if the caller does not have permission
+     *               to modify the thread group.
+     * @see        java.lang.System#getSecurityManager()
+     * @see        java.lang.ThreadGroup#destroy()
+     * @see        java.lang.ThreadGroup#resume()
+     * @see        java.lang.ThreadGroup#setDaemon(boolean)
+     * @see        java.lang.ThreadGroup#setMaxPriority(int)
+     * @see        java.lang.ThreadGroup#stop()
+     * @see        java.lang.ThreadGroup#suspend()
+     * @since      JDK1.0
+     */
+    public void checkAccess(ThreadGroup g) {
+       throw new SecurityException();
+    }
+
+    /**
+     * Throws a <code>SecurityException</code> if the 
+     * calling thread is not allowed to cause the Java Virtual Machine to 
+     * halt with the specified status code. 
+     * <p>
+     * This method is invoked for the current security manager by the 
+     * <code>exit</code> method of class <code>Runtime</code>. A status 
+     * of <code>0</code> indicates success; other values indicate various 
+     * errors. 
+     * <p>
+     * The <code>checkExit</code> method for class 
+     * <code>SecurityManager</code> always throws a 
+     * <code>SecurityException</code>. 
+     *
+     * @param      status   the exit status.
+     * @exception  SecurityException  if the caller does not have permission
+     *               to halt the Java Virtual Machine with the specified 
status.
+     * @see        java.lang.Runtime#exit(int)
+     * @see        java.lang.System#getSecurityManager()
+     * @since      JDK1.0
+     */
+    public void checkExit(int status) {
+       throw new SecurityException();
+    }
+
+    /**
+     * Throws a <code>SecurityException</code> if the 
+     * calling thread is not allowed to create a subprocss. 
+     * <p>
+     * This method is invoked for the current security manager by the 
+     * <code>exec</code> methods of class <code>Runtime</code>.
+     * <p>
+     * The <code>checkExec</code> method for class 
+     * <code>SecurityManager</code> always throws a 
+     * <code>SecurityException</code>. 
+     *
+     * @param      cmd   the specified system command.
+     * @exception  SecurityException  if the caller does not have permission
+     *               to create a subprocess.
+     * @see        java.lang.Runtime#exec(java.lang.String)
+     * @see        java.lang.Runtime#exec(java.lang.String, java.lang.String[])
+     * @see        java.lang.Runtime#exec(java.lang.String[])
+     * @see        java.lang.Runtime#exec(java.lang.String[],
+     *               java.lang.String[])
+     * @see        java.lang.System#getSecurityManager()
+     * @since      JDK1.0
+     */
+    public void checkExec(String cmd) {
+       throw new SecurityException();
+    }
+
+    /**
+     * Throws a <code>SecurityException</code> if the 
+     * calling thread is not allowed to dynamic link the library code 
+     * specified by the string argument file. The argument is either a 
+     * simple library name or a complete filename. 
+     * <p>
+     * This method is invoked for the current security manager by 
+     * methods <code>load</code> and <code>loadLibrary</code> of class 
+     * <code>Runtime</code>. 
+     * <p>
+     * The <code>checkLink</code> method for class 
+     * <code>SecurityManager</code> always throws a 
+     * <code>SecurityException</code>. 
+     *
+     * @param      lib   the name of the library.
+     * @exception  SecurityException  if the caller does not have permission
+     *               to dynamically link the library.
+     * @see        java.lang.Runtime#load(java.lang.String)
+     * @see        java.lang.Runtime#loadLibrary(java.lang.String)
+     * @see        java.lang.System#getSecurityManager()
+     * @since      JDK1.0
+     */
+    public void checkLink(String lib) {
+       throw new SecurityException();
+    }
+
+    /**
+     * Throws a <code>SecurityException</code> if the 
+     * calling thread is not allowed to read from the specified file 
+     * descriptor. 
+     * <p>
+     * The <code>checkRead</code> method for class 
+     * <code>SecurityManager</code> always throws a 
+     * <code>SecurityException</code>. 
+     *
+     * @param      fd   the system-dependent file descriptor.
+     * @exception  SecurityException  if the caller does not have permission
+     *               to access the specified file descriptor.
+     * @see        java.io.FileDescriptor
+     * @since      JDK1.0
+     */
+    public void checkRead(FileDescriptor fd) {
+       throw new SecurityException();
+    }
+
+    /**
+     * Throws a <code>SecurityException</code> if the 
+     * calling thread is not allowed to read the file specified by the 
+     * string argument. 
+     * <p>
+     * The <code>checkRead</code> method for class 
+     * <code>SecurityManager</code> always throws a 
+     * <code>SecurityException</code>. 
+     *
+     * @param      file   the system-dependent file name.
+     * @exception  SecurityException  if the caller does not have permission
+     *               to access the specified file.
+     * @since   JDK1.0
+     */
+    public void checkRead(String file) {
+       throw new SecurityException();
+    }
+
+    /**
+     * Throws a <code>SecurityException</code> if the 
+     * specified security context is not allowed to read the file 
+     * specified by the string argument. The context must be a security 
+     * context returned by a previous call to 
+     * <code>getSecurityContext</code>. 
+     * <p>
+     * The <code>checkRead</code> method for class 
+     * <code>SecurityManager</code> always throws a 
+     * <code>SecurityException</code>. 
+     *
+     * @param      file      the system-dependent filename.
+     * @param      context   a system-dependent security context.
+     * @exception  SecurityException  if the specified security context does
+     *               not have permission to read the specified file.
+     * @see        java.lang.SecurityManager#getSecurityContext()
+     * @since      JDK1.0
+     */
+    public void checkRead(String file, Object context) {
+       throw new SecurityException();
+    }
+
+    /**
+     * Throws a <code>SecurityException</code> if the 
+     * calling thread is not allowed to write to the specified file 
+     * descriptor. 
+     * <p>
+     * The <code>checkWrite</code> method for class 
+     * <code>SecurityManager</code> always throws a 
+     * <code>SecurityException</code>. 
+     *
+     * @param      fd   the system-dependent file descriptor.
+     * @exception  SecurityException  if the caller does not have permission
+     *               to access the specified file descriptor.
+     * @see        java.io.FileDescriptor
+     * @since      JDK1.0
+     */
+    public void checkWrite(FileDescriptor fd) {
+       throw new SecurityException();
+    }
+
+    /**
+     * Throws a <code>SecurityException</code> if the 
+     * calling thread is not allowed to write to the file specified by 
+     * the string argument. 
+     * <p>
+     * The <code>checkWrite</code> method for class 
+     * <code>SecurityManager</code> always throws a 
+     * <code>SecurityException</code>. 
+     *
+     * @param      file   the system-dependent filename.
+     * @exception  SecurityException  if the caller does not have permission
+     *               to access the specified file.
+     * @since   JDK1.0
+     */
+    public void checkWrite(String file) {
+       throw new SecurityException();
+    }
+
+    /**
+     * Throws a <code>SecurityException</code> if the 
+     * calling thread is not allowed to delete the specified file. 
+     * <p>
+     * This method is invoked for the current security manager by the 
+     * <code>delete</code> method of class <code>File</code>.
+     * <p>
+     * The <code>checkDelete</code> method for class 
+     * <code>SecurityManager</code> always throws a 
+     * <code>SecurityException</code>. 
+     *
+     * @param      file   the system-dependent filename.
+     * @exception  SecurityException  if the caller does not have permission
+     *               to delete the file.
+     * @see        java.io.File#delete()
+     * @see        java.lang.System#getSecurityManager()
+     * @since      JDK1.0
+     */
+    public void checkDelete(String file) {
+       throw new SecurityException();
+    }
+
+    /**
+     * Throws a <code>SecurityException</code> if the 
+     * calling thread is not allowed to open a socket connection to the 
+     * specified host and port number. 
+     * <p>
+     * A port number of <code>-1</code> indicates that the calling 
+     * method is attempting to determine the IP address of the specified 
+     * host name. 
+     * <p>
+     * The <code>checkConnect</code> method for class 
+     * <code>SecurityManager</code> always throws a 
+     * <code>SecurityException</code>. 
+     *
+     * @param      host   the host name port to connect to.
+     * @param      port   the protocol port to connect to.
+     * @exception  SecurityException  if the caller does not have permission
+     *               to open a socket connection to the specified
+     *               <code>host</code> and <code>port</code>.
+     * @since      JDK1.0
+     */
+    public void checkConnect(String host, int port) {
+       throw new SecurityException();
+    }
+
+    /**
+     * Throws a <code>SecurityException</code> if the 
+     * specified security context is not allowed to open a socket 
+     * connection to the specified host and port number. 
+     * <p>
+     * A port number of <code>-1</code> indicates that the calling 
+     * method is attempting to determine the IP address of the specified 
+     * host name. 
+     * <p>
+     * The <code>checkConnect</code> method for class 
+     * <code>SecurityManager</code> always throws a 
+     * <code>SecurityException</code>. 
+     *
+     * @param      host      the host name port to connect to.
+     * @param      port      the protocol port to connect to.
+     * @param      context   a system-dependent security context.
+     * @exception  SecurityException  if the specified security context does
+     *               not have permission to open a socket connection to the
+     *               specified <code>host</code> and <code>port</code>.
+     * @see        java.lang.SecurityManager#getSecurityContext()
+     * @since      JDK1.0
+     */
+    public void checkConnect(String host, int port, Object context) {
+       throw new SecurityException();
+    }
+
+    /**
+     * Throws a <code>SecurityException</code> if the 
+     * calling thread is not allowed to wait for a connection request on 
+     * the specified local port number. 
+     * <p>
+     * The <code>checkListen</code> method for class 
+     * <code>SecurityManager</code> always throws a 
+     * <code>SecurityException</code>. 
+     *
+     * @param      port   the local port.
+     * @exception  SecurityException  if the caller does not have permission
+     *               to listen on the specified port.
+     * @since   JDK1.0
+     */
+    public void checkListen(int port) {
+       throw new SecurityException();
+    }
+
+    /**
+     * Throws a <code>SecurityException</code> if the 
+     * calling thread is not permitted to accept a socket connection from 
+     * the specified host and port number. 
+     * <p>
+     * This method is invoked for the current security manager by the 
+     * <code>accept</code> method of class <code>ServerSocket</code>. 
+     * <p>
+     * The <code>checkAccept</code> method for class 
+     * <code>SecurityManager</code> always throws a
+     * <code>SecurityException</code>. 
+     *
+     * @param      host   the host name of the socket connection.
+     * @param      port   the port number of the socket connection.
+     * @exception  SecurityException  if the caller does not have permission
+     *               to accept the connection.
+     * @see        java.lang.System#getSecurityManager()
+     * @see        java.net.ServerSocket#accept()
+     * @since      JDK1.0
+     */
+    public void checkAccept(String host, int port) {
+       throw new SecurityException();
+    }
+
+    /**
+     * Tests if current execution context is allowed to use
+     * (join/leave/send/receive) IP multicast.
+     *
+     * @param      multicast  Internet group address to be used.
+     * @exception  SecurityException  if a security error has occurred.
+     * @since      JDK1.1
+     */
+    public void checkMulticast(InetAddress maddr) {
+       throw new SecurityException();
+    }
+
+    /**
+     * Tests to see if current execution context is allowed to use
+     * (join/leave/send/receive) IP multicast.
+     *
+     * @param      multicast  Internet group address to be used.
+     * @param      ttl        value in use, if it is multicast send.
+     * @exception  SecurityException  if a security error has occurred.
+     * @since      JDK1.1
+     */
+    public void checkMulticast(InetAddress maddr, byte ttl) {
+       throw new SecurityException();
+    }
+
+    /**
+     * Throws a <code>SecurityException</code> if the 
+     * calling thread is not allowed to access or modify the system 
+     * properties. 
+     * <p>
+     * This method is used by the <code>getProperties</code> and 
+     * <code>setProperties</code> methods of class <code>System</code>. 
+     * <p>
+     * The <code>checkPropertiesAccess</code> method for class 
+     * <code>SecurityManager</code> always throws a 
+     * <code>SecurityException</code>. 
+     *
+     * @exception  SecurityException  if the caller does not have permission
+     *               to access or modify the system properties.
+     * @see        java.lang.System#getProperties()
+     * @see        java.lang.System#setProperties(java.util.Properties)
+     * @since      JDK1.0
+     */
+    public void checkPropertiesAccess() {
+       throw new SecurityException();
+    }
+
+    /**
+     * Throws a <code>SecurityException</code> if the 
+     * calling thread is not allowed to access the system property with 
+     * the specified <code>key</code> name. 
+     * <p>
+     * This method is used by the <code>getProperty</code> method of 
+     * class <code>System</code>. 
+     * <p>
+     * The <code>checkPropertiesAccess</code> method for class 
+     * <code>SecurityManager</code> always throws a 
+     * <code>SecurityException</code>. 
+     *
+     * @param      key   a system property key.
+     * @exception  SecurityException  if the caller does not have permission
+     *               to access the specified system property.
+     * @see        java.lang.System#getProperty(java.lang.String)
+     * @since      JDK1.0
+     */
+    public void checkPropertyAccess(String key) {
+       throw new SecurityException();
+    }
+
+    /**
+     * Returns <code>false</code> if the calling 
+     * thread is not trusted to bring up the top-level window indicated 
+     * by the <code>window</code> argument. In this case, the caller can 
+     * still decide to show the window, but the window should include 
+     * some sort of visual warning. If the method returns 
+     * <code>true</code>, then the window can be shown without any 
+     * special restrictions. 
+     * <p>
+     * See class <code>Window</code> for more information on trusted and 
+     * untrusted windows. 
+     * <p>
+     * The <code>checkSetFactory</code> method for class 
+     * <code>SecurityManager</code> always returns <code>false</code>. 
+     *
+     * @param      window   the new window that is being created.
+     * @return     <code>true</code> if the caller is trusted to put up
+     *             top-level windows; <code>false</code> otherwise.
+     * @exception  SecurityException  if creation is disallowed entirely.
+     * @see        java.awt.Window
+     * @since      JDK1.0
+     */
+    public boolean checkTopLevelWindow(Object window) {
+       return false;
+    }
+
+    /**
+     * Tests if a client can initiate a print job request.
+     *
+     * @since   JDK1.1
+     */
+    public void checkPrintJobAccess() {
+      throw new SecurityException();
+    }
+
+    /**
+     * Tests if a client can get access to the system clipboard.
+     *
+     * @since   JDK1.1
+     */
+    public void checkSystemClipboardAccess() {
+      throw new SecurityException();
+    }
+
+    /**
+     * Tests if a client can get access to the AWT event queue.
+     *
+     * @since   JDK1.1
+     */
+    public void checkAwtEventQueueAccess() {
+      throw new SecurityException();
+    }
+
+    /**
+     * Throws a <code>SecurityException</code> if the 
+     * calling thread is not allowed to access the package specified by 
+     * the argument. 
+     * <p>
+     * This method is used by the <code>loadClass</code> method of class 
+     * loaders. 
+     * <p>
+     * The <code>checkPackageAccess</code> method for class 
+     * <code>SecurityManager</code> always throws a 
+     * <code>SecurityException</code>. 
+     *
+     * @param      pkg   the package name.
+     * @exception  SecurityException  if the caller does not have permission
+     *               to access the specified package.
+     * @see        java.lang.ClassLoader#loadClass(java.lang.String, boolean)
+     * @since      JDK1.0
+     */
+    public void checkPackageAccess(String pkg) {
+       throw new SecurityException();
+    }
+
+    /**
+     * Throws a <code>SecurityException</code> if the 
+     * calling thread is not allowed to define classes in the package 
+     * specified by the argument. 
+     * <p>
+     * This method is used by the <code>loadClass</code> method of some 
+     * class loaders. 
+     * <p>
+     * The <code>checkPackageDefinition</code> method for class 
+     * <code>SecurityManager</code> always throws a 
+     * <code>SecurityException</code>. 
+     *
+     * @param      pkg   the package name.
+     * @exception  SecurityException  if the caller does not have permission
+     *               to define classes in the specified package.
+     * @see        java.lang.ClassLoader#loadClass(java.lang.String, boolean)
+     * @since      JDK1.0
+     */
+    public void checkPackageDefinition(String pkg) {
+       throw new SecurityException();
+    }
+
+    /**
+     * Throws a <code>SecurityException</code> if the 
+     * calling thread is not allowed to set the socket factory used by 
+     * <code>ServerSocket</code> or <code>Socket</code>, or the stream 
+     * handler factory used by <code>URL</code>. 
+     * <p>
+     * The <code>checkSetFactory</code> method for class 
+     * <code>SecurityManager</code> always throws a 
+     * <code>SecurityException</code>. 
+     *
+     * @exception  SecurityException  if the caller does not have permission
+     *               to specify a socket factory or a stream handler factory.
+     * @see        java.net.ServerSocket#setSocketFactory(
+     *                                               
java.net.SocketImplFactory)
+     * @see        java.net.Socket#setSocketImplFactory(
+     *                                               
java.net.SocketImplFactory)
+     * @see        java.net.URL#setURLStreamHandlerFactory(
+     *                                         
java.net.URLStreamHandlerFactory)
+     * @since      JDK1.0
+     */
+    public void checkSetFactory() {
+       throw new SecurityException();
+    }
+
+    /**
+     * Tests if a client is allowed to access members. If access is
+     * denied, throw a SecurityException.
+     * The default policy is to deny all accesses.
+     *
+     * @since JDK1.1
+     */
+    public void checkMemberAccess(Class clazz, int which) {
+       throw new SecurityException();
+    }
+
+    /**
+     * Tests access to certain operations for a security API
+     * action.
+     *
+     * @since   JDK1.1
+     */
+    public void checkSecurityAccess(String action) {
+       throw new SecurityException();
+    }
+
+    private native Class currentLoadedClass0();
+
+    /**
+     * Returns the thread group into which to instantiate any new
+     * thread being created at the time this is being called.
+     * By default, it returns the thread group of the current
+     * thread. This should be overriden by specific security
+     * manager to return the appropriate thread group.
+     *
+     * @since   JDK1.1
+     */
+    public ThreadGroup getThreadGroup() {
+       return Thread.currentThread().getThreadGroup();
+    }
+
+}      
+
+class NullSecurityManager extends SecurityManager {
+    public void checkCreateClassLoader() { } 
+    public void checkAccess(Thread g) { }
+    public void checkAccess(ThreadGroup g) { }
+    public void checkExit(int status) { }
+    public void checkExec(String cmd) { }
+    public void checkLink(String lib) { }
+    public void checkRead(FileDescriptor fd) { }
+    public void checkRead(String file) { }
+    public void checkRead(String file, Object context) { }
+    public void checkWrite(FileDescriptor fd) { }
+    public void checkWrite(String file) { }
+    public void checkDelete(String file) { }
+    public void checkConnect(String host, int port) { }
+    public void checkConnect(String host, int port, Object context) { }
+    public void checkListen(int port) { }
+    public void checkAccept(String host, int port) { }
+    public void checkMulticast(InetAddress maddr) { }
+    public void checkMulticast(InetAddress maddr, byte ttl) { }
+    public void checkPropertiesAccess() { }
+    public void checkPropertyAccess(String key) { }
+    public void checkPropertyAccess(String key, String def) { }
+    public boolean checkTopLevelWindow(Object window) { return true; }
+    public void checkPrintJobAccess() { }
+    public void checkSystemClipboardAccess() { }
+    public void checkAwtEventQueueAccess() { }
+    public void checkPackageAccess(String pkg) { }
+    public void checkPackageDefinition(String pkg) { }
+    public void checkSetFactory() { }
+    public void checkMemberAccess(Class clazz, int which) { }
+    public void checkSecurityAccess(String provider) { }
+}      
diff --git a/test/etags/java-src/SysCol.java b/test/etags/java-src/SysCol.java
new file mode 100644
index 0000000..5356442
--- /dev/null
+++ b/test/etags/java-src/SysCol.java
@@ -0,0 +1,381 @@
+/*
+ * @(#)SystemColor.java        1.5 97/01/27
+ * 
+ * Copyright (c) 1995, 1996 Sun Microsystems, Inc. All Rights Reserved.
+ * 
+ * This software is the confidential and proprietary information of Sun
+ * Microsystems, Inc. ("Confidential Information").  You shall not
+ * disclose such Confidential Information and shall use it only in
+ * accordance with the terms of the license agreement you entered into
+ * with Sun.
+ * 
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ * 
+ * CopyrightVersion 1.1_beta
+ * 
+ */
+package java.awt;
+
+/**
+ * A class to encapsulate symbolic colors representing the color
+ * of GUI objects on a system.  For systems which support the dynamic
+ * update of the system colors (when the user changes the colors)
+ * the actual RGB values of these symbolic colors will also change
+ * dynamically.  In order to compare the "current" RGB value of a SystemColor
+ * object with a non-symbolic Color object, getRGB() should be used
+ * rather than equals(). 
+ *
+ * @version    1.5, 27 Jan 1997
+ * @author     Carl Quinn
+ * @author      Amy Fowler
+ */
+public final class SystemColor extends Color implements java.io.Serializable {
+
+    /**
+     * The array index for the desktop background color.
+     */
+    public final static int DESKTOP = 0;
+
+    /**
+     * The array index for the active caption background color.
+     */
+    public final static int ACTIVE_CAPTION = 1;
+
+    /**
+     * The array index for the action caption text color.
+     */
+    public final static int ACTIVE_CAPTION_TEXT = 2;
+
+    /**
+     * The array index for the active caption border color.
+     */
+    public final static int ACTIVE_CAPTION_BORDER = 3;
+
+    /**
+     * The array index for the inactive caption background color.
+     */
+    public final static int INACTIVE_CAPTION = 4;
+
+    /**
+     * The array index for the inactive caption text color.
+     */
+    public final static int INACTIVE_CAPTION_TEXT = 5;
+
+    /**
+     * The array index for the inactive caption border color.
+     */
+    public final static int INACTIVE_CAPTION_BORDER = 6;
+
+    /**
+     * The array index for the window background color.
+     */
+    public final static int WINDOW = 7;
+
+    /**
+     * The array index for the window border color.
+     */
+    public final static int WINDOW_BORDER = 8;
+
+    /**
+     * The array index for the window text color.
+     */
+    public final static int WINDOW_TEXT = 9;
+
+    /**
+     * The array index for the menu background color.
+     */
+    public final static int MENU = 10;
+
+    /**
+     * The array index for the menu text color.
+     */
+    public final static int MENU_TEXT = 11;
+
+    /**
+     * The array index for the text background color.
+     */
+    public final static int TEXT = 12;
+
+    /**
+     * The array index for the text text color.
+     */
+    public final static int TEXT_TEXT = 13;
+
+    /**
+     * The array index for the text highlight color.
+     */
+    public final static int TEXT_HIGHLIGHT = 14;
+
+    /**
+     * The array index for the text highlight text color.
+     */
+    public final static int TEXT_HIGHLIGHT_TEXT = 15;
+
+    /**
+     * The array index for the text inactive text color.
+     */
+    public final static int TEXT_INACTIVE_TEXT = 16;
+
+    /**
+     * The array index for the control background color.
+     */
+    public final static int CONTROL = 17;
+
+    /**
+     * The array index for the control text color.
+     */
+    public final static int CONTROL_TEXT = 18;
+
+    /**
+     * The array index for the control highlight color.
+     */
+    public final static int CONTROL_HIGHLIGHT = 19;
+
+    /**
+     * The array index for the control light highlight color.
+     */
+    public final static int CONTROL_LT_HIGHLIGHT = 20;
+
+    /**
+     * The array index for the control shadow color.
+     */
+    public final static int CONTROL_SHADOW = 21;
+
+    /**
+     * The array index for the control dark shadow color.
+     */
+    public final static int CONTROL_DK_SHADOW = 22;
+
+    /**
+     * The array index for the scrollbar background color.
+     */
+    public final static int SCROLLBAR = 23;
+
+    /**
+     * The array index for the info background color.
+     */
+    public final static int INFO = 24;
+
+    /**
+     * The array index for the info text color.
+     */
+    public final static int INFO_TEXT = 25;
+
+    /**
+     * The number of system colors in the array.
+     */
+    public final static int NUM_COLORS = 26;
+    
+   /**
+     * The color of the desktop background.
+     */
+    public final static SystemColor desktop = new SystemColor((byte)DESKTOP);
+
+    /**
+     * The background color for captions in window borders.
+     */
+    public final static SystemColor activeCaption = new 
SystemColor((byte)ACTIVE_CAPTION);
+
+    /**
+     * The text color for captions in window borders.
+     */
+    public final static SystemColor activeCaptionText = new 
SystemColor((byte)ACTIVE_CAPTION_TEXT);
+
+    /**
+     * The border color for captions in window borders.
+     */
+    public final static SystemColor activeCaptionBorder = new 
SystemColor((byte)ACTIVE_CAPTION_BORDER);
+
+    /**
+     * The background color for inactive captions in window borders.
+     */
+    public final static SystemColor inactiveCaption = new 
SystemColor((byte)INACTIVE_CAPTION);
+
+    /**
+     * The text color for inactive captions in window borders.
+     */
+    public final static SystemColor inactiveCaptionText = new 
SystemColor((byte)INACTIVE_CAPTION_TEXT);
+
+    /**
+     * The border color for inactive captios in window borders.
+     */
+    public final static SystemColor inactiveCaptionBorder = new 
SystemColor((byte)INACTIVE_CAPTION_BORDER);
+
+    /**
+     * The background color for windows.
+     */
+    public final static SystemColor window = new SystemColor((byte)WINDOW);
+
+    /**
+     * The border color for windows.
+     */
+    public final static SystemColor windowBorder = new 
SystemColor((byte)WINDOW_BORDER);
+
+    /**
+     * The text color for windows.
+     */
+    public final static SystemColor windowText = new 
SystemColor((byte)WINDOW_TEXT);
+
+    /**
+     * The background color for menus.
+     */
+    public final static SystemColor menu = new SystemColor((byte)MENU);
+
+    /**
+     * The text color for menus.
+     */
+    public final static SystemColor menuText = new 
SystemColor((byte)MENU_TEXT);
+
+    /**
+     * The background color for text components.
+     */
+    public final static SystemColor text = new SystemColor((byte)TEXT);
+
+    /**
+     * The text color for text components.
+     */
+    public final static SystemColor textText = new 
SystemColor((byte)TEXT_TEXT);
+
+    /**
+     * The background color for highlighted text.
+     */
+    public final static SystemColor textHighlight = new 
SystemColor((byte)TEXT_HIGHLIGHT);
+
+    /**
+     * The text color for highlighted text.
+     */
+    public final static SystemColor textHighlightText = new 
SystemColor((byte)TEXT_HIGHLIGHT_TEXT);
+
+    /**
+     * The text color for inactive text.
+     */
+    public final static SystemColor textInactiveText = new 
SystemColor((byte)TEXT_INACTIVE_TEXT);
+
+    /**
+     * The background color for control objects.
+     */
+    public final static SystemColor control = new SystemColor((byte)CONTROL);
+
+    /**
+     * The text color for control objects.
+     */
+    public final static SystemColor controlText = new 
SystemColor((byte)CONTROL_TEXT);
+
+    /**
+     * The light highlight color for control objects.
+     */
+    public final static SystemColor controlHighlight = new 
SystemColor((byte)CONTROL_HIGHLIGHT);
+
+    /**
+     * The regular highlight color for control objects.
+     */
+    public final static SystemColor controlLtHighlight = new 
SystemColor((byte)CONTROL_LT_HIGHLIGHT);
+
+    /**
+     * The regular shadow color for control objects.
+     */
+    public final static SystemColor controlShadow = new 
SystemColor((byte)CONTROL_SHADOW);
+
+    /**
+     * The dark shadow color for control objects.
+     */
+    public final static SystemColor controlDkShadow = new 
SystemColor((byte)CONTROL_DK_SHADOW);
+
+    /**
+     * The background color for scrollbars.
+     */
+    public final static SystemColor scrollbar = new 
SystemColor((byte)SCROLLBAR);
+
+    /**
+     * The background color for info(help) text.
+     */
+    public final static SystemColor info = new SystemColor((byte)INFO);
+
+    /**
+     * The text color for info(help) text.
+     */
+    public final static SystemColor infoText = new 
SystemColor((byte)INFO_TEXT);
+
+    /*
+     * System colors with default initial values, overwritten by toolkit if 
+     * system values differ and are available.
+     */
+    private static int[] systemColors = {
+        0xFF005C5C,  // desktop = new Color(0,92,92);
+        0xFF000080,  // activeCaption = new Color(0,0,128);
+        0xFFFFFFFF,  // activeCaptionText = Color.white;
+        0xFFC0C0C0,  // activeCaptionBorder = Color.lightGray;
+        0xFF808080,  // inactiveCaption = Color.gray;
+        0xFFC0C0C0,  // inactiveCaptionText = Color.lightGray;
+        0xFFC0C0C0,  // inactiveCaptionBorder = Color.lightGray;
+        0xFFFFFFFF,  // window = Color.white;
+        0xFF000000,  // windowBorder = Color.black;
+        0xFF000000,  // windowText = Color.black;
+        0xFFC0C0C0,  // menu = Color.lightGray;
+        0xFF000000,  // menuText = Color.black;
+        0xFFC0C0C0,  // text = Color.lightGray;
+        0xFF000000,  // textText = Color.black;
+        0xFF000080,  // textHighlight = new Color(0,0,128);
+        0xFFFFFFFF,  // textHighlightText = Color.white;
+        0xFF808080,  // textInactiveText = Color.gray;
+        0xFFC0C0C0,  // control = Color.lightGray;
+        0xFF000000,  // controlText = Color.black;
+        0xFFFFFFFF,  // controlHighlight = Color.white;
+        0xFFE0E0E0,  // controlLtHighlight = new Color(224,224,224);
+        0xFF808080,  // controlShadow = Color.gray;
+        0xFF000000,  // controlDkShadow = Color.black;
+        0xFFE0E0E0,  // scrollbar = new Color(224,224,224);
+        0xFFE0E000,  // info = new Color(224,224,0);
+        0xFF000000,  // infoText = Color.black;
+    };
+
+    /*
+     * JDK 1.1 serialVersionUID 
+     */
+    private static final long serialVersionUID = 4503142729533789064L;
+
+    static {
+      updateSystemColors();
+    }
+
+    /**
+     * called from <init> & toolkit to update the above systemColors cache
+     */
+    private static void updateSystemColors() {
+      Toolkit.getDefaultToolkit().loadSystemColors(systemColors);
+    }
+
+    /**
+     * Create a symbolic color that represents an indexed entry into system
+     * color cache. Used by above static system colors.
+     */
+    private SystemColor(byte index) {
+        super(0, 0, 0);
+       value = index;
+    }
+
+    /**
+     * Gets the "current" RGB value representing the symbolic color.
+     * (Bits 24-31 are 0xff, 16-23 are red, 8-15 are green, 0-7 are blue).
+     * @see java.awt.image.ColorModel#getRGBdefault
+     * @see #getRed
+     * @see #getGreen
+     * @see #getBlue
+     */
+    public int getRGB() {
+       return systemColors[value];
+    }
+
+    /**
+     * Returns the String representation of this Color's values.
+     */
+    public String toString() {
+        return getClass().getName() + "[i=" + (value) + "]";
+    }
+
+}
diff --git a/test/etags/java-src/TG.java b/test/etags/java-src/TG.java
new file mode 100644
index 0000000..707c2fc
--- /dev/null
+++ b/test/etags/java-src/TG.java
@@ -0,0 +1,840 @@
+/*
+ * @(#)ThreadGroup.java        1.31 97/01/20
+ * 
+ * Copyright (c) 1995, 1996 Sun Microsystems, Inc. All Rights Reserved.
+ * 
+ * This software is the confidential and proprietary information of Sun
+ * Microsystems, Inc. ("Confidential Information").  You shall not
+ * disclose such Confidential Information and shall use it only in
+ * accordance with the terms of the license agreement you entered into
+ * with Sun.
+ * 
+ * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
+ * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+ * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
+ * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
+ * THIS SOFTWARE OR ITS DERIVATIVES.
+ * 
+ * CopyrightVersion 1.1_beta
+ * 
+ */
+
+package java.lang;
+
+import java.io.PrintStream;
+import sun.misc.VM;
+
+/**
+ * A thread group represents a set of threads. In addition, a thread 
+ * group can also include other thread groups. The thread groups form 
+ * a tree in which every thread group except the initial thread group 
+ * has a parent. 
+ * <p>
+ * A thread is allowed to access information about its own thread 
+ * group, but not to access information about its thread group's 
+ * parent thread group or any other thread groups. 
+ *
+ * @author  unascribed
+ * @version 1.31, 20 Jan 1997
+ * @since   JDK1.0
+ */
+/* The locking strategy for this code is to try to lock only one level of the
+ * tree wherever possible, but otherwise to lock from the bottom up.
+ * That is, from child thread groups to parents.
+ * This has the advantage of limiting the number of locks that need to be held
+ * and in particular avoids having to grab the lock for the root thread group,
+ * (or a global lock) which would be a source of contention on a 
+ * multi-processor system with many thread groups.
+ * This policy often leads to taking a snapshot of the state of a thread group
+ * and working off of that snapshot, rather than holding the thread group 
locked
+ * while we work on the children.
+ */
+public
+class ThreadGroup {
+    ThreadGroup parent;
+    String name;
+    int maxPriority;
+    boolean destroyed;
+    boolean daemon;
+    boolean vmAllowSuspension;
+
+    int nthreads;
+    Thread threads[];
+
+    int ngroups;
+    ThreadGroup groups[];
+
+    /**
+     * Creates an empty Thread group that is not in any Thread group. 
+     * This method is used to create the system Thread group.
+     */
+    private ThreadGroup() {    // called from C code
+       this.name = "system";
+       this.maxPriority = Thread.MAX_PRIORITY;
+    }
+
+    /**
+     * Constructs a new thread group. The parent of this new group is 
+     * the thread group of the currently running thread. 
+     *
+     * @param   name   the name of the new thread group.
+     * @since   JDK1.0
+     */
+    public ThreadGroup(String name) {
+       this(Thread.currentThread().getThreadGroup(), name);
+    }
+
+    /**
+     * Creates a new thread group. The parent of this new group is the 
+     * specified thread group. 
+     * <p>
+     * The <code>checkAccess</code> method of the parent thread group is 
+     * called with no arguments; this may result in a security exception. 
+     *
+     * @param     parent   the parent thread group.
+     * @param     name     the name of the new thread group.
+     * @exception  NullPointerException  if the thread group argument is
+     *               <code>null</code>.
+     * @exception  SecurityException  if the current thread cannot create a
+     *               thread in the specified thread group.
+     * @see     java.lang.SecurityException
+     * @see     java.lang.ThreadGroup#checkAccess()
+     * @since   JDK1.0
+     */
+    public ThreadGroup(ThreadGroup parent, String name) {
+       if (parent == null) {
+           throw new NullPointerException();
+       }
+       parent.checkAccess();
+       this.name = name;
+       this.maxPriority = parent.maxPriority;
+       this.daemon = parent.daemon;
+       this.vmAllowSuspension = parent.vmAllowSuspension;
+       this.parent = parent;
+       parent.add(this);
+    }
+
+    /**
+     * Returns the name of this thread group.
+     *
+     * @return  the name of this thread group.
+     * @since   JDK1.0
+     */
+    public final String getName() {
+       return name;
+    }
+
+    /**
+     * Returns the parent of this thread group.
+     *
+     * @return  the parent of this thread group. The top-level thread group
+     *          is the only thread group whose parent is <code>null</code>.
+     * @since   JDK1.0
+     */
+    public final ThreadGroup getParent() {
+       return parent;
+    }
+
+    /**
+     * Returns the maximum priority of this thread group. Threads that are
+     * part of this group cannot have a higher priority than the maximum
+     * priority.
+     *
+     * @return  the maximum priority that a thread in this thread group
+     *          can have.
+     * @since   JDK1.0
+     */
+    public final int getMaxPriority() {
+       return maxPriority;
+    }
+
+    /**
+     * Tests if this thread group is a daemon thread group. A 
+     * daemon thread group is automatically destroyed when its last 
+     * thread is stopped or its last thread group is destroyed. 
+     *
+     * @return  <code>true</code> if this thread group is a daemon thread 
group;
+     *          <code>false</code> otherwise.
+     * @since   JDK1.0
+     */
+    public final boolean isDaemon() {
+       return daemon;
+    }
+
+    /**
+     * Tests if this thread group has not been destroyed.
+     *
+     * @since   JDK1.1
+     */
+    public synchronized boolean isDestroyed() {
+       return destroyed;
+    }
+
+    /**
+     * Changes the daemon status of this thread group.
+     * <p>
+     * First, the <code>checkAccess</code> method of this thread group is 
+     * called with no arguments; this may result in a security exception. 
+     * <p>
+     * A daemon thread group is automatically destroyed when its last 
+     * thread is stopped or its last thread group is destroyed. 
+     *
+     * @param      daemon   if <code>true</code>, marks this thread group as
+     *                      a daemon thread group; otherwise, marks this
+     *                      thread group as normal.
+     * @exception  SecurityException  if the current thread cannot modify
+     *               this thread.
+     * @see        java.lang.SecurityException
+     * @see        java.lang.ThreadGroup#checkAccess()
+     * @since      JDK1.0
+     */
+    public final void setDaemon(boolean daemon) {
+       checkAccess();
+       this.daemon = daemon;
+    }
+
+    /**
+     * Sets the maximum priority of the group. 
+     * <p>
+     * First, the <code>checkAccess</code> method of this thread group is 
+     * called with no arguments; this may result in a security exception. 
+     * <p>
+     * Threads in the thread group that already have a higher priority 
+     * are not affected. 
+     *
+     * @param      pri   the new priority of the thread group.
+     * @exception  SecurityException  if the current thread cannot modify
+     *               this thread group.
+     * @see        java.lang.SecurityException
+     * @see        java.lang.ThreadGroup#checkAccess()
+     * @since      JDK1.0
+     */
+    public final void setMaxPriority(int pri) {
+       int ngroupsSnapshot;
+       ThreadGroup[] groupsSnapshot;
+       synchronized (this) {
+           checkAccess();
+           if (pri < Thread.MIN_PRIORITY) {
+               maxPriority = Thread.MIN_PRIORITY;
+           } else if (pri < maxPriority) {
+               maxPriority = pri;
+           }
+           ngroupsSnapshot = ngroups;
+           if (groups != null) {
+               groupsSnapshot = new ThreadGroup[ngroupsSnapshot];
+               System.arraycopy(groups, 0, groupsSnapshot, 0, ngroupsSnapshot);
+           } else {
+               groupsSnapshot = null;
+           }
+       }
+       for (int i = 0 ; i < ngroupsSnapshot ; i++) {
+           groupsSnapshot[i].setMaxPriority(pri);
+       }
+    }
+
+    /**
+     * Tests if this thread group is either the thread group 
+     * argument or one of its ancestor thread groups. 
+     *
+     * @param   g   a thread group.
+     * @return  <code>true</code> if this thread group is the thread group
+     *          argument or one of its ancestor thread groups;
+     *          <code>false</code> otherwise.
+     * @since   JDK1.0
+     */
+    public final boolean parentOf(ThreadGroup g) {
+       for (; g != null ; g = g.parent) {
+           if (g == this) {
+               return true;
+           }
+       }
+       return false;
+    }
+
+    /**
+     * Determines if the currently running thread has permission to 
+     * modify this thread group. 
+     * <p>
+     * If there is a security manager, its <code>checkAccess</code> method 
+     * is called with this thread group as its argument. This may result 
+     * in throwing a <code>SecurityException</code>. 
+     *
+     * @exception  SecurityException  if the current thread is not allowed to
+     *               access this thread group.
+     * @see        java.lang.SecurityManager#checkAccess(java.lang.ThreadGroup)
+     * @since      JDK1.0
+     */
+    public final void checkAccess() {
+       SecurityManager security = System.getSecurityManager();
+       if (security != null) {
+           security.checkAccess(this);
+       }
+    }
+
+    /**
+     * Returns an estimate of the number of active threads in this
+     * thread group.
+     *
+     * @return  the number of active threads in this thread group and in any
+     *          other thread group that has this thread group as an ancestor.
+     * @since   JDK1.0
+     */
+    public int activeCount() {
+       int result;
+       // Snapshot sub-group data so we don't hold this lock
+       // while our children are computing.
+       int ngroupsSnapshot;
+       ThreadGroup[] groupsSnapshot;
+       synchronized (this) {
+           if (destroyed) {
+               return 0;
+           }
+           result = nthreads;
+           ngroupsSnapshot = ngroups;
+           if (groups != null) {
+               groupsSnapshot = new ThreadGroup[ngroupsSnapshot];
+               System.arraycopy(groups, 0, groupsSnapshot, 0, ngroupsSnapshot);
+           } else {
+               groupsSnapshot = null;
+           }
+       }
+       for (int i = 0 ; i < ngroupsSnapshot ; i++) {
+           result += groupsSnapshot[i].activeCount();
+       }
+       return result;
+    }
+
+    /**
+     * Copies into the specified array every active thread in this 
+     * thread group and its subgroups. 
+     * <p>
+     * An application should use the <code>activeCount</code> method to 
+     * get an estimate of how big the array should be. If the array is 
+     * too short to hold all the threads, the extra threads are silently 
+     * ignored. 
+     *
+     * @param   list   an array into which to place the list of threads.
+     * @return  the number of threads put into the array.
+     * @see     java.lang.ThreadGroup#activeCount()
+     * @since   JDK1.0
+     */
+    public int enumerate(Thread list[]) {
+       return enumerate(list, 0, true);
+    }
+
+    /**
+     * Copies into the specified array every active thread in this 
+     * thread group. If the <code>recurse</code> flag is 
+     * <code>true</code>, references to every active thread in this 
+     * thread's subgroups are also included. If the array is too short to 
+     * hold all the threads, the extra threads are silently ignored. 
+     * <p>
+     * An application should use the <code>activeCount</code> method to 
+     * get an estimate of how big the array should be. 
+     *
+     * @param   list      an array into which to place the list of threads.
+     * @param   recurse   a flag indicating whether also to include threads
+     *                    in thread groups that are subgroups of this
+     *                    thread group.
+     * @return  the number of threads placed into the array.
+     * @see     java.lang.ThreadGroup#activeCount()
+     * @since   JDK1.0
+     */
+    public int enumerate(Thread list[], boolean recurse) {
+       return enumerate(list, 0, recurse);
+    }
+
+    private int enumerate(Thread list[], int n, boolean recurse) {
+       int ngroupsSnapshot = 0;
+       ThreadGroup[] groupsSnapshot = null;
+       synchronized (this) {
+           if (destroyed) {
+               return 0;
+           }
+           int nt = nthreads;
+           if (nt > list.length - n) {
+               nt = list.length - n;
+           }
+           if (nt > 0) {
+               System.arraycopy(threads, 0, list, n, nt);
+               n += nt;
+           }
+           if (recurse) {
+               ngroupsSnapshot = ngroups;
+               if (groups != null) {
+                   groupsSnapshot = new ThreadGroup[ngroupsSnapshot];
+                   System.arraycopy(groups, 0, groupsSnapshot, 0, 
ngroupsSnapshot);
+               } else {
+                   groupsSnapshot = null;
+               }
+           }
+       }
+       if (recurse) {
+           for (int i = 0 ; i < ngroupsSnapshot ; i++) {
+               n = groupsSnapshot[i].enumerate(list, n, true);
+           }
+       }
+       return n;
+    }
+
+    /**
+     * Returns an estimate of the number of active groups in this
+     * thread group.
+     *
+     * @return  the number of active thread groups with this thread group as
+     *          an ancestor.
+     * @since   JDK1.0
+     */
+    public int activeGroupCount() {
+       int ngroupsSnapshot;
+       ThreadGroup[] groupsSnapshot;
+       synchronized (this) {
+           if (destroyed) {
+               return 0;
+           }
+           ngroupsSnapshot = ngroups;
+           if (groups != null) {
+               groupsSnapshot = new ThreadGroup[ngroupsSnapshot];
+               System.arraycopy(groups, 0, groupsSnapshot, 0, ngroupsSnapshot);
+           } else {
+               groupsSnapshot = null;
+           }
+       }
+       int n = ngroupsSnapshot;
+       for (int i = 0 ; i < ngroupsSnapshot ; i++) {
+           n += groupsSnapshot[i].activeGroupCount();
+       }
+       return n;
+    }
+
+    /**
+     * Copies into the specified array references to every active 
+     * subgroup in this thread group. 
+     * <p>
+     * An application should use the <code>activeGroupCount</code> 
+     * method to get an estimate of how big the array should be. If the 
+     * array is too short to hold all the thread groups, the extra thread 
+     * groups are silently ignored. 
+     *
+     * @param   list   an array into which to place the list of thread groups.
+     * @return  the number of thread groups put into the array.
+     * @see     java.lang.ThreadGroup#activeGroupCount()
+     * @since   JDK1.0
+     */
+    public int enumerate(ThreadGroup list[]) {
+       return enumerate(list, 0, true);
+    }
+
+    /**
+     * Copies into the specified array references to every active 
+     * subgroup in this thread group. If the <code>recurse</code> flag is 
+     * <code>true</code>, references to all active subgroups of the 
+     * subgroups and so forth are also included. 
+     * <p>
+     * An application should use the <code>activeGroupCount</code> 
+     * method to get an estimate of how big the array should be. 
+     *
+     * @param   list      an array into which to place the list of threads.
+     * @param   recurse   a flag indicating whether to recursively enumerate
+     *                    all included thread groups.
+     * @return  the number of thread groups put into the array.
+     * @see     java.lang.ThreadGroup#activeGroupCount()
+     * @since   JDK1.0
+     */
+    public int enumerate(ThreadGroup list[], boolean recurse) {
+       return enumerate(list, 0, recurse);
+    }
+
+    private int enumerate(ThreadGroup list[], int n, boolean recurse) {
+       int ngroupsSnapshot = 0;
+       ThreadGroup[] groupsSnapshot = null;
+       synchronized (this) {
+           if (destroyed) {
+               return 0;
+           }
+           int ng = ngroups;
+           if (ng > list.length - n) {
+               ng = list.length - n;
+           }
+           if (ng > 0) {
+               System.arraycopy(groups, 0, list, n, ng);
+               n += ng;
+           }
+           if (recurse) {
+               ngroupsSnapshot = ngroups;
+               if (groups != null) {
+                   groupsSnapshot = new ThreadGroup[ngroupsSnapshot];
+                   System.arraycopy(groups, 0, groupsSnapshot, 0, 
ngroupsSnapshot);
+               } else {
+                   groupsSnapshot = null;
+               }
+           }
+       }
+       if (recurse) {
+           for (int i = 0 ; i < ngroupsSnapshot ; i++) {
+               n = groupsSnapshot[i].enumerate(list, n, true);
+           }
+       }
+       return n;
+    }
+
+    /**
+     * Stops all processes in this thread group. 
+     * <p>
+     * First, the <code>checkAccess</code> method of this thread group is 
+     * called with no arguments; this may result in a security exception. 
+     * <p>
+     * This method then calls the <code>stop</code> method on all the 
+     * threads in this thread group and in all of its subgroups. 
+     *
+     * @exception  SecurityException  if the current thread is not allowed
+     *               to access this thread group or any of the threads in
+     *               the thread group.
+     * @see        java.lang.SecurityException
+     * @see        java.lang.Thread#stop()
+     * @see        java.lang.ThreadGroup#checkAccess()
+     * @since      JDK1.0
+     */
+    public final void stop() {
+       int ngroupsSnapshot;
+       ThreadGroup[] groupsSnapshot;
+       synchronized (this) {
+           checkAccess();
+           for (int i = 0 ; i < nthreads ; i++) {
+               threads[i].stop();
+           }
+           ngroupsSnapshot = ngroups;
+           if (groups != null) {
+               groupsSnapshot = new ThreadGroup[ngroupsSnapshot];
+               System.arraycopy(groups, 0, groupsSnapshot, 0, ngroupsSnapshot);
+           } else {
+               groupsSnapshot = null;
+           }
+       }
+       for (int i = 0 ; i < ngroupsSnapshot ; i++) {
+           groupsSnapshot[i].stop();
+       }
+    }
+
+    /**
+     * Suspends all processes in this thread group. 
+     * <p>
+     * First, the <code>checkAccess</code> method of this thread group is 
+     * called with no arguments; this may result in a security exception. 
+     * <p>
+     * This method then calls the <code>suspend</code> method on all the 
+     * threads in this thread group and in all of its subgroups. 
+     *
+     * @exception  SecurityException  if the current thread is not allowed
+     *               to access this thread group or any of the threads in
+     *               the thread group.
+     * @see        java.lang.SecurityException
+     * @see        java.lang.Thread#suspend()
+     * @see        java.lang.ThreadGroup#checkAccess()
+     * @since      JDK1.0
+     */
+    public final void suspend() {
+       int ngroupsSnapshot;
+       ThreadGroup[] groupsSnapshot;
+       synchronized (this) {
+           checkAccess();
+           for (int i = 0 ; i < nthreads ; i++) {
+               threads[i].suspend();
+           }
+           ngroupsSnapshot = ngroups;
+           if (groups != null) {
+               groupsSnapshot = new ThreadGroup[ngroupsSnapshot];
+               System.arraycopy(groups, 0, groupsSnapshot, 0, ngroupsSnapshot);
+           } else {
+               groupsSnapshot = null;
+           }
+       }
+       for (int i = 0 ; i < ngroupsSnapshot ; i++) {
+           groupsSnapshot[i].suspend();
+       }
+    }
+
+    /**
+     * Resumes all processes in this thread group. 
+     * <p>
+     * First, the <code>checkAccess</code> method of this thread group is 
+     * called with no arguments; this may result in a security exception. 
+     * <p>
+     * This method then calls the <code>resume</code> method on all the 
+     * threads in this thread group and in all of its sub groups. 
+     *
+     * @exception  SecurityException  if the current thread is not allowed to
+     *               access this thread group or any of the threads in the
+     *               thread group.
+     * @see        java.lang.SecurityException
+     * @see        java.lang.Thread#resume()
+     * @see        java.lang.ThreadGroup#checkAccess()
+     * @since      JDK1.0
+     */
+    public final void resume() {
+       int ngroupsSnapshot;
+       ThreadGroup[] groupsSnapshot;
+       synchronized (this) {
+           checkAccess();
+           for (int i = 0 ; i < nthreads ; i++) {
+               threads[i].resume();
+           }
+           ngroupsSnapshot = ngroups;
+           if (groups != null) {
+               groupsSnapshot = new ThreadGroup[ngroupsSnapshot];
+               System.arraycopy(groups, 0, groupsSnapshot, 0, ngroupsSnapshot);
+           } else {
+               groupsSnapshot = null;
+           }
+       }
+       for (int i = 0 ; i < ngroupsSnapshot ; i++) {
+           groupsSnapshot[i].resume();
+       }
+    }
+
+    /**
+     * Destroys this thread group and all of its subgroups. This thread 
+     * group must be empty, indicating that all threads that had been in 
+     * this thread group have since stopped. 
+     *
+     * @exception  IllegalThreadStateException  if the thread group is not
+     *               empty or if the thread group has already been destroyed.
+     * @exception  SecurityException  if the current thread cannot modify this
+     *               thread group.
+     * @since      JDK1.0
+     */
+    public final void destroy() {
+       int ngroupsSnapshot;
+       ThreadGroup[] groupsSnapshot;
+       synchronized (this) {
+           checkAccess();
+           if (destroyed || (nthreads > 0)) {
+               throw new IllegalThreadStateException();
+           }
+           ngroupsSnapshot = ngroups;
+           if (groups != null) {
+               groupsSnapshot = new ThreadGroup[ngroupsSnapshot];
+               System.arraycopy(groups, 0, groupsSnapshot, 0, ngroupsSnapshot);
+           } else {
+               groupsSnapshot = null;
+           }
+           if (parent != null) {
+               destroyed = true;
+               ngroups = 0;
+               groups = null;
+               nthreads = 0;
+               threads = null;
+           }
+       }
+       for (int i = 0 ; i < ngroupsSnapshot ; i += 1) {
+           groupsSnapshot[i].destroy();
+       }
+       if (parent != null) {
+           parent.remove(this);
+       }
+    }
+
+    /**
+     * Adds the specified Thread group to this group.
+     * @param g the specified Thread group to be added
+     * @exception IllegalThreadStateException If the Thread group has been 
destroyed.
+     */
+    private final void add(ThreadGroup g){
+       synchronized (this) {
+           if (destroyed) {
+               throw new IllegalThreadStateException();
+           }
+           if (groups == null) {
+               groups = new ThreadGroup[4];
+           } else if (ngroups == groups.length) {
+               ThreadGroup newgroups[] = new ThreadGroup[ngroups * 2];
+               System.arraycopy(groups, 0, newgroups, 0, ngroups);
+               groups = newgroups;
+           }
+           groups[ngroups] = g;
+
+           // This is done last so it doesn't matter in case the
+           // thread is killed
+           ngroups++;
+       }
+    }
+
+    /**
+     * Removes the specified Thread group from this group.
+     * @param g the Thread group to be removed
+     * @return if this Thread has already been destroyed.
+     */
+    private void remove(ThreadGroup g) {
+       synchronized (this) {
+           if (destroyed) {
+               return;
+           }
+           for (int i = 0 ; i < ngroups ; i++) {
+               if (groups[i] == g) {
+                   ngroups -= 1;
+                   System.arraycopy(groups, i + 1, groups, i, ngroups - i);
+                   // Zap dangling reference to the dead group so that
+                   // the garbage collector will collect it.
+                   groups[ngroups] = null;
+                   break;
+               }
+           }
+           if (nthreads == 0) {
+               notifyAll();
+           }
+           if (daemon && (nthreads == 0) && (ngroups == 0)) {
+               destroy();
+           }
+       }
+    }
+    
+    /**
+     * Adds the specified Thread to this group.
+     * @param t the Thread to be added
+     * @exception IllegalThreadStateException If the Thread group has been 
destroyed.
+     */
+    void add(Thread t) {
+       synchronized (this) {
+           if (destroyed) {
+               throw new IllegalThreadStateException();
+           }
+           if (threads == null) {
+               threads = new Thread[4];
+           } else if (nthreads == threads.length) {
+               Thread newthreads[] = new Thread[nthreads * 2];
+               System.arraycopy(threads, 0, newthreads, 0, nthreads);
+               threads = newthreads;
+           }
+           threads[nthreads] = t;
+
+           // This is done last so it doesn't matter in case the
+           // thread is killed
+           nthreads++;
+       }
+    }
+
+    /**
+     * Removes the specified Thread from this group.
+     * @param t the Thread to be removed
+     * @return if the Thread has already been destroyed.
+     */
+    void remove(Thread t) {
+       synchronized (this) {
+           if (destroyed) {
+               return;
+           }
+           for (int i = 0 ; i < nthreads ; i++) {
+               if (threads[i] == t) {
+                   System.arraycopy(threads, i + 1, threads, i, --nthreads - 
i);
+                   // Zap dangling reference to the dead thread so that
+                   // the garbage collector will collect it.
+                   threads[nthreads] = null;
+                   break;
+               }
+           }
+           if (nthreads == 0) {
+               notifyAll();
+           }
+           if (daemon && (nthreads == 0) && (ngroups == 0)) {
+               destroy();
+           }
+       }
+    }
+
+    /**
+     * Prints information about this thread group to the standard 
+     * output. This method is useful only for debugging. 
+     *
+     * @since   JDK1.0
+     */
+    public void list() {
+       list(System.out, 0);
+    }
+    void list(PrintStream out, int indent) {
+       int ngroupsSnapshot;
+       ThreadGroup[] groupsSnapshot;
+       synchronized (this) {
+           for (int j = 0 ; j < indent ; j++) {
+               out.print(" ");
+           }
+           out.println(this);
+           indent += 4;
+           for (int i = 0 ; i < nthreads ; i++) {
+               for (int j = 0 ; j < indent ; j++) {
+                   out.print(" ");
+               }
+               out.println(threads[i]);
+           }
+           ngroupsSnapshot = ngroups;
+           if (groups != null) {
+               groupsSnapshot = new ThreadGroup[ngroupsSnapshot];
+               System.arraycopy(groups, 0, groupsSnapshot, 0, ngroupsSnapshot);
+           } else {
+               groupsSnapshot = null;
+           }
+       }
+       for (int i = 0 ; i < ngroupsSnapshot ; i++) {
+           groupsSnapshot[i].list(out, indent);
+       }
+    }
+
+    /**
+     * Called by the Java Virtual Machine when a thread in this 
+     * thread group stops because of an uncaught exception. 
+     * <p>
+     * The <code>uncaughtException</code> method of 
+     * <code>ThreadGroup</code> does the following: 
+     * <ul>
+     * <li>If this thread group has a parent thread group, the
+     *     <code>uncaughtException</code> method of that parent is called
+     *     with the same two arguments. 
+     * <li>Otherwise, this method determines if the <code>Throwable</code>
+     *     argument is an instance of <code>ThreadDeath</code>. If so, nothing
+     *     special is done. Otherwise, the <code>Throwable</code>'s
+     *     <code>printStackTrace</code> method is called to print a stack
+     *     backtrace to the standard error stream.
+     * </ul>
+     * <p>
+     * Applications can override this method in subclasses of 
+     * <code>ThreadGroup</code> to provide alternative handling of 
+     * uncaught exceptions. 
+     *
+     * @param   t   the thread that is about to exit.
+     * @param   e   the uncaught exception.
+     * @see     java.lang.System#err
+     * @see     java.lang.ThreadDeath
+     * @see     java.lang.Throwable#printStackTrace(java.io.PrintStream)
+     * @since   JDK1.0
+     */
+    public void uncaughtException(Thread t, Throwable e) {
+       if (parent != null) {
+           parent.uncaughtException(t, e);
+       } else if (!(e instanceof ThreadDeath)) {
+           e.printStackTrace(System.err);
+       }
+    }
+
+    /**
+     * Used by VM to control lowmem implicit suspension.
+     *
+     * @since   JDK1.1
+     */
+    public boolean allowThreadSuspension(boolean b) {
+       this.vmAllowSuspension = b;
+       if (!b) {
+           VM.unsuspendSomeThreads();
+       }
+       return true;
+    }
+
+    /**
+     * Returns a string representation of this Thread group.
+     *
+     * @return  a string representation of this thread group.
+     * @since   JDK1.0
+     */
+    public String toString() {
+       return getClass().getName() + "[name=" + getName() + ",maxpri=" + 
maxPriority + "]";
+    }
+}
diff --git a/test/etags/lua-src/allegro.lua b/test/etags/lua-src/allegro.lua
new file mode 100644
index 0000000..c316b6f
--- /dev/null
+++ b/test/etags/lua-src/allegro.lua
@@ -0,0 +1,282 @@
+-- ase -- allegro-sprite-editor: the ultimate sprites factory
+-- Copyright (C) 2001-2004 by David A. Capello
+--
+-- Read "LEGAL.txt" for more information.
+
+-- internal routine
+local function get_layer_by_name (sprite, layer, name)
+  if layer.readable == false then
+    return nil;
+  end
+
+  if layer.name and strcmp (layer.name, name) == 0 then
+    return layer;
+  end
+
+  if layer_is_set (layer) then
+    local it, sub;
+
+    it = layer.layers;
+    while it do
+      sub = get_layer_by_name (sprite, it, name)
+      if sub then
+       return sub;
+      end
+      it = it.next
+    end
+  end
+
+  return nil;
+end
+
+-- internal routine
+local function count_layers (layer)
+  local count;
+
+  if layer.parent.type == GFXOBJ_SPRITE then
+    count = 0;
+  else
+    count = 1;
+  end
+
+  if layer_is_set (layer) then
+    local it = layer.layers;
+    while it do
+      count = count + count_layers (it);
+      it = it.next;
+    end
+  end
+
+  return count;
+end
+
+-- Layer *GetLayerByName (const char *name);
+function GetLayerByName (name)
+  local sprite = current_sprite;
+
+  if sprite and name then
+    return get_layer_by_name (sprite, sprite.set, name);
+  else
+    return nil;
+  end
+end
+
+-- const char *GetUniqueLayerName (void);
+function GetUniqueLayerName ()
+  local sprite = current_sprite;
+
+  if sprite then
+    return _("Layer") .. " " .. count_layers (sprite.set);
+  else
+    return nil;
+  end
+end
+
+-- void SelectLayer (Layer *layer);
+function SelectLayer (layer)
+  if current_sprite then
+    sprite_set_layer (current_sprite, layer);
+  end
+end
+
+-- Layer *NewLayer (const char *name, int x, int y, int w, int h);
+-- creates a new layer with the "name" in the current sprite (in the
+-- current frame) with the specified position and size (if w=h=0 the
+-- routine will use the sprite dimension)
+function NewLayer (name, x, y, w, h)
+  local sprite = current_sprite;
+  local layer = nil;
+  local image, frame, index;
+
+  if sprite and name then
+    if not w or w == 0 then w = sprite.w; end
+    if not h or h == 0 then h = sprite.h; end
+ 
+    -- new image
+    image = image_new (sprite.imgtype, w, h);
+    if not image then
+      return nil;
+    end
+
+    -- new layer
+    layer = layer_image_new (sprite.imgtype, w, h);
+    if not layer then
+      image_free (image);
+      return nil;
+    end
+
+    -- clear with mask color
+    image_clear (image, 0);
+
+    -- configure layer name and blend mode
+    layer_set_name (layer, name);
+    layer_set_blend_mode (layer, BLEND_MODE_NORMAL);
+
+    -- add image in the layer stock
+    index = stock_add_image (layer.stock, image);
+
+    -- create frame (XXX in the current frpos? --dacap)
+    frame = frame_new (sprite.frpos, index, x, y, 255);
+
+    -- add frame
+    layer_add_frame (layer, frame);
+
+    -- undo stuff
+    if undo_is_enabled (sprite.undo) then
+      undo_open (sprite.undo);
+      undo_add_layer (sprite.undo, sprite.set, layer);
+      undo_set_layer (sprite.undo, sprite);
+      undo_close (sprite.undo);
+    end
+
+    -- add the layer in the sprite set
+    layer_add_layer (sprite.set, layer);
+
+    -- select the new layer
+    sprite_set_layer (sprite, layer);
+  end
+
+  return layer;
+end
+
+-- Layer *NewLayerSet (const char *name);
+-- creates a new layer set with the "name" in the current sprite
+function NewLayerSet (name)
+  local sprite = current_sprite;
+  local layer = nil;
+
+  if sprite and name then
+    -- new layer
+    layer = layer_set_new ();
+    if not layer then
+      return nil;
+    end
+
+    -- configure layer name and blend mode
+    layer_set_name (layer, name);
+
+    -- add the layer in the sprite set
+    layer_add_layer (sprite.set, layer);
+
+    -- select the new layer
+    sprite_set_layer (sprite, layer);
+  end
+
+  return layer;
+end
+
+-- void RemoveLayer (void);
+-- removes the current selected layer
+function RemoveLayer ()
+  local sprite = current_sprite;
+
+  if sprite and sprite.layer then
+    local layer = sprite.layer;
+    local parent = layer.parent;
+    local layer_select;
+
+    -- select: previous layer, or next layer, or parent (if it is not
+    -- the main layer of sprite set)
+    if layer.prev then
+      layer_select = layer.prev;
+    elseif layer.next then
+      layer_select = layer.next;
+    elseif parent != sprite.set then
+      layer_select = parent;
+    else
+      layer_select = nil;
+    end
+
+    -- undo stuff
+    if undo_is_enabled (sprite.undo) then
+      undo_open (sprite.undo);
+      undo_set_layer (sprite.undo, sprite);
+      undo_remove_layer (sprite.undo, layer);
+      undo_close (sprite.undo);
+    end
+
+    -- select other layer
+    sprite_set_layer (sprite, layer_select);
+
+    -- remove the layer
+    layer_remove_layer (parent, layer);
+
+    -- destroy the layer
+    layer_free (layer);
+  end
+end
+
+-- void MoveLayerTop (void);
+-- moves the current layer in the top of the main set
+function MoveLayerTop ()
+  if current_sprite and current_sprite.layer then
+    local layer = current_sprite.layer;
+
+    layer_remove_layer (layer.parent, layer);
+
+    layer_add_layer (current_sprite.set, layer);
+  end
+end
+
+-- void MoveLayerBottom (void);
+-- moves the current layer in the bottom of the main set
+function MoveLayerBottom ()
+  if current_sprite and current_sprite.layer then
+    local layer = current_sprite.layer;
+
+    layer_remove_layer (layer.parent, layer);
+
+    layer_add_layer (current_sprite.set, layer);
+    layer_move_layer (current_sprite.set, layer, nil);
+  end
+end
+
+-- void MoveLayerBefore (Layer *this_one);
+-- moves the current layer above the layer "this_one"
+function MoveLayerBefore (this_one)
+  if current_sprite and current_sprite.layer then
+    local layer = current_sprite.layer;
+    local layer_dest;
+
+    if not this_one then
+      layer_dest = current_sprite.set;
+    else
+      layer_dest = this_one;
+    end
+
+    if layer_dest then
+      layer_remove_layer (layer.parent, layer);
+      layer_add_layer (layer_dest.parent, layer);
+      layer_move_layer (layer_dest.parent, layer, layer_dest);
+    end
+  end
+end
+
+-- void MoveLayerAfter (Layer *this_one);
+-- moves the current layer below the layer "this_one" (if that layer
+-- is a set, the layer is put in the top of the layer set)
+function MoveLayerAfter (this_one)
+  if current_sprite and current_sprite.layer then
+    local layer = current_sprite.layer;
+    local layer_dest;
+
+    if not this_one then
+      layer_dest = current_sprite.set;
+    else
+      layer_dest = this_one;
+    end
+
+    if layer_dest then
+      layer_remove_layer (layer.parent, layer);
+
+      -- insert in the first position of the set
+      if layer_is_set (layer_dest) then
+       layer_add_layer (layer_dest, layer);
+      -- insert below the layer
+      else
+       layer_add_layer (layer_dest.parent, layer);
+       layer_move_layer (layer_dest.parent, layer, layer_dest.prev);
+      end
+    end
+  end
+end
diff --git a/test/etags/make-src/Makefile b/test/etags/make-src/Makefile
new file mode 100644
index 0000000..daf605d
--- /dev/null
+++ b/test/etags/make-src/Makefile
@@ -0,0 +1,226 @@
+LATEST=17
address@hidden address@hidden address@hidden address@hidden
+
+ADASRC=etags-test-for.ada 2ataspri.adb 2ataspri.ads waroquiers.ada
+ASRC=empty.zz empty.zz.gz
+CSRC=abbrev.c ../etags/h.h .//c.c torture.c getopt.h etags.c\
+ exit.c exit.strange_suffix sysdep.h tab.c\
+ emacs/src/gmalloc.c emacs/src/regex.h emacs/src/keyboard.c dostorture.c\
+ machsyscalls.c machsyscalls.h fail.c a/b/b.c
+CPSRC=c.C abstract.C abstract.H cfront.H burton.cpp burton.cpp\
+ functions.cpp MDiagArray2.h Pctest.h Range.h\
+ screen.cpp screen.hpp conway.cpp conway.hpp clheir.cpp.gz clheir.hpp.gz fail.C
+ELSRC=TAGTEST.EL emacs/lisp/progmodes/etags.el
+ERLSRC=gs_dialog.erl lines.erl lists.erl
+FORTHSRC=test-forth.fth
+FSRC=entry.for entry.strange_suffix entry.strange
+HTMLSRC=softwarelibero.html index.shtml algrthms.html software.html
+JAVASRC=AWTEMul.java KeyEve.java SMan.java SysCol.java TG.java 
+LUASRC=allegro.lua
+MAKESRC=Makefile
+OBJCSRC=Subprocess.h Subprocess.m PackInsp.h PackInsp.m
+OBJCPPSRC=SimpleCalc.H SimpleCalc.M
+PASSRC=common.pas
+PERLSRC=htlmify-cystic yagrip.pl kai-test.pl mirror.pl
+PHPSRC=lce_functions.php ptest.php sendmail.php
+PSSRC=rfc1245.ps
+PROLSRC=ordsets.prolog natded.prolog
+PYTSRC=server.py
+TEXSRC=testenv.tex gzip.texi texinfo.tex nonewline.tex
+YSRC=parse.y parse.c atest.y cccp.c cccp.y
+SRCS=Makefile ${ADASRC} ${ASRC} ${CSRC} ${CPSRC} ${ELSRC} ${ERLSRC} ${FSRC}\
+     ${FORTHSRC} ${HTMLSRC} ${JAVASRC} ${LUASRC} ${MAKESRC} ${OBJCSRC}\
+     ${OBJCPPSRC} ${PASSRC} ${PHPSRC} ${PERLSRC} ${PSSRC} ${PROLSRC} ${PYTSRC}\
+     ${TEXSRC} ${YSRC}
+NONSRCS=entry.strange lists.erl clheir.hpp.gz
+
+VHDLFLAGS=--language=none --regex='/[ \t]*\(ARCHITECTURE\|CONFIGURATION\) +[^ 
]* +OF/' --regex='/[ \t]*\(ATTRIBUTE\|ENTITY\|FUNCTION\|PACKAGE\( 
BODY\)?\|PROCEDURE\|PROCESS\|TYPE\)[ \t]+\([^ \t(]+\)/\3/'
+COBOLFLAGS=--language=none --regex='/.......[a-zA-Z0-9-]+\./'
+POSTSCRIPTFLAGS=--language=none --regex='#/[^ \t{]+#'
+TCLFLAGS=--lang=none --regex='/proc[ \t]+\([^ \t]+\)/\1/'
+
+GETOPTOBJS= #getopt.o getopt1.o
+RXINCLUDE=-Iemacs/src
+REGEXOBJS=regex.o
+
+CHECKOBJS=chkmalloc.o chkxm.o
+CHECKFLAGS=-DDEBUG -Wno-unused-function
+OBJS=${GETOPTOBJS} ${REGEXOBJS} ${CHECKOBJS}
+CPPFLAGS=${CHECKFLAGS} -DSTDC_HEADERS -DHAVE_GETCWD ${RXINCLUDE} -I.
+LDFLAGS=#-static -lc_p
+WARNINGS=-pedantic -Wall -Wpointer-arith -Winline -Wmissing-prototypes 
-Wmissing-declarations -Wunused -Wformat -Wno-switch -Wsign-compare 
-Wpointer-arith -Wshadow -Wstrict-prototypes
+CFLAGS=${WARNINGS} -ansi -g3 # -pg -O
+#CC=gcc-3.0
+#TARGET_ARCH=
+FASTCFLAGS=-O3 -finline-functions -ffast-math -funroll-loops
+FASTCFLAGSWARN=${WARNINGS} -Werror ${FASTCFLAGS}
+
+FILTER=grep -v '\.[Cchefy][lor]*,[1-9][0-9]*' || true
+REGEX=/[ \t]*DEFVAR_[A-Z_ \t\n(]+"\([^"]+\)"/
+xx="this line is here because of a fontlock bug
+
+MAKE:=$(MAKE) --no-print-directory
+RUN=time --quiet --format '%U + %S: %E'
+RUN=
+OPTIONS=--members --declarations address@hidden
+ARGS=- < srclist
+
+infiles = $(filter-out ${NONSRCS},${SRCS}) srclist regexfile
+
+quiettest:
+       @rm -f /tmp/[0-9][0-9][0-9][0-9][0-9][0-9]malloc
+       @-$(MAKE) OPTIONS='--no-members' ${LATEST}ediff
+       @-$(MAKE) OPTIONS='--declarations --no-members' ${LATEST}ediff
+       @-$(MAKE) OPTIONS='--members' ${LATEST}ediff
+       @-$(MAKE) OPTIONS='address@hidden --no-members' ${LATEST}ediff
+       @-$(MAKE) OPTIONS='nonexistent --members --declarations address@hidden' 
${LATEST}ediff
+       @-$(MAKE) ${LATEST}cdiff
+
+test:
+       @rm -f /tmp/[0-9][0-9][0-9][0-9][0-9][0-9]malloc
+       @$(MAKE) OPTIONS='--no-members' ${LATEST}ediff
+       @$(MAKE) OPTIONS='--declarations --no-members' ${LATEST}ediff
+       @$(MAKE) OPTIONS='--members' ${LATEST}ediff
+       @$(MAKE) OPTIONS='address@hidden --no-members' ${LATEST}ediff
+       @$(MAKE) OPTIONS='nonexistent --members --declarations address@hidden' 
${LATEST}ediff
+       @$(MAKE) ${LATEST}cdiff
+
+${CHECKOBJS}: CFLAGS=-g3 -DNULLFREECHECK=0
+
+checker:
+       @rm -f /tmp/[0-9][0-9][0-9][0-9][0-9][0-9]malloc ${REGEXOBJS}
+       @env CHECKEROPTS="--trace --profile --Wfree-null" \
+       $(MAKE) CFLAGS= CHECKOBJS= CHECKFLAGS= CC=checkergcc ${LATEST}ediff
+       rm -f $REGEXOBJS
+
+standalone:
+       rm -f etags ctags
+       @$(MAKE) etags "CPPFLAGS=-UVERSION"
+       @$(MAKE) ctags "CPPFLAGS=-UVERSION"
+
+prof: ETAGS
+       prof -xgs etags
+
+fastetags:
+       rm -f etags ${GETOPTOBJS} ${REGEXOBJS}
+       @$(MAKE) CHECKOBJS= CHECKFLAGS= etags "CFLAGS=-ansi ${FASTCFLAGSWARN}"
+
+fastctags:
+       rm -f ctags ${GETOPTOBJS} ${REGEXOBJS}
+       @$(MAKE) CHECKOBJS= CHECKFLAGS= ctags "CFLAGS=-ansi ${FASTCFLAGSWARN}"
+
+staticetags:
+       rm -f etags ${GETOPTOBJS} ${REGEXOBJS}
+       @$(MAKE) etags CHECKOBJS= CHECKFLAGS= REGEXOBJS= GETOPTOBJS= RXINCLUDE= 
"CFLAGS=${FASTCFLAGSWARN} -static"
+
+rsynctofly:
+       rsync --exclude "*~" --exclude core --exclude etags -zauRv . 
fly:gnu/etags/
+
+rsyncfromfly:
+       rsync --exclude "*~" --exclude core --exclude etags -zauRv 
fly:gnu/etags/ ../..
+
+web ftp publish:
+       @-echo -e \\ttesting with debugging enabled...; $(MAKE) quiettest
+       @-echo -e \\ttesting standalone...; $(MAKE) standalone quiettest
+       @-echo -e \\ttesting fast versions...; $(MAKE) fastetags fastctags 
quiettest
+       @$(MAKE) /home/www/pub/etags.c.gz
+       @$(MAKE) /home/www/pub/software/unix/etags.tar.gz
+
+release distrib: web
+       cat xemacs-mail | /usr/sbin/sendmail -f address@hidden ${RELEASELIST}
+       mv etags etags${LATEST}
+       mv ctags ctags${LATEST}
+
+tags: TAGS
+
+clean:
+       rm -f ${OBJS} etags ETAGS
+
+srclist: Makefile
+       @for i in $(SRCS); do echo $$i; done > srclist
+       @echo srclist remade
+
+regexfile: Makefile
+       @echo ' -- This is for GNU Emacs source files' > regexfile
+       @echo '${REGEX}' >> regexfile
+       @echo '{c}${REGEX}\\1/m' >> regexfile
+       @echo regexfile remade
+
+/home/www/pub/etags.c.gz: etags.c
+       co -kv etags.c
+       gzip --best -c etags.c > $@
+
+#/home/www/pub/software/unix/etags.tar.gz: Makefile staticetags etags.1.man 
ETAGS.EBNF ETAGS.README
+#      tar -hzcf $@ COPYING ChangeLog ETAGS.EBNF etags.c etags.1 etags.1.man 
etags
+
+/home/www/pub/software/unix/etags.tar.gz: Makefile etags.1.man ETAGS.EBNF 
ETAGS.README maintaining.texi
+       tar -hzcf $@ COPYING ChangeLog ETAGS.EBNF ETAGS.README etags.c etags.1 
etags.1.man maintaining.texi
+
+regex.o: emacs/src/regex.c
+       $(CC) ${FASTCFLAGS} -c $?
+
+getopt.o: emacs/lib-src/getopt.c
+       $(CC) ${FASTCFLAGS} -c $?
+
+getopt1.o: emacs/lib-src/getopt1.c
+       $(CC) ${FASTCFLAGS} -c $?
+
+etags: etags.c ${OBJS}
+       $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o etags etags.c ${OBJS}
+
+ctags: etags.c ${OBJS}
+       $(CC) $(CFLAGS) $(CPPFLAGS) -DCTAGS $(LDFLAGS) -o ctags etags.c ${OBJS}
+
+man manpage: etags.1.man
+
+etags.1.man: etags.1
+       nroff -man -Tman etags.1 > $@
+
+maintaining.info: maintaining.texi
+       makeinfo --force --no-split maintaining.texi
+
+TAGS: etags.c
+       etags etags.c
+
+%ediff: ETAGS% ETAGS ${infiles}
+       sdiff --suppress-common-lines --width=103 ETAGS$* ETAGS
+
+oediff: OTAGS ETAGS ${infiles}
+       sdiff --suppress-common-lines --width=103 OTAGS ETAGS
+
+%cdiff: CTAGS% CTAGS ${infiles}
+       sdiff --suppress-common-lines --width=103 CTAGS$* CTAGS
+
+xdiff: ETAGS EXTAGS ${infiles}
+       sdiff --suppress-common-lines --width=103 ETAGS EXTAGS
+
+ETAGS: FRC etags ${infiles}
+       ${RUN} ./etags ${OPTIONS} -o $@ ${ARGS}
+
+ETAGS%: FRC etags% ${infiles}
+       ${RUN} etags$* ${OPTIONS} -o $@ ${ARGS}
+
+ETAGS13 ETAGS14 ETAGS15: etags% ${infiles}
+       TEXTAGS=def:newcommand:newenvironment ${RUN} etags$* address@hidden -o 
$@ ${ARGS}
+
+ETAGS12: etags12 ${infiles}
+       ${RUN} etags12 --members -o $@ --regex='${REGEX}' ${ARGS}
+
+OTAGS: oetags ${SRCS} srclist
+       ${RUN} ./oetags -o $@ -t ${ARGS}
+
+CTAGS: ctags ${infiles}
+       ${RUN} ./ctags -o $@ address@hidden ${ARGS}
+
+CTAGS%: ctags% ${infiles}
+       ${RUN} ctags$* -wtTd --globals --members -o $@ address@hidden ${ARGS}
+
+CTAGS13 CTAGS14 CTAGS15: ctags% ${infiles}
+       TEXTAGS=def:newcommand:newenvironment ${RUN} ctags$* -wt -o $@ 
--regex='${REGEX}' ${ARGS}
+
+EXTAGS: extags ${infiles} Makefile
+       ${RUN} ./extags -e --regex-c='${REGEX}' --c++-types=+x --c-types=+x 
--if0=yes --line-directives=yes -o $@ -L - < srclist
+
+.PRECIOUS: ETAGS CTAGS ETAGS16 CTAGS16 ETAGS17 CTAGS17
+
+FRC:;
diff --git a/test/etags/objc-src/PackInsp.h b/test/etags/objc-src/PackInsp.h
new file mode 100644
index 0000000..0e3643c
--- /dev/null
+++ b/test/etags/objc-src/PackInsp.h
@@ -0,0 +1,120 @@
+/*+++*
+ *  title:     PackageInspector.h
+ *  abstract:  interface definitions for WM PackageInspector 
+ *  author:    T.R.Hageman, Groningen, The Netherlands
+ *  created:   November 1994
+ *  modified:  (see RCS Log at end)
+ *  copyleft:
+ *
+ *             Copyright (C) 1994,1995  Tom R. Hageman.
+ *
+ *     This is free software; you can redistribute it and/or modify
+ *     it under the terms of the GNU General Public License as published by
+ *     the Free Software Foundation; either version 2 of the License, or
+ *     (at your option) any later version.
+ *
+ *     This software is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ *
+ *     You should have received a copy of the GNU General Public License
+ *     along with this software; if not, write to the Free Software
+ *     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  description:
+ *
+ *---*/
+
+#import <appkit/appkit.h>
+#import <apps/Workspace.h>
+
+#include <sys/stat.h>
+
+#import "Subprocess.h"
+
+#define NUMSTATS       4
+#define TYPESTOSTAT    "bom", "info", "sizes", "tiff"
+
address@hidden PackageInspector:WMInspector
+{
+       // Outlets
+    id packageArchesField;
+    id packageDescriptionText;
+    id packageIconButton;
+    id packageLocationField;
+    id packageSizesField;
+    id packageStatusField;
+    id packageTitleField;
+    id packageVersionField;
+
+    id  inspectorVersionField;
+    id infoPanel;
+    id infoVersionField;
+
+       // other variables.
+       NXBundle *bundle;               // class bundle.
+       NXBundle *package;              // package bundle.
+       struct stat stats[NUMSTATS];    // for lazy inspection.
+       enum { listContents, listDescription } revertButtonState;
+
+       Subprocess *archProcess;        // To determine architectures.
+}
+
+// Actions.
+-showInfo:sender;
+
+-open:sender;
+
+// The workhorses
+-(BOOL)shouldLoad;
+-load;
+-toggleDescription;
+
+// Load helper methods
+-loadKeyValuesFrom:(const char *)type inTable:(HashTable *)table;
+-loadContentsOf:(const char *)type inTable:(HashTable *)table;
+-loadImage;
+
+// Support methods
+-(const char *)getPath:(char *)path forType:(const char *)type;
+-setRevertButtonTitle;
+-(const char *)formatSize:(const char *)size inBuf:(char *)buf;
+
+// Determine architectures, in separate subprocess.
+-(void)getArchs;
+// Subprocess [TRH-enhanced] delegate methods:
+// Subprocess delegate methods:
+-subprocess:(Subprocess *)sender output:(char *)buffer;
+-subprocessDone:(Subprocess *)sender;
+
address@hidden // PackageInspector
+
+/*======================================================================
+ * PackageInspector.h,v
+ * Revision 1.7  1995/08/17 22:18:24  tom
+ * (-open:): new method.
+ *
+ * Revision 1.6  1995/07/30 16:59:51  tom
+ * import Subprocess.h; (archProcess): new ivar;
+ * (-getArchs,-subprocess:output:,-subprocessDone:): new methods;
+ * added for asynchronous arch-determination.
+ *
+ * Revision 1.5  1995/07/29 02:59:55  tom
+ * (NUMSTATS,TYPESTOSTAT): new defines, (stats[NUMSTATS]): new ivar, replaces
+ * bomstat, infostat, t ogeneralize lazy-load code.
+ *
+ * Revision 1.4  1995/04/02  02:39:05  tom
+ * (package): NXBundle instead of (const char *). so that localized info files
+ *  are found. (this loses out if *.pkg is a symbolic link, though.)
+ *
+ * Revision 1.3  1994/12/07  00:00:36  tom
+ * add GNU copleft comment.
+ *
+ * Revision 1.2  1994/11/25  20:18:56  tom
+ * (package ivar): use (char*) instead of (NXBundle*) to workaround symlink 
problems
+ *
+ * Revision 1.1  1994/11/24  22:39:56  tom
+ * Initial revision
+ *
+ *======================================================================*/
diff --git a/test/etags/objc-src/PackInsp.m b/test/etags/objc-src/PackInsp.m
new file mode 100644
index 0000000..41cc876
--- /dev/null
+++ b/test/etags/objc-src/PackInsp.m
@@ -0,0 +1,505 @@
+/*+++*
+ *  title:     PackageInspector.m
+ *  abstract:  NEXTSTEP Workspace Manager Inspector for Installer ".pkg" files.
+ *  author:    T.R.Hageman, Groningen, The Netherlands
+ *  created:   November 1994
+ *  modified:  (see RCS Log at end)
+ *  copyleft:
+ *
+ *             Copyright (C) 1994,1995  Tom R. Hageman.
+ *
+ *     This is free software; you can redistribute it and/or modify
+ *     it under the terms of the GNU General Public License as published by
+ *     the Free Software Foundation; either version 2 of the License, or
+ *     (at your option) any later version.
+ *
+ *     This software is distributed in the hope that it will be useful,
+ *     but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *     GNU General Public License for more details.
+ *
+ *     You should have received a copy of the GNU General Public License
+ *     along with this software; if not, write to the Free Software
+ *     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  description:
+ *
+ *---*/
+
+#ifdef RCS_ID
+static const char RCSid[] =
+"PackageInspector.m,v 1.8 1995/09/01 21:46:27";
+#endif
+
+#define VERSION        "0.951"
+
+#ifndef DEBUG
+#   define DEBUG 0
+#endif
+#define LISTCONTENTS   0       // List Contents not yet implemented
+
+#import "PackageInspector.h"
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+// Localized strings
+#define OPENBUTTON             NXLocalizedStringFromTableInBundle(NULL, 
bundle, "Open", NULL, button label)
+#define LISTCONTENTSBUTTON     NXLocalizedStringFromTableInBundle(NULL, 
bundle, "List Contents", NULL, button label)
+#define LISTDESCRIPTIONBUTTON  NXLocalizedStringFromTableInBundle(NULL, 
bundle, "Description", NULL, button label)
+
+// States
+#define STATE_UNINSTALLED      NXLocalizedStringFromTableInBundle(NULL, 
bundle, "Uninstalled", NULL, original package state)
+#define STATE_INSTALLED                
NXLocalizedStringFromTableInBundle(NULL, bundle, "installed", "Installed", 
package has been uncompressed unto disk)
+#define STATE_COMPRESSD                
NXLocalizedStringFromTableInBundle(NULL, bundle, "compressed", "Compressed", 
installed package has been recompressed)
+
+// so InfoView.strings can be ripped off from Installer.app
+#define SIZEFORMAT             NXLocalizedStringFromTableInBundle("InfoView", 
bundle, "%s installed, %s compressed", NULL, Short indication to user about the 
size of a package once installed and the size when compressed)
+#define KBYTES                 NXLocalizedStringFromTableInBundle("InfoView", 
bundle, "KB", NULL, Kilobytes -- package size)
+#define MBYTES                 NXLocalizedStringFromTableInBundle("InfoView", 
bundle, "MB", NULL, MegaBytes -- package size)
+
+#define LOCALIZE(s)            NXLoadLocalizedStringFromTableInBundle(NULL, 
bundle, s, NULL)
+#define LOCALIZE_ARCH(s)       
NXLoadLocalizedStringFromTableInBundle("Architectures", bundle, s, NULL)
+
+
address@hidden PackageInspector
+
++new
+{
+       static PackageInspector *instance;
+       
+       if (instance == nil) {
+               char path[MAXPATHLEN+1];
+               const char *nibname = [self name];
+
+               instance = [super new];
+
+               instance->bundle = [NXBundle bundleForClass:self];
+
+               if ([instance->bundle getPath:path forResource:nibname 
ofType:"nib"] &&
+                   [NXApp loadNibFile:path owner:instance]) {
+                       [instance->inspectorVersionField 
setStringValue:VERSION];
+                       [instance->packageDescriptionText 
setVertResizable:YES]; // ??Necessary??
+               }
+               else {
+                       fprintf(stderr, "Couldn't load %s.nib\n", nibname);
+                       [instance free];
+                       instance = nil;
+               }
+       }
+       return instance;
+}
+
+-showInfo:sender
+{
+       if (infoPanel == nil) {
+               char path[MAXPATHLEN+1];
+
+               if ([bundle getPath:path forResource:"Info" ofType:"nib"] &&
+                   [NXApp loadNibFile:path owner:self]) {
+                       [infoVersionField setStringValue:[inspectorVersionField 
stringValue]];
+               }
+       }
+       [infoPanel makeKeyAndOrderFront:sender];
+       return self;
+}
+
+-revert:sender
+{
+       [super revert:sender];
+
+       if ([self selectionCount] != 1) {
+               return nil;
+       }
+       if (sender == [self revertButton]) {
+               [self toggleDescription];
+       }
+       else {
+               char path[MAXPATHLEN+1];
+
+               [package free];
+               [self selectionPathsInto:path separator:'\0'];
+               if (!(package = [[NXBundle allocFromZone:[self zone]] 
initForDirectory:path])) {
+                       return nil;
+               }
+               if ([self shouldLoad]) {
+                       [self load];
+                       revertButtonState = listContents;
+               }
+       }
+       [[[self okButton] setTitle:OPENBUTTON] setEnabled:YES];
+       [self setRevertButtonTitle];
+
+       return self;
+}
+
+-ok:sender
+{
+       [self perform:@selector(open:) with:sender afterDelay:0 
cancelPrevious:NO];
+       [super ok:sender];
+       return self;
+}
+
+-load
+{
+       char buf[256], size[2][20];
+       HashTable *table = [[HashTable alloc] initKeyDesc:"*" valueDesc:"*"];
+
+       [self getArchs];
+       // Collect information about the package in a hashtable.
+       [self loadKeyValuesFrom:"info" inTable:table];
+       [self loadKeyValuesFrom:"sizes" inTable:table];
+       [self loadContentsOf:"location" inTable:table];
+       [self loadContentsOf:"status" inTable:table];
+
+       // Convenience macro.
+#define LOOKUP(key, notfound)  ([table isKey:key] ? [table valueForKey:key] : \
+                                (notfound))
+#if 0
+       // Set the various controls.
+       sprintf(buf, "<<not yet implemented>>");
+       // Well then, how *DOES* Installer determine this??? 
+       [packageArchesField setStringValue:buf];
+#endif
+       [packageDescriptionText setText:LOOKUP("Description", "")];
+       [packageLocationField setStringValue:
+        LOOKUP("location", LOOKUP("DefaultLocation", "???"))];
+
+       [self formatSize:[table valueForKey:"InstalledSize"] inBuf:size[0]];
+       [self formatSize:[table valueForKey:"CompressedSize"] inBuf:size[1]];
+       sprintf(buf, SIZEFORMAT, size[0], size[1]);
+       [packageSizesField setStringValue:buf];
+
+       [packageStatusField setStringValue:LOCALIZE(LOOKUP("status", 
"Uninstalled"))];
+       [packageTitleField setStringValue:LOOKUP("Title", "???")];
+       [packageVersionField setStringValue:LOOKUP("Version", "???")];
+#undef LOOKUP
+       // Is this how one frees the contents of a hashtable?
+       [table freeKeys:free values:free];
+       [table free];
+
+       [self loadImage];
+
+       return self;
+}
+
+-loadKeyValuesFrom:(const char *)type inTable:(HashTable *)table
+{
+       char path[MAXPATHLEN+1];
+       NXStream *stream;
+
+       if (stream = NXMapFile([self getPath:path forType:type], NX_READONLY)) {
+               int c;
+
+#if DEBUG & 1
+               fprintf(stderr, "loadKeyValuesFrom:%s\n", path);
+#endif
+               while ((c = NXGetc(stream)) >= 0) {
+                       // Buffer sizes should be enough, according to doc.
+                       char key[1024+1], value[1024+1];
+                       char *p;
+
+                       if (NXIsSpace(c)) continue;
+                       if (c == '#') {
+                               while ((c = NXGetc(stream)) >= 0 && c != '\n') ;
+                               continue;
+                       }
+                       // Found key; collect it.
+                       p = key;
+                       do {
+                               if (p < &key[sizeof key-1]) *p++ = c;
+                       } while ((c = NXGetc(stream)) >= 0 && !NXIsSpace(c));
+                       *p = '\0';
+
+                       // Skip over spaces and tabs.
+                       while (c == ' ' || c == '\t') c = NXGetc(stream);
+
+                       // Value is rest of line, up to newline.
+                       p = value;
+                       do {
+                               if (p < &value[sizeof value-1]) *p++ = c;
+                       } while ((c = NXGetc(stream)) >= 0 && c != '\n');
+                       *p = '\0';
+
+                       // Insert key/value pair in hashtable.
+#if DEBUG & 1
+                       fprintf(stderr, "key:%s value:%s\n", key, value);
+#endif
+                       [table insertKey:NXCopyStringBuffer(key)
+                        value:NXCopyStringBuffer(value)];
+               }
+
+               NXCloseMemory(stream, NX_FREEBUFFER);
+       }
+       return self;
+
+}
+
+-loadContentsOf:(const char *)type inTable:(HashTable *)table
+{
+       char path[MAXPATHLEN+1];
+       NXStream *stream;
+
+       if (stream = NXMapFile([self getPath:path forType:type], NX_READONLY)) {
+               char line[1024+1];
+               int n = NXRead(stream, line, sizeof line);
+
+               if (n > 0 && line[n-1] == '\n') line[n-1] = '\0';       // 
remove trailing newline.
+
+               NXCloseMemory(stream, NX_FREEBUFFER);
+
+               [table insertKey:NXCopyStringBuffer(type)
+                value:NXCopyStringBuffer(line)];
+       }
+       return self;
+}
+
+-loadImage
+{
+       char path[MAXPATHLEN+1];
+       NXImage *image;
+
+       // Remove old image from the button.
+       if (image = [packageIconButton image]) {
+               [packageIconButton setImage:nil];
+               [image free];
+       }
+       // Get the image (if any) from the package
+       image = [[NXImage allocFromZone:[self zone]] initFromFile:[self 
getPath:path forType:"tiff"]];
+       [packageIconButton setImage:image];
+
+       return self;
+}
+
+
+#define STAT_EQ(s1, s2)        ((s1)->st_ino == (s2)->st_ino && \
+                        (s1)->st_dev == (s2)->st_dev && \
+                        (s1)->st_mtime == (s2)->st_mtime && \
+                        (s1)->st_size == (s2)->st_size)
+
+-(BOOL)shouldLoad
+{
+       char path[MAXPATHLEN+1];
+       struct stat newstats[NUMSTATS];
+       static const char * const typesToStat[NUMSTATS] = { TYPESTOSTAT };
+       BOOL result = NO;
+       int i;
+
+       for (i = 0;  i < NUMSTATS;  i++) {
+               memset(&newstats[i], 0, sizeof(struct stat));
+               if (!(stat([self getPath:path forType:typesToStat[i]], 
&newstats[i]) == 0 &&
+                     STAT_EQ(&newstats[i], &stats[i]))) {
+                       result = YES;
+                       ///break; // NOT!!! must stat all for accurate cache.
+               }
+               stats[i] = newstats[i];
+       }
+
+       return result;
+}
+
+-toggleDescription
+{
+       switch (revertButtonState) {
+       case listContents:
+               // TODO: swap views?
+               revertButtonState = listDescription;
+               break;
+       case listDescription:
+               revertButtonState = listContents;
+               break;
+       }
+       return [self setRevertButtonTitle];
+}
+
+
+// Support methods
+-(const char *)getPath:(char *)buf forType:(const char *)type
+{
+       char name[MAXPATHLEN+1];
+
+       // Get package name, sans extension.
+       *strrchr(strcpy(name, strrchr([package directory], '/')+1), '.') = '\0';
+
+       // Now get the full pathname.
+       [package getPath:buf forResource:name ofType:type];
+#if DEBUG & 2
+       fprintf(stderr, "PackageInspector: type=\"%s\" name=\"%s\" 
path=\"%s\"\n",
+               type, name, buf);
+#endif
+       return buf;
+}
+
+-setRevertButtonTitle
+{
+#if LISTCONTENTS
+       [[[self revertButton]
+         setTitle:LOCALIZE(revertButtonState == listContents ?
+                           "List Contents" : "Description")]
+        setEnabled:YES];
+#endif
+       return self;
+}
+
+-(const char *)formatSize:(const char *)size inBuf:(char *)buf
+{
+       // [TRH] this is very simplistic (but seems consistent with 
Installer.app)
+       if (!size) {
+               strcpy(buf, "???");
+       }
+       else {
+               int len = strlen(size);
+               if (len < 4) {
+                       sprintf(buf, "%s%s", size, KBYTES);
+               }
+               else if (len < 6) {
+                       sprintf(buf, "%.*s.%.*s%s",
+                               (len-3), size, 3-(len-3), size+(len-3), 
MBYTES); 
+               }
+               else {
+                       sprintf(buf, "%.*s%s", (len-3), size, MBYTES);
+               }
+       }
+       return buf;
+}
+
+// Determine architectures, in separate subprocess.
+
+#define WORKING        " ..."  // `I'm still busy' indicator.
+
+-(void)getArchs
+{
+       char command[2*MAXPATHLEN+10+1];
+
+       if (archProcess) [archProcess terminate:self];
+
+       [packageArchesField setStringValue:WORKING];
+
+       [bundle getPath:command forResource:"archbom" ofType:NULL];
+       strcat(command, " ");
+       [self getPath:&command[strlen(command)] forType:"bom"];
+       archProcess = [[Subprocess allocFromZone:[self zone]] init:command
+                      withDelegate:self andPtySupport:NO andStdErr:NO];
+}
+
+-(void)addArchs:(const char *)string
+{
+       char result[1024];      // Should be big enough...
+       const char *s;
+       char *d;
+
+       strcpy(result, [packageArchesField stringValue]);
+       if ((d = strstr(result, WORKING)) != NULL) {
+               *d = '\0';
+       }
+       else {
+               d = result + strlen(result);
+       }
+       if ((s = string)) {
+               do {
+                       char name[100];
+                       char *t = name;
+
+                       while (*s && !NXIsAlNum(*s)) {
+                               if (*s == '\n') {
+                                       *d++ = ' ', s++;
+                               }
+                               else {
+                                       *d++ = *s++;
+                               }
+                       }
+                       while (NXIsAlNum(*s)) *t++ = *s++;
+                       *t = '\0';
+                       if (t > name) {
+#if DEBUG & 4
+                               fprintf(stderr, "addArchs:\"%s\" localized: 
\"%s\"\n", name, LOCALIZE_ARCH(name));
+#endif
+                               strcpy(d, LOCALIZE_ARCH(name));
+                               d += strlen(d);
+                       }
+               } while (*s);
+
+               strcpy(d, WORKING);
+       }
+       [packageArchesField setStringValue:result];
+       [window displayIfNeeded]; // necessary??
+}
+
+-subprocess:(Subprocess *)sender output:(char *)buffer
+{
+       if (sender == archProcess) {
+               [self addArchs:buffer];
+       }
+       return self;
+}
+
+-subprocessDone:(Subprocess *)sender
+{
+       if (sender == archProcess) {
+               archProcess = nil;
+               [self addArchs:NULL];
+       }
+       [sender free];
+       return self;
+}
+
+static void openInWorkspace(const char *filename)
+{
+       // Indirect approach to circumvent Workspace deadlock/timeout.
+       char command[14+3*MAXPATHLEN+1];
+       const char *s;
+       char *d = command;
+
+       for (s = "exec open '"; *s; ) *d++ = *s++;
+       // Escape single quote characters.
+       for (s = filename; *s; ) {
+               if ((*d++ = *s++) == '\'') {
+                       *d++ = '\\', *d++ = '\'', *d++ = '\'';
+               }
+       }
+       for (s = "'&"; *d++ = *s++; ) ;
+       system(command);
+}
+
+-open:sender
+{
+       openInWorkspace([package directory]);
+       return self;
+}
+
address@hidden
+
+/*======================================================================
+ * PackageInspector.m,v
+ * Revision 1.8  1995/09/01 21:46:27  tom
+ * Circumvent open deadlock/timeout (when Installer.app is not yet launched);
+ * (openInWorkspace): new private function; (-open:): new method.
+ *
+ * Revision 1.7  1995/07/30 22:20:26  tom
+ * (LOCALIZE_ARCH): new macro; (-addArchs:): new method;
+ * (-subprocess:output:,-subprocessDone:) use it.
+ *
+ * Revision 1.6  1995/07/30 16:59:51  tom
+ * import Subprocess.h; (archProcess): new ivar;
+ * (-getArchs,-subprocess:output:,-subprocessDone:): new methods;
+ * added for asynchronous arch-determination.
+ *
+ * Revision 1.5  1995/07/29 19:13:35  tom
+ * (+new): avoid reassignment of self;
+ *  make packageDescriptionText vertically resizable;
+ * (-shouldLoad): rewritten to generalized array-driven approach.
+ *
+ * Revision 1.4  1995/04/02 02:39:01  tom
+ * (package): NXBundle instead of (const char *). so that localized info files
+ *  are found. (this loses out if *.pkg is a symbolic link, though.)
+ *
+ * Revision 1.3  1994/12/07 00:00:36  tom
+ * (RCSid): add spaces.
+ *
+ * Revision 1.2  1994/11/25 21:27:18  tom
+ * (package ivar): use (char*) instead of (NXBundle*) to workaround symlink 
problems
+ *
+ * Revision 1.1  1994/11/25 16:13:12  tom
+ * Initial revision
+ *
+ *======================================================================*/
diff --git a/test/etags/objc-src/Subprocess.h b/test/etags/objc-src/Subprocess.h
new file mode 100644
index 0000000..7e586a1
--- /dev/null
+++ b/test/etags/objc-src/Subprocess.h
@@ -0,0 +1,81 @@
+/*
+       Subprocess.h    (v10)
+       by Charles L. Oei
+       pty support by Joe Freeman
+       with encouragement from Kristofer Younger
+       Subprocess Example, Release 2.0
+       NeXT Computer, Inc.
+
+       You may freely copy, distribute and reuse the code in this example.
+       NeXT disclaims any warranty of any kind, expressed or implied, as to
+       its fitness for any particular use.
+
+       Hacked up for use in PackageInspector by Tom Hageman.
+*/
+
+#import <objc/Object.h>
+#import <stdio.h>
+
+/*
+    This subprocess object sends/receives data to/from any UNIX
+    subprocess asynchronously (via vfork/pipe).
+    Its delegate, if any, will receive the following messages:
+
+       - subprocessDone;
+           // sent when the subprocess exits
+    
+       - subprocessOutput:(char *)buffer;
+           // sent whenever there is data on the standard output pipe;
+           // buffer is only valid until next call
+       
+       - subprocessError:(const char *)errorString;
+           // sent when an error occurs;
+           // if it ever happens, it's usually only at startup time
+
+       // [TRH] and this is how these should have been done in the first 
place...
+       - subprocessDone:(SubProcess *)sender;
+       - subprocess:(SubProcess *)sender output:(char *)buffer;        
+*/
+
+// Hack to uniquize classname (to avoid dynload errors.)
+#define Subprocess SubprocessForPackageInspector
+
+#define BUFFERSIZE 2048
+
address@hidden Subprocess:Object
+{
+    FILE *fpToChild;
+    int fromChild;
+    int childPid;
+    id delegate;
+    int masterPty;     // file descriptor for master/slave pty
+    int slavePty;
+    int bufferCount;
+    char outputBuffer[BUFFERSIZE];
+}
+
+- init:(const char *)subprocessString;
+    // a cover for the below withDelegate:nil, andPtySupport:NO, andStdErr:YES
+
+- init:(const char *)subprocessString
+    withDelegate:theDelegate
+    andPtySupport:(BOOL)wantsPty
+    andStdErr:(BOOL)wantsStdErr;
+    // optional requests for pseudo terminal support and
+    // redirecting the standard error stream thru standard output
+
+- send:(const char *)string withNewline:(BOOL)wantNewline;
+    // send the string optionally followed by a new line
+- send:(const char *)string;
+    // sends the string followed by a new line
+    // shorthand for above withNewline:YES
+- terminateInput;
+    // sends an end-of-file (EOF) to the subprocess
+    // (and closes input pipe to child)
+- terminate:sender;
+    // forces the subprocess to terminate (w/ SIGTERM)
+
+- setDelegate:anObject;
+- delegate;
+
address@hidden
diff --git a/test/etags/objc-src/Subprocess.m b/test/etags/objc-src/Subprocess.m
new file mode 100644
index 0000000..2d8d586
--- /dev/null
+++ b/test/etags/objc-src/Subprocess.m
@@ -0,0 +1,343 @@
+/*
+       Subprocess.m    (v10)
+       by Charles L. Oei
+       pty support by Joe Freeman
+       Subprocess Example, Release 2.0
+       NeXT Computer, Inc. 
+
+       You may freely copy, distribute and reuse the code in this example.
+       NeXT disclaims any warranty of any kind, expressed or implied, as to
+       its fitness for any particular use.
+*/
+
+#import "Subprocess.h"
+// #import <sgtty.h>   // needed to compile under Release 1.0
+#import <appkit/nextstd.h>
+#import <appkit/Application.h>
+#import <appkit/Panel.h>
+#import <sys/wait.h>
+
+#define        PTY_TEMPLATE "/dev/pty??"
+#define        PTY_LENGTH 11
+
+static void showError();
+
+
+/*==========================================================
+ *
+ * Private Instance Methods
+ *
+ *==========================================================*/
+
address@hidden Subprocess(Private)
+- childDidExit;
+- fdHandler:(int)theFd;
address@hidden
+
address@hidden Subprocess(Private)
+
+- childDidExit
+    // cleanup after a child process exits
+{
+    if (childPid)
+    {
+       union wait exitstatus;
+       int waitresult;
+
+       DPSRemoveFD(fromChild);
+       close(fromChild);
+       fclose(fpToChild);
+       // Cleanup zombie processes. (blocking wait is too dangerous here...)
+       waitresult = wait4(childPid, &exitstatus, WNOHANG, NULL);
+       if (waitresult != childPid) {
+               /* XXX should handle this gracefully, e.g, timed entry. */
+       }
+       childPid=0;     // specify that child is dead
+       if (delegate)
+       {    
+           if ([delegate respondsTo:@selector(subprocessDone:)])
+               [delegate perform:@selector(subprocessDone:) with:self];
+           else if ([delegate respondsTo:@selector(subprocessDone)])
+               [delegate perform:@selector(subprocessDone)];
+       }
+    }
+    return self;
+}
+
+- fdHandler:(int)theFd
+    // DPS handler for output from subprocess
+{
+    if ((bufferCount = read(theFd, outputBuffer, BUFFERSIZE-1)) <= 0)
+    {
+       [self childDidExit];
+       return self;
+    }
+    outputBuffer[bufferCount] = '\0';
+    if (delegate)
+    {
+        if ([delegate respondsTo:@selector(subprocess:output:)])
+           [delegate perform:@selector(subprocess:output:)
+                 with:self with:(void *)&outputBuffer];
+        else if ([delegate respondsTo:@selector(subprocessOutput:)])
+           [delegate perform:@selector(subprocessOutput:)
+                 with:(void *)&outputBuffer];
+    }
+    return self;
+}
+
address@hidden
+
+
+/*==========================================================
+ *
+ * Private Utility Routines
+ *
+ *==========================================================*/
+ 
+static void
+showError (const char *errorString, id theDelegate)
+    // ensure errors never get dropped on the floor
+{
+    if (theDelegate && [theDelegate respondsTo:@selector(subprocessError:)])
+       [theDelegate
+           perform:@selector(subprocessError:)
+           with:(void *)errorString];
+    else if (NXApp)    // no delegate, but we're running w/in an App
+       NXRunAlertPanel(0, errorString, 0, 0, 0);
+    else
+       perror(errorString);
+}
+
+static void
+fdHandler (int theFd, id self)
+    // DPS handler for output from subprocess
+{
+    [self fdHandler:theFd];
+}
+
+static void
+getptys (int *master, int *slave)
+    // attempt to setup the ptys
+{
+    char device[PTY_LENGTH];
+    char *block, *num;
+    char *blockLoc; // specifies the location of block for the device string
+    char *numLoc; // specifies the pty name with the digit ptyxD
+    char *msLoc; // specifies the master (ptyxx) or slave (ttyxx)
+    
+    struct sgttyb setp =
+       {B9600, B9600, (char)0x7f, (char)0x15, (CRMOD|ANYP)};
+    struct tchars setc =
+       {CINTR, CQUIT, CSTART, CSTOP, CEOF, CBRK};
+    struct ltchars sltc =
+       {CSUSP, CDSUSP, CRPRNT, CFLUSH, CWERASE, CLNEXT};
+    int        lset =
+       (LCRTBS|LCRTERA|LCRTKIL|LCTLECH|LPENDIN|LDECCTQ);
+    int        setd = NTTYDISC;
+    
+    strcpy(device, PTY_TEMPLATE); // string constants are not writable
+    blockLoc = &device[ strlen("/dev/pty") ];
+    numLoc = &device[ strlen("/dev/pty?") ];
+    msLoc = &device[ strlen("/dev/") ];
+    for (block = "pqrs"; *block; block++)
+    {
+       *blockLoc = *block;
+       for (num = "0123456789abcdef"; *num; num++)
+       {
+           *numLoc = *num;
+           *master = open(device, O_RDWR);
+           if (*master >= 0)
+           {
+               *msLoc = 't';
+               *slave = open(device, O_RDWR);
+               if (*slave >= 0)
+               {
+                   (void) ioctl(*slave, TIOCSETP, (char *)&setp);
+                   (void) ioctl(*slave, TIOCSETC, (char *)&setc);
+                   (void) ioctl(*slave, TIOCSETD, (char *)&setd);
+                   (void) ioctl(*slave, TIOCSLTC, (char *)&sltc);
+                   (void) ioctl(*slave, TIOCLSET, (char *)&lset);
+                   return;
+               } else {
+                   // close the master and reset the device
+                   // name so that the master opens it properly
+                   *msLoc = 'p';
+                   close(*master);
+               }
+           }
+       } /* hunting through a bank of ptys */
+    } /* hunting through blocks of ptys in all the right places */
+    *master = -1;
+    *slave = -1;
+}
+
+
address@hidden Subprocess
+
+/*==========================================================
+ *
+ * Public Instance Methods
+ *
+ *==========================================================*/
+
+- init:(const char *)subprocessString
+    // a cover for the below withDelegate:nil, andPtySupport:NO, andStdErr:YES
+{
+    return
+       [self
+           init:subprocessString
+           withDelegate:nil
+           andPtySupport:NO
+           andStdErr:YES];
+}
+
+- init:(const char *)subprocessString
+    withDelegate:theDelegate
+    andPtySupport:(BOOL)wantsPty
+    andStdErr:(BOOL)wantsStdErr
+    // initializes an instance of Subprocess and corresponding UNIX process
+{
+    int pipeTo[2];             // for non-Pty support
+    int pipeFrom[2];
+    int        tty, numFds, fd;        // for temporary use
+    int processGroup;
+    int pidChild;              // needed because childPid does not exist
+                               // until Subprocess is instantiated
+
+    if (wantsPty)
+    {
+       tty = open("/dev/tty", O_RDWR);
+       getptys(&masterPty,&slavePty);
+       if (masterPty <= 0 || slavePty <= 0)
+       {
+           showError("Error grabbing ptys for subprocess.", theDelegate);
+           return self;
+       }
+       // remove the controlling tty if launched from a shell,
+       // but not Workspace;
+       // so that we have job control over the parent application in shell
+       // and so that subprocesses can be restarted in Workspace
+       if  ((tty<0) && ((tty = open("/dev/tty", 2))>=0))
+       {
+           ioctl(tty, TIOCNOTTY, 0);
+           close(tty);
+       }
+    }
+    else
+    {
+       if (pipe(pipeTo) < 0 || pipe(pipeFrom) < 0)
+       {
+           showError("Error starting UNIX pipes to subprocess.", theDelegate);
+           return self;
+       }
+    }
+    
+    switch (pidChild = vfork())
+    {
+    case -1:   // error
+       showError("Error starting UNIX vfork of subprocess.", theDelegate);
+       return self;
+
+    case 0:    // child
+       if (wantsPty)
+       {
+           dup2(slavePty, 0);
+           dup2(slavePty, 1);
+           if (wantsStdErr)
+               dup2(slavePty, 2);
+       }
+       else
+       {
+           dup2(pipeTo[0], 0);
+           dup2(pipeFrom[1], 1);
+           if (wantsStdErr)
+               dup2(pipeFrom[1], 2);
+       }
+       
+       numFds = getdtablesize();
+       for (fd=3; fd<numFds; fd++)
+           close(fd);
+
+       processGroup = getpid();
+       ioctl(0, TIOCSPGRP, (char *)&processGroup);
+       setpgrp (0, processGroup);
+       
+       // we exec a /bin/sh so that cmds are easier to specify for the user
+       execl("/bin/sh", "sh", "-c", subprocessString, 0);
+       perror("vfork (child)"); // should never gets here tho
+       exit(1);
+
+    default:   // parent
+       [self setDelegate:theDelegate];
+       childPid = pidChild;
+
+       if (wantsPty)
+       {
+           close(slavePty);
+           
+           fpToChild = fdopen(masterPty, "w");
+           fromChild = masterPty;
+       }
+       else
+       {
+           close(pipeTo[0]);
+           close(pipeFrom[1]);
+    
+           fpToChild = fdopen(pipeTo[1], "w");
+           fromChild = pipeFrom[0];
+       }
+
+       setbuf(fpToChild, NULL);
+       DPSAddFD(
+           fromChild,
+           (DPSFDProc)fdHandler,
+           (id)self,
+           NX_MODALRESPTHRESHOLD+1);
+       return self;
+    }
+}
+
+- send:(const char *)string withNewline:(BOOL)wantNewline
+{
+    fputs(string, fpToChild);
+    if (wantNewline)
+        fputc('\n', fpToChild);
+    return self;
+}
+
+- send:(const char *)string
+{
+    [self send:string withNewline:YES];
+    return self;
+}
+
+- terminateInput
+    // effectively sends an EOF to the child process stdin
+{
+    fclose(fpToChild);
+    return self;
+}
+
+- terminate:sender
+{
+    if (childPid)
+    {
+       //kill(childPid+1, SIGTERM);
+       killpg(childPid, SIGTERM);
+       [self childDidExit];
+    }
+    return self;
+}
+
+- setDelegate:anObject
+{
+    delegate = anObject;
+    return self;
+}
+
+- delegate
+{
+    return delegate;
+}
+
address@hidden
diff --git a/test/etags/objcpp-src/SimpleCalc.H 
b/test/etags/objcpp-src/SimpleCalc.H
new file mode 100644
index 0000000..121ae6b
--- /dev/null
+++ b/test/etags/objcpp-src/SimpleCalc.H
@@ -0,0 +1,49 @@
+//
+//     SimpleCalc -- Randy Nelson -- NeXT Developer Training
+//     A general class that serves as a liaison between a calculator interface
+//     and a calculator engine.
+//
+//  You may freely copy, distribute and reuse the code in this example.
+//  NeXT disclaims any warranty of any kind, expressed or implied, as to
+//  its fitness for any particular use.
+//
+//     Created 8-8-90
+//
+#import <objc/Object.h>
+
address@hidden SimpleCalc:Object
+{
+    // outlets...the front-end.
+    id                         display;
+    id                 enterKey;
+    id                 minusKey;
+    id                 infoManager;
+    id                 myNXStringTable;
+
+    // C++ object's can be a-part-of Objective-C objects.
+    class CalcEngine   *cplus_object;  
+
+    // record each previous user action
+    SEL                        previousAction;
+}
+
+// actions.
+
+- numberKeys:sender;
+- decimalKey:sender;
+- operationKeys:sender;
+- equalsKey:sender;
+- clearKey:sender;
+- clearAllKey:sender;
+- infoPanel:sender;
+- helpPanel:sender;
+
+// delegate methods.
+
+- windowWillClose:sender;
+- appDidInit:sender;
+
+- registerAction:(SEL)action;
+- appendToDisplay:(const char *)theString;
+
address@hidden
diff --git a/test/etags/objcpp-src/SimpleCalc.M 
b/test/etags/objcpp-src/SimpleCalc.M
new file mode 100644
index 0000000..34846a7
--- /dev/null
+++ b/test/etags/objcpp-src/SimpleCalc.M
@@ -0,0 +1,207 @@
+//     SimpleCalc -- Randy Nelson -- NeXT Developer Training
+//     A general class that serves as a liaison between a calculator interface
+//     and a calculator engine.
+//
+//     You may freely copy, distribute and reuse the code in this example.
+//     NeXT disclaims any warranty of any kind, expressed or implied, as to
+//     its fitness for any particular use.
+//
+//     Created 8-22-90
+//
+//     C++ "linkage" directive - tells the C++ compiler that the following 
+//     interface files contain Objective-C code.
+
+extern "Objective-C"           
+{                              
+#import <appkit/Application.h>
+#import <appkit/Panel.h>
+#import <appkit/TextField.h>
+#import <appkit/Button.h>
+}
+
+extern "C"
+{
+#import <appkit/publicWraps.h>
+#import <objc/error.h>
+#import <objc/NXStringTable.h>
+#import <strings.h>
+}
+
+//     The C++ "linkage" directive serves two purposes (when importing
+//     interface files that contain straight ANSI-C/Objective-C code). It:
+//
+//     (a) allows you to link with libraries that have not been compiled with
+//     the C++ compiler. Since libraries on the NeXT computer are compiled 
+//     with the Objective-C compiler (cc, not cc++), you must use the C++ 
+//     linkage directive when importing interface files that represent NeXT 
+//     libraries (or any library that is not compiled with cc++). 
+//
+//     (b) tells the compiler to ignore C++ keywords that will result in
+//     syntax errors when importing ANSI-C/Objective-C interface files. 
+//     The linkage directive essentially tells the C++ compiler to treat 
+//     keywords (such as "new", "delete", etc.) as normal identifiers.
+
+#import "SimpleCalc.h"
+#import "CalcEngine.h"
+#import "InfoManager.h"
+
address@hidden SimpleCalc
+
+// Initialize an instance of the SimpleCalc class.  One instance variable of
+// that class is the C++ calculator engine.
+- init
+{
+    cplus_object = new CalcEngine; // new is a keyword in C++.
+    previousAction = 0; 
+    return self;
+}
+
+// Append a new digit entered by the user to the text field display.
+- appendToDisplay:(const char *)theDigit
+{
+    char *copyOfDisplay = NXCopyStringBuffer([display stringValue]);
+
+    [display setStringValue: strcat(copyOfDisplay, theDigit)];
+
+    return self;
+}
+
+// We need to keep a history of one action to make decisions about the display.
+- registerAction:(SEL)action
+{
+    previousAction = action;
+    return self;
+}
+
+// The user has pushed the decimal key on the calculator.
+- decimalKey:sender
+{
+    if (previousAction == @selector(operationKeys:))
+       [display setStringValue:"."];
+    else {
+       if (strchr([display stringValue], '.'))
+           NXBeep();
+       else 
+           [self appendToDisplay:"."];
+    }
+    return [self registerAction:_cmd];
+}
+
+// One of the number keys was selected by the user.
+- numberKeys:sender
+{      
+    char aDigit[2];
+    int digit = [sender selectedTag];
+
+    sprintf(aDigit, "%d", digit);
+
+    if (previousAction == @selector(operationKeys:) ||
+       previousAction == @selector(equalsKey:))
+    {
+       [display setStringValue:aDigit];
+    } else {
+       if ([display doubleValue] == 0 && !strchr([display stringValue], '.'))
+           [display setStringValue:aDigit];
+       else
+           [self appendToDisplay:aDigit];
+    }
+    return [self registerAction:_cmd];
+}
+
+// The user pressed the equals key on the calculator interface.
+- equalsKey:sender
+{
+    if (previousAction == 0) 
+       NXBeep();
+    else {
+       NX_DURING
+           [display setDoubleValue:
+               cplus_object->equalsKey([display doubleValue])];
+       NX_HANDLER
+           NXRunAlertPanel(
+               [myNXStringTable valueForStringKey:"operationFailed"], 
+               [myNXStringTable valueForStringKey:NXLocalHandler.data1],
+               [myNXStringTable valueForStringKey:"OK"], NULL, NULL);
+       NX_ENDHANDLER
+    }
+    return [self registerAction:_cmd];
+}
+
+// The user pressed one of the operation keys.
+- operationKeys:sender
+{
+    if (previousAction == 0) 
+       NXBeep();
+    else if (previousAction == @selector(operationKeys:)) 
+       cplus_object->setOperation([sender selectedTag]);
+    else {
+       NX_DURING
+           [display setDoubleValue:
+               cplus_object->operationKeys([sender selectedTag],
+                                           [display doubleValue])];
+       NX_HANDLER
+           NXRunAlertPanel(
+               [myNXStringTable valueForStringKey:"operationFailed"], 
+               [myNXStringTable valueForStringKey:NXLocalHandler.data1],
+               [myNXStringTable valueForStringKey:"OK"], NULL, NULL);
+       NX_ENDHANDLER
+    }
+    return [self registerAction:_cmd];
+}
+
+// User pressed the Clear key.
+- clearKey:sender
+{
+    [display setStringValue:"0"];
+    return self;
+}
+
+// User pressed the Clear All key.
+- clearAllKey:sender
+{
+    cplus_object->clear();
+    [self registerAction:0];
+    return [self clearKey:sender];
+}
+
+// Called just after the application initializes and starts up.
+- appDidInit:sender
+{      
+    // Set the Enter key on the keypad to be equivalent to the = key.
+    [[display window] addToEventMask:NX_SYMBOLSET];
+    [enterKey setKeyEquivalent:3];
+    [[display window] makeKeyAndOrderFront:self];
+    return self;
+}
+
+// Called just before the window closes.
+- windowWillClose:sender
+{
+    return [NXApp terminate:self];
+}
+
+// Brings up the Info panel.   Not done on startup because it's in a separate
+// interface file.  Saves startup time for the user if we do this when they ask
+// for it, and not before.
+- infoPanel:sender
+{
+    if(infoManager == nil){
+       infoManager = [[InfoManager alloc] init];
+    }
+    [infoManager orderInfoPanelFront:sender];
+    return self;       
+}
+
+// Brings up the Help panel.   Not done on startup because it's in a separate
+// interface file.  Saves startup time for the user if we do this when they ask
+// for it, and not before.
+- helpPanel:sender
+{
+    if(infoManager == nil){
+       infoManager = [[InfoManager alloc] init];
+    }
+    [infoManager orderHelpPanelFront:sender];
+    return self;       
+}
+
address@hidden
diff --git a/test/etags/pas-src/common.pas b/test/etags/pas-src/common.pas
new file mode 100644
index 0000000..ec8e80c
--- /dev/null
+++ b/test/etags/pas-src/common.pas
@@ -0,0 +1,1545 @@
+#include "common.i"
+#include "common.h"
+
+type
+  NSPoolP = ^NSPoolRec;
+  NSPoolRec = record
+    Data: NameStringPointer;
+    Next: NSPoolP;
+  end;
+
+var
+  GlobalNSPool: record
+    Avail, Empty: NSPoolP;
+  end;
+
+var
+  AvailString : TextString;
+  NameList : BinNodePointer;  
+  AvailNameList : BinNodePointer;  
+
+
+
+(*------------------------------------------------------------------*) 
+(*                    InitializeStringPackage                       *) 
+(*------------------------------------------------------------------*) 
+procedure InitializeStringPackage;
+begin (* InitializeStringPackage *) 
+  AvailString := nil;
+end; (* InitializeStringPackage *) 
+
+(*------------------------------------------------------------------*) 
+(*                    newtextstring                                 *) 
+(*------------------------------------------------------------------*) 
+function newtextstring; (*: TextString;*)
+var
+  Temp : TextString;
+begin (* newtextstring *) 
+  if AvailString = nil then
+    new (Temp)
+  else begin
+    Temp := AvailString;
+    AvailString := Temp^.Next;
+  end;
+  Temp^.String.Length := 0;
+  Temp^.Next := nil;
+  newtextstring := Temp;
+end; (* newtextstring *) 
+
+(*------------------------------------------------------------------*) 
+(*                    disposetextstring                             *) 
+(*------------------------------------------------------------------*) 
+procedure disposetextstring;(*(
+  var S : TextString);*)
+var
+  Temp : TextString;
+  Temp2 : TextString;
+begin (* disposetextstring *) 
+  if S <> nil then begin
+    Temp := S;
+(*
+    while Temp^.Next <> nil do
+      Temp := Temp^.Next;
+    Temp^.Next := AvailString;
+    AvailString := S;
+*)
+    S := nil;
+    repeat
+      Temp2 := Temp^.Next;
+      dispose(Temp);
+      Temp := Temp2;
+    until Temp = nil;
+   end;
+end; (* disposetextstring *) 
+
+(*------------------------------------------------------------------*) 
+(*                    ConcatT                                       *) 
+(*------------------------------------------------------------------*) 
+function ConcatT;(*(
+  ToString : TextString;
+  S        : TextString) : TextString;*)
+var
+  Index : integer;
+begin (* ConcatT *) 
+  ConcatT := ToString;
+  if ToString = nil then
+    writeln (output, 'Error in ConcatT, ToString is nil')
+  else
+    if S = nil then
+      writeln (output, 'Error in ConcatT, S is nil')
+    else
+      if S^.Next <> nil then
+        writeln (output,
+          'Error in ConcatT, S contains several linked TextStrings')
+      else begin
+        while ToString^.Next <> nil do
+          ToString := ToString^.Next;
+        if ToString^.String.Length+S^.String.Length > NameStringLength then 
begin
+          ToString^.Next := newtextstring;
+          ToString := ToString^.Next;
+        end;
+        with ToString^, String do begin
+          for Index := 1 to S^.String.Length do
+            Value[Length+Index] := S^.String.Value[Index];
+          Length := Length+S^.String.Length;
+        end;
+      end;
+end; (* ConcatT *) 
+
+(*------------------------------------------------------------------*) 
+(*                    AppendTextString                              *) 
+(*------------------------------------------------------------------*) 
+function AppendTextString;(*(
+  ToString : TextString;
+  S        : TextString) : TextString;*)
+begin (* AppendTextString *) 
+  AppendTextString := ToString;
+  if ToString = nil then
+    writeln (output, 'Error in AppendTextString, ToString is nil')
+  else
+    if S = nil then
+      writeln (output, 'Error in AppendTextString, S is nil')
+    else begin
+      while ToString^.Next <> nil do
+        ToString := ToString^.Next;
+      ToString^.Next := S;
+    end;
+end; (* AppendTextString *) 
+
+(*------------------------------------------------------------------*) 
+(*                    CopyTextString                                *) 
+(*------------------------------------------------------------------*) 
+function CopyTextString;(*(
+  S : TextString
+  ) : TextString;*)
+var
+  Temp : TextString;
+begin   (* CopyTextString *) 
+  if S <> nil then begin
+    Temp := newtextstring;
+    Temp^.String := S^.String;
+    Temp^.Next := CopyTextString(S^.Next);
+    CopyTextString := Temp;
+  end
+  else
+    CopyTextString := nil;
+end;    (* CopyTextString *) 
+
+(*------------------------------------------------------------------*)
+(*                    CONVERT_CHARSTRING_TO_VALUE                   *)
+(*------------------------------------------------------------------*)
+procedure CONVERT_CHARSTRING_TO_VALUE;(*(
+      S : NameString;
+  var V : NameString);*)
+var
+  Pos : integer;
+  VPos : integer;
+  Ch : char;
+begin (* CONVERT_CHARSTRING_TO_VALUE *)
+  VPos := 0;
+  for Pos := 2 to S.Length - 1 do begin
+    Ch := S.Value[Pos];
+    if not ((Ch = '''') and (Pos > 2) and (S.Value[Pos - 1] = '''')) then
+      VPos := VPos + 1;
+    V.Value[VPos] := Ch;
+  end;
+  V.Length := VPos;
+end; (* CONVERT_CHARSTRING_TO_VALUE *)
+
+(*------------------------------------------------------------------*)
+(*                    append_string                                 *)
+(*------------------------------------------------------------------*)
+procedure append_string;(*(
+  var Txt    : TextString;
+  var String : NameString);*)
+var
+  Temp : TextString;
+begin (* append_string *)
+  Temp := newtextstring;
+  Temp^.String := String;
+  if Txt = nil then
+    Txt := Temp
+  else
+    Txt := AppendTextString(Txt, Temp);
+end; (* append_string *)
+
+function To_Upper;(*(ch:char) : char;*)
+begin
+  if ch in ['a'..'z'] then
+    To_Upper := chr(ord(ch) + ord('A')-ord('a'))
+  else
+    To_Upper := ch;
+end;
+
+function To_Lower;(*(ch:char) : char;*)
+begin
+  if ch in ['A'..'Z'] then
+    To_Lower := chr(ord(ch) - ord('A') + ord('a'))
+  else
+    To_Lower := ch;
+end;
+
+(*----------------------------------------------------------------------*)
+(*              Operations on NameString                                *)
+(*----------------------------------------------------------------------*)
+
+(*------------------------------------------------------------------*)
+(*                    EmptyNmStr                                    *)
+(*------------------------------------------------------------------*)
+function EmptyNmStr(* : NameString*);
+var
+  Nm : NameString;
+begin   (* EmptyNmStr *)
+  Nm.Length := 0;
+  EmptyNmStr := Nm;
+end;    (* EmptyNmStr *)
+
+
+(* returns a namestring containing one character, the inparameter Ch *)
+function chartonmstr; (*(
+  Ch : Char) : NameString; *)
+var
+  String : NameString;
+begin
+  String.Value[1] := Ch;
+  String.Length := 1;
+  chartonmstr := String;
+end;
+
+(* returns a namestring containing the inparameter Str in lowercase letters *)
+function LowerCaseNmStr; (*(
+  Str : NameString) : NameString; *)
+var
+  i : integer;
+begin (* LowerCaseNmStr *)
+  with Str do
+    for i := 1 to Length do
+      Value[i] := To_Lower(Value[i]);
+  LowerCaseNmStr := Str;
+end; (* LowerCaseNmStr *)
+
+(* returns a namestring containing inparameter S1 concatenated with inpar. S2 
*)
+function concatenatenamestrings; (*(
+  S1 : NameString;
+  S2 : NameString) : NameString; *)
+var
+  Temp : NameString;
+  Pos : integer;
+begin (* concatenatenamestrings *)
+  Temp := S1;
+  with Temp do begin
+    Pos := 0;
+    while Pos < S2.Length do begin
+      Pos := Pos + 1;
+      if Length < NameStringLength then begin
+        Length := Length + 1;
+        Value[Length] := S2.Value[Pos];
+      end;
+    end; (* while *)
+  end; (* with *)
+  concatenatenamestrings := Temp;
+end; (* concatenatenamestrings *)
+
+procedure writenamestring;(*(
+  var TextFile : text;
+  var Name     : NameString);*)
+var
+  Pos : integer;
+begin
+  with Name do
+    for Pos := 1 to Length do
+      write(TextFile, Value[Pos]);
+end;
+
+(*------------------------------------------------------------------*)
+(*                    IsControlChar                                 *)
+(*------------------------------------------------------------------*)
+function IsControlChar; (*(
+  Ch : char) : boolean; *)
+begin (* IsControlChar *)
+  IsControlChar := ord(Ch) in [0..32, 127];
+end; (* IsControlChar *)
+
+function namestringequal;(*(var Name1,Name2 : NameString) : Boolean;*)
+var i : Integer;
+    equal : Boolean;
+begin
+  if Name1.Length = Name2.Length then begin
+    equal := true;
+    i := 1;
+    while (i <= Name1.Length) and equal do begin
+       equal := To_Upper(Name1.Value[i]) = To_Upper(Name2.Value[i]);
+       i := i + 1;
+    end;
+    namestringequal := equal;
+  end 
+  else
+    namestringequal := false;
+end;
+
+(* Character strings are case sensitive *)
+
+function NameStringLess;(*(var Name1,Name2 : NameString) : Boolean;*)
+var i, minlength : Integer;
+    equal : Boolean;
+    C1, C2 : char;
+    Charstring : boolean;
+begin
+  C1 := ' ';
+  C2 := ' ';
+  if Name1.Length < Name2.Length then
+    minlength := Name1.Length 
+  else
+    minlength := Name2.Length;
+  if MinLength > 0 then
+    Charstring := (Name1.Value[1] = '''') or (Name2.Value[1] = '''')
+  else
+    Charstring := false;
+(*   Charstring := true; force case sensitive *)
+  i := 1;
+  equal := true;
+  if i <= minlength then
+    while (i <= minlength) and equal do begin
+      if Charstring then begin
+        C1 := Name1.Value[i];
+        C2 := Name2.Value[i];
+      end
+      else begin
+        C1 := To_Upper(Name1.Value[i]);
+        C2 := To_Upper(Name2.Value[i]);
+      end;
+      equal := C1 = C2;
+      i := i + 1;
+    end; (* while *)
+  if equal then
+    NameStringLess := Name1.Length < Name2.Length
+  else 
+    NameStringLess := C1 < C2;
+end;
+
+(*------------------------------------------------------------------*)
+(*                    IsControlCharName                             *)
+(*------------------------------------------------------------------*)
+function IsControlCharName(
+  Str : NameString;
+  Pos : integer) : boolean;
+begin (* IsControlCharName *)
+  with Str do begin
+    if Pos <= Length then
+      IsControlCharName := IsControlChar(Value[Pos])
+    else
+      IsControlCharName := false;
+  end;
+end; (* IsControlCharName *)
+
+(*------------------------------------------------------------------*)
+(*                    SubString                                     *)
+(*------------------------------------------------------------------*)
+function SubString; (*(
+  Str : NameString;
+  Start : integer;
+  Len : integer) : NameString; *)
+var
+  i : integer;
+begin (* SubString *)
+  with Str do begin
+    if Len > 0 then
+      for i := Start to Start + Len - 1 do
+        Value[i- Start + 1] := Value[i]
+    else if Len < 0 then
+      Len := 0;
+    Length := Len;
+  end;
+  SubString := Str;
+end; (* SubString *)
+
+(*------------------------------------------------------------------*)
+(*                    SkipChars                                     *)
+(*------------------------------------------------------------------*)
+function SkipChars; (*(
+  Str : NameString;
+  Start : integer;
+  Len : integer) : NameString; *)
+var
+  i : integer;
+begin (* SkipChars *)
+  with Str do begin
+    for i := Start to Length - Len do
+      Value[i] := Value[i + Len];
+    Length := Length - Len;
+  end;
+  SkipChars := Str;
+end; (* SkipChars *)
+
+(*------------------------------------------------------------------*)
+(*                    RemoveUnderlineControl                        *)
+(*------------------------------------------------------------------*)
+function RemoveUnderlineControl; (*(
+      Str : NameString) : NameString; *)
+var
+  Len : integer;
+  i : integer;
+  Start : integer;
+begin (* RemoveUnderlineControl *)
+  with Str do begin
+    i := 1;
+    while i <= Length do begin
+      if Value[i] = '_' then begin
+        Len := 0;
+        Start := i;
+        while IsControlCharName(Str, i + 1 + Len) do
+          Len := Len + 1;
+        if Len > 0 then
+          Str := SkipChars(Str, Start, Len + 1)
+        else
+          i := i + 1;
+      end
+      else
+        i := i + 1;
+    end; (* while *)
+  end; (* with *)
+  RemoveUnderlineControl := Str;
+end; (* RemoveUnderlineControl *)
+
+(*------------------------------------------------------------------*)
+(*                    First100Chars                                 *)
+(*------------------------------------------------------------------*)
+procedure First100Chars; (*(
+      Txt : TextString;
+  var Str : NameString;
+  var Truncated : boolean); *)
+var
+  Len : integer;
+  i : integer;
+begin (* First100Chars *)
+  Str.Length := 0;
+  if Txt <> nil then begin
+    Str := Txt^.String;
+    Txt := Txt^.Next;
+  end;
+  while (Txt <> nil) and (Str.Length < NameStringLength) do
+    with Txt^, String do begin
+      Str.Length := Str.Length + 1;
+      Str.Value[Str.Length] := ' ';
+      if Str.Length + Length <= NameStringLength then
+        Len := Str.Length + Length
+      else
+        Len := NameStringLength;
+      for i := Str.Length + 1 to Len do
+        Str.Value[i] := Value[i - Str.Length];
+      Str.Length := Len;
+      Txt := Txt^.Next;
+    end; (* while with *)
+  Truncated := Txt <> nil;
+end; (* First100Chars *)
+
+
+(*------------------------------------------------------------------*)
+(*                    SkipSpaces                                    *)
+(*------------------------------------------------------------------*)
+(* changes I to contain the first index in Str (starting at I) that *)
+(* is not a space                                                   *)
+procedure SkipSpaces; (* (Str : NameString; var I : Integer);*)
+var Stop : boolean;
+begin   (* SkipSpaces *)
+  Stop := false;
+  while (I < Str.Length) and not Stop do
+    if Str.Value[I] <> ' ' then
+      Stop := true
+    else
+      I := I+1; 
+end;    (* SkipSpaces *)
+
+
+(*------------------------------------------------------------------*)
+(*                    SkipBlanks                                    *)
+(*------------------------------------------------------------------*)
+function SkipBlanks; (*(
+  TextLine: NameString) : NameString; *)
+var
+  i : integer;
+  j : integer;
+  SpaceFound : boolean;
+begin (* SkipBlanks *)
+  with TextLine do begin
+    SpaceFound := true;
+    i := 1;
+    while SpaceFound and (i <= Length) do begin
+      SpaceFound := (Value[i] in [' ', chr(9)]);
+      if SpaceFound then
+        i := i + 1;
+    end; (* while *)
+    i := i - 1;
+    if i > 0 then
+      for j := 1 to Length - i do
+        if j <= Length - i then
+          Value[j] := Value[j + i];
+    Length := Length - i;
+  end; (* with *)
+  SkipBlanks := TextLine;
+end; (* SkipBlanks *)
+
+(*------------------------------------------------------------------*)
+(*                    stripname                                     *)
+(*------------------------------------------------------------------*)
+function stripname; (* (
+  TextLine: NameString) : NameString; *)
+var
+  SpaceFound : boolean;
+begin (* stripname *)
+  TextLine := SkipBlanks(TextLine);
+  with TextLine do begin
+    SpaceFound := true;
+    while SpaceFound and (Length > 0) do begin
+      SpaceFound := (Value[Length ] in [' ', chr(9)]);
+      if SpaceFound then
+        Length := Length - 1;
+    end; (* while *)
+  end; (* with *)
+  stripname := TextLine;
+end; (* stripname *)
+
+function Locate; (*(
+ Str : NameString;
+ Chars : SetOfChar) : integer; *)
+var
+  Pos : integer;
+  Found : boolean;
+begin (* Locate *)
+  Found := false;
+  Pos := 0;
+  with Str do
+    while not Found and (Pos < Length) do begin
+      Pos := Pos + 1;
+      Found := Value[Pos] in Chars;
+    end;
+  Locate := Pos;
+end; (* Locate *)
+
+
+(*------------------------------------------------------------------*)
+(*                    NameHasChar                                   *)
+(*------------------------------------------------------------------*)
+function NameHasChar; (* (TheName : NameString; TheChar : char) : boolean;*)
+var i : integer;
+    found : boolean;
+    
+begin   (* NameHasChar *)
+  found := false;
+  i := 0;
+  while not found and (i < TheName.Length) do begin
+    i := i+1;
+    found := TheName.Value[i] = TheChar;
+  end;
+  NameHasChar := found;
+end;    (* NameHasChar *)
+
+
+(*------------------------------------------------------------------*)
+(*                    integertonmstr                                *)
+(*------------------------------------------------------------------*)
+function integertonmstr; (* (TheInteger : integer) : NameString; *)
+var Nm : NameString;
+    Index,
+    Size,
+    TempNumber : integer;
+begin   (* integertonmstr *)
+  Size := 1;
+  TempNumber := TheInteger;
+  while TempNumber div 10 > 0 do begin
+    Size := Size + 1;
+    TempNumber := TempNumber div 10;
+  end;
+  Nm.Length := Size;
+  TempNumber := TheInteger;
+  for Index := Size downto 1 do begin
+    Nm.Value[Index] := chr(TempNumber mod 10 + ord('0'));
+    TempNumber := TempNumber div 10;
+  end;
+  integertonmstr := Nm;
+end;    (* integertonmstr *)
+
+(*------------------------------------------------------------------*)
+(*                    NmStrToInteger                                *)
+(*------------------------------------------------------------------*)
+function NmStrToInteger; (* (Str : NameString) : integer; *)
+var
+  Index : integer;
+  Numb : integer;
+  Max : integer;
+begin   (* NmStrToInteger *)
+ Max := (maxint div 10) - 10;
+ Numb := 0;
+  for Index := 1 to Str.Length do begin
+    if (Numb <= Max) and (Str.Value[Index] in ['0'..'9']) then
+      Numb := 10 * Numb + ord(Str.Value[Index]) - ord('0');
+  end;
+  NmStrToInteger := Numb;
+end;    (* NmStrToInteger *)
+
+function AddNullToNmStr; (*(
+  Nm : NameString) : NameString; *)
+begin (* AddNullToNmStr *)
+  with Nm do
+    if Length < NameStringLength then
+      Value[Length + 1] := chr(0)
+    else
+      Value[Length] := chr(0);
+  AddNullToNmStr := Nm;
+end; (* AddNullToNmStr *)
+
+function ValToNmStr; (*(
+  Nm : NameString) : NameString; *)
+begin (* ValToNmStr *)
+  with Nm do begin
+    length := 0;
+    while value[length + 1] <> chr(0) do
+      length := length + 1;
+  end;
+  ValToNmStr := Nm;
+end; (* ValToNmStr *)
+
+(*------------------------------------------------------------------*)
+(*                    ChangeFileType                                *)
+(*------------------------------------------------------------------*)
+function ChangeFileType; (*(FileName : NameString;
+  NewType : NameString) : NameString;*)
+var
+  Pos : integer;
+  Found : boolean;
+begin (* ChangeFileType *)
+  with Filename do begin
+    Pos := FileName.Length;
+    Found := false;
+    while not Found and (Pos > 0) do begin
+      Found := Value[Pos] = '.';
+      Pos := Pos - 1;
+    end;
+    if Found then
+      Length := Pos;
+  end; (* with *)
+  ChangeFileType := concatenatenamestrings(FileName, NewType);
+end; (* ChangeFileType*)
+
+(*------------------------------------------------------------------*)
+(*                    StripPath                                     *)
+(*------------------------------------------------------------------*)
+function StripPath; (*(
+      Str : NameString) : NameString; *)
+var
+  i : integer;
+  Len : integer;
+  Found : boolean;
+begin (* StripPath *)
+  with Str do begin
+    i := Length;
+    Found := false;
+    while not Found and (i > 0) do begin
+      Found := Value[i] in  ['/', '\'];
+      if not Found  then
+        i := i - 1;
+    end; (* while *)
+    if Found then begin
+      Len := Length - i + 1;
+      if i < Length then begin
+        i := i + 1;
+        Len := Len - 1;
+      end;
+      StripPath := SubString(Str, i, Len);
+    end
+    else
+      StripPath := Str;
+  end; (* with *)
+end; (* StripPath *)
+
+function ReprOfChar; (*( ch : char) : NameString;*)
+var
+  Repr : NameString;
+begin
+  if (ch >= ' ') and (ch <= '~') then
+    Repr := chartonmstr(ch)
+  else
+    Repr := concatenatenamestrings(concatenatenamestrings(chartonmstr('<'),
+              integertonmstr(ord(ch))), chartonmstr('>'));
+  ReprOfChar := Repr;
+end; (* ReprOfChar *)
+
+(*------------------------------------------------------------------*) 
+(*                    ExtractCommentInfo                            *) 
+(*------------------------------------------------------------------*) 
+(* check if Comment contains graphic reference or include directive *)
+(* /*#<graphref>*/ or /*#<include-dir>*/                            *)
+(*    <graphref>    =G pagename xcoord ycoord                       *)
+(*                   T pagename xcoord ycoord                       *)
+(*                   M diagramtype diagramname pagename xcoord ycoord *)
+(*                   D databankname                                 *)
+(*    <include-dir> =INCLUDE 'filename'                             *)
+(* InfoType will contain the type of the comment                    *)
+(* Info will contain <graphref> or the filename in <include-dir> if *)
+(* the Comment isn't an ordinary comment                            *)
+(* /*#E*/ do not count this line                                    *)
+(* /*#S*/ substructure generated from graphic short hand            *)
+procedure ExtractCommentInfo; (*(
+  var Comment, 
+      Info     : NameString; 
+  var InfoType : TypeOfComment); *)
+
+const
+  CommentMarkLength = 2;
+  IncludeMarkLength = 7;  (* = INCLUDE *) 
+  GRRefLen = 6;
+var StartIndex,
+    Index : integer;
+begin   (* ExtractCommentInfo *) 
+  Info.Length := 0;
+  with Comment do begin
+    InfoType := Ordinary;
+    StartIndex := CommentMarkLength + 1;
+    if Length > StartIndex then
+      if Value[StartIndex] = '#' then
+        if Value[StartIndex+1] in ['I','i', 'S'] then begin
+          if (Value[StartIndex+1] = 'S') and (Length = StartIndex+1+2) then
+            InfoType := SubstrShortHand
+          else if (Value[StartIndex+1] = 'S') and
+            (Length > StartIndex + GRRefLen) then begin
+              if Value[StartIndex+2] = 'D' then
+                if Value[StartIndex+3] = 'T' then
+                  if Value[StartIndex+4] = 'R' then
+                    if Value[StartIndex+5] = 'E' then
+                      if Value[StartIndex+6] = 'F' then
+                        InfoType := GRRef;
+            end
+          else begin
+            if Length > StartIndex + IncludeMarkLength then
+              if Value[StartIndex+2] in ['N','n'] then
+                if Value[StartIndex+3] in ['C','c'] then
+                  if Value[StartIndex+4] in ['L','l'] then
+                   if Value[StartIndex+5] in ['U','u'] then
+                     if Value[StartIndex+6] in ['D','d'] then
+                       if Value[StartIndex+7] in ['E','e'] then
+                         InfoType := IncludeClause;
+          end;
+        end;
+
+    if InfoType = IncludeClause then begin
+      InfoType := Ordinary;
+      StartIndex := StartIndex + IncludeMarkLength + 1;
+      if StartIndex+3 <= Length-2 then (* excluding the comment-end '*/' *) 
begin
+        if Value[StartIndex] = ' ' then begin
+          while (StartIndex <= Length-2) and (Value[StartIndex] = ' ') do 
+            StartIndex := StartIndex + 1;           (* Skip the spaces *)
+          if Value[StartIndex] = '''' then begin
+            Index := StartIndex+1;
+            while (Index <= Length-2) and (Value[Index] <> '''') do begin
+              Info.Value[Index-StartIndex] := Value[Index];
+              Index := Index + 1;
+            end;
+            if Value[Index] = '''' then begin
+              Info.Length := Index - StartIndex - 1;
+              Index := Index + 1;
+              while (Index <= Length-2) and (Value[Index] = ' ') do 
+                Index := Index + 1;           (* Skip the ending spaces *)
+              if Index = Length-1 then
+                InfoType := IncludeClause;  (* => a correct include directive 
*)
+            end;
+          end;
+        end;
+      end;
+    end
+    else if InfoType = SubstrShortHand then
+      Info := chartonmstr('S')
+    else if InfoType = GRRef then begin
+      if (Value[Length] = '/') and (Value[Length - 1] = '*') then
+        Info := SubString(Comment, StartIndex, Length - StartIndex + 1 - 2)
+      else (* truncated *)
+        Info := SubString(Comment, StartIndex, Length - StartIndex + 1);
+    end;
+  end;
+end;    (* ExtractCommentInfo *) 
+
+(*---------------------------------------------------------------------------*)
+(* inserts a node in a binary tree sorted after value. If node 
+   is in tree Found returns true.  *)
+
+procedure INSERT_TREE_NODE;(*( 
+            New_node: BinNodePointer;  node to insert 
+            var Node: BinNodePointer;  tree to insert in 
+            var FoundNode : BinNodePointer; 
+            var Found : boolean;       return status of operation 
+            var Higher: boolean);   returned true if the subtree height has 
+                                       increased *)
+
+var
+
+  Node_1,                    (* helpvariable to rotate nodes *)
+  Node_2: BinNodePointer; (* helpvariable to rotate nodes *)
+
+begin
+
+  if Node = nil then
+  begin  (* Value is not in tree, insert *)
+    Node:= New_node;
+    FoundNode := Node;
+    Higher:=  true;
+  end
+  else
+
+       (* New_node^.Value < Node^.Value *)
+    if NameStringLess(New_node^.NameP^, Node^.NameP^) then
+    begin  (* New Value is lower than actual Value *)
+      INSERT_TREE_NODE( New_node, Node^.left, FoundNode, Found, Higher);
+
+      if Higher then  (* left bransch has grown higher *)
+      case Node^.bal of
+
+        1: begin
+             Node^.bal:= 0;
+             Higher:= false;
+           end;
+
+        0: begin
+             Node^.bal:= -1;
+           end;
+
+       -1: begin  (* rebalance *)
+             Node_1:= Node^.left;
+
+             if Node_1^.bal = -1 then
+             begin  (* single LL rotation *)
+               Node^.left:= Node_1^.right;
+               Node_1^.right:= Node;
+               Node^.bal:= 0;
+               Node:= Node_1;
+             end
+             else
+
+             begin  (* double LR rotation *)
+               Node_2:= Node_1^.right;
+               Node_1^.right:= Node_2^.left;
+               Node_2^.left:= Node_1;
+               Node^.left:= Node_2^.right;
+               Node_2^.right:= Node;
+
+               if Node_2^.bal = -1 then
+                 Node^.bal:= 1
+               else
+                 Node^.bal:= 0;
+
+               if Node_2^.bal = 1 then
+                 Node_1^.bal:= -1
+               else
+                 Node_1^.bal:= 0;
+               Node:= Node_2;
+             end;
+             Node^.bal:= 0;
+             Higher:= false;
+           end;
+      end; (* end case Node^.bal of *)
+    end
+    else
+
+         (* New_node^.value > Node^.value *)
+      if NameStringLess(Node^.NameP^, New_Node^.NameP^) then
+      begin  (* New value is higher than actual value *)
+        INSERT_TREE_NODE( New_node, Node^.right, FoundNode, Found, Higher);
+
+        if Higher then  (* Right bransch has grown higher *)
+        case Node^.bal of
+
+         -1: begin
+               Node^.bal:= 0;
+               Higher:= false;
+             end;
+
+          0: begin
+               Node^.bal:= 1;
+             end;
+
+          1: begin  (* Rebalance *)
+               Node_1:= Node^.right;
+
+               if Node_1^.bal = 1 then
+               begin  (* single RR rotation *)
+                 Node^.right:= Node_1^.left;
+                 Node_1^.left:= Node;
+                 Node^.bal:= 0;
+                 Node:= Node_1;
+               end
+               else
+               begin  (* double RL rotation *)
+                 Node_2:= Node_1^.left;
+                 Node_1^.left:= Node_2^.right;
+                 Node_2^.right:= Node_1;
+                 Node^.right:= Node_2^.left;
+                 Node_2^.left:= Node;
+
+                 if Node_2^.bal = 1 then
+                   Node^.bal:= -1
+                 else
+                   Node^.bal:= 0;
+
+                 if Node_2^.bal = -1 then
+                   Node_1^.bal:= 1
+                 else
+                   Node_1^.bal:= 0;
+                 Node:= Node_2;
+               end;
+               Node^.bal:= 0;
+               Higher:= false;
+             end;
+        end; (* end case Node^.bal of *)
+      end
+      else
+      begin  (* New value is equal to actual value *)
+        Found := true;
+        FoundNode := Node;
+        Higher:= false;
+      end;
+end;  (* end INSERT_TREE_NODE *)
+
+function GetNameList; (* : BinNodePointer;*)
+begin
+  GetNameList := NameList;
+end;
+
+procedure DisposeANameList( 
+  var NodeP : BinNodePointer);
+begin (* DisposeANameList *)
+  if NodeP <> nil then begin
+    DisposeANameList(NodeP^.Left);
+    DisposeANameList(NodeP^.Right);
+    NodeP^.Left := AvailNameList;
+    NodeP^.Right := nil;
+    AvailNameList := NodeP;
+    NodeP := nil;
+  end;
+end; (* DisposeANameList *)
+
+procedure DisposeNameList;
+begin
+  DisposeANameList(NameList);
+end;
+
+function GetNewNameListNode;(*(
+  var Name  : NameString) : BinNodePointer;*)
+var
+  NodeP : BinNodePointer;
+begin (* GetNewNameListNode *)
+  if AvailNameList = nil then begin
+    new(NodeP);
+    with NodeP^ do begin
+      Left := nil;
+      Right := nil;
+      Bal := 0;
+      new(NameP);
+      Namep^ := Name;
+    end;
+  end
+  else begin
+    NodeP := AvailNameList;
+    AvailNameList := NodeP^.Left;
+    with NodeP^ do begin
+      Left := nil;
+      Bal := 0;
+      Namep^ := Name;
+    end;
+  end;
+  GetNewNameListNode := NodeP;
+end; (* GetNewNameListNode *)
+
+(*---------------------------------------------------------------------------*)
+
+function insertname;(*(
+      Name  : NameString;
+  var Found : boolean) : NameStringPointer;*)
+var
+  Higher : boolean;
+  NodeP  : BinNodePointer;
+  FoundNode : BinNodePointer;
+begin (* insertname *)
+  NodeP := GetNewNameListNode(Name);
+  Found := false;
+  INSERT_TREE_NODE(NodeP, NameList, FoundNode, Found, Higher);
+  insertname := FoundNode^.NameP;
+  if Found then
+    DisposeANameList(NodeP);
+end; (* insertname *)
+
+procedure InitNameList;
+begin
+  NameList := nil;
+  AvailNameList := nil;
+end;
+
+(********************************************************************) 
+(*                      NameString - Dynamic Memory Allocation      *) 
+(********************************************************************) 
+
+procedure InitNameStringPool;
+begin
+  GlobalNSPool.Avail := nil;
+  GlobalNSPool.Empty := nil;
+end;
+
+procedure NewNameString; (* (var NSP: NameStringPointer );*)
+(*var Temp: NSPoolP;*)
+begin
+(*
+  if GlobalNSPool.Avail=nil then
+    new( NSP )
+  else begin
+    Temp := GlobalNSPool.Avail;
+    GlobalNSPool.Avail := Temp^.Next;
+    Temp^.Next := GlobalNSPool.Empty;
+    GlobalNSPool.Empty := Temp;
+    NSP := Temp^.Data;
+  end;
+*)
+  new(NSP);
+  NSP^.Length := 0;
+end;
+
+procedure ReleaseNameString; (* (var NSP: NameStringPointer );*)
+(*var Temp: NSPoolP;*)
+begin
+  if NSP <> nil then begin
+(*
+    if GlobalNSPool.Empty=nil then begin
+      new(Temp);
+      Temp^.Next := GlobalNSPool.Avail;
+      GlobalNSPool.Avail := Temp;
+    end
+    else begin
+      Temp := GlobalNSPool.Empty;
+      GlobalNSPool.Empty := Temp^.Next;
+      Temp^.Next := GlobalNSPool.Avail;
+      GlobalNSPool.Avail := Temp;
+    end;
+    Temp^.Data := NSP;
+*)
+    dispose(NSP);
+    NSP := nil;
+  end;
+end;
+
+procedure SDTrefStringToRec (* (
+  var S : SDTrefString;
+  var R : SDTrefRec;
+  var Error : integer) *) ;
+
+(* Converts SDTrefString S to a record R (SDTrefRec). If an error is
+   detected Error is on exit the position in S where the error where
+   detected. If correct Error is 0. *)
+
+label 99;
+var
+  Len : integer;
+  ErrorFound, EndFound : Boolean;
+
+procedure SDTrefSkipSpaces;
+var Found : Boolean;
+begin
+  Found := false;
+  while not Found and (Len <= S.Length) do
+    if (S.Value[Len] = ' ') or (S.Value[Len] = chr(9)) then
+      Len := Len+1
+    else
+      Found := true;
+end;
+
+function SDTrefIsEnd : Boolean;
+begin
+  SDTrefIsEnd := false;
+  if S.Value[Len] = ')' then
+  begin
+    Len := Len+1;
+    SDTrefSkipSpaces;
+    if Len > S.Length then
+      SDTrefIsEnd := true;
+  end;
+end;
+
+function SDTrefGetInteger : integer;
+var
+  Temp : NameString;
+  Found : Boolean;
+begin
+  Temp.Length := 0;
+  Found := false;
+  while not Found and (Temp.Length <= NameStringLength) and
+                      (Len <= S.Length) do
+    if S.Value[Len] in ['0'..'9'] then
+    begin
+      Temp.Length := Temp.Length+1;
+      Temp.Value[Temp.Length] := S.Value[Len];
+      Len := Len+1;
+    end
+    else
+      Found := true;
+  if Temp.Length > 0 then
+    SDTrefGetInteger := NmStrToInteger(Temp)
+  else
+    SDTrefGetInteger := SDTrefUndefInt;
+end;
+
+begin
+  ErrorFound := true;
+  R.IsSDTGR := true;
+  R.FileName.Length := 0;
+  R.PageName.Length := 0;
+  R.ObjectId := SDTrefUndefInt;
+  R.XCoord := SDTrefUndefInt;
+  R.YCoord := SDTrefUndefInt;
+  R.LineNumber := SDTrefUndefInt;
+  R.Column := SDTrefUndefInt;
+
+  Len := 1;
+  if S.Length = 0 then goto 99;
+  if S.Value[1] <> '#' then goto 99;
+  Len := 2;
+  if S.Value[2] <> 'S' then goto 99;
+  Len := 3;
+  if S.Value[3] <> 'D' then goto 99;
+  Len := 4;
+  if S.Value[4] <> 'T' then goto 99;
+  Len := 5;
+  if S.Value[5] <> 'R' then goto 99;
+  Len := 6;
+  if S.Value[6] <> 'E' then goto 99;
+  Len := 7;
+  if S.Value[7] <> 'F' then goto 99;
+  Len := 8;
+  if S.Value[8] <> '(' then goto 99;
+  Len := 9;
+
+  if S.Value[9] = 'S' then
+  begin
+    Len := 10;
+    if S.Value[10] <> 'D' then goto 99;
+    Len := 11;
+    if S.Value[11] <> 'L' then goto 99;
+    Len := 12; SDTrefSkipSpaces;
+    if Len > S.Length then goto 99;
+
+    (* First comma *)
+    if S.Value[Len] <> ',' then goto 99;
+    Len := Len+1; SDTrefSkipSpaces;
+    if Len > S.Length then goto 99;
+
+    (* FileName *)
+    EndFound := false;
+    while not EndFound and (Len <= S.Length) do
+      if S.Value[Len] in [',', ')', '(', ' ', chr(9)] then
+        EndFound := true
+      else
+      begin
+        R.FileName.Length := R.FileName.Length+1;
+        if R.FileName.Length > S.Length then goto 99;
+        R.FileName.Value[R.FileName.Length] := S.Value[Len];
+        Len := Len+1;
+        if Len > S.Length then goto 99;
+      end;
+    SDTrefSkipSpaces;
+    if Len > S.Length then goto 99;
+
+    (* PageName *)
+    if S.Value[Len] = '(' then
+    begin
+      Len := Len+1; SDTrefSkipSpaces;
+      if Len > S.Length then goto 99;
+      EndFound := false;
+      while not EndFound and (Len <= S.Length) do
+        if S.Value[Len] in [',', ')', '(', ' ', chr(9)] then
+          EndFound := true
+        else
+        begin
+          R.PageName.Length := R.PageName.Length+1;
+          if R.PageName.Length > NameStringLength then goto 99;
+          R.PageName.Value[R.PageName.Length] := S.Value[Len];
+          Len := Len+1;
+          if Len > S.Length then goto 99;
+        end;
+      SDTrefSkipSpaces;
+      if Len > S.Length then goto 99;
+      if S.Value[Len] <> ')' then goto 99;
+      Len := Len+1; SDTrefSkipSpaces;
+      if Len > S.Length then goto 99;
+    end;
+    if SDTrefIsEnd then begin ErrorFound := false; goto 99; end;
+
+    if S.Value[Len] <> ',' then goto 99;
+    Len := Len+1; SDTrefSkipSpaces;
+    if Len > S.Length then goto 99;
+
+    (* ObjectId *)
+    R.ObjectId := SDTrefGetInteger;
+    SDTrefSkipSpaces;
+    if Len > S.Length then goto 99;
+
+    (* Object_Coordinates *)
+    if S.Value[Len] = '(' then
+    begin
+      Len := Len+1; SDTrefSkipSpaces;
+      if Len > S.Length then goto 99;
+      R.XCoord := SDTrefGetInteger;
+      SDTrefSkipSpaces;
+      if Len > S.Length then goto 99;
+      if S.Value[Len] <> ',' then goto 99;
+      Len := Len+1; SDTrefSkipSpaces;
+      if Len > S.Length then goto 99;
+      R.YCoord := SDTrefGetInteger;
+      SDTrefSkipSpaces;
+      if Len > S.Length then goto 99;
+      if S.Value[Len] <> ')' then goto 99;
+      Len := Len+1; SDTrefSkipSpaces;
+      if Len > S.Length then goto 99;
+    end;
+    if SDTrefIsEnd then begin ErrorFound := false; goto 99; end;
+
+    if S.Value[Len] <> ',' then goto 99;
+    Len := Len+1; SDTrefSkipSpaces;
+    if Len > S.Length then goto 99;
+
+    (* LineNumber *)
+    R.LineNumber := SDTrefGetInteger;
+    SDTrefSkipSpaces;
+    if Len > S.Length then goto 99;
+    if SDTrefIsEnd then begin ErrorFound := false; goto 99; end;
+
+    if S.Value[Len] <> ',' then goto 99;
+    Len := Len+1; SDTrefSkipSpaces;
+    if Len > S.Length then goto 99;
+
+    (* Column *)
+    R.Column := SDTrefGetInteger;
+    SDTrefSkipSpaces;
+    if Len > S.Length then goto 99;
+    if SDTrefIsEnd then ErrorFound := false;
+  end
+
+  else if S.Value[9] = 'T' then
+  begin
+    Len := 10;
+    R.IsSDTGR := false;
+    if S.Value[10] <> 'E' then goto 99;
+    Len := 11; 
+    if S.Value[11] <> 'X' then goto 99;
+    Len := 12;
+    if S.Value[12] <> 'T' then goto 99;
+    Len := 13; SDTrefSkipSpaces;
+    if Len > S.Length then goto 99;
+
+    (* First comma *)
+    if S.Value[Len] <> ',' then goto 99;
+    Len := Len+1; SDTrefSkipSpaces;
+    if Len > S.Length then goto 99;
+
+    (* FileName *)
+    EndFound := false;
+    while not EndFound and (Len <= S.Length) do
+      if S.Value[Len] in [',', ')', '(', ' ', chr(9)] then
+        EndFound := true
+      else
+      begin
+        R.FileName.Length := R.FileName.Length+1;
+        if R.FileName.Length > S.Length then goto 99;
+        R.FileName.Value[R.FileName.Length] := S.Value[Len];
+        Len := Len+1;
+        if Len > S.Length then goto 99;
+      end;
+    SDTrefSkipSpaces;
+    if Len > S.Length then goto 99;
+    if SDTrefIsEnd then begin ErrorFound := false; goto 99; end;
+
+    if S.Value[Len] <> ',' then goto 99;
+    Len := Len+1; SDTrefSkipSpaces;
+    if Len > S.Length then goto 99;
+
+    (* LineNumber *)
+    R.LineNumber := SDTrefGetInteger;
+    SDTrefSkipSpaces;
+    if Len > S.Length then goto 99;
+    if SDTrefIsEnd then begin ErrorFound := false; goto 99; end;
+
+    if S.Value[Len] <> ',' then goto 99;
+    Len := Len+1; SDTrefSkipSpaces;
+    if Len > S.Length then goto 99;
+
+    (* Column *)
+    R.Column := SDTrefGetInteger;
+    SDTrefSkipSpaces;
+    if Len > S.Length then goto 99;
+    if SDTrefIsEnd then ErrorFound := false;
+  end;
+
+99:
+  if ErrorFound then
+    Error := Len
+  else
+    Error := 0;
+end;
+
+
+procedure SDTrefRecToString  (* (
+  var R : SDTrefRec;
+  var S : SDTrefString) *) ;
+
+(* Converts SDTrefRec R to a string S (SDTrefString). If an error is
+   detected (string is not long enough) S.Length becomes 0 on exit *)
+
+label 99;
+var
+  Len, I : integer;
+  Temp : NameString;
+begin
+  S.Value[1] := '#';
+  S.Value[2] := 'S';
+  S.Value[3] := 'D';
+  S.Value[4] := 'T';
+  S.Value[5] := 'R';
+  S.Value[6] := 'E';
+  S.Value[7] := 'F';
+  S.Value[8] := '(';
+  S.Length := 8;
+  if R.IsSDTGR then
+  begin
+    Temp.Value[1] := 'S';
+    Temp.Value[2] := 'D';
+    Temp.Value[3] := 'L';
+    Temp.Value[4] := ',';
+    Temp.Length := 4;
+    S := Concatenatenamestrings(S, Temp);
+    Len := S.Length;
+    (* FileName *)
+    for I := 1 to R.FileName.Length do
+    begin
+      Len := Len+1;
+      if Len > SDTrefStringLength then goto 99;
+      S.Value[Len] := R.FileName.Value[I];
+    end;
+
+    (* PageName *)
+    if R.PageName.Length > 0 then
+    begin
+      Len := Len+1;
+      if Len > SDTrefStringLength then goto 99;
+      S.Value[Len] := '(';
+      for I := 1 to R.PageName.Length do
+      begin
+        Len := Len+1;
+        if Len > SDTrefStringLength then goto 99;
+        S.Value[Len] := R.PageName.Value[I];
+      end;
+      Len := Len+1;
+      if Len > SDTrefStringLength then goto 99;
+      S.Value[Len] := ')';
+    end;
+
+    (* ObjectId *)
+    if R.ObjectId <> SDTrefUndefInt then
+    begin
+      Len := Len+1;
+      if Len > SDTrefStringLength then goto 99;
+      S.Value[Len] := ',';
+      Temp := integertonmstr(R.ObjectId);
+      for I := 1 to Temp.Length do
+      begin
+        Len := Len+1;
+        if Len > SDTrefStringLength then goto 99;
+        S.Value[Len] := Temp.Value[I];
+      end;
+    end;
+
+    (* Object_Coordinates *)
+    if R.XCoord <> SDTrefUndefInt then
+    begin
+      Len := Len+1;
+      if Len > SDTrefStringLength then goto 99;
+      S.Value[Len] := '(';
+      Temp := integertonmstr(R.XCoord);
+      for I := 1 to Temp.Length do
+      begin
+        Len := Len+1;
+        if Len > SDTrefStringLength then goto 99;
+        S.Value[Len] := Temp.Value[I];
+      end;
+      Len := Len+1;
+      if Len > SDTrefStringLength then goto 99;
+      S.Value[Len] := ',';
+      Temp := integertonmstr(R.YCoord);
+      for I := 1 to Temp.Length do
+      begin
+        Len := Len+1;
+        if Len > SDTrefStringLength then goto 99;
+        S.Value[Len] := Temp.Value[I];
+      end;
+      Len := Len+1;
+      if Len > SDTrefStringLength then goto 99;
+      S.Value[Len] := ')';
+    end;
+
+    (* LineNumber *)
+    if R.LineNumber <> SDTrefUndefInt then
+    begin
+      Len := Len+1;
+      if Len > SDTrefStringLength then goto 99;
+      S.Value[Len] := ',';
+      Temp := integertonmstr(R.LineNumber);
+      for I := 1 to Temp.Length do
+      begin
+        Len := Len+1;
+        if Len > SDTrefStringLength then goto 99;
+        S.Value[Len] := Temp.Value[I];
+      end;
+    end;
+
+    (* Column *)
+    if R.Column <> SDTrefUndefInt then
+    begin
+      Len := Len+1;
+      if Len > SDTrefStringLength then goto 99;
+      S.Value[Len] := ',';
+      Temp := integertonmstr(R.Column);
+      for I := 1 to Temp.Length do
+      begin
+        Len := Len+1;
+        if Len > SDTrefStringLength then goto 99;
+        S.Value[Len] := Temp.Value[I];
+      end;
+    end;
+
+    Len := Len+1;
+    if Len > SDTrefStringLength then goto 99;
+    S.Value[Len] := ')';
+  end
+
+  else  (* if PR *)
+
+  begin
+    Temp.Value[1] := 'T';
+    Temp.Value[2] := 'E';
+    Temp.Value[3] := 'X';
+    Temp.Value[4] := 'T';
+    Temp.Value[5] := ',';
+    Temp.Length := 5;
+    S := Concatenatenamestrings(S, Temp);
+    Len := S.Length;
+    (* FileName *)
+    for I := 1 to R.FileName.Length do
+    begin
+      Len := Len+1;
+      if Len > SDTrefStringLength then goto 99;
+      S.Value[Len] := R.FileName.Value[I];
+    end;
+
+    (* LineNumber *)
+    if R.LineNumber <> SDTrefUndefInt then
+    begin
+      Len := Len+1;
+      if Len > SDTrefStringLength then goto 99;
+      S.Value[Len] := ',';
+      Temp := integertonmstr(R.LineNumber);
+      for I := 1 to Temp.Length do
+      begin
+        Len := Len+1;
+        if Len > SDTrefStringLength then goto 99;
+        S.Value[Len] := Temp.Value[I];
+      end;
+    end;
+
+    (* Column *)
+    if R.Column <> SDTrefUndefInt then
+    begin
+      Len := Len+1;
+      if Len > SDTrefStringLength then goto 99;
+      S.Value[Len] := ',';
+      Temp := integertonmstr(R.Column);
+      for I := 1 to Temp.Length do
+      begin
+        Len := Len+1;
+        if Len > SDTrefStringLength then goto 99;
+        S.Value[Len] := Temp.Value[I];
+      end;
+    end;
+
+    Len := Len+1;
+    if Len > SDTrefStringLength then goto 99;
+    S.Value[Len] := ')';
+  end;
+
+99:
+  if Len > SDTrefStringLength then
+    S.Length := 0
+  else
+    S.Length := Len;
+end;
+
+function NmStrToErrStr;(*(
+  NmStr : NameString) : ErrorString;*)
+var
+  ErrStr : ErrorString;
+  i : integer;
+begin
+  for i := 1 to NmStr.Length do
+    ErrStr.Value[i] := NmStr.Value[i];
+  ErrStr.Length := NmStr.Length;
+  NmStrToErrStr := ErrStr;
+end;
+
+function ErrStrToNmStr;(*(
+  ErrStr : ErrorString) : NameString;*)
+var
+  NmStr : NameString;
+  i : integer;
+  n : integer;
+begin
+  if ErrStr.Length < NameStringLength then
+    n := ErrStr.Length
+  else
+    n := NameStringLength;
+  for i := 1 to n do
+    NmStr.Value[i] := ErrStr.Value[i];
+  NmStr.Length := n;
+  ErrStrToNmStr := NmStr;
+end;
+
+(*------------------------------------------------------------------*)
+(*                   GetTextRef                                     *)
+(*------------------------------------------------------------------*)
+function GetTextRef;(*(
+  FNm : NameString;
+  Ln : integer;
+  Col : integer) : NameString;*)
+var
+  Ref : SDTrefRec;
+  S : NameString;
+begin(* GetTextRef *)
+  Ref.IsSDTGR := false;
+  Ref.FileName := FNm;
+  Ref.LineNumber := Ln;
+  Ref.Column := Col;
+  SDTrefRecToString(Ref, S);
+  GetTextRef := S;
+end; (* GetTextRef *)
+
+ (* module COMMON *)
diff --git a/test/etags/perl-src/htlmify-cystic 
b/test/etags/perl-src/htlmify-cystic
new file mode 100644
index 0000000..de150a7
--- /dev/null
+++ b/test/etags/perl-src/htlmify-cystic
@@ -0,0 +1,382 @@
+#! /uns/bin/perl -w
+
+# htmlify-cystic-l-faq:  turn text version of cystic-l faq into html
+# run like this:   htmlify-cystic-l-faq < cystic-l-faq-all
+
+# Ron Trueworthy should put the date on the FAQ.
+
+use English;
+use Carp;
+use strict;
+
+my @section_name;
+my @appendix_name;
+
+my @section_toc;
+my @appendix_toc;
+
+my $new_tag = "[NEW]";
+
+if (! -d "faq")
+{ die "Can't find faq directory"; }
+
+# Initially undefined
+my $appendix;
+my $section;
+my $subsection;
+my $subsubsection;
+
+my $this_file_toc = "";
+my %file_tocs;
+
+my @output_files = ();
+my $file_index = 0;
+
+my $output_file;
+
+my $line;
+while (defined($line = <>))
+{
+  ### Message headers
+  if ($line =~ /^From /)
+    { while ($line ne "\n")
+       { $line = <>; } }
+
+  if ($line =~ /^See PART ONE of this FAQ for/)
+    { while (defined($line = <>) && ($line ne "\n"))
+       { }
+      next; }
+
+  if ($line =~ /^\s*[-+]+$/)
+    { next; }
+
+  ### File headers
+  if ($line =~ /^\s*CYSTIC-L Frequently Asked Questions - PART (.*)\n$/)
+    { # print "part $1\n";
+      if ($1 ne "ONE")
+       { next; }
+      if ($output_file)
+       { die "output_file shouldn't have been set yet: $output_file"; }
+      $output_file = "faq/index.html";
+      open(OUTPUT, ">$output_file") || die "Couldn't open $output_file";
+      select OUTPUT;
+      print "<HEAD>
+<TITLE>CYSTIC-L FAQ Table of Contents
+</TITLE>
+</HEAD>
+<BODY>
+<H1>CYSTIC-L Frequently Asked Questions</H1>
+<h2>Knowledge Is Power</h2>
+";
+      next; }
+
+  if ($line =~ /^\s*~ Knowledge Is Power ~$/)
+    { next; }
+
+  ### Table of contents
+  if ($line =~ /^\s*~ FAQ Table of Contents ~$/)
+      { read_toc();
+       print "<hr><a href=\"../\">Info-Zone</a> <a 
href=\"../../\">CF-WEB</a>\n";
+       close(OUTPUT);
+       next;
+      }
+
+  if ($line =~ /^PART /)
+    { next; }
+
+  if ($line =~ s/^>?APPENDIX ([A-Z])\.\s*//)
+    { if (!defined($appendix))
+       { if ($1 ne "A")
+           { die "First appendix is $1"; } }
+      elsif ($1 ne chr(ord($appendix)+1))
+       { die "Appendix $1 follows Appendix $appendix"; }
+
+      file_end();
+      close(OUTPUT);
+      $appendix = $1;
+      $section = undef;
+      $subsection = undef;
+      $subsubsection = undef;
+      $output_file = section_url_base();
+      open(OUTPUT, "> faq/$output_file") || die "Can't open faq/$output_file";
+      select OUTPUT;
+
+      chomp($line);
+      print "<title>$line</title>\n<h1>$line</h1>\n";
+      if (defined($file_tocs{$output_file}) && $file_tocs{$output_file})
+       { print "Contents: $file_tocs{$output_file}\n"; }
+      next; }
+
+  if (($line =~ /^>?([0-9]+)\.\s+/) && (!defined($section) || ($1 == 
$section+1)))
+    { $line =~ s/^>?([0-9]+)\.\s+//;
+      if (!defined($appendix))
+       { # should do some more here
+         if (defined($section))
+           { file_end(); }
+         close(OUTPUT); }
+      $section = $1;
+      $subsection = undef;
+      $subsubsection = undef;
+      $output_file = section_url_base();
+      if (!defined($appendix))
+       { open(OUTPUT, "> faq/$output_file") || die "Can't open 
faq/$output_file";
+         select OUTPUT;
+         chomp($line);
+         print "<title>$line</title>\n<h1>$line</h1>\n";
+         if (defined($file_tocs{$output_file}) && $file_tocs{$output_file})
+           { print "Contents: $file_tocs{$output_file}\n"; }
+         next; }
+    }
+
+  if ($line =~ s/^>?o\s+//)
+    { $line =~ s/^>//;         # sometimes the > follows the itemization
+      if (!defined($subsection))
+       { $subsection = 1; }
+      else
+       { $subsection++; }
+      $subsubsection = undef;
+      print "<h2>", section_name($line), "</h2>\n";
+      next; }
+
+  if ($line =~ s/^>?-\s+//)
+    { $line =~ s/^>//;         # sometimes the > follows the itemization
+      if (!defined($subsubsection))
+       { $subsubsection = 1; }
+      else
+       { $subsubsection++; }
+      print "<h3>", section_name($line), "</h3>\n";
+      next; }
+
+  ### A paragraph of ordinary text
+  if ($line !~ /^\s*$/)
+    { print "<p>$line";
+      while (defined($line = <>) && ($line ne "\n"))
+       { print $line; }
+      print "</p>\n";
+    }
+
+}
+file_end();
+
+my $subsection_marker;
+
+my $new;
+
+sub read_toc ()
+{ # These variables are initially undefined
+  if (defined($appendix)
+      || defined($section)
+      || defined($subsection)
+      || defined($subsubsection))
+    { die "some value should have been undefined when calling read_toc: 
`$appendix' `$section' `$subsection' `$subsubsection'"; }
+
+  while (defined($line = <>) && $line)
+    { if ($line =~ /^\s*$/)
+       { next; }
+      if ($line =~ /^\s*\((Portions updated since.*)>\)\n/)
+       { print "$1$new_tag<p>\n";
+         next; }
+      if ($line =~ /^PART (.*)$/)
+       #       { if ($MATCH eq "ONE")
+       #           { print ... }
+       { next; }
+      if ($line eq "APPENDICES\n")
+       { next; }
+      if ($line =~ /^\s*INDEX/)
+       { next; }
+
+      if ($line =~ /^\s*[-+]+$/)
+       { finish_appendices();
+         if (defined($appendix)
+             || defined($section)
+             || defined($subsection)
+             || defined($subsubsection))
+           { die "some value should have been undefined when exiting read_toc: 
`$appendix' `$section' `$subsection' `$subsubsection'"; }
+         return; }
+
+      $new = ($line =~ s/>//);
+
+      # # Not sure if this is the right place to do this.
+      # if (($line !~ /^\s*([-o]|[0-9A-Z]+\.|APPENDIX [A-Z]\.)/)
+      #          && ($line !~ /[ .]*[0-9]+$/))
+      #        { die "What line? $line"; }
+      while (!($line =~ s/[ .]*[0-9]+$//))
+       { $line .= <>; }
+      chomp($line);
+
+      if ($line =~ s/^\s*APPENDIX ([A-Z])\.\s*//)
+       { finish_sections();
+         if (!defined($appendix))
+           { if ($1 ne "A")
+               { die "First appendix is $1"; }
+             print "Appendices\n";
+             print "<ol type=\"A\" start=\"$1\">\n"; }
+         elsif ($1 ne chr(ord($appendix)+1))
+           { die "Appendix $1 follows Appendix $appendix"; }
+         $appendix = $1;
+         $appendix_name[ord($appendix)-ord('A')+1] = $line;
+         my $entry = toc_line($line);
+         print $entry;
+         push(@output_files,section_url_base());
+         next; }
+
+      if ($line =~ s/^\s*([0-9]+)\.\s*//)
+       { finish_subsections();
+         if (!defined($section))
+           { my $entry = "<ol start=$1>\n";
+             print $entry;
+             if (defined($appendix))
+               { $this_file_toc .= $entry; } }
+         elsif ($1 != $section+1)
+           { die "Section $1 follows section $section"; }
+         $section = $1;
+         $section_name[$section] = $line;
+         my $entry = "  " . toc_line($line);
+         print $entry;
+         if (defined($appendix))
+           { $this_file_toc .= $entry; }
+         else
+           { push(@output_files,section_url_base()); }
+         next; }
+
+      if ($line =~ s/^\s*o\s+//)
+       { if (!defined($subsection))
+           { $subsection = 1;
+             my $entry = "  <ul>\n";
+             print $entry;
+             $this_file_toc .= $entry;
+             $subsection_marker = "ul"; }
+         else
+           { finish_subsubsections();
+             $subsection++; }
+         my $entry = "    " . toc_line($line);
+         print $entry;
+         $this_file_toc .= $entry;
+         next; }
+
+      if ($line =~ s/^\s*([A-Z])\.\s+//)
+       { finish_subsubsections();
+         if (!defined($subsection))
+           { my $entry = "  <ol type=\"A\" start=\"$1\">\n";
+             print $entry;
+             $this_file_toc .= $entry;
+             $subsection_marker = "ol"; }
+         else
+           { if ($1 ne chr(ord($subsection)+1))
+               { die "Subsection $1 follows subsection $subsection"; } }
+         $subsection = $1;
+         my $entry = "      " . toc_line($line);
+         print $entry;
+         $this_file_toc .= $entry;
+         next; }
+
+      if ($line =~ s/^\s*-\s+//)
+       { if (!defined($subsubsection))
+           { $subsubsection = 1;
+             my $entry = "    <ul>\n";
+             print $entry;
+             $this_file_toc .= $entry; }
+         else
+           { $subsubsection++; }
+         my $entry = "        " . toc_line($line);
+         print $entry;
+         $this_file_toc .= $entry;
+         next; }
+
+      # Itemized line without leading "o" (grrr).
+       if (!defined($subsection))
+         { my $entry = "  <ul>\n";
+           print $entry;
+           $this_file_toc .= $entry;
+           $subsection = 1;
+           $subsection_marker = "ul"; }
+       else
+         { $subsection++; }
+       $line =~ s/^\s*//;
+      my $entry = "      " . toc_line($line);
+      $this_file_toc .= $entry;
+      print $entry;
+    }
+}
+
+sub finish_subsubsections ()
+{ if (defined($subsubsection))
+    { my $entry = "      </ul>\n";
+      print $entry;
+      $this_file_toc .= $entry;
+      $subsubsection = undef; } }
+
+sub finish_subsections ()
+{ finish_subsubsections();
+  if (defined($subsection))
+    { my $entry = "    </$subsection_marker>\n";
+      print $entry;
+      $this_file_toc .= $entry;
+      $subsection = undef;
+      if (!defined($appendix))
+       { $file_tocs{section_url_base()} = $this_file_toc;
+         $this_file_toc = ""; } } }
+
+sub finish_sections ()
+{ finish_subsections();
+  if (defined($section))
+    { my $entry = "  </ol>\n";
+      print $entry;
+      if (defined($appendix))
+       { $this_file_toc .= $entry;
+         $file_tocs{section_url_base()} = $this_file_toc;
+         $this_file_toc = ""; }
+      $section = undef; } }
+
+sub finish_appendices ()
+{ finish_sections();
+  if (defined($appendix))
+    { print "</ol>\n";
+      $appendix = undef; } }
+
+sub section_url_base ()
+{ if (!defined($appendix) && !defined($section))
+    { die "undefined appendix and section"; }
+  return (defined($appendix) ? "app-$appendix.html" : "sec-$section.html"); }
+
+sub section_url_name ()
+{ my $sans_subsubsection
+    = (defined($appendix)
+       ? (defined($section)
+         ? "sec-$section" . (defined($subsection)
+                               ? "-$subsection" : "")
+         : "")
+       : (defined($subsection) ? "ssec-$subsection" : ""));
+  if (defined($subsubsection))
+    { $sans_subsubsection . "-$subsubsection"; }
+  else
+    { $sans_subsubsection; } }
+
+sub section_url ()
+{ my $base = section_url_base();
+  my $name = section_url_name();
+  if ($name)
+    { return $base . "\#" . $name; }
+  else
+    { return $base; } }
+
+
+sub section_href ($)
+{ my ($text) = @_;
+  return "<a href=\"" . section_url() . "\">$text</a>"; }
+
+sub section_name ($)
+{ my ($text) = @_;
+  return "<a name=\"" . section_url_name() . "\">$text</a>"; }
+
+sub toc_line ($)
+{ return " <LI>" . section_href($line) . ($new ? " $new_tag" : "") . "\n"; }
+
+sub file_end ()
+{ print "\n\n<hr>\n"
+    . (($file_index < $#output_files)
+       ? "<a href=\"$output_files[$file_index+1]\">Next</a> " : "")
+      . (($file_index > 0)
+        ? "<a href=\"$output_files[$file_index-1]\">Previous</a> " : "")
+       . "<a href=\"./\">FAQ</a> <a href=\"../\">Info-Zone</a> <a 
href=\"../../\">CF-WEB</a>\n";
+  $file_index++; }
diff --git a/test/etags/perl-src/kai-test.pl b/test/etags/perl-src/kai-test.pl
new file mode 100644
index 0000000..51b6672
--- /dev/null
+++ b/test/etags/perl-src/kai-test.pl
@@ -0,0 +1,39 @@
+#!/usr/bin/perl
+sub f1 {
+        print "f1\n";
+}
+
+sub main::f2 {
+        print "f2\n";
+}
+
+package Foo;
+
+sub f3 {
+        print "f3\n";
+}
+
+sub Bar::f4 {
+        print "f4\n";
+}
+
+package Bar;
+
+sub f5 {
+        print "f5\n";
+}
+
+package Foo::Bar;
+
+sub f6 {
+        print "f6\n";
+}
+
+package main;
+
+sub f7 {
+        print "f7\n";
+}
+
+exit 0;
+# end of Perl code
diff --git a/test/etags/perl-src/mirror.pl b/test/etags/perl-src/mirror.pl
new file mode 100644
index 0000000..2bbbb76
--- /dev/null
+++ b/test/etags/perl-src/mirror.pl
@@ -0,0 +1,4149 @@
+#!/usr/bin/perl
+# Make local directories mirror images of a remote sites
+#
+#
+# Copyright (C) 1990 - 1998   Lee McLoughlin
+#
+# Permission to use, copy, and distribute this software and its
+# documentation for any purpose with or without fee is hereby granted,
+# provided that the above copyright notice appear in all copies and
+# that both that copyright notice and this permission notice appear
+# in supporting documentation.
+#
+# Permission to modify the software is granted, but not the right to
+# distribute the modified code.  Modifications are to be distributed
+# as patches to released version.
+#
+# This software is provided "as is" without express or implied warranty.
+#
+#
+# The Debian system patched this file after installation to add:
+# ls-lR file patching 2001/09/29
+#      Copyright (C) 1999-2001 Ian Maclaine-cross <address@hidden>
+# and other changes.
+# Debian patches are copyright by their authors and you may use them only
+# under the conditions of the General Public License in file GPL.
+#
+# $Id: mirror.pl,v 2.9 1998/05/29 19:01:07 lmjm Exp lmjm $
+# $Log: mirror.pl,v $
+# Revision 2.9  1998/05/29 19:01:07  lmjm
+# Lots of changes.  See CHANGES since 2.8 file.
+#
+# Revision 2.8  1995/08/06  14:03:52  lmjm
+# Trap a wider range of signals to aid in debugging under perl5
+# Avoid looping processing symlinks.
+#
+# Revision 2.7  1995/08/06  13:59:00  lmjm
+# No longer require socket.ph in this module.
+# Escape at signs and dollars for perl5
+# Make sure  proxy_gateway is at least null.
+# Added ls_fix_mappings, failed_gets_excl, store_remote_listing, passive_ftp
+#  and using_socks.
+# Stop using dollar star as perl5 has dropped it.
+# Process local directory listing before connecting to remote.
+# Allow for remote_account pasword.
+# Only one arg to undef, for early perl5's
+# Use all capitals for file descriptors.
+# Use ftp'close not ftp'quit
+# Avoid file renaming under MACos
+# Corrected file deleting.
+#
+# Revision 2.6  1994/06/10  18:28:27  lmjm
+# Dropped debug statement.
+#
+# Revision 2.5  1994/06/06  18:39:21  lmjm
+# Don't have . in the extra_path.
+# Have 'internet-gateway' as the default proxy_gateway when INTERNET_HOST 
unset.
+# Allow strip_cr (from Andrew).
+# More symlink handling...
+# Set type for vms correctly.
+# Changed response from ftp'delete, also corrected path used.
+#
+# Revision 2.4  1994/04/29  20:11:09  lmjm
+# Use correct variable for hostname
+#
+# Revision 2.3  1994/01/31  18:31:22  lmjm
+# Allow for funny chars in filenames when calling the shell (Erez).
+# Added compress_size_floor to avoid compressing small files (David).
+# Added get_missing to just delete files not on remote system (Pieter).
+# Don't try to delete old dirs if no time set (Pieter).
+# Zap .dir$$ files, and keep then in $big_temp.
+# Pretty print time in comparisons.
+# Move the large comparision conditionals into routines (David).
+# Allow for sites with limited filename lengths.
+# Allow for deleted files when doing deletes.
+# Don't delete dirs that are really symlinks.
+#
+# Revision 2.2  1993/12/14  11:09:15  lmjm
+# Allow for no flock.
+# Use installed socket.ph.
+# Allow for system 5.
+# Use percentage defaults on max_delete_*
+# Checkout regexps before using.
+# Allow for extra leading | in local_ignore.
+# Return better exit codes.
+# Fixups for recurse_hard.
+# Smarter symlink handling.
+#
+# Revision 2.1  1993/06/28  14:59:00  lmjm
+# Full 2.1 release
+#
+#
+
+$#ARGV >= 0 or die("Try `man mirror` for help.\n");  
+
+# Make sure we don't go recursive processing signals
+$sigs = 0;
+$max_sigs = 10;
+
+# Am I on windoze?
+$on_win = ($^O =~ /mswin/i);
+$path_sep = $on_win ? ';' : ':';
+$file_sep = $on_win ? '\\' : '/';
+# Internally mirror uses / but when looking at names from environment allow
+# for either
+$file_sep_pat = $on_win ? "[\\/]" : "/"; # allow for c:\win/fred on windoze
+
+
+# Default settings file loaded from a directory in PERLLIB
+$defaults_file = 'mirror.defaults';
+$load_defaults = 1;
+
+# Try to find the default location of various programs via
+# the users PATH then using $extra_path
+if( ! $on_win ){
+       $extra_path = 
'/usr/local/bin:/usr/new/bin:/usr/public/bin:/usr/ucb:/usr/bin:/bin:/etc:/usr/etc:/usr/local/etc';
+}
+if( $extra_path ne '' ){
+       $ENV{ 'PATH' } .= $path_sep . $extra_path;
+}
+
+&trap_signals();
+
+# If compressing a local file to send need somewhere to store the temp
+# compressed version.
+$big_temp = '/var/tmp';
+
+# Hopefully we have flock.
+$can_flock = 1;
+
+# no debugging by default
+$debug = 0;
+
+# NOTE:
+#  It is not an error for a program not to be found in the path as the user
+# may be setting it as part of the package details or defaults.
+
+# Used by the save_deletes option
+$mv_prog = 'mv -f';
+
+# compress must be able to take the -d arg to cause it to uncompress.
+$sys_compress_prog = &find_prog( 'compress' );
+$sys_compress_suffix = 'Z';
+
+# Like compress gzip must be able to take -d
+if( $gzip_prog = &find_prog( 'gzip' ) ){
+       # Force maximum compression with gzip
+       $gzip_level = ' -9';
+       $gzip_prog .= $gzip_level;
+       $gzip_suffix = 'gz';
+       $old_gzip_suffix = 'z';
+}
+
+# For remote systems with gzipped patches to their ls-lR.gz file.  The
+# gzipped patch file is a unified diff between old and new ls-lR.  The
+# times file has modification times in decimal epoch seconds of the
+# old and new ls-lR file on its first and second lines respectively.
+if( $patch_prog = &find_prog( 'patch' ) ){
+       $patch_local = '-usNT';
+       $patch_UTC = '-usNZ';
+}
+$patch_suffix = '.pth';            # These suffices distinct
+$patch_gzip_suffix = '.patch.gz';  # if truncated locally.
+$times_suffix = '.times';
+
+# A mail program that can be called as: "$mail_prog person_list'
+# Can be overridden with the mail_prog keyword.
+# If you use $mail_subject to pass extra arguments then remember that
+# the mail program will need to know how to handle them.
+$mail_prog = &find_prog( 'mailx' );
+if( ! $mail_prog ){
+       $mail_prog = &find_prog( 'Mail' );
+}
+if( ! $mail_prog ){
+       $mail_prog = &find_prog( 'mail' );
+}
+
+# Used to remove directory heirarchies.  This program is passed the -rf
+# arguments.
+$rm_prog = &find_prog( 'rm' );
+
+# Generate checksums
+$sum_prog = &find_prog( 'sum' );
+
+# SPECIAL NOTE: This is eval'd, so DONT put double-quotes (") in it.
+# You can get local variables to appear as in the second example:
+$mail_subject = '-s \'mirror update\'';
+# $mail_subject = ' -s \'mirror update of $package\'';
+
+# When scanning the local directory, how often to prod the remote
+# system to keep the connection alive
+$prod_interval = 60;
+
+# Put the directory that mirror is actually in at the start of PERLLIB.
+$dir = &real_dir_from_path( $0 );
+unshift( @INC, $dir );
+
+# Debian GNU/Linux stores mirror.defaults in /etc/mirror
+$debian_defs = '/etc/mirror';
+unshift( @INC, $debian_defs ) if -d $debian_defs;
+
+# This, when eval'd, will get the current dir under windows NT/95
+$win_getcwd = 'Win32::GetCwd';
+       
+# Make sure that your PERLLIB environment variable can get you
+# all these or that they are installed.
+require 'ftp.pl';
+require 'lsparse.pl';
+require 'dateconv.pl';
+
+# Find some local details
+# The current directory
+$home = &cwd();
+# The hostname
+$hostname_cmd = &find_prog( 'hostname' );
+if( $hostname_cmd ne '' ){
+       chop( $hostname = `$hostname_cmd` );
+}
+if( $hostname eq '' ){
+       $hostname_cmd = &find_prog( 'uname' );
+       if( $hostname_cmd ne '' ){
+               chop( $hostname = `$hostname_cmd -n` );
+               if( $hostname eq '' ){
+                       chop( $hostname = `$hostname_cmd -l` );
+               }
+       }
+}
+if( $hostname eq '' ){
+       $hostname = 'localhost';
+}
+
+if( $hn = (gethostbyname( "$hostname" ))[ 0 ] ){
+       $hostname = $hn;
+}
+
+# Some systems hold the username in $USER, some in $LOGNAME.
+$me = $ENV{'USER'} || $ENV{'LOGNAME'};
+
+# Files matching this pattern are usually compressed.
+$squished = '\.(Z|z|gz)$';
+
+# special /bin/sh chars that must be escaped.
+$shell_metachars = '\"|\$|`|\\\\';
+
+# Remote directory parsing fail if not given input every readtime seconds.
+$parse_time = 600;
+
+# Timeout are not fatal unless you get more than this number of them.
+$max_timeouts = 20;
+
+# If connected to a site then this holds the site name.
+$connected = '';
+
+# Umask setting.
+$curr_umask = sprintf( "0%o", umask );
+
+# mapping from a pathname to a number - just to make the keys to assoc arrays
+# shorter.
+$map_init = 1; # just so I know 0 is invalid
+
+$tmp = "/tmp";
address@hidden = ( 'local_map', 'remote_map' );
+
+# A reasonable set of defaults
+#   these are in the same order as the documentation - except where order is
+#   important
+$default{ 'hostname' } = $hostname; # The LOCAL hostname
+
+$default{ 'package' } = '';    # should be a unique handle for the "lump" to 
be mirrored
+$default{ 'site' } = '';       # site to connect to
+$default{ 'remote_dir' } = ''; # remote directory to mirror
+$default{ 'local_dir' } = '';  # local directory to copy into
+
+$default{ 'remote_user' } = 'anonymous';  # the remote guest account name
+$default{ 'remote_password' } = "address@hidden";
+$default{ 'remote_account' } = ''; # remote account name/passwd (for systems
+                                  # that use it.)
+# Used for group and gpass.  (As in ftp.1 site group/gpass commands.)
+$default{ 'remote_group' } = '';
+$default{ 'remote_gpass' } = '';
+$default{ 'timeout' } = 120;   # timeout ftp requests after this many seconds
+$default{ 'failed_gets_excl' } = ''; # failed messages to ignore while getting,
+                               # if failed to ftp'get
+$default{ 'ftp_port' } = 21;   # port number of remote ftp daemon
+$default{ 'proxy' } = 0;       # normally use regular ftp
+$default{ 'proxy_ftp_port' } = 4514; # default from Sun
+$default{ 'proxy_gateway' } = "$ENV{ 'INTERNET_HOST' }";
+                               # Gateway to use for proxy
+                               # (Null if environment not set.)
+$default{ 'using_socks' } = 0; # Set the default perl version to the non-SOCKS 
one.
+$default{ 'passive_ftp' } = 0; # Set the default ftp usage not to use passive 
(PASV) ftp.
+$default{ 'retry_call' } = 1;  # Retry the call if it fails first time
+$default{ 'disconnect' } = 0;  # Force close at end of package EVEN if
+                               # next package is to the same site
+$default{ 'remote_idle' } = '';        # Set the remote idle timer to this
+
+$default{ 'get_patt' } = ".";  # regex of pathnames to retrieve
+$default{ 'exclude_patt' } = ''; # regex of pathnames to ignore
+$default{ 'local_ignore' } = ''; # regex of local pathnames to totally ignore
+$default{ 'get_newer' } = 1;   # get remote file if its date is newer than 
local
+$default{ 'get_size_change' } = 1; # get the file if size if different than 
local
+$default{ 'make_bad_symlinks' } = 0; # prevent symlinks to non-existant files
+$default{ 'follow_local_symlinks' } = ''; # Follow symlinks to pathnames 
matching this regexp.
+$default{ 'get_symlink_files' } = 0; # If true gets file and makes symlink 
otherwise bad. 
+$default{ 'get_missing' } = 1; # Set get_missing to 0 to just delete files not 
on remote system
+$default{ 'get_file' } = 1;    # perform get, not put by default
+$default{ 'text_mode' } = 0;   # transfer in binary mode by default
+$default{ 'strip_cr' } = 0;    # Delete \r (usefull when transfering from
+                               # mainframes -- set text_mode and strip_cr)
+$default{ 'vms_keep_versions' } = 1; # Keep multiple VMS versions
+$default{ 'vms_xfer_text' } = 'readme$|info$|listing$|\.c$';
+                               # pattern of VMS files to xfer in TEXT mode
+                               # (Case insensitive)
+$default{ 'name_mappings' } = '';# remote to local pathname mappings
+                               # used to change layout or zap weird chars
+                               # (eg s:old:new)
+$default{ 'external_mapping' } = '';# remote to local mapping by external 
routine
+$default{ 'update_local' } = 0;        # Don't just update local dirs
+$default{ 'max_days' } = 0;    # Ignore age of file
+$default{ 'max_size' } = 0;    # If non-zero dont get files larger than this
+$default{ 'chmod' } = 1;       # perform a chmod after an xfer
+
+$default{ 'user' } = '';       # UID/user name to give to local pathnames
+$default{ 'group' } = '';      # GID/group name to give to local pathnames
+$default{ 'mode_copy' } = 0;   # true indicates to copy the mode bits
+$default{ 'file_mode' } = 0444;        # Mode to give files created locally
+$default{ 'dir_mode' } = 0755; # mode to give directories created locally
+$default{ 'force' } = 0;       # don't force by default
+$default{ 'umask' } = 07000; # DONT allow setuid things by default
+$default{ 'use_timelocal' }  = 1; # Use local time NOT gmt to timestamp files. 
(See also the -T flag.)
+$default{ 'force_times' } = 1; # Force local file times to match the original
+
+$default{ 'do_deletes' } = 0;  # delete dest files if not in src tree
+$default{ 'delete_patt' } = '.';# delete only files which match this pattern
+$default{ 'delete_get_patt' } = 0;# true: set delete_patt to get_patt
+$default{ 'delete_excl' } = ''; # regex of local pathnames to ignore when 
deleting
+$default{ 'max_delete_files' } = '10%'; # Any more than this and DONT delete
+$default{ 'max_delete_dirs' } = '10%'; # Any more than this and DONT delete
+$default{ 'save_deletes' } = 0;        # save local files if not in remote
+$default{ 'save_dir' } = 'Old';        # directory in which to create tree for 
keeping
+                               # files no longer in remote
+$default{ 'store_remote_listing' } = ''; # Where to store remote site listings 
on local system
+
+$default{ 'compress_patt' } = ''; # compress files matching this pattern
+$default{ 'compress_excl' } = $squished; # dont compress regexp (case 
insensitive)
+$default{ 'compress_prog' } = $sys_compress_prog; # Program to compress files.
+$default{ 'compress_suffix' } = $sys_compress_suffix; # Suffix on compressed 
files
+$default{ 'compress_conv_patt' } = '(\.Z|\.taz)$';
+       # compress->gzip files matching this pattern
+$default{ 'compress_conv_expr' } = 's/\.Z$/.gz/;s/\.taz$/.tgz/';
+       # perl expressions to convert names of files from compress->gzip
+$default{ 'compress_size_floor' } = 0;  # don't compress files < this size
+
+$default{ 'split_max' } = 0;   # Files > this size can be split up.
+$default{ 'split_patt' } = '';  # Files must match this pattern to be split
+$default{ 'split_chunk' } = 100 * 1024; # Size of split-up chunks
+
+$default{ 'remote_fs' } = 'unix'; # Remote filestore
+       # Other posibilies dls, netware and vms
+$default{ 'ls_lR_file' } = ''; # remote file containing ls-lR, patch or 
+                               # times - else use remote ls
+$default{ 'local_ls_lR_file' } = ''; # local file containing ls-lR
+                               # used when first copying a large remote package
+                               # or ls_lR_file is a remote ls-lR patch or times
+$default{ 'recursive' } = 1;   # true indicates to do recursive processing
+$default{ 'recurse_hard' } = 0;        # true indicates have to cwd+ls for 
each remote
+                               # subdirectory - AVOID wherever possible.
+$default{ 'flags_recursive' } = '-lRat'; # Flags passed to remote dir
+$default{ 'flags_nonrecursive' } = '-lat'; # Flags passed to remote dir
+$default{ 'ls_fix_mappings' } = '';# Correct pathnames in remote listings
+                               # (eg s:usr/spool/pub/::) to match reality
+
+$default{ 'update_log' } = ''; # Filename where an update report is to be kept
+$default{ 'mail_to' } = '';    # Mail a report to these addresses
+$default{ 'mail_prog' } = $mail_prog; # the mail program (see $mail_prog)
+$default{ 'mail_subject' } = $mail_subject; # Subject passed to mail_prog
+
+$default{ 'comment' } = '';    # General comment used in report
+# If mirroring a VERY large directory then it is best to put the assoc
+# arrays in files (use command line switch -F. to turn on).
+$default{ 'use_files' }  = 0;
+$default{ 'interactive' } = 0; # noninteractive copy default
+$default{ 'skip' } = '';       # If set then skip this entry giving value as 
reason
+$default{ 'verbose' } = 0;     # Verbose messages
+$default{ 'algorithm' } = 0;   # The mirror algorithm to use
+$default{ 'local_dir_check' } = 0; # Check local_dir exists before mirroring?
+
+# I really want to drop this option.
+$default{ 'delete_source' } = 0;# delete source after xfer (default = NO!!!)
+
address@hidden = ( 'get_newer', 'get_size_change', 'do_deletes',
+       'update_local', 'force_times', 'retry_call', 'recursive',
+       'mode_copy', 'disconnect', 'interactive', 'text_mode',
+       'force', 'get_file', 'verbose', 'proxy', 'delete_get_patt',
+       'delete_source', 'save_deletes', 'use_files', 'use_timelocal',
+       'make_bad_symlinks', 'get_symlink_files', 'recurse_hard', 
+       'get_missing', 'strip_cr', 'passive_ftp', 'using_socks', 
+       'local_dir_check' );
+
+%boolean_values = ();
+&set_assoc_from_array( *boolean_values );
+
address@hidden = ( 'get_patt', 'exclude_patt', 'local_ignore',
+                 'delete_patt', 'delete_excl', 'split_patt', 'save_deletes',
+                 'compress_patt', 'compress_excl', 'compress_conv_patt',
+                 'failed_gets_excl', 'store_remote_listing' );
+
+#
+# message levels used by &msg( level, msg )
+# if you call msg as &msg( msg ) the level is presumed to be just $pr.
+$pr = 0;       # Always print out messages
+$log = 1;      # push this messages onto @log
+
+# The max number of directory failures under algorithm 1 before giving up.
+$max_failed_dirs = 5;
+
+#
+# Exit status
+$exit_status = 0;
+$exit_status_xfers = 0;
+
+# "#defines" for the above
+$exit_xfers = 16;  # Add this to the exit code to show xfers took place
+$exit_ok = 0;
+$exit_fail = 1;
+$exit_fail_noconnect = 2;
+
+# -d           Turn on debugging - more -d's means more debugging.
+# -ppattern    Just do packages matching pattern.
+# -Rpattern    Skip till the first package name matches pattern then do all.
+#              it and following packages.
+# -n           Do nothing, just show what would be done.
+# -F           Use files for assoc arrays (see also the variable use_files).
+# -gsite:path
+#              Get all files on given site.  If path matches .*/.+ then
+#              it is the name of the directory and the last part is the
+#              pattern of filenames to get.  If path matches .*/ then
+#              it is the name of a directory and all its contents are 
retrieved.
+#              Otherwise path is the pattern to be used in '/'.
+# -r           Same as "-krecursive=false".
+# -kvar=val    set variable to value.
+# -uusername   Same as "-kremote_user=username", prompts for remote_password.
+# -v           Print version and exit.
+# -T           Dont transfer just force local timestamps to match remote.
+# -N           Don't load mirror.defaults.
+# -L           Generate a pretty list of what is being mirrored.
+# -m           Same as "-kmode_copy=true".
+
+# -Cconfig_file
+# -P           Same as "-kget_file=false -kinteractive=true".
+# -G           Same as "-kget_file=true -kinteractive=true".
+# -t           Same as "-ktext_mode=true".
+# -f           Same as "-kforce=true".
+# -sSITENAME   Same as "-ksite=SITENAME.
+# -ULOGFILE    Set the upload log to LOGILE - if none given uses
+#              the file $home/upload_log.$mday.$mon.$year
+
+# -DUMP                Dump perl - to be later undumped --  THIS DOES NOT YET 
WORK!!!
+
+sub msg_version
+{
+       &msg( '$Id: mirror.pl,v 2.9 1998/05/29 19:01:07 lmjm Exp lmjm $' . "\n" 
);
+       &msg( 'Debian patch version: mirror (2.9-38)  Tue Jan 29 07:06:25 2002 
UTC.' . "\n" );
+       &msg( 'Copyright conditions are in file 
/usr/share/doc/mirror/copyright.' . "\n" );
+}
+
+parse_args:
+while( $ARGV[ 0 ] =~ /^-/ ){
+       local( $arg ) = shift;
+
+       if( $arg eq '-d' ){
+               if( $debug == 2 ){
+                       &msg_version();
+               }
+               $| = 1;
+               $debug++;
+               next;
+       }
+
+       if( $arg =~ /^-(p)(.*)/ || $arg =~ /^-(R)(.*)/ ){
+               local( $flag, $p ) = ($1, $2);
+               if( $flag eq 'R' ){
+                       # Skip all packages till a match is made
+                       # then process ALL further packages
+                       $skip_till = 1;
+               }
+               if( ! $p ){
+                       # Must be -p/-R space arg
+                       $p = shift;
+               }
+               if( $p !~ /[a-zA-Z0-9]/ ){
+                       die "Invalid package name to -p of: $p\n";
+                       next;
+               }
+               # Only mirror the named packages
+               $do_packages{ $p } = 1;
+               $limit_packages = 1;
+               next;
+       }
+
+       if( $arg eq '-n' ){
+               # Do nothing - just show what would be done
+               $dont_do = 1;
+               $debug += 2;
+               $| = 1;
+               next;
+       }
+
+       if( $arg eq '-F' ){
+               # Use files for the dir listings assoc lookups
+               $use_files = 1;
+               $command_line{ 'use_files' } = 1;
+               next;
+       }
+
+       if( $arg eq '-T' ){
+               # Don't actually get any files but just force
+               # local timestamps to be the same on the remote system
+               $timestamp = 1;
+               $command_line{ 'force_times' } = 'true';
+               next;
+       }
+
+       if( $arg =~ /^-g(.*)$/ ){
+               # the next arg is the site:path to get
+               local( $site_path ) = $1;
+
+               if( ! $site_path ){
+                       # Must be -g space arg
+                       $site_path = shift;
+               }
+               
+               # DONT use the system defaults!
+               $load_defaults = 0;
+               
+               # This is probably interactive so print interactively
+               $| = 1;
+               
+               if( $site_path =~ /(.*):(.*)?/ ){
+                       local( $site, $path ) = ($1, $2);
+                       push( @get_sites, $site );
+                       # Find the directory and files
+                       if( $path =~ m|^(.*)/([^/]*)$| ){
+                               if( $1 eq '' && $2 eq '' ){
+                                       push( @get_paths, '/' );
+                                       push( @get_patt, '.' );
+                               }
+                               elsif( $1 eq '' ){
+                                       push( @get_paths, '/' );
+                               }
+                               else {
+                                       push( @get_paths, $1 );
+                               }
+                               if( $2 eq '' ){
+                                       push( @get_patt, '.' );
+                               }
+                               else {
+                                       push( @get_patt, "^$2\$" );
+                               }
+                       }
+                       else {
+                               push( @get_paths, '.' );
+                               push( @get_patt, "^$path\$" );
+                       }
+               }
+               else {
+                       die "expected -gsite:path got $arg";
+               }
+               next;
+       }
+
+       if( $arg eq "-r" ){
+               # no recursive copy
+               $command_line{ 'recursive' } = 0;
+               next;
+       }
+# Debian bug #93853, -k keyword=value did not work, address@hidden 
+       if( $arg =~ /^-k(.*)/ ){
+               local( $key_val ) = $1;
+               if( ! $key_val ){
+                       # Must be -k space key=val
+                       $key_val = shift;
+               }
+               if( $key_val =~ /(.*)=(.*)/ ){ 
+                       # set the keyword = value
+                       if( !defined( $default{ "$1" } ) ){
+                           warn "Invalid keyword $1\n";
+                       } else {
+                           $command_line{ "$1" } = $2;
+                       }
+               }
+               next;
+       }
+
+       if( $arg =~ /^-u(.*)/ ){
+               local( $user ) = $1;
+
+               if( ! $user ){
+                       # must be -u space user
+                       $user = shift;
+               }
+
+               # override the user name
+               $command_line{ 'remote_user' } = $user;
+               # and ask for a password
+               $command_line{ 'remote_password' } = &get_passwd( $user );
+               next;
+       }
+
+       if( $arg eq '-N' ){
+               $load_defaults = 0;
+               next;
+       }
+
+       if( $arg eq '-v' ){
+               &msg_version();
+               exit( 0 );
+       }
+
+        if( $arg eq '-L' ){
+                # Generate a pretty list of what is being mirrored
+                $pretty_print = 1;
+                next;
+        }
+
+        if( $arg eq '-m' ){
+                # propagate the mode
+               $command_line{ 'mode_copy' } = 'true';
+               next;
+        }
+
+       # Old command line interface flags
+       if( $arg =~ /^-C(.*)/ ){
+               # specify the config file
+               local( $c ) = $1;
+               if( $c !~ /./ ){
+                       die "Must give config file name -Cname ($arg)\n";
+               }
+               # Only mirror the named packages
+               push( @config_files, $c);
+               next;
+       }
+
+        if( $arg eq '-P' ){
+                # put files
+               $command_line{ 'get_file' } = 'false';
+               $command_line{ 'interactive' } = 'true';
+               next;
+        }
+
+        if( $arg eq '-G' ){
+                # get files
+               $command_line{ 'get_file' } = 'true';
+               $command_line{ 'interactive' } = 'true';
+               next;
+        }
+
+        if( $arg eq '-t' ){
+                # set the file mode to text
+               $command_line{ 'text_mode' } = 'true';
+               next;
+        }
+
+        if( $arg eq '-f' ){
+                # force file transfers irregardless of date/size matches
+               $command_line{ 'force' } = 'true';
+               next;
+        }
+
+       if( $arg =~ /^-s(.*)/ ){
+               # override the site name
+               $command_line{ 'site' } = $1;
+               next;
+       }
+
+       if( $arg =~ /^-U(.*)/ ){
+               $upload_log = $1;
+               if( $upload_log eq '' ){
+                       local( $sec,$min,$hour,$mday,$mon,$year,
+                               $wday,$yday,$isdst ) 
+                               = localtime( time );
+                       $mon++;
+                       $upload_log = "$home/upload_log.$mday.$mon.$year";
+               }
+                       
+               next;
+       }
+
+       if( $arg eq '-DUMP' ){
+               # THIS DOES NOT YET WORK!!!!!
+               $dumped_version = 1;
+               warn "Dumping perl\n";
+               dump parse_args;
+       }
+
+       warn "Unknown arg $arg, skipping\n";
+}
+
+# Handle multiline buffers in a sane way
+# This is deprecated in perl-5.  Someone should add "/m" modifiers to any
+# regexps that *really* need it, not all.
+# $* = 1;
+
+$interactive = $command_line{ 'interactive' };
+
+if( ! $interactive ){
+       local( $c );
+
+       # The remainder of ARGV are package names
+       foreach $c ( @ARGV ){
+               push( @config_files, $c );
+       }
+}
+
+if( $interactive && $limit_packages){
+       die "Can not mix -p and interactive";
+}
+
+$value{ 'remote_user' } = $default{ 'remote_user' };
+%value = ();
+&set_defaults();
+
+if( $load_defaults ){
+       local( $dir, $mp );
+       foreach $dir ( @INC ){
+               local( $f ) = "$dir/$defaults_file";
+               if( -f $f ){
+                       $mp = $f;
+                       last;
+               }
+       }
+       if( $mp ){
+               &msg( "defaults from $mp\n" ) if $debug > 2;
+               splice( @config_files, 0, 0, $mp );
+       }
+       else {
+               warn "No $defaults_file found in perl library path\n";
+       }
+}
+elsif( $debug > 1 ){
+       &msg( "not loading $defaults_file\n" );
+}
+               
+
+&interpret_config_files();
+
+# Shut down any remaining ftp session
+&disconnect();
+
+&msg( "All done, Exiting\n" ) if $debug;
+exit( $exit_status + $exit_status_xfers );
+
+
+$key = ''; # The current keyword
+$value = ''; # the value for the keyword
+
+sub interpret_config_files
+{
+       local( $fname );
+
+       if( $#get_sites >= 0 ){
+               while( $#get_sites >= 0 ){
+                       $value{ 'site' } = pop( @get_sites );
+                       $value{ 'remote_dir' } = pop( @get_paths );
+                       $value{ 'get_patt' } = pop( @get_patt );
+                       $value{ 'local_dir' } = '.';
+                       $value{ 'remote_user' } = 'anonymous';
+                       $exit_status = &do_mirror();
+               }
+               return;
+       }
+               
+
+       if( $command_line{ 'interactive' } ){
+               # No config file to read
+               $value{ 'package' } = 'interactive';
+               $exit_status = &do_mirror();
+               return;
+       }
+
+       # if no configuration files were specified use standard input
+       @ARGV = @config_files;
+       &interpret_config();
+}
+
+sub interpret_config
+{
+       while( <> ){
+               # Ignore comment and blank lines
+               next if /^\s*#/ || /^\s*$/;
+               
+               &parse_line();
+               
+               # Is this a new package?
+               if( $value{ 'package' } && $key eq 'package' ){
+                       # mirror the existing package
+                       $exit_status = &do_mirror();
+                       
+                       # reset
+                       &set_defaults();
+
+                       # Make sure I'm at the right place for <> to work!
+                       chdir $home;
+               }
+               
+               if( $debug > 3 ){
+                       &msg( "$key \"$value\"\n" );
+               }
+
+               $value{ $key } = $value;
+
+               # do an explicit close for each file so $. gets reset
+               if( eof( ARGV ) ){
+                       if( $debug > 3 ){
+                               &msg( "-- end of config file \"$ARGV\"\n" );
+                       }
+                       close( ARGV );
+               }
+       }
+
+       # Mirror the last package in the file
+       if( $value{ 'package' } ){
+               $exit_status = &do_mirror();
+       }
+}
+
+# parse each line for keyword=value
+sub parse_line
+{
+       local( $eqpl );
+       local( $cont ) = '&';
+
+       chop;
+       if( /^\s*([^\s=+]+)\s*([=+])(.*)?$/ ){
+               ($key, $eqpl, $value) = ($1, $2, $3);
+               # If the value ends in the continuation character then
+               # tag the next line on the end (ignoring any leading ws).
+               while( $value =~ /^(.*)$cont$/o && !eof ){
+                       $_ = <>;
+                       local( $v ) = $1;
+                       if( /^\s*(.*)$/ ){
+                               $value = $v . $1;
+                       }
+               }
+               if( $debug > 3 ){
+                       &msg( "read: $key$eqpl$value\n" );
+               }
+       }
+       else {
+               warn "unknown input in \"$ARGV\" line $. of: $_\n";
+       }
+       if( ! defined( $default{ "$key" } ) ){
+               die "unknown keyword in \"$ARGV\" line $. of: $key\n";
+       }
+       if( $eqpl eq '+' ){
+               $value = $value{ $key } . $value;
+       }
+}
+
+# Initialise the key values to the default settings
+sub set_defaults
+{
+       %value = %default;
+       undef( $uid );
+       undef( $gid );
+}
+
+# Override the current settings with command line values
+sub command_line_override
+{
+       local( $key, $val, $overrides );
+
+       while( ($key, $val) = each %command_line ){
+               $overrides++;
+               if( $boolean_values{ $key } ){
+                       # a boolean value
+                       $value{ $key } = &istrue( $val );
+               } else {
+                       # not a boolean value
+                       $value{ $key } = $val;
+               }
+       }
+
+       if( $debug > 4 ){
+               if( $overrides ){
+                       &pr_variables( "keywords after command line override\n" 
);
+               }
+               else {
+                       &msg( "No command line overrides\n" );
+               }
+       }
+}
+
+# set each variable $key = $value{ $key }
+sub set_variables
+{
+       local( $key, $val );
+
+       while( ($key, $val) = each %value ){
+               # for things like passwords it is nice to have the
+               # real value in a file
+               if( $val =~ /^\<(.*)$/ ){
+                       local( $val_name ) = $1;
+                       open( VAL_FILE, $val_name ) ||
+                               die "can't open value file $val_name\n";
+                       $val = <VAL_FILE>;
+                       close( VAL_FILE );
+                       chop $val if $val =~ /\n$/;
+               }
+
+               if( $boolean_values{ $key } ){
+                       # a boolean value
+                       eval "\$$key = &istrue( $val )";
+               }
+               else {
+                       # not a boolan value
+                       # Change all \ to \\ since \'s will be escaped in
+                       # the following string used in the eval.
+                       $val =~ s/([^\\])(')/$1\\$2/g;
+                       eval "\$$key = '$val'";
+               }
+               if( $key eq 'compress_prog' ){
+                       if( $val eq 'compress' ){
+                               $compress_prog = $sys_compress_prog;
+                               $compress_suffix = $sys_compress_suffix;
+                       }
+                       elsif( $val eq 'gzip' ){
+                               if( ! $gzip_prog ){
+                                       die "Trying to use gzip but not found 
in PATH\n";
+                               }
+                               $compress_prog = $gzip_prog;
+                               $compress_suffix = $gzip_suffix;
+                       }
+                       elsif( $debug > 2 && $compress_prog ne $gzip_prog &&
+                              $compress_prog ne $sys_compress_prog ){
+                               &msg( "compress_prog ($compress_prog) not 
compress or gzip, presuming program name\n" .
+                                     "- user must set compress_suffix\n" );
+                       }
+                       &upd_val( 'compress_prog' );
+                       &upd_val( 'compress_suffix' );
+               }
+       }
+       if( $compress_patt ne '' && $compress_prog eq '' ){
+               &msg( "compress_patt set but no compress_prog so compress_patt 
reset to nothing" );
+               $compress_patt = '';
+       }
+               
+
+       # Reset the umask if needed.
+       # Do it here to try and get it done as early as possible.
+       # If the user doesn't use octal umasks this will cause umask
+       # to be called again unnecessarily - but that is pretty cheap.
+       if( $umask && $umask != $curr_umask ){
+               local( $val ) = $umask;
+               $val = oct( $val ) if $val =~ /^0/;
+               umask( $val );
+               $curr_umask = sprintf( "0%o", umask );
+       }
+
+       &map_user_group();
+}
+
+sub upd_val
+{
+       local( $key ) = @_;
+       if( $package eq 'defaults' ){
+               $default{ $key } = $value{ $key };
+       }
+}
+
+sub pr_variables
+{
+       local( $msg ) = @_;
+       local( $nle ) = 60;
+       local( $out ) = 0;
+       local( $key, $val, $str );
+
+       &msg( $msg );
+       if( $get_file ){
+               &msg( "package=$package  $site:$remote_dir -> $local_dir\n\t" );
+       }
+       else {
+               &msg( "package=$package  $local_dir -> $site:$remote_dir\n\t" );
+       }
+
+       for $key ( sort keys( %value ) ){
+               next if $key eq 'package' ||
+                       $key eq 'site' ||
+                       $key eq 'remote_dir' ||
+                       # Don't show passwords when interactive
+                       ($interactive && $key eq 'remote_password') ||
+                       ($interactive && $key eq 'remote_gpass');
+               # Report the value in the actual variable
+               $val = eval "\$$key";
+               $str = "$key=\"$val\" ";
+               &msg( $str );
+               $out += length( $str );
+               # Output newlines when a line is full
+               if( $out > $nle ){
+                       $out = 0;
+                       &msg( "\n\t" );
+               }
+       }
+       &msg( "\n" );
+}
+
+# Mirror the package, return exit_status
+sub do_mirror
+{
+       local( $get_one_package ) = 0;
+
+       $package = $value{ 'package' };
+       
+       if( $package eq 'defaults' ){
+               # This isn't a real site - just a way to change the defaults
+               %default = %value;
+
+               return $exit_ok;
+       }
+
+       # Only do this package if given by a -Ppack argument
+       if( $limit_packages && ! $do_packages{ $package } ){
+               return;
+       }
+
+       if( $skip_till ){
+               # Found a package so process all packages from now on
+               $skip_till = $limit_packages = 0;
+       }
+       
+       local( $exit_status ) = $exit_fail_noconnect;  # Presume the worse.
+       $timeouts = 0;
+
+       # set things from the command line arguments
+       &command_line_override();
+
+       if( ! &checkout_regexps() ){
+               &msg( "skipping package\n\n" );
+               return $exit_status;
+       }
+
+       # set each variable $key = $value{ $key }
+       &set_variables();
+
+       # don't trash locally glossed over things with stuff from the remote
+       if( $local_ignore ){
+               if( $exclude_patt ){
+                       $exclude_patt .= '|' . $local_ignore;
+               }
+               else {
+                       $exclude_patt = $local_ignore;
+               }
+       }
+
+       if( $debug > 3 ){
+               &pr_variables( "\n" );
+       }
+       elsif( $package && ! $pretty_print ){
+               if( $get_patt ){
+                       &msg( "package=$package $site:$remote_dir -> 
$local_dir\n");
+               }
+               else {
+                       &msg( "package=$package $local_dir -> 
$site:$remote_dir\n" );
+               }
+               &msg( "algorithm=$algorithm\n") if $algorithm != 0;
+       }
+       
+       # Don't bother if trying to mirror here!
+       if( !$interactive && !$force && ((gethostbyname( $site ))[0] eq 
$hostname) ){
+               &msg( "Skipping $site as it is this local site!\n\n" );
+               return $exit_ok;
+       }
+
+       chdir $home;
+
+       $max_age = 0;
+       if( $value{ 'max_days' } ne '0' ){
+               $max_age = time - ($value{ 'max_days' } * 24 * 60 * 60);
+               &msg( "max_age = $max_age\n" ) if $debug > 1;
+       }
+
+       # pull in external code, if required
+       if( $external_mapping ){
+               &msg( "Loading external mapping from $external_mapping.\n" ) if 
$debug > 0 ;
+               do $external_mapping || die "Cannot load from 
$external_mapping";
+       }
+
+       if( $debug ){
+               # Keep the ftp debugging lower than the rest.
+               &ftp'debug( $debug - 1);
+       }
+       else {
+               &ftp'debug( $verbose );
+       }
+
+       if( $recurse_hard ){
+               $recursive = 1;
+       }
+       if( $algorithm == 1 ){
+               $recursive = 0;
+               $make_bad_symlinks = 1;
+               $rem_start_len = length( $remote_dir );
+       }
+
+       if( ! $interactive ){
+               $ftp'showfd = 'STDOUT';
+       }
+       &ftp'set_timeout( $timeout );
+       &ftp'set_signals( "main'msg" );
+
+       # set passive ftp mode
+       if( $passive_ftp ){
+               $ftp'use_pasv = 1;
+       }
+
+       # Are we using the SOCKS version of perl?
+       if( $using_socks ){
+               $chat'using_socks = 1;
+       }
+
+       # Useful string in prints
+       $XFER = $get_file ? "get" : "put";
+
+       # create the list of items to copy
+       @transfer_list = ();
+       if( $interactive ){
+               if( $algorithm == 1 ){
+                       warn "Cannot use algorithm 1 with interactive, using 
0\n";
+                       $algorithm = 0;
+               }
+               # copy the remainder of items from argv to the transfer list
+               while( @ARGV ){
+                       # copy the local directory
+                       if( @ARGV ){
+                               push( @transfer_list, shift( @ARGV ) );
+                       } 
+       
+                       # copy the remote directory
+                       if( @ARGV ){
+                               push( @transfer_list, shift( @ARGV ) );
+                       }
+                       else {
+                               die "remote directory must be specified\n";
+                       }
+       
+                       # copy the pattern, if available
+                       if( @ARGV ){
+                               push( @transfer_list, shift( @ARGV ) );
+                       } else {
+                               push( @transfer_list, $default{ 'get_patt' } );
+                       }
+               }
+       
+               if( $debug > 1 ){
+                       local( @t );
+                       @t  = @transfer_list;
+       
+                       while( @t ){
+                               printf( "local_dir=%s remote_dir=%s patt=%s\n",
+                                       shift( @t ), shift( @t ), shift( @t ) );
+                       }
+               }
+       }
+       else {
+               push( @transfer_list, $local_dir );
+               push( @transfer_list, $remote_dir );
+               push( @transfer_list, $get_patt );
+               if( $algorithm != 1 ){
+                       $get_one_package = 1;
+               }
+        }
+               
+
+       if( $update_local && $get_patt ){
+               if( $get_patt ne $default{ 'get_patt' } ){
+                       &msg( "Cannot mix get_patt and update_local.  get_patt 
ignored\n" );
+               }
+               $get_patt = '';
+       }
+
+       
+       if( !$site || (!$interactive && (!$local_dir || !$remote_dir)) ){
+               &msg( "Insufficient details for package to be fetched\n" );
+               &msg( "Must give at least: site, remote_user, remote_dir and 
local_dir\n\n" );
+               return $exit_status;
+       }
+
+        if( $pretty_print ){
+                # Don't actually mirror just print a pretty list
+                # of what would be mirrored.  This is for mailing to
+                # people
+               if( $skip ){
+                       return $exit_ok;
+               }
+                &msg( "$package  \"$comment\"\n" );
+                &msg( "  $site:$remote_dir  -->  $local_dir\n\n" );
+                return $exit_ok;
+        }
+
+       if( $skip ){
+               &msg( "Skipping $site:$package because $skip\n\n" );
+               return $exit_ok;
+       }
+
+       $split_max = &to_bytes( $split_max );
+       $split_chunk = &to_bytes( $split_chunk );
+
+       if( $split_max && $split_max <= $split_chunk ){
+               &msg( "split_max <= split_chunk - skipping package\n" );
+               &msg( " $split_max <= $split_chunk\n\n" );
+               return $exit_status;
+       }
+
+       if( $split_chunk && ($split_chunk & 511) ){
+               &msg( "split_chunk bad size - skipping package\n" );
+               &msg( " $split_chunk should be a multiple of 512 bytes\n\n" );
+               return $exit_status;
+       }
+
+       if( $local_dir_check && ! -d $local_dir ){
+               &msg( "local_dir $local_dir does not exist - skipping 
package\n" );
+               return $exit_status;
+       }
+
+       if( $get_one_package && $algorithm != 1 ){
+               # If only getting one package may as well parse the
+               # local directory listings before connecting to the
+               # remote site.  (With the status_file stuff this info
+               # can then be reused if something goes wrong.)
+               if( $use_files ){
+                       &create_assocs();
+               }
+
+               if( !&get_local_directory_details() ){
+                       &msg( "Cannot get local directory details 
($local_dir)\n" );
+                       &disconnect();
+                       &msg( "\n" );
+                       return $exit_status;
+               }
+       }
+
+       local( $con ) = &connect();
+       if( $con <= 0 ){
+               &msg( "Cannot connect, skipping package\n" );
+               &disconnect();
+               &msg( "\n" );
+               return $exit_status;
+       }
+
+       if( $con == 1 ){
+               &msg( "login as $remote_user\n" ) if $debug > 1;
+               $curr_remote_user = $remote_user;
+               if( ! &ftp'login( $remote_user, $remote_password, 
$remote_account ) ){
+                       &msg( "Cannot login, skipping package\n" );
+                       &disconnect();
+                       &msg( "\n" );
+                       return $exit_status;
+               }
+               $can_restart = (&ftp'restart(0) == 1);
+               if( $debug > 1 ){
+                       &msg( "Can " . ($can_restart ? '' : "not ") . "do 
restarts\n" );
+
+               }
+       }
+       else {
+               # Already connected to this site - so no need to login again
+               &msg( "Already connected to site $site\n" ) if $debug;
+       }
+
+       if( ! &ftp'type( $text_mode ? 'A' : 'I' ) ){
+               &msg( "Cannot set type\n" );
+       }
+
+       $exit_status = $exit_fail; # ok this is now the worse case
+
+       # Mirror thinks in terms of Unix pathnames.
+       # Ask ftp.pl to map any remote name it is about to use by
+       # setting the namemap functions.
+       if( $remote_fs =~ /vms/i ){
+               $vms = 1;
+               &ftp'set_namemap( "main'unix2vms", "main'vms2unix" );
+       }
+       else {
+               $vms = 0;
+               # No mapping necessary
+               &ftp'set_namemap( '' );
+       }
+
+       if( ! $get_file || $remote_idle ){
+               local( @rhelp ) = &ftp'site_commands();
+               $remote_has_chmod = grep( $_ eq 'CHMOD', @rhelp);
+               $remote_has_rename = grep( $_ eq 'RNFR', @rhelp) && grep( $_ eq 
'RNTO', @rhelp);
+               $remote_has_idle = grep( $_ eq 'IDLE', @rhelp);
+               if( $debug > 2 ){
+                       &msg( "remote site " . ($remote_has_chmod ? "has" : 
"hasn't") . " got chmod\n" );
+                       &msg( "remote site " . ($remote_has_idle ? "has" : 
"hasn't") . " got idle\n" );
+               }
+       }
+       
+       if( $remote_has_idle && $remote_idle ){
+               if( ! &ftp'quote( "site idle $remote_idle" ) ){
+                       &msg( "Cannot set remote idle\n" );
+               }
+               elsif( $debug > 2 ){
+                       &msg( "remote idle has been set to $remote_idle\n" );
+               }
+       }
+
+       if( $remote_group ){
+               if( ! &ftp'quote( "site group $remote_group" ) ){
+                       &msg( "Cannot set remote group\n" );
+               }
+               elsif( $debug > 2 ){
+                       &msg( "remote group has been set to $remote_group\n" );
+               }
+       }
+       
+       if( $remote_gpass ){
+               if( ! &ftp'quote( "site gpass $remote_gpass" ) ){
+                       &msg( "Cannot set remote gpass\n" );
+               }
+               elsif( $debug > 2 ){
+                       &msg( "remote gpass has been set\n" );
+               }
+       }
+
+       @log = ();
+       $cannot = 0;
+
+       local( @sub_dirs );
+       while( @transfer_list ){
+               # get files
+               $local_dir = shift( @transfer_list );
+               $remote_dir = shift( @transfer_list );
+               $get_patt = shift( @transfer_list );
+
+               # Clear all details
+               undef( @xfer_dest );
+               undef( @xfer_src );
+               undef( @xfer_attribs );
+               undef( @things_to_make );
+               undef( @sub_dirs );
+
+               if( ! $get_one_package ){
+                       if( $use_files ){
+                               &create_assocs();
+                       }
+
+                       if( !&get_local_directory_details() ){
+                               &msg( "Cannot get local directory details 
($local_dir)\n" );
+                               &disconnect();
+                               &msg( "\n" );
+                               return $exit_status;
+                       }
+               }
+
+               # Create a get_patt from the contents of the local directory
+               if( $update_local && $#get_top >= 0 ){
+                       $get_patt = '^' . join( '|^', @get_top );
+                       $get_patt =~ s/$squished//g;
+                       &msg( "get_patt = $get_patt\n" ) if $debug;
+               }
+       
+               if( !&get_remote_directory_details() ){
+                       &msg( "Cannot get remote directory details 
($remote_dir)\n" );
+                       if( $algorithm == 1 ){
+                               # Skip this directory.
+                               $cannot++;
+                               if( $cannot < $max_failed_dirs ){
+                                       next;
+                               }
+                               # Too many failed directories.  Fall thru'
+                               # into disconnect.
+                       }
+                       &disconnect();
+                       &msg( "\n" );
+                       return $exit_status;
+               }
+       
+               if( $get_file ){
+                       &compare_dirs(
+                               *remote_sorted,
+                                *remote_map, *remote_time,
+                                 *remote_size, *remote_type,
+                               *local_sorted,
+                                *local_map, *local_time,
+                                 *local_size, *local_type,
+                                  *local_keep, *local_keep_totals );
+               } else {
+                       &compare_dirs(
+                               *local_sorted,
+                                *local_map, *local_time,
+                                 *local_size, *local_type,
+                               *remote_sorted,
+                                *remote_map, *remote_time,
+                                 *remote_size, *remote_type,
+                                  *remote_keep, *remote_keep_totals );
+               }
+
+               if( $timestamp ){
+                       &set_timestamps();
+                       if( $algorithm == 1 ){
+                               foreach $sd ( @sub_dirs ){
+                                       push( @transfer_list, "$local_dir/$sd" 
);
+                                       push( @transfer_list, "$remote_dir/$sd" 
);
+                                       push( @transfer_list, $get_patt );
+                               }
+                       }
+
+                       next;
+               }
+
+               &make_dirs();
+               &do_all_transfers();
+
+               $exit_status = $exit_ok;        # Everything went ok.
+
+               if( $get_file ){
+                       # I must have finished with the remote information
+                       # so clear it out.
+                       &clear_remote();
+               }
+               else {
+                       # clear out local info.
+                       &clear_local();
+               }
+               
+               if( $save_deletes ){
+                       # If $save_dir is null, make $save_dir to be
+                       # subdirectory 'Old' under 
+                       # current path
+                       if( ( ! defined( $save_dir ) ) || ( $save_dir eq '' ) ){
+                               $save_dir = "$cwd/Old";
+                       }
+
+                       # If $save_dir is not absolute, take it as
+                       # subdirectory of current path
+                       if( $save_dir !~ m,^/, ){
+                                       $save_dir = "$cwd/$save_dir";
+                               }
+               }
+
+               if( $do_deletes || $save_deletes ){
+                       if( $get_file ){
+                               &do_deletes(
+                                       *local_sorted,
+                                        *local_map,
+                                         *local_type, *local_keep,
+                                          *local_totals, *local_keep_totals );
+                       }
+                       else {
+                               &do_deletes(
+                                       *remote_sorted,
+                                        *remote_map,
+                                         *remote_type, *remote_keep,
+                                          *remote_totals, *remote_keep_totals 
);
+                       }
+               }
+
+               &make_symlinks();
+               undef( @things_to_make );
+
+               if( $algorithm == 1 ){
+                       foreach $sd ( @sub_dirs ){
+                               push( @transfer_list, "$local_dir/$sd" );
+                               push( @transfer_list, "$remote_dir/$sd" );
+                               push( @transfer_list, $get_patt );
+                       }
+               }
+
+               # No more transfers if the connection has died.
+               last if ! $connected;
+       }
+
+       &clear_local();
+       &clear_remote();
+       
+       if( $use_files ){
+               # Close and zap.
+               &delete_assocs();
+       }
+
+       # Should I force a disconnect now?
+       if( $connected && $disconnect ){
+               &disconnect();
+       }
+
+       if( $dont_do || $timestamp ){
+               # Don't generate logs/email
+               &msg( "\n" );
+               return $exit_status;
+       }
+
+       local( $now ) = &time_to_standard( time );
+       if( $update_log ){
+               if( ! open( LOGG, ">>$update_log" ) ){
+                       &msg( "Cannot append to $update_log because: $!\n\n" );
+                       # Serious but this shouldn't stop mirroring.
+                       # return $exit_fail;
+               }
+               print LOGG "mirroring $package ($site:$remote_dir) completed 
successfully \@ $now\n";
+               print LOGG @log;
+               close( LOGG );
+       }
+
+       if( $#log >= 0 && $mail_prog ne '' && $mail_to =~ /./ ){
+               local( $arg );
+               eval "\$arg = \"$mail_subject\"";
+               if( ! open( MAIL, "|$mail_prog $arg $mail_to" ) ){
+                       &msg( "Cannot run: $com\n\n" );
+                       return $exit_fail;
+               }
+               if( $get_patt ){
+                       print MAIL "Mirrored $package ($site:$remote_dir -> 
$local_dir) $comment \@ $now\n";
+               }
+               else {
+                       print MAIL "Mirrored $package ($local_dir -> 
$site:$remote_dir) $comment \@ $now\n";
+               }
+               print MAIL @log;
+               close( MAIL );
+       }
+       undef( @log );
+
+       &msg( "\n" );
+       return $exit_status;
+}
+
+
+sub disconnect
+{
+       if( $connected ){
+               &msg( "disconnecting from $connected\n" ) if $debug;
+               if( ! $ftp'fatalerror ){
+                       &ftp'close();
+               }
+               else {
+                       &ftp'service_closed();
+               }
+       }
+       $connected = '';
+}
+
+# Connect to the site
+# Return 0 on a fail,
+# 1 if a connection was successfully made,
+# 2 if already connected to the site
+sub connect
+{
+       local( $attempts ) = 1; # Retry ONCE! Be friendly.
+       local( $res );
+
+       if( $connected eq $site && $curr_remote_user eq $remote_user ){
+               # Already connected to this site!
+               return 2;
+       }
+
+       # Clear out any session active session
+       &disconnect();
+
+       if( $proxy ){
+           $ftp'proxy = $proxy;
+           $ftp'proxy_gateway = $proxy_gateway;
+           $ftp'proxy_ftp_port = $proxy_ftp_port;
+       }
+       $res = &ftp'open( $site, $ftp_port, $retry_call, $attempts );
+       if( $res == 1 ){
+               # Connected
+               $connected = $site;
+       }
+       return $res;
+}      
+
+# This just prods the remote ftpd to prevent time-outs
+sub prod
+{
+       return unless $connected;
+
+       if( $debug > 2 ){
+               &msg( " prodding remote ftpd\n" );
+       }
+       &ftp'pwd();
+}
+
+# checkout and fixup any regexps.
+# return 0 on an error
+sub checkout_regexps
+{
+       local( $ret ) = 1;
+       # Check out the regexps
+       local( $t ) = 'x';
+       foreach $r ( @regexp_values ){
+               # regexps should never begin or end with a | or have
+               # two in a row otherwise the pattern matches everything.
+               # Use null to match everything if thats what you mean.
+               $value{ $r } =~ s/\|+/|/g;
+               $value{ $r } =~ s/^\|//;
+               $value{ $r } =~ s/\|$//;
+               local( $val ) = $value{ $r };
+               next if ! $val;
+               eval '$t =~ /$val/';
+               if( $@ ){
+                       local( $err );
+                       chop( $err = $@ );
+                       &msg( "Problem with regexp $r ($err)\n" );
+                       $ret = 0;
+               }
+       }
+       return $ret;
+}
+
+sub clear_local
+{
+       if( ! $use_files ){
+               undef( %local_map );
+       }
+       undef( @local_sorted );
+       undef( @local_time );
+       undef( @local_size );
+       undef( @local_type );
+       undef( @local_mode );
+       undef( @local_keep );
+       undef( @local_totals );
+       undef( @local_keep_totals );
+}
+
+sub clear_remote
+{
+       if( ! $use_files ){
+               undef( %remote_map );
+       }
+       undef( @remote_sorted );
+       undef( @remote_time );
+       undef( @remote_size );
+       undef( @remote_type );
+       undef( @remote_mode );
+       undef( @remote_keep );
+       undef( @remote_totals );
+       undef( @remote_keep_totals );
+}
+
+sub get_local_directory_details
+{
+       local( @dirs, $dir );
+       local( $last_prodded ) = time; # when I last prodded the remote ftpd
+
+       $next_local_mapi = $map_init;
+       
+       &clear_local();
+       
+       # Make sure the first elem is 0.
+       $local_time[ 0 ] = 0;
+       $local_size[ 0 ] = 0;
+       $local_type[ 0 ] = 0;
+       $local_mode[ 0 ] = 0;
+
+       @get_top = ();
+
+       &msg( "Scanning local directory $local_dir\n" ) if $debug;
+       
+       if( ! -d $local_dir ){
+               &msg( "$local_dir no such directory - creating it\n" );
+               if( $dont_do || $timestamp ){
+                       return 1;
+               }
+               if( &mkdirs( $local_dir ) ){
+                       &msg( $log, "Created local dir $local_dir\n" );
+                       $exit_xfer_status |= $exit_xfers;
+               }
+               else {
+                       &msg( $log, "FAILED to create local dir $local_dir\n" );
+               }
+       }
+       if( !chdir( $local_dir ) ){
+               &msg( "Cannot change directory to $local_dir\n" );
+               return 0;
+       }
+
+       if( $local_dir =~ m,^/, ){
+               $cwd = $local_dir;
+       }
+       else {
+               &cwd();
+       }
+
+       # @dirs is the list of all directories to scan
+       # As subdirs are found they are added to the end of the list
+       # and as 
+       @dirs = ( "." );
+       # Most of these variables should be locals in blocks below but
+       # that seems to tickle a perl bug and causes a lot of memory to
+       # be wasted.
+       local( $dir_level ) = 0;
+       local( $i ) = 0;
+       local( $path, $time, $size, $type, $mode, $name, $isdir, $value, 
$follow );
+       local( $dev,$ino,$fmode,$nlink,$uid,$gid,$rdev,$ssize,
+                     $atime,$mtime,$ctime,$blksize,$blocks );
+       while( defined( $dir = shift( @dirs ) ) ){
+
+               if( !opendir( DIR, $dir ) ){
+                       &msg( "Cannot open local directory $dir, skipping it\n" 
);
+                       next;
+               }
+
+               while( defined( $name = readdir( DIR ) ) ){
+                       $isdir = 0;
+
+                       # Prod the remote system from time to time
+                       # To prevent time outs.  Only look once every 50 files
+                       # to save on unnecessary systems calls.
+                       if( ($i % 50 == 0) && time > ($last_prodded + 
$prod_interval) ){
+                               $last_prodded = time;
+                               &prod();
+                       }
+                       $i ++;
+
+                       $path = "$dir/$name";
+                       $path =~ s,(^|/)\./,,;
+                       next if $name eq '.' || $name eq '..' ||
+                               ($local_ignore && $path =~ /$local_ignore/);
+
+                       $follow = ($follow_local_symlinks ne '' && $path =~ 
/$follow_local_symlinks/);
+                       if( !$follow && -l $path ){
+                               $value = readlink( $path );
+                               ( 
$dev,$ino,$fmode,$nlink,$uid,$gid,$rdev,$ssize,
+                                     $atime,$mtime,$ctime,$blksize,$blocks ) =
+                                       lstat( _ );
+                               $size = $ssize;
+                               $time = $mtime;
+                               $type = "l $value";
+                               $mode = $fmode;
+                       }
+                       elsif( ($isdir = ($follow ? (-d $path) : (-d _))) ||
+                                -f _ ){
+                               ( 
$dev,$ino,$fmode,$nlink,$uid,$gid,$rdev,$ssize,
+                                     $atime,$mtime,$ctime,$blksize,$blocks ) =
+                                       stat( _ );
+                               $size = $ssize;
+                               $time = $mtime;
+                               $mode = $fmode;
+                               if( $isdir ){
+                                       push( @dirs, $path ) if $recursive;
+                                       $type = 'd';
+                               }
+                               else {
+                                       $type = 'f';
+                               }
+                               if( $dir_level == 0 && $update_local ){
+                                       push( @get_top, $path );
+                               }
+                       }
+                       else {
+                               &msg( "unknown file type $path, skipping\n" );
+                               next;
+                       }
+                       if( $debug > 2){
+                               printf "local: %s %s %s %s 0%o\n",
+                                       $path, $size, $time, $type, $mode;
+                       }
+                       if( $max_age && $time != 0 && $time < $max_age ){
+                               &msg( "   too old: $path\n" ) if $debug > 1;
+                               next;
+                       }
+
+                       local( $mapi ) = $next_local_mapi++;
+                       # push( @local_sorted, $path );
+                       $local_sorted[ $mapi - 1 ] = $path;
+                       $local_map{ $path } = $mapi;
+                       $local_time[ $mapi ] = $time;
+                       $local_size[ $mapi ] = $size;
+                       $local_type[ $mapi ] = $type;
+                       $local_mode[ $mapi ] = $mode;
+                       if( $type eq 'd' ){
+                               $local_totals[ 0 ]++;
+                       }
+                       else {
+                               $local_totals[ 1 ]++;
+                       }
+               }
+               closedir( DIR );
+               $dir_level++;
+
+               if( ! $recursive ){
+                       last;
+               }
+       }
+       return 1;
+}
+
+# Return true if the remote directory listing was brought back safely.
+sub get_remote_directory_details
+{
+       local( $type_changed ) = 0;
+       local( $udirtmp );
+       local( $storename ) = "/dev/null";
+
+       &msg( "Scanning remote directory $remote_dir\n" ) if $debug;
+       
+       if( $store_remote_listing ){
+               eval "\$storename = \"$store_remote_listing\"";
+       }
+
+       $next_remote_mapi = $map_init;
+       &clear_remote();
+
+       # Make sure the first elem is 0.
+       $remote_time[ 0 ] = 0;
+       $remote_size[ 0 ] = 0;
+       $remote_type[ 0 ] = 0;
+       $remote_mode[ 0 ] = 0;
+
+       if( $remote_fs !~ /cms/ && ! &ftp'cwd( $remote_dir ) ){
+               if( $get_file ){
+                       # no files to get
+                       return 0;
+               }
+
+               &msg( "Failed to change to remote directory ($remote_dir) 
trying to create it\n" );
+               &mkdirs( $remote_dir );
+
+               if( ! &ftp'cwd( $remote_dir ) ){
+                       &msg( "Cannot change to remote directory ($remote_dir) 
because: $ftp'response\n" );
+                       return 0;
+               }
+       }
+
+       local( $rls );
+
+       $use_ls = 0;
+
+       if( $local_ls_lR_file ){
+               local( $dirtmp ) = $local_ls_lR_file;
+               &msg( " Using local file $local_ls_lR_file for remote dir 
listing\n" ) if $debug;
+               local( $unsquish );
+               if( $dirtmp =~ /\.$sys_compress_suffix$/ ){
+                       $unsquish = $sys_compress_prog;
+               }
+               elsif( $dirtmp =~ /\.($gzip_suffix|$old_gzip_suffix)$/ ){
+                       $unsquish = $gzip_prog;
+               }
+               if( defined( $unsquish ) ){
+                       local( $f );
+                       $f = $dirtmp;
+                       $f =~ s/($shell_metachars)/\\$1/g;
+                       $dirtmp = "$unsquish -d < \"$f\" |";
+               }
+               elsif( $ls_lR_file =~ /($times_suffix|$patch_gzip_suffix)$/ ){
+                       return 0 if &patch_ls_lR_file()==0;    
+               }
+               if( ! open( DIRTMP, $dirtmp ) ){
+                       &msg( "Cannot open $dirtmp\n" );
+                       return 0;
+               }
+               $rls = "main'DIRTMP";
+               # Now we don't want to overwrite our input... better test?
+               if( $local_ls_lR_file eq $storename ){
+                       $storename = "/dev/null";
+               }
+       }
+       elsif( $ls_lR_file ){
+               local( $dirtmp );
+               $dirtmp = "$big_temp/.dir$$";
+               if( $ls_lR_file =~ 
/\.($sys_compress_suffix|$gzip_suffix|$old_gzip_suffix)$/ ){
+                       $dirtmp .= ".$1";
+               }
+
+               &msg( " Getting directory listing from remote file 
$ls_lR_file\n" ) if $debug;
+               if( ! &ftp'get( $ls_lR_file, $dirtmp, 0 ) ){
+                       &msg( "Cannot get dir listing file\n" );
+                       return 0;
+               }
+               local( $unsquish );
+               if( $dirtmp =~ /\.$sys_compress_suffix$/ ){
+                       $unsquish = $sys_compress_prog;
+               }
+               elsif( $dirtmp =~ /\.($gzip_suffix|$old_gzip_suffix)$/ ){
+                       $unsquish = $gzip_prog;
+               }
+               if( defined( $unsquish ) ){
+                       local( $f, $uf );
+                       $uf = $udirtmp = $dirtmp;
+                       $dirtmp =~ s/($shell_metachars)/\\$1/g;
+                       $f = $dirtmp;
+                       $dirtmp =~ 
s/\.($sys_compress_suffix|$gzip_suffix|$old_gzip_suffix)$//;
+                       $udirtmp =~ 
s/\.($sys_compress_suffix|$gzip_suffix|$ol_gzip_suffix)$//;
+                       if( &sys( "$unsquish -d < \"$f\" > \"$dirtmp\"" ) != 0 
){
+                               &msg( "Cannot uncompress directory listing\n" );
+                               return 0;
+                       }
+                       unlink( $uf );
+               }
+               else {
+                       $udirtmp = $dirtmp;
+               }
+
+               open( DIRTMP, $dirtmp ) || die "Cannot open $dirtmp";
+               $rls = "main'DIRTMP";
+       }
+       else {
+               $use_ls = 1;
+               if( ! &ftp'type( 'A' ) ){
+                       &msg( "Cannot set type to ascii for dir listing, 
ignored\n" );
+                       $type_changed = 0;
+               }
+               else {
+                       $type_changed = 1;
+               }
+       }
+       
+       $lsparse'fstype = $remote_fs;
+       $lsparse'name = "$site:$package";
+       
+       if( $use_ls ){
+               local( $flags ) = $flags_nonrecursive;
+               if( $recursive && ! $recurse_hard ){
+                       $flags = $flags_recursive;
+               }
+               $lsparse'report_subdirs = (! $recurse_hard && $algorithm == 0);
+               if( !&ftp'dir_open( $flags ) ){
+                       &msg( "Cannot get remote directory listing because: 
$ftp'response\n" );
+                       return 0;
+               }
+               
+               $rls = "ftp'NS";
+       }
+               
+       $rcwd = '';
+       if( $vms ){
+               # Strip this off all pathnames to make them
+               # relative to the remote_dir
+               $rcwd = $remote_dir;
+       }
+       $dateconv'use_timelocal = $use_timelocal;
+       if( !&lsparse'reset( $rcwd ) ){
+               &msg( "$remote_fs: unknown fstype\n" );
+               return 0;
+       }
+       if( $vms ){
+               # Need to get in terms of the full pathname
+               # so add it back in - see unix2vms at end of mirror
+               $vms_dir = $remote_dir;
+       }
+       
+       if( $storename ne "/dev/null" ){
+               open( STORE, ">$storename" ) || die( "Cannot write to 
$storename\n" );
+       }
+
+       local( $parse_state ) = &parse_remote_details();
+
+       close( STORE );
+
+       
+       if( $local_ls_lR_file ){
+               close( DIRTMP );
+       }
+       elsif( $ls_lR_file ){
+               close( DIRTMP );
+               unlink( $udirtmp );
+       }
+       else {
+               # Could optimise this out - but it makes sure that
+               # the other end gets a command straight after a possibly
+               # long dir listing.
+               if( ! &ftp'type( $text_mode ? 'A' : 'I' ) ){
+                       local( $msg ) = "Cannot reset type after dir listing, ";
+                       if( $type_changed ){
+                               # I changed it before - so I must be able to
+                               # change back unless something is wrong
+                               $msg .= "aborting\n";
+                               &msg( $msg );
+                               return 0;
+                       }
+                       else {
+                               $msg .= "ignoring\n";
+                               &msg( $msg );
+                       }
+               }
+       }
+
+       # If the other end dropped part way thru make sure the
+       # higher routines know!
+       return $parse_state;
+}
+
+# Get remote ls-lR times or mirror gzipped patch files.
+sub patch_ls_lR_file
+{
+       if( ! $patch_prog ){
+               &msg( "No patch program on PATH\n" );
+               return 0;
+       }
+       local( $f, $fr, $flb, $flt, $flp, $flz, $frb, $frt );
+       local( $to , $tn );
+       $frb = $frt = $ls_lR_file;
+       $flb = $dirtmp;
+       &msg( "Patching $flb using $frb\n" ) if $debug;
+       local( $tlb ) = -f $flb?(stat($flb))[9]:0;
+       $dateconv'use_timelocal = $use_timelocal;
+       $flp = "$flb$patch_suffix";
+       $flz = "$flb$patch_gzip_suffix";
+       # Get times and patch.
+       if( $frt =~ /$times_suffix$/ ){
+               # Use remote times file.
+               $frb =~ s/$times_suffix$//;
+               $flt = "$flb$times_suffix";
+               &ftp'get( $frt, $flt, 0 ) ?  
+                       &msg( "Got $frt\n" ):
+                       return 0;
+               open( FT, $flt );
+               for( $to, $tn ){
+                       $f = gmtime( <FT> );
+                       $_ = &lstime_to_time( $f );
+               }
+               close( FT );
+               $f = "$frb$patch_gzip_suffix";
+               if( $tlb == $to && &ftp'get( $f, $flz, 0 ) &&
+                       ! &sys("$gzip_prog -df <$flz >$flp") ){
+                       &msg( $log, "Got $f\n" );
+                       unlink $flz if ! $debug;
+               }
+       }
+       else {
+               # Get time of remote patch file.
+               $lsparse'fstype = $remote_fs;
+               $lsparse'name = "$site:$package";
+               &lsparse'reset( $remote_dir );
+               if( ! &ftp'dir_open( "$flags_nonrecursive $frb" ) ){
+                       &msg( "List remote ls-lR patch: $ftp'response\n" );
+                       &ftp'dir_close();
+                       return 0;
+               }
+               local( $p, $s, $trz, $t, $m ) = &lsparse'line( ftp'NS );
+               &msg( "Remote ls-lR patch:\n$p $s $trz $t $m\n" ) if $debug;
+               if( ! &ftp'dir_close() ){
+                       &msg( "List remote ls-lR patch: $ftp'response\n" );
+                       return 0;
+               }
+               # If remote time does not match local get remote patch file.
+               local( $tlz ) = -f $flz?(stat($flz))[9]:0;
+               if( $trz == $tlz ){
+                       &msg( "No new $frb\n" );
+                       &msg( "age $trz same as $flz\n" ) if $debug;
+               }
+               else {
+                       &ftp'get( $frb, $flz, 0 )?
+                       &msg( $log, "Got $frb $s\n" ):
+                       return 0;
+                       &utime( $trz, $trz, $flz );
+               }
+               # unzip patch and read times.
+               $frb =~ s/$patch_gzip_suffix$//;
+               &sys( "$gzip_prog -df <$flz >$flp" ) ?
+                       return 0:
+                       open( FT, $flp );
+               for( $to, $tn ){
+                       ( $fr, $f ) = split( /\t/, <FT> );
+                       $_ = &lstime_to_time( $f );
+               }
+               close( FT );
+       }
+       # Patch or leave or get new local ls-lR file?
+       $f = "$patch_prog ";
+       $f .= $use_timelocal?$patch_local:$patch_UTC;
+       if( $tlb == $to && ! &sys( "$f $flb $flp" ) ){
+               &msg( "$flb patched\n" );
+       }
+       elsif( $tlb == $tn ){
+               &msg( "$flb up to date\n" );
+       }
+       else {
+               $fr = "$frb.$gzip_suffix";
+               $f = "$flb.$gzip_suffix";
+               if( &ftp'get( $fr, $f, 0 ) &&
+                       ! &sys( "$gzip_prog -df $f" ) ){
+                       &utime( $tn, $tn, $flb );
+                       &msg( $log, "Got $fr for $flb\n" );
+               }
+               else {
+                       &msg( "Did not get $fr\nand $ftp'response\n" );
+                       return 0;
+               }
+       }
+       unlink $flp, $flt if ! $debug;
+       if( ! $do_deletes && $exclude_patt =~ /^\.($|\|)/ ){
+               &msg( "$flb check complete\n" );
+               next;
+       }
+       return 1;
+}
+
+sub parse_timeout
+{
+       $parse_timed_out = 1;
+       die "timeout: parse_remote_details";
+}
+
+sub parse_remote_details
+{
+       local( $ret );
+       local( $old_sig );
+
+       $parse_timed_out = 0;
+       
+       if( ! $use_ls ){
+               # No need to bother with the timers
+               return &parse_remote_details_real();
+       }
+       
+       # This may timeout
+       $old_sig = $SIG{ 'ALRM' };
+       $SIG{ 'ALRM' } = "main\'parse_timeout";
+       
+       $ret = eval '&parse_remote_details_real()';
+       
+       &alarm( 0 );
+
+       $SIG{ 'ALRM' } = $old_sig;
+
+       if( $@ =~ /^timeout/ ){
+               &msg( "timed out parsing directory details\n" );
+               return 0;
+       }
+       return $ret;
+}
+
+
+sub parse_remote_details_real
+{
+       local( $path, $size, $time, $type, $mode, $rdir, $rcwd );
+       local( @dir_list );
+       local( $i ) = 0;
+       local( $old_path );
+       
+       if( $use_ls ){
+               &alarm( $parse_time );
+       }
+       
+       # Need to loop in case $recurse_hard
+       while( 1 ){
+               while( !eof( $rls ) ){
+                       ( $path, $size, $time, $type, $mode ) =
+                               &lsparse'line( $rls );
+                       last if $path eq '';
+                       if( $ls_fix_mappings ){
+                               local( $old_path ) = $path;
+                               $_ = $path;
+                               eval $ls_fix_mappings;
+                               if( $_ ne $old_path ){
+                                       $path = $_;
+                               }
+                       }
+                       next if $name eq '.' || $name eq '..';
+                       if( $debug > 2 ){
+                               printf "remote: %s %s %s %s 0%o\n",
+                                       $path, $size, $time, $type, $mode;
+                       }
+                       if( $use_ls ){
+                               # I just got something so shouldn't timeout
+                               &alarm( $parse_time );
+                       }
+                       else {
+                               # Prod the remote system from time to time
+                               # To prevent time outs.  Only look once every
+                               # 50 files
+                               # to save on unnecessary systems calls.
+                               if( ($i % 50 == 0) &&
+                                   time > ($last_prodded + $prod_interval) ){
+                                       $last_prodded = time;
+                                       &prod();
+                               }
+                               $i ++;
+                       }
+                       
+                       if( $algorithm == 1 ){
+                               $path0 = substr( $remote_dir, $rem_start_len );
+                               if( $path0 ne '' ){
+                                       $path0 .= "/";
+                               }
+                               $path0 .= $path;
+                               $path0 =~ s,^/,,;
+                               # &msg( "debug: $path0, $remote_dir, 
$rem_start_len\n" );
+                       }
+                       else {
+                               $path0 = $path;
+                       }
+
+                       if( $exclude_patt && $path0 =~ /$exclude_patt/ ){
+                               &msg( "   exclude: $path0\n" ) if $debug > 1;
+                               next;
+                       }
+
+                       if( $type eq 'd' ){
+                               push( @dir_list, $path0 );
+                       }
+                       
+                       if( $max_age && $time != 0 && $time < $max_age ){
+                               &msg( "   too old: $path0\n" ) if $debug > 1;
+                               next;
+                       }
+                       
+                       # If vms and only keeping the latest version
+                       if( $vms && !$vms_keep_versions ){
+                               # If we already have a file, pick the newer
+                               # TODO: pick the greatest version number
+                               local( $ri ) = $remote_map{ $path };
+                               if( $ri &&
+                                   $time > $remote_time[ $ri ] ){
+                                       $remote_time[ $ri ] = $time;
+                                       $remote_size[ $ri ] = $size;
+                                       $remote_type[ $ri ] = $type;
+                                       $remote_mode[ $ri ] = $mode;
+                                       next;
+                               }
+                       }
+                       
+                       local( $mapi ) = $next_remote_mapi++;
+                       # push( @remote_sorted, $path );
+                       $remote_sorted[ $mapi - 1 ] = $path;
+                       $remote_map{ $path } = $mapi;
+                       $remote_time[ $mapi ] = $time;
+                       $remote_size[ $mapi ] = $size;
+                       $remote_type[ $mapi ] = $type;
+                       $remote_mode[ $mapi ] = $mode;
+                       if( $type eq 'd' ){
+                               $remote_totals[ 0 ]++;
+                       }
+                       else {
+                               $remote_totals[ 1 ]++;
+                       }
+               }
+
+               if( $use_ls ){
+                       if( ! &ftp'dir_close() ){
+                               &msg( "Failure at end of remote directory" .
+                                " ($rdir) because: $ftp'response\n" );
+                               return 0;
+                       }
+               }
+               
+               if( $recurse_hard ){
+                       local( $done ) = 0;
+                       while( 1 ){
+                               if( $#dir_list < 0 ){
+                                       # Make sure we end in the right 
directory.
+                                       if( ! &ftp'cwd( $remote_dir ) ){
+                                               &msg( "Cannot change to remote 
directory" .
+                                                " ($rdir) because: 
$ftp'response\n" );
+                                               return 0;
+                                       }
+                                       $done = 1;
+                                       last;
+                               }
+                               $rcwd = shift( @dir_list );
+                               $rdir = "$remote_dir/$rcwd";
+                               if( $debug > 2 ){
+                                       print "scanning: $remote_dir / $rcwd\n";
+                               }
+                               if( ! &ftp'cwd( $rdir ) ){
+                                       &msg( "Cannot change to remote 
directory" .
+                                        " ($rdir) because: $ftp'response\n" );
+                                       next;
+                               }
+                               last;
+                       }
+                       if( $done ){
+                               last;
+                       }
+                       if( !&ftp'dir_open( $flags_nonrecursive ) ){
+                               &msg( "Cannot get remote directory" .
+                                       " listing because: $ftp'response\n" );
+                               return 0;
+                       }
+                       &lsparse'reset( $rcwd );
+                       
+                       # round the loop again.
+                       next;
+               }
+               
+               # All done - snap the loop
+               last;
+       }
+       return 1;
+}
+
+sub compare_dirs
+{
+       # This declaration must be "local()" because it modifies global data.
+       local( *src_paths,
+               *src_map, *src_time,
+                *src_size, *src_type, 
+              *dest_paths,
+               *dest_map, *dest_time,
+                *dest_size, *dest_type,
+                 *dest_keep, *dest_keep_totals ) = @_;
+       local( $src_path, $dest_path, $i );
+       local( $last_prodded ) = time; # when I last prodded the remote ftpd
+
+       # Most of these variables should be locals in blocks below but
+       # that seems to tickle a perl bug and causes a lot of memory to
+       # be wasted.
+       local( $desti, $srci, $compress, $srciZ, $srcigz, $split, 
$dest_path_real );
+       local( $old_dest_path, $existing_path, $tmp, $restart );
+       local( $sp, $dp ) = ($#src_paths + 1, $#dest_paths + 1);
+       
+       &msg( "compare directories (src $sp, dest $dp)\n" ) if $debug;
+       $total_src_size = 0;
+
+       for( $i = 0; $i <= $#src_paths; $i++ ){
+               $dest_path = $src_path = $src_paths[ $i ];
+               
+               $desti = $dest_map{ $dest_path };
+               $srci = $i + 1;
+
+               # Prod the remote system from time to time
+               # To prevent time outs.  Only look once every 50 files
+               # to save on unnecessary systems calls.
+               if( ($i % 50 == 0) && time > ($last_prodded + $prod_interval) ){
+                       $last_prodded = time;
+                       &prod();
+               }
+
+               if( $debug > 2 ){
+                       &msg( "Compare src $src_path ($srci): " .
+                               &t2str( $src_time[ $srci ] ) );
+                       &msg( " $src_size[ $srci ] $src_type[ $srci ]\n" );
+               }
+
+               # I'm about to do a lot of matching on this
+               study( $src_path );
+
+               # Should I compress this file?
+               #  Don't compress this file if trying to do a compress->gzip
+               # conversion.
+               $compress = 0;
+               if( &will_compress( $src_path, $srci ) ){
+                       if( $dest_path !~ /$squished/o ){
+                               $srciZ = $src_map{ 
"$src_path.$sys_compress_suffix" };
+                               $srcigz = $src_map{ "$src_path.$gzip_suffix" };
+                               if( $srciZ || $srcigz ){
+                                       # There is a compressed version
+                                       # too!  Skip the uncompressed one
+                                       &msg( "   do not xfer, compressed 
version exists: $src_path\n" ) if $debug > 1;
+                                       next;
+                               }
+
+                               $compress = 1;
+                               $dest_path .= '.' . $compress_suffix;
+                               $desti = $dest_map{ $dest_path };
+                       }
+               }
+               # need to adjust the symlink pointer?
+               elsif( $src_type[ $srci ] =~ /^l (.*)/ ){
+                  # Am I going to squish the file this points to?
+                  local( $real, $reali, $reali1 );
+                  local( $count ) = 0;
+                  while( $count++ <= 10 ){
+                       $real = &expand_symlink( $src_path, $1 );
+                       $reali = $src_map{ $real };
+                       # Look out for when the symlink loops on itself
+                       if( defined( $reali1 ) && $reali == $reali1 ){
+                               last;
+                       }
+                       $reali1 = $reali;
+                       last if $src_type[ $reali ] !~ /^l (.*)$/;
+                  }
+                  if( &will_compress( $real, $reali ) ){
+                       # real is going to be (at least) squished so
+                       # suffix the dest
+                       $dest_path .= '.' . $compress_suffix;
+                       $desti = $dest_map{ $dest_path };
+                       $src_type[ $srci ] .= '.' . $compress_suffix;
+                       &msg( "  symlink pointer is now $dest_path\n" ) if 
$debug > 1;
+                       if( $src_map{ $dest_path } ){
+                               &msg( "do not xfer, $dest_path exists\n" ) if 
$debug > 1;
+                               next;
+                       }
+                  }
+                  if( &will_split( $real, $reali ) ){
+                       $src_type[ $srci ] .= '-split/README';
+                       &msg( "  symlink pointer now to $real-split/README'\n" 
) if $debug > 1;
+                  }
+               }
+               
+               # If this is a file that I decided not to compress but the
+               # remote file is compressed and I want a gziped local version
+               # then force compression.
+               # This ignores any compress_excl flags.
+               if( ! $compress &&
+                   $compress_suffix eq $gzip_suffix &&
+                   $compress_conv_patt && $src_path =~ /$compress_conv_patt/ ){
+                       $_ = $dest_path;
+                       eval $compress_conv_expr;
+                       $dest_path = $_;
+                       # check if dest_path exists in the sources.  If it
+                       # does, ignore this file.  This is to avoid the
+                       # double mirroring problem if you are using gzip and
+                       # the source site has both foo.Z and foo.gz.
+                       if( $src_map{ $dest_path } ){
+                               &msg( "Skipping $src_path because remote site 
also has $dest_path\n" ) if $debug > 2;
+                               next;
+                       }
+                       &msg( "   $src_path -> $dest_path\n" ) if $debug > 2;
+                       $desti = $dest_map{ $dest_path };
+                       $compress = 1;
+               }
+
+               # Am I converting the compression on the file this points to?
+               if( $src_type[ $srci ] =~ /^l (.*)/ &&
+                     $compress_suffix eq $gzip_suffix ){
+                       local( $value ) = $1;
+                       local( $real ) = &expand_symlink( $src_path, $value );
+                       local( $reali ) = $src_map{ $real };
+                       if( $src_type[ $reali ] ne 'd' &&
+                           $src_type[ $reali ] ne /^l .*/ &&
+                           $compress_conv_patt && $real =~ 
/$compress_conv_patt/ ){
+                           $dest_path =~ s/$sys_compress_suffix$/$gzip_suffix/;
+                           $desti = $dest_map{ $dest_path };
+                           $value =~ s/$sys_compress_suffix$/$gzip_suffix/;
+                           &msg( "  symlink pointer is now $dest_path 
(conv)\n")
+                                if $debug > 1;
+                       }
+                       if( $name_mappings || $external_mapping ){
+                               local( $old ) = $value;
+                               $value = &map_name( $value );
+                               if( $value ne $old ){
+                                   &msg( "   Mapped symlink value is $value\n" 
) if $debug > 2;
+                               }
+                                   
+                       }
+                       $src_type[ $srci ] = "l ".$value;
+               }
+
+               if( $name_mappings || $external_mapping ){
+                       local( $old_dest_path ) = $dest_path;
+                       $dest_path = &map_name( $dest_path );
+                       if( $dest_path ne $old_dest_path ){
+                               $desti = $dest_map{ $dest_path };
+                               &msg( "   Mapped name is $dest_path\n" ) if 
$debug > 2;
+                       }
+               }
+               
+               # Should this file be split?
+               $split = 0;
+               $dest_path_real = undef;
+               if( &will_split( $src_path, $srci ) ){
+                       $split = 1;
+                       $dest_path_real = $dest_path;
+                       $dest_path .= "-split/part01";
+                       $desti = $dest_map{ $dest_path };
+               }
+
+               if( $debug > 2 ){
+                       &msg( "       dest $dest_path ($desti): " .
+                               &t2str( $dest_time[ $desti ] ) );
+                       &msg( " $dest_size[ $desti ] $dest_type[ $desti ]" );
+                       &msg( " (->$compress_suffix)" ) if $compress;
+                       &msg( " (split)" ) if $split;
+                       &msg( "\n" );
+               }
+               
+               if( $algorithm == 1 ){
+                       $src_path0 = substr( $remote_dir, $rem_start_len );
+                       if( $src_path0 ne '' ){
+                               $src_path0 .= "/";
+                       }
+                       $src_path0 .= $src_path;
+                       $src_path0 =~ s,^/,,;
+                       #&msg( "debug: $src_path0, $remote_dir, 
$rem_start_len\n" );
+               }
+               else {
+                       $src_path0 = $src_path;
+               }
+                       
+               if( $get_patt && $src_path0 !~ /$get_patt/ ){
+                       &msg( "   do not xfer: $src_path0\n" ) if $debug > 1;
+                       next;
+               }
+
+               # Just create any needed directories (the timestamps
+               # should be ignored)
+               if( $src_type[ $srci ] eq 'd' ){
+                       if( $algorithm == 1 ){
+                               if( $exclude_patt && $src_path0 =~ 
/$exclude_patt/ ){
+                                       &msg( "   exclude: $src_path0\n" ) if 
$debug > 1;
+                               }
+                               else {
+                                       $rel_src_path = $src_path;
+                                       $rel_src_path =~ s,.*/,,;
+                                       push( @sub_dirs, $rel_src_path );
+                                       &msg( "   adding $rel_src_path\n" ) if 
$debug;
+                               }
+                       }
+                       if( $dest_type[ $desti ] ne 'd' ){
+                               push( @things_to_make, "d $dest_path" );
+                               &msg( "   need to mkdir $dest_path\n" ) if 
$debug > 1;
+                       }
+                       # keep the directory once made
+                       # (Also if local is really a symlink elsewhere
+                       #  it will be kept.)
+                       &keep( $desti, $dest_path, *dest_keep, 
*dest_keep_totals, *dest_map, 0 );
+                       next;
+               }
+
+               # Well that just leaves files and symlinks.
+               # Do various checks on them.
+
+               if( $desti && ! $dest_keep[ $desti ] ){
+                       &keep( $desti, $dest_path, *dest_keep, 
*dest_keep_totals, *dest_map, 1 );
+                       if( $split ){
+                               # Mark all the split parts as kept
+                               local( $dpp, $dps );
+                               ($dpp, $dps) = ($dest_path =~ 
m,^(.*/)(part[0-9]+)$,);
+                               while( 1 ){
+                                       $dps++;
+                                       if( !($di = $dest_map{ $dpp . $dps }) ){
+                                               last;
+                                       }
+                                       &keep( $di, $dpp . $dps, *dest_keep, 
*dest_keep_totals, *dest_map, 1 );
+                               }
+                               # And the README
+                               $dps = 'README';
+                               $di = $dest_map{ $dpp . $dps };
+                               if( $di ){
+                                       &keep( $di, $dpp . $dps, *dest_keep, 
*dest_keep_totals, *dest_map, 1 );
+                               }
+                               # And the directory
+                               chop( $dpp );
+                               $dps = '';
+                               $di = $dest_map{ $dpp . $dps };
+                               if( $di ){
+                                       &keep( $di, $dpp . $dps, *dest_keep, 
*dest_keep_totals, *dest_map, 0 );
+                               }
+                       }
+               }
+               
+               local( $update ) = 0;
+
+               if( ! $get_missing ){
+                       next;
+               }
+
+               if( ($max_size > 0) && ($src_size[ $srci ] > $max_size) ){
+                       &msg( "   src is too big, no need to xfer it\n" ) if 
$debug > 2;
+                       next;
+               }
+
+               if( $force || ! $dest_type[ $desti ] || $timestamp ){
+                       # Either I'm forcing xfers or the file doesn't exist
+                       # either way I should update
+                       $update = 1;
+               }
+               else {
+                       # Maybe the src is newer?
+                       if( $get_newer &&
+                          &compare_times( $src_time[ $srci ], $dest_time[ 
$desti ] ) ){
+                               &msg( "   src is newer, xfer it\n" ) if $debug 
> 2;
+                               $update = 1;
+                       }
+                       # or maybe its size has changed?
+                       # don't bother if file was compressed or split as the
+                       # size will have changed anyway
+                       if( !$update &&
+                          !$compress && !$split &&
+                          $get_size_change &&
+                          ($src_type[ $srci ] eq 'f') &&
+                          ($src_size[ $srci ] != $dest_size[ $desti ]) ){
+                               $update = 1;
+                               if( $debug > 2 ){
+                                   &msg( "   src is different size, xfer it\n" 
);
+                               }
+                       }
+                       # Maybe it has changed type!
+                       if( !$update &&
+                          $src_type[ $srci ] ne $dest_type[ $desti ] ){
+                               $update = 1;
+                               if( $debug > 2 ){
+                                   &msg( "   src has different type, xfer 
it\n" );
+                               }
+                       }
+               }
+
+               if( ! $update ){
+                       next;
+               }
+
+               if( $src_type[ $srci ] =~ /^l (.*)/ ){
+                       # If the symlink hasn't changed then may as well 
+                       # leave it alone
+                       if( $src_type[ $srci ] eq $dest_type[ $desti ] ){
+                               next;
+                       }
+                       # DONT FORGET TO NAME MAP!!!!
+                       $existing_path = $1;
+
+                       if( $compress_suffix eq $gzip_suffix &&
+                           $compress_conv_patt && $existing_path =~ 
/$compress_conv_patt/ ){
+                               $_ = $existing_path;
+                               eval $compress_conv_expr;
+                               $existing_path = $_;
+                       }
+
+                       push( @things_to_make, "l $dest_path -> $existing_path" 
);
+                       &msg( "   need to symlink $dest_path -> 
$existing_path\n" ) if $debug > 2;
+                       next;
+               }
+
+               # Now that the tests are complete use the real dest.
+               if( defined( $dest_path_real ) ){
+                       $dest_path = $dest_path_real;
+                       $desti = $dest_map{ $dest_path };
+               }
+
+               $total_src_size += $src_size[ $srci ];
+               if( $dont_do ){
+                       &msg("Should ");
+               }
+               &msg( "$XFER file $src_path as $dest_path ($src_size[ $srci ])".
+                       ($compress ? " (->$compress_suffix)" : "") .
+                       ($split ? " (split)" : "") . "\n" ) if $debug > 1;
+               push( @xfer_dest, $dest_path );
+               push( @xfer_src, $src_path );
+
+               # If xfers can be restarted AND
+               # a temporary file exists from a previous attempt at a
+               # transfer  AND
+               # the timestamps of the exising temp file and the original
+               # src file match then flag a restart.
+               $tmp = &filename_to_tempname( '', $dest_path );
+               $tmpi = $dest_map{ $tmp };
+               $restart = '';
+#warn "get_file = $get_file, can_restart = $can_restart, dest_size = 
$dest_size[ $tmpi ], dest_time = $dest_time[ $tmpi ], src_time = $src_time[ 
$srci ]\n";
+               if( $get_file &&
+                  $can_restart &&
+# Debian bug #24243, mirror-2.9 does not restart, address@hidden
+                  $dest_size[ $tmpi ] != 0 ){
+                   if ($dest_time[ $tmpi ] eq $src_time[ $srci ]) {
+                       # Then this is an xfer of the same file
+                       # so just restart where I left off
+                       $restart = 'r';
+                   } elsif ( $debug > 1 ){
+                       &msg ( "Timestamp useless on $tmp\n" );
+                   }
+               }
+               # x for xfer, c for compress, s for split
+               push( @xfer_attribs,
+                    "x$restart" .
+                    ($compress ? "c" : "") .
+                    ($split ? "s" : "") );
+       }
+       &msg( "to $XFER $total_src_size bytes\n" ) if $debug > 2;
+}
+
+sub map_name
+{
+       local( $name ) = @_;
+
+       if( $name_mappings ){
+               local( $old_name ) = $name;
+               $_ = $name;
+               eval $name_mappings;
+               if( $_ ne $old_name ){
+                       $name = $_;
+               }
+       }
+       
+       if( $external_mapping ){
+               $old_name = $name;
+               local( $tmp ) = &extmap'map( $name );
+               if( $tmp ne $old_name ){
+                       $name = $tmp;
+               }
+       }
+       return $name;
+}
+
+
+sub set_timestamps
+{
+       local( $src_path );
+       
+       &msg( "setting timestamps\n" );
+       if( ! $get_file ){
+               &msg( "Cannot set remote timestamps\n" );
+               return;
+       }
+
+       local( $dest_path, $dest_loc_mapi, $src_rem_mapi,  $rtime );
+       
+       foreach $src_path ( @xfer_src ){
+               $dest_path = shift( @xfer_dest );
+               $dest_loc_mapi = $local_map{ $dest_path };
+               $src_rem_mapi = $remote_map{ $src_path };
+
+               $rtime = $remote_time[ $src_rem_mapi ];
+               if( $dest_loc_mapi && $local_time[ $dest_loc_mapi ] ne $rtime ){
+                       &set_timestamp( $dest_path, $rtime );
+               }
+       }
+}
+
+sub set_timestamp
+{
+       local( $path, $time ) =  @_;
+       
+       local( $pr_time ) = &t2str( $time );
+
+       if( $dont_do ){
+               &msg( "Should set time of $path to $pr_time\n" );
+               return;
+       }
+
+       if( $timestamp || $debug > 2 ){
+               &msg( "Setting time of $path to $pr_time\n" );
+       }
+
+       if( ! &utime( $time, $time, $path ) ){
+               &msg( $log, "Cannot set file times for $path to $pr_time 
because: $!\n" );
+       }
+}
+
+sub make_dirs
+{
+       local( $thing );
+
+       foreach $thing ( @things_to_make ){
+               if( $thing !~ /^d (.*)/ ){
+                       next;
+               }
+               if( $dont_do ){
+                       &msg( "Should mkdir $1\n" );
+               }
+               else {
+                       &mkdirs( $1 );
+               }
+       }
+}
+
+sub make_symlinks
+{
+       local( $thing );
+
+       thing:
+       foreach $thing ( @things_to_make ){
+               if( $thing !~ /^l (.*) -> (.*)/ ){
+                       next;
+               }
+               local( $dest, $existing ) = ($1, $2);
+               local( $dirpart ) = &dirpart( $dest );
+               local( $ft ) = &expand_symlink( $dest, $existing ); 
+               if( -e $ft ){
+                       &mkdirs( $dirpart ) if ! -d $dirpart;
+                       # symlink to existing file.
+# Debian bug #85353 "bad symlink stops listing with -n" <address@hidden> 
+                       &mksymlink( $dest, $existing );
+                       next;
+               }
+
+               # The existing file doesn't actually exist!
+               # Has it been compressed, gzipped, split? or worse
+               # compressed/gzipped AND split.  (OK so it could
+               # be another problem, bad symlink on remote host, file
+               # that hasn't been xfer'd yet... but this is as good as
+               # it gets.)
+               local( $p );
+               foreach $p (
+                       "\%s.$sys_compress_suffix",
+                       "\%s.$gzip_suffix",
+                       "\%s/README",
+                       "\%s-split/README",
+                       "\%s-split.$sys_compress_suffix/README",
+                       "\%s-split.$gzip_suffix/README" ){
+                       local( $f ) = sprintf( $p, $existing );
+                       if( -e $f ){
+                               &msg( "using $p\n" ) if $debug > 2;
+                               &mksymlink( $dest, $f );
+                               next thing;
+                       }
+               }
+               if( $make_bad_symlinks ){
+                       &msg( "symlink to non-existant file: $dest -> 
$existing\n" );
+                       &mksymlink( $dest, $existing );
+               }
+               elsif ( $get_symlink_files ){
+# Get file within $local_dir tree and make symlink, address@hidden, 2001/09/22.
+                       if( $ft =~ m|\.\./| ){
+                               &msg( "Not getting path $ft\nas not in 
remote_dir $remote_dir\n" );
+                               &msg( "and not symlinking $dest -> $existing\n" 
);
+                               next thing;
+                       }
+                       local( $dl ) = &dirpart( $ft );
+                       &mkdirs( $dl ) if ! -d $dl;
+                       if( &ftp'get( $ft, $ft, 0 ) ){
+                               &msg( $log, "Got $ft\n" );
+                               &mksymlink( $dest, $existing );
+                       }
+                       else {
+                               &msg( "Did not get $ft\nbecause 
$ftp'response\n" );
+                               &msg( "so not symlinking $dest -> $existing\n" 
);
+                       }
+               }
+               else {
+                       &msg( "Not symlinking $dest -> $existing\n" );
+                       &msg( "as no path $ft\n" );
+               }
+       }
+}
+
+sub do_all_transfers
+{
+       local( $src_path );
+       local( $dest_path, $attribs );
+       local( $srci );
+       
+       if( $#xfer_src < 0 ){
+               &msg( "No files to transfer\n" ) if $algorithm == 0;
+               return;
+       }
+
+       # The Macos ftpd cannot reliably rename files
+       $no_rename = (! $remote_has_rename) || ($remote_fs eq 'macos' && ! 
$get_file);
+
+       foreach $src_path ( @xfer_src ){
+               if( $get_file ){
+                       $srci = $remote_map{ $src_path };
+               }
+               else {
+                       $srci = $local_map{ $src_path };
+               }
+
+               $dest_path = shift( @xfer_dest );
+               $attribs = shift( @xfer_attribs );
+               
+               if( $dont_do ){
+                       # Skip trying to get the file.
+                       next;
+               }
+
+               &msg( "Need to $XFER file $src_path as $dest_path ($attribs)\n" 
) if $debug > 1;
+
+               local( $newpath ) =
+                       &transfer_file( $src_path, $dest_path,
+                                      $attribs, $remote_time[ $srci ] );
+               if( $get_file && $newpath eq '' ){
+                       &msg( $log, "Failed to $XFER file $ftp'response\n" );
+                       if( $ftp'response =~ /timeout|timed out/i ){
+                               $timeouts++;
+                       }
+                       if( $ftp'fatalerror || $timeouts > $max_timeouts ){
+                               &msg( $log, "Fatal error talking to site, 
skipping rest of transfers\n" );
+                               &disconnect();
+                               return;
+                       }
+                       next;
+               }
+
+               # File will now have been split up.
+               if( $attribs =~ /s/ ){
+                       next;
+               }
+
+               &set_attribs( $newpath, $src_path, 'f' );
+
+               # we can only force time for local files
+               if( $force_times && $get_file ){
+                       &set_timestamp( $newpath, $remote_time[ $srci ] );
+               }
+       }
+}
+
+
+sub transfer_file
+{
+       local( $src_path, $dest_path, $attribs, $timestamp ) = @_;
+       local( $dir, $file, $temp, $compress, $split, $restart, $mesg, 
$got_mesg );
+       
+       # Make sure the required directory exists
+       $dir = "";
+       if( $dest_path =~ /^(.+\/)([^\/]+)$/ ){
+               ($dir, $file) = ($1, $2);
+               if( $dest_type[ $dir ] ne 'd' && &mkdirs( $dir ) ){
+                       &msg( $log, "Created dir $dir\n" );
+               }
+       }
+       else {
+               $file = $dest_path;
+       }
+       
+       $temp = &filename_to_tempname( $dir, $file );
+       
+       # Interpret the attrib characters
+       if( $attribs !~ /x/ ){
+               # Not an xfer!
+               return '';
+       }
+       if( $attribs =~ /c/ ){
+               $compress = 1;
+               $mesg = " and compress";
+       }
+       if( $attribs =~ /s/ ){
+               $split = 1;
+               $mesg = " and split";
+       }
+       if( $attribs =~ /r/ ){
+               $restart = 1;
+       }
+       
+       if( $vms ){
+               &ftp'type( ($src_path =~ /$vms_xfer_text/i) ? 'A' : 'I' );
+       }
+       
+       if( $remote_fs eq 'macos' && ! $get_file ){
+               &ftp'type( 'A' );
+       }
+       
+       if( ! $get_file ){
+               # put the file remotely
+               local( $src_file ) = $src_path;
+               local( $comptemp ) = '';
+
+               if( $compress ){
+                       # No easy way to tell wether this was compressed or not
+                       # for now just presume that it is.
+                       local( $f ) = $src_file;
+                       $f =~ s/($shell_metachars)/\\$1/g;
+                       $comptemp = "$big_temp/.out$$";
+                       &sys( "$compress_prog < \"$f\" > \"$comptemp\"" );
+                       $src_file = $comptemp;
+               }
+               
+               if( $no_rename ){
+                       $temp = $dest_path;
+               }
+
+               if( ! &ftp'put( $src_file, $temp, $restart ) ){
+                       &msg( $log, "Failed to put $src_file: $ftp'response\n" 
);
+                       unlink( $comptemp ) if $comptemp;
+                       return '';
+               }
+       
+               unlink( $comptemp ) if $comptemp;
+               if( !$no_rename && ! &ftp'rename( $temp, $dest_path ) ){
+                       &msg( $log, "Failed to remote rename $temp to 
$dest_path: $ftp'response\n" );
+                       return '';
+               }
+
+               local($filesize) = &filesize( $src_file );
+               &msg( $log, "Put $src_file $filesize bytes\n" );
+
+               &log_upload( $src_file, $dest_path, "", $filesize );
+
+               # Some transfers done
+               $exit_xfer_status |= $exit_xfers;
+
+               if( $delete_source ){
+                       unlink( $src_file );
+               }
+               
+               return $dest_path;
+       }
+
+       # Maybe TODO: Paul Szabo suggest that if recurse_hard is set then
+       # mirror should chdir to the directory the file is in before getting
+       # it.
+
+       # Get a file
+       &ftp'dostrip( $strip_cr );
+       $start_time = time;
+       if( ! &ftp'get( $src_path, $temp, $restart ) ){
+               if( !$failed_gets_excl || $ftp'response !~ /$failed_gets_excl/ 
){
+                       &msg( $log, "Failed to get $src_path: $ftp'response\n" 
);
+               }
+
+               # Time stamp the temp file to allow for a restart
+               if( -f $temp ){
+                       &utime( $timestamp, $timestamp, $temp );
+                       # Make sure this file is kept
+                       local( $ti ) = $local_map{ $temp };
+                       &keep( $ti, $temp, *local_keep, *local_keep_totals, 
*local_map, 0 );
+               }
+
+               return '';
+       }
+       
+       # Some transfers done
+       $exit_xfer_status |= $exit_xfers;
+
+       # delete source file after successful transfer
+       if( $delete_source ){
+               if( &ftp'delete( $src_path ) ){
+                       &msg( $log, "Deleted remote $src_path\n");
+               }
+               else {
+                       &msg( $log, "Failed to delete remote $src_path\n");
+               }
+       }
+
+       if( $compress ){
+               # Prevent the shell from expanding characters
+               local( $f ) = $temp;
+               local( $comp );
+               $f =~ s/($shell_metachars)/\\$1/g;
+               $temp = "$f.$compress_suffix";
+               # Am I doing compress to gzip conversion?
+               if( $compress_conv_patt && $src_path =~ /$compress_conv_patt/ &&
+                   $compress_suffix eq $gzip_suffix ){
+                       $comp = "$sys_compress_prog -d < \"$f\" | $gzip_prog > 
\"$temp\"";
+               }
+               else {
+                       $comp = "$compress_prog < \"$f\" > \"$temp\"";
+               }
+               &sys( $comp );
+               $temp =~ s/\\($shell_metachars)/$1/g;
+               $f =~ s/\\($shell_metachars)/$1/g;
+               unlink( $f );
+       }
+
+       local( $filesize ) = &filesize( $temp );
+       local( $sizemsg ) = $filesize;
+       local( $srcsize ) = $remote_size[ $remote_map{ $src_path } ];
+       if( $srcsize > $sizemsg && !$compress ){
+               # should never happen, right?  right ...
+               $sizemsg .= " (file shrunk from $srcsize!)";
+       }
+       elsif( $srcsize < $sizemsg ){
+               # compression wasn't such a great idea
+               $sizemsg .= " (file grew from $srcsize!)";
+       }
+
+       # Ok - chop it up into bits!
+       if( $split ){
+               local( $time ) = 0;
+               if( $force_times ){
+                       $time = $remote_time[ $remote_map{ $src_path } ];
+               }
+               &bsplit( $temp, $dest_path, $time );
+               unlink( $temp );
+               $got_mesg .= " and split";
+       }
+       else {
+               if( -f $dest_path ){
+                       unlink( $dest_path );
+               }
+               if( ! rename( $temp, $dest_path ) ){
+                       &msg( $log, "Cannot rename $temp to $dest_path: $!\n" );
+               }
+       }
+
+       local( $as ) = '';
+       if( $src_path ne $dest_path ){
+               $as = " as $dest_path";
+       }
+       $time_taken = time - $start_time;
+       &msg( $log, "Got $src_path$as$got_mesg $sizemsg $time_taken\n" );
+       # Make sure to keep what you just got!  It may/may not have
+       # been compressed or gzipped..
+       local( $locali ) = $local_map{ $dest_path };
+       &keep( $locali, $dest_path, *local_keep, *local_keep_totals, 
*local_map, 1 );
+
+       &log_upload( $src_path, $dest_path, $got_mesg, $filesize );
+
+       return( $dest_path );
+}
+
+sub filename_to_tempname
+{
+       local( $dir, $file ) = @_;
+
+       local ( $dest_path ) = $file;
+
+       if( $dir eq '' ){
+               if( $dest_path =~ /^(.+\/)([^\/]+)$/ ){
+                       ($dir, $file) = ($1, $2);
+               }
+       }
+       else {
+               $file = $dest_path;
+       }
+
+       # dir 
+# LIMITED NAMELEN
+# if you are really limited in pathname length then
+# change the .in. to just .
+       if( $remote_fs eq 'macos' && ! $get_file ){
+               return $dir . "tmp.$file";
+       }
+       return "$dir.in.$file.";
+}
+
+
+# Open, write, close - to try and ensure that the log will allways be filled
+# in.
+sub log_upload
+{
+       local( $src_path, $dest_path, $got_mesg, $size ) = @_;
+
+       if( ! $upload_log ){
+               return;
+       }
+
+       if( ! open( ULOG, ">>$upload_log" ) ){
+               print STDERR "Cannot write to $upload_log\n";
+               return;
+       }
+
+       &myflock( 'ULOG', $LOCK_EX );
+       if( $get_files ){
+               print ULOG "$site:$remote_dir/$src_path -> 
$local_dir/$dest_path $size ";
+       }
+       else {
+               print ULOG "$local_dir/$dest_path -> 
$site:$remote_dir/$src_path $size ";
+       }
+       if( $got_mesg ){
+               print ULOG "($got_mesg)";
+       }
+       print ULOG "\n";
+       &myflock( 'ULOG', $LOCK_UN );
+       close( ULOG );
+}
+
+sub do_deletes
+{
+       # This declaration must be "local()" because it modifies global data.
+       local( *src_paths,
+               *src_map,
+                *src_type, *src_keep,
+                 *src_totals, *src_keep_totals ) = @_;
+       local( $files_to_go, $dirs_to_go );
+       
+       if( ! ($do_deletes || $save_deletes) ){
+               return;
+       }
+       
+       local( $src_path, $i );
+       local( $orig_do_deletes ) = $do_deletes;
+       local( $orig_save_deletes ) = $save_deletes;
+
+       local( $del_patt ) = $delete_patt;
+       if( $delete_get_patt ){
+               $del_patt = $get_patt;
+       }
+       
+       $files_to_go = $src_totals[ 1 ] - $src_keep_totals[ 1 ];
+       $dirs_to_go = $src_totals[ 0 ] - $src_keep_totals[ 0 ];
+
+       # Adjust totals by considering del_patt
+       for( $i = $#src_paths; $i >= 0; $i-- ){
+               $src_path = $src_paths[ $i ];
+               $srci = $i + 1;
+
+               if( !$src_keep[ $srci ] && $src_path !~ /$del_patt/
+                   || $delete_excl && $src_path =~ /$delete_excl/ ){
+                       if( $src_type[ $srci ] =~ "d" ){
+                               $dirs_to_go--;
+                       }
+                       else {
+                               $files_to_go--;
+                       }
+               }
+       }
+
+       # Check out file deletions
+       if( $max_delete_files =~ /^(\d+)\%$/ ){
+               # There is a % in the value - so its a percentage
+               local( $per ) = $1;
+               if( $per <= 0 || 100 < $per ){
+                       &msg( "silly percentage $max_delete_files, not 
deleting\n" );
+                       $do_deletes = 0;
+                       $save_deletes = 0;
+               }
+               else {
+                       # Don't do more than this percentage of files
+                       # Convert max_delete_files into the number of files
+                       $max_delete_files =
+                               int( $src_totals[ 1 ] * $max_delete_files /100 
);
+               }
+       }
+       if( $files_to_go > $max_delete_files ){
+               &msg( "Too many files to delete, not actually deleting 
($files_to_go > $max_delete_files)\n" );
+               $do_deletes = 0;
+               $save_deletes = 0;
+       }
+
+       # Check out directory deletions
+       if( $max_delete_dirs =~ /^(\d+)%$/ ){
+               # There is a % in the value - so its a percentage
+               local( $per ) = $1;
+               if( $per <= 0 || 100 < $per ){
+                       &msg( "silly percentage $max_delete_dirs, not 
deleting\n" );
+                       $do_deletes = 0;
+                       $save_deletes = 0;
+               }
+               else {
+                       # Don't do more than this percentage of dirs
+                       # Convert max_delete_dirs into the number of dirs
+                       $max_delete_dirs =
+                               int( $src_totals[ 0 ] * $max_delete_dirs / 100 
);
+               }
+       }
+
+       if( $dirs_to_go > $max_delete_dirs ){
+               &msg( "Too many directories to delete, not actually deleting 
($dirs_to_go > $max_delete_dirs)\n" );
+               $do_deletes = 0;
+               $save_deletes = 0;
+       }
+
+       # Scan the list backwards so subdirectories are dealt with first
+       for( $i = $#src_paths; $i >= 0; $i-- ){
+               $src_path = $src_paths[ $i ];
+               $srci = $i + 1;
+       
+               if( $src_keep[ $srci ] ){
+                       # Keep this for sure;
+                       &msg( "Keeping: $src_path\n" ) if $debug > 3;
+                       next;
+               }
+
+               if( $src_path !~ /$del_patt/ ){
+                       &msg( "   not in del_patt: $src_path\n" ) if $debug > 1;
+                       next;
+               }
+
+               if( $delete_excl && $src_path =~ /$delete_excl/ ){
+                       &msg( "   do not delete: $src_path\n" ) if $debug > 1;
+                       next;
+               }
+
+               if( $save_deletes && $save_dir =~ m,$cwd/(.*), ){
+                       local( $save_dir_tail ) = $1;
+                       if( $save_dir_tail && $src_path =~ m,$save_dir_tail/*, 
){
+                               next;
+                       }
+               }
+
+               if( $save_deletes ){
+                       &save_delete( $src_path, $src_type[ $srci ] );
+               }
+               else {
+                       &do_delete( $src_path, $src_type[ $srci ] );
+               }
+       }
+       
+       $do_deletes = $orig_do_deletes;
+       $save_deletes = $orig_save_deletes;
+}
+               
+# Move aside the given file.  Kind is 'd' for dirs and 'f' for files.
+sub save_delete
+{
+       local( $save, $kind ) = @_;
+
+       local( $real_save_dir, $save_dest );
+       eval "\$real_save_dir = \"$save_dir\"";
+
+
+       if( ! $get_file ){
+               &msg( "NEED TO implement remote save_deletes\n" );
+               return;
+       }
+       
+       $save_dest = "$real_save_dir/$save";
+
+       if( $dont_do ){
+               &msg( "Should save_delete $save to $save_dest\n" );
+               return;
+       }
+
+       if( $kind eq 'd' ){
+               $save_dest =~ s,/+$,,;
+               
+               # Make sure it exists
+               &save_mkdir( $save_dest );
+                       
+               # Zap the original
+               if( rmdir( $save ) == 1 ){
+                       &msg( $log, "Removed directory $save\n" );
+               }
+               else {
+                       &msg( $log, "UNABLE TO REMOVE DIRECTORY $save\n" );
+               }
+               return;
+       }
+
+       # Save a file
+
+       # Make the directories under $save_dir
+       local( $dirname );
+       $dirname = $save_dest;
+       $dirname =~ s/\/[^\/]+$//;
+       # Make sure the directory exists to mv the file into.
+       &save_mkdir( $dirname );
+               
+       if( rename( $save, $save_dest ) == 1 ){
+               &msg( $log, "Moved $save to $save_dest\n" );
+       }
+       else {
+               system "$mv_prog '$save' '$save_dest'";
+               if( ( $? >> 8 ) == 0 ){
+                       &msg( $log, "Moved $save to $save_dest\n" );
+               }
+               else {
+                       &msg( $log, "UNABLE TO MOVE $save TO $save_dest\n" );
+               }
+       }
+}
+
+sub save_mkdir
+{
+       local( $dir ) = @_;
+       
+       if( ! -d $dir ){
+               if( &mkdirs( $dir ) ){
+                       &msg( $log, "Created save directory $dir\n" );
+               }
+               else {
+                       &msg( $log, "UNABLE TO CREATE $dir, aborting saves\n" );
+                       $save_deletes = 0;
+               }
+       }
+}
+
+# Delete the given file.  Kind is 'd' for dirs and 'f' for files.
+sub do_delete
+{
+       local( $del, $kind ) = @_;
+       
+       if( $dont_do ){
+               &msg( "Should delete $del\n" );
+               return;
+       }
+
+       if( $kind eq 'd' ){
+               $del =~ s,/+$,,;
+               if( $do_deletes ){
+                       if( $get_file ){
+                               &msg( $log, "rmdir $cwd/$del\n" );
+                               rmdir( "$cwd/$del" ) ||
+                                       &msg( $log, "rmdir $cwd/$del failed: 
$!\n" );
+                       }
+                       else {
+                               &msg( $log, "delete DIR $del\n" );
+                               &ftp'deldir( "$del" ) ||
+                                       &msg( $log, "ftp delete DIR $del 
failed\n" );
+                       }
+               }
+               else {
+                       if( $get_file ){
+                               &msg( $log, "NEED TO rmdir $cwd/$del\n" );
+                       }
+                       else {
+                               &msg( $log, "NEED TO ftp'deldir $del\n" );
+                       }
+               }
+               return;
+       }       
+
+       # Deleting a file.
+       if( $do_deletes ){
+               if( $get_file ){
+                       &msg( $log, "unlink $cwd/$del\n" );
+                       unlink( "$cwd/$del" ) ||
+                               &msg( $log, "unlink $cwd/$del failed: $!\n" );
+               }
+               else {
+                       &msg( $log, "delete FILE $del\n" );
+                       &ftp'delete( "$del" ) ||
+                               &msg( $log, "ftp delete FILE $del failed\n" );
+               }
+       }
+       else {
+               if( $get_file ){
+                       &msg( $log, "NEED TO unlink $cwd/$del\n" );
+               }
+               else {
+                       &msg( $log, "NEED TO ftp'delete $del\n" );
+               }
+       }
+}
+
+sub filesize
+{
+       local( $fname ) = @_;
+
+       if( ! -f $fname ){
+               return -1;
+       }
+
+       return (stat( _ ))[ 7 ];
+       
+}
+
+# Is the value
+sub istrue
+{
+       local( $val ) = @_;
+       
+       return $val eq '1' || $val eq 'yes' || $val eq 'ok' ||
+              $val eq 'true';
+}
+
+sub mksymlink
+{
+       local( $dest_path, $existing_path ) = @_;
+
+       if( ! $get_file ){
+               &msg( "Cannot create symlinks on remote systems ($dest_path -> 
$existing_path)\n" );
+               return;
+       }
+       
+# Debian bug #85353 "bad symlink stops listing with -n" <address@hidden> 
+       if( $dont_do ){
+               &msg( "Should symlink $dest_path to $existing_path\n" );
+               return;
+       }
+
+       # make the symlink locally
+
+       # Zap any exiting file/symlink of that name
+       if( -d $dest_path && ! -l $dest_path ){
+               local( $msg ) = "rmdir( $dest_path ) before symlink";
+               if( ! rmdir( $dest_path ) ){
+                       if( $algorithm == 1 ){
+                               $msg = "rmdir( $local_dir/$dest_path ) before 
symlink";
+                               &msg( "$msg failed: $!\n" );
+                       }
+                       &msg( "$msg failed: $!\n" );
+                       return;
+               }
+               elsif( $debug ){
+                       &msg( "$msg\n" );
+               }
+       }
+       if( -e $dest_path || -l $dest_path ){
+               local( $msg ) = "unlink( $dest_path ) before symlink";
+               if( ! unlink( $dest_path ) ){
+                       &msg( "$msg failed: $!\n" );
+                       return;
+               }
+               elsif( $debug ){
+                       &msg( "$msg\n" );
+               }
+       }
+
+       if( (eval 'symlink("","")', $@ eq '') ){
+               local( $status ) = '';
+               if( ! symlink( $existing_path, $dest_path ) ){
+                       $status = "Failed to ";
+               }
+               &msg( $log, $status . "symlink $existing_path to $dest_path\n" 
);
+               &chown( $uid, $gid, $dest_path );
+       }
+       else {
+               &msg( $log, "Tried to create symlink - but not supported 
locally\n" );
+       }
+}
+
+
+# Make a full directory heirarchy
+# returns true if the directory doesn't exist
+sub mkdirs
+{
+       local( $dir ) = @_;
+       local( @dir, $d, $path );
+
+       # If the target directory already exists but is a symlink then
+       # zap the symlink to recreate it as a directory
+       if( $get_file && -l $dir ){
+               unlink( $dir );
+       }
+
+       # Very often the directory does exist - so return now
+       return 0 if &dir_exists( $dir );
+       
+       # Make sure that the target directory exists
+       @dirs = split( '/', $dir );
+       
+       # the root directory always exists
+       $path = '';
+       if( $dirs[ 0 ] eq '' ){ 
+               shift( @dirs ); 
+               $path = '/';
+       }
+
+       foreach $d ( @dirs ){
+               $path = $path . $d;
+               if( ! &dir_exists( $path ) ){
+                       &msg( "mkdir $path\n" ) if $debug > 2;
+                       if( ! &make_dir( $path, 0755 ) ){
+                               &msg( "make_dir($path,0755) failed with $err\n" 
);
+                               return 0;
+                       }
+                       &set_attribs( $path, $path, 'd' );
+               }
+               $path .= "/";
+       }
+       return 1;
+}
+
+# return 0 on error, 1 on success
+sub make_dir
+{
+       local( $dir, $mode ) = @_;
+       local( $val );
+
+       if( $get_file ){
+               if( $on_win && $dir =~ /^[a-z]:$/i ){
+                       return 1;
+               }
+               # make a local directory
+               if( -e $dir || -l $dir ){
+                       unlink( $dir );
+               }
+               $val = mkdir( $dir, $mode );
+               $err = "$!";
+       }
+       else {
+               # make a remote directory
+               $val = &ftp'mkdir( $dir );
+
+               # The mkdir might have failed due to bad mode
+               # So try to chmod it anyway
+               if( $remote_has_chmod ){
+                       $val = &ftp'chmod( $dir, $mode );
+               }
+       }
+
+       return $val;
+}
+
+# return 1 if $dir exists, 0 if not
+sub dir_exists
+{
+       local( $dir ) = @_;
+       local( $val );
+
+       if( $get_file ){
+               # check if local directory exists
+               $val = (-d $dir);
+       }
+       else {
+               # check if remote directory exists
+               local($old_dir) = &ftp'pwd();           
+               
+               $val = &ftp'cwd($dir);
+
+               # If I didn't manage to change dir should be where I was!
+               if( $val ){
+                       # go back to the original directory
+                       &ftp'cwd($old_dir) || die "Cannot cd to original remote 
directory";
+               }
+       }
+       return $val;
+}
+
+# Set file/directory attributes
+sub set_attribs
+{
+       local( $path, $src_path, $type ) = @_;
+       local( $mode );
+       
+       if( ! $chmod ){
+               &msg( "dont chmod \"$path\"\n" ) if $debug > 2;
+               return;
+       }
+
+       if( $get_file ){
+               local( $pathi ) = $remote_map{ $src_path };
+               $mode = $remote_mode[ $pathi ];
+       }
+       else {
+               local( $pathi ) = $local_map{ $path };
+               $mode = $local_mode[ $pathi ];
+       }
+
+       # If I can't figure out the mode or I'm not copying it
+       # use the default
+       if( !$mode_copy || !$mode ){
+               if( $type eq 'f' ){
+                       $mode = $file_mode;
+               }
+               elsif( $type eq 'd' ){
+                       $mode = $dir_mode;
+               }
+       }
+
+       # Convert from octal
+       # Suggested patch to limit bits being set
+       # $mode = $mode & 0777;
+       $mode = oct( $mode ) if $mode =~ /^0/;
+
+       if( $get_file ){
+               # Change local
+
+               chmod $mode, $path;
+
+               if( $user ne '' && $group ne '' ){
+                       &chown( $uid, $gid, $path );
+               }
+       }
+       else {
+               # change the remote file
+               if( $remote_has_chmod ){
+                       &ftp'chmod( $path, $mode );
+               }
+       }
+}
+
+
+sub get_passwd
+{
+       local( $user ) = @_;
+       local( $pass );
+       local( $| ) = 1;
+
+       # prompt for a password
+       $SIG{ 'INT' } = 'IGNORE';
+       $SIG{ 'QUIT' } = 'IGNORE';
+
+       system "stty -echo </dev/tty >/dev/tty 2>&1";
+       print "Password for $user: ";
+
+       $pass = <STDIN>;
+       print "\n";
+       chop( $pass );
+
+       system "stty echo </dev/tty >/dev/tty 2>&1";
+
+       $SIG{ 'INT' } = 'DEFAULT';
+       $SIG{ 'QUIT' } = 'DEFAULT';
+       
+       return $pass;
+}
+
+sub compare_times
+{
+       # Try and allow for time zone changes (eg when a site
+       # switches from daylight saving to non daylight saving)
+       # by ignoring differences of exactly one hour
+
+       local( $t1, $t2 ) = @_;
+       local( $diff ) = ($t1 > $t2 ? $t1 - $t2 : $t2 - $t1);
+
+       return ($t1 > $t2) && ($diff != 3600);
+}
+
+sub create_assocs
+{
+       local( $map );
+
+       &delete_assocs();
+
+       &msg( "creating assocs ...\n" ) if $debug > 2;
+       foreach $map ( @assocs ){
+               eval "\$$map = \"\$big_temp/$map.$$\"";
+               eval "dbmopen( $map, \$$map, 0644 )";
+       }
+       &msg( "creating assocs done\n" ) if $debug > 2;
+}
+
+sub delete_assocs
+{
+       local( $map );
+
+       &msg( "deleting assocs ...\n" ) if $debug > 2;
+       foreach $map ( @assocs ){
+               eval "\$$map = \"\$big_temp/$map.$$\"";
+               eval "dbmclose( $map )";
+               &unlink_dbm( eval "\$$map" );
+               eval "\%$map = ()";
+       }
+       &msg( "deleting assocs done\n" ) if $debug > 2;
+}
+
+sub unlink_dbm
+{
+       local( $file ) = @_;
+       unlink "$file.pag" if -e "$file.pag";
+       unlink "$file.dir" if -e "$file.dir";
+       unlink "$file.gdbm" if -e "$file.gdbm";
+       unlink "$file" if -e "$file";
+}
+
+# Chop the tmp file up
+sub bsplit
+{
+       local( $temp, $dest_path, $time ) = @_;
+       local( $dest_dir ) = "$dest_path-split";
+       local( $bufsiz ) = 512;
+       local( $buffer, $in, $sofar );
+
+       &msg( "Splitting up $temp into $dest_dir/ ($time)\n" ) if $debug;
+
+       # Stomp on the original directories
+       local( $d ) = $dest_dir;
+       $d =~ s/($shell_metachars)/\\$1/g;
+       &sys( "$rm_prog -rf \"$d\"" );
+
+       &mkdirs( $dest_dir );
+
+       local( $index ) = "00";
+       local( $part );
+       open( TMP, $temp ) || die "Cannot open $temp!";
+       $sofar = $split_chunk; # Force a new file
+       while( ($in = sysread( TMP, $buffer, $bufsiz )) > 0 ){
+               if( $sofar >= $split_chunk ){
+                       if( $part ){
+                               close( PART );
+                               if( $time ){
+                                       &set_timestamp( $part, $time );
+                               }
+                       }
+                       $index++;
+                       $part = "$dest_dir/part$index";
+                       &msg( "creating $part\n" ) if $debug;
+                       open( PART, ">$part" ) || die "Cannot create $part";
+                       # Make sure to keep this!
+                       local( $locali ) = $local_map{ $part };
+                       &keep( $locali, $part, *local_keep, *local_keep_totals, 
*local_map, 1 );
+                       $sofar = 0;
+               }
+               if( ($out = syswrite( PART, $buffer, $in )) != $in ){
+                       die "Failed to write data to $part";
+               }
+               $sofar += $in;
+       }
+       close( PART );
+       if( $time ){
+               &set_timestamp( $part, $time );
+       }
+       close( TMP );
+
+       # Generate a readme file about what is in the split directory
+       local( $readme ) = "$dest_dir/README";
+       open( README, ">$readme" ) || die "Cannot create $readme";
+       print README "This directory contains a splitup version of 
$dest_path\n";
+       print README "to recreate the original simply concatenate all the\n";
+       print README "parts back together.\n\nChecksums are:\n\n";
+       close README;
+       &sys( "(cd \"$d\" ; $sum_prog part*)>> $readme" );
+}
+
+sub sys
+{
+       local( $com ) = @_;
+       &msg( "$com\n" ) if $debug > 2;
+       return system( $com ) / 256;
+}
+
+# Set up an associative array given all an array of keys.
+# @fred = ( 'a' );
+# &set_assoc_from_array( *fred )
+# Creates => $fred{ 'a' } = 1
+#
+sub set_assoc_from_array
+{
+       # This declaration must be "local()" because it modifies global data.
+       local( *things ) = @_;
+       foreach $thing ( @things ){
+               $things{ $thing } = 1;
+       }
+}
+
+sub find_prog
+{
+       local( $prog ) = @_;
+       local( $path ) = $ENV{ 'PATH' };
+
+       foreach $dir ( split( /$path_sep/, $path ) ){
+               local( $path ) = $dir . $file_sep . $prog;
+               if( -x $path ){
+                       return $path;
+               }
+               if( $on_win ){
+                       $path .= ".exe";
+                       if( -x $path ){
+                               return $path;
+                       }
+               }
+       }
+       return '';
+}
+
+sub real_dir_from_path
+{
+       local( $program ) = @_;
+       local( @prog_path ) = split( m:$file_sep_pat: , $program );     # dir 
collection
+       local( $dir );
+
+       while( -l $program ){                           # follow symlink
+               $program = readlink( $program );
+               if( $program =~ m:^$file_sep_pat: ){    # full path?
+                       @prog_path = ();                # start dir collection 
anew
+               }
+               else {
+                       pop( @prog_path );              # discard file name
+               }
+               push( @prog_path, split( m:$file_sep_pat:, $program ) );# add 
new parts
+               $program = join( $file_sep, @prog_path );  # might be a symlink 
again...
+       }
+       pop( @prog_path );
+       $dir = join( $file_sep, @prog_path );
+
+       if( ! $dir ){
+               $dir = '.';
+       }
+       
+       return $dir;
+}
+
+sub msg
+{
+       local( $todo, $msg ) = (0, "");
+
+       if( $#_ == 1 ){
+               ($todo, $msg) = @_;
+       }
+       else {
+               $todo = 0;
+               $msg = $_[ 0 ];
+       }
+
+       # Assign to $0 so when you do a 'ps' it says this!
+       if( defined $package && 
+               defined $site &&
+               defined $remote_dir ){
+               $0 =  "mirror $package:$site:$remote_dir $msg";
+       }
+       else {
+               $0 = "mirror $msg";
+       }
+
+       if( $todo & $log ){
+               push( @log, $msg );
+       }
+# Not sure about this one.  always print the message even if its a log msg.
+#      else {
+               print $msg;
+#      }
+}
+
+sub to_bytes
+{
+       local( $size ) = @_;
+       if( $size =~ /^(\d+)\s*(k|b|m)s*$/i ){
+               $size = $1;
+               if( $2 =~ /[mM]/ ){
+                       $size *= (1024*1024);
+               }
+               elsif( $2 =~ /[bB]/ ){
+                       $size *= 512;
+               }
+               elsif( $2 =~ /[kK]/ ){
+                       $size *= 1024;
+               }
+       }
+       return $size;
+}
+
+# Given a unix filename map it into a vms name.
+# $kind is 'f' for files and 'd' for directories
+sub unix2vms
+{
+       local( $v, $kind ) = @_;
+
+       if( $v eq '.' || $v eq '/' ){
+               return "[]";
+       }
+
+       if( $vms_dir ){
+               $v = $vms_dir . '/' . $v;
+       }
+
+       if( $kind eq 'f' ){
+               # Map a/b/c.txt into [a.b]c.txt
+               if( $v =~ m,(.*)/([^/]+), ){
+                       local( $dir, $rest ) = ($1, $2);
+                       $dir =~ s,/,.,g;
+                       $v = "[$dir]$rest";
+               }
+       }
+       else {
+               # Map a/b/c into [a.b.c]
+               $v =~ s,/,.,g;
+               $v = "[$v]";
+       }
+       return $v;
+}
+
+sub dirpart
+{
+       local( $path ) = @_;
+       if( $path =~ m:/: ){
+               $path =~ s:^(.*)/[^/]+$:$1:;
+       }
+       else {
+               $path = '.';
+       }
+       return $path;
+}
+
+# Given a filename (not a directory) and what path it symlinks to
+# return a, hopefully, non-relative pathname that the symlink
+# really points to.  This is so it can be used to index into the $src_path
+# map.
+sub expand_symlink
+{
+       local( $orig_path, $points_to ) = @_;
+       local( $dirpart ) = &dirpart( $orig_path );
+
+       return &flatten_path( "$dirpart/$points_to" );
+}
+
+# flatten out the effects of dir/.. and /./
+# The problem is not flattening out ../.. into nothing!  Hence
+# the contortions below.
+sub flatten_path
+{
+       local( $path ) = @_;
+       local( $changed ) = 1;
+       local( $i );
+       
+       local( $rooted ) = $path =~ m:^/:;
+       local( $count ) = 0;
+       local( $orig_path ) = $path;
+       
+       $path =~ s:^/::;
+       $path =~ s:(^|/)\.(/|$)::g;
+       $path =~ s:/+:/:g;
+
+       while( $changed ){
+               if( $count++ > 100 ){
+                       &msg( $log, "LOOPING in flatten_path orig = $orig_path, 
path now $path\n" );
+                       last;
+               }
+               local( $in ) = $path;
+               local( @parts ) = split( /\//, $path );
+               for( $i = 0; $i <= $#parts; $i++ ){
+                       if( $parts[ $i ] eq '.' ){
+                               $parts[ $i ] = undef;
+                               next;
+                       }
+                       if( $i > 0 && $parts[ $i ] eq '..' &&
+                          $parts[ $i - 1 ] && $parts[ $i - 1 ] ne '..' ){
+                               $parts[ $i - 1 ] = $parts[ $i ] = undef;
+                               next;
+                       }
+               }
+               $path = '';
+               for( $i = 0; $i <= $#parts; $i++ ){
+                       next unless $parts[ $i ];
+                       $path .= '/' if $path ne '';
+                       $path .= $parts[ $i ];
+               }
+               $changed = $in ne $path;
+       }
+       if( $rooted ){
+               $path = "/$path";
+       }
+       return $path;
+}
+
+
+# Fix up a package name.
+# strip trailing and leading ws and replace awkward characters
+# This doesn't guarentee a unique filename.
+sub fix_package
+{
+       local( $package ) = @_;
+       $package =~ s:[\s/']:_:g;
+       return $package;
+}
+
+sub will_compress
+{
+       $src_type[ $_[1] ] eq 'f' &&
+       $compress_patt && $_[0] =~ /$compress_patt/ &&
+       ( ! $compress_size_floor ||
+         $compress_size_floor < $src_size[ $_[1] ] ) &&
+       !($compress_excl && $_[0] =~ /$compress_excl/i) &&
+       !($compress_suffix eq $gzip_suffix &&
+         $compress_conv_patt && $_[0] =~ /$compress_conv_patt/);
+}
+
+sub will_split
+{
+       $split_max &&
+       $src_size[ $_[1] ] > $split_max &&
+       $src_type[ $_[1] ] eq 'f' &&
+       $split_patt && $_[0] =~ /$split_patt/;
+}
+
+sub myflock
+{
+       local( $file, $kind ) = @_;
+
+       if( ! $can_flock ){
+               return;
+       }
+
+       eval( "flock( \$file, $kind )" );
+       if( $@ =~ /unimplemented/ ){
+               $can_flock = 0;
+               warn "flock not unavialable, running unlocked\n";
+       }
+}
+
+sub t2str
+{
+       local( @t );
+       if( $use_timelocal ){
+               @t = localtime( $_[0] );
+       }
+       else {
+               @t = gmtime( $_[0] );
+       }
+       local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = @t;
+
+# Debian bug #48611, 1969 appeared as 2069, address@hidden
+       $year += 1900;
+           
+       return sprintf( "%04d/%02d/%02d-%02d:%02d:%02d",
+               $year, $mon + 1, $mday, $hour, $min, $sec );
+}
+
+sub handler
+{
+       $sigs ++;
+       if( $sigs > $max_sigs ){
+               exit( 0 );
+       }
+
+        local( $sig ) = @_;
+        local( $msg ) = "Caught a SIG$sig shutting down";
+        local( $package, $filename, $line ) = caller;
+        warn "$package:$filename:$line $msg";
+        exit( 0 );
+}
+
+sub trap_signals
+{
+       local( $sig );
+        foreach $sig ( 'HUP', 'INT', 'QUIT', 'ILL',
+                        'TRAP', 'IOT', 'BUS', 'FPE',
+                        'USR1', 'SEGV', 'USR2',
+                        'PIPE', 'ALRM', 'TERM' ){
+                $SIG{ $sig } = "main\'handler";
+        }
+}
+
+sub map_user_group
+{
+       if( ! defined( $uid ) ){
+               if( $user =~ /^\d+$/ ){
+                       # User is just a number - presume it is the uid
+                       $uid = $user;
+               }
+               else {
+                       $uid = (getpwnam( $user ))[ 2 ];
+               }
+       }
+       if( ! defined( $gid ) ){
+               if( $group =~ /\d+$/ ){
+                       # Group is just a number - presume it is the gid
+                       $gid = $group;
+               }
+               else {
+                       $gid = (getgrnam( $group ))[ 2 ];
+               }
+       }
+}
+
+sub keep
+{
+       local( $pathi, $path, *keep, *keep_totals, *keep_map, $kind ) = @_;
+       # If pathi is already kept nothing to do
+       if( $pathi eq '' ){
+               &msg( "   keep $path NOTE null pathi\n" ) if $debug > 3;
+               return;
+       }
+       if( $keep[ $pathi ] ){
+               &msg( "   keep $path [$pathi] NOTE already kept\n" ) if $debug 
> 3;
+               return;
+       }
+
+       $keep[ $pathi ] = 1;
+       $keep_totals[ $kind ]++;
+       &msg( "   keep $path\n" ) if $debug > 3;
+
+       # Keep all the parent directories
+       while( $path =~ m,^(.*)/([^/]+)$, ){
+               $path = $1;
+               $pathi = $keep_map{ $path };
+               if( $pathi eq '' ){
+                       &msg( "   keep $path NOTE null pathi\n" ) if $debug > 3;
+                       return;
+               }
+               if( $keep[ $pathi ] ){
+                       &msg( "   keep $path [$pathi] NOTE already kept\n" ) if 
$debug > 3;
+                       return;
+               }
+
+               $keep[ $pathi ] = 1;
+               $keep_totals[ 0 ]++;
+       }
+}
+
+sub alarm
+{
+       local( $time_to_sig ) = @_;
+       eval "alarm( $time_to_sig )";
+}
+
+sub chown
+{
+       local( $uid, $gid, $path ) = @_;
+       eval "chown ( \$uid, \$gid, \$path )";
+}
+
+sub utime
+{
+       local( $atime, $mtime, $path ) = @_;
+       if( ! $on_win ){
+               return utime( $atime, $mtime, $path );
+       }
+       
+       # On windoze I might have set attribs to allow the time to be changed 
first
+       local( $old_mode ) = (stat( $path ))[ 2 ]; 
+       local( $tmp_mode ) = $old_mode;
+       local( $ret );
+
+       $tmp_mode |= 0700;
+       chmod( $tmp_mode, $path );
+       $ret = utime( $atime, $mtime, $path );
+       chmod( $old_mode, $path );
+       return $ret;
+}
+
+sub cwd
+{
+       local( $lcwd ) = '';
+       eval "\$lcwd = $win_getcwd";
+       
+       if( ! ($lcwd eq '' || $lcwd eq $win_getcwd) ){
+               # Must be on windoze!
+               $cwd = $lcwd;
+       }
+       else {
+               # didn't manage it try and run the pwd command instead
+               chop( $cwd = `pwd` );
+       }
+       return $cwd;
+}
diff --git a/test/etags/perl-src/yagrip.pl b/test/etags/perl-src/yagrip.pl
new file mode 100644
index 0000000..be9f09c
--- /dev/null
+++ b/test/etags/perl-src/yagrip.pl
@@ -0,0 +1,54 @@
+#Yet Another Getopt Routine In Perl
+# address@hidden, 89/11/1
+#usage:
+#&getopt("f:bar") ||
+#      die &usage("script","f:bar","oo","[files ...]");
+#
+sub getopt {
+       local($_,$flag,$opt,$f,$r,@temp) = @_;
+       @temp = split(/(.):/);
+       while ($#temp >= $[) {
+               $flag .= shift(@temp);
+               $opt .= shift(@temp);
+       }
+       while ($_ = $ARGV[0], /^-(.)(.*)/ && shift(@ARGV)) {
+               ($f,$r) = ($1,$2);
+               last if $f eq '-';
+               if (index($flag,$f) >= $[) {
+                       eval "\$opt_$f++;";
+                       $r =~ /^(.)(.*)/,redo if $r ne '';
+               }elsif (index($opt,$f) >= $[) {
+                       $r = $r eq '' ? shift(@ARGV) : $r;
+                       eval "\$opt_$f = \$r;";
+               }else{
+                       print STDERR "Unrecognized switch \"-$f\".\n";
+                       return 0;
+               }
+       }
+       return 1;
+}
+
+#usage: usage:
+# &usage(progname,arglist,@names,@last);
+#ex:
+# &usage("script","f:bar","oo","[file ...]");
+#would return
+# "usage: script [-f oo] [-bar] [file ...]"
+#
+sub usage {
+       local($prog,$_,@list) = @_;
+       local($string,$flag,@string,@temp,@last) = ();
+       @temp = split(/(.):/);
+       push(@string,"usage:",$prog);
+       while ($#temp >= $[) {
+               if (($flag = shift(@temp)) ne '') {
+                       push(@string,"[-$flag]");
+               }
+               if (($flag = shift(@temp)) ne '') {
+                       push(@string,sprintf("[-%s %s]",$flag,shift(@list)));
+               }
+       }
+       push(@string,@list) if $#list >= $[;
+       return join(' ',@string) . "\n";
+}
+1;
diff --git a/test/etags/php-src/lce_functions.php 
b/test/etags/php-src/lce_functions.php
new file mode 100644
index 0000000..6573813
--- /dev/null
+++ b/test/etags/php-src/lce_functions.php
@@ -0,0 +1,699 @@
+<?php
+if(!defined("LCE_FUNCTIONS"))
+{
+  define("LCE_FUNCTIONS", 1);
+  include("base.php");
+  include("lce_config.php");
+
+  // Unknown line class
+  define("LCE_UNKNOWN", 0);
+  // pure whitespace
+  define("LCE_WS", 1);
+  // a unqualified comment
+  define("LCE_COMMENT", 2);
+  // a user/translator comment
+  define("LCE_COMMENT_USER", 3);
+  // a tool-generated comment
+  define("LCE_COMMENT_TOOL", 4);
+  // A line containing a MSGID
+  define("LCE_MSGID", 5);
+  // A line containing a MSGSTR
+  define("LCE_MSGSTR", 6);
+  // A quoted text string
+  define("LCE_TEXT", 7);
+
+  define("STATE_ABORT", 0);
+  define("STATE_OK", 1);
+  define("STATE_LOOP", 2);
+
+  class POEntryAD extends AD
+    {
+      function validate($value)
+     {
+       //        print '"<pre>' . $value . '"<br></pre>';
+       $result =  AD::validate(trim($value));
+       //return $result;
+       if($result[0])
+        {
+          $lines = explode("\n", ereg_replace("\r", "", $result[1]));
+          //$lines = explode("\n", $result[1]);
+          /*         print "<pre>";
+          print_r($lines);
+          print "</pre>";*/
+          $res = array();
+          for($i = 0; $i < count($lines); $i++)
+            {
+              if(trim($lines[$i]) != "")
+                $res[] = $lines[$i];
+            }
+          $result[1] = join("\n", $res);
+          /*         print "<pre>";
+          print_r($result[1]);
+          print "</pre>";*/
+
+          $result[0] = $this->checkQuotation($result[1]);
+        }
+       return $result;
+     }
+
+      function checkQuotation($str)
+     {
+       $rex = "\\\\n|\\\\t|\\\\r|\\\\\"";
+       $str = ereg_replace($rex, "", $str);
+       $str = ereg_replace("\\\\\\\\", "", $str);
+       return !(strstr($str, "\"")
+               || strstr($str, "\\"));
+     }
+    }
+
+
+  class CommentAD extends AD
+    {
+      var $prefix;
+      function CommentAD(
+                     $name,                    // the name of the variable
+                     $not_null = 0,
+                     $type = "",       // as returned by gettype
+                     $prefix = "# ")
+     {
+       $this->prefix = $prefix;
+       AD::AD($name, $not_null, $type);
+     }
+
+      function validate($value)
+     {
+       $res = AD::validate($value);
+       return $res;
+       if($res[0] && $res[1] != "")
+        {
+          $mod_lines = array();
+          $lines = explode("\n", $res[1]);
+
+          for($i = 0; $i < count($lines); $i++)
+            {
+              $line = $lines[$i];
+              if(substr($line, 0, 1) != "#")
+                  $line = $this->prefix . $line;
+              $mod_lines[] = $line;
+            }
+          $res[1] = join("\n", $mod_lines);
+        }
+       return $res;
+     }
+    }
+
+  class POEntry extends HtmlValidator
+    {
+      var $msgid;
+      var $msgstr;
+      var $user_comment;
+      var $sys_comment;
+      var $unk_comment;
+
+      var $msgid_lc = 0;
+      var $msgstr_lc = 0;
+      var $user_comment_lc = 0;
+      var $sys_comment_lc = 0;
+      var $unk_comment_lc = 0;
+
+      function POEntry()
+     {
+       $this->atts = array(
+                          new AD("msgid"),
+                          new POEntryAD("msgstr", REQUIRED_ATTRIBUTE),
+                          new CommentAD("user_comment"),
+                          new POEntryAD("sys_comment"),
+                          new POEntryAD("unk_comment"),
+                          new AD("msgid_lc", NOT_REQUIRED_ATTRIBUTE, 0),
+                          new AD("msgstr_lc", NOT_REQUIRED_ATTRIBUTE, 0),
+                          new AD("user_comment_lc", NOT_REQUIRED_ATTRIBUTE, 0),
+                          new AD("sys_comment_lc", NOT_REQUIRED_ATTRIBUTE, 0),
+                          new AD("unk_comment_lc", NOT_REQUIRED_ATTRIBUTE, 0)
+                          );
+     }
+
+      function lineCount($entry)
+     {
+       $lc = count(explode("\n", $entry));
+       return $lc;
+     }
+
+      function serializeToVars($prefix)
+     {
+       $this->user_comment_lc = $this->lineCount($this->user_comment);
+       $this->unk_comment_lc = $this->lineCount($this->sys_comment);
+       $this->sys_comment_lc = $this->lineCount($this->unk_comment);
+       $this->msgid_lc = $this->lineCount($this->msgid);
+       $this->msgstr_lc = $this->lineCount($this->msgstr);
+       return HtmlValidator::serializeToVars($prefix);
+     }
+
+      function write()
+     {
+       $content = "";
+       $content .= $this->user_comment . "\n";
+       $content .= $this->unk_comment . "\n";
+       $content .= $this->sys_comment . "\n";
+       $content .= "msgid \"" . $this->msgid . "\"\n";
+       $content .= 'msgstr "' . join("\"\n\"", explode("\n", $this->msgstr)) . 
"\"" . "\n\n";
+       return $content;
+     }
+    }
+
+  class POReader extends HTMLValidator
+    {
+      var $msgid;
+      var $msgstr;
+      var $user_comment;
+      var $sys_comment;
+      var $unk_comment;
+      var $state;
+      var $ignore_ws;
+      var $po_entries;
+      var $poe_num;
+      var $filename;
+      var $domain;
+
+      function gettext($msgid)
+     {
+       if(isset($this->po_entries[$msgid]))
+        {
+          $po = $this->po_entries[$msgid];
+          return StripCSlashes(join("", explode("\n", $po->msgstr)));
+          //return $po->msgstr;
+        }
+       return $msgid;
+     }
+
+
+      function parseFromVars($prefix)
+     {
+       $res = HtmlValidator::parseFromVars($prefix);
+       if($res[0])
+        {
+          $poe_res = true;
+          $this->po_entries = array();
+          for($i = 0; $i < $this->poe_num; $i++)
+            {
+              $poe = new POEntry;
+              $res = $poe->parseFromVars($prefix . "_POE$i");
+              if($res[0])
+                {
+                  $msgid = $prefix . "_POE" . $i . "_MSGID";
+                  $msgid = $$msgid;
+                  $this->po_entries[$prefix . "_POE" . $i . "_MSGID"] = 
$res[1];
+                }
+              else
+                $poe_res = false;
+            }
+        }
+       if(!$poe_res)
+        $GLOBALS[$prefix . "_ERR"] = 1;
+       return array($poe_res, $this);
+     }
+
+      function serializeToVars($prefix)
+     {
+       HtmlValidator::serializeToVars($prefix);
+       reset($this->po_entries);
+       $i = 0;
+       while($poe = each($this->po_entries))
+        {
+          $poe = $poe[1];
+          $poe->serializeToVars($prefix . "_POE$i");
+          $i++;
+        }
+     }
+
+
+      function POReader($domain, $filename)
+     {
+       $this->domain = $domain;
+       $this->filename = $filename;
+       $this->ignore_ws = true;
+       $this->po_entries = array();
+       $this->atts = array(
+                          new AD("domain", REQUIRED_ATTRIBUTE),
+                          new AD("filename", REQUIRED_ATTRIBUTE),
+                          new AD("poe_num", REQUIRED_ATTRIBUTE, 0)
+                          );
+     }
+
+
+      function read()
+     {
+       if($fh = fopen($this->filename, "r"))
+        {
+          $this->lines = array();
+          while (!feof ($fh))
+            {
+              $line = fgets($fh, 4096);
+              $this->lines[] = $line;
+            }
+          fclose($fh);
+        }
+       $this->createPOEntries();
+       $this->poe_num = count($this->po_entries);
+     }
+
+      function write($save="yes")
+     {
+       reset($this->po_entries);
+       $content = "";
+       while($poe = each($this->po_entries))
+        {
+          $poe = $poe[1];
+          $content .= $poe->write();
+        }
+
+       if(($fh = fopen($this->filename, "w"))
+         && $save == "yes")
+        {
+          fwrite($fh, $content);
+          }
+       return $content;
+     }
+
+      function isComment($class)
+     {
+       if($class == LCE_COMMENT || $class == LCE_COMMENT_USER || $class == 
LCE_COMMENT_TOOL)
+        return true;
+       return false;
+     }
+
+      function comment($line, $class)
+     {
+       if($this->isComment($class))
+        {
+          if($class == LCE_COMMENT_USER)
+            $this->user_comment .= $line;
+          else if($class == LCE_COMMENT_TOOL)
+            $this->sys_comment .= $line;
+          else
+            $this->unk_comment .= $line;
+          return STATE_OK;
+        }
+       if($class == LCE_MSGID)
+        {
+          $this->state = "msgid";
+          return STATE_LOOP;
+        }
+       return STATE_ABORT;
+     }
+
+      function msgid($line, $class)
+     {
+       if($class == LCE_MSGID || $class == LCE_TEXT)
+        {
+          $line = $this->stripLine($line, LCE_MSGID);
+          $this->msgid .= $line;
+          return STATE_OK;
+        }
+       if($class == LCE_MSGSTR)
+        {
+          $this->state = "msgstr";
+          return STATE_LOOP;
+        }
+       return STATE_ABORT;
+     }
+
+      function msgstr($line, $class)
+     {
+       if($class == LCE_MSGSTR || $class == LCE_TEXT)
+        {
+          $line = $this->stripLine($line, $class);
+          $this->msgstr .= $line;
+          return STATE_OK;
+        }
+       // We have a different state, so we have to create a POEntry
+       $poe = new POEntry;
+       $poe->user_comment = trim($this->user_comment);
+       $poe->sys_comment = trim($this->sys_comment);
+       $poe->unk_comment = trim($this->unk_comment);
+       $poe->msgid = trim($this->msgid);
+       $poe->msgstr = trim($this->msgstr);
+       $this->po_entries[trim($this->msgid)] = $poe;
+       $this->state = "start";
+       return STATE_LOOP;
+     }
+
+      function start($line, $class)
+     {
+       $this->user_comment = "";
+       $this->sys_comment = "";
+       $this->unk_comment = "";
+       $this->msgid = "";
+       $this->msgstr = "";
+       if($this->isComment($class))
+        {
+          $this->state = "comment";
+          return STATE_LOOP;
+        }
+       if($class == LCE_MSGID)
+        {
+          $this->state = "msgid";
+          return STATE_LOOP;
+        }
+       return STATE_OK;
+     }
+
+      function createPOEntries()
+     {
+       $this->msgid = "";
+       $this->msgstr = "";
+       $this->user_comment = "";
+       $this->sys_comment = "";
+       $this->state = "start";
+
+       reset($this->lines);
+       for($i = 0; $i < count($this->lines); $i++)
+        {
+          $line = $this->lines[$i];
+          $class = $this->classifyLine($line);
+          if($class != LCE_WS || !$this->ignore_ws)
+            {
+              $state_ret = STATE_LOOP;
+              while($state_ret == STATE_LOOP)
+                {
+                  $state = $this->state;
+                  //print "$this->state $class:$line <br>";
+                  $state_ret = $this->$state($line, $class);
+                }
+              //print "state_ret = $state_ret <br>";
+            }
+          if($state_ret == STATE_ABORT)
+            break;
+        }
+       // Get the last entry
+       if($state_ret != STATE_ABORT)
+        {
+          $this->msgstr("", LCE_UNKNOWN);
+        }
+     }
+
+      function stripLine($line, $class)
+     {
+       switch($class)
+        {
+        case LCE_TEXT:
+          ereg('^"(.*)"', $line, $regs);
+          $line = $regs[1] . "\n";
+          break;
+        case LCE_MSGID:
+          if(substr($line, strlen("msgid")) == "msgid")
+            {
+              $line = substr($line, strlen("msgid") + 1);
+            }
+          ereg('"(.*)"', $line, $regs);
+          $line = $regs[1];
+          break;
+        case LCE_MSGSTR:
+          // TODO: Check if ^ can be removed
+          $line = substr($line, strlen("msgstr") + 1);
+          ereg('^"(.*)"', $line, $regs);
+          $line = $regs[1] . "\n";
+          break;
+
+        }
+       return $line;
+     }
+
+      function printClassification()
+     {
+       reset($this->lines);
+       for($i = 0; $i < count($this->lines); $i++)
+        {
+          $line = $this->lines[$i];
+          $class = $this->classifyLine($line);
+          print "#$i: $class $line<br>";
+        }
+     }
+
+      function classifyLine($line)
+     {
+       if(ereg("^[ \n\r\t]*$", $line))
+        return LCE_WS;
+       if(ereg("^#.*\$", $line))
+        {
+          if(ereg("^[,:-~].*", substr($line, 1)))
+            {
+              return LCE_COMMENT_TOOL;
+            }
+          if(ereg("^[ \n\r\t].*", substr($line, 1)))
+            {
+              return LCE_COMMENT_USER;
+            }
+          return LCE_COMMENT;
+        }
+       if(ereg("^msgid (.*)\$", $line, $regs))
+        {
+          $line = $regs[1];
+          if($this->classifyLine($line) == LCE_TEXT)
+            return LCE_MSGID;
+        }
+       if(ereg("^msgstr (.*)\$", $line, $regs))
+        {
+          $line = $regs[1];
+          if($this->classifyLine($line) == LCE_TEXT)
+            return LCE_MSGSTR;
+        }
+       if(ereg('^".*"', $line))
+        {
+                            // TODO: Check correct escapes
+          return LCE_TEXT;
+        }
+
+       return LCE_UNKNOWN;
+     }
+    }
+
+
+  function getTextDomains($lines)
+    {
+      $default_domain = "";
+      $domains = array();
+      while($gl = each($GLOBALS))
+     {
+       $gname = $gl[0];
+       global $$gname;
+     }
+      for($i = 0; $i < count($lines); $i++)
+     {
+       if(ereg("bindtextdomain\(([^,]+),([^\)]+)\)", $lines[$i], $regs))
+        {
+                            //print "Line:" .  $lines[$i] . " <br>";
+          $name = $regs[1];
+          $ev = "\$directory = ". $regs[2] . ";";
+          print $ev;
+          eval($ev);
+          $domains[] = array($name, $directory);
+        }
+       if(ereg("textdomain\(([^\)]+)\)", $lines[$i], $regs))
+        $default_domain = $regs[1];
+     }
+      return array($default_domain, $domains);
+    }
+
+
+  class PORManager extends HtmlValidator
+    {
+      var      $por_a;
+
+      function PORManager()
+     {
+       $this->por_a = array();
+     }
+
+      function addPOReader($d_name, &$por)
+     {
+       $this->por_a[$d_name] = &$por;
+     }
+
+      function &getPOReader($domain)
+     {
+       return $this->por_a[$domain];
+     }
+
+      function getDomainNames()
+     {
+       return array_keys($this->por_a);
+     }
+    }
+
+  function &loadPORManager()
+    {
+      global $LCE_PORMAN;
+      if(!isset($LCE_PORMAN))
+     {
+       $LCE_PORMAN = new PORManager();
+     }
+      return $LCE_PORMAN;
+    }
+
+
+  // More or less intelligent filename joining
+  // As available in PYTHONs os.path
+  function fileJoin()
+    {
+      $numargs = func_num_args();
+      $args = func_get_args();
+      for($i = 0; $i < $numargs - 1; $i++)
+     {
+       if(substr($args[$i], -1) != "/")
+        $args[$i] = $args[$i] . "/";
+       if($i > 0)
+        {
+          if(substr($args[$i],0 , 1) == "/")
+            $args[$i] = substr($args[$i], 1);
+        }
+
+     }
+      return join("", $args);
+    }
+
+  if(defined("LCE_TESTSERVER"))
+    {
+
+      function lce_bindtextdomain($d_name, $d_path)
+     {
+       global $LANG, $LC_MESSAGES, $LC_ALL, $LCE_LANG;
+       global $LCE_ERR;
+       global $LCE_PO_SUFFIX;
+       global $LCE_MANAGER;
+
+       $path_orig = $d_path;
+       // This is not complete and reflects
+       // my not very far going understanding of the
+       // different $LC_x thingies.
+       if(isset($LC_MESSAGES))
+        {
+                            //print "LC_MESSAGES<br>";
+          $lang_suffix = $LC_MESSAGES;
+        }
+       else if(isset($LC_ALL))
+        {
+                            //print "LC_ALL<br>";
+          $lang_suffix = $LC_ALL;
+        }
+       else if(isset($LANG))
+        {
+                            //print "LANG<br>";
+          $lang_suffix = $LANG;
+        }
+       else
+        {
+                            //print "LCE_LANG<br>";
+          $lang_suffix = $LCE_LANG;
+        }
+
+       //print "LangSuffix: $lang_suffix \n";
+       //print "D_Path: " . fileJoin($d_path, $lang_suffix, "LC_MESSAGES", 
$d_name . $LCE_PO_SUFFIX) . "<br>";
+       // First try: the whole lang_suffix
+
+       if(file_exists(fileJoin($d_path, $lang_suffix, "LC_MESSAGES", $d_name . 
$LCE_PO_SUFFIX)))
+        $d_path = fileJoin($d_path, $lang_suffix, "LC_MESSAGES", $d_name . 
$LCE_PO_SUFFIX);
+       else
+        {
+          $lang_suffix = substr($lang_suffix, 0, 2);
+          if(file_exists(fileJoin($d_path, $lang_suffix, "LC_MESSAGES", 
$d_name. $LCE_PO_SUFFIX)))
+            $d_path = fileJoin(fileJoin($d_path, $lang_suffix, "LC_MESSAGES", 
$d_name . $LCE_PO_SUFFIX));
+          else
+            {
+              $LCE_ERR = "No PO-file found";
+              return false;
+            }
+        }
+       //print "D_Path: $d_path \n";
+       $por = new POReader($d_name, $d_path, $path_orig);
+       $por->read();
+       $porman =& loadPORManager();
+       $porman->addPOReader($d_name, $por);
+       return true;
+     }
+
+      function lce_textdomain($domain)
+     {
+       global $LCE_DOMAIN;
+       $LCE_DOMAIN = $domain;
+     }
+
+      function lce_gettext($msgid)
+     {
+       global $LCE_DOMAIN;
+       return lce_dgettext($LCE_DOMAIN, $msgid);
+     }
+
+      function lce_dgettext($domain, $msgid)
+     {
+       $porman =& loadPORManager();
+       if($por = &$porman->getPOReader($domain))
+        return $por->gettext($msgid);
+       return $msgid;
+     }
+
+      function lce()
+     {
+       global $LCE_LCEDITLOC;
+       $porman =& loadPORManager();
+       $domains = $porman->getDomainNames();
+       for($i = 0; $i < count($domains); $i++)
+        {
+          $por =& $porman->getPOReader($domains[$i]);
+          $domain = "domain=" . urlencode($por->domain);
+          $filename = "filename=" . urlencode($por->filename);
+          $url = $LCE_LCEDITLOC . "?" . $domain . "&" . $filename;
+          print "<a target=\"_blank\" href=\"" . $url . "\">Domain: 
$por->domain</a><br>";
+        }
+     }
+    }
+  else
+    {
+      function lce_bindtextdomain($domain, $path)
+     {
+       bindtextdomain($domain, $path);
+     }
+
+      function lce_textdomain($domain)
+     {
+       textdomain($domain);
+     }
+
+      function lce_gettext($msgid)
+     {
+       return gettext($msgid);
+     }
+
+      function lce_dgettext($domain, $msgid)
+     {
+       return dgettext($domain, $msgid);
+     }
+      function lce()
+     {
+     }
+    }
+
+
+  function lce_geteditcode($type, $name, $text, $rows=2)
+    {
+      global $LCE_EDIT_LEVEL;
+      $level_map = array("msgid" => 4,
+                     "sys_comment" => 3,
+                     "user_comment" => 2,
+                     "msgstr" => 1
+                     );
+      if($level_map[$type] > $LCE_EDIT_LEVEL)
+     {
+       return "<input type=\"hidden\" name=\"" . $name . "\" value=\"" . $text 
. "\"><pre>\n" . $text . "\n</pre>";
+     }
+      else
+     {
+       return "<textarea name=\"" . $name . "\" rows=\"" . $rows . "\" 
cols=\"60\">" . $text . "</textarea>";
+     }
+    }
+}
+/*
+  ;;; Local Variables: ***
+  ;;; mode:C ***
+  ;;; End: ***
+*/
+?>
diff --git a/test/etags/php-src/ptest.php b/test/etags/php-src/ptest.php
new file mode 100644
index 0000000..9893839
--- /dev/null
+++ b/test/etags/php-src/ptest.php
@@ -0,0 +1,18 @@
+define("TEST", 0);
+
+class
+test 
+extends base
+{
+       // use --member to tag
+       var $member;
+       var $memassign="hallo";
+       var $memassign_space ="hallo";
+       // Syntactical wrong, but tagged
+       var $test
+}
+
+function 
+foo()
+{
+}
diff --git a/test/etags/php-src/sendmail.php b/test/etags/php-src/sendmail.php
new file mode 100644
index 0000000..1d15e4a
--- /dev/null
+++ b/test/etags/php-src/sendmail.php
@@ -0,0 +1,527 @@
+<?php
+
+/*
+  Classe creata da Santoro Diego.
+  Per aiuti nella programmazione in PHP, PERL, C e ECMAScript contattatemi
+  e-Mail address@hidden oppure address@hidden
+  La classe ? ancora in fase beta.
+*/
+
+final class sendMail {
+
+  const eMailAddressErrorMessage="L' e-Mail indicata non rispetta un formato 
valido.";
+  const defaultSubject="this is the subject.";
+  const defaultTextMessage="this is text message.";
+  const defaultHtmlMessage="this is html message.";
+  const defaultHeaderMessage="this is a multi-part message in MIME format.";
+
+  private static $messageProperties=array(
+    "charset" => array(
+        "modifiable" => true,
+        "values" => array(
+            "iso-8859-1",
+            "iso-8859-15",
+            "utf-8",
+            "utf-16"
+        )
+    ),
+    "content-transfer-encoding" => array(
+        "modifiable" => true,
+        "values" => array(
+            "7bit",
+            "8bit",
+            "quoted-printable"
+        )
+    )
+  );
+
+  private $attachmentProperties=array(
+    "content-type" => array(
+        "modifiable" => false,
+         "values" => array(
+            "application/octet-stream"
+        )
+    ),
+    "content-transfer-encoding" => array(
+        "modifiable" => false,
+        "values" => array(
+            "base64"
+        )
+    ),
+    "content-disposition" => array(
+        "modifiable" => true,
+        "values" => array(
+            "attachment",
+            "inline"
+        )
+    )
+  );
+
+  private static $relatedProperties=array(
+    "content-transfer-encoding" => array(
+        "modifiable" => false,
+        "values" => array(
+            "base64"
+        )
+    )
+  );
+
+  private $html;
+  private $text;
+
+  private $related;
+  private $attachments;
+
+  public static function valid_eMailAddress($eMailAddress) {
+   if(ereg("^[^@ address@hidden@ ]+\.[^@ ]+$", $eMailAddress))
+    return true;
+   else
+    return false;
+  }
+
+  public static function validContentId($contentId) {
+   if(ereg("^[a-zA-Z0-9]+$", $contentId))
+    return true;
+   else
+    return false;
+  }
+
+  public static function validContentKey($contentKey) {
+   if(ereg("^[a-zA-Z0-9]+$", $contentKey))
+    return true;
+   else
+    return false;
+  }
+
+  public static function mime_content_type($filename) {
+   $mime=array(
+    '.3dmf' => 'x-world/x-3dmf',
+    '.a' => 'application/octet-stream',
+    '.aab' => 'application/x-authorware-bin',
+    '.xwd' => 'image/x-xwd',
+    '.xyz' => 'chemical/x-pdb',
+    '.z' => 'application/x-compressed',
+    '.zip' => 'application/x-zip-compressed',
+    '.zoo' => 'application/octet-stream',
+    '.zsh' => 'text/x-script.zsh',
+    '.css' => 'text/css'
+   );
+   return $mime[strrchr($filename, '.')];
+  }
+
+  private $from;
+  private $to;
+  private $subject;
+
+  private $finalized;
+
+  private $headerMessage;
+  private $bodyMessage;
+
+  private $boundaries;
+
+  public function __construct($from, $to, $subject=self::defaultSubject) {
+
+   // set from
+   if(!self::valid_eMailAddress($from))
+    die(self::eMailAddressErrorMessage);
+   else
+    $this->from=$from;
+
+   // set to
+   if(!self::valid_eMailAddress($to))
+    die(self::eMailAddressErrorMessage);
+   else
+    $this->to=$to;
+
+   // set subject
+   $this->subject=$subject;
+
+   // set text
+   $this->text=array(
+    "message" => self::defaultTextMessage,
+    "properties" => array(
+        "charset" => self::$messageProperties["charset"]["values"][0],
+        "content-transfer-encoding" => 
self::$messageProperties["content-transfer-encoding"]["values"][0]
+    )
+   );
+
+   // set html
+   $this->html=array(
+    "message" => self::defaultHtmlMessage,
+    "properties" => array(
+        "charset" => self::$messageProperties["charset"]["values"][0],
+        "content-transfer-encoding" => 
self::$messageProperties["content-transfer-encoding"]["values"][1]
+    )
+   );
+
+   // set related and attachments
+   $this->related=array();
+   $this->attachments=array();
+
+   // set finalizater counter
+   $this->finalized=false;
+
+   $this->headerMessage="";
+   $this->bodyMessage="";
+
+   $this->boundaries=array(
+    "multipart/alternative" => md5(uniqid(microtime())),
+    "multipart/related" => md5(uniqid(microtime())),
+    "multipart/mixed" => md5(uniqid(microtime()))
+   );
+
+  }
+
+  public function setTo($to, &$errorString) {
+   if(self::valid_eMailAddress($to)) {
+    $this->to=$to;
+    return true;
+   } else {
+    $errorString=eMailAddressErrorMessage;
+    return false;
+   }
+  }
+
+  public function setFrom($from, &$errorString) {
+   if(self::valid_eMailAddress($from)) {
+    $this->from=$from;
+    return true;
+   } else {
+    $errorString=eMailAddressErrorMessage;
+    return false;
+   }
+  }
+
+  public function setSubject($subject=self::defaultSubject) {
+   $this->subject=$subject;
+  }
+
+  public function setTextMessage($textMessage=self::defaultTextMessage) {
+   $this->text["message"]=$textMessage;
+  }
+
+  public function setTextMessageProperty($key, $value, &$errorString) {
+
+   $key=strtolower($key);
+   $value=strtolower($value);
+
+   if(isset(self::$messageProperties[$key])) {
+    if(in_array($value, self::$messageProperties[$key]["values"])) {
+     if(self::$messageProperties[$key]["modifiable"]) {
+       $this->text["properties"][$key]=$value;
+       return true;
+     } else {
+      $errorString="Il valore della propriet? indicata non ? modificabile.";
+      return false;
+     }
+    } else {
+     $errorString="Il valore indicato per questa propriet? non ? valido.";
+     return false;
+    }
+   } else {
+    $errorString="Non esiste questa propriet? per i messaggi html.";
+    return false;
+   }
+  }
+
+  public function setHtmlMessage($htmlMessage=self::defaultHtmlMessage) {
+   $this->html["message"]=$htmlMessage;
+  }
+
+  public function setHtmlMessageProperty($key, $value, &$errorString) {
+
+   $key=strtolower($key);
+   $value=strtolower($value);
+
+   if(isset(self::$messageProperties[$key])) {
+    if(in_array($value, self::$messageProperties[$key]["values"])) {
+     if(self::$messageProperties[$key]["modifiable"]) {
+      $this->html["properties"][$key]=$value;
+      return true;
+     } else {
+      $errorString="Il valore della propriet? indicata non ? modificabile.";
+      return false;
+     }
+    } else {
+     $errorString="Il valore indicato per questa propriet? non ? valido.";
+     return false;
+    }
+   } else {
+    $errorString="Non esiste questa propriet? per i messaggi html.";
+    return false;
+   }
+  }
+
+  public function addRelated($fileName, $relatedKey, $contentId, 
&$errorString) {
+   if(is_file($fileName)) {
+    if($fileHandle=fopen($fileName, "r")) {
+     if(self::validContentId($contentId)) {
+      if(!isset($this->related[$relatedKey])) {
+       if(self::validContentKey($relatedKey)) {
+        $this->related[$relatedKey]=array(
+    "fileName" => basename($fileName),
+    "properties" => array(
+        "content-type" => self::mime_content_type($fileName),
+        "content-transfer-encoding" => 
self::$relatedProperties["content-transfer-encoding"]["values"][0],
+        "content-id" => $contentId
+    ),
+    "source" => base64_encode(
+        fread($fileHandle, filesize($fileName))
+    )
+        );
+        return true;
+       } else {
+        $errorString="L' id specificato non ? valido.";
+        return false;
+       }
+      } else {
+       $errorString="La chiave specificata ? gi? associata ad un altro 
related.";
+       return false;
+      }
+     } else {
+      $errorString="La chiave specificata per il related non ? valida.";
+      return false;
+     }
+    } else {
+     $errorString="Non ? possibile aprire il file indicato.";
+     return false;
+    }
+   } else {
+    $errorString="Il nome del file indicato non ? valido.";
+    return false;
+   }
+  }
+
+  public function setRelatedProperty($relatedKey, $key, $value, &$errorString) 
{
+
+   $key=strtolower($key);
+   $value=strtolower($value);
+  
+   if(isset(self::$relatedProperties[$key])) {
+    if(in_array($value, self::$relatedProperties[$key]["values"])) {
+     if(self::$relatedProperties[$key]["modifiable"]) {
+      if(isset($this->related[$relatedKey])) {
+       $this->related[$relatedKey]["properties"][$key]=$value;
+       return true;
+      } else {
+       $errorString="Il related indicato non esiste.";
+       return false;
+      }
+     } else {
+      $errorString="Il valore della propriet? indicata non ? modificabile.";
+      return false;
+     }
+    } else {
+     $errorString="Il valore indicato per questa propriet? non ? valido.";
+     return false;
+    }
+   } else {
+    $errorString="Non esiste questa propriet? per i related.";
+    return false;
+   }
+  }
+
+  public function addAttachment($fileName, $attachmentKey, &$errorString) {
+   if(is_file($fileName)) {
+    if($fileHandle=fopen($fileName, "r")) {
+     if(self::validContentKey($attachmentKey)) {
+      if(!isset($this->attachments[$attachmentKey])) {
+       $this->attachments[$attachmentKey]=array(
+    "fileName" => basename($fileName),
+    "properties" => array(
+        "content-type" => 
self::$attachmentProperties["content-type"]["values"][0],
+        "content-disposition" => 
self::$attachmentProperties["content-disposition"]["values"][0],
+        "content-transfer-encoding" => 
self::$attachmentProperties["content-transfer-encoding"]["values"][0]
+    ),
+    "source" => base64_encode(
+        fread($fileHandle, filesize($fileName))
+    )
+       );
+       return true;
+      } else {
+       $errorString="La chiave specificata ? gi? associata ad un altro 
allegato.";
+       return false;
+      }
+     } else {
+      $errorString="La chiave specificata per l'allegato non ? valida.";
+      return false;
+     }
+    } else {
+     $errorString="Non ? possibile aprire il file indicato.";
+     return false;
+    }
+   } else {
+    $errorString="Il nome del file indicato non ? valido.";
+    return false;
+   }
+  }
+
+  public function setAttachmentProperty($attachmentKey, $key, $value, 
&$errorString) {
+
+   $key=strtolower($key);
+   $value=strtolower($value);
+
+   if(isset(self::$attachmentProperties[$key])) {
+    if(in_array($value, self::$attachmentProperties[$key]["values"])) {
+     if(self::$attachmentProperties[$key]["modifiable"]) {
+      if(isset($this->attachments[$attachmentKey])) {
+       $this->attachments[$attachmentKey]["properties"][$key]=$value;
+       return true;
+      } else {
+       $errorString="L'allegato indicato non esiste.";
+       return false;
+      }
+     } else {
+      $errorString="Il valore della propriet? indicata non ? modificabile.";
+      return false;
+     }
+    } else {
+     $errorString="Il valore indicato per questa propriet? non ? valido.";
+     return false;
+    }
+   } else {
+    $errorString="Non esiste questa propriet? per gli allegati.";
+    return false;
+   }
+  }
+
+  public function finalize(&$errorString) {
+   if(!$this->finalized) {
+    $this->headerMessage="from: ".($this->from)."\n";
+    $this->headerMessage.="to: ".($this->to)."\n";
+    $this->headerMessage.="subject: ".($this->subject)."\n";
+    $this->headerMessage.="mime-version: 1.0\n";
+
+    if(($countAttachments=count($this->attachments))>0) {
+     $this->headerMessage.="content-type: multipart/mixed; 
boundary=\"".($this->boundaries["multipart/mixed"])."\"\n\n";
+     $this->headerMessage.=self::defaultHeaderMessage;
+     $this->headerMessage.="\n\n";
+
+     $this->bodyMessage="--".($this->boundaries["multipart/mixed"])."\n";
+
+     if(($countRelated=count($this->related))>0) {
+      $this->bodyMessage.="content-type: multipart/related; 
type=\"multipart/alternative\"; 
boundary=\"".($this->boundaries["multipart/related"])."\"\n\n";
+
+      $this->bodyMessage.="--".($this->boundaries["multipart/related"])."\n";
+
+      $this->bodyMessage.="content-type: multipart/alternative; 
boundary=\"".($this->boundaries["multipart/alternative"])."\"\n\n";
+      
$this->createMultipartAlternativeMessage($this->boundaries["multipart/alternative"]);
+      
$this->bodyMessage.="--".($this->boundaries["multipart/alternative"])."--\n\n";
+
+      // aggiungere i related e chiudere
+
+      $relatedCounter=0;
+      while(list($key,)=each($this->related)) {
+       $relatedCounter++;
+      
+       $this->bodyMessage.="--".$this->boundaries["multipart/related"]."\n";
+       $this->createMultipartRelatedMessage($key);
+       if($relatedCounter!=$countRelated) 
$this->bodyMessage.="--".($this->boundaries["multipart/related"])."\n";
+       else 
$this->bodyMessage.="--".($this->boundaries["multipart/related"])."--\n\n";
+      }
+     } else {
+      $this->bodyMessage.="content-type: multipart/alternative; 
boundary=\"".($this->boundaries["multipart/alternative"])."\"\n\n";
+      $this->createMultipartAlternativeMessage();
+      
$this->bodyMessage.="--".($this->boundaries["multipart/alternative"])."--\n\n";
+     }
+
+     $attachmentsCounter=0;
+     while(list($key,)=each($this->attachments)) {
+      $attachmentsCounter++;
+      $this->bodyMessage.="--".($this->boundaries["multipart/mixed"])."\n";
+      $this->createMultipartMixedMessage($key);
+      if($attachmentsCounter!=$countAttachments) 
$this->bodyMessage.="--".($this->boundaries["multipart/mixed"])."\n";
+      else 
$this->bodyMessage.="--".($this->boundaries["multipart/mixed"])."--\n\n";
+     }
+    } else {
+     if(($countRelated=count($this->related))>0) {
+      $this->headerMessage.="content-type: multipart/related; 
type=\"multipart/alternative\"; 
boundary=\"".($this->boundaries["multipart/related"])."\"\n\n";
+      $this->headerMessage.=self::defaultHeaderMessage;
+      $this->headerMessage.="\n\n";
+
+      $this->bodyMessage="--".($this->boundaries["multipart/related"])."\n";
+      $this->bodyMessage.="content-type: multipart/alternative; 
boundary=\"".($this->boundaries["multipart/alternative"])."\"\n\n";
+      $this->createMultipartAlternativeMessage();
+      
$this->bodyMessage.="--".($this->boundaries["multipart/alternative"])."--\n\n";
+
+      $relatedCounter=0;
+      while(list($key,)=each($this->related)) {
+       $relatedCounter++;
+       $this->bodyMessage.="--".$this->boundaries["multipart/related"]."\n";
+       $this->createMultipartRelatedMessage($key);
+       if($relatedCounter!=$countRelated) 
$this->bodyMessage.="--".($this->boundaries["multipart/related"])."\n";
+       else 
$this->bodyMessage.="--".($this->boundaries["multipart/related"])."--\n\n";
+      }
+     } else {
+      $this->headerMessage.="content-type: multipart/alternative; 
boundary=\"".($this->boundaries["multipart/alternative"])."\"\n\n";
+      $this->headerMessage.=self::defaultHeaderMessage;
+      $this->headerMessage.="\n\n";
+
+      $this->createMultipartAlternativeMessage();
+      
$this->bodyMessage.="--".($this->boundaries["multipart/alternative"])."--";
+
+     }
+    }
+    $this->finalized=true;
+    return true;
+   } else {
+    $errorString="Al momento non ? possibile finalizzare.";
+    return false;
+   }
+  }
+
+  private function createMultipartAlternativeMessage() {
+   $multipartAlternativeBoundary=$this->boundaries["multipart/alternative"];
+   $this->bodyMessage.="--$multipartAlternativeBoundary\n";
+   $this->bodyMessage.="content-type: text/plain; 
charset=\"".($this->text["properties"]["charset"])."\"\n";
+   $this->bodyMessage.="content-transfer-encoding: 
".($this->text["properties"]["content-transfer-encoding"])."\n\n";
+   $this->bodyMessage.=$this->text["message"];
+   $this->bodyMessage.="\n\n";
+   $this->bodyMessage.="--$multipartAlternativeBoundary\n";
+   $this->bodyMessage.="content-type: text/html; 
charset=\"".($this->html["properties"]["charset"])."\"\n";
+   $this->bodyMessage.="content-transfer-encoding: 
".($this->html["properties"]["content-transfer-encoding"])."\n\n";
+   $this->bodyMessage.=$this->html["message"];
+   $this->bodyMessage.="\n\n";
+  }
+
+  private function createMultipartRelatedMessage($key) {
+   $obj=$this->related[$key];
+   $this->bodyMessage.="content-type: 
".($obj["properties"]["content-type"])."; name=\"".($obj["fileName"])."\"\n";
+   $this->bodyMessage.="content-transfer-encoding: 
".($obj["properties"]["content-transfer-encoding"])."\n";
+   $this->bodyMessage.="content-id: 
<".($obj["properties"]["content-id"]).">\n\n";
+   $this->bodyMessage.=$obj["source"];
+   $this->bodyMessage.="\n\n";
+  }
+
+  private function createMultipartMixedMessage($key) {
+   $obj=$this->attachments[$key];
+   $this->bodyMessage.="content-type: 
".($obj["properties"]["content-type"])."; name=\"".($obj["fileName"])."\"\n";
+   $this->bodyMessage.="content-transfer-encoding: 
".($obj["properties"]["content-transfer-encoding"])."\n";
+   $this->bodyMessage.="content-disposition: 
".($obj["properties"]["content-disposition"])."; 
filename=\"".($obj["fileName"])."\"\n\n";
+   $this->bodyMessage.=$obj["source"];
+   $this->bodyMessage.="\n\n";
+  }
+
+  public function getSource(&$errorString) {
+   if($this->finalized) {
+    return ($this->headerMessage).($this->bodyMessage);
+   } else {
+    $errorString="Ancora non ? avvenuta la finalizzazione.";
+    return false;
+   }
+  }
+
+  public function sendMail(&$errorString) {
+   if($this->finalized) {
+    mail($this->to, $this->subject, $this->bodyMessage, $this->headerMessage);
+    $this->finalized=false;
+    return true;
+   } else {
+    $errorString="Ancora non ? avvenuta la finalizzazione.";
+    return false;
+   }
+  }
+}
+
+?>
diff --git a/test/etags/prol-src/natded.prolog 
b/test/etags/prol-src/natded.prolog
new file mode 100644
index 0000000..f0ee6b4
--- /dev/null
+++ b/test/etags/prol-src/natded.prolog
@@ -0,0 +1,1545 @@
+% $Id: natded.pl,v 1.7 2001/04/26 12:22:56 geertk Exp geertk $
+% NATURAL DEDUCTION CG PARSER WITH SEMANTICS
+% ========================================================================= 
+% Bob CARPENTER
+% Computational Linguistics Program, Department of Philosophy
+% Carnegie Mellon University, Pittsburgh, PA  15213
+% Net: address@hidden  
+% Voice: (412) 268-8043      Fax: (412) 268-1440
+
+% Copyright 1995, Bob Carpenter
+
+% Written: 12 March 1993
+% Revised: 4 February 1994
+% Further Revised: 2 May 1994
+% Revised for CGI: 16 November 1995
+% Revised for Lambek notation: ? Novemeber 1995
+% Revised again: 30 November 1995
+
+
+% Library Includes
+% ========================================================================= 
+
+:- use_module(library(system)).
+% :- use_module(library(random)).
+
+
+% Data Types
+% ========================================================================= 
+
+% <lambda_term> ::=  <lambda_var>
+%                 |  <lambda_con>
+%                 |  <lambda_term>@<lambda_term>
+%                 |  <lambda_var>^<lambda_term>
+
+% <lambda_var> ::= var(<prolog_var>)
+
+% <lambda_con> ::= con(<prolog_atom>)
+
+% <tree> ::= tree(<rule>,<cat>,<list(<tree>)>)
+%          | ass(<syn>,<var>,<index>)
+%          | leaf(<word>)
+
+% <rule> ::= <prolog_atom>
+
+% <cat> ::= <syn> : <lambda_term>
+
+% <syn> ::= <basic_syn>
+%         | <syn> / <syn>  |  <syn> \ <syn> 
+%         | scop(<syn>,<syn>) 
+%         | <syn> - <syn>
+
+% <basic_syn> ::= bas(<prolog_term>)
+
+% <grammar> ::= <sequence(<lex_entry>)> 
+%               <sequence(<empty_category>)>
+%               <sequence(<grammar_rule>)>
+
+% <lex_entry> ::=  <word> ==> <cat>.
+
+% <empty_category> ::= empty <cat>.
+
+% <grammar_rule> ::= <cat> ===> <list(<cat>)> if <prolog_goal>.
+
+% <index> ::= <integer>
+
+% <word> ::= <prolog_atom>
+
+% <chart_edge> ::= edge(<int>, <int>, <cat>)
+
+% Operator Declarations
+% ========================================================================= 
+
+  :-op(150,yfx,@).      % function application
+% :-op(200,xfy,^).      % lambda abstraction
+% :-op(400,yfx,/).      % forward slash
+  :-op(350,yfx,\).      % backward slash
+  :-op(500,xfx,:).      % category constructor
+  :-op(600,xfx,==>).    % lexical rewriting
+  :-op(600,xfx,===>).   % grammar rule
+  :-op(600,fx,empty).   % empty categories
+  :- op(600,xfx,macro). % lexical macros
+  :- op(600,xfx,means). % meaning postulates
+  :-op(1200,xfx,if).    % conditions on rule schemes
+
+:- dynamic edge/3.
+:- dynamic emptyedge/1.
+:- dynamic active/3.
+
+
+
+
+% Lambda Calculus
+% ========================================================================= 
+
+% expandmng(+M:<term>, -MExp:<term>)
+% ----------------------------------------------------------------------
+% MExp is the result of recursively replacing constants with their
+% definitions in M; disallows non-determinism
+% ----------------------------------------------------------------------
+expandmng(var(V),var(V)).
+expandmng(con(C),MExp):-
+  con(C) means M, !,
+  expandmng(M,MExp).
+expandmng(con(C),con(C)).
+expandmng(V^M,V^MExp):-
+  expandmng(M,MExp).
+expandmng(address@hidden,address@hidden):-
+  expandmng(M,MExp),
+  expandmng(N,NExp).
+
+
+% normalize(+M:<term>, -MNorm:<term>)
+% ----------------------------------------------------------------------
+% MNorm is the normal form of M; all bound variables renamed
+% ----------------------------------------------------------------------
+normalize(M,MNorm):-
+  fresh_vars(M,MFr),
+  normalize_fresh(MFr,MNorm).
+
+% fresh_vars(+M:<term>, -MFr:<term>)
+% ----------------------------------------------------------------------
+% MFr is the result of renaming all bound variables
+% in M to fresh instances, using alpha-reduction
+% ----------------------------------------------------------------------
+fresh_vars(var(V),var(V)).
+fresh_vars(con(C),con(C)).
+fresh_vars(address@hidden,address@hidden):-
+  fresh_vars(M,MFr),
+  fresh_vars(N,NFr).
+fresh_vars(X^M,var(Y)^MFr):-
+  subst(M,X,var(Y),M2),
+  fresh_vars(M2,MFr).
+
+% substitute(+M:<term>, +X:<var>, +N:<term>, -L:<term>)
+% ----------------------------------------------------------------------
+% L = M[X |--> N]
+% ----------------------------------------------------------------------
+subst(var(Y),var(X),M,N):-
+  ( X == Y
+    -> N=M
+  ; N = var(Y)
+  ).
+subst(con(C),_,_,con(C)).
+subst(address@hidden,X,N,address@hidden):-
+  subst(M,X,N,M2),
+  subst(L,X,N,L2).
+subst(Y^M,X,N,Y^M2):-
+  ( Y == X
+    -> M2 = M
+  ; subst(M,X,N,M2)
+  ).
+
+% normalize_fresh(+M:<term>, -N:<term>)
+% ----------------------------------------------------------------------
+% M is normalized to N 
+% -- all bound variables are made fresh
+% -- cut corresponds to leftmost normalization
+% ----------------------------------------------------------------------
+normalize_fresh(M,N):-
+  reduce_subterm(M,L),
+  !, normalize_fresh(L,N).
+normalize_fresh(M,M).
+
+% reduce_subterm(+M:<term>, -N:<term>)
+% ----------------------------------------------------------------------
+% N is the result of performing one beta- or 
+% eta-reduction on some subterm of M;
+% -- reduces leftmost subterm first, but provides 
+%    all reductions on backtracking
+% ----------------------------------------------------------------------
+reduce_subterm(M,M2):-
+  reduce(M,M2).
+reduce_subterm(address@hidden,address@hidden):-
+  reduce_subterm(M,M2).
+reduce_subterm(address@hidden,address@hidden):-
+  reduce_subterm(N,N2).
+reduce_subterm(X^M,X^N):-
+  reduce_subterm(M,N).
+
+% reduce(+M:<term>, -N:<term>)
+% ----------------------------------------------------------------------
+% reduces M to N using beta- or eta-reduction
+% -- assumes no variable clashes
+% ----------------------------------------------------------------------
+reduce((X^M)@N,L):-     % beta reduction
+  subst(M,X,N,L).
+reduce(X^(address@hidden),M):-     % eta reduction
+  X == Y,
+  \+ ( free_var(M,Z),
+       Z == X ).
+
+% free_var(+M:<term>, -X:<var>)
+% ----------------------------------------------------------------------
+% X is free in M
+% ----------------------------------------------------------------------
+free_var(var(V),var(V)).
+free_var(address@hidden,X):-
+  ( free_var(M,X)
+  ; free_var(N,X)
+  ).
+free_var(X^M,Y):-
+  free_var(M,Y),
+  Y \== X.
+
+% free_for(+N:<term>, +X:<var>, +M:<term>)
+% ----------------------------------------------------------------------
+% M is free for X in N
+% ----------------------------------------------------------------------
+free_for(var(_),_,_).
+free_for(con(_),_,_).
+free_for(address@hidden,X,M):-
+  free_for(L,X,M),
+  free_for(K,X,M).
+free_for(Y^L,X,M):-
+  free_for(L,X,M),
+  ( \+ free_var(L,X)
+  ; \+ free_var(M,Y)
+  ).
+
+
+% Right-Left, Bottom-Up Dynamic Chart Parser (after ALE)
+% =========================================================================
+
+% Lexical Compiler
+% ----------------------------------------------------------------------
+
+% compile_lex(+File:<file>)
+% ----------------------------------------------------------------------
+% compiles lexical entries into file 
+% ----------------------------------------------------------------------
+compile_lex(File):-
+  tell(File),
+  write('% Lexical Entries'), nl,
+  write('% ---------------'), nl, nl,
+  lex(W,Syn,Sem),
+  numbervars(lexentry(W,Syn,Sem),0,_),
+  write('lexentry(\''), write(W), write('\','),
+  write(Syn),write(','), write(Sem), write(').'), nl,
+  fail.
+compile_lex(File):-
+  told,
+  compile(File).
+
+% consult_lex  
+% ----------------------------------------------------------------------
+% consults lexicon in place
+% ----------------------------------------------------------------------
+consult_lex:-
+  retractall(lexentry(_,_,_)),
+  lex(W,Syn,Sem),
+  assert(lexentry(W,Syn,Sem)),
+  fail.
+consult_lex.
+
+% lex(?W:<word>, ?Syn:<syn>, ?Sem:<lambda_term>)
+% ----------------------------------------------------------------------
+% word W has syntactic category Syn and smenantic term Sem
+% ----------------------------------------------------------------------
+lex(W,SynOut,Sem):-
+  W ==> Syn : Sem,
+  expandsyn(Syn,SynOut).
+
+% expandsyn(+SynIn:<syn>, ?SynOut:<syn>)
+% ----------------------------------------------------------------------
+% the category SynIn is macro expanded recursively to SynOut 
+% ----------------------------------------------------------------------
+expandsyn(Syn,Syn):-
+  var(Syn), !.
+expandsyn(SynIn,SynOut):-
+  macro(SynIn,SynMid),   % cut means unique macro expansion
+  !, expandsyn(SynMid,SynOut).
+expandsyn(Syn1/Syn2,Syn1Out/Syn2Out):-
+  !, expandsyn(Syn1,Syn1Out), 
+  expandsyn(Syn2,Syn2Out).
+expandsyn(Syn1\Syn2,Syn1Out\Syn2Out):-
+  !, expandsyn(Syn1,Syn1Out), 
+  expandsyn(Syn2,Syn2Out).
+expandsyn(Syn1-Syn2,Syn1Out-Syn2Out):-
+  !, expandsyn(Syn1,Syn1Out), 
+  expandsyn(Syn2,Syn2Out).
+expandsyn(q(Syn1,Syn2,Syn3),q(Syn1Out,Syn2Out,Syn3Out)):-
+  !, expandsyn(Syn1,Syn1Out), 
+  expandsyn(Syn2,Syn2Out),
+  expandsyn(Syn3,Syn3Out).
+expandsyn(Syn,Syn):-
+  bas_syn(Syn).
+
+% bas_syn(?Syn:<syn>)
+% ----------------------------------------------------------------------
+% Syn is a basic syntactic category
+% ----------------------------------------------------------------------
+bas_syn(n(_)).
+bas_syn(np(_,_)).
+bas_syn(s(_)).
+bas_syn(coor).
+bas_syn(sc(_)).
+bas_syn(ex(_)).
+
+
+
+
+% Empty Edge Compilation
+% ----------------------------------------------------------------------
+
+% compile_empty
+% ----------------------------------------------------------------------
+% compiles empty categories, asserting all active and inactive edges
+% they can produce by themselves; always succeeds
+% ----------------------------------------------------------------------
+compile_empty:-
+  retractall(emptyedge(_)), retractall(active(_,_,_)),
+  empty SynIn:Sem,
+  expandsyn(SynIn,Syn),
+  complete(cat(Syn,Sem,[],[],empty(Syn,Sem))).
+compile_empty:-
+  bagof(C,emptyedge(C),Cs),
+  length(Cs,N),  
+  nl, write(N), write(' complete empty edges'), nl,
+  bagof(D-Ds,G^active(Ds,D,G),Es),
+  length(Es,M),  
+  write(M), write(' active rules with empty starts'), nl.
+
+% complete_cat(Cat:+<cat>)
+% ----------------------------------------------------------------------
+% Cat is asserted as empty, and all current active edges are tested to
+% see if Cat can extend them; fails for looping
+% ----------------------------------------------------------------------
+complete(Cat):-
+  assert(emptyedge(Cat)),
+  ( (CatM ===> [Cat|Cats] if Goal)
+  ; active(CatM,[Cat|Cats],Goal)
+  ),
+  add_active(Cats,CatM,Goal).
+
+% add_active(Cats:+<list(<cat>)>, +Cat:<cat>, +Goal:<goal>)
+% ----------------------------------------------------------------------
+% the active edge Cat --> . Cats is asserted, and any extensions
+% computed and themselves asserted;  fails for looping
+% ----------------------------------------------------------------------
+add_active([],Cat,Goal):-
+  call(Goal),
+  assert(emptyedge(Cat)),
+  complete(Cat).
+add_active([Cat|Cats],CatM,Goal):-
+  assert(active([Cat|Cats],CatM,Goal)),
+  emptyedge(Cat),
+  add_active(Cats,CatM,Goal).
+
+% parse(Ws:+<list(<word>)>, Cat:?<cat>)
+% ----------------------------------------------------------------------
+% Cat can be derived from Ws
+% ----------------------------------------------------------------------
+parse(Ws,Cat):-
+  derived_analyses(Ws,WsMid),
+  retractall(edge(_,_,_)),
+  reverse(WsMid,[],WsRev),
+  build(WsRev,0,Length),
+  edge(Length,0,Cat).
+
+% derived_analyses(WsIn:+<list(<word>)>, WsOut:-<list(<word>)>)
+% ----------------------------------------------------------------------
+% computes subderivations of WsIn
+% ----------------------------------------------------------------------
+derived_analyses([],[]).
+derived_analyses([der(Ws)|Ws2],[der(Ws,Ass,Syn,Sem)|DerWs2]):-
+  !, parse(Ws,cat(Syn,Sem,Ass,[],_)),
+  \+ member(abs(_,_,_),Ass),
+  derived_analyses(Ws2,DerWs2).
+derived_analyses([W|Ws],[W|DerWs]):-
+  derived_analyses(Ws,DerWs).
+
+% build(Ws:+<list(<word>)>, Right:+<int>, Left:-<int>)
+% ----------------------------------------------------------------------
+% finishes building chart with Ws as remaing word, starting from
+% right position Right and finishing on left position Left
+%      -- counts backwards, so Left > Right
+% ----------------------------------------------------------------------
+build([],Left,Left).
+build([W|Ws],Right,FinalLeft):-
+  RightPlus1 is Right+1,
+  ( buildact(W,Right,RightPlus1)
+  ; build(Ws,RightPlus1,FinalLeft)
+  ).
+
+% build_act(+W:<inputword>, +Left:<int>, +Right:<int>)
+% ----------------------------------------------------------------------
+% take action basedon whether input W is:
+%       [SynCat]     assume hypothetical category with syntax SynCat
+%       der(WsSub,Ass,Syn,Sem)  add derived result
+%       W            treat as input word
+% ----------------------------------------------------------------------
+buildact([SynIn],Right,RightPlus1):-
+  mapsyn(SynIn,Syn),   % add unspecified features
+  !,     add_edge(RightPlus1,Right,cat(Syn,var(X),[abs(Syn,var(X),N)],[],
+                                  ass(Syn,var(X),N))).
+buildact(der(WsSub,Ass,Syn,Sem),Right,RightPlus1):-
+  !,  add_edge(RightPlus1,Right,cat(Syn,Sem,Ass,[],
+                                  tree(der,Syn:Sem,[ders(WsSub)]))).
+buildact(W,Right,RightPlus1):-
+  lexentry(W,Syn,Sem),
+  add_edge(RightPlus1,Right,cat(Syn,Sem,[l],[],tree(lex,Syn:Sem,[leaf(W)]))).
+buildact(W,_,_):-
+    \+ (W ==> _), 
+    nl, write('Input not recognized: '), write(W), write('<br>').
+
+% mapsyn(+SynCat:<syncat>, -SynCatOut:<syncat)
+% ----------------------------------------------------------------------
+% SynCatOut is result of adding default features to subcategories of
+% SynCat if any are missing;  allows [SynCat] to specify cats without 
+% features for input;  ones with features will be passed along
+% ----------------------------------------------------------------------
+mapsyn(A/B,AM/BM):-
+  mapsyn(A,AM), mapsyn(B,BM).
+mapsyn(A\B,AM\BM):-
+  mapsyn(A,AM), mapsyn(B,BM).
+mapsyn(A-B,AM-BM):-
+  mapsyn(A,AM), mapsyn(B,BM).
+mapsyn(scop(A,B),scop(AM,BM)):-
+  mapsyn(A,AM), mapsyn(B,BM).
+mapsyn(q(A,B,C),q(AM,BM,CM)):-
+  mapsyn(A,AM), mapsyn(B,BM), mapsyn(C,CM).
+mapsyn(s,s(_)).
+mapsyn(n,n(ind(sng))).
+mapsyn(np,np(ind(sng),nm(_))).
+mapsyn(np(X,Y),np(X,Y)).
+mapsyn(n(X),n(X)).
+mapsyn(s(X),s(X)).
+
+% add_edge(Left:+<int>, Right:+<int>, Cat:+<cat>)
+% ----------------------------------------------------------------------
+% asserts edge into chart and then tries to extend it in all possible ways
+%     -- always fails to force backgracking
+% ----------------------------------------------------------------------
+add_edge(Left,Right,Cat):-
+  asserta(edge(Left,Right,Cat)),
+  ( (MotherCat ===> [Cat|Cats] if Goal)
+  ; active([Cat|Cats],MotherCat,Goal)
+  ),
+  findcats(Cats,Right,NewRight),
+  call(Goal),
+  add_edge(Left,NewRight,MotherCat).
+
+% findcats(Left:+<int>, Cats:+<cats>, Right:-<int>)
+% ----------------------------------------------------------------------
+% Cats is a list of categories spanning Left to Right
+% ----------------------------------------------------------------------
+findcats([],Left,Left).
+findcats([Cat|Cats],Left,Right):-
+  ( edge(Left,Mid,Cat),
+    findcats(Cats,Mid,Right)
+  ; emptyedge(Cat),
+    findcats(Cats,Left,Right)
+  ).
+
+% edge(Left:?<nat>, Right:?<nat>, Cat:?<cat>)                     (dynamic)
+% ----------------------------------------------------------------------
+% There is an edge with category Cat from Left to Right;
+% ----------------------------------------------------------------------
+
+% normalize_tree(+TreeIn:<tree>, -TreeOut:<tree>)
+% ----------------------------------------------------------------------
+% TreeOut is isomorphic to TreeIn, with normalized semantics at
+% every node
+% ----------------------------------------------------------------------
+normalize_tree(tree(Rule,Syn:Sem,Trees),
+               tree(Rule,Syn:SemNorm,TreesNorm)):-
+  normalize_fresh(Sem,SemNorm),
+  normalize_trees(Trees,TreesNorm).
+normalize_tree(ass(Syn,Var,Index),ass(Syn,Var,Index)).
+normalize_tree(leaf(Word),leaf(Word)).
+normalize_tree(ders(Word),ders(Word)).
+normalize_tree(empty(Syn,Sem),empty(Syn,SemNorm)):-
+  normalize_fresh(Sem,SemNorm).
+
+normalize_trees([],[]).
+normalize_trees([T|Ts],[TNorm|TsNorm]):-
+  normalize_tree(T,TNorm),
+  normalize_trees(Ts,TsNorm).
+
+
+% expandmng_tree(+TreeIn:<tree>, -TreeOut:<tree>)
+% ----------------------------------------------------------------------
+% TreeOut is isomorphic to TreeIn, with expanded semantics
+% every node
+% ----------------------------------------------------------------------
+expandmng_tree(tree(Rule,Syn:Sem,Trees),
+               tree(Rule,Syn:SemNorm,TreesNorm)):-
+  expandmng(Sem,SemNorm),
+  expandmng_trees(Trees,TreesNorm).
+expandmng_tree(ass(Syn,Var,Index),ass(Syn,Var,Index)).
+expandmng_tree(leaf(Word),leaf(Word)).
+expandmng_tree(ders(Word),ders(Word)).
+expandmng_tree(empty(Syn,Sem),empty(Syn,SemNorm)):-
+  expandmng(Sem,SemNorm).
+
+expandmng_trees([],[]).
+expandmng_trees([T|Ts],[TExp|TsExp]):-
+  expandmng_tree(T,TExp),
+  expandmng_trees(Ts,TsExp).
+
+
+% Grammar Rules
+% ========================================================================= 
+
+% C:<-cat> ===> Cs:<+list(<cat>)>
+% ----------------------------------------------------------------------
+% C can be composed of Cs; may be conditions
+
+% / elimination
+% -------------
+cat(A, address@hidden, Ass3, Qs3, tree(fe,A:address@hidden,[T1,T2]))
+===>
+[ cat(A/B, Alpha, Ass1, Qs1, T1),
+  cat(B, Beta, Ass2, Qs2, T2)
+] if
+     append(Ass1,Ass2,Ass3),
+     append(Qs1,Qs2,Qs3).
+
+% \ elimination
+% -------------
+cat(A, address@hidden, Ass3, Qs3, tree(be,A:address@hidden,[T1,T2]))
+===>
+[ cat(B, Beta, Ass1, Qs1, T1),
+  cat(B\A, Alpha, Ass2, Qs2, T2)
+] if
+     append(Ass1,Ass2,Ass3),
+     append(Qs1,Qs2,Qs3).
+
+% \ introduction
+% --------------
+cat(B\A, X^Alpha, Ass, Qs, tree(bi(N),B\A:X^Alpha,[T1]))
+===>
+[  cat(A, Alpha, [abs(B,X,N)|Ass], Qs, T1)
+] if
+    \+ T1 = tree(be,_,[_,ass(_,_,N)]),   % normal
+    at_least_one_member(l,Ass),  % non-empty condition
+     \+ ( subtree(tree(AssumeM,_,Ts),T1),      % properly nested
+          member(TMid,Ts), 
+          subtree(ass(_,_,'$VAR'(J)),TMid), 
+          J == N,
+          hypothetical_mem(AssumeM,Ass,Qs) ).
+
+% / introduction
+% --------------
+cat(A/B, X^Alpha, Ass2, Qs, tree(fi(N),A/B:X^Alpha,[T1]))
+===>
+[ cat(A,Alpha,Ass1,Qs,T1)
+] if
+     \+ T1 = tree(fe,_,[_,ass(_,_,N)]),    % normal
+     at_least_one_member(l,Ass1), % non-empty condition
+     select_last(Ass1,abs(B,X,N),Ass2),
+     \+ ( subtree(tree(AssumeM,_,Ts),T1),   % properly nested
+          member(TMid,Ts), 
+          subtree(ass(_,_,'$VAR'(J)),TMid), 
+          J == N,
+          hypothetical_mem(AssumeM,Ass1,Qs) ).
+
+% - introduction
+% --------------
+cat(A-B, X^Alpha, Ass2, Qs, tree(gi(N),(A-B):X^Alpha,[T1]))
+===>
+[ cat(A, Alpha, Ass1, Qs, T1)
+] if
+     at_least_one_member(l,Ass1),  % non-empty condition
+     select(abs(B,X,N),Ass1,Ass2),
+     \+ ( subtree(tree(AssumeM,_,Ts),T1),  % normalized?
+          member(TMid,Ts), 
+          subtree(ass(_,_,'$VAR'(J)),TMid), 
+          J == N,
+          hypothetical_mem(AssumeM,Ass1,Qs) ).
+
+
+% q quantifier pushing (q-elimination part 1)
+% ----------------------------------------------------------------------
+cat(C, var(X), Ass, [gq(B,A,Q,var(X),N)|Qs],
+          tree(qqpush(N),C:var(X),[T1]))
+===>
+[ cat(q(C,B,A), Q, Ass, Qs, T1)
+] if
+  \+ T1 = tree(qqi,_,_).     % normal
+
+% q quantifier popping (q-elimination part 2)
+% ----------------------------------------------------------------------
+cat(A, Q@(X^Alpha), Ass, Qs2, tree(qqpop(N),A:Q@(X^Alpha),[T1]))
+===>
+[ cat(B,Alpha,Ass,Qs1,T1)
+] if
+     select(gq(B,A,Q,X,N),Qs1,Qs2),
+     \+ ( subtree(tree(AssumeM,_,Ts),T1),
+          member(TMid,Ts), 
+          subtree(tree(qqpush(J),_,_),TMid), 
+          J == N,
+          hypothetical_mem(AssumeM,Ass,Qs1) ).
+
+% q quantifier introduction [restricted to q(np,s,s)]
+% ----------------------------------------------------------------------
+% restricted to A = s(_), B=np case for termination
+cat(q(np(ind(Num),Case),s(VF),s(VF)), var(P)^(var(P)@Alpha), Ass, Qs1,
+    tree(qqi,q(np(ind(Num),Case),s(VF),s(VF)):var(P)^var(P)@Alpha,[T1]))
+===>
+[ cat(np(ind(Num),Case),Alpha,Ass,Qs1,T1) 
+] if 
+  true.
+
+% coordination elimination
+% ----------------------------------------------------------------------
+cat(C, Sem, [], [], tree(coel,C:Sem,[T1,T2,T3]))
+===>
+[ cat(C, Sem1, Ass1, [], T1),
+  cat(coor, Alpha, Ass2, [],T2),
+  cat(C, Sem2, Ass3, [], T3)
+] if
+     \+ member(abs(_,_,_),Ass1),        % coordination condition
+     \+ member(abs(_,_,_),Ass2),
+     \+ member(abs(_,_,_),Ass3),
+     \+ T1 = tree(coel,_,_),
+     \+ T2 = tree(coel,_,_),
+     make_coor(C,Alpha,Sem1,Sem2,Sem).
+
+% non-boolean coordination
+% ----------------------------------------------------------------------
+%cat(np(pl,-), con(union)@address@hidden, [], [],
+%    tree(nbc,np(pl,-):con(union)@address@hidden,[T1,T2,T3]))
+%===>
+%[ cat(NP1, Alpha1, Ass1, [], T1),
+%  cat(coor, nbc, Ass2, [],T2),
+%  cat(NP3, Alpha3, Ass3, [], T3)
+% ]:-  
+%      \+ member(abs(_,_,_),Ass1),        % coordination condition
+%      \+ member(abs(_,_,_),Ass2),
+%      \+ member(abs(_,_,_),Ass3),
+%      make_nb_coor(NP1,Alpha1,Alpha1P),
+%      make_nb_coor(NP3,Alpha3,Alpha3P).
+% 
+% make_nb_coor(np,Alpha,con(singleton)@Alpha).
+% make_nb_coor(np(pl,+),Alpha,con(singleton)@Alpha).
+% make_nb_coor(np(pl,-),Alpha,Alpha).
+
+
+% subtree(-TSub:<tree>, +T:<tree>)
+% ----------------------------------------------------------------------
+% TSub is a subtree of T
+% ----------------------------------------------------------------------
+subtree(T,T).
+subtree(T,tree(_,_,Ts)):-
+  member(T2,Ts),
+  subtree(T,T2).
+
+% hypothetical_mem(Rule,Assumptions,Qs)
+% ----------------------------------------------------------------------
+% Rule is a member of the assumptions
+% ----------------------------------------------------------------------
+hypothetical_mem(fi(N),Ass,_):-
+  member(abs(_,_,M),Ass), N == M.
+hypothetical_mem(bi(N),Ass,_):-
+  member(abs(_,_,M),Ass), N == M.
+hypothetical_mem(gi(N),Ass,_):-
+  member(abs(_,_,M),Ass), N == M.
+hypothetical_mem(qqpush(N),_,Qs):-
+  member(gq(_,_,_,_,M),Qs), N == M.
+
+% make_coor(Cat,CoorSem,Sem1,Sem2,SemOut)
+% ----------------------------------------------------------------------
+% generalized coordination semantics CoorSem is applied to
+% Sem1 and Sem2 of type Cat, with result SemOut
+% ----------------------------------------------------------------------
+make_coor(s(_),Alpha,Sem1,Sem2,address@hidden@Sem2).
+make_coor(n(_),Alpha,Sem1,Sem2,var(X)^Alpha@(address@hidden(X))@(address@hidden(X))).
+make_coor(A/_,Alpha,Sem1,Sem2,var(X)^Sem):-
+  make_coor(A,Alpha,address@hidden(X),address@hidden(X),Sem).
+make_coor(_\A,Alpha,Sem1,Sem2,var(X)^Sem):-
+  make_coor(A,Alpha,address@hidden(X),address@hidden(X),Sem).
+make_coor(A-_,Alpha,Sem1,Sem2,var(X)^Sem):-
+  make_coor(A,Alpha,address@hidden(X),address@hidden(X),Sem).
+make_coor(q(_,_,A),Alpha,Sem1,Sem2,var(X)^Sem):-
+  make_coor(A,Alpha,address@hidden(X),address@hidden(X),Sem).
+
+
+% General CGI Handling
+% ========================================================================= 
+
+% start_up
+% ----------------------------------------------------------------------
+% executed when saved state is restarted;
+% tokenizes, parses and sends off input for handling;
+% halts on termination
+% ----------------------------------------------------------------------
+start_up:-
+%    getenv('QUERY_STRING', Arg),
+    prolog_flag(argv,[Arg]),
+
+                            %           write('<p>'), write(Arg), nl, ttyflush,
+  ( tokenizeatom(Arg,TokenList)
+        %                               ,write('<p>'), write(TokenList), 
ttyflush
+  ; write('Input '), write(Arg), write(' could not be tokenized'), ttyflush, 
halt
+  ),
+  ( parse_cgi(TokenList,KeyVals)
+         %                              , write('<p>'), write(KeyVals), 
ttyflush
+  ; write('Tokens '), write(TokenList), write(' could not be parsed'), halt
+  ),
+  ( action(KeyVals)
+  ; told, write('Action '), write(KeyVals), write(' could not be executed')
+  ),
+  halt.
+
+% tokenizeatom(+Input:<atom>, -Tokens:<list(<token>)>)  
+% ----------------------------------------------------------------------
+% breaks input Input into list of tokens;  
+% ----------------------------------------------------------------------
+tokenizeatom(Atom,Ws):-
+  name(Atom,Cs),
+  tokenize(Cs,Xs-Xs,Ws).
+ 
+% tokenize(+Chars:<list(<char>)>, +CharsSoFar:<d_list(<char>)>,
+%          -Tokens:<list(<token>)>)
+% ----------------------------------------------------------------------
+% Tokens is the list of tokens retrieved from Chars; ChrsSoFar 
+% accumulates prefixes of atoms being recognized
+% ----------------------------------------------------------------------
+tokenize([C1,C2,C3|Cs],Xs-Ys,TsResult):-     % special symbol
+  name('%',[C1]),
+  specialsymbol(C2,C3,SpecialSymbol),
+  !, 
+  ( Xs = []
+    -> TsResult = [SpecialSymbol|TsOut]
+  ; Ys = [],
+    name(CsAtom,Xs),
+    TsResult = [CsAtom,SpecialSymbol|TsOut]
+  ), 
+  tokenize(Cs,Zs-Zs,TsOut).
+tokenize([C|Cs],Xs-Ys,TsResult):-           % one-character operator
+  isoperator(C),
+  !, name(OpToken,[C]),
+  ( Xs = []
+    -> TsResult = [OpToken|Ts]
+  ; Ys = [],
+    name(CsAtom,Xs),
+    TsResult = [CsAtom,OpToken|Ts]
+  ),
+  tokenize(Cs,Zs-Zs,Ts).
+tokenize([C|Cs],Xs-[C|Ys],Ts):-             % more of string
+  tokenize(Cs,Xs-Ys,Ts).
+tokenize([],Xs-_,[]):-                      % no more input; nothing accum.
+  Xs = [], !.
+tokenize([],Xs-[],[CsAtom]):-               % no more input; stringg accum.
+  name(CsAtom,Xs).
+
+% isoperator(+Char:<char>)
+% ----------------------------------------------------------------------
+% Char is the name of an operator character
+% ----------------------------------------------------------------------
+isoperator(Char):-
+  name(Op,[Char]),
+  isoptab(Op).
+
+isoptab('%').
+isoptab('+').
+isoptab('&').
+isoptab('=').
+
+% specialsymbol(+C1:<char>, +C2:<char>, -S:<token>)
+% ----------------------------------------------------------------------
+% C1 and C2 are the names of characters completing a % special symbol
+% ----------------------------------------------------------------------
+specialsymbol(C1,C2,S):-
+  name(N1,[C1]), name(N2,[C2]),
+  ( sstab(N1,N2,S), !
+  ; S = spec(N1,N2)
+  ).
+
+sstab(2,'C',',').
+sstab(2,'F','/').
+sstab(2,8,'(').
+sstab(2,9,')').
+sstab(5,'B','[').
+sstab(5,'C','\\').
+sstab(5,'D',']').
+sstab(3,'D','=').
+sstab(3,'E','>').
+
+
+% parse_cgi(+TokenList:<list(<token>)>, -KeyVals:<list(<keyval>)>)
+% ----------------------------------------------------------------------
+% KeyVals is Key/Val list resulting from parsing TokenList using
+% the compiled DCG to perform a top-down parse
+% ----------------------------------------------------------------------
+parse_cgi(TokenList,KeyVals):-
+    keyvalseq(KeyVals,TokenList,[]).
+
+% Grammar for Parser
+% ----------------------------------------------------------------------
+keyvalseq([KeyVal|KeyVals]) --> 
+   keyval(KeyVal), andkeyvalseq(KeyVals). 
+keyvalseq([]) --> [].
+
+andkeyvalseq(KeyVals) --> ['&'], keyvalseq(KeyVals).
+andkeyvalseq([]) --> [].
+
+keyval(key(Key,Val)) --> [Key,'='], valseq(Val).
+
+% valseq(rec(Ws,Cat)) --> valseq(Ws), as(Cat).
+
+% as('$ANY') --> [].
+% as(Cat) --> optplus, ['=','>'], optplus, val(Cat).
+
+% valseq([]) --> [].   % subsumed by plusvalseq([]) --> []
+valseq([Val|Vals]) --> val(Val), plusvalseq(Vals).
+valseq(Vals) --> plusvalseq(Vals).
+
+plusvalseq([]) --> [].
+plusvalseq(Vals) --> ['+'], valseq(Vals).
+
+optplus --> [].
+optplus --> ['+'].
+
+val(X) --> ['['], valseq(X), [']'].
+val(der(X)) --> [der,'('], valseq(X), [')'].
+val(X) --> atomval(X).
+val(X/Y) --> atomval(X), ['/'], atomval(Y).
+val(Y\X) --> atomval(Y), ['\\'], atomval(X).
+val(X-Y) --> atomval(Y), ['-'], atomval(X).
+val(Term) --> atom(Fun), ['('], argvals(Args), [')'],   {Term =.. [Fun|Args]}.
+
+argvals([]) --> [].
+argvals([Arg|Args]) -->
+  val(Arg), commaargvals(Args).
+
+commaargvals(Args) -->
+  [','], argvals(Args).
+commaargvals([]) -->
+  [].
+
+atomval(X) --> atom(X).
+atomval(X) --> ['('], val(X), [')'].
+
+atom(X) --> [X], {atomic(X)}.
+
+
+% Specific CGI Query Handling
+% ========================================================================= 
+
+% action(+KeyVals:<list(<keyval>)>)
+% ----------------------------------------------------------------------
+% take an action based on list of KeyVals
+% ----------------------------------------------------------------------
+action(KeyVals):-
+    retractall(keyvalscgi(_)),
+    assert(keyvalscgi(KeyVals)),
+    member(key(inputfrom,[InputFrom]),KeyVals),
+    ( InputFrom = 'Typing'
+      -> member(key(parsestringone,Ws),KeyVals)
+    ; InputFrom = 'Corpus' 
+      -> member(key(parsestringtwo,Ws),KeyVals)
+    ), 
+%                                 write('<p>'), write(Ws), nl,
+    nl, write('P<font size=-1>ARSE</font> R<font size=-1>ESULTS FOR:</font> 
<cite>'),
+    writelist(Ws),
+    write('</cite><br><br>'), nl,
+    member(key(outputform,[OutForm]),KeyVals),
+    member(key(outputsyn,OutSynSym),KeyVals),
+    outsyn(OutSynSym,OutSyn),
+    act(OutForm,OutSyn,Ws).
+  
+keyvalcgi(Key,Val):-
+keyvalscgi(KeyVals),
+  member(key(Key,Val),KeyVals).  
+
+outsyn(['Any'],_).
+outsyn(['Finite','S'],s(fin)).
+outsyn(['Noun','Phrase'],np(_,_)).
+
+% act(+Form:<form>, ?Syn:<syn>, +Ws:<list(<word>)>)
+% ----------------------------------------------------------------------
+% the input Ws is parsed and output in form Form;
+% ----------------------------------------------------------------------
+act(OutForm,OutSyn,Ws):-
+    findall(Tree, ( parse(Ws,cat(OutSyn,_,Ass,[],Tree)),
+                   \+ member(abs(_,_,_),Ass) ),     Trees),  % all parses
+    ( Trees = [],
+      !, write('<BR> No Parses Found')                       % none found
+    ; ( keyvalcgi(expandmng,['Yes']),
+        !, expandmng_trees(Trees,Trees2)
+      ; Trees2 = Trees
+      ),
+      ( keyvalcgi(normalize,['Yes']),
+        !, normalize_trees(Trees2,Trees3)
+      ; Trees3 = Trees2
+      ),
+        write('parse('),
+        write_term(Ws,[quoted(true)]),
+        write(',Cat).<br>'), nl,
+      actout(OutForm,Trees3)
+   ).
+
+
+
+% actout(+Form:<form>, +Ts:<list(<tree>)>)
+% ----------------------------------------------------------------------
+% return output for list of trees Ts in form Form
+% ----------------------------------------------------------------------
+actout('Text',Trees):-
+  write('<PRE>'), nl,  
+  texttreelist(Trees),
+  nl, write('</PRE>').
+actout('Prawitz',Ts):-
+  htmltreelist(Ts).  
+actout('Fitch',Ts):-
+  fitchtreelist(Ts).
+
+
+
+texttreelist([]).
+texttreelist([T|Ts]):-
+  pp_tree(T),
+  nl, write('<BR>'), nl,
+  texttreelist(Ts).
+
+htmltreelist([]).
+htmltreelist([T|Ts]):-
+  pp_html_table_tree(T),
+  nl, write('<BR>'), nl,
+  htmltreelist(Ts).  
+
+fitchtreelist([]).
+fitchtreelist([T|Ts]):-
+  pp_html_table_fitch_tree(T),
+  nl, write('<BR>'), nl,
+  fitchtreelist(Ts).
+
+
+% PRETTY PRINTING ROUTINES
+% ======================================================================
+
+% pp_html_table_tree(+Tree:<tree>)
+% ----------------------------------------------------------------------
+% Tree is output as an HTML table;  first numbered
+% ----------------------------------------------------------------------
+pp_html_table_tree(T):-
+  numbervars(T),
+%   nl, 
+%   write_term(T,[quoted(true)]), 
+%   nl, write('<P>'),
+  pp_html_tree(T).
+
+% pp_html_tree(+Tree:<tree>)
+% ----------------------------------------------------------------------
+% Tree is output as an HTML table;  assume numbered
+% ----------------------------------------------------------------------
+pp_html_tree(ass(Syn,V,'$VAR'(N))):-
+  write('['), pp_cat(Syn:V), write(']<sup>'), write(N), write('</sup>').
+pp_html_tree(leaf(Word)):-
+  pp_word(Word).
+pp_html_tree(ders(Words)):-
+  pp_word_list(Words).
+pp_html_tree(empty(Syn,Sem)):-
+  nl, write('<TABLE BORDER=1>'), nl,
+  write('<TR VALIGN=bottom>
+         <TD ALIGN=CENTER>-</TD>
+         <TD ROWSPAN=2 ALIGN=CENTER>Nil</TD>
+         </TR>'), 
+  nl,
+  write('<TR VALIGN=bottom>
+         <TD ALIGN=CENTER>'), 
+  pp_cat(Syn:Sem), 
+  write('</TD></TR>'),
+  nl,
+  write('</TABLE>').
+pp_html_tree(tree(Rule,Root,SubTrees)):-
+  nl, write('<TABLE BORDER=1>'), nl,
+  write('<TR VALIGN=bottom>'), nl,
+  pp_html_trees(SubTrees,0,N),
+  nl, 
+  ( Rule = lex 
+    -> true
+  ; write('<TD ROWSPAN=2 ALIGN=CENTER>'), pp_rule(Rule), write('</TD>')
+  ),
+  write('</TR>'),
+  write('<TR VALIGN=bottom><TD ALIGN=CENTER COLSPAN='), write(N), write('>'), 
+  pp_cat(Root),
+  write('</TD></TR>'),
+  nl, write('</TABLE>').
+
+% pp_html_trees(+Trees: <list(<tree>)>,+N:<int>,-M:<int>)
+% ----------------------------------------------------------------------
+% prints the trees in Trees, where (M-N) is the length of the list (N
+% acts as an accumulator, initialized to 0
+% ----------------------------------------------------------------------
+pp_html_trees([T|Ts],N,M):-
+  write('<TD ALIGN=center>'), pp_html_tree(T),
+  write('</TD>'),
+  K is N+1,
+  pp_html_trees(Ts,K,M).
+pp_html_trees([],N,N).
+
+% pp_html_table_fitch_tree(+T:<tree>)
+% ----------------------------------------------------------------------
+% T is numbered and output as a table Fitch-style
+% ----------------------------------------------------------------------
+pp_html_table_fitch_tree(T):-
+  numbervars(T),
+  nl, write('<TABLE BORDER=1>'), 
+  pp_html_fitch_tree(T,1,_,_,_,[],_),
+  nl, write('</TABLE>').
+
+% pp_html_fitch_tree(+Tree:<tree>, +Start:<int>, -Next:<int>, -Me:<int>,
+%                    +Exp:<exp>, 
+%                    +AssIn:<list(<assgn>)>, -AssOut:<list(<assgn>)>)
+% ----------------------------------------------------------------------
+% the rows of the table for Tree are printed;
+% Start is where the numbering begins; Next is the next available number
+% after last one used; Me is the row representing the output of the 
+% derivation;  Exp is the expression corresponding to Tree;
+% AssIn are existing assignments coming in and AssOut are assignments 
+% going out (an <assgn> is a pair ass(M,X) where M is a row number on the
+% table and X is the abstracted variable)
+% ----------------------------------------------------------------------
+pp_html_fitch_tree(tree(der,Root,[ders(Words)]),M,N,M,Exp,Ass,Ass):-
+  !, nl, write('<TR><TD>'), 
+  write(M), write('</TD><TD>'), 
+  map_word(Words,Exp), pp_exp(Exp), 
+  write('-'), pp_cat(Root), 
+  write('</TD><TD>'), write('Der'), write('</TD></TR>'), nl,
+  N is M+1.
+pp_html_fitch_tree(tree(lex,Root,[leaf(Word)]),M,N,M,Word,Ass,Ass):-
+  !, nl, write('<TR><TD>'), 
+  write(M), write('</TD><TD>'), pp_exp(Word), write('-'), pp_cat(Root), 
+  write('</TD><TD>'), write('Lex'), write('</TD></TR>'), nl,
+  N is M+1.
+pp_html_fitch_tree(tree(fe,Root,[T1,T2]),M,N,L,Exp1+Exp2,AssIn,AssOut):-
+  !, pp_html_fitch_tree(T1,M,K,Source1,Exp1,AssIn,AssMid),
+  pp_html_fitch_tree(T2,K,L,Source2,Exp2,AssMid,AssOut),
+  nl, write('<TR><TD>'), 
+  write(L), write('</TD><TD>'), pp_exp(Exp1+Exp2), write('-'), pp_cat(Root), 
+  write('</TD><TD>'), write('E/ '), write((Source1,Source2)), 
write('</TD></TR>'), nl, 
+  N is L + 1.
+pp_html_fitch_tree(tree(be,Root,[T1,T2]),M,N,L,Exp1+Exp2,AssIn,AssOut):-
+  !, pp_html_fitch_tree(T1,M,K,Source1,Exp1,AssIn,AssMid),
+  pp_html_fitch_tree(T2,K,L,Source2,Exp2,AssMid,AssOut),
+  nl, write('<TR><TD>'), 
+  write(L), write('</TD><TD>'), pp_exp(Exp1+Exp2), write('-'), pp_cat(Root), 
+  write('</TD><TD>'), write('E\\ '), write((Source1,Source2)), 
write('</TD></TR>'), nl,
+  N is L + 1.
+pp_html_fitch_tree(tree(qqi,Root,[T]),M,Next,Me,Exp,AssIn,AssOut):-
+  !, pp_html_fitch_tree(T,M,Me,Source,Exp,AssIn,AssOut),
+  nl, write('<TR><TD>'), 
+  write(Me), write('</TD><TD>'), pp_exp(Exp), write('-'), pp_cat(Root), 
+  write('</TD><TD>'), write('q I '), write(Source), write('</TD></TR>'), nl,
+  Next is Me+1.
+pp_html_fitch_tree(tree(coel,Root,[T1,T2,T3]),M,N,L,Exp1+Exp2+Exp3,AssIn,AssOut):-
+  !, pp_html_fitch_tree(T1,M,K,Source1,Exp1,AssIn,AssMid),
+  pp_html_fitch_tree(T2,K,L1,Source2,Exp2,AssMid,AssMid2),
+  pp_html_fitch_tree(T3,L1,L,Source3,Exp3,AssMid2,AssOut),
+  nl, write('<TR><TD>'), 
+  write(L), write('</TD><TD>'), pp_exp(Exp1+Exp2+Exp3), write('-'), 
pp_cat(Root), 
+  write('</TD><TD>'), write('E co '), write((Source1,Source2,Source3)), 
write('</TD></TR>'), nl,
+  N is L + 1.
+pp_html_fitch_tree(tree(fi(_),(C1/C2):(var(X)^Sem),[T]),M,Q,N,ExpNew,AssIn,AssOut):-
+    K is M+1,
+    write('<TR><TD COLSPAN=3><TABLE BORDER=1>'),
+    write('<TR><TD>'), write(M), write('</TD><TD>'),
+    X = '$VAR'(Num), 
+  cat_atoms(Num,'</sub>',ExpMid),
+  cat_atoms('e<sub>',ExpMid,ExpNum),
+    pp_exp(ExpNum),  write(' - '),
+    pp_cat(C2:var(X)), write('</TD><TD>'), write('Assume</TD></TR>'),
+    pp_html_fitch_tree(T,K,N,L, Exp, [ass(M,X)|AssIn],AssOut),
+    write('<TR><TD>'), write(N), write('</TD><TD>'),
+    removeexp(ExpNum,Exp,ExpNew),
+    pp_exp(ExpNew), write(' - '), pp_cat(C1/C2:var(X)^Sem), write('</TD><TD>'),
+    write('/I '), write((M,L)), write('</TD></TR>'),
+    write('</TD></TR></TABLE>'),
+    Q is N+1.
+pp_html_fitch_tree(tree(bi(_),(C2\C1):(var(X)^Sem),[T]),M,Q,N,ExpNew,AssIn,AssOut):-
+    K is M+1,
+    write('<TR><TD COLSPAN=3><TABLE BORDER=1>'),
+    write('<TR><TD>'), write(M), write('</TD><TD>'),
+    X = '$VAR'(Num), 
+  cat_atoms(Num,'</sub>',ExpMid),
+  cat_atoms('e<sub>',ExpMid,ExpNum),
+    pp_exp(ExpNum),  write(' - '),
+    pp_cat(C2:var(X)), write('</TD><TD>'), write('Assume</TD></TR>'),
+    pp_html_fitch_tree(T,K,N,L, Exp, [ass(M,X)|AssIn],AssOut),
+    write('<TR><TD>'), write(N), write('</TD><TD>'),
+    removeexp(ExpNum,Exp,ExpNew),
+    pp_exp(ExpNew), write(' - '), pp_cat(C2\C1:var(X)^Sem), write('</TD><TD>'),
+    write('/I '), write((M,L)), write('</TD></TR>'),
+    write('</TD></TR></TABLE>'),
+    Q is N+1.
+pp_html_fitch_tree(tree(gi(_),(C1-C2):var(X)^Sem,[T]),M,Q,N,ExpNew,AssIn,AssOut):-
+  K is M+1,
+    write('<TR><TD COLSPAN=3><TABLE BORDER=1>'),
+    write('<TR><TD>'), write(M), write('</TD><TD>'),
+    X = '$VAR'(Num), 
+  cat_atoms(Num,'</sub>',ExpMid),
+  cat_atoms('e<sub>',ExpMid,ExpNum),
+    pp_exp(ExpNum),  write(' - '),
+    pp_cat(C2:var(X)), write('</TD><TD>'), write('Assume</TD></TR>'),
+    pp_html_fitch_tree(T,K,N,L,Exp, [ass(M,X)|AssIn],AssOut),
+    write('<TR><TD>'), write(N), write('</TD><TD>'),
+    splitexp(ExpNum,Exp,ExpNew),
+    pp_exp(ExpNew), write(' - '),
+    pp_cat((C1-C2):var(X)^Sem), write('</TD><TD>'), 
+    write('I- '), write((M,L)), write('</TD></TR>'),
+    write('</TD></TR></TABLE>'),
+    Q is N+1.
+% pp_html_fitch_tree(tree(qqpop(N),A:(Q@(X^Alpha)),[T1]),M,N,K,Exp,Ass,Ass):-
+%   !, replace_qtree(qqpush(N),T1,T1Mid,T1Extract),
+%   pp_html_fitch_tree(T1Extract,M,L,J,_,_,_),
+%   pp_html_fitch_tree(T1Mid,L,P,I,_,_,_),
+%   write('<TR><TD>'), write(P), write('</TD><TD>'),
+%   pp_exp(Exp), write(' - '), 
+%   pp_cat(A:(Q@(X^Alpha))), write('</TD><TD>'),
+%   write(' '). 
+pp_html_fitch_tree(empty(Syn,Sem),M,N,M,[],Ass,Ass):-
+  !, nl, write('<TR><TD>'), 
+  write(M), write('</TD><TD>'), write('NIL'), write(' '), pp_cat(Syn:Sem), 
+  write('</TD><TD>'), write('Empty'), write('</TD></TR>'), nl,
+  N is M+1.
+pp_html_fitch_tree(ass(_Syn,var(Var),_),N,N,M,Exp,Ass,Ass):-
+  member(ass(M,Var),Ass),
+  Var = '$VAR'(Num),
+  cat_atoms(Num,'</sub>',ExpMid),
+  cat_atoms('e<sub>',ExpMid,Exp).
+
+% removexp(+ExpRem:<exp>,+Exp:<exp>,-ExpOut:<exp>)
+% ----------------------------------------------------------------------
+% he expression ExpRem is removed from Exp with result ExpOut
+% ----------------------------------------------------------------------
+removeexp(E,E,'NIL'):-!.
+removeexp(E,E+E2,E2):-!.
+removeexp(E,E2+E,E2):-!.
+removeexp(E,E2+E3,E2New+E3New):-
+  !, removeexp(E,E2,E2New),
+  removeexp(E,E3,E3New).
+removeexp(_,E2,E2).
+
+% splitexp(+ExpRem:<exp>, +Exp:<exp>, -ExpOut:<exp>)
+% ----------------------------------------------------------------------
+% ExpRem is removed from Exp with ExpOut left over;  the extraction
+% site is represented as a split point
+% ----------------------------------------------------------------------
+splitexp(E,E,('NIL','NIL')):-!.
+splitexp(E,E+E2,('NIL',E2)):-!.
+splitexp(E,E2+E,(E2,'NIL')):-!.
+splitexp(E,E1+E2,(E3,E4+E2)):-
+  splitexp(E,E1,(E3,E4)), !.
+splitexp(E,E1+E2,(E1+E3,E4)):-
+  splitexp(E,E2,(E3,E4)).
+
+% pp_exp(+Exp:<exp>)
+% ----------------------------------------------------------------------
+% the expression Exp is output;  concatenations are represented as
+% spaces and split points by (_,_) and empty by '0'
+% ----------------------------------------------------------------------
+pp_exp('NIL'):-
+  !, write(0).
+pp_exp(A+'NIL'):-
+  !, pp_exp(A).
+pp_exp(B+'NIL'):-
+  !, pp_exp(B).
+pp_exp(A+B):-
+  !, pp_exp(A), write(' '), pp_exp(B).
+pp_exp((A,B)):-
+  !, write('('), pp_exp(A), write(', '), pp_exp(B), write(')').
+pp_exp(A):-
+  pp_word(A).
+
+map_word([[_]|Ws],Exp):-
+  !, map_word(Ws,Exp).
+map_word([W|Ws],Exp):-
+  map_word(Ws,W,Exp).
+map_word([],'NIL').
+
+map_word(Ws,[_],W):-
+ !, map_word(Ws,W).
+map_word([],W,W).
+map_word([W|Ws],W1,W1+Exp):-
+  map_word(Ws,W,Exp).
+
+pp_exps([]).
+pp_exps([Exp|Exps]):-
+  pp_exp(Exp), write('+'), pp_exp(Exps).
+
+% pp_tree(+T:<tree>)
+% ----------------------------------------------------------------------
+% tree T is output in indented list notation; first number
+% ----------------------------------------------------------------------
+pp_tree(T):-
+  numbervars(T),
+  pp_tree(T,0).
+
+% pp_tree(+T:<tree>, +Col:<int>)
+% ----------------------------------------------------------------------
+% print tree T beginning at column Col
+% ----------------------------------------------------------------------
+pp_tree(empty(Syn,Sem),Col):-
+  nl, tab(Col), pp_cat(Syn:Sem), write(' via empty').
+pp_tree(ass(Syn,V,'$VAR'(N)),Column):-
+  nl, tab(Column), write('['), pp_cat(Syn:V), write(']'), 
+  write('<SUP>'), write(N), write('</SUP>').
+pp_tree(leaf(Word),Column):-
+  nl, tab(Column), pp_word(Word).
+pp_tree(ders(Words),Column):-
+  nl, tab(Column), pp_word_list(Words).
+pp_tree(tree(Rule,Root,SubTrees),Column):-
+  nl, tab(Column),
+  pp_cat(Root),
+  write(' via '), pp_rule(Rule),
+  NewColumn is Column + 2,
+  pp_trees(SubTrees,NewColumn).
+
+% pp_trees(+Ts:<list(<tree>)>, +Col:<int>)
+% ----------------------------------------------------------------------
+% print tree list Ts beginning at column Col
+% ----------------------------------------------------------------------
+pp_trees([T|Ts],Column):-
+  pp_tree(T,Column),
+  pp_trees(Ts,Column).
+pp_trees([],_).
+
+% pp_word_list(+Ws:<list(<word>)>)
+% ----------------------------------------------------------------------
+% the list of words Ws is output, ignoring non-atoms
+% ----------------------------------------------------------------------
+pp_word_list([]).
+pp_word_list([W|Ws]):-
+  atom(W), !, pp_word(W), pp_word_list_rest(Ws).
+pp_word_list([_|Ws]):-
+  pp_word_list(Ws).
+
+pp_word(W):-
+  write('<I>'), write(W), write('</I>').
+
+% pp_word_list_rest(+Ws:<list(<word>)>)
+% ----------------------------------------------------------------------
+% word list Ws is output with an initial blank if Ws is non-empty
+% ----------------------------------------------------------------------
+pp_word_list_rest([]).
+pp_word_list_rest([W|Ws]):-
+  atom(W), !, write(' '), pp_word(W), pp_word_list_rest(Ws).
+pp_word_list_rest([_|Ws]):-
+  pp_word_list_rest(Ws).
+
+% pp_cat(Cat:<cat>)
+% ----------------------------------------------------------------------
+% pretty print category Cat
+% ----------------------------------------------------------------------
+pp_cat(Syn:Sem):-
+  pp_lam(Sem), write(' : '), pp_syn(Syn).
+
+% pp_syn(SynCat:<syncat>)
+% ----------------------------------------------------------------------
+% pretty print syntactic category
+% ----------------------------------------------------------------------
+pp_syn(A/B):-
+  !, pp_syn(A), write('/'), pp_syn_paren(B).
+pp_syn(A-B):-
+  !, pp_syn(A), write('-'), pp_syn_paren(B).
+pp_syn(B\A):-
+  !, pp_syn_paren(B), write('\\'), pp_syn_back(A).
+pp_syn(q(A,B,B)):-
+  !, pp_syn(scop(A,B)).
+pp_syn(q(A,B,C)):-
+  !, write('q('), pp_syn(A), write(','), pp_syn(B), write(','), 
+  pp_syn(C), write(')'). 
+pp_syn(scop(A,B)):-
+  !, pp_syn(A), write('^^'), pp_syn(B).
+pp_syn(C):-
+  pp_bas_cat(C).
+
+% pp_syn_paren(SynCat:<syncat>)
+% ----------------------------------------------------------------------
+% pretty print syntactic category with enclosing parens if it
+% is functional (used for arguments)
+% ----------------------------------------------------------------------
+pp_syn_paren(A/B):-
+  !, pp_paren(A/B).
+pp_syn_paren(A-B):-
+  !, pp_paren(A-B).
+pp_syn_paren(B\A):-
+  !, pp_paren(B\A).
+pp_syn_paren(q(A,B,B)):-
+  !, pp_paren(q(A,B,B)).
+pp_syn_paren(q(A,B,C)):-
+  !, pp_syn(q(A,B,C)).
+pp_syn_paren(C):-
+  pp_bas_cat(C).
+
+% pp_paren(+C:<cat>)
+% ----------------------------------------------------------------------
+% category Cat is pretty printed with surrounding parens
+% ----------------------------------------------------------------------
+pp_paren(C):-
+  write('('), pp_syn(C), write(')').
+
+% pp_syn_back(+Cat:<cat>)
+% ----------------------------------------------------------------------
+% Cat is pretty printed as the result of a backward functor
+% ----------------------------------------------------------------------
+pp_syn_back(A/B):-
+  !, pp_syn_paren(A/B).
+pp_syn_back(A-B):-
+  !, pp_syn_paren(A-B).
+pp_syn_back(A):-
+  pp_syn(A).
+
+% pp_bas_cat(+BasCat:<bascat>)
+% ----------------------------------------------------------------------
+% the basic category BasCat is pretty printed
+% ----------------------------------------------------------------------
+pp_bas_cat(Cat):-
+  writecat(Cat,Atom,Subs,Sups),
+  write(Atom),
+  writesubs(Subs),
+  writesups(Sups).
+  
+% writecat(+BasCat:<bascat>,-Root:<atom>,-Subs:<list>,-Sups:<list>)
+% ----------------------------------------------------------------------
+% basic category BasCat is printed as Root with superscripts Sups
+% and subscripts Subs
+% ----------------------------------------------------------------------
+writecat(np(ind(sng),nm(_)),np,[],[]):-!.
+writecat(np(ind(sng),pp(C)),np,[C],[]):-!.
+writecat(np(ind(plu),nm(_)),np,[p],[]):-!.
+writecat(np(ind(plu),pp(C)),np,[p,C],[]):-!.
+writecat(np(ind(_),nm(_)),np,[],[]):-!.
+writecat(np(set,nm(_)),np,[p],['*']):-!.
+writecat(np(set,pp(C)),np,[p,C],['*']):-!.
+writecat(np(_,_),np,[],[]):-!.
+writecat(s(fin),s,[],[]):-!.
+writecat(s('$VAR'(_)),s,[],[]):-!.
+writecat(s(V),s,[V],[]):-!.
+writecat(n(ind(plu)),n,[p],[]):-!.
+writecat(n(set),n,[p],['*']):-!.
+writecat(n(ind(sng)),n,[],[]):-!.
+writecat(n(_),n,[],[]):-!.
+writecat(sc(th(fin)),sc,[th,fin],[]):-!.
+writecat(sc(th(bse)),sc,[th,bse],[]):-!.
+writecat(sc(wh),sc,[wh],[]):-!.
+writecat(sc(if),sc,[if],[]):-!.
+writecat(sc(_),sc,[],[]):-!.
+writecat(ex(it),ex,[it],[]):-!.
+writecat(ex(th(_)),ex,[th],[]):-!.
+writecat(ex(_),ex,[],[]):-!.
+writecat(C,C,[],[]).
+
+% writesubs(+List:<list>)
+% ----------------------------------------------------------------------
+% List is output as a subscript
+% ----------------------------------------------------------------------
+writesubs([]).
+writesubs([X|Xs]):-
+  write('<SUB>'),
+  writelistsubs(Xs,X),
+  write('</SUB>').
+
+% writesups(+List:<list>)
+% ----------------------------------------------------------------------
+% List is output as a superscript
+% ----------------------------------------------------------------------
+writesups([]).
+writesups([X|Xs]):-
+  write('<SUP>'),
+  writelistsubs(Xs,X),
+  write('</SUP>').
+
+% writelistsubs(+Xs:<list>, +X:<term>)
+% ----------------------------------------------------------------------
+% Xs is written as a list with commas as separators
+% ----------------------------------------------------------------------
+writelistsubs([],X):-
+ write(X).
+writelistsubs([X|Xs],Y):-
+  write(Y), write(' ,'), writelistsubs(Xs,X).
+
+% pp_lam(+Term:<lambdaterm>)
+% ----------------------------------------------------------------------
+% lambda term Term is pretty printed
+% ----------------------------------------------------------------------
+pp_lam(Var^Alpha):-
+  !, pp_lam(Var), write('<B>. </B>'), pp_lam(Alpha). 
+pp_lam(con(and)@address@hidden):-
+  !, pp_lam_paren(Alpha), write(' &amp '), pp_lam_paren(Beta).
+pp_lam(con(or)@address@hidden):-
+  !, pp_lam_paren(Alpha), write(' <b>or</b> '), pp_lam_paren(Beta).
+pp_lam(con(not)@Alpha):-
+  !, write(' &#172 '), write('('), pp_lam_paren(Alpha), write(')').
+pp_lam(address@hidden):-
+  !, pp_lam_bracket(Alpha),
+  write('('),
+  pp_lam(Beta),
+  write(')').
+pp_lam(var('$VAR'(N))):-
+  !, write('<I>'), write(x), write('<SUB>'), write(N), write('</SUB></I>').
+pp_lam(con(Con)):-
+  write('<B>'), write(Con), write('</B>').
+
+pp_lam_bracket(A^B):-
+  !, write('('), pp_lam(A^B), write(')').
+pp_lam_bracket(A):-
+  pp_lam(A).
+
+% pp_lam_paren(+Term:<lambdaterm>)
+% ----------------------------------------------------------------------
+% lambda term Term is pretty printed
+% ----------------------------------------------------------------------
+pp_lam_paren(Var^Alpha):-
+  !, pp_lam(Var), write('<B>. </B>'), pp_lam(Alpha). 
+pp_lam_paren(con(and)@address@hidden):-
+  !, write('('), pp_lam_paren(Alpha), write(' &amp '), pp_lam_paren(Beta), 
write(')').
+pp_lam_paren(con(or)@address@hidden):-
+  !, write('('), pp_lam_paren(Alpha), write(' <b>or</b> '), 
pp_lam_paren(Beta), write(')').
+pp_lam_paren(con(not)@Alpha):-
+  !, write(' &#172 '), write('('), pp_lam_paren(Alpha), write(')').
+pp_lam_paren(address@hidden):-
+  !, pp_lam(Alpha),
+  write('('),
+  pp_lam(Beta),
+  write(')').
+pp_lam_paren(var('$VAR'(N))):-
+  !, write('<I>'), write(x), write('<SUB>'), write(N), write('</SUB></I>').
+pp_lam_paren(con(Con)):-
+  write('<B>'), write(Con), write('</B>').
+
+% pp_rule(+Rule:<rulename>)
+% ----------------------------------------------------------------------
+% rule Rule is pretty printed
+% ----------------------------------------------------------------------
+pp_rule(fe):-write('/E').
+pp_rule(be):-write('\\E').
+pp_rule(fi('$VAR'(N))):-write('/I<sup>'), write(N), write('</sup>').
+pp_rule(bi('$VAR'(N))):-write('\\I<sup>'), write(N), write('</sup>').
+pp_rule(gi('$VAR'(N))):-write('-I<sup>'), write(N), write('</sup>').
+pp_rule(qqpush('$VAR'(N))):-write('qE<sup>'), write(N), write('</sup>').
+pp_rule(qqpop('$VAR'(N))):-write(N).
+pp_rule(qqi):-write(qI).
+pp_rule(coel):-write('coE').
+pp_rule(lex):-write('L').
+pp_rule(der):-write('D').
+pp_rule(nbc):-write('NBC').
+pp_rule(qi):-write('qI').
+
+
+% Standard Utilities
+% ======================================================================
+
+member(X,[X|_]).
+member(X,[_|Xs]):-
+  member(X,Xs).
+
+append_list([],[]).
+append_list([Xs|Xss],Ys):-
+  append(Xs,Zs,Ys),
+  append_list(Xss,Zs).
+
+append([],Xs,Xs).
+append([X|Xs],Ys,[X|Zs]):-
+  append(Xs,Ys,Zs).
+
+at_least_one_member(X,[X|_]):-!.
+at_least_one_member(X,[_|Xs]):-
+  at_least_one_member(X,Xs).
+
+numbervars(X):-
+  numbervars(X,0,_).
+
+reverse([],Ws,Ws).
+reverse([W|Ws],WsAcc,WsRev):-
+  reverse(Ws,[W|WsAcc],WsRev).
+
+select(X,[X|Xs],Xs).
+select(X,[Y|Xs],[Y|Zs]):-
+  select(X,Xs,Zs).
+
+select_last([X],X,[]).
+select_last([X|Xs],Y,[X|Zs]):-
+  select_last(Xs,Y,Zs).
+
+cat_atoms(A1,A2,A3):-
+  name(A1,L1),
+  name(A2,L2),
+  append(L1,L2,L3),
+  name(A3,L3).
+
+writelist([der(Ws)|Ws2]):-
+  !, writelist(Ws), write(' '), writelist(Ws2).
+writelist([W|Ws]):-
+  write(W), write(' '),
+  writelist(Ws).
+writelist([]).
+
+write_lex_cat(File):-
+  tell(File),
+  write('<HTML><HEAD><TITLE>Natural Deduction CG 
Parser</TITLE></HEAD><BODY><b> L<FONT SIZE = -1>EXICON</FONT> </b><br><br><FONT 
SIZE=-1>'), nl, nl,
+  setof(lexe(W,Syn:Sem),lexentry(W,Syn,Sem),Ws),
+  !,   writebreaklex(Ws),
+  nl, write('</FONT></HEAD></HTML>'), nl,
+  told.
+       
+writebreaklex([]).
+writebreaklex([W|Ws]):-
+  writebreaklex(Ws,W).
+
+writebreaklex([],lexe(W,Cat)):-
+  write(W), write(' ==> '), 
+  pp_cat(Cat), nl.
+writebreaklex([W2|Ws],lexe(W,Cat)):-
+  write(W), write(' ==> '), 
+  pp_cat(Cat), 
+  write(' <BR> '), nl,
+  writebreaklex(Ws,W2).
+
+write_lex(File):-
+  tell(File),
+  write('<HTML><HEAD><TITLE>Natural Deduction CG 
Parser</TITLE></HEAD><BODY><b> L<FONT SIZE = -1>EXICON</FONT> </b><br><FONT 
SIZE=-1><BR>'), nl,
+  setof(W,C^(W==>C),Ws),
+  !,   writebreak(Ws),
+  nl, write('</FONT></HEAD></HTML>'), nl,
+  told.
+
+writebreak([]).
+writebreak([W|Ws]):-
+  writebreak(Ws,W).
+
+writebreak([],W):-
+  write(W), nl.
+writebreak([W2|Ws],W):-
+  write(W), write(' <BR> '), nl,
+  writebreak(Ws,W2).
+
+tt:-
+  consult(natded), consult(lexicon), consult_lex, compile_empty.
+
+mt:-
+  consult(natded), consult(lexicon), consult_lex, compile_empty, save(test3), 
start_up.
+
+cmt:-
+  compile(natded), compile(lexicon), compile_lex('compilelex.pl'), 
compile_empty, save(test3), start_up.
+
+
+%%% Local Variables:
+%%% mode: prolog
+%%% prolog-indent-width: 2
+%%% tab-width: 2
+%%% End:
diff --git a/test/etags/prol-src/ordsets.prolog 
b/test/etags/prol-src/ordsets.prolog
new file mode 100644
index 0000000..7192129
--- /dev/null
+++ b/test/etags/prol-src/ordsets.prolog
@@ -0,0 +1,337 @@
+/* Copyright(C) 1988, Swedish Institute of Computer Science */
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%   File   : ORDSETS.PL                                                        
      %
+%   Author : Lena Flood                                                        
      %
+%   Updated: 9 September 1988                                                %
+%   Purpose: Ordered set manipulation utilities                                
      %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+:- module(ordsets, [
+       is_ordset/1,
+       list_to_ord_set/2,
+       ord_add_element/3,
+       ord_del_element/3,
+       ord_disjoint/2,
+       ord_intersect/2,
+       ord_intersection/3,
+       ord_intersection/4,
+       ord_intersection/2,
+       ord_member/2,
+       ord_seteq/2,
+       ord_setproduct/3,
+       ord_subset/2,
+       ord_subtract/3,
+       ord_symdiff/3,
+       ord_union/3,
+       ord_union/4,
+       ord_union/2
+                  ]).
+
+%   Adapted from shared code written by Richard A O'Keefe. 
+
+%   In this package, sets are represented by ordered lists with no
+%   duplicates.         Thus {c,r,a,f,t} would be [a,c,f,r,t].  The ordering
+%   is defined by the @< family of term comparison predicates, which
+%   is the ordering used by sort/2 and setof/3.
+
+%   The benefit of the ordered representation is that the elementary
+%   set operations can be done in time proportional to the Sum of the
+%   argument sizes rather than their Product.  
+
+
+
+%   is_ordset(+Set)
+%   is true when Set is an ordered set.
+
+is_ordset(X) :- var(X), !, fail.
+is_ordset([]).
+is_ordset([Head|Tail]) :-
+       is_ordset(Tail, Head).
+
+is_ordset(X, _) :- var(X), !, fail.
+is_ordset([], _).
+is_ordset([Head|Tail], Left) :-
+       Left @< Head,
+       is_ordset(Tail, Head).
+
+
+%   list_to_ord_set(+List, ?Set)
+%   is true when Set is the ordered representation of the set represented
+%   by the unordered representation List.  
+
+list_to_ord_set(List, Set) :-
+       sort(List, Set).
+
+
+%   ord_add_element(+Set1, +Element -Set2)
+%   is true when Set2 is Set1 with Element inserted in it, preserving
+%   the order.
+
+ord_add_element([], Element, [Element]).
+ord_add_element([Head|Tail], Element, Set) :-
+       compare(Order, Head, Element),
+       ord_add_element(Order, Head, Tail, Element, Set).
+
+ord_add_element(<, Head, Tail, Element, [Head|Set]) :-
+       ord_add_element(Tail, Element, Set).
+ord_add_element(=, Head, Tail, _, [Head|Tail]).
+ord_add_element(>, Head, Tail, Element, [Element,Head|Tail]).
+
+
+%   ord_del_element(+Set1, +Element, ?Set2)
+%   is true when Set2 is Set1 but with Element removed.
+
+ord_del_element([], _, []).
+ord_del_element([Head|Tail], Element, Set) :-
+       compare(Order, Head, Element),
+       ord_del_element(Order, Head, Tail, Element, Set).
+
+ord_del_element(<, Head, Tail, Element, [Head|Set]) :-
+       ord_del_element(Tail, Element, Set).
+ord_del_element(=, _, Tail, _, Tail).
+ord_del_element(>, Head, Tail, _, [Head|Tail]).
+
+
+
+%   ord_disjoint(+Set1, +Set2)
+%   is true when the two ordered sets have no element in common.  
+
+ord_disjoint(Set1, Set2) :-
+       \+ ord_intersect(Set1, Set2).
+
+
+
+%   ord_intersect(+Set1, +Set2)
+%   is true when the two ordered sets have at least one element in common.
+
+ord_intersect([Head1|Tail1], [Head2|Tail2]) :-
+       compare(Order, Head1, Head2),
+       ord_intersect(Order, Head1, Tail1, Head2, Tail2).
+
+ord_intersect(<, _, [Head1|Tail1], Head2, Tail2) :-
+       compare(Order, Head1, Head2),
+       ord_intersect(Order, Head1, Tail1, Head2, Tail2).
+ord_intersect(=, _, _, _, _).
+ord_intersect(>, Head1, Tail1, _, [Head2|Tail2]) :-
+       compare(Order, Head1, Head2),
+       ord_intersect(Order, Head1, Tail1, Head2, Tail2).
+
+
+
+%   ord_intersection(+Set1, +Set2, ?Intersection)
+%   is true when Intersection is the intersecton of Set1
+%   and Set2, provided that Set1 and Set2 are ordered sets.
+
+ord_intersection([], _, []).
+ord_intersection([Head1|Tail1], Set2, Intersection) :-
+       ord_intersection3(Set2, Head1, Tail1, Intersection).
+
+ord_intersection3(<, _, Set1, Head2, Tail2, Intersection) :-
+       ord_intersection3(Set1, Head2, Tail2, Intersection).
+ord_intersection3(=, Head, Tail1, _, Tail2, [Head|Intersection]) :-
+       ord_intersection(Tail1, Tail2, Intersection).
+ord_intersection3(>, Head1, Tail1, _, Set2, Intersection) :-
+       ord_intersection3(Set2, Head1, Tail1, Intersection).
+
+% could be a disjunction, but is used in three places
+ord_intersection3([], _, _, []).
+ord_intersection3([Head2|Tail2], Head1, Tail1, Intersection) :-
+       compare(Order, Head1, Head2),
+       ord_intersection3(Order, Head1, Tail1, Head2, Tail2, Intersection).
+
+
+
+%   ord_intersection(+Set1, +Set2, ?Intersection, ?Difference)
+%   is true when Intersection is the intersection of Set1 and Set2, 
+%   and Differens is Set2 \ Set1 (like in ord_union/4),
+%    provided that Set1 and Set2 are ordered sets.
+
+ord_intersection([], Set2, [], Set2).
+ord_intersection([Head1|Tail1], Set2, Intersection, Difference) :-
+       ord_intersection4(Set2, Head1, Tail1, Intersection, Difference).
+
+ord_intersection4(<, _, Set1, Head2, Tail2, Intersection, Difference) :-
+       (   Set1 = [], Intersection = [], Difference = [Head2|Tail2]
+       ;   Set1 = [Head1|Tail1],
+           compare(Order, Head1, Head2),
+           ord_intersection4(Order, Head1, Tail1, Head2, Tail2, Intersection, 
Difference)
+       ).
+ord_intersection4(=, Head, Tail1, _, Tail2, [Head|Intersection], Difference) :-
+       ord_intersection(Tail1, Tail2, Intersection, Difference).
+ord_intersection4(>, Head1, Tail1, Head2, Set2, Intersection, 
[Head2|Difference]) :-
+       ord_intersection4(Set2, Head1, Tail1, Intersection, Difference).
+
+ord_intersection4([], _, _, [], []).
+ord_intersection4([Head2|Tail2], Head1, Tail1, Intersection, Difference) :-
+       compare(Order, Head1, Head2),
+       ord_intersection4(Order, Head1, Tail1, Head2, Tail2, Intersection, 
Difference).
+
+
+
+%   ord_intersection(+Sets, ?Intersection)
+%   is true when Intersection is the ordered set representation of the
+%   intersection of all the sets in Sets.
+
+ord_intersection(Sets, Intersection) :- 
+       length(Sets, NumberOfSets),
+       NumberOfSets > 0,
+       ord_intersection2(NumberOfSets, Sets, Intersection, []).
+
+ord_intersection2(1, [Set|Sets], Set0, Sets0) :- !,
+       Set = Set0,
+       Sets = Sets0.
+ord_intersection2(2, [Set,Set2|Sets], Intersection, Sets0) :- !,
+       Sets = Sets0,
+       ord_intersection2(Set, Set2, Intersection).
+ord_intersection2(N, Sets0, Intersection, Sets) :-
+%      N > 2,
+       A is N>>1,
+       Z is N-A,
+       ord_intersection2(A, Sets0, X, Sets1),
+       ord_intersection2(Z, Sets1, Y, Sets),
+       ord_intersection(X, Y, Intersection).
+
+
+
+%   ord_member(+Elt, +Set)
+%   is true when Elt is a member of Set.  Suggested by Mark Johnson.
+
+ord_member(X, [E|Es]) :-
+        compare(C, X, E),
+        ord_member(C, X, Es).
+
+ord_member(=, _X, _Es).
+ord_member(>, X, [E|Es]) :-
+        compare(C, X, E),
+        ord_member(C, X, Es).
+
+
+
+%   ord_seteq(+Set1, +Set2)
+%   is true when the two arguments represent the same set.  Since they
+%   are assumed to be ordered representations, they must be identical.
+
+
+ord_seteq(Set1, Set2) :-
+       Set1 == Set2.
+
+
+%   ord_setproduct(+Set1, +Set2, ?SetProduct)
+%   is true when SetProduct is the cartesian product of Set1 and Set2. The
+%   product is represented as pairs Elem1-Elem2, where Elem1 is an element
+%   from Set1 and Elem2 is an element from Set2.
+
+ord_setproduct([], _, []).
+ord_setproduct([Head|Tail], Set, SetProduct)  :-
+       ord_setproduct(Set, Head, SetProduct, Rest),
+       ord_setproduct(Tail, Set, Rest).
+
+ord_setproduct([], _, Set, Set).
+ord_setproduct([Head|Tail], X, [X-Head|TailX], Tl) :-
+       ord_setproduct(Tail, X, TailX, Tl).
+
+
+
+%   ord_subset(+Set1, +Set2)
+%   is true when every element of the ordered set Set1 appears in the
+%   ordered set Set2.
+
+ord_subset([], _).
+ord_subset([Head1|Tail1], [Head2|Tail2]) :-
+       compare(Order, Head1, Head2),
+       ord_subset(Order, Head1, Tail1, Tail2).
+
+ord_subset(=, _, Tail1, Tail2) :-
+       ord_subset(Tail1, Tail2).
+ord_subset(>, Head1, Tail1, [Head2|Tail2]) :-
+       compare(Order, Head1, Head2),
+       ord_subset(Order, Head1, Tail1, Tail2).
+
+
+
+%   ord_subtract(+Set1, +Set2, ?Difference)
+%   is true when Difference contains all and only the elements of Set1
+%   which are not also in Set2, i.e. Set1 \ Set2.
+
+ord_subtract(Set1, Set2, Union) :-
+       prolog:subtract(Set1, Set2, Union).
+
+
+
+%   ord_symdiff(+Set1, +Set2, ?Difference)
+%   is true when Difference is the symmetric difference of Set1 and Set2.
+
+ord_symdiff([], Set2, Set2).
+ord_symdiff([Head1|Tail1], Set2, Symdiff) :-
+       ord_symdiff(Set2, Head1, Tail1, Symdiff).
+
+ord_symdiff(<, Head1, Set1, Head2, Tail2, [Head1|Symdiff]) :-
+       ord_symdiff(Set1, Head2, Tail2, Symdiff).
+ord_symdiff(=, _, Tail1, _, Tail2, Symdiff) :-
+       ord_symdiff(Tail1, Tail2, Symdiff).
+ord_symdiff(>, Head1, Tail1, Head2, Set2, [Head2|Symdiff]) :-
+       ord_symdiff(Set2, Head1, Tail1, Symdiff).
+
+% could be a disjunction, but is used in three places
+ord_symdiff([], Head1, Tail1, [Head1|Tail1]).
+ord_symdiff([Head2|Tail2], Head1, Tail1, Symdiff) :-
+       compare(Order, Head1, Head2),
+       ord_symdiff(Order, Head1, Tail1, Head2, Tail2, Symdiff).
+
+
+
+%   ord_union(+Set1, +Set2, ?Union)
+%   is true when Union is the union of Set1 and Set2.  Note that when
+%   something occurs in both sets, we want to retain only one copy.
+
+ord_union(Set1, Set2, Union) :-
+       prolog:merge(Set1, Set2, Union).
+
+
+
+%   ord_union(+Set1, +Set2, ?Union, ?New)
+%   is true when Union is the union of Set1 and Set2, and New is
+%   Set2 \ Set1.  This is useful if you
+%   are accumulating members of a set and you want to process new
+%   elements as they are added to the set.
+
+ord_union([], Set2, Set2, Set2).
+ord_union([Head1|Tail1], Set2, Union, Difference) :-
+       ord_union4(Set2, Head1, Tail1, Union, Difference).
+
+ord_union4(<, Head, Set1, Head2, Tail2, [Head|Union], Difference) :-
+       (   Set1 = [], Union = [Head2|Tail2], Difference = [Head2|Tail2]
+       ;   Set1 = [Head1|Tail1],
+           compare(Order, Head1, Head2),
+           ord_union4(Order, Head1, Tail1, Head2, Tail2, Union, Difference)
+       ).
+ord_union4(=, Head, Tail1, _, Tail2, [Head|Union], Difference) :-
+       ord_union(Tail1, Tail2, Union, Difference).
+ord_union4(>, Head1, Tail1, Head2, Set2, [Head2|Union], [Head2|Difference]) :-
+       ord_union4(Set2, Head1, Tail1, Union, Difference).
+
+ord_union4([], Head1, Tail1, [Head1|Tail1], []).
+ord_union4([Head2|Tail2], Head1, Tail1, Union, Difference) :-
+       compare(Order, Head1, Head2),
+       ord_union4(Order, Head1, Tail1, Head2, Tail2, Union, Difference).
+
+
+
+%   ord_union(+Sets, ?Union) 
+%   is true when Union is the union of all the sets in Sets. 
+
+ord_union([], Union) :- !, Union = [].
+ord_union(Sets, Union) :-
+       length(Sets, NumberOfSets),
+       ord_union_all(NumberOfSets, Sets, Union, []).
+
+ord_union_all(1, [Set|Sets], Set, Sets) :- !.
+ord_union_all(2, [Set,Set2|Sets], Union, Sets) :- !,
+       ord_union(Set, Set2, Union).
+ord_union_all(N, Sets0, Union, Sets) :-
+       A is N>>1,
+       Z is N-A,
+       ord_union_all(A, Sets0, X, Sets1),
+       ord_union_all(Z, Sets1, Y, Sets),
+       ord_union(X, Y, Union).
diff --git a/test/etags/ps-src/rfc1245.ps b/test/etags/ps-src/rfc1245.ps
new file mode 100644
index 0000000..ad2244f
--- /dev/null
+++ b/test/etags/ps-src/rfc1245.ps
@@ -0,0 +1,2085 @@
+%!
+%%BoundingBox: (atend)
+%%Pages: (atend)
+%%DocumentFonts: (atend)
+%%EndComments
+%
+% FrameMaker PostScript Prolog 2.0, for use with FrameMaker 2.0
+% Copyright (c) 1986,87,89 by Frame Technology, Inc.  All rights reserved.
+%
+% Known Problems:
+%      Due to bugs in Transcript, the 'PS-Adobe-' is omitted from line 1
+/FMversion (2.0) def 
+% Set up Color vs. Black-and-White
+       /FMPrintInColor systemdict /colorimage known def
+% Uncomment this line to force b&w on color printer
+%   /FMPrintInColor false def
+/FrameDict 190 dict def 
+systemdict /errordict known not {/errordict 10 dict def
+               errordict /rangecheck {stop} put} if
+% The readline in 23.0 doesn't recognize cr's as nl's on AppleTalk
+FrameDict /tmprangecheck errordict /rangecheck get put 
+errordict /rangecheck {FrameDict /bug true put} put 
+FrameDict /bug false put 
+mark 
+% Some PS machines read past the CR, so keep the following 3 lines together!
+currentfile 5 string readline
+00
+0000000000
+cleartomark 
+errordict /rangecheck FrameDict /tmprangecheck get put 
+FrameDict /bug get { 
+       /readline {
+               /gstring exch def
+               /gfile exch def
+               /gindex 0 def
+               {
+                       gfile read pop 
+                       dup 10 eq {exit} if 
+                       dup 13 eq {exit} if 
+                       gstring exch gindex exch put 
+                       /gindex gindex 1 add def 
+               } loop
+               pop 
+               gstring 0 gindex getinterval true 
+               } def
+       } if
+/FMVERSION {
+       FMversion ne {
+               /Times-Roman findfont 18 scalefont setfont
+               100 100 moveto
+               (FrameMaker version does not match postscript_prolog!)
+               dup =
+               show showpage
+               } if
+       } def 
+/FMLOCAL {
+       FrameDict begin
+       0 def 
+       end 
+       } def 
+       /gstring FMLOCAL
+       /gfile FMLOCAL
+       /gindex FMLOCAL
+       /orgxfer FMLOCAL
+       /orgproc FMLOCAL
+       /organgle FMLOCAL
+       /orgfreq FMLOCAL
+       /yscale FMLOCAL
+       /xscale FMLOCAL
+       /manualfeed FMLOCAL
+       /paperheight FMLOCAL
+       /paperwidth FMLOCAL
+/FMDOCUMENT { 
+       array /FMfonts exch def 
+       /#copies exch def
+       FrameDict begin
+       0 ne dup {setmanualfeed} if
+       /manualfeed exch def
+       /paperheight exch def
+       /paperwidth exch def
+       setpapername
+       manualfeed {true} {papersize} ifelse 
+       {manualpapersize} {false} ifelse 
+       {desperatepapersize} if
+       /yscale exch def
+       /xscale exch def
+       currenttransfer cvlit /orgxfer exch def
+       currentscreen cvlit /orgproc exch def
+       /organgle exch def /orgfreq exch def
+       end 
+       } def 
+       /pagesave FMLOCAL
+       /orgmatrix FMLOCAL
+       /landscape FMLOCAL
+/FMBEGINPAGE { 
+       FrameDict begin 
+       /pagesave save def
+       3.86 setmiterlimit
+       /landscape exch 0 ne def
+       landscape { 
+               90 rotate 0 exch neg translate pop 
+               }
+               {pop pop}
+               ifelse
+       xscale yscale scale
+       /orgmatrix matrix def
+       gsave 
+       } def 
+/FMENDPAGE {
+       grestore 
+       pagesave restore
+       end 
+       showpage
+       } def 
+/FMDEFINEFONT { 
+       FrameDict begin
+       findfont 
+       ReEncode 
+       2 index exch 
+       definefont exch 
+       scalefont 
+       FMfonts 3 1 roll 
+       put
+       end 
+       } bind def
+/FMNORMALIZEGRAPHICS { 
+       newpath
+       0.0 0.0 moveto
+       1 setlinewidth
+       0 setlinecap
+       0 0 0 sethsbcolor
+       0 setgray 
+       } bind def
+       /fx FMLOCAL
+       /fy FMLOCAL
+       /fh FMLOCAL
+       /fw FMLOCAL
+       /llx FMLOCAL
+       /lly FMLOCAL
+       /urx FMLOCAL
+       /ury FMLOCAL
+/FMBEGINEPSF { 
+       end 
+       /FMEPSF save def 
+       /showpage {} def 
+       FMNORMALIZEGRAPHICS 
+       [/fy /fx /fh /fw /ury /urx /lly /llx] {exch def} forall 
+       fx fy translate 
+       rotate
+       fw urx llx sub div fh ury lly sub div scale 
+       llx neg lly neg translate 
+       } bind def
+/FMENDEPSF {
+       FMEPSF restore
+       FrameDict begin 
+       } bind def
+FrameDict begin 
+/setmanualfeed {
+%%BeginFeature *ManualFeed True
+        statusdict /manualfeed true put
+%%EndFeature
+       } def
+/max {2 copy lt {exch} if pop} bind def
+/min {2 copy gt {exch} if pop} bind def
+/inch {72 mul} def
+/pagedimen { 
+       paperheight sub abs 16 lt exch 
+       paperwidth sub abs 16 lt and
+       {/papername exch def} {pop} ifelse
+       } def
+       /papersizedict FMLOCAL
+/setpapername { 
+       /papersizedict 14 dict def 
+       papersizedict begin
+       /papername /unknown def 
+               /Letter 8.5 inch 11.0 inch pagedimen
+               /LetterSmall 7.68 inch 10.16 inch pagedimen
+               /Tabloid 11.0 inch 17.0 inch pagedimen
+               /Ledger 17.0 inch 11.0 inch pagedimen
+               /Legal 8.5 inch 14.0 inch pagedimen
+               /Statement 5.5 inch 8.5 inch pagedimen
+               /Executive 7.5 inch 10.0 inch pagedimen
+               /A3 11.69 inch 16.5 inch pagedimen
+               /A4 8.26 inch 11.69 inch pagedimen
+               /A4Small 7.47 inch 10.85 inch pagedimen
+               /B4 10.125 inch 14.33 inch pagedimen
+               /B5 7.16 inch 10.125 inch pagedimen
+       end
+       } def
+/papersize {
+       papersizedict begin
+               /Letter {lettertray} def
+               /LetterSmall {lettertray lettersmall} def
+               /Tabloid {11x17tray} def
+               /Ledger {ledgertray} def
+               /Legal {legaltray} def
+               /Statement {statementtray} def
+               /Executive {executivetray} def
+               /A3 {a3tray} def
+               /A4 {a4tray} def
+               /A4Small {a4tray a4small} def
+               /B4 {b4tray} def
+               /B5 {b5tray} def
+               /unknown {unknown} def
+       papersizedict dup papername known {papername} {/unknown} ifelse get
+       end
+       /FMdicttop countdictstack 1 add def
+       statusdict begin stopped end 
+       countdictstack -1 FMdicttop {pop end} for
+       } def
+/manualpapersize {
+       papersizedict begin
+               /Letter {letter} def
+               /LetterSmall {lettersmall} def
+               /Tabloid {11x17} def
+               /Ledger {ledger} def
+               /Legal {legal} def
+               /Statement {statement} def
+               /Executive {executive} def
+               /A3 {a3} def
+               /A4 {a4} def
+               /A4Small {a4small} def
+               /B4 {b4} def
+               /B5 {b5} def
+               /unknown {unknown} def
+       papersizedict dup papername known {papername} {/unknown} ifelse get
+       end
+       stopped 
+       } def
+/desperatepapersize {
+       statusdict /setpageparams known
+               {
+               paperwidth paperheight 0 1 
+               statusdict begin
+               {setpageparams} stopped pop 
+               end
+               } if
+       } def
+/savematrix {
+       orgmatrix currentmatrix pop
+       } bind def
+/restorematrix {
+       orgmatrix setmatrix
+       } bind def
+/dmatrix matrix def
+/dpi    72 0 dmatrix defaultmatrix dtransform
+    dup mul exch   dup mul add   sqrt def
+/freq dpi 18.75 div 8 div round dup 0 eq {pop 1} if 8 mul dpi exch div def
+/sangle 1 0 dmatrix defaultmatrix dtransform exch atan def
+/DiacriticEncoding [
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl
+/numbersign /dollar /percent /ampersand /quotesingle /parenleft
+/parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
+/two /three /four /five /six /seven /eight /nine /colon /semicolon
+/less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K
+/L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash
+/bracketright /asciicircum /underscore /grave /a /b /c /d /e /f /g /h
+/i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar
+/braceright /asciitilde /.notdef /Adieresis /Aring /Ccedilla /Eacute
+/Ntilde /Odieresis /Udieresis /aacute /agrave /acircumflex /adieresis
+/atilde /aring /ccedilla /eacute /egrave /ecircumflex /edieresis
+/iacute /igrave /icircumflex /idieresis /ntilde /oacute /ograve
+/ocircumflex /odieresis /otilde /uacute /ugrave /ucircumflex
+/udieresis /dagger /.notdef /cent /sterling /section /bullet
+/paragraph /germandbls /registered /copyright /trademark /acute
+/dieresis /.notdef /AE /Oslash /.notdef /.notdef /.notdef /.notdef
+/yen /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
+/ordfeminine /ordmasculine /.notdef /ae /oslash /questiondown
+/exclamdown /logicalnot /.notdef /florin /.notdef /.notdef
+/guillemotleft /guillemotright /ellipsis /.notdef /Agrave /Atilde
+/Otilde /OE /oe /endash /emdash /quotedblleft /quotedblright
+/quoteleft /quoteright /.notdef /.notdef /ydieresis /Ydieresis
+/fraction /currency /guilsinglleft /guilsinglright /fi /fl /daggerdbl
+/periodcentered /quotesinglbase /quotedblbase /perthousand
+/Acircumflex /Ecircumflex /Aacute /Edieresis /Egrave /Iacute
+/Icircumflex /Idieresis /Igrave /Oacute /Ocircumflex /.notdef /Ograve
+/Uacute /Ucircumflex /Ugrave /dotlessi /circumflex /tilde /macron
+/breve /dotaccent /ring /cedilla /hungarumlaut /ogonek /caron
+] def
+/ReEncode { 
+       dup 
+       length 
+       dict begin 
+       {
+       1 index /FID ne 
+               {def} 
+               {pop pop} ifelse 
+       } forall
+       Encoding StandardEncoding eq 
+       {
+               /Encoding DiacriticEncoding def
+       }if
+       currentdict 
+       end 
+       } bind def
+/graymode true def
+       /bwidth FMLOCAL
+       /bpside FMLOCAL
+       /bstring FMLOCAL
+       /onbits FMLOCAL
+       /offbits FMLOCAL
+       /xindex FMLOCAL
+       /yindex FMLOCAL
+       /x FMLOCAL
+       /y FMLOCAL
+/setpattern {
+        /bwidth  exch def
+        /bpside  exch def
+        /bstring exch def
+        /onbits 0 def  /offbits 0 def
+        freq sangle landscape {90 add} if 
+               {/y exch def
+                /x exch def
+                /xindex x 1 add 2 div bpside mul cvi def
+                /yindex y 1 add 2 div bpside mul cvi def
+                bstring yindex bwidth mul xindex 8 idiv add get
+                1 7 xindex 8 mod sub bitshift and 0 ne
+                {/onbits  onbits  1 add def 1}
+                {/offbits offbits 1 add def 0}
+                ifelse
+               }
+               setscreen
+        {} settransfer
+        offbits offbits onbits add div FMsetgray
+       /graymode false def
+       } bind def
+/grayness {
+       FMsetgray
+       graymode not {
+               /graymode true def
+               orgxfer cvx settransfer
+               orgfreq organgle orgproc cvx setscreen
+               } if
+       } bind def
+       /HUE FMLOCAL
+       /SAT FMLOCAL
+       /BRIGHT FMLOCAL
+       /Colors FMLOCAL
+FMPrintInColor 
+       
+       {
+       /HUE 0 def
+       /SAT 0 def
+       /BRIGHT 0 def
+       % array of arrays Hue and Sat values for the separations [HUE BRIGHT]
+       /Colors   
+       [[0    0  ]    % black
+        [0    0  ]    % white
+        [0.00 1.0]    % red
+        [0.37 1.0]    % green
+        [0.60 1.0]    % blue
+        [0.50 1.0]    % cyan
+        [0.83 1.0]    % magenta
+        [0.16 1.0]    % comment / yellow
+        ] def
+      
+       /BEGINBITMAPCOLOR { 
+               BITMAPCOLOR} def
+       /BEGINBITMAPCOLORc { 
+               BITMAPCOLORc} def
+       /K { 
+               Colors exch get dup
+               0 get /HUE exch store 
+               1 get /BRIGHT exch store
+                 HUE 0 eq BRIGHT 0 eq and
+                       {1.0 SAT sub setgray}
+                       {HUE SAT BRIGHT sethsbcolor} 
+                 ifelse
+               } def
+       /FMsetgray { 
+               /SAT exch 1.0 exch sub store 
+                 HUE 0 eq BRIGHT 0 eq and
+                       {1.0 SAT sub setgray}
+                       {HUE SAT BRIGHT sethsbcolor} 
+                 ifelse
+               } bind def
+       }
+       
+       {
+       /BEGINBITMAPCOLOR { 
+               BITMAPGRAY} def
+       /BEGINBITMAPCOLORc { 
+               BITMAPGRAYc} def
+       /FMsetgray {setgray} bind def
+       /K { 
+               pop
+               } def
+       }
+ifelse
+/normalize {
+       transform round exch round exch itransform
+       } bind def
+/dnormalize {
+       dtransform round exch round exch idtransform
+       } bind def
+/lnormalize { 
+       0 dtransform exch cvi 2 idiv 2 mul 1 add exch idtransform pop
+       } bind def
+/H { 
+       lnormalize setlinewidth
+       } bind def
+/Z {
+       setlinecap
+       } bind def
+/X { 
+       fillprocs exch get exec
+       } bind def
+/V { 
+       gsave eofill grestore
+       } bind def
+/N { 
+       stroke
+       } bind def
+/M {newpath moveto} bind def
+/E {lineto} bind def
+/D {curveto} bind def
+/O {closepath} bind def
+       /n FMLOCAL
+/L { 
+       /n exch def
+       newpath
+       normalize
+       moveto 
+       2 1 n {pop normalize lineto} for
+       } bind def
+/Y { 
+       L 
+       closepath
+       } bind def
+       /x1 FMLOCAL
+       /x2 FMLOCAL
+       /y1 FMLOCAL
+       /y2 FMLOCAL
+       /rad FMLOCAL
+/R { 
+       /y2 exch def
+       /x2 exch def
+       /y1 exch def
+       /x1 exch def
+       x1 y1
+       x2 y1
+       x2 y2
+       x1 y2
+       4 Y 
+       } bind def
+/RR { 
+       /rad exch def
+       normalize
+       /y2 exch def
+       /x2 exch def
+       normalize
+       /y1 exch def
+       /x1 exch def
+       newpath
+       x1 y1 rad add moveto
+       x1 y2 x2 y2 rad arcto
+       x2 y2 x2 y1 rad arcto
+       x2 y1 x1 y1 rad arcto
+       x1 y1 x1 y2 rad arcto
+       closepath
+       16 {pop} repeat
+       } bind def
+/C { 
+       grestore
+       gsave
+       R 
+       clip
+       } bind def
+/U { 
+       grestore
+       gsave
+       } bind def
+/F { 
+       FMfonts exch get
+       setfont
+       } bind def
+/T { 
+       moveto show
+       } bind def
+/RF { 
+       rotate
+       0 ne {-1 1 scale} if
+       } bind def
+/TF { 
+       gsave
+       moveto 
+       RF
+       show
+       grestore
+       } bind def
+/P { 
+       moveto
+       0 32 3 2 roll widthshow
+       } bind def
+/PF { 
+       gsave
+       moveto 
+       RF
+       0 32 3 2 roll widthshow
+       grestore
+       } bind def
+/S { 
+       moveto
+       0 exch ashow
+       } bind def
+/SF { 
+       gsave
+       moveto
+       RF
+       0 exch ashow
+       grestore
+       } bind def
+/B { 
+       moveto
+       0 32 4 2 roll 0 exch awidthshow
+       } bind def
+/BF { 
+       gsave
+       moveto
+       RF
+       0 32 4 2 roll 0 exch awidthshow
+       grestore
+       } bind def
+       /x FMLOCAL
+       /y FMLOCAL
+       /dx FMLOCAL
+       /dy FMLOCAL
+       /dl FMLOCAL
+       /t FMLOCAL
+       /t2 FMLOCAL
+       /Cos FMLOCAL
+       /Sin FMLOCAL
+       /r FMLOCAL
+/W { 
+       dnormalize
+       /dy exch def
+       /dx exch def
+       normalize
+       /y  exch def
+       /x  exch def
+       /dl dx dx mul dy dy mul add sqrt def
+       dl 0.0 gt {
+               /t currentlinewidth def
+               savematrix
+               /Cos dx dl div def
+               /Sin dy dl div def
+               /r [Cos Sin Sin neg Cos 0.0 0.0] def
+               /t2 t 2.5 mul 3.5 max def
+               newpath
+               x y translate
+               r concat
+               0.0 0.0 moveto
+               dl t 2.7 mul sub 0.0 rlineto
+               stroke
+               restorematrix
+               x dx add y dy add translate
+               r concat
+               t 0.67 mul setlinewidth
+               t 1.61 mul neg  0.0 translate
+               0.0 0.0 moveto
+               t2 1.7 mul neg  t2 2.0 div     moveto
+               0.0 0.0 lineto
+               t2 1.7 mul neg  t2 2.0 div neg lineto
+               stroke
+               t setlinewidth
+               restorematrix
+               } if
+       } bind def
+/G { 
+       gsave
+       newpath
+       normalize translate 0.0 0.0 moveto 
+       dnormalize scale 
+       0.0 0.0 1.0 5 3 roll arc 
+       closepath fill
+       grestore
+       } bind def
+/A { 
+       gsave
+       savematrix
+       newpath
+       2 index 2 div add exch 3 index 2 div sub exch 
+       normalize 2 index 2 div sub exch 3 index 2 div add exch 
+       translate 
+       scale 
+       0.0 0.0 1.0 5 3 roll arc 
+       restorematrix
+       stroke
+       grestore
+       } bind def
+       /x FMLOCAL
+       /y FMLOCAL
+       /w FMLOCAL
+       /h FMLOCAL
+       /xx FMLOCAL
+       /yy FMLOCAL
+       /ww FMLOCAL
+       /hh FMLOCAL
+       /FMsaveobject FMLOCAL
+       /FMoptop FMLOCAL
+       /FMdicttop FMLOCAL
+/BEGINPRINTCODE { 
+       /FMdicttop countdictstack 1 add def 
+       /FMoptop count 4 sub def 
+       /FMsaveobject save def
+       userdict begin 
+       /showpage {} def 
+       FMNORMALIZEGRAPHICS 
+       3 index neg 3 index neg translate
+       } bind def
+/ENDPRINTCODE {
+       count -1 FMoptop {pop pop} for 
+       countdictstack -1 FMdicttop {pop end} for 
+       FMsaveobject restore 
+       } bind def
+/gn { 
+       0 
+       {       46 mul 
+               cf read pop 
+               32 sub 
+               dup 46 lt {exit} if 
+               46 sub add 
+               } loop
+       add 
+       } bind def
+       /str FMLOCAL
+/cfs { 
+       /str sl string def 
+       0 1 sl 1 sub {str exch val put} for 
+       str def 
+       } bind def
+/ic [ 
+       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0223
+       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0223
+       0
+       {0 hx} {1 hx} {2 hx} {3 hx} {4 hx} {5 hx} {6 hx} {7 hx} {8 hx} {9 hx}
+       {10 hx} {11 hx} {12 hx} {13 hx} {14 hx} {15 hx} {16 hx} {17 hx} {18 hx}
+       {19 hx} {gn hx} {0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12}
+       {13} {14} {15} {16} {17} {18} {19} {gn} {0 wh} {1 wh} {2 wh} {3 wh}
+       {4 wh} {5 wh} {6 wh} {7 wh} {8 wh} {9 wh} {10 wh} {11 wh} {12 wh}
+       {13 wh} {14 wh} {gn wh} {0 bl} {1 bl} {2 bl} {3 bl} {4 bl} {5 bl} {6 bl}
+       {7 bl} {8 bl} {9 bl} {10 bl} {11 bl} {12 bl} {13 bl} {14 bl} {gn bl}
+       {0 fl} {1 fl} {2 fl} {3 fl} {4 fl} {5 fl} {6 fl} {7 fl} {8 fl} {9 fl}
+       {10 fl} {11 fl} {12 fl} {13 fl} {14 fl} {gn fl}
+       ] def
+       /sl FMLOCAL
+       /val FMLOCAL
+       /ws FMLOCAL
+       /im FMLOCAL
+       /bs FMLOCAL
+       /cs FMLOCAL
+       /len FMLOCAL
+       /pos FMLOCAL
+/ms { 
+       /sl exch def 
+       /val 255 def 
+       /ws cfs 
+       /im cfs 
+       /val 0 def 
+       /bs cfs 
+       /cs cfs 
+       } bind def
+400 ms 
+/ip { 
+       is 
+       0 
+       cf cs readline pop 
+       {       ic exch get exec 
+               add 
+               } forall 
+       pop 
+       
+       } bind def
+/wh { 
+       /len exch def 
+       /pos exch def 
+       ws 0 len getinterval im pos len getinterval copy pop
+       pos len 
+       } bind def
+/bl { 
+       /len exch def 
+       /pos exch def 
+       bs 0 len getinterval im pos len getinterval copy pop
+       pos len 
+       } bind def
+/s1 1 string def
+/fl { 
+       /len exch def 
+       /pos exch def 
+       /val cf s1 readhexstring pop 0 get def
+       pos 1 pos len add 1 sub {im exch val put} for
+       pos len 
+       } bind def
+/hx { 
+       3 copy getinterval 
+       cf exch readhexstring pop pop 
+       } bind def
+       /h FMLOCAL
+       /w FMLOCAL
+       /d FMLOCAL
+       /lb FMLOCAL
+       /bitmapsave FMLOCAL
+       /is FMLOCAL
+       /cf FMLOCAL
+/wbytes { 
+       dup 
+       8 eq {pop} {1 eq {7 add 8 idiv} {3 add 4 idiv} ifelse} ifelse
+       } bind def
+/BEGINBITMAPBWc { 
+       1 {} COMMONBITMAPc
+       } bind def
+/BEGINBITMAPGRAYc { 
+       8 {} COMMONBITMAPc
+       } bind def
+/BEGINBITMAP2BITc { 
+       2 {} COMMONBITMAPc
+       } bind def
+/COMMONBITMAPc { 
+       /r exch def
+       /d exch def
+       gsave
+       translate rotate scale /h exch def /w exch def
+       /lb w d wbytes def 
+       sl lb lt {lb ms} if 
+       /bitmapsave save def 
+       r                    
+       /is im 0 lb getinterval def 
+       ws 0 lb getinterval is copy pop 
+       /cf currentfile def 
+       w h d [w 0 0 h neg 0 h] 
+       {ip} image 
+       bitmapsave restore 
+       grestore
+       } bind def
+/BEGINBITMAPBW { 
+       1 {} COMMONBITMAP
+       } bind def
+/BEGINBITMAPGRAY { 
+       8 {} COMMONBITMAP
+       } bind def
+/BEGINBITMAP2BIT { 
+       2 {} COMMONBITMAP
+       } bind def
+/COMMONBITMAP { 
+       /r exch def
+       /d exch def
+       gsave
+       translate rotate scale /h exch def /w exch def
+       /bitmapsave save def 
+       r                    
+       /is w d wbytes string def
+       /cf currentfile def 
+       w h d [w 0 0 h neg 0 h] 
+       {cf is readhexstring pop} image
+       bitmapsave restore 
+       grestore
+       } bind def
+       /proc1 FMLOCAL
+       /proc2 FMLOCAL
+       /newproc FMLOCAL
+/Fmcc {
+    /proc2 exch cvlit def
+    /proc1 exch cvlit def
+    /newproc proc1 length proc2 length add array def
+    newproc 0 proc1 putinterval
+    newproc proc1 length proc2 putinterval
+    newproc cvx
+} bind def
+/ngrayt 256 array def
+/nredt 256 array def
+/nbluet 256 array def
+/ngreent 256 array def
+       /gryt FMLOCAL
+       /blut FMLOCAL
+       /grnt FMLOCAL
+       /redt FMLOCAL
+       /indx FMLOCAL
+       /cynu FMLOCAL
+       /magu FMLOCAL
+       /yelu FMLOCAL
+       /k FMLOCAL
+       /u FMLOCAL
+/colorsetup {
+       currentcolortransfer
+       /gryt exch def
+       /blut exch def
+       /grnt exch def
+       /redt exch def
+       0 1 255 {
+               /indx exch def
+               /cynu 1 red indx get 255 div sub def
+               /magu 1 green indx get 255 div sub def
+               /yelu 1 blue indx get 255 div sub def
+               /k cynu magu min yelu min def
+               /u k currentundercolorremoval exec def
+               nredt indx 1 0 cynu u sub max sub redt exec put
+               ngreent indx 1 0 magu u sub max sub grnt exec put
+               nbluet indx 1 0 yelu u sub max sub blut exec put
+               ngrayt indx 1 k currentblackgeneration exec sub gryt exec put
+       } for
+       {255 mul cvi nredt exch get}
+       {255 mul cvi ngreent exch get}
+       {255 mul cvi nbluet exch get}
+       {255 mul cvi ngrayt exch get}
+       setcolortransfer
+       {pop 0} setundercolorremoval
+       {} setblackgeneration
+       } bind def
+       /tran FMLOCAL
+/fakecolorsetup {
+       /tran 256 string def
+       0 1 255 {/indx exch def 
+               tran indx
+               red indx get 77 mul
+               green indx get 151 mul
+               blue indx get 28 mul
+               add add 256 idiv put} for
+       currenttransfer
+       {255 mul cvi tran exch get 255.0 div}
+       exch Fmcc settransfer
+} bind def
+/BITMAPCOLOR { 
+       /d 8 def
+       gsave
+       translate rotate scale /h exch def /w exch def
+       /bitmapsave save def 
+       colorsetup
+       /is w d wbytes string def
+       /cf currentfile def 
+       w h d [w 0 0 h neg 0 h] 
+       {cf is readhexstring pop} {is} {is} true 3 colorimage 
+       bitmapsave restore 
+       grestore
+       } bind def
+/BITMAPCOLORc { 
+       /d 8 def
+       gsave
+       translate rotate scale /h exch def /w exch def
+       /lb w d wbytes def 
+       sl lb lt {lb ms} if 
+       /bitmapsave save def 
+       colorsetup
+       /is im 0 lb getinterval def 
+       ws 0 lb getinterval is copy pop 
+       /cf currentfile def 
+       w h d [w 0 0 h neg 0 h] 
+       {ip} {is} {is} true 3 colorimage
+       bitmapsave restore 
+       grestore
+       } bind def
+/BITMAPGRAY { 
+       8 {fakecolorsetup} COMMONBITMAP
+       } bind def
+/BITMAPGRAYc { 
+       8 {fakecolorsetup} COMMONBITMAPc
+       } bind def
+/ENDBITMAP {
+       } bind def
+end 
+%%EndProlog
+%%BeginSetup
+(2.0) FMVERSION
+1 1 612 792 0 1 7 FMDOCUMENT
+/fillprocs 32 array def
+fillprocs 0 { 0.000000 grayness } put
+fillprocs 1 { 0.100000 grayness } put
+fillprocs 2 { 0.300000 grayness } put
+fillprocs 3 { 0.500000 grayness } put
+fillprocs 4 { 0.700000 grayness } put
+fillprocs 5 { 0.900000 grayness } put
+fillprocs 6 { 0.970000 grayness } put
+fillprocs 7 { 1.000000 grayness } put
+fillprocs 8 {<0f87c3e1f0783c1e> 8 1 setpattern } put
+fillprocs 9 {<0f1e3c78f0e1c387> 8 1 setpattern } put
+fillprocs 10 {<cccccccccccccccc> 8 1 setpattern } put
+fillprocs 11 {<ffff0000ffff0000> 8 1 setpattern } put
+fillprocs 12 {<8142241818244281> 8 1 setpattern } put
+fillprocs 13 {<8040201008040201> 8 1 setpattern } put
+fillprocs 14 {<03060c183060c081> 8 1 setpattern } put
+fillprocs 15 {} put
+fillprocs 16 { 1.000000 grayness } put
+fillprocs 17 { 0.900000 grayness } put
+fillprocs 18 { 0.700000 grayness } put
+fillprocs 19 { 0.500000 grayness } put
+fillprocs 20 { 0.300000 grayness } put
+fillprocs 21 { 0.100000 grayness } put
+fillprocs 22 { 0.030000 grayness } put
+fillprocs 23 { 0.000000 grayness } put
+fillprocs 24 {<f0783c1e0f87c3e1> 8 1 setpattern } put
+fillprocs 25 {<f0e1c3870f1e3c78> 8 1 setpattern } put
+fillprocs 26 {<3333333333333333> 8 1 setpattern } put
+fillprocs 27 {<0000ffff0000ffff> 8 1 setpattern } put
+fillprocs 28 {<7ebddbe7e7dbbd7e> 8 1 setpattern } put
+fillprocs 29 {<7fbfdfeff7fbfdfe> 8 1 setpattern } put
+fillprocs 30 {<fcf9f3e7cf9f3f7e> 8 1 setpattern } put
+fillprocs 31 {} put
+%%EndSetup
+0 12 /Times-Roman FMDEFINEFONT
+1 24 /Times-Roman FMDEFINEFONT
+2 16 /Times-Bold FMDEFINEFONT
+%%Page: "1" 1
+%%BeginPaperSize: Letter
+%%EndPaperSize
+612 792 0 FMBEGINPAGE
+72 675 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(Network Working Group) 72 712 T
+(J. Moy, Editor) 470.7 712 T
+(Request for Comments: 1245) 72 698 T
+(Proteon, Inc.) 478.38 698 T
+(July 1991) 493.02 684 T
+72 72 540 83.95 R
+7 X
+V
+0 X
+([Moy]) 72 75.95 T
+([Page 1]) 499.7 75.95 T
+72 117 540 603 R
+7 X
+V
+1 F
+0 X
+(OSPF protocol analysis) 192.72 587 T
+2 F
+(Status of this Memo) 72 514.33 T
+0 F
+-0.23 (This memo provides information for the Internet community) 72 487 P
+-0.23 (. It does not specify any Internet stan-) 360.42 487 P
+(dard. Distribution of this memo is unlimited.) 72 473 T
+2 F
+(Abstract) 72 447 T
+0 F
+-0.11 (This is the \336rst of two reports on the OSPF protocol. These reports 
are required by the IAB/IESG ) 72 421 P
+(in order for an Internet routing protocol to advance to Draft Standard 
Status. OSPF is a TCP/IP ) 72 407 T
+-0.28 (routing protocol, designed to be used internal to an Autonomous System 
\050in other words, OSPF is ) 72 393 P
+(an Interior Gateway Protocol\051.) 72 379 T
+-0.09 (V) 72 353 P
+-0.09 (ersion 1 of the OSPF protocol was published in RFC 1) 79.33 353 P
+-0.09 (131. Since then OSPF version 2 has been ) 339.85 353 P
+-0.22 (developed. V) 72 339 P
+-0.22 (ersion 2 has been documented in RFC 1247. The changes between version 1 
and ver-) 134.4 339 P
+-0 (sion 2 of the OSPF protocol are explained in Appendix F of RFC 1247. It is 
OSPF V) 72 325 P
+-0 (ersion 2 that ) 477.72 325 P
+(is the subject of this report.) 72 311 T
+(This report attempts to summarize the key features of OSPF V2. It also 
attempts to analyze how ) 72 285 T
+(the protocol will perform and scale in the Internet.) 72 271 T
+(Please send comments to address@hidden) 72 245 T
+(.umd.edu.) 258.27 245 T
+FMENDPAGE
+%%EndPage: "1" 2
+1 10 /Times-Roman FMDEFINEFONT
+%%Page: "2" 2
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 2]) 499.7 73 T
+72 108 540 684 R
+7 X
+V
+2 F
+0 X
+(T) 72 673.33 T
+(able of Contents) 81.19 673.33 T
+0 F
+(1.0) 72 650 T
+(Introduction) 108 650 T
+(..............................................................................................................)
 167.91 650 T
+(3) 498 650 T
+1 F
+(1.1) 108 635.33 T
+(Acknowledgments) 144 635.33 T
+(...............................................................................................................)
 219.88 635.33 T
+(3) 499 635.33 T
+0 F
+(2.0) 72 616 T
+(Key features of the OSPF protocol) 108 616 T
+(..........................................................................) 
275.85 616 T
+(4) 498 616 T
+(3.0) 72 596 T
+(Cost of the protocol) 108 596 T
+(..................................................................................................)
 203.89 596 T
+(7) 498 596 T
+1 F
+(3.1) 108 581.33 T
+( Operational data) 144 581.33 T
+(.................................................................................................................)
 214.88 581.33 T
+(7) 499 581.33 T
+(3.2) 108 567.33 T
+(Link bandwidth) 144 567.33 T
+(...................................................................................................................)
 209.88 567.33 T
+(9) 499 567.33 T
+(3.3) 108 553.33 T
+(Router memory) 144 553.33 T
+(....................................................................................................................)
 207.39 553.33 T
+(9) 499 553.33 T
+(3.4) 108 539.33 T
+(Router CPU) 144 539.33 T
+(.......................................................................................................................)
 194.89 539.33 T
+(10) 494.01 539.33 T
+(3.5) 108 525.33 T
+(Role of Designated Router) 144 525.33 T
+(................................................................................................)
 252.36 525.33 T
+(1) 494.38 525.33 T
+(1) 499 525.33 T
+(3.6) 108 511.33 T
+(Summary) 144 511.33 T
+(...........................................................................................................................)
 184.9 511.33 T
+(1) 494.38 511.33 T
+(1) 499 511.33 T
+0 F
+(4.0) 72 492 T
+(Suitable environments) 108 492 T
+(............................................................................................)
 215.88 492 T
+(13) 492.01 492 T
+(5.0) 72 472 T
+(Unsuitable environments) 108 472 T
+(.......................................................................................)
 230.87 472 T
+(13) 492.01 472 T
+(6.0) 72 452 T
+(Reference Documents) 108 452 T
+(............................................................................................)
 215.88 452 T
+(14) 492.01 452 T
+FMENDPAGE
+%%EndPage: "2" 3
+3 14 /Times-Bold FMDEFINEFONT
+%%Page: "3" 3
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 3]) 499.7 73 T
+72 108 540 684 R
+7 X
+V
+2 F
+0 X
+(1.0  Intr) 72 673.33 T
+(oduction) 127.23 673.33 T
+0 F
+-0.02 (This document addresses, for OSPF V2, the requirements set forth by the 
IAB/IESG for an Inter-) 72 646 P
+-0.19 (net routing protocol to advance to Draft Standard state. This 
requirements are brie\337y summarized ) 72 632 P
+(below) 72 618 T
+(. The remaining sections of this report document how OSPF V2 satis\336es 
these require-) 100.53 618 T
+(ments:) 72 604 T
+(\245) 72 584 T
+(What are the key features and algorithms of the protocol?) 85.54 584 T
+(\245) 72 564 T
+(How much link bandwidth, router memory and router CPU cycles does the 
protocol consume ) 85.54 564 T
+(under normal conditions?) 85.54 550 T
+(\245) 72 530 T
+(For these metrics, how does the usage scale as the routing environment grows? 
This should ) 85.54 530 T
+(include topologies at least an order of magnitude lar) 85.54 516 T
+(ger than the current environment.) 335.14 516 T
+(\245) 72 496 T
+(What are the limits of the protocol for these metrics? \050i.e., when will 
the routing protocol ) 85.54 496 T
+(break?\051 ) 85.54 482 T
+(\245) 72 462 T
+(For what environments is the protocol well suited, and for what is it not 
suitable? ) 85.54 462 T
+3 F
+(1.1  Acknowledgments) 72 428.67 T
+0 F
+-0.03 (The OSPF protocol has been developed by the OSPF W) 72 402 P
+-0.03 (orking Group of the Internet Engineering ) 339.64 402 P
+(T) 72 388 T
+(ask Force. ) 78.49 388 T
+FMENDPAGE
+%%EndPage: "3" 4
+4 12 /Times-Bold FMDEFINEFONT
+%%Page: "4" 4
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 4]) 499.7 73 T
+72 108 540 684 R
+7 X
+V
+2 F
+0 X
+(2.0  Key featur) 72 673.33 T
+(es of the OSPF pr) 172.97 673.33 T
+(otocol) 293.49 673.33 T
+0 F
+(This section summarizes the key features of the OSPF protocol. OSPF is an) 72 
646 T
+4 F
+( Internal gateway ) 434.78 646 T
+-0.2 (pr) 72 632 P
+-0.2 (otocol) 83.78 632 P
+0 F
+-0.2 (; it is designed to be used internal to a single Autonomous System. OSPF 
uses) 114.42 632 P
+4 F
+-0.2 ( link-state ) 486.43 632 P
+-0.36 (or SPF-based) 72 618 P
+0 F
+-0.36 ( technology \050as compared to the distance-vector or Bellman-Ford 
technology found ) 140.6 618 P
+-0.48 (in routing protocols such as RIP\051. Individual ) 72 604 P
+4 F
+-0.48 (link state advertisements \050LSAs\051) 285.2 604 P
+0 F
+-0.48 ( describe pieces of ) 449.99 604 P
+-0.13 (the OSPF routing domain \050Autonomous System\051. These LSAs are 
\337ooded throughout the routing ) 72 590 P
+(domain, forming the ) 72 576 T
+4 F
+(link state database) 173.27 576 T
+0 F
+(. Each router has an identical link state database; syn-) 268.56 576 T
+(chronization of link state databases is maintained via a ) 72 562 T
+4 F
+(r) 336.81 562 T
+(eliable \337ooding algorithm) 341.92 562 T
+0 F
+(. From this ) 473.2 562 T
+(link state database, each router builds a routing table by calculating a 
shortest-path tree, with the ) 72 548 T
+(root of the tree being the calculating router itself. This calculation is 
commonly referred to as the ) 72 534 T
+4 F
+(Dijkstra pr) 72 520 T
+(ocedur) 129.41 520 T
+(e) 164.51 520 T
+0 F
+(.) 169.83 520 T
+(Link state advertisements are small. Each advertisement describes a small 
pieces of the OSPF ) 72 494 T
+(routing domain, namely either: the neighborhood of a single router) 72 480 T
+(, the neighborhood of a single ) 391.97 480 T
+(transit network, a single inter) 72 466 T
+(-area route \050see below\051 or a single external route.) 212 466 T
+(The other key features of the OSPF protocol are:) 72 440 T
+(\245) 72 420 T
+4 F
+-0.31 (Adjacency bringup) 85.54 420 P
+0 F
+-0.31 (. ) 183.51 420 P
+4 F
+-0.31 (Certain pairs of OSPF r) 189.2 420 P
+-0.31 (outers become \322adjacent\323) 311.01 420 P
+0 F
+-0.31 (. As an adjacency is ) 442.96 420 P
+(formed, the two routers synchronize their link state databases by ) 85.54 406 
T
+4 F
+(exchanging database sum-) 397.64 406 T
+(maries) 85.54 392 T
+0 F
+( in the form of OSPF Database Exchange packets. Adjacent routers then 
maintain syn-) 120.17 392 T
+(chronization of their link state databases through the ) 85.54 378 T
+4 F
+(r) 340.02 378 T
+(eliable \337ooding algorithm) 345.13 378 T
+0 F
+(. Routers ) 476.41 378 T
+-0.27 (connected by serial lines always become adjacent. On multi-access 
networks \050e.g., ethernets or ) 85.54 364 P
+(X.25 PDNs\051, all routers attached to the network become adjacent to both 
the Designated ) 85.54 350 T
+(Router and the Backup Designated router) 85.54 336 T
+(.) 283.73 336 T
+(\245) 72 316 T
+4 F
+-0.02 (Designated r) 85.54 316 P
+-0.02 (outer) 150.26 316 P
+-0.02 (.) 176.46 316 P
+0 F
+-0.02 ( A Designated Router is elected on all multi-access networks \050e.g., 
ether-) 179.46 316 P
+(nets or X.25 PDNs\051. The network\325) 85.54 302 T
+(s Designated Router ) 250.42 302 T
+4 F
+(originates the network LSA) 350.69 302 T
+0 F
+( describ-) 492.27 302 T
+(ing the network\325) 85.54 288 T
+(s local environment. It also plays a ) 164.15 288 T
+4 F
+(special r) 334.04 288 T
+(ole in the \337ooding algorithm) 376.8 288 T
+0 F
+(, ) 521.4 288 T
+(since all routers on the network are synchronizing their link state databases 
by sending and ) 85.54 274 T
+(receiving LSAs to/from the Designated Router during the \337ooding process.) 
85.54 260 T
+(\245) 72 240 T
+4 F
+-0.46 (Backup Designated Router) 85.54 240 P
+0 F
+-0.46 (. A Backup Designated Router is elected on multi-access networks ) 
221.87 240 P
+(to speed/ease the transition of Designated Routers when the current 
Designated Router disap-) 85.54 226 T
+(pears. In that event, the Backup DR takes over) 85.54 212 T
+(, and does not need to go through the adjacency ) 308.22 212 T
+-0.13 (bringup process on the LAN \050since it already had done this in its 
Backup capacity\051. Also, even ) 85.54 198 P
+(before the disappearance of the Designated Router is noticed, the Backup DR 
will enable the ) 85.54 184 T
+(reliable \337ooding algorithm to proceed in the DR\325) 85.54 170 T
+(s absence.) 320.39 170 T
+FMENDPAGE
+%%EndPage: "4" 5
+%%Page: "5" 5
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 5]) 499.7 73 T
+72 108 540 684 R
+7 X
+V
+0 X
+(\245) 72 676 T
+4 F
+(Non-br) 85.54 676 T
+(oadcast multi-access network support.) 122.63 676 T
+0 F
+( OSPF treats these networks \050e.g., X.25 ) 318.51 676 T
+-0.01 (PDNs\051 pretty much as if they were LANs \050i.e., a DR is elected, 
and a network LSA is gener-) 85.54 662 P
+-0.29 (ated\051. Additional con\336guration information is needed however for 
routers attached to these net-) 85.54 648 P
+(work to initially \336nd each other) 85.54 634 T
+(.) 236.45 634 T
+(\245) 72 614 T
+4 F
+(OSPF ar) 85.54 614 T
+(eas) 130.29 614 T
+0 F
+(. OSPF allows the Autonomous Systems to be broken up into regions call areas. 
) 146.28 614 T
+(This is useful for several reasons. First, it provides an extra level of ) 
85.54 600 T
+4 F
+(r) 411.64 600 T
+(outing pr) 416.75 600 T
+(otection) 464.18 600 T
+0 F
+(: rout-) 504.81 600 T
+-0.29 (ing within an area is protected from all information external to the 
area. Second, by splitting an ) 85.54 586 P
+-0.3 (Autonomous System into areas the ) 85.54 572 P
+4 F
+-0.3 (cost of the Dijkstra pr) 254.27 572 P
+-0.3 (ocedur) 365.44 572 P
+-0.3 (e ) 400.53 572 P
+0 F
+-0.3 (\050in terms of CPU cycles\051 is ) 408.55 572 P
+(reduced.) 85.54 558 T
+(\245) 72 538 T
+4 F
+(Flexible import of external r) 85.54 538 T
+(outing information.) 230.55 538 T
+0 F
+( In OSPF) 330.5 538 T
+(, ) 374.19 538 T
+4 F
+(each external r) 380.19 538 T
+(oute) 456.58 538 T
+0 F
+( is imported ) 478.56 538 T
+(into the Autonomous System in ) 85.54 524 T
+4 F
+(a separate LSA) 240.47 524 T
+0 F
+(. This reduces the amount of \337ooding traf) 319.08 524 T
+(\336c ) 518.07 524 T
+(\050since external routes change often, and you want to only \337ood the 
changes\051. It also enables ) 85.54 510 T
+4 F
+-0.43 (partial r) 85.54 496 P
+-0.43 (outing table updates) 127.86 496 P
+0 F
+-0.43 ( when only a single external route changes. OSPF external LSAs ) 230.96 
496 P
+(also provide the following features. A ) 85.54 482 T
+4 F
+(forwarding addr) 270.4 482 T
+(ess) 355.81 482 T
+0 F
+( can be included in the external ) 370.46 482 T
+(LSA, eliminating extra-hops at the edge of the Autonomous System. There are 
two levels of ) 85.54 468 T
+(external metrics that can be speci\336ed, ) 85.54 454 T
+4 F
+(type 1) 269.06 454 T
+0 F
+( and ) 300.04 454 T
+4 F
+(type 2) 323.35 454 T
+0 F
+(. Also, external routes can be tagged ) 354.33 454 T
+(with a 32-bit number \050the ) 85.54 440 T
+4 F
+(external r) 211.12 440 T
+(oute tag) 261.19 440 T
+0 F
+(; commonly used as an AS number of the route\325) 302.16 440 T
+(s ) 531.68 440 T
+(origin\051, simplifying external route management in a transit Autonomous 
System.) 85.54 426 T
+(\245) 72 406 T
+4 F
+(Four level r) 85.54 406 T
+(outing hierar) 145.27 406 T
+(chy) 212.69 406 T
+0 F
+(. OSPF has a four level routing hierarchy) 229.9 406 T
+(, or trust model: ) 426.32 406 T
+4 F
+(intra-) 505.94 406 T
+(ar) 85.54 392 T
+(ea) 96.64 392 T
+0 F
+(, ) 107.96 392 T
+4 F
+(inter) 113.96 392 T
+(-ar) 138.16 392 T
+(ea) 153.26 392 T
+0 F
+(, ) 164.59 392 T
+4 F
+(external type 1) 170.58 392 T
+0 F
+( and ) 246.52 392 T
+4 F
+(external type 2) 269.84 392 T
+0 F
+( routes. This enables multiple levels of ) 345.78 392 T
+(routing protection, and simpli\336es routing management in an Autonomous 
System.) 85.54 378 T
+(\245) 72 358 T
+4 F
+(V) 85.54 358 T
+(irtual links) 93.75 358 T
+0 F
+(. By allowing the con\336guration of virtual links, OSPF ) 150.07 358 T
+4 F
+(r) 410.94 358 T
+(emoves topological ) 416.05 358 T
+(r) 85.54 344 T
+(estrictions) 90.64 344 T
+0 F
+( on area layout in an Autonomous System.) 143.27 344 T
+(\245) 72 324 T
+4 F
+-0.32 (Authentication of r) 85.54 324 P
+-0.32 (outing pr) 182.62 324 P
+-0.32 (otocol exchanges) 229.74 324 P
+0 F
+-0.32 (. Every time an OSPF router receives a routing ) 315.03 324 P
+(protocol packet, it authenticates the packet before processing it further) 
85.54 310 T
+(.) 422.61 310 T
+(\245) 72 290 T
+4 F
+-0.03 (Flexible r) 85.54 290 P
+-0.03 (outing metric.) 134.26 290 P
+0 F
+-0.03 ( In OSPF) 206.18 290 P
+-0.03 (, metric are assigned to outbound router interfaces. The cost ) 249.82 
290 P
+(of a path is then the sum of the path\325) 85.54 276 T
+(s component interfaces. The routing metric itself can be ) 260.42 276 T
+(assigned by the system administrator to indicate any combination of network 
characteristics ) 85.54 262 T
+(\050e.g., delay) 85.54 248 T
+(, bandwidth, dollar cost, etc.\051.) 138.04 248 T
+(\245) 72 228 T
+4 F
+-0.09 (Equal-cost multipath.) 85.54 228 P
+0 F
+-0.09 ( When multiple best cost routes to a destination exist, OSPF \336nds 
them ) 196.73 228 P
+(and they can be then used to load share traf) 85.54 214 T
+(\336c to the destination.) 292.82 214 T
+(\245) 72 194 T
+4 F
+(T) 85.54 194 T
+(OS-based r) 93.32 194 T
+(outing.) 150.74 194 T
+0 F
+( Separate sets of routes can be calculated for each IP type of service. For ) 
186.4 194 T
+(example, low delay traf) 85.54 180 T
+(\336c could be routed on one path, while high bandwidth traf) 198.56 180 T
+(\336c is routed ) 477.16 180 T
+-0.39 (on another) 85.54 166 P
+-0.39 (. This is done by \050optionally\051 assigning, to each outgoing router 
interface, one metric ) 135.44 166 P
+(for each IP T) 85.54 152 T
+(OS.) 148.26 152 T
+(\245) 72 132 T
+4 F
+(V) 85.54 132 T
+(ariable-length subnet support.) 93.09 132 T
+0 F
+( OSPF includes support for variable-length subnet masks by ) 248.02 132 T
+(carrying a network mask with each advertised destination.) 85.54 118 T
+FMENDPAGE
+%%EndPage: "5" 6
+%%Page: "6" 6
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 6]) 499.7 73 T
+72 108 540 684 R
+7 X
+V
+0 X
+(\245) 72 676 T
+4 F
+-0.08 (Stub ar) 85.54 676 P
+-0.08 (ea support. ) 123.56 676 P
+0 F
+-0.08 (T) 183.69 676 P
+-0.08 (o support routers having insuf) 190.18 676 P
+-0.08 (\336cient memory) 333.53 676 P
+-0.08 (, areas can be con\336gured as ) 405.63 676 P
+(stubs. External LSAs \050often making up the bulk of the Autonomous 
System\051 are not \337ooded ) 85.54 662 T
+(into/throughout stub areas. Routing to external destinations in stub areas is 
based solely on ) 85.54 648 T
+(default.) 85.54 634 T
+FMENDPAGE
+%%EndPage: "6" 7
+%%Page: "7" 7
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 7]) 499.7 73 T
+72 108 540 684 R
+7 X
+V
+2 F
+0 X
+(3.0  Cost of the pr) 72 673.33 T
+(otocol) 193.4 673.33 T
+0 F
+-0.1 (This section attempts to analyze how the OSPF protocol will perform and 
scale in the Internet. In ) 72 646 P
+(this analysis, we will concentrate on the following four areas:) 72 632 T
+(\245) 72 612 T
+4 F
+(Link bandwidth) 85.54 612 T
+0 F
+(. In OSPF) 168.53 612 T
+(, a reliable \337ooding mechanism is used to ensure that router link ) 215.22 
612 T
+(state databases are remained synchronized. Individual components of the link 
state databases ) 85.54 598 T
+-0.17 (\050the LSAs\051 are refreshed infrequently \050every 30 minutes\051, 
at least in the absence of topological ) 85.54 584 P
+(changes. Still, as the size of the database increases, the amount of link 
bandwidth used by the ) 85.54 570 T
+(\337ooding procedure also increases.) 85.54 556 T
+(\245) 72 536 T
+4 F
+-0.03 (Router memory) 85.54 536 P
+0 F
+-0.03 (. The size of an OSPF link state database can get quite lar) 166.32 536 
P
+-0.03 (ge, especially in the ) 441.86 536 P
+(presence of many external LSAs. This imposes requirements on the amount of 
router memory ) 85.54 522 T
+(available.) 85.54 508 T
+(\245) 72 488 T
+4 F
+(CPU usage) 85.54 488 T
+0 F
+(. In OSPF) 141.83 488 T
+(, this is dominated by the length of time it takes to run the shortest path ) 
188.52 488 T
+(calculation \050Dijkstra procedure\051. This is a function of the number of 
routers in the OSPF sys-) 85.54 474 T
+(tem.) 85.54 460 T
+(\245) 72 440 T
+4 F
+(Role of the Designated Router) 85.54 440 T
+(.) 238.32 440 T
+0 F
+( The Designated router receives and sends more packets on a ) 241.32 440 T
+-0.46 (multi-access networks than the other routers connected to the network. 
Also, there is some time ) 85.54 426 P
+(involved in cutting over to a new Designated Router after the old one fails 
\050especially when ) 85.54 412 T
+(both the Backup Designated Router and the Designated Router fail at the same 
time\051. For this ) 85.54 398 T
+-0.27 (reason, it is possible that you may want to limit the number of routers 
connected to a single net-) 85.54 384 P
+(work.) 85.54 370 T
+(The remaining section will analyze these areas, estimating how much resources 
the OSPF proto-) 72 344 T
+-0.05 (col will consume, both now and in the future. T) 72 330 P
+-0.05 (o aid in this analysis, the next section will present ) 298.93 330 P
+(some data that have been collected in actual OSPF \336eld deployments.) 72 
316 T
+3 F
+(3.1   Operational data) 72 282.67 T
+0 F
+-0.44 (The OSPF protocol has been deployed in a number of places in the 
Internet. For a summary of this ) 72 256 P
+(deployment, see [1]. Some statistics have been gathered from this operational 
experience, via ) 72 242 T
+-0.03 (local network management facilities. Some of these statistics are 
presented in the following table:) 72 228 P
+FMENDPAGE
+%%EndPage: "7" 8
+5 10 /Times-Bold FMDEFINEFONT
+%%Page: "8" 8
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 8]) 499.7 73 T
+72 108 540 684 R
+7 X
+V
+72 666.01 540 674 C
+72 671.98 540 671.98 2 L
+0.5 H
+0 Z
+0 X
+0 K
+N
+0 0 612 792 C
+5 F
+0 X
+0 K
+(T) 72 677.33 T
+(ABLE 1. Pertinent operational statistics) 77.93 677.33 T
+(Statistic) 72 655.34 T
+(BARRNet) 216 655.34 T
+(NSI) 324 655.34 T
+(OARnet) 432 655.34 T
+1 F
+(Data gathering \050duration\051) 72 638.34 T
+(99 hours) 216 638.34 T
+(277 hours) 324 638.34 T
+(28 hours) 432 638.34 T
+(Dijkstra frequency) 72 622.34 T
+(50 minutes) 216 622.34 T
+(25 minutes) 324 622.34 T
+(13 minutes) 432 622.34 T
+(External incremental frequency) 72 606.34 T
+(1.2 minutes) 216 606.34 T
+(.98 minutes) 324 606.34 T
+(not gathered) 432 606.34 T
+(Database turnover) 72 590.34 T
+(29.7 minutes) 216 590.34 T
+(30.9 minutes) 324 590.34 T
+(28.2 minutes) 432 590.34 T
+(LSAs per packet) 72 574.34 T
+(3.38) 216 574.34 T
+(3.16) 324 574.34 T
+(2.99) 432 574.34 T
+(Flooding retransmits) 72 558.34 T
+(1.3%) 216 558.34 T
+(1.4%) 324 558.34 T
+(.7%) 432 558.34 T
+0 F
+(The \336rst line in the above table show the length of time that statistics 
were gathered on the three ) 72 533.01 T
+(networks. A brief description of the other statistics follows:) 72 519.01 T
+(\245) 72 499.01 T
+4 F
+(Dijkstra fr) 85.54 499.01 T
+(equency) 140.27 499.01 T
+(. ) 181.59 499.01 T
+0 F
+(In OSPF) 187.59 499.01 T
+(, the Dijkstra calculation involves only those routers and transit ) 228.28 
499.01 T
+-0.14 (networks belonging to the AS. The Dijkstra is run only when something 
in the system changes ) 85.54 485.01 P
+(\050like a serial line between two routers goes down\051. Note that in these 
operational systems, the ) 85.54 471.01 T
+(Dijkstra process runs only infrequently \050the most frequent being every 13 
minutes\051.) 85.54 457.01 T
+(\245) 72 437.01 T
+4 F
+(External incr) 85.54 437.01 T
+(emental fr) 153.61 437.01 T
+(equency) 206.35 437.01 T
+0 F
+(. In OSPF) 247.54 437.01 T
+(, when an external route changes only its entry in ) 294.23 437.01 T
+-0.13 (the routing table is recalculated. These are called external 
incremental updates. Note that these ) 85.54 423.01 P
+(happen much more frequently than the Dijkstra procedure. \050in other words, 
incremental ) 85.54 409.01 T
+(updates are saving quite a bit of processor time\051.) 85.54 395.01 T
+(\245) 72 375.01 T
+4 F
+-0.45 (Database turnover) 85.54 375.01 P
+-0.45 (.) 179.58 375.01 P
+0 F
+-0.45 ( In OSPF) 182.58 375.01 P
+-0.45 (, link state advertisements are refreshed at a minimum of every 30 ) 
225.36 375.01 P
+(minutes. New advertisement instances are sent out more frequently when some 
part of the ) 85.54 361.01 T
+-0.2 (topology changes. The table shows that, even taking topological changes 
into account, on aver-) 85.54 347.01 P
+(age an advertisement is updated close to only every 30 minutes. This 
statistic will be used in ) 85.54 333.01 T
+(the link bandwidth calculations below) 85.54 319.01 T
+(. Note that NSI actually shows advertisements updated ) 267.31 319.01 T
+(every 30.7 \050> 30\051 minutes. This probably means that at one time earlier 
in the measurement ) 85.54 305.01 T
+(period, NSI had a smaller link state database that it did at the end.) 85.54 
291.01 T
+(\245) 72 271.01 T
+4 F
+-0.39 (LSAs per packet.) 85.54 271.01 P
+0 F
+-0.39 ( In OSPF) 173.04 271.01 P
+-0.39 (, multiple LSAs can be included in either Link State Update or Link ) 
215.95 271.01 P
+-0.35 (State Acknowledgment packets.The table shows that, on average, around 3 
LSAs are carried in ) 85.54 257.01 P
+(a single packet. This statistic is used when calculating the header overhead 
in the link band-) 85.54 243.01 T
+(width calculation below) 85.54 229.01 T
+(. This statistic was derived by diving the number of LSAs \337ooded by ) 
200.01 229.01 T
+(the number of \050non-hello\051 multicasts sent.) 85.54 215.01 T
+(\245) 72 195.01 T
+4 F
+(Flooding r) 85.54 195.01 T
+(etransmits.) 138.97 195.01 T
+0 F
+( This counts both retransmission of LS Update packets and Link State ) 195.92 
195.01 T
+(Acknowledgment packets, as a percentage of the original multicast \337ooded 
packets. The table ) 85.54 181.01 T
+(shows that \337ooding is working well, and that retransmits can be ignored in 
the link bandwidth ) 85.54 167.01 T
+(calculation below) 85.54 153.01 T
+(.) 169.69 153.01 T
+FMENDPAGE
+%%EndPage: "8" 9
+%%Page: "9" 9
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 9]) 499.7 73 T
+72 108 540 684 R
+7 X
+V
+3 F
+0 X
+(3.2  Link bandwidth) 72 674.67 T
+0 F
+-0.02 (In this section we attempt to calculate how much link bandwidth is 
consumed by the OSPF \337ood-) 72 648 P
+(ing process. The amount of link bandwidth consumed increases linearly with 
the number of ) 72 634 T
+(advertisements present in the OSPF database.W) 72 620 T
+(e assume that the majority of advertisements in ) 300.88 620 T
+(the database will be AS external LSAs \050operationally this is true, see 
[1]\051.) 72 606 T
+(From the statistics presented in Section 3.1, any particular advertisement is 
\337ooded \050on average\051 ) 72 580 T
+(every 30 minutes. In addition, three advertisements \336t in a single packet. 
\050This packet could be ) 72 566 T
+(either a Link State Update packet or a Link State Acknowledgment packet; in 
this analysis we ) 72 552 T
+(select the Link State Update packet, which is the lar) 72 538 T
+(ger\051. An AS external LSA is 36 bytes long. ) 320.93 538 T
+(Adding one third of a packet header \050IP header plus OSPF Update packet\051 
yields 52 bytes. T) 72 524 T
+(rans-) 515.59 524 T
+(mitting this amount of data every 30 minutes gives an average rate of 23/100 
bits/second.) 72 510 T
+-0.05 (If you want to limit your routing traf) 72 484 P
+-0.05 (\336c to 5% of the link\325) 247.03 484 P
+-0.05 (s total bandwidth, you get the following ) 345.75 484 P
+(maximums for database size:) 72 470 T
+72 434.01 540 442 C
+72 439.98 540 439.98 2 L
+0.5 H
+0 Z
+0 X
+0 K
+N
+0 0 612 792 C
+5 F
+0 X
+0 K
+(T) 72 445.33 T
+(ABLE 2. Database size as a function of link speed \0505% utilization\051) 
77.93 445.33 T
+(Speed) 180 423.34 T
+(# external advertisements) 288 423.34 T
+1 F
+(9.6 Kb) 180 406.34 T
+(2087) 288 406.34 T
+(56 Kb) 180 390.34 T
+(12,174) 288 390.34 T
+0 F
+-0.46 (Higher line speeds have not been included, because other factors will 
then limit database size \050like ) 72 365.01 P
+-0.12 (router memory\051 before line speed becomes a factor) 72 351.01 P
+-0.12 (. Note that in the above calculation, the size of ) 315.32 351.01 P
+-0.06 (the data link header was not taken into account. Also, note that while 
the OSPF database is likely ) 72 337.01 P
+(to be mostly external LSAs, other LSAs have a size also. As a ballpark 
estimate, router links and ) 72 323.01 T
+-0.01 (network links are generally three times as lar) 72 309.01 P
+-0.01 (ge as an AS external link, with summary link adver-) 287.18 309.01 P
+(tisements being the same size as external link LSAs.) 72 295.01 T
+(OSPF consumes considerably less link bandwidth than RIP) 72 269.01 T
+(. This has been shown experimentally ) 355.51 269.01 T
+(in the NSI network. See Jef) 72 255.01 T
+(frey Bur) 203.69 255.01 T
+(gan\325) 243.77 255.01 T
+(s \322NASA Sciences Internet\323 report in [3].) 264.42 255.01 T
+3 F
+(3.3  Router memory) 72 221.67 T
+0 F
+-0.1 (Memory requirements in OSPF are dominated by the size of the link state 
database. As in the pre-) 72 195.01 P
+(vious section, it is probably safe to assume that most of the advertisements 
in the database are ) 72 181.01 T
+(external LSAs. While an external LSA is 36 bytes long, it is generally stored 
by an OSPF imple-) 72 167.01 T
+-0.34 (mentation together with some support data. So a good estimate of router 
memory consumed by an ) 72 153.01 P
+(external LSA is probably 64 bytes. So a database having 10,000 external LSAs 
will consume ) 72 139.01 T
+(640K bytes of router memory) 72 125.01 T
+(. OSPF de\336nitely requires more memory than RIP) 213.79 125.01 T
+(.) 452.98 125.01 T
+FMENDPAGE
+%%EndPage: "9" 10
+%%Page: "10" 10
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 10]) 493.7 73 T
+72 108 540 684 R
+7 X
+V
+0 X
+-0.35 (Using the Proteon P4200 implementation as an example, the P4200 has 
2Mbytes of memory) 72 676 P
+-0.35 (. This ) 510.38 676 P
+-0.02 (is shared between instruction, data and packet buf) 72 662 P
+-0.02 (fer memory) 310.78 662 P
+-0.02 (. The P4200 has enough memory to ) 366.26 662 P
+(store 10, 000 external LSAs, and still have enough packet buf) 72 648 T
+(fer memory available to run a rea-) 367.58 648 T
+(sonable number of interfaces.) 72 634 T
+(Also, note that while the OSPF database is likely to be mostly external LSAs, 
other LSAs have a ) 72 608 T
+-0.06 (size also. As a ballpark estimate, router links and network links 
consume generally three times as ) 72 594 P
+(much memory as an AS external link, with summary link advertisements being 
the same size as ) 72 580 T
+(external link LSAs.) 72 566 T
+3 F
+(3.4  Router CPU) 72 532.67 T
+0 F
+(Assume that, as the size of the OSPF routing domain grows, the number of 
interfaces per router ) 72 506 T
+(stays bounded. Then the Dijkstra calculation is of order \050n * log 
\050n\051\051, where n is the number of ) 72 492 T
+(routers in the routing domain. \050This is the complexity of the Dijkstra 
algorithm in a sparse net-) 72 478 T
+(work\051. Of course, it is implementation speci\336c as to how expensive the 
Dijkstra really is.) 72 464 T
+(W) 72 438 T
+(e have no experimental numbers for the cost of the Dijkstra calculation in a 
real OSPF imple-) 82.36 438 T
+(mentation. However) 72 424 T
+(, Steve Deering presented results for the Dijkstra calculation in the 
\322MOSPF ) 169.45 424 T
+(meeting report\323 in [3]. Steve\325) 72 410 T
+(s calculation was done on a DEC 5000 \05010 mips processor\051, using ) 212.9 
410 T
+(the Stanford internet as a model. His graphs are based on numbers of 
networks, not number of ) 72 396 T
+(routers. However) 72 382 T
+(, if we extrapolate that the ratio of routers to networks remains the same, 
the ) 154.78 382 T
+(time to run Dijkstra for 200 routers in Steve\325) 72 368 T
+(s implementation was around 15 milliseconds.) 285.87 368 T
+-0.46 (This seems a reasonable cost, particularly when you notice that the 
Dijkstra calculation is run very ) 72 342 P
+(infrequently in operational deployments. In the three networks presented in 
Section 3.1, Dijkstra ) 72 328 T
+-0.35 (was run on average only every 13 to 50 minutes. Since the Dijkstra is 
run so infrequently) 72 314 P
+-0.35 (, it seems ) 493.06 314 P
+-0.02 (likely that OSPF overall consumes less CPU than RIP \050because of 
RIP\325) 72 300 P
+-0.02 (s frequent updates, requir-) 413.95 300 P
+(ing routing table lookups\051.) 72 286 T
+(As another example, the routing algorithm in MILNET is SPF-based. MILNET\325) 
72 260 T
+(s current size is ) 456.42 260 T
+-0.02 (230 nodes, and the routing calculation still consumes less than 5% of 
the MILNET switches\325 pro-) 72 246 P
+(cessor bandwidth [4]. Because the routing algorithm in the MILNET adapts to 
network load, it ) 72 232 T
+(runs the Dijkstra process quite frequently \050on the order of seconds as 
compared to OSPF\325) 72 218 T
+(s min-) 499.7 218 T
+(utes\051. However) 72 204 T
+(, it should be noted that the routing algorithm in MILNET incrementally 
updates ) 144.79 204 T
+(the SPF-tree, while OSPF rebuilds it from scratch at each Dijkstra 
calculation) 72 190 T
+(OSPF\325) 72 164 T
+(s Area capability provides a way to reduce Dijkstra overhead, if it becomes a 
burden. The ) 104 164 T
+-0 (routing domain can be split into areas. The extent of the Dijkstra 
calculation \050and its complexity\051 ) 72 150 P
+(is limited to a single area at a time.) 72 136 T
+FMENDPAGE
+%%EndPage: "10" 11
+%%Page: "11" 11
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 11]) 493.7 73 T
+72 108 540 684 R
+7 X
+V
+3 F
+0 X
+(3.5  Role of Designated Router) 72 674.67 T
+0 F
+(This section explores the number of routers that can be attached to a single 
network. As the num-) 72 648 T
+-0.36 (ber of routers attached to a network grows, so does the amount of OSPF 
routing traf) 72 634 P
+-0.36 (\336c seen on the ) 469.48 634 P
+(network. Some of this is Hello traf) 72 620 T
+(\336c, which is generally multicast by each router every 10 sec-) 238.01 620 T
+-0.07 (onds. This burden is borne by all routers attached to the network. 
However) 72 606 P
+-0.07 (, because of its special ) 429.77 606 P
+-0.08 (role in the \337ooding process, the Designated router ends up sending 
more Link State Updates than ) 72 592 P
+(the other routers on the network. Also, the Designated Router receives Link 
State Acknowledg-) 72 578 T
+-0.15 (ments from all attached routers, while the other routers just receive 
them from the DR. \050Although ) 72 564 P
+(it is important to note that the rate of Link State Acknowledgments will 
generally be limited to ) 72 550 T
+(one per second from each router) 72 536 T
+(, because acknowledgments are generally delayed.\051) 226.38 536 T
+-0.22 (So, if the amount of protocol traf) 72 510 P
+-0.22 (\336c on the LAN becomes a limiting factor) 228.71 510 P
+-0.22 (, the limit is likely to be ) 424.24 510 P
+(detected in the Designated Router \336rst. However) 72 496 T
+(, such a limit is not expected to be reached in ) 305.68 496 T
+(practice. The amount of routing protocol traf) 72 482 T
+(\336c generated by OSPF has been shown to be small ) 286.62 482 T
+-0.11 (\050see Section 3.2\051. Also, if need be OSPF\325) 72 468 P
+-0.11 (s hello timers can be con\336gured to reduce the amount of ) 268.43 468 
P
+(protocol traf) 72 454 T
+(\336c on the network. Note that more than 50 routers have been simulated 
attached to a ) 131.4 454 T
+(single LAN \050see [1]\051. Also, in interoperability testing 13 routers have 
been attached to a single ) 72 440 T
+(ethernet with no problems encountered.) 72 426 T
+-0.02 (Another factor in the number of routers attached to a single network is 
the cutover time when the ) 72 400 P
+-0.17 (Designated Router fails. OSPF has a Backup Designated Router so that 
the cutover does not have ) 72 386 P
+-0.31 (to wait for the new DR to synchronize \050the adjacency bring-up 
process mentioned earlier\051 with all ) 72 372 P
+-0.43 (the other routers on the LAN; as a Backup DR it had already 
synchronized. However) 72 358 P
+-0.43 (, in those rare ) 473.46 358 P
+-0.33 (cases when both DR and Backup DR crash at the same time, the new DR 
will have to synchronize ) 72 344 P
+(\050via the adjacency bring-up process\051 with all other routers before 
becoming functional. Field ) 72 330 T
+-0.44 (experience show that this synchronization process takes place in a 
timely fashion \050see the OARnet ) 72 316 P
+(report in [1]\051. However) 72 302 T
+(, this may be an issue in systems that have many routers attached to a sin-) 
183.42 302 T
+(gle network.) 72 288 T
+-0.15 (In the unlikely event that the number of routers attached to a LAN 
becomes a problem, either due ) 72 262 P
+(to the amount of routing protocol traf) 72 248 T
+(\336c or the cutover time, the LAN can be split into separate ) 251 248 T
+(pieces \050similar to splitting up the AS into separate areas\051.) 72 234 T
+3 F
+(3.6  Summary) 72 200.67 T
+0 F
+(In summary) 72 174 T
+(, it seems like the most likely limitation to the size of an OSPF system is 
available ) 128.85 174 T
+-0.4 (router memory) 72 160 P
+-0.4 (. W) 142.43 160 P
+-0.4 (e have given as 10,000 as the number of external LSAs that can be 
supported by ) 158.39 160 P
+(the memory available in one con\336guration of a particular implementation 
\050the Proteon P4200\051. ) 72 146 T
+-0.09 (Other implementations may vary; nowadays routers are being built with 
more and more memory) 72 132 P
+-0.09 (. ) 534.09 132 P
+FMENDPAGE
+%%EndPage: "11" 12
+%%Page: "12" 12
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 12]) 493.7 73 T
+72 108 540 684 R
+7 X
+V
+0 X
+(Note that 10,000 routes is considerably lar) 72 676 T
+(ger than the lar) 275.31 676 T
+(gest \336eld implementation \050BARRNet; ) 347.37 676 T
+(which at 1816 external LSAs is still very lar) 72 662 T
+(ge\051.) 283.65 662 T
+(Note that there may be ways to reduce database size in a routing domain. 
First, the domain can ) 72 636 T
+-0.19 (make use of default routing, reducing the number of external routes 
that need to be imported. Sec-) 72 622 P
+(ondly) 72 608 T
+(, an EGP can be used that will transport its own information through the AS 
instead of rely-) 98.54 608 T
+-0.21 (ing on the IGP \050OSPF in this case\051 to do transfer the information 
for it \050the EGP\051. Thirdly) 72 594 P
+-0.21 (, routers ) 498.11 594 P
+(having insuf) 72 580 T
+(\336cient memory may be able to be assigned to stub areas \050whose databases 
are drasti-) 131.41 580 T
+(cally smaller\051. Lastly) 72 566 T
+(, if the Internet went away from a \337at address space the amount of 
external ) 172.82 566 T
+(information imported into an OSPF domain could be reduced drastically) 72 552 
T
+(.) 418.67 552 T
+(While not as likely) 72 526 T
+(, there could be other issues that would limit the size of an OSPF routing ) 
162.17 526 T
+(domain. If there are slow lines \050like 9600 baud\051, the size of the 
database will be limited \050see Sec-) 72 512 T
+(tion 3.2\051. Dijkstra may get to be expensive when there are hundreds of 
routers in the OSPF ) 72 498 T
+(domain; although at this point the domain can be split into areas. Finally) 
72 484 T
+(, when there are many ) 418.69 484 T
+(routers attached to a single network, there may be undue burden imposed upon 
the Designated ) 72 470 T
+(Router; although at that point a LAN can be split into separate LANs.) 72 456 
T
+FMENDPAGE
+%%EndPage: "12" 13
+%%Page: "13" 13
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 13]) 493.7 73 T
+72 108 540 684 R
+7 X
+V
+2 F
+0 X
+(4.0  Suitable envir) 72 673.33 T
+(onments) 195.21 673.33 T
+0 F
+-0.14 (Suitable environments for the OSPF protocol range from lar) 72 646 P
+-0.14 (ge to small. OSPF is particular suited ) 359.11 646 P
+(for transit Autonomous Systems for the following reasons. OSPF can 
accommodate a lar) 72 632 T
+(ge num-) 497.84 632 T
+(ber of external routes. In OSPF the import of external information is very 
\337exible, having provi-) 72 618 T
+-0.39 (sions for a forwarding address, two levels of external metrics, and the 
ability to tag external routes ) 72 604 P
+-0.29 (with their AS number for easy management. Also OSPF\325) 72 590 P
+-0.29 (s ability to do partial updates when exter-) 343.17 590 P
+(nal information changes is very useful on these networks.) 72 576 T
+(OSPF is also suited for smaller) 72 550 T
+(, either stand alone or stub Autonomous Systems, because of its ) 220.44 550 T
+(wide array of features: fast conver) 72 536 T
+(gence, equal-cost-multipath, T) 235.96 536 T
+(OS routing, areas, etc.) 382.3 536 T
+2 F
+(5.0  Unsuitable envir) 72 469.33 T
+(onments) 212.98 469.33 T
+0 F
+-0.22 (OSPF has a very limited ability to express policy) 72 442 P
+-0.22 (. Basically) 304.62 442 P
+-0.22 (, its only policy mechanisms are in the ) 354.25 442 P
+(establishment of a four level routing hierarchy: intra-area, inter) 72 428 T
+(-area, type 1 and type 2 external ) 374.52 428 T
+(routes. A system wanting more sophisticated policies would have to be split 
up into separate ) 72 414 T
+(ASes, running a policy-based EGP between them.) 72 400 T
+FMENDPAGE
+%%EndPage: "13" 14
+%%Page: "14" 14
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 14]) 493.7 73 T
+72 108 540 684 R
+7 X
+V
+2 F
+0 X
+(6.0  Refer) 72 673.33 T
+(ence Documents) 137.87 673.33 T
+0 F
+(The following documents have been referenced by this report:) 72 646 T
+([1]) 72 626 T
+(Moy) 108 626 T
+(, J., \322Experience with the OSPF protocol\323, RFC 1246, July 1991.) 129.88 
626 T
+([2]) 72 608 T
+(Moy) 108 608 T
+(, J., \322OSPF V) 129.88 608 T
+(ersion 2\323, RFC 1247, July 1991.) 193.85 608 T
+([3]) 72 590 T
+(Corporation for National Research Initiatives, \322Proceedings of the 
Eighteenth Internet ) 108 590 T
+(Engineering T) 108 576 T
+(ask Force\323, University of British Columbia, July 30-August 3, 1990.) 
176.11 576 T
+FMENDPAGE
+%%EndPage: "14" 15
+%%Page: "15" 15
+612 792 0 FMBEGINPAGE
+72 702 540 720 R
+7 X
+0 K
+V
+0 F
+0 X
+(RFC 1245) 72 712 T
+(OSPF protocol analysis) 249.36 712 T
+(July 1991) 493.02 712 T
+72 69.05 540 81 R
+7 X
+V
+0 X
+([Moy]) 72 73 T
+([Page 15]) 493.7 73 T
+72 108 540 684 R
+7 X
+V
+2 F
+0 X
+(Security Considerations) 72 673.33 T
+0 F
+(Security issues are not discussed in this memo.) 72 646 T
+2 F
+(Author) 72 617.33 T
+(\325) 122.04 617.33 T
+(s Addr) 126.77 617.33 T
+(ess) 173.13 617.33 T
+0 F
+(John Moy) 72 590 T
+(Proteon Inc.) 72 576 T
+(2 T) 72 562 T
+(echnology Drive) 87.48 562 T
+(W) 72 548 T
+(estborough, MA 01581) 82.36 548 T
+(Phone: \050508\051 898-2800) 72 522 T
+(Email: address@hidden) 72 508 T
+FMENDPAGE
+%%EndPage: "15" 16
+%%Trailer
+%%BoundingBox: 0 0 612 792
+%%Pages: 15 1
+%%DocumentFonts: Times-Roman
+%%+ Times-Bold
diff --git a/test/etags/pyt-src/server.py b/test/etags/pyt-src/server.py
new file mode 100644
index 0000000..68aa29a
--- /dev/null
+++ b/test/etags/pyt-src/server.py
@@ -0,0 +1,819 @@
+#!/usr/bin/python
+#
+# NOTE: THIS PROGRAM DOES NOT WORK!
+# It is intended as a regression test source for the Python support in etags.
+# If you want a working version, you'll find it in the fetchmail distribution.
+#
+
+from Tkinter import *
+from Dialog import *
+import sys
+import time
+import os
+
+#
+# Define the data structures the GUIs will be tossing around
+#
+class Controls:
+    def __init__(self):
+       self.foreground = FALSE;        # Run in background
+       self.daemon = 300               # Default to 5-minute timeout
+       self.syslog = FALSE             # Use syslogd for logging?
+       self.logfile = None             # No logfile, initially
+
+    def __repr__(self):
+       str = "";
+       if self.syslog:
+          str = str + ("set syslog\n")
+       elif self.logfile:
+           str = str + ("set logfile \"%s\"\n" % (self.logfile,));
+       if not self.foreground and self.daemon:
+           str = str + ("set daemon %s\n" % (self.daemon,))
+       return str + "\n"
+
+    def __str__(self):
+       return "[Server: " + repr(self) + "]"
+
+class Server:
+    def __init__(self):
+       self.pollname = None            # Poll label
+       self.via = None                 # True name of host
+       self.active = TRUE              # Poll status
+       self.interval = 0               # Skip interval
+       self.protocol = 'auto'          # Default to auto protocol
+       self.port = 0                   # Port number to use
+       self.uidl = FALSE               # Don't use RFC1725 UIDLs by default
+       self.auth = "password"          # Default to password authentication
+       self.timeout = 300              # 5-minute timeout
+       self.envelope = "Received"      # Envelope-address header
+       self.aka = []                   # List of DNS aka names
+       self.dns = TRUE                 # Enable DNS lookup on multidrop
+       self.localdomains = []          # Domains to be considered local
+       self.interface = None           # IP address and range
+       self.monitor = None             # IP address and range
+       self.userlist = []              # List of user entries for site
+       self.typemap = (
+           ('pollname',  'String'),
+           ('via',       'String'),
+           ('active',    'Boolean'),
+           ('interval',  'Int'),
+           ('protocol',  'String'),
+           ('interval',  'Int'),
+           ('port',      'Int'),
+           ('uidl',      'Boolean'),
+           ('auth',      'String'),
+           ('timeout',   'Int'),
+           ('envelope',  'String'),
+           # leave aka out
+           ('dns',       'Boolean'),
+           # leave localdomains out
+           ('interface', 'String'),
+           ('monitor',   'String'))
+
+    def dump(self, folded):
+       str = ""
+       if self.active:   str = str + "poll"
+       else:             str = str + "skip"
+       str = str + (" " + self.pollname)
+       if self.via != self.pollname:
+           str = str + " via " + self.via
+       if self.protocol != ServerDefaults.protocol:
+           str = str + " with proto " + self.protocol 
+       if self.port != defaultports[self.protocol]:
+           str = str + " port " + `self.port`
+       if self.timeout != ServerDefaults.timeout:
+           str = str + " timeout " + `self.timeout`
+       if self.interval != ServerDefaults.interval: 
+           str = str + " interval " + `self.interval` 
+       if self.envelope != ServerDefaults.envelope:
+           str = str + " envelope " + self.envelope
+       if self.auth != ServerDefaults.auth:
+           str = str + " auth " + self.auth
+       if self.dns != ServerDefaults.dns or self.uidl != ServerDefaults.uidl:
+           str = str + " and options"
+       if self.dns != ServerDefaults.dns:
+           str = str + flag2str(self.dns, 'dns')
+       if self.uidl != ServerDefaults.uidl:
+           str = str + flag2str(self.uidl, 'uidl')
+       if folded:        str = str + "\n\t"
+       else:             str = str + " "
+
+       if self.aka:
+            str = str + "aka"
+            for x in self.aka:
+               str = str + " " + x
+       if self.aka and self.localdomains: str = str + " "
+       if self.localdomains:
+            str = str + ("localdomains")
+            for x in self.localdomains:
+               str = str + " " + x
+        if (self.aka or self.localdomains):
+           if folded:
+               str = str + "\n\t"
+           else:
+               str = str + " "
+
+       if self.interface: str = str + " interface " + self.interface
+       if self.monitor: str = str + " monitor " + self.monitor
+       if (self.interface or self.monitor):
+           if folded:
+               str = str + "\n"
+
+       if str[-1] == "\t": str = str[0:-1]
+       return str;
+
+    def __repr__(self):
+       return self.dump(TRUE)
+
+    def __str__(self):
+       return "[Server: " + self.dump(FALSE) + "]"
+
+class User:
+    def __init__(self):
+       self.username = ""              # Remote username
+       self.localnames = None          # Local names
+       self.password = ""              # Password for mail account access
+       self.smpthost = 'localhost'     # Host to forward to
+       self.mda = ""                   # Mail Delivery Agent
+       self.preconnect = ""            # Connection setup
+       self.postconnect = ""           # Connection wrapup
+       self.keep = FALSE               # Keep messages
+       self.flush = FALSE              # Flush messages
+       self.fetchall = FALSE           # Fetch old messages
+       self.rewrite = TRUE             # Rewrite message headers
+       self.forcecr = FALSE            # Force LF -> CR/LF
+       self.stripcr = FALSE            # Strip CR
+       self.pass8bits = FALSE          # Force BODY=7BIT
+       self.dropstatus = FALSE         # Force BODY=7BIT
+       self.limit = 0                  # Message size limit
+       self.fetchlimit = 0             # Max messages fetched per batch
+       self.batchlimit = 0             # Max message forwarded per batch
+       self.typemap = (
+           ('username',    'String')
+           ('folder',      'String')
+           # leave out localnames
+           ('password',    'String')
+           ('smtphost',    'String')
+           ('preconnect',  'String')
+           ('postconnect', 'String')
+           ('mda',         'String')
+           ('keep',        'Boolean')
+           ('flush',       'Boolean')
+           ('fetchall',    'Boolean')
+           ('rewrite',     'Boolean')
+           ('forcecr',     'Boolean')
+           ('stripcr',     'Boolean')
+           ('pass8bits',   'Boolean')
+           ('dropstatus',  'Boolean')
+           ('limit',       'Int')
+           ('fetchlimit',  'Int')
+           ('batchlimit',  'Int'))
+
+    def __repr__(self):
+       str = ""
+       str = str + "user " + self.user;
+       if self.password: str = str + "with password " + self.password
+       if self.localnames:
+            str = str + "localnames"
+            for x in self.localnames:
+               str = str + " " + x
+       if (self.keep or self.flush or self.fetchall or self.rewrite or
+          self.forcecr or self.stripcr or self.pass8bits or self.dropstatus):
+           str = str + " options"
+       if self.keep != UserDefaults.keep:
+           str = str + flag2str(self.keep, 'keep')
+       if self.flush != UserDefaults.flush:
+           str = str + flag2str(self.flush, 'flush')
+       if self.fetchall != UserDefaults.fetchall:
+           str = str + flag2str(self.fetchall, 'fetchall')
+       if self.rewrite != UserDefaults.rewrite:
+           str = str + flag2str(self.rewrite, 'rewrite')
+       if self.forcecr != UserDefaults.forcecr:
+           str = str + flag2str(self.forcecr, 'forcecr')
+       if self.stripcr != UserDefaults.stripcr:
+           str = str + flag2str(self.stripcr, 'stripcr')
+       if self.pass8bits != UserDefaults.pass8bits:
+           str = str + flag2str(self.pass8bits, 'pass8bits')
+       if self.dropstatus != UserDefaults.dropstatus:
+           str = str + flag2str(self.dropstatus, 'dropstatus')
+       if self.limit != UserDefaults.limit:
+           str = str + " limit " + `self.limit`
+       if self.fetchlimit != UserDefaults.fetchlimit:
+           str = str + " fetchlimit " + `self.fetchlimit`
+       if self.batchlimit != UserDefaults.batchlimit:
+           str = str + " batchlimit " + `self.batchlimit`
+
+    def __str__(self):
+       return "[User: " + repr(self) + "]"
+    
+#
+# Helper code
+#
+
+defaultports = {"auto":0,
+               "POP2":109, 
+               "POP3":110, "APOP":110, "KPOP":1109, "IMAP":143,
+               "IMAP-K4":143,
+               "ETRN":25}
+
+protolist = ("auto", "POP2", "POP3", "APOP", "KPOP", "IMAP", "IMAP-K4", "ETRN")
+
+authlist = ("password", "kerberos")
+
+def flag2str(value, string):
+# make a string representation of a .fetchmailrc flag or negated flag
+    str = ""
+    if value != None:
+       str = str + (" ")
+       if value == FALSE: str = str + ("no ")
+       str = str + string;
+    return str
+
+class LabeledEntry(Frame):
+# widget consisting of entry field with caption to left
+    def bind(self, key, action):
+       self.E.bind(key, action)
+    def focus_set(self):
+       self.E.focus_set()
+    def __init__(self, Master, text, textvar, width):
+       Frame.__init__(self, Master)
+       self.L = Label(self, {'text':text, 'width':width, 'anchor':'w'})
+       self.E = Entry(self, {'textvar':textvar})
+       self.L.pack({'side':'left'})
+       self.E.pack({'side':'left', 'expand':'1', 'fill':'x'})
+
+def ButtonBar(frame, legend, ref, alternatives, command):
+# horizontal bar of radio buttons, caption to left, picking from a string list
+    bar = Frame(frame)
+    Label(bar, text=legend).pack(side=LEFT)
+    for alt in alternatives:
+       Radiobutton(bar,
+               {'text':alt, 'variable':ref, 'value':alt, 
'command':command}).pack(side=LEFT)
+    bar.pack(side=TOP);
+    return bar
+
+def helpwin(helpdict):
+# help message window with a self-destruct button
+    helpwin = Toplevel()
+    helpwin.title(helpdict['title']) 
+    helpwin.iconname(helpdict['title'])
+    Label(helpwin, text=helpdict['banner']).pack()
+    textwin = Message(helpwin, text=helpdict['text'], width=600)
+    textwin.pack()
+    Button(helpwin, text='Done', 
+          command=lambda x=helpwin: Widget.destroy(x),
+          relief=SUNKEN, bd=2).pack()
+
+class ListEdit(Frame):
+# edit a list of values (duplicates not allowed) with a supplied editor hook 
+    def __init__(self, newlegend, list, editor, master):
+       self.editor = editor
+       self.list = list
+
+       # Set up a widget to accept new sites
+       self.newval = StringVar(master)
+       newwin = LabeledEntry(master, newlegend, self.newval, '16')
+       newwin.bind('<Double-1>', self.handleNew)
+       newwin.bind('<Return>', self.handleNew)
+       newwin.pack(side=TOP, fill=X, anchor=E)
+
+       # Create the sitelist for site-configuration selection
+       listframe = Frame(master)
+       scroll = Scrollbar(listframe)
+       listwidget = Listbox(listframe, height=0, selectmode='browse')
+       if list:
+           for dnsname in list:
+               listwidget.insert('end', dnsname)
+       listframe.pack(side=TOP, expand=YES, fill=BOTH)
+       listwidget.config(yscrollcommand=scroll.set, relief=SUNKEN)
+       listwidget.pack(side=LEFT, expand=YES, fill=BOTH)
+       scroll.config(command=listwidget.yview, relief=SUNKEN)
+       scroll.pack(side=RIGHT, fill=BOTH)
+       listwidget.config(selectmode=SINGLE, setgrid=TRUE)
+       listwidget.bind('<Double-1>', self.handleList);
+       listwidget.bind('<Return>', self.handleList);
+       self.listwidget = listwidget
+
+       bf = Frame(master);
+       if self.editor:
+           Button(bf, text='Edit',   command=self.editItem).pack(side=LEFT)
+       Button(bf, text='Delete', command=self.deleteItem).pack(side=RIGHT)
+       bf.pack(fill=X)
+
+    def handleList(self, event):
+       self.editItem();
+
+    def handleNew(self, event):
+       item = self.newval.get()
+       entire = self.listwidget.get(0, self.listwidget.index('end'));
+       if item and (not entire) or (not item in self.listwidget.get(0, 
self.listwidget.index('end'))):
+           self.listwidget.insert('end', item)
+           if self.list != None: self.list.append(item)
+       self.newval.set('')
+
+    def editItem(self):
+       index = self.listwidget.curselection()[0]
+       if index and self.editor:
+           label = self.listwidget.get(index);
+           apply(self.editor, (label,))
+
+    def deleteItem(self):
+       index = self.listwidget.curselection()[0]
+       if index:
+           self.listwidget.delete(index)
+           if self.list != None: del self.list[index]
+
+def ConfirmQuit(frame, context):
+    ans = Dialog(frame, 
+                title = 'Quit?',
+                text = 'Really quit ' + context + ' without saving?',
+                bitmap = 'question',
+                strings = ('Yes', 'No'),
+                default = 1)
+    return ans.num == 0
+#
+# First, code to set the global fetchmail run controls.
+#
+
+confighelp = {
+    'title' : 'Fetchmail configurator help',
+    'banner': 'Configurator help',
+    'text' : """
+In the `Configurator Controls' panel, you can:
+
+Press `Save' to save the new fetchmail configuration you have created.
+Press `Quit' to exit without saving.
+Press `Help' to bring up this help message.
+
+In the `Configurator Controls' panel, you can set the following options that
+control how fetchmail runs:
+
+Poll interval
+        Number of seconds to wait between polls in the background.
+        Ignored if the `Run in Foreground?' option is on.
+
+Logfile
+        If empty, emit progress and error messages to stderr.
+        Otherwise this gives the name of the files to write to.
+        This field is ignored if the "Log to syslog?" option is on.
+
+In the `Remote Mail Configurations' panel, you can:
+
+1. Enter the name of a new remote mail server you want fetchmail to query.
+
+To do this, simply enter a label for the poll configuration in the
+`New Server:' box.  The label should be a DNS name of the server (unless
+you are using ssh or some other tunneling method and will fill in the `via'
+option on the site configuration screen).
+
+2. Change the configuration of an existing site.
+
+To do this, find the site's label in the listbox and double-click it.
+This will take you to a site configuration dialogue.
+"""}
+
+class ControlEdit(Frame):
+    def PostControls(self):
+       self.foreground = BooleanVar(self)
+       self.foreground.set(self.controls.foreground)
+       self.daemon = StringVar(self)
+       self.daemon.set(`self.controls.daemon`)
+       self.syslog = BooleanVar(self)
+       self.syslog.set(self.controls.syslog);
+       self.logfile = StringVar(self)
+       if self.controls.logfile: self.logfile.set(self.controls.logfile);
+
+       gf = Frame(self, relief=RAISED, bd = 5)
+
+       Label(gf,
+               text='Fetchmail Run Controls', 
+               bd=2).pack(side=TOP, pady=10)
+
+       df = Frame(gf, relief=RAISED, bd=2)
+
+       # Run in foreground?
+       Checkbutton(df,
+               {'text':'Run in foreground?',
+               'variable':self.foreground,
+               'relief':GROOVE}).pack(side=LEFT,anchor=W)
+
+       # Set the poll interval
+       de = LabeledEntry(df, '     Poll interval:', self.daemon, '14')
+       de.pack(side=RIGHT, anchor=E)
+
+       df.pack();
+
+       sf = Frame(gf, relief=RAISED, bd=2)
+
+       # Use syslog for logging?
+       Checkbutton(sf,
+               {'text':'Log to syslog?',
+               'variable':self.syslog,
+               'relief':GROOVE}).pack(side=LEFT, anchor=W)
+
+       # Set the logfile
+       log = LabeledEntry(sf, '     Logfile:', self.logfile, '14')
+       log.pack(side=RIGHT, anchor=E)
+
+       sf.pack(fill=X)
+       gf.pack(fill=X)
+
+    def GatherControls(self):
+       self.controls.daemon = self.daemon.get()
+       self.controls.foreground = self.foreground.get()
+       self.controls.logfile = self.logfile.get()
+       self.controls.syslog = self.syslog.get()
+
+#
+# Server editing stuff.
+#
+serverhelp = {
+    'title' : 'Server options help',
+    'banner': 'Server Options',
+    'text' : """
+The server options screen controls fetchmail 
+options that apply to one of your mailservers.
+
+Once you have a mailserver configuration set
+up as you like it, you can select `Save' to
+store it in the server list maintained in
+the main configuration window.
+
+If you wish to discard changes to a server 
+configuration, select `Quit'.
+"""}
+
+controlhelp = {
+    'title' : 'Run Control help',
+    'banner': 'Run Controls',
+    'text' : """
+If the `Poll normally' checkbox is on, the host is polled as part of
+the normal operation of fetchmail when it is run with no arguments.
+If it is off, fetchmail will only query this host when it is given as
+a command-line argument.
+
+The `True name of server' box should specify the actual DNS name
+to query. By default this is the same as the poll name.
+
+Normally each host described in the file is queried once each 
+poll cycle. If `Cycles to skip between polls' is greater than 0,
+that's the number of poll cycles that are skipped between the
+times this post is actually polled.
+
+The `Server timeout' is the number of seconds fetchmail will wait
+for a reply from the mailserver before concluding it is hung and
+giving up.
+"""}
+
+protohelp = {
+    'title' : 'Protocol and Port help',
+    'banner': 'Protocol and Port',
+    'text' : """
+These options control the remote-mail protocol
+and TCP/IP service port used to query this
+server.
+
+The `Protocol' button bar offers you a choice of
+all the different protocols available.  The `auto'
+protocol is a special mode that probes the host
+ports for POP3 and IMAP to see if either is
+available.
+
+Normally the TCP/IP service port to use is 
+dictated by the protocol choice.  The `Port'
+field lets you set a non-standard port.
+"""}
+
+sechelp = {
+    'title' : 'Security option help',
+    'banner': 'Security',
+    'text' : """
+These options control the security procedure used
+to protect mail transfer
+
+Normally the mail fetch is validated using an 
+ordinary password logon.  If your server speaks
+MIT Kerberos IV it is possible to pre-authenticate
+the exxchange with a Kerberos ticket.
+
+The `interface' and `monitor' options are available
+only for Linux systems.  See the fetchmail manual page
+for details on these.
+"""}
+
+multihelp = {
+    'title' : 'Multidrop option help',
+    'banner': 'Multidrop',
+    'text' : """
+These options are only useful with multidrop mode.
+See the manual page for extended discussion.
+"""}
+
+class ServerEdit(Frame):
+    def __init__(self, host, sitelist, master=None):
+       Frame.__init__(self, master)
+       Pack.config(self)
+       self.master.title('Fetchmail host ' + host);
+       self.master.iconname('Fetchmail host ' + host);
+       self.server = Server()
+       self.server.pollname = host
+       self.server.via = host
+       self.sitelist = sitelist
+       self.post()
+       self.createWidgets(host)
+
+    def post(self):
+       # we can't abstract this away, execs would happen in the wrong scope
+       for x in self.server.typemap:
+           target = "self." + x[0]
+           source = "self.server." + x[0]
+           if x[1] == 'Boolean':
+               exec target + " = BooleanVar(self)"
+               if eval(source):
+                   exec target + ".set(" + source + ")"
+           elif x[1] == 'String':
+               exec target + " = StringVar(self)"
+               if eval(source):
+                   exec target + ".set(" + source + ")"
+           elif x[1] == 'Int':
+               exec target + " = IntVar(self)"
+               if eval(source):
+                   exec target + ".set(" + source + ")"
+
+    def gather(self):
+       for x in self.server.typemap:
+           setattr(self.server, x[0], getattr(self, x[0]).get())
+
+    def nosave(self):
+       if ConfirmQuit(self, 'server option editing'):
+           Widget.destroy(self.master)
+
+    def save(self):
+       self.gather()
+       self.sitelist.append(self.server) 
+       Widget.destroy(self.master)
+
+    def refreshPort(self):
+       proto = self.protocol.get()
+       self.port.set(defaultports[proto])
+       if not proto in ("POP3", "APOP", "KPOP"): self.uidl = FALSE
+
+    def createWidgets(self, host):
+       topwin = Frame(self, relief=RAISED, bd=5)
+       Label(topwin, text="Server options for " + host).pack(side=TOP,pady=10)
+       Button(topwin, text='Save', fg='blue',
+               command=self.save).pack(side=LEFT)
+       Button(topwin, text='Quit', fg='blue',
+               command=self.nosave).pack(side=LEFT)
+       Button(topwin, text='Help', fg='blue',
+              command=lambda: helpwin(serverhelp)).pack(side=RIGHT)
+       topwin.pack(fill=X)
+
+       ctlwin = Frame(self, relief=RAISED, bd=5)
+       Label(ctlwin, text="Run Controls").pack(side=TOP)
+       Checkbutton(ctlwin, text='Poll ' + host + ' normally?', 
variable=self.active).pack(side=TOP)
+       LabeledEntry(ctlwin, 'True name of ' + host + ':',
+                     self.via, '30').pack(side=TOP, fill=X)
+       LabeledEntry(ctlwin, 'Cycles to skip between polls:',
+                     self.interval, '30').pack(side=TOP, fill=X)
+       LabeledEntry(ctlwin, 'Server timeout (seconds):',
+                     self.timeout, '30').pack(side=TOP, fill=X)
+       Button(ctlwin, text='Help', fg='blue',
+              command=lambda: helpwin(controlhelp)).pack(side=RIGHT)
+       ctlwin.pack(fill=X)
+
+       protwin = Frame(self, relief=RAISED, bd=5)
+       Label(protwin, text="Protocol and Port").pack(side=TOP)
+       pb = ButtonBar(protwin, 'Protocol:', self.protocol, protolist, 
self.refreshPort) 
+       LabeledEntry(protwin, 'TCP/IP service port to query:',
+                     self.port, '30').pack(side=TOP, fill=X)
+       Checkbutton(protwin,
+               text="Track seen POP3 messages with client-side UIDL list?",
+               variable=self.uidl).pack(side=TOP)   
+       Button(protwin, text='Help', fg='blue',
+              command=lambda: helpwin(protohelp)).pack(side=RIGHT)
+       protwin.pack(fill=X)
+
+       secwin = Frame(self, relief=RAISED, bd=5)
+       Label(secwin, text="Security").pack(side=TOP)
+       ButtonBar(secwin, 'Authorization mode:',
+                 self.auth, authlist, None).pack(side=TOP)
+
+       if os.popen("uname").readlines()[0] == 'Linux\n':
+           LabeledEntry(secwin, 'Interface to check before polling:',
+                        self.interface, '30').pack(side=TOP, fill=X)
+           LabeledEntry(secwin, 'IP addresses to watch for activity:',
+                        self.monitor, '30').pack(side=TOP, fill=X)
+
+       Button(secwin, text='Help', fg='blue',
+              command=lambda: helpwin(sechelp)).pack(side=RIGHT)
+       secwin.pack(fill=X)
+
+       mdropwin = Frame(self, relief=RAISED, bd=5)
+       Label(mdropwin, text="Multidrop options").pack(side=TOP)
+       LabeledEntry(mdropwin, 'Envelope address header:',
+                     self.envelope, '30').pack(side=TOP, fill=X)
+       Checkbutton(mdropwin, text="Enable multidrop DNS lookup?",
+                   variable=self.dns).pack(side=TOP)
+       Label(mdropwin, text="DNS aliases").pack(side=TOP)
+       ListEdit("New site alias: ", self.server.aka, None, mdropwin)
+       Label(mdropwin, text="Domains to be considered local").pack(side=TOP)
+       ListEdit("New local domain: ", self.server.localdomains, None,mdropwin)
+       Button(mdropwin, text='Help', fg='blue',
+              command=lambda: helpwin(multihelp)).pack(side=RIGHT)
+       mdropwin.pack(fill=X)
+
+       userwin = Frame(self, relief=RAISED, bd=5)
+       Label(userwin, text="User entries for " + host).pack(side=TOP)
+       ListEdit("New user: ", None, self.edituser, userwin)
+       userwin.pack(fill=X)
+
+    def edituser(self, user):
+       UserEdit(user, self.server.userlist, Toplevel())
+
+#
+# User editing stuff
+#
+
+userhelp = {
+    'title' : 'User option help',
+    'banner': 'User options',
+    'text' : """
+FIXME
+"""}
+
+class UserEdit(Frame):
+    def __init__(self, user, userlist, master=None):
+       Frame.__init__(self, master)
+       Pack.config(self)
+       self.master.title('Fetchmail user ' + user);
+       self.master.iconname('Fetchmail user ' + user);
+       self.user = User()
+       self.user.remote = user
+       self.user.localnames = [user]
+       self.userlist = userlist
+       self.post()
+       self.createWidgets(user)
+
+    def post(self):
+       # we can't abstract this away, execs would happen in the wrong scope
+       for x in self.user.typemap:
+           target = "self." + x[0]
+           source = "self.user." + x[0]
+           if x[1] == 'Boolean':
+               exec target + " = BooleanVar(self)"
+               if eval(source):
+                   exec target + ".set(" + source + ")"
+           elif x[1] == 'String':
+               exec target + " = StringVar(self)"
+               if eval(source):
+                   exec target + ".set(" + source + ")"
+           elif x[1] == 'Int':
+               exec target + " = IntVar(self)"
+               if eval(source):
+                   exec target + ".set(" + source + ")"
+
+    def gather(self):
+       for x in self.user.typemap:
+           setattr(self.user, x[0], getattr(self, x[0]).get())
+
+    def nosave(self):
+       if ConfirmQuit(self, 'user option editing'):
+           Widget.destroy(self.master)
+
+    def save(self):
+       self.gather()
+       self.userlist.append(self.user) 
+       Widget.destroy(self.master)
+
+    def createWidgets(self):
+       topwin = Frame(self, relief=RAISED, bd=5)
+       Label(topwin, 
+             text="User options for " + 
self.user.remote).pack(side=TOP,pady=10)
+       Button(topwin, text='Save', fg='blue',
+               command=self.save).pack(side=LEFT)
+       Button(topwin, text='Quit', fg='blue',
+               command=self.nosave).pack(side=LEFT)
+       Button(topwin, text='Help', fg='blue',
+              command=lambda: helpwin(userhelp)).pack(side=RIGHT)
+       topwin.pack(fill=X)
+
+       secwin = Frame(self, relief=RAISED, bd=5)
+       Label(secwin, text="Authentication").pack(side=TOP)
+       LabeledEntry(mdropwin, 'Password:',
+                     self.password, '30').pack(side=TOP, fill=X)
+       LabeledEntry(mdropwin, 'Remote folder:',
+                    self.folder, '30').pack(side=TOP, fill=X)
+       secwin.pack(fill=X)
+
+       names = Frame(self, relief=RAISED, bd=5)
+       Label(names, text="Local names").pack(side=TOP)
+       ListEdit("New local name: ", self.localnames, None, names)
+       names.pack(fill=X)
+
+       targwin = Frame(self, relief=RAISED, bd=5)
+       Label(targwin, text="Forwarding Options").pack(side=TOP)
+       LabeledEntry(targwin, 'System to forward to:',
+                    self.smtphost, '30').pack(side=TOP, fill=X)
+       LabeledEntry(targwin, 'Connection setup command:',
+                    self.preconnect, '30').pack(side=TOP, fill=X)
+       LabeledEntry(targwin, 'Connection wrapup command:',
+                    self.postconnect, '30').pack(side=TOP, fill=X)
+       LabeledEntry(targwin, 'Local delivery agent:',
+                    self.mda, '30').pack(side=TOP, fill=X)
+       targwin.pack(fill=X)
+
+       optwin = Frame(self, relief=RAISED, bd=5)
+       Checkbutton(optwin, "Suppress deletion of messages after reading",
+                   self.keep)
+       Checkbutton(optwin, "Flush seen messages before retrieval", 
+                   self.flush)
+       Checkbutton(optwin, "Fetch old messages as well as new",
+                   self.fetchall)
+       Checkbutton(optwin, "Rewrite To/Cc/Bcc messages to enable reply", 
+                   self.rewrite)
+       Checkbutton(optwin, "Force CR/LF at end of each line",
+                   self.forcecr)
+       Checkbutton(optwin, "Strip CR from end of eacgh line",
+                   self.stripcr)
+       Checkbutton(optwin, "Pass 8 bits even theough SMTP says 7BIT",
+                   self.pass8bits)
+       Checkbutton(optwin, "Drop Status lines from forwarded messages", 
+                   self.dropstatus)
+       optwin.pack(fill=X)
+
+       limwin = Frame(self, relief=RAISED, bd=5)
+       Label(limwin, text="Resource Limits").pack(side=TOP)
+       LabeledEntry(limwin, 'Message size limit:',
+                     self.limit, '30').pack(side=TOP, fill=X)
+       LabeledEntry(limwin, 'Maximum messages to fetch each poll:',
+                     self.fetchlimit, '30').pack(side=TOP, fill=X)
+       LabeledEntry(limwin, 'Maximum messages to forward each poll:',
+                     self.batchlimit, '30').pack(side=TOP, fill=X)
+       limwin.pack(fill=X)
+
+#
+# Configure drives the configuration dialogue.  It may call multiple
+# instances of ServerEdit to do its job.
+#
+
+class Configure(Frame, ControlEdit):
+    def __init__(self, master=None):
+       Frame.__init__(self, master)
+       self.master.title('fetchmail configurator');
+       self.master.iconname('fetchmail configurator');
+       Pack.config(self)
+       self.MakeDispose()
+       self.controls = Controls()
+       self.PostControls()
+       self.MakeSitelist(master)
+       self.sites = []
+
+    def MakeDispose(self):
+       # Set the disposal of the given configuration
+       dispose = Frame(self, relief=RAISED, bd=5);
+       Label(dispose,
+               text='Configurator Controls', 
+               bd=2).pack(side=TOP, pady=10)
+       Button(dispose, text='Save', fg='blue',
+               command=self.save).pack(side=LEFT)
+       Button(dispose, text='Quit', fg='blue',
+               command=self.nosave).pack(side=LEFT)
+       Button(dispose, text='Help', fg='blue',
+              command=lambda: helpwin(confighelp)).pack(side=RIGHT)
+       dispose.pack(side=TOP, fill=X);
+
+    def MakeSitelist(self, master):
+       lf = Frame(master, relief=RAISED, bd=5)
+       Label(lf,
+             text='Remote Mail Server Configurations', 
+             bd=2).pack(side=TOP, pady=10)
+       ListEdit('New Server:', None, self.editsite, lf)
+       lf.pack(fill=X)
+
+    def editsite(self, site):
+       ServerEdit(site, self.sites, Toplevel())
+
+    def save(self):
+       self.GatherControls()
+       sys.stdout.write("# Configuration created %s\n" % 
time.ctime(time.time()))
+       sys.stdout.write(`self.controls`)
+       for site in self.sites:
+           sys.stdout.write(`site`)
+           for user in self.sites.userlist:
+               sys.stdout.write(`user`)
+       self.quit()
+
+    def nosave(self):
+       if ConfirmQuit(self, "configuration editor"):
+           self.quit()
+
+if __name__ == '__main__': 
+    ServerDefaults = Server()
+    UserDefaults = User()
+    Configure().mainloop()
+
+# The following sets edit modes for GNU EMACS
+# Local Variables:
+# mode:python
+# End:
diff --git a/test/etags/tex-src/gzip.texi b/test/etags/tex-src/gzip.texi
new file mode 100644
index 0000000..07be371
--- /dev/null
+++ b/test/etags/tex-src/gzip.texi
@@ -0,0 +1,479 @@
+\input texinfo @c -*-texinfo-*-
address@hidden %**start of header
address@hidden gzip.info
address@hidden Gzip User's Manual
address@hidden
address@hidden odd
address@hidden %**end of header
+
address@hidden
+This file documents the the GNU @code{gzip} command for compressing files.
+
+Copyright (C) 1992-1993 Jean-loup Gailly
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
address@hidden
+Permission is granted to process this file through TeX and print the
+results, provided the printed document carries copying permission
+notice identical to this one except for the removal of this paragraph
+(this paragraph not being relevant to the printed manual).
+
address@hidden ignore
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation approved
+by the Foundation.
address@hidden ifinfo
+
address@hidden
address@hidden gzip
address@hidden The data compression program
address@hidden Edition 1.2.4, for Gzip Version 1.2.4
address@hidden July 1993
address@hidden by Jean-loup Gailly
+
address@hidden
address@hidden 0pt plus 1filll
+Copyright @copyright{} 1992-1993 Jean-loup Gailly
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+are preserved on all copies.
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided that the entire
+resulting derived work is distributed under the terms of a permission
+notice identical to this one.
+
+Permission is granted to copy and distribute translations of this manual
+into another language, under the above conditions for modified versions,
+except that this permission notice may be stated in a translation approved
+by the Foundation.
address@hidden titlepage
+
address@hidden Top, , , (dir)
+
address@hidden
+This file documents the @code{gzip} command to compress files.
address@hidden ifinfo
+
address@hidden
+* Copying::            How you can copy and share @code{gzip}.
+* Overview::           Preliminary information.
+* Sample::             Sample output from @code{gzip}.
+* Invoking gzip::      How to run @code{gzip}.
+* Advanced usage::     Concatenated files.
+* Environment::                The @code{GZIP} environment variable
+* Tapes::               Using @code{gzip} on tapes.
+* Problems::           Reporting bugs.
+* Concept Index::      Index of concepts.
address@hidden menu
+
address@hidden Copying, Overview, , Top
address@hidden gpl.texinfo
+
address@hidden Overview, Sample, Copying, Top
address@hidden Overview
address@hidden overview
+
address@hidden reduces the size of the named files using Lempel-Ziv coding
+(LZ77).  Whenever possible, each file is replaced by one with the
+extension @samp{.gz}, while keeping the same ownership modes, access and
+modification times.  (The default extension is @samp{-gz} for VMS,
address@hidden for MSDOS, OS/2 FAT and Atari.)  If no files are specified or
+if a file name is "-", the standard input is compressed to the standard
+output. @code{gzip} will only attempt to compress regular files.  In
+particular, it will ignore symbolic links.
+
+If the new file name is too long for its file system, @code{gzip}
+truncates it.  @code{gzip} attempts to truncate only the parts of the
+file name longer than 3 characters.  (A part is delimited by dots.) If
+the name consists of small parts only, the longest parts are truncated.
+For example, if file names are limited to 14 characters, gzip.msdos.exe
+is compressed to gzi.msd.exe.gz.  Names are not truncated on systems
+which do not have a limit on file name length.
+
+By default, @code{gzip} keeps the original file name and timestamp in
+the compressed file. These are used when decompressing the file with the
address@hidden option. This is useful when the compressed file name was
+truncated or when the time stamp was not preserved after a file
+transfer.
+
+Compressed files can be restored to their original form using @samp{gzip -d}
+or @code{gunzip} or @code{zcat}.  If the original name saved in the
+compressed file is not suitable for its file system, a new name is
+constructed from the original one to make it legal.
+
address@hidden takes a list of files on its command line and replaces
+each file whose name ends with @samp{.gz}, @samp{.z}, @samp{.Z},
address@hidden, @samp{-z} or @samp{_z} and which begins with the correct
+magic number with an uncompressed file without the original extension.
address@hidden also recognizes the special extensions @samp{.tgz} and
address@hidden as shorthands for @samp{.tar.gz} and @samp{.tar.Z}
+respectively. When compressing, @code{gzip} uses the @samp{.tgz}
+extension if necessary instead of truncating a file with a @samp{.tar}
+extension.
+
address@hidden can currently decompress files created by @code{gzip},
address@hidden, @code{compress} or @code{pack}. The detection of the input
+format is automatic.  When using the first two formats, @code{gunzip}
+checks a 32 bit CRC (cyclic redundancy check). For @code{pack},
address@hidden checks the uncompressed length. The @code{compress} format
+was not designed to allow consistency checks. However @code{gunzip} is
+sometimes able to detect a bad @samp{.Z} file. If you get an error when
+uncompressing a @samp{.Z} file, do not assume that the @samp{.Z} file is
+correct simply because the standard @code{uncompress} does not complain.
+This generally means that the standard @code{uncompress} does not check
+its input, and happily generates garbage output.  The SCO @samp{compress
+-H} format (@code{lzh} compression method) does not include a CRC but
+also allows some consistency checks.
+
+Files created by @code{zip} can be uncompressed by @code{gzip} only if
+they have a single member compressed with the 'deflation' method. This
+feature is only intended to help conversion of @code{tar.zip} files to
+the @code{tar.gz} format. To extract @code{zip} files with several
+members, use @code{unzip} instead of @code{gunzip}.
+
address@hidden is identical to @samp{gunzip -c}.  @code{zcat}
+uncompresses either a list of files on the command line or its standard
+input and writes the uncompressed data on standard output.  @code{zcat}
+will uncompress files that have the correct magic number whether they
+have a @samp{.gz} suffix or not.
+
address@hidden uses the Lempel-Ziv algorithm used in @code{zip} and PKZIP.
+The amount of compression obtained depends on the size of the input and
+the distribution of common substrings.  Typically, text such as source
+code or English is reduced by 60-70%.  Compression is generally much
+better than that achieved by LZW (as used in @code{compress}), Huffman
+coding (as used in @code{pack}), or adaptive Huffman coding
+(@code{compact}).
+
+Compression is always performed, even if the compressed file is slightly
+larger than the original. The worst case expansion is a few bytes for
+the @code{gzip} file header, plus 5 bytes every 32K block, or an expansion
+ratio of 0.015% for large files. Note that the actual number of used
+disk blocks almost never increases. @code{gzip} preserves the mode,
+ownership and timestamps of files when compressing or decompressing.
+
address@hidden Sample, Invoking gzip, Overview, Top
address@hidden Sample Output
address@hidden sample
+
+Here are some realistic examples of running @code{gzip}.
+
+This is the output of the command @samp{gzip -h}:
+
address@hidden
+gzip 1.2.4 (18 Aug 93)
+usage: gzip [-cdfhlLnNrtvV19] [-S suffix] [file ...]
+ -c --stdout      write on standard output, keep original files unchanged
+ -d --decompress  decompress
+ -f --force       force overwrite of output file and compress links
+ -h --help        give this help
+ -l --list        list compressed file contents
+ -L --license     display software license
+ -n --no-name     do not save or restore the original name and time stamp
+ -N --name        save or restore the original name and time stamp
+ -q --quiet       suppress all warnings
+ -r --recursive   operate recursively on directories
+ -S .suf  --suffix .suf     use suffix .suf on compressed files
+ -t --test        test compressed file integrity
+ -v --verbose     verbose mode
+ -V --version     display version number
+ -1 --fast        compress faster
+ -9 --best        compress better
+ file...          files to (de)compress. If none given, use standard input.
address@hidden example
+
+This is the output of the command @samp{gzip -v texinfo.tex}:
+
address@hidden
+texinfo.tex:             71.6% -- replaced with texinfo.tex.gz
address@hidden example
+
+The following command will find all @code{gzip} files in the current
+directory and subdirectories, and extract them in place without
+destroying the original:
+
address@hidden
+find . -name '*.gz' -print | sed 's/^\(.*\)[.]gz$/gunzip < "&" > "\1"/' | sh
address@hidden example
+
address@hidden Invoking gzip, Advanced usage, Sample, Top
address@hidden Invoking @code{gzip}
address@hidden invoking
address@hidden options
+
+The format for running the @code{gzip} program is:
+
address@hidden
+gzip @var{option} @dots{}
address@hidden example
+
address@hidden supports the following options:
+
address@hidden @samp
address@hidden --stdout
address@hidden --to-stdout
address@hidden -c
+Write output on standard output; keep original files unchanged.
+If there are several input files, the output consists of a sequence of
+independently compressed members. To obtain better compression,
+concatenate all input files before compressing them.
+
address@hidden --decompress
address@hidden --uncompress
address@hidden -d
+Decompress.
+
address@hidden --force
address@hidden -f
+Force compression or decompression even if the file has multiple links
+or the corresponding file already exists, or if the compressed data
+is read from or written to a terminal. If the input data is not in
+a format recognized by @code{gzip}, and if the option --stdout is also
+given, copy the input data without change to the standard ouput: let
address@hidden behave as @code{cat}. If @samp{-f} is not given, and
+when not running in the background, @code{gzip} prompts to verify
+whether an existing file should be overwritten.
+
address@hidden --help
address@hidden -h
+Print an informative help message describing the options then quit.
+
address@hidden --list
address@hidden -l
+For each compressed file, list the following fields:
+
address@hidden
+compressed size: size of the compressed file
+uncompressed size: size of the uncompressed file
+ratio: compression ratio (0.0% if unknown)
+uncompressed_name: name of the uncompressed file
address@hidden example
+
+The uncompressed size is given as @samp{-1} for files not in @code{gzip}
+format, such as compressed @samp{.Z} files. To get the uncompressed size for
+such a file, you can use:
+
address@hidden
+zcat file.Z | wc -c
address@hidden example
+
+In combination with the --verbose option, the following fields are also
+displayed:
+
address@hidden
+method: compression method (deflate,compress,lzh,pack)
+crc: the 32-bit CRC of the uncompressed data
+date & time: time stamp for the uncompressed file
address@hidden example
+
+The crc is given as ffffffff for a file not in gzip format.
+
+With --verbose, the size totals and compression ratio for all files
+is also displayed, unless some sizes are unknown. With --quiet,
+the title and totals lines are not displayed.
+
address@hidden --license
address@hidden -L
+Display the @code{gzip} license then quit.
+
address@hidden --no-name
address@hidden -n
+When compressing, do not save the original file name and time stamp by
+default. (The original name is always saved if the name had to be
+truncated.) When decompressing, do not restore the original file name
+if present (remove only the @code{gzip}
+suffix from the compressed file name) and do not restore the original
+time stamp if present (copy it from the compressed file). This option
+is the default when decompressing.
+
address@hidden --name
address@hidden -N
+When compressing, always save the original file name and time stamp; this
+is the default. When decompressing, restore the original file name and
+time stamp if present. This option is useful on systems which have
+a limit on file name length or when the time stamp has been lost after
+a file transfer.
+
address@hidden --quiet
address@hidden -q
+Suppress all warning messages.
+
address@hidden --recursive
address@hidden -r
+Travel the directory structure recursively. If any of the file names
+specified on the command line are directories, @code{gzip} will descend
+into the directory and compress all the files it finds there (or
+decompress them in the case of @code{gunzip}).
+
address@hidden --suffix @var{suf}
address@hidden -S @var{suf}
+Use suffix @address@hidden instead of @samp{.gz}. Any suffix can be
+given, but suffixes other than @samp{.z} and @samp{.gz} should be
+avoided to avoid confusion when files are transferred to other systems.
+A null suffix forces gunzip to try decompression on all given files
+regardless of suffix, as in:
+
address@hidden
+gunzip -S "" *        (*.* for MSDOS)
address@hidden example
+
+Previous versions of gzip used the @samp{.z} suffix. This was changed to
+avoid a conflict with @code{pack}.
+
address@hidden --test
address@hidden -t
+Test. Check the compressed file integrity.
+
address@hidden --verbose
address@hidden -v
+Verbose. Display the name and percentage reduction for each file compressed.
+
address@hidden --version
address@hidden -V
+Version. Display the version number and compilation options, then quit.
+
address@hidden --fast
address@hidden --best
address@hidden address@hidden
+Regulate the speed of compression using the specified digit @var{n},
+where @samp{-1} or @samp{--fast} indicates the fastest compression
+method (less compression) and @samp{--best} or @samp{-9} indicates the
+slowest compression method (optimal compression).  The default
+compression level is @samp{-6} (that is, biased towards high compression at
+expense of speed).
address@hidden table
+
address@hidden Advanced usage, Environment, Invoking gzip, Top
address@hidden Advanced usage
address@hidden concatenated files
+
+Multiple compressed files can be concatenated. In this case,
address@hidden will extract all members at once. If one member is
+damaged, other members might still be recovered after removal of the
+damaged member. Better compression can be usually obtained if all
+members are decompressed and then recompressed in a single step.
+
+This is an example of concatenating @code{gzip} files:
+
address@hidden
+gzip -c file1  > foo.gz
+gzip -c file2 >> foo.gz
address@hidden example
+
+Then
+
address@hidden
+gunzip -c foo
address@hidden example
+
+is equivalent to
+
address@hidden
+cat file1 file2
address@hidden example
+
+In case of damage to one member of a @samp{.gz} file, other members can
+still be recovered (if the damaged member is removed). However,
+you can get better compression by compressing all members at once:
+
address@hidden
+cat file1 file2 | gzip > foo.gz
address@hidden example
+
+compresses better than
+
address@hidden
+gzip -c file1 file2 > foo.gz
address@hidden example
+
+If you want to recompress concatenated files to get better compression, do:
+
address@hidden
+zcat old.gz | gzip > new.gz
address@hidden example
+
+If a compressed file consists of several members, the uncompressed
+size and CRC reported by the @samp{--list} option applies to the last member
+only. If you need the uncompressed size for all members, you can use:
+
address@hidden
+zcat file.gz | wc -c
address@hidden example
+
+If you wish to create a single archive file with multiple members so
+that members can later be extracted independently, use an archiver such
+as @code{tar} or @code{zip}. GNU @code{tar} supports the @samp{-z}
+option to invoke @code{gzip} transparently. @code{gzip} is designed as a
+complement to @code{tar}, not as a replacement.
+
address@hidden Environment, Tapes, Advanced usage, Top
address@hidden Environment
address@hidden Environment
+
+The environment variable @code{GZIP} can hold a set of default options for
address@hidden  These options are interpreted first and can be overwritten by
+explicit command line parameters.  For example:
+
address@hidden
+for sh:    GZIP="-8v --name"; export GZIP
+for csh:   setenv GZIP "-8v --name"
+for MSDOS: set GZIP=-8v --name
address@hidden example
+
+On Vax/VMS, the name of the environment variable is @code{GZIP_OPT}, to
+avoid a conflict with the symbol set for invocation of the program.
+
address@hidden Tapes, Problems, Environment, Top
address@hidden Using @code{gzip} on tapes
address@hidden tapes
+
+When writing compressed data to a tape, it is generally necessary to pad
+the output with zeroes up to a block boundary. When the data is read and
+the whole block is passed to @code{gunzip} for decompression,
address@hidden detects that there is extra trailing garbage after the
+compressed data and emits a warning by default. You have to use the
address@hidden option to suppress the warning. This option can be set in the
address@hidden environment variable, as in:
+
address@hidden
+for sh:    GZIP="-q"  tar -xfz --block-compress /dev/rst0
+for csh:   (setenv GZIP "-q"; tar -xfz --block-compress /dev/rst0)
address@hidden example
+
+In the above example, @code{gzip} is invoked implicitly by the @samp{-z}
+option of GNU @code{tar}.  Make sure that the same block size (@samp{-b}
+option of @code{tar}) is used for reading and writing compressed data on
+tapes.  (This example assumes you are using the GNU version of
address@hidden)
+
address@hidden Problems, Concept Index, Tapes, Top
address@hidden Reporting Bugs
address@hidden bugs
+
+If you find a bug in @code{gzip}, please send electronic mail to
address@hidden@samp{jloup@@chorus.fr}} or, if this fails, to
address@hidden@samp{bug-gnu-utils@@prep.ai.mit.edu}}.  Include the version 
number,
+which you can find by running @address@hidden -V}}.  Also include in your
+message the hardware and operating system, the compiler used to compile
address@hidden,
+a description of the bug behavior, and the input to @code{gzip} that triggered
+the address@hidden
+
address@hidden Concept Index, , Problems, Top
address@hidden Concept Index
+
address@hidden cp
+
address@hidden
address@hidden
diff --git a/test/etags/tex-src/nonewline.tex b/test/etags/tex-src/nonewline.tex
new file mode 100644
index 0000000..8cc01ce
--- /dev/null
+++ b/test/etags/tex-src/nonewline.tex
@@ -0,0 +1 @@
+% This comment does not end with newline
\ No newline at end of file
diff --git a/test/etags/tex-src/testenv.tex b/test/etags/tex-src/testenv.tex
new file mode 100644
index 0000000..efb83cb
--- /dev/null
+++ b/test/etags/tex-src/testenv.tex
@@ -0,0 +1,15 @@
+\documentclass[11pt]{report}
+\usepackage{verbatim,amsmath,amssymb,morehelp}
+
+\newcommand{\nm}[2]{\nomenclature{#1}{#2}}
+
+
+\begin{document}
+\section{blah}
+
+MAKE PICTURE
+
+To develop notation, we examine a few particular cases. 
+
+
+\end{document}
diff --git a/test/etags/tex-src/texinfo.tex b/test/etags/tex-src/texinfo.tex
new file mode 100644
index 0000000..203dca7
--- /dev/null
+++ b/test/etags/tex-src/texinfo.tex
@@ -0,0 +1,3350 @@
+%% TeX macros to handle texinfo files
+
+%   Copyright (C) 1985, 1986, 1988, 1990, 1991 Free Software Foundation, Inc.
+
+%This texinfo.tex file is free software; you can redistribute it and/or
+%modify it under the terms of the GNU General Public License as
+%published by the Free Software Foundation; either version 2, or (at
+%your option) any later version.
+
+%This texinfo.tex file is distributed in the hope that it will be
+%useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+%of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+%General Public License for more details.
+
+%You should have received a copy of the GNU General Public License
+%along with this texinfo.tex file; see the file COPYING.  If not, write
+%to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139,
+%USA.
+
+
+%In other words, you are welcome to use, share and improve this program.
+%You are forbidden to forbid anyone else to use, share and improve
+%what you give them.   Help stamp out software-hoarding!
+
+\def\texinfoversion{2.73}
+\message{Loading texinfo package [Version \texinfoversion]:}
+\message{}
+
+% Print the version number if in a .fmt file.
+\everyjob{\message{[Texinfo version \texinfoversion]}\message{}}
+
+% Save some parts of plain tex whose names we will redefine.
+
+\let\ptexlbrace=\{
+\let\ptexrbrace=\}
+\let\ptexdots=\dots
+\let\ptexdot=\.
+\let\ptexstar=\*
+\let\ptexend=\end
+\let\ptexbullet=\bullet
+\let\ptexb=\b
+\let\ptexc=\c
+\let\ptexi=\i
+\let\ptext=\t
+\let\ptexl=\l
+\let\ptexL=\L
+
+\def\tie{\penalty 10000\ }     % Save plain tex definition of ~.
+
+\message{Basics,}
+\chardef\other=12
+
+% If this character appears in an error message or help string, it
+% starts a new line in the output.
+\newlinechar = `^^J
+
+\hyphenation{ap-pen-dix}
+\hyphenation{mini-buf-fer mini-buf-fers}
+\hyphenation{eshell}
+
+% Margin to add to right of even pages, to left of odd pages.
+\newdimen \bindingoffset  \bindingoffset=0pt
+\newdimen \normaloffset   \normaloffset=\hoffset
+\newdimen\pagewidth \newdimen\pageheight
+\pagewidth=\hsize \pageheight=\vsize
+
+% Sometimes it is convenient to have everything in the transcript file
+% and nothing on the terminal.  We don't just call \tracingall here,
+% since that produces some useless output on the terminal.
+%
+\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}%
+\def\loggingall{\tracingcommands2 \tracingstats2 
+   \tracingpages1 \tracingoutput1 \tracinglostchars1 
+   \tracingmacros2 \tracingparagraphs1 \tracingrestores1 
+   \showboxbreadth\maxdimen\showboxdepth\maxdimen
+}%
+
+%---------------------Begin change-----------------------
+%
+%%%% For @cropmarks command.
+% Dimensions to add cropmarks at corners Added by P. A. MacKay, 12 Nov. 1986
+%
+\newdimen\cornerlong \newdimen\cornerthick
+\newdimen \topandbottommargin
+\newdimen \outerhsize \newdimen \outervsize
+\cornerlong=1pc\cornerthick=.3pt       % These set size of cropmarks
+\outerhsize=7in
+%\outervsize=9.5in
+% Alternative @smallbook page size is 9.25in
+\outervsize=9.25in
+\topandbottommargin=.75in
+%
+%---------------------End change-----------------------
+
+% \onepageout takes a vbox as an argument.  Note that \pagecontents
+% does insertions itself, but you have to call it yourself.
+\chardef\PAGE=255  \output={\onepageout{\pagecontents\PAGE}}
+\def\onepageout#1{\hoffset=\normaloffset
+\ifodd\pageno  \advance\hoffset by \bindingoffset
+\else \advance\hoffset by -\bindingoffset\fi
+{\escapechar=`\\\relax % makes sure backslash is used in output files.
+\shipout\vbox{{\let\hsize=\pagewidth \makeheadline} \pagebody{#1}%
+{\let\hsize=\pagewidth \makefootline}}}%
+\advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
+
+%%%% For @cropmarks command %%%%
+
+% Here is a modification of the main output routine for Near East Publications
+% This provides right-angle cropmarks at all four corners.
+% The contents of the page are centerlined into the cropmarks,
+% and any desired binding offset is added as an \hskip on either
+% site of the centerlined box.  (P. A. MacKay, 12 November, 1986)
+%
+\def\croppageout#1{\hoffset=0pt % make sure this doesn't mess things up
+                \shipout
+                \vbox to \outervsize{\hsize=\outerhsize
+                 \vbox{\line{\ewtop\hfill\ewtop}}
+                 \nointerlineskip
+                 \line{\vbox{\moveleft\cornerthick\nstop}
+                       \hfill
+                       \vbox{\moveright\cornerthick\nstop}}
+                 \vskip \topandbottommargin
+                 \centerline{\ifodd\pageno\hskip\bindingoffset\fi
+                       \vbox{
+                       {\let\hsize=\pagewidth \makeheadline}
+                       \pagebody{#1}
+                       {\let\hsize=\pagewidth \makefootline}}
+                       \ifodd\pageno\else\hskip\bindingoffset\fi}
+                \vskip \topandbottommargin plus1fill minus1fill
+                 \boxmaxdepth\cornerthick
+                 \line{\vbox{\moveleft\cornerthick\nsbot}
+                       \hfill
+                       \vbox{\moveright\cornerthick\nsbot}}
+                 \nointerlineskip
+                 \vbox{\line{\ewbot\hfill\ewbot}}
+       }
+  \advancepageno 
+  \ifnum\outputpenalty>-20000 \else\dosupereject\fi}
+%
+% Do @cropmarks to get crop marks
+\def\cropmarks{\let\onepageout=\croppageout }
+
+\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}}
+{\catcode`\@ =11
+\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi
address@hidden \unvbox#1
+\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi
address@hidden \kern-\dimen@ \vfil \fi}
+}
+
+%
+% Here are the rules for the cropmarks.  Note that they are
+% offset so that the space between them is truly \outerhsize or \outervsize
+% (P. A. MacKay, 12 November, 1986)
+%
+\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong}
+\def\nstop{\vbox
+  {\hrule height\cornerthick depth\cornerlong width\cornerthick}}
+\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong}
+\def\nsbot{\vbox
+  {\hrule height\cornerlong depth\cornerthick width\cornerthick}}
+
+% Parse an argument, then pass it to #1.
+% The argument can be delimited with [...] or with "..." or braces
+% or it can be a whole line.
+% #1 should be a macro which expects
+% an ordinary undelimited TeX argument.
+
+\def\parsearg #1{\let\next=#1\begingroup\obeylines\futurelet\temp\parseargx}
+
+\def\parseargx{%
+\ifx \obeyedspace\temp \aftergroup\parseargdiscardspace \else%
+\aftergroup \parseargline %
+\fi \endgroup}
+
+{\obeyspaces %
+\gdef\parseargdiscardspace {\begingroup\obeylines\futurelet\temp\parseargx}}
+
+\gdef\obeyedspace{\ }
+
+\def\parseargline{\begingroup \obeylines \parsearglinex}
+{\obeylines %
+\gdef\parsearglinex #1^^M{\endgroup \next {#1}}}
+
+\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next}
+
+%% These are used to keep @begin/@end levels from running away
+%% Call \inENV within environments (after a \begingroup)
+\newif\ifENV \ENVfalse \def\inENV{\ifENV\relax\else\ENVtrue\fi}
+\def\ENVcheck{%
+\ifENV\errmessage{Still within an environment.  Type Return to continue.}
+\endgroup\fi} % This is not perfect, but it should reduce lossage
+
+% @begin foo  is the same as @foo, for now.
+\newhelp\EMsimple{Type <Return> to continue}
+
+\outer\def\begin{\parsearg\beginxxx}
+
+\def\beginxxx #1{%
+\expandafter\ifx\csname #1\endcsname\relax
+{\errhelp=\EMsimple \errmessage{Undefined command @begin #1}}\else
+\csname #1\endcsname\fi}
+
+%% @end foo executes the definition of \Efoo.
+%% foo can be delimited by doublequotes or brackets.
+
+\def\end{\parsearg\endxxx}
+
+\def\endxxx #1{%
+\expandafter\ifx\csname E#1\endcsname\relax
+\expandafter\ifx\csname #1\endcsname\relax
+\errmessage{Undefined command @end #1}\else
+\errorE{#1}\fi\fi
+\csname E#1\endcsname}
+\def\errorE#1{
+{\errhelp=\EMsimple address@hidden #1 not within #1 environment}}}
+
+% Single-spacing is done by various environments.
+
+\newskip\singlespaceskip \singlespaceskip = \baselineskip
+\def\singlespace{%
+{\advance \baselineskip by -\singlespaceskip
+\kern \baselineskip}%
+\baselineskip=\singlespaceskip
+}
+
+%% Simple single-character @ commands
+
+% @@ prints an @
+% Kludge this until the fonts are right (grr).
address@hidden \char '100}}
+
+% Define @` and @' to be the same as ` and '
+% but suppressing ligatures.
+\def\`{{`}}
+\def\'{{'}}
+
+% Used to generate quoted braces.
+
+\def\mylbrace {{\tt \char '173}}
+\def\myrbrace {{\tt \char '175}}
+\let\{=\mylbrace
+\let\}=\myrbrace
+
+% @: forces normal size whitespace following.
+\def\:{\spacefactor=1000 }
+
+% @* forces a line break.
+\def\*{\hfil\break\hbox{}\ignorespaces}
+
+% @. is an end-of-sentence period.
+\def\.{.\spacefactor=3000 }
+
+% @w prevents a word break.  Without the \leavevmode, @w at the
+% beginning of a paragraph, when TeX is still in vertical mode, would
+% produce a whole line of output instead of starting the paragraph.
+\def\w#1{\leavevmode\hbox{#1}}
+
+% @group ... @end group forces ... to be all on one page, by enclosing
+% it in a TeX vbox.  We use \vtop instead of \vbox to construct the box
+% to keep its height that of a normal line.  According to the rules for
+% \topskip (p.114 of the TeXbook), the glue inserted is
+% max (\topskip - \ht (first item), 0).  If that height is large,
+% therefore, no glue is inserted, and the space between the headline and
+% the text is small, which looks bad.
+% 
+\def\group{\begingroup
+  \ifnum\catcode13=\active \else
+    \errhelp = \groupinvalidhelp
+    address@hidden invalid in context where filling is enabled}%
+  \fi
+  \def\Egroup{\egroup\endgroup}%
+  \vtop\bgroup
+}
+%
+% TeX puts in an \escapechar (i.e., `@') at the beginning of the help
+% message, so this ends up printing address@hidden can only ...'.
+% 
+\newhelp\groupinvalidhelp{%
+group can only be used in environments such as @example,^^J%
+where each line of input produces a line of output.}
+
+% @need space-in-mils
+% forces a page break if there is not space-in-mils remaining.
+
+\newdimen\mil  \mil=0.001in
+
+\def\need{\parsearg\needx}
+
+% Old definition--didn't work.
+%\def\needx #1{\par %
+%% This method tries to make TeX break the page naturally
+%% if the depth of the box does not fit.
+%{\baselineskip=0pt%
+%\vtop to #1\mil{\vfil}\kern -#1\mil\penalty 10000
+%\prevdepth=-1000pt
+%}}
+
+\def\needx#1{%
+  % Go into vertical mode, so we don't make a big box in the middle of a
+  % paragraph.
+  \par
+  %
+  % Don't add any leading before our big empty box, but allow a page
+  % break, since the best break might be right here.
+  \allowbreak
+  \nointerlineskip
+  \vtop to #1\mil{\vfil}%
+  % 
+  % TeX does not even consider page breaks if a penalty added to the
+  % main vertical list is 10000 or more.  But in order to see if the
+  % empty box we just added fits on the page, we must make it consider
+  % page breaks.  On the other hand, we don't want to actually break the
+  % page after the empty box.  So we use a penalty of 9999.
+  % 
+  % There is an extremely small chance that TeX will actually break the
+  % page at this \penalty, if there are no other feasible breakpoints in
+  % sight.  (If the user is using lots of big @group commands, which
+  % almost-but-not-quite fill up a page, TeX will have a hard time doing
+  % good page breaking, for example.)  However, I could not construct an
+  % example where a page broke at this \penalty; if it happens in a real
+  % document, then we can reconsider our strategy.
+  \penalty9999
+  %
+  % Back up by the size of the box, whether we did a page break or not.
+  \kern -#1\mil
+  %
+  % Do not allow a page break right after this kern.
+  \nobreak
+}
+
+% @br   forces paragraph break
+
+\let\br = \par
+
+% @dots{}  output some dots
+
+\def\dots{$\ldots$}
+
+% @page    forces the start of a new page
+
+\def\page{\par\vfill\supereject}
+
+% @exdent text....
+% outputs text on separate line in roman font, starting at standard page margin
+
+% This records the amount of indent in the innermost environment.
+% That's how much \exdent should take out.
+\newskip\exdentamount
+
+% This defn is used inside fill environments such as @defun.
+\def\exdent{\parsearg\exdentyyy}
+\def\exdentyyy #1{{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break}}
+
+% This defn is used inside nofill environments such as @example.
+\def\nofillexdent{\parsearg\nofillexdentyyy}
+\def\nofillexdentyyy #1{{\advance \leftskip by -\exdentamount
+\leftline{\hskip\leftskip{\rm#1}}}}
+
+%\hbox{{\rm#1}}\hfil\break}}
+
+% @include file    insert text of that file as input.
+
+\def\include{\parsearg\includezzz}
+\def\includezzz #1{{\def\thisfile{#1}\input #1
+}}
+
+\def\thisfile{}
+
+% @center line   outputs that line, centered
+
+\def\center{\parsearg\centerzzz}
+\def\centerzzz #1{{\advance\hsize by -\leftskip
+\advance\hsize by -\rightskip
+\centerline{#1}}}
+
+% @sp n   outputs n lines of vertical space
+
+\def\sp{\parsearg\spxxx}
+\def\spxxx #1{\par \vskip #1\baselineskip}
+
+% @comment ...line which is ignored...
+% @c is the same as @comment
+% @ignore ... @end ignore  is another way to write a comment
+
+\def\comment{\catcode 64=\other \catcode 123=\other \catcode 125=\other%
+\parsearg \commentxxx}
+
+\def\commentxxx #1{\catcode 64=0 \catcode 123=1 \catcode 125=2 }
+
+\let\c=\comment
+
+% Prevent errors for section commands.
+% Used in @ignore and in failing conditionals.
+\def\ignoresections{%
+\let\chapter=\relax
+\let\unnumbered=\relax
+\let\top=\relax
+\let\unnumberedsec=\relax
+\let\unnumberedsection=\relax
+\let\unnumberedsubsec=\relax
+\let\unnumberedsubsection=\relax
+\let\unnumberedsubsubsec=\relax
+\let\unnumberedsubsubsection=\relax
+\let\section=\relax
+\let\subsec=\relax
+\let\subsubsec=\relax
+\let\subsection=\relax
+\let\subsubsection=\relax
+\let\appendix=\relax
+\let\appendixsec=\relax
+\let\appendixsection=\relax
+\let\appendixsubsec=\relax
+\let\appendixsubsection=\relax
+\let\appendixsubsubsec=\relax
+\let\appendixsubsubsection=\relax
+\let\contents=\relax
+\let\smallbook=\relax
+\let\titlepage=\relax
+}
+
+\def\ignore{\begingroup\ignoresections
+% Make sure that spaces turn into tokens that match what \ignorexxx wants.
+\catcode32=10
+\ignorexxx}
+\long\def\ignorexxx #1\end ignore{\endgroup\ignorespaces}
+
+\def\direntry{\begingroup\direntryxxx}
+\long\def\direntryxxx #1\end direntry{\endgroup\ignorespaces}
+
+% Conditionals to test whether a flag is set.
+
+\def\ifset{\begingroup\ignoresections\parsearg\ifsetxxx}
+
+\def\ifsetxxx #1{\endgroup
+\expandafter\ifx\csname IF#1\endcsname\relax \let\temp=\ifsetfail
+\else \let\temp=\relax \fi
+\temp}
+\def\Eifset{}
+\def\ifsetfail{\begingroup\ignoresections\ifsetfailxxx}
+\long\def\ifsetfailxxx #1\end ifset{\endgroup\ignorespaces}
+
+\def\ifclear{\begingroup\ignoresections\parsearg\ifclearxxx}
+
+\def\ifclearxxx #1{\endgroup
+\expandafter\ifx\csname IF#1\endcsname\relax \let\temp=\relax
+\else \let\temp=\ifclearfail \fi
+\temp}
+\def\Eifclear{}
+\def\ifclearfail{\begingroup\ignoresections\ifclearfailxxx}
+\long\def\ifclearfailxxx #1\end ifclear{\endgroup\ignorespaces}
+
+% @set foo     to set the flag named foo.
+% @clear foo   to clear the flag named foo.
+\def\set{\parsearg\setxxx}
+\def\setxxx #1{
+\expandafter\let\csname IF#1\endcsname=\set}
+
+\def\clear{\parsearg\clearxxx}
+\def\clearxxx #1{
+\expandafter\let\csname IF#1\endcsname=\relax}
+
+% Some texinfo constructs that are trivial in tex
+
+\def\iftex{}
+\def\Eiftex{}
+\def\ifinfo{\begingroup\ignoresections\ifinfoxxx}
+\long\def\ifinfoxxx #1\end ifinfo{\endgroup\ignorespaces}
+
+\long\def\menu #1\end menu{}
+\def\asis#1{#1}
+
+% @math means output in math mode.
+% We don't use $'s directly in the definition of \math because control
+% sequences like \math are expanded when the toc file is written.  Then,
+% we read the toc file back, the $'s will be normal characters (as they
+% should be, according to the definition of Texinfo).  So we must use a
+% control sequence to switch into and out of math mode.
+% 
+% This isn't quite enough for @math to work properly in indices, but it
+% seems unlikely it will ever be needed there.
+% 
+\let\implicitmath = $
+\def\math#1{\implicitmath #1\implicitmath}
+
+\def\node{\ENVcheck\parsearg\nodezzz}
+\def\nodezzz#1{\nodexxx [#1,]}
+\def\nodexxx[#1,#2]{\gdef\lastnode{#1}}
+\let\lastnode=\relax
+
+\def\donoderef{\ifx\lastnode\relax\else
+\expandafter\expandafter\expandafter\setref{\lastnode}\fi
+\let\lastnode=\relax}
+
+\def\unnumbnoderef{\ifx\lastnode\relax\else
+\expandafter\expandafter\expandafter\unnumbsetref{\lastnode}\fi
+\let\lastnode=\relax}
+
+\def\appendixnoderef{\ifx\lastnode\relax\else
+\expandafter\expandafter\expandafter\appendixsetref{\lastnode}\fi
+\let\lastnode=\relax}
+
+\let\refill=\relax
+  
+% @setfilename is done at the beginning of every texinfo file.
+% So open here the files we need to have open while reading the input.
+% This makes it possible to make a .fmt file for texinfo.
+\def\setfilename{%
+   \readauxfile
+   \opencontents
+   \openindices
+   \fixbackslash  % Turn off hack to swallow `\input texinfo'.
+   \global\let\setfilename=\comment % Ignore extra @setfilename cmds.
+   \comment % Ignore the actual filename.
+}
+
+\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend}
+
+\def\inforef #1{\inforefzzz #1,,,,**}
+\def\inforefzzz #1,#2,#3,#4**{See Info file \file{\losespace#3{}},
+  node \samp{\losespace#1{}}}
+\def\losespace #1{#1}
+
+\message{fonts,}
+
+% Font-change commands.
+
+% Texinfo supports the sans serif font style, which plain TeX does not.
+% So we set up a \sf analogous to plain's \rm, etc.
+\newfam\sffam
+\def\sf{\fam=\sffam \tensf}
+\let\li = \sf % Sometimes we call it \li, not \sf.
+
+%% Try out Computer Modern fonts at \magstephalf
+\let\mainmagstep=\magstephalf
+
+\ifx\bigger\relax
+\let\mainmagstep=\magstep1
+\font\textrm=cmr12
+\font\texttt=cmtt12
+\else
+\font\textrm=cmr10 scaled \mainmagstep
+\font\texttt=cmtt10 scaled \mainmagstep
+\fi
+% Instead of cmb10, you many want to use cmbx10.
+% cmbx10 is a prettier font on its own, but cmb10
+% looks better when embedded in a line with cmr10.
+\font\textbf=cmb10 scaled \mainmagstep 
+\font\textit=cmti10 scaled \mainmagstep
+\font\textsl=cmsl10 scaled \mainmagstep
+\font\textsf=cmss10 scaled \mainmagstep
+\font\textsc=cmcsc10 scaled \mainmagstep
+\font\texti=cmmi10 scaled \mainmagstep
+\font\textsy=cmsy10 scaled \mainmagstep
+
+% A few fonts for @defun, etc.
+\font\defbf=cmbx10 scaled \magstep1 %was 1314
+\font\deftt=cmtt10 scaled \magstep1
+\def\df{\let\tentt=\deftt \let\tenbf = \defbf \bf}
+
+% Fonts for indices and small examples.
+% We actually use the slanted font rather than the italic, 
+% because texinfo normally uses the slanted fonts for that.
+% Do not make many font distinctions in general in the index, since they
+% aren't very useful.
+\font\ninett=cmtt9
+\font\indrm=cmr9
+\font\indit=cmsl9
+\let\indsl=\indit
+\let\indtt=\ninett
+\let\indsf=\indrm
+\let\indbf=\indrm
+\let\indsc=\indrm
+\font\indi=cmmi9
+\font\indsy=cmsy9
+
+% Fonts for headings
+\font\chaprm=cmbx12 scaled \magstep2
+\font\chapit=cmti12 scaled \magstep2
+\font\chapsl=cmsl12 scaled \magstep2
+\font\chaptt=cmtt12 scaled \magstep2
+\font\chapsf=cmss12 scaled \magstep2
+\let\chapbf=\chaprm
+\font\chapsc=cmcsc10 scaled\magstep3
+\font\chapi=cmmi12 scaled \magstep2
+\font\chapsy=cmsy10 scaled \magstep3
+
+\font\secrm=cmbx12 scaled \magstep1
+\font\secit=cmti12 scaled \magstep1
+\font\secsl=cmsl12 scaled \magstep1
+\font\sectt=cmtt12 scaled \magstep1
+\font\secsf=cmss12 scaled \magstep1
+\font\secbf=cmbx12 scaled \magstep1
+\font\secsc=cmcsc10 scaled\magstep2
+\font\seci=cmmi12 scaled \magstep1
+\font\secsy=cmsy10 scaled \magstep2
+
+% \font\ssecrm=cmbx10 scaled \magstep1    % This size an font looked bad.
+% \font\ssecit=cmti10 scaled \magstep1    % The letters were too crowded.
+% \font\ssecsl=cmsl10 scaled \magstep1
+% \font\ssectt=cmtt10 scaled \magstep1
+% \font\ssecsf=cmss10 scaled \magstep1
+
+%\font\ssecrm=cmb10 scaled 1315        % Note the use of cmb rather than cmbx.
+%\font\ssecit=cmti10 scaled 1315       % Also, the size is a little larger than
+%\font\ssecsl=cmsl10 scaled 1315       % being scaled magstep1.
+%\font\ssectt=cmtt10 scaled 1315
+%\font\ssecsf=cmss10 scaled 1315
+
+%\let\ssecbf=\ssecrm
+
+\font\ssecrm=cmbx12 scaled \magstephalf
+\font\ssecit=cmti12 scaled \magstephalf
+\font\ssecsl=cmsl12 scaled \magstephalf
+\font\ssectt=cmtt12 scaled \magstephalf
+\font\ssecsf=cmss12 scaled \magstephalf
+\font\ssecbf=cmbx12 scaled \magstephalf
+\font\ssecsc=cmcsc10 scaled \magstep1 
+\font\sseci=cmmi12 scaled \magstephalf
+\font\ssecsy=cmsy10 scaled \magstep1
+% The smallcaps and symbol fonts should actually be scaled \magstep1.5,
+% but that is not a standard magnification.
+
+% Fonts for title page:
+\font\titlerm = cmbx12 scaled \magstep3
+\let\authorrm = \secrm
+
+% In order for the font changes to affect most math symbols and letters,
+% we have to define the \textfont of the standard families.  Since
+% texinfo doesn't allow for producing subscripts and superscripts, we
+% don't bother to reset \scriptfont and \scriptscriptfont (which would
+% also require loading a lot more fonts).
+% 
+\def\resetmathfonts{%
+  \textfont0 = \tenrm \textfont1 = \teni \textfont2 = \tensy
+  \textfont\itfam = \tenit \textfont\slfam = \tensl \textfont\bffam = \tenbf
+  \textfont\ttfam = \tentt \textfont\sffam = \tensf
+}
+
+
+% The font-changing commands redefine the meanings of \tenSTYLE, instead
+% of just \STYLE.  We do this so that font changes will continue to work
+% in math mode, where it is the current \fam that is relevant in most
+% cases, not the current.  Plain TeX does, for example,
+% \def\bf{\fam=\bffam \tenbf}  By redefining \tenbf, we obviate the need
+% to redefine \bf itself.  
+\def\textfonts{%
+  \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl
+  \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc
+  \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy
+  \resetmathfonts}
+\def\chapfonts{%
+  \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl 
+  \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc
+  \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy
+  \resetmathfonts}
+\def\secfonts{%
+  \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl
+  \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc
+  \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy
+  \resetmathfonts}
+\def\subsecfonts{%
+  \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl
+  \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc
+  \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy
+  \resetmathfonts}
+\def\indexfonts{%
+  \let\tenrm=\indrm \let\tenit=\indit \let\tensl=\indsl
+  \let\tenbf=\indbf \let\tentt=\indtt \let\smallcaps=\indsc
+  \let\tensf=\indsf \let\teni=\indi \let\tensy=\indsy
+  \resetmathfonts}
+
+% Set up the default fonts, so we can use them for creating boxes.
+% 
+\textfonts
+
+% Count depth in font-changes, for error checks
+\newcount\fontdepth \fontdepth=0
+
+% Fonts for short table of contents.
+\font\shortcontrm=cmr12
+\font\shortcontbf=cmbx12
+\font\shortcontsl=cmsl12
+
+%% Add scribe-like font environments, plus @l for inline lisp (usually sans
+%% serif) and @ii for TeX italic
+
+% \smartitalic{ARG} outputs arg in italics, followed by an italic correction
+% unless the following character is such as not to need one.
+\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else\/\fi\fi\fi}
+\def\smartitalic#1{{\sl #1}\futurelet\next\smartitalicx}
+
+\let\i=\smartitalic
+\let\var=\smartitalic
+\let\dfn=\smartitalic
+\let\emph=\smartitalic
+\let\cite=\smartitalic
+
+\def\b#1{{\bf #1}}
+\let\strong=\b
+
+\def\t#1{{\tt \exhyphenpenalty=10000\rawbackslash \frenchspacing #1}\null}
+\let\ttfont = \t
+%\def\samp #1{`{\tt \rawbackslash \frenchspacing #1}'\null}
+\def\samp #1{`\tclose{#1}'\null}
+\def\key #1{{\tt \exhyphenpenalty=10000\uppercase{#1}}\null}
+\def\ctrl #1{{\tt \rawbackslash \hat}#1}
+
+\let\file=\samp
+
+% @code is a modification of @t,
+% which makes spaces the same size as normal in the surrounding text.
+\newdimen\tclosesave
+\newdimen\tcloserm
+\def\tclose#1{{\rm \tcloserm=\fontdimen2\font \tt \tclosesave=\fontdimen2\font
+\fontdimen2\font=\tcloserm
+% prevent breaking lines at hyphens.
+\exhyphenpenalty=10000
+\def\ {{\fontdimen2\font=\tclosesave{} }}%
+ \rawbackslash \frenchspacing #1\fontdimen2\font=\tclosesave}\null}
+\let\code=\tclose
+%\let\exp=\tclose  %Was temporary
+
+% @kbd is like @code, except that if the argument is just one @key command, 
+% then @kbd has no effect.
+
+\def\xkey{\key}
+\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}%
+\ifx\one\xkey\ifx\threex\three \key{#2}%
+\else\tclose{\look}\fi
+\else\tclose{\look}\fi}
+
+% Typeset a dimension, e.g., `in' or `pt'.  The only reason for the
+% argument is to make the input look right: @dmn{pt} instead of
+% @dmn{}pt.
+% 
+\def\dmn#1{\thinspace #1}
+
+\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par}
+
+\def\l#1{{\li #1}\null}                % 
+
+\def\r#1{{\rm #1}}             % roman font
+% Use of \lowercase was suggested.
+\def\sc#1{{\smallcaps#1}}      % smallcaps font
+\def\ii#1{{\it #1}}            % italic font
+
+\message{page headings,}
+
+\newskip\titlepagetopglue \titlepagetopglue = 1.5in
+\newskip\titlepagebottomglue \titlepagebottomglue = 2pc
+
+% First the title page.  Must do @settitle before @titlepage.
+\def\titlefont#1{{\titlerm #1}}
+
+\newtoks\realeverypar
+\newif\ifseenauthor
+\newif\iffinishedtitlepage
+
+\def\titlepage{\begingroup \parindent=0pt \textfonts
+   \let\subtitlerm=\tenrm
+% I deinstalled the following change because \cmr12 is undefined.
+% This change was not in the ChangeLog anyway.  --rms.
+%   \let\subtitlerm=\cmr12
+   \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines}%
+   %
+   \def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines}%
+   %
+   % Leave some space at the very top of the page.
+   \vglue\titlepagetopglue
+   %
+   % Now you can print the title using @title.
+   \def\title{\parsearg\titlezzz}%
+   \def\titlezzz##1{\leftline{\titlefont{##1}}
+                   % print a rule at the page bottom also.
+                   \finishedtitlepagefalse
+                   \vskip4pt \hrule height 4pt \vskip4pt}%
+   % No rule at page bottom unless we print one at the top with @title.
+   \finishedtitlepagetrue
+   %
+   % Now you can put text using @subtitle.
+   \def\subtitle{\parsearg\subtitlezzz}%
+   \def\subtitlezzz##1{{\subtitlefont \rightline{##1}}}%
+   %
+   % @author should come last, but may come many times.
+   \def\author{\parsearg\authorzzz}%
+   \def\authorzzz##1{\ifseenauthor\else\vskip 0pt plus 1filll\seenauthortrue\fi
+      {\authorfont \leftline{##1}}}%
+   %  
+   % Most title ``pages'' are actually two pages long, with space
+   % at the top of the second.  We don't want the ragged left on the second.
+   \let\oldpage = \page
+   \def\page{%
+      \iffinishedtitlepage\else
+        \finishtitlepage
+      \fi
+      \oldpage
+      \let\page = \oldpage
+      \hbox{}}%
+%   \def\page{\oldpage \hbox{}}
+}
+
+\def\Etitlepage{%
+   \iffinishedtitlepage\else
+      \finishtitlepage
+   \fi
+   % It is important to do the page break before ending the group,
+   % because the headline and footline are only empty inside the group.
+   % If we use the new definition of \page, we always get a blank page
+   % after the title page, which we certainly don't want.
+   \oldpage
+   \endgroup
+   \HEADINGSon
+}
+
+\def\finishtitlepage{%
+   \vskip4pt \hrule height 2pt
+   \vskip\titlepagebottomglue
+   \finishedtitlepagetrue
+}
+
+%%% Set up page headings and footings.
+
+\let\thispage=\folio
+
+\newtoks \evenheadline    % Token sequence for heading line of even pages
+\newtoks \oddheadline     % Token sequence for heading line of odd pages
+\newtoks \evenfootline    % Token sequence for footing line of even pages
+\newtoks \oddfootline     % Token sequence for footing line of odd pages
+
+% Now make Tex use those variables
+\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline
+                            \else \the\evenheadline \fi}}
+\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline
+                            \else \the\evenfootline \fi}\HEADINGShook}
+\let\HEADINGShook=\relax
+
+% Commands to set those variables.
+% For example, this is what  @headings on  does
+% @evenheading @thistitle|@thispage|@thischapter
+% @oddheading @thischapter|@thispage|@thistitle
+% @evenfooting @thisfile||
+% @oddfooting ||@thisfile
+
+\def\evenheading{\parsearg\evenheadingxxx}
+\def\oddheading{\parsearg\oddheadingxxx}
+\def\everyheading{\parsearg\everyheadingxxx}
+
+\def\evenfooting{\parsearg\evenfootingxxx}
+\def\oddfooting{\parsearg\oddfootingxxx}
+\def\everyfooting{\parsearg\everyfootingxxx}
+
address@hidden %
+
+\gdef\evenheadingxxx #1{\evenheadingyyy #1@|@|@|@|\finish}
+\gdef\evenheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddheadingxxx #1{\oddheadingyyy #1@|@|@|@|\finish}
+\gdef\oddheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\everyheadingxxx #1{\everyheadingyyy #1@|@|@|@|\finish}
+\gdef\everyheadingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
+\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\evenfootingxxx #1{\evenfootingyyy #1@|@|@|@|\finish}
+\gdef\evenfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\oddfootingxxx #1{\oddfootingyyy #1@|@|@|@|\finish}
+\gdef\oddfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+
+\gdef\everyfootingxxx #1{\everyfootingyyy #1@|@|@|@|\finish}
+\gdef\everyfootingyyy #1@|#2@|#3@|#4\finish{%
+\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}
+\global\oddfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}}
+%
+}% unbind the catcode of @.
+
+% @headings double     turns headings on for double-sided printing.
+% @headings single     turns headings on for single-sided printing.
+% @headings off                turns them off.
+% @headings on         same as @headings double, retained for compatibility.
+% @headings after      turns on double-sided headings after this page.
+% @headings doubleafter        turns on double-sided headings after this page.
+% @headings singleafter turns on single-sided headings after this page.
+% By default, they are off.
+
+\def\headings #1 {\csname HEADINGS#1\endcsname}
+
+\def\HEADINGSoff{
+\global\evenheadline={\hfil} \global\evenfootline={\hfil}
+\global\oddheadline={\hfil} \global\oddfootline={\hfil}}
+\HEADINGSoff
+% When we turn headings on, set the page number to 1.
+% For double-sided printing, put current file name in lower left corner,
+% chapter name on inside top of right hand pages, document
+% title on inside top of left hand pages, and page numbers on outside top
+% edge of all pages.
+\def\HEADINGSdouble{
+%\pagealignmacro
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+}
+% For single-sided printing, chapter title goes across top left of page,
+% page number on top right.
+\def\HEADINGSsingle{
+%\pagealignmacro
+\global\pageno=1
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+}
+\def\HEADINGSon{\HEADINGSdouble}
+
+\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex}
+\let\HEADINGSdoubleafter=\HEADINGSafter
+\def\HEADINGSdoublex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\folio\hfil\thistitle}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+}
+
+\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex}
+\def\HEADINGSsinglex{%
+\global\evenfootline={\hfil}
+\global\oddfootline={\hfil}
+\global\evenheadline={\line{\thischapter\hfil\folio}}
+\global\oddheadline={\line{\thischapter\hfil\folio}}
+}
+
+% Subroutines used in generating headings
+% Produces Day Month Year style of output.
+\def\today{\number\day\space
+\ifcase\month\or
+January\or February\or March\or April\or May\or June\or
+July\or August\or September\or October\or November\or December\fi
+\space\number\year}
+
+% Use this if you want the Month Day, Year style of output.
+%\def\today{\ifcase\month\or
+%January\or February\or March\or April\or May\or June\or
+%July\or August\or September\or October\or November\or December\fi
+%\space\number\day, \number\year}
+
+% @settitle line...  specifies the title of the document, for headings
+% It generates no output of its own
+
+\def\thistitle{No Title}
+\def\settitle{\parsearg\settitlezzz}
+\def\settitlezzz #1{\gdef\thistitle{#1}}
+
+\message{tables,}
+
+% @tabs -- simple alignment
+
+% These don't work.  For one thing, \+ is defined as outer.
+% So these macros cannot even be defined.
+
+%\def\tabs{\parsearg\tabszzz}
+%\def\tabszzz #1{\settabs\+#1\cr}
+%\def\tabline{\parsearg\tablinezzz}
+%\def\tablinezzz #1{\+#1\cr}
+%\def\&{&}
+
+% Tables -- @table, @ftable, @vtable, @item(x), @kitem(x), @xitem(x).
+
+% default indentation of table text
+\newdimen\tableindent \tableindent=.8in
+% default indentation of @itemize and @enumerate text
+\newdimen\itemindent  \itemindent=.3in
+% margin between end of table item and start of table text.
+\newdimen\itemmargin  \itemmargin=.1in
+
+% used internally for \itemindent minus \itemmargin
+\newdimen\itemmax
+
+% Note @table, @vtable, and @vtable define @item, @itemx, etc., with
+% these defs.
+% They also define \itemindex
+% to index the item name in whatever manner is desired (perhaps none).
+
+\def\internalBitem{\smallbreak \parsearg\itemzzz}
+\def\internalBitemx{\par \parsearg\itemzzz}
+
+\def\internalBxitem "#1"{\def\xitemsubtopix{#1} \smallbreak \parsearg\xitemzzz}
+\def\internalBxitemx "#1"{\def\xitemsubtopix{#1} \par \parsearg\xitemzzz}
+
+\def\internalBkitem{\smallbreak \parsearg\kitemzzz}
+\def\internalBkitemx{\par \parsearg\kitemzzz}
+
+\def\kitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \lastfunction}}%
+                 \itemzzz {#1}}
+
+\def\xitemzzz #1{\dosubind {kw}{\code{#1}}{for {\bf \xitemsubtopic}}%
+                 \itemzzz {#1}}
+
+\def\itemzzz #1{\begingroup %
+  \advance\hsize by -\rightskip
+  \advance\hsize by -\tableindent
+  \setbox0=\hbox{\itemfont{#1}}%
+  \itemindex{#1}%
+  \nobreak % This prevents a break before @itemx.
+  %
+  % Be sure we are not still in the middle of a paragraph.
+  \parskip=0in
+  \par
+  %
+  % If the item text does not fit in the space we have, put it on a line
+  % by itself, and do not allow a page break either before or after that
+  % line.  We do not start a paragraph here because then if the next
+  % command is, e.g., @kindex, the whatsit would get put into the
+  % horizontal list on a line by itself, resulting in extra blank space.
+  \ifdim \wd0>\itemmax
+    \setbox0=\hbox{\hskip \leftskip \hskip -\tableindent \unhbox0}\box0
+    \nobreak
+  \else
+    % The item text fits into the space.  Start a paragraph, so that the
+    % following text (if any) will end up on the same line.  Since that
+    % text will be indented by \tableindent, we make the item text be in
+    % a zero-width box.
+    \noindent
+    \rlap{\hskip -\tableindent\box0}%
+  \fi
+  \endgroup
+}
+
address@hidden while not in a table}}
address@hidden while not in a table}}
address@hidden while not in a table}}
address@hidden while not in a table}}
address@hidden while not in a table}}
address@hidden while not in a table}}
+
+%% Contains a kludge to get @end[description] to work
+\def\description{\tablez{\dontindex}{1}{}{}{}{}}
+
+\def\table{\begingroup\inENV\obeylines\obeyspaces\tablex}
+{\obeylines\obeyspaces%
+\gdef\tablex #1^^M{%
+\tabley\dontindex#1        \endtabley}}
+
+\def\ftable{\begingroup\inENV\obeylines\obeyspaces\ftablex}
+{\obeylines\obeyspaces%
+\gdef\ftablex #1^^M{%
+\tabley\fnitemindex#1        \endtabley
+\def\Eftable{\endgraf\endgroup\afterenvbreak}%
+\let\Etable=\relax}}
+
+\def\vtable{\begingroup\inENV\obeylines\obeyspaces\vtablex}
+{\obeylines\obeyspaces%
+\gdef\vtablex #1^^M{%
+\tabley\vritemindex#1        \endtabley
+\def\Evtable{\endgraf\endgroup\afterenvbreak}%
+\let\Etable=\relax}}
+
+\def\dontindex #1{}
+\def\fnitemindex #1{\doind {fn}{\code{#1}}}%
+\def\vritemindex #1{\doind {vr}{\code{#1}}}%
+
+{\obeyspaces %
+\gdef\tabley#1#2 #3 #4 #5 #6 #7\endtabley{\endgroup%
+\tablez{#1}{#2}{#3}{#4}{#5}{#6}}}
+
+\def\tablez #1#2#3#4#5#6{%
+\aboveenvbreak %
+\begingroup %
+\def\Edescription{\Etable}% Neccessary kludge.
+\let\itemindex=#1%
+\ifnum 0#3>0 \advance \leftskip by #3\mil \fi %
+\ifnum 0#4>0 \tableindent=#4\mil \fi %
+\ifnum 0#5>0 \advance \rightskip by #5\mil \fi %
+\def\itemfont{#2}%
+\itemmax=\tableindent %
+\advance \itemmax by -\itemmargin %
+\advance \leftskip by \tableindent %
+\exdentamount=\tableindent
+\parindent = 0pt
+\parskip = \smallskipamount
+\ifdim \parskip=0pt \parskip=2pt \fi%
+\def\Etable{\endgraf\endgroup\afterenvbreak}%
+\let\item = \internalBitem %
+\let\itemx = \internalBitemx %
+\let\kitem = \internalBkitem %
+\let\kitemx = \internalBkitemx %
+\let\xitem = \internalBxitem %
+\let\xitemx = \internalBxitemx %
+}
+
+% This is the counter used by @enumerate, which is really @itemize
+
+\newcount \itemno
+
+\def\itemize{\parsearg\itemizezzz}
+
+\def\itemizezzz #1{%
+  \begingroup % ended by the @end itemsize
+  \itemizey {#1}{\Eitemize}
+}
+
+\def\itemizey #1#2{%
+\aboveenvbreak %
+\itemmax=\itemindent %
+\advance \itemmax by -\itemmargin %
+\advance \leftskip by \itemindent %
+\exdentamount=\itemindent
+\parindent = 0pt %
+\parskip = \smallskipamount %
+\ifdim \parskip=0pt \parskip=2pt \fi%
+\def#2{\endgraf\endgroup\afterenvbreak}%
+\def\itemcontents{#1}%
+\let\item=\itemizeitem}
+
+\def\bullet{$\ptexbullet$}
+\def\minus{$-$}
+
+% Set sfcode to normal for the chars that usually have another value.
+% These are `.?!:;,'
+\def\frenchspacing{\sfcode46=1000 \sfcode63=1000 \sfcode33=1000
+  \sfcode58=1000 \sfcode59=1000 \sfcode44=1000 }
+
+% \splitoff TOKENS\endmark defines \first to be the first token in
+% TOKENS, and \rest to be the remainder.
+% 
+\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}%
+
+% Allow an optional argument of an uppercase letter, lowercase letter,
+% or number, to specify the first label in the enumerated list.  No
+% argument is the same as `1'.
+% 
+\def\enumerate{\parsearg\enumeratezzz}
+\def\enumeratezzz #1{\enumeratey #1  \endenumeratey}
+\def\enumeratey #1 #2\endenumeratey{%
+  \begingroup % ended by the @end enumerate
+  %
+  % If we were given no argument, pretend we were given `1'.
+  \def\thearg{#1}%
+  \ifx\thearg\empty \def\thearg{1}\fi
+  %
+  % Detect if the argument is a single token.  If so, it might be a
+  % letter.  Otherwise, the only valid thing it can be is a number.
+  % (We will always have one token, because of the test we just made.
+  % This is a good thing, since \splitoff doesn't work given nothing at
+  % all -- the first parameter is undelimited.)
+  \expandafter\splitoff\thearg\endmark
+  \ifx\rest\empty
+    % Only one token in the argument.  It could still be anything.
+    % A ``lowercase letter'' is one whose \lccode is nonzero.
+    % An ``uppercase letter'' is one whose \lccode is both nonzero, and
+    %   not equal to itself.
+    % Otherwise, we assume it's a number.
+    % 
+    % We need the \relax at the end of the \ifnum lines to stop TeX from
+    % continuing to look for a <number>.
+    % 
+    \ifnum\lccode\expandafter`\thearg=0\relax 
+      \numericenumerate % a number (we hope)
+    \else
+      % It's a letter.
+      \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax
+        \lowercaseenumerate % lowercase letter
+      \else
+        \uppercaseenumerate % uppercase letter
+      \fi
+    \fi
+  \else
+    % Multiple tokens in the argument.  We hope it's a number.
+    \numericenumerate
+  \fi
+}
+
+% An @enumerate whose labels are integers.  The starting integer is
+% given in \thearg.
+% 
+\def\numericenumerate{%
+  \itemno = \thearg
+  \startenumeration{\the\itemno}%
+}
+
+% The starting (lowercase) letter is in \thearg.
+\def\lowercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more lowercase letters in @enumerate; get a bigger
+                  alphabet}%
+    \fi
+    \char\lccode\itemno
+  }%
+}
+
+% The starting (uppercase) letter is in \thearg.
+\def\uppercaseenumerate{%
+  \itemno = \expandafter`\thearg
+  \startenumeration{%
+    % Be sure we're not beyond the end of the alphabet.
+    \ifnum\itemno=0
+      \errmessage{No more uppercase letters in @enumerate; get a bigger
+                  alphabet}
+    \fi
+    \char\uccode\itemno
+  }%
+}
+
+% Call itemizey, adding a period to the first argument and supplying the
+% common last two arguments.  Also subtract one from the initial value in
+% \itemno, since @item increments \itemno.
+% 
+\def\startenumeration#1{%
+  \advance\itemno by -1
+  \itemizey{#1.}\Eenumerate\flushcr
+}
+
+% @alphaenumerate and @capsenumerate are abbreviations for giving an arg
+% to @enumerate.
+% 
+\def\alphaenumerate{\enumerate{a}}
+\def\capsenumerate{\enumerate{A}}
+\def\Ealphaenumerate{\Eenumerate}
+\def\Ecapsenumerate{\Eenumerate}
+
+% Definition of @item while inside @itemize.
+
+\def\itemizeitem{%
+\advance\itemno by 1
+{\let\par=\endgraf \smallbreak}%
+\ifhmode \errmessage{\in hmode at itemizeitem}\fi
+{\parskip=0in \hskip 0pt
+\hbox to 0pt{\hss \itemcontents\hskip \itemmargin}%
+\vadjust{\penalty 1200}}%
+\flushcr}
+
+\message{indexing,}
+% Index generation facilities
+
+% Define \newwrite to be identical to plain tex's \newwrite
+% except not \outer, so it can be used within \newindex.
address@hidden
address@hidden@@n}}
+
+% \newindex {foo} defines an index named foo.
+% It automatically defines \fooindex such that
+% \fooindex ...rest of line... puts an entry in the index foo.
+% It also defines \fooindfile to be the number of the output channel for
+% the file that        accumulates this index.  The file's extension is foo.
+% The name of an index should be no more than 2 characters long
+% for the sake of vms.
+
+\def\newindex #1{
+\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
+\openout \csname#1indfile\endcsname \jobname.#1        % Open the file
+\expandafter\xdef\csname#1index\endcsname{%    % Define \xxxindex
+\noexpand\doindex {#1}}
+}
+
+% @defindex foo  ==  \newindex{foo}
+
+\def\defindex{\parsearg\newindex}
+
+% Define @defcodeindex, like @defindex except put all entries in @code.
+
+\def\newcodeindex #1{
+\expandafter\newwrite \csname#1indfile\endcsname% Define number for output file
+\openout \csname#1indfile\endcsname \jobname.#1        % Open the file
+\expandafter\xdef\csname#1index\endcsname{%    % Define \xxxindex
+\noexpand\docodeindex {#1}}
+}
+
+\def\defcodeindex{\parsearg\newcodeindex}
+
+% @synindex foo bar    makes index foo feed into index bar.
+% Do this instead of @defindex foo if you don't want it as a separate index.
+\def\synindex #1 #2 {%
+\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
+\expandafter\let\csname#1indfile\endcsname=\synindexfoo
+\expandafter\xdef\csname#1index\endcsname{%    % Define \xxxindex
+\noexpand\doindex {#2}}%
+}
+
+% @syncodeindex foo bar   similar, but put all entries made for index foo
+% inside @code.
+\def\syncodeindex #1 #2 {%
+\expandafter\let\expandafter\synindexfoo\expandafter=\csname#2indfile\endcsname
+\expandafter\let\csname#1indfile\endcsname=\synindexfoo
+\expandafter\xdef\csname#1index\endcsname{%    % Define \xxxindex
+\noexpand\docodeindex {#2}}%
+}
+
+% Define \doindex, the driver for all \fooindex macros.
+% Argument #1 is generated by the calling \fooindex macro,
+%  and it is "foo", the name of the index.
+
+% \doindex just uses \parsearg; it calls \doind for the actual work.
+% This is because \doind is more useful to call from other macros.
+
+% There is also \dosubind {index}{topic}{subtopic}
+% which makes an entry in a two-level index such as the operation index.
+
+\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer}
+\def\singleindexer #1{\doind{\indexname}{#1}}
+
+% like the previous two, but they put @code around the argument.
+\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer}
+\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}}
+
+\def\indexdummies{%
+\def\_{{\realbackslash _}}%
+\def\w{\realbackslash w }%
+\def\bf{\realbackslash bf }%
+\def\rm{\realbackslash rm }%
+\def\sl{\realbackslash sl }%
+\def\sf{\realbackslash sf}%
+\def\tt{\realbackslash tt}%
+\def\gtr{\realbackslash gtr}%
+\def\less{\realbackslash less}%
+\def\hat{\realbackslash hat}%
+\def\char{\realbackslash char}%
+\def\TeX{\realbackslash TeX}%
+\def\dots{\realbackslash dots }%
+\def\copyright{\realbackslash copyright }%
+\def\tclose##1{\realbackslash tclose {##1}}%
+\def\code##1{\realbackslash code {##1}}%
+\def\samp##1{\realbackslash samp {##1}}%
+\def\t##1{\realbackslash r {##1}}%
+\def\r##1{\realbackslash r {##1}}%
+\def\i##1{\realbackslash i {##1}}%
+\def\b##1{\realbackslash b {##1}}%
+\def\cite##1{\realbackslash cite {##1}}%
+\def\key##1{\realbackslash key {##1}}%
+\def\file##1{\realbackslash file {##1}}%
+\def\var##1{\realbackslash var {##1}}%
+\def\kbd##1{\realbackslash kbd {##1}}%
+}
+
+% \indexnofonts no-ops all font-change commands.
+% This is used when outputting the strings to sort the index by.
+\def\indexdummyfont#1{#1}
+\def\indexdummytex{TeX}
+\def\indexdummydots{...}
+
+\def\indexnofonts{%
+\let\w=\indexdummyfont
+\let\t=\indexdummyfont
+\let\r=\indexdummyfont
+\let\i=\indexdummyfont
+\let\b=\indexdummyfont
+\let\emph=\indexdummyfont
+\let\strong=\indexdummyfont
+\let\cite=\indexdummyfont
+\let\sc=\indexdummyfont
+%Don't no-op \tt, since it isn't a user-level command
+% and is used in the definitions of the active chars like <, >, |...
+%\let\tt=\indexdummyfont
+\let\tclose=\indexdummyfont
+\let\code=\indexdummyfont
+\let\file=\indexdummyfont
+\let\samp=\indexdummyfont
+\let\kbd=\indexdummyfont
+\let\key=\indexdummyfont
+\let\var=\indexdummyfont
+\let\TeX=\indexdummytex
+\let\dots=\indexdummydots
+}
+
+% To define \realbackslash, we must make \ not be an escape.
+% We must first make another character (@) an escape
+% so we do not become unable to do a definition.
+
address@hidden \catcode`\\=\other
address@hidden@realbackslash{\}}
+
+\let\indexbackslash=0  %overridden during \printindex.
+
+\def\doind #1#2{%
+{\count10=\lastpenalty %
+{\indexdummies % Must do this here, since \bf, etc expand at this stage
+\escapechar=`\\%
+{\let\folio=0% Expand all macros now EXCEPT \folio
+\def\rawbackslashxx{\indexbackslash}% \indexbackslash isn't defined now
+% so it will be output as is; and it will print as backslash in the indx.
+%
+% Now process the index-string once, with all font commands turned off,
+% to get the string to sort the index by.
+{\indexnofonts
+\xdef\temp1{#2}%
+}%
+% Now produce the complete index entry.  We process the index-string again,
+% this time with font commands expanded, to get what to print in the index.
+\edef\temp{%
+\write \csname#1indfile\endcsname{%
+\realbackslash entry {\temp1}{\folio}{#2}}}%
+\temp }%
+}\penalty\count10}}
+
+\def\dosubind #1#2#3{%
+{\count10=\lastpenalty %
+{\indexdummies % Must do this here, since \bf, etc expand at this stage
+\escapechar=`\\%
+{\let\folio=0%
+\def\rawbackslashxx{\indexbackslash}%
+%
+% Now process the index-string once, with all font commands turned off,
+% to get the string to sort the index by.
+{\indexnofonts
+\xdef\temp1{#2 #3}%
+}%
+% Now produce the complete index entry.  We process the index-string again,
+% this time with font commands expanded, to get what to print in the index.
+\edef\temp{%
+\write \csname#1indfile\endcsname{%
+\realbackslash entry {\temp1}{\folio}{#2}{#3}}}%
+\temp }%
+}\penalty\count10}}
+
+% The index entry written in the file actually looks like
+%  \entry {sortstring}{page}{topic}
+% or
+%  \entry {sortstring}{page}{topic}{subtopic}
+% The texindex program reads in these files and writes files
+% containing these kinds of lines:
+%  \initial {c}
+%     before the first topic whose initial is c
+%  \entry {topic}{pagelist}
+%     for a topic that is used without subtopics
+%  \primary {topic}
+%     for the beginning of a topic that is used with subtopics
+%  \secondary {subtopic}{pagelist}
+%     for each subtopic.
+
+% Define the user-accessible indexing commands 
+% @findex, @vindex, @kindex, @cindex.
+
+\def\findex {\fnindex}
+\def\kindex {\kyindex}
+\def\cindex {\cpindex}
+\def\vindex {\vrindex}
+\def\tindex {\tpindex}
+\def\pindex {\pgindex}
+
+\def\cindexsub {\begingroup\obeylines\cindexsub}
+{\obeylines %
+\gdef\cindexsub "#1" #2^^M{\endgroup %
+\dosubind{cp}{#2}{#1}}}
+
+% Define the macros used in formatting output of the sorted index material.
+
+% This is what you call to cause a particular index to get printed.
+% Write
+% @unnumbered Function Index
+% @printindex fn
+
+\def\printindex{\parsearg\doprintindex}
+
+\def\doprintindex#1{%
+  \tex
+  \dobreak \chapheadingskip {10000}
+  \catcode`\%=\other\catcode`\&=\other\catcode`\#=\other
+  \catcode`\$=\other\catcode`\_=\other
+  \catcode`\~=\other
+  %
+  % The following don't help, since the chars were translated
+  % when the raw index was written, and their fonts were discarded
+  % due to \indexnofonts.
+  %\catcode`\"=\active
+  %\catcode`\^=\active
+  %\catcode`\_=\active
+  %\catcode`\|=\active
+  %\catcode`\<=\active
+  %\catcode`\>=\active
+  % %
+  \def\indexbackslash{\rawbackslashxx}
+  \indexfonts\rm \tolerance=9500 \advance\baselineskip -1pt
+  \begindoublecolumns
+  %
+  % See if the index file exists and is nonempty.
+  \openin 1 \jobname.#1s
+  \ifeof 1 
+    % \enddoublecolumns gets confused if there is no text in the index,
+    % and it loses the chapter title and the aux file entries for the
+    % index.  The easiest way to prevent this problem is to make sure
+    % there is some text.
+    (Index is nonexistent)
+    \else
+    %
+    % If the index file exists but is empty, then \openin leaves \ifeof
+    % false.  We have to make TeX try to read something from the file, so
+    % it can discover if there is anything in it.
+    \read 1 to \temp
+    \ifeof 1
+      (Index is empty)
+    \else
+      \input \jobname.#1s
+    \fi
+  \fi
+  \closein 1
+  \enddoublecolumns
+  \Etex
+}
+
+% These macros are used by the sorted index file itself.
+% Change them to control the appearance of the index.
+
+% Same as \bigskipamount except no shrink.
+% \balancecolumns gets confused if there is any shrink.
+\newskip\initialskipamount \initialskipamount 12pt plus4pt
+
+\def\initial #1{%
+{\let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt
+\ifdim\lastskip<\initialskipamount
+\removelastskip \penalty-200 \vskip \initialskipamount\fi
+\line{\secbf#1\hfill}\kern 2pt\penalty10000}}
+
+\def\entry #1#2{\begingroup
+  \parfillskip=0in \parskip=0in \parindent=0in
+  %
+  % \hangindent is only relevant when the page number and the entry text
+  % don't fit on one line.  In that case, bob suggests starting the dots
+  % pretty far over on the line.
+  % \hangafter is reset to 1 at the start of each paragraph.
+  \hangindent=.75\hsize
+  \noindent
+  %
+  % Don't break the text of the index entry.
+  \hbox{#1}%
+  %
+  % If we must, put the page number on a line of its own, and fill out
+  % this line with blank space.  (The \hfil is overwhelmed with the
+  % fill leaders glue in \indexdotfill if the page number does fit.)
+  \hfil\penalty50
+  \null\nobreak\indexdotfill % Have leaders before the page number.
+  %
+  % The `\ ' here is removed by the implicit \unskip that TeX does as
+  % part of (the primitive) \par.  Without, a spurious underfull \hbox ensues.
+  \ #2% The page number ends the paragraph.
+  \par
+\endgroup}
+
+% Like \dotfill except takes at least 1 em.
+\def\indexdotfill{\cleaders
+  \hbox{$\mathsurround=0pt \mkern1.5mu . \mkern1.5mu$}\hskip 1em plus 1fill}
+
+\def\primary #1{\line{#1\hfil}}
+
+\newskip\secondaryindent \secondaryindent=0.5cm
+
+\def\secondary #1#2{
+{\parfillskip=0in \parskip=0in
+\hangindent =1in \hangafter=1
+\noindent\hskip\secondaryindent\hbox{#1}\indexdotfill #2\par
+}}
+
+%% Define two-column mode, which is used in indexes.
+%% Adapted from the TeXBook, page 416
+\catcode address@hidden
+
+\newbox\partialpage
+
+\newdimen\doublecolumnhsize  \doublecolumnhsize = 3.11in
+\newdimen\doublecolumnvsize  \doublecolumnvsize = 19.1in
+\newdimen\availdimen@
+
+\def\begindoublecolumns{\begingroup
+  \output={\global\setbox\partialpage=
+    \vbox{\unvbox255\kern -\topskip \kern \baselineskip}}\eject
+  \output={\doublecolumnout}%
+  \hsize=\doublecolumnhsize \vsize=\doublecolumnvsize}
+\def\enddoublecolumns{\output={\balancecolumns}\eject
+  \endgroup \pagegoal=\vsize}
+
+\def\doublecolumnout{\splittopskip=\topskip \splitmaxdepth=\maxdepth
+  address@hidden \advance\dimen@ by-\ht\partialpage
+  \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+  \onepageout\pagesofar \unvbox255 \penalty\outputpenalty}
+\def\pagesofar{\unvbox\partialpage %
+  \hsize=\doublecolumnhsize % have to restore this since output routine
+%            changes it to set cropmarks (P. A. MacKay, 12 Nov. 1986)
+  \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}}
+\def\balancecolumns{%
+% Unset the glue.
+  \setbox255=\vbox{\unvbox255}
+  address@hidden
+  \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
+  \divide\dimen@ by2
+  address@hidden \advance\availdimen@ by-\ht\partialpage
+% If the remaining data is too big for one page,
+% output one page normally, then work with what remains.
+  \ifdim \dimen@>\availdimen@
+   {
+     \splittopskip=\topskip \splitmaxdepth=\maxdepth
+     address@hidden \advance\dimen@ by-\ht\partialpage
+     \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@
+     \onepageout\pagesofar
+   }
+% Recompute size of what remains, in case we just output some of it.
+  address@hidden
+  \advance\dimen@ by\topskip \advance\dimen@ by-\baselineskip
+  \divide\dimen@ by2
+  \fi
+  \setbox0=\vbox{\unvbox255}
+  \splittopskip=\topskip
+  {\vbadness=10000 \loop \global\setbox3=\copy0
+    \global\setbox1=\vsplit3 to\dimen@
+    \ifdim\ht3>\dimen@ \global\advance\dimen@ by1pt \repeat}
+  \setbox0=\vbox address@hidden  \setbox2=\vbox address@hidden
+  \pagesofar}
+
+\catcode address@hidden
+\message{sectioning,}
+% Define chapters, sections, etc.
+
+\newcount \chapno
+\newcount \secno        \secno=0
+\newcount \subsecno     \subsecno=0
+\newcount \subsubsecno  \subsubsecno=0
+
+% This counter is funny since it counts through charcodes of letters A, B, ...
+\newcount \appendixno  \appendixno = `\@
+\def\appendixletter{\char\the\appendixno}
+
+\newwrite \contentsfile
+% This is called from \setfilename.
+\def\opencontents{\openout \contentsfile = \jobname.toc}
+
+% Each @chapter defines this as the name of the chapter.
+% page headings and footings can use it.  @section does likewise
+
+\def\thischapter{} \def\thissection{}
+\def\seccheck#1{\if \pageno<0 %
address@hidden not allowed after generating table of contents}\fi
+%
+}
+
+\def\chapternofonts{%
+\let\rawbackslash=\relax%
+\let\frenchspacing=\relax%
+\def\result{\realbackslash result}
+\def\equiv{\realbackslash equiv}
+\def\expansion{\realbackslash expansion}
+\def\print{\realbackslash print}
+\def\TeX{\realbackslash TeX}
+\def\dots{\realbackslash dots}
+\def\copyright{\realbackslash copyright}
+\def\tt{\realbackslash tt}
+\def\bf{\realbackslash bf }
+\def\w{\realbackslash w}
+\def\less{\realbackslash less}
+\def\gtr{\realbackslash gtr}
+\def\hat{\realbackslash hat}
+\def\char{\realbackslash char}
+\def\tclose##1{\realbackslash tclose {##1}}
+\def\code##1{\realbackslash code {##1}}
+\def\samp##1{\realbackslash samp {##1}}
+\def\r##1{\realbackslash r {##1}}
+\def\b##1{\realbackslash b {##1}}
+\def\key##1{\realbackslash key {##1}}
+\def\file##1{\realbackslash file {##1}}
+\def\kbd##1{\realbackslash kbd {##1}}
+% These are redefined because @smartitalic wouldn't work inside xdef.
+\def\i##1{\realbackslash i {##1}}
+\def\cite##1{\realbackslash cite {##1}}
+\def\var##1{\realbackslash var {##1}}
+\def\emph##1{\realbackslash emph {##1}}
+\def\dfn##1{\realbackslash dfn {##1}}
+}
+
+\def\thischaptername{No Chapter Title}
+\outer\def\chapter{\parsearg\chapterzzz}
+\def\chapterzzz #1{\seccheck{chapter}%
+\secno=0 \subsecno=0 \subsubsecno=0
+\global\advance \chapno by 1 \message{Chapter \the\chapno}%
+\chapmacro {#1}{\the\chapno}%
+\gdef\thissection{#1}%
+\gdef\thischaptername{#1}%
+% We don't substitute the actual chapter name into \thischapter
+% because we don't want its macros evaluated now.
+\xdef\thischapter{Chapter \the\chapno: \noexpand\thischaptername}%
+{\chapternofonts%
+\edef\temp{{\realbackslash chapentry {#1}{\the\chapno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp  %
+\donoderef %
+\global\let\section = \numberedsec
+\global\let\subsection = \numberedsubsec
+\global\let\subsubsection = \numberedsubsubsec
+}}
+
+\outer\def\appendix{\parsearg\appendixzzz}
+\def\appendixzzz #1{\seccheck{appendix}%
+\secno=0 \subsecno=0 \subsubsecno=0
+\global\advance \appendixno by 1 \message{Appendix \appendixletter}%
+\chapmacro {#1}{Appendix \appendixletter}%
+\gdef\thissection{#1}%
+\gdef\thischaptername{#1}%
+\xdef\thischapter{Appendix \appendixletter: \noexpand\thischaptername}%
+{\chapternofonts%
+\edef\temp{{\realbackslash chapentry 
+  {#1}{Appendix \appendixletter}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp  %
+\appendixnoderef %
+\global\let\section = \appendixsec
+\global\let\subsection = \appendixsubsec
+\global\let\subsubsection = \appendixsubsubsec
+}}
+
+\outer\def\top{\parsearg\unnumberedzzz}
+\outer\def\unnumbered{\parsearg\unnumberedzzz}
+\def\unnumberedzzz #1{\seccheck{unnumbered}%
+\secno=0 \subsecno=0 \subsubsecno=0 \message{(#1)}
+\unnumbchapmacro {#1}%
+\gdef\thischapter{#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbchapentry {#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp  %
+\unnumbnoderef %
+\global\let\section = \unnumberedsec
+\global\let\subsection = \unnumberedsubsec
+\global\let\subsubsection = \unnumberedsubsubsec
+}}
+
+\outer\def\numberedsec{\parsearg\seczzz}
+\def\seczzz #1{\seccheck{section}%
+\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+\gdef\thissection{#1}\secheading {#1}{\the\chapno}{\the\secno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash secentry %
+{#1}{\the\chapno}{\the\secno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\donoderef %
+\penalty 10000 %
+}}
+
+\outer\def\appendixsection{\parsearg\appendixsectionzzz}
+\outer\def\appendixsec{\parsearg\appendixsectionzzz}
+\def\appendixsectionzzz #1{\seccheck{appendixsection}%
+\subsecno=0 \subsubsecno=0 \global\advance \secno by 1 %
+\gdef\thissection{#1}\secheading {#1}{\appendixletter}{\the\secno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash secentry %
+{#1}{\appendixletter}{\the\secno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\appendixnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\unnumberedsec{\parsearg\unnumberedseczzz}
+\def\unnumberedseczzz #1{\seccheck{unnumberedsec}%
+\plainsecheading {#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbsecentry{#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\unnumbnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\numberedsubsec{\parsearg\numberedsubseczzz}
+\def\numberedsubseczzz #1{\seccheck{subsection}%
+\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+\subsecheading {#1}{\the\chapno}{\the\secno}{\the\subsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsecentry %
+{#1}{\the\chapno}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\donoderef %
+\penalty 10000 %
+}}
+
+\outer\def\appendixsubsec{\parsearg\appendixsubseczzz}
+\def\appendixsubseczzz #1{\seccheck{appendixsubsec}%
+\gdef\thissection{#1}\subsubsecno=0 \global\advance \subsecno by 1 %
+\subsecheading {#1}{\appendixletter}{\the\secno}{\the\subsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsecentry %
+{#1}{\appendixletter}{\the\secno}{\the\subsecno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\appendixnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\unnumberedsubsec{\parsearg\unnumberedsubseczzz}
+\def\unnumberedsubseczzz #1{\seccheck{unnumberedsubsec}%
+\plainsecheading {#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbsubsecentry{#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\unnumbnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\numberedsubsubsec{\parsearg\numberedsubsubseczzz}
+\def\numberedsubsubseczzz #1{\seccheck{subsubsection}%
+\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+\subsubsecheading {#1}
+  {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsubsecentry %
+  {#1}
+  {\the\chapno}{\the\secno}{\the\subsecno}{\the\subsubsecno}
+  {\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\donoderef %
+\penalty 10000 %
+}}
+
+\outer\def\appendixsubsubsec{\parsearg\appendixsubsubseczzz}
+\def\appendixsubsubseczzz #1{\seccheck{appendixsubsubsec}%
+\gdef\thissection{#1}\global\advance \subsubsecno by 1 %
+\subsubsecheading {#1}
+  {\appendixletter}{\the\secno}{\the\subsecno}{\the\subsubsecno}%
+{\chapternofonts%
+\edef\temp{{\realbackslash subsubsecentry{#1}%
+  {\appendixletter}
+  {\the\secno}{\the\subsecno}{\the\subsubsecno}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\appendixnoderef %
+\penalty 10000 %
+}}
+
+\outer\def\unnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
+\def\unnumberedsubsubseczzz #1{\seccheck{unnumberedsubsubsec}%
+\plainsecheading {#1}\gdef\thissection{#1}%
+{\chapternofonts%
+\edef\temp{{\realbackslash unnumbsubsubsecentry{#1}{\noexpand\folio}}}%
+\escapechar=`\\%
+\write \contentsfile \temp %
+\unnumbnoderef %
+\penalty 10000 %
+}}
+
+% These are variants which are not "outer", so they can appear in @ifinfo.
+% Actually, they should now be obsolete; ordinary section commands should work.
+\def\infotop{\parsearg\unnumberedzzz}
+\def\infounnumbered{\parsearg\unnumberedzzz}
+\def\infounnumberedsec{\parsearg\unnumberedseczzz}
+\def\infounnumberedsubsec{\parsearg\unnumberedsubseczzz}
+\def\infounnumberedsubsubsec{\parsearg\unnumberedsubsubseczzz}
+
+\def\infoappendix{\parsearg\appendixzzz}
+\def\infoappendixsec{\parsearg\appendixseczzz}
+\def\infoappendixsubsec{\parsearg\appendixsubseczzz}
+\def\infoappendixsubsubsec{\parsearg\appendixsubsubseczzz}
+
+\def\infochapter{\parsearg\chapterzzz}
+\def\infosection{\parsearg\sectionzzz}
+\def\infosubsection{\parsearg\subsectionzzz}
+\def\infosubsubsection{\parsearg\subsubsectionzzz}
+
+% These macros control what the section commands do, according
+% to what kind of chapter we are in (ordinary, appendix, or unnumbered).
+% Define them by default for a numbered chapter.
+\global\let\section = \numberedsec
+\global\let\subsection = \numberedsubsec
+\global\let\subsubsection = \numberedsubsubsec
+
+% Define @majorheading, @heading and @subheading
+
+% NOTE on use of \vbox for chapter headings, section headings, and
+% such:
+%      1) We use \vbox rather than the earlier \line to permit
+%         overlong headings to fold.
+%      2) \hyphenpenalty is set to 10000 because hyphenation in a
+%         heading is obnoxious; this forbids it.
+%       3) Likewise, headings look best if no \parindent is used, and
+%          if justification is not attempted.  Hence \raggedright.
+
+
+\def\majorheading{\parsearg\majorheadingzzz}
+\def\majorheadingzzz #1{%
+{\advance\chapheadingskip by 10pt \chapbreak }%
+{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                  \parindent=0pt\raggedright
+                  \rm #1\hfill}}\bigskip \par\penalty 200}
+
+\def\chapheading{\parsearg\chapheadingzzz}
+\def\chapheadingzzz #1{\chapbreak %
+{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                  \parindent=0pt\raggedright
+                  \rm #1\hfill}}\bigskip \par\penalty 200}
+
+\def\heading{\parsearg\secheadingi}
+
+\def\subheading{\parsearg\subsecheadingi}
+
+\def\subsubheading{\parsearg\subsubsecheadingi}
+
+% These macros generate a chapter, section, etc. heading only
+% (including whitespace, linebreaking, etc. around it),
+% given all the information in convenient, parsed form.
+
+%%% Args are the skip and penalty (usually negative)
+\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi}
+
+\def\setchapterstyle #1 {\csname CHAPF#1\endcsname}
+
+%%% Define plain chapter starts, and page on/off switching for it
+% Parameter controlling skip before chapter headings (if needed)
+
+\newskip \chapheadingskip \chapheadingskip = 30pt plus 8pt minus 4pt
+
+\def\chapbreak{\dobreak \chapheadingskip {-4000}}
+\def\chappager{\par\vfill\supereject}
+\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi}
+
+\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname}
+
+\def\CHAPPAGoff{
+\global\let\pchapsepmacro=\chapbreak
+\global\let\pagealignmacro=\chappager}
+
+\def\CHAPPAGon{
+\global\let\pchapsepmacro=\chappager
+\global\let\pagealignmacro=\chappager
+\global\def\HEADINGSon{\HEADINGSsingle}}
+
+\def\CHAPPAGodd{
+\global\let\pchapsepmacro=\chapoddpage
+\global\let\pagealignmacro=\chapoddpage
+\global\def\HEADINGSon{\HEADINGSdouble}}
+
+\CHAPPAGon
+
+\def\CHAPFplain{
+\global\let\chapmacro=\chfplain
+\global\let\unnumbchapmacro=\unnchfplain}
+
+\def\chfplain #1#2{%
+  \pchapsepmacro
+  {%
+    \chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                     \parindent=0pt\raggedright
+                     \rm #2\enspace #1}%
+  }%
+  \bigskip
+  \penalty5000
+}
+
+\def\unnchfplain #1{%
+\pchapsepmacro %
+{\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                  \parindent=0pt\raggedright
+                  \rm #1\hfill}}\bigskip \par\penalty 10000 %
+}
+\CHAPFplain % The default
+
+\def\unnchfopen #1{%
+\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                       \parindent=0pt\raggedright
+                       \rm #1\hfill}}\bigskip \par\penalty 10000 %
+}
+
+\def\chfopen #1#2{\chapoddpage {\chapfonts
+\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}%
+\par\penalty 5000 %
+}
+
+\def\CHAPFopen{
+\global\let\chapmacro=\chfopen
+\global\let\unnumbchapmacro=\unnchfopen}
+
+% Parameter controlling skip before section headings.
+
+\newskip \subsecheadingskip  \subsecheadingskip = 17pt plus 8pt minus 4pt
+\def\subsecheadingbreak{\dobreak \subsecheadingskip {-500}}
+
+\newskip \secheadingskip  \secheadingskip = 21pt plus 8pt minus 4pt
+\def\secheadingbreak{\dobreak \secheadingskip {-1000}}
+
+% @paragraphindent  is defined for the Info formatting commands only.
+\let\paragraphindent=\comment
+
+% Section fonts are the base font at magstep2, which produces
+% a size a bit more than 14 points in the default situation.   
+
+\def\secheading #1#2#3{\secheadingi {#2.#3\enspace #1}}
+\def\plainsecheading #1{\secheadingi {#1}}
+\def\secheadingi #1{{\advance \secheadingskip by \parskip %
+\secheadingbreak}%
+{\secfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                 \parindent=0pt\raggedright
+                 \rm #1\hfill}}%
+\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 }
+
+
+% Subsection fonts are the base font at magstep1, 
+% which produces a size of 12 points.
+
+\def\subsecheading #1#2#3#4{\subsecheadingi {#2.#3.#4\enspace #1}}
+\def\subsecheadingi #1{{\advance \subsecheadingskip by \parskip %
+\subsecheadingbreak}%
+{\subsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                     \parindent=0pt\raggedright
+                     \rm #1\hfill}}%
+\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000 }
+
+\def\subsubsecfonts{\subsecfonts} % Maybe this should change:
+                                 % Perhaps make sssec fonts scaled
+                                 % magstep half
+\def\subsubsecheading #1#2#3#4#5{\subsubsecheadingi {#2.#3.#4.#5\enspace #1}}
+\def\subsubsecheadingi #1{{\advance \subsecheadingskip by \parskip %
+\subsecheadingbreak}%
+{\subsubsecfonts \vbox{\hyphenpenalty=10000\tolerance=5000
+                       \parindent=0pt\raggedright
+                       \rm #1\hfill}}%
+\ifdim \parskip<10pt \kern 10pt\kern -\parskip\fi \penalty 10000}
+
+
+\message{toc printing,}
+
+% Finish up the main text and prepare to read what we've written
+% to \contentsfile.
+
+\newskip\contentsrightmargin \contentsrightmargin=1in
+\def\startcontents#1{%
+   \pagealignmacro
+   \immediate\closeout \contentsfile
+   \ifnum \pageno>0
+      \pageno = -1             % Request roman numbered pages.
+   \fi
+   % Don't need to put `Contents' or `Short Contents' in the headline. 
+   % It is abundantly clear what they are.
+   \unnumbchapmacro{#1}\def\thischapter{}%
+   \begingroup                 % Set up to handle contents files properly.
+      \catcode`\\=0  \catcode`\{=1  \catcode`\}=2  address@hidden
+      \raggedbottom             % Worry more about breakpoints than the bottom.
+      \advance\hsize by -\contentsrightmargin % Don't use the full line length.
+}
+
+  
+% Normal (long) toc.
+\outer\def\contents{%
+   \startcontents{Table of Contents}%
+      \input \jobname.toc
+   \endgroup
+   \vfill \eject
+}
+
+% And just the chapters.
+\outer\def\summarycontents{%
+   \startcontents{Short Contents}%
+      %
+      \let\chapentry = \shortchapentry
+      \let\unnumbchapentry = \shortunnumberedentry
+      % We want a true roman here for the page numbers.
+      \secfonts
+      \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl
+      \rm
+      \advance\baselineskip by 1pt % Open it up a little.
+      \def\secentry ##1##2##3##4{}
+      \def\unnumbsecentry ##1##2{}
+      \def\subsecentry ##1##2##3##4##5{}
+      \def\unnumbsubsecentry ##1##2{}
+      \def\subsubsecentry ##1##2##3##4##5##6{}
+      \def\unnumbsubsubsecentry ##1##2{}
+      \input \jobname.toc
+   \endgroup
+   \vfill \eject
+}
+\let\shortcontents = \summarycontents
+
+% These macros generate individual entries in the table of contents.
+% The first argument is the chapter or section name.
+% The last argument is the page number.
+% The arguments in between are the chapter number, section number, ...
+
+% Chapter-level things, for both the long and short contents.
+\def\chapentry#1#2#3{\dochapentry{#2\labelspace#1}{#3}}
+
+% See comments in \dochapentry re vbox and related settings
+\def\shortchapentry#1#2#3{%
+   \vbox{\hyphenpenalty=10000\tolerance=5000
+    \parindent=0pt\strut\raggedright
+    {#2\labelspace #1}\dotfill\doshortpageno{#3}}%
+}
+
+\def\unnumbchapentry#1#2{\dochapentry{#1}{#2}}
+\def\shortunnumberedentry#1#2{%
+   \vbox{\hyphenpenalty=10000\tolerance=5000
+    \parindent=0pt\strut\raggedright
+    #1\dotfill\doshortpageno{#2}}%
+}
+
+% Sections.
+\def\secentry#1#2#3#4{\dosecentry{#2.#3\labelspace#1}{#4}}
+\def\unnumbsecentry#1#2{\dosecentry{#1}{#2}}
+
+% Subsections.
+\def\subsecentry#1#2#3#4#5{\dosubsecentry{#2.#3.#4\labelspace#1}{#5}}
+\def\unnumbsubsecentry#1#2{\dosubsecentry{#1}{#2}}
+
+% And subsubsections.
+\def\subsubsecentry#1#2#3#4#5#6{%
+  \dosubsubsecentry{#2.#3.#4.#5\labelspace#1}{#6}}
+\def\unnumbsubsubsecentry#1#2{\dosubsubsecentry{#1}{#2}}
+
+
+% This parameter controls the indentation of the various levels.
+\newdimen\tocindent \tocindent = 3pc
+
+% Now for the actual typesetting. In all these, #1 is the text and #2 is the 
+% page number.
+%
+% If the toc has to be broken over pages, we would want to be at chapters 
+% if at all possible; hence the \penalty.
+\def\dochapentry#1#2{%
+   \penalty-300 \vskip\baselineskip
+   % This \vbox (and similar ones in dosecentry etc.) used to be a
+   % \line; changed to permit linebreaks for long headings.  See
+   % comments above \majorheading.  Here we also use \strut to
+   % keep the top end of the vbox from jamming up against the previous
+   % entry in the table of contents.
+   \vbox{\chapentryfonts
+     \hyphenpenalty=10000\tolerance=5000 % this line and next introduced
+     \parindent=0pt\strut\raggedright    % with \line -> \vbox change
+     #1\dotfill
+     \dopageno{#2}}%
+   \nobreak\vskip .25\baselineskip
+}
+
+\def\dosecentry#1#2{%
+   \vbox{\secentryfonts \leftskip=\tocindent
+    \hyphenpenalty=10000\tolerance=5000
+    \parindent=0pt\strut\raggedright #1\dotfill
+    \dopageno{#2}}%
+}
+
+\def\dosubsecentry#1#2{%
+   \vbox{\subsecentryfonts \leftskip=2\tocindent
+    \hyphenpenalty=10000\tolerance=5000
+    \parindent=0pt\strut\raggedright #1\dotfill
+    \dopageno{#2}}%
+}
+
+\def\dosubsubsecentry#1#2{%
+   \vbox{\subsubsecentryfonts \leftskip=3\tocindent
+    \hyphenpenalty=10000\tolerance=5000
+    \parindent=0pt\strut\raggedright #1\dotfill
+    \dopageno{#2}}%
+}
+
+% Space between chapter (or whatever) number and the title.
+\def\labelspace{\hskip1em \relax}
+
+\def\dopageno#1{{\rm #1}}
+\def\doshortpageno#1{{\rm #1}}
+
+\def\chapentryfonts{\secfonts \rm}
+\def\secentryfonts{\textfonts}
+\let\subsecentryfonts = \textfonts
+\let\subsubsecentryfonts = \textfonts
+
+
+\message{environments,}
+
+% Since these characters are used in examples, it should be an even number of 
+% \tt widths. Each \tt character is 1en, so two makes it 1em.
+% Furthermore, these definitions must come after we define our fonts.
+\newbox\dblarrowbox    \newbox\longdblarrowbox
+\newbox\pushcharbox    \newbox\bullbox
+\newbox\equivbox       \newbox\errorbox
+
+\let\ptexequiv = \equiv
+
+%{\tentt
+%\global\setbox\dblarrowbox = \hbox to 1em{\hfil$\Rightarrow$\hfil}
+%\global\setbox\longdblarrowbox = \hbox to 1em{\hfil$\mapsto$\hfil}
+%\global\setbox\pushcharbox = \hbox to 1em{\hfil$\dashv$\hfil}
+%\global\setbox\equivbox = \hbox to 1em{\hfil$\ptexequiv$\hfil}
+% Adapted from the manmac format (p.420 of TeXbook)
+%\global\setbox\bullbox = \hbox to 1em{\kern.15em\vrule height .75ex width 
.85ex
+%                                      depth .1ex\hfil}
+%}
+
+\def\point{$\star$}
+
+\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}}
+\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}}
+\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}}
+
+\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}}
+
+% Adapted from the TeXbook's \boxit.
+{\tentt \global\dimen0 = 3em}% Width of the box.
+\dimen2 = .55pt % Thickness of rules
+% The text. (`r' is open on the right, `e' somewhat less so on the left.)
+\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt}
+
+\global\setbox\errorbox=\hbox to \dimen0{\hfil
+   \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right.
+   \advance\hsize by -2\dimen2 % Rules.
+   \vbox{
+      \hrule height\dimen2
+      \hbox{\vrule width\dimen2 \kern3pt          % Space to left of text.
+         \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below.
+         \kern3pt\vrule width\dimen2}% Space to right.
+      \hrule height\dimen2}
+    \hfil}
+
+% The @error{} command.
+\def\error{\leavevmode\lower.7ex\copy\errorbox}
+
+% @tex ... @end tex    escapes into raw Tex temporarily.
+% One exception: @ is still an escape character, so that @end tex works.
+% But \@ or @@ will get a plain tex @ character.
+
+\def\tex{\begingroup
+\catcode `\\=0 \catcode `\{=1 \catcode `\}=2
+\catcode `\$=3 \catcode `\&=4 \catcode `\#=6
+\catcode `\^=7 \catcode `\_=8 \catcode `\~=13 \let~=\tie
+\catcode `\%=14
+\catcode 43=12
+\catcode`\"=12
+\catcode`\==12
+\catcode`\|=12
+\catcode`\<=12
+\catcode`\>=12
+\escapechar=`\\
+%
+\let\{=\ptexlbrace
+\let\}=\ptexrbrace
+\let\.=\ptexdot
+\let\*=\ptexstar
+\let\dots=\ptexdots
address@hidden@}%
+\let\bullet=\ptexbullet
+\let\b=\ptexb \let\c=\ptexc \let\i=\ptexi \let\t=\ptext \let\l=\ptexl
+\let\L=\ptexL
+%
+\let\Etex=\endgroup}
+
+% Define @lisp ... @endlisp.
+% @lisp does a \begingroup so it can rebind things,
+% including the definition of @endlisp (which normally is erroneous).
+
+% Amount to narrow the margins by for @lisp.
+\newskip\lispnarrowing \lispnarrowing=0.4in
+
+% This is the definition that ^M gets inside @lisp
+% phr: changed space to \null, to avoid overfull hbox problems.
+{\obeyspaces%
+\gdef\lisppar{\null\endgraf}}
+
+% Cause \obeyspaces to make each Space cause a word-separation
+% rather than the default which is that it acts punctuation.
+% This is because space in tt font looks funny.
+{\obeyspaces %
+\gdef\sepspaces{\def {\ }}}
+
+\newskip\aboveenvskipamount \aboveenvskipamount= 0pt
+\def\aboveenvbreak{{\advance\aboveenvskipamount by \parskip
+\endgraf \ifdim\lastskip<\aboveenvskipamount
+\removelastskip \penalty-50 \vskip\aboveenvskipamount \fi}}
+
+\def\afterenvbreak{\endgraf \ifdim\lastskip<\aboveenvskipamount
+\removelastskip \penalty-50 \vskip\aboveenvskipamount \fi}
+
+% \nonarrowing is a flag.  If "set", @lisp etc don't narrow margins.
+\let\nonarrowing=\relax
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \cartouche: draw rectangle w/rounded corners around argument
+\font\circle=lcircle10
+\newdimen\circthick
+\newdimen\cartouter\newdimen\cartinner
+\newskip\normbskip\newskip\normpskip\newskip\normlskip
+\circthick=\fontdimen8\circle
+%
+\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth
+\def\ctr{{\hskip 6pt\circle\char'010}}
+\def\cbl{{\circle\char'012\hskip -6pt}}
+\def\cbr{{\hskip 6pt\circle\char'011}}
+\def\carttop{\hbox to \cartouter{\hskip\lskip
+       \ctl\leaders\hrule height\circthick\hfil\ctr
+       \hskip\rskip}}
+\def\cartbot{\hbox to \cartouter{\hskip\lskip
+       \cbl\leaders\hrule height\circthick\hfil\cbr
+       \hskip\rskip}}
+%
+\newskip\lskip\newskip\rskip
+
+\long\def\cartouche{%
+\begingroup
+       \lskip=\leftskip \rskip=\rightskip
+       \leftskip=0pt\rightskip=0pt %we want these *outside*.
+       \cartinner=\hsize \advance\cartinner by-\lskip 
+                         \advance\cartinner by-\rskip
+       \cartouter=\hsize
+       \advance\cartouter by 18pt % allow for 3pt kerns on either
+%                                   side, and for 6pt waste from
+%                                   each corner char
+       \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip
+       % Flag to tell @lisp, etc., not to narrow margin.
+       \let\nonarrowing=\comment
+       \vbox\bgroup
+               \baselineskip=0pt\parskip=0pt\lineskip=0pt
+               \carttop
+               \hbox\bgroup
+                       \hskip\lskip
+                       \vrule\kern3pt
+                       \vbox\bgroup
+                               \hsize=\cartinner
+                               \kern3pt
+                               \begingroup
+                                       \baselineskip=\normbskip
+                                       \lineskip=\normlskip
+                                       \parskip=\normpskip
+                                       \vskip -\parskip
+\def\Ecartouche{%
+                               \endgroup
+                               \kern3pt
+                       \egroup
+                       \kern3pt\vrule
+                       \hskip\rskip
+               \egroup
+               \cartbot
+       \egroup
+\endgroup
+}}     
+
+\def\lisp{\aboveenvbreak
+\begingroup\inENV % This group ends at the end of the @lisp body
+\hfuzz=12truept % Don't be fussy
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+% Single space lines
+\singlespace %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+\let\par=\lisppar
+\def\Elisp{\endgroup\afterenvbreak}%
+\parskip=0pt
+% @cartouche defines \nonarrowing to inhibit narrowing
+% at next level down.
+\ifx\nonarrowing\relax
+\advance \leftskip by \lispnarrowing
+\exdentamount=\lispnarrowing
+\let\exdent=\nofillexdent
+\let\nonarrowing=\relax
+\fi
+\parindent=0pt
+\obeyspaces \obeylines \tt \rawbackslash
+\def\next##1{}\next}
+
+
+\let\example=\lisp
+\def\Eexample{\Elisp}
+
+\let\smallexample=\lisp
+\def\Esmallexample{\Elisp}
+
+% Macro for 9 pt. examples, necessary to print with 5" lines.
+% From address@hidden  This is not really used unless the
+% @smallbook command is given.
+
+\def\smalllispx{\aboveenvbreak\begingroup\inENV
+%                      This group ends at the end of the @lisp body
+\hfuzz=12truept % Don't be fussy
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+% Single space lines
+\singlespace %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+\let\par=\lisppar
+\def\Esmalllisp{\endgroup\afterenvbreak}%
+%%%% Smaller baseline skip for small examples.
+\baselineskip 10pt
+\parskip=0pt
+% @cartouche defines \nonarrowing to inhibit narrowing
+% at next level down.
+\ifx\nonarrowing\relax
+\advance \leftskip by \lispnarrowing
+\exdentamount=\lispnarrowing
+\let\exdent=\nofillexdent
+\let\nonarrowing=\relax
+\fi
+\parindent=0pt
+\obeyspaces \obeylines \ninett \indexfonts \rawbackslash
+\def\next##1{}\next}
+
+% This is @display; same as @lisp except use roman font.
+
+\def\display{\begingroup\inENV %This group ends at the end of the @display body
+\aboveenvbreak
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+% Single space lines
+\singlespace %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+\let\par=\lisppar
+\def\Edisplay{\endgroup\afterenvbreak}%
+\parskip=0pt
+% @cartouche defines \nonarrowing to inhibit narrowing
+% at next level down.
+\ifx\nonarrowing\relax
+\advance \leftskip by \lispnarrowing
+\exdentamount=\lispnarrowing
+\let\exdent=\nofillexdent
+\let\nonarrowing=\relax
+\fi
+\parindent=0pt
+\obeyspaces \obeylines
+\def\next##1{}\next}
+
+% This is @format; same as @lisp except use roman font and don't narrow margins
+
+\def\format{\begingroup\inENV %This group ends at the end of the @format body
+\aboveenvbreak
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+\singlespace %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+\let\par=\lisppar
+\def\Eformat{\endgroup\afterenvbreak}
+\parskip=0pt \parindent=0pt
+\obeyspaces \obeylines
+\def\next##1{}\next}
+
+% @flushleft and @flushright
+
+\def\flushleft{%
+\begingroup\inENV %This group ends at the end of the @format body
+\aboveenvbreak
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+% This also causes @ to work when the directive name
+% is terminated by end of line.
+\let\par=\lisppar
+\def\Eflushleft{\endgroup\afterenvbreak}%
+\parskip=0pt \parindent=0pt
+\obeyspaces \obeylines
+\def\next##1{}\next}
+
+\def\flushright{%
+\begingroup\inENV %This group ends at the end of the @format body
+\aboveenvbreak
+% Make spaces be word-separators rather than space tokens.
+\sepspaces %
+% The following causes blank lines not to be ignored
+% by adding a space to the end of each line.
+% This also causes @ to work when the directive name
+% is terminated by end of line.
+\let\par=\lisppar
+\def\Eflushright{\endgroup\afterenvbreak}%
+\parskip=0pt \parindent=0pt
+\advance \leftskip by 0pt plus 1fill
+\obeyspaces \obeylines
+\def\next##1{}\next}
+
+% @quotation - narrow the margins.
+
+\def\quotation{%
+\begingroup\inENV %This group ends at the end of the @quotation body
+{\parskip=0pt  % because we will skip by \parskip too, later
+\aboveenvbreak}%
+\singlespace
+\parindent=0pt
+\def\Equotation{\par\endgroup\afterenvbreak}%
+% @cartouche defines \nonarrowing to inhibit narrowing
+% at next level down.
+\ifx\nonarrowing\relax
+\advance \leftskip by \lispnarrowing
+\advance \rightskip by \lispnarrowing
+\exdentamount=\lispnarrowing
+\let\nonarrowing=\relax
+\fi}
+
+\message{defuns,}
+% Define formatter for defuns
+% First, allow user to change definition object font (\df) internally
+\def\setdeffont #1 {\csname DEF#1\endcsname}
+
+\newskip\defbodyindent \defbodyindent=.4in
+\newskip\defargsindent \defargsindent=50pt
+\newskip\deftypemargin \deftypemargin=12pt
+\newskip\deflastargmargin \deflastargmargin=18pt
+
+\newcount\parencount
+% define \functionparens, which makes ( and ) and & do special things.
+% \functionparens affects the group it is contained in.
+\def\activeparens{%
+\catcode`\(=\active \catcode`\)=\active \catcode`\&=\active
+\catcode`\[=\active \catcode`\]=\active}
+{\activeparens % Now, smart parens don't turn on until &foo (see \amprm)
+\gdef\functionparens{\boldbrax\let&=\amprm\parencount=0 }
+\gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb}
+
+% Definitions of (, ) and & used in args for functions.
+% This is the definition of ( outside of all parentheses.
+\gdef\oprm#1 {{\rm\char`\(}#1 \bf \let(=\opnested %
+\global\advance\parencount by 1 }
+%
+% This is the definition of ( when already inside a level of parens.
+\gdef\opnested{\char`\(\global\advance\parencount by 1 }
+%
+\gdef\clrm{% Print a paren in roman if it is taking us back to depth of 0.
+% also in that case restore the outer-level definition of (.
+\ifnum \parencount=1 {\rm \char `\)}\sl \let(=\oprm \else \char `\) \fi
+\global\advance \parencount by -1 }
+% If we encounter &foo, then turn on ()-hacking afterwards
+\gdef\amprm#1 {{\rm\&#1}\let(=\oprm \let)=\clrm\ }
+%
+\gdef\normalparens{\boldbrax\let&=\ampnr}
+} % End of definition inside \activeparens
+%% These parens (in \boldbrax) actually are a little bolder than the
+%% contained text.  This is especially needed for [ and ]
+\def\opnr{{\sf\char`\(}} \def\clnr{{\sf\char`\)}} \def\ampnr{\&}
+\def\lbrb{{\bf\char`\[}} \def\rbrb{{\bf\char`\]}}
+
+% First, defname, which formats the header line itself.
+% #1 should be the function name.
+% #2 should be the type of definition, such as "Function".
+
+\def\defname #1#2{%
+% Get the values of \leftskip and \rightskip as they were
+% outside the @def...
+\dimen2=\leftskip
+\advance\dimen2 by -\defbodyindent
+\dimen3=\rightskip
+\advance\dimen3 by -\defbodyindent
+\noindent        %
+\setbox0=\hbox{\hskip \deflastargmargin{\rm #2}\hskip \deftypemargin}%
+\dimen0=\hsize \advance \dimen0 by -\wd0 % compute size for first line
+\dimen1=\hsize \advance \dimen1 by -\defargsindent %size for continuations
+\parshape 2 0in \dimen0 \defargsindent \dimen1     %
+% Now output arg 2 ("Function" or some such)
+% ending at \deftypemargin from the right margin,
+% but stuck inside a box of width 0 so it does not interfere with linebreaking
+{% Adjust \hsize to exclude the ambient margins,
+% so that \rightline will obey them.
+\advance \hsize by -\dimen2 \advance \hsize by -\dimen3
+\rlap{\rightline{{\rm #2}\hskip \deftypemargin}}}%
+% Make all lines underfull and no complaints:
+\tolerance=10000 \hbadness=10000    
+\advance\leftskip by -\defbodyindent
+\exdentamount=\defbodyindent
+{\df #1}\enskip        % Generate function name
+}
+
+% Actually process the body of a definition
+% #1 should be the terminating control sequence, such as \Edefun.
+% #2 should be the "another name" control sequence, such as \defunx.
+% #3 should be the control sequence that actually processes the header,
+%    such as \defunheader.
+
+\def\defparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2{\begingroup\obeylines\activeparens\spacesplit#3}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup %
+\catcode 61=\active %
+\obeylines\activeparens\spacesplit#3}
+
+\def\defmethparsebody #1#2#3#4 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 {\begingroup\obeylines\activeparens\spacesplit{#3{##1}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup\obeylines\activeparens\spacesplit{#3{#4}}}
+
+\def\defopparsebody #1#2#3#4#5 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 ##2 {\def#4{##1}%
+\begingroup\obeylines\activeparens\spacesplit{#3{##2}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup\obeylines\activeparens\spacesplit{#3{#5}}}
+
+% These parsing functions are similar to the preceding ones
+% except that they do not make parens into active characters.
+% These are used for "variables" since they have no arguments.
+
+\def\defvarparsebody #1#2#3{\begingroup\inENV% Environment for definitionbody
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2{\begingroup\obeylines\spacesplit#3}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup %
+\catcode 61=\active %
+\obeylines\spacesplit#3}
+
+\def\defvrparsebody #1#2#3#4 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 {\begingroup\obeylines\spacesplit{#3{##1}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup\obeylines\spacesplit{#3{#4}}}
+
+\def\defopvarparsebody #1#2#3#4#5 {\begingroup\inENV %
+\medbreak %
+% Define the end token that this defining construct specifies
+% so that it will exit this group.
+\def#1{\endgraf\endgroup\medbreak}%
+\def#2##1 ##2 {\def#4{##1}%
+\begingroup\obeylines\spacesplit{#3{##2}}}%
+\parindent=0in
+\advance\leftskip by \defbodyindent \advance \rightskip by \defbodyindent
+\exdentamount=\defbodyindent
+\begingroup\obeylines\spacesplit{#3{#5}}}
+
+% Split up #2 at the first space token.
+% call #1 with two arguments:
+%  the first is all of #2 before the space token,
+%  the second is all of #2 after that space token.
+% If #2 contains no space token, all of it is passed as the first arg
+% and the second is passed as empty.
+
+{\obeylines
+\gdef\spacesplit#1#2^^M{\endgroup\spacesplitfoo{#1}#2 \relax\spacesplitfoo}%
+\long\gdef\spacesplitfoo#1#2 #3#4\spacesplitfoo{%
+\ifx\relax #3%
+#1{#2}{}\else #1{#2}{#3#4}\fi}}
+
+% So much for the things common to all kinds of definitions.
+
+% Define @defun.
+
+% First, define the processing that is wanted for arguments of \defun
+% Use this to expand the args and terminate the paragraph they make up
+
+\def\defunargs #1{\functionparens \sl
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+\hyphenchar\tensl=0
+#1%
+\hyphenchar\tensl=45
+\ifnum\parencount=0 \else \errmessage{unbalanced parens in @def arguments}\fi%
+\interlinepenalty=10000
+\advance\rightskip by 0pt plus 1fil
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
+}
+
+\def\deftypefunargs #1{%
+% Expand, preventing hyphenation at `-' chars.
+% Note that groups don't affect changes in \hyphenchar.
+\functionparens
+\code{#1}%
+\interlinepenalty=10000
+\advance\rightskip by 0pt plus 1fil
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000%
+}
+
+% Do complete processing of one @defun or @defunx line already parsed.
+
+% @deffn Command forward-char nchars
+
+\def\deffn{\defmethparsebody\Edeffn\deffnx\deffnheader}
+
+\def\deffnheader #1#2#3{\doind {fn}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defunargs{#3}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @defun == @deffn Function
+
+\def\defun{\defparsebody\Edefun\defunx\defunheader}
+
+\def\defunheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{Function}%
+\defunargs {#2}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefun int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefun{\defparsebody\Edeftypefun\deftypefunx\deftypefunheader}
+
+% #1 is the data type.  #2 is the name and args.
+\def\deftypefunheader #1#2{\deftypefunheaderx{#1}#2 \relax}
+% #1 is the data type, #2 the name, #3 the args.
+\def\deftypefunheaderx #1#2 #3\relax{%
+\doind {fn}{\code{#2}}% Make entry in function index
+\begingroup\defname {\code{#1} #2}{Function}%
+\deftypefunargs {#3}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar})
+
+\def\deftypefn{\defmethparsebody\Edeftypefn\deftypefnx\deftypefnheader}
+
+% #1 is the classification.  #2 is the data type.  #3 is the name and args.
+\def\deftypefnheader #1#2#3{\deftypefnheaderx{#1}{#2}#3 \relax}
+% #1 is the classification, #2 the data type, #3 the name, #4 the args.
+\def\deftypefnheaderx #1#2#3 #4\relax{%
+\doind {fn}{\code{#3}}% Make entry in function index
+\begingroup\defname {\code{#2} #3}{#1}%
+\deftypefunargs {#4}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @defmac == @deffn Macro
+
+\def\defmac{\defparsebody\Edefmac\defmacx\defmacheader}
+
+\def\defmacheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{Macro}%
+\defunargs {#2}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% @defspec == @deffn Special Form
+
+\def\defspec{\defparsebody\Edefspec\defspecx\defspecheader}
+
+\def\defspecheader #1#2{\doind {fn}{\code{#1}}% Make entry in function index
+\begingroup\defname {#1}{Special Form}%
+\defunargs {#2}\endgroup %
+\catcode 61=\other % Turn off change made in \defparsebody
+}
+
+% This definition is run if you use @defunx
+% anywhere other than immediately after a @defun or @defunx.
+
+\def\deffnx #1 address@hidden in invalid context}}
+\def\defunx #1 address@hidden in invalid context}}
+\def\defmacx #1 address@hidden in invalid context}}
+\def\defspecx #1 address@hidden in invalid context}}
+\def\deftypefnx #1 address@hidden in invalid context}}
+\def\deftypeunx #1 address@hidden in invalid context}}
+
+% @defmethod, and so on
+
+% @defop {Funny Method} foo-class frobnicate argument
+
+\def\defop #1 {\def\defoptype{#1}%
+\defopparsebody\Edefop\defopx\defopheader\defoptype}
+
+\def\defopheader #1#2#3{%
+\dosubind {fn}{\code{#2}}{on #1}% Make entry in function index
+\begingroup\defname {#2}{\defoptype{} on #1}%
+\defunargs {#3}\endgroup %
+}
+
+% @defmethod == @defop Method
+
+\def\defmethod{\defmethparsebody\Edefmethod\defmethodx\defmethodheader}
+
+\def\defmethodheader #1#2#3{%
+\dosubind {fn}{\code{#2}}{on #1}% entry in function index
+\begingroup\defname {#2}{Method on #1}%
+\defunargs {#3}\endgroup %
+}
+
+% @defcv {Class Option} foo-class foo-flag
+
+\def\defcv #1 {\def\defcvtype{#1}%
+\defopvarparsebody\Edefcv\defcvx\defcvarheader\defcvtype}
+
+\def\defcvarheader #1#2#3{%
+\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index
+\begingroup\defname {#2}{\defcvtype{} of #1}%
+\defvarargs {#3}\endgroup %
+}
+
+% @defivar == @defcv {Instance Variable}
+
+\def\defivar{\defvrparsebody\Edefivar\defivarx\defivarheader}
+
+\def\defivarheader #1#2#3{%
+\dosubind {vr}{\code{#2}}{of #1}% Make entry in var index
+\begingroup\defname {#2}{Instance Variable of #1}%
+\defvarargs {#3}\endgroup %
+}
+
+% These definitions are run if you use @defmethodx, etc.,
+% anywhere other than immediately after a @defmethod, etc.
+
+\def\defopx #1 address@hidden in invalid context}}
+\def\defmethodx #1 address@hidden in invalid context}}
+\def\defcvx #1 address@hidden in invalid context}}
+\def\defivarx #1 address@hidden in invalid context}}
+
+% Now @defvar
+
+% First, define the processing that is wanted for arguments of @defvar.
+% This is actually simple: just print them in roman.
+% This must expand the args and terminate the paragraph they make up
+\def\defvarargs #1{\normalparens #1%
+\interlinepenalty=10000
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000}
+
+% @defvr Counter foo-count
+
+\def\defvr{\defvrparsebody\Edefvr\defvrx\defvrheader}
+
+\def\defvrheader #1#2#3{\doind {vr}{\code{#2}}%
+\begingroup\defname {#2}{#1}\defvarargs{#3}\endgroup}
+
+% @defvar == @defvr Variable
+
+\def\defvar{\defvarparsebody\Edefvar\defvarx\defvarheader}
+
+\def\defvarheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{Variable}%
+\defvarargs {#2}\endgroup %
+}
+
+% @defopt == @defvr {User Option}
+
+\def\defopt{\defvarparsebody\Edefopt\defoptx\defoptheader}
+
+\def\defoptheader #1#2{\doind {vr}{\code{#1}}% Make entry in var index
+\begingroup\defname {#1}{User Option}%
+\defvarargs {#2}\endgroup %
+}
+
+% @deftypevar int foobar
+
+\def\deftypevar{\defvarparsebody\Edeftypevar\deftypevarx\deftypevarheader}
+
+% #1 is the data type.  #2 is the name.
+\def\deftypevarheader #1#2{%
+\doind {vr}{\code{#2}}% Make entry in variables index
+\begingroup\defname {\code{#1} #2}{Variable}%
+\interlinepenalty=10000
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000
+\endgroup}
+
+% @deftypevr {Global Flag} int enable
+
+\def\deftypevr{\defvrparsebody\Edeftypevr\deftypevrx\deftypevrheader}
+
+\def\deftypevrheader #1#2#3{\doind {vr}{\code{#3}}%
+\begingroup\defname {\code{#2} #3}{#1}
+\interlinepenalty=10000
+\endgraf\penalty 10000\vskip -\parskip\penalty 10000
+\endgroup}
+
+% This definition is run if you use @defvarx
+% anywhere other than immediately after a @defvar or @defvarx.
+
+\def\defvrx #1 address@hidden in invalid context}}
+\def\defvarx #1 address@hidden in invalid context}}
+\def\defoptx #1 address@hidden in invalid context}}
+\def\deftypevarx #1 address@hidden in invalid context}}
+\def\deftypevrx #1 address@hidden in invalid context}}
+
+% Now define @deftp
+% Args are printed in bold, a slight difference from @defvar.
+
+\def\deftpargs #1{\bf \defvarargs{#1}}
+
+% @deftp Class window height width ...
+
+\def\deftp{\defvrparsebody\Edeftp\deftpx\deftpheader}
+
+\def\deftpheader #1#2#3{\doind {tp}{\code{#2}}%
+\begingroup\defname {#2}{#1}\deftpargs{#3}\endgroup}
+
+% This definition is run if you use @deftpx, etc
+% anywhere other than immediately after a @deftp, etc.
+
+\def\deftpx #1 address@hidden in invalid context}}
+
+\message{cross reference,}
+% Define cross-reference macros
+\newwrite \auxfile
+
+\newif\ifhavexrefs  % True if xref values are known.
+\newif\ifwarnedxrefs  % True if we warned once that they aren't known.
+
+% \setref{foo} defines a cross-reference point named foo.
+
+\def\setref#1{%
+%\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-pg}{Ypagenumber}%
+\dosetq{#1-snt}{Ysectionnumberandtype}}
+
+\def\unnumbsetref#1{%
+%\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-pg}{Ypagenumber}%
+\dosetq{#1-snt}{Ynothing}}
+
+\def\appendixsetref#1{%
+%\dosetq{#1-title}{Ytitle}%
+\dosetq{#1-pg}{Ypagenumber}%
+\dosetq{#1-snt}{Yappendixletterandtype}}
+
+% \xref, \pxref, and \ref generate cross-references to specified points.
+% For \xrefX, #1 is the node name, #2 the name of the Info
+% cross-reference, #3 the printed node name, #4 the name of the Info
+% file, #5 the name of the printed manual.  All but the node name can be
+% omitted.
+% 
+\def\pxref#1{see \xrefX[#1,,,,,,,]}
+\def\xref#1{See \xrefX[#1,,,,,,,]}
+\def\ref#1{\xrefX[#1,,,,,,,]}
+\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup%
+\def\printedmanual{\ignorespaces #5}%
+\def\printednodename{\ignorespaces #3}%
+%
+\setbox1=\hbox{\printedmanual}%
+\setbox0=\hbox{\printednodename}%
+\ifdim \wd0=0pt%
+\def\printednodename{\ignorespaces #1}%
+%%% Uncommment the following line to make the actual chapter or section title
+%%% appear inside the square brackets.
+%\def\printednodename{#1-title}%
+\fi%
+%
+%
+% If we use \unhbox0 and \unhbox1 to print the node names, TeX does
+% not insert empty discretionaries after hyphens, which means that it
+% will not find a line break at a hyphen in a node names.  Since some
+% manuals are best written with fairly long node names, containing
+% hyphens, this is a loss.  Therefore, we simply give the text of
+% the node name again, so it is as if TeX is seeing it for the first
+% time.
+\ifdim \wd1>0pt
+section ``\printednodename'' in \cite{\printedmanual}%
+\else%
+\turnoffactive%
+\refx{#1-snt}{} [\printednodename], page\tie\refx{#1-pg}{}%
+\fi
+\endgroup}
+
+% \dosetq is the interface for calls from other macros
+
+% Use \turnoffactive so that punctuation chars such as underscore
+% work in node names.
+\def\dosetq #1#2{{\let\folio=0 \turnoffactive%
+\edef\next{\write\auxfile{\internalsetq {#1}{#2}}}%
+\next}}
+
+% \internalsetq {foo}{page} expands into
+% CHARACTERS 'xrdef {foo}{...expansion of \Ypage...}
+% When the aux file is read, ' is the escape character
+
+\def\internalsetq #1#2{'xrdef {#1}{\csname #2\endcsname}}
+
+% Things to be expanded by \internalsetq
+
+\def\Ypagenumber{\folio}
+
+\def\Ytitle{\thischapter}
+
+\def\Ynothing{}
+
+\def\Ysectionnumberandtype{%
+\ifnum\secno=0 Chapter\xreftie\the\chapno %
+\else \ifnum \subsecno=0 Section\xreftie\the\chapno.\the\secno %
+\else \ifnum \subsubsecno=0 %
+Section\xreftie\the\chapno.\the\secno.\the\subsecno %
+\else %
+Section\xreftie\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno %
+\fi \fi \fi }
+
+\def\Yappendixletterandtype{%
+\ifnum\secno=0 Appendix\xreftie'char\the\appendixno{}%
+\else \ifnum \subsecno=0 Section\xreftie'char\the\appendixno.\the\secno %
+\else \ifnum \subsubsecno=0 %
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno %
+\else %
+Section\xreftie'char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno %
+\fi \fi \fi }
+
+\gdef\xreftie{'tie}
+
+% Use TeX 3.0's \inputlineno to get the line number, for better error
+% messages, but if we're using an old version of TeX, don't do anything.
+% 
+\ifx\inputlineno\thisisundefined
+  \let\linenumber = \empty % Non-3.0.
+\else
+  \def\linenumber{\the\inputlineno:\space}
+\fi
+
+% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME.
+% If its value is nonempty, SUFFIX is output afterward.
+
+\def\refx#1#2{%
+  \expandafter\ifx\csname X#1\endcsname\relax
+    % If not defined, say something at least.
+    $\langle$un\-de\-fined$\rangle$%
+    \ifhavexrefs
+      \message{\linenumber Undefined cross reference `#1'.}%
+    \else
+      \ifwarnedxrefs\else
+        \global\warnedxrefstrue
+        \message{Cross reference values unknown; you must run TeX again.}%
+      \fi
+    \fi
+  \else
+    % It's defined, so just use it.
+    \csname X#1\endcsname
+  \fi
+  #2% Output the suffix in any case.
+}
+
+% Read the last existing aux file, if any.  No error if none exists.
+
+% This is the macro invoked by entries in the aux file.
+\def\xrdef #1#2{
+{\catcode`\'=\other\expandafter \gdef \csname X#1\endcsname {#2}}}
+
+\def\readauxfile{%
+\begingroup
+\catcode address@hidden
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\^^C=\other
+\catcode `\^^D=\other
+\catcode `\^^E=\other
+\catcode `\^^F=\other
+\catcode `\^^G=\other
+\catcode `\^^H=\other
+\catcode `\=\other
+\catcode `\^^L=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode `\=\other
+\catcode 26=\other
+\catcode `\^^[=\other
+\catcode `\^^\=\other
+\catcode `\^^]=\other
+\catcode `\^^^=\other
+\catcode `\^^_=\other
+\catcode address@hidden
+\catcode `\^=\other
+\catcode `\~=\other
+\catcode `\[=\other
+\catcode `\]=\other
+\catcode`\"=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode `\$=\other
+\catcode `\#=\other
+\catcode `\&=\other
+% the aux file uses ' as the escape.
+% Turn off \ as an escape so we do not lose on
+% entries which were dumped with control sequences in their names.
+% For example, 'xrdef {$\leq $-fun}{page ...} made by @defun ^^
+% Reference to such entries still does not work the way one would wish,
+% but at least they do not bomb out when the aux file is read in.
+\catcode `\{=1 \catcode `\}=2
+\catcode `\%=\other
+\catcode `\'=0
+\catcode `\\=\other
+\openin 1 \jobname.aux
+\ifeof 1 \else \closein 1 \input \jobname.aux \global\havexrefstrue
+\fi
+% Open the new aux file.  Tex will close it automatically at exit.
+\openout \auxfile=\jobname.aux
+\endgroup}
+
+
+% Footnotes.
+
+\newcount \footnoteno
+
+% The trailing space in the following definition for supereject is
+% vital for proper filling; pages come out unaligned when you do a
+% pagealignmacro call if that space before the closing brace is
+% removed.
+\def\supereject{\par\penalty -20000\footnoteno =0 }
+
+% @footnotestyle is meaningful for info output only..
+\let\footnotestyle=\comment
+
+\let\ptexfootnote=\footnote
+
+{\catcode address@hidden
+\long\gdef\footnote #1{\global\advance \footnoteno by address@hidden
+\unskip
+\edef\thisfootno{$^{\the\footnoteno}$}%
address@hidden
address@hidden/\fi
address@hidden \footnotezzz{#1}}
+% \parsearg\footnotezzz}
+
+\long\gdef\footnotezzz #1{\insert\footins{
+\interlinepenalty\interfootnotelinepenalty
+\splittopskip\ht\strutbox % top baseline for broken footnotes
+\splitmaxdepth\dp\strutbox address@hidden
address@hidden address@hidden address@hidden address@hidden
+\footstrut\parindent=\defaultparindent\hang\textindent{\thisfootno}#1\strut}}
+
+}%end \catcode address@hidden
+
+% End of control word definitions.
+
+\message{and turning on texinfo input format.}
+
+\def\openindices{%
+   \newindex{cp}%
+   \newcodeindex{fn}%
+   \newcodeindex{vr}%
+   \newcodeindex{tp}%
+   \newcodeindex{ky}%
+   \newcodeindex{pg}%
+}
+
+% Set some numeric style parameters, for 8.5 x 11 format.
+
+%\hsize = 6.5in
+\newdimen\defaultparindent \defaultparindent = 15pt
+\parindent = \defaultparindent
+\parskip 18pt plus 1pt
+\baselineskip 15pt
+\advance\topskip by 1.2cm
+
+% Prevent underfull vbox error messages.
+\vbadness=10000
+
+% Following George Bush, just get rid of widows and orphans.
+\widowpenalty=10000
+\clubpenalty=10000
+
+% Use TeX 3.0's \emergencystretch to help line breaking, but if we're
+% using an old version of TeX, don't do anything.  We want the amount of
+% stretch added to depend on the line length, hence the dependence on
+% \hsize.  This makes it come to about 9pt for the 8.5x11 format.
+% 
+\ifx\emergencystretch\thisisundefined \else
+  \emergencystretch = \hsize
+  \divide\emergencystretch by 45
+\fi
+
+% Use @smallbook to reset parameters for 7x9.5 format  (or else 7x9.25)
+\def\smallbook{
+\global\lispnarrowing = 0.3in
+\global\baselineskip 12pt
+\advance\topskip by -1cm
+\global\parskip 3pt plus 1pt
+\global\hsize = 5in
+\global\doublecolumnhsize=2.4in \global\doublecolumnvsize=15.0in
+\global\vsize=7.5in
+\global\tolerance=700
+\global\hfuzz=1pt
+\global\contentsrightmargin=0pt
+
+\global\pagewidth=\hsize
+\global\pageheight=\vsize
+
+\global\let\smalllisp=\smalllispx
+\global\let\smallexample=\smalllispx
+\global\def\Esmallexample{\Esmalllisp}
+}
+
+% Use @afourpaper to print on European A4 paper.
+\def\afourpaper{
+\global\tolerance=700
+\global\hfuzz=1pt
+\global\baselineskip=12pt
+\global\parskip 15pt plus 1pt
+
+\global\vsize= 53\baselineskip
+\advance\vsize by \topskip
+%\global\hsize=   5.85in     % A4 wide 10pt
+\global\hsize=  6.5in
+\global\outerhsize=\hsize
+\global\advance\outerhsize by 0.5in
+\global\outervsize=\vsize
+\global\advance\outervsize by 0.6in
+\global\doublecolumnhsize=\hsize
+\global\divide\doublecolumnhsize by 2
+\global\advance\doublecolumnhsize by -0.1in
+\global\doublecolumnvsize=\vsize
+\global\multiply\doublecolumnvsize by 2
+\global\advance\doublecolumnvsize by 0.1in
+
+\global\pagewidth=\hsize
+\global\pageheight=\vsize
+}
+
+%% For a final copy, take out the rectangles
+%% that mark overfull boxes (in case you have decided
+%% that the text looks ok even though it passes the margin).
+\def\finalout{\overfullrule=0pt}
+
+% Define macros to output various characters with catcode for normal text.
+\catcode`\"=\other
+\catcode`\~=\other
+\catcode`\^=\other
+\catcode`\_=\other
+\catcode`\|=\other
+\catcode`\<=\other
+\catcode`\>=\other
+\catcode`\+=\other
+\def\normaldoublequote{"}
+\def\normaltilde{~}
+\def\normalcaret{^}
+\def\normalunderscore{_}
+\def\normalverticalbar{|}
+\def\normalless{<}
+\def\normalgreater{>}
+\def\normalplus{+}
+
+% This macro is used to make a character print one way in ttfont
+% where it can probably just be output, and another way in other fonts,
+% where something hairier probably needs to be done.
+%
+% #1 is what to print if we are indeed using \tt; #2 is what to print
+% otherwise.  Since all the Computer Modern typewriter fonts have zero
+% interword stretch (and shrink), and it is reasonable to expect all
+% typewriter fonts to have this, we can check that font parameter.
+% 
+\def\ifusingtt#1#2{\ifdim \fontdimen3\the\font=0pt #1\else #2\fi}
+
+% Turn off all special characters except @
+% (and those which the user can use as if they were ordinary).
+% Most of these we simply print from the \tt font, but for some, we can
+% use math or other variants that look better in normal text.
+
+\catcode`\"=\active
+\def\activedoublequote{{\tt \char '042}}
+\let"=\activedoublequote
+\catcode`\~=\active
+\def~{{\tt \char '176}}
+\chardef\hat=`\^
+\catcode`\^=\active
+\def^{{\tt \hat}}
+
+\catcode`\_=\active
+\def_{\ifusingtt\normalunderscore\_}
+% Subroutine for the previous macro.
+\def\_{\lvvmode \kern.06em \vbox{\hrule width.3em height.1ex}}
+
+% \lvvmode is equivalent in function to \leavevmode.
+% Using \leavevmode runs into trouble when written out to
+% an index file due to the expansion of \leavevmode into ``\unhbox
+% address@hidden'' ---which looks to TeX like ``\unhbox \voidb\x'' due to our
+% magic tricks with @.
+\def\lvvmode{\vbox to 0pt{}}
+
+\catcode`\|=\active
+\def|{{\tt \char '174}}
+\chardef \less=`\<
+\catcode`\<=\active
+\def<{{\tt \less}}
+\chardef \gtr=`\>
+\catcode`\>=\active
+\def>{{\tt \gtr}}
+\catcode`\+=\active
+\def+{{\tt \char 43}}
+%\catcode 27=\active
+%\def^^[{$\diamondsuit$}
+
+% Used sometimes to turn off (effectively) the active characters
+% even after parsing them.
+\def\turnoffactive{\let"=\normaldoublequote
+\let~=\normaltilde
+\let^=\normalcaret
+\let_=\normalunderscore
+\let|=\normalverticalbar
+\let<=\normalless
+\let>=\normalgreater
+\let+=\normalplus}
+
+% Set up an active definition for =, but don't enable it most of the time.
+{\catcode`\==\active
+\global\def={{\tt \char 61}}}
+
address@hidden
+
+% \rawbackslashxx output one backslash character in current font
+\global\chardef\rawbackslashxx=`\\
+%{\catcode`\\=\other
address@hidden@rawbackslashxx{\}}
+
+% \rawbackslash redefines \ as input to do \rawbackslashxx.
+{\catcode`\\=\active
address@hidden@address@hidden@rawbackslashxx }}
+
+% \normalbackslash outputs one backslash in fixed width font.
+\def\normalbackslash{{\tt\rawbackslashxx}}
+
+% Say @foo, not \foo, in error messages.
+\escapechar=`\@
+
+% \catcode 17=0   % Define control-q
+\catcode`\\=\active
+
+% If a .fmt file is being used, we don't want the `\input texinfo' to show up.
+% That is what \eatinput is for; after that, the `\' should revert to printing 
+% a backslash.
+%
address@hidden@eatinput input address@hidden
address@hidden@let\ = @eatinput
+
+% On the other hand, perhaps the file did not have a `\input texinfo'. Then
+% the first `\{ in the file would cause an error. This macro tries to fix 
+% that, assuming it is called before the first `\' could plausibly occur.
+% 
address@hidden@address@hidden@eatinput @let\ = @normalbackslash @fi}
+
+%% These look ok in all fonts, so just make them not special.  The @rm below
+%% makes sure that the current font starts out as the newly loaded cmr10
address@hidden@address@hidden @address@hidden@other @catcode`@&address@hidden 
@address@hidden@other
+
address@hidden
address@hidden
+
address@hidden Local variables:
address@hidden page-delimiter: "^\\\\message"
address@hidden End:
diff --git a/test/etags/y-src/atest.y b/test/etags/y-src/atest.y
new file mode 100644
index 0000000..81087b8
--- /dev/null
+++ b/test/etags/y-src/atest.y
@@ -0,0 +1,5 @@
+%%
+exp    :       exp '*' exp
+                       { $$.value = $1.value ? $3.value : $5.value;
+                         $$.unsignedp = $3.unsignedp || $5.unsignedp; }
+       ;
diff --git a/test/etags/y-src/cccp.c b/test/etags/y-src/cccp.c
new file mode 100644
index 0000000..6996705
--- /dev/null
+++ b/test/etags/y-src/cccp.c
@@ -0,0 +1,2202 @@
+/* A Bison parser, made from cccp.y
+   by GNU bison 1.32.  */
+
+#define YYBISON 1  /* Identify Bison output.  */
+
+# define       INT     257
+# define       CHAR    258
+# define       NAME    259
+# define       ERROR   260
+# define       OR      261
+# define       AND     262
+# define       EQUAL   263
+# define       NOTEQUAL        264
+# define       LEQ     265
+# define       GEQ     266
+# define       LSH     267
+# define       RSH     268
+# define       UNARY   269
+
+#line 26 "cccp.y"
+
+#include "config.h"
+#include <setjmp.h>
+/* #define YYDEBUG 1 */
+
+#ifdef MULTIBYTE_CHARS
+#include <stdlib.h>
+#include <locale.h>
+#endif
+
+#include <stdio.h>
+
+typedef unsigned char U_CHAR;
+
+/* This is used for communicating lists of keywords with cccp.c.  */
+struct arglist {
+  struct arglist *next;
+  U_CHAR *name;
+  int length;
+  int argno;
+};
+
+/* Define a generic NULL if one hasn't already been defined.  */
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#ifndef GENERIC_PTR
+#if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__)
+#define GENERIC_PTR void *
+#else
+#define GENERIC_PTR char *
+#endif
+#endif
+
+#ifndef NULL_PTR
+#define NULL_PTR ((GENERIC_PTR)0)
+#endif
+
+int yylex ();
+void yyerror ();
+int expression_value;
+
+static jmp_buf parse_return_error;
+
+/* Nonzero means count most punctuation as part of a name.  */
+static int keyword_parsing = 0;
+
+/* some external tables of character types */
+extern unsigned char is_idstart[], is_idchar[], is_hor_space[];
+
+extern char *xmalloc ();
+
+/* Flag for -pedantic.  */
+extern int pedantic;
+
+/* Flag for -traditional.  */
+extern int traditional;
+
+#ifndef CHAR_TYPE_SIZE
+#define CHAR_TYPE_SIZE BITS_PER_UNIT
+#endif
+
+#ifndef INT_TYPE_SIZE
+#define INT_TYPE_SIZE BITS_PER_WORD
+#endif
+
+#ifndef LONG_TYPE_SIZE
+#define LONG_TYPE_SIZE BITS_PER_WORD
+#endif
+
+#ifndef WCHAR_TYPE_SIZE
+#define WCHAR_TYPE_SIZE INT_TYPE_SIZE
+#endif
+
+/* Yield nonzero if adding two numbers with A's and B's signs can yield a
+   number with SUM's sign, where A, B, and SUM are all C integers.  */
+#define possible_sum_sign(a, b, sum) ((((a) ^ (b)) | ~ ((a) ^ (sum))) < 0)
+
+static void integer_overflow ();
+static long left_shift ();
+static long right_shift ();
+
+#line 111 "cccp.y"
+#ifndef YYSTYPE
+typedef union {
+  struct constant {long value; int unsignedp;} integer;
+  struct name {U_CHAR *address; int length;} name;
+  struct arglist *keywords;
+  int voidval;
+  char *sval;
+} yystype;
+# define YYSTYPE yystype
+#endif
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+
+
+#define        YYFINAL         73
+#define        YYFLAG          -32768
+#define        YYNTBASE        34
+
+/* YYTRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */
+#define YYTRANSLATE(x) ((unsigned)(x) <= 269 ? yytranslate[x] : 39)
+
+/* YYTRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX. */
+static const char yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,    29,     2,    31,     2,    27,    14,     2,
+      32,    33,    25,    23,     9,    24,     2,    26,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     8,     2,
+      17,     2,    18,     7,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,    13,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,    12,     2,    30,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     3,     4,     5,
+       6,    10,    11,    15,    16,    19,    20,    21,    22,    28
+};
+
+#if YYDEBUG
+static const short yyprhs[] =
+{
+       0,     0,     2,     4,     8,    11,    14,    17,    20,    23,
+      24,    31,    35,    39,    43,    47,    51,    55,    59,    63,
+      67,    71,    75,    79,    83,    87,    91,    95,    99,   103,
+     107,   113,   115,   117,   119,   120,   125
+};
+static const short yyrhs[] =
+{
+      35,     0,    36,     0,    35,     9,    36,     0,    24,    36,
+       0,    29,    36,     0,    23,    36,     0,    30,    36,     0,
+      31,     5,     0,     0,    31,     5,    37,    32,    38,    33,
+       0,    32,    35,    33,     0,    36,    25,    36,     0,    36,
+      26,    36,     0,    36,    27,    36,     0,    36,    23,    36,
+       0,    36,    24,    36,     0,    36,    21,    36,     0,    36,
+      22,    36,     0,    36,    15,    36,     0,    36,    16,    36,
+       0,    36,    19,    36,     0,    36,    20,    36,     0,    36,
+      17,    36,     0,    36,    18,    36,     0,    36,    14,    36,
+       0,    36,    13,    36,     0,    36,    12,    36,     0,    36,
+      11,    36,     0,    36,    10,    36,     0,    36,     7,    36,
+       8,    36,     0,     3,     0,     4,     0,     5,     0,     0,
+      32,    38,    33,    38,     0,     5,    38,     0
+};
+
+#endif
+
+#if YYDEBUG
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
+static const short yyrline[] =
+{
+       0,   143,   148,   149,   156,   161,   164,   166,   169,   173,
+     173,   180,   185,   197,   212,   223,   230,   237,   243,   249,
+     252,   255,   261,   267,   273,   279,   282,   285,   288,   291,
+     294,   297,   299,   301,   306,   308,   321
+};
+#endif
+
+
+#if (YYDEBUG) || defined YYERROR_VERBOSE
+
+/* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */
+static const char *const yytname[] =
+{
+  "$", "error", "$undefined.", "INT", "CHAR", "NAME", "ERROR", "'?'", "':'", 
+  "','", "OR", "AND", "'|'", "'^'", "'&'", "EQUAL", "NOTEQUAL", "'<'", 
+  "'>'", "LEQ", "GEQ", "LSH", "RSH", "'+'", "'-'", "'*'", "'/'", "'%'", 
+  "UNARY", "'!'", "'~'", "'#'", "'('", "')'", "start", "exp1", "exp", 
+  "@1", "keywords", NULL
+};
+#endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const short yyr1[] =
+{
+       0,    34,    35,    35,    36,    36,    36,    36,    36,    37,
+      36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+      36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
+      36,    36,    36,    36,    38,    38,    38
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+static const short yyr2[] =
+{
+       0,     1,     1,     3,     2,     2,     2,     2,     2,     0,
+       6,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+       3,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+       5,     1,     1,     1,     0,     4,     2
+};
+
+/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
+   doesn't specify something else to do.  Zero means the default is an
+   error. */
+static const short yydefact[] =
+{
+       0,    31,    32,    33,     0,     0,     0,     0,     0,     0,
+       1,     2,     6,     4,     5,     7,     8,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    11,
+       3,     0,    29,    28,    27,    26,    25,    19,    20,    23,
+      24,    21,    22,    17,    18,    15,    16,    12,    13,    14,
+      34,     0,    34,    34,     0,    30,    36,     0,    10,    34,
+      35,     0,     0,     0
+};
+
+static const short yydefgoto[] =
+{
+      71,    10,    11,    38,    64
+};
+
+static const short yypact[] =
+{
+      31,-32768,-32768,-32768,    31,    31,    31,    31,     4,    31,
+       3,    80,-32768,-32768,-32768,-32768,     6,    32,    31,    31,
+      31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
+      31,    31,    31,    31,    31,    31,    31,    31,     7,-32768,
+      80,    59,    97,   113,   128,   142,   155,    25,    25,   162,
+     162,   162,   162,   167,   167,   -19,   -19,-32768,-32768,-32768,
+       5,    31,     5,     5,   -20,    80,-32768,    20,-32768,     5,
+  -32768,    40,    56,-32768
+};
+
+static const short yypgoto[] =
+{
+  -32768,    49,    -4,-32768,   -58
+};
+
+
+#define        YYLAST          194
+
+
+static const short yytable[] =
+{
+      12,    13,    14,    15,    66,    67,    35,    36,    37,    16,
+      62,    70,    18,    68,    40,    41,    42,    43,    44,    45,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+      56,    57,    58,    59,     1,     2,     3,    63,    -9,    60,
+      72,    18,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    69,     4,     5,    73,    65,    17,     0,
+       6,     7,     8,     9,     0,    39,    19,    61,     0,    20,
+      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    36,    37,    19,     0,     0,
+      20,    21,    22,    23,    24,    25,    26,    27,    28,    29,
+      30,    31,    32,    33,    34,    35,    36,    37,    21,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    36,    37,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+      37,    23,    24,    25,    26,    27,    28,    29,    30,    31,
+      32,    33,    34,    35,    36,    37,    24,    25,    26,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    36,    37,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    31,    32,    33,    34,    35,    36,    37,
+      33,    34,    35,    36,    37
+};
+
+static const short yycheck[] =
+{
+       4,     5,     6,     7,    62,    63,    25,    26,    27,     5,
+       5,    69,     9,    33,    18,    19,    20,    21,    22,    23,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    35,    36,    37,     3,     4,     5,    32,    32,    32,
+       0,     9,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    33,    23,    24,     0,    61,     9,    -1,
+      29,    30,    31,    32,    -1,    33,     7,     8,    -1,    10,
+      11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+      21,    22,    23,    24,    25,    26,    27,     7,    -1,    -1,
+      10,    11,    12,    13,    14,    15,    16,    17,    18,    19,
+      20,    21,    22,    23,    24,    25,    26,    27,    11,    12,
+      13,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    12,    13,    14,    15,    16,
+      17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+      27,    13,    14,    15,    16,    17,    18,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    14,    15,    16,    17,
+      18,    19,    20,    21,    22,    23,    24,    25,    26,    27,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    21,    22,    23,    24,    25,    26,    27,
+      23,    24,    25,    26,    27
+};
+/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
+#line 3 "/usr/share/bison/bison.simple"
+
+/* Skeleton output parser for bison,
+   Copyright (C) 1984, 1989, 1990, 2000, 2001 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* This is the parser code that is written into each bison parser when
+   the %semantic_parser declaration is not specified in the grammar.
+   It was written by Richard Stallman by simplifying the hairy parser
+   used when %semantic_parser is specified.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+#ifdef __cplusplus
+# define YYSTD(x) std::x
+#else
+# define YYSTD(x) x
+#endif
+
+#if ! defined (yyoverflow) || defined (YYERROR_VERBOSE)
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# if YYSTACK_USE_ALLOCA
+#  define YYSTACK_ALLOC alloca
+#  define YYSIZE_T YYSTD (size_t)
+# else
+#  ifndef YYSTACK_USE_ALLOCA
+#   if defined (alloca) || defined (_ALLOCA_H)
+#    define YYSTACK_ALLOC alloca
+#    define YYSIZE_T YYSTD (size_t)
+#   else
+#    ifdef __GNUC__
+#     define YYSTACK_ALLOC __builtin_alloca
+#    endif
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's `empty if-body' warning. */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# else
+#  ifdef __cplusplus
+#   include <cstdlib> /* INFRINGES ON USER NAME SPACE */
+#   define YYSIZE_T std::size_t
+#  else
+#   ifdef __STDC__
+#    include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#    define YYSIZE_T size_t
+#   endif
+#  endif
+#  define YYSTACK_ALLOC YYSTD (malloc)
+#  define YYSTACK_FREE YYSTD (free)
+# endif
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  short yyss;
+  YYSTYPE yyvs;
+# if YYLSP_NEEDED
+  YYLTYPE yyls;
+# endif
+};
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# if YYLSP_NEEDED
+#  define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE))     \
+      + 2 * YYSTACK_GAP_MAX)
+# else
+#  define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (short) + sizeof (YYSTYPE))                                
\
+      + YYSTACK_GAP_MAX)
+# endif
+
+/* Relocate the TYPE STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Type, Stack)                                 \
+    do                                                                 \
+      {                                                                        
\
+       YYSIZE_T yynewbytes;                                            \
+       yymemcpy ((char *) yyptr, (char *) (Stack),                     \
+                 yysize * (YYSIZE_T) sizeof (Type));                   \
+       Stack = &yyptr->Stack;                                          \
+       yynewbytes = yystacksize * sizeof (Type) + YYSTACK_GAP_MAX;     \
+       yyptr += yynewbytes / sizeof (*yyptr);                          \
+      }                                                                        
\
+    while (0)
+
+#endif /* ! defined (yyoverflow) || defined (YYERROR_VERBOSE) */
+
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# ifdef __cplusplus
+#  include <cstddef> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T std::size_t
+# else
+#  ifdef __STDC__
+#   include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#   define YYSIZE_T size_t
+#  endif
+# endif
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
+
+#define yyerrok                (yyerrstatus = 0)
+#define yyclearin      (yychar = YYEMPTY)
+#define YYEMPTY                -2
+#define YYEOF          0
+#define YYACCEPT       goto yyacceptlab
+#define YYABORT        goto yyabortlab
+#define YYERROR                goto yyerrlab1
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+#define YYFAIL         goto yyerrlab
+#define YYRECOVERING()  (!!yyerrstatus)
+#define YYBACKUP(Token, Value)                                 \
+do                                                             \
+  if (yychar == YYEMPTY && yylen == 1)                         \
+    {                                                          \
+      yychar = (Token);                                                \
+      yylval = (Value);                                                \
+      yychar1 = YYTRANSLATE (yychar);                          \
+      YYPOPSTACK;                                              \
+      goto yybackup;                                           \
+    }                                                          \
+  else                                                         \
+    {                                                          \
+      yyerror ("syntax error: cannot back up");                        \
+      YYERROR;                                                 \
+    }                                                          \
+while (0)
+
+#define YYTERROR       1
+#define YYERRCODE      256
+
+
+/* YYLLOC_DEFAULT -- Compute the default location (before the actions
+   are run).
+
+   When YYLLOC_DEFAULT is run, CURRENT is set the location of the
+   first token.  By default, to implement support for ranges, extend
+   its range to the last symbol.  */
+
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)               \
+   Current.last_line   = Rhs[N].last_line;     \
+   Current.last_column = Rhs[N].last_column;
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#if YYPURE
+# if YYLSP_NEEDED
+#  ifdef YYLEX_PARAM
+#   define YYLEX               yylex (&yylval, &yylloc, YYLEX_PARAM)
+#  else
+#   define YYLEX               yylex (&yylval, &yylloc)
+#  endif
+# else /* !YYLSP_NEEDED */
+#  ifdef YYLEX_PARAM
+#   define YYLEX               yylex (&yylval, YYLEX_PARAM)
+#  else
+#   define YYLEX               yylex (&yylval)
+#  endif
+# endif /* !YYLSP_NEEDED */
+#else /* !YYPURE */
+# define YYLEX                 yylex ()
+#endif /* !YYPURE */
+
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  ifdef __cplusplus
+#   include <cstdio>  /* INFRINGES ON USER NAME SPACE */
+#  else
+#   include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  endif
+#  define YYFPRINTF YYSTD (fprintf)
+# endif
+
+# define YYDPRINTF(Args)                       \
+do {                                           \
+  if (yydebug)                                 \
+    YYFPRINTF Args;                            \
+} while (0)
+/* Nonzero means print parse trace. [The following comment makes no
+   sense to me.  Could someone clarify it?  --akim] Since this is
+   uninitialized, it does not stop multiple parsers from coexisting.
+   */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+#endif /* !YYDEBUG */
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef        YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#if YYMAXDEPTH == 0
+# undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+#if ! defined (yyoverflow) && ! defined (yymemcpy)
+# if __GNUC__ > 1              /* GNU C and GNU C++ define this.  */
+#  define yymemcpy __builtin_memcpy
+# else                         /* not GNU C or C++ */
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+#  if defined (__STDC__) || defined (__cplusplus)
+yymemcpy (char *yyto, const char *yyfrom, YYSIZE_T yycount)
+#  else
+yymemcpy (yyto, yyfrom, yycount)
+     char *yyto;
+     const char *yyfrom;
+     YYSIZE_T yycount;
+#  endif
+{
+  register const char *yyf = yyfrom;
+  register char *yyt = yyto;
+  register YYSIZE_T yyi = yycount;
+
+  while (yyi-- != 0)
+    *yyt++ = *yyf++;
+}
+# endif
+#endif
+
+#ifdef YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined (__GLIBC__) && defined (_STRING_H)
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+static YYSIZE_T
+#   if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+#   else
+yystrlen (yystr)
+     const char *yystr;
+#   endif
+{
+  register const char *yys = yystr;
+
+  while (*yys++ != '\0')
+    continue;
+
+  return yys - yystr - 1;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+static char *
+#   if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+#   else
+yystpcpy (yydest, yysrc)
+     char *yydest;
+     const char *yysrc;
+#   endif
+{
+  register char *yyd = yydest;
+  register const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+#endif
+
+#line 341 "/usr/share/bison/bison.simple"
+
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+   into yyparse.  The argument should have type void *.
+   It should actually point to an object.
+   Grammar actions can access the variable by casting it
+   to the proper pointer type.  */
+
+#ifdef YYPARSE_PARAM
+# ifdef __cplusplus
+#  define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#  define YYPARSE_PARAM_DECL
+# else /* !__cplusplus */
+#  define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#  define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+# endif /* !__cplusplus */
+#else /* !YYPARSE_PARAM */
+# define YYPARSE_PARAM_ARG
+# define YYPARSE_PARAM_DECL
+#endif /* !YYPARSE_PARAM */
+
+/* Prevent warning if -Wstrict-prototypes.  */
+#ifdef __GNUC__
+# ifdef YYPARSE_PARAM
+int yyparse (void *);
+# else
+int yyparse (void);
+# endif
+#endif
+
+/* YY_DECL_VARIABLES -- depending whether we use a pure parser,
+   variables are global, or local to YYPARSE.  */
+
+#define YY_DECL_NON_LSP_VARIABLES                      \
+/* The lookahead symbol.  */                           \
+int yychar;                                            \
+                                                       \
+/* The semantic value of the lookahead symbol. */      \
+YYSTYPE yylval;                                                \
+                                                       \
+/* Number of parse errors so far.  */                  \
+int yynerrs;
+
+#if YYLSP_NEEDED
+# define YY_DECL_VARIABLES                     \
+YY_DECL_NON_LSP_VARIABLES                      \
+                                               \
+/* Location data for the lookahead symbol.  */ \
+YYLTYPE yylloc;
+#else
+# define YY_DECL_VARIABLES                     \
+YY_DECL_NON_LSP_VARIABLES
+#endif
+
+
+/* If nonreentrant, generate the variables here. */
+
+#if !YYPURE
+YY_DECL_VARIABLES
+#endif  /* !YYPURE */
+
+int
+yyparse (YYPARSE_PARAM_ARG)
+     YYPARSE_PARAM_DECL
+{
+  /* If reentrant, generate the variables here. */
+#if YYPURE
+  YY_DECL_VARIABLES
+#endif  /* !YYPURE */
+
+  register int yystate;
+  register int yyn;
+  int yyresult;
+  /* Number of tokens to shift before error messages enabled.  */
+  int yyerrstatus;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yychar1 = 0;
+
+  /* Three stacks and their tools:
+     `yyss': related to states,
+     `yyvs': related to semantic values,
+     `yyls': related to locations.
+
+     Refer to the stacks thru separate pointers, to allow yyoverflow
+     to reallocate them elsewhere.  */
+
+  /* The state stack. */
+  short        yyssa[YYINITDEPTH];
+  short *yyss = yyssa;
+  register short *yyssp;
+
+  /* The semantic value stack.  */
+  YYSTYPE yyvsa[YYINITDEPTH];
+  YYSTYPE *yyvs = yyvsa;
+  register YYSTYPE *yyvsp;
+
+#if YYLSP_NEEDED
+  /* The location stack.  */
+  YYLTYPE yylsa[YYINITDEPTH];
+  YYLTYPE *yyls = yylsa;
+  YYLTYPE *yylsp;
+#endif
+
+#if YYLSP_NEEDED
+# define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
+#else
+# define YYPOPSTACK   (yyvsp--, yyssp--)
+#endif
+
+  YYSIZE_T yystacksize = YYINITDEPTH;
+
+
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+#if YYLSP_NEEDED
+  YYLTYPE yyloc;
+#endif
+
+  /* When reducing, the number of symbols on the RHS of the reduced
+     rule. */
+  int yylen;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;            /* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss;
+  yyvsp = yyvs;
+#if YYLSP_NEEDED
+  yylsp = yyls;
+#endif
+  goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed. so pushing a state here evens the stacks.
+     */
+  yyssp++;
+
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyssp >= yyss + yystacksize - 1)
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+       /* Give user a chance to reallocate the stack. Use copies of
+          these so that the &'s don't force the real ones into
+          memory.  */
+       YYSTYPE *yyvs1 = yyvs;
+       short *yyss1 = yyss;
+
+       /* Each stack pointer address is followed by the size of the
+          data in use in that stack, in bytes.  */
+# if YYLSP_NEEDED
+       YYLTYPE *yyls1 = yyls;
+       /* This used to be a conditional around just the two extra args,
+          but that might be undefined if yyoverflow is a macro.  */
+       yyoverflow ("parser stack overflow",
+                   &yyss1, yysize * sizeof (*yyssp),
+                   &yyvs1, yysize * sizeof (*yyvsp),
+                   &yyls1, yysize * sizeof (*yylsp),
+                   &yystacksize);
+       yyls = yyls1;
+# else
+       yyoverflow ("parser stack overflow",
+                   &yyss1, yysize * sizeof (*yyssp),
+                   &yyvs1, yysize * sizeof (*yyvsp),
+                   &yystacksize);
+# endif
+       yyss = yyss1;
+       yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+      /* Extend the stack our own way.  */
+      if (yystacksize >= YYMAXDEPTH)
+       goto yyoverflowlab;
+      yystacksize *= 2;
+      if (yystacksize > YYMAXDEPTH)
+       yystacksize = YYMAXDEPTH;
+
+      {
+       short *yyss1 = yyss;
+       union yyalloc *yyptr =
+         (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+       if (! yyptr)
+         goto yyoverflowlab;
+       YYSTACK_RELOCATE (short, yyss);
+       YYSTACK_RELOCATE (YYSTYPE, yyvs);
+# if YYLSP_NEEDED
+       YYSTACK_RELOCATE (YYLTYPE, yyls);
+# endif
+# undef YYSTACK_RELOCATE
+       if (yyss1 != yyssa)
+         YYSTACK_FREE (yyss1);
+      }
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+#if YYLSP_NEEDED
+      yylsp = yyls + yysize - 1;
+#endif
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+                 (unsigned long int) yystacksize));
+
+      if (yyssp >= yyss + yystacksize - 1)
+       YYABORT;
+    }
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  goto yybackup;
+
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
+    }
+
+  /* Convert token to internal form (in yychar1) for indexing tables with */
+
+  if (yychar <= 0)             /* This means end of input. */
+    {
+      yychar1 = 0;
+      yychar = YYEOF;          /* Don't call YYLEX any more */
+
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yychar1 = YYTRANSLATE (yychar);
+
+#if YYDEBUG
+     /* We have to keep this `#if YYDEBUG', since we use variables
+       which are defined only if `YYDEBUG' is set.  */
+      if (yydebug)
+       {
+         YYFPRINTF (stderr, "Next token is %d (%s",
+                    yychar, yytname[yychar1]);
+         /* Give the individual parser a way to print the precise
+            meaning of a token, for further debugging info.  */
+# ifdef YYPRINT
+         YYPRINT (stderr, yychar, yylval);
+# endif
+         YYFPRINTF (stderr, ")\n");
+       }
+#endif
+    }
+
+  yyn += yychar1;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+    goto yydefault;
+
+  yyn = yytable[yyn];
+
+  /* yyn is what to do for this token type in this state.
+     Negative => reduce, -yyn is rule number.
+     Positive => shift, yyn is new state.
+       New state is final state => don't bother to shift,
+       just return success.
+     0, or most negative number => error.  */
+
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+       goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrlab;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+  YYDPRINTF ((stderr, "Shifting token %d (%s), ",
+             yychar, yytname[yychar1]));
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+#if YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to the semantic value of
+     the lookahead token.  This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+#if YYLSP_NEEDED
+  /* Similarly for the default location.  Let the user run additional
+     commands if for instance locations are ranges.  */
+  yyloc = yylsp[1-yylen];
+  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
+#endif
+
+#if YYDEBUG
+  /* We have to keep this `#if YYDEBUG', since we use variables which
+     are defined only if `YYDEBUG' is set.  */
+  if (yydebug)
+    {
+      int yyi;
+
+      YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
+                yyn, yyrline[yyn]);
+
+      /* Print the symbols being reduced, and their result.  */
+      for (yyi = yyprhs[yyn]; yyrhs[yyi] > 0; yyi++)
+       YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
+      YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+    }
+#endif
+
+  switch (yyn) {
+
+case 1:
+#line 144 "cccp.y"
+{ expression_value = yyvsp[0].integer.value; }
+    break;
+case 3:
+#line 150 "cccp.y"
+{ if (pedantic)
+                           pedwarn ("comma operator in operand of `#if'");
+                         yyval.integer = yyvsp[0].integer; }
+    break;
+case 4:
+#line 157 "cccp.y"
+{ yyval.integer.value = - yyvsp[0].integer.value;
+                         if ((yyval.integer.value & yyvsp[0].integer.value) < 
0 && ! yyvsp[0].integer.unsignedp)
+                           integer_overflow ();
+                         yyval.integer.unsignedp = yyvsp[0].integer.unsignedp; 
}
+    break;
+case 5:
+#line 162 "cccp.y"
+{ yyval.integer.value = ! yyvsp[0].integer.value;
+                         yyval.integer.unsignedp = 0; }
+    break;
+case 6:
+#line 165 "cccp.y"
+{ yyval.integer = yyvsp[0].integer; }
+    break;
+case 7:
+#line 167 "cccp.y"
+{ yyval.integer.value = ~ yyvsp[0].integer.value;
+                         yyval.integer.unsignedp = yyvsp[0].integer.unsignedp; 
}
+    break;
+case 8:
+#line 170 "cccp.y"
+{ yyval.integer.value = check_assertion (yyvsp[0].name.address, 
yyvsp[0].name.length,
+                                                     0, NULL_PTR);
+                         yyval.integer.unsignedp = 0; }
+    break;
+case 9:
+#line 174 "cccp.y"
+{ keyword_parsing = 1; }
+    break;
+case 10:
+#line 176 "cccp.y"
+{ yyval.integer.value = check_assertion (yyvsp[-4].name.address, 
yyvsp[-4].name.length,
+                                                     1, yyvsp[-1].keywords);
+                         keyword_parsing = 0;
+                         yyval.integer.unsignedp = 0; }
+    break;
+case 11:
+#line 181 "cccp.y"
+{ yyval.integer = yyvsp[-1].integer; }
+    break;
+case 12:
+#line 186 "cccp.y"
+{ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp || 
yyvsp[0].integer.unsignedp;
+                         if (yyval.integer.unsignedp)
+                           yyval.integer.value = (unsigned long) 
yyvsp[-2].integer.value * yyvsp[0].integer.value;
+                         else
+                           {
+                             yyval.integer.value = yyvsp[-2].integer.value * 
yyvsp[0].integer.value;
+                             if (yyvsp[-2].integer.value
+                                 && (yyval.integer.value / 
yyvsp[-2].integer.value != yyvsp[0].integer.value
+                                     || (yyval.integer.value & 
yyvsp[-2].integer.value & yyvsp[0].integer.value) < 0))
+                               integer_overflow ();
+                           } }
+    break;
+case 13:
+#line 198 "cccp.y"
+{ if (yyvsp[0].integer.value == 0)
+                           {
+                             error ("division by zero in #if");
+                             yyvsp[0].integer.value = 1;
+                           }
+                         yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp 
|| yyvsp[0].integer.unsignedp;
+                         if (yyval.integer.unsignedp)
+                           yyval.integer.value = (unsigned long) 
yyvsp[-2].integer.value / yyvsp[0].integer.value;
+                         else
+                           {
+                             yyval.integer.value = yyvsp[-2].integer.value / 
yyvsp[0].integer.value;
+                             if ((yyval.integer.value & 
yyvsp[-2].integer.value & yyvsp[0].integer.value) < 0)
+                               integer_overflow ();
+                           } }
+    break;
+case 14:
+#line 213 "cccp.y"
+{ if (yyvsp[0].integer.value == 0)
+                           {
+                             error ("division by zero in #if");
+                             yyvsp[0].integer.value = 1;
+                           }
+                         yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp 
|| yyvsp[0].integer.unsignedp;
+                         if (yyval.integer.unsignedp)
+                           yyval.integer.value = (unsigned long) 
yyvsp[-2].integer.value % yyvsp[0].integer.value;
+                         else
+                           yyval.integer.value = yyvsp[-2].integer.value % 
yyvsp[0].integer.value; }
+    break;
+case 15:
+#line 224 "cccp.y"
+{ yyval.integer.value = yyvsp[-2].integer.value + yyvsp[0].integer.value;
+                         yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp 
|| yyvsp[0].integer.unsignedp;
+                         if (! yyval.integer.unsignedp
+                             && ! possible_sum_sign (yyvsp[-2].integer.value, 
yyvsp[0].integer.value,
+                                                     yyval.integer.value))
+                           integer_overflow (); }
+    break;
+case 16:
+#line 231 "cccp.y"
+{ yyval.integer.value = yyvsp[-2].integer.value - yyvsp[0].integer.value;
+                         yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp 
|| yyvsp[0].integer.unsignedp;
+                         if (! yyval.integer.unsignedp
+                             && ! possible_sum_sign (yyval.integer.value, 
yyvsp[0].integer.value,
+                                                     yyvsp[-2].integer.value))
+                           integer_overflow (); }
+    break;
+case 17:
+#line 238 "cccp.y"
+{ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp;
+                         if (yyvsp[0].integer.value < 0 && ! 
yyvsp[0].integer.unsignedp)
+                           yyval.integer.value = right_shift 
(&yyvsp[-2].integer, -yyvsp[0].integer.value);
+                         else
+                           yyval.integer.value = left_shift 
(&yyvsp[-2].integer, yyvsp[0].integer.value); }
+    break;
+case 18:
+#line 244 "cccp.y"
+{ yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp;
+                         if (yyvsp[0].integer.value < 0 && ! 
yyvsp[0].integer.unsignedp)
+                           yyval.integer.value = left_shift 
(&yyvsp[-2].integer, -yyvsp[0].integer.value);
+                         else
+                           yyval.integer.value = right_shift 
(&yyvsp[-2].integer, yyvsp[0].integer.value); }
+    break;
+case 19:
+#line 250 "cccp.y"
+{ yyval.integer.value = (yyvsp[-2].integer.value == yyvsp[0].integer.value);
+                         yyval.integer.unsignedp = 0; }
+    break;
+case 20:
+#line 253 "cccp.y"
+{ yyval.integer.value = (yyvsp[-2].integer.value != yyvsp[0].integer.value);
+                         yyval.integer.unsignedp = 0; }
+    break;
+case 21:
+#line 256 "cccp.y"
+{ yyval.integer.unsignedp = 0;
+                         if (yyvsp[-2].integer.unsignedp || 
yyvsp[0].integer.unsignedp)
+                           yyval.integer.value = (unsigned long) 
yyvsp[-2].integer.value <= yyvsp[0].integer.value;
+                         else
+                           yyval.integer.value = yyvsp[-2].integer.value <= 
yyvsp[0].integer.value; }
+    break;
+case 22:
+#line 262 "cccp.y"
+{ yyval.integer.unsignedp = 0;
+                         if (yyvsp[-2].integer.unsignedp || 
yyvsp[0].integer.unsignedp)
+                           yyval.integer.value = (unsigned long) 
yyvsp[-2].integer.value >= yyvsp[0].integer.value;
+                         else
+                           yyval.integer.value = yyvsp[-2].integer.value >= 
yyvsp[0].integer.value; }
+    break;
+case 23:
+#line 268 "cccp.y"
+{ yyval.integer.unsignedp = 0;
+                         if (yyvsp[-2].integer.unsignedp || 
yyvsp[0].integer.unsignedp)
+                           yyval.integer.value = (unsigned long) 
yyvsp[-2].integer.value < yyvsp[0].integer.value;
+                         else
+                           yyval.integer.value = yyvsp[-2].integer.value < 
yyvsp[0].integer.value; }
+    break;
+case 24:
+#line 274 "cccp.y"
+{ yyval.integer.unsignedp = 0;
+                         if (yyvsp[-2].integer.unsignedp || 
yyvsp[0].integer.unsignedp)
+                           yyval.integer.value = (unsigned long) 
yyvsp[-2].integer.value > yyvsp[0].integer.value;
+                         else
+                           yyval.integer.value = yyvsp[-2].integer.value > 
yyvsp[0].integer.value; }
+    break;
+case 25:
+#line 280 "cccp.y"
+{ yyval.integer.value = yyvsp[-2].integer.value & yyvsp[0].integer.value;
+                         yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp 
|| yyvsp[0].integer.unsignedp; }
+    break;
+case 26:
+#line 283 "cccp.y"
+{ yyval.integer.value = yyvsp[-2].integer.value ^ yyvsp[0].integer.value;
+                         yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp 
|| yyvsp[0].integer.unsignedp; }
+    break;
+case 27:
+#line 286 "cccp.y"
+{ yyval.integer.value = yyvsp[-2].integer.value | yyvsp[0].integer.value;
+                         yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp 
|| yyvsp[0].integer.unsignedp; }
+    break;
+case 28:
+#line 289 "cccp.y"
+{ yyval.integer.value = (yyvsp[-2].integer.value && yyvsp[0].integer.value);
+                         yyval.integer.unsignedp = 0; }
+    break;
+case 29:
+#line 292 "cccp.y"
+{ yyval.integer.value = (yyvsp[-2].integer.value || yyvsp[0].integer.value);
+                         yyval.integer.unsignedp = 0; }
+    break;
+case 30:
+#line 295 "cccp.y"
+{ yyval.integer.value = yyvsp[-4].integer.value ? yyvsp[-2].integer.value : 
yyvsp[0].integer.value;
+                         yyval.integer.unsignedp = yyvsp[-2].integer.unsignedp 
|| yyvsp[0].integer.unsignedp; }
+    break;
+case 31:
+#line 298 "cccp.y"
+{ yyval.integer = yylval.integer; }
+    break;
+case 32:
+#line 300 "cccp.y"
+{ yyval.integer = yylval.integer; }
+    break;
+case 33:
+#line 302 "cccp.y"
+{ yyval.integer.value = 0;
+                         yyval.integer.unsignedp = 0; }
+    break;
+case 34:
+#line 307 "cccp.y"
+{ yyval.keywords = 0; }
+    break;
+case 35:
+#line 309 "cccp.y"
+{ struct arglist *temp;
+                         yyval.keywords = (struct arglist *) xmalloc (sizeof 
(struct arglist));
+                         yyval.keywords->next = yyvsp[-2].keywords;
+                         yyval.keywords->name = (U_CHAR *) "(";
+                         yyval.keywords->length = 1;
+                         temp = yyval.keywords;
+                         while (temp != 0 && temp->next != 0)
+                           temp = temp->next;
+                         temp->next = (struct arglist *) xmalloc (sizeof 
(struct arglist));
+                         temp->next->next = yyvsp[0].keywords;
+                         temp->next->name = (U_CHAR *) ")";
+                         temp->next->length = 1; }
+    break;
+case 36:
+#line 322 "cccp.y"
+{ yyval.keywords = (struct arglist *) xmalloc (sizeof (struct arglist));
+                         yyval.keywords->name = yyvsp[-1].name.address;
+                         yyval.keywords->length = yyvsp[-1].name.length;
+                         yyval.keywords->next = yyvsp[0].keywords; }
+    break;
+}
+
+#line 727 "/usr/share/bison/bison.simple"
+
+
+  yyvsp -= yylen;
+  yyssp -= yylen;
+#if YYLSP_NEEDED
+  yylsp -= yylen;
+#endif
+
+#if YYDEBUG
+  if (yydebug)
+    {
+      short *yyssp1 = yyss - 1;
+      YYFPRINTF (stderr, "state stack now");
+      while (yyssp1 != yyssp)
+       YYFPRINTF (stderr, " %d", *++yyssp1);
+      YYFPRINTF (stderr, "\n");
+    }
+#endif
+
+  *++yyvsp = yyval;
+#if YYLSP_NEEDED
+  *++yylsp = yyloc;
+#endif
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTBASE];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (yyn > YYFLAG && yyn < YYLAST)
+       {
+         YYSIZE_T yysize = 0;
+         char *yymsg;
+         int yyx, yycount;
+
+         yycount = 0;
+         /* Start YYX at -YYN if negative to avoid negative indexes in
+            YYCHECK.  */
+         for (yyx = yyn < 0 ? -yyn : 0;
+              yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
+           if (yycheck[yyx + yyn] == yyx)
+             yysize += yystrlen (yytname[yyx]) + 15, yycount++;
+         yysize += yystrlen ("parse error, unexpected ") + 1;
+         yysize += yystrlen (yytname[YYTRANSLATE (yychar)]);
+         yymsg = (char *) YYSTACK_ALLOC (yysize);
+         if (yymsg != 0)
+           {
+             char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
+             yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]);
+
+             if (yycount < 5)
+               {
+                 yycount = 0;
+                 for (yyx = yyn < 0 ? -yyn : 0;
+                      yyx < (int) (sizeof (yytname) / sizeof (char *));
+                      yyx++)
+                   if (yycheck[yyx + yyn] == yyx)
+                     {
+                       const char *yyq = ! yycount ? ", expecting " : " or ";
+                       yyp = yystpcpy (yyp, yyq);
+                       yyp = yystpcpy (yyp, yytname[yyx]);
+                       yycount++;
+                     }
+               }
+             yyerror (yymsg);
+             YYSTACK_FREE (yymsg);
+           }
+         else
+           yyerror ("parse error; also virtual memory exhausted");
+       }
+      else
+#endif /* defined (YYERROR_VERBOSE) */
+       yyerror ("parse error");
+    }
+  goto yyerrlab1;
+
+
+/*--------------------------------------------------.
+| yyerrlab1 -- error raised explicitly by an action |
+`--------------------------------------------------*/
+yyerrlab1:
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse lookahead token after an
+        error, discard it.  */
+
+      /* return failure if at end of input */
+      if (yychar == YYEOF)
+       YYABORT;
+      YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
+                 yychar, yytname[yychar1]));
+      yychar = YYEMPTY;
+    }
+
+  /* Else will try to reuse lookahead token after shifting the error
+     token.  */
+
+  yyerrstatus = 3;             /* Each real token shifted decrements this */
+
+  goto yyerrhandle;
+
+
+/*-------------------------------------------------------------------.
+| yyerrdefault -- current state does not do anything special for the |
+| error token.                                                       |
+`-------------------------------------------------------------------*/
+yyerrdefault:
+#if 0
+  /* This is wrong; only states that explicitly want error tokens
+     should shift them.  */
+
+  /* If its default is to accept any token, ok.  Otherwise pop it.  */
+  yyn = yydefact[yystate];
+  if (yyn)
+    goto yydefault;
+#endif
+
+
+/*---------------------------------------------------------------.
+| yyerrpop -- pop the current state because it cannot handle the |
+| error token                                                    |
+`---------------------------------------------------------------*/
+yyerrpop:
+  if (yyssp == yyss)
+    YYABORT;
+  yyvsp--;
+  yystate = *--yyssp;
+#if YYLSP_NEEDED
+  yylsp--;
+#endif
+
+#if YYDEBUG
+  if (yydebug)
+    {
+      short *yyssp1 = yyss - 1;
+      YYFPRINTF (stderr, "Error: state stack now");
+      while (yyssp1 != yyssp)
+       YYFPRINTF (stderr, " %d", *++yyssp1);
+      YYFPRINTF (stderr, "\n");
+    }
+#endif
+
+/*--------------.
+| yyerrhandle.  |
+`--------------*/
+yyerrhandle:
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yyerrdefault;
+
+  yyn += YYTERROR;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+    goto yyerrdefault;
+
+  yyn = yytable[yyn];
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+       goto yyerrpop;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrpop;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  YYDPRINTF ((stderr, "Shifting error token, "));
+
+  *++yyvsp = yylval;
+#if YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+/*---------------------------------------------.
+| yyoverflowab -- parser overflow comes here.  |
+`---------------------------------------------*/
+yyoverflowlab:
+  yyerror ("parser stack overflow");
+  yyresult = 2;
+  /* Fall through.  */
+
+yyreturn:
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+  return yyresult;
+}
+#line 327 "cccp.y"
+
+
+/* During parsing of a C expression, the pointer to the next character
+   is in this variable.  */
+
+static char *lexptr;
+
+/* Take care of parsing a number (anything that starts with a digit).
+   Set yylval and return the token type; update lexptr.
+   LEN is the number of characters in it.  */
+
+/* maybe needs to actually deal with floating point numbers */
+
+int
+parse_number (olen)
+     int olen;
+{
+  register char *p = lexptr;
+  register int c;
+  register unsigned long n = 0, nd, ULONG_MAX_over_base;
+  register int base = 10;
+  register int len = olen;
+  register int overflow = 0;
+  register int digit, largest_digit = 0;
+  int spec_long = 0;
+
+  for (c = 0; c < len; c++)
+    if (p[c] == '.') {
+      /* It's a float since it contains a point.  */
+      yyerror ("floating point numbers not allowed in #if expressions");
+      return ERROR;
+    }
+
+  yylval.integer.unsignedp = 0;
+
+  if (len >= 3 && (!strncmp (p, "0x", 2) || !strncmp (p, "0X", 2))) {
+    p += 2;
+    base = 16;
+    len -= 2;
+  }
+  else if (*p == '0')
+    base = 8;
+
+  ULONG_MAX_over_base = (unsigned long) -1 / base;
+
+  for (; len > 0; len--) {
+    c = *p++;
+
+    if (c >= '0' && c <= '9')
+      digit = c - '0';
+    else if (base == 16 && c >= 'a' && c <= 'f')
+      digit = c - 'a' + 10;
+    else if (base == 16 && c >= 'A' && c <= 'F')
+      digit = c - 'A' + 10;
+    else {
+      /* `l' means long, and `u' means unsigned.  */
+      while (1) {
+       if (c == 'l' || c == 'L')
+         {
+           if (spec_long)
+             yyerror ("two `l's in integer constant");
+           spec_long = 1;
+         }
+       else if (c == 'u' || c == 'U')
+         {
+           if (yylval.integer.unsignedp)
+             yyerror ("two `u's in integer constant");
+           yylval.integer.unsignedp = 1;
+         }
+       else
+         break;
+
+       if (--len == 0)
+         break;
+       c = *p++;
+      }
+      /* Don't look for any more digits after the suffixes.  */
+      break;
+    }
+    if (largest_digit < digit)
+      largest_digit = digit;
+    nd = n * base + digit;
+    overflow |= ULONG_MAX_over_base < n | nd < n;
+    n = nd;
+  }
+
+  if (len != 0) {
+    yyerror ("Invalid number in #if expression");
+    return ERROR;
+  }
+
+  if (base <= largest_digit)
+    warning ("integer constant contains digits beyond the radix");
+
+  if (overflow)
+    warning ("integer constant out of range");
+
+  /* If too big to be signed, consider it unsigned.  */
+  if ((long) n < 0 && ! yylval.integer.unsignedp)
+    {
+      if (base == 10)
+       warning ("integer constant is so large that it is unsigned");
+      yylval.integer.unsignedp = 1;
+    }
+
+  lexptr = p;
+  yylval.integer.value = n;
+  return INT;
+}
+
+struct token {
+  char *operator;
+  int token;
+};
+
+static struct token tokentab2[] = {
+  {"&&", AND},
+  {"||", OR},
+  {"<<", LSH},
+  {">>", RSH},
+  {"==", EQUAL},
+  {"!=", NOTEQUAL},
+  {"<=", LEQ},
+  {">=", GEQ},
+  {"++", ERROR},
+  {"--", ERROR},
+  {NULL, ERROR}
+};
+
+/* Read one token, getting characters through lexptr.  */
+
+int
+yylex ()
+{
+  register int c;
+  register int namelen;
+  register unsigned char *tokstart;
+  register struct token *toktab;
+  int wide_flag;
+
+ retry:
+
+  tokstart = (unsigned char *) lexptr;
+  c = *tokstart;
+  /* See if it is a special token of length 2.  */
+  if (! keyword_parsing)
+    for (toktab = tokentab2; toktab->operator != NULL; toktab++)
+      if (c == *toktab->operator && tokstart[1] == toktab->operator[1]) {
+       lexptr += 2;
+       if (toktab->token == ERROR)
+         {
+           char *buf = (char *) alloca (40);
+           sprintf (buf, "`%s' not allowed in operand of `#if'", 
toktab->operator);
+           yyerror (buf);
+         }
+       return toktab->token;
+      }
+
+  switch (c) {
+  case 0:
+    return 0;
+    
+  case ' ':
+  case '\t':
+  case '\r':
+  case '\n':
+    lexptr++;
+    goto retry;
+    
+  case 'L':
+    /* Capital L may start a wide-string or wide-character constant.  */
+    if (lexptr[1] == '\'')
+      {
+       lexptr++;
+       wide_flag = 1;
+       goto char_constant;
+      }
+    if (lexptr[1] == '"')
+      {
+       lexptr++;
+       wide_flag = 1;
+       goto string_constant;
+      }
+    break;
+
+  case '\'':
+    wide_flag = 0;
+  char_constant:
+    lexptr++;
+    if (keyword_parsing) {
+      char *start_ptr = lexptr - 1;
+      while (1) {
+       c = *lexptr++;
+       if (c == '\\')
+         c = parse_escape (&lexptr);
+       else if (c == '\'')
+         break;
+      }
+      yylval.name.address = tokstart;
+      yylval.name.length = lexptr - start_ptr;
+      return NAME;
+    }
+
+    /* This code for reading a character constant
+       handles multicharacter constants and wide characters.
+       It is mostly copied from c-lex.c.  */
+    {
+      register int result = 0;
+      register num_chars = 0;
+      unsigned width = CHAR_TYPE_SIZE;
+      int max_chars;
+      char *token_buffer;
+
+      if (wide_flag)
+       {
+         width = WCHAR_TYPE_SIZE;
+#ifdef MULTIBYTE_CHARS
+         max_chars = MB_CUR_MAX;
+#else
+         max_chars = 1;
+#endif
+       }
+      else
+       max_chars = LONG_TYPE_SIZE / width;
+
+      token_buffer = (char *) alloca (max_chars + 1);
+
+      while (1)
+       {
+         c = *lexptr++;
+
+         if (c == '\'' || c == EOF)
+           break;
+
+         if (c == '\\')
+           {
+             c = parse_escape (&lexptr);
+             if (width < HOST_BITS_PER_INT
+                 && (unsigned) c >= (1 << width))
+               pedwarn ("escape sequence out of range for character");
+           }
+
+         num_chars++;
+
+         /* Merge character into result; ignore excess chars.  */
+         if (num_chars < max_chars + 1)
+           {
+             if (width < HOST_BITS_PER_INT)
+               result = (result << width) | (c & ((1 << width) - 1));
+             else
+               result = c;
+             token_buffer[num_chars - 1] = c;
+           }
+       }
+
+      token_buffer[num_chars] = 0;
+
+      if (c != '\'')
+       error ("malformatted character constant");
+      else if (num_chars == 0)
+       error ("empty character constant");
+      else if (num_chars > max_chars)
+       {
+         num_chars = max_chars;
+         error ("character constant too long");
+       }
+      else if (num_chars != 1 && ! traditional)
+       warning ("multi-character character constant");
+
+      /* If char type is signed, sign-extend the constant.  */
+      if (! wide_flag)
+       {
+         int num_bits = num_chars * width;
+
+         if (lookup ("__CHAR_UNSIGNED__", sizeof ("__CHAR_UNSIGNED__")-1, -1)
+             || ((result >> (num_bits - 1)) & 1) == 0)
+           yylval.integer.value
+             = result & ((unsigned long) ~0 >> (HOST_BITS_PER_LONG - 
num_bits));
+         else
+           yylval.integer.value
+             = result | ~((unsigned long) ~0 >> (HOST_BITS_PER_LONG - 
num_bits));
+       }
+      else
+       {
+#ifdef MULTIBYTE_CHARS
+         /* Set the initial shift state and convert the next sequence.  */
+         result = 0;
+         /* In all locales L'\0' is zero and mbtowc will return zero,
+            so don't use it.  */
+         if (num_chars > 1
+             || (num_chars == 1 && token_buffer[0] != '\0'))
+           {
+             wchar_t wc;
+             (void) mbtowc (NULL_PTR, NULL_PTR, 0);
+             if (mbtowc (& wc, token_buffer, num_chars) == num_chars)
+               result = wc;
+             else
+               warning ("Ignoring invalid multibyte character");
+           }
+#endif
+         yylval.integer.value = result;
+       }
+    }
+
+    /* This is always a signed type.  */
+    yylval.integer.unsignedp = 0;
+    
+    return CHAR;
+
+    /* some of these chars are invalid in constant expressions;
+       maybe do something about them later */
+  case '/':
+  case '+':
+  case '-':
+  case '*':
+  case '%':
+  case '|':
+  case '&':
+  case '^':
+  case '~':
+  case '!':
+  case '@':
+  case '<':
+  case '>':
+  case '[':
+  case ']':
+  case '.':
+  case '?':
+  case ':':
+  case '=':
+  case '{':
+  case '}':
+  case ',':
+  case '#':
+    if (keyword_parsing)
+      break;
+  case '(':
+  case ')':
+    lexptr++;
+    return c;
+
+  case '"':
+  string_constant:
+    if (keyword_parsing) {
+      char *start_ptr = lexptr;
+      lexptr++;
+      while (1) {
+       c = *lexptr++;
+       if (c == '\\')
+         c = parse_escape (&lexptr);
+       else if (c == '"')
+         break;
+      }
+      yylval.name.address = tokstart;
+      yylval.name.length = lexptr - start_ptr;
+      return NAME;
+    }
+    yyerror ("string constants not allowed in #if expressions");
+    return ERROR;
+  }
+
+  if (c >= '0' && c <= '9' && !keyword_parsing) {
+    /* It's a number */
+    for (namelen = 0;
+        c = tokstart[namelen], is_idchar[c] || c == '.'; 
+        namelen++)
+      ;
+    return parse_number (namelen);
+  }
+
+  /* It is a name.  See how long it is.  */
+
+  if (keyword_parsing) {
+    for (namelen = 0;; namelen++) {
+      if (is_hor_space[tokstart[namelen]])
+       break;
+      if (tokstart[namelen] == '(' || tokstart[namelen] == ')')
+       break;
+      if (tokstart[namelen] == '"' || tokstart[namelen] == '\'')
+       break;
+    }
+  } else {
+    if (!is_idstart[c]) {
+      yyerror ("Invalid token in expression");
+      return ERROR;
+    }
+
+    for (namelen = 0; is_idchar[tokstart[namelen]]; namelen++)
+      ;
+  }
+  
+  lexptr += namelen;
+  yylval.name.address = tokstart;
+  yylval.name.length = namelen;
+  return NAME;
+}
+
+
+/* Parse a C escape sequence.  STRING_PTR points to a variable
+   containing a pointer to the string to parse.  That pointer
+   is updated past the characters we use.  The value of the
+   escape sequence is returned.
+
+   A negative value means the sequence \ newline was seen,
+   which is supposed to be equivalent to nothing at all.
+
+   If \ is followed by a null character, we return a negative
+   value and leave the string pointer pointing at the null character.
+
+   If \ is followed by 000, we return 0 and leave the string pointer
+   after the zeros.  A value of 0 does not mean end of string.  */
+
+int
+parse_escape (string_ptr)
+     char **string_ptr;
+{
+  register int c = *(*string_ptr)++;
+  switch (c)
+    {
+    case 'a':
+      return TARGET_BELL;
+    case 'b':
+      return TARGET_BS;
+    case 'e':
+    case 'E':
+      if (pedantic)
+       pedwarn ("non-ANSI-standard escape sequence, `\\%c'", c);
+      return 033;
+    case 'f':
+      return TARGET_FF;
+    case 'n':
+      return TARGET_NEWLINE;
+    case 'r':
+      return TARGET_CR;
+    case 't':
+      return TARGET_TAB;
+    case 'v':
+      return TARGET_VT;
+    case '\n':
+      return -2;
+    case 0:
+      (*string_ptr)--;
+      return 0;
+      
+    case '0':
+    case '1':
+    case '2':
+    case '3':
+    case '4':
+    case '5':
+    case '6':
+    case '7':
+      {
+       register int i = c - '0';
+       register int count = 0;
+       while (++count < 3)
+         {
+           c = *(*string_ptr)++;
+           if (c >= '0' && c <= '7')
+             i = (i << 3) + c - '0';
+           else
+             {
+               (*string_ptr)--;
+               break;
+             }
+         }
+       if ((i & ~((1 << CHAR_TYPE_SIZE) - 1)) != 0)
+         {
+           i &= (1 << CHAR_TYPE_SIZE) - 1;
+           warning ("octal character constant does not fit in a byte");
+         }
+       return i;
+      }
+    case 'x':
+      {
+       register unsigned i = 0, overflow = 0, digits_found = 0, digit;
+       for (;;)
+         {
+           c = *(*string_ptr)++;
+           if (c >= '0' && c <= '9')
+             digit = c - '0';
+           else if (c >= 'a' && c <= 'f')
+             digit = c - 'a' + 10;
+           else if (c >= 'A' && c <= 'F')
+             digit = c - 'A' + 10;
+           else
+             {
+               (*string_ptr)--;
+               break;
+             }
+           overflow |= i ^ (i << 4 >> 4);
+           i = (i << 4) + digit;
+           digits_found = 1;
+         }
+       if (!digits_found)
+         yyerror ("\\x used with no following hex digits");
+       if (overflow | (i & ~((1 << BITS_PER_UNIT) - 1)))
+         {
+           i &= (1 << BITS_PER_UNIT) - 1;
+           warning ("hex character constant does not fit in a byte");
+         }
+       return i;
+      }
+    default:
+      return c;
+    }
+}
+
+void
+yyerror (s)
+     char *s;
+{
+  error (s);
+  longjmp (parse_return_error, 1);
+}
+
+static void
+integer_overflow ()
+{
+  if (pedantic)
+    pedwarn ("integer overflow in preprocessor expression");
+}
+
+static long
+left_shift (a, b)
+     struct constant *a;
+     unsigned long b;
+{
+  if (b >= HOST_BITS_PER_LONG)
+    {
+      if (! a->unsignedp && a->value != 0)
+       integer_overflow ();
+      return 0;
+    }
+  else if (a->unsignedp)
+    return (unsigned long) a->value << b;
+  else
+    {
+      long l = a->value << b;
+      if (l >> b != a->value)
+       integer_overflow ();
+      return l;
+    }
+}
+
+static long
+right_shift (a, b)
+     struct constant *a;
+     unsigned long b;
+{
+  if (b >= HOST_BITS_PER_LONG)
+    return a->unsignedp ? 0 : a->value >> (HOST_BITS_PER_LONG - 1);
+  else if (a->unsignedp)
+    return (unsigned long) a->value >> b;
+  else
+    return a->value >> b;
+}
+
+/* This page contains the entry point to this file.  */
+
+/* Parse STRING as an expression, and complain if this fails
+   to use up all of the contents of STRING.  */
+/* We do not support C comments.  They should be removed before
+   this function is called.  */
+
+int
+parse_c_expression (string)
+     char *string;
+{
+  lexptr = string;
+  
+  if (lexptr == 0 || *lexptr == 0) {
+    error ("empty #if expression");
+    return 0;                  /* don't include the #if group */
+  }
+
+  /* if there is some sort of scanning error, just return 0 and assume
+     the parsing routine has printed an error message somewhere.
+     there is surely a better thing to do than this.     */
+  if (setjmp (parse_return_error))
+    return 0;
+
+  if (yyparse ())
+    return 0;                  /* actually this is never reached
+                                  the way things stand. */
+  if (*lexptr)
+    error ("Junk after end of expression.");
+
+  return expression_value;     /* set by yyparse () */
+}
+
+#ifdef TEST_EXP_READER
+extern int yydebug;
+
+/* Main program for testing purposes.  */
+int
+main ()
+{
+  int n, c;
+  char buf[1024];
+
+/*
+  yydebug = 1;
+*/
+  initialize_random_junk ();
+
+  for (;;) {
+    printf ("enter expression: ");
+    n = 0;
+    while ((buf[n] = getchar ()) != '\n' && buf[n] != EOF)
+      n++;
+    if (buf[n] == EOF)
+      break;
+    buf[n] = '\0';
+    printf ("parser returned %d\n", parse_c_expression (buf));
+  }
+
+  return 0;
+}
+
+/* table to tell if char can be part of a C identifier. */
+unsigned char is_idchar[256];
+/* table to tell if char can be first char of a c identifier. */
+unsigned char is_idstart[256];
+/* table to tell if c is horizontal space.  isspace () thinks that
+   newline is space; this is not a good idea for this program. */
+char is_hor_space[256];
+
+/*
+ * initialize random junk in the hash table and maybe other places
+ */
+initialize_random_junk ()
+{
+  register int i;
+
+  /*
+   * Set up is_idchar and is_idstart tables.  These should be
+   * faster than saying (is_alpha (c) || c == '_'), etc.
+   * Must do set up these things before calling any routines tthat
+   * refer to them.
+   */
+  for (i = 'a'; i <= 'z'; i++) {
+    ++is_idchar[i - 'a' + 'A'];
+    ++is_idchar[i];
+    ++is_idstart[i - 'a' + 'A'];
+    ++is_idstart[i];
+  }
+  for (i = '0'; i <= '9'; i++)
+    ++is_idchar[i];
+  ++is_idchar['_'];
+  ++is_idstart['_'];
+#if DOLLARS_IN_IDENTIFIERS
+  ++is_idchar['$'];
+  ++is_idstart['$'];
+#endif
+
+  /* horizontal space table */
+  ++is_hor_space[' '];
+  ++is_hor_space['\t'];
+}
+
+error (msg)
+{
+  printf ("error: %s\n", msg);
+}
+
+warning (msg)
+{
+  printf ("warning: %s\n", msg);
+}
+
+struct hashnode *
+lookup (name, len, hash)
+     char *name;
+     int len;
+     int hash;
+{
+  return (DEFAULT_SIGNED_CHAR) ? 0 : ((struct hashnode *) -1);
+}
+#endif
diff --git a/test/etags/y-src/cccp.y b/test/etags/y-src/cccp.y
new file mode 100644
index 0000000..1cd2111
--- /dev/null
+++ b/test/etags/y-src/cccp.y
@@ -0,0 +1,1006 @@
+/* Parse C expressions for CCCP.
+   Copyright (C) 1987, 1992 Free Software Foundation.
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option) any
+later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ In other words, you are welcome to use, share and improve this program.
+ You are forbidden to forbid anyone else to use, share and improve
+ what you give them.   Help stamp out software-hoarding!
+
+ Adapted from expread.y of GDB by Paul Rubin, July 1986.  */
+
+/* Parse a C expression from text in a string  */
+   
+%{
+#include "config.h"
+#include <setjmp.h>
+/* #define YYDEBUG 1 */
+
+#ifdef MULTIBYTE_CHARS
+#include <stdlib.h>
+#include <locale.h>
+#endif
+
+#include <stdio.h>
+
+typedef unsigned char U_CHAR;
+
+/* This is used for communicating lists of keywords with cccp.c.  */
+struct arglist {
+  struct arglist *next;
+  U_CHAR *name;
+  int length;
+  int argno;
+};
+
+/* Define a generic NULL if one hasn't already been defined.  */
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#ifndef GENERIC_PTR
+#if defined (USE_PROTOTYPES) ? USE_PROTOTYPES : defined (__STDC__)
+#define GENERIC_PTR void *
+#else
+#define GENERIC_PTR char *
+#endif
+#endif
+
+#ifndef NULL_PTR
+#define NULL_PTR ((GENERIC_PTR)0)
+#endif
+
+int yylex ();
+void yyerror ();
+int expression_value;
+
+static jmp_buf parse_return_error;
+
+/* Nonzero means count most punctuation as part of a name.  */
+static int keyword_parsing = 0;
+
+/* some external tables of character types */
+extern unsigned char is_idstart[], is_idchar[], is_hor_space[];
+
+extern char *xmalloc ();
+
+/* Flag for -pedantic.  */
+extern int pedantic;
+
+/* Flag for -traditional.  */
+extern int traditional;
+
+#ifndef CHAR_TYPE_SIZE
+#define CHAR_TYPE_SIZE BITS_PER_UNIT
+#endif
+
+#ifndef INT_TYPE_SIZE
+#define INT_TYPE_SIZE BITS_PER_WORD
+#endif
+
+#ifndef LONG_TYPE_SIZE
+#define LONG_TYPE_SIZE BITS_PER_WORD
+#endif
+
+#ifndef WCHAR_TYPE_SIZE
+#define WCHAR_TYPE_SIZE INT_TYPE_SIZE
+#endif
+
+/* Yield nonzero if adding two numbers with A's and B's signs can yield a
+   number with SUM's sign, where A, B, and SUM are all C integers.  */
+#define possible_sum_sign(a, b, sum) ((((a) ^ (b)) | ~ ((a) ^ (sum))) < 0)
+
+static void integer_overflow ();
+static long left_shift ();
+static long right_shift ();
+%}
+
+%union {
+  struct constant {long value; int unsignedp;} integer;
+  struct name {U_CHAR *address; int length;} name;
+  struct arglist *keywords;
+  int voidval;
+  char *sval;
+}
+
+%type <integer> exp exp1 start
+%type <keywords> keywords
+%token <integer> INT CHAR
+%token <name> NAME
+%token <integer> ERROR
+
+%right '?' ':'
+%left ','
+%left OR
+%left AND
+%left '|'
+%left '^'
+%left '&'
+%left EQUAL NOTEQUAL
+%left '<' '>' LEQ GEQ
+%left LSH RSH
+%left '+' '-'
+%left '*' '/' '%'
+%right UNARY
+
+/* %expect 40 */
+
+%%
+
+start   :      exp1
+               { expression_value = $1.value; }
+       ;
+
+/* Expressions, including the comma operator.  */
+exp1   :       exp
+       |       exp1 ',' exp
+                       { if (pedantic)
+                           pedwarn ("comma operator in operand of `#if'");
+                         $$ = $3; }
+       ;
+
+/* Expressions, not including the comma operator.  */
+exp    :       '-' exp    %prec UNARY
+                       { $$.value = - $2.value;
+                         if (($$.value & $2.value) < 0 && ! $2.unsignedp)
+                           integer_overflow ();
+                         $$.unsignedp = $2.unsignedp; }
+       |       '!' exp    %prec UNARY
+                       { $$.value = ! $2.value;
+                         $$.unsignedp = 0; }
+       |       '+' exp    %prec UNARY
+                       { $$ = $2; }
+       |       '~' exp    %prec UNARY
+                       { $$.value = ~ $2.value;
+                         $$.unsignedp = $2.unsignedp; }
+       |       '#' NAME
+                       { $$.value = check_assertion ($2.address, $2.length,
+                                                     0, NULL_PTR);
+                         $$.unsignedp = 0; }
+       |       '#' NAME
+                       { keyword_parsing = 1; }
+               '(' keywords ')'
+                       { $$.value = check_assertion ($2.address, $2.length,
+                                                     1, $5);
+                         keyword_parsing = 0;
+                         $$.unsignedp = 0; }
+       |       '(' exp1 ')'
+                       { $$ = $2; }
+       ;
+
+/* Binary operators in order of decreasing precedence.  */
+exp    :       exp '*' exp
+                       { $$.unsignedp = $1.unsignedp || $3.unsignedp;
+                         if ($$.unsignedp)
+                           $$.value = (unsigned long) $1.value * $3.value;
+                         else
+                           {
+                             $$.value = $1.value * $3.value;
+                             if ($1.value
+                                 && ($$.value / $1.value != $3.value
+                                     || ($$.value & $1.value & $3.value) < 0))
+                               integer_overflow ();
+                           } }
+       |       exp '/' exp
+                       { if ($3.value == 0)
+                           {
+                             error ("division by zero in #if");
+                             $3.value = 1;
+                           }
+                         $$.unsignedp = $1.unsignedp || $3.unsignedp;
+                         if ($$.unsignedp)
+                           $$.value = (unsigned long) $1.value / $3.value;
+                         else
+                           {
+                             $$.value = $1.value / $3.value;
+                             if (($$.value & $1.value & $3.value) < 0)
+                               integer_overflow ();
+                           } }
+       |       exp '%' exp
+                       { if ($3.value == 0)
+                           {
+                             error ("division by zero in #if");
+                             $3.value = 1;
+                           }
+                         $$.unsignedp = $1.unsignedp || $3.unsignedp;
+                         if ($$.unsignedp)
+                           $$.value = (unsigned long) $1.value % $3.value;
+                         else
+                           $$.value = $1.value % $3.value; }
+       |       exp '+' exp
+                       { $$.value = $1.value + $3.value;
+                         $$.unsignedp = $1.unsignedp || $3.unsignedp;
+                         if (! $$.unsignedp
+                             && ! possible_sum_sign ($1.value, $3.value,
+                                                     $$.value))
+                           integer_overflow (); }
+       |       exp '-' exp
+                       { $$.value = $1.value - $3.value;
+                         $$.unsignedp = $1.unsignedp || $3.unsignedp;
+                         if (! $$.unsignedp
+                             && ! possible_sum_sign ($$.value, $3.value,
+                                                     $1.value))
+                           integer_overflow (); }
+       |       exp LSH exp
+                       { $$.unsignedp = $1.unsignedp;
+                         if ($3.value < 0 && ! $3.unsignedp)
+                           $$.value = right_shift (&$1, -$3.value);
+                         else
+                           $$.value = left_shift (&$1, $3.value); }
+       |       exp RSH exp
+                       { $$.unsignedp = $1.unsignedp;
+                         if ($3.value < 0 && ! $3.unsignedp)
+                           $$.value = left_shift (&$1, -$3.value);
+                         else
+                           $$.value = right_shift (&$1, $3.value); }
+       |       exp EQUAL exp
+                       { $$.value = ($1.value == $3.value);
+                         $$.unsignedp = 0; }
+       |       exp NOTEQUAL exp
+                       { $$.value = ($1.value != $3.value);
+                         $$.unsignedp = 0; }
+       |       exp LEQ exp
+                       { $$.unsignedp = 0;
+                         if ($1.unsignedp || $3.unsignedp)
+                           $$.value = (unsigned long) $1.value <= $3.value;
+                         else
+                           $$.value = $1.value <= $3.value; }
+       |       exp GEQ exp
+                       { $$.unsignedp = 0;
+                         if ($1.unsignedp || $3.unsignedp)
+                           $$.value = (unsigned long) $1.value >= $3.value;
+                         else
+                           $$.value = $1.value >= $3.value; }
+       |       exp '<' exp
+                       { $$.unsignedp = 0;
+                         if ($1.unsignedp || $3.unsignedp)
+                           $$.value = (unsigned long) $1.value < $3.value;
+                         else
+                           $$.value = $1.value < $3.value; }
+       |       exp '>' exp
+                       { $$.unsignedp = 0;
+                         if ($1.unsignedp || $3.unsignedp)
+                           $$.value = (unsigned long) $1.value > $3.value;
+                         else
+                           $$.value = $1.value > $3.value; }
+       |       exp '&' exp
+                       { $$.value = $1.value & $3.value;
+                         $$.unsignedp = $1.unsignedp || $3.unsignedp; }
+       |       exp '^' exp
+                       { $$.value = $1.value ^ $3.value;
+                         $$.unsignedp = $1.unsignedp || $3.unsignedp; }
+       |       exp '|' exp
+                       { $$.value = $1.value | $3.value;
+                         $$.unsignedp = $1.unsignedp || $3.unsignedp; }
+       |       exp AND exp
+                       { $$.value = ($1.value && $3.value);
+                         $$.unsignedp = 0; }
+       |       exp OR exp
+                       { $$.value = ($1.value || $3.value);
+                         $$.unsignedp = 0; }
+       |       exp '?' exp ':' exp
+                       { $$.value = $1.value ? $3.value : $5.value;
+                         $$.unsignedp = $3.unsignedp || $5.unsignedp; }
+       |       INT
+                       { $$ = yylval.integer; }
+       |       CHAR
+                       { $$ = yylval.integer; }
+       |       NAME
+                       { $$.value = 0;
+                         $$.unsignedp = 0; }
+       ;
+
+keywords :
+                       { $$ = 0; } 
+       |       '(' keywords ')' keywords
+                       { struct arglist *temp;
+                         $$ = (struct arglist *) xmalloc (sizeof (struct 
arglist));
+                         $$->next = $2;
+                         $$->name = (U_CHAR *) "(";
+                         $$->length = 1;
+                         temp = $$;
+                         while (temp != 0 && temp->next != 0)
+                           temp = temp->next;
+                         temp->next = (struct arglist *) xmalloc (sizeof 
(struct arglist));
+                         temp->next->next = $4;
+                         temp->next->name = (U_CHAR *) ")";
+                         temp->next->length = 1; }
+       |       NAME keywords
+                       { $$ = (struct arglist *) xmalloc (sizeof (struct 
arglist));
+                         $$->name = $1.address;
+                         $$->length = $1.length;
+                         $$->next = $2; } 
+       ;
+%%
+
+/* During parsing of a C expression, the pointer to the next character
+   is in this variable.  */
+
+static char *lexptr;
+
+/* Take care of parsing a number (anything that starts with a digit).
+   Set yylval and return the token type; update lexptr.
+   LEN is the number of characters in it.  */
+
+/* maybe needs to actually deal with floating point numbers */
+
+int
+parse_number (olen)
+     int olen;
+{
+  register char *p = lexptr;
+  register int c;
+  register unsigned long n = 0, nd, ULONG_MAX_over_base;
+  register int base = 10;
+  register int len = olen;
+  register int overflow = 0;
+  register int digit, largest_digit = 0;
+  int spec_long = 0;
+
+  for (c = 0; c < len; c++)
+    if (p[c] == '.') {
+      /* It's a float since it contains a point.  */
+      yyerror ("floating point numbers not allowed in #if expressions");
+      return ERROR;
+    }
+
+  yylval.integer.unsignedp = 0;
+
+  if (len >= 3 && (!strncmp (p, "0x", 2) || !strncmp (p, "0X", 2))) {
+    p += 2;
+    base = 16;
+    len -= 2;
+  }
+  else if (*p == '0')
+    base = 8;
+
+  ULONG_MAX_over_base = (unsigned long) -1 / base;
+
+  for (; len > 0; len--) {
+    c = *p++;
+
+    if (c >= '0' && c <= '9')
+      digit = c - '0';
+    else if (base == 16 && c >= 'a' && c <= 'f')
+      digit = c - 'a' + 10;
+    else if (base == 16 && c >= 'A' && c <= 'F')
+      digit = c - 'A' + 10;
+    else {
+      /* `l' means long, and `u' means unsigned.  */
+      while (1) {
+       if (c == 'l' || c == 'L')
+         {
+           if (spec_long)
+             yyerror ("two `l's in integer constant");
+           spec_long = 1;
+         }
+       else if (c == 'u' || c == 'U')
+         {
+           if (yylval.integer.unsignedp)
+             yyerror ("two `u's in integer constant");
+           yylval.integer.unsignedp = 1;
+         }
+       else
+         break;
+
+       if (--len == 0)
+         break;
+       c = *p++;
+      }
+      /* Don't look for any more digits after the suffixes.  */
+      break;
+    }
+    if (largest_digit < digit)
+      largest_digit = digit;
+    nd = n * base + digit;
+    overflow |= ULONG_MAX_over_base < n | nd < n;
+    n = nd;
+  }
+
+  if (len != 0) {
+    yyerror ("Invalid number in #if expression");
+    return ERROR;
+  }
+
+  if (base <= largest_digit)
+    warning ("integer constant contains digits beyond the radix");
+
+  if (overflow)
+    warning ("integer constant out of range");
+
+  /* If too big to be signed, consider it unsigned.  */
+  if ((long) n < 0 && ! yylval.integer.unsignedp)
+    {
+      if (base == 10)
+       warning ("integer constant is so large that it is unsigned");
+      yylval.integer.unsignedp = 1;
+    }
+
+  lexptr = p;
+  yylval.integer.value = n;
+  return INT;
+}
+
+struct token {
+  char *operator;
+  int token;
+};
+
+static struct token tokentab2[] = {
+  {"&&", AND},
+  {"||", OR},
+  {"<<", LSH},
+  {">>", RSH},
+  {"==", EQUAL},
+  {"!=", NOTEQUAL},
+  {"<=", LEQ},
+  {">=", GEQ},
+  {"++", ERROR},
+  {"--", ERROR},
+  {NULL, ERROR}
+};
+
+/* Read one token, getting characters through lexptr.  */
+
+int
+yylex ()
+{
+  register int c;
+  register int namelen;
+  register unsigned char *tokstart;
+  register struct token *toktab;
+  int wide_flag;
+
+ retry:
+
+  tokstart = (unsigned char *) lexptr;
+  c = *tokstart;
+  /* See if it is a special token of length 2.  */
+  if (! keyword_parsing)
+    for (toktab = tokentab2; toktab->operator != NULL; toktab++)
+      if (c == *toktab->operator && tokstart[1] == toktab->operator[1]) {
+       lexptr += 2;
+       if (toktab->token == ERROR)
+         {
+           char *buf = (char *) alloca (40);
+           sprintf (buf, "`%s' not allowed in operand of `#if'", 
toktab->operator);
+           yyerror (buf);
+         }
+       return toktab->token;
+      }
+
+  switch (c) {
+  case 0:
+    return 0;
+    
+  case ' ':
+  case '\t':
+  case '\r':
+  case '\n':
+    lexptr++;
+    goto retry;
+    
+  case 'L':
+    /* Capital L may start a wide-string or wide-character constant.  */
+    if (lexptr[1] == '\'')
+      {
+       lexptr++;
+       wide_flag = 1;
+       goto char_constant;
+      }
+    if (lexptr[1] == '"')
+      {
+       lexptr++;
+       wide_flag = 1;
+       goto string_constant;
+      }
+    break;
+
+  case '\'':
+    wide_flag = 0;
+  char_constant:
+    lexptr++;
+    if (keyword_parsing) {
+      char *start_ptr = lexptr - 1;
+      while (1) {
+       c = *lexptr++;
+       if (c == '\\')
+         c = parse_escape (&lexptr);
+       else if (c == '\'')
+         break;
+      }
+      yylval.name.address = tokstart;
+      yylval.name.length = lexptr - start_ptr;
+      return NAME;
+    }
+
+    /* This code for reading a character constant
+       handles multicharacter constants and wide characters.
+       It is mostly copied from c-lex.c.  */
+    {
+      register int result = 0;
+      register num_chars = 0;
+      unsigned width = CHAR_TYPE_SIZE;
+      int max_chars;
+      char *token_buffer;
+
+      if (wide_flag)
+       {
+         width = WCHAR_TYPE_SIZE;
+#ifdef MULTIBYTE_CHARS
+         max_chars = MB_CUR_MAX;
+#else
+         max_chars = 1;
+#endif
+       }
+      else
+       max_chars = LONG_TYPE_SIZE / width;
+
+      token_buffer = (char *) alloca (max_chars + 1);
+
+      while (1)
+       {
+         c = *lexptr++;
+
+         if (c == '\'' || c == EOF)
+           break;
+
+         if (c == '\\')
+           {
+             c = parse_escape (&lexptr);
+             if (width < HOST_BITS_PER_INT
+                 && (unsigned) c >= (1 << width))
+               pedwarn ("escape sequence out of range for character");
+           }
+
+         num_chars++;
+
+         /* Merge character into result; ignore excess chars.  */
+         if (num_chars < max_chars + 1)
+           {
+             if (width < HOST_BITS_PER_INT)
+               result = (result << width) | (c & ((1 << width) - 1));
+             else
+               result = c;
+             token_buffer[num_chars - 1] = c;
+           }
+       }
+
+      token_buffer[num_chars] = 0;
+
+      if (c != '\'')
+       error ("malformatted character constant");
+      else if (num_chars == 0)
+       error ("empty character constant");
+      else if (num_chars > max_chars)
+       {
+         num_chars = max_chars;
+         error ("character constant too long");
+       }
+      else if (num_chars != 1 && ! traditional)
+       warning ("multi-character character constant");
+
+      /* If char type is signed, sign-extend the constant.  */
+      if (! wide_flag)
+       {
+         int num_bits = num_chars * width;
+
+         if (lookup ("__CHAR_UNSIGNED__", sizeof ("__CHAR_UNSIGNED__")-1, -1)
+             || ((result >> (num_bits - 1)) & 1) == 0)
+           yylval.integer.value
+             = result & ((unsigned long) ~0 >> (HOST_BITS_PER_LONG - 
num_bits));
+         else
+           yylval.integer.value
+             = result | ~((unsigned long) ~0 >> (HOST_BITS_PER_LONG - 
num_bits));
+       }
+      else
+       {
+#ifdef MULTIBYTE_CHARS
+         /* Set the initial shift state and convert the next sequence.  */
+         result = 0;
+         /* In all locales L'\0' is zero and mbtowc will return zero,
+            so don't use it.  */
+         if (num_chars > 1
+             || (num_chars == 1 && token_buffer[0] != '\0'))
+           {
+             wchar_t wc;
+             (void) mbtowc (NULL_PTR, NULL_PTR, 0);
+             if (mbtowc (& wc, token_buffer, num_chars) == num_chars)
+               result = wc;
+             else
+               warning ("Ignoring invalid multibyte character");
+           }
+#endif
+         yylval.integer.value = result;
+       }
+    }
+
+    /* This is always a signed type.  */
+    yylval.integer.unsignedp = 0;
+    
+    return CHAR;
+
+    /* some of these chars are invalid in constant expressions;
+       maybe do something about them later */
+  case '/':
+  case '+':
+  case '-':
+  case '*':
+  case '%':
+  case '|':
+  case '&':
+  case '^':
+  case '~':
+  case '!':
+  case '@':
+  case '<':
+  case '>':
+  case '[':
+  case ']':
+  case '.':
+  case '?':
+  case ':':
+  case '=':
+  case '{':
+  case '}':
+  case ',':
+  case '#':
+    if (keyword_parsing)
+      break;
+  case '(':
+  case ')':
+    lexptr++;
+    return c;
+
+  case '"':
+  string_constant:
+    if (keyword_parsing) {
+      char *start_ptr = lexptr;
+      lexptr++;
+      while (1) {
+       c = *lexptr++;
+       if (c == '\\')
+         c = parse_escape (&lexptr);
+       else if (c == '"')
+         break;
+      }
+      yylval.name.address = tokstart;
+      yylval.name.length = lexptr - start_ptr;
+      return NAME;
+    }
+    yyerror ("string constants not allowed in #if expressions");
+    return ERROR;
+  }
+
+  if (c >= '0' && c <= '9' && !keyword_parsing) {
+    /* It's a number */
+    for (namelen = 0;
+        c = tokstart[namelen], is_idchar[c] || c == '.'; 
+        namelen++)
+      ;
+    return parse_number (namelen);
+  }
+
+  /* It is a name.  See how long it is.  */
+
+  if (keyword_parsing) {
+    for (namelen = 0;; namelen++) {
+      if (is_hor_space[tokstart[namelen]])
+       break;
+      if (tokstart[namelen] == '(' || tokstart[namelen] == ')')
+       break;
+      if (tokstart[namelen] == '"' || tokstart[namelen] == '\'')
+       break;
+    }
+  } else {
+    if (!is_idstart[c]) {
+      yyerror ("Invalid token in expression");
+      return ERROR;
+    }
+
+    for (namelen = 0; is_idchar[tokstart[namelen]]; namelen++)
+      ;
+  }
+  
+  lexptr += namelen;
+  yylval.name.address = tokstart;
+  yylval.name.length = namelen;
+  return NAME;
+}
+
+
+/* Parse a C escape sequence.  STRING_PTR points to a variable
+   containing a pointer to the string to parse.  That pointer
+   is updated past the characters we use.  The value of the
+   escape sequence is returned.
+
+   A negative value means the sequence \ newline was seen,
+   which is supposed to be equivalent to nothing at all.
+
+   If \ is followed by a null character, we return a negative
+   value and leave the string pointer pointing at the null character.
+
+   If \ is followed by 000, we return 0 and leave the string pointer
+   after the zeros.  A value of 0 does not mean end of string.  */
+
+int
+parse_escape (string_ptr)
+     char **string_ptr;
+{
+  register int c = *(*string_ptr)++;
+  switch (c)
+    {
+    case 'a':
+      return TARGET_BELL;
+    case 'b':
+      return TARGET_BS;
+    case 'e':
+    case 'E':
+      if (pedantic)
+       pedwarn ("non-ANSI-standard escape sequence, `\\%c'", c);
+      return 033;
+    case 'f':
+      return TARGET_FF;
+    case 'n':
+      return TARGET_NEWLINE;
+    case 'r':
+      return TARGET_CR;
+    case 't':
+      return TARGET_TAB;
+    case 'v':
+      return TARGET_VT;
+    case '\n':
+      return -2;
+    case 0:
+      (*string_ptr)--;
+      return 0;
+      
+    case '0':
+    case '1':
+    case '2':
+    case '3':
+    case '4':
+    case '5':
+    case '6':
+    case '7':
+      {
+       register int i = c - '0';
+       register int count = 0;
+       while (++count < 3)
+         {
+           c = *(*string_ptr)++;
+           if (c >= '0' && c <= '7')
+             i = (i << 3) + c - '0';
+           else
+             {
+               (*string_ptr)--;
+               break;
+             }
+         }
+       if ((i & ~((1 << CHAR_TYPE_SIZE) - 1)) != 0)
+         {
+           i &= (1 << CHAR_TYPE_SIZE) - 1;
+           warning ("octal character constant does not fit in a byte");
+         }
+       return i;
+      }
+    case 'x':
+      {
+       register unsigned i = 0, overflow = 0, digits_found = 0, digit;
+       for (;;)
+         {
+           c = *(*string_ptr)++;
+           if (c >= '0' && c <= '9')
+             digit = c - '0';
+           else if (c >= 'a' && c <= 'f')
+             digit = c - 'a' + 10;
+           else if (c >= 'A' && c <= 'F')
+             digit = c - 'A' + 10;
+           else
+             {
+               (*string_ptr)--;
+               break;
+             }
+           overflow |= i ^ (i << 4 >> 4);
+           i = (i << 4) + digit;
+           digits_found = 1;
+         }
+       if (!digits_found)
+         yyerror ("\\x used with no following hex digits");
+       if (overflow | (i & ~((1 << BITS_PER_UNIT) - 1)))
+         {
+           i &= (1 << BITS_PER_UNIT) - 1;
+           warning ("hex character constant does not fit in a byte");
+         }
+       return i;
+      }
+    default:
+      return c;
+    }
+}
+
+void
+yyerror (s)
+     char *s;
+{
+  error (s);
+  longjmp (parse_return_error, 1);
+}
+
+static void
+integer_overflow ()
+{
+  if (pedantic)
+    pedwarn ("integer overflow in preprocessor expression");
+}
+
+static long
+left_shift (a, b)
+     struct constant *a;
+     unsigned long b;
+{
+  if (b >= HOST_BITS_PER_LONG)
+    {
+      if (! a->unsignedp && a->value != 0)
+       integer_overflow ();
+      return 0;
+    }
+  else if (a->unsignedp)
+    return (unsigned long) a->value << b;
+  else
+    {
+      long l = a->value << b;
+      if (l >> b != a->value)
+       integer_overflow ();
+      return l;
+    }
+}
+
+static long
+right_shift (a, b)
+     struct constant *a;
+     unsigned long b;
+{
+  if (b >= HOST_BITS_PER_LONG)
+    return a->unsignedp ? 0 : a->value >> (HOST_BITS_PER_LONG - 1);
+  else if (a->unsignedp)
+    return (unsigned long) a->value >> b;
+  else
+    return a->value >> b;
+}
+
+/* This page contains the entry point to this file.  */
+
+/* Parse STRING as an expression, and complain if this fails
+   to use up all of the contents of STRING.  */
+/* We do not support C comments.  They should be removed before
+   this function is called.  */
+
+int
+parse_c_expression (string)
+     char *string;
+{
+  lexptr = string;
+  
+  if (lexptr == 0 || *lexptr == 0) {
+    error ("empty #if expression");
+    return 0;                  /* don't include the #if group */
+  }
+
+  /* if there is some sort of scanning error, just return 0 and assume
+     the parsing routine has printed an error message somewhere.
+     there is surely a better thing to do than this.     */
+  if (setjmp (parse_return_error))
+    return 0;
+
+  if (yyparse ())
+    return 0;                  /* actually this is never reached
+                                  the way things stand. */
+  if (*lexptr)
+    error ("Junk after end of expression.");
+
+  return expression_value;     /* set by yyparse () */
+}
+
+#ifdef TEST_EXP_READER
+extern int yydebug;
+
+/* Main program for testing purposes.  */
+int
+main ()
+{
+  int n, c;
+  char buf[1024];
+
+/*
+  yydebug = 1;
+*/
+  initialize_random_junk ();
+
+  for (;;) {
+    printf ("enter expression: ");
+    n = 0;
+    while ((buf[n] = getchar ()) != '\n' && buf[n] != EOF)
+      n++;
+    if (buf[n] == EOF)
+      break;
+    buf[n] = '\0';
+    printf ("parser returned %d\n", parse_c_expression (buf));
+  }
+
+  return 0;
+}
+
+/* table to tell if char can be part of a C identifier. */
+unsigned char is_idchar[256];
+/* table to tell if char can be first char of a c identifier. */
+unsigned char is_idstart[256];
+/* table to tell if c is horizontal space.  isspace () thinks that
+   newline is space; this is not a good idea for this program. */
+char is_hor_space[256];
+
+/*
+ * initialize random junk in the hash table and maybe other places
+ */
+initialize_random_junk ()
+{
+  register int i;
+
+  /*
+   * Set up is_idchar and is_idstart tables.  These should be
+   * faster than saying (is_alpha (c) || c == '_'), etc.
+   * Must do set up these things before calling any routines tthat
+   * refer to them.
+   */
+  for (i = 'a'; i <= 'z'; i++) {
+    ++is_idchar[i - 'a' + 'A'];
+    ++is_idchar[i];
+    ++is_idstart[i - 'a' + 'A'];
+    ++is_idstart[i];
+  }
+  for (i = '0'; i <= '9'; i++)
+    ++is_idchar[i];
+  ++is_idchar['_'];
+  ++is_idstart['_'];
+#if DOLLARS_IN_IDENTIFIERS
+  ++is_idchar['$'];
+  ++is_idstart['$'];
+#endif
+
+  /* horizontal space table */
+  ++is_hor_space[' '];
+  ++is_hor_space['\t'];
+}
+
+error (msg)
+{
+  printf ("error: %s\n", msg);
+}
+
+warning (msg)
+{
+  printf ("warning: %s\n", msg);
+}
+
+struct hashnode *
+lookup (name, len, hash)
+     char *name;
+     int len;
+     int hash;
+{
+  return (DEFAULT_SIGNED_CHAR) ? 0 : ((struct hashnode *) -1);
+}
+#endif
diff --git a/test/etags/y-src/parse.c b/test/etags/y-src/parse.c
new file mode 100644
index 0000000..7b1eedc
--- /dev/null
+++ b/test/etags/y-src/parse.c
@@ -0,0 +1,2236 @@
+/* A Bison parser, made from parse.y
+   by GNU bison 1.32.  */
+
+#define YYBISON 1  /* Identify Bison output.  */
+
+# define       NE      257
+# define       LE      258
+# define       GE      259
+# define       NEG     260
+# define       L_CELL  261
+# define       L_RANGE 262
+# define       L_VAR   263
+# define       L_CONST 264
+# define       L_FN0   265
+# define       L_FN1   266
+# define       L_FN2   267
+# define       L_FN3   268
+# define       L_FN4   269
+# define       L_FNN   270
+# define       L_FN1R  271
+# define       L_FN2R  272
+# define       L_FN3R  273
+# define       L_FN4R  274
+# define       L_FNNR  275
+# define       L_LE    276
+# define       L_NE    277
+# define       L_GE    278
+
+#line 1 "parse.y"
+
+/*     Copyright (C) 1990, 1992, 1993 Free Software Foundation, Inc.
+
+This file is part of Oleo, the GNU Spreadsheet.
+
+Oleo is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+Oleo is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Oleo; see the file COPYING.  If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+#line 41 "parse.y"
+
+#include "funcdef.h"
+
+#include <ctype.h>
+
+#define obstack_chunk_alloc ck_malloc
+#define obstack_chunk_free free
+#include "obstack.h"
+#include "sysdef.h"
+
+#include "global.h"
+#include "errors.h"
+#include "node.h"
+#include "eval.h"
+#include "ref.h"
+
+int yylex ();
+#ifdef __STDC__
+void yyerror (char *);
+#else
+void yyerror ();
+#endif
+VOIDSTAR parse_hash;
+extern VOIDSTAR hash_find();
+
+/* This table contains a list of the infix single-char functions */
+unsigned char fnin[] = {
+       SUM, DIFF, DIV, PROD, MOD, /* AND, OR, */ POW, EQUAL, IF, CONCAT, 0
+};
+
+#define YYSTYPE _y_y_s_t_y_p_e
+typedef struct node *YYSTYPE;
+YYSTYPE parse_return;
+#ifdef __STDC__
+YYSTYPE make_list (YYSTYPE, YYSTYPE);
+#else
+YYSTYPE make_list ();
+#endif
+
+char *instr;
+int parse_error = 0;
+extern struct obstack tmp_mem;
+
+#ifndef YYSTYPE
+#define YYSTYPE int
+#endif
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+
+
+#define        YYFINAL         131
+#define        YYFLAG          -32768
+#define        YYNTBASE        41
+
+/* YYTRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */
+#define YYTRANSLATE(x) ((unsigned)(x) <= 278 ? yytranslate[x] : 47)
+
+/* YYTRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX. */
+static const char yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,    19,     2,     2,     2,    16,     5,     2,
+      38,    39,    14,    12,    40,    13,     2,    15,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     4,     2,
+       8,     6,    10,     3,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,    17,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     7,     9,    11,
+      18,    20,    21,    22,    23,    24,    25,    26,    27,    28,
+      29,    30,    31,    32,    33,    34,    35,    36,    37
+};
+
+#if YYDEBUG
+static const short yyprhs[] =
+{
+       0,     0,     2,     4,     6,     8,    12,    17,    24,    33,
+      44,    49,    54,    59,    66,    73,    82,    91,   100,   109,
+     114,   120,   124,   128,   132,   136,   140,   144,   148,   152,
+     156,   160,   164,   168,   172,   175,   178,   182,   186,   189,
+     191,   195,   197,   199,   201,   205,   207
+};
+static const short yyrhs[] =
+{
+      42,     0,     1,     0,    23,     0,    46,     0,    24,    38,
+      39,     0,    25,    38,    42,    39,     0,    26,    38,    42,
+      40,    42,    39,     0,    27,    38,    42,    40,    42,    40,
+      42,    39,     0,    28,    38,    42,    40,    42,    40,    42,
+      40,    42,    39,     0,    29,    38,    43,    39,     0,    30,
+      38,    21,    39,     0,    30,    38,    22,    39,     0,    31,
+      38,    21,    40,    42,    39,     0,    31,    38,    22,    40,
+      42,    39,     0,    31,    38,    21,    40,    42,    40,    42,
+      39,     0,    31,    38,    22,    40,    42,    40,    42,    39,
+       0,    32,    38,    21,    40,    42,    40,    42,    39,     0,
+      32,    38,    22,    40,    42,    40,    42,    39,     0,    34,
+      38,    45,    39,     0,    42,     3,    42,     4,    42,     0,
+      42,     5,    42,     0,    42,     8,    42,     0,    42,     9,
+      42,     0,    42,     6,    42,     0,    42,     7,    42,     0,
+      42,    10,    42,     0,    42,    11,    42,     0,    42,    12,
+      42,     0,    42,    13,    42,     0,    42,    14,    42,     0,
+      42,    15,    42,     0,    42,    16,    42,     0,    42,    17,
+      42,     0,    13,    42,     0,    19,    42,     0,    38,    42,
+      39,     0,    38,    42,     1,     0,    38,     1,     0,    42,
+       0,    43,    40,    42,     0,    21,     0,    42,     0,    44,
+       0,    45,    40,    44,     0,    20,     0,    22,     0
+};
+
+#endif
+
+#if YYDEBUG
+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
+static const short yyrline[] =
+{
+       0,    86,    88,    94,    95,    96,    98,   102,   106,   110,
+     114,   118,   121,   125,   129,   135,   142,   150,   154,   159,
+     163,   174,   178,   182,   186,   190,   194,   198,   202,   206,
+     210,   214,   218,   222,   226,   241,   245,   247,   255,   262,
+     264,   268,   269,   272,   274,   278,   280
+};
+#endif
+
+
+#if (YYDEBUG) || defined YYERROR_VERBOSE
+
+/* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */
+static const char *const yytname[] =
+{
+  "$", "error", "$undefined.", "'?'", "':'", "'&'", "'='", "NE", "'<'", 
+  "LE", "'>'", "GE", "'+'", "'-'", "'*'", "'/'", "'%'", "'^'", "NEG", 
+  "'!'", "L_CELL", "L_RANGE", "L_VAR", "L_CONST", "L_FN0", "L_FN1", 
+  "L_FN2", "L_FN3", "L_FN4", "L_FNN", "L_FN1R", "L_FN2R", "L_FN3R", 
+  "L_FN4R", "L_FNNR", "L_LE", "L_NE", "L_GE", "'('", "')'", "','", "line", 
+  "exp", "exp_list", "range_exp", "range_exp_list", "cell", NULL
+};
+#endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
+static const short yyr1[] =
+{
+       0,    41,    41,    42,    42,    42,    42,    42,    42,    42,
+      42,    42,    42,    42,    42,    42,    42,    42,    42,    42,
+      42,    42,    42,    42,    42,    42,    42,    42,    42,    42,
+      42,    42,    42,    42,    42,    42,    42,    42,    42,    43,
+      43,    44,    44,    45,    45,    46,    46
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
+static const short yyr2[] =
+{
+       0,     1,     1,     1,     1,     3,     4,     6,     8,    10,
+       4,     4,     4,     6,     6,     8,     8,     8,     8,     4,
+       5,     3,     3,     3,     3,     3,     3,     3,     3,     3,
+       3,     3,     3,     3,     2,     2,     3,     3,     2,     1,
+       3,     1,     1,     1,     3,     1,     1
+};
+
+/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE
+   doesn't specify something else to do.  Zero means the default is an
+   error. */
+static const short yydefact[] =
+{
+       0,     2,     0,     0,    45,    46,     3,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     1,     4,
+      34,    35,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    38,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     5,     0,
+       0,     0,     0,    39,     0,     0,     0,     0,     0,     0,
+       0,    41,    42,    43,     0,    37,    36,     0,    21,    24,
+      25,    22,    23,    26,    27,    28,    29,    30,    31,    32,
+      33,     6,     0,     0,     0,    10,     0,    11,    12,     0,
+       0,     0,     0,    19,     0,     0,     0,     0,     0,    40,
+       0,     0,     0,     0,    44,    20,     7,     0,     0,    13,
+       0,    14,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     8,     0,    15,    16,    17,    18,     0,     9,     0,
+       0,     0
+};
+
+static const short yydefgoto[] =
+{
+     129,    62,    54,    63,    64,    19
+};
+
+static const short yypact[] =
+{
+     104,-32768,   486,   486,-32768,-32768,-32768,   -37,   -22,   -16,
+      10,    12,    14,    29,    43,    47,    50,   124,   537,-32768,
+  -32768,-32768,    59,   486,   486,   486,   486,   486,     7,     9,
+      11,   464,-32768,    48,   486,   486,   486,   486,   486,   486,
+     486,   486,   486,   486,   486,   486,   486,   486,-32768,   332,
+     173,   209,   224,   537,    54,    60,    61,    64,    66,    69,
+      71,-32768,   537,-32768,    57,-32768,-32768,   522,    -2,   193,
+     193,   547,   547,   547,   547,     4,     4,    84,    84,    84,
+      84,-32768,   486,   486,   486,-32768,   486,-32768,-32768,   486,
+     486,   486,   486,-32768,   464,   486,   353,   245,   260,   537,
+      63,   158,   281,   296,-32768,   537,-32768,   486,   486,-32768,
+     486,-32768,   486,   486,   486,   369,   317,   388,   404,   423,
+     439,-32768,   486,-32768,-32768,-32768,-32768,   458,-32768,   115,
+     116,-32768
+};
+
+static const short yypgoto[] =
+{
+  -32768,     0,-32768,    24,-32768,-32768
+};
+
+
+#define        YYLAST          564
+
+
+static const short yytable[] =
+{
+      18,    22,    20,    21,    36,    37,    38,    39,    40,    41,
+      42,    43,    44,    45,    46,    47,    23,    33,    44,    45,
+      46,    47,    24,    49,    50,    51,    52,    53,    55,    56,
+      57,    58,    59,    60,    67,    68,    69,    70,    71,    72,
+      73,    74,    75,    76,    77,    78,    79,    80,    25,    65,
+      26,    34,    27,    35,    36,    37,    38,    39,    40,    41,
+      42,    43,    44,    45,    46,    47,    34,    28,    35,    36,
+      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+      47,    29,    96,    97,    98,    30,    99,    66,    31,   100,
+     101,   102,   103,    85,    86,   105,    93,    94,    48,    87,
+      88,    47,   109,   110,    89,     1,    90,   115,   116,    91,
+     117,    92,   118,   119,   120,   130,   131,     2,   104,     0,
+       0,     0,   127,     3,     4,    32,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,     2,    16,     0,
+       0,     0,    17,     3,     4,     0,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,     0,    16,     0,
+       0,    34,    17,    35,    36,    37,    38,    39,    40,    41,
+      42,    43,    44,    45,    46,    47,    34,     0,    35,    36,
+      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+      47,     0,     0,     0,     0,     0,     0,   111,   112,-32768,
+  -32768,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+      47,     0,    34,    82,    35,    36,    37,    38,    39,    40,
+      41,    42,    43,    44,    45,    46,    47,    34,     0,    35,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    47,     0,     0,     0,     0,     0,     0,    34,    83,
+      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    34,    84,    35,    36,    37,    38,    39,
+      40,    41,    42,    43,    44,    45,    46,    47,     0,     0,
+       0,     0,     0,     0,    34,   107,    35,    36,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    46,    47,    34,
+     108,    35,    36,    37,    38,    39,    40,    41,    42,    43,
+      44,    45,    46,    47,     0,     0,     0,     0,     0,     0,
+      34,   113,    35,    36,    37,    38,    39,    40,    41,    42,
+      43,    44,    45,    46,    47,    34,   114,    35,    36,    37,
+      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
+       0,     0,     0,     0,     0,     0,    34,   122,    35,    36,
+      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+      47,    81,    34,     0,    35,    36,    37,    38,    39,    40,
+      41,    42,    43,    44,    45,    46,    47,     0,     0,     0,
+       0,    34,   106,    35,    36,    37,    38,    39,    40,    41,
+      42,    43,    44,    45,    46,    47,     0,    34,   121,    35,
+      36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    47,     0,     0,     0,     0,    34,   123,    35,    36,
+      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
+      47,     0,    34,   124,    35,    36,    37,    38,    39,    40,
+      41,    42,    43,    44,    45,    46,    47,     0,     0,     0,
+       0,    34,   125,    35,    36,    37,    38,    39,    40,    41,
+      42,    43,    44,    45,    46,    47,     0,     2,   126,     0,
+       0,     0,     0,     3,     4,    61,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,   128,    16,     2,
+       0,     0,    17,     0,     0,     3,     4,     0,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,     0,
+      16,     0,     0,     0,    17,    34,    95,    35,    36,    37,
+      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
+      34,     0,    35,    36,    37,    38,    39,    40,    41,    42,
+      43,    44,    45,    46,    47,-32768,-32768,-32768,-32768,    42,
+      43,    44,    45,    46,    47
+};
+
+static const short yycheck[] =
+{
+       0,    38,     2,     3,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    38,    17,    14,    15,
+      16,    17,    38,    23,    24,    25,    26,    27,    21,    22,
+      21,    22,    21,    22,    34,    35,    36,    37,    38,    39,
+      40,    41,    42,    43,    44,    45,    46,    47,    38,     1,
+      38,     3,    38,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,     3,    38,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    38,    82,    83,    84,    38,    86,    39,    38,    89,
+      90,    91,    92,    39,    40,    95,    39,    40,    39,    39,
+      39,    17,    39,    40,    40,     1,    40,   107,   108,    40,
+     110,    40,   112,   113,   114,     0,     0,    13,    94,    -1,
+      -1,    -1,   122,    19,    20,     1,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    13,    34,    -1,
+      -1,    -1,    38,    19,    20,    -1,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    -1,    34,    -1,
+      -1,     3,    38,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,     3,    -1,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    -1,    -1,    -1,    -1,    -1,    -1,    39,    40,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    -1,     3,    40,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,     3,    -1,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    -1,    -1,    -1,    -1,    -1,    -1,     3,    40,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,     3,    40,     5,     6,     7,     8,     9,
+      10,    11,    12,    13,    14,    15,    16,    17,    -1,    -1,
+      -1,    -1,    -1,    -1,     3,    40,     5,     6,     7,     8,
+       9,    10,    11,    12,    13,    14,    15,    16,    17,     3,
+      40,     5,     6,     7,     8,     9,    10,    11,    12,    13,
+      14,    15,    16,    17,    -1,    -1,    -1,    -1,    -1,    -1,
+       3,    40,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,     3,    40,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+      -1,    -1,    -1,    -1,    -1,    -1,     3,    40,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    39,     3,    -1,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    -1,    -1,    -1,
+      -1,     3,    39,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    -1,     3,    39,     5,
+       6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+      16,    17,    -1,    -1,    -1,    -1,     3,    39,     5,     6,
+       7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+      17,    -1,     3,    39,     5,     6,     7,     8,     9,    10,
+      11,    12,    13,    14,    15,    16,    17,    -1,    -1,    -1,
+      -1,     3,    39,     5,     6,     7,     8,     9,    10,    11,
+      12,    13,    14,    15,    16,    17,    -1,    13,    39,    -1,
+      -1,    -1,    -1,    19,    20,    21,    22,    23,    24,    25,
+      26,    27,    28,    29,    30,    31,    32,    39,    34,    13,
+      -1,    -1,    38,    -1,    -1,    19,    20,    -1,    22,    23,
+      24,    25,    26,    27,    28,    29,    30,    31,    32,    -1,
+      34,    -1,    -1,    -1,    38,     3,     4,     5,     6,     7,
+       8,     9,    10,    11,    12,    13,    14,    15,    16,    17,
+       3,    -1,     5,     6,     7,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17,     8,     9,    10,    11,    12,
+      13,    14,    15,    16,    17
+};
+/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
+#line 3 "/usr/share/bison/bison.simple"
+
+/* Skeleton output parser for bison,
+   Copyright (C) 1984, 1989, 1990, 2000, 2001 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* This is the parser code that is written into each bison parser when
+   the %semantic_parser declaration is not specified in the grammar.
+   It was written by Richard Stallman by simplifying the hairy parser
+   used when %semantic_parser is specified.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+#ifdef __cplusplus
+# define YYSTD(x) std::x
+#else
+# define YYSTD(x) x
+#endif
+
+#if ! defined (yyoverflow) || defined (YYERROR_VERBOSE)
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# if YYSTACK_USE_ALLOCA
+#  define YYSTACK_ALLOC alloca
+#  define YYSIZE_T YYSTD (size_t)
+# else
+#  ifndef YYSTACK_USE_ALLOCA
+#   if defined (alloca) || defined (_ALLOCA_H)
+#    define YYSTACK_ALLOC alloca
+#    define YYSIZE_T YYSTD (size_t)
+#   else
+#    ifdef __GNUC__
+#     define YYSTACK_ALLOC __builtin_alloca
+#    endif
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's `empty if-body' warning. */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# else
+#  ifdef __cplusplus
+#   include <cstdlib> /* INFRINGES ON USER NAME SPACE */
+#   define YYSIZE_T std::size_t
+#  else
+#   ifdef __STDC__
+#    include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#    define YYSIZE_T size_t
+#   endif
+#  endif
+#  define YYSTACK_ALLOC YYSTD (malloc)
+#  define YYSTACK_FREE YYSTD (free)
+# endif
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  short yyss;
+  YYSTYPE yyvs;
+# if YYLSP_NEEDED
+  YYLTYPE yyls;
+# endif
+};
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# if YYLSP_NEEDED
+#  define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE))     \
+      + 2 * YYSTACK_GAP_MAX)
+# else
+#  define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (short) + sizeof (YYSTYPE))                                
\
+      + YYSTACK_GAP_MAX)
+# endif
+
+/* Relocate the TYPE STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Type, Stack)                                 \
+    do                                                                 \
+      {                                                                        
\
+       YYSIZE_T yynewbytes;                                            \
+       yymemcpy ((char *) yyptr, (char *) (Stack),                     \
+                 yysize * (YYSIZE_T) sizeof (Type));                   \
+       Stack = &yyptr->Stack;                                          \
+       yynewbytes = yystacksize * sizeof (Type) + YYSTACK_GAP_MAX;     \
+       yyptr += yynewbytes / sizeof (*yyptr);                          \
+      }                                                                        
\
+    while (0)
+
+#endif /* ! defined (yyoverflow) || defined (YYERROR_VERBOSE) */
+
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# ifdef __cplusplus
+#  include <cstddef> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T std::size_t
+# else
+#  ifdef __STDC__
+#   include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#   define YYSIZE_T size_t
+#  endif
+# endif
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
+
+#define yyerrok                (yyerrstatus = 0)
+#define yyclearin      (yychar = YYEMPTY)
+#define YYEMPTY                -2
+#define YYEOF          0
+#define YYACCEPT       goto yyacceptlab
+#define YYABORT        goto yyabortlab
+#define YYERROR                goto yyerrlab1
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+#define YYFAIL         goto yyerrlab
+#define YYRECOVERING()  (!!yyerrstatus)
+#define YYBACKUP(Token, Value)                                 \
+do                                                             \
+  if (yychar == YYEMPTY && yylen == 1)                         \
+    {                                                          \
+      yychar = (Token);                                                \
+      yylval = (Value);                                                \
+      yychar1 = YYTRANSLATE (yychar);                          \
+      YYPOPSTACK;                                              \
+      goto yybackup;                                           \
+    }                                                          \
+  else                                                         \
+    {                                                          \
+      yyerror ("syntax error: cannot back up");                        \
+      YYERROR;                                                 \
+    }                                                          \
+while (0)
+
+#define YYTERROR       1
+#define YYERRCODE      256
+
+
+/* YYLLOC_DEFAULT -- Compute the default location (before the actions
+   are run).
+
+   When YYLLOC_DEFAULT is run, CURRENT is set the location of the
+   first token.  By default, to implement support for ranges, extend
+   its range to the last symbol.  */
+
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)               \
+   Current.last_line   = Rhs[N].last_line;     \
+   Current.last_column = Rhs[N].last_column;
+#endif
+
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#if YYPURE
+# if YYLSP_NEEDED
+#  ifdef YYLEX_PARAM
+#   define YYLEX               yylex (&yylval, &yylloc, YYLEX_PARAM)
+#  else
+#   define YYLEX               yylex (&yylval, &yylloc)
+#  endif
+# else /* !YYLSP_NEEDED */
+#  ifdef YYLEX_PARAM
+#   define YYLEX               yylex (&yylval, YYLEX_PARAM)
+#  else
+#   define YYLEX               yylex (&yylval)
+#  endif
+# endif /* !YYLSP_NEEDED */
+#else /* !YYPURE */
+# define YYLEX                 yylex ()
+#endif /* !YYPURE */
+
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  ifdef __cplusplus
+#   include <cstdio>  /* INFRINGES ON USER NAME SPACE */
+#  else
+#   include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  endif
+#  define YYFPRINTF YYSTD (fprintf)
+# endif
+
+# define YYDPRINTF(Args)                       \
+do {                                           \
+  if (yydebug)                                 \
+    YYFPRINTF Args;                            \
+} while (0)
+/* Nonzero means print parse trace. [The following comment makes no
+   sense to me.  Could someone clarify it?  --akim] Since this is
+   uninitialized, it does not stop multiple parsers from coexisting.
+   */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+#endif /* !YYDEBUG */
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef        YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#if YYMAXDEPTH == 0
+# undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+#if ! defined (yyoverflow) && ! defined (yymemcpy)
+# if __GNUC__ > 1              /* GNU C and GNU C++ define this.  */
+#  define yymemcpy __builtin_memcpy
+# else                         /* not GNU C or C++ */
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+#  if defined (__STDC__) || defined (__cplusplus)
+yymemcpy (char *yyto, const char *yyfrom, YYSIZE_T yycount)
+#  else
+yymemcpy (yyto, yyfrom, yycount)
+     char *yyto;
+     const char *yyfrom;
+     YYSIZE_T yycount;
+#  endif
+{
+  register const char *yyf = yyfrom;
+  register char *yyt = yyto;
+  register YYSIZE_T yyi = yycount;
+
+  while (yyi-- != 0)
+    *yyt++ = *yyf++;
+}
+# endif
+#endif
+
+#ifdef YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined (__GLIBC__) && defined (_STRING_H)
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+static YYSIZE_T
+#   if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+#   else
+yystrlen (yystr)
+     const char *yystr;
+#   endif
+{
+  register const char *yys = yystr;
+
+  while (*yys++ != '\0')
+    continue;
+
+  return yys - yystr - 1;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+static char *
+#   if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+#   else
+yystpcpy (yydest, yysrc)
+     char *yydest;
+     const char *yysrc;
+#   endif
+{
+  register char *yyd = yydest;
+  register const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+#endif
+
+#line 341 "/usr/share/bison/bison.simple"
+
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+   into yyparse.  The argument should have type void *.
+   It should actually point to an object.
+   Grammar actions can access the variable by casting it
+   to the proper pointer type.  */
+
+#ifdef YYPARSE_PARAM
+# ifdef __cplusplus
+#  define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#  define YYPARSE_PARAM_DECL
+# else /* !__cplusplus */
+#  define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#  define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+# endif /* !__cplusplus */
+#else /* !YYPARSE_PARAM */
+# define YYPARSE_PARAM_ARG
+# define YYPARSE_PARAM_DECL
+#endif /* !YYPARSE_PARAM */
+
+/* Prevent warning if -Wstrict-prototypes.  */
+#ifdef __GNUC__
+# ifdef YYPARSE_PARAM
+int yyparse (void *);
+# else
+int yyparse (void);
+# endif
+#endif
+
+/* YY_DECL_VARIABLES -- depending whether we use a pure parser,
+   variables are global, or local to YYPARSE.  */
+
+#define YY_DECL_NON_LSP_VARIABLES                      \
+/* The lookahead symbol.  */                           \
+int yychar;                                            \
+                                                       \
+/* The semantic value of the lookahead symbol. */      \
+YYSTYPE yylval;                                                \
+                                                       \
+/* Number of parse errors so far.  */                  \
+int yynerrs;
+
+#if YYLSP_NEEDED
+# define YY_DECL_VARIABLES                     \
+YY_DECL_NON_LSP_VARIABLES                      \
+                                               \
+/* Location data for the lookahead symbol.  */ \
+YYLTYPE yylloc;
+#else
+# define YY_DECL_VARIABLES                     \
+YY_DECL_NON_LSP_VARIABLES
+#endif
+
+
+/* If nonreentrant, generate the variables here. */
+
+#if !YYPURE
+YY_DECL_VARIABLES
+#endif  /* !YYPURE */
+
+int
+yyparse (YYPARSE_PARAM_ARG)
+     YYPARSE_PARAM_DECL
+{
+  /* If reentrant, generate the variables here. */
+#if YYPURE
+  YY_DECL_VARIABLES
+#endif  /* !YYPURE */
+
+  register int yystate;
+  register int yyn;
+  int yyresult;
+  /* Number of tokens to shift before error messages enabled.  */
+  int yyerrstatus;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yychar1 = 0;
+
+  /* Three stacks and their tools:
+     `yyss': related to states,
+     `yyvs': related to semantic values,
+     `yyls': related to locations.
+
+     Refer to the stacks thru separate pointers, to allow yyoverflow
+     to reallocate them elsewhere.  */
+
+  /* The state stack. */
+  short        yyssa[YYINITDEPTH];
+  short *yyss = yyssa;
+  register short *yyssp;
+
+  /* The semantic value stack.  */
+  YYSTYPE yyvsa[YYINITDEPTH];
+  YYSTYPE *yyvs = yyvsa;
+  register YYSTYPE *yyvsp;
+
+#if YYLSP_NEEDED
+  /* The location stack.  */
+  YYLTYPE yylsa[YYINITDEPTH];
+  YYLTYPE *yyls = yylsa;
+  YYLTYPE *yylsp;
+#endif
+
+#if YYLSP_NEEDED
+# define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
+#else
+# define YYPOPSTACK   (yyvsp--, yyssp--)
+#endif
+
+  YYSIZE_T yystacksize = YYINITDEPTH;
+
+
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+#if YYLSP_NEEDED
+  YYLTYPE yyloc;
+#endif
+
+  /* When reducing, the number of symbols on the RHS of the reduced
+     rule. */
+  int yylen;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;            /* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss;
+  yyvsp = yyvs;
+#if YYLSP_NEEDED
+  yylsp = yyls;
+#endif
+  goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed. so pushing a state here evens the stacks.
+     */
+  yyssp++;
+
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyssp >= yyss + yystacksize - 1)
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+       /* Give user a chance to reallocate the stack. Use copies of
+          these so that the &'s don't force the real ones into
+          memory.  */
+       YYSTYPE *yyvs1 = yyvs;
+       short *yyss1 = yyss;
+
+       /* Each stack pointer address is followed by the size of the
+          data in use in that stack, in bytes.  */
+# if YYLSP_NEEDED
+       YYLTYPE *yyls1 = yyls;
+       /* This used to be a conditional around just the two extra args,
+          but that might be undefined if yyoverflow is a macro.  */
+       yyoverflow ("parser stack overflow",
+                   &yyss1, yysize * sizeof (*yyssp),
+                   &yyvs1, yysize * sizeof (*yyvsp),
+                   &yyls1, yysize * sizeof (*yylsp),
+                   &yystacksize);
+       yyls = yyls1;
+# else
+       yyoverflow ("parser stack overflow",
+                   &yyss1, yysize * sizeof (*yyssp),
+                   &yyvs1, yysize * sizeof (*yyvsp),
+                   &yystacksize);
+# endif
+       yyss = yyss1;
+       yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+      /* Extend the stack our own way.  */
+      if (yystacksize >= YYMAXDEPTH)
+       goto yyoverflowlab;
+      yystacksize *= 2;
+      if (yystacksize > YYMAXDEPTH)
+       yystacksize = YYMAXDEPTH;
+
+      {
+       short *yyss1 = yyss;
+       union yyalloc *yyptr =
+         (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+       if (! yyptr)
+         goto yyoverflowlab;
+       YYSTACK_RELOCATE (short, yyss);
+       YYSTACK_RELOCATE (YYSTYPE, yyvs);
+# if YYLSP_NEEDED
+       YYSTACK_RELOCATE (YYLTYPE, yyls);
+# endif
+# undef YYSTACK_RELOCATE
+       if (yyss1 != yyssa)
+         YYSTACK_FREE (yyss1);
+      }
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+#if YYLSP_NEEDED
+      yylsp = yyls + yysize - 1;
+#endif
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+                 (unsigned long int) yystacksize));
+
+      if (yyssp >= yyss + yystacksize - 1)
+       YYABORT;
+    }
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  goto yybackup;
+
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
+    }
+
+  /* Convert token to internal form (in yychar1) for indexing tables with */
+
+  if (yychar <= 0)             /* This means end of input. */
+    {
+      yychar1 = 0;
+      yychar = YYEOF;          /* Don't call YYLEX any more */
+
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yychar1 = YYTRANSLATE (yychar);
+
+#if YYDEBUG
+     /* We have to keep this `#if YYDEBUG', since we use variables
+       which are defined only if `YYDEBUG' is set.  */
+      if (yydebug)
+       {
+         YYFPRINTF (stderr, "Next token is %d (%s",
+                    yychar, yytname[yychar1]);
+         /* Give the individual parser a way to print the precise
+            meaning of a token, for further debugging info.  */
+# ifdef YYPRINT
+         YYPRINT (stderr, yychar, yylval);
+# endif
+         YYFPRINTF (stderr, ")\n");
+       }
+#endif
+    }
+
+  yyn += yychar1;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+    goto yydefault;
+
+  yyn = yytable[yyn];
+
+  /* yyn is what to do for this token type in this state.
+     Negative => reduce, -yyn is rule number.
+     Positive => shift, yyn is new state.
+       New state is final state => don't bother to shift,
+       just return success.
+     0, or most negative number => error.  */
+
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+       goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrlab;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+  YYDPRINTF ((stderr, "Shifting token %d (%s), ",
+             yychar, yytname[yychar1]));
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+#if YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to the semantic value of
+     the lookahead token.  This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+#if YYLSP_NEEDED
+  /* Similarly for the default location.  Let the user run additional
+     commands if for instance locations are ranges.  */
+  yyloc = yylsp[1-yylen];
+  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
+#endif
+
+#if YYDEBUG
+  /* We have to keep this `#if YYDEBUG', since we use variables which
+     are defined only if `YYDEBUG' is set.  */
+  if (yydebug)
+    {
+      int yyi;
+
+      YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
+                yyn, yyrline[yyn]);
+
+      /* Print the symbols being reduced, and their result.  */
+      for (yyi = yyprhs[yyn]; yyrhs[yyi] > 0; yyi++)
+       YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
+      YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+    }
+#endif
+
+  switch (yyn) {
+
+case 1:
+#line 87 "parse.y"
+{ parse_return=yyvsp[0]; }
+    break;
+case 2:
+#line 88 "parse.y"
+{
+               if(!parse_error)
+                       parse_error=PARSE_ERR;
+               parse_return=0; }
+    break;
+case 5:
+#line 96 "parse.y"
+{
+               yyval=yyvsp[-2]; }
+    break;
+case 6:
+#line 98 "parse.y"
+{
+               (yyvsp[-3])->n_x.v_subs[0]=yyvsp[-1];
+               (yyvsp[-3])->n_x.v_subs[1]=(struct node *)0;
+               yyval=yyvsp[-3]; }
+    break;
+case 7:
+#line 102 "parse.y"
+{
+               (yyvsp[-5])->n_x.v_subs[0]=yyvsp[-3];
+               (yyvsp[-5])->n_x.v_subs[1]=yyvsp[-1];
+               yyval=yyvsp[-5]; }
+    break;
+case 8:
+#line 106 "parse.y"
+{
+               (yyvsp[-7])->n_x.v_subs[0]=make_list(yyvsp[-5],yyvsp[-3]);
+               (yyvsp[-7])->n_x.v_subs[1]=yyvsp[-1];
+               yyval=yyvsp[-7];}
+    break;
+case 9:
+#line 110 "parse.y"
+{
+               (yyvsp[-9])->n_x.v_subs[0]=make_list(yyvsp[-7],yyvsp[-5]);
+               (yyvsp[-9])->n_x.v_subs[1]=make_list(yyvsp[-3],yyvsp[-1]);
+               yyval=yyvsp[-9];}
+    break;
+case 10:
+#line 114 "parse.y"
+{
+               (yyvsp[-3])->n_x.v_subs[0]=(struct node *)0;
+               (yyvsp[-3])->n_x.v_subs[1]=yyvsp[-1];
+               yyval=yyvsp[-3]; }
+    break;
+case 11:
+#line 118 "parse.y"
+{
+               yyvsp[-3]->n_x.v_subs[0]=yyvsp[-1];
+               yyval=yyvsp[-3]; }
+    break;
+case 12:
+#line 121 "parse.y"
+{
+               yyvsp[-3]->n_x.v_subs[0]=yyvsp[-1];
+               yyval=yyvsp[-3]; }
+    break;
+case 13:
+#line 125 "parse.y"
+{
+               yyvsp[-5]->n_x.v_subs[0]=yyvsp[-3];
+               yyvsp[-5]->n_x.v_subs[1]=yyvsp[-1];
+               yyval=yyvsp[-5]; }
+    break;
+case 14:
+#line 129 "parse.y"
+{
+               yyvsp[-5]->n_x.v_subs[0]=yyvsp[-3];
+               yyvsp[-5]->n_x.v_subs[1]=yyvsp[-1];
+               yyval=yyvsp[-5]; }
+    break;
+case 15:
+#line 135 "parse.y"
+{
+               if(yyvsp[-7]->comp_value!=F_INDEX)
+                       parse_error=PARSE_ERR;
+               yyvsp[-7]->comp_value=F_INDEX2;
+               yyvsp[-7]->n_x.v_subs[0]=make_list(yyvsp[-5],yyvsp[-3]);
+               yyvsp[-7]->n_x.v_subs[1]=yyvsp[-1];
+               yyval=yyvsp[-7]; }
+    break;
+case 16:
+#line 142 "parse.y"
+{
+               if(yyvsp[-7]->comp_value!=F_INDEX)
+                       parse_error=PARSE_ERR;
+               yyvsp[-7]->comp_value=F_INDEX2;
+               yyvsp[-7]->n_x.v_subs[0]=make_list(yyvsp[-5],yyvsp[-3]);
+               yyvsp[-7]->n_x.v_subs[1]=yyvsp[-1];
+               yyval=yyvsp[-7]; }
+    break;
+case 17:
+#line 150 "parse.y"
+{
+               (yyvsp[-7])->n_x.v_subs[0]=make_list(yyvsp[-5],yyvsp[-3]);
+               (yyvsp[-7])->n_x.v_subs[1]=yyvsp[-1];
+               yyval=yyvsp[-7];}
+    break;
+case 18:
+#line 154 "parse.y"
+{
+               (yyvsp[-7])->n_x.v_subs[0]=make_list(yyvsp[-5],yyvsp[-3]);
+               (yyvsp[-7])->n_x.v_subs[1]=yyvsp[-1];
+               yyval=yyvsp[-7];}
+    break;
+case 19:
+#line 159 "parse.y"
+{
+               (yyvsp[-3])->n_x.v_subs[0]=(struct node *)0;
+               (yyvsp[-3])->n_x.v_subs[1]=yyvsp[-1];
+               yyval=yyvsp[-3]; }
+    break;
+case 20:
+#line 163 "parse.y"
+{
+               yyvsp[-3]->comp_value=IF;
+               yyvsp[-3]->n_x.v_subs[0]=yyvsp[-1];
+               yyvsp[-3]->n_x.v_subs[1]=yyvsp[0];
+               yyvsp[-1]->n_x.v_subs[0]=yyvsp[-4];
+               yyvsp[-1]->n_x.v_subs[1]=yyvsp[-2];
+               yyval=yyvsp[-3]; }
+    break;
+case 21:
+#line 174 "parse.y"
+{
+               yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+               yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+               yyval = yyvsp[-1]; }
+    break;
+case 22:
+#line 178 "parse.y"
+{
+               yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+               yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+               yyval = yyvsp[-1]; }
+    break;
+case 23:
+#line 182 "parse.y"
+{
+               yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+               yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+               yyval = yyvsp[-1]; }
+    break;
+case 24:
+#line 186 "parse.y"
+{
+               yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+               yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+               yyval = yyvsp[-1]; }
+    break;
+case 25:
+#line 190 "parse.y"
+{
+               yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+               yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+               yyval = yyvsp[-1]; }
+    break;
+case 26:
+#line 194 "parse.y"
+{
+               yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+               yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+               yyval = yyvsp[-1]; }
+    break;
+case 27:
+#line 198 "parse.y"
+{
+               yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+               yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+               yyval = yyvsp[-1]; }
+    break;
+case 28:
+#line 202 "parse.y"
+{
+               yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+               yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+               yyval = yyvsp[-1]; }
+    break;
+case 29:
+#line 206 "parse.y"
+{
+               yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+               yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+               yyval = yyvsp[-1]; }
+    break;
+case 30:
+#line 210 "parse.y"
+{
+               yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+               yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+               yyval = yyvsp[-1]; }
+    break;
+case 31:
+#line 214 "parse.y"
+{
+               yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+               yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+               yyval = yyvsp[-1]; }
+    break;
+case 32:
+#line 218 "parse.y"
+{
+               yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+               yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+               yyval = yyvsp[-1]; }
+    break;
+case 33:
+#line 222 "parse.y"
+{
+               yyvsp[-1]->n_x.v_subs[0]=yyvsp[-2];
+               yyvsp[-1]->n_x.v_subs[1]=yyvsp[0];
+               yyval = yyvsp[-1]; }
+    break;
+case 34:
+#line 226 "parse.y"
+{
+               if(yyvsp[0]->comp_value==CONST_FLT) {
+                       yyvsp[0]->n_x.v_float= -(yyvsp[0]->n_x.v_float);
+                       /* free($1); */
+                       yyval=yyvsp[0];
+               } else if(yyvsp[0]->comp_value==CONST_INT) {
+                       yyvsp[0]->n_x.v_int= -(yyvsp[0]->n_x.v_int);
+                       /* free($1); */
+                       yyval=yyvsp[0];
+               } else {
+                       yyvsp[-1]->comp_value = NEGATE;
+                       yyvsp[-1]->n_x.v_subs[0]=yyvsp[0];
+                       yyvsp[-1]->n_x.v_subs[1]=(struct node *)0;
+                       yyval = yyvsp[-1];
+               } }
+    break;
+case 35:
+#line 241 "parse.y"
+{
+               yyvsp[-1]->n_x.v_subs[0]=yyvsp[0];
+               yyvsp[-1]->n_x.v_subs[1]=(struct node *)0;
+               yyval = yyvsp[-1]; }
+    break;
+case 36:
+#line 246 "parse.y"
+{ yyval = yyvsp[-1]; }
+    break;
+case 37:
+#line 247 "parse.y"
+{
+               if(!parse_error)
+                       parse_error=NO_CLOSE;
+               }
+    break;
+case 38:
+#line 255 "parse.y"
+{
+               if(!parse_error)
+                       parse_error=NO_CLOSE;
+               }
+    break;
+case 39:
+#line 263 "parse.y"
+{ yyval = make_list(yyvsp[0], 0); }
+    break;
+case 40:
+#line 265 "parse.y"
+{ yyval = make_list(yyvsp[0], yyvsp[-2]); }
+    break;
+case 43:
+#line 273 "parse.y"
+{ yyval=make_list(yyvsp[0], 0); }
+    break;
+case 44:
+#line 275 "parse.y"
+{ yyval=make_list(yyvsp[0],yyvsp[-2]); }
+    break;
+case 45:
+#line 279 "parse.y"
+{ yyval=yyvsp[0]; }
+    break;
+}
+
+#line 727 "/usr/share/bison/bison.simple"
+
+
+  yyvsp -= yylen;
+  yyssp -= yylen;
+#if YYLSP_NEEDED
+  yylsp -= yylen;
+#endif
+
+#if YYDEBUG
+  if (yydebug)
+    {
+      short *yyssp1 = yyss - 1;
+      YYFPRINTF (stderr, "state stack now");
+      while (yyssp1 != yyssp)
+       YYFPRINTF (stderr, " %d", *++yyssp1);
+      YYFPRINTF (stderr, "\n");
+    }
+#endif
+
+  *++yyvsp = yyval;
+#if YYLSP_NEEDED
+  *++yylsp = yyloc;
+#endif
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTBASE];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (yyn > YYFLAG && yyn < YYLAST)
+       {
+         YYSIZE_T yysize = 0;
+         char *yymsg;
+         int yyx, yycount;
+
+         yycount = 0;
+         /* Start YYX at -YYN if negative to avoid negative indexes in
+            YYCHECK.  */
+         for (yyx = yyn < 0 ? -yyn : 0;
+              yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
+           if (yycheck[yyx + yyn] == yyx)
+             yysize += yystrlen (yytname[yyx]) + 15, yycount++;
+         yysize += yystrlen ("parse error, unexpected ") + 1;
+         yysize += yystrlen (yytname[YYTRANSLATE (yychar)]);
+         yymsg = (char *) YYSTACK_ALLOC (yysize);
+         if (yymsg != 0)
+           {
+             char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
+             yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]);
+
+             if (yycount < 5)
+               {
+                 yycount = 0;
+                 for (yyx = yyn < 0 ? -yyn : 0;
+                      yyx < (int) (sizeof (yytname) / sizeof (char *));
+                      yyx++)
+                   if (yycheck[yyx + yyn] == yyx)
+                     {
+                       const char *yyq = ! yycount ? ", expecting " : " or ";
+                       yyp = yystpcpy (yyp, yyq);
+                       yyp = yystpcpy (yyp, yytname[yyx]);
+                       yycount++;
+                     }
+               }
+             yyerror (yymsg);
+             YYSTACK_FREE (yymsg);
+           }
+         else
+           yyerror ("parse error; also virtual memory exhausted");
+       }
+      else
+#endif /* defined (YYERROR_VERBOSE) */
+       yyerror ("parse error");
+    }
+  goto yyerrlab1;
+
+
+/*--------------------------------------------------.
+| yyerrlab1 -- error raised explicitly by an action |
+`--------------------------------------------------*/
+yyerrlab1:
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse lookahead token after an
+        error, discard it.  */
+
+      /* return failure if at end of input */
+      if (yychar == YYEOF)
+       YYABORT;
+      YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
+                 yychar, yytname[yychar1]));
+      yychar = YYEMPTY;
+    }
+
+  /* Else will try to reuse lookahead token after shifting the error
+     token.  */
+
+  yyerrstatus = 3;             /* Each real token shifted decrements this */
+
+  goto yyerrhandle;
+
+
+/*-------------------------------------------------------------------.
+| yyerrdefault -- current state does not do anything special for the |
+| error token.                                                       |
+`-------------------------------------------------------------------*/
+yyerrdefault:
+#if 0
+  /* This is wrong; only states that explicitly want error tokens
+     should shift them.  */
+
+  /* If its default is to accept any token, ok.  Otherwise pop it.  */
+  yyn = yydefact[yystate];
+  if (yyn)
+    goto yydefault;
+#endif
+
+
+/*---------------------------------------------------------------.
+| yyerrpop -- pop the current state because it cannot handle the |
+| error token                                                    |
+`---------------------------------------------------------------*/
+yyerrpop:
+  if (yyssp == yyss)
+    YYABORT;
+  yyvsp--;
+  yystate = *--yyssp;
+#if YYLSP_NEEDED
+  yylsp--;
+#endif
+
+#if YYDEBUG
+  if (yydebug)
+    {
+      short *yyssp1 = yyss - 1;
+      YYFPRINTF (stderr, "Error: state stack now");
+      while (yyssp1 != yyssp)
+       YYFPRINTF (stderr, " %d", *++yyssp1);
+      YYFPRINTF (stderr, "\n");
+    }
+#endif
+
+/*--------------.
+| yyerrhandle.  |
+`--------------*/
+yyerrhandle:
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yyerrdefault;
+
+  yyn += YYTERROR;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+    goto yyerrdefault;
+
+  yyn = yytable[yyn];
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+       goto yyerrpop;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrpop;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  YYDPRINTF ((stderr, "Shifting error token, "));
+
+  *++yyvsp = yylval;
+#if YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+/*---------------------------------------------.
+| yyoverflowab -- parser overflow comes here.  |
+`---------------------------------------------*/
+yyoverflowlab:
+  yyerror ("parser stack overflow");
+  yyresult = 2;
+  /* Fall through.  */
+
+yyreturn:
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+  return yyresult;
+}
+#line 282 "parse.y"
+
+
+void
+yyerror FUN1(char *, s)
+{
+       if(!parse_error)
+               parse_error=PARSE_ERR;
+}
+
+YYSTYPE
+make_list FUN2(YYSTYPE, car, YYSTYPE, cdr)
+{
+       YYSTYPE ret;
+
+       ret=(YYSTYPE)obstack_alloc(&tmp_mem,sizeof(*ret));
+       ret->comp_value = 0;
+       ret->n_x.v_subs[0]=car;
+       ret->n_x.v_subs[1]=cdr;
+       return ret;
+}
+
+#define ERROR -1
+
+extern struct node *yylval;
+
+#ifdef __STDC__
+unsigned char parse_cell_or_range (char **,struct rng *);
+#else
+unsigned char parse_cell_or_range ();
+#endif
+
+int
+yylex FUN0()
+{
+       int ch;
+       struct node *new;
+       int isflt;
+       char *begin;
+       char *tmp_str;
+       unsigned char byte_value;
+       int n;
+
+       /* unsigned char *ptr; */
+       int nn;
+       struct function *fp;
+       int tmp_ch;
+
+#ifdef TEST
+       if(!instr)
+               return ERROR;
+#endif
+       while(isspace(*instr))
+               instr++;
+       ch = *instr++;
+       if(ch=='(' || ch==',' || ch==')')
+               return ch;
+
+       new=(struct node *)obstack_alloc(&tmp_mem,sizeof(struct node));
+       new->add_byte=0;
+       new->sub_value=0;
+       switch(ch) {
+       case 0:
+               return 0;
+
+       case '0': case '1': case '2': case '3': case '4': case '5': case '6':
+       case '7': case '8': case '9': case '.':
+               isflt = (ch=='.');
+
+               begin=instr-1;
+               tmp_str=instr;
+
+               while(isdigit(*tmp_str) || (!isflt && *tmp_str=='.' && ++isflt))
+                       tmp_str++;
+               if(*tmp_str=='e' || *tmp_str=='E') {
+                       isflt=1;
+                       tmp_str++;
+                       if(*tmp_str=='-' || *tmp_str=='+')
+                               tmp_str++;
+                       while(isdigit(*tmp_str))
+                               tmp_str++;
+               }
+               if(isflt) {
+                       new->n_x.v_float=astof((char **)(&begin));
+                       byte_value=CONST_FLT;
+               } else {
+                       new->n_x.v_int=astol((char **)(&begin));
+                       if(begin!=tmp_str) {
+                               begin=instr-1;
+                               new->n_x.v_float=astof((char **)(&begin));
+                               byte_value=CONST_FLT;
+                       } else
+                               byte_value=CONST_INT;
+               }
+               ch=L_CONST;
+               instr=begin;
+               break;
+
+       case '"':
+               begin=instr;
+               while(*instr && *instr!='"') {
+                       if(*instr=='\\' && instr[1])
+                               instr++;
+                       instr++;
+               }
+               if(!*instr) {
+                       parse_error=NO_QUOTE;
+                       return ERROR;
+               }
+               tmp_str=new->n_x.v_string=(char *)ck_malloc(1+instr-begin);
+               while(begin!=instr) {
+                       unsigned char n;
+
+                       if(*begin=='\\') {
+                               begin++;
+                               if(begin[0]>='0' && begin[0]<='7') {
+                                       if(begin[1]>='0' && begin[1]<='7') {
+                                               if(begin[2]>='0' && 
begin[2]<='7') {
+                                                       n=(begin[2]-'0') + (010 
* (begin[1]-'0')) + ( 0100 * (begin[0]-'0'));
+                                                       begin+=3;
+                                               } else {
+                                                       n=(begin[1]-'0') + (010 
* (begin[0]-'0'));
+                                                       begin+=2;
+                                               }
+                                       } else {
+                                               n=begin[0]-'0';
+                                               begin++;
+                                       }
+                               } else
+                                       n= *begin++;
+                               *tmp_str++= n;
+                       } else
+                               *tmp_str++= *begin++;
+               }
+               *tmp_str='\0';
+               instr++;
+               byte_value=CONST_STR;
+               ch=L_CONST;
+               break;
+
+       case '+':       case '-':
+
+       case '*':       case '/':       case '%':       case '&':
+       /* case '|': */ case '^':       case '=':
+
+       case '?':
+       {
+               unsigned char *ptr;
+
+               for(ptr= fnin;*ptr;ptr++)
+                       if(the_funs[*ptr].fn_str[0]==ch)
+                               break;
+#ifdef TEST
+               if(!*ptr)
+                       panic("Can't find fnin[] entry for '%c'",ch);
+#endif
+               byte_value= *ptr;
+       }
+               break;
+
+       case ':':
+               byte_value=IF;
+               break;
+
+       case '!':
+       case '<':
+       case '>':
+               if(*instr!='=') {
+                       byte_value = (ch=='<') ? LESS : (ch=='>') ? GREATER : 
NOT;
+                       break;
+               }
+               instr++;
+               byte_value = (ch=='<') ? LESSEQ : (ch=='>') ? GREATEQ : 
NOTEQUAL;
+               ch = (ch=='<') ? LE : (ch=='>') ? GE : NE;
+               break;
+
+       case '\'':
+       case ';':
+       case '[':
+       case '\\':
+       case ']':
+       case '`':
+       case '{':
+       case '}':
+       case '~':
+       bad_chr:
+               parse_error=BAD_CHAR;
+               return ERROR;
+
+       case '#':
+               begin=instr-1;
+               while(*instr && (isalnum(*instr) || *instr=='_'))
+                       instr++;
+               ch= *instr;
+               *instr=0;
+               if(!stricmp(begin,tname))
+                       byte_value=F_TRUE;
+               else if(!stricmp(begin,fname))
+                       byte_value=F_FALSE;
+               else if(!stricmp(begin,iname) && (begin[4]==0 || 
!stricmp(begin+4,"inity")))
+                       byte_value=CONST_INF;
+               else if(!stricmp(begin,mname) ||
+                       !stricmp(begin,"#ninf"))
+                       byte_value=CONST_NINF;
+               else if(!stricmp(begin,nname) ||
+                       !stricmp(begin,"#nan"))
+                       byte_value=CONST_NAN;
+               else {
+                       for(n=1;n<=ERR_MAX;n++)
+                               if(!stricmp(begin,ename[n]))
+                                       break;
+                       if(n>ERR_MAX)
+                               n=BAD_CHAR;
+                       new->n_x.v_int=n;
+                       byte_value=CONST_ERR;
+               }
+               *instr=ch;
+               ch=L_CONST;
+               break;
+
+       default:
+               if(!a0 && (ch=='@' || ch=='$'))
+                  goto bad_chr;
+
+               if(a0 && ch=='@') {
+                       begin=instr;
+                       while(*instr && (isalpha(*instr) || isdigit(*instr) || 
*instr=='_'))
+                               instr++;
+                       n=instr-begin;
+               } else {
+                       begin=instr-1;
+                       
byte_value=parse_cell_or_range(&begin,&(new->n_x.v_rng));
+                       if(byte_value) {
+                               if((byte_value& ~0x3)==R_CELL)
+                                       ch=L_CELL;
+                               else
+                                       ch=L_RANGE;
+                               instr=begin;
+                               break;
+                       }
+
+                       while(*instr && (isalpha(*instr) || isdigit(*instr) || 
*instr=='_'))
+                               instr++;
+
+                       n=instr-begin;
+                       while(isspace(*instr))
+                               instr++;
+
+                       if(*instr!='(') {
+                               ch=L_VAR;
+                               byte_value=VAR;
+                               new->n_x.v_var=find_or_make_var(begin,n);
+                               break;
+                       }
+               }
+               tmp_ch=begin[n];
+               begin[n]='\0';
+               fp=hash_find(parse_hash,begin);
+               begin[n]=tmp_ch;
+               byte_value= ERROR;
+               if(!fp) {
+                       parse_error=BAD_FUNC;
+                       return ERROR;
+               }
+
+               if(fp>=the_funs && fp<=&the_funs[USR1])
+                       byte_value=fp-the_funs;
+               else {
+                       for(nn=0;nn<n_usr_funs;nn++) {
+                               if(fp>=&usr_funs[nn][0] && 
fp<=&usr_funs[nn][usr_n_funs[nn]]) {
+                                       byte_value=USR1+nn;
+                                       new->sub_value=fp-&usr_funs[nn][0];
+                                       break;
+                               }
+                       }
+#ifdef TEST
+                       if(nn==n_usr_funs) {
+                               io_error_msg("Couln't turn fp into a ##");
+                               parse_error=BAD_FUNC;
+                               return ERROR;
+                       }
+#endif
+               }
+
+               if(fp->fn_argn&X_J)
+                       ch= byte_value==F_IF ? L_FN3 : L_FN2;
+               else if(fp->fn_argt[0]=='R' || fp->fn_argt[0]=='E')
+                       ch=L_FN1R-1+fp->fn_argn-X_A0;
+               else
+                       ch=L_FN0 + fp->fn_argn-X_A0;
+
+               break;
+       }
+       /* new->node_type=ch; */
+       new->comp_value=byte_value;
+       yylval=new;
+       return ch;
+}
+
+/* Return value is
+       0 if it doesn't look like a cell or a range,
+       R_CELL if it is a cell (ptr now points past the characters, lr and lc 
hold the row and col of the cell)
+       RANGE if it is a range (ptr points past the chars)
+ */
+unsigned char
+parse_cell_or_range FUN2(char **,ptr, struct rng *,retp)
+{
+       if(a0) {
+               unsigned tmpc,tmpr;
+               char *p;
+               int abz = ROWREL|COLREL;
+
+               p= *ptr;
+               tmpc=0;
+               if(*p=='$') {
+                       abz-=COLREL;
+                       p++;
+               }
+               if(!isalpha(*p))
+                       return 0;
+               tmpc=str_to_col(&p);
+               if(tmpc<MIN_COL || tmpc>MAX_COL)
+                       return 0;
+               if(*p=='$') {
+                       abz-=ROWREL;
+                       p++;
+               }
+               if(!isdigit(*p))
+                       return 0;
+               for(tmpr=0;isdigit(*p);p++)
+                       tmpr=tmpr*10 + *p - '0';
+
+               if(tmpr<MIN_ROW || tmpr>MAX_ROW)
+                       return 0;
+
+               if(*p==':' || *p=='.') {
+                       unsigned tmpc1,tmpr1;
+
+                       abz = ((abz&COLREL) ? LCREL : 0)|((abz&ROWREL) ? LRREL 
: 0)|HRREL|HCREL;
+                       p++;
+                       if(*p=='$') {
+                               abz-=HCREL;
+                               p++;
+                       }
+                       if(!isalpha(*p))
+                               return 0;
+                       tmpc1=str_to_col(&p);
+                       if(tmpc1<MIN_COL || tmpc1>MAX_COL)
+                               return 0;
+                       if(*p=='$') {
+                               abz-=HRREL;
+                               p++;
+                       }
+                       if(!isdigit(*p))
+                               return 0;
+                       for(tmpr1=0;isdigit(*p);p++)
+                               tmpr1=tmpr1*10 + *p - '0';
+                       if(tmpr1<MIN_ROW || tmpr1>MAX_ROW)
+                               return 0;
+
+                       if(tmpr<tmpr1) {
+                               retp->lr=tmpr;
+                               retp->hr=tmpr1;
+                       } else {
+                               retp->lr=tmpr1;
+                               retp->hr=tmpr;
+                       }
+                       if(tmpc<tmpc1) {
+                               retp->lc=tmpc;
+                               retp->hc=tmpc1;
+                       } else {
+                               retp->lc=tmpc1;
+                               retp->hc=tmpc;
+                       }
+                       *ptr= p;
+                       return RANGE | abz;
+               }
+               retp->lr = retp->hr = tmpr;
+               retp->lc = retp->hc = tmpc;
+               *ptr=p;
+               return R_CELL | abz;
+       } else {
+               char *p;
+               unsigned char retr;
+               unsigned char retc;
+               int ended;
+               long num;
+               CELLREF tmp;
+
+#define CK_ABS_R(x)    if((x)<MIN_ROW || (x)>MAX_ROW)  \
+                               return 0;               \
+                       else
+
+#define CK_REL_R(x)    if(   ((x)>0 && MAX_ROW-(x)<cur_row)    \
+                          || ((x)<0 && MIN_ROW-(x)>cur_row))   \
+                               return 0;                       \
+                       else
+
+#define CK_ABS_C(x)    if((x)<MIN_COL || (x)>MAX_COL)  \
+                               return 0;               \
+                       else
+
+#define CK_REL_C(x)    if(   ((x)>0 && MAX_COL-(x)<cur_col)    \
+                          || ((x)<0 && MIN_COL-(x)>cur_col))   \
+                               return 0;                       \
+                       else
+
+#define MAYBEREL(p) (*(p)=='[' && (isdigit((p)[1]) || (((p)[1]=='+' || 
(p)[1]=='-') && isdigit((p)[2]))))
+
+               p= *ptr;
+               retr=0;
+               retc=0;
+               ended=0;
+               while(ended==0) {
+                       switch(*p) {
+                       case 'r':
+                       case 'R':
+                               if(retr) {
+                                       ended++;
+                                       break;
+                               }
+                               p++;
+                               retr=R_CELL;
+                               if(isdigit(*p)) {
+                                       num=astol(&p);
+                                       CK_ABS_R(num);
+                                       retp->lr= retp->hr=num;
+                               } else if(MAYBEREL(p)) {
+                                       p++;
+                                       num=astol(&p);
+                                       CK_REL_R(num);
+                                       retp->lr= retp->hr=num+cur_row;
+                                       retr|=ROWREL;
+                                       if(*p==':') {
+                                               retr=RANGE|LRREL|HRREL;
+                                               p++;
+                                               num=astol(&p);
+                                               CK_REL_R(num);
+                                               retp->hr=num+cur_row;
+                                       }
+                                       if(*p++!=']')
+                                               return 0;
+                               } else if(retc || *p=='c' || *p=='C') {
+                                       retr|=ROWREL;
+                                       retp->lr= retp->hr=cur_row;
+                               } else
+                                       return 0;
+                               if(*p==':' && retr!=(RANGE|LRREL|HRREL)) {
+                                       retr= (retr&ROWREL) ? RANGE|LRREL : 
RANGE;
+                                       p++;
+                                       if(isdigit(*p)) {
+                                               num=astol(&p);
+                                               CK_ABS_R(num);
+                                               retp->hr=num;
+                                       } else if(MAYBEREL(p)) {
+                                               p++;
+                                               num=astol(&p);
+                                               CK_REL_R(num);
+                                               retp->hr=num+cur_row;
+                                               retr|=HRREL;
+                                               if(*p++!=']')
+                                                       return 0;
+                                       } else
+                                               return 0;
+                               }
+
+                               if(retc)
+                                       ended++;
+                               break;
+
+                       case 'c':
+                       case 'C':
+                               if(retc) {
+                                       ended++;
+                                       break;
+                               }
+                               p++;
+                               retc=R_CELL;
+                               if(isdigit(*p)) {
+                                       num=astol(&p);
+                                       CK_ABS_C(num);
+                                       retp->lc= retp->hc=num;
+                               } else if(MAYBEREL(p)) {
+                                       p++;
+                                       num=astol(&p);
+                                       CK_REL_C(num);
+                                       retp->lc= retp->hc=num+cur_col;
+                                       retc|=COLREL;
+                                       if(*p==':') {
+                                               retc=RANGE|LCREL|HCREL;
+                                               p++;
+                                               num=astol(&p);
+                                               CK_REL_C(num);
+                                               retp->hc=num+cur_col;
+                                       }
+                                       if(*p++!=']')
+                                               return 0;
+                               } else if(retr || *p=='r' || *p=='R') {
+                                       retc|=COLREL;
+                                       retp->lc= retp->hc=cur_col;
+                               } else
+                                       return 0;
+                               if(*p==':' && retc!=(RANGE|LCREL|HCREL)) {
+                                       retc= (retc&COLREL) ? RANGE|LCREL : 
RANGE;
+                                       p++;
+                                       if(isdigit(*p)) {
+                                               num=astol(&p);
+                                               CK_ABS_C(num);
+                                               retp->hc=num;
+                                       } else if(MAYBEREL(p)) {
+                                               p++;
+                                               num=astol(&p);
+                                               CK_REL_C(num);
+                                               retp->hc=num+cur_col;
+                                               retc|=HCREL;
+                                               if(*p++!=']')
+                                                       return 0;
+                                       } else
+                                               return 0;
+                               }
+
+                               if(retr)
+                                       ended++;
+                               break;
+                       default:
+                               if(retr) {
+                                       *ptr=p;
+                                       retp->lc=MIN_COL;
+                                       retp->hc=MAX_COL;
+                                       if((retr|ROWREL)==(R_CELL|ROWREL))
+                                               return (retr&ROWREL) ? 
(RANGE|LRREL|HRREL) : RANGE;
+                                       else
+                                               return retr;
+                               } else if(retc) {
+                                       *ptr=p;
+                                       retp->lr=MIN_ROW;
+                                       retp->hr=MAX_COL;
+                                       if((retc|COLREL)==(R_CELL|COLREL))
+                                               return (retc&COLREL) ? 
(RANGE|LCREL|HCREL) : RANGE;
+                                       else
+                                               return retc;
+                               }
+                               return 0;
+                       }
+               }
+               if(!retr || !retc)
+                       return 0;
+               *ptr=p;
+               if(retp->lr>retp->hr)
+                       tmp=retp->lr,retp->lr=retp->hr,retp->hr=tmp;
+               if(retp->lc>retp->hc)
+                       tmp=retp->lc,retp->lc=retp->hc,retp->hc=tmp;
+
+               if((retr|ROWREL)==(R_CELL|ROWREL)) {
+                       if((retc|COLREL)==(R_CELL|COLREL))
+                               return retr|retc;
+                       return (retr&ROWREL) ? (retc|LRREL|HRREL) : retc;
+               }
+               if((retc|COLREL)==(R_CELL|COLREL))
+                       return (retc&COLREL) ? (retr|LCREL|HCREL) : retr;
+               return retr|retc;
+       }
+}
+
+int
+str_to_col FUN1(char **,str)
+{
+       int ret;
+       char c,cc,ccc;
+#if MAX_COL>702
+       char cccc;
+#endif
+
+       ret=0;
+       c=str[0][0];
+       if(!isalpha((cc=str[0][1]))) {
+               (*str)++;
+               return MIN_COL + (isupper(c) ? c-'A' : c-'a');
+       }
+       if(!isalpha((ccc=str[0][2]))) {
+               (*str)+=2;
+               return MIN_COL+26 + (isupper(c) ? c-'A' : c-'a')*26 + 
(isupper(cc) ? cc-'A' : cc-'a');
+       }
+#if MAX_COL>702
+       if(!isalpha((cccc=str[0][3]))) {
+               (*str)+=3;
+               return MIN_COL+702 + (isupper(c) ? c-'A' : c-'a')*26*26 + 
(isupper(cc) ? cc-'A' : cc-'a')*26 + (isupper(ccc) ? ccc-'A' : ccc-'a');
+       }
+       if(!isalpha(str[0][4])) {
+               (*str)+=4;
+               return MIN_COL+18278 + (isupper(c) ? c-'A' : c-'a')*26*26*26 + 
(isupper(cc) ? cc-'A' : cc-'a')*26*26 + (isupper(ccc) ? ccc-'A' : ccc-'a')*26 + 
(isupper(cccc) ? cccc-'A' : cccc-'a');
+       }
+#endif
+       return 0;
+}
diff --git a/test/etags/y-src/parse.y b/test/etags/y-src/parse.y
new file mode 100644
index 0000000..75fd787
--- /dev/null
+++ b/test/etags/y-src/parse.y
@@ -0,0 +1,875 @@
+%{
+/*     Copyright (C) 1990, 1992, 1993 Free Software Foundation, Inc.
+
+This file is part of Oleo, the GNU Spreadsheet.
+
+Oleo is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+Oleo is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Oleo; see the file COPYING.  If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+%}
+
+
+%right '?' ':'
+/* %left '|' */
+%left '&'
+%nonassoc '=' NE
+%nonassoc '<' LE '>' GE
+%left '+' '-'
+%left '*' '/' '%'
+%right '^'
+%left NEG '!'
+
+%token L_CELL L_RANGE
+%token L_VAR
+
+%token L_CONST
+%token L_FN0   L_FN1   L_FN2   L_FN3   L_FN4   L_FNN
+%token L_FN1R  L_FN2R  L_FN3R  L_FN4R  L_FNNR
+
+%token L_LE    L_NE    L_GE
+
+%{
+#include "funcdef.h"
+
+#include <ctype.h>
+
+#define obstack_chunk_alloc ck_malloc
+#define obstack_chunk_free free
+#include "obstack.h"
+#include "sysdef.h"
+
+#include "global.h"
+#include "errors.h"
+#include "node.h"
+#include "eval.h"
+#include "ref.h"
+
+int yylex ();
+#ifdef __STDC__
+void yyerror (char *);
+#else
+void yyerror ();
+#endif
+VOIDSTAR parse_hash;
+extern VOIDSTAR hash_find();
+
+/* This table contains a list of the infix single-char functions */
+unsigned char fnin[] = {
+       SUM, DIFF, DIV, PROD, MOD, /* AND, OR, */ POW, EQUAL, IF, CONCAT, 0
+};
+
+#define YYSTYPE _y_y_s_t_y_p_e
+typedef struct node *YYSTYPE;
+YYSTYPE parse_return;
+#ifdef __STDC__
+YYSTYPE make_list (YYSTYPE, YYSTYPE);
+#else
+YYSTYPE make_list ();
+#endif
+
+char *instr;
+int parse_error = 0;
+extern struct obstack tmp_mem;
+
+%}
+%%
+line:  exp
+               { parse_return=$1; }
+       | error {
+               if(!parse_error)
+                       parse_error=PARSE_ERR;
+               parse_return=0; }
+       ;
+
+exp:     L_CONST
+       | cell
+       | L_FN0 '(' ')' {
+               $$=$1; }
+       | L_FN1 '(' exp ')' {
+               ($1)->n_x.v_subs[0]=$3;
+               ($1)->n_x.v_subs[1]=(struct node *)0;
+               $$=$1; }
+       | L_FN2 '(' exp ',' exp ')' {
+               ($1)->n_x.v_subs[0]=$3;
+               ($1)->n_x.v_subs[1]=$5;
+               $$=$1; }
+       | L_FN3 '(' exp ',' exp ',' exp ')' {
+               ($1)->n_x.v_subs[0]=make_list($3,$5);
+               ($1)->n_x.v_subs[1]=$7;
+               $$=$1;}
+       | L_FN4 '(' exp ',' exp ',' exp ',' exp ')' {
+               ($1)->n_x.v_subs[0]=make_list($3,$5);
+               ($1)->n_x.v_subs[1]=make_list($7,$9);
+               $$=$1;}
+       | L_FNN '(' exp_list ')' {
+               ($1)->n_x.v_subs[0]=(struct node *)0;
+               ($1)->n_x.v_subs[1]=$3;
+               $$=$1; }
+       | L_FN1R '(' L_RANGE ')' {
+               $1->n_x.v_subs[0]=$3;
+               $$=$1; }
+       | L_FN1R '(' L_VAR ')' {
+               $1->n_x.v_subs[0]=$3;
+               $$=$1; }
+
+       | L_FN2R '(' L_RANGE ',' exp ')' {
+               $1->n_x.v_subs[0]=$3;
+               $1->n_x.v_subs[1]=$5;
+               $$=$1; }
+       | L_FN2R '(' L_VAR ',' exp ')' {
+               $1->n_x.v_subs[0]=$3;
+               $1->n_x.v_subs[1]=$5;
+               $$=$1; }
+
+       /* JF:  These should be FN2R, but I'm hacking this for SYLNK */
+       | L_FN2R '(' L_RANGE ',' exp ',' exp ')' {
+               if($1->comp_value!=F_INDEX)
+                       parse_error=PARSE_ERR;
+               $1->comp_value=F_INDEX2;
+               $1->n_x.v_subs[0]=make_list($3,$5);
+               $1->n_x.v_subs[1]=$7;
+               $$=$1; }
+       | L_FN2R '(' L_VAR ',' exp ',' exp ')' {
+               if($1->comp_value!=F_INDEX)
+                       parse_error=PARSE_ERR;
+               $1->comp_value=F_INDEX2;
+               $1->n_x.v_subs[0]=make_list($3,$5);
+               $1->n_x.v_subs[1]=$7;
+               $$=$1; }
+
+       | L_FN3R '(' L_RANGE ',' exp ',' exp ')' {
+               ($1)->n_x.v_subs[0]=make_list($3,$5);
+               ($1)->n_x.v_subs[1]=$7;
+               $$=$1;}
+       | L_FN3R '(' L_VAR ',' exp ',' exp ')' {
+               ($1)->n_x.v_subs[0]=make_list($3,$5);
+               ($1)->n_x.v_subs[1]=$7;
+               $$=$1;}
+
+       | L_FNNR '(' range_exp_list ')' {
+               ($1)->n_x.v_subs[0]=(struct node *)0;
+               ($1)->n_x.v_subs[1]=$3;
+               $$=$1; }
+       | exp '?' exp ':' exp {
+               $2->comp_value=IF;
+               $2->n_x.v_subs[0]=$4;
+               $2->n_x.v_subs[1]=$5;
+               $4->n_x.v_subs[0]=$1;
+               $4->n_x.v_subs[1]=$3;
+               $$=$2; }
+       /* | exp '|' exp {
+               $2->n_x.v_subs[0]=$1;
+               $2->n_x.v_subs[1]=$3;
+               $$ = $2; } */
+       | exp '&' exp {
+               $2->n_x.v_subs[0]=$1;
+               $2->n_x.v_subs[1]=$3;
+               $$ = $2; }
+       | exp '<' exp {
+               $2->n_x.v_subs[0]=$1;
+               $2->n_x.v_subs[1]=$3;
+               $$ = $2; }
+       | exp LE exp {
+               $2->n_x.v_subs[0]=$1;
+               $2->n_x.v_subs[1]=$3;
+               $$ = $2; }
+       | exp '=' exp {
+               $2->n_x.v_subs[0]=$1;
+               $2->n_x.v_subs[1]=$3;
+               $$ = $2; }
+       | exp NE exp {
+               $2->n_x.v_subs[0]=$1;
+               $2->n_x.v_subs[1]=$3;
+               $$ = $2; }
+       | exp '>' exp {
+               $2->n_x.v_subs[0]=$1;
+               $2->n_x.v_subs[1]=$3;
+               $$ = $2; }
+       | exp GE exp {
+               $2->n_x.v_subs[0]=$1;
+               $2->n_x.v_subs[1]=$3;
+               $$ = $2; }
+       | exp '+' exp {
+               $2->n_x.v_subs[0]=$1;
+               $2->n_x.v_subs[1]=$3;
+               $$ = $2; }
+       | exp '-' exp {
+               $2->n_x.v_subs[0]=$1;
+               $2->n_x.v_subs[1]=$3;
+               $$ = $2; }
+       | exp '*' exp {
+               $2->n_x.v_subs[0]=$1;
+               $2->n_x.v_subs[1]=$3;
+               $$ = $2; }
+       | exp '/' exp {
+               $2->n_x.v_subs[0]=$1;
+               $2->n_x.v_subs[1]=$3;
+               $$ = $2; }
+       | exp '%' exp {
+               $2->n_x.v_subs[0]=$1;
+               $2->n_x.v_subs[1]=$3;
+               $$ = $2; }
+       | exp '^' exp {
+               $2->n_x.v_subs[0]=$1;
+               $2->n_x.v_subs[1]=$3;
+               $$ = $2; }
+       | '-' exp %prec NEG {
+               if($2->comp_value==CONST_FLT) {
+                       $2->n_x.v_float= -($2->n_x.v_float);
+                       /* free($1); */
+                       $$=$2;
+               } else if($2->comp_value==CONST_INT) {
+                       $2->n_x.v_int= -($2->n_x.v_int);
+                       /* free($1); */
+                       $$=$2;
+               } else {
+                       $1->comp_value = NEGATE;
+                       $1->n_x.v_subs[0]=$2;
+                       $1->n_x.v_subs[1]=(struct node *)0;
+                       $$ = $1;
+               } }
+       | '!' exp {
+               $1->n_x.v_subs[0]=$2;
+               $1->n_x.v_subs[1]=(struct node *)0;
+               $$ = $1; }
+       | '(' exp ')'
+               { $$ = $2; }
+       | '(' exp error {
+               if(!parse_error)
+                       parse_error=NO_CLOSE;
+               }
+       /* | exp ')' error {
+               if(!parse_error)
+                       parse_error=NO_OPEN;
+               } */
+       | '(' error {
+               if(!parse_error)
+                       parse_error=NO_CLOSE;
+               }
+       ;
+
+
+exp_list: exp
+               { $$ = make_list($1, 0); }
+       | exp_list ',' exp
+               { $$ = make_list($3, $1); }
+       ;
+
+range_exp: L_RANGE
+       | exp
+       ;
+
+range_exp_list: range_exp
+               { $$=make_list($1, 0); }
+       |   range_exp_list ',' range_exp
+               { $$=make_list($3,$1); }
+       ;
+
+cell:  L_CELL
+               { $$=$1; }
+       | L_VAR
+       ;
+%%
+
+void
+yyerror FUN1(char *, s)
+{
+       if(!parse_error)
+               parse_error=PARSE_ERR;
+}
+
+YYSTYPE
+make_list FUN2(YYSTYPE, car, YYSTYPE, cdr)
+{
+       YYSTYPE ret;
+
+       ret=(YYSTYPE)obstack_alloc(&tmp_mem,sizeof(*ret));
+       ret->comp_value = 0;
+       ret->n_x.v_subs[0]=car;
+       ret->n_x.v_subs[1]=cdr;
+       return ret;
+}
+
+#define ERROR -1
+
+extern struct node *yylval;
+
+#ifdef __STDC__
+unsigned char parse_cell_or_range (char **,struct rng *);
+#else
+unsigned char parse_cell_or_range ();
+#endif
+
+int
+yylex FUN0()
+{
+       int ch;
+       struct node *new;
+       int isflt;
+       char *begin;
+       char *tmp_str;
+       unsigned char byte_value;
+       int n;
+
+       /* unsigned char *ptr; */
+       int nn;
+       struct function *fp;
+       int tmp_ch;
+
+#ifdef TEST
+       if(!instr)
+               return ERROR;
+#endif
+       while(isspace(*instr))
+               instr++;
+       ch = *instr++;
+       if(ch=='(' || ch==',' || ch==')')
+               return ch;
+
+       new=(struct node *)obstack_alloc(&tmp_mem,sizeof(struct node));
+       new->add_byte=0;
+       new->sub_value=0;
+       switch(ch) {
+       case 0:
+               return 0;
+
+       case '0': case '1': case '2': case '3': case '4': case '5': case '6':
+       case '7': case '8': case '9': case '.':
+               isflt = (ch=='.');
+
+               begin=instr-1;
+               tmp_str=instr;
+
+               while(isdigit(*tmp_str) || (!isflt && *tmp_str=='.' && ++isflt))
+                       tmp_str++;
+               if(*tmp_str=='e' || *tmp_str=='E') {
+                       isflt=1;
+                       tmp_str++;
+                       if(*tmp_str=='-' || *tmp_str=='+')
+                               tmp_str++;
+                       while(isdigit(*tmp_str))
+                               tmp_str++;
+               }
+               if(isflt) {
+                       new->n_x.v_float=astof((char **)(&begin));
+                       byte_value=CONST_FLT;
+               } else {
+                       new->n_x.v_int=astol((char **)(&begin));
+                       if(begin!=tmp_str) {
+                               begin=instr-1;
+                               new->n_x.v_float=astof((char **)(&begin));
+                               byte_value=CONST_FLT;
+                       } else
+                               byte_value=CONST_INT;
+               }
+               ch=L_CONST;
+               instr=begin;
+               break;
+
+       case '"':
+               begin=instr;
+               while(*instr && *instr!='"') {
+                       if(*instr=='\\' && instr[1])
+                               instr++;
+                       instr++;
+               }
+               if(!*instr) {
+                       parse_error=NO_QUOTE;
+                       return ERROR;
+               }
+               tmp_str=new->n_x.v_string=(char *)ck_malloc(1+instr-begin);
+               while(begin!=instr) {
+                       unsigned char n;
+
+                       if(*begin=='\\') {
+                               begin++;
+                               if(begin[0]>='0' && begin[0]<='7') {
+                                       if(begin[1]>='0' && begin[1]<='7') {
+                                               if(begin[2]>='0' && 
begin[2]<='7') {
+                                                       n=(begin[2]-'0') + (010 
* (begin[1]-'0')) + ( 0100 * (begin[0]-'0'));
+                                                       begin+=3;
+                                               } else {
+                                                       n=(begin[1]-'0') + (010 
* (begin[0]-'0'));
+                                                       begin+=2;
+                                               }
+                                       } else {
+                                               n=begin[0]-'0';
+                                               begin++;
+                                       }
+                               } else
+                                       n= *begin++;
+                               *tmp_str++= n;
+                       } else
+                               *tmp_str++= *begin++;
+               }
+               *tmp_str='\0';
+               instr++;
+               byte_value=CONST_STR;
+               ch=L_CONST;
+               break;
+
+       case '+':       case '-':
+
+       case '*':       case '/':       case '%':       case '&':
+       /* case '|': */ case '^':       case '=':
+
+       case '?':
+       {
+               unsigned char *ptr;
+
+               for(ptr= fnin;*ptr;ptr++)
+                       if(the_funs[*ptr].fn_str[0]==ch)
+                               break;
+#ifdef TEST
+               if(!*ptr)
+                       panic("Can't find fnin[] entry for '%c'",ch);
+#endif
+               byte_value= *ptr;
+       }
+               break;
+
+       case ':':
+               byte_value=IF;
+               break;
+
+       case '!':
+       case '<':
+       case '>':
+               if(*instr!='=') {
+                       byte_value = (ch=='<') ? LESS : (ch=='>') ? GREATER : 
NOT;
+                       break;
+               }
+               instr++;
+               byte_value = (ch=='<') ? LESSEQ : (ch=='>') ? GREATEQ : 
NOTEQUAL;
+               ch = (ch=='<') ? LE : (ch=='>') ? GE : NE;
+               break;
+
+       case '\'':
+       case ';':
+       case '[':
+       case '\\':
+       case ']':
+       case '`':
+       case '{':
+       case '}':
+       case '~':
+       bad_chr:
+               parse_error=BAD_CHAR;
+               return ERROR;
+
+       case '#':
+               begin=instr-1;
+               while(*instr && (isalnum(*instr) || *instr=='_'))
+                       instr++;
+               ch= *instr;
+               *instr=0;
+               if(!stricmp(begin,tname))
+                       byte_value=F_TRUE;
+               else if(!stricmp(begin,fname))
+                       byte_value=F_FALSE;
+               else if(!stricmp(begin,iname) && (begin[4]==0 || 
!stricmp(begin+4,"inity")))
+                       byte_value=CONST_INF;
+               else if(!stricmp(begin,mname) ||
+                       !stricmp(begin,"#ninf"))
+                       byte_value=CONST_NINF;
+               else if(!stricmp(begin,nname) ||
+                       !stricmp(begin,"#nan"))
+                       byte_value=CONST_NAN;
+               else {
+                       for(n=1;n<=ERR_MAX;n++)
+                               if(!stricmp(begin,ename[n]))
+                                       break;
+                       if(n>ERR_MAX)
+                               n=BAD_CHAR;
+                       new->n_x.v_int=n;
+                       byte_value=CONST_ERR;
+               }
+               *instr=ch;
+               ch=L_CONST;
+               break;
+
+       default:
+               if(!a0 && (ch=='@' || ch=='$'))
+                  goto bad_chr;
+
+               if(a0 && ch=='@') {
+                       begin=instr;
+                       while(*instr && (isalpha(*instr) || isdigit(*instr) || 
*instr=='_'))
+                               instr++;
+                       n=instr-begin;
+               } else {
+                       begin=instr-1;
+                       
byte_value=parse_cell_or_range(&begin,&(new->n_x.v_rng));
+                       if(byte_value) {
+                               if((byte_value& ~0x3)==R_CELL)
+                                       ch=L_CELL;
+                               else
+                                       ch=L_RANGE;
+                               instr=begin;
+                               break;
+                       }
+
+                       while(*instr && (isalpha(*instr) || isdigit(*instr) || 
*instr=='_'))
+                               instr++;
+
+                       n=instr-begin;
+                       while(isspace(*instr))
+                               instr++;
+
+                       if(*instr!='(') {
+                               ch=L_VAR;
+                               byte_value=VAR;
+                               new->n_x.v_var=find_or_make_var(begin,n);
+                               break;
+                       }
+               }
+               tmp_ch=begin[n];
+               begin[n]='\0';
+               fp=hash_find(parse_hash,begin);
+               begin[n]=tmp_ch;
+               byte_value= ERROR;
+               if(!fp) {
+                       parse_error=BAD_FUNC;
+                       return ERROR;
+               }
+
+               if(fp>=the_funs && fp<=&the_funs[USR1])
+                       byte_value=fp-the_funs;
+               else {
+                       for(nn=0;nn<n_usr_funs;nn++) {
+                               if(fp>=&usr_funs[nn][0] && 
fp<=&usr_funs[nn][usr_n_funs[nn]]) {
+                                       byte_value=USR1+nn;
+                                       new->sub_value=fp-&usr_funs[nn][0];
+                                       break;
+                               }
+                       }
+#ifdef TEST
+                       if(nn==n_usr_funs) {
+                               io_error_msg("Couln't turn fp into a ##");
+                               parse_error=BAD_FUNC;
+                               return ERROR;
+                       }
+#endif
+               }
+
+               if(fp->fn_argn&X_J)
+                       ch= byte_value==F_IF ? L_FN3 : L_FN2;
+               else if(fp->fn_argt[0]=='R' || fp->fn_argt[0]=='E')
+                       ch=L_FN1R-1+fp->fn_argn-X_A0;
+               else
+                       ch=L_FN0 + fp->fn_argn-X_A0;
+
+               break;
+       }
+       /* new->node_type=ch; */
+       new->comp_value=byte_value;
+       yylval=new;
+       return ch;
+}
+
+/* Return value is
+       0 if it doesn't look like a cell or a range,
+       R_CELL if it is a cell (ptr now points past the characters, lr and lc 
hold the row and col of the cell)
+       RANGE if it is a range (ptr points past the chars)
+ */
+unsigned char
+parse_cell_or_range FUN2(char **,ptr, struct rng *,retp)
+{
+       if(a0) {
+               unsigned tmpc,tmpr;
+               char *p;
+               int abz = ROWREL|COLREL;
+
+               p= *ptr;
+               tmpc=0;
+               if(*p=='$') {
+                       abz-=COLREL;
+                       p++;
+               }
+               if(!isalpha(*p))
+                       return 0;
+               tmpc=str_to_col(&p);
+               if(tmpc<MIN_COL || tmpc>MAX_COL)
+                       return 0;
+               if(*p=='$') {
+                       abz-=ROWREL;
+                       p++;
+               }
+               if(!isdigit(*p))
+                       return 0;
+               for(tmpr=0;isdigit(*p);p++)
+                       tmpr=tmpr*10 + *p - '0';
+
+               if(tmpr<MIN_ROW || tmpr>MAX_ROW)
+                       return 0;
+
+               if(*p==':' || *p=='.') {
+                       unsigned tmpc1,tmpr1;
+
+                       abz = ((abz&COLREL) ? LCREL : 0)|((abz&ROWREL) ? LRREL 
: 0)|HRREL|HCREL;
+                       p++;
+                       if(*p=='$') {
+                               abz-=HCREL;
+                               p++;
+                       }
+                       if(!isalpha(*p))
+                               return 0;
+                       tmpc1=str_to_col(&p);
+                       if(tmpc1<MIN_COL || tmpc1>MAX_COL)
+                               return 0;
+                       if(*p=='$') {
+                               abz-=HRREL;
+                               p++;
+                       }
+                       if(!isdigit(*p))
+                               return 0;
+                       for(tmpr1=0;isdigit(*p);p++)
+                               tmpr1=tmpr1*10 + *p - '0';
+                       if(tmpr1<MIN_ROW || tmpr1>MAX_ROW)
+                               return 0;
+
+                       if(tmpr<tmpr1) {
+                               retp->lr=tmpr;
+                               retp->hr=tmpr1;
+                       } else {
+                               retp->lr=tmpr1;
+                               retp->hr=tmpr;
+                       }
+                       if(tmpc<tmpc1) {
+                               retp->lc=tmpc;
+                               retp->hc=tmpc1;
+                       } else {
+                               retp->lc=tmpc1;
+                               retp->hc=tmpc;
+                       }
+                       *ptr= p;
+                       return RANGE | abz;
+               }
+               retp->lr = retp->hr = tmpr;
+               retp->lc = retp->hc = tmpc;
+               *ptr=p;
+               return R_CELL | abz;
+       } else {
+               char *p;
+               unsigned char retr;
+               unsigned char retc;
+               int ended;
+               long num;
+               CELLREF tmp;
+
+#define CK_ABS_R(x)    if((x)<MIN_ROW || (x)>MAX_ROW)  \
+                               return 0;               \
+                       else
+
+#define CK_REL_R(x)    if(   ((x)>0 && MAX_ROW-(x)<cur_row)    \
+                          || ((x)<0 && MIN_ROW-(x)>cur_row))   \
+                               return 0;                       \
+                       else
+
+#define CK_ABS_C(x)    if((x)<MIN_COL || (x)>MAX_COL)  \
+                               return 0;               \
+                       else
+
+#define CK_REL_C(x)    if(   ((x)>0 && MAX_COL-(x)<cur_col)    \
+                          || ((x)<0 && MIN_COL-(x)>cur_col))   \
+                               return 0;                       \
+                       else
+
+#define MAYBEREL(p) (*(p)=='[' && (isdigit((p)[1]) || (((p)[1]=='+' || 
(p)[1]=='-') && isdigit((p)[2]))))
+
+               p= *ptr;
+               retr=0;
+               retc=0;
+               ended=0;
+               while(ended==0) {
+                       switch(*p) {
+                       case 'r':
+                       case 'R':
+                               if(retr) {
+                                       ended++;
+                                       break;
+                               }
+                               p++;
+                               retr=R_CELL;
+                               if(isdigit(*p)) {
+                                       num=astol(&p);
+                                       CK_ABS_R(num);
+                                       retp->lr= retp->hr=num;
+                               } else if(MAYBEREL(p)) {
+                                       p++;
+                                       num=astol(&p);
+                                       CK_REL_R(num);
+                                       retp->lr= retp->hr=num+cur_row;
+                                       retr|=ROWREL;
+                                       if(*p==':') {
+                                               retr=RANGE|LRREL|HRREL;
+                                               p++;
+                                               num=astol(&p);
+                                               CK_REL_R(num);
+                                               retp->hr=num+cur_row;
+                                       }
+                                       if(*p++!=']')
+                                               return 0;
+                               } else if(retc || *p=='c' || *p=='C') {
+                                       retr|=ROWREL;
+                                       retp->lr= retp->hr=cur_row;
+                               } else
+                                       return 0;
+                               if(*p==':' && retr!=(RANGE|LRREL|HRREL)) {
+                                       retr= (retr&ROWREL) ? RANGE|LRREL : 
RANGE;
+                                       p++;
+                                       if(isdigit(*p)) {
+                                               num=astol(&p);
+                                               CK_ABS_R(num);
+                                               retp->hr=num;
+                                       } else if(MAYBEREL(p)) {
+                                               p++;
+                                               num=astol(&p);
+                                               CK_REL_R(num);
+                                               retp->hr=num+cur_row;
+                                               retr|=HRREL;
+                                               if(*p++!=']')
+                                                       return 0;
+                                       } else
+                                               return 0;
+                               }
+
+                               if(retc)
+                                       ended++;
+                               break;
+
+                       case 'c':
+                       case 'C':
+                               if(retc) {
+                                       ended++;
+                                       break;
+                               }
+                               p++;
+                               retc=R_CELL;
+                               if(isdigit(*p)) {
+                                       num=astol(&p);
+                                       CK_ABS_C(num);
+                                       retp->lc= retp->hc=num;
+                               } else if(MAYBEREL(p)) {
+                                       p++;
+                                       num=astol(&p);
+                                       CK_REL_C(num);
+                                       retp->lc= retp->hc=num+cur_col;
+                                       retc|=COLREL;
+                                       if(*p==':') {
+                                               retc=RANGE|LCREL|HCREL;
+                                               p++;
+                                               num=astol(&p);
+                                               CK_REL_C(num);
+                                               retp->hc=num+cur_col;
+                                       }
+                                       if(*p++!=']')
+                                               return 0;
+                               } else if(retr || *p=='r' || *p=='R') {
+                                       retc|=COLREL;
+                                       retp->lc= retp->hc=cur_col;
+                               } else
+                                       return 0;
+                               if(*p==':' && retc!=(RANGE|LCREL|HCREL)) {
+                                       retc= (retc&COLREL) ? RANGE|LCREL : 
RANGE;
+                                       p++;
+                                       if(isdigit(*p)) {
+                                               num=astol(&p);
+                                               CK_ABS_C(num);
+                                               retp->hc=num;
+                                       } else if(MAYBEREL(p)) {
+                                               p++;
+                                               num=astol(&p);
+                                               CK_REL_C(num);
+                                               retp->hc=num+cur_col;
+                                               retc|=HCREL;
+                                               if(*p++!=']')
+                                                       return 0;
+                                       } else
+                                               return 0;
+                               }
+
+                               if(retr)
+                                       ended++;
+                               break;
+                       default:
+                               if(retr) {
+                                       *ptr=p;
+                                       retp->lc=MIN_COL;
+                                       retp->hc=MAX_COL;
+                                       if((retr|ROWREL)==(R_CELL|ROWREL))
+                                               return (retr&ROWREL) ? 
(RANGE|LRREL|HRREL) : RANGE;
+                                       else
+                                               return retr;
+                               } else if(retc) {
+                                       *ptr=p;
+                                       retp->lr=MIN_ROW;
+                                       retp->hr=MAX_COL;
+                                       if((retc|COLREL)==(R_CELL|COLREL))
+                                               return (retc&COLREL) ? 
(RANGE|LCREL|HCREL) : RANGE;
+                                       else
+                                               return retc;
+                               }
+                               return 0;
+                       }
+               }
+               if(!retr || !retc)
+                       return 0;
+               *ptr=p;
+               if(retp->lr>retp->hr)
+                       tmp=retp->lr,retp->lr=retp->hr,retp->hr=tmp;
+               if(retp->lc>retp->hc)
+                       tmp=retp->lc,retp->lc=retp->hc,retp->hc=tmp;
+
+               if((retr|ROWREL)==(R_CELL|ROWREL)) {
+                       if((retc|COLREL)==(R_CELL|COLREL))
+                               return retr|retc;
+                       return (retr&ROWREL) ? (retc|LRREL|HRREL) : retc;
+               }
+               if((retc|COLREL)==(R_CELL|COLREL))
+                       return (retc&COLREL) ? (retr|LCREL|HCREL) : retr;
+               return retr|retc;
+       }
+}
+
+int
+str_to_col FUN1(char **,str)
+{
+       int ret;
+       char c,cc,ccc;
+#if MAX_COL>702
+       char cccc;
+#endif
+
+       ret=0;
+       c=str[0][0];
+       if(!isalpha((cc=str[0][1]))) {
+               (*str)++;
+               return MIN_COL + (isupper(c) ? c-'A' : c-'a');
+       }
+       if(!isalpha((ccc=str[0][2]))) {
+               (*str)+=2;
+               return MIN_COL+26 + (isupper(c) ? c-'A' : c-'a')*26 + 
(isupper(cc) ? cc-'A' : cc-'a');
+       }
+#if MAX_COL>702
+       if(!isalpha((cccc=str[0][3]))) {
+               (*str)+=3;
+               return MIN_COL+702 + (isupper(c) ? c-'A' : c-'a')*26*26 + 
(isupper(cc) ? cc-'A' : cc-'a')*26 + (isupper(ccc) ? ccc-'A' : ccc-'a');
+       }
+       if(!isalpha(str[0][4])) {
+               (*str)+=4;
+               return MIN_COL+18278 + (isupper(c) ? c-'A' : c-'a')*26*26*26 + 
(isupper(cc) ? cc-'A' : cc-'a')*26*26 + (isupper(ccc) ? ccc-'A' : ccc-'a')*26 + 
(isupper(cccc) ? cccc-'A' : cccc-'a');
+       }
+#endif
+       return 0;
+}



reply via email to

[Prev in Thread] Current Thread [Next in Thread]