summaryrefslogtreecommitdiff
path: root/readline-4.3.orig/complete.c
diff options
context:
space:
mode:
authorcvs2git <rtems-devel@rtems.org>2007-03-13 20:31:41 +0000
committercvs2git <rtems-devel@rtems.org>2007-03-13 20:31:41 +0000
commit5df53d685b7ff23a43b58969449d2289cf2e7628 (patch)
tree8a4294cf7e7528cf173db4332483814ef417736b /readline-4.3.orig/complete.c
parent66d25567fe424bb55fde088f3d45e9ed044400c1 (diff)
This commit was manufactured by cvs2svn to create tag 'rtems-addon-rtems-addon-packages-4-7-99-1
packages-4-7-99-1'. Sprout from ncurses-gnu 2002-12-19 15:34:54 UTC Eric Norum <WENorum@lbl.gov> 'Latest ncurses add-on' Cherrypick from addons 2002-06-28 21:58:41 UTC Eric Norum <WENorum@lbl.gov> 'Useful add-on libraries': README RTEMS_Makefiles/Makefile.avl RTEMS_Makefiles/Makefile.common RTEMS_Makefiles/Makefile.site avl-1.4.0/AUTHORS avl-1.4.0/COPYING avl-1.4.0/ChangeLog avl-1.4.0/INSTALL avl-1.4.0/Makefile.am avl-1.4.0/Makefile.in avl-1.4.0/NEWS avl-1.4.0/README avl-1.4.0/THANKS avl-1.4.0/TODO avl-1.4.0/aclocal.m4 avl-1.4.0/avl.c avl-1.4.0/avl.h avl-1.4.0/avl.html avl-1.4.0/avl.info avl-1.4.0/avl.texinfo avl-1.4.0/avl.text avl-1.4.0/avlt.c avl-1.4.0/avlt.h avl-1.4.0/avltr.c avl-1.4.0/avltr.h avl-1.4.0/configure avl-1.4.0/configure.in avl-1.4.0/install-sh avl-1.4.0/missing avl-1.4.0/mkinstalldirs avl-1.4.0/rb.c avl-1.4.0/rb.h avl-1.4.0/texinfo.tex avl-1.4.0/thread-test.c examples/avl/BuildTests.sh examples/avl/Makefile examples/avl/README examples/avl/init.c examples/ncurses/BuildTests.sh examples/ncurses/Makefile examples/ncurses/README examples/ncurses/init.c examples/readline/.gdbinit examples/readline/Makefile examples/readline/init.c examples/readline/rlgeneric.c ncurses-5.2/ANNOUNCE ncurses-5.2/Ada95/Makefile.in ncurses-5.2/Ada95/README ncurses-5.2/Ada95/TODO ncurses-5.2/Ada95/gen/Makefile.in ncurses-5.2/Ada95/gen/gen.c ncurses-5.2/Ada95/gen/html.m4 ncurses-5.2/Ada95/gen/normal.m4 ncurses-5.2/Ada95/gen/table.m4 ncurses-5.2/Ada95/gen/terminal_interface-curses-aux.ads.m4 ncurses-5.2/Ada95/gen/terminal_interface-curses-forms-field_types.ads.m4 ncurses-5.2/Ada95/gen/terminal_interface-curses-forms-field_user_data.ads.m4 ncurses-5.2/Ada95/gen/terminal_interface-curses-forms-form_user_data.ads.m4 ncurses-5.2/Ada95/gen/terminal_interface-curses-forms.ads.m4 ncurses-5.2/Ada95/gen/terminal_interface-curses-menus-item_user_data.ads.m4 ncurses-5.2/Ada95/gen/terminal_interface-curses-menus-menu_user_data.ads.m4 ncurses-5.2/Ada95/gen/terminal_interface-curses-menus.ads.m4 ncurses-5.2/Ada95/gen/terminal_interface-curses-mouse.ads.m4 ncurses-5.2/Ada95/gen/terminal_interface-curses-panels-user_data.ads.m4 ncurses-5.2/Ada95/gen/terminal_interface-curses-panels.ads.m4 ncurses-5.2/Ada95/gen/terminal_interface-curses.ads.m4 ncurses-5.2/Ada95/samples/Makefile.in ncurses-5.2/Ada95/samples/README ncurses-5.2/Ada95/samples/explain.txt ncurses-5.2/Ada95/samples/rain.adb ncurses-5.2/Ada95/samples/rain.ads ncurses-5.2/Ada95/samples/sample-curses_demo-attributes.adb ncurses-5.2/Ada95/samples/sample-curses_demo-attributes.ads ncurses-5.2/Ada95/samples/sample-curses_demo-mouse.adb ncurses-5.2/Ada95/samples/sample-curses_demo-mouse.ads ncurses-5.2/Ada95/samples/sample-curses_demo.adb ncurses-5.2/Ada95/samples/sample-curses_demo.ads ncurses-5.2/Ada95/samples/sample-explanation.adb ncurses-5.2/Ada95/samples/sample-explanation.ads ncurses-5.2/Ada95/samples/sample-form_demo-aux.adb ncurses-5.2/Ada95/samples/sample-form_demo-aux.ads ncurses-5.2/Ada95/samples/sample-form_demo-handler.adb ncurses-5.2/Ada95/samples/sample-form_demo-handler.ads ncurses-5.2/Ada95/samples/sample-form_demo.adb ncurses-5.2/Ada95/samples/sample-form_demo.ads ncurses-5.2/Ada95/samples/sample-function_key_setting.adb ncurses-5.2/Ada95/samples/sample-function_key_setting.ads ncurses-5.2/Ada95/samples/sample-header_handler.adb ncurses-5.2/Ada95/samples/sample-header_handler.ads ncurses-5.2/Ada95/samples/sample-helpers.adb ncurses-5.2/Ada95/samples/sample-helpers.ads ncurses-5.2/Ada95/samples/sample-keyboard_handler.adb ncurses-5.2/Ada95/samples/sample-keyboard_handler.ads ncurses-5.2/Ada95/samples/sample-manifest.ads ncurses-5.2/Ada95/samples/sample-menu_demo-aux.adb ncurses-5.2/Ada95/samples/sample-menu_demo-aux.ads ncurses-5.2/Ada95/samples/sample-menu_demo-handler.adb ncurses-5.2/Ada95/samples/sample-menu_demo-handler.ads ncurses-5.2/Ada95/samples/sample-menu_demo.adb ncurses-5.2/Ada95/samples/sample-menu_demo.ads ncurses-5.2/Ada95/samples/sample-my_field_type.adb ncurses-5.2/Ada95/samples/sample-my_field_type.ads ncurses-5.2/Ada95/samples/sample-text_io_demo.adb ncurses-5.2/Ada95/samples/sample-text_io_demo.ads ncurses-5.2/Ada95/samples/sample.adb ncurses-5.2/Ada95/samples/sample.ads ncurses-5.2/Ada95/samples/status.adb ncurses-5.2/Ada95/samples/status.ads ncurses-5.2/Ada95/samples/tour.adb ncurses-5.2/Ada95/samples/tour.ads ncurses-5.2/Ada95/src/Makefile.in ncurses-5.2/Ada95/src/terminal_interface-curses-aux.adb ncurses-5.2/Ada95/src/terminal_interface-curses-forms-field_types-alpha.adb ncurses-5.2/Ada95/src/terminal_interface-curses-forms-field_types-alpha.ads ncurses-5.2/Ada95/src/terminal_interface-curses-forms-field_types-alphanumeric.adb ncurses-5.2/Ada95/src/terminal_interface-curses-forms-field_types-alphanumeric.ads ncurses-5.2/Ada95/src/terminal_interface-curses-forms-field_types-enumeration-ada.adb ncurses-5.2/Ada95/src/terminal_interface-curses-forms-field_types-enumeration-ada.ads ncurses-5.2/Ada95/src/terminal_interface-curses-forms-field_types-enumeration.adb ncurses-5.2/Ada95/src/terminal_interface-curses-forms-field_types-enumeration.ads ncurses-5.2/Ada95/src/terminal_interface-curses-forms-field_types-intfield.adb ncurses-5.2/Ada95/src/terminal_interface-curses-forms-field_types-intfield.ads ncurses-5.2/Ada95/src/terminal_interface-curses-forms-field_types-ipv4_address.adb ncurses-5.2/Ada95/src/terminal_interface-curses-forms-field_types-ipv4_address.ads ncurses-5.2/Ada95/src/terminal_interface-curses-forms-field_types-numeric.adb ncurses-5.2/Ada95/src/terminal_interface-curses-forms-field_types-numeric.ads ncurses-5.2/Ada95/src/terminal_interface-curses-forms-field_types-regexp.adb ncurses-5.2/Ada95/src/terminal_interface-curses-forms-field_types-regexp.ads ncurses-5.2/Ada95/src/terminal_interface-curses-forms-field_types-user-choice.adb ncurses-5.2/Ada95/src/terminal_interface-curses-forms-field_types-user-choice.ads ncurses-5.2/Ada95/src/terminal_interface-curses-forms-field_types-user.adb ncurses-5.2/Ada95/src/terminal_interface-curses-forms-field_types-user.ads ncurses-5.2/Ada95/src/terminal_interface-curses-forms-field_types.adb ncurses-5.2/Ada95/src/terminal_interface-curses-forms-field_user_data.adb ncurses-5.2/Ada95/src/terminal_interface-curses-forms-form_user_data.adb ncurses-5.2/Ada95/src/terminal_interface-curses-forms.adb ncurses-5.2/Ada95/src/terminal_interface-curses-menus-item_user_data.adb ncurses-5.2/Ada95/src/terminal_interface-curses-menus-menu_user_data.adb ncurses-5.2/Ada95/src/terminal_interface-curses-menus.adb ncurses-5.2/Ada95/src/terminal_interface-curses-mouse.adb ncurses-5.2/Ada95/src/terminal_interface-curses-panels-user_data.adb ncurses-5.2/Ada95/src/terminal_interface-curses-panels.adb ncurses-5.2/Ada95/src/terminal_interface-curses-text_io-aux.adb ncurses-5.2/Ada95/src/terminal_interface-curses-text_io-aux.ads ncurses-5.2/Ada95/src/terminal_interface-curses-text_io-complex_io.adb ncurses-5.2/Ada95/src/terminal_interface-curses-text_io-complex_io.ads ncurses-5.2/Ada95/src/terminal_interface-curses-text_io-decimal_io.adb ncurses-5.2/Ada95/src/terminal_interface-curses-text_io-decimal_io.ads ncurses-5.2/Ada95/src/terminal_interface-curses-text_io-enumeration_io.adb ncurses-5.2/Ada95/src/terminal_interface-curses-text_io-enumeration_io.ads ncurses-5.2/Ada95/src/terminal_interface-curses-text_io-fixed_io.adb ncurses-5.2/Ada95/src/terminal_interface-curses-text_io-fixed_io.ads ncurses-5.2/Ada95/src/terminal_interface-curses-text_io-float_io.adb ncurses-5.2/Ada95/src/terminal_interface-curses-text_io-float_io.ads ncurses-5.2/Ada95/src/terminal_interface-curses-text_io-integer_io.adb ncurses-5.2/Ada95/src/terminal_interface-curses-text_io-integer_io.ads ncurses-5.2/Ada95/src/terminal_interface-curses-text_io-modular_io.adb ncurses-5.2/Ada95/src/terminal_interface-curses-text_io-modular_io.ads ncurses-5.2/Ada95/src/terminal_interface-curses-text_io.adb ncurses-5.2/Ada95/src/terminal_interface-curses-text_io.ads ncurses-5.2/Ada95/src/terminal_interface-curses.adb ncurses-5.2/Ada95/src/terminal_interface.ads ncurses-5.2/INSTALL ncurses-5.2/MANIFEST ncurses-5.2/Makefile.glibc ncurses-5.2/Makefile.in ncurses-5.2/Makefile.os2 ncurses-5.2/NEWS ncurses-5.2/README ncurses-5.2/README.emx ncurses-5.2/README.glibc ncurses-5.2/TO-DO ncurses-5.2/aclocal.m4 ncurses-5.2/announce.html.in ncurses-5.2/c++/Makefile.in ncurses-5.2/c++/NEWS ncurses-5.2/c++/PROBLEMS ncurses-5.2/c++/README-first ncurses-5.2/c++/cursesapp.cc ncurses-5.2/c++/cursesapp.h ncurses-5.2/c++/cursesf.cc ncurses-5.2/c++/cursesf.h ncurses-5.2/c++/cursesm.cc ncurses-5.2/c++/cursesm.h ncurses-5.2/c++/cursesmain.cc ncurses-5.2/c++/cursesp.cc ncurses-5.2/c++/cursesp.h ncurses-5.2/c++/cursespad.cc ncurses-5.2/c++/cursesw.cc ncurses-5.2/c++/cursesw.h ncurses-5.2/c++/cursslk.cc ncurses-5.2/c++/cursslk.h ncurses-5.2/c++/demo.cc ncurses-5.2/c++/edit_cfg.sh ncurses-5.2/c++/etip.h.in ncurses-5.2/c++/headers ncurses-5.2/c++/internal.h ncurses-5.2/c++/modules ncurses-5.2/config.guess ncurses-5.2/config.sub ncurses-5.2/configure ncurses-5.2/configure.in ncurses-5.2/convert_configure.pl ncurses-5.2/dist.mk ncurses-5.2/doc/hackguide.doc ncurses-5.2/doc/html/Ada95.html ncurses-5.2/doc/html/ada/files.htm ncurses-5.2/doc/html/ada/files/T.htm ncurses-5.2/doc/html/ada/funcs.htm ncurses-5.2/doc/html/ada/funcs/A.htm ncurses-5.2/doc/html/ada/funcs/B.htm ncurses-5.2/doc/html/ada/funcs/C.htm ncurses-5.2/doc/html/ada/funcs/D.htm ncurses-5.2/doc/html/ada/funcs/E.htm ncurses-5.2/doc/html/ada/funcs/F.htm ncurses-5.2/doc/html/ada/funcs/G.htm ncurses-5.2/doc/html/ada/funcs/H.htm ncurses-5.2/doc/html/ada/funcs/I.htm ncurses-5.2/doc/html/ada/funcs/K.htm ncurses-5.2/doc/html/ada/funcs/L.htm ncurses-5.2/doc/html/ada/funcs/M.htm ncurses-5.2/doc/html/ada/funcs/N.htm ncurses-5.2/doc/html/ada/funcs/O.htm ncurses-5.2/doc/html/ada/funcs/P.htm ncurses-5.2/doc/html/ada/funcs/Q.htm ncurses-5.2/doc/html/ada/funcs/R.htm ncurses-5.2/doc/html/ada/funcs/S.htm ncurses-5.2/doc/html/ada/funcs/T.htm ncurses-5.2/doc/html/ada/funcs/U.htm ncurses-5.2/doc/html/ada/funcs/V.htm ncurses-5.2/doc/html/ada/funcs/W.htm ncurses-5.2/doc/html/ada/index.htm ncurses-5.2/doc/html/ada/main.htm ncurses-5.2/doc/html/ada/table.html ncurses-5.2/doc/html/ada/terminal_interface-curses-aux__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-aux__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_types-alpha__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_types-alpha__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_types-alphanumeric__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration-ada__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_types-enumeration__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_types-intfield__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_types-intfield__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_types-ipv4_address__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_types-numeric__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_types-numeric__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_types-regexp__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_types-regexp__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_types-user-choice__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_types-user-choice__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_types-user__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_types-user__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_types__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_types__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_user_data__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-field_user_data__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-form_user_data__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms-form_user_data__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-forms__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-menus-item_user_data__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-menus-item_user_data__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-menus-menu_user_data__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-menus-menu_user_data__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-menus__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-menus__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-mouse__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-mouse__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-panels-user_data__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-panels-user_data__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-panels__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-panels__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-text_io-aux__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-text_io-aux__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-text_io-complex_io__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-text_io-complex_io__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-text_io-decimal_io__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-text_io-decimal_io__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-text_io-enumeration_io__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-text_io-enumeration_io__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-text_io-fixed_io__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-text_io-fixed_io__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-text_io-float_io__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-text_io-float_io__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-text_io-integer_io__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-text_io-integer_io__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-text_io-modular_io__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-text_io-modular_io__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-text_io__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses-text_io__ads.htm ncurses-5.2/doc/html/ada/terminal_interface-curses__adb.htm ncurses-5.2/doc/html/ada/terminal_interface-curses__ads.htm ncurses-5.2/doc/html/ada/terminal_interface__ads.htm ncurses-5.2/doc/html/announce.html ncurses-5.2/doc/html/hackguide.html ncurses-5.2/doc/html/index.html ncurses-5.2/doc/html/man/captoinfo.1m.html ncurses-5.2/doc/html/man/clear.1.html ncurses-5.2/doc/html/man/curs_addch.3x.html ncurses-5.2/doc/html/man/curs_addchstr.3x.html ncurses-5.2/doc/html/man/curs_addstr.3x.html ncurses-5.2/doc/html/man/curs_attr.3x.html ncurses-5.2/doc/html/man/curs_beep.3x.html ncurses-5.2/doc/html/man/curs_bkgd.3x.html ncurses-5.2/doc/html/man/curs_border.3x.html ncurses-5.2/doc/html/man/curs_clear.3x.html ncurses-5.2/doc/html/man/curs_color.3x.html ncurses-5.2/doc/html/man/curs_delch.3x.html ncurses-5.2/doc/html/man/curs_deleteln.3x.html ncurses-5.2/doc/html/man/curs_extend.3x.html ncurses-5.2/doc/html/man/curs_getch.3x.html ncurses-5.2/doc/html/man/curs_getstr.3x.html ncurses-5.2/doc/html/man/curs_getyx.3x.html ncurses-5.2/doc/html/man/curs_inch.3x.html ncurses-5.2/doc/html/man/curs_inchstr.3x.html ncurses-5.2/doc/html/man/curs_initscr.3x.html ncurses-5.2/doc/html/man/curs_inopts.3x.html ncurses-5.2/doc/html/man/curs_insch.3x.html ncurses-5.2/doc/html/man/curs_insstr.3x.html ncurses-5.2/doc/html/man/curs_instr.3x.html ncurses-5.2/doc/html/man/curs_kernel.3x.html ncurses-5.2/doc/html/man/curs_mouse.3x.html ncurses-5.2/doc/html/man/curs_move.3x.html ncurses-5.2/doc/html/man/curs_outopts.3x.html ncurses-5.2/doc/html/man/curs_overlay.3x.html ncurses-5.2/doc/html/man/curs_pad.3x.html ncurses-5.2/doc/html/man/curs_print.3x.html ncurses-5.2/doc/html/man/curs_printw.3x.html ncurses-5.2/doc/html/man/curs_refresh.3x.html ncurses-5.2/doc/html/man/curs_scanw.3x.html ncurses-5.2/doc/html/man/curs_scr_dump.3x.html ncurses-5.2/doc/html/man/curs_scroll.3x.html ncurses-5.2/doc/html/man/curs_slk.3x.html ncurses-5.2/doc/html/man/curs_termattrs.3x.html ncurses-5.2/doc/html/man/curs_termcap.3x.html ncurses-5.2/doc/html/man/curs_terminfo.3x.html ncurses-5.2/doc/html/man/curs_touch.3x.html ncurses-5.2/doc/html/man/curs_trace.3x.html ncurses-5.2/doc/html/man/curs_util.3x.html ncurses-5.2/doc/html/man/curs_window.3x.html ncurses-5.2/doc/html/man/default_colors.3x.html ncurses-5.2/doc/html/man/define_key.3x.html ncurses-5.2/doc/html/man/form.3x.html ncurses-5.2/doc/html/man/form_cursor.3x.html ncurses-5.2/doc/html/man/form_data.3x.html ncurses-5.2/doc/html/man/form_driver.3x.html ncurses-5.2/doc/html/man/form_field.3x.html ncurses-5.2/doc/html/man/form_field_attributes.3x.html ncurses-5.2/doc/html/man/form_field_buffer.3x.html ncurses-5.2/doc/html/man/form_field_info.3x.html ncurses-5.2/doc/html/man/form_field_just.3x.html ncurses-5.2/doc/html/man/form_field_new.3x.html ncurses-5.2/doc/html/man/form_field_opts.3x.html ncurses-5.2/doc/html/man/form_field_userptr.3x.html ncurses-5.2/doc/html/man/form_field_validation.3x.html ncurses-5.2/doc/html/man/form_fieldtype.3x.html ncurses-5.2/doc/html/man/form_hook.3x.html ncurses-5.2/doc/html/man/form_new.3x.html ncurses-5.2/doc/html/man/form_new_page.3x.html ncurses-5.2/doc/html/man/form_opts.3x.html ncurses-5.2/doc/html/man/form_page.3x.html ncurses-5.2/doc/html/man/form_post.3x.html ncurses-5.2/doc/html/man/form_requestname.3x.html ncurses-5.2/doc/html/man/form_userptr.3x.html ncurses-5.2/doc/html/man/form_win.3x.html ncurses-5.2/doc/html/man/infocmp.1m.html ncurses-5.2/doc/html/man/infotocap.1m.html ncurses-5.2/doc/html/man/keybound.3x.html ncurses-5.2/doc/html/man/keyok.3x.html ncurses-5.2/doc/html/man/menu.3x.html ncurses-5.2/doc/html/man/menu_attributes.3x.html ncurses-5.2/doc/html/man/menu_cursor.3x.html ncurses-5.2/doc/html/man/menu_driver.3x.html ncurses-5.2/doc/html/man/menu_format.3x.html ncurses-5.2/doc/html/man/menu_hook.3x.html ncurses-5.2/doc/html/man/menu_items.3x.html ncurses-5.2/doc/html/man/menu_mark.3x.html ncurses-5.2/doc/html/man/menu_new.3x.html ncurses-5.2/doc/html/man/menu_opts.3x.html ncurses-5.2/doc/html/man/menu_pattern.3x.html ncurses-5.2/doc/html/man/menu_post.3x.html ncurses-5.2/doc/html/man/menu_requestname.3x.html ncurses-5.2/doc/html/man/menu_spacing.3x.html ncurses-5.2/doc/html/man/menu_userptr.3x.html ncurses-5.2/doc/html/man/menu_win.3x.html ncurses-5.2/doc/html/man/mitem_current.3x.html ncurses-5.2/doc/html/man/mitem_name.3x.html ncurses-5.2/doc/html/man/mitem_new.3x.html ncurses-5.2/doc/html/man/mitem_opts.3x.html ncurses-5.2/doc/html/man/mitem_userptr.3x.html ncurses-5.2/doc/html/man/mitem_value.3x.html ncurses-5.2/doc/html/man/mitem_visible.3x.html ncurses-5.2/doc/html/man/ncurses.3x.html ncurses-5.2/doc/html/man/panel.3x.html ncurses-5.2/doc/html/man/resizeterm.3x.html ncurses-5.2/doc/html/man/term.5.html ncurses-5.2/doc/html/man/term.7.html ncurses-5.2/doc/html/man/terminfo.5.html ncurses-5.2/doc/html/man/tic.1m.html ncurses-5.2/doc/html/man/toe.1m.html ncurses-5.2/doc/html/man/tput.1.html ncurses-5.2/doc/html/man/tset.1.html ncurses-5.2/doc/html/man/wresize.3x.html ncurses-5.2/doc/html/ncurses-intro.html ncurses-5.2/doc/ncurses-intro.doc ncurses-5.2/form/Makefile.in ncurses-5.2/form/READ.ME ncurses-5.2/form/fld_arg.c ncurses-5.2/form/fld_attr.c ncurses-5.2/form/fld_current.c ncurses-5.2/form/fld_def.c ncurses-5.2/form/fld_dup.c ncurses-5.2/form/fld_ftchoice.c ncurses-5.2/form/fld_ftlink.c ncurses-5.2/form/fld_info.c ncurses-5.2/form/fld_just.c ncurses-5.2/form/fld_link.c ncurses-5.2/form/fld_max.c ncurses-5.2/form/fld_move.c ncurses-5.2/form/fld_newftyp.c ncurses-5.2/form/fld_opts.c ncurses-5.2/form/fld_pad.c ncurses-5.2/form/fld_page.c ncurses-5.2/form/fld_stat.c ncurses-5.2/form/fld_type.c ncurses-5.2/form/fld_user.c ncurses-5.2/form/form.h ncurses-5.2/form/form.priv.h ncurses-5.2/form/frm_cursor.c ncurses-5.2/form/frm_data.c ncurses-5.2/form/frm_def.c ncurses-5.2/form/frm_driver.c ncurses-5.2/form/frm_hook.c ncurses-5.2/form/frm_opts.c ncurses-5.2/form/frm_page.c ncurses-5.2/form/frm_post.c ncurses-5.2/form/frm_req_name.c ncurses-5.2/form/frm_scale.c ncurses-5.2/form/frm_sub.c ncurses-5.2/form/frm_user.c ncurses-5.2/form/frm_win.c ncurses-5.2/form/fty_alnum.c ncurses-5.2/form/fty_alpha.c ncurses-5.2/form/fty_enum.c ncurses-5.2/form/fty_int.c ncurses-5.2/form/fty_ipv4.c ncurses-5.2/form/fty_num.c ncurses-5.2/form/fty_regex.c ncurses-5.2/form/headers ncurses-5.2/form/llib-lform ncurses-5.2/form/modules ncurses-5.2/include/Caps ncurses-5.2/include/MKhashsize.sh ncurses-5.2/include/MKncurses_def.sh ncurses-5.2/include/MKparametrized.sh ncurses-5.2/include/MKterm.h.awk.in ncurses-5.2/include/Makefile.in ncurses-5.2/include/capdefaults.c ncurses-5.2/include/curses.h.in ncurses-5.2/include/edit_cfg.sh ncurses-5.2/include/headers ncurses-5.2/include/nc_alloc.h ncurses-5.2/include/nc_panel.h ncurses-5.2/include/ncurses_cfg.hin ncurses-5.2/include/ncurses_defs ncurses-5.2/include/term_entry.h ncurses-5.2/include/termcap.h.in ncurses-5.2/include/tic.h ncurses-5.2/include/unctrl.h.in ncurses-5.2/install-sh ncurses-5.2/man/MKterminfo.sh ncurses-5.2/man/Makefile.in ncurses-5.2/man/captoinfo.1m ncurses-5.2/man/clear.1 ncurses-5.2/man/curs_addch.3x ncurses-5.2/man/curs_addchstr.3x ncurses-5.2/man/curs_addstr.3x ncurses-5.2/man/curs_attr.3x ncurses-5.2/man/curs_beep.3x ncurses-5.2/man/curs_bkgd.3x ncurses-5.2/man/curs_border.3x ncurses-5.2/man/curs_clear.3x ncurses-5.2/man/curs_color.3x ncurses-5.2/man/curs_delch.3x ncurses-5.2/man/curs_deleteln.3x ncurses-5.2/man/curs_extend.3x ncurses-5.2/man/curs_getch.3x ncurses-5.2/man/curs_getstr.3x ncurses-5.2/man/curs_getyx.3x ncurses-5.2/man/curs_inch.3x ncurses-5.2/man/curs_inchstr.3x ncurses-5.2/man/curs_initscr.3x ncurses-5.2/man/curs_inopts.3x ncurses-5.2/man/curs_insch.3x ncurses-5.2/man/curs_insstr.3x ncurses-5.2/man/curs_instr.3x ncurses-5.2/man/curs_kernel.3x ncurses-5.2/man/curs_mouse.3x ncurses-5.2/man/curs_move.3x ncurses-5.2/man/curs_outopts.3x ncurses-5.2/man/curs_overlay.3x ncurses-5.2/man/curs_pad.3x ncurses-5.2/man/curs_print.3x ncurses-5.2/man/curs_printw.3x ncurses-5.2/man/curs_refresh.3x ncurses-5.2/man/curs_scanw.3x ncurses-5.2/man/curs_scr_dump.3x ncurses-5.2/man/curs_scroll.3x ncurses-5.2/man/curs_slk.3x ncurses-5.2/man/curs_termattrs.3x ncurses-5.2/man/curs_termcap.3x ncurses-5.2/man/curs_terminfo.3x ncurses-5.2/man/curs_touch.3x ncurses-5.2/man/curs_trace.3x ncurses-5.2/man/curs_util.3x ncurses-5.2/man/curs_window.3x ncurses-5.2/man/default_colors.3x ncurses-5.2/man/define_key.3x ncurses-5.2/man/form.3x ncurses-5.2/man/form_cursor.3x ncurses-5.2/man/form_data.3x ncurses-5.2/man/form_driver.3x ncurses-5.2/man/form_field.3x ncurses-5.2/man/form_field_attributes.3x ncurses-5.2/man/form_field_buffer.3x ncurses-5.2/man/form_field_info.3x ncurses-5.2/man/form_field_just.3x ncurses-5.2/man/form_field_new.3x ncurses-5.2/man/form_field_opts.3x ncurses-5.2/man/form_field_userptr.3x ncurses-5.2/man/form_field_validation.3x ncurses-5.2/man/form_fieldtype.3x ncurses-5.2/man/form_hook.3x ncurses-5.2/man/form_new.3x ncurses-5.2/man/form_new_page.3x ncurses-5.2/man/form_opts.3x ncurses-5.2/man/form_page.3x ncurses-5.2/man/form_post.3x ncurses-5.2/man/form_requestname.3x ncurses-5.2/man/form_userptr.3x ncurses-5.2/man/form_win.3x ncurses-5.2/man/infocmp.1m ncurses-5.2/man/infotocap.1m ncurses-5.2/man/keybound.3x ncurses-5.2/man/keyok.3x ncurses-5.2/man/make_sed.sh ncurses-5.2/man/man_db.renames ncurses-5.2/man/manlinks.sed ncurses-5.2/man/menu.3x ncurses-5.2/man/menu_attributes.3x ncurses-5.2/man/menu_cursor.3x ncurses-5.2/man/menu_driver.3x ncurses-5.2/man/menu_format.3x ncurses-5.2/man/menu_hook.3x ncurses-5.2/man/menu_items.3x ncurses-5.2/man/menu_mark.3x ncurses-5.2/man/menu_new.3x ncurses-5.2/man/menu_opts.3x ncurses-5.2/man/menu_pattern.3x ncurses-5.2/man/menu_post.3x ncurses-5.2/man/menu_requestname.3x ncurses-5.2/man/menu_spacing.3x ncurses-5.2/man/menu_userptr.3x ncurses-5.2/man/menu_win.3x ncurses-5.2/man/mitem_current.3x ncurses-5.2/man/mitem_name.3x ncurses-5.2/man/mitem_new.3x ncurses-5.2/man/mitem_opts.3x ncurses-5.2/man/mitem_userptr.3x ncurses-5.2/man/mitem_value.3x ncurses-5.2/man/mitem_visible.3x ncurses-5.2/man/ncurses.3x ncurses-5.2/man/panel.3x ncurses-5.2/man/resizeterm.3x ncurses-5.2/man/term.5 ncurses-5.2/man/term.7 ncurses-5.2/man/terminfo.head ncurses-5.2/man/terminfo.tail ncurses-5.2/man/tic.1m ncurses-5.2/man/toe.1m ncurses-5.2/man/tput.1 ncurses-5.2/man/tset.1 ncurses-5.2/man/wresize.3x ncurses-5.2/menu/Makefile.in ncurses-5.2/menu/READ.ME ncurses-5.2/menu/eti.h ncurses-5.2/menu/headers ncurses-5.2/menu/llib-lmenu ncurses-5.2/menu/m_attribs.c ncurses-5.2/menu/m_cursor.c ncurses-5.2/menu/m_driver.c ncurses-5.2/menu/m_format.c ncurses-5.2/menu/m_global.c ncurses-5.2/menu/m_hook.c ncurses-5.2/menu/m_item_cur.c ncurses-5.2/menu/m_item_nam.c ncurses-5.2/menu/m_item_new.c ncurses-5.2/menu/m_item_opt.c ncurses-5.2/menu/m_item_top.c ncurses-5.2/menu/m_item_use.c ncurses-5.2/menu/m_item_val.c ncurses-5.2/menu/m_item_vis.c ncurses-5.2/menu/m_items.c ncurses-5.2/menu/m_new.c ncurses-5.2/menu/m_opts.c ncurses-5.2/menu/m_pad.c ncurses-5.2/menu/m_pattern.c ncurses-5.2/menu/m_post.c ncurses-5.2/menu/m_req_name.c ncurses-5.2/menu/m_scale.c ncurses-5.2/menu/m_spacing.c ncurses-5.2/menu/m_sub.c ncurses-5.2/menu/m_userptr.c ncurses-5.2/menu/m_win.c ncurses-5.2/menu/menu.h ncurses-5.2/menu/menu.priv.h ncurses-5.2/menu/mf_common.h ncurses-5.2/menu/modules ncurses-5.2/misc/Makefile.in ncurses-5.2/misc/chkdef.cmd ncurses-5.2/misc/cleantic.cmd ncurses-5.2/misc/cmpdef.cmd ncurses-5.2/misc/emx.src ncurses-5.2/misc/form.def ncurses-5.2/misc/form.ref ncurses-5.2/misc/indent.pro ncurses-5.2/misc/makedef.cmd ncurses-5.2/misc/makellib ncurses-5.2/misc/menu.def ncurses-5.2/misc/menu.ref ncurses-5.2/misc/ncurses.def ncurses-5.2/misc/ncurses.ref ncurses-5.2/misc/panel.def ncurses-5.2/misc/panel.ref ncurses-5.2/misc/run_tic.in ncurses-5.2/misc/shlib ncurses-5.2/misc/tabset/std ncurses-5.2/misc/tabset/stdcrt ncurses-5.2/misc/tabset/vt100 ncurses-5.2/misc/tabset/vt300 ncurses-5.2/misc/tdlint ncurses-5.2/misc/terminfo.src ncurses-5.2/mk-0th.awk ncurses-5.2/mk-1st.awk ncurses-5.2/mk-2nd.awk ncurses-5.2/mkinstalldirs ncurses-5.2/ncurses/Makefile.in ncurses-5.2/ncurses/README ncurses-5.2/ncurses/SigAction.h ncurses-5.2/ncurses/base/MKkeyname.awk ncurses-5.2/ncurses/base/MKlib_gen.sh ncurses-5.2/ncurses/base/MKunctrl.awk ncurses-5.2/ncurses/base/README ncurses-5.2/ncurses/base/define_key.c ncurses-5.2/ncurses/base/keybound.c ncurses-5.2/ncurses/base/keyok.c ncurses-5.2/ncurses/base/lib_addch.c ncurses-5.2/ncurses/base/lib_addstr.c ncurses-5.2/ncurses/base/lib_beep.c ncurses-5.2/ncurses/base/lib_bkgd.c ncurses-5.2/ncurses/base/lib_box.c ncurses-5.2/ncurses/base/lib_chgat.c ncurses-5.2/ncurses/base/lib_clear.c ncurses-5.2/ncurses/base/lib_clearok.c ncurses-5.2/ncurses/base/lib_clrbot.c ncurses-5.2/ncurses/base/lib_clreol.c ncurses-5.2/ncurses/base/lib_color.c ncurses-5.2/ncurses/base/lib_colorset.c ncurses-5.2/ncurses/base/lib_delch.c ncurses-5.2/ncurses/base/lib_delwin.c ncurses-5.2/ncurses/base/lib_dft_fgbg.c ncurses-5.2/ncurses/base/lib_echo.c ncurses-5.2/ncurses/base/lib_endwin.c ncurses-5.2/ncurses/base/lib_erase.c ncurses-5.2/ncurses/base/lib_flash.c ncurses-5.2/ncurses/base/lib_freeall.c ncurses-5.2/ncurses/base/lib_getch.c ncurses-5.2/ncurses/base/lib_getstr.c ncurses-5.2/ncurses/base/lib_hline.c ncurses-5.2/ncurses/base/lib_immedok.c ncurses-5.2/ncurses/base/lib_inchstr.c ncurses-5.2/ncurses/base/lib_initscr.c ncurses-5.2/ncurses/base/lib_insch.c ncurses-5.2/ncurses/base/lib_insdel.c ncurses-5.2/ncurses/base/lib_insstr.c ncurses-5.2/ncurses/base/lib_instr.c ncurses-5.2/ncurses/base/lib_isendwin.c ncurses-5.2/ncurses/base/lib_leaveok.c ncurses-5.2/ncurses/base/lib_mouse.c ncurses-5.2/ncurses/base/lib_move.c ncurses-5.2/ncurses/base/lib_mvwin.c ncurses-5.2/ncurses/base/lib_newterm.c ncurses-5.2/ncurses/base/lib_newwin.c ncurses-5.2/ncurses/base/lib_nl.c ncurses-5.2/ncurses/base/lib_overlay.c ncurses-5.2/ncurses/base/lib_pad.c ncurses-5.2/ncurses/base/lib_printw.c ncurses-5.2/ncurses/base/lib_redrawln.c ncurses-5.2/ncurses/base/lib_refresh.c ncurses-5.2/ncurses/base/lib_restart.c ncurses-5.2/ncurses/base/lib_scanw.c ncurses-5.2/ncurses/base/lib_screen.c ncurses-5.2/ncurses/base/lib_scroll.c ncurses-5.2/ncurses/base/lib_scrollok.c ncurses-5.2/ncurses/base/lib_scrreg.c ncurses-5.2/ncurses/base/lib_set_term.c ncurses-5.2/ncurses/base/lib_slk.c ncurses-5.2/ncurses/base/lib_slkatr_set.c ncurses-5.2/ncurses/base/lib_slkatrof.c ncurses-5.2/ncurses/base/lib_slkatron.c ncurses-5.2/ncurses/base/lib_slkatrset.c ncurses-5.2/ncurses/base/lib_slkattr.c ncurses-5.2/ncurses/base/lib_slkclear.c ncurses-5.2/ncurses/base/lib_slkcolor.c ncurses-5.2/ncurses/base/lib_slkinit.c ncurses-5.2/ncurses/base/lib_slklab.c ncurses-5.2/ncurses/base/lib_slkrefr.c ncurses-5.2/ncurses/base/lib_slkset.c ncurses-5.2/ncurses/base/lib_slktouch.c ncurses-5.2/ncurses/base/lib_touch.c ncurses-5.2/ncurses/base/lib_ungetch.c ncurses-5.2/ncurses/base/lib_vline.c ncurses-5.2/ncurses/base/lib_wattroff.c ncurses-5.2/ncurses/base/lib_wattron.c ncurses-5.2/ncurses/base/lib_winch.c ncurses-5.2/ncurses/base/lib_window.c ncurses-5.2/ncurses/base/memmove.c ncurses-5.2/ncurses/base/nc_panel.c ncurses-5.2/ncurses/base/resizeterm.c ncurses-5.2/ncurses/base/safe_sprintf.c ncurses-5.2/ncurses/base/sigaction.c ncurses-5.2/ncurses/base/tries.c ncurses-5.2/ncurses/base/version.c ncurses-5.2/ncurses/base/vsscanf.c ncurses-5.2/ncurses/base/wresize.c ncurses-5.2/ncurses/curses.priv.h ncurses-5.2/ncurses/fifo_defs.h ncurses-5.2/ncurses/llib-lncurses ncurses-5.2/ncurses/modules ncurses-5.2/ncurses/tinfo/MKcaptab.awk ncurses-5.2/ncurses/tinfo/MKfallback.sh ncurses-5.2/ncurses/tinfo/MKnames.awk ncurses-5.2/ncurses/tinfo/README ncurses-5.2/ncurses/tinfo/access.c ncurses-5.2/ncurses/tinfo/add_tries.c ncurses-5.2/ncurses/tinfo/alloc_entry.c ncurses-5.2/ncurses/tinfo/alloc_ttype.c ncurses-5.2/ncurses/tinfo/captoinfo.c ncurses-5.2/ncurses/tinfo/comp_error.c ncurses-5.2/ncurses/tinfo/comp_expand.c ncurses-5.2/ncurses/tinfo/comp_hash.c ncurses-5.2/ncurses/tinfo/comp_parse.c ncurses-5.2/ncurses/tinfo/comp_scan.c ncurses-5.2/ncurses/tinfo/doalloc.c ncurses-5.2/ncurses/tinfo/free_ttype.c ncurses-5.2/ncurses/tinfo/getenv_num.c ncurses-5.2/ncurses/tinfo/home_terminfo.c ncurses-5.2/ncurses/tinfo/init_keytry.c ncurses-5.2/ncurses/tinfo/keys.list ncurses-5.2/ncurses/tinfo/lib_acs.c ncurses-5.2/ncurses/tinfo/lib_baudrate.c ncurses-5.2/ncurses/tinfo/lib_cur_term.c ncurses-5.2/ncurses/tinfo/lib_data.c ncurses-5.2/ncurses/tinfo/lib_has_cap.c ncurses-5.2/ncurses/tinfo/lib_kernel.c ncurses-5.2/ncurses/tinfo/lib_longname.c ncurses-5.2/ncurses/tinfo/lib_napms.c ncurses-5.2/ncurses/tinfo/lib_options.c ncurses-5.2/ncurses/tinfo/lib_print.c ncurses-5.2/ncurses/tinfo/lib_raw.c ncurses-5.2/ncurses/tinfo/lib_setup.c ncurses-5.2/ncurses/tinfo/lib_termcap.c ncurses-5.2/ncurses/tinfo/lib_termname.c ncurses-5.2/ncurses/tinfo/lib_tgoto.c ncurses-5.2/ncurses/tinfo/lib_ti.c ncurses-5.2/ncurses/tinfo/lib_tparm.c ncurses-5.2/ncurses/tinfo/lib_tputs.c ncurses-5.2/ncurses/tinfo/lib_ttyflags.c ncurses-5.2/ncurses/tinfo/make_keys.c ncurses-5.2/ncurses/tinfo/name_match.c ncurses-5.2/ncurses/tinfo/parse_entry.c ncurses-5.2/ncurses/tinfo/read_entry.c ncurses-5.2/ncurses/tinfo/read_termcap.c ncurses-5.2/ncurses/tinfo/setbuf.c ncurses-5.2/ncurses/tinfo/strings.c ncurses-5.2/ncurses/tinfo/write_entry.c ncurses-5.2/ncurses/trace/README ncurses-5.2/ncurses/trace/lib_trace.c ncurses-5.2/ncurses/trace/lib_traceatr.c ncurses-5.2/ncurses/trace/lib_tracebits.c ncurses-5.2/ncurses/trace/lib_tracechr.c ncurses-5.2/ncurses/trace/lib_tracedmp.c ncurses-5.2/ncurses/trace/lib_tracemse.c ncurses-5.2/ncurses/trace/trace_buf.c ncurses-5.2/ncurses/trace/trace_tries.c ncurses-5.2/ncurses/trace/trace_xnames.c ncurses-5.2/ncurses/tty/MKexpanded.sh ncurses-5.2/ncurses/tty/hardscroll.c ncurses-5.2/ncurses/tty/hashmap.c ncurses-5.2/ncurses/tty/lib_mvcur.c ncurses-5.2/ncurses/tty/lib_tstp.c ncurses-5.2/ncurses/tty/lib_twait.c ncurses-5.2/ncurses/tty/lib_vidattr.c ncurses-5.2/ncurses/tty/tty_display.h ncurses-5.2/ncurses/tty/tty_input.h ncurses-5.2/ncurses/tty/tty_update.c ncurses-5.2/panel/Makefile.in ncurses-5.2/panel/headers ncurses-5.2/panel/llib-lpanel ncurses-5.2/panel/modules ncurses-5.2/panel/p_above.c ncurses-5.2/panel/p_below.c ncurses-5.2/panel/p_bottom.c ncurses-5.2/panel/p_delete.c ncurses-5.2/panel/p_hidden.c ncurses-5.2/panel/p_hide.c ncurses-5.2/panel/p_move.c ncurses-5.2/panel/p_new.c ncurses-5.2/panel/p_replace.c ncurses-5.2/panel/p_show.c ncurses-5.2/panel/p_top.c ncurses-5.2/panel/p_update.c ncurses-5.2/panel/p_user.c ncurses-5.2/panel/p_win.c ncurses-5.2/panel/panel.c ncurses-5.2/panel/panel.h ncurses-5.2/panel/panel.priv.h ncurses-5.2/progs/MKtermsort.sh ncurses-5.2/progs/Makefile.in ncurses-5.2/progs/capconvert ncurses-5.2/progs/clear.c ncurses-5.2/progs/clear.sh ncurses-5.2/progs/dump_entry.c ncurses-5.2/progs/dump_entry.h ncurses-5.2/progs/infocmp.c ncurses-5.2/progs/modules ncurses-5.2/progs/progs.priv.h ncurses-5.2/progs/tic.c ncurses-5.2/progs/toe.c ncurses-5.2/progs/tput.c ncurses-5.2/progs/tset.c ncurses-5.2/sysdeps/unix/sysv/linux/Makefile ncurses-5.2/sysdeps/unix/sysv/linux/alpha/configure ncurses-5.2/sysdeps/unix/sysv/linux/configure ncurses-5.2/sysdeps/unix/sysv/linux/edit_man.sed ncurses-5.2/sysdeps/unix/sysv/linux/edit_man.sh ncurses-5.2/sysdeps/unix/sysv/linux/run_tic.sh ncurses-5.2/tack/COPYING ncurses-5.2/tack/HISTORY ncurses-5.2/tack/Makefile.in ncurses-5.2/tack/README ncurses-5.2/tack/ansi.c ncurses-5.2/tack/charset.c ncurses-5.2/tack/color.c ncurses-5.2/tack/control.c ncurses-5.2/tack/crum.c ncurses-5.2/tack/edit.c ncurses-5.2/tack/fun.c ncurses-5.2/tack/init.c ncurses-5.2/tack/menu.c ncurses-5.2/tack/modes.c ncurses-5.2/tack/modules ncurses-5.2/tack/output.c ncurses-5.2/tack/pad.c ncurses-5.2/tack/scan.c ncurses-5.2/tack/sync.c ncurses-5.2/tack/sysdep.c ncurses-5.2/tack/tack.1 ncurses-5.2/tack/tack.c ncurses-5.2/tack/tack.h ncurses-5.2/tar-copy.sh ncurses-5.2/test/Makefile.in ncurses-5.2/test/README ncurses-5.2/test/blue.c ncurses-5.2/test/bs.6 ncurses-5.2/test/bs.c ncurses-5.2/test/cardfile.c ncurses-5.2/test/cardfile.dat ncurses-5.2/test/configure ncurses-5.2/test/configure.in ncurses-5.2/test/ditto.c ncurses-5.2/test/dots.c ncurses-5.2/test/filter.c ncurses-5.2/test/firework.c ncurses-5.2/test/firstlast.c ncurses-5.2/test/gdc.6 ncurses-5.2/test/gdc.c ncurses-5.2/test/hanoi.c ncurses-5.2/test/hashtest.c ncurses-5.2/test/keynames.c ncurses-5.2/test/knight.c ncurses-5.2/test/lrtest.c ncurses-5.2/test/modules ncurses-5.2/test/ncurses.c ncurses-5.2/test/ncurses_tst.hin ncurses-5.2/test/newdemo.c ncurses-5.2/test/railroad.c ncurses-5.2/test/rain.c ncurses-5.2/test/tclock.c ncurses-5.2/test/test.priv.h ncurses-5.2/test/testaddch.c ncurses-5.2/test/testcurs.c ncurses-5.2/test/testscanw.c ncurses-5.2/test/tracemunch ncurses-5.2/test/view.c ncurses-5.2/test/worm.c ncurses-5.2/test/xmas.c Cherrypick from master 2007-03-13 20:31:40 UTC Joel Sherrill <joel.sherrill@OARcorp.com> '2007-03-13 Joel Sherrill <joel@OARcorp.com>': ChangeLog RTEMS_Makefiles/Makefile.bfd RTEMS_Makefiles/Makefile.libtecla RTEMS_Makefiles/Makefile.ncurses RTEMS_Makefiles/Makefile.ncurses-5.3 RTEMS_Makefiles/Makefile.readline-4.3 RTEMS_Makefiles/Makefile.zlib SUPPORT VERSION bit bit_bfd libtecla-1.4.1/CHANGES libtecla-1.4.1/INSTALL libtecla-1.4.1/LICENSE.TERMS libtecla-1.4.1/Makefile libtecla-1.4.1/Makefile.in libtecla-1.4.1/Makefile.rules libtecla-1.4.1/Makefile.stub libtecla-1.4.1/PORTING libtecla-1.4.1/README libtecla-1.4.1/RELEASE.NOTES libtecla-1.4.1/config.guess libtecla-1.4.1/config.sub libtecla-1.4.1/configure libtecla-1.4.1/configure.in libtecla-1.4.1/cplfile.c libtecla-1.4.1/cplfile.h libtecla-1.4.1/cplmatch.c libtecla-1.4.1/demo.c libtecla-1.4.1/demo2.c libtecla-1.4.1/direader.c libtecla-1.4.1/direader.h libtecla-1.4.1/enhance.c libtecla-1.4.1/expand.c libtecla-1.4.1/freelist.c libtecla-1.4.1/freelist.h libtecla-1.4.1/getline.c libtecla-1.4.1/getline.h libtecla-1.4.1/hash.c libtecla-1.4.1/hash.h libtecla-1.4.1/history.c libtecla-1.4.1/history.h libtecla-1.4.1/homedir.c libtecla-1.4.1/homedir.h libtecla-1.4.1/html/changes.html libtecla-1.4.1/html/cpl_complete_word.html libtecla-1.4.1/html/ef_expand_file.html libtecla-1.4.1/html/enhance.html libtecla-1.4.1/html/gl_get_line.html libtecla-1.4.1/html/index.html libtecla-1.4.1/html/libtecla.html libtecla-1.4.1/html/pca_lookup_file.html libtecla-1.4.1/html/release.html libtecla-1.4.1/install-sh libtecla-1.4.1/keytab.c libtecla-1.4.1/keytab.h libtecla-1.4.1/libtecla.h libtecla-1.4.1/libtecla.map libtecla-1.4.1/man3/cfc_file_start.3 libtecla-1.4.1/man3/cfc_literal_escapes.3 libtecla-1.4.1/man3/cfc_set_check_fn.3 libtecla-1.4.1/man3/cpl_add_completion.3 libtecla-1.4.1/man3/cpl_complete_word.3 libtecla-1.4.1/man3/cpl_file_completions.3 libtecla-1.4.1/man3/cpl_last_error.3 libtecla-1.4.1/man3/cpl_list_completions.3 libtecla-1.4.1/man3/cpl_record_error.3 libtecla-1.4.1/man3/del_CplFileConf.3 libtecla-1.4.1/man3/del_ExpandFile.3 libtecla-1.4.1/man3/del_GetLine.3 libtecla-1.4.1/man3/del_PathCache.3 libtecla-1.4.1/man3/del_PcaPathConf.3 libtecla-1.4.1/man3/del_WordCompletion.3 libtecla-1.4.1/man3/ef_expand_file.3 libtecla-1.4.1/man3/ef_last_error.3 libtecla-1.4.1/man3/ef_list_expansions.3 libtecla-1.4.1/man3/enhance.3 libtecla-1.4.1/man3/gl_change_terminal.3 libtecla-1.4.1/man3/gl_clear_history.3 libtecla-1.4.1/man3/gl_configure_getline.3 libtecla-1.4.1/man3/gl_customize_completion.3 libtecla-1.4.1/man3/gl_echo_mode.3 libtecla-1.4.1/man3/gl_get_line.3 libtecla-1.4.1/man3/gl_group_history.3 libtecla-1.4.1/man3/gl_ignore_signal.3 libtecla-1.4.1/man3/gl_last_signal.3 libtecla-1.4.1/man3/gl_limit_history.3 libtecla-1.4.1/man3/gl_load_history.3 libtecla-1.4.1/man3/gl_lookup_history.3 libtecla-1.4.1/man3/gl_prompt_style.3 libtecla-1.4.1/man3/gl_range_of_history.3 libtecla-1.4.1/man3/gl_resize_history.3 libtecla-1.4.1/man3/gl_save_history.3 libtecla-1.4.1/man3/gl_show_history.3 libtecla-1.4.1/man3/gl_size_of_history.3 libtecla-1.4.1/man3/gl_state_of_history.3 libtecla-1.4.1/man3/gl_terminal_size.3 libtecla-1.4.1/man3/gl_toggle_history.3 libtecla-1.4.1/man3/gl_trap_signal.3 libtecla-1.4.1/man3/gl_watch_fd.3 libtecla-1.4.1/man3/libtecla.3 libtecla-1.4.1/man3/libtecla_version.3 libtecla-1.4.1/man3/new_CplFileConf.3 libtecla-1.4.1/man3/new_ExpandFile.3 libtecla-1.4.1/man3/new_GetLine.3 libtecla-1.4.1/man3/new_PathCache.3 libtecla-1.4.1/man3/new_PcaPathConf.3 libtecla-1.4.1/man3/new_WordCompletion.3 libtecla-1.4.1/man3/pca_last_error.3 libtecla-1.4.1/man3/pca_lookup_file.3 libtecla-1.4.1/man3/pca_path_completions.3 libtecla-1.4.1/man3/pca_scan_path.3 libtecla-1.4.1/man3/pca_set_check_fn.3 libtecla-1.4.1/man3/ppc_file_start.3 libtecla-1.4.1/man3/ppc_literal_escapes.3 libtecla-1.4.1/pathutil.c libtecla-1.4.1/pathutil.h libtecla-1.4.1/pcache.c libtecla-1.4.1/stringrp.c libtecla-1.4.1/stringrp.h libtecla-1.4.1/strngmem.c libtecla-1.4.1/strngmem.h libtecla-1.4.1/update_html libtecla-1.4.1/update_version libtecla-1.4.1/version.c ncurses-5.3/config.sub ncurses-5.3/misc/run_tic.sh readline-4.3.orig/CHANGELOG readline-4.3.orig/CHANGES readline-4.3.orig/COPYING readline-4.3.orig/INSTALL readline-4.3.orig/MANIFEST readline-4.3.orig/Makefile.in readline-4.3.orig/README readline-4.3.orig/USAGE readline-4.3.orig/aclocal.m4 readline-4.3.orig/ansi_stdlib.h readline-4.3.orig/bind.c readline-4.3.orig/callback.c readline-4.3.orig/chardefs.h readline-4.3.orig/compat.c readline-4.3.orig/complete.c readline-4.3.orig/config.h.in readline-4.3.orig/configure readline-4.3.orig/configure.in readline-4.3.orig/display.c readline-4.3.orig/doc/Makefile.in readline-4.3.orig/doc/hist.texinfo readline-4.3.orig/doc/history.0 readline-4.3.orig/doc/history.3 readline-4.3.orig/doc/history.dvi readline-4.3.orig/doc/history.html readline-4.3.orig/doc/history.info readline-4.3.orig/doc/history.ps readline-4.3.orig/doc/history_3.ps readline-4.3.orig/doc/hstech.texinfo readline-4.3.orig/doc/hsuser.texinfo readline-4.3.orig/doc/manvers.texinfo readline-4.3.orig/doc/readline.0 readline-4.3.orig/doc/readline.3 readline-4.3.orig/doc/readline.dvi readline-4.3.orig/doc/readline.html readline-4.3.orig/doc/readline.info readline-4.3.orig/doc/readline.ps readline-4.3.orig/doc/readline_3.ps readline-4.3.orig/doc/rlman.texinfo readline-4.3.orig/doc/rltech.texinfo readline-4.3.orig/doc/rluser.texinfo readline-4.3.orig/doc/rluserman.dvi readline-4.3.orig/doc/rluserman.html readline-4.3.orig/doc/rluserman.info readline-4.3.orig/doc/rluserman.ps readline-4.3.orig/doc/rluserman.texinfo readline-4.3.orig/doc/texi2dvi readline-4.3.orig/doc/texi2html readline-4.3.orig/doc/texinfo.tex readline-4.3.orig/emacs_keymap.c readline-4.3.orig/examples/Inputrc readline-4.3.orig/examples/Makefile.in readline-4.3.orig/examples/excallback.c readline-4.3.orig/examples/fileman.c readline-4.3.orig/examples/histexamp.c readline-4.3.orig/examples/manexamp.c readline-4.3.orig/examples/readlinebuf.h readline-4.3.orig/examples/rl.c readline-4.3.orig/examples/rlcat.c readline-4.3.orig/examples/rlfe.c readline-4.3.orig/examples/rltest.c readline-4.3.orig/examples/rlversion.c readline-4.3.orig/funmap.c readline-4.3.orig/histexpand.c readline-4.3.orig/histfile.c readline-4.3.orig/histlib.h readline-4.3.orig/history.c readline-4.3.orig/history.h readline-4.3.orig/histsearch.c readline-4.3.orig/input.c readline-4.3.orig/isearch.c readline-4.3.orig/keymaps.c readline-4.3.orig/keymaps.h readline-4.3.orig/kill.c readline-4.3.orig/macro.c readline-4.3.orig/mbutil.c readline-4.3.orig/misc.c readline-4.3.orig/nls.c readline-4.3.orig/parens.c readline-4.3.orig/posixdir.h readline-4.3.orig/posixjmp.h readline-4.3.orig/posixstat.h readline-4.3.orig/readline.c readline-4.3.orig/readline.h readline-4.3.orig/rlconf.h readline-4.3.orig/rldefs.h readline-4.3.orig/rlmbutil.h readline-4.3.orig/rlprivate.h readline-4.3.orig/rlshell.h readline-4.3.orig/rlstdc.h readline-4.3.orig/rltty.c readline-4.3.orig/rltty.h readline-4.3.orig/rltypedefs.h readline-4.3.orig/rlwinsize.h readline-4.3.orig/savestring.c readline-4.3.orig/search.c readline-4.3.orig/shell.c readline-4.3.orig/shlib/Makefile.in readline-4.3.orig/signals.c readline-4.3.orig/support/config.guess readline-4.3.orig/support/config.sub readline-4.3.orig/support/install.sh readline-4.3.orig/support/mkdirs readline-4.3.orig/support/mkdist readline-4.3.orig/support/shlib-install readline-4.3.orig/support/shobj-conf readline-4.3.orig/support/wcwidth.c readline-4.3.orig/tcap.h readline-4.3.orig/terminal.c readline-4.3.orig/text.c readline-4.3.orig/tilde.c readline-4.3.orig/tilde.h readline-4.3.orig/undo.c readline-4.3.orig/util.c readline-4.3.orig/vi_keymap.c readline-4.3.orig/vi_mode.c readline-4.3.orig/xmalloc.c readline-4.3.orig/xmalloc.h readline-4.3/CHANGELOG-ReadLine readline-4.3/CHANGES readline-4.3/COPYING readline-4.3/INSTALL readline-4.3/MANIFEST readline-4.3/Makefile.in readline-4.3/README readline-4.3/USAGE readline-4.3/aclocal.m4 readline-4.3/ansi_stdlib.h readline-4.3/bind.c readline-4.3/callback.c readline-4.3/chardefs.h readline-4.3/compat.c readline-4.3/complete.c readline-4.3/config.h.in readline-4.3/configure readline-4.3/configure.in readline-4.3/display.c readline-4.3/doc/Makefile.in readline-4.3/doc/hist.texinfo readline-4.3/doc/history.3 readline-4.3/doc/hstech.texinfo readline-4.3/doc/hsuser.texinfo readline-4.3/doc/manvers.texinfo readline-4.3/doc/readline.3 readline-4.3/doc/rlman.texinfo readline-4.3/doc/rltech.texinfo readline-4.3/doc/rluser.texinfo readline-4.3/doc/rluserman.texinfo readline-4.3/doc/texi2dvi readline-4.3/doc/texi2html readline-4.3/doc/texinfo.tex readline-4.3/emacs_keymap.c readline-4.3/examples/Inputrc readline-4.3/examples/Makefile.in readline-4.3/examples/excallback.c readline-4.3/examples/fileman.c readline-4.3/examples/histexamp.c readline-4.3/examples/manexamp.c readline-4.3/examples/readlinebuf.h readline-4.3/examples/rl.c readline-4.3/examples/rlcat.c readline-4.3/examples/rlfe.c readline-4.3/examples/rltest.c readline-4.3/examples/rlversion.c readline-4.3/funmap.c readline-4.3/histexpand.c readline-4.3/histfile.c readline-4.3/histlib.h readline-4.3/history.c readline-4.3/history.h readline-4.3/histsearch.c readline-4.3/input.c readline-4.3/isearch.c readline-4.3/keymaps.c readline-4.3/keymaps.h readline-4.3/kill.c readline-4.3/macro.c readline-4.3/mbutil.c readline-4.3/misc.c readline-4.3/nls.c readline-4.3/parens.c readline-4.3/posixdir.h readline-4.3/posixjmp.h readline-4.3/posixstat.h readline-4.3/readline.c readline-4.3/readline.h readline-4.3/rlconf.h readline-4.3/rldefs.h readline-4.3/rlmbutil.h readline-4.3/rlprivate.h readline-4.3/rlshell.h readline-4.3/rlstdc.h readline-4.3/rltty.c readline-4.3/rltty.h readline-4.3/rltypedefs.h readline-4.3/rlwinsize.h readline-4.3/savestring.c readline-4.3/search.c readline-4.3/shell.c readline-4.3/shlib/Makefile.in readline-4.3/signals.c readline-4.3/support/config.guess readline-4.3/support/config.sub readline-4.3/support/install.sh readline-4.3/support/mkdirs readline-4.3/support/mkdist readline-4.3/support/shlib-install readline-4.3/support/shobj-conf readline-4.3/support/wcwidth.c readline-4.3/tcap.h readline-4.3/terminal.c readline-4.3/text.c readline-4.3/tilde.c readline-4.3/tilde.h readline-4.3/undo.c readline-4.3/util.c readline-4.3/vi_keymap.c readline-4.3/vi_mode.c readline-4.3/xmalloc.c readline-4.3/xmalloc.h readline-doc-4.3/MANIFEST.doc readline-doc-4.3/doc/history.0 readline-doc-4.3/doc/history.dvi readline-doc-4.3/doc/history.html readline-doc-4.3/doc/history.info readline-doc-4.3/doc/history.ps readline-doc-4.3/doc/history_3.ps readline-doc-4.3/doc/readline.0 readline-doc-4.3/doc/readline.dvi readline-doc-4.3/doc/readline.html readline-doc-4.3/doc/readline.info readline-doc-4.3/doc/readline.ps readline-doc-4.3/doc/readline_3.ps readline-doc-4.3/doc/rluserman.dvi readline-doc-4.3/doc/rluserman.html readline-doc-4.3/doc/rluserman.info readline-doc-4.3/doc/rluserman.ps rtemsNfs/ChangeLog rtemsNfs/LICENSE rtemsNfs/Makefile rtemsNfs/README rtemsNfs/proto/Makefile rtemsNfs/proto/mount_prot.h rtemsNfs/proto/mount_prot.x rtemsNfs/proto/mount_prot_xdr.c rtemsNfs/proto/nfs_prot.h rtemsNfs/proto/nfs_prot.x rtemsNfs/proto/nfs_prot_xdr.c rtemsNfs/rfc1094.txt rtemsNfs/rtems-filesystem-patch rtemsNfs/src/Makefile rtemsNfs/src/cexphelp.c rtemsNfs/src/dirutils.c rtemsNfs/src/librtemsNfs.h rtemsNfs/src/nfs.c rtemsNfs/src/nfs.modini.c rtemsNfs/src/rpcio.c rtemsNfs/src/rpcio.h rtemsNfs/src/rpcio.modini.c rtemsNfs/src/sock_mbuf.c rtemsNfs/src/xdr_mbuf.c zlib-1.1.4/ChangeLog zlib-1.1.4/FAQ zlib-1.1.4/INDEX zlib-1.1.4/Make_vms.com zlib-1.1.4/Makefile zlib-1.1.4/Makefile.in zlib-1.1.4/Makefile.riscos zlib-1.1.4/README zlib-1.1.4/adler32.c zlib-1.1.4/algorithm.txt zlib-1.1.4/amiga/Makefile.pup zlib-1.1.4/amiga/Makefile.sas zlib-1.1.4/compress.c zlib-1.1.4/configure zlib-1.1.4/contrib/README.contrib zlib-1.1.4/contrib/asm386/gvmat32.asm zlib-1.1.4/contrib/asm386/gvmat32c.c zlib-1.1.4/contrib/asm386/mkgvmt32.bat zlib-1.1.4/contrib/asm386/zlibvc.def zlib-1.1.4/contrib/asm386/zlibvc.dsp zlib-1.1.4/contrib/asm386/zlibvc.dsw zlib-1.1.4/contrib/asm586/README.586 zlib-1.1.4/contrib/asm586/match.S zlib-1.1.4/contrib/asm686/README.686 zlib-1.1.4/contrib/asm686/match.S zlib-1.1.4/contrib/delphi/zlib.mak zlib-1.1.4/contrib/delphi/zlibdef.pas zlib-1.1.4/contrib/delphi2/d_zlib.bpr zlib-1.1.4/contrib/delphi2/d_zlib.cpp zlib-1.1.4/contrib/delphi2/readme.txt zlib-1.1.4/contrib/delphi2/zlib.bpg zlib-1.1.4/contrib/delphi2/zlib.bpr zlib-1.1.4/contrib/delphi2/zlib.cpp zlib-1.1.4/contrib/delphi2/zlib.pas zlib-1.1.4/contrib/delphi2/zlib32.bpr zlib-1.1.4/contrib/delphi2/zlib32.cpp zlib-1.1.4/contrib/iostream/test.cpp zlib-1.1.4/contrib/iostream/zfstream.cpp zlib-1.1.4/contrib/iostream/zfstream.h zlib-1.1.4/contrib/iostream2/zstream.h zlib-1.1.4/contrib/iostream2/zstream_test.cpp zlib-1.1.4/contrib/minizip/ChangeLogUnzip zlib-1.1.4/contrib/minizip/Makefile zlib-1.1.4/contrib/minizip/miniunz.c zlib-1.1.4/contrib/minizip/minizip.c zlib-1.1.4/contrib/minizip/readme.txt zlib-1.1.4/contrib/minizip/unzip.c zlib-1.1.4/contrib/minizip/unzip.def zlib-1.1.4/contrib/minizip/unzip.h zlib-1.1.4/contrib/minizip/zip.c zlib-1.1.4/contrib/minizip/zip.def zlib-1.1.4/contrib/minizip/zip.h zlib-1.1.4/contrib/minizip/zlibvc.def zlib-1.1.4/contrib/minizip/zlibvc.dsp zlib-1.1.4/contrib/minizip/zlibvc.dsw zlib-1.1.4/contrib/untgz/Makefile zlib-1.1.4/contrib/untgz/makefile.w32 zlib-1.1.4/contrib/untgz/untgz.c zlib-1.1.4/contrib/visual-basic.txt zlib-1.1.4/crc32.c zlib-1.1.4/deflate.c zlib-1.1.4/deflate.h zlib-1.1.4/descrip.mms zlib-1.1.4/example.c zlib-1.1.4/gzio.c zlib-1.1.4/infblock.c zlib-1.1.4/infblock.h zlib-1.1.4/infcodes.c zlib-1.1.4/infcodes.h zlib-1.1.4/inffast.c zlib-1.1.4/inffast.h zlib-1.1.4/inffixed.h zlib-1.1.4/inflate.c zlib-1.1.4/inftrees.c zlib-1.1.4/inftrees.h zlib-1.1.4/infutil.c zlib-1.1.4/infutil.h zlib-1.1.4/maketree.c zlib-1.1.4/minigzip.c zlib-1.1.4/msdos/Makefile.b32 zlib-1.1.4/msdos/Makefile.bor zlib-1.1.4/msdos/Makefile.dj2 zlib-1.1.4/msdos/Makefile.emx zlib-1.1.4/msdos/Makefile.msc zlib-1.1.4/msdos/Makefile.tc zlib-1.1.4/msdos/Makefile.w32 zlib-1.1.4/msdos/Makefile.wat zlib-1.1.4/msdos/zlib.def zlib-1.1.4/msdos/zlib.rc zlib-1.1.4/nt/Makefile.emx zlib-1.1.4/nt/Makefile.gcc zlib-1.1.4/nt/Makefile.nt zlib-1.1.4/nt/zlib.dnt zlib-1.1.4/os2/Makefile.os2 zlib-1.1.4/os2/zlib.def zlib-1.1.4/trees.c zlib-1.1.4/trees.h zlib-1.1.4/uncompr.c zlib-1.1.4/zconf.h zlib-1.1.4/zlib.3 zlib-1.1.4/zlib.h zlib-1.1.4/zlib.html zlib-1.1.4/zutil.c zlib-1.1.4/zutil.h
Diffstat (limited to 'readline-4.3.orig/complete.c')
-rw-r--r--readline-4.3.orig/complete.c2004
1 files changed, 2004 insertions, 0 deletions
diff --git a/readline-4.3.orig/complete.c b/readline-4.3.orig/complete.c
new file mode 100644
index 0000000..21a9d70
--- /dev/null
+++ b/readline-4.3.orig/complete.c
@@ -0,0 +1,2004 @@
+/* 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 2, 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,
+ 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
+#define READLINE_LIBRARY
+
+#if defined (HAVE_CONFIG_H)
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <fcntl.h>
+#if defined (HAVE_SYS_FILE_H)
+#include <sys/file.h>
+#endif
+
+#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 <stdio.h>
+
+#include <errno.h>
+#if !defined (errno)
+extern int errno;
+#endif /* !errno */
+
+#include <pwd.h>
+
+#include "posixdir.h"
+#include "posixstat.h"
+
+/* System-specific feature definitions and include files. */
+#include "rldefs.h"
+#include "rlmbutil.h"
+
+/* Some standard library routines. */
+#include "readline.h"
+#include "xmalloc.h"
+#include "rlprivate.h"
+
+#ifdef __STDC__
+typedef int QSFUNC (const void *, const void *);
+#else
+typedef int QSFUNC ();
+#endif
+
+#ifdef HAVE_LSTAT
+# define LSTAT lstat
+#else
+# define LSTAT stat
+#endif
+
+/* Unix version of a hidden file. Could be different on other systems. */
+#define HIDDEN_FILE(fname) ((fname)[0] == '.')
+
+/* Most systems don't declare getpwent in <pwd.h> if _POSIX_SOURCE is
+ defined. */
+#if !defined (HAVE_GETPW_DECLS) || defined (_POSIX_SOURCE)
+extern struct passwd *getpwent PARAMS((void));
+#endif /* !HAVE_GETPW_DECLS || _POSIX_SOURCE */
+
+/* If non-zero, then this is the address of a function to call when
+ completing a word would normally display the list of possible matches.
+ This function is called instead of actually doing the display.
+ It takes three arguments: (char **matches, int num_matches, int max_length)
+ where MATCHES is the array of strings that matched, NUM_MATCHES is the
+ number of strings in that array, and MAX_LENGTH is the length of the
+ longest string in that array. */
+rl_compdisp_func_t *rl_completion_display_matches_hook = (rl_compdisp_func_t *)NULL;
+
+#if defined (VISIBLE_STATS)
+# if !defined (X_OK)
+# define X_OK 1
+# endif
+static int stat_char PARAMS((char *));
+#endif
+
+static char *rl_quote_filename PARAMS((char *, int, char *));
+
+static void set_completion_defaults PARAMS((int));
+static int get_y_or_n PARAMS((int));
+static int _rl_internal_pager PARAMS((int));
+static char *printable_part PARAMS((char *));
+static int print_filename PARAMS((char *, char *));
+
+static char **gen_completion_matches PARAMS((char *, int, int, rl_compentry_func_t *, int, int));
+
+static char **remove_duplicate_matches PARAMS((char **));
+static void insert_match PARAMS((char *, int, int, char *));
+static int append_to_match PARAMS((char *, int, int, int));
+static void insert_all_matches PARAMS((char **, int, char *));
+static void display_matches PARAMS((char **));
+static int compute_lcd_of_matches PARAMS((char **, int, const char *));
+static int postprocess_matches PARAMS((char ***, int));
+
+static char *make_quoted_replacement PARAMS((char *, int, char *));
+
+/* **************************************************************** */
+/* */
+/* Completion matching, from readline's point of view. */
+/* */
+/* **************************************************************** */
+
+/* Variables known only to the readline library. */
+
+/* If non-zero, non-unique completions always show the list of matches. */
+int _rl_complete_show_all = 0;
+
+/* If non-zero, completed directory names have a slash appended. */
+int _rl_complete_mark_directories = 1;
+
+/* If non-zero, the symlinked directory completion behavior introduced in
+ readline-4.2a is disabled, and symlinks that point to directories have
+ a slash appended (subject to the value of _rl_complete_mark_directories).
+ This is user-settable via the mark-symlinked-directories variable. */
+int _rl_complete_mark_symlink_dirs = 0;
+
+/* If non-zero, completions are printed horizontally in alphabetical order,
+ like `ls -x'. */
+int _rl_print_completions_horizontally;
+
+/* Non-zero means that case is not significant in filename completion. */
+#if defined (__MSDOS__) && !defined (__DJGPP__)
+int _rl_completion_case_fold = 1;
+#else
+int _rl_completion_case_fold;
+#endif
+
+/* If non-zero, don't match hidden files (filenames beginning with a `.' on
+ Unix) when doing filename completion. */
+int _rl_match_hidden_files = 1;
+
+/* Global variables available to applications using readline. */
+
+#if defined (VISIBLE_STATS)
+/* 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 */
+
+/* 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. */
+rl_icppfunc_t *rl_directory_completion_hook = (rl_icppfunc_t *)NULL;
+
+rl_icppfunc_t *rl_directory_rewrite_hook = (rl_icppfunc_t *)NULL;
+
+/* Non-zero means readline completion functions perform tilde expansion. */
+int rl_complete_with_tilde_expansion = 0;
+
+/* Pointer to the generator function for completion_matches ().
+ NULL means to use rl_filename_completion_function (), the default filename
+ completer. */
+rl_compentry_func_t *rl_completion_entry_function = (rl_compentry_func_t *)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. */
+rl_completion_func_t *rl_attempted_completion_function = (rl_completion_func_t *)NULL;
+
+/* Non-zero means to suppress normal filename completion after the
+ user-specified completion function has been called. */
+int rl_attempted_completion_over = 0;
+
+/* Set to a character indicating the type of completion being performed
+ by rl_complete_internal, available for use by application completion
+ functions. */
+int rl_completion_type = 0;
+
+/* 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;
+
+int _rl_page_completions = 1;
+
+/* 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\"\\'`@$><=" */
+const char *rl_basic_word_break_characters = " \t\n\"\\'`@$><=;|&{("; /* }) */
+
+/* List of basic quoting characters. */
+const char *rl_basic_quote_characters = "\"'";
+
+/* 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. */
+const char *rl_completer_word_break_characters = (const 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. */
+const char *rl_completer_quote_characters = (const char *)NULL;
+
+/* List of characters that should be quoted in filenames by the completer. */
+const char *rl_filename_quote_characters = (const 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. */
+const char *rl_special_prefixes = (const 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;
+
+/* Non-zero means that the results of the matches are to be quoted using
+ double quotes (or an application-specific quoting mechanism) if the
+ filename contains any characters in rl_filename_quote_chars. This is
+ ALWAYS non-zero on entry, and can only be changed within a completion
+ entry finder function. */
+int rl_filename_quoting_desired = 1;
+
+/* 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. */
+rl_compignore_func_t *rl_ignore_some_completions_function = (rl_compignore_func_t *)NULL;
+
+/* Set to a function to quote a filename in an application-specific fashion.
+ Called with the text to quote, the type of match found (single or multiple)
+ and a pointer to the quoting character to be used, which the function can
+ reset if desired. */
+rl_quote_func_t *rl_filename_quoting_function = rl_quote_filename;
+
+/* Function to call to remove quoting characters from a filename. Called
+ before completion is attempted, so the embedded quotes do not interfere
+ with matching names in the file system. Readline doesn't do anything
+ with this; it's set only by applications. */
+rl_dequote_func_t *rl_filename_dequoting_function = (rl_dequote_func_t *)NULL;
+
+/* Function to call to decide whether or not a word break character is
+ quoted. If a character is quoted, it does not break words for the
+ completer. */
+rl_linebuf_func_t *rl_char_is_quoted_p = (rl_linebuf_func_t *)NULL;
+
+/* If non-zero, the completion functions don't append anything except a
+ possible closing quote. This is set to 0 by rl_complete_internal and
+ may be changed by an application-specific completion function. */
+int rl_completion_suppress_append = 0;
+
+/* Character appended to completed words when at the end of the line. The
+ default is a space. */
+int rl_completion_append_character = ' ';
+
+/* If non-zero, a slash will be appended to completed filenames that are
+ symbolic links to directory names, subject to the value of the
+ mark-directories variable (which is user-settable). This exists so
+ that application completion functions can override the user's preference
+ (set via the mark-symlinked-directories variable) if appropriate.
+ It's set to the value of _rl_complete_mark_symlink_dirs in
+ rl_complete_internal before any application-specific completion
+ function is called, so without that function doing anything, the user's
+ preferences are honored. */
+int rl_completion_mark_symlink_dirs;
+
+/* If non-zero, inhibit completion (temporarily). */
+int rl_inhibit_completion;
+
+/* Variables local to this file. */
+
+/* Local variable states what happened during the last completion attempt. */
+static int completion_changed_buffer;
+
+/*************************************/
+/* */
+/* Bindable completion functions */
+/* */
+/*************************************/
+
+/* Complete the word at or before point. You have supplied the function
+ that does the initial simple matching selection algorithm (see
+ rl_completion_matches ()). The default is to do filename completion. */
+int
+rl_complete (ignore, invoking_key)
+ int ignore, invoking_key;
+{
+ if (rl_inhibit_completion)
+ return (_rl_insert_char (ignore, invoking_key));
+ else 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 (). */
+int
+rl_possible_completions (ignore, invoking_key)
+ int ignore, invoking_key;
+{
+ return (rl_complete_internal ('?'));
+}
+
+int
+rl_insert_completions (ignore, invoking_key)
+ int ignore, invoking_key;
+{
+ return (rl_complete_internal ('*'));
+}
+
+/* Return the correct value to pass to rl_complete_internal performing
+ the same tests as rl_complete. This allows consecutive calls to an
+ application's completion function to list possible completions and for
+ an application-specific completion function to honor the
+ show-all-if-ambiguous readline variable. */
+int
+rl_completion_mode (cfunc)
+ rl_command_func_t *cfunc;
+{
+ if (rl_last_func == cfunc && !completion_changed_buffer)
+ return '?';
+ else if (_rl_complete_show_all)
+ return '!';
+ else
+ return TAB;
+}
+
+/************************************/
+/* */
+/* Completion utility functions */
+/* */
+/************************************/
+
+/* Set default values for readline word completion. These are the variables
+ that application completion functions can change or inspect. */
+static void
+set_completion_defaults (what_to_do)
+ int what_to_do;
+{
+ /* Only the completion entry function can change these. */
+ rl_filename_completion_desired = 0;
+ rl_filename_quoting_desired = 1;
+ rl_completion_type = what_to_do;
+ rl_completion_suppress_append = 0;
+
+ /* The completion entry function may optionally change this. */
+ rl_completion_mark_symlink_dirs = _rl_complete_mark_symlink_dirs;
+}
+
+/* The user must press "y" or "n". Non-zero return means "y" pressed. */
+static int
+get_y_or_n (for_pager)
+ int for_pager;
+{
+ int c;
+
+ for (;;)
+ {
+ RL_SETSTATE(RL_STATE_MOREINPUT);
+ c = rl_read_key ();
+ RL_UNSETSTATE(RL_STATE_MOREINPUT);
+
+ if (c == 'y' || c == 'Y' || c == ' ')
+ return (1);
+ if (c == 'n' || c == 'N' || c == RUBOUT)
+ return (0);
+ if (c == ABORT_CHAR)
+ _rl_abort_internal ();
+ if (for_pager && (c == NEWLINE || c == RETURN))
+ return (2);
+ if (for_pager && (c == 'q' || c == 'Q'))
+ return (0);
+ rl_ding ();
+ }
+}
+
+static int
+_rl_internal_pager (lines)
+ int lines;
+{
+ int i;
+
+ fprintf (rl_outstream, "--More--");
+ fflush (rl_outstream);
+ i = get_y_or_n (1);
+ _rl_erase_entire_line ();
+ if (i == 0)
+ return -1;
+ else if (i == 2)
+ return (lines - 1);
+ else
+ return 0;
+}
+
+#if defined (VISIBLE_STATS)
+/* Return the character which best describes FILENAME.
+ `@' for symbolic links
+ `/' for directories
+ `*' for executables
+ `=' for sockets
+ `|' for FIFOs
+ `%' for character special devices
+ `#' for block special devices */
+static int
+stat_char (filename)
+ char *filename;
+{
+ struct stat finfo;
+ int character, r;
+
+#if defined (HAVE_LSTAT) && 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_ISCHR)
+ else if (S_ISCHR (finfo.st_mode))
+ character = '%';
+#endif /* S_ISCHR */
+#if defined (S_ISBLK)
+ else if (S_ISBLK (finfo.st_mode))
+ character = '#';
+#endif /* S_ISBLK */
+#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 */
+#if defined (S_ISFIFO)
+ else if (S_ISFIFO (finfo.st_mode))
+ character = '|';
+#endif
+ else if (S_ISREG (finfo.st_mode))
+ {
+ if (access (filename, X_OK) == 0)
+ character = '*';
+ }
+ return (character);
+}
+#endif /* VISIBLE_STATS */
+
+/* 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. Since
+ printing empty strings is not very informative, if we're doing
+ filename completion, and the basename is the empty string, we look
+ for the previous slash and return the portion following that. If
+ there's no previous slash, we just return what we were passed. */
+static char *
+printable_part (pathname)
+ char *pathname;
+{
+ char *temp, *x;
+
+ if (rl_filename_completion_desired == 0) /* don't need to do anything */
+ return (pathname);
+
+ temp = strrchr (pathname, '/');
+#if defined (__MSDOS__)
+ if (temp == 0 && ISALPHA ((unsigned char)pathname[0]) && pathname[1] == ':')
+ temp = pathname + 1;
+#endif
+
+ if (temp == 0 || *temp == '\0')
+ return (pathname);
+ /* If the basename is NULL, we might have a pathname like '/usr/src/'.
+ Look for a previous slash and, if one is found, return the portion
+ following that slash. If there's no previous slash, just return the
+ pathname we were passed. */
+ else if (temp[1] == '\0')
+ {
+ for (x = temp - 1; x > pathname; x--)
+ if (*x == '/')
+ break;
+ return ((*x == '/') ? x + 1 : 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 the number of characters we output. */
+
+#define PUTX(c) \
+ do { \
+ if (CTRL_CHAR (c)) \
+ { \
+ putc ('^', rl_outstream); \
+ putc (UNCTRL (c), rl_outstream); \
+ printed_len += 2; \
+ } \
+ else if (c == RUBOUT) \
+ { \
+ putc ('^', rl_outstream); \
+ putc ('?', rl_outstream); \
+ printed_len += 2; \
+ } \
+ else \
+ { \
+ putc (c, rl_outstream); \
+ printed_len++; \
+ } \
+ } while (0)
+
+static int
+print_filename (to_print, full_pathname)
+ char *to_print, *full_pathname;
+{
+ int printed_len = 0;
+#if !defined (VISIBLE_STATS)
+ char *s;
+
+ for (s = to_print; *s; s++)
+ {
+ PUTX (*s);
+ }
+#else
+ char *s, c, *new_full_pathname;
+ int extension_char, slen, tlen;
+
+ for (s = to_print; *s; s++)
+ {
+ PUTX (*s);
+ }
+
+ 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';
+
+ /* If setting the last slash in full_pathname to a NUL results in
+ full_pathname being the empty string, we are trying to complete
+ files in the root directory. If we pass a null string to the
+ bash directory completion hook, for example, it will expand it
+ to the current directory. We just want the `/'. */
+ s = tilde_expand (full_pathname && *full_pathname ? full_pathname : "/");
+ if (rl_directory_completion_hook)
+ (*rl_directory_completion_hook) (&s);
+
+ slen = strlen (s);
+ tlen = strlen (to_print);
+ new_full_pathname = (char *)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);
+ printed_len++;
+ }
+ }
+#endif /* VISIBLE_STATS */
+ return printed_len;
+}
+
+static char *
+rl_quote_filename (s, rtype, qcp)
+ char *s;
+ int rtype;
+ char *qcp;
+{
+ char *r;
+
+ r = (char *)xmalloc (strlen (s) + 2);
+ *r = *rl_completer_quote_characters;
+ strcpy (r + 1, s);
+ if (qcp)
+ *qcp = *rl_completer_quote_characters;
+ return r;
+}
+
+/* Find the bounds of the current word for completion purposes, and leave
+ rl_point set to the end of the word. This function skips quoted
+ substrings (characters between matched pairs of characters in
+ rl_completer_quote_characters). First we try to find an unclosed
+ quoted substring on which to do matching. If one is not found, we use
+ the word break characters to find the boundaries of the current word.
+ We call an application-specific function to decide whether or not a
+ particular word break character is quoted; if that function returns a
+ non-zero result, the character does not break a word. This function
+ returns the opening quote character if we found an unclosed quoted
+ substring, '\0' otherwise. FP, if non-null, is set to a value saying
+ which (shell-like) quote characters we found (single quote, double
+ quote, or backslash) anywhere in the string. DP, if non-null, is set to
+ the value of the delimiter character that caused a word break. */
+
+char
+_rl_find_completion_word (fp, dp)
+ int *fp, *dp;
+{
+ int scan, end, found_quote, delimiter, pass_next, isbrk;
+ char quote_char;
+
+ end = rl_point;
+ found_quote = delimiter = 0;
+ quote_char = '\0';
+
+ 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;
+ }
+
+ /* Shell-like semantics for single quotes -- don't allow backslash
+ to quote anything in single quotes, especially not the closing
+ quote. If you don't like this, take out the check on the value
+ of quote_char. */
+ if (quote_char != '\'' && rl_line_buffer[scan] == '\\')
+ {
+ pass_next = 1;
+ found_quote |= RL_QF_BACKSLASH;
+ 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;
+ /* Shell-like quoting conventions. */
+ if (quote_char == '\'')
+ found_quote |= RL_QF_SINGLE_QUOTE;
+ else if (quote_char == '"')
+ found_quote |= RL_QF_DOUBLE_QUOTE;
+ else
+ found_quote |= RL_QF_OTHER_QUOTE;
+ }
+ }
+ }
+
+ if (rl_point == end && quote_char == '\0')
+ {
+ /* We didn't find an unclosed quoted substring upon which to do
+ completion, so use the word break characters to find the
+ substring on which to complete. */
+#if defined (HANDLE_MULTIBYTE)
+ while (rl_point = _rl_find_prev_mbchar (rl_line_buffer, rl_point, MB_FIND_ANY))
+#else
+ while (--rl_point)
+#endif
+ {
+ scan = rl_line_buffer[rl_point];
+
+ if (strchr (rl_completer_word_break_characters, scan) == 0)
+ continue;
+
+ /* Call the application-specific function to tell us whether
+ this word break character is quoted and should be skipped. */
+ if (rl_char_is_quoted_p && found_quote &&
+ (*rl_char_is_quoted_p) (rl_line_buffer, rl_point))
+ continue;
+
+ /* Convoluted code, but it avoids an n^2 algorithm with calls
+ to char_is_quoted. */
+ break;
+ }
+ }
+
+ /* If we are at an unquoted word break, then advance past it. */
+ scan = rl_line_buffer[rl_point];
+
+ /* If there is an application-specific function to say whether or not
+ a character is quoted and we found a quote character, let that
+ function decide whether or not a character is a word break, even
+ if it is found in rl_completer_word_break_characters. Don't bother
+ if we're at the end of the line, though. */
+ if (scan)
+ {
+ if (rl_char_is_quoted_p)
+ isbrk = (found_quote == 0 ||
+ (*rl_char_is_quoted_p) (rl_line_buffer, rl_point) == 0) &&
+ strchr (rl_completer_word_break_characters, scan) != 0;
+ else
+ isbrk = strchr (rl_completer_word_break_characters, scan) != 0;
+
+ if (isbrk)
+ {
+ /* If the character that caused the word break was a quoting
+ character, then remember it as the delimiter. */
+ if (rl_basic_quote_characters &&
+ strchr (rl_basic_quote_characters, 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 == 0 || strchr (rl_special_prefixes, scan) == 0)
+ rl_point++;
+ }
+ }
+
+ if (fp)
+ *fp = found_quote;
+ if (dp)
+ *dp = delimiter;
+
+ return (quote_char);
+}
+
+static char **
+gen_completion_matches (text, start, end, our_func, found_quote, quote_char)
+ char *text;
+ int start, end;
+ rl_compentry_func_t *our_func;
+ int found_quote, quote_char;
+{
+ char **matches, *temp;
+
+ /* 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;
+ return (matches);
+ }
+ }
+
+ /* Beware -- we're stripping the quotes here. Do this only if we know
+ we are doing filename completion and the application has defined a
+ filename dequoting function. */
+ temp = (char *)NULL;
+
+ if (found_quote && our_func == rl_filename_completion_function &&
+ rl_filename_dequoting_function)
+ {
+ /* delete single and double quotes */
+ temp = (*rl_filename_dequoting_function) (text, quote_char);
+ text = temp; /* not freeing text is not a memory leak */
+ }
+
+ matches = rl_completion_matches (text, our_func);
+ FREE (temp);
+ return matches;
+}
+
+/* Filter out duplicates in MATCHES. This frees up the strings in
+ MATCHES. */
+static char **
+remove_duplicate_matches (matches)
+ char **matches;
+{
+ char *lowest_common;
+ int i, j, newlen;
+ char dead_slot;
+ char **temp_array;
+
+ /* Sort the items. */
+ for (i = 0; matches[i]; i++)
+ ;
+
+ /* Sort the array without matches[0], since we need it to
+ stay in place no matter what. */
+ if (i)
+ qsort (matches+1, i-1, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare);
+
+ /* Remember the lowest common denominator for it may be unique. */
+ lowest_common = savestring (matches[0]);
+
+ for (i = newlen = 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]);
+
+ /* Place the lowest common denominator back in [0]. */
+ temp_array[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 (temp_array[0], temp_array[1]) == 0)
+ {
+ free (temp_array[1]);
+ temp_array[1] = (char *)NULL;
+ }
+ return (temp_array);
+}
+
+/* Find the common prefix of the list of matches, and put it into
+ matches[0]. */
+static int
+compute_lcd_of_matches (match_list, matches, text)
+ char **match_list;
+ int matches;
+ const char *text;
+{
+ register int i, c1, c2, si;
+ int low; /* Count of max-matched characters. */
+#if defined (HANDLE_MULTIBYTE)
+ int v;
+ mbstate_t ps1, ps2;
+ wchar_t wc1, wc2;
+#endif
+
+ /* If only one match, just use that. Otherwise, compare each
+ member of the list with the next, finding out where they
+ stop matching. */
+ if (matches == 1)
+ {
+ match_list[0] = match_list[1];
+ match_list[1] = (char *)NULL;
+ return 1;
+ }
+
+ for (i = 1, low = 100000; i < matches; i++)
+ {
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ {
+ memset (&ps1, 0, sizeof (mbstate_t));
+ memset (&ps2, 0, sizeof (mbstate_t));
+ }
+#endif
+ if (_rl_completion_case_fold)
+ {
+ for (si = 0;
+ (c1 = _rl_to_lower(match_list[i][si])) &&
+ (c2 = _rl_to_lower(match_list[i + 1][si]));
+ si++)
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ {
+ v = mbrtowc (&wc1, match_list[i]+si, strlen (match_list[i]+si), &ps1);
+ mbrtowc (&wc2, match_list[i+1]+si, strlen (match_list[i+1]+si), &ps2);
+ wc1 = towlower (wc1);
+ wc2 = towlower (wc2);
+ if (wc1 != wc2)
+ break;
+ else if (v > 1)
+ si += v - 1;
+ }
+ else
+#endif
+ if (c1 != c2)
+ break;
+ }
+ else
+ {
+ for (si = 0;
+ (c1 = match_list[i][si]) &&
+ (c2 = match_list[i + 1][si]);
+ si++)
+#if defined (HANDLE_MULTIBYTE)
+ if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
+ {
+ mbstate_t ps_back = ps1;
+ if (!_rl_compare_chars (match_list[i], si, &ps1, match_list[i+1], si, &ps2))
+ break;
+ else if ((v = _rl_get_char_len (&match_list[i][si], &ps_back)) > 1)
+ si += v - 1;
+ }
+ else
+#endif
+ if (c1 != c2)
+ break;
+ }
+
+ if (low > si)
+ low = si;
+ }
+
+ /* If there were multiple matches, but none matched up to even the
+ first character, and the user typed something, use that as the
+ value of matches[0]. */
+ if (low == 0 && text && *text)
+ {
+ match_list[0] = (char *)xmalloc (strlen (text) + 1);
+ strcpy (match_list[0], text);
+ }
+ else
+ {
+ match_list[0] = (char *)xmalloc (low + 1);
+
+ /* XXX - this might need changes in the presence of multibyte chars */
+
+ /* If we are ignoring case, try to preserve the case of the string
+ the user typed in the face of multiple matches differing in case. */
+ if (_rl_completion_case_fold)
+ {
+ /* sort the list to get consistent answers. */
+ qsort (match_list+1, matches, sizeof(char *), (QSFUNC *)_rl_qsort_string_compare);
+
+ si = strlen (text);
+ if (si <= low)
+ {
+ for (i = 1; i <= matches; i++)
+ if (strncmp (match_list[i], text, si) == 0)
+ {
+ strncpy (match_list[0], match_list[i], low);
+ break;
+ }
+ /* no casematch, use first entry */
+ if (i > matches)
+ strncpy (match_list[0], match_list[1], low);
+ }
+ else
+ /* otherwise, just use the text the user typed. */
+ strncpy (match_list[0], text, low);
+ }
+ else
+ strncpy (match_list[0], match_list[1], low);
+
+ match_list[0][low] = '\0';
+ }
+
+ return matches;
+}
+
+static int
+postprocess_matches (matchesp, matching_filenames)
+ char ***matchesp;
+ int matching_filenames;
+{
+ char *t, **matches, **temp_matches;
+ int nmatch, i;
+
+ matches = *matchesp;
+
+ if (matches == 0)
+ return 0;
+
+ /* 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)
+ {
+ temp_matches = remove_duplicate_matches (matches);
+ free (matches);
+ matches = temp_matches;
+ }
+
+ /* 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 && matching_filenames)
+ {
+ for (nmatch = 1; matches[nmatch]; nmatch++)
+ ;
+ (void)(*rl_ignore_some_completions_function) (matches);
+ if (matches == 0 || matches[0] == 0)
+ {
+ FREE (matches);
+ *matchesp = (char **)0;
+ return 0;
+ }
+ else
+ {
+ /* If we removed some matches, recompute the common prefix. */
+ for (i = 1; matches[i]; i++)
+ ;
+ if (i > 1 && i < nmatch)
+ {
+ t = matches[0];
+ compute_lcd_of_matches (matches, i - 1, t);
+ FREE (t);
+ }
+ }
+ }
+
+ *matchesp = matches;
+ return (1);
+}
+
+/* A convenience function for displaying a list of strings in
+ columnar format on readline's output stream. MATCHES is the list
+ of strings, in argv format, LEN is the number of strings in MATCHES,
+ and MAX is the length of the longest string in MATCHES. */
+void
+rl_display_match_list (matches, len, max)
+ char **matches;
+ int len, max;
+{
+ int count, limit, printed_len, lines;
+ int i, j, k, l;
+ char *temp;
+
+ /* How many items of MAX length can we fit in the screen window? */
+ max += 2;
+ limit = _rl_screenwidth / max;
+ if (limit != 1 && (limit * max == _rl_screenwidth))
+ limit--;
+
+ /* Avoid a possible floating exception. If max > _rl_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.
+ 0 < len <= limit implies count = 1. */
+
+ /* Sort the items if they are not already sorted. */
+ if (rl_ignore_completion_duplicates == 0)
+ qsort (matches + 1, len, sizeof (char *), (QSFUNC *)_rl_qsort_string_compare);
+
+ rl_crlf ();
+
+ lines = 0;
+ if (_rl_print_completions_horizontally == 0)
+ {
+ /* Print the sorted items, up-and-down alphabetically, like ls. */
+ for (i = 1; i <= count; i++)
+ {
+ for (j = 0, l = i; j < limit; j++)
+ {
+ if (l > len || matches[l] == 0)
+ break;
+ else
+ {
+ temp = printable_part (matches[l]);
+ printed_len = print_filename (temp, matches[l]);
+
+ if (j + 1 < limit)
+ for (k = 0; k < max - printed_len; k++)
+ putc (' ', rl_outstream);
+ }
+ l += count;
+ }
+ rl_crlf ();
+ lines++;
+ if (_rl_page_completions && lines >= (_rl_screenheight - 1) && i < count)
+ {
+ lines = _rl_internal_pager (lines);
+ if (lines < 0)
+ return;
+ }
+ }
+ }
+ else
+ {
+ /* Print the sorted items, across alphabetically, like ls -x. */
+ for (i = 1; matches[i]; i++)
+ {
+ temp = printable_part (matches[i]);
+ printed_len = print_filename (temp, matches[i]);
+ /* Have we reached the end of this line? */
+ if (matches[i+1])
+ {
+ if (i && (limit > 1) && (i % limit) == 0)
+ {
+ rl_crlf ();
+ lines++;
+ if (_rl_page_completions && lines >= _rl_screenheight - 1)
+ {
+ lines = _rl_internal_pager (lines);
+ if (lines < 0)
+ return;
+ }
+ }
+ else
+ for (k = 0; k < max - printed_len; k++)
+ putc (' ', rl_outstream);
+ }
+ }
+ rl_crlf ();
+ }
+}
+
+/* Display MATCHES, a list of matching filenames in argv format. This
+ handles the simple case -- a single match -- first. If there is more
+ than one match, we compute the number of strings in the list and the
+ length of the longest string, which will be needed by the display
+ function. If the application wants to handle displaying the list of
+ matches itself, it sets RL_COMPLETION_DISPLAY_MATCHES_HOOK to the
+ address of a function, and we just call it. If we're handling the
+ display ourselves, we just call rl_display_match_list. We also check
+ that the list of matches doesn't exceed the user-settable threshold,
+ and ask the user if he wants to see the list if there are more matches
+ than RL_COMPLETION_QUERY_ITEMS. */
+static void
+display_matches (matches)
+ char **matches;
+{
+ int len, max, i;
+ char *temp;
+
+ /* Move to the last visible line of a possibly-multiple-line command. */
+ _rl_move_vert (_rl_vis_botlin);
+
+ /* Handle simple case first. What if there is only one answer? */
+ if (matches[1] == 0)
+ {
+ temp = printable_part (matches[0]);
+ rl_crlf ();
+ print_filename (temp, matches[0]);
+ rl_crlf ();
+
+ rl_forced_update_display ();
+ rl_display_fixed = 1;
+
+ return;
+ }
+
+ /* There is more than one answer. Find out how many there are,
+ and find the maximum printed length of a single entry. */
+ for (max = 0, i = 1; matches[i]; i++)
+ {
+ temp = printable_part (matches[i]);
+ len = strlen (temp);
+
+ if (len > max)
+ max = len;
+ }
+
+ len = i - 1;
+
+ /* If the caller has defined a display hook, then call that now. */
+ if (rl_completion_display_matches_hook)
+ {
+ (*rl_completion_display_matches_hook) (matches, len, max);
+ return;
+ }
+
+ /* If there are many items, then ask the user if she really wants to
+ see them all. */
+ if (len >= rl_completion_query_items)
+ {
+ rl_crlf ();
+ fprintf (rl_outstream, "Display all %d possibilities? (y or n)", len);
+ fflush (rl_outstream);
+ if (get_y_or_n (0) == 0)
+ {
+ rl_crlf ();
+
+ rl_forced_update_display ();
+ rl_display_fixed = 1;
+
+ return;
+ }
+ }
+
+ rl_display_match_list (matches, len, max);
+
+ rl_forced_update_display ();
+ rl_display_fixed = 1;
+}
+
+static char *
+make_quoted_replacement (match, mtype, qc)
+ char *match;
+ int mtype;
+ char *qc; /* Pointer to quoting character, if any */
+{
+ int should_quote, do_replace;
+ char *replacement;
+
+ /* 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 = match;
+
+ should_quote = match && rl_completer_quote_characters &&
+ rl_filename_completion_desired &&
+ rl_filename_quoting_desired;
+
+ if (should_quote)
+ should_quote = should_quote && (!qc || !*qc ||
+ (rl_completer_quote_characters && strchr (rl_completer_quote_characters, *qc)));
+
+ if (should_quote)
+ {
+ /* 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. */
+ should_quote = rl_filename_quote_characters
+ ? (_rl_strpbrk (match, rl_filename_quote_characters) != 0)
+ : 0;
+
+ do_replace = should_quote ? mtype : NO_MATCH;
+ /* Quote the replacement, since we found an embedded
+ word break character in a potential match. */
+ if (do_replace != NO_MATCH && rl_filename_quoting_function)
+ replacement = (*rl_filename_quoting_function) (match, do_replace, qc);
+ }
+ return (replacement);
+}
+
+static void
+insert_match (match, start, mtype, qc)
+ char *match;
+ int start, mtype;
+ char *qc;
+{
+ char *replacement;
+ char oqc;
+
+ oqc = qc ? *qc : '\0';
+ replacement = make_quoted_replacement (match, mtype, qc);
+
+ /* Now insert the match. */
+ if (replacement)
+ {
+ /* Don't double an opening quote character. */
+ if (qc && *qc && start && rl_line_buffer[start - 1] == *qc &&
+ replacement[0] == *qc)
+ start--;
+ /* If make_quoted_replacement changed the quoting character, remove
+ the opening quote and insert the (fully-quoted) replacement. */
+ else if (qc && (*qc != oqc) && start && rl_line_buffer[start - 1] == oqc &&
+ replacement[0] != oqc)
+ start--;
+ _rl_replace_text (replacement, start, rl_point - 1);
+ if (replacement != match)
+ free (replacement);
+ }
+}
+
+/* Append any necessary closing quote and a separator character to the
+ just-inserted match. If the user has specified that directories
+ should be marked by a trailing `/', append one of those instead. The
+ default trailing character is a space. Returns the number of characters
+ appended. If NONTRIVIAL_MATCH is set, we test for a symlink (if the OS
+ has them) and don't add a suffix for a symlink to a directory. A
+ nontrivial match is one that actually adds to the word being completed.
+ The variable rl_completion_mark_symlink_dirs controls this behavior
+ (it's initially set to the what the user has chosen, indicated by the
+ value of _rl_complete_mark_symlink_dirs, but may be modified by an
+ application's completion function). */
+static int
+append_to_match (text, delimiter, quote_char, nontrivial_match)
+ char *text;
+ int delimiter, quote_char, nontrivial_match;
+{
+ char temp_string[4], *filename;
+ int temp_string_index, s;
+ struct stat finfo;
+
+ temp_string_index = 0;
+ if (quote_char && rl_point && rl_line_buffer[rl_point - 1] != quote_char)
+ temp_string[temp_string_index++] = quote_char;
+
+ if (delimiter)
+ temp_string[temp_string_index++] = delimiter;
+ else if (rl_completion_suppress_append == 0 && rl_completion_append_character)
+ temp_string[temp_string_index++] = rl_completion_append_character;
+
+ temp_string[temp_string_index++] = '\0';
+
+ if (rl_filename_completion_desired)
+ {
+ filename = tilde_expand (text);
+ s = (nontrivial_match && rl_completion_mark_symlink_dirs == 0)
+ ? LSTAT (filename, &finfo)
+ : stat (filename, &finfo);
+ if (s == 0 && S_ISDIR (finfo.st_mode))
+ {
+ if (_rl_complete_mark_directories)
+ {
+ /* This is clumsy. Avoid putting in a double slash if point
+ is at the end of the line and the previous character is a
+ slash. */
+ if (rl_point && rl_line_buffer[rl_point] == '\0' && rl_line_buffer[rl_point - 1] == '/')
+ ;
+ else if (rl_line_buffer[rl_point] != '/')
+ rl_insert_text ("/");
+ }
+ }
+#ifdef S_ISLNK
+ /* Don't add anything if the filename is a symlink and resolves to a
+ directory. */
+ else if (s == 0 && S_ISLNK (finfo.st_mode) &&
+ stat (filename, &finfo) == 0 && S_ISDIR (finfo.st_mode))
+ ;
+#endif
+ else
+ {
+ if (rl_point == rl_end && temp_string_index)
+ rl_insert_text (temp_string);
+ }
+ free (filename);
+ }
+ else
+ {
+ if (rl_point == rl_end && temp_string_index)
+ rl_insert_text (temp_string);
+ }
+
+ return (temp_string_index);
+}
+
+static void
+insert_all_matches (matches, point, qc)
+ char **matches;
+ int point;
+ char *qc;
+{
+ int i;
+ char *rp;
+
+ rl_begin_undo_group ();
+ /* remove any opening quote character; make_quoted_replacement will add
+ it back. */
+ if (qc && *qc && point && rl_line_buffer[point - 1] == *qc)
+ point--;
+ rl_delete_text (point, rl_point);
+ rl_point = point;
+
+ if (matches[1])
+ {
+ for (i = 1; matches[i]; i++)
+ {
+ rp = make_quoted_replacement (matches[i], SINGLE_MATCH, qc);
+ rl_insert_text (rp);
+ rl_insert_text (" ");
+ if (rp != matches[i])
+ free (rp);
+ }
+ }
+ else
+ {
+ rp = make_quoted_replacement (matches[0], SINGLE_MATCH, qc);
+ rl_insert_text (rp);
+ rl_insert_text (" ");
+ if (rp != matches[0])
+ free (rp);
+ }
+ rl_end_undo_group ();
+}
+
+void
+_rl_free_match_list (matches)
+ char **matches;
+{
+ register int i;
+
+ if (matches == 0)
+ return;
+
+ for (i = 0; matches[i]; i++)
+ free (matches[i]);
+ free (matches);
+}
+
+/* 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. */
+int
+rl_complete_internal (what_to_do)
+ int what_to_do;
+{
+ char **matches;
+ rl_compentry_func_t *our_func;
+ int start, end, delimiter, found_quote, i, nontrivial_lcd;
+ char *text, *saved_line_buffer;
+ char quote_char;
+
+ RL_SETSTATE(RL_STATE_COMPLETING);
+
+ set_completion_defaults (what_to_do);
+
+ saved_line_buffer = rl_line_buffer ? savestring (rl_line_buffer) : (char *)NULL;
+ our_func = rl_completion_entry_function
+ ? rl_completion_entry_function
+ : rl_filename_completion_function;
+
+ /* We now look backwards for the start of a filename/variable word. */
+ end = rl_point;
+ found_quote = delimiter = 0;
+ quote_char = '\0';
+
+ if (rl_point)
+ /* This (possibly) changes rl_point. If it returns a non-zero char,
+ we know we have an open quote. */
+ quote_char = _rl_find_completion_word (&found_quote, &delimiter);
+
+ start = rl_point;
+ rl_point = end;
+
+ text = rl_copy_text (start, end);
+ matches = gen_completion_matches (text, start, end, our_func, found_quote, quote_char);
+ /* nontrivial_lcd is set if the common prefix adds something to the word
+ being completed. */
+ nontrivial_lcd = matches && strcmp (text, matches[0]) != 0;
+ free (text);
+
+ if (matches == 0)
+ {
+ rl_ding ();
+ FREE (saved_line_buffer);
+ completion_changed_buffer = 0;
+ RL_UNSETSTATE(RL_STATE_COMPLETING);
+ return (0);
+ }
+
+ /* If we are matching filenames, the attempted completion function will
+ have set rl_filename_completion_desired to a non-zero value. The basic
+ rl_filename_completion_function does this. */
+ i = rl_filename_completion_desired;
+
+ if (postprocess_matches (&matches, i) == 0)
+ {
+ rl_ding ();
+ FREE (saved_line_buffer);
+ completion_changed_buffer = 0;
+ RL_UNSETSTATE(RL_STATE_COMPLETING);
+ return (0);
+ }
+
+ switch (what_to_do)
+ {
+ case TAB:
+ case '!':
+ /* Insert the first match with proper quoting. */
+ if (*matches[0])
+ insert_match (matches[0], start, matches[1] ? MULT_MATCH : SINGLE_MATCH, &quote_char);
+
+ /* If there are more matches, ring the bell to indicate.
+ If we are in vi mode, Posix.2 says to not ring the bell.
+ If the `show-all-if-ambiguous' variable is set, display
+ all the matches immediately. Otherwise, if this was the
+ only match, and we are hacking files, check the file to
+ see if it was a directory. If so, and the `mark-directories'
+ variable is set, 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 == '!')
+ {
+ display_matches (matches);
+ break;
+ }
+ else if (rl_editing_mode != vi_mode)
+ rl_ding (); /* There are other matches remaining. */
+ }
+ else
+ append_to_match (matches[0], delimiter, quote_char, nontrivial_lcd);
+
+ break;
+
+ case '*':
+ insert_all_matches (matches, start, &quote_char);
+ break;
+
+ case '?':
+ display_matches (matches);
+ break;
+
+ default:
+ fprintf (stderr, "\r\nreadline: bad value %d for what_to_do in rl_complete\n", what_to_do);
+ rl_ding ();
+ FREE (saved_line_buffer);
+ RL_UNSETSTATE(RL_STATE_COMPLETING);
+ return 1;
+ }
+
+ _rl_free_match_list (matches);
+
+ /* Check to see if the line has changed through all of this manipulation. */
+ if (saved_line_buffer)
+ {
+ completion_changed_buffer = strcmp (rl_line_buffer, saved_line_buffer) != 0;
+ free (saved_line_buffer);
+ }
+
+ RL_UNSETSTATE(RL_STATE_COMPLETING);
+ return 0;
+}
+
+/***************************************************************/
+/* */
+/* Application-callable completion match generator functions */
+/* */
+/***************************************************************/
+
+/* 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 **
+rl_completion_matches (text, entry_function)
+ const char *text;
+ rl_compentry_func_t *entry_function;
+{
+ /* Number of slots in match_list. */
+ int match_list_size;
+
+ /* The list of matches. */
+ char **match_list;
+
+ /* Number of matches actually found. */
+ int matches;
+
+ /* Temporary string binder. */
+ char *string;
+
+ matches = 0;
+ match_list_size = 10;
+ match_list = (char **)xmalloc ((match_list_size + 1) * sizeof (char *));
+ 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)
+ compute_lcd_of_matches (match_list, matches, text);
+ else /* There were no matches. */
+ {
+ free (match_list);
+ match_list = (char **)NULL;
+ }
+ return (match_list);
+}
+
+/* A completion function for usernames.
+ TEXT contains a partial username preceded by a random
+ character (usually `~'). */
+char *
+rl_username_completion_function (text, state)
+ const char *text;
+ int state;
+{
+#if defined (__WIN32__) || defined (__OPENNT)
+ return (char *)NULL;
+#else /* !__WIN32__ && !__OPENNT) */
+ static char *username = (char *)NULL;
+ static struct passwd *entry;
+ static int namelen, first_char, first_char_loc;
+ char *value;
+
+ if (state == 0)
+ {
+ FREE (username);
+
+ first_char = *text;
+ first_char_loc = first_char == '~';
+
+ username = savestring (&text[first_char_loc]);
+ namelen = strlen (username);
+ setpwent ();
+ }
+
+ while (entry = getpwent ())
+ {
+ /* Null usernames should result in all users as possible completions. */
+ if (namelen == 0 || (STREQN (username, entry->pw_name, namelen)))
+ break;
+ }
+
+ if (entry == 0)
+ {
+ endpwent ();
+ return ((char *)NULL);
+ }
+ else
+ {
+ 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 /* !__WIN32__ && !__OPENNT */
+}
+
+/* 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 *
+rl_filename_completion_function (text, state)
+ const char *text;
+ int state;
+{
+ static DIR *directory = (DIR *)NULL;
+ static char *filename = (char *)NULL;
+ static char *dirname = (char *)NULL;
+ static char *users_dirname = (char *)NULL;
+ static int filename_len;
+ char *temp;
+ int dirlen;
+ struct dirent *entry;
+
+ /* If we don't have any state, then do some initialization. */
+ if (state == 0)
+ {
+ /* If we were interrupted before closing the directory or reading
+ all of its contents, close it. */
+ if (directory)
+ {
+ closedir (directory);
+ directory = (DIR *)NULL;
+ }
+ FREE (dirname);
+ FREE (filename);
+ FREE (users_dirname);
+
+ filename = savestring (text);
+ if (*text == 0)
+ text = ".";
+ dirname = savestring (text);
+
+ temp = strrchr (dirname, '/');
+
+#if defined (__MSDOS__)
+ /* special hack for //X/... */
+ if (dirname[0] == '/' && dirname[1] == '/' && ISALPHA ((unsigned char)dirname[2]) && dirname[3] == '/')
+ temp = strrchr (dirname + 3, '/');
+#endif
+
+ if (temp)
+ {
+ strcpy (filename, ++temp);
+ *temp = '\0';
+ }
+#if defined (__MSDOS__)
+ /* searches from current directory on the drive */
+ else if (ISALPHA ((unsigned char)dirname[0]) && dirname[1] == ':')
+ {
+ strcpy (filename, dirname + 2);
+ dirname[2] = '\0';
+ }
+#endif
+ else
+ {
+ dirname[0] = '.';
+ dirname[1] = '\0';
+ }
+
+ /* 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);
+
+ if (*dirname == '~')
+ {
+ temp = tilde_expand (dirname);
+ free (dirname);
+ dirname = temp;
+ }
+
+ if (rl_directory_rewrite_hook)
+ (*rl_directory_rewrite_hook) (&dirname);
+
+ if (rl_directory_completion_hook && (*rl_directory_completion_hook) (&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. */
+
+ entry = (struct dirent *)NULL;
+ while (directory && (entry = readdir (directory)))
+ {
+ /* Special case for no filename. If the user has disabled the
+ `match-hidden-files' variable, skip filenames beginning with `.'.
+ All other entries except "." and ".." match. */
+ if (filename_len == 0)
+ {
+ if (_rl_match_hidden_files == 0 && HIDDEN_FILE (entry->d_name))
+ continue;
+
+ if (entry->d_name[0] != '.' ||
+ (entry->d_name[1] &&
+ (entry->d_name[1] != '.' || entry->d_name[2])))
+ break;
+ }
+ else
+ {
+ /* Otherwise, if these match up to the length of filename, then
+ it is a match. */
+ if (_rl_completion_case_fold)
+ {
+ if ((_rl_to_lower (entry->d_name[0]) == _rl_to_lower (filename[0])) &&
+ (((int)D_NAMLEN (entry)) >= filename_len) &&
+ (_rl_strnicmp (filename, entry->d_name, filename_len) == 0))
+ break;
+ }
+ else
+ {
+ if ((entry->d_name[0] == filename[0]) &&
+ (((int)D_NAMLEN (entry)) >= filename_len) &&
+ (strncmp (filename, entry->d_name, filename_len) == 0))
+ break;
+ }
+ }
+ }
+
+ if (entry == 0)
+ {
+ 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
+ {
+ /* dirname && (strcmp (dirname, ".") != 0) */
+ if (dirname && (dirname[0] != '.' || dirname[1]))
+ {
+ if (rl_complete_with_tilde_expansion && *users_dirname == '~')
+ {
+ dirlen = strlen (dirname);
+ temp = (char *)xmalloc (2 + dirlen + D_NAMLEN (entry));
+ strcpy (temp, dirname);
+ /* Canonicalization cuts off any final slash present. We
+ may need to add it back. */
+ if (dirname[dirlen - 1] != '/')
+ {
+ temp[dirlen++] = '/';
+ temp[dirlen] = '\0';
+ }
+ }
+ else
+ {
+ dirlen = strlen (users_dirname);
+ temp = (char *)xmalloc (2 + dirlen + D_NAMLEN (entry));
+ strcpy (temp, users_dirname);
+ /* Make sure that temp has a trailing slash here. */
+ if (users_dirname[dirlen - 1] != '/')
+ temp[dirlen++] = '/';
+ }
+
+ strcpy (temp + dirlen, entry->d_name);
+ }
+ else
+ temp = savestring (entry->d_name);
+
+ return (temp);
+ }
+}
+
+/* An initial implementation of a menu completion function a la tcsh. The
+ first time (if the last readline command was not rl_menu_complete), we
+ generate the list of matches. This code is very similar to the code in
+ rl_complete_internal -- there should be a way to combine the two. Then,
+ for each item in the list of matches, we insert the match in an undoable
+ fashion, with the appropriate character appended (this happens on the
+ second and subsequent consecutive calls to rl_menu_complete). When we
+ hit the end of the match list, we restore the original unmatched text,
+ ring the bell, and reset the counter to zero. */
+int
+rl_menu_complete (count, ignore)
+ int count, ignore;
+{
+ rl_compentry_func_t *our_func;
+ int matching_filenames, found_quote;
+
+ static char *orig_text;
+ static char **matches = (char **)0;
+ static int match_list_index = 0;
+ static int match_list_size = 0;
+ static int orig_start, orig_end;
+ static char quote_char;
+ static int delimiter;
+
+ /* The first time through, we generate the list of matches and set things
+ up to insert them. */
+ if (rl_last_func != rl_menu_complete)
+ {
+ /* Clean up from previous call, if any. */
+ FREE (orig_text);
+ if (matches)
+ _rl_free_match_list (matches);
+
+ match_list_index = match_list_size = 0;
+ matches = (char **)NULL;
+
+ /* Only the completion entry function can change these. */
+ set_completion_defaults ('%');
+
+ our_func = rl_completion_entry_function
+ ? rl_completion_entry_function
+ : rl_filename_completion_function;
+
+ /* We now look backwards for the start of a filename/variable word. */
+ orig_end = rl_point;
+ found_quote = delimiter = 0;
+ quote_char = '\0';
+
+ if (rl_point)
+ /* This (possibly) changes rl_point. If it returns a non-zero char,
+ we know we have an open quote. */
+ quote_char = _rl_find_completion_word (&found_quote, &delimiter);
+
+ orig_start = rl_point;
+ rl_point = orig_end;
+
+ orig_text = rl_copy_text (orig_start, orig_end);
+ matches = gen_completion_matches (orig_text, orig_start, orig_end,
+ our_func, found_quote, quote_char);
+
+ /* If we are matching filenames, the attempted completion function will
+ have set rl_filename_completion_desired to a non-zero value. The basic
+ rl_filename_completion_function does this. */
+ matching_filenames = rl_filename_completion_desired;
+
+ if (matches == 0 || postprocess_matches (&matches, matching_filenames) == 0)
+ {
+ rl_ding ();
+ FREE (matches);
+ matches = (char **)0;
+ FREE (orig_text);
+ orig_text = (char *)0;
+ completion_changed_buffer = 0;
+ return (0);
+ }
+
+ for (match_list_size = 0; matches[match_list_size]; match_list_size++)
+ ;
+ /* matches[0] is lcd if match_list_size > 1, but the circular buffer
+ code below should take care of it. */
+ }
+
+ /* Now we have the list of matches. Replace the text between
+ rl_line_buffer[orig_start] and rl_line_buffer[rl_point] with
+ matches[match_list_index], and add any necessary closing char. */
+
+ if (matches == 0 || match_list_size == 0)
+ {
+ rl_ding ();
+ FREE (matches);
+ matches = (char **)0;
+ completion_changed_buffer = 0;
+ return (0);
+ }
+
+ match_list_index = (match_list_index + count) % match_list_size;
+ if (match_list_index < 0)
+ match_list_index += match_list_size;
+
+ if (match_list_index == 0 && match_list_size > 1)
+ {
+ rl_ding ();
+ insert_match (orig_text, orig_start, MULT_MATCH, &quote_char);
+ }
+ else
+ {
+ insert_match (matches[match_list_index], orig_start, SINGLE_MATCH, &quote_char);
+ append_to_match (matches[match_list_index], delimiter, quote_char,
+ strcmp (orig_text, matches[match_list_index]));
+ }
+
+ completion_changed_buffer = 1;
+ return (0);
+}