aboutsummaryrefslogtreecommitdiffstats
path: root/gnu
diff options
context:
space:
mode:
Diffstat (limited to 'gnu')
-rw-r--r--gnu/lib/Makefile4
-rw-r--r--gnu/lib/Makefile.inc8
-rw-r--r--gnu/lib/libg++/Makefile26
-rw-r--r--gnu/lib/libg++/Makefile.inc10
-rw-r--r--gnu/lib/libg++/g++-include/AVLMap.ccP (renamed from gnu/lib/libg++/g++-include/gen/AVLMap.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/AVLMap.hP (renamed from gnu/lib/libg++/g++-include/gen/AVLMap.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/AVLSet.ccP (renamed from gnu/lib/libg++/g++-include/gen/AVLSet.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/AVLSet.hP (renamed from gnu/lib/libg++/g++-include/gen/AVLSet.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/AVec.ccP (renamed from gnu/lib/libg++/g++-include/gen/AVec.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/AVec.hP (renamed from gnu/lib/libg++/g++-include/gen/AVec.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/BSTSet.ccP (renamed from gnu/lib/libg++/g++-include/gen/BSTSet.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/BSTSet.hP (renamed from gnu/lib/libg++/g++-include/gen/BSTSet.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/Bag.ccP (renamed from gnu/lib/libg++/g++-include/gen/Bag.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/Bag.hP (renamed from gnu/lib/libg++/g++-include/gen/Bag.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/CHBag.ccP (renamed from gnu/lib/libg++/g++-include/gen/CHBag.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/CHBag.hP (renamed from gnu/lib/libg++/g++-include/gen/CHBag.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/CHMap.ccP (renamed from gnu/lib/libg++/g++-include/gen/CHMap.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/CHMap.hP (renamed from gnu/lib/libg++/g++-include/gen/CHMap.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/CHNode.ccP (renamed from gnu/lib/libg++/g++-include/gen/CHNode.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/CHNode.hP (renamed from gnu/lib/libg++/g++-include/gen/CHNode.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/CHSet.ccP (renamed from gnu/lib/libg++/g++-include/gen/CHSet.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/CHSet.hP (renamed from gnu/lib/libg++/g++-include/gen/CHSet.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/DLDeque.ccP (renamed from gnu/lib/libg++/g++-include/gen/DLDeque.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/DLDeque.hP (renamed from gnu/lib/libg++/g++-include/gen/DLDeque.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/DLList.ccP (renamed from gnu/lib/libg++/g++-include/gen/DLList.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/DLList.hP (renamed from gnu/lib/libg++/g++-include/gen/DLList.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/Deque.ccP (renamed from gnu/lib/libg++/g++-include/gen/Deque.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/Deque.hP (renamed from gnu/lib/libg++/g++-include/gen/Deque.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/FPQueue.ccP (renamed from gnu/lib/libg++/g++-include/gen/FPQueue.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/FPQueue.hP (renamed from gnu/lib/libg++/g++-include/gen/FPQueue.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/FPStack.ccP (renamed from gnu/lib/libg++/g++-include/gen/FPStack.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/FPStack.hP (renamed from gnu/lib/libg++/g++-include/gen/FPStack.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/FPlex.ccP (renamed from gnu/lib/libg++/g++-include/gen/FPlex.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/FPlex.hP (renamed from gnu/lib/libg++/g++-include/gen/FPlex.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/List.ccP (renamed from gnu/lib/libg++/g++-include/gen/List.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/List.hP (renamed from gnu/lib/libg++/g++-include/gen/List.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/MPlex.ccP (renamed from gnu/lib/libg++/g++-include/gen/MPlex.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/MPlex.hP (renamed from gnu/lib/libg++/g++-include/gen/MPlex.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/Map.ccP (renamed from gnu/lib/libg++/g++-include/gen/Map.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/Map.hP (renamed from gnu/lib/libg++/g++-include/gen/Map.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/OSLBag.ccP (renamed from gnu/lib/libg++/g++-include/gen/OSLBag.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/OSLBag.hP (renamed from gnu/lib/libg++/g++-include/gen/OSLBag.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/OSLSet.ccP (renamed from gnu/lib/libg++/g++-include/gen/OSLSet.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/OSLSet.hP (renamed from gnu/lib/libg++/g++-include/gen/OSLSet.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/OXPBag.ccP (renamed from gnu/lib/libg++/g++-include/gen/OXPBag.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/OXPBag.hP (renamed from gnu/lib/libg++/g++-include/gen/OXPBag.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/OXPSet.ccP (renamed from gnu/lib/libg++/g++-include/gen/OXPSet.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/OXPSet.hP (renamed from gnu/lib/libg++/g++-include/gen/OXPSet.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/PHPQ.ccP (renamed from gnu/lib/libg++/g++-include/gen/PHPQ.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/PHPQ.hP (renamed from gnu/lib/libg++/g++-include/gen/PHPQ.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/PQ.ccP (renamed from gnu/lib/libg++/g++-include/gen/PQ.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/PQ.hP (renamed from gnu/lib/libg++/g++-include/gen/PQ.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/PSList.hP (renamed from gnu/lib/libg++/g++-include/gen/PSList.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/PVec.hP (renamed from gnu/lib/libg++/g++-include/gen/PVec.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/Plex.ccP (renamed from gnu/lib/libg++/g++-include/gen/Plex.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/Plex.hP (renamed from gnu/lib/libg++/g++-include/gen/Plex.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/Queue.ccP (renamed from gnu/lib/libg++/g++-include/gen/Queue.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/Queue.hP (renamed from gnu/lib/libg++/g++-include/gen/Queue.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/RAVLMap.ccP (renamed from gnu/lib/libg++/g++-include/gen/RAVLMap.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/RAVLMap.hP (renamed from gnu/lib/libg++/g++-include/gen/RAVLMap.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/RPlex.ccP (renamed from gnu/lib/libg++/g++-include/gen/RPlex.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/RPlex.hP (renamed from gnu/lib/libg++/g++-include/gen/RPlex.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/SLBag.ccP (renamed from gnu/lib/libg++/g++-include/gen/SLBag.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/SLBag.hP (renamed from gnu/lib/libg++/g++-include/gen/SLBag.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/SLList.ccP (renamed from gnu/lib/libg++/g++-include/gen/SLList.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/SLList.hP (renamed from gnu/lib/libg++/g++-include/gen/SLList.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/SLQueue.ccP (renamed from gnu/lib/libg++/g++-include/gen/SLQueue.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/SLQueue.hP (renamed from gnu/lib/libg++/g++-include/gen/SLQueue.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/SLSet.ccP (renamed from gnu/lib/libg++/g++-include/gen/SLSet.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/SLSet.hP (renamed from gnu/lib/libg++/g++-include/gen/SLSet.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/SLStack.ccP (renamed from gnu/lib/libg++/g++-include/gen/SLStack.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/SLStack.hP (renamed from gnu/lib/libg++/g++-include/gen/SLStack.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/Set.ccP (renamed from gnu/lib/libg++/g++-include/gen/Set.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/Set.hP (renamed from gnu/lib/libg++/g++-include/gen/Set.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/SkipBag.ccP (renamed from gnu/lib/libg++/g++-include/gen/SkipBag.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/SkipBag.hP (renamed from gnu/lib/libg++/g++-include/gen/SkipBag.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/SkipMap.ccP (renamed from gnu/lib/libg++/g++-include/gen/SkipMap.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/SkipMap.hP (renamed from gnu/lib/libg++/g++-include/gen/SkipMap.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/SkipSet.ccP (renamed from gnu/lib/libg++/g++-include/gen/SkipSet.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/SkipSet.hP (renamed from gnu/lib/libg++/g++-include/gen/SkipSet.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/SplayBag.ccP (renamed from gnu/lib/libg++/g++-include/gen/SplayBag.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/SplayBag.hP (renamed from gnu/lib/libg++/g++-include/gen/SplayBag.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/SplayMap.ccP (renamed from gnu/lib/libg++/g++-include/gen/SplayMap.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/SplayMap.hP (renamed from gnu/lib/libg++/g++-include/gen/SplayMap.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/SplayNode.ccP (renamed from gnu/lib/libg++/g++-include/gen/SplayNode.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/SplayNode.hP (renamed from gnu/lib/libg++/g++-include/gen/SplayNode.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/SplayPQ.ccP (renamed from gnu/lib/libg++/g++-include/gen/SplayPQ.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/SplayPQ.hP (renamed from gnu/lib/libg++/g++-include/gen/SplayPQ.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/SplaySet.ccP (renamed from gnu/lib/libg++/g++-include/gen/SplaySet.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/SplaySet.hP (renamed from gnu/lib/libg++/g++-include/gen/SplaySet.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/Stack.ccP (renamed from gnu/lib/libg++/g++-include/gen/Stack.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/Stack.hP (renamed from gnu/lib/libg++/g++-include/gen/Stack.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/VHBag.ccP (renamed from gnu/lib/libg++/g++-include/gen/VHBag.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/VHBag.hP (renamed from gnu/lib/libg++/g++-include/gen/VHBag.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/VHMap.ccP (renamed from gnu/lib/libg++/g++-include/gen/VHMap.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/VHMap.hP (renamed from gnu/lib/libg++/g++-include/gen/VHMap.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/VHSet.ccP (renamed from gnu/lib/libg++/g++-include/gen/VHSet.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/VHSet.hP (renamed from gnu/lib/libg++/g++-include/gen/VHSet.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/VOHSet.ccP (renamed from gnu/lib/libg++/g++-include/gen/VOHSet.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/VOHSet.hP (renamed from gnu/lib/libg++/g++-include/gen/VOHSet.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/VQueue.ccP (renamed from gnu/lib/libg++/g++-include/gen/VQueue.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/VQueue.hP (renamed from gnu/lib/libg++/g++-include/gen/VQueue.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/VStack.ccP (renamed from gnu/lib/libg++/g++-include/gen/VStack.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/VStack.hP (renamed from gnu/lib/libg++/g++-include/gen/VStack.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/Vec.ccP (renamed from gnu/lib/libg++/g++-include/gen/Vec.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/Vec.hP (renamed from gnu/lib/libg++/g++-include/gen/Vec.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/XPBag.ccP (renamed from gnu/lib/libg++/g++-include/gen/XPBag.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/XPBag.hP (renamed from gnu/lib/libg++/g++-include/gen/XPBag.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/XPDeque.ccP (renamed from gnu/lib/libg++/g++-include/gen/XPDeque.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/XPDeque.hP (renamed from gnu/lib/libg++/g++-include/gen/XPDeque.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/XPPQ.ccP (renamed from gnu/lib/libg++/g++-include/gen/XPPQ.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/XPPQ.hP (renamed from gnu/lib/libg++/g++-include/gen/XPPQ.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/XPQueue.ccP (renamed from gnu/lib/libg++/g++-include/gen/XPQueue.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/XPQueue.hP (renamed from gnu/lib/libg++/g++-include/gen/XPQueue.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/XPSet.ccP (renamed from gnu/lib/libg++/g++-include/gen/XPSet.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/XPSet.hP (renamed from gnu/lib/libg++/g++-include/gen/XPSet.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/XPStack.ccP (renamed from gnu/lib/libg++/g++-include/gen/XPStack.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/XPStack.hP (renamed from gnu/lib/libg++/g++-include/gen/XPStack.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/XPlex.ccP (renamed from gnu/lib/libg++/g++-include/gen/XPlex.ccP)0
-rw-r--r--gnu/lib/libg++/g++-include/XPlex.hP (renamed from gnu/lib/libg++/g++-include/gen/XPlex.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/assert.h14
-rw-r--r--gnu/lib/libg++/g++-include/bstring.h1
-rw-r--r--gnu/lib/libg++/g++-include/ctype.h10
-rw-r--r--gnu/lib/libg++/g++-include/curses.h82
-rw-r--r--gnu/lib/libg++/g++-include/defs.hP (renamed from gnu/lib/libg++/g++-include/gen/defs.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/dir.h1
-rw-r--r--gnu/lib/libg++/g++-include/dirent.h44
-rw-r--r--gnu/lib/libg++/g++-include/errno.h24
-rw-r--r--gnu/lib/libg++/g++-include/fcntl.h29
-rw-r--r--gnu/lib/libg++/g++-include/grp.h41
-rw-r--r--gnu/lib/libg++/g++-include/intSList.hP (renamed from gnu/lib/libg++/g++-include/gen/intSList.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/intVec.hP (renamed from gnu/lib/libg++/g++-include/gen/intVec.hP)0
-rw-r--r--gnu/lib/libg++/g++-include/math.h221
-rw-r--r--gnu/lib/libg++/g++-include/memory.h42
-rw-r--r--gnu/lib/libg++/g++-include/netdb.h4
-rw-r--r--gnu/lib/libg++/g++-include/pwd.h36
-rw-r--r--gnu/lib/libg++/g++-include/setjmp.h29
-rw-r--r--gnu/lib/libg++/g++-include/signal.h80
-rw-r--r--gnu/lib/libg++/g++-include/stdarg.h3
-rw-r--r--gnu/lib/libg++/g++-include/stddef.h12
-rw-r--r--gnu/lib/libg++/g++-include/stdio.h180
-rw-r--r--gnu/lib/libg++/g++-include/stdlib.h81
-rw-r--r--gnu/lib/libg++/g++-include/string.h45
-rw-r--r--gnu/lib/libg++/g++-include/strings.h1
-rw-r--r--gnu/lib/libg++/g++-include/sys/dir.h42
-rw-r--r--gnu/lib/libg++/g++-include/sys/fcntl.h15
-rw-r--r--gnu/lib/libg++/g++-include/sys/file.h28
-rw-r--r--gnu/lib/libg++/g++-include/sys/mman.h14
-rw-r--r--gnu/lib/libg++/g++-include/sys/param.h22
-rw-r--r--gnu/lib/libg++/g++-include/sys/resource.h29
-rw-r--r--gnu/lib/libg++/g++-include/sys/select.h8
-rw-r--r--gnu/lib/libg++/g++-include/sys/signal.h37
-rw-r--r--gnu/lib/libg++/g++-include/sys/socket.h63
-rw-r--r--gnu/lib/libg++/g++-include/sys/stat.h47
-rw-r--r--gnu/lib/libg++/g++-include/sys/time.h41
-rw-r--r--gnu/lib/libg++/g++-include/sys/times.h20
-rw-r--r--gnu/lib/libg++/g++-include/sys/types.h25
-rw-r--r--gnu/lib/libg++/g++-include/sys/wait.h42
-rw-r--r--gnu/lib/libg++/g++-include/time.h108
-rw-r--r--gnu/lib/libg++/g++-include/unistd.h187
-rw-r--r--gnu/lib/libg++/include/values.h (renamed from gnu/lib/libg++/g++-include/values.h)11
-rw-r--r--gnu/lib/libg++/libg++/CursesW.cc2
-rw-r--r--gnu/lib/libg++/libg++/Makefile10
-rw-r--r--gnu/lib/libmalloc/Makefile4
-rw-r--r--gnu/lib/libreadline/COPYING257
-rw-r--r--gnu/lib/libreadline/ChangeLog403
-rw-r--r--gnu/lib/libreadline/Makefile25
-rw-r--r--gnu/lib/libreadline/README6
-rw-r--r--gnu/lib/libreadline/README.FreeBSD21
-rw-r--r--gnu/lib/libreadline/STANDALONE32
-rw-r--r--gnu/lib/libreadline/VERSION1
-rw-r--r--gnu/lib/libreadline/ansi_stdlib.h41
-rw-r--r--gnu/lib/libreadline/bind.c1476
-rw-r--r--gnu/lib/libreadline/complete.c1381
-rw-r--r--gnu/lib/libreadline/display.c1017
-rw-r--r--gnu/lib/libreadline/doc/Makefile34
-rw-r--r--gnu/lib/libreadline/doc/hist.texinfo106
-rw-r--r--gnu/lib/libreadline/doc/hstech.texinfo308
-rw-r--r--gnu/lib/libreadline/doc/hsuser.texinfo197
-rw-r--r--gnu/lib/libreadline/doc/rlman.texinfo103
-rw-r--r--gnu/lib/libreadline/doc/rltech.texinfo1012
-rw-r--r--gnu/lib/libreadline/doc/rluser.texinfo865
-rw-r--r--gnu/lib/libreadline/doc/texindex.c1666
-rw-r--r--gnu/lib/libreadline/emacs_keymap.c885
-rw-r--r--gnu/lib/libreadline/examples/Inputrc58
-rw-r--r--gnu/lib/libreadline/examples/Makefile12
-rw-r--r--gnu/lib/libreadline/examples/fileman.c395
-rw-r--r--gnu/lib/libreadline/examples/manexamp.c96
-rw-r--r--gnu/lib/libreadline/funmap.c (renamed from gnu/usr.bin/gdb/readline/funmap.c)262
-rw-r--r--gnu/lib/libreadline/history.c2136
-rw-r--r--gnu/lib/libreadline/isearch.c372
-rw-r--r--gnu/lib/libreadline/keymaps.c (renamed from gnu/usr.bin/gdb/readline/keymaps.c)61
-rw-r--r--gnu/lib/libreadline/memalloc.h56
-rw-r--r--gnu/lib/libreadline/parens.c118
-rw-r--r--gnu/lib/libreadline/posixstat.h149
-rw-r--r--gnu/lib/libreadline/readline.c3349
-rw-r--r--gnu/lib/libreadline/readline/chardefs.h89
-rw-r--r--gnu/lib/libreadline/readline/history.h (renamed from gnu/usr.bin/gdb/readline/history.h)45
-rw-r--r--gnu/lib/libreadline/readline/keymaps.h91
-rw-r--r--gnu/lib/libreadline/readline/readline.h267
-rw-r--r--gnu/lib/libreadline/readline/tilde.h38
-rw-r--r--gnu/lib/libreadline/rlconf.h57
-rw-r--r--gnu/lib/libreadline/rldefs.h190
-rw-r--r--gnu/lib/libreadline/rltty.c693
-rw-r--r--gnu/lib/libreadline/search.c360
-rw-r--r--gnu/lib/libreadline/signals.c303
-rw-r--r--gnu/lib/libreadline/tcsh_hack.readme27
-rw-r--r--gnu/lib/libreadline/tilde.c386
-rw-r--r--gnu/lib/libreadline/vi_keymap.c877
-rw-r--r--gnu/lib/libreadline/vi_mode.c1319
-rw-r--r--gnu/lib/libreadline/xmalloc.c78
-rw-r--r--gnu/lib/libregex/Makefile7
-rw-r--r--gnu/libexec/uucp/ChangeLog1669
-rw-r--r--gnu/libexec/uucp/Makefile.inc4
-rw-r--r--gnu/libexec/uucp/NEWS119
-rw-r--r--gnu/libexec/uucp/README107
-rw-r--r--gnu/libexec/uucp/TODO265
-rw-r--r--gnu/libexec/uucp/VERSION2
-rw-r--r--gnu/libexec/uucp/common_sources/chat.c61
-rw-r--r--gnu/libexec/uucp/common_sources/config.h (renamed from gnu/libexec/uucp/common_sources/conf.h)92
-rw-r--r--gnu/libexec/uucp/common_sources/conn.c251
-rw-r--r--gnu/libexec/uucp/common_sources/conn.h25
-rw-r--r--gnu/libexec/uucp/common_sources/copy.c4
-rw-r--r--gnu/libexec/uucp/common_sources/cu.h2
-rw-r--r--gnu/libexec/uucp/common_sources/log.c226
-rw-r--r--gnu/libexec/uucp/common_sources/policy.h205
-rw-r--r--gnu/libexec/uucp/common_sources/prot.c10
-rw-r--r--gnu/libexec/uucp/common_sources/prot.h7
-rw-r--r--gnu/libexec/uucp/common_sources/sysdep.h50
-rw-r--r--gnu/libexec/uucp/common_sources/system.h87
-rw-r--r--gnu/libexec/uucp/common_sources/tcp.c53
-rw-r--r--gnu/libexec/uucp/common_sources/tli.c116
-rw-r--r--gnu/libexec/uucp/common_sources/trans.h24
-rw-r--r--gnu/libexec/uucp/common_sources/util.c50
-rw-r--r--gnu/libexec/uucp/common_sources/uuconf.h60
-rw-r--r--gnu/libexec/uucp/common_sources/uucp.h37
-rw-r--r--gnu/libexec/uucp/common_sources/uudefs.h25
-rw-r--r--gnu/libexec/uucp/contrib/Makefile.uurt36
-rw-r--r--gnu/libexec/uucp/contrib/README44
-rw-r--r--gnu/libexec/uucp/contrib/README-UURATE17
-rw-r--r--gnu/libexec/uucp/contrib/amiga.c43
-rw-r--r--gnu/libexec/uucp/contrib/dialHDB.c187
-rw-r--r--gnu/libexec/uucp/contrib/uucomp.shar552
-rw-r--r--gnu/libexec/uucp/contrib/uudemon.shar82
-rw-r--r--gnu/libexec/uucp/contrib/uupoll.shar2696
-rw-r--r--gnu/libexec/uucp/contrib/uurate.c2237
-rw-r--r--gnu/libexec/uucp/contrib/uurate.man257
-rwxr-xr-xgnu/libexec/uucp/contrib/uureroute.perl91
-rw-r--r--gnu/libexec/uucp/contrib/uusnap.c2
-rw-r--r--gnu/libexec/uucp/contrib/uutraf35
-rwxr-xr-xgnu/libexec/uucp/contrib/uuxconv50
-rw-r--r--gnu/libexec/uucp/contrib/xchat.c109
-rw-r--r--gnu/libexec/uucp/contrib/xchat.man14
-rw-r--r--gnu/libexec/uucp/cu/Makefile4
-rw-r--r--gnu/libexec/uucp/cu/cu.165
-rw-r--r--gnu/libexec/uucp/cu/cu.c157
-rw-r--r--gnu/libexec/uucp/doc/uucp.texi4036
-rw-r--r--gnu/libexec/uucp/libunix/MANIFEST5
-rw-r--r--gnu/libexec/uucp/libunix/Makefile21
-rw-r--r--gnu/libexec/uucp/libunix/app3.c5
-rw-r--r--gnu/libexec/uucp/libunix/app4.c5
-rw-r--r--gnu/libexec/uucp/libunix/cohtty.c21
-rw-r--r--gnu/libexec/uucp/libunix/corrup.c33
-rw-r--r--gnu/libexec/uucp/libunix/cusub.c64
-rw-r--r--gnu/libexec/uucp/libunix/cwd.c7
-rw-r--r--gnu/libexec/uucp/libunix/detach.c10
-rw-r--r--gnu/libexec/uucp/libunix/dirent.c2
-rw-r--r--gnu/libexec/uucp/libunix/dup2.c2
-rw-r--r--gnu/libexec/uucp/libunix/epopen.c4
-rw-r--r--gnu/libexec/uucp/libunix/filnam.c6
-rw-r--r--gnu/libexec/uucp/libunix/fsusg.c128
-rw-r--r--gnu/libexec/uucp/libunix/ftw.c12
-rw-r--r--gnu/libexec/uucp/libunix/indir.c2
-rw-r--r--gnu/libexec/uucp/libunix/init.c28
-rw-r--r--gnu/libexec/uucp/libunix/iswait.c2
-rw-r--r--gnu/libexec/uucp/libunix/jobid.c2
-rw-r--r--gnu/libexec/uucp/libunix/lcksys.c39
-rw-r--r--gnu/libexec/uucp/libunix/locfil.c12
-rw-r--r--gnu/libexec/uucp/libunix/lock.c279
-rw-r--r--gnu/libexec/uucp/libunix/loctim.c4
-rw-r--r--gnu/libexec/uucp/libunix/mail.c52
-rw-r--r--gnu/libexec/uucp/libunix/mkdir.c2
-rw-r--r--gnu/libexec/uucp/libunix/mkdirs.c20
-rw-r--r--gnu/libexec/uucp/libunix/move.c24
-rw-r--r--gnu/libexec/uucp/libunix/opensr.c24
-rw-r--r--gnu/libexec/uucp/libunix/pause.c10
-rw-r--r--gnu/libexec/uucp/libunix/picksb.c14
-rw-r--r--gnu/libexec/uucp/libunix/pipe.c294
-rw-r--r--gnu/libexec/uucp/libunix/priv.c24
-rw-r--r--gnu/libexec/uucp/libunix/proctm.c6
-rw-r--r--gnu/libexec/uucp/libunix/recep.c12
-rw-r--r--gnu/libexec/uucp/libunix/run.c52
-rw-r--r--gnu/libexec/uucp/libunix/seq.c4
-rw-r--r--gnu/libexec/uucp/libunix/serial.c666
-rw-r--r--gnu/libexec/uucp/libunix/signal.c2
-rw-r--r--gnu/libexec/uucp/libunix/sindir.c5
-rw-r--r--gnu/libexec/uucp/libunix/sleep.c12
-rw-r--r--gnu/libexec/uucp/libunix/spawn.c55
-rw-r--r--gnu/libexec/uucp/libunix/splcmd.c44
-rw-r--r--gnu/libexec/uucp/libunix/spool.c43
-rw-r--r--gnu/libexec/uucp/libunix/srmdir.c6
-rw-r--r--gnu/libexec/uucp/libunix/statsb.c126
-rw-r--r--gnu/libexec/uucp/libunix/status.c6
-rw-r--r--gnu/libexec/uucp/libunix/strerr.c2
-rw-r--r--gnu/libexec/uucp/libunix/tmpfil.c5
-rw-r--r--gnu/libexec/uucp/libunix/uacces.c2
-rw-r--r--gnu/libexec/uucp/libunix/ufopen.c2
-rw-r--r--gnu/libexec/uucp/libunix/walk.c5
-rw-r--r--gnu/libexec/uucp/libunix/wldcrd.c7
-rw-r--r--gnu/libexec/uucp/libunix/work.c92
-rw-r--r--gnu/libexec/uucp/libunix/xqtfil.c11
-rw-r--r--gnu/libexec/uucp/libunix/xqtsub.c32
-rw-r--r--gnu/libexec/uucp/libuuconf/MANIFEST1
-rw-r--r--gnu/libexec/uucp/libuuconf/Makefile26
-rw-r--r--gnu/libexec/uucp/libuuconf/README4
-rw-r--r--gnu/libexec/uucp/libuuconf/addblk.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/addstr.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/allblk.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/alloc.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/alloc.h2
-rw-r--r--gnu/libexec/uucp/libuuconf/base.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/bool.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/callin.c118
-rw-r--r--gnu/libexec/uucp/libuuconf/calout.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/chatc.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/cmdarg.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/cmdfil.c9
-rw-r--r--gnu/libexec/uucp/libuuconf/cmdlin.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/debfil.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/deblev.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/diacod.c6
-rw-r--r--gnu/libexec/uucp/libuuconf/dial.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/diasub.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/dnams.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/errno.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/errstr.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/filnam.c6
-rw-r--r--gnu/libexec/uucp/libuuconf/freblk.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/fredia.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/free.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/freprt.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/fresys.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/grdcmp.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/hdial.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/hdnams.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/hinit.c8
-rw-r--r--gnu/libexec/uucp/libuuconf/hlocnm.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/hport.c46
-rw-r--r--gnu/libexec/uucp/libuuconf/hrmunk.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/hsinfo.c17
-rw-r--r--gnu/libexec/uucp/libuuconf/hsnams.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/hsys.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/hunk.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/iniglb.c7
-rw-r--r--gnu/libexec/uucp/libuuconf/init.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/int.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/lckdir.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/lineno.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/llocnm.c15
-rw-r--r--gnu/libexec/uucp/libuuconf/local.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/locnm.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/logfil.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/maxuxq.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/mrgblk.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/paramc.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/port.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/prtsub.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/pubdir.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/rdlocs.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/rdperm.c36
-rw-r--r--gnu/libexec/uucp/libuuconf/reliab.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/remunk.c19
-rw-r--r--gnu/libexec/uucp/libuuconf/runuxq.c77
-rw-r--r--gnu/libexec/uucp/libuuconf/sinfo.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/snams.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/split.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/spool.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/stafil.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/syshdr.h38
-rw-r--r--gnu/libexec/uucp/libuuconf/syssub.c71
-rw-r--r--gnu/libexec/uucp/libuuconf/tcalou.c16
-rw-r--r--gnu/libexec/uucp/libuuconf/tdial.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/tdialc.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/tdnams.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/tgcmp.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/thread.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/time.c9
-rw-r--r--gnu/libexec/uucp/libuuconf/tinit.c123
-rw-r--r--gnu/libexec/uucp/libuuconf/tlocnm.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/tport.c12
-rw-r--r--gnu/libexec/uucp/libuuconf/tportc.c78
-rw-r--r--gnu/libexec/uucp/libuuconf/tsinfo.c30
-rw-r--r--gnu/libexec/uucp/libuuconf/tsnams.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/tsys.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/tval.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/ugtlin.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/unk.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/uucnfi.h12
-rw-r--r--gnu/libexec/uucp/libuuconf/val.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/vinit.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/vport.c9
-rw-r--r--gnu/libexec/uucp/libuuconf/vsinfo.c16
-rw-r--r--gnu/libexec/uucp/libuuconf/vsnams.c4
-rw-r--r--gnu/libexec/uucp/libuuconf/vsys.c4
-rw-r--r--gnu/libexec/uucp/libuucp/MANIFEST1
-rw-r--r--gnu/libexec/uucp/libuucp/Makefile7
-rw-r--r--gnu/libexec/uucp/libuucp/buffer.c24
-rw-r--r--gnu/libexec/uucp/libuucp/debug.c10
-rw-r--r--gnu/libexec/uucp/libuucp/getlin.c2
-rw-r--r--gnu/libexec/uucp/libuucp/parse.c20
-rw-r--r--gnu/libexec/uucp/libuucp/status.c18
-rw-r--r--gnu/libexec/uucp/libuucp/strtou.c21
-rw-r--r--gnu/libexec/uucp/sample/Makefile6
-rw-r--r--gnu/libexec/uucp/sample/call.sample (renamed from gnu/libexec/uucp/sample/call)0
-rw-r--r--gnu/libexec/uucp/sample/config.sample (renamed from gnu/libexec/uucp/sample/config)0
-rw-r--r--gnu/libexec/uucp/sample/dial.sample (renamed from gnu/libexec/uucp/sample/dial)6
-rw-r--r--gnu/libexec/uucp/sample/dialcode.sample (renamed from gnu/libexec/uucp/sample/dialcode)0
-rw-r--r--gnu/libexec/uucp/sample/passwd.sample (renamed from gnu/libexec/uucp/sample/passwd)0
-rw-r--r--gnu/libexec/uucp/sample/port.sample (renamed from gnu/libexec/uucp/sample/port)0
-rw-r--r--gnu/libexec/uucp/sample/sys1.sample (renamed from gnu/libexec/uucp/sample/sys1)0
-rw-r--r--gnu/libexec/uucp/sample/sys2.sample (renamed from gnu/libexec/uucp/sample/sys2)0
-rw-r--r--gnu/libexec/uucp/tstuu.c25
-rw-r--r--gnu/libexec/uucp/uuchk/Makefile4
-rw-r--r--gnu/libexec/uucp/uuchk/uuchk.c149
-rw-r--r--gnu/libexec/uucp/uucico/Makefile6
-rw-r--r--gnu/libexec/uucp/uucico/prote.c4
-rw-r--r--gnu/libexec/uucp/uucico/protf.c14
-rw-r--r--gnu/libexec/uucp/uucico/protg.c83
-rw-r--r--gnu/libexec/uucp/uucico/proti.c261
-rw-r--r--gnu/libexec/uucp/uucico/protj.c7
-rw-r--r--gnu/libexec/uucp/uucico/prott.c7
-rw-r--r--gnu/libexec/uucp/uucico/protz.c4
-rw-r--r--gnu/libexec/uucp/uucico/rec.c238
-rw-r--r--gnu/libexec/uucp/uucico/send.c271
-rw-r--r--gnu/libexec/uucp/uucico/time.c10
-rw-r--r--gnu/libexec/uucp/uucico/trans.c118
-rw-r--r--gnu/libexec/uucp/uucico/uucico.8176
-rw-r--r--gnu/libexec/uucp/uucico/uucico.c762
-rw-r--r--gnu/libexec/uucp/uucico/xcmd.c31
-rw-r--r--gnu/libexec/uucp/uuconv/Makefile4
-rw-r--r--gnu/libexec/uucp/uuconv/uuconv.c130
-rw-r--r--gnu/libexec/uucp/uucp/Makefile4
-rw-r--r--gnu/libexec/uucp/uucp/uucp.155
-rw-r--r--gnu/libexec/uucp/uucp/uucp.c186
-rw-r--r--gnu/libexec/uucp/uulog/uulog.c132
-rw-r--r--gnu/libexec/uucp/uuname/uuname.c88
-rw-r--r--gnu/libexec/uucp/uupick/uupick.c81
-rw-r--r--gnu/libexec/uucp/uusched/uusched.in6
-rw-r--r--gnu/libexec/uucp/uustat/uustat.1404
-rw-r--r--gnu/libexec/uucp/uustat/uustat.c395
-rw-r--r--gnu/libexec/uucp/uuto/uuto.in6
-rw-r--r--gnu/libexec/uucp/uux/Makefile4
-rw-r--r--gnu/libexec/uucp/uux/uux.197
-rw-r--r--gnu/libexec/uucp/uux/uux.c295
-rw-r--r--gnu/libexec/uucp/uuxqt/Makefile7
-rw-r--r--gnu/libexec/uucp/uuxqt/uuxqt.837
-rw-r--r--gnu/libexec/uucp/uuxqt/uuxqt.c292
-rw-r--r--gnu/usr.bin/Makefile6
-rw-r--r--gnu/usr.bin/awk/ACKNOWLEDGMENT8
-rw-r--r--gnu/usr.bin/awk/FUTURES69
-rw-r--r--gnu/usr.bin/awk/LIMITATIONS2
-rw-r--r--gnu/usr.bin/awk/Makefile20
-rw-r--r--gnu/usr.bin/awk/NEWS207
-rw-r--r--gnu/usr.bin/awk/PORTS9
-rw-r--r--gnu/usr.bin/awk/PROBLEMS6
-rw-r--r--gnu/usr.bin/awk/README25
-rw-r--r--gnu/usr.bin/awk/array.c300
-rw-r--r--gnu/usr.bin/awk/awk.1158
-rw-r--r--gnu/usr.bin/awk/awk.h115
-rw-r--r--gnu/usr.bin/awk/awk.y144
-rw-r--r--gnu/usr.bin/awk/builtin.c670
-rw-r--r--gnu/usr.bin/awk/config.h38
-rw-r--r--gnu/usr.bin/awk/dfa.c2837
-rw-r--r--gnu/usr.bin/awk/dfa.h425
-rw-r--r--gnu/usr.bin/awk/eval.c113
-rw-r--r--gnu/usr.bin/awk/field.c119
-rw-r--r--gnu/usr.bin/awk/getopt.c203
-rw-r--r--gnu/usr.bin/awk/getopt.h31
-rw-r--r--gnu/usr.bin/awk/getopt1.c81
-rw-r--r--gnu/usr.bin/awk/io.c221
-rw-r--r--gnu/usr.bin/awk/iop.c27
-rw-r--r--gnu/usr.bin/awk/main.c178
-rw-r--r--gnu/usr.bin/awk/msg.c11
-rw-r--r--gnu/usr.bin/awk/node.c68
-rw-r--r--gnu/usr.bin/awk/patchlevel.h2
-rw-r--r--gnu/usr.bin/awk/protos.h45
-rw-r--r--gnu/usr.bin/awk/re.c46
-rw-r--r--gnu/usr.bin/awk/regex.c6330
-rw-r--r--gnu/usr.bin/awk/regex.h675
-rw-r--r--gnu/usr.bin/awk/version.c3
-rw-r--r--gnu/usr.bin/cc/cc/gcc.c6
-rw-r--r--gnu/usr.bin/cc/cpp/cccp.c2
-rw-r--r--gnu/usr.bin/cc/lib/Makefile5
-rw-r--r--gnu/usr.bin/cc/libgcc/Makefile17
-rw-r--r--gnu/usr.bin/cc/libgcc/libgcc2.c5
-rw-r--r--gnu/usr.bin/cc25/Freebsd.gcc258.patch39
-rw-r--r--gnu/usr.bin/cc25/Makefile6
-rw-r--r--gnu/usr.bin/cc25/README209
-rw-r--r--gnu/usr.bin/cc25/gcc258-freebsd.patch1188
-rwxr-xr-xgnu/usr.bin/cc25/gnu2bsd.tcl470
-rw-r--r--gnu/usr.bin/cc25/usr.bin.cpp/Makefile10
-rw-r--r--gnu/usr.bin/cc25/usr.bin.cpp/cpp.script91
-rw-r--r--gnu/usr.bin/cc25/usr.bin.f77/Makefile7
-rw-r--r--gnu/usr.bin/cc25/usr.bin.f77/f77.script114
-rw-r--r--gnu/usr.bin/cvs/cvs/Makefile11
-rw-r--r--gnu/usr.bin/cvs/cvs/checkin.c7
-rw-r--r--gnu/usr.bin/cvs/cvs/checkout.c16
-rw-r--r--gnu/usr.bin/cvs/cvs/cvs.h6
-rw-r--r--gnu/usr.bin/cvs/cvs/diff.c26
-rw-r--r--gnu/usr.bin/cvs/cvs/ignore.c2
-rw-r--r--gnu/usr.bin/cvs/cvs/import.c6
-rw-r--r--gnu/usr.bin/cvs/cvs/main.c16
-rw-r--r--gnu/usr.bin/cvs/cvs/patch.c24
-rw-r--r--gnu/usr.bin/cvs/cvs/release.c4
-rw-r--r--gnu/usr.bin/cvs/cvs/update.c27
-rw-r--r--gnu/usr.bin/gdb/COPYING354
-rw-r--r--gnu/usr.bin/gdb/COPYING.LIB481
-rw-r--r--gnu/usr.bin/gdb/Makefile39
-rw-r--r--gnu/usr.bin/gdb/README.FreeBSD15
-rw-r--r--gnu/usr.bin/gdb/VERSION1
-rw-r--r--gnu/usr.bin/gdb/bfd/COPYING339
-rw-r--r--gnu/usr.bin/gdb/bfd/Makefile17
-rw-r--r--gnu/usr.bin/gdb/bfd/README.FreeBSD7
-rw-r--r--gnu/usr.bin/gdb/bfd/VERSION1
-rw-r--r--gnu/usr.bin/gdb/bfd/aout-target.h429
-rw-r--r--gnu/usr.bin/gdb/bfd/aout32.c23
-rw-r--r--gnu/usr.bin/gdb/bfd/aoutx.h2568
-rw-r--r--gnu/usr.bin/gdb/bfd/archive.c1770
-rw-r--r--gnu/usr.bin/gdb/bfd/archures.c731
-rw-r--r--gnu/usr.bin/gdb/bfd/bfd.c733
-rw-r--r--gnu/usr.bin/gdb/bfd/bfd.h1803
-rw-r--r--gnu/usr.bin/gdb/bfd/cache.c311
-rw-r--r--gnu/usr.bin/gdb/bfd/coffgen.c1519
-rw-r--r--gnu/usr.bin/gdb/bfd/core.c106
-rw-r--r--gnu/usr.bin/gdb/bfd/cpu-i386.c43
-rw-r--r--gnu/usr.bin/gdb/bfd/ctor.c148
-rw-r--r--gnu/usr.bin/gdb/bfd/ecoff.c3994
-rw-r--r--gnu/usr.bin/gdb/bfd/elf.c248
-rw-r--r--gnu/usr.bin/gdb/bfd/format.c258
-rw-r--r--gnu/usr.bin/gdb/bfd/freebsd386.c110
-rw-r--r--gnu/usr.bin/gdb/bfd/init.c78
-rw-r--r--gnu/usr.bin/gdb/bfd/libaout.h393
-rw-r--r--gnu/usr.bin/gdb/bfd/libbfd.c850
-rw-r--r--gnu/usr.bin/gdb/bfd/libbfd.h273
-rw-r--r--gnu/usr.bin/gdb/bfd/libcoff.h352
-rw-r--r--gnu/usr.bin/gdb/bfd/libecoff.h265
-rw-r--r--gnu/usr.bin/gdb/bfd/libelf.h249
-rw-r--r--gnu/usr.bin/gdb/bfd/opncls.c534
-rw-r--r--gnu/usr.bin/gdb/bfd/reloc.c1225
-rw-r--r--gnu/usr.bin/gdb/bfd/seclet.c185
-rw-r--r--gnu/usr.bin/gdb/bfd/seclet.h55
-rw-r--r--gnu/usr.bin/gdb/bfd/section.c899
-rw-r--r--gnu/usr.bin/gdb/bfd/srec.c1001
-rw-r--r--gnu/usr.bin/gdb/bfd/stab-syms.c59
-rw-r--r--gnu/usr.bin/gdb/bfd/syms.c527
-rw-r--r--gnu/usr.bin/gdb/bfd/sysdep.h47
-rw-r--r--gnu/usr.bin/gdb/bfd/targets.c635
-rw-r--r--gnu/usr.bin/gdb/bfd/trad-core.c384
-rw-r--r--gnu/usr.bin/gdb/doc/ChangeLog783
-rw-r--r--gnu/usr.bin/gdb/doc/Makefile340
-rw-r--r--gnu/usr.bin/gdb/doc/Makefile.in327
-rw-r--r--gnu/usr.bin/gdb/doc/a4rc.sed11
-rw-r--r--gnu/usr.bin/gdb/doc/all-cfg.texi117
-rwxr-xr-xgnu/usr.bin/gdb/doc/config.status5
-rw-r--r--gnu/usr.bin/gdb/doc/configure.in7
-rw-r--r--gnu/usr.bin/gdb/doc/gdb-cfg.texi117
-rw-r--r--gnu/usr.bin/gdb/doc/gdb.info213
-rw-r--r--gnu/usr.bin/gdb/doc/gdb.info-11304
-rw-r--r--gnu/usr.bin/gdb/doc/gdb.info-21165
-rw-r--r--gnu/usr.bin/gdb/doc/gdb.info-31264
-rw-r--r--gnu/usr.bin/gdb/doc/gdb.info-41349
-rw-r--r--gnu/usr.bin/gdb/doc/gdb.info-51215
-rw-r--r--gnu/usr.bin/gdb/doc/gdb.info-61220
-rw-r--r--gnu/usr.bin/gdb/doc/gdb.info-71233
-rw-r--r--gnu/usr.bin/gdb/doc/gdb.info-8657
-rw-r--r--gnu/usr.bin/gdb/doc/gdb.texinfo8591
-rw-r--r--gnu/usr.bin/gdb/doc/gdbint.texinfo2658
-rw-r--r--gnu/usr.bin/gdb/doc/h8-cfg.texi47
-rw-r--r--gnu/usr.bin/gdb/doc/libgdb.texinfo1471
-rw-r--r--gnu/usr.bin/gdb/doc/lpsrc.sed13
-rw-r--r--gnu/usr.bin/gdb/doc/psrc.sed13
-rw-r--r--gnu/usr.bin/gdb/doc/refcard.ps798
-rw-r--r--gnu/usr.bin/gdb/doc/refcard.tex646
-rw-r--r--gnu/usr.bin/gdb/doc/remote.texi1294
-rw-r--r--gnu/usr.bin/gdb/doc/stabs.texinfo3795
-rw-r--r--gnu/usr.bin/gdb/gdb.13
-rw-r--r--gnu/usr.bin/gdb/gdb/COPYING339
-rw-r--r--gnu/usr.bin/gdb/gdb/Makefile72
-rw-r--r--gnu/usr.bin/gdb/gdb/ansidecl.h139
-rw-r--r--gnu/usr.bin/gdb/gdb/aout/aout64.h431
-rw-r--r--gnu/usr.bin/gdb/gdb/aout/ar.h32
-rw-r--r--gnu/usr.bin/gdb/gdb/aout/ranlib.h62
-rw-r--r--gnu/usr.bin/gdb/gdb/aout/stab.def264
-rw-r--r--gnu/usr.bin/gdb/gdb/aout/stab_gnu.h36
-rw-r--r--gnu/usr.bin/gdb/gdb/blockframe.c821
-rw-r--r--gnu/usr.bin/gdb/gdb/breakpoint.c3301
-rw-r--r--gnu/usr.bin/gdb/gdb/breakpoint.h372
-rw-r--r--gnu/usr.bin/gdb/gdb/buildsym.c950
-rw-r--r--gnu/usr.bin/gdb/gdb/buildsym.h259
-rw-r--r--gnu/usr.bin/gdb/gdb/c-exp.y1601
-rw-r--r--gnu/usr.bin/gdb/gdb/c-lang.c447
-rw-r--r--gnu/usr.bin/gdb/gdb/c-lang.h31
-rw-r--r--gnu/usr.bin/gdb/gdb/c-typeprint.c797
-rw-r--r--gnu/usr.bin/gdb/gdb/c-valprint.c416
-rw-r--r--gnu/usr.bin/gdb/gdb/call-cmds.h28
-rw-r--r--gnu/usr.bin/gdb/gdb/ch-exp.y1997
-rw-r--r--gnu/usr.bin/gdb/gdb/ch-lang.c341
-rw-r--r--gnu/usr.bin/gdb/gdb/ch-lang.h31
-rw-r--r--gnu/usr.bin/gdb/gdb/ch-typeprint.c225
-rw-r--r--gnu/usr.bin/gdb/gdb/ch-valprint.c332
-rw-r--r--gnu/usr.bin/gdb/gdb/coff/ecoff.h262
-rw-r--r--gnu/usr.bin/gdb/gdb/coff/internal.h538
-rw-r--r--gnu/usr.bin/gdb/gdb/coff/sym.h477
-rw-r--r--gnu/usr.bin/gdb/gdb/coff/symconst.h175
-rw-r--r--gnu/usr.bin/gdb/gdb/coffread.c2071
-rw-r--r--gnu/usr.bin/gdb/gdb/command.c1310
-rw-r--r--gnu/usr.bin/gdb/gdb/command.h241
-rw-r--r--gnu/usr.bin/gdb/gdb/complaints.c158
-rw-r--r--gnu/usr.bin/gdb/gdb/complaints.h46
-rw-r--r--gnu/usr.bin/gdb/gdb/copying.c327
-rw-r--r--gnu/usr.bin/gdb/gdb/core.c291
-rw-r--r--gnu/usr.bin/gdb/gdb/coredep.c118
-rw-r--r--gnu/usr.bin/gdb/gdb/corelow.c328
-rw-r--r--gnu/usr.bin/gdb/gdb/cp-valprint.c484
-rw-r--r--gnu/usr.bin/gdb/gdb/dbxread.c2234
-rw-r--r--gnu/usr.bin/gdb/gdb/dcache.c236
-rw-r--r--gnu/usr.bin/gdb/gdb/dcache.h83
-rw-r--r--gnu/usr.bin/gdb/gdb/defs.h901
-rw-r--r--gnu/usr.bin/gdb/gdb/demangle.c190
-rw-r--r--gnu/usr.bin/gdb/gdb/demangle.h77
-rw-r--r--gnu/usr.bin/gdb/gdb/dis-asm.h176
-rw-r--r--gnu/usr.bin/gdb/gdb/dis-buf.c69
-rw-r--r--gnu/usr.bin/gdb/gdb/dwarfread.c3866
-rw-r--r--gnu/usr.bin/gdb/gdb/elf/common.h216
-rw-r--r--gnu/usr.bin/gdb/gdb/elf/dwarf.h314
-rw-r--r--gnu/usr.bin/gdb/gdb/elf/external.h190
-rw-r--r--gnu/usr.bin/gdb/gdb/elf/internal.h195
-rw-r--r--gnu/usr.bin/gdb/gdb/elfread.c729
-rw-r--r--gnu/usr.bin/gdb/gdb/environ.c198
-rw-r--r--gnu/usr.bin/gdb/gdb/environ.h58
-rw-r--r--gnu/usr.bin/gdb/gdb/eval.c1213
-rw-r--r--gnu/usr.bin/gdb/gdb/exec.c489
-rw-r--r--gnu/usr.bin/gdb/gdb/expprint.c623
-rw-r--r--gnu/usr.bin/gdb/gdb/expression.h313
-rw-r--r--gnu/usr.bin/gdb/gdb/findvar.c971
-rw-r--r--gnu/usr.bin/gdb/gdb/fopen-same.h27
-rw-r--r--gnu/usr.bin/gdb/gdb/fork-child.c310
-rw-r--r--gnu/usr.bin/gdb/gdb/frame.h238
-rw-r--r--gnu/usr.bin/gdb/gdb/freebsd-nat.c323
-rw-r--r--gnu/usr.bin/gdb/gdb/freebsd-solib.c1469
-rw-r--r--gnu/usr.bin/gdb/gdb/gdb-stabs.h76
-rw-r--r--gnu/usr.bin/gdb/gdb/gdb.1371
-rw-r--r--gnu/usr.bin/gdb/gdb/gdbcmd.h101
-rw-r--r--gnu/usr.bin/gdb/gdb/gdbcore.h129
-rw-r--r--gnu/usr.bin/gdb/gdb/gdbtypes.c1440
-rw-r--r--gnu/usr.bin/gdb/gdb/gdbtypes.h704
-rw-r--r--gnu/usr.bin/gdb/gdb/getopt.h129
-rw-r--r--gnu/usr.bin/gdb/gdb/i386-dis.c1952
-rw-r--r--gnu/usr.bin/gdb/gdb/i386-pinsn.c37
-rw-r--r--gnu/usr.bin/gdb/gdb/i386-tdep.c595
-rw-r--r--gnu/usr.bin/gdb/gdb/infcmd.c1423
-rw-r--r--gnu/usr.bin/gdb/gdb/inferior.h401
-rw-r--r--gnu/usr.bin/gdb/gdb/inflow.c662
-rw-r--r--gnu/usr.bin/gdb/gdb/infptrace.c436
-rw-r--r--gnu/usr.bin/gdb/gdb/infrun.c1848
-rw-r--r--gnu/usr.bin/gdb/gdb/inftarg.c310
-rw-r--r--gnu/usr.bin/gdb/gdb/init.c47
-rw-r--r--gnu/usr.bin/gdb/gdb/language.c1332
-rw-r--r--gnu/usr.bin/gdb/gdb/language.h413
-rw-r--r--gnu/usr.bin/gdb/gdb/m2-exp.y1169
-rw-r--r--gnu/usr.bin/gdb/gdb/m2-lang.c457
-rw-r--r--gnu/usr.bin/gdb/gdb/m2-lang.h31
-rw-r--r--gnu/usr.bin/gdb/gdb/m2-typeprint.c49
-rw-r--r--gnu/usr.bin/gdb/gdb/m2-valprint.c45
-rw-r--r--gnu/usr.bin/gdb/gdb/main.c2799
-rw-r--r--gnu/usr.bin/gdb/gdb/maint.c305
-rw-r--r--gnu/usr.bin/gdb/gdb/mem-break.c104
-rw-r--r--gnu/usr.bin/gdb/gdb/minsyms.c597
-rw-r--r--gnu/usr.bin/gdb/gdb/mipsread.c3653
-rw-r--r--gnu/usr.bin/gdb/gdb/nlmread.c300
-rw-r--r--gnu/usr.bin/gdb/gdb/nm.h44
-rw-r--r--gnu/usr.bin/gdb/gdb/objfiles.c773
-rw-r--r--gnu/usr.bin/gdb/gdb/objfiles.h437
-rw-r--r--gnu/usr.bin/gdb/gdb/obstack.h490
-rw-r--r--gnu/usr.bin/gdb/gdb/parse.c827
-rw-r--r--gnu/usr.bin/gdb/gdb/parser-defs.h188
-rw-r--r--gnu/usr.bin/gdb/gdb/partial-stab.h618
-rw-r--r--gnu/usr.bin/gdb/gdb/printcmd.c2078
-rw-r--r--gnu/usr.bin/gdb/gdb/putenv.c111
-rw-r--r--gnu/usr.bin/gdb/gdb/regex.c1725
-rw-r--r--gnu/usr.bin/gdb/gdb/regex.h179
-rw-r--r--gnu/usr.bin/gdb/gdb/remote-utils.c645
-rw-r--r--gnu/usr.bin/gdb/gdb/remote-utils.h149
-rw-r--r--gnu/usr.bin/gdb/gdb/remote.c1272
-rw-r--r--gnu/usr.bin/gdb/gdb/ser-unix.c633
-rw-r--r--gnu/usr.bin/gdb/gdb/serial.c261
-rw-r--r--gnu/usr.bin/gdb/gdb/serial.h153
-rw-r--r--gnu/usr.bin/gdb/gdb/signals.h27
-rw-r--r--gnu/usr.bin/gdb/gdb/solib.h56
-rw-r--r--gnu/usr.bin/gdb/gdb/source.c1398
-rw-r--r--gnu/usr.bin/gdb/gdb/stabsread.c3770
-rw-r--r--gnu/usr.bin/gdb/gdb/stabsread.h194
-rw-r--r--gnu/usr.bin/gdb/gdb/stack.c1379
-rw-r--r--gnu/usr.bin/gdb/gdb/symfile.c1489
-rw-r--r--gnu/usr.bin/gdb/gdb/symfile.h228
-rw-r--r--gnu/usr.bin/gdb/gdb/symmisc.c857
-rw-r--r--gnu/usr.bin/gdb/gdb/symtab.c3035
-rw-r--r--gnu/usr.bin/gdb/gdb/symtab.h1124
-rw-r--r--gnu/usr.bin/gdb/gdb/target.c789
-rw-r--r--gnu/usr.bin/gdb/gdb/target.h465
-rw-r--r--gnu/usr.bin/gdb/gdb/terminal.h62
-rw-r--r--gnu/usr.bin/gdb/gdb/thread.c248
-rw-r--r--gnu/usr.bin/gdb/gdb/thread.h36
-rw-r--r--gnu/usr.bin/gdb/gdb/tm-i386v.h309
-rw-r--r--gnu/usr.bin/gdb/gdb/tm.h76
-rw-r--r--gnu/usr.bin/gdb/gdb/typeprint.c297
-rw-r--r--gnu/usr.bin/gdb/gdb/typeprint.h21
-rw-r--r--gnu/usr.bin/gdb/gdb/utils.c1547
-rw-r--r--gnu/usr.bin/gdb/gdb/valarith.c969
-rw-r--r--gnu/usr.bin/gdb/gdb/valops.c1819
-rw-r--r--gnu/usr.bin/gdb/gdb/valprint.c1063
-rw-r--r--gnu/usr.bin/gdb/gdb/valprint.h40
-rw-r--r--gnu/usr.bin/gdb/gdb/value.h502
-rw-r--r--gnu/usr.bin/gdb/gdb/values.c1502
-rw-r--r--gnu/usr.bin/gdb/gdb/version.c3
-rw-r--r--gnu/usr.bin/gdb/gdb/wait.h38
-rw-r--r--gnu/usr.bin/gdb/gdb/xm.h31
-rw-r--r--gnu/usr.bin/gdb/libiberty/COPYING.LIB481
-rw-r--r--gnu/usr.bin/gdb/libiberty/Makefile13
-rw-r--r--gnu/usr.bin/gdb/libiberty/README.FreeBSD7
-rw-r--r--gnu/usr.bin/gdb/libiberty/alloca-conf.h11
-rw-r--r--gnu/usr.bin/gdb/libiberty/argv.c332
-rw-r--r--gnu/usr.bin/gdb/libiberty/basename.c56
-rw-r--r--gnu/usr.bin/gdb/libiberty/concat.c118
-rw-r--r--gnu/usr.bin/gdb/libiberty/config.h1
-rw-r--r--gnu/usr.bin/gdb/libiberty/cplus-dem.c2669
-rw-r--r--gnu/usr.bin/gdb/libiberty/fdmatch.c71
-rw-r--r--gnu/usr.bin/gdb/libiberty/getopt.c750
-rw-r--r--gnu/usr.bin/gdb/libiberty/getopt1.c180
-rw-r--r--gnu/usr.bin/gdb/libiberty/ieee-float.c150
-rw-r--r--gnu/usr.bin/gdb/libiberty/ieee-float.h65
-rw-r--r--gnu/usr.bin/gdb/libiberty/obstack.c460
-rw-r--r--gnu/usr.bin/gdb/libiberty/sigsetmask.c44
-rw-r--r--gnu/usr.bin/gdb/libiberty/spaces.c67
-rw-r--r--gnu/usr.bin/gdb/libiberty/strerror.c811
-rw-r--r--gnu/usr.bin/gdb/libiberty/strsignal.c634
-rw-r--r--gnu/usr.bin/gdb/libiberty/xmalloc.c58
-rw-r--r--gnu/usr.bin/gdb/mmalloc/Makefile10
-rw-r--r--gnu/usr.bin/gdb/mmalloc/README.FreeBSD7
-rw-r--r--gnu/usr.bin/gdb/mmalloc/attach.c218
-rw-r--r--gnu/usr.bin/gdb/mmalloc/detach.c71
-rw-r--r--gnu/usr.bin/gdb/mmalloc/keys.c66
-rw-r--r--gnu/usr.bin/gdb/mmalloc/mcalloc.c53
-rw-r--r--gnu/usr.bin/gdb/mmalloc/mfree.c247
-rw-r--r--gnu/usr.bin/gdb/mmalloc/mmalloc.c334
-rw-r--r--gnu/usr.bin/gdb/mmalloc/mmalloc.h390
-rw-r--r--gnu/usr.bin/gdb/mmalloc/mmalloc.texi258
-rw-r--r--gnu/usr.bin/gdb/mmalloc/mmap-sup.c144
-rw-r--r--gnu/usr.bin/gdb/mmalloc/mmcheck.c196
-rw-r--r--gnu/usr.bin/gdb/mmalloc/mmemalign.c64
-rw-r--r--gnu/usr.bin/gdb/mmalloc/mmstats.c46
-rw-r--r--gnu/usr.bin/gdb/mmalloc/mmtrace.c166
-rw-r--r--gnu/usr.bin/gdb/mmalloc/mrealloc.c160
-rw-r--r--gnu/usr.bin/gdb/mmalloc/mvalloc.c40
-rw-r--r--gnu/usr.bin/gdb/mmalloc/sbrk-sup.c96
-rw-r--r--gnu/usr.bin/gdb/readline/ChangeLog98
-rw-r--r--gnu/usr.bin/gdb/readline/Makefile.gnu114
-rw-r--r--gnu/usr.bin/gdb/readline/chardefs.h50
-rw-r--r--gnu/usr.bin/gdb/readline/emacs_keymap.c472
-rw-r--r--gnu/usr.bin/gdb/readline/history.c1462
-rw-r--r--gnu/usr.bin/gdb/readline/keymaps.h53
-rw-r--r--gnu/usr.bin/gdb/readline/readline.c5557
-rw-r--r--gnu/usr.bin/gdb/readline/readline.h161
-rw-r--r--gnu/usr.bin/gdb/readline/vi_keymap.c484
-rw-r--r--gnu/usr.bin/gdb/readline/vi_mode.c875
-rw-r--r--gnu/usr.bin/groff/Makefile.cfg5
-rw-r--r--gnu/usr.bin/groff/addftinfo/Makefile1
-rw-r--r--gnu/usr.bin/groff/devices/devascii/R.proto19
-rw-r--r--gnu/usr.bin/groff/eqn/Makefile1
-rw-r--r--gnu/usr.bin/groff/grodvi/Makefile1
-rw-r--r--gnu/usr.bin/groff/groff/Makefile1
-rw-r--r--gnu/usr.bin/groff/grops/Makefile1
-rw-r--r--gnu/usr.bin/groff/grops/psrm.cc3
-rw-r--r--gnu/usr.bin/groff/grotty/Makefile1
-rw-r--r--gnu/usr.bin/groff/indxbib/Makefile1
-rw-r--r--gnu/usr.bin/groff/libbib/Makefile1
-rw-r--r--gnu/usr.bin/groff/libdriver/Makefile1
-rw-r--r--gnu/usr.bin/groff/libgroff/Makefile1
-rw-r--r--gnu/usr.bin/groff/lkbib/Makefile1
-rw-r--r--gnu/usr.bin/groff/lookbib/Makefile1
-rw-r--r--gnu/usr.bin/groff/pic/Makefile1
-rw-r--r--gnu/usr.bin/groff/refer/Makefile1
-rw-r--r--gnu/usr.bin/groff/soelim/Makefile1
-rw-r--r--gnu/usr.bin/groff/tbl/Makefile1
-rw-r--r--gnu/usr.bin/groff/tfmtodit/Makefile1
-rw-r--r--gnu/usr.bin/groff/troff/Makefile1
-rw-r--r--gnu/usr.bin/groff/xditview/device.c6
-rw-r--r--gnu/usr.bin/gzip/Makefile1
-rw-r--r--gnu/usr.bin/kgdb/COPYING249
-rw-r--r--gnu/usr.bin/kgdb/ChangeLog (renamed from gnu/usr.bin/gdb/ChangeLog)0
-rw-r--r--gnu/usr.bin/kgdb/Gdbinit (renamed from gnu/usr.bin/gdb/Gdbinit)0
-rw-r--r--gnu/usr.bin/kgdb/Makefile36
-rw-r--r--gnu/usr.bin/kgdb/Makefile.dist (renamed from gnu/usr.bin/gdb/Makefile.dist)0
-rw-r--r--gnu/usr.bin/kgdb/Projects (renamed from gnu/usr.bin/gdb/Projects)0
-rw-r--r--gnu/usr.bin/kgdb/README.gnu (renamed from gnu/usr.bin/gdb/README.gnu)0
-rw-r--r--gnu/usr.bin/kgdb/XGdbinit.samp (renamed from gnu/usr.bin/gdb/XGdbinit.samp)0
-rw-r--r--gnu/usr.bin/kgdb/Xgdb.ad (renamed from gnu/usr.bin/gdb/Xgdb.ad)0
-rw-r--r--gnu/usr.bin/kgdb/blockframe.c (renamed from gnu/usr.bin/gdb/blockframe.c)0
-rw-r--r--gnu/usr.bin/kgdb/breakpoint.c (renamed from gnu/usr.bin/gdb/breakpoint.c)0
-rw-r--r--gnu/usr.bin/kgdb/command.c (renamed from gnu/usr.bin/gdb/command.c)0
-rw-r--r--gnu/usr.bin/kgdb/command.h (renamed from gnu/usr.bin/gdb/command.h)0
-rw-r--r--gnu/usr.bin/kgdb/config/Makefile.i386 (renamed from gnu/usr.bin/gdb/config/Makefile.i386)0
-rw-r--r--gnu/usr.bin/kgdb/config/default-dep.c (renamed from gnu/usr.bin/gdb/config/default-dep.c)0
-rw-r--r--gnu/usr.bin/kgdb/config/i386-dep.c (renamed from gnu/usr.bin/gdb/config/i386-dep.c)0
-rw-r--r--gnu/usr.bin/kgdb/config/i386-pinsn.c (renamed from gnu/usr.bin/gdb/config/i386-pinsn.c)0
-rw-r--r--gnu/usr.bin/kgdb/config/i386bsd-dep.c (renamed from gnu/usr.bin/gdb/config/i386bsd-dep.c)3
-rw-r--r--gnu/usr.bin/kgdb/config/m-i386-sv32.h (renamed from gnu/usr.bin/gdb/config/m-i386-sv32.h)0
-rw-r--r--gnu/usr.bin/kgdb/config/m-i386.h (renamed from gnu/usr.bin/gdb/config/m-i386.h)0
-rw-r--r--gnu/usr.bin/kgdb/config/m-i386bsd.h (renamed from gnu/usr.bin/gdb/config/m-i386bsd.h)0
-rw-r--r--gnu/usr.bin/kgdb/config/m-i386g-sv32.h (renamed from gnu/usr.bin/gdb/config/m-i386g-sv32.h)0
-rw-r--r--gnu/usr.bin/kgdb/config/m-i386gas.h (renamed from gnu/usr.bin/gdb/config/m-i386gas.h)0
-rw-r--r--gnu/usr.bin/kgdb/copying.c (renamed from gnu/usr.bin/gdb/copying.c)0
-rw-r--r--gnu/usr.bin/kgdb/core.c (renamed from gnu/usr.bin/gdb/core.c)0
-rw-r--r--gnu/usr.bin/kgdb/cplus-dem.c (renamed from gnu/usr.bin/gdb/cplus-dem.c)0
-rw-r--r--gnu/usr.bin/kgdb/dbxread.c (renamed from gnu/usr.bin/gdb/dbxread.c)0
-rw-r--r--gnu/usr.bin/kgdb/defs.h (renamed from gnu/usr.bin/gdb/defs.h)0
-rw-r--r--gnu/usr.bin/kgdb/environ.c (renamed from gnu/usr.bin/gdb/environ.c)0
-rw-r--r--gnu/usr.bin/kgdb/environ.h (renamed from gnu/usr.bin/gdb/environ.h)0
-rw-r--r--gnu/usr.bin/kgdb/eval.c (renamed from gnu/usr.bin/gdb/eval.c)0
-rw-r--r--gnu/usr.bin/kgdb/expprint.c (renamed from gnu/usr.bin/gdb/expprint.c)0
-rw-r--r--gnu/usr.bin/kgdb/expread.y (renamed from gnu/usr.bin/gdb/expread.y)0
-rw-r--r--gnu/usr.bin/kgdb/expression.h (renamed from gnu/usr.bin/gdb/expression.h)0
-rw-r--r--gnu/usr.bin/kgdb/findvar.c (renamed from gnu/usr.bin/gdb/findvar.c)0
-rw-r--r--gnu/usr.bin/kgdb/frame.h (renamed from gnu/usr.bin/gdb/frame.h)0
-rw-r--r--gnu/usr.bin/kgdb/getpagesize.h (renamed from gnu/usr.bin/gdb/getpagesize.h)0
-rw-r--r--gnu/usr.bin/kgdb/infcmd.c (renamed from gnu/usr.bin/gdb/infcmd.c)0
-rw-r--r--gnu/usr.bin/kgdb/inferior.h (renamed from gnu/usr.bin/gdb/inferior.h)0
-rw-r--r--gnu/usr.bin/kgdb/inflow.c (renamed from gnu/usr.bin/gdb/inflow.c)0
-rw-r--r--gnu/usr.bin/kgdb/infrun.c (renamed from gnu/usr.bin/gdb/infrun.c)0
-rw-r--r--gnu/usr.bin/kgdb/kgdb.115
-rw-r--r--gnu/usr.bin/kgdb/kgdb_proto.h (renamed from gnu/usr.bin/gdb/kgdb_proto.h)2
-rw-r--r--gnu/usr.bin/kgdb/main.c (renamed from gnu/usr.bin/gdb/main.c)7
-rw-r--r--gnu/usr.bin/kgdb/ngdb.i386/Makefile (renamed from gnu/usr.bin/gdb/ngdb.i386/Makefile)0
-rw-r--r--gnu/usr.bin/kgdb/obstack.c (renamed from gnu/usr.bin/gdb/obstack.c)0
-rw-r--r--gnu/usr.bin/kgdb/obstack.h (renamed from gnu/usr.bin/gdb/obstack.h)0
-rw-r--r--gnu/usr.bin/kgdb/printcmd.c (renamed from gnu/usr.bin/gdb/printcmd.c)0
-rw-r--r--gnu/usr.bin/kgdb/regex.c (renamed from gnu/usr.bin/gdb/regex.c)0
-rw-r--r--gnu/usr.bin/kgdb/regex.h (renamed from gnu/usr.bin/gdb/regex.h)0
-rw-r--r--gnu/usr.bin/kgdb/remote-sl.c (renamed from gnu/usr.bin/gdb/remote-sl.c)0
-rw-r--r--gnu/usr.bin/kgdb/remote.c (renamed from gnu/usr.bin/gdb/remote.c)2
-rw-r--r--gnu/usr.bin/kgdb/source.c (renamed from gnu/usr.bin/gdb/source.c)0
-rw-r--r--gnu/usr.bin/kgdb/stab.def (renamed from gnu/usr.bin/gdb/stab.def)0
-rw-r--r--gnu/usr.bin/kgdb/stack.c (renamed from gnu/usr.bin/gdb/stack.c)0
-rw-r--r--gnu/usr.bin/kgdb/symmisc.c (renamed from gnu/usr.bin/gdb/symmisc.c)0
-rw-r--r--gnu/usr.bin/kgdb/symseg.h (renamed from gnu/usr.bin/gdb/symseg.h)0
-rw-r--r--gnu/usr.bin/kgdb/symtab.c (renamed from gnu/usr.bin/gdb/symtab.c)2
-rw-r--r--gnu/usr.bin/kgdb/symtab.h (renamed from gnu/usr.bin/gdb/symtab.h)0
-rw-r--r--gnu/usr.bin/kgdb/utils.c (renamed from gnu/usr.bin/gdb/utils.c)2
-rw-r--r--gnu/usr.bin/kgdb/valarith.c (renamed from gnu/usr.bin/gdb/valarith.c)0
-rw-r--r--gnu/usr.bin/kgdb/valops.c (renamed from gnu/usr.bin/gdb/valops.c)0
-rw-r--r--gnu/usr.bin/kgdb/valprint.c (renamed from gnu/usr.bin/gdb/valprint.c)0
-rw-r--r--gnu/usr.bin/kgdb/value.h (renamed from gnu/usr.bin/gdb/value.h)0
-rw-r--r--gnu/usr.bin/kgdb/values.c (renamed from gnu/usr.bin/gdb/values.c)0
-rw-r--r--gnu/usr.bin/kgdb/version.c (renamed from gnu/usr.bin/gdb/version.c)0
-rw-r--r--gnu/usr.bin/kgdb/wait.h (renamed from gnu/usr.bin/gdb/wait.h)0
-rw-r--r--gnu/usr.bin/kgdb/xgdb/Makefile (renamed from gnu/usr.bin/gdb/xgdb/Makefile)0
-rw-r--r--gnu/usr.bin/kgdb/xgdb/xgdb.c (renamed from gnu/usr.bin/gdb/xgdb/xgdb.c)2
-rw-r--r--gnu/usr.bin/ld/etc.c153
-rw-r--r--gnu/usr.bin/ld/i386/md.c20
-rw-r--r--gnu/usr.bin/ld/i386/md.h4
-rw-r--r--gnu/usr.bin/ld/i386/mdprologue.S4
-rw-r--r--gnu/usr.bin/ld/ld.17
-rw-r--r--gnu/usr.bin/ld/ld.c766
-rw-r--r--gnu/usr.bin/ld/ld.h35
-rw-r--r--gnu/usr.bin/ld/ldconfig/Makefile4
-rw-r--r--gnu/usr.bin/ld/ldconfig/ldconfig.82
-rw-r--r--gnu/usr.bin/ld/ldconfig/ldconfig.c21
-rw-r--r--gnu/usr.bin/ld/ldd/ldd.11
-rw-r--r--gnu/usr.bin/ld/ldd/ldd.c56
-rw-r--r--gnu/usr.bin/ld/lib.c234
-rw-r--r--gnu/usr.bin/ld/rrs.c75
-rw-r--r--gnu/usr.bin/ld/rtld/Makefile4
-rw-r--r--gnu/usr.bin/ld/rtld/malloc.c5
-rw-r--r--gnu/usr.bin/ld/rtld/rtld.c124
-rw-r--r--gnu/usr.bin/ld/shlib.c39
-rw-r--r--gnu/usr.bin/ld/sparc/md.c12
-rw-r--r--gnu/usr.bin/ld/symbol.c44
-rw-r--r--gnu/usr.bin/ld/warnings.c217
-rw-r--r--gnu/usr.bin/man/Makefile.inc2
-rw-r--r--gnu/usr.bin/man/apropos/Makefile24
-rw-r--r--gnu/usr.bin/man/catman/Makefile17
-rw-r--r--gnu/usr.bin/man/catman/catman.sh (renamed from gnu/usr.bin/man/catman/catman)15
-rw-r--r--gnu/usr.bin/man/lib/Makefile5
-rw-r--r--gnu/usr.bin/man/lib/config.h_dist16
-rw-r--r--gnu/usr.bin/man/makewhatis/Makefile4
-rw-r--r--gnu/usr.bin/man/makewhatis/makewhatis.sh9
-rw-r--r--gnu/usr.bin/man/man/Makefile3
-rw-r--r--gnu/usr.bin/man/man/man.c75
-rw-r--r--gnu/usr.bin/man/man/man.man4
-rw-r--r--gnu/usr.bin/man/manpath/Makefile2
-rw-r--r--gnu/usr.bin/man/manpath/manpath.config4
-rw-r--r--gnu/usr.bin/man/whatis/Makefile23
-rw-r--r--gnu/usr.bin/patch/patch.16
-rw-r--r--gnu/usr.bin/patch/patch.c26
-rw-r--r--gnu/usr.bin/patch/pch.c6
-rw-r--r--gnu/usr.bin/ptx/.stamp-h.in0
-rw-r--r--gnu/usr.bin/ptx/COPYING339
-rw-r--r--gnu/usr.bin/ptx/ChangeLog546
-rw-r--r--gnu/usr.bin/ptx/Makefile10
-rw-r--r--gnu/usr.bin/ptx/NEWS53
-rw-r--r--gnu/usr.bin/ptx/README23
-rw-r--r--gnu/usr.bin/ptx/THANKS23
-rw-r--r--gnu/usr.bin/ptx/TODO94
-rw-r--r--gnu/usr.bin/ptx/alloca.c484
-rw-r--r--gnu/usr.bin/ptx/argmatch.c94
-rw-r--r--gnu/usr.bin/ptx/bumpalloc.h58
-rw-r--r--gnu/usr.bin/ptx/check-out65
-rw-r--r--gnu/usr.bin/ptx/config.h57
-rw-r--r--gnu/usr.bin/ptx/diacrit.c148
-rw-r--r--gnu/usr.bin/ptx/diacrit.h16
-rw-r--r--gnu/usr.bin/ptx/error.c117
-rw-r--r--gnu/usr.bin/ptx/examples/README21
-rw-r--r--gnu/usr.bin/ptx/examples/ajay/Makefile28
-rw-r--r--gnu/usr.bin/ptx/examples/ajay/README41
-rw-r--r--gnu/usr.bin/ptx/examples/ajay/footer.tex1
-rw-r--r--gnu/usr.bin/ptx/examples/ajay/header.tex21
-rw-r--r--gnu/usr.bin/ptx/examples/ajay/tip.forgptx10
-rw-r--r--gnu/usr.bin/ptx/examples/ajay/x.pl22
-rw-r--r--gnu/usr.bin/ptx/examples/ignore/README65
-rw-r--r--gnu/usr.bin/ptx/examples/ignore/bix109
-rw-r--r--gnu/usr.bin/ptx/examples/ignore/eign163
-rwxr-xr-xgnu/usr.bin/ptx/examples/include.pl79
-rw-r--r--gnu/usr.bin/ptx/examples/latex/Makefile15
-rw-r--r--gnu/usr.bin/ptx/examples/latex/README10
-rw-r--r--gnu/usr.bin/ptx/examples/latex/latex.tex11
-rw-r--r--gnu/usr.bin/ptx/examples/latex/table.tex65
-rw-r--r--gnu/usr.bin/ptx/examples/luke/README2
-rw-r--r--gnu/usr.bin/ptx/examples/luke/xxroff.sh108
-rw-r--r--gnu/usr.bin/ptx/getopt.c757
-rw-r--r--gnu/usr.bin/ptx/getopt.h129
-rw-r--r--gnu/usr.bin/ptx/getopt1.c187
-rwxr-xr-xgnu/usr.bin/ptx/mkinstalldirs35
-rw-r--r--gnu/usr.bin/ptx/ptx.c2237
-rw-r--r--gnu/usr.bin/ptx/ptx.info496
-rw-r--r--gnu/usr.bin/ptx/ptx.texinfo554
-rw-r--r--gnu/usr.bin/ptx/regex.h490
-rw-r--r--gnu/usr.bin/ptx/texinfo.tex4053
-rw-r--r--gnu/usr.bin/ptx/xmalloc.c88
-rw-r--r--gnu/usr.bin/rcs/co/co.110
-rw-r--r--gnu/usr.bin/rcs/co/co.c13
-rw-r--r--gnu/usr.bin/rcs/lib/Makefile2
-rw-r--r--gnu/usr.bin/rcs/lib/rcsbase.h10
-rw-r--r--gnu/usr.bin/rcs/lib/rcsedit.c13
-rw-r--r--gnu/usr.bin/rcs/lib/rcskeys.c61
-rw-r--r--gnu/usr.bin/rcs/rlog/rlog.16
-rw-r--r--gnu/usr.bin/rcs/rlog/rlog.c29
-rw-r--r--gnu/usr.bin/tar/Makefile1
-rw-r--r--gnu/usr.bin/tar/extract.c36
-rw-r--r--gnu/usr.bin/tar/tar.c3
-rw-r--r--gnu/usr.bin/tar/tar.h1
960 files changed, 220183 insertions, 20895 deletions
diff --git a/gnu/lib/Makefile b/gnu/lib/Makefile
index d51120c8632a..1eea41d398aa 100644
--- a/gnu/lib/Makefile
+++ b/gnu/lib/Makefile
@@ -1,5 +1,5 @@
-# $Id: Makefile,v 1.1 1994/01/30 01:03:08 rgrimes Exp $
+# $Id: Makefile,v 1.2 1994/05/09 16:11:10 ache Exp $
-SUBDIR= libg++ libmalloc libregex
+SUBDIR= libg++ libmalloc libregex libreadline
.include <bsd.subdir.mk>
diff --git a/gnu/lib/Makefile.inc b/gnu/lib/Makefile.inc
index b0e5d4bdbc8d..fca604a41eac 100644
--- a/gnu/lib/Makefile.inc
+++ b/gnu/lib/Makefile.inc
@@ -1,4 +1,8 @@
-# $Id: Makefile.inc,v 1.1 1994/01/30 01:03:16 rgrimes Exp $
+# $Id: Makefile.inc,v 1.3 1994/05/28 09:56:30 csgr Exp $
SHLIB_MAJOR?= 1
-SHLIB_MINOR?= 0
+SHLIB_MINOR?= 1
+
+
+# NB: SHLIB major and minor nos. must also be specified in libg++/Makefile.inc
+# (This is due to the deeper tree structure of libg++)
diff --git a/gnu/lib/libg++/Makefile b/gnu/lib/libg++/Makefile
index 6d6b02d6c82e..158c7bd3254a 100644
--- a/gnu/lib/libg++/Makefile
+++ b/gnu/lib/libg++/Makefile
@@ -1,6 +1,6 @@
SUBDIR= libg++ genclass
-INCLUDEDIRS= iostream libg++ g++-include
+INCLUDEDIRS= iostream libg++
beforeinstall:
@-if [ ! -d ${DESTDIR}/usr/include/g++ ]; then \
@@ -8,16 +8,6 @@ beforeinstall:
chown ${BINOWN}.${BINGRP} ${DESTDIR}/usr/include/g++; \
chmod 755 ${DESTDIR}/usr/include/g++; \
fi
- @-if [ ! -d ${DESTDIR}/usr/include/g++/gen ]; then \
- mkdir ${DESTDIR}/usr/include/g++/gen; \
- chown ${BINOWN}.${BINGRP} ${DESTDIR}/usr/include/g++/gen; \
- chmod 755 ${DESTDIR}/usr/include/g++/gen; \
- fi
- @-if [ ! -d ${DESTDIR}/usr/include/g++/sys ]; then \
- mkdir ${DESTDIR}/usr/include/g++/sys; \
- chown ${BINOWN}.${BINGRP} ${DESTDIR}/usr/include/g++/sys; \
- chmod 755 ${DESTDIR}/usr/include/g++/sys; \
- fi
@-for i in ${INCLUDEDIRS}; do \
echo installing includes from $$i ; \
(cd $$i; for j in *.[ih]; do \
@@ -26,17 +16,15 @@ beforeinstall:
${DESTDIR}/usr/include/g++/$$j; \
done); \
done
- @echo installing includes from g++-include/sys
- @(cd g++-include/sys ; for j in *.[ih]; do \
- cmp -s $$j ${DESTDIR}/usr/include/g++/sys/$$j || \
+ @(cd g++-include ; for j in *.*P; do \
+ cmp -s $$j ${DESTDIR}/usr/include/g++/$$j || \
install -c -o ${BINOWN} -g ${BINGRP} -m 444 $$j \
- ${DESTDIR}/usr/include/g++/sys/$$j; \
+ ${DESTDIR}/usr/include/g++/$$j; \
done)
- @echo installing includes from g++-include/gen
- @(cd g++-include/gen ; for j in *.*P; do \
- cmp -s $$j ${DESTDIR}/usr/include/g++/gen/$$j || \
+ @(cd include ; for j in *.h; do \
+ cmp -s $$j ${DESTDIR}/usr/include/$$j || \
install -c -o ${BINOWN} -g ${BINGRP} -m 444 $$j \
- ${DESTDIR}/usr/include/g++/gen/$$j; \
+ ${DESTDIR}/usr/include/$$j; \
done)
.include <bsd.subdir.mk>
diff --git a/gnu/lib/libg++/Makefile.inc b/gnu/lib/libg++/Makefile.inc
index e528d08dc10c..ff12eac227d5 100644
--- a/gnu/lib/libg++/Makefile.inc
+++ b/gnu/lib/libg++/Makefile.inc
@@ -1 +1,9 @@
-NOPIC?= nopic
+# $Id: Makefile.inc,v 1.10 1994/06/13 21:50:02 ache Exp $
+
+CPLUSPLUSLIB= yes
+
+# SHLIB major and minor nos. MUST be specified here.
+# Do not remove the following 2 lines.
+SHLIB_MAJOR=1
+SHLIB_MINOR=1
+
diff --git a/gnu/lib/libg++/g++-include/gen/AVLMap.ccP b/gnu/lib/libg++/g++-include/AVLMap.ccP
index a9be60f06612..a9be60f06612 100644
--- a/gnu/lib/libg++/g++-include/gen/AVLMap.ccP
+++ b/gnu/lib/libg++/g++-include/AVLMap.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/AVLMap.hP b/gnu/lib/libg++/g++-include/AVLMap.hP
index 119ee82caa33..119ee82caa33 100644
--- a/gnu/lib/libg++/g++-include/gen/AVLMap.hP
+++ b/gnu/lib/libg++/g++-include/AVLMap.hP
diff --git a/gnu/lib/libg++/g++-include/gen/AVLSet.ccP b/gnu/lib/libg++/g++-include/AVLSet.ccP
index b170734e547f..b170734e547f 100644
--- a/gnu/lib/libg++/g++-include/gen/AVLSet.ccP
+++ b/gnu/lib/libg++/g++-include/AVLSet.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/AVLSet.hP b/gnu/lib/libg++/g++-include/AVLSet.hP
index 16ad1d194686..16ad1d194686 100644
--- a/gnu/lib/libg++/g++-include/gen/AVLSet.hP
+++ b/gnu/lib/libg++/g++-include/AVLSet.hP
diff --git a/gnu/lib/libg++/g++-include/gen/AVec.ccP b/gnu/lib/libg++/g++-include/AVec.ccP
index bc671bf8e1d7..bc671bf8e1d7 100644
--- a/gnu/lib/libg++/g++-include/gen/AVec.ccP
+++ b/gnu/lib/libg++/g++-include/AVec.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/AVec.hP b/gnu/lib/libg++/g++-include/AVec.hP
index cd9a9c3fe5d6..cd9a9c3fe5d6 100644
--- a/gnu/lib/libg++/g++-include/gen/AVec.hP
+++ b/gnu/lib/libg++/g++-include/AVec.hP
diff --git a/gnu/lib/libg++/g++-include/gen/BSTSet.ccP b/gnu/lib/libg++/g++-include/BSTSet.ccP
index 6a69d8f45b28..6a69d8f45b28 100644
--- a/gnu/lib/libg++/g++-include/gen/BSTSet.ccP
+++ b/gnu/lib/libg++/g++-include/BSTSet.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/BSTSet.hP b/gnu/lib/libg++/g++-include/BSTSet.hP
index 82f2069c0fa5..82f2069c0fa5 100644
--- a/gnu/lib/libg++/g++-include/gen/BSTSet.hP
+++ b/gnu/lib/libg++/g++-include/BSTSet.hP
diff --git a/gnu/lib/libg++/g++-include/gen/Bag.ccP b/gnu/lib/libg++/g++-include/Bag.ccP
index 836d0d6656d2..836d0d6656d2 100644
--- a/gnu/lib/libg++/g++-include/gen/Bag.ccP
+++ b/gnu/lib/libg++/g++-include/Bag.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/Bag.hP b/gnu/lib/libg++/g++-include/Bag.hP
index 4b9a87a9099c..4b9a87a9099c 100644
--- a/gnu/lib/libg++/g++-include/gen/Bag.hP
+++ b/gnu/lib/libg++/g++-include/Bag.hP
diff --git a/gnu/lib/libg++/g++-include/gen/CHBag.ccP b/gnu/lib/libg++/g++-include/CHBag.ccP
index 16649ac22f2f..16649ac22f2f 100644
--- a/gnu/lib/libg++/g++-include/gen/CHBag.ccP
+++ b/gnu/lib/libg++/g++-include/CHBag.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/CHBag.hP b/gnu/lib/libg++/g++-include/CHBag.hP
index f6ca10b3b93e..f6ca10b3b93e 100644
--- a/gnu/lib/libg++/g++-include/gen/CHBag.hP
+++ b/gnu/lib/libg++/g++-include/CHBag.hP
diff --git a/gnu/lib/libg++/g++-include/gen/CHMap.ccP b/gnu/lib/libg++/g++-include/CHMap.ccP
index 1bd76db5fc97..1bd76db5fc97 100644
--- a/gnu/lib/libg++/g++-include/gen/CHMap.ccP
+++ b/gnu/lib/libg++/g++-include/CHMap.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/CHMap.hP b/gnu/lib/libg++/g++-include/CHMap.hP
index 95441a3544fd..95441a3544fd 100644
--- a/gnu/lib/libg++/g++-include/gen/CHMap.hP
+++ b/gnu/lib/libg++/g++-include/CHMap.hP
diff --git a/gnu/lib/libg++/g++-include/gen/CHNode.ccP b/gnu/lib/libg++/g++-include/CHNode.ccP
index e16725fd746c..e16725fd746c 100644
--- a/gnu/lib/libg++/g++-include/gen/CHNode.ccP
+++ b/gnu/lib/libg++/g++-include/CHNode.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/CHNode.hP b/gnu/lib/libg++/g++-include/CHNode.hP
index 84e67d069bee..84e67d069bee 100644
--- a/gnu/lib/libg++/g++-include/gen/CHNode.hP
+++ b/gnu/lib/libg++/g++-include/CHNode.hP
diff --git a/gnu/lib/libg++/g++-include/gen/CHSet.ccP b/gnu/lib/libg++/g++-include/CHSet.ccP
index 330506cb1932..330506cb1932 100644
--- a/gnu/lib/libg++/g++-include/gen/CHSet.ccP
+++ b/gnu/lib/libg++/g++-include/CHSet.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/CHSet.hP b/gnu/lib/libg++/g++-include/CHSet.hP
index f0a08de4ce6b..f0a08de4ce6b 100644
--- a/gnu/lib/libg++/g++-include/gen/CHSet.hP
+++ b/gnu/lib/libg++/g++-include/CHSet.hP
diff --git a/gnu/lib/libg++/g++-include/gen/DLDeque.ccP b/gnu/lib/libg++/g++-include/DLDeque.ccP
index d5a0db7f910a..d5a0db7f910a 100644
--- a/gnu/lib/libg++/g++-include/gen/DLDeque.ccP
+++ b/gnu/lib/libg++/g++-include/DLDeque.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/DLDeque.hP b/gnu/lib/libg++/g++-include/DLDeque.hP
index d91cdd41cbc7..d91cdd41cbc7 100644
--- a/gnu/lib/libg++/g++-include/gen/DLDeque.hP
+++ b/gnu/lib/libg++/g++-include/DLDeque.hP
diff --git a/gnu/lib/libg++/g++-include/gen/DLList.ccP b/gnu/lib/libg++/g++-include/DLList.ccP
index cb1e22a33773..cb1e22a33773 100644
--- a/gnu/lib/libg++/g++-include/gen/DLList.ccP
+++ b/gnu/lib/libg++/g++-include/DLList.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/DLList.hP b/gnu/lib/libg++/g++-include/DLList.hP
index b115ab9f6fbb..b115ab9f6fbb 100644
--- a/gnu/lib/libg++/g++-include/gen/DLList.hP
+++ b/gnu/lib/libg++/g++-include/DLList.hP
diff --git a/gnu/lib/libg++/g++-include/gen/Deque.ccP b/gnu/lib/libg++/g++-include/Deque.ccP
index 79a9b72c875c..79a9b72c875c 100644
--- a/gnu/lib/libg++/g++-include/gen/Deque.ccP
+++ b/gnu/lib/libg++/g++-include/Deque.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/Deque.hP b/gnu/lib/libg++/g++-include/Deque.hP
index 7ec52d4a0c0f..7ec52d4a0c0f 100644
--- a/gnu/lib/libg++/g++-include/gen/Deque.hP
+++ b/gnu/lib/libg++/g++-include/Deque.hP
diff --git a/gnu/lib/libg++/g++-include/gen/FPQueue.ccP b/gnu/lib/libg++/g++-include/FPQueue.ccP
index a358cacb60ee..a358cacb60ee 100644
--- a/gnu/lib/libg++/g++-include/gen/FPQueue.ccP
+++ b/gnu/lib/libg++/g++-include/FPQueue.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/FPQueue.hP b/gnu/lib/libg++/g++-include/FPQueue.hP
index f647ae9dfd01..f647ae9dfd01 100644
--- a/gnu/lib/libg++/g++-include/gen/FPQueue.hP
+++ b/gnu/lib/libg++/g++-include/FPQueue.hP
diff --git a/gnu/lib/libg++/g++-include/gen/FPStack.ccP b/gnu/lib/libg++/g++-include/FPStack.ccP
index 954991193b7a..954991193b7a 100644
--- a/gnu/lib/libg++/g++-include/gen/FPStack.ccP
+++ b/gnu/lib/libg++/g++-include/FPStack.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/FPStack.hP b/gnu/lib/libg++/g++-include/FPStack.hP
index 091f25536002..091f25536002 100644
--- a/gnu/lib/libg++/g++-include/gen/FPStack.hP
+++ b/gnu/lib/libg++/g++-include/FPStack.hP
diff --git a/gnu/lib/libg++/g++-include/gen/FPlex.ccP b/gnu/lib/libg++/g++-include/FPlex.ccP
index 70d6c475571e..70d6c475571e 100644
--- a/gnu/lib/libg++/g++-include/gen/FPlex.ccP
+++ b/gnu/lib/libg++/g++-include/FPlex.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/FPlex.hP b/gnu/lib/libg++/g++-include/FPlex.hP
index eb93a0c37281..eb93a0c37281 100644
--- a/gnu/lib/libg++/g++-include/gen/FPlex.hP
+++ b/gnu/lib/libg++/g++-include/FPlex.hP
diff --git a/gnu/lib/libg++/g++-include/gen/List.ccP b/gnu/lib/libg++/g++-include/List.ccP
index 2afbdaf97215..2afbdaf97215 100644
--- a/gnu/lib/libg++/g++-include/gen/List.ccP
+++ b/gnu/lib/libg++/g++-include/List.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/List.hP b/gnu/lib/libg++/g++-include/List.hP
index 7ccdbc3bc41f..7ccdbc3bc41f 100644
--- a/gnu/lib/libg++/g++-include/gen/List.hP
+++ b/gnu/lib/libg++/g++-include/List.hP
diff --git a/gnu/lib/libg++/g++-include/gen/MPlex.ccP b/gnu/lib/libg++/g++-include/MPlex.ccP
index 89a1bcf9e600..89a1bcf9e600 100644
--- a/gnu/lib/libg++/g++-include/gen/MPlex.ccP
+++ b/gnu/lib/libg++/g++-include/MPlex.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/MPlex.hP b/gnu/lib/libg++/g++-include/MPlex.hP
index 8bf78d13a135..8bf78d13a135 100644
--- a/gnu/lib/libg++/g++-include/gen/MPlex.hP
+++ b/gnu/lib/libg++/g++-include/MPlex.hP
diff --git a/gnu/lib/libg++/g++-include/gen/Map.ccP b/gnu/lib/libg++/g++-include/Map.ccP
index 03bb4b84f0fd..03bb4b84f0fd 100644
--- a/gnu/lib/libg++/g++-include/gen/Map.ccP
+++ b/gnu/lib/libg++/g++-include/Map.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/Map.hP b/gnu/lib/libg++/g++-include/Map.hP
index 716a17fdd9ee..716a17fdd9ee 100644
--- a/gnu/lib/libg++/g++-include/gen/Map.hP
+++ b/gnu/lib/libg++/g++-include/Map.hP
diff --git a/gnu/lib/libg++/g++-include/gen/OSLBag.ccP b/gnu/lib/libg++/g++-include/OSLBag.ccP
index 78398192bcef..78398192bcef 100644
--- a/gnu/lib/libg++/g++-include/gen/OSLBag.ccP
+++ b/gnu/lib/libg++/g++-include/OSLBag.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/OSLBag.hP b/gnu/lib/libg++/g++-include/OSLBag.hP
index de4d67cf9a5d..de4d67cf9a5d 100644
--- a/gnu/lib/libg++/g++-include/gen/OSLBag.hP
+++ b/gnu/lib/libg++/g++-include/OSLBag.hP
diff --git a/gnu/lib/libg++/g++-include/gen/OSLSet.ccP b/gnu/lib/libg++/g++-include/OSLSet.ccP
index bfd32ae954ce..bfd32ae954ce 100644
--- a/gnu/lib/libg++/g++-include/gen/OSLSet.ccP
+++ b/gnu/lib/libg++/g++-include/OSLSet.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/OSLSet.hP b/gnu/lib/libg++/g++-include/OSLSet.hP
index bf3707f6c7b0..bf3707f6c7b0 100644
--- a/gnu/lib/libg++/g++-include/gen/OSLSet.hP
+++ b/gnu/lib/libg++/g++-include/OSLSet.hP
diff --git a/gnu/lib/libg++/g++-include/gen/OXPBag.ccP b/gnu/lib/libg++/g++-include/OXPBag.ccP
index 6619e25ea191..6619e25ea191 100644
--- a/gnu/lib/libg++/g++-include/gen/OXPBag.ccP
+++ b/gnu/lib/libg++/g++-include/OXPBag.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/OXPBag.hP b/gnu/lib/libg++/g++-include/OXPBag.hP
index 128d4a20e401..128d4a20e401 100644
--- a/gnu/lib/libg++/g++-include/gen/OXPBag.hP
+++ b/gnu/lib/libg++/g++-include/OXPBag.hP
diff --git a/gnu/lib/libg++/g++-include/gen/OXPSet.ccP b/gnu/lib/libg++/g++-include/OXPSet.ccP
index 14611954511e..14611954511e 100644
--- a/gnu/lib/libg++/g++-include/gen/OXPSet.ccP
+++ b/gnu/lib/libg++/g++-include/OXPSet.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/OXPSet.hP b/gnu/lib/libg++/g++-include/OXPSet.hP
index 4e0c97712d2a..4e0c97712d2a 100644
--- a/gnu/lib/libg++/g++-include/gen/OXPSet.hP
+++ b/gnu/lib/libg++/g++-include/OXPSet.hP
diff --git a/gnu/lib/libg++/g++-include/gen/PHPQ.ccP b/gnu/lib/libg++/g++-include/PHPQ.ccP
index 764b11c5cf99..764b11c5cf99 100644
--- a/gnu/lib/libg++/g++-include/gen/PHPQ.ccP
+++ b/gnu/lib/libg++/g++-include/PHPQ.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/PHPQ.hP b/gnu/lib/libg++/g++-include/PHPQ.hP
index 359c527c602c..359c527c602c 100644
--- a/gnu/lib/libg++/g++-include/gen/PHPQ.hP
+++ b/gnu/lib/libg++/g++-include/PHPQ.hP
diff --git a/gnu/lib/libg++/g++-include/gen/PQ.ccP b/gnu/lib/libg++/g++-include/PQ.ccP
index 810240759cbf..810240759cbf 100644
--- a/gnu/lib/libg++/g++-include/gen/PQ.ccP
+++ b/gnu/lib/libg++/g++-include/PQ.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/PQ.hP b/gnu/lib/libg++/g++-include/PQ.hP
index 981592ae856b..981592ae856b 100644
--- a/gnu/lib/libg++/g++-include/gen/PQ.hP
+++ b/gnu/lib/libg++/g++-include/PQ.hP
diff --git a/gnu/lib/libg++/g++-include/gen/PSList.hP b/gnu/lib/libg++/g++-include/PSList.hP
index eacb34dbe354..eacb34dbe354 100644
--- a/gnu/lib/libg++/g++-include/gen/PSList.hP
+++ b/gnu/lib/libg++/g++-include/PSList.hP
diff --git a/gnu/lib/libg++/g++-include/gen/PVec.hP b/gnu/lib/libg++/g++-include/PVec.hP
index de32482610b4..de32482610b4 100644
--- a/gnu/lib/libg++/g++-include/gen/PVec.hP
+++ b/gnu/lib/libg++/g++-include/PVec.hP
diff --git a/gnu/lib/libg++/g++-include/gen/Plex.ccP b/gnu/lib/libg++/g++-include/Plex.ccP
index 5eb13c85f488..5eb13c85f488 100644
--- a/gnu/lib/libg++/g++-include/gen/Plex.ccP
+++ b/gnu/lib/libg++/g++-include/Plex.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/Plex.hP b/gnu/lib/libg++/g++-include/Plex.hP
index f8af1b6ba7ca..f8af1b6ba7ca 100644
--- a/gnu/lib/libg++/g++-include/gen/Plex.hP
+++ b/gnu/lib/libg++/g++-include/Plex.hP
diff --git a/gnu/lib/libg++/g++-include/gen/Queue.ccP b/gnu/lib/libg++/g++-include/Queue.ccP
index fb48d952ff71..fb48d952ff71 100644
--- a/gnu/lib/libg++/g++-include/gen/Queue.ccP
+++ b/gnu/lib/libg++/g++-include/Queue.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/Queue.hP b/gnu/lib/libg++/g++-include/Queue.hP
index 73db6e034eb2..73db6e034eb2 100644
--- a/gnu/lib/libg++/g++-include/gen/Queue.hP
+++ b/gnu/lib/libg++/g++-include/Queue.hP
diff --git a/gnu/lib/libg++/g++-include/gen/RAVLMap.ccP b/gnu/lib/libg++/g++-include/RAVLMap.ccP
index 7537dd07884d..7537dd07884d 100644
--- a/gnu/lib/libg++/g++-include/gen/RAVLMap.ccP
+++ b/gnu/lib/libg++/g++-include/RAVLMap.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/RAVLMap.hP b/gnu/lib/libg++/g++-include/RAVLMap.hP
index d3c523ee2978..d3c523ee2978 100644
--- a/gnu/lib/libg++/g++-include/gen/RAVLMap.hP
+++ b/gnu/lib/libg++/g++-include/RAVLMap.hP
diff --git a/gnu/lib/libg++/g++-include/gen/RPlex.ccP b/gnu/lib/libg++/g++-include/RPlex.ccP
index 0dbd2cee7e49..0dbd2cee7e49 100644
--- a/gnu/lib/libg++/g++-include/gen/RPlex.ccP
+++ b/gnu/lib/libg++/g++-include/RPlex.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/RPlex.hP b/gnu/lib/libg++/g++-include/RPlex.hP
index ed28c357e4d1..ed28c357e4d1 100644
--- a/gnu/lib/libg++/g++-include/gen/RPlex.hP
+++ b/gnu/lib/libg++/g++-include/RPlex.hP
diff --git a/gnu/lib/libg++/g++-include/gen/SLBag.ccP b/gnu/lib/libg++/g++-include/SLBag.ccP
index 50d2447c7d29..50d2447c7d29 100644
--- a/gnu/lib/libg++/g++-include/gen/SLBag.ccP
+++ b/gnu/lib/libg++/g++-include/SLBag.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/SLBag.hP b/gnu/lib/libg++/g++-include/SLBag.hP
index edb648e9d3a2..edb648e9d3a2 100644
--- a/gnu/lib/libg++/g++-include/gen/SLBag.hP
+++ b/gnu/lib/libg++/g++-include/SLBag.hP
diff --git a/gnu/lib/libg++/g++-include/gen/SLList.ccP b/gnu/lib/libg++/g++-include/SLList.ccP
index 3ebd8d5bc98d..3ebd8d5bc98d 100644
--- a/gnu/lib/libg++/g++-include/gen/SLList.ccP
+++ b/gnu/lib/libg++/g++-include/SLList.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/SLList.hP b/gnu/lib/libg++/g++-include/SLList.hP
index e5570bdf8fec..e5570bdf8fec 100644
--- a/gnu/lib/libg++/g++-include/gen/SLList.hP
+++ b/gnu/lib/libg++/g++-include/SLList.hP
diff --git a/gnu/lib/libg++/g++-include/gen/SLQueue.ccP b/gnu/lib/libg++/g++-include/SLQueue.ccP
index 8a5935b77570..8a5935b77570 100644
--- a/gnu/lib/libg++/g++-include/gen/SLQueue.ccP
+++ b/gnu/lib/libg++/g++-include/SLQueue.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/SLQueue.hP b/gnu/lib/libg++/g++-include/SLQueue.hP
index 20fd74c9c57e..20fd74c9c57e 100644
--- a/gnu/lib/libg++/g++-include/gen/SLQueue.hP
+++ b/gnu/lib/libg++/g++-include/SLQueue.hP
diff --git a/gnu/lib/libg++/g++-include/gen/SLSet.ccP b/gnu/lib/libg++/g++-include/SLSet.ccP
index 5f580849ff34..5f580849ff34 100644
--- a/gnu/lib/libg++/g++-include/gen/SLSet.ccP
+++ b/gnu/lib/libg++/g++-include/SLSet.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/SLSet.hP b/gnu/lib/libg++/g++-include/SLSet.hP
index fcf153633f80..fcf153633f80 100644
--- a/gnu/lib/libg++/g++-include/gen/SLSet.hP
+++ b/gnu/lib/libg++/g++-include/SLSet.hP
diff --git a/gnu/lib/libg++/g++-include/gen/SLStack.ccP b/gnu/lib/libg++/g++-include/SLStack.ccP
index 3996b41fac55..3996b41fac55 100644
--- a/gnu/lib/libg++/g++-include/gen/SLStack.ccP
+++ b/gnu/lib/libg++/g++-include/SLStack.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/SLStack.hP b/gnu/lib/libg++/g++-include/SLStack.hP
index e20d9b9c2a47..e20d9b9c2a47 100644
--- a/gnu/lib/libg++/g++-include/gen/SLStack.hP
+++ b/gnu/lib/libg++/g++-include/SLStack.hP
diff --git a/gnu/lib/libg++/g++-include/gen/Set.ccP b/gnu/lib/libg++/g++-include/Set.ccP
index f312aa15cc75..f312aa15cc75 100644
--- a/gnu/lib/libg++/g++-include/gen/Set.ccP
+++ b/gnu/lib/libg++/g++-include/Set.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/Set.hP b/gnu/lib/libg++/g++-include/Set.hP
index 6c2192262711..6c2192262711 100644
--- a/gnu/lib/libg++/g++-include/gen/Set.hP
+++ b/gnu/lib/libg++/g++-include/Set.hP
diff --git a/gnu/lib/libg++/g++-include/gen/SkipBag.ccP b/gnu/lib/libg++/g++-include/SkipBag.ccP
index cc347e981338..cc347e981338 100644
--- a/gnu/lib/libg++/g++-include/gen/SkipBag.ccP
+++ b/gnu/lib/libg++/g++-include/SkipBag.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/SkipBag.hP b/gnu/lib/libg++/g++-include/SkipBag.hP
index 1bfe9da44627..1bfe9da44627 100644
--- a/gnu/lib/libg++/g++-include/gen/SkipBag.hP
+++ b/gnu/lib/libg++/g++-include/SkipBag.hP
diff --git a/gnu/lib/libg++/g++-include/gen/SkipMap.ccP b/gnu/lib/libg++/g++-include/SkipMap.ccP
index 8b6afe2eddf3..8b6afe2eddf3 100644
--- a/gnu/lib/libg++/g++-include/gen/SkipMap.ccP
+++ b/gnu/lib/libg++/g++-include/SkipMap.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/SkipMap.hP b/gnu/lib/libg++/g++-include/SkipMap.hP
index 65766d64c7a7..65766d64c7a7 100644
--- a/gnu/lib/libg++/g++-include/gen/SkipMap.hP
+++ b/gnu/lib/libg++/g++-include/SkipMap.hP
diff --git a/gnu/lib/libg++/g++-include/gen/SkipSet.ccP b/gnu/lib/libg++/g++-include/SkipSet.ccP
index a1bf33d0fa01..a1bf33d0fa01 100644
--- a/gnu/lib/libg++/g++-include/gen/SkipSet.ccP
+++ b/gnu/lib/libg++/g++-include/SkipSet.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/SkipSet.hP b/gnu/lib/libg++/g++-include/SkipSet.hP
index cd953052394d..cd953052394d 100644
--- a/gnu/lib/libg++/g++-include/gen/SkipSet.hP
+++ b/gnu/lib/libg++/g++-include/SkipSet.hP
diff --git a/gnu/lib/libg++/g++-include/gen/SplayBag.ccP b/gnu/lib/libg++/g++-include/SplayBag.ccP
index ff02a992a656..ff02a992a656 100644
--- a/gnu/lib/libg++/g++-include/gen/SplayBag.ccP
+++ b/gnu/lib/libg++/g++-include/SplayBag.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/SplayBag.hP b/gnu/lib/libg++/g++-include/SplayBag.hP
index 9d7fcad1ddc3..9d7fcad1ddc3 100644
--- a/gnu/lib/libg++/g++-include/gen/SplayBag.hP
+++ b/gnu/lib/libg++/g++-include/SplayBag.hP
diff --git a/gnu/lib/libg++/g++-include/gen/SplayMap.ccP b/gnu/lib/libg++/g++-include/SplayMap.ccP
index 4be340db0f6d..4be340db0f6d 100644
--- a/gnu/lib/libg++/g++-include/gen/SplayMap.ccP
+++ b/gnu/lib/libg++/g++-include/SplayMap.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/SplayMap.hP b/gnu/lib/libg++/g++-include/SplayMap.hP
index ced95378ab72..ced95378ab72 100644
--- a/gnu/lib/libg++/g++-include/gen/SplayMap.hP
+++ b/gnu/lib/libg++/g++-include/SplayMap.hP
diff --git a/gnu/lib/libg++/g++-include/gen/SplayNode.ccP b/gnu/lib/libg++/g++-include/SplayNode.ccP
index 9dfb1d8c0658..9dfb1d8c0658 100644
--- a/gnu/lib/libg++/g++-include/gen/SplayNode.ccP
+++ b/gnu/lib/libg++/g++-include/SplayNode.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/SplayNode.hP b/gnu/lib/libg++/g++-include/SplayNode.hP
index a196861fc9cc..a196861fc9cc 100644
--- a/gnu/lib/libg++/g++-include/gen/SplayNode.hP
+++ b/gnu/lib/libg++/g++-include/SplayNode.hP
diff --git a/gnu/lib/libg++/g++-include/gen/SplayPQ.ccP b/gnu/lib/libg++/g++-include/SplayPQ.ccP
index 0740cd9a930d..0740cd9a930d 100644
--- a/gnu/lib/libg++/g++-include/gen/SplayPQ.ccP
+++ b/gnu/lib/libg++/g++-include/SplayPQ.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/SplayPQ.hP b/gnu/lib/libg++/g++-include/SplayPQ.hP
index c75c4a05299d..c75c4a05299d 100644
--- a/gnu/lib/libg++/g++-include/gen/SplayPQ.hP
+++ b/gnu/lib/libg++/g++-include/SplayPQ.hP
diff --git a/gnu/lib/libg++/g++-include/gen/SplaySet.ccP b/gnu/lib/libg++/g++-include/SplaySet.ccP
index bba5601c7eb6..bba5601c7eb6 100644
--- a/gnu/lib/libg++/g++-include/gen/SplaySet.ccP
+++ b/gnu/lib/libg++/g++-include/SplaySet.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/SplaySet.hP b/gnu/lib/libg++/g++-include/SplaySet.hP
index cf50b975548a..cf50b975548a 100644
--- a/gnu/lib/libg++/g++-include/gen/SplaySet.hP
+++ b/gnu/lib/libg++/g++-include/SplaySet.hP
diff --git a/gnu/lib/libg++/g++-include/gen/Stack.ccP b/gnu/lib/libg++/g++-include/Stack.ccP
index efb6b8edbde5..efb6b8edbde5 100644
--- a/gnu/lib/libg++/g++-include/gen/Stack.ccP
+++ b/gnu/lib/libg++/g++-include/Stack.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/Stack.hP b/gnu/lib/libg++/g++-include/Stack.hP
index 37acb2fac5b7..37acb2fac5b7 100644
--- a/gnu/lib/libg++/g++-include/gen/Stack.hP
+++ b/gnu/lib/libg++/g++-include/Stack.hP
diff --git a/gnu/lib/libg++/g++-include/gen/VHBag.ccP b/gnu/lib/libg++/g++-include/VHBag.ccP
index 81a20eb140db..81a20eb140db 100644
--- a/gnu/lib/libg++/g++-include/gen/VHBag.ccP
+++ b/gnu/lib/libg++/g++-include/VHBag.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/VHBag.hP b/gnu/lib/libg++/g++-include/VHBag.hP
index 72c774a5591d..72c774a5591d 100644
--- a/gnu/lib/libg++/g++-include/gen/VHBag.hP
+++ b/gnu/lib/libg++/g++-include/VHBag.hP
diff --git a/gnu/lib/libg++/g++-include/gen/VHMap.ccP b/gnu/lib/libg++/g++-include/VHMap.ccP
index d6b60e997a9c..d6b60e997a9c 100644
--- a/gnu/lib/libg++/g++-include/gen/VHMap.ccP
+++ b/gnu/lib/libg++/g++-include/VHMap.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/VHMap.hP b/gnu/lib/libg++/g++-include/VHMap.hP
index ac8fe4d219a8..ac8fe4d219a8 100644
--- a/gnu/lib/libg++/g++-include/gen/VHMap.hP
+++ b/gnu/lib/libg++/g++-include/VHMap.hP
diff --git a/gnu/lib/libg++/g++-include/gen/VHSet.ccP b/gnu/lib/libg++/g++-include/VHSet.ccP
index a78b319834c1..a78b319834c1 100644
--- a/gnu/lib/libg++/g++-include/gen/VHSet.ccP
+++ b/gnu/lib/libg++/g++-include/VHSet.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/VHSet.hP b/gnu/lib/libg++/g++-include/VHSet.hP
index b7b3a3578c5a..b7b3a3578c5a 100644
--- a/gnu/lib/libg++/g++-include/gen/VHSet.hP
+++ b/gnu/lib/libg++/g++-include/VHSet.hP
diff --git a/gnu/lib/libg++/g++-include/gen/VOHSet.ccP b/gnu/lib/libg++/g++-include/VOHSet.ccP
index c5d4557a4cb4..c5d4557a4cb4 100644
--- a/gnu/lib/libg++/g++-include/gen/VOHSet.ccP
+++ b/gnu/lib/libg++/g++-include/VOHSet.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/VOHSet.hP b/gnu/lib/libg++/g++-include/VOHSet.hP
index 94decaad123b..94decaad123b 100644
--- a/gnu/lib/libg++/g++-include/gen/VOHSet.hP
+++ b/gnu/lib/libg++/g++-include/VOHSet.hP
diff --git a/gnu/lib/libg++/g++-include/gen/VQueue.ccP b/gnu/lib/libg++/g++-include/VQueue.ccP
index 1181b3f50d6a..1181b3f50d6a 100644
--- a/gnu/lib/libg++/g++-include/gen/VQueue.ccP
+++ b/gnu/lib/libg++/g++-include/VQueue.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/VQueue.hP b/gnu/lib/libg++/g++-include/VQueue.hP
index cce2c85d24af..cce2c85d24af 100644
--- a/gnu/lib/libg++/g++-include/gen/VQueue.hP
+++ b/gnu/lib/libg++/g++-include/VQueue.hP
diff --git a/gnu/lib/libg++/g++-include/gen/VStack.ccP b/gnu/lib/libg++/g++-include/VStack.ccP
index 5203d51341d4..5203d51341d4 100644
--- a/gnu/lib/libg++/g++-include/gen/VStack.ccP
+++ b/gnu/lib/libg++/g++-include/VStack.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/VStack.hP b/gnu/lib/libg++/g++-include/VStack.hP
index c8190bf06407..c8190bf06407 100644
--- a/gnu/lib/libg++/g++-include/gen/VStack.hP
+++ b/gnu/lib/libg++/g++-include/VStack.hP
diff --git a/gnu/lib/libg++/g++-include/gen/Vec.ccP b/gnu/lib/libg++/g++-include/Vec.ccP
index c9cbfb2109e6..c9cbfb2109e6 100644
--- a/gnu/lib/libg++/g++-include/gen/Vec.ccP
+++ b/gnu/lib/libg++/g++-include/Vec.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/Vec.hP b/gnu/lib/libg++/g++-include/Vec.hP
index 97ff3f5fef09..97ff3f5fef09 100644
--- a/gnu/lib/libg++/g++-include/gen/Vec.hP
+++ b/gnu/lib/libg++/g++-include/Vec.hP
diff --git a/gnu/lib/libg++/g++-include/gen/XPBag.ccP b/gnu/lib/libg++/g++-include/XPBag.ccP
index 76dc35cf3932..76dc35cf3932 100644
--- a/gnu/lib/libg++/g++-include/gen/XPBag.ccP
+++ b/gnu/lib/libg++/g++-include/XPBag.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/XPBag.hP b/gnu/lib/libg++/g++-include/XPBag.hP
index 296a59082d0b..296a59082d0b 100644
--- a/gnu/lib/libg++/g++-include/gen/XPBag.hP
+++ b/gnu/lib/libg++/g++-include/XPBag.hP
diff --git a/gnu/lib/libg++/g++-include/gen/XPDeque.ccP b/gnu/lib/libg++/g++-include/XPDeque.ccP
index 6b363d9bdc4e..6b363d9bdc4e 100644
--- a/gnu/lib/libg++/g++-include/gen/XPDeque.ccP
+++ b/gnu/lib/libg++/g++-include/XPDeque.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/XPDeque.hP b/gnu/lib/libg++/g++-include/XPDeque.hP
index b8e7c8268f08..b8e7c8268f08 100644
--- a/gnu/lib/libg++/g++-include/gen/XPDeque.hP
+++ b/gnu/lib/libg++/g++-include/XPDeque.hP
diff --git a/gnu/lib/libg++/g++-include/gen/XPPQ.ccP b/gnu/lib/libg++/g++-include/XPPQ.ccP
index 41515a39bbbf..41515a39bbbf 100644
--- a/gnu/lib/libg++/g++-include/gen/XPPQ.ccP
+++ b/gnu/lib/libg++/g++-include/XPPQ.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/XPPQ.hP b/gnu/lib/libg++/g++-include/XPPQ.hP
index af813a2b90d5..af813a2b90d5 100644
--- a/gnu/lib/libg++/g++-include/gen/XPPQ.hP
+++ b/gnu/lib/libg++/g++-include/XPPQ.hP
diff --git a/gnu/lib/libg++/g++-include/gen/XPQueue.ccP b/gnu/lib/libg++/g++-include/XPQueue.ccP
index 77bfd1c7a957..77bfd1c7a957 100644
--- a/gnu/lib/libg++/g++-include/gen/XPQueue.ccP
+++ b/gnu/lib/libg++/g++-include/XPQueue.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/XPQueue.hP b/gnu/lib/libg++/g++-include/XPQueue.hP
index ebae20f3f616..ebae20f3f616 100644
--- a/gnu/lib/libg++/g++-include/gen/XPQueue.hP
+++ b/gnu/lib/libg++/g++-include/XPQueue.hP
diff --git a/gnu/lib/libg++/g++-include/gen/XPSet.ccP b/gnu/lib/libg++/g++-include/XPSet.ccP
index 1102790700b9..1102790700b9 100644
--- a/gnu/lib/libg++/g++-include/gen/XPSet.ccP
+++ b/gnu/lib/libg++/g++-include/XPSet.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/XPSet.hP b/gnu/lib/libg++/g++-include/XPSet.hP
index 9269ec12c8fe..9269ec12c8fe 100644
--- a/gnu/lib/libg++/g++-include/gen/XPSet.hP
+++ b/gnu/lib/libg++/g++-include/XPSet.hP
diff --git a/gnu/lib/libg++/g++-include/gen/XPStack.ccP b/gnu/lib/libg++/g++-include/XPStack.ccP
index fe24f0f044a1..fe24f0f044a1 100644
--- a/gnu/lib/libg++/g++-include/gen/XPStack.ccP
+++ b/gnu/lib/libg++/g++-include/XPStack.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/XPStack.hP b/gnu/lib/libg++/g++-include/XPStack.hP
index 9d103e530dda..9d103e530dda 100644
--- a/gnu/lib/libg++/g++-include/gen/XPStack.hP
+++ b/gnu/lib/libg++/g++-include/XPStack.hP
diff --git a/gnu/lib/libg++/g++-include/gen/XPlex.ccP b/gnu/lib/libg++/g++-include/XPlex.ccP
index c91e5035a4ff..c91e5035a4ff 100644
--- a/gnu/lib/libg++/g++-include/gen/XPlex.ccP
+++ b/gnu/lib/libg++/g++-include/XPlex.ccP
diff --git a/gnu/lib/libg++/g++-include/gen/XPlex.hP b/gnu/lib/libg++/g++-include/XPlex.hP
index 41f100091bd9..41f100091bd9 100644
--- a/gnu/lib/libg++/g++-include/gen/XPlex.hP
+++ b/gnu/lib/libg++/g++-include/XPlex.hP
diff --git a/gnu/lib/libg++/g++-include/assert.h b/gnu/lib/libg++/g++-include/assert.h
deleted file mode 100644
index 44a65704cfae..000000000000
--- a/gnu/lib/libg++/g++-include/assert.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef __libgxx_assert_h
-
-extern "C" {
-#ifdef __assert_h_recursive
-#include_next <assert.h>
-#else
-/* assert.h on some systems needs stdio.h, in violation of ANSI. */
-#include <stdio.h>
-#include_next <assert.h>
-
-#define __libgxx_assert_h 1
-#endif
-}
-#endif
diff --git a/gnu/lib/libg++/g++-include/bstring.h b/gnu/lib/libg++/g++-include/bstring.h
deleted file mode 100644
index 3b2f5900276f..000000000000
--- a/gnu/lib/libg++/g++-include/bstring.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <string.h>
diff --git a/gnu/lib/libg++/g++-include/ctype.h b/gnu/lib/libg++/g++-include/ctype.h
deleted file mode 100644
index b573e1995df9..000000000000
--- a/gnu/lib/libg++/g++-include/ctype.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <_G_config.h>
-extern "C" {
-#include_next <ctype.h>
-#ifndef toupper
-extern int toupper _G_ARGS((int));
-#endif
-#ifndef tolower
-extern int tolower _G_ARGS((int));
-#endif
-}
diff --git a/gnu/lib/libg++/g++-include/curses.h b/gnu/lib/libg++/g++-include/curses.h
deleted file mode 100644
index b7b32be78c77..000000000000
--- a/gnu/lib/libg++/g++-include/curses.h
+++ /dev/null
@@ -1,82 +0,0 @@
-#ifndef _G_curses_h
-
-#include <_G_config.h>
-
-#if _G_HAVE_CURSES
-
-#ifdef __curses_h_recursive
-#include_next <curses.h>
-#else
-#define __curses_h_recursive
-
-extern "C" {
-#include_next <curses.h>
-
-/* Some systems (SVR4 for example) allow the definition of CHTYPE to set the
- type of some arguments to the curses functions. It can be set to "char"
- to save space, or it can be set to something longer to store both a
- character and some attributes. By default they do not define CHTYPE,
- and when CHTYPE is not defined, the default type is "unsigned long" instead
- of the traditional "char". However, SVR4 <curses.h> does define
- _VR3_COMPAT_CODE, so we can use that to detect when we should use the SVR4
- default if CHTYPE is not defined. For other systems, just default to the
- traditional default "char". */
-
-#ifdef CHTYPE
- typedef CHTYPE _G_chtype; /* Use specified type. */
-#else
-#ifdef _VR3_COMPAT_CODE
- typedef unsigned long _G_chtype; /* SVR4 default is "unsigned long" */
-#elif defined(hpux)
- typedef unsigned int _G_chtype;
-#else
- typedef char _G_chtype; /* Traditional default is "char" */
-#endif
-#endif
-
-/* Some args are conceptually const, but SVR4 (and others?) get it wrong. */
-#define _C_const /* const */
-
-WINDOW * (newwin)(int, int, int, int);
-WINDOW * (subwin)(WINDOW *, int, int, int, int);
-WINDOW * (initscr)();
-int (box) (WINDOW*, _G_chtype, _G_chtype);
-int (delwin)(WINDOW*);
-int (getcurx)(WINDOW*);
-int (getcury)(WINDOW*);
-int (mvcur)(int, int, int, int);
-int (overlay)(WINDOW*, WINDOW*);
-int (overwrite)(WINDOW*, WINDOW*);
-int (scroll)(WINDOW*);
-int (touchwin)(WINDOW*);
-int (waddch)(WINDOW*, _G_chtype);
-int (waddstr) _G_ARGS((WINDOW*, const char*));
-int (wclear)(WINDOW*);
-int (wclrtobot)(WINDOW*);
-int (wclrtoeol)(WINDOW*);
-int (wdelch)(WINDOW*);
-int (wdeleteln)(WINDOW*);
-int (werase)(WINDOW*);
-int (wgetch)(WINDOW*);
-int (wgetstr)(WINDOW*, char*);
-int (winsch)(WINDOW*, _G_chtype);
-int (winsertln)(WINDOW*);
-int (wmove)(WINDOW*, int, int);
-int (wrefresh)(WINDOW*);
-int (wstandend)(WINDOW*);
-int (wstandout)(WINDOW*);
-
-// SVR4 rather inanely bundles the format-string parameter with the '...'.
-// This breaks VMS, and I don't want to penalize VMS for being right for once!
-
-int (wprintw)(WINDOW*, _G_CURSES_FORMAT_ARG ...);
-int (mvwprintw)(WINDOW*, int y, int x, _G_CURSES_FORMAT_ARG ...);
-int (wscanw)(WINDOW*, _G_CURSES_FORMAT_ARG ...);
-int (mvwscanw)(WINDOW*, int, int, _G_CURSES_FORMAT_ARG ...);
-int (endwin)();
-
-}
-#define _G_curses_h
-#endif
-#endif /* _G_HAVE_CURSES */
-#endif /* _G_curses_h */
diff --git a/gnu/lib/libg++/g++-include/gen/defs.hP b/gnu/lib/libg++/g++-include/defs.hP
index 054f6a65c3d8..054f6a65c3d8 100644
--- a/gnu/lib/libg++/g++-include/gen/defs.hP
+++ b/gnu/lib/libg++/g++-include/defs.hP
diff --git a/gnu/lib/libg++/g++-include/dir.h b/gnu/lib/libg++/g++-include/dir.h
deleted file mode 100644
index 78c540242c57..000000000000
--- a/gnu/lib/libg++/g++-include/dir.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <sys/dir.h>
diff --git a/gnu/lib/libg++/g++-include/dirent.h b/gnu/lib/libg++/g++-include/dirent.h
deleted file mode 100644
index 4c06ea837a8f..000000000000
--- a/gnu/lib/libg++/g++-include/dirent.h
+++ /dev/null
@@ -1,44 +0,0 @@
-#ifndef __libgxx_dirent_h
-
-#include <_G_config.h>
-
-#if !_G_HAVE_DIRENT
-#define __libgxx_dirent_h
-#define direct dirent
-#include <sys/dir.h>
-#else
-
-extern "C" {
-
-#ifdef __dirent_h_recursive
-#include_next <dirent.h>
-#else
-// Note: sys/dir.h checks __dirent_h_recursive
-#define __dirent_h_recursive
-#define opendir __hide_opendir
-#define closedir __hide_closedir
-#define readdir __hide_readdir
-#define telldir __hide_telldir
-#define seekdir __hide_seekdir
-
-#include_next <dirent.h>
-
-#define __libgxx_dirent_h
-#undef opendir
-#undef closedir
-#undef readdir
-#undef telldir
-#undef seekdir
-
-DIR *opendir(const char *);
-int closedir(DIR *);
-struct dirent *readdir(DIR *);
-long telldir(DIR *);
-void seekdir(DIR *, long);
-// We don't bother with rewinddir (many systems define it as a macro).
-// void rewinddir(DIR *);
-#endif
-}
-
-#endif
-#endif
diff --git a/gnu/lib/libg++/g++-include/errno.h b/gnu/lib/libg++/g++-include/errno.h
deleted file mode 100644
index f9f86c85d142..000000000000
--- a/gnu/lib/libg++/g++-include/errno.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef errno_h
-
-extern "C" {
-
-#ifdef __errno_h_recursive
-#include_next <errno.h>
-#else
-#define __errno_h_recursive
-#include_next <errno.h>
-
-#define errno_h 1
-
-extern char* sys_errlist[];
-extern int sys_nerr;
-#ifndef errno
-extern int errno;
-#endif
-void perror(const char*);
-char* strerr(int);
-
-#endif
-}
-
-#endif
diff --git a/gnu/lib/libg++/g++-include/fcntl.h b/gnu/lib/libg++/g++-include/fcntl.h
deleted file mode 100644
index 48637ef0167f..000000000000
--- a/gnu/lib/libg++/g++-include/fcntl.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef fcntl_h
-
-extern "C" {
-
-#ifdef __fcntl_h_recursive
-#include_next <fcntl.h>
-#else
-#define fcntl __hide_fcntl
-#define open __hide_open
-#define creat __hide_creat
-
-#define __fcntl_h_recursive
-#include <_G_config.h>
-#include_next <fcntl.h>
-
-#undef fcntl
-#undef open
-#undef creat
-
-#define fcntl_h 1
-
-int fcntl(int, int, ...);
-int creat _G_ARGS((const char*, unsigned short int));
-
-int open _G_ARGS((const char*, int, ...));
-
-#endif
-}
-#endif
diff --git a/gnu/lib/libg++/g++-include/grp.h b/gnu/lib/libg++/g++-include/grp.h
deleted file mode 100644
index ed937deb7da8..000000000000
--- a/gnu/lib/libg++/g++-include/grp.h
+++ /dev/null
@@ -1,41 +0,0 @@
-#ifndef grp_h
-
-extern "C" {
-
-#ifdef __grp_h_recursive
-#include_next <grp.h>
-#else
-#define __grp_h_recursive
-
-#include <stdio.h>
-
-#define getgrent c_proto_getgrent
-#define getgrgid c_proto_getgrgid
-#define getgrnam c_proto_getgrnam
-#define setgrent c_proto_setgrent
-#define endgrent c_proto_endgrent
-#define fgetgrent c_proto_fgetgrent
-
-#include_next <grp.h>
-
-#define grp_h 1
-
-#undef getgrent
-#undef getgrgid
-#undef getgrnam
-
-extern struct group* getgrent();
-extern struct group* fgetgrent(FILE*);
-extern struct group* getgrgid(int);
-extern struct group* getgrnam(const char*);
-#if defined(__OSF1__) || defined (__386BSD__)
-extern int setgrent();
-#else
-extern void setgrent();
-#endif
-extern void endgrent();
-
-#endif
-}
-
-#endif
diff --git a/gnu/lib/libg++/g++-include/gen/intSList.hP b/gnu/lib/libg++/g++-include/intSList.hP
index 24aa3b6a685b..24aa3b6a685b 100644
--- a/gnu/lib/libg++/g++-include/gen/intSList.hP
+++ b/gnu/lib/libg++/g++-include/intSList.hP
diff --git a/gnu/lib/libg++/g++-include/gen/intVec.hP b/gnu/lib/libg++/g++-include/intVec.hP
index e3838700251d..e3838700251d 100644
--- a/gnu/lib/libg++/g++-include/gen/intVec.hP
+++ b/gnu/lib/libg++/g++-include/intVec.hP
diff --git a/gnu/lib/libg++/g++-include/math.h b/gnu/lib/libg++/g++-include/math.h
deleted file mode 100644
index 2bf43305197e..000000000000
--- a/gnu/lib/libg++/g++-include/math.h
+++ /dev/null
@@ -1,221 +0,0 @@
-// This may look like C code, but it is really -*- C++ -*-
-/*
-Copyright (C) 1988 Free Software Foundation
- written by Doug Lea (dl@rocky.oswego.edu)
-
-This file is part of the GNU C++ Library. This 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. 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 Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with this library; if not, write to the Free Software
-Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-
-#ifndef _math_h
-#ifdef __GNUG__
-#pragma interface
-#endif
-#define _math_h 1
-
-#if defined(hp300) && defined(__HAVE_FPU__)
-#define __HAVE_68881__ 1
-#endif
-
-#if defined(masscomp)
-#define __HAVE_68881__ 1
-#endif
-
-#ifdef __HAVE_68881__ /* MC68881/2 Floating-Point Coprocessor */
-extern "C" { /* fill in what we've left out */
-#include <math-68881.h>
-
-double acosh(double);
-double asinh(double);
-double cbrt(double);
-double copysign(double,double);
-double erf(double);
-double erfc(double);
-double finite(double);
-double gamma(double);
-double hypot(double,double);
-double infnan(int);
-int isinf(double);
-int isnan(double);
-double j0(double);
-double j1(double);
-double jn(int, double);
-double lgamma(double);
-double y0(double);
-double y1(double);
-double yn(int, double);
-
-double aint(double);
-double anint(double);
-int irint(double);
-int nint(double);
-}
-/* Please add inline asm code for other machines here! */
-#else
-extern "C" {
-
-#include <_G_config.h>
-
-double acos(double);
-double acosh(double);
-double asin(double);
-double asinh(double);
-double atan(double);
-double atan2(double, double);
-double atanh(double);
-double cbrt(double);
-double ceil(double);
-double copysign(double,double);
-double cos(double);
-double cosh(double);
-double drem(double,double);
-double erf(double);
-double erfc(double);
-double exp(double);
-double expm1(double);
-double fabs(double);
-int finite(double);
-double floor(double);
-double fmod(double, double);
-double frexp(double, int*);
-double gamma(double);
-double hypot(double,double);
-double infnan(int);
-#if !defined(sequent) && !defined(DGUX) &&!defined(sony) && !defined(masscomp) && !defined(hpux)
-/* see below */
-int isinf(double);
-int isnan(double);
-#endif
-double j0(double);
-double j1(double);
-double jn(int, double);
-double ldexp(double, int);
-double lgamma(double);
-double log(double);
-double log10(double);
-double log1p(double);
-double logb(double);
-double modf(double, double*);
-double pow(double, double);
-double rint(double);
-double scalb _G_ARGS((double, int));
-double sin(double);
-double sinh(double);
-double sqrt(double);
-double tan(double);
-double tanh(double);
-double y0(double);
-double y1(double);
-double yn(int, double);
-
-double aint(double);
-double anint(double);
-int irint(double);
-int nint(double);
-}
-
-#endif
-
-/* libg++ doesn't use this since it is not available on some systems */
-
-/* the following ifdef is just for compiling OOPS */
-
-#ifndef DONT_DECLARE_EXCEPTION
-struct libm_exception
-{
- int type;
- char* name;
- double arg1, arg2, retval;
-};
-
-#define DOMAIN 1
-#define SING 2
-#define OVERFLOW 3
-#define UNDERFLOW 4
-#define TLOSS 5
-#define PLOSS 6
-
-extern "C" int matherr(libm_exception*);
-
-#endif
-
-#include <float.h>
-
-/* On some systems, HUGE ought to be MAXFLOAT or IEEE infinity */
-
-#ifndef HUGE
-#define HUGE DBL_MAX
-#endif
-#ifndef HUGE_VAL
-#define HUGE_VAL DBL_MAX
-#endif
-
-
-/* sequents don't supply these. The following should suffice */
-#if defined(sequent) || defined(DGUX) || defined(sony) || defined(masscomp) \
-|| defined(hpux)
-#include <float.h>
-static inline int isnan(double x) { return x != x; }
-static inline int isinf(double x) { return x > DBL_MAX || x < -DBL_MAX; }
-#endif
-
-/* These seem to be sun & sysV names of these constants */
-
-#ifndef M_E
-#define M_E 2.7182818284590452354
-#endif
-#ifndef M_LOG2E
-#define M_LOG2E 1.4426950408889634074
-#endif
-#ifndef M_LOG10E
-#define M_LOG10E 0.43429448190325182765
-#endif
-#ifndef M_LN2
-#define M_LN2 0.69314718055994530942
-#endif
-#ifndef M_LN10
-#define M_LN10 2.30258509299404568402
-#endif
-#ifndef M_PI
-#define M_PI 3.14159265358979323846
-#endif
-#ifndef M_PI_2
-#define M_PI_2 1.57079632679489661923
-#endif
-#ifndef M_1_PI
-#define M_1_PI 0.31830988618379067154
-#endif
-#ifndef M_PI_4
-#define M_PI_4 0.78539816339744830962
-#endif
-#ifndef M_2_PI
-#define M_2_PI 0.63661977236758134308
-#endif
-#ifndef M_2_SQRTPI
-#define M_2_SQRTPI 1.12837916709551257390
-#endif
-#ifndef M_SQRT2
-#define M_SQRT2 1.41421356237309504880
-#endif
-#ifndef M_SQRT1_2
-#define M_SQRT1_2 0.70710678118654752440
-#endif
-
-#ifndef PI // as in stroustrup
-#define PI M_PI
-#endif
-#ifndef PI2
-#define PI2 M_PI_2
-#endif
-
-#endif
diff --git a/gnu/lib/libg++/g++-include/memory.h b/gnu/lib/libg++/g++-include/memory.h
deleted file mode 100644
index dc3b3d52824d..000000000000
--- a/gnu/lib/libg++/g++-include/memory.h
+++ /dev/null
@@ -1,42 +0,0 @@
-
-#ifndef _memory_h
-#define _memory_h 1
-
-#include "_G_config.h"
-#include <stddef.h>
-
-extern "C" {
-
-void* memalign _G_ARGS((_G_size_t, _G_size_t));
-void* memccpy _G_ARGS((void*, const void*, int, _G_size_t));
-void* memchr _G_ARGS((const void*, int, _G_size_t));
-int memcmp _G_ARGS((const void*, const void*, _G_size_t));
-void* memcpy _G_ARGS((void*, const void*, _G_size_t));
-void* memmove _G_ARGS((void*, const void*, _G_size_t));
-void* memset _G_ARGS((void*, int, _G_size_t));
-int ffs _G_ARGS((int));
-#if defined(__OSF1__) || defined(__386BSD__)
-int getpagesize _G_ARGS((void));
-#else
-_G_size_t getpagesize _G_ARGS((void));
-#endif
-void* valloc _G_ARGS((_G_size_t));
-
-void bcopy _G_ARGS((const void*, void*, _G_size_t));
-int bcmp _G_ARGS((const void*, const void*, int));
-void bzero _G_ARGS((void*, int));
-}
-
-#ifdef __GNUG__
-#ifndef alloca
-#define alloca(x) __builtin_alloca(x)
-#endif
-#else
-#ifndef IV
-extern "C" void* alloca(_G_size_t);
-#else
-extern "C" void* alloca(unsigned long);
-#endif /* IV */
-#endif
-
-#endif
diff --git a/gnu/lib/libg++/g++-include/netdb.h b/gnu/lib/libg++/g++-include/netdb.h
deleted file mode 100644
index c718a8e5b718..000000000000
--- a/gnu/lib/libg++/g++-include/netdb.h
+++ /dev/null
@@ -1,4 +0,0 @@
-extern "C"
-{
-#include_next <netdb.h>
-}
diff --git a/gnu/lib/libg++/g++-include/pwd.h b/gnu/lib/libg++/g++-include/pwd.h
deleted file mode 100644
index f33d7ee4141e..000000000000
--- a/gnu/lib/libg++/g++-include/pwd.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef _pwd_h
-
-// the Interviews-based standard kludge again
-
-extern "C" {
-
-#ifdef __pwd_h_recursive
-#include_next <pwd.h>
-#else
-#define getpwent c_proto_getpwent
-#define getpwuid c_proto_getpwuid
-#define getpwnam c_proto_getpwnam
-#define setpwent c_proto_setpwent
-#define endpwent c_proto_endpwent
-
-#define __pwd_h_recursive
-#include_next <pwd.h>
-
-#define _pwd_h 1
-
-#undef getpwent
-#undef getpwuid
-#undef getpwnam
-#undef setpwent
-#undef endpwent
-
-extern struct passwd* getpwent();
-extern struct passwd* getpwuid(int);
-extern struct passwd* getpwnam(const char*);
-extern int setpwent();
-extern int endpwent();
-
-#endif
-}
-
-#endif
diff --git a/gnu/lib/libg++/g++-include/setjmp.h b/gnu/lib/libg++/g++-include/setjmp.h
deleted file mode 100644
index dc35dea4e728..000000000000
--- a/gnu/lib/libg++/g++-include/setjmp.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef _setjmp_h
-
-extern "C" {
-
-#ifdef __setjmp_h_recursive
-#include_next <setjmp.h>
-#else
-#define __setjmp_h_recursive
-#define setjmp C_header_setjmp
-#define longjmp C_header_longjmp
-
-#ifdef VMS
-#include "gnu_cc_include:[000000]setjmp.h"
-#else
-#include_next <setjmp.h>
-#endif
-
-#undef setjmp
-#undef longjmp
-
-#define _setjmp_h 1
-
-extern int setjmp(jmp_buf);
-extern void longjmp(jmp_buf, int);
-
-#endif
-}
-
-#endif
diff --git a/gnu/lib/libg++/g++-include/signal.h b/gnu/lib/libg++/g++-include/signal.h
deleted file mode 100644
index 1fe0f1611e3a..000000000000
--- a/gnu/lib/libg++/g++-include/signal.h
+++ /dev/null
@@ -1,80 +0,0 @@
-// This may look like C code, but it is really -*- C++ -*-
-/*
-Copyright (C) 1989 Free Software Foundation
- written by Doug Lea (dl@rocky.oswego.edu)
-
-This file is part of the GNU C++ Library. This 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. 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 Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with this library; if not, write to the Free Software
-Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#ifndef _signal_h
-
-#include <_G_config.h>
-
-extern "C" {
-
-#ifdef __signal_h_recursive
-#include_next <signal.h>
-#else
-
-#define __signal_h_recursive
-
-#define signal __hide_signal
-#define psignal __hide_psignal
-#include_next <signal.h>
-#undef signal
-#undef psignal
-
-#define _signal_h 1
-
-// The Interviews folks call this SignalHandler. Might as well conform.
-typedef _G_signal_return_type (*SignalHandler) (...);
-typedef int (*SSignalHandler) (...);
-
-extern SignalHandler signal _G_ARGS((int sig, SignalHandler action));
-//extern SignalHandler sigset _G_ARGS((int sig, SignalHandler action));
-extern SSignalHandler ssignal _G_ARGS((int sig, SSignalHandler action));
-extern int gsignal _G_ARGS((int sig));
-extern int kill _G_ARGS((_G_pid_t pid, int sig));
-#ifndef __386BSD__
-extern int killpg _G_ARGS((short int, int));
-#else
-extern int killpg _G_ARGS((_G_pid_t, int));
-#endif
-extern int siginterrupt _G_ARGS((int, int));
-extern void psignal _G_ARGS((unsigned, const char*));
-
-#ifndef hpux // Interviews folks claim that hpux doesn't like these
-extern int sigsetmask _G_ARGS((int mask));
-extern int sigblock _G_ARGS((int mask));
-extern int sigpause _G_ARGS((int mask));
-extern int sigvec _G_ARGS((int, struct sigvec*, struct sigvec*));
-#endif
-
-// The Interviews version also has these ...
-
-#define SignalBad ((SignalHandler)-1)
-#define SignalDefault ((SignalHandler)0)
-#define SignalIgnore ((SignalHandler)1)
-
-#undef BADSIG
-#undef SIG_DFL
-#undef SIG_IGN
-#define BAD_SIG SignalBad
-#define SIG_DFL SignalDefault
-#define SIG_IGN SignalIgnore
-
-#endif
-}
-
-#endif
-
diff --git a/gnu/lib/libg++/g++-include/stdarg.h b/gnu/lib/libg++/g++-include/stdarg.h
deleted file mode 100644
index 67dc22e1ab93..000000000000
--- a/gnu/lib/libg++/g++-include/stdarg.h
+++ /dev/null
@@ -1,3 +0,0 @@
-extern "C" {
-#include_next <stdarg.h>
-}
diff --git a/gnu/lib/libg++/g++-include/stddef.h b/gnu/lib/libg++/g++-include/stddef.h
deleted file mode 100644
index 66e78bab2036..000000000000
--- a/gnu/lib/libg++/g++-include/stddef.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#ifndef __libgxx_stddef_h
-
-extern "C" {
-#ifdef __stddef_h_recursive
-#include_next <stddef.h>
-#else
-#include_next <stddef.h>
-
-#define __libgxx_stddef_h 1
-#endif
-}
-#endif
diff --git a/gnu/lib/libg++/g++-include/stdio.h b/gnu/lib/libg++/g++-include/stdio.h
deleted file mode 100644
index 7ee1cf2ffa2b..000000000000
--- a/gnu/lib/libg++/g++-include/stdio.h
+++ /dev/null
@@ -1,180 +0,0 @@
-// This may look like C code, but it is really -*- C++ -*-
-/*
-Copyright (C) 1988 Free Software Foundation
- written by Doug Lea (dl@rocky.oswego.edu)
-
-This file is part of the GNU C++ Library. This 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. 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 Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with this library; if not, write to the Free Software
-Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#ifndef _stdio_h
-#ifdef __GNUG__
-#pragma interface
-#endif
-
-#ifdef __stdio_h_recursive
-#include_next <stdio.h>
-#else
-#define __stdio_h_recursive
-
-// Note: The #define _stdio_h is at the end of this file,
-// in case #include_next <stdio.h> finds an installed version of this
-// same file -- we want it to continue until it finds the C version.
-
-#include <_G_config.h>
-
-extern "C" {
-
-#undef NULL
-
-#define fdopen __hide_fdopen
-#define fopen __hide_fopen
-#define fprintf __hide_fprintf
-#define fputs __hide_fputs
-#define fread __hide_fread
-#define freopen __hide_freopen
-#define fscanf __hide_fscanf
-#define ftell __hide_ftell
-#define fwrite __hide_fwrite
-#define new __hide_new /* In case 'new' is used as a parameter name. */
-#define perror __hide_perror
-#define popen __hide_popen
-#define printf __hide_printf
-#define puts __hide_puts
-#define putw __hide_putw
-#define rewind __hide_rewind
-#define tempnam __hide_tempnam
-#define scanf __hide_scanf
-#define setbuf __hide_setbuf
-#define setbuffer __hide_setbuffer
-#define setlinebuf __hide_setlinebuf
-#define setvbuf __hide_setvbuf
-#define sprintf __hide_sprintf
-#define sscanf __hide_sscanf
-#define tempnam __hide_tempnam
-#define vfprintf __hide_vfprintf
-#define vprintf __hide_vprintf
-#define vsprintf __hide_vsprintf
-#define _flsbuf __hide__flsbuf
-
-#include_next <stdio.h>
-
-#undef fdopen
-#undef fopen
-#undef fprintf
-#undef fputs
-#undef fread
-#undef freopen
-#undef fscanf
-#undef ftell
-#undef fwrite
-#undef new
-#undef perror
-#undef popen
-#undef printf
-#undef puts
-#undef putw
-/* SCO defines remove to call unlink; that's very dangerous for us. */
-#undef remove
-#undef rewind
-#undef tempnam
-#undef scanf
-#undef setbuf
-#undef setbuffer
-#undef setlinebuf
-#undef setvbuf
-#undef sprintf
-#undef sscanf
-#undef tempnam
-#undef vprintf
-#undef vfprintf
-#undef vsprintf
-#undef _flsbuf
-
-#ifndef NULL
-#define NULL _G_NULL
-#endif
-
-#ifndef size_t
-#define size_t _G_size_t
-#endif
-}
-
-extern "C" {
-
-int fclose(FILE*);
-FILE* fdopen(int, const char*);
-int fflush(FILE*);
-int fgetc(FILE*);
-#ifndef __386BSD__
-char* fgets _G_ARGS((char*, int, FILE *));
-#else
-char* fgets _G_ARGS((char*, _G_size_t, FILE *));
-#endif
-FILE* fopen(const char*, const char*);
-int fprintf(FILE*, const char* ...);
-int fputc(int, FILE*);
-int fputs(const char*, FILE*);
-size_t fread(void*, size_t, size_t, FILE*);
-#ifdef VMS
-FILE* freopen(const char*, const char*, FILE* ...);
-#else
-FILE* freopen(const char*, const char*, FILE*);
-#endif
-int fscanf(FILE*, const char* ...);
-int fseek(FILE*, long, int);
-long ftell(FILE *);
-size_t fwrite(const void*, size_t, size_t, FILE*);
-char* gets(char*);
-int getw(FILE*);
-int pclose(FILE*);
-void perror(const char*);
-FILE* popen(const char*, const char*);
-int printf(const char* ...);
-int puts(const char*);
-int putw(int, FILE*);
-int rewind(FILE*);
-int scanf(const char* ...);
-void setbuf(FILE*, char*);
-void setbuffer(FILE*, char*, int);
-int setlinebuf(FILE*);
-int setvbuf(FILE*, char*, int, size_t);
-int sscanf(char*, const char* ...);
-FILE* tmpfile();
-int ungetc(int, FILE*);
-int vfprintf _G_ARGS((FILE*, const char*, _G_va_list));
-int vprintf _G_ARGS((const char*, _G_va_list));
-_G_sprintf_return_type sprintf _G_ARGS((char*, const char* ...));
-_G_sprintf_return_type vsprintf _G_ARGS((char*, const char*, _G_va_list));
-
-extern int _filbuf _G_ARGS((FILE*));
-extern int _flsbuf _G_ARGS((unsigned, FILE*));
-
-}
-
-#ifndef L_ctermid
-#define L_ctermid 9
-#endif
-#ifndef L_cuserid
-#define L_cuserid 9
-#endif
-#ifndef P_tmpdir
-#define P_tmpdir "/tmp/"
-#endif
-#ifndef L_tmpnam
-#define L_tmpnam (sizeof(P_tmpdir) + 15)
-#endif
-
-#define _stdio_h 1
-
-#endif
-#endif // _stdio_h
diff --git a/gnu/lib/libg++/g++-include/stdlib.h b/gnu/lib/libg++/g++-include/stdlib.h
deleted file mode 100644
index b0682435da73..000000000000
--- a/gnu/lib/libg++/g++-include/stdlib.h
+++ /dev/null
@@ -1,81 +0,0 @@
-
-
-#ifndef _stdlib_h
-#define _stdlib_h 1
-
-#include <_G_config.h>
-#include <stddef.h>
-
-extern "C" {
-
-int abs(int);
-
-#ifdef __GNUG__
-void volatile abort(void);
-#else
-void abort(void);
-#endif
-
-double atof(const char*);
-int atoi(const char*);
-long atol(const char*);
-
-int atexit(auto void (*p) (void));
-void* bsearch (const void *, const void *, size_t,
- size_t, auto int (*ptf)(const void*, const void*));
-void* calloc(size_t, size_t);
-void cfree(void*);
-
-#ifdef __GNUG__
-void volatile exit(int);
-#else
-void exit(int);
-#endif
-
-char* fcvt(double, int, int*, int*);
-void free(void*);
-char* getenv(const char*);
-int getopt _G_ARGS((int, char * const *, const char*));
-int getpw(int, char*);
-char* gcvt(double, int, char*);
-char* ecvt(double, int, int*, int*);
-extern char** environ;
-
-long labs(long);
-void* malloc(size_t);
-size_t malloc_usable_size(void*);
-int putenv(const char*);
-extern char* optarg;
-extern int opterr;
-extern int optind;
-void qsort(void*, size_t, size_t, auto int (*ptf)(void*,void*));
-int rand(void);
-void* realloc(void*, size_t);
-int setkey(const char*);
-int srand(unsigned int);
-double strtod(const char*, char**);
-long strtol(const char*, char**, int);
-unsigned long strtoul(const char*, char **, int);
-int system(const char*);
-
-long random(void);
-void srandom(int);
-char* setstate(char*);
-char* initstate(unsigned, char*, int);
-
-double drand48(void);
-void lcong48(short*);
-long jrand48(short*);
-long lrand48(void);
-long mrand48(void);
-long nrand48(short*);
-short* seed48(short*);
-void srand48(long);
-
-char* ctermid(char*);
-char* cuserid(char*);
-char* tempnam(const char*, const char*);
-char* tmpnam(char*);
-
-}
-#endif
diff --git a/gnu/lib/libg++/g++-include/string.h b/gnu/lib/libg++/g++-include/string.h
deleted file mode 100644
index b11ca0acfffc..000000000000
--- a/gnu/lib/libg++/g++-include/string.h
+++ /dev/null
@@ -1,45 +0,0 @@
-
-#ifndef _string_h
-#define _string_h 1
-
-#include <_G_config.h>
-
-#ifndef size_t
-#define size_t _G_size_t
-#endif
-
-#ifndef NULL
-#define NULL _G_NULL
-#endif
-
-extern "C" {
-
-char* strcat(char*, const char*);
-char* strchr(const char*, int);
-int strcmp(const char*, const char*);
-int strcoll(const char*, const char*);
-char* strcpy(char*, const char*);
-size_t strcspn(const char*, const char*);
-char* strdup(const char*);
-// NOTE: If you get a error message from g++ that this declaration
-// conflicts with a <built-in> declaration of strlen(), that usually
-// indicates that __SIZE_TYPE__ is incorrectly defined by gcc.
-// Fix or add SIZE_TYPE in the appropriate file in gcc/config/*.h.
-size_t strlen(const char*);
-char* strncat(char*, const char*, size_t);
-int strncmp(const char*, const char*, size_t);
-char* strncpy(char*, const char*, size_t);
-char* strpbrk(const char*, const char*);
-char* strrchr(const char*, int);
-size_t strspn(const char*, const char*);
-char* strstr(const char*, const char *);
-char* strtok(char*, const char*);
-size_t strxfrm(char*, const char*, size_t);
-
-char* index(const char*, int);
-char* rindex(const char*, int);
-}
-
-#include <memory.h>
-
-#endif
diff --git a/gnu/lib/libg++/g++-include/strings.h b/gnu/lib/libg++/g++-include/strings.h
deleted file mode 100644
index 3b2f5900276f..000000000000
--- a/gnu/lib/libg++/g++-include/strings.h
+++ /dev/null
@@ -1 +0,0 @@
-#include <string.h>
diff --git a/gnu/lib/libg++/g++-include/sys/dir.h b/gnu/lib/libg++/g++-include/sys/dir.h
deleted file mode 100644
index 586867252a6c..000000000000
--- a/gnu/lib/libg++/g++-include/sys/dir.h
+++ /dev/null
@@ -1,42 +0,0 @@
-#ifndef __libgxx_sys_dir_h
-
-extern "C" {
-
-#ifdef __sys_dir_h_recursive
-#include_next <sys/dir.h>
-#else
-#define __sys_dir_h_recursive
-#define opendir __hide_opendir
-#define closedir __hide_closedir
-#define readdir __hide_readdir
-#define telldir __hide_telldir
-#define seekdir __hide_seekdir
-
-#include_next <sys/dir.h>
-
-#define __libgxx_sys_dir_h
-#undef opendir
-#undef closedir
-#undef readdir
-#undef telldir
-#undef seekdir
-
-DIR *opendir(const char *);
-int closedir(DIR *);
-#ifdef __dirent_h_recursive
-// Some operating systems we won't mention (such as the imitation
-// of Unix marketed by IBM) implement dirent.h by including sys/dir.h,
-// in which case sys/dir.h defines struct dirent, rather than
-// the struct direct originally used by BSD.
-struct dirent *readdir(DIR *);
-#else
-struct direct *readdir(DIR *);
-#endif
-long telldir(DIR *);
-void seekdir(DIR *, long);
-// We don't bother with rewinddir (many systems define it as a macro).
-// void rewinddir(DIR *);
-#endif
-}
-
-#endif
diff --git a/gnu/lib/libg++/g++-include/sys/fcntl.h b/gnu/lib/libg++/g++-include/sys/fcntl.h
deleted file mode 100644
index d4fdcfeddaaa..000000000000
--- a/gnu/lib/libg++/g++-include/sys/fcntl.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef __libgxx_sys_fcntl_h
-
-extern "C"
-{
-#ifdef __sys_fcntl_h_recursive
-#include_next <sys/fcntl.h>
-#else
-#define __sys_fcntl_h_recursive
-#include_next <sys/fcntl.h>
-#define __libgxx_sys_fcntl_h 1
-#endif
-}
-
-
-#endif
diff --git a/gnu/lib/libg++/g++-include/sys/file.h b/gnu/lib/libg++/g++-include/sys/file.h
deleted file mode 100644
index 70b49c244a80..000000000000
--- a/gnu/lib/libg++/g++-include/sys/file.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef __libgxx_sys_file_h
-
-extern "C"
-{
-#ifdef __sys_file_h_recursive
-#include_next <sys/file.h>
-#else
-#define fcntl __hide_fcntl
-#define open __hide_open
-#define creat __hide_creat
-
-#define __sys_file_h_recursive
-
-#ifdef VMS
-#include "GNU_CC_INCLUDE:[sys]file.h"
-#else
-#include_next <sys/file.h>
-#endif
-
-#undef fcntl
-#undef open
-#undef creat
-
-#define __libgxx_sys_file_h 1
-
-#endif
-}
-#endif
diff --git a/gnu/lib/libg++/g++-include/sys/mman.h b/gnu/lib/libg++/g++-include/sys/mman.h
deleted file mode 100644
index c4b2e15793dc..000000000000
--- a/gnu/lib/libg++/g++-include/sys/mman.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef __libgxx_sys_mman_h
-
-extern "C" {
-#ifdef __sys_mman_h_recursive
-#include_next <sys/mman.h>
-#else
-#define __sys_mman_h_recursive
-#include_next <sys/mman.h>
-
-#define __libgxx_sys_mman_h 1
-#endif
-}
-
-#endif
diff --git a/gnu/lib/libg++/g++-include/sys/param.h b/gnu/lib/libg++/g++-include/sys/param.h
deleted file mode 100644
index 610a19b8f424..000000000000
--- a/gnu/lib/libg++/g++-include/sys/param.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef __libgxx_sys_param_h
-
-extern "C"
-{
-#ifdef __sys_param_h_recursive
-#include_next <sys/param.h>
-#else
-#define __sys_param_h_recursive
-
-#ifdef VMS
-#include "GNU_CC_INCLUDE:[sys]param.h"
-#else
-#include_next <sys/param.h>
-#endif
-
-#undef setbit /* Conflicts with Integer::setbit(). */
-
-#define __libgxx_sys_param_h 1
-#endif
-}
-
-#endif
diff --git a/gnu/lib/libg++/g++-include/sys/resource.h b/gnu/lib/libg++/g++-include/sys/resource.h
deleted file mode 100644
index 3596c1b3145c..000000000000
--- a/gnu/lib/libg++/g++-include/sys/resource.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef __libgxx_sys_resource_h
-
-extern "C"
-{
-#ifdef __sys_resource_h_recursive
-#include_next <sys/resource.h>
-#else
-#include <_G_config.h>
-#define __sys_resource_h_recursive
-#include <sys/time.h>
-
-#ifdef VMS
-#include "GNU_CC_INCLUDE:[sys]resource.h"
-#else
-#include_next <sys/resource.h>
-#endif
-
-#define __libgxx_sys_resource_h 1
-
-int getrusage(int, struct rusage*);
-int getrlimit (int resource, struct rlimit *rlp);
-int setrlimit _G_ARGS((int resource, const struct rlimit *rlp));
-long ulimit(int, long);
-int getpriority(int, int);
-int setpriority(int, int, int);
-#endif
-}
-
-#endif
diff --git a/gnu/lib/libg++/g++-include/sys/select.h b/gnu/lib/libg++/g++-include/sys/select.h
deleted file mode 100644
index 1c80ffef05e3..000000000000
--- a/gnu/lib/libg++/g++-include/sys/select.h
+++ /dev/null
@@ -1,8 +0,0 @@
-/* Needed by Interviews for AIX. */
-#ifndef __libgxx_sys_select_h
-extern "C"
-{
-#include_next <sys/select.h>
-#define __libgxx_sys_select_h 1
-}
-#endif
diff --git a/gnu/lib/libg++/g++-include/sys/signal.h b/gnu/lib/libg++/g++-include/sys/signal.h
deleted file mode 100644
index 68212052ceac..000000000000
--- a/gnu/lib/libg++/g++-include/sys/signal.h
+++ /dev/null
@@ -1,37 +0,0 @@
-// This may look like C code, but it is really -*- C++ -*-
-/*
-Copyright (C) 1989 Free Software Foundation
- written by Doug Lea (dl@rocky.oswego.edu)
-
-This file is part of the GNU C++ Library. This 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. 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 Library General Public License for more details.
-You should have received a copy of the GNU Library General Public
-License along with this library; if not, write to the Free Software
-Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-/* Partly for systems that think signal.h is is sys/ */
-/* But note that some systems that use sys/signal.h to define signal.h. */
-
-#ifndef __libgxx_sys_signal_h
-#if defined(__sys_signal_h_recursive) || defined(__signal_h_recursive)
-#include_next <sys/signal.h>
-#else
-#define __sys_signal_h_recursive
-
-extern "C" {
-#define signal __hide_signal
-#include_next <sys/signal.h>
-#undef signal
-}
-
-#define __libgxx_sys_signal_h 1
-#endif
-#endif
-
diff --git a/gnu/lib/libg++/g++-include/sys/socket.h b/gnu/lib/libg++/g++-include/sys/socket.h
deleted file mode 100644
index 5ff6018ccbf4..000000000000
--- a/gnu/lib/libg++/g++-include/sys/socket.h
+++ /dev/null
@@ -1,63 +0,0 @@
-#ifndef __libgxx_sys_socket_h
-
-#include <_G_config.h>
-
-extern "C"
-{
-#ifdef __sys_socket_h_recursive
-#include_next <sys/socket.h>
-#else
-#define __sys_socket_h_recursive
-#include <time.h>
-
-#ifdef VMS
-#include "GNU_CC_INCLUDE:[sys]socket.h"
-#else
-#include_next <sys/socket.h>
-#endif
-
-#define __libgxx_sys_socket_h 1
-
-// void* in select, since different systems use int* or fd_set*
-int accept _G_ARGS((int, struct sockaddr*, int*));
-#ifndef __386BSD__
-int select _G_ARGS((int, void*, void*, void*, struct timeval*));
-
-int bind _G_ARGS((int, const void*, int));
-int connect _G_ARGS((int, struct sockaddr*, int));
-#else
-int select _G_ARGS((int, struct fd_set*, struct fd_set*, struct fd_set*, struct timeval*));
-
-int bind _G_ARGS((int, const struct sockaddr *, int));
-int connect _G_ARGS((int, const struct sockaddr*, int));
-#endif
-int getsockname _G_ARGS((int, struct sockaddr*, int*));
-int getpeername _G_ARGS((int, struct sockaddr*, int*));
-int getsockopt(int, int, int, void*, int*);
-int listen(int, int);
-#ifndef hpux
-int rcmd _G_ARGS((char**, int, const char*, const char*, const char*, int*));
-#endif
-int recv(int, void*, int, int);
-int recvmsg(int, struct msghdr*, int);
-int rexec(char**, int, const char*, const char*, const char*, int*);
-int rresvport(int*);
-int send _G_ARGS((int, const void*, int, int));
-int sendmsg _G_ARGS((int, const struct msghdr*, int));
-int shutdown(int, int);
-int socket(int, int, int);
-int socketpair(int, int, int, int sv[2]);
-
-#ifndef __386BSD__
-int recvfrom _G_ARGS((int, void*, int, int, void*, int *));
-int sendto _G_ARGS((int, const void*, int, int, void*, int));
-int setsockopt _G_ARGS((int, int, int, const char*, int));
-#else
-int recvfrom _G_ARGS((int, void*, int, int, struct sockaddr*, int *));
-int sendto _G_ARGS((int, const void*, int, int, const struct sockaddr*, int));
-int setsockopt _G_ARGS((int, int, int, const void*, int));
-#endif
-#endif
-}
-
-#endif
diff --git a/gnu/lib/libg++/g++-include/sys/stat.h b/gnu/lib/libg++/g++-include/sys/stat.h
deleted file mode 100644
index cffe2a5e1d31..000000000000
--- a/gnu/lib/libg++/g++-include/sys/stat.h
+++ /dev/null
@@ -1,47 +0,0 @@
-#ifndef __libgxx_sys_stat_h
-
-extern "C"
-{
-#ifdef __sys_stat_h_recursive
-#include_next <sys/stat.h>
-#else
-#define __sys_stat_h_recursive
-#include <_G_config.h>
-#define chmod __hide_chmod
-#ifdef VMS
-#include "GNU_CC_INCLUDE:[sys]stat.h"
-#else
-#include_next <sys/stat.h>
-#endif
-#undef chmod
-
-#define __libgxx_sys_stat_h 1
-
-extern int chmod _G_ARGS((const char*, _G_mode_t));
-extern int stat _G_ARGS((const char *path, struct stat *buf));
-extern int lstat _G_ARGS((const char *path, struct stat *buf));
-extern int fstat _G_ARGS((int fd, struct stat *buf));
-
-#ifndef S_ISDIR
-#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
-#endif
-#ifndef S_ISBLK
-#define S_ISBLK(mode) (((mode) & S_IFMT) == S_IFBLK)
-#endif
-#ifndef S_ISCHR
-#define S_ISCHR(mode) (((mode) & S_IFMT) == S_IFCHR)
-#endif
-#ifndef S_ISFIFO
-#define S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFFIFO)
-#endif
-#ifndef S_ISREG
-#define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
-#endif
-#if !defined(S_ISLNK) && defined(S_IFLNK)
-#define S_ISLNK(mode) (((mode) & S_IFMT) == S_IFLNK)
-#endif
-
-#endif
-}
-
-#endif
diff --git a/gnu/lib/libg++/g++-include/sys/time.h b/gnu/lib/libg++/g++-include/sys/time.h
deleted file mode 100644
index 81419b8c4814..000000000000
--- a/gnu/lib/libg++/g++-include/sys/time.h
+++ /dev/null
@@ -1,41 +0,0 @@
-#ifndef __libgxx_sys_time_h
-
-extern "C"
-{
-#ifdef __sys_time_h_recursive
-#include_next <sys/time.h>
-#else
-#define __sys_time_h_recursive
-
-// Some system (e.g Ultrix) define these in sys/time.h.
-
-#ifndef __time_h_recursive
-#define time __hide_time
-#define clock __hide_clock
-#define gmtime __hide_gmtime
-#define localtime __hide_localtime
-#define ctime __hide_ctime
-#define asctime __hide_asctime
-#define strftime __hide_strftime
-#endif
-
-#ifdef VMS
-#include "GNU_CC_INCLUDE:[sys]resourcetime.h"
-#else
-#include_next <sys/time.h>
-#endif
-#undef __sys_time_h_recursive
-
-#define __libgxx_sys_time_h 1
-
-#undef clock
-#undef ctime
-#undef gmtime
-#undef localtime
-#undef time
-#undef asctime
-#undef strftime
-#endif
-}
-
-#endif
diff --git a/gnu/lib/libg++/g++-include/sys/times.h b/gnu/lib/libg++/g++-include/sys/times.h
deleted file mode 100644
index d026ca5258f0..000000000000
--- a/gnu/lib/libg++/g++-include/sys/times.h
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef __libgxx_sys_times_h
-
-extern "C"
-{
-#ifdef __sys_times_h_recursive
-#include_next <sys/times.h>
-#else
-#define __sys_times_h_recursive
-#include_next <sys/times.h>
-#define __libgxx_sys_times_h 1
-
-#include <_G_config.h>
-
-extern _G_clock_t times _G_ARGS((struct tms*));
-
-#endif
-}
-
-
-#endif
diff --git a/gnu/lib/libg++/g++-include/sys/types.h b/gnu/lib/libg++/g++-include/sys/types.h
deleted file mode 100644
index 67f4d316b5ea..000000000000
--- a/gnu/lib/libg++/g++-include/sys/types.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef __libgxx_sys_types_h
-
-extern "C"
-{
-#ifdef __sys_types_h_recursive
-#include_next <sys/types.h>
-#else
-
-#define __sys_types_h_recursive
-#include <stddef.h>
-
-#ifdef VMS
-#include "GNU_CC_INCLUDE:[sys]types.h"
-#else
-#include_next <sys/types.h>
-#endif
-
-#define __libgxx_sys_types_h 1
-
-#endif
-}
-
-
-#endif
-
diff --git a/gnu/lib/libg++/g++-include/sys/wait.h b/gnu/lib/libg++/g++-include/sys/wait.h
deleted file mode 100644
index e6e4e31924e9..000000000000
--- a/gnu/lib/libg++/g++-include/sys/wait.h
+++ /dev/null
@@ -1,42 +0,0 @@
-#ifndef __libgxx_sys_wait_h
-
-#include <_G_config.h>
-
-extern "C" {
-#ifdef __sys_wait_h_recursive
-#include_next <sys/wait.h>
-#else
-#define __sys_wait_h_recursive
-
-
-#if _G_HAVE_SYS_WAIT
-#ifdef VMS
-#include "GNU_CC_INCLUDE:[sys]wait.h"
-#else
-#include_next <sys/wait.h>
-#endif
-#else /* !_G_HAVE_SYS_WAIT */
-/* Traditional definitions. */
-#define WEXITSTATUS(status) (((x) >> 8) & 0xFF)
-#define WIFSTOPPED(x) (((x) & 0xFF) == 0177)
-#define WIFEXITED(x) (! WIFSTOPPED(x) && WTERMSIG(x) == 0)
-#define WIFSIGNALED(x) (! WIFSTOPPED(x) && WTERMSIG(x) != 0)
-#define WTERMSIG(status) ((x) & 0x7F)
-#define WSTOPSIG(status) (((x) >> 8) & 0xFF)
-#endif /* !_G_HAVE_SYS_WAIT */
-
-#define __libgxx_sys_wait_h 1
-
-struct rusage;
-extern _G_pid_t wait _G_ARGS((int*));
-extern _G_pid_t waitpid _G_ARGS((_G_pid_t, int*, int));
-extern _G_pid_t wait3 _G_ARGS((int*, int options, struct rusage*));
-#ifndef __386BSD__
-extern _G_pid_t wait4 _G_ARGS((int, int*, int, struct rusage*));
-#else
-extern _G_pid_t wait4 _G_ARGS((_G_pid_t, int*, int, struct rusage*));
-#endif
-#endif
-}
-
-#endif
diff --git a/gnu/lib/libg++/g++-include/time.h b/gnu/lib/libg++/g++-include/time.h
deleted file mode 100644
index ea9c00f4a45c..000000000000
--- a/gnu/lib/libg++/g++-include/time.h
+++ /dev/null
@@ -1,108 +0,0 @@
-#ifndef _G_time_h
-#define _G_time_h
-
-extern "C" {
-
-#ifdef __time_h_recursive
-#include_next <time.h>
-#else
-#define __time_h_recursive
-
-#include <_G_config.h>
-
-// A clean way to use and/or define time_t might allow removal of this crud.
-#ifndef __sys_time_h_recursive
-#define time __hide_time
-#define clock __hide_clock
-#define difftime __hide_difftime
-#define gmtime __hide_gmtime
-#define localtime __hide_localtime
-#define ctime __hide_ctime
-#define asctime __hide_asctime
-#define strftime __hide_strftime
-#endif
-#define mktime __hide_mktime
-#define tzset __hide_tzset
-#define tzsetwall __hide_tzsetwall
-#define getitimer __hide_getitimer
-#define setitimer __hide_setitimer
-#define gettimeofday __hide_gettimeofday
-#define settimeofday __hide_settimeofday
-
-#ifdef VMS
- struct unix_time
- {
- long int tv_sec;
- long int tv_usec;
- };
-
- struct rusage
- {
- struct unix_time ru_utime;
- };
-
-#define RUSAGE_SELF 0 //define it, it will be unused
-#else
-#ifdef hpux
-#define _INCLUDE_POSIX_SOURCE
-#endif
-
-#include_next <time.h>
-#endif
-#undef __time_h_recursive
-
-#define time_h 1
-
-#undef time
-#undef clock
-#undef difftime
-#undef gmtime
-#undef localtime
-#undef asctime
-#undef ctime
-#undef mktime
-#undef strftime
-#undef tzset
-#undef tzsetwall
-#undef getitimer
-#undef setitimer
-#undef gettimeofday
-#undef settimeofday
-
-extern char* asctime _G_ARGS((const struct tm*));
-extern char* ctime _G_ARGS((const _G_time_t*));
-double difftime _G_ARGS((_G_time_t, _G_time_t));
-extern struct tm* gmtime _G_ARGS((const _G_time_t*));
-extern struct tm* localtime _G_ARGS((const _G_time_t*));
-extern _G_time_t mktime(struct tm*);
-extern _G_size_t strftime _G_ARGS((char*,_G_size_t,const char*,const struct tm*));
-extern void tzset();
-extern void tzsetwall();
-
-extern int getitimer(int, struct itimerval*);
-extern int setitimer _G_ARGS((int, const struct itimerval*,struct itimerval*));
-extern int gettimeofday(struct timeval*, struct timezone*);
-extern int settimeofday _G_ARGS((const struct timeval*,const struct timezone*));
-extern int stime _G_ARGS((const _G_time_t*));
-extern int dysize(int);
-
-#if defined(___AIX__)
-int clock (void);
-#elif defined(hpux)
-unsigned long clock(void);
-#else
-long clock(void);
-#endif
-_G_time_t time(_G_time_t*);
-unsigned ualarm(unsigned, unsigned);
-#ifndef __386BSD__
-unsigned usleep(unsigned);
-void profil _G_ARGS((unsigned short*, _G_size_t, unsigned int, unsigned));
-#else
-void usleep(unsigned);
-int profil _G_ARGS((char*, int, int, int));
-#endif
-
-#endif
-}
-#endif
diff --git a/gnu/lib/libg++/g++-include/unistd.h b/gnu/lib/libg++/g++-include/unistd.h
deleted file mode 100644
index bd7a93529aed..000000000000
--- a/gnu/lib/libg++/g++-include/unistd.h
+++ /dev/null
@@ -1,187 +0,0 @@
-#ifndef _G_unistd_h
-#define _G_unistd_h 1
-
-#include <_G_config.h>
-
-extern "C" {
-
-#if _G_HAVE_UNISTD
-#ifndef _G_USE_PROTOS
-#define chmod __hide_chmod
-#define chown __hide_chown
-#define execl __hide_execl
-#define execlp __hide_execlp
-#define execle __hide_execle
-#define fchown __hide_fchown
-#define ioctl __hide_ioctl
-#define setgid __hide_setgid
-#define setuid __hide_setuid
-#endif
-#ifdef _AIX
-// AIX's unistd.h defines int rename (const char *old, const char *new).
-// This is not legal ANSI. It causes a C++ syntax error (because of 'new').
-#define new __new
-#endif
-#include_next <unistd.h>
-#ifdef _AIX
-#undef new
-#endif
-#ifndef _G_USE_PROTOS
-#undef chmod
-#undef chown
-#undef execl
-#undef execle
-#undef execlp
-#undef fchown
-#undef ioctl
-#undef setgid
-#undef setuid
-#endif
-#else
-#ifndef SEEK_SET
-#define SEEK_SET 0
-#define SEEK_CUR 1
-#define SEEK_END 2
-#endif
-
-#ifndef F_OK
-#define F_OK 0
-#endif
-#ifndef X_OK
-#define X_OK 1
-#endif
-#ifndef W_OK
-#define W_OK 2
-#endif
-#ifndef R_OK
-#define R_OK 4
-#endif
-#endif
-
-#ifdef __GNUG__
-extern void volatile _exit(int);
-#else
-void _exit(int);
-#endif
-
-extern unsigned alarm _G_ARGS((unsigned));
-#ifndef __386BSD__
-extern int brk _G_ARGS((void*));
-#else
-extern char* brk _G_ARGS((const char*));
-#endif
-extern int chdir _G_ARGS((const char*));
-extern int chmod _G_ARGS((const char*, _G_mode_t));
-extern int chown (const char*, _G_uid_t, _G_gid_t);
-extern int close _G_ARGS((int));
-extern char* crypt _G_ARGS((const char*, const char*));
-extern int dup _G_ARGS((int));
-extern int dup2 _G_ARGS((int, int));
-#ifndef __386BSD__
-extern void encrypt _G_ARGS((char*, int));
-#else
-extern int encrypt _G_ARGS((char*, int));
-#endif
-extern int execl (const char*, const char *, ...);
-extern int execle (const char*, const char *, ...);
-extern int execlp (const char*, const char*, ...);
-#ifndef __386BSD__
-extern int exect _G_ARGS((const char*, const char**, char**));
-extern int execv _G_ARGS((const char*, const char * const *));
-extern int execve _G_ARGS((const char*, const char * const *, const char * const *));
-extern int execvp _G_ARGS((const char*, const char * const *));
-extern int fchown (int, _G_uid_t, _G_gid_t);
-#else
-extern int exect _G_ARGS((const char*, char * const*, char * const *));
-extern int execv _G_ARGS((const char*, char * const *));
-extern int execve _G_ARGS((const char*, char * const *, char * const *));
-extern int execvp _G_ARGS((const char*, char * const *));
-extern int fchown (int, int, int);
-#endif
-extern _G_pid_t fork _G_ARGS((void));
-extern int fsync _G_ARGS((int));
-extern int ftruncate _G_ARGS((int, _G_off_t));
-extern char* getcwd _G_ARGS((char*, _G_size_t));
-extern int getdomainname _G_ARGS((char*, int));
-extern int getdtablesize _G_ARGS((void));
-#ifndef __386BSD__
-extern int getgroups _G_ARGS((int, _G_gid_t*));
-#else
-extern int getgroups _G_ARGS((int, int*));
-#endif
-extern _G_uid_t geteuid _G_ARGS((void));
-extern _G_gid_t getegid _G_ARGS((void));
-extern _G_gid_t getgid _G_ARGS((void));
-extern long gethostid _G_ARGS((void));
-extern int gethostname _G_ARGS((char*, int));
-extern _G_pid_t getpgrp _G_ARGS((...));
-extern _G_pid_t getpid _G_ARGS((void));
-extern _G_pid_t getppid _G_ARGS((void));
-extern char* getlogin _G_ARGS((void));
-extern char* getpass _G_ARGS((const char*));
-extern _G_uid_t getuid _G_ARGS((void));
-#ifndef __386BSD__
-extern int ioctl (int, int, ... );
-#else
-extern int ioctl (int, unsigned long, ... );
-#endif
-extern int isatty _G_ARGS((int));
-extern int link _G_ARGS((const char*, const char*));
-extern int lockf _G_ARGS((int, int, long));
-extern int mkstemp _G_ARGS((char*));
-extern char* mktemp _G_ARGS((char*));
-extern int nice _G_ARGS((int));
-extern int pause _G_ARGS((void));
-extern int pipe _G_ARGS((int*));
-extern int readlink _G_ARGS((const char*, char*, int));
-extern int rename _G_ARGS((const char*, const char*));
-extern int rmdir _G_ARGS((const char*));
-#if defined( __OSF1__ ) || defined (__386BSD__)
-extern char* sbrk _G_ARGS((int));
-#else
-extern void* sbrk _G_ARGS((int));
-#endif
-extern int syscall _G_ARGS((int, ...));
-extern int setgid (_G_gid_t);
-extern int sethostname _G_ARGS((const char*, int));
-#ifdef _G_SYSV
-extern _G_pid_t setpgrp _G_ARGS((void));
-extern _G_pid_t setsid _G_ARGS((void));
-#else
-#ifndef __386BSD__
-extern _G_pid_t setpgrp _G_ARGS((_G_pid_t, _G_pid_t));
-#else
-extern _G_pid_t setsid _G_ARGS((void));
-extern int setpgrp _G_ARGS((_G_pid_t, _G_pid_t));
-#endif
-#endif
-extern int setregid _G_ARGS((int, int));
-extern int setreuid _G_ARGS((int, int));
-extern int setuid (_G_uid_t);
-extern unsigned sleep _G_ARGS((unsigned));
-extern void swab _G_ARGS((void*, void*, int));
-extern int symlink _G_ARGS((const char*, const char*));
-extern long sysconf _G_ARGS((int));
-extern int truncate _G_ARGS((const char*, _G_off_t));
-extern char* ttyname _G_ARGS((int));
-extern int ttyslot _G_ARGS((void));
-//extern int umask _G_ARGS((int)); /* commented out for now; wrong for SunOs4.1 */
-extern int unlink _G_ARGS((const char*));
-#ifndef __386BSD__
-extern _G_pid_t vfork _G_ARGS((void));
-#else
-extern int vfork _G_ARGS((void));
-#endif
-extern int vadvise _G_ARGS((int));
-extern int vhangup _G_ARGS((void));
-extern _G_off_t lseek _G_ARGS((int, long, int));
-extern _G_ssize_t read _G_ARGS((int, void*, _G_size_t));
-extern _G_ssize_t write _G_ARGS((int, const void*, _G_size_t));
-extern int access _G_ARGS((const char*, int));
-#ifndef hpux
-extern int flock _G_ARGS((int, int));
-#endif
-
-}
-
-#endif
diff --git a/gnu/lib/libg++/g++-include/values.h b/gnu/lib/libg++/include/values.h
index 56f8a9415551..529c5e7ae96a 100644
--- a/gnu/lib/libg++/g++-include/values.h
+++ b/gnu/lib/libg++/include/values.h
@@ -1,4 +1,3 @@
-// This may look like C code, but it is really -*- C++ -*-
/*
Copyright (C) 1988 Free Software Foundation
written by Doug Lea (dl@rocky.oswego.edu)
@@ -17,8 +16,8 @@ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-#ifndef _values_h
-#define _values_h 1
+#ifndef _VALUES_H_
+#define _VALUES_H_
#define BITSPERBYTE 8
#define BITS(type) (BITSPERBYTE * (int)sizeof(type))
@@ -145,8 +144,8 @@ extern float _maxfloat, _minfloat;
#define DMAXEXP ((1 << _DEXPLEN - 1) - 1 + _IEEE)
#define FMAXEXP ((1 << _FEXPLEN - 1) - 1 + _IEEE)
-// #elif defined(vax)
-// use vax versions by default -- they seem to be the most conservative
+/* #elif defined(vax) */
+/* use vax versions by default -- they seem to be the most conservative */
#else
#define MAXDOUBLE 1.701411834604692293e+38
@@ -170,5 +169,5 @@ extern float _maxfloat, _minfloat;
#define DMAXPOWTWO ((double)(1L << LONGBITS -2)*(1L << DSIGNIF - LONGBITS +1))
#define FMAXPOWTWO ((float)(1L << FSIGNIF - 1))
-#endif
+#endif /* !_VALUES_H_ */
diff --git a/gnu/lib/libg++/libg++/CursesW.cc b/gnu/lib/libg++/libg++/CursesW.cc
index 9533f6915566..2aa2260ec0ce 100644
--- a/gnu/lib/libg++/libg++/CursesW.cc
+++ b/gnu/lib/libg++/libg++/CursesW.cc
@@ -41,7 +41,7 @@ int CursesWindow::count = 0;
#if !defined(_IO_MAGIC) && !defined(HAVE_VSCANF) &&!defined vsscanf
extern "C" int _doscan(FILE *, const char*, va_list args);
-static int vsscanf(char *buf, const char * fmt, va_list args)
+static int vsscanf(const char *buf, const char * fmt, va_list args)
{
FILE b;
#ifdef _IOSTRG
diff --git a/gnu/lib/libg++/libg++/Makefile b/gnu/lib/libg++/libg++/Makefile
index 4f59cdbe0c8e..8c6a3ccfdb71 100644
--- a/gnu/lib/libg++/libg++/Makefile
+++ b/gnu/lib/libg++/libg++/Makefile
@@ -1,5 +1,11 @@
LIB= g++
+
+# This cruft is necessary due to the way shared library globals are
+# dereferenced. The libg++ encapsulation of curses makes this necessary.
+SHARED_LDADD+= -lcurses
+
CC= gcc
+
SRCS= AllocRing.cc Obstack.cc builtin.cc \
regex.cc Regex.cc String.cc Integer.cc Rational.cc Complex.cc Random.cc \
BitSet.cc BitString.cc LogNorm.cc SmplHist.cc SmplStat.cc \
@@ -17,9 +23,7 @@ SRCS= AllocRing.cc Obstack.cc builtin.cc \
sbufvscan.C stdiostream.C floatconv.C outfloat.C iomanip.C \
insque.c strerror.c
-CFLAGS+= -I$(.CURDIR) -I$(.CURDIR)/../libiberty
-CXXFLAGS= -nostdinc++ -I$(.CURDIR) -I$(.CURDIR)/../g++-include \
- -I$(.CURDIR)/../iostream
+CFLAGS+= -I$(.CURDIR)/../libiberty
NOMAN= noman
.PATH: $(.CURDIR)/../iostream $(.CURDIR)/../libiberty
diff --git a/gnu/lib/libmalloc/Makefile b/gnu/lib/libmalloc/Makefile
index 56724dfc095a..d69a7dbe5a44 100644
--- a/gnu/lib/libmalloc/Makefile
+++ b/gnu/lib/libmalloc/Makefile
@@ -1,7 +1,5 @@
-# $Id: Makefile,v 1.4 1993/12/28 07:54:51 smace Exp $
+# $Id: Makefile,v 1.5 1994/05/27 10:48:19 csgr Exp $
-SHLIB_MAJOR=1
-SHLIB_MINOR=0
CFLAGS+= -I${.CURDIR}
diff --git a/gnu/lib/libreadline/COPYING b/gnu/lib/libreadline/COPYING
new file mode 100644
index 000000000000..1bb82d1b26d8
--- /dev/null
+++ b/gnu/lib/libreadline/COPYING
@@ -0,0 +1,257 @@
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 1, February 1989
+
+ Copyright (C) 1989 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+The Free Software Foundation has exempted Bash from the requirement of
+Paragraph 2c of the General Public License. This is to say, there is
+no requirement for Bash to print a notice when it is started
+interactively in the usual way. We made this exception because users
+and standards expect shells not to print such messages. This
+exception applies to any program that serves as a shell and that is
+based primarily on Bash as opposed to other GNU software.
+
+ Preamble
+
+ The license agreements of most software companies try to keep users
+at the mercy of those companies. By contrast, our General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. The
+General Public License applies to the Free Software Foundation's
+software and to any other program whose authors commit to using it.
+You can use it for your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Specifically, the General Public License is designed to make
+sure that you have the freedom to give away or sell copies of free
+software, that you receive source code or can get it if you want it,
+that you can change the software or use pieces of it in new free
+programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of a such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must tell them their rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any program or other work which
+contains a notice placed by the copyright holder saying it may be
+distributed under the terms of this General Public License. The
+"Program", below, refers to any such program or work, and a "work based
+on the Program" means either the Program or any work containing the
+Program or a portion of it, either verbatim or with modifications. Each
+licensee is addressed as "you".
+
+ 1. You may copy and distribute verbatim copies of the Program's source
+code as you receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice and
+disclaimer of warranty; keep intact all the notices that refer to this
+General Public License and to the absence of any warranty; and give any
+other recipients of the Program a copy of this General Public License
+along with the Program. You may charge a fee for the physical act of
+transferring a copy.
+
+ 2. You may modify your copy or copies of the Program or any portion of
+it, and copy and distribute such modifications under the terms of Paragraph
+1 above, provided that you also do the following:
+
+ a) cause the modified files to carry prominent notices stating that
+ you changed the files and the date of any change; and
+
+ b) cause the whole of any work that you distribute or publish, that
+ in whole or in part contains the Program or any part thereof, either
+ with or without modifications, to be licensed at no charge to all
+ third parties under the terms of this General Public License (except
+ that you may choose to grant warranty protection to some or all
+ third parties, at your option).
+
+ c) If the modified program normally reads commands interactively when
+ run, you must cause it, when started running for such interactive use
+ in the simplest and most usual way, to print or display an
+ announcement including an appropriate copyright notice and a notice
+ that there is no warranty (or else, saying that you provide a
+ warranty) and that users may redistribute the program under these
+ conditions, and telling the user how to view a copy of this General
+ Public License.
+
+ d) You may charge a fee for the physical act of transferring a
+ copy, and you may at your option offer warranty protection in
+ exchange for a fee.
+
+Mere aggregation of another independent work with the Program (or its
+derivative) on a volume of a storage or distribution medium does not bring
+the other work under the scope of these terms.
+
+ 3. You may copy and distribute the Program (or a portion or derivative of
+it, under Paragraph 2) in object code or executable form under the terms of
+Paragraphs 1 and 2 above provided that you also do one of the following:
+
+ a) accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of
+ Paragraphs 1 and 2 above; or,
+
+ b) accompany it with a written offer, valid for at least three
+ years, to give any third party free (except for a nominal charge
+ for the cost of distribution) a complete machine-readable copy of the
+ corresponding source code, to be distributed under the terms of
+ Paragraphs 1 and 2 above; or,
+
+ c) accompany it with the information you received as to where the
+ corresponding source code may be obtained. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form alone.)
+
+Source code for a work means the preferred form of the work for making
+modifications to it. For an executable file, complete source code means
+all the source code for all modules it contains; but, as a special
+exception, it need not include source code for modules which are standard
+libraries that accompany the operating system on which the executable
+file runs, or for standard header files or definitions files that
+accompany that operating system.
+
+ 4. You may not copy, modify, sublicense, distribute or transfer the
+Program except as expressly provided under this General Public License.
+Any attempt otherwise to copy, modify, sublicense, distribute or transfer
+the Program is void, and will automatically terminate your rights to use
+the Program under this License. However, parties who have received
+copies, or rights to use copies, from you under this General Public
+License will not have their licenses terminated so long as such parties
+remain in full compliance.
+
+ 5. By copying, distributing or modifying the Program (or any work based
+on the Program) you indicate your acceptance of this license to do so,
+and all its terms and conditions.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the original
+licensor to copy, distribute or modify the Program subject to these
+terms and conditions. You may not impose any further restrictions on the
+recipients' exercise of the rights granted herein.
+
+ 7. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of the license which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+the license, you may choose any version ever published by the Free Software
+Foundation.
+
+ 8. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to humanity, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these
+terms.
+
+ To do so, attach the following notices to the program. It is safest to
+attach them to the start of each source file to most effectively convey
+the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ 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 1, 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19xx name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the
+appropriate parts of the General Public License. Of course, the
+commands you use may be called something other than `show w' and `show
+c'; they could even be mouse-clicks or menu items--whatever suits your
+program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ program `Gnomovision' (a program to direct compilers to make passes
+ at assemblers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/gnu/lib/libreadline/ChangeLog b/gnu/lib/libreadline/ChangeLog
new file mode 100644
index 000000000000..1cf0c004af56
--- /dev/null
+++ b/gnu/lib/libreadline/ChangeLog
@@ -0,0 +1,403 @@
+Tue Mar 23 14:36:51 1993 Brian Fox (bfox@eos.crseo.ucsb.edu)
+
+ * readline.c (rl_copy): Changed name to rl_copy_text.
+
+Mon Mar 22 19:16:05 1993 Brian Fox (bfox@eos.crseo.ucsb.edu)
+
+ * dispose_cmd.c, several other files. Declare dispose_xxx () as
+ "void".
+
+ * builtins/hashcom.h: Make declarations of hashed_filenames be
+ "extern" to keep the SGI compiler happy.
+
+ * readline.c (rl_initialize_everything): Assign values to
+ out_stream and in_stream immediately, since
+ output_character_function () can be called before
+ readline_internal () is called.
+
+Tue Dec 8 09:30:56 1992 Brian Fox (bfox@cubit)
+
+ * readline.c (rl_init_terminal) Set PC from BC, not from *buffer.
+
+Mon Nov 30 09:35:47 1992 Brian Fox (bfox@cubit)
+
+ * readline.c (invoking_keyseqs_in_map, rl_parse_and_bind) Allow
+ backslash to quote characters, such as backslash, double quote,
+ and space. Backslash quotes all character indiscriminately.
+
+ * funmap.c (vi_keymap) Fix type in "vi-replace" declaration.
+
+Fri Nov 20 10:55:05 1992 Brian Fox (bfox@cubit)
+
+ * readline.c (init_terminal_io, rl_prep_terminal): FINALLY!
+ Declare and use termcap variable `ospeed' when setting up terminal
+ parameters.
+
+Thu Oct 8 08:53:07 1992 Brian J. Fox (bfox@helios)
+
+ * Makefile, this directory: Include (as links to the canonical
+ sources), tilde.c, tilde.h, posixstat.h and xmalloc.c.
+
+Tue Sep 29 13:07:21 1992 Brian J. Fox (bfox@helios)
+
+ * readline.c (init_terminal_io) Don't set arrow keys if the key
+ sequences that represent them are already set.
+
+ * readline.c (rl_function_of_keyseq) New function returns the first
+ function (or macro) found while searching a key sequence.
+
+Mon Sep 28 00:34:04 1992 Brian J. Fox (bfox@helios)
+
+ * readline.c (LibraryVersion) New static char * contains current
+ version number. Version is at 2.0.
+
+ * readline.c (rl_complete_internal): Incorporated clean changes
+ from gilmore (gnu@cygnus.com) to support quoted substrings within
+ completion functions.
+
+ * readline.c (many locations) Added support for the _GO32_,
+ whatever that is. Patches supplied by Cygnus, typed in by hand,
+ with cleanups.
+
+Sun Aug 16 12:46:24 1992 Brian Fox (bfox@cubit)
+
+ * readline.c (init_terminal_io): Find out the values of the keypad
+ arrows and bind them to appropriate RL functions if present.
+
+Mon Aug 10 18:13:24 1992 Brian Fox (bfox@cubit)
+
+ * history.c (stifle_history): A negative argument to stifle
+ becomes zero.
+
+Tue Jul 28 09:28:41 1992 Brian Fox (bfox@cubit)
+
+ * readline.c (rl_variable_bind): New local structure describes
+ booleans by name and address; code in rl_variable_bind () looks at
+ structure to set simple variables.
+
+ * parens.c (rl_insert_close): New variable rl_blink_matching_paren
+ is non-zero if we want to blink the matching open when a close is
+ inserted. If FD_SET is defined, rl_blink_matching_paren defaults
+ to 1, else 0. If FD_SET is not defined, and
+ rl_blink_matching_paren is non-zero, the close character(s) are/is
+ simply inserted.
+
+Wed Jul 22 20:03:59 1992 Brian Fox (bfox@cubit)
+
+ * history.c, readline.c, vi_mode.c: Cause the functions strchr ()
+ and strrchr () to be used instead of index () and rindex ()
+ throughout the source.
+
+Mon Jul 13 11:34:07 1992 Brian Fox (bfox@cubit)
+
+ * readline.c: (rl_variable_bind) New variable "meta-flag" if "on"
+ means force the use of the 8th bit as Meta bit. Internal variable
+ is called meta_flag.
+
+Thu Jul 9 10:37:56 1992 Brian Fox (bfox@cubit)
+
+ * history.c (get_history_event) Change INDEX to LOCAL_INDEX. If
+ compiling for the shell, allow shell metacharacters to separate
+ history tokens as they would for shell tokens.
+
+Sat Jul 4 19:29:12 1992 Brian Fox (bfox@cubit)
+
+ * vi_keymap.c: According to Posix, TAB self-inserts instead of
+ doing completion.
+
+ * vi_mode.c: (rl_vi_yank_arg) Enter VI insert mode after yanking
+ an arg from the previous line.
+
+ * search.c: New file takes over vi style searching and implements
+ non-incremental searching the history.
+
+ Makefile: Add search.c and search.o.
+
+ funmap.c: Add names for non-incremental-forward-search-history and
+ non-incremental-reverse-search-history.
+
+ readline.h: Add extern definitions for non-incremental searching.
+
+ vi_mode.c: Remove old search code; add calls to code in search.c.
+
+Fri Jul 3 10:36:33 1992 Brian Fox (bfox@cubit)
+
+ * readline.c (rl_delete_horizontal_space); New function deletes
+ all whitespace surrounding point.
+
+ funmap.c: Add "delete-horizontal-space".
+ emacs_keymap.c: Put rl_delete_horizontal_space () on M-\.
+
+ * readline.c (rl_set_signals, rl_clear_signals); New function
+ rl_set_sighandler () is either defined in a Posix way (if
+ HAVE_POSIX_SIGNALS is defined) or in a BSD way. Function is
+ called from rl_set_signals () and rl_clear_signals ().
+
+Fri May 8 12:50:15 1992 Brian Fox (bfox@cubit)
+
+ * readline.c: (readline_default_bindings) Do comparisons with
+ _POSIX_VDISABLE casted to `unsigned char'. Change tty characters
+ to be unsigned char.
+
+Thu Apr 30 12:36:35 1992 Brian Fox (bfox@cubit)
+
+ * readline.c: (rl_getc) Handle "read would block" error on
+ non-blocking IO streams.
+
+ * readline.c: (rl_signal_handler): Unblock only the signal that we
+ have caught, not all signals.
+
+Sun Feb 23 03:33:09 1992 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * readline.c: Many functions. Use only the macros META_CHAR and
+ UNMETA to deal with meta characters. Prior to this, we used
+ numeric values and tests.
+
+ * readline.c (rl_complete_internal) Report exactly the number of
+ possible completions, not the number + 1.
+
+ * vi_mode.c (rl_do_move) Do not change the cursor position when
+ using `cw' or `cW'.
+
+ * vi_mode.c (rl_vi_complete) Enter insert mode after completing
+ with `*' or `\'.
+
+Fri Feb 21 05:58:18 1992 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * readline.c (rl_dispatch) Increment rl_key_sequence_length for
+ meta characters that map onto ESC map.
+
+Mon Feb 10 01:41:35 1992 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * history.c (history_do_write) Build a buffer of all of the lines
+ to write and write them in one fell swoop (lower overhead than
+ calling write () for each line). Suggested by Peter Ho.
+
+ * readline.c: Include hbullx20 as well as hpux for determining
+ USGr3ness.
+
+ * readline.c (rl_unix_word_rubout) As per the "Now REMEMBER"
+ comment, pass arguments to rl_kill_text () in the correct order to
+ preserve prepending and appending of killed text.
+
+ * readline.c (rl_search_history) malloc (), realloc (), and free
+ () SEARCH_STRING so that there are no static limits on searching.
+
+ * vi_mode.c (rl_vi_subst) Don't forget to end the undo group.
+
+Fri Jan 31 14:51:02 1992 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * readline.c (rl_signal_handler): Zero the current history entry's
+ pointer after freeing the undo_list when SIGINT received.
+ Reformat a couple of functions.
+
+Sat Jan 25 13:47:35 1992 Brian Fox (bfox at bears)
+
+ * readline.c (parser_if): free () TNAME after use.
+
+Tue Jan 21 01:01:35 1992 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * readline.c (rl_redisplay) and (rl_character_len): Display
+ Control characters as "^c" and Meta characters as "\234", instead
+ of "C-C" and "M-C".
+
+Sun Dec 29 10:59:00 1991 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * readline.c (init_terminal_io) Default to environment variables
+ LINES and COLUMNS before termcap entry values. If all else fails,
+ then assume 80x24 terminal.
+
+Sat Dec 28 16:33:11 1991 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * readline.c: If this machine is USG and it is hpux, then define
+ USGr3.
+
+ * history.c: Cosmetic fixes.
+
+Thu Nov 21 00:10:12 1991 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * vi_mode.c: (rl_do_move) Place cursor at end of line, never at
+ next to last character.
+
+Thu Nov 14 05:08:01 1991 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * history.c (get_history_event) Non-anchored searches can have a
+ return index of greater than zero from get_history_event ().
+
+Fri Nov 1 07:02:13 1991 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * readline.c (rl_translate_keyseq) Make C-? translate to RUBOUT
+ unconditionally.
+
+Mon Oct 28 11:34:52 1991 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * readline.c; Use Posix directory routines and macros.
+
+ * funmap.c; Add entry for call-last-kbd-macro.
+
+ * readline.c (rl_prep_term); Use system EOF character on POSIX
+ systems also.
+
+Thu Oct 3 16:19:53 1991 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * readline.c; Make a distinction between having a TERMIOS tty
+ driver, and having POSIX signal handling. You might one without
+ the other. New defines used HAVE_POSIX_SIGNALS, and
+ TERMIOS_TTY_DRIVER.
+
+Tue Jul 30 22:37:26 1991 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * readline.c: rl_getc () If a call to read () returns without an
+ error, but with zero characters, the file is empty, so return EOF.
+
+Thu Jul 11 20:58:38 1991 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * readline.c: (rl_get_next_history, rl_get_previous_history)
+ Reallocate the buffer space if the line being moved to is longer
+ the the current space allocated. Amazing that no one has found
+ this bug until now.
+
+Sun Jul 7 02:37:05 1991 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * readline.c:(rl_parse_and_bind) Allow leading whitespace.
+ Make sure TERMIO and TERMIOS systems treat CR and NL
+ disctinctly.
+
+Tue Jun 25 04:09:27 1991 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * readline.c: Rework parsing conditionals to pay attention to the
+ prior states of the conditional stack. This makes $if statements
+ work correctly.
+
+Mon Jun 24 20:45:59 1991 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * readline.c: support for displaying key binding information
+ includes the functions rl_list_funmap_names (),
+ invoking_keyseqs_in_map (), rl_invoking_keyseqs (),
+ rl_dump_functions (), and rl_function_dumper ().
+
+ funmap.c: support for same includes rl_funmap_names ().
+
+ readline.c, funmap.c: no longer define STATIC_MALLOC. However,
+ update both version of xrealloc () to handle a null pointer.
+
+Thu Apr 25 12:03:49 1991 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * vi_mode.c (rl_vi_fword, fWord, etc. All functions use
+ the macro `isident()'. Fixed movement bug which prevents
+ continious movement through the text.
+
+Fri Jul 27 16:47:01 1990 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * readline.c (parser_if) Allow "$if term=foo" construct.
+
+Wed May 23 16:10:33 1990 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * readline.c (rl_dispatch) Correctly remember the last command
+ executed. Fixed typo in username_completion_function ().
+
+Mon Apr 9 19:55:48 1990 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * readline.c: username_completion_function (); For text passed in
+ with a leading `~', remember that this could be a filename (after
+ it is completed).
+
+Thu Apr 5 13:44:24 1990 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * readline.c: rl_search_history (): Correctly handle case of an
+ unfound search string, but a graceful exit (as with ESC).
+
+ * readline.c: rl_restart_output (); The Apollo passes the address
+ of the file descriptor to TIOCSTART, not the descriptor itself.
+
+Tue Mar 20 05:38:55 1990 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * readline.c: rl_complete (); second call in a row causes possible
+ completions to be listed.
+
+ * readline.c: rl_redisplay (), added prompt_this_line variable
+ which is the first character character following \n in prompt.
+
+Sun Mar 11 04:32:03 1990 Brian Fox (bfox at gnuwest.fsf.org)
+
+ * Signals are now supposedly handled inside of SYSV compilation.
+
+Wed Jan 17 19:24:09 1990 Brian Fox (bfox at sbphy.ucsb.edu)
+
+ * history.c: history_expand (); fixed overwriting memory error,
+ added needed argument to call to get_history_event ().
+
+Thu Jan 11 10:54:04 1990 Brian Fox (bfox at sbphy.ucsb.edu)
+
+ * readline.c: added mark_modified_lines to control the
+ display of an asterisk on modified history lines. Also
+ added a user variable called mark-modified-lines to the
+ `set' command.
+
+Thu Jan 4 10:38:05 1990 Brian Fox (bfox at sbphy.ucsb.edu)
+
+ * readline.c: start_insert (). Only use IC if we don't have an im
+ capability.
+
+Fri Sep 8 09:00:45 1989 Brian Fox (bfox at aurel)
+
+ * readline.c: rl_prep_terminal (). Only turn on 8th bit
+ as meta-bit iff the terminal is not using parity.
+
+Sun Sep 3 08:57:40 1989 Brian Fox (bfox at aurel)
+
+ * readline.c: start_insert (). Uses multiple
+ insertion call in cases where that makes sense.
+
+ rl_insert (). Read type-ahead buffer for additional
+ keys that are bound to rl_insert, and insert them
+ all at once. Make insertion of single keys given
+ with an argument much more efficient.
+
+Tue Aug 8 18:13:57 1989 Brian Fox (bfox at aurel)
+
+ * readline.c: Changed handling of EOF. readline () returns
+ (char *)EOF or consed string. The EOF character is read from the
+ tty, or if the tty doesn't have one, defaults to C-d.
+
+ * readline.c: Added support for event driven programs.
+ rl_event_hook is the address of a function you want called
+ while Readline is waiting for input.
+
+ * readline.c: Cleanup time. Functions without type declarations
+ do not use return with a value.
+
+ * history.c: history_expand () has new variable which is the
+ characters to ignore immediately following history_expansion_char.
+
+Sun Jul 16 08:14:00 1989 Brian Fox (bfox at aurel)
+
+ * rl_prep_terminal ()
+ BSD version turns off C-s, C-q, C-y, C-v.
+
+ * readline.c -- rl_prep_terminal ()
+ SYSV version hacks readline_echoing_p.
+ BSD version turns on passing of the 8th bit for the duration
+ of reading the line.
+
+Tue Jul 11 06:25:01 1989 Brian Fox (bfox at aurel)
+
+ * readline.c: new variable rl_tilde_expander.
+ If non-null, this contains the address of a function to call if
+ the standard meaning for expanding a tilde fails. The function is
+ called with the text sans tilde (as in "foo"), and returns a
+ malloc()'ed string which is the expansion, or a NULL pointer if
+ there is no expansion.
+
+ * readline.h - new file chardefs.h
+ Separates things that only readline.c needs from the standard
+ header file publishing interesting things about readline.
+
+ * readline.c:
+ readline_default_bindings () now looks at terminal chararacters
+ and binds those as well.
+
+Wed Jun 28 20:20:51 1989 Brian Fox (bfox at aurel)
+
+ * Made readline and history into independent libraries.
+
diff --git a/gnu/lib/libreadline/Makefile b/gnu/lib/libreadline/Makefile
new file mode 100644
index 000000000000..bfe8661dc075
--- /dev/null
+++ b/gnu/lib/libreadline/Makefile
@@ -0,0 +1,25 @@
+# $Id: Makefile,v 1.13 1994/06/12 08:50:39 ache Exp $
+
+
+CFLAGS+= -I${.CURDIR} -DVOID_SIGHANDLER \
+ -DHAVE_UNISTD_H -DHAVE_STRING_H -DHAVE_STDLIB_H -DHAVE_VARARGS_H \
+ -DFreeBSD
+
+LIB= readline
+SRCS+= readline.c funmap.c keymaps.c vi_mode.c parens.c \
+ rltty.c complete.c bind.c isearch.c display.c signals.c \
+ history.c search.c tilde.c xmalloc.c
+HEADERS= history.h readline.h keymaps.h chardefs.h tilde.h
+NOMAN= noman
+
+beforeinstall:
+ @-if [ ! -d ${DESTDIR}/usr/include/readline ]; then \
+ mkdir ${DESTDIR}/usr/include/readline; \
+ chown ${BINOWN}.${BINGRP} ${DESTDIR}/usr/include/readline; \
+ chmod 755 ${DESTDIR}/usr/include/readline; \
+ fi
+ cd ${.CURDIR}/readline; \
+ install -c -o ${BINOWN} -g ${BINGRP} -m 444 \
+ ${HEADERS} ${DESTDIR}/usr/include/readline
+
+.include <bsd.lib.mk>
diff --git a/gnu/lib/libreadline/README b/gnu/lib/libreadline/README
new file mode 100644
index 000000000000..131471ca8354
--- /dev/null
+++ b/gnu/lib/libreadline/README
@@ -0,0 +1,6 @@
+This is the distribution of the Gnu Readline library. See the file
+STANDALONE for a description of the #defines that can be passed via
+the makefile to build readline on different systems.
+
+The file rlconf.h contains defines that enable and disable certain
+readline features.
diff --git a/gnu/lib/libreadline/README.FreeBSD b/gnu/lib/libreadline/README.FreeBSD
new file mode 100644
index 000000000000..6af2775c2eb0
--- /dev/null
+++ b/gnu/lib/libreadline/README.FreeBSD
@@ -0,0 +1,21 @@
+The GNU Readline library is a programming tool that provides a
+consistent user interface for recalling lines of previously typed
+input and performing editing tasks on input lines.
+
+paul@freefall.cdrom.com
+
+There was a bug with tcsh: when readline attempt to get tty
+modes from background, it got no-echo editing tcsh mode.
+
+Workaround for this implemented via TIOCGWINSZ/TIOCSWINSZ
+with same winsize structure: it does nothing expect polling
+process from background. Look tcsh_hack.readme for details.
+
+This version is more ctype-oriented than original bash version.
+
+If you want 8-bit clean version, put
+ set convert-meta off
+ set output-meta on
+in your ~/.inputrc file
+
+ache@astral.msk.su
diff --git a/gnu/lib/libreadline/STANDALONE b/gnu/lib/libreadline/STANDALONE
new file mode 100644
index 000000000000..17d5fb7fc80c
--- /dev/null
+++ b/gnu/lib/libreadline/STANDALONE
@@ -0,0 +1,32 @@
+This is a description of C preprocessor defines that readline accepts.
+Most are passed in from the parent `make'; e.g. from the bash source
+directory.
+
+NO_SYS_FILE <sys/file.h> is not present
+HAVE_UNISTD_H <unistd.h> exists
+HAVE_STDLIB_H <stdlib.h> exists
+HAVE_GETPW_DECLS declarations for the getpw functions are in <pwd.h>
+HAVE_VARARGS_H <varargs.h> exists and is usable
+HAVE_STRING_H <string.h> exists
+HAVE_ALLOCA_H <alloca.h> exists and is needed for alloca()
+HAVE_ALLOCA alloca(3) or a define for it exists
+PRAGMA_ALLOCA use of alloca() requires a #pragma, as in AIX 3.x
+VOID_SIGHANDLER signal handlers are void functions
+HAVE_DIRENT_H <dirent.h> exists and is usable
+HAVE_SYS_PTEM_H <sys/ptem.h> exists
+HAVE_SYS_PTE_H <sys/pte.h> exists
+HAVE_SYS_STREAM_H <sys/stream.h> exists
+
+System-specific options:
+
+OSF1 A machine running OSF/1
+BSD386 BSDI's BSD/386 version 1.0 or 1.1
+NetBSD NetBSD
+FreeBSD FreeBSD version 1.1
+_386BSD Old FreeBSD or NetBSD or ancient Jolitz 386bsd
+AIX AIX 3.x
+USG Running a variant of System V
+USGr3 Running System V.3
+XENIX_22 Xenix 2.2
+Linux Linux
+CRAY running a recent version of Cray UNICOS
diff --git a/gnu/lib/libreadline/VERSION b/gnu/lib/libreadline/VERSION
new file mode 100644
index 000000000000..97c5aef14b50
--- /dev/null
+++ b/gnu/lib/libreadline/VERSION
@@ -0,0 +1 @@
+readline 2.0 from bash1.14.1
diff --git a/gnu/lib/libreadline/ansi_stdlib.h b/gnu/lib/libreadline/ansi_stdlib.h
new file mode 100644
index 000000000000..52339da5d333
--- /dev/null
+++ b/gnu/lib/libreadline/ansi_stdlib.h
@@ -0,0 +1,41 @@
+/* ansi_stdlib.h -- An ANSI Standard stdlib.h. */
+/* A minimal stdlib.h containing extern declarations for those functions
+ that bash uses. */
+
+/* Copyright (C) 1993 Free Software Foundation, Inc.
+
+ This file is part of GNU Bash, the Bourne Again SHell.
+
+ Bash is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 2, or (at your option) any later
+ version.
+
+ Bash is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with Bash; see the file COPYING. If not, write to the Free Software
+ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#if !defined (_STDLIB_H_)
+#define _STDLIB_H_ 1
+
+/* String conversion functions. */
+extern int atoi ();
+extern long int atol ();
+
+/* Memory allocation functions. */
+extern char *malloc ();
+extern char *realloc ();
+extern void free ();
+
+/* Other miscellaneous functions. */
+extern void abort ();
+extern void exit ();
+extern char *getenv ();
+extern void qsort ();
+
+#endif /* _STDLIB_H */
diff --git a/gnu/lib/libreadline/bind.c b/gnu/lib/libreadline/bind.c
new file mode 100644
index 000000000000..b77a8a7c1ba7
--- /dev/null
+++ b/gnu/lib/libreadline/bind.c
@@ -0,0 +1,1476 @@
+/* bind.c -- key binding and startup file support for the readline library. */
+
+/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library, a library for
+ reading lines of text with interactive input and history editing.
+
+ The GNU Readline 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 1, or
+ (at your option) any later version.
+
+ The GNU Readline 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.
+
+ The GNU General Public License is often shipped with GNU software, and
+ is generally kept in a file called COPYING or LICENSE. If you do not
+ have a copy of the license, write to the Free Software Foundation,
+ 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#if !defined (NO_SYS_FILE)
+# include <sys/file.h>
+#endif /* !NO_SYS_FILE */
+#include <signal.h>
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <errno.h>
+/* Not all systems declare ERRNO in errno.h... and some systems #define it! */
+#if !defined (errno)
+extern int errno;
+#endif /* !errno */
+
+#include "posixstat.h"
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+
+/* Some standard library routines. */
+#include <readline/readline.h>
+#include <readline/history.h>
+
+#if !defined (strchr) && !defined (__STDC__)
+extern char *strchr (), *strrchr ();
+#endif /* !strchr && !__STDC__ */
+
+extern int _rl_horizontal_scroll_mode;
+extern int _rl_mark_modified_lines;
+extern int _rl_bell_preference;
+extern int _rl_meta_flag;
+extern int rl_blink_matching_paren;
+extern int _rl_convert_meta_chars_to_ascii;
+extern int _rl_output_meta_chars;
+extern int _rl_complete_show_all;
+#if defined (VISIBLE_STATS)
+extern int rl_visible_stats;
+#endif /* VISIBLE_STATS */
+extern int rl_complete_with_tilde_expansion;
+extern int rl_completion_query_items;
+#if defined (VI_MODE)
+extern char *rl_vi_comment_begin;
+#endif
+
+extern int rl_explicit_arg;
+extern int rl_editing_mode;
+extern unsigned short _rl_parsing_conditionalized_out;
+extern Keymap _rl_keymap;
+
+extern char *possible_control_prefixes[], *possible_meta_prefixes[];
+
+extern char **rl_funmap_names ();
+
+/* Forward declarations */
+void rl_set_keymap_from_edit_mode ();
+
+static int glean_key_from_name ();
+#if !defined (BSD386) && !defined (NetBSD) && \
+ !defined (FreeBSD) && !defined (_386BSD)
+static int stricmp (), strnicmp ();
+#else
+#define stricmp strcasecmp
+#define strnicmp strncasecmp
+#endif
+
+#if defined (STATIC_MALLOC)
+static char *xmalloc (), *xrealloc ();
+#else
+extern char *xmalloc (), *xrealloc ();
+#endif /* STATIC_MALLOC */
+
+/* **************************************************************** */
+/* */
+/* Binding keys */
+/* */
+/* **************************************************************** */
+
+/* rl_add_defun (char *name, Function *function, int key)
+ Add NAME to the list of named functions. Make FUNCTION be the function
+ that gets called. If KEY is not -1, then bind it. */
+rl_add_defun (name, function, key)
+ char *name;
+ Function *function;
+ int key;
+{
+ if (key != -1)
+ rl_bind_key (key, function);
+ rl_add_funmap_entry (name, function);
+ return 0;
+}
+
+/* Bind KEY to FUNCTION. Returns non-zero if KEY is out of range. */
+int
+rl_bind_key (key, function)
+ int key;
+ Function *function;
+{
+ if (key < 0)
+ return (key);
+
+ if (META_CHAR (key) && _rl_convert_meta_chars_to_ascii)
+ {
+ if (_rl_keymap[ESC].type == ISKMAP)
+ {
+ Keymap escmap;
+
+ escmap = FUNCTION_TO_KEYMAP (_rl_keymap, ESC);
+ key = UNMETA (key);
+ escmap[key].type = ISFUNC;
+ escmap[key].function = function;
+ return (0);
+ }
+ return (key);
+ }
+
+ _rl_keymap[key].type = ISFUNC;
+ _rl_keymap[key].function = function;
+ return (0);
+}
+
+/* Bind KEY to FUNCTION in MAP. Returns non-zero in case of invalid
+ KEY. */
+int
+rl_bind_key_in_map (key, function, map)
+ int key;
+ Function *function;
+ Keymap map;
+{
+ int result;
+ Keymap oldmap = _rl_keymap;
+
+ _rl_keymap = map;
+ result = rl_bind_key (key, function);
+ _rl_keymap = oldmap;
+ return (result);
+}
+
+/* Make KEY do nothing in the currently selected keymap.
+ Returns non-zero in case of error. */
+int
+rl_unbind_key (key)
+ int key;
+{
+ return (rl_bind_key (key, (Function *)NULL));
+}
+
+/* Make KEY do nothing in MAP.
+ Returns non-zero in case of error. */
+int
+rl_unbind_key_in_map (key, map)
+ int key;
+ Keymap map;
+{
+ return (rl_bind_key_in_map (key, (Function *)NULL, map));
+}
+
+/* Bind the key sequence represented by the string KEYSEQ to
+ FUNCTION. This makes new keymaps as necessary. The initial
+ place to do bindings is in MAP. */
+rl_set_key (keyseq, function, map)
+ char *keyseq;
+ Function *function;
+ Keymap map;
+{
+ return (rl_generic_bind (ISFUNC, keyseq, function, map));
+}
+
+/* Bind the key sequence represented by the string KEYSEQ to
+ the string of characters MACRO. This makes new keymaps as
+ necessary. The initial place to do bindings is in MAP. */
+rl_macro_bind (keyseq, macro, map)
+ char *keyseq, *macro;
+ Keymap map;
+{
+ char *macro_keys;
+ int macro_keys_len;
+
+ macro_keys = (char *)xmalloc ((2 * strlen (macro)) + 1);
+
+ if (rl_translate_keyseq (macro, macro_keys, &macro_keys_len))
+ {
+ free (macro_keys);
+ return -1;
+ }
+ rl_generic_bind (ISMACR, keyseq, macro_keys, map);
+ return 0;
+}
+
+/* Bind the key sequence represented by the string KEYSEQ to
+ the arbitrary pointer DATA. TYPE says what kind of data is
+ pointed to by DATA, right now this can be a function (ISFUNC),
+ a macro (ISMACR), or a keymap (ISKMAP). This makes new keymaps
+ as necessary. The initial place to do bindings is in MAP. */
+rl_generic_bind (type, keyseq, data, map)
+ int type;
+ char *keyseq, *data;
+ Keymap map;
+{
+ char *keys;
+ int keys_len;
+ register int i;
+
+ /* If no keys to bind to, exit right away. */
+ if (!keyseq || !*keyseq)
+ {
+ if (type == ISMACR)
+ free (data);
+ return -1;
+ }
+
+ keys = xmalloc (1 + (2 * strlen (keyseq)));
+
+ /* Translate the ASCII representation of KEYSEQ into an array of
+ characters. Stuff the characters into KEYS, and the length of
+ KEYS into KEYS_LEN. */
+ if (rl_translate_keyseq (keyseq, keys, &keys_len))
+ {
+ free (keys);
+ return -1;
+ }
+
+ /* Bind keys, making new keymaps as necessary. */
+ for (i = 0; i < keys_len; i++)
+ {
+ int ic = (int) ((unsigned char)keys[i]);
+
+ if (_rl_convert_meta_chars_to_ascii && META_CHAR (ic))
+ {
+ ic = UNMETA (ic);
+ if (map[ESC].type == ISKMAP)
+ map = FUNCTION_TO_KEYMAP (map, ESC);
+ }
+
+ if ((i + 1) < keys_len)
+ {
+ if (map[ic].type != ISKMAP)
+ {
+ if (map[ic].type == ISMACR)
+ free ((char *)map[ic].function);
+
+ map[ic].type = ISKMAP;
+ map[ic].function = KEYMAP_TO_FUNCTION (rl_make_bare_keymap());
+ }
+ map = FUNCTION_TO_KEYMAP (map, ic);
+ }
+ else
+ {
+ if (map[ic].type == ISMACR)
+ free ((char *)map[ic].function);
+
+ map[ic].function = KEYMAP_TO_FUNCTION (data);
+ map[ic].type = type;
+ }
+ }
+ free (keys);
+ return 0;
+}
+
+/* Translate the ASCII representation of SEQ, stuffing the values into ARRAY,
+ an array of characters. LEN gets the final length of ARRAY. Return
+ non-zero if there was an error parsing SEQ. */
+rl_translate_keyseq (seq, array, len)
+ char *seq, *array;
+ int *len;
+{
+ register int i, c, l = 0;
+
+ for (i = 0; c = seq[i]; i++)
+ {
+ if (c == '\\')
+ {
+ c = seq[++i];
+
+ if (!c)
+ break;
+
+ if (((c == 'C' || c == 'M') && seq[i + 1] == '-') ||
+ (c == 'e'))
+ {
+ /* Handle special case of backwards define. */
+ if (strncmp (&seq[i], "C-\\M-", 5) == 0)
+ {
+ array[l++] = ESC;
+ i += 5;
+ array[l++] = CTRL (to_upper (seq[i]));
+ if (!seq[i])
+ i--;
+ continue;
+ }
+
+ switch (c)
+ {
+ case 'M':
+ i++;
+ array[l++] = ESC;
+ break;
+
+ case 'C':
+ i += 2;
+ /* Special hack for C-?... */
+ if (seq[i] == '?')
+ array[l++] = RUBOUT;
+ else
+ array[l++] = CTRL (to_upper (seq[i]));
+ break;
+
+ case 'e':
+ array[l++] = ESC;
+ }
+
+ continue;
+ }
+ }
+ array[l++] = c;
+ }
+
+ *len = l;
+ array[l] = '\0';
+ return (0);
+}
+
+/* Return a pointer to the function that STRING represents.
+ If STRING doesn't have a matching function, then a NULL pointer
+ is returned. */
+Function *
+rl_named_function (string)
+ char *string;
+{
+ register int i;
+
+ rl_initialize_funmap ();
+
+ for (i = 0; funmap[i]; i++)
+ if (stricmp (funmap[i]->name, string) == 0)
+ return (funmap[i]->function);
+ return ((Function *)NULL);
+}
+
+/* Return the function (or macro) definition which would be invoked via
+ KEYSEQ if executed in MAP. If MAP is NULL, then the current keymap is
+ used. TYPE, if non-NULL, is a pointer to an int which will receive the
+ type of the object pointed to. One of ISFUNC (function), ISKMAP (keymap),
+ or ISMACR (macro). */
+Function *
+rl_function_of_keyseq (keyseq, map, type)
+ char *keyseq;
+ Keymap map;
+ int *type;
+{
+ register int i;
+
+ if (!map)
+ map = _rl_keymap;
+
+ for (i = 0; keyseq && keyseq[i]; i++)
+ {
+ int ic = keyseq[i];
+
+ if (META_CHAR (ic) && _rl_convert_meta_chars_to_ascii)
+ {
+ if (map[ESC].type != ISKMAP)
+ {
+ if (type)
+ *type = map[ESC].type;
+
+ return (map[ESC].function);
+ }
+ else
+ {
+ map = FUNCTION_TO_KEYMAP (map, ESC);
+ ic = UNMETA (ic);
+ }
+ }
+
+ if (map[ic].type == ISKMAP)
+ {
+ /* If this is the last key in the key sequence, return the
+ map. */
+ if (!keyseq[i + 1])
+ {
+ if (type)
+ *type = ISKMAP;
+
+ return (map[ic].function);
+ }
+ else
+ map = FUNCTION_TO_KEYMAP (map, ic);
+ }
+ else
+ {
+ if (type)
+ *type = map[ic].type;
+
+ return (map[ic].function);
+ }
+ }
+ return ((Function *) NULL);
+}
+
+/* The last key bindings file read. */
+static char *last_readline_init_file = (char *)NULL;
+
+/* Re-read the current keybindings file. */
+rl_re_read_init_file (count, ignore)
+ int count, ignore;
+{
+ int r;
+ r = rl_read_init_file ((char *)NULL);
+ rl_set_keymap_from_edit_mode ();
+ return r;
+}
+
+/* Do key bindings from a file. If FILENAME is NULL it defaults
+ to the first non-null filename from this list:
+ 1. the filename used for the previous call
+ 2. the value of the shell variable `INPUTRC'
+ 3. ~/.inputrc
+ If the file existed and could be opened and read, 0 is returned,
+ otherwise errno is returned. */
+int
+rl_read_init_file (filename)
+ char *filename;
+{
+ register int i;
+ char *buffer, *openname, *line, *end;
+ struct stat finfo;
+ int file;
+
+ /* Default the filename. */
+ if (!filename)
+ {
+ filename = last_readline_init_file;
+ if (!filename)
+ filename = getenv ("INPUTRC");
+ if (!filename)
+ filename = DEFAULT_INPUTRC;
+ }
+
+ openname = tilde_expand (filename);
+
+ if ((stat (openname, &finfo) < 0) ||
+ (file = open (openname, O_RDONLY, 0666)) < 0)
+ {
+ free (openname);
+ return (errno);
+ }
+ else
+ free (openname);
+
+ if (filename != last_readline_init_file)
+ {
+ if (last_readline_init_file)
+ free (last_readline_init_file);
+
+ last_readline_init_file = savestring (filename);
+ }
+
+ /* Read the file into BUFFER. */
+ buffer = (char *)xmalloc ((int)finfo.st_size + 1);
+ i = read (file, buffer, finfo.st_size);
+ close (file);
+
+ if (i != finfo.st_size)
+ return (errno);
+
+ /* Loop over the lines in the file. Lines that start with `#' are
+ comments; all other lines are commands for readline initialization. */
+ line = buffer;
+ end = buffer + finfo.st_size;
+ while (line < end)
+ {
+ /* Find the end of this line. */
+ for (i = 0; line + i != end && line[i] != '\n'; i++);
+
+ /* Mark end of line. */
+ line[i] = '\0';
+
+ /* Skip leading whitespace. */
+ while (*line && whitespace (*line))
+ line++;
+
+ /* If the line is not a comment, then parse it. */
+ if (*line && *line != '#')
+ rl_parse_and_bind (line);
+
+ /* Move to the next line. */
+ line += i + 1;
+ }
+ free (buffer);
+ return (0);
+}
+
+/* **************************************************************** */
+/* */
+/* Parser Directives */
+/* */
+/* **************************************************************** */
+
+/* Conditionals. */
+
+/* Calling programs set this to have their argv[0]. */
+char *rl_readline_name = "other";
+
+/* Stack of previous values of parsing_conditionalized_out. */
+static unsigned char *if_stack = (unsigned char *)NULL;
+static int if_stack_depth = 0;
+static int if_stack_size = 0;
+
+/* Push _rl_parsing_conditionalized_out, and set parser state based
+ on ARGS. */
+static int
+parser_if (args)
+ char *args;
+{
+ register int i;
+
+ /* Push parser state. */
+ if (if_stack_depth + 1 >= if_stack_size)
+ {
+ if (!if_stack)
+ if_stack = (unsigned char *)xmalloc (if_stack_size = 20);
+ else
+ if_stack = (unsigned char *)xrealloc (if_stack, if_stack_size += 20);
+ }
+ if_stack[if_stack_depth++] = _rl_parsing_conditionalized_out;
+
+ /* If parsing is turned off, then nothing can turn it back on except
+ for finding the matching endif. In that case, return right now. */
+ if (_rl_parsing_conditionalized_out)
+ return 0;
+
+ /* Isolate first argument. */
+ for (i = 0; args[i] && !whitespace (args[i]); i++);
+
+ if (args[i])
+ args[i++] = '\0';
+
+ /* Handle "if term=foo" and "if mode=emacs" constructs. If this
+ isn't term=foo, or mode=emacs, then check to see if the first
+ word in ARGS is the same as the value stored in rl_readline_name. */
+ if (rl_terminal_name && strnicmp (args, "term=", 5) == 0)
+ {
+ char *tem, *tname;
+
+ /* Terminals like "aaa-60" are equivalent to "aaa". */
+ tname = savestring (rl_terminal_name);
+ tem = strchr (tname, '-');
+ if (tem)
+ *tem = '\0';
+
+ /* Test the `long' and `short' forms of the terminal name so that
+ if someone has a `sun-cmd' and does not want to have bindings
+ that will be executed if the terminal is a `sun', they can put
+ `$if term=sun-cmd' into their .inputrc. */
+ if ((stricmp (args + 5, tname) == 0) ||
+ (stricmp (args + 5, rl_terminal_name) == 0))
+ _rl_parsing_conditionalized_out = 0;
+ else
+ _rl_parsing_conditionalized_out = 1;
+
+ free (tname);
+ }
+#if defined (VI_MODE)
+ else if (strnicmp (args, "mode=", 5) == 0)
+ {
+ int mode;
+
+ if (stricmp (args + 5, "emacs") == 0)
+ mode = emacs_mode;
+ else if (stricmp (args + 5, "vi") == 0)
+ mode = vi_mode;
+ else
+ mode = no_mode;
+
+ if (mode == rl_editing_mode)
+ _rl_parsing_conditionalized_out = 0;
+ else
+ _rl_parsing_conditionalized_out = 1;
+ }
+#endif /* VI_MODE */
+ /* Check to see if the first word in ARGS is the same as the
+ value stored in rl_readline_name. */
+ else if (stricmp (args, rl_readline_name) == 0)
+ _rl_parsing_conditionalized_out = 0;
+ else
+ _rl_parsing_conditionalized_out = 1;
+ return 0;
+}
+
+/* Invert the current parser state if there is anything on the stack. */
+static int
+parser_else (args)
+ char *args;
+{
+ register int i;
+
+ if (!if_stack_depth)
+ {
+ /* Error message? */
+ return 0;
+ }
+
+ /* Check the previous (n - 1) levels of the stack to make sure that
+ we haven't previously turned off parsing. */
+ for (i = 0; i < if_stack_depth - 1; i++)
+ if (if_stack[i] == 1)
+ return 0;
+
+ /* Invert the state of parsing if at top level. */
+ _rl_parsing_conditionalized_out = !_rl_parsing_conditionalized_out;
+ return 0;
+}
+
+/* Terminate a conditional, popping the value of
+ _rl_parsing_conditionalized_out from the stack. */
+static int
+parser_endif (args)
+ char *args;
+{
+ if (if_stack_depth)
+ _rl_parsing_conditionalized_out = if_stack[--if_stack_depth];
+ else
+ {
+ /* *** What, no error message? *** */
+ }
+ return 0;
+}
+
+/* Associate textual names with actual functions. */
+static struct {
+ char *name;
+ Function *function;
+} parser_directives [] = {
+ { "if", parser_if },
+ { "endif", parser_endif },
+ { "else", parser_else },
+ { (char *)0x0, (Function *)0x0 }
+};
+
+/* Handle a parser directive. STATEMENT is the line of the directive
+ without any leading `$'. */
+static int
+handle_parser_directive (statement)
+ char *statement;
+{
+ register int i;
+ char *directive, *args;
+
+ /* Isolate the actual directive. */
+
+ /* Skip whitespace. */
+ for (i = 0; whitespace (statement[i]); i++);
+
+ directive = &statement[i];
+
+ for (; statement[i] && !whitespace (statement[i]); i++);
+
+ if (statement[i])
+ statement[i++] = '\0';
+
+ for (; statement[i] && whitespace (statement[i]); i++);
+
+ args = &statement[i];
+
+ /* Lookup the command, and act on it. */
+ for (i = 0; parser_directives[i].name; i++)
+ if (stricmp (directive, parser_directives[i].name) == 0)
+ {
+ (*parser_directives[i].function) (args);
+ return (0);
+ }
+
+ /* *** Should an error message be output? */
+ return (1);
+}
+
+static int substring_member_of_array ();
+
+/* Read the binding command from STRING and perform it.
+ A key binding command looks like: Keyname: function-name\0,
+ a variable binding command looks like: set variable value.
+ A new-style keybinding looks like "\C-x\C-x": exchange-point-and-mark. */
+rl_parse_and_bind (string)
+ char *string;
+{
+ char *funname, *kname;
+ register int c, i;
+ int key, equivalency;
+
+ while (string && whitespace (*string))
+ string++;
+
+ if (!string || !*string || *string == '#')
+ return 0;
+
+ /* If this is a parser directive, act on it. */
+ if (*string == '$')
+ {
+ handle_parser_directive (&string[1]);
+ return 0;
+ }
+
+ /* If we aren't supposed to be parsing right now, then we're done. */
+ if (_rl_parsing_conditionalized_out)
+ return 0;
+
+ i = 0;
+ /* If this keyname is a complex key expression surrounded by quotes,
+ advance to after the matching close quote. This code allows the
+ backslash to quote characters in the key expression. */
+ if (*string == '"')
+ {
+ int passc = 0;
+
+ for (i = 1; c = string[i]; i++)
+ {
+ if (passc)
+ {
+ passc = 0;
+ continue;
+ }
+
+ if (c == '\\')
+ {
+ passc++;
+ continue;
+ }
+
+ if (c == '"')
+ break;
+ }
+ }
+
+ /* Advance to the colon (:) or whitespace which separates the two objects. */
+ for (; (c = string[i]) && c != ':' && c != ' ' && c != '\t'; i++ );
+
+ equivalency = (c == ':' && string[i + 1] == '=');
+
+ /* Mark the end of the command (or keyname). */
+ if (string[i])
+ string[i++] = '\0';
+
+ /* If doing assignment, skip the '=' sign as well. */
+ if (equivalency)
+ string[i++] = '\0';
+
+ /* If this is a command to set a variable, then do that. */
+ if (stricmp (string, "set") == 0)
+ {
+ char *var = string + i;
+ char *value;
+
+ /* Make VAR point to start of variable name. */
+ while (*var && whitespace (*var)) var++;
+
+ /* Make value point to start of value string. */
+ value = var;
+ while (*value && !whitespace (*value)) value++;
+ if (*value)
+ *value++ = '\0';
+ while (*value && whitespace (*value)) value++;
+
+ rl_variable_bind (var, value);
+ return 0;
+ }
+
+ /* Skip any whitespace between keyname and funname. */
+ for (; string[i] && whitespace (string[i]); i++);
+ funname = &string[i];
+
+ /* Now isolate funname.
+ For straight function names just look for whitespace, since
+ that will signify the end of the string. But this could be a
+ macro definition. In that case, the string is quoted, so skip
+ to the matching delimiter. We allow the backslash to quote the
+ delimiter characters in the macro body. */
+ /* This code exists to allow whitespace in macro expansions, which
+ would otherwise be gobbled up by the next `for' loop.*/
+ /* XXX - it may be desirable to allow backslash quoting only if " is
+ the quoted string delimiter, like the shell. */
+ if (*funname == '\'' || *funname == '"')
+ {
+ int delimiter = string[i++];
+ int passc = 0;
+
+ for (; c = string[i]; i++)
+ {
+ if (passc)
+ {
+ passc = 0;
+ continue;
+ }
+
+ if (c == '\\')
+ {
+ passc = 1;
+ continue;
+ }
+
+ if (c == delimiter)
+ break;
+ }
+ if (c)
+ i++;
+ }
+
+ /* Advance to the end of the string. */
+ for (; string[i] && !whitespace (string[i]); i++);
+
+ /* No extra whitespace at the end of the string. */
+ string[i] = '\0';
+
+ /* Handle equivalency bindings here. Make the left-hand side be exactly
+ whatever the right-hand evaluates to, including keymaps. */
+ if (equivalency)
+ {
+ return 0;
+ }
+
+ /* If this is a new-style key-binding, then do the binding with
+ rl_set_key (). Otherwise, let the older code deal with it. */
+ if (*string == '"')
+ {
+ char *seq = xmalloc (1 + strlen (string));
+ register int j, k = 0;
+ int passc = 0;
+
+ for (j = 1; string[j]; j++)
+ {
+ /* Allow backslash to quote characters, but leave them in place.
+ This allows a string to end with a backslash quoting another
+ backslash, or with a backslash quoting a double quote. The
+ backslashes are left in place for rl_translate_keyseq (). */
+ if (passc || (string[j] == '\\'))
+ {
+ seq[k++] = string[j];
+ passc = !passc;
+ continue;
+ }
+
+ if (string[j] == '"')
+ break;
+
+ seq[k++] = string[j];
+ }
+ seq[k] = '\0';
+
+ /* Binding macro? */
+ if (*funname == '\'' || *funname == '"')
+ {
+ j = strlen (funname);
+
+ /* Remove the delimiting quotes from each end of FUNNAME. */
+ if (j && funname[j - 1] == *funname)
+ funname[j - 1] = '\0';
+
+ rl_macro_bind (seq, &funname[1], _rl_keymap);
+ }
+ else
+ rl_set_key (seq, rl_named_function (funname), _rl_keymap);
+
+ free (seq);
+ return 0;
+ }
+
+ /* Get the actual character we want to deal with. */
+ kname = strrchr (string, '-');
+ if (!kname)
+ kname = string;
+ else
+ kname++;
+
+ key = glean_key_from_name (kname);
+
+ /* Add in control and meta bits. */
+ if (substring_member_of_array (string, possible_control_prefixes))
+ key = CTRL (to_upper (key));
+
+ if (substring_member_of_array (string, possible_meta_prefixes))
+ key = META (key);
+
+ /* Temporary. Handle old-style keyname with macro-binding. */
+ if (*funname == '\'' || *funname == '"')
+ {
+ char seq[2];
+ int fl = strlen (funname);
+
+ seq[0] = key; seq[1] = '\0';
+ if (fl && funname[fl - 1] == *funname)
+ funname[fl - 1] = '\0';
+
+ rl_macro_bind (seq, &funname[1], _rl_keymap);
+ }
+#if defined (PREFIX_META_HACK)
+ /* Ugly, but working hack to keep prefix-meta around. */
+ else if (stricmp (funname, "prefix-meta") == 0)
+ {
+ char seq[2];
+
+ seq[0] = key;
+ seq[1] = '\0';
+ rl_generic_bind (ISKMAP, seq, (char *)emacs_meta_keymap, _rl_keymap);
+ }
+#endif /* PREFIX_META_HACK */
+ else
+ rl_bind_key (key, rl_named_function (funname));
+ return 0;
+}
+
+/* Simple structure for boolean readline variables (i.e., those that can
+ have one of two values; either "On" or 1 for truth, or "Off" or 0 for
+ false. */
+
+static struct {
+ char *name;
+ int *value;
+} boolean_varlist [] = {
+ { "horizontal-scroll-mode", &_rl_horizontal_scroll_mode },
+ { "mark-modified-lines", &_rl_mark_modified_lines },
+ { "meta-flag", &_rl_meta_flag },
+ { "blink-matching-paren", &rl_blink_matching_paren },
+ { "convert-meta", &_rl_convert_meta_chars_to_ascii },
+ { "show-all-if-ambiguous", &_rl_complete_show_all },
+ { "output-meta", &_rl_output_meta_chars },
+#if defined (VISIBLE_STATS)
+ { "visible-stats", &rl_visible_stats },
+#endif /* VISIBLE_STATS */
+ { "expand-tilde", &rl_complete_with_tilde_expansion },
+ { (char *)NULL, (int *)NULL }
+};
+
+rl_variable_bind (name, value)
+ char *name, *value;
+{
+ register int i;
+
+ /* Check for simple variables first. */
+ for (i = 0; boolean_varlist[i].name; i++)
+ {
+ if (stricmp (name, boolean_varlist[i].name) == 0)
+ {
+ /* A variable is TRUE if the "value" is "on", "1" or "". */
+ if ((!*value) ||
+ (stricmp (value, "On") == 0) ||
+ (value[0] == '1' && value[1] == '\0'))
+ *boolean_varlist[i].value = 1;
+ else
+ *boolean_varlist[i].value = 0;
+ return 0;
+ }
+ }
+
+ /* Not a boolean variable, so check for specials. */
+
+ /* Editing mode change? */
+ if (stricmp (name, "editing-mode") == 0)
+ {
+ if (strnicmp (value, "vi", 2) == 0)
+ {
+#if defined (VI_MODE)
+ _rl_keymap = vi_insertion_keymap;
+ rl_editing_mode = vi_mode;
+#endif /* VI_MODE */
+ }
+ else if (strnicmp (value, "emacs", 5) == 0)
+ {
+ _rl_keymap = emacs_standard_keymap;
+ rl_editing_mode = emacs_mode;
+ }
+ }
+
+ /* Comment string change? */
+ else if (stricmp (name, "comment-begin") == 0)
+ {
+#if defined (VI_MODE)
+ if (*value)
+ {
+ if (rl_vi_comment_begin)
+ free (rl_vi_comment_begin);
+
+ rl_vi_comment_begin = savestring (value);
+ }
+#endif /* VI_MODE */
+ }
+ else if (stricmp (name, "completion-query-items") == 0)
+ {
+ int nval = 100;
+ if (*value)
+ {
+ nval = atoi (value);
+ if (nval < 0)
+ nval = 0;
+ }
+ rl_completion_query_items = nval;
+ }
+ else if (stricmp (name, "keymap") == 0)
+ {
+ Keymap kmap;
+ kmap = rl_get_keymap_by_name (value);
+ if (kmap)
+ rl_set_keymap (kmap);
+ }
+ else if (stricmp (name, "bell-style") == 0)
+ {
+ if (!*value)
+ _rl_bell_preference = AUDIBLE_BELL;
+ else
+ {
+ if (stricmp (value, "none") == 0 || stricmp (value, "off") == 0)
+ _rl_bell_preference = NO_BELL;
+ else if (stricmp (value, "audible") == 0 || stricmp (value, "on") == 0)
+ _rl_bell_preference = AUDIBLE_BELL;
+ else if (stricmp (value, "visible") == 0)
+ _rl_bell_preference = VISIBLE_BELL;
+ }
+ }
+ else if (stricmp (name, "prefer-visible-bell") == 0)
+ {
+ /* Backwards compatibility. */
+ if (*value && (stricmp (value, "on") == 0 ||
+ (*value == '1' && !value[1])))
+ _rl_bell_preference = VISIBLE_BELL;
+ else
+ _rl_bell_preference = AUDIBLE_BELL;
+ }
+
+ return 0;
+}
+
+/* Return the character which matches NAME.
+ For example, `Space' returns ' '. */
+
+typedef struct {
+ char *name;
+ int value;
+} assoc_list;
+
+static assoc_list name_key_alist[] = {
+ { "DEL", 0x7f },
+ { "ESC", '\033' },
+ { "Escape", '\033' },
+ { "LFD", '\n' },
+ { "Newline", '\n' },
+ { "RET", '\r' },
+ { "Return", '\r' },
+ { "Rubout", 0x7f },
+ { "SPC", ' ' },
+ { "Space", ' ' },
+ { "Tab", 0x09 },
+ { (char *)0x0, 0 }
+};
+
+static int
+glean_key_from_name (name)
+ char *name;
+{
+ register int i;
+
+ for (i = 0; name_key_alist[i].name; i++)
+ if (stricmp (name, name_key_alist[i].name) == 0)
+ return (name_key_alist[i].value);
+
+ return (*(unsigned char *)name); /* XXX was return (*name) */
+}
+
+/* Auxiliary functions to manage keymaps. */
+static struct {
+ char *name;
+ Keymap map;
+} keymap_names[] = {
+ { "emacs", emacs_standard_keymap },
+ { "emacs-standard", emacs_standard_keymap },
+ { "emacs-meta", emacs_meta_keymap },
+ { "emacs-ctlx", emacs_ctlx_keymap },
+#if defined (VI_MODE)
+ { "vi", vi_movement_keymap },
+ { "vi-move", vi_movement_keymap },
+ { "vi-command", vi_movement_keymap },
+ { "vi-insert", vi_insertion_keymap },
+#endif /* VI_MODE */
+ { (char *)0x0, (Keymap)0x0 }
+};
+
+Keymap
+rl_get_keymap_by_name (name)
+ char *name;
+{
+ register int i;
+
+ for (i = 0; keymap_names[i].name; i++)
+ if (strcmp (name, keymap_names[i].name) == 0)
+ return (keymap_names[i].map);
+ return ((Keymap) NULL);
+}
+
+void
+rl_set_keymap (map)
+ Keymap map;
+{
+ if (map)
+ _rl_keymap = map;
+}
+
+Keymap
+rl_get_keymap ()
+{
+ return (_rl_keymap);
+}
+
+void
+rl_set_keymap_from_edit_mode ()
+{
+ if (rl_editing_mode == emacs_mode)
+ _rl_keymap = emacs_standard_keymap;
+#if defined (VI_MODE)
+ else if (rl_editing_mode == vi_mode)
+ _rl_keymap = vi_insertion_keymap;
+#endif /* VI_MODE */
+}
+
+/* **************************************************************** */
+/* */
+/* Key Binding and Function Information */
+/* */
+/* **************************************************************** */
+
+/* Each of the following functions produces information about the
+ state of keybindings and functions known to Readline. The info
+ is always printed to rl_outstream, and in such a way that it can
+ be read back in (i.e., passed to rl_parse_and_bind (). */
+
+/* Print the names of functions known to Readline. */
+void
+rl_list_funmap_names (ignore)
+ int ignore;
+{
+ register int i;
+ char **funmap_names;
+
+ funmap_names = rl_funmap_names ();
+
+ if (!funmap_names)
+ return;
+
+ for (i = 0; funmap_names[i]; i++)
+ fprintf (rl_outstream, "%s\n", funmap_names[i]);
+
+ free (funmap_names);
+}
+
+/* Return a NULL terminated array of strings which represent the key
+ sequences that are used to invoke FUNCTION in MAP. */
+char **
+rl_invoking_keyseqs_in_map (function, map)
+ Function *function;
+ Keymap map;
+{
+ register int key;
+ char **result;
+ int result_index, result_size;
+
+ result = (char **)NULL;
+ result_index = result_size = 0;
+
+ for (key = 0; key < 128; key++)
+ {
+ switch (map[key].type)
+ {
+ case ISMACR:
+ /* Macros match, if, and only if, the pointers are identical.
+ Thus, they are treated exactly like functions in here. */
+ case ISFUNC:
+ /* If the function in the keymap is the one we are looking for,
+ then add the current KEY to the list of invoking keys. */
+ if (map[key].function == function)
+ {
+ char *keyname = (char *)xmalloc (5);
+
+ if (CTRL_P (key))
+ sprintf (keyname, "\\C-%c", to_lower (UNCTRL (key)));
+ else if (key == RUBOUT)
+ sprintf (keyname, "\\C-?");
+ else if (key == '\\' || key == '"')
+ {
+ keyname[0] = '\\';
+ keyname[1] = (char) key;
+ keyname[2] = '\0';
+ }
+ else
+ {
+ keyname[0] = (char) key;
+ keyname[1] = '\0';
+ }
+
+ if (result_index + 2 > result_size)
+ result = (char **) xrealloc
+ (result, (result_size += 10) * sizeof (char *));
+
+ result[result_index++] = keyname;
+ result[result_index] = (char *)NULL;
+ }
+ break;
+
+ case ISKMAP:
+ {
+ char **seqs = (char **)NULL;
+
+ /* Find the list of keyseqs in this map which have FUNCTION as
+ their target. Add the key sequences found to RESULT. */
+ if (map[key].function)
+ seqs =
+ rl_invoking_keyseqs_in_map (function, FUNCTION_TO_KEYMAP (map, key));
+
+ if (seqs)
+ {
+ register int i;
+
+ for (i = 0; seqs[i]; i++)
+ {
+ char *keyname = (char *)xmalloc (6 + strlen (seqs[i]));
+
+ if (key == ESC)
+ sprintf (keyname, "\\e");
+ else if (CTRL_P (key))
+ sprintf (keyname, "\\C-%c", to_lower (UNCTRL (key)));
+ else if (key == RUBOUT)
+ sprintf (keyname, "\\C-?");
+ else if (key == '\\' || key == '"')
+ {
+ keyname[0] = '\\';
+ keyname[1] = (char) key;
+ keyname[2] = '\0';
+ }
+ else
+ {
+ keyname[0] = (char) key;
+ keyname[1] = '\0';
+ }
+
+ strcat (keyname, seqs[i]);
+ free (seqs[i]);
+
+ if (result_index + 2 > result_size)
+ result = (char **) xrealloc
+ (result, (result_size += 10) * sizeof (char *));
+
+ result[result_index++] = keyname;
+ result[result_index] = (char *)NULL;
+ }
+
+ free (seqs);
+ }
+ }
+ break;
+ }
+ }
+ return (result);
+}
+
+/* Return a NULL terminated array of strings which represent the key
+ sequences that can be used to invoke FUNCTION using the current keymap. */
+char **
+rl_invoking_keyseqs (function)
+ Function *function;
+{
+ return (rl_invoking_keyseqs_in_map (function, _rl_keymap));
+}
+
+/* Print all of the current functions and their bindings to
+ rl_outstream. If an explicit argument is given, then print
+ the output in such a way that it can be read back in. */
+int
+rl_dump_functions (count, key)
+ int count, key;
+{
+ rl_function_dumper (rl_explicit_arg);
+ rl_on_new_line ();
+ return (0);
+}
+
+/* Print all of the functions and their bindings to rl_outstream. If
+ PRINT_READABLY is non-zero, then print the output in such a way
+ that it can be read back in. */
+void
+rl_function_dumper (print_readably)
+ int print_readably;
+{
+ register int i;
+ char **names;
+ char *name;
+
+ names = rl_funmap_names ();
+
+ fprintf (rl_outstream, "\n");
+
+ for (i = 0; name = names[i]; i++)
+ {
+ Function *function;
+ char **invokers;
+
+ function = rl_named_function (name);
+ invokers = rl_invoking_keyseqs_in_map (function, _rl_keymap);
+
+ if (print_readably)
+ {
+ if (!invokers)
+ fprintf (rl_outstream, "# %s (not bound)\n", name);
+ else
+ {
+ register int j;
+
+ for (j = 0; invokers[j]; j++)
+ {
+ fprintf (rl_outstream, "\"%s\": %s\n",
+ invokers[j], name);
+ free (invokers[j]);
+ }
+
+ free (invokers);
+ }
+ }
+ else
+ {
+ if (!invokers)
+ fprintf (rl_outstream, "%s is not bound to any keys\n",
+ name);
+ else
+ {
+ register int j;
+
+ fprintf (rl_outstream, "%s can be found on ", name);
+
+ for (j = 0; invokers[j] && j < 5; j++)
+ {
+ fprintf (rl_outstream, "\"%s\"%s", invokers[j],
+ invokers[j + 1] ? ", " : ".\n");
+ }
+
+ if (j == 5 && invokers[j])
+ fprintf (rl_outstream, "...\n");
+
+ for (j = 0; invokers[j]; j++)
+ free (invokers[j]);
+
+ free (invokers);
+ }
+ }
+ }
+}
+
+/* Bind key sequence KEYSEQ to DEFAULT_FUNC if KEYSEQ is unbound. */
+void
+_rl_bind_if_unbound (keyseq, default_func)
+ char *keyseq;
+ Function *default_func;
+{
+ Function *func;
+
+ if (keyseq)
+ {
+ func = rl_function_of_keyseq (keyseq, _rl_keymap, (int *)NULL);
+ if (!func || func == rl_do_lowercase_version)
+ rl_set_key (keyseq, default_func, _rl_keymap);
+ }
+}
+
+/* **************************************************************** */
+/* */
+/* String Utility Functions */
+/* */
+/* **************************************************************** */
+
+static char *strindex ();
+
+/* Return non-zero if any members of ARRAY are a substring in STRING. */
+static int
+substring_member_of_array (string, array)
+ char *string, **array;
+{
+ while (*array)
+ {
+ if (strindex (string, *array))
+ return (1);
+ array++;
+ }
+ return (0);
+}
+
+#if !defined (BSD386) && !defined (NetBSD) && \
+ !defined (FreeBSD) && !defined (_386BSD)
+/* Whoops, Unix doesn't have strnicmp. */
+
+/* Compare at most COUNT characters from string1 to string2. Case
+ doesn't matter. */
+static int
+strnicmp (string1, string2, count)
+ char *string1, *string2;
+ int count;
+{
+ register char ch1, ch2;
+
+ while (count)
+ {
+ ch1 = *string1++;
+ ch2 = *string2++;
+ if (to_upper(ch1) == to_upper(ch2))
+ count--;
+ else break;
+ }
+ return (count);
+}
+
+/* strcmp (), but caseless. */
+static int
+stricmp (string1, string2)
+ char *string1, *string2;
+{
+ register char ch1, ch2;
+
+ while (*string1 && *string2)
+ {
+ ch1 = *string1++;
+ ch2 = *string2++;
+ if (to_upper(ch1) != to_upper(ch2))
+ return (1);
+ }
+ return (*string1 | *string2);
+}
+#endif
+
+/* Determine if s2 occurs in s1. If so, return a pointer to the
+ match in s1. The compare is case insensitive. */
+static char *
+strindex (s1, s2)
+ register char *s1, *s2;
+{
+ register int i, l = strlen (s2);
+ register int len = strlen (s1);
+
+ for (i = 0; (len - i) >= l; i++)
+ if (strnicmp (&s1[i], s2, l) == 0)
+ return (s1 + i);
+ return ((char *)NULL);
+}
diff --git a/gnu/lib/libreadline/complete.c b/gnu/lib/libreadline/complete.c
new file mode 100644
index 000000000000..037222db64b1
--- /dev/null
+++ b/gnu/lib/libreadline/complete.c
@@ -0,0 +1,1381 @@
+/* complete.c -- filename completion for readline. */
+
+/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library, a library for
+ reading lines of text with interactive input and history editing.
+
+ The GNU Readline 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 1, or
+ (at your option) any later version.
+
+ The GNU Readline 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.
+
+ The GNU General Public License is often shipped with GNU software, and
+ is generally kept in a file called COPYING or LICENSE. If you do not
+ have a copy of the license, write to the Free Software Foundation,
+ 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#if !defined (NO_SYS_FILE)
+# include <sys/file.h>
+#endif /* !NO_SYS_FILE */
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include <errno.h>
+/* Not all systems declare ERRNO in errno.h... and some systems #define it! */
+#if !defined (errno)
+extern int errno;
+#endif /* !errno */
+
+#include <pwd.h>
+#if defined (USG) && !defined (HAVE_GETPW_DECLS)
+extern struct passwd *getpwent ();
+#endif /* USG && !HAVE_GETPW_DECLS */
+
+/* ISC systems don't define getpwent() if _POSIX_SOURCE is defined. */
+#if defined (isc386) && defined (_POSIX_SOURCE)
+# if defined (__STDC__)
+extern struct passwd *getpwent (void);
+# else
+extern struct passwd *getpwent ();
+# endif /* !__STDC__ */
+#endif /* isc386 && _POSIX_SOURCE */
+
+#include "posixstat.h"
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+
+/* Some standard library routines. */
+#include <readline/readline.h>
+
+/* Possible values for do_replace in rl_complete_internal. */
+#define NO_MATCH 0
+#define SINGLE_MATCH 1
+#define MULT_MATCH 2
+
+#if !defined (strchr) && !defined (__STDC__)
+extern char *strchr (), *strrchr ();
+#endif /* !strchr && !__STDC__ */
+
+extern char *tilde_expand ();
+extern char *rl_copy_text ();
+
+extern Function *rl_last_func;
+extern int rl_editing_mode;
+extern int screenwidth;
+
+/* Forward declarations for functions defined and used in this file. */
+char *filename_completion_function ();
+char **completion_matches ();
+
+static int compare_strings ();
+static char *rl_strpbrk ();
+
+#if defined (STATIC_MALLOC)
+static char *xmalloc (), *xrealloc ();
+#else
+extern char *xmalloc (), *xrealloc ();
+#endif /* STATIC_MALLOC */
+
+/* If non-zero, then this is the address of a function to call when
+ completing on a directory name. The function is called with
+ the address of a string (the current directory name) as an arg. */
+Function *rl_directory_completion_hook = (Function *)NULL;
+
+/* Non-zero means readline completion functions perform tilde expansion. */
+int rl_complete_with_tilde_expansion = 0;
+
+/* If non-zero, non-unique completions always show the list of matches. */
+int _rl_complete_show_all = 0;
+
+#if defined (VISIBLE_STATS)
+# if !defined (X_OK)
+# define X_OK 1
+# endif
+
+static int stat_char ();
+
+/* Non-zero means add an additional character to each filename displayed
+ during listing completion iff rl_filename_completion_desired which helps
+ to indicate the type of file being listed. */
+int rl_visible_stats = 0;
+#endif /* VISIBLE_STATS */
+
+/* **************************************************************** */
+/* */
+/* Completion matching, from readline's point of view. */
+/* */
+/* **************************************************************** */
+
+/* Pointer to the generator function for completion_matches ().
+ NULL means to use filename_entry_function (), the default filename
+ completer. */
+Function *rl_completion_entry_function = (Function *)NULL;
+
+/* Pointer to alternative function to create matches.
+ Function is called with TEXT, START, and END.
+ START and END are indices in RL_LINE_BUFFER saying what the boundaries
+ of TEXT are.
+ If this function exists and returns NULL then call the value of
+ rl_completion_entry_function to try to match, otherwise use the
+ array of strings returned. */
+CPPFunction *rl_attempted_completion_function = (CPPFunction *)NULL;
+
+/* Non-zero means to suppress normal filename completion after the
+ user-specified completion function has been called. */
+int rl_attempted_completion_over = 0;
+
+/* Local variable states what happened during the last completion attempt. */
+static int completion_changed_buffer = 0;
+
+/* Complete the word at or before point. You have supplied the function
+ that does the initial simple matching selection algorithm (see
+ completion_matches ()). The default is to do filename completion. */
+
+rl_complete (ignore, invoking_key)
+ int ignore, invoking_key;
+{
+ if (rl_last_func == rl_complete && !completion_changed_buffer)
+ return (rl_complete_internal ('?'));
+ else if (_rl_complete_show_all)
+ return (rl_complete_internal ('!'));
+ else
+ return (rl_complete_internal (TAB));
+}
+
+/* List the possible completions. See description of rl_complete (). */
+rl_possible_completions (ignore, invoking_key)
+ int ignore, invoking_key;
+{
+ return (rl_complete_internal ('?'));
+}
+
+rl_insert_completions (ignore, invoking_key)
+ int ignore, invoking_key;
+{
+ return (rl_complete_internal ('*'));
+}
+
+/* The user must press "y" or "n". Non-zero return means "y" pressed. */
+get_y_or_n ()
+{
+ int c;
+
+ for (;;)
+ {
+ c = rl_read_key ();
+ if (c == 'y' || c == 'Y' || c == ' ')
+ return (1);
+ if (c == 'n' || c == 'N' || c == RUBOUT)
+ return (0);
+ if (c == ABORT_CHAR)
+ rl_abort ();
+ ding ();
+ }
+}
+
+/* Up to this many items will be displayed in response to a
+ possible-completions call. After that, we ask the user if
+ she is sure she wants to see them all. */
+int rl_completion_query_items = 100;
+
+/* The basic list of characters that signal a break between words for the
+ completer routine. The contents of this variable is what breaks words
+ in the shell, i.e. " \t\n\"\\'`@$><=" */
+char *rl_basic_word_break_characters = " \t\n\"\\'`@$><=;|&{(";
+
+/* The list of characters that signal a break between words for
+ rl_complete_internal. The default list is the contents of
+ rl_basic_word_break_characters. */
+char *rl_completer_word_break_characters = (char *)NULL;
+
+/* List of characters which can be used to quote a substring of the line.
+ Completion occurs on the entire substring, and within the substring
+ rl_completer_word_break_characters are treated as any other character,
+ unless they also appear within this list. */
+char *rl_completer_quote_characters = (char *)NULL;
+
+/* List of characters that are word break characters, but should be left
+ in TEXT when it is passed to the completion function. The shell uses
+ this to help determine what kind of completing to do. */
+char *rl_special_prefixes = (char *)NULL;
+
+/* If non-zero, then disallow duplicates in the matches. */
+int rl_ignore_completion_duplicates = 1;
+
+/* Non-zero means that the results of the matches are to be treated
+ as filenames. This is ALWAYS zero on entry, and can only be changed
+ within a completion entry finder function. */
+int rl_filename_completion_desired = 0;
+
+/* This function, if defined, is called by the completer when real
+ filename completion is done, after all the matching names have been
+ generated. It is passed a (char**) known as matches in the code below.
+ It consists of a NULL-terminated array of pointers to potential
+ matching strings. The 1st element (matches[0]) is the maximal
+ substring that is common to all matches. This function can re-arrange
+ the list of matches as required, but all elements of the array must be
+ free()'d if they are deleted. The main intent of this function is
+ to implement FIGNORE a la SunOS csh. */
+Function *rl_ignore_some_completions_function = (Function *)NULL;
+
+#if defined (SHELL)
+/* A function to strip quotes that are not protected by backquotes. It
+ allows single quotes to appear within double quotes, and vice versa.
+ It should be smarter. It's fairly shell-specific, hence the SHELL
+ definition wrapper. */
+static char *
+_delete_quotes (text)
+ char *text;
+{
+ char *ret, *p, *r;
+ int l, quoted;
+
+ l = strlen (text);
+ ret = xmalloc (l + 1);
+ for (quoted = 0, p = text, r = ret; p && *p; p++)
+ {
+ /* Allow backslash-quoted characters to pass through unscathed. */
+ if (*p == '\\')
+ continue;
+ /* Close quote. */
+ if (quoted && *p == quoted)
+ {
+ quoted = 0;
+ continue;
+ }
+ /* Open quote. */
+ if (quoted == 0 && (*p == '\'' || *p == '"'))
+ {
+ quoted = *p;
+ continue;
+ }
+ *r++ = *p;
+ }
+ *r = '\0';
+ return ret;
+}
+#endif /* SHELL */
+
+/* Return the portion of PATHNAME that should be output when listing
+ possible completions. If we are hacking filename completion, we
+ are only interested in the basename, the portion following the
+ final slash. Otherwise, we return what we were passed. */
+static char *
+printable_part (pathname)
+ char *pathname;
+{
+ char *temp = (char *)NULL;
+
+ if (rl_filename_completion_desired)
+ temp = strrchr (pathname, '/');
+
+ if (!temp)
+ return (pathname);
+ else
+ return (++temp);
+}
+
+/* Output TO_PRINT to rl_outstream. If VISIBLE_STATS is defined and we
+ are using it, check for and output a single character for `special'
+ filenames. Return 1 if we printed an extension character, 0 if not. */
+static int
+print_filename (to_print, full_pathname)
+ char *to_print, *full_pathname;
+{
+#if !defined (VISIBLE_STATS)
+ fputs (to_print, rl_outstream);
+ return 0;
+#else
+ char *s, c, *new_full_pathname;
+ int extension_char = 0, slen, tlen;
+
+ fputs (to_print, rl_outstream);
+ if (rl_filename_completion_desired && rl_visible_stats)
+ {
+ /* If to_print != full_pathname, to_print is the basename of the
+ path passed. In this case, we try to expand the directory
+ name before checking for the stat character. */
+ if (to_print != full_pathname)
+ {
+ /* Terminate the directory name. */
+ c = to_print[-1];
+ to_print[-1] = '\0';
+
+ s = tilde_expand (full_pathname);
+ if (rl_directory_completion_hook)
+ (*rl_directory_completion_hook) (&s);
+
+ slen = strlen (s);
+ tlen = strlen (to_print);
+ new_full_pathname = xmalloc (slen + tlen + 2);
+ strcpy (new_full_pathname, s);
+ new_full_pathname[slen] = '/';
+ strcpy (new_full_pathname + slen + 1, to_print);
+
+ extension_char = stat_char (new_full_pathname);
+
+ free (new_full_pathname);
+ to_print[-1] = c;
+ }
+ else
+ {
+ s = tilde_expand (full_pathname);
+ extension_char = stat_char (s);
+ }
+
+ free (s);
+ if (extension_char)
+ putc (extension_char, rl_outstream);
+ return (extension_char != 0);
+ }
+ else
+ return 0;
+#endif /* VISIBLE_STATS */
+}
+
+/* Complete the word at or before point.
+ WHAT_TO_DO says what to do with the completion.
+ `?' means list the possible completions.
+ TAB means do standard completion.
+ `*' means insert all of the possible completions.
+ `!' means to do standard completion, and list all possible completions if
+ there is more than one. */
+rl_complete_internal (what_to_do)
+ int what_to_do;
+{
+ char **matches;
+ Function *our_func;
+ int start, scan, end, delimiter = 0, pass_next;
+ char *text, *saved_line_buffer;
+ char *replacement;
+ char quote_char = '\0';
+#if defined (SHELL)
+ int found_quote = 0;
+#endif
+
+ if (rl_line_buffer)
+ saved_line_buffer = savestring (rl_line_buffer);
+ else
+ saved_line_buffer = (char *)NULL;
+
+ if (rl_completion_entry_function)
+ our_func = rl_completion_entry_function;
+ else
+ our_func = (Function *)filename_completion_function;
+
+ /* Only the completion entry function can change this. */
+ rl_filename_completion_desired = 0;
+
+ /* We now look backwards for the start of a filename/variable word. */
+ end = rl_point;
+
+ if (rl_point)
+ {
+ if (rl_completer_quote_characters)
+ {
+ /* We have a list of characters which can be used in pairs to
+ quote substrings for the completer. Try to find the start
+ of an unclosed quoted substring. */
+ /* FOUND_QUOTE is set so we know what kind of quotes we found. */
+ for (scan = pass_next = 0; scan < end; scan++)
+ {
+ if (pass_next)
+ {
+ pass_next = 0;
+ continue;
+ }
+
+ if (rl_line_buffer[scan] == '\\')
+ {
+ pass_next = 1;
+ continue;
+ }
+
+ if (quote_char != '\0')
+ {
+ /* Ignore everything until the matching close quote char. */
+ if (rl_line_buffer[scan] == quote_char)
+ {
+ /* Found matching close. Abandon this substring. */
+ quote_char = '\0';
+ rl_point = end;
+ }
+ }
+ else if (strchr (rl_completer_quote_characters, rl_line_buffer[scan]))
+ {
+ /* Found start of a quoted substring. */
+ quote_char = rl_line_buffer[scan];
+ rl_point = scan + 1;
+#if defined (SHELL)
+ if (quote_char == '\'')
+ found_quote |= 1;
+ else if (quote_char == '"')
+ found_quote |= 2;
+#endif
+ }
+ }
+ }
+
+ if (rl_point == end)
+ {
+ int quoted = 0;
+ /* We didn't find an unclosed quoted substring up which to do
+ completion, so use the word break characters to find the
+ substring on which to complete. */
+ while (--rl_point)
+ {
+ scan = rl_line_buffer[rl_point];
+#if defined (SHELL)
+ /* Don't let word break characters in quoted substrings break
+ words for the completer. */
+ if (found_quote)
+ {
+ if (strchr (rl_completer_quote_characters, scan))
+ {
+ quoted = !quoted;
+ continue;
+ }
+ if (quoted)
+ continue;
+ }
+#endif /* SHELL */
+ if (strchr (rl_completer_word_break_characters, scan))
+ break;
+ }
+ }
+
+ /* If we are at a word break, then advance past it. */
+ scan = rl_line_buffer[rl_point];
+ if (strchr (rl_completer_word_break_characters, scan))
+ {
+ /* If the character that caused the word break was a quoting
+ character, then remember it as the delimiter. */
+ if (strchr ("\"'", scan) && (end - rl_point) > 1)
+ delimiter = scan;
+
+ /* If the character isn't needed to determine something special
+ about what kind of completion to perform, then advance past it. */
+ if (!rl_special_prefixes || strchr (rl_special_prefixes, scan) == 0)
+ rl_point++;
+ }
+ }
+
+ /* At this point, we know we have an open quote if quote_char != '\0'. */
+ start = rl_point;
+ rl_point = end;
+ text = rl_copy_text (start, end);
+
+ /* If the user wants to TRY to complete, but then wants to give
+ up and use the default completion function, they set the
+ variable rl_attempted_completion_function. */
+ if (rl_attempted_completion_function)
+ {
+ matches = (*rl_attempted_completion_function) (text, start, end);
+
+ if (matches || rl_attempted_completion_over)
+ {
+ rl_attempted_completion_over = 0;
+ our_func = (Function *)NULL;
+ goto after_usual_completion;
+ }
+ }
+
+#if defined (SHELL)
+ /* Beware -- we're stripping the quotes here. Do this only if we know
+ we are doing filename completion. */
+ if (found_quote && our_func == (Function *)filename_completion_function)
+ {
+ /* delete single and double quotes */
+ replacement = _delete_quotes (text);
+ free (text);
+ text = replacement;
+ replacement = (char *)0;
+ }
+#endif /* SHELL */
+
+ matches = completion_matches (text, our_func);
+
+ after_usual_completion:
+ free (text);
+
+ if (!matches)
+ ding ();
+ else
+ {
+ register int i;
+
+ /* It seems to me that in all the cases we handle we would like
+ to ignore duplicate possiblilities. Scan for the text to
+ insert being identical to the other completions. */
+ if (rl_ignore_completion_duplicates)
+ {
+ char *lowest_common;
+ int j, newlen = 0;
+ char dead_slot;
+ char **temp_array;
+
+ /* Sort the items. */
+ /* It is safe to sort this array, because the lowest common
+ denominator found in matches[0] will remain in place. */
+ for (i = 0; matches[i]; i++);
+ qsort (matches, i, sizeof (char *), compare_strings);
+
+ /* Remember the lowest common denominator for it may be unique. */
+ lowest_common = savestring (matches[0]);
+
+ for (i = 0; matches[i + 1]; i++)
+ {
+ if (strcmp (matches[i], matches[i + 1]) == 0)
+ {
+ free (matches[i]);
+ matches[i] = (char *)&dead_slot;
+ }
+ else
+ newlen++;
+ }
+
+ /* We have marked all the dead slots with (char *)&dead_slot.
+ Copy all the non-dead entries into a new array. */
+ temp_array = (char **)xmalloc ((3 + newlen) * sizeof (char *));
+ for (i = j = 1; matches[i]; i++)
+ {
+ if (matches[i] != (char *)&dead_slot)
+ temp_array[j++] = matches[i];
+ }
+ temp_array[j] = (char *)NULL;
+
+ if (matches[0] != (char *)&dead_slot)
+ free (matches[0]);
+ free (matches);
+
+ matches = temp_array;
+
+ /* Place the lowest common denominator back in [0]. */
+ matches[0] = lowest_common;
+
+ /* If there is one string left, and it is identical to the
+ lowest common denominator, then the LCD is the string to
+ insert. */
+ if (j == 2 && strcmp (matches[0], matches[1]) == 0)
+ {
+ free (matches[1]);
+ matches[1] = (char *)NULL;
+ }
+ }
+
+ switch (what_to_do)
+ {
+ case TAB:
+ case '!':
+ /* If we are matching filenames, then here is our chance to
+ do clever processing by re-examining the list. Call the
+ ignore function with the array as a parameter. It can
+ munge the array, deleting matches as it desires. */
+ if (rl_ignore_some_completions_function &&
+ our_func == (Function *)filename_completion_function)
+ (void)(*rl_ignore_some_completions_function)(matches);
+
+ /* If we are doing completion on quoted substrings, and any matches
+ contain any of the completer_word_break_characters, then auto-
+ matically prepend the substring with a quote character (just pick
+ the first one from the list of such) if it does not already begin
+ with a quote string. FIXME: Need to remove any such automatically
+ inserted quote character when it no longer is necessary, such as
+ if we change the string we are completing on and the new set of
+ matches don't require a quoted substring. */
+ replacement = matches[0];
+
+ if (matches[0] && rl_completer_quote_characters && !quote_char &&
+ rl_filename_completion_desired)
+ {
+ int do_replace;
+
+ do_replace = NO_MATCH;
+
+ /* If there is a single match, see if we need to quote it.
+ This also checks whether the common prefix of several
+ matches needs to be quoted. If the common prefix should
+ not be checked, add !matches[1] to the if clause. */
+ if (rl_strpbrk (matches[0], rl_completer_word_break_characters)
+#if defined (SHELL)
+ || rl_strpbrk (matches[0], "$`")
+#endif
+ )
+ do_replace = matches[1] ? MULT_MATCH : SINGLE_MATCH;
+
+ if (do_replace != NO_MATCH)
+ {
+#if defined (SHELL)
+ /* XXX - experimental */
+ /* Quote the replacement, since we found an
+ embedded word break character in a potential
+ match. */
+ char *rtext, *mtext;
+ int rlen;
+ extern char *double_quote (); /* in builtins/common.c */
+
+ /* If DO_REPLACE == MULT_MATCH, it means that there is
+ more than one match. In this case, we do not add
+ the closing quote or attempt to perform tilde
+ expansion. If DO_REPLACE == SINGLE_MATCH, we try
+ to perform tilde expansion, because double quotes
+ inhibit tilde expansion by the shell. */
+
+ mtext = matches[0];
+ if (mtext[0] == '~' && do_replace == SINGLE_MATCH)
+ mtext = tilde_expand (matches[0]);
+ rtext = double_quote (mtext);
+ if (mtext != matches[0])
+ free (mtext);
+
+ rlen = strlen (rtext);
+ replacement = xmalloc (rlen + 1);
+ strcpy (replacement, rtext);
+ if (do_replace == MULT_MATCH)
+ replacement[rlen - 1] = '\0';
+ free (rtext);
+#else /* !SHELL */
+ /* Found an embedded word break character in a potential
+ match, so we need to prepend a quote character if we
+ are replacing the completion string. */
+ replacement = xmalloc (strlen (matches[0]) + 2);
+ quote_char = *rl_completer_quote_characters;
+ *replacement = quote_char;
+ strcpy (replacement + 1, matches[0]);
+#endif /* SHELL */
+ }
+ }
+
+ if (replacement)
+ {
+ rl_begin_undo_group ();
+ rl_delete_text (start, rl_point);
+ rl_point = start;
+ rl_insert_text (replacement);
+ rl_end_undo_group ();
+ if (replacement != matches[0])
+ free (replacement);
+ }
+
+ /* If there are more matches, ring the bell to indicate.
+ If this was the only match, and we are hacking files,
+ check the file to see if it was a directory. If so,
+ add a '/' to the name. If not, and we are at the end
+ of the line, then add a space. */
+ if (matches[1])
+ {
+ if (what_to_do == '!')
+ goto display_matches; /* XXX */
+ else if (rl_editing_mode != vi_mode)
+ ding (); /* There are other matches remaining. */
+ }
+ else
+ {
+ char temp_string[4];
+ int temp_string_index = 0;
+
+ if (quote_char)
+ temp_string[temp_string_index++] = quote_char;
+
+ temp_string[temp_string_index++] = delimiter ? delimiter : ' ';
+ temp_string[temp_string_index++] = '\0';
+
+ if (rl_filename_completion_desired)
+ {
+ struct stat finfo;
+ char *filename = tilde_expand (matches[0]);
+
+ if ((stat (filename, &finfo) == 0) && S_ISDIR (finfo.st_mode))
+ {
+ if (rl_line_buffer[rl_point] != '/')
+ rl_insert_text ("/");
+ }
+ else
+ {
+ if (rl_point == rl_end)
+ rl_insert_text (temp_string);
+ }
+ free (filename);
+ }
+ else
+ {
+ if (rl_point == rl_end)
+ rl_insert_text (temp_string);
+ }
+ }
+ break;
+
+ case '*':
+ {
+ int i = 1;
+
+ rl_begin_undo_group ();
+ rl_delete_text (start, rl_point);
+ rl_point = start;
+ if (matches[1])
+ {
+ while (matches[i])
+ {
+ rl_insert_text (matches[i++]);
+ rl_insert_text (" ");
+ }
+ }
+ else
+ {
+ rl_insert_text (matches[0]);
+ rl_insert_text (" ");
+ }
+ rl_end_undo_group ();
+ }
+ break;
+
+ case '?':
+ {
+ int len, count, limit, max;
+ int j, k, l;
+
+ /* Handle simple case first. What if there is only one answer? */
+ if (!matches[1])
+ {
+ char *temp;
+
+ temp = printable_part (matches[0]);
+ crlf ();
+ print_filename (temp, matches[0]);
+ crlf ();
+ goto restart;
+ }
+
+ /* There is more than one answer. Find out how many there are,
+ and find out what the maximum printed length of a single entry
+ is. */
+ display_matches:
+ for (max = 0, i = 1; matches[i]; i++)
+ {
+ char *temp;
+ int name_length;
+
+ temp = printable_part (matches[i]);
+ name_length = strlen (temp);
+
+ if (name_length > max)
+ max = name_length;
+ }
+
+ len = i - 1;
+
+ /* If there are many items, then ask the user if she
+ really wants to see them all. */
+ if (len >= rl_completion_query_items)
+ {
+ crlf ();
+ fprintf (rl_outstream,
+ "There are %d possibilities. Do you really", len);
+ crlf ();
+ fprintf (rl_outstream, "wish to see them all? (y or n)");
+ fflush (rl_outstream);
+ if (!get_y_or_n ())
+ {
+ crlf ();
+ goto restart;
+ }
+ }
+
+ /* How many items of MAX length can we fit in the screen window? */
+ max += 2;
+ limit = screenwidth / max;
+ if (limit != 1 && (limit * max == screenwidth))
+ limit--;
+
+ /* Avoid a possible floating exception. If max > screenwidth,
+ limit will be 0 and a divide-by-zero fault will result. */
+ if (limit == 0)
+ limit = 1;
+
+ /* How many iterations of the printing loop? */
+ count = (len + (limit - 1)) / limit;
+
+ /* Watch out for special case. If LEN is less than LIMIT, then
+ just do the inner printing loop. */
+ if (len < limit)
+ count = 1;
+
+ /* Sort the items if they are not already sorted. */
+ if (!rl_ignore_completion_duplicates)
+ qsort (matches, len, sizeof (char *), compare_strings);
+
+ /* Print the sorted items, up-and-down alphabetically, like
+ ls might. */
+ crlf ();
+
+ for (i = 1; i < count + 1; i++)
+ {
+ for (j = 0, l = i; j < limit; j++)
+ {
+ if (l > len || !matches[l])
+ break;
+ else
+ {
+ char *temp;
+ int printed_length;
+
+ temp = printable_part (matches[l]);
+ printed_length = strlen (temp);
+ printed_length += print_filename (temp, matches[l]);
+
+ if (j + 1 < limit)
+ {
+ for (k = 0; k < max - printed_length; k++)
+ putc (' ', rl_outstream);
+ }
+ }
+ l += count;
+ }
+ crlf ();
+ }
+ restart:
+
+ rl_on_new_line ();
+ }
+ break;
+
+ default:
+ fprintf (stderr, "\r\nreadline: bad value for what_to_do in rl_complete\n");
+ abort ();
+ }
+
+ for (i = 0; matches[i]; i++)
+ free (matches[i]);
+ free (matches);
+ }
+
+ /* Check to see if the line has changed through all of this manipulation. */
+ if (saved_line_buffer)
+ {
+ if (strcmp (rl_line_buffer, saved_line_buffer) != 0)
+ completion_changed_buffer = 1;
+ else
+ completion_changed_buffer = 0;
+
+ free (saved_line_buffer);
+ }
+ return 0;
+}
+
+#if defined (VISIBLE_STATS)
+/* Return the character which best describes FILENAME.
+ `@' for symbolic links
+ `/' for directories
+ `*' for executables
+ `=' for sockets */
+static int
+stat_char (filename)
+ char *filename;
+{
+ struct stat finfo;
+ int character, r;
+
+#if defined (S_ISLNK)
+ r = lstat (filename, &finfo);
+#else
+ r = stat (filename, &finfo);
+#endif
+
+ if (r == -1)
+ return (0);
+
+ character = 0;
+ if (S_ISDIR (finfo.st_mode))
+ character = '/';
+#if defined (S_ISLNK)
+ else if (S_ISLNK (finfo.st_mode))
+ character = '@';
+#endif /* S_ISLNK */
+#if defined (S_ISSOCK)
+ else if (S_ISSOCK (finfo.st_mode))
+ character = '=';
+#endif /* S_ISSOCK */
+ else if (S_ISREG (finfo.st_mode))
+ {
+ if (access (filename, X_OK) == 0)
+ character = '*';
+ }
+ return (character);
+}
+#endif /* VISIBLE_STATS */
+
+/* Stupid comparison routine for qsort () ing strings. */
+static int
+compare_strings (s1, s2)
+ char **s1, **s2;
+{
+ return (strcmp (*s1, *s2));
+}
+
+/* A completion function for usernames.
+ TEXT contains a partial username preceded by a random
+ character (usually `~'). */
+char *
+username_completion_function (text, state)
+ int state;
+ char *text;
+{
+#if defined (__GO32__)
+ return (char *)NULL;
+#else /* !__GO32__ */
+ static char *username = (char *)NULL;
+ static struct passwd *entry;
+ static int namelen, first_char, first_char_loc;
+
+ if (!state)
+ {
+ if (username)
+ free (username);
+
+ first_char = *text;
+
+ if (first_char == '~')
+ first_char_loc = 1;
+ else
+ first_char_loc = 0;
+
+ username = savestring (&text[first_char_loc]);
+ namelen = strlen (username);
+ setpwent ();
+ }
+
+ while (entry = getpwent ())
+ {
+ if ((username[0] == entry->pw_name[0]) &&
+ (strncmp (username, entry->pw_name, namelen) == 0))
+ break;
+ }
+
+ if (!entry)
+ {
+ endpwent ();
+ return ((char *)NULL);
+ }
+ else
+ {
+ char *value = (char *)xmalloc (2 + strlen (entry->pw_name));
+
+ *value = *text;
+
+ strcpy (value + first_char_loc, entry->pw_name);
+
+ if (first_char == '~')
+ rl_filename_completion_desired = 1;
+
+ return (value);
+ }
+#endif /* !__GO32__ */
+}
+
+/* **************************************************************** */
+/* */
+/* Completion */
+/* */
+/* **************************************************************** */
+
+/* Non-zero means that case is not significant in completion. */
+int completion_case_fold = 0;
+
+/* Return an array of (char *) which is a list of completions for TEXT.
+ If there are no completions, return a NULL pointer.
+ The first entry in the returned array is the substitution for TEXT.
+ The remaining entries are the possible completions.
+ The array is terminated with a NULL pointer.
+
+ ENTRY_FUNCTION is a function of two args, and returns a (char *).
+ The first argument is TEXT.
+ The second is a state argument; it should be zero on the first call, and
+ non-zero on subsequent calls. It returns a NULL pointer to the caller
+ when there are no more matches.
+ */
+char **
+completion_matches (text, entry_function)
+ char *text;
+ CPFunction *entry_function;
+{
+ /* Number of slots in match_list. */
+ int match_list_size;
+
+ /* The list of matches. */
+ char **match_list =
+ (char **)xmalloc (((match_list_size = 10) + 1) * sizeof (char *));
+
+ /* Number of matches actually found. */
+ int matches = 0;
+
+ /* Temporary string binder. */
+ char *string;
+
+ match_list[1] = (char *)NULL;
+
+ while (string = (*entry_function) (text, matches))
+ {
+ if (matches + 1 == match_list_size)
+ match_list = (char **)xrealloc
+ (match_list, ((match_list_size += 10) + 1) * sizeof (char *));
+
+ match_list[++matches] = string;
+ match_list[matches + 1] = (char *)NULL;
+ }
+
+ /* If there were any matches, then look through them finding out the
+ lowest common denominator. That then becomes match_list[0]. */
+ if (matches)
+ {
+ register int i = 1;
+ int low = 100000; /* Count of max-matched characters. */
+
+ /* If only one match, just use that. */
+ if (matches == 1)
+ {
+ match_list[0] = match_list[1];
+ match_list[1] = (char *)NULL;
+ }
+ else
+ {
+ /* Otherwise, compare each member of the list with
+ the next, finding out where they stop matching. */
+
+ while (i < matches)
+ {
+ register int c1, c2, si;
+
+ if (completion_case_fold)
+ {
+ for (si = 0;
+ (c1 = to_lower(match_list[i][si])) &&
+ (c2 = to_lower(match_list[i + 1][si]));
+ si++)
+ if (c1 != c2) break;
+ }
+ else
+ {
+ for (si = 0;
+ (c1 = match_list[i][si]) &&
+ (c2 = match_list[i + 1][si]);
+ si++)
+ if (c1 != c2) break;
+ }
+
+ if (low > si) low = si;
+ i++;
+ }
+ match_list[0] = (char *)xmalloc (low + 1);
+ strncpy (match_list[0], match_list[1], low);
+ match_list[0][low] = '\0';
+ }
+ }
+ else /* There were no matches. */
+ {
+ free (match_list);
+ match_list = (char **)NULL;
+ }
+ return (match_list);
+}
+
+/* Okay, now we write the entry_function for filename completion. In the
+ general case. Note that completion in the shell is a little different
+ because of all the pathnames that must be followed when looking up the
+ completion for a command. */
+char *
+filename_completion_function (text, state)
+ int state;
+ char *text;
+{
+ static DIR *directory;
+ static char *filename = (char *)NULL;
+ static char *dirname = (char *)NULL;
+ static char *users_dirname = (char *)NULL;
+ static int filename_len;
+
+ struct direct *entry = (struct direct *)NULL;
+
+ /* If we don't have any state, then do some initialization. */
+ if (!state)
+ {
+ char *temp;
+
+ if (dirname) free (dirname);
+ if (filename) free (filename);
+ if (users_dirname) free (users_dirname);
+
+ filename = savestring (text);
+ if (!*text) text = ".";
+ dirname = savestring (text);
+
+ temp = strrchr (dirname, '/');
+
+ if (temp)
+ {
+ strcpy (filename, ++temp);
+ *temp = '\0';
+ }
+ else
+ strcpy (dirname, ".");
+
+ /* We aren't done yet. We also support the "~user" syntax. */
+
+ /* Save the version of the directory that the user typed. */
+ users_dirname = savestring (dirname);
+ {
+ char *temp_dirname;
+ int replace_dirname;
+
+ temp_dirname = tilde_expand (dirname);
+ free (dirname);
+ dirname = temp_dirname;
+
+ replace_dirname = 0;
+ if (rl_directory_completion_hook)
+ replace_dirname = (*rl_directory_completion_hook) (&dirname);
+ if (replace_dirname)
+ {
+ free (users_dirname);
+ users_dirname = savestring (dirname);
+ }
+ }
+ directory = opendir (dirname);
+ filename_len = strlen (filename);
+
+ rl_filename_completion_desired = 1;
+ }
+
+ /* At this point we should entertain the possibility of hacking wildcarded
+ filenames, like /usr/man/man<WILD>/te<TAB>. If the directory name
+ contains globbing characters, then build an array of directories, and
+ then map over that list while completing. */
+ /* *** UNIMPLEMENTED *** */
+
+ /* Now that we have some state, we can read the directory. */
+
+ while (directory && (entry = readdir (directory)))
+ {
+ /* Special case for no filename.
+ All entries except "." and ".." match. */
+ if (!filename_len)
+ {
+ if ((strcmp (entry->d_name, ".") != 0) &&
+ (strcmp (entry->d_name, "..") != 0))
+ break;
+ }
+ else
+ {
+ /* Otherwise, if these match up to the length of filename, then
+ it is a match. */
+ if (((int)D_NAMLEN (entry)) >= filename_len &&
+ (entry->d_name[0] == filename[0]) &&
+ (strncmp (filename, entry->d_name, filename_len) == 0))
+ break;
+ }
+ }
+
+ if (!entry)
+ {
+ if (directory)
+ {
+ closedir (directory);
+ directory = (DIR *)NULL;
+ }
+
+ if (dirname)
+ {
+ free (dirname);
+ dirname = (char *)NULL;
+ }
+ if (filename)
+ {
+ free (filename);
+ filename = (char *)NULL;
+ }
+ if (users_dirname)
+ {
+ free (users_dirname);
+ users_dirname = (char *)NULL;
+ }
+
+ return (char *)NULL;
+ }
+ else
+ {
+ char *temp;
+
+ /* dirname && (strcmp (dirname, ".") != 0) */
+ if (dirname && (dirname[0] != '.' || dirname[1]))
+ {
+ if (rl_complete_with_tilde_expansion && *users_dirname == '~')
+ {
+ int dirlen = strlen (dirname);
+ temp = (char *)xmalloc (2 + dirlen + D_NAMLEN (entry));
+ strcpy (temp, dirname);
+ /* Canonicalization cuts off any final slash present. We need
+ to add it back. */
+ if (dirname[dirlen - 1] != '/')
+ {
+ temp[dirlen] = '/';
+ temp[dirlen + 1] = '\0';
+ }
+ }
+ else
+ {
+ temp = (char *)
+ xmalloc (1 + strlen (users_dirname) + D_NAMLEN (entry));
+ strcpy (temp, users_dirname);
+ }
+
+ strcat (temp, entry->d_name);
+ }
+ else
+ temp = (savestring (entry->d_name));
+
+ return (temp);
+ }
+}
+
+/* A function for simple tilde expansion. */
+int
+rl_tilde_expand (ignore, key)
+ int ignore, key;
+{
+ register int start, end;
+ char *homedir;
+
+ end = rl_point;
+ start = end - 1;
+
+ if (rl_point == rl_end && rl_line_buffer[rl_point] == '~')
+ {
+ homedir = tilde_expand ("~");
+ goto insert;
+ }
+ else if (rl_line_buffer[start] != '~')
+ {
+ for (; !whitespace (rl_line_buffer[start]) && start >= 0; start--);
+ start++;
+ }
+
+ end = start;
+ do
+ {
+ end++;
+ }
+ while (!whitespace (rl_line_buffer[end]) && end < rl_end);
+
+ if (whitespace (rl_line_buffer[end]) || end >= rl_end)
+ end--;
+
+ /* If the first character of the current word is a tilde, perform
+ tilde expansion and insert the result. If not a tilde, do
+ nothing. */
+ if (rl_line_buffer[start] == '~')
+ {
+ char *temp;
+ int len;
+
+ len = end - start + 1;
+ temp = xmalloc (len + 1);
+ strncpy (temp, rl_line_buffer + start, len);
+ temp[len] = '\0';
+ homedir = tilde_expand (temp);
+ free (temp);
+
+ insert:
+ rl_begin_undo_group ();
+ rl_delete_text (start, end + 1);
+ rl_point = start;
+ rl_insert_text (homedir);
+ rl_end_undo_group ();
+ }
+
+ return (0);
+}
+
+/* Find the first occurrence in STRING1 of any character from STRING2.
+ Return a pointer to the character in STRING1. */
+static char *
+rl_strpbrk (string1, string2)
+ char *string1, *string2;
+{
+ register char *scan;
+
+ for (; *string1; string1++)
+ {
+ for (scan = string2; *scan; scan++)
+ {
+ if (*string1 == *scan)
+ {
+ return (string1);
+ }
+ }
+ }
+ return ((char *)NULL);
+}
+
+#if defined (STATIC_MALLOC)
+
+/* **************************************************************** */
+/* */
+/* xmalloc and xrealloc () */
+/* */
+/* **************************************************************** */
+
+static void memory_error_and_abort ();
+
+static char *
+xmalloc (bytes)
+ int bytes;
+{
+ char *temp = (char *)malloc (bytes);
+
+ if (!temp)
+ memory_error_and_abort ();
+ return (temp);
+}
+
+static char *
+xrealloc (pointer, bytes)
+ char *pointer;
+ int bytes;
+{
+ char *temp;
+
+ if (!pointer)
+ temp = (char *)malloc (bytes);
+ else
+ temp = (char *)realloc (pointer, bytes);
+
+ if (!temp)
+ memory_error_and_abort ();
+
+ return (temp);
+}
+
+static void
+memory_error_and_abort ()
+{
+ fprintf (stderr, "readline: Out of virtual memory!\n");
+ abort ();
+}
+#endif /* STATIC_MALLOC */
diff --git a/gnu/lib/libreadline/display.c b/gnu/lib/libreadline/display.c
new file mode 100644
index 000000000000..95c61d80b5a8
--- /dev/null
+++ b/gnu/lib/libreadline/display.c
@@ -0,0 +1,1017 @@
+/* display.c -- readline redisplay facility. */
+
+/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library, a library for
+ reading lines of text with interactive input and history editing.
+
+ The GNU Readline 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 1, or
+ (at your option) any later version.
+
+ The GNU Readline 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.
+
+ The GNU General Public License is often shipped with GNU software, and
+ is generally kept in a file called COPYING or LICENSE. If you do not
+ have a copy of the license, write to the Free Software Foundation,
+ 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#include <stdio.h>
+#include <sys/types.h>
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#endif /* HAVE_UNISTD_H */
+
+#if defined (HAVE_STDLIB_H)
+# include <stdlib.h>
+#else
+# include "ansi_stdlib.h"
+#endif /* HAVE_STDLIB_H */
+
+#include "posixstat.h"
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+
+/* Some standard library routines. */
+#include <readline/readline.h>
+#include <readline/history.h>
+
+#if !defined (strchr) && !defined (__STDC__)
+extern char *strchr (), *strrchr ();
+#endif /* !strchr && !__STDC__ */
+
+/* Global and pseudo-global variables and functions
+ imported from readline.c. */
+extern char *rl_prompt;
+extern int readline_echoing_p;
+extern char *term_clreol, *term_im, *term_ic, *term_ei, *term_DC;
+/* Termcap variables. */
+extern char *term_up, *term_dc, *term_cr, *term_IC;
+extern int screenheight, screenwidth, screenchars;
+extern int terminal_can_insert;
+
+extern void _rl_output_some_chars ();
+extern int _rl_output_character_function ();
+
+extern int _rl_output_meta_chars;
+extern int _rl_horizontal_scroll_mode;
+extern int _rl_mark_modified_lines;
+extern int _rl_prefer_visible_bell;
+
+/* Pseudo-global functions (local to the readline library) exported
+ by this file. */
+void _rl_move_cursor_relative (), _rl_output_some_chars ();
+void _rl_move_vert ();
+
+static void update_line (), clear_to_eol ();
+static void delete_chars (), insert_some_chars ();
+
+extern char *xmalloc (), *xrealloc ();
+
+/* **************************************************************** */
+/* */
+/* Display stuff */
+/* */
+/* **************************************************************** */
+
+/* This is the stuff that is hard for me. I never seem to write good
+ display routines in C. Let's see how I do this time. */
+
+/* (PWP) Well... Good for a simple line updater, but totally ignores
+ the problems of input lines longer than the screen width.
+
+ update_line and the code that calls it makes a multiple line,
+ automatically wrapping line update. Carefull attention needs
+ to be paid to the vertical position variables.
+
+ handling of terminals with autowrap on (incl. DEC braindamage)
+ could be improved a bit. Right now I just cheat and decrement
+ screenwidth by one. */
+
+/* Keep two buffers; one which reflects the current contents of the
+ screen, and the other to draw what we think the new contents should
+ be. Then compare the buffers, and make whatever changes to the
+ screen itself that we should. Finally, make the buffer that we
+ just drew into be the one which reflects the current contents of the
+ screen, and place the cursor where it belongs.
+
+ Commands that want to can fix the display themselves, and then let
+ this function know that the display has been fixed by setting the
+ RL_DISPLAY_FIXED variable. This is good for efficiency. */
+
+/* Global variables declared here. */
+/* What YOU turn on when you have handled all redisplay yourself. */
+int rl_display_fixed = 0;
+
+/* The stuff that gets printed out before the actual text of the line.
+ This is usually pointing to rl_prompt. */
+char *rl_display_prompt = (char *)NULL;
+
+/* Pseudo-global variables declared here. */
+/* The visible cursor position. If you print some text, adjust this. */
+int _rl_last_c_pos = 0;
+int _rl_last_v_pos = 0;
+
+/* Number of lines currently on screen minus 1. */
+int _rl_vis_botlin = 0;
+
+/* Variables used only in this file. */
+/* The last left edge of text that was displayed. This is used when
+ doing horizontal scrolling. It shifts in thirds of a screenwidth. */
+static int last_lmargin = 0;
+
+/* The line display buffers. One is the line currently displayed on
+ the screen. The other is the line about to be displayed. */
+static char *visible_line = (char *)NULL;
+static char *invisible_line = (char *)NULL;
+
+/* A buffer for `modeline' messages. */
+static char msg_buf[128];
+
+/* Non-zero forces the redisplay even if we thought it was unnecessary. */
+static int forced_display = 0;
+
+/* Default and initial buffer size. Can grow. */
+static int line_size = 1024;
+
+static char *last_prompt_string = (char *)NULL;
+static char *local_prompt, *local_prompt_prefix;
+static int visible_length, prefix_length;
+
+/* The number of invisible characters in the line currently being
+ displayed on the screen. */
+static int visible_wrap_offset = 0;
+
+/* The length (buffer offset) of the first line of the last (possibly
+ multi-line) buffer displayed on the screen. */
+static int visible_first_line_len = 0;
+
+/* Expand the prompt string S and return the number of visible
+ characters in *LP, if LP is not null. This is currently more-or-less
+ a placeholder for expansion. */
+
+/* Current implementation:
+ \001 (^A) start non-visible characters
+ \002 (^B) end non-visible characters
+ all characters except \001 and \002 (following a \001) are copied to
+ the returned string; all characters except those between \001 and
+ \002 are assumed to be `visible'. */
+
+static char *
+expand_prompt (pmt, lp)
+ char *pmt;
+ int *lp;
+{
+ char *r, *ret, *p;
+ int l, rl, ignoring;
+
+ /* Short-circuit if we can. */
+ if (strchr (pmt, RL_PROMPT_START_IGNORE) == 0)
+ {
+ r = savestring (pmt);
+ if (lp)
+ *lp = strlen (r);
+ return r;
+ }
+
+ l = strlen (pmt);
+ r = ret = xmalloc (l + 1);
+
+ for (rl = ignoring = 0, p = pmt; p && *p; p++)
+ {
+ /* This code strips the invisible character string markers
+ RL_PROMPT_START_IGNORE and RL_PROMPT_END_IGNORE */
+ if (*p == RL_PROMPT_START_IGNORE)
+ {
+ ignoring++;
+ continue;
+ }
+ else if (ignoring && *p == RL_PROMPT_END_IGNORE)
+ {
+ ignoring = 0;
+ continue;
+ }
+ else
+ {
+ *r++ = *p;
+ if (!ignoring)
+ rl++;
+ }
+ }
+
+ *r = '\0';
+ if (lp)
+ *lp = rl;
+ return ret;
+}
+
+/*
+ * Expand the prompt string into the various display components, if
+ * necessary.
+ *
+ * local_prompt = expanded last line of string in rl_display_prompt
+ * (portion after the final newline)
+ * local_prompt_prefix = portion before last newline of rl_display_prompt,
+ * expanded via expand_prompt
+ * visible_length = number of visible characters in local_prompt
+ * prefix_length = number of visible characters in local_prompt_prefix
+ *
+ * This function is called once per call to readline(). It may also be
+ * called arbitrarily to expand the primary prompt.
+ *
+ * The return value is the number of visible characters on the last line
+ * of the (possibly multi-line) prompt.
+ */
+int
+rl_expand_prompt (prompt)
+ char *prompt;
+{
+ char *p, *t;
+ int c;
+
+ /* Clear out any saved values. */
+ if (local_prompt)
+ free (local_prompt);
+ if (local_prompt_prefix)
+ free (local_prompt_prefix);
+ local_prompt = local_prompt_prefix = (char *)0;
+
+ p = strrchr (prompt, '\n');
+ if (!p)
+ {
+ /* The prompt is only one line. */
+ local_prompt = expand_prompt (prompt, &visible_length);
+ local_prompt_prefix = (char *)0;
+ return (visible_length);
+ }
+ else
+ {
+ /* The prompt spans multiple lines. */
+ t = ++p;
+ local_prompt = expand_prompt (p, &visible_length);
+ c = *t; *t = '\0';
+ /* The portion of the prompt string up to and including the
+ final newline is now null-terminated. */
+ local_prompt_prefix = expand_prompt (prompt, &prefix_length);
+ *t = c;
+ return (prefix_length);
+ }
+}
+
+/* Basic redisplay algorithm. */
+void
+rl_redisplay ()
+{
+ register int in, out, c, linenum;
+ register char *line = invisible_line;
+ int c_pos = 0, inv_botlin = 0, wrap_offset, wrap_column;
+ char *prompt_this_line;
+
+ if (!readline_echoing_p)
+ return;
+
+ if (!rl_display_prompt)
+ rl_display_prompt = "";
+
+ if (!invisible_line)
+ {
+ visible_line = (char *)xmalloc (line_size);
+ invisible_line = (char *)xmalloc (line_size);
+ line = invisible_line;
+ for (in = 0; in < line_size; in++)
+ {
+ visible_line[in] = 0;
+ invisible_line[in] = 1;
+ }
+ rl_on_new_line ();
+ }
+
+ /* Draw the line into the buffer. */
+ c_pos = -1;
+
+ /* Mark the line as modified or not. We only do this for history
+ lines. */
+ out = 0;
+ if (_rl_mark_modified_lines && current_history () && rl_undo_list)
+ {
+ line[out++] = '*';
+ line[out] = '\0';
+ }
+
+ /* If someone thought that the redisplay was handled, but the currently
+ visible line has a different modification state than the one about
+ to become visible, then correct the caller's misconception. */
+ if (visible_line[0] != invisible_line[0])
+ rl_display_fixed = 0;
+
+ /* If the prompt to be displayed is the `primary' readline prompt (the
+ one passed to readline()), use the values we have already expanded.
+ If not, use what's already in rl_display_prompt. WRAP_OFFSET is the
+ number of non-visible characters in the prompt string. */
+ if (rl_display_prompt == rl_prompt)
+ {
+ int local_len = strlen (local_prompt);
+ if (local_prompt_prefix && forced_display)
+ _rl_output_some_chars (local_prompt_prefix, strlen (local_prompt_prefix));
+
+ if (local_prompt)
+ strncpy (line + out, local_prompt, local_len);
+ out += local_len;
+ line[out] = '\0';
+ wrap_offset = local_len - visible_length;
+ }
+ else
+ {
+ int pmtlen;
+ prompt_this_line = strrchr (rl_display_prompt, '\n');
+ if (!prompt_this_line)
+ prompt_this_line = rl_display_prompt;
+ else
+ {
+ prompt_this_line++;
+ if (forced_display)
+ _rl_output_some_chars (rl_display_prompt, prompt_this_line - rl_display_prompt);
+ }
+
+ pmtlen = strlen (prompt_this_line);
+ strncpy (line + out, prompt_this_line, pmtlen);
+ out += pmtlen;
+ line[out] = '\0';
+ wrap_offset = 0;
+ }
+
+ for (in = 0; in < rl_end; in++)
+ {
+ c = (unsigned char)rl_line_buffer[in];
+
+ if (out + 8 >= line_size) /* XXX - 8 for \t */
+ {
+ line_size *= 2;
+ visible_line = (char *)xrealloc (visible_line, line_size);
+ invisible_line = (char *)xrealloc (invisible_line, line_size);
+ line = invisible_line;
+ }
+
+ if (in == rl_point)
+ c_pos = out;
+
+ if (META_CHAR (c))
+ {
+ if (_rl_output_meta_chars == 0)
+ {
+ sprintf (line + out, "\\%o", c);
+ out += 4;
+ }
+ else
+ line[out++] = c;
+ }
+#if defined (DISPLAY_TABS)
+ else if (c == '\t')
+ {
+ register int newout = (out | (int)7) + 1;
+ while (out < newout)
+ line[out++] = ' ';
+ }
+#endif
+ else if (c < ' ')
+ {
+ line[out++] = '^';
+ line[out++] = UNCTRL (c); /* XXX was c ^ 0x40 */
+ }
+ else if (c == 127)
+ {
+ line[out++] = '^';
+ line[out++] = '?';
+ }
+ else
+ line[out++] = c;
+ }
+ line[out] = '\0';
+ if (c_pos < 0)
+ c_pos = out;
+
+ /* C_POS == position in buffer where cursor should be placed. */
+
+ /* PWP: now is when things get a bit hairy. The visible and invisible
+ line buffers are really multiple lines, which would wrap every
+ (screenwidth - 1) characters. Go through each in turn, finding
+ the changed region and updating it. The line order is top to bottom. */
+
+ /* If we can move the cursor up and down, then use multiple lines,
+ otherwise, let long lines display in a single terminal line, and
+ horizontally scroll it. */
+
+ if (!_rl_horizontal_scroll_mode && term_up && *term_up)
+ {
+ int total_screen_chars = screenchars;
+ int nleft, cursor_linenum, pos;
+
+ if (!rl_display_fixed || forced_display)
+ {
+ forced_display = 0;
+
+ /* If we have more than a screenful of material to display, then
+ only display a screenful. We should display the last screen,
+ not the first. I'll fix this in a minute. */
+ if (out >= total_screen_chars)
+ out = total_screen_chars - 1;
+
+ /* Number of screen lines to display. The first line wraps at
+ (screenwidth + wrap_offset) chars, the rest of the lines have
+ screenwidth chars. */
+ nleft = out - screenwidth - wrap_offset;
+ if (nleft > 0)
+ inv_botlin = 1 + nleft / screenwidth;
+ else
+ inv_botlin = 0;
+
+ /* The first line is at character position 0 in the buffer. The
+ second and subsequent lines start at N * screenwidth, offset by
+ OFFSET. OFFSET is wrap_offset for the invisible line and
+ visible_wrap_offset for the line currently displayed. */
+
+#define L_OFFSET(n, offset) ((n) > 0 ? ((n) * screenwidth) + (offset) : 0)
+#define VIS_CHARS(line) &visible_line[L_OFFSET((line), visible_wrap_offset)]
+#define VIS_LINE(line) ((line) > _rl_vis_botlin) ? "" : VIS_CHARS(line)
+#define INV_LINE(line) &invisible_line[L_OFFSET((line), wrap_offset)]
+
+ /* For each line in the buffer, do the updating display. */
+ for (linenum = 0; linenum <= inv_botlin; linenum++)
+ {
+ update_line (VIS_LINE(linenum), INV_LINE(linenum), linenum);
+
+ /* If this is the line with the prompt, we might need to
+ compensate for invisible characters in the new line. Do
+ this only if there is not more than one new line (which
+ implies that we completely overwrite the old visible line)
+ and the new line is shorter than the old. */
+ if (linenum == 0 &&
+ inv_botlin == 0 &&
+ (wrap_offset > visible_wrap_offset) &&
+ (_rl_last_c_pos < visible_first_line_len))
+ {
+ nleft = screenwidth + wrap_offset - _rl_last_c_pos;
+ clear_to_eol (nleft);
+ }
+
+ /* Since the new first line is now visible, save its length. */
+ if (linenum == 0)
+ visible_first_line_len = _rl_last_c_pos;
+ }
+
+ /* We may have deleted some lines. If so, clear the left over
+ blank ones at the bottom out. */
+ if (_rl_vis_botlin > inv_botlin)
+ {
+ char *tt;
+ for (; linenum <= _rl_vis_botlin; linenum++)
+ {
+ tt = VIS_CHARS (linenum);
+ _rl_move_vert (linenum);
+ _rl_move_cursor_relative (0, tt);
+ clear_to_eol
+ ((linenum == _rl_vis_botlin) ? strlen (tt) : screenwidth);
+ }
+ }
+ _rl_vis_botlin = inv_botlin;
+
+ /* Move the cursor where it should be. */
+ /* Which line? */
+ nleft = c_pos - screenwidth - wrap_offset;
+ if (nleft > 0)
+ cursor_linenum = 1 + nleft / screenwidth;
+ else
+ cursor_linenum = 0;
+ _rl_move_vert (cursor_linenum);
+
+ /* Where on that line? And where does that line start
+ in the buffer? */
+ pos = L_OFFSET(cursor_linenum, wrap_offset);
+ nleft = c_pos - pos;
+ _rl_move_cursor_relative (nleft, &invisible_line[pos]);
+ }
+ }
+ else /* Do horizontal scrolling. */
+ {
+ int lmargin;
+
+ /* Always at top line. */
+ _rl_last_v_pos = 0;
+
+ /* If the display position of the cursor would be off the edge
+ of the screen, start the display of this line at an offset that
+ leaves the cursor on the screen. */
+ if (c_pos - last_lmargin > screenwidth - 2)
+ lmargin = (c_pos / (screenwidth / 3) - 2) * (screenwidth / 3);
+ else if (c_pos - last_lmargin < 1)
+ lmargin = ((c_pos - 1) / (screenwidth / 3)) * (screenwidth / 3);
+ else
+ lmargin = last_lmargin;
+
+ /* If the first character on the screen isn't the first character
+ in the display line, indicate this with a special character. */
+ if (lmargin > 0)
+ line[lmargin] = '<';
+
+ if (lmargin + screenwidth < out)
+ line[lmargin + screenwidth - 1] = '>';
+
+ if (!rl_display_fixed || forced_display || lmargin != last_lmargin)
+ {
+ forced_display = 0;
+ update_line (&visible_line[last_lmargin],
+ &invisible_line[lmargin], 0);
+
+ _rl_move_cursor_relative (c_pos - lmargin, &invisible_line[lmargin]);
+ last_lmargin = lmargin;
+ }
+ }
+ fflush (rl_outstream);
+
+ /* Swap visible and non-visible lines. */
+ {
+ char *temp = visible_line;
+ visible_line = invisible_line;
+ invisible_line = temp;
+ rl_display_fixed = 0;
+ visible_wrap_offset = wrap_offset;
+ }
+}
+
+/* PWP: update_line() is based on finding the middle difference of each
+ line on the screen; vis:
+
+ /old first difference
+ /beginning of line | /old last same /old EOL
+ v v v v
+old: eddie> Oh, my little gruntle-buggy is to me, as lurgid as
+new: eddie> Oh, my little buggy says to me, as lurgid as
+ ^ ^ ^ ^
+ \beginning of line | \new last same \new end of line
+ \new first difference
+
+ All are character pointers for the sake of speed. Special cases for
+ no differences, as well as for end of line additions must be handeled.
+
+ Could be made even smarter, but this works well enough */
+static void
+update_line (old, new, current_line)
+ register char *old, *new;
+ int current_line;
+{
+ register char *ofd, *ols, *oe, *nfd, *nls, *ne;
+ int lendiff, wsatend;
+
+ /* Find first difference. */
+ for (ofd = old, nfd = new;
+ (ofd - old < screenwidth) && *ofd && (*ofd == *nfd);
+ ofd++, nfd++)
+ ;
+
+ /* Move to the end of the screen line. */
+ for (oe = ofd; ((oe - old) < screenwidth) && *oe; oe++);
+ for (ne = nfd; ((ne - new) < screenwidth) && *ne; ne++);
+
+ /* If no difference, continue to next line. */
+ if (ofd == oe && nfd == ne)
+ return;
+
+ wsatend = 1; /* flag for trailing whitespace */
+ ols = oe - 1; /* find last same */
+ nls = ne - 1;
+ while ((ols > ofd) && (nls > nfd) && (*ols == *nls))
+ {
+ if (*ols != ' ')
+ wsatend = 0;
+ ols--;
+ nls--;
+ }
+
+ if (wsatend)
+ {
+ ols = oe;
+ nls = ne;
+ }
+ else if (*ols != *nls)
+ {
+ if (*ols) /* don't step past the NUL */
+ ols++;
+ if (*nls)
+ nls++;
+ }
+
+ _rl_move_vert (current_line);
+ _rl_move_cursor_relative (ofd - old, old);
+
+ /* if (len (new) > len (old)) */
+ lendiff = (nls - nfd) - (ols - ofd);
+
+ /* Insert (diff (len (old), len (new)) ch. */
+ if (lendiff > 0)
+ {
+ if (terminal_can_insert)
+ {
+ /* Sometimes it is cheaper to print the characters rather than
+ use the terminal's capabilities. */
+ if ((2 * (ne - nfd)) < lendiff && !term_IC)
+ {
+ _rl_output_some_chars (nfd, (ne - nfd));
+ _rl_last_c_pos += (ne - nfd);
+ }
+ else
+ {
+ if (*ols)
+ {
+ insert_some_chars (nfd, lendiff);
+ _rl_last_c_pos += lendiff;
+ }
+ else
+ {
+ /* At the end of a line the characters do not have to
+ be "inserted". They can just be placed on the screen. */
+ _rl_output_some_chars (nfd, lendiff);
+ _rl_last_c_pos += lendiff;
+ }
+ /* Copy (new) chars to screen from first diff to last match. */
+ if (((nls - nfd) - lendiff) > 0)
+ {
+ _rl_output_some_chars (&nfd[lendiff], ((nls - nfd) - lendiff));
+ _rl_last_c_pos += ((nls - nfd) - lendiff);
+ }
+ }
+ }
+ else
+ { /* cannot insert chars, write to EOL */
+ _rl_output_some_chars (nfd, (ne - nfd));
+ _rl_last_c_pos += (ne - nfd);
+ }
+ }
+ else /* Delete characters from line. */
+ {
+ /* If possible and inexpensive to use terminal deletion, then do so. */
+ if (term_dc && (2 * (ne - nfd)) >= (-lendiff))
+ {
+ if (lendiff)
+ delete_chars (-lendiff); /* delete (diff) characters */
+
+ /* Copy (new) chars to screen from first diff to last match */
+ if ((nls - nfd) > 0)
+ {
+ _rl_output_some_chars (nfd, (nls - nfd));
+ _rl_last_c_pos += (nls - nfd);
+ }
+ }
+ /* Otherwise, print over the existing material. */
+ else
+ {
+ _rl_output_some_chars (nfd, (ne - nfd));
+ _rl_last_c_pos += (ne - nfd);
+ clear_to_eol ((oe - old) - (ne - new));
+ }
+ }
+}
+
+/* Tell the update routines that we have moved onto a new (empty) line. */
+rl_on_new_line ()
+{
+ if (visible_line)
+ visible_line[0] = '\0';
+
+ _rl_last_c_pos = _rl_last_v_pos = 0;
+ _rl_vis_botlin = last_lmargin = 0;
+ return 0;
+}
+
+/* Actually update the display, period. */
+rl_forced_update_display ()
+{
+ if (visible_line)
+ {
+ register char *temp = visible_line;
+
+ while (*temp) *temp++ = '\0';
+ }
+ rl_on_new_line ();
+ forced_display++;
+ rl_redisplay ();
+ return 0;
+}
+
+/* Move the cursor from _rl_last_c_pos to NEW, which are buffer indices.
+ DATA is the contents of the screen line of interest; i.e., where
+ the movement is being done. */
+void
+_rl_move_cursor_relative (new, data)
+ int new;
+ char *data;
+{
+ register int i;
+
+ /* It may be faster to output a CR, and then move forwards instead
+ of moving backwards. */
+ if (new + 1 < _rl_last_c_pos - new)
+ {
+ tputs (term_cr, 1, _rl_output_character_function);
+ _rl_last_c_pos = 0;
+ }
+
+ if (_rl_last_c_pos == new) return;
+
+ if (_rl_last_c_pos < new)
+ {
+ /* Move the cursor forward. We do it by printing the command
+ to move the cursor forward if there is one, else print that
+ portion of the output buffer again. Which is cheaper? */
+
+ /* The above comment is left here for posterity. It is faster
+ to print one character (non-control) than to print a control
+ sequence telling the terminal to move forward one character.
+ That kind of control is for people who don't know what the
+ data is underneath the cursor. */
+#if defined (HACK_TERMCAP_MOTION)
+ extern char *term_forward_char;
+
+ if (term_forward_char)
+ for (i = _rl_last_c_pos; i < new; i++)
+ tputs (term_forward_char, 1, _rl_output_character_function);
+ else
+ for (i = _rl_last_c_pos; i < new; i++)
+ putc (data[i], rl_outstream);
+#else
+ for (i = _rl_last_c_pos; i < new; i++)
+ putc (data[i], rl_outstream);
+#endif /* HACK_TERMCAP_MOTION */
+ }
+ else
+ backspace (_rl_last_c_pos - new);
+ _rl_last_c_pos = new;
+}
+
+/* PWP: move the cursor up or down. */
+void
+_rl_move_vert (to)
+ int to;
+{
+ register int delta, i;
+
+ if (_rl_last_v_pos == to || to > screenheight)
+ return;
+
+#if defined (__GO32__)
+ {
+ int row, col;
+
+ ScreenGetCursor (&row, &col);
+ ScreenSetCursor ((row + to - _rl_last_v_pos), col);
+ }
+#else /* !__GO32__ */
+
+ if ((delta = to - _rl_last_v_pos) > 0)
+ {
+ for (i = 0; i < delta; i++)
+ putc ('\n', rl_outstream);
+ tputs (term_cr, 1, _rl_output_character_function);
+ _rl_last_c_pos = 0;
+ }
+ else
+ { /* delta < 0 */
+ if (term_up && *term_up)
+ for (i = 0; i < -delta; i++)
+ tputs (term_up, 1, _rl_output_character_function);
+ }
+#endif /* !__GO32__ */
+ _rl_last_v_pos = to; /* Now TO is here */
+}
+
+/* Physically print C on rl_outstream. This is for functions which know
+ how to optimize the display. Return the number of characters output. */
+rl_show_char (c)
+ int c;
+{
+ int n = 1;
+ if (META_CHAR (c) && (_rl_output_meta_chars == 0))
+ {
+ fprintf (rl_outstream, "M-");
+ n += 2;
+ c = UNMETA (c);
+ }
+
+#if defined (DISPLAY_TABS)
+ if (c < 32 && c != '\t')
+#else
+ if (c < 32)
+#endif /* !DISPLAY_TABS */
+ {
+ fprintf (rl_outstream, "C-");
+ n += 2;
+ c += 64;
+ }
+
+ putc (c, rl_outstream);
+ fflush (rl_outstream);
+ return n;
+}
+
+int
+rl_character_len (c, pos)
+ register int c, pos;
+{
+ if (META_CHAR (c))
+ return ((_rl_output_meta_chars == 0) ? 4 : 1);
+
+ if (c == '\t')
+ {
+#if defined (DISPLAY_TABS)
+ return (((pos | (int)7) + 1) - pos);
+#else
+ return (2);
+#endif /* !DISPLAY_TABS */
+ }
+
+ return ((isprint (c)) ? 1 : 2);
+}
+
+/* How to print things in the "echo-area". The prompt is treated as a
+ mini-modeline. */
+
+#if defined (HAVE_VARARGS_H)
+rl_message (va_alist)
+ va_dcl
+{
+ char *format;
+ va_list args;
+
+ va_start (args);
+ format = va_arg (args, char *);
+ vsprintf (msg_buf, format, args);
+ va_end (args);
+
+ rl_display_prompt = msg_buf;
+ rl_redisplay ();
+ return 0;
+}
+#else /* !HAVE_VARARGS_H */
+rl_message (format, arg1, arg2)
+ char *format;
+{
+ sprintf (msg_buf, format, arg1, arg2);
+ rl_display_prompt = msg_buf;
+ rl_redisplay ();
+ return 0;
+}
+#endif /* !HAVE_VARARGS_H */
+
+/* How to clear things from the "echo-area". */
+rl_clear_message ()
+{
+ rl_display_prompt = rl_prompt;
+ rl_redisplay ();
+ return 0;
+}
+
+rl_reset_line_state ()
+{
+ rl_on_new_line ();
+
+ rl_display_prompt = rl_prompt ? rl_prompt : "";
+ forced_display = 1;
+ return 0;
+}
+
+/* Quick redisplay hack when erasing characters at the end of the line. */
+void
+_rl_erase_at_end_of_line (l)
+ int l;
+{
+ register int i;
+
+ backspace (l);
+ for (i = 0; i < l; i++)
+ putc (' ', rl_outstream);
+ backspace (l);
+ for (i = 0; i < l; i++)
+ visible_line[--_rl_last_c_pos] = '\0';
+ rl_display_fixed++;
+}
+
+/* Clear to the end of the line. COUNT is the minimum
+ number of character spaces to clear, */
+static void
+clear_to_eol (count)
+ int count;
+{
+#if !defined (__GO32__)
+ if (term_clreol)
+ {
+ tputs (term_clreol, 1, _rl_output_character_function);
+ }
+ else
+#endif /* !__GO32__ */
+ {
+ register int i;
+
+ /* Do one more character space. */
+ count++;
+
+ for (i = 0; i < count; i++)
+ putc (' ', rl_outstream);
+
+ backspace (count);
+ }
+}
+
+/* Insert COUNT characters from STRING to the output stream. */
+static void
+insert_some_chars (string, count)
+ char *string;
+ int count;
+{
+#if defined (__GO32__)
+ int row, col, width;
+ char *row_start;
+
+ ScreenGetCursor (&row, &col);
+ width = ScreenCols ();
+ row_start = ScreenPrimary + (row * width);
+
+ memcpy (row_start + col + count, row_start + col, width - col - count);
+
+ /* Place the text on the screen. */
+ _rl_output_some_chars (string, count);
+#else /* !_GO32 */
+
+ /* If IC is defined, then we do not have to "enter" insert mode. */
+ if (term_IC)
+ {
+ char *tgoto (), *buffer;
+ buffer = tgoto (term_IC, 0, count);
+ tputs (buffer, 1, _rl_output_character_function);
+ _rl_output_some_chars (string, count);
+ }
+ else
+ {
+ register int i;
+
+ /* If we have to turn on insert-mode, then do so. */
+ if (term_im && *term_im)
+ tputs (term_im, 1, _rl_output_character_function);
+
+ /* If there is a special command for inserting characters, then
+ use that first to open up the space. */
+ if (term_ic && *term_ic)
+ {
+ for (i = count; i--; )
+ tputs (term_ic, 1, _rl_output_character_function);
+ }
+
+ /* Print the text. */
+ _rl_output_some_chars (string, count);
+
+ /* If there is a string to turn off insert mode, we had best use
+ it now. */
+ if (term_ei && *term_ei)
+ tputs (term_ei, 1, _rl_output_character_function);
+ }
+#endif /* !__GO32__ */
+}
+
+/* Delete COUNT characters from the display line. */
+static void
+delete_chars (count)
+ int count;
+{
+#if defined (__GO32__)
+ int row, col, width;
+ char *row_start;
+
+ ScreenGetCursor (&row, &col);
+ width = ScreenCols ();
+ row_start = ScreenPrimary + (row * width);
+
+ memcpy (row_start + col, row_start + col + count, width - col - count);
+ memset (row_start + width - count, 0, count * 2);
+#else /* !_GO32 */
+
+ if (count > screenwidth)
+ return;
+
+ if (term_DC && *term_DC)
+ {
+ char *tgoto (), *buffer;
+ buffer = tgoto (term_DC, count, count);
+ tputs (buffer, count, _rl_output_character_function);
+ }
+ else
+ {
+ if (term_dc && *term_dc)
+ while (count--)
+ tputs (term_dc, 1, _rl_output_character_function);
+ }
+#endif /* !__GO32__ */
+}
diff --git a/gnu/lib/libreadline/doc/Makefile b/gnu/lib/libreadline/doc/Makefile
new file mode 100644
index 000000000000..c79ad92b3fe4
--- /dev/null
+++ b/gnu/lib/libreadline/doc/Makefile
@@ -0,0 +1,34 @@
+# This makefile for History library documentation is in -*- text -*- mode.
+# Emacs likes it that way.
+
+DOC_SUPPORT = ../../doc-support/
+TEXINDEX = $(DOC_SUPPORT)/texindex
+
+TEX = tex
+DVIOBJ = history.dvi
+INFOBJ = history.info
+
+all: $(DVIOBJ) $(INFOBJ)
+
+history.dvi: hist.texinfo hsuser.texinfo hstech.texinfo
+ $(TEX) hist.texinfo
+ $(TEXINDEX) hist.??
+ $(TEX) hist.texinfo
+ mv hist.dvi history.dvi
+
+history.info: hist.texinfo hsuser.texinfo hstech.texinfo
+ makeinfo hist.texinfo
+
+./texinfo.tex: $(DOC_SUPPORT)texinfo.tex
+ ln -s $(DOC_SUPPORT)texinfo.tex .
+
+$(TEXINDEX):
+ (cd $(DOC_SUPPORT); $(MAKE) $(MFLAGS) CFLAGS='$(CFLAGS)' texindex)
+
+clean:
+ rm -f *.aux *.cp *.fn *.ky *.log *.pg *.toc *.tp *.vr *.cps *.pgs \
+ *.fns *.kys *.tps *.vrs *.o core texinfo.tex
+
+squeaky-clean:
+ rm -f *.aux *.cp *.fn *.ky *.log *.pg *.toc *.tp *.vr *.cps *.pgs \
+ *.dvi *.info *.info-* *.fns *.kys *.tps *.vrs *.o core
diff --git a/gnu/lib/libreadline/doc/hist.texinfo b/gnu/lib/libreadline/doc/hist.texinfo
new file mode 100644
index 000000000000..629273810445
--- /dev/null
+++ b/gnu/lib/libreadline/doc/hist.texinfo
@@ -0,0 +1,106 @@
+\input texinfo @c -*-texinfo-*-
+@comment %**start of header (This is for running Texinfo on a region.)
+@setfilename history.info
+@settitle GNU Readline Library
+@comment %**end of header (This is for running Texinfo on a region.)
+@synindex vr fn
+@setchapternewpage odd
+
+@ifinfo
+This document describes the GNU History library, a programming tool that
+provides a consistent user interface for recalling lines of previously
+typed input.
+
+Copyright (C) 1988, 1991 Free Software Foundation, Inc.
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+pare preserved on all copies.
+
+@ignore
+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).
+@end 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.
+@end ifinfo
+
+@titlepage
+@sp 10
+@center @titlefont{GNU History Library}
+@center Brian Fox
+@center Free Software Foundation
+@center Version 1.1
+@center April 1991
+
+@c Include the Distribution inside the titlepage environment so
+@c that headings are turned off.
+
+@page
+
+This document describes the GNU History library, a programming tool that
+provides a consistent user interface for recalling lines of previously
+typed input.
+
+Published by the Free Software Foundation @*
+675 Massachusetts Avenue, @*
+Cambridge, MA 02139 USA
+
+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.
+
+@vskip 0pt plus 1filll
+Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc.
+@end titlepage
+
+@ifinfo
+@node Top
+@top GNU History Library
+
+This document describes the GNU History library, a programming tool that
+provides a consistent user interface for recalling lines of previously
+typed input.
+
+@menu
+* Using History Interactively:: GNU History User's Manual.
+* Programming with GNU History:: GNU History Programmer's Manual.
+* Concept Index:: Index of concepts described in this manual.
+* Function and Variable Index:: Index of externally visible functions
+ and variables.
+@end menu
+@end ifinfo
+
+@include hsuser.texinfo
+@include hstech.texinfo
+
+@node Concept Index
+@appendix Concept Index
+@printindex cp
+
+@node Function and Variable Index
+@appendix Function and Variable Index
+@printindex vr
+@contents
+
+@bye
diff --git a/gnu/lib/libreadline/doc/hstech.texinfo b/gnu/lib/libreadline/doc/hstech.texinfo
new file mode 100644
index 000000000000..b5cbc2a92f25
--- /dev/null
+++ b/gnu/lib/libreadline/doc/hstech.texinfo
@@ -0,0 +1,308 @@
+@ignore
+This file documents the user interface to the GNU History library.
+
+Copyright (C) 1988, 1991 Free Software Foundation, Inc.
+Authored by Brian Fox.
+
+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 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).
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided also that the
+GNU Copyright statement is available to the distributee, and 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.
+@end ignore
+
+@node Programming with GNU History
+@chapter Programming with GNU History
+
+This chapter describes how to interface the GNU History Library with
+programs that you write. It should be considered a technical guide.
+For information on the interactive use of GNU History, @pxref{Using
+History Interactively}.
+
+@menu
+* Introduction to History:: What is the GNU History library for?
+* History Storage:: How information is stored.
+* History Functions:: Functions that you can use.
+* History Variables:: Variables that control behaviour.
+* History Programming Example:: Example of using the GNU History Library.
+@end menu
+
+@node Introduction to History
+@section Introduction to History
+
+Many programs read input from the user a line at a time. The GNU history
+library is able to keep track of those lines, associate arbitrary data with
+each line, and utilize information from previous lines in making up new
+ones.
+
+The programmer using the History library has available to him functions
+for remembering lines on a history stack, associating arbitrary data
+with a line, removing lines from the stack, searching through the stack
+for a line containing an arbitrary text string, and referencing any line
+on the stack directly. In addition, a history @dfn{expansion} function
+is available which provides for a consistent user interface across many
+different programs.
+
+The end-user using programs written with the History library has the
+benifit of a consistent user interface, with a set of well-known
+commands for manipulating the text of previous lines and using that text
+in new commands. The basic history manipulation commands are similar to
+the history substitution used by @code{Csh}.
+
+If the programmer desires, he can use the Readline library, which
+includes some history manipulation by default, and has the added
+advantage of Emacs style command line editing.
+
+@node History Storage
+@section History Storage
+
+@example
+typedef struct _hist_entry @{
+ char *line;
+ char *data;
+@} HIST_ENTRY;
+@end example
+
+@node History Functions
+@section History Functions
+
+This section describes the calling sequence for the various functions
+present in GNU History.
+
+@defun {void using_history} ()
+Begin a session in which the history functions might be used. This
+just initializes the interactive variables.
+@end defun
+
+@defun {void add_history} (char *string)
+Place @var{string} at the end of the history list. The associated data
+field (if any) is set to @code{NULL}.
+@end defun
+
+@defun {int where_history} ()
+Returns the number which says what history element we are now looking
+at.
+@end defun
+
+@defun {int history_set_pos} (int pos)
+Set the position in the history list to @var{pos}.
+@end defun
+
+@defun {int history_search_pos} (char *string, int direction, int pos)
+Search for @var{string} in the history list, starting at @var{pos}, an
+absolute index into the list. @var{direction}, if negative, says to search
+backwards from @var{pos}, else forwards. Returns the absolute index of
+the history element where @var{string} was found, or -1 otherwise.
+@end defun
+
+@defun {HIST_ENTRY *remove_history} ();
+Remove history element @var{which} from the history. The removed
+element is returned to you so you can free the line, data,
+and containing structure.
+@end defun
+
+@defun {void stifle_history} (int max)
+Stifle the history list, remembering only @var{max} number of entries.
+@end defun
+
+@defun {int unstifle_history} ();
+Stop stifling the history. This returns the previous amount the
+history was stifled by. The value is positive if the history was
+stifled, negative if it wasn't.
+@end defun
+
+@defun {int read_history} (char *filename)
+Add the contents of @var{filename} to the history list, a line at a
+time. If @var{filename} is @code{NULL}, then read from
+@file{~/.history}. Returns 0 if successful, or errno if not.
+@end defun
+
+@defun {int read_history_range} (char *filename, int from, int to)
+Read a range of lines from @var{filename}, adding them to the history list.
+Start reading at the @var{from}'th line and end at the @var{to}'th. If
+@var{from} is zero, start at the beginning. If @var{to} is less than
+@var{from}, then read until the end of the file. If @var{filename} is
+@code{NULL}, then read from @file{~/.history}. Returns 0 if successful,
+or @code{errno} if not.
+@end defun
+
+@defun {int write_history} (char *filename)
+Append the current history to @var{filename}. If @var{filename} is
+@code{NULL}, then append the history list to @file{~/.history}. Values
+returned are as in @code{read_history ()}.
+@end defun
+
+@defun {int append_history} (int nelements, char *filename)
+Append @var{nelement} entries to @var{filename}. The entries appended
+are from the end of the list minus @var{nelements} up to the end of the
+list.
+@end defun
+
+@defun {HIST_ENTRY *replace_history_entry} ()
+Make the history entry at @var{which} have @var{line} and @var{data}.
+This returns the old entry so you can dispose of the data. In the case
+of an invalid @var{which}, a @code{NULL} pointer is returned.
+@end defun
+
+@defun {HIST_ENTRY *current_history} ()
+Return the history entry at the current position, as determined by
+@code{history_offset}. If there is no entry there, return a @code{NULL}
+pointer.
+@end defun
+
+@defun {HIST_ENTRY *previous_history} ()
+Back up @var{history_offset} to the previous history entry, and return a
+pointer to that entry. If there is no previous entry, return a
+@code{NULL} pointer.
+@end defun
+
+@defun {HIST_ENTRY *next_history} ()
+Move @code{history_offset} forward to the next history entry, and return
+the a pointer to that entry. If there is no next entry, return a
+@code{NULL} pointer.
+@end defun
+
+@defun {HIST_ENTRY **history_list} ()
+Return a @code{NULL} terminated array of @code{HIST_ENTRY} which is the
+current input history. Element 0 of this list is the beginning of time.
+If there is no history, return @code{NULL}.
+@end defun
+
+@defun {int history_search} (char *string, int direction)
+Search the history for @var{string}, starting at @code{history_offset}.
+If @var{direction} < 0, then the search is through previous entries,
+else through subsequent. If @var{string} is found, then
+@code{current_history ()} is the history entry, and the value of this
+function is the offset in the line of that history entry that the
+@var{string} was found in. Otherwise, nothing is changed, and a -1 is
+returned.
+@end defun
+
+@defun {int history_expand} (char *string, char **output)
+Expand @var{string}, placing the result into @var{output}, a pointer
+to a string. Returns:
+@table @code
+@item 0
+If no expansions took place (or, if the only change in
+the text was the de-slashifying of the history expansion
+character),
+@item 1
+if expansions did take place, or
+@item -1
+if there was an error in expansion.
+@end table
+
+If an error ocurred in expansion, then @var{output} contains a descriptive
+error message.
+@end defun
+
+@defun {char *history_arg_extract} (int first, int last, char *string)
+Extract a string segment consisting of the @var{first} through @var{last}
+arguments present in @var{string}. Arguments are broken up as in
+the GNU Bash shell.
+@end defun
+
+@defun {int history_total_bytes} ();
+Return the number of bytes that the primary history entries are using.
+This just adds up the lengths of @code{the_history->lines}.
+@end defun
+
+@node History Variables
+@section History Variables
+
+This section describes the variables in GNU History that are externally
+visible.
+
+@defvar {int history_base}
+For convenience only. You set this when interpreting history commands.
+It is the logical offset of the first history element.
+@end defvar
+
+@node History Programming Example
+@section History Programming Example
+
+The following snippet of code demonstrates simple use of the GNU History
+Library.
+
+@smallexample
+main ()
+@{
+ char line[1024], *t;
+ int done = 0;
+
+ line[0] = 0;
+
+ while (!done)
+ @{
+ fprintf (stdout, "history%% ");
+ t = gets (line);
+
+ if (!t)
+ strcpy (line, "quit");
+
+ if (line[0])
+ @{
+ char *expansion;
+ int result;
+
+ using_history ();
+
+ result = history_expand (line, &expansion);
+ strcpy (line, expansion);
+ free (expansion);
+ if (result)
+ fprintf (stderr, "%s\n", line);
+
+ if (result < 0)
+ continue;
+
+ add_history (line);
+ @}
+
+ if (strcmp (line, "quit") == 0) done = 1;
+ if (strcmp (line, "save") == 0) write_history (0);
+ if (strcmp (line, "read") == 0) read_history (0);
+ if (strcmp (line, "list") == 0)
+ @{
+ register HIST_ENTRY **the_list = history_list ();
+ register int i;
+
+ if (the_list)
+ for (i = 0; the_list[i]; i++)
+ fprintf (stdout, "%d: %s\n",
+ i + history_base, the_list[i]->line);
+ @}
+ if (strncmp (line, "delete", strlen ("delete")) == 0)
+ @{
+ int which;
+ if ((sscanf (line + strlen ("delete"), "%d", &which)) == 1)
+ @{
+ HIST_ENTRY *entry = remove_history (which);
+ if (!entry)
+ fprintf (stderr, "No such entry %d\n", which);
+ else
+ @{
+ free (entry->line);
+ free (entry);
+ @}
+ @}
+ else
+ @{
+ fprintf (stderr, "non-numeric arg given to `delete'\n");
+ @}
+ @}
+ @}
+@}
+@end smallexample
diff --git a/gnu/lib/libreadline/doc/hsuser.texinfo b/gnu/lib/libreadline/doc/hsuser.texinfo
new file mode 100644
index 000000000000..44f7fa093203
--- /dev/null
+++ b/gnu/lib/libreadline/doc/hsuser.texinfo
@@ -0,0 +1,197 @@
+@ignore
+This file documents the user interface to the GNU History library.
+
+Copyright (C) 1988, 1991 Free Software Foundation, Inc.
+Authored by Brian Fox and Chet Ramey.
+
+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 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).
+
+Permission is granted to copy and distribute modified versions of this
+manual under the conditions for verbatim copying, provided also that the
+GNU Copyright statement is available to the distributee, and 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.
+@end ignore
+
+@node Using History Interactively
+@chapter Using History Interactively
+
+@ifset BashFeatures
+This chapter describes how to use the GNU History Library interactively,
+from a user's standpoint. It should be considered a user's guide. For
+information on using the GNU History Library in your own programs,
+see the GNU Readline Library Manual.
+@end ifset
+@ifclear BashFeatures
+This chapter describes how to use the GNU History Library interactively,
+from a user's standpoint. It should be considered a user's guide. For
+information on using the GNU History Library in your own programs,
+@pxref{Programming with GNU History}.
+@end ifclear
+
+@menu
+* History Interaction:: What it feels like using History as a user.
+@end menu
+
+@node History Interaction
+@section History Interaction
+@cindex expansion
+
+The History library provides a history expansion feature that is similar
+to the history expansion in @code{csh}. The following text describes
+the syntax used to manipulate the history information.
+
+History expansion takes place in two parts. The first is to determine
+which line from the previous history should be used during substitution.
+The second is to select portions of that line for inclusion into the
+current one. The line selected from the previous history is called the
+@dfn{event}, and the portions of that line that are acted upon are
+called @dfn{words}. The line is broken into words in the same fashion
+that Bash does, so that several English (or Unix) words
+surrounded by quotes are considered as one word.
+
+@menu
+* Event Designators:: How to specify which history line to use.
+* Word Designators:: Specifying which words are of interest.
+* Modifiers:: Modifying the results of substitution.
+@end menu
+
+@node Event Designators
+@subsection Event Designators
+@cindex event designators
+
+An event designator is a reference to a command line entry in the
+history list.
+
+@table @asis
+
+@item @code{!}
+Start a history substitution, except when followed by a space, tab,
+the end of the line, @key{=} or @key{(}.
+
+@item @code{!!}
+Refer to the previous command. This is a synonym for @code{!-1}.
+
+@item @code{!n}
+Refer to command line @var{n}.
+
+@item @code{!-n}
+Refer to the command line @var{n} lines back.
+
+@item @code{!string}
+Refer to the most recent command starting with @var{string}.
+
+@item @code{!?string}[@code{?}]
+Refer to the most recent command containing @var{string}.
+
+@item @code{!#}
+The entire command line typed so far.
+
+@item @code{^string1^string2^}
+Quick Substitution. Repeat the last command, replacing @var{string1}
+with @var{string2}. Equivalent to
+@code{!!:s/string1/string2/}.
+
+@end table
+
+@node Word Designators
+@subsection Word Designators
+
+A @key{:} separates the event specification from the word designator. It
+can be omitted if the word designator begins with a @key{^}, @key{$},
+@key{*} or @key{%}. Words are numbered from the beginning of the line,
+with the first word being denoted by a 0 (zero).
+
+@table @code
+
+@item 0 (zero)
+The @code{0}th word. For many applications, this is the command word.
+
+@item n
+The @var{n}th word.
+
+@item ^
+The first argument; that is, word 1.
+
+@item $
+The last argument.
+
+@item %
+The word matched by the most recent @code{?string?} search.
+
+@item x-y
+A range of words; @code{-@var{y}} abbreviates @code{0-@var{y}}.
+
+@item *
+All of the words, except the @code{0}th. This is a synonym for @code{1-$}.
+It is not an error to use @key{*} if there is just one word in the event;
+the empty string is returned in that case.
+
+@item x*
+Abbreviates @code{x-$}
+
+@item x-
+Abbreviates @code{x-$} like @code{x*}, but omits the last word.
+
+@end table
+
+@node Modifiers
+@subsection Modifiers
+
+After the optional word designator, you can add a sequence of one or more
+of the following modifiers, each preceded by a @key{:}.
+
+@table @code
+
+@item h
+Remove a trailing pathname component, leaving only the head.
+
+@item r
+Remove a trailing suffix of the form @samp{.}@var{suffix}, leaving the basename.
+
+@item e
+Remove all but the trailing suffix.
+
+@item t
+Remove all leading pathname components, leaving the tail.
+
+@item p
+Print the new command but do not execute it.
+
+@ifset BashFeatures
+@item q
+Quote the substituted words, escaping further substitutions.
+
+@item x
+Quote the substituted words as with @code{q},
+but break into words at spaces, tabs, and newlines.
+@end ifset
+
+@item s/old/new/
+Substitute @var{new} for the first occurrence of @var{old} in the
+event line. Any delimiter may be used in place of @key{/}.
+The delimiter may be quoted in @var{old} and @var{new}
+with a single backslash. If @key{&} appears in @var{new},
+it is replaced by @var{old}. A single backslash will quote
+the @key{&}. The final delimiter is optional if it is the last
+character on the input line.
+
+@item &
+Repeat the previous substitution.
+
+@item g
+Cause changes to be applied over the entire event line. Used in
+conjunction with @code{s}, as in @code{gs/old/new/}, or with
+@code{&}.
+
+@end table
diff --git a/gnu/lib/libreadline/doc/rlman.texinfo b/gnu/lib/libreadline/doc/rlman.texinfo
new file mode 100644
index 000000000000..f2e7fb6db919
--- /dev/null
+++ b/gnu/lib/libreadline/doc/rlman.texinfo
@@ -0,0 +1,103 @@
+\input texinfo @c -*-texinfo-*-
+@comment %**start of header (This is for running Texinfo on a region.)
+@setfilename readline.info
+@settitle GNU Readline Library
+@comment %**end of header (This is for running Texinfo on a region.)
+@synindex vr fn
+@setchapternewpage odd
+
+@ifinfo
+This document describes the GNU Readline Library, a utility which aids
+in the consistency of user interface across discrete programs that need
+to provide a command line interface.
+
+Copyright (C) 1988, 1991 Free Software Foundation, Inc.
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+pare preserved on all copies.
+
+@ignore
+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).
+@end 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.
+@end ifinfo
+
+@titlepage
+@sp 10
+@center @titlefont{GNU Readline Library}
+@center Brian Fox
+@center Free Software Foundation
+@center Version 1.1
+@center April 1991
+
+@page
+This document describes the GNU Readline Library, a utility which aids
+in the consistency of user interface across discrete programs that need
+to provide a command line interface.
+
+Published by the Free Software Foundation @*
+675 Massachusetts Avenue, @*
+Cambridge, MA 02139 USA
+
+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.
+
+@vskip 0pt plus 1filll
+Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc.
+@end titlepage
+
+@ifinfo
+@node Top
+@top GNU Readline Library
+
+This document describes the GNU Readline Library, a utility which aids
+in the consistency of user interface across discrete programs that need
+to provide a command line interface.
+
+@menu
+* Command Line Editing:: GNU Readline User's Manual.
+* Programming with GNU Readline:: GNU Readline Programmer's Manual.
+* Concept Index:: Index of concepts described in this manual.
+* Function and Variable Index:: Index of externally visible functions
+ and variables.
+@end menu
+@end ifinfo
+
+@include rluser.texinfo
+@include rltech.texinfo
+
+@node Concept Index
+@unnumbered Concept Index
+@printindex cp
+
+@node Function and Variable Index
+@unnumbered Function and Variable Index
+@printindex fn
+
+@contents
+@bye
+
diff --git a/gnu/lib/libreadline/doc/rltech.texinfo b/gnu/lib/libreadline/doc/rltech.texinfo
new file mode 100644
index 000000000000..2048b7c29dfb
--- /dev/null
+++ b/gnu/lib/libreadline/doc/rltech.texinfo
@@ -0,0 +1,1012 @@
+@comment %**start of header (This is for running Texinfo on a region.)
+@setfilename rltech.info
+@comment %**end of header (This is for running Texinfo on a region.)
+@setchapternewpage odd
+
+@ifinfo
+This document describes the GNU Readline Library, a utility for aiding
+in the consitency of user interface across discrete programs that need
+to provide a command line interface.
+
+Copyright (C) 1988 Free Software Foundation, Inc.
+
+Permission is granted to make and distribute verbatim copies of
+this manual provided the copyright notice and this permission notice
+pare preserved on all copies.
+
+@ignore
+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).
+@end 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.
+@end ifinfo
+
+@node Programming with GNU Readline
+@chapter Programming with GNU Readline
+
+This manual describes the interface between the GNU Readline Library and
+user programs. If you are a programmer, and you wish to include the
+features found in GNU Readline in your own programs, such as completion,
+line editing, and interactive history manipulation, this documentation
+is for you.
+
+@menu
+* Default Behaviour:: Using the default behaviour of Readline.
+* Custom Functions:: Adding your own functions to Readline.
+* Custom Completers:: Supplanting or supplementing Readline's
+ completion functions.
+@end menu
+
+@node Default Behaviour
+@section Default Behaviour
+
+Many programs provide a command line interface, such as @code{mail},
+@code{ftp}, and @code{sh}. For such programs, the default behaviour of
+Readline is sufficient. This section describes how to use Readline in
+the simplest way possible, perhaps to replace calls in your code to
+@code{gets ()}.
+
+@findex readline ()
+@cindex readline, function
+The function @code{readline} prints a prompt and then reads and returns
+a single line of text from the user. The line which @code{readline ()}
+returns is allocated with @code{malloc ()}; you should @code{free ()}
+the line when you are done with it. The declaration for @code{readline}
+in ANSI C is
+
+@example
+@code{char *readline (char *@var{prompt});}
+@end example
+
+So, one might say
+@example
+@code{char *line = readline ("Enter a line: ");}
+@end example
+in order to read a line of text from the user.
+
+The line which is returned has the final newline removed, so only the
+text of the line remains.
+
+If readline encounters an @code{EOF} while reading the line, and the
+line is empty at that point, then @code{(char *)NULL} is returned.
+Otherwise, the line is ended just as if a newline was typed.
+
+If you want the user to be able to get at the line later, (with
+@key{C-p} for example), you must call @code{add_history ()} to save the
+line away in a @dfn{history} list of such lines.
+
+@example
+@code{add_history (line)};
+@end example
+
+For full details on the GNU History Library, see the associated manual.
+
+It is polite to avoid saving empty lines on the history list, since it
+is rare than someone has a burning need to reuse a blank line. Here is
+a function which usefully replaces the standard @code{gets ()} library
+function:
+
+@example
+/* A static variable for holding the line. */
+static char *line_read = (char *)NULL;
+
+/* Read a string, and return a pointer to it. Returns NULL on EOF. */
+char *
+do_gets ()
+@{
+ /* If the buffer has already been allocated, return the memory
+ to the free pool. */
+ if (line_read != (char *)NULL)
+ @{
+ free (line_read);
+ line_read = (char *)NULL;
+ @}
+
+ /* Get a line from the user. */
+ line_read = readline ("");
+
+ /* If the line has any text in it, save it on the history. */
+ if (line_read && *line_read)
+ add_history (line_read);
+
+ return (line_read);
+@}
+@end example
+
+The above code gives the user the default behaviour of @key{TAB}
+completion: completion on file names. If you do not want readline to
+complete on filenames, you can change the binding of the @key{TAB} key
+with @code{rl_bind_key ()}.
+
+@findex rl_bind_key ()
+@example
+@code{int rl_bind_key (int @var{key}, int (*@var{function})());}
+@end example
+
+@code{rl_bind_key ()} takes 2 arguments; @var{key} is the character that
+you want to bind, and @var{function} is the address of the function to
+run when @var{key} is pressed. Binding @key{TAB} to @code{rl_insert ()}
+makes @key{TAB} just insert itself.
+
+@code{rl_bind_key ()} returns non-zero if @var{key} is not a valid
+ASCII character code (between 0 and 255).
+
+@example
+@code{rl_bind_key ('\t', rl_insert);}
+@end example
+
+This code should be executed once at the start of your program; you
+might write a function called @code{initialize_readline ()} which
+performs this and other desired initializations, such as installing
+custom completers, etc.
+
+@node Custom Functions
+@section Custom Functions
+
+Readline provides a great many functions for manipulating the text of
+the line. But it isn't possible to anticipate the needs of all
+programs. This section describes the various functions and variables
+defined in within the Readline library which allow a user program to add
+customized functionality to Readline.
+
+@menu
+* The Function Type:: C declarations to make code readable.
+* Function Naming:: How to give a function you write a name.
+* Keymaps:: Making keymaps.
+* Binding Keys:: Changing Keymaps.
+* Function Writing:: Variables and calling conventions.
+* Allowing Undoing:: How to make your functions undoable.
+@end menu
+
+@node The Function Type
+@subsection The Function Type
+
+For the sake of readabilty, we declare a new type of object, called
+@dfn{Function}. A @code{Function} is a C language function which
+returns an @code{int}. The type declaration for @code{Function} is:
+
+@noindent
+@code{typedef int Function ();}
+
+The reason for declaring this new type is to make it easier to write
+code describing pointers to C functions. Let us say we had a variable
+called @var{func} which was a pointer to a function. Instead of the
+classic C declaration
+
+@code{int (*)()func;}
+
+we have
+
+@code{Function *func;}
+
+@node Function Naming
+@subsection Naming a Function
+
+The user can dynamically change the bindings of keys while using
+Readline. This is done by representing the function with a descriptive
+name. The user is able to type the descriptive name when referring to
+the function. Thus, in an init file, one might find
+
+@example
+Meta-Rubout: backward-kill-word
+@end example
+
+This binds the keystroke @key{Meta-Rubout} to the function
+@emph{descriptively} named @code{backward-kill-word}. You, as the
+programmer, should bind the functions you write to descriptive names as
+well. Readline provides a function for doing that:
+
+@defun rl_add_defun (char *name, Function *function, int key)
+Add @var{name} to the list of named functions. Make @var{function} be
+the function that gets called. If @var{key} is not -1, then bind it to
+@var{function} using @code{rl_bind_key ()}.
+@end defun
+
+Using this function alone is sufficient for most applications. It is
+the recommended way to add a few functions to the default functions that
+Readline has built in already. If you need to do more or different
+things than adding a function to Readline, you may need to use the
+underlying functions described below.
+
+@node Keymaps
+@subsection Selecting a Keymap
+
+Key bindings take place on a @dfn{keymap}. The keymap is the
+association between the keys that the user types and the functions that
+get run. You can make your own keymaps, copy existing keymaps, and tell
+Readline which keymap to use.
+
+@defun {Keymap rl_make_bare_keymap} ()
+Returns a new, empty keymap. The space for the keymap is allocated with
+@code{malloc ()}; you should @code{free ()} it when you are done.
+@end defun
+
+@defun {Keymap rl_copy_keymap} (Keymap map)
+Return a new keymap which is a copy of @var{map}.
+@end defun
+
+@defun {Keymap rl_make_keymap} ()
+Return a new keymap with the printing characters bound to rl_insert,
+the lowercase Meta characters bound to run their equivalents, and
+the Meta digits bound to produce numeric arguments.
+@end defun
+
+@node Binding Keys
+@subsection Binding Keys
+
+You associate keys with functions through the keymap. Here are
+functions for doing that.
+
+@defun {int rl_bind_key} (int key, Function *function)
+Binds @var{key} to @var{function} in the currently selected keymap.
+Returns non-zero in the case of an invalid @var{key}.
+@end defun
+
+@defun {int rl_bind_key_in_map} (int key, Function *function, Keymap map)
+Bind @var{key} to @var{function} in @var{map}. Returns non-zero in the case
+of an invalid @var{key}.
+@end defun
+
+@defun {int rl_unbind_key} (int key)
+Make @var{key} do nothing in the currently selected keymap.
+Returns non-zero in case of error.
+@end defun
+
+@defun {int rl_unbind_key_in_map} (int key, Keymap map)
+Make @var{key} be bound to the null function in @var{map}.
+Returns non-zero in case of error.
+@end defun
+
+@defun rl_generic_bind (int type, char *keyseq, char *data, Keymap map)
+Bind the key sequence represented by the string @var{keyseq} to the arbitrary
+pointer @var{data}. @var{type} says what kind of data is pointed to by
+@var{data}; right now this can be a function (@code{ISFUNC}), a macro
+(@code{ISMACR}), or a keymap (@code{ISKMAP}). This makes new keymaps as
+necessary. The initial place to do bindings is in @var{map}.
+@end defun
+
+@node Function Writing
+@subsection Writing a New Function
+
+In order to write new functions for Readline, you need to know the
+calling conventions for keyboard invoked functions, and the names of the
+variables that describe the current state of the line gathered so far.
+
+@defvar {char *rl_line_buffer}
+This is the line gathered so far. You are welcome to modify the
+contents of this, but see Undoing, below.
+@end defvar
+
+@defvar {int rl_point}
+The offset of the current cursor position in @var{rl_line_buffer}.
+@end defvar
+
+@defvar {int rl_end}
+The number of characters present in @code{rl_line_buffer}. When
+@code{rl_point} is at the end of the line, then @code{rl_point} and
+@code{rl_end} are equal.
+@end defvar
+
+The calling sequence for a command @code{foo} looks like
+
+@example
+@code{foo (int count, int key)}
+@end example
+
+where @var{count} is the numeric argument (or 1 if defaulted) and
+@var{key} is the key that invoked this function.
+
+It is completely up to the function as to what should be done with the
+numeric argument; some functions use it as a repeat count, other
+functions as a flag, and some choose to ignore it. In general, if a
+function uses the numeric argument as a repeat count, it should be able
+to do something useful with a negative argument as well as a positive
+argument. At the very least, it should be aware that it can be passed a
+negative argument.
+
+@node Allowing Undoing
+@subsection Allowing Undoing
+
+Supporting the undo command is a painless thing to do, and makes your
+functions much more useful to the end user. It is certainly easy to try
+something if you know you can undo it. I could use an undo function for
+the stock market.
+
+If your function simply inserts text once, or deletes text once, and it
+calls @code{rl_insert_text ()} or @code{rl_delete_text ()} to do it, then
+undoing is already done for you automatically, and you can safely skip
+this section.
+
+If you do multiple insertions or multiple deletions, or any combination
+of these operations, you should group them together into one operation.
+This can be done with @code{rl_begin_undo_group ()} and
+@code{rl_end_undo_group ()}.
+
+@defun rl_begin_undo_group ()
+Begins saving undo information in a group construct. The undo
+information usually comes from calls to @code{rl_insert_text ()} and
+@code{rl_delete_text ()}, but they could be direct calls to
+@code{rl_add_undo ()}.
+@end defun
+
+@defun rl_end_undo_group ()
+Closes the current undo group started with @code{rl_begin_undo_group
+()}. There should be exactly one call to @code{rl_end_undo_group ()}
+for every call to @code{rl_begin_undo_group ()}.
+@end defun
+
+Finally, if you neither insert nor delete text, but directly modify the
+existing text (e.g. change its case), you call @code{rl_modifying ()}
+once, just before you modify the text. You must supply the indices of
+the text range that you are going to modify.
+
+@defun rl_modifying (int start, int end)
+Tell Readline to save the text between @var{start} and @var{end} as a
+single undo unit. It is assumed that subsequent to this call you will
+modify that range of text in some way.
+@end defun
+
+@subsection An Example
+
+Here is a function which changes lowercase characters to the uppercase
+equivalents, and uppercase characters to the lowercase equivalents. If
+this function was bound to @samp{M-c}, then typing @samp{M-c} would
+change the case of the character under point. Typing @samp{10 M-c}
+would change the case of the following 10 characters, leaving the cursor on
+the last character changed.
+
+@example
+/* Invert the case of the COUNT following characters. */
+invert_case_line (count, key)
+ int count, key;
+@{
+ register int start, end;
+
+ start = rl_point;
+
+ if (count < 0)
+ @{
+ direction = -1;
+ count = -count;
+ @}
+ else
+ direction = 1;
+
+ /* Find the end of the range to modify. */
+ end = start + (count * direction);
+
+ /* Force it to be within range. */
+ if (end > rl_end)
+ end = rl_end;
+ else if (end < 0)
+ end = -1;
+
+ if (start > end)
+ @{
+ int temp = start;
+ start = end;
+ end = temp;
+ @}
+
+ if (start == end)
+ return;
+
+ /* Tell readline that we are modifying the line, so save the undo
+ information. */
+ rl_modifying (start, end);
+
+ for (; start != end; start += direction)
+ @{
+ if (uppercase_p (rl_line_buffer[start]))
+ rl_line_buffer[start] = to_lower (rl_line_buffer[start]);
+ else if (lowercase_p (rl_line_buffer[start]))
+ rl_line_buffer[start] = to_upper (rl_line_buffer[start]);
+ @}
+ /* Move point to on top of the last character changed. */
+ rl_point = end - direction;
+@}
+@end example
+
+@node Custom Completers
+@section Custom Completers
+
+Typically, a program that reads commands from the user has a way of
+disambiguating commands and data. If your program is one of these, then
+it can provide completion for either commands, or data, or both commands
+and data. The following sections describe how your program and Readline
+cooperate to provide this service to end users.
+
+@menu
+* How Completing Works:: The logic used to do completion.
+* Completion Functions:: Functions provided by Readline.
+* Completion Variables:: Variables which control completion.
+* A Short Completion Example:: An example of writing completer subroutines.
+@end menu
+
+@node How Completing Works
+@subsection How Completing Works
+
+In order to complete some text, the full list of possible completions
+must be available. That is to say, it is not possible to accurately
+expand a partial word without knowing what all of the possible words
+that make sense in that context are. The GNU Readline library provides
+the user interface to completion, and additionally, two of the most common
+completion functions; filename and username. For completing other types
+of text, you must write your own completion function. This section
+describes exactly what those functions must do, and provides an example
+function.
+
+There are three major functions used to perform completion:
+
+@enumerate
+@item
+The user-interface function @code{rl_complete ()}. This function is
+called interactively with the same calling conventions as other
+functions in readline intended for interactive use; i.e. @var{count},
+and @var{invoking-key}. It isolates the word to be completed and calls
+@code{completion_matches ()} to generate a list of possible completions.
+It then either lists the possible completions or actually performs the
+completion, depending on which behaviour is desired.
+
+@item
+The internal function @code{completion_matches ()} uses your
+@dfn{generator} function to generate the list of possible matches, and
+then returns the array of these matches. You should place the address
+of your generator function in @code{rl_completion_entry_function}.
+
+@item
+The generator function is called repeatedly from
+@code{completion_matches ()}, returning a string each time. The
+arguments to the generator function are @var{text} and @var{state}.
+@var{text} is the partial word to be completed. @var{state} is zero the
+first time the function is called, and a positive non-zero integer for
+each subsequent call. When the generator function returns @code{(char
+*)NULL} this signals @code{completion_matches ()} that there are no more
+possibilities left.
+
+@end enumerate
+
+@defun rl_complete (int ignore, int invoking_key)
+Complete the word at or before point. You have supplied the function
+that does the initial simple matching selection algorithm (see
+@code{completion_matches ()}). The default is to do filename completion.
+@end defun
+
+Note that @code{rl_complete ()} has the identical calling conventions as
+any other key-invokable function; this is because by default it is bound
+to the @samp{TAB} key.
+
+@defvar {Function *rl_completion_entry_function}
+This is a pointer to the generator function for @code{completion_matches
+()}. If the value of @code{rl_completion_entry_function} is
+@code{(Function *)NULL} then the default filename generator function is
+used, namely @code{filename_entry_function ()}.
+@end defvar
+
+@node Completion Functions
+@subsection Completion Functions
+
+Here is the complete list of callable completion functions present in
+Readline.
+
+@defun rl_complete_internal (int what_to_do)
+Complete the word at or before point. @var{what_to_do} says what to do
+with the completion. A value of @samp{?} means list the possible
+completions. @samp{TAB} means do standard completion. @samp{*} means
+insert all of the possible completions.
+@end defun
+
+@defun rl_complete (int ignore, int invoking_key)
+Complete the word at or before point. You have supplied the function
+that does the initial simple matching selection algorithm (see
+@code{completion_matches ()}). The default is to do filename
+completion. This just calls @code{rl_complete_internal ()} with an
+argument of @samp{TAB}.
+@end defun
+
+@defun rl_possible_completions ()
+List the possible completions. See description of @code{rl_complete
+()}. This just calls @code{rl_complete_internal ()} with an argument of
+@samp{?}.
+@end defun
+
+@defun {char **completion_matches} (char *text, char *(*entry_function) ())
+Returns an array of @code{(char *)} which is a list of completions for
+@var{text}. If there are no completions, returns @code{(char **)NULL}.
+The first entry in the returned array is the substitution for @var{text}.
+The remaining entries are the possible completions. The array is
+terminated with a @code{NULL} pointer.
+
+@var{entry_function} is a function of two args, and returns a
+@code{(char *)}. The first argument is @var{text}. The second is a
+state argument; it is zero on the first call, and non-zero on subsequent
+calls. It returns a @code{NULL} pointer to the caller when there are
+no more matches.
+@end defun
+
+@defun {char *filename_completion_function} (char *text, int state)
+A generator function for filename completion in the general case. Note
+that completion in the Bash shell is a little different because of all
+the pathnames that must be followed when looking up the completion for a
+command.
+@end defun
+
+@defun {char *username_completion_function} (char *text, int state)
+A completion generator for usernames. @var{text} contains a partial
+username preceded by a random character (usually @samp{~}).
+@end defun
+
+@node Completion Variables
+@subsection Completion Variables
+
+@defvar {Function *rl_completion_entry_function}
+A pointer to the generator function for @code{completion_matches ()}.
+@code{NULL} means to use @code{filename_entry_function ()}, the default
+filename completer.
+@end defvar
+
+@defvar {Function *rl_attempted_completion_function}
+A pointer to an alternative function to create matches.
+The function is called with @var{text}, @var{start}, and @var{end}.
+@var{start} and @var{end} are indices in @code{rl_line_buffer} saying
+what the boundaries of @var{text} are. If this function exists and
+returns @code{NULL} then @code{rl_complete ()} will call the value of
+@code{rl_completion_entry_function} to generate matches, otherwise the
+array of strings returned will be used.
+@end defvar
+
+@defvar {int rl_completion_query_items}
+Up to this many items will be displayed in response to a
+possible-completions call. After that, we ask the user if she is sure
+she wants to see them all. The default value is 100.
+@end defvar
+
+@defvar {char *rl_basic_word_break_characters}
+The basic list of characters that signal a break between words for the
+completer routine. The contents of this variable is what breaks words
+in the Bash shell, i.e. " \t\n\"\\'`@@$><=;|&@{(".
+@end defvar
+
+@defvar {char *rl_completer_word_break_characters}
+The list of characters that signal a break between words for
+@code{rl_complete_internal ()}. The default list is the contents of
+@code{rl_basic_word_break_characters}.
+@end defvar
+
+@defvar {char *rl_special_prefixes}
+The list of characters that are word break characters, but should be
+left in @var{text} when it is passed to the completion function.
+Programs can use this to help determine what kind of completing to do.
+@end defvar
+
+@defvar {int rl_ignore_completion_duplicates}
+If non-zero, then disallow duplicates in the matches. Default is 1.
+@end defvar
+
+@defvar {int rl_filename_completion_desired}
+Non-zero means that the results of the matches are to be treated as
+filenames. This is @emph{always} zero on entry, and can only be changed
+within a completion entry generator function.
+@end defvar
+
+@defvar {Function *rl_ignore_some_completions_function}
+This function, if defined, is called by the completer when real filename
+completion is done, after all the matching names have been generated.
+It is passed a @code{NULL} terminated array of @code{(char *)} known as
+@var{matches} in the code. The 1st element (@code{matches[0]}) is the
+maximal substring that is common to all matches. This function can
+re-arrange the list of matches as required, but each deleted element of
+the array must be @code{free()}'d.
+@end defvar
+
+@node A Short Completion Example
+@subsection A Short Completion Example
+
+Here is a small application demonstrating the use of the GNU Readline
+library. It is called @code{fileman}, and the source code resides in
+@file{readline/examples/fileman.c}. This sample application provides
+completion of command names, line editing features, and access to the
+history list.
+
+@page
+@smallexample
+/* fileman.c -- A tiny application which demonstrates how to use the
+ GNU Readline library. This application interactively allows users
+ to manipulate files and their modes. */
+
+#include <stdio.h>
+#include <readline/readline.h>
+#include <readline/history.h>
+#include <sys/types.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <sys/errno.h>
+
+/* The names of functions that actually do the manipulation. */
+int com_list (), com_view (), com_rename (), com_stat (), com_pwd ();
+int com_delete (), com_help (), com_cd (), com_quit ();
+
+/* A structure which contains information on the commands this program
+ can understand. */
+
+typedef struct @{
+ char *name; /* User printable name of the function. */
+ Function *func; /* Function to call to do the job. */
+ char *doc; /* Documentation for this function. */
+@} COMMAND;
+
+COMMAND commands[] = @{
+ @{ "cd", com_cd, "Change to directory DIR" @},
+ @{ "delete", com_delete, "Delete FILE" @},
+ @{ "help", com_help, "Display this text" @},
+ @{ "?", com_help, "Synonym for `help'" @},
+ @{ "list", com_list, "List files in DIR" @},
+ @{ "ls", com_list, "Synonym for `list'" @},
+ @{ "pwd", com_pwd, "Print the current working directory" @},
+ @{ "quit", com_quit, "Quit using Fileman" @},
+ @{ "rename", com_rename, "Rename FILE to NEWNAME" @},
+ @{ "stat", com_stat, "Print out statistics on FILE" @},
+ @{ "view", com_view, "View the contents of FILE" @},
+ @{ (char *)NULL, (Function *)NULL, (char *)NULL @}
+@};
+
+/* The name of this program, as taken from argv[0]. */
+char *progname;
+
+/* When non-zero, this global means the user is done using this program. */
+int done = 0;
+@page
+main (argc, argv)
+ int argc;
+ char **argv;
+@{
+ progname = argv[0];
+
+ initialize_readline (); /* Bind our completer. */
+
+ /* Loop reading and executing lines until the user quits. */
+ while (!done)
+ @{
+ char *line;
+
+ line = readline ("FileMan: ");
+
+ if (!line)
+ @{
+ done = 1; /* Encountered EOF at top level. */
+ @}
+ else
+ @{
+ /* Remove leading and trailing whitespace from the line.
+ Then, if there is anything left, add it to the history list
+ and execute it. */
+ stripwhite (line);
+
+ if (*line)
+ @{
+ add_history (line);
+ execute_line (line);
+ @}
+ @}
+
+ if (line)
+ free (line);
+ @}
+ exit (0);
+@}
+
+/* Execute a command line. */
+execute_line (line)
+ char *line;
+@{
+ register int i;
+ COMMAND *find_command (), *command;
+ char *word;
+
+ /* Isolate the command word. */
+ i = 0;
+ while (line[i] && !whitespace (line[i]))
+ i++;
+
+ word = line;
+
+ if (line[i])
+ line[i++] = '\0';
+
+ command = find_command (word);
+
+ if (!command)
+ @{
+ fprintf (stderr, "%s: No such command for FileMan.\n", word);
+ return;
+ @}
+
+ /* Get argument to command, if any. */
+ while (whitespace (line[i]))
+ i++;
+
+ word = line + i;
+
+ /* Call the function. */
+ (*(command->func)) (word);
+@}
+
+/* Look up NAME as the name of a command, and return a pointer to that
+ command. Return a NULL pointer if NAME isn't a command name. */
+COMMAND *
+find_command (name)
+ char *name;
+@{
+ register int i;
+
+ for (i = 0; commands[i].name; i++)
+ if (strcmp (name, commands[i].name) == 0)
+ return (&commands[i]);
+
+ return ((COMMAND *)NULL);
+@}
+
+/* Strip whitespace from the start and end of STRING. */
+stripwhite (string)
+ char *string;
+@{
+ register int i = 0;
+
+ while (whitespace (string[i]))
+ i++;
+
+ if (i)
+ strcpy (string, string + i);
+
+ i = strlen (string) - 1;
+
+ while (i > 0 && whitespace (string[i]))
+ i--;
+
+ string[++i] = '\0';
+@}
+@page
+/* **************************************************************** */
+/* */
+/* Interface to Readline Completion */
+/* */
+/* **************************************************************** */
+
+/* Tell the GNU Readline library how to complete. We want to try to complete
+ on command names if this is the first word in the line, or on filenames
+ if not. */
+initialize_readline ()
+@{
+ char **fileman_completion ();
+
+ /* Allow conditional parsing of the ~/.inputrc file. */
+ rl_readline_name = "FileMan";
+
+ /* Tell the completer that we want a crack first. */
+ rl_attempted_completion_function = (Function *)fileman_completion;
+@}
+
+/* Attempt to complete on the contents of TEXT. START and END show the
+ region of TEXT that contains the word to complete. We can use the
+ entire line in case we want to do some simple parsing. Return the
+ array of matches, or NULL if there aren't any. */
+char **
+fileman_completion (text, start, end)
+ char *text;
+ int start, end;
+@{
+ char **matches;
+ char *command_generator ();
+
+ matches = (char **)NULL;
+
+ /* If this word is at the start of the line, then it is a command
+ to complete. Otherwise it is the name of a file in the current
+ directory. */
+ if (start == 0)
+ matches = completion_matches (text, command_generator);
+
+ return (matches);
+@}
+
+/* Generator function for command completion. STATE lets us know whether
+ to start from scratch; without any state (i.e. STATE == 0), then we
+ start at the top of the list. */
+char *
+command_generator (text, state)
+ char *text;
+ int state;
+@{
+ static int list_index, len;
+ char *name;
+
+ /* If this is a new word to complete, initialize now. This includes
+ saving the length of TEXT for efficiency, and initializing the index
+ variable to 0. */
+ if (!state)
+ @{
+ list_index = 0;
+ len = strlen (text);
+ @}
+
+ /* Return the next name which partially matches from the command list. */
+ while (name = commands[list_index].name)
+ @{
+ list_index++;
+
+ if (strncmp (name, text, len) == 0)
+ return (name);
+ @}
+
+ /* If no names matched, then return NULL. */
+ return ((char *)NULL);
+@}
+@page
+/* **************************************************************** */
+/* */
+/* FileMan Commands */
+/* */
+/* **************************************************************** */
+
+/* String to pass to system (). This is for the LIST, VIEW and RENAME
+ commands. */
+static char syscom[1024];
+
+/* List the file(s) named in arg. */
+com_list (arg)
+ char *arg;
+@{
+ if (!arg)
+ arg = "*";
+
+ sprintf (syscom, "ls -FClg %s", arg);
+ system (syscom);
+@}
+
+com_view (arg)
+ char *arg;
+@{
+ if (!valid_argument ("view", arg))
+ return;
+
+ sprintf (syscom, "cat %s | more", arg);
+ system (syscom);
+@}
+
+com_rename (arg)
+ char *arg;
+@{
+ too_dangerous ("rename");
+@}
+
+com_stat (arg)
+ char *arg;
+@{
+ struct stat finfo;
+
+ if (!valid_argument ("stat", arg))
+ return;
+
+ if (stat (arg, &finfo) == -1)
+ @{
+ perror (arg);
+ return;
+ @}
+
+ printf ("Statistics for `%s':\n", arg);
+
+ printf ("%s has %d link%s, and is %d bytes in length.\n", arg,
+ finfo.st_nlink, (finfo.st_nlink == 1) ? "" : "s", finfo.st_size);
+ printf (" Created on: %s", ctime (&finfo.st_ctime));
+ printf (" Last access at: %s", ctime (&finfo.st_atime));
+ printf ("Last modified at: %s", ctime (&finfo.st_mtime));
+@}
+
+com_delete (arg)
+ char *arg;
+@{
+ too_dangerous ("delete");
+@}
+
+/* Print out help for ARG, or for all of the commands if ARG is
+ not present. */
+com_help (arg)
+ char *arg;
+@{
+ register int i;
+ int printed = 0;
+
+ for (i = 0; commands[i].name; i++)
+ @{
+ if (!*arg || (strcmp (arg, commands[i].name) == 0))
+ @{
+ printf ("%s\t\t%s.\n", commands[i].name, commands[i].doc);
+ printed++;
+ @}
+ @}
+
+ if (!printed)
+ @{
+ printf ("No commands match `%s'. Possibilties are:\n", arg);
+
+ for (i = 0; commands[i].name; i++)
+ @{
+ /* Print in six columns. */
+ if (printed == 6)
+ @{
+ printed = 0;
+ printf ("\n");
+ @}
+
+ printf ("%s\t", commands[i].name);
+ printed++;
+ @}
+
+ if (printed)
+ printf ("\n");
+ @}
+@}
+
+/* Change to the directory ARG. */
+com_cd (arg)
+ char *arg;
+@{
+ if (chdir (arg) == -1)
+ perror (arg);
+
+ com_pwd ("");
+@}
+
+/* Print out the current working directory. */
+com_pwd (ignore)
+ char *ignore;
+@{
+ char dir[1024];
+
+ (void) getwd (dir);
+
+ printf ("Current directory is %s\n", dir);
+@}
+
+/* The user wishes to quit using this program. Just set DONE non-zero. */
+com_quit (arg)
+ char *arg;
+@{
+ done = 1;
+@}
+
+/* Function which tells you that you can't do this. */
+too_dangerous (caller)
+ char *caller;
+@{
+ fprintf (stderr,
+ "%s: Too dangerous for me to distribute. Write it yourself.\n",
+ caller);
+@}
+
+/* Return non-zero if ARG is a valid argument for CALLER, else print
+ an error message and return zero. */
+int
+valid_argument (caller, arg)
+ char *caller, *arg;
+@{
+ if (!arg || !*arg)
+ @{
+ fprintf (stderr, "%s: Argument required.\n", caller);
+ return (0);
+ @}
+
+ return (1);
+@}
+@end smallexample
diff --git a/gnu/lib/libreadline/doc/rluser.texinfo b/gnu/lib/libreadline/doc/rluser.texinfo
new file mode 100644
index 000000000000..36a65b8fc94d
--- /dev/null
+++ b/gnu/lib/libreadline/doc/rluser.texinfo
@@ -0,0 +1,865 @@
+@comment %**start of header (This is for running Texinfo on a region.)
+@setfilename rluser.info
+@comment %**end of header (This is for running Texinfo on a region.)
+@setchapternewpage odd
+
+@ignore
+This file documents the end user interface to the GNU command line
+editing features. It is to be an appendix to manuals for programs which
+use these features. There is a document entitled "readline.texinfo"
+which contains both end-user and programmer documentation for the GNU
+Readline Library.
+
+Copyright (C) 1988 Free Software Foundation, Inc.
+
+Authored by Brian Fox and Chet Ramey.
+
+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).
+
+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 also that the
+GNU Copyright statement is available to the distributee, and 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.
+@end ignore
+
+@comment If you are including this manual as an appendix, then set the
+@comment variable readline-appendix.
+
+@node Command Line Editing
+@chapter Command Line Editing
+
+This chapter describes the basic features of the GNU
+command line editing interface.
+
+@menu
+* Introduction and Notation:: Notation used in this text.
+* Readline Interaction:: The minimum set of commands for editing a line.
+* Readline Init File:: Customizing Readline from a user's view.
+* Bindable Readline Commands:: A description of most of the Readline commands
+ available for binding
+* Readline vi Mode:: A short description of how to make Readline
+ behave line the vi editor.
+@end menu
+
+@node Introduction and Notation
+@section Introduction to Line Editing
+
+The following paragraphs describe the notation used to represent
+keystrokes.
+
+The text @key{C-k} is read as `Control-K' and describes the character
+produced when the Control key is depressed and the @key{k} key is struck.
+
+The text @key{M-k} is read as `Meta-K' and describes the character
+produced when the meta key (if you have one) is depressed, and the @key{k}
+key is struck. If you do not have a meta key, the identical keystroke
+can be generated by typing @key{ESC} @i{first}, and then typing @key{k}.
+Either process is known as @dfn{metafying} the @key{k} key.
+
+The text @key{M-C-k} is read as `Meta-Control-k' and describes the
+character produced by @dfn{metafying} @key{C-k}.
+
+In addition, several keys have their own names. Specifically,
+@key{DEL}, @key{ESC}, @key{LFD}, @key{SPC}, @key{RET}, and @key{TAB} all
+stand for themselves when seen in this text, or in an init file
+(@pxref{Readline Init File}, for more info).
+
+@node Readline Interaction
+@section Readline Interaction
+@cindex interaction, readline
+
+Often during an interactive session you type in a long line of text,
+only to notice that the first word on the line is misspelled. The
+Readline library gives you a set of commands for manipulating the text
+as you type it in, allowing you to just fix your typo, and not forcing
+you to retype the majority of the line. Using these editing commands,
+you move the cursor to the place that needs correction, and delete or
+insert the text of the corrections. Then, when you are satisfied with
+the line, you simply press @key{RETURN}. You do not have to be at the
+end of the line to press @key{RETURN}; the entire line is accepted
+regardless of the location of the cursor within the line.
+
+@menu
+* Readline Bare Essentials:: The least you need to know about Readline.
+* Readline Movement Commands:: Moving about the input line.
+* Readline Killing Commands:: How to delete text, and how to get it back!
+* Readline Arguments:: Giving numeric arguments to commands.
+@end menu
+
+@node Readline Bare Essentials
+@subsection Readline Bare Essentials
+
+In order to enter characters into the line, simply type them. The typed
+character appears where the cursor was, and then the cursor moves one
+space to the right. If you mistype a character, you can use your
+erase character to back up and delete the mistyped character.
+
+Sometimes you may miss typing a character that you wanted to type, and
+not notice your error until you have typed several other characters. In
+that case, you can type @key{C-b} to move the cursor to the left, and then
+correct your mistake. Afterwards, you can move the cursor to the right
+with @key{C-f}.
+
+When you add text in the middle of a line, you will notice that characters
+to the right of the cursor are `pushed over' to make room for the text
+that you have inserted. Likewise, when you delete text behind the cursor,
+characters to the right of the cursor are `pulled back' to fill in the
+blank space created by the removal of the text. A list of the basic bare
+essentials for editing the text of an input line follows.
+
+@table @asis
+@item @key{C-b}
+Move back one character.
+@item @key{C-f}
+Move forward one character.
+@item @key{DEL}
+Delete the character to the left of the cursor.
+@item @key{C-d}
+Delete the character underneath the cursor.
+@item @w{Printing characters}
+Insert the character into the line at the cursor.
+@item @key{C-_}
+Undo the last thing that you did. You can undo all the way back to an
+empty line.
+@end table
+
+@node Readline Movement Commands
+@subsection Readline Movement Commands
+
+
+The above table describes the most basic possible keystrokes that you need
+in order to do editing of the input line. For your convenience, many
+other commands have been added in addition to @key{C-b}, @key{C-f},
+@key{C-d}, and @key{DEL}. Here are some commands for moving more rapidly
+about the line.
+
+@table @key
+@item C-a
+Move to the start of the line.
+@item C-e
+Move to the end of the line.
+@item M-f
+Move forward a word.
+@item M-b
+Move backward a word.
+@item C-l
+Clear the screen, reprinting the current line at the top.
+@end table
+
+Notice how @key{C-f} moves forward a character, while @key{M-f} moves
+forward a word. It is a loose convention that control keystrokes
+operate on characters while meta keystrokes operate on words.
+
+@node Readline Killing Commands
+@subsection Readline Killing Commands
+
+@dfn{Killing} text means to delete the text from the line, but to save
+it away for later use, usually by @dfn{yanking} (re-inserting)
+it back into the line.
+If the description for a command says that it `kills' text, then you can
+be sure that you can get the text back in a different (or the same)
+place later.
+
+When you use a kill command, the text is saved in a @dfn{kill-ring}.
+Any number of consecutive kills save all of the killed text together, so
+that when you yank it back, you get it all. The kill
+ring is not line specific; the text that you killed on a previously
+typed line is available to be yanked back later, when you are typing
+another line.
+
+Here is the list of commands for killing text.
+
+@table @key
+@item C-k
+Kill the text from the current cursor position to the end of the line.
+
+@item M-d
+Kill from the cursor to the end of the current word, or if between
+words, to the end of the next word.
+
+@item M-DEL
+Kill from the cursor the start of the previous word, or if between
+words, to the start of the previous word.
+
+@item C-w
+Kill from the cursor to the previous whitespace. This is different than
+@key{M-DEL} because the word boundaries differ.
+
+@end table
+
+And, here is how to @dfn{yank} the text back into the line. Yanking
+means to copy the most-recently-killed text from the kill buffer.
+
+@table @key
+@item C-y
+Yank the most recently killed text back into the buffer at the cursor.
+
+@item M-y
+Rotate the kill-ring, and yank the new top. You can only do this if
+the prior command is @key{C-y} or @key{M-y}.
+@end table
+
+@node Readline Arguments
+@subsection Readline Arguments
+
+You can pass numeric arguments to Readline commands. Sometimes the
+argument acts as a repeat count, other times it is the @i{sign} of the
+argument that is significant. If you pass a negative argument to a
+command which normally acts in a forward direction, that command will
+act in a backward direction. For example, to kill text back to the
+start of the line, you might type @key{M--} @key{C-k}.
+
+The general way to pass numeric arguments to a command is to type meta
+digits before the command. If the first `digit' you type is a minus
+sign (@key{-}), then the sign of the argument will be negative. Once
+you have typed one meta digit to get the argument started, you can type
+the remainder of the digits, and then the command. For example, to give
+the @key{C-d} command an argument of 10, you could type @key{M-1 0 C-d}.
+
+
+@node Readline Init File
+@section Readline Init File
+
+Although the Readline library comes with a set of Emacs-like
+keybindings installed by default,
+it is possible that you would like to use a different set
+of keybindings. You can customize programs that use Readline by putting
+commands in an @dfn{init} file in your home directory. The name of this
+file is taken from the value of the shell variable @code{INPUTRC}. If
+that variable is unset, the default is @file{~/.inputrc}.
+
+When a program which uses the Readline library starts up, the
+init file is read, and the key bindings are set.
+
+In addition, the @code{C-x C-r} command re-reads this init file, thus
+incorporating any changes that you might have made to it.
+
+@menu
+* Readline Init Syntax:: Syntax for the commands in the inputrc file.
+* Conditional Init Constructs:: Conditional key bindings in the inputrc file.
+@end menu
+
+@node Readline Init Syntax
+@subsection Readline Init Syntax
+
+There are only a few basic constructs allowed in the
+Readline init file. Blank lines are ignored.
+Lines beginning with a @key{#} are comments.
+Lines beginning with a @key{$} indicate conditional
+constructs (@pxref{Conditional Init Constructs}). Other lines
+denote variable settings and key bindings.
+
+@table @asis
+@item Variable Settings
+You can change the state of a few variables in Readline by
+using the @code{set} command within the init file. Here is how you
+would specify that you wish to use @code{vi} line editing commands:
+
+@example
+set editing-mode vi
+@end example
+
+Right now, there are only a few variables which can be set;
+so few, in fact, that we just list them here:
+
+@table @code
+
+@item editing-mode
+@vindex editing-mode
+The @code{editing-mode} variable controls which editing mode you are
+using. By default, Readline starts up in Emacs editing mode, where
+the keystrokes are most similar to Emacs. This variable can be
+set to either @code{emacs} or @code{vi}.
+
+@item horizontal-scroll-mode
+@vindex horizontal-scroll-mode
+This variable can be set to either @code{On} or @code{Off}. Setting it
+to @code{On} means that the text of the lines that you edit will scroll
+horizontally on a single screen line when they are longer than the width
+of the screen, instead of wrapping onto a new screen line. By default,
+this variable is set to @code{Off}.
+
+@item mark-modified-lines
+@vindex mark-modified-lines
+This variable, when set to @code{On}, says to display an asterisk
+(@samp{*}) at the start of history lines which have been modified.
+This variable is @code{off} by default.
+
+@item bell-style
+@vindex bell-style
+Controls what happens when Readline wants to ring the terminal bell.
+If set to @code{none}, Readline never rings the bell. If set to
+@code{visible}, Readline uses a visible bell if one is available.
+If set to @code{audible} (the default), Readline attempts to ring
+the terminal's bell.
+
+@item comment-begin
+@vindex comment-begin
+The string to insert at the beginning of the line when the
+@code{vi-comment} command is executed. The default value
+is @code{"#"}.
+
+@item meta-flag
+@vindex meta-flag
+If set to @code{on}, Readline will enable eight-bit input (it
+will not strip the eighth bit from the characters it reads),
+regardless of what the terminal claims it can support. The
+default value is @code{off}.
+
+@item convert-meta
+@vindex convert-meta
+If set to @code{on}, Readline will convert characters with the
+eigth bit set to an ASCII key sequence by stripping the eigth
+bit and prepending an @key{ESC} character, converting them to a
+meta-prefixed key sequence. The default value is @code{on}.
+
+@item output-meta
+@vindex output-meta
+If set to @code{on}, Readline will display characters with the
+eighth bit set directly rather than as a meta-prefixed escape
+sequence. The default is @code{off}.
+
+@item completion-query-items
+@vindex completion-query-items
+The number of possible completions that determines when the user is
+asked whether he wants to see the list of possibilities. If the
+number of possible completions is greater than this value,
+Readline will ask the user whether or not he wishes to view
+them; otherwise, they are simply listed. The default limit is
+@code{100}.
+
+@item keymap
+@vindex keymap
+Sets Readline's idea of the current keymap for key binding commands.
+Acceptable @code{keymap} names are
+@code{emacs},
+@code{emacs-standard},
+@code{emacs-meta},
+@code{emacs-ctlx},
+@code{vi},
+@code{vi-move},
+@code{vi-command}, and
+@code{vi-insert}.
+@code{vi} is equivalent to @code{vi-command}; @code{emacs} is
+equivalent to @code{emacs-standard}. The default value is @code{emacs}.
+The value of the @code{editing-mode} variable also affects the
+default keymap.
+
+@item show-all-if-ambiguous
+@vindex show-all-if-ambiguous
+This alters the default behavior of the completion functions. If
+set to @code{on},
+words which have more than one possible completion cause the
+matches to be listed immediately instead of ringing the bell.
+The default value is @code{off}.
+
+@item expand-tilde
+@vindex expand-tilde
+If set to @code{on}, tilde expansion is performed when Readline
+attempts word completion. The default is @code{off}.
+
+@end table
+
+@item Key Bindings
+The syntax for controlling key bindings in the init file is
+simple. First you have to know the name of the command that you
+want to change. The following pages contain tables of the command name,
+the default keybinding, and a short description of what the command
+does.
+
+Once you know the name of the command, simply place the name of the key
+you wish to bind the command to, a colon, and then the name of the
+command on a line in the init file. The name of the key
+can be expressed in different ways, depending on which is most
+comfortable for you.
+
+@table @asis
+@item @w{@var{keyname}: @var{function-name} or @var{macro}}
+@var{keyname} is the name of a key spelled out in English. For example:
+@example
+Control-u: universal-argument
+Meta-Rubout: backward-kill-word
+Control-o: ">&output"
+@end example
+
+In the above example, @samp{C-u} is bound to the function
+@code{universal-argument}, and @samp{C-o} is bound to run the macro
+expressed on the right hand side (that is, to insert the text
+@samp{>&output} into the line).
+
+@item @w{"@var{keyseq}": @var{function-name} or @var{macro}}
+@var{keyseq} differs from @var{keyname} above in that strings
+denoting an entire key sequence can be specified, by placing
+the key sequence in double quotes. Some GNU Emacs style key
+escapes can be used, as in the following example, but the
+special character names are not recognized.
+
+@example
+"\C-u": universal-argument
+"\C-x\C-r": re-read-init-file
+"\e[11~": "Function Key 1"
+@end example
+
+In the above example, @samp{C-u} is bound to the function
+@code{universal-argument} (just as it was in the first example),
+@samp{C-x C-r} is bound to the function @code{re-read-init-file}, and
+@samp{ESC [ 1 1 ~} is bound to insert the text @samp{Function Key 1}.
+The following escape sequences are available when specifying key
+sequences:
+
+@table @code
+@item @kbd{\C-}
+control prefix
+@item @kbd{\M-}
+meta prefix
+@item @kbd{\e}
+an escape character
+@item @kbd{\\}
+backslash
+@item @kbd{\"}
+@key{"}
+@item @kbd{\'}
+@key{'}
+@end table
+
+When entering the text of a macro, single or double quotes should
+be used to indicate a macro definition. Unquoted text
+is assumed to be a function name. Backslash
+will quote any character in the macro text, including @key{"}
+and @key{'}.
+For example, the following binding will make @kbd{C-x \}
+insert a single @key{\} into the line:
+@example
+"\C-x\\": "\\"
+@end example
+
+@end table
+@end table
+
+@node Conditional Init Constructs
+@subsection Conditional Init Constructs
+
+Readline implements a facility similar in spirit to the conditional
+compilation features of the C preprocessor which allows key
+bindings and variable settings to be performed as the result
+of tests. There are three parser directives used.
+
+@ftable @code
+@item $if
+The @code{$if} construct allows bindings to be made based on the
+editing mode, the terminal being used, or the application using
+Readline. The text of the test extends to the end of the line;
+no characters are required to isolate it.
+
+@table @code
+@item mode
+The @code{mode=} form of the @code{$if} directive is used to test
+whether Readline is in @code{emacs} or @code{vi} mode.
+This may be used in conjunction
+with the @samp{set keymap} command, for instance, to set bindings in
+the @code{emacs-standard} and @code{emacs-ctlx} keymaps only if
+Readline is starting out in @code{emacs} mode.
+
+@item term
+The @code{term=} form may be used to include terminal-specific
+key bindings, perhaps to bind the key sequences output by the
+terminal's function keys. The word on the right side of the
+@samp{=} is tested against the full name of the terminal and the
+portion of the terminal name before the first @samp{-}. This
+allows @var{sun} to match both @var{sun} and @var{sun-cmd},
+for instance.
+
+@item application
+The @var{application} construct is used to include
+application-specific settings. Each program using the Readline
+library sets the @var{application name}, and you can test for it.
+This could be used to bind key sequences to functions useful for
+a specific program. For instance, the following command adds a
+key sequence that quotes the current or previous word in Bash:
+@example
+$if bash
+# Quote the current or previous word
+"\C-xq": "\eb\"\ef\""
+$endif
+@end example
+@end table
+
+@item $endif
+This command, as you saw in the previous example, terminates an
+@code{$if} command.
+
+@item $else
+Commands in this branch of the @code{$if} directive are executed if
+the test fails.
+@end ftable
+
+@node Bindable Readline Commands
+@section Bindable Readline Commands
+
+@menu
+* Commands For Moving:: Moving about the line.
+* Commands For History:: Getting at previous lines.
+* Commands For Text:: Commands for changing text.
+* Commands For Killing:: Commands for killing and yanking.
+* Numeric Arguments:: Specifying numeric arguments, repeat counts.
+* Commands For Completion:: Getting Readline to do the typing for you.
+* Keyboard Macros:: Saving and re-executing typed characters
+* Miscellaneous Commands:: Other miscellaneous commands.
+@end menu
+
+@node Commands For Moving
+@subsection Commands For Moving
+@ftable @code
+@item beginning-of-line (C-a)
+Move to the start of the current line.
+
+@item end-of-line (C-e)
+Move to the end of the line.
+
+@item forward-char (C-f)
+Move forward a character.
+
+@item backward-char (C-b)
+Move back a character.
+
+@item forward-word (M-f)
+Move forward to the end of the next word. Words are composed of
+letters and digits.
+
+@item backward-word (M-b)
+Move back to the start of this, or the previous, word. Words are
+composed of letters and digits.
+
+@item clear-screen (C-l)
+Clear the screen and redraw the current line,
+leaving the current line at the top of the screen.
+
+@item redraw-current-line ()
+Refresh the current line. By default, this is unbound.
+
+@end ftable
+
+@node Commands For History
+@subsection Commands For Manipulating The History
+
+@ftable @code
+@item accept-line (Newline, Return)
+@ifset BashFeatures
+Accept the line regardless of where the cursor is. If this line is
+non-empty, add it to the history list according to the setting of
+the @code{HISTCONTROL} variable. If this line was a history
+line, then restore the history line to its original state.
+@end ifset
+@ifclear BashFeatures
+Accept the line regardless of where the cursor is. If this line is
+non-empty, add it to the history list. If this line was a history
+line, then restore the history line to its original state.
+@end ifclear
+
+@item previous-history (C-p)
+Move `up' through the history list.
+
+@item next-history (C-n)
+Move `down' through the history list.
+
+@item beginning-of-history (M-<)
+Move to the first line in the history.
+
+@item end-of-history (M->)
+Move to the end of the input history, i.e., the line you are entering.
+
+@item reverse-search-history (C-r)
+Search backward starting at the current line and moving `up' through
+the history as necessary. This is an incremental search.
+
+@item forward-search-history (C-s)
+Search forward starting at the current line and moving `down' through
+the the history as necessary. This is an incremental search.
+
+@item non-incremental-reverse-search-history (M-p)
+Search backward starting at the current line and moving `up'
+through the history as necessary using a non-incremental search
+for a string supplied by the user.
+
+@item non-incremental-forward-search-history (M-n)
+Search forward starting at the current line and moving `down'
+through the the history as necessary using a non-incremental search
+for a string supplied by the user.
+
+@item history-search-forward ()
+Search forward through the history for the string of characters
+between the start of the current line and the current point. This
+is a non-incremental search. By default, this command is unbound.
+
+@item history-search-backward ()
+Search backward through the history for the string of characters
+between the start of the current line and the current point. This
+is a non-incremental search. By default, this command is unbound.
+
+@item yank-nth-arg (M-C-y)
+Insert the first argument to the previous command (usually
+the second word on the previous line). With an argument @var{n},
+insert the @var{n}th word from the previous command (the words
+in the previous command begin with word 0). A negative argument
+inserts the @var{n}th word from the end of the previous command.
+
+@end ftable
+
+@node Commands For Text
+@subsection Commands For Changing Text
+
+@ftable @code
+@item delete-char (C-d)
+Delete the character under the cursor. If the cursor is at the
+beginning of the line, there are no characters in the line, and
+the last character typed was not C-d, then return EOF.
+
+@item backward-delete-char (Rubout)
+Delete the character behind the cursor. A numeric arg says to kill
+the characters instead of deleting them.
+
+@item quoted-insert (C-q, C-v)
+Add the next character that you type to the line verbatim. This is
+how to insert key sequences like @key{C-q}, for example.
+
+@item tab-insert (M-TAB)
+Insert a tab character.
+
+@item self-insert (a, b, A, 1, !, ...)
+Insert yourself.
+
+@item transpose-chars (C-t)
+Drag the character before the cursor forward over
+the character at the cursor, moving the
+cursor forward as well. If the insertion point
+is at the end of the line, then this
+transposes the last two characters of the line.
+Negative argumentss don't work.
+
+@item transpose-words (M-t)
+Drag the word behind the cursor past the word in front of the cursor
+moving the cursor over that word as well.
+
+@item upcase-word (M-u)
+Uppercase the current (or following) word. With a negative argument,
+do the previous word, but do not move the cursor.
+
+@item downcase-word (M-l)
+Lowercase the current (or following) word. With a negative argument,
+do the previous word, but do not move the cursor.
+
+@item capitalize-word (M-c)
+Capitalize the current (or following) word. With a negative argument,
+do the previous word, but do not move the cursor.
+
+@end ftable
+
+@node Commands For Killing
+@subsection Killing And Yanking
+
+@ftable @code
+
+@item kill-line (C-k)
+Kill the text from the current cursor position to the end of the line.
+
+@item backward-kill-line (C-x Rubout)
+Kill backward to the beginning of the line.
+
+@item unix-line-discard (C-u)
+Kill backward from the cursor to the beginning of the current line.
+Save the killed text on the kill-ring.
+
+@item kill-whole-line ()
+Kill all characters on the current line, no matter where the
+cursor is. By default, this is unbound.
+
+@item kill-word (M-d)
+Kill from the cursor to the end of the current word, or if between
+words, to the end of the next word. Word boundaries are the same
+as @code{forward-word}.
+
+@item backward-kill-word (M-DEL)
+Kill the word behind the cursor. Word boundaries are the same
+as @code{backward-word}.
+
+@item unix-word-rubout (C-w)
+Kill the word behind the cursor, using white space as a word
+boundary. The killed text is saved on the kill-ring.
+
+@item delete-horizontal-space ()
+Delete all spaces and tabs around point. By default, this is unbound.
+
+@item yank (C-y)
+Yank the top of the kill ring into the buffer at the current
+cursor position.
+
+@item yank-pop (M-y)
+Rotate the kill-ring, and yank the new top. You can only do this if
+the prior command is yank or yank-pop.
+@end ftable
+
+@node Numeric Arguments
+@subsection Specifying Numeric Arguments
+@ftable @code
+
+@item digit-argument (M-0, M-1, ... M--)
+Add this digit to the argument already accumulating, or start a new
+argument. M-- starts a negative argument.
+
+@item universal-argument ()
+Each time this is executed, the argument count is multiplied by four.
+The argument count is initially one, so executing this function the
+first time makes the argument count four. By default, this is not
+bound to a key.
+@end ftable
+
+@node Commands For Completion
+@subsection Letting Readline Type For You
+
+@ftable @code
+@item complete (TAB)
+Attempt to do completion on the text before the cursor. This is
+implementation defined. Generally, if you are typing a filename
+argument, you can do filename completion; if you are typing a command,
+you can do command completion, if you are typing in a symbol to GDB, you
+can do symbol name completion, if you are typing in a variable to Bash,
+you can do variable name completion, and so on.
+@ifset BashFeatures
+See the Bash manual page for a complete list of available completion
+functions.
+@end ifset
+
+@item possible-completions (M-?)
+List the possible completions of the text before the cursor.
+
+@item insert-completions ()
+Insert all completions of the text before point that would have
+been generated by @code{possible-completions}. By default, this
+is not bound to a key.
+
+@end ftable
+
+@node Keyboard Macros
+@subsection Keyboard Macros
+@ftable @code
+
+@item start-kbd-macro (C-x ()
+Begin saving the characters typed into the current keyboard macro.
+
+@item end-kbd-macro (C-x ))
+Stop saving the characters typed into the current keyboard macro
+and save the definition.
+
+@item call-last-kbd-macro (C-x e)
+Re-execute the last keyboard macro defined, by making the characters
+in the macro appear as if typed at the keyboard.
+
+@end ftable
+
+@node Miscellaneous Commands
+@subsection Some Miscellaneous Commands
+@ftable @code
+
+@item re-read-init-file (C-x C-r)
+Read in the contents of your init file, and incorporate
+any bindings or variable assignments found there.
+
+@item abort (C-g)
+Abort the current editing command and
+ring the terminal's bell (subject to the setting of
+@code{bell-style}).
+
+@item do-uppercase-version (M-a, M-b, ...)
+Run the command that is bound to the corresoponding uppercase
+character.
+
+@item prefix-meta (ESC)
+Make the next character that you type be metafied. This is for people
+without a meta key. Typing @samp{ESC f} is equivalent to typing
+@samp{M-f}.
+
+@item undo (C-_, C-x C-u)
+Incremental undo, separately remembered for each line.
+
+@item revert-line (M-r)
+Undo all changes made to this line. This is like typing the @code{undo}
+command enough times to get back to the beginning.
+
+@item tilde-expand (M-~)
+Perform tilde expansion on the current word.
+
+@item dump-functions ()
+Print all of the functions and their key bindings to the
+readline output stream. If a numeric argument is supplied,
+the output is formatted in such a way that it can be made part
+of an @var{inputrc} file.
+
+@ifset BashFeatures
+@item display-shell-version (C-x C-v)
+Display version information about the current instance of Bash.
+
+@item shell-expand-line (M-C-e)
+Expand the line the way the shell does when it reads it. This
+performs alias and history expansion as well as all of the shell
+word expansions.
+
+@item history-expand-line (M-^)
+Perform history expansion on the current line.
+
+@item insert-last-argument (M-., M-_)
+Insert the last argument to the previous command (the last word on
+the previous line). With an argument @var{n},
+insert the @var{n}th word from the previous command (the words
+in the previous command begin with word 0). A negative argument
+inserts the @var{n}th word from the end of the previous command.
+
+@item operate-and-get-next (C-o)
+Accept the current line for execution and fetch the next line
+relative to the current line from the history for editing. Any
+argument is ignored.
+
+@item emacs-editing-mode (C-e)
+When in @code{vi} editing mode, this causes a switch back to
+emacs editing mode, as if the command @code{set -o emacs} had
+been executed.
+
+@end ifset
+
+@end ftable
+
+@node Readline vi Mode
+@section Readline vi Mode
+
+While the Readline library does not have a full set of @code{vi}
+editing functions, it does contain enough to allow simple editing
+of the line. The Readline @code{vi} mode behaves as specified in
+the Posix 1003.2 standard.
+
+@ifset BashFeatures
+In order to switch interactively between @code{Emacs} and @code{Vi}
+editing modes, use the @code{set -o emacs} and @code{set -o vi}
+commands (@pxref{The Set Builtin}).
+@end ifset
+@ifclear BashFeatures
+In order to switch interactively between @code{Emacs} and @code{Vi}
+editing modes, use the command M-C-j (toggle-editing-mode).
+@end ifclear
+The Readline default is @code{emacs} mode.
+
+When you enter a line in @code{vi} mode, you are already placed in
+`insertion' mode, as if you had typed an @samp{i}. Pressing @key{ESC}
+switches you into `command' mode, where you can edit the text of the
+line with the standard @code{vi} movement keys, move to previous
+history lines with @samp{k}, and following lines with @samp{j}, and
+so forth.
diff --git a/gnu/lib/libreadline/doc/texindex.c b/gnu/lib/libreadline/doc/texindex.c
new file mode 100644
index 000000000000..9233bab12690
--- /dev/null
+++ b/gnu/lib/libreadline/doc/texindex.c
@@ -0,0 +1,1666 @@
+/* Prepare TeX index dribble output into an actual index.
+
+ Version 1.45
+
+ Copyright (C) 1987, 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, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+
+#include <stdio.h>
+#include <ctype.h>
+#include <errno.h>
+#include "getopt.h"
+#include "bashansi.h"
+
+#if !defined (errno)
+extern int errno;
+#endif
+
+#if defined (HAVE_UNISTD_H)
+# include <unistd.h>
+#else /* !HAVE_UNISTD_H */
+extern long lseek ();
+#endif /* !HAVE_UNISTD_H */
+
+extern char *mktemp ();
+
+#if !defined (HAVE_STRERROR)
+extern int sys_nerr;
+extern char *sys_errlist[];
+#endif
+
+#include <sys/types.h>
+
+#if defined (_AIX) || !defined (_POSIX_VERSION)
+# include <sys/file.h>
+#endif
+
+#include <fcntl.h>
+
+#define TI_NO_ERROR 0
+#define TI_FATAL_ERROR 1
+
+#if !defined (SEEK_SET)
+# define SEEK_SET 0
+# define SEEK_CUR 1
+# define SEEK_END 2
+#endif /* !SEEK_SET */
+
+/* When sorting in core, this structure describes one line
+ and the position and length of its first keyfield. */
+struct lineinfo
+{
+ char *text; /* The actual text of the line. */
+ union {
+ char *text; /* The start of the key (for textual comparison). */
+ long number; /* The numeric value (for numeric comparison). */
+ } key;
+ long keylen; /* Length of KEY field. */
+};
+
+/* This structure describes a field to use as a sort key. */
+struct keyfield
+{
+ int startwords; /* Number of words to skip. */
+ int startchars; /* Number of additional chars to skip. */
+ int endwords; /* Number of words to ignore at end. */
+ int endchars; /* Ditto for characters of last word. */
+ char ignore_blanks; /* Non-zero means ignore spaces and tabs. */
+ char fold_case; /* Non-zero means case doesn't matter. */
+ char reverse; /* Non-zero means compare in reverse order. */
+ char numeric; /* Non-zeros means field is ASCII numeric. */
+ char positional; /* Sort according to file position. */
+ char braced; /* Count balanced-braced groupings as fields. */
+};
+
+/* Vector of keyfields to use. */
+struct keyfield keyfields[3];
+
+/* Number of keyfields stored in that vector. */
+int num_keyfields = 3;
+
+/* Vector of input file names, terminated with a null pointer. */
+char **infiles;
+
+/* Vector of corresponding output file names, or NULL, meaning default it
+ (add an `s' to the end). */
+char **outfiles;
+
+/* Length of `infiles'. */
+int num_infiles;
+
+/* Pointer to the array of pointers to lines being sorted. */
+char **linearray;
+
+/* The allocated length of `linearray'. */
+long nlines;
+
+/* Directory to use for temporary files. On Unix, it ends with a slash. */
+char *tempdir;
+
+/* Start of filename to use for temporary files. */
+char *tempbase;
+
+/* Number of last temporary file. */
+int tempcount;
+
+/* Number of last temporary file already deleted.
+ Temporary files are deleted by `flush_tempfiles' in order of creation. */
+int last_deleted_tempcount;
+
+/* During in-core sort, this points to the base of the data block
+ which contains all the lines of data. */
+char *text_base;
+
+/* Additional command switches .*/
+
+/* Nonzero means do not delete tempfiles -- for debugging. */
+int keep_tempfiles;
+
+/* The name this program was run with. */
+char *program_name;
+
+/* Forward declarations of functions in this file. */
+
+void decode_command ();
+void sort_in_core ();
+void sort_offline ();
+char **parsefile ();
+char *find_field ();
+char *find_pos ();
+long find_value ();
+char *find_braced_pos ();
+char *find_braced_end ();
+void writelines ();
+int compare_field ();
+int compare_full ();
+long readline ();
+int merge_files ();
+int merge_direct ();
+void pfatal_with_name ();
+void fatal ();
+void error ();
+void *xmalloc (), *xrealloc ();
+char *concat ();
+char *maketempname ();
+void flush_tempfiles ();
+char *tempcopy ();
+
+#define MAX_IN_CORE_SORT 500000
+
+void
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ int i;
+
+ tempcount = 0;
+ last_deleted_tempcount = 0;
+ program_name = argv[0];
+
+ /* Describe the kind of sorting to do. */
+ /* The first keyfield uses the first braced field and folds case. */
+ keyfields[0].braced = 1;
+ keyfields[0].fold_case = 1;
+ keyfields[0].endwords = -1;
+ keyfields[0].endchars = -1;
+
+ /* The second keyfield uses the second braced field, numerically. */
+ keyfields[1].braced = 1;
+ keyfields[1].numeric = 1;
+ keyfields[1].startwords = 1;
+ keyfields[1].endwords = -1;
+ keyfields[1].endchars = -1;
+
+ /* The third keyfield (which is ignored while discarding duplicates)
+ compares the whole line. */
+ keyfields[2].endwords = -1;
+ keyfields[2].endchars = -1;
+
+ decode_command (argc, argv);
+
+ tempbase = mktemp (concat ("txiXXXXXX", "", ""));
+
+ /* Process input files completely, one by one. */
+
+ for (i = 0; i < num_infiles; i++)
+ {
+ int desc;
+ long ptr;
+ char *outfile;
+
+ desc = open (infiles[i], O_RDONLY, 0);
+ if (desc < 0)
+ pfatal_with_name (infiles[i]);
+ lseek (desc, 0L, SEEK_END);
+ ptr = lseek (desc, 0L, SEEK_CUR);
+
+ close (desc);
+
+ outfile = outfiles[i];
+ if (!outfile)
+ {
+ outfile = concat (infiles[i], "s", "");
+ }
+
+ if (ptr < MAX_IN_CORE_SORT)
+ /* Sort a small amount of data. */
+ sort_in_core (infiles[i], ptr, outfile);
+ else
+ sort_offline (infiles[i], ptr, outfile);
+ }
+
+ flush_tempfiles (tempcount);
+ exit (TI_NO_ERROR);
+}
+
+void
+usage ()
+{
+ fprintf (stderr, "\
+Usage: %s [-k] infile [-o outfile] ...\n", program_name);
+ exit (1);
+}
+
+/* Decode the command line arguments to set the parameter variables
+ and set up the vector of keyfields and the vector of input files. */
+
+void
+decode_command (argc, argv)
+ int argc;
+ char **argv;
+{
+ int optc;
+ char **ip;
+ char **op;
+
+ /* Store default values into parameter variables. */
+
+ tempdir = getenv ("TMPDIR");
+ if (tempdir == NULL)
+ tempdir = "/tmp/";
+ else
+ tempdir = concat (tempdir, "/", "");
+
+ keep_tempfiles = 0;
+
+ /* Allocate ARGC input files, which must be enough. */
+
+ infiles = (char **) xmalloc (argc * sizeof (char *));
+ outfiles = (char **) xmalloc (argc * sizeof (char *));
+ ip = infiles;
+ op = outfiles;
+
+ while ((optc = getopt (argc, argv, "-ko:")) != EOF)
+ {
+ switch (optc)
+ {
+ case 1: /* Non-option filename. */
+ *ip++ = optarg;
+ *op++ = NULL;
+ break;
+
+ case 'k':
+ keep_tempfiles = 1;
+ break;
+
+ case 'o':
+ if (op > outfiles)
+ *(op - 1) = optarg;
+ break;
+
+ default:
+ usage ();
+ }
+ }
+
+ /* Record number of keyfields and terminate list of filenames. */
+ num_infiles = ip - infiles;
+ *ip = 0;
+ if (num_infiles == 0)
+ usage ();
+}
+
+/* Return a name for a temporary file. */
+
+char *
+maketempname (count)
+ int count;
+{
+ char tempsuffix[10];
+ sprintf (tempsuffix, "%d", count);
+ return concat (tempdir, tempbase, tempsuffix);
+}
+
+/* Delete all temporary files up to TO_COUNT. */
+
+void
+flush_tempfiles (to_count)
+ int to_count;
+{
+ if (keep_tempfiles)
+ return;
+ while (last_deleted_tempcount < to_count)
+ unlink (maketempname (++last_deleted_tempcount));
+}
+
+/* Copy the input file open on IDESC into a temporary file
+ and return the temporary file name. */
+
+#define BUFSIZE 1024
+
+char *
+tempcopy (idesc)
+ int idesc;
+{
+ char *outfile = maketempname (++tempcount);
+ int odesc;
+ char buffer[BUFSIZE];
+
+ odesc = open (outfile, O_WRONLY | O_CREAT, 0666);
+
+ if (odesc < 0)
+ pfatal_with_name (outfile);
+
+ while (1)
+ {
+ int nread = read (idesc, buffer, BUFSIZE);
+ write (odesc, buffer, nread);
+ if (!nread)
+ break;
+ }
+
+ close (odesc);
+
+ return outfile;
+}
+
+/* Compare LINE1 and LINE2 according to the specified set of keyfields. */
+
+int
+compare_full (line1, line2)
+ char **line1, **line2;
+{
+ int i;
+
+ /* Compare using the first keyfield;
+ if that does not distinguish the lines, try the second keyfield;
+ and so on. */
+
+ for (i = 0; i < num_keyfields; i++)
+ {
+ long length1, length2;
+ char *start1 = find_field (&keyfields[i], *line1, &length1);
+ char *start2 = find_field (&keyfields[i], *line2, &length2);
+ int tem = compare_field (&keyfields[i], start1, length1, *line1 - text_base,
+ start2, length2, *line2 - text_base);
+ if (tem)
+ {
+ if (keyfields[i].reverse)
+ return -tem;
+ return tem;
+ }
+ }
+
+ return 0; /* Lines match exactly. */
+}
+
+/* Compare LINE1 and LINE2, described by structures
+ in which the first keyfield is identified in advance.
+ For positional sorting, assumes that the order of the lines in core
+ reflects their nominal order. */
+
+int
+compare_prepared (line1, line2)
+ struct lineinfo *line1, *line2;
+{
+ int i;
+ int tem;
+ char *text1, *text2;
+
+ /* Compare using the first keyfield, which has been found for us already. */
+ if (keyfields->positional)
+ {
+ if (line1->text - text_base > line2->text - text_base)
+ tem = 1;
+ else
+ tem = -1;
+ }
+ else if (keyfields->numeric)
+ tem = line1->key.number - line2->key.number;
+ else
+ tem = compare_field (keyfields, line1->key.text, line1->keylen, 0,
+ line2->key.text, line2->keylen, 0);
+ if (tem)
+ {
+ if (keyfields->reverse)
+ return -tem;
+ return tem;
+ }
+
+ text1 = line1->text;
+ text2 = line2->text;
+
+ /* Compare using the second keyfield;
+ if that does not distinguish the lines, try the third keyfield;
+ and so on. */
+
+ for (i = 1; i < num_keyfields; i++)
+ {
+ long length1, length2;
+ char *start1 = find_field (&keyfields[i], text1, &length1);
+ char *start2 = find_field (&keyfields[i], text2, &length2);
+ int tem = compare_field (&keyfields[i], start1, length1, text1 - text_base,
+ start2, length2, text2 - text_base);
+ if (tem)
+ {
+ if (keyfields[i].reverse)
+ return -tem;
+ return tem;
+ }
+ }
+
+ return 0; /* Lines match exactly. */
+}
+
+/* Like compare_full but more general.
+ You can pass any strings, and you can say how many keyfields to use.
+ POS1 and POS2 should indicate the nominal positional ordering of
+ the two lines in the input. */
+
+int
+compare_general (str1, str2, pos1, pos2, use_keyfields)
+ char *str1, *str2;
+ long pos1, pos2;
+ int use_keyfields;
+{
+ int i;
+
+ /* Compare using the first keyfield;
+ if that does not distinguish the lines, try the second keyfield;
+ and so on. */
+
+ for (i = 0; i < use_keyfields; i++)
+ {
+ long length1, length2;
+ char *start1 = find_field (&keyfields[i], str1, &length1);
+ char *start2 = find_field (&keyfields[i], str2, &length2);
+ int tem = compare_field (&keyfields[i], start1, length1, pos1,
+ start2, length2, pos2);
+ if (tem)
+ {
+ if (keyfields[i].reverse)
+ return -tem;
+ return tem;
+ }
+ }
+
+ return 0; /* Lines match exactly. */
+}
+
+/* Find the start and length of a field in STR according to KEYFIELD.
+ A pointer to the starting character is returned, and the length
+ is stored into the int that LENGTHPTR points to. */
+
+char *
+find_field (keyfield, str, lengthptr)
+ struct keyfield *keyfield;
+ char *str;
+ long *lengthptr;
+{
+ char *start;
+ char *end;
+ char *(*fun) ();
+
+ if (keyfield->braced)
+ fun = find_braced_pos;
+ else
+ fun = find_pos;
+
+ start = (*fun) (str, keyfield->startwords, keyfield->startchars,
+ keyfield->ignore_blanks);
+ if (keyfield->endwords < 0)
+ {
+ if (keyfield->braced)
+ end = find_braced_end (start);
+ else
+ {
+ end = start;
+ while (*end && *end != '\n')
+ end++;
+ }
+ }
+ else
+ {
+ end = (*fun) (str, keyfield->endwords, keyfield->endchars, 0);
+ if (end - str < start - str)
+ end = start;
+ }
+ *lengthptr = end - start;
+ return start;
+}
+
+/* Return a pointer to a specified place within STR,
+ skipping (from the beginning) WORDS words and then CHARS chars.
+ If IGNORE_BLANKS is nonzero, we skip all blanks
+ after finding the specified word. */
+
+char *
+find_pos (str, words, chars, ignore_blanks)
+ char *str;
+ int words, chars;
+ int ignore_blanks;
+{
+ int i;
+ char *p = str;
+
+ for (i = 0; i < words; i++)
+ {
+ char c;
+ /* Find next bunch of nonblanks and skip them. */
+ while ((c = *p) == ' ' || c == '\t')
+ p++;
+ while ((c = *p) && c != '\n' && !(c == ' ' || c == '\t'))
+ p++;
+ if (!*p || *p == '\n')
+ return p;
+ }
+
+ while (*p == ' ' || *p == '\t')
+ p++;
+
+ for (i = 0; i < chars; i++)
+ {
+ if (!*p || *p == '\n')
+ break;
+ p++;
+ }
+ return p;
+}
+
+/* Like find_pos but assumes that each field is surrounded by braces
+ and that braces within fields are balanced. */
+
+char *
+find_braced_pos (str, words, chars, ignore_blanks)
+ char *str;
+ int words, chars;
+ int ignore_blanks;
+{
+ int i;
+ int bracelevel;
+ char *p = str;
+ char c;
+
+ for (i = 0; i < words; i++)
+ {
+ bracelevel = 1;
+ while ((c = *p++) != '{' && c != '\n' && c)
+ /* Do nothing. */ ;
+ if (c != '{')
+ return p - 1;
+ while (bracelevel)
+ {
+ c = *p++;
+ if (c == '{')
+ bracelevel++;
+ if (c == '}')
+ bracelevel--;
+ if (c == 0 || c == '\n')
+ return p - 1;
+ }
+ }
+
+ while ((c = *p++) != '{' && c != '\n' && c)
+ /* Do nothing. */ ;
+
+ if (c != '{')
+ return p - 1;
+
+ if (ignore_blanks)
+ while ((c = *p) == ' ' || c == '\t')
+ p++;
+
+ for (i = 0; i < chars; i++)
+ {
+ if (!*p || *p == '\n')
+ break;
+ p++;
+ }
+ return p;
+}
+
+/* Find the end of the balanced-brace field which starts at STR.
+ The position returned is just before the closing brace. */
+
+char *
+find_braced_end (str)
+ char *str;
+{
+ int bracelevel;
+ char *p = str;
+ char c;
+
+ bracelevel = 1;
+ while (bracelevel)
+ {
+ c = *p++;
+ if (c == '{')
+ bracelevel++;
+ if (c == '}')
+ bracelevel--;
+ if (c == 0 || c == '\n')
+ return p - 1;
+ }
+ return p - 1;
+}
+
+long
+find_value (start, length)
+ char *start;
+ long length;
+{
+ while (length != 0L)
+ {
+ if (isdigit (*start))
+ return atol (start);
+ length--;
+ start++;
+ }
+ return 0l;
+}
+
+/* Vector used to translate characters for comparison.
+ This is how we make all alphanumerics follow all else,
+ and ignore case in the first sorting. */
+int char_order[256];
+
+void
+init_char_order ()
+{
+ int i;
+ for (i = 1; i < 256; i++)
+ char_order[i] = i;
+
+ for (i = '0'; i <= '9'; i++)
+ char_order[i] += 512;
+
+ for (i = 'a'; i <= 'z'; i++)
+ {
+ char_order[i] = 512 + i;
+ char_order[i + 'A' - 'a'] = 512 + i;
+ }
+}
+
+/* Compare two fields (each specified as a start pointer and a character count)
+ according to KEYFIELD.
+ The sign of the value reports the relation between the fields. */
+
+int
+compare_field (keyfield, start1, length1, pos1, start2, length2, pos2)
+ struct keyfield *keyfield;
+ char *start1;
+ long length1;
+ long pos1;
+ char *start2;
+ long length2;
+ long pos2;
+{
+ if (keyfields->positional)
+ {
+ if (pos1 > pos2)
+ return 1;
+ else
+ return -1;
+ }
+ if (keyfield->numeric)
+ {
+ long value = find_value (start1, length1) - find_value (start2, length2);
+ if (value > 0)
+ return 1;
+ if (value < 0)
+ return -1;
+ return 0;
+ }
+ else
+ {
+ char *p1 = start1;
+ char *p2 = start2;
+ char *e1 = start1 + length1;
+ char *e2 = start2 + length2;
+
+ while (1)
+ {
+ int c1, c2;
+
+ if (p1 == e1)
+ c1 = 0;
+ else
+ c1 = *p1++;
+ if (p2 == e2)
+ c2 = 0;
+ else
+ c2 = *p2++;
+
+ if (char_order[c1] != char_order[c2])
+ return char_order[c1] - char_order[c2];
+ if (!c1)
+ break;
+ }
+
+ /* Strings are equal except possibly for case. */
+ p1 = start1;
+ p2 = start2;
+ while (1)
+ {
+ int c1, c2;
+
+ if (p1 == e1)
+ c1 = 0;
+ else
+ c1 = *p1++;
+ if (p2 == e2)
+ c2 = 0;
+ else
+ c2 = *p2++;
+
+ if (c1 != c2)
+ /* Reverse sign here so upper case comes out last. */
+ return c2 - c1;
+ if (!c1)
+ break;
+ }
+
+ return 0;
+ }
+}
+
+/* A `struct linebuffer' is a structure which holds a line of text.
+ `readline' reads a line from a stream into a linebuffer
+ and works regardless of the length of the line. */
+
+struct linebuffer
+{
+ long size;
+ char *buffer;
+};
+
+/* Initialize LINEBUFFER for use. */
+
+void
+initbuffer (linebuffer)
+ struct linebuffer *linebuffer;
+{
+ linebuffer->size = 200;
+ linebuffer->buffer = (char *) xmalloc (200);
+}
+
+/* Read a line of text from STREAM into LINEBUFFER.
+ Return the length of the line. */
+
+long
+readline (linebuffer, stream)
+ struct linebuffer *linebuffer;
+ FILE *stream;
+{
+ char *buffer = linebuffer->buffer;
+ char *p = linebuffer->buffer;
+ char *end = p + linebuffer->size;
+
+ while (1)
+ {
+ int c = getc (stream);
+ if (p == end)
+ {
+ buffer = (char *) xrealloc (buffer, linebuffer->size *= 2);
+ p += buffer - linebuffer->buffer;
+ end += buffer - linebuffer->buffer;
+ linebuffer->buffer = buffer;
+ }
+ if (c < 0 || c == '\n')
+ {
+ *p = 0;
+ break;
+ }
+ *p++ = c;
+ }
+
+ return p - buffer;
+}
+
+/* Sort an input file too big to sort in core. */
+
+void
+sort_offline (infile, nfiles, total, outfile)
+ char *infile;
+ int nfiles;
+ long total;
+ char *outfile;
+{
+ /* More than enough. */
+ int ntemps = 2 * (total + MAX_IN_CORE_SORT - 1) / MAX_IN_CORE_SORT;
+ char **tempfiles = (char **) xmalloc (ntemps * sizeof (char *));
+ FILE *istream = fopen (infile, "r");
+ int i;
+ struct linebuffer lb;
+ long linelength;
+ int failure = 0;
+
+ initbuffer (&lb);
+
+ /* Read in one line of input data. */
+
+ linelength = readline (&lb, istream);
+
+ if (lb.buffer[0] != '\\' && lb.buffer[0] != '@')
+ {
+ error ("%s: not a texinfo index file", infile);
+ return;
+ }
+
+ /* Split up the input into `ntemps' temporary files, or maybe fewer,
+ and put the new files' names into `tempfiles' */
+
+ for (i = 0; i < ntemps; i++)
+ {
+ char *outname = maketempname (++tempcount);
+ FILE *ostream = fopen (outname, "w");
+ long tempsize = 0;
+
+ if (!ostream)
+ pfatal_with_name (outname);
+ tempfiles[i] = outname;
+
+ /* Copy lines into this temp file as long as it does not make file
+ "too big" or until there are no more lines. */
+
+ while (tempsize + linelength + 1 <= MAX_IN_CORE_SORT)
+ {
+ tempsize += linelength + 1;
+ fputs (lb.buffer, ostream);
+ putc ('\n', ostream);
+
+ /* Read another line of input data. */
+
+ linelength = readline (&lb, istream);
+ if (!linelength && feof (istream))
+ break;
+
+ if (lb.buffer[0] != '\\' && lb.buffer[0] != '@')
+ {
+ error ("%s: not a texinfo index file", infile);
+ failure = 1;
+ goto fail;
+ }
+ }
+ fclose (ostream);
+ if (feof (istream))
+ break;
+ }
+
+ free (lb.buffer);
+
+fail:
+ /* Record number of temp files we actually needed. */
+
+ ntemps = i;
+
+ /* Sort each tempfile into another tempfile.
+ Delete the first set of tempfiles and put the names of the second
+ into `tempfiles'. */
+
+ for (i = 0; i < ntemps; i++)
+ {
+ char *newtemp = maketempname (++tempcount);
+ sort_in_core (&tempfiles[i], MAX_IN_CORE_SORT, newtemp);
+ if (!keep_tempfiles)
+ unlink (tempfiles[i]);
+ tempfiles[i] = newtemp;
+ }
+
+ if (failure)
+ return;
+
+ /* Merge the tempfiles together and indexify. */
+
+ merge_files (tempfiles, ntemps, outfile);
+}
+
+/* Sort INFILE, whose size is TOTAL,
+ assuming that is small enough to be done in-core,
+ then indexify it and send the output to OUTFILE (or to stdout). */
+
+void
+sort_in_core (infile, total, outfile)
+ char *infile;
+ long total;
+ char *outfile;
+{
+ char **nextline;
+ char *data = (char *) xmalloc (total + 1);
+ char *file_data;
+ long file_size;
+ int i;
+ FILE *ostream = stdout;
+ struct lineinfo *lineinfo;
+
+ /* Read the contents of the file into the moby array `data'. */
+
+ int desc = open (infile, O_RDONLY, 0);
+
+ if (desc < 0)
+ fatal ("failure reopening %s", infile);
+ for (file_size = 0;;)
+ {
+ i = read (desc, data + file_size, total - file_size);
+ if (i <= 0)
+ break;
+ file_size += i;
+ }
+ file_data = data;
+ data[file_size] = 0;
+
+ close (desc);
+
+ if (file_size > 0 && data[0] != '\\' && data[0] != '@')
+ {
+ error ("%s: not a texinfo index file", infile);
+ return;
+ }
+
+ init_char_order ();
+
+ /* Sort routines want to know this address. */
+
+ text_base = data;
+
+ /* Create the array of pointers to lines, with a default size
+ frequently enough. */
+
+ nlines = total / 50;
+ if (!nlines)
+ nlines = 2;
+ linearray = (char **) xmalloc (nlines * sizeof (char *));
+
+ /* `nextline' points to the next free slot in this array.
+ `nlines' is the allocated size. */
+
+ nextline = linearray;
+
+ /* Parse the input file's data, and make entries for the lines. */
+
+ nextline = parsefile (infile, nextline, file_data, file_size);
+ if (nextline == 0)
+ {
+ error ("%s: not a texinfo index file", infile);
+ return;
+ }
+
+ /* Sort the lines. */
+
+ /* If we have enough space, find the first keyfield of each line in advance.
+ Make a `struct lineinfo' for each line, which records the keyfield
+ as well as the line, and sort them. */
+
+ lineinfo = (struct lineinfo *) malloc ((nextline - linearray) * sizeof (struct lineinfo));
+
+ if (lineinfo)
+ {
+ struct lineinfo *lp;
+ char **p;
+
+ for (lp = lineinfo, p = linearray; p != nextline; lp++, p++)
+ {
+ lp->text = *p;
+ lp->key.text = find_field (keyfields, *p, &lp->keylen);
+ if (keyfields->numeric)
+ lp->key.number = find_value (lp->key.text, lp->keylen);
+ }
+
+ qsort (lineinfo, nextline - linearray, sizeof (struct lineinfo), compare_prepared);
+
+ for (lp = lineinfo, p = linearray; p != nextline; lp++, p++)
+ *p = lp->text;
+
+ free (lineinfo);
+ }
+ else
+ qsort (linearray, nextline - linearray, sizeof (char *), compare_full);
+
+ /* Open the output file. */
+
+ if (outfile)
+ {
+ ostream = fopen (outfile, "w");
+ if (!ostream)
+ pfatal_with_name (outfile);
+ }
+
+ writelines (linearray, nextline - linearray, ostream);
+ if (outfile)
+ fclose (ostream);
+
+ free (linearray);
+ free (data);
+}
+
+/* Parse an input string in core into lines.
+ DATA is the input string, and SIZE is its length.
+ Data goes in LINEARRAY starting at NEXTLINE.
+ The value returned is the first entry in LINEARRAY still unused.
+ Value 0 means input file contents are invalid. */
+
+char **
+parsefile (filename, nextline, data, size)
+ char *filename;
+ char **nextline;
+ char *data;
+ long size;
+{
+ char *p, *end;
+ char **line = nextline;
+
+ p = data;
+ end = p + size;
+ *end = 0;
+
+ while (p != end)
+ {
+ if (p[0] != '\\' && p[0] != '@')
+ return 0;
+
+ *line = p;
+ while (*p && *p != '\n')
+ p++;
+ if (p != end)
+ p++;
+
+ line++;
+ if (line == linearray + nlines)
+ {
+ char **old = linearray;
+ linearray = (char **) xrealloc (linearray, sizeof (char *) * (nlines *= 4));
+ line += linearray - old;
+ }
+ }
+
+ return line;
+}
+
+/* Indexification is a filter applied to the sorted lines
+ as they are being written to the output file.
+ Multiple entries for the same name, with different page numbers,
+ get combined into a single entry with multiple page numbers.
+ The first braced field, which is used for sorting, is discarded.
+ However, its first character is examined, folded to lower case,
+ and if it is different from that in the previous line fed to us
+ a \initial line is written with one argument, the new initial.
+
+ If an entry has four braced fields, then the second and third
+ constitute primary and secondary names.
+ In this case, each change of primary name
+ generates a \primary line which contains only the primary name,
+ and in between these are \secondary lines which contain
+ just a secondary name and page numbers. */
+
+/* The last primary name we wrote a \primary entry for.
+ If only one level of indexing is being done, this is the last name seen. */
+char *lastprimary;
+/* Length of storage allocated for lastprimary. */
+int lastprimarylength;
+
+/* Similar, for the secondary name. */
+char *lastsecondary;
+int lastsecondarylength;
+
+/* Zero if we are not in the middle of writing an entry.
+ One if we have written the beginning of an entry but have not
+ yet written any page numbers into it.
+ Greater than one if we have written the beginning of an entry
+ plus at least one page number. */
+int pending;
+
+/* The initial (for sorting purposes) of the last primary entry written.
+ When this changes, a \initial {c} line is written */
+
+char *lastinitial;
+
+int lastinitiallength;
+
+/* When we need a string of length 1 for the value of lastinitial,
+ store it here. */
+
+char lastinitial1[2];
+
+/* Initialize static storage for writing an index. */
+
+static void
+xbzero(s, n)
+ char *s;
+ int n;
+{
+ register char *p;
+ for (p = s; n--; )
+ *p++ = '\0';
+}
+
+void
+init_index ()
+{
+ pending = 0;
+ lastinitial = lastinitial1;
+ lastinitial1[0] = 0;
+ lastinitial1[1] = 0;
+ lastinitiallength = 0;
+ lastprimarylength = 100;
+ lastprimary = (char *) xmalloc (lastprimarylength + 1);
+ xbzero (lastprimary, lastprimarylength + 1);
+ lastsecondarylength = 100;
+ lastsecondary = (char *) xmalloc (lastsecondarylength + 1);
+ xbzero (lastsecondary, lastsecondarylength + 1);
+}
+
+/* Indexify. Merge entries for the same name,
+ insert headers for each initial character, etc. */
+
+void
+indexify (line, ostream)
+ char *line;
+ FILE *ostream;
+{
+ char *primary, *secondary, *pagenumber;
+ int primarylength, secondarylength = 0, pagelength;
+ int nosecondary;
+ int initiallength;
+ char *initial;
+ char initial1[2];
+ register char *p;
+
+ /* First, analyze the parts of the entry fed to us this time. */
+
+ p = find_braced_pos (line, 0, 0, 0);
+ if (*p == '{')
+ {
+ initial = p;
+ /* Get length of inner pair of braces starting at `p',
+ including that inner pair of braces. */
+ initiallength = find_braced_end (p + 1) + 1 - p;
+ }
+ else
+ {
+ initial = initial1;
+ initial1[0] = *p;
+ initial1[1] = 0;
+ initiallength = 1;
+
+ if (initial1[0] >= 'a' && initial1[0] <= 'z')
+ initial1[0] -= 040;
+ }
+
+ pagenumber = find_braced_pos (line, 1, 0, 0);
+ pagelength = find_braced_end (pagenumber) - pagenumber;
+ if (pagelength == 0)
+ abort ();
+
+ primary = find_braced_pos (line, 2, 0, 0);
+ primarylength = find_braced_end (primary) - primary;
+
+ secondary = find_braced_pos (line, 3, 0, 0);
+ nosecondary = !*secondary;
+ if (!nosecondary)
+ secondarylength = find_braced_end (secondary) - secondary;
+
+ /* If the primary is different from before, make a new primary entry. */
+ if (strncmp (primary, lastprimary, primarylength))
+ {
+ /* Close off current secondary entry first, if one is open. */
+ if (pending)
+ {
+ fputs ("}\n", ostream);
+ pending = 0;
+ }
+
+ /* If this primary has a different initial, include an entry for
+ the initial. */
+ if (initiallength != lastinitiallength ||
+ strncmp (initial, lastinitial, initiallength))
+ {
+ fprintf (ostream, "\\initial {");
+ fwrite (initial, 1, initiallength, ostream);
+ fprintf (ostream, "}\n", initial);
+ if (initial == initial1)
+ {
+ lastinitial = lastinitial1;
+ *lastinitial1 = *initial1;
+ }
+ else
+ {
+ lastinitial = initial;
+ }
+ lastinitiallength = initiallength;
+ }
+
+ /* Make the entry for the primary. */
+ if (nosecondary)
+ fputs ("\\entry {", ostream);
+ else
+ fputs ("\\primary {", ostream);
+ fwrite (primary, primarylength, 1, ostream);
+ if (nosecondary)
+ {
+ fputs ("}{", ostream);
+ pending = 1;
+ }
+ else
+ fputs ("}\n", ostream);
+
+ /* Record name of most recent primary. */
+ if (lastprimarylength < primarylength)
+ {
+ lastprimarylength = primarylength + 100;
+ lastprimary = (char *) xrealloc (lastprimary,
+ 1 + lastprimarylength);
+ }
+ strncpy (lastprimary, primary, primarylength);
+ lastprimary[primarylength] = 0;
+
+ /* There is no current secondary within this primary, now. */
+ lastsecondary[0] = 0;
+ }
+
+ /* Should not have an entry with no subtopic following one with a subtopic. */
+
+ if (nosecondary && *lastsecondary)
+ error ("entry %s follows an entry with a secondary name", line);
+
+ /* Start a new secondary entry if necessary. */
+ if (!nosecondary && strncmp (secondary, lastsecondary, secondarylength))
+ {
+ if (pending)
+ {
+ fputs ("}\n", ostream);
+ pending = 0;
+ }
+
+ /* Write the entry for the secondary. */
+ fputs ("\\secondary {", ostream);
+ fwrite (secondary, secondarylength, 1, ostream);
+ fputs ("}{", ostream);
+ pending = 1;
+
+ /* Record name of most recent secondary. */
+ if (lastsecondarylength < secondarylength)
+ {
+ lastsecondarylength = secondarylength + 100;
+ lastsecondary = (char *) xrealloc (lastsecondary,
+ 1 + lastsecondarylength);
+ }
+ strncpy (lastsecondary, secondary, secondarylength);
+ lastsecondary[secondarylength] = 0;
+ }
+
+ /* Here to add one more page number to the current entry. */
+ if (pending++ != 1)
+ fputs (", ", ostream); /* Punctuate first, if this is not the first. */
+ fwrite (pagenumber, pagelength, 1, ostream);
+}
+
+/* Close out any unfinished output entry. */
+
+void
+finish_index (ostream)
+ FILE *ostream;
+{
+ if (pending)
+ fputs ("}\n", ostream);
+ free (lastprimary);
+ free (lastsecondary);
+}
+
+/* Copy the lines in the sorted order.
+ Each line is copied out of the input file it was found in. */
+
+void
+writelines (linearray, nlines, ostream)
+ char **linearray;
+ int nlines;
+ FILE *ostream;
+{
+ char **stop_line = linearray + nlines;
+ char **next_line;
+
+ init_index ();
+
+ /* Output the text of the lines, and free the buffer space. */
+
+ for (next_line = linearray; next_line != stop_line; next_line++)
+ {
+ /* If -u was specified, output the line only if distinct from previous one. */
+ if (next_line == linearray
+ /* Compare previous line with this one, using only the
+ explicitly specd keyfields. */
+ || compare_general (*(next_line - 1), *next_line, 0L, 0L, num_keyfields - 1))
+ {
+ char *p = *next_line;
+ char c;
+
+ while ((c = *p++) && c != '\n')
+ /* Do nothing. */ ;
+ *(p - 1) = 0;
+ indexify (*next_line, ostream);
+ }
+ }
+
+ finish_index (ostream);
+}
+
+/* Assume (and optionally verify) that each input file is sorted;
+ merge them and output the result.
+ Returns nonzero if any input file fails to be sorted.
+
+ This is the high-level interface that can handle an unlimited
+ number of files. */
+
+#define MAX_DIRECT_MERGE 10
+
+int
+merge_files (infiles, nfiles, outfile)
+ char **infiles;
+ int nfiles;
+ char *outfile;
+{
+ char **tempfiles;
+ int ntemps;
+ int i;
+ int value = 0;
+ int start_tempcount = tempcount;
+
+ if (nfiles <= MAX_DIRECT_MERGE)
+ return merge_direct (infiles, nfiles, outfile);
+
+ /* Merge groups of MAX_DIRECT_MERGE input files at a time,
+ making a temporary file to hold each group's result. */
+
+ ntemps = (nfiles + MAX_DIRECT_MERGE - 1) / MAX_DIRECT_MERGE;
+ tempfiles = (char **) xmalloc (ntemps * sizeof (char *));
+ for (i = 0; i < ntemps; i++)
+ {
+ int nf = MAX_DIRECT_MERGE;
+ if (i + 1 == ntemps)
+ nf = nfiles - i * MAX_DIRECT_MERGE;
+ tempfiles[i] = maketempname (++tempcount);
+ value |= merge_direct (&infiles[i * MAX_DIRECT_MERGE], nf, tempfiles[i]);
+ }
+
+ /* All temporary files that existed before are no longer needed
+ since their contents have been merged into our new tempfiles.
+ So delete them. */
+ flush_tempfiles (start_tempcount);
+
+ /* Now merge the temporary files we created. */
+
+ merge_files (tempfiles, ntemps, outfile);
+
+ free (tempfiles);
+
+ return value;
+}
+
+/* Assume (and optionally verify) that each input file is sorted;
+ merge them and output the result.
+ Returns nonzero if any input file fails to be sorted.
+
+ This version of merging will not work if the number of
+ input files gets too high. Higher level functions
+ use it only with a bounded number of input files. */
+
+int
+merge_direct (infiles, nfiles, outfile)
+ char **infiles;
+ int nfiles;
+ char *outfile;
+{
+ struct linebuffer *lb1, *lb2;
+ struct linebuffer **thisline, **prevline;
+ FILE **streams;
+ int i;
+ int nleft;
+ int lossage = 0;
+ int *file_lossage;
+ struct linebuffer *prev_out = 0;
+ FILE *ostream = stdout;
+
+ if (outfile)
+ {
+ ostream = fopen (outfile, "w");
+ }
+ if (!ostream)
+ pfatal_with_name (outfile);
+
+ init_index ();
+
+ if (nfiles == 0)
+ {
+ if (outfile)
+ fclose (ostream);
+ return 0;
+ }
+
+ /* For each file, make two line buffers.
+ Also, for each file, there is an element of `thisline'
+ which points at any time to one of the file's two buffers,
+ and an element of `prevline' which points to the other buffer.
+ `thisline' is supposed to point to the next available line from the file,
+ while `prevline' holds the last file line used,
+ which is remembered so that we can verify that the file is properly sorted. */
+
+ /* lb1 and lb2 contain one buffer each per file. */
+ lb1 = (struct linebuffer *) xmalloc (nfiles * sizeof (struct linebuffer));
+ lb2 = (struct linebuffer *) xmalloc (nfiles * sizeof (struct linebuffer));
+
+ /* thisline[i] points to the linebuffer holding the next available line in file i,
+ or is zero if there are no lines left in that file. */
+ thisline = (struct linebuffer **)
+ xmalloc (nfiles * sizeof (struct linebuffer *));
+ /* prevline[i] points to the linebuffer holding the last used line
+ from file i. This is just for verifying that file i is properly
+ sorted. */
+ prevline = (struct linebuffer **)
+ xmalloc (nfiles * sizeof (struct linebuffer *));
+ /* streams[i] holds the input stream for file i. */
+ streams = (FILE **) xmalloc (nfiles * sizeof (FILE *));
+ /* file_lossage[i] is nonzero if we already know file i is not
+ properly sorted. */
+ file_lossage = (int *) xmalloc (nfiles * sizeof (int));
+
+ /* Allocate and initialize all that storage. */
+
+ for (i = 0; i < nfiles; i++)
+ {
+ initbuffer (&lb1[i]);
+ initbuffer (&lb2[i]);
+ thisline[i] = &lb1[i];
+ prevline[i] = &lb2[i];
+ file_lossage[i] = 0;
+ streams[i] = fopen (infiles[i], "r");
+ if (!streams[i])
+ pfatal_with_name (infiles[i]);
+
+ readline (thisline[i], streams[i]);
+ }
+
+ /* Keep count of number of files not at eof. */
+ nleft = nfiles;
+
+ while (nleft)
+ {
+ struct linebuffer *best = 0;
+ struct linebuffer *exch;
+ int bestfile = -1;
+ int i;
+
+ /* Look at the next avail line of each file; choose the least one. */
+
+ for (i = 0; i < nfiles; i++)
+ {
+ if (thisline[i] &&
+ (!best ||
+ 0 < compare_general (best->buffer, thisline[i]->buffer,
+ (long) bestfile, (long) i, num_keyfields)))
+ {
+ best = thisline[i];
+ bestfile = i;
+ }
+ }
+
+ /* Output that line, unless it matches the previous one and we
+ don't want duplicates. */
+
+ if (!(prev_out &&
+ !compare_general (prev_out->buffer,
+ best->buffer, 0L, 1L, num_keyfields - 1)))
+ indexify (best->buffer, ostream);
+ prev_out = best;
+
+ /* Now make the line the previous of its file, and fetch a new
+ line from that file. */
+
+ exch = prevline[bestfile];
+ prevline[bestfile] = thisline[bestfile];
+ thisline[bestfile] = exch;
+
+ while (1)
+ {
+ /* If the file has no more, mark it empty. */
+
+ if (feof (streams[bestfile]))
+ {
+ thisline[bestfile] = 0;
+ /* Update the number of files still not empty. */
+ nleft--;
+ break;
+ }
+ readline (thisline[bestfile], streams[bestfile]);
+ if (thisline[bestfile]->buffer[0] || !feof (streams[bestfile]))
+ break;
+ }
+ }
+
+ finish_index (ostream);
+
+ /* Free all storage and close all input streams. */
+
+ for (i = 0; i < nfiles; i++)
+ {
+ fclose (streams[i]);
+ free (lb1[i].buffer);
+ free (lb2[i].buffer);
+ }
+ free (file_lossage);
+ free (lb1);
+ free (lb2);
+ free (thisline);
+ free (prevline);
+ free (streams);
+
+ if (outfile)
+ fclose (ostream);
+
+ return lossage;
+}
+
+/* Print error message and exit. */
+
+void
+fatal (s1, s2)
+ char *s1, *s2;
+{
+ error (s1, s2);
+ exit (TI_FATAL_ERROR);
+}
+
+/* Print error message. S1 is printf control string, S2 is arg for it. */
+
+void
+error (s1, s2)
+ char *s1, *s2;
+{
+ printf ("%s: ", program_name);
+ printf (s1, s2);
+ printf ("\n");
+}
+
+#if !defined (HAVE_STRERROR)
+static char *
+strerror (n)
+ int n;
+{
+ static char ebuf[40];
+
+ if (n < sys_nerr)
+ return sys_errlist[n];
+ else
+ {
+ sprintf (ebuf, "Unknown error %d", n);
+ return ebuf;
+ }
+}
+#endif
+
+void
+perror_with_name (name)
+ char *name;
+{
+ char *s;
+
+ s = concat ("", strerror (errno), " for %s");
+ error (s, name);
+}
+
+void
+pfatal_with_name (name)
+ char *name;
+{
+ char *s;
+
+ s = concat ("", strerror (errno), " for %s");
+ fatal (s, name);
+}
+
+/* Return a newly-allocated string whose contents concatenate those of
+ S1, S2, S3. */
+
+char *
+concat (s1, s2, s3)
+ char *s1, *s2, *s3;
+{
+ int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
+ char *result = (char *) xmalloc (len1 + len2 + len3 + 1);
+
+ strcpy (result, s1);
+ strcpy (result + len1, s2);
+ strcpy (result + len1 + len2, s3);
+ *(result + len1 + len2 + len3) = 0;
+
+ return result;
+}
+
+/* Just like malloc, but kills the program in case of fatal error. */
+void *
+xmalloc (nbytes)
+ int nbytes;
+{
+ void *temp = (void *) malloc (nbytes);
+
+ if (nbytes && temp == (void *)NULL)
+ memory_error ("xmalloc", nbytes);
+
+ return (temp);
+}
+
+/* Like realloc (), but barfs if there isn't enough memory. */
+void *
+xrealloc (pointer, nbytes)
+ void *pointer;
+ int nbytes;
+{
+ void *temp;
+
+ if (!pointer)
+ temp = (void *)xmalloc (nbytes);
+ else
+ temp = (void *)realloc (pointer, nbytes);
+
+ if (nbytes && !temp)
+ memory_error ("xrealloc", nbytes);
+
+ return (temp);
+}
+
+memory_error (callers_name, bytes_wanted)
+ char *callers_name;
+ int bytes_wanted;
+{
+ char printable_string[80];
+
+ sprintf (printable_string,
+ "Virtual memory exhausted in %s ()! Needed %d bytes.",
+ callers_name, bytes_wanted);
+
+ error (printable_string, "");
+ abort ();
+}
diff --git a/gnu/lib/libreadline/emacs_keymap.c b/gnu/lib/libreadline/emacs_keymap.c
new file mode 100644
index 000000000000..ab058fc0f7eb
--- /dev/null
+++ b/gnu/lib/libreadline/emacs_keymap.c
@@ -0,0 +1,885 @@
+/* emacs_keymap.c -- the keymap for emacs_mode in readline (). */
+
+/* Copyright (C) 1987, 1989, 1992 Free Software Foundation, Inc.
+
+ This file is part of the GNU Readline Library, a library for
+ reading lines of text with interactive input and history editing.
+
+ The GNU Readline 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 1, or
+ (at your option) any later version.
+
+ The GNU Readline 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.
+
+ The GNU General Public License is often shipped with GNU software, and
+ is generally kept in a file called COPYING or LICENSE. If you do not
+ have a copy of the license, write to the Free Software Foundation,
+ 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#if !defined (BUFSIZ)
+#include <stdio.h>
+#endif /* !BUFSIZ */
+
+#include <readline/readline.h>
+
+/* An array of function pointers, one for each possible key.
+ If the type byte is ISKMAP, then the pointer is the address of
+ a keymap. */
+
+KEYMAP_ENTRY_ARRAY emacs_standard_keymap = {
+
+ /* Control keys. */
+ { ISFUNC, (Function *)0x0 }, /* Control-@ */
+ { ISFUNC, rl_beg_of_line }, /* Control-a */
+ { ISFUNC, rl_backward }, /* Control-b */
+ { ISFUNC, (Function *)0x0 }, /* Control-c */
+ { ISFUNC, rl_delete }, /* Control-d */
+ { ISFUNC, rl_end_of_line }, /* Control-e */
+ { ISFUNC, rl_forward }, /* Control-f */
+ { ISFUNC, rl_abort }, /* Control-g */
+ { ISFUNC, rl_rubout }, /* Control-h */
+ { ISFUNC, rl_complete }, /* Control-i */
+ { ISFUNC, rl_newline }, /* Control-j */
+ { ISFUNC, rl_kill_line }, /* Control-k */
+ { ISFUNC, rl_clear_screen }, /* Control-l */
+ { ISFUNC, rl_newline }, /* Control-m */
+ { ISFUNC, rl_get_next_history }, /* Control-n */
+ { ISFUNC, (Function *)0x0 }, /* Control-o */
+ { ISFUNC, rl_get_previous_history }, /* Control-p */
+ { ISFUNC, rl_quoted_insert }, /* Control-q */
+ { ISFUNC, rl_reverse_search_history }, /* Control-r */
+ { ISFUNC, rl_forward_search_history }, /* Control-s */
+ { ISFUNC, rl_transpose_chars }, /* Control-t */
+ { ISFUNC, rl_unix_line_discard }, /* Control-u */
+ { ISFUNC, rl_quoted_insert }, /* Control-v */
+ { ISFUNC, rl_unix_word_rubout }, /* Control-w */
+ { ISKMAP, (Function *)emacs_ctlx_keymap }, /* Control-x */
+ { ISFUNC, rl_yank }, /* Control-y */
+ { ISFUNC, (Function *)0x0 }, /* Control-z */
+ { ISKMAP, (Function *)emacs_meta_keymap }, /* Control-[ */
+ { ISFUNC, (Function *)0x0 }, /* Control-\ */
+ { ISFUNC, (Function *)0x0 }, /* Control-] */
+ { ISFUNC, (Function *)0x0 }, /* Control-^ */
+ { ISFUNC, rl_undo_command }, /* Control-_ */
+
+ /* The start of printing characters. */
+ { ISFUNC, rl_insert }, /* SPACE */
+ { ISFUNC, rl_insert }, /* ! */
+ { ISFUNC, rl_insert }, /* " */
+ { ISFUNC, rl_insert }, /* # */
+ { ISFUNC, rl_insert }, /* $ */
+ { ISFUNC, rl_insert }, /* % */
+ { ISFUNC, rl_insert }, /* & */
+ { ISFUNC, rl_insert }, /* ' */
+ { ISFUNC, rl_insert }, /* ( */
+#if defined (PAREN_MATCHING)
+ { ISFUNC, rl_insert_close }, /* ) */
+#else
+ { ISFUNC, rl_insert }, /* ) */
+#endif /* !PAREN_MATCHING */
+ { ISFUNC, rl_insert }, /* * */
+ { ISFUNC, rl_insert }, /* + */
+ { ISFUNC, r