From 3102470d94db36e49a2262542f69cc4219ae1aee Mon Sep 17 00:00:00 2001 From: sheldonh Date: Thu, 31 Jan 2002 14:20:50 +0000 Subject: [PATCH 1/6] Fix deadlock between warning display and refresh engines. This fix is taken from nvi-1.51.5. PR: bin/3170 Reported by: fenner Obtained from: skimo@kotnet.org MFC after: 1 month --- contrib/nvi/vi/vs_line.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/contrib/nvi/vi/vs_line.c b/contrib/nvi/vi/vs_line.c index e48d5ef5e917..2e5166227b35 100644 --- a/contrib/nvi/vi/vs_line.c +++ b/contrib/nvi/vi/vs_line.c @@ -49,7 +49,7 @@ vs_line(sp, smp, yp, xp) size_t chlen, cno_cnt, cols_per_screen, len, nlen; size_t offset_in_char, offset_in_line, oldx, oldy; size_t scno, skip_cols, skip_screens; - int ch, dne, is_cached, is_partial, is_tab; + int ch, dne, is_cached, is_partial, is_tab, no_draw; int list_tab, list_dollar; char *p, *cbp, *ecbp, cbuf[128]; @@ -61,10 +61,11 @@ vs_line(sp, smp, yp, xp) * If ex modifies the screen after ex output is already on the screen, * don't touch it -- we'll get scrolling wrong, at best. */ + no_draw = 0; if (!F_ISSET(sp, SC_TINPUT_INFO) && VIP(sp)->totalcount > 1) - return (0); + no_draw = 1; if (F_ISSET(sp, SC_SCR_EXWROTE) && smp - HMAP != LASTLINE(sp)) - return (0); + no_draw = 1; /* * Assume that, if the cache entry for the line is filled in, the @@ -73,7 +74,7 @@ vs_line(sp, smp, yp, xp) * cursor position, we can just return. */ is_cached = SMAP_CACHE(smp); - if (yp == NULL && is_cached) + if (yp == NULL && (is_cached || no_draw)) return (0); /* @@ -158,7 +159,7 @@ vs_line(sp, smp, yp, xp) } /* If the line is on the screen, quit. */ - if (is_cached) + if (is_cached || no_draw) goto ret1; /* Set line cache information. */ @@ -325,7 +326,7 @@ empty: (void)gp->scr_addstr(sp, offset_in_line + cols_per_screen < sp->cno) { cno_cnt = 0; /* If the line is on the screen, quit. */ - if (is_cached) + if (is_cached || no_draw) goto ret1; } else cno_cnt = (sp->cno - offset_in_line) + 1; @@ -389,12 +390,12 @@ empty: (void)gp->scr_addstr(sp, *xp += O_NUMBER_LENGTH; /* If the line is on the screen, quit. */ - if (is_cached) + if (is_cached || no_draw) goto ret1; } /* If the line is on the screen, don't display anything. */ - if (is_cached) + if (is_cached || no_draw) continue; #define FLUSH { \ From 75700a8c067d4d910e2017f0aa29cbbca644f9cc Mon Sep 17 00:00:00 2001 From: peter Date: Sun, 11 Aug 2013 08:38:10 +0000 Subject: [PATCH 2/6] Post-cvs2svn flatten pass. --- contrib/nvi/FAQ => FAQ | 0 contrib/nvi/LAYOUT => LAYOUT | 0 contrib/nvi/LICENSE => LICENSE | 0 contrib/nvi/README => README | 0 {contrib/nvi/build => build}/ExtUtils/Embed.pm | 0 {contrib/nvi/build => build}/Makefile.in | 0 {contrib/nvi/build => build}/README | 0 {contrib/nvi/build => build}/README.LynxOS | 0 {contrib/nvi/build => build}/acconfig.h | 0 {contrib/nvi/build => build}/aclocal.m4 | 0 {contrib/nvi/build => build}/config.guess | 0 {contrib/nvi/build => build}/config.h.in | 0 {contrib/nvi/build => build}/config.sub | 0 {contrib/nvi/build => build}/configure | 0 {contrib/nvi/build => build}/configure.in | 0 {contrib/nvi/build => build}/distrib | 0 {contrib/nvi/build => build}/install-sh | 0 {contrib/nvi/build => build}/pathnames.h.in | 0 {contrib/nvi/build => build}/port.h.in | 0 {contrib/nvi/build => build}/recover.in | 0 {contrib/nvi/build => build}/spell.ok | 0 {contrib/nvi/catalog => catalog}/Makefile | 0 {contrib/nvi/catalog => catalog}/README | 0 {contrib/nvi/catalog => catalog}/dump.c | 0 {contrib/nvi/catalog => catalog}/dutch | 0 {contrib/nvi/catalog => catalog}/dutch.base | 0 {contrib/nvi/catalog => catalog}/dutch.check | 0 {contrib/nvi/catalog => catalog}/dutch.owner | 0 {contrib/nvi/catalog => catalog}/english | 0 {contrib/nvi/catalog => catalog}/english.base | 0 {contrib/nvi/catalog => catalog}/english.check | 0 {contrib/nvi/catalog => catalog}/english.owner | 0 {contrib/nvi/catalog => catalog}/french | 0 {contrib/nvi/catalog => catalog}/french.base | 0 {contrib/nvi/catalog => catalog}/french.check | 0 {contrib/nvi/catalog => catalog}/german | 0 {contrib/nvi/catalog => catalog}/german.base | 0 {contrib/nvi/catalog => catalog}/german.check | 0 {contrib/nvi/catalog => catalog}/german.owner | 0 {contrib/nvi/catalog => catalog}/ru_RU.KOI8-R | 0 {contrib/nvi/catalog => catalog}/ru_RU.KOI8-R.base | 0 {contrib/nvi/catalog => catalog}/ru_RU.KOI8-R.check | 0 {contrib/nvi/catalog => catalog}/ru_RU.KOI8-R.owner | 0 {contrib/nvi/catalog => catalog}/ru_SU.KOI8-R | 0 {contrib/nvi/catalog => catalog}/ru_SU.KOI8-R.base | 0 {contrib/nvi/catalog => catalog}/ru_SU.KOI8-R.check | 0 {contrib/nvi/catalog => catalog}/ru_SU.KOI8-R.owner | 0 {contrib/nvi/catalog => catalog}/spanish | 0 {contrib/nvi/catalog => catalog}/spanish.base | 0 {contrib/nvi/catalog => catalog}/spanish.check | 0 {contrib/nvi/catalog => catalog}/spell.ok | 0 {contrib/nvi/catalog => catalog}/swedish | 0 {contrib/nvi/catalog => catalog}/swedish.base | 0 {contrib/nvi/catalog => catalog}/swedish.check | 0 {contrib/nvi/catalog => catalog}/swedish.owner | 0 {contrib/nvi/cl => cl}/README.signal | 0 {contrib/nvi/cl => cl}/cl.h | 0 {contrib/nvi/cl => cl}/cl_bsd.c | 0 {contrib/nvi/cl => cl}/cl_funcs.c | 0 {contrib/nvi/cl => cl}/cl_main.c | 0 {contrib/nvi/cl => cl}/cl_read.c | 0 {contrib/nvi/cl => cl}/cl_screen.c | 0 {contrib/nvi/cl => cl}/cl_term.c | 0 {contrib/nvi/clib => clib}/bsearch.c | 0 {contrib/nvi/clib => clib}/env.c | 0 {contrib/nvi/clib => clib}/gethostname.c | 0 {contrib/nvi/clib => clib}/getopt.c | 0 {contrib/nvi/clib => clib}/memchr.c | 0 {contrib/nvi/clib => clib}/memmove.c | 0 {contrib/nvi/clib => clib}/memset.c | 0 {contrib/nvi/clib => clib}/mkstemp.c | 0 {contrib/nvi/clib => clib}/mmap.c | 0 {contrib/nvi/clib => clib}/snprintf.c | 0 {contrib/nvi/clib => clib}/strdup.c | 0 {contrib/nvi/clib => clib}/strerror.c | 0 {contrib/nvi/clib => clib}/strpbrk.c | 0 {contrib/nvi/clib => clib}/strsep.c | 0 {contrib/nvi/clib => clib}/strtol.c | 0 {contrib/nvi/clib => clib}/strtoul.c | 0 {contrib/nvi/clib => clib}/vsnprintf.c | 0 {contrib/nvi/common => common}/api.c | 0 {contrib/nvi/common => common}/args.h | 0 {contrib/nvi/common => common}/common.h | 0 {contrib/nvi/common => common}/cut.c | 0 {contrib/nvi/common => common}/cut.h | 0 {contrib/nvi/common => common}/delete.c | 0 {contrib/nvi/common => common}/exf.c | 0 {contrib/nvi/common => common}/exf.h | 0 {contrib/nvi/common => common}/gs.h | 0 {contrib/nvi/common => common}/key.c | 0 {contrib/nvi/common => common}/key.h | 0 {contrib/nvi/common => common}/line.c | 0 {contrib/nvi/common => common}/log.c | 0 {contrib/nvi/common => common}/log.h | 0 {contrib/nvi/common => common}/main.c | 0 {contrib/nvi/common => common}/mark.c | 0 {contrib/nvi/common => common}/mark.h | 0 {contrib/nvi/common => common}/mem.h | 0 {contrib/nvi/common => common}/msg.c | 0 {contrib/nvi/common => common}/msg.h | 0 {contrib/nvi/common => common}/options.awk | 0 {contrib/nvi/common => common}/options.c | 0 {contrib/nvi/common => common}/options.h | 0 {contrib/nvi/common => common}/options_f.c | 0 {contrib/nvi/common => common}/put.c | 0 {contrib/nvi/common => common}/recover.c | 0 {contrib/nvi/common => common}/screen.c | 0 {contrib/nvi/common => common}/screen.h | 0 {contrib/nvi/common => common}/search.c | 0 {contrib/nvi/common => common}/seq.c | 0 {contrib/nvi/common => common}/seq.h | 0 {contrib/nvi/common => common}/util.c | 0 {contrib/nvi/common => common}/util.h | 0 {contrib/nvi/docs => docs}/TODO | 0 {contrib/nvi/docs => docs}/USD.doc/edit/Makefile | 0 {contrib/nvi/docs => docs}/USD.doc/edit/edit.vindex | 0 {contrib/nvi/docs => docs}/USD.doc/edit/edittut.ms | 0 {contrib/nvi/docs => docs}/USD.doc/exref/Makefile | 0 {contrib/nvi/docs => docs}/USD.doc/exref/ex.rm | 0 {contrib/nvi/docs => docs}/USD.doc/exref/ex.summary | 0 {contrib/nvi/docs => docs}/USD.doc/vi.man/Makefile | 0 {contrib/nvi/docs => docs}/USD.doc/vi.man/spell.ok | 0 {contrib/nvi/docs => docs}/USD.doc/vi.man/vi.1 | 0 {contrib/nvi/docs => docs}/USD.doc/vi.ref/Makefile | 0 {contrib/nvi/docs => docs}/USD.doc/vi.ref/ex.cmd.roff | 0 {contrib/nvi/docs => docs}/USD.doc/vi.ref/index.so | 0 {contrib/nvi/docs => docs}/USD.doc/vi.ref/merge.awk | 0 {contrib/nvi/docs => docs}/USD.doc/vi.ref/ref.so | 0 {contrib/nvi/docs => docs}/USD.doc/vi.ref/set.opt.roff | 0 {contrib/nvi/docs => docs}/USD.doc/vi.ref/spell.ok | 0 {contrib/nvi/docs => docs}/USD.doc/vi.ref/vi.cmd.roff | 0 {contrib/nvi/docs => docs}/USD.doc/vi.ref/vi.ref | 0 {contrib/nvi/docs => docs}/USD.doc/vitut/Makefile | 0 {contrib/nvi/docs => docs}/USD.doc/vitut/vi.apwh.ms | 0 {contrib/nvi/docs => docs}/USD.doc/vitut/vi.chars | 0 {contrib/nvi/docs => docs}/USD.doc/vitut/vi.in | 0 {contrib/nvi/docs => docs}/USD.doc/vitut/vi.summary | 0 {contrib/nvi/docs => docs}/changelog | 0 {contrib/nvi/docs => docs}/ev | 0 {contrib/nvi/docs => docs}/features | 0 {contrib/nvi/docs => docs}/help | 0 {contrib/nvi/docs => docs}/internals/autowrite | 0 {contrib/nvi/docs => docs}/internals/context | 0 {contrib/nvi/docs => docs}/internals/cscope.NOTES | 0 {contrib/nvi/docs => docs}/internals/gdb.script | 0 {contrib/nvi/docs => docs}/internals/input | 0 {contrib/nvi/docs => docs}/internals/openmode | 0 {contrib/nvi/docs => docs}/internals/quoting | 0 {contrib/nvi/docs => docs}/internals/structures | 0 {contrib/nvi/docs => docs}/interp/interp | 0 {contrib/nvi/docs => docs}/interp/spell.ok | 0 {contrib/nvi/docs => docs}/spell.ok | 0 {contrib/nvi/docs => docs}/tutorial/vi.advanced | 0 {contrib/nvi/docs => docs}/tutorial/vi.beginner | 0 {contrib/nvi/docs => docs}/tutorial/vi.tut.csh | 0 {contrib/nvi/ex => ex}/ex.awk | 0 {contrib/nvi/ex => ex}/ex.c | 0 {contrib/nvi/ex => ex}/ex.h | 0 {contrib/nvi/ex => ex}/ex_abbrev.c | 0 {contrib/nvi/ex => ex}/ex_append.c | 0 {contrib/nvi/ex => ex}/ex_args.c | 0 {contrib/nvi/ex => ex}/ex_argv.c | 0 {contrib/nvi/ex => ex}/ex_at.c | 0 {contrib/nvi/ex => ex}/ex_bang.c | 0 {contrib/nvi/ex => ex}/ex_cd.c | 0 {contrib/nvi/ex => ex}/ex_cmd.c | 0 {contrib/nvi/ex => ex}/ex_cscope.c | 0 {contrib/nvi/ex => ex}/ex_delete.c | 0 {contrib/nvi/ex => ex}/ex_display.c | 0 {contrib/nvi/ex => ex}/ex_edit.c | 0 {contrib/nvi/ex => ex}/ex_equal.c | 0 {contrib/nvi/ex => ex}/ex_file.c | 0 {contrib/nvi/ex => ex}/ex_filter.c | 0 {contrib/nvi/ex => ex}/ex_global.c | 0 {contrib/nvi/ex => ex}/ex_init.c | 0 {contrib/nvi/ex => ex}/ex_join.c | 0 {contrib/nvi/ex => ex}/ex_map.c | 0 {contrib/nvi/ex => ex}/ex_mark.c | 0 {contrib/nvi/ex => ex}/ex_mkexrc.c | 0 {contrib/nvi/ex => ex}/ex_move.c | 0 {contrib/nvi/ex => ex}/ex_open.c | 0 {contrib/nvi/ex => ex}/ex_perl.c | 0 {contrib/nvi/ex => ex}/ex_preserve.c | 0 {contrib/nvi/ex => ex}/ex_print.c | 0 {contrib/nvi/ex => ex}/ex_put.c | 0 {contrib/nvi/ex => ex}/ex_quit.c | 0 {contrib/nvi/ex => ex}/ex_read.c | 0 {contrib/nvi/ex => ex}/ex_screen.c | 0 {contrib/nvi/ex => ex}/ex_script.c | 0 {contrib/nvi/ex => ex}/ex_set.c | 0 {contrib/nvi/ex => ex}/ex_shell.c | 0 {contrib/nvi/ex => ex}/ex_shift.c | 0 {contrib/nvi/ex => ex}/ex_source.c | 0 {contrib/nvi/ex => ex}/ex_stop.c | 0 {contrib/nvi/ex => ex}/ex_subst.c | 0 {contrib/nvi/ex => ex}/ex_tag.c | 0 {contrib/nvi/ex => ex}/ex_tcl.c | 0 {contrib/nvi/ex => ex}/ex_txt.c | 0 {contrib/nvi/ex => ex}/ex_undo.c | 0 {contrib/nvi/ex => ex}/ex_usage.c | 0 {contrib/nvi/ex => ex}/ex_util.c | 0 {contrib/nvi/ex => ex}/ex_version.c | 0 {contrib/nvi/ex => ex}/ex_visual.c | 0 {contrib/nvi/ex => ex}/ex_write.c | 0 {contrib/nvi/ex => ex}/ex_yank.c | 0 {contrib/nvi/ex => ex}/ex_z.c | 0 {contrib/nvi/ex => ex}/script.h | 0 {contrib/nvi/ex => ex}/tag.h | 0 {contrib/nvi/ex => ex}/version.h | 0 {contrib/nvi/include => include}/bitstring.h | 0 {contrib/nvi/include => include}/cl_extern.h | 0 {contrib/nvi/include => include}/com_extern.h | 0 {contrib/nvi/include => include}/ex_def.h | 0 {contrib/nvi/include => include}/ex_extern.h | 0 {contrib/nvi/include => include}/ip_extern.h | 0 {contrib/nvi/include => include}/options_def.h | 0 {contrib/nvi/include => include}/perl_extern.h | 0 {contrib/nvi/include => include}/sys/queue.h | 0 {contrib/nvi/include => include}/tcl_extern.h | 0 {contrib/nvi/include => include}/tk_extern.h | 0 {contrib/nvi/include => include}/vi_extern.h | 0 {contrib/nvi/ip => ip}/IP_INSTRUCTIONS | 0 {contrib/nvi/ip => ip}/ip.h | 0 {contrib/nvi/ip => ip}/ip_funcs.c | 0 {contrib/nvi/ip => ip}/ip_main.c | 0 {contrib/nvi/ip => ip}/ip_read.c | 0 {contrib/nvi/ip => ip}/ip_screen.c | 0 {contrib/nvi/ip => ip}/ip_term.c | 0 {contrib/nvi/ip_cl => ip_cl}/Makefile | 0 {contrib/nvi/ip_cl => ip_cl}/ip_cl.c | 0 {contrib/nvi/perl_api => perl_api}/VI.pod | 0 {contrib/nvi/perl_api => perl_api}/nviperl.pod | 0 {contrib/nvi/perl_api => perl_api}/perl.xs | 0 {contrib/nvi/perl_api => perl_api}/perlsfio.c | 0 {contrib/nvi/perl_api => perl_api}/typemap | 0 {contrib/nvi/perl_scripts => perl_scripts}/forall.pl | 0 {contrib/nvi/perl_scripts => perl_scripts}/make.pl | 0 {contrib/nvi/perl_scripts => perl_scripts}/tk.pl | 0 {contrib/nvi/perl_scripts => perl_scripts}/wc.pl | 0 {contrib/nvi/tcl_api => tcl_api}/tcl.c | 0 {contrib/nvi/tcl_scripts => tcl_scripts}/errors.tcl | 0 {contrib/nvi/tcl_scripts => tcl_scripts}/gnats.tcl | 0 {contrib/nvi/tcl_scripts => tcl_scripts}/mailprocs.tcl | 0 {contrib/nvi/tcl_scripts => tcl_scripts}/wc.tcl | 0 {contrib/nvi/tk => tk}/init.tcl | 0 {contrib/nvi/tk => tk}/tk_funcs.c | 0 {contrib/nvi/tk => tk}/tk_main.c | 0 {contrib/nvi/tk => tk}/tk_read.c | 0 {contrib/nvi/tk => tk}/tk_screen.c | 0 {contrib/nvi/tk => tk}/tk_term.c | 0 {contrib/nvi/tk => tk}/tk_util.c | 0 {contrib/nvi/tk => tk}/tki.h | 0 {contrib/nvi/vi => vi}/getc.c | 0 {contrib/nvi/vi => vi}/v_at.c | 0 {contrib/nvi/vi => vi}/v_ch.c | 0 {contrib/nvi/vi => vi}/v_cmd.c | 0 {contrib/nvi/vi => vi}/v_delete.c | 0 {contrib/nvi/vi => vi}/v_ex.c | 0 {contrib/nvi/vi => vi}/v_increment.c | 0 {contrib/nvi/vi => vi}/v_init.c | 0 {contrib/nvi/vi => vi}/v_itxt.c | 0 {contrib/nvi/vi => vi}/v_left.c | 0 {contrib/nvi/vi => vi}/v_mark.c | 0 {contrib/nvi/vi => vi}/v_match.c | 0 {contrib/nvi/vi => vi}/v_paragraph.c | 0 {contrib/nvi/vi => vi}/v_put.c | 0 {contrib/nvi/vi => vi}/v_redraw.c | 0 {contrib/nvi/vi => vi}/v_replace.c | 0 {contrib/nvi/vi => vi}/v_right.c | 0 {contrib/nvi/vi => vi}/v_screen.c | 0 {contrib/nvi/vi => vi}/v_scroll.c | 0 {contrib/nvi/vi => vi}/v_search.c | 0 {contrib/nvi/vi => vi}/v_section.c | 0 {contrib/nvi/vi => vi}/v_sentence.c | 0 {contrib/nvi/vi => vi}/v_status.c | 0 {contrib/nvi/vi => vi}/v_txt.c | 0 {contrib/nvi/vi => vi}/v_ulcase.c | 0 {contrib/nvi/vi => vi}/v_undo.c | 0 {contrib/nvi/vi => vi}/v_util.c | 0 {contrib/nvi/vi => vi}/v_word.c | 0 {contrib/nvi/vi => vi}/v_xchar.c | 0 {contrib/nvi/vi => vi}/v_yank.c | 0 {contrib/nvi/vi => vi}/v_z.c | 0 {contrib/nvi/vi => vi}/v_zexit.c | 0 {contrib/nvi/vi => vi}/vi.c | 0 {contrib/nvi/vi => vi}/vi.h | 0 {contrib/nvi/vi => vi}/vs_line.c | 0 {contrib/nvi/vi => vi}/vs_msg.c | 0 {contrib/nvi/vi => vi}/vs_refresh.c | 0 {contrib/nvi/vi => vi}/vs_relative.c | 0 {contrib/nvi/vi => vi}/vs_smap.c | 0 {contrib/nvi/vi => vi}/vs_split.c | 0 292 files changed, 0 insertions(+), 0 deletions(-) rename contrib/nvi/FAQ => FAQ (100%) rename contrib/nvi/LAYOUT => LAYOUT (100%) rename contrib/nvi/LICENSE => LICENSE (100%) rename contrib/nvi/README => README (100%) rename {contrib/nvi/build => build}/ExtUtils/Embed.pm (100%) rename {contrib/nvi/build => build}/Makefile.in (100%) rename {contrib/nvi/build => build}/README (100%) rename {contrib/nvi/build => build}/README.LynxOS (100%) rename {contrib/nvi/build => build}/acconfig.h (100%) rename {contrib/nvi/build => build}/aclocal.m4 (100%) rename {contrib/nvi/build => build}/config.guess (100%) rename {contrib/nvi/build => build}/config.h.in (100%) rename {contrib/nvi/build => build}/config.sub (100%) rename {contrib/nvi/build => build}/configure (100%) rename {contrib/nvi/build => build}/configure.in (100%) rename {contrib/nvi/build => build}/distrib (100%) rename {contrib/nvi/build => build}/install-sh (100%) rename {contrib/nvi/build => build}/pathnames.h.in (100%) rename {contrib/nvi/build => build}/port.h.in (100%) rename {contrib/nvi/build => build}/recover.in (100%) rename {contrib/nvi/build => build}/spell.ok (100%) rename {contrib/nvi/catalog => catalog}/Makefile (100%) rename {contrib/nvi/catalog => catalog}/README (100%) rename {contrib/nvi/catalog => catalog}/dump.c (100%) rename {contrib/nvi/catalog => catalog}/dutch (100%) rename {contrib/nvi/catalog => catalog}/dutch.base (100%) rename {contrib/nvi/catalog => catalog}/dutch.check (100%) rename {contrib/nvi/catalog => catalog}/dutch.owner (100%) rename {contrib/nvi/catalog => catalog}/english (100%) rename {contrib/nvi/catalog => catalog}/english.base (100%) rename {contrib/nvi/catalog => catalog}/english.check (100%) rename {contrib/nvi/catalog => catalog}/english.owner (100%) rename {contrib/nvi/catalog => catalog}/french (100%) rename {contrib/nvi/catalog => catalog}/french.base (100%) rename {contrib/nvi/catalog => catalog}/french.check (100%) rename {contrib/nvi/catalog => catalog}/german (100%) rename {contrib/nvi/catalog => catalog}/german.base (100%) rename {contrib/nvi/catalog => catalog}/german.check (100%) rename {contrib/nvi/catalog => catalog}/german.owner (100%) rename {contrib/nvi/catalog => catalog}/ru_RU.KOI8-R (100%) rename {contrib/nvi/catalog => catalog}/ru_RU.KOI8-R.base (100%) rename {contrib/nvi/catalog => catalog}/ru_RU.KOI8-R.check (100%) rename {contrib/nvi/catalog => catalog}/ru_RU.KOI8-R.owner (100%) rename {contrib/nvi/catalog => catalog}/ru_SU.KOI8-R (100%) rename {contrib/nvi/catalog => catalog}/ru_SU.KOI8-R.base (100%) rename {contrib/nvi/catalog => catalog}/ru_SU.KOI8-R.check (100%) rename {contrib/nvi/catalog => catalog}/ru_SU.KOI8-R.owner (100%) rename {contrib/nvi/catalog => catalog}/spanish (100%) rename {contrib/nvi/catalog => catalog}/spanish.base (100%) rename {contrib/nvi/catalog => catalog}/spanish.check (100%) rename {contrib/nvi/catalog => catalog}/spell.ok (100%) rename {contrib/nvi/catalog => catalog}/swedish (100%) rename {contrib/nvi/catalog => catalog}/swedish.base (100%) rename {contrib/nvi/catalog => catalog}/swedish.check (100%) rename {contrib/nvi/catalog => catalog}/swedish.owner (100%) rename {contrib/nvi/cl => cl}/README.signal (100%) rename {contrib/nvi/cl => cl}/cl.h (100%) rename {contrib/nvi/cl => cl}/cl_bsd.c (100%) rename {contrib/nvi/cl => cl}/cl_funcs.c (100%) rename {contrib/nvi/cl => cl}/cl_main.c (100%) rename {contrib/nvi/cl => cl}/cl_read.c (100%) rename {contrib/nvi/cl => cl}/cl_screen.c (100%) rename {contrib/nvi/cl => cl}/cl_term.c (100%) rename {contrib/nvi/clib => clib}/bsearch.c (100%) rename {contrib/nvi/clib => clib}/env.c (100%) rename {contrib/nvi/clib => clib}/gethostname.c (100%) rename {contrib/nvi/clib => clib}/getopt.c (100%) rename {contrib/nvi/clib => clib}/memchr.c (100%) rename {contrib/nvi/clib => clib}/memmove.c (100%) rename {contrib/nvi/clib => clib}/memset.c (100%) rename {contrib/nvi/clib => clib}/mkstemp.c (100%) rename {contrib/nvi/clib => clib}/mmap.c (100%) rename {contrib/nvi/clib => clib}/snprintf.c (100%) rename {contrib/nvi/clib => clib}/strdup.c (100%) rename {contrib/nvi/clib => clib}/strerror.c (100%) rename {contrib/nvi/clib => clib}/strpbrk.c (100%) rename {contrib/nvi/clib => clib}/strsep.c (100%) rename {contrib/nvi/clib => clib}/strtol.c (100%) rename {contrib/nvi/clib => clib}/strtoul.c (100%) rename {contrib/nvi/clib => clib}/vsnprintf.c (100%) rename {contrib/nvi/common => common}/api.c (100%) rename {contrib/nvi/common => common}/args.h (100%) rename {contrib/nvi/common => common}/common.h (100%) rename {contrib/nvi/common => common}/cut.c (100%) rename {contrib/nvi/common => common}/cut.h (100%) rename {contrib/nvi/common => common}/delete.c (100%) rename {contrib/nvi/common => common}/exf.c (100%) rename {contrib/nvi/common => common}/exf.h (100%) rename {contrib/nvi/common => common}/gs.h (100%) rename {contrib/nvi/common => common}/key.c (100%) rename {contrib/nvi/common => common}/key.h (100%) rename {contrib/nvi/common => common}/line.c (100%) rename {contrib/nvi/common => common}/log.c (100%) rename {contrib/nvi/common => common}/log.h (100%) rename {contrib/nvi/common => common}/main.c (100%) rename {contrib/nvi/common => common}/mark.c (100%) rename {contrib/nvi/common => common}/mark.h (100%) rename {contrib/nvi/common => common}/mem.h (100%) rename {contrib/nvi/common => common}/msg.c (100%) rename {contrib/nvi/common => common}/msg.h (100%) rename {contrib/nvi/common => common}/options.awk (100%) rename {contrib/nvi/common => common}/options.c (100%) rename {contrib/nvi/common => common}/options.h (100%) rename {contrib/nvi/common => common}/options_f.c (100%) rename {contrib/nvi/common => common}/put.c (100%) rename {contrib/nvi/common => common}/recover.c (100%) rename {contrib/nvi/common => common}/screen.c (100%) rename {contrib/nvi/common => common}/screen.h (100%) rename {contrib/nvi/common => common}/search.c (100%) rename {contrib/nvi/common => common}/seq.c (100%) rename {contrib/nvi/common => common}/seq.h (100%) rename {contrib/nvi/common => common}/util.c (100%) rename {contrib/nvi/common => common}/util.h (100%) rename {contrib/nvi/docs => docs}/TODO (100%) rename {contrib/nvi/docs => docs}/USD.doc/edit/Makefile (100%) rename {contrib/nvi/docs => docs}/USD.doc/edit/edit.vindex (100%) rename {contrib/nvi/docs => docs}/USD.doc/edit/edittut.ms (100%) rename {contrib/nvi/docs => docs}/USD.doc/exref/Makefile (100%) rename {contrib/nvi/docs => docs}/USD.doc/exref/ex.rm (100%) rename {contrib/nvi/docs => docs}/USD.doc/exref/ex.summary (100%) rename {contrib/nvi/docs => docs}/USD.doc/vi.man/Makefile (100%) rename {contrib/nvi/docs => docs}/USD.doc/vi.man/spell.ok (100%) rename {contrib/nvi/docs => docs}/USD.doc/vi.man/vi.1 (100%) rename {contrib/nvi/docs => docs}/USD.doc/vi.ref/Makefile (100%) rename {contrib/nvi/docs => docs}/USD.doc/vi.ref/ex.cmd.roff (100%) rename {contrib/nvi/docs => docs}/USD.doc/vi.ref/index.so (100%) rename {contrib/nvi/docs => docs}/USD.doc/vi.ref/merge.awk (100%) rename {contrib/nvi/docs => docs}/USD.doc/vi.ref/ref.so (100%) rename {contrib/nvi/docs => docs}/USD.doc/vi.ref/set.opt.roff (100%) rename {contrib/nvi/docs => docs}/USD.doc/vi.ref/spell.ok (100%) rename {contrib/nvi/docs => docs}/USD.doc/vi.ref/vi.cmd.roff (100%) rename {contrib/nvi/docs => docs}/USD.doc/vi.ref/vi.ref (100%) rename {contrib/nvi/docs => docs}/USD.doc/vitut/Makefile (100%) rename {contrib/nvi/docs => docs}/USD.doc/vitut/vi.apwh.ms (100%) rename {contrib/nvi/docs => docs}/USD.doc/vitut/vi.chars (100%) rename {contrib/nvi/docs => docs}/USD.doc/vitut/vi.in (100%) rename {contrib/nvi/docs => docs}/USD.doc/vitut/vi.summary (100%) rename {contrib/nvi/docs => docs}/changelog (100%) rename {contrib/nvi/docs => docs}/ev (100%) rename {contrib/nvi/docs => docs}/features (100%) rename {contrib/nvi/docs => docs}/help (100%) rename {contrib/nvi/docs => docs}/internals/autowrite (100%) rename {contrib/nvi/docs => docs}/internals/context (100%) rename {contrib/nvi/docs => docs}/internals/cscope.NOTES (100%) rename {contrib/nvi/docs => docs}/internals/gdb.script (100%) rename {contrib/nvi/docs => docs}/internals/input (100%) rename {contrib/nvi/docs => docs}/internals/openmode (100%) rename {contrib/nvi/docs => docs}/internals/quoting (100%) rename {contrib/nvi/docs => docs}/internals/structures (100%) rename {contrib/nvi/docs => docs}/interp/interp (100%) rename {contrib/nvi/docs => docs}/interp/spell.ok (100%) rename {contrib/nvi/docs => docs}/spell.ok (100%) rename {contrib/nvi/docs => docs}/tutorial/vi.advanced (100%) rename {contrib/nvi/docs => docs}/tutorial/vi.beginner (100%) rename {contrib/nvi/docs => docs}/tutorial/vi.tut.csh (100%) rename {contrib/nvi/ex => ex}/ex.awk (100%) rename {contrib/nvi/ex => ex}/ex.c (100%) rename {contrib/nvi/ex => ex}/ex.h (100%) rename {contrib/nvi/ex => ex}/ex_abbrev.c (100%) rename {contrib/nvi/ex => ex}/ex_append.c (100%) rename {contrib/nvi/ex => ex}/ex_args.c (100%) rename {contrib/nvi/ex => ex}/ex_argv.c (100%) rename {contrib/nvi/ex => ex}/ex_at.c (100%) rename {contrib/nvi/ex => ex}/ex_bang.c (100%) rename {contrib/nvi/ex => ex}/ex_cd.c (100%) rename {contrib/nvi/ex => ex}/ex_cmd.c (100%) rename {contrib/nvi/ex => ex}/ex_cscope.c (100%) rename {contrib/nvi/ex => ex}/ex_delete.c (100%) rename {contrib/nvi/ex => ex}/ex_display.c (100%) rename {contrib/nvi/ex => ex}/ex_edit.c (100%) rename {contrib/nvi/ex => ex}/ex_equal.c (100%) rename {contrib/nvi/ex => ex}/ex_file.c (100%) rename {contrib/nvi/ex => ex}/ex_filter.c (100%) rename {contrib/nvi/ex => ex}/ex_global.c (100%) rename {contrib/nvi/ex => ex}/ex_init.c (100%) rename {contrib/nvi/ex => ex}/ex_join.c (100%) rename {contrib/nvi/ex => ex}/ex_map.c (100%) rename {contrib/nvi/ex => ex}/ex_mark.c (100%) rename {contrib/nvi/ex => ex}/ex_mkexrc.c (100%) rename {contrib/nvi/ex => ex}/ex_move.c (100%) rename {contrib/nvi/ex => ex}/ex_open.c (100%) rename {contrib/nvi/ex => ex}/ex_perl.c (100%) rename {contrib/nvi/ex => ex}/ex_preserve.c (100%) rename {contrib/nvi/ex => ex}/ex_print.c (100%) rename {contrib/nvi/ex => ex}/ex_put.c (100%) rename {contrib/nvi/ex => ex}/ex_quit.c (100%) rename {contrib/nvi/ex => ex}/ex_read.c (100%) rename {contrib/nvi/ex => ex}/ex_screen.c (100%) rename {contrib/nvi/ex => ex}/ex_script.c (100%) rename {contrib/nvi/ex => ex}/ex_set.c (100%) rename {contrib/nvi/ex => ex}/ex_shell.c (100%) rename {contrib/nvi/ex => ex}/ex_shift.c (100%) rename {contrib/nvi/ex => ex}/ex_source.c (100%) rename {contrib/nvi/ex => ex}/ex_stop.c (100%) rename {contrib/nvi/ex => ex}/ex_subst.c (100%) rename {contrib/nvi/ex => ex}/ex_tag.c (100%) rename {contrib/nvi/ex => ex}/ex_tcl.c (100%) rename {contrib/nvi/ex => ex}/ex_txt.c (100%) rename {contrib/nvi/ex => ex}/ex_undo.c (100%) rename {contrib/nvi/ex => ex}/ex_usage.c (100%) rename {contrib/nvi/ex => ex}/ex_util.c (100%) rename {contrib/nvi/ex => ex}/ex_version.c (100%) rename {contrib/nvi/ex => ex}/ex_visual.c (100%) rename {contrib/nvi/ex => ex}/ex_write.c (100%) rename {contrib/nvi/ex => ex}/ex_yank.c (100%) rename {contrib/nvi/ex => ex}/ex_z.c (100%) rename {contrib/nvi/ex => ex}/script.h (100%) rename {contrib/nvi/ex => ex}/tag.h (100%) rename {contrib/nvi/ex => ex}/version.h (100%) rename {contrib/nvi/include => include}/bitstring.h (100%) rename {contrib/nvi/include => include}/cl_extern.h (100%) rename {contrib/nvi/include => include}/com_extern.h (100%) rename {contrib/nvi/include => include}/ex_def.h (100%) rename {contrib/nvi/include => include}/ex_extern.h (100%) rename {contrib/nvi/include => include}/ip_extern.h (100%) rename {contrib/nvi/include => include}/options_def.h (100%) rename {contrib/nvi/include => include}/perl_extern.h (100%) rename {contrib/nvi/include => include}/sys/queue.h (100%) rename {contrib/nvi/include => include}/tcl_extern.h (100%) rename {contrib/nvi/include => include}/tk_extern.h (100%) rename {contrib/nvi/include => include}/vi_extern.h (100%) rename {contrib/nvi/ip => ip}/IP_INSTRUCTIONS (100%) rename {contrib/nvi/ip => ip}/ip.h (100%) rename {contrib/nvi/ip => ip}/ip_funcs.c (100%) rename {contrib/nvi/ip => ip}/ip_main.c (100%) rename {contrib/nvi/ip => ip}/ip_read.c (100%) rename {contrib/nvi/ip => ip}/ip_screen.c (100%) rename {contrib/nvi/ip => ip}/ip_term.c (100%) rename {contrib/nvi/ip_cl => ip_cl}/Makefile (100%) rename {contrib/nvi/ip_cl => ip_cl}/ip_cl.c (100%) rename {contrib/nvi/perl_api => perl_api}/VI.pod (100%) rename {contrib/nvi/perl_api => perl_api}/nviperl.pod (100%) rename {contrib/nvi/perl_api => perl_api}/perl.xs (100%) rename {contrib/nvi/perl_api => perl_api}/perlsfio.c (100%) rename {contrib/nvi/perl_api => perl_api}/typemap (100%) rename {contrib/nvi/perl_scripts => perl_scripts}/forall.pl (100%) rename {contrib/nvi/perl_scripts => perl_scripts}/make.pl (100%) rename {contrib/nvi/perl_scripts => perl_scripts}/tk.pl (100%) rename {contrib/nvi/perl_scripts => perl_scripts}/wc.pl (100%) rename {contrib/nvi/tcl_api => tcl_api}/tcl.c (100%) rename {contrib/nvi/tcl_scripts => tcl_scripts}/errors.tcl (100%) rename {contrib/nvi/tcl_scripts => tcl_scripts}/gnats.tcl (100%) rename {contrib/nvi/tcl_scripts => tcl_scripts}/mailprocs.tcl (100%) rename {contrib/nvi/tcl_scripts => tcl_scripts}/wc.tcl (100%) rename {contrib/nvi/tk => tk}/init.tcl (100%) rename {contrib/nvi/tk => tk}/tk_funcs.c (100%) rename {contrib/nvi/tk => tk}/tk_main.c (100%) rename {contrib/nvi/tk => tk}/tk_read.c (100%) rename {contrib/nvi/tk => tk}/tk_screen.c (100%) rename {contrib/nvi/tk => tk}/tk_term.c (100%) rename {contrib/nvi/tk => tk}/tk_util.c (100%) rename {contrib/nvi/tk => tk}/tki.h (100%) rename {contrib/nvi/vi => vi}/getc.c (100%) rename {contrib/nvi/vi => vi}/v_at.c (100%) rename {contrib/nvi/vi => vi}/v_ch.c (100%) rename {contrib/nvi/vi => vi}/v_cmd.c (100%) rename {contrib/nvi/vi => vi}/v_delete.c (100%) rename {contrib/nvi/vi => vi}/v_ex.c (100%) rename {contrib/nvi/vi => vi}/v_increment.c (100%) rename {contrib/nvi/vi => vi}/v_init.c (100%) rename {contrib/nvi/vi => vi}/v_itxt.c (100%) rename {contrib/nvi/vi => vi}/v_left.c (100%) rename {contrib/nvi/vi => vi}/v_mark.c (100%) rename {contrib/nvi/vi => vi}/v_match.c (100%) rename {contrib/nvi/vi => vi}/v_paragraph.c (100%) rename {contrib/nvi/vi => vi}/v_put.c (100%) rename {contrib/nvi/vi => vi}/v_redraw.c (100%) rename {contrib/nvi/vi => vi}/v_replace.c (100%) rename {contrib/nvi/vi => vi}/v_right.c (100%) rename {contrib/nvi/vi => vi}/v_screen.c (100%) rename {contrib/nvi/vi => vi}/v_scroll.c (100%) rename {contrib/nvi/vi => vi}/v_search.c (100%) rename {contrib/nvi/vi => vi}/v_section.c (100%) rename {contrib/nvi/vi => vi}/v_sentence.c (100%) rename {contrib/nvi/vi => vi}/v_status.c (100%) rename {contrib/nvi/vi => vi}/v_txt.c (100%) rename {contrib/nvi/vi => vi}/v_ulcase.c (100%) rename {contrib/nvi/vi => vi}/v_undo.c (100%) rename {contrib/nvi/vi => vi}/v_util.c (100%) rename {contrib/nvi/vi => vi}/v_word.c (100%) rename {contrib/nvi/vi => vi}/v_xchar.c (100%) rename {contrib/nvi/vi => vi}/v_yank.c (100%) rename {contrib/nvi/vi => vi}/v_z.c (100%) rename {contrib/nvi/vi => vi}/v_zexit.c (100%) rename {contrib/nvi/vi => vi}/vi.c (100%) rename {contrib/nvi/vi => vi}/vi.h (100%) rename {contrib/nvi/vi => vi}/vs_line.c (100%) rename {contrib/nvi/vi => vi}/vs_msg.c (100%) rename {contrib/nvi/vi => vi}/vs_refresh.c (100%) rename {contrib/nvi/vi => vi}/vs_relative.c (100%) rename {contrib/nvi/vi => vi}/vs_smap.c (100%) rename {contrib/nvi/vi => vi}/vs_split.c (100%) diff --git a/contrib/nvi/FAQ b/FAQ similarity index 100% rename from contrib/nvi/FAQ rename to FAQ diff --git a/contrib/nvi/LAYOUT b/LAYOUT similarity index 100% rename from contrib/nvi/LAYOUT rename to LAYOUT diff --git a/contrib/nvi/LICENSE b/LICENSE similarity index 100% rename from contrib/nvi/LICENSE rename to LICENSE diff --git a/contrib/nvi/README b/README similarity index 100% rename from contrib/nvi/README rename to README diff --git a/contrib/nvi/build/ExtUtils/Embed.pm b/build/ExtUtils/Embed.pm similarity index 100% rename from contrib/nvi/build/ExtUtils/Embed.pm rename to build/ExtUtils/Embed.pm diff --git a/contrib/nvi/build/Makefile.in b/build/Makefile.in similarity index 100% rename from contrib/nvi/build/Makefile.in rename to build/Makefile.in diff --git a/contrib/nvi/build/README b/build/README similarity index 100% rename from contrib/nvi/build/README rename to build/README diff --git a/contrib/nvi/build/README.LynxOS b/build/README.LynxOS similarity index 100% rename from contrib/nvi/build/README.LynxOS rename to build/README.LynxOS diff --git a/contrib/nvi/build/acconfig.h b/build/acconfig.h similarity index 100% rename from contrib/nvi/build/acconfig.h rename to build/acconfig.h diff --git a/contrib/nvi/build/aclocal.m4 b/build/aclocal.m4 similarity index 100% rename from contrib/nvi/build/aclocal.m4 rename to build/aclocal.m4 diff --git a/contrib/nvi/build/config.guess b/build/config.guess similarity index 100% rename from contrib/nvi/build/config.guess rename to build/config.guess diff --git a/contrib/nvi/build/config.h.in b/build/config.h.in similarity index 100% rename from contrib/nvi/build/config.h.in rename to build/config.h.in diff --git a/contrib/nvi/build/config.sub b/build/config.sub similarity index 100% rename from contrib/nvi/build/config.sub rename to build/config.sub diff --git a/contrib/nvi/build/configure b/build/configure similarity index 100% rename from contrib/nvi/build/configure rename to build/configure diff --git a/contrib/nvi/build/configure.in b/build/configure.in similarity index 100% rename from contrib/nvi/build/configure.in rename to build/configure.in diff --git a/contrib/nvi/build/distrib b/build/distrib similarity index 100% rename from contrib/nvi/build/distrib rename to build/distrib diff --git a/contrib/nvi/build/install-sh b/build/install-sh similarity index 100% rename from contrib/nvi/build/install-sh rename to build/install-sh diff --git a/contrib/nvi/build/pathnames.h.in b/build/pathnames.h.in similarity index 100% rename from contrib/nvi/build/pathnames.h.in rename to build/pathnames.h.in diff --git a/contrib/nvi/build/port.h.in b/build/port.h.in similarity index 100% rename from contrib/nvi/build/port.h.in rename to build/port.h.in diff --git a/contrib/nvi/build/recover.in b/build/recover.in similarity index 100% rename from contrib/nvi/build/recover.in rename to build/recover.in diff --git a/contrib/nvi/build/spell.ok b/build/spell.ok similarity index 100% rename from contrib/nvi/build/spell.ok rename to build/spell.ok diff --git a/contrib/nvi/catalog/Makefile b/catalog/Makefile similarity index 100% rename from contrib/nvi/catalog/Makefile rename to catalog/Makefile diff --git a/contrib/nvi/catalog/README b/catalog/README similarity index 100% rename from contrib/nvi/catalog/README rename to catalog/README diff --git a/contrib/nvi/catalog/dump.c b/catalog/dump.c similarity index 100% rename from contrib/nvi/catalog/dump.c rename to catalog/dump.c diff --git a/contrib/nvi/catalog/dutch b/catalog/dutch similarity index 100% rename from contrib/nvi/catalog/dutch rename to catalog/dutch diff --git a/contrib/nvi/catalog/dutch.base b/catalog/dutch.base similarity index 100% rename from contrib/nvi/catalog/dutch.base rename to catalog/dutch.base diff --git a/contrib/nvi/catalog/dutch.check b/catalog/dutch.check similarity index 100% rename from contrib/nvi/catalog/dutch.check rename to catalog/dutch.check diff --git a/contrib/nvi/catalog/dutch.owner b/catalog/dutch.owner similarity index 100% rename from contrib/nvi/catalog/dutch.owner rename to catalog/dutch.owner diff --git a/contrib/nvi/catalog/english b/catalog/english similarity index 100% rename from contrib/nvi/catalog/english rename to catalog/english diff --git a/contrib/nvi/catalog/english.base b/catalog/english.base similarity index 100% rename from contrib/nvi/catalog/english.base rename to catalog/english.base diff --git a/contrib/nvi/catalog/english.check b/catalog/english.check similarity index 100% rename from contrib/nvi/catalog/english.check rename to catalog/english.check diff --git a/contrib/nvi/catalog/english.owner b/catalog/english.owner similarity index 100% rename from contrib/nvi/catalog/english.owner rename to catalog/english.owner diff --git a/contrib/nvi/catalog/french b/catalog/french similarity index 100% rename from contrib/nvi/catalog/french rename to catalog/french diff --git a/contrib/nvi/catalog/french.base b/catalog/french.base similarity index 100% rename from contrib/nvi/catalog/french.base rename to catalog/french.base diff --git a/contrib/nvi/catalog/french.check b/catalog/french.check similarity index 100% rename from contrib/nvi/catalog/french.check rename to catalog/french.check diff --git a/contrib/nvi/catalog/german b/catalog/german similarity index 100% rename from contrib/nvi/catalog/german rename to catalog/german diff --git a/contrib/nvi/catalog/german.base b/catalog/german.base similarity index 100% rename from contrib/nvi/catalog/german.base rename to catalog/german.base diff --git a/contrib/nvi/catalog/german.check b/catalog/german.check similarity index 100% rename from contrib/nvi/catalog/german.check rename to catalog/german.check diff --git a/contrib/nvi/catalog/german.owner b/catalog/german.owner similarity index 100% rename from contrib/nvi/catalog/german.owner rename to catalog/german.owner diff --git a/contrib/nvi/catalog/ru_RU.KOI8-R b/catalog/ru_RU.KOI8-R similarity index 100% rename from contrib/nvi/catalog/ru_RU.KOI8-R rename to catalog/ru_RU.KOI8-R diff --git a/contrib/nvi/catalog/ru_RU.KOI8-R.base b/catalog/ru_RU.KOI8-R.base similarity index 100% rename from contrib/nvi/catalog/ru_RU.KOI8-R.base rename to catalog/ru_RU.KOI8-R.base diff --git a/contrib/nvi/catalog/ru_RU.KOI8-R.check b/catalog/ru_RU.KOI8-R.check similarity index 100% rename from contrib/nvi/catalog/ru_RU.KOI8-R.check rename to catalog/ru_RU.KOI8-R.check diff --git a/contrib/nvi/catalog/ru_RU.KOI8-R.owner b/catalog/ru_RU.KOI8-R.owner similarity index 100% rename from contrib/nvi/catalog/ru_RU.KOI8-R.owner rename to catalog/ru_RU.KOI8-R.owner diff --git a/contrib/nvi/catalog/ru_SU.KOI8-R b/catalog/ru_SU.KOI8-R similarity index 100% rename from contrib/nvi/catalog/ru_SU.KOI8-R rename to catalog/ru_SU.KOI8-R diff --git a/contrib/nvi/catalog/ru_SU.KOI8-R.base b/catalog/ru_SU.KOI8-R.base similarity index 100% rename from contrib/nvi/catalog/ru_SU.KOI8-R.base rename to catalog/ru_SU.KOI8-R.base diff --git a/contrib/nvi/catalog/ru_SU.KOI8-R.check b/catalog/ru_SU.KOI8-R.check similarity index 100% rename from contrib/nvi/catalog/ru_SU.KOI8-R.check rename to catalog/ru_SU.KOI8-R.check diff --git a/contrib/nvi/catalog/ru_SU.KOI8-R.owner b/catalog/ru_SU.KOI8-R.owner similarity index 100% rename from contrib/nvi/catalog/ru_SU.KOI8-R.owner rename to catalog/ru_SU.KOI8-R.owner diff --git a/contrib/nvi/catalog/spanish b/catalog/spanish similarity index 100% rename from contrib/nvi/catalog/spanish rename to catalog/spanish diff --git a/contrib/nvi/catalog/spanish.base b/catalog/spanish.base similarity index 100% rename from contrib/nvi/catalog/spanish.base rename to catalog/spanish.base diff --git a/contrib/nvi/catalog/spanish.check b/catalog/spanish.check similarity index 100% rename from contrib/nvi/catalog/spanish.check rename to catalog/spanish.check diff --git a/contrib/nvi/catalog/spell.ok b/catalog/spell.ok similarity index 100% rename from contrib/nvi/catalog/spell.ok rename to catalog/spell.ok diff --git a/contrib/nvi/catalog/swedish b/catalog/swedish similarity index 100% rename from contrib/nvi/catalog/swedish rename to catalog/swedish diff --git a/contrib/nvi/catalog/swedish.base b/catalog/swedish.base similarity index 100% rename from contrib/nvi/catalog/swedish.base rename to catalog/swedish.base diff --git a/contrib/nvi/catalog/swedish.check b/catalog/swedish.check similarity index 100% rename from contrib/nvi/catalog/swedish.check rename to catalog/swedish.check diff --git a/contrib/nvi/catalog/swedish.owner b/catalog/swedish.owner similarity index 100% rename from contrib/nvi/catalog/swedish.owner rename to catalog/swedish.owner diff --git a/contrib/nvi/cl/README.signal b/cl/README.signal similarity index 100% rename from contrib/nvi/cl/README.signal rename to cl/README.signal diff --git a/contrib/nvi/cl/cl.h b/cl/cl.h similarity index 100% rename from contrib/nvi/cl/cl.h rename to cl/cl.h diff --git a/contrib/nvi/cl/cl_bsd.c b/cl/cl_bsd.c similarity index 100% rename from contrib/nvi/cl/cl_bsd.c rename to cl/cl_bsd.c diff --git a/contrib/nvi/cl/cl_funcs.c b/cl/cl_funcs.c similarity index 100% rename from contrib/nvi/cl/cl_funcs.c rename to cl/cl_funcs.c diff --git a/contrib/nvi/cl/cl_main.c b/cl/cl_main.c similarity index 100% rename from contrib/nvi/cl/cl_main.c rename to cl/cl_main.c diff --git a/contrib/nvi/cl/cl_read.c b/cl/cl_read.c similarity index 100% rename from contrib/nvi/cl/cl_read.c rename to cl/cl_read.c diff --git a/contrib/nvi/cl/cl_screen.c b/cl/cl_screen.c similarity index 100% rename from contrib/nvi/cl/cl_screen.c rename to cl/cl_screen.c diff --git a/contrib/nvi/cl/cl_term.c b/cl/cl_term.c similarity index 100% rename from contrib/nvi/cl/cl_term.c rename to cl/cl_term.c diff --git a/contrib/nvi/clib/bsearch.c b/clib/bsearch.c similarity index 100% rename from contrib/nvi/clib/bsearch.c rename to clib/bsearch.c diff --git a/contrib/nvi/clib/env.c b/clib/env.c similarity index 100% rename from contrib/nvi/clib/env.c rename to clib/env.c diff --git a/contrib/nvi/clib/gethostname.c b/clib/gethostname.c similarity index 100% rename from contrib/nvi/clib/gethostname.c rename to clib/gethostname.c diff --git a/contrib/nvi/clib/getopt.c b/clib/getopt.c similarity index 100% rename from contrib/nvi/clib/getopt.c rename to clib/getopt.c diff --git a/contrib/nvi/clib/memchr.c b/clib/memchr.c similarity index 100% rename from contrib/nvi/clib/memchr.c rename to clib/memchr.c diff --git a/contrib/nvi/clib/memmove.c b/clib/memmove.c similarity index 100% rename from contrib/nvi/clib/memmove.c rename to clib/memmove.c diff --git a/contrib/nvi/clib/memset.c b/clib/memset.c similarity index 100% rename from contrib/nvi/clib/memset.c rename to clib/memset.c diff --git a/contrib/nvi/clib/mkstemp.c b/clib/mkstemp.c similarity index 100% rename from contrib/nvi/clib/mkstemp.c rename to clib/mkstemp.c diff --git a/contrib/nvi/clib/mmap.c b/clib/mmap.c similarity index 100% rename from contrib/nvi/clib/mmap.c rename to clib/mmap.c diff --git a/contrib/nvi/clib/snprintf.c b/clib/snprintf.c similarity index 100% rename from contrib/nvi/clib/snprintf.c rename to clib/snprintf.c diff --git a/contrib/nvi/clib/strdup.c b/clib/strdup.c similarity index 100% rename from contrib/nvi/clib/strdup.c rename to clib/strdup.c diff --git a/contrib/nvi/clib/strerror.c b/clib/strerror.c similarity index 100% rename from contrib/nvi/clib/strerror.c rename to clib/strerror.c diff --git a/contrib/nvi/clib/strpbrk.c b/clib/strpbrk.c similarity index 100% rename from contrib/nvi/clib/strpbrk.c rename to clib/strpbrk.c diff --git a/contrib/nvi/clib/strsep.c b/clib/strsep.c similarity index 100% rename from contrib/nvi/clib/strsep.c rename to clib/strsep.c diff --git a/contrib/nvi/clib/strtol.c b/clib/strtol.c similarity index 100% rename from contrib/nvi/clib/strtol.c rename to clib/strtol.c diff --git a/contrib/nvi/clib/strtoul.c b/clib/strtoul.c similarity index 100% rename from contrib/nvi/clib/strtoul.c rename to clib/strtoul.c diff --git a/contrib/nvi/clib/vsnprintf.c b/clib/vsnprintf.c similarity index 100% rename from contrib/nvi/clib/vsnprintf.c rename to clib/vsnprintf.c diff --git a/contrib/nvi/common/api.c b/common/api.c similarity index 100% rename from contrib/nvi/common/api.c rename to common/api.c diff --git a/contrib/nvi/common/args.h b/common/args.h similarity index 100% rename from contrib/nvi/common/args.h rename to common/args.h diff --git a/contrib/nvi/common/common.h b/common/common.h similarity index 100% rename from contrib/nvi/common/common.h rename to common/common.h diff --git a/contrib/nvi/common/cut.c b/common/cut.c similarity index 100% rename from contrib/nvi/common/cut.c rename to common/cut.c diff --git a/contrib/nvi/common/cut.h b/common/cut.h similarity index 100% rename from contrib/nvi/common/cut.h rename to common/cut.h diff --git a/contrib/nvi/common/delete.c b/common/delete.c similarity index 100% rename from contrib/nvi/common/delete.c rename to common/delete.c diff --git a/contrib/nvi/common/exf.c b/common/exf.c similarity index 100% rename from contrib/nvi/common/exf.c rename to common/exf.c diff --git a/contrib/nvi/common/exf.h b/common/exf.h similarity index 100% rename from contrib/nvi/common/exf.h rename to common/exf.h diff --git a/contrib/nvi/common/gs.h b/common/gs.h similarity index 100% rename from contrib/nvi/common/gs.h rename to common/gs.h diff --git a/contrib/nvi/common/key.c b/common/key.c similarity index 100% rename from contrib/nvi/common/key.c rename to common/key.c diff --git a/contrib/nvi/common/key.h b/common/key.h similarity index 100% rename from contrib/nvi/common/key.h rename to common/key.h diff --git a/contrib/nvi/common/line.c b/common/line.c similarity index 100% rename from contrib/nvi/common/line.c rename to common/line.c diff --git a/contrib/nvi/common/log.c b/common/log.c similarity index 100% rename from contrib/nvi/common/log.c rename to common/log.c diff --git a/contrib/nvi/common/log.h b/common/log.h similarity index 100% rename from contrib/nvi/common/log.h rename to common/log.h diff --git a/contrib/nvi/common/main.c b/common/main.c similarity index 100% rename from contrib/nvi/common/main.c rename to common/main.c diff --git a/contrib/nvi/common/mark.c b/common/mark.c similarity index 100% rename from contrib/nvi/common/mark.c rename to common/mark.c diff --git a/contrib/nvi/common/mark.h b/common/mark.h similarity index 100% rename from contrib/nvi/common/mark.h rename to common/mark.h diff --git a/contrib/nvi/common/mem.h b/common/mem.h similarity index 100% rename from contrib/nvi/common/mem.h rename to common/mem.h diff --git a/contrib/nvi/common/msg.c b/common/msg.c similarity index 100% rename from contrib/nvi/common/msg.c rename to common/msg.c diff --git a/contrib/nvi/common/msg.h b/common/msg.h similarity index 100% rename from contrib/nvi/common/msg.h rename to common/msg.h diff --git a/contrib/nvi/common/options.awk b/common/options.awk similarity index 100% rename from contrib/nvi/common/options.awk rename to common/options.awk diff --git a/contrib/nvi/common/options.c b/common/options.c similarity index 100% rename from contrib/nvi/common/options.c rename to common/options.c diff --git a/contrib/nvi/common/options.h b/common/options.h similarity index 100% rename from contrib/nvi/common/options.h rename to common/options.h diff --git a/contrib/nvi/common/options_f.c b/common/options_f.c similarity index 100% rename from contrib/nvi/common/options_f.c rename to common/options_f.c diff --git a/contrib/nvi/common/put.c b/common/put.c similarity index 100% rename from contrib/nvi/common/put.c rename to common/put.c diff --git a/contrib/nvi/common/recover.c b/common/recover.c similarity index 100% rename from contrib/nvi/common/recover.c rename to common/recover.c diff --git a/contrib/nvi/common/screen.c b/common/screen.c similarity index 100% rename from contrib/nvi/common/screen.c rename to common/screen.c diff --git a/contrib/nvi/common/screen.h b/common/screen.h similarity index 100% rename from contrib/nvi/common/screen.h rename to common/screen.h diff --git a/contrib/nvi/common/search.c b/common/search.c similarity index 100% rename from contrib/nvi/common/search.c rename to common/search.c diff --git a/contrib/nvi/common/seq.c b/common/seq.c similarity index 100% rename from contrib/nvi/common/seq.c rename to common/seq.c diff --git a/contrib/nvi/common/seq.h b/common/seq.h similarity index 100% rename from contrib/nvi/common/seq.h rename to common/seq.h diff --git a/contrib/nvi/common/util.c b/common/util.c similarity index 100% rename from contrib/nvi/common/util.c rename to common/util.c diff --git a/contrib/nvi/common/util.h b/common/util.h similarity index 100% rename from contrib/nvi/common/util.h rename to common/util.h diff --git a/contrib/nvi/docs/TODO b/docs/TODO similarity index 100% rename from contrib/nvi/docs/TODO rename to docs/TODO diff --git a/contrib/nvi/docs/USD.doc/edit/Makefile b/docs/USD.doc/edit/Makefile similarity index 100% rename from contrib/nvi/docs/USD.doc/edit/Makefile rename to docs/USD.doc/edit/Makefile diff --git a/contrib/nvi/docs/USD.doc/edit/edit.vindex b/docs/USD.doc/edit/edit.vindex similarity index 100% rename from contrib/nvi/docs/USD.doc/edit/edit.vindex rename to docs/USD.doc/edit/edit.vindex diff --git a/contrib/nvi/docs/USD.doc/edit/edittut.ms b/docs/USD.doc/edit/edittut.ms similarity index 100% rename from contrib/nvi/docs/USD.doc/edit/edittut.ms rename to docs/USD.doc/edit/edittut.ms diff --git a/contrib/nvi/docs/USD.doc/exref/Makefile b/docs/USD.doc/exref/Makefile similarity index 100% rename from contrib/nvi/docs/USD.doc/exref/Makefile rename to docs/USD.doc/exref/Makefile diff --git a/contrib/nvi/docs/USD.doc/exref/ex.rm b/docs/USD.doc/exref/ex.rm similarity index 100% rename from contrib/nvi/docs/USD.doc/exref/ex.rm rename to docs/USD.doc/exref/ex.rm diff --git a/contrib/nvi/docs/USD.doc/exref/ex.summary b/docs/USD.doc/exref/ex.summary similarity index 100% rename from contrib/nvi/docs/USD.doc/exref/ex.summary rename to docs/USD.doc/exref/ex.summary diff --git a/contrib/nvi/docs/USD.doc/vi.man/Makefile b/docs/USD.doc/vi.man/Makefile similarity index 100% rename from contrib/nvi/docs/USD.doc/vi.man/Makefile rename to docs/USD.doc/vi.man/Makefile diff --git a/contrib/nvi/docs/USD.doc/vi.man/spell.ok b/docs/USD.doc/vi.man/spell.ok similarity index 100% rename from contrib/nvi/docs/USD.doc/vi.man/spell.ok rename to docs/USD.doc/vi.man/spell.ok diff --git a/contrib/nvi/docs/USD.doc/vi.man/vi.1 b/docs/USD.doc/vi.man/vi.1 similarity index 100% rename from contrib/nvi/docs/USD.doc/vi.man/vi.1 rename to docs/USD.doc/vi.man/vi.1 diff --git a/contrib/nvi/docs/USD.doc/vi.ref/Makefile b/docs/USD.doc/vi.ref/Makefile similarity index 100% rename from contrib/nvi/docs/USD.doc/vi.ref/Makefile rename to docs/USD.doc/vi.ref/Makefile diff --git a/contrib/nvi/docs/USD.doc/vi.ref/ex.cmd.roff b/docs/USD.doc/vi.ref/ex.cmd.roff similarity index 100% rename from contrib/nvi/docs/USD.doc/vi.ref/ex.cmd.roff rename to docs/USD.doc/vi.ref/ex.cmd.roff diff --git a/contrib/nvi/docs/USD.doc/vi.ref/index.so b/docs/USD.doc/vi.ref/index.so similarity index 100% rename from contrib/nvi/docs/USD.doc/vi.ref/index.so rename to docs/USD.doc/vi.ref/index.so diff --git a/contrib/nvi/docs/USD.doc/vi.ref/merge.awk b/docs/USD.doc/vi.ref/merge.awk similarity index 100% rename from contrib/nvi/docs/USD.doc/vi.ref/merge.awk rename to docs/USD.doc/vi.ref/merge.awk diff --git a/contrib/nvi/docs/USD.doc/vi.ref/ref.so b/docs/USD.doc/vi.ref/ref.so similarity index 100% rename from contrib/nvi/docs/USD.doc/vi.ref/ref.so rename to docs/USD.doc/vi.ref/ref.so diff --git a/contrib/nvi/docs/USD.doc/vi.ref/set.opt.roff b/docs/USD.doc/vi.ref/set.opt.roff similarity index 100% rename from contrib/nvi/docs/USD.doc/vi.ref/set.opt.roff rename to docs/USD.doc/vi.ref/set.opt.roff diff --git a/contrib/nvi/docs/USD.doc/vi.ref/spell.ok b/docs/USD.doc/vi.ref/spell.ok similarity index 100% rename from contrib/nvi/docs/USD.doc/vi.ref/spell.ok rename to docs/USD.doc/vi.ref/spell.ok diff --git a/contrib/nvi/docs/USD.doc/vi.ref/vi.cmd.roff b/docs/USD.doc/vi.ref/vi.cmd.roff similarity index 100% rename from contrib/nvi/docs/USD.doc/vi.ref/vi.cmd.roff rename to docs/USD.doc/vi.ref/vi.cmd.roff diff --git a/contrib/nvi/docs/USD.doc/vi.ref/vi.ref b/docs/USD.doc/vi.ref/vi.ref similarity index 100% rename from contrib/nvi/docs/USD.doc/vi.ref/vi.ref rename to docs/USD.doc/vi.ref/vi.ref diff --git a/contrib/nvi/docs/USD.doc/vitut/Makefile b/docs/USD.doc/vitut/Makefile similarity index 100% rename from contrib/nvi/docs/USD.doc/vitut/Makefile rename to docs/USD.doc/vitut/Makefile diff --git a/contrib/nvi/docs/USD.doc/vitut/vi.apwh.ms b/docs/USD.doc/vitut/vi.apwh.ms similarity index 100% rename from contrib/nvi/docs/USD.doc/vitut/vi.apwh.ms rename to docs/USD.doc/vitut/vi.apwh.ms diff --git a/contrib/nvi/docs/USD.doc/vitut/vi.chars b/docs/USD.doc/vitut/vi.chars similarity index 100% rename from contrib/nvi/docs/USD.doc/vitut/vi.chars rename to docs/USD.doc/vitut/vi.chars diff --git a/contrib/nvi/docs/USD.doc/vitut/vi.in b/docs/USD.doc/vitut/vi.in similarity index 100% rename from contrib/nvi/docs/USD.doc/vitut/vi.in rename to docs/USD.doc/vitut/vi.in diff --git a/contrib/nvi/docs/USD.doc/vitut/vi.summary b/docs/USD.doc/vitut/vi.summary similarity index 100% rename from contrib/nvi/docs/USD.doc/vitut/vi.summary rename to docs/USD.doc/vitut/vi.summary diff --git a/contrib/nvi/docs/changelog b/docs/changelog similarity index 100% rename from contrib/nvi/docs/changelog rename to docs/changelog diff --git a/contrib/nvi/docs/ev b/docs/ev similarity index 100% rename from contrib/nvi/docs/ev rename to docs/ev diff --git a/contrib/nvi/docs/features b/docs/features similarity index 100% rename from contrib/nvi/docs/features rename to docs/features diff --git a/contrib/nvi/docs/help b/docs/help similarity index 100% rename from contrib/nvi/docs/help rename to docs/help diff --git a/contrib/nvi/docs/internals/autowrite b/docs/internals/autowrite similarity index 100% rename from contrib/nvi/docs/internals/autowrite rename to docs/internals/autowrite diff --git a/contrib/nvi/docs/internals/context b/docs/internals/context similarity index 100% rename from contrib/nvi/docs/internals/context rename to docs/internals/context diff --git a/contrib/nvi/docs/internals/cscope.NOTES b/docs/internals/cscope.NOTES similarity index 100% rename from contrib/nvi/docs/internals/cscope.NOTES rename to docs/internals/cscope.NOTES diff --git a/contrib/nvi/docs/internals/gdb.script b/docs/internals/gdb.script similarity index 100% rename from contrib/nvi/docs/internals/gdb.script rename to docs/internals/gdb.script diff --git a/contrib/nvi/docs/internals/input b/docs/internals/input similarity index 100% rename from contrib/nvi/docs/internals/input rename to docs/internals/input diff --git a/contrib/nvi/docs/internals/openmode b/docs/internals/openmode similarity index 100% rename from contrib/nvi/docs/internals/openmode rename to docs/internals/openmode diff --git a/contrib/nvi/docs/internals/quoting b/docs/internals/quoting similarity index 100% rename from contrib/nvi/docs/internals/quoting rename to docs/internals/quoting diff --git a/contrib/nvi/docs/internals/structures b/docs/internals/structures similarity index 100% rename from contrib/nvi/docs/internals/structures rename to docs/internals/structures diff --git a/contrib/nvi/docs/interp/interp b/docs/interp/interp similarity index 100% rename from contrib/nvi/docs/interp/interp rename to docs/interp/interp diff --git a/contrib/nvi/docs/interp/spell.ok b/docs/interp/spell.ok similarity index 100% rename from contrib/nvi/docs/interp/spell.ok rename to docs/interp/spell.ok diff --git a/contrib/nvi/docs/spell.ok b/docs/spell.ok similarity index 100% rename from contrib/nvi/docs/spell.ok rename to docs/spell.ok diff --git a/contrib/nvi/docs/tutorial/vi.advanced b/docs/tutorial/vi.advanced similarity index 100% rename from contrib/nvi/docs/tutorial/vi.advanced rename to docs/tutorial/vi.advanced diff --git a/contrib/nvi/docs/tutorial/vi.beginner b/docs/tutorial/vi.beginner similarity index 100% rename from contrib/nvi/docs/tutorial/vi.beginner rename to docs/tutorial/vi.beginner diff --git a/contrib/nvi/docs/tutorial/vi.tut.csh b/docs/tutorial/vi.tut.csh similarity index 100% rename from contrib/nvi/docs/tutorial/vi.tut.csh rename to docs/tutorial/vi.tut.csh diff --git a/contrib/nvi/ex/ex.awk b/ex/ex.awk similarity index 100% rename from contrib/nvi/ex/ex.awk rename to ex/ex.awk diff --git a/contrib/nvi/ex/ex.c b/ex/ex.c similarity index 100% rename from contrib/nvi/ex/ex.c rename to ex/ex.c diff --git a/contrib/nvi/ex/ex.h b/ex/ex.h similarity index 100% rename from contrib/nvi/ex/ex.h rename to ex/ex.h diff --git a/contrib/nvi/ex/ex_abbrev.c b/ex/ex_abbrev.c similarity index 100% rename from contrib/nvi/ex/ex_abbrev.c rename to ex/ex_abbrev.c diff --git a/contrib/nvi/ex/ex_append.c b/ex/ex_append.c similarity index 100% rename from contrib/nvi/ex/ex_append.c rename to ex/ex_append.c diff --git a/contrib/nvi/ex/ex_args.c b/ex/ex_args.c similarity index 100% rename from contrib/nvi/ex/ex_args.c rename to ex/ex_args.c diff --git a/contrib/nvi/ex/ex_argv.c b/ex/ex_argv.c similarity index 100% rename from contrib/nvi/ex/ex_argv.c rename to ex/ex_argv.c diff --git a/contrib/nvi/ex/ex_at.c b/ex/ex_at.c similarity index 100% rename from contrib/nvi/ex/ex_at.c rename to ex/ex_at.c diff --git a/contrib/nvi/ex/ex_bang.c b/ex/ex_bang.c similarity index 100% rename from contrib/nvi/ex/ex_bang.c rename to ex/ex_bang.c diff --git a/contrib/nvi/ex/ex_cd.c b/ex/ex_cd.c similarity index 100% rename from contrib/nvi/ex/ex_cd.c rename to ex/ex_cd.c diff --git a/contrib/nvi/ex/ex_cmd.c b/ex/ex_cmd.c similarity index 100% rename from contrib/nvi/ex/ex_cmd.c rename to ex/ex_cmd.c diff --git a/contrib/nvi/ex/ex_cscope.c b/ex/ex_cscope.c similarity index 100% rename from contrib/nvi/ex/ex_cscope.c rename to ex/ex_cscope.c diff --git a/contrib/nvi/ex/ex_delete.c b/ex/ex_delete.c similarity index 100% rename from contrib/nvi/ex/ex_delete.c rename to ex/ex_delete.c diff --git a/contrib/nvi/ex/ex_display.c b/ex/ex_display.c similarity index 100% rename from contrib/nvi/ex/ex_display.c rename to ex/ex_display.c diff --git a/contrib/nvi/ex/ex_edit.c b/ex/ex_edit.c similarity index 100% rename from contrib/nvi/ex/ex_edit.c rename to ex/ex_edit.c diff --git a/contrib/nvi/ex/ex_equal.c b/ex/ex_equal.c similarity index 100% rename from contrib/nvi/ex/ex_equal.c rename to ex/ex_equal.c diff --git a/contrib/nvi/ex/ex_file.c b/ex/ex_file.c similarity index 100% rename from contrib/nvi/ex/ex_file.c rename to ex/ex_file.c diff --git a/contrib/nvi/ex/ex_filter.c b/ex/ex_filter.c similarity index 100% rename from contrib/nvi/ex/ex_filter.c rename to ex/ex_filter.c diff --git a/contrib/nvi/ex/ex_global.c b/ex/ex_global.c similarity index 100% rename from contrib/nvi/ex/ex_global.c rename to ex/ex_global.c diff --git a/contrib/nvi/ex/ex_init.c b/ex/ex_init.c similarity index 100% rename from contrib/nvi/ex/ex_init.c rename to ex/ex_init.c diff --git a/contrib/nvi/ex/ex_join.c b/ex/ex_join.c similarity index 100% rename from contrib/nvi/ex/ex_join.c rename to ex/ex_join.c diff --git a/contrib/nvi/ex/ex_map.c b/ex/ex_map.c similarity index 100% rename from contrib/nvi/ex/ex_map.c rename to ex/ex_map.c diff --git a/contrib/nvi/ex/ex_mark.c b/ex/ex_mark.c similarity index 100% rename from contrib/nvi/ex/ex_mark.c rename to ex/ex_mark.c diff --git a/contrib/nvi/ex/ex_mkexrc.c b/ex/ex_mkexrc.c similarity index 100% rename from contrib/nvi/ex/ex_mkexrc.c rename to ex/ex_mkexrc.c diff --git a/contrib/nvi/ex/ex_move.c b/ex/ex_move.c similarity index 100% rename from contrib/nvi/ex/ex_move.c rename to ex/ex_move.c diff --git a/contrib/nvi/ex/ex_open.c b/ex/ex_open.c similarity index 100% rename from contrib/nvi/ex/ex_open.c rename to ex/ex_open.c diff --git a/contrib/nvi/ex/ex_perl.c b/ex/ex_perl.c similarity index 100% rename from contrib/nvi/ex/ex_perl.c rename to ex/ex_perl.c diff --git a/contrib/nvi/ex/ex_preserve.c b/ex/ex_preserve.c similarity index 100% rename from contrib/nvi/ex/ex_preserve.c rename to ex/ex_preserve.c diff --git a/contrib/nvi/ex/ex_print.c b/ex/ex_print.c similarity index 100% rename from contrib/nvi/ex/ex_print.c rename to ex/ex_print.c diff --git a/contrib/nvi/ex/ex_put.c b/ex/ex_put.c similarity index 100% rename from contrib/nvi/ex/ex_put.c rename to ex/ex_put.c diff --git a/contrib/nvi/ex/ex_quit.c b/ex/ex_quit.c similarity index 100% rename from contrib/nvi/ex/ex_quit.c rename to ex/ex_quit.c diff --git a/contrib/nvi/ex/ex_read.c b/ex/ex_read.c similarity index 100% rename from contrib/nvi/ex/ex_read.c rename to ex/ex_read.c diff --git a/contrib/nvi/ex/ex_screen.c b/ex/ex_screen.c similarity index 100% rename from contrib/nvi/ex/ex_screen.c rename to ex/ex_screen.c diff --git a/contrib/nvi/ex/ex_script.c b/ex/ex_script.c similarity index 100% rename from contrib/nvi/ex/ex_script.c rename to ex/ex_script.c diff --git a/contrib/nvi/ex/ex_set.c b/ex/ex_set.c similarity index 100% rename from contrib/nvi/ex/ex_set.c rename to ex/ex_set.c diff --git a/contrib/nvi/ex/ex_shell.c b/ex/ex_shell.c similarity index 100% rename from contrib/nvi/ex/ex_shell.c rename to ex/ex_shell.c diff --git a/contrib/nvi/ex/ex_shift.c b/ex/ex_shift.c similarity index 100% rename from contrib/nvi/ex/ex_shift.c rename to ex/ex_shift.c diff --git a/contrib/nvi/ex/ex_source.c b/ex/ex_source.c similarity index 100% rename from contrib/nvi/ex/ex_source.c rename to ex/ex_source.c diff --git a/contrib/nvi/ex/ex_stop.c b/ex/ex_stop.c similarity index 100% rename from contrib/nvi/ex/ex_stop.c rename to ex/ex_stop.c diff --git a/contrib/nvi/ex/ex_subst.c b/ex/ex_subst.c similarity index 100% rename from contrib/nvi/ex/ex_subst.c rename to ex/ex_subst.c diff --git a/contrib/nvi/ex/ex_tag.c b/ex/ex_tag.c similarity index 100% rename from contrib/nvi/ex/ex_tag.c rename to ex/ex_tag.c diff --git a/contrib/nvi/ex/ex_tcl.c b/ex/ex_tcl.c similarity index 100% rename from contrib/nvi/ex/ex_tcl.c rename to ex/ex_tcl.c diff --git a/contrib/nvi/ex/ex_txt.c b/ex/ex_txt.c similarity index 100% rename from contrib/nvi/ex/ex_txt.c rename to ex/ex_txt.c diff --git a/contrib/nvi/ex/ex_undo.c b/ex/ex_undo.c similarity index 100% rename from contrib/nvi/ex/ex_undo.c rename to ex/ex_undo.c diff --git a/contrib/nvi/ex/ex_usage.c b/ex/ex_usage.c similarity index 100% rename from contrib/nvi/ex/ex_usage.c rename to ex/ex_usage.c diff --git a/contrib/nvi/ex/ex_util.c b/ex/ex_util.c similarity index 100% rename from contrib/nvi/ex/ex_util.c rename to ex/ex_util.c diff --git a/contrib/nvi/ex/ex_version.c b/ex/ex_version.c similarity index 100% rename from contrib/nvi/ex/ex_version.c rename to ex/ex_version.c diff --git a/contrib/nvi/ex/ex_visual.c b/ex/ex_visual.c similarity index 100% rename from contrib/nvi/ex/ex_visual.c rename to ex/ex_visual.c diff --git a/contrib/nvi/ex/ex_write.c b/ex/ex_write.c similarity index 100% rename from contrib/nvi/ex/ex_write.c rename to ex/ex_write.c diff --git a/contrib/nvi/ex/ex_yank.c b/ex/ex_yank.c similarity index 100% rename from contrib/nvi/ex/ex_yank.c rename to ex/ex_yank.c diff --git a/contrib/nvi/ex/ex_z.c b/ex/ex_z.c similarity index 100% rename from contrib/nvi/ex/ex_z.c rename to ex/ex_z.c diff --git a/contrib/nvi/ex/script.h b/ex/script.h similarity index 100% rename from contrib/nvi/ex/script.h rename to ex/script.h diff --git a/contrib/nvi/ex/tag.h b/ex/tag.h similarity index 100% rename from contrib/nvi/ex/tag.h rename to ex/tag.h diff --git a/contrib/nvi/ex/version.h b/ex/version.h similarity index 100% rename from contrib/nvi/ex/version.h rename to ex/version.h diff --git a/contrib/nvi/include/bitstring.h b/include/bitstring.h similarity index 100% rename from contrib/nvi/include/bitstring.h rename to include/bitstring.h diff --git a/contrib/nvi/include/cl_extern.h b/include/cl_extern.h similarity index 100% rename from contrib/nvi/include/cl_extern.h rename to include/cl_extern.h diff --git a/contrib/nvi/include/com_extern.h b/include/com_extern.h similarity index 100% rename from contrib/nvi/include/com_extern.h rename to include/com_extern.h diff --git a/contrib/nvi/include/ex_def.h b/include/ex_def.h similarity index 100% rename from contrib/nvi/include/ex_def.h rename to include/ex_def.h diff --git a/contrib/nvi/include/ex_extern.h b/include/ex_extern.h similarity index 100% rename from contrib/nvi/include/ex_extern.h rename to include/ex_extern.h diff --git a/contrib/nvi/include/ip_extern.h b/include/ip_extern.h similarity index 100% rename from contrib/nvi/include/ip_extern.h rename to include/ip_extern.h diff --git a/contrib/nvi/include/options_def.h b/include/options_def.h similarity index 100% rename from contrib/nvi/include/options_def.h rename to include/options_def.h diff --git a/contrib/nvi/include/perl_extern.h b/include/perl_extern.h similarity index 100% rename from contrib/nvi/include/perl_extern.h rename to include/perl_extern.h diff --git a/contrib/nvi/include/sys/queue.h b/include/sys/queue.h similarity index 100% rename from contrib/nvi/include/sys/queue.h rename to include/sys/queue.h diff --git a/contrib/nvi/include/tcl_extern.h b/include/tcl_extern.h similarity index 100% rename from contrib/nvi/include/tcl_extern.h rename to include/tcl_extern.h diff --git a/contrib/nvi/include/tk_extern.h b/include/tk_extern.h similarity index 100% rename from contrib/nvi/include/tk_extern.h rename to include/tk_extern.h diff --git a/contrib/nvi/include/vi_extern.h b/include/vi_extern.h similarity index 100% rename from contrib/nvi/include/vi_extern.h rename to include/vi_extern.h diff --git a/contrib/nvi/ip/IP_INSTRUCTIONS b/ip/IP_INSTRUCTIONS similarity index 100% rename from contrib/nvi/ip/IP_INSTRUCTIONS rename to ip/IP_INSTRUCTIONS diff --git a/contrib/nvi/ip/ip.h b/ip/ip.h similarity index 100% rename from contrib/nvi/ip/ip.h rename to ip/ip.h diff --git a/contrib/nvi/ip/ip_funcs.c b/ip/ip_funcs.c similarity index 100% rename from contrib/nvi/ip/ip_funcs.c rename to ip/ip_funcs.c diff --git a/contrib/nvi/ip/ip_main.c b/ip/ip_main.c similarity index 100% rename from contrib/nvi/ip/ip_main.c rename to ip/ip_main.c diff --git a/contrib/nvi/ip/ip_read.c b/ip/ip_read.c similarity index 100% rename from contrib/nvi/ip/ip_read.c rename to ip/ip_read.c diff --git a/contrib/nvi/ip/ip_screen.c b/ip/ip_screen.c similarity index 100% rename from contrib/nvi/ip/ip_screen.c rename to ip/ip_screen.c diff --git a/contrib/nvi/ip/ip_term.c b/ip/ip_term.c similarity index 100% rename from contrib/nvi/ip/ip_term.c rename to ip/ip_term.c diff --git a/contrib/nvi/ip_cl/Makefile b/ip_cl/Makefile similarity index 100% rename from contrib/nvi/ip_cl/Makefile rename to ip_cl/Makefile diff --git a/contrib/nvi/ip_cl/ip_cl.c b/ip_cl/ip_cl.c similarity index 100% rename from contrib/nvi/ip_cl/ip_cl.c rename to ip_cl/ip_cl.c diff --git a/contrib/nvi/perl_api/VI.pod b/perl_api/VI.pod similarity index 100% rename from contrib/nvi/perl_api/VI.pod rename to perl_api/VI.pod diff --git a/contrib/nvi/perl_api/nviperl.pod b/perl_api/nviperl.pod similarity index 100% rename from contrib/nvi/perl_api/nviperl.pod rename to perl_api/nviperl.pod diff --git a/contrib/nvi/perl_api/perl.xs b/perl_api/perl.xs similarity index 100% rename from contrib/nvi/perl_api/perl.xs rename to perl_api/perl.xs diff --git a/contrib/nvi/perl_api/perlsfio.c b/perl_api/perlsfio.c similarity index 100% rename from contrib/nvi/perl_api/perlsfio.c rename to perl_api/perlsfio.c diff --git a/contrib/nvi/perl_api/typemap b/perl_api/typemap similarity index 100% rename from contrib/nvi/perl_api/typemap rename to perl_api/typemap diff --git a/contrib/nvi/perl_scripts/forall.pl b/perl_scripts/forall.pl similarity index 100% rename from contrib/nvi/perl_scripts/forall.pl rename to perl_scripts/forall.pl diff --git a/contrib/nvi/perl_scripts/make.pl b/perl_scripts/make.pl similarity index 100% rename from contrib/nvi/perl_scripts/make.pl rename to perl_scripts/make.pl diff --git a/contrib/nvi/perl_scripts/tk.pl b/perl_scripts/tk.pl similarity index 100% rename from contrib/nvi/perl_scripts/tk.pl rename to perl_scripts/tk.pl diff --git a/contrib/nvi/perl_scripts/wc.pl b/perl_scripts/wc.pl similarity index 100% rename from contrib/nvi/perl_scripts/wc.pl rename to perl_scripts/wc.pl diff --git a/contrib/nvi/tcl_api/tcl.c b/tcl_api/tcl.c similarity index 100% rename from contrib/nvi/tcl_api/tcl.c rename to tcl_api/tcl.c diff --git a/contrib/nvi/tcl_scripts/errors.tcl b/tcl_scripts/errors.tcl similarity index 100% rename from contrib/nvi/tcl_scripts/errors.tcl rename to tcl_scripts/errors.tcl diff --git a/contrib/nvi/tcl_scripts/gnats.tcl b/tcl_scripts/gnats.tcl similarity index 100% rename from contrib/nvi/tcl_scripts/gnats.tcl rename to tcl_scripts/gnats.tcl diff --git a/contrib/nvi/tcl_scripts/mailprocs.tcl b/tcl_scripts/mailprocs.tcl similarity index 100% rename from contrib/nvi/tcl_scripts/mailprocs.tcl rename to tcl_scripts/mailprocs.tcl diff --git a/contrib/nvi/tcl_scripts/wc.tcl b/tcl_scripts/wc.tcl similarity index 100% rename from contrib/nvi/tcl_scripts/wc.tcl rename to tcl_scripts/wc.tcl diff --git a/contrib/nvi/tk/init.tcl b/tk/init.tcl similarity index 100% rename from contrib/nvi/tk/init.tcl rename to tk/init.tcl diff --git a/contrib/nvi/tk/tk_funcs.c b/tk/tk_funcs.c similarity index 100% rename from contrib/nvi/tk/tk_funcs.c rename to tk/tk_funcs.c diff --git a/contrib/nvi/tk/tk_main.c b/tk/tk_main.c similarity index 100% rename from contrib/nvi/tk/tk_main.c rename to tk/tk_main.c diff --git a/contrib/nvi/tk/tk_read.c b/tk/tk_read.c similarity index 100% rename from contrib/nvi/tk/tk_read.c rename to tk/tk_read.c diff --git a/contrib/nvi/tk/tk_screen.c b/tk/tk_screen.c similarity index 100% rename from contrib/nvi/tk/tk_screen.c rename to tk/tk_screen.c diff --git a/contrib/nvi/tk/tk_term.c b/tk/tk_term.c similarity index 100% rename from contrib/nvi/tk/tk_term.c rename to tk/tk_term.c diff --git a/contrib/nvi/tk/tk_util.c b/tk/tk_util.c similarity index 100% rename from contrib/nvi/tk/tk_util.c rename to tk/tk_util.c diff --git a/contrib/nvi/tk/tki.h b/tk/tki.h similarity index 100% rename from contrib/nvi/tk/tki.h rename to tk/tki.h diff --git a/contrib/nvi/vi/getc.c b/vi/getc.c similarity index 100% rename from contrib/nvi/vi/getc.c rename to vi/getc.c diff --git a/contrib/nvi/vi/v_at.c b/vi/v_at.c similarity index 100% rename from contrib/nvi/vi/v_at.c rename to vi/v_at.c diff --git a/contrib/nvi/vi/v_ch.c b/vi/v_ch.c similarity index 100% rename from contrib/nvi/vi/v_ch.c rename to vi/v_ch.c diff --git a/contrib/nvi/vi/v_cmd.c b/vi/v_cmd.c similarity index 100% rename from contrib/nvi/vi/v_cmd.c rename to vi/v_cmd.c diff --git a/contrib/nvi/vi/v_delete.c b/vi/v_delete.c similarity index 100% rename from contrib/nvi/vi/v_delete.c rename to vi/v_delete.c diff --git a/contrib/nvi/vi/v_ex.c b/vi/v_ex.c similarity index 100% rename from contrib/nvi/vi/v_ex.c rename to vi/v_ex.c diff --git a/contrib/nvi/vi/v_increment.c b/vi/v_increment.c similarity index 100% rename from contrib/nvi/vi/v_increment.c rename to vi/v_increment.c diff --git a/contrib/nvi/vi/v_init.c b/vi/v_init.c similarity index 100% rename from contrib/nvi/vi/v_init.c rename to vi/v_init.c diff --git a/contrib/nvi/vi/v_itxt.c b/vi/v_itxt.c similarity index 100% rename from contrib/nvi/vi/v_itxt.c rename to vi/v_itxt.c diff --git a/contrib/nvi/vi/v_left.c b/vi/v_left.c similarity index 100% rename from contrib/nvi/vi/v_left.c rename to vi/v_left.c diff --git a/contrib/nvi/vi/v_mark.c b/vi/v_mark.c similarity index 100% rename from contrib/nvi/vi/v_mark.c rename to vi/v_mark.c diff --git a/contrib/nvi/vi/v_match.c b/vi/v_match.c similarity index 100% rename from contrib/nvi/vi/v_match.c rename to vi/v_match.c diff --git a/contrib/nvi/vi/v_paragraph.c b/vi/v_paragraph.c similarity index 100% rename from contrib/nvi/vi/v_paragraph.c rename to vi/v_paragraph.c diff --git a/contrib/nvi/vi/v_put.c b/vi/v_put.c similarity index 100% rename from contrib/nvi/vi/v_put.c rename to vi/v_put.c diff --git a/contrib/nvi/vi/v_redraw.c b/vi/v_redraw.c similarity index 100% rename from contrib/nvi/vi/v_redraw.c rename to vi/v_redraw.c diff --git a/contrib/nvi/vi/v_replace.c b/vi/v_replace.c similarity index 100% rename from contrib/nvi/vi/v_replace.c rename to vi/v_replace.c diff --git a/contrib/nvi/vi/v_right.c b/vi/v_right.c similarity index 100% rename from contrib/nvi/vi/v_right.c rename to vi/v_right.c diff --git a/contrib/nvi/vi/v_screen.c b/vi/v_screen.c similarity index 100% rename from contrib/nvi/vi/v_screen.c rename to vi/v_screen.c diff --git a/contrib/nvi/vi/v_scroll.c b/vi/v_scroll.c similarity index 100% rename from contrib/nvi/vi/v_scroll.c rename to vi/v_scroll.c diff --git a/contrib/nvi/vi/v_search.c b/vi/v_search.c similarity index 100% rename from contrib/nvi/vi/v_search.c rename to vi/v_search.c diff --git a/contrib/nvi/vi/v_section.c b/vi/v_section.c similarity index 100% rename from contrib/nvi/vi/v_section.c rename to vi/v_section.c diff --git a/contrib/nvi/vi/v_sentence.c b/vi/v_sentence.c similarity index 100% rename from contrib/nvi/vi/v_sentence.c rename to vi/v_sentence.c diff --git a/contrib/nvi/vi/v_status.c b/vi/v_status.c similarity index 100% rename from contrib/nvi/vi/v_status.c rename to vi/v_status.c diff --git a/contrib/nvi/vi/v_txt.c b/vi/v_txt.c similarity index 100% rename from contrib/nvi/vi/v_txt.c rename to vi/v_txt.c diff --git a/contrib/nvi/vi/v_ulcase.c b/vi/v_ulcase.c similarity index 100% rename from contrib/nvi/vi/v_ulcase.c rename to vi/v_ulcase.c diff --git a/contrib/nvi/vi/v_undo.c b/vi/v_undo.c similarity index 100% rename from contrib/nvi/vi/v_undo.c rename to vi/v_undo.c diff --git a/contrib/nvi/vi/v_util.c b/vi/v_util.c similarity index 100% rename from contrib/nvi/vi/v_util.c rename to vi/v_util.c diff --git a/contrib/nvi/vi/v_word.c b/vi/v_word.c similarity index 100% rename from contrib/nvi/vi/v_word.c rename to vi/v_word.c diff --git a/contrib/nvi/vi/v_xchar.c b/vi/v_xchar.c similarity index 100% rename from contrib/nvi/vi/v_xchar.c rename to vi/v_xchar.c diff --git a/contrib/nvi/vi/v_yank.c b/vi/v_yank.c similarity index 100% rename from contrib/nvi/vi/v_yank.c rename to vi/v_yank.c diff --git a/contrib/nvi/vi/v_z.c b/vi/v_z.c similarity index 100% rename from contrib/nvi/vi/v_z.c rename to vi/v_z.c diff --git a/contrib/nvi/vi/v_zexit.c b/vi/v_zexit.c similarity index 100% rename from contrib/nvi/vi/v_zexit.c rename to vi/v_zexit.c diff --git a/contrib/nvi/vi/vi.c b/vi/vi.c similarity index 100% rename from contrib/nvi/vi/vi.c rename to vi/vi.c diff --git a/contrib/nvi/vi/vi.h b/vi/vi.h similarity index 100% rename from contrib/nvi/vi/vi.h rename to vi/vi.h diff --git a/contrib/nvi/vi/vs_line.c b/vi/vs_line.c similarity index 100% rename from contrib/nvi/vi/vs_line.c rename to vi/vs_line.c diff --git a/contrib/nvi/vi/vs_msg.c b/vi/vs_msg.c similarity index 100% rename from contrib/nvi/vi/vs_msg.c rename to vi/vs_msg.c diff --git a/contrib/nvi/vi/vs_refresh.c b/vi/vs_refresh.c similarity index 100% rename from contrib/nvi/vi/vs_refresh.c rename to vi/vs_refresh.c diff --git a/contrib/nvi/vi/vs_relative.c b/vi/vs_relative.c similarity index 100% rename from contrib/nvi/vi/vs_relative.c rename to vi/vs_relative.c diff --git a/contrib/nvi/vi/vs_smap.c b/vi/vs_smap.c similarity index 100% rename from contrib/nvi/vi/vs_smap.c rename to vi/vs_smap.c diff --git a/contrib/nvi/vi/vs_split.c b/vi/vs_split.c similarity index 100% rename from contrib/nvi/vi/vs_split.c rename to vi/vs_split.c From adb4a09cb6b594dfacf12ad781abf7bb9fb5f681 Mon Sep 17 00:00:00 2001 From: peter Date: Sun, 11 Aug 2013 09:44:58 +0000 Subject: [PATCH 3/6] Import nvi-2.1.1-4334a8297f into the work area. This is the gsoc-2011 project to clean up and backport multibyte support from other nvi forks in a form we can use. GSoC info: http://www.google-melange.com/gsoc/proposal/review/google/gsoc2011/zy/1 Repo at: https://github.com/lichray/nvi2 Obtained from: Zhihao Yuan --- FAQ | 160 - LAYOUT | 128 - LICENSE | 25 +- README | 93 +- build/ExtUtils/Embed.pm | 473 --- build/Makefile.in | 630 ---- build/README | 369 -- build/README.LynxOS | 320 -- build/acconfig.h | 82 - build/aclocal.m4 | 17 - build/config.guess | 571 --- build/config.h.in | 179 - build/config.sub | 872 ----- build/configure | 4446 ----------------------- build/configure.in | 725 ---- build/distrib | 84 - build/install-sh | 238 -- build/pathnames.h.in | 45 - build/port.h.in | 185 - build/recover.in | 49 - build/spell.ok | 58 - catalog/Makefile | 26 +- catalog/README | 117 +- catalog/dump.c | 36 +- catalog/dutch | 317 -- catalog/dutch.base | 15 +- catalog/dutch.check | 37 - catalog/english | 317 -- catalog/english.base | 309 -- catalog/english.check | 36 - catalog/french | 317 -- catalog/french.base | 461 ++- catalog/french.check | 34 - catalog/german | 317 -- catalog/german.base | 311 +- catalog/german.check | 36 - catalog/german.owner | 3 +- catalog/polish.base | 306 ++ catalog/polish.owner | 1 + catalog/ru_RU.KOI8-R | 267 -- catalog/ru_RU.KOI8-R.base | 530 +-- catalog/ru_RU.KOI8-R.check | 169 - catalog/ru_RU.KOI8-R.owner | 4 +- catalog/ru_SU.KOI8-R | 267 -- catalog/ru_SU.KOI8-R.base | 219 -- catalog/ru_SU.KOI8-R.check | 169 - catalog/ru_SU.KOI8-R.owner | 1 - catalog/spanish | 317 -- catalog/spanish.base | 313 +- catalog/spanish.check | 35 - catalog/swedish | 317 -- catalog/swedish.base | 41 +- catalog/swedish.check | 34 - catalog/uk_UA.KOI8-U.base | 306 ++ catalog/uk_UA.KOI8-U.owner | 1 + catalog/zh_CN.GB2312.base | 311 ++ catalog/zh_CN.GB2312.owner | 1 + cl/README.signal | 2 +- cl/cl.h | 51 +- cl/cl_bsd.c | 346 -- cl/cl_funcs.c | 430 ++- cl/cl_main.c | 96 +- cl/cl_read.c | 83 +- cl/cl_screen.c | 69 +- cl/cl_term.c | 138 +- include/cl_extern.h => cl/extern.h | 33 +- clib/env.c | 160 - clib/gethostname.c | 22 - clib/getopt.c | 130 - clib/memmove.c | 147 - clib/memset.c | 137 - clib/mkstemp.c | 133 - clib/mmap.c | 50 - clib/snprintf.c | 45 - clib/strerror.c | 74 - clib/strsep.c | 85 - clib/strtol.c | 134 - clib/strtoul.c | 113 - clib/vsnprintf.c | 31 - common/api.c | 525 --- common/args.h | 2 +- common/common.h | 15 +- common/conv.c | 446 +++ common/conv.h | 57 + common/cut.c | 143 +- common/cut.h | 18 +- common/delete.c | 39 +- common/encoding.c | 230 ++ common/exf.c | 433 +-- common/exf.h | 20 +- include/com_extern.h => common/extern.h | 141 +- common/gs.h | 62 +- common/key.c | 257 +- common/key.h | 66 +- common/line.c | 278 +- common/log.c | 174 +- common/main.c | 98 +- common/mark.c | 74 +- common/mark.h | 5 +- common/mem.h | 128 +- common/msg.c | 299 +- common/msg.h | 4 +- common/multibyte.h | 115 + common/options.c | 595 +-- common/options.h | 5 +- common/options_def.h | 83 + common/options_f.c | 212 +- common/put.c | 54 +- common/recover.c | 592 +-- common/screen.c | 57 +- common/screen.h | 30 +- common/search.c | 72 +- common/seq.c | 151 +- common/seq.h | 6 +- common/util.c | 303 +- common/util.h | 39 +- docs/USD.doc/vi.man/vi.1 | 86 +- docs/USD.doc/vi.ref/vi.ref | 2 +- docs/help | 2 +- ex/ex.c | 279 +- ex/ex.h | 35 +- ex/ex_abbrev.c | 14 +- ex/ex_append.c | 38 +- ex/ex_args.c | 63 +- ex/ex_argv.c | 464 ++- ex/ex_at.c | 28 +- ex/ex_bang.c | 15 +- ex/ex_cd.c | 46 +- ex/ex_cmd.c | 176 +- ex/ex_cscope.c | 412 ++- ex/ex_def.h | 76 + ex/ex_delete.c | 7 +- ex/ex_display.c | 68 +- ex/ex_edit.c | 32 +- ex/ex_equal.c | 7 +- ex/ex_file.c | 16 +- ex/ex_filter.c | 31 +- ex/ex_global.c | 68 +- ex/ex_init.c | 115 +- ex/ex_join.c | 33 +- ex/ex_map.c | 13 +- ex/ex_mark.c | 7 +- ex/ex_mkexrc.c | 10 +- ex/ex_move.c | 46 +- ex/ex_open.c | 7 +- ex/ex_perl.c | 69 - ex/ex_preserve.c | 19 +- ex/ex_print.c | 94 +- ex/ex_put.c | 7 +- ex/ex_quit.c | 7 +- ex/ex_read.c | 53 +- ex/ex_screen.c | 23 +- ex/ex_script.c | 313 +- ex/ex_set.c | 7 +- ex/ex_shell.c | 203 +- ex/ex_shift.c | 29 +- ex/ex_source.c | 24 +- ex/ex_stop.c | 7 +- ex/ex_subst.c | 262 +- ex/ex_tag.c | 582 ++- ex/ex_tcl.c | 80 - ex/ex_txt.c | 63 +- ex/ex_undo.c | 7 +- ex/ex_usage.c | 34 +- ex/ex_util.c | 72 +- ex/ex_version.c | 10 +- ex/ex_visual.c | 16 +- ex/ex_write.c | 113 +- ex/ex_yank.c | 7 +- ex/ex_z.c | 9 +- include/ex_extern.h => ex/extern.h | 35 +- ex/script.h | 4 +- ex/tag.h | 24 +- ex/version.h | 3 +- include/bitstring.h | 143 - include/ex_def.h | 78 - include/ip_extern.h | 23 - include/options_def.h | 79 - include/perl_extern.h | 8 - include/sys/queue.h | 259 -- include/tcl_extern.h | 1 - include/tk_extern.h | 29 - ip/IP_INSTRUCTIONS | 41 - ip/ip.h | 92 - ip/ip_funcs.c | 443 --- ip/ip_main.c | 165 - ip/ip_read.c | 307 -- ip/ip_screen.c | 87 - ip/ip_term.c | 108 - ip_cl/Makefile | 20 - ip_cl/ip_cl.c | 742 ---- perl_api/VI.pod | 218 -- perl_api/nviperl.pod | 43 - perl_api/perl.xs | 1115 ------ perl_api/perlsfio.c | 85 - perl_api/typemap | 42 - perl_scripts/forall.pl | 10 - perl_scripts/make.pl | 27 - perl_scripts/tk.pl | 20 - perl_scripts/wc.pl | 11 - clib/strpbrk.c => regex/COPYRIGHT | 56 +- regex/WHATSNEW | 94 + clib/bsearch.c => regex/cclass.h | 111 +- regex/cname.h | 143 + regex/engine.c | 1102 ++++++ regex/re_format.7 | 271 ++ regex/regcomp.c | 1737 +++++++++ regex/regerror.c | 176 + regex/regex.3 | 540 +++ regex/regex.h | 109 + regex/regex2.h | 174 + regex/regexec.c | 180 + clib/strdup.c => regex/regfree.c | 62 +- clib/memchr.c => regex/utils.h | 52 +- tcl_api/tcl.c | 852 ----- tcl_scripts/errors.tcl | 44 - tcl_scripts/gnats.tcl | 95 - tcl_scripts/mailprocs.tcl | 115 - tcl_scripts/wc.tcl | 16 - tk/init.tcl | 1096 ------ tk/tk_funcs.c | 346 -- tk/tk_main.c | 423 --- tk/tk_read.c | 207 -- tk/tk_screen.c | 86 - tk/tk_term.c | 169 - tk/tk_util.c | 250 -- tk/tki.h | 64 - include/vi_extern.h => vi/extern.h | 13 +- vi/getc.c | 36 +- vi/v_at.c | 24 +- vi/v_ch.c | 43 +- vi/v_cmd.c | 2 +- vi/v_delete.c | 6 +- vi/v_ex.c | 190 +- vi/v_increment.c | 47 +- vi/v_init.c | 23 +- vi/v_itxt.c | 69 +- vi/v_left.c | 22 +- vi/v_mark.c | 70 +- vi/v_match.c | 91 +- vi/v_paragraph.c | 20 +- vi/v_put.c | 14 +- vi/v_redraw.c | 6 +- vi/v_replace.c | 19 +- vi/v_right.c | 10 +- vi/v_screen.c | 14 +- vi/v_scroll.c | 69 +- vi/v_search.c | 121 +- vi/v_section.c | 22 +- vi/v_sentence.c | 12 +- vi/v_status.c | 7 +- vi/v_txt.c | 527 ++- vi/v_ulcase.c | 38 +- vi/v_undo.c | 10 +- vi/v_util.c | 31 +- vi/v_word.c | 69 +- vi/v_xchar.c | 10 +- vi/v_yank.c | 6 +- vi/v_z.c | 12 +- vi/v_zexit.c | 6 +- vi/vi.c | 174 +- vi/vi.h | 31 +- vi/vs_line.c | 76 +- vi/vs_msg.c | 113 +- vi/vs_refresh.c | 80 +- vi/vs_relative.c | 43 +- vi/vs_smap.c | 116 +- vi/vs_split.c | 574 ++- 268 files changed, 14013 insertions(+), 30375 deletions(-) delete mode 100644 FAQ delete mode 100644 LAYOUT delete mode 100644 build/ExtUtils/Embed.pm delete mode 100644 build/Makefile.in delete mode 100644 build/README delete mode 100644 build/README.LynxOS delete mode 100644 build/acconfig.h delete mode 100644 build/aclocal.m4 delete mode 100755 build/config.guess delete mode 100644 build/config.h.in delete mode 100755 build/config.sub delete mode 100755 build/configure delete mode 100644 build/configure.in delete mode 100644 build/distrib delete mode 100755 build/install-sh delete mode 100644 build/pathnames.h.in delete mode 100644 build/port.h.in delete mode 100644 build/recover.in delete mode 100644 build/spell.ok delete mode 100644 catalog/dutch delete mode 100644 catalog/dutch.check delete mode 100644 catalog/english delete mode 100644 catalog/english.base delete mode 100644 catalog/english.check delete mode 100644 catalog/french delete mode 100644 catalog/french.check delete mode 100644 catalog/german delete mode 100644 catalog/german.check create mode 100644 catalog/polish.base create mode 100644 catalog/polish.owner delete mode 100644 catalog/ru_RU.KOI8-R delete mode 100644 catalog/ru_RU.KOI8-R.check delete mode 100644 catalog/ru_SU.KOI8-R delete mode 100644 catalog/ru_SU.KOI8-R.base delete mode 100644 catalog/ru_SU.KOI8-R.check delete mode 100644 catalog/ru_SU.KOI8-R.owner delete mode 100644 catalog/spanish delete mode 100644 catalog/spanish.check delete mode 100644 catalog/swedish delete mode 100644 catalog/swedish.check create mode 100644 catalog/uk_UA.KOI8-U.base create mode 100644 catalog/uk_UA.KOI8-U.owner create mode 100644 catalog/zh_CN.GB2312.base create mode 100644 catalog/zh_CN.GB2312.owner delete mode 100644 cl/cl_bsd.c rename include/cl_extern.h => cl/extern.h (63%) delete mode 100644 clib/env.c delete mode 100644 clib/gethostname.c delete mode 100644 clib/getopt.c delete mode 100644 clib/memmove.c delete mode 100644 clib/memset.c delete mode 100644 clib/mkstemp.c delete mode 100644 clib/mmap.c delete mode 100644 clib/snprintf.c delete mode 100644 clib/strerror.c delete mode 100644 clib/strsep.c delete mode 100644 clib/strtol.c delete mode 100644 clib/strtoul.c delete mode 100644 clib/vsnprintf.c delete mode 100644 common/api.c create mode 100644 common/conv.c create mode 100644 common/conv.h create mode 100644 common/encoding.c rename include/com_extern.h => common/extern.h (52%) create mode 100644 common/multibyte.h create mode 100644 common/options_def.h create mode 100644 ex/ex_def.h delete mode 100644 ex/ex_perl.c delete mode 100644 ex/ex_tcl.c rename include/ex_extern.h => ex/extern.h (80%) delete mode 100644 include/bitstring.h delete mode 100644 include/ex_def.h delete mode 100644 include/ip_extern.h delete mode 100644 include/options_def.h delete mode 100644 include/perl_extern.h delete mode 100644 include/sys/queue.h delete mode 100644 include/tcl_extern.h delete mode 100644 include/tk_extern.h delete mode 100644 ip/IP_INSTRUCTIONS delete mode 100644 ip/ip.h delete mode 100644 ip/ip_funcs.c delete mode 100644 ip/ip_main.c delete mode 100644 ip/ip_read.c delete mode 100644 ip/ip_screen.c delete mode 100644 ip/ip_term.c delete mode 100644 ip_cl/Makefile delete mode 100644 ip_cl/ip_cl.c delete mode 100644 perl_api/VI.pod delete mode 100644 perl_api/nviperl.pod delete mode 100644 perl_api/perl.xs delete mode 100644 perl_api/perlsfio.c delete mode 100644 perl_api/typemap delete mode 100644 perl_scripts/forall.pl delete mode 100644 perl_scripts/make.pl delete mode 100644 perl_scripts/tk.pl delete mode 100644 perl_scripts/wc.pl rename clib/strpbrk.c => regex/COPYRIGHT (62%) create mode 100644 regex/WHATSNEW rename clib/bsearch.c => regex/cclass.h (50%) create mode 100644 regex/cname.h create mode 100644 regex/engine.c create mode 100644 regex/re_format.7 create mode 100644 regex/regcomp.c create mode 100644 regex/regerror.c create mode 100644 regex/regex.3 create mode 100644 regex/regex.h create mode 100644 regex/regex2.h create mode 100644 regex/regexec.c rename clib/strdup.c => regex/regfree.c (64%) rename clib/memchr.c => regex/utils.h (72%) delete mode 100644 tcl_api/tcl.c delete mode 100644 tcl_scripts/errors.tcl delete mode 100644 tcl_scripts/gnats.tcl delete mode 100644 tcl_scripts/mailprocs.tcl delete mode 100644 tcl_scripts/wc.tcl delete mode 100644 tk/init.tcl delete mode 100644 tk/tk_funcs.c delete mode 100644 tk/tk_main.c delete mode 100644 tk/tk_read.c delete mode 100644 tk/tk_screen.c delete mode 100644 tk/tk_term.c delete mode 100644 tk/tk_util.c delete mode 100644 tk/tki.h rename include/vi_extern.h => vi/extern.h (93%) diff --git a/FAQ b/FAQ deleted file mode 100644 index 357650a589bd..000000000000 --- a/FAQ +++ /dev/null @@ -1,160 +0,0 @@ -@(#)FAQ 8.13 (Berkeley) 10/14/96 - -Q: How can I get vi to display my character set? -A: Vi uses the C library routine isprint(3) to determine if a character - is printable, or should be displayed as an octal or hexadecimal value - on the screen. Generally, if vi is displaying printable characters - in octal/hexadecimal forms, your environment is not configured correctly. - Try looking at the man pages that allow you to configure your locale. - For example, to configure an ISO 8859-1 locale under Solaris using csh, - you would do: - - setenv LANG C - setenv LC_CTYPE iso_8859_1 - - Other LC_CTYPE systems/values that I'm told work: - - System Value - ====== ===== - FreeBSD lt_LN.ISO_8859-1 - HP-UX 9.X american.iso88591 - HP-UX 10.X en_US.iso88591 - SunOS 4.X iso_8859_1 - SunOS 5.X iso_8859_1 - - If there's no other solution, you can use the print and noprint edit - options of vi to specify that a specific character is printable or not - printable. - -Q: My map won't work! -A: One thing that you should immediately check if a vi map doesn't work - is if depends on the final cursor position after a P or p command. - Historic vi's were inconsistent as to the final position of the cursor, - and, to make matter worse, the final cursor position also depended on - whether the put text came from a named or unnamed buffer! Vi follows - the POSIX 1003.2 standard on this one, and makes this consistent, always - placing the cursor on the first character. - -Q: I'm using ksh or csh as my vi edit option shell value, and file - expansions don't work right! -A: The problem may be in your ksh or csh startup files, e.g., .cshrc. Vi - executes the shell to do name expansion, and the shell generally reads - its startup files. If the startup files are not correctly configured - for non-interactive use, e.g., they always echo a prompt to the screen, - vi will be unable to parse the output and things will not work - correctly. - -Q: How does the iclower edit option differ from the ignorecase (i.e. ic) - edit option? -A: The difference is that the ignorecase edit option always ignores the - case of letters in the Regular Expression (RE), and the iclower edit - option only ignores the case if there are no upper-case letters in the - RE. If any upper-case letters appear in the Regular Expression, then - it will be treated case-sensitively, as if the ignorecase edit option - was not set. - -Q: When I edit binary files, vi appends a to the last line! -A: This is historic practice for vi, and further, it's required by the - POSIX 1003.2 standard. My intent is to provide a command line and/or - edit option to turn this behavior off when I switch to version 2.0 of - the Berkeley DB package. - -Q: My cursor keys don't work when I'm in text input mode! -A: A common problem over slow links is that the set of characters sent by - the cursor keys don't arrive close enough together for vi to understand - that they are a single keystroke, and not separate keystrokes. Try - increasing the value of the escapetime edit option, which will cause - vi to wait longer before deciding that the character that - starts cursor key sequences doesn't have any characters following it. - -Q: When I edit some files, vi seems to hang forever, and I have to kill it. -A: Vi uses flock(2) and fcntl(2) to do file locking. When it attempts to - acquired a lock for a file on an NFS mounted filesystem, it can hang - for a very long (perhaps infinite) period of time. Turning off the - "lock" edit option will keep vi from attempting to acquire any locks - on the files you edit. - -Q: When I compile vi I get lots of warnings about pointer assignments - being incompatible! -A: Vi is partially written to support wide characters. When this code - interfaces with the code that doesn't yet support wide characters, - the pointer types clash. This will hopefully be fixed in the near - future, but I've been saying that for awhile, now. - -Q: I get jumpy scrolling behavior in the screen! -A: This is almost certainly a problem with the system's terminfo or - termcap information for your terminal. If the terminfo/termcap entry - doesn't have the settable scrolling region capabilities, or the more - powerful scrolling commands, these behaviors can result. Historic - implementations of vi, and some of the vi clones, don't suffer from - this problem because they wrote their own screen support instead of - using the curses library. - - The solution is to find a good terminfo or termcap entry for your - terminal, which will fix the problem for all of the applications on - your system, not just vi. Eric Raymond maintains the freely - redistributable termcap/terminfo entries. They can be downloaded - from http://www.ccil.org/~esr/ncurses.html, or you can contact him - at esr@snark.thyrsus.com. - -Q: The entire screen repaints on every keystroke! -A: Your system's curses implementation is broken. You should use the - curses implementation provided with vi or a curses replacement such - as ncurses. Eric Raymond is one of the maintainers of the freely - redistributable ncurses package. You can download ncurses from - http://www.ccil.org/~esr/ncurses.html, or you can contact him at - esr@snark.thyrsus.com. - -Q: When I use vi on a Sun console (terminal type sun-34) the screen - is occasionally trashed, usually when exiting vi! -A: The Sun console can't handle the 'al' capability of the termcap - entry (the il1 capability of terminfo entries). If you delete that - entry from your terminfo/termcap information everything should work - correctly. - -Q: I don't have a version of ctags (or I have ctags, but it doesn't tag - nearly enough things)! -A: There's a version of ctags available on the 4.4BSD-Lite distributions, - as well as the FreeBSD, NetBSD, Linux and GNU distributions. Or, you - might want to try Exuberant Ctags: - - Title: Exuberant Ctags - Version: 1.3 - Entered-date: 16JUN96 - Description: - A better ctags which generates tags for all possible tag types: - macro definitions, enumerated values (values inside enum{...}), - function and method definitions, enum/struct/union tags, external - function prototypes (optional), typedefs, and variable - declarations. It is far less easily fooled by code containing #if - preprocessor conditional constructs, using a conditional path - selection algorithm to resolve complicated choices, and a - fall-back algorithm when this one fails. Can also be used to print - out a list of selected objects found in source files. - Keywords: ctags, tags, exuberant - Author: darren@sirsi.com (Darren Hiebert) - darren@hiwaay.net (Darren Hiebert) - Maintained-by: darren@sirsi.com (Darren Hiebert) - darren@hiwaay.net (Darren Hiebert) - Primary-site: sunsite.unc.edu /pub/Linux/devel/lang/c - 27kB ctags-1.3.tar.gz - Alternate-site: ftp.halcyon.com /local/gvr - 27kB ctags-1.3.tar.gz - Original-site: - Platforms: UNIX, MSDOS, WindowsNT, Windows95, OS/2, Amiga - Copying-policy: Public domain - -Q: When I update a file I already have open, and use :e to reread it, I - get nul's for the rest of the file! -A: Your system's implementation of mmap(2) has a bug; you will have to - exit vi and re-execute it. - -Q: Where can I get cscope? -A: Cscope is available on UNIXWare System V Release 4.0 variants such as - Sun Solaris 2.x (/opt/SUNWspro/bin) and UNIXWare System V Release 4.1. - - You can buy version 13.3 source with an unrestricted license for $400 - from AT&T Software Solutions by calling +1-800-462-8146. Binary - redistribution of cscope is an additional $1500, one-time flat fee. - - For more information, see http://www.unipress.com/att/new/cscope.html. diff --git a/LAYOUT b/LAYOUT deleted file mode 100644 index e3a55ebb5778..000000000000 --- a/LAYOUT +++ /dev/null @@ -1,128 +0,0 @@ -# @(#)LAYOUT 8.12 (Berkeley) 10/10/96 - -LAYOUT - This file: the layout of the nvi sources. - -LICENSE - Nvi's copyright notice and conditions for redistribution. - -README - Welcome message and basic information. - -build/ - The build/configuration directory for nvi. See build/README for - more information. - -catalog/ - Support for message catalogs for nvi. See catalog/README for more - information. - -cl/ - Source files for nvi's curses screen support. - -clib/ - Replacement source files for C library functions. - -common/ - Source files for pieces of code that are shared by ex and vi, - e.g., searching and logging code or code translating line numbers - into requests to the dbopen(3) database code. It also has the - interface code for modifying "records" in the underlying database. - -curses/ - A stripped-down replacement curses library. Do not try and use - this library outside of nvi, many standard curses functions have - been removed because nvi doesn't use them. See build/README for - more information. - -db/ - A stripped-down replacement DB library. Do not try and use this - library outside of nvi, many standard DB functions have been - removed because nvi doesn't use them. See db/README for more - information. - -docs/ - Ex/vi documentation, both current and historic. - - USD.doc/ - [USD stands for "User's Supplementary Documents".] - - edit/ Roff source for "Edit: A tutorial". This document - was USD:14 in the 4.3BSD manuals, but was not - distributed with 4.4BSD. - - exref/ Roff source for "Ex Reference Manual -- Version - 3.7". This document was USD:16 in the 4.3BSD - manuals, and USD tabbed 12 in the 4.4BSD manuals. - - vi.man/ Roff source for a UNIX manual page for nex/nvi. - An updated version of the 4.4BSD manual page. - - vi.ref/ Roff source for the nex/nvi reference document. - An updated version of the 4.4BSD document, USD - tabbed 13. - - vitut/ Roff source for "An Introduction to Display - Editing with Vi". This document was USD:15 in - the 4.3BSD manuals, but was not distributed with - 4.4BSD. It includes the historic "Vi Quick - Reference" card. - - - PostScript preformatted versions of the nex/nvi reference - manual and manual page are in the files named with a ".ps" - suffix, in their respective source directories. Flat text - preformatted versions of the nex/nvi reference manual and - manual page are in the files named with a ".txt" suffix, - in their respective source directories. - - changelog -- Log of changes from version to version. - features -- Todo list, suggested features list. - internals/ - autowrite -- Vi autowrite option discussion. - context -- Previous context marks discussion. - gdb.script -- GDB debugging scripts. - input -- Vi maps, executable buffers, and input discussion. - openmode -- Open mode behaviors. - quoting -- Vi quoting discussion. - structures -- Out-of-date nvi internal structure description. - tutorial/ -- Historic vi tutorial(s), of unknown quality. - -ex/ - The ex source code. Because vi has the colon command, lots of - this code is used by vi. Generally, if functionality is shared - by both ex and vi, it's in the ex directory. If it's vi only, - it's in the vi directory. Files are generally named by the - command(s) they support, but occasionally with a name that - describes their functionality. - - version.h -- Version information. - -include/ - Replacement include files: - - bitstring.h -- The 4.4BSD bitstring operations. - sys/queue.h -- The 4.4BSD queue operations. - -perl_api/ - Source code supporting the Perl scripting language for nvi. - -perl_scripts/ - Scripts for Perl included with nvi. - -regex/ - Henry Spencer's POSIX 1003.2 regular expression (RE) library. - -tcl_api/ - Source code supporting the Tcl scripting language for nvi. - -tcl_scripts/ - Scripts for Tcl included with nvi. - -tk/ - Source files for nvi's Tk screen support. - - init.tcl -- Vi startup tcl script. - -vi/ - The vi source code. diff --git a/LICENSE b/LICENSE index 78e8f4a40e19..c79151197da6 100644 --- a/LICENSE +++ b/LICENSE @@ -1,14 +1,19 @@ -The vi program is freely redistributable. You are welcome to copy, modify -and share it with others under the conditions listed in this file. If any -company (not any individual!) finds vi sufficiently useful that you would -have purchased it, or if any company wishes to redistribute it, contributions -to the authors would be appreciated. - /*- + * $Id: LICENSE,v 8.18 2011/07/10 11:58:35 zy Exp $ + */ + +The following are the copyrights and redistribution conditions that apply +to this copy of the Vi software. + +/* * Copyright (c) 1991, 1992, 1993, 1994 * The Regents of the University of California. All rights reserved. - * Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996 + * Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 * Keith Bostic. All rights reserved. + * Copyright (c) 1999, 2000 + * Sven Verdoolaege. All rights reserved. + * Copyright (c) 2011 + * Zhihao Yuan. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -18,11 +23,7 @@ to the authors would be appreciated. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * diff --git a/README b/README index 33db36a5c862..bb05379e7a7c 100644 --- a/README +++ b/README @@ -1,31 +1,32 @@ -# @(#)README 8.147 (Berkeley) 10/19/96 +# $Id: README,v 9.0 2012/10/07 09:13:54 zy Exp $ -This is the README for nex/nvi, a freely redistributable implementation -of the ex/vi text editors originally distributed as part of the Fourth -Berkeley Software Distribution (4BSD), by the University of California, -Berkeley. +This is version 2.1.1 (2012-10-07) of nex/nvi, a reimplementation of the ex/vi +text editors originally distributed as part of the Fourth Berkeley +Software Distribution (4BSD), by the University of California, Berkeley. -The source code for nex/nvi can be retrieved by using anonymous ftp to -ftp.cs.berkeley.edu. The file ucb/4bsd/nvi.tar.gz is the gzip'd archive, -of version 1.71 of nex/nvi. This version is believed to be stable and -problem free. The file ucb/4bsd/nvi-###.ALPHA.tar.gz is a gzip'd archive -of the current alpha-test release of nex/nvi. This version reflects the -current development tree, and will be more likely to have problems. +The directory layout is as follows: -See the file: - build/README for information on building nvi. - LAYOUT for a description of where everything is. - LICENSE for the copyright and redistribution terms. + LICENSE ....... Copyright, use and redistribution information. + README ........ This file. + build ......... Build directory. + catalog ....... Message catalogs; see catalog/README. + cl ............ Vi interface to the curses(3) library. + common ........ Code shared by ex and vi. + docs .......... Ex/vi documentation, both current and historic. + ex ............ Ex source code. + regex ......... Modified regex library with wide character support. + vi ............ Vi source code. -If you have any questions about nex/nvi, problems with it, or concerns -about the conditions for redistribution, please contact me: +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - Keith Bostic +1-508-287-4781 - 394 E. Riding Dr. bostic@bostic.com - Carlisle, MA 01741 - USA +o Nvi was written by Keith Bostic, and the last version is 1.79. After that, -Keith Bostic + Sven Verdoolaege added the iconv support and the DB3 locking. + + Jun-ichiro itojun Hagino developed the file encoding detection + techniques in his nvi-m17n. + +The following acknowledgments were written by Keith Bostic: =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= o This software is several years old and is the product of many folks' work. @@ -63,51 +64,3 @@ o From the original vi acknowledgements, by William Joy and Mark Horton: o And... The financial support of UUNET Communications Services is gratefully acknowledged. - -=-=-=-=-=-=-=-=-=-=-= -o Status: - -This software is in beta test, and it's pretty stable. Almost all of the -historic functionality in ex/vi is there, the only major missing pieces -are open mode and the lisp edit option. - -Nvi is largely 8-bit clean. This isn't difficult to fix, and was left in -during initial development to keep things simple. Wide character support -will be integrated at the same time that it is made fully 8-bit clean. - -There aren't a lot of new features in nex/nvi, but there are a few things -you might like. The "Additional Features" section of the reference work -(docs/USD.doc/vi.ref/vi.ref.txt, docs/USD.doc/vi.ref/vi.ref.ps) has more -information. - -=-=-=-=-=-=-=-=-=-=-= -o Debugging: - -Code fixes are greatly appreciated, of course, but if you can't provide -them, please email me as much information as you can as to how I might -reproduce the bug, and I'll try to fix it locally. Stack traces of core -dumps are only rarely helpful -- an example file with a set of keystrokes -that causes the problem is almost invariably necessary. I know it's -annoying, but simply playing with the bug until you can reproduce it at -will, with minimal keystrokes, is immensely helpful to me. - -Please include the following in the bug report; - - o The version of nvi you're running (use :version to get it). - o The row/column dimensions of the screen (80 x 32). - o Unless you're confident that they're not part of the problem, - your startup files (.exrc, .nexrc) and the environment variable - (EXINIT, NEXINIT) values. (Cutting and pasting the output - of ":set all" is usually sufficient.) - -If you want to do your own debugging, recompile the program with DEBUG -defined. (Configuring with --enable-debug will do this for you.) This -turns on the additional command-line option -D, that takes either s or w -as an argument. The option -Ds causes nvi to ignore the EXINIT and -.exrc files on startup, and -Dw causes nvi to print out the process id -and wait for you to enter a to continue. - -If you're running a memory checker (e.g. Purify) on nvi, you will first -want to recompile everything with "-DPURIFY" set in the CFLAGS. This -initializes allocated pages in the DB code, and free's allocated memory -at the end of the nvi execution. diff --git a/build/ExtUtils/Embed.pm b/build/ExtUtils/Embed.pm deleted file mode 100644 index 04525c18c908..000000000000 --- a/build/ExtUtils/Embed.pm +++ /dev/null @@ -1,473 +0,0 @@ -# $Id: Embed.pm,v 1.17 1996/07/02 13:48:17 dougm Exp $ -require 5.002; - -package ExtUtils::Embed; -require Exporter; -require FileHandle; -use Config; -use Getopt::Std; - -#Only when we need them -#require ExtUtils::MakeMaker; -#require ExtUtils::Liblist; - -use vars qw(@ISA @EXPORT $VERSION - @Extensions $Verbose $lib_ext - $opt_o $opt_s - ); -use strict; - -$VERSION = sprintf("%d.%02d", q$Revision: 1.17 $ =~ /(\d+)\.(\d+)/); -#for the namespace change -$Devel::embed::VERSION = "99.99"; - -sub Version { $VERSION; } - -@ISA = qw(Exporter); -@EXPORT = qw(&xsinit &ldopts - &ccopts &ccflags &ccdlflags &perl_inc - &xsi_header &xsi_protos &xsi_body); - -#let's have Miniperl borrow from us instead -#require ExtUtils::Miniperl; -#*canon = \&ExtUtils::Miniperl::canon; - -$Verbose = 0; -$lib_ext = $Config{lib_ext} || '.a'; - -sub xsinit { - my($file, $std, $mods) = @_; - my($fh,@mods,%seen); - $file ||= "perlxsi.c"; - - if (@_) { - @mods = @$mods if $mods; - } - else { - getopts('o:s:'); - $file = $opt_o if defined $opt_o; - $std = $opt_s if defined $opt_s; - @mods = @ARGV; - } - $std = 1 unless scalar @mods; - - if ($file eq "STDOUT") { - $fh = \*STDOUT; - } - else { - $fh = new FileHandle "> $file"; - } - - push(@mods, static_ext()) if defined $std; - @mods = grep(!$seen{$_}++, @mods); - - print $fh &xsi_header(); - print $fh "EXTERN_C void xs_init _((void));\n\n"; - print $fh &xsi_protos(@mods); - - print $fh "\nEXTERN_C void\nxs_init()\n{\n"; - print $fh &xsi_body(@mods); - print $fh "}\n"; - -} - -sub xsi_header { - return < -#include - -#ifdef __cplusplus -} -# ifndef EXTERN_C -# define EXTERN_C extern "C" -# endif -#else -# ifndef EXTERN_C -# define EXTERN_C extern -# endif -#endif - -EOF -} - -sub xsi_protos { - my(@exts) = @_; - my(@retval,%seen); - - foreach $_ (@exts){ - my($pname) = canon('/', $_); - my($mname, $cname); - ($mname = $pname) =~ s!/!::!g; - ($cname = $pname) =~ s!/!__!g; - my($ccode) = "EXTERN_C void boot_${cname} _((CV* cv));\n"; - next if $seen{$ccode}++; - push(@retval, $ccode); - } - return join '', @retval; -} - -sub xsi_body { - my(@exts) = @_; - my($pname,@retval,%seen); - my($dl) = canon('/','DynaLoader'); - push(@retval, "\tdXSUB_SYS;\n") if $] > 5.002; - push(@retval, "\tchar *file = __FILE__;\n\n"); - - foreach $_ (@exts){ - my($pname) = canon('/', $_); - my($mname, $cname, $ccode); - ($mname = $pname) =~ s!/!::!g; - ($cname = $pname) =~ s!/!__!g; - if ($pname eq $dl){ - # Must NOT install 'DynaLoader::boot_DynaLoader' as 'bootstrap'! - # boot_DynaLoader is called directly in DynaLoader.pm - $ccode = "\t/* DynaLoader is a special case */\n\tnewXS(\"${mname}::boot_${cname}\", boot_${cname}, file);\n"; - push(@retval, $ccode) unless $seen{$ccode}++; - } else { - $ccode = "\tnewXS(\"${mname}::bootstrap\", boot_${cname}, file);\n"; - push(@retval, $ccode) unless $seen{$ccode}++; - } - } - return join '', @retval; -} - -sub static_ext { - unless (scalar @Extensions) { - @Extensions = sort split /\s+/, $Config{static_ext}; - unshift @Extensions, qw(DynaLoader); - } - @Extensions; -} - -sub ldopts { - require ExtUtils::MakeMaker; - require ExtUtils::Liblist; - my($std,$mods,$link_args,$path) = @_; - my(@mods,@link_args,@argv); - my($dllib,$config_libs,@potential_libs,@path); - local($") = ' ' unless $" eq ' '; - my $MM = bless {} => 'MY'; - if (scalar @_) { - @link_args = @$link_args if $link_args; - @mods = @$mods if $mods; - } - else { - @argv = @ARGV; - #hmm - while($_ = shift @argv) { - /^-std$/ && do { $std = 1; next; }; - /^--$/ && do { @link_args = @argv; last; }; - /^-I(.*)/ && do { $path = $1 || shift @argv; next; }; - push(@mods, $_); - } - } - $std = 1 unless scalar @link_args; - @path = $path ? split(/:/, $path) : @INC; - - push(@potential_libs, @link_args) if scalar @link_args; - push(@potential_libs, $Config{libs}) if defined $std; - - push(@mods, static_ext()) if $std; - - my($mod,@ns,$root,$sub,$extra,$archive,@archives); - print STDERR "Searching (@path) for archives\n" if $Verbose; - foreach $mod (@mods) { - @ns = split('::', $mod); - $sub = $ns[-1]; - $root = $MM->catdir(@ns); - - print STDERR "searching for '$sub${lib_ext}'\n" if $Verbose; - foreach (@path) { - next unless -e ($archive = $MM->catdir($_,"auto",$root,"$sub$lib_ext")); - push @archives, $archive; - if(-e ($extra = $MM->catdir($_,"auto",$root,"extralibs.ld"))) { - local(*FH); - if(open(FH, $extra)) { - my($libs) = ; chomp $libs; - push @potential_libs, split /\s+/, $libs; - } - else { - warn "Couldn't open '$extra'"; - } - } - last; - } - } - #print STDERR "\@potential_libs = @potential_libs\n"; - - my($extralibs, $bsloadlibs, $ldloadlibs, $ld_run_path) = - $MM->ext(join ' ', - $MM->catdir("-L$Config{archlib}", "CORE"), " -lperl", - @potential_libs); - - my $ld_or_bs = $bsloadlibs || $ldloadlibs; - print STDERR "bs: $bsloadlibs ** ld: $ldloadlibs" if $Verbose; - my $linkage = "$Config{ldflags} @archives $ld_or_bs"; - print STDERR "ldopts: '$linkage'\n" if $Verbose; - - return $linkage if scalar @_; - print "$linkage\n"; -} - -sub ccflags { - print " $Config{ccflags} "; -} - -sub ccdlflags { - print " $Config{ccdlflags} "; -} - -sub perl_inc { - print " -I$Config{archlib}/CORE "; -} - -sub ccopts { - ccflags; - ccdlflags; - perl_inc; -} - -sub canon { - my($as, @ext) = @_; - foreach(@ext) { - # might be X::Y or lib/auto/X/Y/Y.a - next if s!::!/!g; - s:^(lib|ext)/(auto/)?::; - s:/\w+\.\w+$::; - } - grep(s:/:$as:, @ext) if ($as ne '/'); - @ext; -} - -__END__ - -=head1 NAME - -ExtUtils::Embed - Utilities for embedding Perl in C/C++ applications - -=head1 SYNOPSIS - - - perl -MExtUtils::Embed -e xsinit - perl -MExtUtils::Embed -e ldopts - -=head1 DESCRIPTION - -ExtUtils::Embed provides utility functions for embedding a Perl interpreter -and extensions in your C/C++ applications. -Typically, an application B will invoke ExtUtils::Embed -functions while building your application. - -=head1 @EXPORT - -ExtUtils::Embed exports the following functions: - -L, L, L, L, L, -L, L, L, L - -=head1 FUNCTIONS - -=item xsinit() - -Generate C/C++ code for the XS intializer function. - -When invoked as C<`perl -MExtUtils::Embed -e xsinit --`> -the following options are recognized: - -B<-o> (Defaults to B) - -B<-o STDOUT> will print to STDOUT. - -B<-std> (Write code for extensions that are linked with the current Perl.) - -Any additional arguments are expected to be names of modules -to generate code for. - -When invoked with parameters the following are accepted and optional: - -C - -Where, - -B<$filename> is equivalent to the B<-o> option. - -B<$std> is boolean, equivalent to the B<-std> option. - -B<[@modules]> is an array ref, same as additional arguments mentioned above. - -=item Examples - - - perl -MExtUtils::Embed -e xsinit -- -o xsinit.c Socket - - -This will generate code with an B function that glues the perl B function -to the C B function and writes it to a file named "xsinit.c". - -Note that B is a special case where it must call B directly. - - perl -MExtUtils::Embed -e xsinit - - -This will generate code for linking with B and -each static extension found in B<$Config{static_ext}>. -The code is written to the default file name B. - - - perl -MExtUtils::Embed -e xsinit -- -o xsinit.c -std DBI DBD::Oracle - - -Here, code is written for all the currently linked extensions along with code -for B and B. - -If you have a working B then there is rarely any need to statically link in any -other extensions. - -=item ldopts() - -Output arguments for linking the Perl library and extensions to your -application. - -When invoked as C<`perl -MExtUtils::Embed -e ldopts --`> -the following options are recognized: - -B<-std> - -Output arguments for linking the Perl library and any extensions linked -with the current Perl. - -B<-I> - -Search path for ModuleName.a archives. -Default path is B<@INC>. -Library archives are expected to be found as -B -For example, when looking for B relative to a search path, -we should find B - -When looking for B relative to a search path, -we should find B - -Keep in mind, you can always supply B -as an additional linker argument. - -B<--> - -Additional linker arguments to be considered. - -Any additional arguments found before the B<--> token -are expected to be names of modules to generate code for. - -When invoked with parameters the following are accepted and optional: - -C - -Where, - -B<$std> is boolean, equivalent to the B<-std> option. - -B<[@modules]> is equivalent to additional arguments found before the B<--> token. - -B<[@link_args]> is equivalent to arguments found after the B<--> token. - -B<$path> is equivalent to the B<-I> option. - -In addition, when ldopts is called with parameters, it will return the argument string -rather than print it to STDOUT. - -=item Examples - - - perl -MExtUtils::Embed -e ldopts - - -This will print arguments for linking with B, B and -extensions found in B<$Config{static_ext}>. This includes libraries -found in B<$Config{libs}> and the first ModuleName.a library -for each extension that is found by searching B<@INC> or the path -specifed by the B<-I> option. -In addition, when ModuleName.a is found, additional linker arguments -are picked up from the B file in the same directory. - - - perl -MExtUtils::Embed -e ldopts -- -std Socket - - -This will do the same as the above example, along with printing additional arguments for linking with the B extension. - - - perl -MExtUtils::Embed -e ldopts -- DynaLoader - - -This will print arguments for linking with just the B extension -and B. - - - perl -MExtUtils::Embed -e ldopts -- -std Msql -- -L/usr/msql/lib -lmsql - - -Any arguments after the second '--' token are additional linker -arguments that will be examined for potential conflict. If there is no -conflict, the additional arguments will be part of the output. - - -=item perl_inc() - -For including perl header files this function simply prints: - - -I $Config{archlib}/CORE - -So, rather than having to say: - - perl -MConfig -e 'print "-I $Config{archlib}/CORE"' - -Just say: - - perl -MExtUtils::Embed -e perl_inc - -=item ccflags(), ccdlflags() - -These functions simply print $Config{ccflags} and $Config{ccdlflags} - -=item ccopts() - -This function combines perl_inc(), ccflags() and ccdlflags() into one. - -=item xsi_header() - -This function simply returns a string defining the same B macro as -B along with #including B and B. - -=item xsi_protos(@modules) - -This function returns a string of B prototypes for each @modules. - -=item xsi_body(@modules) - -This function returns a string of calls to B that glue the module B -function to B for each @modules. - -B uses the xsi_* functions to generate most of it's code. - -=head1 EXAMPLES - -For examples on how to use B for building C/C++ applications -with embedded perl, see the eg/ directory and the I man page. - -=head1 SEE ALSO - -the I man page - -=head1 AUTHOR - -Doug MacEachern - -Based on ideas from Tim Bunce and -B by Andreas Koenig and Tim Bunce. - -=cut - diff --git a/build/Makefile.in b/build/Makefile.in deleted file mode 100644 index 54025e7d3b9d..000000000000 --- a/build/Makefile.in +++ /dev/null @@ -1,630 +0,0 @@ -# @(#)Makefile.in 8.75 (Berkeley) 10/23/96 - -srcdir= @srcdir@/.. -CC= @CC@ -OPTFLAG=@OPTFLAG@ -CFLAGS= -c $(OPTFLAG) @CFLAGS@ -I. -I$(srcdir)/include @CPPFLAGS@ -LDFLAGS=@LDFLAGS@ -PERL= @vi_cv_path_perl@ -PERLLIB=@vi_cv_perllib@ -SHRPENV=@shrpenv@ - -# Objects -COBJS= addbytes.o addch.o box.o clear.o clrtobot.o clrtoeol.o \ - cr_put.o ctrace.o cur_hash.o curses.o delch.o deleteln.o delwin.o \ - erase.o fullname.o getch.o getstr.o id_subwins.o idlok.o initscr.o \ - insch.o insertln.o longname.o move.o mvwin.o newwin.o overlay.o \ - overwrite.o putchar.o refresh.o scroll.o setterm.o standout.o \ - toucholap.o touchwin.o tscroll.o tstp.o tty.o unctrl.o waddnstr.o -CLOBJS= cl_bsd.o cl_funcs.o cl_main.o cl_read.o cl_screen.o cl_term.o -DBOBJS= db.o mpool.o \ - bt_close.o bt_conv.o bt_debug.o bt_delete.o bt_get.o bt_open.o \ - bt_overflow.o bt_page.o bt_put.o bt_search.o bt_seq.o \ - bt_split.o bt_utils.o \ - rec_close.o rec_delete.o rec_get.o rec_open.o rec_put.o \ - rec_search.o rec_seq.o rec_utils.o -REOBJS= regcomp.o regerror.o regexec.o regfree.o -TKOBJS= tk_funcs.o tk_main.o tk_read.o tk_screen.o tk_term.o tk_util.o -VIOBJS= cut.o delete.o ex.o ex_abbrev.o ex_append.o ex_args.o ex_argv.o \ - ex_at.o ex_bang.o ex_cd.o ex_cmd.o ex_cscope.o ex_delete.o \ - ex_display.o ex_edit.o ex_equal.o ex_file.o ex_filter.o \ - ex_global.o ex_init.o ex_join.o ex_map.o ex_mark.o ex_mkexrc.o \ - ex_move.o ex_open.o ex_perl.o ex_preserve.o ex_print.o ex_put.o \ - ex_quit.o ex_read.o ex_screen.o ex_script.o ex_set.o ex_shell.o \ - ex_shift.o ex_source.o ex_stop.o ex_subst.o ex_tag.o ex_tcl.o \ - ex_txt.o ex_undo.o ex_usage.o ex_util.o ex_version.o ex_visual.o \ - ex_write.o ex_yank.o ex_z.o exf.o getc.o key.o line.o log.o main.o \ - mark.o msg.o options.o options_f.o put.o recover.o screen.o \ - search.o seq.o util.o v_at.o v_ch.o v_cmd.o v_delete.o v_ex.o \ - v_increment.o v_init.o v_itxt.o v_left.o v_mark.o v_match.o \ - v_paragraph.o v_put.o v_redraw.o v_replace.o v_right.o v_screen.o \ - v_scroll.o v_search.o v_section.o v_sentence.o v_status.o v_txt.o \ - v_ulcase.o v_undo.o v_util.o v_word.o v_xchar.o v_yank.o v_z.o \ - v_zexit.o vi.o vs_line.o vs_msg.o vs_refresh.o vs_relative.o \ - vs_smap.o vs_split.o - -all: nvi @tknvi@ - -NVIALL= $(CLOBJS) $(VIOBJS) @cobjs@ @LIBOBJS@ -nvi nex: $(NVIALL) - $(SHRPENV) $(CC) $(LDFLAGS) -o $@ $(NVIALL) @LIBS@ - -rm -f nex - ln $@ nex - -TKALL= $(TKOBJS) $(VIOBJS) @LIBOBJS@ -tknvi: $(TKALL) - $(SHRPENV) $(CC) $(LDFLAGS) -o $@ $(TKALL) @TKLIBS@ - -chmod= @vi_cv_path_chmod@ -cp= @vi_cv_path_cp@ -ln= @vi_cv_path_ln@ -mkdir= @vi_cv_path_mkdir@ -rm= @vi_cv_path_rm@ -strip= @vi_cv_path_strip@ - -prefix= @prefix@ -bindir= @bindir@ -datadir=@datadir@ -mandir= @mandir@ -exec_prefix=@exec_prefix@ - -dmode= 755 -emode= 555 -fmode= 444 - -transform=@program_transform_name@ - -install: all install_common - @echo "Installing vi, ex, view: $(bindir) ..." - [ -d $(bindir) ] || \ - ($(mkdir) $(bindir) && $(chmod) $(dmode) $(bindir)) - cd $(bindir) && $(rm) -f `echo vi | sed '$(transform)'` - $(cp) nvi $(bindir)/`echo vi | sed '$(transform)'` - cd $(bindir) && [ -f $(strip) ] && \ - $(strip) `echo vi | sed '$(transform)'` - cd $(bindir) && $(chmod) $(emode) `echo vi | sed '$(transform)'` - cd $(bindir) && $(rm) -f `echo ex | sed '$(transform)'` - cd $(bindir) && $(rm) -f `echo view | sed '$(transform)'` - cd $(bindir) && $(ln) \ - `echo vi | sed '$(transform)'` `echo ex | sed '$(transform)'` - cd $(bindir) && $(ln) \ - `echo vi | sed '$(transform)'` `echo view | sed '$(transform)'` - [ -d $(mandir) ] || \ - ($(mkdir) $(mandir) && $(chmod) $(dmode) $(mandir)) - [ -d $(mandir)/cat1 ] || \ - ($(mkdir) $(mandir)/cat1 && $(chmod) $(dmode) $(mandir)/cat1) - @echo "Installing man pages: $(mandir) ..." - cd $(mandir)/cat1 && $(rm) -f `echo vi.0 | sed '$(transform)'` - $(cp) $(srcdir)/docs/USD.doc/vi.man/vi.0 \ - $(mandir)/cat1/`echo vi.0 | sed '$(transform)'` - cd $(mandir)/cat1 && $(chmod) $(fmode) `echo vi.0 | sed '$(transform)'` - cd $(mandir)/cat1 && $(rm) -f `echo ex.0 | sed '$(transform)'` - cd $(mandir)/cat1 && $(rm) -f `echo view.0 | sed '$(transform)'` - cd $(mandir)/cat1 && $(ln) \ - `echo vi.0 | sed '$(transform)'` `echo ex.0 | sed '$(transform)'` - cd $(mandir)/cat1 && $(ln) \ - `echo vi.0 | sed '$(transform)'` `echo view.0 | sed '$(transform)'` - [ -d $(mandir)/man1 ] || \ - ($(mkdir) $(mandir)/man1 && $(chmod) $(dmode) $(mandir)/man1) - cd $(mandir)/man1 && $(rm) -f `echo vi.1 | sed '$(transform)'` - $(cp) $(srcdir)/docs/USD.doc/vi.man/vi.1 \ - $(mandir)/man1/`echo vi.1 | sed '$(transform)'` - cd $(mandir)/man1 && $(chmod) $(fmode) `echo vi.1 | sed '$(transform)'` - cd $(mandir)/man1 && $(rm) -f `echo ex.1 | sed '$(transform)'` - cd $(mandir)/man1 && $(rm) -f `echo view.1 | sed '$(transform)'` - cd $(mandir)/man1 && $(ln) \ - `echo vi.1 | sed '$(transform)'` `echo ex.1 | sed '$(transform)'` - cd $(mandir)/man1 && $(ln) \ - `echo vi.1 | sed '$(transform)'` `echo view.1 | sed '$(transform)'` - -cat= dutch english french german ru_SU.KOI8-R spanish swedish -install_common: - [ -f $(chmod) ] - [ -f $(cp) ] - [ -f $(ln) ] - [ -f $(mkdir) ] - [ -f $(rm) ] - [ -d $(prefix) ] || \ - ($(mkdir) $(prefix) && $(chmod) $(dmode) $(prefix)) - [ -d $(exec_prefix) ] || \ - ($(mkdir) $(exec_prefix) && $(chmod) $(dmode) $(exec_prefix)) - [ -d $(datadir) ] || \ - ($(mkdir) $(datadir) && $(chmod) $(dmode) $(datadir)) - $(rm) -rf $(datadir)/vi - $(mkdir) $(datadir)/vi && $(chmod) $(dmode) $(datadir)/vi - @echo "Installing message catalogs: $(datadir)/vi/catalog ..." - $(mkdir) $(datadir)/vi/catalog && \ - $(chmod) $(dmode) $(datadir)/vi/catalog - (cd $(srcdir)/catalog && $(cp) $(cat) $(datadir)/vi/catalog && \ - cd $(datadir)/vi/catalog && $(chmod) $(fmode) *) - @echo "Installing Perl scripts: $(datadir)/vi/perl ..." - $(mkdir) $(datadir)/vi/perl && $(chmod) $(dmode) $(datadir)/vi/perl - [ -f VI.pm ] && $(cp) VI.pm $(datadir)/vi/perl && \ - cd $(datadir)/vi/perl && $(chmod) $(fmode) VI.pm) - (cd $(srcdir)/perl_scripts && $(cp) *.pl $(datadir)/vi/perl && \ - cd $(datadir)/vi/perl && $(chmod) $(fmode) *.pl) - @echo "Installing Tcl scripts: $(datadir)/vi/tcl ..." - $(mkdir) $(datadir)/vi/tcl && $(chmod) $(dmode) $(datadir)/vi/tcl - (cd $(srcdir)/tcl_scripts && $(cp) *.tcl $(datadir)/vi/tcl && \ - cd $(datadir)/vi/tcl && $(chmod) $(fmode) *.tcl) - @echo "Installing recover script: $(datadir)/vi/recover ..." - ($(cp) recover $(datadir)/vi/recover && \ - $(chmod) $(emode) $(datadir)/vi/recover) - -uninstall: - $(rm) -rf $(datadir)/vi - cd $(bindir) && $(rm) -f `echo ex | sed '$(transform)'` - cd $(bindir) && $(rm) -f `echo vi | sed '$(transform)'` - cd $(bindir) && $(rm) -f `echo view | sed '$(transform)'` - cd $(mandir)/cat1 && $(rm) -f `echo ex.0 | sed '$(transform)'` - cd $(mandir)/cat1 && $(rm) -f `echo vi.0 | sed '$(transform)'` - cd $(mandir)/cat1 && $(rm) -f `echo view.0 | sed '$(transform)'` - cd $(mandir)/man1 && $(rm) -f `echo ex.1 | sed '$(transform)'` - cd $(mandir)/man1 && $(rm) -f `echo vi.1 | sed '$(transform)'` - cd $(mandir)/man1 && $(rm) -f `echo view.1 | sed '$(transform)'` - -docs: - cd $(srcdir)/docs/USD.doc/vi.ref && $(MAKE) - cd $(srcdir)/docs/USD.doc/vi.man && $(MAKE) - cd $(srcdir)/docs/USD.doc/edit && $(MAKE) - cd $(srcdir)/docs/USD.doc/exref && $(MAKE) - cd $(srcdir)/docs/USD.doc/vitut && $(MAKE) - -clean: - -rm -f *.core *.o memcpy.c perl.c - -rm -f nex nvi tknvi core - -rm -f $(COBJS) $(CLOBJS) $(DBOBJS) $(REOBJS) - -rm -f $(TKOBJS) $(VIOBJS) - -cleandocs: - cd $(srcdir)/docs/USD.doc/vi.ref && $(MAKE) clean - cd $(srcdir)/docs/USD.doc/vi.man && $(MAKE) clean - cd $(srcdir)/docs/USD.doc/edit && $(MAKE) clean - cd $(srcdir)/docs/USD.doc/exref && $(MAKE) clean - cd $(srcdir)/docs/USD.doc/vitut && $(MAKE) clean - -distclean maintainer-clean realclean: clean cleandocs - -rm -f Makefile config.cache config.h config.log config.status - -rm -f pathnames.h port.h - -# Vi curses sources. -cl_bsd.o: $(srcdir)/cl/cl_bsd.c - $(CC) $(CFLAGS) $? -cl_funcs.o: $(srcdir)/cl/cl_funcs.c - $(CC) $(CFLAGS) $? -cl_main.o: $(srcdir)/cl/cl_main.c - $(CC) $(CFLAGS) $? -cl_read.o: $(srcdir)/cl/cl_read.c - $(CC) $(CFLAGS) $? -cl_screen.o: $(srcdir)/cl/cl_screen.c - $(CC) $(CFLAGS) $? -cl_term.o: $(srcdir)/cl/cl_term.c - $(CC) $(CFLAGS) $? - -# Vi Tk sources. -tk_funcs.o: $(srcdir)/tk/tk_funcs.c - $(CC) $(CFLAGS) @XINCS@ $? -tk_main.o: $(srcdir)/tk/tk_main.c - $(CC) $(CFLAGS) @XINCS@ $? -tk_read.o: $(srcdir)/tk/tk_read.c - $(CC) $(CFLAGS) @XINCS@ $? -tk_screen.o: $(srcdir)/tk/tk_screen.c - $(CC) $(CFLAGS) @XINCS@ $? -tk_term.o: $(srcdir)/tk/tk_term.c - $(CC) $(CFLAGS) @XINCS@ $? -tk_util.o: $(srcdir)/tk/tk_util.c - $(CC) $(CFLAGS) @XINCS@ $? - -# Vi Tcl/Perl interpreter sources. -api.o: $(srcdir)/common/api.c - $(CC) $(CFLAGS) $? -perl.c: $(srcdir)/perl_api/perl.xs $(srcdir)/perl_api/typemap - echo "#define _PATH_PERLSCRIPTS \"$(datadir)/vi/perl\"" > $@ - $(PERL) $(PERLLIB)/ExtUtils/xsubpp -typemap \ - $(PERLLIB)/ExtUtils/typemap $(srcdir)/perl_api/perl.xs >> $@ - ($(PERL) -ne 'print "sub $$1 {\$$curscr->$$1(\@_)}\n" \ - if /newXS\("VI::([^":]*)"/;' $@ ; echo "1;") > VI.pm -perl.o: perl.c - $(CC) $(CFLAGS) $? -perlsfio.o: $(srcdir)/perl_api/perlsfio.c - $(CC) $(CFLAGS) $? -tcl.o: $(srcdir)/tcl_api/tcl.c - $(CC) $(CFLAGS) $? - -# Vi sources. -cut.o: $(srcdir)/common/cut.c - $(CC) $(CFLAGS) $? -delete.o: $(srcdir)/common/delete.c - $(CC) $(CFLAGS) $? -exf.o: $(srcdir)/common/exf.c - $(CC) $(CFLAGS) $? -key.o: $(srcdir)/common/key.c - $(CC) $(CFLAGS) $? -line.o: $(srcdir)/common/line.c - $(CC) $(CFLAGS) $? -log.o: $(srcdir)/common/log.c - $(CC) $(CFLAGS) $? -main.o: $(srcdir)/common/main.c - $(CC) $(CFLAGS) $? -mark.o: $(srcdir)/common/mark.c - $(CC) $(CFLAGS) $? -msg.o: $(srcdir)/common/msg.c - $(CC) $(CFLAGS) $? -options.o: $(srcdir)/common/options.c - $(CC) $(CFLAGS) $? -options_f.o: $(srcdir)/common/options_f.c - $(CC) $(CFLAGS) $? -put.o: $(srcdir)/common/put.c - $(CC) $(CFLAGS) $? -screen.o: $(srcdir)/common/screen.c - $(CC) $(CFLAGS) $? -search.o: $(srcdir)/common/search.c - $(CC) $(CFLAGS) $? -seq.o: $(srcdir)/common/seq.c - $(CC) $(CFLAGS) $? -recover.o: $(srcdir)/common/recover.c - $(CC) $(CFLAGS) $? -util.o: $(srcdir)/common/util.c - $(CC) $(CFLAGS) $? -ex.o: $(srcdir)/ex/ex.c - $(CC) $(CFLAGS) $? -ex_abbrev.o: $(srcdir)/ex/ex_abbrev.c - $(CC) $(CFLAGS) $? -ex_append.o: $(srcdir)/ex/ex_append.c - $(CC) $(CFLAGS) $? -ex_args.o: $(srcdir)/ex/ex_args.c - $(CC) $(CFLAGS) $? -ex_argv.o: $(srcdir)/ex/ex_argv.c - $(CC) $(CFLAGS) $? -ex_at.o: $(srcdir)/ex/ex_at.c - $(CC) $(CFLAGS) $? -ex_bang.o: $(srcdir)/ex/ex_bang.c - $(CC) $(CFLAGS) $? -ex_cd.o: $(srcdir)/ex/ex_cd.c - $(CC) $(CFLAGS) $? -ex_cmd.o: $(srcdir)/ex/ex_cmd.c - $(CC) $(CFLAGS) $? -ex_cscope.o: $(srcdir)/ex/ex_cscope.c - $(CC) $(CFLAGS) $? -ex_delete.o: $(srcdir)/ex/ex_delete.c - $(CC) $(CFLAGS) $? -ex_digraph.o: $(srcdir)/ex/ex_digraph.c - $(CC) $(CFLAGS) $? -ex_display.o: $(srcdir)/ex/ex_display.c - $(CC) $(CFLAGS) $? -ex_edit.o: $(srcdir)/ex/ex_edit.c - $(CC) $(CFLAGS) $? -ex_equal.o: $(srcdir)/ex/ex_equal.c - $(CC) $(CFLAGS) $? -ex_file.o: $(srcdir)/ex/ex_file.c - $(CC) $(CFLAGS) $? -ex_filter.o: $(srcdir)/ex/ex_filter.c - $(CC) $(CFLAGS) $? -ex_global.o: $(srcdir)/ex/ex_global.c - $(CC) $(CFLAGS) $? -ex_init.o: $(srcdir)/ex/ex_init.c - $(CC) $(CFLAGS) $? -ex_join.o: $(srcdir)/ex/ex_join.c - $(CC) $(CFLAGS) $? -ex_map.o: $(srcdir)/ex/ex_map.c - $(CC) $(CFLAGS) $? -ex_mark.o: $(srcdir)/ex/ex_mark.c - $(CC) $(CFLAGS) $? -ex_mkexrc.o: $(srcdir)/ex/ex_mkexrc.c - $(CC) $(CFLAGS) $? -ex_move.o: $(srcdir)/ex/ex_move.c - $(CC) $(CFLAGS) $? -ex_open.o: $(srcdir)/ex/ex_open.c - $(CC) $(CFLAGS) $? -ex_perl.o: $(srcdir)/ex/ex_perl.c - $(CC) $(CFLAGS) $? -ex_preserve.o: $(srcdir)/ex/ex_preserve.c - $(CC) $(CFLAGS) $? -ex_print.o: $(srcdir)/ex/ex_print.c - $(CC) $(CFLAGS) $? -ex_put.o: $(srcdir)/ex/ex_put.c - $(CC) $(CFLAGS) $? -ex_quit.o: $(srcdir)/ex/ex_quit.c - $(CC) $(CFLAGS) $? -ex_read.o: $(srcdir)/ex/ex_read.c - $(CC) $(CFLAGS) $? -ex_screen.o: $(srcdir)/ex/ex_screen.c - $(CC) $(CFLAGS) $? -ex_script.o: $(srcdir)/ex/ex_script.c - $(CC) $(CFLAGS) $? -ex_set.o: $(srcdir)/ex/ex_set.c - $(CC) $(CFLAGS) $? -ex_shell.o: $(srcdir)/ex/ex_shell.c - $(CC) $(CFLAGS) $? -ex_shift.o: $(srcdir)/ex/ex_shift.c - $(CC) $(CFLAGS) $? -ex_source.o: $(srcdir)/ex/ex_source.c - $(CC) $(CFLAGS) $? -ex_stop.o: $(srcdir)/ex/ex_stop.c - $(CC) $(CFLAGS) $? -ex_subst.o: $(srcdir)/ex/ex_subst.c - $(CC) $(CFLAGS) $? -ex_tag.o: $(srcdir)/ex/ex_tag.c - $(CC) $(CFLAGS) $? -ex_tcl.o: $(srcdir)/ex/ex_tcl.c - $(CC) $(CFLAGS) $? -ex_txt.o: $(srcdir)/ex/ex_txt.c - $(CC) $(CFLAGS) $? -ex_undo.o: $(srcdir)/ex/ex_undo.c - $(CC) $(CFLAGS) $? -ex_usage.o: $(srcdir)/ex/ex_usage.c - $(CC) $(CFLAGS) $? -ex_util.o: $(srcdir)/ex/ex_util.c - $(CC) $(CFLAGS) $? -ex_version.o: $(srcdir)/ex/ex_version.c - $(CC) $(CFLAGS) $? -ex_visual.o: $(srcdir)/ex/ex_visual.c - $(CC) $(CFLAGS) $? -ex_write.o: $(srcdir)/ex/ex_write.c - $(CC) $(CFLAGS) $? -ex_yank.o: $(srcdir)/ex/ex_yank.c - $(CC) $(CFLAGS) $? -ex_z.o: $(srcdir)/ex/ex_z.c - $(CC) $(CFLAGS) $? -getc.o: $(srcdir)/vi/getc.c - $(CC) $(CFLAGS) $? -v_at.o: $(srcdir)/vi/v_at.c - $(CC) $(CFLAGS) $? -v_ch.o: $(srcdir)/vi/v_ch.c - $(CC) $(CFLAGS) $? -v_cmd.o: $(srcdir)/vi/v_cmd.c - $(CC) $(CFLAGS) $? -v_delete.o: $(srcdir)/vi/v_delete.c - $(CC) $(CFLAGS) $? -v_ex.o: $(srcdir)/vi/v_ex.c - $(CC) $(CFLAGS) $? -v_increment.o: $(srcdir)/vi/v_increment.c - $(CC) $(CFLAGS) $? -v_init.o: $(srcdir)/vi/v_init.c - $(CC) $(CFLAGS) $? -v_itxt.o: $(srcdir)/vi/v_itxt.c - $(CC) $(CFLAGS) $? -v_left.o: $(srcdir)/vi/v_left.c - $(CC) $(CFLAGS) $? -v_mark.o: $(srcdir)/vi/v_mark.c - $(CC) $(CFLAGS) $? -v_match.o: $(srcdir)/vi/v_match.c - $(CC) $(CFLAGS) $? -v_paragraph.o: $(srcdir)/vi/v_paragraph.c - $(CC) $(CFLAGS) $? -v_put.o: $(srcdir)/vi/v_put.c - $(CC) $(CFLAGS) $? -v_redraw.o: $(srcdir)/vi/v_redraw.c - $(CC) $(CFLAGS) $? -v_replace.o: $(srcdir)/vi/v_replace.c - $(CC) $(CFLAGS) $? -v_right.o: $(srcdir)/vi/v_right.c - $(CC) $(CFLAGS) $? -v_screen.o: $(srcdir)/vi/v_screen.c - $(CC) $(CFLAGS) $? -v_scroll.o: $(srcdir)/vi/v_scroll.c - $(CC) $(CFLAGS) $? -v_search.o: $(srcdir)/vi/v_search.c - $(CC) $(CFLAGS) $? -v_section.o: $(srcdir)/vi/v_section.c - $(CC) $(CFLAGS) $? -v_sentence.o: $(srcdir)/vi/v_sentence.c - $(CC) $(CFLAGS) $? -v_status.o: $(srcdir)/vi/v_status.c - $(CC) $(CFLAGS) $? -v_txt.o: $(srcdir)/vi/v_txt.c - $(CC) -c @no_op_OPTFLAG@ @CFLAGS@ -I. -I$(srcdir)/include @CPPFLAGS@ $? -v_ulcase.o: $(srcdir)/vi/v_ulcase.c - $(CC) $(CFLAGS) $? -v_undo.o: $(srcdir)/vi/v_undo.c - $(CC) $(CFLAGS) $? -v_util.o: $(srcdir)/vi/v_util.c - $(CC) $(CFLAGS) $? -v_word.o: $(srcdir)/vi/v_word.c - $(CC) $(CFLAGS) $? -v_xchar.o: $(srcdir)/vi/v_xchar.c - $(CC) $(CFLAGS) $? -v_yank.o: $(srcdir)/vi/v_yank.c - $(CC) $(CFLAGS) $? -v_z.o: $(srcdir)/vi/v_z.c - $(CC) $(CFLAGS) $? -v_zexit.o: $(srcdir)/vi/v_zexit.c - $(CC) $(CFLAGS) $? -vi.o: $(srcdir)/vi/vi.c - $(CC) $(CFLAGS) $? -vs_line.o: $(srcdir)/vi/vs_line.c - $(CC) $(CFLAGS) $? -vs_msg.o: $(srcdir)/vi/vs_msg.c - $(CC) $(CFLAGS) $? -vs_refresh.o: $(srcdir)/vi/vs_refresh.c - $(CC) $(CFLAGS) $? -vs_relative.o: $(srcdir)/vi/vs_relative.c - $(CC) $(CFLAGS) $? -vs_smap.o: $(srcdir)/vi/vs_smap.c - $(CC) $(CFLAGS) $? -vs_split.o: $(srcdir)/vi/vs_split.c - $(CC) $(CFLAGS) $? - -addbytes.o: $(srcdir)/curses/addbytes.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -addch.o: $(srcdir)/curses/addch.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -box.o: $(srcdir)/curses/box.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -clear.o: $(srcdir)/curses/clear.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -clrtobot.o: $(srcdir)/curses/clrtobot.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -clrtoeol.o: $(srcdir)/curses/clrtoeol.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -cr_put.o: $(srcdir)/curses/cr_put.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -ctrace.o: $(srcdir)/curses/ctrace.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -cur_hash.o: $(srcdir)/curses/cur_hash.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -curses.o: $(srcdir)/curses/curses.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -delch.o: $(srcdir)/curses/delch.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -deleteln.o: $(srcdir)/curses/deleteln.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -delwin.o: $(srcdir)/curses/delwin.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -erase.o: $(srcdir)/curses/erase.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -fullname.o: $(srcdir)/curses/fullname.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -getch.o: $(srcdir)/curses/getch.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -getstr.o: $(srcdir)/curses/getstr.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -id_subwins.o: $(srcdir)/curses/id_subwins.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -idlok.o: $(srcdir)/curses/idlok.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -initscr.o: $(srcdir)/curses/initscr.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -insch.o: $(srcdir)/curses/insch.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -insertln.o: $(srcdir)/curses/insertln.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -longname.o: $(srcdir)/curses/longname.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -move.o: $(srcdir)/curses/move.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -mvwin.o: $(srcdir)/curses/mvwin.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -newwin.o: $(srcdir)/curses/newwin.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -overlay.o: $(srcdir)/curses/overlay.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -overwrite.o: $(srcdir)/curses/overwrite.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -putchar.o: $(srcdir)/curses/putchar.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -refresh.o: $(srcdir)/curses/refresh.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -scroll.o: $(srcdir)/curses/scroll.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -setterm.o: $(srcdir)/curses/setterm.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -standout.o: $(srcdir)/curses/standout.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -toucholap.o: $(srcdir)/curses/toucholap.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -touchwin.o: $(srcdir)/curses/touchwin.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -tscroll.o: $(srcdir)/curses/tscroll.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -tstp.o: $(srcdir)/curses/tstp.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -tty.o: $(srcdir)/curses/tty.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -unctrl.o: $(srcdir)/curses/unctrl.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? -waddnstr.o: $(srcdir)/curses/waddnstr.c - $(CC) -D_CURSES_PRIVATE $(CFLAGS) $? - -# DB sources. -db.o: $(srcdir)/db/db/db.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) $? -mpool.o: $(srcdir)/db/mpool/mpool.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/mpool $? -bt_close.o: $(srcdir)/db/btree/bt_close.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $? -bt_conv.o: $(srcdir)/db/btree/bt_conv.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $? -bt_debug.o: $(srcdir)/db/btree/bt_debug.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $? -bt_delete.o: $(srcdir)/db/btree/bt_delete.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $? -bt_get.o: $(srcdir)/db/btree/bt_get.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $? -bt_open.o: $(srcdir)/db/btree/bt_open.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $? -bt_overflow.o: $(srcdir)/db/btree/bt_overflow.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $? -bt_page.o: $(srcdir)/db/btree/bt_page.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $? -bt_put.o: $(srcdir)/db/btree/bt_put.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $? -bt_search.o: $(srcdir)/db/btree/bt_search.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $? -bt_seq.o: $(srcdir)/db/btree/bt_seq.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $? -bt_split.o: $(srcdir)/db/btree/bt_split.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $? -bt_utils.o: $(srcdir)/db/btree/bt_utils.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/btree $? -rec_close.o: $(srcdir)/db/recno/rec_close.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/recno $? -rec_delete.o: $(srcdir)/db/recno/rec_delete.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/recno $? -rec_get.o: $(srcdir)/db/recno/rec_get.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/recno $? -rec_open.o: $(srcdir)/db/recno/rec_open.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/recno $? -rec_put.o: $(srcdir)/db/recno/rec_put.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/recno $? -rec_search.o: $(srcdir)/db/recno/rec_search.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/recno $? -rec_seq.o: $(srcdir)/db/recno/rec_seq.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/recno $? -rec_utils.o: $(srcdir)/db/recno/rec_utils.c - $(CC) -D__DBINTERFACE_PRIVATE $(CFLAGS) -I$(srcdir)/db/recno $? - -# Regular Expressions sources. -regcomp.o: $(srcdir)/regex/regcomp.c - $(CC) -D__REGEX_PRIVATE $(CFLAGS) $? -regerror.o: $(srcdir)/regex/regerror.c - $(CC) -D__REGEX_PRIVATE $(CFLAGS) $? -regexec.o: $(srcdir)/regex/regexec.c - $(CC) -D__REGEX_PRIVATE $(CFLAGS) $? -regfree.o: $(srcdir)/regex/regfree.c - $(CC) -D__REGEX_PRIVATE $(CFLAGS) $? - -# Random replacement and workaround sources. -addnstr.o: $(srcdir)/clib/addnstr.c - $(CC) $(CFLAGS) $? -bsearch.o: $(srcdir)/clib/bsearch.c - $(CC) $(CFLAGS) $? -env.o: $(srcdir)/clib/env.c - $(CC) $(CFLAGS) $? -fchmod.o: $(srcdir)/clib/fchmod.c - $(CC) $(CFLAGS) $(INC) $? -gethostname.o: $(srcdir)/clib/gethostname.c - $(CC) $(CFLAGS) $(INC) $? -getopt.o: $(srcdir)/clib/getopt.c - $(CC) $(CFLAGS) $(INC) $? -memchr.o: $(srcdir)/clib/memchr.c - $(CC) $(CFLAGS) $? -memcpy.o: $(srcdir)/clib/memmove.c - $(cp) $? memcpy.c - $(CC) $(CFLAGS) -DMEMCOPY memcpy.c -memmove.o: $(srcdir)/clib/memmove.c - $(CC) $(CFLAGS) -DMEMMOVE $? -memset.o: $(srcdir)/clib/memset.c - $(CC) $(CFLAGS) $? -mkstemp.o: $(srcdir)/clib/mkstemp.c - $(CC) $(CFLAGS) $? -mmap.o: $(srcdir)/clib/mmap.c - $(CC) $(CFLAGS) $? -realloc.o: $(srcdir)/clib/realloc.c - $(CC) $(CFLAGS) $? -snprintf.o: $(srcdir)/clib/snprintf.c - $(CC) $(CFLAGS) $? -strdup.o: $(srcdir)/clib/strdup.c - $(CC) $(CFLAGS) $? -strerror.o: $(srcdir)/clib/strerror.c - $(CC) $(CFLAGS) $? -strpbrk.o: $(srcdir)/clib/strpbrk.c - $(CC) $(CFLAGS) $? -strsep.o: $(srcdir)/clib/strsep.c - $(CC) $(CFLAGS) $? -strtol.o: $(srcdir)/clib/strtol.c - $(CC) $(CFLAGS) $? -strtoul.o: $(srcdir)/clib/strtoul.c - $(CC) $(CFLAGS) $? -vsnprintf.o: $(srcdir)/clib/vsnprintf.c - $(CC) $(CFLAGS) $? diff --git a/build/README b/build/README deleted file mode 100644 index efbce2b9dfbb..000000000000 --- a/build/README +++ /dev/null @@ -1,369 +0,0 @@ -# @(#)README 8.26 (Berkeley) 10/19/96 - -Nvi uses the GNU autoconf program for configuration and compilation. You -should enter: - - configure - make - -and nvi will configure the system and build one or two binaries: nvi and -tknvi. You can use any path to the configure script, e.g., to build for -an x86 architecture, I suggest that you do: - - mkdir build.x86 - cd build.x86 - ../build/configure - make - -There are options that you can specify to the configure command. See -the next section for a description of these options. - -If you want to rebuild or reconfigure nvi, for example, because you change -your mind as to the curses library that you want to use, create a new -directory and reconfigure it using "configure" and whatever options you -choose, don't try to selectively edit the files. - -By default, nvi is installed as "vi", with hard links to "ex" and "view". -To install them using different names, use the configure program options. -For example, to install them as "nvi", "nex" and "nview", use: - - configure --program-prefix=n - -See the section below on installation for details. - -Note, if you're building nvi on a LynxOS system, you should read the -README.LynxOS file in this directory for additional build instructions -that are specific to that operating system. - -If you have trouble with this procedure, send email to the addresses -listed in ../README. In that email, please provide a complete script -of the output for all of the above commands that you entered. - -=-=-=-=-=-=-= -NVI'S OPTIONS TO THE CONFIGURE PROGRAM -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -There are many options that you can enter to the configuration program. -To see a complete list of the options, enter "configure --help". Only -a few of them are nvi specific. These options are as follows: - - --disable-curses DON'T use the nvi-provided curses routines. - --disable-db DON'T use the nvi-provided DB routines. - --disable-re DON'T use the nvi-provided RE routines. - --enable-debug Build a debugging version. - --enable-perlinterp Include a Perl interpreter in vi. - --enable-tclinterp Include a Tk/Tcl interpreter in vi. - --enable-tknvi Build a Tk/Tcl front-end for vi. - -disable-curses: - By default, nvi loads its own implementation of the curses - routines (which are a stripped-down version of the 4.4BSD curses - library). If you have your own curses library implementation and - you want to use it instead, enter: - - --disable-curses - - as an argument to configure, and the curses routines will be taken - from whatever libraries you load. Note: System V based curses - implementations are usually broken. See the last section of this - README for further information about nvi and the curses library. - -disable-db: - By default, nvi loads its own versions of the Berkeley DB routines - (which are a stripped-down version of DB 1.85). If you have your - own version of the Berkeley DB routines and you want to use them - instead, enter: - - --disable-db - - as an argument to configure, and the DB routines will be taken - from whatever libraries you load. Make sure that the DB routines - you use are at least version 1.85 or later. - -disable-re: - By default, nvi loads its own versions of the POSIX 1003.2 Regular - Expression routines (which are Henry Spencer's implementation). - If your C library contains an implementation of the POSIX 1003.2 - RE routines (note, this is NOT the same as the historic UNIX RE - routines), and you want to use them instead, enter: - - --disable-re - - as an argument to configure, and the RE routines will be taken - from whatever libraries you load. Please ensure that your RE - routines implement Henry Spencer's extensions for doing vi-style - "word" searches. - -enable-debug: - If you want to build nvi with no optimization (i.e. without -O - as a compiler flag), with -g as a compiler flag, and with DEBUG - defined during compilation, enter: - - --enable-debug - - as an argument to configure. - -enable-perlinterp: - If you have the Perl 5 libraries and you want to compile in the - Perl interpreter, enter: - - --enable-perlinterp - - as an argument to configure. (Note: this is NOT possible with - Perl 4, or even with Perl 5 versions earlier than 5.002.) - -enable-tclinterp: - If you have the Tk/Tcl libraries and you want to compile in the - Tcl/Tk interpreter, enter: - - --enable-tclinterp - - as an argument to configure. If your Tk/Tcl include files and - libraries aren't in the standard library and include locations, - see the next section of this README file for more information. - -enable-tknvi: - If you have the Tk/Tcl libraries and you want to build the Tcl/Tk - nvi front-end, enter: - - --enable-tknvi - - as an argument to configure. If your Tk/Tcl include files and - libraries aren't in the standard library and include locations, - see the next section of this README file for more information. - -=-=-=-=-=-=-= -ADDING OR CHANGING COMPILERS, OR COMPILE OR LOAD LINE FLAGS -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -If you want to use a specific compiler, specify the CC environment -variable before running configure. For example: - - env CC=gcc configure - -Using anything other than the native compiler will almost certainly -mean that you'll want to check the compile and load line flags, too. - -If you want to specify additional load line flags, specify the ADDLDFLAGS -environment variable before running configure. For example: - - env ADDLDFLAGS="-Q" configure - -would specify the -Q flag in the load line when the nvi programs are -loaded. - -If you don't want configure to use the default load line flags for the -system, specify the LDFLAGS environment variable before running configure. -For example: - - env LDFLAGS="-32" configure - -will cause configure to set the load line flags to "-32", and not set -them based on the current system. - -If you want to specify additional compile line flags, specify the -ADDCPPFLAGS environment variable before running configure. For example: - - env ADDCPPFLAGS="-I../foo" configure - -would cause the compiler to be passed the -I../foo flag when compiling -test programs during configuration as well as when building nvi object -files. - -If you don't want configure to use the default compile line flags for the -system, specify the CPPFLAGS environment variable before running configure. -For example: - - env CPPFLAGS="-I.." configure - -will cause configure to use "-I.." as the compile line flags instead of -the default values. - -=-=-=-=-=-=-= -ADDING LIBRARIES AND INCLUDE FILES -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -If the Tk/Tcl or any other include files or libraries are in non-standard -places on your system, you will need to specify the directory path where -they can be found. - -If you want to specify additional library paths, set the ADDLIBS environment -variable before running configure. For example: - - env ADDLIBS="-L/a/b -L/e/f -ldb" configure - -would specify two additional directories to search for libraries, /a/b -and /e/f, and one additional library to load, "db". - -If you want to specify additional include paths, specify the ADDCPPFLAGS -environment variable before running configure. For example: - - env ADDCPPFLAGS="-I/usr/local/include" LIBS="-ldb" configure - -would search /usr/local/include for include files, as well as load the db -library as described above. - -As a final example, let's say that you've downloaded ncurses from the net -and you've built it in a directory named ncurses which is at the same -level in the filesystem hierarchy as nvi. You would enter something like: - - env ADDCPPFLAGS="-I../../ncurses/include" \ - ADDLIBS="-L../../ncurses/libraries" configure - -to cause nvi to look for the curses include files and the curses library -in the ncurses environment. - -Notes: - Make sure that you prepend -L to any library directory names, and - that you prepend -I to any include file directory names! Also, - make sure that you quote the paths as shown above, i.e. with - single or double quotes around the values you're specifying for - ADDCPPFLAGS and ADDLIBS. - - =-=-=-=-=-= - You should NOT need to add any libraries or include files to load - the Perl5 interpreter. The configure script will obtain that - information directly from the Perl5 program. This means that the - configure script must be able to find perl in its path. It looks - for "perl5" first, and then "perl". If you're building a Perl - interpreter and neither is found, it's a fatal error. - - =-=-=-=-=-= - You do not need to specify additional libraries to load Tk/Tcl, - Perl or curses, as the nvi configuration script adds the - appropriate libraries to the load line whenever you specify - --enable-tknvi or other Perl or Tk/Tcl related option, or build - the Tk/Tcl or curses version of nvi. The library names that are - automatically loaded are as follows: - - for Perl: -lperl - for Tk/Tcl: -ltk -ltcl -lm - for curses: -lcurses - - In addition, the configure script loads: - - ... the X libraries when loading the Tk/Tcl libraries, - if they exist. - - ... the -ltermcap or -ltermlib libraries when loading - any curses library, if they exist. - - =-=-=-=-=-= - The env command is available on most systems, and simply sets one - or more environment variables before running a command. If the - env command is not available to you, you can set the environment - variables in your shell before running configure. For example, - in sh or ksh, you could do: - - ADDLIBS="-L/a/b -L/e/f -ldb" configure - - and in csh or tcsh, you could do: - - setenv ADDLIBS "-L/a/b -L/e/f -ldb" - configure - - See your shell manual page for further information. - -=-=-=-=-=-=-= -INSTALLING NVI -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -Nvi installs the following files into the following locations, with -the following default values: - -Variables: Default value: -prefix /usr/local -exec_prefix $(prefix) -bindir $(prefix)/bin -datadir $(prefix)/share -mandir $(prefix)/man - -File(s): Default location ----------------------------------------- -vi $(bindir)/vi -vi.1 $(mandir)/man1/vi.1 -vi.0 $(mandir)/cat1/vi.0 -Perl scripts $(datadir)/vi/perl/ -Tcl scripts $(datadir)/vi/tcl/ -Message Catalogs $(datadir)/vi/catalog/ - -Notes: - There are two hard links to the vi program, named ex and view. - Similarly, there are two hard links to the unformatted vi manual - page, named ex.1 and view.1, and two hard links to the formatted - manual page, named ex.0 and view.0. These links are created when - the program and man pages are installed. - - If you want to install vi, ex, view and the man pages as nvi, nex, - nview, use the configure option --program-prefix=n. Other, more - complex transformations are possible -- use configure --help to - see more options. - - To move the entire installation tree somewhere besides /usr/local, - change the value of both "exec_prefix" and "prefix". To move the - binaries to a different place, change the value of "bindir". - Similarly, to put the datafiles (the message catalogs, Perl and - Tcl scripts) or the man pages in a different place, change the - value of "datadir" or "mandir". These values can be changed as - part of configuration: - - configure --exec_prefix=/usr/contrib --prefix=/usr/share - - or when doing the install itself: - - make exec_prefix=/usr/contrib prefix=/usr/contrib install - - The datafile directory (e.g., /usr/local/share/vi by default) is - completely removed and then recreated as part of the installation - process. - -=-=-=-=-=-=-= -NVI AND THE CURSES LIBRARY -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -The major portability problem for nvi is selecting a curses library. -Unfortunately, it is common to find broken versions of curses -- the -original System V curses was broken, resulting in all vendors whose -implementations are derived from System V having broken implementations -in turn. - -For this reason, BY DEFAULT, nvi uses the stripped-down curses library -that's included in its distribution. Of course, it would be preferable -to use the vendor's curses library, or one of the newer implementations -of curses, e.g., ncurses. - -To use the vendor's curses library, specify the: - - --disable-curses - -argument to the configure command. If you use the vendor's or other -curses library, and you see any of the following symptoms: - - + Core dumps in curses routines. - + Missing routines when compiling. - + Repainting the wrong characters on the screen. - + Displaying inverse video in the wrong places. - + Failure to reset your terminal to the correct modes on exit. - -you have a broken curses implementation, and you should reconfigure nvi -to use another curses library or the curses library provided with nvi. - -There are two alternative sources for curses libraries: - -#1: Compile the 4BSD curses library from any of the recent BSD - releases: FreeBSD, NetBSD or 4.4BSD-Lite release 2. These - libraries should be able to support nvi. - -#2: Retrieve and build the ncurses library. This library is not - recommended unreservedly, at least for now, for two reasons. - First, it can't be built on any system where the compiler - doesn't support function prototypes. Second, it currently has - a few bugs in its support for nvi. It mostly works, but it's - still not quite right. - -One final note. If you see the following symptoms: - - + Line-by-line screen repainting instead of scrolling. - -it usually means that your termcap or terminfo information is insufficient -for the terminal. diff --git a/build/README.LynxOS b/build/README.LynxOS deleted file mode 100644 index 2cc68dafc861..000000000000 --- a/build/README.LynxOS +++ /dev/null @@ -1,320 +0,0 @@ -README.LynxOS -============= - -Written by Ronald F. Guilmette - -Last modified Wed Aug 14 23:10:07 PDT 1996 ------------------------------------------- - -0. Introduction ---------------- - -This file describes how to build and install the Berkeley nvi editor for -the LynxOS 2.4.0 operating system. - -LynxOS 2.4.0 is available for a variety of different hardware platforms, in -particular, x86, m680x0, Sparc, and PowerPC. I have successfully built nvi -on all four of these flavors of LynxOS by following the procedures given in -this file. - -Note that these procedures may not work on versions of LynxOS prior to 2.4.0. -(As I understand it, a good deal of work went into making the 2.4.0 release -more POSIX-compliant, and I have no idea what build glitches, if any, you -might encounter if you try to build nvi on a pre-2.4.0 version of LynxOS.) - -There are basically four steps to configuring, building, and installing nvi -on LynxOS, namely: - - 1. Get setup to use the proper C compiler. - 2. Replace your installed `tr' program. - 3. Fix your system include files. - 4. Do a normal configure, build, and install of nvi. - -These steps are described in separate sections below. - -1. Get Setup to Use the Proper C Compiler ------------------------------------------- - -The first step when building nvi on LynxOS is to set your $PATH environment -variable properly so that the gcc 2.x compiler appears first on your path, -prior to the older (and less robust) gcc 1.xx compiler (typically installed -as /bin/gcc) and/or the old Lynx proprietary C compiler (typically installed -as /bin/cc), both of which may also be present on your system. - -Note that for most operating systems, the configure script for nvi tries -to use whatever compiler you have installed (and in your $PATH) as "cc", -however in the special case of LynxOS, the configure script will auto- -matically try to find a "gcc" program on your $PATH in preference to a -compiler called "cc". If the nvi configure script only find a compiler -called "cc", that's OK. It will still try to see if that is really just -the GNU C compiler installed under the name "cc". - -Regardless of the name however (be it "gcc" or "cc") the first C compiler -in your $PATH should be some _recent_ (i.e. 2.0 or later) version of the -GNU C compiler... and the nvi configure script now checks that this is the -case, and fails if it isn't. - -Oddly enough, LynxOS 2.4.0 (and some prior versions) shipped with as many -as three different C compilers installed, so it is important to set your -$PATH environment variable carfully in order to get the proper C compiler -to appear first in your $PATH. You want to avoid having either the /bin/gcc -compiler or the /bin/cc compiler be the first C compiler in your $PATH. - -To make sure that the GNU C version 2.x compiler which was shipped with your -LynxOS system appears first on your path, you will need to either set your -$PATH variable (for sh/bash/ksh users) or your $path variable (for csh/tcsh -users). You can, of course, just do this at the shell command prompt, but -it is probably better to actually edit this change into your .profile file -(for sh/bash/ksh users) or into your .cshrc file (for csh/tcsh users). - -The pathname of the directory that contains the GNU C version 2.x compiler -is (unfortunately) dependent upon the exact type of LynxOS system you have. - -For LynxOS 2.4.0 on x86 systems, gcc 2.x is located in: - - /cygnus/94q4-lynxos-x86/bin - -For LynxOS 2.4.0 on m680x0 systems, gcc 2.x is located in: - - /cygnus/94q4-lynxos-68k/bin - -For LynxOS 2.4.0 on Sparc systems, gcc 2.x is located in: - - /cygnus/94q4-lynxos-usparc/bin - -For LynxOS 2.4.0 on PowerPC systems, gcc 2.x is located in: - - /cygnus/95q2-lynxos-ppc/bin - -(Note also that these locations may change in LynxOS 2.5.x and beyond.) - -Anyway, it is imperative that you setup your $PATH environment variable -(*before* you do the configure step for nvi) so that the GNU C version 2.x -compiler appears in your $PATH before either the /bin/cc or /bin/gcc -compilers (if present). If you fail to do this, the configure step for -nvi will fail, because the compiler script actually checks (now) that the -compiler you are using (if your are on a LynxOS system) is gcc 2.0 or -later. - -To make absolutely sure that you will be configuring and building nvi with -the proper C compiler (i.e. the GNU C version 2.x compiler on your system) -you should add the directory name listed above for your specific system type -to your $PATH setting in your $HOME/.profile file. (For csh/tcsh users, you -will instead want to add the relevant directory name to the setting of your -$path variable in your ~/.cshrc file.) Once you have added the proper direc- -tory name (from the list given above) to your $HOME/.profile file (or to your -~/.cshrc file, if you are using csh or tcsh) you should log out completely -and then log back into the system just to make sure your new $PATH/$path -setting takes effect properly. - -When you finish making this adjustment to your $PATH (or $path), the most -up-to-date version of gcc on your system should be available to you as the -first `gcc' program on your $PATH. You should verify that this is indeed the -case simply by typing `gcc -v' and then checking the version number reported -by the compiler. It should say either "2.6-94q4" or (on PowerPC systems) it -should say "2.6-95q2". If you don't get these results, try again to set your -$PATH (or $path) until you do. You won't be able to build nvi until you are -properly setup to use gcc version 2.0 or later. - -Performing the steps shown above will insure that your subsequent configura- -tion and build steps for nvi will make use of the most up-to-date version of -gcc that was shipped with your Lynx operating system. (Note that the versions -of gcc which are currently shipping with LynxOS 2.4.0 are also somewhat out- -of-date themselves, but they are still quite a bit newer and more bug-free -and ANSI conformant that those other two C compilers, /bin/cc and /bin/gcc, -which also ship with LynxOS 2.4.0.) - -(Note: At present, LynxOS version 2.4.0 is the latest officially released -version of LynxOS, and all of the above information is accurate and correct -for LynxOS 2.4.0 as of the time of this writing. However it is rumored that -future releases of LynxOS may provide a still newer version of gcc, and that -it may be located in the /usr/bin directory. Thus, if you are building nvi -for some LynxOS version later than 2.4.0, you may wish to check and see if -your system has a program called /usr/bin/gcc, and use that version of gcc, -if available, rather than the one suggested above.) - -2. Replace Your Installed `tr' Program ---------------------------------------- - -The `tr' program which comes bundled with LynxOS 2.4.0 (as /bin/tr) has a -somewhat obscure bug which just happens to be tickled by almost all GNU -`autoconf' generated `configure' scripts (including the one that nowadays -comes bundled with nvi). Using the stock /bin/tr program on LynxOS when -executing such `configure' scripts _will_ cause these scripts to malfunction -in various ways. It is therefore imperative that you replace your LynxOS -/bin/tr program with a properly working version of the `tr' command _before_ -you even try to configure nvi. (You can tell if your `tr' program has the -bug by executng the command "echo ab- | tr ab- ABC". If this yields the -string "Ab-" then you have the bug. If it yields "ABC" then you don't.) - -You can obtain sources for a working version of the `tr' command as part of -the GNU `textutils' package (the latest version of which, at the time of this -writing, is 1.19). The GNU textutils package is available for downloading -from prep.ai.mit.edu in the pub/gnu directory. Look for the file named -textutils-1.19.tar.gz, or an even more recent version of textutils, if one -is available. Fetch it, gunzip it, untar it, and follow the directions in -the INSTALL file included in the tar file to build and install the entire -textutils set of utility programs (which includes a working `tr' program). -Then just make sure that the GNU version of `tr' appears on your $PATH -_before_ the LynxOS version of `tr' (i.e. /bin/tr). Be sure to do this -step _before_ you start to configure nvi. - -When building the textutils set of programs, I suggest that you use the most -up-to-date C compiler available on your system (as described above). Also, -note that it will be important for you to AVOID using the -O (optimize) -compiler option when building the GNU textutils package, even if you are -using the most up-to-date version of gcc which shipped with your system. -If you try to use -O when building the textutils package on an x86 with -the Cygnus 94q4 C compiler, you will end up with a `tr' program which will -malfunction even worse than the one you are trying to replace! If you use --O when building the textutils package on LynxOS on the PowerPC (using the -Cygnus 95q2 C compiler) you will just get yourself a compiler crash. So -just don't use -O when building textutils. You can avoid using -O by in- -voking make in the textutils directory as follows: - - make CFLAGS="-g" - -(Note: At present, LynxOS version 2.4.0 is the latest officially released -version of LynxOS, and all of the above information is accurate and correct -for LynxOS 2.4.0 as of the time of this writing. However it is rumored that -the bug in the /bin/tr program will be fixed in future releases of LynxOS, -so if you have a version of LynxOS later than 2.4.0, you may wish to check -and see if your /bin/tr program even has the problematic bug before bothering -with all of this.) - - -3. Fix Your System Include Files ---------------------------------- - -If you are building nvi on a PowerPC system, it is also important that you -apply the patches given at the end of this file to your /usr/include files. -(Note that you will have to be root in order to do this.) Two of the patches -included below fix a pair of serious bugs in the /usr/include/stdarg.h file -on the PowerPC, and you really _do_ want to have these bugs fixed anyway, -because without these fixes, anything that you compile which uses -will very likely malfunction at run-time. - -Regardless of which LynxOS platform you are using (i.e. x86, PowerPC, Sparc, -or m680x0) you may want to apply all of the system include files patches that -are included below anyway. Doing so will clean up a few minor problems with -the relevant system include files (i.e. , , and ) -and this step will also prevent a few warnings which you would otherwise get -during the build of nvi. - -You can apply all of the patches given at the end of this file simply by -doing the following: - - su root - cd /usr/include - /bin/patch < this-file - -Where `this-file' is the actual full pathname of the file you are now reading, -wherever it may reside on your own system. - -(Note: At present, LynxOS version 2.4.0 is the latest officially released -version of LynxOS, and all of the above information is accurate and correct -for LynxOS 2.4.0 as of the time of this writing. However it is rumored that -future releases of LynxOS may incorporate some or all of the important system -include file fixes provided below. Thus, if you are building nvi for some -LynxOS version later than 2.4.0, you should probably go ahead and try to -apply the patches given below to your system include files, and then just -don't worry about it if these patches seem to have already been applied.) - - -4. A Brief Note about Sendmail -------------------------------- - -I should mention also that LynxOS does not normally ship with the `sendmail' -mail transfer program installed, either under /usr/lib/ or anywhere else for -that matter. This isn't really a big problem, but nvi normally wants and -expects to have a sendmail program available so that it can send users notifi- -cations (by mail) whenever a partially edited file is preserved by the editor -in response to a sudden system crash, a sudden system shutdown, or an unexpect- -ed serial-line hangup. You can configure and build nvi without any sendmail -program installed on your system, but you will get warnings about its absence -when you are doing the initial configure step prior to actually building nvi. -If you want to have a fully-functional nvi which does send out notification -messages (by mail) whenever partially edited files are preserved during a -serial line hangup or system crash, then you should get the BSD sendmail -sources (via ftp from ftp.cs.berkeley.edu), build and install sendmail, and -then reconfigure, rebuild, and reinstall nvi. - -Please contact me at the E-mail address below if you experience any problems in -building or using nvi on LynxOS. I make no guarrantees, but I may be willing -to try to help. - -Ron Guilmette -Roseville, California - -August 14, 1996 - - -cut here for LynxOS 2.4.0 system include files patches ------------------------------------------------------------------------------ -*** wait.h Fri Apr 26 10:02:45 1996 ---- wait.h Sun May 19 05:36:50 1996 -*************** -*** 94,104 **** - /* Function prototypes */ - #ifndef __LYNXOS -- #ifdef _POSIX_SOURCE - extern pid_t wait _AP((int *)); - extern pid_t waitpid _AP((pid_t, int *, int)); -! #else -! extern int wait _AP((union wait *)); -! extern int waitpid _AP((int, union wait *, int)); -! extern int wait3 _AP((union wait *, int, struct rusage *)); - #endif - #endif /* !__LYNXOS */ ---- 94,101 ---- - /* Function prototypes */ - #ifndef __LYNXOS - extern pid_t wait _AP((int *)); - extern pid_t waitpid _AP((pid_t, int *, int)); -! #ifndef _POSIX_SOURCE -! extern int wait3 _AP((int *, int, struct rusage *)); - #endif - #endif /* !__LYNXOS */ -*** ioctl.h Fri Apr 26 16:50:51 1996 ---- ioctl.h Sat May 18 17:55:16 1996 -*************** -*** 572,576 **** - - #ifndef __LYNXOS -! extern int ioctl _AP((int, int, char *)); - #endif - ---- 572,576 ---- - - #ifndef __LYNXOS -! extern int ioctl _AP((int, int, ...)); - #endif - -*** stdarg.h Fri Apr 26 16:51:02 1996 ---- stdarg.h Sat May 18 19:34:13 1996 -*************** -*** 88,92 **** - (((sizeof(TYPE) + sizeof(int) - 1) / sizeof(int)) * sizeof(int)) - -! #define va_start(AP, LASTARG) (AP = ((char *) __builtin_next_arg ())) - - void va_end(va_list); /* Defined in libgcc.a */ ---- 88,92 ---- - (((sizeof(TYPE) + sizeof(int) - 1) / sizeof(int)) * sizeof(int)) - -! #define va_start(AP, LASTARG) (AP = ((char *) __builtin_next_arg (LASTARG))) - - void va_end(va_list); /* Defined in libgcc.a */ -*************** -*** 162,166 **** - (((sizeof(TYPE) + sizeof(int) - 1) / sizeof(int)) * sizeof(int)) - -! #define va_start(AP, LASTARG) (AP = ((char *) __builtin_next_arg ())) - - void va_end(va_list); /* Defined in libgcc.a */ ---- 162,166 ---- - (((sizeof(TYPE) + sizeof(int) - 1) / sizeof(int)) * sizeof(int)) - -! #define va_start(AP, LASTARG) (AP = ((char *) __builtin_next_arg (LASTARG))) - - void va_end(va_list); /* Defined in libgcc.a */ diff --git a/build/acconfig.h b/build/acconfig.h deleted file mode 100644 index 567f9ee60070..000000000000 --- a/build/acconfig.h +++ /dev/null @@ -1,82 +0,0 @@ -/* @(#)acconfig.h 8.18 (Berkeley) 7/2/96 */ - -/* Define to `int' if doesn't define. */ -#undef ssize_t - -/* Define if you want a debugging version. */ -#undef DEBUG - -/* Define if you have a System V-style (broken) gettimeofday. */ -#undef HAVE_BROKEN_GETTIMEOFDAY - -/* Define if you have a Ultrix-style (broken) vdisable. */ -#undef HAVE_BROKEN_VDISABLE - -/* Define if you have a BSD version of curses. */ -#undef HAVE_BSD_CURSES - -/* Define if you have the curses(3) addnstr function. */ -#undef HAVE_CURSES_ADDNSTR - -/* Define if you have the curses(3) beep function. */ -#undef HAVE_CURSES_BEEP - -/* Define if you have the curses(3) flash function. */ -#undef HAVE_CURSES_FLASH - -/* Define if you have the curses(3) idlok function. */ -#undef HAVE_CURSES_IDLOK - -/* Define if you have the curses(3) keypad function. */ -#undef HAVE_CURSES_KEYPAD - -/* Define if you have the curses(3) newterm function. */ -#undef HAVE_CURSES_NEWTERM - -/* Define if you have the curses(3) setupterm function. */ -#undef HAVE_CURSES_SETUPTERM - -/* Define if you have the curses(3) tigetstr/tigetnum functions. */ -#undef HAVE_CURSES_TIGETSTR - -/* Define if you have the DB __hash_open call in the C library. */ -#undef HAVE_DB_HASH_OPEN - -/* Define if you have the chsize(2) system call. */ -#undef HAVE_FTRUNCATE_CHSIZE - -/* Define if you have the ftruncate(2) system call. */ -#undef HAVE_FTRUNCATE_FTRUNCATE - -/* Define if you have fcntl(2) style locking. */ -#undef HAVE_LOCK_FCNTL - -/* Define if you have flock(2) style locking. */ -#undef HAVE_LOCK_FLOCK - -/* Define if you want to compile in the Perl interpreter. */ -#undef HAVE_PERL_INTERP - -/* Define if your Perl is at least 5.003_01. */ -#undef HAVE_PERL_5_003_01 - -/* Define if you have the Berkeley style revoke(2) system call. */ -#undef HAVE_REVOKE - -/* Define if you have the Berkeley style strsep(3) function. */ -#undef HAVE_STRSEP - -/* Define if you have */ -#undef HAVE_SYS_MMAN_H - -/* Define if you have */ -#undef HAVE_SYS_SELECT_H - -/* Define if you have the System V style pty calls. */ -#undef HAVE_SYS5_PTY - -/* Define if you want to compile in the Tcl interpreter. */ -#undef HAVE_TCL_INTERP - -/* Define if your sprintf returns a pointer, not a length. */ -#undef SPRINTF_RET_CHARPNT diff --git a/build/aclocal.m4 b/build/aclocal.m4 deleted file mode 100644 index de7e57ed3aac..000000000000 --- a/build/aclocal.m4 +++ /dev/null @@ -1,17 +0,0 @@ -AC_DEFUN(AM_SANITY_CHECK_CC, -[dnl Derived from macros from Bruno Haible and from Cygnus. -AC_MSG_CHECKING([whether the compiler ($CC $CFLAGS $LDFLAGS) actually works]) -AC_LANG_SAVE - AC_LANG_C - AC_TRY_RUN([main() { exit(0); }], - am_cv_prog_cc_works=yes, am_cv_prog_cc_works=no, - dnl When crosscompiling, just try linking. - AC_TRY_LINK([], [], am_cv_prog_cc_works=yes, - am_cv_prog_cc_works=no)) -AC_LANG_RESTORE -case "$am_cv_prog_cc_works" in - *no) AC_MSG_ERROR([Installation or configuration problem: C compiler cannot create executables.]) ;; - *yes) ;; -esac -AC_MSG_RESULT(yes) -])dnl diff --git a/build/config.guess b/build/config.guess deleted file mode 100755 index 4c314d97aacb..000000000000 --- a/build/config.guess +++ /dev/null @@ -1,571 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc. -# -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Written by Per Bothner . -# The master version of this file is at the FSF in /home/gd/gnu/lib. -# -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. -# -# The plan is that this can be called by configure scripts if you -# don't specify an explicit system type (host/target name). -# -# Only a few systems have been added to this list; please add others -# (but try to keep the structure clean). -# - -# This is needed to find uname on a Pyramid OSx when run in the BSD universe. -# (ghazi@noc.rutgers.edu 8/24/94.) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then - PATH=$PATH:/.attbin ; export PATH -fi - -UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown -UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown -UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown -UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown - -trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15 - -# Note: order is significant - the case branches are not exclusive. - -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in - alpha:OSF1:V*:*) - # After 1.2, OSF1 uses "V1.3" for uname -r. - echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^V//'` - exit 0 ;; - alpha:OSF1:*:*) - # 1.2 uses "1.2" for uname -r. - echo alpha-dec-osf${UNAME_RELEASE} - exit 0 ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit 0 ;; - amiga:NetBSD:*:*) - echo m68k-cbm-netbsd${UNAME_RELEASE} - exit 0 ;; - arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} - exit 0;; - Pyramid*:OSx*:*:*) - if test "`(/bin/universe) 2>/dev/null`" = att ; then - echo pyramid-pyramid-sysv3 - else - echo pyramid-pyramid-bsd - fi - exit 0 ;; - sun4*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - i86pc:SunOS:5.*:*) - echo i386-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - sun4*:SunOS:6*:*) - # According to config.sub, this is the proper way to canonicalize - # SunOS6. Hard to guess exactly what SunOS6 will be like, but - # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` - exit 0 ;; - sun4*:SunOS:*:*) - case "`/usr/bin/arch -k`" in - Series*|S4*) - UNAME_RELEASE=`uname -v` - ;; - esac - # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` - exit 0 ;; - sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} - exit 0 ;; - atari*:NetBSD:*:*) - echo m68k-atari-netbsd${UNAME_RELEASE} - exit 0 ;; - sun3*:NetBSD:*:*) - echo m68k-sun-netbsd${UNAME_RELEASE} - exit 0 ;; - mac68k:NetBSD:*:*) - echo m68k-apple-netbsd${UNAME_RELEASE} - exit 0 ;; - RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} - exit 0 ;; - VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} - exit 0 ;; - mips:*:4*:UMIPS) - echo mips-mips-riscos4sysv - exit 0 ;; - mips:*:5*:RISCos) - echo mips-mips-riscos${UNAME_RELEASE} - exit 0 ;; - m88k:CX/UX:7*:*) - echo m88k-harris-cxux7 - exit 0 ;; - m88k:*:4*:R4*) - echo m88k-motorola-sysv4 - exit 0 ;; - m88k:*:3*:R3*) - echo m88k-motorola-sysv3 - exit 0 ;; - AViiON:dgux:*:*) - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \ - -o ${TARGET_BINARY_INTERFACE}x = x ] ; then - echo m88k-dg-dgux${UNAME_RELEASE} - else - echo m88k-dg-dguxbcs${UNAME_RELEASE} - fi - exit 0 ;; - M88*:DolphinOS:*:*) # DolphinOS (SVR3) - echo m88k-dolphin-sysv3 - exit 0 ;; - M88*:*:R3*:*) - # Delta 88k system running SVR3 - echo m88k-motorola-sysv3 - exit 0 ;; - XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) - echo m88k-tektronix-sysv3 - exit 0 ;; - Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) - echo m68k-tektronix-bsd - exit 0 ;; - *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` - exit 0 ;; - ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. - echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id - exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' - i?86:AIX:*:*) - echo i386-ibm-aix - exit 0 ;; - *:AIX:2:3) - if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - sed 's/^ //' << EOF >dummy.c - #include - - main() - { - if (!__power_pc()) - exit(1); - puts("powerpc-ibm-aix3.2.5"); - exit(0); - } -EOF - ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0 - rm -f dummy.c dummy - echo rs6000-ibm-aix3.2.5 - elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then - echo rs6000-ibm-aix3.2.4 - else - echo rs6000-ibm-aix3.2 - fi - exit 0 ;; - *:AIX:*:4) - if /usr/sbin/lsattr -EHl proc0 | grep POWER >/dev/null 2>&1; then - IBM_ARCH=rs6000 - else - IBM_ARCH=powerpc - fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` - else - IBM_REV=4.${UNAME_RELEASE} - fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} - exit 0 ;; - *:AIX:*:*) - echo rs6000-ibm-aix - exit 0 ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) - echo romp-ibm-bsd4.4 - exit 0 ;; - ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to - exit 0 ;; # report: romp-ibm BSD 4.3 - *:BOSX:*:*) - echo rs6000-bull-bosx - exit 0 ;; - DPX/2?00:B.O.S.:*:*) - echo m68k-bull-sysv3 - exit 0 ;; - 9000/[34]??:4.3bsd:1.*:*) - echo m68k-hp-bsd - exit 0 ;; - hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) - echo m68k-hp-bsd4.4 - exit 0 ;; - 9000/[3478]??:HP-UX:*:*) - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; - 9000/7?? | 9000/8?[79] ) HP_ARCH=hppa1.1 ;; - 9000/8?? ) HP_ARCH=hppa1.0 ;; - esac - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ${HP_ARCH}-hp-hpux${HPUX_REV} - exit 0 ;; - 3050*:HI-UX:*:*) - sed 's/^ //' << EOF >dummy.c - #include - int - main () - { - long cpu = sysconf (_SC_CPU_VERSION); - /* The order matters, because CPU_IS_HP_MC68K erroneously returns - true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct - results, however. */ - if (CPU_IS_PA_RISC (cpu)) - { - switch (cpu) - { - case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; - case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; - case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; - default: puts ("hppa-hitachi-hiuxwe2"); break; - } - } - else if (CPU_IS_HP_MC68K (cpu)) - puts ("m68k-hitachi-hiuxwe2"); - else puts ("unknown-hitachi-hiuxwe2"); - exit (0); - } -EOF - ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0 - rm -f dummy.c dummy - echo unknown-hitachi-hiuxwe2 - exit 0 ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) - echo hppa1.1-hp-bsd - exit 0 ;; - 9000/8??:4.3bsd:*:*) - echo hppa1.0-hp-bsd - exit 0 ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) - echo hppa1.1-hp-osf - exit 0 ;; - hp8??:OSF1:*:*) - echo hppa1.0-hp-osf - exit 0 ;; - parisc*:Lites*:*:*) - echo hppa1.1-hp-lites - exit 0 ;; - C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) - echo c1-convex-bsd - exit 0 ;; - C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit 0 ;; - C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) - echo c34-convex-bsd - exit 0 ;; - C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) - echo c38-convex-bsd - exit 0 ;; - C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) - echo c4-convex-bsd - exit 0 ;; - CRAY*X-MP:*:*:*) - echo xmp-cray-unicos - exit 0 ;; - CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} - exit 0 ;; - CRAY*C90:*:*:*) - echo c90-cray-unicos${UNAME_RELEASE} - exit 0 ;; - CRAY-2:*:*:*) - echo cray2-cray-unicos - exit 0 ;; - hp3[0-9][05]:NetBSD:*:*) - echo m68k-hp-netbsd${UNAME_RELEASE} - exit 0 ;; - i?86:BSD/386:*:* | *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} - exit 0 ;; - *:FreeBSD:*:*) - echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit 0 ;; - *:NetBSD:*:*) - echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` - exit 0 ;; - *:GNU:*:*) - echo `echo ${UNAME_MACHINE}|sed -e 's,/.*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` - exit 0 ;; - *:Linux:*:*) - # The BFD linker knows what the default object file format is, so - # first see if it will tell us. - ld_help_string=`ld --help 2>&1` - if echo $ld_help_string | grep >/dev/null 2>&1 "supported emulations: elf_i?86"; then - echo "${UNAME_MACHINE}-unknown-linux" ; exit 0 - elif echo $ld_help_string | grep >/dev/null 2>&1 "supported emulations: i?86linux"; then - echo "${UNAME_MACHINE}-unknown-linuxaout" ; exit 0 - elif echo $ld_help_string | grep >/dev/null 2>&1 "supported emulations: i?86coff"; then - echo "${UNAME_MACHINE}-unknown-linuxcoff" ; exit 0 - elif test "${UNAME_MACHINE}" = "alpha" ; then - echo alpha-unknown-linux ; exit 0 - else - # Either a pre-BFD a.out linker (linuxoldld) or one that does not give us - # useful --help. Gcc wants to distinguish between linuxoldld and linuxaout. - test ! -d /usr/lib/ldscripts/. \ - && echo "${UNAME_MACHINE}-unknown-linuxoldld" && exit 0 - # Determine whether the default compiler is a.out or elf - cat >dummy.c </dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0 - rm -f dummy.c dummy - fi ;; -# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions -# are messed up and put the nodename in both sysname and nodename. - i?86:DYNIX/ptx:4*:*) - echo i386-sequent-sysv4 - exit 0 ;; - i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*) - if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE} - else - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE} - fi - exit 0 ;; - i?86:*:3.2:*) - if test -f /usr/options/cb.name; then - UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then - UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` - (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 - echo ${UNAME_MACHINE}-unknown-sco$UNAME_REL - else - echo ${UNAME_MACHINE}-unknown-sysv32 - fi - exit 0 ;; - Intel:Mach:3*:*) - echo i386-unknown-mach3 - exit 0 ;; - paragon:*:*:*) - echo i860-intel-osf1 - exit 0 ;; - i860:*:4.*:*) # i860-SVR4 - if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 - else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 - fi - exit 0 ;; - mini*:CTIX:SYS*5:*) - # "miniframe" - echo m68010-convergent-sysv - exit 0 ;; - M680?0:*:R3V[567]*:*) - test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; - 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0) - uname -p 2>/dev/null | grep 86 >/dev/null \ - && echo i486-ncr-sysv4.3 && exit 0 ;; - 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) - uname -p 2>/dev/null | grep 86 >/dev/null \ - && echo i486-ncr-sysv4 && exit 0 ;; - m68*:LynxOS:2.*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - mc68*:UNIX_System_V:4.*:*) - echo m68k-atari-sysv4 - exit 0 ;; - i?86:LynxOS:2.*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - TSUNAMI:LynxOS:2.*:* | uSPARC2:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - PowerPC:LynxOS:2.*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} - exit 0 ;; - RM*:SINIX-*:*:*) - echo mips-sni-sysv4 - exit 0 ;; - *FTX*) - echo i860-stratus-sysv4 - exit 0 ;; - *:SINIX-*:*:*) - if uname -p 2>/dev/null >/dev/null ; then - UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 - else - echo ns32k-sni-sysv - fi - exit 0 ;; - mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} - exit 0 ;; -esac - -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - -cat >dummy.c < -# include -#endif -main () -{ -#if defined (sony) -#if defined (MIPSEB) - /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, - I don't know.... */ - printf ("mips-sony-bsd\n"); exit (0); -#else -#include - printf ("m68k-sony-newsos%s\n", -#ifdef NEWSOS4 - "4" -#else - "" -#endif - ); exit (0); -#endif -#endif - -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - -#if defined (NeXT) -#if !defined (__ARCHITECTURE__) -#define __ARCHITECTURE__ "m68k" -#endif - int version; - version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; - printf ("%s-next-nextstep%s\n", __ARCHITECTURE__, version==2 ? "2" : "3"); - exit (0); -#endif - -#if defined (MULTIMAX) || defined (n16) -#if defined (UMAXV) - printf ("ns32k-encore-sysv\n"); exit (0); -#else -#if defined (CMU) - printf ("ns32k-encore-mach\n"); exit (0); -#else - printf ("ns32k-encore-bsd\n"); exit (0); -#endif -#endif -#endif - -#if defined (__386BSD__) - printf ("i386-unknown-bsd\n"); exit (0); -#endif - -#if defined (sequent) -#if defined (i386) - printf ("i386-sequent-dynix\n"); exit (0); -#endif -#if defined (ns32000) - printf ("ns32k-sequent-dynix\n"); exit (0); -#endif -#endif - -#if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); - -#endif - -#if defined (vax) -#if !defined (ultrix) - printf ("vax-dec-bsd\n"); exit (0); -#else - printf ("vax-dec-ultrix\n"); exit (0); -#endif -#endif - -#if defined (alliant) && defined (i860) - printf ("i860-alliant-bsd\n"); exit (0); -#endif - - exit (1); -} -EOF - -${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy && rm dummy.c dummy && exit 0 -rm -f dummy.c dummy - -# Apollos put the system type in the environment. - -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } - -# Convex versions that predate uname can use getsysinfo(1) - -if [ -x /usr/convex/getsysinfo ] -then - case `getsysinfo -f cpu_type` in - c1*) - echo c1-convex-bsd - exit 0 ;; - c2*) - if getsysinfo -f scalar_acc - then echo c32-convex-bsd - else echo c2-convex-bsd - fi - exit 0 ;; - c34*) - echo c34-convex-bsd - exit 0 ;; - c38*) - echo c38-convex-bsd - exit 0 ;; - c4*) - echo c4-convex-bsd - exit 0 ;; - esac -fi - -#echo '(Unable to guess system type)' 1>&2 - -exit 1 diff --git a/build/config.h.in b/build/config.h.in deleted file mode 100644 index c87fcdd7f214..000000000000 --- a/build/config.h.in +++ /dev/null @@ -1,179 +0,0 @@ -/* config.h.in. Generated automatically from configure.in by autoheader. */ - -/* Define to empty if the keyword does not work. */ -#undef const - -/* Define if you have a working `mmap' system call. */ -#undef HAVE_MMAP - -/* Define if your struct stat has st_blksize. */ -#undef HAVE_ST_BLKSIZE - -/* Define if you have . */ -#undef HAVE_VFORK_H - -/* Define to `int' if doesn't define. */ -#undef mode_t - -/* Define to `long' if doesn't define. */ -#undef off_t - -/* Define to `int' if doesn't define. */ -#undef pid_t - -/* Define to `unsigned' if doesn't define. */ -#undef size_t - -/* Define if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Define if your declares struct tm. */ -#undef TM_IN_SYS_TIME - -/* Define vfork as fork if vfork does not work. */ -#undef vfork - -/* Define if your processor stores words with the most significant - byte first (like Motorola and SPARC, unlike Intel and VAX). */ -#undef WORDS_BIGENDIAN - -/* Define to `int' if doesn't define. */ -#undef ssize_t - -/* Define if you want a debugging version. */ -#undef DEBUG - -/* Define if you have a System V-style (broken) gettimeofday. */ -#undef HAVE_BROKEN_GETTIMEOFDAY - -/* Define if you have a Ultrix-style (broken) vdisable. */ -#undef HAVE_BROKEN_VDISABLE - -/* Define if you have a BSD version of curses. */ -#undef HAVE_BSD_CURSES - -/* Define if you have the curses(3) addnstr function. */ -#undef HAVE_CURSES_ADDNSTR - -/* Define if you have the curses(3) beep function. */ -#undef HAVE_CURSES_BEEP - -/* Define if you have the curses(3) flash function. */ -#undef HAVE_CURSES_FLASH - -/* Define if you have the curses(3) idlok function. */ -#undef HAVE_CURSES_IDLOK - -/* Define if you have the curses(3) keypad function. */ -#undef HAVE_CURSES_KEYPAD - -/* Define if you have the curses(3) newterm function. */ -#undef HAVE_CURSES_NEWTERM - -/* Define if you have the curses(3) setupterm function. */ -#undef HAVE_CURSES_SETUPTERM - -/* Define if you have the curses(3) tigetstr/tigetnum functions. */ -#undef HAVE_CURSES_TIGETSTR - -/* Define if you have the chsize(2) system call. */ -#undef HAVE_FTRUNCATE_CHSIZE - -/* Define if you have the ftruncate(2) system call. */ -#undef HAVE_FTRUNCATE_FTRUNCATE - -/* Define if you have fcntl(2) style locking. */ -#undef HAVE_LOCK_FCNTL - -/* Define if you have flock(2) style locking. */ -#undef HAVE_LOCK_FLOCK - -/* Define if you want to compile in the Perl interpreter. */ -#undef HAVE_PERL_INTERP - -/* Define if your Perl is at least 5.003_01. */ -#undef HAVE_PERL_5_003_01 - -/* Define if you have the Berkeley style revoke(2) system call. */ -#undef HAVE_REVOKE - -/* Define if you have */ -#undef HAVE_SYS_MMAN_H - -/* Define if you have */ -#undef HAVE_SYS_SELECT_H - -/* Define if you have the System V style pty calls. */ -#undef HAVE_SYS5_PTY - -/* Define if you want to compile in the Tcl interpreter. */ -#undef HAVE_TCL_INTERP - -/* Define if your sprintf returns a pointer, not a length. */ -#undef SPRINTF_RET_CHARPNT - -/* Define if you have the bsearch function. */ -#undef HAVE_BSEARCH - -/* Define if you have the gethostname function. */ -#undef HAVE_GETHOSTNAME - -/* Define if you have the getopt function. */ -#undef HAVE_GETOPT - -/* Define if you have the getpagesize function. */ -#undef HAVE_GETPAGESIZE - -/* Define if you have the memchr function. */ -#undef HAVE_MEMCHR - -/* Define if you have the memcpy function. */ -#undef HAVE_MEMCPY - -/* Define if you have the memmove function. */ -#undef HAVE_MEMMOVE - -/* Define if you have the memset function. */ -#undef HAVE_MEMSET - -/* Define if you have the mkstemp function. */ -#undef HAVE_MKSTEMP - -/* Define if you have the mmap function. */ -#undef HAVE_MMAP - -/* Define if you have the select function. */ -#undef HAVE_SELECT - -/* Define if you have the setenv function. */ -#undef HAVE_SETENV - -/* Define if you have the snprintf function. */ -#undef HAVE_SNPRINTF - -/* Define if you have the strdup function. */ -#undef HAVE_STRDUP - -/* Define if you have the strerror function. */ -#undef HAVE_STRERROR - -/* Define if you have the strpbrk function. */ -#undef HAVE_STRPBRK - -/* Define if you have the strsep function. */ -#undef HAVE_STRSEP - -/* Define if you have the strtol function. */ -#undef HAVE_STRTOL - -/* Define if you have the strtoul function. */ -#undef HAVE_STRTOUL - -/* Define if you have the unsetenv function. */ -#undef HAVE_UNSETENV - -/* Define if you have the valloc function. */ -#undef HAVE_VALLOC - -/* Define if you have the vsnprintf function. */ -#undef HAVE_VSNPRINTF diff --git a/build/config.sub b/build/config.sub deleted file mode 100755 index 43f086781962..000000000000 --- a/build/config.sub +++ /dev/null @@ -1,872 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script, version 1.1. -# Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc. -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# This file is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, -# Boston, MA 02111-1307, USA. - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# Configuration subroutine to validate and canonicalize a configuration type. -# Supply the specified configuration type as an argument. -# If it is invalid, we print an error message on stderr and exit with code 1. -# Otherwise, we print the canonical config type on stdout and succeed. - -# This file is supposed to be the same for all GNU packages -# and recognize all the CPU types, system types and aliases -# that are meaningful with *any* GNU software. -# Each package is responsible for reporting which valid configurations -# it does not support. The user should be able to distinguish -# a failure to support a valid configuration from a meaningless -# configuration. - -# The goal of this file is to map all the various variations of a given -# machine specification into a single specification in the form: -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# It is wrong to echo any other type of specification. - -if [ x$1 = x ] -then - echo Configuration name missing. 1>&2 - echo "Usage: $0 CPU-MFR-OPSYS" 1>&2 - echo "or $0 ALIAS" 1>&2 - echo where ALIAS is a recognized configuration type. 1>&2 - exit 1 -fi - -# First pass through any local machine types. -case $1 in - *local*) - echo $1 - exit 0 - ;; - *) - ;; -esac - -# Separate what the user gave into CPU-COMPANY and OS (if any). -basic_machine=`echo $1 | sed 's/-[^-]*$//'` -if [ $basic_machine != $1 ] -then os=`echo $1 | sed 's/.*-/-/'` -else os=; fi - -### Let's recognize common machines as not being operating systems so -### that things like config.sub decstation-3100 work. We also -### recognize some manufacturers as not being operating systems, so we -### can provide default operating systems below. -case $os in - -sun*os*) - # Prevent following clause from handling this invalid input. - ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp ) - os= - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco4) - os=-sco3.2v4 - basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'` - ;; - -sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'` - ;; - -sco3.2v[4-9]*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'` - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` - ;; -esac - -# Decode aliases for certain CPU-COMPANY combinations. -case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - tahoe | i[345]86 | i860 | m68k | m68000 | m88k | ns32k | arm \ - | arme[lb] | pyramid \ - | tron | a29k | 580 | i960 | h8300 | hppa1.0 | hppa1.1 \ - | alpha | we32k | ns16k | clipper | sparclite | i370 | sh \ - | powerpc | powerpcle | sparc64 | 1750a | dsp16xx | mips64 | mipsel \ - | pdp11 | mips64el | mips64orion | mips64orionel \ - | sparc) - basic_machine=$basic_machine-unknown - ;; - # Object if more than one company name word. - *-*-*) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - vax-* | tahoe-* | i[345]86-* | i860-* | m68k-* | m68000-* | m88k-* \ - | sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \ - | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* | power-* \ - | none-* | 580-* | cray2-* | h8300-* | i960-* | xmp-* | ymp-* \ - | hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \ - | pn-* | np1-* | xps100-* | clipper-* | orion-* | sparclite-* \ - | pdp11-* | sh-* | powerpc-* | powerpcle-* | sparc64-* | mips64-* | mipsel-* \ - | mips64el-* | mips64orion-* | mips64orionel-*) - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-cbm - ;; - amigados) - basic_machine=m68k-cbm - os=-amigados - ;; - amigaunix | amix) - basic_machine=m68k-cbm - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | ymp) - basic_machine=ymp-cray - os=-unicos - ;; - cray2) - basic_machine=cray2-cray - os=-unicos - ;; - crds | unos) - basic_machine=m68k-crds - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - os=-mvs - ;; -# I'm not sure what "Sysv32" means. Should this be sysv3.2? - i[345]86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'` - os=-sysv32 - ;; - i[345]86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'` - os=-sysv4 - ;; - i[345]86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'` - os=-sysv - ;; - i[345]86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'` - os=-solaris2 - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - mac | macintosh) - basic_machine=m68k-apple - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - miniframe) - basic_machine=m68000-convergent - ;; - mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - np1) - basic_machine=np1-gould - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 - ;; - pentium | p5 | p6) - # We don't have specific support for the Intel Pentium (p6) followon yet, so just call it a Pentium - basic_machine=i586-intel - ;; - pentium-* | p5-* | p6-*) - # We don't have specific support for the Intel Pentium (p6) followon yet, so just call it a Pentium - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - k5) - # We don't have specific support for AMD's K5 yet, so just call it a Pentium - basic_machine=i586-amd - ;; - nexen) - # We don't have specific support for Nexgen yet, so just call it a Pentium - basic_machine=i586-nexgen - ;; - pn) - basic_machine=pn-gould - ;; - power) basic_machine=rs6000-ibm - ;; - ppc) basic_machine=powerpc-unknown - ;; - ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown - ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 - ;; - spur) - basic_machine=spur-unknown - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - udi29k) - basic_machine=a29k-amd - os=-udi - ;; - ultra3) - basic_machine=a29k-nyu - os=-sym1 - ;; - vaxv) - basic_machine=vax-dec - os=-sysv - ;; - vms) - basic_machine=vax-dec - os=-vms - ;; - vxworks960) - basic_machine=i960-wrs - os=-vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=-vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=-vxworks - ;; - xmp) - basic_machine=xmp-cray - os=-unicos - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - none) - basic_machine=none-none - os=-none - ;; - -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - mips) - basic_machine=mips-mips - ;; - romp) - basic_machine=romp-ibm - ;; - rs6000) - basic_machine=rs6000-ibm - ;; - vax) - basic_machine=vax-dec - ;; - pdp11) - basic_machine=pdp11-dec - ;; - we32k) - basic_machine=we32k-att - ;; - sparc) - basic_machine=sparc-sun - ;; - cydra) - basic_machine=cydra-cydrome - ;; - orion) - basic_machine=orion-highlevel - ;; - orion105) - basic_machine=clipper-highlevel - ;; - *) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 - ;; -esac - -# Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` - ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` - ;; - *) - ;; -esac - -# Decode manufacturer-specific aliases for certain operating systems. - -if [ x"$os" != x"" ] -then -case $os in - # -solaris* is a basic system type, with this one exception. - -solaris1 | -solaris1.*) - os=`echo $os | sed -e 's|solaris1|sunos4|'` - ;; - -solaris) - os=-solaris2 - ;; - -unixware* | svr4*) - os=-sysv4 - ;; - -gnu/linux*) - os=`echo $os | sed -e 's|gnu/linux|linux|'` - ;; - # First accept the basic system types. - # The portable systems comes first. - # Each alternative MUST END IN A *, to match a version number. - # -sysv* is not here because it comes later, after sysvr4. - -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ - | -vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[345]* \ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ - | -amigados* | -msdos* | -newsos* | -unicos* | -aos* \ - | -nindy* | -vxworks* | -ebmon* | -hms* | -mvs* | -clix* \ - | -riscos* | -linux* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -netbsd* | -freebsd* | -riscix* \ - | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \ - | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ - | -udi* | -eabi* | -lites* ) - # Remember, each alternative MUST END IN *, to match a version number. - ;; - -aux*) - ;; - -sunos5*) - os=`echo $os | sed -e 's|sunos5|solaris2|'` - ;; - -sunos6*) - os=`echo $os | sed -e 's|sunos6|solaris3|'` - ;; - -osfrose*) - os=-osfrose - ;; - -osf*) - os=-osf - ;; - -utek*) - os=-bsd - ;; - -dynix*) - os=-bsd - ;; - -acis*) - os=-aos - ;; - -ctix* | -uts*) - os=-sysv - ;; - # Preserve the version number of sinix5. - -sinix5.*) - os=`echo $os | sed -e 's|sinix|sysv|'` - ;; - -sinix*) - os=-sysv4 - ;; - -triton*) - os=-sysv3 - ;; - -oss*) - os=-sysv3 - ;; - -svr4) - os=-sysv4 - ;; - -svr3) - os=-sysv3 - ;; - -sysvr4) - os=-sysv4 - ;; - # This must come after -sysvr4. - -sysv*) - ;; - -xenix) - os=-xenix - ;; - -none) - ;; - *) - # Get rid of the `-' at the beginning of $os. - os=`echo $os | sed 's/[^-]*-//'` - echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 - exit 1 - ;; -esac -else - -# Here we handle the default operating systems that come with various machines. -# The value should be what the vendor currently ships out the door with their -# machine or put another way, the most popular os provided with the machine. - -# Note that if you're going to try to match "-MANUFACTURER" here (say, -# "-sun"), then you have to tell the case statement up towards the top -# that MANUFACTURER isn't an operating system. Otherwise, code above -# will signal an error saying that MANUFACTURER isn't an operating -# system, and we'll never get to this point. - -case $basic_machine in - *-acorn) - os=-riscix1.2 - ;; - arm*-semi) - os=-aout - ;; - pdp11-*) - os=-none - ;; - *-dec | vax-*) - os=-ultrix4.2 - ;; - m68*-apollo) - os=-domain - ;; - i386-sun) - os=-sunos4.0.2 - ;; - m68000-sun) - os=-sunos3 - # This also exists in the configure program, but was not the - # default. - # os=-sunos4 - ;; - *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 - ;; - sparc-* | *-sun) - os=-sunos4.1.1 - ;; - *-ibm) - os=-aix - ;; - *-hp) - os=-hpux - ;; - *-hitachi) - os=-hiux - ;; - i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv - ;; - *-cbm) - os=-amigados - ;; - *-dg) - os=-dgux - ;; - *-dolphin) - os=-sysv3 - ;; - m68k-ccur) - os=-rtu - ;; - m88k-omron*) - os=-luna - ;; - *-sequent) - os=-ptx - ;; - *-crds) - os=-unos - ;; - *-ns) - os=-genix - ;; - i370-*) - os=-mvs - ;; - *-next) - os=-nextstep3 - ;; - *-gould) - os=-sysv - ;; - *-highlevel) - os=-bsd - ;; - *-encore) - os=-bsd - ;; - *-sgi) - os=-irix - ;; - *-siemens) - os=-sysv4 - ;; - *-masscomp) - os=-rtu - ;; - *) - os=-none - ;; -esac -fi - -# Here we handle the case where we know the os, and the CPU type, but not the -# manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) - case $os in - -riscix*) - vendor=acorn - ;; - -sunos*) - vendor=sun - ;; - -aix*) - vendor=ibm - ;; - -hpux*) - vendor=hp - ;; - -hiux*) - vendor=hitachi - ;; - -unos*) - vendor=crds - ;; - -dgux*) - vendor=dg - ;; - -luna*) - vendor=omron - ;; - -genix*) - vendor=ns - ;; - -mvs*) - vendor=ibm - ;; - -ptx*) - vendor=sequent - ;; - -vxworks*) - vendor=wrs - ;; - -aux*) - vendor=apple - ;; - esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` - ;; -esac - -echo $basic_machine$os diff --git a/build/configure b/build/configure deleted file mode 100755 index e2055d113ca8..000000000000 --- a/build/configure +++ /dev/null @@ -1,4446 +0,0 @@ -#! /bin/sh - -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.7 -# Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - -# Defaults: -ac_help= -ac_default_prefix=/usr/local -# Any additions from configure.in: -ac_help="$ac_help - --enable-debug Build a debugging version." -ac_help="$ac_help - --with-x use the X Window System" -ac_help="$ac_help - --enable-perlinterp Include a Perl interpreter in vi." -ac_help="$ac_help - --enable-tknvi Build a Tk/Tcl front-end for vi." -ac_help="$ac_help - --enable-tclinterp Include a Tk/Tcl interpreter in vi." -ac_help="$ac_help - --disable-curses DON'T use the nvi-provided curses routines." -ac_help="$ac_help - --disable-db DON'T use the nvi-provided DB routines." -ac_help="$ac_help - --disable-re DON'T use the nvi-provided RE routines." - -# Initialize some variables set by options. -# The variables have the same names as the options, with -# dashes changed to underlines. -build=NONE -cache_file=./config.cache -exec_prefix=NONE -host=NONE -no_create= -nonopt=NONE -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -target=NONE -verbose= -x_includes=NONE -x_libraries=NONE -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' -includedir='${prefix}/include' -oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' - -# Initialize some other variables. -subdirs= -MFLAGS= MAKEFLAGS= - -ac_prev= -for ac_option -do - - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" - ac_prev= - continue - fi - - case "$ac_option" in - -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case "$ac_option" in - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir="$ac_optarg" ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build="$ac_optarg" ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; - - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir="$ac_optarg" ;; - - -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; - - -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "enable_${ac_feature}='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he) - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat << EOF -Usage: configure [options] [host] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print \`checking...' messages - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [same as prefix] - --bindir=DIR user executables in DIR [EPREFIX/bin] - --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] - --libexecdir=DIR program executables in DIR [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data in DIR - [PREFIX/share] - --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data in DIR - [PREFIX/com] - --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] - --libdir=DIR object code libraries in DIR [EPREFIX/lib] - --includedir=DIR C header files in DIR [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] - --infodir=DIR info documentation in DIR [PREFIX/info] - --mandir=DIR man documentation in DIR [PREFIX/man] - --srcdir=DIR find the sources in DIR [configure dir or ..] - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM - run sed PROGRAM on installed program names -EOF - cat << EOF -Host type: - --build=BUILD configure for building on BUILD [BUILD=HOST] - --host=HOST configure for HOST [guessed] - --target=TARGET configure for TARGET [TARGET=HOST] -Features and packages: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR -EOF - if test -n "$ac_help"; then - echo "--enable and --with options recognized:$ac_help" - fi - exit 0 ;; - - -host | --host | --hos | --ho) - ac_prev=host ;; - -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir="$ac_optarg" ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir="$ac_optarg" ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir="$ac_optarg" ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir="$ac_optarg" ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - localstatedir="$ac_optarg" ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir="$ac_optarg" ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir="$ac_optarg" ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir="$ac_optarg" ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir="$ac_optarg" ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir="$ac_optarg" ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.7" - exit 0 ;; - - -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "with_${ac_package}='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; - - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } - ;; - - *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" - ;; - - esac -done - -if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>./config.log - -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 - -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg -do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; - esac -done - -# NLS nuisances. -# Only set LANG and LC_ALL to C if already set. -# These must not be set unconditionally because not all systems understand -# e.g. LANG=C (notably SCO). -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LANG+set}" = set; then LANG=C; export LANG; fi - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=../common/main.c - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } - fi -fi -srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` - -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - echo "loading cache $cache_file" - . $cache_file -else - echo "creating cache $cache_file" - > $cache_file -fi - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='echo $CPP $CPPFLAGS 1>&5; -$CPP $CPPFLAGS' -ac_compile='echo ${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5; -${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5 2>&5' -ac_link='echo ${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5; -${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5 2>&5' - -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - - - - -ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } -fi -ac_config_guess=$ac_aux_dir/config.guess -ac_config_sub=$ac_aux_dir/config.sub -ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# ./install, which can be erroneously created by make from ./install.sh. -echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -if test -z "$INSTALL"; then -if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - # Account for people who put trailing slashes in PATH elements. - case "$ac_dir/" in - /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - for ac_prog in ginstall installbsd scoinst install; do - if test -f $ac_dir/$ac_prog; then - if test $ac_prog = install && - grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - # OSF/1 installbsd also uses dspmsg, but is usable. - : - else - ac_cv_path_install="$ac_dir/$ac_prog -c" - break 2 - fi - fi - done - ;; - esac - done - IFS="$ac_save_ifs" - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL="$ac_cv_path_install" - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL="$ac_install_sh" - fi -fi -echo "$ac_t""$INSTALL" 1>&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - - -# Make sure we can run config.sub. -if $ac_config_sub sun4 >/dev/null 2>&1; then : -else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } -fi - -echo $ac_n "checking host system type""... $ac_c" 1>&6 - -host_alias=$host -case "$host_alias" in -NONE) - case $nonopt in - NONE) - if host_alias=`$ac_config_guess`; then : - else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; } - fi ;; - *) host_alias=$nonopt ;; - esac ;; -esac - -host=`$ac_config_sub $host_alias` -host_cpu=`echo $host | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\1/'` -host_vendor=`echo $host | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\2/'` -host_os=`echo $host | sed 's/^\(.*\)-\(.*\)-\(.*\)$/\3/'` -echo "$ac_t""$host" 1>&6 - -if test "$program_transform_name" = s,x,x,; then - program_transform_name= -else - # Double any \ or $. echo might interpret backslashes. - cat <<\EOF_SED > conftestsed -s,\\,\\\\,g; s,\$,$$,g -EOF_SED - program_transform_name="`echo $program_transform_name|sed -f conftestsed`" - rm -f conftestsed -fi -test "$program_prefix" != NONE && - program_transform_name="s,^,${program_prefix},; $program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" - -# sed with no file args requires a program. -test "$program_transform_name" = "" && program_transform_name="s,x,x," - - -echo $ac_n "checking if --enable-debug option specified""... $ac_c" 1>&6 -# Check whether --enable-debug or --disable-debug was given. -if test "${enable_debug+set}" = set; then - enableval="$enable_debug" - vi_cv_debug="yes" -else - vi_cv_debug="no" -fi - -if test "$vi_cv_debug" = yes; then - cat >> confdefs.h <<\EOF -#define DEBUG 1 -EOF - - OPTFLAG=${OPTFLAG-"-g"} - no_op_OPTFLAG=${no_op_OPTFLAG-"-g"} -fi -echo "$ac_t""$vi_cv_debug" 1>&6 - - - -case "$host_os" in -aix3.2.5) OPTFLAG=${OPTFLAG-"-O"};; -aix4.1*) CFLAGS=${CFLAGS-"-qstrict"} - OPTFLAG=${OPTFLAG-"-O3"};; -aux*) CPPFLAGS=${CPPFLAGS-"-ZP -D_BSD_SOURCE -D_SYSV_SOURCE -D_AUX_SOURCE"} - LDFLAGS=${LDFLAGS-"-ZP"} - OPTFLAG=${OPTFLAG-"-O"};; -bsd4.4) OPTFLAG=${OPTFLAG-"-O2"};; -bsdi*) CC=${CC-"shlicc"} - OPTFLAG=${OPTFLAG-"-O2"};; -irix6*) OPTFLAG=${OPTFLAG-"-O2"};; -irix*) OPTFLAG=${OPTFLAG-"-O2"};; -lynxos*) # Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_CC" && ac_cv_prog_CC="cc" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.c <&5 | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 -if test $ac_cv_prog_gcc = yes; then - GCC=yes - if test "${CFLAGS+set}" != set; then - echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_prog_gcc_g'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_gcc_g=yes -else - ac_cv_prog_gcc_g=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_prog_gcc_g" 1>&6 - if test $ac_cv_prog_gcc_g = yes; then - CFLAGS="-g -O" - else - CFLAGS="-O" - fi - fi -else - GCC= - test "${CFLAGS+set}" = set || CFLAGS="-g" -fi - - echo $ac_n "checking for GNU C (gcc) version 2.x""... $ac_c" 1>&6 - ac_cv_gcc_vers=`${CC-cc} -v 2>&1 | \ - grep "gcc version " | sed 's/.*version //'` - ac_cv_gcc_major=`echo "$ac_cv_gcc_vers" | sed 's/\..*//'` - if test "$ac_cv_gcc_major" = "2" ; then - echo "$ac_t""yes" 1>&6 - else - echo "$ac_t""no" 1>&6 - echo "Fatal error: Nvi requires gcc 2.x to build on LynxOS." - echo "See build/README.LynxOS for more information." - exit 1 - fi;; -nextstep3) CPPFLAGS=${CPPFLAGS-"-w -pipe -posix"} - LDFLAGS=${LDFLAGS-"-posix"} - OPTFLAG=${OPTFLAG-"-O9"};; -osf*) CFLAGS=${CFLAGS-"-Olimit 1000"};; -solaris*) no_op_OPTFLAG=${no_op_OPTFLAG-""};; -sunos*) no_op_OPTFLAG=${no_op_OPTFLAG-""};; -esac - - -CC=${CC-cc} - - -OPTFLAG=${OPTFLAG-"-O"} - - -no_op_OPTFLAG=${no_op_OPTFLAG-"$OPTFLAG"} - -case "$host_os" in -bsdi2.1) LIBS=${LIBS-"-lipc"};; -dgux*) LIBS=${LIBS-"-ldgc"};; -irix6*) LIBS=${LIBS-"-lbsd"};; -irix*) LIBS=${LIBS-"-lc_s -lbsd"};; -isc*) LIBS=${LIBS-"-lcposix -linet"};; -netbsd1*) LIBS=${LIBS-"-lcrypt"};; -ptx*) LIBS=${LIBS-"-lseq -linet -lsocket"};; -sco3.2*) LIBS=${LIBS-"-lsocket"};; -sinix*) LIBS=${LIBS-"-lelf -lc"};; -solaris*) LIBS=${LIBS-"-lsocket -lnsl -ldl"} - RLIBS=yes;; -wgs*) LIBS=${LIBS-"-lnsl"};; -esac - -case "$host_os" in -aux*) LIBOBJS="getopt.o strpbrk.o $LIBOBJS";; -esac - -case "$host_os" in -ultrix*) cat >> confdefs.h <<\EOF -#define HAVE_BROKEN_VDISABLE 1 -EOF -;; -esac - -CPPFLAGS="$ADDCPPFLAGS $CPPFLAGS" - -LDFLAGS="$ADDLDFLAGS $LDFLAGS" - -LIBS="$ADDLIBS $LIBS" - -# If we cannot run a trivial program, we must be cross compiling. -echo $ac_n "checking whether cross-compiling""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_c_cross'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - ac_cv_c_cross=yes -else -cat > conftest.$ac_ext </dev/null; then - ac_cv_c_cross=no -else - ac_cv_c_cross=yes -fi -fi -rm -fr conftest* -fi - -echo "$ac_t""$ac_cv_c_cross" 1>&6 -cross_compiling=$ac_cv_c_cross - -echo $ac_n "checking whether the compiler ($CC $CFLAGS $LDFLAGS) actually works""... $ac_c" 1>&6 - - ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='echo $CPP $CPPFLAGS 1>&5; -$CPP $CPPFLAGS' -ac_compile='echo ${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5; -${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5 2>&5' -ac_link='echo ${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5; -${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5 2>&5' - - if test "$cross_compiling" = yes; then - cat > conftest.$ac_ext < conftest.$ac_ext </dev/null; then - am_cv_prog_cc_works=yes -else - am_cv_prog_cc_works=no -fi -fi -rm -fr conftest* - -case "$am_cv_prog_cc_works" in - *no) { echo "configure: error: Installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } ;; - *yes) ;; -esac -echo "$ac_t""yes" 1>&6 - - -PATH="$PATH:/usr/bin:/usr/sbin:/sbin:/etc:/usr/etc:/usr/lib:/usr/ucblib:" - -# Extract the first word of "sh", so it can be a program name with args. -set dummy sh; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_path_vi_cv_path_shell'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$vi_cv_path_shell" in - /*) - ac_cv_path_vi_cv_path_shell="$vi_cv_path_shell" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_path_vi_cv_path_shell="$ac_dir/$ac_word" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_vi_cv_path_shell" && ac_cv_path_vi_cv_path_shell="no" - ;; -esac -fi -vi_cv_path_shell="$ac_cv_path_vi_cv_path_shell" -if test -n "$vi_cv_path_shell"; then - echo "$ac_t""$vi_cv_path_shell" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test "$vi_cv_path_shell" = no; then - echo "Fatal error: the shell utility not found." - exit 1 -fi - -# Extract the first word of "sendmail", so it can be a program name with args. -set dummy sendmail; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_path_vi_cv_path_sendmail'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$vi_cv_path_sendmail" in - /*) - ac_cv_path_vi_cv_path_sendmail="$vi_cv_path_sendmail" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_path_vi_cv_path_sendmail="$ac_dir/$ac_word" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_vi_cv_path_sendmail" && ac_cv_path_vi_cv_path_sendmail="no" - ;; -esac -fi -vi_cv_path_sendmail="$ac_cv_path_vi_cv_path_sendmail" -if test -n "$vi_cv_path_sendmail"; then - echo "$ac_t""$vi_cv_path_sendmail" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test "$vi_cv_path_sendmail" = no; then - echo "WARNING: The sendmail utility was not found!" - echo "WARNING: Users will not be told of saved files." -fi - - -for ac_prog in perl5 perl -do -# Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_path_vi_cv_path_perl'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$vi_cv_path_perl" in - /*) - ac_cv_path_vi_cv_path_perl="$vi_cv_path_perl" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_path_vi_cv_path_perl="$ac_dir/$ac_word" - break - fi - done - IFS="$ac_save_ifs" - ;; -esac -fi -vi_cv_path_perl="$ac_cv_path_vi_cv_path_perl" -if test -n "$vi_cv_path_perl"; then - echo "$ac_t""$vi_cv_path_perl" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -test -n "$vi_cv_path_perl" && break -done -test -n "$vi_cv_path_perl" || vi_cv_path_perl="no" - - - -echo $ac_n "checking for preserve directory""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'vi_cv_path_preserve'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - dirlist="/var/preserve /var/tmp /usr/tmp" - vi_cv_path_preserve=no - for i in $dirlist; do - if test -d $i/vi.recover; then - vi_cv_path_preserve=$i/vi.recover - break; - fi - done - if test "$vi_cv_path_preserve" = no; then - for i in $dirlist; do - if test -d $i -a -w $i; then - vi_cv_path_preserve=$i/vi.recover - break; - fi - done - - fi -fi - -if test "$vi_cv_path_preserve" = no; then - echo "Fatal error: no writeable preserve directory found." - exit 1 -fi -echo "$ac_t""$vi_cv_path_preserve" 1>&6 - -# Extract the first word of "chmod", so it can be a program name with args. -set dummy chmod; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_path_vi_cv_path_chmod'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$vi_cv_path_chmod" in - /*) - ac_cv_path_vi_cv_path_chmod="$vi_cv_path_chmod" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_path_vi_cv_path_chmod="$ac_dir/$ac_word" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_vi_cv_path_chmod" && ac_cv_path_vi_cv_path_chmod="missing_chmod" - ;; -esac -fi -vi_cv_path_chmod="$ac_cv_path_vi_cv_path_chmod" -if test -n "$vi_cv_path_chmod"; then - echo "$ac_t""$vi_cv_path_chmod" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -# Extract the first word of "cp", so it can be a program name with args. -set dummy cp; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_path_vi_cv_path_cp'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$vi_cv_path_cp" in - /*) - ac_cv_path_vi_cv_path_cp="$vi_cv_path_cp" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_path_vi_cv_path_cp="$ac_dir/$ac_word" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_vi_cv_path_cp" && ac_cv_path_vi_cv_path_cp="missing_cp" - ;; -esac -fi -vi_cv_path_cp="$ac_cv_path_vi_cv_path_cp" -if test -n "$vi_cv_path_cp"; then - echo "$ac_t""$vi_cv_path_cp" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -# Extract the first word of "ln", so it can be a program name with args. -set dummy ln; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_path_vi_cv_path_ln'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$vi_cv_path_ln" in - /*) - ac_cv_path_vi_cv_path_ln="$vi_cv_path_ln" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_path_vi_cv_path_ln="$ac_dir/$ac_word" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_vi_cv_path_ln" && ac_cv_path_vi_cv_path_ln="missing_ln" - ;; -esac -fi -vi_cv_path_ln="$ac_cv_path_vi_cv_path_ln" -if test -n "$vi_cv_path_ln"; then - echo "$ac_t""$vi_cv_path_ln" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -# Extract the first word of "mkdir", so it can be a program name with args. -set dummy mkdir; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_path_vi_cv_path_mkdir'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$vi_cv_path_mkdir" in - /*) - ac_cv_path_vi_cv_path_mkdir="$vi_cv_path_mkdir" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_path_vi_cv_path_mkdir="$ac_dir/$ac_word" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_vi_cv_path_mkdir" && ac_cv_path_vi_cv_path_mkdir="missing_mkdir" - ;; -esac -fi -vi_cv_path_mkdir="$ac_cv_path_vi_cv_path_mkdir" -if test -n "$vi_cv_path_mkdir"; then - echo "$ac_t""$vi_cv_path_mkdir" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -# Extract the first word of "rm", so it can be a program name with args. -set dummy rm; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_path_vi_cv_path_rm'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$vi_cv_path_rm" in - /*) - ac_cv_path_vi_cv_path_rm="$vi_cv_path_rm" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_path_vi_cv_path_rm="$ac_dir/$ac_word" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_vi_cv_path_rm" && ac_cv_path_vi_cv_path_rm="missing_rm" - ;; -esac -fi -vi_cv_path_rm="$ac_cv_path_vi_cv_path_rm" -if test -n "$vi_cv_path_rm"; then - echo "$ac_t""$vi_cv_path_rm" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -# Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_path_vi_cv_path_strip'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$vi_cv_path_strip" in - /*) - ac_cv_path_vi_cv_path_strip="$vi_cv_path_strip" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_path_vi_cv_path_strip="$ac_dir/$ac_word" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_vi_cv_path_strip" && ac_cv_path_vi_cv_path_strip="missing_strip" - ;; -esac -fi -vi_cv_path_strip="$ac_cv_path_vi_cv_path_strip" -if test -n "$vi_cv_path_strip"; then - echo "$ac_t""$vi_cv_path_strip" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then -if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # This must be in double quotes, not single quotes, because CPP may get - # substituted into the Makefile and "${CC-cc}" will confuse make. - CPP="${CC-cc} -E" - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. - cat > conftest.$ac_ext < -Syntax Error -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - rm -rf conftest* - CPP="${CC-cc} -E -traditional-cpp" - cat > conftest.$ac_ext < -Syntax Error -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - rm -rf conftest* - CPP=/lib/cpp -fi -rm -f conftest* -fi -rm -f conftest* - ac_cv_prog_CPP="$CPP" -fi - CPP="$ac_cv_prog_CPP" -else - ac_cv_prog_CPP="$CPP" -fi -echo "$ac_t""$CPP" 1>&6 - -# If we find X, set shell vars x_includes and x_libraries to the -# paths, otherwise set no_x=yes. -# Uses ac_ vars as temps to allow command line to override cache and checks. -# --without-x overrides everything else, but does not touch the cache. -echo $ac_n "checking for X""... $ac_c" 1>&6 - -# Check whether --with-x or --without-x was given. -if test "${with_x+set}" = set; then - withval="$with_x" - : -fi - -if test "x$with_x" = xno; then - no_x=yes -else - if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then - no_x= - else -if eval "test \"`echo '$''{'ac_cv_path_x'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # One or both of the vars are not set, and there is no cached value. -no_x=yes -rm -fr conftestdir -if mkdir conftestdir; then - cd conftestdir - # Make sure to not put "make" in the Imakefile rules, since we grep it out. - cat > Imakefile <<'EOF' -acfindx: - @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' -EOF - if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then - no_x= - # GNU make sometimes prints "make[1]: Entering...", which would confuse us. - eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` - # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. - for ac_extension in a so sl; do - if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && - test -f $ac_im_libdir/libX11.$ac_extension; then - ac_im_usrlibdir=$ac_im_libdir; break - fi - done - # Screen out bogus values from the imake configuration. - case "$ac_im_incroot" in - /usr/include) ;; - *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes="$ac_im_incroot" ;; - esac - case "$ac_im_usrlibdir" in - /usr/lib | /lib) ;; - *) test -d "$ac_im_usrlibdir" && ac_x_libraries="$ac_im_usrlibdir" ;; - esac - fi - cd .. - rm -fr conftestdir -fi - -if test "$no_x" = yes; then -test -z "$x_direct_test_library" && x_direct_test_library=Xt -test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc -test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h -cat > conftest.$ac_ext < -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - no_x= ac_x_includes= -else - echo "$ac_err" >&5 - rm -rf conftest* - for ac_dir in \ - /usr/X11R6/include \ - /usr/X11R5/include \ - /usr/X11R4/include \ - \ - /usr/include/X11R6 \ - /usr/include/X11R5 \ - /usr/include/X11R4 \ - \ - /usr/local/X11R6/include \ - /usr/local/X11R5/include \ - /usr/local/X11R4/include \ - \ - /usr/local/include/X11R6 \ - /usr/local/include/X11R5 \ - /usr/local/include/X11R4 \ - \ - /usr/X11/include \ - /usr/include/X11 \ - /usr/local/X11/include \ - /usr/local/include/X11 \ - \ - /usr/X386/include \ - /usr/x386/include \ - /usr/XFree86/include/X11 \ - \ - /usr/include \ - /usr/local/include \ - /usr/unsupported/include \ - /usr/athena/include \ - /usr/local/x11r5/include \ - /usr/lpp/Xamples/include \ - \ - /usr/openwin/include \ - /usr/openwin/share/include \ - ; \ - do - if test -r "$ac_dir/$x_direct_test_include"; then - no_x= ac_x_includes=$ac_dir - break - fi - done -fi -rm -f conftest* - -# Check for the libraries. -# See if we find them without any special options. -# Don't add to $LIBS permanently. -ac_save_LIBS="$LIBS" -LIBS="-l$x_direct_test_library $LIBS" -cat > conftest.$ac_ext <&6 -else - test "x$x_includes" = xNONE && x_includes=$ac_x_includes - test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries - ac_cv_path_x="no_x= ac_x_includes=$x_includes ac_x_libraries=$x_libraries" - echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6 -fi - - -if test "$no_x" != yes; then - if test "X$x_libraries" != "X"; then - if test "X$RLIBS" = "Xyes"; then - XLIBS="-R$x_libraries -L$x_libraries $XLIBS" - else - XLIBS="-L$x_libraries $XLIBS" - fi - fi - XLIBS="$XLIBS -lX11" - if test "X$x_includes" != "X"; then - XINCS="-I$x_includes" - fi -fi - - - -echo $ac_n "checking if --enable-perlinterp option specified""... $ac_c" 1>&6 -# Check whether --enable-perlinterp or --disable-perlinterp was given. -if test "${enable_perlinterp+set}" = set; then - enableval="$enable_perlinterp" - vi_cv_perlinterp="yes" -else - vi_cv_perlinterp="no" -fi - -echo "$ac_t""$vi_cv_perlinterp" 1>&6 -if test "$vi_cv_perlinterp" = "yes"; then - if test "$vi_cv_path_perl" = no; then - echo "Fatal error: no perl5 utility found." - exit 1 - fi - $vi_cv_path_perl -e 'require 5.002' || { - echo "Fatal error: perl5 must be version 5.002 or later." - exit 1 - } - $vi_cv_path_perl -e 'close(STDERR);require 5.003_01' && - cat >> confdefs.h <<\EOF -#define HAVE_PERL_5_003_01 1 -EOF - - - eval `$vi_cv_path_perl -V:shrpenv` - if test "X$shrpenv" = "XUNKNOWN"; then # pre 5.003_04 - shrpenv="" - fi - vi_cv_perllib=`$vi_cv_path_perl -MConfig -e 'print $Config{privlib}'` - perlcppflags=`$vi_cv_path_perl -Mlib=$srcdir -MExtUtils::Embed \ - -e 'ccflags;perl_inc'` - if test "X$perlcppflags" != "X"; then - CPPFLAGS="$perlcppflags $CPPFLAGS" - fi - perllibs=`cd $srcdir;$vi_cv_path_perl -MExtUtils::Embed \ - -e 'ldopts'` - if test "X$perllibs" != "X"; then - LIBS="$perllibs $LIBS" - fi - perlldflags=`cd $srcdir;$vi_cv_path_perl -MExtUtils::Embed \ - -e 'ccdlflags'` - if test "X$perlldflags" != "X"; then - LDFLAGS="$perlldflags $LDFLAGS" - fi - LIBOBJS="perl.o perlsfio.o $LIBOBJS" - cat >> confdefs.h <<\EOF -#define HAVE_PERL_INTERP 1 -EOF - -fi - - - -echo $ac_n "checking if --enable-tknvi option specified""... $ac_c" 1>&6 -# Check whether --enable-tknvi or --disable-tknvi was given. -if test "${enable_tknvi+set}" = set; then - enableval="$enable_tknvi" - vi_cv_tknvi="yes" -else - vi_cv_tknvi="no" -fi - -echo "$ac_t""$vi_cv_tknvi" 1>&6 -if test "$vi_cv_tknvi" = "yes"; then - tknvi=tknvi - TKLIBS="-ltk -ltcl -lm $XLIBS $LIBS" -fi - -echo $ac_n "checking if --enable-tclinterp option specified""... $ac_c" 1>&6 -# Check whether --enable-tclinterp or --disable-tclinterp was given. -if test "${enable_tclinterp+set}" = set; then - enableval="$enable_tclinterp" - vi_cv_tclinterp="yes" -else - vi_cv_tclinterp="no" -fi - -echo "$ac_t""$vi_cv_tclinterp" 1>&6 -if test "$vi_cv_tclinterp" = "yes"; then - LIBOBJS="tcl.o $LIBOBJS" - LIBS="-ltk -ltcl -lm $XLIBS $LIBS" - cat >> confdefs.h <<\EOF -#define HAVE_TCL_INTERP 1 -EOF - -fi - -if test "$vi_cv_tknvi" = "yes" || test "$vi_cv_tclinterp" = "yes"; then - echo $ac_n "checking for -ltcl""... $ac_c" 1>&6 -ac_lib_var=`echo tcl | tr '.-/+' '___p'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ltcl -ltk -lm $LIBS" -cat > conftest.$ac_ext <&6 - vi_cv_tkfatal="no" -else - echo "$ac_t""no" 1>&6 -vi_cv_tkfatal="yes" -fi - - if test "$vi_cv_tkfatal" = "yes"; then - echo "Fatal error: no Tk/Tcl library; see the section" - echo "ADDING LIBRARIES AND INCLUDE FILES in the README file." - exit 1 - fi -fi - -if test "$vi_cv_tclinterp" = yes || test "$vi_cv_perlinterp" = yes; then - LIBOBJS="api.o $LIBOBJS" -fi - -echo $ac_n "checking for -ltermlib""... $ac_c" 1>&6 -ac_lib_var=`echo termlib | tr '.-/+' '___p'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ltermlib $LIBS" -cat > conftest.$ac_ext <&6 - vi_cv_termlib=-ltermlib -else - echo "$ac_t""no" 1>&6 -vi_cv_termlib=no -fi - -if test "$vi_cv_termlib" = no; then - echo $ac_n "checking for -ltermcap""... $ac_c" 1>&6 -ac_lib_var=`echo termcap | tr '.-/+' '___p'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ltermcap $LIBS" -cat > conftest.$ac_ext <&6 - vi_cv_termlib=-ltermcap -else - echo "$ac_t""no" 1>&6 -vi_cv_termlib=no -fi - -fi -if test "$vi_cv_termlib" != no; then - LIBS="$vi_cv_termlib $LIBS" -fi - -echo $ac_n "checking if --disable-curses option specified""... $ac_c" 1>&6 -# Check whether --enable-curses or --disable-curses was given. -if test "${enable_curses+set}" = set; then - enableval="$enable_curses" - vi_cv_curses="other curses" -else - vi_cv_curses="bundled curses" -fi - -echo "$ac_t""$vi_cv_curses" 1>&6 -case "$vi_cv_curses" in -"bundled curses") - CPPFLAGS="-I\$(srcdir)/curses $CPPFLAGS" - cobjs="\$(COBJS)";; -"other curses") - LIBS="-lcurses $LIBS";; -esac - -echo $ac_n "checking for sys/mman.h""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'vi_cv_include_sys_mman'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - vi_cv_include_sys_mman=yes -else - echo "$ac_err" >&5 - rm -rf conftest* - vi_cv_include_sys_mman=no -fi -rm -f conftest* -fi - -if test "$vi_cv_include_sys_mman" = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_SYS_MMAN_H 1 -EOF - -fi -echo "$ac_t""$vi_cv_include_sys_mman" 1>&6 - -echo $ac_n "checking for sys/select.h""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'vi_cv_include_sys_select'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - vi_cv_include_sys_select=yes -else - echo "$ac_err" >&5 - rm -rf conftest* - vi_cv_include_sys_select=no -fi -rm -f conftest* -fi - -if test "$vi_cv_include_sys_select" = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_SYS_SELECT_H 1 -EOF - -fi -echo "$ac_t""$vi_cv_include_sys_select" 1>&6 - -echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -#include -#include -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - ac_cv_header_stdc=yes -else - echo "$ac_err" >&5 - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. -cat > conftest.$ac_ext < -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "memchr" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. -cat > conftest.$ac_ext < -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "free" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. -if test "$cross_compiling" = yes; then - : -else -cat > conftest.$ac_ext < -#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int main () { int i; for (i = 0; i < 256; i++) -if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); -exit (0); } - -EOF -eval $ac_link -if test -s conftest && (./conftest; exit) 2>/dev/null; then - : -else - ac_cv_header_stdc=no -fi -fi -rm -fr conftest* -fi -fi - -echo "$ac_t""$ac_cv_header_stdc" 1>&6 -if test $ac_cv_header_stdc = yes; then - cat >> confdefs.h <<\EOF -#define STDC_HEADERS 1 -EOF - -fi - -echo $ac_n "checking for ssize_t""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_type_ssize_t'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#if STDC_HEADERS -#include -#endif -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "ssize_t" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_type_ssize_t=yes -else - rm -rf conftest* - ac_cv_type_ssize_t=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_type_ssize_t" 1>&6 -if test $ac_cv_type_ssize_t = no; then - cat >> confdefs.h <<\EOF -#define ssize_t int -EOF - -fi - -echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_cv_c_bigendian=unknown -# See if sys/param.h defines the BYTE_ORDER macro. -cat > conftest.$ac_ext < -#include -int main() { return 0; } -int t() { - -#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN - bogus endian macros -#endif -; return 0; } -EOF -if eval $ac_compile; then - rm -rf conftest* - # It does; now see whether it defined to BIG_ENDIAN or not. -cat > conftest.$ac_ext < -#include -int main() { return 0; } -int t() { - -#if BYTE_ORDER != BIG_ENDIAN - not big endian -#endif -; return 0; } -EOF -if eval $ac_compile; then - rm -rf conftest* - ac_cv_c_bigendian=yes -else - rm -rf conftest* - ac_cv_c_bigendian=no -fi -rm -f conftest* - -fi -rm -f conftest* - -if test $ac_cv_c_bigendian = unknown; then -if test "$cross_compiling" = yes; then - { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } -else -cat > conftest.$ac_ext </dev/null; then - ac_cv_c_bigendian=no -else - ac_cv_c_bigendian=yes -fi -fi -rm -fr conftest* -fi -fi - -echo "$ac_t""$ac_cv_c_bigendian" 1>&6 -if test $ac_cv_c_bigendian = yes; then - cat >> confdefs.h <<\EOF -#define WORDS_BIGENDIAN 1 -EOF - -fi - -echo $ac_n "checking for working const""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <j = 5; -} -{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; -} - -; return 0; } -EOF -if eval $ac_compile; then - rm -rf conftest* - ac_cv_c_const=yes -else - rm -rf conftest* - ac_cv_c_const=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_c_const" 1>&6 -if test $ac_cv_c_const = no; then - cat >> confdefs.h <<\EOF -#define const -EOF - -fi - -echo $ac_n "checking for st_blksize in struct stat""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_struct_st_blksize'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -int main() { return 0; } -int t() { -struct stat s; s.st_blksize; -; return 0; } -EOF -if eval $ac_compile; then - rm -rf conftest* - ac_cv_struct_st_blksize=yes -else - rm -rf conftest* - ac_cv_struct_st_blksize=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_struct_st_blksize" 1>&6 -if test $ac_cv_struct_st_blksize = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_ST_BLKSIZE 1 -EOF - -fi - -echo $ac_n "checking for mode_t""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_type_mode_t'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#if STDC_HEADERS -#include -#endif -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "mode_t" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_type_mode_t=yes -else - rm -rf conftest* - ac_cv_type_mode_t=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_type_mode_t" 1>&6 -if test $ac_cv_type_mode_t = no; then - cat >> confdefs.h <<\EOF -#define mode_t int -EOF - -fi - -echo $ac_n "checking for off_t""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#if STDC_HEADERS -#include -#endif -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "off_t" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_type_off_t=yes -else - rm -rf conftest* - ac_cv_type_off_t=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_type_off_t" 1>&6 -if test $ac_cv_type_off_t = no; then - cat >> confdefs.h <<\EOF -#define off_t long -EOF - -fi - -echo $ac_n "checking for pid_t""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#if STDC_HEADERS -#include -#endif -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "pid_t" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_type_pid_t=yes -else - rm -rf conftest* - ac_cv_type_pid_t=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_type_pid_t" 1>&6 -if test $ac_cv_type_pid_t = no; then - cat >> confdefs.h <<\EOF -#define pid_t int -EOF - -fi - -echo $ac_n "checking for size_t""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#if STDC_HEADERS -#include -#endif -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "size_t" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_type_size_t=yes -else - rm -rf conftest* - ac_cv_type_size_t=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_type_size_t" 1>&6 -if test $ac_cv_type_size_t = no; then - cat >> confdefs.h <<\EOF -#define size_t unsigned -EOF - -fi - -echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -int main() { return 0; } -int t() { -struct tm *tp; tp->tm_sec; -; return 0; } -EOF -if eval $ac_compile; then - rm -rf conftest* - ac_cv_struct_tm=time.h -else - rm -rf conftest* - ac_cv_struct_tm=sys/time.h -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_struct_tm" 1>&6 -if test $ac_cv_struct_tm = sys/time.h; then - cat >> confdefs.h <<\EOF -#define TM_IN_SYS_TIME 1 -EOF - -fi - - - for ac_func in bsearch gethostname getopt memchr memcpy memmove memset -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -char $ac_func(); - -int main() { return 0; } -int t() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -fi -done - -for ac_func in bsearch gethostname getopt memchr memcpy memmove memset -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -char $ac_func(); - -int main() { return 0; } -int t() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - : -else - echo "$ac_t""no" 1>&6 -LIBOBJS="$LIBOBJS ${ac_func}.o" -fi - -done - - for ac_func in mkstemp mmap snprintf strdup strerror strpbrk strtol -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -char $ac_func(); - -int main() { return 0; } -int t() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -fi -done - -for ac_func in mkstemp mmap snprintf strdup strerror strpbrk strtol -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -char $ac_func(); - -int main() { return 0; } -int t() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - : -else - echo "$ac_t""no" 1>&6 -LIBOBJS="$LIBOBJS ${ac_func}.o" -fi - -done - - for ac_func in strtoul vsnprintf -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -char $ac_func(); - -int main() { return 0; } -int t() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -fi -done - -for ac_func in strtoul vsnprintf -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -char $ac_func(); - -int main() { return 0; } -int t() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - : -else - echo "$ac_t""no" 1>&6 -LIBOBJS="$LIBOBJS ${ac_func}.o" -fi - -done - - -for ac_func in select -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -char $ac_func(); - -int main() { return 0; } -int t() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -fi -done - -for ac_func in setenv -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -char $ac_func(); - -int main() { return 0; } -int t() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -need_env=yes -fi -done - -for ac_func in strsep -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -char $ac_func(); - -int main() { return 0; } -int t() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -need_strsep=yes -fi -done - -for ac_func in unsetenv -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -char $ac_func(); - -int main() { return 0; } -int t() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -need_env=yes -fi -done - - -for ac_func in valloc getpagesize -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -char $ac_func(); - -int main() { return 0; } -int t() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <&6 -fi -done - -echo $ac_n "checking for working mmap""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_mmap'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - ac_cv_func_mmap=no -else -cat > conftest.$ac_ext < -#include -#include - -#ifndef HAVE_GETPAGESIZE -# include -# ifdef EXEC_PAGESIZE -# define getpagesize() EXEC_PAGESIZE -# else -# ifdef NBPG -# define getpagesize() NBPG * CLSIZE -# ifndef CLSIZE -# define CLSIZE 1 -# endif -# else -# ifdef NBPC -# define getpagesize() NBPC -# else -# define getpagesize() PAGESIZE /* SVR4 */ -# endif -# endif -# endif -#endif - -#ifndef HAVE_VALLOC -# define valloc malloc -#endif - -#ifdef __cplusplus -extern "C" { void *valloc(unsigned), *malloc(unsigned); } -#else -char *valloc(), *malloc(); -#endif - -int -main() -{ - char *buf1, *buf2, *buf3; - int i = getpagesize(), j; - int i2 = i * 2; - int fd; - - buf1 = (char *)valloc(i2); - buf2 = (char *)valloc(i); - buf3 = (char *)malloc(i2); - for (j = 0; j < i2; ++j) - *(buf1 + j) = rand(); - fd = open("conftestmmap", O_CREAT | O_RDWR, 0666); - write(fd, buf1, i2); - mmap(buf2, i, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_PRIVATE, fd, 0); - for (j = 0; j < i; ++j) - if (*(buf1 + j) != *(buf2 + j)) - exit(1); - lseek(fd, (long)i, 0); - read(fd, buf2, i); /* read into mapped memory -- file should not change */ - /* (it does in i386 SVR4.0 - Jim Avera, jima@netcom.com) */ - lseek(fd, (long)0, 0); - read(fd, buf3, i2); - for (j = 0; j < i2; ++j) - if (*(buf1 + j) != *(buf3 + j)) - exit(1); - exit(0); -} - -EOF -eval $ac_link -if test -s conftest && (./conftest; exit) 2>/dev/null; then - ac_cv_func_mmap=yes -else - ac_cv_func_mmap=no -fi -fi -rm -fr conftest* -fi - -echo "$ac_t""$ac_cv_func_mmap" 1>&6 -if test $ac_cv_func_mmap = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_MMAP 1 -EOF - -fi - -ac_safe=`echo "vfork.h" | tr './\055' '___'` -echo $ac_n "checking for vfork.h""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -EOF -eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -ac_err=`grep -v '^ *+' conftest.out` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <<\EOF -#define HAVE_VFORK_H 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi - -echo $ac_n "checking for working vfork""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_vfork'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - echo $ac_n "checking for vfork""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'ac_cv_func_vfork'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -/* Override any gcc2 internal prototype to avoid an error. */ -char vfork(); - -int main() { return 0; } -int t() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_vfork) || defined (__stub___vfork) -choke me -#else -vfork(); -#endif - -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - eval "ac_cv_func_vfork=yes" -else - rm -rf conftest* - eval "ac_cv_func_vfork=no" -fi -rm -f conftest* - -fi -if eval "test \"`echo '$ac_cv_func_'vfork`\" = yes"; then - echo "$ac_t""yes" 1>&6 - : -else - echo "$ac_t""no" 1>&6 -fi - -else -cat > conftest.$ac_ext < -#include -#include -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_VFORK_H -#include -#endif -/* On some sparc systems, changes by the child to local and incoming - argument registers are propagated back to the parent. - The compiler is told about this with #include , - but some compilers (e.g. gcc -O) don't grok . - Test for this by using a static variable whose address - is put into a register that is clobbered by the vfork. */ -static -#ifdef __cplusplus -sparc_address_test (int arg) -#else -sparc_address_test (arg) int arg; -#endif -{ - static pid_t child; - if (!child) { - child = vfork (); - if (child < 0) - perror ("vfork"); - if (!child) { - arg = getpid(); - write(-1, "", 0); - _exit (arg); - } - } -} -main() { - pid_t parent = getpid (); - pid_t child; - - sparc_address_test (); - - child = vfork (); - - if (child == 0) { - /* Here is another test for sparc vfork register problems. - This test uses lots of local variables, at least - as many local variables as main has allocated so far - including compiler temporaries. 4 locals are enough for - gcc 1.40.3 on a Solaris 4.1.3 sparc, but we use 8 to be safe. - A buggy compiler should reuse the register of parent - for one of the local variables, since it will think that - parent can't possibly be used any more in this routine. - Assigning to the local variable will thus munge parent - in the parent process. */ - pid_t - p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), - p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); - /* Convince the compiler that p..p7 are live; otherwise, it might - use the same hardware register for all 8 local variables. */ - if (p != p1 || p != p2 || p != p3 || p != p4 - || p != p5 || p != p6 || p != p7) - _exit(1); - - /* On some systems (e.g. IRIX 3.3), - vfork doesn't separate parent from child file descriptors. - If the child closes a descriptor before it execs or exits, - this munges the parent's descriptor as well. - Test for this by closing stdout in the child. */ - _exit(close(fileno(stdout)) != 0); - } else { - int status; - struct stat st; - - while (wait(&status) != child) - ; - exit( - /* Was there some problem with vforking? */ - child < 0 - - /* Did the child fail? (This shouldn't happen.) */ - || status - - /* Did the vfork/compiler bug occur? */ - || parent != getpid() - - /* Did the file descriptor bug occur? */ - || fstat(fileno(stdout), &st) != 0 - ); - } -} -EOF -eval $ac_link -if test -s conftest && (./conftest; exit) 2>/dev/null; then - ac_cv_func_vfork=yes -else - ac_cv_func_vfork=no -fi -fi -rm -fr conftest* -fi - -echo "$ac_t""$ac_cv_func_vfork" 1>&6 -if test $ac_cv_func_vfork = no; then - cat >> confdefs.h <<\EOF -#define vfork fork -EOF - -fi - - -if test "$need_env" = yes; then - LIBOBJS="env.o $LIBOBJS" -fi - -if test "$need_strsep" = yes; then - LIBOBJS="strsep.o $LIBOBJS" -fi - -echo $ac_n "checking for fcntl/flock""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'vi_cv_lock'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - vi_cv_lock=none - case "$host_os" in - dgux*);; - irix*);; - *) - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -flock(0, 0); -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - vi_cv_lock=flock -fi -rm -f conftest* -;; - esac - if test "$vi_cv_lock" = none; then - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -fcntl(0, F_SETLK, 0); -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - vi_cv_lock=fcntl -fi -rm -f conftest* - - fi -fi - - -if test "$vi_cv_lock" = flock; then - cat >> confdefs.h <<\EOF -#define HAVE_LOCK_FLOCK 1 -EOF - -fi -if test "$vi_cv_lock" = fcntl; then - cat >> confdefs.h <<\EOF -#define HAVE_LOCK_FCNTL 1 -EOF - -fi -echo "$ac_t""$vi_cv_lock" 1>&6 - -echo $ac_n "checking for ftruncate/chsize""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'vi_cv_ftruncate'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -ftruncate(0, 0); -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - vi_cv_ftruncate=ftruncate -else - rm -rf conftest* - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -chsize(0, 0); -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - vi_cv_ftruncate=chsize -else - rm -rf conftest* - vi_cv_ftruncate=no -fi -rm -f conftest* - -fi -rm -f conftest* - -fi - -if test "$vi_cv_ftruncate" = ftruncate; then - cat >> confdefs.h <<\EOF -#define HAVE_FTRUNCATE_FTRUNCATE 1 -EOF - -fi -if test "$vi_cv_ftruncate" = chsize; then - cat >> confdefs.h <<\EOF -#define HAVE_FTRUNCATE_CHSIZE 1 -EOF - -fi -if test "$vi_cv_ftruncate" = no; then - echo - echo "Fatal error: no file truncation system call." - exit 1 -fi -echo "$ac_t""$vi_cv_ftruncate" 1>&6 - -echo $ac_n "checking for tigetstr/tigetnum""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'vi_cv_have_curses_tigetstr'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -tigetstr(0); -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - vi_cv_have_curses_tigetstr=yes -else - rm -rf conftest* - vi_cv_have_curses_tigetstr=no -fi -rm -f conftest* - -fi - -if test "$vi_cv_have_curses_tigetstr" = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_CURSES_TIGETSTR 1 -EOF - -fi -echo "$ac_t""$vi_cv_have_curses_tigetstr" 1>&6 - -if test "$vi_cv_curses" = "bundled curses"; then - cat >> confdefs.h <<\EOF -#define HAVE_BSD_CURSES 1 -EOF - - cat >> confdefs.h <<\EOF -#define HAVE_CURSES_ADDNSTR 1 -EOF - - cat >> confdefs.h <<\EOF -#define HAVE_CURSES_IDLOK 1 -EOF - -else - echo $ac_n "checking for addnstr""... $ac_c" 1>&6 - if eval "test \"`echo '$''{'vi_cv_have_curses_addnstr'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -addnstr(0, 0); -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - vi_cv_have_curses_addnstr=yes -else - rm -rf conftest* - vi_cv_have_curses_addnstr=no -fi -rm -f conftest* - -fi - - if test "$vi_cv_have_curses_addnstr" = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_CURSES_ADDNSTR 1 -EOF - - fi - echo "$ac_t""$vi_cv_have_curses_addnstr" 1>&6 - - echo $ac_n "checking for beep""... $ac_c" 1>&6 - if eval "test \"`echo '$''{'vi_cv_have_curses_beep'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -beep(); -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - vi_cv_have_curses_beep=yes -else - rm -rf conftest* - vi_cv_have_curses_beep=no -fi -rm -f conftest* - -fi - - if test "$vi_cv_have_curses_beep" = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_CURSES_BEEP 1 -EOF - - fi - echo "$ac_t""$vi_cv_have_curses_beep" 1>&6 - - echo $ac_n "checking for flash""... $ac_c" 1>&6 - if eval "test \"`echo '$''{'vi_cv_have_curses_flash'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -flash(); -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - vi_cv_have_curses_flash=yes -else - rm -rf conftest* - vi_cv_have_curses_flash=no -fi -rm -f conftest* - -fi - - if test "$vi_cv_have_curses_flash" = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_CURSES_FLASH 1 -EOF - - fi - echo "$ac_t""$vi_cv_have_curses_flash" 1>&6 - - echo $ac_n "checking for idlok""... $ac_c" 1>&6 - if eval "test \"`echo '$''{'vi_cv_have_curses_idlok'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -idlok(0, 0); -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - vi_cv_have_curses_idlok=yes -else - rm -rf conftest* - vi_cv_have_curses_idlok=no -fi -rm -f conftest* - -fi - - if test "$vi_cv_have_curses_idlok" = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_CURSES_IDLOK 1 -EOF - - fi - echo "$ac_t""$vi_cv_have_curses_idlok" 1>&6 - - echo $ac_n "checking for keypad""... $ac_c" 1>&6 - if eval "test \"`echo '$''{'vi_cv_have_curses_keypad'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -keypad(0, 0); -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - vi_cv_have_curses_keypad=yes -else - rm -rf conftest* - vi_cv_have_curses_keypad=no -fi -rm -f conftest* - -fi - - if test "$vi_cv_have_curses_keypad" = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_CURSES_KEYPAD 1 -EOF - - fi - echo "$ac_t""$vi_cv_have_curses_keypad" 1>&6 - - echo $ac_n "checking for newterm""... $ac_c" 1>&6 - if eval "test \"`echo '$''{'vi_cv_have_curses_newterm'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -newterm(0, 0, 0); -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - vi_cv_have_curses_newterm=yes -else - rm -rf conftest* - vi_cv_have_curses_newterm=no -fi -rm -f conftest* - -fi - - if test "$vi_cv_have_curses_newterm" = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_CURSES_NEWTERM 1 -EOF - - fi - echo "$ac_t""$vi_cv_have_curses_newterm" 1>&6 - - if test "$vi_cv_have_curses_newterm" = no; then - cat >> confdefs.h <<\EOF -#define HAVE_BSD_CURSES 1 -EOF - - fi -fi - -echo $ac_n "checking for setupterm""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'vi_cv_have_curses_setupterm'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -setupterm(0, 0, 0); -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - vi_cv_have_curses_setupterm=yes -else - rm -rf conftest* - vi_cv_have_curses_setupterm=no -fi -rm -f conftest* - -fi - -if test "$vi_cv_have_curses_setupterm" = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_CURSES_SETUPTERM 1 -EOF - -fi -echo "$ac_t""$vi_cv_have_curses_setupterm" 1>&6 - -echo $ac_n "checking for broken gettimeofday system call""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'vi_cv_gettimeofday'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -#include -int main() { return 0; } -int t() { -gettimeofday(0, 0); -; return 0; } -EOF -if eval $ac_link; then - rm -rf conftest* - vi_cv_gettimeofday=okay -else - rm -rf conftest* - vi_cv_gettimeofday=broken -fi -rm -f conftest* - -fi - -if test "$vi_cv_gettimeofday" = broken; then - cat >> confdefs.h <<\EOF -#define HAVE_BROKEN_GETTIMEOFDAY 1 -EOF - -fi -echo "$ac_t""$vi_cv_gettimeofday" 1>&6 - -echo $ac_n "checking for System V pty calls""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'vi_cv_sys5_pty'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <> confdefs.h <<\EOF -#define HAVE_SYS5_PTY 1 -EOF - -fi -echo "$ac_t""$vi_cv_sys5_pty" 1>&6 - -echo $ac_n "checking for revoke system call""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'vi_cv_revoke'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <> confdefs.h <<\EOF -#define HAVE_REVOKE 1 -EOF - -fi -echo "$ac_t""$vi_cv_revoke" 1>&6 - -echo $ac_n "checking for int type sprintf return value""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'vi_cv_sprintf_count'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } -else -cat > conftest.$ac_ext </dev/null; then - vi_cv_sprintf_count=yes -else - vi_cv_sprintf_count=no -fi -fi -rm -fr conftest* -fi - -if test "$vi_cv_sprintf_count" = no; then - cat >> confdefs.h <<\EOF -#define SPRINTF_RET_CHARPNT 1 -EOF - -fi -echo "$ac_t""$vi_cv_sprintf_count" 1>&6 - -echo $ac_n "checking if --disable-db option specified""... $ac_c" 1>&6 -# Check whether --enable-db or --disable-db was given. -if test "${enable_db+set}" = set; then - enableval="$enable_db" - vi_cv_db_lib="other DB" -else - vi_cv_db_lib="bundled DB" -fi - -echo "$ac_t""$vi_cv_db_lib" 1>&6 -case "$vi_cv_db_lib" in -"bundled DB") - CPPFLAGS="-I\$(srcdir)/db/include $CPPFLAGS" - LIBOBJS="\$(DBOBJS) $LIBOBJS";; -"other DB") - ;; -esac - -echo $ac_n "checking if --disable-re option specified""... $ac_c" 1>&6 -# Check whether --enable-re or --disable-re was given. -if test "${enable_re+set}" = set; then - enableval="$enable_re" - vi_cv_re_lib="other RE" -else - vi_cv_re_lib="bundled RE" -fi - -echo "$ac_t""$vi_cv_re_lib" 1>&6 -case "$vi_cv_re_lib" in -"bundled RE") - CPPFLAGS="-I\$(srcdir)/regex $CPPFLAGS" - LIBOBJS="\$(REOBJS) $LIBOBJS";; -"other RE") - ;; -esac - - -echo $ac_n "checking for u_char""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'vi_cv_uchar'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -u_char foo; -; return 0; } -EOF -if eval $ac_compile; then - rm -rf conftest* - vi_cv_uchar=yes -else - rm -rf conftest* - vi_cv_uchar=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$vi_cv_uchar" 1>&6 -if test "$vi_cv_uchar" = no; then - u_char_decl="typedef unsigned char u_char;" -fi - - -echo $ac_n "checking for u_short""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'vi_cv_ushort'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -u_short foo; -; return 0; } -EOF -if eval $ac_compile; then - rm -rf conftest* - vi_cv_ushort=yes -else - rm -rf conftest* - vi_cv_ushort=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$vi_cv_ushort" 1>&6 -if test "$vi_cv_ushort" = no; then - u_short_decl="typedef unsigned short u_short;" -fi - - -echo $ac_n "checking for u_int""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'vi_cv_uint'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -u_int foo; -; return 0; } -EOF -if eval $ac_compile; then - rm -rf conftest* - vi_cv_uint=yes -else - rm -rf conftest* - vi_cv_uint=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$vi_cv_uint" 1>&6 -if test "$vi_cv_uint" = no; then - u_int_decl="typedef unsigned int u_int;" -fi - - -echo $ac_n "checking for u_long""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'vi_cv_ulong'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -u_long foo; -; return 0; } -EOF -if eval $ac_compile; then - rm -rf conftest* - vi_cv_ulong=yes -else - rm -rf conftest* - vi_cv_ulong=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$vi_cv_ulong" 1>&6 -if test "$vi_cv_ulong" = no; then - u_long_decl="typedef unsigned long u_long;" -fi - - -echo $ac_n "checking for u_int8_t""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'vi_cv_uint8'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -u_int8_t foo; -; return 0; } -EOF -if eval $ac_compile; then - rm -rf conftest* - vi_cv_uint8=yes -else - rm -rf conftest* - if test "$cross_compiling" = yes; then - { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } -else -cat > conftest.$ac_ext </dev/null; then - vi_cv_uint8="unsigned char" -else - vi_cv_uint8=no -fi -fi -rm -fr conftest* -fi -rm -f conftest* - -fi - -echo "$ac_t""$vi_cv_uint8" 1>&6 -if test "$vi_cv_uint8" = no; then - echo - echo "Fatal error: no unsigned, 8-bit integral type." - exit 1 -fi -if test "$vi_cv_uint8" != yes; then - u_int8_decl="typedef $vi_cv_uint8 u_int8_t;" -fi - - -echo $ac_n "checking for u_int16_t""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'vi_cv_uint16'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -u_int16_t foo; -; return 0; } -EOF -if eval $ac_compile; then - rm -rf conftest* - vi_cv_uint16=yes -else - rm -rf conftest* - if test "$cross_compiling" = yes; then - { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } -else -cat > conftest.$ac_ext </dev/null; then - vi_cv_uint16="unsigned short" -else - if test "$cross_compiling" = yes; then - { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } -else -cat > conftest.$ac_ext </dev/null; then - vi_cv_uint16="unsigned int" -else - vi_cv_uint16=no -fi -fi -rm -fr conftest* -fi -fi -rm -fr conftest* -fi -rm -f conftest* - -fi - -echo "$ac_t""$vi_cv_uint16" 1>&6 -if test "$vi_cv_uint16" = no; then - echo - echo "Fatal error: no unsigned, 16-bit integral type." - exit 1 -fi -if test "$vi_cv_uint16" != yes; then - u_int16_decl="typedef $vi_cv_uint16 u_int16_t;" -fi - - -echo $ac_n "checking for int16_t""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'vi_cv_int16'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -int16_t foo; -; return 0; } -EOF -if eval $ac_compile; then - rm -rf conftest* - vi_cv_int16=yes -else - rm -rf conftest* - if test "$cross_compiling" = yes; then - { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } -else -cat > conftest.$ac_ext </dev/null; then - vi_cv_int16="short" -else - if test "$cross_compiling" = yes; then - { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } -else -cat > conftest.$ac_ext </dev/null; then - vi_cv_int16="int" -else - vi_cv_int16=no -fi -fi -rm -fr conftest* -fi -fi -rm -fr conftest* -fi -rm -f conftest* - -fi - -echo "$ac_t""$vi_cv_int16" 1>&6 -if test "$vi_cv_int16" = no; then - echo - echo "Fatal error: no signed, 16-bit integral type." - exit 1 -fi -if test "$vi_cv_int16" != yes; then - int16_decl="typedef $vi_cv_int16 int16_t;" -fi - - -echo $ac_n "checking for u_int32_t""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'vi_cv_uint32'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -u_int32_t foo; -; return 0; } -EOF -if eval $ac_compile; then - rm -rf conftest* - vi_cv_uint32=yes -else - rm -rf conftest* - if test "$cross_compiling" = yes; then - { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } -else -cat > conftest.$ac_ext </dev/null; then - vi_cv_uint32="unsigned int" -else - if test "$cross_compiling" = yes; then - { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } -else -cat > conftest.$ac_ext </dev/null; then - vi_cv_uint32="unsigned long" -else - vi_cv_uint32=no -fi -fi -rm -fr conftest* -fi -fi -rm -fr conftest* -fi -rm -f conftest* - -fi - -echo "$ac_t""$vi_cv_uint32" 1>&6 -if test "$vi_cv_uint32" = no; then - echo - echo "Fatal error: no unsigned, 32-bit integral type." - exit 1 -fi -if test "$vi_cv_uint32" != yes; then - u_int32_decl="typedef $vi_cv_uint32 u_int32_t;" -fi - - -echo $ac_n "checking for int32_t""... $ac_c" 1>&6 -if eval "test \"`echo '$''{'vi_cv_int32'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext < -int main() { return 0; } -int t() { -int32_t foo; -; return 0; } -EOF -if eval $ac_compile; then - rm -rf conftest* - vi_cv_int32=yes -else - rm -rf conftest* - if test "$cross_compiling" = yes; then - { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } -else -cat > conftest.$ac_ext </dev/null; then - vi_cv_int32="int" -else - if test "$cross_compiling" = yes; then - { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } -else -cat > conftest.$ac_ext </dev/null; then - vi_cv_int32="long" -else - vi_cv_int32=no -fi -fi -rm -fr conftest* -fi -fi -rm -fr conftest* -fi -rm -f conftest* - -fi - -echo "$ac_t""$vi_cv_int32" 1>&6 -if test "$vi_cv_int32" = no; then - echo - echo "Fatal error: no signed, 32-bit integral type." - exit 1 -fi -if test "$vi_cv_int32" != yes; then - int32_decl="typedef $vi_cv_int32 int32_t;" -fi - -trap '' 1 2 15 -cat > confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - sed -n "s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=\${\1='\2'}/p" \ - >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Any assignment to VPATH causes Sun make to only execute -# the first set of double-colon rules, so remove it if not needed. -# If there is a colon in the path, we need to keep it. -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' -fi - -trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 - -DEFS=-DHAVE_CONFIG_H - -# Without the "./", some shells look in PATH for config.status. -: ${CONFIG_STATUS=./config.status} - -echo creating $CONFIG_STATUS -rm -f $CONFIG_STATUS -cat > $CONFIG_STATUS </dev/null | sed 1q`: -# -# $0 $ac_configure_args -# -# Compiler output produced by configure, useful for debugging -# configure, is in ./config.log if it exists. - -ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" -for ac_option -do - case "\$ac_option" in - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" - exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; - -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.7" - exit 0 ;; - -help | --help | --hel | --he | --h) - echo "\$ac_cs_usage"; exit 0 ;; - *) echo "\$ac_cs_usage"; exit 1 ;; - esac -done - -ac_given_srcdir=$srcdir -ac_given_INSTALL="$INSTALL" - -trap 'rm -fr `echo "Makefile port.h:port.h.in - pathnames.h:pathnames.h.in recover:recover.in config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 -EOF -cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF -$ac_vpsub -$extrasub -s%@CFLAGS@%$CFLAGS%g -s%@CPPFLAGS@%$CPPFLAGS%g -s%@CXXFLAGS@%$CXXFLAGS%g -s%@DEFS@%$DEFS%g -s%@LDFLAGS@%$LDFLAGS%g -s%@LIBS@%$LIBS%g -s%@exec_prefix@%$exec_prefix%g -s%@prefix@%$prefix%g -s%@program_transform_name@%$program_transform_name%g -s%@bindir@%$bindir%g -s%@sbindir@%$sbindir%g -s%@libexecdir@%$libexecdir%g -s%@datadir@%$datadir%g -s%@sysconfdir@%$sysconfdir%g -s%@sharedstatedir@%$sharedstatedir%g -s%@localstatedir@%$localstatedir%g -s%@libdir@%$libdir%g -s%@includedir@%$includedir%g -s%@oldincludedir@%$oldincludedir%g -s%@infodir@%$infodir%g -s%@mandir@%$mandir%g -s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g -s%@INSTALL_DATA@%$INSTALL_DATA%g -s%@host@%$host%g -s%@host_alias@%$host_alias%g -s%@host_cpu@%$host_cpu%g -s%@host_vendor@%$host_vendor%g -s%@host_os@%$host_os%g -s%@CC@%$CC%g -s%@OPTFLAG@%$OPTFLAG%g -s%@no_op_OPTFLAG@%$no_op_OPTFLAG%g -s%@vi_cv_path_shell@%$vi_cv_path_shell%g -s%@vi_cv_path_sendmail@%$vi_cv_path_sendmail%g -s%@vi_cv_path_perl@%$vi_cv_path_perl%g -s%@vi_cv_path_preserve@%$vi_cv_path_preserve%g -s%@vi_cv_path_chmod@%$vi_cv_path_chmod%g -s%@vi_cv_path_cp@%$vi_cv_path_cp%g -s%@vi_cv_path_ln@%$vi_cv_path_ln%g -s%@vi_cv_path_mkdir@%$vi_cv_path_mkdir%g -s%@vi_cv_path_rm@%$vi_cv_path_rm%g -s%@vi_cv_path_strip@%$vi_cv_path_strip%g -s%@CPP@%$CPP%g -s%@XINCS@%$XINCS%g -s%@shrpenv@%$shrpenv%g -s%@vi_cv_perllib@%$vi_cv_perllib%g -s%@tknvi@%$tknvi%g -s%@TKLIBS@%$TKLIBS%g -s%@cobjs@%$cobjs%g -s%@LIBOBJS@%$LIBOBJS%g -s%@u_char_decl@%$u_char_decl%g -s%@u_short_decl@%$u_short_decl%g -s%@u_int_decl@%$u_int_decl%g -s%@u_long_decl@%$u_long_decl%g -s%@u_int8_decl@%$u_int8_decl%g -s%@u_int16_decl@%$u_int16_decl%g -s%@int16_decl@%$int16_decl%g -s%@u_int32_decl@%$u_int32_decl%g -s%@int32_decl@%$int32_decl%g - -CEOF -EOF -cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF -for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - # Adjust relative srcdir, etc. for subdirectories. - - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dir_suffix. - ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dir_suffix= ac_dots= - fi - - case "$ac_given_srcdir" in - .) srcdir=. - if test -z "$ac_dots"; then top_srcdir=. - else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; - /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; - *) # Relative path. - srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" - top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - - case "$ac_given_INSTALL" in - [/$]*) INSTALL="$ac_given_INSTALL" ;; - *) INSTALL="$ac_dots$ac_given_INSTALL" ;; - esac - echo creating "$ac_file" - rm -f "$ac_file" - configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." - case "$ac_file" in - *Makefile*) ac_comsub="1i\\ -# $configure_input" ;; - *) ac_comsub= ;; - esac - sed -e "$ac_comsub -s%@configure_input@%$configure_input%g -s%@srcdir@%$srcdir%g -s%@top_srcdir@%$top_srcdir%g -s%@INSTALL@%$INSTALL%g -" -f conftest.subs $ac_given_srcdir/$ac_file_in > $ac_file -fi; done -rm -f conftest.subs - -# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -# NAME is the cpp macro being defined and VALUE is the value it is being given. -# -# ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' -ac_dC='\3' -ac_dD='%g' -# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". -ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_uB='\([ ]\)%\1#\2define\3' -ac_uC=' ' -ac_uD='\4%g' -# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_eB='$%\1#\2define\3' -ac_eC=' ' -ac_eD='%g' - -CONFIG_HEADERS=${CONFIG_HEADERS-"config.h"} -for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then - # Support "outfile[:infile]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - echo creating $ac_file - - rm -f conftest.frag conftest.in conftest.out - cp $ac_given_srcdir/$ac_file_in conftest.in - -EOF - -# Transform confdefs.h into a sed script conftest.vals that substitutes -# the proper values into config.h.in to produce config.h. And first: -# Protect against being on the right side of a sed subst in config.status. -# Protect against being in an unquoted here document in config.status. -rm -f conftest.vals -cat > conftest.hdr <<\EOF -s/[\\&%]/\\&/g -s%[\\$`]%\\&%g -s%#define \([A-Za-z_][A-Za-z0-9_]*\) \(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp -s%ac_d%ac_u%gp -s%ac_u%ac_e%gp -EOF -sed -n -f conftest.hdr confdefs.h > conftest.vals -rm -f conftest.hdr - -# This sed command replaces #undef with comments. This is necessary, for -# example, in the case of _POSIX_SOURCE, which is predefined and required -# on some systems where configure will not decide to define it. -cat >> conftest.vals <<\EOF -s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% -EOF - -# Break up conftest.vals because some shells have a limit on -# the size of here documents, and old seds have small limits too. -# Maximum number of lines to put in a single here document. -ac_max_here_lines=12 - -rm -f conftest.tail -while : -do - ac_lines=`grep -c . conftest.vals` - # grep -c gives empty output for an empty file on some AIX systems. - if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi - # Write a limited-size here document to conftest.frag. - echo ' cat > conftest.frag <> $CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS - echo 'CEOF - sed -f conftest.frag conftest.in > conftest.out - rm -f conftest.in - mv conftest.out conftest.in -' >> $CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail - rm -f conftest.vals - mv conftest.tail conftest.vals -done -rm -f conftest.vals - -cat >> $CONFIG_STATUS <<\EOF - rm -f conftest.frag conftest.h - echo "/* $ac_file. Generated automatically by configure. */" > conftest.h - cat conftest.in >> conftest.h - rm -f conftest.in - if cmp -s $ac_file conftest.h 2>/dev/null; then - echo "$ac_file is unchanged" - rm -f conftest.h - else - rm -f $ac_file - mv conftest.h $ac_file - fi -fi; done - - - -exit 0 -EOF -chmod +x $CONFIG_STATUS -rm -fr confdefs* $ac_clean_files -test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 - diff --git a/build/configure.in b/build/configure.in deleted file mode 100644 index cb8e4637d957..000000000000 --- a/build/configure.in +++ /dev/null @@ -1,725 +0,0 @@ -dnl @(#)configure.in 8.134 (Berkeley) 10/15/96 - -dnl Process this file with autoconf to produce a configure script. -AC_INIT(../common/main.c) -AC_CONFIG_HEADER(config.h) - -dnl Configure setup. -AC_PROG_INSTALL() -AC_CANONICAL_HOST -AC_ARG_PROGRAM() - -dnl If the user wants a debugging environment, set OPTFLAG now. (Some -dnl compilers won't mix optimizing and debug flags.) -AC_MSG_CHECKING(if --enable-debug option specified) -AC_ARG_ENABLE(debug, - [ --enable-debug Build a debugging version.], - [vi_cv_debug="yes"], [vi_cv_debug="no"]) -if test "$vi_cv_debug" = yes; then - AC_DEFINE(DEBUG) - OPTFLAG=${OPTFLAG-"-g"} - no_op_OPTFLAG=${no_op_OPTFLAG-"-g"} -fi -AC_MSG_RESULT($vi_cv_debug) - -dnl This is where we handle stuff that autoconf can't handle. -dnl XXX -dnl Don't override anything if it's already set from the environment. - -dnl Compiler, preprocessor and load flags. -dnl AUX: -ZP disables _BSD_SOURCE et al, but enables POSIX at link time. -dnl LynxOS: We check for gcc 2.x or better, the gcc 1 that was shipped with -dnl LynxOS historically wasn't good enough. -AC_SUBST(CPPFLAGS) -case "$host_os" in -aix3.2.5) OPTFLAG=${OPTFLAG-"-O"};; -aix4.1*) CFLAGS=${CFLAGS-"-qstrict"} - OPTFLAG=${OPTFLAG-"-O3"};; -aux*) CPPFLAGS=${CPPFLAGS-"-ZP -D_BSD_SOURCE -D_SYSV_SOURCE -D_AUX_SOURCE"} - LDFLAGS=${LDFLAGS-"-ZP"} - OPTFLAG=${OPTFLAG-"-O"};; -bsd4.4) OPTFLAG=${OPTFLAG-"-O2"};; -bsdi*) CC=${CC-"shlicc"} - OPTFLAG=${OPTFLAG-"-O2"};; -irix6*) OPTFLAG=${OPTFLAG-"-O2"};; -irix*) OPTFLAG=${OPTFLAG-"-O2"};; -lynxos*) AC_PROG_CC() - AC_MSG_CHECKING([for GNU C (gcc) version 2.x]) - ac_cv_gcc_vers=`${CC-cc} -v 2>&1 | \ - grep "gcc version " | sed 's/.*version //'` - ac_cv_gcc_major=`echo "$ac_cv_gcc_vers" | sed 's/\..*//'` - if test "$ac_cv_gcc_major" = "2" ; then - AC_MSG_RESULT(yes) - else - AC_MSG_RESULT(no) - echo "Fatal error: Nvi requires gcc 2.x to build on LynxOS." - echo "See build/README.LynxOS for more information." - exit 1 - fi;; -nextstep3) CPPFLAGS=${CPPFLAGS-"-w -pipe -posix"} - LDFLAGS=${LDFLAGS-"-posix"} - OPTFLAG=${OPTFLAG-"-O9"};; -osf*) CFLAGS=${CFLAGS-"-Olimit 1000"};; -solaris*) no_op_OPTFLAG=${no_op_OPTFLAG-""};; -sunos*) no_op_OPTFLAG=${no_op_OPTFLAG-""};; -esac - -dnl The default compiler is cc. -AC_SUBST(CC) -CC=${CC-cc} - -dnl The default OPTFLAG is -O -AC_SUBST(OPTFLAG) -OPTFLAG=${OPTFLAG-"-O"} - -dnl The SunOS/Solaris compiler can't optimize vi/v_txt.c; the symptom is -dnl that the command 35i== turns into an infinite loop. -AC_SUBST(no_op_OPTFLAG) -no_op_OPTFLAG=${no_op_OPTFLAG-"$OPTFLAG"} - -dnl Libraries. -case "$host_os" in -bsdi2.1) LIBS=${LIBS-"-lipc"};; -dgux*) LIBS=${LIBS-"-ldgc"};; -irix6*) LIBS=${LIBS-"-lbsd"};; -irix*) LIBS=${LIBS-"-lc_s -lbsd"};; -isc*) LIBS=${LIBS-"-lcposix -linet"};; -netbsd1*) LIBS=${LIBS-"-lcrypt"};; -ptx*) LIBS=${LIBS-"-lseq -linet -lsocket"};; -sco3.2*) LIBS=${LIBS-"-lsocket"};; -sinix*) LIBS=${LIBS-"-lelf -lc"};; -solaris*) LIBS=${LIBS-"-lsocket -lnsl -ldl"} - RLIBS=yes;; -wgs*) LIBS=${LIBS-"-lnsl"};; -esac - -dnl A/UX has a broken getopt(3), strpbrk(3). -case "$host_os" in -aux*) LIBOBJS="getopt.o strpbrk.o $LIBOBJS";; -esac - -dnl Ultrix has a broken POSIX.1 VDISABLE value. -case "$host_os" in -ultrix*) AC_DEFINE(HAVE_BROKEN_VDISABLE);; -esac - -dnl The user may have additional CPP information. -CPPFLAGS="$ADDCPPFLAGS $CPPFLAGS" - -dnl The user may have additional load line information. -LDFLAGS="$ADDLDFLAGS $LDFLAGS" - -dnl The user may have additional library information. -LIBS="$ADDLIBS $LIBS" - -dnl Check to see if it's going to work. -AM_SANITY_CHECK_CC - -dnl Checks for programs. -PATH="$PATH:/usr/bin:/usr/sbin:/sbin:/etc:/usr/etc:/usr/lib:/usr/ucblib:" - -dnl Check for the shell path. -AC_PATH_PROG(vi_cv_path_shell, sh, no) -if test "$vi_cv_path_shell" = no; then - echo "Fatal error: the shell utility not found." - exit 1 -fi - -dnl Check for the sendmail path. -AC_PATH_PROG(vi_cv_path_sendmail, sendmail, no) -if test "$vi_cv_path_sendmail" = no; then - echo "WARNING: The sendmail utility was not found!" - echo "WARNING: Users will not be told of saved files." -fi - -dnl Check for the perl5/perl path. -AC_SUBST(vi_cv_path_perl) -AC_PATH_PROGS(vi_cv_path_perl, perl5 perl, no) - -dnl Check for the "preserve" path. -dnl Historically, nvi has used /var/tmp/vi.recover. The Linux filesystem -dnl standard (FSSTND) uses /var/preserve; we add the vi.recover directory -dnl beneath it so that we don't have name collisions with other editors. -dnl Other systems have /var/preserve as well, so we test first for an already -dnl existing name, and then use the first one that's writeable. -AC_SUBST(vi_cv_path_preserve) -AC_MSG_CHECKING(for preserve directory) -AC_CACHE_VAL(vi_cv_path_preserve, [dnl - dirlist="/var/preserve /var/tmp /usr/tmp" - vi_cv_path_preserve=no - for i in $dirlist; do - if test -d $i/vi.recover; then - vi_cv_path_preserve=$i/vi.recover - break; - fi - done - if test "$vi_cv_path_preserve" = no; then - for i in $dirlist; do - if test -d $i -a -w $i; then - vi_cv_path_preserve=$i/vi.recover - break; - fi - done - - fi]) -if test "$vi_cv_path_preserve" = no; then - echo "Fatal error: no writeable preserve directory found." - exit 1 -fi -AC_MSG_RESULT($vi_cv_path_preserve) - -dnl Check for programs used for installation -AC_PATH_PROG(vi_cv_path_chmod, chmod, missing_chmod) -AC_PATH_PROG(vi_cv_path_cp, cp, missing_cp) -AC_PATH_PROG(vi_cv_path_ln, ln, missing_ln) -AC_PATH_PROG(vi_cv_path_mkdir, mkdir, missing_mkdir) -AC_PATH_PROG(vi_cv_path_rm, rm, missing_rm) -AC_PATH_PROG(vi_cv_path_strip, strip, missing_strip) - -dnl Checks for libraries. -dnl Find the X libraries and includes. -AC_PATH_X -AC_SUBST(XINCS) -if test "$no_x" != yes; then - if test "X$x_libraries" != "X"; then - if test "X$RLIBS" = "Xyes"; then - XLIBS="-R$x_libraries -L$x_libraries $XLIBS" - else - XLIBS="-L$x_libraries $XLIBS" - fi - fi - XLIBS="$XLIBS -lX11" - if test "X$x_includes" != "X"; then - XINCS="-I$x_includes" - fi -fi - -dnl If the user wants a Perl interpreter in nvi, load it. -AC_SUBST(shrpenv) -AC_SUBST(vi_cv_perllib) -AC_MSG_CHECKING(if --enable-perlinterp option specified) -AC_ARG_ENABLE(perlinterp, - [ --enable-perlinterp Include a Perl interpreter in vi.], - [vi_cv_perlinterp="yes"], [vi_cv_perlinterp="no"]) -AC_MSG_RESULT($vi_cv_perlinterp) -if test "$vi_cv_perlinterp" = "yes"; then - if test "$vi_cv_path_perl" = no; then - echo "Fatal error: no perl5 utility found." - exit 1 - fi - $vi_cv_path_perl -e 'require 5.002' || { - echo "Fatal error: perl5 must be version 5.002 or later." - exit 1 - } - $vi_cv_path_perl -e 'close(STDERR);require 5.003_01' && - AC_DEFINE(HAVE_PERL_5_003_01) - - eval `$vi_cv_path_perl -V:shrpenv` - if test "X$shrpenv" = "XUNKNOWN"; then # pre 5.003_04 - shrpenv="" - fi - vi_cv_perllib=`$vi_cv_path_perl -MConfig -e 'print $Config{privlib}'` - perlcppflags=`$vi_cv_path_perl -Mlib=$srcdir -MExtUtils::Embed \ - -e 'ccflags;perl_inc'` - if test "X$perlcppflags" != "X"; then - CPPFLAGS="$perlcppflags $CPPFLAGS" - fi - perllibs=`cd $srcdir;$vi_cv_path_perl -MExtUtils::Embed \ - -e 'ldopts'` - if test "X$perllibs" != "X"; then - LIBS="$perllibs $LIBS" - fi - perlldflags=`cd $srcdir;$vi_cv_path_perl -MExtUtils::Embed \ - -e 'ccdlflags'` - if test "X$perlldflags" != "X"; then - LDFLAGS="$perlldflags $LDFLAGS" - fi - LIBOBJS="perl.o perlsfio.o $LIBOBJS" - AC_DEFINE(HAVE_PERL_INTERP) -fi - -dnl If the user wants a Tk/Tcl front-end for nvi, build it. -AC_SUBST(tknvi) -AC_SUBST(TKLIBS) -AC_MSG_CHECKING(if --enable-tknvi option specified) -AC_ARG_ENABLE(tknvi, - [ --enable-tknvi Build a Tk/Tcl front-end for vi.], - [vi_cv_tknvi="yes"], [vi_cv_tknvi="no"]) -AC_MSG_RESULT($vi_cv_tknvi) -if test "$vi_cv_tknvi" = "yes"; then - tknvi=tknvi - TKLIBS="-ltk -ltcl -lm $XLIBS $LIBS" -fi - -dnl If the user wants a Tk/Tcl interpreter in nvi, load it. -AC_MSG_CHECKING(if --enable-tclinterp option specified) -AC_ARG_ENABLE(tclinterp, - [ --enable-tclinterp Include a Tk/Tcl interpreter in vi.], - [vi_cv_tclinterp="yes"], [vi_cv_tclinterp="no"]) -AC_MSG_RESULT($vi_cv_tclinterp) -if test "$vi_cv_tclinterp" = "yes"; then - LIBOBJS="tcl.o $LIBOBJS" - LIBS="-ltk -ltcl -lm $XLIBS $LIBS" - AC_DEFINE(HAVE_TCL_INTERP) -fi - -dnl Make sure that we can find a Tk/Tcl library. -if test "$vi_cv_tknvi" = "yes" || test "$vi_cv_tclinterp" = "yes"; then - AC_CHECK_LIB(tcl, main, - [vi_cv_tkfatal="no"], [vi_cv_tkfatal="yes"], -ltk -lm) - if test "$vi_cv_tkfatal" = "yes"; then - echo "Fatal error: no Tk/Tcl library; see the section" - echo "ADDING LIBRARIES AND INCLUDE FILES in the README file." - exit 1 - fi -fi - -dnl Both Tcl/Tk and Perl interpreters need the vi api code. -if test "$vi_cv_tclinterp" = yes || test "$vi_cv_perlinterp" = yes; then - LIBOBJS="api.o $LIBOBJS" -fi - -dnl Check for the termcap/termlib library. Compile in nvi's curses routines -dnl unless the user specifies otherwise. These two checks must occur in the -dnl current order, and -lcurses must be loaded before -ltermcap/-ltermlib. -AC_CHECK_LIB(termlib, tgetent, - [vi_cv_termlib=-ltermlib], [vi_cv_termlib=no]) -if test "$vi_cv_termlib" = no; then - AC_CHECK_LIB(termcap, tgetent, - [vi_cv_termlib=-ltermcap], [vi_cv_termlib=no]) -fi -if test "$vi_cv_termlib" != no; then - LIBS="$vi_cv_termlib $LIBS" -fi -AC_SUBST(cobjs) -AC_MSG_CHECKING(if --disable-curses option specified) -AC_ARG_ENABLE(curses, - [ --disable-curses DON'T use the nvi-provided curses routines.], - [vi_cv_curses="other curses"], [vi_cv_curses="bundled curses"]) -AC_MSG_RESULT($vi_cv_curses) -case "$vi_cv_curses" in -"bundled curses") - CPPFLAGS="-I\$(srcdir)/curses $CPPFLAGS" - cobjs="\$(COBJS)";; -"other curses") - LIBS="-lcurses $LIBS";; -esac - -dnl Checks for header files. -AC_MSG_CHECKING(for sys/mman.h) -AC_CACHE_VAL(vi_cv_include_sys_mman, [dnl -AC_TRY_CPP([#include ], - [vi_cv_include_sys_mman=yes], [vi_cv_include_sys_mman=no])]) -if test "$vi_cv_include_sys_mman" = yes; then - AC_DEFINE(HAVE_SYS_MMAN_H) -fi -AC_MSG_RESULT($vi_cv_include_sys_mman) - -AC_MSG_CHECKING(for sys/select.h) -AC_CACHE_VAL(vi_cv_include_sys_select, [dnl -AC_TRY_CPP([#include ], - [vi_cv_include_sys_select=yes], [vi_cv_include_sys_select=no])]) -if test "$vi_cv_include_sys_select" = yes; then - AC_DEFINE(HAVE_SYS_SELECT_H) -fi -AC_MSG_RESULT($vi_cv_include_sys_select) - -dnl Checks for typedefs, structures, and compiler characteristics. -AC_CHECK_TYPE(ssize_t, int) -AC_C_BIGENDIAN -AC_C_CONST -AC_STRUCT_ST_BLKSIZE -AC_TYPE_MODE_T -AC_TYPE_OFF_T -AC_TYPE_PID_T -AC_TYPE_SIZE_T -AC_STRUCT_TM - -dnl Checks for library functions. - AC_CHECK_FUNCS(bsearch gethostname getopt memchr memcpy memmove memset) -AC_REPLACE_FUNCS(bsearch gethostname getopt memchr memcpy memmove memset) - AC_CHECK_FUNCS(mkstemp mmap snprintf strdup strerror strpbrk strtol) -AC_REPLACE_FUNCS(mkstemp mmap snprintf strdup strerror strpbrk strtol) - AC_CHECK_FUNCS(strtoul vsnprintf) -AC_REPLACE_FUNCS(strtoul vsnprintf) - -AC_CHECK_FUNCS(select) -AC_CHECK_FUNCS(setenv, [need_env=no], [need_env=yes]) -AC_CHECK_FUNCS(strsep, [need_strsep=no], [need_strsep=yes]) -AC_CHECK_FUNCS(unsetenv,, [need_env=yes]) - -AC_FUNC_MMAP -AC_FUNC_VFORK - -dnl If we needed setenv or unsetenv, add in the clib/env.c replacement file. -if test "$need_env" = yes; then - LIBOBJS="env.o $LIBOBJS" -fi - -dnl If we need strsep, add it and define it so we get a prototype. -if test "$need_strsep" = yes; then - LIBOBJS="strsep.o $LIBOBJS" -fi - -dnl Check for fcntl/flock -dnl Use flock preferentially, since it has cleaner semantics and won't -dnl hang up the editor. -dnl XXX -dnl Ultrix has a broken fcntl, but a working flock. -dnl IRIX and DGUX have a broken flock, but working fcntl. -AC_MSG_CHECKING(for fcntl/flock) -AC_CACHE_VAL(vi_cv_lock, [dnl - vi_cv_lock=none - case "$host_os" in - dgux*);; - irix*);; - *) - AC_TRY_LINK([#include ], [flock(0, 0);], - [vi_cv_lock=flock]);; - esac - if test "$vi_cv_lock" = none; then - AC_TRY_LINK([#include ], [fcntl(0, F_SETLK, 0);], - [vi_cv_lock=fcntl]) - fi]) - -if test "$vi_cv_lock" = flock; then - AC_DEFINE(HAVE_LOCK_FLOCK) -fi -if test "$vi_cv_lock" = fcntl; then - AC_DEFINE(HAVE_LOCK_FCNTL) -fi -AC_MSG_RESULT($vi_cv_lock) - -dnl Check for ftruncate/chsize -AC_MSG_CHECKING(for ftruncate/chsize) -AC_CACHE_VAL(vi_cv_ftruncate, [dnl -AC_TRY_LINK([#include ], [ftruncate(0, 0);], - [vi_cv_ftruncate=ftruncate], -AC_TRY_LINK([#include ], [chsize(0, 0);], - [vi_cv_ftruncate=chsize], [vi_cv_ftruncate=no]))]) -if test "$vi_cv_ftruncate" = ftruncate; then - AC_DEFINE(HAVE_FTRUNCATE_FTRUNCATE) -fi -if test "$vi_cv_ftruncate" = chsize; then - AC_DEFINE(HAVE_FTRUNCATE_CHSIZE) -fi -if test "$vi_cv_ftruncate" = no; then - echo - echo "Fatal error: no file truncation system call." - exit 1 -fi -AC_MSG_RESULT($vi_cv_ftruncate) - -dnl Check for the tigetstr/tigetnum functions. -AC_MSG_CHECKING(for tigetstr/tigetnum) -AC_CACHE_VAL(vi_cv_have_curses_tigetstr, [dnl -AC_TRY_LINK([#include ], [tigetstr(0);], - [vi_cv_have_curses_tigetstr=yes], - [vi_cv_have_curses_tigetstr=no])]) -if test "$vi_cv_have_curses_tigetstr" = yes; then - AC_DEFINE(HAVE_CURSES_TIGETSTR) -fi -AC_MSG_RESULT($vi_cv_have_curses_tigetstr) - -dnl Check for potentially missing curses functions in system or user-specified -dnl libraries. We also have to guess at whether the specified library is a -dnl BSD or System V style curses. Use the newterm function, all System V -dnl curses implementations have it, none, as far as I know, of the BSD ones do. -if test "$vi_cv_curses" = "bundled curses"; then - AC_DEFINE(HAVE_BSD_CURSES) - AC_DEFINE(HAVE_CURSES_ADDNSTR) - AC_DEFINE(HAVE_CURSES_IDLOK) -else - dnl Check for the addnstr function. - AC_MSG_CHECKING(for addnstr) - AC_CACHE_VAL(vi_cv_have_curses_addnstr, [dnl - AC_TRY_LINK([#include ], [addnstr(0, 0);], - [vi_cv_have_curses_addnstr=yes], - [vi_cv_have_curses_addnstr=no])]) - if test "$vi_cv_have_curses_addnstr" = yes; then - AC_DEFINE(HAVE_CURSES_ADDNSTR) - fi - AC_MSG_RESULT($vi_cv_have_curses_addnstr) - - dnl Check for the beep function. - AC_MSG_CHECKING(for beep) - AC_CACHE_VAL(vi_cv_have_curses_beep, [dnl - AC_TRY_LINK([#include ], [beep();], - [vi_cv_have_curses_beep=yes], - [vi_cv_have_curses_beep=no])]) - if test "$vi_cv_have_curses_beep" = yes; then - AC_DEFINE(HAVE_CURSES_BEEP) - fi - AC_MSG_RESULT($vi_cv_have_curses_beep) - - dnl Check for the flash function. - AC_MSG_CHECKING(for flash) - AC_CACHE_VAL(vi_cv_have_curses_flash, [dnl - AC_TRY_LINK([#include ], [flash();], - [vi_cv_have_curses_flash=yes], - [vi_cv_have_curses_flash=no])]) - if test "$vi_cv_have_curses_flash" = yes; then - AC_DEFINE(HAVE_CURSES_FLASH) - fi - AC_MSG_RESULT($vi_cv_have_curses_flash) - - dnl Check for the idlok function. - AC_MSG_CHECKING(for idlok) - AC_CACHE_VAL(vi_cv_have_curses_idlok, [dnl - AC_TRY_LINK([#include ], [idlok(0, 0);], - [vi_cv_have_curses_idlok=yes], - [vi_cv_have_curses_idlok=no])]) - if test "$vi_cv_have_curses_idlok" = yes; then - AC_DEFINE(HAVE_CURSES_IDLOK) - fi - AC_MSG_RESULT($vi_cv_have_curses_idlok) - - dnl Check for the keypad function. - AC_MSG_CHECKING(for keypad) - AC_CACHE_VAL(vi_cv_have_curses_keypad, [dnl - AC_TRY_LINK([#include ], [keypad(0, 0);], - [vi_cv_have_curses_keypad=yes], - [vi_cv_have_curses_keypad=no])]) - if test "$vi_cv_have_curses_keypad" = yes; then - AC_DEFINE(HAVE_CURSES_KEYPAD) - fi - AC_MSG_RESULT($vi_cv_have_curses_keypad) - - dnl Check for the newterm function. - AC_MSG_CHECKING(for newterm) - AC_CACHE_VAL(vi_cv_have_curses_newterm, [dnl - AC_TRY_LINK([#include ], [newterm(0, 0, 0);], - [vi_cv_have_curses_newterm=yes], - [vi_cv_have_curses_newterm=no])]) - if test "$vi_cv_have_curses_newterm" = yes; then - AC_DEFINE(HAVE_CURSES_NEWTERM) - fi - AC_MSG_RESULT($vi_cv_have_curses_newterm) - - if test "$vi_cv_have_curses_newterm" = no; then - AC_DEFINE(HAVE_BSD_CURSES) - fi -fi - -dnl Check for the setupterm function. We make this check regardless of -dnl using the system library, because it may be part of the underlying -dnl termcap/termlib support, and we want to use the local one. -AC_MSG_CHECKING(for setupterm) -AC_CACHE_VAL(vi_cv_have_curses_setupterm, [dnl -AC_TRY_LINK([#include ], [setupterm(0, 0, 0);], - [vi_cv_have_curses_setupterm=yes], - [vi_cv_have_curses_setupterm=no])]) -if test "$vi_cv_have_curses_setupterm" = yes; then - AC_DEFINE(HAVE_CURSES_SETUPTERM) -fi -AC_MSG_RESULT($vi_cv_have_curses_setupterm) - -dnl Some moron decided to drop off an argument from the gettimeofday call, -dnl without changing the name. -AC_MSG_CHECKING(for broken gettimeofday system call) -AC_CACHE_VAL(vi_cv_gettimeofday, [dnl -AC_TRY_LINK([#include -#include ], [gettimeofday(0, 0);], - [vi_cv_gettimeofday=okay], [vi_cv_gettimeofday=broken])]) -if test "$vi_cv_gettimeofday" = broken; then - AC_DEFINE(HAVE_BROKEN_GETTIMEOFDAY) -fi -AC_MSG_RESULT($vi_cv_gettimeofday) - -dnl Check for which version of openpty to use, System V or Berkeley. -AC_MSG_CHECKING(for System V pty calls) -AC_CACHE_VAL(vi_cv_sys5_pty, [dnl -AC_TRY_LINK(, [grantpt(0);], - [vi_cv_sys5_pty=yes], [vi_cv_sys5_pty=no])]) -if test "$vi_cv_sys5_pty" = yes; then - AC_DEFINE(HAVE_SYS5_PTY) -fi -AC_MSG_RESULT($vi_cv_sys5_pty) - -dnl Check for the revoke system call. -AC_MSG_CHECKING(for revoke system call) -AC_CACHE_VAL(vi_cv_revoke, [dnl -AC_TRY_LINK(, [revoke("a");], - [vi_cv_revoke=yes], [vi_cv_revoke=no])]) -if test "$vi_cv_revoke" = yes; then - AC_DEFINE(HAVE_REVOKE) -fi -AC_MSG_RESULT($vi_cv_revoke) - -dnl Some versions of sprintf return a pointer to the first argument instead -dnl of a character count. We assume that the return value of snprintf and -dnl vsprintf etc. will be the same as sprintf, and check the easy one. -AC_MSG_CHECKING(for int type sprintf return value) -AC_CACHE_VAL(vi_cv_sprintf_count, [dnl -AC_TRY_RUN([main(){char buf[20]; exit(sprintf(buf, "XXX") != 3);}], - [vi_cv_sprintf_count=yes], [vi_cv_sprintf_count=no])]) -if test "$vi_cv_sprintf_count" = no; then - AC_DEFINE(SPRINTF_RET_CHARPNT) -fi -AC_MSG_RESULT($vi_cv_sprintf_count) - -dnl We compile in nvi's DB routines unless the user specifies otherwise. -AC_MSG_CHECKING(if --disable-db option specified) -AC_ARG_ENABLE(db, - [ --disable-db DON'T use the nvi-provided DB routines.], - [vi_cv_db_lib="other DB"], [vi_cv_db_lib="bundled DB"]) -AC_MSG_RESULT($vi_cv_db_lib) -case "$vi_cv_db_lib" in -"bundled DB") - CPPFLAGS="-I\$(srcdir)/db/include $CPPFLAGS" - LIBOBJS="\$(DBOBJS) $LIBOBJS";; -"other DB") - ;; -esac - -dnl We compile in nvi's RE routines unless the user specifies otherwise. -AC_MSG_CHECKING(if --disable-re option specified) -AC_ARG_ENABLE(re, - [ --disable-re DON'T use the nvi-provided RE routines.], - [vi_cv_re_lib="other RE"], [vi_cv_re_lib="bundled RE"]) -AC_MSG_RESULT($vi_cv_re_lib) -case "$vi_cv_re_lib" in -"bundled RE") - CPPFLAGS="-I\$(srcdir)/regex $CPPFLAGS" - LIBOBJS="\$(REOBJS) $LIBOBJS";; -"other RE") - ;; -esac - -dnl Check for the standard shorthand types. -AC_SUBST(u_char_decl) -AC_MSG_CHECKING(for u_char) -AC_CACHE_VAL(vi_cv_uchar, [dnl -AC_TRY_COMPILE([#include ], u_char foo;, - [vi_cv_uchar=yes], [vi_cv_uchar=no])]) -AC_MSG_RESULT($vi_cv_uchar) -if test "$vi_cv_uchar" = no; then - u_char_decl="typedef unsigned char u_char;" -fi - -AC_SUBST(u_short_decl) -AC_MSG_CHECKING(for u_short) -AC_CACHE_VAL(vi_cv_ushort, [dnl -AC_TRY_COMPILE([#include ], u_short foo;, - [vi_cv_ushort=yes], [vi_cv_ushort=no])]) -AC_MSG_RESULT($vi_cv_ushort) -if test "$vi_cv_ushort" = no; then - u_short_decl="typedef unsigned short u_short;" -fi - -AC_SUBST(u_int_decl) -AC_MSG_CHECKING(for u_int) -AC_CACHE_VAL(vi_cv_uint, [dnl -AC_TRY_COMPILE([#include ], u_int foo;, - [vi_cv_uint=yes], [vi_cv_uint=no])]) -AC_MSG_RESULT($vi_cv_uint) -if test "$vi_cv_uint" = no; then - u_int_decl="typedef unsigned int u_int;" -fi - -AC_SUBST(u_long_decl) -AC_MSG_CHECKING(for u_long) -AC_CACHE_VAL(vi_cv_ulong, [dnl -AC_TRY_COMPILE([#include ], u_long foo;, - [vi_cv_ulong=yes], [vi_cv_ulong=no])]) -AC_MSG_RESULT($vi_cv_ulong) -if test "$vi_cv_ulong" = no; then - u_long_decl="typedef unsigned long u_long;" -fi - -dnl DB/Vi use specific integer sizes. -AC_SUBST(u_int8_decl) -AC_MSG_CHECKING(for u_int8_t) -AC_CACHE_VAL(vi_cv_uint8, [dnl -AC_TRY_COMPILE([#include ], u_int8_t foo;, - [vi_cv_uint8=yes], -AC_TRY_RUN([main(){exit(sizeof(unsigned char) != 1);}], - [vi_cv_uint8="unsigned char"], [vi_cv_uint8=no]))]) -AC_MSG_RESULT($vi_cv_uint8) -if test "$vi_cv_uint8" = no; then - echo - echo "Fatal error: no unsigned, 8-bit integral type." - exit 1 -fi -if test "$vi_cv_uint8" != yes; then - u_int8_decl="typedef $vi_cv_uint8 u_int8_t;" -fi - -AC_SUBST(u_int16_decl) -AC_MSG_CHECKING(for u_int16_t) -AC_CACHE_VAL(vi_cv_uint16, [dnl -AC_TRY_COMPILE([#include ], u_int16_t foo;, - [vi_cv_uint16=yes], -AC_TRY_RUN([main(){exit(sizeof(unsigned short) != 2);}], - [vi_cv_uint16="unsigned short"], -AC_TRY_RUN([main(){exit(sizeof(unsigned int) != 2);}], - [vi_cv_uint16="unsigned int"], [vi_cv_uint16=no])))]) -AC_MSG_RESULT($vi_cv_uint16) -if test "$vi_cv_uint16" = no; then - echo - echo "Fatal error: no unsigned, 16-bit integral type." - exit 1 -fi -if test "$vi_cv_uint16" != yes; then - u_int16_decl="typedef $vi_cv_uint16 u_int16_t;" -fi - -AC_SUBST(int16_decl) -AC_MSG_CHECKING(for int16_t) -AC_CACHE_VAL(vi_cv_int16, [dnl -AC_TRY_COMPILE([#include ], int16_t foo;, - [vi_cv_int16=yes], -AC_TRY_RUN([main(){exit(sizeof(short) != 2);}], - [vi_cv_int16="short"], -AC_TRY_RUN([main(){exit(sizeof(int) != 2);}], - [vi_cv_int16="int"], [vi_cv_int16=no])))]) -AC_MSG_RESULT($vi_cv_int16) -if test "$vi_cv_int16" = no; then - echo - echo "Fatal error: no signed, 16-bit integral type." - exit 1 -fi -if test "$vi_cv_int16" != yes; then - int16_decl="typedef $vi_cv_int16 int16_t;" -fi - -AC_SUBST(u_int32_decl) -AC_MSG_CHECKING(for u_int32_t) -AC_CACHE_VAL(vi_cv_uint32, [dnl -AC_TRY_COMPILE([#include ], u_int32_t foo;, - [vi_cv_uint32=yes], -AC_TRY_RUN([main(){exit(sizeof(unsigned int) != 4);}], - [vi_cv_uint32="unsigned int"], -AC_TRY_RUN([main(){exit(sizeof(unsigned long) != 4);}], - [vi_cv_uint32="unsigned long"], [vi_cv_uint32=no])))]) -AC_MSG_RESULT($vi_cv_uint32) -if test "$vi_cv_uint32" = no; then - echo - echo "Fatal error: no unsigned, 32-bit integral type." - exit 1 -fi -if test "$vi_cv_uint32" != yes; then - u_int32_decl="typedef $vi_cv_uint32 u_int32_t;" -fi - -AC_SUBST(int32_decl) -AC_MSG_CHECKING(for int32_t) -AC_CACHE_VAL(vi_cv_int32, [dnl -AC_TRY_COMPILE([#include ], int32_t foo;, - [vi_cv_int32=yes], -AC_TRY_RUN([main(){exit(sizeof(int) != 4);}], - [vi_cv_int32="int"], -AC_TRY_RUN([main(){exit(sizeof(long) != 4);}], - [vi_cv_int32="long"], [vi_cv_int32=no])))]) -AC_MSG_RESULT($vi_cv_int32) -if test "$vi_cv_int32" = no; then - echo - echo "Fatal error: no signed, 32-bit integral type." - exit 1 -fi -if test "$vi_cv_int32" != yes; then - int32_decl="typedef $vi_cv_int32 int32_t;" -fi - -AC_OUTPUT(Makefile port.h:port.h.in - pathnames.h:pathnames.h.in recover:recover.in) diff --git a/build/distrib b/build/distrib deleted file mode 100644 index 45dbe52f4049..000000000000 --- a/build/distrib +++ /dev/null @@ -1,84 +0,0 @@ -#! /bin/sh -# @(#)distrib 8.11 (Berkeley) 10/23/96 - -# Clean -#make -f Makefile.in clean -#rm -f configure config.h.in - -# Build autoconf structure. -echo "Running autoheader" -autoheader 2>&1 | sed '/warning: AC_TRY_RUN called without default/d' -chmod 444 config.h.in -echo "Running autoconf" -autoconf 2>&1 | sed '/warning: AC_TRY_RUN called without default/d' -chmod 555 configure config.guess config.sub install-sh - -# Build include files. -f=../include/cl_extern.h -echo "Building $f" -rm -f $f -sed -n "s/^ \* PUBLIC: \(.*\)/\1/p" ../cl/*.c > $f -chmod 444 $f - -f=../include/com_extern.h -echo "Building $f" -rm -f $f -sed -n "s/^ \* PUBLIC: \(.*\)/\1/p" ../clib/*.c ../common/*.c > $f -chmod 444 $f - -f=../include/ex_def.h -echo "Building $f" -rm -f $f -awk -f ../ex/ex.awk ../ex/ex_cmd.c > $f -chmod 444 $f - -f=../include/ex_extern.h -echo "Building $f" -rm -f $f -sed -n "s/^ \* PUBLIC: \(.*\)/\1/p" ../ex/*.c > $f -chmod 444 $f - -if [ -d ../ip ]; then - f=../include/ip_extern.h - echo "Building $f" - rm -f $f - sed -n "s/^ \* PUBLIC: \(.*\)/\1/p" ../ip/*.c > $f - chmod 444 $f -fi - -f=../include/options_def.h -echo "Building $f" -rm -f $f -awk -f ../common/options.awk ../common/options.c > $f -chmod 444 $f - -f=../include/perl_extern.h -echo "Building $f" -rm -f $f -sed -n "s/^ \* PUBLIC: \(.*\)/\1/p" ../perl_api/*.xs ../perl_api/*.c > $f -chmod 444 $f - -f=../include/tcl_extern.h -echo "Building $f" -rm -f $f -sed -n "s/^ \* PUBLIC: \(.*\)/\1/p" ../tcl_api/*.c > $f -chmod 444 $f - -f=../include/tk_extern.h -echo "Building $f" -rm -f $f -sed -n "s/^ \* PUBLIC: \(.*\)/\1/p" ../tk/*.c > $f -chmod 444 $f - -f=../include/vi_extern.h -echo "Building $f" -rm -f $f -sed -n "s/^ \* PUBLIC: \(.*\)/\1/p" ../vi/*.c > $f -chmod 444 $f - -# Build tags files. -echo "Building tags files" -rm -f tags -ctags -w -d ../cl/*.[ch] ../common/*.[ch] ../ex/*.[ch] ../perl_api/*.[ch] \ - ../tcl_api/*.[ch] ../tk/*.[ch] ../vi/*.[ch] -chmod 444 tags diff --git a/build/install-sh b/build/install-sh deleted file mode 100755 index ab74c882e923..000000000000 --- a/build/install-sh +++ /dev/null @@ -1,238 +0,0 @@ -#!/bin/sh -# -# install - install a program, script, or datafile -# This comes from X11R5. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. -# - - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit="${DOITPROG-}" - - -# put in absolute paths if you don't have them in your path; or use env. vars. - -mvprog="${MVPROG-mv}" -cpprog="${CPPROG-cp}" -chmodprog="${CHMODPROG-chmod}" -chownprog="${CHOWNPROG-chown}" -chgrpprog="${CHGRPPROG-chgrp}" -stripprog="${STRIPPROG-strip}" -rmprog="${RMPROG-rm}" -mkdirprog="${MKDIRPROG-mkdir}" - -tranformbasename="" -transform_arg="" -instcmd="$mvprog" -chmodcmd="$chmodprog 0755" -chowncmd="" -chgrpcmd="" -stripcmd="" -rmcmd="$rmprog -f" -mvcmd="$mvprog" -src="" -dst="" -dir_arg="" - -while [ x"$1" != x ]; do - case $1 in - -c) instcmd="$cpprog" - shift - continue;; - - -d) dir_arg=true - shift - continue;; - - -m) chmodcmd="$chmodprog $2" - shift - shift - continue;; - - -o) chowncmd="$chownprog $2" - shift - shift - continue;; - - -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; - - -s) stripcmd="$stripprog" - shift - continue;; - - -t=*) transformarg=`echo $1 | sed 's/-t=//'` - shift - continue;; - - -b=*) transformbasename=`echo $1 | sed 's/-b=//'` - shift - continue;; - - *) if [ x"$src" = x ] - then - src=$1 - else - # this colon is to work around a 386BSD /bin/sh bug - : - dst=$1 - fi - shift - continue;; - esac -done - -if [ x"$src" = x ] -then - echo "install: no input file specified" - exit 1 -else - true -fi - -if [ x"$dir_arg" != x ]; then - dst=$src - src="" - - if [ -d $dst ]; then - instcmd=: - else - instcmd=mkdir - fi -else - -# Waiting for this to be detected by the "$instcmd $src $dsttmp" command -# might cause directories to be created, which would be especially bad -# if $src (and thus $dsttmp) contains '*'. - - if [ -f $src -o -d $src ] - then - true - else - echo "install: $src does not exist" - exit 1 - fi - - if [ x"$dst" = x ] - then - echo "install: no destination specified" - exit 1 - else - true - fi - -# If destination is a directory, append the input filename; if your system -# does not like double slashes in filenames, you may need to add some logic - - if [ -d $dst ] - then - dst="$dst"/`basename $src` - else - true - fi -fi - -## this sed command emulates the dirname command -dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` - -# Make sure that the destination directory exists. -# this part is taken from Noah Friedman's mkinstalldirs script - -# Skip lots of stat calls in the usual case. -if [ ! -d "$dstdir" ]; then -defaultIFS=' -' -IFS="${IFS-${defaultIFS}}" - -oIFS="${IFS}" -# Some sh's can't handle IFS=/ for some reason. -IFS='%' -set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` -IFS="${oIFS}" - -pathcomp='' - -while [ $# -ne 0 ] ; do - pathcomp="${pathcomp}${1}" - shift - - if [ ! -d "${pathcomp}" ] ; - then - $mkdirprog "${pathcomp}" - else - true - fi - - pathcomp="${pathcomp}/" -done -fi - -if [ x"$dir_arg" != x ] -then - $doit $instcmd $dst && - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi -else - -# If we're going to rename the final executable, determine the name now. - - if [ x"$transformarg" = x ] - then - dstfile=`basename $dst` - else - dstfile=`basename $dst $transformbasename | - sed $transformarg`$transformbasename - fi - -# don't allow the sed command to completely eliminate the filename - - if [ x"$dstfile" = x ] - then - dstfile=`basename $dst` - else - true - fi - -# Make a temp file name in the proper directory. - - dsttmp=$dstdir/#inst.$$# - -# Move or copy the file name to the temp name - - $doit $instcmd $src $dsttmp && - - trap "rm -f ${dsttmp}" 0 && - -# and set any options; do chmod last to preserve setuid bits - -# If any of these fail, we abort the whole thing. If we want to -# ignore errors from any of these, just make sure not to ignore -# errors from the above "$doit $instcmd $src $dsttmp" command. - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && - -# Now rename the file to the real destination. - - $doit $rmcmd -f $dstdir/$dstfile && - $doit $mvcmd $dsttmp $dstdir/$dstfile - -fi && - - -exit 0 diff --git a/build/pathnames.h.in b/build/pathnames.h.in deleted file mode 100644 index 09cf97460ae8..000000000000 --- a/build/pathnames.h.in +++ /dev/null @@ -1,45 +0,0 @@ -/* @(#)pathnames.h.in 8.4 (Berkeley) 6/26/96 */ - -#ifndef _PATH_BSHELL -#define _PATH_BSHELL "@vi_cv_path_shell@" -#endif - -#ifndef _PATH_EXRC -#define _PATH_EXRC ".exrc" -#endif - -#ifndef _PATH_MSGCAT -#define _PATH_MSGCAT "./" -#endif - -#ifndef _PATH_NEXRC -#define _PATH_NEXRC ".nexrc" -#endif - -#ifndef _PATH_PRESERVE -#define _PATH_PRESERVE "@vi_cv_path_preserve@" -#endif - -#ifndef _PATH_SYSV_PTY -#define _PATH_SYSV_PTY "/dev/ptmx" -#endif - -#ifndef _PATH_SENDMAIL -#define _PATH_SENDMAIL "@vi_cv_path_sendmail@" -#endif - -#ifndef _PATH_SYSEXRC -#define _PATH_SYSEXRC "/etc/vi.exrc" -#endif - -#ifndef _PATH_TAGS -#define _PATH_TAGS "tags" -#endif - -#ifndef _PATH_TMP -#define _PATH_TMP "/tmp" -#endif - -#ifndef _PATH_TTY -#define _PATH_TTY "/dev/tty" -#endif diff --git a/build/port.h.in b/build/port.h.in deleted file mode 100644 index 6696848ecc7d..000000000000 --- a/build/port.h.in +++ /dev/null @@ -1,185 +0,0 @@ -/* @(#)port.h.in 8.13 (Berkeley) 6/12/96 */ - -/* - * Declare the basic types, if they aren't already declared. Named and - * some system's db.h files protect them with __BIT_TYPES_DEFINED__. - */ -#ifndef __BIT_TYPES_DEFINED__ -#define __BIT_TYPES_DEFINED__ -@u_int8_decl@ -@int16_decl@ -@u_int16_decl@ -@int32_decl@ -@u_int32_decl@ -#endif - -@u_char_decl@ -@u_short_decl@ -@u_int_decl@ -@u_long_decl@ - -/* - * XXX - * Handle function prototypes. This steps on name space that vi doesn't - * control, but all of the other solutions are worse. - */ -#undef __P -#if defined(__STDC__) || defined(__cplusplus) -#define __P(protos) protos /* ANSI C prototypes */ -#else -#define __P(protos) () /* K&R C preprocessor */ -#endif - -/* - * XXX - * Some versions of System V changed the number of arguments to gettimeofday - * without changing the name. - */ -#ifdef HAVE_BROKEN_GETTIMEOFDAY -#define gettimeofday(tv, tz) gettimeofday(tv) -#endif - -/* - * XXX - * If we don't have mmap, we fake it with read and write, but we'll - * still need the header information. - */ -#ifndef HAVE_SYS_MMAN_H -#define MAP_SHARED 1 /* share changes */ -#define MAP_PRIVATE 2 /* changes are private */ -#define PROT_READ 0x1 /* pages can be read */ -#define PROT_WRITE 0x2 /* pages can be written */ -#define PROT_EXEC 0x4 /* pages can be executed */ -#endif - -/* - * XXX - * POSIX 1003.1 names for file descriptors. - */ -#ifndef STDERR_FILENO -#define STDIN_FILENO 0 /* ANSI C #defines */ -#define STDOUT_FILENO 1 -#define STDERR_FILENO 2 -#endif - -/* - * XXX - * POSIX 1003.1 names for seek settings. - */ -#ifndef SEEK_END -#define SEEK_SET 0 /* POSIX 1003.1 seek values */ -#define SEEK_CUR 1 -#define SEEK_END 2 -#endif - -/* - * Hack _POSIX_VDISABLE to \377 since Ultrix doesn't honor _POSIX_VDISABLE - * (treats it as ^@). The symptom is that the ^@ keystroke immediately - * drops core. - */ -#ifdef HAVE_BROKEN_VDISABLE -#undef _POSIX_VDISABLE -#define _POSIX_VDISABLE ((unsigned char)'\377') -#endif - -/* - * XXX - * POSIX 1003.1 tty disabling character. - */ -#ifndef _POSIX_VDISABLE -#define _POSIX_VDISABLE 0 /* Some systems used 0. */ -#endif - -/* - * XXX - * 4.4BSD extension to only set the software termios bits. - */ -#ifndef TCSASOFT /* 4.4BSD extension. */ -#define TCSASOFT 0 -#endif - -/* - * XXX - * POSIX 1003.1 maximum path length. - */ -#ifndef MAXPATHLEN -#ifdef PATH_MAX -#define MAXPATHLEN PATH_MAX -#else -#define MAXPATHLEN 1024 -#endif -#endif - -/* - * XXX - * MIN, MAX, historically in - */ -#ifndef MAX -#define MAX(_a,_b) ((_a)<(_b)?(_b):(_a)) -#endif -#ifndef MIN -#define MIN(_a,_b) ((_a)<(_b)?(_a):(_b)) -#endif - -/* - * XXX - * "DB" isn't always portable, and we want the private information. - */ -#define DB L__DB -#undef pgno_t /* IRIX has its own version. */ -#define pgno_t L__db_pgno_t - -/* - * XXX - * 4.4BSD extension to provide lock values in the open(2) call. - */ -#ifndef O_EXLOCK -#define O_EXLOCK 0 -#endif - -#ifndef O_SHLOCK -#define O_SHLOCK 0 -#endif - -/* - * XXX - * POSIX 1003.1 bad file format errno. - */ -#ifndef EFTYPE -#define EFTYPE EINVAL -#endif - -/* - * XXX - * POSIX 1003.2 RE length limit. - */ -#ifndef _POSIX2_RE_DUP_MAX -#define _POSIX2_RE_DUP_MAX 255 -#endif - -/* - * XXX - * 4.4BSD extension to determine if a program dropped core from the exit - * status. - */ -#ifndef WCOREDUMP -#define WCOREDUMP(a) 0 -#endif - -/* - * XXX - * Endian-ness of the machine. - */ -#if !defined(LITTLE_ENDIAN) -#define LITTLE_ENDIAN 1234 -#endif -#if !defined(BIG_ENDIAN) -#define BIG_ENDIAN 4321 -#endif -#if !defined(BYTE_ORDER) -#if WORDS_BIGENDIAN == 1 -#define BYTE_ORDER BIG_ENDIAN -#else -#define BYTE_ORDER LITTLE_ENDIAN -#endif -#endif diff --git a/build/recover.in b/build/recover.in deleted file mode 100644 index cfaf75f2c287..000000000000 --- a/build/recover.in +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/sh - -# -# @(#)recover.in 8.8 (Berkeley) 10/10/96 -# -# Script to recover nvi edit sessions. - -RECDIR="@vi_cv_path_preserve@" -SENDMAIL="@vi_cv_path_sendmail@" - -echo 'Recovering nvi editor sessions.' - -# Check editor backup files. -vibackup=`echo $RECDIR/vi.*` -if [ "$vibackup" != "$RECDIR/vi.*" ]; then - for i in $vibackup; do - # Only test files that are readable. - if test ! -r $i; then - continue - fi - - # Unmodified nvi editor backup files either have the - # execute bit set or are zero length. Delete them. - if test -x $i -o ! -s $i; then - rm $i - fi - done -fi - -# It is possible to get incomplete recovery files, if the editor crashes -# at the right time. -virecovery=`echo $RECDIR/recover.*` -if [ "$virecovery" != "$RECDIR/recover.*" ]; then - for i in $virecovery; do - # Only test files that are readable. - if test ! -r $i; then - continue - fi - - # Delete any recovery files that are zero length, corrupted, - # or that have no corresponding backup file. Else send mail - # to the user. - recfile=`awk '/^X-vi-recover-path:/{print $2}' < $i` - if test -n "$recfile" -a -s "$recfile"; then - $SENDMAIL -t < $i - else - rm $i - fi - done -fi diff --git a/build/spell.ok b/build/spell.ok deleted file mode 100644 index fc103f43602d..000000000000 --- a/build/spell.ok +++ /dev/null @@ -1,58 +0,0 @@ -ADDCPPFLAGS -ADDLDFLAGS -ADDLIBS -CPPFLAGS -FreeBSD -LDFLAGS -LIBS -Lite -NVI -NVI'S -NetBSD -Nvi -POSIX -Perl -README -Tcl -Tk -asnvi -asvi -autoconf -bindir -cd -contrib -csh -datadir -datafiles -db -distclean -env -filesystem -foo -gcc -ksh -lcurses -ldb -lm -lperl -ltcl -ltermcap -ltermlib -ltk -mandir -mkdir -ncurses -nex -nvi -nview -perl -perlinterp -setenv -sh -tcl -tclinterp -tcsh -terminfo -tknvi -usr -vi diff --git a/catalog/Makefile b/catalog/Makefile index 1044051ff389..11e71cce6d7b 100644 --- a/catalog/Makefile +++ b/catalog/Makefile @@ -1,7 +1,8 @@ -# @(#)Makefile 8.29 (Berkeley) 10/19/96 +# $Id: Makefile,v 9.0 2012/10/19 15:13:11 zy Exp $ -CAT= dutch english french german ru_SU.KOI8-R spanish swedish -FILES= ../cl/*.c ../common/*.c ../ex/*.c ../tk/*.c ../vi/*.c +CAT= dutch english french german polish ru_RU.KOI8-R spanish swedish \ + uk_UA.KOI8-U zh_CN.GB2312 +FILES= ../cl/*.c ../common/*.c ../ex/*.c ../vi/*.c all: dump ${CAT} @@ -18,13 +19,10 @@ ${CAT}: english.base print "DUPLICATE MESSAGE NUMBER " $$1; \ exit 1; \ } \ - for (; nline < $$1; ++nline) \ - print ""; \ print $0; \ }' | \ - sed -e '1s/^/VI_MESSAGE_CATALOG/' \ - -e '/"/s/^[^"]*"//' \ - -e '1!s/"$$/X/' > $@; \ + sed -e '1s/^/$$set 1~$$quote "~/; 1y/~/\n/' | \ + gencat $@ /dev/stdin; \ chmod 444 $@; \ if grep DUPLICATE $@ > /dev/null; then \ grep DUPLICATE $@; \ @@ -34,7 +32,8 @@ ${CAT}: english.base fi CHK= dutch.check english.check french.check german.check \ - ru_SU.KOI8-R.check spanish.check swedish.check + polish.check ru_RU.KOI8-R.check spanish.check swedish.check \ + uk_UA.KOI8-U.check zh_CN.GB2312.check check: ${CHK} ${CHK}: ${CAT} @echo "... $@"; \ @@ -63,19 +62,14 @@ ${CHK}: ${CAT} echo "Duplicate messages, both id and message (this is okay):"; \ sed '/^$$/d' < $$f.base | sort | uniq -c | \ awk '$$1 != 1 { print $$0 }' | sort -n; \ - echo =========================; \ - echo "Duplicate messages, just message (this is okay):"; \ - sed '/^$$/d' < $$f | sort | uniq -c | \ - awk '$$1 != 1 { print $$0 }' | sort -n; \ echo =========================) > $@ english.base: dump ${FILES} #Makefile ./dump ${FILES} |\ sed -e '/|/!d' \ -e 's/|/ "/' \ - -e 's/^"//' \ - -e 's/\\"/"/g' |\ - sort -n > $@ + -e 's/^"//' |\ + sort -nu > $@ dump: dump.c ${CC} -O -o dump dump.c diff --git a/catalog/README b/catalog/README index 15a706358869..42a728afbe2e 100644 --- a/catalog/README +++ b/catalog/README @@ -1,15 +1,9 @@ -# @(#)README 8.4 (Berkeley) 11/22/94 +# $Id: README,v 9.0 2012/10/19 17:06:15 zy Exp $ Generally, all non-system error and informational messages in nvi are catalog messages, i.e. they can be tailored to a specific langauge. -Command strings, usage strings, system errors and other "known text" -are not. It would certainly be possible to internationalize all the -text strings in nvi, but it's unclear that it's the right thing to do. - -First, there's no portable way to do message catalogs. The System V -scheme is a reasonable choice, but none of the 4BSD derived systems -support it. So, catalogs are completely implemented within nvi, and -don't require any library support. +Command strings, usage strings, system errors and other 'known text' +are not. Message catalogs in nvi are fairly simple. Every catalog message consists of two parts -- an initial number followed by a pipe (`|') @@ -33,19 +27,7 @@ For example: msgq(sp, M_ERR, "002|Error: %d %x", arg1, arg2); -is a format string that displays two arguments. It is possible, however, -to reorder the arguments or to not display all of them. The convention -nvi uses is the System V printf(3) convention, i.e. "%[0-9]*$" is the name -of a specific, numbered argument. For example: - - msgq(sp, M_ERR, "002|Error: %2$d %1$x", arg1, arg2); - -displays the arguments in reverse order. - -If the system supports this convention in its library printf routines -(as specified by the test #define NL_ARGMAX), nvi uses those routines. -Otherwise, there is some serious magic going on in common/msg.c to make -this all work. +is a format string that displays two arguments. Arguments to the msgq function are required to contain ONLY printable characters. No further translation is done by the msgq routine before @@ -54,14 +36,16 @@ displaying the message on the screen. For example, in the msgq call: msgq(sp, M_ERR, "003|File: %s", file_name); "file_name" must contain only printable characters. The routine -msg_print() returns a printable version of a string in allocated -memory. For example: +msg_print() returns a printable version of a string; the third argument +indicates whether the string needs to be freed. For example: char *p; + int nf; - p = msg_print(sp, file_name); - msgq(sp, M_ERR, M("003", "File: %s"), p); - FREE_SPACE(sp, p, 0); + p = msg_print(sp, file_name, &nf); + msgq(sp, M_ERR, "003|File: %s", p); + if (nf) + FREE_SPACE(sp, p, 0); makes sure that "file_name" is printable before calling the msgq routine. @@ -71,63 +55,40 @@ routine. The message catalogs themselves are maintained in two files. The first is the "base file" which contains two fields, a record number and the message itself. All base files are named using the convention -"vi_.base", e.g. the English one is "vi_english.base". For +".base", e.g. the English one is "english.base". For example: - 002 "Unable to create temporary file" - 003 "Warning: %s is not a regular file" - 004 "%s already locked, session is read-only" - 005 "%s: remove" - 006 "%s: close" - 007 "%s: remove" - 008 "%s: remove" - 009 "Read-only file, not written; use ! to override" - 010 "Read-only file, not written" + 002 "Line length overflow" + 003 "unable to delete line %lu" + 004 "unable to append to line %lu" + 005 "unable to insert at line %lu" + 006 "unable to store line %lu" + 007 "unable to get last line" -are the first few lines of the current vi_english.base file. Note that -message #1 is missing -- the first message of each catalog is a special -one, so that nvi can recognize message catalog files. It's added by the -Makefile script that creates the second version of the message catalog. +are the first few lines of the current english.base file. -The second file is the file used by nvi to access messages, and is a list -of the messages, one per line: +Before this file being converted to the second file, the POSIX formatted +message catalog file, by gencat(1), two lines: - VI_MESSAGE_CATALOG - Unable to create temporary fileX - Warning: %s is not a regular fileX - %s already locked, session is read-onlyX - %s: removeX - %s: closeX - %s: removeX - %s: removeX - Read-only file, not written; use ! to overrideX - Read-only file, not writtenX + $set 1 + $quote " -Note that all messages have had a trailing 'X' character appended. This -is to provide nvi a place to store a trailing nul for the message so that -C library routines that expect one won't be disappointed. +will be inserted before the base text to setup the set_id and the quote +character. So the double-quote needs to be escaped by a backslash to be +included in a message; same as the backslash itself. -These files are named for their language, e.g. "vi_english". The second -files are automatically created from the first files. +These files are named for their language, e.g. "english". However, a +locale(1) name is also recommended. To create a new catalog for nvi: -Copy the file vi_english.base to a file that you can modify , e.g. "cp -vi_english.base vi_german.base". For each of the messages in the file, -replace the message with the string that you want to use. To find out -what the arguments to a message are, I'm afraid you'll have to search -the source code for the message number. You can find them fairly quickly -by doing: +Copy the file english.base to a file that you can modify , e.g. "cp +english.base german.base". For each of the messages in the file, +replace the message with the string that you want to use. If you have +doubts about the meaning of a message, just email me. - cd ..; egrep '123\|' */*.[chys] - -I'm sorry that there's not an easier way, but I couldn't think of -anything that wasn't a lot of work. - -If, for some reason, you don't have the file vi_english.base, or you -have new sources for which you want to create a new base catalog, you -can create it by running the command "make english" in the catalog -directory. +A latest english.base can be created from source by running the command +"make english" in the catalog/ directory. Once you've translated all of the strings, then add your catalog to the "CAT=" line of the Makefile, and run the command "make catalog". This @@ -156,11 +117,11 @@ a single place. =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= To select a catalog when running nvi, set the "msgcat" option. If the value of this option ends with a '/', it is treated as the name of a -directory that contains a message catalog "vi_XXXX", where XXXX is the -value of the LANG environmental variable, if it's set, or the value of -the LC_MESSAGES environmental variable if it's not. If neither of those -environmental variables are set, or if the option doesn't end in a '/', -the option is treated as the full path name of the message catalog to use. +directory that contains a message catalog "$LC_MESSAGES", which is set +through the LC_MESSAGES environment variable but returned by setlocale(3). +Check the output of locale(1) to validate such a value. If the option +doesn't end in a '/', the option is treated as the full path name of the +message catalog to use. If any messages are missing from the catalog, the backup text (English) is used instead. diff --git a/catalog/dump.c b/catalog/dump.c index 0b3cd26520d5..4cd39df863b2 100644 --- a/catalog/dump.c +++ b/catalog/dump.c @@ -2,43 +2,17 @@ * Copyright (c) 1992, 1993, 1994 * The Regents of the University of California. All rights reserved. * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * %sccs.include.redist.c% */ #ifndef lint static char copyright[] = -"@(#) Copyright (c) 1992, 1993, 1994\n\ +"%Z% Copyright (c) 1992, 1993, 1994\n\ The Regents of the University of California. All rights reserved.\n"; #endif /* not lint */ #ifndef lint -static char sccsid[] = "@(#)dump.c 8.1 (Berkeley) 8/31/94"; +static char sccsid[] = "$Id: dump.c,v 8.2 2011/07/14 00:05:25 zy Exp $"; #endif /* not lint */ #include @@ -105,10 +79,10 @@ main(argc, argv) for (; *argv != NULL; ++argv) { if ((fp = fopen(*argv, "r")) == NULL) { perror(*argv); - exit (1); + return (1); } parse(fp); (void)fclose(fp); } - exit (0); + return (0); } diff --git a/catalog/dutch b/catalog/dutch deleted file mode 100644 index de9fb603bf8e..000000000000 --- a/catalog/dutch +++ /dev/null @@ -1,317 +0,0 @@ -VI_MESSAGE_CATALOG -regel te langX -kan regel %lu niet verwijderenX -kan niet toevoegen aan regel %luX -kan niet invoegen vooraan regel %luX -kan regel %lu niet opslaanX -kan laatste regel niet lezenX -Fout: kan regel %lu niet vindenX -log bestandX -Er vindt geen logging plaats, kan wijzigingen niet ongedaan makenX -geen wijzigingen om ongedaan te makenX -Er vindt geen logging plaats, kan wijzigingen niet ongedaan makenX -Er vindt geen logging plaats, herhaling niet mogelijkX -geen wijzigingen om te herhalenX -%s/%d: schrijven naar log misluktX -Vi's standaard invoer en uitvoer moeten aan een terminal gekoppeld zijnX -Merk %s: niet gezetX -Merk %s: de regel is verwijderdX -Merk %s: de cursor positie bestaat niet meerX -Fout: X -nieuw bestandX -naam veranderdX -gewijzigdX -ongewijzigdX -NIET BEVEILIGDX -niet schrijfbaarX -regel %lu uit %lu [%ld%%]X -leeg bestandX -regel %luX -Het bestand %s is geen message catalogX -Niet in staat om de standaard %s optie in te stellenX -Gebruik: %sX -set: optie %s onbekend: 'set all' laat alle opties zienX -set: [no]%s optie kan geen waarde hebbenX -set: %s optie moet een waarde hebbenX -set: %s optie: %sX -set: %s optie: %s: getal is te grootX -set: %s optie: %s is een ongeldige waardeX -set: %s optie moet een waarde hebbenX -Te weinig kolommen op het scherm, minder dan %dX -Aantal kolommen te groot, meer dan %dX -Te weinig regels op het scherm, minder dan %dX -Aantal regels te groot, meer dan %dX -De lisp optie is niet ondersteundX -messages niet uitgeschakeld: %sX -messages niet geactiveerd: %sX - -De paragraph optie moet karakter paren bevattenX -De section optie moet karakter paren bevattenX - - - -De standaard buffer is leegX -Buffer %s is leegX -Bestanden met newlines in de naam kunnen niet hersteld wordenX -Wijzigingen kunnen niet ongedaan gemaakt worden als deze sessie misluktX -Bestand wordt gecopieerd voor herstel...X -Herstel mechanisme werkt niet: %sX -Wijzigingen kunnen niet ongedaan gemaakt worden als deze sessie misluktX -Kon bestand niet veilig stellen: %sX -Bestand wordt gecopieerd voor herstel...X -Informatie met betrekking tot gebruiker nummer %u niet gevondenX -Kan herstel bestand niet beveiligenX -herstel buffer overgelopenX -herstel bestandX -%s: verminkt herstel bestandX -%s: verminkt herstel bestandX -U heeft geen bestand genaamd %s te herstellenX -U kan eerdere versies van dit bestand herstellenX -U kan nog meer bestanden herstellenX -kan geen email versturen: %sX -Bestand leeg; niets om te doorzoekenX -Einde van het bestand bereikt zonder dat het patroon gevonden isX -Geen vorig zoek patroonX -Patroon niet gevondenX -Begin van het bestand bereikt zonder dat het patroon gevonden isX -Zoek-operatie omgeslagenX -Bezig met zoeken...X -Geen niet-printbaar karakter gevondenX -Onbekend commandoX - -Commando niet beschikbaar in ex modeX -Aantal mag niet nul zijnX -%s: ongeldige regel aanduidingX -Interne fout in syntax tabel (%s: %s)X -Gebruik: %sX -%s: tijdelijke buffer niet vrijgegevenX -Vlag offset voor regel 1X -Vlag offset voorbij bestands eindeX -bestand/scherm veranderd tijdens uitvoeren van @ in een blokX -bestand/scherm veranderd tijdens uitvoeren van globaal/v commandoX -Ex commando mislukt: rest van commando(s) genegeerdX -Ex commando mislukt: gemappede toetsen genegeerdX -Het tweede adres is kleiner dan het eersteX -Geen merk naam opgegevenX -\\ niet gevolgd door / of ?X -Referentie aan een regel nummer kleiner dan 0X -Het %s commando is onbekendX -Adres waarde te grootX -Adres waarde te kleinX -Ongeldige adres combinatieX -Ongeldig adres: slechts %lu regels in het bestand aanwezigX -Ongeldig adres: het bestand is leegX -Het %s commando staat het adres 0 niet toeX -Geen afkortingen om weer te gevenX -Afkortingen moeten eindigen met een "woord" letterX -Afkortingen mogen geen tabulaties of spaties bevattenX -Afkortingen mogen geen woord/niet-woord karakters mengen, behalve aan het eindeX -"%s" is geen afkortingX -Vi commando mislukt: gemappede toetsen genegeerdX -Dit is het laatste bestandX -Dit is het eerste bestandX -Dit is het eerste bestandX -lijst met bestanden is leegX -Geen voorgaand commando om "!" te vervangenX -Geen bestandsnaam voor %%X -Geen bestandsnaam voor #X -Fout: execl: %sX -I/O fout: %sX -Bestand gewijzigd sinds laatste schrijfactie; schrijf het weg of gebruik ! om het te forcerenX -Kan uw home directory niet vindenX -Nieuwe huidige directory: %sX -Geen cut buffers aanwezigX -Het %s commando kan niet gebruikt worden in een globaal of v commandoX -%s/%s: niet gelezen: noch U noch root is de eigenaarX -%s/%s: niet gelezen: U bent niet de eigenaarX -%s/%s: niet gelezen: kan gewijzigd worden door andere gebruikersX -%s: niet gelezen: noch U noch root is de eigenaar"X -%s: niet gelezen: U bent niet de eigenaarX -%s: niet gelezen: kan gewijzigd worden door andere gebruikersX -Geen volgende regel om samen te voegenX -Geen input map entriesX -Geen command map entriesX -Het %s karakter kan niet ge-remapped wordenX -"%s" is niet gemappedX -Merk naam moet een enkel karakter zijnX -%s bestaat al, niet weggeschreven; gebruik ! om het te forcerenX -Nieuw .exrc bestand: %s. X -doel regel ligt in het blokX -Het open commando vereist dat de open optie actief isX -Het open commando is nog niet ondersteundX -Kan dit bestand niet veilig stellenX -Bestand veilig gesteldX -%s resulteert in te veel bestandsnamenX -Alleen echte bestanden en named pipes kunnen gelezen wordenX -%s: lees beveiliging niet beschikbaarX -Bezig met lezen...X -%s: %lu regels, %lu karaktersX -Geen achtergrond schermen aanwezigX -Het script commando is alleen beschikbaar in vi modeX -Geen comando om uit te voerenX -shiftwidth optie op 0 gezetX -Count te grootX -Count te kleinX -Reguliere expressie opgegeven; r vlag heeft geen betekenisX -De #, l en p vlaggen kunnen niet gecombineerd worden met de c vlag in vi modeX -Geen match gevondenX -Geen voorafgaande tag aanwezigX -Minder dan %s elementen op de tags stapel; gebruik :display t[ags]X -Geen bestand genaamd %s op de tags stapel; gebruik :display t[ags]X -Kies Enter om door te gaan: X -%s: tag niet gevondenX -%s: verminkte tag in %sX -%s: Het regel nummer van deze tag is voorbij het einde van het bestandX -De tags stapel is leegX -%s: zoek patroon niet gevondenX -%d andere bestanden te wijzigenX -Buffer %s is leegX -Bevestig wijziging? [n]X -OnderbrokenX -Geen voorafgaande buffer om uit te voerenX -Geen vorige reguliere expressieX -Het %s commando vereist dat er een bestand geladen isX -Gebruik: %sX -Het visual commando vereist dat de open optie actief isX - -Leeg bestandX -Geen voorafgaand F, f, T of t zoek commandoX -%s niet gevondenX -Geen voorafgaand bestand te bewerkenX -Cursor niet op een getalX -Getal wordt te grootX -Getal wordt te kleinX -Geen overeenkomstig karakter op deze regelX -Overeenkomstig karakter niet gevondenX -Geen karakters te vervangenX -Geen ander scherm aanwezigX -Karakters achter het zoek patroon, de regel offset, en/of het z commandoX -Geen voorafgaand zoek patroonX -Zoekopdracht na omslag teruggekeerd op originele positieX -Afkorting overschrijdt expansie limiet: karakters genegeerdX -Ongeldig karakter; quote to enterX -Reeds aan het begin van de invoerX -Niet meer karakters te verwijderenX -Verplaatsing voorbij het einde van het bestandX -Verplaatsing voorbij het einde van de regelX -Cursor niet verplaatstX -Reeds aan het begin van het bestandX -Verplaatsing voorbij het begin van het bestandX -Reeds in de eerste kolomX -Buffers moeten voor het commando opgegeven wordenX -Reeds bij het einde van het bestandX -Reeds bij het einde van de regelX -%s is geen vi commandoX -Gebruik: %sX -Geen karakters te verwijderenX -Het Q commando vereist de ex terminal interfaceX -Geen commando om te herhalenX -Het bestand is leegX -%s mag niet gebruikt worden als een verplaatsings commandoX -Al in commando modeX -Cursor niet in een woordX - -Windows optie waarde is te groot, maximum is %uX -ToevoegenX -VeranderenX -CommandoX -InvoegenX -VervangenX -Verplaatsing voorbij het eind van het schermX -Verplaatsing voorbij het begin van het schermX -Scherm moet meer dan %d regels hebben om het te kunnen splitsenX -Er zijn geen achtergrond schermenX -Er is geen achtergrond scherm waarin U bestand %s aan het bewerken bentX -U kan uw enige scherm niet in de achtergrond zettenX -Het scherm kan slechts verkleind worden tot %d regelsX -Het scherm kan niet kleinerX -Het scherm kan niet groterX - -Dit scherm kan niet gesuspend wordenX -Onderbroken: gemappede toetsen genegeerdX -vi: tijdelijke buffer niet vrijgegevenX -Deze terminal heeft geen %s toetsX -Er kan slechts een buffer opgegeven wordenX -Getal groter dan %luX -OnderbrokenX -Aanmaken van tijdelijk bestand is misluktX -Waarschuwing: %s is geen regulier bestandX -%s is al geopend, bestand is in deze sessie niet schrijfbaarX -%s: verwijdering misluktX -%s: sluiting misluktX -%s: verwijdering misluktX -%s: verwijdering misluktX -Bestand niet schrijfbaar, niet weggeschreven; gebruik ! om het te forcerenX -Bestand niet schrijfbaar, niet weggeschrevenX -%s bestaat al, niet weggeschreven; gebruik ! om het te forcerenX -%s bestaat al, niet weggeschrevenX -Gebruik ! om een incompleet bestand weg te schrijvenX -Bestand incompleet, niet weggeschrevenX -%s: bestand op disk nieuwer dan deze versie; gebruik ! om het te forcerenX -%s: bestand op disk nieuwer dan deze versieX -%s: schrijf beveiliging niet beschikbaarX -Bezig met schrijven...X -%s: WAARSCHUWING: BESTAND INCOMPLEETX -Reeds op de eerste tag van deze groepX -%s: nieuw bestand: %lu regels, %lu karaktersX -%s: %lu regels, %lu karaktersX -%s resulteert in te veel bestandsnamenX -%s: geen normaal bestandX -%s: U bent niet de eigenaarX -%s: kan gewijzigd worden door andere gebruikersX -Bestand gewijzigd sinds laatste schrijfactie; schrijf het weg of gebruik ! om het te forcerenX -Bestand gewijzigd sinds laatste schrijfactie; schrijf het weg of gebruik :edit! om het te forcerenX -Bestand gewijzigd sinds laatste schrijfactie; schrijf het weg of gebruik ! om het te forcerenX -Tijdelijk bestand; exit negeert wijzigingenX -Bestand niet schrijfbaar, wijzigingen niet automatisch weggeschrevenX -log opnieuw gestartX -Bevestig? [ynq]X -Druk op een toets om door te gaan: X -Druk op een toets om door te gaan [: voor meer ex commandos]: X -Druk op een toets om door te gaan [q om te stoppen]: X -Deze vorm van %s vereist de ex terminal interfaceX -Entering ex input mode.X -Commando mislukt, nog geen bestand geladen.X - doorgaan?X -Onverwacht character eventX -Onverwacht end-of-file eventX -Geen match gevonden voor dit patroonX -Onverwacht interrupt eventX -Onverwacht quit eventX -Onverwacht repaint eventX -Reeds op de laatste tag van deze groepX -Het %s command vereist de ex terminal interfaceX -Deze vorm van %s is niet ondersteund als de secure edit optie actief isX -Onverwacht string eventX -Onverwacht timeout eventX -Onverwacht write eventX - -Shell expansies zijn niet ondersteund als de secure edit optie actief isX -Het %s commando is niet ondersteund als de secure edit optie actief isX -set: %s mag niet uitgezet wordenX -Scherm te klein.X -toegevoegdX -gewijzigdX -verwijderdX -samengevoegdX -verplaatstX -verschovenX -gebufferdX -regelX -regelsX -Vi was niet geladen met een Tcl interpreterX -Bestand gewijzigd sinds het de laatste keer weg is geschreven.X -Shell expansie misluktX -Geen %s edit optie opgegevenX -Vi was niet geladen met een Perl interpreterX -Geen ex commando om uit te voerenX -Kies om commando uit te voeren, :q om te stoppenX -Gebruik "cscope help" voor uitlegX -Nog geen cscope connectie aanwezigX -%s: onbekend zoek type: gebruik een van %sX -%d: onbekende cscope sessieX -set: de %s optie mag nooit aangezet wordenX -set: de %s optie mag nooit op 0 gezet wordenX -%s: toegevoegd: %lu regels, %lu karaktersX -Onverwacht resize eventX -%d bestanden te wijzigenX diff --git a/catalog/dutch.base b/catalog/dutch.base index 2d8667e6d460..eca193c28c04 100644 --- a/catalog/dutch.base +++ b/catalog/dutch.base @@ -43,8 +43,7 @@ 044 "De lisp optie is niet ondersteund" 045 "messages niet uitgeschakeld: %s" 046 "messages niet geactiveerd: %s" -048 "De paragraph optie moet karakter paren bevatten" -049 "De section optie moet karakter paren bevatten" +047 "De %s optie moet karakter paren bevatten" 053 "De standaard buffer is leeg" 054 "Buffer %s is leeg" 055 "Bestanden met newlines in de naam kunnen niet hersteld worden" @@ -97,16 +96,16 @@ 103 "Ongeldig adres: het bestand is leeg" 104 "Het %s commando staat het adres 0 niet toe" 105 "Geen afkortingen om weer te geven" -106 "Afkortingen moeten eindigen met een "woord" letter" +106 "Afkortingen moeten eindigen met een \"woord\" letter" 107 "Afkortingen mogen geen tabulaties of spaties bevatten" 108 "Afkortingen mogen geen woord/niet-woord karakters mengen, behalve aan het einde" -109 ""%s" is geen afkorting" +109 "\"%s\" is geen afkorting" 110 "Vi commando mislukt: gemappede toetsen genegeerd" 111 "Dit is het laatste bestand" 112 "Dit is het eerste bestand" 113 "Dit is het eerste bestand" 114 "lijst met bestanden is leeg" -115 "Geen voorgaand commando om "!" te vervangen" +115 "Geen voorgaand commando om \"!\" te vervangen" 116 "Geen bestandsnaam voor %%" 117 "Geen bestandsnaam voor #" 118 "Fout: execl: %s" @@ -119,14 +118,14 @@ 125 "%s/%s: niet gelezen: noch U noch root is de eigenaar" 126 "%s/%s: niet gelezen: U bent niet de eigenaar" 127 "%s/%s: niet gelezen: kan gewijzigd worden door andere gebruikers" -128 "%s: niet gelezen: noch U noch root is de eigenaar"" +128 "%s: niet gelezen: noch U noch root is de eigenaar" 129 "%s: niet gelezen: U bent niet de eigenaar" 130 "%s: niet gelezen: kan gewijzigd worden door andere gebruikers" 131 "Geen volgende regel om samen te voegen" 132 "Geen input map entries" 133 "Geen command map entries" 134 "Het %s karakter kan niet ge-remapped worden" -135 ""%s" is niet gemapped" +135 "\"%s\" is niet gemapped" 136 "Merk naam moet een enkel karakter zijn" 137 "%s bestaat al, niet weggeschreven; gebruik ! om het te forceren" 138 "Nieuw .exrc bestand: %s. " @@ -296,7 +295,7 @@ 306 "Vi was niet geladen met een Perl interpreter" 307 "Geen ex commando om uit te voeren" 308 "Kies om commando uit te voeren, :q om te stoppen" -309 "Gebruik "cscope help" voor uitleg" +309 "Gebruik \"cscope help\" voor uitleg" 310 "Nog geen cscope connectie aanwezig" 311 "%s: onbekend zoek type: gebruik een van %s" 312 "%d: onbekende cscope sessie" diff --git a/catalog/dutch.check b/catalog/dutch.check deleted file mode 100644 index d651aec75cc2..000000000000 --- a/catalog/dutch.check +++ /dev/null @@ -1,37 +0,0 @@ -Unused message id's (this is okay): -001 -047 -050 -051 -052 -081 -176 -213 -229 -288 -========================= -MISSING ERROR MESSAGES (Please add!): -========================= -Extra error messages (just delete them): -========================= -MESSAGES WITH THE SAME MESSAGE ID's (FIX!): -========================= -Duplicate messages, both id and message (this is okay): -========================= -Duplicate messages, just message (this is okay): - 2 %s bestaat al, niet weggeschreven; gebruik ! om het te forcerenX - 2 %s resulteert in te veel bestandsnamenX - 2 %s: %lu regels, %lu karaktersX - 2 %s: verminkt herstel bestandX - 2 Bestand wordt gecopieerd voor herstel...X - 2 Buffer %s is leegX - 2 Dit is het eerste bestandX - 2 Er vindt geen logging plaats, kan wijzigingen niet ongedaan makenX - 2 OnderbrokenX - 2 Wijzigingen kunnen niet ongedaan gemaakt worden als deze sessie misluktX - 2 gewijzigdX - 2 set: %s optie moet een waarde hebbenX - 3 %s: verwijdering misluktX - 3 Bestand gewijzigd sinds laatste schrijfactie; schrijf het weg of gebruik ! om het te forcerenX - 4 Gebruik: %sX -========================= diff --git a/catalog/english b/catalog/english deleted file mode 100644 index f34451d9b6d5..000000000000 --- a/catalog/english +++ /dev/null @@ -1,317 +0,0 @@ -VI_MESSAGE_CATALOG -Line length overflowX -unable to delete line %luX -unable to append to line %luX -unable to insert at line %luX -unable to store line %luX -unable to get last lineX -Error: unable to retrieve line %luX -Log fileX -Logging not being performed, undo not possibleX -No changes to undoX -Logging not being performed, undo not possibleX -Logging not being performed, roll-forward not possibleX -No changes to re-doX -%s/%d: log put errorX -Vi's standard input and output must be a terminalX -Mark %s: not setX -Mark %s: the line was deletedX -Mark %s: cursor position no longer existsX -Error: X -new fileX -name changedX -modifiedX -unmodifiedX -UNLOCKEDX -readonlyX -line %lu of %lu [%ld%%]X -empty fileX -line %luX -The file %s is not a message catalogX -Unable to set default %s optionX -Usage: %sX -set: no %s option: 'set all' gives all option valuesX -set: [no]%s option doesn't take a valueX -set: %s option isn't a booleanX -set: %s option: %sX -set: %s option: %s: value overflowX -set: %s option: %s is an illegal numberX -set: %s option isn't a booleanX -Screen columns too small, less than %dX -Screen columns too large, greater than %dX -Screen lines too small, less than %dX -Screen lines too large, greater than %dX -The lisp option is not implementedX -messages not turned off: %sX -messages not turned on: %sX - -The paragraph option must be in two character groupsX -The section option must be in two character groupsX - - - -The default buffer is emptyX -Buffer %s is emptyX -Files with newlines in the name are unrecoverableX -Modifications not recoverable if the session failsX -Copying file for recovery...X -Preservation failed: %sX -Modifications not recoverable if the session failsX -File backup failed: %sX -Copying file for recovery...X -Information on user id %u not foundX -Unable to lock recovery fileX -Recovery file buffer overrunX -Recovery fileX -%s: malformed recovery fileX -%s: malformed recovery fileX -No files named %s, readable by you, to recoverX -There are older versions of this file for you to recoverX -There are other files for you to recoverX -not sending email: %sX -File empty; nothing to searchX -Reached end-of-file without finding the patternX -No previous search patternX -Pattern not foundX -Reached top-of-file without finding the patternX -Search wrappedX -Searching...X -No non-printable character foundX -Unknown command nameX - -%s: command not available in ex modeX -Count may not be zeroX -%s: bad line specificationX -Internal syntax table error (%s: %s)X -Usage: %sX -%s: temporary buffer not releasedX -Flag offset to before line 1X -Flag offset past end-of-fileX -@ with range running when the file/screen changedX -Global/v command running when the file/screen changedX -Ex command failed: pending commands discardedX -Ex command failed: mapped keys discardedX -The second address is smaller than the firstX -No mark name suppliedX -\\ not followed by / or ?X -Reference to a line number less than 0X -The %s command is unknownX -Address value overflowX -Address value underflowX -Illegal address combinationX -Illegal address: only %lu lines in the fileX -Illegal address: the file is emptyX -The %s command doesn't permit an address of 0X -No abbreviations to displayX -Abbreviations must end with a "word" characterX -Abbreviations may not contain tabs or spacesX -Abbreviations may not mix word/non-word characters, except at the endX -"%s" is not an abbreviationX -Vi command failed: mapped keys discardedX -No more files to editX -No previous files to editX -No previous files to rewindX -No file list to displayX -No previous command to replace "!"X -No filename to substitute for %%X -No filename to substitute for #X -Error: execl: %sX -I/O error: %sX -File modified since last complete write; write or use ! to overrideX -Unable to find home directory locationX -New current directory: %sX -No cut buffers to displayX -The %s command can't be used as part of a global or v commandX -%s/%s: not sourced: not owned by you or rootX -%s/%s: not sourced: not owned by youX -%s/%s: not sourced: writeable by a user other than the ownerX -%s: not sourced: not owned by you or rootX -%s: not sourced: not owned by youX -%s: not sourced: writeable by a user other than the ownerX -No following lines to joinX -No input map entriesX -No command map entriesX -The %s character may not be remappedX -"%s" isn't currently mappedX -Mark names must be a single characterX -%s exists, not written; use ! to overrideX -New exrc file: %sX -Destination line is inside move rangeX -The open command requires that the open option be setX -The open command is not yet implementedX -Preservation of this file not possibleX -File preservedX -%s: expanded into too many file namesX -Only regular files and named pipes may be readX -%s: read lock was unavailableX -Reading...X -%s: %lu lines, %lu charactersX -No background screens to displayX -The script command is only available in vi modeX -No command to executeX -shiftwidth option set to 0X -Count overflowX -Count underflowX -Regular expression specified; r flag meaninglessX -The #, l and p flags may not be combined with the c flag in vi modeX -No match foundX -No previous tag enteredX -Less than %s entries on the tags stack; use :display t[ags]X -No file %s on the tags stack to return to; use :display t[ags]X -Press Enter to continue: X -%s: tag not foundX -%s: corrupted tag in %sX -%s: the tag's line number is past the end of the fileX -The tags stack is emptyX -%s: search pattern not foundX -%d more files to editX -Buffer %s is emptyX -Confirm change? [n]X -InterruptedX -No previous buffer to executeX -No previous regular expressionX -The %s command requires that a file have already been read inX -Usage: %sX -The visual command requires that the open option be setX - -Empty fileX -No previous F, f, T or t searchX -%s not foundX -No previous file to editX -Cursor not in a numberX -Resulting number too largeX -Resulting number too smallX -No match character on this lineX -Matching character not foundX -No characters to replaceX -No other screen to switch toX -Characters after search string, line offset and/or z commandX -No previous search patternX -Search wrapped to original positionX -Abbreviation exceeded expansion limit: characters discardedX -Illegal character; quote to enterX -Already at the beginning of the insertX -No more characters to eraseX -Movement past the end-of-fileX -Movement past the end-of-lineX -No cursor movement madeX -Already at the beginning of the fileX -Movement past the beginning of the fileX -Already in the first columnX -Buffers should be specified before the commandX -Already at end-of-fileX -Already at end-of-lineX -%s isn't a vi commandX -Usage: %sX -No characters to deleteX -The Q command requires the ex terminal interfaceX -No command to repeatX -The file is emptyX -%s may not be used as a motion commandX -Already in command modeX -Cursor not in a wordX - -Windows option value is too large, max is %uX -AppendX -ChangeX -CommandX -InsertX -ReplaceX -Movement past the end-of-screenX -Movement past the beginning-of-screenX -Screen must be larger than %d lines to splitX -There are no background screensX -There's no background screen editing a file named %sX -You may not background your only displayed screenX -The screen can only shrink to %d rowsX -The screen cannot shrinkX -The screen cannot growX - -This screen may not be suspendedX -Interrupted: mapped keys discardedX -vi: temporary buffer not releasedX -This terminal has no %s keyX -Only one buffer may be specifiedX -Number larger than %luX -InterruptedX -Unable to create temporary fileX -Warning: %s is not a regular fileX -%s already locked, session is read-onlyX -%s: removeX -%s: closeX -%s: removeX -%s: removeX -Read-only file, not written; use ! to overrideX -Read-only file, not writtenX -%s exists, not written; use ! to overrideX -%s exists, not writtenX -Partial file, not written; use ! to overrideX -Partial file, not writtenX -%s: file modified more recently than this copy; use ! to overrideX -%s: file modified more recently than this copyX -%s: write lock was unavailableX -Writing...X -%s: WARNING: FILE TRUNCATEDX -Already at the first tag of this groupX -%s: new file: %lu lines, %lu charactersX -%s: %lu lines, %lu charactersX -%s expanded into too many file namesX -%s: not a regular fileX -%s: not owned by youX -%s: accessible by a user other than the ownerX -File modified since last complete write; write or use ! to overrideX -File modified since last complete write; write or use :edit! to overrideX -File modified since last complete write; write or use ! to overrideX -File is a temporary; exit will discard modificationsX -File readonly, modifications not auto-writtenX -Log restartedX -confirm? [ynq]X -Press any key to continue: X -Press any key to continue [: to enter more ex commands]: X -Press any key to continue [q to quit]: X -That form of %s requires the ex terminal interfaceX -Entering ex input mode.X -Command failed, no file read in yet.X - cont?X -Unexpected character eventX -Unexpected end-of-file eventX -No matches for queryX -Unexpected interrupt eventX -Unexpected quit eventX -Unexpected repaint eventX -Already at the last tag of this groupX -The %s command requires the ex terminal interfaceX -That form of %s is not supported when the secure edit option is setX -Unexpected string eventX -Unexpected timeout eventX -Unexpected write eventX - -Shell expansions not supported when the secure edit option is setX -The %s command is not supported when the secure edit option is setX -set: the %s option may not be turned offX -Display too small.X -addedX -changedX -deletedX -joinedX -movedX -shiftedX -yankedX -lineX -linesX -Vi was not loaded with a Tcl interpreterX -File modified since last write.X -Shell expansion failedX -No %s edit option specifiedX -Vi was not loaded with a Perl interpreterX -No ex command to executeX -Enter to execute a command, :q to exitX -Use "cscope help" for helpX -No cscope connections runningX -%s: unknown search type: use one of %sX -%d: no such cscope sessionX -set: the %s option may never be turned onX -set: the %s option may never be set to 0X -%s: appended: %lu lines, %lu charactersX -Unexpected resize eventX -%d files to editX diff --git a/catalog/english.base b/catalog/english.base deleted file mode 100644 index 6d8d7bf60bbf..000000000000 --- a/catalog/english.base +++ /dev/null @@ -1,309 +0,0 @@ -002 "Line length overflow" -003 "unable to delete line %lu" -004 "unable to append to line %lu" -005 "unable to insert at line %lu" -006 "unable to store line %lu" -007 "unable to get last line" -008 "Error: unable to retrieve line %lu" -009 "Log file" -010 "Logging not being performed, undo not possible" -011 "No changes to undo" -012 "Logging not being performed, undo not possible" -013 "Logging not being performed, roll-forward not possible" -014 "No changes to re-do" -015 "%s/%d: log put error" -016 "Vi's standard input and output must be a terminal" -017 "Mark %s: not set" -018 "Mark %s: the line was deleted" -019 "Mark %s: cursor position no longer exists" -020 "Error: " -021 "new file" -022 "name changed" -023 "modified" -024 "unmodified" -025 "UNLOCKED" -026 "readonly" -027 "line %lu of %lu [%ld%%]" -028 "empty file" -029 "line %lu" -030 "The file %s is not a message catalog" -031 "Unable to set default %s option" -032 "Usage: %s" -033 "set: no %s option: 'set all' gives all option values" -034 "set: [no]%s option doesn't take a value" -035 "set: %s option isn't a boolean" -036 "set: %s option: %s" -037 "set: %s option: %s: value overflow" -038 "set: %s option: %s is an illegal number" -039 "set: %s option isn't a boolean" -040 "Screen columns too small, less than %d" -041 "Screen columns too large, greater than %d" -042 "Screen lines too small, less than %d" -043 "Screen lines too large, greater than %d" -044 "The lisp option is not implemented" -045 "messages not turned off: %s" -046 "messages not turned on: %s" -048 "The paragraph option must be in two character groups" -049 "The section option must be in two character groups" -053 "The default buffer is empty" -054 "Buffer %s is empty" -055 "Files with newlines in the name are unrecoverable" -056 "Modifications not recoverable if the session fails" -057 "Copying file for recovery..." -058 "Preservation failed: %s" -059 "Modifications not recoverable if the session fails" -060 "File backup failed: %s" -061 "Copying file for recovery..." -062 "Information on user id %u not found" -063 "Unable to lock recovery file" -064 "Recovery file buffer overrun" -065 "Recovery file" -066 "%s: malformed recovery file" -067 "%s: malformed recovery file" -068 "No files named %s, readable by you, to recover" -069 "There are older versions of this file for you to recover" -070 "There are other files for you to recover" -071 "not sending email: %s" -072 "File empty; nothing to search" -073 "Reached end-of-file without finding the pattern" -074 "No previous search pattern" -075 "Pattern not found" -076 "Reached top-of-file without finding the pattern" -077 "Search wrapped" -078 "Searching..." -079 "No non-printable character found" -080 "Unknown command name" -082 "%s: command not available in ex mode" -083 "Count may not be zero" -084 "%s: bad line specification" -085 "Internal syntax table error (%s: %s)" -086 "Usage: %s" -087 "%s: temporary buffer not released" -088 "Flag offset to before line 1" -089 "Flag offset past end-of-file" -090 "@ with range running when the file/screen changed" -091 "Global/v command running when the file/screen changed" -092 "Ex command failed: pending commands discarded" -093 "Ex command failed: mapped keys discarded" -094 "The second address is smaller than the first" -095 "No mark name supplied" -096 "\\ not followed by / or ?" -097 "Reference to a line number less than 0" -098 "The %s command is unknown" -099 "Address value overflow" -100 "Address value underflow" -101 "Illegal address combination" -102 "Illegal address: only %lu lines in the file" -103 "Illegal address: the file is empty" -104 "The %s command doesn't permit an address of 0" -105 "No abbreviations to display" -106 "Abbreviations must end with a "word" character" -107 "Abbreviations may not contain tabs or spaces" -108 "Abbreviations may not mix word/non-word characters, except at the end" -109 ""%s" is not an abbreviation" -110 "Vi command failed: mapped keys discarded" -111 "No more files to edit" -112 "No previous files to edit" -113 "No previous files to rewind" -114 "No file list to display" -115 "No previous command to replace "!"" -116 "No filename to substitute for %%" -117 "No filename to substitute for #" -118 "Error: execl: %s" -119 "I/O error: %s" -120 "File modified since last complete write; write or use ! to override" -121 "Unable to find home directory location" -122 "New current directory: %s" -123 "No cut buffers to display" -124 "The %s command can't be used as part of a global or v command" -125 "%s/%s: not sourced: not owned by you or root" -126 "%s/%s: not sourced: not owned by you" -127 "%s/%s: not sourced: writeable by a user other than the owner" -128 "%s: not sourced: not owned by you or root" -129 "%s: not sourced: not owned by you" -130 "%s: not sourced: writeable by a user other than the owner" -131 "No following lines to join" -132 "No input map entries" -133 "No command map entries" -134 "The %s character may not be remapped" -135 ""%s" isn't currently mapped" -136 "Mark names must be a single character" -137 "%s exists, not written; use ! to override" -138 "New exrc file: %s" -139 "Destination line is inside move range" -140 "The open command requires that the open option be set" -141 "The open command is not yet implemented" -142 "Preservation of this file not possible" -143 "File preserved" -144 "%s: expanded into too many file names" -145 "Only regular files and named pipes may be read" -146 "%s: read lock was unavailable" -147 "Reading..." -148 "%s: %lu lines, %lu characters" -149 "No background screens to display" -150 "The script command is only available in vi mode" -151 "No command to execute" -152 "shiftwidth option set to 0" -153 "Count overflow" -154 "Count underflow" -155 "Regular expression specified; r flag meaningless" -156 "The #, l and p flags may not be combined with the c flag in vi mode" -157 "No match found" -158 "No previous tag entered" -159 "Less than %s entries on the tags stack; use :display t[ags]" -160 "No file %s on the tags stack to return to; use :display t[ags]" -161 "Press Enter to continue: " -162 "%s: tag not found" -163 "%s: corrupted tag in %s" -164 "%s: the tag's line number is past the end of the file" -165 "The tags stack is empty" -166 "%s: search pattern not found" -167 "%d more files to edit" -168 "Buffer %s is empty" -169 "Confirm change? [n]" -170 "Interrupted" -171 "No previous buffer to execute" -172 "No previous regular expression" -173 "The %s command requires that a file have already been read in" -174 "Usage: %s" -175 "The visual command requires that the open option be set" -177 "Empty file" -178 "No previous F, f, T or t search" -179 "%s not found" -180 "No previous file to edit" -181 "Cursor not in a number" -182 "Resulting number too large" -183 "Resulting number too small" -184 "No match character on this line" -185 "Matching character not found" -186 "No characters to replace" -187 "No other screen to switch to" -188 "Characters after search string, line offset and/or z command" -189 "No previous search pattern" -190 "Search wrapped to original position" -191 "Abbreviation exceeded expansion limit: characters discarded" -192 "Illegal character; quote to enter" -193 "Already at the beginning of the insert" -194 "No more characters to erase" -195 "Movement past the end-of-file" -196 "Movement past the end-of-line" -197 "No cursor movement made" -198 "Already at the beginning of the file" -199 "Movement past the beginning of the file" -200 "Already in the first column" -201 "Buffers should be specified before the command" -202 "Already at end-of-file" -203 "Already at end-of-line" -204 "%s isn't a vi command" -205 "Usage: %s" -206 "No characters to delete" -207 "The Q command requires the ex terminal interface" -208 "No command to repeat" -209 "The file is empty" -209 "The file is empty" -210 "%s may not be used as a motion command" -211 "Already in command mode" -212 "Cursor not in a word" -214 "Windows option value is too large, max is %u" -215 "Append" -216 "Change" -217 "Command" -218 "Insert" -219 "Replace" -220 "Movement past the end-of-screen" -221 "Movement past the beginning-of-screen" -222 "Screen must be larger than %d lines to split" -223 "There are no background screens" -224 "There's no background screen editing a file named %s" -225 "You may not background your only displayed screen" -226 "The screen can only shrink to %d rows" -227 "The screen cannot shrink" -228 "The screen cannot grow" -230 "This screen may not be suspended" -231 "Interrupted: mapped keys discarded" -232 "vi: temporary buffer not released" -233 "This terminal has no %s key" -234 "Only one buffer may be specified" -235 "Number larger than %lu" -236 "Interrupted" -237 "Unable to create temporary file" -238 "Warning: %s is not a regular file" -239 "%s already locked, session is read-only" -240 "%s: remove" -241 "%s: close" -242 "%s: remove" -243 "%s: remove" -244 "Read-only file, not written; use ! to override" -245 "Read-only file, not written" -246 "%s exists, not written; use ! to override" -247 "%s exists, not written" -248 "Partial file, not written; use ! to override" -249 "Partial file, not written" -250 "%s: file modified more recently than this copy; use ! to override" -251 "%s: file modified more recently than this copy" -252 "%s: write lock was unavailable" -253 "Writing..." -254 "%s: WARNING: FILE TRUNCATED" -255 "Already at the first tag of this group" -256 "%s: new file: %lu lines, %lu characters" -257 "%s: %lu lines, %lu characters" -258 "%s expanded into too many file names" -259 "%s: not a regular file" -260 "%s: not owned by you" -261 "%s: accessible by a user other than the owner" -262 "File modified since last complete write; write or use ! to override" -263 "File modified since last complete write; write or use :edit! to override" -264 "File modified since last complete write; write or use ! to override" -265 "File is a temporary; exit will discard modifications" -266 "File readonly, modifications not auto-written" -267 "Log restarted" -268 "confirm? [ynq]" -269 "Press any key to continue: " -270 "Press any key to continue [: to enter more ex commands]: " -271 "Press any key to continue [q to quit]: " -272 "That form of %s requires the ex terminal interface" -273 "Entering ex input mode." -274 "Command failed, no file read in yet." -275 " cont?" -276 "Unexpected character event" -277 "Unexpected end-of-file event" -278 "No matches for query" -279 "Unexpected interrupt event" -280 "Unexpected quit event" -281 "Unexpected repaint event" -282 "Already at the last tag of this group" -283 "The %s command requires the ex terminal interface" -284 "That form of %s is not supported when the secure edit option is set" -285 "Unexpected string event" -286 "Unexpected timeout event" -287 "Unexpected write event" -289 "Shell expansions not supported when the secure edit option is set" -290 "The %s command is not supported when the secure edit option is set" -291 "set: the %s option may not be turned off" -292 "Display too small." -293 "added" -294 "changed" -295 "deleted" -296 "joined" -297 "moved" -298 "shifted" -299 "yanked" -300 "line" -301 "lines" -302 "Vi was not loaded with a Tcl interpreter" -303 "File modified since last write." -304 "Shell expansion failed" -304 "Shell expansion failed" -305 "No %s edit option specified" -306 "Vi was not loaded with a Perl interpreter" -307 "No ex command to execute" -308 "Enter to execute a command, :q to exit" -309 "Use "cscope help" for help" -310 "No cscope connections running" -311 "%s: unknown search type: use one of %s" -312 "%d: no such cscope session" -313 "set: the %s option may never be turned on" -314 "set: the %s option may never be set to 0" -315 "%s: appended: %lu lines, %lu characters" -316 "Unexpected resize event" -317 "%d files to edit" diff --git a/catalog/english.check b/catalog/english.check deleted file mode 100644 index 51093785c87c..000000000000 --- a/catalog/english.check +++ /dev/null @@ -1,36 +0,0 @@ -Unused message id's (this is okay): -001 -047 -050 -051 -052 -081 -176 -229 -288 -========================= -MISSING ERROR MESSAGES (Please add!): -========================= -Extra error messages (just delete them): -========================= -MESSAGES WITH THE SAME MESSAGE ID's (FIX!): -========================= -Duplicate messages, both id and message (this is okay): - 2 209 "The file is empty" - 2 304 "Shell expansion failed" -========================= -Duplicate messages, just message (this is okay): - 2 %s exists, not written; use ! to overrideX - 2 %s: %lu lines, %lu charactersX - 2 %s: malformed recovery fileX - 2 Buffer %s is emptyX - 2 Copying file for recovery...X - 2 InterruptedX - 2 Logging not being performed, undo not possibleX - 2 Modifications not recoverable if the session failsX - 2 No previous search patternX - 2 set: %s option isn't a booleanX - 3 %s: removeX - 3 File modified since last complete write; write or use ! to overrideX - 4 Usage: %sX -========================= diff --git a/catalog/french b/catalog/french deleted file mode 100644 index a75c486ef9ba..000000000000 --- a/catalog/french +++ /dev/null @@ -1,317 +0,0 @@ -VI_MESSAGE_CATALOG -D‚passement de longueur de ligneX -impossible de supprimer la ligne %luX -impossible d'ajouter … la ligne %luX -impossible d'ins‚rer devant la ligne %luX -impossible de stocker la ligne %luX -impossible d'obtenir la derniŠre ligneX -Erreur : impossible de r‚cup‚rer la ligne %luX -Fichier journalX -Aucune connexion n'‚tant effectu‚e, impossible d'annulerX -Aucune action … annulerX -Aucune connexion n'‚tant effectu‚e, impossible d'annulerX -Aucune connexion n'‚tant effectu‚e, reprise actualis‚e impossibleX -Aucune action … refaireX -%s/%d : Erreur d'‚criture de journalX -L'entr‚e et la sortie Vi standards doivent ˆtre un terminalX -Marque %s : non d‚finieX -Marque %s : la ligne a ‚t‚ supprim‚eX -Marque %s : la position du curseur n'existe plusX -Erreur : X -nouveau fichierX -le nom a chang‚X -modifi‚X -non modifi‚X -DEVERROUILLEX -lecture seuleX -ligne %lu de %lu [%ld%%]X -fichier videX -ligne %luX -Ce fichier %s n'est pas un catalogue de messagesX -Impossible de configurer option %s par d‚fautX -Utilisation : %sX -D‚finition : pas d'option %s : 'tout d‚finir' donne toutes les valeurs optionnellesX -D‚finition : option [no]%s ne prend pas de valeurX -D‚finition : l'option %s n'est pas bool‚enneX -D‚finition : option %s : %sX -D‚finition : option %s : %s : D‚passement de valeurX -D‚finition : option %s : %s n'est pas un nombre valideX -D‚finition : l'option %s n'est pas bool‚enneX -Les colonnes de l'‚cran sont trop petites, inf‚rieures … %dX -Les colonnes de l'‚cran sont trop grandes, sup‚rieures … %dX -Les lignes de l'‚cran sont trop courtes, inf‚rieures … %dX -Les lignes de l'‚cran sont trop longues, sup‚rieures … %dX -L'option lisp n'est pas impl‚ment‚eX -Les messages ne sont pas d‚sactiv‚s : %sX -Les messages ne sont pas activ‚s : %sX - -L'option de paragraphe doit ˆtre en groupe de deux caractŠresX -L'option de section doit ˆtre en groupe de deux caractŠresX - - - -Le tampon par d‚faut est videX -Le tampon %s est videX -Les fichiers dont le nom contient des caractŠres de saut de ligne sont irr‚cup‚rablesX -Impossible de r‚cup‚rer les modifications si la session ‚choueX -Copie en cours du fichier pour r‚cup‚ration...X -La pr‚servation a ‚chou‚ : %sX -Impossible de r‚cup‚rer les modifications si la session ‚choueX -La sauvegarde du fichier a ‚chou‚ : %sX -Copie en cours du fichier pour r‚cup‚ration...X -Les renseignements sur l'identit‚ %u de l'utilisateur sont introuvablesX -Impossible de verrouiller le fichier de r‚cup‚rationX -D‚bordement de tampon du fichier de r‚cup‚rationX -Fichier de r‚cup‚rationX -%s : Fichier de r‚cup‚ration malform‚X -%s : Fichier de r‚cup‚ration malform‚X -Aucun fichier nomm‚ %s … r‚cup‚rer, que vous puissiez lireX -Il existe des versions r‚cup‚rables ant‚rieures … ce fichierX -Vous avez d'autres fichiers … r‚cup‚rerX -pas d'envoi d'email : %sX -Fichier vide, rien … rechercherX -Fin de fichier atteinte sans trouver le motifX -Pas de motif de recherche pr‚c‚dentX -Motif introuvableX -D‚but du fichier atteint sans trouver le motifX -La recherche est revenue … son point de d‚partX -Recherche en cours...X -CaractŠre non-imprimable introuvableX -Nom de commande inconnuX - -%s : Commande non disponible en ex modeX -Le compte ne peut ˆtre z‚roX -%s : mauvaise sp‚cification de ligneX -Erreur de tableau de syntaxe interne (%s: %s)X -Utilisation : %sX -%s : tampon temporaire non lib‚r‚X -D‚calage de drapeau hors de la ligne 1X -D‚calage de drapeau hors de la fin du fichierX -@ avec plage, en cours d'ex‚cution quand le fichier/l'‚cran a chang‚X -Commande Global/v en cours d'ex‚cution quand le fichier/l'‚cran a chang‚X -La commande ex a ‚chou‚ : commandes en attente abandonn‚esX -La commande ex a ‚chou‚ : les touches affect‚es sont abandonn‚esX -La deuxiŠme adresse est plus petite que la premiŠreX -Aucun nom de marque fourniX -\\ pas suivi par / ou ?X -R‚f‚rence … un num‚ro de ligne inf‚rieure … 0X -La commande %s est inconnueX -D‚passement de la valeur adresseX -D‚passement n‚gatif de la valeur adresseX -Combinaison d'adresse non valideX -Adresse non valide : il n'y a que des lignes %lu dans le fichierX -Adresse non valide : le fichier est videX -La commande %s ne permet pas une adresse de 0X -Pas d'abr‚viations … afficherX -Les abr‚viations doivent finir par un caractŠre"motX -Les abr‚viations ne peuvent pas contenir de tabulations ni d'espacesX -Les abr‚viations ne peuvent pas contenir un m‚lange de caractŠres mot/non-mot, sauf … la finX -"%s" n'est pas une abr‚viationX -La commande Vi a ‚chou‚ : Les touches affect‚es ont ‚t‚ abandonn‚esX -Plus de fichiers … ‚diterX -Pas de fichiers pr‚c‚dents … ‚diterX -Pas de fichiers pr‚c‚dents … rembobinerX -Pas de liste de fichiers … afficherX -Pas de commande pr‚c‚dente … remplacer"!"X -Pas de nom de fichier … substituer … %%X -Pas de nom de fichier … substituer … #X -Erreur : execl : %sX -Erreur E/S : %sX -Fichier modifi‚ depuis la derniŠre ‚criture complŠte ; ‚crire ou utiliser ! pour outrepasserX -Impossible de trouver l'emplacement du r‚pertoire d'origineX -Nouveau r‚pertoire en cours : %sX -Pas de tampon de coupure … afficherX -La commande %s ne peut pas ˆtre utilis‚e … l'int‚rieur d'une commande globale ou commande vX -%s/%s : ‚chec de source : ni vous ni le super-utilisateur n'ˆtes les propri‚taires X -%s/%s : ‚chec de source : vous n'ˆtes pas le propri‚taireX -%s/%s : ‚chec de source : peut ˆtre ‚crit par un utilisateur autre que le propri‚taireX -%s : ‚chec de source : ni vous ni le super-utilisateur n'ˆtes les propri‚tairesX -%s : ‚chec de source : vous n'ˆtes pas le propri‚taireX -%s : ‚chec de source : peut ˆtre ‚crit par un utilisateur autre que le propri‚taireX -Pas de lignes suivantes … joindreX -Pas d'entr‚es de mappage d'entr‚eX -Pas d'entr‚es de mappage de commandesX -Le caractŠre %s ne peut pas ˆtre remapp‚X -"%s" n'est pas actuellement mapp‚X -Les noms de marque ne doivent avoir qu'un caractŠreX -%s existe, non enregistr‚; utiliser ! pour outrepasserX -Nouveau fichier exrc : %sX -La ligne de destination est … l'int‚rieur de la plage … d‚placerX -La commande ouverte n‚cessite que l'option ouverte soit d‚finieX -La commande ouverte n'est pas encore impl‚ment‚eX -La pr‚servation de ce fichier est impossibleX -Fichier pr‚serv‚X -%s: ‚tendu dans trop de noms de fichiersX -Vous ne pouvez lire que les fichiers standards et les canaux de transmission nomm‚sX -%s: Interdiction de lecture non disponibleX -Lecture en cours...X -%s: %lu lignes, %lu caractŠresX -Pas d'‚crans d'arriŠre-plan … afficherX -La commande script n'est disponible qu'en mode viX -Pas de commande … ex‚cuterX -Option de largeur de d‚calage d‚finie sur 0X -Compter d‚passementX -Compter d‚passement n‚gatifX -Expression standard sp‚cifi‚e; drapeau r superfluX -Vous ne pouvez pas en mode vi, combiner les drapeaux #, l et p avec le drapeau cX -Aucune correspondance trouv‚eX -Aucune marque pr‚c‚dente entr‚eX -Moins de %s entr‚es dans la pile de marques ; utilisez t[ags]X -Pas de fichier %s vers lequel retourner dans la pile de marques ; utiliser : affichage t[ags]X -Appuyez sur Entr‚e pour continuer :X -%s : marque introuvableX -%s : marque corrompue en %sX -%s : le num‚ro de ligne de la marque d‚passe la fin du fichierX -La pile de marques est videX -%s : motif de recherche introuvableX -%d fichiers suppl‚mentaires … ‚diterX -Le tampon %s est vide -Confirmer les changements ? [n]X -InterrompuX -Pas de tampon pr‚c‚dent … ex‚cuterX -Pas d'expression standard pr‚c‚denteX -La commande %s n‚cessite qu'un fichier ait d‚j… ‚t‚ lu en m‚moireX -Utilisation : %sX -La commande visuelle n‚cessite que l'option ouverte soit d‚finieX - -Fichier videX -Pas de recherche pr‚c‚dente F, f, T ou tX -%s introuvableX -Pas de fichier pr‚c‚dent … ‚diterX -Le curseur n'est pas dans un nombreX -Le nombre obtenu est trop grandX -Le nombre obtenu est trop petitX -Pas de correspondance de caractŠre sur cette ligneX -CaractŠre correspondant introuvableX -Pas de caractŠres … remplacerX -Pas d'autre ‚cran vers lequel basculerX -CaractŠres aprŠs la chaŒne de recherche, d‚calage de ligne et/ou commande zX -Pas de motif de recherche pr‚c‚dentX -La recherche est revenue … son point de d‚partX -L'abr‚viation a d‚pass‚ la limite de l'expansion : caractŠres abandonn‚sX -CaractŠre non valide ; guillemet pour saisirX -D‚j… au d‚but de l'insertionX -Plus de caractŠres … effacerX -D‚placement hors de fin de fichierX -D‚placement hors de fin de ligneX -Aucun mouvement de curseur n'a ‚t‚ effectu‚X -D‚j… au d‚but du fichierX -D‚placement hors du d‚but du fichierX -D‚j… dans la premiŠre colonneX -Les tampons doivent ˆtre sp‚cifi‚s avant la commandeX -D‚j… … la fin du fichierX -D‚j… … la fin de la ligneX -%s n'est pas une commande viX -Utilisation : %sX -Pas de caractŠres … supprimerX -La commande Q n‚cessite une interface terminal exX -Pas de commande … r‚p‚terX -Le fichier est videX -Vous ne pouvez pas utiliser %s comme commande de d‚placementX -D‚j… en mode commandeX -Le curseur n'est pas dans un motX - -Valeur optionnelle de fenˆtre trop grande, maximum est %uX -AjouterX -ChangerX -CommandeX -Ins‚rerX -RemplacerX -D‚placement hors de la fin d'‚cranX -D‚placement hors du d‚but d'‚cranX -L'‚cran doit ˆtre sup‚rieur … %d lignes pour se fractionnerX -Il n'y a pas d'‚cran d'arriŠre-planX -Il n'y a pas d'‚cran d'arriŠre-plan qui ‚dite un fichier nomm‚ %sX -Vous ne pouvez pas mettre … l'arriŠre-plan votre seul ‚cran affich‚X -L'‚cran ne peut ˆtre r‚duit qu'… %d rangsX -L'‚cran n'est pas auto-r‚ductibleX -L'‚cran n'est pas auto-extensibleX - -Vous ne pouvez pas mettre cet ‚cran en attenteX -Interrompu : les touches affect‚es ont ‚t‚ abandonn‚esX -vi : le tampon temporaire n' a pas ‚t‚ lib‚r‚X -Ce terminal n'a pas de touche %sX -Vous ne pouvez sp‚cifier qu'un seul tamponX -Nombre sup‚rieur … %luX -InterrompuX -Impossible de cr‚er un fichier temporaireX -Avertissement : %s n'est pas un fichier standardX -%s d‚j… verrouill‚, session en lecture seuleX -%s: supprimerX -%s: fermerX -%s: supprimerX -%s: supprimerX -Fichier en lecture seule, pas ‚crit, utiliser ! pour outrepasserX -Fichier en lecture seule, pas ‚critX -%s existe, pas ‚crit; utiliser ! pour outrepasserX -%s existe, pas ‚critX -Fichier partiel, pas ‚crit; utiliser ! pour outrepasserX -Fichier partiel, pas ‚critX -%s: fichier modifi‚ plus r‚cemment que cet exemplaire; utiliser ! pour outrepasserX -%s: fichier modifi‚ plus r‚cemment que cet exemplaireX -%s: interdiction d'‚criture non disponibleX -Ecriture en cours...X -%s: AVERTISSEMENT : FICHIER TRONQUEX -PremiŠre marque de ce groupe d‚j… atteinteX -%s: nouveau fichier : %lu lignes, %lu caractŠresX -%s: %lu lignes, %lu caractŠresX -%s ‚tendue … trop de noms de fichiersX -%s: pas un fichier standardX -%s: ne vous appartient pasX -%s: accessible par un utilisateur autre que son propri‚taireX -Fichier modif‚ depuis la derniŠre ‚criture complŠte ; ‚crire ou utiliser ! pour outrepasser X -Fichier modif‚ depuis la derniŠre ‚criture complŠte ; ‚crire ou utiliser :edit! pour outrepasserX -Fichier modif‚ depuis la derniŠre ‚criture complŠte ; ‚crire ou utiliser ! pour outrepasserX -Fichier temporaire ; quitter annulera les modificationsX -Fichier en lecture seule ; les modifications ne sont pas ‚crites automatiquementX -Journal red‚marr‚X -confirmer ? [ynq]X -Appuyez sur n'importe quelle touche pour continuer : X -Appuyez sur n'importe quelle touche pour continuer [: pour entrer plus de commandes ex] : X -Appuyez sur n'importe quelle touche pour continuer [q pour Quitter]: X -Cette forme de %s n‚cessite l'interface de terminal exX -Entr‚e de mode entr‚e ex.X -La commande a ‚chou‚, aucun fichier n'a encore ‚t‚ lu.X -cont?X -Ev‚nement impr‚vu de caractŠreX -Ev‚nement impr‚vu de fin-de-fichierX -Pas de correspondances pour cette requˆteX -Ev‚nement impr‚vu d'interruptionX -Ev‚nement quitter impr‚vuX -Ev‚nement impr‚vu de rafraŒchissementX -La derniŠre marque de ce groupe a d‚j… ‚t‚ atteinteX -La commande %s n‚cessite l'interface de terminal exX -Cette forme de %s n'est pas reconnue quand l'option d'‚dition prot‚g‚e est activ‚eX -Ev‚nement impr‚vu de chaŒneX -Ev‚nement impr‚vu de d‚lai impartiX -Ev‚nement d'‚criture impr‚vuX - -Les expansions du shell ne sont pas reconnues quand l'option d'‚dition prot‚g‚e est activ‚eX -La commande %s n'est pas reconnue quand l'option d'‚dition prot‚g‚e est activ‚eX -D‚finition : l'option %s ne peut pas ˆtre d‚sactiv‚eX -Affichage trop petit.X -ajout‚X -chang‚X -supprim‚X -jointX -d‚plac‚X -d‚cal‚X -coup‚X -ligneX -lignesX -Vi n'a pas ‚t‚ charg‚ avec un interpr‚tateur TclX -Ficher modifi‚ depuis le dernier enregistrement.X -L'expansion du shell a ‚chou‚X -Pas d'option d'‚dition %s sp‚cifi‚eX -Vi n'a pas ‚t‚ charg‚ avec un interpr‚tateur PerlX -Pas de commande ex … ex‚cuterX -Entrez pour ex‚cuter une commande, :q pour quitterX -Utiliser "cscope help" pour obtenir de l'aideX -Aucune connexion cscope n'est lanc‚eX -%s : type de recherche inconnu : utiliser un des %sX -%d : Il n'existe pas de telle session cscopeX -D‚finition : l'option %s ne peut jamais ˆtre activ‚eX -D‚finition : l'option %s ne peut jamais ˆtre d‚finie sur 0X -%s: joints : %lu lignes, %lu caractŠresX -‚v‚nement impr‚vu de redimensionnementX -%d fichiers … ‚diterX diff --git a/catalog/french.base b/catalog/french.base index db2d45f9b220..234b8c6ba2c7 100644 --- a/catalog/french.base +++ b/catalog/french.base @@ -1,309 +1,306 @@ -002 "D‚passement de longueur de ligne" +002 "Dépassement de longueur de ligne" 003 "impossible de supprimer la ligne %lu" -004 "impossible d'ajouter … la ligne %lu" -005 "impossible d'ins‚rer devant la ligne %lu" +004 "impossible d'ajouter à la ligne %lu" +005 "impossible d'insérer devant la ligne %lu" 006 "impossible de stocker la ligne %lu" -007 "impossible d'obtenir la derniŠre ligne" -008 "Erreur : impossible de r‚cup‚rer la ligne %lu" +007 "impossible d'obtenir la dernière ligne" +008 "Erreur : impossible de récupérer la ligne %lu" 009 "Fichier journal" -010 "Aucune connexion n'‚tant effectu‚e, impossible d'annuler" -011 "Aucune action … annuler" -012 "Aucune connexion n'‚tant effectu‚e, impossible d'annuler" -013 "Aucune connexion n'‚tant effectu‚e, reprise actualis‚e impossible" -014 "Aucune action … refaire" -015 "%s/%d : Erreur d'‚criture de journal" -016 "L'entr‚e et la sortie Vi standards doivent ˆtre un terminal" -017 "Marque %s : non d‚finie" -018 "Marque %s : la ligne a ‚t‚ supprim‚e" +010 "Aucune journalisation n'étant effectuée, impossible d'annuler" +011 "Aucune action à annuler" +012 "Aucune journalisation n'étant effectuée, impossible d'annuler" +013 "Aucune journalisation n'étant effectuée, reprise actualisée impossible" +014 "Aucune action à refaire" +015 "%s/%d : Erreur d'écriture de journal" +016 "L'entrée et la sortie Vi standards doivent être un terminal" +017 "Marque %s : non définie" +018 "Marque %s : la ligne a été supprimée" 019 "Marque %s : la position du curseur n'existe plus" 020 "Erreur : " 021 "nouveau fichier" -022 "le nom a chang‚" -023 "modifi‚" -024 "non modifi‚" -025 "DEVERROUILLE" +022 "le nom a changé" +023 "modifié" +024 "non modifié" +025 "DÉVERROUILLÉ" 026 "lecture seule" 027 "ligne %lu de %lu [%ld%%]" 028 "fichier vide" 029 "ligne %lu" 030 "Ce fichier %s n'est pas un catalogue de messages" -031 "Impossible de configurer option %s par d‚faut" +031 "Impossible de configurer option %s par défaut" 032 "Utilisation : %s" -033 "D‚finition : pas d'option %s : 'tout d‚finir' donne toutes les valeurs optionnelles" -034 "D‚finition : option [no]%s ne prend pas de valeur" -035 "D‚finition : l'option %s n'est pas bool‚enne" -036 "D‚finition : option %s : %s" -037 "D‚finition : option %s : %s : D‚passement de valeur" -038 "D‚finition : option %s : %s n'est pas un nombre valide" -039 "D‚finition : l'option %s n'est pas bool‚enne" -040 "Les colonnes de l'‚cran sont trop petites, inf‚rieures … %d" -041 "Les colonnes de l'‚cran sont trop grandes, sup‚rieures … %d" -042 "Les lignes de l'‚cran sont trop courtes, inf‚rieures … %d" -043 "Les lignes de l'‚cran sont trop longues, sup‚rieures … %d" -044 "L'option lisp n'est pas impl‚ment‚e" -045 "Les messages ne sont pas d‚sactiv‚s : %s" -046 "Les messages ne sont pas activ‚s : %s" -048 "L'option de paragraphe doit ˆtre en groupe de deux caractŠres" -049 "L'option de section doit ˆtre en groupe de deux caractŠres" -053 "Le tampon par d‚faut est vide" +033 "Définition : pas d'option %s : 'set all' donne toutes les valeurs optionnelles" +034 "Définition : option [no]%s ne prend pas de valeur" +035 "Définition : l'option %s n'est pas booléenne" +036 "Définition : option %s : %s" +037 "Définition : option %s : %s : Dépassement de valeur" +038 "Définition : option %s : %s n'est pas un nombre valide" +039 "Définition : l'option %s n'est pas booléenne" +040 "Les colonnes de l'écran sont trop petites, inférieures à %d" +041 "Les colonnes de l'écran sont trop grandes, supérieures à %d" +042 "Les lignes de l'écran sont trop courtes, inférieures à %d" +043 "Les lignes de l'écran sont trop longues, supérieures à %d" +044 "L'option lisp n'est pas implémentée" +045 "Les messages ne sont pas désactivés : %s" +046 "Les messages ne sont pas activés : %s" +047 "L'option de %s doit être en groupe de deux caractères" +053 "Le tampon par défaut est vide" 054 "Le tampon %s est vide" -055 "Les fichiers dont le nom contient des caractŠres de saut de ligne sont irr‚cup‚rables" -056 "Impossible de r‚cup‚rer les modifications si la session ‚choue" -057 "Copie en cours du fichier pour r‚cup‚ration..." -058 "La pr‚servation a ‚chou‚ : %s" -059 "Impossible de r‚cup‚rer les modifications si la session ‚choue" -060 "La sauvegarde du fichier a ‚chou‚ : %s" -061 "Copie en cours du fichier pour r‚cup‚ration..." -062 "Les renseignements sur l'identit‚ %u de l'utilisateur sont introuvables" -063 "Impossible de verrouiller le fichier de r‚cup‚ration" -064 "D‚bordement de tampon du fichier de r‚cup‚ration" -065 "Fichier de r‚cup‚ration" -066 "%s : Fichier de r‚cup‚ration malform‚" -067 "%s : Fichier de r‚cup‚ration malform‚" -068 "Aucun fichier nomm‚ %s … r‚cup‚rer, que vous puissiez lire" -069 "Il existe des versions r‚cup‚rables ant‚rieures … ce fichier" -070 "Vous avez d'autres fichiers … r‚cup‚rer" +055 "Les fichiers dont le nom contient des caractères de saut de ligne sont irrécupérables" +056 "Impossible de récupérer les modifications si la session échoue" +057 "Copie en cours du fichier pour récupération..." +058 "La préservation a échoué : %s" +059 "Impossible de récupérer les modifications si la session échoue" +060 "La sauvegarde du fichier a échoué : %s" +061 "Copie en cours du fichier pour récupération..." +062 "Les renseignements sur l'identité %u de l'utilisateur sont introuvables" +063 "Impossible de verrouiller le fichier de récupération" +064 "Débordement de tampon du fichier de récupération" +065 "Fichier de récupération" +066 "%s : Fichier de récupération malformé" +067 "%s : Fichier de récupération malformé" +068 "Aucun fichier nommé %s à récupérer, que vous puissiez lire" +069 "Il existe des versions récupérables antérieures à ce fichier" +070 "Vous avez d'autres fichiers à récupérer" 071 "pas d'envoi d'email : %s" -072 "Fichier vide, rien … rechercher" +072 "Fichier vide, rien à rechercher" 073 "Fin de fichier atteinte sans trouver le motif" -074 "Pas de motif de recherche pr‚c‚dent" +074 "Pas de motif de recherche précédent" 075 "Motif introuvable" -076 "D‚but du fichier atteint sans trouver le motif" -077 "La recherche est revenue … son point de d‚part" +076 "Début du fichier atteint sans trouver le motif" +077 "La recherche est revenue à son point de départ" 078 "Recherche en cours..." -079 "CaractŠre non-imprimable introuvable" +079 "Caractère non-imprimable introuvable" 080 "Nom de commande inconnu" 082 "%s : Commande non disponible en ex mode" -083 "Le compte ne peut ˆtre z‚ro" -084 "%s : mauvaise sp‚cification de ligne" +083 "Le compteur ne peut être zéro" +084 "%s : mauvaise spécification de ligne" 085 "Erreur de tableau de syntaxe interne (%s: %s)" 086 "Utilisation : %s" -087 "%s : tampon temporaire non lib‚r‚" -088 "D‚calage de drapeau hors de la ligne 1" -089 "D‚calage de drapeau hors de la fin du fichier" -090 "@ avec plage, en cours d'ex‚cution quand le fichier/l'‚cran a chang‚" -091 "Commande Global/v en cours d'ex‚cution quand le fichier/l'‚cran a chang‚" -092 "La commande ex a ‚chou‚ : commandes en attente abandonn‚es" -093 "La commande ex a ‚chou‚ : les touches affect‚es sont abandonn‚es" -094 "La deuxiŠme adresse est plus petite que la premiŠre" +087 "%s : tampon temporaire non libéré" +088 "Décalage de drapeau hors de la ligne 1" +089 "Décalage de drapeau hors de la fin du fichier" +090 "@ avec plage, en cours d'exécution quand le fichier/l'écran a changé" +091 "Commande Global/v en cours d'exécution quand le fichier/l'écran a changé" +092 "La commande ex a échoué : commandes en attente abandonnées" +093 "La commande ex a échoué : les touches affectées sont abandonnées" +094 "La deuxième adresse est plus petite que la première" 095 "Aucun nom de marque fourni" -096 "\\ pas suivi par / ou ?" -097 "R‚f‚rence … un num‚ro de ligne inf‚rieure … 0" +096 "\\ non suivi par / ou ?" +097 "Référence à un numéro de ligne inférieure à 0" 098 "La commande %s est inconnue" -099 "D‚passement de la valeur adresse" -100 "D‚passement n‚gatif de la valeur adresse" +099 "Dépassement de la valeur adresse" +100 "Dépassement négatif de la valeur adresse" 101 "Combinaison d'adresse non valide" -102 "Adresse non valide : il n'y a que des lignes %lu dans le fichier" +102 "Adresse non valide : il n'y a que %lu lignes dans ce fichier" 103 "Adresse non valide : le fichier est vide" 104 "La commande %s ne permet pas une adresse de 0" -105 "Pas d'abr‚viations … afficher" -106 "Les abr‚viations doivent finir par un caractŠre"mot" -107 "Les abr‚viations ne peuvent pas contenir de tabulations ni d'espaces" -108 "Les abr‚viations ne peuvent pas contenir un m‚lange de caractŠres mot/non-mot, sauf … la fin" -109 ""%s" n'est pas une abr‚viation" -110 "La commande Vi a ‚chou‚ : Les touches affect‚es ont ‚t‚ abandonn‚es" -111 "Plus de fichiers … ‚diter" -112 "Pas de fichiers pr‚c‚dents … ‚diter" -113 "Pas de fichiers pr‚c‚dents … rembobiner" -114 "Pas de liste de fichiers … afficher" -115 "Pas de commande pr‚c‚dente … remplacer"!"" -116 "Pas de nom de fichier … substituer … %%" -117 "Pas de nom de fichier … substituer … #" +105 "Pas d'abréviations à afficher" +106 "Les abréviations doivent finir par un caractère \"mot\"" +107 "Les abréviations ne peuvent pas contenir de tabulations ni d'espaces" +108 "Les abréviations ne peuvent pas contenir un mélange de caractères mot/non-mot, sauf à la fin" +109 "\"%s\" n'est pas une abréviation" +110 "La commande Vi a échoué : Les touches affectées ont été abandonnées" +111 "Plus de fichiers à éditer" +112 "Pas de fichiers précédents à éditer" +113 "Pas de fichiers précédents à rembobiner" +114 "Pas de liste de fichiers à afficher" +115 "Pas de commande précédente à remplacer \"!\"" +116 "Pas de nom de fichier à substituer à %%" +117 "Pas de nom de fichier à substituer à #" 118 "Erreur : execl : %s" 119 "Erreur E/S : %s" -120 "Fichier modifi‚ depuis la derniŠre ‚criture complŠte ; ‚crire ou utiliser ! pour outrepasser" -121 "Impossible de trouver l'emplacement du r‚pertoire d'origine" -122 "Nouveau r‚pertoire en cours : %s" -123 "Pas de tampon de coupure … afficher" -124 "La commande %s ne peut pas ˆtre utilis‚e … l'int‚rieur d'une commande globale ou commande v" -125 "%s/%s : ‚chec de source : ni vous ni le super-utilisateur n'ˆtes les propri‚taires " -126 "%s/%s : ‚chec de source : vous n'ˆtes pas le propri‚taire" -127 "%s/%s : ‚chec de source : peut ˆtre ‚crit par un utilisateur autre que le propri‚taire" -128 "%s : ‚chec de source : ni vous ni le super-utilisateur n'ˆtes les propri‚taires" -129 "%s : ‚chec de source : vous n'ˆtes pas le propri‚taire" -130 "%s : ‚chec de source : peut ˆtre ‚crit par un utilisateur autre que le propri‚taire" -131 "Pas de lignes suivantes … joindre" -132 "Pas d'entr‚es de mappage d'entr‚e" -133 "Pas d'entr‚es de mappage de commandes" -134 "Le caractŠre %s ne peut pas ˆtre remapp‚" -135 ""%s" n'est pas actuellement mapp‚" -136 "Les noms de marque ne doivent avoir qu'un caractŠre" -137 "%s existe, non enregistr‚; utiliser ! pour outrepasser" +120 "Fichier modifié depuis la dernière écriture complète ; écrire ou utiliser ! pour outrepasser" +121 "Impossible de trouver l'emplacement du répertoire d'origine" +122 "Nouveau répertoire en cours : %s" +123 "Pas de tampon de coupure à afficher" +124 "La commande %s ne peut pas être utilisée à l'intérieur d'une commande globale ou commande v" +125 "%s/%s : échec de source : ni vous ni le super-utilisateur n'êtes les propriétaires " +126 "%s/%s : échec de source : vous n'êtes pas le propriétaire" +127 "%s/%s : échec de source : peut être écrit par un utilisateur autre que le propriétaire" +128 "%s : échec de source : ni vous ni le super-utilisateur n'êtes les propriétaires" +129 "%s : échec de source : vous n'êtes pas le propriétaire" +130 "%s : échec de source : peut être écrit par un utilisateur autre que le propriétaire" +131 "Pas de lignes suivantes à joindre" +132 "Pas d'entrées de mappage d'entrée" +133 "Pas d'entrées de mappage de commandes" +134 "Le caractère %s ne peut pas être remappé" +135 "\"%s\" n'est pas actuellement mappé" +136 "Les noms de marque ne doivent avoir qu'un caractère" +137 "%s existe, non enregistré; utiliser ! pour outrepasser" 138 "Nouveau fichier exrc : %s" -139 "La ligne de destination est … l'int‚rieur de la plage … d‚placer" -140 "La commande ouverte n‚cessite que l'option ouverte soit d‚finie" -141 "La commande ouverte n'est pas encore impl‚ment‚e" -142 "La pr‚servation de ce fichier est impossible" -143 "Fichier pr‚serv‚" -144 "%s: ‚tendu dans trop de noms de fichiers" -145 "Vous ne pouvez lire que les fichiers standards et les canaux de transmission nomm‚s" +139 "La ligne de destination est à l'intérieur de la plage à déplacer" +140 "La commande ouverte nécessite que l'option ouverte soit définie" +141 "La commande ouverte n'est pas encore implémentée" +142 "La préservation de ce fichier est impossible" +143 "Fichier préservé" +144 "%s: étendu dans trop de noms de fichiers" +145 "Vous ne pouvez lire que les fichiers standards et les canaux de transmission nommés" 146 "%s: Interdiction de lecture non disponible" 147 "Lecture en cours..." -148 "%s: %lu lignes, %lu caractŠres" -149 "Pas d'‚crans d'arriŠre-plan … afficher" +148 "%s: %lu lignes, %lu caractères" +149 "Pas d'écrans d'arrière-plan à afficher" 150 "La commande script n'est disponible qu'en mode vi" -151 "Pas de commande … ex‚cuter" -152 "Option de largeur de d‚calage d‚finie sur 0" -153 "Compter d‚passement" -154 "Compter d‚passement n‚gatif" -155 "Expression standard sp‚cifi‚e; drapeau r superflu" +151 "Pas de commande à exécuter" +152 "Option de largeur de décalage définie sur 0" +153 "Compter dépassement" +154 "Compter dépassement négatif" +155 "Expression standard spécifiée; drapeau r superflu" 156 "Vous ne pouvez pas en mode vi, combiner les drapeaux #, l et p avec le drapeau c" -157 "Aucune correspondance trouv‚e" -158 "Aucune marque pr‚c‚dente entr‚e" -159 "Moins de %s entr‚es dans la pile de marques ; utilisez t[ags]" +157 "Aucune correspondance trouvée" +158 "Aucune marque précédente entrée" +159 "Moins de %s entrées dans la pile de marques ; utilisez t[ags]" 160 "Pas de fichier %s vers lequel retourner dans la pile de marques ; utiliser : affichage t[ags]" -161 "Appuyez sur Entr‚e pour continuer :" +161 "Appuyez sur Entrée pour continuer :" 162 "%s : marque introuvable" 163 "%s : marque corrompue en %s" -164 "%s : le num‚ro de ligne de la marque d‚passe la fin du fichier" +164 "%s : le numéro de ligne de la marque dépasse la fin du fichier" 165 "La pile de marques est vide" 166 "%s : motif de recherche introuvable" -167 "%d fichiers suppl‚mentaires … ‚diter" +167 "%d fichiers supplémentaires à éditer" 168 "Le tampon %s est vide 169 "Confirmer les changements ? [n]" 170 "Interrompu" -171 "Pas de tampon pr‚c‚dent … ex‚cuter" -172 "Pas d'expression standard pr‚c‚dente" -173 "La commande %s n‚cessite qu'un fichier ait d‚j… ‚t‚ lu en m‚moire" +171 "Pas de tampon précédent à exécuter" +172 "Pas d'expression standard précédente" +173 "La commande %s nécessite qu'un fichier ait déjà été lu en mémoire" 174 "Utilisation : %s" -175 "La commande visuelle n‚cessite que l'option ouverte soit d‚finie" +175 "La commande visual nécessite que l'option open soit définie" 177 "Fichier vide" -178 "Pas de recherche pr‚c‚dente F, f, T ou t" +178 "Pas de recherche précédente F, f, T ou t" 179 "%s introuvable" -180 "Pas de fichier pr‚c‚dent … ‚diter" +180 "Pas de fichier précédent à éditer" 181 "Le curseur n'est pas dans un nombre" 182 "Le nombre obtenu est trop grand" 183 "Le nombre obtenu est trop petit" -184 "Pas de correspondance de caractŠre sur cette ligne" -185 "CaractŠre correspondant introuvable" -186 "Pas de caractŠres … remplacer" -187 "Pas d'autre ‚cran vers lequel basculer" -188 "CaractŠres aprŠs la chaŒne de recherche, d‚calage de ligne et/ou commande z" -189 "Pas de motif de recherche pr‚c‚dent" -190 "La recherche est revenue … son point de d‚part" -191 "L'abr‚viation a d‚pass‚ la limite de l'expansion : caractŠres abandonn‚s" -192 "CaractŠre non valide ; guillemet pour saisir" -193 "D‚j… au d‚but de l'insertion" -194 "Plus de caractŠres … effacer" -195 "D‚placement hors de fin de fichier" -196 "D‚placement hors de fin de ligne" -197 "Aucun mouvement de curseur n'a ‚t‚ effectu‚" -198 "D‚j… au d‚but du fichier" -199 "D‚placement hors du d‚but du fichier" -200 "D‚j… dans la premiŠre colonne" -201 "Les tampons doivent ˆtre sp‚cifi‚s avant la commande" -202 "D‚j… … la fin du fichier" -203 "D‚j… … la fin de la ligne" +184 "Pas de correspondance de caractère sur cette ligne" +185 "Caractère correspondant introuvable" +186 "Pas de caractères à remplacer" +187 "Pas d'autre écran vers lequel basculer" +188 "Caractères après la chaîne de recherche, décalage de ligne et/ou commande z" +189 "Pas de motif de recherche précédent" +190 "La recherche est revenue à son point de départ" +191 "L'abréviation a dépassé la limite de l'expansion : caractères abandonnés" +192 "Caractère non valide ; guillemet pour saisir" +193 "Déjà au début de l'insertion" +194 "Plus de caractères à effacer" +195 "Déplacement hors de fin de fichier" +196 "Déplacement hors de fin de ligne" +197 "Aucun mouvement de curseur n'a été effectué" +198 "Déjà au début du fichier" +199 "Déplacement hors du début du fichier" +200 "Déjà dans la première colonne" +201 "Les tampons doivent être spécifiés avant la commande" +202 "Déjà à la fin du fichier" +203 "Déjà à la fin de la ligne" 204 "%s n'est pas une commande vi" 205 "Utilisation : %s" -206 "Pas de caractŠres … supprimer" -207 "La commande Q n‚cessite une interface terminal ex" -208 "Pas de commande … r‚p‚ter" +206 "Pas de caractères à supprimer" +207 "La commande Q nécessite une interface terminal ex" +208 "Pas de commande à répéter" 209 "Le fichier est vide" -209 "Le fichier est vide" -210 "Vous ne pouvez pas utiliser %s comme commande de d‚placement" -211 "D‚j… en mode commande" +210 "Vous ne pouvez pas utiliser %s comme commande de déplacement" +211 "Déjà en mode commande" 212 "Le curseur n'est pas dans un mot" -214 "Valeur optionnelle de fenˆtre trop grande, maximum est %u" +214 "Valeur optionnelle de fenêtre trop grande, maximum est %u" 215 "Ajouter" 216 "Changer" 217 "Commande" -218 "Ins‚rer" +218 "Insérer" 219 "Remplacer" -220 "D‚placement hors de la fin d'‚cran" -221 "D‚placement hors du d‚but d'‚cran" -222 "L'‚cran doit ˆtre sup‚rieur … %d lignes pour se fractionner" -223 "Il n'y a pas d'‚cran d'arriŠre-plan" -224 "Il n'y a pas d'‚cran d'arriŠre-plan qui ‚dite un fichier nomm‚ %s" -225 "Vous ne pouvez pas mettre … l'arriŠre-plan votre seul ‚cran affich‚" -226 "L'‚cran ne peut ˆtre r‚duit qu'… %d rangs" -227 "L'‚cran n'est pas auto-r‚ductible" -228 "L'‚cran n'est pas auto-extensible" -230 "Vous ne pouvez pas mettre cet ‚cran en attente" -231 "Interrompu : les touches affect‚es ont ‚t‚ abandonn‚es" -232 "vi : le tampon temporaire n' a pas ‚t‚ lib‚r‚" +220 "Déplacement hors de la fin d'écran" +221 "Déplacement hors du début d'écran" +222 "L'écran doit être supérieur à %d lignes pour se fractionner" +223 "Il n'y a pas d'écran d'arrière-plan" +224 "Il n'y a pas d'écran d'arrière-plan qui édite un fichier nommé %s" +225 "Vous ne pouvez pas mettre à l'arrière-plan votre seul écran affiché" +226 "L'écran ne peut être réduit qu'à %d rangs" +227 "L'écran n'est pas auto-réductible" +228 "L'écran n'est pas auto-extensible" +230 "Vous ne pouvez pas mettre cet écran en attente" +231 "Interrompu : les touches affectées ont été abandonnées" +232 "vi : le tampon temporaire n' a pas été libéré" 233 "Ce terminal n'a pas de touche %s" -234 "Vous ne pouvez sp‚cifier qu'un seul tampon" -235 "Nombre sup‚rieur … %lu" +234 "Vous ne pouvez spécifier qu'un seul tampon" +235 "Nombre supérieur à %lu" 236 "Interrompu" -237 "Impossible de cr‚er un fichier temporaire" +237 "Impossible de créer un fichier temporaire" 238 "Avertissement : %s n'est pas un fichier standard" -239 "%s d‚j… verrouill‚, session en lecture seule" +239 "%s déjà verrouillé, session en lecture seule" 240 "%s: supprimer" 241 "%s: fermer" 242 "%s: supprimer" 243 "%s: supprimer" -244 "Fichier en lecture seule, pas ‚crit, utiliser ! pour outrepasser" -245 "Fichier en lecture seule, pas ‚crit" -246 "%s existe, pas ‚crit; utiliser ! pour outrepasser" -247 "%s existe, pas ‚crit" -248 "Fichier partiel, pas ‚crit; utiliser ! pour outrepasser" -249 "Fichier partiel, pas ‚crit" -250 "%s: fichier modifi‚ plus r‚cemment que cet exemplaire; utiliser ! pour outrepasser" -251 "%s: fichier modifi‚ plus r‚cemment que cet exemplaire" -252 "%s: interdiction d'‚criture non disponible" +244 "Fichier en lecture seule, non écrit, utiliser ! pour outrepasser" +245 "Fichier en lecture seule, non écrit" +246 "%s existe, non écrit; utiliser ! pour outrepasser" +247 "%s existe, non écrit" +248 "Fichier partiel, non écrit; utiliser ! pour outrepasser" +249 "Fichier partiel, non écrit" +250 "%s: fichier modifié plus récemment que cet exemplaire; utiliser ! pour outrepasser" +251 "%s: fichier modifié plus récemment que cet exemplaire" +252 "%s: interdiction d'écriture non disponible" 253 "Ecriture en cours..." -254 "%s: AVERTISSEMENT : FICHIER TRONQUE" -255 "PremiŠre marque de ce groupe d‚j… atteinte" -256 "%s: nouveau fichier : %lu lignes, %lu caractŠres" -257 "%s: %lu lignes, %lu caractŠres" -258 "%s ‚tendue … trop de noms de fichiers" +254 "%s: AVERTISSEMENT : FICHIER TRONQUÉ" +255 "Première marque de ce groupe déjà atteinte" +256 "%s: nouveau fichier : %lu lignes, %lu caractères" +257 "%s: %lu lignes, %lu caractères" +258 "%s étendue à trop de noms de fichiers" 259 "%s: pas un fichier standard" 260 "%s: ne vous appartient pas" -261 "%s: accessible par un utilisateur autre que son propri‚taire" -262 "Fichier modif‚ depuis la derniŠre ‚criture complŠte ; ‚crire ou utiliser ! pour outrepasser " -263 "Fichier modif‚ depuis la derniŠre ‚criture complŠte ; ‚crire ou utiliser :edit! pour outrepasser" -264 "Fichier modif‚ depuis la derniŠre ‚criture complŠte ; ‚crire ou utiliser ! pour outrepasser" +261 "%s: accessible par un utilisateur autre que son propriétaire" +262 "Fichier modifé depuis la dernière écriture complète ; écrire ou utiliser ! pour outrepasser " +263 "Fichier modifé depuis la dernière écriture complète ; écrire ou utiliser :edit! pour outrepasser" +264 "Fichier modifé depuis la dernière écriture complète ; écrire ou utiliser ! pour outrepasser" 265 "Fichier temporaire ; quitter annulera les modifications" -266 "Fichier en lecture seule ; les modifications ne sont pas ‚crites automatiquement" -267 "Journal red‚marr‚" +266 "Fichier en lecture seule ; les modifications ne sont pas écrites automatiquement" +267 "Journal redémarré" 268 "confirmer ? [ynq]" 269 "Appuyez sur n'importe quelle touche pour continuer : " 270 "Appuyez sur n'importe quelle touche pour continuer [: pour entrer plus de commandes ex] : " 271 "Appuyez sur n'importe quelle touche pour continuer [q pour Quitter]: " -272 "Cette forme de %s n‚cessite l'interface de terminal ex" -273 "Entr‚e de mode entr‚e ex." -274 "La commande a ‚chou‚, aucun fichier n'a encore ‚t‚ lu." +272 "Cette forme de %s nécessite l'interface de terminal ex" +273 "Entrée de mode entrée ex." +274 "La commande a échoué, aucun fichier n'a encore été lu." 275 "cont?" -276 "Ev‚nement impr‚vu de caractŠre" -277 "Ev‚nement impr‚vu de fin-de-fichier" -278 "Pas de correspondances pour cette requˆte" -279 "Ev‚nement impr‚vu d'interruption" -280 "Ev‚nement quitter impr‚vu" -281 "Ev‚nement impr‚vu de rafraŒchissement" -282 "La derniŠre marque de ce groupe a d‚j… ‚t‚ atteinte" -283 "La commande %s n‚cessite l'interface de terminal ex" -284 "Cette forme de %s n'est pas reconnue quand l'option d'‚dition prot‚g‚e est activ‚e" -285 "Ev‚nement impr‚vu de chaŒne" -286 "Ev‚nement impr‚vu de d‚lai imparti" -287 "Ev‚nement d'‚criture impr‚vu" -289 "Les expansions du shell ne sont pas reconnues quand l'option d'‚dition prot‚g‚e est activ‚e" -290 "La commande %s n'est pas reconnue quand l'option d'‚dition prot‚g‚e est activ‚e" -291 "D‚finition : l'option %s ne peut pas ˆtre d‚sactiv‚e" +276 "Evénement imprévu de caractère" +277 "Evénement imprévu de fin-de-fichier" +278 "Pas de correspondances pour cette requête" +279 "Evénement imprévu d'interruption" +280 "Evénement quitter imprévu" +281 "Evénement imprévu de rafraîchissement" +282 "La dernière marque de ce groupe a déjà été atteinte" +283 "La commande %s nécessite l'interface de terminal ex" +284 "Cette forme de %s n'est pas reconnue quand l'option d'édition protégée est activée" +285 "Evénement imprévu de chaîne" +286 "Evénement imprévu de délai imparti" +287 "Evénement d'écriture imprévu" +289 "Les expansions du shell ne sont pas reconnues quand l'option d'édition protégée est activée" +290 "La commande %s n'est pas reconnue quand l'option d'édition protégée est activée" +291 "Définition : l'option %s ne peut pas être désactivée" 292 "Affichage trop petit." -293 "ajout‚" -294 "chang‚" -295 "supprim‚" +293 "ajouté" +294 "changé" +295 "supprimé" 296 "joint" -297 "d‚plac‚" -298 "d‚cal‚" -299 "coup‚" +297 "déplacé" +298 "décalé" +299 "coupé" 300 "ligne" 301 "lignes" -302 "Vi n'a pas ‚t‚ charg‚ avec un interpr‚tateur Tcl" -303 "Ficher modifi‚ depuis le dernier enregistrement." -304 "L'expansion du shell a ‚chou‚" -304 "L'expansion du shell a ‚chou‚" -305 "Pas d'option d'‚dition %s sp‚cifi‚e" -306 "Vi n'a pas ‚t‚ charg‚ avec un interpr‚tateur Perl" -307 "Pas de commande ex … ex‚cuter" -308 "Entrez pour ex‚cuter une commande, :q pour quitter" -309 "Utiliser "cscope help" pour obtenir de l'aide" -310 "Aucune connexion cscope n'est lanc‚e" +302 "Vi n'a pas été chargé avec un interprétateur Tcl" +303 "Ficher modifié depuis le dernier enregistrement." +304 "L'expansion du shell a échoué" +305 "Pas d'option d'édition %s spécifiée" +306 "Vi n'a pas été chargé avec un interprétateur Perl" +307 "Pas de commande ex à exécuter" +308 "Entrez pour exécuter une commande, :q pour quitter" +309 "Utiliser \"cscope help\" pour obtenir de l'aide" +310 "Aucune connexion cscope n'est lancée" 311 "%s : type de recherche inconnu : utiliser un des %s" 312 "%d : Il n'existe pas de telle session cscope" -313 "D‚finition : l'option %s ne peut jamais ˆtre activ‚e" -314 "D‚finition : l'option %s ne peut jamais ˆtre d‚finie sur 0" -315 "%s: joints : %lu lignes, %lu caractŠres" -316 "‚v‚nement impr‚vu de redimensionnement" -317 "%d fichiers … ‚diter" +313 "Définition : l'option %s ne peut jamais être activée" +314 "Définition : l'option %s ne peut jamais être définie sur 0" +315 "%s: joints : %lu lignes, %lu caractères" +316 "événement imprévu de redimensionnement" +317 "%d fichiers à éditer" diff --git a/catalog/french.check b/catalog/french.check deleted file mode 100644 index 1e53d93cb446..000000000000 --- a/catalog/french.check +++ /dev/null @@ -1,34 +0,0 @@ -Unused message id's (this is okay): -001 -047 -050 -051 -052 -081 -176 -229 -288 -========================= -MISSING ERROR MESSAGES (Please add!): -========================= -Extra error messages (just delete them): -========================= -MESSAGES WITH THE SAME MESSAGE ID's (FIX!): -========================= -Duplicate messages, both id and message (this is okay): - 2 209 "Le fichier est vide" - 2 304 "L'expansion du shell a ‚chou‚" -========================= -Duplicate messages, just message (this is okay): - 2 %s : Fichier de r‚cup‚ration malform‚X - 2 %s: %lu lignes, %lu caractŠresX - 2 Aucune connexion n'‚tant effectu‚e, impossible d'annulerX - 2 Copie en cours du fichier pour r‚cup‚ration...X - 2 D‚finition : l'option %s n'est pas bool‚enneX - 2 Impossible de r‚cup‚rer les modifications si la session ‚choueX - 2 InterrompuX - 2 La recherche est revenue … son point de d‚partX - 2 Pas de motif de recherche pr‚c‚dentX - 3 %s: supprimerX - 4 Utilisation : %sX -========================= diff --git a/catalog/german b/catalog/german deleted file mode 100644 index 0810ba6cf9b4..000000000000 --- a/catalog/german +++ /dev/null @@ -1,317 +0,0 @@ -VI_MESSAGE_CATALOG -Zeilenlaengen UeberlaufX -kann Zeile %lu nicht loeschenX -kann an Zeile %lu nicht anfuegenX -kann in Zeile %lu nicht einfuegenX -kann Zeile %lu nicht speichernX -kann letzte Zeile nicht lesenX -Fehler: kann Zeile %lu nicht wiederherstellenX -ProtokolldateiX -Keine Protokollierung aktiv, rueckgaengig machen nicht moeglichX -Keine Aenderungen rueckgaengig zu machenX -Keine Protokollierung aktiv, rueckgaengig machen nicht moeglichX -Keine Protokollierung aktiv, Wiederholung von Aenderungen nicht moeglichX -Keine Aenderungen zu wiederholenX -%s/%d: ProtokollschreibfehlerX -Vi's Standardein- und ausgabe muss ein Terminal seinX -Marke %s: nicht gesetztX -Marke %s: die Zeile wurde geloeschtX -Marke %s: Cursorposition existiert nicht mehrX -Fehler: X -neue DateiX -Name geaendertX -geaendertX -nicht geaendertX -NICHT GELOCKEDX -nur zum LesenX -Zeile %lu von %lu [%ld%%]X -leere DateiX -Zeile %luX -Die Datei %s ist kein MeldungskatalogX -Setzen der Voreinstellung fuer %s Option nicht moeglichX -Benutzung: %sX -set: keine %s Option: 'set all' zeigt alle Optionen mit Werten anX -set: der [no]%s Option kann kein Wert zugewiesen werdenX -set: %s ist keine boolsche OptionX -set: %s Option: %sX -set: %s Option: %s: Wert UeberlaufX -set: %s Option: %s ist eine ungueltige ZahlX -set: %s ist keine boolsche OptionX -Anzeige hat zu wenig Spalten, weniger als %dX -Anzeige hat zu viele Spalten, mehr als %dX -Anzeige hat zu wenig Zeilen, weniger als %dX -Anzeige hat zu viele Zeilen, mehr als %dX -Die lisp Option ist nicht implementiertX -Messages nicht abgeschalten: %sX -Messages nicht eingeschalten: %sX - -Die paragraph Option muss Gruppen zu zwei Zeichen enthaltenX -Die section Option muss Gruppen zu zwei Zeichen enthaltenX - - - -Der Standardpuffer ist leerX -Puffer %s ist leerX -Dateien mit newlines im Namen sind nicht wiederherstellbarX -Aenderungen nicht wiederherstellbar falls die Editorsitzung schief gehtX -kopiere Datei fuer Wiederherstellung ...X -Rettungsmechanismus funktioniert nicht: %sX -Aenderungen nicht wiederherstellbar falls die Editorsitzung schief gehtX -Sicherung der Datei gescheitert: %sX -kopiere Datei fuer Wiederherstellung ...X -Informationen ueber den Benutzer mit id %u nicht gefundenX -Wiederherstellungsdatei kann nicht gesperrt werdenX -Puffer der Wiederherstellungsdatei uebergelaufenX -WiederherstellungsdateiX -%s: Wiederherstellungsdatei hat falsches FormatX -%s: Wiederherstellungsdatei hat falsches FormatX -Keine von Ihnen lesbaren Dateien mit Namen %s zum WiederherstellenX -Es gibt aeltere Versionen dieser Datei von Ihnen zum WiederherstellenX -Sie haben noch andere Dateien zum WiederherstellenX -schicke keine email: %sX -Datei leer; nichts zu suchenX -Dateiende erreicht, ohne das Suchmuster zu findenX -Kein altes SuchmusterX -Suchmuster nicht gefundenX -Dateianfang erreicht, ohne das Suchmuster zu findenX -Suche umgeschlagenX -suche ...X -Keine nichtdruckbaren Zeichen gefundenX -Unbekannter KommandonameX - -%s: Kommando im ex Modus nicht verfuegbarX -Count darf nicht Null seinX -%s: falsche ZeilenangabeX -Interner Syntaxtabellenfehler (%s: %s)X -Benutzung: %sX -%s: temporaerer Puffer nicht freigegebenX -Flagoffset vor Zeile 1X -Flagoffset hinter dem DateiendeX -@ mit Bereich lief als Datei/Anzeige geaendert wurdeX -globales oder v-Kommando lief als Datei/Anzeige geaendert wurdeX -Ex Kommando misslungen: restliche Kommandoeingabe ignoriertX -Ex Kommando misslungen: umdefinierte Tasten ungueltigX -Die zweite Adresse ist kleiner als die ersteX -Kein Markenname angegebenX -\\ ohne folgenden / oder ?X -Referenz auf eine negative ZeilennummerX -Das Kommando %s ist unbekanntX -Adresswert zu grossX -Adresswert zu kleinX -Ungueltige AdresskombinationX -Ungueltige Adresse: nur %lu Zeilen in der DateiX -Ungueltige Adresse: die Datei ist leerX -Das Kommando %s erlaubt keine Adresse 0X -Keine Abkuerzungen zum AnzeigenX -Abkuerzungen muessen mit einem "Wort"-Zeichen endenX -Abkuerzungen duerfen keine Tabulator- oder Leerzeichen enthaltenX -In Abkuerzungen duerfen ausser am Ende Wort- und Nicht-Wort-Zeichen nicht gemischt werdenX -"%s" ist keine AbkuerzungX -Vi Kommando misslungen: umdefinierte Tasten ungueltigX -Keine weiteren Dateien zu edierenX -Keine vorhergehenden Dateien zu edierenX -Keine vorhergehenden Dateien fuer rewindX -Keine Dateiliste zum AnzeigenX -Kein vorhergehendes Kommando um "!" zu ersetzenX -Kein Dateiname fuer %%X -Kein Dateiname fuer #X -Fehler: execl: %sX -I/O Fehler: %sX -Datei wurde seit dem letzten vollstaendigen Schreiben geaendert; schreibe oder verwende ! zum ignorierenX -Kann Homedirectory nicht bestimmenX -Neues aktuelles Directory: %sX -Keine Puffer anzuzeigenX -Das Kommando %s kann nicht als Teil eines global oder v Kommandos verwendet werdenX -%s/%s: nicht gelesen: gehoehrt weder Ihnen noch rootX -%s/%s: nicht gelesen: gehoehrt nicht IhnenX -%s/%s: nicht gelesen: anderer Benutzer als Eigentuemer hat SchreibrechtX -%s: nicht gelesen: gehoehrt weder Ihnen noch rootX -%s: nicht gelesen: gehoehrt nicht IhnenX -%s: nicht gelesen: anderer Benutzer als Eigentuemer hat SchreibrechtX -Keine folgenden Zeilen zum VerbindenX -Kein Eingabe-Map EintragX -Kein Kommando-Map EintragX -Das %s Zeichen kann nicht umgemappt werdenX -"%s" ist momentan nicht gemapptX -Markennamen muessen einzelne Buchstaben seinX -%s existiert, nicht geschrieben; verwende ! zum UeberschreibenX -Neue .exrc Datei: %s. X -Zielzeile ist innerhalb des VerschiebebereichsX -Das open Kommando verlangt, dass die open Option gesetzt istX -Das open Kommando ist nocht nicht implementiertX -Rettung dieser Datei nicht moeglichX -Datei gerettetX -%s wurde in zu viele Dateinamen expandiertX -Nur regulaere Dateien und named pipes koennen gelesen werdenX -%s: Lesesperrung war nicht moeglichX -lese ...X -%s: %lu Zeilen, %lu ZeichenX -Keine Hintegrundanzeigen vorhandenX -Das script Kommando ist nur im vi Modus verfuegbarX -Kein Kommando auszufuehrenX -shiftwidth Option auf 0 gesetztX -Count ueberlaufX -Count unterlaufX -Regulaerer Ausdruck angegeben; r Flag bedeutungslosX -Die #, l und p Flags koennen im vi Modus nicht mit dem c Flag kombiniert werdenX -Keine Uebereinstimmung gefundenX -Kein vorhergehender 'tag' angegebenX -Weniger als %s Eintraege auf dem 'tag'-Stack; verwende :display t[ags]X -Keine Datei namens %s auf dem 'tag'-Stack; verwende :display t[ags]X -Druecke Enter um fortzufahren: X -%s: 'tag' nicht gefundenX -%s: kaputter 'tag' in %sX -%s: die Zeilennummer des 'tag' ist hinter dem DateiendeX -Der 'tag' Stack ist leerX -%s: Suchmuster nicht gefundenX -%d weitere Dateien zu edierenX -Puffer %s ist leerX -Bestaetige Aenderung [n]X -Unterbrochen.X -Kein vorhergehender Puffer zum AusfuehrenX -Kein vorhergehender regulaerer AusdruckX -Das Kommando %s verlangt, dass bereits eine Datei eingelesen wurdeX -Benutzung: %sX -Das visual Kommando verlangt dass die open Option gesetzt istX - -Leere DateiX -Keine vorhergehende F, f, T oder t SucheX -%s nicht gefundenX -Keine vorhergehende Datei zu edierenX -Cursor nicht auf einer ZahlX -Sich ergebende Zahl ist zu grossX -Sich ergebende Zahl ist zu kleinX -Kein korrespondierendes Zeichen in dieser ZeileX -Korrespondierendes Zeichen nicht gefundenX -Keine Zeichen zu ersetzenX -Keine andere Anzeige zum HinschaltenX -Zeichen nach Suchmuster, Zeilenoffset und/oder z KommandoX -Kein altes SuchmusterX -Suche zur urspruenglichen Position umgeschlagenX -Abkuerzung ueberschreitet Expansionsgrenze: Zeichen weggelassenX -Nicht erlaubtes Zeichen; maskiere zum EingebenX -Bereits am Anfang der EingabeX -Keine weiteren Zeichen zu loeschenX -Bewegung hinter das DateiendeX -Bewegung hinter das ZeilenendeX -Keine Cursorbewegung gemachtX -Bereits am DateianfangX -Bewegung vor den DateianfangX -Bereits in der ersten SpalteX -Puffer sollen vor dem Kommando angegeben werdenX -Bereits am DateiendeX -Bereits am ZeilenendeX -%s ist kein vi KommandoX -Benutzung: %sX -Keine Zeichen zu loeschenX -Das Q Kommando benoetigt das ex Terminal InterfaceX -Kein Kommando zu wiederholenX -Die Datei ist leerX -%s kann nicht als Bewegungskommando verwendet werdenX -Bereits im Kommando-ModusX - Cursor nicht auf einem WortX - -Wert der Window Option ist zu gross, max ist %uX -AnfuegenX -AendernX -KommandoX -EinfuegenX -ErsetzenX -Bewegung hinter das AnzeigenendeX -Bewegung vor den AnzeigenanfangX -Anzeige muss zum Zerlegen groesser als %d seinX -Keine Hintergrundanzeigen vorhandenX -Es gibt keine Hintergrundanzeige die eine Datei namens %s ediertX -Die einzige dargestellte Anzeige kann nicht in den Hintergrund gebracht werdenX -Die Anzeige kann nur auf %d Zeilen verkleinert werdenX -Die Anzeige kann nicht verkleinert werdenX -Die Anzeige kann nicht vergroessert werdenX - -Diese Anzeige kann nicht gestopped werdenX -Unterbrochen: umdefinierte Tasten ungueltigX -vi: temporaerer Puffer nicht freigegebenX -Dieses Terminal hat keine %s TasteX -es kann nur ein Puffer angegeben werdenX -Zahl groesser als %luX -UnterbrochenX -Nicht moeglich temporaere Datei anzulegenX -Warnung: %s ist keine regulaere DateiX -%s ist bereits gesperrt, nur-lese EditorsitzungX -%s: loeschenX -%s: schliessenX -%s: loeschenX -%s: loeschenX -Nur-lese Datei, nicht geschrieben; verwende ! zum UeberschreibenX -Nur-lese Datei, nicht geschriebenX -%s existiert, nicht geschrieben; verwende ! zum UeberschreibenX -%s existiert, nicht geschriebenX -Teil der Datei, nicht geschrieben; verwende ! zum UeberschreibenX -Teil der Datei, nicht geschriebenX -%s: Datei wurde spaeter als diese Kopie veraendert; verwende ! zum UeberschreibenX -%s: Datei wurde spaeter als diese Kopie veraendertX -%s: Schreibsperrung war nicht moeglichX -schreibe ...X -%s: WARNUNG: DATEI ABGESCHNITTENX -Bereits am ersten 'tag' dieser GruppeX -%s: neue Datei: %lu Zeilen, %lu ZeichenX -%s: %lu Zeilen, %lu ZeichenX -%s wurde in zu viele Dateinamen expandiertX -%s: keine regulaere DateiX -%s: gehoehrt nicht IhnenX -%s: anderer Benutzer als Eigentuemer hat ZugriffX -Datei wurde seit dem letzten vollstaendigen Schreiben geaendert; schreibe oder verwende ! zum ignorierenX -Datei wurde seit dem letzten vollstaendigen Schreiben geaendert; schreibe oder verwende :edit! zum ignorierenX -Datei wurde seit dem letzten vollstaendigen Schreiben geaendert; schreibe oder verwende ! zum ignorierenX -Datei ist temporaer; beim Verlassen gehen die Aenderungen verlorenX -Nur-lese Datei, Aenderungen werden nicht automatisch geschriebenX -Portokollierung neu begonnenX -bestaetigen [ynq]X -Druecke beliebige Taste um fortzufahrenX -Druecke beliebige Taste um fortzufahren [: um weitere Kommandos einzugeben]: X -Druecke beliebige Taste um fortzufahren [q zum Verlassen]: X -Diese Form von %s benoetigt das ex Terminal-InterfaceX -Gehe in ex Eingabe-Modus.\nX -Kommando schief gelaufen, noch keine Datei eingelesenX - weiter?X -unerwartetes Zeichen - EreignisX -unerwartetes Dateiende - EreignisX -Keine Position zum Anspringen gefundenX -unerwartetes Unterbrechungs - EreignisX -unerwartetes Verlassen - EreignisX -unerwartetes Wiederherstellungs - EreignisX -Bereits am letzten 'tag' dieser GruppeX -Das %s Kommando benoetigt das ex Terminal-InterfaceX -Diese Form von %s wird nicht unterstuetzt wenn die 'secure edit' - Option gesetzt istX -unerwartetes Zeichenketten - EreignisX -unerwartetes timeout - EreignisX -unerwartetes Schreibe - EreignisX - -Shell Expandierungen nicht unterstuetzt wenn die 'secure edit' - Option gesetzt istX -Das %s Kommando wird nicht unterstuetzt wenn die 'secure edit' - Option gesetzt istX -set: %s kann nicht ausgeschaltet werdenX -Anzeige zu klein.X -angefuegtX -geaendertX -geloeschtX -verbundenX -verschobenX -geschobenX -in Puffer geschriebenX -ZeileX -ZeilenX -Vi wurde nicht mit dem Tcl Interpreter gelinktX -Datei wurde seit dem letzten Schreiben veraendert.X -Shell Expansion nicht geklapptX -Es ist keine %s Edieroption angegebenX -Vi wurde nicht mit einem Perl Interpreter geladenX -Kein ex Kommando auszufuehrenX -Druecke um ein Kommando auszufuehren, :q zum verlassenX -Verwende "cscope help" fuer HilestellungX -Keine cscope Verbindung aktivX -%s: unbekannter Suchtyp: verwende einen aus %sX -%d: keine solche cscope VerbindungX -set: die %s Option kann nicht eingeschaltet werdenX -set: die %s Option kann nicht auf 0 gesetzt werdenX -%s: angefuegt: %lu Zeilen, %lu ZeichenX -unerwartetes Groessenveraenderungs - EreignisX -%d Dateien zu edierenX diff --git a/catalog/german.base b/catalog/german.base index 135b72da7994..f636df2b9c18 100644 --- a/catalog/german.base +++ b/catalog/german.base @@ -1,67 +1,66 @@ -002 "Zeilenlaengen Ueberlauf" -003 "kann Zeile %lu nicht loeschen" -004 "kann an Zeile %lu nicht anfuegen" -005 "kann in Zeile %lu nicht einfuegen" +002 "Zeilenlängen-Überlauf" +003 "kann Zeile %lu nicht löschen" +004 "kann an Zeile %lu nicht anfügen" +005 "kann in Zeile %lu nicht einfügen" 006 "kann Zeile %lu nicht speichern" 007 "kann letzte Zeile nicht lesen" 008 "Fehler: kann Zeile %lu nicht wiederherstellen" 009 "Protokolldatei" -010 "Keine Protokollierung aktiv, rueckgaengig machen nicht moeglich" -011 "Keine Aenderungen rueckgaengig zu machen" -012 "Keine Protokollierung aktiv, rueckgaengig machen nicht moeglich" -013 "Keine Protokollierung aktiv, Wiederholung von Aenderungen nicht moeglich" -014 "Keine Aenderungen zu wiederholen" +010 "Keine Protokollierung aktiv, Rückgängigmachen nicht möglich" +011 "Keine Änderungen rückgängig zu machen" +012 "Keine Protokollierung aktiv, Rückgängigmachen nicht möglich" +013 "Keine Protokollierung aktiv, Wiederholung von Änderungen nicht möglich" +014 "Keine Änderungen zu wiederholen" 015 "%s/%d: Protokollschreibfehler" -016 "Vi's Standardein- und ausgabe muss ein Terminal sein" +016 "Vi's Standardein- und -ausgabe muß ein Terminal sein" 017 "Marke %s: nicht gesetzt" -018 "Marke %s: die Zeile wurde geloescht" +018 "Marke %s: die Zeile wurde gelöscht" 019 "Marke %s: Cursorposition existiert nicht mehr" 020 "Fehler: " 021 "neue Datei" -022 "Name geaendert" -023 "geaendert" -024 "nicht geaendert" -025 "NICHT GELOCKED" +022 "Name geändert" +023 "geändert" +024 "nicht geändert" +025 "NICHT GELOCKT" 026 "nur zum Lesen" 027 "Zeile %lu von %lu [%ld%%]" 028 "leere Datei" 029 "Zeile %lu" 030 "Die Datei %s ist kein Meldungskatalog" -031 "Setzen der Voreinstellung fuer %s Option nicht moeglich" +031 "Setzen der Voreinstellung für %s Option nicht möglich" 032 "Benutzung: %s" 033 "set: keine %s Option: 'set all' zeigt alle Optionen mit Werten an" 034 "set: der [no]%s Option kann kein Wert zugewiesen werden" -035 "set: %s ist keine boolsche Option" +035 "set: %s ist keine Boolsche Option" 036 "set: %s Option: %s" -037 "set: %s Option: %s: Wert Ueberlauf" -038 "set: %s Option: %s ist eine ungueltige Zahl" -039 "set: %s ist keine boolsche Option" -040 "Anzeige hat zu wenig Spalten, weniger als %d" -041 "Anzeige hat zu viele Spalten, mehr als %d" -042 "Anzeige hat zu wenig Zeilen, weniger als %d" -043 "Anzeige hat zu viele Zeilen, mehr als %d" -044 "Die lisp Option ist nicht implementiert" -045 "Messages nicht abgeschalten: %s" -046 "Messages nicht eingeschalten: %s" -048 "Die paragraph Option muss Gruppen zu zwei Zeichen enthalten" -049 "Die section Option muss Gruppen zu zwei Zeichen enthalten" +037 "set: %s Option: %s: Werte-Überlauf" +038 "set: %s Option: %s ist eine ungültige Zahl" +039 "set: %s ist keine Boolsche Option" +040 "Bildschirm hat zu wenig Spalten, weniger als %d" +041 "Bildschirm hat zu viele Spalten, mehr als %d" +042 "Bildschirm hat zu wenig Zeilen, weniger als %d" +043 "Bildschirm hat zu viele Zeilen, mehr als %d" +044 "Die lisp-Option ist nicht implementiert" +045 "Meldungen nicht abgeschaltet: %s" +046 "Meldungen nicht eingeschaltet: %s" +047 "Die %s-Option muß Gruppen zu zwei Zeichen enthalten" 053 "Der Standardpuffer ist leer" 054 "Puffer %s ist leer" 055 "Dateien mit newlines im Namen sind nicht wiederherstellbar" -056 "Aenderungen nicht wiederherstellbar falls die Editorsitzung schief geht" -057 "kopiere Datei fuer Wiederherstellung ..." +056 "Änderungen nicht wiederherstellbar, falls die Editorsitzung schiefgeht" +057 "kopiere Datei für Wiederherstellung ..." 058 "Rettungsmechanismus funktioniert nicht: %s" -059 "Aenderungen nicht wiederherstellbar falls die Editorsitzung schief geht" +059 "Änderungen nicht wiederherstellbar, falls die Editorsitzung schiefgeht" 060 "Sicherung der Datei gescheitert: %s" -061 "kopiere Datei fuer Wiederherstellung ..." -062 "Informationen ueber den Benutzer mit id %u nicht gefunden" -063 "Wiederherstellungsdatei kann nicht gesperrt werden" -064 "Puffer der Wiederherstellungsdatei uebergelaufen" +061 "kopiere Datei für Wiederherstellung ..." +062 "Informationen über den Benutzer mit id %u nicht gefunden" +063 "Wiederherstellungsdatei kann nicht gelockt werden" +064 "Puffer der Wiederherstellungsdatei übergelaufen" 065 "Wiederherstellungsdatei" 066 "%s: Wiederherstellungsdatei hat falsches Format" 067 "%s: Wiederherstellungsdatei hat falsches Format" 068 "Keine von Ihnen lesbaren Dateien mit Namen %s zum Wiederherstellen" -069 "Es gibt aeltere Versionen dieser Datei von Ihnen zum Wiederherstellen" +069 "Es gibt ältere Versionen dieser Datei von Ihnen zum Wiederherstellen" 070 "Sie haben noch andere Dateien zum Wiederherstellen" 071 "schicke keine email: %s" 072 "Datei leer; nichts zu suchen" @@ -69,110 +68,110 @@ 074 "Kein altes Suchmuster" 075 "Suchmuster nicht gefunden" 076 "Dateianfang erreicht, ohne das Suchmuster zu finden" -077 "Suche umgeschlagen" +077 "Suche beginnt von vorn" 078 "suche ..." 079 "Keine nichtdruckbaren Zeichen gefunden" 080 "Unbekannter Kommandoname" -082 "%s: Kommando im ex Modus nicht verfuegbar" -083 "Count darf nicht Null sein" +082 "%s: Kommando im ex-Modus nicht verfügbar" +083 "Anzahl darf nicht Null sein" 084 "%s: falsche Zeilenangabe" 085 "Interner Syntaxtabellenfehler (%s: %s)" 086 "Benutzung: %s" -087 "%s: temporaerer Puffer nicht freigegeben" +087 "%s: temporärer Puffer nicht freigegeben" 088 "Flagoffset vor Zeile 1" 089 "Flagoffset hinter dem Dateiende" -090 "@ mit Bereich lief als Datei/Anzeige geaendert wurde" -091 "globales oder v-Kommando lief als Datei/Anzeige geaendert wurde" -092 "Ex Kommando misslungen: restliche Kommandoeingabe ignoriert" -093 "Ex Kommando misslungen: umdefinierte Tasten ungueltig" +090 "@ mit Bereich lief, als Datei/Anzeige geändert wurde" +091 "globales oder v-Kommando lief, als Datei/Anzeige geändert wurde" +092 "Ex-Kommando mißlungen: restliche Kommandoeingabe ignoriert" +093 "Ex-Kommando mißlungen: umdefinierte Tasten ungültig" 094 "Die zweite Adresse ist kleiner als die erste" 095 "Kein Markenname angegeben" 096 "\\ ohne folgenden / oder ?" 097 "Referenz auf eine negative Zeilennummer" 098 "Das Kommando %s ist unbekannt" -099 "Adresswert zu gross" -100 "Adresswert zu klein" -101 "Ungueltige Adresskombination" -102 "Ungueltige Adresse: nur %lu Zeilen in der Datei" -103 "Ungueltige Adresse: die Datei ist leer" +099 "Adreßwert zu groß" +100 "Adreßwert zu klein" +101 "Ungültige Adreßkombination" +102 "Ungültige Adresse: nur %lu Zeilen in der Datei" +103 "Ungültige Adresse: die Datei ist leer" 104 "Das Kommando %s erlaubt keine Adresse 0" -105 "Keine Abkuerzungen zum Anzeigen" -106 "Abkuerzungen muessen mit einem "Wort"-Zeichen enden" -107 "Abkuerzungen duerfen keine Tabulator- oder Leerzeichen enthalten" -108 "In Abkuerzungen duerfen ausser am Ende Wort- und Nicht-Wort-Zeichen nicht gemischt werden" -109 ""%s" ist keine Abkuerzung" -110 "Vi Kommando misslungen: umdefinierte Tasten ungueltig" -111 "Keine weiteren Dateien zu edieren" -112 "Keine vorhergehenden Dateien zu edieren" -113 "Keine vorhergehenden Dateien fuer rewind" +105 "Keine Abkürzungen zum Anzeigen" +106 "Abkürzungen müssen mit einem \"Wort\"-Zeichen enden" +107 "Abkürzungen dürfen keine Tabulator- oder Leerzeichen enthalten" +108 "In Abkürzungen dürfen außer am Ende Wort- und Nicht-Wort-Zeichen nicht gemischt werden" +109 "\"%s\" ist keine Abkürzung" +110 "Vi Kommando mißlungen: umdefinierte Tasten ungültig" +111 "Keine weiteren Dateien zu editieren" +112 "Keine vorhergehenden Dateien zu editieren" +113 "Keine vorhergehenden Dateien für rewind" 114 "Keine Dateiliste zum Anzeigen" -115 "Kein vorhergehendes Kommando um "!" zu ersetzen" -116 "Kein Dateiname fuer %%" -117 "Kein Dateiname fuer #" +115 "Kein vorhergehendes Kommando, um \"!\" zu ersetzen" +116 "Kein Dateiname für %%" +117 "Kein Dateiname für #" 118 "Fehler: execl: %s" -119 "I/O Fehler: %s" -120 "Datei wurde seit dem letzten vollstaendigen Schreiben geaendert; schreibe oder verwende ! zum ignorieren" +119 "E/A-Fehler: %s" +120 "Datei wurde seit dem letzten vollständigen Schreiben geändert; schreibe oder verwende ! zum ignorieren" 121 "Kann Homedirectory nicht bestimmen" 122 "Neues aktuelles Directory: %s" 123 "Keine Puffer anzuzeigen" 124 "Das Kommando %s kann nicht als Teil eines global oder v Kommandos verwendet werden" -125 "%s/%s: nicht gelesen: gehoehrt weder Ihnen noch root" -126 "%s/%s: nicht gelesen: gehoehrt nicht Ihnen" -127 "%s/%s: nicht gelesen: anderer Benutzer als Eigentuemer hat Schreibrecht" -128 "%s: nicht gelesen: gehoehrt weder Ihnen noch root" -129 "%s: nicht gelesen: gehoehrt nicht Ihnen" -130 "%s: nicht gelesen: anderer Benutzer als Eigentuemer hat Schreibrecht" +125 "%s/%s: nicht gelesen: gehört weder Ihnen noch root" +126 "%s/%s: nicht gelesen: gehört nicht Ihnen" +127 "%s/%s: nicht gelesen: anderer Benutzer als Eigentümer hat Schreibrecht" +128 "%s: nicht gelesen: gehört weder Ihnen noch root" +129 "%s: nicht gelesen: gehört nicht Ihnen" +130 "%s: nicht gelesen: anderer Benutzer als Eigentümer hat Schreibrecht" 131 "Keine folgenden Zeilen zum Verbinden" -132 "Kein Eingabe-Map Eintrag" -133 "Kein Kommando-Map Eintrag" +132 "Kein input-Map Eintrag" +133 "Kein command-Map Eintrag" 134 "Das %s Zeichen kann nicht umgemappt werden" -135 ""%s" ist momentan nicht gemappt" -136 "Markennamen muessen einzelne Buchstaben sein" -137 "%s existiert, nicht geschrieben; verwende ! zum Ueberschreiben" +135 "\"%s\" ist momentan nicht gemappt" +136 "Markennamen müssen einzelne Buchstaben sein" +137 "%s existiert, nicht geschrieben; verwende ! zum Überschreiben" 138 "Neue .exrc Datei: %s. " 139 "Zielzeile ist innerhalb des Verschiebebereichs" -140 "Das open Kommando verlangt, dass die open Option gesetzt ist" +140 "Das open Kommando verlangt, daß die open Option gesetzt ist" 141 "Das open Kommando ist nocht nicht implementiert" -142 "Rettung dieser Datei nicht moeglich" +142 "Rettung dieser Datei nicht möglich" 143 "Datei gerettet" 144 "%s wurde in zu viele Dateinamen expandiert" -145 "Nur regulaere Dateien und named pipes koennen gelesen werden" -146 "%s: Lesesperrung war nicht moeglich" +145 "Nur reguläre Dateien und named pipes können gelesen werden" +146 "%s: Locken zum Lesen war nicht möglich" 147 "lese ..." 148 "%s: %lu Zeilen, %lu Zeichen" -149 "Keine Hintegrundanzeigen vorhanden" -150 "Das script Kommando ist nur im vi Modus verfuegbar" -151 "Kein Kommando auszufuehren" +149 "Keine Hintergrundanzeigen vorhanden" +150 "Das script Kommando ist nur im vi Modus verfügbar" +151 "Kein Kommando auszuführen" 152 "shiftwidth Option auf 0 gesetzt" -153 "Count ueberlauf" -154 "Count unterlauf" -155 "Regulaerer Ausdruck angegeben; r Flag bedeutungslos" -156 "Die #, l und p Flags koennen im vi Modus nicht mit dem c Flag kombiniert werden" -157 "Keine Uebereinstimmung gefunden" +153 "Anzahl-Überlauf" +154 "Anzahl-Unterlauf" +155 "Regulärer Ausdruck angegeben; r Flag bedeutungslos" +156 "Die #, l und p Flags können im vi Modus nicht mit dem c Flag kombiniert werden" +157 "Keine Übereinstimmung gefunden" 158 "Kein vorhergehender 'tag' angegeben" -159 "Weniger als %s Eintraege auf dem 'tag'-Stack; verwende :display t[ags]" +159 "Weniger als %s Einträge auf dem 'tag'-Stack; verwende :display t[ags]" 160 "Keine Datei namens %s auf dem 'tag'-Stack; verwende :display t[ags]" -161 "Druecke Enter um fortzufahren: " +161 "Drücke Enter um fortzufahren: " 162 "%s: 'tag' nicht gefunden" 163 "%s: kaputter 'tag' in %s" 164 "%s: die Zeilennummer des 'tag' ist hinter dem Dateiende" 165 "Der 'tag' Stack ist leer" 166 "%s: Suchmuster nicht gefunden" -167 "%d weitere Dateien zu edieren" +167 "%d weitere Dateien zu editieren" 168 "Puffer %s ist leer" -169 "Bestaetige Aenderung [n]" +169 "Bestätige Änderung [n]" 170 "Unterbrochen." -171 "Kein vorhergehender Puffer zum Ausfuehren" -172 "Kein vorhergehender regulaerer Ausdruck" -173 "Das Kommando %s verlangt, dass bereits eine Datei eingelesen wurde" +171 "Kein vorhergehender Puffer zum Ausführen" +172 "Kein vorhergehender regulärer Ausdruck" +173 "Das Kommando %s verlangt, daß bereits eine Datei eingelesen wurde" 174 "Benutzung: %s" -175 "Das visual Kommando verlangt dass die open Option gesetzt ist" +175 "Das visual Kommando verlangt daß die open Option gesetzt ist" 177 "Leere Datei" 178 "Keine vorhergehende F, f, T oder t Suche" 179 "%s nicht gefunden" -180 "Keine vorhergehende Datei zu edieren" +180 "Keine vorhergehende Datei zu editieren" 181 "Cursor nicht auf einer Zahl" -182 "Sich ergebende Zahl ist zu gross" +182 "Sich ergebende Zahl ist zu groß" 183 "Sich ergebende Zahl ist zu klein" 184 "Kein korrespondierendes Zeichen in dieser Zeile" 185 "Korrespondierendes Zeichen nicht gefunden" @@ -180,11 +179,11 @@ 187 "Keine andere Anzeige zum Hinschalten" 188 "Zeichen nach Suchmuster, Zeilenoffset und/oder z Kommando" 189 "Kein altes Suchmuster" -190 "Suche zur urspruenglichen Position umgeschlagen" -191 "Abkuerzung ueberschreitet Expansionsgrenze: Zeichen weggelassen" +190 "Suche zur ursprünglichen Position zurückgekehrt" +191 "Abkürzung überschreitet Expansionsgrenze: Zeichen weggelassen" 192 "Nicht erlaubtes Zeichen; maskiere zum Eingeben" 193 "Bereits am Anfang der Eingabe" -194 "Keine weiteren Zeichen zu loeschen" +194 "Keine weiteren Zeichen zu löschen" 195 "Bewegung hinter das Dateiende" 196 "Bewegung hinter das Zeilenende" 197 "Keine Cursorbewegung gemacht" @@ -196,73 +195,73 @@ 203 "Bereits am Zeilenende" 204 "%s ist kein vi Kommando" 205 "Benutzung: %s" -206 "Keine Zeichen zu loeschen" -207 "Das Q Kommando benoetigt das ex Terminal Interface" +206 "Keine Zeichen zu löschen" +207 "Das Q Kommando benötigt das ex Terminal Interface" 208 "Kein Kommando zu wiederholen" 209 "Die Datei ist leer" 210 "%s kann nicht als Bewegungskommando verwendet werden" 211 "Bereits im Kommando-Modus" 212 " Cursor nicht auf einem Wort" -214 "Wert der Window Option ist zu gross, max ist %u" -215 "Anfuegen" -216 "Aendern" +214 "Wert der Window Option ist zu groß, max ist %u" +215 "Anhängen" +216 "Ändern" 217 "Kommando" -218 "Einfuegen" +218 "Einfügen" 219 "Ersetzen" 220 "Bewegung hinter das Anzeigenende" 221 "Bewegung vor den Anzeigenanfang" -222 "Anzeige muss zum Zerlegen groesser als %d sein" +222 "Anzeige muß für Bildschirmteilung größer als %d sein" 223 "Keine Hintergrundanzeigen vorhanden" -224 "Es gibt keine Hintergrundanzeige die eine Datei namens %s ediert" +224 "Es gibt keine Hintergrundanzeige, die eine Datei namens %s editiert" 225 "Die einzige dargestellte Anzeige kann nicht in den Hintergrund gebracht werden" 226 "Die Anzeige kann nur auf %d Zeilen verkleinert werden" 227 "Die Anzeige kann nicht verkleinert werden" -228 "Die Anzeige kann nicht vergroessert werden" -230 "Diese Anzeige kann nicht gestopped werden" -231 "Unterbrochen: umdefinierte Tasten ungueltig" -232 "vi: temporaerer Puffer nicht freigegeben" +228 "Die Anzeige kann nicht vergrößert werden" +230 "Diese Anzeige kann nicht gestopt werden" +231 "Unterbrochen: umdefinierte Tasten ungültig" +232 "vi: temporärer Puffer nicht freigegeben" 233 "Dieses Terminal hat keine %s Taste" 234 "es kann nur ein Puffer angegeben werden" -235 "Zahl groesser als %lu" +235 "Zahl größer als %lu" 236 "Unterbrochen" -237 "Nicht moeglich temporaere Datei anzulegen" -238 "Warnung: %s ist keine regulaere Datei" -239 "%s ist bereits gesperrt, nur-lese Editorsitzung" -240 "%s: loeschen" -241 "%s: schliessen" -242 "%s: loeschen" -243 "%s: loeschen" -244 "Nur-lese Datei, nicht geschrieben; verwende ! zum Ueberschreiben" -245 "Nur-lese Datei, nicht geschrieben" -246 "%s existiert, nicht geschrieben; verwende ! zum Ueberschreiben" +237 "Nicht möglich, temporäre Datei anzulegen" +238 "Warnung: %s ist keine reguläre Datei" +239 "%s ist bereits gelockt, Editorsitzung schreibgeschützt" +240 "%s: löschen" +241 "%s: schließen" +242 "%s: löschen" +243 "%s: löschen" +244 "Datei nicht schreibbar, nicht geschrieben; verwende ! zum Überschreiben" +245 "Datei nicht schreibbar, nicht geschrieben" +246 "%s existiert, nicht geschrieben; verwende ! zum Überschreiben" 247 "%s existiert, nicht geschrieben" -248 "Teil der Datei, nicht geschrieben; verwende ! zum Ueberschreiben" +248 "Teil der Datei, nicht geschrieben; verwende ! zum Überschreiben" 249 "Teil der Datei, nicht geschrieben" -250 "%s: Datei wurde spaeter als diese Kopie veraendert; verwende ! zum Ueberschreiben" -251 "%s: Datei wurde spaeter als diese Kopie veraendert" -252 "%s: Schreibsperrung war nicht moeglich" +250 "%s: Datei wurde später als diese Kopie verändert; verwende ! zum Überschreiben" +251 "%s: Datei wurde später als diese Kopie verändert" +252 "%s: Locken zum Schreiben war nicht möglich" 253 "schreibe ..." 254 "%s: WARNUNG: DATEI ABGESCHNITTEN" 255 "Bereits am ersten 'tag' dieser Gruppe" 256 "%s: neue Datei: %lu Zeilen, %lu Zeichen" 257 "%s: %lu Zeilen, %lu Zeichen" 258 "%s wurde in zu viele Dateinamen expandiert" -259 "%s: keine regulaere Datei" -260 "%s: gehoehrt nicht Ihnen" -261 "%s: anderer Benutzer als Eigentuemer hat Zugriff" -262 "Datei wurde seit dem letzten vollstaendigen Schreiben geaendert; schreibe oder verwende ! zum ignorieren" -263 "Datei wurde seit dem letzten vollstaendigen Schreiben geaendert; schreibe oder verwende :edit! zum ignorieren" -264 "Datei wurde seit dem letzten vollstaendigen Schreiben geaendert; schreibe oder verwende ! zum ignorieren" -265 "Datei ist temporaer; beim Verlassen gehen die Aenderungen verloren" -266 "Nur-lese Datei, Aenderungen werden nicht automatisch geschrieben" +259 "%s: keine reguläre Datei" +260 "%s: gehört nicht Ihnen" +261 "%s: anderer Benutzer als Eigentümer hat Zugriff" +262 "Datei wurde seit dem letzten vollständigen Schreiben geändert; schreibe oder verwende ! zum ignorieren" +263 "Datei wurde seit dem letzten vollständigen Schreiben geändert; schreibe oder verwende :edit! zum ignorieren" +264 "Datei wurde seit dem letzten vollständigen Schreiben geändert; schreibe oder verwende ! zum ignorieren" +265 "Datei ist temporär; beim Verlassen gehen die Änderungen verloren" +266 "Datei ist schreibgeschützt, Änderungen werden nicht automatisch geschrieben" 267 "Portokollierung neu begonnen" -268 "bestaetigen [ynq]" -269 "Druecke beliebige Taste um fortzufahren" -270 "Druecke beliebige Taste um fortzufahren [: um weitere Kommandos einzugeben]: " -271 "Druecke beliebige Taste um fortzufahren [q zum Verlassen]: " -272 "Diese Form von %s benoetigt das ex Terminal-Interface" +268 "bestätigen [ynq]" +269 "Drücke beliebige Taste um fortzufahren" +270 "Drücke beliebige Taste um fortzufahren [: um weitere Kommandos einzugeben]: " +271 "Drücke beliebige Taste um fortzufahren [q zum Verlassen]: " +272 "Diese Form von %s benötigt das ex Terminal-Interface" 273 "Gehe in ex Eingabe-Modus.\n" -274 "Kommando schief gelaufen, noch keine Datei eingelesen" +274 "Kommando schiefgelaufen, noch keine Datei eingelesen" 275 " weiter?" 276 "unerwartetes Zeichen - Ereignis" 277 "unerwartetes Dateiende - Ereignis" @@ -271,18 +270,18 @@ 280 "unerwartetes Verlassen - Ereignis" 281 "unerwartetes Wiederherstellungs - Ereignis" 282 "Bereits am letzten 'tag' dieser Gruppe" -283 "Das %s Kommando benoetigt das ex Terminal-Interface" -284 "Diese Form von %s wird nicht unterstuetzt wenn die 'secure edit' - Option gesetzt ist" +283 "Das %s Kommando benötigt das ex Terminal-Interface" +284 "Diese Form von %s wird nicht unterstützt wenn die 'secure edit' - Option gesetzt ist" 285 "unerwartetes Zeichenketten - Ereignis" 286 "unerwartetes timeout - Ereignis" 287 "unerwartetes Schreibe - Ereignis" -289 "Shell Expandierungen nicht unterstuetzt wenn die 'secure edit' - Option gesetzt ist" -290 "Das %s Kommando wird nicht unterstuetzt wenn die 'secure edit' - Option gesetzt ist" +289 "Shell Expandierungen nicht unterstützt wenn die 'secure edit' - Option gesetzt ist" +290 "Das %s Kommando wird nicht unterstützt wenn die 'secure edit' - Option gesetzt ist" 291 "set: %s kann nicht ausgeschaltet werden" 292 "Anzeige zu klein." -293 "angefuegt" -294 "geaendert" -295 "geloescht" +293 "angefügt" +294 "geändert" +295 "gelöscht" 296 "verbunden" 297 "verschoben" 298 "geschoben" @@ -290,18 +289,18 @@ 300 "Zeile" 301 "Zeilen" 302 "Vi wurde nicht mit dem Tcl Interpreter gelinkt" -303 "Datei wurde seit dem letzten Schreiben veraendert." -304 "Shell Expansion nicht geklappt" -305 "Es ist keine %s Edieroption angegeben" +303 "Datei wurde seit dem letzten Schreiben verändert." +304 "Shell Expansion hat nicht geklappt" +305 "Es ist keine %s Editieroption angegeben" 306 "Vi wurde nicht mit einem Perl Interpreter geladen" -307 "Kein ex Kommando auszufuehren" -308 "Druecke um ein Kommando auszufuehren, :q zum verlassen" -309 "Verwende "cscope help" fuer Hilestellung" +307 "Kein ex Kommando auszuführen" +308 "Drücke um ein Kommando auszuführen, :q zum verlassen" +309 "Verwende \"cscope help\" für Hilestellung" 310 "Keine cscope Verbindung aktiv" 311 "%s: unbekannter Suchtyp: verwende einen aus %s" 312 "%d: keine solche cscope Verbindung" 313 "set: die %s Option kann nicht eingeschaltet werden" 314 "set: die %s Option kann nicht auf 0 gesetzt werden" -315 "%s: angefuegt: %lu Zeilen, %lu Zeichen" -316 "unerwartetes Groessenveraenderungs - Ereignis" +315 "%s: angefügt: %lu Zeilen, %lu Zeichen" +316 "unerwartetes Größenveränderungs - Ereignis" 317 "%d Dateien zu edieren" diff --git a/catalog/german.check b/catalog/german.check deleted file mode 100644 index 4fd60c14e63b..000000000000 --- a/catalog/german.check +++ /dev/null @@ -1,36 +0,0 @@ -Unused message id's (this is okay): -001 -047 -050 -051 -052 -081 -176 -213 -229 -288 -========================= -MISSING ERROR MESSAGES (Please add!): -========================= -Extra error messages (just delete them): -========================= -MESSAGES WITH THE SAME MESSAGE ID's (FIX!): -========================= -Duplicate messages, both id and message (this is okay): -========================= -Duplicate messages, just message (this is okay): - 2 %s existiert, nicht geschrieben; verwende ! zum UeberschreibenX - 2 %s wurde in zu viele Dateinamen expandiertX - 2 %s: %lu Zeilen, %lu ZeichenX - 2 %s: Wiederherstellungsdatei hat falsches FormatX - 2 Aenderungen nicht wiederherstellbar falls die Editorsitzung schief gehtX - 2 Kein altes SuchmusterX - 2 Keine Protokollierung aktiv, rueckgaengig machen nicht moeglichX - 2 Puffer %s ist leerX - 2 geaendertX - 2 kopiere Datei fuer Wiederherstellung ...X - 2 set: %s ist keine boolsche OptionX - 3 %s: loeschenX - 3 Datei wurde seit dem letzten vollstaendigen Schreiben geaendert; schreibe oder verwende ! zum ignorierenX - 4 Benutzung: %sX -========================= diff --git a/catalog/german.owner b/catalog/german.owner index e72e8ae268fc..efed56a0a76f 100644 --- a/catalog/german.owner +++ b/catalog/german.owner @@ -1 +1,2 @@ -Bernhard Daeubler +Bernhard Daeubler +Joerg Wunsch diff --git a/catalog/polish.base b/catalog/polish.base new file mode 100644 index 000000000000..74b2756934a0 --- /dev/null +++ b/catalog/polish.base @@ -0,0 +1,306 @@ +002 "Zbyt d³uga linia" +003 "nie mo¿na usun±æ linii %lu" +004 "nie mo¿na dodaæ do linii %lu" +005 "nie mo¿na wstawiæ w linii %lu" +006 "nie mo¿na zachowaæ linii %lu" +007 "nie mo¿na pobraæ ostatniej linii" +008 "B³±d: nie mo¿na pobraæ linii %lu" +009 "Plik logu" +010 "Brak logowania, anulowanie (undo) niemo¿liwe" +011 "Brak zmian do anulowania" +012 "Brak logowania, anulowanie (undo) niemo¿liwe" +013 "Brak logowania, nie mo¿na przegl±daæ do przodu" +014 "Brak zmian do powtórzenia" +015 "%s/%d: b³±d zapisu do logu" +016 "Standardowe wej¶cie i wyj¶cie vi musi byæ terminalem" +017 "Znacznik %s: nie ustawiony" +018 "Znacznik %s: linia zosta³a usuniêta" +019 "Znacznik %s: pozycja kursora ju¿ nie istnieje" +020 "B³±d: " +021 "nowy plik" +022 "nazwa zosta³a zmieniona" +023 "zmieniony" +024 "nie zmieniony" +025 "ODBLOKOWANY" +026 "tylko do odczytu" +027 "linia %lu z %lu [%ld%%]" +028 "pusty plik" +029 "linia %lu" +030 "Plik %s nie jest katalogiem komunikatów" +031 "Nie mo¿na ustawiæ domy¶lnej opcji %s" +032 "Sposób u¿ycia: %s" +033 "set: brak opcji %s: 'set all' wy¶wietla warto¶ci opcji" +034 "set: opcja no]%s nie pobiera warto¶ci" +035 "set: opcja %s nie jest zmienn± boolowsk±" +036 "set: opcja %s: %s" +037 "set: opcja %s: %s: przepe³nienie" +038 "set: opcja %s: %s nie jest poprawn± liczb±" +039 "set: opcja %s nie jest zmienn± boolowsk±" +040 "Zbyt ma³a liczba kolumn ekranu, mniejsza ni¿ %d" +041 "Zbyt du¿a liczba kolumn, wiêksza ni¿ %d" +042 "Zbyt ma³a liczba wierszy ekranu, mniejsza ni¿ %d" +043 "Zbyt du¿a liczba wierszy ekranu, wiêksza ni¿ %d" +044 "Opcja lisp nie jest zaimplementowana" +045 "komunikaty nie wy³±czone: %s" +046 "komunikaty nie w³±czone: %s" +047 "Opcja %s musi sk³adaæ siê z dwóch grup symboli" +053 "Domy¶lny bufor jest pusty" +054 "Bufor %s jest pusty" +055 "Pliki z symbolem nowego wiersza w nazwie nie mog± byæ odtworzone" +056 "Zmiany nie do odtworzenia, je¶li sesja zostanie przerwana" +057 "Tworzenie kopii zapasowej..." +058 "B³±d podczas zachowywania: %s" +059 "Zmiany nie do odtworzenia, je¶li sesja zostanie przerwana" +060 "B³±d podczas tworzenia kopii zapasowej: %s" +061 "Tworzenie kopii zapasowej..." +062 "Nie znaleziono informacji o u¿ytkowniku numer %u" +063 "Nie mo¿na zablokowaæ kopii zapasowej" +064 "Przepe³nienie bufora kopii zapasowej" +065 "Kopia zapasowa" +066 "%s: b³êdna kopia zapasowa" +067 "%s: b³êdna kopia zapasowa" +068 "Brak plików o nazwie %s, które móg³by¶ odczytaæ, do odzyskania" +069 "Istniej± starsze wersje tego pliku, które mo¿na odzyskaæ" +070 "Istniej± inne pliki, które mo¿na odzyskaæ" +071 "nie wysy³am poczty: %s" +072 "Pusty plik; nie ma czego szukaæ" +073 "Dotarto do koñca pliku bez znalezienia szukanego wzorca" +074 "Brak poprzedniego wzorca poszukiwañ" +075 "Nie znaleziono wzorca" +076 "Dotarto do pocz±tku pliku bez znalezienia szukanego wzorca" +077 "Poszukiwanie od pocz±tku" +078 "Szukam..." +079 "Nie znaleziono niedrukowalnych znaków" +080 "Nieznana nazwa polecenia" +082 "%s: polecenie niedostêpne w trybie edytora ex" +083 "Liczba nie mo¿e byæ zerem" +084 "%s: b³êdny numer linii" +085 "Wewnêtrzny b³±d tablicy sk³adni (%s: %s)" +086 "Sposób u¿ycia: %s" +087 "%s: tymczasowy bufor nie zosta³ zwolniony" +088 "Przesuniêcie przed liniê 1" +089 "Przesuniêcie poza koniec pliku" +090 "@ with range running when the file/screen changed" +091 "Wykonywano polecenie globalne/wizualne podczas zmiany pliku/ekranu" +092 "B³±d polecenie ex: pozosta³e polecenia anulowane" +093 "B³±d polecenia ex: mapowanie klawiszy anulowane" +094 "Drugi adres jest mniejszy od pierwszego" +095 "Nie podano nazwy znacznika" +096 "\\ bez / lub ?" +097 "Odniesienie do linii o numerze mniejszym od 0" +098 "Nieznane polecenie %s" +099 "Przepe³nienie warto¶ci adresu" +100 "Niedomiar warto¶ci adresu" +101 "Niedozwolona kombinacja adresu" +102 "Niedozwolony adres: jest tylko %lu linii w pliku" +103 "Niedozwolony adres: plik jest pusty" +104 "Polecenie %s nie zezwala na u¿ycie adresu 0" +105 "Brak skrótów do wy¶wietlenia" +106 "Skróty musz± siê koñczyæ symbolem \"s³owo\"" +107 "Skróty nie mog± zawieraæ spacji lub tabulacji" +108 "Skróty nie mog± przeplataæ symboli s³owo/nie-s³owo, z wyj±tkiem na koñcu linii" +109 "\"%s\" nie jest skrótem" +110 "B³±d polecenia vi: mapowanie klawiszy odrzucone" +111 "Nie ma wiêcej plików do edycji" +112 "Nie ma poprzednich plików do edycji" +113 "Nie ma poprzednich plików do przewiniêcia wstecz" +114 "Nie ma listy plików do wy¶wietlenia" +115 "Nie ma poprzedniego polecenia do zast±pienia \"!\"" +116 "Nie ma nazwy pliku do zast±pienia %%" +117 "Nie ma nazwy pliku do zast±pienia #" +118 "B³±d: execl: %s" +119 "B³±d I/O: %s" +120 "Plik zmodyfikowany od ostatniego zapisu; zapisz lub u¿yj ! ¿eby wymusiæ" +121 "Nie mozna znale¼æ katalogu domowego (home)" +122 "Nowy katalog bie¿±cy: %s" +123 "Nie ma buforów edycji do wy¶wietlenia" +124 "Polecenie %s nie mo¿e byæ u¿yte jako czê¶æ polecenia globalnego lub wizualnego" +125 "%s/%s: nie wczytany: nie nale¿y do ciebie ani do roota" +126 "%s/%s: nie wczytany: nie nale¿y do ciebie" +127 "%s/%s: nie wczytany: inny u¿ytkownik ni¿ w³a¶ciciel ma prawo do zapisu" +128 "%s: nie wczytany: nie nale¿y do ciebie ani do roota" +129 "%s: nie wczytany: nie nale¿y do ciebie" +130 "%s: nie wczytany: inny uzytkownik ni¿ w³a¶ciciel ma prawo do zapisu" +131 "Brak kolejnych linii do po³±czenia" +132 "Brak pozycji map wej¶ciowych" +133 "Brak pozycji map poleceñ" +134 "Znak %s nie mo¿e byæ przemapowany" +135 "\"%s\" obecnie nie jest mapowany" +136 "Nazwa znacznika musi byæ pojedyñcz± liter±" +137 "%s istnieje, nie zapisany; u¿yj ! ¿eby wymusiæ" +138 "Nowy plik exrc: %s" +139 "Linia docelowa jest wewn±trz przenoszonego obszaru" +140 "Polecenie open wymaga ustawienia opcji open" +141 "Polecenie open jest niezaimplementowane" +142 "Niemo¿liwe jest zachowanie tego pliku" +143 "Plik zachowany" +144 "%s: rozwija siê na zbyt wiele nazw plików" +145 "Tylko zwyk³e pliki i nazwane ³±cza (named pipes) mo¿na czytaæ" +146 "%s: nie mo¿na za³o¿yæ blokady do odczytu" +147 "Czytanie..." +148 "%s: %lu linii, %lu znaków" +149 "Brak ekranów w tle do wy¶wietlenia" +150 "Polecenie script dostêpne jest tylko w trybie vi" +151 "Brak polecenia do wykonania" +152 "Opcja shiftwidth ustawiona na 0" +153 "Przepe³nienie licznika" +154 "Niedomiar licznika" +155 "Podano wyra¿enie regularne; flaga r nie ma znaczenia" +156 "Flagi #, l oraz p nie mog± byæ ³±czone z flag± c w trybie vi" +157 "Nie znaleziono wzorca" +158 "Brak poprzedniego znacznika" +159 "Mniej ni¿ %s na stosie znaczników; u¿yj :display t[ags]" +160 "Brak pliku %s na stosie znaczników do powrotu; u¿yj :display t[ags]" +161 "Naci¶nij Enter: " +162 "%s: znacznik nie znaleziony" +163 "%s: b³êdny znacznik w %s" +164 "%s: numer linii znacznika wykracza poza koniec pliku" +165 "Stos znaczników jest pusty" +166 "%s: nie znaleziono szukanego wzorca" +167 "%d plików jeszcze do edycji" +168 "Bufor %s jest pusty" +169 "Potwierdzasz zmianê? [n]" +170 "Przerwany" +171 "Brak poprzedniego bufora do wykonania" +172 "Brak poprzedniego wyra¿enia regularnego" +173 "Polecenie %s wymaga uprzedniego wczytania pliku" +174 "Sposób u¿ycia: %s" +175 "Polecenie wizualne wymaga ustawienia opcji open" +177 "Pusty plik" +178 "Brak poprzedniego szukania F, f, T lub t" +179 "%s nie znaleziono" +180 "Brak poprzedniego pliku do edycji" +181 "Kursor nie na liczbie" +182 "Liczba wynikowa zbyt du¿a" +183 "Liczba wynikowa zbyt ma³a" +184 "Brak pasuj±cych znaków w tej linii" +185 "Nie znaleziono pasuj±cych znaków" +186 "Brak znaków do zamiany" +187 "Brak innego ekranu do prze³±czenia" +188 "Znaki poza napisem do szukania, przesuniêciem linii i/lub poleceniem z" +189 "Brak poprzedniego wzorca szukania" +190 "Szukanie wróci³o do pierwotnej pozycji" +191 "Skrót przekroczy³ limit rozwiniêcia: czê¶æ znaków odrzucono" +192 "Niedozwolony znak; zacytuj, ¿eby wprowadziæ" +193 "Ju¿ na pocz±tku wstawiania" +194 "Brak kolejnych znaków do usuniêcia" +195 "Przesuniêcie poza koniec pliku" +196 "Przesuniêcie poza koniec linii" +197 "Nie wykonano przesuniêcia kursora" +198 "Ju¿ na pocz±tku pliku" +199 "Przesuniêcie przed pocz±tek pliku" +200 "Ju¿ w pierwszej kolumnie" +201 "Nale¿y podaæ bufory przed poleceniem" +202 "Ju¿ na koñcu pliku" +203 "Ju¿ na koñcu linii" +204 "%s nie jest poleceniem vi" +205 "Sposób u¿ycia: %s" +206 "Brak znaków do usuniêcia" +207 "Polecenie Q wymaga interfejsu terminala ex" +208 "Brak polecenia do powtórzenia" +209 "Plik jest pusty" +210 "%s nie mo¿e byæ u¿yte jako polecenie przesuniêcia" +211 "Ju¿ w trybie poleceñ" +212 "Kursor nie na s³owie" +214 "Warto¶ci opcji okna zbyt du¿e, max to %u" +215 "Do³±cz" +216 "Zmieñ" +217 "Polecenie" +218 "Wstaw" +219 "Zamieñ" +220 "Przesuniêcie poza koniec ekranu" +221 "Przesuniêcie przed pocz±tek ekranu" +222 "Ekran musi mieæ wiêcej ni¿ %d linii, ¿eby go podzieliæ" +223 "Brak ekranów w tle" +224 "Nie ma ekranu w tle z edycj± pliku o nazwie %s" +225 "Nie mo¿na schowaæ w tle jedynego ekranu edycyjnego" +226 "Mo¿na zmniejszyæ ekran tylko do %d wierszy" +227 "Ekran nie mo¿e byæ zmniejszony" +228 "Ekran nie mo¿e byæ zwiêkszony" +230 "Ekran nie mo¿e byæ zawieszony" +231 "Przerwano: odrzucono mapowane klawisze" +232 "vi: nie zwolniono bufora tymczasowego" +233 "Ten terminal nie posiada klawisza %s" +234 "Mo¿na podaæ tylko jeden bufor" +235 "Liczba wiêksza ni¿ %lu" +236 "Przerwano" +237 "Nie mo¿na utworzyæ pliku tymczasowego" +238 "Uwaga: %s nie jest zwyk³ym plikiem" +239 "%s ju¿ zablokowany, sesja tylko do odczytu" +240 "%s: usuñ" +241 "%s: zamknij" +242 "%s: usuñ" +243 "%s: usuñ" +244 "Plik tylko do odczytu, nie zapisany; u¿yj ! ¿eby wymusiæ" +245 "Plik tylko do odczytu, nie zapisany" +246 "%s istnieje, nie zapisany; u¿yj ! ¿eby wymusiæ" +247 "%s istnieje, nie zapisany" +248 "Plik czê¶ciowy, nie zapisany; u¿yj ! ¿eby wymusiæ" +249 "Plik czê¶ciowy, nie zapisany" +250 "%s: plik zmodyfikowany pó¼niej, ni¿ ta kopia; u¿yj ! ¿eby wymusiæ" +251 "%s: plik zmodyfikowany pó¼niej, ni¿ ta kopia" +252 "%s: nie mo¿na zablokowaæ do pisania" +253 "Zapisywanie..." +254 "%s: OSTRZE¯ENIE: PLIK ZOSTA£ OBCIÊTY" +255 "Ju¿ przy pierwszym znaczniku z tej grupy" +256 "%s: nowy plik: %lu linii, %lu znaków" +257 "%s: %lu linii, %lu znaków" +258 "%s rozwija siê na zbyt wiele nazw plików" +259 "%s: nie jest zwyk³ym plikiem" +260 "%s: nie jeste¶ w³a¶cicielem" +261 "%s: dostêpny dla u¿ytkownika innego ni¿ w³a¶ciciel" +262 "Plik zmodyfikowany od ostatniego zapisu; zapisz lub u¿yj ! ¿eby wymusiæ" +263 "Plik zmodyfikowany od ostatniego zapisu; zapisz lub u¿yj :edit! ¿eby wymusiæ" +264 "Plik zmodyfikowany od ostatniego zapisu; zapisz lub u¿yj ! ¿eby wymusiæ" +265 "To jest plik tymczasowy; wyj¶cie anuluje zmiany" +266 "Plik tylko do odczytu, nie ma autozapisu zmian" +267 "Ponownie rozpoczêto logowanie" +268 "potwierdzasz? [ynq]" +269 "Naci¶nij dowolny klawisz: " +270 "Naci¶nij dowolny klawisz [: ¿eby podaæ nastêpne polecenia ex]: " +271 "Naci¶nij dowolny klawisz [q ¿eby zakoñczyæ]: " +272 "Ta forma %s wymaga interfejsu terminala ex" +273 "Wchodzê w tryb wprowadzania ex." +274 "B³±d polecenia, jeszcze nie wczytano pliku." +275 " dalej?" +276 "Nieoczekiwany symbol" +277 "Nieoczekiwany koniec pliku" +278 "Brak wzorców pasuj±cych do zapytania" +279 "Nieoczekiwane przerwanie" +280 "Nieoczekiwane polecenie koniec" +281 "Nieoczekiwane polecenie od¶wie¿enia" +282 "Ju¿ przy ostatnim znaczniku z tej grupy" +283 "Polecenie %s wymaga interfejsu terminala ex" +284 "Ta forma %s jest niedostêpna, kiedy ustawiona jest opcja bezpiecznej edycji" +285 "Nieoczekiwany ci±g znaków" +286 "Nieoczekiwany timeout" +287 "Nieoczekiwane polecenie zapisu" +289 "Rozwiniêcia shella niedostêpne w trybie bezpiecznej edycji" +290 "Polecenie %s jest niedostêpne w trybie bezpiecznej edycji" +291 "set: opcji %s nie mo¿na wy³±czyæ" +292 "Ekran zbyt ma³y." +293 "dodano" +294 "zmieniono" +295 "usuniêto" +296 "po³±czono" +297 "przeniesiono" +298 "przesuniêto" +299 "wczytano" +300 "linia" +301 "linii" +302 "Vi nie zosta³ uruchomiony z interpreterem Tcl" +303 "Plik zmodyfikowany od ostatniego zapisu" +304 "B³±d rozwiniêcia shella" +305 "Brak opcji %s edycji" +306 "Vi nie zosta³ uruchomiony z interpreterem Perl" +307 "Brak polecenia ex do wykonania" +308 "Naci¶nij ¿eby wykonac polecenie, :q ¿eby wyj¶æ" +309 "U¿yj \"cscope help\" w celu uzyskania pomocy" +310 "Brak aktywnych po³±czeñ cscope" +311 "%s: nieznany typ poszukiwañ: u¿yj jednego z %s" +312 "%d: brak takiej sesji cscope" +313 "set: nie mo¿na nigdy w³±czyæ opcji %s" +314 "set: opcja %s nie mo¿e nigdy mieæ warto¶ci 0" +315 "%s: dodano: %lu linii, %lu znaków" +316 "Nieoczekiwane polecenie zmiany rozmiaru" +317 "%d plików do edycji" diff --git a/catalog/polish.owner b/catalog/polish.owner new file mode 100644 index 000000000000..1fcf5c545810 --- /dev/null +++ b/catalog/polish.owner @@ -0,0 +1 @@ +Andrzej Bia³ecki diff --git a/catalog/ru_RU.KOI8-R b/catalog/ru_RU.KOI8-R deleted file mode 100644 index 7eb35b9cf262..000000000000 --- a/catalog/ru_RU.KOI8-R +++ /dev/null @@ -1,267 +0,0 @@ -VI_MESSAGE_CATALOG -pEREPOLNENIE ZNA^ENIQ DLINY STROKIX -%s/%d: NEWOZMOVNO UDALITX STROKU %uX -%s/%d: NEWOZMOVNO DOBAWITX K STROKE %uX -%s/%d: NEWOZMOVNO WSTAWITX W STROKU %uX -%s/%d: NEWOZMOVNO SOHRANITX STROKU %uX -%s/%d: NEWOZMOVNO DOSTATX POSLEDN@@ STROKUX - -fAJL ZAPISEJX -zAPISI NE WELISX, NEWOZMOVNO OTMENITX POSLEDN@@ KOMANDUX -nET IZMENENIJ DLQ OTMENYX -zAPISI NE WELISX, NEWOZMOVNO OTMENITX POSLEDN@@ KOMANDUX -zAPISI NE WELISX, NEWOZMOVNO PROSMOTRETX WPEREDX -nET IZMENENIJ DLQ PEREDELKIX -%s/%d: O[IBKA PRI ZAPISI PROTOKOLAX -sTANDARTNYJ WWOD/WYWOD DLQ VI DOLVEN BYTX TERMINALX -oTMETKA %s: NE USTANOWLENAX -oTMETKA %s: STROKA BYLA UDALENAX -oTMETKA %s: POZICII KURSORA BOLX[E NE SU]ESTWUETX -o[IBKA:X - - - - - - - - - -fAJL %s NE QWLQETSQ KATALOGOM SOOB]ENIJX -nEWOZMOVNO USTANOWITX OPCI@ %s PO UMOL^ANI@X -iSPOLXZOWANIE: %sX -oPCII %s NET: 'set all' POKAZYWAET WSE WOZMOVNYE OPCIIX -set: [no]%s NE PRINIMAET TAKOGO ZNA^ENIQX -set: %s OPCIQ NE QWLQETSQ DWOI^NOJX - - -set: NEPRAWILXNOE ZNA^ENIE %sX -set: %s OPCIQ NE QWLQETSQ DWOI^NOJX -kOLI^ESTWO KOLONOK \KRANA SLI[KOM MALO, MENX[E ^EM %dX -kOLI^ESTWO KOLONOK \KRANA SLI[KOM WELIKO, BOLX[E ^EM %dX -kOLI^ESTWO STROK \KRANA SLI[KOM MALO, MENX[E ^EM %dX -kOLI^ESTWO STROK \KRANA SLI[KOM WELIKO, BOLX[E ^EM %dX -oPCIQ lisp OTSUTSTWUETX -sOOB]ENIQ NE WYKL@^ENY: %sX -sOOB]ENIQ NE WKL@^ENY: %sX -oPCIQ modeline(s) NE MOVET BYTX PEREUSTANOWLENAX -oPCIQ paragraph DOLVNA SOSTOQTX IZ GRUPP S DWUMQ SIMWOLAMIX -oPCIQ section DOLVNA SOSTOQTX IZ GRUPP S DWUMQ SIMWOLAMIX -oPCIQ shiftwidth NE MOVET BYTX USTANOWLENA NA 0X -oPCIQ sourceany NE MOVET BYTX USTANOWLENAX -tABULQCIQ NE MOVET BYTX USTANOWLENA NA 0X -sTARTOWYJ BUFER PUSTX -bUFER %s PUSTX -fAJLY S SIMWOLAMI PEREWODA STROKI W IMENI NE MOGUT BYTX WOSSTANOWLENYX -iZMENENIQ NE SOHRANENY PRI KRAHE SESSIIX - -sOHRANENIE NE UDALOSX: %sX -iZMENENIQ NE SOHRANQ@TSQ PRI OBRYWE SESSIIX -sOHRANENIE KOPII FAJLA NE UDALOSX: %sX - -iNFORMACII NA POLXZOWATELQ %u NE NAJDENOX -nEWOZMOVNO ZA]ITITX SPASENNYJ FAJLX -bUFER WOSSTANOWLENNOGO FAJLA PEREPOLNENX -wOSSTANOWLENNYJ FAJLX -%s: NE DO KONCA WOSSTANOWLENNYJ FAJLX -%s: NE DO KONCA WOSSTANOWLENNYJ FAJLX -fAJLOW S IMENEM %s, KOTORYE wY MOVETE ^ITATX, NE SU]ESTWUETX -eSTX STARYE WERSII FAJLA, KOTORYE MOVNO WOSSTANOWITXX -sU]ESTWU@T DRUGIE FAJLY, KOTORYE MOVNO WOSSTANOWITXX -E-mail NE POSLAN: %sX -fAJL PUST - ISKATX NE^EGOX -dOSTIGNUT KONEC FAJLA BEZ NAHOVDENIQ OBRAZCA POISKAX -nE ZADAN OBRAZEC POISKAX -oBRAZEC POISKA NE NAJDENX -dOSTUPNO NA^ALO FAJLA BEZ NAHOVDENIQ OBRAZCA POISKAX -pOISK ZACIKLENX - -nEPE^ATNYH SIMWOLOW NE NAJDENOX -nEIZWESTNAQ KOMANDAX - -kOMANDA NE DOSTUPNA W REVIME exX -s^ET^IK NE MOVET BYTX NULEMX -%s: NEPRAWILXNOE UKAZANIE STROKIX -wNUTRENNQQ O[IBKA W SINTAKSISE (%s: %s)X -iSPOLXZOWANIE: %sX -%s: WREMENNYJ BUFER NE ISPOLXZOWANX -mETKA POSTAWLENA PERED STROKOJ 1X -mETKA POSTAWLENA POSLE KONCA FAJLAX - - -kOMANDA ex NE UDALASX: PARAMETRY KOMANDY ZABYTYX - -wTOROJ ADRES MENX[E ^EM PERWYJX -nE UKAZANO NAZWANIE OTMETKIX -\\ NE ZAWER[AETSQ / ILI ?X -sSYLKA K STROKE S NOMEROM MENX[E 0X -kOMANDA %s NEIZWESTNAX -pEREPOLNENIE ZNA^ENIQ ADRESAX -nEDOBOR ZNA^ENIQ ADRESAX -nEDOPUSTIMAQ KOMBINACIQ W ADRESEX -nEPRAWILXNYJ ADRES: WSEGO %lu STROK W FAJLEX -nEPRAWILXNYJ ADRES: FAJL PUSTX -kOMMANDA %s NE MOVET ISPOLXZOWATX ADRES 0X -aBBREWIATURY OTSUTSTWU@TX -aBBREWIATURY DOLVNY ZAKAN^IWATXSQ SIMWOLOM "word"X -aBBREWIATURY NE MOGUT SODERVATX SIMWOLOY TABLQCII ILI PROBELYX -aBBREWIATURY NE MOGUT SO^ETATXSQ S SIMWOLAMI SLOW/NE-SLOW, ZA ISKL@^ENIEM KONCA STROKIX -"%s" NE QWLQETSQ ABBREWIATUROJX - -fAJLOW DLQ REDAKTIROWANIQ BOLX[E NETX -oTSUTSTWIE PREDYDU]EGO FAJLA DLQ REDAKTIROWANIQX -oTSUTSTWIE PREDYDU]EGO FAJLA DLQ PROSMOTRA NAZADX -nET FAJLOWX -oTSUTSTWIE PREDYDU]EJ KOMANDY DLQ ZAMENY "!"X -oTSUTSTWIE ZAMENY DLQ %%X -oTSUTSTWIE ZAMENY DLQ #X -o[IBKA: execl: %sX -o[IBKA WWODA/WYWODA: %sX -fAJL IZMENEN S MOMENTA POSLEDNEJ POLNOJ ZAPISI: ISPOLXZUJTE ! DLQ OBHODAX -nEWOZMOVNO NAJTI DOMA[NIJ KATALOGX -nOWYJ KATALOG: %sX -nET WYREZANYH BUFEROWX -kOMANDA %s NE MOVET BYTX ISPOLXZOWANA WNUTRI OB]EJ KOMANDYX -%s/%s: NE OTKRYT: NE PRINADLEVIT wAM ILI root-UX -%s/%s: NE OTKRYT: NE PRINADLEVIT wAMX -%s/%s: NE OTKRYT: WOZMOVNOSTX ZAPISI U POLXZOWATELQ, NE QWLQ@]EGOSQ WLADELXCEMX -%s/%s: NE S^ITAN: NE PRINADLEVIT wAM ILI root-UX -%s/%s: NE S^ITAN: NE PRINADLEVIT wAMX -%s/%s: NE S^ITAN: WOZMOVNOSTX ZAPISI U POLXZOWATELQ, NE QWLQ@]EGOSQ WLADELXCEMX -pOSLEDU@]IE STROKI OTSUTSTWU@TX -oTSUTSTWIE PARAMETROW WWODAX -oTSUTSTWIE PARAMETROW KOMANDYX -sIMWOL %s NE MOVET BYTX PEREZAPOMNENX -"%s" NA DANNYJ MOMENT NE OTME^ENX -iMQ METKI DOLVNO BYTX ODNIM SIMWOLOMX -%s SU]ESTWUET, NE ZAPISAN; ISPOLXZUJTE ! DLQ OBHODAX -nOWYJ FAJL .exrc: %sX -sTROKA PERENOSA NAHODITSQ WNUTRI PARAMETROW PERENOSAX -kOMANDA open PODRAZUMEWAET USTANOWKU OPCII openX -kOMANDA open NE REALIZOWANAX -zA]ITA FAJLA NEWOZMOVNAX -fAJL ZA]I]ENX -%s RAS[IRILSQ W SLI[KOM BOLX[OE KOLI^ESTWO IMEN FAJLOWX - -%s: ZA]ITA NA ^TENIE BYLA NEDOSTUPNAX - -%s: %lu STROK, %lu SIMWOLOWX -nET TENEWYH OKONX -kOMANDA script ISPOLXZUETSQ TOLXKO W REVIME viX -nET KOMANDY DLQ ISPOLNENIQX -oPCIQ shiftwidth USTANOWLENA NA 0X -pEREPOLNENIE S^ET^IKAX -cIKL WYPOLNEN NE DO KONCAX -uKAZANO REGULQRNOE WYRAVENIE: FLAG r NE NUVENX -fLAGI #, l I p NE MOGUT BYTX OB_EDINENY S FLAGOM c W REVIME viX -sOWPADENIJ NETX -mETKA OTSUTSTWUETX -w STEKE METOK ZAPISEJ MENX[E, ^EM %s, ISPOLXZUJTE :display t[ags]X -fAJLA S IMENEM %s W STEKE METOK NET; ISPOLXZUJTE :display t[ags]X - -%s: METKA NE NAJDENAX -%s: PLOHAQ METKA W %sX - -sTEK METOK PUSTX -%s: ISKOMAQ PEREMENNAQ NE NAJDENAX - -bUFER %s PUSTX - -pRERWANOX -oTSUTSTWIE BUFERA DLQ ISPOLXZOWANIQX -nET PREDIDU]EGO REGULQRNOGO WYRAVENIQX -kOMANDA %s PODRAZUMEWAET NALI^IE PRO^TENNOGO FAJLAX -iSPOLXZOWANIE: %sX -kOMANDA visual PODRAZUMEWAET OBQZATELXNU@ USTANOWKU OPCII openX -%s RAS[IRILSQ DO SLI[KOM BOLX[OGO KOLI^ESTWA FAJLOWX -pUSTOJ FAJLX -nET PREDYDU]EGO POISKA F, f, T, ILI tX -%s NE NAJDENOX -nET PREDYDU]EGO FAJLA DLQ REDAKTIROWANIQX -kURSOR STOIT NE NA CIFREX -pOLU^ENNOE ^ISLO SLI[KOM WELIKOX -pOLU^ENNOE ^ISLO SLI[KOM MALOX -pODHODQ]EGO SIMWOLA NET NA \TOJ STROKEX -pODHODQ]IJ SIMWOL NE NAJDENX -nET SIMWOLOW DLQ UDALENIQX -dRUGOGO \KRANA NE SU]ESTWUETX -sIMWOLY POSLE STROKI DLQ POISKA I/ILI PEREBOR STROKIX -pRO[LYJ OBRAZEC POISKA OTSUTSTWUETX -pOISK ZAWER[ILSQ NA NA^ALXNOJ POZICIIX - -sIMWOL NEPRAWILEN; ZAKL@^EN W KAWY^KI DLQ WWODAX -uVE NA NA^ALE WSTAWKIX -nET SIMWOLOW DLQ UDALENIQX -pEREDWIVENIE ZA KONEC FAJLAX -pEREDWIVENIE ZA KONEC STROKIX -dWIVENIE STROKI NE SDELANOX -uVE NA NA^ALE FAJLAX -dWIVENIE KURSORA ZA NA^ALO FAJLAX -uVE W PERWOJ KOLONKEX -bUFERY DOLVNY BYTX UKAZANY DO WYPOLNENIQ KOMANDYX -uVE NA KONCE FAJLAX -uVE NA KONSE STROKIX -%s NE QWLQETSQ KOMANDOJ VIX -iSPOLXZOWANIE: %sX -nET SIMWOLOW DLQ UDALENIQX - -nET KOMANDY DLQ POWTORAX - -kOMANDA %s NE MOVET BYTX ISPOLXZOWANA KAK KOMANDA PRODWIVENIQX -~ISLO BOLX[E ^EM %luX - - -zNA^ENIE KOLI^ESTWA OKON SLI[KOM WELIKO, MAKSIMALXNOE ZNA^ENIE = %uX - - - - - -dWIVENIE KURSORA ZA KONEC \KRANAX -dWIVENIE KURSORA ZA NA^ALO \KRANAX - -tENEWYH OKON NETX -nE SU]ESTWUET TENEWOGO OKNA S REDAKTIROWANIEM FAJLA %sX -wY NE MOVETE SDELATX EDINSTWENNOE OKNO TENEWYMX -|KRAN MOVET BYTX SVATX -|KRAN NE MOVET BYTX SVATX -|KRAN NE MOVET BYTX RAS[IRENX - - - - -dANNYJ TIP TERMINALA NE IMEET KLAWI[I %sX - - - -nEWOZMOVNO SOZDATX WREMENNYJ FAJLX -wNIMANIE: %s SPECIALXNYJ FAJLX -%s UVE ZABLOKIROWAN, DOSTUPEN TOLXKO NA ^TENIEX -%s: UDALENX -%s: ZAKRYTX -%s: UDALENX -%s: UDALENX -fAJL TOLXKO DLQ ^TENIQ, NE ZAPISAN: iSPOLXZUJTE ! DLQ OBHODAX -fAJL TOLXKO DLQ ^TENIQ, NE ZAPISANX -%s SU]ESTWUET, NE ZAPISAN; ISPOLXZUJTE ! DLQ OBHODAX -%s SU]ESTWUET, NE ZAPISANX -iSPOLXZUJTE ! DLQ ^ASTI^NOJ ZAPISI FAJLAX -~ASTX FAJLA, FAJL NE ZAPISANX -%s: fAJL IZMENQLSQ POZDNEE, ^EM DANNAQ KOPIQ: ISPOLXZUJTE ! DLQ OBHODAX -%s: fAJL IZMENQLSQ POZDNEE, ^EM DANNAQ KOPIQX -%s: ZA]ITA NA ZAPISX BYLA NEDOSTUPNAX - -%s: wnimanie: fajl use~enX - -%s: NOWYJ FAJL: %lu STROK, %lu SIMWOLOWX -%s: %lu STROK, %lu SIMWOLOWX -%s RAS[IRILSQ W SLI[KOM BOLX[OE KOLI^ESTWO IMEN FAJLOWX -%s SPECIALXNYJ FAJLX -%s: NE PRINADLEVIT wAMX -%s: DOSTUPEN NE TOLXKO wAMX -fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE ! DLQ OBHODAX -fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE :edit DLQ OBHODAX -fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE ! DLQ OBHODAX -fAJL WREMENNYJ: WYHOD SOTRET L@BYE IZMENENIQX - -zAPISI NA^ATY ZANOWOX diff --git a/catalog/ru_RU.KOI8-R.base b/catalog/ru_RU.KOI8-R.base index 59efd3f53a5f..6d1c1b5d08bc 100644 --- a/catalog/ru_RU.KOI8-R.base +++ b/catalog/ru_RU.KOI8-R.base @@ -1,219 +1,311 @@ -002 "pEREPOLNENIE ZNA^ENIQ DLINY STROKI" -003 "%s/%d: NEWOZMOVNO UDALITX STROKU %u" -004 "%s/%d: NEWOZMOVNO DOBAWITX K STROKE %u" -005 "%s/%d: NEWOZMOVNO WSTAWITX W STROKU %u" -006 "%s/%d: NEWOZMOVNO SOHRANITX STROKU %u" -007 "%s/%d: NEWOZMOVNO DOSTATX POSLEDN@@ STROKU" -009 "fAJL ZAPISEJ" -010 "zAPISI NE WELISX, NEWOZMOVNO OTMENITX POSLEDN@@ KOMANDU" -011 "nET IZMENENIJ DLQ OTMENY" -012 "zAPISI NE WELISX, NEWOZMOVNO OTMENITX POSLEDN@@ KOMANDU" -013 "zAPISI NE WELISX, NEWOZMOVNO PROSMOTRETX WPERED" -014 "nET IZMENENIJ DLQ PEREDELKI" -015 "%s/%d: O[IBKA PRI ZAPISI PROTOKOLA" -016 "sTANDARTNYJ WWOD/WYWOD DLQ VI DOLVEN BYTX TERMINAL" -017 "oTMETKA %s: NE USTANOWLENA" -018 "oTMETKA %s: STROKA BYLA UDALENA" -019 "oTMETKA %s: POZICII KURSORA BOLX[E NE SU]ESTWUET" -020 "o[IBKA:" -030 "fAJL %s NE QWLQETSQ KATALOGOM SOOB]ENIJ" -031 "nEWOZMOVNO USTANOWITX OPCI@ %s PO UMOL^ANI@" -032 "iSPOLXZOWANIE: %s" -033 "oPCII %s NET: 'set all' POKAZYWAET WSE WOZMOVNYE OPCII" -034 "set: [no]%s NE PRINIMAET TAKOGO ZNA^ENIQ" -035 "set: %s OPCIQ NE QWLQETSQ DWOI^NOJ" -038 "set: NEPRAWILXNOE ZNA^ENIE %s" -039 "set: %s OPCIQ NE QWLQETSQ DWOI^NOJ" -040 "kOLI^ESTWO KOLONOK \KRANA SLI[KOM MALO, MENX[E ^EM %d" -041 "kOLI^ESTWO KOLONOK \KRANA SLI[KOM WELIKO, BOLX[E ^EM %d" -042 "kOLI^ESTWO STROK \KRANA SLI[KOM MALO, MENX[E ^EM %d" -043 "kOLI^ESTWO STROK \KRANA SLI[KOM WELIKO, BOLX[E ^EM %d" -044 "oPCIQ lisp OTSUTSTWUET" -045 "sOOB]ENIQ NE WYKL@^ENY: %s" -046 "sOOB]ENIQ NE WKL@^ENY: %s" -047 "oPCIQ modeline(s) NE MOVET BYTX PEREUSTANOWLENA" -048 "oPCIQ paragraph DOLVNA SOSTOQTX IZ GRUPP S DWUMQ SIMWOLAMI" -049 "oPCIQ section DOLVNA SOSTOQTX IZ GRUPP S DWUMQ SIMWOLAMI" -050 "oPCIQ shiftwidth NE MOVET BYTX USTANOWLENA NA 0" -051 "oPCIQ sourceany NE MOVET BYTX USTANOWLENA" -052 "tABULQCIQ NE MOVET BYTX USTANOWLENA NA 0" -053 "sTARTOWYJ BUFER PUST" -054 "bUFER %s PUST" -055 "fAJLY S SIMWOLAMI PEREWODA STROKI W IMENI NE MOGUT BYTX WOSSTANOWLENY" -056 "iZMENENIQ NE SOHRANENY PRI KRAHE SESSII" -058 "sOHRANENIE NE UDALOSX: %s" -059 "iZMENENIQ NE SOHRANQ@TSQ PRI OBRYWE SESSII" -060 "sOHRANENIE KOPII FAJLA NE UDALOSX: %s" -062 "iNFORMACII NA POLXZOWATELQ %u NE NAJDENO" -063 "nEWOZMOVNO ZA]ITITX SPASENNYJ FAJL" -064 "bUFER WOSSTANOWLENNOGO FAJLA PEREPOLNEN" -065 "wOSSTANOWLENNYJ FAJL" -066 "%s: NE DO KONCA WOSSTANOWLENNYJ FAJL" -067 "%s: NE DO KONCA WOSSTANOWLENNYJ FAJL" -068 "fAJLOW S IMENEM %s, KOTORYE wY MOVETE ^ITATX, NE SU]ESTWUET" -069 "eSTX STARYE WERSII FAJLA, KOTORYE MOVNO WOSSTANOWITX" -070 "sU]ESTWU@T DRUGIE FAJLY, KOTORYE MOVNO WOSSTANOWITX" -071 "E-mail NE POSLAN: %s" -072 "fAJL PUST - ISKATX NE^EGO" -073 "dOSTIGNUT KONEC FAJLA BEZ NAHOVDENIQ OBRAZCA POISKA" -074 "nE ZADAN OBRAZEC POISKA" -075 "oBRAZEC POISKA NE NAJDEN" -076 "dOSTUPNO NA^ALO FAJLA BEZ NAHOVDENIQ OBRAZCA POISKA" -077 "pOISK ZACIKLEN" -079 "nEPE^ATNYH SIMWOLOW NE NAJDENO" -080 "nEIZWESTNAQ KOMANDA" -082 "kOMANDA NE DOSTUPNA W REVIME ex" -083 "s^ET^IK NE MOVET BYTX NULEM" -084 "%s: NEPRAWILXNOE UKAZANIE STROKI" -085 "wNUTRENNQQ O[IBKA W SINTAKSISE (%s: %s)" -086 "iSPOLXZOWANIE: %s" -087 "%s: WREMENNYJ BUFER NE ISPOLXZOWAN" -088 "mETKA POSTAWLENA PERED STROKOJ 1" -089 "mETKA POSTAWLENA POSLE KONCA FAJLA" -092 "kOMANDA ex NE UDALASX: PARAMETRY KOMANDY ZABYTY" -094 "wTOROJ ADRES MENX[E ^EM PERWYJ" -095 "nE UKAZANO NAZWANIE OTMETKI" -096 "\\ NE ZAWER[AETSQ / ILI ?" -097 "sSYLKA K STROKE S NOMEROM MENX[E 0" -098 "kOMANDA %s NEIZWESTNA" -099 "pEREPOLNENIE ZNA^ENIQ ADRESA" -100 "nEDOBOR ZNA^ENIQ ADRESA" -101 "nEDOPUSTIMAQ KOMBINACIQ W ADRESE" -102 "nEPRAWILXNYJ ADRES: WSEGO %lu STROK W FAJLE" -103 "nEPRAWILXNYJ ADRES: FAJL PUST" -104 "kOMMANDA %s NE MOVET ISPOLXZOWATX ADRES 0" -105 "aBBREWIATURY OTSUTSTWU@T" -106 "aBBREWIATURY DOLVNY ZAKAN^IWATXSQ SIMWOLOM "word"" -107 "aBBREWIATURY NE MOGUT SODERVATX SIMWOLOY TABLQCII ILI PROBELY" -108 "aBBREWIATURY NE MOGUT SO^ETATXSQ S SIMWOLAMI SLOW/NE-SLOW, ZA ISKL@^ENIEM KONCA STROKI" -109 ""%s" NE QWLQETSQ ABBREWIATUROJ" -111 "fAJLOW DLQ REDAKTIROWANIQ BOLX[E NET" -112 "oTSUTSTWIE PREDYDU]EGO FAJLA DLQ REDAKTIROWANIQ" -113 "oTSUTSTWIE PREDYDU]EGO FAJLA DLQ PROSMOTRA NAZAD" -114 "nET FAJLOW" -115 "oTSUTSTWIE PREDYDU]EJ KOMANDY DLQ ZAMENY "!"" -116 "oTSUTSTWIE ZAMENY DLQ %%" -117 "oTSUTSTWIE ZAMENY DLQ #" -118 "o[IBKA: execl: %s" -119 "o[IBKA WWODA/WYWODA: %s" -120 "fAJL IZMENEN S MOMENTA POSLEDNEJ POLNOJ ZAPISI: ISPOLXZUJTE ! DLQ OBHODA" -121 "nEWOZMOVNO NAJTI DOMA[NIJ KATALOG" -122 "nOWYJ KATALOG: %s" -123 "nET WYREZANYH BUFEROW" -124 "kOMANDA %s NE MOVET BYTX ISPOLXZOWANA WNUTRI OB]EJ KOMANDY" -125 "%s/%s: NE OTKRYT: NE PRINADLEVIT wAM ILI root-U" -126 "%s/%s: NE OTKRYT: NE PRINADLEVIT wAM" -127 "%s/%s: NE OTKRYT: WOZMOVNOSTX ZAPISI U POLXZOWATELQ, NE QWLQ@]EGOSQ WLADELXCEM" -128 "%s/%s: NE S^ITAN: NE PRINADLEVIT wAM ILI root-U" -129 "%s/%s: NE S^ITAN: NE PRINADLEVIT wAM" -130 "%s/%s: NE S^ITAN: WOZMOVNOSTX ZAPISI U POLXZOWATELQ, NE QWLQ@]EGOSQ WLADELXCEM" -131 "pOSLEDU@]IE STROKI OTSUTSTWU@T" -132 "oTSUTSTWIE PARAMETROW WWODA" -133 "oTSUTSTWIE PARAMETROW KOMANDY" -134 "sIMWOL %s NE MOVET BYTX PEREZAPOMNEN" -135 ""%s" NA DANNYJ MOMENT NE OTME^EN" -136 "iMQ METKI DOLVNO BYTX ODNIM SIMWOLOM" -137 "%s SU]ESTWUET, NE ZAPISAN; ISPOLXZUJTE ! DLQ OBHODA" -138 "nOWYJ FAJL .exrc: %s" -139 "sTROKA PERENOSA NAHODITSQ WNUTRI PARAMETROW PERENOSA" -140 "kOMANDA open PODRAZUMEWAET USTANOWKU OPCII open" -141 "kOMANDA open NE REALIZOWANA" -142 "zA]ITA FAJLA NEWOZMOVNA" -143 "fAJL ZA]I]EN" -144 "%s RAS[IRILSQ W SLI[KOM BOLX[OE KOLI^ESTWO IMEN FAJLOW" -146 "%s: ZA]ITA NA ^TENIE BYLA NEDOSTUPNA" -148 "%s: %lu STROK, %lu SIMWOLOW" -149 "nET TENEWYH OKON" -150 "kOMANDA script ISPOLXZUETSQ TOLXKO W REVIME vi" -151 "nET KOMANDY DLQ ISPOLNENIQ" -152 "oPCIQ shiftwidth USTANOWLENA NA 0" -153 "pEREPOLNENIE S^ET^IKA" -154 "cIKL WYPOLNEN NE DO KONCA" -155 "uKAZANO REGULQRNOE WYRAVENIE: FLAG r NE NUVEN" -156 "fLAGI #, l I p NE MOGUT BYTX OB_EDINENY S FLAGOM c W REVIME vi" -157 "sOWPADENIJ NET" -158 "mETKA OTSUTSTWUET" -159 "w STEKE METOK ZAPISEJ MENX[E, ^EM %s, ISPOLXZUJTE :display t[ags]" -160 "fAJLA S IMENEM %s W STEKE METOK NET; ISPOLXZUJTE :display t[ags]" -162 "%s: METKA NE NAJDENA" -163 "%s: PLOHAQ METKA W %s" -165 "sTEK METOK PUST" -166 "%s: ISKOMAQ PEREMENNAQ NE NAJDENA" -168 "bUFER %s PUST" -170 "pRERWANO" -171 "oTSUTSTWIE BUFERA DLQ ISPOLXZOWANIQ" -172 "nET PREDIDU]EGO REGULQRNOGO WYRAVENIQ" -173 "kOMANDA %s PODRAZUMEWAET NALI^IE PRO^TENNOGO FAJLA" -174 "iSPOLXZOWANIE: %s" -175 "kOMANDA visual PODRAZUMEWAET OBQZATELXNU@ USTANOWKU OPCII open" -176 "%s RAS[IRILSQ DO SLI[KOM BOLX[OGO KOLI^ESTWA FAJLOW" -177 "pUSTOJ FAJL" -178 "nET PREDYDU]EGO POISKA F, f, T, ILI t" -179 "%s NE NAJDENO" -180 "nET PREDYDU]EGO FAJLA DLQ REDAKTIROWANIQ" -181 "kURSOR STOIT NE NA CIFRE" -182 "pOLU^ENNOE ^ISLO SLI[KOM WELIKO" -183 "pOLU^ENNOE ^ISLO SLI[KOM MALO" -184 "pODHODQ]EGO SIMWOLA NET NA \TOJ STROKE" -185 "pODHODQ]IJ SIMWOL NE NAJDEN" -186 "nET SIMWOLOW DLQ UDALENIQ" -187 "dRUGOGO \KRANA NE SU]ESTWUET" -188 "sIMWOLY POSLE STROKI DLQ POISKA I/ILI PEREBOR STROKI" -189 "pRO[LYJ OBRAZEC POISKA OTSUTSTWUET" -190 "pOISK ZAWER[ILSQ NA NA^ALXNOJ POZICII" -192 "sIMWOL NEPRAWILEN; ZAKL@^EN W KAWY^KI DLQ WWODA" -193 "uVE NA NA^ALE WSTAWKI" -194 "nET SIMWOLOW DLQ UDALENIQ" -195 "pEREDWIVENIE ZA KONEC FAJLA" -196 "pEREDWIVENIE ZA KONEC STROKI" -197 "dWIVENIE STROKI NE SDELANO" -198 "uVE NA NA^ALE FAJLA" -199 "dWIVENIE KURSORA ZA NA^ALO FAJLA" -200 "uVE W PERWOJ KOLONKE" -201 "bUFERY DOLVNY BYTX UKAZANY DO WYPOLNENIQ KOMANDY" -202 "uVE NA KONCE FAJLA" -203 "uVE NA KONSE STROKI" -204 "%s NE QWLQETSQ KOMANDOJ VI" -205 "iSPOLXZOWANIE: %s" -206 "nET SIMWOLOW DLQ UDALENIQ" -208 "nET KOMANDY DLQ POWTORA" -210 "kOMANDA %s NE MOVET BYTX ISPOLXZOWANA KAK KOMANDA PRODWIVENIQ" -211 "~ISLO BOLX[E ^EM %lu" -214 "zNA^ENIE KOLI^ESTWA OKON SLI[KOM WELIKO, MAKSIMALXNOE ZNA^ENIE = %u" -220 "dWIVENIE KURSORA ZA KONEC \KRANA" -221 "dWIVENIE KURSORA ZA NA^ALO \KRANA" -223 "tENEWYH OKON NET" -224 "nE SU]ESTWUET TENEWOGO OKNA S REDAKTIROWANIEM FAJLA %s" -225 "wY NE MOVETE SDELATX EDINSTWENNOE OKNO TENEWYM" -226 "|KRAN MOVET BYTX SVAT" -227 "|KRAN NE MOVET BYTX SVAT" -228 "|KRAN NE MOVET BYTX RAS[IREN" -233 "dANNYJ TIP TERMINALA NE IMEET KLAWI[I %s" -237 "nEWOZMOVNO SOZDATX WREMENNYJ FAJL" -238 "wNIMANIE: %s SPECIALXNYJ FAJL" -239 "%s UVE ZABLOKIROWAN, DOSTUPEN TOLXKO NA ^TENIE" -240 "%s: UDALEN" -241 "%s: ZAKRYT" -242 "%s: UDALEN" -243 "%s: UDALEN" -244 "fAJL TOLXKO DLQ ^TENIQ, NE ZAPISAN: iSPOLXZUJTE ! DLQ OBHODA" -245 "fAJL TOLXKO DLQ ^TENIQ, NE ZAPISAN" -246 "%s SU]ESTWUET, NE ZAPISAN; ISPOLXZUJTE ! DLQ OBHODA" -247 "%s SU]ESTWUET, NE ZAPISAN" -248 "iSPOLXZUJTE ! DLQ ^ASTI^NOJ ZAPISI FAJLA" -249 "~ASTX FAJLA, FAJL NE ZAPISAN" -250 "%s: fAJL IZMENQLSQ POZDNEE, ^EM DANNAQ KOPIQ: ISPOLXZUJTE ! DLQ OBHODA" -251 "%s: fAJL IZMENQLSQ POZDNEE, ^EM DANNAQ KOPIQ" -252 "%s: ZA]ITA NA ZAPISX BYLA NEDOSTUPNA" -254 "%s: wnimanie: fajl use~en" -256 "%s: NOWYJ FAJL: %lu STROK, %lu SIMWOLOW" -257 "%s: %lu STROK, %lu SIMWOLOW" -258 "%s RAS[IRILSQ W SLI[KOM BOLX[OE KOLI^ESTWO IMEN FAJLOW" -259 "%s SPECIALXNYJ FAJL" -260 "%s: NE PRINADLEVIT wAM" -261 "%s: DOSTUPEN NE TOLXKO wAM" -262 "fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE ! DLQ OBHODA" -263 "fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE :edit DLQ OBHODA" -264 "fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE ! DLQ OBHODA" -265 "fAJL WREMENNYJ: WYHOD SOTRET L@BYE IZMENENIQ" -267 "zAPISI NA^ATY ZANOWO" +002 "ðÅÒÅÐÏÌÎÅÎÉÅ ÚÎÁÞÅÎÉÑ ÄÌÉÎÙ ÓÔÒÏËÉ" +003 "ÎÅ×ÏÚÍÏÖÎÏ ÕÄÁÌÉÔØ ÓÔÒÏËÕ %lu" +004 "ÎÅ×ÏÚÍÏÖÎÏ ÄÏÂÁ×ÉÔØ Ë ÓÔÒÏËÅ %lu" +005 "ÎÅ×ÏÚÍÏÖÎÏ ×ÓÔÁ×ÉÔØ × ÓÔÒÏËÕ %lu" +006 "ÎÅ×ÏÚÍÏÖÎÏ ÓÏÈÒÁÎÉÔØ ÓÔÒÏËÕ %lu" +007 "ÎÅ×ÏÚÍÏÖÎÏ ÄÏÓÔÁÔØ ÐÏÓÌÅÄÎÀÀ ÓÔÒÏËÕ" +008 "ïÛÉÂËÁ: ÎÅ ÕÄÁÌÏÓØ ÐÏÌÕÞÉÔØ ÓÔÒÏËÕ %lu" +009 "æÁÊÌ ÚÁÐÉÓÅÊ" +010 "úÁÐÉÓÉ ÎÅ ×ÅÌÉÓØ, ÎÅ×ÏÚÍÏÖÎÏ ÏÔÍÅÎÉÔØ ÐÏÓÌÅÄÎÀÀ ËÏÍÁÎÄÕ" +011 "îÅÔ ÉÚÍÅÎÅÎÉÊ ÄÌÑ ÏÔÍÅÎÙ" +012 "úÁÐÉÓÉ ÎÅ ×ÅÌÉÓØ, ÎÅ×ÏÚÍÏÖÎÏ ÏÔÍÅÎÉÔØ ÐÏÓÌÅÄÎÀÀ ËÏÍÁÎÄÕ" +013 "úÁÐÉÓÉ ÎÅ ×ÅÌÉÓØ, ÎÅ×ÏÚÍÏÖÎÏ ÐÒÏÓÍÏÔÒÅÔØ ×ÐÅÒÅÄ" +014 "îÅÔ ÉÚÍÅÎÅÎÉÊ ÄÌÑ ÐÅÒÅÄÅÌËÉ" +015 "%s/%d: ÏÛÉÂËÁ ÐÒÉ ÚÁÐÉÓÉ ÐÒÏÔÏËÏÌÁ" +016 "óÔÁÎÄÁÒÔÎÙÊ ××ÏÄ/×Ù×ÏÄ ÄÌÑ VI ÄÏÌÖÅÎ ÂÙÔØ ÔÅÒÍÉÎÁÌ" +017 "ïÔÍÅÔËÁ %s: ÎÅ ÕÓÔÁÎÏ×ÌÅÎÁ" +018 "ïÔÍÅÔËÁ %s: ÓÔÒÏËÁ ÂÙÌÁ ÕÄÁÌÅÎÁ" +019 "ïÔÍÅÔËÁ %s: ÐÏÚÉÃÉÉ ËÕÒÓÏÒÁ ÂÏÌØÛÅ ÎÅ ÓÕÝÅÓÔ×ÕÅÔ" +020 "ïÛÉÂËÁ: " +021 "ÎÏ×ÙÊ ÆÁÊÌ" +022 "ÉÍÑ ÉÚÍÅÎÅÎÏ" +023 "ÍÏÄÉÆÉÃÉÒÏ×ÁÎÏ" +024 "ÎÅ ÍÏÄÉÆÉÃÉÒÏ×ÁÎÏ" +025 "òáúâìïëéòï÷áîï" +026 "ÔÏÌØËÏ ÞÔÅÎÉÅ" +027 "ÓÔÒÏËÁ %lu ÉÚ %lu [%ld%%]" +028 "ÐÕÓÔÏÊ ÆÁÊÌ" +029 "ÓÔÒÏËÁ %lu" +030 "æÁÊÌ %s ÎÅ Ñ×ÌÑÅÔÓÑ ËÁÔÁÌÏÇÏÍ ÓÏÏÂÝÅÎÉÊ" +031 "îÅ×ÏÚÍÏÖÎÏ ÕÓÔÁÎÏ×ÉÔØ ÏÐÃÉÀ %s ÐÏ ÕÍÏÌÞÁÎÉÀ" +032 "éÓÐÏÌØÚÏ×ÁÎÉÅ: %s" +033 "ïÐÃÉÉ %s ÎÅÔ: 'set all' ÐÏËÁÚÙ×ÁÅÔ ×ÓÅ ×ÏÚÍÏÖÎÙÅ ÏÐÃÉÉ" +034 "set: [no]%s ÎÅ ÐÒÉÎÉÍÁÅÔ ÔÁËÏÇÏ ÚÎÁÞÅÎÉÑ" +035 "set: %s ÏÐÃÉÑ ÎÅ Ñ×ÌÑÅÔÓÑ ÌÏÇÉÞÅÓËÏÊ" +036 "set: %s ÏÐÃÉÑ: %s" +037 "set: %s ÏÐÃÉÑ: %s: ÚÎÁÞÅÎÉÅ ÐÅÒÅÐÏÌÎÅÎÉÑ" +038 "set: ÎÅÐÒÁ×ÉÌØÎÏÅ ÚÎÁÞÅÎÉÅ %s" +039 "set: %s ÏÐÃÉÑ ÎÅ Ñ×ÌÑÅÔÓÑ ÌÏÇÉÞÅÓËÏÊ" +040 "ëÏÌÉÞÅÓÔ×Ï ËÏÌÏÎÏË ÜËÒÁÎÁ ÓÌÉÛËÏÍ ÍÁÌÏ, ÍÅÎØÛÅ ÞÅÍ %d" +041 "ëÏÌÉÞÅÓÔ×Ï ËÏÌÏÎÏË ÜËÒÁÎÁ ÓÌÉÛËÏÍ ×ÅÌÉËÏ, ÂÏÌØÛÅ ÞÅÍ %d" +042 "ëÏÌÉÞÅÓÔ×Ï ÓÔÒÏË ÜËÒÁÎÁ ÓÌÉÛËÏÍ ÍÁÌÏ, ÍÅÎØÛÅ ÞÅÍ %d" +043 "ëÏÌÉÞÅÓÔ×Ï ÓÔÒÏË ÜËÒÁÎÁ ÓÌÉÛËÏÍ ×ÅÌÉËÏ, ÂÏÌØÛÅ ÞÅÍ %d" +044 "ïÐÃÉÑ lisp ÏÔÓÕÔÓÔ×ÕÅÔ" +045 "óÏÏÂÝÅÎÉÑ ÎÅ ×ÙËÌÀÞÅÎÙ: %s" +046 "óÏÏÂÝÅÎÉÑ ÎÅ ×ËÌÀÞÅÎÙ: %s" +047 "ïÐÃÉÑ %s ÄÏÌÖÎÁ ÓÏÓÔÏÑÔØ ÉÚ ÇÒÕÐÐ Ó Ä×ÕÍÑ ÓÉÍ×ÏÌÁÍÉ" +053 "óÔÁÒÔÏ×ÙÊ ÂÕÆÅÒ ÐÕÓÔ" +054 "âÕÆÅÒ %s ÐÕÓÔ" +055 "æÁÊÌÙ Ó ÓÉÍ×ÏÌÁÍÉ ÐÅÒÅ×ÏÄÁ ÓÔÒÏËÉ × ÉÍÅÎÉ ÎÅ ÍÏÇÕÔ ÂÙÔØ ×ÏÓÓÔÁÎÏ×ÌÅÎÙ" +056 "éÚÍÅÎÅÎÉÑ ÎÅ ÓÏÈÒÁÎÅÎÙ ÐÒÉ ËÒÁÈÅ ÓÅÓÓÉÉ" +057 "ëÏÐÉÒÏ×ÁÎÉÅ ÆÁÊÌÁ ÄÌÑ ×ÏÓÓÔÁÎÏ×ÌÅÎÉÑ..." +058 "óÏÈÒÁÎÅÎÉÅ ÎÅ ÕÄÁÌÏÓØ: %s" +059 "éÚÍÅÎÅÎÉÑ ÎÅ ÓÏÈÒÁÎÑÀÔÓÑ ÐÒÉ ÏÂÒÙ×Å ÓÅÓÓÉÉ" +060 "óÏÈÒÁÎÅÎÉÅ ËÏÐÉÉ ÆÁÊÌÁ ÎÅ ÕÄÁÌÏÓØ: %s" +061 "ëÏÐÉÒÏ×ÁÎÉÅ ÆÁÊÌÁ ÄÌÑ ×ÏÓÓÔÁÎÏ×ÌÅÎÉÑ..." +062 "éÎÆÏÒÍÁÃÉÉ ÎÁ ÐÏÌØÚÏ×ÁÔÅÌÑ %u ÎÅ ÎÁÊÄÅÎÏ" +063 "îÅ×ÏÚÍÏÖÎÏ ÚÁÝÉÔÉÔØ ÓÐÁÓÅÎÎÙÊ ÆÁÊÌ" +064 "âÕÆÅÒ ×ÏÓÓÔÁÎÏ×ÌÅÎÎÏÇÏ ÆÁÊÌÁ ÐÅÒÅÐÏÌÎÅÎ" +065 "÷ÏÓÓÔÁÎÏ×ÌÅÎÎÙÊ ÆÁÊÌ" +066 "%s: ÎÅ ÄÏ ËÏÎÃÁ ×ÏÓÓÔÁÎÏ×ÌÅÎÎÙÊ ÆÁÊÌ" +067 "%s: ÎÅ ÄÏ ËÏÎÃÁ ×ÏÓÓÔÁÎÏ×ÌÅÎÎÙÊ ÆÁÊÌ" +068 "æÁÊÌÏ× Ó ÉÍÅÎÅÍ %s, ËÏÔÏÒÙÅ ÷Ù ÍÏÖÅÔÅ ÞÉÔÁÔØ, ÎÅ ÓÕÝÅÓÔ×ÕÅÔ" +069 "åÓÔØ ÓÔÁÒÙÅ ×ÅÒÓÉÉ ÆÁÊÌÁ, ËÏÔÏÒÙÅ ÍÏÖÎÏ ×ÏÓÓÔÁÎÏ×ÉÔØ" +070 "óÕÝÅÓÔ×ÕÀÔ ÄÒÕÇÉÅ ÆÁÊÌÙ, ËÏÔÏÒÙÅ ÍÏÖÎÏ ×ÏÓÓÔÁÎÏ×ÉÔØ" +071 "Å-mail ÎÅ ÐÏÓÌÁÎ: %s" +072 "æÁÊÌ ÐÕÓÔ - ÉÓËÁÔØ ÎÅÞÅÇÏ" +073 "äÏÓÔÉÇÎÕÔ ËÏÎÅà ÆÁÊÌÁ ÂÅÚ ÎÁÈÏÖÄÅÎÉÑ ÏÂÒÁÚÃÁ ÐÏÉÓËÁ" +074 "îÅ ÚÁÄÁÎ ÏÂÒÁÚÅà ÐÏÉÓËÁ" +075 "ïÂÒÁÚÅà ÐÏÉÓËÁ ÎÅ ÎÁÊÄÅÎ" +076 "äÏÓÔÕÐÎÏ ÎÁÞÁÌÏ ÆÁÊÌÁ ÂÅÚ ÎÁÈÏÖÄÅÎÉÑ ÏÂÒÁÚÃÁ ÐÏÉÓËÁ" +077 "ðÏÉÓË ÚÁÃÉËÌÅÎ" +078 "ðÏÉÓË..." +079 "îÅÐÅÞÁÔÎÙÈ ÓÉÍ×ÏÌÏ× ÎÅ ÎÁÊÄÅÎÏ" +080 "îÅÉÚ×ÅÓÔÎÁÑ ËÏÍÁÎÄÁ" +082 "%s: ËÏÍÁÎÄÁ ÎÅ ÄÏÓÔÕÐÎÁ × ÒÅÖÉÍÅ ex" +083 "óÞÅÔÞÉË ÎÅ ÍÏÖÅÔ ÂÙÔØ ÎÕÌÅÍ" +084 "%s: ÎÅÐÒÁ×ÉÌØÎÏÅ ÕËÁÚÁÎÉÅ ÓÔÒÏËÉ" +085 "÷ÎÕÔÒÅÎÎÑÑ ÏÛÉÂËÁ × ÓÉÎÔÁËÓÉÓÅ (%s: %s)" +086 "éÓÐÏÌØÚÏ×ÁÎÉÅ: %s" +087 "%s: ×ÒÅÍÅÎÎÙÊ ÂÕÆÅÒ ÎÅ ÉÓÐÏÌØÚÏ×ÁÎ" +088 "íÅÔËÁ ÐÏÓÔÁ×ÌÅÎÁ ÐÅÒÅÄ ÓÔÒÏËÏÊ 1" +089 "íÅÔËÁ ÐÏÓÔÁ×ÌÅÎÁ ÐÏÓÌÅ ËÏÎÃÁ ÆÁÊÌÁ" +090 "@ Ó ÄÉÁÐÁÚÏÎÏÍ ×ÙÐÏÌÎÑÅÔÓÑ ËÏÇÄÁ ÆÁÊÌ/ÜËÒÁÎ ÉÚÍÅÎÅÎÙ" +091 "çÌÏÂÁÌØÎÁÑ/v ËÏÍÁÎÄÁ ×ÙÐÏÌÎÑÅÔÓÑ ËÏÇÄÁ ÆÁÊÌ/ÜËÒÁÎ ÉÚÍÅÎÅÎÙ" +092 "ëÏÍÁÎÄÁ ex ÎÅ ÕÄÁÌÁÓØ: ÐÏÓÌÅÄÕÀÝÉÅ ËÏÍÁÎÄÙ ÚÁÂÙÔÙ" +093 "ëÏÍÁÎÄÁ ex ÎÅ ÕÄÁÌÁÓØ: ÎÁÚÎÁÞÅÎÎÙÅ ËÌÁ×ÉÛÉ ÚÁÂÙÔÙ" +094 "÷ÔÏÒÏÊ ÁÄÒÅÓ ÍÅÎØÛÅ ÞÅÍ ÐÅÒ×ÙÊ" +095 "îÅ ÕËÁÚÁÎÏ ÎÁÚ×ÁÎÉÅ ÏÔÍÅÔËÉ" +096 "\\ ÎÅ ÚÁ×ÅÒÛÁÅÔÓÑ / ÉÌÉ ?" +097 "óÓÙÌËÁ Ë ÓÔÒÏËÅ Ó ÎÏÍÅÒÏÍ ÍÅÎØÛÅ 0" +098 "ëÏÍÁÎÄÁ %s ÎÅÉÚ×ÅÓÔÎÁ" +099 "ðÅÒÅÐÏÌÎÅÎÉÅ ÚÎÁÞÅÎÉÑ ÁÄÒÅÓÁ" +100 "îÅÄÏÂÏÒ ÚÎÁÞÅÎÉÑ ÁÄÒÅÓÁ" +101 "îÅÄÏÐÕÓÔÉÍÁÑ ËÏÍÂÉÎÁÃÉÑ × ÁÄÒÅÓÅ" +102 "îÅÐÒÁ×ÉÌØÎÙÊ ÁÄÒÅÓ: ×ÓÅÇÏ %lu ÓÔÒÏË × ÆÁÊÌÅ" +103 "îÅÐÒÁ×ÉÌØÎÙÊ ÁÄÒÅÓ: ÆÁÊÌ ÐÕÓÔ" +104 "ëÏÍÁÎÄÁ %s ÎÅ ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØ ÁÄÒÅÓ 0" +105 "áÂÂÒÅ×ÉÁÔÕÒÙ ÏÔÓÕÔÓÔ×ÕÀÔ" +106 "áÂÂÒÅ×ÉÁÔÕÒÙ ÄÏÌÖÎÙ ÚÁËÁÎÞÉ×ÁÔØÓÑ ÓÉÍ×ÏÌÏÍ \"ÓÌÏ×\"" +107 "áÂÂÒÅ×ÉÁÔÕÒÙ ÎÅ ÍÏÇÕÔ ÓÏÄÅÒÖÁÔØ ÓÉÍ×ÏÌÙ ÔÁÂÕÌÑÃÉÉ ÉÌÉ ÐÒÏÂÅÌÙ" +108 "áÂÂÒÅ×ÉÁÔÕÒÙ ÎÅ ÍÏÇÕÔ ÓÏÞÅÔÁÔØÓÑ Ó ÓÉÍ×ÏÌÁÍÉ ÓÌÏ×/ÎÅ-ÓÌÏ×, ÚÁ ÉÓËÌÀÞÅÎÉÅÍ ËÏÎÃÁ ÓÔÒÏËÉ" +109 "\"%s\" ÎÅ Ñ×ÌÑÅÔÓÑ ÁÂÂÒÅ×ÉÁÔÕÒÏÊ" +110 "Vi ËÏÍÁÎÄÁ ÎÅ ÕÄÁÌÁÓØ: ÎÁÚÎÁÞÅÎÎÙÅ ËÌÁ×ÉÛÉ ÚÁÂÙÔÙ" +111 "æÁÊÌÏ× ÄÌÑ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ ÂÏÌØÛÅ ÎÅÔ" +112 "ïÔÓÕÔÓÔ×ÉÅ ÐÒÅÄÙÄÕÝÅÇÏ ÆÁÊÌÁ ÄÌÑ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ" +113 "ïÔÓÕÔÓÔ×ÉÅ ÐÒÅÄÙÄÕÝÅÇÏ ÆÁÊÌÁ ÄÌÑ ÐÒÏÓÍÏÔÒÁ ÎÁÚÁÄ" +114 "îÅÔ ÆÁÊÌÏ×" +115 "ïÔÓÕÔÓÔ×ÉÅ ÐÒÅÄÙÄÕÝÅÊ ËÏÍÁÎÄÙ ÄÌÑ ÚÁÍÅÎÙ \"!\"" +116 "ïÔÓÕÔÓÔ×ÉÅ ÚÁÍÅÎÙ ÄÌÑ %%" +117 "ïÔÓÕÔÓÔ×ÉÅ ÚÁÍÅÎÙ ÄÌÑ #" +118 "ïÛÉÂËÁ: execl: %s" +119 "ïÛÉÂËÁ ××ÏÄÁ/×Ù×ÏÄÁ: %s" +120 "æÁÊÌ ÉÚÍÅÎÅÎ Ó ÍÏÍÅÎÔÁ ÐÏÓÌÅÄÎÅÊ ÐÏÌÎÏÊ ÚÁÐÉÓÉ: ÉÓÐÏÌØÚÕÊÔÅ ! ÄÌÑ ÏÂÈÏÄÁ" +121 "îÅ×ÏÚÍÏÖÎÏ ÎÁÊÔÉ ÄÏÍÁÛÎÉÊ ËÁÔÁÌÏÇ" +122 "îÏ×ÙÊ ËÁÔÁÌÏÇ: %s" +123 "îÅÔ ×ÙÒÅÚÁÎÎÙÈ ÂÕÆÅÒÏ×" +124 "ëÏÍÁÎÄÁ %s ÎÅ ÍÏÖÅÔ ÂÙÔØ ÉÓÐÏÌØÚÏ×ÁÎÁ ×ÎÕÔÒÉ ÇÌÏÂÁÌØÎÏÊ ÉÌÉ v ËÏÍÁÎÄÙ" +125 "%s/%s: ÎÅ ÏÔËÒÙÔ: ÎÅ ÐÒÉÎÁÄÌÅÖÉÔ ÷ÁÍ ÉÌÉ root-Õ" +126 "%s/%s: ÎÅ ÏÔËÒÙÔ: ÎÅ ÐÒÉÎÁÄÌÅÖÉÔ ÷ÁÍ" +127 "%s/%s: ÎÅ ÏÔËÒÙÔ: ×ÏÚÍÏÖÎÏÓÔØ ÚÁÐÉÓÉ Õ ÐÏÌØÚÏ×ÁÔÅÌÑ, ÎÅ Ñ×ÌÑÀÝÅÇÏÓÑ ×ÌÁÄÅÌØÃÅÍ" +128 "%s: ÎÅ ÓÞÉÔÁÎ: ÎÅ ÐÒÉÎÁÄÌÅÖÉÔ ÷ÁÍ ÉÌÉ root-Õ" +129 "%s: ÎÅ ÓÞÉÔÁÎ: ÎÅ ÐÒÉÎÁÄÌÅÖÉÔ ÷ÁÍ" +130 "%s: ÎÅ ÓÞÉÔÁÎ: ×ÏÚÍÏÖÎÏÓÔØ ÚÁÐÉÓÉ Õ ÐÏÌØÚÏ×ÁÔÅÌÑ, ÎÅ Ñ×ÌÑÀÝÅÇÏÓÑ ×ÌÁÄÅÌØÃÅÍ" +131 "ðÏÓÌÅÄÕÀÝÉÅ ÓÔÒÏËÉ ÏÔÓÕÔÓÔ×ÕÀÔ" +132 "ïÔÓÕÔÓÔ×ÉÅ ÐÁÒÁÍÅÔÒÏ× ××ÏÄÁ" +133 "ïÔÓÕÔÓÔ×ÉÅ ÐÁÒÁÍÅÔÒÏ× ËÏÍÁÎÄÙ" +134 "óÉÍ×ÏÌ %s ÎÅ ÍÏÖÅÔ ÂÙÔØ ÐÅÒÅÎÁÚÎÁÞÅÎ" +135 "\"%s\" ÎÁ ÄÁÎÎÙÊ ÍÏÍÅÎÔ ÎÅ ÎÁÚÎÁÞÅÎ" +136 "éÍÑ ÍÅÔËÉ ÄÏÌÖÎÏ ÂÙÔØ ÏÄÎÉÍ ÓÉÍ×ÏÌÏÍ" +137 "%s ÓÕÝÅÓÔ×ÕÅÔ, ÎÅ ÚÁÐÉÓÁÎ; ÉÓÐÏÌØÚÕÊÔÅ ! ÄÌÑ ÏÂÈÏÄÁ" +138 "îÏ×ÙÊ ÆÁÊÌ exrc: %s" +139 "óÔÒÏËÁ ÐÅÒÅÎÏÓÁ ÎÁÈÏÄÉÔÓÑ ×ÎÕÔÒÉ ÐÁÒÁÍÅÔÒÏ× ÐÅÒÅÎÏÓÁ" +140 "ëÏÍÁÎÄÁ open ÐÏÄÒÁÚÕÍÅ×ÁÅÔ ÕÓÔÁÎÏ×ËÕ ÏÐÃÉÉ open" +141 "ëÏÍÁÎÄÁ open ÎÅ ÒÅÁÌÉÚÏ×ÁÎÁ" +142 "úÁÝÉÔÁ ÆÁÊÌÁ ÎÅ×ÏÚÍÏÖÎÁ" +143 "æÁÊÌ ÚÁÝÉÝÅÎ" +144 "%s ÒÁÓÛÉÒÉÌÓÑ × ÓÌÉÛËÏÍ ÂÏÌØÛÏÅ ËÏÌÉÞÅÓÔ×Ï ÉÍÅÎ ÆÁÊÌÏ×" +145 "ôÏÌØËÏ ÏÂÙÞÎÙÅ ÆÁÊÌÙ ÉÌÉ ÉÍÅÎÏ×ÁÎÎÙÅ ËÁÎÁÌÙ ÍÏÇÕÔ ÂÙÔØ ÐÒÏÞÉÔÁÎÙ" +146 "%s: ÚÁÝÉÔÁ ÎÁ ÞÔÅÎÉÅ ÂÙÌÁ ÎÅÄÏÓÔÕÐÎÁ" +147 "þÔÅÎÉÅ..." +148 "%s: %lu ÓÔÒÏË, %lu ÓÉÍ×ÏÌÏ×" +149 "îÅÔ ÔÅÎÅ×ÙÈ ÏËÏÎ" +150 "ëÏÍÁÎÄÁ script ÉÓÐÏÌØÚÕÅÔÓÑ ÔÏÌØËÏ × ÒÅÖÉÍÅ vi" +151 "îÅÔ ËÏÍÁÎÄÙ ÄÌÑ ÉÓÐÏÌÎÅÎÉÑ" +152 "ïÐÃÉÑ shiftwidth ÕÓÔÁÎÏ×ÌÅÎÁ ÎÁ 0" +153 "ðÅÒÅÐÏÌÎÅÎÉÅ ÓÞÅÔÞÉËÁ" +154 "ãÉËÌ ×ÙÐÏÌÎÅÎ ÎÅ ÄÏ ËÏÎÃÁ" +155 "õËÁÚÁÎÏ ÒÅÇÕÌÑÒÎÏÅ ×ÙÒÁÖÅÎÉÅ: ÆÌÁÇ r ÎÅ ÎÕÖÅÎ" +156 "æÌÁÇÉ #, l É p ÎÅ ÍÏÇÕÔ ÂÙÔØ ÏÂßÅÄÉÎÅÎÙ Ó ÆÌÁÇÏÍ c × ÒÅÖÉÍÅ vi" +157 "óÏ×ÐÁÄÅÎÉÊ ÎÅÔ" +158 "íÅÔËÁ ÏÔÓÕÔÓÔ×ÕÅÔ" +159 "÷ ÓÔÅËÅ ÍÅÔÏË ÚÁÐÉÓÅÊ ÍÅÎØÛÅ, ÞÅÍ %s, ÉÓÐÏÌØÚÕÊÔÅ :display t[ags]" +160 "æÁÊÌÁ Ó ÉÍÅÎÅÍ %s × ÓÔÅËÅ ÍÅÔÏË ÎÅÔ; ÉÓÐÏÌØÚÕÊÔÅ :display t[ags]" +161 "îÁÖÍÉÔÅ Enter ÞÔÏÂÙ ÐÒÏÄÏÌÖÉÔØ: " +162 "%s: ÍÅÔËÁ ÎÅ ÎÁÊÄÅÎÁ" +163 "%s: ÐÌÏÈÁÑ ÍÅÔËÁ × %s" +164 "%s: ÎÏÍÅÒ ÓÔÒÏËÉ ÍÅÔËÉ ×ÙÛÅÌ ÚÁ ËÏÎÅà ÆÁÊÌÁ" +165 "óÔÅË ÍÅÔÏË ÐÕÓÔ" +166 "%s: ÏÂÒÁÚÅà ÐÏÉÓËÁ ÎÅ ÎÁÊÄÅÎ" +167 "ÅÝÅ %d ÆÁÊÌÏ× ÄÌÑ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ" +168 "âÕÆÅÒ %s ÐÕÓÔ" +169 "ðÏÄÔ×ÅÒÄÉÔØ ÉÚÍÅÎÅÎÉÑ? [n]" +170 "ðÒÅÒ×ÁÎÏ" +171 "ïÔÓÕÔÓÔ×ÉÅ ÂÕÆÅÒÁ ÄÌÑ ÉÓÐÏÌØÚÏ×ÁÎÉÑ" +172 "îÅÔ ÐÒÅÄÙÄÕÝÅÇÏ ÒÅÇÕÌÑÒÎÏÇÏ ×ÙÒÁÖÅÎÉÑ" +173 "ëÏÍÁÎÄÁ %s ÐÏÄÒÁÚÕÍÅ×ÁÅÔ ÎÁÌÉÞÉÅ ÐÒÏÞÔÅÎÎÏÇÏ ÆÁÊÌÁ" +174 "éÓÐÏÌØÚÏ×ÁÎÉÅ: %s" +175 "ëÏÍÁÎÄÁ visual ÐÏÄÒÁÚÕÍÅ×ÁÅÔ ÏÂÑÚÁÔÅÌØÎÕÀ ÕÓÔÁÎÏ×ËÕ ÏÐÃÉÉ open" +177 "ðÕÓÔÏÊ ÆÁÊÌ" +178 "îÅÔ ÐÒÅÄÙÄÕÝÅÇÏ ÐÏÉÓËÁ F, f, T, ÉÌÉ t" +179 "%s ÎÅ ÎÁÊÄÅÎÏ" +180 "îÅÔ ÐÒÅÄÙÄÕÝÅÇÏ ÆÁÊÌÁ ÄÌÑ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ" +181 "ëÕÒÓÏÒ ÓÔÏÉÔ ÎÅ ÎÁ ÃÉÆÒÅ" +182 "ðÏÌÕÞÅÎÎÏÅ ÞÉÓÌÏ ÓÌÉÛËÏÍ ×ÅÌÉËÏ" +183 "ðÏÌÕÞÅÎÎÏÅ ÞÉÓÌÏ ÓÌÉÛËÏÍ ÍÁÌÏ" +184 "ðÏÄÈÏÄÑÝÅÇÏ ÓÉÍ×ÏÌÁ ÎÅÔ ÎÁ ÜÔÏÊ ÓÔÒÏËÅ" +185 "ðÏÄÈÏÄÑÝÉÊ ÓÉÍ×ÏÌ ÎÅ ÎÁÊÄÅÎ" +186 "îÅÔ ÓÉÍ×ÏÌÏ× ÄÌÑ ÕÄÁÌÅÎÉÑ" +187 "äÒÕÇÏÇÏ ÜËÒÁÎÁ ÎÅ ÓÕÝÅÓÔ×ÕÅÔ" +188 "óÉÍ×ÏÌÙ ÐÏÓÌÅ ÓÔÒÏËÉ ÄÌÑ ÐÏÉÓËÁ, ÓÍÅÝÅÎÉÑ ÓÔÒÏËÉ É/ÉÌÉ ËÏÍÁÎÄÙ z" +189 "ðÒÏÛÌÙÊ ÏÂÒÁÚÅà ÐÏÉÓËÁ ÏÔÓÕÔÓÔ×ÕÅÔ" +190 "ðÏÉÓË ÚÁ×ÅÒÛÉÌÓÑ ÎÁ ÎÁÞÁÌØÎÏÊ ÐÏÚÉÃÉÉ" +191 "áÂÂÒÅ×ÉÁÔÕÒÁ ÐÒÅ×ÙÓÉÌÁ ÌÉÍÉÔ ÒÁÓÛÉÒÅÎÉÑ: ÓÉÍ×ÏÌÙ ÚÁÂÙÔÙ" +192 "óÉÍ×ÏÌ ÎÅÐÒÁ×ÉÌÅÎ; Ë×ÏÔÉÒÕÊÔÅ ÄÌÑ ××ÏÄÁ" +193 "õÖÅ ÎÁ ÎÁÞÁÌÅ ×ÓÔÁ×ËÉ" +194 "îÅÔ ÓÉÍ×ÏÌÏ× ÄÌÑ ÕÄÁÌÅÎÉÑ" +195 "ðÅÒÅÄ×ÉÖÅÎÉÅ ÚÁ ËÏÎÅà ÆÁÊÌÁ" +196 "ðÅÒÅÄ×ÉÖÅÎÉÅ ÚÁ ËÏÎÅà ÓÔÒÏËÉ" +197 "ä×ÉÖÅÎÉÅ ÓÔÒÏËÉ ÎÅ ÓÄÅÌÁÎÏ" +198 "õÖÅ ÎÁ ÎÁÞÁÌÅ ÆÁÊÌÁ" +199 "ä×ÉÖÅÎÉÅ ËÕÒÓÏÒÁ ÚÁ ÎÁÞÁÌÏ ÆÁÊÌÁ" +200 "õÖÅ × ÐÅÒ×ÏÊ ËÏÌÏÎËÅ" +201 "âÕÆÅÒÙ ÄÏÌÖÎÙ ÂÙÔØ ÕËÁÚÁÎÙ ÄÏ ×ÙÐÏÌÎÅÎÉÑ ËÏÍÁÎÄÙ" +202 "õÖÅ ÎÁ ËÏÎÃÅ ÆÁÊÌÁ" +203 "õÖÅ ÎÁ ËÏÎÃÅ ÓÔÒÏËÉ" +204 "%s ÎÅ Ñ×ÌÑÅÔÓÑ ËÏÍÁÎÄÏÊ VI" +205 "éÓÐÏÌØÚÏ×ÁÎÉÅ: %s" +206 "îÅÔ ÓÉÍ×ÏÌÏ× ÄÌÑ ÕÄÁÌÅÎÉÑ" +207 "ëÏÍÁÎÄÁ Q ÔÒÅÂÕÅÔ ex ÉÎÔÅÒÆÅÊÓ ÔÅÒÍÉÎÁÌÁ" +208 "îÅÔ ËÏÍÁÎÄÙ ÄÌÑ ÐÏ×ÔÏÒÁ" +209 "æÁÊÌ ÐÕÓÔ" +210 "ëÏÍÁÎÄÁ %s ÎÅ ÍÏÖÅÔ ÂÙÔØ ÉÓÐÏÌØÚÏ×ÁÎÁ ËÁË ËÏÍÁÎÄÁ ÐÅÒÅÍÅÝÅÎÉÑ" +211 "õÖÅ × ËÏÍÁÎÄÎÏÍ ÒÅÖÉÍÅ" +212 "ëÕÒÓÏÒ ÎÁÈÏÄÉÔÓÑ ÎÅ ÎÁ ÓÌÏ×Å" +214 "úÎÁÞÅÎÉÅ ÏÐÃÉÉ windows ÓÌÉÛËÏÍ ×ÅÌÉËÏ, ÍÁËÓÉÍÁÌØÎÏÅ ÚÎÁÞÅÎÉÅ = %u" +215 "äÏÂÁ×ÉÔØ" +216 "éÚÍÅÎÉÔØ" +217 "ëÏÍÁÎÄÁ" +218 "÷ÓÔÁ×ÉÔØ" +219 "úÁÍÅÎÉÔØ" +220 "ä×ÉÖÅÎÉÅ ËÕÒÓÏÒÁ ÚÁ ËÏÎÅà ÜËÒÁÎÁ" +221 "ä×ÉÖÅÎÉÅ ËÕÒÓÏÒÁ ÚÁ ÎÁÞÁÌÏ ÜËÒÁÎÁ" +222 "äÌÑ ÒÁÚÄÅÌÅÎÉÑ ÜËÒÁÎ ÄÏÌÖÅÎ ÂÙÔØ ÂÏÌØÛÅ ÞÅÍ ÓÔÒÏËÉ %d" +223 "ôÅÎÅ×ÙÈ ÏËÏÎ ÎÅÔ" +224 "îÅ ÓÕÝÅÓÔ×ÕÅÔ ÔÅÎÅ×ÏÇÏ ÏËÎÁ Ó ÒÅÄÁËÔÉÒÏ×ÁÎÉÅÍ ÆÁÊÌÁ %s" +225 "÷Ù ÎÅ ÍÏÖÅÔÅ ÓÄÅÌÁÔØ ÅÄÉÎÓÔ×ÅÎÎÏÅ ÏËÎÏ ÔÅÎÅ×ÙÍ" +226 "üËÒÁÎ ÍÏÖÅÔ ÂÙÔØ ÓÖÁÔ" +227 "üËÒÁÎ ÎÅ ÍÏÖÅÔ ÂÙÔØ ÓÖÁÔ ÔÏÌØËÏ ÄÏ %d ÓÔÒÏË" +228 "üËÒÁÎ ÎÅ ÍÏÖÅÔ ÂÙÔØ ÒÁÓÛÉÒÅÎ" +230 "üÔÏÔ ÜËÒÁÎ ÎÅ ÍÏÖÅÔ ÂÙÔØ ÐÒÉÏÓÔÁÎÏ×ÌÅÎ" +231 "ðÒÅÒ×ÁÎÏ: ÎÁÚÎÁÞÅÎÎÙÅ ËÌÁ×ÉÛÉ ÚÁÂÙÔÙ" +232 "vi: ×ÒÅÍÅÎÎÙÊ ÂÕÆÅÒ ÎÅ ÏÓ×ÏÂÏÖÄÅÎ" +233 "äÁÎÎÙÊ ÔÉÐ ÔÅÒÍÉÎÁÌÁ ÎÅ ÉÍÅÅÔ ËÌÁ×ÉÛÉ %s" +234 "íÏÖÅÔ ÂÙÔØ ÕËÁÚÁÎ ÔÏÌØËÏ ÏÄÉÎ ÂÕÆÅÒ" +235 "þÉÓÌÏ ÂÏÌØÛÅ ÞÅÍ %lu" +236 "ðÒÅÒ×ÁÎÏ" +237 "îÅ×ÏÚÍÏÖÎÏ ÓÏÚÄÁÔØ ×ÒÅÍÅÎÎÙÊ ÆÁÊÌ" +238 "÷ÎÉÍÁÎÉÅ: %s ÓÐÅÃÉÁÌØÎÙÊ ÆÁÊÌ" +239 "%s ÕÖÅ ÚÁÂÌÏËÉÒÏ×ÁÎ, ÄÏÓÔÕÐÅÎ ÔÏÌØËÏ ÎÁ ÞÔÅÎÉÅ" +240 "%s: ÕÄÁÌÅÎ" +241 "%s: ÚÁËÒÙÔ" +242 "%s: ÕÄÁÌÅÎ" +243 "%s: ÕÄÁÌÅÎ" +244 "æÁÊÌ ÔÏÌØËÏ ÄÌÑ ÞÔÅÎÉÑ, ÎÅ ÚÁÐÉÓÁÎ: éÓÐÏÌØÚÕÊÔÅ ! ÄÌÑ ÏÂÈÏÄÁ" +245 "æÁÊÌ ÔÏÌØËÏ ÄÌÑ ÞÔÅÎÉÑ, ÎÅ ÚÁÐÉÓÁÎ" +246 "%s ÓÕÝÅÓÔ×ÕÅÔ, ÎÅ ÚÁÐÉÓÁÎ; ÉÓÐÏÌØÚÕÊÔÅ ! ÄÌÑ ÏÂÈÏÄÁ" +247 "%s ÓÕÝÅÓÔ×ÕÅÔ, ÎÅ ÚÁÐÉÓÁÎ" +248 "éÓÐÏÌØÚÕÊÔÅ ! ÄÌÑ ÞÁÓÔÉÞÎÏÊ ÚÁÐÉÓÉ ÆÁÊÌÁ" +249 "þÁÓÔØ ÆÁÊÌÁ, ÆÁÊÌ ÎÅ ÚÁÐÉÓÁÎ" +250 "%s: æÁÊÌ ÉÚÍÅÎÑÌÓÑ ÐÏÚÄÎÅÅ, ÞÅÍ ÄÁÎÎÁÑ ËÏÐÉÑ: ÉÓÐÏÌØÚÕÊÔÅ ! ÄÌÑ ÏÂÈÏÄÁ" +251 "%s: æÁÊÌ ÉÚÍÅÎÑÌÓÑ ÐÏÚÄÎÅÅ, ÞÅÍ ÄÁÎÎÁÑ ËÏÐÉÑ" +252 "%s: ÚÁÝÉÔÁ ÎÁ ÚÁÐÉÓØ ÂÙÌÁ ÎÅÄÏÓÔÕÐÎÁ" +253 "úÁÐÉÓØ..." +254 "%s: ÷îéíáîéå: æáêì õóåþåî" +255 "õÖÅ ÐÒÉÓÕÔÓÔ×ÕÅÔ × ÐÅÒ×ÏÊ ÍÅÔËÅ ÄÁÎÎÏÊ ÇÒÕÐÐÙ" +256 "%s: ÎÏ×ÙÊ ÆÁÊÌ: %lu ÓÔÒÏË, %lu ÓÉÍ×ÏÌÏ×" +257 "%s: %lu ÓÔÒÏË, %lu ÓÉÍ×ÏÌÏ×" +258 "%s ÒÁÓÛÉÒÉÌÓÑ × ÓÌÉÛËÏÍ ÂÏÌØÛÏÅ ËÏÌÉÞÅÓÔ×Ï ÉÍÅÎ ÆÁÊÌÏ×" +259 "%s: ÓÐÅÃÉÁÌØÎÙÊ ÆÁÊÌ" +260 "%s: ÎÅ ÐÒÉÎÁÄÌÅÖÉÔ ÷ÁÍ" +261 "%s: ÄÏÓÔÕÐÅÎ ÎÅ ÔÏÌØËÏ ÷ÁÍ" +262 "æÁÊÌ ÉÚÍÅÎÅÎ ÓÏ ×ÒÅÍÅÎÉ ÐÏÓÌÅÄÎÅÊ ÚÁÐÉÓÉ: ÓÏÈÒÁÎÉÔÅ ÉÌÉ ÉÓÐÏÌØÚÕÊÔÅ ! ÄÌÑ ÏÂÈÏÄÁ" +263 "æÁÊÌ ÉÚÍÅÎÅÎ ÓÏ ×ÒÅÍÅÎÉ ÐÏÓÌÅÄÎÅÊ ÚÁÐÉÓÉ: ÓÏÈÒÁÎÉÔÅ ÉÌÉ ÉÓÐÏÌØÚÕÊÔÅ :edit ÄÌÑ ÏÂÈÏÄÁ" +264 "æÁÊÌ ÉÚÍÅÎÅÎ ÓÏ ×ÒÅÍÅÎÉ ÐÏÓÌÅÄÎÅÊ ÚÁÐÉÓÉ: ÓÏÈÒÁÎÉÔÅ ÉÌÉ ÉÓÐÏÌØÚÕÊÔÅ ! ÄÌÑ ÏÂÈÏÄÁ" +265 "æÁÊÌ ×ÒÅÍÅÎÎÙÊ: ×ÙÈÏÄ ÓÏÔÒÅÔ ÌÀÂÙÅ ÉÚÍÅÎÅÎÉÑ" +266 "æÁÊÌ ÔÏÌØËÏ ÄÌÑ ÞÔÅÎÉÑ, Á×ÔÏÚÁÐÉÓØ ÎÅ ÓÒÁÂÏÔÁÌÁ" +267 "úÁÐÉÓÉ ÎÁÞÁÔÙ ÚÁÎÏ×Ï" +268 "ÐÏÄÔ×ÅÒÄÉÔØ? [ynq]" +269 "îÁÖÍÉÔÅ ÌÀÂÕÀ ËÌÁ×ÉÛÕ ÞÔÏÂÙ ÐÒÏÄÏÌÖÉÔØ: " +270 "îÁÖÍÉÔÅ ÌÀÂÕÀ ËÌÁ×ÉÛÕ ÞÔÏÂÙ ÐÒÏÄÏÌÖÉÔØ [: ÞÔÏÂÙ ××ÅÓÔÉ ÅÝÅ ex ËÏÍÁÎÄÙ]: " +271 "îÁÖÍÉÔÅ ÌÀÂÕÀ ËÌÁ×ÉÛÕ ÞÔÏÂÙ ÐÒÏÄÏÌÖÉÔØ [q ÞÔÏÂÙ ×ÙÊÔÉ]: " +272 "üÔÁ ÆÏÒÍÁ %s ÔÒÅÂÕÅÔ ex ÉÎÔÅÒÆÅÊÓ ÔÅÒÍÉÎÁÌÁ" +273 "÷ÈÏÄ × ÒÅÖÉÍ ××ÏÄÁ ex." +274 "ëÏÍÁÎÄÁ ÎÅ ÕÄÁÌÁÓØ, ÆÁÊÌ ÅÝÅ ÎÅ ÐÒÏÞÔÅÎ." +275 " ÐÒÏÄ?" +276 "îÅÏÖÉÄÁÎÎÏÅ ÓÉÍ×ÏÌØÎÏÅ ÓÏÂÙÔÉÅ" +277 "îÅÏÖÉÄÁÎÎÏÅ ÓÏÂÙÔÉÅ 'ËÏÎÅà ÆÁÊÌÁ'" +278 "ðÏ ÚÁÐÒÏÓÕ ÓÏ×ÐÁÄÅÎÉÊ ÎÅÔ" +279 "îÅÏÖÉÄÁÎÎÏÅ ÓÏÂÙÔÉÅ ÐÒÅÒÙ×ÁÎÉÑ" +280 "îÅÏÖÉÄÁÎÎÏÅ ÓÏÂÙÔÉÅ ×ÙÈÏÄÁ" +281 "îÅÏÖÉÄÁÎÎÏÅ ÓÏÂÙÔÉÅ ÐÅÒÅÒÉÓÏ×ËÉ" +282 "õÖÅ ÐÒÉÓÕÔÓÔ×ÕÅÔ × ÐÏÓÌÅÄÎÅÊ ÍÅÔËÅ ÄÁÎÎÏÊ ÇÒÕÐÐÙ" +283 "ëÏÍÁÎÄÁ %s ÔÒÅÂÕÅÔ ex ÉÎÔÅÒÆÅÊÓ ÔÅÒÍÉÎÁÌÁ" +284 "üÔÁ ÆÏÒÍÁ %s ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ ÐÏËÁ ÕÓÔÁÎÏ×ÌÅÎÁ ÏÐÃÉÑ ÂÅÚÏÐÁÓÎÏÇÏ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ" +285 "îÅÏÖÉÄÁÎÎÏÅ ÓÔÒÏËÏ×ÏÅ ÓÏÂÙÔÉÅ" +286 "îÅÏÖÉÄÁÎÎÏÅ ÓÏÂÙÔÉÅ ÔÁÊÍÁÕÔÁ" +287 "îÅÏÖÉÄÁÎÎÏÅ ÓÏÂÙÔÉÅ ÚÁÐÉÓÉ" +288 "äÌÑ ÒÁÚÄÅÌÅÎÉÑ ÜËÒÁÎ ÄÏÌÖÅÎ ÂÙÔØ ÂÏÌØÛÅ ÞÅÍ ÓÔÏÌÂÃÙ %d" +289 "Shell ÒÁÓÛÉÒÅÎÉÑ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÀÔÓÑ ÐÏËÁ ÕÓÔÁÎÏ×ÌÅÎÁ ÏÐÃÉÑ ÂÅÚÏÐÁÓÎÏÇÏ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ" +290 "ëÏÍÁÎÄÁ %s ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ ÐÏËÁ ÕÓÔÁÎÏ×ÌÅÎÁ ÏÐÃÉÑ ÂÅÚÏÐÁÓÎÏÇÏ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ" +291 "set: ÏÐÃÉÑ %s ÎÅ ÍÏÖÅÔ ÂÙÔØ ×ÙËÌÀÞÅÎÁ" +292 "üËÒÁÎ ÓÌÉÛËÏÍ ÍÁÌ" +293 "ÄÏÂÁ×ÌÅÎÏ" +294 "ÉÚÍÅÎÅÎÏ" +295 "ÕÄÁÌÅÎÏ" +296 "ÐÒÉÓÏÅÄÉÎÅÎÏ" +297 "ÐÅÒÅÍÅÝÅÎÏ" +298 "ÓÍÅÝÅÎÏ" +299 "ÓËÏÐÉÒÏ×ÁÎÏ" +300 "ÓÔÒÏËÁ" +301 "ÓÔÒÏËÉ" +303 "æÁÊÌ ÉÚÍÅÎÅÎ Ó ÍÏÍÅÎÔÁ ÐÏÓÌÅÄÎÅÊ ÚÁÐÉÓÉ." +304 "Shell ÒÁÓÛÉÒÅÎÉÅ ÎÅ ÕÄÁÌÏÓØ" +305 "îÅÔ ÕËÁÚÁÎÎÏÊ %s ÏÐÃÉÉ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ" +307 "îÅÔ ex ËÏÍÁÎÄÙ ÄÌÑ ×ÙÐÏÌÎÅÎÉÑ" +308 "÷×ÅÄÉÔÅ ÄÌÑ ×ÙÐÏÌÎÅÎÉÑ ËÏÍÁÎÄÙ, :q ÞÔÏÂÙ ×ÙÊÔÉ" +309 "éÓÐÏÌØÚÕÊÔÅ \"cscope help\" ÄÌÑ ÐÏÍÏÝÉ" +310 "îÅÔ ÚÁÐÕÝÅÎÎÏÇÏ cscope ÓÏÅÄÉÎÅÎÉÑ" +311 "%s: ÎÅÉÚ×ÅÓÔÎÙÊ ÔÉÐ ÐÏÉÓËÁ: ÉÓÐÏÌØÚÕÊÔÅ ÏÄÉÎ ÉÚ %s" +312 "%d: ÎÅÔ ÔÁËÏÇÏ cscope ÓÅÁÎÓÁ" +313 "set: %s ÏÐÃÉÑ ÎÉËÏÇÄÁ ÎÅ ÍÏÖÅÔ ÂÙÔØ ×ËÌÀÞÅÎÁ" +314 "set: %s ÏÐÃÉÑ ÎÉËÏÇÄÁ ÎÅ ÍÏÖÅÔ ÂÙÔØ ÕÓÔÁÎÏ×ÌÅÎÁ × 0" +315 "%s: ÄÏÂÁ×ÌÅÎÏ: %lu ÓÔÒÏË, %lu ÓÉÍ×ÏÌÏ×" +316 "îÅÏÖÉÄÁÎÎÏÅ ÓÏÂÙÔÉÅ ÉÚÍÅÎÅÎÉÑ ÒÁÚÍÅÒÁ" +317 "%d ÆÁÊÌÏ× ÄÌÑ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ" +319 "%d ÜËÒÁÎÏ× × ÆÏÎÏ×ÏÍ ÒÅÖÉÍÅ; ÉÓÐÏÌØÚÕÊÔÅ :display ÞÔÏÂÙ ÐÅÒÅÞÉÓÌÉÔØ ÉÈ" +320 "îÅÉÚ×ÅÓÔÎÁÑ ÐÏÚÉÃÉÑ ËÕÒÓÏÒÁ" +321 "ðÒÅÏÂÒÁÚÏ×ÁÎÉÅ ËÏÄÉÒÏ×ËÉ ÆÁÊÌÏ× ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ" +322 "ðÒÅÏÂÒÁÚÏ×ÁÎÉÅ ËÏÄÉÒÏ×ËÉ ××ÏÄÁ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ" +323 "îÅ×ÅÒÎÙÊ ××ÏÄ. õÓÅÞÅÎÏ." +324 "ïÛÉÂËÁ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ × ÓÔÒÏËÅ %d" diff --git a/catalog/ru_RU.KOI8-R.check b/catalog/ru_RU.KOI8-R.check deleted file mode 100644 index ca77b891051a..000000000000 --- a/catalog/ru_RU.KOI8-R.check +++ /dev/null @@ -1,169 +0,0 @@ -Unused message id's (this is okay): -001 -008 -021 -022 -023 -024 -025 -026 -027 -028 -029 -036 -037 -057 -061 -078 -081 -090 -091 -093 -110 -145 -147 -161 -164 -167 -169 -191 -207 -209 -212 -213 -215 -216 -217 -218 -219 -222 -229 -230 -231 -232 -234 -235 -236 -253 -255 -266 -========================= -MISSING ERROR MESSAGES (Please add!): -008 -021 -022 -023 -024 -025 -026 -027 -028 -029 -036 -037 -057 -061 -078 -090 -091 -093 -110 -145 -147 -161 -164 -167 -169 -191 -207 -209 -212 -215 -216 -217 -218 -219 -222 -230 -231 -232 -234 -235 -236 -253 -255 -266 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -========================= -Extra error messages (just delete them): -047 -050 -051 -052 -176 -========================= -MESSAGES WITH THE SAME MESSAGE ID's (FIX!): -========================= -Duplicate messages, both id and message (this is okay): -========================= -Duplicate messages, just message (this is okay): - 2 %s RAS[IRILSQ W SLI[KOM BOLX[OE KOLI^ESTWO IMEN FAJLOWX - 2 %s SU]ESTWUET, NE ZAPISAN; ISPOLXZUJTE ! DLQ OBHODAX - 2 %s: %lu STROK, %lu SIMWOLOWX - 2 %s: NE DO KONCA WOSSTANOWLENNYJ FAJLX - 2 bUFER %s PUSTX - 2 fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE ! DLQ OBHODAX - 2 set: %s OPCIQ NE QWLQETSQ DWOI^NOJX - 2 zAPISI NE WELISX, NEWOZMOVNO OTMENITX POSLEDN@@ KOMANDUX - 3 %s: UDALENX - 3 nET SIMWOLOW DLQ UDALENIQX - 4 iSPOLXZOWANIE: %sX -========================= diff --git a/catalog/ru_RU.KOI8-R.owner b/catalog/ru_RU.KOI8-R.owner index bf4fa180298c..20ab08c2d5e2 100644 --- a/catalog/ru_RU.KOI8-R.owner +++ b/catalog/ru_RU.KOI8-R.owner @@ -1 +1,3 @@ -Dima Ruban +Andrey A. Chernov +Dima Ruban +Pavel Timofeev diff --git a/catalog/ru_SU.KOI8-R b/catalog/ru_SU.KOI8-R deleted file mode 100644 index 7eb35b9cf262..000000000000 --- a/catalog/ru_SU.KOI8-R +++ /dev/null @@ -1,267 +0,0 @@ -VI_MESSAGE_CATALOG -pEREPOLNENIE ZNA^ENIQ DLINY STROKIX -%s/%d: NEWOZMOVNO UDALITX STROKU %uX -%s/%d: NEWOZMOVNO DOBAWITX K STROKE %uX -%s/%d: NEWOZMOVNO WSTAWITX W STROKU %uX -%s/%d: NEWOZMOVNO SOHRANITX STROKU %uX -%s/%d: NEWOZMOVNO DOSTATX POSLEDN@@ STROKUX - -fAJL ZAPISEJX -zAPISI NE WELISX, NEWOZMOVNO OTMENITX POSLEDN@@ KOMANDUX -nET IZMENENIJ DLQ OTMENYX -zAPISI NE WELISX, NEWOZMOVNO OTMENITX POSLEDN@@ KOMANDUX -zAPISI NE WELISX, NEWOZMOVNO PROSMOTRETX WPEREDX -nET IZMENENIJ DLQ PEREDELKIX -%s/%d: O[IBKA PRI ZAPISI PROTOKOLAX -sTANDARTNYJ WWOD/WYWOD DLQ VI DOLVEN BYTX TERMINALX -oTMETKA %s: NE USTANOWLENAX -oTMETKA %s: STROKA BYLA UDALENAX -oTMETKA %s: POZICII KURSORA BOLX[E NE SU]ESTWUETX -o[IBKA:X - - - - - - - - - -fAJL %s NE QWLQETSQ KATALOGOM SOOB]ENIJX -nEWOZMOVNO USTANOWITX OPCI@ %s PO UMOL^ANI@X -iSPOLXZOWANIE: %sX -oPCII %s NET: 'set all' POKAZYWAET WSE WOZMOVNYE OPCIIX -set: [no]%s NE PRINIMAET TAKOGO ZNA^ENIQX -set: %s OPCIQ NE QWLQETSQ DWOI^NOJX - - -set: NEPRAWILXNOE ZNA^ENIE %sX -set: %s OPCIQ NE QWLQETSQ DWOI^NOJX -kOLI^ESTWO KOLONOK \KRANA SLI[KOM MALO, MENX[E ^EM %dX -kOLI^ESTWO KOLONOK \KRANA SLI[KOM WELIKO, BOLX[E ^EM %dX -kOLI^ESTWO STROK \KRANA SLI[KOM MALO, MENX[E ^EM %dX -kOLI^ESTWO STROK \KRANA SLI[KOM WELIKO, BOLX[E ^EM %dX -oPCIQ lisp OTSUTSTWUETX -sOOB]ENIQ NE WYKL@^ENY: %sX -sOOB]ENIQ NE WKL@^ENY: %sX -oPCIQ modeline(s) NE MOVET BYTX PEREUSTANOWLENAX -oPCIQ paragraph DOLVNA SOSTOQTX IZ GRUPP S DWUMQ SIMWOLAMIX -oPCIQ section DOLVNA SOSTOQTX IZ GRUPP S DWUMQ SIMWOLAMIX -oPCIQ shiftwidth NE MOVET BYTX USTANOWLENA NA 0X -oPCIQ sourceany NE MOVET BYTX USTANOWLENAX -tABULQCIQ NE MOVET BYTX USTANOWLENA NA 0X -sTARTOWYJ BUFER PUSTX -bUFER %s PUSTX -fAJLY S SIMWOLAMI PEREWODA STROKI W IMENI NE MOGUT BYTX WOSSTANOWLENYX -iZMENENIQ NE SOHRANENY PRI KRAHE SESSIIX - -sOHRANENIE NE UDALOSX: %sX -iZMENENIQ NE SOHRANQ@TSQ PRI OBRYWE SESSIIX -sOHRANENIE KOPII FAJLA NE UDALOSX: %sX - -iNFORMACII NA POLXZOWATELQ %u NE NAJDENOX -nEWOZMOVNO ZA]ITITX SPASENNYJ FAJLX -bUFER WOSSTANOWLENNOGO FAJLA PEREPOLNENX -wOSSTANOWLENNYJ FAJLX -%s: NE DO KONCA WOSSTANOWLENNYJ FAJLX -%s: NE DO KONCA WOSSTANOWLENNYJ FAJLX -fAJLOW S IMENEM %s, KOTORYE wY MOVETE ^ITATX, NE SU]ESTWUETX -eSTX STARYE WERSII FAJLA, KOTORYE MOVNO WOSSTANOWITXX -sU]ESTWU@T DRUGIE FAJLY, KOTORYE MOVNO WOSSTANOWITXX -E-mail NE POSLAN: %sX -fAJL PUST - ISKATX NE^EGOX -dOSTIGNUT KONEC FAJLA BEZ NAHOVDENIQ OBRAZCA POISKAX -nE ZADAN OBRAZEC POISKAX -oBRAZEC POISKA NE NAJDENX -dOSTUPNO NA^ALO FAJLA BEZ NAHOVDENIQ OBRAZCA POISKAX -pOISK ZACIKLENX - -nEPE^ATNYH SIMWOLOW NE NAJDENOX -nEIZWESTNAQ KOMANDAX - -kOMANDA NE DOSTUPNA W REVIME exX -s^ET^IK NE MOVET BYTX NULEMX -%s: NEPRAWILXNOE UKAZANIE STROKIX -wNUTRENNQQ O[IBKA W SINTAKSISE (%s: %s)X -iSPOLXZOWANIE: %sX -%s: WREMENNYJ BUFER NE ISPOLXZOWANX -mETKA POSTAWLENA PERED STROKOJ 1X -mETKA POSTAWLENA POSLE KONCA FAJLAX - - -kOMANDA ex NE UDALASX: PARAMETRY KOMANDY ZABYTYX - -wTOROJ ADRES MENX[E ^EM PERWYJX -nE UKAZANO NAZWANIE OTMETKIX -\\ NE ZAWER[AETSQ / ILI ?X -sSYLKA K STROKE S NOMEROM MENX[E 0X -kOMANDA %s NEIZWESTNAX -pEREPOLNENIE ZNA^ENIQ ADRESAX -nEDOBOR ZNA^ENIQ ADRESAX -nEDOPUSTIMAQ KOMBINACIQ W ADRESEX -nEPRAWILXNYJ ADRES: WSEGO %lu STROK W FAJLEX -nEPRAWILXNYJ ADRES: FAJL PUSTX -kOMMANDA %s NE MOVET ISPOLXZOWATX ADRES 0X -aBBREWIATURY OTSUTSTWU@TX -aBBREWIATURY DOLVNY ZAKAN^IWATXSQ SIMWOLOM "word"X -aBBREWIATURY NE MOGUT SODERVATX SIMWOLOY TABLQCII ILI PROBELYX -aBBREWIATURY NE MOGUT SO^ETATXSQ S SIMWOLAMI SLOW/NE-SLOW, ZA ISKL@^ENIEM KONCA STROKIX -"%s" NE QWLQETSQ ABBREWIATUROJX - -fAJLOW DLQ REDAKTIROWANIQ BOLX[E NETX -oTSUTSTWIE PREDYDU]EGO FAJLA DLQ REDAKTIROWANIQX -oTSUTSTWIE PREDYDU]EGO FAJLA DLQ PROSMOTRA NAZADX -nET FAJLOWX -oTSUTSTWIE PREDYDU]EJ KOMANDY DLQ ZAMENY "!"X -oTSUTSTWIE ZAMENY DLQ %%X -oTSUTSTWIE ZAMENY DLQ #X -o[IBKA: execl: %sX -o[IBKA WWODA/WYWODA: %sX -fAJL IZMENEN S MOMENTA POSLEDNEJ POLNOJ ZAPISI: ISPOLXZUJTE ! DLQ OBHODAX -nEWOZMOVNO NAJTI DOMA[NIJ KATALOGX -nOWYJ KATALOG: %sX -nET WYREZANYH BUFEROWX -kOMANDA %s NE MOVET BYTX ISPOLXZOWANA WNUTRI OB]EJ KOMANDYX -%s/%s: NE OTKRYT: NE PRINADLEVIT wAM ILI root-UX -%s/%s: NE OTKRYT: NE PRINADLEVIT wAMX -%s/%s: NE OTKRYT: WOZMOVNOSTX ZAPISI U POLXZOWATELQ, NE QWLQ@]EGOSQ WLADELXCEMX -%s/%s: NE S^ITAN: NE PRINADLEVIT wAM ILI root-UX -%s/%s: NE S^ITAN: NE PRINADLEVIT wAMX -%s/%s: NE S^ITAN: WOZMOVNOSTX ZAPISI U POLXZOWATELQ, NE QWLQ@]EGOSQ WLADELXCEMX -pOSLEDU@]IE STROKI OTSUTSTWU@TX -oTSUTSTWIE PARAMETROW WWODAX -oTSUTSTWIE PARAMETROW KOMANDYX -sIMWOL %s NE MOVET BYTX PEREZAPOMNENX -"%s" NA DANNYJ MOMENT NE OTME^ENX -iMQ METKI DOLVNO BYTX ODNIM SIMWOLOMX -%s SU]ESTWUET, NE ZAPISAN; ISPOLXZUJTE ! DLQ OBHODAX -nOWYJ FAJL .exrc: %sX -sTROKA PERENOSA NAHODITSQ WNUTRI PARAMETROW PERENOSAX -kOMANDA open PODRAZUMEWAET USTANOWKU OPCII openX -kOMANDA open NE REALIZOWANAX -zA]ITA FAJLA NEWOZMOVNAX -fAJL ZA]I]ENX -%s RAS[IRILSQ W SLI[KOM BOLX[OE KOLI^ESTWO IMEN FAJLOWX - -%s: ZA]ITA NA ^TENIE BYLA NEDOSTUPNAX - -%s: %lu STROK, %lu SIMWOLOWX -nET TENEWYH OKONX -kOMANDA script ISPOLXZUETSQ TOLXKO W REVIME viX -nET KOMANDY DLQ ISPOLNENIQX -oPCIQ shiftwidth USTANOWLENA NA 0X -pEREPOLNENIE S^ET^IKAX -cIKL WYPOLNEN NE DO KONCAX -uKAZANO REGULQRNOE WYRAVENIE: FLAG r NE NUVENX -fLAGI #, l I p NE MOGUT BYTX OB_EDINENY S FLAGOM c W REVIME viX -sOWPADENIJ NETX -mETKA OTSUTSTWUETX -w STEKE METOK ZAPISEJ MENX[E, ^EM %s, ISPOLXZUJTE :display t[ags]X -fAJLA S IMENEM %s W STEKE METOK NET; ISPOLXZUJTE :display t[ags]X - -%s: METKA NE NAJDENAX -%s: PLOHAQ METKA W %sX - -sTEK METOK PUSTX -%s: ISKOMAQ PEREMENNAQ NE NAJDENAX - -bUFER %s PUSTX - -pRERWANOX -oTSUTSTWIE BUFERA DLQ ISPOLXZOWANIQX -nET PREDIDU]EGO REGULQRNOGO WYRAVENIQX -kOMANDA %s PODRAZUMEWAET NALI^IE PRO^TENNOGO FAJLAX -iSPOLXZOWANIE: %sX -kOMANDA visual PODRAZUMEWAET OBQZATELXNU@ USTANOWKU OPCII openX -%s RAS[IRILSQ DO SLI[KOM BOLX[OGO KOLI^ESTWA FAJLOWX -pUSTOJ FAJLX -nET PREDYDU]EGO POISKA F, f, T, ILI tX -%s NE NAJDENOX -nET PREDYDU]EGO FAJLA DLQ REDAKTIROWANIQX -kURSOR STOIT NE NA CIFREX -pOLU^ENNOE ^ISLO SLI[KOM WELIKOX -pOLU^ENNOE ^ISLO SLI[KOM MALOX -pODHODQ]EGO SIMWOLA NET NA \TOJ STROKEX -pODHODQ]IJ SIMWOL NE NAJDENX -nET SIMWOLOW DLQ UDALENIQX -dRUGOGO \KRANA NE SU]ESTWUETX -sIMWOLY POSLE STROKI DLQ POISKA I/ILI PEREBOR STROKIX -pRO[LYJ OBRAZEC POISKA OTSUTSTWUETX -pOISK ZAWER[ILSQ NA NA^ALXNOJ POZICIIX - -sIMWOL NEPRAWILEN; ZAKL@^EN W KAWY^KI DLQ WWODAX -uVE NA NA^ALE WSTAWKIX -nET SIMWOLOW DLQ UDALENIQX -pEREDWIVENIE ZA KONEC FAJLAX -pEREDWIVENIE ZA KONEC STROKIX -dWIVENIE STROKI NE SDELANOX -uVE NA NA^ALE FAJLAX -dWIVENIE KURSORA ZA NA^ALO FAJLAX -uVE W PERWOJ KOLONKEX -bUFERY DOLVNY BYTX UKAZANY DO WYPOLNENIQ KOMANDYX -uVE NA KONCE FAJLAX -uVE NA KONSE STROKIX -%s NE QWLQETSQ KOMANDOJ VIX -iSPOLXZOWANIE: %sX -nET SIMWOLOW DLQ UDALENIQX - -nET KOMANDY DLQ POWTORAX - -kOMANDA %s NE MOVET BYTX ISPOLXZOWANA KAK KOMANDA PRODWIVENIQX -~ISLO BOLX[E ^EM %luX - - -zNA^ENIE KOLI^ESTWA OKON SLI[KOM WELIKO, MAKSIMALXNOE ZNA^ENIE = %uX - - - - - -dWIVENIE KURSORA ZA KONEC \KRANAX -dWIVENIE KURSORA ZA NA^ALO \KRANAX - -tENEWYH OKON NETX -nE SU]ESTWUET TENEWOGO OKNA S REDAKTIROWANIEM FAJLA %sX -wY NE MOVETE SDELATX EDINSTWENNOE OKNO TENEWYMX -|KRAN MOVET BYTX SVATX -|KRAN NE MOVET BYTX SVATX -|KRAN NE MOVET BYTX RAS[IRENX - - - - -dANNYJ TIP TERMINALA NE IMEET KLAWI[I %sX - - - -nEWOZMOVNO SOZDATX WREMENNYJ FAJLX -wNIMANIE: %s SPECIALXNYJ FAJLX -%s UVE ZABLOKIROWAN, DOSTUPEN TOLXKO NA ^TENIEX -%s: UDALENX -%s: ZAKRYTX -%s: UDALENX -%s: UDALENX -fAJL TOLXKO DLQ ^TENIQ, NE ZAPISAN: iSPOLXZUJTE ! DLQ OBHODAX -fAJL TOLXKO DLQ ^TENIQ, NE ZAPISANX -%s SU]ESTWUET, NE ZAPISAN; ISPOLXZUJTE ! DLQ OBHODAX -%s SU]ESTWUET, NE ZAPISANX -iSPOLXZUJTE ! DLQ ^ASTI^NOJ ZAPISI FAJLAX -~ASTX FAJLA, FAJL NE ZAPISANX -%s: fAJL IZMENQLSQ POZDNEE, ^EM DANNAQ KOPIQ: ISPOLXZUJTE ! DLQ OBHODAX -%s: fAJL IZMENQLSQ POZDNEE, ^EM DANNAQ KOPIQX -%s: ZA]ITA NA ZAPISX BYLA NEDOSTUPNAX - -%s: wnimanie: fajl use~enX - -%s: NOWYJ FAJL: %lu STROK, %lu SIMWOLOWX -%s: %lu STROK, %lu SIMWOLOWX -%s RAS[IRILSQ W SLI[KOM BOLX[OE KOLI^ESTWO IMEN FAJLOWX -%s SPECIALXNYJ FAJLX -%s: NE PRINADLEVIT wAMX -%s: DOSTUPEN NE TOLXKO wAMX -fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE ! DLQ OBHODAX -fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE :edit DLQ OBHODAX -fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE ! DLQ OBHODAX -fAJL WREMENNYJ: WYHOD SOTRET L@BYE IZMENENIQX - -zAPISI NA^ATY ZANOWOX diff --git a/catalog/ru_SU.KOI8-R.base b/catalog/ru_SU.KOI8-R.base deleted file mode 100644 index 59efd3f53a5f..000000000000 --- a/catalog/ru_SU.KOI8-R.base +++ /dev/null @@ -1,219 +0,0 @@ -002 "pEREPOLNENIE ZNA^ENIQ DLINY STROKI" -003 "%s/%d: NEWOZMOVNO UDALITX STROKU %u" -004 "%s/%d: NEWOZMOVNO DOBAWITX K STROKE %u" -005 "%s/%d: NEWOZMOVNO WSTAWITX W STROKU %u" -006 "%s/%d: NEWOZMOVNO SOHRANITX STROKU %u" -007 "%s/%d: NEWOZMOVNO DOSTATX POSLEDN@@ STROKU" -009 "fAJL ZAPISEJ" -010 "zAPISI NE WELISX, NEWOZMOVNO OTMENITX POSLEDN@@ KOMANDU" -011 "nET IZMENENIJ DLQ OTMENY" -012 "zAPISI NE WELISX, NEWOZMOVNO OTMENITX POSLEDN@@ KOMANDU" -013 "zAPISI NE WELISX, NEWOZMOVNO PROSMOTRETX WPERED" -014 "nET IZMENENIJ DLQ PEREDELKI" -015 "%s/%d: O[IBKA PRI ZAPISI PROTOKOLA" -016 "sTANDARTNYJ WWOD/WYWOD DLQ VI DOLVEN BYTX TERMINAL" -017 "oTMETKA %s: NE USTANOWLENA" -018 "oTMETKA %s: STROKA BYLA UDALENA" -019 "oTMETKA %s: POZICII KURSORA BOLX[E NE SU]ESTWUET" -020 "o[IBKA:" -030 "fAJL %s NE QWLQETSQ KATALOGOM SOOB]ENIJ" -031 "nEWOZMOVNO USTANOWITX OPCI@ %s PO UMOL^ANI@" -032 "iSPOLXZOWANIE: %s" -033 "oPCII %s NET: 'set all' POKAZYWAET WSE WOZMOVNYE OPCII" -034 "set: [no]%s NE PRINIMAET TAKOGO ZNA^ENIQ" -035 "set: %s OPCIQ NE QWLQETSQ DWOI^NOJ" -038 "set: NEPRAWILXNOE ZNA^ENIE %s" -039 "set: %s OPCIQ NE QWLQETSQ DWOI^NOJ" -040 "kOLI^ESTWO KOLONOK \KRANA SLI[KOM MALO, MENX[E ^EM %d" -041 "kOLI^ESTWO KOLONOK \KRANA SLI[KOM WELIKO, BOLX[E ^EM %d" -042 "kOLI^ESTWO STROK \KRANA SLI[KOM MALO, MENX[E ^EM %d" -043 "kOLI^ESTWO STROK \KRANA SLI[KOM WELIKO, BOLX[E ^EM %d" -044 "oPCIQ lisp OTSUTSTWUET" -045 "sOOB]ENIQ NE WYKL@^ENY: %s" -046 "sOOB]ENIQ NE WKL@^ENY: %s" -047 "oPCIQ modeline(s) NE MOVET BYTX PEREUSTANOWLENA" -048 "oPCIQ paragraph DOLVNA SOSTOQTX IZ GRUPP S DWUMQ SIMWOLAMI" -049 "oPCIQ section DOLVNA SOSTOQTX IZ GRUPP S DWUMQ SIMWOLAMI" -050 "oPCIQ shiftwidth NE MOVET BYTX USTANOWLENA NA 0" -051 "oPCIQ sourceany NE MOVET BYTX USTANOWLENA" -052 "tABULQCIQ NE MOVET BYTX USTANOWLENA NA 0" -053 "sTARTOWYJ BUFER PUST" -054 "bUFER %s PUST" -055 "fAJLY S SIMWOLAMI PEREWODA STROKI W IMENI NE MOGUT BYTX WOSSTANOWLENY" -056 "iZMENENIQ NE SOHRANENY PRI KRAHE SESSII" -058 "sOHRANENIE NE UDALOSX: %s" -059 "iZMENENIQ NE SOHRANQ@TSQ PRI OBRYWE SESSII" -060 "sOHRANENIE KOPII FAJLA NE UDALOSX: %s" -062 "iNFORMACII NA POLXZOWATELQ %u NE NAJDENO" -063 "nEWOZMOVNO ZA]ITITX SPASENNYJ FAJL" -064 "bUFER WOSSTANOWLENNOGO FAJLA PEREPOLNEN" -065 "wOSSTANOWLENNYJ FAJL" -066 "%s: NE DO KONCA WOSSTANOWLENNYJ FAJL" -067 "%s: NE DO KONCA WOSSTANOWLENNYJ FAJL" -068 "fAJLOW S IMENEM %s, KOTORYE wY MOVETE ^ITATX, NE SU]ESTWUET" -069 "eSTX STARYE WERSII FAJLA, KOTORYE MOVNO WOSSTANOWITX" -070 "sU]ESTWU@T DRUGIE FAJLY, KOTORYE MOVNO WOSSTANOWITX" -071 "E-mail NE POSLAN: %s" -072 "fAJL PUST - ISKATX NE^EGO" -073 "dOSTIGNUT KONEC FAJLA BEZ NAHOVDENIQ OBRAZCA POISKA" -074 "nE ZADAN OBRAZEC POISKA" -075 "oBRAZEC POISKA NE NAJDEN" -076 "dOSTUPNO NA^ALO FAJLA BEZ NAHOVDENIQ OBRAZCA POISKA" -077 "pOISK ZACIKLEN" -079 "nEPE^ATNYH SIMWOLOW NE NAJDENO" -080 "nEIZWESTNAQ KOMANDA" -082 "kOMANDA NE DOSTUPNA W REVIME ex" -083 "s^ET^IK NE MOVET BYTX NULEM" -084 "%s: NEPRAWILXNOE UKAZANIE STROKI" -085 "wNUTRENNQQ O[IBKA W SINTAKSISE (%s: %s)" -086 "iSPOLXZOWANIE: %s" -087 "%s: WREMENNYJ BUFER NE ISPOLXZOWAN" -088 "mETKA POSTAWLENA PERED STROKOJ 1" -089 "mETKA POSTAWLENA POSLE KONCA FAJLA" -092 "kOMANDA ex NE UDALASX: PARAMETRY KOMANDY ZABYTY" -094 "wTOROJ ADRES MENX[E ^EM PERWYJ" -095 "nE UKAZANO NAZWANIE OTMETKI" -096 "\\ NE ZAWER[AETSQ / ILI ?" -097 "sSYLKA K STROKE S NOMEROM MENX[E 0" -098 "kOMANDA %s NEIZWESTNA" -099 "pEREPOLNENIE ZNA^ENIQ ADRESA" -100 "nEDOBOR ZNA^ENIQ ADRESA" -101 "nEDOPUSTIMAQ KOMBINACIQ W ADRESE" -102 "nEPRAWILXNYJ ADRES: WSEGO %lu STROK W FAJLE" -103 "nEPRAWILXNYJ ADRES: FAJL PUST" -104 "kOMMANDA %s NE MOVET ISPOLXZOWATX ADRES 0" -105 "aBBREWIATURY OTSUTSTWU@T" -106 "aBBREWIATURY DOLVNY ZAKAN^IWATXSQ SIMWOLOM "word"" -107 "aBBREWIATURY NE MOGUT SODERVATX SIMWOLOY TABLQCII ILI PROBELY" -108 "aBBREWIATURY NE MOGUT SO^ETATXSQ S SIMWOLAMI SLOW/NE-SLOW, ZA ISKL@^ENIEM KONCA STROKI" -109 ""%s" NE QWLQETSQ ABBREWIATUROJ" -111 "fAJLOW DLQ REDAKTIROWANIQ BOLX[E NET" -112 "oTSUTSTWIE PREDYDU]EGO FAJLA DLQ REDAKTIROWANIQ" -113 "oTSUTSTWIE PREDYDU]EGO FAJLA DLQ PROSMOTRA NAZAD" -114 "nET FAJLOW" -115 "oTSUTSTWIE PREDYDU]EJ KOMANDY DLQ ZAMENY "!"" -116 "oTSUTSTWIE ZAMENY DLQ %%" -117 "oTSUTSTWIE ZAMENY DLQ #" -118 "o[IBKA: execl: %s" -119 "o[IBKA WWODA/WYWODA: %s" -120 "fAJL IZMENEN S MOMENTA POSLEDNEJ POLNOJ ZAPISI: ISPOLXZUJTE ! DLQ OBHODA" -121 "nEWOZMOVNO NAJTI DOMA[NIJ KATALOG" -122 "nOWYJ KATALOG: %s" -123 "nET WYREZANYH BUFEROW" -124 "kOMANDA %s NE MOVET BYTX ISPOLXZOWANA WNUTRI OB]EJ KOMANDY" -125 "%s/%s: NE OTKRYT: NE PRINADLEVIT wAM ILI root-U" -126 "%s/%s: NE OTKRYT: NE PRINADLEVIT wAM" -127 "%s/%s: NE OTKRYT: WOZMOVNOSTX ZAPISI U POLXZOWATELQ, NE QWLQ@]EGOSQ WLADELXCEM" -128 "%s/%s: NE S^ITAN: NE PRINADLEVIT wAM ILI root-U" -129 "%s/%s: NE S^ITAN: NE PRINADLEVIT wAM" -130 "%s/%s: NE S^ITAN: WOZMOVNOSTX ZAPISI U POLXZOWATELQ, NE QWLQ@]EGOSQ WLADELXCEM" -131 "pOSLEDU@]IE STROKI OTSUTSTWU@T" -132 "oTSUTSTWIE PARAMETROW WWODA" -133 "oTSUTSTWIE PARAMETROW KOMANDY" -134 "sIMWOL %s NE MOVET BYTX PEREZAPOMNEN" -135 ""%s" NA DANNYJ MOMENT NE OTME^EN" -136 "iMQ METKI DOLVNO BYTX ODNIM SIMWOLOM" -137 "%s SU]ESTWUET, NE ZAPISAN; ISPOLXZUJTE ! DLQ OBHODA" -138 "nOWYJ FAJL .exrc: %s" -139 "sTROKA PERENOSA NAHODITSQ WNUTRI PARAMETROW PERENOSA" -140 "kOMANDA open PODRAZUMEWAET USTANOWKU OPCII open" -141 "kOMANDA open NE REALIZOWANA" -142 "zA]ITA FAJLA NEWOZMOVNA" -143 "fAJL ZA]I]EN" -144 "%s RAS[IRILSQ W SLI[KOM BOLX[OE KOLI^ESTWO IMEN FAJLOW" -146 "%s: ZA]ITA NA ^TENIE BYLA NEDOSTUPNA" -148 "%s: %lu STROK, %lu SIMWOLOW" -149 "nET TENEWYH OKON" -150 "kOMANDA script ISPOLXZUETSQ TOLXKO W REVIME vi" -151 "nET KOMANDY DLQ ISPOLNENIQ" -152 "oPCIQ shiftwidth USTANOWLENA NA 0" -153 "pEREPOLNENIE S^ET^IKA" -154 "cIKL WYPOLNEN NE DO KONCA" -155 "uKAZANO REGULQRNOE WYRAVENIE: FLAG r NE NUVEN" -156 "fLAGI #, l I p NE MOGUT BYTX OB_EDINENY S FLAGOM c W REVIME vi" -157 "sOWPADENIJ NET" -158 "mETKA OTSUTSTWUET" -159 "w STEKE METOK ZAPISEJ MENX[E, ^EM %s, ISPOLXZUJTE :display t[ags]" -160 "fAJLA S IMENEM %s W STEKE METOK NET; ISPOLXZUJTE :display t[ags]" -162 "%s: METKA NE NAJDENA" -163 "%s: PLOHAQ METKA W %s" -165 "sTEK METOK PUST" -166 "%s: ISKOMAQ PEREMENNAQ NE NAJDENA" -168 "bUFER %s PUST" -170 "pRERWANO" -171 "oTSUTSTWIE BUFERA DLQ ISPOLXZOWANIQ" -172 "nET PREDIDU]EGO REGULQRNOGO WYRAVENIQ" -173 "kOMANDA %s PODRAZUMEWAET NALI^IE PRO^TENNOGO FAJLA" -174 "iSPOLXZOWANIE: %s" -175 "kOMANDA visual PODRAZUMEWAET OBQZATELXNU@ USTANOWKU OPCII open" -176 "%s RAS[IRILSQ DO SLI[KOM BOLX[OGO KOLI^ESTWA FAJLOW" -177 "pUSTOJ FAJL" -178 "nET PREDYDU]EGO POISKA F, f, T, ILI t" -179 "%s NE NAJDENO" -180 "nET PREDYDU]EGO FAJLA DLQ REDAKTIROWANIQ" -181 "kURSOR STOIT NE NA CIFRE" -182 "pOLU^ENNOE ^ISLO SLI[KOM WELIKO" -183 "pOLU^ENNOE ^ISLO SLI[KOM MALO" -184 "pODHODQ]EGO SIMWOLA NET NA \TOJ STROKE" -185 "pODHODQ]IJ SIMWOL NE NAJDEN" -186 "nET SIMWOLOW DLQ UDALENIQ" -187 "dRUGOGO \KRANA NE SU]ESTWUET" -188 "sIMWOLY POSLE STROKI DLQ POISKA I/ILI PEREBOR STROKI" -189 "pRO[LYJ OBRAZEC POISKA OTSUTSTWUET" -190 "pOISK ZAWER[ILSQ NA NA^ALXNOJ POZICII" -192 "sIMWOL NEPRAWILEN; ZAKL@^EN W KAWY^KI DLQ WWODA" -193 "uVE NA NA^ALE WSTAWKI" -194 "nET SIMWOLOW DLQ UDALENIQ" -195 "pEREDWIVENIE ZA KONEC FAJLA" -196 "pEREDWIVENIE ZA KONEC STROKI" -197 "dWIVENIE STROKI NE SDELANO" -198 "uVE NA NA^ALE FAJLA" -199 "dWIVENIE KURSORA ZA NA^ALO FAJLA" -200 "uVE W PERWOJ KOLONKE" -201 "bUFERY DOLVNY BYTX UKAZANY DO WYPOLNENIQ KOMANDY" -202 "uVE NA KONCE FAJLA" -203 "uVE NA KONSE STROKI" -204 "%s NE QWLQETSQ KOMANDOJ VI" -205 "iSPOLXZOWANIE: %s" -206 "nET SIMWOLOW DLQ UDALENIQ" -208 "nET KOMANDY DLQ POWTORA" -210 "kOMANDA %s NE MOVET BYTX ISPOLXZOWANA KAK KOMANDA PRODWIVENIQ" -211 "~ISLO BOLX[E ^EM %lu" -214 "zNA^ENIE KOLI^ESTWA OKON SLI[KOM WELIKO, MAKSIMALXNOE ZNA^ENIE = %u" -220 "dWIVENIE KURSORA ZA KONEC \KRANA" -221 "dWIVENIE KURSORA ZA NA^ALO \KRANA" -223 "tENEWYH OKON NET" -224 "nE SU]ESTWUET TENEWOGO OKNA S REDAKTIROWANIEM FAJLA %s" -225 "wY NE MOVETE SDELATX EDINSTWENNOE OKNO TENEWYM" -226 "|KRAN MOVET BYTX SVAT" -227 "|KRAN NE MOVET BYTX SVAT" -228 "|KRAN NE MOVET BYTX RAS[IREN" -233 "dANNYJ TIP TERMINALA NE IMEET KLAWI[I %s" -237 "nEWOZMOVNO SOZDATX WREMENNYJ FAJL" -238 "wNIMANIE: %s SPECIALXNYJ FAJL" -239 "%s UVE ZABLOKIROWAN, DOSTUPEN TOLXKO NA ^TENIE" -240 "%s: UDALEN" -241 "%s: ZAKRYT" -242 "%s: UDALEN" -243 "%s: UDALEN" -244 "fAJL TOLXKO DLQ ^TENIQ, NE ZAPISAN: iSPOLXZUJTE ! DLQ OBHODA" -245 "fAJL TOLXKO DLQ ^TENIQ, NE ZAPISAN" -246 "%s SU]ESTWUET, NE ZAPISAN; ISPOLXZUJTE ! DLQ OBHODA" -247 "%s SU]ESTWUET, NE ZAPISAN" -248 "iSPOLXZUJTE ! DLQ ^ASTI^NOJ ZAPISI FAJLA" -249 "~ASTX FAJLA, FAJL NE ZAPISAN" -250 "%s: fAJL IZMENQLSQ POZDNEE, ^EM DANNAQ KOPIQ: ISPOLXZUJTE ! DLQ OBHODA" -251 "%s: fAJL IZMENQLSQ POZDNEE, ^EM DANNAQ KOPIQ" -252 "%s: ZA]ITA NA ZAPISX BYLA NEDOSTUPNA" -254 "%s: wnimanie: fajl use~en" -256 "%s: NOWYJ FAJL: %lu STROK, %lu SIMWOLOW" -257 "%s: %lu STROK, %lu SIMWOLOW" -258 "%s RAS[IRILSQ W SLI[KOM BOLX[OE KOLI^ESTWO IMEN FAJLOW" -259 "%s SPECIALXNYJ FAJL" -260 "%s: NE PRINADLEVIT wAM" -261 "%s: DOSTUPEN NE TOLXKO wAM" -262 "fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE ! DLQ OBHODA" -263 "fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE :edit DLQ OBHODA" -264 "fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE ! DLQ OBHODA" -265 "fAJL WREMENNYJ: WYHOD SOTRET L@BYE IZMENENIQ" -267 "zAPISI NA^ATY ZANOWO" diff --git a/catalog/ru_SU.KOI8-R.check b/catalog/ru_SU.KOI8-R.check deleted file mode 100644 index ca77b891051a..000000000000 --- a/catalog/ru_SU.KOI8-R.check +++ /dev/null @@ -1,169 +0,0 @@ -Unused message id's (this is okay): -001 -008 -021 -022 -023 -024 -025 -026 -027 -028 -029 -036 -037 -057 -061 -078 -081 -090 -091 -093 -110 -145 -147 -161 -164 -167 -169 -191 -207 -209 -212 -213 -215 -216 -217 -218 -219 -222 -229 -230 -231 -232 -234 -235 -236 -253 -255 -266 -========================= -MISSING ERROR MESSAGES (Please add!): -008 -021 -022 -023 -024 -025 -026 -027 -028 -029 -036 -037 -057 -061 -078 -090 -091 -093 -110 -145 -147 -161 -164 -167 -169 -191 -207 -209 -212 -215 -216 -217 -218 -219 -222 -230 -231 -232 -234 -235 -236 -253 -255 -266 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -========================= -Extra error messages (just delete them): -047 -050 -051 -052 -176 -========================= -MESSAGES WITH THE SAME MESSAGE ID's (FIX!): -========================= -Duplicate messages, both id and message (this is okay): -========================= -Duplicate messages, just message (this is okay): - 2 %s RAS[IRILSQ W SLI[KOM BOLX[OE KOLI^ESTWO IMEN FAJLOWX - 2 %s SU]ESTWUET, NE ZAPISAN; ISPOLXZUJTE ! DLQ OBHODAX - 2 %s: %lu STROK, %lu SIMWOLOWX - 2 %s: NE DO KONCA WOSSTANOWLENNYJ FAJLX - 2 bUFER %s PUSTX - 2 fAJL IZMENEN SO WREMENI POSLEDNEJ ZAPISI: SOHRANITE ILI ISPOLXZUJTE ! DLQ OBHODAX - 2 set: %s OPCIQ NE QWLQETSQ DWOI^NOJX - 2 zAPISI NE WELISX, NEWOZMOVNO OTMENITX POSLEDN@@ KOMANDUX - 3 %s: UDALENX - 3 nET SIMWOLOW DLQ UDALENIQX - 4 iSPOLXZOWANIE: %sX -========================= diff --git a/catalog/ru_SU.KOI8-R.owner b/catalog/ru_SU.KOI8-R.owner deleted file mode 100644 index bf4fa180298c..000000000000 --- a/catalog/ru_SU.KOI8-R.owner +++ /dev/null @@ -1 +0,0 @@ -Dima Ruban diff --git a/catalog/spanish b/catalog/spanish deleted file mode 100644 index fb67ee9dc422..000000000000 --- a/catalog/spanish +++ /dev/null @@ -1,317 +0,0 @@ -VI_MESSAGE_CATALOG -Desbordamiento de longitud de l¡neaX -no se puede borrar la l¡nea %luX -no se puede a¤adir la l¡nea %luX -no se puede insertar en la l¡nea %luX -no se puede guardar la l¡nea %luX -no se puede obtener la £ltima l¡neaX -Error: no se puede recuperar la l¡nea %luX -Archivo de logX -No se realiza log, no se puede deshacerX -No hay cambios para deshacerX -No se realiza log, no se puede deshacerX -No se realiza log, no se puede remontar hacia adelanteX -No hay cambios para rehacerX -%s/%d: error de logX -La entrada y salida est ndar de Vi debe ser una terminalX -Marcar %s: no determinadoX -Marcar %s: se borr¢ la l¡neaX -Marcar %s: la posici¢n del cursor ya no existeX -Error: X -nuevo archivoX -nombre cambiadoX -modificadoX -no modificadoX -DESTRABADOX -lectura solamenteX -l¡nea %lu de %lu [%ld%%]X -archivo vac¡oX -l¡nea %luX -El archivo %s no es un cat logo de mensajesX -No se puede determinar la opci¢n por omisi¢n %sX -Uso: %sX -determinar: no hay opci¢n %s: 'determinar todo' establece todos los valores de opci¢nX -determinar: [no] hay opci¢n %s no tiene valorX -determinar: opci¢n %s no es booleanoX -determinar: opci¢n %s: %sX -determinar: opci¢n %s: %s: desbordamiento de valoresX -determinar: opci¢n %s: %s es un n£mero ilegalX -determinar: opci¢n %s no es booleanoX -Las columnas en pantalla son demasiado peque¤as, menos de %dX -Las columnas en pantalla son demasiado grandes, m s de %dX -Las l¡neas en pantalla son demasiado peque¤as, menos de %dX -Las l¡neas en pantalla son demasiado grandes, m s de %dX -La opci¢n lisp no est  implementadaX -mensajes no desconectados: %sX -mensajes no conectados: %sX - -La opci¢n de p rrafo debe estar en dos grupos de caracteresX -La opci¢n de secci¢n debe estar en dos grupos de caracteresX - - - -El buffer por omisi¢n est  vac¡oX -El buffer %s est  vac¡oX -Los archivos con nuevas l¡neas en el nombre son irrecuperablesX -Las modificaciones no pueden recuperarse si la sesi¢n fallaX -Copiando archivo para recuperaci¢n...X -Preservaci¢n fracasada: %sX -Las modificaciones no pueden recuperarse si la sesi¢n fallaX -Archivo de respaldo fracasado: %sX -Copiando archivo para recuperaci¢n...X -Informaci¢n sobre identificaci¢n del usuario %u no encontradaX -No se puede trabar archivo de recuperaci¢nX -Desbordamiento de buffer de archivo de recuperaci¢nX -Archivo de recuperaci¢nX -%s: archivo de recuperaci¢n defectuosoX -%s: archivo de recuperaci¢n defectuosoX -No hay archivos denominados %s, que usted pueda leer, para recuperarX -Existen versiones m s antiguas de este archivo que usted puede recuperarX -Existen otros archivos que usted puede recuperarX -no env¡a email: %sX -Archivo vac¡o; no hay nada para buscarX -Se alcanz¢ el final del archivo sin encontrar el patr¢nX -No hay patr¢n anterior de b£squedaX -No se encontr¢ el patr¢nX - Se alcanz¢ el principio del archivo sin encontrar el patr¢nX -B£squeda reiniciadaX -Buscando...X -No se encontr¢ ning£n car cter no imprimibleX -Nombre de comando desconocidoX - -%s: comando no disponible en modalidad exX -La cuenta no puede ser ceroX -%s: mala especificaci¢n de l¡neaX -Error interno de tabla de sintaxis (%s: %s)X -Uso: %sX -%s: buffer temporario no liberadoX -Desplazamiento de marcador a antes de la l¡nea 1X -Desplazamiento de marcador m s all  del final del archivoX -@ con rango que corre cuando se cambia el archivo/la pantallaX -Comando global/v que corre cuando se cambia el archivo/la pantallaX -Comando Ex fracasado: comandos pendientes descartadosX -Comando Ex fracasado: teclas mapeadas descartadasX -La segunda direcci¢n es m s peque¤a que la primeraX -No se suministra nombre de marcaX -\\ no es seguido por / o ?X -Referencia a un n£mero de l¡nea menor que 0X -El comando %s es desconocidoX -Desbordamiento de valor de direcci¢nX -Subdesbordamiento de valor de direcci¢nX -Combinaci¢n de direcci¢n ilegalX -Direcci¢n ilegal: s¢lo %lu l¡neas en el archivoX -Direcci¢n ilegal: el archivo est  vac¡oX -El comando %s no permite una direcci¢n de 0X -No hay abreviaturas para visualizarX -Las abreviaturas deben terminar con un car cter de \"palabra\" X -Las abreviaturas no pueden contener tabs o espaciosX -Las abreviaturas no pueden mezclar caracteres palabra/no-palabra, salvo al finalX -\"%s\" no es una abreviaturaX -Comando Vi fracasado: teclas mapeadas descartadasX -No hay m s archivos para editarX -No hay archivos anteriores para editarX -No hay archivos anteriores para rebobinarX -No hay lista de archivos para visualizarX -No hay un comando anterior para reemplazar a \"!\"X -No hay nombre de archivo para sustituir por %%X -No hay nombre de archivo para sustituir por #X -Error: execl: %sX -Error de E/S: %sX -Archivo modificado desde la £ltima escritura completa; escribir o usar ! para alterarX -No se puede encontrar la ubicaci¢n del directorio inicialX -Nuevo directorio actual: %sX -No hay buffers sueltos para visualizarX -El comando %s no puede usarse como parte de un comando global o vX -%s/%s: sin fuente: no le pertenece a usted o a ra¡zX -%s/%s: sin fuente: no le pertenece a ustedX -%s/%s: sin fuente: puede ser escrito por un usuario que no sea el propietarioX -%s: sin fuente: no le pertenece a usted o a ra¡zX -%s: sin fuente: no le pertenece a ustedX -%s: sin fuente: puede ser escrito por un usuario que no sea el propietarioX -No hay l¡neas siguientes para unirX -No hay anotaciones de mapa de entradaX -No hay anotaciones de mapa de comandoX -El car cter %s no puede remapearseX -\"%s\" no est  mapeado actualmenteX -Marca de nombres debe ser un s¢lo car cterX -%s existe, no est  escrito; usar ! para alterarX -Nuevo archivo exrc: %sX -La l¡nea de destino se encuentra dentro del rango de movimientoX -El comando abierto requiere que se determine la opci¢n abiertaX -El comando abierto no se ha implementado a£nX -No es posible preservar este archivoX -Archivo preservadoX -%s: expandido a demasiados nombres de archivoX -S¢lo pueden leerse los archivos regulares y los conductos nombradosX -%s: traba de lectura no disponibleX -Leyendo...X -%s: %lu l¡neas, %lu caracteresX -No hay pantallas de fondo para mostrarX -El comando de script s¢lo est  disponible en modalidad viX -No hay comando para ejecutarX -opci¢n de ancho de desplazamiento en 0X -Desbordamiento de cuentaX -Subdesbordamiento de cuentaX -Expresi¢n regular especificada; marcador r no tiene significadoX -Los marcadores #, l y p no pueden combinarse con el marcador c en la modalidad viX -No se encontr¢ coincidenciaX -No se ingres¢ un identificador anteriorX -Se encontraron menos de %s anotaciones en la pila de identificadores; usar :visualizar i[dentificadores]X -No hay archivo %s en la pila de identificadores al que se pueda volver; usar :visualizar i[dentificadores]" -Presionar Intro para continuar: X -%s: no se encontr¢ el identificadorX -%s: identificador corrompido en %sX -%s: el n£mero de l¡nea del identificador es posterior al final del archivoX -La pila de identificadores est  vac¡aX -%s: patr¢n de b£squeda no encontradoX -%d archivos m s para editarX -El buffer %s est  vac¡oX -¨Confirmar cambio? [n]X -InterrumpidoX -No hay buffer anterior para ejecutarX -No hay expresi¢n regular anteriorX -El comando %s requiere que se haya le¡do un archivoX -Uso: %sX -El comando visual requiere que se determine la opci¢n abiertaX - -Archivo vac¡oX -No hay b£squeda F, f, T o t anteriorX -%s no se encontr¢X -No hay archivo anterior para editarX -El cursor no est  en un n£meroX -El n£mero resultante es demasiado grandeX - El n£mero resultante es demasiado peque¤oX -No hay car cter coincidente en esta l¡neaX -No se encontr¢ un car cter coincidenteX -No hay caracteres para reemplazarX -No hay otra pantalla a la que se pueda pasarX -Caracteres despu‚s de cadena de b£squeda, desplazamiento de l¡nea y/o comando zX -No hay patr¢n anterior de b£squedaX -B£squeda vuelve a la posici¢n inicialX -Se super¢ el l¡mite de expansi¢n de abreviatura: se descartaron caracteresX -Car cter ilegal; mencionar para entrarX -Ya se encuentra al principio de la inserci¢nX -No hay m s caracteres para borrarX -Movimiento m s all  del final del archivoX -Movimiento m s all  del final de la l¡neaX -No hay movimiento del cursorX -Ya se encuentra al principio del archivoX -Movimiento m s all  del principio del archivoX -Ya se encuentra en la primera columnaX -Los buffers deben especificarse antes del comandoX -Ya se encuentra al final del archivoX -Ya se encuentra al final de la l¡neaX -%s no es un comando viX -Uso: %sX -No hay caracteres para borrarX -El comando Q requiere la interfase de terminal exX -No hay comando para repetirX -El archivo est  vac¡oX -%s no puede usarse como comando de movimientoX -Ya se encuentra en modalidad de comandoX -El cursor no se encuentra en una palabraX - -El valor de opci¢n de Windows es demasiado grande, el m x. es %uX -A¤adirX -CambiarX -ComandoX -InsertarX -ReemplazarX -El movimiento va m s all  del final de la pantallaX -El movimiento va m s all  del principio de la pantallaX -La pantalla debe tener m s de %d l¡neas para dividirseX -No hay pantallas de fondoX -No hay pantalla de fondo editando un archivo denominado %sX -No se puede poner fondo a la £nica pantalla que se visualizaX -La pantalla s¢lo puede reducirse a %d hilerasX -La pantalla no puede reducirseX -La pantalla no puede aumentarseX - -Esta pantalla no puede suspenderseX -Interrumpido: teclas mapeadas descartadasX -vi: buffer temporario no liberadoX -Esta terminal no tiene tecla %sX -S¢lo un buffer puede especificarseX -N£mero mayor que %luX -InterrumpidoX -No se puede crear archivo temporarioX -Advertencia: %s no es un archivo regularX -%s ya se encuentra trabado, la sesi¢n es de lectura solamenteX -%s: eliminarX -%s: cerrarX -%s: eliminarX -%s: eliminarX -Archivo de lectura solamente, no escrito; usar ! para alterarX - Archivo de lectura solamente, no escritoX -%s existe, no escrito; usar ! para alterarX -%s existe, no escritoX -Archivo parcial, no escrito; usar ! para alterarX -Archivo parcial, no escritoX -%s: archivo modificado m s recientemente que esta copia; usar ! para alterarX -%s: archivo modificado m s recientemente que esta copiaX -%s: la traba de escritura no estaba disponibleX -Escribiendo...X -%s: ADVERTENCIA: ARCHIVO TRUNCADOX -Ya se encuentra en el primer identificador de este grupoX -%s: nuevo archivo: %lu l¡neas, %lu caracteresX -%s: %lu l¡neas, %lu caracteresX -%s expandido a demasiados nombres de archivosX -%s: no es un archivo regularX -%s: no le perteneceX -%s: accesible por un usuario que no sea el propietarioX -Archivo modificado desde la £ltima escritura completa; escribir o usar ! para alterarX -Archivo modificado desde la £ltima escritura completa; escribir o usar :editar! para alterarX -Archivo modificado desde la £ltima escritura completa; escribir o usar ! para alterarX -El archivo es temporario; al salir se descartar n las modificacionesX -Archivo de lectura solamente, las modificaciones no se autoescribenX -Se reinici¢ el logX -confirmar? [snq]X -Presionar cualquier tecla para continuar: X -Presionar cualquier tecla para continuar [: para ingresar m s comandos ex]: X -Presionar cualquier tecla para continuar [q para salir]: X -Esta forma de %s requiere la interfase terminal exX -Ingresando en la modalidad de entrada ex.X -Comando fracasado, no hay archivo le¡do aun.X - cont?X -Evento inesperado de car cterX -Evento inesperado de final de archivoX -No hay coincidencias para consultaX -Evento inesperado de interrupci¢nX -Evento inesperado de salidaX -Evento inesperado de repinturaX -Ya se encuentra en el £ltimo identificador de este grupoX -El comando %s requiere la interfase terminal exX -Esta forma de %s no se encuentra soportada cuando se determina la opci¢n de edici¢n seguraX -Evento inesperado de cadenaX -Evento inesperado de tiempo excedidoX -Evento inesperado de escrituraX - -Las expansiones de shell no se encuentran soportadas cuando se determina la opci¢n de edici¢n seguraX -El comando %s no se encuentra soportado cuando se determina la opci¢n de edici¢n seguraX -determinar: la opci¢n %s puede no estar desconectadaX -El monitor es demasiado peque¤o.X -agregadoX -cambiadoX -borradoX -unidoX -movidoX -desplazadoX -arrancadoX -l¡neaX -l¡neasX -Vi no se carg¢ con un int‚rprete TclX -Archivo modificado desde la £ltima escritura.X -Expansi¢n de shell fracasadaX -No hay opci¢n de edici¢n %s especificadaX -Vi no se carg¢ con un int‚rprete PerlX -No hay comando ex para ejecutarX -Ingresar para ejecutar un comando, :q para salirX -Usar \"cscope ayuda\" para obtener ayudaX -No hay conexiones cscope corriendoX -%s: tipo de b£squeda desconocido: usar uno de %sX -%d: no existe esta sesi¢n cscopeX -determinar: la opci¢n %s no puede conectarse nuncaX -determinar: la opci¢n %s no puede determinarse nunca en 0X -%s: a¤adido: %lu l¡neas, %lu caracteresX -Evento inesperado de modificaci¢n de tama¤oX -%d archivos para editarX diff --git a/catalog/spanish.base b/catalog/spanish.base index 270199eee5c8..ee37a6d31b24 100644 --- a/catalog/spanish.base +++ b/catalog/spanish.base @@ -1,10 +1,10 @@ -002 "Desbordamiento de longitud de l¡nea" -003 "no se puede borrar la l¡nea %lu" -004 "no se puede a¤adir la l¡nea %lu" -005 "no se puede insertar en la l¡nea %lu" -006 "no se puede guardar la l¡nea %lu" -007 "no se puede obtener la £ltima l¡nea" -008 "Error: no se puede recuperar la l¡nea %lu" +002 "Desbordamiento de longitud de línea" +003 "no se puede borrar la línea %lu" +004 "no se puede añadir la línea %lu" +005 "no se puede insertar en la línea %lu" +006 "no se puede guardar la línea %lu" +007 "no se puede obtener la última línea" +008 "Error: no se puede recuperar la línea %lu" 009 "Archivo de log" 010 "No se realiza log, no se puede deshacer" 011 "No hay cambios para deshacer" @@ -12,10 +12,10 @@ 013 "No se realiza log, no se puede remontar hacia adelante" 014 "No hay cambios para rehacer" 015 "%s/%d: error de log" -016 "La entrada y salida est ndar de Vi debe ser una terminal" +016 "La entrada y salida estándar de Vi debe ser una terminal" 017 "Marcar %s: no determinado" -018 "Marcar %s: se borr¢ la l¡nea" -019 "Marcar %s: la posici¢n del cursor ya no existe" +018 "Marcar %s: se borró la línea" +019 "Marcar %s: la posición del cursor ya no existe" 020 "Error: " 021 "nuevo archivo" 022 "nombre cambiado" @@ -23,86 +23,85 @@ 024 "no modificado" 025 "DESTRABADO" 026 "lectura solamente" -027 "l¡nea %lu de %lu [%ld%%]" -028 "archivo vac¡o" -029 "l¡nea %lu" -030 "El archivo %s no es un cat logo de mensajes" -031 "No se puede determinar la opci¢n por omisi¢n %s" +027 "línea %lu de %lu [%ld%%]" +028 "archivo vacío" +029 "línea %lu" +030 "El archivo %s no es un catálogo de mensajes" +031 "No se puede determinar la opción por omisión %s" 032 "Uso: %s" -033 "determinar: no hay opci¢n %s: 'determinar todo' establece todos los valores de opci¢n" -034 "determinar: [no] hay opci¢n %s no tiene valor" -035 "determinar: opci¢n %s no es booleano" -036 "determinar: opci¢n %s: %s" -037 "determinar: opci¢n %s: %s: desbordamiento de valores" -038 "determinar: opci¢n %s: %s es un n£mero ilegal" -039 "determinar: opci¢n %s no es booleano" -040 "Las columnas en pantalla son demasiado peque¤as, menos de %d" -041 "Las columnas en pantalla son demasiado grandes, m s de %d" -042 "Las l¡neas en pantalla son demasiado peque¤as, menos de %d" -043 "Las l¡neas en pantalla son demasiado grandes, m s de %d" -044 "La opci¢n lisp no est  implementada" +033 "determinar: no hay opción %s: 'determinar todo' establece todos los valores de opción" +034 "determinar: [no] hay opción %s no tiene valor" +035 "determinar: opción %s no es booleano" +036 "determinar: opción %s: %s" +037 "determinar: opción %s: %s: desbordamiento de valores" +038 "determinar: opción %s: %s es un número ilegal" +039 "determinar: opción %s no es booleano" +040 "Las columnas en pantalla son demasiado pequeñas, menos de %d" +041 "Las columnas en pantalla son demasiado grandes, más de %d" +042 "Las líneas en pantalla son demasiado pequeñas, menos de %d" +043 "Las líneas en pantalla son demasiado grandes, más de %d" +044 "La opción lisp no está implementada" 045 "mensajes no desconectados: %s" 046 "mensajes no conectados: %s" -048 "La opci¢n de p rrafo debe estar en dos grupos de caracteres" -049 "La opci¢n de secci¢n debe estar en dos grupos de caracteres" -053 "El buffer por omisi¢n est  vac¡o" -054 "El buffer %s est  vac¡o" -055 "Los archivos con nuevas l¡neas en el nombre son irrecuperables" -056 "Las modificaciones no pueden recuperarse si la sesi¢n falla" -057 "Copiando archivo para recuperaci¢n..." -058 "Preservaci¢n fracasada: %s" -059 "Las modificaciones no pueden recuperarse si la sesi¢n falla" +047 "La opción de %s debe estar en dos grupos de caracteres" +053 "El buffer por omisión está vacío" +054 "El buffer %s está vacío" +055 "Los archivos con nuevas líneas en el nombre son irrecuperables" +056 "Las modificaciones no pueden recuperarse si la sesión falla" +057 "Copiando archivo para recuperación..." +058 "Preservación fracasada: %s" +059 "Las modificaciones no pueden recuperarse si la sesión falla" 060 "Archivo de respaldo fracasado: %s" -061 "Copiando archivo para recuperaci¢n..." -062 "Informaci¢n sobre identificaci¢n del usuario %u no encontrada" -063 "No se puede trabar archivo de recuperaci¢n" -064 "Desbordamiento de buffer de archivo de recuperaci¢n" -065 "Archivo de recuperaci¢n" -066 "%s: archivo de recuperaci¢n defectuoso" -067 "%s: archivo de recuperaci¢n defectuoso" +061 "Copiando archivo para recuperación..." +062 "Información sobre identificación del usuario %u no encontrada" +063 "No se puede trabar archivo de recuperación" +064 "Desbordamiento de buffer de archivo de recuperación" +065 "Archivo de recuperación" +066 "%s: archivo de recuperación defectuoso" +067 "%s: archivo de recuperación defectuoso" 068 "No hay archivos denominados %s, que usted pueda leer, para recuperar" -069 "Existen versiones m s antiguas de este archivo que usted puede recuperar" +069 "Existen versiones más antiguas de este archivo que usted puede recuperar" 070 "Existen otros archivos que usted puede recuperar" -071 "no env¡a email: %s" -072 "Archivo vac¡o; no hay nada para buscar" -073 "Se alcanz¢ el final del archivo sin encontrar el patr¢n" -074 "No hay patr¢n anterior de b£squeda" -075 "No se encontr¢ el patr¢n" -076 " Se alcanz¢ el principio del archivo sin encontrar el patr¢n" -077 "B£squeda reiniciada" +071 "no envía email: %s" +072 "Archivo vacío; no hay nada para buscar" +073 "Se alcanzó el final del archivo sin encontrar el patrón" +074 "No hay patrón anterior de búsqueda" +075 "No se encontró el patrón" +076 " Se alcanzó el principio del archivo sin encontrar el patrón" +077 "Búsqueda reiniciada" 078 "Buscando..." -079 "No se encontr¢ ning£n car cter no imprimible" +079 "No se encontró ningún carácter no imprimible" 080 "Nombre de comando desconocido" 082 "%s: comando no disponible en modalidad ex" 083 "La cuenta no puede ser cero" -084 "%s: mala especificaci¢n de l¡nea" +084 "%s: mala especificación de línea" 085 "Error interno de tabla de sintaxis (%s: %s)" 086 "Uso: %s" 087 "%s: buffer temporario no liberado" -088 "Desplazamiento de marcador a antes de la l¡nea 1" -089 "Desplazamiento de marcador m s all  del final del archivo" +088 "Desplazamiento de marcador a antes de la línea 1" +089 "Desplazamiento de marcador más allá del final del archivo" 090 "@ con rango que corre cuando se cambia el archivo/la pantalla" 091 "Comando global/v que corre cuando se cambia el archivo/la pantalla" 092 "Comando Ex fracasado: comandos pendientes descartados" 093 "Comando Ex fracasado: teclas mapeadas descartadas" -094 "La segunda direcci¢n es m s peque¤a que la primera" +094 "La segunda dirección es más pequeña que la primera" 095 "No se suministra nombre de marca" 096 "\\ no es seguido por / o ?" -097 "Referencia a un n£mero de l¡nea menor que 0" +097 "Referencia a un número de línea menor que 0" 098 "El comando %s es desconocido" -099 "Desbordamiento de valor de direcci¢n" -100 "Subdesbordamiento de valor de direcci¢n" -101 "Combinaci¢n de direcci¢n ilegal" -102 "Direcci¢n ilegal: s¢lo %lu l¡neas en el archivo" -103 "Direcci¢n ilegal: el archivo est  vac¡o" -104 "El comando %s no permite una direcci¢n de 0" +099 "Desbordamiento de valor de dirección" +100 "Subdesbordamiento de valor de dirección" +101 "Combinación de dirección ilegal" +102 "Dirección ilegal: sólo %lu líneas en el archivo" +103 "Dirección ilegal: el archivo está vacío" +104 "El comando %s no permite una dirección de 0" 105 "No hay abreviaturas para visualizar" -106 "Las abreviaturas deben terminar con un car cter de \"palabra\" " +106 "Las abreviaturas deben terminar con un carácter de \"palabra\" " 107 "Las abreviaturas no pueden contener tabs o espacios" 108 "Las abreviaturas no pueden mezclar caracteres palabra/no-palabra, salvo al final" 109 "\"%s\" no es una abreviatura" 110 "Comando Vi fracasado: teclas mapeadas descartadas" -111 "No hay m s archivos para editar" +111 "No hay más archivos para editar" 112 "No hay archivos anteriores para editar" 113 "No hay archivos anteriores para rebobinar" 114 "No hay lista de archivos para visualizar" @@ -111,124 +110,123 @@ 117 "No hay nombre de archivo para sustituir por #" 118 "Error: execl: %s" 119 "Error de E/S: %s" -120 "Archivo modificado desde la £ltima escritura completa; escribir o usar ! para alterar" -121 "No se puede encontrar la ubicaci¢n del directorio inicial" +120 "Archivo modificado desde la última escritura completa; escribir o usar ! para alterar" +121 "No se puede encontrar la ubicación del directorio inicial" 122 "Nuevo directorio actual: %s" 123 "No hay buffers sueltos para visualizar" 124 "El comando %s no puede usarse como parte de un comando global o v" -125 "%s/%s: sin fuente: no le pertenece a usted o a ra¡z" +125 "%s/%s: sin fuente: no le pertenece a usted o a raíz" 126 "%s/%s: sin fuente: no le pertenece a usted" 127 "%s/%s: sin fuente: puede ser escrito por un usuario que no sea el propietario" -128 "%s: sin fuente: no le pertenece a usted o a ra¡z" +128 "%s: sin fuente: no le pertenece a usted o a raíz" 129 "%s: sin fuente: no le pertenece a usted" 130 "%s: sin fuente: puede ser escrito por un usuario que no sea el propietario" -131 "No hay l¡neas siguientes para unir" +131 "No hay líneas siguientes para unir" 132 "No hay anotaciones de mapa de entrada" 133 "No hay anotaciones de mapa de comando" -134 "El car cter %s no puede remapearse" -135 "\"%s\" no est  mapeado actualmente" -136 "Marca de nombres debe ser un s¢lo car cter" -137 "%s existe, no est  escrito; usar ! para alterar" +134 "El carácter %s no puede remapearse" +135 "\"%s\" no está mapeado actualmente" +136 "Marca de nombres debe ser un sólo carácter" +137 "%s existe, no está escrito; usar ! para alterar" 138 "Nuevo archivo exrc: %s" -139 "La l¡nea de destino se encuentra dentro del rango de movimiento" -140 "El comando abierto requiere que se determine la opci¢n abierta" -141 "El comando abierto no se ha implementado a£n" +139 "La línea de destino se encuentra dentro del rango de movimiento" +140 "El comando abierto requiere que se determine la opción abierta" +141 "El comando abierto no se ha implementado aún" 142 "No es posible preservar este archivo" 143 "Archivo preservado" 144 "%s: expandido a demasiados nombres de archivo" -145 "S¢lo pueden leerse los archivos regulares y los conductos nombrados" +145 "Sólo pueden leerse los archivos regulares y los conductos nombrados" 146 "%s: traba de lectura no disponible" 147 "Leyendo..." -148 "%s: %lu l¡neas, %lu caracteres" +148 "%s: %lu líneas, %lu caracteres" 149 "No hay pantallas de fondo para mostrar" -150 "El comando de script s¢lo est  disponible en modalidad vi" +150 "El comando de script sólo está disponible en modalidad vi" 151 "No hay comando para ejecutar" -152 "opci¢n de ancho de desplazamiento en 0" +152 "opción de ancho de desplazamiento en 0" 153 "Desbordamiento de cuenta" 154 "Subdesbordamiento de cuenta" -155 "Expresi¢n regular especificada; marcador r no tiene significado" +155 "Expresión regular especificada; marcador r no tiene significado" 156 "Los marcadores #, l y p no pueden combinarse con el marcador c en la modalidad vi" -157 "No se encontr¢ coincidencia" -158 "No se ingres¢ un identificador anterior" +157 "No se encontró coincidencia" +158 "No se ingresó un identificador anterior" 159 "Se encontraron menos de %s anotaciones en la pila de identificadores; usar :visualizar i[dentificadores]" 160 "No hay archivo %s en la pila de identificadores al que se pueda volver; usar :visualizar i[dentificadores]" 161 "Presionar Intro para continuar: " -162 "%s: no se encontr¢ el identificador" +162 "%s: no se encontró el identificador" 163 "%s: identificador corrompido en %s" -164 "%s: el n£mero de l¡nea del identificador es posterior al final del archivo" -165 "La pila de identificadores est  vac¡a" -166 "%s: patr¢n de b£squeda no encontrado" -167 "%d archivos m s para editar" -168 "El buffer %s est  vac¡o" -169 "¨Confirmar cambio? [n]" +164 "%s: el número de línea del identificador es posterior al final del archivo" +165 "La pila de identificadores está vacía" +166 "%s: patrón de búsqueda no encontrado" +167 "%d archivos más para editar" +168 "El buffer %s está vacío" +169 "¿Confirmar cambio? [n]" 170 "Interrumpido" 171 "No hay buffer anterior para ejecutar" -172 "No hay expresi¢n regular anterior" -173 "El comando %s requiere que se haya le¡do un archivo" +172 "No hay expresión regular anterior" +173 "El comando %s requiere que se haya leído un archivo" 174 "Uso: %s" -175 "El comando visual requiere que se determine la opci¢n abierta" -177 "Archivo vac¡o" -178 "No hay b£squeda F, f, T o t anterior" -179 "%s no se encontr¢" +175 "El comando visual requiere que se determine la opción abierta" +177 "Archivo vacío" +178 "No hay búsqueda F, f, T o t anterior" +179 "%s no se encontró" 180 "No hay archivo anterior para editar" -181 "El cursor no est  en un n£mero" -182 "El n£mero resultante es demasiado grande" -183 " El n£mero resultante es demasiado peque¤o" -184 "No hay car cter coincidente en esta l¡nea" -185 "No se encontr¢ un car cter coincidente" +181 "El cursor no está en un número" +182 "El número resultante es demasiado grande" +183 " El número resultante es demasiado pequeño" +184 "No hay carácter coincidente en esta línea" +185 "No se encontró un carácter coincidente" 186 "No hay caracteres para reemplazar" 187 "No hay otra pantalla a la que se pueda pasar" -188 "Caracteres despu‚s de cadena de b£squeda, desplazamiento de l¡nea y/o comando z" -189 "No hay patr¢n anterior de b£squeda" -190 "B£squeda vuelve a la posici¢n inicial" -191 "Se super¢ el l¡mite de expansi¢n de abreviatura: se descartaron caracteres" -192 "Car cter ilegal; mencionar para entrar" -193 "Ya se encuentra al principio de la inserci¢n" -194 "No hay m s caracteres para borrar" -195 "Movimiento m s all  del final del archivo" -196 "Movimiento m s all  del final de la l¡nea" +188 "Caracteres tras de cadena de búsqueda, desplazamiento de línea y/o comando z" +189 "No hay patrón anterior de búsqueda" +190 "Búsqueda vuelve a la posición inicial" +191 "Se superó el límite de expansión de abreviatura: se descartaron caracteres" +192 "Carácter ilegal; mencionar para entrar" +193 "Ya se encuentra al principio de la inserción" +194 "No hay más caracteres para borrar" +195 "Movimiento más allá del final del archivo" +196 "Movimiento más allá del final de la línea" 197 "No hay movimiento del cursor" 198 "Ya se encuentra al principio del archivo" -199 "Movimiento m s all  del principio del archivo" +199 "Movimiento más allá del principio del archivo" 200 "Ya se encuentra en la primera columna" 201 "Los buffers deben especificarse antes del comando" 202 "Ya se encuentra al final del archivo" -203 "Ya se encuentra al final de la l¡nea" +203 "Ya se encuentra al final de la línea" 204 "%s no es un comando vi" 205 "Uso: %s" 206 "No hay caracteres para borrar" 207 "El comando Q requiere la interfase de terminal ex" 208 "No hay comando para repetir" -209 "El archivo est  vac¡o" -209 "El archivo est  vac¡o" +209 "El archivo está vacío" 210 "%s no puede usarse como comando de movimiento" 211 "Ya se encuentra en modalidad de comando" 212 "El cursor no se encuentra en una palabra" -214 "El valor de opci¢n de Windows es demasiado grande, el m x. es %u" -215 "A¤adir" +214 "El valor de opción de Windows es demasiado grande, el máx. es %u" +215 "Añadir" 216 "Cambiar" 217 "Comando" 218 "Insertar" 219 "Reemplazar" -220 "El movimiento va m s all  del final de la pantalla" -221 "El movimiento va m s all  del principio de la pantalla" -222 "La pantalla debe tener m s de %d l¡neas para dividirse" +220 "El movimiento va más allá del final de la pantalla" +221 "El movimiento va más allá del principio de la pantalla" +222 "La pantalla debe tener más de %d líneas para dividirse" 223 "No hay pantallas de fondo" 224 "No hay pantalla de fondo editando un archivo denominado %s" -225 "No se puede poner fondo a la £nica pantalla que se visualiza" -226 "La pantalla s¢lo puede reducirse a %d hileras" +225 "No se puede poner fondo a la única pantalla que se visualiza" +226 "La pantalla sólo puede reducirse a %d hileras" 227 "La pantalla no puede reducirse" 228 "La pantalla no puede aumentarse" 230 "Esta pantalla no puede suspenderse" 231 "Interrumpido: teclas mapeadas descartadas" 232 "vi: buffer temporario no liberado" 233 "Esta terminal no tiene tecla %s" -234 "S¢lo un buffer puede especificarse" -235 "N£mero mayor que %lu" +234 "Sólo un buffer puede especificarse" +235 "Número mayor que %lu" 236 "Interrumpido" 237 "No se puede crear archivo temporario" 238 "Advertencia: %s no es un archivo regular" -239 "%s ya se encuentra trabado, la sesi¢n es de lectura solamente" +239 "%s ya se encuentra trabado, la sesión es de lectura solamente" 240 "%s: eliminar" 241 "%s: cerrar" 242 "%s: eliminar" @@ -239,48 +237,48 @@ 247 "%s existe, no escrito" 248 "Archivo parcial, no escrito; usar ! para alterar" 249 "Archivo parcial, no escrito" -250 "%s: archivo modificado m s recientemente que esta copia; usar ! para alterar" -251 "%s: archivo modificado m s recientemente que esta copia" +250 "%s: archivo modificado más recientemente que esta copia; usar ! para alterar" +251 "%s: archivo modificado más recientemente que esta copia" 252 "%s: la traba de escritura no estaba disponible" 253 "Escribiendo..." 254 "%s: ADVERTENCIA: ARCHIVO TRUNCADO" 255 "Ya se encuentra en el primer identificador de este grupo" -256 "%s: nuevo archivo: %lu l¡neas, %lu caracteres" -257 "%s: %lu l¡neas, %lu caracteres" +256 "%s: nuevo archivo: %lu líneas, %lu caracteres" +257 "%s: %lu líneas, %lu caracteres" 258 "%s expandido a demasiados nombres de archivos" 259 "%s: no es un archivo regular" 260 "%s: no le pertenece" 261 "%s: accesible por un usuario que no sea el propietario" -262 "Archivo modificado desde la £ltima escritura completa; escribir o usar ! para alterar" -263 "Archivo modificado desde la £ltima escritura completa; escribir o usar :editar! para alterar" -264 "Archivo modificado desde la £ltima escritura completa; escribir o usar ! para alterar" -265 "El archivo es temporario; al salir se descartar n las modificaciones" +262 "Archivo modificado desde la última escritura completa; escribir o usar ! para alterar" +263 "Archivo modificado desde la última escritura completa; escribir o usar :editar! para alterar" +264 "Archivo modificado desde la última escritura completa; escribir o usar ! para alterar" +265 "El archivo es temporario; al salir se descartarán las modificaciones" 266 "Archivo de lectura solamente, las modificaciones no se autoescriben" -267 "Se reinici¢ el log" +267 "Se reinició el log" 268 "confirmar? [snq]" 269 "Presionar cualquier tecla para continuar: " -270 "Presionar cualquier tecla para continuar [: para ingresar m s comandos ex]: " +270 "Presionar cualquier tecla para continuar [: para ingresar más comandos ex]: " 271 "Presionar cualquier tecla para continuar [q para salir]: " 272 "Esta forma de %s requiere la interfase terminal ex" 273 "Ingresando en la modalidad de entrada ex." -274 "Comando fracasado, no hay archivo le¡do aun." +274 "Comando fracasado, no hay archivo leído aun." 275 " cont?" -276 "Evento inesperado de car cter" +276 "Evento inesperado de carácter" 277 "Evento inesperado de final de archivo" 278 "No hay coincidencias para consulta" -279 "Evento inesperado de interrupci¢n" +279 "Evento inesperado de interrupción" 280 "Evento inesperado de salida" 281 "Evento inesperado de repintura" -282 "Ya se encuentra en el £ltimo identificador de este grupo" +282 "Ya se encuentra en el último identificador de este grupo" 283 "El comando %s requiere la interfase terminal ex" -284 "Esta forma de %s no se encuentra soportada cuando se determina la opci¢n de edici¢n segura" +284 "Esta forma de %s no se encuentra soportada cuando se determina la opción de edición segura" 285 "Evento inesperado de cadena" 286 "Evento inesperado de tiempo excedido" 287 "Evento inesperado de escritura" -289 "Las expansiones de shell no se encuentran soportadas cuando se determina la opci¢n de edici¢n segura" -290 "El comando %s no se encuentra soportado cuando se determina la opci¢n de edici¢n segura" -291 "determinar: la opci¢n %s puede no estar desconectada" -292 "El monitor es demasiado peque¤o." +289 "Las expansiones de shell no se encuentran soportadas cuando se determina la opción de edición segura" +290 "El comando %s no se encuentra soportado cuando se determina la opción de edición segura" +291 "determinar: la opción %s puede no estar desconectada" +292 "El monitor es demasiado pequeño." 293 "agregado" 294 "cambiado" 295 "borrado" @@ -288,22 +286,21 @@ 297 "movido" 298 "desplazado" 299 "arrancado" -300 "l¡nea" -301 "l¡neas" -302 "Vi no se carg¢ con un int‚rprete Tcl" -303 "Archivo modificado desde la £ltima escritura." -304 "Expansi¢n de shell fracasada" -304 "Expansi¢n de shell fracasada" -305 "No hay opci¢n de edici¢n %s especificada" -306 "Vi no se carg¢ con un int‚rprete Perl" +300 "línea" +301 "líneas" +302 "Vi no se cargó con un intérprete Tcl" +303 "Archivo modificado desde la última escritura." +304 "Expansión de shell fracasada" +305 "No hay opción de edición %s especificada" +306 "Vi no se cargó con un intérprete Perl" 307 "No hay comando ex para ejecutar" 308 "Ingresar para ejecutar un comando, :q para salir" 309 "Usar \"cscope ayuda\" para obtener ayuda" 310 "No hay conexiones cscope corriendo" -311 "%s: tipo de b£squeda desconocido: usar uno de %s" -312 "%d: no existe esta sesi¢n cscope" -313 "determinar: la opci¢n %s no puede conectarse nunca" -314 "determinar: la opci¢n %s no puede determinarse nunca en 0" -315 "%s: a¤adido: %lu l¡neas, %lu caracteres" -316 "Evento inesperado de modificaci¢n de tama¤o" +311 "%s: tipo de búsqueda desconocido: usar uno de %s" +312 "%d: no existe esta sesión cscope" +313 "determinar: la opción %s no puede conectarse nunca" +314 "determinar: la opción %s no puede determinarse nunca en 0" +315 "%s: añadido: %lu líneas, %lu caracteres" +316 "Evento inesperado de modificación de tamaño" 317 "%d archivos para editar" diff --git a/catalog/spanish.check b/catalog/spanish.check deleted file mode 100644 index c04785e3a2ef..000000000000 --- a/catalog/spanish.check +++ /dev/null @@ -1,35 +0,0 @@ -Unused message id's (this is okay): -001 -047 -050 -051 -052 -081 -176 -229 -288 -========================= -MISSING ERROR MESSAGES (Please add!): -========================= -Extra error messages (just delete them): -========================= -MESSAGES WITH THE SAME MESSAGE ID's (FIX!): -========================= -Duplicate messages, both id and message (this is okay): - 2 209 "El archivo est  vac¡o" - 2 304 "Expansi¢n de shell fracasada" -========================= -Duplicate messages, just message (this is okay): - 2 %s: %lu l¡neas, %lu caracteresX - 2 %s: archivo de recuperaci¢n defectuosoX - 2 Copiando archivo para recuperaci¢n...X - 2 El buffer %s est  vac¡oX - 2 InterrumpidoX - 2 Las modificaciones no pueden recuperarse si la sesi¢n fallaX - 2 No hay patr¢n anterior de b£squedaX - 2 No se realiza log, no se puede deshacerX - 2 determinar: opci¢n %s no es booleanoX - 3 %s: eliminarX - 3 Archivo modificado desde la £ltima escritura completa; escribir o usar ! para alterarX - 4 Uso: %sX -========================= diff --git a/catalog/swedish b/catalog/swedish deleted file mode 100644 index 044b354fa070..000000000000 --- a/catalog/swedish +++ /dev/null @@ -1,317 +0,0 @@ -VI_MESSAGE_CATALOG -För långa raderX -kan inte ta bort rad %luX -kan inte lägga till på rad %luX -kan inte sätta in på rad %luX -kan inte lagra rad %luX -kan inte hämta sista radenX -Fel: kan inte hämta rad %luX -LoggningsfilX -Loggning utförs inte, ångra är inte möjligtX -Inga ändringar att ångraX -Loggning utförs inte, ångra är inte möjligtX -Loggning utförs inte, ångra ångra är inte möjligtX -Inga ändringar att återgöraX -%s/%d: fel vid loggningX -Vi:s standard in och ut måste gå till en terminalX -Markering %s: inte sattX -Markering %s: raden har tagits bortX -Markering %s: markörpositionen finns inte längreX -Fel: X -ny filX -namnet ändradesX -ändradX -oförändradX -OLÅSTX -inte skrivbarX -rad %lu av %lu [%ld%%]X -tom filX -rad %luX -Filen %s är ingen meddelandekatalogX -Kan inte sätta standardvärde för %s flagganX -Användning: %sX -set: %s är en okänd flagga: "set all" visar alla flaggorX -set: [no]%s flaggan kan inte ges ett värdeX -set: %s flaggan är inte boleanskX -set: %s flaggan: %sX -set: %s flaggan: %s: för stort värdeX -set: %s flaggan: %s är ett otillåtet talX -set: %s flaggan är inte boleanskX -Fönsterkolumnerna är för få, mindre än %dX -Fönsterkolumnerna är för många, fler än %dX -Fönsterraderna är för få, mindre än %dX -Fönsterraderna är för många, fler än %dX -Lisp flaggan är inte implementeradX -meddelanden är inte avslagna: %sX -meddelanden är inte påslagna: %sX - -Paragraph flaggan måste ges i teckengrupper om tvåX -Section flaggan måste ges i teckengrupper om tvåX - - - -Standardbufferten är tomX -Buffer %s är tomX -Filer med radmatning i namnet kan inte återskapasX -Ändringar kan inte återskapas om programmet krascharX -Kopierar filen för återskapning...X -Säkerhetskopiering misslyckades: %sX -Ändringar kan inte återskapas om programmet krascharX -Misslyckades att säkerhetskopiera filen: %sX -Kopierar filen för återskapning...X -Kan inte hitta information om användaridentitet %uX -Kan inte låsa återskapningsfilenX -Återskapningsfilens buffer överskrivenX -ÅterskapningsfilX -%s: Återskapningsfilen är korruptX -%s: Återskapningsfilen är korruptX -Det finns ingen fil %s, läsbar av dig, att återskapaX -Det finns äldre versioner av denna fil som du kan återskapaX -Det finns andra filer du kan återskapaX -skickar inte email: %sX -Filen är tom; inget att söka iX -Kom till slutet på filen utan att hitta söksträngenX -Ingen tidigare söksträngX -Hittar inte söksträngenX -Kom till början av filen utan att hitta söksträngenX -Sökningen slog runtX -Söker...X -Inga icke skrivbara tecken funnaX -Okänt kommandonamnX - -%s: kommandot är inte tillgängligt i "ex" lägeX -Talet får inte vara nollX -%s: Ogiltig radspecifikationX -Fel i intern syntaxtabell (%s: %s)X -Användning: %sX -%s: temporärbuffert inte frisläpptX -Offset är före rad 1X -Offset är efter slutet på filenX -@ med intervall exekverades när filen/fönstret ändradesX -Global/v kommando exekverades när filen/fönstret ändradesX -Ex kommando misslyckades: efterföljande kommandon ignoreradeX -Ex kommando misslyckades: omdefinierade tangenter ignoreradeX -Den andra adressen är mindre än den förstaX -Inget namn på markering givetX -\\ följs inte av / eller ?X -Referens till ett radnummer mindre än 0X -%s kommandot är inte käntX -Värdet på adressen är för stortX -Värdet på adressen är för litetX -Otillåten adresskombinationX -Otillåten adress: bara %lu rader finns i filenX -Otillåten adress: filen är tomX -%s kommandot tillåter inte en adress som är 0X -Inga förkortningar att visaX -Förkortningar måste sluta med ett "ord" teckenX -Förkortningar kan inte innehålla mellanslag eller tabX -Förkortningar kan inte blanda "ord"/"icke ord" tecken, utom i slutetX -"%s" är ingen förkortningX -Vi kommando misslyckades: omdefinierade tangenter ignoreradeX -Inga fler filer att editeraX -Inga tidigare filer att editeraX -Inga tidigare filer att spela tillbakaX -Ingen fillista att visaX -Inget tidigare kommando att ersätta "!" medX -Inget filnamn att ersätta %% medX -Inget filnamn att ersätta # medX -Fel: execl: %sX -I/O fel: %sX -Filen ändrad efter sista skrivning; spara eller använd !X -Kan inte hitta hemkatalogX -Ny nuvarande katalog: %sX -Inga "cut buffers" att visaX -%s kommandot kan inte används som del i ett "global" eller v kommandoX -%s/%s: inte läst: varken du eller root är ägareX -%s/%s: inte läst: du är inte ägareX -%s/%s: inte läst: skrivbar av annan än ägarenX -%s: inte läst: varken du eller root är ägareX -%s: inte läst: du är inte ägareX -%s: inte läst: skrivbar av annan än ägarenX -Ingen nästa rad att sätta ihop medX -Det finns inget i inmatningsmappningenX -Det finns inget i kommandomappningenX -%s tecknet kan inte mappas omX -"%s" är inte ommappat just nuX -Namn på markeringar måste vara ett tecken långaX -%s finns, inget sparat; använd ! för att sparaX -Ny exrc fil: %sX -Målraden ligger inne i området som ska flyttasX -Open kommandot kräver att open flaggan är sattX -Open kommandot är inte implementerat ännuX -Säkerhetskopiering av filen är inte möjligtX -Filen säkerhetskopieradX -%s expanderade till för många filnamnX -Endast vanliga filer och namngivna rör kan läsasX -%s: läslåset är otillgängligtX -Läser...X -%s: %lu rader, %lu teckenX -Inga bakgrundsfönster att visaX -Script kommandot finns bara i "vi" lägeX -Inget kommando att exekveraX -shiftwidth flaggan satt till 0X -Talet har för stort värdeX -Talet har för litet värdeX -Reguljärt uttryck är givet; r flaggan är meningslösX -#, l och p flaggorna kan inte kombineras med c flaggan i "vi" lägeX -Ingen matchande text funnenX -Inget tidigare märke har givitsX -Det är färre än %s märken i stacken; använd :display t[ags]X -Det finns ingen fil %s i märkesstacken; använd :display t[ags]X -Tryck Enter för att fortsätta: X -%s: märke inte funnetX -%s: korrupt märke i %sX -%s: märkets radnummer är bortom filslutetX -Märkesstacken är tomX -%s: söksträngen inte funnenX -%d filer till att editeraX -Buffert %s är tomX -Bekräfta ändring? [n]X -AvbrutenX -Ingen tidigare buffert att exekveraX -Inget tidigare reguljärt uttryckX -%s kommandot kräver att en fil redan lästs inX -Användning: %sX -Visual kommandot kräver att open flaggan är sattX - -Tom filX -Ingen tidigare F, f, T eller t sökningX -%s inte funnenX -Ingen tidigare fil att editeraX -Markören är inte i ett talX -Det resulterande talet är för stortX -Det resulterande talet är för litetX -Inget matchande tecken på denna radX -Matchande tecken inte funnetX -Det finns inga tecken att ersättaX -Det finns inget fönster att byta tillX -Tecken efter söksträng, radoffset och/eller z kommandotX -Ingen tidigare söksträngX -Sökningen slog runt till ursprungliga positionenX -Förkortning överskred expanderingsgränsen: tecken har tagits bortX -Ogiltigt tecken; använd "quote" för att sätta inX -Redan i början på insättningenX -Inga fler tecken att ta bortX -Försök att gå bortom slutet på filenX -Försök att gå bortom slutet på radenX -Ingen förflyttning gjordX -Redan i början på filenX -Försök att gå före början på filenX -Redan i första kolumnenX -Buffertar måste anges före kommandotX -Redan i slutet av filenX -Redan på slutet av radenX -%s är inte ett "vi" kommandoX -Användning: %sX -Inga tecken att ta bortX -Q kommandot kräver "ex" i terminallägeX -Inget kommando att repeteraX -Filen är tomX -%s kan inte användas som ett förflyttningskommandoX -Redan i kommando lägeX -Markören är inte i ett ordX - -Windows flaggans värde är för stor, största värde är %uX -Lägg tillX -ÄndraX -KommandoX -Sätt inX -ErsättX -Förflyttning bortom fönsterslutX -Förflyttning till före fönstrets börjanX -Fönstret måste vara större än %d rader för delningX -Det finns inga fönster i bakgrundenX -Det finns inget fönster i bakgrunden som editerar filen %sX -Du får inte sätta ditt enda synliga fönster i bakgrundenX -Fönstret kan bara krympa till %d raderX -Fönstret kan inte krympaX -Fönstret kan inte växaX - -Detta fönster kan inte pausasX -Avbrutet: omdefinierade tangenter ignoreradeX -vi: temporärbuffertar inte frisläpptaX -Denna terminal har ingen %s tangentX -Endast en buffert kan angesX -Talet är större än %luX -AvbrutetX -Kan inte skapa temporär filX -Warning: %s är inte en normal filX -%s är redan låst, detta blir en icke skrivbar sessionX -%s: ta bortX -%s: stängX -%s: ta bortX -%s: ta bortX -Ej skrivbar fil, filen inte sparad; använd ! för att skriva överX -Ej skrivbar fil, filen inte sparadX -%s finns, ej sparad; använd ! för att utföra operationenX -%s finns, filen inte sparadX -Ofullständig fil, filen inte sparad, använd ! för att skriva överX -Ofullständig fil, filen inte sparadX -%s: filen ändrad efter denna kopia togs; använd ! för att utföra operationenX -%s: filen ändrad efter denna kopia togsX -%s: skrivlåset är otillgängligtX -Skriver...X -%s: VARNING: FILEN TRUNKERADX -Redan vid första märket i denna gruppX -%s: ny fil: %lu rader, %lu teckenX -%s: %lu rader, %lu teckenX -%s expanderade till för många filnamnX -%s är inte en normal filX -%s ägs inte av digX -%s är åtkomstbar av andra än ägarenX -Filen har ändrats efter den sparats; spara eller använd !X -Filen har ändrats efter den sparats; spara eller använd :edit!X -Filen har ändrats efter den sparats; spara eller använd !X -Filen är temporär; exit kastar bort ändringarnaX -Ej skrivbar fil, ändringar har inte automatsparatsX -Loggningen startar omX -bekräfta? [ynq]X -Tryck på en tangent för att fortsätta: X -Tryck på en tangent för att fortsätta [: för att ge fler kommandon]: X -Tryck på en tangent för att fortsätta [q för att avsluta]: X -Den formen av %s kräver "ex" i terminallägeX -Går till "ex" inmatningsläge.X -Kommandot misslyckades, ingen fil inläst ännu.X - forts?X -Oväntad teckenhändelseX -Oväntad filslutshändelseX -Sökningen hittade ingentingX -Oväntad avbrottshändelseX -Oväntad avslutningshändelseX -Oväntad omritningshändelseX -Redan vid sista märket i denna gruppX -%s kommandot kräver "ex" i terminallägeX -Den formen av %s är inte tillgänglig när secure edit flaggan är sattX -Oväntad stränghändelseX -Oväntad tidshändelseX -Oväntad skrivhändelseX - -Skalexpansion är inte tillgänglig när secure edit flaggan är sattX -%s kommandot är inte tillgänglig när secure edit flaggan är sattX -set: %s kan inte slås avX -Fönstret för litet.X -tillagdaX -ändradeX -borttagnaX -ihopsattaX -flyttadeX -flyttadeX -inklistradeX -radX -raderX -Vi har inte länkats med en Tcl tolkX -Filen har ändrats efter den sparats.X -Skalexpansion misslyckadesX -Ingen %s edit flagga givenX -Vi har inte länkats med en Perl tolkX -Inga "ex" kommandon att exekveraX -Tryck för att exekvera kommando, :q för att avslutaX -Gör "cscope help" för hjälpX -Inga cscope kopplingar körsX -%s: okänd söktyp: använd en av %sX -%d: ingen sådan cscope sessionX -set: %s flaggan får aldrig slås påX -set: %s flaggan får aldrig sättas till 0X -%s: tillagt: %lu rader, %lu teckenX -Oväntad storleksändringX -%d filer att editeraX diff --git a/catalog/swedish.base b/catalog/swedish.base index 43bf7765a25e..7143c5a7818e 100644 --- a/catalog/swedish.base +++ b/catalog/swedish.base @@ -29,7 +29,7 @@ 030 "Filen %s är ingen meddelandekatalog" 031 "Kan inte sätta standardvärde för %s flaggan" 032 "Användning: %s" -033 "set: %s är en okänd flagga: "set all" visar alla flaggor" +033 "set: %s är en okänd flagga: \"set all\" visar alla flaggor" 034 "set: [no]%s flaggan kan inte ges ett värde" 035 "set: %s flaggan är inte boleansk" 036 "set: %s flaggan: %s" @@ -43,8 +43,7 @@ 044 "Lisp flaggan är inte implementerad" 045 "meddelanden är inte avslagna: %s" 046 "meddelanden är inte påslagna: %s" -048 "Paragraph flaggan måste ges i teckengrupper om två" -049 "Section flaggan måste ges i teckengrupper om två" +047 "%s flaggan måste ges i teckengrupper om två" 053 "Standardbufferten är tom" 054 "Buffer %s är tom" 055 "Filer med radmatning i namnet kan inte återskapas" @@ -73,7 +72,7 @@ 078 "Söker..." 079 "Inga icke skrivbara tecken funna" 080 "Okänt kommandonamn" -082 "%s: kommandot är inte tillgängligt i "ex" läge" +082 "%s: kommandot är inte tillgängligt i \"ex\" läge" 083 "Talet får inte vara noll" 084 "%s: Ogiltig radspecifikation" 085 "Fel i intern syntaxtabell (%s: %s)" @@ -97,16 +96,16 @@ 103 "Otillåten adress: filen är tom" 104 "%s kommandot tillåter inte en adress som är 0" 105 "Inga förkortningar att visa" -106 "Förkortningar måste sluta med ett "ord" tecken" +106 "Förkortningar måste sluta med ett \"ord\" tecken" 107 "Förkortningar kan inte innehålla mellanslag eller tab" -108 "Förkortningar kan inte blanda "ord"/"icke ord" tecken, utom i slutet" -109 ""%s" är ingen förkortning" +108 "Förkortningar kan inte blanda \"ord\"/\"icke ord\" tecken, utom i slutet" +109 "\"%s\" är ingen förkortning" 110 "Vi kommando misslyckades: omdefinierade tangenter ignorerade" 111 "Inga fler filer att editera" 112 "Inga tidigare filer att editera" 113 "Inga tidigare filer att spela tillbaka" 114 "Ingen fillista att visa" -115 "Inget tidigare kommando att ersätta "!" med" +115 "Inget tidigare kommando att ersätta \"!\" med" 116 "Inget filnamn att ersätta %% med" 117 "Inget filnamn att ersätta # med" 118 "Fel: execl: %s" @@ -114,8 +113,8 @@ 120 "Filen ändrad efter sista skrivning; spara eller använd !" 121 "Kan inte hitta hemkatalog" 122 "Ny nuvarande katalog: %s" -123 "Inga "cut buffers" att visa" -124 "%s kommandot kan inte används som del i ett "global" eller v kommando" +123 "Inga \"cut buffers\" att visa" +124 "%s kommandot kan inte används som del i ett \"global\" eller v kommando" 125 "%s/%s: inte läst: varken du eller root är ägare" 126 "%s/%s: inte läst: du är inte ägare" 127 "%s/%s: inte läst: skrivbar av annan än ägaren" @@ -126,7 +125,7 @@ 132 "Det finns inget i inmatningsmappningen" 133 "Det finns inget i kommandomappningen" 134 "%s tecknet kan inte mappas om" -135 ""%s" är inte ommappat just nu" +135 "\"%s\" är inte ommappat just nu" 136 "Namn på markeringar måste vara ett tecken långa" 137 "%s finns, inget sparat; använd ! för att spara" 138 "Ny exrc fil: %s" @@ -141,13 +140,13 @@ 147 "Läser..." 148 "%s: %lu rader, %lu tecken" 149 "Inga bakgrundsfönster att visa" -150 "Script kommandot finns bara i "vi" läge" +150 "Script kommandot finns bara i \"vi\" läge" 151 "Inget kommando att exekvera" 152 "shiftwidth flaggan satt till 0" 153 "Talet har för stort värde" 154 "Talet har för litet värde" 155 "Reguljärt uttryck är givet; r flaggan är meningslös" -156 "#, l och p flaggorna kan inte kombineras med c flaggan i "vi" läge" +156 "#, l och p flaggorna kan inte kombineras med c flaggan i \"vi\" läge" 157 "Ingen matchande text funnen" 158 "Inget tidigare märke har givits" 159 "Det är färre än %s märken i stacken; använd :display t[ags]" @@ -182,7 +181,7 @@ 189 "Ingen tidigare söksträng" 190 "Sökningen slog runt till ursprungliga positionen" 191 "Förkortning överskred expanderingsgränsen: tecken har tagits bort" -192 "Ogiltigt tecken; använd "quote" för att sätta in" +192 "Ogiltigt tecken; använd \"quote\" för att sätta in" 193 "Redan i början på insättningen" 194 "Inga fler tecken att ta bort" 195 "Försök att gå bortom slutet på filen" @@ -194,10 +193,10 @@ 201 "Buffertar måste anges före kommandot" 202 "Redan i slutet av filen" 203 "Redan på slutet av raden" -204 "%s är inte ett "vi" kommando" +204 "%s är inte ett \"vi\" kommando" 205 "Användning: %s" 206 "Inga tecken att ta bort" -207 "Q kommandot kräver "ex" i terminalläge" +207 "Q kommandot kräver \"ex\" i terminalläge" 208 "Inget kommando att repetera" 209 "Filen är tom" 210 "%s kan inte användas som ett förflyttningskommando" @@ -260,8 +259,8 @@ 269 "Tryck på en tangent för att fortsätta: " 270 "Tryck på en tangent för att fortsätta [: för att ge fler kommandon]: " 271 "Tryck på en tangent för att fortsätta [q för att avsluta]: " -272 "Den formen av %s kräver "ex" i terminalläge" -273 "Går till "ex" inmatningsläge." +272 "Den formen av %s kräver \"ex\" i terminalläge" +273 "Går till \"ex\" inmatningsläge." 274 "Kommandot misslyckades, ingen fil inläst ännu." 275 " forts?" 276 "Oväntad teckenhändelse" @@ -271,7 +270,7 @@ 280 "Oväntad avslutningshändelse" 281 "Oväntad omritningshändelse" 282 "Redan vid sista märket i denna grupp" -283 "%s kommandot kräver "ex" i terminalläge" +283 "%s kommandot kräver \"ex\" i terminalläge" 284 "Den formen av %s är inte tillgänglig när secure edit flaggan är satt" 285 "Oväntad stränghändelse" 286 "Oväntad tidshändelse" @@ -294,9 +293,9 @@ 304 "Skalexpansion misslyckades" 305 "Ingen %s edit flagga given" 306 "Vi har inte länkats med en Perl tolk" -307 "Inga "ex" kommandon att exekvera" +307 "Inga \"ex\" kommandon att exekvera" 308 "Tryck för att exekvera kommando, :q för att avsluta" -309 "Gör "cscope help" för hjälp" +309 "Gör \"cscope help\" för hjälp" 310 "Inga cscope kopplingar körs" 311 "%s: okänd söktyp: använd en av %s" 312 "%d: ingen sådan cscope session" diff --git a/catalog/swedish.check b/catalog/swedish.check deleted file mode 100644 index c70b9bbd4095..000000000000 --- a/catalog/swedish.check +++ /dev/null @@ -1,34 +0,0 @@ -Unused message id's (this is okay): -001 -047 -050 -051 -052 -081 -176 -213 -229 -288 -========================= -MISSING ERROR MESSAGES (Please add!): -========================= -Extra error messages (just delete them): -========================= -MESSAGES WITH THE SAME MESSAGE ID's (FIX!): -========================= -Duplicate messages, both id and message (this is okay): -========================= -Duplicate messages, just message (this is okay): - 2 %s expanderade till för många filnamnX - 2 %s: %lu rader, %lu teckenX - 2 %s: Återskapningsfilen är korruptX - 2 Filen har ändrats efter den sparats; spara eller använd !X - 2 Ingen tidigare söksträngX - 2 Kopierar filen för återskapning...X - 2 Loggning utförs inte, ångra är inte möjligtX - 2 flyttadeX - 2 set: %s flaggan är inte boleanskX - 2 Ändringar kan inte återskapas om programmet krascharX - 3 %s: ta bortX - 4 Användning: %sX -========================= diff --git a/catalog/uk_UA.KOI8-U.base b/catalog/uk_UA.KOI8-U.base new file mode 100644 index 000000000000..b2dfc7f52365 --- /dev/null +++ b/catalog/uk_UA.KOI8-U.base @@ -0,0 +1,306 @@ +002 "ðÅÒÅÐÏ×ÎÅÎÎÑ ÚÎÁÞÅÎÎÑ ÄÏ×ÖÉÎÉ ÒÑÄËÕ" +003 "ÎÅÍÏÖÌÉ×Ï ÓÔÅÒÔÉ ÒÑÄÏË %lu" +004 "ÎÅÍÏÖÌÉ×Ï ÄÏÄÁÔÉ ÄÏ ÒÑÄËÕ %lu" +005 "ÎÅÍÏÖÌÉ×Ï ×ÓÔÁ×ÉÔÉ × ÒÑÄÏË %lu" +006 "ÎÅÍÏÖÌÉ×Ï ÒÏÚͦÓÔÉÔÉ ÒÑÄÏË %lu" +007 "ÎÅÍÏÖÌÉ×Ï Ä¦ÓÔÁÔÉ ÏÓÔÁÎÎ¦Ê ÒÑÄÏË" +008 "ðÏÍÉÌËÁ: ÎÅÍÏÖÌÉ×Ï ÏÔÒÉÍÁÔÉ ÒÑÄÏË %lu" +009 "æÁÊÌ ÚÁÐÉÓ¦×" +010 "úÁÐÉÓÉ ÎÅ ×ÅÌÉÓÑ, ÎÅÍÏÖÌÉ×Ï ×¦ÄͦÎÉÔÉ ÏÓÔÁÎÎÀ ËÏÍÁÎÄÕ" +011 "îÅÍÁ ÞÏÇÏ ×¦ÄͦÎÑÔÉ" +012 "úÁÐÉÓÉ ÎÅ ×ÅÌÉÓÑ, ÎÅÍÏÖÌÉ×Ï ×¦ÄͦÎÉÔÉ ÏÓÔÁÎÎÀ ËÏÍÁÎÄÕ" +013 "úÁÐÉÓÉ ÎÅ ×ÅÌÉÓÑ, ÎÅÍÏÖÌÉ×Ï ÐÒÏÄÉ×ÉÔÉÓÑ ×ÐÅÒÅÄ" +014 "îÅÍÁ ÞÏÇÏ ÐÏ×ÔÏÒÀ×ÁÔÉ" +015 "%s/%d: ÐÏÍÉÌËÁ ÚÁÐÉÓÕ ÐÒÏÔÏËÏÌÕ" +016 "óÔÁÎÄÁÒÔÎÉÍ ××ÅÄÅÎÎÑÍ/×É×ÅÄÅÎÎÑÍ ÄÌÑ vi ÍÁ¤ ÂÕÔÉ ÔÅÒͦÎÁÌ" +017 "í¦ÔËÁ %s: ÎÅ ×ÓÔÁÎÏ×ÌÅÎÏ" +018 "í¦ÔËÁ %s: ÒÑÄÏË ÓÔÅÒÔÏ" +019 "í¦ÔËÁ %s: ÐÏÚÉæ§ ËÕÒÓÏÒÕ Â¦ÌØÛÅ ÎÅ ¦ÓÎÕ¤" +020 "ðÏÍÉÌËÁ: " +021 "îÏ×ÉÊ ÆÁÊÌ" +022 "IÍ'Ñ ÚͦÎÉÌÏÓØ" +023 "ÚͦÎÅÎÉÊ" +024 "ÎÅ ÚͦÎÅÎÉÊ" +025 "òO3âìOëO÷áîO" +026 "Ô¦ÌØËÉ ÄÌÑ ÞÉÔÁÎÎÑ" +027 "ÒÑÄÏË %lu Ú %lu [%ld%%]" +028 "ÐÕÓÔÉÊ ÆÁÊÌ" +029 "ÒÑÄÏË %lu" +030 "æÁÊÌ %s ÎÅ ¤ ÆÁÊÌÏÍ ÐÏצÄÏÍÌÅÎÎØ" +031 "îÅÍÏÖÌÉ×Ï ×ÓÔÁÎÏ×ÉÔÉ ÏÐæÀ %s ÚÁ ÚÍÏ×ÞÁÎÎÑÍ" +032 "÷ÉËÏÒÉÓÔÁÎÎÑ: %s" +033 "ïÐæ§ %s ÎÅÍÁ¤: 'set all' ÐÏËÁÚÕ¤ ×Ó¦ ÍÏÖÌÉצ ÏÐæ§" +034 "set: [no]%s ÎÅ ÎÁÂÕ×Á¤ ÔÁËÏÇÏ ÚÎÁÞÅÎÎÑ" +035 "set: %s ÏÐÃ¦Ñ ÎÅ ¤ ÌÏǦÞÎÏÀ" +036 "set: ÏÐÃ¦Ñ %s: %s" +037 "set: ÏÐÃ¦Ñ %s: %s: ÐÅÒÅÐÏ×ÎÅÎÎÑ" +038 "set: ÎÅÐÒÁ×ÉÌØÎÅ ÚÎÁÞÅÎÎÑ %s" +039 "set: %s ÏÐÃ¦Ñ ÎÅ ¤ ÌÏǦÞÎÏÀ" +040 "ë¦ÌØ˦ÓÔØ ËÏÌÏÎÏË ÎÁ ÜËÒÁΦ ÎÁÄÔÏ ÍÁÌÁ, ÍÅÎÛÅ Î¦Ö %d" +041 "ë¦ÌØ˦ÓÔØ ËÏÌÏÎÏË ÎÁ ÜËÒÁΦ ÎÁÄÔÏ ×ÅÌÉËÁ, ¦ÌØÛÅ Î¦Ö %d" +042 "ë¦ÌØ˦ÓÔØ ÒÑÄË¦× ÎÁ ÜËÒÁΦ ÎÁÄÔÏ ÍÁÌÁ, ÍÅÎÛÅ Î¦Ö %d" +043 "ë¦ÌØ˦ÓÔØ ÒÑÄË¦× ÎÁ ÜËÒÁΦ ÎÁÄÔÏ ×ÅÌÉËÁ, ¦ÌØÛÅ Î¦Ö %d" +044 "ïÐÃ¦Ñ lisp צÄÓÕÔÎÑ" +045 "ðÏצÄÏÍÌÅÎÎÑ ÎÅ ×ÉÍËÎÅΦ: %s" +046 "ðÏצÄÏÍÌÅÎÎÑ ÎÅ ×צÍËÎÅΦ: %s" +047 "ïÐÃ¦Ñ %s ÐÏ×ÉÎÎÁ ͦÓÔÉÔÉ ÇÒÕÐÉ Ú Ä×ÏÈ ÓÉÍ×Ï̦×" +053 "óÔÁÒÔÏ×ÉÊ ÂÕÆÅÒ ÐÏÒÏÖΦÊ" +054 "âÕÆÅÒ %s ÐÏÒÏÖΦÊ" +055 "îÅÍÏÖÌÉ×Ï ×¦ÄÎÏ×ÉÔÉ ÆÁÊÌ, ÝÏ Í¦ÓÔÉÔØ × ¦ÍÅΦ ÓÉÍ×ÏÌÉ ÐÅÒÅ×ÅÄÅÎÎÑ ËÁÒÅÔËÉ" +056 "úͦÎÉ ÎÅ ÍÏÖÎÁ ÂÕÄŠצÄÎÏ×ÉÔÉ Ð¦ÓÌÑ ËÒÁÈÕ ÓÅÓ¦§" +057 "ëÏЦÀ×ÁÎÎÑ ÆÁÊÌÕ ÄÌÑ ×¦ÄÎÏ×ÌÅÎÎÑ..." +058 "úÂÅÒÅÖÅÎÎÑ ÎÅ ×ÄÁÌÏÓØ: %s" +059 "úͦÎÉ ÎÅ ÍÏÖÎÁ ÂÕÄŠצÄÎÏ×ÉÔÉ Ð¦ÓÌÑ ËÒÁÈÕ ÓÅÓ¦§" +060 "úÂÅÒÅÖÅÎÎÑ ËÏЦ§ ÆÁÊÌÕ ÎÅ ×ÄÁÌÏÓØ: %s" +061 "ëÏЦÀ×ÁÎÎÑ ÆÁÊÌÕ ÄÌÑ ×¦ÄÎÏ×ÌÅÎÎÑ..." +062 "IÎÆÏÒÍÁæÀ ÐÒÏ ËÏÒÉÓÔÕ×ÁÞÁ %u ÎÅ ÚÎÁÊÄÅÎÏ" +063 "úÁÂÌÏËÕ×ÁÔÉ ×¦ÄÎÏ×ÌÅÎÎÉÊ ÆÁÊÌ ÎÅÍÏÖÌÉ×Ï" +064 "âÕÆÅÒ ×¦ÄÎÏ×ÌÅÎÏÇÏ ÆÁÊÌÕ ÐÅÒÅÐÏ×ÎÅÎÏ" +065 "÷¦ÄÎÏ×ÌÅÎÎÉÊ ÆÁÊÌ" +066 "%s: ÆÁÊÌ ×¦ÄÎÏ×ÌÅÎÎÉÊ ÎÅ ÄÏ Ë¦ÎÃÑ" +067 "%s: ÆÁÊÌ ×¦ÄÎÏ×ÌÅÎÎÉÊ ÎÅ ÄÏ Ë¦ÎÃÑ" +068 "îÅ ¦ÓÎÕÀ¤ ÆÁÊÌ¦× Ú ¦ÍÅÎÅÍ %s, Ñ˦ ÷É ÍÏÖÅÔÅ ÐÒÏÞÉÔÁÔÉ" +069 "IÓÎÕÀÔØ ÓÔÁÒ¦ ×ÅÒÓ¦§ ÆÁÊÌÕ, Ñ˦ ÍÏÖÎÁ צÄÎÏ×ÉÔÉ" +070 "IÓÎÕÀÔØ ¦ÎÛ¦ ÆÁÊÌÉ, Ñ˦ ÍÏÖÎÁ צÄÎÏ×ÉÔÉ" +071 "e-mail ΊצĦÓÌÁÎÏ: %s" +072 "æÁÊÌ ÐÕÓÔÉÊ - ÎÅÍÁ ÞÏÇÏ ÛÕËÁÔÉ" +073 "äÏÓÑÎÕÔÏ Ë¦ÎÃÑ ÆÁÊÌÕ ÂÅÚ ÚÎÁÈÏÖÄÅÎÎÑ ÚÒÁÚËÕ ÐÏÛÕËÕ" +074 "îÅ ÚÁÄÁÎÏ ÚÒÁÚÏË ÐÏÛÕËÕ" +075 "úÒÁÚÏË ÐÏÛÕËÕ ÎÅ ÚÎÁÊÄÅÎÏ" +076 "äÏÓÑÎÕÔÏ ÐÏÞÁÔËÕ ÆÁÊÌÕ ÂÅÚ ÚÎÁÈÏÖÄÅÎÎÑ ÚÒÁÚËÕ ÐÏÛÕËÕ" +077 "ðÏÛÕË ÚÁÃÉËÌÅÎÏ" +078 "ðÏÛÕË..." +079 "îÅÐÅÞÁÔÎÉÈ ÓÉÍ×ÏÌ¦× ÎÅ ÚÎÁÊÄÅÎÏ" +080 "îÅצÄÏÍÁ ËÏÍÁÎÄÁ" +082 "%s: ËÏÍÁÎÄÁ ÎÅ ÄÏÓÔÕÐÎÁ × ÒÅÖÉͦ ex" +083 "ì¦ÞÉÌØÎÉË ÎÅ ÍÏÖÅ ÂÕÔÉ ÎÕÌÅÍ" +084 "%s: ÎÅÐÒÁ×ÉÌØÎÅ ×ÉÚÎÁÞÅÎÎÑ ÒÑÄËÕ" +085 "÷ÎÕÔÒ¦ÛÎÑ ÐÏÍÉÌËÁ × ÓÉÎÔÁËÓÉÓ¦ (%s: %s)" +086 "÷ÉËÏÒÉÓÔÁÎÎÑ: %s" +087 "%s: ÔÉÍÞÁÓÏ×ÉÊ ÂÕÆÅÒ ÎÅ ×ÉËÏÒÉÓÔÁÎÏ" +088 "í¦ÔËÕ ÐÏÓÔÁ×ÌÅÎÏ ÐÅÒÅÄ ÐÅÒÛÉÍ ÒÑÄËÏÍ" +089 "í¦ÔËÕ ÐÏÓÔÁ×ÌÅÎÏ Ð¦ÓÌÑ Ë¦ÎÃÑ ÆÁÊÌÕ" +090 "@ Ú Ä¦ÁÐÁÚÏÎÏÍ ÐÒÁÃÀ¤ ËÏÌÉ ÚͦÎÅÎÏ ÆÁÊÌ/צËÎÏ" +091 "ëÏÍÁÎÄÁ Global/v ÐÒÁÃÀ¤ ËÏÌÉ ÚͦÎÅÎÏ ÆÁÊÌ/צËÎÏ" +092 "ëÏÍÁÎÄÁ ex ÎÅ ×ÄÁÌÁÓØ: ÎÁÓÔÕÐΦ ËÏÍÁÎÄÉ Ú'¦ÇÎÏÒÏ×ÁÎÏ" +093 "ëÏÍÁÎÄÁ ex ÎÅ ×ÄÁÌÁÓØ: צÄÏÂÒÁÖÅΦ ËÌÁצۦ Ú'¦ÇÎÏÒÏ×ÁÎÏ" +094 "äÒÕÇÁ ÁÄÒÅÓÁ ÍÅÎÛÅ Î¦Ö ÐÅÒÛÁ" +095 "îÅ ×ËÁÚÁÎÏ ¦Í'Ñ Í¦ÔËÉ" +096 "\\ ÎÅ ÚÁ˦ÎÞÕ¤ÔØÓÑ / ÞÉ ?" +097 "ðÏÓÉÌÁÎÎÑ ÎÁ ÒÑÄÏË Ú ÎÏÍÅÒÏÍ, ÍÅÎÛÉÍ Î¦Ö 0" +098 "ëÏÍÁÎÄÁ %s ÎÅצÄÏÍÁ" +099 "ðÅÒÅÐÏ×ÎÅÎÎÑ Ì¦ÞÉÌØÎÉËÁ ÁÄÒÅÓ" +100 "îÅÄÏÂ¦Ò Ì¦ÞÉÌØÎÉËÁ ÁÄÒÅÓ" +101 "îÅÄÏÐÕÓÔÉÍÁ ËÏͦÎÁÃ¦Ñ × ÁÄÒÅÓ¦" +102 "îÅÐÒÁ×ÉÌØÎÁ ÁÄÒÅÓÁ: ×ÓØÏÇÏ %lu ÒÑÄË¦× Õ ÆÁÊ̦" +103 "îÅÐÒÁ×ÉÌØÎÁ ÁÄÒÅÓÁ: ÆÁÊÌ ÐÕÓÔÉÊ" +104 "ëÏÍÁÎÄÁ %s ÎÅ ÍÏÖÅ ×ÉËÏÒÉÓÔÏ×Õ×ÁÔÉ ÁÄÒÅÓÕ 0" +105 "îÅÍÁ¤ ÁÂÒÅצÁÔÕÒ" +106 "áÂÒÅצÁÔÕÒÉ ÐÏ×ÉÎΦ ÚÁ˦ÎÞÕ×ÁÔÉÓÑ ÓÉÍ×ÏÌÏÍ \"Ó̦×\"" +107 "÷ ÁÂÒÅצÁÔÕÒ¦ ÎÅ ÍÏÖÎÁ ×ÉËÏÒÉÓÔÏ×Õ×ÁÔÉ ÓÉÍ×ÏÌÉ ÔÁÂÕÌÑæ§ ÔÁ ÐÒϦÌÉ" +108 "áÂÒÅצÁÔÕÒÉ ÎÅ ÍÏÖÕÔØ ÚͦÛÕ×ÁÔÉ ÓÉÍ×ÏÌÉ Ó̦×/ÎÅ-Ó̦×, ȦÂÁ ÝÏ × Ë¦Îæ ÒÑÄËÕ" +109 "\"%s\" ÎÅ ÁÂÒÅצÁÔÕÒÁ" +110 "ëÏÍÁÎÄÁ Vi ÎÅ ×ÄÁÌÁÓØ: צÄÏÂÒÁÖÅΦ ËÌÁצۦ Ú'¦ÇÎÏÒÏ×ÁÎÏ" +111 "æÁÊÌ¦× ÄÌÑ ÒÅÄÁÇÕ×ÁÎÎÑ Â¦ÌØÛÅ ÎÅÍÁ¤" +112 "ðÏÐÅÒÅÄÎØÏÇÏ ÆÁÊÌÕ ÄÌÑ ÒÅÄÁÇÕ×ÁÎÎÑ ÎÅÍÁ¤" +113 "ðÏÐÅÒÅÄÎØÏÇÏ ÆÁÊÌÕ ÄÌÑ ÐÅÒÅÇÌÑÄÕ ÎÅÍÁ¤" +114 "îÅÍÁ¤ ÆÁÊ̦×" +115 "îÅÍÁ¤ ÐÏÐÅÒÅÄÎØϧ ËÏÍÁÎÄÉ ÄÌÑ ÚÁͦÎÉ \"!\"" +116 "÷¦ÄÓÕÔΤ ¦Í'Ñ ÆÁÊÌÕ ÄÌÑ Ð¦ÄͦÎÉ %%" +117 "÷¦ÄÓÕÔΤ ¦Í'Ñ ÆÁÊÌÕ ÄÌÑ Ð¦ÄͦÎÉ #" +118 "ðÏÍÉÌËÁ: execl: %s" +119 "ðÏÍÉÌËÁ ××ÅÄÅÎÎÑ/×É×ÅÄÅÎÎÑ: %s" +120 "æÁÊÌ ÍÏÄÉƦËÏ×ÁÎÏ Ð¦ÓÌÑ ÏÓÔÁÎÎØϧ ËÏÍÁÎÄÉ ÐÏ×ÎÏÇÏ ÚÁÐÉÓÕ: ÚÂÅÒÅÖ¦ÔØ ÞÉ ×ÉËÏÒÉÓÔÁÊÔÅ ! ÄÌÑ ÏÂÈÏÄÕ" +121 "îÅÍÏÖÌÉ×Ï ÚÎÁÊÔÉ ÄÏÍÁÛÎ¦Ê ËÁÔÁÌÏÇ" +122 "îÏ×ÉÊ ËÁÔÁÌÏÇ: %s" +123 "îÅÍÁ¤ ÎÁÐÏ×ÎÅÎÉÈ ÂÕÆÅÒ¦×" +124 "ëÏÍÁÎÄÁ %s ÎÅ ×ÉËÏÒÉÓÔÏ×Õ¤ÔØÓÑ ÑË ÞÁÓÔÉÎÁ ËÏÍÁÎÄÉ global ÞÉ v" +125 "%s/%s: ΊצÄËÒÉÔÏ: ÎÅ ÎÁÌÅÖÉÔØ ÷ÁÍ ÞÉ ÁÄͦΦÓÔÒÁÔÏÒÕ" +126 "%s/%s: ΊצÄËÒÉÔÏ: ÎÅ ÎÁÌÅÖÉÔØ ÷ÁÍ" +127 "%s/%s: ΊצÄËÒÉÔÏ: ÍÏÖÌÉצÓÔØ ÚÁÐÉÓÕ ËÏÒÉÓÔÕ×ÁÞÅÍ, ÑËÉÊ ÎÅ ¤ ×ÌÁÓÎÉËÏÍ" +128 "%s: ΊצÄËÒÉÔÏ: ÎÅ ÎÁÌÅÖÉÔØ ÷ÁÍ ÞÉ ÁÄͦΦÓÔÒÁÔÏÒÕ" +129 "%s: ΊצÄËÒÉÔÏ: ÎÅ ÎÁÌÅÖÉÔØ ÷ÁÍ" +130 "%s: ΊצÄËÒÉÔÏ: ÍÏÖÌÉצÓÔØ ÚÁÐÉÓÕ ËÏÒÉÓÔÕ×ÁÞÅÍ, ÑËÉÊ ÎÅ ¤ ×ÌÁÓÎÉËÏÍ" +131 "îÅÍÁ¤ ¦ÌØÛÅ ÒÑÄË¦× ÄÌÑ ÏÂ'¤ÄÎÁÎÎÑ" +132 "îÅÍÁ¤ ÐÁÒÁÍÅÔÒ¦× ××ÅÄÅÎÎÑ" +133 "îÅÍÁ¤ ÐÁÒÁÍÅÔÒ¦× ËÏÍÁÎÄÉ" +134 "óÉÍ×ÏÌ %s ÎÅ ÍÏÖÎÁ ÐÅÒÅÎÁÚÎÁÞÉÔÉ" +135 "\"%s\" ÚÁÒÁÚ ÎÅ ÐÅÒÅÎÁÚÎÁÞÅÎÏ" +136 "IÍ'Ñ Í¦ÔËÉ -- ÏÄÉÎ ÓÉÍ×ÏÌ" +137 "%s ¦ÓÎÕ¤, ÎÅ ÚÁÐÉÓÁÎÏ; ×ÉËÏÒÉÓÔÁÊÔÅ ! ÄÌÑ ÏÂÈÏÄÕ" +138 "îÏ×ÉÊ ÆÁÊÌ exrÓ: %s" +139 "òÑÄÏË ÐÒÉÚÎÁÞÅÎÎÑ ÚÁÚÎÁÞÅÎÏ ×ÓÅÒÅÄÉΦ ĦÁÐÁÚÏÎÕ ÐÅÒÅͦÝÅÎÎÑ" +140 "ëÏÍÁÎÄÁ open ×ÉÍÁÇÁ¤ ×ÓÔÁÎÏ×ÌÅÎÎÑ ÏÐæ§ open" +141 "ëÏÍÁÎÄÕ open ÝÅ ÎÅ ÒÅÁ̦ÚÏ×ÁÎÏ" +142 "úÁÈÉÓÔ ÆÁÊÌÕ ÎÅÍÏÖÌÉ×ÉÊ" +143 "æÁÊÌ ÚÁÈÉÝÅÎÏ" +144 "%s ÒÏÚÛÉÒÉ×ÓÑ × ÎÁÄÔÏ ×ÅÌÉËÕ Ë¦ÌØ˦ÓÔØ ¦ÍÅÎ ÆÁÊ̦×" +145 "ðÒÏÞÉÔÁÔÉ ÍÏÖÎÁ Ô¦ÌØËÉ ÐÒÏÓÔÉÊ ÆÁÊÌ ÞÉ ¦ÍÅÎÏ×ÁÎÉÊ ËÁÎÁÌ(pipe)" +146 "%s: ÂÌÏËÕ×ÁÎÎÑ ×¦Ä ÞÉÔÁÎÎÑ ÎÅÍÏÖÌÉ×Å" +147 "úÞÉÔÕÀ..." +148 "%s: %lu ÒÑÄ˦×, %lu ÓÉÍ×Ï̦×" +149 "îÅÍÁ¤ Ô¦ÎØÏ×ÉÈ ×¦ËÏÎ" +150 "ëÏÍÁÎÄÁ script ÄÏÓÔÕÐÎÁ ÌÉÛÅ × ÒÅÖÉͦ vi" +151 "îÅÍÁ ËÏÍÁÎÄÉ ÄÌÑ ×ÉËÏÎÁÎÎÑ" +152 "ïÐæÀ shiftwidth ×ÓÔÁÎÏ×ÌÅÎÏ × 0" +153 "ðÅÒÅÐÏ×ÎÅÎÎÑ Ì¦ÞÉÌØÎÉËÁ" +154 "ãÉËÌ ×ÉËÏÎÁÎÏ ÎÅ ÄÏ Ë¦ÎÃÑ" +155 "÷ËÁÚÁÎÏ ÒÅÇÕÌÑÒÎÉÊ ×ÉÒÁÚ; ÐÁÒÁÍÅÔÒ 'r' ÎÅ ÍÁ¤ ÓÅÎÓÕ" +156 "ðÁÒÁÍÅÔÒÉ #, l ÔÁ p ÎÅ ÍÏÖÎÁ ËÏͦÎÕ×ÁÔÉ Ú ÐÁÒÁÍÅÔÒÏÍ 'c' × ÒÅÖÉͦ vi" +157 "óЦ×ÐÁÄÁÎØ ÎÅÍÁ¤" +158 "TÅÇ ×¦ÄÓÕÔΦÊ" +159 "íÅÎÛÅ Î¦Ö %s ÚÁÐÉÓ¦× Õ ÓÔÅËÕ ÔÅǦ×; ×ÉËÏÒÉÓÔÁÊÔÅ :display t[ags]" +160 "îÅÍÁ¤ ÆÁÊÌÕ %s × ÓÔÅËÕ ÔÅÇ¦× ÄÌÑ ÐÏ×ÅÒÎÅÎÎÑ; ×ÉËÏÒÉÓÔÁÊÔÅ :display t[ags]" +161 "îÁÔÉÓΦÔØ ENTER ÄÌÑ ÐÒÏÄÏ×ÖÅÎÎÑ: " +162 "%s: ÔÅÇ ÎÅ ÚÎÁÊÄÅÎÏ" +163 "%s: Ú¦ÐÓÏ×ÁÎÉÊ ÔÅÇ × %s" +164 "%s: ÎÏÍÅÒ ÒÑÄËÕ ÔÅÇÁ ÚÎÁÈÏÄÉÔØÓÑ ÚÁ ˦ÎÃÅÍ ÆÁÊÌÕ" +165 "óÔÅË ÔÅÇ¦× ÐÏÒÏÖΦÊ" +166 "%s: ÚÒÁÚÏË ÐÏÛÕËÕ ÎÅ ÚÎÁÊÄÅÎÏ" +167 "úÁÌÉÛÉÌÏÓØ %d ÆÁÊÌ¦× ÄÌÑ ÒÅÄÁÇÕ×ÁÎÎÑ" +168 "âÕÆÅÒ %s ÐÏÒÏÖΦÊ" +169 "úͦÎÉÔÉ? [n]" +170 "ðÅÒÅÒ×ÁÎÏ" +171 "îÅÍÁ¤ ÂÕÆÅÒÕ ÄÌÑ ×ÉËÏÒÉÓÔÁÎÎÑ" +172 "îÅÍÁ¤ ÐÏÐÅÒÅÄÎØÏÇÏ ÒÅÇÕÌÑÒÎÏÇÏ ×ÉÒÁÚÕ" +173 "ëÏÍÁÎÄÁ %s ×ÉÍÁÇÁ¤ ×ÖÅ ÐÒÏÞÉÔÁÎÉÊ ÆÁÊÌ" +174 "÷ÉËÏÒÉÓÔÁÎÎÑ: %s" +175 "ëÏÍÁÎÄÁ visual ×ÉÍÁÇÁ¤ ×ÓÔÁÎÏ×ÌÅÎÎÑ ÏÐæ§ open" +177 "ðÕÓÔÉÊ ÆÁÊÌ" +178 "îÅÍÁ¤ ÐÏÐÅÒÅÄÎØÏÇÏ ÐÏÛÕËÕ F, f, T, ÞÉ t" +179 "%s ÎÅ ÚÎÁÊÄÅÎÏ" +180 "îÅÍÁ¤ ÐÏÐÅÒÅÄÎØÏÇÏ ÆÁÊÌÕ ÄÌÑ ÒÅÄÁÇÕ×ÁÎÎÑ" +181 "ëÕÒÓÏÒ ÓÔϧÔØ ÎÅ ÎÁ ÃÉÆÒ¦" +182 "OÔÒÉÍÁÎÅ ÞÉÓÌÏ ÎÁÄÔÏ ×ÅÌÉËÅ" +183 "OÔÒÉÍÁÎÅ ÞÉÓÌÏ ÎÁÄÔÏ ÍÁÌÅ" +184 "îÅÍÁ¤ צÄÐÏצÄÎÏÇÏ ÓÉÍ×ÏÌÕ × ÃØÏÍÕ ÒÑÄËÕ" +185 "÷¦ÄÐÏצÄÎÉÊ ÓÉÍ×ÏÌ ÎÅ ÚÎÁÊÄÅÎÏ" +186 "îÅÍÁ¤ ÓÉÍ×ÏÌ¦× ÄÌÑ ÚÁͦÎÉ" +187 "îÅÍÁ¤ ¦ÎÛÏÇÏ ×¦ËÎÁ" +188 "óÉÍ×ÏÌÉ Ð¦ÓÌÑ ÒÑÄËÕ ÄÌÑ ÐÏÛÕËÕ, ÚͦÝÅÎÎÑ ÒÑÄËÕ ÔÁ/ÞÉ ËÏÍÁÎÄÉ z" +189 "îÅÍÁ¤ ÐÏÐÅÒÅÄÎØÏÇÏ ÚÒÁÚËÕ ÐÏÛÕËÕ" +190 "ðÏÛÕË ÚÁ˦ÎÞÉ×ÓÑ ÎÁ ÐÏÞÁÔËÏ×¦Ê ÐÏÚÉæ§" +191 "áÂÒÅצÁÔÕÒÁ ÐÅÒÅ×ÉÝÉÌÁ Ì¦Í¦Ô ÒÏÚÛÉÒÅÎÎÑ: ÓÉÍ×ÏÌÉ Ú'¦ÇÎÏÒÏ×ÁÎÏ" +192 "îÅÄÏÚ×ÏÌÅÎÉÊ ÓÉÍ×ÏÌ: ÚÁÄÁÊÔÅ × ÄÕÖËÁÈ" +193 "÷ÖÅ ÎÁ ÐÏÞÁÔËÕ ×ÓÔÁ×ËÉ" +194 "îÅÍÁ¤ ÓÉÍ×ÏÌ¦× ÄÌÑ ×ÉÄÁÌÅÎÎÑ" +195 "òÕÈ ÚÁ ˦ÎÅÃØ ÆÁÊÌÕ" +196 "òÕÈ ÚÁ ˦ÎÅÃØ ÒÑÄËÕ" +197 "ëÕÒÓÏÒ ÎÅ ÐÅÒÅͦÝÕ×Á×ÓÑ" +198 "÷ÖÅ ÎÁ ÐÏÞÁÔËÕ ÆÁÊÌÕ" +199 "òÕÈ ËÕÒÓÏÒÕ ÚÁ ÐÏÞÁÔÏË ÆÁÊÌÕ" +200 "÷ÖÅ × ÐÅÒÛ¦Ê ËÏÌÏÎæ" +201 "âÕÆÅÒ ÔÒÅÂÁ ×ËÁÚÕ×ÁÔÉ ÐÅÒÅÄ ËÏÍÁÎÄÏÀ" +202 "÷ÖÅ ÎÁ ˦Îæ ÆÁÊÌÕ" +203 "÷ÖÅ ÎÁ ˦Îæ ÒÑÄËÕ" +204 "%s ÎÅ ËÏÍÁÎÄÁ Vi" +205 "÷ÉËÏÒÉÓÔÁÎÎÑ: %s" +206 "îÅÍÁ¤ ÓÉÍ×ÏÌ¦× ÄÌÑ ×ÉÄÁÌÅÎÎÑ" +207 "ëÏÍÁÎÄÁ Q ×ÉÍÁÇÁ¤ ¦ÎÔÅÒÆÅÊÓÕ ex" +208 "îÅÍÁ¤ ËÏÍÁÎÄÉ ÄÌÑ ÐÏ×ÔÏÒÅÎÎÑ" +209 "æÁÊÌ ÐÕÓÔÉÊ" +210 "ëÏÍÁÎÄÕ %s ÎÅ ÍÏÖÎÁ ×ÉËÏÒÉÓÔÁÔÉ ÄÌÑ ÐÅÒÅͦÝÅÎÎÑ" +211 "÷ÖÅ × ËÏÍÁÎÄÎÏÍÕ ÒÅÖÉͦ" +212 "ëÕÒÓÏÒ ÓÔϧÔØ ÎÅ ÎÁ ÓÌÏצ" +214 "úÎÁÞÎÅÎÎÑ ÏÐæ§ Windows ÎÁÄÔÏ ×ÅÌÉËÅ, ÍÁËÓÉÍÕÍ = %u" +215 "äÏÐÉÓÁÔÉ" +216 "úͦÎÉÔÉ" +217 "ëÏÍÁÎÄÁ" +218 "÷ÓÔÁ×ÉÔÉ" +219 "úÁͦÎÉÔÉ" +220 "òÕÈ ËÕÒÓÏÒÕ ÚÁ ˦ÎÅÃØ ÜËÒÁÎÕ" +221 "òÕÈ ËÕÒÓÏÒÕ ÚÁ ÐÏÞÁÔÏË ÜËÒÁÎÕ" +222 "äÌÑ ÒÏÚÂÉÔÔÑ ×¦ËÎÏ ÍÁ¤ ͦÓÔÉÔÉ Â¦ÌØÛÅ Î¦Ö %d ÒÑÄ˦×" +223 "ô¦ÎØÏ×ÉÈ ×¦ËÏÎ ÎÅÍÁ¤" +224 "îÅÍÁ¤ Ô¦ÎØÏ×ÏÇÏ ×¦ËÎÁ Ú ÒÅÄÁÇÕ×ÁÎÎÑÍ ÆÁÊÌÕ %s" +225 "îÅ ÍÏÖÎÁ ÚÒÏÂÉÔÉ Ô¦ÎØÏ×ÉÍ ¤ÄÉΊצËÎÏ" +226 "÷¦ËÎÏ ÍÏÖÎÁ ÓÔÉÓÎÕÔÉ ÌÉÛÅ ÄÏ %d ÒÑÄ˦×" +227 "÷¦ËÎÏ ÎÅ ÍÏÖÎÁ ÓÔÉÓÎÕÔÉ" +228 "÷¦ËÎÏ ÎÅ ÍÏÖÎÁ ÒÏÚÛÉÒÉÔÉ" +230 "ãŠצËÎÏ ÎÅ ÍÏÖÎÁ ÐÒÉÚÕÐÉÎÉÔÉ" +231 "ðÅÒÅÒ×ÁÎÏ: צÄÏÂÒÁÖÅΦ ËÌÁצۦ Ú'¦ÇÎÏÒÏ×ÁÎÏ" +232 "vi: ÔÉÍÞÁÓÏ×ÉÊ ÂÕÆÕÒ ÎÅ ×ÉצÌØÎÅÎÏ" +233 "ãÅÊ ÔÉÐ ÔÅÒͦÎÁÌÕ ÎÅÍÁ¤ ËÌÁצۦ %s" +234 "íÏÖÎÁ ×ËÁÚÁÔÉ ÌÉÛÅ ÏÄÉÎ ÂÕÆÅÒ" +235 "þÉÓÌÏ Â¦ÌØÛÅ, Î¦Ö %lu" +236 "ðÅÒÅÒ×ÁÎÏ" +237 "îÅÍÏÖÌÕ ÓÔ×ÏÒÉÔÉ ÔÉÍÞÁÓÏ×ÉÊ ÆÁÊÌ" +238 "õ÷áçá: %s ÓÐÅæÁÌØÎÉÊ ÆÁÊÌ" +239 "%s ×ÖÅ ÚÁÂÌÏËÏ×ÁÎÏ, ÄÏÓÔÕÐÎÉÊ Ô¦ÌØËÉ ÄÌÑ ÞÉÔÁÎÎÑ" +240 "%s: ÓÔÅÒÔÏ" +241 "%s: ÚÁËÒÉÔÏ" +242 "%s: ÓÔÅÒÔÏ" +243 "%s: ÓÔÅÒÔÏ" +244 "æÁÊÌ Ô¦ÌØËÉ ÄÌÑ ÞÉÔÁÎÎÑ, ÎÅ ÚÁÐÉÓÁÎÏ: ÷ÉËÏÒÉÓÔÁÊÔÅ ! ÄÌÑ ÏÂÈÏÄÕ" +245 "æÁÊÌ Ô¦ÌØËÉ ÄÌÑ ÞÉÔÁÎÎÑ, ÎÅ ÚÁÐÉÓÁÎÏ" +246 "%s ¦ÓÎÕ¤, ÎÅ ÚÁÐÉÓÁÎÏ; ×ÉËÏÒÉÓÔÁÊÔÅ ! ÄÌÑ ÏÂÈÏÄÕ" +247 "%s ¦ÓÎÕ¤, ÎÅ ÚÁÐÉÓÁÎÏ" +248 "÷ÉËÏÒÉÓÔÁÊÔÅ ! ÄÌÑ ÞÁÓÔËÏ×ÏÇÏ ÚÁÐÉÓÕ ÆÁÊÌÕ" +249 "þÁÓÔÉÎÁ ÆÁÊÌÕ, ÆÁÊÌ ÎÅ ÚÁÐÉÓÁÎÏ" +250 "%s: æÁÊÌ ÚͦÎÀ×Á×ÓÑ Ð¦ÚΦÛÅ, Î¦Ö ÃÑ ËÏЦÑ: ×ÉËÏÒÉÓÔÁÊÔÅ ! ÄÌÑ ÏÂÈÏÄÕ" +251 "%s: æÁÊÌ ÚͦÎÀ×Á×ÓÑ Ð¦ÚΦÛÅ, Î¦Ö ÃÑ ËÏЦÑ" +252 "%s: ÚÁÈÉÓÔ ×¦Ä ÚÁÐÉÓÕ ÎÅÄÏÓÔÕÐÎÉÊ" +253 "úÁÐÉÓ..." +254 "%s: õ÷áçá: ÆÁÊÌ ÏÂÒ¦ÚÁÎÏ" +255 "÷ÖÅ ÎÁ ÐÅÒÛÏÍÕ ÔÅÇÕ × Ã¦Ê ÇÒÕЦ" +256 "%s: ÎÏ×ÉÊ ÆÁÊÌ: %lu ÒÑÄ˦×, %lu ÓÉÍ×Ï̦×" +257 "%s: %lu ÒÑÄ˦×, %lu ÓÉÍ×Ï̦×" +258 "%s ÒÏÚÛÉÒÉ×ÓÑ × ÎÁÄÔÏ ×ÅÌÉËÕ Ë¦ÌØ˦ÓÔØ ¦ÍÅÎ ÆÁÊ̦×" +259 "%s: ÓÐÅæÁÌØÎÉÊ ÆÁÊÌ" +260 "%s: ÎÅ ÎÁÌÅÖÉÔØ ÷ÁÍ" +261 "%s: ÄÏÓÔÕÐÎÉÊ ÎÅ ÌÉÛÅ ÷ÁÍ +262 "æÁÊÌ ÍÏÄÉƦËÏ×ÁÎÏ Ð¦ÓÌÑ ÏÓÔÁÎÎØϧ ËÏÍÁÎÄÉ ÚÁÐÉÓÕ: ÚÂÅÒÅÖ¦ÔØ ÞÉ ×ÉËÏÒÉÓÔÁÊÔÅ ! ÄÌÑ ÏÂÈÏÄÕ" +263 "æÁÊÌ ÍÏÄÉƦËÏ×ÁÎÏ Ð¦ÓÌÑ ÏÓÔÁÎÎØϧ ËÏÍÁÎÄÉ ÚÁÐÉÓÕ: ÚÂÅÒÅÖ¦ÔØ ÞÉ ×ÉËÏÒÉÓÔÁÊÔÅ :edit ÄÌÑ ÏÂÈÏÄÕ" +264 "æÁÊÌ ÍÏÄÉƦËÏ×ÁÎÏ Ð¦ÓÌÑ ÏÓÔÁÎÎØϧ ËÏÍÁÎÄÉ ÚÁÐÉÓÕ: ÚÂÅÒÅÖ¦ÔØ ÞÉ ×ÉËÏÒÉÓÔÁÊÔÅ ! ÄÌÑ ÏÂÈÏÄÕ" +265 "ôÉÍÞÁÓÏ×ÉÊ ÆÁÊÌ: ×ÉÈ¦Ä Ú¦ÔÒÅ ÚͦÎÉ" +266 "æÁÊÌ Ô¦ÌØËÉ ÄÌÑ ÞÉÔÁÎÎÑ, ÚͦÎÉ ÎÅ ÚÁÐÉÛÕÔØÓÑ Á×ÔÏÍÁÔÉÞÎÏ" +267 "úÁÐÉÓÉ ÐÏÞÁÔ¦ ÚÁÎÏ×Ï" +268 "ð¦ÄÔ×ÅÒÄÖÕ¤ÔÅ? [ynq]" +269 "îÁÔÉÓΦÔØ ENTER ÄÌÑ ÐÒÏÄÏ×ÖÅÎÎÑ: " +270 "îÁÔÉÓΦÔØ ENTER ÄÌÑ ÐÒÏÄÏ×ÖÅÎÎÑ [: ÄÌÑ ¦ÎÛÉÈ ËÏÍÁÎÄ] " +271 "îÁÔÉÓΦÔØ ENTER ÄÌÑ ÐÒÏÄÏ×ÖÅÎÎÑ [q ÄÌÑ ×ÉÈÏÄÕ]: " +272 "TÁËÁ ÆÏÒÍÁ %s ×ÉÍÁÇÁ¤ ¦ÎÔÅÒÆÅÊÓÕ ex" +273 "÷ÈÏÄÉÍ × ÒÅÖÉÍ ××ÅÄÅÎÎÑ ex" +274 "úÂ¦Ê ËÏÍÁÎÄÉ, ÆÁÊÌ ÎÅ ÐÒÏÞÉÔÁÎÏ" +275 "ðÒÏÄÏ×ÖÉÔÉ?" +276 "îÅÏÞ¦ËÕ×ÁÎÁ ÓÉÍ×ÏÌØÎÁ ÐÏĦÑ" +277 "îÅÏÞ¦ËÕ×ÁÎÁ ÐÏÄ¦Ñ Ë¦ÎÃÑ ÆÁÊÌÕ" +278 "îÅÍÁ¤ ÓЦ×ÐÁÄÁÎØ ÚÁ ÚÁÐÉÔÏÍ" +279 "îÅÏÞ¦ËÕ×ÁÎÁ ÐÏÄ¦Ñ ÐÅÒÅÒÉ×ÁÎÎÑ" +280 "îÅÏÞ¦ËÕ×ÁÎÁ ÐÏÄ¦Ñ ×ÉÈÏÄÕ" +281 "îÅÏÞ¦ËÕ×ÁÎÁ ÐÏÄ¦Ñ ÐÅÒÅÒÉÓÏ×ËÉ" +282 "÷ÖÅ ÎÁ ÏÓÔÁÎÎØÍÕ ôÅÇÕ × Ã¦Ê ÇÒÕЦ" +283 "ëÏÍÁÎÄÁ %s ×ÉÍÁÇÁ¤ ¦ÎÔÅÒÆÅÊÓÕ ex" +284 "TÁËÁ ÆÏÒÍÁ %s ÎÅ ÄÏÚ×ÏÌѤÔØÓÑ ÐÒÉ ×ÓÔÁÎÏ×ÌÅÎ¦Ê ÏÐæ§ secure edit" +285 "îÅÏÞ¦ËÕ×ÁÎÁ ÐÏÄ¦Ñ ÒÑÄËÕ" +286 "îÅÏÞ¦ËÕ×ÁÎÁ ÐÏÄ¦Ñ ÔÁÊÍ-ÁÕÔÕ" +287 "îÅÏÞ¦ËÕ×ÁÎÁ ÐÏÄ¦Ñ ÚÁÐÉÓÕ" +289 "Shell'¦×ÓËÅ ÄÏÐÏ×ÎÅÎÎÑ ÎÅ ÄÏÚ×ÏÌѤÔØÓÑ ÐÒÉ ×ÓÔÁÎÏ×ÌÅÎ¦Ê ÏÐæ§ secure edit" +290 "ëÏÍÁÎÄÁ %s ÎÅ ÄÏÚ×ÏÌѤÔØÓÑ ÐÒÉ ×ÓÔÁÎÏ×ÌÅÎ¦Ê ÏÐæ§ secure edit" +291 "set: ÏÐæÀ %s ÎÅÍÏÖÎÁ ×ÉÓÔÁ×ÉÔÉ ×ÉÍËÎÅÎÏÀ" +292 "åËÒÁÎ ÎÁÄÔÏ ÍÁÌÉÊ." +293 "ÄÏÄÁÎÏ" +294 "ÚͦÎÅÎÏ" +295 "ÓÔÅÒÔÏ" +296 "ÏÂ'¤ÄÎÁÎÏ" +297 "ÐÅÒÅͦÝÅÎÏ" +298 "ÚÄ×ÉÎÕÔÏ" +299 "×ÓÔÁ×ÌÅÎÏ" +300 "ÒÑÄÏË" +301 "ÒÑÄ˦×" +302 "Vi ÚÁ×ÁÎÔÁÖÅÎÏ ÂÅÚ ¦ÎÔÅÒÐÒÅÔÁÔÏÒÁ Tcl" +303 "æÁÊÌ ÍÏÄÉƦËÏ×ÁÎÏ Ð¦ÓÌÑ ÏÓÔÁÎÎØϧ ËÏÍÁÎÄÉ ÚÁÐÉÓÕ." +304 "îÅ×ÄÁÞÁ shell'¦×ÓØËÏÇÏ ÄÏÐÏ×ÎÅÎÎÑ" +305 "OÐæ§ ÒÅÄÁÇÕ×ÁÎÎÑ %s ÎÅ ×ËÁÚÁÎÏ" +306 "Vi ÚÁ×ÁÎÔÁÖÅÎÏ ÂÅÚ ¦ÎÔÅÒÐÒÅÔÁÔÏÒÁ Perl" +307 "îÅÍÁ¤ ËÏÍÁÎÄÉ ex ÄÌÑ ×ÉËÏÎÁÎÎÑ" +308 "îÁÔÉÓΦÔØ ENTER ÝÏ ×ÉËÏÎÁÔÉ ËÏÍÁÎÄÕ, q ÝÏ ×ÉÊÔÉ" +309 "÷×ÅĦÔØ 'cscope help' ÄÌÑ ¦ÎÆÏÒÍÁæ§" +310 "îÅÍÁ¤ cscope Ú'¤ÄÎÁÎÎØ" +311 "%s: ÎÅצÄÏÍÉÊ ÔÉÐ ÐÏÛÕËÕ: ×ÉËÏÒÉÓÔÏ×ÕÊÔÅ ÏÄÉÎ Ú %s" +312 "%d: ÎÅÍÁ¤ ÔÁËϧ ÓÅÓ¦§ cscope" +313 "set: ÏÐæÀ %s ÎÅÍÏÖÎÁ ×ÉÓÔÁ×ÉÔÉ ÕצÍËÎÅÎÏÀ" +314 "set: ÏÐæÀ %s ÎÅÍÏÖÎÁ ×ÉÓÔÁ×ÉÔÉ × 0" +315 "%s: ÄÏÄÁÎÏ: %lu ÒÑÄ˦×, %lu ÓÉÍ×Ï̦×" +316 "îÅÏÞ¦ËÕ×ÁÎÁ ÐÏÄ¦Ñ ÚͦÎÉ ÒÏÚͦÒÕ" +317 "%d ÆÁÊÌ¦× ÄÌÑ ÒÅÄÁÇÕ×ÁÎÎÑ" diff --git a/catalog/uk_UA.KOI8-U.owner b/catalog/uk_UA.KOI8-U.owner new file mode 100644 index 000000000000..11719baa95ff --- /dev/null +++ b/catalog/uk_UA.KOI8-U.owner @@ -0,0 +1 @@ +Olexander Kunytsa aka Cawko Xakep diff --git a/catalog/zh_CN.GB2312.base b/catalog/zh_CN.GB2312.base new file mode 100644 index 000000000000..5cd8dba89106 --- /dev/null +++ b/catalog/zh_CN.GB2312.base @@ -0,0 +1,311 @@ +002 "Ð㤶ÈÒç³ö" +003 "ÎÞ·¨É¾³ýµÚ %lu ÐÐ" +004 "ÎÞ·¨ÏòµÚ %lu ÐÐ×·¼Ó" +005 "ÎÞ·¨ÏòµÚ %lu ÐвåÈë" +006 "ÎÞ·¨´æ´¢µÚ %lu ÐÐ" +007 "ÎÞ·¨»ñµÃ×îºóÒ»ÐÐ" +008 "´íÎó£ºÎÞ·¨»ñÈ¡µÚ %lu ÐÐ" +009 "ÈÕÖ¾Îļþ" +010 "ÈÕ־δ¼Ç¼£¬ÎÞ·¨³·Ïú" +011 "δ×öÐ޸ģ¬ÎÞ·¨³·Ïú" +012 "ÈÕ־δ¼Ç¼£¬ÎÞ·¨³·Ïú" +013 "ÈÕ־δ¼Ç¼£¬ÎÞ·¨»Ø¹ö" +014 "δ×öÐ޸ģ¬ÎÞ·¨ÖØ×ö" +015 "%s/%d: ÈÕÖ¾´íÎó" +016 "Vi µÄ±ê×¼ÊäÈëºÍÊä³ö±ØÐëÊÇÖÕ¶Ë" +017 "±ê¼Ç %s: δÉèÖÃ" +018 "±ê¼Ç %s: ¸ÃÐб»É¾³ý" +019 "±ê¼Ç %s: ¹â±êλÖò»´æÔÚ" +020 "´íÎó£º" +021 "ÐÂÎļþ" +022 "ÎļþÃû±ä¸ü" +023 "ÒÑÐÞ¸Ä" +024 "δÐÞ¸Ä" +025 "ÒѽâËø" +026 "Ö»¶Á" +027 "µÚ %lu ÐУ¯¹² %lu ÐÐ [%ld%%]" +028 "¿ÕÎļþ" +029 "µÚ %lu ÐÐ" +030 "Îļþ %s ²»ÊÇÏûϢĿ¼" +031 "ÎÞ·¨ÉèÖÃÑ¡Ïî %s µÄĬÈÏÖµ" +032 "Ó÷¨ %s" +033 "set: ²»´æÔÚÑ¡Ïî %s£»Óà 'set all' ²é¿´ËùÓÐÑ¡ÏîµÄÖµ" +034 "set: Ñ¡Ïî [no]%s ²»½ÓÊܸ³Öµ" +035 "set: Ñ¡Ïî %s ²»ÊÇ¿ª¹Ø" +036 "set: Ñ¡Ïî %s: %s" +037 "set: Ñ¡Ïî %s: %s: ÖµÒç³ö" +038 "set: Ñ¡Ïî %s: %s ÊÇÒ»¸ö·Ç·¨Êý×Ö" +039 "set: Ñ¡Ïî %s ²»ÊÇ¿ª¹Ø" +040 "ÆÁĻ̫խ£¬ÁпíСÓÚ %d" +041 "ÆÁĻ̫¿í£¬Áпí´óÓÚ %d" +042 "ÆÁĻ̫°«£¬ÐиßСÓÚ %d" +043 "ÆÁĻ̫¸ß£¬ÐиߴóÓÚ %d" +044 "lisp Ñ¡ÏîδʵÏÖ" +045 "ÏûϢδ¹Ø±Õ£º%s" +046 "ÏûϢδ´ò¿ª£º%s" +047 "%s Ñ¡Ïî±ØÐëÿÁ½¸ö×Ö·ûÒ»×é" +053 "ĬÈÏ»º³åÇøΪ¿Õ" +054 "»º³åÇø %s Ϊ¿Õ" +055 "ÎļþÃûÖÐÓл»ÐеÄÎļþÊÇÎÞ·¨»Ö¸´µÄ" +056 "Ò»µ©»á»°Ê§°Ü£¬ÐÞ¸ÄÎÞ·¨»Ö¸´" +057 "ÕýÔÚ±¸·ÝÎļþ¡­¡­" +058 "±£´æʧ°Ü£º%s" +059 "Ò»µ©»á»°Ê§°Ü£¬ÐÞ¸ÄÎÞ·¨»Ö¸´" +060 "Îļþ±¸·Ýʧ°Ü£º%s" +061 "ÕýÔÚ±¸·ÝÎļþ¡­¡­" +062 "ID Ϊ %u µÄÓû§Î´ÕÒµ½" +063 "ÎÞ·¨¸ø»Ö¸´Îļþ¼ÓËø" +064 "»Ö¸´Îļþ»º³åÇøÒç³ö" +065 "»Ö¸´Îļþ" +066 "%s: »Ö¸´Îļþ¸ñʽÒì³£" +067 "%s: »Ö¸´Îļþ¸ñʽÒì³£" +068 "²»´æÔÚÃûΪ %s µÄ£¬¿É¶Á²¢ÐèÒª»Ö¸´µÄÎļþ" +069 "´æÔÚ´ËÎļþµÄ¾É°æ±¾ÐèÒªÄú»Ö¸´" +070 "´æÔÚÆäËüÐèÒªÄú»Ö¸´µÄÎļþ" +071 "Óʼþδ·¢³ö£º%s" +072 "ÎļþΪ¿Õ£¬ÎÞ·¨ËÑË÷" +073 "µ½´ïÎļþβ£¬Î´ÕÒµ½Ä£Ê½" +074 "ûÓÐÉÏÒ»¸öËÑË÷ģʽ" +075 "ģʽδÕÒµ½" +076 "µ½´ïÎļþÍ·£¬Î´ÕÒµ½Ä£Ê½" +077 "ËÑË÷»Øת" +078 "ÕýÔÚËÑË÷¡­¡­" +079 "δÕÒµ½²»¿É´òÓ¡×Ö·û" +080 "ÃüÁîÃû²»Ã÷" +082 "%s: ÃüÁîÔÚ ex ģʽϲ»¿ÉÓÃ" +083 "ÃüÁî¼ÆÊý²»¿ÉΪ 0" +084 "%s: ´íÎóµÄÐÐÃèÊö" +085 "ÄÚ²¿Óï·¨±í´íÎó (%s: %s)" +086 "Ó÷¨£º%s" +087 "%s: ÁÙʱ»º³åÇøδÊÍ·Å" +088 "ÐÞÊηûÆ«ÒÆÁ¿ÔÚµÚÒ»ÐÐ֮ǰ" +089 "ÐÞÊηûÆ«ÒÆÁ¿³¬¹ý×îºóÒ»ÐÐ" +090 "Îļþ£¯ÆÁÄ»¸Ä±äʱÓдø·¶Î§µÄ @ ÃüÁîÕýÔÚÔËÐÐ" +091 "Îļþ£¯ÆÁÄ»¸Ä±äʱÓÐÈ«¾ÖÃüÁv ÃüÁîÕýÔÚÔËÐÐ" +092 "Ex ÃüÁîʧ°Ü£ºµÈ´ýÖеÄÃüÁîÒѶªÆú" +093 "Ex ÃüÁîʧ°Ü£º¼üÓ³ÉäÒѶªÆú" +094 "µÚ¶þµØַСÓÚµÚÒ»µØÖ·" +095 "δÌṩ±ê¼ÇÃû" +096 "\\ ûÓиúÔÚ / »ò ? ºóÃæ" +097 "ÒýÓÃÁËСÓÚ 0 µÄÐкÅ" +098 "%s ÃüÁî²»Ã÷" +099 "µØÖ·ÖµÒç³ö" +100 "µØÖ·ÖµÏÂÒç" +101 "·Ç·¨µÄµØÖ·×éºÏ" +102 "·Ç·¨µØÖ·£ºÎļþÖ»ÓÐ %lu ÐÐ" +103 "·Ç·¨µØÖ·£ºÎļþΪ¿Õ" +104 "ÃüÁî %s ²»ÔÊÐíµØַΪ 0" +105 "ûÓпÉÏÔʾµÄËõд" +106 "Ëõд±ØÐëÒÔ¡¸µ¥´Ê¡¹×Ö·û½áÊø" +107 "Ëõд²»ÄÜ°üº¬ÖƱí·û»ò¿Õ¸ñ" +108 "Ëõд²»ÄÜÔÚ½áβ֮ÍâµÄµØ·½»ìÓõ¥´Ê£¯·Çµ¥´Ê×Ö·û" +109 "\"%s\" ²»ÊÇËõд" +110 "Vi ÃüÁîʧ°Ü£º¼üÓ³ÉäÒѶªÆú" +111 "ûÓÐÊ£ÓàµÄ´ý±à¼­Îļþ" +112 "ûÓÐÉÏÒ»¸ö´ý±à¼­Îļþ" +113 "ûÓÐÉÏÒ»¸öÐèÖØб༭µÄÎļþ" +114 "ûÓпÉÏÔʾµÄÎļþÁбí" +115 "ȱÉÙÓÃÓÚÌæ»» \"!\" µÄÉÏÒ»ÌõÃüÁî" +116 "ȱÉÙÓÃÓÚÌæ»» %% µÄÎļþÃû" +117 "ȱÉÙÓÃÓÚÌæ»» # µÄÎļþÃû" +118 "´íÎó£ºexecl: %s" +119 "ÊäÈ룯Êä³ö´íÎó£º%s" +120 "ÎļþÔÚÉÏÒ»´ÎÍêÕûдÈëºó±»Ð޸ģ»Ð´ÈëÎļþ£¬»òʹÓà ! Ç¿ÖÆÇл»Ä¿Â¼" +121 "ÎÞ·¨ÕÒµ½Óû§ÆðʼĿ¼" +122 "еĵ±Ç°Ä¿Â¼£º%s" +123 "ûÓпÉÏÔʾµÄ¼ôÇлº³åÇø" +124 "%s ÃüÁî²»Äܱ»ÓÃ×÷È«¾ÖÃüÁî»ò v ÃüÁîµÄÒ»²¿·Ö" +125 "%s/%s: δÒýÈ룺²»ÊôÓÚÄú»ò¸ùÓû§" +126 "%s/%s: δÒýÈ룺²»ÊôÓÚÄú" +127 "%s/%s: δÒýÈ룺¿ÉÒÔ±»ÎļþÊôÖ÷ÒÔÍâµÄÓû§Ð´Èë" +128 "%s: δÒýÈ룺²»ÊôÓÚÄú»ò¸ùÓû§" +129 "%s: δÒýÈ룺²»ÊôÓÚÄú" +130 "%s: δÒýÈ룺¿ÉÒÔ±»ÎļþÊôÖ÷ÒÔÍâµÄÓû§Ð´Èë" +131 "ȱÉÙ¿ÉÒԺϲ¢µÄÐÐ" +132 "ȱÉÙÊäÈëÓ³Éä" +133 "ȱÉÙÃüÁîÓ³Éä" +134 "%s ×Ö·û²»Äܱ»ÖØÐÂÓ³Éä" +135 "\"%s\" Ŀǰδ±»Ó³Éä" +136 "±ê¼ÇÃû±ØÐëÊǵ¥¸ö×Ö·û" +137 "%s ÒÑ´æÔÚ£¬Î´Ð´È룻Óà ! ¸²¸ÇÎļþ" +138 "н¨ exrc Îļþ£º%s" +139 "Ä¿±êÐÐÔÚÒƶ¯·¶Î§Ö®ÄÚ" +140 "open ÒªÇó¿ªÆô open Ñ¡Ïî" +141 "open ÃüÁîδʵÏÖ" +142 "ÎÞ·¨±£³Ö´ËÎļþ" +143 "ÎļþÒѱ£³Ö" +144 "%s: Õ¹¿ªµÄÎļþÃû¹ý¶à" +145 "Ö»ÄܶÁÈ¡³£¹æÎļþºÍ¾ßÃû¹ÜµÀ" +146 "%s: ¶ÁËø²»¿ÉÓÃ" +147 "ÕýÔÚ¶ÁÈ¡¡­¡­" +148 "%s: %lu ÐУ¬%lu ¸ö×Ö·û" +149 "ûÓпÉÏÔʾµÄºǫ́ÆÁÄ»" +150 "script ÃüÁî½öÔÚ vi ģʽÏ¿ÉÓÃ" +151 "ûÓÐÒªÖ´ÐеÄÃüÁî" +152 "shiftwidth Ñ¡Ïî±»ÉèΪ 0" +153 "ÃüÁî¼ÆÊýÒç³ö" +154 "ÃüÁî¼ÆÊýÏÂÒç" +155 "ÕýÔò±í´ïʽÒÑÖ¸¶¨£»r ÐÞÊηûÎÞЧ" +156 "#, l ºÍ p ÐÞÊηûÔÚ vi ģʽϲ»ÄÜÓë c ÐÞÊηû×éºÏ" +157 "δÕÒµ½Æ¥Åä" +158 "ûÓÐÉÏÒ»´Î½øÈëµÄ tag" +159 "tags Õ»ÉϵļǼÉÙÓÚ %s Ìõ£»Óà :display t[ags] ÏÔʾËüÃÇ" +160 "tags Õ»Éϲ»´æÔÚÎļþ %s£¬ÎÞ·¨·µ»Ø£»Óà :display t[ags] ²é¿´" +161 "°´»Ø³µ¼ü¼ÌÐø£º" +162 "%s: tag δÕÒµ½" +163 "%s: Ëð»µµÄ tag ÔÚ %s ÖÐ" +164 "%s: tag µÄÐкų¬¹ýÁËÎļþβ" +165 "tags ջΪ¿Õ" +166 "%s: ËÑË÷ģʽδÕÒµ½" +167 "»¹ÓÐ %d ¸ö´ý±à¼­Îļþ" +168 "»º³åÇø %s Ϊ¿Õ" +169 "È·ÈÏÐ޸ģ¿[n]" +170 "ÒÑÖжÏ" +171 "ûÓÐÉÏÒ»¸ö¿É¹©Ö´ÐеĻº³åÇø" +172 "ûÓÐÉÏÒ»ÌõÕýÔò±í´ïʽ" +173 "%s ÒªÇó´æÔÚÒ»¸öÒѶÁÈëµÄÎļþ" +174 "Ó÷¨£º%s" +175 "visual ÃüÁîÒªÇó¿ªÆô open Ñ¡Ïî" +177 "¿ÕÎļþ" +178 "ûÓÐÉÏÒ»´Î F, f, T »ò t ËÑË÷" +179 "%s δÕÒµ½" +180 "ûÓÐÉÏÒ»¸ö´ý±à¼­Îļþ" +181 "¹â±ê²»ÔÚÊý×ÖÉÏ" +182 "½á¹ûÊý×Ö¹ý´ó" +183 "½á¹ûÊý×Ö¹ýС" +184 "ÕâÒ»ÐÐÉÏûÓÐÆ¥ÅäµÄ×Ö·û" +185 "Æ¥Åä×Ö·ûδÕÒµ½" +186 "ûÓпÉÌæ»»µÄ×Ö·û" +187 "ûÓÐÆäËüÆÁÄ»¿ÉÒÔÇл»" +188 "ÔÚËÑË÷×Ö·û´®¡¢ÐÐÆ«ÒÆÁ¿»ò z ÃüÁîÖ®ºóÓжàÓà×Ö·û" +189 "ûÓÐÉÏÒ»¸öËÑË÷ģʽ" +190 "ËÑË÷»Øתµ½Á˳õʼλÖÃ" +191 "Ëõдչ¿ª³¬¹ýÏÞÖÆ£º×Ö·ûÒѶªÆú" +192 "·Ç·¨×Ö·û£»ÓÃÒýºÅÀ¨ÆðÀ´ÔÙÊäÈë" +193 "Òѵ½²åÈëµãµÄ¿ªÊ¼" +194 "ûÓпɲÁ³ýµÄÊ£Óà×Ö·û" +195 "Òƶ¯³¬¹ýÎļþβ" +196 "Òƶ¯³¬¹ýÐÐÄ©" +197 "¹â±êδÒƶ¯" +198 "Òѵ½ÎļþÍ·" +199 "Òƶ¯³¬¹ýÎļþÍ·" +200 "ÒÑλÓÚµÚÒ»ÁÐ" +201 "»º³åÇøÓ¦ÔÚÃüÁîÇ°Ö¸¶¨" +202 "Òѵ½Îļþβ" +203 "Òѵ½ÐÐÄ©" +204 "%s ²»ÊÇ vi ÃüÁî" +205 "Ó÷¨ %s" +206 "ûÓпÉɾ³ýµÄ×Ö·û" +207 "Q ÃüÁîÐèÒª ex Öն˽çÃæ" +208 "ûÓпÉÖظ´µÄÃüÁî" +209 "ÎļþΪ¿Õ" +210 "%s ²»Äܱ»ÓÃ×÷Òƶ¯ÃüÁî" +211 "ÒÑ´¦ÓÚÃüÁîģʽ" +212 "¹â±ê²»ÔÚµ¥´ÊÉÏ" +214 "´°¿ÚÑ¡ÏîµÄÖµ¹ý´ó£¬×î´óÖµ %u" +215 "×·¼Ó" +216 "ÐÞ¸Ä" +217 "ÃüÁî" +218 "²åÈë" +219 "Ìæ»»" +220 "Òƶ¯³¬¹ýÆÁÄ»ÖÕµã" +221 "Òƶ¯³¬¹ýÆÁÄ»Æðµã" +222 "·ÖÆÁÐèÒª¶àÓÚ %d ÐÐ" +223 "ûÓкǫ́ÆÁÄ»" +224 "²»´æÔÚÕýÔڱ༭Îļþ %s µÄºǫ́ÆÁÄ»" +225 "²»ÄÜ°ÑÄúΨһµÄÆÁÄ»ÖÃÓÚºǫ́" +226 "ÆÁĻֻÄÜÊÕËõµ½ %d ÐÐ" +227 "ÆÁÄ»²»ÄÜÊÕËõ" +228 "ÆÁÄ»²»ÄÜÔö¸ß" +230 "²»ÄܹÒÆð´ËÆÁÄ»" +231 "ÒÑÖжϣº¼üÓ³ÉäÒѶªÆú" +232 "vi: ÁÙʱ»º³åÇøδÊÍ·Å" +233 "´ËÖÕ¶ËûÓÐ %s ¼ü" +234 "Ö»ÄÜÖ¸¶¨Ò»¸ö»º³åÇø" +235 "Êý×Ö´óÓÚ %lu" +236 "ÒÑÖжÏ" +237 "ÎÞ·¨´´½¨ÁÙʱÎļþ" +238 "¾¯¸æ£º%s ²»Êdz£¹æÎļþ" +239 "%s ÒѼÓËø£¬»á»°ÎªÖ»¶Á" +240 "%s: ÒƳý" +241 "%s: ¹Ø±Õ" +242 "%s: ÒƳý" +243 "%s: ÒƳý" +244 "Ö»¶ÁÎļþ£¬Î´Ð´È룻Óà ! Ç¿ÖÆдÈë" +245 "Ö»¶ÁÎļþ£¬Î´Ð´Èë" +246 "%s ÒÑ´æÔÚ£¬Î´Ð´È룻Óà ! ¸²¸ÇÎļþ" +247 "%s ÒÑ´æÔÚ£¬Î´Ð´Èë" +248 "ÊÇÒÑ´æÔÚÎļþµÄÒ»²¿·Ö£¬Î´Ð´È룻Óà ! Ç¿ÖÆдÈë" +249 "ÊÇÒÑ´æÔÚÎļþµÄÒ»²¿·Ö£¬Î´Ð´Èë" +250 "%s: Îļþ±»Ð޸ģ¬ÐÂÓÚµ±Ç°¿½±´£»Óà ! Ç¿ÖÆдÈë" +251 "%s: Îļþ±»Ð޸ģ¬ÐÂÓÚµ±Ç°¿½±´" +252 "%s: дËø²»¿ÉÓÃ" +253 "ÕýÔÚдÈë¡­¡­" +254 "%s: ¾¯¸æ£ºÎļþ±»½Ø¶Ï" +255 "ÒÑλÓÚÕâ×é tags ÖеĵÚÒ»¸ö" +256 "%s: ÐÂÎļþ£º%lu ÐУ¬%lu ¸ö×Ö·û" +257 "%s: %lu ÐУ¬%lu ¸ö×Ö·û" +258 "%s: Õ¹¿ªµÄÎļþÃû¹ý¶à" +259 "%s: ²»Êdz£¹æÎļþ" +260 "%s: ²»ÊôÓÚÄú" +261 "%s: ¿É±»ÎļþÊôÖ÷ÒÔÍâµÄÓû§·ÃÎÊ" +262 "ÎļþÔÚÉÏÒ»´ÎÍêÕûдÈëºó±»Ð޸ģ»Ð´ÈëÎļþ£¬»òʹÓà ! Ç¿ÖÆÔØÈë" +263 "ÎļþÔÚÉÏÒ»´ÎÍêÕûдÈëºó±»Ð޸ģ»Ð´ÈëÎļþ£¬»òʹÓà :edit! Ç¿ÖƱ༭" +264 "ÎļþÔÚÉÏÒ»´ÎÍêÕûдÈëºó±»Ð޸ģ»Ð´ÈëÎļþ£¬»òʹÓà ! Ç¿ÖÆÖ´ÐÐ" +265 "ÁÙʱÎļþ£¬Í˳ö½«¶ªÆúÈ«²¿ÐÞ¸Ä" +266 "ÎļþÖ»¶Á£¬ÐÞ¸Äδ±»×Ô¶¯Ð´Èë" +267 "ÈÕÖ¾ÖØÆô" +268 "È·ÈÏ£¿[ynq]" +269 "°´ÈÎÒâ¼ü¼ÌÐø£º" +270 "°´ÈÎÒâ¼ü¼ÌÐø£Û°´ : ¼üÊäÈë ex ÃüÁî£Ý£º" +271 "°´ÈÎÒâ¼ü¼ÌÐø£Û°´ q ¼üÍƳö£Ý£º" +272 "¸ÃÐÎʽµÄ %s ÃüÁîÐèÒª ex Öն˽çÃæ" +273 "½øÈë ex ÊäÈëģʽ" +274 "ÃüÁîʧ°Ü£¬ÉÐδ¶ÁÈëÎļþ" +275 " ¼ÌÐø£¿" +276 "ÒâÍâµÄ×Ö·ûʼþ" +277 "ÒÔÍâµÄÎļþβʼþ" +278 "²éѯδÕÒµ½Æ¥Åä" +279 "ÒâÍâµÄÖжÏʼþ" +280 "ÒâÍâµÄÍ˳öʼþ" +281 "ÒâÍâµÄÖØ»æʼþ" +282 "ÒÑλÓÚÕâ×é tags ÖеÄ×îºóÒ»¸ö" +283 "%s ÃüÁîÐèÒª ex Öն˽çÃæ" +284 "secure ±à¼­Ñ¡ÏÆôʱ²»Ö§³Ö¸ÃÐÎʽµÄ %s ÃüÁî" +285 "ÒâÍâµÄ×Ö·û´®Ê¼þ" +286 "ÒâÍâµÄ³¬Ê±Ê¼þ" +287 "ÒâÍâµÄдÈëʼþ" +288 "·ÖÆÁÐèÒª¶àÓÚ %d ÁÐ" +289 "secure ±à¼­Ñ¡ÏÆôʱ²»Ö§³Ö shell Õ¹¿ª" +290 "secure ±à¼­Ñ¡ÏÆôʱ²»Ö§³Ö %s ÃüÁî" +291 "set: Ñ¡Ïî %s ²»ÄܹرÕ" +292 "ÏÔʾ¿Õ¼ä̫С" +293 "ÒÑÌí¼Ó" +294 "ÒÑÐÞ¸Ä" +295 "ÒÑɾ³ý" +296 "ÒѺϲ¢" +297 "ÒÑÒƶ¯" +298 "ÒÑÆ«ÒÆ" +299 "ÒѸ´ÖÆ" +300 "ÐÐ" +301 "ÐÐ" +303 "ÎļþÔÚÉÏÒ»´ÎдÈëºó±»ÐÞ¸Ä" +304 "Shell Õ¹¿ªÊ§°Ü" +305 "δָ¶¨ %s ±à¼­Ñ¡Ïî" +307 "ûÓÐÒªÖ´ÐÐµÄ ex ÃüÁî" +308 "¼üÈë»Ø³µÖ´ÐÐÒ»ÌõÃüÁ:q Í˳ö" +309 "ʹÓà \"cscope help\" ²é¿´°ïÖú" +310 "ûÓÐÕýÔÚÔËÐÐµÄ cscope Á¬½Ó" +311 "%s: ËÑË÷ÀàÐͲ»Ã÷£ºÊ¹Óà %s ÖеÄÒ»¸ö" +312 "%d: ÎÞ´Ë cscope »á»°" +313 "set: Ñ¡Ïî %s ¾ø¶Ô²»ÄÜ¿ªÆô" +314 "set: Ñ¡Ïî %s ¾ø¶Ô²»Äܱ»ÉèΪ 0" +315 "%s: ÒÑ×·¼Ó£º%lu ÐУ¬%lu ¸ö×Ö·û" +316 "ÒâÍâµÄ´óСµ÷Õûʼþ" +317 "%d ¸ö´ý±à¼­µÄÎļþ" +319 "%d ¸öºǫ́ÆÁÄ»£»Óà :display ÁгöËüÃÇ" +320 "¹â±êλÖò»Ã÷" +321 "²»Ö§³ÖÎļþ±àÂëת»»" +322 "²»Ö§³ÖÊäÈë±àÂëת»»" +323 "ÎÞЧÊäÈ룬ÒѽضÏ" +324 "µÚ %d ÐÐÉÏÓÐת»»´íÎó" diff --git a/catalog/zh_CN.GB2312.owner b/catalog/zh_CN.GB2312.owner new file mode 100644 index 000000000000..8052caca3b63 --- /dev/null +++ b/catalog/zh_CN.GB2312.owner @@ -0,0 +1 @@ +Zhihao Yuan diff --git a/cl/README.signal b/cl/README.signal index 7faa45673b75..18b3d1451b00 100644 --- a/cl/README.signal +++ b/cl/README.signal @@ -1,4 +1,4 @@ -# @(#)README.signal 10.1 (Berkeley) 6/23/95 +# $Id: README.signal,v 10.1 1995/06/23 10:28:17 bostic Exp $ There are six (normally) asynchronous actions about which vi cares: SIGHUP, SIGINT, SIGQUIT, SIGTERM, SIGTSTP and SIGWINCH. diff --git a/cl/cl.h b/cl/cl.h index 2ef2b8d1f81e..c84ef88428c0 100644 --- a/cl/cl.h +++ b/cl/cl.h @@ -6,11 +6,24 @@ * * See the LICENSE file for redistribution information. * - * @(#)cl.h 10.19 (Berkeley) 9/24/96 + * $Id: cl.h,v 10.34 2011/08/15 20:07:32 zy Exp $ */ +#ifdef USE_WIDECHAR +#define _XOPEN_SOURCE_EXTENDED +#endif +#ifdef HAVE_NCURSES_H +#include +#else +#include +#endif + typedef struct _cl_private { - CHAR_T ibuf[256]; /* Input keys. */ + char ibuf[256]; /* Input keys. */ + + size_t skip; /* Remaining keys. */ + + CONVWIN cw; /* Conversion buffer. */ int eof_count; /* EOF count. */ @@ -24,6 +37,10 @@ typedef struct _cl_private { char *rmso, *smso; /* Inverse video terminal strings. */ char *smcup, *rmcup; /* Terminal start/stop strings. */ + char *oname; /* Original screen window name. */ + + SCR *focus; /* Screen that has the "focus". */ + int killersig; /* Killer signal. */ #define INDX_HUP 0 #define INDX_INT 1 @@ -39,29 +56,29 @@ typedef struct _cl_private { TE_SENT=0, TI_SENT } ti_te; #define CL_IN_EX 0x0001 /* Currently running ex. */ -#define CL_RENAME 0x0002 /* X11 xterm icon/window renamed. */ -#define CL_RENAME_OK 0x0004 /* User wants the windows renamed. */ -#define CL_SCR_EX_INIT 0x0008 /* Ex screen initialized. */ -#define CL_SCR_VI_INIT 0x0010 /* Vi screen initialized. */ -#define CL_SIGHUP 0x0020 /* SIGHUP arrived. */ -#define CL_SIGINT 0x0040 /* SIGINT arrived. */ -#define CL_SIGTERM 0x0080 /* SIGTERM arrived. */ -#define CL_SIGWINCH 0x0100 /* SIGWINCH arrived. */ -#define CL_STDIN_TTY 0x0200 /* Talking to a terminal. */ +#define CL_LAYOUT 0x0002 /* Screen layout changed. */ +#define CL_RENAME 0x0004 /* X11 xterm icon/window renamed. */ +#define CL_RENAME_OK 0x0008 /* User wants the windows renamed. */ +#define CL_SCR_EX_INIT 0x0010 /* Ex screen initialized. */ +#define CL_SCR_VI_INIT 0x0020 /* Vi screen initialized. */ +#define CL_SIGHUP 0x0040 /* SIGHUP arrived. */ +#define CL_SIGINT 0x0080 /* SIGINT arrived. */ +#define CL_SIGTERM 0x0100 /* SIGTERM arrived. */ +#define CL_SIGWINCH 0x0200 /* SIGWINCH arrived. */ +#define CL_STDIN_TTY 0x0400 /* Talking to a terminal. */ u_int32_t flags; } CL_PRIVATE; #define CLP(sp) ((CL_PRIVATE *)((sp)->gp->cl_private)) #define GCLP(gp) ((CL_PRIVATE *)gp->cl_private) +#define CLSP(sp) ((WINDOW *)((sp)->cl_private)) /* Return possibilities from the keyboard read routine. */ typedef enum { INP_OK=0, INP_EOF, INP_ERR, INP_INTR, INP_TIMEOUT } input_t; -/* The screen line relative to a specific window. */ -#define RLNO(sp, lno) (sp)->woff + (lno) - -/* X11 xterm escape sequence to rename the icon/window. */ -#define XTERM_RENAME "\033]0;%s\007" +/* The screen position relative to a specific window. */ +#define RCNO(sp, cno) (cno) +#define RLNO(sp, lno) (lno) /* * XXX @@ -75,4 +92,4 @@ typedef enum { INP_OK=0, INP_EOF, INP_ERR, INP_INTR, INP_TIMEOUT } input_t; #define FALSE 0 #endif -#include "cl_extern.h" +#include "extern.h" diff --git a/cl/cl_bsd.c b/cl/cl_bsd.c deleted file mode 100644 index 22124e5780b2..000000000000 --- a/cl/cl_bsd.c +++ /dev/null @@ -1,346 +0,0 @@ -/*- - * Copyright (c) 1995, 1996 - * Keith Bostic. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)cl_bsd.c 8.29 (Berkeley) 7/1/96"; -#endif /* not lint */ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../common/common.h" -#include "../vi/vi.h" -#include "cl.h" - -static char *ke; /* Keypad on. */ -static char *ks; /* Keypad off. */ -static char *vb; /* Visible bell string. */ - -/* - * HP's support the entire System V curses package except for the tigetstr - * and tigetnum functions. Ultrix supports the BSD curses package except - * for the idlok function. Cthulu only knows why. Break things up into a - * minimal set of functions. - */ - -#ifndef HAVE_CURSES_ADDNSTR -/* - * addnstr -- - * - * PUBLIC: #ifndef HAVE_CURSES_ADDNSTR - * PUBLIC: int addnstr __P((char *, int)); - * PUBLIC: #endif - */ -int -addnstr(s, n) - char *s; - int n; -{ - int ch; - - while (n-- && (ch = *s++)) - addch(ch); - return (OK); -} -#endif - -#ifndef HAVE_CURSES_BEEP -/* - * beep -- - * - * PUBLIC: #ifndef HAVE_CURSES_BEEP - * PUBLIC: void beep __P((void)); - * PUBLIC: #endif - */ -void -beep() -{ - (void)write(1, "\007", 1); /* '\a' */ -} -#endif /* !HAVE_CURSES_BEEP */ - -#ifndef HAVE_CURSES_FLASH -/* - * flash -- - * Flash the screen. - * - * PUBLIC: #ifndef HAVE_CURSES_FLASH - * PUBLIC: void flash __P((void)); - * PUBLIC: #endif - */ -void -flash() -{ - if (vb != NULL) { - (void)tputs(vb, 1, cl_putchar); - (void)fflush(stdout); - } else - beep(); -} -#endif /* !HAVE_CURSES_FLASH */ - -#ifndef HAVE_CURSES_IDLOK -/* - * idlok -- - * Turn on/off hardware line insert/delete. - * - * PUBLIC: #ifndef HAVE_CURSES_IDLOK - * PUBLIC: void idlok __P((WINDOW *, int)); - * PUBLIC: #endif - */ -void -idlok(win, bf) - WINDOW *win; - int bf; -{ - return; -} -#endif /* !HAVE_CURSES_IDLOK */ - -#ifndef HAVE_CURSES_KEYPAD -/* - * keypad -- - * Put the keypad/cursor arrows into or out of application mode. - * - * PUBLIC: #ifndef HAVE_CURSES_KEYPAD - * PUBLIC: int keypad __P((void *, int)); - * PUBLIC: #endif - */ -int -keypad(a, on) - void *a; - int on; -{ - char *p; - - if ((p = tigetstr(on ? "smkx" : "rmkx")) != (char *)-1) { - (void)tputs(p, 0, cl_putchar); - (void)fflush(stdout); - } - return (0); -} -#endif /* !HAVE_CURSES_KEYPAD */ - -#ifndef HAVE_CURSES_NEWTERM -/* - * newterm -- - * Create a new curses screen. - * - * PUBLIC: #ifndef HAVE_CURSES_NEWTERM - * PUBLIC: void *newterm __P((const char *, FILE *, FILE *)); - * PUBLIC: #endif - */ -void * -newterm(a, b, c) - const char *a; - FILE *b, *c; -{ - return (initscr()); -} -#endif /* !HAVE_CURSES_NEWTERM */ - -#ifndef HAVE_CURSES_SETUPTERM -/* - * setupterm -- - * Set up terminal. - * - * PUBLIC: #ifndef HAVE_CURSES_SETUPTERM - * PUBLIC: void setupterm __P((char *, int, int *)); - * PUBLIC: #endif - */ -void -setupterm(ttype, fno, errp) - char *ttype; - int fno, *errp; -{ - static char buf[2048]; - char *p; - - if ((*errp = tgetent(buf, ttype)) > 0) { - if (ke != NULL) - free(ke); - ke = ((p = tigetstr("rmkx")) == (char *)-1) ? - NULL : strdup(p); - if (ks != NULL) - free(ks); - ks = ((p = tigetstr("smkx")) == (char *)-1) ? - NULL : strdup(p); - if (vb != NULL) - free(vb); - vb = ((p = tigetstr("flash")) == (char *)-1) ? - NULL : strdup(p); - } -} -#endif /* !HAVE_CURSES_SETUPTERM */ - -#ifndef HAVE_CURSES_TIGETSTR -/* Terminfo-to-termcap translation table. */ -typedef struct _tl { - char *terminfo; /* Terminfo name. */ - char *termcap; /* Termcap name. */ -} TL; -static const TL list[] = { - "cols", "co", /* Terminal columns. */ - "cup", "cm", /* Cursor up. */ - "cuu1", "up", /* Cursor up. */ - "el", "ce", /* Clear to end-of-line. */ - "flash", "vb", /* Visible bell. */ - "kcub1", "kl", /* Cursor left. */ - "kcud1", "kd", /* Cursor down. */ - "kcuf1", "kr", /* Cursor right. */ - "kcuu1", "ku", /* Cursor up. */ - "kdch1", "kD", /* Delete character. */ - "kdl1", "kL", /* Delete line. */ - "ked", "kS", /* Delete to end of screen. */ - "kel", "kE", /* Delete to eol. */ - "kend", "@7", /* Go to eol. */ - "khome", "kh", /* Go to sol. */ - "kich1", "kI", /* Insert at cursor. */ - "kil1", "kA", /* Insert line. */ - "kind", "kF", /* Scroll down. */ - "kll", "kH", /* Go to eol. */ - "knp", "kN", /* Page down. */ - "kpp", "kP", /* Page up. */ - "kri", "kR", /* Scroll up. */ - "lines", "li", /* Terminal lines. */ - "rmcup", "te", /* Terminal end string. */ - "rmkx", "ke", /* Exit "keypad-transmit" mode. */ - "rmso", "se", /* Standout end. */ - "smcup", "ti", /* Terminal initialization string. */ - "smkx", "ks", /* Enter "keypad-transmit" mode. */ - "smso", "so", /* Standout begin. */ -}; - -#ifdef _AIX -/* - * AIX's implementation for function keys greater than 10 is different and - * only goes as far as 36. - */ -static const char codes[] = { -/* 0-10 */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ';', -/* 11-20 */ '<', '>', '!', '@', '#', '$', '%', '^', '&', '*', -/* 21-30 */ '(', ')', '-', '_', '+', ',', ':', '?', '[', ']', -/* 31-36 */ '{', '}', '|', '~', '/', '=' -}; - -#else - -/* - * !!! - * Historically, the 4BSD termcap code didn't support functions keys greater - * than 9. This was silently enforced -- asking for key k12 would return the - * value for k1. We try and get around this by using the tables specified in - * the terminfo(TI_ENV) man page from the 3rd Edition SVID. This assumes the - * implementors of any System V compatibility code or an extended termcap used - * those codes. - */ -static const char codes[] = { -/* 0-10 */ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ';', -/* 11-19 */ '1', '2', '3', '4', '5', '6', '7', '8', '9', -/* 20-63 */ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', - 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', -}; -#endif /* _AIX */ - -/* - * lcmp -- - * list comparison routine for bsearch. - */ -static int -lcmp(a, b) - const void *a, *b; -{ - return (strcmp(a, ((TL *)b)->terminfo)); -} - -/* - * tigetstr -- - * - * Vendors put the prototype for tigetstr into random include files, including - * , which we can't include because it makes other systems unhappy. - * Try and work around the problem, since we only care about the return value. - * - * PUBLIC: #ifdef HAVE_CURSES_TIGETSTR - * PUBLIC: char *tigetstr(); - * PUBLIC: #else - * PUBLIC: char *tigetstr __P((char *)); - * PUBLIC: #endif - */ -char * -tigetstr(name) - char *name; -{ - static char sbuf[256]; - TL *tlp; - int n; - char *p, keyname[3]; - - if ((tlp = bsearch(name, - list, sizeof(list) / sizeof(TL), sizeof(TL), lcmp)) == NULL) { -#ifdef _AIX - if (name[0] == 'k' && - name[1] == 'f' && (n = atoi(name + 2)) <= 36) { - keyname[0] = 'k'; - keyname[1] = codes[n]; - keyname[2] = '\0'; -#else - if (name[0] == 'k' && - name[1] == 'f' && (n = atoi(name + 2)) <= 63) { - keyname[0] = n <= 10 ? 'k' : 'F'; - keyname[1] = codes[n]; - keyname[2] = '\0'; -#endif - name = keyname; - } - } else - name = tlp->termcap; - - p = sbuf; -#ifdef _AIX - return ((p = tgetstr(name, &p)) == NULL ? (char *)-1 : strcpy(sbuf, p)); -#else - return (tgetstr(name, &p) == NULL ? (char *)-1 : sbuf); -#endif -} - -/* - * tigetnum -- - * - * PUBLIC: #ifndef HAVE_CURSES_TIGETSTR - * PUBLIC: int tigetnum __P((char *)); - * PUBLIC: #endif - */ -int -tigetnum(name) - char *name; -{ - TL *tlp; - int val; - - if ((tlp = bsearch(name, - list, sizeof(list) / sizeof(TL), sizeof(TL), lcmp)) != NULL) { - name = tlp->termcap; - } - - return ((val = tgetnum(name)) == -1 ? -2 : val); -} -#endif /* !HAVE_CURSES_TIGETSTR */ diff --git a/cl/cl_funcs.c b/cl/cl_funcs.c index 40315ee85e89..8b14e8da747d 100644 --- a/cl/cl_funcs.c +++ b/cl/cl_funcs.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)cl_funcs.c 10.50 (Berkeley) 9/24/96"; +static const char sccsid[] = "$Id: cl_funcs.c,v 10.74 2012/10/11 10:30:16 zy Exp $"; #endif /* not lint */ #include @@ -19,11 +19,13 @@ static const char sccsid[] = "@(#)cl_funcs.c 10.50 (Berkeley) 9/24/96"; #include #include -#include #include #include #include #include +#ifdef HAVE_TERM_H +#include +#endif #include #include @@ -31,6 +33,57 @@ static const char sccsid[] = "@(#)cl_funcs.c 10.50 (Berkeley) 9/24/96"; #include "../vi/vi.h" #include "cl.h" +static void cl_rdiv __P((SCR *)); + +static int +addstr4(SCR *sp, void *str, size_t len, int wide) +{ + CL_PRIVATE *clp; + WINDOW *win; + size_t y, x; + int iv; + + clp = CLP(sp); + win = CLSP(sp) ? CLSP(sp) : stdscr; + + /* + * If ex isn't in control, it's the last line of the screen and + * it's a split screen, use inverse video. + */ + iv = 0; + getyx(win, y, x); + if (!F_ISSET(sp, SC_SCR_EXWROTE) && + y == RLNO(sp, LASTLINE(sp)) && IS_SPLIT(sp)) { + iv = 1; + (void)wstandout(win); + } + +#ifdef USE_WIDECHAR + if (wide) { + if (waddnwstr(win, str, len) == ERR) + return (1); + } else +#endif + if (waddnstr(win, str, len) == ERR) + return (1); + + if (iv) + (void)wstandend(win); + return (0); +} + +/* + * cl_waddstr -- + * Add len bytes from the string at the cursor, advancing the cursor. + * + * PUBLIC: int cl_waddstr __P((SCR *, const CHAR_T *, size_t)); + */ +int +cl_waddstr(SCR *sp, const CHAR_T *str, size_t len) +{ + return addstr4(sp, (void *)str, len, 1); +} + /* * cl_addstr -- * Add len bytes from the string at the cursor, advancing the cursor. @@ -38,35 +91,9 @@ static const char sccsid[] = "@(#)cl_funcs.c 10.50 (Berkeley) 9/24/96"; * PUBLIC: int cl_addstr __P((SCR *, const char *, size_t)); */ int -cl_addstr(sp, str, len) - SCR *sp; - const char *str; - size_t len; +cl_addstr(SCR *sp, const char *str, size_t len) { - CL_PRIVATE *clp; - size_t oldy, oldx; - int iv; - - clp = CLP(sp); - - /* - * If ex isn't in control, it's the last line of the screen and - * it's a split screen, use inverse video. - */ - iv = 0; - getyx(stdscr, oldy, oldx); - if (!F_ISSET(sp, SC_SCR_EXWROTE) && - oldy == RLNO(sp, LASTLINE(sp)) && IS_SPLIT(sp)) { - iv = 1; - (void)standout(); - } - - if (addnstr(str, len) == ERR) - return (1); - - if (iv) - (void)standend(); - return (0); + return addstr4(sp, (void *)str, len, 0); } /* @@ -76,14 +103,13 @@ cl_addstr(sp, str, len) * PUBLIC: int cl_attr __P((SCR *, scr_attr_t, int)); */ int -cl_attr(sp, attribute, on) - SCR *sp; - scr_attr_t attribute; - int on; +cl_attr(SCR *sp, scr_attr_t attribute, int on) { CL_PRIVATE *clp; + WINDOW *win; clp = CLP(sp); + win = CLSP(sp) ? CLSP(sp) : stdscr; switch (attribute) { case SA_ALTERNATE: @@ -146,9 +172,9 @@ cl_attr(sp, attribute, on) (void)fflush(stdout); } else { if (on) - (void)standout(); + (void)wstandout(win); else - (void)standend(); + (void)wstandend(win); } break; default: @@ -164,9 +190,7 @@ cl_attr(sp, attribute, on) * PUBLIC: int cl_baud __P((SCR *, u_long *)); */ int -cl_baud(sp, ratep) - SCR *sp; - u_long *ratep; +cl_baud(SCR *sp, u_long *ratep) { CL_PRIVATE *clp; @@ -207,10 +231,9 @@ cl_baud(sp, ratep) * PUBLIC: int cl_bell __P((SCR *)); */ int -cl_bell(sp) - SCR *sp; +cl_bell(SCR *sp) { - if (F_ISSET(sp, SC_EX | SC_SCR_EXWROTE)) + if (F_ISSET(sp, SC_EX | SC_SCR_EXWROTE | SC_SCR_EX)) (void)write(STDOUT_FILENO, "\07", 1); /* \a */ else { /* @@ -232,10 +255,26 @@ cl_bell(sp) * PUBLIC: int cl_clrtoeol __P((SCR *)); */ int -cl_clrtoeol(sp) - SCR *sp; +cl_clrtoeol(SCR *sp) { - return (clrtoeol() == ERR); + WINDOW *win; +#if 0 + size_t spcnt, y, x; +#endif + + win = CLSP(sp) ? CLSP(sp) : stdscr; + +#if 0 + if (IS_VSPLIT(sp)) { + /* The cursor must be returned to its original position. */ + getyx(win, y, x); + for (spcnt = (sp->coff + sp->cols) - x; spcnt > 0; --spcnt) + (void)waddch(win, ' '); + (void)wmove(win, y, x); + return (0); + } else +#endif + return (wclrtoeol(win) == ERR); } /* @@ -245,10 +284,10 @@ cl_clrtoeol(sp) * PUBLIC: int cl_cursor __P((SCR *, size_t *, size_t *)); */ int -cl_cursor(sp, yp, xp) - SCR *sp; - size_t *yp, *xp; +cl_cursor(SCR *sp, size_t *yp, size_t *xp) { + WINDOW *win; + win = CLSP(sp) ? CLSP(sp) : stdscr; /* * The curses screen support splits a single underlying curses screen * into multiple screens to support split screen semantics. For this @@ -256,8 +295,11 @@ cl_cursor(sp, yp, xp) * current screen, and not absolute. Screens that implement the split * using physically distinct screens won't need this hack. */ - getyx(stdscr, *yp, *xp); - *yp -= sp->woff; + getyx(win, *yp, *xp); + /* + *yp -= sp->roff; + *xp -= sp->coff; + */ return (0); } @@ -268,14 +310,14 @@ cl_cursor(sp, yp, xp) * PUBLIC: int cl_deleteln __P((SCR *)); */ int -cl_deleteln(sp) - SCR *sp; +cl_deleteln(SCR *sp) { - CHAR_T ch; CL_PRIVATE *clp; - size_t col, lno, spcnt, oldy, oldx; + WINDOW *win; + size_t y, x; clp = CLP(sp); + win = CLSP(sp) ? CLSP(sp) : stdscr; /* * This clause is required because the curses screen uses reverse @@ -284,45 +326,58 @@ cl_deleteln(sp) * * If the bottom line was in reverse video, rewrite it in normal * video before it's scrolled. - * - * Check for the existence of a chgat function; XSI requires it, but - * historic implementations of System V curses don't. If it's not - * a #define, we'll fall back to doing it by hand, which is slow but - * acceptable. - * - * By hand means walking through the line, retrieving and rewriting - * each character. Curses has no EOL marker, so track strings of - * spaces, and copy the trailing spaces only if there's a non-space - * character following. */ if (!F_ISSET(sp, SC_SCR_EXWROTE) && IS_SPLIT(sp)) { - getyx(stdscr, oldy, oldx); -#ifdef mvchgat - mvchgat(RLNO(sp, LASTLINE(sp)), 0, -1, A_NORMAL, 0, NULL); -#else - for (lno = RLNO(sp, LASTLINE(sp)), col = spcnt = 0;;) { - (void)move(lno, col); - ch = winch(stdscr); - if (isblank(ch)) - ++spcnt; - else { - (void)move(lno, col - spcnt); - for (; spcnt > 0; --spcnt) - (void)addch(' '); - (void)addch(ch); - } - if (++col >= sp->cols) - break; - } -#endif - (void)move(oldy, oldx); + getyx(win, y, x); + mvwchgat(win, RLNO(sp, LASTLINE(sp)), 0, -1, A_NORMAL, 0, NULL); + (void)wmove(win, y, x); } /* * The bottom line is expected to be blank after this operation, * and other screens must support that semantic. */ - return (deleteln() == ERR); + return (wdeleteln(win) == ERR); +} + +/* + * cl_discard -- + * Discard a screen. + * + * PUBLIC: int cl_discard __P((SCR *, SCR **)); + */ +int +cl_discard(SCR *discardp, SCR **acquirep) +{ + CL_PRIVATE *clp; + SCR* tsp; + + if (discardp) { + clp = CLP(discardp); + F_SET(clp, CL_LAYOUT); + + if (CLSP(discardp)) { + delwin(CLSP(discardp)); + discardp->cl_private = NULL; + } + } + + /* no screens got a piece; we're done */ + if (!acquirep) + return 0; + + for (; (tsp = *acquirep) != NULL; ++acquirep) { + clp = CLP(tsp); + F_SET(clp, CL_LAYOUT); + + if (CLSP(tsp)) + delwin(CLSP(tsp)); + tsp->cl_private = subwin(stdscr, tsp->rows, tsp->cols, + tsp->roff, tsp->coff); + } + + /* discardp is going away, acquirep is taking up its space. */ + return (0); } /* @@ -333,9 +388,7 @@ cl_deleteln(sp) * PUBLIC: int cl_ex_adjust __P((SCR *, exadj_t)); */ int -cl_ex_adjust(sp, action) - SCR *sp; - exadj_t action; +cl_ex_adjust(SCR *sp, exadj_t action) { CL_PRIVATE *clp; int cnt; @@ -390,14 +443,15 @@ cl_ex_adjust(sp, action) * PUBLIC: int cl_insertln __P((SCR *)); */ int -cl_insertln(sp) - SCR *sp; +cl_insertln(SCR *sp) { + WINDOW *win; + win = CLSP(sp) ? CLSP(sp) : stdscr; /* * The current line is expected to be blank after this operation, * and the screen must support that semantic. */ - return (insertln() == ERR); + return (winsertln(win) == ERR); } /* @@ -407,11 +461,7 @@ cl_insertln(sp) * PUBLIC: int cl_keyval __P((SCR *, scr_keyval_t, CHAR_T *, int *)); */ int -cl_keyval(sp, val, chp, dnep) - SCR *sp; - scr_keyval_t val; - CHAR_T *chp; - int *dnep; +cl_keyval(SCR *sp, scr_keyval_t val, CHAR_T *chp, int *dnep) { CL_PRIVATE *clp; @@ -449,14 +499,14 @@ cl_keyval(sp, val, chp, dnep) * PUBLIC: int cl_move __P((SCR *, size_t, size_t)); */ int -cl_move(sp, lno, cno) - SCR *sp; - size_t lno, cno; +cl_move(SCR *sp, size_t lno, size_t cno) { + WINDOW *win; + win = CLSP(sp) ? CLSP(sp) : stdscr; /* See the comment in cl_cursor. */ - if (move(RLNO(sp, lno), cno) == ERR) { - msgq(sp, M_ERR, - "Error: move: l(%u) c(%u) o(%u)", lno, cno, sp->woff); + if (wmove(win, RLNO(sp, lno), RCNO(sp, cno)) == ERR) { + msgq(sp, M_ERR, "Error: move: l(%zu + %zu) c(%zu + %zu)", + lno, sp->roff, cno, sp->coff); return (1); } return (0); @@ -469,13 +519,17 @@ cl_move(sp, lno, cno) * PUBLIC: int cl_refresh __P((SCR *, int)); */ int -cl_refresh(sp, repaint) - SCR *sp; - int repaint; +cl_refresh(SCR *sp, int repaint) { + GS *gp; CL_PRIVATE *clp; + WINDOW *win; + SCR *psp, *tsp; + size_t y, x; + gp = sp->gp; clp = CLP(sp); + win = CLSP(sp) ? CLSP(sp) : stdscr; /* * If we received a killer signal, we're done, there's no point @@ -488,13 +542,57 @@ cl_refresh(sp, repaint) * If repaint is set, the editor is telling us that we don't know * what's on the screen, so we have to repaint from scratch. * + * If repaint set or the screen layout changed, we need to redraw + * any lines separating vertically split screens. If the horizontal + * offsets are the same, then the split was vertical, and need to + * draw a dividing line. + */ + if (repaint || F_ISSET(clp, CL_LAYOUT)) { + getyx(stdscr, y, x); + for (psp = sp; psp != NULL; psp = TAILQ_NEXT(psp, q)) + for (tsp = TAILQ_NEXT(psp, q); tsp != NULL; + tsp = TAILQ_NEXT(tsp, q)) + if (psp->roff == tsp->roff) { + if (psp->coff + psp->cols + 1 == tsp->coff) + cl_rdiv(psp); + else + if (tsp->coff + tsp->cols + 1 == psp->coff) + cl_rdiv(tsp); + } + (void)wmove(stdscr, y, x); + F_CLR(clp, CL_LAYOUT); + } + + /* * In the curses library, doing wrefresh(curscr) is okay, but the * screen flashes when we then apply the refresh() to bring it up * to date. So, use clearok(). */ if (repaint) clearok(curscr, 1); - return (refresh() == ERR); + /* + * Only do an actual refresh, when this is the focus window, + * i.e. the one holding the cursor. This assumes that refresh + * is called for that window after refreshing the others. + * This prevents the cursor being drawn in the other windows. + */ + return (wnoutrefresh(stdscr) == ERR || + wnoutrefresh(win) == ERR || + (sp == clp->focus && doupdate() == ERR)); +} + +/* + * cl_rdiv -- + * Draw a dividing line between two vertically split screens. + */ +static void +cl_rdiv(SCR *sp) +{ +#ifdef __NetBSD__ + mvvline(sp->roff, sp->cols + sp->coff, '|', sp->rows); +#else + mvvline(sp->roff, sp->cols + sp->coff, ACS_VLINE, sp->rows); +#endif } /* @@ -504,40 +602,97 @@ cl_refresh(sp, repaint) * PUBLIC: int cl_rename __P((SCR *, char *, int)); */ int -cl_rename(sp, name, on) - SCR *sp; - char *name; - int on; +cl_rename(SCR *sp, char *name, int on) { GS *gp; CL_PRIVATE *clp; - char *ttype; + FILE *pfp; + char buf[256], *s, *e; + char * wid; + char cmd[64]; gp = sp->gp; clp = CLP(sp); - ttype = OG_STR(gp, GO_TERM); - /* * XXX * We can only rename windows for xterm. */ if (on) { - if (F_ISSET(clp, CL_RENAME_OK) && - !strncmp(ttype, "xterm", sizeof("xterm") - 1)) { - F_SET(clp, CL_RENAME); - (void)printf(XTERM_RENAME, name); - (void)fflush(stdout); + clp->focus = sp; + if (!F_ISSET(clp, CL_RENAME_OK) || + strncmp(OG_STR(gp, GO_TERM), "xterm", 5)) + return (0); + + if (clp->oname == NULL && (wid = getenv("WINDOWID"))) { + snprintf(cmd, sizeof(cmd), "xprop -id %s WM_NAME", wid); + if ((pfp = popen(cmd, "r")) == NULL) + goto rename; + if (fgets(buf, sizeof(buf), pfp) == NULL) { + pclose(pfp); + goto rename; + } + pclose(pfp); + if ((s = strchr(buf, '"')) != NULL && + (e = strrchr(buf, '"')) != NULL) + clp->oname = strndup(s + 1, e - s - 1); } + +rename: cl_setname(gp, name); + + F_SET(clp, CL_RENAME); } else if (F_ISSET(clp, CL_RENAME)) { + cl_setname(gp, clp->oname); + F_CLR(clp, CL_RENAME); - (void)printf(XTERM_RENAME, ttype); - (void)fflush(stdout); } return (0); } +/* + * cl_setname -- + * Set a X11 icon/window name. + * + * PUBLIC: void cl_setname __P((GS *, char *)); + */ +void +cl_setname(GS *gp, char *name) +{ +/* X11 xterm escape sequence to rename the icon/window. */ +#define XTERM_RENAME "\033]0;%s\007" + + (void)printf(XTERM_RENAME, name == NULL ? OG_STR(gp, GO_TERM) : name); + (void)fflush(stdout); +#undef XTERM_RENAME +} + +/* + * cl_split -- + * Split a screen. + * + * PUBLIC: int cl_split __P((SCR *, SCR *)); + */ +int +cl_split(SCR *origp, SCR *newp) +{ + CL_PRIVATE *clp; + + clp = CLP(origp); + F_SET(clp, CL_LAYOUT); + + if (CLSP(origp)) + delwin(CLSP(origp)); + + origp->cl_private = subwin(stdscr, origp->rows, origp->cols, + origp->roff, origp->coff); + newp->cl_private = subwin(stdscr, newp->rows, newp->cols, + newp->roff, newp->coff); + + /* origp is the original screen, giving up space to newp. */ + return (0); +} + /* * cl_suspend -- * Suspend a screen. @@ -545,18 +700,18 @@ cl_rename(sp, name, on) * PUBLIC: int cl_suspend __P((SCR *, int *)); */ int -cl_suspend(sp, allowedp) - SCR *sp; - int *allowedp; +cl_suspend(SCR *sp, int *allowedp) { struct termios t; CL_PRIVATE *clp; + WINDOW *win; GS *gp; - size_t oldy, oldx; + size_t y, x; int changed; gp = sp->gp; clp = CLP(sp); + win = CLSP(sp) ? CLSP(sp) : stdscr; *allowedp = 1; /* @@ -596,9 +751,9 @@ cl_suspend(sp, allowedp) * Not sure this is necessary in System V implementations, but it * shouldn't hurt. */ - getyx(stdscr, oldy, oldx); - (void)move(LINES - 1, 0); - (void)refresh(); + getyx(win, y, x); + (void)wmove(win, LINES - 1, 0); + (void)wrefresh(win); /* * Temporarily end the screen. System V introduced a semantic where @@ -607,10 +762,8 @@ cl_suspend(sp, allowedp) * restarting after endwin(), so we have to do what clean up we can * without calling it. */ -#ifdef HAVE_BSD_CURSES /* Save the terminal settings. */ (void)tcgetattr(STDIN_FILENO, &t); -#endif /* Restore the cursor keys to normal mode. */ (void)keypad(stdscr, FALSE); @@ -618,11 +771,8 @@ cl_suspend(sp, allowedp) /* Restore the window name. */ (void)cl_rename(sp, NULL, 0); -#ifdef HAVE_BSD_CURSES - (void)cl_attr(sp, SA_ALTERNATE, 0); -#else (void)endwin(); -#endif + /* * XXX * Restore the original terminal settings. This is bad -- the @@ -647,14 +797,11 @@ cl_suspend(sp, allowedp) return (0); } -#ifdef HAVE_BSD_CURSES /* Restore terminal settings. */ + wrefresh(win); /* Needed on SunOs/Solaris ? */ if (F_ISSET(clp, CL_STDIN_TTY)) (void)tcsetattr(STDIN_FILENO, TCSASOFT | TCSADRAIN, &t); - (void)cl_attr(sp, SA_ALTERNATE, 1); -#endif - /* Set the window name. */ (void)cl_rename(sp, sp->frp->name, 1); @@ -662,7 +809,7 @@ cl_suspend(sp, allowedp) (void)keypad(stdscr, TRUE); /* Refresh and repaint the screen. */ - (void)move(oldy, oldx); + (void)wmove(win, y, x); (void)cl_refresh(sp, 1); /* If the screen changed size, set the SIGWINCH bit. */ @@ -681,7 +828,7 @@ cl_suspend(sp, allowedp) * PUBLIC: void cl_usage __P((void)); */ void -cl_usage() +cl_usage(void) { #define USAGE "\ usage: ex [-eFRrSsv] [-c command] [-t tag] [-w size] [file ...]\n\ @@ -695,8 +842,9 @@ usage: vi [-eFlRrSv] [-c command] [-t tag] [-w size] [file ...]\n" * gdbrefresh -- * Stub routine so can flush out curses screen changes using gdb. */ -int -gdbrefresh() +static int + __attribute__((unused)) +gdbrefresh(void) { refresh(); return (0); /* XXX Convince gdb to run it. */ diff --git a/cl/cl_main.c b/cl/cl_main.c index 2889f709cbb2..98f13136a061 100644 --- a/cl/cl_main.c +++ b/cl/cl_main.c @@ -10,27 +10,26 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)cl_main.c 10.36 (Berkeley) 10/14/96"; +static const char sccsid[] = "$Id: cl_main.c,v 10.55 2011/08/15 19:52:28 zy Exp $"; #endif /* not lint */ #include #include #include -#include #include #include #include #include #include #include +#ifdef HAVE_TERM_H +#include +#endif #include #include #include "../common/common.h" -#ifdef RUNNING_IP -#include "../ip/ip.h" -#endif #include "cl.h" #include "pathnames.h" @@ -50,16 +49,14 @@ static void term_init __P((char *, char *)); * This is the main loop for the standalone curses editor. */ int -main(argc, argv) - int argc; - char *argv[]; +main(int argc, char **argv) { static int reenter; CL_PRIVATE *clp; GS *gp; size_t rows, cols; int rval; - char *ip_arg, **p_av, **t_av, *ttype; + char **p_av, **t_av, *ttype; /* If loaded at 0 and jumping through a NULL pointer, stop. */ if (reenter++) @@ -73,8 +70,6 @@ main(argc, argv) * no way to portably call getopt twice, so arguments parsed here must * be removed from the argument list. */ -#ifdef RUNNING_IP - ip_arg = NULL; for (p_av = t_av = argv;;) { if (*t_av == NULL) { *p_av = NULL; @@ -84,33 +79,9 @@ main(argc, argv) while ((*p_av++ = *t_av++) != NULL); break; } - if (!memcmp(*t_av, "-I", sizeof("-I") - 1)) { - if (t_av[0][2] != '\0') { - ip_arg = t_av[0] + 2; - ++t_av; - --argc; - continue; - } - if (t_av[1] != NULL) { - ip_arg = t_av[1]; - t_av += 2; - argc -= 2; - continue; - } - } *p_av++ = *t_av++; } - /* - * If we're being called as an editor library, we're done here, we - * get loaded with the curses screen, we don't share much code. - */ - if (ip_arg != NULL) - exit (ip_main(argc, argv, gp, ip_arg)); -#else - ip_arg = argv[0]; -#endif - /* Create and initialize the CL_PRIVATE structure. */ clp = cl_init(gp); @@ -164,10 +135,8 @@ main(argc, argv) * XXX * Reset the X11 xterm icon/window name. */ - if (F_ISSET(clp, CL_RENAME)) { - (void)printf(XTERM_RENAME, ttype); - (void)fflush(stdout); - } + if (F_ISSET(clp, CL_RENAME)) + cl_setname(gp, clp->oname); /* If a killer signal arrived, pretend we just got it. */ if (clp->killersig) { @@ -178,7 +147,10 @@ main(argc, argv) /* Free the global and CL private areas. */ #if defined(DEBUG) || defined(PURIFY) || defined(LIBRARY) + if (clp->oname != NULL) + free(clp->oname); free(clp); + free(OG_STR(gp, GO_TERM)); free(gp); #endif @@ -190,10 +162,8 @@ main(argc, argv) * Create and partially initialize the GS structure. */ static GS * -gs_init(name) - char *name; +gs_init(char *name) { - CL_PRIVATE *clp; GS *gp; char *p; @@ -206,7 +176,6 @@ gs_init(name) if (gp == NULL) perr(name, NULL); - gp->progname = name; return (gp); } @@ -216,8 +185,7 @@ gs_init(name) * Create and partially initialize the CL structure. */ static CL_PRIVATE * -cl_init(gp) - GS *gp; +cl_init(GS *gp) { CL_PRIVATE *clp; int fd; @@ -265,8 +233,7 @@ tcfail: perr(gp->progname, "tcgetattr"); * Initialize terminal information. */ static void -term_init(name, ttype) - char *name, *ttype; +term_init(char *name, char *ttype) { int err; @@ -287,8 +254,7 @@ term_init(name, ttype) #define GLOBAL_CLP \ CL_PRIVATE *clp = GCLP(__global_list); static void -h_hup(signo) - int signo; +h_hup(int signo) { GLOBAL_CLP; @@ -297,8 +263,7 @@ h_hup(signo) } static void -h_int(signo) - int signo; +h_int(int signo) { GLOBAL_CLP; @@ -306,8 +271,7 @@ h_int(signo) } static void -h_term(signo) - int signo; +h_term(int signo) { GLOBAL_CLP; @@ -316,8 +280,7 @@ h_term(signo) } static void -h_winch(signo) - int signo; +h_winch(int signo) { GLOBAL_CLP; @@ -332,9 +295,7 @@ h_winch(signo) * PUBLIC: int sig_init __P((GS *, SCR *)); */ int -sig_init(gp, sp) - GS *gp; - SCR *sp; +sig_init(GS *gp, SCR *sp) { CL_PRIVATE *clp; @@ -376,10 +337,7 @@ sig_init(gp, sp) * Set a signal handler. */ static int -setsig(signo, oactp, handler) - int signo; - struct sigaction *oactp; - void (*handler) __P((int)); +setsig(int signo, struct sigaction *oactp, void (*handler) (int)) { struct sigaction act; @@ -410,8 +368,7 @@ setsig(signo, oactp, handler) * End signal setup. */ static void -sig_end(gp) - GS *gp; +sig_end(GS *gp) { CL_PRIVATE *clp; @@ -429,17 +386,20 @@ sig_end(gp) * Initialize the standard curses functions. */ static void -cl_func_std(gp) - GS *gp; +cl_func_std(GS *gp) { gp->scr_addstr = cl_addstr; + gp->scr_waddstr = cl_waddstr; gp->scr_attr = cl_attr; gp->scr_baud = cl_baud; gp->scr_bell = cl_bell; gp->scr_busy = NULL; + gp->scr_child = NULL; gp->scr_clrtoeol = cl_clrtoeol; gp->scr_cursor = cl_cursor; gp->scr_deleteln = cl_deleteln; + gp->scr_reply = NULL; + gp->scr_discard = cl_discard; gp->scr_event = cl_event; gp->scr_ex_adjust = cl_ex_adjust; gp->scr_fmap = cl_fmap; @@ -451,6 +411,7 @@ cl_func_std(gp) gp->scr_refresh = cl_refresh; gp->scr_rename = cl_rename; gp->scr_screen = cl_screen; + gp->scr_split = cl_split; gp->scr_suspend = cl_suspend; gp->scr_usage = cl_usage; } @@ -460,8 +421,7 @@ cl_func_std(gp) * Print system error. */ static void -perr(name, msg) - char *name, *msg; +perr(char *name, char *msg) { (void)fprintf(stderr, "%s:", name); if (msg != NULL) diff --git a/cl/cl_read.c b/cl/cl_read.c index 8a95a77b2438..410cdd4318cc 100644 --- a/cl/cl_read.c +++ b/cl/cl_read.c @@ -10,18 +10,14 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)cl_read.c 10.15 (Berkeley) 9/24/96"; +static const char sccsid[] = "$Id: cl_read.c,v 10.30 2012/07/12 18:28:58 zy Exp $"; #endif /* not lint */ #include #include -#ifdef HAVE_SYS_SELECT_H #include -#endif -#include #include -#include #include #include #include @@ -35,8 +31,12 @@ static const char sccsid[] = "@(#)cl_read.c 10.15 (Berkeley) 9/24/96"; #include "../ex/script.h" #include "cl.h" +/* Pollution by Solaris curses. */ +#undef columns +#undef lines + static input_t cl_read __P((SCR *, - u_int32_t, CHAR_T *, size_t, int *, struct timeval *)); + u_int32_t, char *, size_t, int *, struct timeval *)); static int cl_resize __P((SCR *, size_t, size_t)); /* @@ -46,16 +46,15 @@ static int cl_resize __P((SCR *, size_t, size_t)); * PUBLIC: int cl_event __P((SCR *, EVENT *, u_int32_t, int)); */ int -cl_event(sp, evp, flags, ms) - SCR *sp; - EVENT *evp; - u_int32_t flags; - int ms; +cl_event(SCR *sp, EVENT *evp, u_int32_t flags, int ms) { struct timeval t, *tp; CL_PRIVATE *clp; size_t lines, columns; - int changed, nr; + int changed, nr = 0; + CHAR_T *wp; + size_t wlen; + int rc; /* * Queue signal based events. We never clear SIGHUP or SIGTERM events, @@ -102,12 +101,25 @@ retest: if (LF_ISSET(EC_INTERRUPT) || F_ISSET(clp, CL_SIGINT)) { } /* Read input characters. */ +read: switch (cl_read(sp, LF_ISSET(EC_QUOTED | EC_RAW), - clp->ibuf, sizeof(clp->ibuf), &nr, tp)) { + clp->ibuf + clp->skip, SIZE(clp->ibuf) - clp->skip, &nr, tp)) { case INP_OK: - evp->e_csp = clp->ibuf; - evp->e_len = nr; + rc = INPUT2INT5(sp, clp->cw, clp->ibuf, nr + clp->skip, + wp, wlen); + evp->e_csp = wp; + evp->e_len = wlen; evp->e_event = E_STRING; + if (rc < 0) { + int n = -rc; + memmove(clp->ibuf, clp->ibuf + nr + clp->skip - n, n); + clp->skip = n; + if (wlen == 0) + goto read; + } else if (rc == 0) + clp->skip = 0; + else + msgq(sp, M_ERR, "323|Invalid input. Truncated."); break; case INP_EOF: evp->e_event = E_EOF; @@ -131,19 +143,11 @@ retest: if (LF_ISSET(EC_INTERRUPT) || F_ISSET(clp, CL_SIGINT)) { * Read characters from the input. */ static input_t -cl_read(sp, flags, bp, blen, nrp, tp) - SCR *sp; - u_int32_t flags; - CHAR_T *bp; - size_t blen; - int *nrp; - struct timeval *tp; +cl_read(SCR *sp, u_int32_t flags, char *bp, size_t blen, int *nrp, struct timeval *tp) { struct termios term1, term2; - struct timeval poll; CL_PRIVATE *clp; GS *gp; - SCR *tsp; fd_set rdfd; input_t rval; int maxfd, nr, term_reset; @@ -175,13 +179,10 @@ cl_read(sp, flags, bp, blen, nrp, tp) * 2: A read with an associated timeout, e.g., trying to complete * a map sequence. If input exists, we fall into #3. */ - FD_ZERO(&rdfd); - poll.tv_sec = 0; - poll.tv_usec = 0; if (tp != NULL) { + FD_ZERO(&rdfd); FD_SET(STDIN_FILENO, &rdfd); - switch (select(STDIN_FILENO + 1, - &rdfd, NULL, NULL, tp == NULL ? &poll : tp)) { + switch (select(STDIN_FILENO + 1, &rdfd, NULL, NULL, tp)) { case 0: return (INP_TIMEOUT); case -1: @@ -225,13 +226,11 @@ cl_read(sp, flags, bp, blen, nrp, tp) loop: FD_ZERO(&rdfd); FD_SET(STDIN_FILENO, &rdfd); maxfd = STDIN_FILENO; - for (tsp = gp->dq.cqh_first; - tsp != (void *)&gp->dq; tsp = tsp->q.cqe_next) - if (F_ISSET(sp, SC_SCRIPT)) { - FD_SET(sp->script->sh_master, &rdfd); - if (sp->script->sh_master > maxfd) - maxfd = sp->script->sh_master; - } + if (F_ISSET(sp, SC_SCRIPT)) { + FD_SET(sp->script->sh_master, &rdfd); + if (sp->script->sh_master > maxfd) + maxfd = sp->script->sh_master; + } switch (select(maxfd + 1, &rdfd, NULL, NULL, NULL)) { case 0: abort(); @@ -309,12 +308,10 @@ err: if (errno == EINTR) * Reset the options for a resize event. */ static int -cl_resize(sp, lines, columns) - SCR *sp; - size_t lines, columns; +cl_resize(SCR *sp, size_t lines, size_t columns) { ARGS *argv[2], a, b; - char b1[1024]; + CHAR_T b1[1024]; a.bp = b1; b.bp = NULL; @@ -322,12 +319,10 @@ cl_resize(sp, lines, columns) argv[0] = &a; argv[1] = &b; - (void)snprintf(b1, sizeof(b1), "lines=%lu", (u_long)lines); - a.len = strlen(b1); + a.len = SPRINTF(b1, sizeof(b1), L("lines=%lu"), (u_long)lines); if (opts_set(sp, argv, NULL)) return (1); - (void)snprintf(b1, sizeof(b1), "columns=%lu", (u_long)columns); - a.len = strlen(b1); + a.len = SPRINTF(b1, sizeof(b1), L("columns=%lu"), (u_long)columns); if (opts_set(sp, argv, NULL)) return (1); return (0); diff --git a/cl/cl_screen.c b/cl/cl_screen.c index 2ce58e80cc78..91ff2789961e 100644 --- a/cl/cl_screen.c +++ b/cl/cl_screen.c @@ -10,19 +10,22 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)cl_screen.c 10.49 (Berkeley) 9/24/96"; +static const char sccsid[] = "$Id: cl_screen.c,v 10.56 2002/05/03 19:59:44 skimo Exp $"; #endif /* not lint */ #include #include +#include #include -#include #include #include #include #include #include +#ifdef HAVE_TERM_H +#include +#endif #include #include @@ -43,26 +46,30 @@ static int cl_putenv __P((char *, char *, u_long)); * PUBLIC: int cl_screen __P((SCR *, u_int32_t)); */ int -cl_screen(sp, flags) - SCR *sp; - u_int32_t flags; +cl_screen(SCR *sp, u_int32_t flags) { CL_PRIVATE *clp; + WINDOW *win; GS *gp; gp = sp->gp; clp = CLP(sp); + win = CLSP(sp) ? CLSP(sp) : stdscr; /* See if the current information is incorrect. */ if (F_ISSET(gp, G_SRESTART)) { + if (CLSP(sp)) { + delwin(CLSP(sp)); + sp->cl_private = NULL; + } if (cl_quit(gp)) return (1); F_CLR(gp, G_SRESTART); } /* See if we're already in the right mode. */ - if (LF_ISSET(SC_EX) && F_ISSET(sp, SC_SCR_EX) || - LF_ISSET(SC_VI) && F_ISSET(sp, SC_SCR_VI)) + if ((LF_ISSET(SC_EX) && F_ISSET(sp, SC_SCR_EX)) || + (LF_ISSET(SC_VI) && F_ISSET(sp, SC_SCR_VI))) return (0); /* @@ -90,12 +97,12 @@ cl_screen(sp, flags) if (F_ISSET(sp, SC_SCR_VI)) { F_CLR(sp, SC_SCR_VI); - if (sp->q.cqe_next != (void *)&gp->dq) { - (void)move(RLNO(sp, sp->rows), 0); - clrtobot(); + if (TAILQ_NEXT(sp, q) != NULL) { + (void)wmove(win, RLNO(sp, sp->rows), 0); + wclrtobot(win); } - (void)move(RLNO(sp, sp->rows) - 1, 0); - refresh(); + (void)wmove(win, RLNO(sp, sp->rows) - 1, 0); + wrefresh(win); } /* Enter the requested mode. */ @@ -127,8 +134,7 @@ cl_screen(sp, flags) * PUBLIC: int cl_quit __P((GS *)); */ int -cl_quit(gp) - GS *gp; +cl_quit(GS *gp) { CL_PRIVATE *clp; int rval; @@ -178,8 +184,7 @@ cl_quit(gp) * Initialize the curses vi screen. */ static int -cl_vi_init(sp) - SCR *sp; +cl_vi_init(SCR *sp) { CL_PRIVATE *clp; GS *gp; @@ -242,6 +247,7 @@ cl_vi_init(sp) * The HP/UX newterm doesn't support the NULL first argument, so we * have to specify the terminal type. */ + (void)del_curterm(cur_term); errno = 0; if (newterm(ttype, stdout, stdin) == NULL) { if (errno) @@ -368,6 +374,8 @@ cl_vi_init(sp) fast: /* Set the terminal modes. */ if (tcsetattr(STDIN_FILENO, TCSASOFT | TCSADRAIN, &clp->vi_enter)) { + if (errno == EINTR) + goto fast; msgq(sp, M_SYSERR, "tcsetattr"); err: (void)cl_vi_end(sp->gp); return (1); @@ -380,8 +388,7 @@ err: (void)cl_vi_end(sp->gp); * Shutdown the vi screen. */ static int -cl_vi_end(gp) - GS *gp; +cl_vi_end(GS *gp) { CL_PRIVATE *clp; @@ -424,8 +431,7 @@ cl_vi_end(gp) * Initialize the ex screen. */ static int -cl_ex_init(sp) - SCR *sp; +cl_ex_init(SCR *sp) { CL_PRIVATE *clp; @@ -486,6 +492,8 @@ cl_ex_init(sp) #endif fast: if (tcsetattr(STDIN_FILENO, TCSADRAIN | TCSASOFT, &clp->ex_enter)) { + if (errno == EINTR) + goto fast; msgq(sp, M_SYSERR, "tcsetattr"); return (1); } @@ -497,8 +505,7 @@ fast: if (tcsetattr(STDIN_FILENO, TCSADRAIN | TCSASOFT, &clp->ex_enter)) { * Shutdown the ex screen. */ static int -cl_ex_end(gp) - GS *gp; +cl_ex_end(GS *gp) { CL_PRIVATE *clp; @@ -516,9 +523,7 @@ cl_ex_end(gp) * PUBLIC: int cl_getcap __P((SCR *, char *, char **)); */ int -cl_getcap(sp, name, elementp) - SCR *sp; - char *name, **elementp; +cl_getcap(SCR *sp, char *name, char **elementp) { size_t len; char *t; @@ -536,8 +541,7 @@ cl_getcap(sp, name, elementp) * Free any allocated termcap/terminfo strings. */ static void -cl_freecap(clp) - CL_PRIVATE *clp; +cl_freecap(CL_PRIVATE *clp) { if (clp->el != NULL) { free(clp->el); @@ -559,6 +563,12 @@ cl_freecap(clp) free(clp->smso); clp->smso = NULL; } + /* Required by libcursesw :) */ + if (clp->cw.bp1.c != NULL) { + free(clp->cw.bp1.c); + clp->cw.bp1.c = NULL; + clp->cw.blen1 = 0; + } } /* @@ -566,10 +576,7 @@ cl_freecap(clp) * Put a value into the environment. */ static int -cl_putenv(name, str, value) - char *name, *str; - u_long value; - +cl_putenv(char *name, char *str, u_long value) { char buf[40]; diff --git a/cl/cl_term.c b/cl/cl_term.c index c36bb3830e9f..3d8cdb2e2b52 100644 --- a/cl/cl_term.c +++ b/cl/cl_term.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)cl_term.c 10.22 (Berkeley) 9/15/96"; +static const char sccsid[] = "$Id: cl_term.c,v 10.33 2012/04/21 23:51:46 zy Exp $"; #endif /* not lint */ #include @@ -19,13 +19,15 @@ static const char sccsid[] = "@(#)cl_term.c 10.22 (Berkeley) 9/15/96"; #include #include -#include #include #include #include #include #include #include +#ifdef HAVE_TERM_H +#include +#endif #include #include @@ -82,20 +84,30 @@ static TKLIST const m2_tklist[] = { /* Input mappings (set or delete). */ * PUBLIC: int cl_term_init __P((SCR *)); */ int -cl_term_init(sp) - SCR *sp; +cl_term_init(SCR *sp) { KEYLIST *kp; SEQ *qp; TKLIST const *tkp; char *t; + CHAR_T name[60]; + CHAR_T output[5]; + CHAR_T ts[20]; + CHAR_T *wp; + size_t wlen; /* Command mappings. */ for (tkp = c_tklist; tkp->name != NULL; ++tkp) { if ((t = tigetstr(tkp->ts)) == NULL || t == (char *)-1) continue; - if (seq_set(sp, tkp->name, strlen(tkp->name), t, strlen(t), - tkp->output, strlen(tkp->output), SEQ_COMMAND, + CHAR2INT(sp, tkp->name, strlen(tkp->name), wp, wlen); + MEMCPY(name, wp, wlen); + CHAR2INT(sp, t, strlen(t), wp, wlen); + MEMCPY(ts, wp, wlen); + CHAR2INT(sp, tkp->output, strlen(tkp->output), wp, wlen); + MEMCPY(output, wp, wlen); + if (seq_set(sp, name, strlen(tkp->name), ts, strlen(t), + output, strlen(tkp->output), SEQ_COMMAND, SEQ_NOOVERWRITE | SEQ_SCREEN)) return (1); } @@ -109,8 +121,13 @@ cl_term_init(sp) break; if (kp == NULL) continue; - if (seq_set(sp, tkp->name, strlen(tkp->name), t, strlen(t), - &kp->ch, 1, SEQ_INPUT, SEQ_NOOVERWRITE | SEQ_SCREEN)) + CHAR2INT(sp, tkp->name, strlen(tkp->name), wp, wlen); + MEMCPY(name, wp, wlen); + CHAR2INT(sp, t, strlen(t), wp, wlen); + MEMCPY(ts, wp, wlen); + output[0] = (UCHAR_T)kp->ch; + if (seq_set(sp, name, strlen(tkp->name), ts, strlen(t), + output, 1, SEQ_INPUT, SEQ_NOOVERWRITE | SEQ_SCREEN)) return (1); } @@ -128,22 +145,33 @@ cl_term_init(sp) if (!strcmp(t, "\b")) continue; if (tkp->output == NULL) { - if (seq_set(sp, tkp->name, strlen(tkp->name), - t, strlen(t), NULL, 0, + CHAR2INT(sp, tkp->name, strlen(tkp->name), wp, wlen); + MEMCPY(name, wp, wlen); + CHAR2INT(sp, t, strlen(t), wp, wlen); + MEMCPY(ts, wp, wlen); + if (seq_set(sp, name, strlen(tkp->name), + ts, strlen(t), NULL, 0, SEQ_INPUT, SEQ_NOOVERWRITE | SEQ_SCREEN)) return (1); - } else - if (seq_set(sp, tkp->name, strlen(tkp->name), - t, strlen(t), tkp->output, strlen(tkp->output), + } else { + CHAR2INT(sp, tkp->name, strlen(tkp->name), wp, wlen); + MEMCPY(name, wp, wlen); + CHAR2INT(sp, t, strlen(t), wp, wlen); + MEMCPY(ts, wp, wlen); + CHAR2INT(sp, tkp->output, strlen(tkp->output), wp, wlen); + MEMCPY(output, wp, wlen); + if (seq_set(sp, name, strlen(tkp->name), + ts, strlen(t), output, strlen(tkp->output), SEQ_INPUT, SEQ_NOOVERWRITE | SEQ_SCREEN)) return (1); + } } /* * Rework any function key mappings that were set before the * screen was initialized. */ - for (qp = sp->gp->seqq.lh_first; qp != NULL; qp = qp->q.le_next) + SLIST_FOREACH(qp, sp->gp->seqq, q) if (F_ISSET(qp, SEQ_FUNCMAP)) (void)cl_pfmap(sp, qp->stype, qp->input, qp->ilen, qp->output, qp->olen); @@ -157,17 +185,16 @@ cl_term_init(sp) * PUBLIC: int cl_term_end __P((GS *)); */ int -cl_term_end(gp) - GS *gp; +cl_term_end(GS *gp) { SEQ *qp, *nqp; /* Delete screen specific mappings. */ - for (qp = gp->seqq.lh_first; qp != NULL; qp = nqp) { - nqp = qp->q.le_next; - if (F_ISSET(qp, SEQ_SCREEN)) - (void)seq_mdel(qp); - } + SLIST_FOREACH_SAFE(qp, gp->seqq, q, nqp) + if (F_ISSET(qp, SEQ_SCREEN)) { + SLIST_REMOVE_HEAD(gp->seqq, q); + (void)seq_free(qp); + } return (0); } @@ -178,11 +205,7 @@ cl_term_end(gp) * PUBLIC: int cl_fmap __P((SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t)); */ int -cl_fmap(sp, stype, from, flen, to, tlen) - SCR *sp; - seq_t stype; - CHAR_T *from, *to; - size_t flen, tlen; +cl_fmap(SCR *sp, seq_t stype, CHAR_T *from, size_t flen, CHAR_T *to, size_t tlen) { /* Ignore until the screen is running, do the real work then. */ if (F_ISSET(sp, SC_VI) && !F_ISSET(sp, SC_SCR_VI)) @@ -198,28 +221,33 @@ cl_fmap(sp, stype, from, flen, to, tlen) * Map a function key (private version). */ static int -cl_pfmap(sp, stype, from, flen, to, tlen) - SCR *sp; - seq_t stype; - CHAR_T *from, *to; - size_t flen, tlen; +cl_pfmap(SCR *sp, seq_t stype, CHAR_T *from, size_t flen, CHAR_T *to, size_t tlen) { size_t nlen; - char *p, keyname[64]; + char *p; + char name[64]; + CHAR_T keyname[64]; + CHAR_T ts[20]; + CHAR_T *wp; + size_t wlen; - (void)snprintf(keyname, sizeof(keyname), "kf%d", atoi(from + 1)); - if ((p = tigetstr(keyname)) == NULL || + (void)snprintf(name, sizeof(name), "kf%d", + (int)STRTOL(from+1,NULL,10)); + if ((p = tigetstr(name)) == NULL || p == (char *)-1 || strlen(p) == 0) p = NULL; if (p == NULL) { - msgq_str(sp, M_ERR, from, "233|This terminal has no %s key"); + msgq_wstr(sp, M_ERR, from, "233|This terminal has no %s key"); return (1); } - nlen = snprintf(keyname, - sizeof(keyname), "function key %d", atoi(from + 1)); + nlen = SPRINTF(keyname, + SIZE(keyname), L("function key %d"), + (int)STRTOL(from+1,NULL,10)); + CHAR2INT(sp, p, strlen(p), wp, wlen); + MEMCPY(ts, wp, wlen); return (seq_set(sp, keyname, nlen, - p, strlen(p), to, tlen, stype, SEQ_NOOVERWRITE | SEQ_SCREEN)); + ts, strlen(p), to, tlen, stype, SEQ_NOOVERWRITE | SEQ_SCREEN)); } /* @@ -229,11 +257,7 @@ cl_pfmap(sp, stype, from, flen, to, tlen) * PUBLIC: int cl_optchange __P((SCR *, int, char *, u_long *)); */ int -cl_optchange(sp, opt, str, valp) - SCR *sp; - int opt; - char *str; - u_long *valp; +cl_optchange(SCR *sp, int opt, char *str, u_long *valp) { CL_PRIVATE *clp; @@ -251,14 +275,10 @@ cl_optchange(sp, opt, str, valp) F_CLR(sp, SC_SCR_EX | SC_SCR_VI); break; case O_MESG: - (void)cl_omesg(sp, clp, !*valp); + (void)cl_omesg(sp, clp, *valp); break; case O_WINDOWNAME: if (*valp) { - F_CLR(clp, CL_RENAME_OK); - - (void)cl_rename(sp, NULL, 0); - } else { F_SET(clp, CL_RENAME_OK); /* @@ -267,6 +287,10 @@ cl_optchange(sp, opt, str, valp) */ if (sp->frp != NULL && sp->frp->name != NULL) (void)cl_rename(sp, sp->frp->name, 1); + } else { + F_CLR(clp, CL_RENAME_OK); + + (void)cl_rename(sp, NULL, 0); } break; } @@ -280,10 +304,7 @@ cl_optchange(sp, opt, str, valp) * PUBLIC: int cl_omesg __P((SCR *, CL_PRIVATE *, int)); */ int -cl_omesg(sp, clp, on) - SCR *sp; - CL_PRIVATE *clp; - int on; +cl_omesg(SCR *sp, CL_PRIVATE *clp, int on) { struct stat sb; char *tty; @@ -329,15 +350,9 @@ cl_omesg(sp, clp, on) * PUBLIC: int cl_ssize __P((SCR *, int, size_t *, size_t *, int *)); */ int -cl_ssize(sp, sigwinch, rowp, colp, changedp) - SCR *sp; - int sigwinch; - size_t *rowp, *colp; - int *changedp; +cl_ssize(SCR *sp, int sigwinch, size_t *rowp, size_t *colp, int *changedp) { -#ifdef TIOCGWINSZ struct winsize win; -#endif size_t col, row; int rval; char *p; @@ -358,12 +373,10 @@ cl_ssize(sp, sigwinch, rowp, colp, changedp) * Try TIOCGWINSZ. */ row = col = 0; -#ifdef TIOCGWINSZ if (ioctl(STDERR_FILENO, TIOCGWINSZ, &win) != -1) { row = win.ws_row; col = win.ws_col; } -#endif /* If here because of suspend or a signal, only trust TIOCGWINSZ. */ if (sigwinch) { /* @@ -453,8 +466,7 @@ noterm: if (row == 0) * PUBLIC: int cl_putchar __P((int)); */ int -cl_putchar(ch) - int ch; +cl_putchar(int ch) { return (putchar(ch)); } diff --git a/include/cl_extern.h b/cl/extern.h similarity index 63% rename from include/cl_extern.h rename to cl/extern.h index bafeb944e969..626f4fbea167 100644 --- a/include/cl_extern.h +++ b/cl/extern.h @@ -1,32 +1,4 @@ -#ifndef HAVE_CURSES_ADDNSTR -int addnstr __P((char *, int)); -#endif -#ifndef HAVE_CURSES_BEEP -void beep __P((void)); -#endif -#ifndef HAVE_CURSES_FLASH -void flash __P((void)); -#endif -#ifndef HAVE_CURSES_IDLOK -void idlok __P((WINDOW *, int)); -#endif -#ifndef HAVE_CURSES_KEYPAD -int keypad __P((void *, int)); -#endif -#ifndef HAVE_CURSES_NEWTERM -void *newterm __P((const char *, FILE *, FILE *)); -#endif -#ifndef HAVE_CURSES_SETUPTERM -void setupterm __P((char *, int, int *)); -#endif -#ifdef HAVE_CURSES_TIGETSTR -char *tigetstr(); -#else -char *tigetstr __P((char *)); -#endif -#ifndef HAVE_CURSES_TIGETSTR -int tigetnum __P((char *)); -#endif +int cl_waddstr __P((SCR *, const CHAR_T *, size_t)); int cl_addstr __P((SCR *, const char *, size_t)); int cl_attr __P((SCR *, scr_attr_t, int)); int cl_baud __P((SCR *, u_long *)); @@ -34,12 +6,15 @@ int cl_bell __P((SCR *)); int cl_clrtoeol __P((SCR *)); int cl_cursor __P((SCR *, size_t *, size_t *)); int cl_deleteln __P((SCR *)); +int cl_discard __P((SCR *, SCR **)); int cl_ex_adjust __P((SCR *, exadj_t)); int cl_insertln __P((SCR *)); int cl_keyval __P((SCR *, scr_keyval_t, CHAR_T *, int *)); int cl_move __P((SCR *, size_t, size_t)); int cl_refresh __P((SCR *, int)); int cl_rename __P((SCR *, char *, int)); +void cl_setname __P((GS *, char *)); +int cl_split __P((SCR *, SCR *)); int cl_suspend __P((SCR *, int *)); void cl_usage __P((void)); int sig_init __P((GS *, SCR *)); diff --git a/clib/env.c b/clib/env.c deleted file mode 100644 index 5a45dc1760a6..000000000000 --- a/clib/env.c +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (c) 1987, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "config.h" - -#if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)getenv.c 8.1 (Berkeley) 6/4/93"; -static const char sccsid[] = "@(#)setenv.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -#include -#include - -/* - * __findenv -- - * Returns pointer to value associated with name, if any, else NULL. - * Sets offset to be the offset of the name/value combination in the - * environmental array, for use by setenv(3) and unsetenv(3). - * Explicitly removes '=' in argument name. - * - * This routine *should* be a static; don't use it. - */ -static char * -__findenv(name, offset) - register char *name; - int *offset; -{ - extern char **environ; - register int len; - register char *np; - register char **p, *c; - - if (name == NULL || environ == NULL) - return (NULL); - for (np = name; *np && *np != '='; ++np) - continue; - len = np - name; - for (p = environ; (c = *p) != NULL; ++p) - if (strncmp(c, name, len) == 0 && c[len] == '=') { - *offset = p - environ; - return (c + len + 1); - } - return (NULL); -} - -#ifndef HAVE_SETENV -/* - * setenv -- - * Set the value of the environmental variable "name" to be - * "value". If rewrite is set, replace any current value. - * - * PUBLIC: #ifndef HAVE_SETENV - * PUBLIC: int setenv __P((const char *, const char *, int)); - * PUBLIC: #endif - */ -setenv(name, value, rewrite) - register char *name; - register char *value; - int rewrite; -{ - extern char **environ; - static int alloced; /* if allocated space before */ - register char *c; - int l_value, offset; - - if (*value == '=') /* no `=' in value */ - ++value; - l_value = strlen(value); - if ((c = __findenv(name, &offset))) { /* find if already exists */ - if (!rewrite) - return (0); - if (strlen(c) >= l_value) { /* old larger; copy over */ - while (*c++ = *value++); - return (0); - } - } else { /* create new slot */ - register int cnt; - register char **p; - - for (p = environ, cnt = 0; *p; ++p, ++cnt); - if (alloced) { /* just increase size */ - environ = (char **)realloc((char *)environ, - (size_t)(sizeof(char *) * (cnt + 2))); - if (!environ) - return (-1); - } - else { /* get new space */ - alloced = 1; /* copy old entries into it */ - p = malloc((size_t)(sizeof(char *) * (cnt + 2))); - if (!p) - return (-1); - memmove(p, environ, cnt * sizeof(char *)); - environ = p; - } - environ[cnt + 1] = NULL; - offset = cnt; - } - for (c = (char *)name; *c && *c != '='; ++c); /* no `=' in name */ - if (!(environ[offset] = /* name + `=' + value */ - malloc((size_t)((int)(c - name) + l_value + 2)))) - return (-1); - for (c = environ[offset]; (*c = *name++) && *c != '='; ++c); - for (*c++ = '='; *c++ = *value++;); - return (0); -} -#endif - -#ifndef HAVE_UNSETENV -/* - * unsetenv(name) -- - * Delete environmental variable "name". - * - * PUBLIC: #ifndef HAVE_UNSETENV - * PUBLIC: void unsetenv __P((const char *)); - * PUBLIC: #endif - */ -void -unsetenv(name) - char *name; -{ - extern char **environ; - register char **p; - int offset; - - while (__findenv(name, &offset)) /* if set multiple times */ - for (p = &environ[offset];; ++p) - if (!(*p = *(p + 1))) - break; -} -#endif diff --git a/clib/gethostname.c b/clib/gethostname.c deleted file mode 100644 index 5b8e85acf9f2..000000000000 --- a/clib/gethostname.c +++ /dev/null @@ -1,22 +0,0 @@ -#include "config.h" - -/* - * Solaris doesn't include the gethostname call by default. - */ -#include -#include - -#include - -/* - * PUBLIC: #ifndef HAVE_GETHOSTNAME - * PUBLIC: int gethostname __P((char *, int)); - * PUBLIC: #endif - */ -int -gethostname(host, len) - char *host; - int len; -{ - return (sysinfo(SI_HOSTNAME, host, len) == -1 ? -1 : 0); -} diff --git a/clib/getopt.c b/clib/getopt.c deleted file mode 100644 index b173017503e1..000000000000 --- a/clib/getopt.c +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (c) 1987, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "config.h" - -#if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)getopt.c 8.2 (Berkeley) 4/2/94"; -#endif /* LIBC_SCCS and not lint */ - -#include -#include -#include - -int opterr = 1, /* if error message should be printed */ - optind = 1, /* index into parent argv vector */ - optopt, /* character checked for validity */ - optreset; /* reset getopt */ -char *optarg; /* argument associated with option */ - -#define BADCH (int)'?' -#define BADARG (int)':' -#define EMSG "" - -/* - * getopt -- - * Parse argc/argv argument vector. - * - * PUBLIC: #ifndef HAVE_GETOPT - * PUBLIC: int getopt __P((int, char * const *, const char *)); - * PUBLIC: #endif - */ -int -getopt(nargc, nargv, ostr) - int nargc; - char * const *nargv; - const char *ostr; -{ - static char *progname; - static char *place = EMSG; /* option letter processing */ - char *oli; /* option letter list index */ - - if (!progname) { - if ((progname = strrchr(*nargv, '/')) == NULL) - progname = *nargv; - else - ++progname; - } - - if (optreset || !*place) { /* update scanning pointer */ - optreset = 0; - if (optind >= nargc || *(place = nargv[optind]) != '-') { - place = EMSG; - return (EOF); - } - if (place[1] && *++place == '-') { /* found "--" */ - ++optind; - place = EMSG; - return (EOF); - } - } /* option letter okay? */ - if ((optopt = (int)*place++) == (int)':' || - !(oli = strchr(ostr, optopt))) { - /* - * if the user didn't specify '-' as an option, - * assume it means EOF. - */ - if (optopt == (int)'-') - return (EOF); - if (!*place) - ++optind; - if (opterr && *ostr != ':') - (void)fprintf(stderr, - "%s: illegal option -- %c\n", progname, optopt); - return (BADCH); - } - if (*++oli != ':') { /* don't need argument */ - optarg = NULL; - if (!*place) - ++optind; - } - else { /* need an argument */ - if (*place) /* no white space */ - optarg = place; - else if (nargc <= ++optind) { /* no arg */ - place = EMSG; - if (*ostr == ':') - return (BADARG); - if (opterr) - (void)fprintf(stderr, - "%s: option requires an argument -- %c\n", - progname, optopt); - return (BADCH); - } - else /* white space */ - optarg = nargv[optind]; - place = EMSG; - ++optind; - } - return (optopt); /* dump back option letter */ -} diff --git a/clib/memmove.c b/clib/memmove.c deleted file mode 100644 index 7f4376272b67..000000000000 --- a/clib/memmove.c +++ /dev/null @@ -1,147 +0,0 @@ -/*- - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Chris Torek. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "config.h" - -#if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)bcopy.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -#include - -/* - * sizeof(word) MUST BE A POWER OF TWO - * SO THAT wmask BELOW IS ALL ONES - */ -typedef int word; /* "word" used for optimal copy speed */ - -#define wsize sizeof(word) -#define wmask (wsize - 1) - -/* - * Copy a block of memory, handling overlap. - * This is the routine that actually implements - * (the portable versions of) bcopy, memcpy, and memmove. - * - * PUBLIC: #ifndef HAVE_MEMCPY - * PUBLIC: void *memcpy __P((void *, const void *, size_t)); - * PUBLIC: #endif - * PUBLIC: #ifndef HAVE_MEMMOVE - * PUBLIC: void *memmove __P((void *, const void *, size_t)); - * PUBLIC: #endif - */ -#ifdef MEMCOPY -void * -memcpy(dst0, src0, length) -#else -#ifdef MEMMOVE -void * -memmove(dst0, src0, length) -#else -void -bcopy(src0, dst0, length) -#endif -#endif - void *dst0; - const void *src0; - register size_t length; -{ - register char *dst = dst0; - register const char *src = src0; - register size_t t; - - if (length == 0 || dst == src) /* nothing to do */ - goto done; - - /* - * Macros: loop-t-times; and loop-t-times, t>0 - */ -#define TLOOP(s) if (t) TLOOP1(s) -#define TLOOP1(s) do { s; } while (--t) - - if ((unsigned long)dst < (unsigned long)src) { - /* - * Copy forward. - */ - t = (int)src; /* only need low bits */ - if ((t | (int)dst) & wmask) { - /* - * Try to align operands. This cannot be done - * unless the low bits match. - */ - if ((t ^ (int)dst) & wmask || length < wsize) - t = length; - else - t = wsize - (t & wmask); - length -= t; - TLOOP1(*dst++ = *src++); - } - /* - * Copy whole words, then mop up any trailing bytes. - */ - t = length / wsize; - TLOOP(*(word *)dst = *(word *)src; src += wsize; dst += wsize); - t = length & wmask; - TLOOP(*dst++ = *src++); - } else { - /* - * Copy backwards. Otherwise essentially the same. - * Alignment works as before, except that it takes - * (t&wmask) bytes to align, not wsize-(t&wmask). - */ - src += length; - dst += length; - t = (int)src; - if ((t | (int)dst) & wmask) { - if ((t ^ (int)dst) & wmask || length <= wsize) - t = length; - else - t &= wmask; - length -= t; - TLOOP1(*--dst = *--src); - } - t = length / wsize; - TLOOP(src -= wsize; dst -= wsize; *(word *)dst = *(word *)src); - t = length & wmask; - TLOOP(*--dst = *--src); - } -done: -#if defined(MEMCOPY) || defined(MEMMOVE) - return (dst0); -#else - return; -#endif -} diff --git a/clib/memset.c b/clib/memset.c deleted file mode 100644 index 0013d66df06d..000000000000 --- a/clib/memset.c +++ /dev/null @@ -1,137 +0,0 @@ -/*- - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Mike Hibler and Chris Torek. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "config.h" - -#if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)memset.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -#include - -#include -#include - -/* - * PUBLIC: #ifndef HAVE_MEMSET - * PUBLIC: void *memset __P((void *, int, size_t)); - * PUBLIC: #endif - */ -#define wsize sizeof(u_int) -#define wmask (wsize - 1) - -#ifdef BZERO -#define RETURN return -#define VAL 0 -#define WIDEVAL 0 - -void -bzero(dst0, length) - void *dst0; - register size_t length; -#else -#define RETURN return (dst0) -#define VAL c0 -#define WIDEVAL c - -void * -memset(dst0, c0, length) - void *dst0; - register int c0; - register size_t length; -#endif -{ - register size_t t; - register u_int c; - register u_char *dst; - - dst = dst0; - /* - * If not enough words, just fill bytes. A length >= 2 words - * guarantees that at least one of them is `complete' after - * any necessary alignment. For instance: - * - * |-----------|-----------|-----------| - * |00|01|02|03|04|05|06|07|08|09|0A|00| - * ^---------------------^ - * dst dst+length-1 - * - * but we use a minimum of 3 here since the overhead of the code - * to do word writes is substantial. - */ - if (length < 3 * wsize) { - while (length != 0) { - *dst++ = VAL; - --length; - } - RETURN; - } - -#ifndef BZERO - if ((c = (u_char)c0) != 0) { /* Fill the word. */ - c = (c << 8) | c; /* u_int is 16 bits. */ -#if UINT_MAX > 0xffff - c = (c << 16) | c; /* u_int is 32 bits. */ -#endif -#if UINT_MAX > 0xffffffff - c = (c << 32) | c; /* u_int is 64 bits. */ -#endif - } -#endif - /* Align destination by filling in bytes. */ - if ((t = (int)dst & wmask) != 0) { - t = wsize - t; - length -= t; - do { - *dst++ = VAL; - } while (--t != 0); - } - - /* Fill words. Length was >= 2*words so we know t >= 1 here. */ - t = length / wsize; - do { - *(u_int *)dst = WIDEVAL; - dst += wsize; - } while (--t != 0); - - /* Mop up trailing bytes, if any. */ - t = length & wmask; - if (t != 0) - do { - *dst++ = VAL; - } while (--t != 0); - RETURN; -} diff --git a/clib/mkstemp.c b/clib/mkstemp.c deleted file mode 100644 index 1faffddfbe2d..000000000000 --- a/clib/mkstemp.c +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (c) 1987, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "config.h" - -#if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)mktemp.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -#include -#include -#include -#include -#include -#include - -static int _gettemp(); - -/* - * PUBLIC: #ifndef HAVE_MKSTEMP - * PUBLIC: int mkstemp __P((char *)); - * PUBLIC: #endif - */ -mkstemp(path) - char *path; -{ - int fd; - - return (_gettemp(path, &fd) ? fd : -1); -} - -char * -mktemp(path) - char *path; -{ - return(_gettemp(path, (int *)NULL) ? path : (char *)NULL); -} - -static -_gettemp(path, doopen) - char *path; - register int *doopen; -{ - extern int errno; - register char *start, *trv; - struct stat sbuf; - u_int pid; - - pid = getpid(); - for (trv = path; *trv; ++trv); /* extra X's get set to 0's */ - while (*--trv == 'X') { - *trv = (pid % 10) + '0'; - pid /= 10; - } - - /* - * check the target directory; if you have six X's and it - * doesn't exist this runs for a *very* long time. - */ - for (start = trv + 1;; --trv) { - if (trv <= path) - break; - if (*trv == '/') { - *trv = '\0'; - if (stat(path, &sbuf)) - return(0); - if (!S_ISDIR(sbuf.st_mode)) { - errno = ENOTDIR; - return(0); - } - *trv = '/'; - break; - } - } - - for (;;) { - if (doopen) { - if ((*doopen = - open(path, O_CREAT|O_EXCL|O_RDWR, 0600)) >= 0) - return(1); - if (errno != EEXIST) - return(0); - } - else if (stat(path, &sbuf)) - return(errno == ENOENT ? 1 : 0); - - /* tricky little algorithm for backward compatibility */ - for (trv = start;;) { - if (!*trv) - return(0); - if (*trv == 'z') - *trv++ = 'a'; - else { - if (isdigit(*trv)) - *trv = 'a'; - else - ++*trv; - break; - } - } - } - /*NOTREACHED*/ -} diff --git a/clib/mmap.c b/clib/mmap.c deleted file mode 100644 index 7cea169650b4..000000000000 --- a/clib/mmap.c +++ /dev/null @@ -1,50 +0,0 @@ -#include "config.h" - -#include - -#include -#include - -/* - * This function fakes mmap() by reading `len' bytes from the file descriptor - * `fd' and returning a pointer to that memory. The "mapped" region can later - * be deallocated with munmap(). - * - * Note: ONLY reading is supported and only reading of the exact size of the - * file will work. - * - * PUBLIC: #ifndef HAVE_MMAP - * PUBLIC: char *mmap __P((char *, size_t, int, int, int, off_t)); - * PUBLIC: #endif - */ -char * -mmap(addr, len, prot, flags, fd, off) - char *addr; - size_t len; - int prot, flags, fd; - off_t off; -{ - char *ptr; - - if ((ptr = (char *)malloc(len)) == 0) - return ((char *)-1); - if (read(fd, ptr, len) < 0) { - free(ptr); - return ((char *)-1); - } - return (ptr); -} - -/* - * PUBLIC: #ifndef HAVE_MMAP - * PUBLIC: int munmap __P((char *, size_t)); - * PUBLIC: #endif - */ -int -munmap(addr, len) - char *addr; - size_t len; -{ - free(addr); - return (0); -} diff --git a/clib/snprintf.c b/clib/snprintf.c deleted file mode 100644 index 935522ce5436..000000000000 --- a/clib/snprintf.c +++ /dev/null @@ -1,45 +0,0 @@ -#include "config.h" - -#include - -#include - -#ifdef __STDC__ -#include -#else -#include -#endif - -/* - * PUBLIC: #ifndef HAVE_SNPRINTF - * PUBLIC: int snprintf __P((char *, size_t, const char *, ...)); - * PUBLIC: #endif - */ -int -#ifdef __STDC__ -snprintf(char *str, size_t n, const char *fmt, ...) -#else -snprintf(str, n, fmt, va_alist) - char *str; - size_t n; - const char *fmt; - va_dcl -#endif -{ - va_list ap; - int rval; -#ifdef __STDC__ - va_start(ap, fmt); -#else - va_start(ap); -#endif -#ifdef SPRINTF_RET_CHARPNT - (void)vsprintf(str, fmt, ap); - va_end(ap); - return (strlen(str)); -#else - rval = vsprintf(str, fmt, ap); - va_end(ap); - return (rval); -#endif -} diff --git a/clib/strerror.c b/clib/strerror.c deleted file mode 100644 index cf5910d0fc83..000000000000 --- a/clib/strerror.c +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) 1988, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "config.h" - -#if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)strerror.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -#include - -/* - * PUBLIC: #ifndef HAVE_STRERROR - * PUBLIC: char *strerror __P((int)); - * PUBLIC: #endif - */ -char * -strerror(num) - int num; -{ - extern int sys_nerr; - extern char *sys_errlist[]; -#define UPREFIX "Unknown error: " - static char ebuf[40] = UPREFIX; /* 64-bit number + slop */ - register unsigned int errnum; - register char *p, *t; - char tmp[40]; - - errnum = num; /* convert to unsigned */ - if (errnum < sys_nerr) - return(sys_errlist[errnum]); - - /* Do this by hand, so we don't include stdio(3). */ - t = tmp; - do { - *t++ = "0123456789"[errnum % 10]; - } while (errnum /= 10); - for (p = ebuf + sizeof(UPREFIX) - 1;;) { - *p++ = *--t; - if (t <= tmp) - break; - } - return(ebuf); -} diff --git a/clib/strsep.c b/clib/strsep.c deleted file mode 100644 index 33115f0e4121..000000000000 --- a/clib/strsep.c +++ /dev/null @@ -1,85 +0,0 @@ -/*- - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "config.h" - -#if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)strsep.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -#include -#include - -/* - * Get next token from string *stringp, where tokens are possibly-empty - * strings separated by characters from delim. - * - * Writes NULs into the string at *stringp to end tokens. - * delim need not remain constant from call to call. - * On return, *stringp points past the last NUL written (if there might - * be further tokens), or is NULL (if there are definitely no more tokens). - * - * If *stringp is NULL, strsep returns NULL. - * - * PUBLIC: #ifndef HAVE_STRSEP - * PUBLIC: char *strsep __P((char **, const char *)); - * PUBLIC: #endif - */ -char * -strsep(stringp, delim) - register char **stringp; - register const char *delim; -{ - register char *s; - register const char *spanp; - register int c, sc; - char *tok; - - if ((s = *stringp) == NULL) - return (NULL); - for (tok = s;;) { - c = *s++; - spanp = delim; - do { - if ((sc = *spanp++) == c) { - if (c == 0) - s = NULL; - else - s[-1] = 0; - *stringp = s; - return (tok); - } - } while (sc != 0); - } - /* NOTREACHED */ -} diff --git a/clib/strtol.c b/clib/strtol.c deleted file mode 100644 index 50c724ff432f..000000000000 --- a/clib/strtol.c +++ /dev/null @@ -1,134 +0,0 @@ -/*- - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "config.h" - -#if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)strtol.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -#include -#include -#include -#include - -/* - * Convert a string to a long integer. - * - * Ignores `locale' stuff. Assumes that the upper and lower case - * alphabets and digits are each contiguous. - * - * PUBLIC: #ifndef HAVE_STRTOL - * PUBLIC: long strtol __P((const char *, char **, int)); - * PUBLIC: #endif - */ -long -strtol(nptr, endptr, base) - const char *nptr; - char **endptr; - register int base; -{ - register const char *s = nptr; - register unsigned long acc; - register int c; - register unsigned long cutoff; - register int neg = 0, any, cutlim; - - /* - * Skip white space and pick up leading +/- sign if any. - * If base is 0, allow 0x for hex and 0 for octal, else - * assume decimal; if base is already 16, allow 0x. - */ - do { - c = *s++; - } while (isspace(c)); - if (c == '-') { - neg = 1; - c = *s++; - } else if (c == '+') - c = *s++; - if ((base == 0 || base == 16) && - c == '0' && (*s == 'x' || *s == 'X')) { - c = s[1]; - s += 2; - base = 16; - } - if (base == 0) - base = c == '0' ? 8 : 10; - - /* - * Compute the cutoff value between legal numbers and illegal - * numbers. That is the largest legal value, divided by the - * base. An input number that is greater than this value, if - * followed by a legal input character, is too big. One that - * is equal to this value may be valid or not; the limit - * between valid and invalid numbers is then based on the last - * digit. For instance, if the range for longs is - * [-2147483648..2147483647] and the input base is 10, - * cutoff will be set to 214748364 and cutlim to either - * 7 (neg==0) or 8 (neg==1), meaning that if we have accumulated - * a value > 214748364, or equal but the next digit is > 7 (or 8), - * the number is too big, and we will return a range error. - * - * Set any if any `digits' consumed; make it negative to indicate - * overflow. - */ - cutoff = neg ? -(unsigned long)LONG_MIN : LONG_MAX; - cutlim = cutoff % (unsigned long)base; - cutoff /= (unsigned long)base; - for (acc = 0, any = 0;; c = *s++) { - if (isdigit(c)) - c -= '0'; - else if (isalpha(c)) - c -= isupper(c) ? 'A' - 10 : 'a' - 10; - else - break; - if (c >= base) - break; - if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim) - any = -1; - else { - any = 1; - acc *= base; - acc += c; - } - } - if (any < 0) { - acc = neg ? LONG_MIN : LONG_MAX; - errno = ERANGE; - } else if (neg) - acc = -acc; - if (endptr != 0) - *endptr = (char *)(any ? s - 1 : nptr); - return (acc); -} diff --git a/clib/strtoul.c b/clib/strtoul.c deleted file mode 100644 index 890bdbd747a7..000000000000 --- a/clib/strtoul.c +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#include "config.h" - -#if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)strtoul.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -#include -#include -#include -#include - -/* - * Convert a string to an unsigned long integer. - * - * Ignores `locale' stuff. Assumes that the upper and lower case - * alphabets and digits are each contiguous. - * - * PUBLIC: #ifndef HAVE_STRTOUL - * PUBLIC: unsigned long strtoul __P((const char *, char **, int)); - * PUBLIC: #endif - */ -unsigned long -strtoul(nptr, endptr, base) - const char *nptr; - char **endptr; - register int base; -{ - register const char *s = nptr; - register unsigned long acc; - register int c; - register unsigned long cutoff; - register int neg = 0, any, cutlim; - - /* - * See strtol for comments as to the logic used. - */ - do { - c = *s++; - } while (isspace(c)); - if (c == '-') { - neg = 1; - c = *s++; - } else if (c == '+') - c = *s++; - if ((base == 0 || base == 16) && - c == '0' && (*s == 'x' || *s == 'X')) { - c = s[1]; - s += 2; - base = 16; - } - if (base == 0) - base = c == '0' ? 8 : 10; - cutoff = (unsigned long)ULONG_MAX / (unsigned long)base; - cutlim = (unsigned long)ULONG_MAX % (unsigned long)base; - for (acc = 0, any = 0;; c = *s++) { - if (isdigit(c)) - c -= '0'; - else if (isalpha(c)) - c -= isupper(c) ? 'A' - 10 : 'a' - 10; - else - break; - if (c >= base) - break; - if (any < 0 || acc > cutoff || acc == cutoff && c > cutlim) - any = -1; - else { - any = 1; - acc *= base; - acc += c; - } - } - if (any < 0) { - acc = ULONG_MAX; - errno = ERANGE; - } else if (neg) - acc = -acc; - if (endptr != 0) - *endptr = (char *)(any ? s - 1 : nptr); - return (acc); -} diff --git a/clib/vsnprintf.c b/clib/vsnprintf.c deleted file mode 100644 index a1b013ad196f..000000000000 --- a/clib/vsnprintf.c +++ /dev/null @@ -1,31 +0,0 @@ -#include "config.h" - -#include - -#include - -#ifdef __STDC__ -#include -#else -#include -#endif - -/* - * PUBLIC: #ifndef HAVE_VSNPRINTF - * PUBLIC: int vsnprintf __P((char *, size_t, const char *, ...)); - * PUBLIC: #endif - */ -int -vsnprintf(str, n, fmt, ap) - char *str; - size_t n; - const char *fmt; - va_list ap; -{ -#ifdef SPRINTF_RET_CHARPNT - (void)vsprintf(str, fmt, ap); - return (strlen(str)); -#else - return (vsprintf(str, fmt, ap)); -#endif -} diff --git a/common/api.c b/common/api.c deleted file mode 100644 index 35d9f0c8f66e..000000000000 --- a/common/api.c +++ /dev/null @@ -1,525 +0,0 @@ -/*- - * Copyright (c) 1992, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * Copyright (c) 1992, 1993, 1994, 1995, 1996 - * Keith Bostic. All rights reserved. - * Copyright (c) 1995 - * George V. Neville-Neil. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)api.c 8.26 (Berkeley) 10/14/96"; -#endif /* not lint */ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "../common/common.h" - -extern GS *__global_list; /* XXX */ - -/* - * api_fscreen -- - * Return a pointer to the screen specified by the screen id - * or a file name. - * - * PUBLIC: SCR *api_fscreen __P((int, char *)); - */ -SCR * -api_fscreen(id, name) - int id; - char *name; -{ - GS *gp; - SCR *tsp; - - gp = __global_list; - - /* Search the displayed list. */ - for (tsp = gp->dq.cqh_first; - tsp != (void *)&gp->dq; tsp = tsp->q.cqe_next) - if (name == NULL) { - if (id == tsp->id) - return (tsp); - } else if (!strcmp(name, tsp->frp->name)) - return (tsp); - - /* Search the hidden list. */ - for (tsp = gp->hq.cqh_first; - tsp != (void *)&gp->hq; tsp = tsp->q.cqe_next) - if (name == NULL) { - if (id == tsp->id) - return (tsp); - } else if (!strcmp(name, tsp->frp->name)) - return (tsp); - return (NULL); -} - -/* - * api_aline -- - * Append a line. - * - * PUBLIC: int api_aline __P((SCR *, recno_t, char *, size_t)); - */ -int -api_aline(sp, lno, line, len) - SCR *sp; - recno_t lno; - char *line; - size_t len; -{ - return (db_append(sp, 1, lno, line, len)); -} - -/* - * api_dline -- - * Delete a line. - * - * PUBLIC: int api_dline __P((SCR *, recno_t)); - */ -int -api_dline(sp, lno) - SCR *sp; - recno_t lno; -{ - return (db_delete(sp, lno)); -} - -/* - * api_gline -- - * Get a line. - * - * PUBLIC: int api_gline __P((SCR *, recno_t, char **, size_t *)); - */ -int -api_gline(sp, lno, linepp, lenp) - SCR *sp; - recno_t lno; - char **linepp; - size_t *lenp; -{ - int isempty; - - if (db_eget(sp, lno, linepp, lenp, &isempty)) { - if (isempty) - msgq(sp, M_ERR, "209|The file is empty"); - return (1); - } - return (0); -} - -/* - * api_iline -- - * Insert a line. - * - * PUBLIC: int api_iline __P((SCR *, recno_t, char *, size_t)); - */ -int -api_iline(sp, lno, line, len) - SCR *sp; - recno_t lno; - char *line; - size_t len; -{ - return (db_insert(sp, lno, line, len)); -} - -/* - * api_lline -- - * Return the line number of the last line in the file. - * - * PUBLIC: int api_lline __P((SCR *, recno_t *)); - */ -int -api_lline(sp, lnop) - SCR *sp; - recno_t *lnop; -{ - return (db_last(sp, lnop)); -} - -/* - * api_sline -- - * Set a line. - * - * PUBLIC: int api_sline __P((SCR *, recno_t, char *, size_t)); - */ -int -api_sline(sp, lno, line, len) - SCR *sp; - recno_t lno; - char *line; - size_t len; -{ - return (db_set(sp, lno, line, len)); -} - -/* - * api_getmark -- - * Get the mark. - * - * PUBLIC: int api_getmark __P((SCR *, int, MARK *)); - */ -int -api_getmark(sp, markname, mp) - SCR *sp; - int markname; - MARK *mp; -{ - return (mark_get(sp, (ARG_CHAR_T)markname, mp, M_ERR)); -} - -/* - * api_setmark -- - * Set the mark. - * - * PUBLIC: int api_setmark __P((SCR *, int, MARK *)); - */ -int -api_setmark(sp, markname, mp) - SCR *sp; - int markname; - MARK *mp; -{ - return (mark_set(sp, (ARG_CHAR_T)markname, mp, 1)); -} - -/* - * api_nextmark -- - * Return the first mark if next not set, otherwise return the - * subsequent mark. - * - * PUBLIC: int api_nextmark __P((SCR *, int, char *)); - */ -int -api_nextmark(sp, next, namep) - SCR *sp; - int next; - char *namep; -{ - LMARK *mp; - - mp = sp->ep->marks.lh_first; - if (next) - for (; mp != NULL; mp = mp->q.le_next) - if (mp->name == *namep) { - mp = mp->q.le_next; - break; - } - if (mp == NULL) - return (1); - *namep = mp->name; - return (0); -} - -/* - * api_getcursor -- - * Get the cursor. - * - * PUBLIC: int api_getcursor __P((SCR *, MARK *)); - */ -int -api_getcursor(sp, mp) - SCR *sp; - MARK *mp; -{ - mp->lno = sp->lno; - mp->cno = sp->cno; - return (0); -} - -/* - * api_setcursor -- - * Set the cursor. - * - * PUBLIC: int api_setcursor __P((SCR *, MARK *)); - */ -int -api_setcursor(sp, mp) - SCR *sp; - MARK *mp; -{ - size_t len; - - if (db_get(sp, mp->lno, DBG_FATAL, NULL, &len)) - return (1); - if (mp->cno < 0 || mp->cno > len) { - msgq(sp, M_ERR, "Cursor set to nonexistent column"); - return (1); - } - - /* Set the cursor. */ - sp->lno = mp->lno; - sp->cno = mp->cno; - return (0); -} - -/* - * api_emessage -- - * Print an error message. - * - * PUBLIC: void api_emessage __P((SCR *, char *)); - */ -void -api_emessage(sp, text) - SCR *sp; - char *text; -{ - msgq(sp, M_ERR, "%s", text); -} - -/* - * api_imessage -- - * Print an informational message. - * - * PUBLIC: void api_imessage __P((SCR *, char *)); - */ -void -api_imessage(sp, text) - SCR *sp; - char *text; -{ - msgq(sp, M_INFO, "%s", text); -} - -/* - * api_edit - * Create a new screen and return its id - * or edit a new file in the current screen. - * - * PUBLIC: int api_edit __P((SCR *, char *, SCR **, int)); - */ -int -api_edit(sp, file, spp, newscreen) - SCR *sp; - char *file; - SCR **spp; - int newscreen; -{ - ARGS *ap[2], a; - EXCMD cmd; - - if (file) { - ex_cinit(&cmd, C_EDIT, 0, OOBLNO, OOBLNO, 0, ap); - ex_cadd(&cmd, &a, file, strlen(file)); - } else - ex_cinit(&cmd, C_EDIT, 0, OOBLNO, OOBLNO, 0, NULL); - if (newscreen) - cmd.flags |= E_NEWSCREEN; /* XXX */ - if (cmd.cmd->fn(sp, &cmd)) - return (1); - *spp = sp->nextdisp; - return (0); -} - -/* - * api_escreen - * End a screen. - * - * PUBLIC: int api_escreen __P((SCR *)); - */ -int -api_escreen(sp) - SCR *sp; -{ - EXCMD cmd; - - /* - * XXX - * If the interpreter exits anything other than the current - * screen, vi isn't going to update everything correctly. - */ - ex_cinit(&cmd, C_QUIT, 0, OOBLNO, OOBLNO, 0, NULL); - return (cmd.cmd->fn(sp, &cmd)); -} - -/* - * api_swscreen -- - * Switch to a new screen. - * - * PUBLIC: int api_swscreen __P((SCR *, SCR *)); - */ -int -api_swscreen(sp, new) - SCR *sp, *new; -{ - /* - * XXX - * If the interpreter switches from anything other than the - * current screen, vi isn't going to update everything correctly. - */ - sp->nextdisp = new; - F_SET(sp, SC_SSWITCH); - - return (0); -} - -/* - * api_map -- - * Map a key. - * - * PUBLIC: int api_map __P((SCR *, char *, char *, size_t)); - */ -int -api_map(sp, name, map, len) - SCR *sp; - char *name, *map; - size_t len; -{ - ARGS *ap[3], a, b; - EXCMD cmd; - - ex_cinit(&cmd, C_MAP, 0, OOBLNO, OOBLNO, 0, ap); - ex_cadd(&cmd, &a, name, strlen(name)); - ex_cadd(&cmd, &b, map, len); - return (cmd.cmd->fn(sp, &cmd)); -} - -/* - * api_unmap -- - * Unmap a key. - * - * PUBLIC: int api_unmap __P((SCR *, char *)); - */ -int -api_unmap(sp, name) - SCR *sp; - char *name; -{ - ARGS *ap[2], a; - EXCMD cmd; - - ex_cinit(&cmd, C_UNMAP, 0, OOBLNO, OOBLNO, 0, ap); - ex_cadd(&cmd, &a, name, strlen(name)); - return (cmd.cmd->fn(sp, &cmd)); -} - -/* - * api_opts_get -- - * Return a option value as a string, in allocated memory. - * If the option is of type boolean, boolvalue is (un)set - * according to the value; otherwise boolvalue is -1. - * - * PUBLIC: int api_opts_get __P((SCR *, char *, char **, int *)); - */ -int -api_opts_get(sp, name, value, boolvalue) - SCR *sp; - char *name, **value; - int *boolvalue; -{ - OPTLIST const *op; - int offset; - - if ((op = opts_search(name)) == NULL) { - opts_nomatch(sp, name); - return (1); - } - - offset = op - optlist; - if (boolvalue != NULL) - *boolvalue = -1; - switch (op->type) { - case OPT_0BOOL: - case OPT_1BOOL: - MALLOC_RET(sp, *value, char *, strlen(op->name) + 2 + 1); - (void)sprintf(*value, - "%s%s", O_ISSET(sp, offset) ? "" : "no", op->name); - if (boolvalue != NULL) - *boolvalue = O_ISSET(sp, offset); - break; - case OPT_NUM: - MALLOC_RET(sp, *value, char *, 20); - (void)sprintf(*value, "%lu", (u_long)O_VAL(sp, offset)); - break; - case OPT_STR: - if (O_STR(sp, offset) == NULL) { - MALLOC_RET(sp, *value, char *, 2); - value[0] = '\0'; - } else { - MALLOC_RET(sp, - *value, char *, strlen(O_STR(sp, offset)) + 1); - (void)sprintf(*value, "%s", O_STR(sp, offset)); - } - break; - } - return (0); -} - -/* - * api_opts_set -- - * Set options. - * - * PUBLIC: int api_opts_set __P((SCR *, char *, char *, u_long, int)); - */ -int -api_opts_set(sp, name, str_value, num_value, bool_value) - SCR *sp; - char *name, *str_value; - u_long num_value; - int bool_value; -{ - ARGS *ap[2], a, b; - OPTLIST const *op; - int rval; - size_t blen; - char *bp; - - if ((op = opts_search(name)) == NULL) { - opts_nomatch(sp, name); - return (1); - } - - switch (op->type) { - case OPT_0BOOL: - case OPT_1BOOL: - GET_SPACE_RET(sp, bp, blen, 64); - a.len = snprintf(bp, 64, "%s%s", bool_value ? "" : "no", name); - break; - case OPT_NUM: - GET_SPACE_RET(sp, bp, blen, 64); - a.len = snprintf(bp, 64, "%s=%lu", name, num_value); - break; - case OPT_STR: - GET_SPACE_RET(sp, bp, blen, 1024); - a.len = snprintf(bp, 1024, "%s=%s", name, str_value); - break; - } - a.bp = bp; - b.len = 0; - b.bp = NULL; - ap[0] = &a; - ap[1] = &b; - rval = opts_set(sp, ap, NULL); - - FREE_SPACE(sp, bp, blen); - - return (rval); -} - -/* - * api_run_str -- - * Execute a string as an ex command. - * - * PUBLIC: int api_run_str __P((SCR *, char *)); - */ -int -api_run_str(sp, cmd) - SCR *sp; - char *cmd; -{ - return (ex_run_str(sp, NULL, cmd, strlen(cmd), 0, 0)); -} diff --git a/common/args.h b/common/args.h index e84dc2ca04c1..b23699c250e3 100644 --- a/common/args.h +++ b/common/args.h @@ -6,7 +6,7 @@ * * See the LICENSE file for redistribution information. * - * @(#)args.h 10.2 (Berkeley) 3/6/96 + * $Id: args.h,v 10.2 1996/03/06 19:50:07 bostic Exp $ */ /* diff --git a/common/common.h b/common/common.h index 0e13fc80b844..71f4c7fb69cb 100644 --- a/common/common.h +++ b/common/common.h @@ -6,15 +6,9 @@ * * See the LICENSE file for redistribution information. * - * @(#)common.h 10.13 (Berkeley) 9/25/96 + * $Id: common.h,v 10.22 2012/04/13 05:21:50 zy Exp $ */ -/* - * Porting information built at configuration time. Included before - * any of nvi's include files. - */ -#include "port.h" - /* * Pseudo-local includes. These are files that are unlikely to exist * on most machines to which we're porting vi, and we want to include @@ -29,6 +23,8 @@ */ typedef struct _cb CB; typedef struct _csc CSC; +typedef struct _conv CONV; +typedef struct _conv_win CONVWIN; typedef struct _event EVENT; typedef struct _excmd EXCMD; typedef struct _exf EXF; @@ -48,7 +44,7 @@ typedef struct _tagq TAGQ; typedef struct _text TEXT; /* Autoindent state. */ -typedef enum { C_NOTSET, C_CARATSET, C_NOCHANGE, C_ZEROSET } carat_t; +typedef enum { C_NOTSET, C_CARATSET, C_ZEROSET } carat_t; /* Busy message types. */ typedef enum { BUSY_ON = 1, BUSY_OFF, BUSY_UPDATE } busy_t; @@ -86,6 +82,7 @@ typedef enum { SEQ_ABBREV, SEQ_COMMAND, SEQ_INPUT } seq_t; #include "seq.h" /* Required by screen.h. */ #include "util.h" /* Required by ex.h. */ #include "mark.h" /* Required by gs.h. */ +#include "conv.h" /* Required by ex.h and screen.h */ #include "../ex/ex.h" /* Required by gs.h. */ #include "gs.h" /* Required by screen.h. */ #include "screen.h" /* Required by exf.h. */ @@ -93,4 +90,4 @@ typedef enum { SEQ_ABBREV, SEQ_COMMAND, SEQ_INPUT } seq_t; #include "log.h" #include "mem.h" -#include "com_extern.h" +#include "extern.h" diff --git a/common/conv.c b/common/conv.c new file mode 100644 index 000000000000..7803cec9922e --- /dev/null +++ b/common/conv.c @@ -0,0 +1,446 @@ +/*- + * Copyright (c) 1993, 1994 + * The Regents of the University of California. All rights reserved. + * Copyright (c) 1993, 1994, 1995, 1996 + * Keith Bostic. All rights reserved. + * Copyright (c) 2011, 2012 + * Zhihao Yuan. All rights reserved. + * + * See the LICENSE file for redistribution information. + */ + +#include "config.h" + +#ifndef lint +static const char sccsid[] = "$Id: conv.c,v 2.39 2013/07/01 23:28:13 zy Exp $"; +#endif /* not lint */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" + +/* + * codeset -- + * Get the locale encoding. + * + * PUBLIC: char * codeset __P((void)); + */ +char * +codeset(void) { + static char *cs; + + if (cs == NULL) + cs = nl_langinfo(CODESET); + return cs; +} + +#ifdef USE_WIDECHAR +static int +raw2int(SCR *sp, const char * str, ssize_t len, CONVWIN *cw, + size_t *tolen, CHAR_T **dst) +{ + int i; + CHAR_T **tostr = &cw->bp1.wc; + size_t *blen = &cw->blen1; + + BINC_RETW(NULL, *tostr, *blen, len); + + *tolen = len; + for (i = 0; i < len; ++i) + (*tostr)[i] = (u_char) str[i]; + + *dst = cw->bp1.wc; + + return 0; +} + +#define CONV_BUFFER_SIZE 512 +/* fill the buffer with codeset encoding of string pointed to by str + * left has the number of bytes left in str and is adjusted + * len contains the number of bytes put in the buffer + */ +#ifdef USE_ICONV +#define CONVERT(str, left, src, len) \ + do { \ + size_t outleft; \ + char *bp = buffer; \ + outleft = CONV_BUFFER_SIZE; \ + errno = 0; \ + if (iconv(id, (iconv_src_t)&str, &left, &bp, &outleft) == -1 && \ + errno != E2BIG) \ + goto err; \ + if ((len = CONV_BUFFER_SIZE - outleft) == 0) { \ + error = -left; \ + goto err; \ + } \ + src = buffer; \ + } while (0) + +#define IC_RESET() \ + do { \ + if (id != (iconv_t)-1) \ + iconv(id, NULL, NULL, NULL, NULL); \ + } while(0) +#else +#define CONVERT(str, left, src, len) +#define IC_RESET() +#endif + +static int +default_char2int(SCR *sp, const char * str, ssize_t len, CONVWIN *cw, + size_t *tolen, CHAR_T **dst, iconv_t id) +{ + size_t i = 0, j; + CHAR_T **tostr = &cw->bp1.wc; + size_t *blen = &cw->blen1; + mbstate_t mbs; + size_t n; + ssize_t nlen = len; + char *src = (char *)str; +#ifdef USE_ICONV + char buffer[CONV_BUFFER_SIZE]; +#endif + size_t left = len; + int error = 1; + + BZERO(&mbs, 1); + BINC_RETW(NULL, *tostr, *blen, nlen); + +#ifdef USE_ICONV + if (id != (iconv_t)-1) + CONVERT(str, left, src, len); +#endif + + for (i = 0, j = 0; j < len; ) { + n = mbrtowc((*tostr)+i, src+j, len-j, &mbs); + /* NULL character converted */ + if (n == -2) error = -(len-j); + if (n == -1 || n == -2) goto err; + if (n == 0) n = 1; + j += n; + if (++i >= *blen) { + nlen += 256; + BINC_RETW(NULL, *tostr, *blen, nlen); + } + if (id != (iconv_t)-1 && j == len && left) { + CONVERT(str, left, src, len); + j = 0; + } + } + + error = 0; +err: + *tolen = i; + *dst = cw->bp1.wc; + IC_RESET(); + + return error; +} + +static int +fe_char2int(SCR *sp, const char * str, ssize_t len, CONVWIN *cw, + size_t *tolen, CHAR_T **dst) +{ + return default_char2int(sp, str, len, cw, tolen, dst, + sp->conv.id[IC_FE_CHAR2INT]); +} + +static int +ie_char2int(SCR *sp, const char * str, ssize_t len, CONVWIN *cw, + size_t *tolen, CHAR_T **dst) +{ + return default_char2int(sp, str, len, cw, tolen, dst, + sp->conv.id[IC_IE_CHAR2INT]); +} + +static int +cs_char2int(SCR *sp, const char * str, ssize_t len, CONVWIN *cw, + size_t *tolen, CHAR_T **dst) +{ + return default_char2int(sp, str, len, cw, tolen, dst, + (iconv_t)-1); +} + +static int +int2raw(SCR *sp, const CHAR_T * str, ssize_t len, CONVWIN *cw, + size_t *tolen, char **dst) +{ + int i; + char **tostr = &cw->bp1.c; + size_t *blen = &cw->blen1; + + BINC_RETC(NULL, *tostr, *blen, len); + + *tolen = len; + for (i = 0; i < len; ++i) + (*tostr)[i] = str[i]; + + *dst = cw->bp1.c; + + return 0; +} + +static int +default_int2char(SCR *sp, const CHAR_T * str, ssize_t len, CONVWIN *cw, + size_t *tolen, char **pdst, iconv_t id) +{ + size_t i, j, offset = 0; + char **tostr = &cw->bp1.c; + size_t *blen = &cw->blen1; + mbstate_t mbs; + size_t n; + ssize_t nlen = len + MB_CUR_MAX; + char *dst; + size_t buflen; +#ifdef USE_ICONV + char buffer[CONV_BUFFER_SIZE]; +#endif + int error = 1; + +/* convert first len bytes of buffer and append it to cw->bp + * len is adjusted => 0 + * offset contains the offset in cw->bp and is adjusted + * cw->bp is grown as required + */ +#ifdef USE_ICONV +#define CONVERT2(_buffer, lenp, cw, offset) \ + do { \ + char *bp = _buffer; \ + int ret; \ + do { \ + size_t outleft = cw->blen1 - offset; \ + char *obp = cw->bp1.c + offset; \ + if (cw->blen1 < offset + MB_CUR_MAX) { \ + nlen += 256; \ + BINC_RETC(NULL, cw->bp1.c, cw->blen1, nlen); \ + } \ + errno = 0; \ + ret = iconv(id, (iconv_src_t)&bp, lenp, &obp, &outleft); \ + if (ret == -1 && errno != E2BIG) \ + goto err; \ + offset = cw->blen1 - outleft; \ + } while (ret != 0); \ + } while (0) +#else +#define CONVERT2(_buffer, lenp, cw, offset) +#endif + + + BZERO(&mbs, 1); + BINC_RETC(NULL, *tostr, *blen, nlen); + dst = *tostr; buflen = *blen; + +#ifdef USE_ICONV + if (id != (iconv_t)-1) { + dst = buffer; buflen = CONV_BUFFER_SIZE; + } +#endif + + for (i = 0, j = 0; i < len; ++i) { + n = wcrtomb(dst+j, str[i], &mbs); + if (n == -1) goto err; + j += n; + if (buflen < j + MB_CUR_MAX) { + if (id != (iconv_t)-1) { + CONVERT2(buffer, &j, cw, offset); + } else { + nlen += 256; + BINC_RETC(NULL, *tostr, *blen, nlen); + dst = *tostr; buflen = *blen; + } + } + } + + n = wcrtomb(dst+j, L'\0', &mbs); + j += n - 1; /* don't count NUL at the end */ + *tolen = j; + + if (id != (iconv_t)-1) { + CONVERT2(buffer, &j, cw, offset); + CONVERT2(NULL, NULL, cw, offset); /* back to the initial state */ + *tolen = offset; + } + + error = 0; +err: + if (error) + *tolen = j; + *pdst = cw->bp1.c; + IC_RESET(); + + return error; +} + +static int +fe_int2char(SCR *sp, const CHAR_T * str, ssize_t len, CONVWIN *cw, + size_t *tolen, char **dst) +{ + return default_int2char(sp, str, len, cw, tolen, dst, + sp->conv.id[IC_FE_INT2CHAR]); +} + +static int +cs_int2char(SCR *sp, const CHAR_T * str, ssize_t len, CONVWIN *cw, + size_t *tolen, char **dst) +{ + return default_int2char(sp, str, len, cw, tolen, dst, + (iconv_t)-1); +} + +#endif + +/* + * conv_init -- + * Initialize the iconv environment. + * + * PUBLIC: void conv_init __P((SCR *, SCR *)); + */ +void +conv_init(SCR *orig, SCR *sp) +{ + int i; + + if (orig == NULL) + setlocale(LC_ALL, ""); + if (orig != NULL) + BCOPY(&orig->conv, &sp->conv, 1); +#ifdef USE_WIDECHAR + else { + char *ctype = setlocale(LC_CTYPE, NULL); + + /* + * XXX + * This hack fixes the libncursesw issue on FreeBSD. + */ + if (!strcmp(ctype, "ko_KR.CP949")) + setlocale(LC_CTYPE, "ko_KR.eucKR"); + else if (!strcmp(ctype, "zh_CN.GB2312")) + setlocale(LC_CTYPE, "zh_CN.eucCN"); + else if (!strcmp(ctype, "zh_CN.GBK")) + setlocale(LC_CTYPE, "zh_CN.GB18030"); + + /* + * Switch to 8bit mode if locale is C; + * LC_CTYPE should be reseted to C if unmatched. + */ + if (!strcmp(ctype, "C") || !strcmp(ctype, "POSIX")) { + sp->conv.sys2int = sp->conv.file2int = raw2int; + sp->conv.int2sys = sp->conv.int2file = int2raw; + sp->conv.input2int = raw2int; + } else { + sp->conv.sys2int = cs_char2int; + sp->conv.int2sys = cs_int2char; + sp->conv.file2int = fe_char2int; + sp->conv.int2file = fe_int2char; + sp->conv.input2int = ie_char2int; + } +#ifdef USE_ICONV + o_set(sp, O_INPUTENCODING, OS_STRDUP, codeset(), 0); +#endif + } +#endif + + /* iconv descriptors must be distinct to screens. */ + for (i = 0; i <= IC_IE_TO_UTF16; ++i) + sp->conv.id[i] = (iconv_t)-1; +#ifdef USE_ICONV + conv_enc(sp, O_INPUTENCODING, 0); +#endif +} + +/* + * conv_enc -- + * Convert file/input encoding. + * + * PUBLIC: int conv_enc __P((SCR *, int, char *)); + */ +int +conv_enc(SCR *sp, int option, char *enc) +{ +#if defined(USE_WIDECHAR) && defined(USE_ICONV) + iconv_t *c2w, *w2c; + + switch (option) { + case O_FILEENCODING: + c2w = sp->conv.id + IC_FE_CHAR2INT; + w2c = sp->conv.id + IC_FE_INT2CHAR; + if (!enc) enc = O_STR(sp, O_FILEENCODING); + if (*c2w != (iconv_t)-1) + iconv_close(*c2w); + if (*w2c != (iconv_t)-1) + iconv_close(*w2c); + if (strcasecmp(codeset(), enc)) { + if ((*c2w = iconv_open(codeset(), enc)) == (iconv_t)-1) + goto err; + if ((*w2c = iconv_open(enc, codeset())) == (iconv_t)-1) + goto err; + } else *c2w = *w2c = (iconv_t)-1; + break; + case O_INPUTENCODING: + c2w = sp->conv.id + IC_IE_CHAR2INT; + w2c = sp->conv.id + IC_IE_TO_UTF16; + if (!enc) enc = O_STR(sp, O_INPUTENCODING); + if (*c2w != (iconv_t)-1) + iconv_close(*c2w); + if (*w2c != (iconv_t)-1) + iconv_close(*w2c); + if (strcasecmp(codeset(), enc)) { + if ((*c2w = iconv_open(codeset(), enc)) == (iconv_t)-1) + goto err; + } else *c2w = (iconv_t)-1; + /* UTF-16 can not be locale and can not be inputed. */ + if ((*w2c = iconv_open("utf-16be", enc)) == (iconv_t)-1) + goto err; + break; + } + + F_CLR(sp, SC_CONV_ERROR); + F_SET(sp, SC_SCR_REFORMAT); + + return 0; +err: +#endif + switch (option) { + case O_FILEENCODING: + msgq(sp, M_ERR, + "321|File encoding conversion not supported"); + break; + case O_INPUTENCODING: + msgq(sp, M_ERR, + "322|Input encoding conversion not supported"); + break; + } + return 1; +} + +/* + * conv_end -- + * Close the iconv descriptors, release the buffer. + * + * PUBLIC: void conv_end __P((SCR *)); + */ +void +conv_end(SCR *sp) +{ +#if defined(USE_WIDECHAR) && defined(USE_ICONV) + int i; + for (i = 0; i <= IC_IE_TO_UTF16; ++i) + if (sp->conv.id[i] != (iconv_t)-1) + iconv_close(sp->conv.id[i]); + if (sp->cw.bp1.c != NULL) + free(sp->cw.bp1.c); +#endif +} diff --git a/common/conv.h b/common/conv.h new file mode 100644 index 000000000000..b17c3bb24ace --- /dev/null +++ b/common/conv.h @@ -0,0 +1,57 @@ +/*- + * Copyright (c) 1992, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * Copyright (c) 1992, 1993, 1994, 1995, 1996 + * Keith Bostic. All rights reserved. + * Copyright (c) 2011, 2012 + * Zhihao Yuan. All rights reserved. + * + * See the LICENSE file for redistribution information. + * + * $Id: conv.h,v 2.32 2013/03/11 01:20:53 zy Exp $ + */ + +#ifdef USE_ICONV +#include +#ifdef ICONV_TRADITIONAL +typedef char ** iconv_src_t; +#else +typedef char const ** iconv_src_t; +#endif +#else +typedef int iconv_t; +#endif + +/* + * XXX + * We can not use MB_CUR_MAX here, since UTF-8 may report it as 6, but + * a sequence longer than 4 is deprecated by RFC 3629. + */ +#define KEY_NEEDSWIDE(sp, ch) \ + (INTISWIDE(ch) && KEY_LEN(sp, ch) <= 4) +#define KEY_COL(sp, ch) \ + (KEY_NEEDSWIDE(sp, ch) ? CHAR_WIDTH(sp, ch) : KEY_LEN(sp, ch)) + +enum { IC_FE_CHAR2INT, IC_FE_INT2CHAR, IC_IE_CHAR2INT, IC_IE_TO_UTF16 }; + +struct _conv_win { + union { + char *c; + CHAR_T *wc; + } bp1; + size_t blen1; +}; + +typedef int (*char2wchar_t) + (SCR *, const char *, ssize_t, struct _conv_win *, size_t *, CHAR_T **); +typedef int (*wchar2char_t) + (SCR *, const CHAR_T *, ssize_t, struct _conv_win *, size_t *, char **); + +struct _conv { + char2wchar_t sys2int; + wchar2char_t int2sys; + char2wchar_t file2int; + wchar2char_t int2file; + char2wchar_t input2int; + iconv_t id[IC_IE_TO_UTF16 + 1]; +}; diff --git a/common/cut.c b/common/cut.c index faceecd11166..11db42fb8158 100644 --- a/common/cut.c +++ b/common/cut.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)cut.c 10.10 (Berkeley) 9/15/96"; +static const char sccsid[] = "$Id: cut.c,v 10.12 2012/02/11 15:52:33 zy Exp $"; #endif /* not lint */ #include @@ -64,14 +64,15 @@ static void cb_rotate __P((SCR *)); * PUBLIC: int cut __P((SCR *, CHAR_T *, MARK *, MARK *, int)); */ int -cut(sp, namep, fm, tm, flags) - SCR *sp; - CHAR_T *namep; - MARK *fm, *tm; - int flags; +cut( + SCR *sp, + CHAR_T *namep, + MARK *fm, + MARK *tm, + int flags) { CB *cbp; - CHAR_T name; + CHAR_T name = '\0'; recno_t lno; int append, copy_one, copy_def; @@ -100,19 +101,19 @@ cut(sp, namep, fm, tm, flags) append = copy_one = copy_def = 0; if (namep != NULL) { name = *namep; - if (LF_ISSET(CUT_NUMREQ) || LF_ISSET(CUT_NUMOPT) && - (LF_ISSET(CUT_LINEMODE) || fm->lno != tm->lno)) { + if (LF_ISSET(CUT_NUMREQ) || (LF_ISSET(CUT_NUMOPT) && + (LF_ISSET(CUT_LINEMODE) || fm->lno != tm->lno))) { copy_one = 1; cb_rotate(sp); } - if ((append = isupper(name)) == 1) { + if ((append = isupper(name))) { if (!copy_one) copy_def = 1; name = tolower(name); } namecb: CBNAME(sp, cbp, name); - } else if (LF_ISSET(CUT_NUMREQ) || LF_ISSET(CUT_NUMOPT) && - (LF_ISSET(CUT_LINEMODE) || fm->lno != tm->lno)) { + } else if (LF_ISSET(CUT_NUMREQ) || (LF_ISSET(CUT_NUMOPT) && + (LF_ISSET(CUT_LINEMODE) || fm->lno != tm->lno))) { name = '1'; cb_rotate(sp); goto namecb; @@ -127,26 +128,25 @@ namecb: CBNAME(sp, cbp, name); if (cbp == NULL) { CALLOC_RET(sp, cbp, CB *, 1, sizeof(CB)); cbp->name = name; - CIRCLEQ_INIT(&cbp->textq); - LIST_INSERT_HEAD(&sp->gp->cutq, cbp, q); + TAILQ_INIT(cbp->textq); + SLIST_INSERT_HEAD(sp->gp->cutq, cbp, q); } else if (!append) { - text_lfree(&cbp->textq); + text_lfree(cbp->textq); cbp->len = 0; cbp->flags = 0; } -#define ENTIRE_LINE 0 /* In line mode, it's pretty easy, just cut the lines. */ if (LF_ISSET(CUT_LINEMODE)) { cbp->flags |= CB_LMODE; for (lno = fm->lno; lno <= tm->lno; ++lno) - if (cut_line(sp, lno, 0, 0, cbp)) + if (cut_line(sp, lno, 0, ENTIRE_LINE, cbp)) goto cut_line_err; } else { /* - * Get the first line. A length of 0 causes cut_line - * to cut from the MARK to the end of the line. + * Get the first line. A length of ENTIRE_LINE causes + * cut_line to cut from the MARK to the end of the line. */ if (cut_line(sp, fm->lno, fm->cno, fm->lno != tm->lno ? ENTIRE_LINE : (tm->cno - fm->cno) + 1, cbp)) @@ -180,7 +180,7 @@ namecb: CBNAME(sp, cbp, name); return (0); cut_line_err: - text_lfree(&cbp->textq); + text_lfree(cbp->textq); cbp->len = 0; cbp->flags = 0; return (1); @@ -191,45 +191,29 @@ namecb: CBNAME(sp, cbp, name); * Rotate the numbered buffers up one. */ static void -cb_rotate(sp) - SCR *sp; +cb_rotate(SCR *sp) { - CB *cbp, *del_cbp; + CB *cbp, *del_cbp = NULL, *pre_cbp = NULL; - del_cbp = NULL; - for (cbp = sp->gp->cutq.lh_first; cbp != NULL; cbp = cbp->q.le_next) + SLIST_FOREACH(cbp, sp->gp->cutq, q) { switch(cbp->name) { - case '1': - cbp->name = '2'; - break; - case '2': - cbp->name = '3'; - break; - case '3': - cbp->name = '4'; - break; - case '4': - cbp->name = '5'; - break; - case '5': - cbp->name = '6'; - break; - case '6': - cbp->name = '7'; - break; - case '7': - cbp->name = '8'; - break; - case '8': - cbp->name = '9'; + case '1': case '2': case '3': + case '4': case '5': case '6': + case '7': case '8': + cbp->name += 1; break; case '9': + if (cbp == SLIST_FIRST(sp->gp->cutq)) + SLIST_REMOVE_HEAD(sp->gp->cutq, q); + else + SLIST_REMOVE_AFTER(pre_cbp, q); del_cbp = cbp; break; } + pre_cbp = cbp; + } if (del_cbp != NULL) { - LIST_REMOVE(del_cbp, q); - text_lfree(&del_cbp->textq); + text_lfree(del_cbp->textq); free(del_cbp); } } @@ -241,15 +225,16 @@ cb_rotate(sp) * PUBLIC: int cut_line __P((SCR *, recno_t, size_t, size_t, CB *)); */ int -cut_line(sp, lno, fcno, clen, cbp) - SCR *sp; - recno_t lno; - size_t fcno, clen; - CB *cbp; +cut_line( + SCR *sp, + recno_t lno, + size_t fcno, + size_t clen, + CB *cbp) { TEXT *tp; size_t len; - char *p; + CHAR_T *p; /* Get the line. */ if (db_get(sp, lno, DBG_FATAL, &p, &len)) @@ -264,14 +249,14 @@ cut_line(sp, lno, fcno, clen, cbp) * copy the portion we want, and reset the TEXT length. */ if (len != 0) { - if (clen == 0) + if (clen == ENTIRE_LINE) clen = len - fcno; - memcpy(tp->lb, p + fcno, clen); + MEMCPY(tp->lb, p + fcno, clen); tp->len = clen; } /* Append to the end of the cut buffer. */ - CIRCLEQ_INSERT_TAIL(&cbp->textq, tp, q); + TAILQ_INSERT_TAIL(cbp->textq, tp, q); cbp->len += tp->len; return (0); @@ -284,36 +269,36 @@ cut_line(sp, lno, fcno, clen, cbp) * PUBLIC: void cut_close __P((GS *)); */ void -cut_close(gp) - GS *gp; +cut_close(GS *gp) { CB *cbp; /* Free cut buffer list. */ - while ((cbp = gp->cutq.lh_first) != NULL) { - if (cbp->textq.cqh_first != (void *)&cbp->textq) - text_lfree(&cbp->textq); - LIST_REMOVE(cbp, q); + while ((cbp = SLIST_FIRST(gp->cutq)) != NULL) { + if (!TAILQ_EMPTY(cbp->textq)) + text_lfree(cbp->textq); + SLIST_REMOVE_HEAD(gp->cutq, q); free(cbp); } /* Free default cut storage. */ cbp = &gp->dcb_store; - if (cbp->textq.cqh_first != (void *)&cbp->textq) - text_lfree(&cbp->textq); + if (!TAILQ_EMPTY(cbp->textq)) + text_lfree(cbp->textq); } /* * text_init -- * Allocate a new TEXT structure. * - * PUBLIC: TEXT *text_init __P((SCR *, const char *, size_t, size_t)); + * PUBLIC: TEXT *text_init __P((SCR *, const CHAR_T *, size_t, size_t)); */ TEXT * -text_init(sp, p, len, total_len) - SCR *sp; - const char *p; - size_t len, total_len; +text_init( + SCR *sp, + const CHAR_T *p, + size_t len, + size_t total_len) { TEXT *tp; @@ -321,14 +306,14 @@ text_init(sp, p, len, total_len) if (tp == NULL) return (NULL); /* ANSI C doesn't define a call to malloc(3) for 0 bytes. */ - if ((tp->lb_len = total_len) != 0) { + if ((tp->lb_len = total_len * sizeof(CHAR_T)) != 0) { MALLOC(sp, tp->lb, CHAR_T *, tp->lb_len); if (tp->lb == NULL) { free(tp); return (NULL); } if (p != NULL && len != 0) - memcpy(tp->lb, p, len); + MEMCPY(tp->lb, p, len); } tp->len = len; return (tp); @@ -341,13 +326,12 @@ text_init(sp, p, len, total_len) * PUBLIC: void text_lfree __P((TEXTH *)); */ void -text_lfree(headp) - TEXTH *headp; +text_lfree(TEXTH *headp) { TEXT *tp; - while ((tp = headp->cqh_first) != (void *)headp) { - CIRCLEQ_REMOVE(headp, tp, q); + while ((tp = TAILQ_FIRST(headp)) != NULL) { + TAILQ_REMOVE(headp, tp, q); text_free(tp); } } @@ -359,8 +343,7 @@ text_lfree(headp) * PUBLIC: void text_free __P((TEXT *)); */ void -text_free(tp) - TEXT *tp; +text_free(TEXT *tp) { if (tp->lb != NULL) free(tp->lb); diff --git a/common/cut.h b/common/cut.h index 43f3ca817efd..30e9350dbb75 100644 --- a/common/cut.h +++ b/common/cut.h @@ -6,16 +6,17 @@ * * See the LICENSE file for redistribution information. * - * @(#)cut.h 10.5 (Berkeley) 4/3/96 + * $Id: cut.h,v 10.10 2012/02/11 15:52:33 zy Exp $ */ typedef struct _texth TEXTH; /* TEXT list head structure. */ -CIRCLEQ_HEAD(_texth, _text); +TAILQ_HEAD(_texth, _text); /* Cut buffers. */ struct _cb { - LIST_ENTRY(_cb) q; /* Linked list of cut buffers. */ - TEXTH textq; /* Linked list of TEXT structures. */ + SLIST_ENTRY(_cb) q; /* Linked list of cut buffers. */ + TEXTH textq[1]; /* Linked list of TEXT structures. */ + /* XXXX Needed ? Can non ascii-chars be cut buffer names ? */ CHAR_T name; /* Cut buffer name. */ size_t len; /* Total length of cut text. */ @@ -25,13 +26,15 @@ struct _cb { /* Lines/blocks of text. */ struct _text { /* Text: a linked list of lines. */ - CIRCLEQ_ENTRY(_text) q; /* Linked list of text structures. */ - char *lb; /* Line buffer. */ + TAILQ_ENTRY(_text) q; /* Linked list of text structures. */ + CHAR_T *lb; /* Line buffer. */ size_t lb_len; /* Line buffer length. */ size_t len; /* Line length. */ /* These fields are used by the vi text input routine. */ recno_t lno; /* 1-N: file line. */ + +#define ENTIRE_LINE ((size_t)-1) /* cno: end of the line. */ size_t cno; /* 0-N: file character in line. */ size_t ai; /* 0-N: autoindent bytes. */ size_t insert; /* 0-N: bytes to insert (push). */ @@ -65,8 +68,7 @@ struct _text { /* Text: a linked list of lines. */ #define CBNAME(sp, cbp, nch) { \ CHAR_T L__name; \ L__name = isupper(nch) ? tolower(nch) : (nch); \ - for (cbp = sp->gp->cutq.lh_first; \ - cbp != NULL; cbp = cbp->q.le_next) \ + SLIST_FOREACH(cbp, sp->gp->cutq, q) \ if (cbp->name == L__name) \ break; \ } diff --git a/common/delete.c b/common/delete.c index 001788f9bb38..bb476c0c8a7c 100644 --- a/common/delete.c +++ b/common/delete.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)delete.c 10.12 (Berkeley) 10/23/96"; +static const char sccsid[] = "$Id: delete.c,v 10.18 2012/02/11 15:52:33 zy Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -32,14 +33,15 @@ static const char sccsid[] = "@(#)delete.c 10.12 (Berkeley) 10/23/96"; * PUBLIC: int del __P((SCR *, MARK *, MARK *, int)); */ int -del(sp, fm, tm, lmode) - SCR *sp; - MARK *fm, *tm; - int lmode; +del( + SCR *sp, + MARK *fm, + MARK *tm, + int lmode) { recno_t lno; size_t blen, len, nlen, tlen; - char *bp, *p; + CHAR_T *bp, *p; int eof, rval; bp = NULL; @@ -66,7 +68,7 @@ del(sp, fm, tm, lmode) if (tm->lno == lno) { if (db_get(sp, lno, DBG_FATAL, &p, &len)) return (1); - eof = tm->cno >= len ? 1 : 0; + eof = tm->cno != ENTIRE_LINE && tm->cno >= len ? 1 : 0; } else eof = 1; if (eof) { @@ -80,8 +82,8 @@ del(sp, fm, tm, lmode) } if (db_get(sp, fm->lno, DBG_FATAL, &p, &len)) return (1); - GET_SPACE_RET(sp, bp, blen, fm->cno); - memcpy(bp, p, fm->cno); + GET_SPACE_RETW(sp, bp, blen, fm->cno); + MEMCPY(bp, p, fm->cno); if (db_set(sp, fm->lno, bp, fm->cno)) return (1); goto done; @@ -92,10 +94,11 @@ del(sp, fm, tm, lmode) if (tm->lno == fm->lno) { if (db_get(sp, fm->lno, DBG_FATAL, &p, &len)) return (1); - GET_SPACE_RET(sp, bp, blen, len); + GET_SPACE_RETW(sp, bp, blen, len); if (fm->cno != 0) - memcpy(bp, p, fm->cno); - memcpy(bp + fm->cno, p + (tm->cno + 1), len - (tm->cno + 1)); + MEMCPY(bp, p, fm->cno); + MEMCPY(bp + fm->cno, p + (tm->cno + 1), + len - (tm->cno + 1)); if (db_set(sp, fm->lno, bp, len - ((tm->cno - fm->cno) + 1))) goto err; @@ -110,8 +113,8 @@ del(sp, fm, tm, lmode) if ((tlen = fm->cno) != 0) { if (db_get(sp, fm->lno, DBG_FATAL, &p, NULL)) return (1); - GET_SPACE_RET(sp, bp, blen, tlen + 256); - memcpy(bp, p, tlen); + GET_SPACE_RETW(sp, bp, blen, tlen + 256); + MEMCPY(bp, p, tlen); } /* Copy the end partial line into place. */ @@ -130,11 +133,11 @@ del(sp, fm, tm, lmode) goto err; } if (tlen == 0) { - GET_SPACE_RET(sp, bp, blen, nlen); + GET_SPACE_RETW(sp, bp, blen, nlen); } else - ADD_SPACE_RET(sp, bp, blen, nlen); + ADD_SPACE_RETW(sp, bp, blen, nlen); - memcpy(bp + tlen, p + (tm->cno + 1), len - (tm->cno + 1)); + MEMCPY(bp + tlen, p + (tm->cno + 1), len - (tm->cno + 1)); tlen += len - (tm->cno + 1); } @@ -155,6 +158,6 @@ done: rval = 0; if (0) err: rval = 1; if (bp != NULL) - FREE_SPACE(sp, bp, blen); + FREE_SPACEW(sp, bp, blen); return (rval); } diff --git a/common/encoding.c b/common/encoding.c new file mode 100644 index 000000000000..6de509e5b8ec --- /dev/null +++ b/common/encoding.c @@ -0,0 +1,230 @@ +/*- + * Copyright (c) 2011, 2012 + * Zhihao Yuan. All rights reserved. + * + * See the LICENSE file for redistribution information. + */ + +#ifndef lint +static const char sccsid[] = "$Id: encoding.c,v 1.4 2011/12/13 19:40:52 zy Exp $"; +#endif /* not lint */ + +#include + +int looks_utf8 __P((const char *, size_t)); +int looks_utf16 __P((const char *, size_t)); +int decode_utf8 __P((const char *)); +int decode_utf16 __P((const char *, int)); + +#define F 0 /* character never appears in text */ +#define T 1 /* character appears in plain ASCII text */ +#define I 2 /* character appears in ISO-8859 text */ +#define X 3 /* character appears in non-ISO extended ASCII (Mac, IBM PC) */ + +static char text_chars[256] = { + /* BEL BS HT LF FF CR */ + F, F, F, F, F, F, F, T, T, T, T, F, T, T, F, F, /* 0x0X */ + /* ESC */ + F, F, F, F, F, F, F, F, F, F, F, T, F, F, F, F, /* 0x1X */ + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x2X */ + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x3X */ + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x4X */ + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x5X */ + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, /* 0x6X */ + T, T, T, T, T, T, T, T, T, T, T, T, T, T, T, F, /* 0x7X */ + /* NEL */ + X, X, X, X, X, T, X, X, X, X, X, X, X, X, X, X, /* 0x8X */ + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, /* 0x9X */ + I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xaX */ + I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xbX */ + I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xcX */ + I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xdX */ + I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, /* 0xeX */ + I, I, I, I, I, I, I, I, I, I, I, I, I, I, I, I /* 0xfX */ +}; + +/* + * looks_utf8 -- + * Decide whether some text looks like UTF-8. Returns: + * + * -1: invalid UTF-8 + * 0: uses odd control characters, so doesn't look like text + * 1: 7-bit text + * 2: definitely UTF-8 text (valid high-bit set bytes) + * + * Based on RFC 3629. UTF-8 with BOM is not accepted. + * + * PUBLIC: int looks_utf8 __P((const char *, size_t)); + */ +int +looks_utf8(const char *ibuf, size_t nbytes) +{ + const u_char *buf = (u_char *)ibuf; + size_t i; + int n; + int gotone = 0, ctrl = 0; + + for (i = 0; i < nbytes; i++) { + if ((buf[i] & 0x80) == 0) { /* 0xxxxxxx is plain ASCII */ + /* + * Even if the whole file is valid UTF-8 sequences, + * still reject it if it uses weird control characters. + */ + + if (text_chars[buf[i]] != T) + ctrl = 1; + } else if ((buf[i] & 0x40) == 0) { /* 10xxxxxx never 1st byte */ + return -1; + } else { /* 11xxxxxx begins UTF-8 */ + int following; + + if ((buf[i] & 0x20) == 0) /* 110xxxxx */ + if (buf[i] > 0xC1) /* C0, C1 */ + following = 1; + else return -1; + else if ((buf[i] & 0x10) == 0) /* 1110xxxx */ + following = 2; + else if ((buf[i] & 0x08) == 0) /* 11110xxx */ + if (buf[i] < 0xF5) + following = 3; + else return -1; /* F5, F6, F7 */ + else + return -1; /* F8~FF */ + + for (n = 0; n < following; n++) { + i++; + if (i >= nbytes) + goto done; + + if (buf[i] & 0x40) /* 10xxxxxx */ + return -1; + } + + gotone = 1; + } + } +done: + return ctrl ? 0 : (gotone ? 2 : 1); +} + +/* + * looks_utf16 -- + * Decide whether some text looks like UTF-16. Returns: + * + * 0: invalid UTF-16 + * 1: Little-endian UTF-16 + * 2: Big-endian UTF-16 + * + * PUBLIC: int looks_utf16 __P((const char *, size_t)); + */ +int +looks_utf16(const char *ibuf, size_t nbytes) +{ + const u_char *buf = (u_char *)ibuf; + int bigend; + size_t i; + unsigned int c; + int bom; + int following = 0; + + if (nbytes < 2) + return 0; + + bom = buf[0] << 8 ^ buf[1]; + if (bom == 0xFFFE) + bigend = 0; + else if (bom == 0xFEFF) + bigend = 1; + else + return 0; + + for (i = 2; i + 1 < nbytes; i += 2) { + if (bigend) + c = buf[i] << 8 ^ buf[i + 1]; + else + c = buf[i] ^ buf[i + 1] << 8; + + if (!following) + if (c < 0xD800 || c > 0xDFFF) + if (c < 128 && text_chars[c] != T) + return 0; + else + following = 0; + else if (c > 0xDBFF) + return 0; + else { + following = 1; + continue; + } + else if (c < 0xDC00 || c > 0xDFFF) + return 0; + } + + return 1 + bigend; +} + +#undef F +#undef T +#undef I +#undef X + +/* + * decode_utf8 -- + * Decode a UTF-8 character from byte string to Unicode. + * Returns -1 if the first byte is a not UTF-8 leader. + * + * Based on RFC 3629, but without error detection. + * + * PUBLIC: int decode_utf8 __P((const char *)); + */ +int decode_utf8(const char *ibuf) { + const u_char *buf = (u_char *)ibuf; + int u = -1; + + if ((buf[0] & 0x80) == 0) + u = buf[0]; + else if ((buf[0] & 0x40) == 0); + else { + if ((buf[0] & 0x20) == 0) + u = (buf[0] ^ 0xC0) << 6 ^ (buf[1] ^ 0x80); + else if ((buf[0] & 0x10) == 0) + u = (buf[0] ^ 0xE0) << 12 ^ (buf[1] ^ 0x80) << 6 + ^ (buf[2] ^ 0x80); + else if (((buf[0] & 0x08) == 0)) + u = (buf[0] ^ 0xF0) << 18 ^ (buf[1] ^ 0x80) << 12 + ^ (buf[2] ^ 0x80) << 6 ^ (buf[3] ^ 0x80); + } + return u; +} + +/* + * decode_utf16 -- + * Decode a UTF-16 character from byte string to Unicode. + * Returns -1 if the first unsigned integer is invalid. + * + * No error detection on supplementary bytes. + * + * PUBLIC: int decode_utf16 __P((const char *, int)); + */ +int decode_utf16(const char* ibuf, int bigend) { + const u_char *buf = (u_char *)ibuf; + int u = -1; + unsigned int w1, w2; + + if (bigend) + w1 = buf[0] << 8 ^ buf[1]; + else + w1 = buf[0] ^ buf[1] << 8; + + if (w1 < 0xD800 || w1 > 0xDFFF) + u = w1; + else if (w1 > 0xDBFF); + else { + if (bigend) + w2 = buf[2] << 8 ^ buf[3]; + else + w2 = buf[2] ^ buf[3] << 8; + u = ((w1 ^ 0xD800) << 10 ^ (w2 ^ 0xDC00)) + 0x10000; + } + return u; +} diff --git a/common/exf.c b/common/exf.c index 2993b0f4a8a5..6579ab2118d3 100644 --- a/common/exf.c +++ b/common/exf.c @@ -10,13 +10,13 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)exf.c 10.49 (Berkeley) 10/10/96"; +static const char sccsid[] = "$Id: exf.c,v 10.62 2013/07/01 23:28:13 zy Exp $"; #endif /* not lint */ -#include -#include /* XXX: param.h may not have included types.h */ +#include #include #include +#include /* * We include , because the flock(2) and open(2) #defines @@ -39,6 +39,7 @@ static const char sccsid[] = "@(#)exf.c 10.49 (Berkeley) 10/10/96"; static int file_backup __P((SCR *, char *, char *)); static void file_cinit __P((SCR *)); +static void file_encinit __P((SCR *)); static void file_comment __P((SCR *)); static int file_spath __P((SCR *, FREF *, struct stat *, int *)); @@ -55,12 +56,12 @@ static int file_spath __P((SCR *, FREF *, struct stat *, int *)); * vi now remembers the last location in any file that it has ever edited, * not just the previously edited file. * - * PUBLIC: FREF *file_add __P((SCR *, CHAR_T *)); + * PUBLIC: FREF *file_add __P((SCR *, char *)); */ FREF * -file_add(sp, name) - SCR *sp; - CHAR_T *name; +file_add( + SCR *sp, + char *name) { GS *gp; FREF *frp, *tfrp; @@ -76,15 +77,12 @@ file_add(sp, name) */ gp = sp->gp; if (name != NULL) - for (frp = gp->frefq.cqh_first; - frp != (FREF *)&gp->frefq; frp = frp->q.cqe_next) { + TAILQ_FOREACH_SAFE(frp, gp->frefq, q, tfrp) { if (frp->name == NULL) { - tfrp = frp->q.cqe_next; - CIRCLEQ_REMOVE(&gp->frefq, frp, q); + TAILQ_REMOVE(gp->frefq, frp, q); if (frp->name != NULL) free(frp->name); free(frp); - frp = tfrp; continue; } if (!strcmp(frp->name, name)) @@ -109,7 +107,7 @@ file_add(sp, name) } /* Append into the chain of file names. */ - CIRCLEQ_INSERT_TAIL(&gp->frefq, frp, q); + TAILQ_INSERT_TAIL(gp->frefq, frp, q); return (frp); } @@ -123,18 +121,18 @@ file_add(sp, name) * PUBLIC: int file_init __P((SCR *, FREF *, char *, int)); */ int -file_init(sp, frp, rcv_name, flags) - SCR *sp; - FREF *frp; - char *rcv_name; - int flags; +file_init( + SCR *sp, + FREF *frp, + char *rcv_name, + int flags) { EXF *ep; - RECNOINFO oinfo; + RECNOINFO oinfo = { 0 }; struct stat sb; size_t psize; int fd, exists, open_err, readonly; - char *oname, tname[MAXPATHLEN]; + char *oname, *tname; open_err = readonly = 0; @@ -164,7 +162,7 @@ file_init(sp, frp, rcv_name, flags) */ CALLOC_RET(sp, ep, EXF *, 1, sizeof(EXF)); ep->c_lno = ep->c_nlines = OOBLNO; - ep->rcv_fd = ep->fcntl_fd = -1; + ep->rcv_fd = -1; F_SET(ep, F_FIRSTMODIFY); /* @@ -182,52 +180,56 @@ file_init(sp, frp, rcv_name, flags) */ oname = frp->name; if (LF_ISSET(FS_OPENERR) || oname == NULL || !exists) { - if (opts_empty(sp, O_DIRECTORY, 0)) + struct stat sb; + + if (opts_empty(sp, O_TMPDIR, 0)) goto err; - (void)snprintf(tname, sizeof(tname), - "%s/vi.XXXXXX", O_STR(sp, O_DIRECTORY)); - if ((fd = mkstemp(tname)) == -1) { + if ((tname = + join(O_STR(sp, O_TMPDIR), "vi.XXXXXXXXXX")) == NULL) { + msgq(sp, M_SYSERR, NULL); + goto err; + } + if ((fd = mkstemp(tname)) == -1 || fstat(fd, &sb)) { + free(tname); msgq(sp, M_SYSERR, "237|Unable to create temporary file"); goto err; } (void)close(fd); - if (frp->name == NULL) + frp->tname = tname; + if (frp->name == NULL) { F_SET(frp, FR_TMPFILE); - if ((frp->tname = strdup(tname)) == NULL || - frp->name == NULL && (frp->name = strdup(tname)) == NULL) { - if (frp->tname != NULL) - free(frp->tname); - msgq(sp, M_SYSERR, NULL); - (void)unlink(tname); - goto err; + if ((frp->name = strdup(tname)) == NULL) { + msgq(sp, M_SYSERR, NULL); + goto err; + } } oname = frp->tname; psize = 1024; if (!LF_ISSET(FS_OPENERR)) F_SET(frp, FR_NEWFILE); - time(&ep->mtime); + ep->mtim = sb.st_mtimespec; } else { /* * XXX * A seat of the pants calculation: try to keep the file in - * 15 pages or less. Don't use a page size larger than 10K + * 15 pages or less. Don't use a page size larger than 16K * (vi should have good locality) or smaller than 1K. */ psize = ((sb.st_size / 15) + 1023) / 1024; - if (psize > 10) - psize = 10; + if (psize > 16) + psize = 16; if (psize == 0) psize = 1; - psize *= 1024; + psize = p2roundup(psize) << 10; F_SET(ep, F_DEVSET); ep->mdev = sb.st_dev; ep->minode = sb.st_ino; - ep->mtime = sb.st_mtime; + ep->mtim = sb.st_mtimespec; if (!S_ISREG(sb.st_mode)) msgq_str(sp, M_ERR, oname, @@ -235,7 +237,6 @@ file_init(sp, frp, rcv_name, flags) } /* Set up recovery. */ - memset(&oinfo, 0, sizeof(RECNOINFO)); oinfo.bval = '\n'; /* Always set. */ oinfo.psize = psize; oinfo.flags = F_ISSET(sp->gp, G_SNAPSHOT) ? R_SNAPSHOT : 0; @@ -333,8 +334,7 @@ file_init(sp, frp, rcv_name, flags) * an error. */ if (rcv_name == NULL) - switch (file_lock(sp, oname, - &ep->fcntl_fd, ep->db->fd(ep->db), 0)) { + switch (file_lock(sp, oname, ep->db->fd(ep->db), 0)) { case LOCK_FAILED: F_SET(frp, FR_UNLOCKED); break; @@ -391,9 +391,9 @@ file_init(sp, frp, rcv_name, flags) * probably isn't a problem for vi when it's running standalone. */ if (readonly || F_ISSET(sp, SC_READONLY) || - !F_ISSET(frp, FR_NEWFILE) && + (!F_ISSET(frp, FR_NEWFILE) && (!(sb.st_mode & (S_IWUSR | S_IWGRP | S_IWOTH)) || - access(frp->name, W_OK))) + access(frp->name, W_OK)))) O_SET(sp, O_READONLY); else O_CLR(sp, O_READONLY); @@ -403,6 +403,9 @@ file_init(sp, frp, rcv_name, flags) sp->ep = ep; sp->frp = frp; + /* Detect and set the file encoding */ + file_encinit(sp); + /* Set the initial cursor position, queue initial command. */ file_cinit(sp); @@ -441,16 +444,16 @@ oerr: if (F_ISSET(ep, F_RCV_ON)) * try and open. */ static int -file_spath(sp, frp, sbp, existsp) - SCR *sp; - FREF *frp; - struct stat *sbp; - int *existsp; +file_spath( + SCR *sp, + FREF *frp, + struct stat *sbp, + int *existsp) { - CHAR_T savech; + int savech; size_t len; int found; - char *name, *p, *t, path[MAXPATHLEN]; + char *name, *p, *t, *path; /* * If the name is NULL or an explicit reference (i.e., the first @@ -461,8 +464,8 @@ file_spath(sp, frp, sbp, existsp) *existsp = 0; return (0); } - if (name[0] == '/' || name[0] == '.' && - (name[1] == '/' || name[1] == '.' && name[2] == '/')) { + if (name[0] == '/' || (name[0] == '.' && + (name[1] == '/' || (name[1] == '.' && name[2] == '/')))) { *existsp = !stat(name, sbp); return (0); } @@ -476,16 +479,24 @@ file_spath(sp, frp, sbp, existsp) /* Try the O_PATH option values. */ for (found = 0, p = t = O_STR(sp, O_PATH);; ++p) if (*p == ':' || *p == '\0') { - if (t < p - 1) { + /* + * Ignore the empty strings and ".", since we've already + * tried the current directory. + */ + if (t < p && (p - t != 1 || *t != '.')) { savech = *p; *p = '\0'; - len = snprintf(path, - sizeof(path), "%s/%s", t, name); + if ((path = join(t, name)) == NULL) { + msgq(sp, M_SYSERR, NULL); + break; + } + len = strlen(path); *p = savech; if (!stat(path, sbp)) { found = 1; break; } + free(path); } t = p + 1; if (*p == '\0') @@ -494,10 +505,8 @@ file_spath(sp, frp, sbp, existsp) /* If we found it, build a new pathname and discard the old one. */ if (found) { - MALLOC_RET(sp, p, char *, len + 1); - memcpy(p, path, len + 1); free(frp->name); - frp->name = p; + frp->name = path; } *existsp = found; return (0); @@ -508,13 +517,14 @@ file_spath(sp, frp, sbp, existsp) * Set up the initial cursor position. */ static void -file_cinit(sp) - SCR *sp; +file_cinit(SCR *sp) { GS *gp; MARK m; size_t len; int nb; + CHAR_T *wp; + size_t wlen; /* Set some basic defaults. */ sp->lno = 1; @@ -548,8 +558,9 @@ file_cinit(sp) sp->lno = 1; sp->cno = 0; } - if (ex_run_str(sp, - "-c option", gp->c_option, strlen(gp->c_option), 1, 1)) + CHAR2INT(sp, gp->c_option, strlen(gp->c_option) + 1, + wp, wlen); + if (ex_run_str(sp, "-c option", wp, wlen - 1, 1, 1)) return; gp->c_option = NULL; } else if (F_ISSET(sp, SC_EX)) { @@ -617,10 +628,10 @@ file_cinit(sp) * PUBLIC: int file_end __P((SCR *, EXF *, int)); */ int -file_end(sp, ep, force) - SCR *sp; - EXF *ep; - int force; +file_end( + SCR *sp, + EXF *ep, + int force) { FREF *frp; @@ -665,7 +676,7 @@ file_end(sp, ep, force) free(frp->tname); frp->tname = NULL; if (F_ISSET(frp, FR_TMPFILE)) { - CIRCLEQ_REMOVE(&sp->gp->frefq, frp, q); + TAILQ_REMOVE(sp->gp->frefq, frp, q); if (frp->name != NULL) free(frp->name); free(frp); @@ -707,14 +718,14 @@ file_end(sp, ep, force) if (ep->rcv_mpath != NULL && unlink(ep->rcv_mpath)) msgq_str(sp, M_SYSERR, ep->rcv_mpath, "243|%s: remove"); } - if (ep->fcntl_fd != -1) - (void)close(ep->fcntl_fd); if (ep->rcv_fd != -1) (void)close(ep->rcv_fd); if (ep->rcv_path != NULL) free(ep->rcv_path); if (ep->rcv_mpath != NULL) free(ep->rcv_mpath); + if (ep->c_blen > 0) + free(ep->c_lp); free(ep); return (0); @@ -729,11 +740,12 @@ file_end(sp, ep, force) * PUBLIC: int file_write __P((SCR *, MARK *, MARK *, char *, int)); */ int -file_write(sp, fm, tm, name, flags) - SCR *sp; - MARK *fm, *tm; - char *name; - int flags; +file_write( + SCR *sp, + MARK *fm, + MARK *tm, + char *name, + int flags) { enum { NEWFILE, OLDFILE } mtype; struct stat sb; @@ -744,7 +756,7 @@ file_write(sp, fm, tm, name, flags) size_t len; u_long nlno, nch; int fd, nf, noname, oflags, rval; - char *p, *s, *t, buf[MAXPATHLEN + 64]; + char *p, *s, *t, buf[1024]; const char *msgstr; ep = sp->ep; @@ -807,9 +819,9 @@ file_write(sp, fm, tm, name, flags) mtype = NEWFILE; else { if (noname && !LF_ISSET(FS_FORCE | FS_APPEND) && - (F_ISSET(ep, F_DEVSET) && - (sb.st_dev != ep->mdev || sb.st_ino != ep->minode) || - sb.st_mtime != ep->mtime)) { + ((F_ISSET(ep, F_DEVSET) && + (sb.st_dev != ep->mdev || sb.st_ino != ep->minode)) || + timespeccmp(&sb.st_mtimespec, &ep->mtim, !=))) { msgq_str(sp, M_ERR, name, LF_ISSET(FS_POSSIBLE) ? "250|%s: file modified more recently than this copy; use ! to override" : "251|%s: file modified more recently than this copy"); @@ -832,32 +844,46 @@ file_write(sp, fm, tm, name, flags) SIGBLOCK; if ((fd = open(name, oflags, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)) < 0) { + if (errno == EACCES && LF_ISSET(FS_FORCE)) { + /* + * If the user owns the file but does not + * have write permission on it, grant it + * automatically for the duration of the + * opening of the file, if possible. + */ + struct stat sb; + mode_t fmode; + + if (stat(name, &sb) != 0) + goto fail_open; + fmode = sb.st_mode; + if (!(sb.st_mode & S_IWUSR) && sb.st_uid == getuid()) + fmode |= S_IWUSR; + else + goto fail_open; + if (chmod(name, fmode) != 0) + goto fail_open; + fd = open(name, oflags, S_IRUSR | S_IWUSR | + S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); + if (fd == -1) + goto fail_open; + (void)fchmod(fd, sb.st_mode); + goto success_open; + fail_open: + errno = EACCES; + } msgq_str(sp, M_SYSERR, name, "%s"); SIGUNBLOCK; return (1); } +success_open: SIGUNBLOCK; /* Try and get a lock. */ - if (!noname && file_lock(sp, NULL, NULL, fd, 0) == LOCK_UNAVAIL) + if (!noname && file_lock(sp, NULL, fd, 0) == LOCK_UNAVAIL) msgq_str(sp, M_ERR, name, "252|%s: write lock was unavailable"); -#if __linux__ - /* - * XXX - * In libc 4.5.x, fdopen(fd, "w") clears the O_APPEND flag (if set). - * This bug is fixed in libc 4.6.x. - * - * This code works around this problem for libc 4.5.x users. - * Note that this code is harmless if you're using libc 4.6.x. - */ - if (LF_ISSET(FS_APPEND) && lseek(fd, (off_t)0, SEEK_END) < 0) { - msgq(sp, M_SYSERR, name); - return (1); - } -#endif - /* * Use stdio for buffering. * @@ -891,13 +917,13 @@ file_write(sp, fm, tm, name, flags) */ if (noname) if (stat(name, &sb)) - time(&ep->mtime); + timepoint_system(&ep->mtim); else { F_SET(ep, F_DEVSET); ep->mdev = sb.st_dev; ep->minode = sb.st_ino; - ep->mtime = sb.st_mtime; + ep->mtim = sb.st_mtimespec; } /* @@ -970,7 +996,7 @@ file_write(sp, fm, tm, name, flags) *--s = '.'; } } - msgq(sp, M_INFO, s); + msgq(sp, M_INFO, "%s", s); if (nf) FREE_SPACE(sp, p, 0); return (0); @@ -989,9 +1015,10 @@ file_write(sp, fm, tm, name, flags) * recreate the file. So, let's not risk it. */ static int -file_backup(sp, name, bname) - SCR *sp; - char *name, *bname; +file_backup( + SCR *sp, + char *name, + char *bname) { struct dirent *dp; struct stat sb; @@ -1001,6 +1028,10 @@ file_backup(sp, name, bname) size_t blen; int flags, maxnum, nr, num, nw, rfd, wfd, version; char *bp, *estr, *p, *pct, *slash, *t, *wfname, buf[8192]; + CHAR_T *wp; + size_t wlen; + size_t nlen; + char *d = NULL; rfd = wfd = -1; bp = estr = wfname = NULL; @@ -1030,15 +1061,20 @@ file_backup(sp, name, bname) * * Shell and file name expand the option's value. */ - argv_init(sp, &cmd); - ex_cinit(&cmd, 0, 0, 0, 0, 0, NULL); + ex_cinit(sp, &cmd, 0, 0, 0, 0, 0); if (bname[0] == 'N') { version = 1; ++bname; } else version = 0; - if (argv_exp2(sp, &cmd, bname, strlen(bname))) + CHAR2INT(sp, bname, strlen(bname), wp, wlen); + if ((wp = v_wstrdup(sp, wp, wlen)) == NULL) return (1); + if (argv_exp2(sp, &cmd, wp, wlen)) { + free(wp); + return (1); + } + free(wp); /* * 0 args: impossible. @@ -1061,9 +1097,13 @@ file_backup(sp, name, bname) * by one. */ if (version) { - GET_SPACE_GOTO(sp, bp, blen, cmd.argv[0]->len * 2 + 50); - for (t = bp, slash = NULL, - p = cmd.argv[0]->bp; p[0] != '\0'; *t++ = *p++) + GET_SPACE_GOTOC(sp, bp, blen, cmd.argv[0]->len * 2 + 50); + INT2CHAR(sp, cmd.argv[0]->bp, cmd.argv[0]->len + 1, + p, nlen); + d = strdup(p); + p = d; + for (t = bp, slash = NULL; + p[0] != '\0'; *t++ = *p++) if (p[0] == '%') { if (p[1] != '%') *t++ = '%'; @@ -1084,7 +1124,8 @@ file_backup(sp, name, bname) p = slash + 1; } if (dirp == NULL) { - estr = cmd.argv[0]->bp; + INT2CHAR(sp, cmd.argv[0]->bp, cmd.argv[0]->len + 1, + estr, nlen); goto err; } @@ -1098,7 +1139,8 @@ file_backup(sp, name, bname) wfname = bp; } else { bp = NULL; - wfname = cmd.argv[0]->bp; + INT2CHAR(sp, cmd.argv[0]->bp, cmd.argv[0]->len + 1, + wfname, nlen); } /* Open the backup file, avoiding lurkers. */ @@ -1158,22 +1200,69 @@ err: if (rfd != -1) } if (estr) msgq_str(sp, M_SYSERR, estr, "%s"); + if (d != NULL) + free(d); if (bp != NULL) FREE_SPACE(sp, bp, blen); return (1); } +/* + * file_encinit -- + * Read the first line and set the O_FILEENCODING. + */ +static void +file_encinit(SCR *sp) +{ +#if defined(USE_WIDECHAR) && defined(USE_ICONV) + size_t len; + char *p; + size_t blen = 0; + char buf[4096]; /* not need to be '\0'-terminated */ + recno_t ln = 1; + EXF *ep; + + ep = sp->ep; + + while (!db_rget(sp, ln++, &p, &len)) { + if (blen + len > sizeof(buf)) + len = sizeof(buf) - blen; + memcpy(buf + blen, p, len); + blen += len; + if (blen == sizeof(buf)) + break; + else + buf[blen++] = '\n'; + } + + /* + * Detect UTF-8 and fallback to the locale/preset encoding. + * + * XXX + * A manually set O_FILEENCODING indicates the "fallback + * encoding", but UTF-8, which can be safely detected, is not + * inherited from the old screen. + */ + if (looks_utf8(buf, blen) > 1) + o_set(sp, O_FILEENCODING, OS_STRDUP, "utf-8", 0); + else if (!O_ISSET(sp, O_FILEENCODING) || + !strncasecmp(O_STR(sp, O_FILEENCODING), "utf-8", 5)) + o_set(sp, O_FILEENCODING, OS_STRDUP, codeset(), 0); + + conv_enc(sp, O_FILEENCODING, 0); +#endif +} + /* * file_comment -- * Skip the first comment. */ static void -file_comment(sp) - SCR *sp; +file_comment(SCR *sp) { recno_t lno; size_t len; - char *p; + CHAR_T *p; for (lno = 1; !db_get(sp, lno, 0, &p, &len) && len == 0; ++lno); if (p == NULL) @@ -1216,9 +1305,10 @@ file_comment(sp) * PUBLIC: int file_m1 __P((SCR *, int, int)); */ int -file_m1(sp, force, flags) - SCR *sp; - int force, flags; +file_m1( + SCR *sp, + int force, + int flags) { EXF *ep; @@ -1256,9 +1346,9 @@ file_m1(sp, force, flags) * PUBLIC: int file_m2 __P((SCR *, int)); */ int -file_m2(sp, force) - SCR *sp; - int force; +file_m2( + SCR *sp, + int force) { EXF *ep; @@ -1288,9 +1378,9 @@ file_m2(sp, force) * PUBLIC: int file_m3 __P((SCR *, int)); */ int -file_m3(sp, force) - SCR *sp; - int force; +file_m3( + SCR *sp, + int force) { EXF *ep; @@ -1324,9 +1414,9 @@ file_m3(sp, force) * PUBLIC: int file_aw __P((SCR *, int)); */ int -file_aw(sp, flags) - SCR *sp; - int flags; +file_aw( + SCR *sp, + int flags) { if (!F_ISSET(sp->ep, F_MODIFIED)) return (0); @@ -1385,9 +1475,9 @@ file_aw(sp, flags) * PUBLIC: void set_alt_name __P((SCR *, char *)); */ void -set_alt_name(sp, name) - SCR *sp; - char *name; +set_alt_name( + SCR *sp, + char *name) { if (sp->alt_name != NULL) free(sp->alt_name); @@ -1401,35 +1491,18 @@ set_alt_name(sp, name) * file_lock -- * Get an exclusive lock on a file. * - * XXX - * The default locking is flock(2) style, not fcntl(2). The latter is - * known to fail badly on some systems, and its only advantage is that - * it occasionally works over NFS. - * - * Furthermore, the semantics of fcntl(2) are wrong. The problems are - * two-fold: you can't close any file descriptor associated with the file - * without losing all of the locks, and you can't get an exclusive lock - * unless you have the file open for writing. Someone ought to be shot, - * but it's probably too late, they may already have reproduced. To get - * around these problems, nvi opens the files for writing when it can and - * acquires a second file descriptor when it can't. The recovery files - * are examples of the former, they're always opened for writing. The DB - * files can't be opened for writing because the semantics of DB are that - * files opened for writing are flushed back to disk when the DB session - * is ended. So, in that case we have to acquire an extra file descriptor. - * - * PUBLIC: lockr_t file_lock __P((SCR *, char *, int *, int, int)); + * PUBLIC: lockr_t file_lock __P((SCR *, char *, int, int)); */ lockr_t -file_lock(sp, name, fdp, fd, iswrite) - SCR *sp; - char *name; - int *fdp, fd, iswrite; +file_lock( + SCR *sp, + char *name, + int fd, + int iswrite) { if (!O_ISSET(sp, O_LOCKFILES)) return (LOCK_SUCCESS); -#ifdef HAVE_LOCK_FLOCK /* Hurrah! We've got flock(2). */ /* * !!! * We need to distinguish a lock not being available for the file @@ -1438,61 +1511,13 @@ file_lock(sp, name, fdp, fd, iswrite) * they are the former. There's no portable way to do this. */ errno = 0; - return (flock(fd, LOCK_EX | LOCK_NB) ? errno == EAGAIN + if (!flock(fd, LOCK_EX | LOCK_NB)) { + fcntl(fd, F_SETFD, 1); + return (LOCK_SUCCESS); + } + return (errno == EAGAIN #ifdef EWOULDBLOCK || errno == EWOULDBLOCK #endif - ? LOCK_UNAVAIL : LOCK_FAILED : LOCK_SUCCESS); -#endif -#ifdef HAVE_LOCK_FCNTL /* Gag me. We've got fcntl(2). */ -{ - struct flock arg; - int didopen, sverrno; - - arg.l_type = F_WRLCK; - arg.l_whence = 0; /* SEEK_SET */ - arg.l_start = arg.l_len = 0; - arg.l_pid = 0; - - /* - * If the file descriptor isn't opened for writing, it must fail. - * If we fail because we can't get a read/write file descriptor, - * we return LOCK_SUCCESS, believing that the file is readonly - * and that will be sufficient to warn the user. - */ - if (!iswrite) { - if (name == NULL || fdp == NULL) - return (LOCK_FAILED); - if ((fd = open(name, O_RDWR, 0)) == -1) - return (LOCK_SUCCESS); - *fdp = fd; - didopen = 1; - } - - errno = 0; - if (!fcntl(fd, F_SETLK, &arg)) - return (LOCK_SUCCESS); - if (didopen) { - sverrno = errno; - (void)close(fd); - errno = sverrno; - } - - /* - * !!! - * We need to distinguish a lock not being available for the file - * from the file system not supporting locking. Fcntl is documented - * as returning EACCESS and EAGAIN; add EWOULDBLOCK for good measure, - * and assume they are the former. There's no portable way to do this. - */ - return (errno == EACCES || errno == EAGAIN -#ifdef EWOULDBLOCK - || errno == EWOULDBLOCK -#endif - ? LOCK_UNAVAIL : LOCK_FAILED); -} -#endif -#if !defined(HAVE_LOCK_FLOCK) && !defined(HAVE_LOCK_FCNTL) - return (LOCK_SUCCESS); -#endif + ? LOCK_UNAVAIL : LOCK_FAILED); } diff --git a/common/exf.h b/common/exf.h index cdfaa8294485..8f70d51dbb61 100644 --- a/common/exf.h +++ b/common/exf.h @@ -6,7 +6,7 @@ * * See the LICENSE file for redistribution information. * - * @(#)exf.h 10.7 (Berkeley) 7/9/96 + * $Id: exf.h,v 10.10 2012/07/06 16:03:37 zy Exp $ */ /* Undo direction. */ /* @@ -18,8 +18,9 @@ struct _exf { /* Underlying database state. */ DB *db; /* File db structure. */ - char *c_lp; /* Cached line. */ + CHAR_T *c_lp; /* Cached line. */ size_t c_len; /* Cached line length. */ + size_t c_blen; /* Cached line buffer length. */ recno_t c_lno; /* Cached line number. */ recno_t c_nlines; /* Cached lines in the file. */ @@ -31,17 +32,12 @@ struct _exf { MARK l_cursor; /* Log cursor position. */ dir_t lundo; /* Last undo direction. */ - LIST_HEAD(_markh, _lmark) marks;/* Linked list of file MARK's. */ + /* Linked list of file MARK's. */ + SLIST_HEAD(_markh, _lmark) marks[1]; - /* - * XXX - * Mtime should be a struct timespec, but time_t is more portable. - */ - dev_t mdev; /* Device. */ - ino_t minode; /* Inode. */ - time_t mtime; /* Last modification time. */ - - int fcntl_fd; /* Fcntl locking fd; see exf.c. */ + dev_t mdev; /* Device. */ + ino_t minode; /* Inode. */ + struct timespec mtim; /* Last modification time. */ /* * Recovery in general, and these fields specifically, are described diff --git a/include/com_extern.h b/common/extern.h similarity index 52% rename from include/com_extern.h rename to common/extern.h index f140f9e34232..20672e380b14 100644 --- a/include/com_extern.h +++ b/common/extern.h @@ -1,94 +1,19 @@ -#ifndef HAVE_BSEARCH -void *bsearch __P((const void *, const void *, size_t, - size_t, int (*)(const void *, const void *))); -#endif -#ifndef HAVE_SETENV -int setenv __P((const char *, const char *, int)); -#endif -#ifndef HAVE_UNSETENV -void unsetenv __P((const char *)); -#endif -#ifndef HAVE_GETHOSTNAME -int gethostname __P((char *, int)); -#endif -#ifndef HAVE_GETOPT -int getopt __P((int, char * const *, const char *)); -#endif -#ifndef HAVE_MEMCHR -void *memchr __P((const void *, int, size_t)); -#endif -#ifndef HAVE_MEMCPY -void *memcpy __P((void *, const void *, size_t)); -#endif -#ifndef HAVE_MEMMOVE -void *memmove __P((void *, const void *, size_t)); -#endif -#ifndef HAVE_MEMSET -void *memset __P((void *, int, size_t)); -#endif -#ifndef HAVE_MKSTEMP -int mkstemp __P((char *)); -#endif -#ifndef HAVE_MMAP -char *mmap __P((char *, size_t, int, int, int, off_t)); -#endif -#ifndef HAVE_MMAP -int munmap __P((char *, size_t)); -#endif -#ifndef HAVE_SNPRINTF -int snprintf __P((char *, size_t, const char *, ...)); -#endif -#ifndef HAVE_STRDUP -char *strdup __P((const char *)); -#endif -#ifndef HAVE_STRERROR -char *strerror __P((int)); -#endif -#ifndef HAVE_STRPBRK -char *strpbrk __P((const char *, const char *)); -#endif -#ifndef HAVE_STRSEP -char *strsep __P((char **, const char *)); -#endif -#ifndef HAVE_STRTOL -long strtol __P((const char *, char **, int)); -#endif -#ifndef HAVE_STRTOUL -unsigned long strtoul __P((const char *, char **, int)); -#endif -#ifndef HAVE_VSNPRINTF -int vsnprintf __P((char *, size_t, const char *, ...)); -#endif -SCR *api_fscreen __P((int, char *)); -int api_aline __P((SCR *, recno_t, char *, size_t)); -int api_dline __P((SCR *, recno_t)); -int api_gline __P((SCR *, recno_t, char **, size_t *)); -int api_iline __P((SCR *, recno_t, char *, size_t)); -int api_lline __P((SCR *, recno_t *)); -int api_sline __P((SCR *, recno_t, char *, size_t)); -int api_getmark __P((SCR *, int, MARK *)); -int api_setmark __P((SCR *, int, MARK *)); -int api_nextmark __P((SCR *, int, char *)); -int api_getcursor __P((SCR *, MARK *)); -int api_setcursor __P((SCR *, MARK *)); -void api_emessage __P((SCR *, char *)); -void api_imessage __P((SCR *, char *)); -int api_edit __P((SCR *, char *, SCR **, int)); -int api_escreen __P((SCR *)); -int api_swscreen __P((SCR *, SCR *)); -int api_map __P((SCR *, char *, char *, size_t)); -int api_unmap __P((SCR *, char *)); -int api_opts_get __P((SCR *, char *, char **, int *)); -int api_opts_set __P((SCR *, char *, char *, u_long, int)); -int api_run_str __P((SCR *, char *)); +char * codeset __P((void)); +void conv_init __P((SCR *, SCR *)); +int conv_enc __P((SCR *, int, char *)); +void conv_end __P((SCR *)); int cut __P((SCR *, CHAR_T *, MARK *, MARK *, int)); int cut_line __P((SCR *, recno_t, size_t, size_t, CB *)); void cut_close __P((GS *)); -TEXT *text_init __P((SCR *, const char *, size_t, size_t)); +TEXT *text_init __P((SCR *, const CHAR_T *, size_t, size_t)); void text_lfree __P((TEXTH *)); void text_free __P((TEXT *)); int del __P((SCR *, MARK *, MARK *, int)); -FREF *file_add __P((SCR *, CHAR_T *)); +int looks_utf8 __P((const char *, size_t)); +int looks_utf16 __P((const char *, size_t)); +int decode_utf8 __P((const char *)); +int decode_utf16 __P((const char *, int)); +FREF *file_add __P((SCR *, char *)); int file_init __P((SCR *, FREF *, char *, int)); int file_end __P((SCR *, EXF *, int)); int file_write __P((SCR *, MARK *, MARK *, char *, int)); @@ -97,24 +22,26 @@ int file_m2 __P((SCR *, int)); int file_m3 __P((SCR *, int)); int file_aw __P((SCR *, int)); void set_alt_name __P((SCR *, char *)); -lockr_t file_lock __P((SCR *, char *, int *, int, int)); +lockr_t file_lock __P((SCR *, char *, int, int)); int v_key_init __P((SCR *)); void v_key_ilookup __P((SCR *)); size_t v_key_len __P((SCR *, ARG_CHAR_T)); -CHAR_T *v_key_name __P((SCR *, ARG_CHAR_T)); -int v_key_val __P((SCR *, ARG_CHAR_T)); +char *v_key_name __P((SCR *, ARG_CHAR_T)); +e_key_t v_key_val __P((SCR *, ARG_CHAR_T)); int v_event_push __P((SCR *, EVENT *, CHAR_T *, size_t, u_int)); int v_event_get __P((SCR *, EVENT *, int, u_int32_t)); void v_event_err __P((SCR *, EVENT *)); int v_event_flush __P((SCR *, u_int)); -int db_eget __P((SCR *, recno_t, char **, size_t *, int *)); -int db_get __P((SCR *, recno_t, u_int32_t, char **, size_t *)); +int db_eget __P((SCR *, recno_t, CHAR_T **, size_t *, int *)); +int db_get __P((SCR *, recno_t, u_int32_t, CHAR_T **, size_t *)); int db_delete __P((SCR *, recno_t)); -int db_append __P((SCR *, int, recno_t, char *, size_t)); -int db_insert __P((SCR *, recno_t, char *, size_t)); -int db_set __P((SCR *, recno_t, char *, size_t)); +int db_append __P((SCR *, int, recno_t, CHAR_T *, size_t)); +int db_insert __P((SCR *, recno_t, CHAR_T *, size_t)); +int db_set __P((SCR *, recno_t, CHAR_T *, size_t)); int db_exist __P((SCR *, recno_t)); int db_last __P((SCR *, recno_t *)); +int db_rget __P((SCR *, recno_t, char **, size_t *)); +int db_rset __P((SCR *, recno_t, char *, size_t)); void db_err __P((SCR *, recno_t)); int log_init __P((SCR *, EXF *)); int log_end __P((SCR *, EXF *)); @@ -132,7 +59,8 @@ int mark_get __P((SCR *, ARG_CHAR_T, MARK *, mtype_t)); int mark_set __P((SCR *, ARG_CHAR_T, MARK *, int)); int mark_insdel __P((SCR *, lnop_t, recno_t)); void msgq __P((SCR *, mtype_t, const char *, ...)); -void msgq_str __P((SCR *, mtype_t, char *, char *)); +void msgq_wstr __P((SCR *, mtype_t, const CHAR_T *, const char *)); +void msgq_str __P((SCR *, mtype_t, const char *, const char *)); void mod_rpt __P((SCR *)); void msgq_status __P((SCR *, recno_t, u_int)); int msg_open __P((SCR *, char *)); @@ -146,8 +74,8 @@ int o_set __P((SCR *, int, u_int, char *, u_long)); int opts_empty __P((SCR *, int, int)); void opts_dump __P((SCR *, enum optdisp)); int opts_save __P((SCR *, FILE *)); -OPTLIST const *opts_search __P((char *)); -void opts_nomatch __P((SCR *, char *)); +OPTLIST const *opts_search __P((CHAR_T *)); +void opts_nomatch __P((SCR *, CHAR_T *)); int opts_copy __P((SCR *, SCR *)); void opts_free __P((SCR *)); int f_altwerase __P((SCR *, OPTION *, char *, u_long *)); @@ -155,17 +83,16 @@ int f_columns __P((SCR *, OPTION *, char *, u_long *)); int f_lines __P((SCR *, OPTION *, char *, u_long *)); int f_lisp __P((SCR *, OPTION *, char *, u_long *)); int f_msgcat __P((SCR *, OPTION *, char *, u_long *)); -int f_paragraph __P((SCR *, OPTION *, char *, u_long *)); int f_print __P((SCR *, OPTION *, char *, u_long *)); int f_readonly __P((SCR *, OPTION *, char *, u_long *)); int f_recompile __P((SCR *, OPTION *, char *, u_long *)); int f_reformat __P((SCR *, OPTION *, char *, u_long *)); -int f_section __P((SCR *, OPTION *, char *, u_long *)); int f_ttywerase __P((SCR *, OPTION *, char *, u_long *)); int f_w300 __P((SCR *, OPTION *, char *, u_long *)); int f_w1200 __P((SCR *, OPTION *, char *, u_long *)); int f_w9600 __P((SCR *, OPTION *, char *, u_long *)); int f_window __P((SCR *, OPTION *, char *, u_long *)); +int f_encoding __P((SCR *, OPTION *, char *, u_long *)); int put __P((SCR *, CB *, CHAR_T *, MARK *, MARK *, int)); int rcv_tmp __P((SCR *, EXF *, char *)); int rcv_init __P((SCR *)); @@ -176,14 +103,14 @@ int screen_init __P((GS *, SCR *, SCR **)); int screen_end __P((SCR *)); SCR *screen_next __P((SCR *)); int f_search __P((SCR *, - MARK *, MARK *, char *, size_t, char **, u_int)); + MARK *, MARK *, CHAR_T *, size_t, CHAR_T **, u_int)); int b_search __P((SCR *, - MARK *, MARK *, char *, size_t, char **, u_int)); + MARK *, MARK *, CHAR_T *, size_t, CHAR_T **, u_int)); void search_busy __P((SCR *, busy_t)); int seq_set __P((SCR *, CHAR_T *, size_t, CHAR_T *, size_t, CHAR_T *, size_t, seq_t, int)); int seq_delete __P((SCR *, CHAR_T *, size_t, seq_t)); -int seq_mdel __P((SEQ *)); +int seq_free __P((SEQ *)); SEQ *seq_find __P((SCR *, SEQ **, EVENT *, CHAR_T *, size_t, seq_t, int *)); void seq_close __P((GS *)); @@ -193,7 +120,13 @@ int e_memcmp __P((CHAR_T *, EVENT *, size_t)); void *binc __P((SCR *, void *, size_t *, size_t)); int nonblank __P((SCR *, recno_t, size_t *)); char *tail __P((char *)); -CHAR_T *v_strdup __P((SCR *, const CHAR_T *, size_t)); -enum nresult nget_uslong __P((u_long *, const char *, char **, int)); -enum nresult nget_slong __P((long *, const char *, char **, int)); +char *join __P((char *, char *)); +char *expanduser __P((char *)); +char *quote __P((char *)); +char *v_strdup __P((SCR *, const char *, size_t)); +CHAR_T *v_wstrdup __P((SCR *, const CHAR_T *, size_t)); +enum nresult nget_uslong __P((u_long *, const CHAR_T *, CHAR_T **, int)); +enum nresult nget_slong __P((long *, const CHAR_T *, CHAR_T **, int)); +void timepoint_steady __P((struct timespec *)); +void timepoint_system __P((struct timespec *)); void TRACE __P((SCR *, const char *, ...)); diff --git a/common/gs.h b/common/gs.h index e5a43a656ac2..33a02458b0f9 100644 --- a/common/gs.h +++ b/common/gs.h @@ -6,11 +6,13 @@ * * See the LICENSE file for redistribution information. * - * @(#)gs.h 10.34 (Berkeley) 9/24/96 + * $Id: gs.h,v 11.0 2012/10/17 06:34:37 zy Exp $ */ #define TEMPORARY_FILE_STRING "/tmp" /* Default temporary file name. */ +#include + /* * File reference structure (FREF). The structure contains the name of the * file, along with the information that follows the name. @@ -19,7 +21,7 @@ * The read-only bit follows the file name, not the file itself. */ struct _fref { - CIRCLEQ_ENTRY(_fref) q; /* Linked list of file references. */ + TAILQ_ENTRY(_fref) q; /* Linked list of file references. */ char *name; /* File name. */ char *tname; /* Backing temporary file name. */ @@ -56,20 +58,15 @@ struct _gs { char *progname; /* Programe name. */ int id; /* Last allocated screen id. */ - CIRCLEQ_HEAD(_dqh, _scr) dq; /* Displayed screens. */ - CIRCLEQ_HEAD(_hqh, _scr) hq; /* Hidden screens. */ + TAILQ_HEAD(_dqh, _scr) dq[1]; /* Displayed screens. */ + TAILQ_HEAD(_hqh, _scr) hq[1]; /* Hidden screens. */ SCR *ccl_sp; /* Colon command-line screen. */ - void *perl_interp; /* Perl interpreter. */ - void *tcl_interp; /* Tcl_Interp *: Tcl interpreter. */ - void *cl_private; /* Curses support private area. */ - void *ip_private; /* IP support private area. */ - void *tk_private; /* Tk/Tcl support private area. */ /* File references. */ - CIRCLEQ_HEAD(_frefh, _fref) frefq; + TAILQ_HEAD(_frefh, _fref) frefq[1]; #define GO_COLUMNS 0 /* Global options: columns. */ #define GO_LINES 1 /* Global options: lines. */ @@ -77,10 +74,10 @@ struct _gs { #define GO_TERM 3 /* Global options: terminal type. */ OPTION opts[GO_TERM + 1]; - DB *msg; /* Message catalog DB. */ - MSGH msgq; /* User message list. */ + nl_catd catd; /* Message catalog descriptor. */ + MSGH msgq[1]; /* User message list. */ #define DEFAULT_NOPRINT '\1' /* Emergency non-printable character. */ - CHAR_T noprint; /* Cached, unprintable character. */ + int noprint; /* Cached, unprintable character. */ char *tmp_bp; /* Temporary buffer. */ size_t tmp_blen; /* Temporary buffer size. */ @@ -89,8 +86,9 @@ struct _gs { * Ex command structures (EXCMD). Defined here because ex commands * exist outside of any particular screen or file. */ -#define EXCMD_RUNNING(gp) ((gp)->ecq.lh_first->clen != 0) - LIST_HEAD(_excmdh, _excmd) ecq; /* Ex command linked list. */ +#define EXCMD_RUNNING(gp) (SLIST_FIRST((gp)->ecq)->clen != 0) + /* Ex command linked list. */ + SLIST_HEAD(_excmdh, _excmd) ecq[1]; EXCMD excmd; /* Default ex command structure. */ char *if_name; /* Current associated file. */ recno_t if_lno; /* Current associated line number. */ @@ -108,30 +106,28 @@ struct _gs { CB *dcbp; /* Default cut buffer pointer. */ CB dcb_store; /* Default cut buffer storage. */ - LIST_HEAD(_cuth, _cb) cutq; /* Linked list of cut buffers. */ + SLIST_HEAD(_cuth, _cb) cutq[1]; /* Linked list of cut buffers. */ -#define MAX_BIT_SEQ 128 /* Max + 1 fast check character. */ - LIST_HEAD(_seqh, _seq) seqq; /* Linked list of maps, abbrevs. */ - bitstr_t bit_decl(seqb, MAX_BIT_SEQ); +#define MAX_BIT_SEQ 0x7f /* Max + 1 fast check character. */ + SLIST_HEAD(_seqh, _seq) seqq[1];/* Linked list of maps, abbrevs. */ + bitstr_t bit_decl(seqb, MAX_BIT_SEQ + 1); -#define MAX_FAST_KEY 254 /* Max fast check character.*/ +#define MAX_FAST_KEY 0xff /* Max fast check character.*/ #define KEY_LEN(sp, ch) \ - ((unsigned char)(ch) <= MAX_FAST_KEY ? \ + (((ch) & ~MAX_FAST_KEY) == 0 ? \ sp->gp->cname[(unsigned char)ch].len : v_key_len(sp, ch)) #define KEY_NAME(sp, ch) \ - ((unsigned char)(ch) <= MAX_FAST_KEY ? \ + (((ch) & ~MAX_FAST_KEY) == 0 ? \ sp->gp->cname[(unsigned char)ch].name : v_key_name(sp, ch)) struct { - CHAR_T name[MAX_CHARACTER_COLUMNS + 1]; + char name[MAX_CHARACTER_COLUMNS + 1]; u_int8_t len; } cname[MAX_FAST_KEY + 1]; /* Fast lookup table. */ #define KEY_VAL(sp, ch) \ - ((unsigned char)(ch) <= MAX_FAST_KEY ? \ - sp->gp->special_key[(unsigned char)ch] : \ - (unsigned char)(ch) > sp->gp->max_special ? 0 : v_key_val(sp,ch)) - CHAR_T max_special; /* Max special character. */ - u_char /* Fast lookup table. */ + (((ch) & ~MAX_FAST_KEY) == 0 ? \ + sp->gp->special_key[(unsigned char)ch] : v_key_val(sp,ch)) + e_key_t /* Fast lookup table. */ special_key[MAX_FAST_KEY + 1]; /* Flags. */ @@ -149,6 +145,8 @@ struct _gs { /* Screen interface functions. */ /* Add a string to the screen. */ int (*scr_addstr) __P((SCR *, const char *, size_t)); + /* Add a string to the screen. */ + int (*scr_waddstr) __P((SCR *, const CHAR_T *, size_t)); /* Toggle a screen attribute. */ int (*scr_attr) __P((SCR *, scr_attr_t, int)); /* Terminal baud rate. */ @@ -157,12 +155,16 @@ struct _gs { int (*scr_bell) __P((SCR *)); /* Display a busy message. */ void (*scr_busy) __P((SCR *, const char *, busy_t)); + /* Prepare child. */ + int (*scr_child) __P((SCR *)); /* Clear to the end of the line. */ int (*scr_clrtoeol) __P((SCR *)); /* Return the cursor location. */ int (*scr_cursor) __P((SCR *, size_t *, size_t *)); /* Delete a line. */ int (*scr_deleteln) __P((SCR *)); + /* Discard a screen. */ + int (*scr_discard) __P((SCR *, SCR **)); /* Get a keyboard event. */ int (*scr_event) __P((SCR *, EVENT *, u_int32_t, int)); /* Ex: screen adjustment routine. */ @@ -183,8 +185,12 @@ struct _gs { int (*scr_refresh) __P((SCR *, int)); /* Rename the file. */ int (*scr_rename) __P((SCR *, char *, int)); + /* Reply to an event. */ + int (*scr_reply) __P((SCR *, int, char *)); /* Set the screen type. */ int (*scr_screen) __P((SCR *, u_int32_t)); + /* Split the screen. */ + int (*scr_split) __P((SCR *, SCR *)); /* Suspend the editor. */ int (*scr_suspend) __P((SCR *, int *)); /* Print usage message. */ diff --git a/common/key.c b/common/key.c index e1311ab571b0..652b8f3eae00 100644 --- a/common/key.c +++ b/common/key.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)key.c 10.33 (Berkeley) 9/24/96"; +static const char sccsid[] = "$Id: key.c,v 10.53 2013/03/11 01:20:53 yamt Exp $"; #endif /* not lint */ #include @@ -21,10 +21,10 @@ static const char sccsid[] = "@(#)key.c 10.33 (Berkeley) 9/24/96"; #include #include #include -#include #include #include #include +#include #include #include "common.h" @@ -100,32 +100,15 @@ static int nkeylist = * PUBLIC: int v_key_init __P((SCR *)); */ int -v_key_init(sp) - SCR *sp; +v_key_init(SCR *sp) { - CHAR_T ch; + int ch; GS *gp; KEYLIST *kp; int cnt; gp = sp->gp; - /* - * XXX - * 8-bit only, for now. Recompilation should get you any 8-bit - * character set, as long as nul isn't a character. - */ - (void)setlocale(LC_ALL, ""); -#if __linux__ - /* - * In libc 4.5.26, setlocale(LC_ALL, ""), doesn't setup the table - * for ctype(3c) correctly. This bug is fixed in libc 4.6.x. - * - * This code works around this problem for libc 4.5.x users. - * Note that this code is harmless if you're using libc 4.6.x. - */ - (void)setlocale(LC_CTYPE, ""); -#endif v_key_ilookup(sp); v_keyval(sp, K_CNTRLD, KEY_VEOF); @@ -137,15 +120,11 @@ v_key_init(sp) qsort(keylist, nkeylist, sizeof(keylist[0]), v_key_cmp); /* Initialize the fast lookup table. */ - for (gp->max_special = 0, kp = keylist, cnt = nkeylist; cnt--; ++kp) { - if (gp->max_special < kp->value) - gp->max_special = kp->value; - if (kp->ch <= MAX_FAST_KEY) - gp->special_key[kp->ch] = kp->value; - } + for (kp = keylist, cnt = nkeylist; cnt--; ++kp) + gp->special_key[kp->ch] = kp->value; /* Find a non-printable character to use as a message separator. */ - for (ch = 1; ch <= MAX_CHAR_T; ++ch) + for (ch = 1; ch <= UCHAR_MAX; ++ch) if (!isprint(ch)) { gp->noprint = ch; break; @@ -166,10 +145,10 @@ v_key_init(sp) * in the table, so we check for that first. */ static void -v_keyval(sp, val, name) - SCR *sp; - int val; - scr_keyval_t name; +v_keyval( + SCR *sp, + int val, + scr_keyval_t name) { KEYLIST *kp; CHAR_T ch; @@ -203,17 +182,20 @@ v_keyval(sp, val, name) * PUBLIC: void v_key_ilookup __P((SCR *)); */ void -v_key_ilookup(sp) - SCR *sp; +v_key_ilookup(SCR *sp) { - CHAR_T ch, *p, *t; + UCHAR_T ch; + char *p, *t; GS *gp; size_t len; - for (gp = sp->gp, ch = 0; ch <= MAX_FAST_KEY; ++ch) + for (gp = sp->gp, ch = 0;; ++ch) { for (p = gp->cname[ch].name, t = v_key_name(sp, ch), len = gp->cname[ch].len = sp->clen; len--;) *p++ = *t++; + if (ch == MAX_FAST_KEY) + break; + } } /* @@ -224,9 +206,9 @@ v_key_ilookup(sp) * PUBLIC: size_t v_key_len __P((SCR *, ARG_CHAR_T)); */ size_t -v_key_len(sp, ch) - SCR *sp; - ARG_CHAR_T ch; +v_key_len( + SCR *sp, + ARG_CHAR_T ch) { (void)v_key_name(sp, ch); return (sp->clen); @@ -237,30 +219,43 @@ v_key_len(sp, ch) * Return the string that will display the key. This routine * is the backup for the KEY_NAME() macro. * - * PUBLIC: CHAR_T *v_key_name __P((SCR *, ARG_CHAR_T)); + * PUBLIC: char *v_key_name __P((SCR *, ARG_CHAR_T)); */ -CHAR_T * -v_key_name(sp, ach) - SCR *sp; - ARG_CHAR_T ach; +char * +v_key_name( + SCR *sp, + ARG_CHAR_T ach) { - static const CHAR_T hexdigit[] = "0123456789abcdef"; - static const CHAR_T octdigit[] = "01234567"; - CHAR_T ch, *chp, mask; + static const char hexdigit[] = "0123456789abcdef"; + static const char octdigit[] = "01234567"; + int ch; size_t len; - int cnt, shift; + char *chp; - ch = ach; + /* + * Cache the last checked character. It won't be a problem + * since nvi will rescan the mapping when settings changed. + */ + if (ach && sp->lastc == ach) + return (sp->cname); + sp->lastc = ach; + +#ifdef USE_WIDECHAR + len = wctomb(sp->cname, ach); + if (len > MB_CUR_MAX) +#endif + sp->cname[(len = 1)-1] = (u_char)ach; + + ch = (u_char)sp->cname[0]; + sp->cname[len] = '\0'; /* See if the character was explicitly declared printable or not. */ if ((chp = O_STR(sp, O_PRINT)) != NULL) - for (; *chp != '\0'; ++chp) - if (*chp == ch) - goto pr; + if (strstr(chp, sp->cname) != NULL) + goto done; if ((chp = O_STR(sp, O_NOPRINT)) != NULL) - for (; *chp != '\0'; ++chp) - if (*chp == ch) - goto nopr; + if (strstr(chp, sp->cname) != NULL) + goto nopr; /* * Historical (ARPA standard) mappings. Printable characters are left @@ -274,41 +269,55 @@ v_key_name(sp, ach) * told that this is a reasonable assumption... * * XXX - * This code will only work with CHAR_T's that are multiples of 8-bit - * bytes. - * - * XXX - * NB: There's an assumption here that all printable characters take - * up a single column on the screen. This is not always correct. + * The code prints non-printable wide characters in 4 or 5 digits + * Unicode escape sequences, so only supports plane 0 to 15. */ - if (isprint(ch)) { -pr: sp->cname[0] = ch; - len = 1; + if (ISPRINT(ach)) goto done; - } nopr: if (iscntrl(ch) && (ch < 0x20 || ch == 0x7f)) { sp->cname[0] = '^'; sp->cname[1] = ch == 0x7f ? '?' : '@' + ch; len = 2; - } else if (O_ISSET(sp, O_OCTAL)) { -#define BITS (sizeof(CHAR_T) * 8) -#define SHIFT (BITS - BITS % 3) -#define TOPMASK (BITS % 3 == 2 ? 3 : 1) << (BITS - BITS % 3) + goto done; + } +#ifdef USE_WIDECHAR + if (INTISWIDE(ach)) { + int uc = -1; + + if (!strcmp(codeset(), "UTF-8")) + uc = decode_utf8(sp->cname); +#ifdef USE_ICONV + else { + char buf[sizeof(sp->cname)] = ""; + size_t left = sizeof(sp->cname); + char *in = sp->cname; + char *out = buf; + iconv(sp->conv.id[IC_IE_TO_UTF16], + (iconv_src_t)&in, &len, &out, &left); + iconv(sp->conv.id[IC_IE_TO_UTF16], + NULL, NULL, NULL, NULL); + uc = decode_utf16(buf, 1); + } +#endif + if (uc >= 0) { + len = snprintf(sp->cname, sizeof(sp->cname), + uc < 0x10000 ? "\\u%04x" : "\\U%05X", uc); + goto done; + } + } +#endif + if (O_ISSET(sp, O_OCTAL)) { sp->cname[0] = '\\'; - sp->cname[1] = octdigit[(ch & TOPMASK) >> SHIFT]; - shift = SHIFT - 3; - for (len = 2, mask = 7 << (SHIFT - 3), - cnt = BITS / 3; cnt-- > 0; mask >>= 3, shift -= 3) - sp->cname[len++] = octdigit[(ch & mask) >> shift]; + sp->cname[1] = octdigit[(ch & 0300) >> 6]; + sp->cname[2] = octdigit[(ch & 070) >> 3]; + sp->cname[3] = octdigit[ ch & 07 ]; } else { sp->cname[0] = '\\'; sp->cname[1] = 'x'; - for (len = 2, chp = (u_int8_t *)&ch, - cnt = sizeof(CHAR_T); cnt-- > 0; ++chp) { - sp->cname[len++] = hexdigit[(*chp & 0xf0) >> 4]; - sp->cname[len++] = hexdigit[*chp & 0x0f]; - } + sp->cname[2] = hexdigit[(ch & 0xf0) >> 4]; + sp->cname[3] = hexdigit[ ch & 0x0f ]; } + len = 4; done: sp->cname[sp->clen = len] = '\0'; return (sp->cname); } @@ -318,12 +327,12 @@ done: sp->cname[sp->clen = len] = '\0'; * Fill in the value for a key. This routine is the backup * for the KEY_VAL() macro. * - * PUBLIC: int v_key_val __P((SCR *, ARG_CHAR_T)); + * PUBLIC: e_key_t v_key_val __P((SCR *, ARG_CHAR_T)); */ -int -v_key_val(sp, ch) - SCR *sp; - ARG_CHAR_T ch; +e_key_t +v_key_val( + SCR *sp, + ARG_CHAR_T ch) { KEYLIST k, *kp; @@ -345,12 +354,12 @@ v_key_val(sp, ch) * PUBLIC: int v_event_push __P((SCR *, EVENT *, CHAR_T *, size_t, u_int)); */ int -v_event_push(sp, p_evp, p_s, nitems, flags) - SCR *sp; - EVENT *p_evp; /* Push event. */ - CHAR_T *p_s; /* Push characters. */ - size_t nitems; /* Number of items to push. */ - u_int flags; /* CH_* flags. */ +v_event_push( + SCR *sp, + EVENT *p_evp, /* Push event. */ + CHAR_T *p_s, /* Push characters. */ + size_t nitems, /* Number of items to push. */ + u_int flags) /* CH_* flags. */ { EVENT *evp; GS *gp; @@ -375,8 +384,8 @@ v_event_push(sp, p_evp, p_s, nitems, flags) if (total >= gp->i_nelem && v_event_grow(sp, MAX(total, 64))) return (1); if (gp->i_cnt) - MEMMOVE(gp->i_event + TERM_PUSH_SHIFT + nitems, - gp->i_event + gp->i_next, gp->i_cnt); + BCOPY(gp->i_event + gp->i_next, + gp->i_event + TERM_PUSH_SHIFT + nitems, gp->i_cnt); gp->i_next = TERM_PUSH_SHIFT; /* Put the new items into the queue. */ @@ -399,9 +408,9 @@ copy: gp->i_cnt += nitems; * Append events onto the tail of the buffer. */ static int -v_event_append(sp, argp) - SCR *sp; - EVENT *argp; +v_event_append( + SCR *sp, + EVENT *argp) { CHAR_T *s; /* Characters. */ EVENT *evp; @@ -526,11 +535,11 @@ v_event_append(sp, argp) * PUBLIC: int v_event_get __P((SCR *, EVENT *, int, u_int32_t)); */ int -v_event_get(sp, argp, timeout, flags) - SCR *sp; - EVENT *argp; - int timeout; - u_int32_t flags; +v_event_get( + SCR *sp, + EVENT *argp, + int timeout, + u_int32_t flags) { EVENT *evp, ev; GS *gp; @@ -630,7 +639,8 @@ newmap: evp = &gp->i_event[gp->i_next]; */ if (istimeout || F_ISSET(&evp->e_ch, CH_NOMAP) || !LF_ISSET(EC_MAPCOMMAND | EC_MAPINPUT) || - evp->e_c < MAX_BIT_SEQ && !bit_test(gp->seqb, evp->e_c)) + ((evp->e_c & ~MAX_BIT_SEQ) == 0 && + !bit_test(gp->seqb, evp->e_c))) goto nomap; /* Search the map. */ @@ -664,7 +674,7 @@ newmap: evp = &gp->i_event[gp->i_next]; /* If no map, return the character. */ if (qp == NULL) { -nomap: if (!isdigit(evp->e_c) && LF_ISSET(EC_MAPNODIGIT)) +nomap: if (!ISDIGIT(evp->e_c) && LF_ISSET(EC_MAPNODIGIT)) goto not_digit; *argp = *evp; QREM(1); @@ -676,7 +686,7 @@ nomap: if (!isdigit(evp->e_c) && LF_ISSET(EC_MAPNODIGIT)) * of the map is it, pretend we haven't seen the character. */ if (LF_ISSET(EC_MAPNODIGIT) && - qp->output != NULL && !isdigit(qp->output[0])) { + qp->output != NULL && !ISDIGIT(qp->output[0])) { not_digit: argp->e_c = CH_NOT_DIGIT; argp->e_value = K_NOTUSED; argp->e_event = E_CHARACTER; @@ -744,16 +754,16 @@ not_digit: argp->e_c = CH_NOT_DIGIT; * Walk the screen lists, sync'ing files to their backup copies. */ static void -v_sync(sp, flags) - SCR *sp; - int flags; +v_sync( + SCR *sp, + int flags) { GS *gp; gp = sp->gp; - for (sp = gp->dq.cqh_first; sp != (void *)&gp->dq; sp = sp->q.cqe_next) + TAILQ_FOREACH(sp, gp->dq, q) rcv_sync(sp, flags); - for (sp = gp->hq.cqh_first; sp != (void *)&gp->hq; sp = sp->q.cqe_next) + TAILQ_FOREACH(sp, gp->hq, q) rcv_sync(sp, flags); } @@ -764,9 +774,9 @@ v_sync(sp, flags) * PUBLIC: void v_event_err __P((SCR *, EVENT *)); */ void -v_event_err(sp, evp) - SCR *sp; - EVENT *evp; +v_event_err( + SCR *sp, + EVENT *evp) { switch (evp->e_event) { case E_CHARACTER: @@ -778,9 +788,6 @@ v_event_err(sp, evp) case E_INTERRUPT: msgq(sp, M_ERR, "279|Unexpected interrupt event"); break; - case E_QUIT: - msgq(sp, M_ERR, "280|Unexpected quit event"); - break; case E_REPAINT: msgq(sp, M_ERR, "281|Unexpected repaint event"); break; @@ -793,9 +800,6 @@ v_event_err(sp, evp) case E_WRESIZE: msgq(sp, M_ERR, "316|Unexpected resize event"); break; - case E_WRITE: - msgq(sp, M_ERR, "287|Unexpected write event"); - break; /* * Theoretically, none of these can occur, as they're handled at the @@ -820,9 +824,9 @@ v_event_err(sp, evp) * PUBLIC: int v_event_flush __P((SCR *, u_int)); */ int -v_event_flush(sp, flags) - SCR *sp; - u_int flags; +v_event_flush( + SCR *sp, + u_int flags) { GS *gp; int rval; @@ -838,9 +842,9 @@ v_event_flush(sp, flags) * Grow the terminal queue. */ static int -v_event_grow(sp, add) - SCR *sp; - int add; +v_event_grow( + SCR *sp, + int add) { GS *gp; size_t new_nelem, olen; @@ -848,7 +852,7 @@ v_event_grow(sp, add) gp = sp->gp; new_nelem = gp->i_nelem + add; olen = gp->i_nelem * sizeof(gp->i_event[0]); - BINC_RET(sp, gp->i_event, olen, new_nelem * sizeof(gp->i_event[0])); + BINC_RET(sp, EVENT, gp->i_event, olen, new_nelem * sizeof(gp->i_event[0])); gp->i_nelem = olen / sizeof(gp->i_event[0]); return (0); } @@ -858,8 +862,9 @@ v_event_grow(sp, add) * Compare two keys for sorting. */ static int -v_key_cmp(ap, bp) - const void *ap, *bp; +v_key_cmp( + const void *ap, + const void *bp) { return (((KEYLIST *)ap)->ch - ((KEYLIST *)bp)->ch); } diff --git a/common/key.h b/common/key.h index 76fb64f8e1ec..3eeca124a00a 100644 --- a/common/key.h +++ b/common/key.h @@ -6,27 +6,47 @@ * * See the LICENSE file for redistribution information. * - * @(#)key.h 10.18 (Berkeley) 6/30/96 + * $Id: key.h,v 10.55 2012/10/07 01:31:17 zy Exp $ */ -/* - * Fundamental character types. - * - * CHAR_T An integral type that can hold any character. - * ARG_CHAR_T The type of a CHAR_T when passed as an argument using - * traditional promotion rules. It should also be able - * to be compared against any CHAR_T for equality without - * problems. - * MAX_CHAR_T The maximum value of any character. - * - * If no integral type can hold a character, don't even try the port. - */ -typedef u_char CHAR_T; -typedef u_int ARG_CHAR_T; -#define MAX_CHAR_T 0xff +#include "multibyte.h" + +#ifdef USE_WIDECHAR +#define FILE2INT5(sp,buf,n,nlen,w,wlen) \ + sp->conv.file2int(sp, n, nlen, &buf, &wlen, &w) +#define INT2FILE(sp,w,wlen,n,nlen) \ + sp->conv.int2file(sp, w, wlen, &sp->cw, &nlen, &n) +#define CHAR2INT5(sp,buf,n,nlen,w,wlen) \ + sp->conv.sys2int(sp, n, nlen, &buf, &wlen, &w) +#define INT2CHAR(sp,w,wlen,n,nlen) \ + sp->conv.int2sys(sp, w, wlen, &sp->cw, &nlen, &n) +#define INPUT2INT5(sp,cw,n,nlen,w,wlen) \ + sp->conv.input2int(sp, n, nlen, &(cw), &wlen, &w) +#define CONST +#define CHAR_WIDTH(sp, ch) wcwidth(ch) +#define INTISWIDE(c) (wctob(c) == EOF) +#else +#define FILE2INT5(sp,buf,n,nlen,w,wlen) \ + (w = n, wlen = nlen, 0) +#define INT2FILE(sp,w,wlen,n,nlen) \ + (n = w, nlen = wlen, 0) +#define CHAR2INT5(sp,buf,n,nlen,w,wlen) \ + (w = n, wlen = nlen, 0) +#define INT2CHAR(sp,w,wlen,n,nlen) \ + (n = w, nlen = wlen, 0) +#define INPUT2INT5(sp,buf,n,nlen,w,wlen) \ + (w = n, wlen = nlen, 0) +#define CONST const +#define INTISWIDE(c) 0 +#define CHAR_WIDTH(sp, ch) 1 +#endif +#define FILE2INT(sp,n,nlen,w,wlen) \ + FILE2INT5(sp,sp->cw,n,nlen,w,wlen) +#define CHAR2INT(sp,n,nlen,w,wlen) \ + CHAR2INT5(sp,sp->cw,n,nlen,w,wlen) /* The maximum number of columns any character can take up on a screen. */ -#define MAX_CHARACTER_COLUMNS 4 +#define MAX_CHARACTER_COLUMNS 7 /* * Event types. @@ -42,14 +62,12 @@ typedef enum { E_EOF, /* End of input (NOT ^D). */ E_ERR, /* Input error. */ E_INTERRUPT, /* Interrupt. */ - E_QUIT, /* Quit. */ E_REPAINT, /* Repaint: e_flno, e_tlno set. */ E_SIGHUP, /* SIGHUP. */ E_SIGTERM, /* SIGTERM. */ E_STRING, /* Input string: e_csp, e_len set. */ E_TIMEOUT, /* Timeout. */ E_WRESIZE, /* Window resize. */ - E_WRITE /* Write. */ } e_event_t; /* @@ -124,7 +142,7 @@ struct _event { typedef struct _keylist { e_key_t value; /* Special value. */ - CHAR_T ch; /* Key. */ + int ch; /* Key. */ } KEYLIST; extern KEYLIST keylist[]; @@ -137,15 +155,13 @@ extern KEYLIST keylist[]; /* * Ex/vi commands are generally separated by whitespace characters. We * can't use the standard isspace(3) macro because it returns true for - * characters like ^K in the ASCII character set. The 4.4BSD isblank(3) - * macro does exactly what we want, but it's not portable yet. + * characters like ^K in the ASCII character set. The POSIX isblank(3) + * has the same problem for non-ASCII locale, so we need a standalone one. * * XXX * Note side effect, ch is evaluated multiple times. */ -#ifndef isblank -#define isblank(ch) ((ch) == ' ' || (ch) == '\t') -#endif +#define cmdskip(ch) ((ch) == ' ' || (ch) == '\t') /* The "standard" tab width, for displaying things to users. */ #define STANDARD_TAB 6 diff --git a/common/line.c b/common/line.c index bcb9e0c86bcb..0bceccfa5bcc 100644 --- a/common/line.c +++ b/common/line.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)line.c 10.21 (Berkeley) 9/15/96"; +static const char sccsid[] = "$Id: line.c,v 10.26 2011/08/12 12:36:41 zy Exp $"; #endif /* not lint */ #include @@ -32,15 +32,15 @@ static int scr_update __P((SCR *, recno_t, lnop_t, int)); * db_eget -- * Front-end to db_get, special case handling for empty files. * - * PUBLIC: int db_eget __P((SCR *, recno_t, char **, size_t *, int *)); + * PUBLIC: int db_eget __P((SCR *, recno_t, CHAR_T **, size_t *, int *)); */ int -db_eget(sp, lno, pp, lenp, isemptyp) - SCR *sp; - recno_t lno; /* Line number. */ - char **pp; /* Pointer store. */ - size_t *lenp; /* Length store. */ - int *isemptyp; +db_eget( + SCR *sp, + recno_t lno, /* Line number. */ + CHAR_T **pp, /* Pointer store. */ + size_t *lenp, /* Length store. */ + int *isemptyp) { recno_t l1; @@ -60,7 +60,7 @@ db_eget(sp, lno, pp, lenp, isemptyp) return (1); /* If the file isn't empty, fail loudly. */ - if (lno != 0 && lno != 1 || l1 != 0) { + if ((lno != 0 && lno != 1) || l1 != 0) { db_err(sp, lno); return (1); } @@ -76,20 +76,23 @@ db_eget(sp, lno, pp, lenp, isemptyp) * Look in the text buffers for a line, followed by the cache, followed * by the database. * - * PUBLIC: int db_get __P((SCR *, recno_t, u_int32_t, char **, size_t *)); + * PUBLIC: int db_get __P((SCR *, recno_t, u_int32_t, CHAR_T **, size_t *)); */ int -db_get(sp, lno, flags, pp, lenp) - SCR *sp; - recno_t lno; /* Line number. */ - u_int32_t flags; - char **pp; /* Pointer store. */ - size_t *lenp; /* Length store. */ +db_get( + SCR *sp, + recno_t lno, /* Line number. */ + u_int32_t flags, + CHAR_T **pp, /* Pointer store. */ + size_t *lenp) /* Length store. */ { DBT data, key; EXF *ep; TEXT *tp; recno_t l1, l2; + CHAR_T *wp; + size_t wlen; + size_t nlen; /* * The underlying recno stuff handles zero by returning NULL, but @@ -113,14 +116,14 @@ db_get(sp, lno, flags, pp, lenp) * is there. */ if (F_ISSET(sp, SC_TINPUT)) { - l1 = ((TEXT *)sp->tiq.cqh_first)->lno; - l2 = ((TEXT *)sp->tiq.cqh_last)->lno; + l1 = ((TEXT *)TAILQ_FIRST(sp->tiq))->lno; + l2 = ((TEXT *)TAILQ_LAST(sp->tiq, _texth))->lno; if (l1 <= lno && l2 >= lno) { #if defined(DEBUG) && 0 TRACE(sp, "retrieve TEXT buffer line %lu\n", (u_long)lno); #endif - for (tp = sp->tiq.cqh_first; - tp->lno != lno; tp = tp->q.cqe_next); + for (tp = TAILQ_FIRST(sp->tiq); + tp->lno != lno; tp = TAILQ_NEXT(tp, q)); if (lenp != NULL) *lenp = tp->len; if (pp != NULL) @@ -149,32 +152,52 @@ db_get(sp, lno, flags, pp, lenp) ep->c_lno = OOBLNO; nocache: + nlen = 1024; +retry: /* Get the line from the underlying database. */ key.data = &lno; key.size = sizeof(lno); switch (ep->db->get(ep->db, &key, &data, 0)) { - case -1: + case -1: goto err2; case 1: err1: if (LF_ISSET(DBG_FATAL)) err2: db_err(sp, lno); +alloc_err: err3: if (lenp != NULL) *lenp = 0; if (pp != NULL) *pp = NULL; return (1); + case 0: + if (data.size > nlen) { + nlen = data.size; + goto retry; + } + } + + if (FILE2INT(sp, data.data, data.size, wp, wlen)) { + if (!F_ISSET(sp, SC_CONV_ERROR)) { + F_SET(sp, SC_CONV_ERROR); + msgq(sp, M_ERR, "324|Conversion error on line %d", lno); + } + goto err3; } /* Reset the cache. */ + if (wp != data.data) { + BINC_GOTOW(sp, ep->c_lp, ep->c_blen, wlen); + MEMCPY(ep->c_lp, wp, wlen); + } else + ep->c_lp = data.data; ep->c_lno = lno; - ep->c_len = data.size; - ep->c_lp = data.data; + ep->c_len = wlen; #if defined(DEBUG) && 0 TRACE(sp, "retrieve DB line %lu\n", (u_long)lno); #endif if (lenp != NULL) - *lenp = data.size; + *lenp = wlen; if (pp != NULL) *pp = ep->c_lp; return (0); @@ -187,9 +210,9 @@ err3: if (lenp != NULL) * PUBLIC: int db_delete __P((SCR *, recno_t)); */ int -db_delete(sp, lno) - SCR *sp; - recno_t lno; +db_delete( + SCR *sp, + recno_t lno) { DBT key; EXF *ep; @@ -242,18 +265,20 @@ db_delete(sp, lno) * db_append -- * Append a line into the file. * - * PUBLIC: int db_append __P((SCR *, int, recno_t, char *, size_t)); + * PUBLIC: int db_append __P((SCR *, int, recno_t, CHAR_T *, size_t)); */ int -db_append(sp, update, lno, p, len) - SCR *sp; - int update; - recno_t lno; - char *p; - size_t len; +db_append( + SCR *sp, + int update, + recno_t lno, + CHAR_T *p, + size_t len) { DBT data, key; EXF *ep; + char *fp; + size_t flen; int rval; #if defined(DEBUG) && 0 @@ -265,11 +290,13 @@ db_append(sp, update, lno, p, len) return (1); } + INT2FILE(sp, p, len, fp, flen); + /* Update file. */ key.data = &lno; key.size = sizeof(lno); - data.data = p; - data.size = len; + data.data = fp; + data.size = flen; SIGBLOCK; if (ep->db->put(ep->db, &key, &data, R_IAFTER) == -1) { msgq(sp, M_SYSERR, @@ -316,17 +343,19 @@ db_append(sp, update, lno, p, len) * db_insert -- * Insert a line into the file. * - * PUBLIC: int db_insert __P((SCR *, recno_t, char *, size_t)); + * PUBLIC: int db_insert __P((SCR *, recno_t, CHAR_T *, size_t)); */ int -db_insert(sp, lno, p, len) - SCR *sp; - recno_t lno; - char *p; - size_t len; +db_insert( + SCR *sp, + recno_t lno, + CHAR_T *p, + size_t len) { DBT data, key; EXF *ep; + char *fp; + size_t flen; int rval; #if defined(DEBUG) && 0 @@ -339,11 +368,13 @@ db_insert(sp, lno, p, len) return (1); } + INT2FILE(sp, p, len, fp, flen); + /* Update file. */ key.data = &lno; key.size = sizeof(lno); - data.data = p; - data.size = len; + data.data = fp; + data.size = flen; SIGBLOCK; if (ep->db->put(ep->db, &key, &data, R_IBEFORE) == -1) { msgq(sp, M_SYSERR, @@ -381,23 +412,24 @@ db_insert(sp, lno, p, len) * db_set -- * Store a line in the file. * - * PUBLIC: int db_set __P((SCR *, recno_t, char *, size_t)); + * PUBLIC: int db_set __P((SCR *, recno_t, CHAR_T *, size_t)); */ int -db_set(sp, lno, p, len) - SCR *sp; - recno_t lno; - char *p; - size_t len; +db_set( + SCR *sp, + recno_t lno, + CHAR_T *p, + size_t len) { DBT data, key; EXF *ep; + char *fp; + size_t flen; #if defined(DEBUG) && 0 TRACE(sp, "replace line %lu: len %lu {%.*s}\n", (u_long)lno, (u_long)len, MIN(len, 20), p); #endif - /* Check for no underlying file. */ if ((ep = sp->ep) == NULL) { ex_emsg(sp, NULL, EXM_NOFILEYET); @@ -407,11 +439,13 @@ db_set(sp, lno, p, len) /* Log before change. */ log_line(sp, lno, LOG_LINE_RESET_B); + INT2FILE(sp, p, len, fp, flen); + /* Update file. */ key.data = &lno; key.size = sizeof(lno); - data.data = p; - data.size = len; + data.data = fp; + data.size = flen; SIGBLOCK; if (ep->db->put(ep->db, &key, &data, 0) == -1) { msgq(sp, M_SYSERR, @@ -443,9 +477,9 @@ db_set(sp, lno, p, len) * PUBLIC: int db_exist __P((SCR *, recno_t)); */ int -db_exist(sp, lno) - SCR *sp; - recno_t lno; +db_exist( + SCR *sp, + recno_t lno) { EXF *ep; @@ -464,8 +498,8 @@ db_exist(sp, lno) */ if (ep->c_nlines != OOBLNO) return (lno <= (F_ISSET(sp, SC_TINPUT) ? - ep->c_nlines + (((TEXT *)sp->tiq.cqh_last)->lno - - ((TEXT *)sp->tiq.cqh_first)->lno) : ep->c_nlines)); + ep->c_nlines + (((TEXT *)TAILQ_LAST(sp->tiq, _texth))->lno - + ((TEXT *)TAILQ_FIRST(sp->tiq))->lno) : ep->c_nlines)); /* Go get the line. */ return (!db_get(sp, lno, 0, NULL, NULL)); @@ -478,13 +512,15 @@ db_exist(sp, lno) * PUBLIC: int db_last __P((SCR *, recno_t *)); */ int -db_last(sp, lnop) - SCR *sp; - recno_t *lnop; +db_last( + SCR *sp, + recno_t *lnop) { DBT data, key; EXF *ep; recno_t lno; + CHAR_T *wp; + size_t wlen; /* Check for no underlying file. */ if ((ep = sp->ep) == NULL) { @@ -499,8 +535,8 @@ db_last(sp, lnop) if (ep->c_nlines != OOBLNO) { *lnop = ep->c_nlines; if (F_ISSET(sp, SC_TINPUT)) - *lnop += ((TEXT *)sp->tiq.cqh_last)->lno - - ((TEXT *)sp->tiq.cqh_first)->lno; + *lnop += ((TEXT *)TAILQ_LAST(sp->tiq, _texth))->lno - + ((TEXT *)TAILQ_FIRST(sp->tiq))->lno; return (0); } @@ -508,27 +544,104 @@ db_last(sp, lnop) key.size = sizeof(lno); switch (ep->db->seq(ep->db, &key, &data, R_LAST)) { - case -1: + case -1: +alloc_err: msgq(sp, M_SYSERR, "007|unable to get last line"); *lnop = 0; return (1); - case 1: + case 1: *lnop = 0; return (0); - default: - break; + case 0: + ; } - /* Fill the cache. */ memcpy(&lno, key.data, sizeof(lno)); - ep->c_nlines = ep->c_lno = lno; - ep->c_len = data.size; - ep->c_lp = data.data; + + if (lno != ep->c_lno) { + FILE2INT(sp, data.data, data.size, wp, wlen); + + /* Fill the cache. */ + if (wp != data.data) { + BINC_GOTOW(sp, ep->c_lp, ep->c_blen, wlen); + MEMCPY(ep->c_lp, wp, wlen); + } else + ep->c_lp = data.data; + ep->c_lno = lno; + ep->c_len = wlen; + } + ep->c_nlines = lno; /* Return the value. */ *lnop = (F_ISSET(sp, SC_TINPUT) && - ((TEXT *)sp->tiq.cqh_last)->lno > lno ? - ((TEXT *)sp->tiq.cqh_last)->lno : lno); + ((TEXT *)TAILQ_LAST(sp->tiq, _texth))->lno > lno ? + ((TEXT *)TAILQ_LAST(sp->tiq, _texth))->lno : lno); + return (0); +} + +/* + * db_rget -- + * Retrieve a raw line from database. No cache, no conversion. + * + * PUBLIC: int db_rget __P((SCR *, recno_t, char **, size_t *)); + */ +int +db_rget( + SCR *sp, + recno_t lno, /* Line number. */ + char **pp, /* Pointer store. */ + size_t *lenp) /* Length store. */ +{ + DBT data, key; + EXF *ep; + + /* Check for no underlying file. */ + if ((ep = sp->ep) == NULL) + return (1); + + /* Get the line from the underlying database. */ + key.data = &lno; + key.size = sizeof(lno); + if (ep->db->get(ep->db, &key, &data, 0)) + /* We do not report error, and do not ensure the size! */ + return (1); + + if (lenp != NULL) + *lenp = data.size; + if (pp != NULL) + *pp = data.data; + return (0); +} + +/* + * db_rset -- + * Store a line in the file. No log, no conversion. + * + * PUBLIC: int db_rset __P((SCR *, recno_t, char *, size_t)); + */ +int +db_rset( + SCR *sp, + recno_t lno, + char *p, + size_t len) +{ + DBT data, key; + EXF *ep; + + /* Check for no underlying file. */ + if ((ep = sp->ep) == NULL) + return (1); + + /* Update file. */ + key.data = &lno; + key.size = sizeof(lno); + data.data = p; + data.size = len; + if (ep->db->put(ep->db, &key, &data, 0) == -1) + /* We do not report error, and do not ensure the size! */ + return (1); + return (0); } @@ -539,9 +652,9 @@ db_last(sp, lnop) * PUBLIC: void db_err __P((SCR *, recno_t)); */ void -db_err(sp, lno) - SCR *sp; - recno_t lno; +db_err( + SCR *sp, + recno_t lno) { msgq(sp, M_ERR, "008|Error: unable to retrieve line %lu", (u_long)lno); @@ -553,11 +666,11 @@ db_err(sp, lno) * just changed. */ static int -scr_update(sp, lno, op, current) - SCR *sp; - recno_t lno; - lnop_t op; - int current; +scr_update( + SCR *sp, + recno_t lno, + lnop_t op, + int current) { EXF *ep; SCR *tsp; @@ -567,8 +680,7 @@ scr_update(sp, lno, op, current) ep = sp->ep; if (ep->refcnt != 1) - for (tsp = sp->gp->dq.cqh_first; - tsp != (void *)&sp->gp->dq; tsp = tsp->q.cqe_next) + TAILQ_FOREACH(tsp, sp->gp->dq, q) if (sp != tsp && tsp->ep == ep) if (vs_change(tsp, lno, op)) return (1); diff --git a/common/log.c b/common/log.c index 9a9fe793ffb8..eb8d85bc84cf 100644 --- a/common/log.c +++ b/common/log.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)log.c 10.8 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: log.c,v 10.27 2011/07/13 06:25:50 zy Exp $"; #endif /* not lint */ #include @@ -21,6 +21,7 @@ static const char sccsid[] = "@(#)log.c 10.8 (Berkeley) 3/6/96"; #include #include #include +#include #include #include #include @@ -67,6 +68,8 @@ static void log_err __P((SCR *, char *, int)); #if defined(DEBUG) && 0 static void log_trace __P((SCR *, char *, recno_t, u_char *)); #endif +static int apply_with __P((int (*)(SCR *, recno_t, CHAR_T *, size_t), + SCR *, recno_t, u_char *, size_t)); /* Try and restart the log on failure, i.e. if we run out of memory. */ #define LOG_ERR { \ @@ -74,6 +77,15 @@ static void log_trace __P((SCR *, char *, recno_t, u_char *)); return (1); \ } +/* offset of CHAR_T string in log needs to be aligned on some systems + * because it is passed to db_set as a string + */ +typedef struct { + char data[sizeof(u_char) /* type */ + sizeof(recno_t)]; + CHAR_T str[1]; +} log_t; +#define CHAR_T_OFFSET ((char *)(((log_t*)0)->str) - (char *)0) + /* * log_init -- * Initialize the logging subsystem. @@ -81,9 +93,9 @@ static void log_trace __P((SCR *, char *, recno_t, u_char *)); * PUBLIC: int log_init __P((SCR *, EXF *)); */ int -log_init(sp, ep) - SCR *sp; - EXF *ep; +log_init( + SCR *sp, + EXF *ep) { /* * !!! @@ -117,9 +129,9 @@ log_init(sp, ep) * PUBLIC: int log_end __P((SCR *, EXF *)); */ int -log_end(sp, ep) - SCR *sp; - EXF *ep; +log_end( + SCR *sp, + EXF *ep) { /* * !!! @@ -147,8 +159,7 @@ log_end(sp, ep) * PUBLIC: int log_cursor __P((SCR *)); */ int -log_cursor(sp) - SCR *sp; +log_cursor(SCR *sp) { EXF *ep; @@ -175,15 +186,16 @@ log_cursor(sp) * Actually push a cursor record out. */ static int -log_cursor1(sp, type) - SCR *sp; - int type; +log_cursor1( + SCR *sp, + int type) { DBT data, key; EXF *ep; ep = sp->ep; - BINC_RET(sp, ep->l_lp, ep->l_len, sizeof(u_char) + sizeof(MARK)); + + BINC_RETC(sp, ep->l_lp, ep->l_len, sizeof(u_char) + sizeof(MARK)); ep->l_lp[0] = type; memmove(ep->l_lp + sizeof(u_char), &ep->l_cursor, sizeof(MARK)); @@ -212,15 +224,16 @@ log_cursor1(sp, type) * PUBLIC: int log_line __P((SCR *, recno_t, u_int)); */ int -log_line(sp, lno, action) - SCR *sp; - recno_t lno; - u_int action; +log_line( + SCR *sp, + recno_t lno, + u_int action) { DBT data, key; EXF *ep; size_t len; - char *lp; + CHAR_T *lp; + recno_t lcur; ep = sp->ep; if (F_ISSET(ep, F_NOLOG)) @@ -254,28 +267,30 @@ log_line(sp, lno, action) return (1); } len = 0; - lp = ""; + lp = L(""); } } else if (db_get(sp, lno, DBG_FATAL, &lp, &len)) return (1); - BINC_RET(sp, - ep->l_lp, ep->l_len, len + sizeof(u_char) + sizeof(recno_t)); + BINC_RETC(sp, + ep->l_lp, ep->l_len, + len * sizeof(CHAR_T) + CHAR_T_OFFSET); ep->l_lp[0] = action; memmove(ep->l_lp + sizeof(u_char), &lno, sizeof(recno_t)); - memmove(ep->l_lp + sizeof(u_char) + sizeof(recno_t), lp, len); + memmove(ep->l_lp + CHAR_T_OFFSET, lp, len * sizeof(CHAR_T)); - key.data = &ep->l_cur; + lcur = ep->l_cur; + key.data = &lcur; key.size = sizeof(recno_t); data.data = ep->l_lp; - data.size = len + sizeof(u_char) + sizeof(recno_t); + data.size = len * sizeof(CHAR_T) + CHAR_T_OFFSET; if (ep->log->put(ep->log, &key, &data, 0) == -1) LOG_ERR; #if defined(DEBUG) && 0 switch (action) { case LOG_LINE_APPEND: - TRACE(sp, "%u: log_line: append: %lu {%u}\n", + TRACE(sp, "%lu: log_line: append: %lu {%u}\n", ep->l_cur, lno, len); break; case LOG_LINE_DELETE: @@ -312,9 +327,9 @@ log_line(sp, lno, action) * PUBLIC: int log_mark __P((SCR *, LMARK *)); */ int -log_mark(sp, lmp) - SCR *sp; - LMARK *lmp; +log_mark( + SCR *sp, + LMARK *lmp) { DBT data, key; EXF *ep; @@ -330,7 +345,7 @@ log_mark(sp, lmp) ep->l_cursor.lno = OOBLNO; } - BINC_RET(sp, ep->l_lp, + BINC_RETC(sp, ep->l_lp, ep->l_len, sizeof(u_char) + sizeof(LMARK)); ep->l_lp[0] = LOG_MARK; memmove(ep->l_lp + sizeof(u_char), lmp, sizeof(LMARK)); @@ -358,9 +373,9 @@ log_mark(sp, lmp) * PUBLIC: int log_backward __P((SCR *, MARK *)); */ int -log_backward(sp, rp) - SCR *sp; - MARK *rp; +log_backward( + SCR *sp, + MARK *rp) { DBT key, data; EXF *ep; @@ -414,9 +429,8 @@ log_backward(sp, rp) case LOG_LINE_DELETE: didop = 1; memmove(&lno, p + sizeof(u_char), sizeof(recno_t)); - if (db_insert(sp, lno, p + sizeof(u_char) + - sizeof(recno_t), data.size - sizeof(u_char) - - sizeof(recno_t))) + if (apply_with(db_insert, sp, lno, + p + CHAR_T_OFFSET, data.size - CHAR_T_OFFSET)) goto err; ++sp->rptlines[L_ADDED]; break; @@ -425,9 +439,8 @@ log_backward(sp, rp) case LOG_LINE_RESET_B: didop = 1; memmove(&lno, p + sizeof(u_char), sizeof(recno_t)); - if (db_set(sp, lno, p + sizeof(u_char) + - sizeof(recno_t), data.size - sizeof(u_char) - - sizeof(recno_t))) + if (apply_with(db_set, sp, lno, + p + CHAR_T_OFFSET, data.size - CHAR_T_OFFSET)) goto err; if (sp->rptlchange != lno) { sp->rptlchange = lno; @@ -464,8 +477,7 @@ err: F_CLR(ep, F_NOLOG); * PUBLIC: int log_setline __P((SCR *)); */ int -log_setline(sp) - SCR *sp; +log_setline(SCR *sp) { DBT key, data; EXF *ep; @@ -488,7 +500,6 @@ log_setline(sp) key.data = &ep->l_cur; /* Initialize db request. */ key.size = sizeof(recno_t); - for (;;) { --ep->l_cur; if (ep->log->get(ep->log, &key, &data, 0)) @@ -520,9 +531,8 @@ log_setline(sp) case LOG_LINE_RESET_B: memmove(&lno, p + sizeof(u_char), sizeof(recno_t)); if (lno == sp->lno && - db_set(sp, lno, p + sizeof(u_char) + - sizeof(recno_t), data.size - sizeof(u_char) - - sizeof(recno_t))) + apply_with(db_set, sp, lno, + p + CHAR_T_OFFSET, data.size - CHAR_T_OFFSET)) goto err; if (sp->rptlchange != lno) { sp->rptlchange = lno; @@ -551,9 +561,9 @@ err: F_CLR(ep, F_NOLOG); * PUBLIC: int log_forward __P((SCR *, MARK *)); */ int -log_forward(sp, rp) - SCR *sp; - MARK *rp; +log_forward( + SCR *sp, + MARK *rp) { DBT key, data; EXF *ep; @@ -601,9 +611,8 @@ log_forward(sp, rp) case LOG_LINE_INSERT: didop = 1; memmove(&lno, p + sizeof(u_char), sizeof(recno_t)); - if (db_insert(sp, lno, p + sizeof(u_char) + - sizeof(recno_t), data.size - sizeof(u_char) - - sizeof(recno_t))) + if (apply_with(db_insert, sp, lno, + p + CHAR_T_OFFSET, data.size - CHAR_T_OFFSET)) goto err; ++sp->rptlines[L_ADDED]; break; @@ -619,9 +628,8 @@ log_forward(sp, rp) case LOG_LINE_RESET_F: didop = 1; memmove(&lno, p + sizeof(u_char), sizeof(recno_t)); - if (db_set(sp, lno, p + sizeof(u_char) + - sizeof(recno_t), data.size - sizeof(u_char) - - sizeof(recno_t))) + if (apply_with(db_set, sp, lno, + p + CHAR_T_OFFSET, data.size - CHAR_T_OFFSET)) goto err; if (sp->rptlchange != lno) { sp->rptlchange = lno; @@ -650,10 +658,10 @@ err: F_CLR(ep, F_NOLOG); * Try and restart the log on failure, i.e. if we run out of memory. */ static void -log_err(sp, file, line) - SCR *sp; - char *file; - int line; +log_err( + SCR *sp, + char *file, + int line) { EXF *ep; @@ -666,11 +674,11 @@ log_err(sp, file, line) #if defined(DEBUG) && 0 static void -log_trace(sp, msg, rno, p) - SCR *sp; - char *msg; - recno_t rno; - u_char *p; +log_trace( + SCR *sp, + char *msg, + recno_t rno, + u_char *p) { LMARK lm; MARK m; @@ -715,3 +723,45 @@ log_trace(sp, msg, rno, p) } } #endif + +/* + * apply_with -- + * Apply a realigned line from the log db to the file db. + */ +static int +apply_with( + int (*db_func)(SCR *, recno_t, CHAR_T *, size_t), + SCR *sp, + recno_t lno, + u_char *p, + size_t len) +{ +#ifdef USE_WIDECHAR + typedef unsigned long nword; + + static size_t blen; + static nword *bp; + nword *lp = (nword *)((uintptr_t)p / sizeof(nword) * sizeof(nword)); + + if (lp != (nword *)p) { + int offl = ((uintptr_t)p - (uintptr_t)lp) << 3; + int offr = (sizeof(nword) << 3) - offl; + size_t i, cnt = (len + sizeof(nword) / 2) / sizeof(nword); + + if (len > blen) { + blen = p2roundup(MAX(len, 512)); + REALLOC(sp, bp, nword *, blen); + if (bp == NULL) + return (1); + } + for (i = 0; i < cnt; ++i) +#if BYTE_ORDER == BIG_ENDIAN + bp[i] = (lp[i] << offl) ^ (lp[i+1] >> offr); +#else + bp[i] = (lp[i] >> offl) ^ (lp[i+1] << offr); +#endif + p = (u_char *)bp; + } +#endif + return db_func(sp, lno, (CHAR_T *)p, len / sizeof(CHAR_T)); +} diff --git a/common/main.c b/common/main.c index 6fb2ed1fe2f0..16b3fb19e22d 100644 --- a/common/main.c +++ b/common/main.c @@ -11,20 +11,19 @@ #ifndef lint static const char copyright[] = -"@(#) Copyright (c) 1992, 1993, 1994\n\ +"%Z% Copyright (c) 1992, 1993, 1994\n\ The Regents of the University of California. All rights reserved.\n\ -@(#) Copyright (c) 1992, 1993, 1994, 1995, 1996\n\ +%Z% Copyright (c) 1992, 1993, 1994, 1995, 1996\n\ Keith Bostic. All rights reserved.\n"; #endif /* not lint */ #ifndef lint -static const char sccsid[] = "@(#)main.c 10.48 (Berkeley) 10/11/96"; +static const char sccsid[] = "$Id: main.c,v 11.0 2012/10/17 06:34:37 zy Exp $"; #endif /* not lint */ #include #include #include -#include #include #include @@ -50,10 +49,10 @@ static int v_obsolete __P((char *, char *[])); * PUBLIC: int editor __P((GS *, int, char *[])); */ int -editor(gp, argc, argv) - GS *gp; - int argc; - char *argv[]; +editor( + GS *gp, + int argc, + char *argv[]) { extern int optind; extern char *optarg; @@ -65,6 +64,8 @@ editor(gp, argc, argv) u_int flags; int ch, flagchk, lflag, secure, startup, readonly, rval, silent; char *tag_f, *wsizearg, path[256]; + CHAR_T *w; + size_t wlen; /* Initialize the busy routine, if not defined by the screen. */ if (gp->scr_busy == NULL) @@ -72,19 +73,20 @@ editor(gp, argc, argv) /* Initialize the message routine, if not defined by the screen. */ if (gp->scr_msg == NULL) gp->scr_msg = vs_msg; + gp->catd = (nl_catd)-1; /* Common global structure initialization. */ - CIRCLEQ_INIT(&gp->dq); - CIRCLEQ_INIT(&gp->hq); - LIST_INIT(&gp->ecq); - LIST_INSERT_HEAD(&gp->ecq, &gp->excmd, q); + TAILQ_INIT(gp->dq); + TAILQ_INIT(gp->hq); + SLIST_INIT(gp->ecq); + SLIST_INSERT_HEAD(gp->ecq, &gp->excmd, q); gp->noprint = DEFAULT_NOPRINT; /* Structures shared by screens so stored in the GS structure. */ - CIRCLEQ_INIT(&gp->frefq); - CIRCLEQ_INIT(&gp->dcb_store.textq); - LIST_INIT(&gp->cutq); - LIST_INIT(&gp->seqq); + TAILQ_INIT(gp->frefq); + TAILQ_INIT(gp->dcb_store.textq); + SLIST_INIT(gp->cutq); + SLIST_INIT(gp->seqq); /* Set initial screen type and mode based on the program name. */ readonly = 0; @@ -236,11 +238,11 @@ editor(gp, argc, argv) */ if (screen_init(gp, NULL, &sp)) { if (sp != NULL) - CIRCLEQ_INSERT_HEAD(&gp->dq, sp, q); + TAILQ_INSERT_HEAD(gp->dq, sp, q); goto err; } F_SET(sp, SC_EX); - CIRCLEQ_INSERT_HEAD(&gp->dq, sp, q); + TAILQ_INSERT_HEAD(gp->dq, sp, q); if (v_key_init(sp)) /* Special key initialization. */ goto err; @@ -331,8 +333,11 @@ editor(gp, argc, argv) } /* Open a tag file if specified. */ - if (tag_f != NULL && ex_tag_first(sp, tag_f)) - goto err; + if (tag_f != NULL) { + CHAR2INT(sp, tag_f, strlen(tag_f) + 1, w, wlen); + if (ex_tag_first(sp, w)) + goto err; + } /* * Append any remaining arguments as file names. Files are recovery @@ -342,13 +347,11 @@ editor(gp, argc, argv) if (*argv != NULL) { if (sp->frp != NULL) { /* Cheat -- we know we have an extra argv slot. */ - MALLOC_NOMSG(sp, - *--argv, char *, strlen(sp->frp->name) + 1); + *--argv = strdup(sp->frp->name); if (*argv == NULL) { v_estr(gp->progname, errno, NULL); goto err; } - (void)strcpy(*argv, sp->frp->name); } sp->argv = sp->cargv = argv; F_SET(sp, SC_ARGNOFREE); @@ -366,7 +369,7 @@ editor(gp, argc, argv) if ((frp = file_add(sp, NULL)) == NULL) goto err; } else { - if ((frp = file_add(sp, (CHAR_T *)sp->argv[0])) == NULL) + if ((frp = file_add(sp, sp->argv[0])) == NULL) goto err; if (F_ISSET(sp, SC_ARGRECOVER)) F_SET(frp, FR_RECOVER); @@ -400,8 +403,8 @@ editor(gp, argc, argv) if (v_event_get(sp, &ev, 0, 0)) goto err; if (ev.e_event == E_INTERRUPT || - ev.e_event == E_CHARACTER && - (ev.e_value == K_CR || ev.e_value == K_NL)) + (ev.e_event == E_CHARACTER && + (ev.e_value == K_CR || ev.e_value == K_NL))) break; (void)gp->scr_bell(sp); } @@ -447,20 +450,16 @@ v_end(gp) (void)file_end(gp->ccl_sp, NULL, 1); (void)screen_end(gp->ccl_sp); } - while ((sp = gp->dq.cqh_first) != (void *)&gp->dq) + while ((sp = TAILQ_FIRST(gp->dq)) != NULL) (void)screen_end(sp); - while ((sp = gp->hq.cqh_first) != (void *)&gp->hq) + while ((sp = TAILQ_FIRST(gp->hq)) != NULL) (void)screen_end(sp); -#ifdef HAVE_PERL_INTERP - perl_end(gp); -#endif - #if defined(DEBUG) || defined(PURIFY) || defined(LIBRARY) { FREF *frp; /* Free FREF's. */ - while ((frp = gp->frefq.cqh_first) != (FREF *)&gp->frefq) { - CIRCLEQ_REMOVE(&gp->frefq, frp, q); + while ((frp = TAILQ_FIRST(gp->frefq)) != NULL) { + TAILQ_REMOVE(gp->frefq, frp, q); if (frp->name != NULL) free(frp->name); if (frp->tname != NULL) @@ -480,7 +479,7 @@ v_end(gp) seq_close(gp); /* Free default buffer storage. */ - (void)text_lfree(&gp->dcb_store.textq); + (void)text_lfree(gp->dcb_store.textq); /* Close message catalogs. */ msg_close(gp); @@ -496,10 +495,10 @@ v_end(gp) * it's possible that the user is sourcing a file that exits from the * editor). */ - while ((mp = gp->msgq.lh_first) != NULL) { + while ((mp = SLIST_FIRST(gp->msgq)) != NULL) { (void)fprintf(stderr, "%s%.*s", mp->mtype == M_ERR ? "ex/vi: " : "", (int)mp->len, mp->buf); - LIST_REMOVE(mp, q); + SLIST_REMOVE_HEAD(gp->msgq, q); #if defined(DEBUG) || defined(PURIFY) || defined(LIBRARY) free(mp->buf); free(mp); @@ -524,8 +523,9 @@ v_end(gp) * Convert historic arguments into something getopt(3) will like. */ static int -v_obsolete(name, argv) - char *name, *argv[]; +v_obsolete( + char *name, + char *argv[]) { size_t len; char *p; @@ -546,28 +546,26 @@ v_obsolete(name, argv) while (*++argv && strcmp(argv[0], "--")) if (argv[0][0] == '+') { if (argv[0][1] == '\0') { - MALLOC_NOMSG(NULL, argv[0], char *, 4); + argv[0] = strdup("-c$"); if (argv[0] == NULL) goto nomem; - (void)strcpy(argv[0], "-c$"); } else { p = argv[0]; len = strlen(argv[0]); - MALLOC_NOMSG(NULL, argv[0], char *, len + 2); + argv[0] = malloc(len + 2); if (argv[0] == NULL) goto nomem; argv[0][0] = '-'; argv[0][1] = 'c'; - (void)strcpy(argv[0] + 2, p + 1); + (void)strlcpy(argv[0] + 2, p + 1, len); } } else if (argv[0][0] == '-') if (argv[0][1] == '\0') { - MALLOC_NOMSG(NULL, argv[0], char *, 3); + argv[0] = strdup("-s"); if (argv[0] == NULL) { nomem: v_estr(name, errno, NULL); return (1); } - (void)strcpy(argv[0], "-s"); } else if ((argv[0][1] == 'c' || argv[0][1] == 'T' || argv[0][1] == 't' || argv[0][1] == 'w') && @@ -578,8 +576,7 @@ nomem: v_estr(name, errno, NULL); #ifdef DEBUG static void -attach(gp) - GS *gp; +attach(GS *gp) { int fd; char ch; @@ -604,9 +601,10 @@ attach(gp) #endif static void -v_estr(name, eno, msg) - char *name, *msg; - int eno; +v_estr( + char *name, + int eno, + char *msg) { (void)fprintf(stderr, "%s", name); if (msg != NULL) diff --git a/common/mark.c b/common/mark.c index 0ac1fc28bf9c..7a954392278c 100644 --- a/common/mark.c +++ b/common/mark.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)mark.c 10.13 (Berkeley) 7/19/96"; +static const char sccsid[] = "$Id: mark.c,v 10.14 2011/07/04 14:42:58 zy Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -28,7 +29,7 @@ static const char sccsid[] = "@(#)mark.c 10.13 (Berkeley) 7/19/96"; static LMARK *mark_find __P((SCR *, ARG_CHAR_T)); /* - * Marks are maintained in a key sorted doubly linked list. We can't + * Marks are maintained in a key sorted singly linked list. We can't * use arrays because we have no idea how big an index key could be. * The underlying assumption is that users don't have more than, say, * 10 marks at any one time, so this will be is fast enough. @@ -65,9 +66,9 @@ static LMARK *mark_find __P((SCR *, ARG_CHAR_T)); * PUBLIC: int mark_init __P((SCR *, EXF *)); */ int -mark_init(sp, ep) - SCR *sp; - EXF *ep; +mark_init( + SCR *sp, + EXF *ep) { /* * !!! @@ -75,7 +76,7 @@ mark_init(sp, ep) * * Set up the marks. */ - LIST_INIT(&ep->marks); + SLIST_INIT(ep->marks); return (0); } @@ -86,9 +87,9 @@ mark_init(sp, ep) * PUBLIC: int mark_end __P((SCR *, EXF *)); */ int -mark_end(sp, ep) - SCR *sp; - EXF *ep; +mark_end( + SCR *sp, + EXF *ep) { LMARK *lmp; @@ -96,8 +97,8 @@ mark_end(sp, ep) * !!! * ep MAY NOT BE THE SAME AS sp->ep, DON'T USE THE LATTER. */ - while ((lmp = ep->marks.lh_first) != NULL) { - LIST_REMOVE(lmp, q); + while ((lmp = SLIST_FIRST(ep->marks)) != NULL) { + SLIST_REMOVE_HEAD(ep->marks, q); free(lmp); } return (0); @@ -110,11 +111,11 @@ mark_end(sp, ep) * PUBLIC: int mark_get __P((SCR *, ARG_CHAR_T, MARK *, mtype_t)); */ int -mark_get(sp, key, mp, mtype) - SCR *sp; - ARG_CHAR_T key; - MARK *mp; - mtype_t mtype; +mark_get( + SCR *sp, + ARG_CHAR_T key, + MARK *mp, + mtype_t mtype) { LMARK *lmp; @@ -155,11 +156,11 @@ mark_get(sp, key, mp, mtype) * PUBLIC: int mark_set __P((SCR *, ARG_CHAR_T, MARK *, int)); */ int -mark_set(sp, key, value, userset) - SCR *sp; - ARG_CHAR_T key; - MARK *value; - int userset; +mark_set( + SCR *sp, + ARG_CHAR_T key, + MARK *value, + int userset) { LMARK *lmp, *lmt; @@ -176,9 +177,9 @@ mark_set(sp, key, value, userset) if (lmp == NULL || lmp->name != key) { MALLOC_RET(sp, lmt, LMARK *, sizeof(LMARK)); if (lmp == NULL) { - LIST_INSERT_HEAD(&sp->ep->marks, lmt, q); + SLIST_INSERT_HEAD(sp->ep->marks, lmt, q); } else - LIST_INSERT_AFTER(lmp, lmt, q); + SLIST_INSERT_AFTER(lmp, lmt, q); lmp = lmt; } else if (!userset && !F_ISSET(lmp, MARK_DELETED) && F_ISSET(lmp, MARK_USERSET)) @@ -197,20 +198,21 @@ mark_set(sp, key, value, userset) * where it would go. */ static LMARK * -mark_find(sp, key) - SCR *sp; - ARG_CHAR_T key; +mark_find( + SCR *sp, + ARG_CHAR_T key) { - LMARK *lmp, *lastlmp; + LMARK *lmp, *lastlmp = NULL; /* * Return the requested mark or the slot immediately before * where it should go. */ - for (lastlmp = NULL, lmp = sp->ep->marks.lh_first; - lmp != NULL; lastlmp = lmp, lmp = lmp->q.le_next) + SLIST_FOREACH(lmp, sp->ep->marks, q) { if (lmp->name >= key) return (lmp->name == key ? lmp : lastlmp); + lastlmp = lmp; + } return (lastlmp); } @@ -221,10 +223,10 @@ mark_find(sp, key) * PUBLIC: int mark_insdel __P((SCR *, lnop_t, recno_t)); */ int -mark_insdel(sp, op, lno) - SCR *sp; - lnop_t op; - recno_t lno; +mark_insdel( + SCR *sp, + lnop_t op, + recno_t lno) { LMARK *lmp; recno_t lline; @@ -234,8 +236,7 @@ mark_insdel(sp, op, lno) /* All insert/append operations are done as inserts. */ abort(); case LINE_DELETE: - for (lmp = sp->ep->marks.lh_first; - lmp != NULL; lmp = lmp->q.le_next) + SLIST_FOREACH(lmp, sp->ep->marks, q) if (lmp->lno >= lno) if (lmp->lno == lno) { F_SET(lmp, MARK_DELETED); @@ -265,8 +266,7 @@ mark_insdel(sp, op, lno) return (0); } - for (lmp = sp->ep->marks.lh_first; - lmp != NULL; lmp = lmp->q.le_next) + SLIST_FOREACH(lmp, sp->ep->marks, q) if (lmp->lno >= lno) ++lmp->lno; break; diff --git a/common/mark.h b/common/mark.h index 9c63e183e83f..44b8a19938ca 100644 --- a/common/mark.h +++ b/common/mark.h @@ -6,7 +6,7 @@ * * See the LICENSE file for redistribution information. * - * @(#)mark.h 10.3 (Berkeley) 3/6/96 + * $Id: mark.h,v 10.6 2011/07/04 14:41:51 zy Exp $ */ /* @@ -28,9 +28,10 @@ struct _mark { }; struct _lmark { - LIST_ENTRY(_lmark) q; /* Linked list of marks. */ + SLIST_ENTRY(_lmark) q; /* Linked list of marks. */ recno_t lno; /* Line number. */ size_t cno; /* Column number. */ + /* XXXX Needed ? Can non ascii-chars be mark names ? */ CHAR_T name; /* Mark name. */ #define MARK_DELETED 0x01 /* Mark was deleted. */ diff --git a/common/mem.h b/common/mem.h index af42e6bcd1de..b2b44b62ec8e 100644 --- a/common/mem.h +++ b/common/mem.h @@ -6,13 +6,21 @@ * * See the LICENSE file for redistribution information. * - * @(#)mem.h 10.7 (Berkeley) 3/30/96 + * $Id: mem.h,v 10.17 2012/10/07 00:40:29 zy Exp $ */ +#ifdef DEBUG +#define CHECK_TYPE(type, var) \ + type L__lp __attribute__((unused)) = var; +#else +#define CHECK_TYPE(type, var) +#endif + /* Increase the size of a malloc'd buffer. Two versions, one that * returns, one that jumps to an error label. */ -#define BINC_GOTO(sp, lp, llen, nlen) { \ +#define BINC_GOTO(sp, type, lp, llen, nlen) { \ + CHECK_TYPE(type *, lp) \ void *L__bincp; \ if ((nlen) > llen) { \ if ((L__bincp = binc(sp, lp, &(llen), nlen)) == NULL) \ @@ -24,7 +32,12 @@ lp = L__bincp; \ } \ } -#define BINC_RET(sp, lp, llen, nlen) { \ +#define BINC_GOTOC(sp, lp, llen, nlen) \ + BINC_GOTO(sp, char, lp, llen, nlen) +#define BINC_GOTOW(sp, lp, llen, nlen) \ + BINC_GOTO(sp, CHAR_T, lp, llen, (nlen) * sizeof(CHAR_T)) +#define BINC_RET(sp, type, lp, llen, nlen) { \ + CHECK_TYPE(type *, lp) \ void *L__bincp; \ if ((nlen) > llen) { \ if ((L__bincp = binc(sp, lp, &(llen), nlen)) == NULL) \ @@ -36,65 +49,89 @@ lp = L__bincp; \ } \ } +#define BINC_RETC(sp, lp, llen, nlen) \ + BINC_RET(sp, char, lp, llen, nlen) +#define BINC_RETW(sp, lp, llen, nlen) \ + BINC_RET(sp, CHAR_T, lp, llen, (nlen) * sizeof(CHAR_T)) /* * Get some temporary space, preferably from the global temporary buffer, * from a malloc'd buffer otherwise. Two versions, one that returns, one * that jumps to an error label. */ -#define GET_SPACE_GOTO(sp, bp, blen, nlen) { \ +#define GET_SPACE_GOTO(sp, type, bp, blen, nlen) { \ + CHECK_TYPE(type *, bp) \ GS *L__gp = (sp) == NULL ? NULL : (sp)->gp; \ if (L__gp == NULL || F_ISSET(L__gp, G_TMP_INUSE)) { \ bp = NULL; \ blen = 0; \ - BINC_GOTO(sp, bp, blen, nlen); \ + BINC_GOTO(sp, type, bp, blen, nlen); \ } else { \ - BINC_GOTO(sp, L__gp->tmp_bp, L__gp->tmp_blen, nlen); \ - bp = L__gp->tmp_bp; \ + BINC_GOTOC(sp, L__gp->tmp_bp, L__gp->tmp_blen, nlen); \ + bp = (type *) L__gp->tmp_bp; \ blen = L__gp->tmp_blen; \ F_SET(L__gp, G_TMP_INUSE); \ } \ } -#define GET_SPACE_RET(sp, bp, blen, nlen) { \ +#define GET_SPACE_GOTOC(sp, bp, blen, nlen) \ + GET_SPACE_GOTO(sp, char, bp, blen, nlen) +#define GET_SPACE_GOTOW(sp, bp, blen, nlen) \ + GET_SPACE_GOTO(sp, CHAR_T, bp, blen, (nlen) * sizeof(CHAR_T)) +#define GET_SPACE_RET(sp, type, bp, blen, nlen) { \ + CHECK_TYPE(type *, bp) \ GS *L__gp = (sp) == NULL ? NULL : (sp)->gp; \ if (L__gp == NULL || F_ISSET(L__gp, G_TMP_INUSE)) { \ bp = NULL; \ blen = 0; \ - BINC_RET(sp, bp, blen, nlen); \ + BINC_RET(sp, type, bp, blen, nlen); \ } else { \ - BINC_RET(sp, L__gp->tmp_bp, L__gp->tmp_blen, nlen); \ - bp = L__gp->tmp_bp; \ + BINC_RETC(sp, L__gp->tmp_bp, L__gp->tmp_blen, nlen); \ + bp = (type *) L__gp->tmp_bp; \ blen = L__gp->tmp_blen; \ F_SET(L__gp, G_TMP_INUSE); \ } \ } +#define GET_SPACE_RETC(sp, bp, blen, nlen) \ + GET_SPACE_RET(sp, char, bp, blen, nlen) +#define GET_SPACE_RETW(sp, bp, blen, nlen) \ + GET_SPACE_RET(sp, CHAR_T, bp, blen, (nlen) * sizeof(CHAR_T)) /* * Add space to a GET_SPACE returned buffer. Two versions, one that * returns, one that jumps to an error label. */ -#define ADD_SPACE_GOTO(sp, bp, blen, nlen) { \ +#define ADD_SPACE_GOTO(sp, type, bp, blen, nlen) { \ + CHECK_TYPE(type *, bp) \ GS *L__gp = (sp) == NULL ? NULL : (sp)->gp; \ - if (L__gp == NULL || bp == L__gp->tmp_bp) { \ + if (L__gp == NULL || bp == (type *)L__gp->tmp_bp) { \ F_CLR(L__gp, G_TMP_INUSE); \ - BINC_GOTO(sp, L__gp->tmp_bp, L__gp->tmp_blen, nlen); \ - bp = L__gp->tmp_bp; \ + BINC_GOTOC(sp, L__gp->tmp_bp, L__gp->tmp_blen, nlen); \ + bp = (type *) L__gp->tmp_bp; \ blen = L__gp->tmp_blen; \ F_SET(L__gp, G_TMP_INUSE); \ } else \ - BINC_GOTO(sp, bp, blen, nlen); \ + BINC_GOTO(sp, type, bp, blen, nlen); \ } -#define ADD_SPACE_RET(sp, bp, blen, nlen) { \ +#define ADD_SPACE_GOTOC(sp, bp, blen, nlen) \ + ADD_SPACE_GOTO(sp, char, bp, blen, nlen) +#define ADD_SPACE_GOTOW(sp, bp, blen, nlen) \ + ADD_SPACE_GOTO(sp, CHAR_T, bp, blen, (nlen) * sizeof(CHAR_T)) +#define ADD_SPACE_RET(sp, type, bp, blen, nlen) { \ + CHECK_TYPE(type *, bp) \ GS *L__gp = (sp) == NULL ? NULL : (sp)->gp; \ - if (L__gp == NULL || bp == L__gp->tmp_bp) { \ + if (L__gp == NULL || bp == (type *)L__gp->tmp_bp) { \ F_CLR(L__gp, G_TMP_INUSE); \ - BINC_RET(sp, L__gp->tmp_bp, L__gp->tmp_blen, nlen); \ - bp = L__gp->tmp_bp; \ + BINC_RETC(sp, L__gp->tmp_bp, L__gp->tmp_blen, nlen); \ + bp = (type *) L__gp->tmp_bp; \ blen = L__gp->tmp_blen; \ F_SET(L__gp, G_TMP_INUSE); \ } else \ - BINC_RET(sp, bp, blen, nlen); \ + BINC_RET(sp, type, bp, blen, nlen); \ } +#define ADD_SPACE_RETC(sp, bp, blen, nlen) \ + ADD_SPACE_RET(sp, char, bp, blen, nlen) +#define ADD_SPACE_RETW(sp, bp, blen, nlen) \ + ADD_SPACE_RET(sp, CHAR_T, bp, blen, (nlen) * sizeof(CHAR_T)) /* Free a GET_SPACE returned buffer. */ #define FREE_SPACE(sp, bp, blen) { \ @@ -104,6 +141,10 @@ else \ free(bp); \ } +#define FREE_SPACEW(sp, bp, blen) { \ + CHECK_TYPE(CHAR_T *, bp) \ + FREE_SPACE(sp, (char *)bp, blen); \ +} /* * Malloc a buffer, casting the return pointer. Various versions. @@ -150,19 +191,50 @@ return (1); \ } \ } + /* - * XXX - * Don't depend on realloc(NULL, size) working. + * Resize a buffer, free any already held memory if we can't get more. + * FreeBSD's reallocf(3) does the same thing, but it's not portable yet. */ #define REALLOC(sp, p, cast, size) { \ - if ((p = (cast)(p == NULL ? \ - malloc(size) : realloc(p, size))) == NULL) \ + cast newp; \ + if ((newp = (cast)realloc(p, size)) == NULL) { \ + if (p != NULL) \ + free(p); \ msgq(sp, M_SYSERR, NULL); \ + } \ + p = newp; \ } /* - * Versions of memmove(3) and memset(3) that use the size of the + * Versions of bcopy(3) and bzero(3) that use the size of the * initial pointer to figure out how much memory to manipulate. */ -#define MEMMOVE(p, t, len) memmove(p, t, (len) * sizeof(*(p))) -#define MEMSET(p, value, len) memset(p, value, (len) * sizeof(*(p))) +#define BCOPY(p, t, len) bcopy(p, t, (len) * sizeof(*(p))) +#define BZERO(p, len) bzero(p, (len) * sizeof(*(p))) + +/* + * p2roundup -- + * Get next power of 2; convenient for realloc. + * + * Reference: FreeBSD /usr/src/lib/libc/stdio/getdelim.c + */ +static __inline size_t +p2roundup(size_t n) +{ + n--; + n |= n >> 1; + n |= n >> 2; + n |= n >> 4; + n |= n >> 8; + n |= n >> 16; +#if SIZE_T_MAX > 0xffffffffU + n |= n >> 32; +#endif + n++; + return (n); +} + +/* Additional TAILQ helper. */ +#define TAILQ_ENTRY_ISVALID(elm, field) \ + ((elm)->field.tqe_prev != NULL) diff --git a/common/msg.c b/common/msg.c index 2b18082c7ab8..c0930b88afcd 100644 --- a/common/msg.c +++ b/common/msg.c @@ -10,31 +10,25 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)msg.c 10.48 (Berkeley) 9/15/96"; +static const char sccsid[] = "$Id: msg.c,v 11.0 2012/10/17 06:34:37 zy Exp $"; #endif /* not lint */ -#include -#include /* XXX: param.h may not have included types.h */ +#include #include #include -#include #include #include #include #include #include +#include +#include #include #include #include #include -#ifdef __STDC__ -#include -#else -#include -#endif - #include "common.h" #include "../vi/vi.h" @@ -45,15 +39,11 @@ static const char sccsid[] = "@(#)msg.c 10.48 (Berkeley) 9/15/96"; * PUBLIC: void msgq __P((SCR *, mtype_t, const char *, ...)); */ void -#ifdef __STDC__ -msgq(SCR *sp, mtype_t mt, const char *fmt, ...) -#else -msgq(sp, mt, fmt, va_alist) - SCR *sp; - mtype_t mt; - const char *fmt; - va_dcl -#endif +msgq( + SCR *sp, + mtype_t mt, + const char *fmt, + ...) { #ifndef NL_ARGMAX #define __NL_ARGMAX 20 /* Set to 9 by System V. */ @@ -66,12 +56,17 @@ msgq(sp, mt, fmt, va_alist) } str[__NL_ARGMAX]; #endif static int reenter; /* STATIC: Re-entrancy check. */ - CHAR_T ch; GS *gp; - size_t blen, cnt1, cnt2, len, mlen, nlen, soff; - const char *p, *t, *u; - char *bp, *mp, *rbp, *s_rbp; + size_t blen, len, mlen, nlen; + const char *p; + char *bp, *mp; va_list ap; +#ifndef NL_ARGMAX + int ch; + char *rbp, *s_rbp; + const char *t, *u; + size_t cnt1, cnt2, soff; +#endif /* * !!! @@ -130,7 +125,7 @@ retry: FREE_SPACE(sp, bp, blen); } bp = NULL; blen = 0; - GET_SPACE_GOTO(sp, bp, blen, nlen); + GET_SPACE_GOTOC(sp, bp, blen, nlen); /* * Error prefix. @@ -157,8 +152,12 @@ retry: FREE_SPACE(sp, bp, blen); */ if ((mt == M_ERR || mt == M_SYSERR) && sp != NULL && gp != NULL && gp->if_name != NULL) { - for (p = gp->if_name; *p != '\0'; ++p) { - len = snprintf(mp, REM, "%s", KEY_NAME(sp, *p)); + CHAR_T *wp; + size_t wlen; + + CHAR2INT(sp, gp->if_name, strlen(gp->if_name) + 1, wp, wlen); + for (; *wp != '\0'; ++wp) { + len = snprintf(mp, REM, "%s", KEY_NAME(sp, *wp)); mp += len; if ((mlen += len) > blen) goto retry; @@ -272,12 +271,10 @@ retry: FREE_SPACE(sp, bp, blen); fmt = rbp; #endif +#ifndef NL_ARGMAX format: /* Format the arguments into the string. */ -#ifdef __STDC__ - va_start(ap, fmt); -#else - va_start(ap); #endif + va_start(ap, fmt); len = vsnprintf(mp, REM, fmt, ap); va_end(ap); if (len >= nlen) @@ -347,28 +344,56 @@ nofmt: mp += len; (void)fprintf(stderr, "%.*s", (int)mlen, bp); /* Cleanup. */ -ret: FREE_SPACE(sp, bp, blen); +#ifndef NL_ARGMAX +ret: +#endif + FREE_SPACE(sp, bp, blen); alloc_err: reenter = 0; } +/* + * msgq_wstr -- + * Display a message with an embedded string. + * + * PUBLIC: void msgq_wstr __P((SCR *, mtype_t, const CHAR_T *, const char *)); + */ +void +msgq_wstr( + SCR *sp, + mtype_t mtype, + const CHAR_T *str, + const char *fmt) +{ + size_t nlen; + CONST char *nstr; + + if (str == NULL) { + msgq(sp, mtype, "%s", fmt); + return; + } + INT2CHAR(sp, str, STRLEN(str) + 1, nstr, nlen); + msgq_str(sp, mtype, nstr, fmt); +} + /* * msgq_str -- * Display a message with an embedded string. * - * PUBLIC: void msgq_str __P((SCR *, mtype_t, char *, char *)); + * PUBLIC: void msgq_str __P((SCR *, mtype_t, const char *, const char *)); */ void -msgq_str(sp, mtype, str, fmt) - SCR *sp; - mtype_t mtype; - char *str, *fmt; +msgq_str( + SCR *sp, + mtype_t mtype, + const char *str, + const char *fmt) { int nf, sv_errno; char *p; if (str == NULL) { - msgq(sp, mtype, fmt); + msgq(sp, mtype, "%s", fmt); return; } @@ -401,8 +426,7 @@ msgq_str(sp, mtype, str, fmt) * PUBLIC: void mod_rpt __P((SCR *)); */ void -mod_rpt(sp) - SCR *sp; +mod_rpt(SCR *sp) { static char * const action[] = { "293|added", @@ -461,7 +485,7 @@ mod_rpt(sp) } /* Build and display the message. */ - GET_SPACE_GOTO(sp, bp, blen, sizeof(action) * MAXNUM + 1); + GET_SPACE_GOTOC(sp, bp, blen, sizeof(action) * MAXNUM + 1); for (p = bp, first = 1, tlen = 0, ap = action, cnt = 0; cnt < ARSIZE(action); ++ap, ++cnt) if (sp->rptlines[cnt] != 0) { @@ -472,7 +496,8 @@ mod_rpt(sp) *p++ = ' '; tlen += 2; } - len = snprintf(p, MAXNUM, "%lu ", sp->rptlines[cnt]); + len = snprintf(p, MAXNUM, "%lu ", + (u_long)sp->rptlines[cnt]); p += len; tlen += len; t = msg_cat(sp, @@ -511,27 +536,32 @@ mod_rpt(sp) * PUBLIC: void msgq_status __P((SCR *, recno_t, u_int)); */ void -msgq_status(sp, lno, flags) - SCR *sp; - recno_t lno; - u_int flags; +msgq_status( + SCR *sp, + recno_t lno, + u_int flags) { - static int poisoned; recno_t last; size_t blen, len; int cnt, needsep; const char *t; - char **ap, *bp, *np, *p, *s; + char **ap, *bp, *np, *p, *s, *ep; + CHAR_T *wp; + size_t wlen; /* Get sufficient memory. */ len = strlen(sp->frp->name); - GET_SPACE_GOTO(sp, bp, blen, len * MAX_CHARACTER_COLUMNS + 128); + GET_SPACE_GOTOC(sp, bp, blen, len * MAX_CHARACTER_COLUMNS + 128); p = bp; + ep = bp + blen; + + /* Convert the filename. */ + CHAR2INT(sp, sp->frp->name, len + 1, wp, wlen); /* Copy in the filename. */ - for (p = bp, t = sp->frp->name; *t != '\0'; ++t) { - len = KEY_LEN(sp, *t); - memcpy(p, KEY_NAME(sp, *t), len); + for (; *wp != '\0'; ++wp) { + len = KEY_LEN(sp, *wp); + memcpy(p, KEY_NAME(sp, *wp), len); p += len; } np = p; @@ -542,7 +572,7 @@ msgq_status(sp, lno, flags) if (F_ISSET(sp, SC_STATUS_CNT) && sp->argv != NULL) { for (cnt = 0, ap = sp->argv; *ap != NULL; ++ap, ++cnt); if (cnt > 1) { - (void)sprintf(p, + (void)snprintf(p, ep - p, msg_cat(sp, "317|%d files to edit", NULL), cnt); p += strlen(p); *p++ = ':'; @@ -617,16 +647,17 @@ msgq_status(sp, lno, flags) p += len; } else { t = msg_cat(sp, "027|line %lu of %lu [%ld%%]", &len); - (void)sprintf(p, t, lno, last, (lno * 100) / last); + (void)snprintf(p, ep - p, t, lno, last, + ((u_long)lno * 100) / last); p += strlen(p); } } else { t = msg_cat(sp, "029|line %lu", &len); - (void)sprintf(p, t, lno); + (void)snprintf(p, ep - p, t, (u_long)lno); p += strlen(p); } #ifdef DEBUG - (void)sprintf(p, " (pid %lu)", (u_long)getpid()); + (void)snprintf(p, ep - p, " (pid %lu)", (u_long)getpid()); p += strlen(p); #endif *p++ = '\n'; @@ -677,9 +708,9 @@ msgq_status(sp, lno, flags) * PUBLIC: int msg_open __P((SCR *, char *)); */ int -msg_open(sp, file) - SCR *sp; - char *file; +msg_open( + SCR *sp, + char *file) { /* * !!! @@ -691,54 +722,50 @@ msg_open(sp, file) * message will be repeated every time nvi is started up. */ static int first = 1; - DB *db; - DBT data, key; - recno_t msgno; - char *p, *t, buf[MAXPATHLEN]; + nl_catd catd; + char *p; + int rval = 0; - if ((p = strrchr(file, '/')) != NULL && p[1] == '\0' && - ((t = getenv("LC_MESSAGES")) != NULL && t[0] != '\0' || - (t = getenv("LANG")) != NULL && t[0] != '\0')) { - (void)snprintf(buf, sizeof(buf), "%s%s", file, t); - p = buf; - } else - p = file; - if ((db = dbopen(p, - O_NONBLOCK | O_RDONLY, 0, DB_RECNO, NULL)) == NULL) { - if (first) { - first = 0; + if ((p = strrchr(file, '/')) != NULL && p[1] == '\0') { + /* Confirms to XPG4. */ + if ((p = join(file, setlocale(LC_MESSAGES, NULL))) == NULL) { + msgq(sp, M_SYSERR, NULL); + return (1); + } + } else { + /* Make sure it's recognized as a path by catopen(3). */ + if ((p = join(".", file)) == NULL) { + msgq(sp, M_SYSERR, NULL); return (1); } - msgq_str(sp, M_SYSERR, p, "%s"); - return (1); } - - /* - * Test record 1 for the magic string. The msgq call is here so - * the message catalog build finds it. - */ -#define VMC "VI_MESSAGE_CATALOG" - key.data = &msgno; - key.size = sizeof(recno_t); - msgno = 1; - if (db->get(db, &key, &data, 0) != 0 || - data.size != sizeof(VMC) - 1 || - memcmp(data.data, VMC, sizeof(VMC) - 1)) { - (void)db->close(db); + errno = 0; + if ((catd = catopen(p, NL_CAT_LOCALE)) == (nl_catd)-1) { if (first) { first = 0; - return (1); + rval = 1; + goto ret; } - msgq_str(sp, M_ERR, p, - "030|The file %s is not a message catalog"); - return (1); + + /* + * POSIX.1-2008 gives no instruction on how to report a + * corrupt catalog file. Errno == 0 is not rare; add + * EFTYPE, which is seen on FreeBSD, for a good measure. + */ + if (errno == 0 || errno == EFTYPE) + msgq_str(sp, M_ERR, p, + "030|The file %s is not a message catalog"); + else + msgq_str(sp, M_SYSERR, p, "%s"); + rval = 1; + goto ret; } first = 0; - if (sp->gp->msg != NULL) - (void)sp->gp->msg->close(sp->gp->msg); - sp->gp->msg = db; - return (0); + msg_close(sp->gp); + sp->gp->catd = catd; +ret: free(p); + return (rval); } /* @@ -748,11 +775,10 @@ msg_open(sp, file) * PUBLIC: void msg_close __P((GS *)); */ void -msg_close(gp) - GS *gp; +msg_close(GS *gp) { - if (gp->msg != NULL) - (void)gp->msg->close(gp->msg); + if (gp->catd != (nl_catd)-1) + (void)catclose(gp->catd); } /* @@ -762,10 +788,10 @@ msg_close(gp) * PUBLIC: const char *msg_cmsg __P((SCR *, cmsg_t, size_t *)); */ const char * -msg_cmsg(sp, which, lenp) - SCR *sp; - cmsg_t which; - size_t *lenp; +msg_cmsg( + SCR *sp, + cmsg_t which, + size_t *lenp) { switch (which) { case CMSG_CONF: @@ -800,14 +826,14 @@ msg_cmsg(sp, which, lenp) * PUBLIC: const char *msg_cat __P((SCR *, const char *, size_t *)); */ const char * -msg_cat(sp, str, lenp) - SCR *sp; - const char *str; - size_t *lenp; +msg_cat( + SCR *sp, + const char *str, + size_t *lenp) { GS *gp; - DBT data, key; - recno_t msgno; + char *p; + int msgno; /* * If it's not a catalog message, i.e. has doesn't have a leading @@ -815,28 +841,16 @@ msg_cat(sp, str, lenp) */ if (isdigit(str[0]) && isdigit(str[1]) && isdigit(str[2]) && str[3] == '|') { - key.data = &msgno; - key.size = sizeof(recno_t); msgno = atoi(str); - - /* - * XXX - * Really sleazy hack -- we put an extra character on the - * end of the format string, and then we change it to be - * the nul termination of the string. There ought to be - * a better way. Once we can allocate multiple temporary - * memory buffers, maybe we can use one of them instead. - */ - gp = sp == NULL ? NULL : sp->gp; - if (gp != NULL && gp->msg != NULL && - gp->msg->get(gp->msg, &key, &data, 0) == 0 && - data.size != 0) { - if (lenp != NULL) - *lenp = data.size - 1; - ((char *)data.data)[data.size - 1] = '\0'; - return (data.data); - } str = &str[4]; + + gp = sp == NULL ? NULL : sp->gp; + if (gp != NULL && gp->catd != (nl_catd)-1 && + (p = catgets(gp->catd, 1, msgno, str)) != NULL) { + if (lenp != NULL) + *lenp = strlen(p); + return (p); + } } if (lenp != NULL) *lenp = strlen(str); @@ -850,19 +864,22 @@ msg_cat(sp, str, lenp) * PUBLIC: char *msg_print __P((SCR *, const char *, int *)); */ char * -msg_print(sp, s, needfree) - SCR *sp; - const char *s; - int *needfree; +msg_print( + SCR *sp, + const char *s, + int *needfree) { size_t blen, nlen; - const char *cp; char *bp, *ep, *p, *t; + CHAR_T *wp, *cp; + size_t wlen; *needfree = 0; - for (cp = s; *cp != '\0'; ++cp) - if (!isprint(*cp)) + /* XXX Not good for debugging ex_read & ex_filter.*/ + CHAR2INT5(sp, EXP(sp)->ibcw, (char *)s, strlen(s) + 1, wp, wlen); + for (cp = wp; *cp != '\0'; ++cp) + if (!ISPRINT(*cp)) break; if (*cp == '\0') return ((char *)s); /* SAFE: needfree set to 0. */ @@ -873,21 +890,21 @@ retry: if (sp == NULL) free(bp); else FREE_SPACE(sp, bp, blen); - needfree = 0; + *needfree = 0; } nlen += 256; if (sp == NULL) { if ((bp = malloc(nlen)) == NULL) goto alloc_err; } else - GET_SPACE_GOTO(sp, bp, blen, nlen); + GET_SPACE_GOTOC(sp, bp, blen, nlen); if (0) { alloc_err: return (""); } *needfree = 1; - for (p = bp, ep = (bp + blen) - 1, cp = s; *cp != '\0' && p < ep; ++cp) - for (t = KEY_NAME(sp, *cp); *t != '\0' && p < ep; *p++ = *t++); + for (p = bp, ep = (bp + blen) - 1; *wp != '\0' && p < ep; ++wp) + for (t = KEY_NAME(sp, *wp); *t != '\0' && p < ep; *p++ = *t++); if (p == ep) goto retry; *p = '\0'; diff --git a/common/msg.h b/common/msg.h index b10f4ccae5c6..d65bb1aaf542 100644 --- a/common/msg.h +++ b/common/msg.h @@ -52,9 +52,9 @@ typedef enum { * messages. */ typedef struct _msgh MSGH; /* MSGS list head structure. */ -LIST_HEAD(_msgh, _msg); +SLIST_HEAD(_msgh, _msg); struct _msg { - LIST_ENTRY(_msg) q; /* Linked list of messages. */ + SLIST_ENTRY(_msg) q; /* Linked list of messages. */ mtype_t mtype; /* Message type: M_NONE, M_ERR, M_INFO. */ char *buf; /* Message buffer. */ size_t len; /* Message length. */ diff --git a/common/multibyte.h b/common/multibyte.h new file mode 100644 index 000000000000..40e352100ec3 --- /dev/null +++ b/common/multibyte.h @@ -0,0 +1,115 @@ +/*- + * Copyright (c) 1992, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * Copyright (c) 1992, 1993, 1994, 1995, 1996 + * Keith Bostic. All rights reserved. + * + * See the LICENSE file for redistribution information. + * + * $Id: multibyte.h,v 1.32 2012/10/07 01:35:58 zy Exp $ + */ + +#ifndef MULTIBYTE_H +#define MULTIBYTE_H + +/* + * Fundamental character types. + * + * CHAR_T An integral type that can hold any character. + * ARG_CHAR_T The type of a CHAR_T when passed as an argument using + * traditional promotion rules. It should also be able + * to be compared against any CHAR_T for equality without + * problems. + * UCHAR_T The shortest unified character type (8-bit clean). + * RCHAR_T The character type used by the internal regex engine. + * + * If no integral type can hold a character, don't even try the port. + */ +typedef int ARG_CHAR_T; + +#ifdef USE_WIDECHAR +#include +#include + +typedef wchar_t CHAR_T; +typedef wint_t UCHAR_T; +typedef wchar_t RCHAR_T; +#define REOF WEOF + +#define STRLEN wcslen +#define STRTOL wcstol +#define STRTOUL wcstoul +#define SPRINTF swprintf +#define STRCMP wcscmp +#define STRPBRK wcspbrk +#define ISBLANK iswblank +#define ISCNTRL iswcntrl +#define ISDIGIT iswdigit +#define ISXDIGIT iswxdigit +#define ISGRAPH iswgraph +#define ISLOWER iswlower +#define ISPRINT iswprint +#define ISPUNCT iswpunct +#define ISSPACE iswspace +#define ISUPPER iswupper +#define TOLOWER towlower +#define TOUPPER towupper +#define STRSET wmemset +#define STRCHR wcschr +#define STRRCHR wcsrchr +#define GETC getwc + +#define L(ch) L ## ch +#define WS "%ls" +#define WVS "%*ls" +#define WC "%lc" + +#else +typedef u_char CHAR_T; +typedef u_char UCHAR_T; +typedef char RCHAR_T; +#define REOF EOF + +#define STRLEN strlen +#define STRTOL(a,b,c) (strtol(a,(char**)b,c)) +#define STRTOUL(a,b,c) (strtoul(a,(char**)b,c)) +#define SPRINTF snprintf +#define STRCMP strcmp +#define STRPBRK strpbrk +#define ISBLANK isblank +#define ISCNTRL iscntrl +#define ISDIGIT isdigit +#define ISXDIGIT isxdigit +#define ISGRAPH isgraph +#define ISLOWER islower +#define ISPRINT isprint +#define ISPUNCT ispunct +#define ISSPACE isspace +#define ISUPPER isupper +#define TOLOWER tolower +#define TOUPPER toupper +#define STRSET memset +#define STRCHR strchr +#define STRRCHR strrchr +#define GETC getc + +#define L(ch) ch +#define WS "%s" +#define WVS "%*s" +#define WC "%c" + +#endif + +#if defined(USE_WIDECHAR) && defined(DEBUG) +#define MEMCPY wmemcpy +#define MEMMOVE wmemmove +#define MEMCMP wmemcmp +#else +#define MEMCPY(p, t, len) memcpy(p, t, (len) * sizeof(CHAR_T)) +#define MEMMOVE(p, t, len) memmove(p, t, (len) * sizeof(CHAR_T)) +#define MEMCMP(p, t, len) memcmp(p, t, (len) * sizeof(CHAR_T)) +#endif + +#define SIZE(w) (sizeof(w) / sizeof(*w)) + +#endif diff --git a/common/options.c b/common/options.c index 973778c78bbd..71a5e43e58cb 100644 --- a/common/options.c +++ b/common/options.c @@ -10,13 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)options.c 10.51 (Berkeley) 10/14/96"; +static const char sccsid[] = "$Id: options.c,v 10.73 2012/10/09 06:14:07 zy Exp $"; #endif /* not lint */ #include #include #include -#include #include #include @@ -35,6 +34,12 @@ static int opts_abbcmp __P((const void *, const void *)); static int opts_cmp __P((const void *, const void *)); static int opts_print __P((SCR *, OPTLIST const *)); +#ifdef USE_WIDECHAR +#define OPT_WC 0 +#else +#define OPT_WC (OPT_NOSAVE | OPT_NDISP) +#endif + /* * O'Reilly noted options and abbreviations are from "Learning the VI Editor", * Fifth Edition, May 1992. There's no way of knowing what systems they are @@ -45,73 +50,81 @@ static int opts_print __P((SCR *, OPTLIST const *)); */ OPTLIST const optlist[] = { /* O_ALTWERASE 4.4BSD */ - {"altwerase", f_altwerase, OPT_0BOOL, 0}, + {L("altwerase"), f_altwerase, OPT_0BOOL, 0}, /* O_AUTOINDENT 4BSD */ - {"autoindent", NULL, OPT_0BOOL, 0}, + {L("autoindent"), NULL, OPT_0BOOL, 0}, /* O_AUTOPRINT 4BSD */ - {"autoprint", NULL, OPT_1BOOL, 0}, + {L("autoprint"), NULL, OPT_1BOOL, 0}, /* O_AUTOWRITE 4BSD */ - {"autowrite", NULL, OPT_0BOOL, 0}, + {L("autowrite"), NULL, OPT_0BOOL, 0}, /* O_BACKUP 4.4BSD */ - {"backup", NULL, OPT_STR, 0}, + {L("backup"), NULL, OPT_STR, 0}, /* O_BEAUTIFY 4BSD */ - {"beautify", NULL, OPT_0BOOL, 0}, + {L("beautify"), NULL, OPT_0BOOL, 0}, /* O_CDPATH 4.4BSD */ - {"cdpath", NULL, OPT_STR, 0}, + {L("cdpath"), NULL, OPT_STR, 0}, /* O_CEDIT 4.4BSD */ - {"cedit", NULL, OPT_STR, 0}, + {L("cedit"), NULL, OPT_STR, 0}, /* O_COLUMNS 4.4BSD */ - {"columns", f_columns, OPT_NUM, OPT_NOSAVE}, + {L("columns"), f_columns, OPT_NUM, OPT_NOSAVE}, +/* O_COMBINED */ + {L("combined"), NULL, OPT_0BOOL, OPT_NOSET|OPT_WC}, /* O_COMMENT 4.4BSD */ - {"comment", NULL, OPT_0BOOL, 0}, -/* O_DIRECTORY 4BSD */ - {"directory", NULL, OPT_STR, 0}, + {L("comment"), NULL, OPT_0BOOL, 0}, +/* O_TMPDIR 4BSD */ + {L("directory"), NULL, OPT_STR, 0}, /* O_EDCOMPATIBLE 4BSD */ - {"edcompatible",NULL, OPT_0BOOL, 0}, -/* O_ESCAPETIME 4.4BSD */ - {"escapetime", NULL, OPT_NUM, 0}, + {L("edcompatible"),NULL, OPT_0BOOL, 0}, /* O_ERRORBELLS 4BSD */ - {"errorbells", NULL, OPT_0BOOL, 0}, + {L("errorbells"), NULL, OPT_0BOOL, 0}, +/* O_ESCAPETIME 4.4BSD */ + {L("escapetime"), NULL, OPT_NUM, 0}, /* O_EXRC System V (undocumented) */ - {"exrc", NULL, OPT_0BOOL, 0}, + {L("exrc"), NULL, OPT_0BOOL, 0}, /* O_EXTENDED 4.4BSD */ - {"extended", f_recompile, OPT_0BOOL, 0}, + {L("extended"), f_recompile, OPT_0BOOL, 0}, /* O_FILEC 4.4BSD */ - {"filec", NULL, OPT_STR, 0}, + {L("filec"), NULL, OPT_STR, 0}, +/* O_FILEENCODING */ + {L("fileencoding"),f_encoding, OPT_STR, OPT_WC}, /* O_FLASH HPUX */ - {"flash", NULL, OPT_1BOOL, 0}, + {L("flash"), NULL, OPT_1BOOL, 0}, /* O_HARDTABS 4BSD */ - {"hardtabs", NULL, OPT_NUM, 0}, + {L("hardtabs"), NULL, OPT_NUM, 0}, /* O_ICLOWER 4.4BSD */ - {"iclower", f_recompile, OPT_0BOOL, 0}, + {L("iclower"), f_recompile, OPT_0BOOL, 0}, /* O_IGNORECASE 4BSD */ - {"ignorecase", f_recompile, OPT_0BOOL, 0}, + {L("ignorecase"), f_recompile, OPT_0BOOL, 0}, +/* O_INPUTENCODING */ + {L("inputencoding"),f_encoding, OPT_STR, OPT_WC}, /* O_KEYTIME 4.4BSD */ - {"keytime", NULL, OPT_NUM, 0}, + {L("keytime"), NULL, OPT_NUM, 0}, /* O_LEFTRIGHT 4.4BSD */ - {"leftright", f_reformat, OPT_0BOOL, 0}, + {L("leftright"), f_reformat, OPT_0BOOL, 0}, /* O_LINES 4.4BSD */ - {"lines", f_lines, OPT_NUM, OPT_NOSAVE}, + {L("lines"), f_lines, OPT_NUM, OPT_NOSAVE}, /* O_LISP 4BSD * XXX * When the lisp option is implemented, delete the OPT_NOSAVE flag, * so that :mkexrc dumps it. */ - {"lisp", f_lisp, OPT_0BOOL, OPT_NOSAVE}, + {L("lisp"), f_lisp, OPT_0BOOL, OPT_NOSAVE}, /* O_LIST 4BSD */ - {"list", f_reformat, OPT_0BOOL, 0}, + {L("list"), f_reformat, OPT_0BOOL, 0}, /* O_LOCKFILES 4.4BSD * XXX * Locking isn't reliable enough over NFS to require it, in addition, * it's a serious startup performance problem over some remote links. */ - {"lock", NULL, OPT_1BOOL, 0}, + {L("lock"), NULL, OPT_1BOOL, 0}, /* O_MAGIC 4BSD */ - {"magic", NULL, OPT_1BOOL, 0}, + {L("magic"), NULL, OPT_1BOOL, 0}, +/* O_MATCHCHARS NetBSD 2.0 */ + {L("matchchars"), NULL, OPT_STR, OPT_PAIRS}, /* O_MATCHTIME 4.4BSD */ - {"matchtime", NULL, OPT_NUM, 0}, + {L("matchtime"), NULL, OPT_NUM, 0}, /* O_MESG 4BSD */ - {"mesg", NULL, OPT_1BOOL, 0}, + {L("mesg"), NULL, OPT_1BOOL, 0}, /* O_MODELINE 4BSD * !!! * This has been documented in historical systems as both "modeline" @@ -120,61 +133,61 @@ OPTLIST const optlist[] = { * example of what your intro CS professor referred to as the perils of * mixing code and data. Don't add it, or I will kill you. */ - {"modeline", NULL, OPT_0BOOL, OPT_NOSET}, + {L("modeline"), NULL, OPT_0BOOL, OPT_NOSET}, /* O_MSGCAT 4.4BSD */ - {"msgcat", f_msgcat, OPT_STR, 0}, + {L("msgcat"), f_msgcat, OPT_STR, 0}, /* O_NOPRINT 4.4BSD */ - {"noprint", f_print, OPT_STR, 0}, + {L("noprint"), f_print, OPT_STR, 0}, /* O_NUMBER 4BSD */ - {"number", f_reformat, OPT_0BOOL, 0}, + {L("number"), f_reformat, OPT_0BOOL, 0}, /* O_OCTAL 4.4BSD */ - {"octal", f_print, OPT_0BOOL, 0}, + {L("octal"), f_print, OPT_0BOOL, 0}, /* O_OPEN 4BSD */ - {"open", NULL, OPT_1BOOL, 0}, + {L("open"), NULL, OPT_1BOOL, 0}, /* O_OPTIMIZE 4BSD */ - {"optimize", NULL, OPT_1BOOL, 0}, + {L("optimize"), NULL, OPT_1BOOL, 0}, /* O_PARAGRAPHS 4BSD */ - {"paragraphs", f_paragraph, OPT_STR, 0}, + {L("paragraphs"), NULL, OPT_STR, OPT_PAIRS}, /* O_PATH 4.4BSD */ - {"path", NULL, OPT_STR, 0}, + {L("path"), NULL, OPT_STR, 0}, /* O_PRINT 4.4BSD */ - {"print", f_print, OPT_STR, 0}, + {L("print"), f_print, OPT_STR, 0}, /* O_PROMPT 4BSD */ - {"prompt", NULL, OPT_1BOOL, 0}, + {L("prompt"), NULL, OPT_1BOOL, 0}, /* O_READONLY 4BSD (undocumented) */ - {"readonly", f_readonly, OPT_0BOOL, OPT_ALWAYS}, + {L("readonly"), f_readonly, OPT_0BOOL, OPT_ALWAYS}, /* O_RECDIR 4.4BSD */ - {"recdir", NULL, OPT_STR, 0}, + {L("recdir"), NULL, OPT_STR, 0}, /* O_REDRAW 4BSD */ - {"redraw", NULL, OPT_0BOOL, 0}, + {L("redraw"), NULL, OPT_0BOOL, 0}, /* O_REMAP 4BSD */ - {"remap", NULL, OPT_1BOOL, 0}, + {L("remap"), NULL, OPT_1BOOL, 0}, /* O_REPORT 4BSD */ - {"report", NULL, OPT_NUM, 0}, + {L("report"), NULL, OPT_NUM, 0}, /* O_RULER 4.4BSD */ - {"ruler", NULL, OPT_0BOOL, 0}, + {L("ruler"), NULL, OPT_0BOOL, 0}, /* O_SCROLL 4BSD */ - {"scroll", NULL, OPT_NUM, 0}, + {L("scroll"), NULL, OPT_NUM, 0}, /* O_SEARCHINCR 4.4BSD */ - {"searchincr", NULL, OPT_0BOOL, 0}, + {L("searchincr"), NULL, OPT_0BOOL, 0}, /* O_SECTIONS 4BSD */ - {"sections", f_section, OPT_STR, 0}, + {L("sections"), NULL, OPT_STR, OPT_PAIRS}, /* O_SECURE 4.4BSD */ - {"secure", NULL, OPT_0BOOL, OPT_NOUNSET}, + {L("secure"), NULL, OPT_0BOOL, OPT_NOUNSET}, /* O_SHELL 4BSD */ - {"shell", NULL, OPT_STR, 0}, + {L("shell"), NULL, OPT_STR, 0}, /* O_SHELLMETA 4.4BSD */ - {"shellmeta", NULL, OPT_STR, 0}, + {L("shellmeta"), NULL, OPT_STR, 0}, /* O_SHIFTWIDTH 4BSD */ - {"shiftwidth", NULL, OPT_NUM, OPT_NOZERO}, + {L("shiftwidth"), NULL, OPT_NUM, OPT_NOZERO}, /* O_SHOWMATCH 4BSD */ - {"showmatch", NULL, OPT_0BOOL, 0}, + {L("showmatch"), NULL, OPT_0BOOL, 0}, /* O_SHOWMODE 4.4BSD */ - {"showmode", NULL, OPT_0BOOL, 0}, + {L("showmode"), NULL, OPT_0BOOL, 0}, /* O_SIDESCROLL 4.4BSD */ - {"sidescroll", NULL, OPT_NUM, OPT_NOZERO}, + {L("sidescroll"), NULL, OPT_NUM, OPT_NOZERO}, /* O_SLOWOPEN 4BSD */ - {"slowopen", NULL, OPT_0BOOL, 0}, + {L("slowopen"), NULL, OPT_0BOOL, 0}, /* O_SOURCEANY 4BSD (undocumented) * !!! * Historic vi, on startup, source'd $HOME/.exrc and ./.exrc, if they @@ -183,95 +196,97 @@ OPTLIST const optlist[] = { * .exrc files the user didn't own. This is an obvious security problem, * and we ignore the option. */ - {"sourceany", NULL, OPT_0BOOL, OPT_NOSET}, + {L("sourceany"), NULL, OPT_0BOOL, OPT_NOSET}, /* O_TABSTOP 4BSD */ - {"tabstop", f_reformat, OPT_NUM, OPT_NOZERO}, + {L("tabstop"), f_reformat, OPT_NUM, OPT_NOZERO}, /* O_TAGLENGTH 4BSD */ - {"taglength", NULL, OPT_NUM, 0}, + {L("taglength"), NULL, OPT_NUM, 0}, /* O_TAGS 4BSD */ - {"tags", NULL, OPT_STR, 0}, + {L("tags"), NULL, OPT_STR, 0}, /* O_TERM 4BSD * !!! * By default, the historic vi always displayed information about two * options, redraw and term. Term seems sufficient. */ - {"term", NULL, OPT_STR, OPT_ADISP|OPT_NOSAVE}, + {L("term"), NULL, OPT_STR, OPT_ADISP|OPT_NOSAVE}, /* O_TERSE 4BSD */ - {"terse", NULL, OPT_0BOOL, 0}, + {L("terse"), NULL, OPT_0BOOL, 0}, /* O_TILDEOP 4.4BSD */ - {"tildeop", NULL, OPT_0BOOL, 0}, + {L("tildeop"), NULL, OPT_0BOOL, 0}, /* O_TIMEOUT 4BSD (undocumented) */ - {"timeout", NULL, OPT_1BOOL, 0}, + {L("timeout"), NULL, OPT_1BOOL, 0}, /* O_TTYWERASE 4.4BSD */ - {"ttywerase", f_ttywerase, OPT_0BOOL, 0}, + {L("ttywerase"), f_ttywerase, OPT_0BOOL, 0}, /* O_VERBOSE 4.4BSD */ - {"verbose", NULL, OPT_0BOOL, 0}, + {L("verbose"), NULL, OPT_0BOOL, 0}, /* O_W1200 4BSD */ - {"w1200", f_w1200, OPT_NUM, OPT_NDISP|OPT_NOSAVE}, + {L("w1200"), f_w1200, OPT_NUM, OPT_NDISP|OPT_NOSAVE}, /* O_W300 4BSD */ - {"w300", f_w300, OPT_NUM, OPT_NDISP|OPT_NOSAVE}, + {L("w300"), f_w300, OPT_NUM, OPT_NDISP|OPT_NOSAVE}, /* O_W9600 4BSD */ - {"w9600", f_w9600, OPT_NUM, OPT_NDISP|OPT_NOSAVE}, + {L("w9600"), f_w9600, OPT_NUM, OPT_NDISP|OPT_NOSAVE}, /* O_WARN 4BSD */ - {"warn", NULL, OPT_1BOOL, 0}, + {L("warn"), NULL, OPT_1BOOL, 0}, /* O_WINDOW 4BSD */ - {"window", f_window, OPT_NUM, 0}, + {L("window"), f_window, OPT_NUM, 0}, /* O_WINDOWNAME 4BSD */ - {"windowname", NULL, OPT_0BOOL, 0}, + {L("windowname"), NULL, OPT_0BOOL, 0}, /* O_WRAPLEN 4.4BSD */ - {"wraplen", NULL, OPT_NUM, 0}, + {L("wraplen"), NULL, OPT_NUM, 0}, /* O_WRAPMARGIN 4BSD */ - {"wrapmargin", NULL, OPT_NUM, 0}, + {L("wrapmargin"), NULL, OPT_NUM, 0}, /* O_WRAPSCAN 4BSD */ - {"wrapscan", NULL, OPT_1BOOL, 0}, + {L("wrapscan"), NULL, OPT_1BOOL, 0}, /* O_WRITEANY 4BSD */ - {"writeany", NULL, OPT_0BOOL, 0}, + {L("writeany"), NULL, OPT_0BOOL, 0}, {NULL}, }; typedef struct abbrev { - char *name; + CHAR_T *name; int offset; } OABBREV; static OABBREV const abbrev[] = { - {"ai", O_AUTOINDENT}, /* 4BSD */ - {"ap", O_AUTOPRINT}, /* 4BSD */ - {"aw", O_AUTOWRITE}, /* 4BSD */ - {"bf", O_BEAUTIFY}, /* 4BSD */ - {"co", O_COLUMNS}, /* 4.4BSD */ - {"dir", O_DIRECTORY}, /* 4BSD */ - {"eb", O_ERRORBELLS}, /* 4BSD */ - {"ed", O_EDCOMPATIBLE}, /* 4BSD */ - {"ex", O_EXRC}, /* System V (undocumented) */ - {"ht", O_HARDTABS}, /* 4BSD */ - {"ic", O_IGNORECASE}, /* 4BSD */ - {"li", O_LINES}, /* 4.4BSD */ - {"modelines", O_MODELINE}, /* HPUX */ - {"nu", O_NUMBER}, /* 4BSD */ - {"opt", O_OPTIMIZE}, /* 4BSD */ - {"para", O_PARAGRAPHS}, /* 4BSD */ - {"re", O_REDRAW}, /* O'Reilly */ - {"ro", O_READONLY}, /* 4BSD (undocumented) */ - {"scr", O_SCROLL}, /* 4BSD (undocumented) */ - {"sect", O_SECTIONS}, /* O'Reilly */ - {"sh", O_SHELL}, /* 4BSD */ - {"slow", O_SLOWOPEN}, /* 4BSD */ - {"sm", O_SHOWMATCH}, /* 4BSD */ - {"smd", O_SHOWMODE}, /* 4BSD */ - {"sw", O_SHIFTWIDTH}, /* 4BSD */ - {"tag", O_TAGS}, /* 4BSD (undocumented) */ - {"tl", O_TAGLENGTH}, /* 4BSD */ - {"to", O_TIMEOUT}, /* 4BSD (undocumented) */ - {"ts", O_TABSTOP}, /* 4BSD */ - {"tty", O_TERM}, /* 4BSD (undocumented) */ - {"ttytype", O_TERM}, /* 4BSD (undocumented) */ - {"w", O_WINDOW}, /* O'Reilly */ - {"wa", O_WRITEANY}, /* 4BSD */ - {"wi", O_WINDOW}, /* 4BSD (undocumented) */ - {"wl", O_WRAPLEN}, /* 4.4BSD */ - {"wm", O_WRAPMARGIN}, /* 4BSD */ - {"ws", O_WRAPSCAN}, /* 4BSD */ + {L("ai"), O_AUTOINDENT}, /* 4BSD */ + {L("ap"), O_AUTOPRINT}, /* 4BSD */ + {L("aw"), O_AUTOWRITE}, /* 4BSD */ + {L("bf"), O_BEAUTIFY}, /* 4BSD */ + {L("co"), O_COLUMNS}, /* 4.4BSD */ + {L("dir"), O_TMPDIR}, /* 4BSD */ + {L("eb"), O_ERRORBELLS}, /* 4BSD */ + {L("ed"), O_EDCOMPATIBLE}, /* 4BSD */ + {L("ex"), O_EXRC}, /* System V (undocumented) */ + {L("fe"), O_FILEENCODING}, + {L("ht"), O_HARDTABS}, /* 4BSD */ + {L("ic"), O_IGNORECASE}, /* 4BSD */ + {L("ie"), O_INPUTENCODING}, + {L("li"), O_LINES}, /* 4.4BSD */ + {L("modelines"), O_MODELINE}, /* HPUX */ + {L("nu"), O_NUMBER}, /* 4BSD */ + {L("opt"), O_OPTIMIZE}, /* 4BSD */ + {L("para"), O_PARAGRAPHS}, /* 4BSD */ + {L("re"), O_REDRAW}, /* O'Reilly */ + {L("ro"), O_READONLY}, /* 4BSD (undocumented) */ + {L("scr"), O_SCROLL}, /* 4BSD (undocumented) */ + {L("sect"), O_SECTIONS}, /* O'Reilly */ + {L("sh"), O_SHELL}, /* 4BSD */ + {L("slow"), O_SLOWOPEN}, /* 4BSD */ + {L("sm"), O_SHOWMATCH}, /* 4BSD */ + {L("smd"), O_SHOWMODE}, /* 4BSD */ + {L("sw"), O_SHIFTWIDTH}, /* 4BSD */ + {L("tag"), O_TAGS}, /* 4BSD (undocumented) */ + {L("tl"), O_TAGLENGTH}, /* 4BSD */ + {L("to"), O_TIMEOUT}, /* 4BSD (undocumented) */ + {L("ts"), O_TABSTOP}, /* 4BSD */ + {L("tty"), O_TERM}, /* 4BSD (undocumented) */ + {L("ttytype"), O_TERM}, /* 4BSD (undocumented) */ + {L("w"), O_WINDOW}, /* O'Reilly */ + {L("wa"), O_WRITEANY}, /* 4BSD */ + {L("wi"), O_WINDOW}, /* 4BSD (undocumented) */ + {L("wl"), O_WRAPLEN}, /* 4.4BSD */ + {L("wm"), O_WRAPMARGIN}, /* 4BSD */ + {L("ws"), O_WRAPSCAN}, /* 4BSD */ {NULL}, }; @@ -282,17 +297,18 @@ static OABBREV const abbrev[] = { * PUBLIC: int opts_init __P((SCR *, int *)); */ int -opts_init(sp, oargs) - SCR *sp; - int *oargs; +opts_init( + SCR *sp, + int *oargs) { ARGS *argv[2], a, b; OPTLIST const *op; u_long v; - int cnt, optindx; - char *s, b1[1024]; + int cnt, optindx = 0; + char *s; + CHAR_T b2[1024]; - a.bp = b1; + a.bp = b2; b.bp = NULL; a.len = b.len = 0; argv[0] = &a; @@ -300,9 +316,9 @@ opts_init(sp, oargs) /* Set numeric and string default values. */ #define OI(indx, str) { \ - if (str != b1) /* GCC puts strings in text-space. */ \ - (void)strcpy(b1, str); \ - a.len = strlen(b1); \ + a.len = STRLEN(str); \ + if ((CHAR_T*)str != b2) /* GCC puts strings in text-space. */ \ + (void)MEMCPY(b2, str, a.len+1); \ if (opts_set(sp, argv, NULL)) { \ optindx = indx; \ goto err; \ @@ -327,9 +343,10 @@ opts_init(sp, oargs) F_SET(&sp->opts[O_SECURE], OPT_GLOBAL); /* Initialize string values. */ - (void)snprintf(b1, sizeof(b1), - "cdpath=%s", (s = getenv("CDPATH")) == NULL ? ":" : s); - OI(O_CDPATH, b1); + (void)SPRINTF(b2, SIZE(b2), + L("cdpath=%s"), (s = getenv("CDPATH")) == NULL ? ":" : s); + OI(O_CDPATH, b2); + OI(O_CEDIT, L("cedit=\033")); /* * !!! @@ -338,30 +355,32 @@ opts_init(sp, oargs) * are two ways to change this -- the user can set either the directory * option or the TMPDIR environmental variable. */ - (void)snprintf(b1, sizeof(b1), - "directory=%s", (s = getenv("TMPDIR")) == NULL ? _PATH_TMP : s); - OI(O_DIRECTORY, b1); - OI(O_ESCAPETIME, "escapetime=1"); - OI(O_KEYTIME, "keytime=6"); - OI(O_MATCHTIME, "matchtime=7"); - (void)snprintf(b1, sizeof(b1), "msgcat=%s", _PATH_MSGCAT); - OI(O_MSGCAT, b1); - OI(O_REPORT, "report=5"); - OI(O_PARAGRAPHS, "paragraphs=IPLPPPQPP LIpplpipbp"); - (void)snprintf(b1, sizeof(b1), "path=%s", ""); - OI(O_PATH, b1); - (void)snprintf(b1, sizeof(b1), "recdir=%s", _PATH_PRESERVE); - OI(O_RECDIR, b1); - OI(O_SECTIONS, "sections=NHSHH HUnhsh"); - (void)snprintf(b1, sizeof(b1), - "shell=%s", (s = getenv("SHELL")) == NULL ? _PATH_BSHELL : s); - OI(O_SHELL, b1); - OI(O_SHELLMETA, "shellmeta=~{[*?$`'\"\\"); - OI(O_SHIFTWIDTH, "shiftwidth=8"); - OI(O_SIDESCROLL, "sidescroll=16"); - OI(O_TABSTOP, "tabstop=8"); - (void)snprintf(b1, sizeof(b1), "tags=%s", _PATH_TAGS); - OI(O_TAGS, b1); + (void)SPRINTF(b2, SIZE(b2), + L("directory=%s"), (s = getenv("TMPDIR")) == NULL ? _PATH_TMP : s); + OI(O_TMPDIR, b2); + OI(O_ESCAPETIME, L("escapetime=6")); + OI(O_FILEC, L("filec=\t")); + OI(O_KEYTIME, L("keytime=6")); + OI(O_MATCHCHARS, L("matchchars=()[]{}")); + OI(O_MATCHTIME, L("matchtime=7")); + (void)SPRINTF(b2, SIZE(b2), L("msgcat=%s"), _PATH_MSGCAT); + OI(O_MSGCAT, b2); + OI(O_REPORT, L("report=5")); + OI(O_PARAGRAPHS, L("paragraphs=IPLPPPQPP LIpplpipbp")); + (void)SPRINTF(b2, SIZE(b2), L("path=%s"), ""); + OI(O_PATH, b2); + (void)SPRINTF(b2, SIZE(b2), L("recdir=%s"), _PATH_PRESERVE); + OI(O_RECDIR, b2); + OI(O_SECTIONS, L("sections=NHSHH HUnhsh")); + (void)SPRINTF(b2, SIZE(b2), + L("shell=%s"), (s = getenv("SHELL")) == NULL ? _PATH_BSHELL : s); + OI(O_SHELL, b2); + OI(O_SHELLMETA, L("shellmeta=~{[*?$`'\"\\")); + OI(O_SHIFTWIDTH, L("shiftwidth=8")); + OI(O_SIDESCROLL, L("sidescroll=16")); + OI(O_TABSTOP, L("tabstop=8")); + (void)SPRINTF(b2, SIZE(b2), L("tags=%s"), _PATH_TAGS); + OI(O_TAGS, b2); /* * XXX @@ -370,8 +389,8 @@ opts_init(sp, oargs) */ if ((v = (O_VAL(sp, O_LINES) - 1) / 2) == 0) v = 1; - (void)snprintf(b1, sizeof(b1), "scroll=%ld", v); - OI(O_SCROLL, b1); + (void)SPRINTF(b2, SIZE(b2), L("scroll=%ld"), v); + OI(O_SCROLL, b2); /* * The default window option values are: @@ -388,16 +407,19 @@ opts_init(sp, oargs) v = 8; else if (v <= 1200) v = 16; - else - v = O_VAL(sp, O_LINES) - 1; - (void)snprintf(b1, sizeof(b1), "window=%lu", v); - OI(O_WINDOW, b1); + else if ((v = O_VAL(sp, O_LINES) - 1) == 0) + v = 1; + + (void)SPRINTF(b2, SIZE(b2), L("window=%lu"), v); + OI(O_WINDOW, b2); /* * Set boolean default values, and copy all settings into the default * information. OS_NOFREE is set, we're copying, not replacing. */ - for (op = optlist, cnt = 0; op->name != NULL; ++op, ++cnt) + for (op = optlist, cnt = 0; op->name != NULL; ++op, ++cnt) { + if (F_ISSET(op, OPT_GLOBAL)) + continue; switch (op->type) { case OPT_0BOOL: break; @@ -416,6 +438,7 @@ opts_init(sp, oargs) default: abort(); } + } /* * !!! @@ -425,11 +448,11 @@ opts_init(sp, oargs) */ for (; *oargs != -1; ++oargs) OI(*oargs, optlist[*oargs].name); - return (0); #undef OI + return (0); -err: msgq(sp, M_ERR, - "031|Unable to set default %s option", optlist[optindx].name); +err: msgq_wstr(sp, M_ERR, optlist[optindx].name, + "031|Unable to set default %s option"); return (1); } @@ -440,18 +463,21 @@ err: msgq(sp, M_ERR, * PUBLIC: int opts_set __P((SCR *, ARGS *[], char *)); */ int -opts_set(sp, argv, usage) - SCR *sp; - ARGS *argv[]; - char *usage; +opts_set( + SCR *sp, + ARGS *argv[], + char *usage) { enum optdisp disp; enum nresult nret; OPTLIST const *op; OPTION *spo; - u_long value, turnoff; + u_long isset, turnoff, value; int ch, equals, nf, nf2, offset, qmark, rval; - char *endp, *name, *p, *sep, *t; + CHAR_T *endp, *name, *p, *sep; + char *p2, *t2; + char *np; + size_t nlen; disp = NO_DISPLAY; for (rval = 0; argv[0]->len != 0; ++argv) { @@ -459,7 +485,7 @@ opts_set(sp, argv, usage) * The historic vi dumped the options for each occurrence of * "all" in the set list. Puhleeze. */ - if (!strcmp(argv[0]->bp, "all")) { + if (!STRCMP(argv[0]->bp, L("all"))) { disp = ALL_DISPLAY; continue; } @@ -521,7 +547,7 @@ opts_set(sp, argv, usage) case OPT_1BOOL: /* Some options may not be reset. */ if (F_ISSET(op, OPT_NOUNSET) && turnoff) { - msgq_str(sp, M_ERR, name, + msgq_wstr(sp, M_ERR, name, "291|set: the %s option may not be turned off"); rval = 1; break; @@ -529,14 +555,14 @@ opts_set(sp, argv, usage) /* Some options may not be set. */ if (F_ISSET(op, OPT_NOSET) && !turnoff) { - msgq_str(sp, M_ERR, name, + msgq_wstr(sp, M_ERR, name, "313|set: the %s option may never be turned on"); rval = 1; break; } if (equals) { - msgq_str(sp, M_ERR, name, + msgq_wstr(sp, M_ERR, name, "034|set: [no]%s option doesn't take a value"); rval = 1; break; @@ -552,34 +578,34 @@ opts_set(sp, argv, usage) * Do nothing if the value is unchanged, the underlying * functions can be expensive. */ + isset = !turnoff; if (!F_ISSET(op, OPT_ALWAYS)) - if (turnoff) { - if (!O_ISSET(sp, offset)) - break; - } else { + if (isset) { if (O_ISSET(sp, offset)) break; - } + } else + if (!O_ISSET(sp, offset)) + break; /* Report to subsystems. */ - if (op->func != NULL && - op->func(sp, spo, NULL, &turnoff) || - ex_optchange(sp, offset, NULL, &turnoff) || - v_optchange(sp, offset, NULL, &turnoff) || - sp->gp->scr_optchange(sp, offset, NULL, &turnoff)) { + if ((op->func != NULL && + op->func(sp, spo, NULL, &isset)) || + ex_optchange(sp, offset, NULL, &isset) || + v_optchange(sp, offset, NULL, &isset) || + sp->gp->scr_optchange(sp, offset, NULL, &isset)) { rval = 1; break; } /* Set the value. */ - if (turnoff) - O_CLR(sp, offset); - else + if (isset) O_SET(sp, offset); + else + O_CLR(sp, offset); break; case OPT_NUM: if (turnoff) { - msgq_str(sp, M_ERR, name, + msgq_wstr(sp, M_ERR, name, "035|set: %s option isn't a boolean"); rval = 1; break; @@ -591,48 +617,56 @@ opts_set(sp, argv, usage) break; } - if (!isdigit(sep[0])) + if (!ISDIGIT(sep[0])) goto badnum; if ((nret = nget_uslong(&value, sep, &endp, 10)) != NUM_OK) { - p = msg_print(sp, name, &nf); - t = msg_print(sp, sep, &nf2); + INT2CHAR(sp, name, STRLEN(name) + 1, + np, nlen); + p2 = msg_print(sp, np, &nf); + INT2CHAR(sp, sep, STRLEN(sep) + 1, + np, nlen); + t2 = msg_print(sp, np, &nf2); switch (nret) { case NUM_ERR: msgq(sp, M_SYSERR, - "036|set: %s option: %s", p, t); + "036|set: %s option: %s", p2, t2); break; case NUM_OVER: msgq(sp, M_ERR, - "037|set: %s option: %s: value overflow", p, t); + "037|set: %s option: %s: value overflow", p2, t2); break; case NUM_OK: case NUM_UNDER: abort(); } if (nf) - FREE_SPACE(sp, p, 0); + FREE_SPACE(sp, p2, 0); if (nf2) - FREE_SPACE(sp, t, 0); + FREE_SPACE(sp, t2, 0); rval = 1; break; } - if (*endp && !isblank(*endp)) { -badnum: p = msg_print(sp, name, &nf); - t = msg_print(sp, sep, &nf2); + if (*endp && !cmdskip(*endp)) { +badnum: INT2CHAR(sp, name, STRLEN(name) + 1, + np, nlen); + p2 = msg_print(sp, np, &nf); + INT2CHAR(sp, sep, STRLEN(sep) + 1, + np, nlen); + t2 = msg_print(sp, np, &nf2); msgq(sp, M_ERR, - "038|set: %s option: %s is an illegal number", p, t); + "038|set: %s option: %s is an illegal number", p2, t2); if (nf) - FREE_SPACE(sp, p, 0); + FREE_SPACE(sp, p2, 0); if (nf2) - FREE_SPACE(sp, t, 0); + FREE_SPACE(sp, t2, 0); rval = 1; break; } /* Some options may never be set to zero. */ if (F_ISSET(op, OPT_NOZERO) && value == 0) { - msgq_str(sp, M_ERR, name, + msgq_wstr(sp, M_ERR, name, "314|set: the %s option may never be set to 0"); rval = 1; break; @@ -647,11 +681,12 @@ badnum: p = msg_print(sp, name, &nf); break; /* Report to subsystems. */ - if (op->func != NULL && - op->func(sp, spo, sep, &value) || - ex_optchange(sp, offset, sep, &value) || - v_optchange(sp, offset, sep, &value) || - sp->gp->scr_optchange(sp, offset, sep, &value)) { + INT2CHAR(sp, sep, STRLEN(sep) + 1, np, nlen); + if ((op->func != NULL && + op->func(sp, spo, np, &value)) || + ex_optchange(sp, offset, np, &value) || + v_optchange(sp, offset, np, &value) || + sp->gp->scr_optchange(sp, offset, np, &value)) { rval = 1; break; } @@ -662,7 +697,7 @@ badnum: p = msg_print(sp, name, &nf); break; case OPT_STR: if (turnoff) { - msgq_str(sp, M_ERR, name, + msgq_wstr(sp, M_ERR, name, "039|set: %s option isn't a boolean"); rval = 1; break; @@ -674,27 +709,36 @@ badnum: p = msg_print(sp, name, &nf); break; } + /* Check for strings that must have even length. */ + if (F_ISSET(op, OPT_PAIRS) && STRLEN(sep) & 1) { + msgq_wstr(sp, M_ERR, name, + "047|The %s option must be in two character groups"); + rval = 1; + break; + } + /* * Do nothing if the value is unchanged, the underlying * functions can be expensive. */ + INT2CHAR(sp, sep, STRLEN(sep) + 1, np, nlen); if (!F_ISSET(op, OPT_ALWAYS) && O_STR(sp, offset) != NULL && - !strcmp(O_STR(sp, offset), sep)) + !strcmp(O_STR(sp, offset), np)) break; /* Report to subsystems. */ - if (op->func != NULL && - op->func(sp, spo, sep, NULL) || - ex_optchange(sp, offset, sep, NULL) || - v_optchange(sp, offset, sep, NULL) || - sp->gp->scr_optchange(sp, offset, sep, NULL)) { + if ((op->func != NULL && + op->func(sp, spo, np, NULL)) || + ex_optchange(sp, offset, np, NULL) || + v_optchange(sp, offset, np, NULL) || + sp->gp->scr_optchange(sp, offset, np, NULL)) { rval = 1; break; } /* Set the value. */ - if (o_set(sp, offset, OS_STRDUP, sep, 0)) + if (o_set(sp, offset, OS_STRDUP, np, 0)) rval = 1; break; default: @@ -713,12 +757,12 @@ badnum: p = msg_print(sp, name, &nf); * PUBLIC: int o_set __P((SCR *, int, u_int, char *, u_long)); */ int -o_set(sp, opt, flags, str, val) - SCR *sp; - int opt; - u_int flags; - char *str; - u_long val; +o_set( + SCR *sp, + int opt, + u_int flags, + char *str, + u_long val) { OPTION *op; @@ -757,15 +801,16 @@ o_set(sp, opt, flags, str, val) * PUBLIC: int opts_empty __P((SCR *, int, int)); */ int -opts_empty(sp, off, silent) - SCR *sp; - int off, silent; +opts_empty( + SCR *sp, + int off, + int silent) { char *p; if ((p = O_STR(sp, off)) == NULL || p[0] == '\0') { if (!silent) - msgq_str(sp, M_ERR, optlist[off].name, + msgq_wstr(sp, M_ERR, optlist[off].name, "305|No %s edit option specified"); return (1); } @@ -779,9 +824,9 @@ opts_empty(sp, off, silent) * PUBLIC: void opts_dump __P((SCR *, enum optdisp)); */ void -opts_dump(sp, type) - SCR *sp; - enum optdisp type; +opts_dump( + SCR *sp, + enum optdisp type) { OPTLIST const *op; int base, b_num, cnt, col, colwidth, curlen, s_num; @@ -836,8 +881,8 @@ opts_dump(sp, type) break; case OPT_STR: if (O_STR(sp, cnt) == O_D_STR(sp, cnt) || - O_D_STR(sp, cnt) != NULL && - !strcmp(O_STR(sp, cnt), O_D_STR(sp, cnt))) + (O_D_STR(sp, cnt) != NULL && + !strcmp(O_STR(sp, cnt), O_D_STR(sp, cnt)))) continue; break; } @@ -852,7 +897,7 @@ opts_dump(sp, type) } F_CLR(&sp->opts[cnt], OPT_SELECTED); - curlen = strlen(op->name); + curlen = STRLEN(op->name); switch (op->type) { case OPT_0BOOL: case OPT_1BOOL: @@ -913,9 +958,9 @@ opts_dump(sp, type) * Print out an option. */ static int -opts_print(sp, op) - SCR *sp; - OPTLIST const *op; +opts_print( + SCR *sp, + OPTLIST const *op) { int curlen, offset; @@ -925,13 +970,13 @@ opts_print(sp, op) case OPT_0BOOL: case OPT_1BOOL: curlen += ex_printf(sp, - "%s%s", O_ISSET(sp, offset) ? "" : "no", op->name); + "%s"WS, O_ISSET(sp, offset) ? "" : "no", op->name); break; case OPT_NUM: - curlen += ex_printf(sp, "%s=%ld", op->name, O_VAL(sp, offset)); + curlen += ex_printf(sp, WS"=%ld", op->name, O_VAL(sp, offset)); break; case OPT_STR: - curlen += ex_printf(sp, "%s=\"%s\"", op->name, + curlen += ex_printf(sp, WS"=\"%s\"", op->name, O_STR(sp, offset) == NULL ? "" : O_STR(sp, offset)); break; } @@ -945,13 +990,14 @@ opts_print(sp, op) * PUBLIC: int opts_save __P((SCR *, FILE *)); */ int -opts_save(sp, fp) - SCR *sp; - FILE *fp; +opts_save( + SCR *sp, + FILE *fp) { OPTLIST const *op; - int ch, cnt; - char *p; + CHAR_T ch, *p; + char nch, *np; + int cnt; for (op = optlist; op->name != NULL; ++op) { if (F_ISSET(op, OPT_NOSAVE)) @@ -961,28 +1007,28 @@ opts_save(sp, fp) case OPT_0BOOL: case OPT_1BOOL: if (O_ISSET(sp, cnt)) - (void)fprintf(fp, "set %s\n", op->name); + (void)fprintf(fp, "set "WS"\n", op->name); else - (void)fprintf(fp, "set no%s\n", op->name); + (void)fprintf(fp, "set no"WS"\n", op->name); break; case OPT_NUM: (void)fprintf(fp, - "set %s=%-3ld\n", op->name, O_VAL(sp, cnt)); + "set "WS"=%-3ld\n", op->name, O_VAL(sp, cnt)); break; case OPT_STR: if (O_STR(sp, cnt) == NULL) break; (void)fprintf(fp, "set "); for (p = op->name; (ch = *p) != '\0'; ++p) { - if (isblank(ch) || ch == '\\') + if (cmdskip(ch) || ch == '\\') (void)putc('\\', fp); - (void)putc(ch, fp); + fprintf(fp, WC, ch); } (void)putc('=', fp); - for (p = O_STR(sp, cnt); (ch = *p) != '\0'; ++p) { - if (isblank(ch) || ch == '\\') + for (np = O_STR(sp, cnt); (nch = *np) != '\0'; ++np) { + if (cmdskip(nch) || nch == '\\') (void)putc('\\', fp); - (void)putc(ch, fp); + (void)putc(nch, fp); } (void)putc('\n', fp); break; @@ -999,11 +1045,10 @@ opts_save(sp, fp) * opts_search -- * Search for an option. * - * PUBLIC: OPTLIST const *opts_search __P((char *)); + * PUBLIC: OPTLIST const *opts_search __P((CHAR_T *)); */ OPTLIST const * -opts_search(name) - char *name; +opts_search(CHAR_T *name) { OPTLIST const *op, *found; OABBREV atmp, *ap; @@ -1026,13 +1071,13 @@ opts_search(name) * Check to see if the name is the prefix of one (and only one) * option. If so, return the option. */ - len = strlen(name); + len = STRLEN(name); for (found = NULL, op = optlist; op->name != NULL; ++op) { if (op->name[0] < name[0]) continue; if (op->name[0] > name[0]) break; - if (!memcmp(op->name, name, len)) { + if (!MEMCMP(op->name, name, len)) { if (found != NULL) return (NULL); found = op; @@ -1045,29 +1090,31 @@ opts_search(name) * opts_nomatch -- * Standard nomatch error message for options. * - * PUBLIC: void opts_nomatch __P((SCR *, char *)); + * PUBLIC: void opts_nomatch __P((SCR *, CHAR_T *)); */ void -opts_nomatch(sp, name) - SCR *sp; - char *name; +opts_nomatch( + SCR *sp, + CHAR_T *name) { - msgq_str(sp, M_ERR, name, + msgq_wstr(sp, M_ERR, name, "033|set: no %s option: 'set all' gives all option values"); } static int -opts_abbcmp(a, b) - const void *a, *b; +opts_abbcmp( + const void *a, + const void *b) { - return(strcmp(((OABBREV *)a)->name, ((OABBREV *)b)->name)); + return(STRCMP(((OABBREV *)a)->name, ((OABBREV *)b)->name)); } static int -opts_cmp(a, b) - const void *a, *b; +opts_cmp( + const void *a, + const void *b) { - return(strcmp(((OPTLIST *)a)->name, ((OPTLIST *)b)->name)); + return(STRCMP(((OPTLIST *)a)->name, ((OPTLIST *)b)->name)); } /* @@ -1077,8 +1124,9 @@ opts_cmp(a, b) * PUBLIC: int opts_copy __P((SCR *, SCR *)); */ int -opts_copy(orig, sp) - SCR *orig, *sp; +opts_copy( + SCR *orig, + SCR *sp) { int cnt, rval; @@ -1088,7 +1136,7 @@ opts_copy(orig, sp) /* Copy the string edit options. */ for (cnt = rval = 0; cnt < O_OPTIONCOUNT; ++cnt) { if (optlist[cnt].type != OPT_STR || - F_ISSET(&optlist[cnt], OPT_GLOBAL)) + F_ISSET(&sp->opts[cnt], OPT_GLOBAL)) continue; /* * If never set, or already failed, NULL out the entries -- @@ -1124,14 +1172,13 @@ nomem: msgq(orig, M_SYSERR, NULL); * PUBLIC: void opts_free __P((SCR *)); */ void -opts_free(sp) - SCR *sp; +opts_free(SCR *sp) { int cnt; for (cnt = 0; cnt < O_OPTIONCOUNT; ++cnt) { if (optlist[cnt].type != OPT_STR || - F_ISSET(&optlist[cnt], OPT_GLOBAL)) + F_ISSET(&sp->opts[cnt], OPT_GLOBAL)) continue; if (O_STR(sp, cnt) != NULL) free(O_STR(sp, cnt)); diff --git a/common/options.h b/common/options.h index 2646dc301b5a..fe1f80f5f16d 100644 --- a/common/options.h +++ b/common/options.h @@ -6,7 +6,7 @@ * * See the LICENSE file for redistribution information. * - * @(#)options.h 10.19 (Berkeley) 10/10/96 + * $Id: options.h,v 10.21 2012/02/10 20:24:58 zy Exp $ */ /* @@ -76,7 +76,7 @@ struct _option { /* List of option names, associated update functions and information. */ struct _optlist { - char *name; /* Name. */ + CHAR_T *name; /* Name. */ /* Change function. */ int (*func) __P((SCR *, OPTION *, char *, u_long *)); /* Type of object. */ @@ -89,6 +89,7 @@ struct _optlist { #define OPT_NOSET 0x010 /* Option may not be set. */ #define OPT_NOUNSET 0x020 /* Option may not be unset. */ #define OPT_NOZERO 0x040 /* Option may not be set to 0. */ +#define OPT_PAIRS 0x080 /* String with even length. */ u_int8_t flags; }; diff --git a/common/options_def.h b/common/options_def.h new file mode 100644 index 000000000000..8e232786cfe6 --- /dev/null +++ b/common/options_def.h @@ -0,0 +1,83 @@ +#define O_ALTWERASE 0 +#define O_AUTOINDENT 1 +#define O_AUTOPRINT 2 +#define O_AUTOWRITE 3 +#define O_BACKUP 4 +#define O_BEAUTIFY 5 +#define O_CDPATH 6 +#define O_CEDIT 7 +#define O_COLUMNS 8 +#define O_COMBINED 9 +#define O_COMMENT 10 +#define O_TMPDIR 11 +#define O_EDCOMPATIBLE 12 +#define O_ERRORBELLS 13 +#define O_ESCAPETIME 14 +#define O_EXRC 15 +#define O_EXTENDED 16 +#define O_FILEC 17 +#define O_FILEENCODING 18 +#define O_FLASH 19 +#define O_HARDTABS 20 +#define O_ICLOWER 21 +#define O_IGNORECASE 22 +#define O_INPUTENCODING 23 +#define O_KEYTIME 24 +#define O_LEFTRIGHT 25 +#define O_LINES 26 +#define O_LISP 27 +#define O_LIST 28 +#define O_LOCKFILES 29 +#define O_MAGIC 30 +#define O_MATCHCHARS 31 +#define O_MATCHTIME 32 +#define O_MESG 33 +#define O_MODELINE 34 +#define O_MSGCAT 35 +#define O_NOPRINT 36 +#define O_NUMBER 37 +#define O_OCTAL 38 +#define O_OPEN 39 +#define O_OPTIMIZE 40 +#define O_PARAGRAPHS 41 +#define O_PATH 42 +#define O_PRINT 43 +#define O_PROMPT 44 +#define O_READONLY 45 +#define O_RECDIR 46 +#define O_REDRAW 47 +#define O_REMAP 48 +#define O_REPORT 49 +#define O_RULER 50 +#define O_SCROLL 51 +#define O_SEARCHINCR 52 +#define O_SECTIONS 53 +#define O_SECURE 54 +#define O_SHELL 55 +#define O_SHELLMETA 56 +#define O_SHIFTWIDTH 57 +#define O_SHOWMATCH 58 +#define O_SHOWMODE 59 +#define O_SIDESCROLL 60 +#define O_SLOWOPEN 61 +#define O_SOURCEANY 62 +#define O_TABSTOP 63 +#define O_TAGLENGTH 64 +#define O_TAGS 65 +#define O_TERM 66 +#define O_TERSE 67 +#define O_TILDEOP 68 +#define O_TIMEOUT 69 +#define O_TTYWERASE 70 +#define O_VERBOSE 71 +#define O_W1200 72 +#define O_W300 73 +#define O_W9600 74 +#define O_WARN 75 +#define O_WINDOW 76 +#define O_WINDOWNAME 77 +#define O_WRAPLEN 78 +#define O_WRAPMARGIN 79 +#define O_WRAPSCAN 80 +#define O_WRITEANY 81 +#define O_OPTIONCOUNT 82 diff --git a/common/options_f.c b/common/options_f.c index ea3c61160cf5..482a37e39d39 100644 --- a/common/options_f.c +++ b/common/options_f.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)options_f.c 10.25 (Berkeley) 7/12/96"; +static const char sccsid[] = "$Id: options_f.c,v 10.34 04/07/11 16:06:29 zy Exp $"; #endif /* not lint */ #include @@ -32,13 +32,13 @@ static const char sccsid[] = "@(#)options_f.c 10.25 (Berkeley) 7/12/96"; * PUBLIC: int f_altwerase __P((SCR *, OPTION *, char *, u_long *)); */ int -f_altwerase(sp, op, str, valp) - SCR *sp; - OPTION *op; - char *str; - u_long *valp; +f_altwerase( + SCR *sp, + OPTION *op, + char *str, + u_long *valp) { - if (!*valp) + if (*valp) O_CLR(sp, O_TTYWERASE); return (0); } @@ -47,11 +47,11 @@ f_altwerase(sp, op, str, valp) * PUBLIC: int f_columns __P((SCR *, OPTION *, char *, u_long *)); */ int -f_columns(sp, op, str, valp) - SCR *sp; - OPTION *op; - char *str; - u_long *valp; +f_columns( + SCR *sp, + OPTION *op, + char *str, + u_long *valp) { /* Validate the number. */ if (*valp < MINIMUM_SCREEN_COLS) { @@ -81,11 +81,11 @@ f_columns(sp, op, str, valp) * PUBLIC: int f_lines __P((SCR *, OPTION *, char *, u_long *)); */ int -f_lines(sp, op, str, valp) - SCR *sp; - OPTION *op; - char *str; - u_long *valp; +f_lines( + SCR *sp, + OPTION *op, + char *str, + u_long *valp) { /* Validate the number. */ if (*valp < MINIMUM_SCREEN_ROWS) { @@ -138,11 +138,11 @@ f_lines(sp, op, str, valp) * PUBLIC: int f_lisp __P((SCR *, OPTION *, char *, u_long *)); */ int -f_lisp(sp, op, str, valp) - SCR *sp; - OPTION *op; - char *str; - u_long *valp; +f_lisp( + SCR *sp, + OPTION *op, + char *str, + u_long *valp) { msgq(sp, M_ERR, "044|The lisp option is not implemented"); return (0); @@ -152,44 +152,37 @@ f_lisp(sp, op, str, valp) * PUBLIC: int f_msgcat __P((SCR *, OPTION *, char *, u_long *)); */ int -f_msgcat(sp, op, str, valp) - SCR *sp; - OPTION *op; - char *str; - u_long *valp; +f_msgcat( + SCR *sp, + OPTION *op, + char *str, + u_long *valp) { (void)msg_open(sp, str); return (0); } -/* - * PUBLIC: int f_paragraph __P((SCR *, OPTION *, char *, u_long *)); - */ -int -f_paragraph(sp, op, str, valp) - SCR *sp; - OPTION *op; - char *str; - u_long *valp; -{ - if (strlen(str) & 1) { - msgq(sp, M_ERR, - "048|The paragraph option must be in two character groups"); - return (1); - } - return (0); -} - /* * PUBLIC: int f_print __P((SCR *, OPTION *, char *, u_long *)); */ int -f_print(sp, op, str, valp) - SCR *sp; - OPTION *op; - char *str; - u_long *valp; +f_print( + SCR *sp, + OPTION *op, + char *str, + u_long *valp) { + int offset = op - sp->opts; + + /* Preset the value, needed for reinitialization of lookup table. */ + if (offset == O_OCTAL) { + if (*valp) + O_SET(sp, offset); + else + O_CLR(sp, offset); + } else if (o_set(sp, offset, OS_STRDUP, str, 0)) + return(1); + /* Reinitialize the key fast lookup table. */ v_key_ilookup(sp); @@ -202,20 +195,20 @@ f_print(sp, op, str, valp) * PUBLIC: int f_readonly __P((SCR *, OPTION *, char *, u_long *)); */ int -f_readonly(sp, op, str, valp) - SCR *sp; - OPTION *op; - char *str; - u_long *valp; +f_readonly( + SCR *sp, + OPTION *op, + char *str, + u_long *valp) { /* * !!! * See the comment in exf.c. */ if (*valp) - F_CLR(sp, SC_READONLY); - else F_SET(sp, SC_READONLY); + else + F_CLR(sp, SC_READONLY); return (0); } @@ -223,11 +216,11 @@ f_readonly(sp, op, str, valp) * PUBLIC: int f_recompile __P((SCR *, OPTION *, char *, u_long *)); */ int -f_recompile(sp, op, str, valp) - SCR *sp; - OPTION *op; - char *str; - u_long *valp; +f_recompile( + SCR *sp, + OPTION *op, + char *str, + u_long *valp) { if (F_ISSET(sp, SC_RE_SEARCH)) { regfree(&sp->re_c); @@ -244,45 +237,27 @@ f_recompile(sp, op, str, valp) * PUBLIC: int f_reformat __P((SCR *, OPTION *, char *, u_long *)); */ int -f_reformat(sp, op, str, valp) - SCR *sp; - OPTION *op; - char *str; - u_long *valp; +f_reformat( + SCR *sp, + OPTION *op, + char *str, + u_long *valp) { F_SET(sp, SC_SCR_REFORMAT); return (0); } -/* - * PUBLIC: int f_section __P((SCR *, OPTION *, char *, u_long *)); - */ -int -f_section(sp, op, str, valp) - SCR *sp; - OPTION *op; - char *str; - u_long *valp; -{ - if (strlen(str) & 1) { - msgq(sp, M_ERR, - "049|The section option must be in two character groups"); - return (1); - } - return (0); -} - /* * PUBLIC: int f_ttywerase __P((SCR *, OPTION *, char *, u_long *)); */ int -f_ttywerase(sp, op, str, valp) - SCR *sp; - OPTION *op; - char *str; - u_long *valp; +f_ttywerase( + SCR *sp, + OPTION *op, + char *str, + u_long *valp) { - if (!*valp) + if (*valp) O_CLR(sp, O_ALTWERASE); return (0); } @@ -291,11 +266,11 @@ f_ttywerase(sp, op, str, valp) * PUBLIC: int f_w300 __P((SCR *, OPTION *, char *, u_long *)); */ int -f_w300(sp, op, str, valp) - SCR *sp; - OPTION *op; - char *str; - u_long *valp; +f_w300( + SCR *sp, + OPTION *op, + char *str, + u_long *valp) { u_long v; @@ -312,11 +287,11 @@ f_w300(sp, op, str, valp) * PUBLIC: int f_w1200 __P((SCR *, OPTION *, char *, u_long *)); */ int -f_w1200(sp, op, str, valp) - SCR *sp; - OPTION *op; - char *str; - u_long *valp; +f_w1200( + SCR *sp, + OPTION *op, + char *str, + u_long *valp) { u_long v; @@ -333,11 +308,11 @@ f_w1200(sp, op, str, valp) * PUBLIC: int f_w9600 __P((SCR *, OPTION *, char *, u_long *)); */ int -f_w9600(sp, op, str, valp) - SCR *sp; - OPTION *op; - char *str; - u_long *valp; +f_w9600( + SCR *sp, + OPTION *op, + char *str, + u_long *valp) { u_long v; @@ -354,14 +329,29 @@ f_w9600(sp, op, str, valp) * PUBLIC: int f_window __P((SCR *, OPTION *, char *, u_long *)); */ int -f_window(sp, op, str, valp) - SCR *sp; - OPTION *op; - char *str; - u_long *valp; +f_window( + SCR *sp, + OPTION *op, + char *str, + u_long *valp) { if (*valp >= O_VAL(sp, O_LINES) - 1 && (*valp = O_VAL(sp, O_LINES) - 1) == 0) *valp = 1; return (0); } + +/* + * PUBLIC: int f_encoding __P((SCR *, OPTION *, char *, u_long *)); + */ +int +f_encoding( + SCR *sp, + OPTION *op, + char *str, + u_long *valp) +{ + int offset = op - sp->opts; + + return conv_enc(sp, offset, str); +} diff --git a/common/put.c b/common/put.c index 8c0ca4b7c14f..6e9dc09902de 100644 --- a/common/put.c +++ b/common/put.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)put.c 10.11 (Berkeley) 9/23/96"; +static const char sccsid[] = "$Id: put.c,v 10.19 04/07/11 17:00:24 zy Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -32,19 +33,21 @@ static const char sccsid[] = "@(#)put.c 10.11 (Berkeley) 9/23/96"; * PUBLIC: int put __P((SCR *, CB *, CHAR_T *, MARK *, MARK *, int)); */ int -put(sp, cbp, namep, cp, rp, append) - SCR *sp; - CB *cbp; - CHAR_T *namep; - MARK *cp, *rp; - int append; +put( + SCR *sp, + CB *cbp, + CHAR_T *namep, + MARK *cp, + MARK *rp, + int append) { CHAR_T name; TEXT *ltp, *tp; recno_t lno; size_t blen, clen, len; int rval; - char *bp, *p, *t; + CHAR_T *bp, *t; + CHAR_T *p; if (cbp == NULL) if (namep == NULL) { @@ -63,7 +66,7 @@ put(sp, cbp, namep, cp, rp, append) return (1); } } - tp = cbp->textq.cqh_first; + tp = TAILQ_FIRST(cbp->textq); /* * It's possible to do a put into an empty file, meaning that the cut @@ -84,8 +87,8 @@ put(sp, cbp, namep, cp, rp, append) if (db_last(sp, &lno)) return (1); if (lno == 0) { - for (; tp != (void *)&cbp->textq; - ++lno, ++sp->rptlines[L_ADDED], tp = tp->q.cqe_next) + for (; tp != NULL; + ++lno, ++sp->rptlines[L_ADDED], tp = TAILQ_NEXT(tp, q)) if (db_append(sp, 1, lno, tp->lb, tp->len)) return (1); rp->lno = 1; @@ -98,8 +101,8 @@ put(sp, cbp, namep, cp, rp, append) if (F_ISSET(cbp, CB_LMODE)) { lno = append ? cp->lno : cp->lno - 1; rp->lno = lno + 1; - for (; tp != (void *)&cbp->textq; - ++lno, ++sp->rptlines[L_ADDED], tp = tp->q.cqe_next) + for (; tp != NULL; + ++lno, ++sp->rptlines[L_ADDED], tp = TAILQ_NEXT(tp, q)) if (db_append(sp, 1, lno, tp->lb, tp->len)) return (1); rp->cno = 0; @@ -120,19 +123,19 @@ put(sp, cbp, namep, cp, rp, append) if (db_get(sp, lno, DBG_FATAL, &p, &len)) return (1); - GET_SPACE_RET(sp, bp, blen, tp->len + len + 1); + GET_SPACE_RETW(sp, bp, blen, tp->len + len + 1); t = bp; /* Original line, left of the split. */ if (len > 0 && (clen = cp->cno + (append ? 1 : 0)) > 0) { - memcpy(bp, p, clen); + MEMCPY(bp, p, clen); p += clen; t += clen; } /* First line from the CB. */ if (tp->len != 0) { - memcpy(t, tp->lb, tp->len); + MEMCPY(t, tp->lb, tp->len); t += tp->len; } @@ -161,9 +164,9 @@ put(sp, cbp, namep, cp, rp, append) * the intermediate lines, because the line changes will lose * the cached line. */ - if (tp->q.cqe_next == (void *)&cbp->textq) { + if (TAILQ_NEXT(tp, q) == NULL) { if (clen > 0) { - memcpy(t, p, clen); + MEMCPY(t, p, clen); t += clen; } if (db_set(sp, lno, bp, t - bp)) @@ -183,15 +186,15 @@ put(sp, cbp, namep, cp, rp, append) * Last part of original line; check for space, reset * the pointer into the buffer. */ - ltp = cbp->textq.cqh_last; + ltp = TAILQ_LAST(cbp->textq, _texth); len = t - bp; - ADD_SPACE_RET(sp, bp, blen, ltp->len + clen); + ADD_SPACE_RETW(sp, bp, blen, ltp->len + clen); t = bp + len; /* Add in last part of the CB. */ - memcpy(t, ltp->lb, ltp->len); + MEMCPY(t, ltp->lb, ltp->len); if (clen) - memcpy(t + ltp->len, p, clen); + MEMCPY(t + ltp->len, p, clen); clen += ltp->len; /* @@ -211,9 +214,8 @@ put(sp, cbp, namep, cp, rp, append) } /* Output any intermediate lines in the CB. */ - for (tp = tp->q.cqe_next; - tp->q.cqe_next != (void *)&cbp->textq; - ++lno, ++sp->rptlines[L_ADDED], tp = tp->q.cqe_next) + for (tp = TAILQ_NEXT(tp, q); TAILQ_NEXT(tp, q) != NULL; + ++lno, ++sp->rptlines[L_ADDED], tp = TAILQ_NEXT(tp, q)) if (db_append(sp, 1, lno, tp->lb, tp->len)) goto err; @@ -226,6 +228,6 @@ put(sp, cbp, namep, cp, rp, append) if (0) err: rval = 1; - FREE_SPACE(sp, bp, blen); + FREE_SPACEW(sp, bp, blen); return (rval); } diff --git a/common/recover.c b/common/recover.c index f3abaab5a536..b20471f111b2 100644 --- a/common/recover.c +++ b/common/recover.c @@ -10,11 +10,10 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)recover.c 10.21 (Berkeley) 9/15/96"; +static const char sccsid[] = "$Id: recover.c,v 11.2 2012/10/09 08:06:58 zy Exp $"; #endif /* not lint */ -#include -#include /* XXX: param.h may not have included types.h */ +#include #include #include @@ -31,12 +30,15 @@ static const char sccsid[] = "@(#)recover.c 10.21 (Berkeley) 9/15/96"; #include #include #include +#include /* Required by resolv.h. */ +#include #include #include #include #include #include +#include "../ex/version.h" #include "common.h" #include "pathnames.h" @@ -57,12 +59,7 @@ static const char sccsid[] = "@(#)recover.c 10.21 (Berkeley) 9/15/96"; * file exists, and is exclusively locked. * * In the EXF structure we maintain a file descriptor that is the locked - * file descriptor for the mail recovery file. NOTE: we sometimes have to - * do locking with fcntl(2). This is a problem because if you close(2) any - * file descriptor associated with the file, ALL of the locks go away. Be - * sure to remember that if you have to modify the recovery code. (It has - * been rhetorically asked of what the designers could have been thinking - * when they did that interface. The answer is simple: they weren't.) + * file descriptor for the mail recovery file. * * To find out if a recovery file/backing file pair are in use, try to get * a lock on the recovery file. @@ -93,27 +90,24 @@ static const char sccsid[] = "@(#)recover.c 10.21 (Berkeley) 9/15/96"; * means that the data structures (SCR, EXF, the underlying tree structures) * must be consistent when the signal arrives. * - * The recovery mail file contains normal mail headers, with two additions, - * which occur in THIS order, as the FIRST TWO headers: + * The recovery mail file contains normal mail headers, with two additional * - * X-vi-recover-file: file_name - * X-vi-recover-path: recover_path + * X-vi-data: ; * - * Since newlines delimit the headers, this means that file names cannot have - * newlines in them, but that's probably okay. As these files aren't intended - * to be long-lived, changing their format won't be too painful. + * MIME headers; the folding character is limited to ' '. * - * Btree files are named "vi.XXXX" and recovery files are named "recover.XXXX". + * Btree files are named "vi.XXXXXX" and recovery files are named + * "recover.XXXXXX". */ -#define VI_FHEADER "X-vi-recover-file: " -#define VI_PHEADER "X-vi-recover-path: " +#define VI_DHEADER "X-vi-data:" static int rcv_copy __P((SCR *, int, char *)); static void rcv_email __P((SCR *, char *)); -static char *rcv_gets __P((char *, size_t, int)); static int rcv_mailfile __P((SCR *, int, char *)); -static int rcv_mktemp __P((SCR *, char *, char *, int)); +static int rcv_mktemp __P((SCR *, char *, char *)); +static int rcv_dlnwrite __P((SCR *, const char *, const char *, FILE *)); +static int rcv_dlnread __P((SCR *, char **, char **, FILE *)); /* * rcv_tmp -- @@ -122,14 +116,14 @@ static int rcv_mktemp __P((SCR *, char *, char *, int)); * PUBLIC: int rcv_tmp __P((SCR *, EXF *, char *)); */ int -rcv_tmp(sp, ep, name) - SCR *sp; - EXF *ep; - char *name; +rcv_tmp( + SCR *sp, + EXF *ep, + char *name) { struct stat sb; int fd; - char *dp, *p, path[MAXPATHLEN]; + char *dp, *path; /* * !!! @@ -153,22 +147,17 @@ rcv_tmp(sp, ep, name) (void)chmod(dp, S_IRWXU | S_IRWXG | S_IRWXO | S_ISVTX); } - /* Newlines delimit the mail messages. */ - for (p = name; *p; ++p) - if (*p == '\n') { - msgq(sp, M_ERR, - "055|Files with newlines in the name are unrecoverable"); - goto err; - } - - (void)snprintf(path, sizeof(path), "%s/vi.XXXXXX", dp); - if ((fd = rcv_mktemp(sp, path, dp, S_IRWXU)) == -1) + if ((path = join(dp, "vi.XXXXXX")) == NULL) goto err; + if ((fd = rcv_mktemp(sp, path, dp)) == -1) { + free(path); + goto err; + } + (void)fchmod(fd, S_IRWXU); (void)close(fd); - if ((ep->rcv_path = strdup(path)) == NULL) { - msgq(sp, M_SYSERR, NULL); - (void)unlink(path); + ep->rcv_path = path; + if (0) { err: msgq(sp, M_ERR, "056|Modifications not recoverable if the session fails"); return (1); @@ -186,8 +175,7 @@ err: msgq(sp, M_ERR, * PUBLIC: int rcv_init __P((SCR *)); */ int -rcv_init(sp) - SCR *sp; +rcv_init(SCR *sp) { EXF *ep; recno_t lno; @@ -249,13 +237,13 @@ err: msgq(sp, M_ERR, * PUBLIC: int rcv_sync __P((SCR *, u_int)); */ int -rcv_sync(sp, flags) - SCR *sp; - u_int flags; +rcv_sync( + SCR *sp, + u_int flags) { EXF *ep; int fd, rval; - char *dp, buf[1024]; + char *dp, *buf; /* Make sure that there's something to recover/sync. */ ep = sp->ep; @@ -298,9 +286,14 @@ rcv_sync(sp, flags) if (opts_empty(sp, O_RECDIR, 0)) goto err; dp = O_STR(sp, O_RECDIR); - (void)snprintf(buf, sizeof(buf), "%s/vi.XXXXXX", dp); - if ((fd = rcv_mktemp(sp, buf, dp, S_IRUSR | S_IWUSR)) == -1) + if ((buf = join(dp, "vi.XXXXXX")) == NULL) { + msgq(sp, M_SYSERR, NULL); goto err; + } + if ((fd = rcv_mktemp(sp, buf, dp)) == -1) { + free(buf); + goto err; + } sp->gp->scr_busy(sp, "061|Copying file for recovery...", BUSY_ON); if (rcv_copy(sp, fd, ep->rcv_path) || @@ -309,6 +302,7 @@ rcv_sync(sp, flags) (void)close(fd); rval = 1; } + free(buf); sp->gp->scr_busy(sp, NULL, BUSY_OFF); } if (0) { @@ -327,30 +321,32 @@ err: rval = 1; * Build the file to mail to the user. */ static int -rcv_mailfile(sp, issync, cp_path) - SCR *sp; - int issync; - char *cp_path; +rcv_mailfile( + SCR *sp, + int issync, + char *cp_path) { EXF *ep; GS *gp; struct passwd *pw; - size_t len; + int len; time_t now; uid_t uid; int fd; - char *dp, *p, *t, buf[4096], mpath[MAXPATHLEN]; + FILE *fp; + char *dp, *p, *t, *qt, *buf, *mpath; char *t1, *t2, *t3; + int st; /* * XXX - * MAXHOSTNAMELEN is in various places on various systems, including - * and . If not found, use a large default. + * MAXHOSTNAMELEN/HOST_NAME_MAX are deprecated. We try sysconf(3) + * first, then fallback to _POSIX_HOST_NAME_MAX. */ -#ifndef MAXHOSTNAMELEN -#define MAXHOSTNAMELEN 1024 -#endif - char host[MAXHOSTNAMELEN]; + char *host; + long hostmax = sysconf(_SC_HOST_NAME_MAX); + if (hostmax < 0) + hostmax = _POSIX_HOST_NAME_MAX; gp = sp->gp; if ((pw = getpwuid(uid = getuid())) == NULL) { @@ -362,9 +358,19 @@ rcv_mailfile(sp, issync, cp_path) if (opts_empty(sp, O_RECDIR, 0)) return (1); dp = O_STR(sp, O_RECDIR); - (void)snprintf(mpath, sizeof(mpath), "%s/recover.XXXXXX", dp); - if ((fd = rcv_mktemp(sp, mpath, dp, S_IRUSR | S_IWUSR)) == -1) + if ((mpath = join(dp, "recover.XXXXXX")) == NULL) { + msgq(sp, M_SYSERR, NULL); return (1); + } + if ((fd = rcv_mktemp(sp, mpath, dp)) == -1) { + free(mpath); + return (1); + } + if ((fp = fdopen(fd, "w")) == NULL) { + free(mpath); + close(fd); + return (1); + } /* * XXX @@ -374,56 +380,64 @@ rcv_mailfile(sp, issync, cp_path) * and the lock, but it's pretty small. */ ep = sp->ep; - if (file_lock(sp, NULL, NULL, fd, 1) != LOCK_SUCCESS) + if (file_lock(sp, NULL, fd, 1) != LOCK_SUCCESS) msgq(sp, M_SYSERR, "063|Unable to lock recovery file"); if (!issync) { /* Save the recover file descriptor, and mail path. */ - ep->rcv_fd = fd; - if ((ep->rcv_mpath = strdup(mpath)) == NULL) { - msgq(sp, M_SYSERR, NULL); - goto err; - } + ep->rcv_fd = dup(fd); + ep->rcv_mpath = mpath; cp_path = ep->rcv_path; } - /* - * XXX - * We can't use stdio(3) here. The problem is that we may be using - * fcntl(2), so if ANY file descriptor into the file is closed, the - * lock is lost. So, we could never close the FILE *, even if we - * dup'd the fd first. - */ t = sp->frp->name; if ((p = strrchr(t, '/')) == NULL) p = t; else ++p; (void)time(&now); - (void)gethostname(host, sizeof(host)); - len = snprintf(buf, sizeof(buf), - "%s%s\n%s%s\n%s\n%s\n%s%s\n%s%s\n%s\n\n", - VI_FHEADER, t, /* Non-standard. */ - VI_PHEADER, cp_path, /* Non-standard. */ - "Reply-To: root", - "From: root (Nvi recovery program)", - "To: ", pw->pw_name, + + if ((st = rcv_dlnwrite(sp, "file", t, fp))) { + if (st == 1) + goto werr; + goto err; + } + if ((st = rcv_dlnwrite(sp, "path", cp_path, fp))) { + if (st == 1) + goto werr; + goto err; + } + + MALLOC(sp, host, char *, hostmax + 1); + if (host == NULL) + goto err; + (void)gethostname(host, hostmax + 1); + + len = fprintf(fp, "%s%s%s\n%s%s%s%s\n%s%.40s\n%s\n\n", + "From: root@", host, " (Nvi recovery program)", + "To: ", pw->pw_name, "@", host, "Subject: Nvi saved the file ", p, "Precedence: bulk"); /* For vacation(1). */ - if (len > sizeof(buf) - 1) - goto lerr; - if (write(fd, buf, len) != len) + if (len < 0) { + free(host); goto werr; + } - len = snprintf(buf, sizeof(buf), - "%s%.24s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n\n", + if ((qt = quote(t)) == NULL) { + free(host); + msgq(sp, M_SYSERR, NULL); + goto err; + } + len = asprintf(&buf, "%s%.24s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n\n", "On ", ctime(&now), ", the user ", pw->pw_name, " was editing a file named ", t, " on the machine ", host, ", when it was saved for recovery. ", "You can recover most, if not all, of the changes ", "to this file using the -r option to ", gp->progname, ":\n\n\t", - gp->progname, " -r ", t); - if (len > sizeof(buf) - 1) { -lerr: msgq(sp, M_ERR, "064|Recovery file buffer overrun"); + gp->progname, " -r ", qt); + free(qt); + free(host); + if (buf == NULL) { + msgq(sp, M_SYSERR, NULL); goto err; } @@ -457,23 +471,29 @@ lerr: msgq(sp, M_ERR, "064|Recovery file buffer overrun"); wout: *t2++ = '\n'; /* t2 points one after the last character to display. */ - if (write(fd, t1, t2 - t1) != t2 - t1) + if (fwrite(t1, 1, t2 - t1, fp) != t2 - t1) { + free(buf); goto werr; + } } if (issync) { + fflush(fp); rcv_email(sp, mpath); - if (close(fd)) { -werr: msgq(sp, M_SYSERR, "065|Recovery file"); - goto err; - } + free(mpath); } + if (fclose(fp)) { + free(buf); +werr: msgq(sp, M_SYSERR, "065|Recovery file"); + goto err; + } + free(buf); return (0); err: if (!issync) ep->rcv_fd = -1; - if (fd != -1) - (void)close(fd); + if (fp != NULL) + (void)fclose(fp); return (1); } @@ -488,15 +508,16 @@ err: if (!issync) * PUBLIC: int rcv_list __P((SCR *)); */ int -rcv_list(sp) - SCR *sp; +rcv_list(SCR *sp) { struct dirent *dp; struct stat sb; DIR *dirp; FILE *fp; int found; - char *p, *t, file[MAXPATHLEN], path[MAXPATHLEN]; + char *p, *file, *path; + char *dtype, *data; + int st; /* Open the recovery directory for reading. */ if (opts_empty(sp, O_RECDIR, 0)) @@ -512,18 +533,11 @@ rcv_list(sp) if (strncmp(dp->d_name, "recover.", 8)) continue; - /* - * If it's readable, it's recoverable. - * - * XXX - * Should be "r", we don't want to write the file. However, - * if we're using fcntl(2), there's no way to lock a file - * descriptor that's not open for writing. - */ - if ((fp = fopen(dp->d_name, "r+")) == NULL) + /* If it's readable, it's recoverable. */ + if ((fp = fopen(dp->d_name, "r")) == NULL) continue; - switch (file_lock(sp, NULL, NULL, fileno(fp), 1)) { + switch (file_lock(sp, NULL, fileno(fp), 1)) { case LOCK_FAILED: /* * XXX @@ -542,17 +556,23 @@ rcv_list(sp) } /* Check the headers. */ - if (fgets(file, sizeof(file), fp) == NULL || - strncmp(file, VI_FHEADER, sizeof(VI_FHEADER) - 1) || - (p = strchr(file, '\n')) == NULL || - fgets(path, sizeof(path), fp) == NULL || - strncmp(path, VI_PHEADER, sizeof(VI_PHEADER) - 1) || - (t = strchr(path, '\n')) == NULL) { - msgq_str(sp, M_ERR, dp->d_name, - "066|%s: malformed recovery file"); - goto next; + for (file = NULL, path = NULL; + file == NULL || path == NULL;) { + if ((st = rcv_dlnread(sp, &dtype, &data, fp))) { + if (st == 1) + msgq_str(sp, M_ERR, dp->d_name, + "066|%s: malformed recovery file"); + goto next; + } + if (dtype == NULL) + continue; + if (!strcmp(dtype, "file")) + file = data; + else if (!strcmp(dtype, "path")) + path = data; + else + free(data); } - *p = *t = '\0'; /* * If the file doesn't exist, it's an orphaned recovery file, @@ -563,7 +583,7 @@ rcv_list(sp) * before deleting the email file. */ errno = 0; - if (stat(path + sizeof(VI_PHEADER) - 1, &sb) && + if (stat(path, &sb) && errno == ENOENT) { (void)unlink(dp->d_name); goto next; @@ -572,14 +592,18 @@ rcv_list(sp) /* Get the last modification time and display. */ (void)fstat(fileno(fp), &sb); (void)printf("%.24s: %s\n", - ctime(&sb.st_mtime), file + sizeof(VI_FHEADER) - 1); + ctime(&sb.st_mtime), file); found = 1; /* Close, discarding lock. */ next: (void)fclose(fp); + if (file != NULL) + free(file); + if (path != NULL) + free(path); } if (found == 0) - (void)printf("vi: no files to recover.\n"); + (void)printf("%s: No files to recover\n", sp->gp->progname); (void)closedir(dirp); return (0); } @@ -591,18 +615,21 @@ next: (void)fclose(fp); * PUBLIC: int rcv_read __P((SCR *, FREF *)); */ int -rcv_read(sp, frp) - SCR *sp; - FREF *frp; +rcv_read( + SCR *sp, + FREF *frp) { struct dirent *dp; struct stat sb; DIR *dirp; + FILE *fp; EXF *ep; - time_t rec_mtime; - int fd, found, locked, requested, sv_fd; + struct timespec rec_mtim = { 0, 0 }; + int found, locked = 0, requested, sv_fd; char *name, *p, *t, *rp, *recp, *pathp; - char file[MAXPATHLEN], path[MAXPATHLEN], recpath[MAXPATHLEN]; + char *file, *path, *recpath; + char *dtype, *data; + int st; if (opts_empty(sp, O_RECDIR, 0)) return (1); @@ -614,30 +641,22 @@ rcv_read(sp, frp) name = frp->name; sv_fd = -1; - rec_mtime = 0; recp = pathp = NULL; for (found = requested = 0; (dp = readdir(dirp)) != NULL;) { if (strncmp(dp->d_name, "recover.", 8)) continue; - (void)snprintf(recpath, - sizeof(recpath), "%s/%s", rp, dp->d_name); - - /* - * If it's readable, it's recoverable. It would be very - * nice to use stdio(3), but, we can't because that would - * require closing and then reopening the file so that we - * could have a lock and still close the FP. Another tip - * of the hat to fcntl(2). - * - * XXX - * Should be O_RDONLY, we don't want to write it. However, - * if we're using fcntl(2), there's no way to lock a file - * descriptor that's not open for writing. - */ - if ((fd = open(recpath, O_RDWR, 0)) == -1) + if ((recpath = join(rp, dp->d_name)) == NULL) { + msgq(sp, M_SYSERR, NULL); continue; + } - switch (file_lock(sp, NULL, NULL, fd, 1)) { + /* If it's readable, it's recoverable. */ + if ((fp = fopen(recpath, "r")) == NULL) { + free(recpath); + continue; + } + + switch (file_lock(sp, NULL, fileno(fp), 1)) { case LOCK_FAILED: /* * XXX @@ -653,22 +672,28 @@ rcv_read(sp, frp) break; case LOCK_UNAVAIL: /* If it's locked, it's live. */ - (void)close(fd); + (void)fclose(fp); continue; } /* Check the headers. */ - if (rcv_gets(file, sizeof(file), fd) == NULL || - strncmp(file, VI_FHEADER, sizeof(VI_FHEADER) - 1) || - (p = strchr(file, '\n')) == NULL || - rcv_gets(path, sizeof(path), fd) == NULL || - strncmp(path, VI_PHEADER, sizeof(VI_PHEADER) - 1) || - (t = strchr(path, '\n')) == NULL) { - msgq_str(sp, M_ERR, recpath, - "067|%s: malformed recovery file"); - goto next; + for (file = NULL, path = NULL; + file == NULL || path == NULL;) { + if ((st = rcv_dlnread(sp, &dtype, &data, fp))) { + if (st == 1) + msgq_str(sp, M_ERR, dp->d_name, + "067|%s: malformed recovery file"); + goto next; + } + if (dtype == NULL) + continue; + if (!strcmp(dtype, "file")) + file = data; + else if (!strcmp(dtype, "path")) + path = data; + else + free(data); } - *p = *t = '\0'; ++found; /* @@ -680,52 +705,42 @@ rcv_read(sp, frp) * before deleting the email file. */ errno = 0; - if (stat(path + sizeof(VI_PHEADER) - 1, &sb) && + if (stat(path, &sb) && errno == ENOENT) { (void)unlink(dp->d_name); goto next; } /* Check the file name. */ - if (strcmp(file + sizeof(VI_FHEADER) - 1, name)) + if (strcmp(file, name)) goto next; ++requested; - /* - * If we've found more than one, take the most recent. - * - * XXX - * Since we're using st_mtime, for portability reasons, - * we only get a single second granularity, instead of - * getting it right. - */ - (void)fstat(fd, &sb); - if (recp == NULL || rec_mtime < sb.st_mtime) { + /* If we've found more than one, take the most recent. */ + (void)fstat(fileno(fp), &sb); + if (recp == NULL || + timespeccmp(&rec_mtim, &sb.st_mtimespec, <)) { p = recp; t = pathp; - if ((recp = strdup(recpath)) == NULL) { - msgq(sp, M_SYSERR, NULL); - recp = p; - goto next; - } - if ((pathp = strdup(path)) == NULL) { - msgq(sp, M_SYSERR, NULL); - free(recp); - recp = p; - pathp = t; - goto next; - } + recp = recpath; + pathp = path; if (p != NULL) { free(p); free(t); } - rec_mtime = sb.st_mtime; + rec_mtim = sb.st_mtimespec; if (sv_fd != -1) (void)close(sv_fd); - sv_fd = fd; - } else -next: (void)close(fd); + sv_fd = dup(fileno(fp)); + } else { +next: free(recpath); + if (path != NULL) + free(path); + } + (void)fclose(fp); + if (file != NULL) + free(file); } (void)closedir(dirp); @@ -749,12 +764,13 @@ next: (void)close(fd); * XXX * file_init() is going to set ep->rcv_path. */ - if (file_init(sp, frp, pathp + sizeof(VI_PHEADER) - 1, 0)) { + if (file_init(sp, frp, pathp, 0)) { free(recp); free(pathp); (void)close(sv_fd); return (1); } + free(pathp); /* * We keep an open lock on the file so that the recover option can @@ -777,10 +793,10 @@ next: (void)close(fd); * Copy a recovery file. */ static int -rcv_copy(sp, wfd, fname) - SCR *sp; - int wfd; - char *fname; +rcv_copy( + SCR *sp, + int wfd, + char *fname) { int nr, nw, off, rfd; char buf[8 * 1024]; @@ -798,53 +814,20 @@ err: msgq_str(sp, M_SYSERR, fname, "%s"); return (1); } -/* - * rcv_gets -- - * Fgets(3) for a file descriptor. - */ -static char * -rcv_gets(buf, len, fd) - char *buf; - size_t len; - int fd; -{ - int nr; - char *p; - - if ((nr = read(fd, buf, len - 1)) == -1) - return (NULL); - if ((p = strchr(buf, '\n')) == NULL) - return (NULL); - (void)lseek(fd, (off_t)((p - buf) + 1), SEEK_SET); - return (buf); -} - /* * rcv_mktemp -- * Paranoid make temporary file routine. */ static int -rcv_mktemp(sp, path, dname, perms) - SCR *sp; - char *path, *dname; - int perms; +rcv_mktemp( + SCR *sp, + char *path, + char *dname) { int fd; - /* - * !!! - * We expect mkstemp(3) to set the permissions correctly. On - * historic System V systems, mkstemp didn't. Do it here, on - * GP's. - * - * XXX - * The variable perms should really be a mode_t, and it would - * be nice to use fchmod(2) instead of chmod(2), here. - */ if ((fd = mkstemp(path)) == -1) msgq_str(sp, M_SYSERR, dname, "%s"); - else - (void)chmod(path, perms); return (fd); } @@ -853,26 +836,141 @@ rcv_mktemp(sp, path, dname, perms) * Send email. */ static void -rcv_email(sp, fname) - SCR *sp; - char *fname; +rcv_email( + SCR *sp, + char *fname) { - struct stat sb; - char buf[MAXPATHLEN * 2 + 20]; + char *buf; - if (_PATH_SENDMAIL[0] != '/' || stat(_PATH_SENDMAIL, &sb)) - msgq_str(sp, M_SYSERR, - _PATH_SENDMAIL, "071|not sending email: %s"); - else { - /* - * !!! - * If you need to port this to a system that doesn't have - * sendmail, the -t flag causes sendmail to read the message - * for the recipients instead of specifying them some other - * way. - */ - (void)snprintf(buf, sizeof(buf), - "%s -t < %s", _PATH_SENDMAIL, fname); - (void)system(buf); + (void)asprintf(&buf, _PATH_SENDMAIL " -odb -t < %s", fname); + if (buf == NULL) { + msgq_str(sp, M_ERR, strerror(errno), + "071|not sending email: %s"); + return; } + (void)system(buf); + free(buf); +} + +/* + * rcv_dlnwrite -- + * Encode a string into an X-vi-data line and write it. + */ +static int +rcv_dlnwrite( + SCR *sp, + const char *dtype, + const char *src, + FILE *fp) +{ + char *bp = NULL, *p; + size_t blen = 0; + size_t dlen, len; + int plen, xlen; + + len = strlen(src); + dlen = strlen(dtype); + GET_SPACE_GOTOC(sp, bp, blen, (len + 2) / 3 * 4 + dlen + 2); + (void)memcpy(bp, dtype, dlen); + bp[dlen] = ';'; + if ((xlen = b64_ntop((u_char *)src, + len, bp + dlen + 1, blen)) == -1) + goto err; + xlen += dlen + 1; + + /* Output as an MIME folding header. */ + if ((plen = fprintf(fp, VI_DHEADER " %.*s\n", + FMTCOLS - (int)sizeof(VI_DHEADER), bp)) < 0) + goto err; + plen -= (int)sizeof(VI_DHEADER) + 1; + for (p = bp, xlen -= plen; xlen > 0; xlen -= plen) { + p += plen; + if ((plen = fprintf(fp, " %.*s\n", FMTCOLS - 1, p)) < 0) + goto err; + plen -= 2; + } + FREE_SPACE(sp, bp, blen); + return (0); + +err: FREE_SPACE(sp, bp, blen); + return (1); +alloc_err: + msgq(sp, M_SYSERR, NULL); + return (-1); +} + +/* + * rcv_dlnread -- + * Read an X-vi-data line and decode it. + */ +static int +rcv_dlnread( + SCR *sp, + char **dtypep, + char **datap, /* free *datap if != NULL after use. */ + FILE *fp) +{ + int ch; + char buf[1024]; + char *bp = NULL, *p, *src; + size_t blen = 0; + size_t len, off, dlen; + char *dtype, *data; + int xlen; + + if (fgets(buf, sizeof(buf), fp) == NULL) + return (1); + if (strncmp(buf, VI_DHEADER, sizeof(VI_DHEADER) - 1)) { + *dtypep = NULL; + *datap = NULL; + return (0); + } + + /* Fetch an MIME folding header. */ + len = strlen(buf) - sizeof(VI_DHEADER) + 1; + GET_SPACE_GOTOC(sp, bp, blen, len); + (void)memcpy(bp, buf + sizeof(VI_DHEADER) - 1, len); + p = bp + len; + while ((ch = fgetc(fp)) == ' ') { + if (fgets(buf, sizeof(buf), fp) == NULL) + goto err; + off = strlen(buf); + len += off; + ADD_SPACE_GOTOC(sp, bp, blen, len); + p = bp + len - off; + (void)memcpy(p, buf, off); + } + bp[len] = '\0'; + (void)ungetc(ch, fp); + + for (p = bp; *p == ' ' || *p == '\n'; p++); + if ((src = strchr(p, ';')) == NULL) + goto err; + dlen = src - p; + src += 1; + len -= src - bp; + + /* Memory looks like: "\0\0". */ + MALLOC(sp, data, char *, dlen + len / 4 * 3 + 2); + if (data == NULL) + goto err; + if ((xlen = (b64_pton(p + dlen + 1, + (u_char *)data, len / 4 * 3 + 1))) == -1) { + free(data); + goto err; + } + data[xlen] = '\0'; + dtype = data + xlen + 1; + (void)memcpy(dtype, p, dlen); + dtype[dlen] = '\0'; + FREE_SPACE(sp, bp, blen); + *dtypep = dtype; + *datap = data; + return (0); + +err: FREE_SPACE(sp, bp, blen); + return (1); +alloc_err: + msgq(sp, M_SYSERR, NULL); + return (-1); } diff --git a/common/screen.c b/common/screen.c index ba9e287b648b..9ff684509d94 100644 --- a/common/screen.c +++ b/common/screen.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)screen.c 10.15 (Berkeley) 9/15/96"; +static const char sccsid[] = "$Id: screen.c,v 10.25 2011/12/04 04:06:45 zy Exp $"; #endif /* not lint */ #include @@ -35,9 +35,10 @@ static const char sccsid[] = "@(#)screen.c 10.15 (Berkeley) 9/15/96"; * PUBLIC: int screen_init __P((GS *, SCR *, SCR **)); */ int -screen_init(gp, orig, spp) - GS *gp; - SCR *orig, **spp; +screen_init( + GS *gp, + SCR *orig, + SCR **spp) { SCR *sp; size_t len; @@ -50,9 +51,9 @@ screen_init(gp, orig, spp) sp->id = ++gp->id; sp->refcnt = 1; - sp->gp = gp; /* All ref the GS structure. */ + sp->gp = gp; /* All ref the GS structure. */ - sp->ccnt = 2; /* Anything > 1 */ + sp->ccnt = 2; /* Anything > 1 */ /* * XXX @@ -60,7 +61,7 @@ screen_init(gp, orig, spp) * we don't have the option information yet. */ - CIRCLEQ_INIT(&sp->tiq); + TAILQ_INIT(sp->tiq); /* PARTIALLY OR COMPLETELY COPIED FROM PREVIOUS SCREEN. */ if (orig == NULL) { @@ -80,15 +81,15 @@ screen_init(gp, orig, spp) /* Retain searching/substitution information. */ sp->searchdir = orig->searchdir == NOTSET ? NOTSET : FORWARD; if (orig->re != NULL && (sp->re = - v_strdup(sp, orig->re, orig->re_len)) == NULL) + v_wstrdup(sp, orig->re, orig->re_len)) == NULL) goto mem; sp->re_len = orig->re_len; if (orig->subre != NULL && (sp->subre = - v_strdup(sp, orig->subre, orig->subre_len)) == NULL) + v_wstrdup(sp, orig->subre, orig->subre_len)) == NULL) goto mem; sp->subre_len = orig->subre_len; if (orig->repl != NULL && (sp->repl = - v_strdup(sp, orig->repl, orig->repl_len)) == NULL) + v_wstrdup(sp, orig->repl, orig->repl_len)) == NULL) goto mem; sp->repl_len = orig->repl_len; if (orig->newl_len) { @@ -113,6 +114,8 @@ mem: msgq(orig, M_SYSERR, NULL); goto err; if (v_screen_copy(orig, sp)) /* Vi. */ goto err; + sp->cl_private = 0; /* XXX */ + conv_init(orig, sp); /* XXX */ *spp = sp; return (0); @@ -129,8 +132,7 @@ err: screen_end(sp); * PUBLIC: int screen_end __P((SCR *)); */ int -screen_end(sp) - SCR *sp; +screen_end(SCR *sp) { int rval; @@ -144,17 +146,13 @@ screen_end(sp) * If a created screen failed during initialization, it may not * be linked into the chain. */ - if (sp->q.cqe_next != NULL) - CIRCLEQ_REMOVE(&sp->gp->dq, sp, q); + if (TAILQ_ENTRY_ISVALID(sp, q)) + TAILQ_REMOVE(sp->gp->dq, sp, q); /* The screen is no longer real. */ F_CLR(sp, SC_SCR_EX | SC_SCR_VI); rval = 0; -#ifdef HAVE_PERL_INTERP - if (perl_screen_end(sp)) /* End perl. */ - rval = 1; -#endif if (v_screen_end(sp)) /* End vi. */ rval = 1; if (ex_screen_end(sp)) /* End ex. */ @@ -170,8 +168,8 @@ screen_end(sp) } /* Free any text input. */ - if (sp->tiq.cqh_first != NULL) - text_lfree(&sp->tiq); + if (!TAILQ_EMPTY(sp->tiq)) + text_lfree(sp->tiq); /* Free alternate file name. */ if (sp->alt_name != NULL) @@ -191,6 +189,9 @@ screen_end(sp) if (sp->newl != NULL) free(sp->newl); + /* Free the iconv environment */ + conv_end(sp); + /* Free all the options */ opts_free(sp); @@ -207,26 +208,24 @@ screen_end(sp) * PUBLIC: SCR *screen_next __P((SCR *)); */ SCR * -screen_next(sp) - SCR *sp; +screen_next(SCR *sp) { GS *gp; SCR *next; /* Try the display queue, without returning the current screen. */ gp = sp->gp; - for (next = gp->dq.cqh_first; - next != (void *)&gp->dq; next = next->q.cqe_next) + TAILQ_FOREACH(next, gp->dq, q) if (next != sp) break; - if (next != (void *)&gp->dq) + if (next != NULL) return (next); /* Try the hidden queue; if found, move screen to the display queue. */ - if (gp->hq.cqh_first != (void *)&gp->hq) { - next = gp->hq.cqh_first; - CIRCLEQ_REMOVE(&gp->hq, next, q); - CIRCLEQ_INSERT_HEAD(&gp->dq, next, q); + if (!TAILQ_EMPTY(gp->hq)) { + next = TAILQ_FIRST(gp->hq); + TAILQ_REMOVE(gp->hq, next, q); + TAILQ_INSERT_HEAD(gp->dq, next, q); return (next); } return (NULL); diff --git a/common/screen.h b/common/screen.h index bb7254f62a21..a762706834dd 100644 --- a/common/screen.h +++ b/common/screen.h @@ -6,7 +6,7 @@ * * See the LICENSE file for redistribution information. * - * @(#)screen.h 10.24 (Berkeley) 7/19/96 + * $Id: screen.h,v 10.26 2011/12/12 22:31:36 zy Exp $ */ /* @@ -32,7 +32,7 @@ */ struct _scr { /* INITIALIZED AT SCREEN CREATE. */ - CIRCLEQ_ENTRY(_scr) q; /* Screens. */ + TAILQ_ENTRY(_scr) q; /* Screens. */ int id; /* Screen id #. */ int refcnt; /* Reference count. */ @@ -55,7 +55,8 @@ struct _scr { size_t t_rows; /* 1-N: cur number of text rows. */ size_t t_maxrows; /* 1-N: max number of text rows. */ size_t t_minrows; /* 1-N: min number of text rows. */ - size_t woff; /* 0-N: screen offset in frame. */ + size_t coff; /* 0-N: screen col offset in display. */ + size_t roff; /* 0-N: screen row offset in display. */ /* Cursor's: */ recno_t lno; /* 1-N: file line. */ @@ -73,15 +74,16 @@ struct _scr { recno_t rptlchange; /* Ex/vi: last L_CHANGED lno. */ recno_t rptlines[L_YANKED + 1];/* Ex/vi: lines changed by last op. */ - TEXTH tiq; /* Ex/vi: text input queue. */ + TEXTH tiq[1]; /* Ex/vi: text input queue. */ SCRIPT *script; /* Vi: script mode information .*/ recno_t defscroll; /* Vi: ^D, ^U scroll information. */ /* Display character. */ - CHAR_T cname[MAX_CHARACTER_COLUMNS + 1]; + char cname[MAX_CHARACTER_COLUMNS + 1]; size_t clen; /* Length of display character. */ + ARG_CHAR_T lastc; /* The last display character. */ enum { /* Vi editor mode. */ SM_APPEND = 0, SM_CHANGE, SM_COMMAND, SM_INSERT, @@ -89,7 +91,10 @@ struct _scr { void *ex_private; /* Ex private area. */ void *vi_private; /* Vi private area. */ - void *perl_private; /* Perl private area. */ + void *cl_private; /* Curses private area. */ + + CONV conv; /* Conversion functions. */ + CONVWIN cw; /* Conversion buffer. */ /* PARTIALLY OR COMPLETELY COPIED FROM PREVIOUS SCREEN. */ char *alt_name; /* Ex/vi: alternate file name. */ @@ -103,8 +108,10 @@ struct _scr { #define RE_C_SUBST 0x0008 /* Compile substitute replacement. */ #define RE_C_TAG 0x0010 /* Compile ctag pattern. */ -#define RE_WSTART "[[:<:]]" /* Ex/vi: not-in-word search pattern. */ -#define RE_WSTOP "[[:>:]]" +#define RE_WSTART L("[[:<:]]") /* Ex/vi: not-in-word search pattern. */ +#define RE_WSTOP L("[[:>:]]") +#define RE_WSTART_LEN (SIZE(RE_WSTART) - 1) +#define RE_WSTOP_LEN (SIZE(RE_WSTOP) - 1) /* Ex/vi: flags to search routines. */ #define SEARCH_CSCOPE 0x0001 /* Search for a cscope pattern. */ #define SEARCH_EOL 0x0002 /* Offset past EOL is okay. */ @@ -119,12 +126,12 @@ struct _scr { /* Ex/vi: RE information. */ dir_t searchdir; /* Last file search direction. */ regex_t re_c; /* Search RE: compiled form. */ - char *re; /* Search RE: uncompiled form. */ + CHAR_T *re; /* Search RE: uncompiled form. */ size_t re_len; /* Search RE: uncompiled length. */ regex_t subre_c; /* Substitute RE: compiled form. */ - char *subre; /* Substitute RE: uncompiled form. */ + CHAR_T *subre; /* Substitute RE: uncompiled form. */ size_t subre_len; /* Substitute RE: uncompiled length). */ - char *repl; /* Substitute replacement. */ + CHAR_T *repl; /* Substitute replacement. */ size_t repl_len; /* Substitute replacement length.*/ size_t *newl; /* Newline offset array. */ size_t newl_len; /* Newline array size. */ @@ -199,5 +206,6 @@ struct _scr { #define SC_STATUS_CNT 0x04000000 /* Welcome message plus file count. */ #define SC_TINPUT 0x08000000 /* Doing text input. */ #define SC_TINPUT_INFO 0x10000000 /* Doing text input on info line. */ +#define SC_CONV_ERROR 0x20000000 /* Met with a conversion error. */ u_int32_t flags; }; diff --git a/common/search.c b/common/search.c index 3fd2719778fa..22f020315070 100644 --- a/common/search.c +++ b/common/search.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)search.c 10.25 (Berkeley) 6/30/96"; +static const char sccsid[] = "$Id: search.c,v 10.26 2011/07/04 20:16:26 zy Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -30,23 +31,24 @@ static const char sccsid[] = "@(#)search.c 10.25 (Berkeley) 6/30/96"; typedef enum { S_EMPTY, S_EOF, S_NOPREV, S_NOTFOUND, S_SOF, S_WRAP } smsg_t; static void search_msg __P((SCR *, smsg_t)); -static int search_init __P((SCR *, dir_t, char *, size_t, char **, u_int)); +static int search_init __P((SCR *, dir_t, CHAR_T *, size_t, CHAR_T **, u_int)); /* * search_init -- * Set up a search. */ static int -search_init(sp, dir, ptrn, plen, epp, flags) - SCR *sp; - dir_t dir; - char *ptrn, **epp; - size_t plen; - u_int flags; +search_init( + SCR *sp, + dir_t dir, + CHAR_T *ptrn, + size_t plen, + CHAR_T **epp, + u_int flags) { recno_t lno; int delim; - char *p, *t; + CHAR_T *p, *t; /* If the file is empty, it's a fast search. */ if (sp->lno <= 1) { @@ -141,22 +143,24 @@ prev: if (sp->re == NULL) { * Do a forward search. * * PUBLIC: int f_search __P((SCR *, - * PUBLIC: MARK *, MARK *, char *, size_t, char **, u_int)); + * PUBLIC: MARK *, MARK *, CHAR_T *, size_t, CHAR_T **, u_int)); */ int -f_search(sp, fm, rm, ptrn, plen, eptrn, flags) - SCR *sp; - MARK *fm, *rm; - char *ptrn, **eptrn; - size_t plen; - u_int flags; +f_search( + SCR *sp, + MARK *fm, + MARK *rm, + CHAR_T *ptrn, + size_t plen, + CHAR_T **eptrn, + u_int flags) { busy_t btype; recno_t lno; regmatch_t match[1]; size_t coff, len; int cnt, eval, rval, wrapped; - char *l; + CHAR_T *l; if (search_init(sp, FORWARD, ptrn, plen, eptrn, flags)) return (1); @@ -210,7 +214,7 @@ f_search(sp, fm, rm, ptrn, plen, eptrn, flags) } cnt = INTERRUPT_CHECK; } - if (wrapped && lno > fm->lno || db_get(sp, lno, 0, &l, &len)) { + if ((wrapped && lno > fm->lno) || db_get(sp, lno, 0, &l, &len)) { if (wrapped) { if (LF_ISSET(SEARCH_MSG)) search_msg(sp, S_NOTFOUND); @@ -285,22 +289,24 @@ f_search(sp, fm, rm, ptrn, plen, eptrn, flags) * Do a backward search. * * PUBLIC: int b_search __P((SCR *, - * PUBLIC: MARK *, MARK *, char *, size_t, char **, u_int)); + * PUBLIC: MARK *, MARK *, CHAR_T *, size_t, CHAR_T **, u_int)); */ int -b_search(sp, fm, rm, ptrn, plen, eptrn, flags) - SCR *sp; - MARK *fm, *rm; - char *ptrn, **eptrn; - size_t plen; - u_int flags; +b_search( + SCR *sp, + MARK *fm, + MARK *rm, + CHAR_T *ptrn, + size_t plen, + CHAR_T **eptrn, + u_int flags) { busy_t btype; recno_t lno; regmatch_t match[1]; size_t coff, last, len; int cnt, eval, rval, wrapped; - char *l; + CHAR_T *l; if (search_init(sp, BACKWARD, ptrn, plen, eptrn, flags)) return (1); @@ -342,7 +348,7 @@ b_search(sp, fm, rm, ptrn, plen, eptrn, flags) } cnt = INTERRUPT_CHECK; } - if (wrapped && lno < fm->lno || lno == 0) { + if ((wrapped && lno < fm->lno) || lno == 0) { if (wrapped) { if (LF_ISSET(SEARCH_MSG)) search_msg(sp, S_NOTFOUND); @@ -447,9 +453,9 @@ err: if (LF_ISSET(SEARCH_MSG)) * Display one of the search messages. */ static void -search_msg(sp, msg) - SCR *sp; - smsg_t msg; +search_msg( + SCR *sp, + smsg_t msg) { switch (msg) { case S_EMPTY: @@ -484,9 +490,9 @@ search_msg(sp, msg) * PUBLIC: void search_busy __P((SCR *, busy_t)); */ void -search_busy(sp, btype) - SCR *sp; - busy_t btype; +search_busy( + SCR *sp, + busy_t btype) { sp->gp->scr_busy(sp, "078|Searching...", btype); } diff --git a/common/seq.c b/common/seq.c index e2be879ab686..45c6c1111083 100644 --- a/common/seq.c +++ b/common/seq.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)seq.c 10.10 (Berkeley) 3/30/96"; +static const char sccsid[] = "$Id: seq.c,v 10.18 2011/12/11 23:13:00 zy Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -34,12 +35,16 @@ static const char sccsid[] = "@(#)seq.c 10.10 (Berkeley) 3/30/96"; * PUBLIC: size_t, CHAR_T *, size_t, CHAR_T *, size_t, seq_t, int)); */ int -seq_set(sp, name, nlen, input, ilen, output, olen, stype, flags) - SCR *sp; - CHAR_T *name, *input, *output; - size_t nlen, ilen, olen; - seq_t stype; - int flags; +seq_set( + SCR *sp, + CHAR_T *name, + size_t nlen, + CHAR_T *input, + size_t ilen, + CHAR_T *output, + size_t olen, + seq_t stype, + int flags) { CHAR_T *p; SEQ *lastqp, *qp; @@ -59,7 +64,7 @@ seq_set(sp, name, nlen, input, ilen, output, olen, stype, flags) if (output == NULL || olen == 0) { p = NULL; olen = 0; - } else if ((p = v_strdup(sp, output, olen)) == NULL) { + } else if ((p = v_wstrdup(sp, output, olen)) == NULL) { sv_errno = errno; goto mem1; } @@ -80,14 +85,14 @@ seq_set(sp, name, nlen, input, ilen, output, olen, stype, flags) /* Name. */ if (name == NULL || nlen == 0) qp->name = NULL; - else if ((qp->name = v_strdup(sp, name, nlen)) == NULL) { + else if ((qp->name = v_wstrdup(sp, name, nlen)) == NULL) { sv_errno = errno; goto mem2; } qp->nlen = nlen; /* Input. */ - if ((qp->input = v_strdup(sp, input, ilen)) == NULL) { + if ((qp->input = v_wstrdup(sp, input, ilen)) == NULL) { sv_errno = errno; goto mem3; } @@ -97,7 +102,7 @@ seq_set(sp, name, nlen, input, ilen, output, olen, stype, flags) if (output == NULL) { qp->output = NULL; olen = 0; - } else if ((qp->output = v_strdup(sp, output, olen)) == NULL) { + } else if ((qp->output = v_wstrdup(sp, output, olen)) == NULL) { sv_errno = errno; free(qp->input); mem3: if (qp->name != NULL) @@ -115,13 +120,13 @@ mem1: errno = sv_errno; /* Link into the chain. */ if (lastqp == NULL) { - LIST_INSERT_HEAD(&sp->gp->seqq, qp, q); + SLIST_INSERT_HEAD(sp->gp->seqq, qp, q); } else { - LIST_INSERT_AFTER(lastqp, qp, q); + SLIST_INSERT_AFTER(lastqp, qp, q); } /* Set the fast lookup bit. */ - if (qp->input[0] < MAX_BIT_SEQ) + if ((qp->input[0] & ~MAX_BIT_SEQ) == 0) bit_set(sp->gp->seqb, qp->input[0]); return (0); @@ -134,33 +139,48 @@ mem1: errno = sv_errno; * PUBLIC: int seq_delete __P((SCR *, CHAR_T *, size_t, seq_t)); */ int -seq_delete(sp, input, ilen, stype) - SCR *sp; - CHAR_T *input; - size_t ilen; - seq_t stype; +seq_delete( + SCR *sp, + CHAR_T *input, + size_t ilen, + seq_t stype) { - SEQ *qp; + SEQ *qp, *pre_qp = NULL; + int diff; - if ((qp = seq_find(sp, NULL, NULL, input, ilen, stype, NULL)) == NULL) - return (1); - return (seq_mdel(qp)); + SLIST_FOREACH(qp, sp->gp->seqq, q) { + if (qp->stype == stype && qp->ilen == ilen) { + diff = MEMCMP(qp->input, input, ilen); + if (!diff) { + if (F_ISSET(qp, SEQ_FUNCMAP)) + break; + if (qp == SLIST_FIRST(sp->gp->seqq)) + SLIST_REMOVE_HEAD(sp->gp->seqq, q); + else + SLIST_REMOVE_AFTER(pre_qp, q); + return (seq_free(qp)); + } + if (diff > 0) + break; + } + pre_qp = qp; + } + return (1); } /* - * seq_mdel -- - * Delete a map entry, without lookup. + * seq_free -- + * Free a map entry. * - * PUBLIC: int seq_mdel __P((SEQ *)); + * PUBLIC: int seq_free __P((SEQ *)); */ int -seq_mdel(qp) - SEQ *qp; +seq_free(SEQ *qp) { - LIST_REMOVE(qp, q); if (qp->name != NULL) free(qp->name); - free(qp->input); + if (qp->input != NULL) + free(qp->input); if (qp->output != NULL) free(qp->output); free(qp); @@ -176,16 +196,16 @@ seq_mdel(qp) * PUBLIC: __P((SCR *, SEQ **, EVENT *, CHAR_T *, size_t, seq_t, int *)); */ SEQ * -seq_find(sp, lastqp, e_input, c_input, ilen, stype, ispartialp) - SCR *sp; - SEQ **lastqp; - EVENT *e_input; - CHAR_T *c_input; - size_t ilen; - seq_t stype; - int *ispartialp; +seq_find( + SCR *sp, + SEQ **lastqp, + EVENT *e_input, + CHAR_T *c_input, + size_t ilen, + seq_t stype, + int *ispartialp) { - SEQ *lqp, *qp; + SEQ *lqp = NULL, *qp; int diff; /* @@ -200,8 +220,8 @@ seq_find(sp, lastqp, e_input, c_input, ilen, stype, ispartialp) */ if (ispartialp != NULL) *ispartialp = 0; - for (lqp = NULL, qp = sp->gp->seqq.lh_first; - qp != NULL; lqp = qp, qp = qp->q.le_next) { + for (qp = SLIST_FIRST(sp->gp->seqq); qp != NULL; + lqp = qp, qp = SLIST_NEXT(qp, q)) { /* * Fast checks on the first character and type, and then * a real comparison. @@ -212,7 +232,7 @@ seq_find(sp, lastqp, e_input, c_input, ilen, stype, ispartialp) if (qp->input[0] < c_input[0] || qp->stype != stype || F_ISSET(qp, SEQ_FUNCMAP)) continue; - diff = memcmp(qp->input, c_input, MIN(qp->ilen, ilen)); + diff = MEMCMP(qp->input, c_input, MIN(qp->ilen, ilen)); } else { if (qp->input[0] > e_input->e_c) break; @@ -261,20 +281,13 @@ seq_find(sp, lastqp, e_input, c_input, ilen, stype, ispartialp) * PUBLIC: void seq_close __P((GS *)); */ void -seq_close(gp) - GS *gp; +seq_close(GS *gp) { SEQ *qp; - while ((qp = gp->seqq.lh_first) != NULL) { - if (qp->name != NULL) - free(qp->name); - if (qp->input != NULL) - free(qp->input); - if (qp->output != NULL) - free(qp->output); - LIST_REMOVE(qp, q); - free(qp); + while ((qp = SLIST_FIRST(gp->seqq)) != NULL) { + SLIST_REMOVE_HEAD(gp->seqq, q); + (void)seq_free(qp); } } @@ -285,10 +298,10 @@ seq_close(gp) * PUBLIC: int seq_dump __P((SCR *, seq_t, int)); */ int -seq_dump(sp, stype, isname) - SCR *sp; - seq_t stype; - int isname; +seq_dump( + SCR *sp, + seq_t stype, + int isname) { CHAR_T *p; GS *gp; @@ -297,7 +310,7 @@ seq_dump(sp, stype, isname) cnt = 0; gp = sp->gp; - for (qp = gp->seqq.lh_first; qp != NULL; qp = qp->q.le_next) { + SLIST_FOREACH(qp, sp->gp->seqq, q) { if (stype != qp->stype || F_ISSET(qp, SEQ_FUNCMAP)) continue; ++cnt; @@ -333,11 +346,11 @@ seq_dump(sp, stype, isname) * PUBLIC: int seq_save __P((SCR *, FILE *, char *, seq_t)); */ int -seq_save(sp, fp, prefix, stype) - SCR *sp; - FILE *fp; - char *prefix; - seq_t stype; +seq_save( + SCR *sp, + FILE *fp, + char *prefix, + seq_t stype) { CHAR_T *p; SEQ *qp; @@ -345,7 +358,7 @@ seq_save(sp, fp, prefix, stype) int ch; /* Write a sequence command for all keys the user defined. */ - for (qp = sp->gp->seqq.lh_first; qp != NULL; qp = qp->q.le_next) { + SLIST_FOREACH(qp, sp->gp->seqq, q) { if (stype != qp->stype || !F_ISSET(qp, SEQ_USERDEF)) continue; if (prefix) @@ -353,7 +366,7 @@ seq_save(sp, fp, prefix, stype) for (p = qp->input, olen = qp->ilen; olen > 0; --olen) { ch = *p++; if (ch == CH_LITERAL || ch == '|' || - isblank(ch) || KEY_VAL(sp, ch) == K_NL) + cmdskip(ch) || KEY_VAL(sp, ch) == K_NL) (void)putc(CH_LITERAL, fp); (void)putc(ch, fp); } @@ -379,10 +392,10 @@ seq_save(sp, fp, prefix, stype) * PUBLIC: int e_memcmp __P((CHAR_T *, EVENT *, size_t)); */ int -e_memcmp(p1, ep, n) - CHAR_T *p1; - EVENT *ep; - size_t n; +e_memcmp( + CHAR_T *p1, + EVENT *ep, + size_t n) { if (n != 0) { do { diff --git a/common/seq.h b/common/seq.h index 984bb6c0bd18..2c5ae576e3ee 100644 --- a/common/seq.h +++ b/common/seq.h @@ -6,13 +6,13 @@ * * See the LICENSE file for redistribution information. * - * @(#)seq.h 10.3 (Berkeley) 3/6/96 + * $Id: seq.h,v 10.4 2011/12/11 21:43:39 zy Exp $ */ /* * Map and abbreviation structures. * - * The map structure is doubly linked list, sorted by input string and by + * The map structure is singly linked list, sorted by input string and by * input length within the string. (The latter is necessary so that short * matches will happen before long matches when the list is searched.) * Additionally, there is a bitmap which has bits set if there are entries @@ -27,7 +27,7 @@ * things, though, so it's probably not a big deal. */ struct _seq { - LIST_ENTRY(_seq) q; /* Linked list of all sequences. */ + SLIST_ENTRY(_seq) q; /* Linked list of all sequences. */ seq_t stype; /* Sequence type. */ CHAR_T *name; /* Sequence name (if any). */ size_t nlen; /* Name length. */ diff --git a/common/util.c b/common/util.c index 5a4422a2c422..43fa9d1e9f20 100644 --- a/common/util.c +++ b/common/util.c @@ -10,18 +10,27 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)util.c 10.11 (Berkeley) 9/15/96"; +static const char sccsid[] = "$Id: util.c,v 10.30 2013/03/19 10:00:27 yamt Exp $"; #endif /* not lint */ #include #include +#ifdef __APPLE__ +#include +#include +#include +#endif + #include +#include #include #include +#include #include #include #include +#include #include #include "common.h" @@ -33,10 +42,11 @@ static const char sccsid[] = "@(#)util.c 10.11 (Berkeley) 9/15/96"; * PUBLIC: void *binc __P((SCR *, void *, size_t *, size_t)); */ void * -binc(sp, bp, bsizep, min) - SCR *sp; /* sp MAY BE NULL!!! */ - void *bp; - size_t *bsizep, min; +binc( + SCR *sp, /* sp MAY BE NULL!!! */ + void *bp, + size_t *bsizep, + size_t min) { size_t csize; @@ -44,14 +54,10 @@ binc(sp, bp, bsizep, min) if (min && *bsizep >= min) return (bp); - csize = *bsizep + MAX(min, 256); + csize = p2roundup(MAX(min, 256)); REALLOC(sp, bp, void *, csize); if (bp == NULL) { - /* - * Theoretically, realloc is supposed to leave any already - * held memory alone if it can't get more. Don't trust it. - */ *bsizep = 0; return (NULL); } @@ -73,12 +79,12 @@ binc(sp, bp, bsizep, min) * PUBLIC: int nonblank __P((SCR *, recno_t, size_t *)); */ int -nonblank(sp, lno, cnop) - SCR *sp; - recno_t lno; - size_t *cnop; +nonblank( + SCR *sp, + recno_t lno, + size_t *cnop) { - char *p; + CHAR_T *p; size_t cnt, len, off; int isempty; @@ -95,7 +101,7 @@ nonblank(sp, lno, cnop) return (0); for (cnt = off, p = &p[off], - len -= off; len && isblank(*p); ++cnt, ++p, --len); + len -= off; len && ISBLANK(*p); ++cnt, ++p, --len); /* Set the return. */ *cnop = len ? cnt : cnt - 1; @@ -109,8 +115,7 @@ nonblank(sp, lno, cnop) * PUBLIC: char *tail __P((char *)); */ char * -tail(path) - char *path; +tail(char *path) { char *p; @@ -119,24 +124,162 @@ tail(path) return (p + 1); } +/* + * join -- + * Join two paths; need free. + * + * PUBLIC: char *join __P((char *, char *)); + */ +char * +join( + char *path1, + char *path2) +{ + char *p; + + if (path1[0] == '\0' || path2[0] == '/') + return strdup(path2); + (void)asprintf(&p, path1[strlen(path1)-1] == '/' ? + "%s%s" : "%s/%s", path1, path2); + return p; +} + +/* + * expanduser -- + * Return a "~" or "~user" expanded path; need free. + * + * PUBLIC: char *expanduser __P((char *)); + */ +char * +expanduser(char *str) +{ + struct passwd *pwd; + char *p, *t, *u, *h; + + /* + * This function always expands the content between the + * leading '~' and the first '/' or '\0' from the input. + * Return NULL whenever we fail to do so. + */ + if (*str != '~') + return (NULL); + p = str + 1; + for (t = p; *t != '/' && *t != '\0'; ++t) + continue; + if (t == p) { + /* ~ */ + if (issetugid() != 0 || + (h = getenv("HOME")) == NULL) { + if (((h = getlogin()) != NULL && + (pwd = getpwnam(h)) != NULL) || + (pwd = getpwuid(getuid())) != NULL) + h = pwd->pw_dir; + else + return (NULL); + } + } else { + /* ~user */ + if ((u = strndup(p, t - p)) == NULL) + return (NULL); + if ((pwd = getpwnam(u)) == NULL) { + free(u); + return (NULL); + } else + h = pwd->pw_dir; + free(u); + } + + for (; *t == '/' && *t != '\0'; ++t) + continue; + return (join(h, t)); +} + +/* + * quote -- + * Return a escaped string for /bin/sh; need free. + * + * PUBLIC: char *quote __P((char *)); + */ +char * +quote(char *str) +{ + char *p, *t; + size_t i = 0, n = 0; + int unsafe = 0; + + for (p = str; *p != '\0'; p++, i++) { + if (*p == '\'') + n++; + if (unsafe) + continue; + if (isascii(*p)) { + if (isalnum(*p)) + continue; + switch (*p) { + case '%': case '+': case ',': case '-': case '.': + case '/': case ':': case '=': case '@': case '_': + continue; + } + } + unsafe = 1; + } + if (!unsafe) + t = strdup(str); +#define SQT "'\\''" + else if ((p = t = malloc(i + n * (sizeof(SQT) - 2) + 3)) != NULL) { + *p++ = '\''; + for (; *str != '\0'; str++) { + if (*str == '\'') { + (void)memcpy(p, SQT, sizeof(SQT) - 1); + p += sizeof(SQT) - 1; + } else + *p++ = *str; + } + *p++ = '\''; + *p = '\0'; + } + return t; +} + /* * v_strdup -- + * Strdup for 8-bit character strings with an associated length. + * + * PUBLIC: char *v_strdup __P((SCR *, const char *, size_t)); + */ +char * +v_strdup( + SCR *sp, + const char *str, + size_t len) +{ + char *copy; + + MALLOC(sp, copy, char *, len + 1); + if (copy == NULL) + return (NULL); + memcpy(copy, str, len); + copy[len] = '\0'; + return (copy); +} + +/* + * v_wstrdup -- * Strdup for wide character strings with an associated length. * - * PUBLIC: CHAR_T *v_strdup __P((SCR *, const CHAR_T *, size_t)); + * PUBLIC: CHAR_T *v_wstrdup __P((SCR *, const CHAR_T *, size_t)); */ CHAR_T * -v_strdup(sp, str, len) - SCR *sp; - const CHAR_T *str; - size_t len; +v_wstrdup(SCR *sp, + const CHAR_T *str, + size_t len) { CHAR_T *copy; - MALLOC(sp, copy, CHAR_T *, len + 1); + MALLOC(sp, copy, CHAR_T *, (len + 1) * sizeof(CHAR_T)); if (copy == NULL) return (NULL); - memcpy(copy, str, len * sizeof(CHAR_T)); + MEMCPY(copy, str, len); copy[len] = '\0'; return (copy); } @@ -145,17 +288,17 @@ v_strdup(sp, str, len) * nget_uslong -- * Get an unsigned long, checking for overflow. * - * PUBLIC: enum nresult nget_uslong __P((u_long *, const char *, char **, int)); + * PUBLIC: enum nresult nget_uslong __P((u_long *, const CHAR_T *, CHAR_T **, int)); */ enum nresult -nget_uslong(valp, p, endp, base) - u_long *valp; - const char *p; - char **endp; - int base; +nget_uslong( + u_long *valp, + const CHAR_T *p, + CHAR_T **endp, + int base) { errno = 0; - *valp = strtoul(p, endp, base); + *valp = STRTOUL(p, endp, base); if (errno == 0) return (NUM_OK); if (errno == ERANGE && *valp == ULONG_MAX) @@ -167,17 +310,17 @@ nget_uslong(valp, p, endp, base) * nget_slong -- * Convert a signed long, checking for overflow and underflow. * - * PUBLIC: enum nresult nget_slong __P((long *, const char *, char **, int)); + * PUBLIC: enum nresult nget_slong __P((long *, const CHAR_T *, CHAR_T **, int)); */ enum nresult -nget_slong(valp, p, endp, base) - long *valp; - const char *p; - char **endp; - int base; +nget_slong( + long *valp, + const CHAR_T *p, + CHAR_T **endp, + int base) { errno = 0; - *valp = strtol(p, endp, base); + *valp = STRTOL(p, endp, base); if (errno == 0) return (NUM_OK); if (errno == ERANGE) { @@ -189,12 +332,70 @@ nget_slong(valp, p, endp, base) return (NUM_ERR); } -#ifdef DEBUG -#ifdef __STDC__ -#include +/* + * timepoint_steady -- + * Get a timestamp from a monotonic clock. + * + * PUBLIC: void timepoint_steady __P((struct timespec *)); + */ +void +timepoint_steady( + struct timespec *ts) +{ +#ifdef __APPLE__ + static mach_timebase_info_data_t base = { 0 }; + uint64_t val; + uint64_t ns; + + if (base.denom == 0) + (void)mach_timebase_info(&base); + + val = mach_absolute_time(); + ns = val * base.numer / base.denom; + ts->tv_sec = ns / 1000000000; + ts->tv_nsec = ns % 1000000000; #else -#include +#ifdef CLOCK_MONOTONIC_FAST + (void)clock_gettime(CLOCK_MONOTONIC_FAST, ts); +#else + (void)clock_gettime(CLOCK_MONOTONIC, ts); #endif +#endif +} + +/* + * timepoint_system -- + * Get the current calendar time. + * + * PUBLIC: void timepoint_system __P((struct timespec *)); + */ +void +timepoint_system( + struct timespec *ts) +{ +#ifdef __APPLE__ + clock_serv_t clk; + mach_timespec_t mts; + kern_return_t kr; + + kr = host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &clk); + if (kr != KERN_SUCCESS) + return; + (void)clock_get_time(clk, &mts); + (void)mach_port_deallocate(mach_task_self(), clk); + ts->tv_sec = mts.tv_sec; + ts->tv_nsec = mts.tv_nsec; +#else +#ifdef CLOCK_REALTIME_FAST + (void)clock_gettime(CLOCK_REALTIME_FAST, ts); +#else + (void)clock_gettime(CLOCK_REALTIME, ts); +#endif +#endif +} + +#ifdef DEBUG +#include /* * TRACE -- @@ -203,25 +404,17 @@ nget_slong(valp, p, endp, base) * PUBLIC: void TRACE __P((SCR *, const char *, ...)); */ void -#ifdef __STDC__ -TRACE(SCR *sp, const char *fmt, ...) -#else -TRACE(sp, fmt, va_alist) - SCR *sp; - char *fmt; - va_dcl -#endif +TRACE( + SCR *sp, + const char *fmt, + ...) { FILE *tfp; va_list ap; if ((tfp = sp->gp->tracefp) == NULL) return; -#ifdef __STDC__ va_start(ap, fmt); -#else - va_start(ap); -#endif (void)vfprintf(tfp, fmt, ap); va_end(ap); diff --git a/common/util.h b/common/util.h index 46edb4aae5a8..e6b2bec94e15 100644 --- a/common/util.h +++ b/common/util.h @@ -6,7 +6,7 @@ * * See the LICENSE file for redistribution information. * - * @(#)util.h 10.5 (Berkeley) 3/16/96 + * $Id: util.h,v 10.7 2013/02/24 21:00:10 zy Exp $ */ /* Macros to init/set/clear/test flags. */ @@ -54,3 +54,40 @@ enum nresult { NUM_ERR, NUM_OK, NUM_OVER, NUM_UNDER }; NUM_OK) #define NADD_USLONG(sp, v1, v2) \ (NPFITS(ULONG_MAX, (v1), (v2)) ? NUM_OK : NUM_OVER) + +/* Macros for min/max. */ +#undef MIN +#undef MAX +#define MIN(_a,_b) ((_a)<(_b)?(_a):(_b)) +#define MAX(_a,_b) ((_a)<(_b)?(_b):(_a)) + +/* Operations on timespecs */ +#undef timespecclear +#undef timespecisset +#undef timespeccmp +#undef timespecadd +#undef timespecsub +#define timespecclear(tvp) ((tvp)->tv_sec = (tvp)->tv_nsec = 0) +#define timespecisset(tvp) ((tvp)->tv_sec || (tvp)->tv_nsec) +#define timespeccmp(tvp, uvp, cmp) \ + (((tvp)->tv_sec == (uvp)->tv_sec) ? \ + ((tvp)->tv_nsec cmp (uvp)->tv_nsec) : \ + ((tvp)->tv_sec cmp (uvp)->tv_sec)) +#define timespecadd(vvp, uvp) \ + do { \ + (vvp)->tv_sec += (uvp)->tv_sec; \ + (vvp)->tv_nsec += (uvp)->tv_nsec; \ + if ((vvp)->tv_nsec >= 1000000000) { \ + (vvp)->tv_sec++; \ + (vvp)->tv_nsec -= 1000000000; \ + } \ + } while (0) +#define timespecsub(vvp, uvp) \ + do { \ + (vvp)->tv_sec -= (uvp)->tv_sec; \ + (vvp)->tv_nsec -= (uvp)->tv_nsec; \ + if ((vvp)->tv_nsec < 0) { \ + (vvp)->tv_sec--; \ + (vvp)->tv_nsec += 1000000000; \ + } \ + } while (0) diff --git a/docs/USD.doc/vi.man/vi.1 b/docs/USD.doc/vi.man/vi.1 index 22aee3e7e952..1292eef3ffa8 100644 --- a/docs/USD.doc/vi.man/vi.1 +++ b/docs/USD.doc/vi.man/vi.1 @@ -2,15 +2,17 @@ .\" The Regents of the University of California. All rights reserved. .\" Copyright (c) 1994, 1995, 1996 .\" Keith Bostic. All rights reserved. +.\" Copyright (c) 2011 +.\" Zhihao Yuan. All rights reserved. .\" .\" This document may not be republished without written permission from .\" Keith Bostic. .\" .\" See the LICENSE file for redistribution information. .\" -.\" @(#)vi.1 8.51 (Berkeley) 10/10/96 +.\" $Id: vi.1,v 8.59 2012/02/12 12:56:37 zy Exp $ .\" -.TH VI 1 "October 10, 1996" +.TH VI 1 "11 February, 2012" .UC .SH NAME ex, vi, view \- text editors @@ -150,7 +152,7 @@ Batch mode is useful when running scripts. Prompts, informative messages and other user oriented message are turned off, -and no startup files or environmental variables are read. +and no startup files or environment variables are read. This is the POSIX 1003.2 interface for the historic ``\-'' argument. .I \&Nex/nvi supports both the old and new syntax. @@ -1103,10 +1105,13 @@ Regular expressions are extended (i.e. .IR egrep (1)\-\c style) expressions. .TP -.B "filec [no default]" +.B "filec []" Set the character to perform file path completion on the colon command line. .TP +.B "fileencoding, fe [auto detect]" +Set the encoding of the current file. +.TP .B "flash [on]" Flash the screen instead of beeping the keyboard on error. .TP @@ -1120,6 +1125,9 @@ as long as an upper-case letter does not appear in the search string. .B "ignorecase, ic [off]" Ignore case differences in regular expressions. .TP +.B "inputencoding, ie [locale]" +Set the encoding of your input characters. +.TP .B "keytime [6]" The 10th's of a second .I ex/vi @@ -1151,6 +1159,11 @@ read or written. .B "magic [on]" Treat certain characters specially in regular expressions. .TP +.B "matchchars [[]{}()]" +Character pairs looked for by the +.B % +command. +.TP .B "matchtime [7]" .I \&Vi only. @@ -1291,7 +1304,7 @@ Set the autoindent and shift command indentation width. .B "showmatch, sm [off]" .I \&Vi only. -Note matching ``{'' and ``('' for ``}'' and ``)'' characters. +Note the left matching characters when the right ones are inserted. .TP .B "showmode, smd [off]" .I \&Vi @@ -1372,8 +1385,7 @@ command. Set the window size for the screen. .TP .B "windowname [off]" -Change the icon/window name to the current file name even if it can't -be restored on editor exit. +Change the icon/window name to the current file name. .TP .B "wraplen, wl [0]" .I \&Vi @@ -1406,14 +1418,14 @@ Set searches to wrap around the end or beginning of the file. .TP .B "writeany, wa [off]" Turn off file-overwriting checks. -.SH ENVIRONMENTAL VARIABLES +.SH ENVIRONMENT VARIABLES .TP .I COLUMNS The number of columns on the screen. This value overrides any system or terminal specific values. If the .I COLUMNS -environmental variable is not set when +environment variable is not set when .I ex/vi runs, or the .B columns @@ -1442,7 +1454,7 @@ The number of rows on the screen. This value overrides any system or terminal specific values. If the .I LINES -environmental variable is not set when +environment variable is not set when .I ex/vi runs, or the .B lines @@ -1465,7 +1477,7 @@ The user's terminal type. The default is the type ``unknown''. If the .I TERM -environmental variable is not set when +environment variable is not set when .I ex/vi runs, or the .B term @@ -1542,58 +1554,12 @@ $HOME/.exrc 2nd choice for local directory startup file. .SH SEE ALSO .IR ctags (1), -.IR more (3), +.IR iconv (1), +.IR more (1), .IR curses (3), .IR dbopen (3) .sp -The ``Vi Quick Reference'' card. -.sp -``An Introduction to Display Editing with Vi'', found in the -``UNIX User's Manual Supplementary Documents'' -section of both the 4.3BSD and 4.4BSD manual sets. -This document is the closest thing available to an introduction to the -.I \&vi -screen editor. -.sp -``Ex Reference Manual (Version 3.7)'', -found in the -``UNIX User's Manual Supplementary Documents'' -section of both the 4.3BSD and 4.4BSD manual sets. -This document is the final reference for the -.I \&ex -editor, as distributed in most historic 4BSD and System V systems. -.sp -``Edit: A tutorial'', -found in the -``UNIX User's Manual Supplementary Documents'' -section of the 4.3BSD manual set. -This document is an introduction to a simple version of the -.I \&ex -screen editor. -.sp -``Ex/Vi Reference Manual'', -found in the -``UNIX User's Manual Supplementary Documents'' -section of the 4.4BSD manual set. -This document is the final reference for the -.I \&nex/nvi -text editors, as distributed in 4.4BSD and 4.4BSD-Lite. -.PP -.I Roff -source for all of these documents is distributed with -.I nex/nvi -in the -.I nvi/USD.doc -directory of the -.I nex/nvi -source code. -.sp -The files ``autowrite'', ``input'', ``quoting'' and ``structures'' -found in the -.I nvi/docs/internals -directory of the -.I nex/nvi -source code. +``UNIX User's Manual Supplementary Documents: Text Editing''. .SH HISTORY The .I nex/nvi diff --git a/docs/USD.doc/vi.ref/vi.ref b/docs/USD.doc/vi.ref/vi.ref index a880c1659e11..12a483f1edb1 100644 --- a/docs/USD.doc/vi.ref/vi.ref +++ b/docs/USD.doc/vi.ref/vi.ref @@ -10,6 +10,7 @@ .\" .\" @(#)vi.ref 8.88 (Berkeley) 10/19/96 .\" +.\" $FreeBSD$ .\" .so ref.so .tp @@ -27,7 +28,6 @@ Department of Electrical Engineering and Computer Science University of California, Berkeley Berkeley, California 94720 .sp 1 -\*(td .)l .sp 3 .(l C diff --git a/docs/help b/docs/help index 81df84aa1353..a7b5d748e043 100644 --- a/docs/help +++ b/docs/help @@ -129,7 +129,7 @@ EX COMMANDS: ^D: scroll lines !: filter lines through commands or run commands #: display numbered lines - &: repeat the last subsitution + &: repeat the last substitution *: execute a buffer <: shift lines left =: display line number diff --git a/ex/ex.c b/ex/ex.c index f92d8f7c4f9a..609f961bbe46 100644 --- a/ex/ex.c +++ b/ex/ex.c @@ -10,13 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex.c 10.57 (Berkeley) 10/10/96"; +static const char sccsid[] = "$Id: ex.c,v 10.80 2012/10/03 16:24:40 zy Exp $"; #endif /* not lint */ #include #include #include -#include #include #include @@ -35,11 +34,11 @@ static const char sccsid[] = "@(#)ex.c 10.57 (Berkeley) 10/10/96"; static void ex_comlog __P((SCR *, EXCMD *)); #endif static EXCMDLIST const * - ex_comm_search __P((char *, size_t)); + ex_comm_search __P((CHAR_T *, size_t)); static int ex_discard __P((SCR *)); static int ex_line __P((SCR *, EXCMD *, MARK *, int *, int *)); static int ex_load __P((SCR *)); -static void ex_unknown __P((SCR *, char *, size_t)); +static void ex_unknown __P((SCR *, CHAR_T *, size_t)); /* * ex -- @@ -48,8 +47,7 @@ static void ex_unknown __P((SCR *, char *, size_t)); * PUBLIC: int ex __P((SCR **)); */ int -ex(spp) - SCR **spp; +ex(SCR **spp) { EX_PRIVATE *exp; GS *gp; @@ -67,9 +65,9 @@ ex(spp) return (1); /* Flush any saved messages. */ - while ((mp = gp->msgq.lh_first) != NULL) { + while ((mp = SLIST_FIRST(gp->msgq)) != NULL) { gp->scr_msg(sp, mp->mtype, mp->buf, mp->len); - LIST_REMOVE(mp, q); + SLIST_REMOVE_HEAD(gp->msgq, q); free(mp->buf); free(mp); } @@ -105,7 +103,7 @@ ex(spp) /* Clear any current interrupts, and get a command. */ CLR_INTERRUPT(sp); - if (ex_txt(sp, &sp->tiq, ':', flags)) + if (ex_txt(sp, sp->tiq, ':', flags)) return (1); if (INTERRUPTED(sp)) { (void)ex_puts(sp, "\n"); @@ -120,9 +118,9 @@ ex(spp) * If the user entered a single carriage return, send * ex_cmd() a separator -- it discards single newlines. */ - tp = sp->tiq.cqh_first; + tp = TAILQ_FIRST(sp->tiq); if (tp->len == 0) { - gp->excmd.cp = " "; /* __TK__ why not |? */ + gp->excmd.cp = L(" "); /* __TK__ why not |? */ gp->excmd.clen = 1; } else { gp->excmd.cp = tp->lb; @@ -192,8 +190,7 @@ ex(spp) * PUBLIC: int ex_cmd __P((SCR *)); */ int -ex_cmd(sp) - SCR *sp; +ex_cmd(SCR *sp) { enum nresult nret; EX_PRIVATE *exp; @@ -205,9 +202,12 @@ ex_cmd(sp) u_int32_t flags; long ltmp; int at_found, gv_found; - int ch, cnt, delim, isaddr, namelen; + int cnt, delim, isaddr, namelen; int newscreen, notempty, tmp, vi_address; - char *arg1, *p, *s, *t; + CHAR_T *arg1, *s, *p, *t; + CHAR_T ch = '\0'; + CHAR_T *n; + char *np; gp = sp->gp; exp = EXP(sp); @@ -217,7 +217,7 @@ ex_cmd(sp) * This means that *everything* must be resolved when we leave * this function for any reason. */ -loop: ecp = gp->ecq.lh_first; +loop: ecp = SLIST_FIRST(gp->ecq); /* If we're reading a command from a file, set up error information. */ if (ecp->if_name != NULL) { @@ -259,7 +259,7 @@ loop: ecp = gp->ecq.lh_first; if ((ch = *ecp->cp) == '\n') { ++gp->if_lno; ++ecp->if_lno; - } else if (isblank(ch)) + } else if (cmdskip(ch)) notempty = 1; else break; @@ -298,7 +298,7 @@ loop: ecp = gp->ecq.lh_first; /* Skip whitespace. */ for (; ecp->clen > 0; ++ecp->cp, --ecp->clen) { ch = *ecp->cp; - if (!isblank(ch)) + if (!cmdskip(ch)) break; } @@ -321,7 +321,7 @@ loop: ecp = gp->ecq.lh_first; (!notempty || F_ISSET(sp, SC_VI) || F_ISSET(ecp, E_BLIGNORE))) { if (ex_load(sp)) goto rfail; - ecp = gp->ecq.lh_first; + ecp = SLIST_FIRST(gp->ecq); if (ecp->clen == 0) goto rsuccess; goto loop; @@ -353,7 +353,7 @@ loop: ecp = gp->ecq.lh_first; */ for (; ecp->clen > 0; ++ecp->cp, --ecp->clen) { ch = *ecp->cp; - if (!isblank(ch) && ch != ':') + if (!cmdskip(ch) && ch != ':') break; } @@ -377,10 +377,10 @@ loop: ecp = gp->ecq.lh_first; * from vi mode, and displayed lines 2, 3, and 4, so we do a default * command for each separator. */ -#define SINGLE_CHAR_COMMANDS "\004!#&*<=>@~" +#define SINGLE_CHAR_COMMANDS L("\004!#&*<=>@~") newscreen = 0; if (ecp->clen != 0 && ecp->cp[0] != '|' && ecp->cp[0] != '\n') { - if (strchr(SINGLE_CHAR_COMMANDS, *ecp->cp)) { + if (STRCHR(SINGLE_CHAR_COMMANDS, *ecp->cp)) { p = ecp->cp; ++ecp->cp; --ecp->clen; @@ -388,7 +388,7 @@ loop: ecp = gp->ecq.lh_first; } else { for (p = ecp->cp; ecp->clen > 0; --ecp->clen, ++ecp->cp) - if (!isalpha(*ecp->cp)) + if (!isascii(*ecp->cp) || !isalpha(*ecp->cp)) break; if ((namelen = ecp->cp - p) == 0) { msgq(sp, M_ERR, "080|Unknown command name"); @@ -415,7 +415,7 @@ loop: ecp = gp->ecq.lh_first; switch (p[0]) { case 'd': for (s = p, - t = cmds[C_DELETE].name; *s == *t; ++s, ++t); + n = cmds[C_DELETE].name; *s == *n; ++s, ++n); if (s[0] == 'l' || s[0] == 'p' || s[0] == '+' || s[0] == '-' || s[0] == '^' || s[0] == '#') { len = (ecp->cp - p) - (s - p); @@ -510,7 +510,7 @@ skip_srch: if (ecp->cmd == &cmds[C_VISUAL_EX] && F_ISSET(sp, SC_VI)) /* Secure means no shell access. */ if (F_ISSET(ecp->cmd, E_SECURE) && O_ISSET(sp, O_SECURE)) { - ex_emsg(sp, ecp->cmd->name, EXM_SECURE); + ex_wemsg(sp, ecp->cmd->name, EXM_SECURE); goto err; } @@ -574,8 +574,8 @@ skip_srch: if (ecp->cmd == &cmds[C_VISUAL_EX] && F_ISSET(sp, SC_VI)) /* Check for ex mode legality. */ if (F_ISSET(sp, SC_EX) && (F_ISSET(ecp->cmd, E_VIONLY) || newscreen)) { - msgq(sp, M_ERR, - "082|%s: command not available in ex mode", ecp->cmd->name); + msgq_wstr(sp, M_ERR, ecp->cmd->name, + "082|%s: command not available in ex mode"); goto err; } @@ -629,7 +629,8 @@ skip_srch: if (ecp->cmd == &cmds[C_VISUAL_EX] && F_ISSET(sp, SC_VI)) arg1_len = 0; ecp->save_cmd = ecp->cp; if (ecp->cmd == &cmds[C_EDIT] || ecp->cmd == &cmds[C_EX] || - ecp->cmd == &cmds[C_NEXT] || ecp->cmd == &cmds[C_VISUAL_VI]) { + ecp->cmd == &cmds[C_NEXT] || ecp->cmd == &cmds[C_VISUAL_VI] || + ecp->cmd == &cmds[C_VSPLIT]) { /* * Move to the next non-whitespace character. A '!' * immediately following the command is eaten as a @@ -644,7 +645,7 @@ skip_srch: if (ecp->cmd == &cmds[C_VISUAL_EX] && F_ISSET(sp, SC_VI)) ecp->save_cmd = ecp->cp; } for (; ecp->clen > 0; --ecp->clen, ++ecp->cp) - if (!isblank(*ecp->cp)) + if (!cmdskip(*ecp->cp)) break; /* * QUOTING NOTE: @@ -666,7 +667,7 @@ skip_srch: if (ecp->cmd == &cmds[C_VISUAL_EX] && F_ISSET(sp, SC_VI)) ++discard; --ecp->clen; ch = *++ecp->cp; - } else if (isblank(ch)) + } else if (cmdskip(ch)) break; *p++ = ch; } @@ -710,7 +711,7 @@ skip_srch: if (ecp->cmd == &cmds[C_VISUAL_EX] && F_ISSET(sp, SC_VI)) */ for (tmp = 0; ecp->clen > 0; --ecp->clen, ++ecp->cp) { ch = *ecp->cp; - if (isblank(ch)) + if (cmdskip(ch)) tmp = 1; else break; @@ -728,10 +729,11 @@ skip_srch: if (ecp->cmd == &cmds[C_VISUAL_EX] && F_ISSET(sp, SC_VI)) * into something like ":s g", so use the special s command. */ for (; ecp->clen > 0; --ecp->clen, ++ecp->cp) - if (!isblank(ecp->cp[0])) + if (!cmdskip(ecp->cp[0])) break; - if (isalnum(ecp->cp[0]) || ecp->cp[0] == '|') { + if (!isascii(ecp->cp[0]) || + isalnum(ecp->cp[0]) || ecp->cp[0] == '|') { ecp->rcmd = cmds[C_SUBSTITUTE]; ecp->rcmd.fn = ex_subagain; ecp->cmd = &ecp->rcmd; @@ -775,7 +777,7 @@ skip_srch: if (ecp->cmd == &cmds[C_VISUAL_EX] && F_ISSET(sp, SC_VI)) for (p = ecp->cp; ecp->clen > 0; --ecp->clen, ++ecp->cp) { ch = ecp->cp[0]; if (IS_ESCAPE(sp, ecp, ch) && ecp->clen > 1) { - tmp = ecp->cp[1]; + CHAR_T tmp = ecp->cp[1]; if (tmp == '\n' || tmp == '|') { if (tmp == '\n') { ++gp->if_lno; @@ -816,7 +818,10 @@ skip_srch: if (ecp->cmd == &cmds[C_VISUAL_EX] && F_ISSET(sp, SC_VI)) */ if (ecp->cmd == &cmds[C_SET]) for (p = ecp->cp, len = ecp->clen; len > 0; --len, ++p) - if (*p == '\\') + if (IS_ESCAPE(sp, ecp, *p) && len > 1) { + --len; + ++p; + } else if (*p == '\\') *p = CH_LITERAL; /* @@ -935,13 +940,13 @@ two_addr: switch (ecp->addrcnt) { } ecp->flagoff = 0; - for (p = ecp->cmd->syntax; *p != '\0'; ++p) { + for (np = ecp->cmd->syntax; *np != '\0'; ++np) { /* * The force flag is sensitive to leading whitespace, i.e. * "next !" is different from "next!". Handle it before * skipping leading s. */ - if (*p == '!') { + if (*np == '!') { if (ecp->clen > 0 && *ecp->cp == '!') { ++ecp->cp; --ecp->clen; @@ -952,12 +957,12 @@ two_addr: switch (ecp->addrcnt) { /* Skip leading s. */ for (; ecp->clen > 0; --ecp->clen, ++ecp->cp) - if (!isblank(*ecp->cp)) + if (!cmdskip(*ecp->cp)) break; if (ecp->clen == 0) break; - switch (*p) { + switch (*np) { case '1': /* +, -, #, l, p */ /* * !!! @@ -1012,7 +1017,7 @@ end_case1: break; FL_SET(ecp->iflags, E_C_CARAT); break; case '=': - if (*p == '3') { + if (*np == '3') { FL_SET(ecp->iflags, E_C_EQUAL); break; } @@ -1032,7 +1037,7 @@ end_case23: break; */ if ((ecp->cp[0] == '+' || ecp->cp[0] == '-' || ecp->cp[0] == '^' || ecp->cp[0] == '#') && - strchr(p, '1') != NULL) + strchr(np, '1') != NULL) break; /* * !!! @@ -1040,7 +1045,7 @@ end_case23: break; * command "d2" would be a delete into buffer '2', and * not a two-line deletion. */ - if (!isdigit(ecp->cp[0])) { + if (!ISDIGIT(ecp->cp[0])) { ecp->buffer = *ecp->cp; ++ecp->cp; --ecp->clen; @@ -1048,9 +1053,9 @@ end_case23: break; } break; case 'c': /* count [01+a] */ - ++p; + ++np; /* Validate any signed value. */ - if (!isdigit(*ecp->cp) && (*p != '+' || + if (!ISDIGIT(*ecp->cp) && (*np != '+' || (*ecp->cp != '+' && *ecp->cp != '-'))) break; /* If a signed value, set appropriate flags. */ @@ -1063,7 +1068,7 @@ end_case23: break; ex_badaddr(sp, NULL, A_NOTSET, nret); goto err; } - if (ltmp == 0 && *p != '0') { + if (ltmp == 0 && *np != '0') { msgq(sp, M_ERR, "083|Count may not be zero"); goto err; } @@ -1079,7 +1084,7 @@ end_case23: break; * join) do different things with counts than with * line addresses. */ - if (*p == 'a') { + if (*np == 'a') { ecp->addr1 = ecp->addr2; ecp->addr2.lno = ecp->addr1.lno + ltmp - 1; } else @@ -1106,7 +1111,7 @@ end_case23: break; /* Line specifications are always required. */ if (!isaddr) { - msgq_str(sp, M_ERR, ecp->cp, + msgq_wstr(sp, M_ERR, ecp->cp, "084|%s: bad line specification"); goto err; } @@ -1149,7 +1154,7 @@ end_case23: break; ecp, ch) && ecp->clen > 1) { --ecp->clen; *p++ = *++ecp->cp; - } else if (isblank(ch)) { + } else if (cmdskip(ch)) { ++ecp->cp; --ecp->clen; break; @@ -1163,7 +1168,7 @@ end_case23: break; for (; ecp->clen > 0; --ecp->clen, ++ecp->cp) { ch = *ecp->cp; - if (!isblank(ch)) + if (!cmdskip(ch)) break; } if (ecp->clen == 0) @@ -1186,29 +1191,35 @@ end_case23: break; case 'w': /* word */ if (argv_exp3(sp, ecp, ecp->cp, ecp->clen)) goto err; -arg_cnt_chk: if (*++p != 'N') { /* N */ +arg_cnt_chk: if (*++np != 'N') { /* N */ /* * If a number is specified, must either be * 0 or that number, if optional, and that * number, if required. */ - tmp = *p - '0'; - if ((*++p != 'o' || exp->argsoff != 0) && + tmp = *np - '0'; + if ((*++np != 'o' || exp->argsoff != 0) && exp->argsoff != tmp) goto usage; } goto addr_verify; - default: + default: { + size_t nlen; + char *nstr; + + INT2CHAR(sp, ecp->cmd->name, STRLEN(ecp->cmd->name) + 1, + nstr, nlen); msgq(sp, M_ERR, "085|Internal syntax table error (%s: %s)", - ecp->cmd->name, KEY_NAME(sp, *p)); + nstr, KEY_NAME(sp, *np)); + } } } /* Skip trailing whitespace. */ for (; ecp->clen > 0; --ecp->clen) { ch = *ecp->cp++; - if (!isblank(ch)) + if (!cmdskip(ch)) break; } @@ -1216,7 +1227,7 @@ arg_cnt_chk: if (*++p != 'N') { /* N */ * There shouldn't be anything left, and no more required fields, * i.e neither 'l' or 'r' in the syntax string. */ - if (ecp->clen != 0 || strpbrk(p, "lr")) { + if (ecp->clen != 0 || strpbrk(np, "lr")) { usage: msgq(sp, M_ERR, "086|Usage: %s", ecp->cmd->usage); goto err; } @@ -1379,8 +1390,8 @@ usage: msgq(sp, M_ERR, "086|Usage: %s", ecp->cmd->usage); /* Make sure no function left global temporary space locked. */ if (F_ISSET(gp, G_TMP_INUSE)) { F_CLR(gp, G_TMP_INUSE); - msgq(sp, M_ERR, "087|%s: temporary buffer not released", - ecp->cmd->name); + msgq_wstr(sp, M_ERR, ecp->cmd->name, + "087|%s: temporary buffer not released"); } #endif /* @@ -1493,7 +1504,7 @@ usage: msgq(sp, M_ERR, "086|Usage: %s", ecp->cmd->usage); ecp->save_cmd -= arg1_len; ecp->save_cmdlen += arg1_len; - memcpy(ecp->save_cmd, arg1, arg1_len); + MEMCPY(ecp->save_cmd, arg1, arg1_len); /* * Any commands executed from a +cmd are executed starting at @@ -1527,8 +1538,7 @@ usage: msgq(sp, M_ERR, "086|Usage: %s", ecp->cmd->usage); */ if (F_ISSET(sp, SC_EXIT | SC_EXIT_FORCE | SC_FSWITCH | SC_SSWITCH)) { at_found = gv_found = 0; - for (ecp = sp->gp->ecq.lh_first; - ecp != NULL; ecp = ecp->q.le_next) + SLIST_FOREACH(ecp, sp->gp->ecq, q) switch (ecp->agv_flags) { case 0: case AGV_AT_NORANGE: @@ -1580,7 +1590,7 @@ usage: msgq(sp, M_ERR, "086|Usage: %s", ecp->cmd->usage); break; } } - if (ecp->save_cmdlen != 0 || gp->ecq.lh_first != &gp->excmd) { + if (ecp->save_cmdlen != 0 || SLIST_FIRST(gp->ecq) != &gp->excmd) { discard: msgq(sp, M_BERR, "092|Ex command failed: pending commands discarded"); ex_discard(sp); @@ -1609,10 +1619,7 @@ rsuccess: tmp = 0; * PUBLIC: int ex_range __P((SCR *, EXCMD *, int *)); */ int -ex_range(sp, ecp, errp) - SCR *sp; - EXCMD *ecp; - int *errp; +ex_range(SCR *sp, EXCMD *ecp, int *errp) { enum { ADDR_FOUND, ADDR_NEED, ADDR_NONE } addr; GS *gp; @@ -1811,19 +1818,15 @@ ret: if (F_ISSET(ecp, E_VISEARCH)) * it's fairly close. */ static int -ex_line(sp, ecp, mp, isaddrp, errp) - SCR *sp; - EXCMD *ecp; - MARK *mp; - int *isaddrp, *errp; +ex_line(SCR *sp, EXCMD *ecp, MARK *mp, int *isaddrp, int *errp) { enum nresult nret; EX_PRIVATE *exp; GS *gp; long total, val; int isneg; - int (*sf) __P((SCR *, MARK *, MARK *, char *, size_t, char **, u_int)); - char *endp; + int (*sf) __P((SCR *, MARK *, MARK *, CHAR_T *, size_t, CHAR_T **, u_int)); + CHAR_T *endp; gp = sp->gp; exp = EXP(sp); @@ -1832,7 +1835,7 @@ ex_line(sp, ecp, mp, isaddrp, errp) F_CLR(ecp, E_DELTA); /* No addresses permitted until a file has been read in. */ - if (sp->ep == NULL && strchr("$0123456789'\\/?.+-^", *ecp->cp)) { + if (sp->ep == NULL && STRCHR(L("$0123456789'\\/?.+-^"), *ecp->cp)) { ex_badaddr(sp, NULL, A_EMPTY, NUM_OK); *errp = 1; return (0); @@ -1893,7 +1896,7 @@ ex_line(sp, ecp, mp, isaddrp, errp) * difference. C'est la vie. */ if (ecp->clen < 2 || - ecp->cp[1] != '/' && ecp->cp[1] != '?') { + (ecp->cp[1] != '/' && ecp->cp[1] != '?')) { msgq(sp, M_ERR, "096|\\ not followed by / or ?"); *errp = 1; return (0); @@ -1943,7 +1946,7 @@ search: mp->lno = sp->lno; * the '+' could be omitted. (This feature is found in ed * as well.) */ - if (ecp->clen > 1 && isdigit(ecp->cp[1])) + if (ecp->clen > 1 && ISDIGIT(ecp->cp[1])) *ecp->cp = '+'; else { ++ecp->cp; @@ -1954,14 +1957,14 @@ search: mp->lno = sp->lno; /* Skip trailing s. */ for (; ecp->clen > 0 && - isblank(ecp->cp[0]); ++ecp->cp, --ecp->clen); + cmdskip(ecp->cp[0]); ++ecp->cp, --ecp->clen); /* * Evaluate any offset. If no address yet found, the offset * is relative to ".". */ total = 0; - if (ecp->clen != 0 && (isdigit(ecp->cp[0]) || + if (ecp->clen != 0 && (ISDIGIT(ecp->cp[0]) || ecp->cp[0] == '+' || ecp->cp[0] == '-' || ecp->cp[0] == '^')) { if (!*isaddrp) { @@ -1997,14 +2000,14 @@ search: mp->lno = sp->lno; */ F_SET(ecp, E_DELTA); for (;;) { - for (; ecp->clen > 0 && isblank(ecp->cp[0]); + for (; ecp->clen > 0 && cmdskip(ecp->cp[0]); ++ecp->cp, --ecp->clen); - if (ecp->clen == 0 || !isdigit(ecp->cp[0]) && + if (ecp->clen == 0 || (!ISDIGIT(ecp->cp[0]) && ecp->cp[0] != '+' && ecp->cp[0] != '-' && - ecp->cp[0] != '^') + ecp->cp[0] != '^')) break; - if (!isdigit(ecp->cp[0]) && - !isdigit(ecp->cp[1])) { + if (!ISDIGIT(ecp->cp[0]) && + !ISDIGIT(ecp->cp[1])) { total += ecp->cp[0] == '+' ? 1 : -1; --ecp->clen; ++ecp->cp; @@ -2062,8 +2065,7 @@ search: mp->lno = sp->lno; * Load up the next command, which may be an @ buffer or global command. */ static int -ex_load(sp) - SCR *sp; +ex_load(SCR *sp) { GS *gp; EXCMD *ecp; @@ -2076,16 +2078,18 @@ ex_load(sp) * can't be an AGV command, which makes things a bit easier. */ for (gp = sp->gp;;) { + ecp = SLIST_FIRST(gp->ecq); + + /* Discard the allocated source name as requested. */ + if (F_ISSET(ecp, E_NAMEDISCARD)) + free(ecp->if_name); + /* * If we're back to the original structure, leave it around, - * but discard any allocated source name, we've returned to - * the beginning of the command stack. + * since we've returned to the beginning of the command stack. */ - if ((ecp = gp->ecq.lh_first) == &gp->excmd) { - if (F_ISSET(ecp, E_NAMEDISCARD)) { - free(ecp->if_name); - ecp->if_name = NULL; - } + if (ecp == &gp->excmd) { + ecp->if_name = NULL; return (0); } @@ -2105,15 +2109,15 @@ ex_load(sp) */ if (FL_ISSET(ecp->agv_flags, AGV_ALL)) { /* Discard any exhausted ranges. */ - while ((rp = ecp->rq.cqh_first) != (void *)&ecp->rq) + while ((rp = TAILQ_FIRST(ecp->rq)) != NULL) if (rp->start > rp->stop) { - CIRCLEQ_REMOVE(&ecp->rq, rp, q); + TAILQ_REMOVE(ecp->rq, rp, q); free(rp); } else break; /* If there's another range, continue with it. */ - if (rp != (void *)&ecp->rq) + if (rp != NULL) break; /* If it's a global/v command, fix up the last line. */ @@ -2131,7 +2135,7 @@ ex_load(sp) } /* Discard the EXCMD. */ - LIST_REMOVE(ecp, q); + SLIST_REMOVE_HEAD(gp->ecq, q); free(ecp); } @@ -2142,7 +2146,7 @@ ex_load(sp) * so we have play games. */ ecp->cp = ecp->o_cp; - memcpy(ecp->cp, ecp->cp + ecp->o_clen, ecp->o_clen); + MEMCPY(ecp->cp, ecp->cp + ecp->o_clen, ecp->o_clen); ecp->clen = ecp->o_clen; ecp->range_lno = sp->lno = rp->start++; @@ -2156,8 +2160,7 @@ ex_load(sp) * Discard any pending ex commands. */ static int -ex_discard(sp) - SCR *sp; +ex_discard(SCR *sp) { GS *gp; EXCMD *ecp; @@ -2167,18 +2170,26 @@ ex_discard(sp) * We know the first command can't be an AGV command, so we don't * process it specially. We do, however, nail the command itself. */ - for (gp = sp->gp; (ecp = gp->ecq.lh_first) != &gp->excmd;) { + for (gp = sp->gp;;) { + ecp = SLIST_FIRST(gp->ecq); + if (F_ISSET(ecp, E_NAMEDISCARD)) + free(ecp->if_name); + /* Reset the last command without dropping it. */ + if (ecp == &gp->excmd) + break; if (FL_ISSET(ecp->agv_flags, AGV_ALL)) { - while ((rp = ecp->rq.cqh_first) != (void *)&ecp->rq) { - CIRCLEQ_REMOVE(&ecp->rq, rp, q); + while ((rp = TAILQ_FIRST(ecp->rq)) != NULL) { + TAILQ_REMOVE(ecp->rq, rp, q); free(rp); } free(ecp->o_cp); } - LIST_REMOVE(ecp, q); + SLIST_REMOVE_HEAD(gp->ecq, q); free(ecp); } - gp->ecq.lh_first->clen = 0; + + ecp->if_name = NULL; + ecp->clen = 0; return (0); } @@ -2187,19 +2198,16 @@ ex_discard(sp) * Display an unknown command name. */ static void -ex_unknown(sp, cmd, len) - SCR *sp; - char *cmd; - size_t len; +ex_unknown(SCR *sp, CHAR_T *cmd, size_t len) { size_t blen; - char *bp; + CHAR_T *bp; - GET_SPACE_GOTO(sp, bp, blen, len + 1); + GET_SPACE_GOTOW(sp, bp, blen, len + 1); bp[len] = '\0'; - memcpy(bp, cmd, len); - msgq_str(sp, M_ERR, bp, "098|The %s command is unknown"); - FREE_SPACE(sp, bp, blen); + MEMCPY(bp, cmd, len); + msgq_wstr(sp, M_ERR, bp, "098|The %s command is unknown"); + FREE_SPACEW(sp, bp, blen); alloc_err: return; @@ -2211,12 +2219,10 @@ ex_unknown(sp, cmd, len) * [un]abbreviate command, so it can turn off abbreviations. See * the usual ranting in the vi/v_txt_ev.c:txt_abbrev() routine. * - * PUBLIC: int ex_is_abbrev __P((char *, size_t)); + * PUBLIC: int ex_is_abbrev __P((CHAR_T *, size_t)); */ int -ex_is_abbrev(name, len) - char *name; - size_t len; +ex_is_abbrev(CHAR_T *name, size_t len) { EXCMDLIST const *cp; @@ -2230,12 +2236,10 @@ ex_is_abbrev(name, len) * unmap command, so it can turn off input mapping. See the usual * ranting in the vi/v_txt_ev.c:txt_unmap() routine. * - * PUBLIC: int ex_is_unmap __P((char *, size_t)); + * PUBLIC: int ex_is_unmap __P((CHAR_T *, size_t)); */ int -ex_is_unmap(name, len) - char *name; - size_t len; +ex_is_unmap(CHAR_T *name, size_t len) { EXCMDLIST const *cp; @@ -2255,9 +2259,7 @@ ex_is_unmap(name, len) * Search for a command name. */ static EXCMDLIST const * -ex_comm_search(name, len) - char *name; - size_t len; +ex_comm_search(CHAR_T *name, size_t len) { EXCMDLIST const *cp; @@ -2266,7 +2268,7 @@ ex_comm_search(name, len) return (NULL); if (cp->name[0] != name[0]) continue; - if (!memcmp(name, cp->name, len)) + if (!MEMCMP(name, cp->name, len)) return (cp); } return (NULL); @@ -2280,11 +2282,7 @@ ex_comm_search(name, len) * PUBLIC: __P((SCR *, EXCMDLIST const *, enum badaddr, enum nresult)); */ void -ex_badaddr(sp, cp, ba, nret) - SCR *sp; - EXCMDLIST const *cp; - enum badaddr ba; - enum nresult nret; +ex_badaddr(SCR *sp, const EXCMDLIST *cp, enum badaddr ba, enum nresult nret) { recno_t lno; @@ -2307,7 +2305,7 @@ ex_badaddr(sp, cp, ba, nret) * underlying file, that's the real problem. */ if (sp->ep == NULL) { - ex_emsg(sp, cp->name, EXM_NOFILEYET); + ex_wemsg(sp, cp ? cp->name : NULL, EXM_NOFILEYET); return; } @@ -2321,7 +2319,7 @@ ex_badaddr(sp, cp, ba, nret) if (lno != 0) { msgq(sp, M_ERR, "102|Illegal address: only %lu lines in the file", - lno); + (u_long)lno); break; } /* FALLTHROUGH */ @@ -2332,9 +2330,8 @@ ex_badaddr(sp, cp, ba, nret) abort(); /* NOTREACHED */ case A_ZERO: - msgq(sp, M_ERR, - "104|The %s command doesn't permit an address of 0", - cp->name); + msgq_wstr(sp, M_ERR, cp->name, + "104|The %s command doesn't permit an address of 0"); break; } return; @@ -2350,7 +2347,7 @@ ex_comlog(sp, ecp) SCR *sp; EXCMD *ecp; { - TRACE(sp, "ecmd: %s", ecp->cmd->name); + TRACE(sp, "ecmd: "WS, ecp->cmd->name); if (ecp->addrcnt > 0) { TRACE(sp, " a1 %d", ecp->addr1.lno); if (ecp->addrcnt > 1) @@ -2360,11 +2357,13 @@ ex_comlog(sp, ecp) TRACE(sp, " line %d", ecp->lineno); if (ecp->flags) TRACE(sp, " flags 0x%x", ecp->flags); - if (F_ISSET(&exc, E_BUFFER)) - TRACE(sp, " buffer %c", ecp->buffer); - if (ecp->argc) + if (FL_ISSET(ecp->iflags, E_C_BUFFER)) + TRACE(sp, " buffer "WC, ecp->buffer); + if (ecp->argc) { + int cnt; for (cnt = 0; cnt < ecp->argc; ++cnt) - TRACE(sp, " arg %d: {%s}", cnt, ecp->argv[cnt]->bp); + TRACE(sp, " arg %d: {"WS"}", cnt, ecp->argv[cnt]->bp); + } TRACE(sp, "\n"); } #endif diff --git a/ex/ex.h b/ex/ex.h index 5870990b744e..f5ba4c2311aa 100644 --- a/ex/ex.h +++ b/ex/ex.h @@ -6,13 +6,13 @@ * * See the LICENSE file for redistribution information. * - * @(#)ex.h 10.24 (Berkeley) 8/12/96 + * $Id: ex.h,v 10.31 2012/10/03 02:33:24 zy Exp $ */ #define PROMPTCHAR ':' /* Prompt using a colon. */ typedef struct _excmdlist { /* Ex command table structure. */ - char *name; /* Command name, underlying function. */ + CHAR_T *name; /* Command name, underlying function. */ int (*fn) __P((SCR *, EXCMD *)); #define E_ADDR1 0x00000001 /* One address. */ @@ -49,6 +49,9 @@ extern EXCMDLIST const cmds[]; /* Table of ex commands. */ (F_ISSET(cmdp, E_VLITONLY) ? \ (ch) == CH_LITERAL : KEY_VAL(sp, ch) == K_VLNEXT) +#define IS_SHELLMETA(sp, ch) \ + ((ch) <= CHAR_MAX && strchr(O_STR(sp, O_SHELLMETA), ch) != NULL) + /* * File state must be checked for each command -- any ex command may be entered * at any time, and most of them won't work well if a file hasn't yet been read @@ -56,7 +59,7 @@ extern EXCMDLIST const cmds[]; /* Table of ex commands. */ */ #define NEEDFILE(sp, cmdp) { \ if ((sp)->ep == NULL) { \ - ex_emsg(sp, (cmdp)->cmd->name, EXM_NOFILEYET); \ + ex_wemsg(sp, (cmdp)->cmd->name, EXM_NOFILEYET); \ return (1); \ } \ } @@ -64,13 +67,13 @@ extern EXCMDLIST const cmds[]; /* Table of ex commands. */ /* Range structures for global and @ commands. */ typedef struct _range RANGE; struct _range { /* Global command range. */ - CIRCLEQ_ENTRY(_range) q; /* Linked list of ranges. */ + TAILQ_ENTRY(_range) q; /* Linked list of ranges. */ recno_t start, stop; /* Start/stop of the range. */ }; /* Ex command structure. */ struct _excmd { - LIST_ENTRY(_excmd) q; /* Linked list of commands. */ + SLIST_ENTRY(_excmd) q; /* Linked list of commands. */ char *if_name; /* Associated file. */ recno_t if_lno; /* Associated line number. */ @@ -80,18 +83,18 @@ struct _excmd { memset(&((cmdp)->cp), 0, ((char *)&(cmdp)->flags - \ (char *)&((cmdp)->cp)) + sizeof((cmdp)->flags)) - char *cp; /* Current command text. */ + CHAR_T *cp; /* Current command text. */ size_t clen; /* Current command length. */ - char *save_cmd; /* Remaining command. */ + CHAR_T *save_cmd; /* Remaining command. */ size_t save_cmdlen; /* Remaining command length. */ EXCMDLIST const *cmd; /* Command: entry in command table. */ EXCMDLIST rcmd; /* Command: table entry/replacement. */ - CIRCLEQ_HEAD(_rh, _range) rq; /* @/global range: linked list. */ + TAILQ_HEAD(_rh, _range) rq[1]; /* @/global range: linked list. */ recno_t range_lno; /* @/global range: set line number. */ - char *o_cp; /* Original @/global command. */ + CHAR_T *o_cp; /* Original @/global command. */ size_t o_clen; /* Original @/global command length. */ #define AGV_AT 0x01 /* @ buffer execution. */ #define AGV_AT_NORANGE 0x02 /* @ buffer execution without range. */ @@ -133,7 +136,7 @@ struct _excmd { #define E_C_PRINT 0x01000 /* p flag. */ u_int16_t iflags; /* User input information. */ -#define __INUSE2 0x000004ff /* Same name space as EXCMDLIST. */ +#define __INUSE2 0x000007ff /* Same name space as EXCMDLIST. */ #define E_BLIGNORE 0x00000800 /* Ignore blank lines. */ #define E_NAMEDISCARD 0x00001000 /* Free/discard the name. */ #define E_NOAUTO 0x00002000 /* Don't do autoprint output. */ @@ -157,10 +160,11 @@ struct _excmd { /* Ex private, per-screen memory. */ typedef struct _ex_private { - CIRCLEQ_HEAD(_tqh, _tagq) tq; /* Tag queue. */ - TAILQ_HEAD(_tagfh, _tagf) tagfq;/* Tag file list. */ - LIST_HEAD(_csch, _csc) cscq; /* Cscope connection list. */ - char *tag_last; /* Saved last tag string. */ + /* Tag file list. */ + TAILQ_HEAD(_tagfh, _tagf) tagfq[1]; + TAILQ_HEAD(_tqh, _tagq) tq[1]; /* Tag queue. */ + SLIST_HEAD(_csch, _csc) cscq[1];/* Cscope connection list. */ + CHAR_T *tag_last; /* Saved last tag string. */ CHAR_T *lastbcomm; /* Last bang command. */ @@ -172,6 +176,7 @@ typedef struct _ex_private { char *ibp; /* File line input buffer. */ size_t ibp_len; /* File line input buffer length. */ + CONVWIN ibcw; /* File line input conversion buffer. */ /* * Buffers for the ex output. The screen/vi support doesn't do any @@ -225,4 +230,4 @@ typedef enum { } tagmsg_t; #include "ex_def.h" -#include "ex_extern.h" +#include "extern.h" diff --git a/ex/ex_abbrev.c b/ex/ex_abbrev.c index 231098ce7d25..662488966717 100644 --- a/ex/ex_abbrev.c +++ b/ex/ex_abbrev.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_abbrev.c 10.7 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: ex_abbrev.c,v 10.10 2001/12/16 18:18:54 skimo Exp $"; #endif /* not lint */ #include @@ -34,9 +34,7 @@ static const char sccsid[] = "@(#)ex_abbrev.c 10.7 (Berkeley) 3/6/96"; * PUBLIC: int ex_abbr __P((SCR *, EXCMD *)); */ int -ex_abbr(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_abbr(SCR *sp, EXCMD *cmdp) { CHAR_T *p; size_t len; @@ -71,7 +69,7 @@ ex_abbr(sp, cmdp) return (1); } for (p = cmdp->argv[0]->bp; *p != '\0'; ++p) - if (isblank(p[0])) { + if (ISBLANK(p[0])) { msgq(sp, M_ERR, "107|Abbreviations may not contain tabs or spaces"); return (1); @@ -100,16 +98,14 @@ ex_abbr(sp, cmdp) * PUBLIC: int ex_unabbr __P((SCR *, EXCMD *)); */ int -ex_unabbr(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_unabbr(SCR *sp, EXCMD *cmdp) { ARGS *ap; ap = cmdp->argv[0]; if (!F_ISSET(sp->gp, G_ABBREV) || seq_delete(sp, ap->bp, ap->len, SEQ_ABBREV)) { - msgq_str(sp, M_ERR, ap->bp, + msgq_wstr(sp, M_ERR, ap->bp, "109|\"%s\" is not an abbreviation"); return (1); } diff --git a/ex/ex_append.c b/ex/ex_append.c index 8d89e125f51f..de224f82589d 100644 --- a/ex/ex_append.c +++ b/ex/ex_append.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_append.c 10.30 (Berkeley) 10/23/96"; +static const char sccsid[] = "$Id: ex_append.c,v 10.34 2001/06/25 15:19:14 skimo Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -36,9 +37,7 @@ static int ex_aci __P((SCR *, EXCMD *, enum which)); * PUBLIC: int ex_append __P((SCR *, EXCMD *)); */ int -ex_append(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_append(SCR *sp, EXCMD *cmdp) { return (ex_aci(sp, cmdp, APPEND)); } @@ -50,9 +49,7 @@ ex_append(sp, cmdp) * PUBLIC: int ex_change __P((SCR *, EXCMD *)); */ int -ex_change(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_change(SCR *sp, EXCMD *cmdp) { return (ex_aci(sp, cmdp, CHANGE)); } @@ -65,9 +62,7 @@ ex_change(sp, cmdp) * PUBLIC: int ex_insert __P((SCR *, EXCMD *)); */ int -ex_insert(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_insert(SCR *sp, EXCMD *cmdp) { return (ex_aci(sp, cmdp, INSERT)); } @@ -77,16 +72,13 @@ ex_insert(sp, cmdp) * Append, change, insert in ex. */ static int -ex_aci(sp, cmdp, cmd) - SCR *sp; - EXCMD *cmdp; - enum which cmd; +ex_aci(SCR *sp, EXCMD *cmdp, enum which cmd) { CHAR_T *p, *t; GS *gp; TEXT *tp; - TEXTH tiq; - recno_t cnt, lno; + TEXTH tiq[] = {{ 0 }}; + recno_t cnt = 0, lno; size_t len; u_int32_t flags; int need_newline; @@ -175,7 +167,7 @@ ex_aci(sp, cmdp, cmd) if (len != 0) { ++t; if (--len == 0 && - db_append(sp, 1, lno++, "", 0)) + db_append(sp, 1, lno++, NULL, 0)) return (1); } } @@ -213,7 +205,7 @@ ex_aci(sp, cmdp, cmd) */ if (F_ISSET(sp, SC_VI)) { if (gp->scr_screen(sp, SC_EX)) { - ex_emsg(sp, cmdp->cmd->name, EXM_NOCANON); + ex_wemsg(sp, cmdp->cmd->name, EXM_NOCANON); return (1); } @@ -254,16 +246,16 @@ ex_aci(sp, cmdp, cmd) * characters in the common TEXTH structure when they were inserted * into the file, above.) */ - memset(&tiq, 0, sizeof(TEXTH)); - CIRCLEQ_INIT(&tiq); + TAILQ_INIT(tiq); - if (ex_txt(sp, &tiq, 0, flags)) + if (ex_txt(sp, tiq, 0, flags)) return (1); - for (cnt = 0, tp = tiq.cqh_first; - tp != (TEXT *)&tiq; ++cnt, tp = tp->q.cqe_next) + TAILQ_FOREACH(tp, tiq, q) { if (db_append(sp, 1, lno++, tp->lb, tp->len)) return (1); + ++cnt; + } /* * Set sp->lno to the final line number value (correcting for a diff --git a/ex/ex_args.c b/ex/ex_args.c index bc37109fc130..2105d2d057d0 100644 --- a/ex/ex_args.c +++ b/ex/ex_args.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_args.c 10.16 (Berkeley) 7/13/96"; +static const char sccsid[] = "$Id: ex_args.c,v 10.19 2011/12/16 16:18:10 zy Exp $"; #endif /* not lint */ #include @@ -42,14 +42,16 @@ static int ex_N_next __P((SCR *, EXCMD *)); * PUBLIC: int ex_next __P((SCR *, EXCMD *)); */ int -ex_next(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_next(SCR *sp, EXCMD *cmdp) { ARGS **argv; FREF *frp; int noargs; char **ap; + CHAR_T *wp; + size_t wlen; + char *np; + size_t nlen; /* Check for file to move to. */ if (cmdp->argc == 0 && (sp->cargv == NULL || sp->cargv[1] == NULL)) { @@ -60,8 +62,9 @@ ex_next(sp, cmdp) if (F_ISSET(cmdp, E_NEWSCREEN)) { /* By default, edit the next file in the old argument list. */ if (cmdp->argc == 0) { - if (argv_exp0(sp, - cmdp, sp->cargv[1], strlen(sp->cargv[1]))) + CHAR2INT(sp, sp->cargv[1], strlen(sp->cargv[1]) + 1, + wp, wlen); + if (argv_exp0(sp, cmdp, wp, wlen - 1)) return (1); return (ex_edit(sp, cmdp)); } @@ -88,10 +91,11 @@ ex_next(sp, cmdp) CALLOC_RET(sp, sp->argv, char **, cmdp->argc + 1, sizeof(char *)); for (ap = sp->argv, - argv = cmdp->argv; argv[0]->len != 0; ++ap, ++argv) - if ((*ap = - v_strdup(sp, argv[0]->bp, argv[0]->len)) == NULL) + argv = cmdp->argv; argv[0]->len != 0; ++ap, ++argv) { + INT2CHAR(sp, argv[0]->bp, argv[0]->len, np, nlen); + if ((*ap = v_strdup(sp, np, nlen)) == NULL) return (1); + } *ap = NULL; /* Switch to the first file. */ @@ -125,12 +129,12 @@ ex_next(sp, cmdp) * New screen version of ex_next. */ static int -ex_N_next(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_N_next(SCR *sp, EXCMD *cmdp) { SCR *new; FREF *frp; + char *np; + size_t nlen; /* Get a new screen. */ if (screen_init(sp->gp, sp, &new)) @@ -141,7 +145,8 @@ ex_N_next(sp, cmdp) } /* Get a backing file. */ - if ((frp = file_add(new, cmdp->argv[0]->bp)) == NULL || + INT2CHAR(sp, cmdp->argv[0]->bp, cmdp->argv[0]->len + 1, np, nlen); + if ((frp = file_add(new, np)) == NULL || file_init(new, frp, NULL, (FL_ISSET(cmdp->iflags, E_C_FORCE) ? FS_FORCE : 0))) { (void)vs_discard(new, NULL); @@ -169,11 +174,11 @@ ex_N_next(sp, cmdp) * PUBLIC: int ex_prev __P((SCR *, EXCMD *)); */ int -ex_prev(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_prev(SCR *sp, EXCMD *cmdp) { FREF *frp; + size_t wlen; + CHAR_T *wp; if (sp->cargv == sp->argv) { msgq(sp, M_ERR, "112|No previous files to edit"); @@ -181,7 +186,9 @@ ex_prev(sp, cmdp) } if (F_ISSET(cmdp, E_NEWSCREEN)) { - if (argv_exp0(sp, cmdp, sp->cargv[-1], strlen(sp->cargv[-1]))) + CHAR2INT(sp, sp->cargv[-1], strlen(sp->cargv[-1]) + 1, + wp, wlen); + if (argv_exp0(sp, cmdp, wp, wlen - 1)) return (1); return (ex_edit(sp, cmdp)); } @@ -216,9 +223,7 @@ ex_prev(sp, cmdp) * PUBLIC: int ex_rew __P((SCR *, EXCMD *)); */ int -ex_rew(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_rew(SCR *sp, EXCMD *cmdp) { FREF *frp; @@ -256,9 +261,7 @@ ex_rew(sp, cmdp) * PUBLIC: int ex_args __P((SCR *, EXCMD *)); */ int -ex_args(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_args(SCR *sp, EXCMD *cmdp) { GS *gp; int cnt, col, len, sep; @@ -299,14 +302,13 @@ ex_args(sp, cmdp) * PUBLIC: char **ex_buildargv __P((SCR *, EXCMD *, char *)); */ char ** -ex_buildargv(sp, cmdp, name) - SCR *sp; - EXCMD *cmdp; - char *name; +ex_buildargv(SCR *sp, EXCMD *cmdp, char *name) { ARGS **argv; int argc; char **ap, **s_argv; + char *np; + size_t nlen; argc = cmdp == NULL ? 1 : cmdp->argc; CALLOC(sp, s_argv, char **, argc + 1, sizeof(char *)); @@ -318,10 +320,11 @@ ex_buildargv(sp, cmdp, name) return (NULL); ++ap; } else - for (argv = cmdp->argv; argv[0]->len != 0; ++ap, ++argv) - if ((*ap = - v_strdup(sp, argv[0]->bp, argv[0]->len)) == NULL) + for (argv = cmdp->argv; argv[0]->len != 0; ++ap, ++argv) { + INT2CHAR(sp, argv[0]->bp, argv[0]->len, np, nlen); + if ((*ap = v_strdup(sp, np, nlen)) == NULL) return (NULL); + } *ap = NULL; return (s_argv); } diff --git a/ex/ex_argv.c b/ex/ex_argv.c index cc5a201bea26..b3e3edf1a7e9 100644 --- a/ex/ex_argv.c +++ b/ex/ex_argv.c @@ -10,17 +10,19 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_argv.c 10.26 (Berkeley) 9/20/96"; +static const char sccsid[] = "$Id: ex_argv.c,v 11.2 2012/10/09 23:00:29 zy Exp $"; #endif /* not lint */ #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -31,9 +33,9 @@ static const char sccsid[] = "@(#)ex_argv.c 10.26 (Berkeley) 9/20/96"; static int argv_alloc __P((SCR *, size_t)); static int argv_comp __P((const void *, const void *)); static int argv_fexp __P((SCR *, EXCMD *, - char *, size_t, char *, size_t *, char **, size_t *, int)); -static int argv_lexp __P((SCR *, EXCMD *, char *)); -static int argv_sexp __P((SCR *, char **, size_t *, size_t *)); + CHAR_T *, size_t, CHAR_T *, size_t *, CHAR_T **, size_t *, int)); +static int argv_sexp __P((SCR *, CHAR_T **, size_t *, size_t *)); +static int argv_flt_user __P((SCR *, EXCMD *, CHAR_T *, size_t)); /* * argv_init -- @@ -42,9 +44,7 @@ static int argv_sexp __P((SCR *, char **, size_t *, size_t *)); * PUBLIC: int argv_init __P((SCR *, EXCMD *)); */ int -argv_init(sp, excp) - SCR *sp; - EXCMD *excp; +argv_init(SCR *sp, EXCMD *excp) { EX_PRIVATE *exp; @@ -61,20 +61,16 @@ argv_init(sp, excp) * argv_exp0 -- * Append a string to the argument list. * - * PUBLIC: int argv_exp0 __P((SCR *, EXCMD *, char *, size_t)); + * PUBLIC: int argv_exp0 __P((SCR *, EXCMD *, CHAR_T *, size_t)); */ int -argv_exp0(sp, excp, cmd, cmdlen) - SCR *sp; - EXCMD *excp; - char *cmd; - size_t cmdlen; +argv_exp0(SCR *sp, EXCMD *excp, CHAR_T *cmd, size_t cmdlen) { EX_PRIVATE *exp; exp = EXP(sp); argv_alloc(sp, cmdlen); - memcpy(exp->args[exp->argsoff]->bp, cmd, cmdlen); + MEMCPY(exp->args[exp->argsoff]->bp, cmd, cmdlen); exp->args[exp->argsoff]->bp[cmdlen] = '\0'; exp->args[exp->argsoff]->len = cmdlen; ++exp->argsoff; @@ -88,33 +84,28 @@ argv_exp0(sp, excp, cmd, cmdlen) * Do file name expansion on a string, and append it to the * argument list. * - * PUBLIC: int argv_exp1 __P((SCR *, EXCMD *, char *, size_t, int)); + * PUBLIC: int argv_exp1 __P((SCR *, EXCMD *, CHAR_T *, size_t, int)); */ int -argv_exp1(sp, excp, cmd, cmdlen, is_bang) - SCR *sp; - EXCMD *excp; - char *cmd; - size_t cmdlen; - int is_bang; +argv_exp1(SCR *sp, EXCMD *excp, CHAR_T *cmd, size_t cmdlen, int is_bang) { EX_PRIVATE *exp; size_t blen, len; - char *bp, *p, *t; + CHAR_T *p, *t, *bp; - GET_SPACE_RET(sp, bp, blen, 512); + GET_SPACE_RETW(sp, bp, blen, 512); len = 0; exp = EXP(sp); if (argv_fexp(sp, excp, cmd, cmdlen, bp, &len, &bp, &blen, is_bang)) { - FREE_SPACE(sp, bp, blen); + FREE_SPACEW(sp, bp, blen); return (1); } /* If it's empty, we're done. */ if (len != 0) { for (p = bp, t = bp + len; p < t; ++p) - if (!isblank(*p)) + if (!cmdskip(*p)) break; if (p == t) goto ret; @@ -123,7 +114,7 @@ argv_exp1(sp, excp, cmd, cmdlen, is_bang) (void)argv_exp0(sp, excp, bp, len); -ret: FREE_SPACE(sp, bp, blen); +ret: FREE_SPACEW(sp, bp, blen); return (0); } @@ -132,24 +123,20 @@ ret: FREE_SPACE(sp, bp, blen); * Do file name and shell expansion on a string, and append it to * the argument list. * - * PUBLIC: int argv_exp2 __P((SCR *, EXCMD *, char *, size_t)); + * PUBLIC: int argv_exp2 __P((SCR *, EXCMD *, CHAR_T *, size_t)); */ int -argv_exp2(sp, excp, cmd, cmdlen) - SCR *sp; - EXCMD *excp; - char *cmd; - size_t cmdlen; +argv_exp2(SCR *sp, EXCMD *excp, CHAR_T *cmd, size_t cmdlen) { size_t blen, len, n; int rval; - char *bp, *mp, *p; + CHAR_T *bp, *p; - GET_SPACE_RET(sp, bp, blen, 512); + GET_SPACE_RETW(sp, bp, blen, 512); -#define SHELLECHO "echo " -#define SHELLOFFSET (sizeof(SHELLECHO) - 1) - memcpy(bp, SHELLECHO, SHELLOFFSET); +#define SHELLECHO L("echo ") +#define SHELLOFFSET (SIZE(SHELLECHO) - 1) + MEMCPY(bp, SHELLECHO, SHELLOFFSET); p = bp + SHELLOFFSET; len = SHELLOFFSET; @@ -175,28 +162,15 @@ argv_exp2(sp, excp, cmd, cmdlen) * but then, if your shell was csh, the above example will behave * differently in nvi than in vi. If you want to get other characters * passed through to your shell, change the "meta" option. - * - * To avoid a function call per character, we do a first pass through - * the meta characters looking for characters that aren't expected - * to be there, and then we can ignore them in the user's argument. */ if (opts_empty(sp, O_SHELL, 1) || opts_empty(sp, O_SHELLMETA, 1)) n = 0; else { - for (p = mp = O_STR(sp, O_SHELLMETA); *p != '\0'; ++p) - if (isblank(*p) || isalnum(*p)) - break; p = bp + SHELLOFFSET; n = len - SHELLOFFSET; - if (*p != '\0') { - for (; n > 0; --n, ++p) - if (strchr(mp, *p) != NULL) - break; - } else - for (; n > 0; --n, ++p) - if (!isblank(*p) && - !isalnum(*p) && strchr(mp, *p) != NULL) - break; + for (; n > 0; --n, ++p) + if (IS_SHELLMETA(sp, *p)) + break; } /* @@ -204,13 +178,11 @@ argv_exp2(sp, excp, cmd, cmdlen) * it. Unfortunately, this is comparatively slow. Historically, it * didn't matter much, since users don't enter meta characters as part * of pathnames that frequently. The addition of filename completion - * broke that assumption because it's easy to use. As a result, lots - * folks have complained that the expansion code is too slow. So, we - * detect filename completion as a special case, and do it internally. - * Note that this code assumes that the character is the - * match-anything meta character. That feels safe -- if anyone writes - * a shell that doesn't follow that convention, I'd suggest giving them - * a festive hot-lead enema. + * broke that assumption because it's easy to use. To increase the + * completion performance, nvi used to have an internal routine to + * handle "filename*". However, the shell special characters does not + * limit to "shellmeta", so such a hack breaks historic practice. + * After it all, we split the completion logic out from here. */ switch (n) { case 0: @@ -218,13 +190,6 @@ argv_exp2(sp, excp, cmd, cmdlen) len -= SHELLOFFSET; rval = argv_exp3(sp, excp, p, len); break; - case 1: - if (*p == '*') { - *p = '\0'; - rval = argv_lexp(sp, excp, bp + SHELLOFFSET); - break; - } - /* FALLTHROUGH */ default: if (argv_sexp(sp, &bp, &blen, &len)) { rval = 1; @@ -235,7 +200,7 @@ argv_exp2(sp, excp, cmd, cmdlen) break; } -err: FREE_SPACE(sp, bp, blen); +err: FREE_SPACEW(sp, bp, blen); return (rval); } @@ -244,25 +209,21 @@ err: FREE_SPACE(sp, bp, blen); * Take a string and break it up into an argv, which is appended * to the argument list. * - * PUBLIC: int argv_exp3 __P((SCR *, EXCMD *, char *, size_t)); + * PUBLIC: int argv_exp3 __P((SCR *, EXCMD *, CHAR_T *, size_t)); */ int -argv_exp3(sp, excp, cmd, cmdlen) - SCR *sp; - EXCMD *excp; - char *cmd; - size_t cmdlen; +argv_exp3(SCR *sp, EXCMD *excp, CHAR_T *cmd, size_t cmdlen) { EX_PRIVATE *exp; size_t len; int ch, off; - char *ap, *p; + CHAR_T *ap, *p; for (exp = EXP(sp); cmdlen > 0; ++exp->argsoff) { /* Skip any leading whitespace. */ for (; cmdlen > 0; --cmdlen, ++cmd) { ch = *cmd; - if (!isblank(ch)) + if (!cmdskip(ch)) break; } if (cmdlen == 0) @@ -282,7 +243,7 @@ argv_exp3(sp, excp, cmd, cmdlen) if (IS_ESCAPE(sp, excp, ch) && cmdlen > 1) { ++cmd; --cmdlen; - } else if (isblank(ch)) + } else if (cmdskip(ch)) break; } @@ -311,21 +272,100 @@ argv_exp3(sp, excp, cmd, cmdlen) return (0); } +/* + * argv_flt_ex -- + * Filter the ex commands with a prefix, and append the results to + * the argument list. + * + * PUBLIC: int argv_flt_ex __P((SCR *, EXCMD *, CHAR_T *, size_t)); + */ +int +argv_flt_ex(SCR *sp, EXCMD *excp, CHAR_T *cmd, size_t cmdlen) +{ + EX_PRIVATE *exp; + EXCMDLIST const *cp; + int off; + size_t len; + + exp = EXP(sp); + + for (off = exp->argsoff, cp = cmds; cp->name != NULL; ++cp) { + len = STRLEN(cp->name); + if (cmdlen > 0 && + (cmdlen > len || MEMCMP(cmd, cp->name, cmdlen))) + continue; + + /* Copy the matched ex command name. */ + argv_alloc(sp, len + 1); + MEMCPY(exp->args[exp->argsoff]->bp, cp->name, len + 1); + exp->args[exp->argsoff]->len = len; + ++exp->argsoff; + excp->argv = exp->args; + excp->argc = exp->argsoff; + } + + return (0); +} + +/* + * argv_flt_user -- + * Filter the ~user list on the system with a prefix, and append + * the results to the argument list. + */ +static int +argv_flt_user(SCR *sp, EXCMD *excp, CHAR_T *uname, size_t ulen) +{ + EX_PRIVATE *exp; + struct passwd *pw; + int off; + char *np; + size_t len, nlen; + + exp = EXP(sp); + off = exp->argsoff; + + /* The input must come with a leading '~'. */ + INT2CHAR(sp, uname + 1, ulen - 1, np, nlen); + if ((np = v_strdup(sp, np, nlen)) == NULL) + return (1); + + setpwent(); + while ((pw = getpwent()) != NULL) { + len = strlen(pw->pw_name); + if (nlen > 0 && + (nlen > len || memcmp(np, pw->pw_name, nlen))) + continue; + + /* Copy '~' + the matched user name. */ + CHAR2INT(sp, pw->pw_name, len + 1, uname, ulen); + argv_alloc(sp, ulen + 1); + exp->args[exp->argsoff]->bp[0] = '~'; + MEMCPY(exp->args[exp->argsoff]->bp + 1, uname, ulen); + exp->args[exp->argsoff]->len = ulen; + ++exp->argsoff; + excp->argv = exp->args; + excp->argc = exp->argsoff; + } + endpwent(); + free(np); + + qsort(exp->args + off, exp->argsoff - off, sizeof(ARGS *), argv_comp); + return (0); +} + /* * argv_fexp -- * Do file name and bang command expansion. */ static int -argv_fexp(sp, excp, cmd, cmdlen, p, lenp, bpp, blenp, is_bang) - SCR *sp; - EXCMD *excp; - char *cmd, *p, **bpp; - size_t cmdlen, *lenp, *blenp; - int is_bang; +argv_fexp(SCR *sp, EXCMD *excp, CHAR_T *cmd, size_t cmdlen, CHAR_T *p, size_t *lenp, CHAR_T **bpp, size_t *blenp, int is_bang) { EX_PRIVATE *exp; - char *bp, *t; + char *t; size_t blen, len, off, tlen; + CHAR_T *bp; + CHAR_T *wp; + size_t wlen; /* Replace file name characters. */ for (bp = *bpp, blen = *blenp, len = *lenp; cmdlen > 0; --cmdlen, ++cmd) @@ -339,11 +379,11 @@ argv_fexp(sp, excp, cmd, cmdlen, p, lenp, bpp, blenp, is_bang) "115|No previous command to replace \"!\""); return (1); } - len += tlen = strlen(exp->lastbcomm); + len += tlen = STRLEN(exp->lastbcomm); off = p - bp; - ADD_SPACE_RET(sp, bp, blen, len); + ADD_SPACE_RETW(sp, bp, blen, len); p = bp + off; - memcpy(p, exp->lastbcomm, tlen); + MEMCPY(p, exp->lastbcomm, tlen); p += tlen; F_SET(excp, E_MODIFY); break; @@ -356,10 +396,11 @@ argv_fexp(sp, excp, cmd, cmdlen, p, lenp, bpp, blenp, is_bang) tlen = strlen(t); len += tlen; off = p - bp; - ADD_SPACE_RET(sp, bp, blen, len); + ADD_SPACE_RETW(sp, bp, blen, len); p = bp + off; - memcpy(p, t, tlen); - p += tlen; + CHAR2INT(sp, t, tlen, wp, wlen); + MEMCPY(p, wp, wlen); + p += wlen; F_SET(excp, E_MODIFY); break; case '#': @@ -370,10 +411,11 @@ argv_fexp(sp, excp, cmd, cmdlen, p, lenp, bpp, blenp, is_bang) } len += tlen = strlen(t); off = p - bp; - ADD_SPACE_RET(sp, bp, blen, len); + ADD_SPACE_RETW(sp, bp, blen, len); p = bp + off; - memcpy(p, t, tlen); - p += tlen; + CHAR2INT(sp, t, tlen, wp, wlen); + MEMCPY(p, wp, wlen); + p += wlen; F_SET(excp, E_MODIFY); break; case '\\': @@ -392,7 +434,7 @@ argv_fexp(sp, excp, cmd, cmdlen, p, lenp, bpp, blenp, is_bang) default: ins_ch: ++len; off = p - bp; - ADD_SPACE_RET(sp, bp, blen, len); + ADD_SPACE_RETW(sp, bp, blen, len); p = bp + off; *p++ = *cmd; } @@ -400,7 +442,7 @@ ins_ch: ++len; /* Nul termination. */ ++len; off = p - bp; - ADD_SPACE_RET(sp, bp, blen, len); + ADD_SPACE_RETW(sp, bp, blen, len); p = bp + off; *p = '\0'; @@ -416,9 +458,7 @@ ins_ch: ++len; * Make more space for arguments. */ static int -argv_alloc(sp, len) - SCR *sp; - size_t len; +argv_alloc(SCR *sp, size_t len) { ARGS *ap; EX_PRIVATE *exp; @@ -483,8 +523,7 @@ mem: msgq(sp, M_SYSERR, NULL); * PUBLIC: int argv_free __P((SCR *)); */ int -argv_free(sp) - SCR *sp; +argv_free(SCR *sp) { EX_PRIVATE *exp; int off; @@ -507,89 +546,103 @@ argv_free(sp) } /* - * argv_lexp -- + * argv_flt_path -- * Find all file names matching the prefix and append them to the - * buffer. + * argument list. + * + * PUBLIC: int argv_flt_path __P((SCR *, EXCMD *, CHAR_T *, size_t)); */ -static int -argv_lexp(sp, excp, path) - SCR *sp; - EXCMD *excp; - char *path; +int +argv_flt_path(SCR *sp, EXCMD *excp, CHAR_T *path, size_t plen) { struct dirent *dp; DIR *dirp; EX_PRIVATE *exp; int off; size_t dlen, len, nlen; - char *dname, *name, *p; + CHAR_T *dname; + CHAR_T *p, *np, *n; + char *name, *tp, *epd = NULL; + CHAR_T *wp; + size_t wlen; exp = EXP(sp); /* Set up the name and length for comparison. */ - if ((p = strrchr(path, '/')) == NULL) { - dname = "."; + if ((path = v_wstrdup(sp, path, plen)) == NULL) + return (1); + if ((p = STRRCHR(path, '/')) == NULL) { + if (*path == '~') { + int rc; + + /* Filter ~user list instead. */ + rc = argv_flt_user(sp, excp, path, plen); + free(path); + return (rc); + } + dname = L("."); dlen = 0; - name = path; - } else { + np = path; + } else { if (p == path) { - dname = "/"; + dname = L("/"); dlen = 1; } else { *p = '\0'; dname = path; - dlen = strlen(path); + dlen = p - path; } - name = p + 1; + np = p + 1; } - nlen = strlen(name); - /* - * XXX - * We don't use the d_namlen field, it's not portable enough; we - * assume that d_name is nul terminated, instead. - */ - if ((dirp = opendir(dname)) == NULL) { - msgq_str(sp, M_SYSERR, dname, "%s"); + INT2CHAR(sp, dname, dlen + 1, tp, nlen); + if ((epd = expanduser(tp)) != NULL) + tp = epd; + if ((dirp = opendir(tp)) == NULL) { + free(epd); + free(path); return (1); } + free(epd); + + INT2CHAR(sp, np, STRLEN(np), tp, nlen); + if ((name = v_strdup(sp, tp, nlen)) == NULL) { + free(path); + return (1); + } + for (off = exp->argsoff; (dp = readdir(dirp)) != NULL;) { if (nlen == 0) { if (dp->d_name[0] == '.') continue; - len = strlen(dp->d_name); + len = dp->d_namlen; } else { - len = strlen(dp->d_name); + len = dp->d_namlen; if (len < nlen || memcmp(dp->d_name, name, nlen)) continue; } /* Directory + name + slash + null. */ - argv_alloc(sp, dlen + len + 2); - p = exp->args[exp->argsoff]->bp; + CHAR2INT(sp, dp->d_name, len + 1, wp, wlen); + argv_alloc(sp, dlen + wlen + 1); + n = exp->args[exp->argsoff]->bp; if (dlen != 0) { - memcpy(p, dname, dlen); - p += dlen; + MEMCPY(n, dname, dlen); + n += dlen; if (dlen > 1 || dname[0] != '/') - *p++ = '/'; + *n++ = '/'; + exp->args[exp->argsoff]->len = dlen + 1; } - memcpy(p, dp->d_name, len + 1); - exp->args[exp->argsoff]->len = dlen + len + 1; + MEMCPY(n, wp, wlen); + exp->args[exp->argsoff]->len += wlen - 1; ++exp->argsoff; excp->argv = exp->args; excp->argc = exp->argsoff; } closedir(dirp); + free(name); + free(path); - if (off == exp->argsoff) { - /* - * If we didn't find a match, complain that the expansion - * failed. We can't know for certain that's the error, but - * it's a good guess, and it matches historic practice. - */ - msgq(sp, M_ERR, "304|Shell expansion failed"); - return (1); - } qsort(exp->args + off, exp->argsoff - off, sizeof(ARGS *), argv_comp); return (0); } @@ -599,10 +652,9 @@ argv_lexp(sp, excp, path) * Alphabetic comparison. */ static int -argv_comp(a, b) - const void *a, *b; +argv_comp(const void *a, const void *b) { - return (strcmp((char *)(*(ARGS **)a)->bp, (char *)(*(ARGS **)b)->bp)); + return (STRCMP((*(ARGS **)a)->bp, (*(ARGS **)b)->bp)); } /* @@ -611,17 +663,17 @@ argv_comp(a, b) * a buffer. */ static int -argv_sexp(sp, bpp, blenp, lenp) - SCR *sp; - char **bpp; - size_t *blenp, *lenp; +argv_sexp(SCR *sp, CHAR_T **bpp, size_t *blenp, size_t *lenp) { enum { SEXP_ERR, SEXP_EXPANSION_ERR, SEXP_OK } rval; FILE *ifp; pid_t pid; size_t blen, len; int ch, std_output[2]; - char *bp, *p, *sh, *sh_path; + CHAR_T *bp, *p; + char *sh, *sh_path; + char *np; + size_t nlen; /* Secure means no shell access. */ if (O_ISSET(sp, O_SECURE)) { @@ -689,7 +741,8 @@ err: if (ifp != NULL) * XXX * Assume that all shells have -c. */ - execl(sh_path, sh, "-c", bp, NULL); + INT2CHAR(sp, bp, STRLEN(bp)+1, np, nlen); + execl(sh_path, sh, "-c", np, (char *)NULL); msgq_str(sp, M_SYSERR, sh_path, "118|Error: execl: %s"); _exit(127); default: /* Parent. */ @@ -707,9 +760,9 @@ err: if (ifp != NULL) * shell that does that is broken. */ for (p = bp, len = 0, ch = EOF; - (ch = getc(ifp)) != EOF; *p++ = ch, --blen, ++len) + (ch = GETC(ifp)) != EOF; *p++ = ch, blen-=sizeof(CHAR_T), ++len) if (blen < 5) { - ADD_SPACE_GOTO(sp, bp, *blenp, *blenp * 2); + ADD_SPACE_GOTOW(sp, bp, *blenp, *blenp * 2); p = bp + len; blen = *blenp - len; } @@ -744,7 +797,7 @@ alloc_err: rval = SEXP_ERR; rval = SEXP_EXPANSION_ERR; for (p = bp; len; ++p, --len) - if (!isblank(*p)) + if (!cmdskip(*p)) break; if (len == 0) rval = SEXP_EXPANSION_ERR; @@ -754,3 +807,108 @@ alloc_err: rval = SEXP_ERR; return (rval == SEXP_OK ? 0 : 1); } + +/* + * argv_esc -- + * Escape a string into an ex and shell argument. + * + * PUBLIC: CHAR_T *argv_esc __P((SCR *, EXCMD *, CHAR_T *, size_t)); + */ +CHAR_T * +argv_esc(SCR *sp, EXCMD *excp, CHAR_T *str, size_t len) +{ + size_t blen, off; + CHAR_T *bp, *p; + int ch; + + GET_SPACE_GOTOW(sp, bp, blen, len + 1); + + /* + * Leaving the first '~' unescaped causes the user to need a + * "./" prefix to edit a file which really starts with a '~'. + * However, the file completion happens to not work for these + * files without the prefix. + * + * All ex expansion characters, "!%#", are double escaped. + */ + for (p = bp; len > 0; ++str, --len) { + ch = *str; + off = p - bp; + if (blen / sizeof(CHAR_T) - off < 3) { + ADD_SPACE_GOTOW(sp, bp, blen, off + 3); + p = bp + off; + } + if (cmdskip(ch) || ch == '\n' || + IS_ESCAPE(sp, excp, ch)) /* Ex. */ + *p++ = CH_LITERAL; + else switch (ch) { + case '~': /* ~user. */ + if (p != bp) + *p++ = '\\'; + break; + case '+': /* Ex +cmd. */ + if (p == bp) + *p++ = '\\'; + break; + case '!': case '%': case '#': /* Ex exp. */ + *p++ = '\\'; + *p++ = '\\'; + break; + case ',': case '-': case '.': case '/': /* Safe. */ + case ':': case '=': case '@': case '_': + break; + default: /* Unsafe. */ + if (isascii(ch) && !isalnum(ch)) + *p++ = '\\'; + } + *p++ = ch; + } + *p = '\0'; + + return bp; + +alloc_err: + return NULL; +} + +/* + * argv_uesc -- + * Unescape an escaped ex and shell argument. + * + * PUBLIC: CHAR_T *argv_uesc __P((SCR *, EXCMD *, CHAR_T *, size_t)); + */ +CHAR_T * +argv_uesc(SCR *sp, EXCMD *excp, CHAR_T *str, size_t len) +{ + size_t blen; + CHAR_T *bp, *p; + + GET_SPACE_GOTOW(sp, bp, blen, len + 1); + + for (p = bp; len > 0; ++str, --len) { + if (IS_ESCAPE(sp, excp, *str)) { + if (--len < 1) + break; + ++str; + } else if (*str == '\\') { + if (--len < 1) + break; + ++str; + + /* Check for double escaping. */ + if (*str == '\\' && len > 1) + switch (str[1]) { + case '!': case '%': case '#': + ++str; + --len; + } + } + *p++ = *str; + } + *p = '\0'; + + return bp; + +alloc_err: + return NULL; +} diff --git a/ex/ex_at.c b/ex/ex_at.c index e9c6c592d60b..0c12e6ce8e5a 100644 --- a/ex/ex_at.c +++ b/ex/ex_at.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_at.c 10.12 (Berkeley) 9/15/96"; +static const char sccsid[] = "$Id: ex_at.c,v 10.16 2001/06/25 15:19:14 skimo Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -34,17 +35,15 @@ static const char sccsid[] = "@(#)ex_at.c 10.12 (Berkeley) 9/15/96"; * PUBLIC: int ex_at __P((SCR *, EXCMD *)); */ int -ex_at(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_at(SCR *sp, EXCMD *cmdp) { CB *cbp; CHAR_T name; EXCMD *ecp; RANGE *rp; TEXT *tp; - size_t len; - char *p; + size_t len = 0; + CHAR_T *p; /* * !!! @@ -84,7 +83,7 @@ ex_at(sp, cmdp) * means @ buffers are still useful in a multi-screen environment. */ CALLOC_RET(sp, ecp, EXCMD *, 1, sizeof(EXCMD)); - CIRCLEQ_INIT(&ecp->rq); + TAILQ_INIT(ecp->rq); CALLOC_RET(sp, rp, RANGE *, 1, sizeof(RANGE)); rp->start = cmdp->addr1.lno; if (F_ISSET(cmdp, E_ADDR_DEF)) { @@ -94,7 +93,7 @@ ex_at(sp, cmdp) rp->stop = cmdp->addr2.lno; FL_SET(ecp->agv_flags, AGV_AT); } - CIRCLEQ_INSERT_HEAD(&ecp->rq, rp, q); + TAILQ_INSERT_HEAD(ecp->rq, rp, q); /* * Buffers executed in ex mode or from the colon command line in vi @@ -104,23 +103,22 @@ ex_at(sp, cmdp) * Build two copies of the command. We need two copies because the * ex parser may step on the command string when it's parsing it. */ - for (len = 0, tp = cbp->textq.cqh_last; - tp != (void *)&cbp->textq; tp = tp->q.cqe_prev) + TAILQ_FOREACH_REVERSE(tp, cbp->textq, _texth, q) len += tp->len + 1; - MALLOC_RET(sp, ecp->cp, char *, len * 2); + MALLOC_RET(sp, ecp->cp, CHAR_T *, len * 2 * sizeof(CHAR_T)); ecp->o_cp = ecp->cp; ecp->o_clen = len; ecp->cp[len] = '\0'; /* Copy the buffer into the command space. */ - for (p = ecp->cp + len, tp = cbp->textq.cqh_last; - tp != (void *)&cbp->textq; tp = tp->q.cqe_prev) { - memcpy(p, tp->lb, tp->len); + p = ecp->cp + len; + TAILQ_FOREACH_REVERSE(tp, cbp->textq, _texth, q) { + MEMCPY(p, tp->lb, tp->len); p += tp->len; *p++ = '\n'; } - LIST_INSERT_HEAD(&sp->gp->ecq, ecp, q); + SLIST_INSERT_HEAD(sp->gp->ecq, ecp, q); return (0); } diff --git a/ex/ex_bang.c b/ex/ex_bang.c index 25f3f7732ab0..4b6f75e8d0f7 100644 --- a/ex/ex_bang.c +++ b/ex/ex_bang.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_bang.c 10.33 (Berkeley) 9/23/96"; +static const char sccsid[] = "$Id: ex_bang.c,v 10.36 2001/06/25 15:19:14 skimo Exp $"; #endif /* not lint */ #include @@ -47,9 +47,7 @@ static const char sccsid[] = "@(#)ex_bang.c 10.33 (Berkeley) 9/23/96"; * PUBLIC: int ex_bang __P((SCR *, EXCMD *)); */ int -ex_bang(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_bang(SCR *sp, EXCMD *cmdp) { enum filtertype ftype; ARGS *ap; @@ -58,6 +56,8 @@ ex_bang(sp, cmdp) recno_t lno; int rval; const char *msg; + char *np; + size_t nlen; ap = cmdp->argv[0]; if (ap->len == 0) { @@ -69,7 +69,7 @@ ex_bang(sp, cmdp) exp = EXP(sp); if (exp->lastbcomm != NULL) free(exp->lastbcomm); - if ((exp->lastbcomm = strdup(ap->bp)) == NULL) { + if ((exp->lastbcomm = v_wstrdup(sp, ap->bp, ap->len)) == NULL) { msgq(sp, M_SYSERR, NULL); return (1); } @@ -88,7 +88,7 @@ ex_bang(sp, cmdp) if (F_ISSET(sp, SC_VI)) vs_update(sp, "!", ap->bp); else { - (void)ex_printf(sp, "!%s\n", ap->bp); + (void)ex_printf(sp, "!"WS"\n", ap->bp); (void)ex_fflush(sp); } } @@ -112,8 +112,9 @@ ex_bang(sp, cmdp) NULL); /* If we're still in a vi screen, move out explicitly. */ + INT2CHAR(sp, ap->bp, ap->len+1, np, nlen); (void)ex_exec_proc(sp, - cmdp, ap->bp, msg, !F_ISSET(sp, SC_EX | SC_SCR_EXWROTE)); + cmdp, np, msg, !F_ISSET(sp, SC_EX | SC_SCR_EXWROTE)); } /* diff --git a/ex/ex_cd.c b/ex/ex_cd.c index 3307c7b6306b..30a596f3c365 100644 --- a/ex/ex_cd.c +++ b/ex/ex_cd.c @@ -10,11 +10,11 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_cd.c 10.10 (Berkeley) 8/12/96"; +static const char sccsid[] = "$Id: ex_cd.c,v 10.13 2012/04/12 06:28:27 zy Exp $"; #endif /* not lint */ -#include #include +#include #include #include @@ -34,15 +34,14 @@ static const char sccsid[] = "@(#)ex_cd.c 10.10 (Berkeley) 8/12/96"; * PUBLIC: int ex_cd __P((SCR *, EXCMD *)); */ int -ex_cd(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_cd(SCR *sp, EXCMD *cmdp) { struct passwd *pw; ARGS *ap; - CHAR_T savech; - char *dir, *p, *t; /* XXX: END OF THE STACK, DON'T TRUST GETCWD. */ - char buf[MAXPATHLEN * 2]; + int savech; + char *dir, *p, *t; + char *buf; + size_t dlen; /* * !!! @@ -71,7 +70,8 @@ ex_cd(sp, cmdp) } break; case 1: - dir = cmdp->argv[0]->bp; + INT2CHAR(sp, cmdp->argv[0]->bp, cmdp->argv[0]->len + 1, + dir, dlen); break; default: abort(); @@ -91,33 +91,35 @@ ex_cd(sp, cmdp) */ if (cmdp->argc == 0 || (ap = cmdp->argv[0])->bp[0] == '/' || - ap->len == 1 && ap->bp[0] == '.' || - ap->len >= 2 && ap->bp[0] == '.' && ap->bp[1] == '.' && - (ap->bp[2] == '/' || ap->bp[2] == '\0')) + (ap->len == 1 && ap->bp[0] == '.') || + (ap->len >= 2 && ap->bp[0] == '.' && ap->bp[1] == '.' && + (ap->bp[2] == '/' || ap->bp[2] == '\0'))) goto err; /* Try the O_CDPATH option values. */ for (p = t = O_STR(sp, O_CDPATH);; ++p) if (*p == '\0' || *p == ':') { /* - * Empty strings specify ".". The only way to get an - * empty string is a leading colon, colons in a row, - * or a trailing colon. Or, to put it the other way, - * if the length is 1 or less, then we're dealing with - * ":XXX", "XXX::XXXX" , "XXX:", or "". Since we've - * already tried dot, we ignore tham all. + * Ignore the empty strings and ".", since we've already + * tried the current directory. */ - if (t < p - 1) { + if (t < p && (p - t != 1 || *t != '.')) { savech = *p; *p = '\0'; - (void)snprintf(buf, - sizeof(buf), "%s/%s", t, dir); + if ((buf = join(t, dir)) == NULL) { + msgq(sp, M_SYSERR, NULL); + return (1); + } *p = savech; if (!chdir(buf)) { - if (getcwd(buf, sizeof(buf)) != NULL) + free(buf); + if ((buf = getcwd(NULL, 0)) != NULL) { msgq_str(sp, M_INFO, buf, "122|New current directory: %s"); + free(buf); + } return (0); } + free(buf); } t = p + 1; if (*p == '\0') diff --git a/ex/ex_cmd.c b/ex/ex_cmd.c index 8f7fc8da7a13..87e32d2a4cf5 100644 --- a/ex/ex_cmd.c +++ b/ex/ex_cmd.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_cmd.c 10.20 (Berkeley) 10/10/96"; +static const char sccsid[] = "$Id: ex_cmd.c,v 10.26 2011/07/14 15:11:16 zy Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -50,92 +51,92 @@ static const char sccsid[] = "@(#)ex_cmd.c 10.20 (Berkeley) 10/10/96"; */ EXCMDLIST const cmds[] = { /* C_SCROLL */ - {"\004", ex_pr, E_ADDR2, + {L("\004"), ex_pr, E_ADDR2, "", "^D", "scroll lines"}, /* C_BANG */ - {"!", ex_bang, E_ADDR2_NONE | E_SECURE, + {L("!"), ex_bang, E_ADDR2_NONE|E_SECURE, "S", "[line [,line]] ! command", "filter lines through commands or run commands"}, /* C_HASH */ - {"#", ex_number, E_ADDR2|E_CLRFLAG, + {L("#"), ex_number, E_ADDR2|E_CLRFLAG, "ca1", "[line [,line]] # [count] [l]", "display numbered lines"}, /* C_SUBAGAIN */ - {"&", ex_subagain, E_ADDR2, + {L("&"), ex_subagain, E_ADDR2|E_ADDR_ZERO, "s", "[line [,line]] & [cgr] [count] [#lp]", "repeat the last subsitution"}, /* C_STAR */ - {"*", ex_at, 0, + {L("*"), ex_at, 0, "b", "* [buffer]", "execute a buffer"}, /* C_SHIFTL */ - {"<", ex_shiftl, E_ADDR2|E_AUTOPRINT, + {L("<"), ex_shiftl, E_ADDR2|E_AUTOPRINT, "ca1", "[line [,line]] <[<...] [count] [flags]", "shift lines left"}, /* C_EQUAL */ - {"=", ex_equal, E_ADDR1|E_ADDR_ZERO|E_ADDR_ZERODEF, + {L("="), ex_equal, E_ADDR1|E_ADDR_ZERO|E_ADDR_ZERODEF, "1", "[line] = [flags]", "display line number"}, /* C_SHIFTR */ - {">", ex_shiftr, E_ADDR2|E_AUTOPRINT, + {L(">"), ex_shiftr, E_ADDR2|E_AUTOPRINT, "ca1", "[line [,line]] >[>...] [count] [flags]", "shift lines right"}, /* C_AT */ - {"@", ex_at, E_ADDR2, + {L("@"), ex_at, E_ADDR2, "b", "@ [buffer]", "execute a buffer"}, /* C_APPEND */ - {"append", ex_append, E_ADDR1|E_ADDR_ZERO|E_ADDR_ZERODEF, + {L("append"), ex_append, E_ADDR1|E_ADDR_ZERO|E_ADDR_ZERODEF, "!", "[line] a[ppend][!]", "append input to a line"}, /* C_ABBR */ - {"abbreviate", ex_abbr, 0, + {L("abbreviate"), ex_abbr, 0, "W", "ab[brev] [word replace]", "specify an input abbreviation"}, /* C_ARGS */ - {"args", ex_args, 0, + {L("args"), ex_args, 0, "", "ar[gs]", "display file argument list"}, /* C_BG */ - {"bg", ex_bg, E_VIONLY, + {L("bg"), ex_bg, E_VIONLY, "", "bg", "put a foreground screen into the background"}, /* C_CHANGE */ - {"change", ex_change, E_ADDR2|E_ADDR_ZERODEF, + {L("change"), ex_change, E_ADDR2|E_ADDR_ZERODEF, "!ca", "[line [,line]] c[hange][!] [count]", "change lines to input"}, /* C_CD */ - {"cd", ex_cd, 0, + {L("cd"), ex_cd, 0, "!f1o", "cd[!] [directory]", "change the current directory"}, /* C_CHDIR */ - {"chdir", ex_cd, 0, + {L("chdir"), ex_cd, 0, "!f1o", "chd[ir][!] [directory]", "change the current directory"}, /* C_COPY */ - {"copy", ex_copy, E_ADDR2|E_AUTOPRINT, + {L("copy"), ex_copy, E_ADDR2|E_AUTOPRINT, "l1", "[line [,line]] co[py] line [flags]", "copy lines elsewhere in the file"}, /* C_CSCOPE */ - {"cscope", ex_cscope, 0, + {L("cscope"), ex_cscope, 0, "!s", "cs[cope] command [args]", "create a set of tags using a cscope command"}, @@ -145,160 +146,148 @@ EXCMDLIST const cmds[] = { * in ex_cmd() (the ex parser). Read through the comments there, first. */ /* C_DELETE */ - {"delete", ex_delete, E_ADDR2|E_AUTOPRINT, + {L("delete"), ex_delete, E_ADDR2|E_AUTOPRINT, "bca1", "[line [,line]] d[elete][flags] [buffer] [count] [flags]", "delete lines from the file"}, /* C_DISPLAY */ - {"display", ex_display, 0, + {L("display"), ex_display, 0, "w1r", "display b[uffers] | c[onnections] | s[creens] | t[ags]", "display buffers, connections, screens or tags"}, /* C_EDIT */ - {"edit", ex_edit, E_NEWSCREEN, + {L("edit"), ex_edit, E_NEWSCREEN, "f1o", "[Ee][dit][!] [+cmd] [file]", "begin editing another file"}, /* C_EX */ - {"ex", ex_edit, E_NEWSCREEN, + {L("ex"), ex_edit, E_NEWSCREEN, "f1o", "[Ee]x[!] [+cmd] [file]", "begin editing another file"}, /* C_EXUSAGE */ - {"exusage", ex_usage, 0, + {L("exusage"), ex_usage, 0, "w1o", "[exu]sage [command]", "display ex command usage statement"}, /* C_FILE */ - {"file", ex_file, 0, + {L("file"), ex_file, 0, "f1o", "f[ile] [name]", "display (and optionally set) file name"}, /* C_FG */ - {"fg", ex_fg, E_NEWSCREEN|E_VIONLY, + {L("fg"), ex_fg, E_NEWSCREEN|E_VIONLY, "f1o", "[Ff]g [file]", "bring a backgrounded screen into the foreground"}, /* C_GLOBAL */ - {"global", ex_global, E_ADDR2_ALL, + {L("global"), ex_global, E_ADDR2_ALL, "!s", "[line [,line]] g[lobal][!] [;/]RE[;/] [commands]", "execute a global command on lines matching an RE"}, /* C_HELP */ - {"help", ex_help, 0, + {L("help"), ex_help, 0, "", "he[lp]", "display help statement"}, /* C_INSERT */ - {"insert", ex_insert, E_ADDR1|E_ADDR_ZERO|E_ADDR_ZERODEF, + {L("insert"), ex_insert, E_ADDR1|E_ADDR_ZERO|E_ADDR_ZERODEF, "!", "[line] i[nsert][!]", "insert input before a line"}, /* C_JOIN */ - {"join", ex_join, E_ADDR2|E_AUTOPRINT, + {L("join"), ex_join, E_ADDR2|E_AUTOPRINT, "!ca1", "[line [,line]] j[oin][!] [count] [flags]", "join lines into a single line"}, /* C_K */ - {"k", ex_mark, E_ADDR1, + {L("k"), ex_mark, E_ADDR1, "w1r", "[line] k key", "mark a line position"}, /* C_LIST */ - {"list", ex_list, E_ADDR2|E_CLRFLAG, + {L("list"), ex_list, E_ADDR2|E_CLRFLAG, "ca1", "[line [,line]] l[ist] [count] [#]", "display lines in an unambiguous form"}, /* C_MOVE */ - {"move", ex_move, E_ADDR2|E_AUTOPRINT, + {L("move"), ex_move, E_ADDR2|E_AUTOPRINT, "l", "[line [,line]] m[ove] line", "move lines elsewhere in the file"}, /* C_MARK */ - {"mark", ex_mark, E_ADDR1, + {L("mark"), ex_mark, E_ADDR1, "w1r", "[line] ma[rk] key", "mark a line position"}, /* C_MAP */ - {"map", ex_map, 0, + {L("map"), ex_map, 0, "!W", "map[!] [keys replace]", "map input or commands to one or more keys"}, /* C_MKEXRC */ - {"mkexrc", ex_mkexrc, 0, + {L("mkexrc"), ex_mkexrc, 0, "!f1r", "mkexrc[!] file", "write a .exrc file"}, /* C_NEXT */ - {"next", ex_next, E_NEWSCREEN, + {L("next"), ex_next, E_NEWSCREEN, "!fN", "[Nn][ext][!] [+cmd] [file ...]", "edit (and optionally specify) the next file"}, /* C_NUMBER */ - {"number", ex_number, E_ADDR2|E_CLRFLAG, + {L("number"), ex_number, E_ADDR2|E_CLRFLAG, "ca1", "[line [,line]] nu[mber] [count] [l]", "change display to number lines"}, /* C_OPEN */ - {"open", ex_open, E_ADDR1, + {L("open"), ex_open, E_ADDR1, "s", "[line] o[pen] [/RE/] [flags]", "enter \"open\" mode (not implemented)"}, /* C_PRINT */ - {"print", ex_pr, E_ADDR2|E_CLRFLAG, + {L("print"), ex_pr, E_ADDR2|E_CLRFLAG, "ca1", "[line [,line]] p[rint] [count] [#l]", "display lines"}, -/* C_PERLCMD */ - {"perl", ex_perl, E_ADDR2_ALL|E_ADDR_ZERO| - E_ADDR_ZERODEF|E_SECURE, - "s", - "pe[rl] cmd", - "run the perl interpreter with the command"}, -/* C_PERLDOCMD */ - {"perldo", ex_perl, E_ADDR2_ALL|E_ADDR_ZERO| - E_ADDR_ZERODEF|E_SECURE, - "s", - "perld[o] cmd", - "run the perl interpreter with the command, on each line"}, /* C_PRESERVE */ - {"preserve", ex_preserve, 0, + {L("preserve"), ex_preserve, 0, "", "pre[serve]", "preserve an edit session for recovery"}, /* C_PREVIOUS */ - {"previous", ex_prev, E_NEWSCREEN, + {L("previous"), ex_prev, E_NEWSCREEN, "!", "[Pp]rev[ious][!]", "edit the previous file in the file argument list"}, /* C_PUT */ - {"put", ex_put, + {L("put"), ex_put, E_ADDR1|E_AUTOPRINT|E_ADDR_ZERO|E_ADDR_ZERODEF, "b", "[line] pu[t] [buffer]", "append a cut buffer to the line"}, /* C_QUIT */ - {"quit", ex_quit, 0, + {L("quit"), ex_quit, 0, "!", "q[uit][!]", "exit ex/vi"}, /* C_READ */ - {"read", ex_read, E_ADDR1|E_ADDR_ZERO|E_ADDR_ZERODEF, + {L("read"), ex_read, E_ADDR1|E_ADDR_ZERO|E_ADDR_ZERODEF, "s", "[line] r[ead] [!cmd | [file]]", "append input from a command or file to the line"}, /* C_RECOVER */ - {"recover", ex_recover, 0, + {L("recover"), ex_recover, 0, "!f1r", "recover[!] file", "recover a saved file"}, /* C_RESIZE */ - {"resize", ex_resize, E_VIONLY, + {L("resize"), ex_resize, E_VIONLY, "c+", "resize [+-]rows", "grow or shrink the current screen"}, /* C_REWIND */ - {"rewind", ex_rew, 0, + {L("rewind"), ex_rew, 0, "!", "rew[ind][!]", "re-edit all the files in the file argument list"}, @@ -308,148 +297,147 @@ EXCMDLIST const cmds[] = { * in ex_cmd() (the ex parser). Read through the comments there, first. */ /* C_SUBSTITUTE */ - {"s", ex_s, E_ADDR2, + {L("s"), ex_s, E_ADDR2|E_ADDR_ZERO, "s", "[line [,line]] s [[/;]RE[/;]repl[/;] [cgr] [count] [#lp]]", "substitute on lines matching an RE"}, /* C_SCRIPT */ - {"script", ex_script, E_SECURE, + {L("script"), ex_script, E_SECURE, "!f1o", "sc[ript][!] [file]", "run a shell in a screen"}, /* C_SET */ - {"set", ex_set, 0, + {L("set"), ex_set, 0, "wN", "se[t] [option[=[value]]...] [nooption ...] [option? ...] [all]", "set options (use \":set all\" to see all options)"}, /* C_SHELL */ - {"shell", ex_shell, E_SECURE, + {L("shell"), ex_shell, E_SECURE, "", "sh[ell]", "suspend editing and run a shell"}, /* C_SOURCE */ - {"source", ex_source, 0, + {L("source"), ex_source, 0, "f1r", "so[urce] file", "read a file of ex commands"}, /* C_STOP */ - {"stop", ex_stop, E_SECURE, + {L("stop"), ex_stop, E_SECURE, "!", "st[op][!]", "suspend the edit session"}, /* C_SUSPEND */ - {"suspend", ex_stop, E_SECURE, + {L("suspend"), ex_stop, E_SECURE, "!", "su[spend][!]", "suspend the edit session"}, /* C_T */ - {"t", ex_copy, E_ADDR2|E_AUTOPRINT, + {L("t"), ex_copy, E_ADDR2|E_AUTOPRINT, "l1", "[line [,line]] t line [flags]", "copy lines elsewhere in the file"}, /* C_TAG */ - {"tag", ex_tag_push, E_NEWSCREEN, + {L("tag"), ex_tag_push, E_NEWSCREEN, "!w1o", "[Tt]a[g][!] [string]", "edit the file containing the tag"}, /* C_TAGNEXT */ - {"tagnext", ex_tag_next, 0, + {L("tagnext"), ex_tag_next, 0, "!", "tagn[ext][!]", "move to the next tag"}, /* C_TAGPOP */ - {"tagpop", ex_tag_pop, 0, + {L("tagpop"), ex_tag_pop, 0, "!w1o", "tagp[op][!] [number | file]", "return to the previous group of tags"}, /* C_TAGPREV */ - {"tagprev", ex_tag_prev, 0, + {L("tagprev"), ex_tag_prev, 0, "!", "tagpr[ev][!]", "move to the previous tag"}, /* C_TAGTOP */ - {"tagtop", ex_tag_top, 0, + {L("tagtop"), ex_tag_top, 0, "!", "tagt[op][!]", "discard all tags"}, -/* C_TCLCMD */ - {"tcl", ex_tcl, E_ADDR2_ALL|E_ADDR_ZERO| - E_ADDR_ZERODEF|E_SECURE, - "s", - "tc[l] cmd", - "run the tcl interpreter with the command"}, /* C_UNDO */ - {"undo", ex_undo, E_AUTOPRINT, + {L("undo"), ex_undo, E_AUTOPRINT, "", "u[ndo]", "undo the most recent change"}, /* C_UNABBREVIATE */ - {"unabbreviate",ex_unabbr, 0, + {L("unabbreviate"),ex_unabbr, 0, "w1r", "una[bbrev] word", "delete an abbreviation"}, /* C_UNMAP */ - {"unmap", ex_unmap, 0, + {L("unmap"), ex_unmap, 0, "!w1r", "unm[ap][!] word", "delete an input or command map"}, /* C_V */ - {"v", ex_v, E_ADDR2_ALL, + {L("v"), ex_v, E_ADDR2_ALL, "s", "[line [,line]] v [;/]RE[;/] [commands]", "execute a global command on lines NOT matching an RE"}, /* C_VERSION */ - {"version", ex_version, 0, + {L("version"), ex_version, 0, "", "version", "display the program version information"}, /* C_VISUAL_EX */ - {"visual", ex_visual, E_ADDR1|E_ADDR_ZERODEF, + {L("visual"), ex_visual, E_ADDR1|E_ADDR_ZERODEF, "2c11", "[line] vi[sual] [-|.|+|^] [window_size] [flags]", "enter visual (vi) mode from ex mode"}, /* C_VISUAL_VI */ - {"visual", ex_edit, E_NEWSCREEN, + {L("visual"), ex_edit, E_NEWSCREEN, "f1o", "[Vv]i[sual][!] [+cmd] [file]", "edit another file (from vi mode only)"}, /* C_VIUSAGE */ - {"viusage", ex_viusage, 0, + {L("viusage"), ex_viusage, 0, "w1o", "[viu]sage [key]", "display vi key usage statement"}, +/* C_VSPLIT */ + {L("vsplit"), ex_edit, E_VIONLY, + "f1o", + "vs[plit] [+cmd] [file]", + "split the current screen vertically"}, /* C_WRITE */ - {"write", ex_write, E_ADDR2_ALL|E_ADDR_ZERODEF, + {L("write"), ex_write, E_ADDR2_ALL|E_ADDR_ZERODEF, "!s", "[line [,line]] w[rite][!] [ !cmd | [>>] [file]]", "write the file"}, /* C_WN */ - {"wn", ex_wn, E_ADDR2_ALL|E_ADDR_ZERODEF, + {L("wn"), ex_wn, E_ADDR2_ALL|E_ADDR_ZERODEF, "!s", "[line [,line]] wn[!] [>>] [file]", "write the file and switch to the next file"}, /* C_WQ */ - {"wq", ex_wq, E_ADDR2_ALL|E_ADDR_ZERODEF, + {L("wq"), ex_wq, E_ADDR2_ALL|E_ADDR_ZERODEF, "!s", "[line [,line]] wq[!] [>>] [file]", "write the file and exit"}, /* C_XIT */ - {"xit", ex_xit, E_ADDR2_ALL|E_ADDR_ZERODEF, + {L("xit"), ex_xit, E_ADDR2_ALL|E_ADDR_ZERODEF, "!f1o", "[line [,line]] x[it][!] [file]", "exit"}, /* C_YANK */ - {"yank", ex_yank, E_ADDR2, + {L("yank"), ex_yank, E_ADDR2, "bca", "[line [,line]] ya[nk] [buffer] [count]", "copy lines to a cut buffer"}, /* C_Z */ - {"z", ex_z, E_ADDR1, + {L("z"), ex_z, E_ADDR1, "3c01", "[line] z [-|.|+|^|=] [count] [flags]", "display different screens of the file"}, /* C_SUBTILDE */ - {"~", ex_subtilde, E_ADDR2, + {L("~"), ex_subtilde, E_ADDR2|E_ADDR_ZERO, "s", "[line [,line]] ~ [cgr] [count] [#lp]", "replace previous RE with previous replacement string,"}, diff --git a/ex/ex_cscope.c b/ex/ex_cscope.c index c2fa0a5c454b..afc7fa93ee8c 100644 --- a/ex/ex_cscope.c +++ b/ex/ex_cscope.c @@ -10,14 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_cscope.c 10.13 (Berkeley) 9/15/96"; +static const char sccsid[] = "$Id: ex_cscope.c,v 10.25 2012/10/04 09:23:03 zy Exp $"; #endif /* not lint */ -#include -#include /* XXX: param.h may not have included types.h */ +#include #include #include -#include #include #include @@ -25,6 +23,7 @@ static const char sccsid[] = "@(#)ex_cscope.c 10.13 (Berkeley) 9/15/96"; #include #include #include +#include #include #include #include @@ -62,15 +61,15 @@ find c|d|e|f|g|i|s|t buffer|pattern\n\ s: find all uses of name\n\ t: find assignments to name" -static int cscope_add __P((SCR *, EXCMD *, char *)); -static int cscope_find __P((SCR *, EXCMD*, char *)); -static int cscope_help __P((SCR *, EXCMD *, char *)); -static int cscope_kill __P((SCR *, EXCMD *, char *)); -static int cscope_reset __P((SCR *, EXCMD *, char *)); +static int cscope_add __P((SCR *, EXCMD *, CHAR_T *)); +static int cscope_find __P((SCR *, EXCMD*, CHAR_T *)); +static int cscope_help __P((SCR *, EXCMD *, CHAR_T *)); +static int cscope_kill __P((SCR *, EXCMD *, CHAR_T *)); +static int cscope_reset __P((SCR *, EXCMD *, CHAR_T *)); typedef struct _cc { char *name; - int (*function) __P((SCR *, EXCMD *, char *)); + int (*function) __P((SCR *, EXCMD *, CHAR_T *)); char *help_msg; char *usage_msg; } CC; @@ -108,14 +107,15 @@ static int terminate __P((SCR *, CSC *, int)); * PUBLIC: int ex_cscope __P((SCR *, EXCMD *)); */ int -ex_cscope(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_cscope(SCR *sp, EXCMD *cmdp) { CC const *ccp; EX_PRIVATE *exp; int i; - char *cmd, *p; + CHAR_T *cmd; + CHAR_T *p; + char *np; + size_t nlen; /* Initialize the default cscope directories. */ exp = EXP(sp); @@ -139,7 +139,8 @@ ex_cscope(sp, cmdp) for (; *p && isspace(*p); ++p); } - if ((ccp = lookup_ccmd(cmd)) == NULL) { + INT2CHAR(sp, cmd, STRLEN(cmd) + 1, np, nlen); + if ((ccp = lookup_ccmd(np)) == NULL) { usage: msgq(sp, M_ERR, "309|Use \"cscope help\" for help"); return (1); } @@ -153,12 +154,12 @@ usage: msgq(sp, M_ERR, "309|Use \"cscope help\" for help"); * Initialize the cscope package. */ static int -start_cscopes(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +start_cscopes(SCR *sp, EXCMD *cmdp) { size_t blen, len; char *bp, *cscopes, *p, *t; + CHAR_T *wp; + size_t wlen; /* * EXTENSION #1: @@ -175,12 +176,14 @@ start_cscopes(sp, cmdp) if ((cscopes = getenv("CSCOPE_DIRS")) == NULL) return (0); len = strlen(cscopes); - GET_SPACE_RET(sp, bp, blen, len); + GET_SPACE_RETC(sp, bp, blen, len); memcpy(bp, cscopes, len + 1); for (cscopes = t = bp; (p = strsep(&t, "\t :")) != NULL;) - if (*p != '\0') - (void)cscope_add(sp, cmdp, p); + if (*p != '\0') { + CHAR2INT(sp, p, strlen(p) + 1, wp, wlen); + (void)cscope_add(sp, cmdp, wp); + } FREE_SPACE(sp, bp, blen); return (0); @@ -191,17 +194,16 @@ start_cscopes(sp, cmdp) * The cscope add command. */ static int -cscope_add(sp, cmdp, dname) - SCR *sp; - EXCMD *cmdp; - char *dname; +cscope_add(SCR *sp, EXCMD *cmdp, CHAR_T *dname) { struct stat sb; EX_PRIVATE *exp; CSC *csc; size_t len; int cur_argc; - char *dbname, path[MAXPATHLEN]; + char *dbname, *path; + char *np = NULL; + size_t nlen; exp = EXP(sp); @@ -211,8 +213,9 @@ cscope_add(sp, cmdp, dname) * >1 additional args: object, too many args. */ cur_argc = cmdp->argc; - if (argv_exp2(sp, cmdp, dname, strlen(dname))) + if (argv_exp2(sp, cmdp, dname, STRLEN(dname))) { return (1); + } if (cmdp->argc == cur_argc) { (void)csc_help(sp, "add"); return (1); @@ -220,10 +223,12 @@ cscope_add(sp, cmdp, dname) if (cmdp->argc == cur_argc + 1) dname = cmdp->argv[cur_argc]->bp; else { - ex_emsg(sp, dname, EXM_FILECOUNT); + ex_emsg(sp, np, EXM_FILECOUNT); return (1); } + INT2CHAR(sp, dname, STRLEN(dname)+1, np, nlen); + /* * The user can specify a specific file (so they can have multiple * Cscope databases in a single directory) or a directory. If the @@ -231,28 +236,36 @@ cscope_add(sp, cmdp, dname) * standard database file name and try again. Store the directory * name regardless so that we can use it as a base for searches. */ - if (stat(dname, &sb)) { - msgq(sp, M_SYSERR, dname); + if (stat(np, &sb)) { + msgq(sp, M_SYSERR, "%s", np); return (1); } if (S_ISDIR(sb.st_mode)) { - (void)snprintf(path, sizeof(path), - "%s/%s", dname, CSCOPE_DBFILE); - if (stat(path, &sb)) { - msgq(sp, M_SYSERR, path); + if ((path = join(np, CSCOPE_DBFILE)) == NULL) { + msgq(sp, M_SYSERR, NULL); return (1); } + if (stat(path, &sb)) { + msgq(sp, M_SYSERR, "%s", path); + free(path); + return (1); + } + free(path); dbname = CSCOPE_DBFILE; - } else if ((dbname = strrchr(dname, '/')) != NULL) + } else if ((dbname = strrchr(np, '/')) != NULL) *dbname++ = '\0'; + else { + dbname = np; + np = "."; + } /* Allocate a cscope connection structure and initialize its fields. */ - len = strlen(dname); + len = strlen(np); CALLOC_RET(sp, csc, CSC *, 1, sizeof(CSC) + len); csc->dname = csc->buf; csc->dlen = len; - memcpy(csc->dname, dname, len); - csc->mtime = sb.st_mtime; + memcpy(csc->dname, np, len); + csc->mtim = sb.st_mtimespec; /* Get the search paths for the cscope. */ if (get_paths(sp, csc)) @@ -267,15 +280,10 @@ cscope_add(sp, cmdp, dname) * on error, we have to call terminate, which expects the csc to * be on the chain. */ - LIST_INSERT_HEAD(&exp->cscq, csc, q); + SLIST_INSERT_HEAD(exp->cscq, csc, q); /* Read the initial prompt from the cscope to make sure it's okay. */ - if (read_prompt(sp, csc)) { - terminate(sp, csc, 0); - return (1); - } - - return (0); + return read_prompt(sp, csc); err: free(csc); return (1); @@ -287,14 +295,12 @@ err: free(csc); * cscope database. */ static int -get_paths(sp, csc) - SCR *sp; - CSC *csc; +get_paths(SCR *sp, CSC *csc) { struct stat sb; int fd, nentries; size_t len; - char *p, **pathp, buf[MAXPATHLEN * 2]; + char *p, **pathp, *buf; /* * EXTENSION #2: @@ -308,7 +314,10 @@ get_paths(sp, csc) * directory. To fix this, rewrite the each path using the cscope * directory as a prefix. */ - (void)snprintf(buf, sizeof(buf), "%s/%s", csc->dname, CSCOPE_PATHS); + if ((buf = join(csc->dname, CSCOPE_PATHS)) == NULL) { + msgq(sp, M_SYSERR, NULL); + return (1); + } if (stat(buf, &sb) == 0) { /* Read in the CSCOPE_PATHS file. */ len = sb.st_size; @@ -318,9 +327,11 @@ get_paths(sp, csc) msgq_str(sp, M_SYSERR, buf, "%s"); if (fd >= 0) (void)close(fd); + free(buf); return (1); } (void)close(fd); + free(buf); csc->pbuf[len] = '\0'; /* Count up the entries. */ @@ -336,6 +347,7 @@ get_paths(sp, csc) *pathp++ = p; return (0); } + free(buf); /* * If the CSCOPE_PATHS file doesn't exist, we look for files @@ -362,24 +374,22 @@ get_paths(sp, csc) * Fork off the cscope process. */ static int -run_cscope(sp, csc, dbname) - SCR *sp; - CSC *csc; - char *dbname; +run_cscope(SCR *sp, CSC *csc, char *dbname) { int to_cs[2], from_cs[2]; - char cmd[MAXPATHLEN * 2]; + char *cmd; /* * Cscope reads from to_cs[0] and writes to from_cs[1]; vi reads from * from_cs[0] and writes to to_cs[1]. */ - to_cs[0] = to_cs[1] = from_cs[0] = from_cs[0] = -1; + to_cs[0] = to_cs[1] = from_cs[0] = from_cs[1] = -1; if (pipe(to_cs) < 0 || pipe(from_cs) < 0) { msgq(sp, M_SYSERR, "pipe"); goto err; } switch (csc->pid = vfork()) { + char *dn, *dbn; case -1: msgq(sp, M_SYSERR, "vfork"); err: if (to_cs[0] != -1) @@ -401,11 +411,23 @@ err: if (to_cs[0] != -1) (void)close(from_cs[0]); /* Run the cscope command. */ -#define CSCOPE_CMD_FMT "cd '%s' && exec cscope -dl -f %s" - (void)snprintf(cmd, sizeof(cmd), - CSCOPE_CMD_FMT, csc->dname, dbname); - (void)execl(_PATH_BSHELL, "sh", "-c", cmd, NULL); +#define CSCOPE_CMD_FMT "cd %s && exec cscope -dl -f %s" + if ((dn = quote(csc->dname)) == NULL) + goto nomem; + if ((dbn = quote(dbname)) == NULL) { + free(dn); + goto nomem; + } + (void)asprintf(&cmd, CSCOPE_CMD_FMT, dn, dbn); + free(dbn); + free(dn); + if (cmd == NULL) { +nomem: msgq(sp, M_SYSERR, NULL); + _exit (1); + } + (void)execl(_PATH_BSHELL, "sh", "-c", cmd, (char *)NULL); msgq_str(sp, M_SYSERR, cmd, "execl: %s"); + free(cmd); _exit (127); /* NOTREACHED */ default: /* parent. */ @@ -431,10 +453,7 @@ err: if (to_cs[0] != -1) * The cscope find command. */ static int -cscope_find(sp, cmdp, pattern) - SCR *sp; - EXCMD *cmdp; - char *pattern; +cscope_find(SCR *sp, EXCMD *cmdp, CHAR_T *pattern) { CSC *csc, *csc_next; EX_PRIVATE *exp; @@ -444,11 +463,13 @@ cscope_find(sp, cmdp, pattern) recno_t lno; size_t cno, search; int force, istmp, matches; + char *np = NULL; + size_t nlen; exp = EXP(sp); /* Check for connections. */ - if (exp->cscq.lh_first == NULL) { + if (SLIST_EMPTY(exp->cscq)) { msgq(sp, M_ERR, "310|No cscope connections running"); return (1); } @@ -460,20 +481,24 @@ cscope_find(sp, cmdp, pattern) */ rtp = NULL; rtqp = NULL; - if (exp->tq.cqh_first == (void *)&exp->tq) { + if (TAILQ_EMPTY(exp->tq)) { /* Initialize the `local context' tag queue structure. */ CALLOC_GOTO(sp, rtqp, TAGQ *, 1, sizeof(TAGQ)); - CIRCLEQ_INIT(&rtqp->tagq); + TAILQ_INIT(rtqp->tagq); /* Initialize and link in its tag structure. */ CALLOC_GOTO(sp, rtp, TAG *, 1, sizeof(TAG)); - CIRCLEQ_INSERT_HEAD(&rtqp->tagq, rtp, q); - rtqp->current = rtp; + TAILQ_INSERT_HEAD(rtqp->tagq, rtp, q); + rtqp->current = rtp; } /* Create the cscope command. */ - if ((tqp = create_cs_cmd(sp, pattern, &search)) == NULL) + INT2CHAR(sp, pattern, STRLEN(pattern) + 1, np, nlen); + np = strdup(np); + if ((tqp = create_cs_cmd(sp, np, &search)) == NULL) goto err; + if (np != NULL) + free(np); /* * Stick the current context in a convenient place, we'll lose it @@ -486,35 +511,32 @@ cscope_find(sp, cmdp, pattern) /* Search all open connections for a match. */ matches = 0; - for (csc = exp->cscq.lh_first; csc != NULL; csc = csc_next) { - /* Copy csc->q.lh_next here in case csc is killed. */ - csc_next = csc->q.le_next; - + /* Copy next connect here in case csc is killed. */ + SLIST_FOREACH_SAFE(csc, exp->cscq, q, csc_next) { /* * Send the command to the cscope program. (We skip the * first two bytes of the command, because we stored the * search cscope command character and a leading space * there.) */ - (void)fprintf(csc->to_fp, "%d%s\n", search, tqp->tag + 2); + (void)fprintf(csc->to_fp, "%lu%s\n", search, tqp->tag + 2); (void)fflush(csc->to_fp); /* Read the output. */ - if (parse(sp, csc, tqp, &matches)) { - if (rtqp != NULL) - free(rtqp); - tagq_free(sp, tqp); - return (1); - } + if (parse(sp, csc, tqp, &matches)) + goto nomatch; } if (matches == 0) { msgq(sp, M_INFO, "278|No matches for query"); - return (0); +nomatch: if (rtp != NULL) + free(rtp); + if (rtqp != NULL) + free(rtqp); + tagq_free(sp, tqp); + return (1); } - tqp->current = tqp->tagq.cqh_first; - /* Try to switch to the first tag. */ force = FL_ISSET(cmdp->iflags, E_C_FORCE); if (F_ISSET(cmdp, E_NEWSCREEN)) { @@ -533,13 +555,13 @@ cscope_find(sp, cmdp, pattern) * in place, so we can pop all the way back to the current mark. * Note, it doesn't point to much of anything, it's a placeholder. */ - if (exp->tq.cqh_first == (void *)&exp->tq) { - CIRCLEQ_INSERT_HEAD(&exp->tq, rtqp, q); + if (TAILQ_EMPTY(exp->tq)) { + TAILQ_INSERT_HEAD(exp->tq, rtqp, q); } else - rtqp = exp->tq.cqh_first; + rtqp = TAILQ_FIRST(exp->tq); /* Link the current TAGQ structure into place. */ - CIRCLEQ_INSERT_HEAD(&exp->tq, tqp, q); + TAILQ_INSERT_HEAD(exp->tq, tqp, q); (void)cscope_search(sp, tqp, tqp->current); @@ -570,6 +592,8 @@ cscope_find(sp, cmdp, pattern) free(rtqp); if (rtp != NULL) free(rtp); + if (np != NULL) + free(np); return (1); } @@ -578,10 +602,7 @@ cscope_find(sp, cmdp, pattern) * Build a cscope command, creating and initializing the base TAGQ. */ static TAGQ * -create_cs_cmd(sp, pattern, searchp) - SCR *sp; - char *pattern; - size_t *searchp; +create_cs_cmd(SCR *sp, char *pattern, size_t *searchp) { CB *cbp; TAGQ *tqp; @@ -601,8 +622,8 @@ create_cs_cmd(sp, pattern, searchp) goto usage; /* Skip leading blanks, check for command character. */ - for (; isblank(pattern[0]); ++pattern); - if (pattern[0] == '\0' || !isblank(pattern[1])) + for (; cmdskip(pattern[0]); ++pattern); + if (pattern[0] == '\0' || !cmdskip(pattern[1])) goto usage; for (*searchp = 0, p = CSCOPE_QUERIES; *p != '\0' && *p != pattern[0]; ++*searchp, ++p); @@ -614,7 +635,7 @@ create_cs_cmd(sp, pattern, searchp) } /* Skip characters to the pattern. */ - for (p = pattern + 1; *p != '\0' && isblank(*p); ++p); + for (p = pattern + 1; *p != '\0' && cmdskip(*p); ++p); if (*p == '\0') { usage: (void)csc_help(sp, "find"); return (NULL); @@ -625,8 +646,8 @@ usage: (void)csc_help(sp, "find"); if (p[0] == '"' && p[1] != '\0' && p[2] == '\0') CBNAME(sp, cbp, p[1]); if (cbp != NULL) { - p = cbp->textq.cqh_first->lb; - tlen = cbp->textq.cqh_first->len; + INT2CHAR(sp, TAILQ_FIRST(cbp->textq)->lb, + TAILQ_FIRST(cbp->textq)->len, p, tlen); } else tlen = strlen(p); @@ -634,7 +655,7 @@ usage: (void)csc_help(sp, "find"); CALLOC(sp, tqp, TAGQ *, 1, sizeof(TAGQ) + tlen + 3); if (tqp == NULL) return (NULL); - CIRCLEQ_INIT(&tqp->tagq); + TAILQ_INIT(tqp->tagq); tqp->tag = tqp->buf; tqp->tag[0] = pattern[0]; tqp->tag[1] = ' '; @@ -651,17 +672,15 @@ usage: (void)csc_help(sp, "find"); * Parse the cscope output. */ static int -parse(sp, csc, tqp, matchesp) - SCR *sp; - CSC *csc; - TAGQ *tqp; - int *matchesp; +parse(SCR *sp, CSC *csc, TAGQ *tqp, int *matchesp) { TAG *tp; - recno_t slno; - size_t dlen, nlen, slen; - int ch, i, isolder, nlines; - char *dname, *name, *search, *p, *t, dummy[2], buf[2048]; + recno_t slno = 0; + size_t dlen, nlen = 0, slen = 0; + int ch, i, isolder = 0, nlines; + char *dname = NULL, *name = NULL, *search, *p, *t, dummy[2], buf[2048]; + CHAR_T *wp; + size_t wlen; for (;;) { if (!fgets(buf, sizeof(buf), csc->from_fp)) @@ -738,9 +757,12 @@ parse(sp, csc, tqp, matchesp) * length cscope information that follows it. */ CALLOC_RET(sp, tp, - TAG *, 1, sizeof(TAG) + dlen + 2 + nlen + 1 + slen + 1); - tp->fname = tp->buf; - if (dlen != 0) { + TAG *, 1, sizeof(TAG) + dlen + 2 + nlen + 1 + + (slen + 1) * sizeof(CHAR_T)); + tp->fname = (char *)tp->buf; + if (dlen == 1 && *dname == '.') + --dlen; + else if (dlen != 0) { memcpy(tp->fname, dname, dlen); tp->fname[dlen] = '/'; ++dlen; @@ -748,17 +770,23 @@ parse(sp, csc, tqp, matchesp) memcpy(tp->fname + dlen, name, nlen + 1); tp->fnlen = dlen + nlen; tp->slno = slno; - if (slen != 0) { - tp->search = tp->fname + tp->fnlen + 1; - memcpy(tp->search, search, (tp->slen = slen) + 1); - } - CIRCLEQ_INSERT_TAIL(&tqp->tagq, tp, q); + tp->search = (CHAR_T*)(tp->fname + tp->fnlen + 1); + CHAR2INT(sp, search, slen + 1, wp, wlen); + MEMCPY(tp->search, wp, (tp->slen = slen) + 1); + TAILQ_INSERT_TAIL(tqp->tagq, tp, q); + + /* Try to preset the tag within the current file. */ + if (sp->frp != NULL && sp->frp->name != NULL && + tqp->current == NULL && !strcmp(tp->fname, sp->frp->name)) + tqp->current = tp; ++*matchesp; } - (void)read_prompt(sp, csc); - return (0); + if (tqp->current == NULL) + tqp->current = TAILQ_FIRST(tqp->tagq); + + return read_prompt(sp, csc); io_err: if (feof(csc->from_fp)) errno = EIO; @@ -772,15 +800,10 @@ io_err: if (feof(csc->from_fp)) * Search for the right path to this file. */ static void -csc_file(sp, csc, name, dirp, dlenp, isolderp) - SCR *sp; - CSC *csc; - char *name, **dirp; - size_t *dlenp; - int *isolderp; +csc_file(SCR *sp, CSC *csc, char *name, char **dirp, size_t *dlenp, int *isolderp) { struct stat sb; - char **pp, buf[MAXPATHLEN]; + char **pp, *buf; /* * Check for the file in all of the listed paths. If we don't @@ -790,13 +813,20 @@ csc_file(sp, csc, name, dirp, dlenp, isolderp) * lives. */ for (pp = csc->paths; *pp != NULL; ++pp) { - (void)snprintf(buf, sizeof(buf), "%s/%s", *pp, name); - if (stat(buf, &sb) == 0) { - *dirp = *pp; - *dlenp = strlen(*pp); - *isolderp = sb.st_mtime < csc->mtime; + if ((buf = join(*pp, name)) == NULL) { + msgq(sp, M_SYSERR, NULL); + *dlenp = 0; return; } + if (stat(buf, &sb) == 0) { + free(buf); + *dirp = *pp; + *dlenp = strlen(*pp); + *isolderp = timespeccmp( + &sb.st_mtimespec, &csc->mtim, <); + return; + } + free(buf); } *dlenp = 0; } @@ -806,12 +836,13 @@ csc_file(sp, csc, name, dirp, dlenp, isolderp) * The cscope help command. */ static int -cscope_help(sp, cmdp, subcmd) - SCR *sp; - EXCMD *cmdp; - char *subcmd; +cscope_help(SCR *sp, EXCMD *cmdp, CHAR_T *subcmd) { - return (csc_help(sp, subcmd)); + char *np; + size_t nlen; + + INT2CHAR(sp, subcmd, STRLEN(subcmd) + 1, np, nlen); + return (csc_help(sp, np)); } /* @@ -819,9 +850,7 @@ cscope_help(sp, cmdp, subcmd) * Display help/usage messages. */ static int -csc_help(sp, cmd) - SCR *sp; - char *cmd; +csc_help(SCR *sp, char *cmd) { CC const *ccp; @@ -848,12 +877,17 @@ csc_help(sp, cmd) * The cscope kill command. */ static int -cscope_kill(sp, cmdp, cn) - SCR *sp; - EXCMD *cmdp; - char *cn; +cscope_kill(SCR *sp, EXCMD *cmdp, CHAR_T *cn) { - return (terminate(sp, NULL, atoi(cn))); + char *np; + size_t nlen; + int n = 1; + + if (*cn) { + INT2CHAR(sp, cn, STRLEN(cn) + 1, np, nlen); + n = atoi(np); + } + return (terminate(sp, NULL, n)); } /* @@ -861,49 +895,54 @@ cscope_kill(sp, cmdp, cn) * Detach from a cscope process. */ static int -terminate(sp, csc, n) - SCR *sp; - CSC *csc; - int n; +terminate(SCR *sp, CSC *csc, int n) { EX_PRIVATE *exp; - int i, pstat; + int i = 0, pstat; + CSC *cp, *pre_cp = NULL; exp = EXP(sp); /* - * We either get a csc structure or a number. If not provided a - * csc structure, find the right one. + * We either get a csc structure or a number. Locate and remove + * the candidate which matches the structure or the number. */ - if (csc == NULL) { - if (n < 1) - goto badno; - for (i = 1, csc = exp->cscq.lh_first; - csc != NULL; csc = csc->q.le_next, i++) - if (i == n) - break; - if (csc == NULL) { -badno: msgq(sp, M_ERR, "312|%d: no such cscope session", n); - return (1); + if (csc == NULL && n < 1) + goto badno; + SLIST_FOREACH(cp, exp->cscq, q) { + ++i; + if (csc == NULL ? i != n : cp != csc) { + pre_cp = cp; + continue; } + if (cp == SLIST_FIRST(exp->cscq)) + SLIST_REMOVE_HEAD(exp->cscq, q); + else + SLIST_REMOVE_AFTER(pre_cp, q); + csc = cp; + break; + } + if (csc == NULL) { +badno: msgq(sp, M_ERR, "312|%d: no such cscope session", n); + return (1); } /* * XXX * Theoretically, we have the only file descriptors to the process, * so closing them should let it exit gracefully, deleting temporary - * files, etc. The original vi cscope integration sent the cscope - * connection a SIGTERM signal, so I'm not sure if closing the file - * descriptors is sufficient. + * files, etc. However, the earlier created cscope processes seems + * to refuse to quit unless we send a SIGTERM signal. */ if (csc->from_fp != NULL) (void)fclose(csc->from_fp); if (csc->to_fp != NULL) (void)fclose(csc->to_fp); + if (i > 1) + (void)kill(csc->pid, SIGTERM); (void)waitpid(csc->pid, &pstat, 0); /* Discard cscope connection information. */ - LIST_REMOVE(csc, q); if (csc->pbuf != NULL) free(csc->pbuf); if (csc->paths != NULL) @@ -917,15 +956,24 @@ badno: msgq(sp, M_ERR, "312|%d: no such cscope session", n); * The cscope reset command. */ static int -cscope_reset(sp, cmdp, notusedp) - SCR *sp; - EXCMD *cmdp; - char *notusedp; +cscope_reset(SCR *sp, EXCMD *cmdp, CHAR_T *notusedp) +{ + return cscope_end(sp); +} + +/* + * cscope_end -- + * End all cscope connections. + * + * PUBLIC: int cscope_end __P((SCR *)); + */ +int +cscope_end(SCR *sp) { EX_PRIVATE *exp; - for (exp = EXP(sp); exp->cscq.lh_first != NULL;) - if (cscope_kill(sp, cmdp, "1")) + for (exp = EXP(sp); !SLIST_EMPTY(exp->cscq);) + if (terminate(sp, NULL, 1)) return (1); return (0); } @@ -937,22 +985,20 @@ cscope_reset(sp, cmdp, notusedp) * PUBLIC: int cscope_display __P((SCR *)); */ int -cscope_display(sp) - SCR *sp; +cscope_display(SCR *sp) { EX_PRIVATE *exp; CSC *csc; - int i; + int i = 0; exp = EXP(sp); - if (exp->cscq.lh_first == NULL) { + if (SLIST_EMPTY(exp->cscq)) { ex_printf(sp, "No cscope connections.\n"); return (0); } - for (i = 1, - csc = exp->cscq.lh_first; csc != NULL; ++i, csc = csc->q.le_next) - ex_printf(sp, - "%2d %s (process %lu)\n", i, csc->dname, (u_long)csc->pid); + SLIST_FOREACH(csc, exp->cscq, q) + ex_printf(sp, "%2d %s (process %lu)\n", + ++i, csc->dname, (u_long)csc->pid); return (0); } @@ -963,10 +1009,7 @@ cscope_display(sp) * PUBLIC: int cscope_search __P((SCR *, TAGQ *, TAG *)); */ int -cscope_search(sp, tqp, tp) - SCR *sp; - TAGQ *tqp; - TAG *tp; +cscope_search(SCR *sp, TAGQ *tqp, TAG *tp) { MARK m; @@ -1015,8 +1058,7 @@ cscope_search(sp, tqp, tp) * Return a pointer to the command structure. */ static CC const * -lookup_ccmd(name) - char *name; +lookup_ccmd(char *name) { CC const *ccp; size_t len; @@ -1033,9 +1075,7 @@ lookup_ccmd(name) * Read a prompt from cscope. */ static int -read_prompt(sp, csc) - SCR *sp; - CSC *csc; +read_prompt(SCR *sp, CSC *csc) { int ch; diff --git a/ex/ex_def.h b/ex/ex_def.h new file mode 100644 index 000000000000..7afb7b19d677 --- /dev/null +++ b/ex/ex_def.h @@ -0,0 +1,76 @@ +#define C_SCROLL 0 +#define C_BANG 1 +#define C_HASH 2 +#define C_SUBAGAIN 3 +#define C_STAR 4 +#define C_SHIFTL 5 +#define C_EQUAL 6 +#define C_SHIFTR 7 +#define C_AT 8 +#define C_APPEND 9 +#define C_ABBR 10 +#define C_ARGS 11 +#define C_BG 12 +#define C_CHANGE 13 +#define C_CD 14 +#define C_CHDIR 15 +#define C_COPY 16 +#define C_CSCOPE 17 +#define C_DELETE 18 +#define C_DISPLAY 19 +#define C_EDIT 20 +#define C_EX 21 +#define C_EXUSAGE 22 +#define C_FILE 23 +#define C_FG 24 +#define C_GLOBAL 25 +#define C_HELP 26 +#define C_INSERT 27 +#define C_JOIN 28 +#define C_K 29 +#define C_LIST 30 +#define C_MOVE 31 +#define C_MARK 32 +#define C_MAP 33 +#define C_MKEXRC 34 +#define C_NEXT 35 +#define C_NUMBER 36 +#define C_OPEN 37 +#define C_PRINT 38 +#define C_PRESERVE 39 +#define C_PREVIOUS 40 +#define C_PUT 41 +#define C_QUIT 42 +#define C_READ 43 +#define C_RECOVER 44 +#define C_RESIZE 45 +#define C_REWIND 46 +#define C_SUBSTITUTE 47 +#define C_SCRIPT 48 +#define C_SET 49 +#define C_SHELL 50 +#define C_SOURCE 51 +#define C_STOP 52 +#define C_SUSPEND 53 +#define C_T 54 +#define C_TAG 55 +#define C_TAGNEXT 56 +#define C_TAGPOP 57 +#define C_TAGPREV 58 +#define C_TAGTOP 59 +#define C_UNDO 60 +#define C_UNABBREVIATE 61 +#define C_UNMAP 62 +#define C_V 63 +#define C_VERSION 64 +#define C_VISUAL_EX 65 +#define C_VISUAL_VI 66 +#define C_VIUSAGE 67 +#define C_VSPLIT 68 +#define C_WRITE 69 +#define C_WN 70 +#define C_WQ 71 +#define C_XIT 72 +#define C_YANK 73 +#define C_Z 74 +#define C_SUBTILDE 75 diff --git a/ex/ex_delete.c b/ex/ex_delete.c index 58734bbcfce4..34bbee480d4c 100644 --- a/ex/ex_delete.c +++ b/ex/ex_delete.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_delete.c 10.9 (Berkeley) 10/23/96"; +static const char sccsid[] = "$Id: ex_delete.c,v 10.11 2001/06/25 15:19:15 skimo Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -30,9 +31,7 @@ static const char sccsid[] = "@(#)ex_delete.c 10.9 (Berkeley) 10/23/96"; * PUBLIC: int ex_delete __P((SCR *, EXCMD *)); */ int -ex_delete(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_delete(SCR *sp, EXCMD *cmdp) { recno_t lno; diff --git a/ex/ex_display.c b/ex/ex_display.c index 75315170f95e..6142a44a2cfa 100644 --- a/ex/ex_display.c +++ b/ex/ex_display.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_display.c 10.12 (Berkeley) 4/10/96"; +static const char sccsid[] = "$Id: ex_display.c,v 10.15 2001/06/25 15:19:15 skimo Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -25,8 +26,9 @@ static const char sccsid[] = "@(#)ex_display.c 10.12 (Berkeley) 4/10/96"; #include "../common/common.h" #include "tag.h" +static int is_prefix __P((ARGS *, CHAR_T *)); static int bdisplay __P((SCR *)); -static void db __P((SCR *, CB *, CHAR_T *)); +static void db __P((SCR *, CB *, const char *)); /* * ex_display -- :display b[uffers] | c[onnections] | s[creens] | t[ags] @@ -36,37 +38,27 @@ static void db __P((SCR *, CB *, CHAR_T *)); * PUBLIC: int ex_display __P((SCR *, EXCMD *)); */ int -ex_display(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_display(SCR *sp, EXCMD *cmdp) { - switch (cmdp->argv[0]->bp[0]) { + ARGS *arg; + + arg = cmdp->argv[0]; + + switch (arg->bp[0]) { case 'b': -#undef ARG -#define ARG "buffers" - if (cmdp->argv[0]->len >= sizeof(ARG) || - memcmp(cmdp->argv[0]->bp, ARG, cmdp->argv[0]->len)) + if (!is_prefix(arg, L("buffers"))) break; return (bdisplay(sp)); case 'c': -#undef ARG -#define ARG "connections" - if (cmdp->argv[0]->len >= sizeof(ARG) || - memcmp(cmdp->argv[0]->bp, ARG, cmdp->argv[0]->len)) + if (!is_prefix(arg, L("connections"))) break; return (cscope_display(sp)); case 's': -#undef ARG -#define ARG "screens" - if (cmdp->argv[0]->len >= sizeof(ARG) || - memcmp(cmdp->argv[0]->bp, ARG, cmdp->argv[0]->len)) + if (!is_prefix(arg, L("screens"))) break; return (ex_sdisplay(sp)); case 't': -#undef ARG -#define ARG "tags" - if (cmdp->argv[0]->len >= sizeof(ARG) || - memcmp(cmdp->argv[0]->bp, ARG, cmdp->argv[0]->len)) + if (!is_prefix(arg, L("tags"))) break; return (ex_tag_display(sp)); } @@ -74,36 +66,46 @@ ex_display(sp, cmdp) return (1); } +/* + * is_prefix -- + * + * Check that a command argument matches a prefix of a given string. + */ +static int +is_prefix(ARGS *arg, CHAR_T *str) +{ + return arg->len <= STRLEN(str) && !MEMCMP(arg->bp, str, arg->len); +} + /* * bdisplay -- * * Display buffers. */ static int -bdisplay(sp) - SCR *sp; +bdisplay(SCR *sp) { CB *cbp; - if (sp->gp->cutq.lh_first == NULL && sp->gp->dcbp == NULL) { + if (SLIST_EMPTY(sp->gp->cutq) && sp->gp->dcbp == NULL) { msgq(sp, M_INFO, "123|No cut buffers to display"); return (0); } /* Display regular cut buffers. */ - for (cbp = sp->gp->cutq.lh_first; cbp != NULL; cbp = cbp->q.le_next) { + SLIST_FOREACH(cbp, sp->gp->cutq, q) { if (isdigit(cbp->name)) continue; - if (cbp->textq.cqh_first != (void *)&cbp->textq) + if (!TAILQ_EMPTY(cbp->textq)) db(sp, cbp, NULL); if (INTERRUPTED(sp)) return (0); } /* Display numbered buffers. */ - for (cbp = sp->gp->cutq.lh_first; cbp != NULL; cbp = cbp->q.le_next) { + SLIST_FOREACH(cbp, sp->gp->cutq, q) { if (!isdigit(cbp->name)) continue; - if (cbp->textq.cqh_first != (void *)&cbp->textq) + if (!TAILQ_EMPTY(cbp->textq)) db(sp, cbp, NULL); if (INTERRUPTED(sp)) return (0); @@ -119,10 +121,7 @@ bdisplay(sp) * Display a buffer. */ static void -db(sp, cbp, name) - SCR *sp; - CB *cbp; - CHAR_T *name; +db(SCR *sp, CB *cbp, const char *name) { CHAR_T *p; GS *gp; @@ -133,8 +132,7 @@ db(sp, cbp, name) (void)ex_printf(sp, "********** %s%s\n", name == NULL ? KEY_NAME(sp, cbp->name) : name, F_ISSET(cbp, CB_LMODE) ? " (line mode)" : " (character mode)"); - for (tp = cbp->textq.cqh_first; - tp != (void *)&cbp->textq; tp = tp->q.cqe_next) { + TAILQ_FOREACH(tp, cbp->textq, q) { for (len = tp->len, p = tp->lb; len--; ++p) { (void)ex_puts(sp, KEY_NAME(sp, *p)); if (INTERRUPTED(sp)) diff --git a/ex/ex_edit.c b/ex/ex_edit.c index 8b18e0f0bbca..ce0f9a41407c 100644 --- a/ex/ex_edit.c +++ b/ex/ex_edit.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_edit.c 10.10 (Berkeley) 4/27/96"; +static const char sccsid[] = "$Id: ex_edit.c,v 10.15 2011/12/22 23:26:50 zy Exp $"; #endif /* not lint */ #include @@ -46,12 +46,12 @@ static int ex_N_edit __P((SCR *, EXCMD *, FREF *, int)); * PUBLIC: int ex_edit __P((SCR *, EXCMD *)); */ int -ex_edit(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_edit(SCR *sp, EXCMD *cmdp) { FREF *frp; int attach, setalt; + char *np; + size_t nlen; switch (cmdp->argc) { case 0: @@ -72,17 +72,19 @@ ex_edit(sp, cmdp) setalt = 0; break; case 1: - if ((frp = file_add(sp, cmdp->argv[0]->bp)) == NULL) + INT2CHAR(sp, cmdp->argv[0]->bp, cmdp->argv[0]->len + 1, + np, nlen); + if ((frp = file_add(sp, np)) == NULL) return (1); attach = 0; setalt = 1; - set_alt_name(sp, cmdp->argv[0]->bp); + set_alt_name(sp, np); break; default: abort(); } - if (F_ISSET(cmdp, E_NEWSCREEN)) + if (F_ISSET(cmdp, E_NEWSCREEN) || cmdp->cmd == &cmds[C_VSPLIT]) return (ex_N_edit(sp, cmdp, frp, attach)); /* @@ -108,18 +110,15 @@ ex_edit(sp, cmdp) * New screen version of ex_edit. */ static int -ex_N_edit(sp, cmdp, frp, attach) - SCR *sp; - EXCMD *cmdp; - FREF *frp; - int attach; +ex_N_edit(SCR *sp, EXCMD *cmdp, FREF *frp, int attach) { SCR *new; /* Get a new screen. */ if (screen_init(sp->gp, sp, &new)) return (1); - if (vs_split(sp, new, 0)) { + if ((cmdp->cmd == &cmds[C_VSPLIT] && vs_vsplit(sp, new)) || + (cmdp->cmd != &cmds[C_VSPLIT] && vs_split(sp, new, 0))) { (void)screen_end(new); return (1); } @@ -135,6 +134,13 @@ ex_N_edit(sp, cmdp, frp, attach) new->lno = sp->lno; new->cno = sp->cno; + +#if defined(USE_WIDECHAR) && defined(USE_ICONV) + /* Synchronize the iconv environments. */ + o_set(new, O_FILEENCODING, OS_STRDUP, + O_STR(sp, O_FILEENCODING), 0); + conv_enc(new, O_FILEENCODING, 0); +#endif } else if (file_init(new, frp, NULL, (FL_ISSET(cmdp->iflags, E_C_FORCE) ? FS_FORCE : 0))) { (void)vs_discard(new, NULL); diff --git a/ex/ex_equal.c b/ex/ex_equal.c index 565df66bd0a9..7da5a20a3054 100644 --- a/ex/ex_equal.c +++ b/ex/ex_equal.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_equal.c 10.10 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: ex_equal.c,v 10.12 2001/06/25 15:19:15 skimo Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -28,9 +29,7 @@ static const char sccsid[] = "@(#)ex_equal.c 10.10 (Berkeley) 3/6/96"; * PUBLIC: int ex_equal __P((SCR *, EXCMD *)); */ int -ex_equal(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_equal(SCR *sp, EXCMD *cmdp) { recno_t lno; diff --git a/ex/ex_file.c b/ex/ex_file.c index 3492f9c7bf0d..12714a3974ba 100644 --- a/ex/ex_file.c +++ b/ex/ex_file.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_file.c 10.12 (Berkeley) 7/12/96"; +static const char sccsid[] = "$Id: ex_file.c,v 10.14 2001/06/25 15:19:16 skimo Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -32,12 +33,12 @@ static const char sccsid[] = "@(#)ex_file.c 10.12 (Berkeley) 7/12/96"; * PUBLIC: int ex_file __P((SCR *, EXCMD *)); */ int -ex_file(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_file(SCR *sp, EXCMD *cmdp) { - CHAR_T *p; + char *p; FREF *frp; + char *np; + size_t nlen; NEEDFILE(sp, cmdp); @@ -48,8 +49,9 @@ ex_file(sp, cmdp) frp = sp->frp; /* Make sure can allocate enough space. */ - if ((p = v_strdup(sp, - cmdp->argv[0]->bp, cmdp->argv[0]->len)) == NULL) + INT2CHAR(sp, cmdp->argv[0]->bp, cmdp->argv[0]->len + 1, + np, nlen); + if ((p = v_strdup(sp, np, nlen - 1)) == NULL) return (1); /* If already have a file name, it becomes the alternate. */ diff --git a/ex/ex_filter.c b/ex/ex_filter.c index 2e86e58b3ba2..9af9a7c7becc 100644 --- a/ex/ex_filter.c +++ b/ex/ex_filter.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_filter.c 10.34 (Berkeley) 10/23/96"; +static const char sccsid[] = "$Id: ex_filter.c,v 10.44 2003/11/05 17:11:54 skimo Exp $"; #endif /* not lint */ #include @@ -36,21 +36,18 @@ static int filter_ldisplay __P((SCR *, FILE *)); * the utility. * * PUBLIC: int ex_filter __P((SCR *, - * PUBLIC: EXCMD *, MARK *, MARK *, MARK *, char *, enum filtertype)); + * PUBLIC: EXCMD *, MARK *, MARK *, MARK *, CHAR_T *, enum filtertype)); */ int -ex_filter(sp, cmdp, fm, tm, rp, cmd, ftype) - SCR *sp; - EXCMD *cmdp; - MARK *fm, *tm, *rp; - char *cmd; - enum filtertype ftype; +ex_filter(SCR *sp, EXCMD *cmdp, MARK *fm, MARK *tm, MARK *rp, CHAR_T *cmd, enum filtertype ftype) { FILE *ifp, *ofp; pid_t parent_writer_pid, utility_pid; recno_t nread; int input[2], output[2], rval; char *name; + char *np; + size_t nlen; rval = 0; @@ -141,7 +138,8 @@ err: if (input[0] != -1) else ++name; - execl(O_STR(sp, O_SHELL), name, "-c", cmd, NULL); + INT2CHAR(sp, cmd, STRLEN(cmd)+1, np, nlen); + execl(O_STR(sp, O_SHELL), name, "-c", np, (char *)NULL); msgq_str(sp, M_SYSERR, O_STR(sp, O_SHELL), "execl: %s"); _exit (127); /* NOTREACHED */ @@ -285,7 +283,8 @@ err: if (input[0] != -1) * Ignore errors on vi file reads, to make reads prettier. It's * completely inconsistent, and historic practice. */ -uwait: return (proc_wait(sp, (long)utility_pid, cmd, +uwait: INT2CHAR(sp, cmd, STRLEN(cmd) + 1, np, nlen); + return (proc_wait(sp, (long)utility_pid, np, ftype == FILTER_READ && F_ISSET(sp, SC_VI) ? 1 : 0, 0) || rval); } @@ -298,17 +297,19 @@ uwait: return (proc_wait(sp, (long)utility_pid, cmd, * We use the ex print routines to make sure they're printable. */ static int -filter_ldisplay(sp, fp) - SCR *sp; - FILE *fp; +filter_ldisplay(SCR *sp, FILE *fp) { size_t len; + size_t wlen; + CHAR_T *wp; EX_PRIVATE *exp; - for (exp = EXP(sp); !ex_getline(sp, fp, &len) && !INTERRUPTED(sp);) - if (ex_ldisplay(sp, exp->ibp, len, 0, 0)) + for (exp = EXP(sp); !ex_getline(sp, fp, &len) && !INTERRUPTED(sp);) { + FILE2INT5(sp, exp->ibcw, exp->ibp, len, wp, wlen); + if (ex_ldisplay(sp, wp, wlen, 0, 0)) break; + } if (ferror(fp)) msgq(sp, M_SYSERR, "filter read"); (void)fclose(fp); diff --git a/ex/ex_global.c b/ex/ex_global.c index aba9dc5fabe3..5dbbb07db0a7 100644 --- a/ex/ex_global.c +++ b/ex/ex_global.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_global.c 10.22 (Berkeley) 10/10/96"; +static const char sccsid[] = "$Id: ex_global.c,v 10.32 2011/12/26 23:37:01 zy Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -38,9 +39,7 @@ static int ex_g_setup __P((SCR *, EXCMD *, enum which)); * PUBLIC: int ex_global __P((SCR *, EXCMD *)); */ int -ex_global(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_global(SCR *sp, EXCMD *cmdp) { return (ex_g_setup(sp, cmdp, FL_ISSET(cmdp->iflags, E_C_FORCE) ? V : GLOBAL)); @@ -53,9 +52,7 @@ ex_global(sp, cmdp) * PUBLIC: int ex_v __P((SCR *, EXCMD *)); */ int -ex_v(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_v(SCR *sp, EXCMD *cmdp) { return (ex_g_setup(sp, cmdp, V)); } @@ -65,10 +62,7 @@ ex_v(sp, cmdp) * Ex global and v commands. */ static int -ex_g_setup(sp, cmdp, cmd) - SCR *sp; - EXCMD *cmdp; - enum which cmd; +ex_g_setup(SCR *sp, EXCMD *cmdp, enum which cmd) { CHAR_T *ptrn, *p, *t; EXCMD *ecp; @@ -80,14 +74,13 @@ ex_g_setup(sp, cmdp, cmd) regmatch_t match[1]; size_t len; int cnt, delim, eval; - char *dbp; + CHAR_T *dbp; NEEDFILE(sp, cmdp); if (F_ISSET(sp, SC_EX_GLOBAL)) { - msgq(sp, M_ERR, - "124|The %s command can't be used as part of a global or v command", - cmdp->cmd->name); + msgq_wstr(sp, M_ERR, cmdp->cmd->name, + "124|The %s command can't be used as part of a global or v command"); return (1); } @@ -97,8 +90,8 @@ ex_g_setup(sp, cmdp, cmd) */ if (cmdp->argc == 0) goto usage; - for (p = cmdp->argv[0]->bp; isblank(*p); ++p); - if (*p == '\0' || isalnum(*p) || + for (p = cmdp->argv[0]->bp; cmdskip(*p); ++p); + if (!isascii(*p) || *p == '\0' || isalnum(*p) || *p == '\\' || *p == '|' || *p == '\n') { usage: ex_emsg(sp, cmdp->cmd->usage, EXM_USAGE); return (1); @@ -139,13 +132,14 @@ usage: ex_emsg(sp, cmdp->cmd->usage, EXM_USAGE); } /* Re-compile the RE if necessary. */ - if (!F_ISSET(sp, SC_RE_SEARCH) && re_compile(sp, - sp->re, sp->re_len, NULL, NULL, &sp->re_c, RE_C_SEARCH)) + if (!F_ISSET(sp, SC_RE_SEARCH) && + re_compile(sp, sp->re, sp->re_len, + NULL, NULL, &sp->re_c, RE_C_SEARCH)) return (1); } else { /* Compile the RE. */ - if (re_compile(sp, ptrn, t - ptrn, - &sp->re, &sp->re_len, &sp->re_c, RE_C_SEARCH)) + if (re_compile(sp, ptrn, t - ptrn, &sp->re, + &sp->re_len, &sp->re_c, RE_C_SEARCH)) return (1); /* @@ -164,7 +158,7 @@ usage: ex_emsg(sp, cmdp->cmd->usage, EXM_USAGE); /* Get an EXCMD structure. */ CALLOC_RET(sp, ecp, EXCMD *, 1, sizeof(EXCMD)); - CIRCLEQ_INIT(&ecp->rq); + TAILQ_INIT(ecp->rq); /* * Get a copy of the command string; the default command is print. @@ -174,17 +168,17 @@ usage: ex_emsg(sp, cmdp->cmd->usage, EXM_USAGE); * parsing it. */ if ((len = cmdp->argv[0]->len - (p - cmdp->argv[0]->bp)) == 0) { - p = "pp"; + p = L("p"); len = 1; } - MALLOC_RET(sp, ecp->cp, char *, len * 2); + MALLOC_RET(sp, ecp->cp, CHAR_T *, (len * 2) * sizeof(CHAR_T)); ecp->o_cp = ecp->cp; ecp->o_clen = len; - memcpy(ecp->cp + len, p, len); + MEMCPY(ecp->cp + len, p, len); ecp->range_lno = OOBLNO; FL_SET(ecp->agv_flags, cmd == GLOBAL ? AGV_GLOBAL : AGV_V); - LIST_INSERT_HEAD(&sp->gp->ecq, ecp, q); + SLIST_INSERT_HEAD(sp->gp->ecq, ecp, q); /* * For each line... The semantics of global matching are that we first @@ -204,7 +198,7 @@ usage: ex_emsg(sp, cmdp->cmd->usage, EXM_USAGE); end = cmdp->addr2.lno; start <= end; ++start) { if (cnt-- == 0) { if (INTERRUPTED(sp)) { - LIST_REMOVE(ecp, q); + SLIST_REMOVE_HEAD(sp->gp->ecq, q); free(ecp->cp); free(ecp); break; @@ -233,7 +227,7 @@ usage: ex_emsg(sp, cmdp->cmd->usage, EXM_USAGE); } /* If follows the last entry, extend the last entry's range. */ - if ((rp = ecp->rq.cqh_last) != (void *)&ecp->rq && + if ((rp = TAILQ_LAST(ecp->rq, _rh)) != NULL && rp->stop == start - 1) { ++rp->stop; continue; @@ -244,7 +238,7 @@ usage: ex_emsg(sp, cmdp->cmd->usage, EXM_USAGE); if (rp == NULL) return (1); rp->start = rp->stop = start; - CIRCLEQ_INSERT_TAIL(&ecp->rq, rp, q); + TAILQ_INSERT_TAIL(ecp->rq, rp, q); } search_busy(sp, BUSY_OFF); return (0); @@ -257,10 +251,7 @@ usage: ex_emsg(sp, cmdp->cmd->usage, EXM_USAGE); * PUBLIC: int ex_g_insdel __P((SCR *, lnop_t, recno_t)); */ int -ex_g_insdel(sp, op, lno) - SCR *sp; - lnop_t op; - recno_t lno; +ex_g_insdel(SCR *sp, lnop_t op, recno_t lno) { EXCMD *ecp; RANGE *nrp, *rp; @@ -272,12 +263,10 @@ ex_g_insdel(sp, op, lno) if (op == LINE_RESET) return (0); - for (ecp = sp->gp->ecq.lh_first; ecp != NULL; ecp = ecp->q.le_next) { + SLIST_FOREACH(ecp, sp->gp->ecq, q) { if (!FL_ISSET(ecp->agv_flags, AGV_AT | AGV_GLOBAL | AGV_V)) continue; - for (rp = ecp->rq.cqh_first; rp != (void *)&ecp->rq; rp = nrp) { - nrp = rp->q.cqe_next; - + TAILQ_FOREACH_SAFE(rp, ecp->rq, q, nrp) { /* If range less than the line, ignore it. */ if (rp->stop < lno) continue; @@ -305,7 +294,7 @@ ex_g_insdel(sp, op, lno) */ if (op == LINE_DELETE) { if (rp->start > --rp->stop) { - CIRCLEQ_REMOVE(&ecp->rq, rp, q); + TAILQ_REMOVE(ecp->rq, rp, q); free(rp); } } else { @@ -313,8 +302,7 @@ ex_g_insdel(sp, op, lno) nrp->start = lno + 1; nrp->stop = rp->stop + 1; rp->stop = lno - 1; - CIRCLEQ_INSERT_AFTER(&ecp->rq, rp, nrp, q); - rp = nrp; + TAILQ_INSERT_AFTER(ecp->rq, rp, nrp, q); } } diff --git a/ex/ex_init.c b/ex/ex_init.c index 6a78416a3344..5b93e5bbccab 100644 --- a/ex/ex_init.c +++ b/ex/ex_init.c @@ -10,11 +10,10 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_init.c 10.26 (Berkeley) 8/12/96"; +static const char sccsid[] = "$Id: ex_init.c,v 10.33 2012/04/11 19:12:34 zy Exp $"; #endif /* not lint */ -#include -#include /* XXX: param.h may not have included types.h */ +#include #include #include @@ -42,8 +41,7 @@ static int ex_run_file __P((SCR *, char *)); * PUBLIC: int ex_screen_copy __P((SCR *, SCR *)); */ int -ex_screen_copy(orig, sp) - SCR *orig, *sp; +ex_screen_copy(SCR *orig, SCR *sp) { EX_PRIVATE *oexp, *nexp; @@ -52,16 +50,17 @@ ex_screen_copy(orig, sp) sp->ex_private = nexp; /* Initialize queues. */ - CIRCLEQ_INIT(&nexp->tq); - TAILQ_INIT(&nexp->tagfq); - LIST_INIT(&nexp->cscq); + TAILQ_INIT(nexp->tq); + TAILQ_INIT(nexp->tagfq); + SLIST_INIT(nexp->cscq); if (orig == NULL) { } else { oexp = EXP(orig); if (oexp->lastbcomm != NULL && - (nexp->lastbcomm = strdup(oexp->lastbcomm)) == NULL) { + (nexp->lastbcomm = v_wstrdup(sp, oexp->lastbcomm, + STRLEN(oexp->lastbcomm))) == NULL) { msgq(sp, M_SYSERR, NULL); return(1); } @@ -78,8 +77,7 @@ ex_screen_copy(orig, sp) * PUBLIC: int ex_screen_end __P((SCR *)); */ int -ex_screen_end(sp) - SCR *sp; +ex_screen_end(SCR *sp) { EX_PRIVATE *exp; int rval; @@ -102,9 +100,15 @@ ex_screen_end(sp) if (exp->lastbcomm != NULL) free(exp->lastbcomm); + if (exp->ibcw.bp1.c != NULL) + free(exp->ibcw.bp1.c); + if (ex_tag_free(sp)) rval = 1; + if (cscope_end(sp)) + rval = 1; + /* Free private memory. */ free(exp); sp->ex_private = NULL; @@ -119,11 +123,7 @@ ex_screen_end(sp) * PUBLIC: int ex_optchange __P((SCR *, int, char *, u_long *)); */ int -ex_optchange(sp, offset, str, valp) - SCR *sp; - int offset; - char *str; - u_long *valp; +ex_optchange(SCR *sp, int offset, char *str, u_long *valp) { switch (offset) { case O_TAGS: @@ -140,11 +140,12 @@ ex_optchange(sp, offset, str, valp) * PUBLIC: int ex_exrc __P((SCR *)); */ int -ex_exrc(sp) - SCR *sp; +ex_exrc(SCR *sp) { struct stat hsb, lsb; - char *p, path[MAXPATHLEN]; + char *p, *path; + CHAR_T *wp; + size_t wlen; /* * Source the system, environment, $HOME and local .exrc values. @@ -187,28 +188,41 @@ ex_exrc(sp) return (0); if ((p = getenv("NEXINIT")) != NULL) { - if (ex_run_str(sp, "NEXINIT", p, strlen(p), 1, 0)) + CHAR2INT(sp, p, strlen(p) + 1, wp, wlen); + if (ex_run_str(sp, "NEXINIT", wp, wlen - 1, 1, 0)) return (1); } else if ((p = getenv("EXINIT")) != NULL) { - if (ex_run_str(sp, "EXINIT", p, strlen(p), 1, 0)) + CHAR2INT(sp, p, strlen(p) + 1, wp, wlen); + if (ex_run_str(sp, "EXINIT", wp, wlen - 1, 1, 0)) return (1); } else if ((p = getenv("HOME")) != NULL && *p) { - (void)snprintf(path, sizeof(path), "%s/%s", p, _PATH_NEXRC); + int st = 0; + + if ((path = join(p, _PATH_NEXRC)) == NULL) { + msgq(sp, M_SYSERR, NULL); + return (1); + } switch (exrc_isok(sp, &hsb, path, 0, 1)) { case NOEXIST: - (void)snprintf(path, - sizeof(path), "%s/%s", p, _PATH_EXRC); + free(path); + if ((path = join(p, _PATH_EXRC)) == NULL) { + msgq(sp, M_SYSERR, NULL); + return (1); + } if (exrc_isok(sp, &hsb, path, 0, 1) == RCOK && ex_run_file(sp, path)) - return (1); + st = 1; break; case NOPERM: break; case RCOK: if (ex_run_file(sp, path)) - return (1); + st = 1; break; } + free(path); + if (st) + return st; } /* Run the commands. */ @@ -251,15 +265,15 @@ ex_exrc(sp) * Set up a file of ex commands to run. */ static int -ex_run_file(sp, name) - SCR *sp; - char *name; +ex_run_file(SCR *sp, char *name) { - ARGS *ap[2], a; EXCMD cmd; + CHAR_T *wp; + size_t wlen; - ex_cinit(&cmd, C_SOURCE, 0, OOBLNO, OOBLNO, 0, ap); - ex_cadd(&cmd, &a, name, strlen(name)); + ex_cinit(sp, &cmd, C_SOURCE, 0, OOBLNO, OOBLNO, 0); + CHAR2INT(sp, name, strlen(name)+1, wp, wlen); + argv_exp0(sp, &cmd, wp, wlen - 1); return (ex_source(sp, &cmd)); } @@ -267,14 +281,10 @@ ex_run_file(sp, name) * ex_run_str -- * Set up a string of ex commands to run. * - * PUBLIC: int ex_run_str __P((SCR *, char *, char *, size_t, int, int)); + * PUBLIC: int ex_run_str __P((SCR *, char *, CHAR_T *, size_t, int, int)); */ int -ex_run_str(sp, name, str, len, ex_flags, nocopy) - SCR *sp; - char *name, *str; - size_t len; - int ex_flags, nocopy; +ex_run_str(SCR *sp, char *name, CHAR_T *str, size_t len, int ex_flags, int nocopy) { GS *gp; EXCMD *ecp; @@ -282,7 +292,7 @@ ex_run_str(sp, name, str, len, ex_flags, nocopy) gp = sp->gp; if (EXCMD_RUNNING(gp)) { CALLOC_RET(sp, ecp, EXCMD *, 1, sizeof(EXCMD)); - LIST_INSERT_HEAD(&gp->ecq, ecp, q); + SLIST_INSERT_HEAD(gp->ecq, ecp, q); } else ecp = &gp->excmd; @@ -292,7 +302,7 @@ ex_run_str(sp, name, str, len, ex_flags, nocopy) if (nocopy) ecp->cp = str; else - if ((ecp->cp = v_strdup(sp, str, len)) == NULL) + if ((ecp->cp = v_wstrdup(sp, str, len)) == NULL) return (1); ecp->clen = len; @@ -345,16 +355,12 @@ ex_run_str(sp, name, str, len, ex_flags, nocopy) * files. */ static enum rc -exrc_isok(sp, sbp, path, rootown, rootid) - SCR *sp; - struct stat *sbp; - char *path; - int rootown, rootid; +exrc_isok(SCR *sp, struct stat *sbp, char *path, int rootown, int rootid) { enum { ROOTOWN, OWN, WRITER } etype; uid_t euid; int nf1, nf2; - char *a, *b, buf[MAXPATHLEN]; + char *a, *b, *buf; /* Check for the file's existence. */ if (stat(path, sbp)) @@ -376,23 +382,30 @@ exrc_isok(sp, sbp, path, rootown, rootid) return (RCOK); denied: a = msg_print(sp, path, &nf1); - if (strchr(path, '/') == NULL && getcwd(buf, sizeof(buf)) != NULL) { + if (strchr(path, '/') == NULL && (buf = getcwd(NULL, 0)) != NULL) { + char *p; + b = msg_print(sp, buf, &nf2); + if ((p = join(b, a)) == NULL) { + msgq(sp, M_SYSERR, NULL); + goto err; + } switch (etype) { case ROOTOWN: msgq(sp, M_ERR, - "125|%s/%s: not sourced: not owned by you or root", - b, a); + "128|%s: not sourced: not owned by you or root", p); break; case OWN: msgq(sp, M_ERR, - "126|%s/%s: not sourced: not owned by you", b, a); + "129|%s: not sourced: not owned by you", p); break; case WRITER: msgq(sp, M_ERR, - "127|%s/%s: not sourced: writeable by a user other than the owner", b, a); + "130|%s: not sourced: writeable by a user other than the owner", p); break; } + free(p); +err: free(buf); if (nf2) FREE_SPACE(sp, b, 0); } else diff --git a/ex/ex_join.c b/ex/ex_join.c index c26c4243178a..822ed79c4854 100644 --- a/ex/ex_join.c +++ b/ex/ex_join.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_join.c 10.10 (Berkeley) 9/15/96"; +static const char sccsid[] = "$Id: ex_join.c,v 10.17 2004/03/16 14:14:04 skimo Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -32,14 +33,13 @@ static const char sccsid[] = "@(#)ex_join.c 10.10 (Berkeley) 9/15/96"; * PUBLIC: int ex_join __P((SCR *, EXCMD *)); */ int -ex_join(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_join(SCR *sp, EXCMD *cmdp) { recno_t from, to; size_t blen, clen, len, tlen; - int echar, extra, first; - char *bp, *p, *tbp; + int echar = 0, extra, first; + CHAR_T *bp, *tbp = NULL; + CHAR_T *p; NEEDFILE(sp, cmdp); @@ -52,20 +52,13 @@ ex_join(sp, cmdp) return (1); } - GET_SPACE_RET(sp, bp, blen, 256); + GET_SPACE_RETW(sp, bp, blen, 256); /* * The count for the join command was off-by-one, * historically, to other counts for other commands. */ - if (FL_ISSET(cmdp->iflags, E_C_COUNT)) - ++cmdp->addr2.lno; - - /* - * If only a single address specified, or, the same address - * specified twice, the from/two addresses will be the same. - */ - if (cmdp->addr1.lno == cmdp->addr2.lno) + if (F_ISSET(cmdp, E_ADDR_DEF) || cmdp->addrcnt == 1) ++cmdp->addr2.lno; clen = tlen = 0; @@ -90,7 +83,7 @@ ex_join(sp, cmdp) * tbp - bp is the length of the new line. */ tlen += len + 2; - ADD_SPACE_RET(sp, bp, blen, tlen); + ADD_SPACE_RETW(sp, bp, blen, tlen); tbp = bp + clen; /* @@ -114,7 +107,7 @@ ex_join(sp, cmdp) if (isblank(echar)) for (; len && isblank(*p); --len, ++p); else if (p[0] != ')') { - if (strchr(".?!", echar)) { + if (STRCHR(L(".?!"), echar)) { *tbp++ = ' '; ++clen; extra = 1; @@ -126,7 +119,7 @@ ex_join(sp, cmdp) } if (len != 0) { - memcpy(tbp, p, len); + MEMCPY(tbp, p, len); tbp += len; clen += len; echar = p[len - 1]; @@ -167,10 +160,10 @@ ex_join(sp, cmdp) /* If the original line changed, reset it. */ if (!first && db_set(sp, from, bp, tbp - bp)) { -err: FREE_SPACE(sp, bp, blen); +err: FREE_SPACEW(sp, bp, blen); return (1); } - FREE_SPACE(sp, bp, blen); + FREE_SPACEW(sp, bp, blen); sp->rptlines[L_JOINED] += (cmdp->addr2.lno - cmdp->addr1.lno) + 1; return (0); diff --git a/ex/ex_map.c b/ex/ex_map.c index bc2cf0855919..60dbfe07d66f 100644 --- a/ex/ex_map.c +++ b/ex/ex_map.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_map.c 10.9 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: ex_map.c,v 10.11 2001/06/25 15:19:17 skimo Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -42,9 +43,7 @@ static const char sccsid[] = "@(#)ex_map.c 10.9 (Berkeley) 3/6/96"; * PUBLIC: int ex_map __P((SCR *, EXCMD *)); */ int -ex_map(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_map(SCR *sp, EXCMD *cmdp) { seq_t stype; CHAR_T *input, *p; @@ -107,13 +106,11 @@ nofunc: if (stype == SEQ_COMMAND && input[1] == '\0') * PUBLIC: int ex_unmap __P((SCR *, EXCMD *)); */ int -ex_unmap(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_unmap(SCR *sp, EXCMD *cmdp) { if (seq_delete(sp, cmdp->argv[0]->bp, cmdp->argv[0]->len, FL_ISSET(cmdp->iflags, E_C_FORCE) ? SEQ_INPUT : SEQ_COMMAND)) { - msgq_str(sp, M_INFO, + msgq_wstr(sp, M_INFO, cmdp->argv[0]->bp, "135|\"%s\" isn't currently mapped"); return (1); } diff --git a/ex/ex_mark.c b/ex/ex_mark.c index 08ad8c2aa30b..8c8ec3405ab3 100644 --- a/ex/ex_mark.c +++ b/ex/ex_mark.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_mark.c 10.8 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: ex_mark.c,v 10.9 2001/06/25 15:19:17 skimo Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -31,9 +32,7 @@ static const char sccsid[] = "@(#)ex_mark.c 10.8 (Berkeley) 3/6/96"; * PUBLIC: int ex_mark __P((SCR *, EXCMD *)); */ int -ex_mark(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_mark(SCR *sp, EXCMD *cmdp) { NEEDFILE(sp, cmdp); diff --git a/ex/ex_mkexrc.c b/ex/ex_mkexrc.c index 0eb15d408cf7..87530149addc 100644 --- a/ex/ex_mkexrc.c +++ b/ex/ex_mkexrc.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_mkexrc.c 10.11 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: ex_mkexrc.c,v 10.13 2001/06/25 15:19:17 skimo Exp $"; #endif /* not lint */ #include @@ -37,21 +37,21 @@ static const char sccsid[] = "@(#)ex_mkexrc.c 10.11 (Berkeley) 3/6/96"; * PUBLIC: int ex_mkexrc __P((SCR *, EXCMD *)); */ int -ex_mkexrc(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_mkexrc(SCR *sp, EXCMD *cmdp) { struct stat sb; FILE *fp; int fd, sverrno; char *fname; + size_t flen; switch (cmdp->argc) { case 0: fname = _PATH_EXRC; break; case 1: - fname = cmdp->argv[0]->bp; + INT2CHAR(sp, cmdp->argv[0]->bp, cmdp->argv[0]->len + 1, + fname, flen); set_alt_name(sp, fname); break; default: diff --git a/ex/ex_move.c b/ex/ex_move.c index d6e45c373964..c2499fd79a8f 100644 --- a/ex/ex_move.c +++ b/ex/ex_move.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_move.c 10.10 (Berkeley) 9/15/96"; +static const char sccsid[] = "$Id: ex_move.c,v 10.16 2012/02/11 15:52:33 zy Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -31,11 +32,9 @@ static const char sccsid[] = "@(#)ex_move.c 10.10 (Berkeley) 9/15/96"; * PUBLIC: int ex_copy __P((SCR *, EXCMD *)); */ int -ex_copy(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_copy(SCR *sp, EXCMD *cmdp) { - CB cb; + CB cb = {{ 0 }}; MARK fm1, fm2, m, tm; recno_t cnt; int rval; @@ -51,10 +50,9 @@ ex_copy(sp, cmdp) */ fm1 = cmdp->addr1; fm2 = cmdp->addr2; - memset(&cb, 0, sizeof(cb)); - CIRCLEQ_INIT(&cb.textq); + TAILQ_INIT(cb.textq); for (cnt = fm1.lno; cnt <= fm2.lno; ++cnt) - if (cut_line(sp, cnt, 0, 0, &cb)) { + if (cut_line(sp, cnt, 0, ENTIRE_LINE, &cb)) { rval = 1; goto err; } @@ -75,7 +73,7 @@ ex_copy(sp, cmdp) sp->lno = m.lno + (cnt - 1); sp->cno = 0; } -err: text_lfree(&cb.textq); +err: text_lfree(cb.textq); return (rval); } @@ -86,16 +84,15 @@ err: text_lfree(&cb.textq); * PUBLIC: int ex_move __P((SCR *, EXCMD *)); */ int -ex_move(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_move(SCR *sp, EXCMD *cmdp) { LMARK *lmp; MARK fm1, fm2; recno_t cnt, diff, fl, tl, mfl, mtl; size_t blen, len; int mark_reset; - char *bp, *p; + CHAR_T *bp; + CHAR_T *p; NEEDFILE(sp, cmdp); @@ -126,7 +123,7 @@ ex_move(sp, cmdp) /* Log the old positions of the marks. */ mark_reset = 0; - for (lmp = sp->ep->marks.lh_first; lmp != NULL; lmp = lmp->q.le_next) + SLIST_FOREACH(lmp, sp->ep->marks, q) if (lmp->name != ABSMARK1 && lmp->lno >= fl && lmp->lno <= tl) { mark_reset = 1; @@ -135,7 +132,7 @@ ex_move(sp, cmdp) } /* Get memory for the copy. */ - GET_SPACE_RET(sp, bp, blen, 256); + GET_SPACE_RETW(sp, bp, blen, 256); /* Move the lines. */ diff = (fm2.lno - fm1.lno) + 1; @@ -145,13 +142,12 @@ ex_move(sp, cmdp) for (cnt = diff; cnt--;) { if (db_get(sp, fl, DBG_FATAL, &p, &len)) return (1); - BINC_RET(sp, bp, blen, len); - memcpy(bp, p, len); + BINC_RETW(sp, bp, blen, len); + MEMCPY(bp, p, len); if (db_append(sp, 1, tl, bp, len)) return (1); if (mark_reset) - for (lmp = sp->ep->marks.lh_first; - lmp != NULL; lmp = lmp->q.le_next) + SLIST_FOREACH(lmp, sp->ep->marks, q) if (lmp->name != ABSMARK1 && lmp->lno == fl) lmp->lno = tl + 1; @@ -164,13 +160,12 @@ ex_move(sp, cmdp) for (cnt = diff; cnt--;) { if (db_get(sp, fl, DBG_FATAL, &p, &len)) return (1); - BINC_RET(sp, bp, blen, len); - memcpy(bp, p, len); + BINC_RETW(sp, bp, blen, len); + MEMCPY(bp, p, len); if (db_append(sp, 1, tl++, bp, len)) return (1); if (mark_reset) - for (lmp = sp->ep->marks.lh_first; - lmp != NULL; lmp = lmp->q.le_next) + SLIST_FOREACH(lmp, sp->ep->marks, q) if (lmp->name != ABSMARK1 && lmp->lno == fl) lmp->lno = tl; @@ -179,15 +174,14 @@ ex_move(sp, cmdp) return (1); } } - FREE_SPACE(sp, bp, blen); + FREE_SPACEW(sp, bp, blen); sp->lno = tl; /* Last line moved. */ sp->cno = 0; /* Log the new positions of the marks. */ if (mark_reset) - for (lmp = sp->ep->marks.lh_first; - lmp != NULL; lmp = lmp->q.le_next) + SLIST_FOREACH(lmp, sp->ep->marks, q) if (lmp->name != ABSMARK1 && lmp->lno >= mfl && lmp->lno <= mtl) (void)log_mark(sp, lmp); diff --git a/ex/ex_open.c b/ex/ex_open.c index afffaeb2202d..97414b93e3dc 100644 --- a/ex/ex_open.c +++ b/ex/ex_open.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_open.c 10.7 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: ex_open.c,v 10.8 2001/06/25 15:19:17 skimo Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -30,9 +31,7 @@ static const char sccsid[] = "@(#)ex_open.c 10.7 (Berkeley) 3/6/96"; * PUBLIC: int ex_open __P((SCR *, EXCMD *)); */ int -ex_open(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_open(SCR *sp, EXCMD *cmdp) { /* If open option off, disallow open command. */ if (!O_ISSET(sp, O_OPEN)) { diff --git a/ex/ex_perl.c b/ex/ex_perl.c deleted file mode 100644 index e620352ab518..000000000000 --- a/ex/ex_perl.c +++ /dev/null @@ -1,69 +0,0 @@ -/*- - * Copyright (c) 1992, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * Copyright (c) 1992, 1993, 1994, 1995, 1996 - * Keith Bostic. All rights reserved. - * Copyright (c) 1995 - * George V. Neville-Neil. All rights reserved. - * Copyright (c) 1996 - * Sven Verdoolaege. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)ex_perl.c 8.10 (Berkeley) 9/15/96"; -#endif /* not lint */ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "../common/common.h" - -/* - * ex_perl -- :[line [,line]] perl [command] - * Run a command through the perl interpreter. - * - * ex_perldo -- :[line [,line]] perldo [command] - * Run a set of lines through the perl interpreter. - * - * PUBLIC: int ex_perl __P((SCR*, EXCMD *)); - */ -int -ex_perl(sp, cmdp) - SCR *sp; - EXCMD *cmdp; -{ -#ifdef HAVE_PERL_INTERP - CHAR_T *p; - size_t len; - - /* Skip leading white space. */ - if (cmdp->argc != 0) - for (p = cmdp->argv[0]->bp, - len = cmdp->argv[0]->len; len > 0; --len, ++p) - if (!isblank(*p)) - break; - if (cmdp->argc == 0 || len == 0) { - ex_emsg(sp, cmdp->cmd->usage, EXM_USAGE); - return (1); - } - return (cmdp->cmd == &cmds[C_PERLCMD] ? - perl_ex_perl(sp, p, len, cmdp->addr1.lno, cmdp->addr2.lno) : - perl_ex_perldo(sp, p, len, cmdp->addr1.lno, cmdp->addr2.lno)); -#else - msgq(sp, M_ERR, "306|Vi was not loaded with a Perl interpreter"); - return (1); -#endif -} diff --git a/ex/ex_preserve.c b/ex/ex_preserve.c index 5614c88d753a..bda4bb44b695 100644 --- a/ex/ex_preserve.c +++ b/ex/ex_preserve.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_preserve.c 10.12 (Berkeley) 4/27/96"; +static const char sccsid[] = "$Id: ex_preserve.c,v 10.15 2001/06/25 15:19:18 skimo Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -31,9 +32,7 @@ static const char sccsid[] = "@(#)ex_preserve.c 10.12 (Berkeley) 4/27/96"; * PUBLIC: int ex_preserve __P((SCR *, EXCMD *)); */ int -ex_preserve(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_preserve(SCR *sp, EXCMD *cmdp) { recno_t lno; @@ -67,17 +66,18 @@ ex_preserve(sp, cmdp) * PUBLIC: int ex_recover __P((SCR *, EXCMD *)); */ int -ex_recover(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_recover(SCR *sp, EXCMD *cmdp) { ARGS *ap; FREF *frp; + char *np; + size_t nlen; ap = cmdp->argv[0]; /* Set the alternate file name. */ - set_alt_name(sp, ap->bp); + INT2CHAR(sp, ap->bp, ap->len+1, np, nlen); + set_alt_name(sp, np); /* * Check for modifications. Autowrite did not historically @@ -87,7 +87,8 @@ ex_recover(sp, cmdp) return (1); /* Get a file structure for the file. */ - if ((frp = file_add(sp, ap->bp)) == NULL) + INT2CHAR(sp, ap->bp, ap->len+1, np, nlen); + if ((frp = file_add(sp, np)) == NULL) return (1); /* Set the recover bit. */ diff --git a/ex/ex_print.c b/ex/ex_print.c index 4218e08e0978..2c9208aa6729 100644 --- a/ex/ex_print.c +++ b/ex/ex_print.c @@ -10,27 +10,24 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_print.c 10.18 (Berkeley) 5/12/96"; +static const char sccsid[] = "$Id: ex_print.c,v 10.25 2011/12/12 22:12:20 zy Exp $"; #endif /* not lint */ #include #include +#include #include #include #include +#include #include #include -#ifdef __STDC__ -#include -#else -#include -#endif - #include "../common/common.h" -static int ex_prchars __P((SCR *, const char *, size_t *, size_t, u_int, int)); +static int ex_prchars __P((SCR *, const CHAR_T *, size_t *, size_t, + u_int, int)); /* * ex_list -- :[line [,line]] l[ist] [count] [flags] @@ -40,9 +37,7 @@ static int ex_prchars __P((SCR *, const char *, size_t *, size_t, u_int, int)); * PUBLIC: int ex_list __P((SCR *, EXCMD *)); */ int -ex_list(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_list(SCR *sp, EXCMD *cmdp) { if (ex_print(sp, cmdp, &cmdp->addr1, &cmdp->addr2, cmdp->iflags | E_C_LIST)) @@ -60,9 +55,7 @@ ex_list(sp, cmdp) * PUBLIC: int ex_number __P((SCR *, EXCMD *)); */ int -ex_number(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_number(SCR *sp, EXCMD *cmdp) { if (ex_print(sp, cmdp, &cmdp->addr1, &cmdp->addr2, cmdp->iflags | E_C_HASH)) @@ -80,9 +73,7 @@ ex_number(sp, cmdp) * PUBLIC: int ex_pr __P((SCR *, EXCMD *)); */ int -ex_pr(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_pr(SCR *sp, EXCMD *cmdp) { if (ex_print(sp, cmdp, &cmdp->addr1, &cmdp->addr2, cmdp->iflags)) return (1); @@ -98,16 +89,13 @@ ex_pr(sp, cmdp) * PUBLIC: int ex_print __P((SCR *, EXCMD *, MARK *, MARK *, u_int32_t)); */ int -ex_print(sp, cmdp, fp, tp, flags) - SCR *sp; - EXCMD *cmdp; - MARK *fp, *tp; - u_int32_t flags; +ex_print(SCR *sp, EXCMD *cmdp, MARK *fp, MARK *tp, u_int32_t flags) { GS *gp; recno_t from, to; size_t col, len; - char *p, buf[10]; + CHAR_T *p; + CHAR_T buf[10]; NEEDFILE(sp, cmdp); @@ -122,10 +110,10 @@ ex_print(sp, cmdp, fp, tp, flags) */ if (LF_ISSET(E_C_HASH)) { if (from <= 999999) { - snprintf(buf, sizeof(buf), "%6ld ", from); + SPRINTF(buf, SIZE(buf), L("%6u "), from); p = buf; } else - p = "TOOBIG "; + p = L("TOOBIG "); if (ex_prchars(sp, p, &col, 8, 0, 0)) return (1); } @@ -153,19 +141,15 @@ ex_print(sp, cmdp, fp, tp, flags) * ex_ldisplay -- * Display a line without any preceding number. * - * PUBLIC: int ex_ldisplay __P((SCR *, const char *, size_t, size_t, u_int)); + * PUBLIC: int ex_ldisplay __P((SCR *, const CHAR_T *, size_t, size_t, u_int)); */ int -ex_ldisplay(sp, p, len, col, flags) - SCR *sp; - const char *p; - size_t len, col; - u_int flags; +ex_ldisplay(SCR *sp, const CHAR_T *p, size_t len, size_t col, u_int flags) { if (len > 0 && ex_prchars(sp, p, &col, len, LF_ISSET(E_C_LIST), 0)) return (1); if (!INTERRUPTED(sp) && LF_ISSET(E_C_LIST)) { - p = "$"; + p = L("$"); if (ex_prchars(sp, p, &col, 1, LF_ISSET(E_C_LIST), 0)) return (1); } @@ -181,21 +165,19 @@ ex_ldisplay(sp, p, len, col, flags) * PUBLIC: int ex_scprint __P((SCR *, MARK *, MARK *)); */ int -ex_scprint(sp, fp, tp) - SCR *sp; - MARK *fp, *tp; +ex_scprint(SCR *sp, MARK *fp, MARK *tp) { - const char *p; + CHAR_T *p; size_t col, len; col = 0; if (O_ISSET(sp, O_NUMBER)) { - p = " "; + p = L(" "); if (ex_prchars(sp, p, &col, 8, 0, 0)) return (1); } - if (db_get(sp, fp->lno, DBG_FATAL, (char **)&p, &len)) + if (db_get(sp, fp->lno, DBG_FATAL, &p, &len)) return (1); if (ex_prchars(sp, p, &col, fp->cno, 0, ' ')) @@ -206,7 +188,7 @@ ex_scprint(sp, fp, tp) return (1); if (INTERRUPTED(sp)) return (1); - p = "[ynq]"; /* XXX: should be msg_cat. */ + p = L("[ynq]"); /* XXX: should be msg_cat. */ if (ex_prchars(sp, p, &col, 5, 0, 0)) return (1); (void)ex_fflush(sp); @@ -218,14 +200,11 @@ ex_scprint(sp, fp, tp) * Local routine to dump characters to the screen. */ static int -ex_prchars(sp, p, colp, len, flags, repeatc) - SCR *sp; - const char *p; - size_t *colp, len; - u_int flags; - int repeatc; +ex_prchars(SCR *sp, const CHAR_T *p, size_t *colp, size_t len, + u_int flags, int repeatc) { - CHAR_T ch, *kp; + CHAR_T ch; + char *kp; GS *gp; size_t col, tlen, ts; @@ -271,14 +250,10 @@ intr: *colp = col; * PUBLIC: int ex_printf __P((SCR *, const char *, ...)); */ int -#ifdef __STDC__ -ex_printf(SCR *sp, const char *fmt, ...) -#else -ex_printf(sp, fmt, va_alist) - SCR *sp; - const char *fmt; - va_dcl -#endif +ex_printf( + SCR *sp, + const char *fmt, + ...) { EX_PRIVATE *exp; va_list ap; @@ -286,11 +261,7 @@ ex_printf(sp, fmt, va_alist) exp = EXP(sp); -#ifdef __STDC__ va_start(ap, fmt); -#else - va_start(ap); -#endif exp->obp_len += n = vsnprintf(exp->obp + exp->obp_len, sizeof(exp->obp) - exp->obp_len, fmt, ap); va_end(ap); @@ -309,9 +280,7 @@ ex_printf(sp, fmt, va_alist) * PUBLIC: int ex_puts __P((SCR *, const char *)); */ int -ex_puts(sp, str) - SCR *sp; - const char *str; +ex_puts(SCR *sp, const char *str) { EX_PRIVATE *exp; int doflush, n; @@ -337,8 +306,7 @@ ex_puts(sp, str) * PUBLIC: int ex_fflush __P((SCR *sp)); */ int -ex_fflush(sp) - SCR *sp; +ex_fflush(SCR *sp) { EX_PRIVATE *exp; diff --git a/ex/ex_put.c b/ex/ex_put.c index 2facb03f0fb5..7a3996be77c8 100644 --- a/ex/ex_put.c +++ b/ex/ex_put.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_put.c 10.7 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: ex_put.c,v 10.8 2001/06/25 15:19:18 skimo Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -31,9 +32,7 @@ static const char sccsid[] = "@(#)ex_put.c 10.7 (Berkeley) 3/6/96"; * PUBLIC: int ex_put __P((SCR *, EXCMD *)); */ int -ex_put(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_put(SCR *sp, EXCMD *cmdp) { MARK m; diff --git a/ex/ex_quit.c b/ex/ex_quit.c index 705fa1a64ade..2cfaeb1dc0fc 100644 --- a/ex/ex_quit.c +++ b/ex/ex_quit.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_quit.c 10.7 (Berkeley) 4/27/96"; +static const char sccsid[] = "$Id: ex_quit.c,v 10.8 2001/06/25 15:19:18 skimo Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -29,9 +30,7 @@ static const char sccsid[] = "@(#)ex_quit.c 10.7 (Berkeley) 4/27/96"; * PUBLIC: int ex_quit __P((SCR *, EXCMD *)); */ int -ex_quit(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_quit(SCR *sp, EXCMD *cmdp) { int force; diff --git a/ex/ex_read.c b/ex/ex_read.c index 78296ff28ca6..187f0902398a 100644 --- a/ex/ex_read.c +++ b/ex/ex_read.c @@ -10,13 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_read.c 10.38 (Berkeley) 8/12/96"; +static const char sccsid[] = "$Id: ex_read.c,v 10.44 2001/06/25 15:19:19 skimo Exp $"; #endif /* not lint */ #include #include #include -#include #include #include @@ -40,20 +39,20 @@ static const char sccsid[] = "@(#)ex_read.c 10.38 (Berkeley) 8/12/96"; * PUBLIC: int ex_read __P((SCR *, EXCMD *)); */ int -ex_read(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_read(SCR *sp, EXCMD *cmdp) { enum { R_ARG, R_EXPANDARG, R_FILTER } which; struct stat sb; - CHAR_T *arg, *name; + CHAR_T *arg = NULL; + char *name = NULL; + size_t nlen; EX_PRIVATE *exp; FILE *fp; FREF *frp; GS *gp; MARK rm; recno_t nlines; - size_t arglen; + size_t arglen = 0; int argc, rval; char *p; @@ -77,7 +76,7 @@ ex_read(sp, cmdp) /* Secure means no shell access. */ if (O_ISSET(sp, O_SECURE)) { - ex_emsg(sp, cmdp->cmd->name, EXM_SECURE_F); + ex_wemsg(sp, cmdp->cmd->name, EXM_SECURE_F); return (1); } } else @@ -116,7 +115,8 @@ ex_read(sp, cmdp) if (exp->lastbcomm != NULL) free(exp->lastbcomm); if ((exp->lastbcomm = - strdup(cmdp->argv[argc]->bp)) == NULL) { + v_wstrdup(sp, cmdp->argv[argc]->bp, + cmdp->argv[argc]->len)) == NULL) { msgq(sp, M_SYSERR, NULL); return (1); } @@ -132,7 +132,7 @@ ex_read(sp, cmdp) } else { if (F_ISSET(cmdp, E_MODIFY)) (void)ex_printf(sp, - "!%s\n", cmdp->argv[argc]->bp); + "!"WS"\n", cmdp->argv[argc]->bp); else (void)ex_puts(sp, "!\n"); (void)ex_fflush(sp); @@ -157,7 +157,7 @@ ex_read(sp, cmdp) */ if (F_ISSET(sp, SC_VI)) { if (gp->scr_screen(sp, SC_EX)) { - ex_emsg(sp, cmdp->cmd->name, EXM_NOCANON_F); + ex_wemsg(sp, cmdp->cmd->name, EXM_NOCANON_F); return (1); } /* @@ -207,7 +207,8 @@ ex_read(sp, cmdp) abort(); /* NOTREACHED */ case 2: - name = cmdp->argv[1]->bp; + INT2CHAR(sp, cmdp->argv[1]->bp, cmdp->argv[1]->len + 1, + name, nlen); /* * !!! * Historically, the read and write commands renamed @@ -216,8 +217,7 @@ ex_read(sp, cmdp) */ if (F_ISSET(sp->frp, FR_TMPFILE) && !F_ISSET(sp->frp, FR_EXNAMED)) { - if ((p = v_strdup(sp, cmdp->argv[1]->bp, - cmdp->argv[1]->len)) != NULL) { + if ((p = strdup(name)) != NULL) { free(sp->frp->name); sp->frp->name = p; } @@ -230,11 +230,14 @@ ex_read(sp, cmdp) /* Notify the screen. */ (void)sp->gp->scr_rename(sp, sp->frp->name, 1); - } else + name = sp->frp->name; + } else { set_alt_name(sp, name); + name = sp->alt_name; + } break; default: - ex_emsg(sp, cmdp->argv[0]->bp, EXM_FILECOUNT); + ex_wemsg(sp, cmdp->argv[0]->bp, EXM_FILECOUNT); return (1); } @@ -261,7 +264,7 @@ ex_read(sp, cmdp) } /* Try and get a lock. */ - if (file_lock(sp, NULL, NULL, fileno(fp), 0) == LOCK_UNAVAIL) + if (file_lock(sp, NULL, fileno(fp), 0) == LOCK_UNAVAIL) msgq(sp, M_ERR, "146|%s: read lock was unavailable", name); rval = ex_readfp(sp, name, fp, &cmdp->addr1, &nlines, 0); @@ -291,13 +294,7 @@ ex_read(sp, cmdp) * PUBLIC: int ex_readfp __P((SCR *, char *, FILE *, MARK *, recno_t *, int)); */ int -ex_readfp(sp, name, fp, fm, nlinesp, silent) - SCR *sp; - char *name; - FILE *fp; - MARK *fm; - recno_t *nlinesp; - int silent; +ex_readfp(SCR *sp, char *name, FILE *fp, MARK *fm, recno_t *nlinesp, int silent) { EX_PRIVATE *exp; GS *gp; @@ -306,6 +303,8 @@ ex_readfp(sp, name, fp, fm, nlinesp, silent) u_long ccnt; /* XXX: can't print off_t portably. */ int nf, rval; char *p; + size_t wlen; + CHAR_T *wp; gp = sp->gp; exp = EXP(sp); @@ -327,7 +326,8 @@ ex_readfp(sp, name, fp, fm, nlinesp, silent) p = NULL; } } - if (db_append(sp, 1, lno, exp->ibp, len)) + FILE2INT5(sp, exp->ibcw, exp->ibp, len, wp, wlen); + if (db_append(sp, 1, lno, wp, wlen)) goto err; ccnt += len; } @@ -342,7 +342,8 @@ ex_readfp(sp, name, fp, fm, nlinesp, silent) if (!silent) { p = msg_print(sp, name, &nf); msgq(sp, M_INFO, - "148|%s: %lu lines, %lu characters", p, lcnt, ccnt); + "148|%s: %lu lines, %lu characters", p, + (u_long)lcnt, ccnt); if (nf) FREE_SPACE(sp, p, 0); } diff --git a/ex/ex_screen.c b/ex/ex_screen.c index 9bc5bf04b06a..9cb108f976a7 100644 --- a/ex/ex_screen.c +++ b/ex/ex_screen.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_screen.c 10.11 (Berkeley) 6/29/96"; +static const char sccsid[] = "$Id: ex_screen.c,v 10.12 2001/06/25 15:19:19 skimo Exp $"; #endif /* not lint */ #include @@ -33,9 +33,7 @@ static const char sccsid[] = "@(#)ex_screen.c 10.11 (Berkeley) 6/29/96"; * PUBLIC: int ex_bg __P((SCR *, EXCMD *)); */ int -ex_bg(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_bg(SCR *sp, EXCMD *cmdp) { return (vs_bg(sp)); } @@ -47,9 +45,7 @@ ex_bg(sp, cmdp) * PUBLIC: int ex_fg __P((SCR *, EXCMD *)); */ int -ex_fg(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_fg(SCR *sp, EXCMD *cmdp) { SCR *nsp; int newscreen; @@ -73,9 +69,7 @@ ex_fg(sp, cmdp) * PUBLIC: int ex_resize __P((SCR *, EXCMD *)); */ int -ex_resize(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_resize(SCR *sp, EXCMD *cmdp) { adj_t adj; @@ -104,22 +98,21 @@ ex_resize(sp, cmdp) * PUBLIC: int ex_sdisplay __P((SCR *)); */ int -ex_sdisplay(sp) - SCR *sp; +ex_sdisplay(SCR *sp) { GS *gp; SCR *tsp; int cnt, col, len, sep; gp = sp->gp; - if ((tsp = gp->hq.cqh_first) == (void *)&gp->hq) { + if ((tsp = TAILQ_FIRST(gp->hq)) == NULL) { msgq(sp, M_INFO, "149|No background screens to display"); return (0); } col = len = sep = 0; - for (cnt = 1; tsp != (void *)&gp->hq && !INTERRUPTED(sp); - tsp = tsp->q.cqe_next) { + for (cnt = 1; tsp != NULL && !INTERRUPTED(sp); + tsp = TAILQ_NEXT(tsp, q)) { col += len = strlen(tsp->frp->name) + sep; if (col >= sp->cols - 1) { col = len; diff --git a/ex/ex_script.c b/ex/ex_script.c index 9ca6d60060d9..5ba0acf2e2f2 100644 --- a/ex/ex_script.c +++ b/ex/ex_script.c @@ -13,32 +13,32 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_script.c 10.30 (Berkeley) 9/24/96"; +static const char sccsid[] = "$Id: ex_script.c,v 10.44 2012/10/05 10:17:47 zy Exp $"; #endif /* not lint */ #include #include #include -#ifdef HAVE_SYS_SELECT_H #include -#endif #include -#ifdef HAVE_SYS5_PTY -#include -#endif -#include #include #include #include #include -#include /* XXX: OSF/1 bug: include before */ #include #include +#include +#include #include #include #include #include +#ifdef HAVE_LIBUTIL_H +#include +#else +#include +#endif #include "../common/common.h" #include "../vi/vi.h" @@ -50,7 +50,6 @@ static int sscr_getprompt __P((SCR *)); static int sscr_init __P((SCR *)); static int sscr_insert __P((SCR *)); static int sscr_matchprompt __P((SCR *, char *, size_t, size_t *)); -static int sscr_pty __P((int *, int *, char *, struct termios *, void *)); static int sscr_setprompt __P((SCR *, char *, size_t)); /* @@ -60,9 +59,7 @@ static int sscr_setprompt __P((SCR *, char *, size_t)); * PUBLIC: int ex_script __P((SCR *, EXCMD *)); */ int -ex_script(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_script(SCR *sp, EXCMD *cmdp) { /* Vi only command. */ if (!F_ISSET(sp, SC_VI)) { @@ -87,8 +84,7 @@ ex_script(sp, cmdp) * Create a pty setup for a shell. */ static int -sscr_init(sp) - SCR *sp; +sscr_init(SCR *sp) { SCRIPT *sc; char *sh, *sh_path; @@ -119,24 +115,16 @@ sscr_init(sp) sc->sh_term.c_oflag &= ~OPOST; sc->sh_term.c_cflag &= ~(ECHO|ECHOE|ECHONL|ECHOK); -#ifdef TIOCGWINSZ if (ioctl(STDIN_FILENO, TIOCGWINSZ, &sc->sh_win) == -1) { msgq(sp, M_SYSERR, "tcgetattr"); goto err; } - if (sscr_pty(&sc->sh_master, + if (openpty(&sc->sh_master, &sc->sh_slave, sc->sh_name, &sc->sh_term, &sc->sh_win) == -1) { - msgq(sp, M_SYSERR, "pty"); + msgq(sp, M_SYSERR, "openpty"); goto err; } -#else - if (sscr_pty(&sc->sh_master, - &sc->sh_slave, sc->sh_name, &sc->sh_term, NULL) == -1) { - msgq(sp, M_SYSERR, "pty"); - goto err; - } -#endif /* * __TK__ huh? @@ -203,17 +191,20 @@ err: if (sc->sh_master != -1) * carriage return comes; set the prompt from that line. */ static int -sscr_getprompt(sp) - SCR *sp; +sscr_getprompt(SCR *sp) { + EX_PRIVATE *exp; struct timeval tv; - CHAR_T *endp, *p, *t, buf[1024]; + char *endp, *p, *t, buf[1024]; SCRIPT *sc; fd_set fdset; recno_t lline; size_t llen, len; - u_int value; int nr; + CHAR_T *wp; + size_t wlen; + + exp = EXP(sp); FD_ZERO(&fdset); endp = buf; @@ -251,10 +242,11 @@ more: len = sizeof(buf) - (endp - buf); /* If any complete lines, push them into the file. */ for (p = t = buf; p < endp; ++p) { - value = KEY_VAL(sp, *p); - if (value == K_CR || value == K_NL) { + if (*p == '\r' || *p == '\n') { + if (CHAR2INT5(sp, exp->ibcw, t, p - t, wp, wlen)) + goto conv_err; if (db_last(sp, &lline) || - db_append(sp, 0, lline, t, p - t)) + db_append(sp, 0, lline, wp, wlen)) goto prompterr; t = p + 1; } @@ -284,7 +276,11 @@ more: len = sizeof(buf) - (endp - buf); endp = buf; /* Append the line into the file. */ - if (db_last(sp, &lline) || db_append(sp, 0, lline, buf, llen)) { + if (CHAR2INT5(sp, exp->ibcw, buf, llen, wp, wlen)) + goto conv_err; + if (db_last(sp, &lline) || db_append(sp, 0, lline, wp, wlen)) { + if (0) +conv_err: msgq(sp, M_ERR, "323|Invalid input. Truncated."); prompterr: sscr_end(sp); return (1); } @@ -299,38 +295,40 @@ prompterr: sscr_end(sp); * PUBLIC: int sscr_exec __P((SCR *, recno_t)); */ int -sscr_exec(sp, lno) - SCR *sp; - recno_t lno; +sscr_exec(SCR *sp, recno_t lno) { SCRIPT *sc; recno_t last_lno; size_t blen, len, last_len, tlen; int isempty, matchprompt, nw, rval; - char *bp, *p; + char *bp = NULL, *p; + CHAR_T *wp; + size_t wlen; /* If there's a prompt on the last line, append the command. */ if (db_last(sp, &last_lno)) return (1); - if (db_get(sp, last_lno, DBG_FATAL, &p, &last_len)) + if (db_get(sp, last_lno, DBG_FATAL, &wp, &wlen)) return (1); + INT2CHAR(sp, wp, wlen, p, last_len); if (sscr_matchprompt(sp, p, last_len, &tlen) && tlen == 0) { matchprompt = 1; - GET_SPACE_RET(sp, bp, blen, last_len + 128); + GET_SPACE_RETC(sp, bp, blen, last_len + 128); memmove(bp, p, last_len); } else matchprompt = 0; /* Get something to execute. */ - if (db_eget(sp, lno, &p, &len, &isempty)) { + if (db_eget(sp, lno, &wp, &wlen, &isempty)) { if (isempty) goto empty; goto err1; } /* Empty lines aren't interesting. */ - if (len == 0) + if (wlen == 0) goto empty; + INT2CHAR(sp, wp, wlen, p, len); /* Delete any prompt. */ if (sscr_matchprompt(sp, p, len, &tlen)) { @@ -355,9 +353,10 @@ err2: if (nw == 0) } if (matchprompt) { - ADD_SPACE_RET(sp, bp, blen, last_len + len); + ADD_SPACE_RETC(sp, bp, blen, last_len + len); memmove(bp + last_len, p, len); - if (db_set(sp, last_lno, bp, last_len + len)) + CHAR2INT(sp, bp, last_len + len, wp, wlen); + if (db_set(sp, last_lno, wp, wlen)) err1: rval = 1; } if (matchprompt) @@ -372,8 +371,7 @@ err1: rval = 1; * PUBLIC: int sscr_input __P((SCR *)); */ int -sscr_input(sp) - SCR *sp; +sscr_input(SCR *sp) { GS *gp; struct timeval poll; @@ -388,7 +386,7 @@ loop: maxfd = 0; poll.tv_usec = 0; /* Set up the input mask. */ - for (sp = gp->dq.cqh_first; sp != (void *)&gp->dq; sp = sp->q.cqe_next) + TAILQ_FOREACH(sp, gp->dq, q) if (F_ISSET(sp, SC_SCRIPT)) { FD_SET(sp->script->sh_master, &rdfd); if (sp->script->sh_master > maxfd) @@ -407,9 +405,10 @@ loop: maxfd = 0; } /* Read the input. */ - for (sp = gp->dq.cqh_first; sp != (void *)&gp->dq; sp = sp->q.cqe_next) + TAILQ_FOREACH(sp, gp->dq, q) if (F_ISSET(sp, SC_SCRIPT) && - FD_ISSET(sp->script->sh_master, &rdfd) && sscr_insert(sp)) + FD_ISSET(sp->script->sh_master, &rdfd) && + sscr_insert(sp)) return (1); goto loop; } @@ -419,25 +418,29 @@ loop: maxfd = 0; * Take a line from the shell and insert it into the file. */ static int -sscr_insert(sp) - SCR *sp; +sscr_insert(SCR *sp) { + EX_PRIVATE *exp; struct timeval tv; - CHAR_T *endp, *p, *t; + char *endp, *p, *t; SCRIPT *sc; fd_set rdfd; recno_t lno; size_t blen, len, tlen; - u_int value; int nr, rval; char *bp; + CHAR_T *wp; + size_t wlen = 0; + + exp = EXP(sp); + /* Find out where the end of the file is. */ if (db_last(sp, &lno)) return (1); #define MINREAD 1024 - GET_SPACE_RET(sp, bp, blen, MINREAD); + GET_SPACE_RETC(sp, bp, blen, MINREAD); endp = bp; /* Read the characters. */ @@ -458,10 +461,11 @@ more: switch (nr = read(sc->sh_master, endp, MINREAD)) { /* Append the lines into the file. */ for (p = t = bp; p < endp; ++p) { - value = KEY_VAL(sp, *p); - if (value == K_CR || value == K_NL) { + if (*p == '\r' || *p == '\n') { len = p - t; - if (db_append(sp, 1, lno++, t, len)) + if (CHAR2INT5(sp, exp->ibcw, t, len, wp, wlen)) + goto conv_err; + if (db_append(sp, 1, lno++, wp, wlen)) goto ret; t = p + 1; } @@ -489,15 +493,20 @@ more: switch (nr = read(sc->sh_master, endp, MINREAD)) { } if (sscr_setprompt(sp, t, len)) return (1); - if (db_append(sp, 1, lno++, t, len)) + if (CHAR2INT5(sp, exp->ibcw, t, len, wp, wlen)) + goto conv_err; + if (db_append(sp, 1, lno++, wp, wlen)) goto ret; } /* The cursor moves to EOF. */ sp->lno = lno; - sp->cno = len ? len - 1 : 0; + sp->cno = wlen ? wlen - 1 : 0; rval = vs_refresh(sp, 1); + if (0) +conv_err: msgq(sp, M_ERR, "323|Invalid input. Truncated."); + ret: FREE_SPACE(sp, bp, blen); return (rval); } @@ -509,10 +518,7 @@ ret: FREE_SPACE(sp, bp, blen); * */ static int -sscr_setprompt(sp, buf, len) - SCR *sp; - char *buf; - size_t len; +sscr_setprompt(SCR *sp, char *buf, size_t len) { SCRIPT *sc; @@ -536,10 +542,7 @@ sscr_setprompt(sp, buf, len) * parts that can change, in both content and size. */ static int -sscr_matchprompt(sp, lp, line_len, lenp) - SCR *sp; - char *lp; - size_t line_len, *lenp; +sscr_matchprompt(SCR *sp, char *lp, size_t line_len, size_t *lenp) { SCRIPT *sc; size_t prompt_len; @@ -577,8 +580,7 @@ sscr_matchprompt(sp, lp, line_len, lenp) * PUBLIC: int sscr_end __P((SCR *)); */ int -sscr_end(sp) - SCR *sp; +sscr_end(SCR *sp) { SCRIPT *sc; @@ -611,188 +613,15 @@ sscr_end(sp) * Set/clear the global scripting bit. */ static void -sscr_check(sp) - SCR *sp; +sscr_check(SCR *sp) { GS *gp; gp = sp->gp; - for (sp = gp->dq.cqh_first; sp != (void *)&gp->dq; sp = sp->q.cqe_next) + TAILQ_FOREACH(sp, gp->dq, q) if (F_ISSET(sp, SC_SCRIPT)) { F_SET(gp, G_SCRWIN); return; } F_CLR(gp, G_SCRWIN); } - -#ifdef HAVE_SYS5_PTY -static int ptys_open __P((int, char *)); -static int ptym_open __P((char *)); - -static int -sscr_pty(amaster, aslave, name, termp, winp) - int *amaster, *aslave; - char *name; - struct termios *termp; - void *winp; -{ - int master, slave, ttygid; - - /* open master terminal */ - if ((master = ptym_open(name)) < 0) { - errno = ENOENT; /* out of ptys */ - return (-1); - } - - /* open slave terminal */ - if ((slave = ptys_open(master, name)) >= 0) { - *amaster = master; - *aslave = slave; - } else { - errno = ENOENT; /* out of ptys */ - return (-1); - } - - if (termp) - (void) tcsetattr(slave, TCSAFLUSH, termp); -#ifdef TIOCSWINSZ - if (winp != NULL) - (void) ioctl(slave, TIOCSWINSZ, (struct winsize *)winp); -#endif - return (0); -} - -/* - * ptym_open -- - * This function opens a master pty and returns the file descriptor - * to it. pts_name is also returned which is the name of the slave. - */ -static int -ptym_open(pts_name) - char *pts_name; -{ - int fdm; - char *ptr, *ptsname(); - - strcpy(pts_name, _PATH_SYSV_PTY); - if ((fdm = open(pts_name, O_RDWR)) < 0 ) - return (-1); - - if (grantpt(fdm) < 0) { - close(fdm); - return (-2); - } - - if (unlockpt(fdm) < 0) { - close(fdm); - return (-3); - } - - if (unlockpt(fdm) < 0) { - close(fdm); - return (-3); - } - - /* get slave's name */ - if ((ptr = ptsname(fdm)) == NULL) { - close(fdm); - return (-3); - } - strcpy(pts_name, ptr); - return (fdm); -} - -/* - * ptys_open -- - * This function opens the slave pty. - */ -static int -ptys_open(fdm, pts_name) - int fdm; - char *pts_name; -{ - int fds; - - if ((fds = open(pts_name, O_RDWR)) < 0) { - close(fdm); - return (-5); - } - - if (ioctl(fds, I_PUSH, "ptem") < 0) { - close(fds); - close(fdm); - return (-6); - } - - if (ioctl(fds, I_PUSH, "ldterm") < 0) { - close(fds); - close(fdm); - return (-7); - } - - if (ioctl(fds, I_PUSH, "ttcompat") < 0) { - close(fds); - close(fdm); - return (-8); - } - - return (fds); -} - -#else /* !HAVE_SYS5_PTY */ - -static int -sscr_pty(amaster, aslave, name, termp, winp) - int *amaster, *aslave; - char *name; - struct termios *termp; - void *winp; -{ - static char line[] = "/dev/ptyXX"; - register char *cp1, *cp2; - register int master, slave, ttygid; - struct group *gr; - - if ((gr = getgrnam("tty")) != NULL) - ttygid = gr->gr_gid; - else - ttygid = -1; - - for (cp1 = "pqrs"; *cp1; cp1++) { - line[8] = *cp1; - for (cp2 = "0123456789abcdef"; *cp2; cp2++) { - line[5] = 'p'; - line[9] = *cp2; - if ((master = open(line, O_RDWR, 0)) == -1) { - if (errno == ENOENT) - return (-1); /* out of ptys */ - } else { - line[5] = 't'; - (void) chown(line, getuid(), ttygid); - (void) chmod(line, S_IRUSR|S_IWUSR|S_IWGRP); -#ifdef HAVE_REVOKE - (void) revoke(line); -#endif - if ((slave = open(line, O_RDWR, 0)) != -1) { - *amaster = master; - *aslave = slave; - if (name) - strcpy(name, line); - if (termp) - (void) tcsetattr(slave, - TCSAFLUSH, termp); -#ifdef TIOCSWINSZ - if (winp) - (void) ioctl(slave, TIOCSWINSZ, - (char *)winp); -#endif - return (0); - } - (void) close(master); - } - } - } - errno = ENOENT; /* out of ptys */ - return (-1); -} -#endif /* HAVE_SYS5_PTY */ diff --git a/ex/ex_set.c b/ex/ex_set.c index 11e929764242..5134babff7f6 100644 --- a/ex/ex_set.c +++ b/ex/ex_set.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_set.c 10.7 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: ex_set.c,v 10.8 2001/06/25 15:19:19 skimo Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -29,9 +30,7 @@ static const char sccsid[] = "@(#)ex_set.c 10.7 (Berkeley) 3/6/96"; * PUBLIC: int ex_set __P((SCR *, EXCMD *)); */ int -ex_set(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_set(SCR *sp, EXCMD *cmdp) { switch(cmdp->argc) { case 0: diff --git a/ex/ex_shell.c b/ex/ex_shell.c index 95168033a13f..d12730505968 100644 --- a/ex/ex_shell.c +++ b/ex/ex_shell.c @@ -10,14 +10,15 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_shell.c 10.38 (Berkeley) 8/19/96"; +static const char sccsid[] = "$Id: ex_shell.c,v 10.44 2012/07/06 06:51:26 zy Exp $"; #endif /* not lint */ -#include #include +#include #include #include +#include #include #include #include @@ -38,12 +39,10 @@ static const char *sigmsg __P((int)); * PUBLIC: int ex_shell __P((SCR *, EXCMD *)); */ int -ex_shell(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_shell(SCR *sp, EXCMD *cmdp) { int rval; - char buf[MAXPATHLEN]; + char *buf; /* We'll need a shell. */ if (opts_empty(sp, O_SHELL, 0)) @@ -53,13 +52,18 @@ ex_shell(sp, cmdp) * XXX * Assumes all shells use -i. */ - (void)snprintf(buf, sizeof(buf), "%s -i", O_STR(sp, O_SHELL)); + (void)asprintf(&buf, "%s -i", O_STR(sp, O_SHELL)); + if (buf == NULL) { + msgq(sp, M_SYSERR, NULL); + return (1); + } /* Restore the window name. */ (void)sp->gp->scr_rename(sp, NULL, 0); /* If we're still in a vi screen, move out explicitly. */ rval = ex_exec_proc(sp, cmdp, buf, NULL, !F_ISSET(sp, SC_SCR_EXWROTE)); + free(buf); /* Set the window name. */ (void)sp->gp->scr_rename(sp, sp->frp->name, 1); @@ -81,12 +85,7 @@ ex_shell(sp, cmdp) * PUBLIC: int ex_exec_proc __P((SCR *, EXCMD *, char *, const char *, int)); */ int -ex_exec_proc(sp, cmdp, cmd, msg, need_newline) - SCR *sp; - EXCMD *cmdp; - char *cmd; - const char *msg; - int need_newline; +ex_exec_proc(SCR *sp, EXCMD *cmdp, char *cmd, const char *msg, int need_newline) { GS *gp; const char *name; @@ -101,7 +100,7 @@ ex_exec_proc(sp, cmdp, cmd, msg, need_newline) /* Enter ex mode. */ if (F_ISSET(sp, SC_VI)) { if (gp->scr_screen(sp, SC_EX)) { - ex_emsg(sp, cmdp->cmd->name, EXM_NOCANON); + ex_wemsg(sp, cmdp->cmd->name, EXM_NOCANON); return (1); } (void)gp->scr_attr(sp, SA_ALTERNATE, 0); @@ -122,11 +121,13 @@ ex_exec_proc(sp, cmdp, cmd, msg, need_newline) msgq(sp, M_SYSERR, "vfork"); return (1); case 0: /* Utility. */ + if (gp->scr_child) + gp->scr_child(sp); if ((name = strrchr(O_STR(sp, O_SHELL), '/')) == NULL) name = O_STR(sp, O_SHELL); else ++name; - execl(O_STR(sp, O_SHELL), name, "-c", cmd, NULL); + execl(O_STR(sp, O_SHELL), name, "-c", cmd, (char *)NULL); msgq_str(sp, M_SYSERR, O_STR(sp, O_SHELL), "execl: %s"); _exit(127); /* NOTREACHED */ @@ -149,11 +150,7 @@ ex_exec_proc(sp, cmdp, cmd, msg, need_newline) * PUBLIC: int proc_wait __P((SCR *, long, const char *, int, int)); */ int -proc_wait(sp, pid, cmd, silent, okpipe) - SCR *sp; - long pid; - const char *cmd; - int silent, okpipe; +proc_wait(SCR *sp, long int pid, const char *cmd, int silent, int okpipe) { size_t len; int nf, pstat; @@ -176,11 +173,11 @@ proc_wait(sp, pid, cmd, silent, okpipe) * exit before reading all of its input. */ if (WIFSIGNALED(pstat) && (!okpipe || WTERMSIG(pstat) != SIGPIPE)) { - for (; isblank(*cmd); ++cmd); + for (; cmdskip(*cmd); ++cmd); p = msg_print(sp, cmd, &nf); len = strlen(p); msgq(sp, M_ERR, "%.*s%s: received signal: %s%s", - MIN(len, 20), p, len > 20 ? " ..." : "", + (int)MIN(len, 20), p, len > 20 ? " ..." : "", sigmsg(WTERMSIG(pstat)), WCOREDUMP(pstat) ? "; core dumped" : ""); if (nf) @@ -198,11 +195,11 @@ proc_wait(sp, pid, cmd, silent, okpipe) * practice. */ if (!silent) { - for (; isblank(*cmd); ++cmd); + for (; cmdskip(*cmd); ++cmd); p = msg_print(sp, cmd, &nf); len = strlen(p); msgq(sp, M_ERR, "%.*s%s: exited with status %d", - MIN(len, 20), p, len > 20 ? " ..." : "", + (int)MIN(len, 20), p, len > 20 ? " ..." : "", WEXITSTATUS(pstat)); if (nf) FREE_SPACE(sp, p, 0); @@ -212,167 +209,19 @@ proc_wait(sp, pid, cmd, silent, okpipe) return (0); } -/* - * XXX - * The sys_siglist[] table in the C library has this information, but there's - * no portable way to get to it. (Believe me, I tried.) - */ -typedef struct _sigs { - int number; /* signal number */ - char *message; /* related message */ -} SIGS; - -SIGS const sigs[] = { -#ifdef SIGABRT - SIGABRT, "Abort trap", -#endif -#ifdef SIGALRM - SIGALRM, "Alarm clock", -#endif -#ifdef SIGBUS - SIGBUS, "Bus error", -#endif -#ifdef SIGCLD - SIGCLD, "Child exited or stopped", -#endif -#ifdef SIGCHLD - SIGCHLD, "Child exited", -#endif -#ifdef SIGCONT - SIGCONT, "Continued", -#endif -#ifdef SIGDANGER - SIGDANGER, "System crash imminent", -#endif -#ifdef SIGEMT - SIGEMT, "EMT trap", -#endif -#ifdef SIGFPE - SIGFPE, "Floating point exception", -#endif -#ifdef SIGGRANT - SIGGRANT, "HFT monitor mode granted", -#endif -#ifdef SIGHUP - SIGHUP, "Hangup", -#endif -#ifdef SIGILL - SIGILL, "Illegal instruction", -#endif -#ifdef SIGINFO - SIGINFO, "Information request", -#endif -#ifdef SIGINT - SIGINT, "Interrupt", -#endif -#ifdef SIGIO - SIGIO, "I/O possible", -#endif -#ifdef SIGIOT - SIGIOT, "IOT trap", -#endif -#ifdef SIGKILL - SIGKILL, "Killed", -#endif -#ifdef SIGLOST - SIGLOST, "Record lock", -#endif -#ifdef SIGMIGRATE - SIGMIGRATE, "Migrate process to another CPU", -#endif -#ifdef SIGMSG - SIGMSG, "HFT input data pending", -#endif -#ifdef SIGPIPE - SIGPIPE, "Broken pipe", -#endif -#ifdef SIGPOLL - SIGPOLL, "I/O possible", -#endif -#ifdef SIGPRE - SIGPRE, "Programming error", -#endif -#ifdef SIGPROF - SIGPROF, "Profiling timer expired", -#endif -#ifdef SIGPWR - SIGPWR, "Power failure imminent", -#endif -#ifdef SIGRETRACT - SIGRETRACT, "HFT monitor mode retracted", -#endif -#ifdef SIGQUIT - SIGQUIT, "Quit", -#endif -#ifdef SIGSAK - SIGSAK, "Secure Attention Key", -#endif -#ifdef SIGSEGV - SIGSEGV, "Segmentation fault", -#endif -#ifdef SIGSOUND - SIGSOUND, "HFT sound sequence completed", -#endif -#ifdef SIGSTOP - SIGSTOP, "Suspended (signal)", -#endif -#ifdef SIGSYS - SIGSYS, "Bad system call", -#endif -#ifdef SIGTERM - SIGTERM, "Terminated", -#endif -#ifdef SIGTRAP - SIGTRAP, "Trace/BPT trap", -#endif -#ifdef SIGTSTP - SIGTSTP, "Suspended", -#endif -#ifdef SIGTTIN - SIGTTIN, "Stopped (tty input)", -#endif -#ifdef SIGTTOU - SIGTTOU, "Stopped (tty output)", -#endif -#ifdef SIGURG - SIGURG, "Urgent I/O condition", -#endif -#ifdef SIGUSR1 - SIGUSR1, "User defined signal 1", -#endif -#ifdef SIGUSR2 - SIGUSR2, "User defined signal 2", -#endif -#ifdef SIGVTALRM - SIGVTALRM, "Virtual timer expired", -#endif -#ifdef SIGWINCH - SIGWINCH, "Window size changes", -#endif -#ifdef SIGXCPU - SIGXCPU, "Cputime limit exceeded", -#endif -#ifdef SIGXFSZ - SIGXFSZ, "Filesize limit exceeded", -#endif -}; - /* * sigmsg -- * Return a pointer to a message describing a signal. */ static const char * -sigmsg(signo) - int signo; +sigmsg(int signo) { static char buf[40]; - const SIGS *sigp; - int n; + char *message; - for (n = 0, - sigp = &sigs[0]; n < sizeof(sigs) / sizeof(sigs[0]); ++n, ++sigp) - if (sigp->number == signo) - return (sigp->message); + /* POSIX.1-2008 leaves strsignal(3)'s return value unspecified. */ + if ((message = strsignal(signo)) != NULL) + return message; (void)snprintf(buf, sizeof(buf), "Unknown signal: %d", signo); return (buf); } diff --git a/ex/ex_shift.c b/ex/ex_shift.c index 83bd36d12a7d..cc6e1aac4b4b 100644 --- a/ex/ex_shift.c +++ b/ex/ex_shift.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_shift.c 10.11 (Berkeley) 9/15/96"; +static const char sccsid[] = "$Id: ex_shift.c,v 10.17 2001/06/25 15:19:20 skimo Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -34,9 +35,7 @@ static int shift __P((SCR *, EXCMD *, enum which)); * PUBLIC: int ex_shiftl __P((SCR *, EXCMD *)); */ int -ex_shiftl(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_shiftl(SCR *sp, EXCMD *cmdp) { return (shift(sp, cmdp, LEFT)); } @@ -47,9 +46,7 @@ ex_shiftl(sp, cmdp) * PUBLIC: int ex_shiftr __P((SCR *, EXCMD *)); */ int -ex_shiftr(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_shiftr(SCR *sp, EXCMD *cmdp) { return (shift(sp, cmdp, RIGHT)); } @@ -59,15 +56,13 @@ ex_shiftr(sp, cmdp) * Ex shift support. */ static int -shift(sp, cmdp, rl) - SCR *sp; - EXCMD *cmdp; - enum which rl; +shift(SCR *sp, EXCMD *cmdp, enum which rl) { recno_t from, to; size_t blen, len, newcol, newidx, oldcol, oldidx, sw; int curset; - char *p, *bp, *tbp; + CHAR_T *p; + CHAR_T *bp, *tbp; NEEDFILE(sp, cmdp); @@ -93,7 +88,7 @@ shift(sp, cmdp, rl) for (p = cmdp->argv[0]->bp, sw = 0; *p == '>' || *p == '<'; ++p) sw += O_VAL(sp, O_SHIFTWIDTH); - GET_SPACE_RET(sp, bp, blen, 256); + GET_SPACE_RETW(sp, bp, blen, 256); curset = 0; for (from = cmdp->addr1.lno, to = cmdp->addr2.lno; from <= to; ++from) { @@ -131,7 +126,7 @@ shift(sp, cmdp, rl) } /* Get a buffer that will hold the new line. */ - ADD_SPACE_RET(sp, bp, blen, newcol + len); + ADD_SPACE_RETW(sp, bp, blen, newcol + len); /* * Build a new indent string and count the number of @@ -146,11 +141,11 @@ shift(sp, cmdp, rl) *tbp++ = ' '; /* Add the original line. */ - memcpy(tbp, p + oldidx, len - oldidx); + MEMCPY(tbp, p + oldidx, len - oldidx); /* Set the replacement line. */ if (db_set(sp, from, bp, (tbp + (len - oldidx)) - bp)) { -err: FREE_SPACE(sp, bp, blen); +err: FREE_SPACEW(sp, bp, blen); return (1); } @@ -184,7 +179,7 @@ err: FREE_SPACE(sp, bp, blen); (void)nonblank(sp, to, &sp->cno); } - FREE_SPACE(sp, bp, blen); + FREE_SPACEW(sp, bp, blen); sp->rptlines[L_SHIFT] += cmdp->addr2.lno - cmdp->addr1.lno + 1; return (0); diff --git a/ex/ex_source.c b/ex/ex_source.c index b52c527716fd..63375d2b7ee2 100644 --- a/ex/ex_source.c +++ b/ex/ex_source.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_source.c 10.12 (Berkeley) 8/10/96"; +static const char sccsid[] = "$Id: ex_source.c,v 10.17 2011/12/19 16:17:06 zy Exp $"; #endif /* not lint */ #include @@ -35,15 +35,18 @@ static const char sccsid[] = "@(#)ex_source.c 10.12 (Berkeley) 8/10/96"; * PUBLIC: int ex_source __P((SCR *, EXCMD *)); */ int -ex_source(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_source(SCR *sp, EXCMD *cmdp) { struct stat sb; int fd, len; - char *bp, *name; + char *bp; + char *name, *np; + size_t nlen; + CHAR_T *wp; + size_t wlen; + int rc; - name = cmdp->argv[0]->bp; + INT2CHAR(sp, cmdp->argv[0]->bp, cmdp->argv[0]->len + 1, name, nlen); if ((fd = open(name, O_RDONLY, 0)) < 0 || fstat(fd, &sb)) goto err; @@ -80,6 +83,13 @@ err: msgq_str(sp, M_SYSERR, name, "%s"); return (1); } + np = strdup(name); + if (CHAR2INT(sp, bp, (size_t)sb.st_size + 1, wp, wlen)) + msgq(sp, M_ERR, "323|Invalid input. Truncated."); /* Put it on the ex queue. */ - return (ex_run_str(sp, name, bp, (size_t)sb.st_size, 1, 1)); + rc = ex_run_str(sp, np, wp, wlen - 1, 1, 0); + if (np != NULL) + free(np); + free(bp); + return (rc); } diff --git a/ex/ex_stop.c b/ex/ex_stop.c index bc55fd24ccb7..79167896b1cf 100644 --- a/ex/ex_stop.c +++ b/ex/ex_stop.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_stop.c 10.10 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: ex_stop.c,v 10.11 2001/06/25 15:19:20 skimo Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -33,9 +34,7 @@ static const char sccsid[] = "@(#)ex_stop.c 10.10 (Berkeley) 3/6/96"; * PUBLIC: int ex_stop __P((SCR *, EXCMD *)); */ int -ex_stop(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_stop(SCR *sp, EXCMD *cmdp) { int allowed; diff --git a/ex/ex_subst.c b/ex/ex_subst.c index 0ebb81dd58e7..93398431ca70 100644 --- a/ex/ex_subst.c +++ b/ex/ex_subst.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_subst.c 10.37 (Berkeley) 9/15/96"; +static const char sccsid[] = "$Id: ex_subst.c,v 10.53 2011/12/21 20:40:35 zy Exp $"; #endif /* not lint */ #include @@ -32,12 +32,12 @@ static const char sccsid[] = "@(#)ex_subst.c 10.37 (Berkeley) 9/15/96"; #define SUB_FIRST 0x01 /* The 'r' flag isn't reasonable. */ #define SUB_MUSTSETR 0x02 /* The 'r' flag is required. */ -static int re_conv __P((SCR *, char **, size_t *, int *)); -static int re_cscope_conv __P((SCR *, char **, size_t *, int *)); +static int re_conv __P((SCR *, CHAR_T **, size_t *, int *)); +static int re_cscope_conv __P((SCR *, CHAR_T **, size_t *, int *)); static int re_sub __P((SCR *, - char *, char **, size_t *, size_t *, regmatch_t [10])); -static int re_tag_conv __P((SCR *, char **, size_t *, int *)); -static int s __P((SCR *, EXCMD *, char *, regex_t *, u_int)); + CHAR_T *, CHAR_T **, size_t *, size_t *, regmatch_t [10])); +static int re_tag_conv __P((SCR *, CHAR_T **, size_t *, int *)); +static int s __P((SCR *, EXCMD *, CHAR_T *, regex_t *, u_int)); /* * ex_s -- @@ -48,15 +48,13 @@ static int s __P((SCR *, EXCMD *, char *, regex_t *, u_int)); * PUBLIC: int ex_s __P((SCR *, EXCMD *)); */ int -ex_s(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_s(SCR *sp, EXCMD *cmdp) { regex_t *re; size_t blen, len; u_int flags; int delim; - char *bp, *ptrn, *rep, *p, *t; + CHAR_T *bp, *p, *ptrn, *rep, *t; /* * Skip leading white space. @@ -73,14 +71,14 @@ ex_s(sp, cmdp) goto subagain; for (p = cmdp->argv[0]->bp, len = cmdp->argv[0]->len; len > 0; --len, ++p) { - if (!isblank(*p)) + if (!cmdskip(*p)) break; } if (len == 0) subagain: return (ex_subagain(sp, cmdp)); delim = *p++; - if (isalnum(delim) || delim == '\\') + if (!isascii(delim) || isalnum(delim) || delim == '\\') return (s(sp, cmdp, p, &sp->subre_c, SUB_MUSTSETR)); /* @@ -140,8 +138,9 @@ subagain: return (ex_subagain(sp, cmdp)); } /* Re-compile the RE if necessary. */ - if (!F_ISSET(sp, SC_RE_SEARCH) && re_compile(sp, - sp->re, sp->re_len, NULL, NULL, &sp->re_c, RE_C_SEARCH)) + if (!F_ISSET(sp, SC_RE_SEARCH) && + re_compile(sp, sp->re, sp->re_len, + NULL, NULL, &sp->re_c, RE_C_SEARCH)) return (1); flags = 0; } else { @@ -152,11 +151,11 @@ subagain: return (ex_subagain(sp, cmdp)); * RE's. We compile the RE twice, as we don't want to bother * ref counting the pattern string and (opaque) structure. */ - if (re_compile(sp, ptrn, t - ptrn, - &sp->re, &sp->re_len, &sp->re_c, RE_C_SEARCH)) + if (re_compile(sp, ptrn, t - ptrn, &sp->re, + &sp->re_len, &sp->re_c, RE_C_SEARCH)) return (1); - if (re_compile(sp, ptrn, t - ptrn, - &sp->subre, &sp->subre_len, &sp->subre_c, RE_C_SUBST)) + if (re_compile(sp, ptrn, t - ptrn, &sp->subre, + &sp->subre_len, &sp->subre_c, RE_C_SUBST)) return (1); flags = SUB_FIRST; @@ -202,7 +201,7 @@ subagain: return (ex_subagain(sp, cmdp)); p[0] != '\0' && p[0] != delim; ++p, ++len) if (p[0] == '~') len += sp->repl_len; - GET_SPACE_RET(sp, bp, blen, len); + GET_SPACE_RETW(sp, bp, blen, len); for (t = bp, len = 0, p = rep;;) { if (p[0] == '\0' || p[0] == delim) { if (p[0] == delim) @@ -222,7 +221,7 @@ subagain: return (ex_subagain(sp, cmdp)); } } else if (p[0] == '~' && O_ISSET(sp, O_MAGIC)) { tilde: ++p; - memcpy(t, sp->repl, sp->repl_len); + MEMCPY(t, sp->repl, sp->repl_len); t += sp->repl_len; len += sp->repl_len; continue; @@ -233,14 +232,14 @@ tilde: ++p; if ((sp->repl_len = len) != 0) { if (sp->repl != NULL) free(sp->repl); - if ((sp->repl = malloc(len)) == NULL) { - msgq(sp, M_SYSERR, NULL); - FREE_SPACE(sp, bp, blen); + MALLOC(sp, sp->repl, CHAR_T *, len * sizeof(CHAR_T)); + if (sp->repl == NULL) { + FREE_SPACEW(sp, bp, blen); return (1); } - memcpy(sp->repl, bp, len); + MEMCPY(sp->repl, bp, len); } - FREE_SPACE(sp, bp, blen); + FREE_SPACEW(sp, bp, blen); } return (s(sp, cmdp, p, re, flags)); } @@ -254,16 +253,15 @@ tilde: ++p; * PUBLIC: int ex_subagain __P((SCR *, EXCMD *)); */ int -ex_subagain(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_subagain(SCR *sp, EXCMD *cmdp) { if (sp->subre == NULL) { ex_emsg(sp, NULL, EXM_NOPREVRE); return (1); } - if (!F_ISSET(sp, SC_RE_SUBST) && re_compile(sp, - sp->subre, sp->subre_len, NULL, NULL, &sp->subre_c, RE_C_SUBST)) + if (!F_ISSET(sp, SC_RE_SUBST) && + re_compile(sp, sp->subre, sp->subre_len, + NULL, NULL, &sp->subre_c, RE_C_SUBST)) return (1); return (s(sp, cmdp, cmdp->argc ? cmdp->argv[0]->bp : NULL, &sp->subre_c, 0)); @@ -278,16 +276,14 @@ ex_subagain(sp, cmdp) * PUBLIC: int ex_subtilde __P((SCR *, EXCMD *)); */ int -ex_subtilde(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_subtilde(SCR *sp, EXCMD *cmdp) { if (sp->re == NULL) { ex_emsg(sp, NULL, EXM_NOPREVRE); return (1); } - if (!F_ISSET(sp, SC_RE_SEARCH) && re_compile(sp, - sp->re, sp->re_len, NULL, NULL, &sp->re_c, RE_C_SEARCH)) + if (!F_ISSET(sp, SC_RE_SEARCH) && re_compile(sp, sp->re, + sp->re_len, NULL, NULL, &sp->re_c, RE_C_SEARCH)) return (1); return (s(sp, cmdp, cmdp->argc ? cmdp->argv[0]->bp : NULL, &sp->re_c, 0)); @@ -320,21 +316,21 @@ ex_subtilde(sp, cmdp) #define BUILD(sp, l, len) { \ if (lbclen + (len) > lblen) { \ - lblen += MAX(lbclen + (len), 256); \ - REALLOC(sp, lb, char *, lblen); \ + lblen = p2roundup(MAX(lbclen + (len), 256)); \ + REALLOC(sp, lb, CHAR_T *, lblen * sizeof(CHAR_T)); \ if (lb == NULL) { \ lbclen = 0; \ return (1); \ } \ } \ - memcpy(lb + lbclen, l, len); \ + MEMCPY(lb + lbclen, l, len); \ lbclen += len; \ } #define NEEDSP(sp, len, pnt) { \ if (lbclen + (len) > lblen) { \ - lblen += MAX(lbclen + (len), 256); \ - REALLOC(sp, lb, char *, lblen); \ + lblen = p2roundup(MAX(lbclen + (len), 256)); \ + REALLOC(sp, lb, CHAR_T *, lblen * sizeof(CHAR_T)); \ if (lb == NULL) { \ lbclen = 0; \ return (1); \ @@ -344,24 +340,21 @@ ex_subtilde(sp, cmdp) } static int -s(sp, cmdp, s, re, flags) - SCR *sp; - EXCMD *cmdp; - char *s; - regex_t *re; - u_int flags; +s(SCR *sp, EXCMD *cmdp, CHAR_T *s, regex_t *re, u_int flags) { EVENT ev; MARK from, to; - TEXTH tiq; + TEXTH tiq[] = {{ 0 }}; recno_t elno, lno, slno; + u_long ul; regmatch_t match[10]; size_t blen, cnt, last, lbclen, lblen, len, llen; size_t offset, saved_offset, scno; int cflag, lflag, nflag, pflag, rflag; int didsub, do_eol_match, eflags, empty_ok, eval; int linechanged, matched, quit, rval; - char *bp, *lb; + CHAR_T *bp, *lb; + enum nresult nret; NEEDFILE(sp, cmdp); @@ -414,13 +407,14 @@ s(sp, cmdp, s, re, flags) if (lno != OOBLNO) goto usage; errno = 0; - lno = strtoul(s, &s, 10); + nret = nget_uslong(&ul, s, &s, 10); + lno = ul; if (*s == '\0') /* Loop increment correction. */ --s; - if (errno == ERANGE) { - if (lno == LONG_MAX) + if (nret != NUM_OK) { + if (nret == NUM_OVER) msgq(sp, M_ERR, "153|Count overflow"); - else if (lno == LONG_MIN) + else if (nret == NUM_UNDER) msgq(sp, M_ERR, "154|Count underflow"); else msgq(sp, M_SYSERR, NULL); @@ -443,10 +437,8 @@ s(sp, cmdp, s, re, flags) sp->c_suffix = !sp->c_suffix; /* Ex text structure initialization. */ - if (F_ISSET(sp, SC_EX)) { - memset(&tiq, 0, sizeof(TEXTH)); - CIRCLEQ_INIT(&tiq); - } + if (F_ISSET(sp, SC_EX)) + TAILQ_INIT(tiq); break; case 'g': sp->g_suffix = !sp->g_suffix; @@ -474,7 +466,7 @@ s(sp, cmdp, s, re, flags) goto usage; } - if (*s != '\0' || !rflag && LF_ISSET(SUB_MUSTSETR)) { + if (*s != '\0' || (!rflag && LF_ISSET(SUB_MUSTSETR))) { usage: ex_emsg(sp, cmdp->cmd->usage, EXM_USAGE); return (1); } @@ -496,7 +488,8 @@ noargs: if (F_ISSET(sp, SC_VI) && sp->c_suffix && (lflag || nflag || pflag)) { blen = lbclen = lblen = 0; /* For each line... */ - for (matched = quit = 0, lno = cmdp->addr1.lno, + lno = cmdp->addr1.lno == 0 ? 1 : cmdp->addr1.lno; + for (matched = quit = 0, elno = cmdp->addr2.lno; !quit && lno <= elno; ++lno) { /* Someone's unhappy, time to stop. */ @@ -513,10 +506,10 @@ noargs: if (F_ISSET(sp, SC_VI) && sp->c_suffix && (lflag || nflag || pflag)) { */ if (sp->c_suffix) { if (bp == NULL) { - GET_SPACE_RET(sp, bp, blen, llen); + GET_SPACE_RETW(sp, bp, blen, llen); } else - ADD_SPACE_RET(sp, bp, blen, llen); - memcpy(bp, s, llen); + ADD_SPACE_RETW(sp, bp, blen, llen); + MEMCPY(bp, s, llen); s = bp; } @@ -555,7 +548,7 @@ nextmatch: match[0].rm_so = 0; match[0].rm_eo = len; /* Get the next match. */ - eval = regexec(re, (char *)s + offset, 10, match, eflags); + eval = regexec(re, s + offset, 10, match, eflags); /* * There wasn't a match or if there was an error, deal with @@ -658,9 +651,9 @@ nextmatch: match[0].rm_so = 0; if (ex_print(sp, cmdp, &from, &to, 0) || ex_scprint(sp, &from, &to)) goto lquit; - if (ex_txt(sp, &tiq, 0, TXT_CR)) + if (ex_txt(sp, tiq, 0, TXT_CR)) goto err; - ev.e_c = tiq.cqh_first->lb[0]; + ev.e_c = TAILQ_FIRST(tiq)->lb[0]; } switch (ev.e_c) { @@ -749,8 +742,8 @@ skip: offset += match[0].rm_eo; goto err; if (db_get(sp, lno, DBG_FATAL, &s, &llen)) goto err; - ADD_SPACE_RET(sp, bp, blen, llen) - memcpy(bp, s, llen); + ADD_SPACE_RETW(sp, bp, blen, llen) + MEMCPY(bp, s, llen); s = bp; len = llen - offset; @@ -876,7 +869,7 @@ err: rval = 1; } if (bp != NULL) - FREE_SPACE(sp, bp, blen); + FREE_SPACEW(sp, bp, blen); if (lb != NULL) free(lb); return (rval); @@ -887,19 +880,14 @@ err: rval = 1; * Compile the RE. * * PUBLIC: int re_compile __P((SCR *, - * PUBLIC: char *, size_t, char **, size_t *, regex_t *, u_int)); + * PUBLIC: CHAR_T *, size_t, CHAR_T **, size_t *, regex_t *, u_int)); */ int -re_compile(sp, ptrn, plen, ptrnp, lenp, rep, flags) - SCR *sp; - char *ptrn, **ptrnp; - size_t plen, *lenp; - regex_t *rep; - u_int flags; +re_compile(SCR *sp, CHAR_T *ptrn, size_t plen, CHAR_T **ptrnp, size_t *lenp, regex_t *rep, u_int flags) { size_t len; int reflags, replaced, rval; - char *p; + CHAR_T *p; /* Set RE flags. */ reflags = 0; @@ -910,7 +898,7 @@ re_compile(sp, ptrn, plen, ptrnp, lenp, rep, flags) reflags |= REG_ICASE; if (O_ISSET(sp, O_ICLOWER)) { for (p = ptrn, len = plen; len > 0; ++p, --len) - if (isupper(*p)) + if (ISUPPER(*p)) break; if (len == 0) reflags |= REG_ICASE; @@ -933,6 +921,7 @@ re_compile(sp, ptrn, plen, ptrnp, lenp, rep, flags) * later recompilation. Free any previously saved value. */ if (ptrnp != NULL) { + replaced = 0; if (LF_ISSET(RE_C_CSCOPE)) { if (re_cscope_conv(sp, &ptrn, &plen, &replaced)) return (1); @@ -965,15 +954,15 @@ re_compile(sp, ptrn, plen, ptrnp, lenp, rep, flags) * Regcomp isn't 8-bit clean, so the pattern is nul-terminated * for now. There's just no other solution. */ - MALLOC(sp, *ptrnp, char *, plen + 1); + MALLOC(sp, *ptrnp, CHAR_T *, (plen + 1) * sizeof(CHAR_T)); if (*ptrnp != NULL) { - memcpy(*ptrnp, ptrn, plen); + MEMCPY(*ptrnp, ptrn, plen); (*ptrnp)[plen] = '\0'; } /* Free up conversion-routine-allocated memory. */ if (replaced) - FREE_SPACE(sp, ptrn, 0); + FREE_SPACEW(sp, ptrn, 0); if (*ptrnp == NULL) return (1); @@ -1023,15 +1012,11 @@ re_compile(sp, ptrn, plen, ptrnp, lenp, rep, flags) * weren't historically. It's a bug. */ static int -re_conv(sp, ptrnp, plenp, replacedp) - SCR *sp; - char **ptrnp; - size_t *plenp; - int *replacedp; +re_conv(SCR *sp, CHAR_T **ptrnp, size_t *plenp, int *replacedp) { size_t blen, len, needlen; int magic; - char *bp, *p, *t; + CHAR_T *bp, *p, *t; /* * First pass through, we figure out how much space we'll need. @@ -1048,11 +1033,11 @@ re_conv(sp, ptrnp, plenp, replacedp) switch (*++p) { case '<': magic = 1; - needlen += sizeof(RE_WSTART); + needlen += RE_WSTART_LEN + 1; break; case '>': magic = 1; - needlen += sizeof(RE_WSTOP); + needlen += RE_WSTOP_LEN + 1; break; case '~': if (!O_ISSET(sp, O_MAGIC)) { @@ -1100,7 +1085,7 @@ re_conv(sp, ptrnp, plenp, replacedp) /* Get enough memory to hold the final pattern. */ *replacedp = 1; - GET_SPACE_RET(sp, bp, blen, needlen); + GET_SPACE_RETW(sp, bp, blen, needlen); for (p = *ptrnp, len = *plenp, t = bp; len > 0; ++p, --len) switch (*p) { @@ -1109,20 +1094,20 @@ re_conv(sp, ptrnp, plenp, replacedp) --len; switch (*++p) { case '<': - memcpy(t, - RE_WSTART, sizeof(RE_WSTART) - 1); - t += sizeof(RE_WSTART) - 1; + MEMCPY(t, + RE_WSTART, RE_WSTART_LEN); + t += RE_WSTART_LEN; break; case '>': - memcpy(t, - RE_WSTOP, sizeof(RE_WSTOP) - 1); - t += sizeof(RE_WSTOP) - 1; + MEMCPY(t, + RE_WSTOP, RE_WSTOP_LEN); + t += RE_WSTOP_LEN; break; case '~': if (O_ISSET(sp, O_MAGIC)) *t++ = '~'; else { - memcpy(t, + MEMCPY(t, sp->repl, sp->repl_len); t += sp->repl_len; } @@ -1143,7 +1128,7 @@ re_conv(sp, ptrnp, plenp, replacedp) break; case '~': if (O_ISSET(sp, O_MAGIC)) { - memcpy(t, sp->repl, sp->repl_len); + MEMCPY(t, sp->repl, sp->repl_len); t += sp->repl_len; } else *t++ = '~'; @@ -1171,21 +1156,17 @@ re_conv(sp, ptrnp, plenp, replacedp) * 1003.2 RE functions can handle. */ static int -re_tag_conv(sp, ptrnp, plenp, replacedp) - SCR *sp; - char **ptrnp; - size_t *plenp; - int *replacedp; +re_tag_conv(SCR *sp, CHAR_T **ptrnp, size_t *plenp, int *replacedp) { size_t blen, len; int lastdollar; - char *bp, *p, *t; + CHAR_T *bp, *p, *t; len = *plenp; /* Max memory usage is 2 times the length of the string. */ *replacedp = 1; - GET_SPACE_RET(sp, bp, blen, len * 2); + GET_SPACE_RETW(sp, bp, blen, len * 2); p = *ptrnp; t = bp; @@ -1222,7 +1203,7 @@ re_tag_conv(sp, ptrnp, plenp, replacedp) if (p[0] == '\\' && (p[1] == '/' || p[1] == '?')) { ++p; --len; - } else if (strchr("^.[]$*", p[0])) + } else if (STRCHR(L("^.[]$*"), p[0])) *t++ = '\\'; *t++ = *p++; } @@ -1240,20 +1221,21 @@ re_tag_conv(sp, ptrnp, plenp, replacedp) * 1003.2 RE functions can handle. */ static int -re_cscope_conv(sp, ptrnp, plenp, replacedp) - SCR *sp; - char **ptrnp; - size_t *plenp; - int *replacedp; +re_cscope_conv(SCR *sp, CHAR_T **ptrnp, size_t *plenp, int *replacedp) { size_t blen, len, nspaces; - char *bp, *p, *t; + CHAR_T *bp, *t; + CHAR_T *p; + CHAR_T *wp; + size_t wlen; /* * Each space in the source line printed by cscope represents an * arbitrary sequence of spaces, tabs, and comments. */ #define CSCOPE_RE_SPACE "([ \t]|/\\*([^*]|\\*/)*\\*/)*" +#define CSCOPE_LEN sizeof(CSCOPE_RE_SPACE) - 1 + CHAR2INT(sp, CSCOPE_RE_SPACE, CSCOPE_LEN, wp, wlen); for (nspaces = 0, p = *ptrnp, len = *plenp; len > 0; ++p, --len) if (*p == ' ') ++nspaces; @@ -1266,27 +1248,27 @@ re_cscope_conv(sp, ptrnp, plenp, replacedp) */ *replacedp = 1; len = (p - *ptrnp) * 2 + (nspaces + 2) * sizeof(CSCOPE_RE_SPACE) + 3; - GET_SPACE_RET(sp, bp, blen, len); + GET_SPACE_RETW(sp, bp, blen, len); p = *ptrnp; t = bp; *t++ = '^'; - memcpy(t, CSCOPE_RE_SPACE, sizeof(CSCOPE_RE_SPACE) - 1); - t += sizeof(CSCOPE_RE_SPACE) - 1; + MEMCPY(t, wp, wlen); + t += wlen; for (len = *plenp; len > 0; ++p, --len) if (*p == ' ') { - memcpy(t, CSCOPE_RE_SPACE, sizeof(CSCOPE_RE_SPACE) - 1); - t += sizeof(CSCOPE_RE_SPACE) - 1; + MEMCPY(t, wp, wlen); + t += wlen; } else { - if (strchr("\\^.[]$*+?()|{}", *p)) + if (STRCHR(L("\\^.[]$*+?()|{}"), *p)) *t++ = '\\'; *t++ = *p; } - memcpy(t, CSCOPE_RE_SPACE, sizeof(CSCOPE_RE_SPACE) - 1); - t += sizeof(CSCOPE_RE_SPACE) - 1; + MEMCPY(t, wp, wlen); + t += wlen; *t++ = '$'; *ptrnp = bp; @@ -1301,18 +1283,14 @@ re_cscope_conv(sp, ptrnp, plenp, replacedp) * PUBLIC: void re_error __P((SCR *, int, regex_t *)); */ void -re_error(sp, errcode, preg) - SCR *sp; - int errcode; - regex_t *preg; +re_error(SCR *sp, int errcode, regex_t *preg) { size_t s; char *oe; s = regerror(errcode, preg, "", 0); - if ((oe = malloc(s)) == NULL) - msgq(sp, M_SYSERR, NULL); - else { + MALLOC(sp, oe, char *, s); + if (oe != NULL) { (void)regerror(errcode, preg, oe, s); msgq(sp, M_ERR, "RE error: %s", oe); free(oe); @@ -1324,22 +1302,23 @@ re_error(sp, errcode, preg) * Do the substitution for a regular expression. */ static int -re_sub(sp, ip, lbp, lbclenp, lblenp, match) - SCR *sp; - char *ip; /* Input line. */ - char **lbp; - size_t *lbclenp, *lblenp; - regmatch_t match[10]; +re_sub( + SCR *sp, + CHAR_T *ip, /* Input line. */ + CHAR_T **lbp, + size_t *lbclenp, + size_t *lblenp, + regmatch_t match[10]) { enum { C_NOTSET, C_LOWER, C_ONELOWER, C_ONEUPPER, C_UPPER } conv; size_t lbclen, lblen; /* Local copies. */ size_t mlen; /* Match length. */ size_t rpl; /* Remaining replacement length. */ - char *rp; /* Replacement pointer. */ + CHAR_T *rp; /* Replacement pointer. */ int ch; int no; /* Match replacement offset. */ - char *p, *t; /* Buffer pointers. */ - char *lb; /* Local copies. */ + CHAR_T *p, *t; /* Buffer pointers. */ + CHAR_T *lb; /* Local copies. */ lb = *lbp; /* Get local copies. */ lbclen = *lbclenp; @@ -1363,8 +1342,8 @@ re_sub(sp, ip, lbp, lbclenp, lblenp, match) * all escaping characters. This (hopefully) matches historic practice. */ #define OUTCH(ch, nltrans) { \ - CHAR_T __ch = (ch); \ - u_int __value = KEY_VAL(sp, __ch); \ + ARG_CHAR_T __ch = (ch); \ + e_key_t __value = KEY_VAL(sp, __ch); \ if (nltrans && (__value == K_CR || __value == K_NL)) { \ NEEDNEWLINE(sp); \ sp->newl[sp->newl_cnt++] = lbclen; \ @@ -1374,15 +1353,15 @@ re_sub(sp, ip, lbp, lbclenp, lblenp, match) conv = C_NOTSET; \ /* FALLTHROUGH */ \ case C_LOWER: \ - if (isupper(__ch)) \ - __ch = tolower(__ch); \ + if (ISUPPER(__ch)) \ + __ch = TOLOWER(__ch); \ break; \ case C_ONEUPPER: \ conv = C_NOTSET; \ /* FALLTHROUGH */ \ case C_UPPER: \ - if (islower(__ch)) \ - __ch = toupper(__ch); \ + if (ISLOWER(__ch)) \ + __ch = TOUPPER(__ch); \ break; \ default: \ abort(); \ @@ -1444,6 +1423,9 @@ subzero: if (match[no].rm_so == -1 || ++rp; conv = C_UPPER; continue; + case '\r': + OUTCH(ch, 0); + continue; default: ++rp; break; diff --git a/ex/ex_tag.c b/ex/ex_tag.c index 461b1526ef00..4ef03fb37d35 100644 --- a/ex/ex_tag.c +++ b/ex/ex_tag.c @@ -13,19 +13,13 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_tag.c 10.36 (Berkeley) 9/15/96"; +static const char sccsid[] = "$Id: ex_tag.c,v 10.54 2012/04/12 07:17:30 zy Exp $"; #endif /* not lint */ -#include -#include /* XXX: param.h may not have included types.h */ - -#ifdef HAVE_SYS_MMAN_H +#include #include -#endif - #include #include -#include #include #include @@ -45,10 +39,10 @@ static const char sccsid[] = "@(#)ex_tag.c 10.36 (Berkeley) 9/15/96"; static char *binary_search __P((char *, char *, char *)); static int compare __P((char *, char *, char *)); static void ctag_file __P((SCR *, TAGF *, char *, char **, size_t *)); -static int ctag_search __P((SCR *, char *, size_t, char *)); +static int ctag_search __P((SCR *, CHAR_T *, size_t, char *)); static int ctag_sfile __P((SCR *, TAGF *, TAGQ *, char *)); -static TAGQ *ctag_slist __P((SCR *, char *)); -static char *linear_search __P((char *, char *, char *)); +static TAGQ *ctag_slist __P((SCR *, CHAR_T *)); +static char *linear_search __P((char *, char *, char *, long)); static int tag_copy __P((SCR *, TAG *, TAG **)); static int tag_pop __P((SCR *, TAGQ *, int)); static int tagf_copy __P((SCR *, TAGF *, TAGF **)); @@ -59,19 +53,16 @@ static int tagq_copy __P((SCR *, TAGQ *, TAGQ **)); * ex_tag_first -- * The tag code can be entered from main, e.g., "vi -t tag". * - * PUBLIC: int ex_tag_first __P((SCR *, char *)); + * PUBLIC: int ex_tag_first __P((SCR *, CHAR_T *)); */ int -ex_tag_first(sp, tagarg) - SCR *sp; - char *tagarg; +ex_tag_first(SCR *sp, CHAR_T *tagarg) { - ARGS *ap[2], a; EXCMD cmd; /* Build an argument for the ex :tag command. */ - ex_cinit(&cmd, C_TAG, 0, OOBLNO, OOBLNO, 0, ap); - ex_cadd(&cmd, &a, tagarg, strlen(tagarg)); + ex_cinit(sp, &cmd, C_TAG, 0, OOBLNO, OOBLNO, 0); + argv_exp0(sp, &cmd, tagarg, STRLEN(tagarg)); /* * XXX @@ -98,18 +89,11 @@ ex_tag_first(sp, tagarg) * PUBLIC: int ex_tag_push __P((SCR *, EXCMD *)); */ int -ex_tag_push(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_tag_push(SCR *sp, EXCMD *cmdp) { EX_PRIVATE *exp; - FREF *frp; - TAG *rtp; - TAGQ *rtqp, *tqp; - recno_t lno; - size_t cno; + TAGQ *tqp; long tl; - int force, istmp; exp = EXP(sp); switch (cmdp->argc) { @@ -117,14 +101,15 @@ ex_tag_push(sp, cmdp) if (exp->tag_last != NULL) free(exp->tag_last); - if ((exp->tag_last = strdup(cmdp->argv[0]->bp)) == NULL) { + if ((exp->tag_last = v_wstrdup(sp, cmdp->argv[0]->bp, + cmdp->argv[0]->len)) == NULL) { msgq(sp, M_SYSERR, NULL); return (1); } /* Taglength may limit the number of characters. */ if ((tl = - O_VAL(sp, O_TAGLENGTH)) != 0 && strlen(exp->tag_last) > tl) + O_VAL(sp, O_TAGLENGTH)) != 0 && STRLEN(exp->tag_last) > tl) exp->tag_last[tl] = '\0'; break; case 0: @@ -141,91 +126,11 @@ ex_tag_push(sp, cmdp) if ((tqp = ctag_slist(sp, exp->tag_last)) == NULL) return (1); - /* - * Allocate all necessary memory before swapping screens. Initialize - * flags so we know what to free. - */ - rtp = NULL; - rtqp = NULL; - if (exp->tq.cqh_first == (void *)&exp->tq) { - /* Initialize the `local context' tag queue structure. */ - CALLOC_GOTO(sp, rtqp, TAGQ *, 1, sizeof(TAGQ)); - CIRCLEQ_INIT(&rtqp->tagq); + if (tagq_push(sp, tqp, F_ISSET(cmdp, E_NEWSCREEN), + FL_ISSET(cmdp->iflags, E_C_FORCE))) + return 1; - /* Initialize and link in its tag structure. */ - CALLOC_GOTO(sp, rtp, TAG *, 1, sizeof(TAG)); - CIRCLEQ_INSERT_HEAD(&rtqp->tagq, rtp, q); - rtqp->current = rtp; - } - - /* - * Stick the current context information in a convenient place, we're - * about to lose it. Note, if we're called on editor startup, there - * will be no FREF structure. - */ - frp = sp->frp; - lno = sp->lno; - cno = sp->cno; - istmp = frp == NULL || - F_ISSET(frp, FR_TMPFILE) && !F_ISSET(cmdp, E_NEWSCREEN); - - /* Try to switch to the tag. */ - force = FL_ISSET(cmdp->iflags, E_C_FORCE); - if (F_ISSET(cmdp, E_NEWSCREEN)) { - if (ex_tag_Nswitch(sp, tqp->tagq.cqh_first, force)) - goto err; - - /* Everything else gets done in the new screen. */ - sp = sp->nextdisp; - exp = EXP(sp); - } else - if (ex_tag_nswitch(sp, tqp->tagq.cqh_first, force)) - goto err; - - /* - * If this is the first tag, put a `current location' queue entry - * in place, so we can pop all the way back to the current mark. - * Note, it doesn't point to much of anything, it's a placeholder. - */ - if (exp->tq.cqh_first == (void *)&exp->tq) { - CIRCLEQ_INSERT_HEAD(&exp->tq, rtqp, q); - } else - rtqp = exp->tq.cqh_first; - - /* Link the new TAGQ structure into place. */ - CIRCLEQ_INSERT_HEAD(&exp->tq, tqp, q); - - (void)ctag_search(sp, - tqp->current->search, tqp->current->slen, tqp->tag); - - /* - * Move the current context from the temporary save area into the - * right structure. - * - * If we were in a temporary file, we don't have a context to which - * we can return, so just make it be the same as what we're moving - * to. It will be a little odd that ^T doesn't change anything, but - * I don't think it's a big deal. - */ - if (istmp) { - rtqp->current->frp = sp->frp; - rtqp->current->lno = sp->lno; - rtqp->current->cno = sp->cno; - } else { - rtqp->current->frp = frp; - rtqp->current->lno = lno; - rtqp->current->cno = cno; - } - return (0); - -err: -alloc_err: - if (rtqp != NULL) - free(rtqp); - if (rtp != NULL) - free(rtp); - tagq_free(sp, tqp); - return (1); + return 0; } /* @@ -235,20 +140,20 @@ ex_tag_push(sp, cmdp) * PUBLIC: int ex_tag_next __P((SCR *, EXCMD *)); */ int -ex_tag_next(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_tag_next(SCR *sp, EXCMD *cmdp) { EX_PRIVATE *exp; TAG *tp; TAGQ *tqp; + char *np; + size_t nlen; exp = EXP(sp); - if ((tqp = exp->tq.cqh_first) == (void *)&exp->tq) { + if ((tqp = TAILQ_FIRST(exp->tq)) == NULL) { tag_msg(sp, TAG_EMPTY, NULL); return (1); } - if ((tp = tqp->current->q.cqe_next) == (void *)&tqp->tagq) { + if ((tp = TAILQ_NEXT(tqp->current, q)) == NULL) { msgq(sp, M_ERR, "282|Already at the last tag of this group"); return (1); } @@ -260,6 +165,11 @@ ex_tag_next(sp, cmdp) (void)cscope_search(sp, tqp, tp); else (void)ctag_search(sp, tp->search, tp->slen, tqp->tag); + if (tqp->current->msg) { + INT2CHAR(sp, tqp->current->msg, tqp->current->mlen + 1, + np, nlen); + msgq(sp, M_INFO, "%s", np); + } return (0); } @@ -270,20 +180,20 @@ ex_tag_next(sp, cmdp) * PUBLIC: int ex_tag_prev __P((SCR *, EXCMD *)); */ int -ex_tag_prev(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_tag_prev(SCR *sp, EXCMD *cmdp) { EX_PRIVATE *exp; TAG *tp; TAGQ *tqp; + char *np; + size_t nlen; exp = EXP(sp); - if ((tqp = exp->tq.cqh_first) == (void *)&exp->tq) { + if ((tqp = TAILQ_FIRST(exp->tq)) == NULL) { tag_msg(sp, TAG_EMPTY, NULL); return (0); } - if ((tp = tqp->current->q.cqe_prev) == (void *)&tqp->tagq) { + if ((tp = TAILQ_PREV(tqp->current, _tagqh, q)) == NULL) { msgq(sp, M_ERR, "255|Already at the first tag of this group"); return (1); } @@ -295,6 +205,11 @@ ex_tag_prev(sp, cmdp) (void)cscope_search(sp, tqp, tp); else (void)ctag_search(sp, tp->search, tp->slen, tqp->tag); + if (tqp->current->msg) { + INT2CHAR(sp, tqp->current->msg, tqp->current->mlen + 1, + np, nlen); + msgq(sp, M_INFO, "%s", np); + } return (0); } @@ -305,10 +220,7 @@ ex_tag_prev(sp, cmdp) * PUBLIC: int ex_tag_nswitch __P((SCR *, TAG *, int)); */ int -ex_tag_nswitch(sp, tp, force) - SCR *sp; - TAG *tp; - int force; +ex_tag_nswitch(SCR *sp, TAG *tp, int force) { /* Get a file structure. */ if (tp->frp == NULL && (tp->frp = file_add(sp, tp->fname)) == NULL) @@ -342,10 +254,7 @@ ex_tag_nswitch(sp, tp, force) * PUBLIC: int ex_tag_Nswitch __P((SCR *, TAG *, int)); */ int -ex_tag_Nswitch(sp, tp, force) - SCR *sp; - TAG *tp; - int force; +ex_tag_Nswitch(SCR *sp, TAG *tp, int force) { SCR *new; @@ -399,19 +308,18 @@ ex_tag_Nswitch(sp, tp, force) * PUBLIC: int ex_tag_pop __P((SCR *, EXCMD *)); */ int -ex_tag_pop(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_tag_pop(SCR *sp, EXCMD *cmdp) { EX_PRIVATE *exp; TAGQ *tqp, *dtqp; size_t arglen; long off; char *arg, *p, *t; + size_t nlen; /* Check for an empty stack. */ exp = EXP(sp); - if (exp->tq.cqh_first == (void *)&exp->tq) { + if (TAILQ_EMPTY(exp->tq)) { tag_msg(sp, TAG_EMPTY, NULL); return (1); } @@ -419,10 +327,11 @@ ex_tag_pop(sp, cmdp) /* Find the last TAG structure that we're going to DISCARD! */ switch (cmdp->argc) { case 0: /* Pop one tag. */ - dtqp = exp->tq.cqh_first; + dtqp = TAILQ_FIRST(exp->tq); break; case 1: /* Name or number. */ - arg = cmdp->argv[0]->bp; + INT2CHAR(sp, cmdp->argv[0]->bp, cmdp->argv[0]->len+1, + arg, nlen); off = strtol(arg, &p, 10); if (*p != '\0') goto filearg; @@ -430,10 +339,9 @@ ex_tag_pop(sp, cmdp) /* Number: pop that many queue entries. */ if (off < 1) return (0); - for (tqp = exp->tq.cqh_first; - tqp != (void *)&exp->tq && --off > 1; - tqp = tqp->q.cqe_next); - if (tqp == (void *)&exp->tq) { + TAILQ_FOREACH(tqp, exp->tq, q) + if (--off <= 1) break; + if (tqp == NULL) { msgq(sp, M_ERR, "159|Less than %s entries on the tags stack; use :display t[ags]", arg); @@ -444,11 +352,10 @@ ex_tag_pop(sp, cmdp) /* File argument: pop to that queue entry. */ filearg: arglen = strlen(arg); - for (tqp = exp->tq.cqh_first; - tqp != (void *)&exp->tq; - dtqp = tqp, tqp = tqp->q.cqe_next) { + for (tqp = TAILQ_FIRST(exp->tq); tqp; + dtqp = tqp, tqp = TAILQ_NEXT(tqp, q)) { /* Don't pop to the current file. */ - if (tqp == exp->tq.cqh_first) + if (tqp == TAILQ_FIRST(exp->tq)) continue; p = tqp->current->frp->name; if ((t = strrchr(p, '/')) == NULL) @@ -458,12 +365,12 @@ filearg: arglen = strlen(arg); if (!strncmp(arg, t, arglen)) break; } - if (tqp == (void *)&exp->tq) { + if (tqp == NULL) { msgq_str(sp, M_ERR, arg, "160|No file %s on the tags stack to return to; use :display t[ags]"); return (1); } - if (tqp == exp->tq.cqh_first) + if (tqp == TAILQ_FIRST(exp->tq)) return (0); break; default: @@ -480,23 +387,21 @@ filearg: arglen = strlen(arg); * PUBLIC: int ex_tag_top __P((SCR *, EXCMD *)); */ int -ex_tag_top(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_tag_top(SCR *sp, EXCMD *cmdp) { EX_PRIVATE *exp; exp = EXP(sp); /* Check for an empty stack. */ - if (exp->tq.cqh_first == (void *)&exp->tq) { + if (TAILQ_EMPTY(exp->tq)) { tag_msg(sp, TAG_EMPTY, NULL); return (1); } /* Return to the oldest information. */ - return (tag_pop(sp, - exp->tq.cqh_last->q.cqe_prev, FL_ISSET(cmdp->iflags, E_C_FORCE))); + return (tag_pop(sp, TAILQ_PREV(TAILQ_LAST(exp->tq, _tqh), _tqh, q), + FL_ISSET(cmdp->iflags, E_C_FORCE))); } /* @@ -504,10 +409,7 @@ ex_tag_top(sp, cmdp) * Pop up to and including the specified TAGQ context. */ static int -tag_pop(sp, dtqp, force) - SCR *sp; - TAGQ *dtqp; - int force; +tag_pop(SCR *sp, TAGQ *dtqp, int force) { EX_PRIVATE *exp; TAG *tp; @@ -519,7 +421,7 @@ tag_pop(sp, dtqp, force) * Update the cursor from the saved TAG information of the TAG * structure we're moving to. */ - tp = dtqp->q.cqe_next->current; + tp = TAILQ_NEXT(dtqp, q)->current; if (tp->frp == sp->frp) { sp->lno = tp->lno; sp->cno = tp->cno; @@ -538,7 +440,7 @@ tag_pop(sp, dtqp, force) /* Pop entries off the queue up to and including dtqp. */ do { - tqp = exp->tq.cqh_first; + tqp = TAILQ_FIRST(exp->tq); if (tagq_free(sp, tqp)) return (0); } while (tqp != dtqp); @@ -547,8 +449,8 @@ tag_pop(sp, dtqp, force) * If only a single tag left, we've returned to the first tag point, * and the stack is now empty. */ - if (exp->tq.cqh_first->q.cqe_next == (void *)&exp->tq) - tagq_free(sp, exp->tq.cqh_first); + if (TAILQ_NEXT(TAILQ_FIRST(exp->tq), q) == NULL) + tagq_free(sp, TAILQ_FIRST(exp->tq)); return (0); } @@ -560,18 +462,17 @@ tag_pop(sp, dtqp, force) * PUBLIC: int ex_tag_display __P((SCR *)); */ int -ex_tag_display(sp) - SCR *sp; +ex_tag_display(SCR *sp) { EX_PRIVATE *exp; TAG *tp; TAGQ *tqp; int cnt; size_t len; - char *p, *sep; + char *p; exp = EXP(sp); - if ((tqp = exp->tq.cqh_first) == (void *)&exp->tq) { + if (TAILQ_EMPTY(exp->tq)) { tag_msg(sp, TAG_EMPTY, NULL); return (0); } @@ -599,11 +500,10 @@ ex_tag_display(sp) * Display the list of tags for each queue entry. The first entry * is numbered, and the current tag entry has an asterisk appended. */ - for (cnt = 1, tqp = exp->tq.cqh_first; !INTERRUPTED(sp) && - tqp != (void *)&exp->tq; ++cnt, tqp = tqp->q.cqe_next) - for (tp = tqp->tagq.cqh_first; - tp != (void *)&tqp->tagq; tp = tp->q.cqe_next) { - if (tp == tqp->tagq.cqh_first) + for (cnt = 1, tqp = TAILQ_FIRST(exp->tq); !INTERRUPTED(sp) && + tqp != NULL; ++cnt, tqp = TAILQ_NEXT(tqp, q)) + TAILQ_FOREACH(tp, tqp->tagq, q) { + if (tp == TAILQ_FIRST(tqp->tagq)) (void)ex_printf(sp, "%2d ", cnt); else (void)ex_printf(sp, " "); @@ -618,7 +518,7 @@ ex_tag_display(sp) if (tqp->current == tp) (void)ex_printf(sp, "*"); - if (tp == tqp->tagq.cqh_first && tqp->tag != NULL && + if (tp == TAILQ_FIRST(tqp->tagq) && tqp->tag != NULL && (sp->cols - L_NAME) >= L_TAG + L_SPACE) { len = strlen(tqp->tag); if (len > sp->cols - (L_NAME + L_SPACE)) @@ -639,8 +539,7 @@ ex_tag_display(sp) * PUBLIC: int ex_tag_copy __P((SCR *, SCR *)); */ int -ex_tag_copy(orig, sp) - SCR *orig, *sp; +ex_tag_copy(SCR *orig, SCR *sp) { EX_PRIVATE *oexp, *nexp; TAGQ *aqp, *tqp; @@ -651,33 +550,31 @@ ex_tag_copy(orig, sp) nexp = EXP(sp); /* Copy tag queue and tags stack. */ - for (aqp = oexp->tq.cqh_first; - aqp != (void *)&oexp->tq; aqp = aqp->q.cqe_next) { + TAILQ_FOREACH(aqp, oexp->tq, q) { if (tagq_copy(sp, aqp, &tqp)) return (1); - for (ap = aqp->tagq.cqh_first; - ap != (void *)&aqp->tagq; ap = ap->q.cqe_next) { + TAILQ_FOREACH(ap, aqp->tagq, q) { if (tag_copy(sp, ap, &tp)) return (1); /* Set the current pointer. */ if (aqp->current == ap) tqp->current = tp; - CIRCLEQ_INSERT_TAIL(&tqp->tagq, tp, q); + TAILQ_INSERT_TAIL(tqp->tagq, tp, q); } - CIRCLEQ_INSERT_TAIL(&nexp->tq, tqp, q); + TAILQ_INSERT_TAIL(nexp->tq, tqp, q); } /* Copy list of tag files. */ - for (atfp = oexp->tagfq.tqh_first; - atfp != NULL; atfp = atfp->q.tqe_next) { + TAILQ_FOREACH(atfp, oexp->tagfq, q) { if (tagf_copy(sp, atfp, &tfp)) return (1); - TAILQ_INSERT_TAIL(&nexp->tagfq, tfp, q); + TAILQ_INSERT_TAIL(nexp->tagfq, tfp, q); } /* Copy the last tag. */ if (oexp->tag_last != NULL && - (nexp->tag_last = strdup(oexp->tag_last)) == NULL) { + (nexp->tag_last = v_wstrdup(sp, oexp->tag_last, + STRLEN(oexp->tag_last))) == NULL) { msgq(sp, M_SYSERR, NULL); return (1); } @@ -689,9 +586,7 @@ ex_tag_copy(orig, sp) * Copy a TAGF structure and return it in new memory. */ static int -tagf_copy(sp, otfp, tfpp) - SCR *sp; - TAGF *otfp, **tfpp; +tagf_copy(SCR *sp, TAGF *otfp, TAGF **tfpp) { TAGF *tfp; @@ -711,9 +606,7 @@ tagf_copy(sp, otfp, tfpp) * Copy a TAGQ structure and return it in new memory. */ static int -tagq_copy(sp, otqp, tqpp) - SCR *sp; - TAGQ *otqp, **tqpp; +tagq_copy(SCR *sp, TAGQ *otqp, TAGQ **tqpp) { TAGQ *tqp; size_t len; @@ -724,7 +617,7 @@ tagq_copy(sp, otqp, tqpp) MALLOC_RET(sp, tqp, TAGQ *, len); memcpy(tqp, otqp, len); - CIRCLEQ_INIT(&tqp->tagq); + TAILQ_INIT(tqp->tagq); tqp->current = NULL; if (otqp->tag != NULL) tqp->tag = tqp->buf; @@ -738,9 +631,7 @@ tagq_copy(sp, otqp, tqpp) * Copy a TAG structure and return it in new memory. */ static int -tag_copy(sp, otp, tpp) - SCR *sp; - TAG *otp, **tpp; +tag_copy(SCR *sp, TAG *otp, TAG **tpp) { TAG *tp; size_t len; @@ -750,13 +641,17 @@ tag_copy(sp, otp, tpp) len += otp->fnlen + 1; if (otp->search != NULL) len += otp->slen + 1; + if (otp->msg != NULL) + len += otp->mlen + 1; MALLOC_RET(sp, tp, TAG *, len); memcpy(tp, otp, len); if (otp->fname != NULL) - tp->fname = tp->buf; + tp->fname = (char *)tp->buf; if (otp->search != NULL) - tp->search = tp->fname + otp->fnlen + 1; + tp->search = tp->buf + (otp->search - otp->buf); + if (otp->msg != NULL) + tp->msg = tp->buf + (otp->msg - otp->buf); *tpp = tp; return (0); @@ -767,14 +662,12 @@ tag_copy(sp, otp, tpp) * Free a TAGF structure. */ static int -tagf_free(sp, tfp) - SCR *sp; - TAGF *tfp; +tagf_free(SCR *sp, TAGF *tfp) { EX_PRIVATE *exp; exp = EXP(sp); - TAILQ_REMOVE(&exp->tagfq, tfp, q); + TAILQ_REMOVE(exp->tagfq, tfp, q); free(tfp->name); free(tfp); return (0); @@ -787,16 +680,14 @@ tagf_free(sp, tfp) * PUBLIC: int tagq_free __P((SCR *, TAGQ *)); */ int -tagq_free(sp, tqp) - SCR *sp; - TAGQ *tqp; +tagq_free(SCR *sp, TAGQ *tqp) { EX_PRIVATE *exp; TAG *tp; exp = EXP(sp); - while ((tp = tqp->tagq.cqh_first) != (void *)&tqp->tagq) { - CIRCLEQ_REMOVE(&tqp->tagq, tp, q); + while ((tp = TAILQ_FIRST(tqp->tagq)) != NULL) { + TAILQ_REMOVE(tqp->tagq, tp, q); free(tp); } /* @@ -804,12 +695,121 @@ tagq_free(sp, tqp) * If allocated and then the user failed to switch files, the TAGQ * structure was never attached to any list. */ - if (tqp->q.cqe_next != NULL) - CIRCLEQ_REMOVE(&exp->tq, tqp, q); + if (TAILQ_ENTRY_ISVALID(tqp, q)) + TAILQ_REMOVE(exp->tq, tqp, q); free(tqp); return (0); } +/* + * PUBLIC: int tagq_push __P((SCR*, TAGQ*, int, int )); + */ +int +tagq_push(SCR *sp, TAGQ *tqp, int new_screen, int force) +{ + EX_PRIVATE *exp; + FREF *frp; + TAG *rtp; + TAGQ *rtqp; + recno_t lno; + size_t cno; + int istmp; + char *np; + size_t nlen; + + exp = EXP(sp); + + /* + * Allocate all necessary memory before swapping screens. Initialize + * flags so we know what to free. + */ + rtp = NULL; + rtqp = NULL; + if (TAILQ_EMPTY(exp->tq)) { + /* Initialize the `local context' tag queue structure. */ + CALLOC_GOTO(sp, rtqp, TAGQ *, 1, sizeof(TAGQ)); + TAILQ_INIT(rtqp->tagq); + + /* Initialize and link in its tag structure. */ + CALLOC_GOTO(sp, rtp, TAG *, 1, sizeof(TAG)); + TAILQ_INSERT_HEAD(rtqp->tagq, rtp, q); + rtqp->current = rtp; + } + + /* + * Stick the current context information in a convenient place, we're + * about to lose it. Note, if we're called on editor startup, there + * will be no FREF structure. + */ + frp = sp->frp; + lno = sp->lno; + cno = sp->cno; + istmp = frp == NULL || + (F_ISSET(frp, FR_TMPFILE) && !new_screen); + + /* Try to switch to the preset tag. */ + if (new_screen) { + if (ex_tag_Nswitch(sp, tqp->current, force)) + goto err; + + /* Everything else gets done in the new screen. */ + sp = sp->nextdisp; + exp = EXP(sp); + } else + if (ex_tag_nswitch(sp, tqp->current, force)) + goto err; + + /* + * If this is the first tag, put a `current location' queue entry + * in place, so we can pop all the way back to the current mark. + * Note, it doesn't point to much of anything, it's a placeholder. + */ + if (TAILQ_EMPTY(exp->tq)) { + TAILQ_INSERT_HEAD(exp->tq, rtqp, q); + } else + rtqp = TAILQ_FIRST(exp->tq); + + /* Link the new TAGQ structure into place. */ + TAILQ_INSERT_HEAD(exp->tq, tqp, q); + + (void)ctag_search(sp, + tqp->current->search, tqp->current->slen, tqp->tag); + if (tqp->current->msg) { + INT2CHAR(sp, tqp->current->msg, tqp->current->mlen + 1, + np, nlen); + msgq(sp, M_INFO, "%s", np); + } + + /* + * Move the current context from the temporary save area into the + * right structure. + * + * If we were in a temporary file, we don't have a context to which + * we can return, so just make it be the same as what we're moving + * to. It will be a little odd that ^T doesn't change anything, but + * I don't think it's a big deal. + */ + if (istmp) { + rtqp->current->frp = sp->frp; + rtqp->current->lno = sp->lno; + rtqp->current->cno = sp->cno; + } else { + rtqp->current->frp = frp; + rtqp->current->lno = lno; + rtqp->current->cno = cno; + } + return (0); + +err: +alloc_err: + if (rtqp != NULL) + free(rtqp); + if (rtp != NULL) + free(rtp); + tagq_free(sp, tqp); + return (1); +} + /* * tag_msg * A few common messages. @@ -817,10 +817,7 @@ tagq_free(sp, tqp) * PUBLIC: void tag_msg __P((SCR *, tagmsg_t, char *)); */ void -tag_msg(sp, msg, tag) - SCR *sp; - tagmsg_t msg; - char *tag; +tag_msg(SCR *sp, tagmsg_t msg, char *tag) { switch (msg) { case TAG_BADLNO: @@ -845,9 +842,7 @@ tag_msg(sp, msg, tag) * PUBLIC: int ex_tagf_alloc __P((SCR *, char *)); */ int -ex_tagf_alloc(sp, str) - SCR *sp; - char *str; +ex_tagf_alloc(SCR *sp, char *str) { EX_PRIVATE *exp; TAGF *tfp; @@ -856,13 +851,13 @@ ex_tagf_alloc(sp, str) /* Free current queue. */ exp = EXP(sp); - while ((tfp = exp->tagfq.tqh_first) != NULL) + while ((tfp = TAILQ_FIRST(exp->tagfq)) != NULL) tagf_free(sp, tfp); /* Create new queue. */ for (p = t = str;; ++p) { - if (*p == '\0' || isblank(*p)) { - if ((len = p - t) > 1) { + if (*p == '\0' || cmdskip(*p)) { + if ((len = p - t)) { MALLOC_RET(sp, tfp, TAGF *, sizeof(TAGF)); MALLOC(sp, tfp->name, char *, len + 1); if (tfp->name == NULL) { @@ -872,7 +867,7 @@ ex_tagf_alloc(sp, str) memcpy(tfp->name, t, len); tfp->name[len] = '\0'; tfp->flags = 0; - TAILQ_INSERT_TAIL(&exp->tagfq, tfp, q); + TAILQ_INSERT_TAIL(exp->tagfq, tfp, q); } t = p + 1; } @@ -889,8 +884,7 @@ ex_tagf_alloc(sp, str) * PUBLIC: int ex_tag_free __P((SCR *)); */ int -ex_tag_free(sp) - SCR *sp; +ex_tag_free(SCR *sp) { EX_PRIVATE *exp; TAGF *tfp; @@ -898,9 +892,9 @@ ex_tag_free(sp) /* Free up tag information. */ exp = EXP(sp); - while ((tqp = exp->tq.cqh_first) != (void *)&exp->tq) + while ((tqp = TAILQ_FIRST(exp->tq)) != NULL) tagq_free(sp, tqp); - while ((tfp = exp->tagfq.tqh_first) != NULL) + while ((tfp = TAILQ_FIRST(exp->tagfq)) != NULL) tagf_free(sp, tfp); if (exp->tag_last != NULL) free(exp->tag_last); @@ -912,13 +906,12 @@ ex_tag_free(sp) * Search a file for a tag. */ static int -ctag_search(sp, search, slen, tag) - SCR *sp; - char *search, *tag; - size_t slen; +ctag_search(SCR *sp, CHAR_T *search, size_t slen, char *tag) { MARK m; char *p; + char *np; + size_t nlen; /* * !!! @@ -926,8 +919,9 @@ ctag_search(sp, search, slen, tag) * used a line number, not a search string. I got complaints, so * people are still using the format. POSIX 1003.2 permits it. */ - if (isdigit(search[0])) { - m.lno = atoi(search); + if (ISDIGIT(search[0])) { + INT2CHAR(sp, search, slen+1, np, nlen); + m.lno = atoi(np); if (!db_exist(sp, m.lno)) { tag_msg(sp, TAG_BADLNO, tag); return (1); @@ -940,9 +934,10 @@ ctag_search(sp, search, slen, tag) m.lno = 1; m.cno = 0; if (f_search(sp, &m, &m, - search, slen, NULL, SEARCH_FILE | SEARCH_TAG)) - if ((p = strrchr(search, '(')) != NULL) { - slen = p - search; + search, slen, NULL, SEARCH_FILE | SEARCH_TAG)) { + INT2CHAR(sp, search, slen, np, nlen); + if ((p = strrchr(np, '(')) != NULL) { + slen = p - np; if (f_search(sp, &m, &m, search, slen, NULL, SEARCH_FILE | SEARCH_TAG)) goto notfound; @@ -950,6 +945,7 @@ ctag_search(sp, search, slen, tag) notfound: tag_msg(sp, TAG_SEARCH, tag); return (1); } + } /* * !!! * Historically, tags set the search direction if it wasn't @@ -974,43 +970,42 @@ notfound: tag_msg(sp, TAG_SEARCH, tag); * Search the list of tags files for a tag, and return tag queue. */ static TAGQ * -ctag_slist(sp, tag) - SCR *sp; - char *tag; +ctag_slist(SCR *sp, CHAR_T *tag) { EX_PRIVATE *exp; TAGF *tfp; TAGQ *tqp; size_t len; - int echk; + int echk = 0; + char *np; + size_t nlen; exp = EXP(sp); /* Allocate and initialize the tag queue structure. */ - len = strlen(tag); + INT2CHAR(sp, tag, STRLEN(tag) + 1, np, nlen); + len = nlen - 1; CALLOC_GOTO(sp, tqp, TAGQ *, 1, sizeof(TAGQ) + len + 1); - CIRCLEQ_INIT(&tqp->tagq); + TAILQ_INIT(tqp->tagq); tqp->tag = tqp->buf; - memcpy(tqp->tag, tag, (tqp->tlen = len) + 1); + memcpy(tqp->tag, np, (tqp->tlen = len) + 1); /* * Find the tag, only display missing file messages once, and * then only if we didn't find the tag. */ - for (echk = 0, - tfp = exp->tagfq.tqh_first; tfp != NULL; tfp = tfp->q.tqe_next) - if (ctag_sfile(sp, tfp, tqp, tag)) { + TAILQ_FOREACH(tfp, exp->tagfq, q) + if (ctag_sfile(sp, tfp, tqp, tqp->tag)) { echk = 1; F_SET(tfp, TAGF_ERR); } else F_CLR(tfp, TAGF_ERR | TAGF_ERR_WARN); /* Check to see if we found anything. */ - if (tqp->tagq.cqh_first == (void *)&tqp->tagq) { - msgq_str(sp, M_ERR, tag, "162|%s: tag not found"); + if (TAILQ_EMPTY(tqp->tagq)) { + msgq_str(sp, M_ERR, tqp->tag, "162|%s: tag not found"); if (echk) - for (tfp = exp->tagfq.tqh_first; - tfp != NULL; tfp = tfp->q.tqe_next) + TAILQ_FOREACH(tfp, exp->tagfq, q) if (F_ISSET(tfp, TAGF_ERR) && !F_ISSET(tfp, TAGF_ERR_WARN)) { errno = tfp->errnum; @@ -1021,7 +1016,6 @@ ctag_slist(sp, tag) return (NULL); } - tqp->current = tqp->tagq.cqh_first; return (tqp); alloc_err: @@ -1033,51 +1027,36 @@ ctag_slist(sp, tag) * Search a tags file for a tag, adding any found to the tag queue. */ static int -ctag_sfile(sp, tfp, tqp, tname) - SCR *sp; - TAGF *tfp; - TAGQ *tqp; - char *tname; +ctag_sfile(SCR *sp, TAGF *tfp, TAGQ *tqp, char *tname) { struct stat sb; TAG *tp; - size_t dlen, nlen, slen; + size_t dlen, nlen = 0, slen; int fd, i, nf1, nf2; - char *back, *cname, *dname, *front, *map, *name, *p, *search, *t; + char *back, *front, *map, *p, *search, *t; + char *cname = NULL, *dname = NULL, *name = NULL; + CHAR_T *wp; + size_t wlen; + long tl; if ((fd = open(tfp->name, O_RDONLY, 0)) < 0) { tfp->errnum = errno; return (1); } - /* - * XXX - * Some old BSD systems require MAP_FILE as an argument when mapping - * regular files. - */ -#ifndef MAP_FILE -#define MAP_FILE 0 -#endif - /* - * XXX - * We'd like to test if the file is too big to mmap. Since we don't - * know what size or type off_t's or size_t's are, what the largest - * unsigned integral type is, or what random insanity the local C - * compiler will perpetrate, doing the comparison in a portable way - * is flatly impossible. Hope mmap fails if the file is too large. - */ if (fstat(fd, &sb) != 0 || - (map = mmap(NULL, (size_t)sb.st_size, PROT_READ | PROT_WRITE, - MAP_FILE | MAP_PRIVATE, fd, (off_t)0)) == (caddr_t)-1) { + (map = mmap(NULL, sb.st_size, PROT_READ | PROT_WRITE, + MAP_PRIVATE, fd, 0)) == MAP_FAILED) { tfp->errnum = errno; (void)close(fd); return (1); } + tl = O_VAL(sp, O_TAGLENGTH); front = map; back = front + sb.st_size; front = binary_search(tname, front, back); - front = linear_search(tname, front, back); + front = linear_search(tname, front, back, tl); if (front == NULL) goto done; @@ -1140,29 +1119,41 @@ corrupt: p = msg_print(sp, tname, &nf1); } /* Check for passing the last entry. */ - if (strcmp(tname, cname)) + if (tl ? strncmp(tname, cname, tl) : strcmp(tname, cname)) break; /* Resolve the file name. */ ctag_file(sp, tfp, name, &dname, &dlen); CALLOC_GOTO(sp, tp, - TAG *, 1, sizeof(TAG) + dlen + 2 + nlen + 1 + slen + 1); - tp->fname = tp->buf; - if (dlen != 0) { + TAG *, 1, sizeof(TAG) + dlen + 2 + nlen + 1 + + (slen + 1) * sizeof(CHAR_T)); + tp->fname = (char *)tp->buf; + if (dlen == 1 && *dname == '.') + --dlen; + else if (dlen != 0) { memcpy(tp->fname, dname, dlen); tp->fname[dlen] = '/'; ++dlen; } memcpy(tp->fname + dlen, name, nlen + 1); tp->fnlen = dlen + nlen; - tp->search = tp->fname + tp->fnlen + 1; - memcpy(tp->search, search, (tp->slen = slen) + 1); - CIRCLEQ_INSERT_TAIL(&tqp->tagq, tp, q); + tp->search = (CHAR_T*)(tp->fname + tp->fnlen + 1); + CHAR2INT(sp, search, slen + 1, wp, wlen); + MEMCPY(tp->search, wp, (tp->slen = slen) + 1); + TAILQ_INSERT_TAIL(tqp->tagq, tp, q); + + /* Try to preset the tag within the current file. */ + if (sp->frp != NULL && sp->frp->name != NULL && + tqp->current == NULL && !strcmp(tp->fname, sp->frp->name)) + tqp->current = tp; } + if (tqp->current == NULL) + tqp->current = TAILQ_FIRST(tqp->tagq); + alloc_err: -done: if (munmap(map, (size_t)sb.st_size)) +done: if (munmap(map, sb.st_size)) msgq(sp, M_SYSERR, "munmap"); if (close(fd)) msgq(sp, M_SYSERR, "close"); @@ -1174,15 +1165,10 @@ done: if (munmap(map, (size_t)sb.st_size)) * Search for the right path to this file. */ static void -ctag_file(sp, tfp, name, dirp, dlenp) - SCR *sp; - TAGF *tfp; - char *name, **dirp; - size_t *dlenp; +ctag_file(SCR *sp, TAGF *tfp, char *name, char **dirp, size_t *dlenp) { struct stat sb; - size_t len; - char *p, buf[MAXPATHLEN]; + char *p, *buf; /* * !!! @@ -1196,12 +1182,16 @@ ctag_file(sp, tfp, name, dirp, dlenp) if (name[0] != '/' && stat(name, &sb) && (p = strrchr(tfp->name, '/')) != NULL) { *p = '\0'; - len = snprintf(buf, sizeof(buf), "%s/%s", tfp->name, name); - *p = '/'; + if ((buf = join(tfp->name, name)) == NULL) { + msgq(sp, M_SYSERR, NULL); + return; + } if (stat(buf, &sb) == 0) { *dirp = tfp->name; *dlenp = strlen(*dirp); } + free(buf); + *p = '/'; } } @@ -1247,11 +1237,11 @@ ctag_file(sp, tfp, name, dirp, dlenp) #define GREATER 1 #define LESS (-1) -#define SKIP_PAST_NEWLINE(p, back) while (p < back && *p++ != '\n'); +#define SKIP_PAST_NEWLINE(p, back) \ + while (p < back && *p++ != '\n') continue; static char * -binary_search(string, front, back) - register char *string, *front, *back; +binary_search(register char *string, register char *front, register char *back) { register char *p; @@ -1281,11 +1271,12 @@ binary_search(string, front, back) * o front is before or at the first line to be printed. */ static char * -linear_search(string, front, back) - char *string, *front, *back; +linear_search(char *string, char *front, char *back, long tl) { + char *end; while (front < back) { - switch (compare(string, front, back)) { + end = tl && back-front > tl ? front+tl : back; + switch (compare(string, front, end)) { case EQUAL: /* Found it. */ return (front); case LESS: /* No such string. */ @@ -1313,8 +1304,7 @@ linear_search(string, front, back) * However, historic programs did use spaces, and, I got complaints. */ static int -compare(s1, s2, back) - register char *s1, *s2, *back; +compare(register char *s1, register char *s2, register char *back) { for (; *s1 && s2 < back && (*s2 != '\t' && *s2 != ' '); ++s1, ++s2) if (*s1 != *s2) diff --git a/ex/ex_tcl.c b/ex/ex_tcl.c deleted file mode 100644 index 06736a781006..000000000000 --- a/ex/ex_tcl.c +++ /dev/null @@ -1,80 +0,0 @@ -/*- - * Copyright (c) 1992, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * Copyright (c) 1992, 1993, 1994, 1995, 1996 - * Keith Bostic. All rights reserved. - * Copyright (c) 1995 - * George V. Neville-Neil. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)ex_tcl.c 8.10 (Berkeley) 9/15/96"; -#endif /* not lint */ - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "../common/common.h" - -#ifdef HAVE_TCL_INTERP -#include -#endif - -/* - * ex_tcl -- :[line [,line]] tcl [command] - * Run a command through the tcl interpreter. - * - * PUBLIC: int ex_tcl __P((SCR*, EXCMD *)); - */ -int -ex_tcl(sp, cmdp) - SCR *sp; - EXCMD *cmdp; -{ -#ifdef HAVE_TCL_INTERP - CHAR_T *p; - GS *gp; - size_t len; - char buf[128]; - - /* Initialize the interpreter. */ - gp = sp->gp; - if (gp->tcl_interp == NULL && tcl_init(gp)) - return (1); - - /* Skip leading white space. */ - if (cmdp->argc != 0) - for (p = cmdp->argv[0]->bp, - len = cmdp->argv[0]->len; len > 0; --len, ++p) - if (!isblank(*p)) - break; - if (cmdp->argc == 0 || len == 0) { - ex_emsg(sp, cmdp->cmd->usage, EXM_USAGE); - return (1); - } - - (void)snprintf(buf, sizeof(buf), - "set viScreenId %d\nset viStartLine %lu\nset viStopLine %lu", - sp->id, cmdp->addr1.lno, cmdp->addr2.lno); - if (Tcl_Eval(gp->tcl_interp, buf) == TCL_OK && - Tcl_Eval(gp->tcl_interp, cmdp->argv[0]->bp) == TCL_OK) - return (0); - - msgq(sp, M_ERR, "Tcl: %s", ((Tcl_Interp *)gp->tcl_interp)->result); - return (1); -#else - msgq(sp, M_ERR, "302|Vi was not loaded with a Tcl interpreter"); - return (1); -#endif /* HAVE_TCL_INTERP */ -} diff --git a/ex/ex_txt.c b/ex/ex_txt.c index 2f62ff51a47c..21d9f4412654 100644 --- a/ex/ex_txt.c +++ b/ex/ex_txt.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_txt.c 10.17 (Berkeley) 10/10/96"; +static const char sccsid[] = "$Id: ex_txt.c,v 10.23 2001/06/25 15:19:21 skimo Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -24,6 +25,7 @@ static const char sccsid[] = "@(#)ex_txt.c 10.17 (Berkeley) 10/10/96"; #include #include "../common/common.h" +#include "../vi/vi.h" /* * !!! @@ -52,11 +54,7 @@ static void txt_prompt __P((SCR *, TEXT *, ARG_CHAR_T, u_int32_t)); * PUBLIC: int ex_txt __P((SCR *, TEXTH *, ARG_CHAR_T, u_int32_t)); */ int -ex_txt(sp, tiqh, prompt, flags) - SCR *sp; - TEXTH *tiqh; - ARG_CHAR_T prompt; - u_int32_t flags; +ex_txt(SCR *sp, TEXTH *tiqh, ARG_CHAR_T prompt, u_int32_t flags) { EVENT ev; GS *gp; @@ -64,6 +62,7 @@ ex_txt(sp, tiqh, prompt, flags) carat_t carat_st; size_t cnt; int rval; + int nochange; rval = 0; @@ -72,9 +71,9 @@ ex_txt(sp, tiqh, prompt, flags) * last one if it's big enough. (All TEXT bookkeeping fields default * to 0 -- text_init() handles this.) */ - if (tiqh->cqh_first != (void *)tiqh) { - tp = tiqh->cqh_first; - if (tp->q.cqe_next != (void *)tiqh || tp->lb_len < 32) { + if (!TAILQ_EMPTY(tiqh)) { + tp = TAILQ_FIRST(tiqh); + if (TAILQ_NEXT(tp, q) != NULL || tp->lb_len < 32) { text_lfree(tiqh); goto newtp; } @@ -82,7 +81,7 @@ ex_txt(sp, tiqh, prompt, flags) } else { newtp: if ((tp = text_init(sp, NULL, 0, 32)) == NULL) goto err; - CIRCLEQ_INSERT_HEAD(tiqh, tp, q); + TAILQ_INSERT_HEAD(tiqh, tp, q); } /* Set the starting line number. */ @@ -112,7 +111,7 @@ newtp: if ((tp = text_init(sp, NULL, 0, 32)) == NULL) txt_prompt(sp, tp, prompt, flags); } - for (carat_st = C_NOTSET;;) { + for (carat_st = C_NOTSET, nochange = 0;;) { if (v_event_get(sp, &ev, 0, 0)) goto err; @@ -146,7 +145,7 @@ newtp: if ((tp = text_init(sp, NULL, 0, 32)) == NULL) * Check to see if the character fits into the input buffer. * (Use tp->len, ignore overwrite and non-printable chars.) */ - BINC_GOTO(sp, tp->lb, tp->lb_len, tp->len + 1); + BINC_GOTOW(sp, tp->lb, tp->lb_len, tp->len + 1); switch (ev.e_value) { case K_CR: @@ -189,7 +188,7 @@ newtp: if ((tp = text_init(sp, NULL, 0, 32)) == NULL) */ if (LF_ISSET(TXT_DOTTERM) && tp->len == tp->ai + 1 && tp->lb[tp->len - 1] == '.') { -notlast: CIRCLEQ_REMOVE(tiqh, tp, q); +notlast: TAILQ_REMOVE(tiqh, tp, q); text_free(tp); goto done; } @@ -208,7 +207,8 @@ notlast: CIRCLEQ_REMOVE(tiqh, tp, q); * erased. */ if (LF_ISSET(TXT_AUTOINDENT)) { - if (carat_st == C_NOCHANGE) { + if (nochange) { + nochange = 0; if (v_txt_auto(sp, OOBLNO, &ait, ait.ai, ntp)) goto err; @@ -226,7 +226,7 @@ notlast: CIRCLEQ_REMOVE(tiqh, tp, q); * into the queue. */ tp = ntp; - CIRCLEQ_INSERT_TAIL(tiqh, tp, q); + TAILQ_INSERT_TAIL(tiqh, tp, q); break; case K_CARAT: /* Delete autoindent chars. */ if (tp->len <= tp->ai && LF_ISSET(TXT_AUTOINDENT)) @@ -291,11 +291,12 @@ notlast: CIRCLEQ_REMOVE(tiqh, tp, q); /* Save the ai string for later. */ ait.lb = NULL; ait.lb_len = 0; - BINC_GOTO(sp, ait.lb, ait.lb_len, tp->ai); - memcpy(ait.lb, tp->lb, tp->ai); + BINC_GOTOW(sp, ait.lb, ait.lb_len, tp->ai); + MEMCPY(ait.lb, tp->lb, tp->ai); ait.ai = ait.len = tp->ai; - carat_st = C_NOCHANGE; + carat_st = C_NOTSET; + nochange = 1; goto leftmargin; case C_ZEROSET: /* 0^D */ if (tp->len > tp->ai + 1) @@ -328,7 +329,7 @@ leftmargin: (void)gp->scr_ex_adjust(sp, EX_TERM_CE); * not already handled specially, except for and * . */ -ins_ch: if (LF_ISSET(TXT_BEAUTIFY) && iscntrl(ev.e_c) && +ins_ch: if (LF_ISSET(TXT_BEAUTIFY) && ISCNTRL(ev.e_c) && ev.e_value != K_FORMFEED && ev.e_value != K_TAB) break; @@ -352,24 +353,20 @@ done: return (rval); * not ours. */ static void -txt_prompt(sp, tp, prompt, flags) - SCR *sp; - TEXT *tp; - ARG_CHAR_T prompt; - u_int32_t flags; +txt_prompt(SCR *sp, TEXT *tp, ARG_CHAR_T prompt, u_int32_t flags) { /* Display the prompt. */ if (LF_ISSET(TXT_PROMPT)) - (void)printf("%c", prompt); + (void)ex_printf(sp, "%c", prompt); /* Display the line number. */ if (LF_ISSET(TXT_NUMBER) && O_ISSET(sp, O_NUMBER)) - (void)printf("%6lu ", (u_long)tp->lno); + (void)ex_printf(sp, "%6lu ", (u_long)tp->lno); /* Print out autoindent string. */ if (LF_ISSET(TXT_AUTOINDENT)) - (void)printf("%.*s", (int)tp->ai, tp->lb); - (void)fflush(stdout); + (void)ex_printf(sp, WVS, (int)tp->ai, tp->lb); + (void)ex_fflush(sp); } /* @@ -380,9 +377,7 @@ txt_prompt(sp, tp, prompt, flags) * ranting and raving. This is a fair bit simpler as ^T isn't special. */ static int -txt_dent(sp, tp) - SCR *sp; - TEXT *tp; +txt_dent(SCR *sp, TEXT *tp) { u_long sw, ts; size_t cno, off, scno, spaces, tabs; @@ -398,8 +393,8 @@ txt_dent(sp, tp) ++scno; /* Get the previous shiftwidth column. */ - cno = scno; - scno -= --scno % sw; + cno = scno--; + scno -= scno % sw; /* * Since we don't know what comes before the character(s) being @@ -416,7 +411,7 @@ txt_dent(sp, tp) spaces = scno - cno; /* Make sure there's enough room. */ - BINC_RET(sp, tp->lb, tp->lb_len, tabs + spaces + 1); + BINC_RETW(sp, tp->lb, tp->lb_len, tabs + spaces + 1); /* Adjust the final ai character count. */ tp->ai = tabs + spaces; diff --git a/ex/ex_undo.c b/ex/ex_undo.c index 0b0b5b26be18..9e4cd7977559 100644 --- a/ex/ex_undo.c +++ b/ex/ex_undo.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_undo.c 10.6 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: ex_undo.c,v 10.7 2001/06/25 15:19:21 skimo Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -30,9 +31,7 @@ static const char sccsid[] = "@(#)ex_undo.c 10.6 (Berkeley) 3/6/96"; * PUBLIC: int ex_undo __P((SCR *, EXCMD *)); */ int -ex_undo(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_undo(SCR *sp, EXCMD *cmdp) { EXF *ep; MARK m; diff --git a/ex/ex_usage.c b/ex/ex_usage.c index cddf7a6643c7..9a20ce18903d 100644 --- a/ex/ex_usage.c +++ b/ex/ex_usage.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_usage.c 10.13 (Berkeley) 5/3/96"; +static const char sccsid[] = "$Id: ex_usage.c,v 10.16 2011/12/21 19:26:48 zy Exp $"; #endif /* not lint */ #include @@ -34,9 +34,7 @@ static const char sccsid[] = "@(#)ex_usage.c 10.13 (Berkeley) 5/3/96"; * PUBLIC: int ex_help __P((SCR *, EXCMD *)); */ int -ex_help(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_help(SCR *sp, EXCMD *cmdp) { (void)ex_puts(sp, "To see the list of vi commands, enter \":viusage\"\n"); @@ -57,30 +55,28 @@ ex_help(sp, cmdp) * PUBLIC: int ex_usage __P((SCR *, EXCMD *)); */ int -ex_usage(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_usage(SCR *sp, EXCMD *cmdp) { ARGS *ap; EXCMDLIST const *cp; int newscreen; - char *name, *p, nb[MAXCMDNAMELEN + 5]; + CHAR_T *name, *p, nb[MAXCMDNAMELEN + 5]; switch (cmdp->argc) { case 1: ap = cmdp->argv[0]; - if (isupper(ap->bp[0])) { + if (ISUPPER(ap->bp[0])) { newscreen = 1; - ap->bp[0] = tolower(ap->bp[0]); + ap->bp[0] = TOLOWER(ap->bp[0]); } else newscreen = 0; for (cp = cmds; cp->name != NULL && - memcmp(ap->bp, cp->name, ap->len); ++cp); + MEMCMP(ap->bp, cp->name, ap->len); ++cp); if (cp->name == NULL || - newscreen && !F_ISSET(cp, E_NEWSCREEN)) { + (newscreen && !F_ISSET(cp, E_NEWSCREEN))) { if (newscreen) - ap->bp[0] = toupper(ap->bp[0]); - (void)ex_printf(sp, "The %.*s command is unknown\n", + ap->bp[0] = TOUPPER(ap->bp[0]); + (void)ex_printf(sp, "The "WVS" command is unknown\n", (int)ap->len, ap->bp); } else { (void)ex_printf(sp, @@ -112,10 +108,10 @@ ex_usage(sp, cmdp) * room, they're all short names. */ if (cp == &cmds[C_SCROLL]) - name = "^D"; + name = L("^D"); else if (F_ISSET(cp, E_NEWSCREEN)) { nb[0] = '['; - nb[1] = toupper(cp->name[0]); + nb[1] = TOUPPER(cp->name[0]); nb[2] = cp->name[0]; nb[3] = ']'; for (name = cp->name + 1, @@ -124,7 +120,7 @@ ex_usage(sp, cmdp) } else name = cp->name; (void)ex_printf(sp, - "%*s: %s\n", MAXCMDNAMELEN, name, cp->help); + WVS": %s\n", MAXCMDNAMELEN, name, cp->help); } break; default: @@ -140,9 +136,7 @@ ex_usage(sp, cmdp) * PUBLIC: int ex_viusage __P((SCR *, EXCMD *)); */ int -ex_viusage(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_viusage(SCR *sp, EXCMD *cmdp) { GS *gp; VIKEYS const *kp; diff --git a/ex/ex_util.c b/ex/ex_util.c index 6c4772e61540..2e56a068d8ff 100644 --- a/ex/ex_util.c +++ b/ex/ex_util.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_util.c 10.23 (Berkeley) 6/19/96"; +static const char sccsid[] = "$Id: ex_util.c,v 10.32 2001/06/25 15:19:21 skimo Exp $"; #endif /* not lint */ #include @@ -31,15 +31,10 @@ static const char sccsid[] = "@(#)ex_util.c 10.23 (Berkeley) 6/19/96"; * ex_cinit -- * Create an EX command structure. * - * PUBLIC: void ex_cinit __P((EXCMD *, - * PUBLIC: int, int, recno_t, recno_t, int, ARGS **)); + * PUBLIC: void ex_cinit __P((SCR *, EXCMD *, int, int, recno_t, recno_t, int)); */ void -ex_cinit(cmdp, cmd_id, naddr, lno1, lno2, force, ap) - EXCMD *cmdp; - int cmd_id, force, naddr; - recno_t lno1, lno2; - ARGS **ap; +ex_cinit(SCR *sp, EXCMD *cmdp, int cmd_id, int naddr, recno_t lno1, recno_t lno2, int force) { memset(cmdp, 0, sizeof(EXCMD)); cmdp->cmd = &cmds[cmd_id]; @@ -49,28 +44,7 @@ ex_cinit(cmdp, cmd_id, naddr, lno1, lno2, force, ap) cmdp->addr1.cno = cmdp->addr2.cno = 1; if (force) cmdp->iflags |= E_C_FORCE; - cmdp->argc = 0; - if ((cmdp->argv = ap) != NULL) - cmdp->argv[0] = NULL; -} - -/* - * ex_cadd -- - * Add an argument to an EX command structure. - * - * PUBLIC: void ex_cadd __P((EXCMD *, ARGS *, char *, size_t)); - */ -void -ex_cadd(cmdp, ap, arg, len) - EXCMD *cmdp; - ARGS *ap; - char *arg; - size_t len; -{ - cmdp->argv[cmdp->argc] = ap; - ap->bp = arg; - ap->len = len; - cmdp->argv[++cmdp->argc] = NULL; + (void)argv_init(sp, cmdp); } /* @@ -80,10 +54,7 @@ ex_cadd(cmdp, ap, arg, len) * PUBLIC: int ex_getline __P((SCR *, FILE *, size_t *)); */ int -ex_getline(sp, fp, lenp) - SCR *sp; - FILE *fp; - size_t *lenp; +ex_getline(SCR *sp, FILE *fp, size_t *lenp) { EX_PRIVATE *exp; size_t off; @@ -93,7 +64,7 @@ ex_getline(sp, fp, lenp) exp = EXP(sp); for (errno = 0, off = 0, p = exp->ibp;;) { if (off >= exp->ibp_len) { - BINC_RET(sp, exp->ibp, exp->ibp_len, off + 1); + BINC_RETC(sp, exp->ibp, exp->ibp_len, off + 1); p = exp->ibp + off; } if ((ch = getc(fp)) == EOF && !feof(fp)) { @@ -123,9 +94,7 @@ ex_getline(sp, fp, lenp) * PUBLIC: int ex_ncheck __P((SCR *, int)); */ int -ex_ncheck(sp, force) - SCR *sp; - int force; +ex_ncheck(SCR *sp, int force) { char **ap; @@ -140,7 +109,7 @@ ex_ncheck(sp, force) for (ap = sp->cargv + 1; *ap != NULL; ++ap); msgq(sp, M_ERR, - "167|%d more files to edit", (ap - sp->cargv) - 1); + "167|%d more files to edit", (int)(ap - sp->cargv) - 1); return (1); } @@ -154,8 +123,7 @@ ex_ncheck(sp, force) * PUBLIC: int ex_init __P((SCR *)); */ int -ex_init(sp) - SCR *sp; +ex_init(SCR *sp) { GS *gp; @@ -173,6 +141,23 @@ ex_init(sp) return (0); } +/* + * ex_emsg -- + * Display a few common ex and vi error messages. + * + * PUBLIC: void ex_wemsg __P((SCR *, CHAR_T *, exm_t)); + */ +void +ex_wemsg(SCR* sp, CHAR_T *p, exm_t which) +{ + char *np; + size_t nlen; + + if (p) INT2CHAR(sp, p, STRLEN(p), np, nlen); + else np = NULL; + ex_emsg(sp, np, which); +} + /* * ex_emsg -- * Display a few common ex and vi error messages. @@ -180,10 +165,7 @@ ex_init(sp) * PUBLIC: void ex_emsg __P((SCR *, char *, exm_t)); */ void -ex_emsg(sp, p, which) - SCR *sp; - char *p; - exm_t which; +ex_emsg(SCR *sp, char *p, exm_t which) { switch (which) { case EXM_EMPTYBUF: diff --git a/ex/ex_version.c b/ex/ex_version.c index d7363c8bd1ac..4f0a17d714f8 100644 --- a/ex/ex_version.c +++ b/ex/ex_version.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_version.c 10.31 (Berkeley) 8/22/96"; +static const char sccsid[] = "$Id: ex_version.c,v 10.32 2001/06/25 15:19:22 skimo Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -30,10 +31,9 @@ static const char sccsid[] = "@(#)ex_version.c 10.31 (Berkeley) 8/22/96"; * PUBLIC: int ex_version __P((SCR *, EXCMD *)); */ int -ex_version(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_version(SCR *sp, EXCMD *cmdp) { - msgq(sp, M_INFO, VI_VERSION); + msgq(sp, M_INFO, "Version "VI_VERSION + " The CSRG, University of California, Berkeley."); return (0); } diff --git a/ex/ex_visual.c b/ex/ex_visual.c index 82e503d44658..f913c71d81fc 100644 --- a/ex/ex_visual.c +++ b/ex/ex_visual.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_visual.c 10.13 (Berkeley) 6/28/96"; +static const char sccsid[] = "$Id: ex_visual.c,v 10.16 2001/08/29 11:04:13 skimo Exp $"; #endif /* not lint */ #include @@ -34,14 +34,14 @@ static const char sccsid[] = "@(#)ex_visual.c 10.13 (Berkeley) 6/28/96"; * PUBLIC: int ex_visual __P((SCR *, EXCMD *)); */ int -ex_visual(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_visual(SCR *sp, EXCMD *cmdp) { SCR *tsp; size_t len; int pos; char buf[256]; + size_t wlen; + CHAR_T *wp; /* If open option off, disallow visual command. */ if (!O_ISSET(sp, O_OPEN)) { @@ -81,10 +81,11 @@ ex_visual(sp, cmdp) if (FL_ISSET(cmdp->iflags, E_C_COUNT)) len = snprintf(buf, sizeof(buf), - "%luz%c%lu", sp->lno, pos, cmdp->count); + "%luz%c%lu", (u_long)sp->lno, pos, cmdp->count); else - len = snprintf(buf, sizeof(buf), "%luz%c", sp->lno, pos); - (void)v_event_push(sp, NULL, buf, len, CH_NOMAP | CH_QUOTED); + len = snprintf(buf, sizeof(buf), "%luz%c", (u_long)sp->lno, pos); + CHAR2INT(sp, buf, len, wp, wlen); + (void)v_event_push(sp, NULL, wp, wlen, CH_NOMAP | CH_QUOTED); /* * !!! @@ -129,6 +130,7 @@ ex_visual(sp, cmdp) */ ++sp->refcnt; ++sp->ep->refcnt; + /* XXXX where is this decremented ? */ /* * Fake up a screen pointer -- vi doesn't get to change our diff --git a/ex/ex_write.c b/ex/ex_write.c index b3122e353563..1f94a632ed5b 100644 --- a/ex/ex_write.c +++ b/ex/ex_write.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_write.c 10.30 (Berkeley) 7/12/96"; +static const char sccsid[] = "$Id: ex_write.c,v 10.41 2011/12/02 01:07:06 zy Exp $"; #endif /* not lint */ #include @@ -25,6 +25,7 @@ static const char sccsid[] = "@(#)ex_write.c 10.30 (Berkeley) 7/12/96"; #include #include #include +#include #include #include "../common/common.h" @@ -39,9 +40,7 @@ static int exwr __P((SCR *, EXCMD *, enum which)); * PUBLIC: int ex_wn __P((SCR *, EXCMD *)); */ int -ex_wn(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_wn(SCR *sp, EXCMD *cmdp) { if (exwr(sp, cmdp, WN)) return (1); @@ -61,9 +60,7 @@ ex_wn(sp, cmdp) * PUBLIC: int ex_wq __P((SCR *, EXCMD *)); */ int -ex_wq(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_wq(SCR *sp, EXCMD *cmdp) { int force; @@ -89,9 +86,7 @@ ex_wq(sp, cmdp) * PUBLIC: int ex_write __P((SCR *, EXCMD *)); */ int -ex_write(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_write(SCR *sp, EXCMD *cmdp) { return (exwr(sp, cmdp, WRITE)); } @@ -104,9 +99,7 @@ ex_write(sp, cmdp) * PUBLIC: int ex_xit __P((SCR *, EXCMD *)); */ int -ex_xit(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_xit(SCR *sp, EXCMD *cmdp) { int force; @@ -131,14 +124,16 @@ ex_xit(sp, cmdp) * The guts of the ex write commands. */ static int -exwr(sp, cmdp, cmd) - SCR *sp; - EXCMD *cmdp; - enum which cmd; +exwr(SCR *sp, EXCMD *cmdp, enum which cmd) { MARK rm; int flags; - char *name, *p; + char *name; + CHAR_T *p = NULL; + size_t nlen; + char *n; + int rc; + EX_PRIVATE *exp; NEEDFILE(sp, cmdp); @@ -149,25 +144,31 @@ exwr(sp, cmdp, cmd) /* Skip any leading whitespace. */ if (cmdp->argc != 0) - for (p = cmdp->argv[0]->bp; *p != '\0' && isblank(*p); ++p); + for (p = cmdp->argv[0]->bp; *p != '\0' && cmdskip(*p); ++p); /* If "write !" it's a pipe to a utility. */ if (cmdp->argc != 0 && cmd == WRITE && *p == '!') { /* Secure means no shell access. */ if (O_ISSET(sp, O_SECURE)) { - ex_emsg(sp, cmdp->cmd->name, EXM_SECURE_F); + ex_wemsg(sp, cmdp->cmd->name, EXM_SECURE_F); return (1); } /* Expand the argument. */ - for (++p; *p && isblank(*p); ++p); + for (++p; *p && cmdskip(*p); ++p); if (*p == '\0') { ex_emsg(sp, cmdp->cmd->usage, EXM_USAGE); return (1); } - if (argv_exp1(sp, cmdp, p, strlen(p), 1)) + if (argv_exp1(sp, cmdp, p, STRLEN(p), 1)) return (1); + /* Set the last bang command */ + exp = EXP(sp); + free(exp->lastbcomm); + exp->lastbcomm = v_wstrdup(sp, cmdp->argv[1]->bp, + cmdp->argv[1]->len); + /* * Historically, vi waited after a write filter even if there * wasn't any output from the command. People complained when @@ -201,7 +202,7 @@ exwr(sp, cmdp, cmd) LF_SET(FS_APPEND); /* Skip ">>" and whitespace. */ - for (p += 2; *p && isblank(*p); ++p); + for (p += 2; *p && cmdskip(*p); ++p); } /* If no other arguments, just write the file back. */ @@ -210,7 +211,7 @@ exwr(sp, cmdp, cmd) &cmdp->addr1, &cmdp->addr2, NULL, flags)); /* Build an argv so we get an argument count and file expansion. */ - if (argv_exp2(sp, cmdp, p, strlen(p))) + if (argv_exp2(sp, cmdp, p, STRLEN(p))) return (1); /* @@ -228,7 +229,9 @@ exwr(sp, cmdp, cmd) abort(); /* NOTREACHED */ case 2: - name = cmdp->argv[1]->bp; + INT2CHAR(sp, cmdp->argv[1]->bp, cmdp->argv[1]->len+1, + n, nlen); + name = v_strdup(sp, n, nlen - 1); /* * !!! @@ -238,10 +241,9 @@ exwr(sp, cmdp, cmd) */ if (F_ISSET(sp->frp, FR_TMPFILE) && !F_ISSET(sp->frp, FR_EXNAMED)) { - if ((p = v_strdup(sp, - cmdp->argv[1]->bp, cmdp->argv[1]->len)) != NULL) { + if ((n = v_strdup(sp, name, nlen - 1)) != NULL) { free(sp->frp->name); - sp->frp->name = p; + sp->frp->name = n; } /* * The file has a real name, it's no longer a @@ -261,11 +263,16 @@ exwr(sp, cmdp, cmd) set_alt_name(sp, name); break; default: - ex_emsg(sp, p, EXM_FILECOUNT); + INT2CHAR(sp, p, STRLEN(p) + 1, n, nlen); + ex_emsg(sp, n, EXM_FILECOUNT); return (1); } - return (file_write(sp, &cmdp->addr1, &cmdp->addr2, name, flags)); + rc = file_write(sp, &cmdp->addr1, &cmdp->addr2, name, flags); + + free(name); + + return rc; } /* @@ -276,13 +283,7 @@ exwr(sp, cmdp, cmd) * PUBLIC: char *, FILE *, MARK *, MARK *, u_long *, u_long *, int)); */ int -ex_writefp(sp, name, fp, fm, tm, nlno, nch, silent) - SCR *sp; - char *name; - FILE *fp; - MARK *fm, *tm; - u_long *nlno, *nch; - int silent; +ex_writefp(SCR *sp, char *name, FILE *fp, MARK *fm, MARK *tm, u_long *nlno, u_long *nch, int silent) { struct stat sb; GS *gp; @@ -290,7 +291,11 @@ ex_writefp(sp, name, fp, fm, tm, nlno, nch, silent) recno_t fline, tline, lcnt; size_t len; int rval; - char *msg, *p; + char *msg; + CHAR_T *p; + char *f; + size_t flen; + int isutf16; gp = sp->gp; fline = fm->lno; @@ -319,7 +324,17 @@ ex_writefp(sp, name, fp, fm, tm, nlno, nch, silent) ccnt = 0; lcnt = 0; msg = "253|Writing..."; - if (tline != 0) + + if (O_ISSET(sp, O_FILEENCODING)) { + isutf16 = !strncasecmp(O_STR(sp, O_FILEENCODING), "utf-16", 6); + isutf16 += !strncasecmp(O_STR(sp, O_FILEENCODING), "utf-16le", 8); + } else isutf16 = 0; + + if (tline != 0) { + if (isutf16 == 1 && fwrite("\xfe\xff", 1, 2, fp) != 2) + goto err; + if (isutf16 == 2 && fwrite("\xff\xfe", 1, 2, fp) != 2) + goto err; for (; fline <= tline; ++fline, ++lcnt) { /* Caller has to provide any interrupt message. */ if ((lcnt + 1) % INTERRUPT_CHECK == 0) { @@ -333,15 +348,29 @@ ex_writefp(sp, name, fp, fm, tm, nlno, nch, silent) } if (db_get(sp, fline, DBG_FATAL, &p, &len)) goto err; - if (fwrite(p, 1, len, fp) != len) + INT2FILE(sp, p, len, f, flen); + if (fwrite(f, 1, flen, fp) != flen) goto err; ccnt += len; - if (putc('\n', fp) != '\n') + /* UTF-16 w/o BOM is big-endian */ + switch (isutf16) { + case 1: /* UTF-16BE */ + if (fwrite("\0\x0a", 1, 2, fp) != 2) + goto done; break; + case 2: /* UTF-16LE */ + if (fwrite("\x0a\0", 1, 2, fp) != 2) + goto done; + break; + default: + if (putc('\n', fp) != '\n') + goto done; + } ++ccnt; } + } - if (fflush(fp)) +done: if (fflush(fp)) goto err; /* * XXX diff --git a/ex/ex_yank.c b/ex/ex_yank.c index 778dc7dee62c..262c78f978bc 100644 --- a/ex/ex_yank.c +++ b/ex/ex_yank.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_yank.c 10.7 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: ex_yank.c,v 10.8 2001/06/25 15:19:22 skimo Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -29,9 +30,7 @@ static const char sccsid[] = "@(#)ex_yank.c 10.7 (Berkeley) 3/6/96"; * PUBLIC: int ex_yank __P((SCR *, EXCMD *)); */ int -ex_yank(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_yank(SCR *sp, EXCMD *cmdp) { NEEDFILE(sp, cmdp); diff --git a/ex/ex_z.c b/ex/ex_z.c index 41b72ad1fd42..18a78590ded5 100644 --- a/ex/ex_z.c +++ b/ex/ex_z.c @@ -10,11 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)ex_z.c 10.10 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: ex_z.c,v 10.12 2001/06/25 15:19:22 skimo Exp $"; #endif /* not lint */ #include #include +#include #include #include @@ -31,9 +32,7 @@ static const char sccsid[] = "@(#)ex_z.c 10.10 (Berkeley) 3/6/96"; * PUBLIC: int ex_z __P((SCR *, EXCMD *)); */ int -ex_z(sp, cmdp) - SCR *sp; - EXCMD *cmdp; +ex_z(SCR *sp, EXCMD *cmdp) { MARK abs; recno_t cnt, equals, lno; @@ -55,7 +54,7 @@ ex_z(sp, cmdp) if (FL_ISSET(cmdp->iflags, E_C_COUNT)) cnt = cmdp->count; else -#ifdef HISTORIC_PRACTICE +#ifdef HISTORICAL_PRACTICE cnt = O_VAL(sp, O_SCROLL) * 2; #else cnt = O_VAL(sp, O_WINDOW) - 1; diff --git a/include/ex_extern.h b/ex/extern.h similarity index 80% rename from include/ex_extern.h rename to ex/extern.h index ed01701f1185..f54548b4cf09 100644 --- a/include/ex_extern.h +++ b/ex/extern.h @@ -1,8 +1,8 @@ int ex __P((SCR **)); int ex_cmd __P((SCR *)); int ex_range __P((SCR *, EXCMD *, int *)); -int ex_is_abbrev __P((char *, size_t)); -int ex_is_unmap __P((char *, size_t)); +int ex_is_abbrev __P((CHAR_T *, size_t)); +int ex_is_unmap __P((CHAR_T *, size_t)); void ex_badaddr __P((SCR *, EXCMDLIST const *, enum badaddr, enum nresult)); int ex_abbr __P((SCR *, EXCMD *)); @@ -16,15 +16,20 @@ int ex_rew __P((SCR *, EXCMD *)); int ex_args __P((SCR *, EXCMD *)); char **ex_buildargv __P((SCR *, EXCMD *, char *)); int argv_init __P((SCR *, EXCMD *)); -int argv_exp0 __P((SCR *, EXCMD *, char *, size_t)); -int argv_exp1 __P((SCR *, EXCMD *, char *, size_t, int)); -int argv_exp2 __P((SCR *, EXCMD *, char *, size_t)); -int argv_exp3 __P((SCR *, EXCMD *, char *, size_t)); +int argv_exp0 __P((SCR *, EXCMD *, CHAR_T *, size_t)); +int argv_exp1 __P((SCR *, EXCMD *, CHAR_T *, size_t, int)); +int argv_exp2 __P((SCR *, EXCMD *, CHAR_T *, size_t)); +int argv_exp3 __P((SCR *, EXCMD *, CHAR_T *, size_t)); +int argv_flt_ex __P((SCR *, EXCMD *, CHAR_T *, size_t)); int argv_free __P((SCR *)); +int argv_flt_path __P((SCR *, EXCMD *, CHAR_T *, size_t)); +CHAR_T *argv_esc __P((SCR *, EXCMD *, CHAR_T *, size_t)); +CHAR_T *argv_uesc __P((SCR *, EXCMD *, CHAR_T *, size_t)); int ex_at __P((SCR *, EXCMD *)); int ex_bang __P((SCR *, EXCMD *)); int ex_cd __P((SCR *, EXCMD *)); int ex_cscope __P((SCR *, EXCMD *)); +int cscope_end __P((SCR *)); int cscope_display __P((SCR *)); int cscope_search __P((SCR *, TAGQ *, TAG *)); int ex_delete __P((SCR *, EXCMD *)); @@ -33,7 +38,7 @@ int ex_edit __P((SCR *, EXCMD *)); int ex_equal __P((SCR *, EXCMD *)); int ex_file __P((SCR *, EXCMD *)); int ex_filter __P((SCR *, - EXCMD *, MARK *, MARK *, MARK *, char *, enum filtertype)); + EXCMD *, MARK *, MARK *, MARK *, CHAR_T *, enum filtertype)); int ex_global __P((SCR *, EXCMD *)); int ex_v __P((SCR *, EXCMD *)); int ex_g_insdel __P((SCR *, lnop_t, recno_t)); @@ -41,7 +46,7 @@ int ex_screen_copy __P((SCR *, SCR *)); int ex_screen_end __P((SCR *)); int ex_optchange __P((SCR *, int, char *, u_long *)); int ex_exrc __P((SCR *)); -int ex_run_str __P((SCR *, char *, char *, size_t, int, int)); +int ex_run_str __P((SCR *, char *, CHAR_T *, size_t, int, int)); int ex_join __P((SCR *, EXCMD *)); int ex_map __P((SCR *, EXCMD *)); int ex_unmap __P((SCR *, EXCMD *)); @@ -50,14 +55,13 @@ int ex_mkexrc __P((SCR *, EXCMD *)); int ex_copy __P((SCR *, EXCMD *)); int ex_move __P((SCR *, EXCMD *)); int ex_open __P((SCR *, EXCMD *)); -int ex_perl __P((SCR*, EXCMD *)); int ex_preserve __P((SCR *, EXCMD *)); int ex_recover __P((SCR *, EXCMD *)); int ex_list __P((SCR *, EXCMD *)); int ex_number __P((SCR *, EXCMD *)); int ex_pr __P((SCR *, EXCMD *)); int ex_print __P((SCR *, EXCMD *, MARK *, MARK *, u_int32_t)); -int ex_ldisplay __P((SCR *, const char *, size_t, size_t, u_int)); +int ex_ldisplay __P((SCR *, const CHAR_T *, size_t, size_t, u_int)); int ex_scprint __P((SCR *, MARK *, MARK *)); int ex_printf __P((SCR *, const char *, ...)); int ex_puts __P((SCR *, const char *)); @@ -86,9 +90,9 @@ int ex_s __P((SCR *, EXCMD *)); int ex_subagain __P((SCR *, EXCMD *)); int ex_subtilde __P((SCR *, EXCMD *)); int re_compile __P((SCR *, - char *, size_t, char **, size_t *, regex_t *, u_int)); + CHAR_T *, size_t, CHAR_T **, size_t *, regex_t *, u_int)); void re_error __P((SCR *, int, regex_t *)); -int ex_tag_first __P((SCR *, char *)); +int ex_tag_first __P((SCR *, CHAR_T *)); int ex_tag_push __P((SCR *, EXCMD *)); int ex_tag_next __P((SCR *, EXCMD *)); int ex_tag_prev __P((SCR *, EXCMD *)); @@ -99,21 +103,20 @@ int ex_tag_top __P((SCR *, EXCMD *)); int ex_tag_display __P((SCR *)); int ex_tag_copy __P((SCR *, SCR *)); int tagq_free __P((SCR *, TAGQ *)); +int tagq_push __P((SCR*, TAGQ*, int, int )); void tag_msg __P((SCR *, tagmsg_t, char *)); int ex_tagf_alloc __P((SCR *, char *)); int ex_tag_free __P((SCR *)); -int ex_tcl __P((SCR*, EXCMD *)); int ex_txt __P((SCR *, TEXTH *, ARG_CHAR_T, u_int32_t)); int ex_undo __P((SCR *, EXCMD *)); int ex_help __P((SCR *, EXCMD *)); int ex_usage __P((SCR *, EXCMD *)); int ex_viusage __P((SCR *, EXCMD *)); -void ex_cinit __P((EXCMD *, - int, int, recno_t, recno_t, int, ARGS **)); -void ex_cadd __P((EXCMD *, ARGS *, char *, size_t)); +void ex_cinit __P((SCR *, EXCMD *, int, int, recno_t, recno_t, int)); int ex_getline __P((SCR *, FILE *, size_t *)); int ex_ncheck __P((SCR *, int)); int ex_init __P((SCR *)); +void ex_wemsg __P((SCR *, CHAR_T *, exm_t)); void ex_emsg __P((SCR *, char *, exm_t)); int ex_version __P((SCR *, EXCMD *)); int ex_visual __P((SCR *, EXCMD *)); diff --git a/ex/script.h b/ex/script.h index e29f63347961..3952e96aea1e 100644 --- a/ex/script.h +++ b/ex/script.h @@ -6,7 +6,7 @@ * * See the LICENSE file for redistribution information. * - * @(#)script.h 10.2 (Berkeley) 3/6/96 + * $Id: script.h,v 10.3 2012/04/21 23:51:46 zy Exp $ */ struct _script { @@ -16,8 +16,6 @@ struct _script { char *sh_prompt; /* Prompt. */ size_t sh_prompt_len; /* Prompt length. */ char sh_name[64]; /* Pty name */ -#ifdef TIOCGWINSZ struct winsize sh_win; /* Window size. */ -#endif struct termios sh_term; /* Terminal information. */ }; diff --git a/ex/tag.h b/ex/tag.h index aee3dd27471d..7d3b2476575b 100644 --- a/ex/tag.h +++ b/ex/tag.h @@ -8,7 +8,7 @@ * * See the LICENSE file for redistribution information. * - * @(#)tag.h 10.5 (Berkeley) 5/15/96 + * $Id: tag.h,v 10.9 2012/07/06 16:38:36 zy Exp $ */ /* @@ -16,12 +16,12 @@ * connection, linked from the EX_PRIVATE structure. */ struct _csc { - LIST_ENTRY(_csc) q; /* Linked list of cscope connections. */ + SLIST_ENTRY(_csc) q; /* Linked list of cscope connections. */ - char *dname; /* Base directory of this cscope connection. */ - size_t dlen; /* Length of base directory. */ - pid_t pid; /* PID of the connected cscope process. */ - time_t mtime; /* Last modification time of cscope database. */ + char *dname; /* Base directory of this cscope connection. */ + size_t dlen; /* Length of base directory. */ + pid_t pid; /* PID of the connected cscope process. */ + struct timespec mtim; /* Last modification time of cscope database. */ FILE *from_fp; /* from cscope: FILE. */ int from_fd; /* from cscope: file descriptor. */ @@ -74,7 +74,7 @@ struct _tagf { /* Tag files. */ * tagtop: discard all Q */ struct _tag { /* Tag list. */ - CIRCLEQ_ENTRY(_tag) q; /* Linked list of tags. */ + TAILQ_ENTRY(_tag) q; /* Linked list of tags. */ /* Tag pop/return information. */ FREF *frp; /* Saved file. */ @@ -84,16 +84,18 @@ struct _tag { /* Tag list. */ char *fname; /* Filename. */ size_t fnlen; /* Filename length. */ recno_t slno; /* Search line number. */ - char *search; /* Search string. */ + CHAR_T *search; /* Search string. */ size_t slen; /* Search string length. */ + CHAR_T *msg; /* Message string. */ + size_t mlen; /* Message string length. */ - char buf[1]; /* Variable length buffer. */ + CHAR_T buf[1]; /* Variable length buffer. */ }; struct _tagq { /* Tag queue. */ - CIRCLEQ_ENTRY(_tagq) q; /* Linked list of tag queues. */ + TAILQ_ENTRY(_tagq) q; /* Linked list of tag queues. */ /* This queue's tag list. */ - CIRCLEQ_HEAD(_tagqh, _tag) tagq; + TAILQ_HEAD(_tagqh, _tag) tagq[1]; TAG *current; /* Current TAG within the queue. */ diff --git a/ex/version.h b/ex/version.h index 7d657b635fc2..295dd8e68b62 100644 --- a/ex/version.h +++ b/ex/version.h @@ -1,2 +1 @@ -#define VI_VERSION \ - "Version 1.79 (10/23/96) The CSRG, University of California, Berkeley." +#define VI_VERSION "2.1.1 (2012-10-07)" diff --git a/include/bitstring.h b/include/bitstring.h deleted file mode 100644 index 88437e7fb9f7..000000000000 --- a/include/bitstring.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright (c) 1989, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Paul Vixie. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)bitstring.h 8.1 (Berkeley) 7/19/93 - */ - -#ifndef _BITSTRING_H_ -#define _BITSTRING_H_ - -typedef unsigned char bitstr_t; - -/* internal macros */ - /* byte of the bitstring bit is in */ -#define _bit_byte(bit) \ - ((bit) >> 3) - - /* mask for the bit within its byte */ -#define _bit_mask(bit) \ - (1 << ((bit)&0x7)) - -/* external macros */ - /* bytes in a bitstring of nbits bits */ -#define bitstr_size(nbits) \ - ((((nbits) - 1) >> 3) + 1) - - /* allocate a bitstring */ -#define bit_alloc(nbits) \ - (bitstr_t *)calloc(1, \ - (unsigned int)bitstr_size(nbits) * sizeof(bitstr_t)) - - /* allocate a bitstring on the stack */ -#define bit_decl(name, nbits) \ - (name)[bitstr_size(nbits)] - - /* is bit N of bitstring name set? */ -#define bit_test(name, bit) \ - ((name)[_bit_byte(bit)] & _bit_mask(bit)) - - /* set bit N of bitstring name */ -#define bit_set(name, bit) \ - (name)[_bit_byte(bit)] |= _bit_mask(bit) - - /* clear bit N of bitstring name */ -#define bit_clear(name, bit) \ - (name)[_bit_byte(bit)] &= ~_bit_mask(bit) - - /* clear bits start ... stop in bitstring */ -#define bit_nclear(name, start, stop) { \ - register bitstr_t *_name = name; \ - register int _start = start, _stop = stop; \ - register int _startbyte = _bit_byte(_start); \ - register int _stopbyte = _bit_byte(_stop); \ - if (_startbyte == _stopbyte) { \ - _name[_startbyte] &= ((0xff >> (8 - (_start&0x7))) | \ - (0xff << ((_stop&0x7) + 1))); \ - } else { \ - _name[_startbyte] &= 0xff >> (8 - (_start&0x7)); \ - while (++_startbyte < _stopbyte) \ - _name[_startbyte] = 0; \ - _name[_stopbyte] &= 0xff << ((_stop&0x7) + 1); \ - } \ -} - - /* set bits start ... stop in bitstring */ -#define bit_nset(name, start, stop) { \ - register bitstr_t *_name = name; \ - register int _start = start, _stop = stop; \ - register int _startbyte = _bit_byte(_start); \ - register int _stopbyte = _bit_byte(_stop); \ - if (_startbyte == _stopbyte) { \ - _name[_startbyte] |= ((0xff << (_start&0x7)) & \ - (0xff >> (7 - (_stop&0x7)))); \ - } else { \ - _name[_startbyte] |= 0xff << ((_start)&0x7); \ - while (++_startbyte < _stopbyte) \ - _name[_startbyte] = 0xff; \ - _name[_stopbyte] |= 0xff >> (7 - (_stop&0x7)); \ - } \ -} - - /* find first bit clear in name */ -#define bit_ffc(name, nbits, value) { \ - register bitstr_t *_name = name; \ - register int _byte, _nbits = nbits; \ - register int _stopbyte = _bit_byte(_nbits), _value = -1; \ - for (_byte = 0; _byte <= _stopbyte; ++_byte) \ - if (_name[_byte] != 0xff) { \ - _value = _byte << 3; \ - for (_stopbyte = _name[_byte]; (_stopbyte&0x1); \ - ++_value, _stopbyte >>= 1); \ - break; \ - } \ - *(value) = _value; \ -} - - /* find first bit set in name */ -#define bit_ffs(name, nbits, value) { \ - register bitstr_t *_name = name; \ - register int _byte, _nbits = nbits; \ - register int _stopbyte = _bit_byte(_nbits), _value = -1; \ - for (_byte = 0; _byte <= _stopbyte; ++_byte) \ - if (_name[_byte]) { \ - _value = _byte << 3; \ - for (_stopbyte = _name[_byte]; !(_stopbyte&0x1); \ - ++_value, _stopbyte >>= 1); \ - break; \ - } \ - *(value) = _value; \ -} - -#endif /* !_BITSTRING_H_ */ diff --git a/include/ex_def.h b/include/ex_def.h deleted file mode 100644 index 2e69b4872f59..000000000000 --- a/include/ex_def.h +++ /dev/null @@ -1,78 +0,0 @@ -#define C_SCROLL 0 -#define C_BANG 1 -#define C_HASH 2 -#define C_SUBAGAIN 3 -#define C_STAR 4 -#define C_SHIFTL 5 -#define C_EQUAL 6 -#define C_SHIFTR 7 -#define C_AT 8 -#define C_APPEND 9 -#define C_ABBR 10 -#define C_ARGS 11 -#define C_BG 12 -#define C_CHANGE 13 -#define C_CD 14 -#define C_CHDIR 15 -#define C_COPY 16 -#define C_CSCOPE 17 -#define C_DELETE 18 -#define C_DISPLAY 19 -#define C_EDIT 20 -#define C_EX 21 -#define C_EXUSAGE 22 -#define C_FILE 23 -#define C_FG 24 -#define C_GLOBAL 25 -#define C_HELP 26 -#define C_INSERT 27 -#define C_JOIN 28 -#define C_K 29 -#define C_LIST 30 -#define C_MOVE 31 -#define C_MARK 32 -#define C_MAP 33 -#define C_MKEXRC 34 -#define C_NEXT 35 -#define C_NUMBER 36 -#define C_OPEN 37 -#define C_PRINT 38 -#define C_PERLCMD 39 -#define C_PERLDOCMD 40 -#define C_PRESERVE 41 -#define C_PREVIOUS 42 -#define C_PUT 43 -#define C_QUIT 44 -#define C_READ 45 -#define C_RECOVER 46 -#define C_RESIZE 47 -#define C_REWIND 48 -#define C_SUBSTITUTE 49 -#define C_SCRIPT 50 -#define C_SET 51 -#define C_SHELL 52 -#define C_SOURCE 53 -#define C_STOP 54 -#define C_SUSPEND 55 -#define C_T 56 -#define C_TAG 57 -#define C_TAGNEXT 58 -#define C_TAGPOP 59 -#define C_TAGPREV 60 -#define C_TAGTOP 61 -#define C_TCLCMD 62 -#define C_UNDO 63 -#define C_UNABBREVIATE 64 -#define C_UNMAP 65 -#define C_V 66 -#define C_VERSION 67 -#define C_VISUAL_EX 68 -#define C_VISUAL_VI 69 -#define C_VIUSAGE 70 -#define C_WRITE 71 -#define C_WN 72 -#define C_WQ 73 -#define C_XIT 74 -#define C_YANK 75 -#define C_Z 76 -#define C_SUBTILDE 77 diff --git a/include/ip_extern.h b/include/ip_extern.h deleted file mode 100644 index b805343a8e81..000000000000 --- a/include/ip_extern.h +++ /dev/null @@ -1,23 +0,0 @@ -int ip_addstr __P((SCR *, const char *, size_t)); -int ip_attr __P((SCR *, scr_attr_t, int)); -int ip_baud __P((SCR *, u_long *)); -int ip_bell __P((SCR *)); -void ip_busy __P((SCR *, const char *, busy_t)); -int ip_clrtoeol __P((SCR *)); -int ip_cursor __P((SCR *, size_t *, size_t *)); -int ip_deleteln __P((SCR *)); -int ip_ex_adjust __P((SCR *, exadj_t)); -int ip_insertln __P((SCR *)); -int ip_keyval __P((SCR *, scr_keyval_t, CHAR_T *, int *)); -int ip_move __P((SCR *, size_t, size_t)); -int ip_refresh __P((SCR *, int)); -int ip_rename __P((SCR *)); -int ip_suspend __P((SCR *, int *)); -void ip_usage __P((void)); -int ip_event __P((SCR *, EVENT *, u_int32_t, int)); -int ip_screen __P((SCR *, u_int32_t)); -int ip_quit __P((GS *)); -int ip_term_init __P((SCR *)); -int ip_term_end __P((GS *)); -int ip_fmap __P((SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t)); -int ip_optchange __P((SCR *, int, char *, u_long *)); diff --git a/include/options_def.h b/include/options_def.h deleted file mode 100644 index 089fa7f4ea4c..000000000000 --- a/include/options_def.h +++ /dev/null @@ -1,79 +0,0 @@ -#define O_ALTWERASE 0 -#define O_AUTOINDENT 1 -#define O_AUTOPRINT 2 -#define O_AUTOWRITE 3 -#define O_BACKUP 4 -#define O_BEAUTIFY 5 -#define O_CDPATH 6 -#define O_CEDIT 7 -#define O_COLUMNS 8 -#define O_COMMENT 9 -#define O_DIRECTORY 10 -#define O_EDCOMPATIBLE 11 -#define O_ESCAPETIME 12 -#define O_ERRORBELLS 13 -#define O_EXRC 14 -#define O_EXTENDED 15 -#define O_FILEC 16 -#define O_FLASH 17 -#define O_HARDTABS 18 -#define O_ICLOWER 19 -#define O_IGNORECASE 20 -#define O_KEYTIME 21 -#define O_LEFTRIGHT 22 -#define O_LINES 23 -#define O_LISP 24 -#define O_LIST 25 -#define O_LOCKFILES 26 -#define O_MAGIC 27 -#define O_MATCHTIME 28 -#define O_MESG 29 -#define O_MODELINE 30 -#define O_MSGCAT 31 -#define O_NOPRINT 32 -#define O_NUMBER 33 -#define O_OCTAL 34 -#define O_OPEN 35 -#define O_OPTIMIZE 36 -#define O_PARAGRAPHS 37 -#define O_PATH 38 -#define O_PRINT 39 -#define O_PROMPT 40 -#define O_READONLY 41 -#define O_RECDIR 42 -#define O_REDRAW 43 -#define O_REMAP 44 -#define O_REPORT 45 -#define O_RULER 46 -#define O_SCROLL 47 -#define O_SEARCHINCR 48 -#define O_SECTIONS 49 -#define O_SECURE 50 -#define O_SHELL 51 -#define O_SHELLMETA 52 -#define O_SHIFTWIDTH 53 -#define O_SHOWMATCH 54 -#define O_SHOWMODE 55 -#define O_SIDESCROLL 56 -#define O_SLOWOPEN 57 -#define O_SOURCEANY 58 -#define O_TABSTOP 59 -#define O_TAGLENGTH 60 -#define O_TAGS 61 -#define O_TERM 62 -#define O_TERSE 63 -#define O_TILDEOP 64 -#define O_TIMEOUT 65 -#define O_TTYWERASE 66 -#define O_VERBOSE 67 -#define O_W1200 68 -#define O_W300 69 -#define O_W9600 70 -#define O_WARN 71 -#define O_WINDOW 72 -#define O_WINDOWNAME 73 -#define O_WRAPLEN 74 -#define O_WRAPMARGIN 75 -#define O_WRAPSCAN 76 -#define O_WRITEANY 77 -#define O_OPTIONCOUNT 78 diff --git a/include/perl_extern.h b/include/perl_extern.h deleted file mode 100644 index 5d6dd0d33bb6..000000000000 --- a/include/perl_extern.h +++ /dev/null @@ -1,8 +0,0 @@ -int perl_end __P((GS *)); -int perl_init __P((SCR *)); -int perl_screen_end __P((SCR*)); -int perl_ex_perl __P((SCR*, CHAR_T *, size_t, recno_t, recno_t)); -int perl_ex_perldo __P((SCR*, CHAR_T *, size_t, recno_t, recno_t)); -#ifdef USE_SFIO -Sfdisc_t* sfdcnewnvi __P((SCR*)); -#endif diff --git a/include/sys/queue.h b/include/sys/queue.h deleted file mode 100644 index cbd75864ecda..000000000000 --- a/include/sys/queue.h +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright (c) 1991, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)queue.h 8.5 (Berkeley) 8/20/94 - */ - -#ifndef _SYS_QUEUE_H_ -#define _SYS_QUEUE_H_ - -/* - * This file defines three types of data structures: lists, tail queues, - * and circular queues. - * - * A list is headed by a single forward pointer (or an array of forward - * pointers for a hash table header). The elements are doubly linked - * so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before - * or after an existing element or at the head of the list. A list - * may only be traversed in the forward direction. - * - * A tail queue is headed by a pair of pointers, one to the head of the - * list and the other to the tail of the list. The elements are doubly - * linked so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before or - * after an existing element, at the head of the list, or at the end of - * the list. A tail queue may only be traversed in the forward direction. - * - * A circle queue is headed by a pair of pointers, one to the head of the - * list and the other to the tail of the list. The elements are doubly - * linked so that an arbitrary element can be removed without a need to - * traverse the list. New elements can be added to the list before or after - * an existing element, at the head of the list, or at the end of the list. - * A circle queue may be traversed in either direction, but has a more - * complex end of list detection. - * - * For details on the use of these macros, see the queue(3) manual page. - */ - -/* - * List definitions. - */ -#define LIST_HEAD(name, type) \ -struct name { \ - struct type *lh_first; /* first element */ \ -} - -#define LIST_ENTRY(type) \ -struct { \ - struct type *le_next; /* next element */ \ - struct type **le_prev; /* address of previous next element */ \ -} - -/* - * List functions. - */ -#define LIST_INIT(head) { \ - (head)->lh_first = NULL; \ -} - -#define LIST_INSERT_AFTER(listelm, elm, field) { \ - if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \ - (listelm)->field.le_next->field.le_prev = \ - &(elm)->field.le_next; \ - (listelm)->field.le_next = (elm); \ - (elm)->field.le_prev = &(listelm)->field.le_next; \ -} - -#define LIST_INSERT_BEFORE(listelm, elm, field) { \ - (elm)->field.le_prev = (listelm)->field.le_prev; \ - (elm)->field.le_next = (listelm); \ - *(listelm)->field.le_prev = (elm); \ - (listelm)->field.le_prev = &(elm)->field.le_next; \ -} - -#define LIST_INSERT_HEAD(head, elm, field) { \ - if (((elm)->field.le_next = (head)->lh_first) != NULL) \ - (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ - (head)->lh_first = (elm); \ - (elm)->field.le_prev = &(head)->lh_first; \ -} - -#define LIST_REMOVE(elm, field) { \ - if ((elm)->field.le_next != NULL) \ - (elm)->field.le_next->field.le_prev = \ - (elm)->field.le_prev; \ - *(elm)->field.le_prev = (elm)->field.le_next; \ -} - -/* - * Tail queue definitions. - */ -#define TAILQ_HEAD(name, type) \ -struct name { \ - struct type *tqh_first; /* first element */ \ - struct type **tqh_last; /* addr of last next element */ \ -} - -#define TAILQ_ENTRY(type) \ -struct { \ - struct type *tqe_next; /* next element */ \ - struct type **tqe_prev; /* address of previous next element */ \ -} - -/* - * Tail queue functions. - */ -#define TAILQ_INIT(head) { \ - (head)->tqh_first = NULL; \ - (head)->tqh_last = &(head)->tqh_first; \ -} - -#define TAILQ_INSERT_HEAD(head, elm, field) { \ - if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ - (head)->tqh_first->field.tqe_prev = \ - &(elm)->field.tqe_next; \ - else \ - (head)->tqh_last = &(elm)->field.tqe_next; \ - (head)->tqh_first = (elm); \ - (elm)->field.tqe_prev = &(head)->tqh_first; \ -} - -#define TAILQ_INSERT_TAIL(head, elm, field) { \ - (elm)->field.tqe_next = NULL; \ - (elm)->field.tqe_prev = (head)->tqh_last; \ - *(head)->tqh_last = (elm); \ - (head)->tqh_last = &(elm)->field.tqe_next; \ -} - -#define TAILQ_INSERT_AFTER(head, listelm, elm, field) { \ - if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ - (elm)->field.tqe_next->field.tqe_prev = \ - &(elm)->field.tqe_next; \ - else \ - (head)->tqh_last = &(elm)->field.tqe_next; \ - (listelm)->field.tqe_next = (elm); \ - (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ -} - -#define TAILQ_INSERT_BEFORE(listelm, elm, field) { \ - (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ - (elm)->field.tqe_next = (listelm); \ - *(listelm)->field.tqe_prev = (elm); \ - (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ -} - -#define TAILQ_REMOVE(head, elm, field) { \ - if (((elm)->field.tqe_next) != NULL) \ - (elm)->field.tqe_next->field.tqe_prev = \ - (elm)->field.tqe_prev; \ - else \ - (head)->tqh_last = (elm)->field.tqe_prev; \ - *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ -} - -/* - * Circular queue definitions. - */ -#define CIRCLEQ_HEAD(name, type) \ -struct name { \ - struct type *cqh_first; /* first element */ \ - struct type *cqh_last; /* last element */ \ -} - -#define CIRCLEQ_ENTRY(type) \ -struct { \ - struct type *cqe_next; /* next element */ \ - struct type *cqe_prev; /* previous element */ \ -} - -/* - * Circular queue functions. - */ -#define CIRCLEQ_INIT(head) { \ - (head)->cqh_first = (void *)(head); \ - (head)->cqh_last = (void *)(head); \ -} - -#define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) { \ - (elm)->field.cqe_next = (listelm)->field.cqe_next; \ - (elm)->field.cqe_prev = (listelm); \ - if ((listelm)->field.cqe_next == (void *)(head)) \ - (head)->cqh_last = (elm); \ - else \ - (listelm)->field.cqe_next->field.cqe_prev = (elm); \ - (listelm)->field.cqe_next = (elm); \ -} - -#define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) { \ - (elm)->field.cqe_next = (listelm); \ - (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ - if ((listelm)->field.cqe_prev == (void *)(head)) \ - (head)->cqh_first = (elm); \ - else \ - (listelm)->field.cqe_prev->field.cqe_next = (elm); \ - (listelm)->field.cqe_prev = (elm); \ -} - -#define CIRCLEQ_INSERT_HEAD(head, elm, field) { \ - (elm)->field.cqe_next = (head)->cqh_first; \ - (elm)->field.cqe_prev = (void *)(head); \ - if ((head)->cqh_last == (void *)(head)) \ - (head)->cqh_last = (elm); \ - else \ - (head)->cqh_first->field.cqe_prev = (elm); \ - (head)->cqh_first = (elm); \ -} - -#define CIRCLEQ_INSERT_TAIL(head, elm, field) { \ - (elm)->field.cqe_next = (void *)(head); \ - (elm)->field.cqe_prev = (head)->cqh_last; \ - if ((head)->cqh_first == (void *)(head)) \ - (head)->cqh_first = (elm); \ - else \ - (head)->cqh_last->field.cqe_next = (elm); \ - (head)->cqh_last = (elm); \ -} - -#define CIRCLEQ_REMOVE(head, elm, field) { \ - if ((elm)->field.cqe_next == (void *)(head)) \ - (head)->cqh_last = (elm)->field.cqe_prev; \ - else \ - (elm)->field.cqe_next->field.cqe_prev = \ - (elm)->field.cqe_prev; \ - if ((elm)->field.cqe_prev == (void *)(head)) \ - (head)->cqh_first = (elm)->field.cqe_next; \ - else \ - (elm)->field.cqe_prev->field.cqe_next = \ - (elm)->field.cqe_next; \ -} -#endif /* !_SYS_QUEUE_H_ */ diff --git a/include/tcl_extern.h b/include/tcl_extern.h deleted file mode 100644 index ac68ae4119fd..000000000000 --- a/include/tcl_extern.h +++ /dev/null @@ -1 +0,0 @@ -int tcl_init __P((GS *)); diff --git a/include/tk_extern.h b/include/tk_extern.h deleted file mode 100644 index 20a4de459f5e..000000000000 --- a/include/tk_extern.h +++ /dev/null @@ -1,29 +0,0 @@ -int tk_addstr __P((SCR *, const char *, size_t)); -int tk_attr __P((SCR *, scr_attr_t, int)); -int tk_baud __P((SCR *, u_long *)); -int tk_bell __P((SCR *)); -int tk_clrtoeol __P((SCR *)); -int tk_cursor __P((SCR *, size_t *, size_t *)); -int tk_deleteln __P((SCR *)); -int tk_ex_adjust __P((SCR *, exadj_t)); -int tk_insertln __P((SCR *)); -int tk_keyval __P((SCR *, scr_keyval_t, CHAR_T *, int *)); -int tk_move __P((SCR *, size_t, size_t)); -int tk_refresh __P((SCR *, int)); -int tk_rename __P((SCR *)); -int tk_suspend __P((SCR *, int *)); -void tk_usage __P((void)); -int tk_event __P((SCR *, EVENT *, u_int32_t, int)); -int tk_key __P((ClientData, Tcl_Interp *, int, char *[])); -int tk_screen __P((SCR *, u_int32_t)); -int tk_quit __P((GS *)); -int tk_term_init __P((SCR *)); -int tk_term_end __P((GS *)); -int tk_fmap __P((SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t)); -int tk_optchange __P((SCR *, int, char *, u_long *)); -int tk_ssize __P((SCR *, int, size_t *, size_t *, int *)); -int tk_op __P((ClientData, Tcl_Interp *, int, char *[])); -int tk_opt_init __P((ClientData, Tcl_Interp *, int, char *[])); -int tk_opt_set __P((ClientData, Tcl_Interp *, int, char *[])); -int tk_version __P((ClientData, Tcl_Interp *, int, char *[])); -void tk_msg __P((SCR *, mtype_t, char *, size_t)); diff --git a/ip/IP_INSTRUCTIONS b/ip/IP_INSTRUCTIONS deleted file mode 100644 index 7745c8858d6f..000000000000 --- a/ip/IP_INSTRUCTIONS +++ /dev/null @@ -1,41 +0,0 @@ -1: Add: - -DRUNNING_IP - - to the Makefile CFLAGS line and rebuild cl_main.o if it's already - been compiled. - -2: Add: - - IPOBJS= ip_funcs.o ip_main.o ip_read.o ip_screen.o ip_term.o - - after the other object lists in the Makefile. - -3: Add - $(IPOBJS) - - to the end of the NVIALL= line in the Makefile. - -4: Add: - - # Vi IP sources. - ip_funcs.o: $(srcdir)/ip/ip_funcs.c - $(CC) $(CFLAGS) $? - ip_main.o: $(srcdir)/ip/ip_main.c - $(CC) $(CFLAGS) $? - ip_read.o: $(srcdir)/ip/ip_read.c - $(CC) $(CFLAGS) $? - ip_screen.o: $(srcdir)/ip/ip_screen.c - $(CC) $(CFLAGS) $? - ip_term.o: $(srcdir)/ip/ip_term.c - $(CC) $(CFLAGS) $? - - at the end of the Makefile. - -5: Remove cl_main.o if it exists, and make nvi. - -6: Go to ip_cl and change the entries in the Makefile to reflect - where the nvi binary was just built. - -7: Build ip_cl. - -8: Enter ip_cl and you should be running vi over a pipe. diff --git a/ip/ip.h b/ip/ip.h deleted file mode 100644 index f7798c3121b4..000000000000 --- a/ip/ip.h +++ /dev/null @@ -1,92 +0,0 @@ -/*- - * Copyright (c) 1996 - * Keith Bostic. All rights reserved. - * - * See the LICENSE file for redistribution information. - * - * @(#)ip.h 8.3 (Berkeley) 10/13/96 - */ - -typedef struct _ip_private { - int i_fd; /* Input file descriptor. */ - int o_fd; /* Output file descriptor. */ - - size_t row; /* Current row. */ - size_t col; /* Current column. */ - - size_t iblen; /* Input buffer length. */ - size_t iskip; /* Returned input buffer. */ - char ibuf[256]; /* Input buffer. */ - -#define IP_SCR_VI_INIT 0x0001 /* Vi screen initialized. */ - u_int32_t flags; -} IP_PRIVATE; - -#define IPP(sp) ((IP_PRIVATE *)((sp)->gp->ip_private)) -#define GIPP(gp) ((IP_PRIVATE *)((gp)->ip_private)) - -/* The screen line relative to a specific window. */ -#define RLNO(sp, lno) (sp)->woff + (lno) - -/* - * The IP protocol consists of frames, each containing: - * - * - * - * XXX - * We should have a marking byte, 0xaa to delimit frames. - * - */ -#define IPO_CODE 1 /* An event specification. */ -#define IPO_INT 2 /* 4-byte, network order integer. */ -#define IPO_STR 3 /* IPO_INT: followed by N bytes. */ - -#define IPO_CODE_LEN 1 -#define IPO_INT_LEN 4 - -/* A structure that can hold the information for any frame. */ -typedef struct _ip_buf { - int code; /* Event code. */ - const char *str; /* String. */ - size_t len; /* String length. */ - u_int32_t val1; /* First value. */ - u_int32_t val2; /* Second value. */ -} IP_BUF; - -/* - * Screen/editor IP_CODE's. - * - * The program structure depends on the event loop being able to return - * IPO_EOF/IPOE_ERR multiple times -- eventually enough things will end - * due to the events that vi will reach the command level for the screen, - * at which point the exit flags will be set and vi will exit. - * - * IP events sent from the screen to vi. - */ -#define IPO_EOF 1 /* End of input (NOT ^D). */ -#define IPO_ERR 2 /* Input error. */ -#define IPO_INTERRUPT 3 /* Interrupt. */ -#define IPO_QUIT 4 /* Quit. */ -#define IPO_RESIZE 5 /* Screen resize: IPO_INT, IPO_INT. */ -#define IPO_SIGHUP 6 /* SIGHUP. */ -#define IPO_SIGTERM 7 /* SIGTERM. */ -#define IPO_STRING 8 /* Input string: IPO_STR. */ -#define IPO_WRITE 9 /* Write. */ - -/* - * IP events sent from vi to the screen. - */ -#define IPO_ADDSTR 1 /* Add a string: IPO_STR. */ -#define IPO_ATTRIBUTE 2 /* Set screen attribute: IPO_INT, IPO_INT. */ -#define IPO_BELL 3 /* Beep/bell/flash the terminal. */ -#define IPO_BUSY 4 /* Display a busy message: IPO_STR. */ -#define IPO_CLRTOEOL 5 /* Clear to the end of the line. */ -#define IPO_DELETELN 6 /* Delete a line. */ -#define IPO_INSERTLN 7 /* Insert a line. */ -#define IPO_MOVE 8 /* Move the cursor: IPO_INT, IPO_INT. */ -#define IPO_REDRAW 9 /* Redraw the screen. */ -#define IPO_REFRESH 10 /* Refresh the screen. */ -#define IPO_RENAME 11 /* Rename the screen: IPO_STR. */ -#define IPO_REWRITE 12 /* Rewrite a line: IPO_INT. */ - -#include "ip_extern.h" diff --git a/ip/ip_funcs.c b/ip/ip_funcs.c deleted file mode 100644 index c92f1eda2439..000000000000 --- a/ip/ip_funcs.c +++ /dev/null @@ -1,443 +0,0 @@ -/*- - * Copyright (c) 1996 - * Keith Bostic. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)ip_funcs.c 8.4 (Berkeley) 10/13/96"; -#endif /* not lint */ - -#include -#include -#include - -#include -#include - -#include "../common/common.h" -#include "../vi/vi.h" -#include "ip.h" - -static int ip_send __P((SCR *, char *, IP_BUF *)); - -/* - * ip_addstr -- - * Add len bytes from the string at the cursor, advancing the cursor. - * - * PUBLIC: int ip_addstr __P((SCR *, const char *, size_t)); - */ -int -ip_addstr(sp, str, len) - SCR *sp; - const char *str; - size_t len; -{ - IP_BUF ipb; - IP_PRIVATE *ipp; - int iv, rval; - - ipp = IPP(sp); - - /* - * If ex isn't in control, it's the last line of the screen and - * it's a split screen, use inverse video. - */ - iv = 0; - if (!F_ISSET(sp, SC_SCR_EXWROTE) && - ipp->row == LASTLINE(sp) && IS_SPLIT(sp)) { - iv = 1; - ip_attr(sp, SA_INVERSE, 1); - } - ipb.code = IPO_ADDSTR; - ipb.len = len; - ipb.str = str; - rval = ip_send(sp, "s", &ipb); - - if (iv) - ip_attr(sp, SA_INVERSE, 0); - return (rval); -} - -/* - * ip_attr -- - * Toggle a screen attribute on/off. - * - * PUBLIC: int ip_attr __P((SCR *, scr_attr_t, int)); - */ -int -ip_attr(sp, attribute, on) - SCR *sp; - scr_attr_t attribute; - int on; -{ - IP_BUF ipb; - - ipb.code = IPO_ATTRIBUTE; - ipb.val1 = attribute; - ipb.val2 = on; - - return (ip_send(sp, "12", &ipb)); -} - -/* - * ip_baud -- - * Return the baud rate. - * - * PUBLIC: int ip_baud __P((SCR *, u_long *)); - */ -int -ip_baud(sp, ratep) - SCR *sp; - u_long *ratep; -{ - *ratep = 9600; /* XXX: Translation: fast. */ - return (0); -} - -/* - * ip_bell -- - * Ring the bell/flash the screen. - * - * PUBLIC: int ip_bell __P((SCR *)); - */ -int -ip_bell(sp) - SCR *sp; -{ - IP_BUF ipb; - - ipb.code = IPO_BELL; - - return (ip_send(sp, NULL, &ipb)); -} - -/* - * ip_busy -- - * Display a busy message. - * - * PUBLIC: void ip_busy __P((SCR *, const char *, busy_t)); - */ -void -ip_busy(sp, str, bval) - SCR *sp; - const char *str; - busy_t bval; -{ - IP_BUF ipb; - - ipb.code = IPO_BUSY; - if (str == NULL) { - ipb.len = 0; - ipb.str = ""; - } else { - ipb.len = strlen(str); - ipb.str = str; - } - ipb.val1 = bval; - - (void)ip_send(sp, "s1", &ipb); -} - -/* - * ip_clrtoeol -- - * Clear from the current cursor to the end of the line. - * - * PUBLIC: int ip_clrtoeol __P((SCR *)); - */ -int -ip_clrtoeol(sp) - SCR *sp; -{ - IP_BUF ipb; - - ipb.code = IPO_CLRTOEOL; - - return (ip_send(sp, NULL, &ipb)); -} - -/* - * ip_cursor -- - * Return the current cursor position. - * - * PUBLIC: int ip_cursor __P((SCR *, size_t *, size_t *)); - */ -int -ip_cursor(sp, yp, xp) - SCR *sp; - size_t *yp, *xp; -{ - IP_PRIVATE *ipp; - - ipp = IPP(sp); - *yp = ipp->row; - *xp = ipp->col; - return (0); -} - -/* - * ip_deleteln -- - * Delete the current line, scrolling all lines below it. - * - * PUBLIC: int ip_deleteln __P((SCR *)); - */ -int -ip_deleteln(sp) - SCR *sp; -{ - IP_BUF ipb; - - /* - * This clause is required because the curses screen uses reverse - * video to delimit split screens. If the screen does not do this, - * this code won't be necessary. - * - * If the bottom line was in reverse video, rewrite it in normal - * video before it's scrolled. - */ - if (!F_ISSET(sp, SC_SCR_EXWROTE) && IS_SPLIT(sp)) { - ipb.code = IPO_REWRITE; - ipb.val1 = RLNO(sp, LASTLINE(sp)); - if (ip_send(sp, "1", &ipb)) - return (1); - } - - /* - * The bottom line is expected to be blank after this operation, - * and other screens must support that semantic. - */ - ipb.code = IPO_DELETELN; - return (ip_send(sp, NULL, &ipb)); -} - -/* - * ip_ex_adjust -- - * Adjust the screen for ex. - * - * PUBLIC: int ip_ex_adjust __P((SCR *, exadj_t)); - */ -int -ip_ex_adjust(sp, action) - SCR *sp; - exadj_t action; -{ - abort(); - /* NOTREACHED */ -} - -/* - * ip_insertln -- - * Push down the current line, discarding the bottom line. - * - * PUBLIC: int ip_insertln __P((SCR *)); - */ -int -ip_insertln(sp) - SCR *sp; -{ - IP_BUF ipb; - - ipb.code = IPO_INSERTLN; - - return (ip_send(sp, NULL, &ipb)); -} - -/* - * ip_keyval -- - * Return the value for a special key. - * - * PUBLIC: int ip_keyval __P((SCR *, scr_keyval_t, CHAR_T *, int *)); - */ -int -ip_keyval(sp, val, chp, dnep) - SCR *sp; - scr_keyval_t val; - CHAR_T *chp; - int *dnep; -{ - /* - * VEOF, VERASE and VKILL are required by POSIX 1003.1-1990, - * VWERASE is a 4BSD extension. - */ - switch (val) { - case KEY_VEOF: - *dnep = '\004'; /* ^D */ - break; - case KEY_VERASE: - *dnep = '\b'; /* ^H */ - break; - case KEY_VKILL: - *dnep = '\025'; /* ^U */ - break; -#ifdef VWERASE - case KEY_VWERASE: - *dnep = '\027'; /* ^W */ - break; -#endif - default: - *dnep = 1; - break; - } - return (0); -} - -/* - * ip_move -- - * Move the cursor. - * - * PUBLIC: int ip_move __P((SCR *, size_t, size_t)); - */ -int -ip_move(sp, lno, cno) - SCR *sp; - size_t lno, cno; -{ - IP_PRIVATE *ipp; - IP_BUF ipb; - - ipp = IPP(sp); - ipp->row = lno; - ipp->col = cno; - - ipb.code = IPO_MOVE; - ipb.val1 = RLNO(sp, lno); - ipb.val2 = cno; - return (ip_send(sp, "12", &ipb)); -} - -/* - * ip_refresh -- - * Refresh the screen. - * - * PUBLIC: int ip_refresh __P((SCR *, int)); - */ -int -ip_refresh(sp, repaint) - SCR *sp; - int repaint; -{ - IP_BUF ipb; - - ipb.code = repaint ? IPO_REDRAW : IPO_REFRESH; - - return (ip_send(sp, NULL, &ipb)); -} - -/* - * ip_rename -- - * Rename the file. - * - * PUBLIC: int ip_rename __P((SCR *)); - */ -int -ip_rename(sp) - SCR *sp; -{ - IP_BUF ipb; - - ipb.code = IPO_RENAME; - ipb.len = strlen(sp->frp->name); - ipb.str = sp->frp->name; - - return (ip_send(sp, "s", &ipb)); -} - -/* - * ip_suspend -- - * Suspend a screen. - * - * PUBLIC: int ip_suspend __P((SCR *, int *)); - */ -int -ip_suspend(sp, allowedp) - SCR *sp; - int *allowedp; -{ - *allowedp = 0; - return (0); -} - -/* - * ip_usage -- - * Print out the ip usage messages. - * - * PUBLIC: void ip_usage __P((void)); - */ -void -ip_usage() -{ -#define USAGE "\ -usage: vi [-eFlRrSv] [-c command] [-I ifd.ofd] [-t tag] [-w size] [file ...]\n" - (void)fprintf(stderr, "%s", USAGE); -#undef USAGE -} - -/* - * ip_send -- - * Construct and send an IP buffer. - */ -static int -ip_send(sp, fmt, ipbp) - SCR *sp; - char *fmt; - IP_BUF *ipbp; -{ - IP_PRIVATE *ipp; - size_t blen, off; - u_int32_t ilen; - int nlen, n, nw, rval; - char *bp, *p; - - ipp = IPP(sp); - - GET_SPACE_RET(sp, bp, blen, 128); - - p = bp; - nlen = 0; - *p++ = ipbp->code; - nlen += IPO_CODE_LEN; - - if (fmt != NULL) - for (; *fmt != '\0'; ++fmt) - switch (*fmt) { - case '1': /* Value 1. */ - ilen = htonl(ipbp->val1); - goto value; - case '2': /* Value 2. */ - ilen = htonl(ipbp->val2); -value: nlen += IPO_INT_LEN; - off = p - bp; - ADD_SPACE_RET(sp, bp, blen, nlen); - p = bp + off; - memmove(p, &ilen, IPO_INT_LEN); - p += IPO_INT_LEN; - break; - case 's': /* String. */ - ilen = ipbp->len; /* XXX: conversion. */ - ilen = htonl(ilen); - nlen += IPO_INT_LEN + ipbp->len; - off = p - bp; - ADD_SPACE_RET(sp, bp, blen, nlen); - p = bp + off; - memmove(p, &ilen, IPO_INT_LEN); - p += IPO_INT_LEN; - memmove(p, ipbp->str, ipbp->len); - p += ipbp->len; - break; - } - - - rval = 0; - for (n = p - bp, p = bp; n > 0; n -= nw, p += nw) - if ((nw = write(ipp->o_fd, p, n)) < 0) { - rval = 1; - break; - } - - FREE_SPACE(sp, bp, blen); - - return (rval); -} diff --git a/ip/ip_main.c b/ip/ip_main.c deleted file mode 100644 index 7ca9f55024fd..000000000000 --- a/ip/ip_main.c +++ /dev/null @@ -1,165 +0,0 @@ -/*- - * Copyright (c) 1996 - * Keith Bostic. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)ip_main.c 8.3 (Berkeley) 10/13/96"; -#endif /* not lint */ - -#include -#include - -#include -#include -#include -#include - -#include "../common/common.h" -#include "ip.h" - -static void ip_func_std __P((GS *)); -static IP_PRIVATE *ip_init __P((GS *, char *)); -static void perr __P((char *, char *)); - -/* - * main -- - * This is the main loop for the vi-as-library editor. - */ -int -ip_main(argc, argv, gp, ip_arg) - int argc; - char *argv[], *ip_arg; - GS *gp; -{ - EVENT ev; - IP_PRIVATE *ipp; - IP_BUF ipb; - int rval; - - /* Create and partially initialize the IP structure. */ - if ((ipp = ip_init(gp, ip_arg)) == NULL) - return (1); - - /* Add the terminal type to the global structure. */ - if ((OG_D_STR(gp, GO_TERM) = - OG_STR(gp, GO_TERM) = strdup("ip_curses")) == NULL) - perr(gp->progname, NULL); - - /* - * Figure out how big the screen is -- read events until we get - * the rows and columns. - */ - do { - if (ip_event(NULL, &ev, 0, 0)) - return (1); - } while (ev.e_event != E_EOF && ev.e_event != E_ERR && - ev.e_event != E_QUIT && ev.e_event != E_WRESIZE && - ev.e_event != E_SIGHUP && ev.e_event != E_SIGTERM); - if (ev.e_event != E_WRESIZE) - return (1); - - /* Run ex/vi. */ - rval = editor(gp, argc, argv); - - /* Clean up the screen. */ - (void)ip_quit(gp); - - /* Free the global and IP private areas. */ -#if defined(DEBUG) || defined(PURIFY) || defined(LIBRARY) - free(ipp); - free(gp); -#endif - - return (rval); -} - -/* - * ip_init -- - * Create and partially initialize the GS structure. - */ -static IP_PRIVATE * -ip_init(gp, ip_arg) - GS *gp; - char *ip_arg; -{ - IP_PRIVATE *ipp; - char *ep; - - /* Allocate the IP private structure. */ - CALLOC_NOMSG(NULL, ipp, IP_PRIVATE *, 1, sizeof(IP_PRIVATE)); - if (ipp == NULL) - perr(gp->progname, NULL); - gp->ip_private = ipp; - - /* - * Crack ip_arg -- it's of the form #.#, where the first number is the - * file descriptor from the screen, the second is the file descriptor - * to the screen. - */ - if (!isdigit(ip_arg[0])) - goto usage; - ipp->i_fd = strtol(ip_arg, &ep, 10); - if (ep[0] != '.' || !isdigit(ep[1])) - goto usage; - ipp->o_fd = strtol(++ep, &ep, 10); - if (ep[0] != '\0') { -usage: ip_usage(); - return (NULL); - } - - /* Initialize the list of ip functions. */ - ip_func_std(gp); - - return (ipp); -} - -/* - * ip_func_std -- - * Initialize the standard ip functions. - */ -static void -ip_func_std(gp) - GS *gp; -{ - gp->scr_addstr = ip_addstr; - gp->scr_attr = ip_attr; - gp->scr_baud = ip_baud; - gp->scr_bell = ip_bell; - gp->scr_busy = ip_busy; - gp->scr_clrtoeol = ip_clrtoeol; - gp->scr_cursor = ip_cursor; - gp->scr_deleteln = ip_deleteln; - gp->scr_event = ip_event; - gp->scr_ex_adjust = ip_ex_adjust; - gp->scr_fmap = ip_fmap; - gp->scr_insertln = ip_insertln; - gp->scr_keyval = ip_keyval; - gp->scr_move = ip_move; - gp->scr_msg = NULL; - gp->scr_optchange = ip_optchange; - gp->scr_refresh = ip_refresh; - gp->scr_rename = ip_rename; - gp->scr_screen = ip_screen; - gp->scr_suspend = ip_suspend; - gp->scr_usage = ip_usage; -} - -/* - * perr -- - * Print system error. - */ -static void -perr(name, msg) - char *name, *msg; -{ - (void)fprintf(stderr, "%s:", name); - if (msg != NULL) - (void)fprintf(stderr, "%s:", msg); - (void)fprintf(stderr, "%s\n", strerror(errno)); - exit(1); -} diff --git a/ip/ip_read.c b/ip/ip_read.c deleted file mode 100644 index 9fd977774173..000000000000 --- a/ip/ip_read.c +++ /dev/null @@ -1,307 +0,0 @@ -/*- - * Copyright (c) 1996 - * Keith Bostic. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)ip_read.c 8.3 (Berkeley) 9/24/96"; -#endif /* not lint */ - -#include -#include - -#include -#include -#include -#include - -#include "../common/common.h" -#include "../ex/script.h" -#include "ip.h" - -extern GS *__global_list; - -typedef enum { INP_OK=0, INP_EOF, INP_ERR, INP_TIMEOUT } input_t; - -static input_t ip_read __P((SCR *, IP_PRIVATE *, struct timeval *)); -static int ip_resize __P((SCR *, size_t, size_t)); -static int ip_trans __P((SCR *, IP_PRIVATE *, EVENT *)); - -/* - * ip_event -- - * Return a single event. - * - * PUBLIC: int ip_event __P((SCR *, EVENT *, u_int32_t, int)); - */ -int -ip_event(sp, evp, flags, ms) - SCR *sp; - EVENT *evp; - u_int32_t flags; - int ms; -{ - IP_PRIVATE *ipp; - struct timeval t, *tp; - - if (LF_ISSET(EC_INTERRUPT)) { /* XXX */ - evp->e_event = E_TIMEOUT; - return (0); - } - - ipp = sp == NULL ? GIPP(__global_list) : IPP(sp); - - /* Discard the last command. */ - if (ipp->iskip != 0) { - ipp->iblen -= ipp->iskip; - memmove(ipp->ibuf, ipp->ibuf + ipp->iskip, ipp->iblen); - ipp->iskip = 0; - } - - /* Set timer. */ - if (ms == 0) - tp = NULL; - else { - t.tv_sec = ms / 1000; - t.tv_usec = (ms % 1000) * 1000; - tp = &t; - } - - /* Read input events. */ - for (;;) { - switch (ip_read(sp, ipp, tp)) { - case INP_OK: - if (!ip_trans(sp, ipp, evp)) - continue; - break; - case INP_EOF: - evp->e_event = E_EOF; - break; - case INP_ERR: - evp->e_event = E_ERR; - break; - case INP_TIMEOUT: - evp->e_event = E_TIMEOUT; - break; - default: - abort(); - } - break; - } - return (0); -} - -/* - * ip_read -- - * Read characters from the input. - */ -static input_t -ip_read(sp, ipp, tp) - SCR *sp; - IP_PRIVATE *ipp; - struct timeval *tp; -{ - struct timeval poll; - GS *gp; - SCR *tsp; - fd_set rdfd; - input_t rval; - size_t blen; - int maxfd, nr; - char *bp; - - gp = sp == NULL ? __global_list : sp->gp; - bp = ipp->ibuf + ipp->iblen; - blen = sizeof(ipp->ibuf) - ipp->iblen; - - /* - * 1: A read with an associated timeout, e.g., trying to complete - * a map sequence. If input exists, we fall into #2. - */ - FD_ZERO(&rdfd); - poll.tv_sec = 0; - poll.tv_usec = 0; - if (tp != NULL) { - FD_SET(ipp->i_fd, &rdfd); - switch (select(ipp->i_fd + 1, - &rdfd, NULL, NULL, tp == NULL ? &poll : tp)) { - case 0: - return (INP_TIMEOUT); - case -1: - goto err; - default: - break; - } - } - - /* - * 2: Wait for input. - * - * Select on the command input and scripting window file descriptors. - * It's ugly that we wait on scripting file descriptors here, but it's - * the only way to keep from locking out scripting windows. - */ - if (sp != NULL && F_ISSET(gp, G_SCRWIN)) { -loop: FD_ZERO(&rdfd); - FD_SET(ipp->i_fd, &rdfd); - maxfd = ipp->i_fd; - for (tsp = gp->dq.cqh_first; - tsp != (void *)&gp->dq; tsp = tsp->q.cqe_next) - if (F_ISSET(sp, SC_SCRIPT)) { - FD_SET(sp->script->sh_master, &rdfd); - if (sp->script->sh_master > maxfd) - maxfd = sp->script->sh_master; - } - switch (select(maxfd + 1, &rdfd, NULL, NULL, NULL)) { - case 0: - abort(); - case -1: - goto err; - default: - break; - } - if (!FD_ISSET(ipp->i_fd, &rdfd)) { - if (sscr_input(sp)) - return (INP_ERR); - goto loop; - } - } - - /* - * 3: Read the input. - */ - switch (nr = read(ipp->i_fd, bp, blen)) { - case 0: /* EOF. */ - rval = INP_EOF; - break; - case -1: /* Error or interrupt. */ -err: rval = INP_ERR; - msgq(sp, M_SYSERR, "input"); - break; - default: /* Input characters. */ - ipp->iblen += nr; - rval = INP_OK; - break; - } - return (rval); -} - -/* - * ip_trans -- - * Translate messages into events. - */ -static int -ip_trans(sp, ipp, evp) - SCR *sp; - IP_PRIVATE *ipp; - EVENT *evp; -{ - u_int32_t val1, val2; - - switch (ipp->ibuf[0]) { - case IPO_EOF: - evp->e_event = E_EOF; - ipp->iskip = IPO_CODE_LEN; - return (1); - case IPO_ERR: - evp->e_event = E_ERR; - ipp->iskip = IPO_CODE_LEN; - return (1); - case IPO_INTERRUPT: - evp->e_event = E_INTERRUPT; - ipp->iskip = IPO_CODE_LEN; - return (1); - case IPO_QUIT: - evp->e_event = E_QUIT; - ipp->iskip = IPO_CODE_LEN; - return (1); - case IPO_RESIZE: - if (ipp->iblen < IPO_CODE_LEN + IPO_INT_LEN * 2) - return (0); - evp->e_event = E_WRESIZE; - memcpy(&val1, ipp->ibuf + IPO_CODE_LEN, IPO_INT_LEN); - val1 = ntohl(val1); - memcpy(&val2, - ipp->ibuf + IPO_CODE_LEN + IPO_INT_LEN, IPO_INT_LEN); - val2 = ntohl(val2); - ip_resize(sp, val1, val2); - ipp->iskip = IPO_CODE_LEN + IPO_INT_LEN * 2; - return (1); - case IPO_SIGHUP: - evp->e_event = E_SIGHUP; - ipp->iskip = IPO_CODE_LEN; - return (1); - case IPO_SIGTERM: - evp->e_event = E_SIGTERM; - ipp->iskip = IPO_CODE_LEN; - return (1); - case IPO_STRING: - evp->e_event = E_STRING; -string: if (ipp->iblen < IPO_CODE_LEN + IPO_INT_LEN) - return (0); - memcpy(&val1, ipp->ibuf + IPO_CODE_LEN, IPO_INT_LEN); - val1 = ntohl(val1); - if (ipp->iblen < IPO_CODE_LEN + IPO_INT_LEN + val1) - return (0); - ipp->iskip = IPO_CODE_LEN + IPO_INT_LEN + val1; - evp->e_csp = ipp->ibuf + IPO_CODE_LEN + IPO_INT_LEN; - evp->e_len = val1; - return (1); - case IPO_WRITE: - evp->e_event = E_WRITE; - ipp->iskip = IPO_CODE_LEN; - return (1); - default: - /* - * XXX: Protocol is out of sync? - */ - abort(); - } - /* NOTREACHED */ -} - -/* - * ip_resize -- - * Reset the options for a resize event. - */ -static int -ip_resize(sp, lines, columns) - SCR *sp; - size_t lines, columns; -{ - GS *gp; - ARGS *argv[2], a, b; - char b1[1024]; - - /* - * XXX - * The IP screen has to know the lines and columns before anything - * else happens. So, we may not have a valid SCR pointer, and we - * have to deal with that. - */ - if (sp == NULL) { - gp = __global_list; - OG_VAL(gp, GO_LINES) = OG_D_VAL(gp, GO_LINES) = lines; - OG_VAL(gp, GO_COLUMNS) = OG_D_VAL(gp, GO_COLUMNS) = columns; - return (0); - } - - a.bp = b1; - b.bp = NULL; - a.len = b.len = 0; - argv[0] = &a; - argv[1] = &b; - - (void)snprintf(b1, sizeof(b1), "lines=%lu", (u_long)lines); - a.len = strlen(b1); - if (opts_set(sp, argv, NULL)) - return (1); - (void)snprintf(b1, sizeof(b1), "columns=%lu", (u_long)columns); - a.len = strlen(b1); - if (opts_set(sp, argv, NULL)) - return (1); - return (0); -} diff --git a/ip/ip_screen.c b/ip/ip_screen.c deleted file mode 100644 index 71578e0d1b39..000000000000 --- a/ip/ip_screen.c +++ /dev/null @@ -1,87 +0,0 @@ -/*- - * Copyright (c) 1996 - * Keith Bostic. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)ip_screen.c 8.2 (Berkeley) 10/13/96"; -#endif /* not lint */ - -#include -#include - -#include -#include - -#include "../common/common.h" -#include "ip.h" - -/* - * ip_screen -- - * Initialize/shutdown the IP screen. - * - * PUBLIC: int ip_screen __P((SCR *, u_int32_t)); - */ -int -ip_screen(sp, flags) - SCR *sp; - u_int32_t flags; -{ - GS *gp; - IP_PRIVATE *ipp; - - gp = sp->gp; - ipp = IPP(sp); - - /* See if the current information is incorrect. */ - if (F_ISSET(gp, G_SRESTART)) { - if (ip_quit(gp)) - return (1); - F_CLR(gp, G_SRESTART); - } - - /* See if we're already in the right mode. */ - if (LF_ISSET(SC_VI) && F_ISSET(ipp, IP_SCR_VI_INIT)) - return (0); - - /* Ex isn't possible. */ - if (LF_ISSET(SC_EX)) - return (1); - - /* Initialize terminal based information. */ - if (ip_term_init(sp)) - return (1); - - /* Put up the first file name. */ - if (ip_rename(sp)) - return (1); - - F_SET(ipp, IP_SCR_VI_INIT); - return (0); -} - -/* - * ip_quit -- - * Shutdown the screens. - * - * PUBLIC: int ip_quit __P((GS *)); - */ -int -ip_quit(gp) - GS *gp; -{ - IP_PRIVATE *ipp; - int rval; - - /* Clean up the terminal mappings. */ - rval = ip_term_end(gp); - - ipp = GIPP(gp); - F_CLR(ipp, IP_SCR_VI_INIT); - - return (rval); -} diff --git a/ip/ip_term.c b/ip/ip_term.c deleted file mode 100644 index 28e686dddd28..000000000000 --- a/ip/ip_term.c +++ /dev/null @@ -1,108 +0,0 @@ -/*- - * Copyright (c) 1996 - * Keith Bostic. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)ip_term.c 8.2 (Berkeley) 10/13/96"; -#endif /* not lint */ - -#include -#include - -#include -#include - -#include "../common/common.h" -#include "ip.h" - -/* - * ip_term_init -- - * Initialize the terminal special keys. - * - * PUBLIC: int ip_term_init __P((SCR *)); - */ -int -ip_term_init(sp) - SCR *sp; -{ - SEQ *qp; - - /* - * Rework any function key mappings that were set before the - * screen was initialized. - */ - for (qp = sp->gp->seqq.lh_first; qp != NULL; qp = qp->q.le_next) - if (F_ISSET(qp, SEQ_FUNCMAP)) - (void)ip_fmap(sp, qp->stype, - qp->input, qp->ilen, qp->output, qp->olen); - return (0); -} - -/* - * ip_term_end -- - * End the special keys defined by the termcap/terminfo entry. - * - * PUBLIC: int ip_term_end __P((GS *)); - */ -int -ip_term_end(gp) - GS *gp; -{ - SEQ *qp, *nqp; - - /* Delete screen specific mappings. */ - for (qp = gp->seqq.lh_first; qp != NULL; qp = nqp) { - nqp = qp->q.le_next; - if (F_ISSET(qp, SEQ_SCREEN)) - (void)seq_mdel(qp); - } - return (0); -} - -/* - * ip_fmap -- - * Map a function key. - * - * PUBLIC: int ip_fmap __P((SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t)); - */ -int -ip_fmap(sp, stype, from, flen, to, tlen) - SCR *sp; - seq_t stype; - CHAR_T *from, *to; - size_t flen, tlen; -{ - /* Bind a function key to a string sequence. */ - return (1); -} - -/* - * ip_optchange -- - * IP screen specific "option changed" routine. - * - * PUBLIC: int ip_optchange __P((SCR *, int, char *, u_long *)); - */ -int -ip_optchange(sp, opt, str, valp) - SCR *sp; - int opt; - char *str; - u_long *valp; -{ - switch (opt) { - case O_COLUMNS: - case O_LINES: - F_SET(sp->gp, G_SRESTART); - F_CLR(sp, SC_SCR_EX | SC_SCR_VI); - break; - case O_TERM: - msgq(sp, M_ERR, "The screen type may not be changed"); - return (1); - } - return (0); -} diff --git a/ip_cl/Makefile b/ip_cl/Makefile deleted file mode 100644 index 9503c4dac501..000000000000 --- a/ip_cl/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# TR turns on tracing, to the specified file. -TR= -DTR=\"/dev/ttypa\" -#TR= -DTR=\"__log\" - -# VI is the binary that ip_cl runs. -VI= -DVI=\"../build.local/nvi\" - -DEBUG= -DDEBUG -g -INC= -I. -I../build.local -I../include -CFLAGS= $(DEBUG) $(TR) $(VI) $(INC) - -OBJS= ip_cl.o - -LIBS= -lcurses -ltermcap - -ip_cl: ${OBJS} - ${CC} ${OBJS} -o $@ ${LIBS} - -clean: - rm -f ip_cl ${OBJS} diff --git a/ip_cl/ip_cl.c b/ip_cl/ip_cl.c deleted file mode 100644 index 5137b3f56abc..000000000000 --- a/ip_cl/ip_cl.c +++ /dev/null @@ -1,742 +0,0 @@ -/*- - * Copyright (c) 1996 - * Keith Bostic. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)ip_cl.c 8.4 (Berkeley) 10/13/96"; -#endif /* not lint */ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../common/common.h" -#include "../ip/ip.h" -#include "pathnames.h" - -size_t cols, rows; /* Screen columns, rows. */ -int die; /* Child died. */ -int i_fd, o_fd; /* Input/output fd's. */ -int resize; /* Window resized. */ - -void arg_format __P((int *, char **[], int, int)); -void attach __P((void)); -void ip_cur_end __P((void)); -void ip_cur_init __P((void)); -void ip_read __P((void)); -void ip_resize __P((void)); -int ip_send __P((char *, IP_BUF *)); -void ip_siginit __P((void)); -int ip_trans __P((char *, size_t, size_t *)); -void nomem __P((void)); -void onchld __P((int)); -void onintr __P((int)); -void onwinch __P((int)); -void trace __P((const char *, ...)); -void usage __P((void)); - -int -main(argc, argv) - int argc; - char *argv[]; -{ - fd_set fdset; - pid_t pid; - size_t blen, len, skip; - int ch, nr, rpipe[2], wpipe[2]; - char *bp; - - while ((ch = getopt(argc, argv, "D")) != EOF) - switch (ch) { - case 'D': - attach(); - break; - case '?': - default: - usage(); - } - argc -= optind; - argv += optind; - - /* - * Open the communications pipes. The pipes are named from our - * viewpoint, so we read from rpipe[0] and write to wpipe[1]. - * Vi reads from wpipe[0], and writes to rpipe[1]. - */ - if (pipe(rpipe) == -1 || pipe(wpipe) == -1) { - perror("ip_cl: pipe"); - exit (1); - } - i_fd = rpipe[0]; - o_fd = wpipe[1]; - - /* - * Format our arguments, adding a -I to the list. The first file - * descriptor to the -I argument is vi's input, and the second is - * vi's output. - */ - arg_format(&argc, &argv, wpipe[0], rpipe[1]); - - /* Run vi. */ - switch (pid = fork()) { - case -1: /* Error. */ - perror("ip_cl: fork"); - exit (1); - case 0: /* Vi. */ - execv(VI, argv); - perror("ip_cl: execv ../build/nvi"); - exit (1); - default: /* Ip_cl. */ - break; - } - - /* - * Allocate initial input buffer. - * XXX - * We don't dynamically resize, so there better not be any individual - * messages larger than this buffer. - */ - blen = 4 * 1024; - if ((bp = malloc(blen)) == NULL) - nomem(); - - /* Clear the file descriptor mask. */ - FD_ZERO(&fdset); - - /* Initialize signals. */ - ip_siginit(); - - /* Initialize the curses screen. */ - ip_cur_init(); - - /* The first thing vi wants is the screen size. */ - ip_resize(); - - /* Main loop. */ - for (len = 0;;) { - if (die) - break; - /* - * XXX - * Race #1: if there's an event coming from vi that requires - * that we know what size the screen is, and we take a resize - * signal, we'll differ from vi in the size of the screen for - * that event. Fixing this will requires information attached - * to message as to what set of state was in place when the - * message was sent. Not hard, but not worth doing now. - * - * Race #2: we cycle, handling resize events until there aren't - * any waiting. We then do a select. If the resize signal - * arrives after we exit the loop but before we enter select, - * we'll wait on the user to enter a keystroke, handle it and - * then handle the resize. - */ - while (resize) { - resize = 0; - ip_resize(); - ip_cur_end(); - ip_cur_init(); - } - - /* Wait until vi or the screen wants to talk. */ - FD_SET(i_fd, &fdset); - FD_SET(STDIN_FILENO, &fdset); - errno = 0; - switch (select(i_fd + 1, &fdset, NULL, NULL, NULL)) { - case 0: - abort(); /* Timeout. */ - /* NOTREACHED */ - case -1: - if (errno == EINTR) - continue; - perror("ip_cl: select"); - exit (1); - default: - break; - } - - /* Read waiting tty characters and send them to vi. */ - if (FD_ISSET(STDIN_FILENO, &fdset)) { - ip_read(); - continue; - } - - /* Read waiting vi messages and translate to curses calls. */ - switch (nr = read(i_fd, bp + len, blen - len)) { - case 0: - continue; - case -1: - perror("ip_cl: read"); - exit (1); - default: - break; - } - - /* Parse to data end or partial message. */ - for (len += nr, skip = 0; len > skip && - ip_trans(bp + skip, len - skip, &skip) == 1;); - - /* Copy any partial messages down in the buffer. */ - len -= skip; - if (len > 0) - memmove(bp, bp + skip, len); - } - - /* End the screen. */ - ip_cur_end(); - - exit (0); -} - -/* - * ip_read -- - * Read characters from the screen and send them to vi. - */ -void -ip_read() -{ - IP_BUF ipb; - int nr; - char bp[1024]; - - /* Read waiting tty characters. */ - switch (nr = read(STDIN_FILENO, bp, sizeof(bp))) { - case 0: - return; - case -1: - perror("ip_cl: read"); - exit (1); - default: - break; - } - - ipb.code = IPO_STRING; - ipb.len = nr; - ipb.str = bp; - ip_send("s", &ipb); -} - -/* - * ip_trans -- - * Translate vi messages into curses calls. - */ -int -ip_trans(bp, len, skipp) - char *bp; - size_t len, *skipp; -{ - IP_BUF ipb; - size_t cno, lno, nlen, oldy, oldx, spcnt; - int ch; - char *fmt, *p; - - switch (bp[0]) { - case IPO_ADDSTR: - case IPO_RENAME: - fmt = "s"; - break; - case IPO_BUSY: - fmt = "s1"; - break; - case IPO_ATTRIBUTE: - case IPO_MOVE: - fmt = "12"; - break; - case IPO_REWRITE: - fmt = "1"; - break; - default: - fmt = ""; - } - - nlen = IPO_CODE_LEN; - p = bp + IPO_CODE_LEN; - for (; *fmt != '\0'; ++fmt) - switch (*fmt) { - case '1': - nlen += IPO_INT_LEN; - if (len < nlen) - return (0); - memcpy(&ipb.val1, p, IPO_INT_LEN); - ipb.val1 = ntohl(ipb.val1); - p += IPO_INT_LEN; - break; - case '2': - nlen += IPO_INT_LEN; - if (len < nlen) - return (0); - memcpy(&ipb.val2, p, IPO_INT_LEN); - ipb.val2 = ntohl(ipb.val2); - p += IPO_INT_LEN; - break; - case 's': - nlen += IPO_INT_LEN; - if (len < nlen) - return (0); - memcpy(&ipb.len, p, IPO_INT_LEN); - ipb.len = ntohl(ipb.len); - p += IPO_INT_LEN; - nlen += ipb.len; - if (len < nlen) - return (0); - ipb.str = p; - p += ipb.len; - break; - } - *skipp += nlen; - - switch (bp[0]) { - case IPO_ADDSTR: -#ifdef TR - trace("addnstr {%.*s}\n", (int)ipb.len, ipb.str); -#endif - (void)addnstr(ipb.str, ipb.len); - break; - case IPO_ATTRIBUTE: - switch (ipb.val1) { - case SA_ALTERNATE: -#ifdef TR - trace("attr: alternate\n"); -#endif - /* - * XXX - * Nothing. - */ - break; - case SA_INVERSE: -#ifdef TR - trace("attr: inverse\n"); -#endif - if (ipb.val2) - (void)standout(); - else - (void)standend(); - break; - default: - abort(); - /* NOTREACHED */ - } - break; - case IPO_BELL: -#ifdef TR - trace("bell\n"); -#endif - (void)write(1, "\007", 1); /* '\a' */ - break; - case IPO_BUSY: -#ifdef TR - trace("busy {%.*s}\n", (int)ipb.len, ipb.str); -#endif - /* - * XXX - * Nothing... - * ip_busy(ipb.str, ipb.len); - */ - break; - case IPO_CLRTOEOL: -#ifdef TR - trace("clrtoeol\n"); -#endif - clrtoeol(); - break; - case IPO_DELETELN: -#ifdef TR - trace("deleteln\n"); -#endif - deleteln(); - break; - case IPO_INSERTLN: -#ifdef TR - trace("insertln\n"); -#endif - insertln(); - break; - case IPO_MOVE: -#ifdef TR - trace("move: %lu %lu\n", (u_long)ipb.val1, (u_long)ipb.val2); -#endif - (void)move(ipb.val1, ipb.val2); - break; - case IPO_REDRAW: -#ifdef TR - trace("redraw\n"); -#endif - clearok(curscr, 1); - refresh(); - break; - case IPO_REFRESH: -#ifdef TR - trace("refresh\n"); -#endif - refresh(); - break; - case IPO_RENAME: -#ifdef TR - trace("rename {%.*s}\n", (int)ipb.len, ipb.str); -#endif - /* - * XXX - * Nothing... - * ip_rename(ipb.str, ipb.len); - */ - break; - case IPO_REWRITE: -#ifdef TR - trace("rewrite {%lu}\n", (u_long)ipb.val1); -#endif - getyx(stdscr, oldy, oldx); - for (lno = ipb.val1, cno = spcnt = 0;;) { - (void)move(lno, cno); - ch = winch(stdscr); - if (isblank(ch)) - ++spcnt; - else { - (void)move(lno, cno - spcnt); - for (; spcnt > 0; --spcnt) - (void)addch(' '); - (void)addch(ch); - } - if (++cno >= cols) - break; - } - (void)move(oldy, oldx); - break; - default: - /* - * XXX: Protocol is out of sync? - */ - abort(); - } - - return (1); -} - -/* - * arg_format - */ -void -arg_format(argcp, argvp, i_fd, o_fd) - int *argcp, i_fd, o_fd; - char **argvp[]; -{ - char **largv, *iarg, *p; - - /* Get space for the argument array and the -I argument. */ - if ((iarg = malloc(64)) == NULL || - (largv = malloc((*argcp + 3) * sizeof(char *))) == NULL) { - perror("ip_cl"); - exit (1); - } - memcpy(largv + 2, *argvp, *argcp * sizeof(char *) + 1); - - /* Reset argv[0] to be the exec'd program. */ - if ((p = strrchr(VI, '/')) == NULL) - largv[0] = VI; - else - largv[0] = p + 1; - - /* Create the -I argument. */ - (void)sprintf(iarg, "-I%d%s%d", i_fd, ".", o_fd); - largv[1] = iarg; - - /* Reset the argument array. */ - *argvp = largv; -} - -/* - * ip_cur_init -- - * Initialize the curses screen. - */ -void -ip_cur_init() -{ - /* - * XXX - * This is 4BSD curses' specific -- if this is to be a real program - * we'll have to do all the stuff that we do in the cl directory to - * run with different curses variants. - */ - if (initscr() == ERR) { - perror("ip_cl: initscr"); - exit (1); - } - noecho(); - nonl(); - raw(); - idlok(stdscr, 1); -} - -/* - * ip_cur_end -- - * End the curses screen. - */ -void -ip_cur_end() -{ - (void)move(0, 0); - (void)deleteln(); - (void)move(rows - 1, 0); - (void)refresh(); - (void)endwin(); -} - -/* - * ip_siginit -- - * Initialize the signals. - */ -void -ip_siginit() -{ - /* We need to know if vi dies horribly. */ - (void)signal(SIGCHLD, onchld); - - /* We want to allow interruption at least for now. */ - (void)signal(SIGINT, onintr); - -#ifdef SIGWINCH - /* We need to know if the screen is resized. */ - (void)signal(SIGWINCH, onwinch); -#endif -} - -/* - * ip_resize -- - * Send the window size. - */ -void -ip_resize() -{ - struct winsize win; - IP_BUF ipb; - - if (ioctl(STDERR_FILENO, TIOCGWINSZ, &win) == -1) { - perror("ip_cl: TIOCGWINSZ"); - exit(1); - } - - if (rows == win.ws_row && cols == win.ws_col) - return; - - ipb.val1 = rows = win.ws_row; - ipb.val2 = cols = win.ws_col; - ipb.code = IPO_RESIZE; - ip_send("12", &ipb); -} - -/* - * ip_send -- - * Construct and send an IP buffer. - */ -int -ip_send(fmt, ipbp) - char *fmt; - IP_BUF *ipbp; -{ - static char *bp; - static size_t blen; - size_t off; - u_int32_t ilen; - int nlen, n, nw; - char *p; - - if (blen == 0 && (bp = malloc(blen = 512)) == NULL) - nomem(); - - p = bp; - nlen = 0; - *p++ = ipbp->code; - nlen += IPO_CODE_LEN; - - if (fmt != NULL) - for (; *fmt != '\0'; ++fmt) - switch (*fmt) { - case '1': /* Value 1. */ - ilen = htonl(ipbp->val1); - goto value; - case '2': /* Value 2. */ - ilen = htonl(ipbp->val2); -value: nlen += IPO_INT_LEN; - if (nlen >= blen) { - blen = blen * 2 + nlen; - off = p - bp; - if ((bp = realloc(bp, blen)) == NULL) - nomem(); - p = bp + off; - } - memmove(p, &ilen, IPO_INT_LEN); - p += IPO_INT_LEN; - break; - case 's': /* String. */ - ilen = ipbp->len; /* XXX: conversion. */ - ilen = htonl(ilen); - nlen += IPO_INT_LEN + ipbp->len; - if (nlen >= blen) { - blen = blen * 2 + nlen; - off = p - bp; - if ((bp = realloc(bp, blen)) == NULL) - nomem(); - p = bp + off; - } - memmove(p, &ilen, IPO_INT_LEN); - p += IPO_INT_LEN; - memmove(p, ipbp->str, ipbp->len); - p += ipbp->len; - break; - } -#ifdef TR - trace("WROTE: "); - for (n = p - bp, p = bp; n > 0; --n, ++p) - if (isprint(*p)) - (void)trace("%c", *p); - else - trace("<%x>", (u_char)*p); - trace("\n"); -#endif - - for (n = p - bp, p = bp; n > 0; n -= nw, p += nw) - if ((nw = write(o_fd, p, n)) < 0) { - perror("ip_cl: write"); - exit(1); - } - - return (0); -} - -void -nomem() -{ - perror("ip_cl"); - exit (1); -} - -/* - * onchld -- - * Handle SIGCHLD. - */ -void -onchld(signo) - int signo; -{ - die = 1; - -#ifdef TR - trace("SIGCHLD\n"); -#endif - - /* Interrupt select if it's running. */ - (void)kill(getpid(), SIGINT); -} - -/* - * onintr -- - * Handle SIGINT. - */ -void -onintr(signo) - int signo; -{ - /* - * If we receive an interrupt, we may have sent it ourselves. - * If not, die from the signal. - */ - if (die) - return; - (void)signal(SIGINT, SIG_DFL); - kill(getpid(), SIGINT); -} - -/* - * onwinch -- - * Handle SIGWINCH. - */ -void -onwinch(signo) - int signo; -{ - resize = 1; -} - -void -attach() -{ - int fd; - char ch; - - (void)printf("process %lu waiting, enter to continue: ", - (u_long)getpid()); - (void)fflush(stdout); - - if ((fd = open(_PATH_TTY, O_RDONLY, 0)) < 0) { - perror(_PATH_TTY); - exit (1);; - } - do { - if (read(fd, &ch, 1) != 1) { - (void)close(fd); - return; - } - } while (ch != '\n' && ch != '\r'); - (void)close(fd); -} - -#ifdef TR -#ifdef __STDC__ -#include -#else -#include -#endif - -/* - * TR -- - * debugging trace routine. - */ -void -#ifdef __STDC__ -trace(const char *fmt, ...) -#else -trace(fmt, va_alist) - char *fmt; - va_dcl -#endif -{ - static FILE *tfp; - va_list ap; - - if (tfp == NULL && (tfp = fopen(TR, "w")) == NULL) - tfp = stderr; - -#ifdef __STDC__ - va_start(ap, fmt); -#else - va_start(ap); -#endif - (void)vfprintf(tfp, fmt, ap); - va_end(ap); - - (void)fflush(tfp); -} -#endif - -void -usage() -{ - (void)fprintf(stderr, "usage: ip_cl [-D]\n"); - exit(1); -} diff --git a/perl_api/VI.pod b/perl_api/VI.pod deleted file mode 100644 index a87e24d911d8..000000000000 --- a/perl_api/VI.pod +++ /dev/null @@ -1,218 +0,0 @@ -=head1 NAME - -VI - VI module within perl embedded nvi - -=head1 SYNOPSIS - - sub wc { - my $words; - $i = $VI::StartLine; - while ($i <= $VI::StopLine) { - $_ = VI::GetLine($VI::ScreenId, $i++); - $words+=split; - } - VI::Msg($VI::ScreenId,"$words words"); - } - -=head1 DESCRIPTION - -This pseudo module is available to perl programs run from within nvi and -provides access to the files being edited and some internal data. - -Beware that you should not use this module from within a C or -from within an C block or a C method. - -=head2 Variables - -These are set by nvi before starting each perl command. - -=over 8 - -=item * $ScreenId - -Screen id of the current screen. - -=item * $StartLine - -Line number of the first line of the selected range or of the file if no -range was specified. - -=item * $StopLine - -Line number of the last line of the selected range or of the file if no -range was specified. - -=back - -=head2 Functions - -=over 8 - -=item * AppendLine - - VI::AppendLine(screenId,lineNumber,text); - -Append the string text after the line in lineNumber. - -=item * DelLine - - VI::DelLine(screenId,lineNum); - -Delete lineNum. - -=item * EndScreen - -VI::EndScreen(screenId); - -End a screen. - -=item * FindScreen - - VI::FindScreen(file); - -Return the screen id associated with file name. - -=item * GetCursor - - ($line, $column) = VI::GetCursor(screenId); - -Return the current cursor position as a list with two elements. - -=item * GetLine - - VI::GetLine(screenId,lineNumber); - -Return lineNumber. - -=item * GetMark - - ($line, $column) = VI::GetMark(screenId,mark); - -Return the mark's cursor position as a list with two elements. - -=item * GetOpt - - VI::GetOpt(screenId,option); - -Return the value of an option. - -=item * InsertLine - - VI::InsertLine(screenId,lineNumber,text); - -Insert the string text before the line in lineNumber. - -=item * LastLine - - VI::LastLine(screenId); - -Return the last line in the screen. - -=item * MapKey - - VI::MapKey(screenId,key,perlproc); - -Associate a key with a perl procedure. - -=item * Msg - - VI::Msg(screenId,text); - -Set the message line to text. - -=item * NewScreen - - VI::NewScreen(screenId); - VI::NewScreen(screenId,file); - -Create a new screen. If a filename is specified then the screen is -opened with that file. - -=item * Run - - VI::Run(screenId,cmd); - -Run the ex command cmd. - -=item * SetCursor - - VI::SetCursor(screenId,line,column); - -Set the cursor to the line and column numbers supplied. - -=item * SetLine - - VI::SetLine(screenId,lineNumber,text); - -Set lineNumber to the text supplied. - -=item * SetMark - - VI::SetMark(screenId,mark,line,column); - -Set the mark to the line and column numbers supplied. - -=item * SetOpt - - VI::SetOpt(screenId,command); - -Set an option. - -=item * SwitchScreen - - VI::SwitchScreen(screenId,screenId); - -Change the current focus to screen. - -=item * UnmapKey - - VI::UnmmapKey(screenId,key); - -Unmap a key. - -=item * Warn - -This is the default warning handler. -It adds any warnings to the error string. - -=back - -=head1 EXAMPLES - - sub showmarks { - my ($mark, $all); - for $mark ('a' .. 'z') { - eval {VI::GetMark($VI::ScreenId, $mark)}; - $all .= $mark unless ($@); - } - VI::Msg($VI::ScreenId,"Set marks: $all"); - } - - sub forall { - my ($code) = shift; - my ($i) = $VI::StartLine-1; - while (++$i <= $VI::StopLine) { - $_ = VI::GetLine($VI::ScreenId, $i); - VI::SetLine($VI::ScreenId, $i, $_) if(&$code); - } - } - -Now you can do - - :perl forall sub{s/perlre/substitution/} - -Although you'll probably use - - :perldo s/perlre/substitution/ - -instead. - -See L for perl regular expressions. - -=head1 SEE ALSO - -L - -=head1 AUTHOR - -Sven Verdoolaege diff --git a/perl_api/nviperl.pod b/perl_api/nviperl.pod deleted file mode 100644 index 43850d8b6363..000000000000 --- a/perl_api/nviperl.pod +++ /dev/null @@ -1,43 +0,0 @@ -=head1 NAME - -nviperl - nvi with embedded perl - -=head1 SYNOPSIS - - :perl require 'wc.pl' - :perl wc - :,$perldo $_=reverse($_) - -=head1 DESCRIPTION - -nvi with embedded perl allows you to run perl commands from within nvi. -Two additional commands are made available when you enable the perl -interpreter: - -=over 8 - -=item * perl cmd - -The perl command passes the specified commands to the perl interpreter. -The C<$VI::ScreenId>, C<$VI::StartLine> and C<$VI::StopLine> are set. -To find out how to maniplulate the nvi screens, see L. - -=item * perldo cmd - -The perldo command runs the specified commands on each line of the range -(every line of the file if no range specified). Before running the -command the line is copied into $_. If the command returns a true value -the line is replaced by the new value of $_. - -The perldo commando does B set the C variables. (If you think -this is a bad idea, tell me.) - -=back - -=head1 SEE ALSO - -L - -=head1 AUTHOR - -Sven Verdoolaege diff --git a/perl_api/perl.xs b/perl_api/perl.xs deleted file mode 100644 index 0b48cded5bfc..000000000000 --- a/perl_api/perl.xs +++ /dev/null @@ -1,1115 +0,0 @@ -/*- - * Copyright (c) 1992, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * Copyright (c) 1992, 1993, 1994, 1995, 1996 - * Keith Bostic. All rights reserved. - * Copyright (c) 1995 - * George V. Neville-Neil. All rights reserved. - * Copyright (c) 1996 - * Sven Verdoolaege. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)perl.xs 8.27 (Berkeley) 10/16/96"; -#endif /* not lint */ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../common/common.h" - -#include -#include -#include - -#include "perl_extern.h" - -static void msghandler __P((SCR *, mtype_t, char *, size_t)); - -extern GS *__global_list; /* XXX */ - -static char *errmsg = 0; - -/* - * INITMESSAGE -- - * Macros to point messages at the Perl message handler. - */ -#define INITMESSAGE \ - scr_msg = __global_list->scr_msg; \ - __global_list->scr_msg = msghandler; -#define ENDMESSAGE \ - __global_list->scr_msg = scr_msg; \ - if (rval) croak(errmsg); - -static void xs_init __P((void)); - -/* - * perl_end -- - * Clean up perl interpreter - * - * PUBLIC: int perl_end __P((GS *)); - */ -int -perl_end(gp) - GS *gp; -{ - /* - * Call perl_run and perl_destuct to call END blocks and DESTROY - * methods. - */ - if (gp->perl_interp) { - /*Irestartop = 0; / * XXX */ - perl_run(gp->perl_interp); - perl_destruct(gp->perl_interp); -#if defined(DEBUG) || defined(PURIFY) || defined(LIBRARY) - perl_free(gp->perl_interp); -#endif - } -} - -/* - * perl_eval - * Evaluate a string - * We don't use mortal SVs because no one will clean up after us - */ -static void -perl_eval(string) - char *string; -{ -#ifdef HAVE_PERL_5_003_01 - SV* sv = newSVpv(string, 0); - - perl_eval_sv(sv, G_DISCARD | G_NOARGS); - SvREFCNT_dec(sv); -#else - char *argv[2]; - - argv[0] = string; - argv[1] = NULL; - perl_call_argv("_eval_", G_EVAL | G_DISCARD | G_KEEPERR, argv); -#endif -} - -/* - * perl_init -- - * Create the perl commands used by nvi. - * - * PUBLIC: int perl_init __P((SCR *)); - */ -int -perl_init(scrp) - SCR *scrp; -{ - AV * av; - GS *gp; - char *bootargs[] = { "VI", NULL }; -#ifndef USE_SFIO - SV *svcurscr; -#endif - -#ifndef HAVE_PERL_5_003_01 - static char *args[] = { "", "-e", "sub _eval_ { eval $_[0] }" }; -#else - static char *args[] = { "", "-e", "" }; -#endif - STRLEN length; - char *file = __FILE__; - - gp = scrp->gp; - gp->perl_interp = perl_alloc(); - perl_construct(gp->perl_interp); - if (perl_parse(gp->perl_interp, xs_init, 3, args, 0)) { - perl_destruct(gp->perl_interp); - perl_free(gp->perl_interp); - gp->perl_interp = NULL; - return 1; - } - perl_call_argv("VI::bootstrap", G_DISCARD, bootargs); - perl_eval("$SIG{__WARN__}='VI::Warn'"); - - av_unshift(av = GvAVn(incgv), 1); - av_store(av, 0, newSVpv(_PATH_PERLSCRIPTS, - sizeof(_PATH_PERLSCRIPTS)-1)); - -#ifdef USE_SFIO - sfdisc(PerlIO_stdout(), sfdcnewnvi(scrp)); - sfdisc(PerlIO_stderr(), sfdcnewnvi(scrp)); -#else - svcurscr = perl_get_sv("curscr", TRUE); - sv_magic((SV *)gv_fetchpv("STDOUT",TRUE, SVt_PVIO), svcurscr, - 'q', Nullch, 0); - sv_magic((SV *)gv_fetchpv("STDERR",TRUE, SVt_PVIO), svcurscr, - 'q', Nullch, 0); -#endif /* USE_SFIO */ - return (0); -} - -/* - * perl_screen_end - * Remove all refences to the screen to be destroyed - * - * PUBLIC: int perl_screen_end __P((SCR*)); - */ -int -perl_screen_end(scrp) - SCR *scrp; -{ - if (scrp->perl_private) { - sv_setiv((SV*) scrp->perl_private, 0); - } - return 0; -} - -static void -my_sighandler(i) - int i; -{ - croak("Perl command interrupted by SIGINT"); -} - -/* Create a new reference to an SV pointing to the SCR structure - * The perl_private part of the SCR structure points to the SV, - * so there can only be one such SV for a particular SCR structure. - * When the last reference has gone (DESTROY is called), - * perl_private is reset; When the screen goes away before - * all references are gone, the value of the SV is reset; - * any subsequent use of any of those reference will produce - * a warning. (see typemap) - */ -static SV * -newVIrv(rv, screen) - SV *rv; - SCR *screen; -{ - sv_upgrade(rv, SVt_RV); - if (!screen->perl_private) { - screen->perl_private = newSV(0); - sv_setiv(screen->perl_private, (IV) screen); - } - else SvREFCNT_inc(screen->perl_private); - SvRV(rv) = screen->perl_private; - SvROK_on(rv); - return sv_bless(rv, gv_stashpv("VI", TRUE)); -} - - -/* - * perl_ex_perl -- :[line [,line]] perl [command] - * Run a command through the perl interpreter. - * - * PUBLIC: int perl_ex_perl __P((SCR*, CHAR_T *, size_t, recno_t, recno_t)); - */ -int -perl_ex_perl(scrp, cmdp, cmdlen, f_lno, t_lno) - SCR *scrp; - CHAR_T *cmdp; - size_t cmdlen; - recno_t f_lno, t_lno; -{ - static SV *svcurscr = 0, *svstart, *svstop, *svid; - GS *gp; - STRLEN length; - size_t len; - char *err; - Signal_t (*istat)(); - - /* Initialize the interpreter. */ - gp = scrp->gp; - if (!svcurscr) { - if (gp->perl_interp == NULL && perl_init(scrp)) - return (1); - SvREADONLY_on(svcurscr = perl_get_sv("curscr", TRUE)); - SvREADONLY_on(svstart = perl_get_sv("VI::StartLine", TRUE)); - SvREADONLY_on(svstop = perl_get_sv("VI::StopLine", TRUE)); - SvREADONLY_on(svid = perl_get_sv("VI::ScreenId", TRUE)); - } - - sv_setiv(svstart, f_lno); - sv_setiv(svstop, t_lno); - newVIrv(svcurscr, scrp); - /* Backwards compatibility. */ - newVIrv(svid, scrp); - - istat = signal(SIGINT, my_sighandler); - perl_eval(cmdp); - signal(SIGINT, istat); - - SvREFCNT_dec(SvRV(svcurscr)); - SvROK_off(svcurscr); - SvREFCNT_dec(SvRV(svid)); - SvROK_off(svid); - - err = SvPV(GvSV(errgv), length); - if (!length) - return (0); - - err[length - 1] = '\0'; - msgq(scrp, M_ERR, "perl: %s", err); - return (1); -} - -/* - * replace_line - * replace a line with the contents of the perl variable $_ - * lines are split at '\n's - * if $_ is undef, the line is deleted - * returns possibly adjusted linenumber - */ -static int -replace_line(scrp, line, t_lno) - SCR *scrp; - recno_t line, *t_lno; -{ - char *str, *next; - size_t len; - - if (SvOK(GvSV(defgv))) { - str = SvPV(GvSV(defgv),len); - next = memchr(str, '\n', len); - api_sline(scrp, line, str, next ? (next - str) : len); - while (next++) { - len -= next - str; - next = memchr(str = next, '\n', len); - api_iline(scrp, ++line, str, next ? (next - str) : len); - (*t_lno)++; - } - } else { - api_dline(scrp, line--); - (*t_lno)--; - } - return line; -} - -/* - * perl_ex_perldo -- :[line [,line]] perl [command] - * Run a set of lines through the perl interpreter. - * - * PUBLIC: int perl_ex_perldo __P((SCR*, CHAR_T *, size_t, recno_t, recno_t)); - */ -int -perl_ex_perldo(scrp, cmdp, cmdlen, f_lno, t_lno) - SCR *scrp; - CHAR_T *cmdp; - size_t cmdlen; - recno_t f_lno, t_lno; -{ - static SV *svcurscr = 0, *svstart, *svstop, *svid; - CHAR_T *p; - GS *gp; - STRLEN length; - size_t len; - recno_t i; - char *str; -#ifndef HAVE_PERL_5_003_01 - char *argv[2]; -#else - SV* sv; -#endif - dSP; - - /* Initialize the interpreter. */ - gp = scrp->gp; - if (!svcurscr) { - if (gp->perl_interp == NULL && perl_init(scrp)) - return (1); - SPAGAIN; - SvREADONLY_on(svcurscr = perl_get_sv("curscr", TRUE)); - SvREADONLY_on(svstart = perl_get_sv("VI::StartLine", TRUE)); - SvREADONLY_on(svstop = perl_get_sv("VI::StopLine", TRUE)); - SvREADONLY_on(svid = perl_get_sv("VI::ScreenId", TRUE)); - } - -#ifndef HAVE_PERL_5_003_01 - argv[0] = cmdp; - argv[1] = NULL; -#else - length = strlen(cmdp); - sv = newSV(length + sizeof("sub VI::perldo {")-1 + 1 /* } */); - sv_setpvn(sv, "sub VI::perldo {", sizeof("sub VI::perldo {")-1); - sv_catpvn(sv, cmdp, length); - sv_catpvn(sv, "}", 1); - perl_eval_sv(sv, G_DISCARD | G_NOARGS); - SvREFCNT_dec(sv); - str = SvPV(GvSV(errgv),length); - if (length) - goto err; -#endif - - newVIrv(svcurscr, scrp); - /* Backwards compatibility. */ - newVIrv(svid, scrp); - - ENTER; - SAVETMPS; - for (i = f_lno; i <= t_lno && !api_gline(scrp, i, &str, &len); i++) { - sv_setpvn(GvSV(defgv),str,len); - sv_setiv(svstart, i); - sv_setiv(svstop, i); -#ifndef HAVE_PERL_5_003_01 - perl_call_argv("_eval_", G_SCALAR | G_EVAL | G_KEEPERR, argv); -#else - PUSHMARK(sp); - perl_call_pv("VI::perldo", G_SCALAR | G_EVAL); -#endif - str = SvPV(GvSV(errgv), length); - if (length) break; - SPAGAIN; - if(SvTRUEx(POPs)) - i = replace_line(scrp, i, &t_lno); - PUTBACK; - } - FREETMPS; - LEAVE; - - SvREFCNT_dec(SvRV(svcurscr)); - SvROK_off(svcurscr); - SvREFCNT_dec(SvRV(svid)); - SvROK_off(svid); - - if (!length) - return (0); - -err: str[length - 1] = '\0'; - msgq(scrp, M_ERR, "perl: %s", str); - return (1); -} - -/* - * msghandler -- - * Perl message routine so that error messages are processed in - * Perl, not in nvi. - */ -static void -msghandler(sp, mtype, msg, len) - SCR *sp; - mtype_t mtype; - char *msg; - size_t len; -{ - /* Replace the trailing with an EOS. */ - /* Let's do that later instead */ - if (errmsg) free (errmsg); - errmsg = malloc(len + 1); - memcpy(errmsg, msg, len); - errmsg[len] = '\0'; -} - -/* Register any extra external extensions */ - -extern void boot_DynaLoader _((CV* cv)); -extern void boot_VI _((CV* cv)); - -static void -xs_init() -{ -#ifdef HAVE_PERL_5_003_01 - dXSUB_SYS; -#endif - char *file = __FILE__; - - newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file); - newXS("VI::bootstrap", boot_VI, file); -} - -typedef SCR * VI; -typedef SCR * VI__OPT; -typedef SCR * VI__MAP; -typedef SCR * VI__MARK; -typedef AV * AVREF; - -MODULE = VI PACKAGE = VI - -# msg -- -# Set the message line to text. -# -# Perl Command: VI::Msg -# Usage: VI::Msg screenId text - -void -Msg(screen, text) - VI screen - char * text - - ALIAS: - PRINT = 1 - - CODE: - api_imessage(screen, text); - -# XS_VI_escreen -- -# End a screen. -# -# Perl Command: VI::EndScreen -# Usage: VI::EndScreen screenId - -void -EndScreen(screen) - VI screen - - PREINIT: - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - - CODE: - INITMESSAGE; - rval = api_escreen(screen); - ENDMESSAGE; - -# XS_VI_iscreen -- -# Create a new screen. If a filename is specified then the screen -# is opened with that file. -# -# Perl Command: VI::NewScreen -# Usage: VI::NewScreen screenId [file] - -VI -Edit(screen, ...) - VI screen - - ALIAS: - NewScreen = 1 - - PROTOTYPE: $;$ - PREINIT: - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - char *file; - SCR *nsp; - - CODE: - file = (items == 1) ? NULL : (char *)SvPV(ST(1),na); - INITMESSAGE; - rval = api_edit(screen, file, &nsp, ix); - ENDMESSAGE; - - RETVAL = ix ? nsp : screen; - - OUTPUT: - RETVAL - -# XS_VI_fscreen -- -# Return the screen id associated with file name. -# -# Perl Command: VI::FindScreen -# Usage: VI::FindScreen file - -VI -FindScreen(file) - char *file - - PREINIT: - SCR *fsp; - CODE: - RETVAL = api_fscreen(0, file); - -# XS_VI_aline -- -# -- Append the string text after the line in lineNumber. -# -# Perl Command: VI::AppendLine -# Usage: VI::AppendLine screenId lineNumber text - -void -AppendLine(screen, linenumber, text) - VI screen - int linenumber - char *text - - PREINIT: - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - STRLEN length; - - CODE: - SvPV(ST(2), length); - INITMESSAGE; - rval = api_aline(screen, linenumber, text, length); - ENDMESSAGE; - -# XS_VI_dline -- -# Delete lineNum. -# -# Perl Command: VI::DelLine -# Usage: VI::DelLine screenId lineNum - -void -DelLine(screen, linenumber) - VI screen - int linenumber - - PREINIT: - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - - CODE: - INITMESSAGE; - rval = api_dline(screen, (recno_t)linenumber); - ENDMESSAGE; - -# XS_VI_gline -- -# Return lineNumber. -# -# Perl Command: VI::GetLine -# Usage: VI::GetLine screenId lineNumber - -char * -GetLine(screen, linenumber) - VI screen - int linenumber - - PREINIT: - size_t len; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - char *line, *p; - - PPCODE: - INITMESSAGE; - rval = api_gline(screen, (recno_t)linenumber, &p, &len); - ENDMESSAGE; - - EXTEND(sp,1); - PUSHs(sv_2mortal(newSVpv(p, len))); - -# XS_VI_sline -- -# Set lineNumber to the text supplied. -# -# Perl Command: VI::SetLine -# Usage: VI::SetLine screenId lineNumber text - -void -SetLine(screen, linenumber, text) - VI screen - int linenumber - char *text - - PREINIT: - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - STRLEN length; - - CODE: - SvPV(ST(2), length); - INITMESSAGE; - rval = api_sline(screen, linenumber, text, length); - ENDMESSAGE; - -# XS_VI_iline -- -# Insert the string text before the line in lineNumber. -# -# Perl Command: VI::InsertLine -# Usage: VI::InsertLine screenId lineNumber text - -void -InsertLine(screen, linenumber, text) - VI screen - int linenumber - char *text - - PREINIT: - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - STRLEN length; - - CODE: - SvPV(ST(2), length); - INITMESSAGE; - rval = api_iline(screen, linenumber, text, length); - ENDMESSAGE; - -# XS_VI_lline -- -# Return the last line in the screen. -# -# Perl Command: VI::LastLine -# Usage: VI::LastLine screenId - -int -LastLine(screen) - VI screen - - PREINIT: - recno_t last; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - - CODE: - INITMESSAGE; - rval = api_lline(screen, &last); - ENDMESSAGE; - RETVAL=last; - - OUTPUT: - RETVAL - -# XS_VI_getmark -- -# Return the mark's cursor position as a list with two elements. -# {line, column}. -# -# Perl Command: VI::GetMark -# Usage: VI::GetMark screenId mark - -void -GetMark(screen, mark) - VI screen - char mark - - PREINIT: - struct _mark cursor; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - - PPCODE: - INITMESSAGE; - rval = api_getmark(screen, (int)mark, &cursor); - ENDMESSAGE; - - EXTEND(sp,2); - PUSHs(sv_2mortal(newSViv(cursor.lno))); - PUSHs(sv_2mortal(newSViv(cursor.cno))); - -# XS_VI_setmark -- -# Set the mark to the line and column numbers supplied. -# -# Perl Command: VI::SetMark -# Usage: VI::SetMark screenId mark line column - -void -SetMark(screen, mark, line, column) - VI screen - char mark - int line - int column - - PREINIT: - struct _mark cursor; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - - CODE: - INITMESSAGE; - cursor.lno = line; - cursor.cno = column; - rval = api_setmark(screen, (int)mark, &cursor); - ENDMESSAGE; - -# XS_VI_getcursor -- -# Return the current cursor position as a list with two elements. -# {line, column}. -# -# Perl Command: VI::GetCursor -# Usage: VI::GetCursor screenId - -void -GetCursor(screen) - VI screen - - PREINIT: - struct _mark cursor; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - - PPCODE: - INITMESSAGE; - rval = api_getcursor(screen, &cursor); - ENDMESSAGE; - - EXTEND(sp,2); - PUSHs(sv_2mortal(newSViv(cursor.lno))); - PUSHs(sv_2mortal(newSViv(cursor.cno))); - -# XS_VI_setcursor -- -# Set the cursor to the line and column numbers supplied. -# -# Perl Command: VI::SetCursor -# Usage: VI::SetCursor screenId line column - -void -SetCursor(screen, line, column) - VI screen - int line - int column - - PREINIT: - struct _mark cursor; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - - CODE: - INITMESSAGE; - cursor.lno = line; - cursor.cno = column; - rval = api_setcursor(screen, &cursor); - ENDMESSAGE; - -# XS_VI_swscreen -- -# Change the current focus to screen. -# -# Perl Command: VI::SwitchScreen -# Usage: VI::SwitchScreen screenId screenId - -void -SwitchScreen(screenFrom, screenTo) - VI screenFrom - VI screenTo - - PREINIT: - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - - CODE: - INITMESSAGE; - rval = api_swscreen(screenFrom, screenTo); - ENDMESSAGE; - -# XS_VI_map -- -# Associate a key with a perl procedure. -# -# Perl Command: VI::MapKey -# Usage: VI::MapKey screenId key perlproc - -void -MapKey(screen, key, perlproc) - VI screen - char *key - SV *perlproc - - PREINIT: - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - int length; - char *command; - SV *svc; - - CODE: - INITMESSAGE; - svc = sv_2mortal(newSVpv(":perl ", 6)); - sv_catsv(svc, perlproc); - command = SvPV(svc, length); - rval = api_map(screen, key, command, length); - ENDMESSAGE; - -# XS_VI_unmap -- -# Unmap a key. -# -# Perl Command: VI::UnmapKey -# Usage: VI::UnmmapKey screenId key - -void -UnmapKey(screen, key) - VI screen - char *key - - PREINIT: - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - - CODE: - INITMESSAGE; - rval = api_unmap(screen, key); - ENDMESSAGE; - -# XS_VI_opts_set -- -# Set an option. -# -# Perl Command: VI::SetOpt -# Usage: VI::SetOpt screenId setting - -void -SetOpt(screen, setting) - VI screen - char *setting - - PREINIT: - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - SV *svc; - - CODE: - INITMESSAGE; - svc = sv_2mortal(newSVpv(":set ", 5)); - sv_catpv(svc, setting); - rval = api_run_str(screen, SvPV(svc, na)); - ENDMESSAGE; - -# XS_VI_opts_get -- -# Return the value of an option. -# -# Perl Command: VI::GetOpt -# Usage: VI::GetOpt screenId option - -void -GetOpt(screen, option) - VI screen - char *option - - PREINIT: - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - char *value; - - PPCODE: - INITMESSAGE; - rval = api_opts_get(screen, option, &value, NULL); - ENDMESSAGE; - - EXTEND(SP,1); - PUSHs(sv_2mortal(newSVpv(value, 0))); - free(value); - -# XS_VI_run -- -# Run the ex command cmd. -# -# Perl Command: VI::Run -# Usage: VI::Run screenId cmd - -void -Run(screen, command) - VI screen - char *command; - - PREINIT: - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - - CODE: - INITMESSAGE; - rval = api_run_str(screen, command); - ENDMESSAGE; - -void -DESTROY(screen) - VI screen - - CODE: - screen->perl_private = 0; - -void -Warn(warning) - char *warning; - - PREINIT: - int i; - CODE: - sv_catpv(GvSV(errgv),warning); - -#define TIED(package) \ - sv_magic((SV *) (hv = \ - (HV *)sv_2mortal((SV *)newHV())), \ - sv_setref_pv(sv_newmortal(), package, \ - newVIrv(newSV(0), screen)),\ - 'P', Nullch, 0);\ - RETVAL = newRV((SV *)hv) - -SV * -Opt(screen) - VI screen; - PREINIT: - HV *hv; - CODE: - TIED("VI::OPT"); - OUTPUT: - RETVAL - -SV * -Map(screen) - VI screen; - PREINIT: - HV *hv; - CODE: - TIED("VI::MAP"); - OUTPUT: - RETVAL - -SV * -Mark(screen) - VI screen - PREINIT: - HV *hv; - CODE: - TIED("VI::MARK"); - OUTPUT: - RETVAL - -MODULE = VI PACKAGE = VI::OPT - -void -DESTROY(screen) - VI::OPT screen - - CODE: - # typemap did all the checking - SvREFCNT_dec((SV*)SvIV((SV*)SvRV(ST(0)))); - -void -FETCH(screen, key) - VI::OPT screen - char *key - - PREINIT: - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - char *value; - int boolvalue; - - PPCODE: - INITMESSAGE; - rval = api_opts_get(screen, key, &value, &boolvalue); - if (!rval) { - EXTEND(SP,1); - PUSHs(sv_2mortal((boolvalue == -1) ? newSVpv(value, 0) - : newSViv(boolvalue))); - free(value); - } else ST(0) = &sv_undef; - rval = 0; - ENDMESSAGE; - -void -STORE(screen, key, value) - VI::OPT screen - char *key - SV *value - - PREINIT: - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - - CODE: - INITMESSAGE; - rval = api_opts_set(screen, key, SvPV(value, na), SvIV(value), - SvTRUEx(value)); - ENDMESSAGE; - -MODULE = VI PACKAGE = VI::MAP - -void -DESTROY(screen) - VI::MAP screen - - CODE: - # typemap did all the checking - SvREFCNT_dec((SV*)SvIV((SV*)SvRV(ST(0)))); - -void -STORE(screen, key, perlproc) - VI::MAP screen - char *key - SV *perlproc - - PREINIT: - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - int length; - char *command; - SV *svc; - - CODE: - INITMESSAGE; - svc = sv_2mortal(newSVpv(":perl ", 6)); - sv_catsv(svc, perlproc); - command = SvPV(svc, length); - rval = api_map(screen, key, command, length); - ENDMESSAGE; - -void -DELETE(screen, key) - VI::MAP screen - char *key - - PREINIT: - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - - CODE: - INITMESSAGE; - rval = api_unmap(screen, key); - ENDMESSAGE; - -MODULE = VI PACKAGE = VI::MARK - -void -DESTROY(screen) - VI::MARK screen - - CODE: - # typemap did all the checking - SvREFCNT_dec((SV*)SvIV((SV*)SvRV(ST(0)))); - -AV * -FETCH(screen, mark) - VI::MARK screen - char mark - - PREINIT: - struct _mark cursor; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - - CODE: - INITMESSAGE; - rval = api_getmark(screen, (int)mark, &cursor); - ENDMESSAGE; - RETVAL = newAV(); - av_push(RETVAL, newSViv(cursor.lno)); - av_push(RETVAL, newSViv(cursor.cno)); - - OUTPUT: - RETVAL - -void -STORE(screen, mark, pos) - VI::MARK screen - char mark - AVREF pos - - PREINIT: - struct _mark cursor; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - - CODE: - if (av_len(pos) < 1) - croak("cursor position needs 2 elements"); - INITMESSAGE; - cursor.lno = SvIV(*av_fetch(pos, 0, 0)); - cursor.cno = SvIV(*av_fetch(pos, 1, 0)); - rval = api_setmark(screen, (int)mark, &cursor); - ENDMESSAGE; - -void -FIRSTKEY(screen, ...) - VI::MARK screen - - ALIAS: - NEXTKEY = 1 - - PROTOTYPE: $;$ - - PREINIT: - struct _mark cursor; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int next; - char key[] = {0, 0}; - - PPCODE: - if (items == 2) { - next = 1; - *key = *(char *)SvPV(ST(1),na); - } else next = 0; - if (api_nextmark(screen, next, key) != 1) { - EXTEND(sp, 1); - PUSHs(sv_2mortal(newSVpv(key, 1))); - } else ST(0) = &sv_undef; diff --git a/perl_api/perlsfio.c b/perl_api/perlsfio.c deleted file mode 100644 index 20ff4773495a..000000000000 --- a/perl_api/perlsfio.c +++ /dev/null @@ -1,85 +0,0 @@ -/*- - * Copyright (c) 1996 - * Keith Bostic. All rights reserved. - * Copyright (c) 1996 - * Sven Verdoolaege. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)perlsfio.c 8.1 (Berkeley) 9/24/96"; -#endif /* not lint */ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../common/common.h" - -#include -#include -#include - -#include "perl_extern.h" - -/* - * PUBLIC: #ifdef USE_SFIO - */ -#ifdef USE_SFIO - -#define NIL(type) ((type)0) - -static int -sfnviwrite(f, buf, n, disc) -Sfio_t* f; /* stream involved */ -char* buf; /* buffer to read into */ -int n; /* number of bytes to read */ -Sfdisc_t* disc; /* discipline */ -{ - SCR *scrp; - - scrp = (SCR *)SvIV((SV*)SvRV(perl_get_sv("curscr", FALSE))); - msgq(scrp, M_INFO, "%.*s", n, buf); - return n; -} - -/* - * sfdcnewnvi -- - * Create nvi discipline - * - * PUBLIC: Sfdisc_t* sfdcnewnvi __P((SCR*)); - */ - -Sfdisc_t * -sfdcnewnvi(scrp) - SCR *scrp; -{ - Sfdisc_t* disc; - - MALLOC(scrp, disc, Sfdisc_t*, sizeof(Sfdisc_t)); - if (!disc) return disc; - - disc->readf = (Sfread_f)NULL; - disc->writef = sfnviwrite; - disc->seekf = (Sfseek_f)NULL; - disc->exceptf = (Sfexcept_f)NULL; - return disc; -} - -/* - * PUBLIC: #endif - */ -#endif /* USE_SFIO */ diff --git a/perl_api/typemap b/perl_api/typemap deleted file mode 100644 index 0e38a9c07bc7..000000000000 --- a/perl_api/typemap +++ /dev/null @@ -1,42 +0,0 @@ -TYPEMAP -# Grr can't let it end in OBJ 'cause xsubpp would -# s/OBJ$/REF/ that for the DESTROY function -VI T_VIOBJNOMUNGE -VI::OPT T_VIOBJREF -VI::MAP T_VIOBJREF -VI::MARK T_VIOBJREF -AVREF T_AVREFREF - -INPUT -T_AVREFREF - if (SvROK($arg) && SvTYPE(SvRV($arg)) == SVt_PVAV) - $var = (AV *)SvRV($arg); - else - croak(\"$var is not a reference to an array\") -T_VIOBJNOMUNGE - if (sv_isa($arg, \"VI\")) { - IV tmp = SvIV((SV*)SvRV($arg)); - $var = ($type) tmp; - if (!tmp) - croak(\"screen no longer exists\"); - } - else - croak(\"$var is not of type ${ntype}\") -T_VIOBJREF - if (sv_isa($arg, \"${ntype}\")) { - IV tmp = SvIV((SV*)SvRV($arg)); - if (sv_isa((SV *)tmp, \"VI\")) { - IV tmp2 = SvIV((SV*)SvRV((SV *)tmp)); - $var = ($type) tmp2; - if (!tmp2) - croak(\"screen no longer exists\"); - } - else - croak(\"$var is not of type ${ntype}\"); - } - else - croak(\"$var is not of type ${ntype}\") - -OUTPUT -T_VIOBJNOMUNGE - newVIrv($arg, $var); diff --git a/perl_scripts/forall.pl b/perl_scripts/forall.pl deleted file mode 100644 index b9f85013b17d..000000000000 --- a/perl_scripts/forall.pl +++ /dev/null @@ -1,10 +0,0 @@ -sub forall { - my ($code) = shift; - my ($i) = $VI::StartLine-1; - while (++$i <= $VI::StopLine) { - $_ = $curscr->GetLine($i); - VI::SetLine($VI::ScreenId, $i, $_) if(&$code); - } -} - -1; diff --git a/perl_scripts/make.pl b/perl_scripts/make.pl deleted file mode 100644 index 118dd99a424c..000000000000 --- a/perl_scripts/make.pl +++ /dev/null @@ -1,27 +0,0 @@ -sub make { - open MAKE, "make 2>&1 1>/dev/null |"; - while() { - if (($file, $line, $msg) = /([^: ]*):(\d*):(.+)/) { - if ($file == $prevfile && $line == $prevline) { - $error[-1]->[2] .= "\n$msg"; - } else { - push @error, [$file, $line, $msg]; - ($prevline, $prevfile) = ($line, $file); - } - } - } - close MAKE; -} - -sub nexterror { - if ($index <= $#error) { - my $error = $error[$index++]; - $curscr->Edit($error->[0]); - $curscr->SetCursor($error->[1],0); - $curscr->Msg($error->[2]); - } -} - -# preverror is left as an exercise - -1; diff --git a/perl_scripts/tk.pl b/perl_scripts/tk.pl deleted file mode 100644 index f8d1bc068df3..000000000000 --- a/perl_scripts/tk.pl +++ /dev/null @@ -1,20 +0,0 @@ -# make sure every subprocess has it's exit and that the main one -# hasn't -sub fun { - unless ($pid = fork) { - unless (fork) { - use Tk; - $MW = MainWindow->new; - $hello = $MW->Button( - -text => 'Hello, world', - -command => sub {exit;}, - ); - $hello->pack; - MainLoop; - } - exit 0; - } - waitpid($pid, 0); -} - -1; diff --git a/perl_scripts/wc.pl b/perl_scripts/wc.pl deleted file mode 100644 index 0a5015987d10..000000000000 --- a/perl_scripts/wc.pl +++ /dev/null @@ -1,11 +0,0 @@ -sub wc { - my $words; - $i = $VI::StartLine; - while ($i <= $VI::StopLine) { - $_ = $curscr->GetLine($i++); - $words+=split; - } - $curscr->Msg("$words words"); -} - -1; diff --git a/clib/strpbrk.c b/regex/COPYRIGHT similarity index 62% rename from clib/strpbrk.c rename to regex/COPYRIGHT index 22abbb0da4b5..574f6bcec6c7 100644 --- a/clib/strpbrk.c +++ b/regex/COPYRIGHT @@ -1,5 +1,27 @@ -/* - * Copyright (c) 1985, 1993 +Copyright 1992, 1993, 1994 Henry Spencer. All rights reserved. +This software is not subject to any license of the American Telephone +and Telegraph Company or of the Regents of the University of California. + +Permission is granted to anyone to use this software for any purpose on +any computer system, and to alter it and redistribute it, subject +to the following restrictions: + +1. The author is not responsible for the consequences of use of this + software, no matter how awful, even if they arise from flaws in it. + +2. The origin of this software must not be misrepresented, either by + explicit claim or by omission. Since few users ever read sources, + credits must appear in the documentation. + +3. Altered versions must be plainly marked as such, and must not be + misrepresented as being the original software. Since few users + ever read sources, credits must appear in the documentation. + +4. This notice may not be removed or altered. + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +/*- + * Copyright (c) 1994 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,34 +51,6 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - */ - -#include "config.h" - -#if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)strpbrk.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -#include - -/* - * Find the first occurrence in s1 of a character in s2 (excluding NUL). * - * PUBLIC: #ifndef HAVE_STRPBRK - * PUBLIC: char *strpbrk __P((const char *, const char *)); - * PUBLIC: #endif + * @(#)COPYRIGHT 8.1 (Berkeley) 3/16/94 */ -char * -strpbrk(s1, s2) - register const char *s1, *s2; -{ - register const char *scanp; - register int c, sc; - - while ((c = *s1++) != 0) { - for (scanp = s2; (sc = *scanp++) != 0;) - if (sc == c) - return ((char *)(s1 - 1)); - } - return (NULL); -} diff --git a/regex/WHATSNEW b/regex/WHATSNEW new file mode 100644 index 000000000000..f4301d300dd3 --- /dev/null +++ b/regex/WHATSNEW @@ -0,0 +1,94 @@ +# @(#)WHATSNEW 8.3 (Berkeley) 3/18/94 + +New in alpha3.4: The complex bug alluded to below has been fixed (in a +slightly kludgey temporary way that may hurt efficiency a bit; this is +another "get it out the door for 4.4" release). The tests at the end of +the tests file have accordingly been uncommented. The primary sign of +the bug was that something like a?b matching ab matched b rather than ab. +(The bug was essentially specific to this exact situation, else it would +have shown up earlier.) + +New in alpha3.3: The definition of word boundaries has been altered +slightly, to more closely match the usual programming notion that "_" +is an alphabetic. Stuff used for pre-ANSI systems is now in a subdir, +and the makefile no longer alludes to it in mysterious ways. The +makefile has generally been cleaned up some. Fixes have been made +(again!) so that the regression test will run without -DREDEBUG, at +the cost of weaker checking. A workaround for a bug in some folks' + has been added. And some more things have been added to +tests, including a couple right at the end which are commented out +because the code currently flunks them (complex bug; fix coming). +Plus the usual minor cleanup. + +New in alpha3.2: Assorted bits of cleanup and portability improvement +(the development base is now a BSDI system using GCC instead of an ancient +Sun system, and the newer compiler exposed some glitches). Fix for a +serious bug that affected REs using many [] (including REG_ICASE REs +because of the way they are implemented), *sometimes*, depending on +memory-allocation patterns. The header-file prototypes no longer name +the parameters, avoiding possible name conflicts. The possibility that +some clot has defined CHAR_MIN as (say) `-128' instead of `(-128)' is +now handled gracefully. "uchar" is no longer used as an internal type +name (too many people have the same idea). Still the same old lousy +performance, alas. + +New in alpha3.1: Basically nothing, this release is just a bookkeeping +convenience. Stay tuned. + +New in alpha3.0: Performance is no better, alas, but some fixes have been +made and some functionality has been added. (This is basically the "get +it out the door in time for 4.4" release.) One bug fix: regfree() didn't +free the main internal structure (how embarrassing). It is now possible +to put NULs in either the RE or the target string, using (resp.) a new +REG_PEND flag and the old REG_STARTEND flag. The REG_NOSPEC flag to +regcomp() makes all characters ordinary, so you can match a literal +string easily (this will become more useful when performance improves!). +There are now primitives to match beginnings and ends of words, although +the syntax is disgusting and so is the implementation. The REG_ATOI +debugging interface has changed a bit. And there has been considerable +internal cleanup of various kinds. + +New in alpha2.3: Split change list out of README, and moved flags notes +into Makefile. Macro-ized the name of regex(7) in regex(3), since it has +to change for 4.4BSD. Cleanup work in engine.c, and some new regression +tests to catch tricky cases thereof. + +New in alpha2.2: Out-of-date manpages updated. Regerror() acquires two +small extensions -- REG_ITOA and REG_ATOI -- which avoid debugging kludges +in my own test program and might be useful to others for similar purposes. +The regression test will now compile (and run) without REDEBUG. The +BRE \$ bug is fixed. Most uses of "uchar" are gone; it's all chars now. +Char/uchar parameters are now written int/unsigned, to avoid possible +portability problems with unpromoted parameters. Some unsigned casts have +been introduced to minimize portability problems with shifting into sign +bits. + +New in alpha2.1: Lots of little stuff, cleanup and fixes. The one big +thing is that regex.h is now generated, using mkh, rather than being +supplied in the distribution; due to circularities in dependencies, +you have to build regex.h explicitly by "make h". The two known bugs +have been fixed (and the regression test now checks for them), as has a +problem with assertions not being suppressed in the absence of REDEBUG. +No performance work yet. + +New in alpha2: Backslash-anything is an ordinary character, not an +error (except, of course, for the handful of backslashed metacharacters +in BREs), which should reduce script breakage. The regression test +checks *where* null strings are supposed to match, and has generally +been tightened up somewhat. Small bug fixes in parameter passing (not +harmful, but technically errors) and some other areas. Debugging +invoked by defining REDEBUG rather than not defining NDEBUG. + +New in alpha+3: full prototyping for internal routines, using a little +helper program, mkh, which extracts prototypes given in stylized comments. +More minor cleanup. Buglet fix: it's CHAR_BIT, not CHAR_BITS. Simple +pre-screening of input when a literal string is known to be part of the +RE; this does wonders for performance. + +New in alpha+2: minor bits of cleanup. Notably, the number "32" for the +word width isn't hardwired into regexec.c any more, the public header +file prototypes the functions if __STDC__ is defined, and some small typos +in the manpages have been fixed. + +New in alpha+1: improvements to the manual pages, and an important +extension, the REG_STARTEND option to regexec(). diff --git a/clib/bsearch.c b/regex/cclass.h similarity index 50% rename from clib/bsearch.c rename to regex/cclass.h index 6b41ab5fcef8..f28bccdfafcc 100644 --- a/clib/bsearch.c +++ b/regex/cclass.h @@ -1,7 +1,13 @@ -/* - * Copyright (c) 1990, 1993 +/* $NetBSD: cclass.h,v 1.2 2008/12/05 22:51:42 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993, 1994 Henry Spencer. + * Copyright (c) 1992, 1993, 1994 * The Regents of the University of California. All rights reserved. * + * This code is derived from software contributed to Berkeley by + * Henry Spencer of the University of Toronto. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -29,62 +35,51 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * @(#)cclass.h 8.2 (Berkeley) 3/16/94 */ -#include "config.h" +RCHAR_T ALNUM[] = {'a','l','n','u','m',0}; +RCHAR_T ALPHA[] = {'a','l','p','h','a',0}; +RCHAR_T BLANK[] = {'b','l','a','n','k',0}; +RCHAR_T CNTRL[] = {'c','n','t','r','l',0}; +RCHAR_T DIGIT[] = {'d','i','g','i','t',0}; +RCHAR_T GRAPH[] = {'g','r','a','p','h',0}; +RCHAR_T LOWER[] = {'l','o','w','e','r',0}; +RCHAR_T PRINT[] = {'p','r','i','n','t',0}; +RCHAR_T PUNCT[] = {'p','u','n','c','t',0}; +RCHAR_T SPACE[] = {'s','p','a','c','e',0}; +RCHAR_T UPPER[] = {'u','p','p','e','r',0}; +RCHAR_T XDIGIT[] = {'x','d','i','g','i','t',0}; -#if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)bsearch.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ - -#include -#include - -#include "port.h" - -/* - * Perform a binary search. - * - * The code below is a bit sneaky. After a comparison fails, we - * divide the work in half by moving either left or right. If lim - * is odd, moving left simply involves halving lim: e.g., when lim - * is 5 we look at item 2, so we change lim to 2 so that we will - * look at items 0 & 1. If lim is even, the same applies. If lim - * is odd, moving right again involes halving lim, this time moving - * the base up one item past p: e.g., when lim is 5 we change base - * to item 3 and make lim 2 so that we will look at items 3 and 4. - * If lim is even, however, we have to shrink it by one before - * halving: e.g., when lim is 4, we still looked at item 2, so we - * have to make lim 3, then halve, obtaining 1, so that we will only - * look at item 3. - * - * PUBLIC: #ifndef HAVE_BSEARCH - * PUBLIC: void *bsearch __P((const void *, const void *, size_t, - * PUBLIC: size_t, int (*)(const void *, const void *))); - * PUBLIC: #endif - */ -void * -bsearch(key, base0, nmemb, size, compar) - register const void *key; - const void *base0; - size_t nmemb; - register size_t size; - register int (*compar) __P((const void *, const void *)); -{ - register const char *base = base0; - register size_t lim; - register int cmp; - register const void *p; - - for (lim = nmemb; lim != 0; lim >>= 1) { - p = base + (lim >> 1) * size; - cmp = (*compar)(key, p); - if (cmp == 0) - return ((void *)p); - if (cmp > 0) { /* key > p: move right */ - base = (char *)p + size; - lim--; - } /* else move left */ - } - return (NULL); -} +/* character-class table */ +static struct cclass { + RCHAR_T *name; + const char *chars; + const char *multis; +} cclasses[] = { + { ALNUM, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\ +0123456789", "" }, + { ALPHA, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", + "" }, + { BLANK, " \t", "" }, + { CNTRL, "\007\b\t\n\v\f\r\1\2\3\4\5\6\16\17\20\21\22\23\24\ +\25\26\27\30\31\32\33\34\35\36\37\177", "" }, + { DIGIT, "0123456789", "" }, + { GRAPH, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\ +0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", + "" }, + { LOWER, "abcdefghijklmnopqrstuvwxyz", + "" }, + { PRINT, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\ +0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ", + "" }, + { PUNCT, "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", + "" }, + { SPACE, "\t\n\v\f\r ", "" }, + { UPPER, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", + "" }, + { XDIGIT, "0123456789ABCDEFabcdef", + "" }, + { NULL, 0, "" }, +}; diff --git a/regex/cname.h b/regex/cname.h new file mode 100644 index 000000000000..da69843df9de --- /dev/null +++ b/regex/cname.h @@ -0,0 +1,143 @@ +/* $NetBSD: cname.h,v 1.2 2008/12/05 22:51:42 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993, 1994 Henry Spencer. + * Copyright (c) 1992, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Henry Spencer of the University of Toronto. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)cname.h 8.2 (Berkeley) 3/16/94 + */ + +/* character-name table */ +static struct cname { + const RCHAR_T *name; + char code; +} cnames[] = { + { L("NUL"), '\0' }, + { L("SOH"), '\001' }, + { L("STX"), '\002' }, + { L("ETX"), '\003' }, + { L("EOT"), '\004' }, + { L("ENQ"), '\005' }, + { L("ACK"), '\006' }, + { L("BEL"), '\007' }, + { L("alert"), '\007' }, + { L("BS"), '\010' }, + { L("backspace"), '\b' }, + { L("HT"), '\011' }, + { L("tab"), '\t' }, + { L("LF"), '\012' }, + { L("newline"), '\n' }, + { L("VT"), '\013' }, + { L("vertical-tab"), '\v' }, + { L("FF"), '\014' }, + { L("form-feed"), '\f' }, + { L("CR"), '\015' }, + { L("carriage-return"), '\r' }, + { L("SO"), '\016' }, + { L("SI"), '\017' }, + { L("DLE"), '\020' }, + { L("DC1"), '\021' }, + { L("DC2"), '\022' }, + { L("DC3"), '\023' }, + { L("DC4"), '\024' }, + { L("NAK"), '\025' }, + { L("SYN"), '\026' }, + { L("ETB"), '\027' }, + { L("CAN"), '\030' }, + { L("EM"), '\031' }, + { L("SUB"), '\032' }, + { L("ESC"), '\033' }, + { L("IS4"), '\034' }, + { L("FS"), '\034' }, + { L("IS3"), '\035' }, + { L("GS"), '\035' }, + { L("IS2"), '\036' }, + { L("RS"), '\036' }, + { L("IS1"), '\037' }, + { L("US"), '\037' }, + { L("space"), ' ' }, + { L("exclamation-mark"),'!' }, + { L("quotation-mark"), '"' }, + { L("number-sign"), '#' }, + { L("dollar-sign"), '$' }, + { L("percent-sign"), '%' }, + { L("ampersand"), '&' }, + { L("apostrophe"), '\'' }, + { L("left-parenthesis"),'(' }, + { L("right-parenthesis"),')' }, + { L("asterisk"), '*' }, + { L("plus-sign"), '+' }, + { L("comma"), ',' }, + { L("hyphen"), '-' }, + { L("hyphen-minus"), '-' }, + { L("period"), '.' }, + { L("full-stop"), '.' }, + { L("slash"), '/' }, + { L("solidus"), '/' }, + { L("zero"), '0' }, + { L("one"), '1' }, + { L("two"), '2' }, + { L("three"), '3' }, + { L("four"), '4' }, + { L("five"), '5' }, + { L("six"), '6' }, + { L("seven"), '7' }, + { L("eight"), '8' }, + { L("nine"), '9' }, + { L("colon"), ':' }, + { L("semicolon"), ';' }, + { L("less-than-sign"), '<' }, + { L("equals-sign"), '=' }, + { L("greater-than-sign"),'>' }, + { L("question-mark"), '?' }, + { L("commercial-at"), '@' }, + { L("left-square-bracket"),'[' }, + { L("backslash"), '\\' }, + { L("reverse-solidus"), '\\' }, + { L("right-square-bracket"),']' }, + { L("circumflex"), '^' }, + { L("circumflex-accent"),'^' }, + { L("underscore"), '_' }, + { L("low-line"), '_' }, + { L("grave-accent"), '`' }, + { L("left-brace"), '{' }, + { L("left-curly-bracket"),'{' }, + { L("vertical-line"), '|' }, + { L("right-brace"), '}' }, + { L("right-curly-bracket"),'}' }, + { L("tilde"), '~' }, + { L("DEL"), '\177' }, + { NULL, 0 }, +}; diff --git a/regex/engine.c b/regex/engine.c new file mode 100644 index 000000000000..ad1c501067e3 --- /dev/null +++ b/regex/engine.c @@ -0,0 +1,1102 @@ +/* $NetBSD: engine.c,v 1.7 2011/11/19 17:45:11 tnozaki Exp $ */ + +/*- + * Copyright (c) 1992, 1993, 1994 Henry Spencer. + * Copyright (c) 1992, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Henry Spencer of the University of Toronto. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)engine.c 8.4 (Berkeley) 3/19/94 + */ + +/* + * The matching engine and friends. This file is #included by regexec.c + * after suitable #defines of a variety of macros used herein, so that + * different state representations can be used without duplicating masses + * of code. + */ + +#ifdef SNAMES +#define matcher smatcher +#define fast sfast +#define slow sslow +#define dissect sdissect +#define backref sbackref +#define step sstep +#define print sprint +#define at sat +#define match smat +#endif +#ifdef LNAMES +#define matcher lmatcher +#define fast lfast +#define slow lslow +#define dissect ldissect +#define backref lbackref +#define step lstep +#define print lprint +#define at lat +#define match lmat +#endif + +/* another structure passed up and down to avoid zillions of parameters */ +struct match { + struct re_guts *g; + int eflags; + regmatch_t *pmatch; /* [nsub+1] (0 element unused) */ + const RCHAR_T *offp; /* offsets work from here */ + const RCHAR_T *beginp; /* start of string -- virtual NUL precedes */ + const RCHAR_T *endp; /* end of string -- virtual NUL here */ + const RCHAR_T *coldp; /* can be no match starting before here */ + const RCHAR_T **lastpos; /* [nplus+1] */ + STATEVARS; + states st; /* current states */ + states fresh; /* states for a fresh start */ + states tmp; /* temporary */ + states empty; /* empty set of states */ +}; + +/* ========= begin header generated by ./mkh ========= */ +#ifdef __cplusplus +extern "C" { +#endif + +/* === engine.c === */ +static int matcher __P((struct re_guts *g, const RCHAR_T *string, size_t nmatch, regmatch_t pmatch[], int eflags)); +static const RCHAR_T *dissect __P((struct match *m, const RCHAR_T *start, const RCHAR_T *stop, sopno startst, sopno stopst)); +static const RCHAR_T *backref __P((struct match *m, const RCHAR_T *start, const RCHAR_T *stop, sopno startst, sopno stopst, sopno lev)); +static const RCHAR_T *fast __P((struct match *m, const RCHAR_T *start, const RCHAR_T *stop, sopno startst, sopno stopst)); +static const RCHAR_T *slow __P((struct match *m, const RCHAR_T *start, const RCHAR_T *stop, sopno startst, sopno stopst)); +static states step __P((struct re_guts *g, sopno start, sopno stop, states bef, int flag, RCHAR_T ch, states aft)); +#define BOL (1) +#define EOL (BOL+1) +#define BOLEOL (BOL+2) +#define NOTHING (BOL+3) +#define BOW (BOL+4) +#define EOW (BOL+5) +#ifdef REDEBUG +static void print __P((struct match *m, char *caption, states st, int ch, FILE *d)); +#endif +#ifdef REDEBUG +static void at __P((struct match *m, char *title, char *start, char *stop, sopno startst, sopno stopst)); +#endif +#ifdef REDEBUG +static char *pchar __P((int ch)); +#endif + +#ifdef __cplusplus +} +#endif +/* ========= end header generated by ./mkh ========= */ + +#ifdef REDEBUG +#define SP(t, s, c) print(m, t, s, c, stdout) +#define AT(t, p1, p2, s1, s2) at(m, t, p1, p2, s1, s2) +#define NOTE(str) { if (m->eflags®_TRACE) printf("=%s\n", (str)); } +#else +#define SP(t, s, c) /* nothing */ +#define AT(t, p1, p2, s1, s2) /* nothing */ +#define NOTE(s) /* nothing */ +#endif + +/* + - matcher - the actual matching engine + == static int matcher(register struct re_guts *g, const RCHAR_T *string, \ + == size_t nmatch, regmatch_t pmatch[], int eflags); + */ +static int /* 0 success, REG_NOMATCH failure */ +matcher(g, string, nmatch, pmatch, eflags) +register struct re_guts *g; +const RCHAR_T *string; +size_t nmatch; +regmatch_t pmatch[]; +int eflags; +{ + register const RCHAR_T *endp; + register size_t i; + struct match mv; + register struct match *m = &mv; + register const RCHAR_T *dp; + register const sopno gf = g->firststate+1; /* +1 for OEND */ + register const sopno gl = g->laststate; + const RCHAR_T *start; + const RCHAR_T *stop; + + /* simplify the situation where possible */ + if (g->cflags®_NOSUB) + nmatch = 0; + if (eflags®_STARTEND) { + start = string + pmatch[0].rm_so; + stop = string + pmatch[0].rm_eo; + } else { + start = string; + stop = start + STRLEN(start); + } + if (stop < start) + return(REG_INVARG); + + /* prescreening; this does wonders for this rather slow code */ + if (g->must != NULL) { + for (dp = start; dp < stop; dp++) + if (*dp == g->must[0] && (size_t)(stop - dp) >= g->mlen && + MEMCMP(dp, g->must, g->mlen) == 0) + break; + if (dp == stop) /* we didn't find g->must */ + return(REG_NOMATCH); + } + + /* match struct setup */ + m->g = g; + m->eflags = eflags; + m->pmatch = NULL; + m->lastpos = NULL; + m->offp = string; + m->beginp = start; + m->endp = stop; + STATESETUP(m, 4); + SETUP(m->st); + SETUP(m->fresh); + SETUP(m->tmp); + SETUP(m->empty); + CLEAR(m->empty); + + /* this loop does only one repetition except for backrefs */ + for (;;) { + endp = fast(m, start, stop, gf, gl); + if (endp == NULL) { /* a miss */ + STATETEARDOWN(m); + return(REG_NOMATCH); + } + if (nmatch == 0 && !g->backrefs) + break; /* no further info needed */ + + /* where? */ + assert(m->coldp != NULL); + for (;;) { + NOTE("finding start"); + endp = slow(m, m->coldp, stop, gf, gl); + if (endp != NULL) + break; + assert(m->coldp < m->endp); + m->coldp++; + } + if (nmatch == 1 && !g->backrefs) + break; /* no further info needed */ + + /* oh my, he wants the subexpressions... */ + if (m->pmatch == NULL) + m->pmatch = (regmatch_t *)malloc((m->g->nsub + 1) * + sizeof(regmatch_t)); + if (m->pmatch == NULL) { + STATETEARDOWN(m); + return(REG_ESPACE); + } + for (i = 1; i <= m->g->nsub; i++) + m->pmatch[i].rm_so = m->pmatch[i].rm_eo = -1; + if (!g->backrefs && !(m->eflags®_BACKR)) { + NOTE("dissecting"); + dp = dissect(m, m->coldp, endp, gf, gl); + } else { + if (g->nplus > 0 && m->lastpos == NULL) + m->lastpos = (const RCHAR_T **)malloc((g->nplus+1) * + sizeof(const RCHAR_T *)); + if (g->nplus > 0 && m->lastpos == NULL) { + free(m->pmatch); + STATETEARDOWN(m); + return(REG_ESPACE); + } + NOTE("backref dissect"); + dp = backref(m, m->coldp, endp, gf, gl, (sopno)0); + } + if (dp != NULL) + break; + + /* uh-oh... we couldn't find a subexpression-level match */ + assert(g->backrefs); /* must be back references doing it */ + assert(g->nplus == 0 || m->lastpos != NULL); + for (;;) { + if (dp != NULL || endp <= m->coldp) + break; /* defeat */ + NOTE("backoff"); + endp = slow(m, m->coldp, endp-1, gf, gl); + if (endp == NULL) + break; /* defeat */ + /* try it on a shorter possibility */ +#ifndef NDEBUG + for (i = 1; i <= m->g->nsub; i++) { + assert(m->pmatch[i].rm_so == -1); + assert(m->pmatch[i].rm_eo == -1); + } +#endif + NOTE("backoff dissect"); + dp = backref(m, m->coldp, endp, gf, gl, (sopno)0); + } + assert(dp == NULL || dp == endp); + if (dp != NULL) /* found a shorter one */ + break; + + /* despite initial appearances, there is no match here */ + NOTE("false alarm"); + start = m->coldp + 1; /* recycle starting later */ + assert(start <= stop); + } + + /* fill in the details if requested */ + if (nmatch > 0) { + pmatch[0].rm_so = m->coldp - m->offp; + pmatch[0].rm_eo = endp - m->offp; + } + if (nmatch > 1) { + assert(m->pmatch != NULL); + for (i = 1; i < nmatch; i++) + if (i <= m->g->nsub) + pmatch[i] = m->pmatch[i]; + else { + pmatch[i].rm_so = -1; + pmatch[i].rm_eo = -1; + } + } + + if (m->pmatch != NULL) + free((char *)m->pmatch); + if (m->lastpos != NULL) + free((char *)m->lastpos); + STATETEARDOWN(m); + return(0); +} + +/* + - dissect - figure out what matched what, no back references + == static const RCHAR_T *dissect(register struct match *m, const RCHAR_T *start, \ + == const RCHAR_T *stop, sopno startst, sopno stopst); + */ +static const RCHAR_T * /* == stop (success) always */ +dissect(m, start, stop, startst, stopst) +register struct match *m; +const RCHAR_T *start; +const RCHAR_T *stop; +sopno startst; +sopno stopst; +{ + register int i; + register sopno ss; /* start sop of current subRE */ + register sopno es; /* end sop of current subRE */ + register const RCHAR_T *sp; /* start of string matched by it */ + register const RCHAR_T *stp; /* string matched by it cannot pass here */ + register const RCHAR_T *rest; /* start of rest of string */ + register const RCHAR_T *tail; /* string unmatched by rest of RE */ + register sopno ssub; /* start sop of subsubRE */ + register sopno esub; /* end sop of subsubRE */ + register const RCHAR_T *ssp; /* start of string matched by subsubRE */ + register const RCHAR_T *sep; /* end of string matched by subsubRE */ + register const RCHAR_T *oldssp; /* previous ssp */ + register const RCHAR_T *dp; + + AT("diss", start, stop, startst, stopst); + sp = start; + for (ss = startst; ss < stopst; ss = es) { + /* identify end of subRE */ + es = ss; + switch (m->g->strip[es]) { + case OPLUS_: + case OQUEST_: + es += m->g->stripdata[es]; + break; + case OCH_: + while (m->g->strip[es] != O_CH) + es += m->g->stripdata[es]; + break; + } + es++; + + /* figure out what it matched */ + switch (m->g->strip[ss]) { + case OEND: + assert(nope); + break; + case OCHAR: + sp++; + break; + case OBOL: + case OEOL: + case OBOW: + case OEOW: + break; + case OANY: + case OANYOF: + sp++; + break; + case OBACK_: + case O_BACK: + assert(nope); + break; + /* cases where length of match is hard to find */ + case OQUEST_: + stp = stop; + for (;;) { + /* how long could this one be? */ + rest = slow(m, sp, stp, ss, es); + assert(rest != NULL); /* it did match */ + /* could the rest match the rest? */ + tail = slow(m, rest, stop, es, stopst); + if (tail == stop) + break; /* yes! */ + /* no -- try a shorter match for this one */ + stp = rest - 1; + assert(stp >= sp); /* it did work */ + } + ssub = ss + 1; + esub = es - 1; + /* did innards match? */ + if (slow(m, sp, rest, ssub, esub) != NULL) { + dp = dissect(m, sp, rest, ssub, esub); + assert(dp == rest); + } else /* no */ + assert(sp == rest); + sp = rest; + break; + case OPLUS_: + stp = stop; + for (;;) { + /* how long could this one be? */ + rest = slow(m, sp, stp, ss, es); + assert(rest != NULL); /* it did match */ + /* could the rest match the rest? */ + tail = slow(m, rest, stop, es, stopst); + if (tail == stop) + break; /* yes! */ + /* no -- try a shorter match for this one */ + stp = rest - 1; + assert(stp >= sp); /* it did work */ + } + ssub = ss + 1; + esub = es - 1; + ssp = sp; + oldssp = ssp; + for (;;) { /* find last match of innards */ + sep = slow(m, ssp, rest, ssub, esub); + if (sep == NULL || sep == ssp) + break; /* failed or matched null */ + oldssp = ssp; /* on to next try */ + ssp = sep; + } + if (sep == NULL) { + /* last successful match */ + sep = ssp; + ssp = oldssp; + } + assert(sep == rest); /* must exhaust substring */ + assert(slow(m, ssp, sep, ssub, esub) == rest); + dp = dissect(m, ssp, sep, ssub, esub); + assert(dp == sep); + sp = rest; + break; + case OCH_: + stp = stop; + for (;;) { + /* how long could this one be? */ + rest = slow(m, sp, stp, ss, es); + assert(rest != NULL); /* it did match */ + /* could the rest match the rest? */ + tail = slow(m, rest, stop, es, stopst); + if (tail == stop) + break; /* yes! */ + /* no -- try a shorter match for this one */ + stp = rest - 1; + assert(stp >= sp); /* it did work */ + } + ssub = ss + 1; + esub = ss + m->g->stripdata[ss] - 1; + assert(m->g->strip[esub] == OOR1); + for (;;) { /* find first matching branch */ + if (slow(m, sp, rest, ssub, esub) == rest) + break; /* it matched all of it */ + /* that one missed, try next one */ + assert(m->g->strip[esub] == OOR1); + esub++; + assert(m->g->strip[esub] == OOR2); + ssub = esub + 1; + esub += m->g->stripdata[esub]; + if (m->g->strip[esub] == OOR2) + esub--; + else + assert(m->g->strip[esub] == O_CH); + } + dp = dissect(m, sp, rest, ssub, esub); + assert(dp == rest); + sp = rest; + break; + case O_PLUS: + case O_QUEST: + case OOR1: + case OOR2: + case O_CH: + assert(nope); + break; + case OLPAREN: + i = m->g->stripdata[ss]; + assert(0 < i && i <= m->g->nsub); + m->pmatch[i].rm_so = sp - m->offp; + break; + case ORPAREN: + i = m->g->stripdata[ss]; + assert(0 < i && i <= m->g->nsub); + m->pmatch[i].rm_eo = sp - m->offp; + break; + default: /* uh oh */ + assert(nope); + break; + } + } + + assert(sp == stop); + return(sp); +} + +/* + - backref - figure out what matched what, figuring in back references + == static const RCHAR_T *backref(register struct match *m, const RCHAR_T *start, \ + == const RCHAR_T *stop, sopno startst, sopno stopst, sopno lev); + */ +static const RCHAR_T * /* == stop (success) or NULL (failure) */ +backref(m, start, stop, startst, stopst, lev) +register struct match *m; +const RCHAR_T *start; +const RCHAR_T *stop; +sopno startst; +sopno stopst; +sopno lev; /* PLUS nesting level */ +{ + register int i; + register sopno ss; /* start sop of current subRE */ + register const RCHAR_T *sp; /* start of string matched by it */ + register sopno ssub; /* start sop of subsubRE */ + register sopno esub; /* end sop of subsubRE */ + register const RCHAR_T *ssp; /* start of string matched by subsubRE */ + register const RCHAR_T *dp; + register size_t len; + register int hard; + register sop s; + register RCHAR_T d; + register regoff_t offsave; + register cset *cs; + + AT("back", start, stop, startst, stopst); + sp = start; + + /* get as far as we can with easy stuff */ + hard = 0; + for (ss = startst; !hard && ss < stopst; ss++) { + s = m->g->strip[ss]; + d = m->g->stripdata[ss]; + switch (s) { + case OCHAR: + if (sp == stop || *sp++ != d) + return(NULL); + break; + case OANY: + if (sp == stop) + return(NULL); + sp++; + break; + case OANYOF: + cs = &m->g->sets[d]; + if (sp == stop || !CHIN(cs, *sp++)) + return(NULL); + break; + case OBOL: + if ( (sp == m->beginp && !(m->eflags®_NOTBOL)) || + (sp < m->endp && *(sp-1) == '\n' && + (m->g->cflags®_NEWLINE)) ) + { /* yes */ } + else + return(NULL); + break; + case OEOL: + if ( (sp == m->endp && !(m->eflags®_NOTEOL)) || + (sp < m->endp && *sp == '\n' && + (m->g->cflags®_NEWLINE)) ) + { /* yes */ } + else + return(NULL); + break; + case OBOW: + if (( (sp == m->beginp && !(m->eflags®_NOTBOL)) || + (sp < m->endp && *(sp-1) == '\n' && + (m->g->cflags®_NEWLINE)) || + (sp > m->beginp && + !ISWORD(*(sp-1))) ) && + (sp < m->endp && ISWORD(*sp)) ) + { /* yes */ } + else + return(NULL); + break; + case OEOW: + if (( (sp == m->endp && !(m->eflags®_NOTEOL)) || + (sp < m->endp && *sp == '\n' && + (m->g->cflags®_NEWLINE)) || + (sp < m->endp && !ISWORD(*sp)) ) && + (sp > m->beginp && ISWORD(*(sp-1))) ) + { /* yes */ } + else + return(NULL); + break; + case O_QUEST: + break; + case OOR1: /* matches null but needs to skip */ + ss++; + s = m->g->strip[ss]; + d = m->g->stripdata[ss]; + do { + assert(s == OOR2); + ss += d; + s = m->g->strip[ss]; + d = m->g->stripdata[ss]; + } while (s != O_CH); + /* note that the ss++ gets us past the O_CH */ + break; + default: /* have to make a choice */ + hard = 1; + break; + } + } + if (!hard) { /* that was it! */ + if (sp != stop) + return(NULL); + return(sp); + } + ss--; /* adjust for the for's final increment */ + + /* the hard stuff */ + AT("hard", sp, stop, ss, stopst); + s = m->g->strip[ss]; + d = m->g->stripdata[ss]; + switch (s) { + case OBACK_: /* the vilest depths */ + i = d; + assert(0 < i && i <= m->g->nsub); + if (m->pmatch[i].rm_eo == -1) + return(NULL); + assert(m->pmatch[i].rm_so != -1); + len = m->pmatch[i].rm_eo - m->pmatch[i].rm_so; + assert(stop - m->beginp >= len); + if (sp > stop - len) + return(NULL); /* not enough left to match */ + ssp = m->offp + m->pmatch[i].rm_so; + if (memcmp(sp, ssp, len) != 0) + return(NULL); + while (m->g->strip[ss] != O_BACK || m->g->stripdata[ss] != i) + ss++; + return(backref(m, sp+len, stop, ss+1, stopst, lev)); + break; + case OQUEST_: /* to null or not */ + dp = backref(m, sp, stop, ss+1, stopst, lev); + if (dp != NULL) + return(dp); /* not */ + return(backref(m, sp, stop, ss+d+1, stopst, lev)); + break; + case OPLUS_: + assert(m->lastpos != NULL); + assert(lev+1 <= m->g->nplus); + m->lastpos[lev+1] = sp; + return(backref(m, sp, stop, ss+1, stopst, lev+1)); + break; + case O_PLUS: + if (sp == m->lastpos[lev]) /* last pass matched null */ + return(backref(m, sp, stop, ss+1, stopst, lev-1)); + /* try another pass */ + m->lastpos[lev] = sp; + dp = backref(m, sp, stop, ss-d+1, stopst, lev); + if (dp == NULL) + return(backref(m, sp, stop, ss+1, stopst, lev-1)); + else + return(dp); + break; + case OCH_: /* find the right one, if any */ + ssub = ss + 1; + esub = ss + d - 1; + assert(m->g->strip[esub] == OOR1); + for (;;) { /* find first matching branch */ + dp = backref(m, sp, stop, ssub, esub, lev); + if (dp != NULL) + return(dp); + /* that one missed, try next one */ + if (m->g->strip[esub] == O_CH) + return(NULL); /* there is none */ + esub++; + assert(m->g->strip[esub] == OOR2); + ssub = esub + 1; + esub += m->g->stripdata[esub]; + if (m->g->strip[esub] == OOR2) + esub--; + else + assert(m->g->strip[esub] == O_CH); + } + break; + case OLPAREN: /* must undo assignment if rest fails */ + i = d; + assert(0 < i && i <= m->g->nsub); + offsave = m->pmatch[i].rm_so; + m->pmatch[i].rm_so = sp - m->offp; + dp = backref(m, sp, stop, ss+1, stopst, lev); + if (dp != NULL) + return(dp); + m->pmatch[i].rm_so = offsave; + return(NULL); + break; + case ORPAREN: /* must undo assignment if rest fails */ + i = d; + assert(0 < i && i <= m->g->nsub); + offsave = m->pmatch[i].rm_eo; + m->pmatch[i].rm_eo = sp - m->offp; + dp = backref(m, sp, stop, ss+1, stopst, lev); + if (dp != NULL) + return(dp); + m->pmatch[i].rm_eo = offsave; + return(NULL); + break; + default: /* uh oh */ + assert(nope); + break; + } + + /* "can't happen" */ + assert(nope); + /* NOTREACHED */ + return NULL; +} + +/* + - fast - step through the string at top speed + == static const RCHAR_T *fast(register struct match *m, const RCHAR_T *start, \ + == const RCHAR_T *stop, sopno startst, sopno stopst); + */ +static const RCHAR_T * /* where tentative match ended, or NULL */ +fast(m, start, stop, startst, stopst) +register struct match *m; +const RCHAR_T *start; +const RCHAR_T *stop; +sopno startst; +sopno stopst; +{ + register states st = m->st; + register states fresh = m->fresh; + register states tmp = m->tmp; + register const RCHAR_T *p = start; + register RCHAR_T c = (start == m->beginp) ? OUT : *(start-1); + register RCHAR_T lastc; /* previous c */ + register int flag; + register int i; + register const RCHAR_T *coldp; /* last p after which no match was underway */ + + CLEAR(st); + SET1(st, startst); + st = step(m->g, startst, stopst, st, NOTHING, OUT, st); + ASSIGN(fresh, st); + SP("start", st, *p); + coldp = NULL; + for (;;) { + /* next character */ + lastc = c; + c = (p == m->endp) ? OUT : *p; + if (EQ(st, fresh)) + coldp = p; + + /* is there an EOL and/or BOL between lastc and c? */ + flag = 0; + i = 0; + if ( (lastc == '\n' && m->g->cflags®_NEWLINE) || + (lastc == OUT && !(m->eflags®_NOTBOL)) ) { + flag = BOL; + i = m->g->nbol; + } + if ( (c == '\n' && m->g->cflags®_NEWLINE) || + (c == OUT && !(m->eflags®_NOTEOL)) ) { + flag = (flag == BOL) ? BOLEOL : EOL; + i += m->g->neol; + } + if (i != 0) { + for (; i > 0; i--) + st = step(m->g, startst, stopst, st, flag, OUT, st); + SP("boleol", st, c); + } + + /* how about a word boundary? */ + if ( (flag == BOL || (lastc != OUT && !ISWORD(lastc))) && + (c != OUT && ISWORD(c)) ) { + flag = BOW; + } + if ( (lastc != OUT && ISWORD(lastc)) && + (flag == EOL || (c != OUT && !ISWORD(c))) ) { + flag = EOW; + } + if (flag == BOW || flag == EOW) { + st = step(m->g, startst, stopst, st, flag, OUT, st); + SP("boweow", st, c); + } + + /* are we done? */ + if (ISSET(st, stopst) || p == stop) + break; /* NOTE BREAK OUT */ + + /* no, we must deal with this character */ + ASSIGN(tmp, st); + ASSIGN(st, fresh); + assert(c != OUT); + st = step(m->g, startst, stopst, tmp, 0, c, st); + SP("aft", st, c); + assert(EQ(step(m->g, startst, stopst, st, NOTHING, OUT, st), st)); + p++; + } + + assert(coldp != NULL); + m->coldp = coldp; + if (ISSET(st, stopst)) + return(p+1); + else + return(NULL); +} + +/* + - slow - step through the string more deliberately + == static const RCHAR_T *slow(register struct match *m, const RCHAR_T *start, \ + == const RCHAR_T *stop, sopno startst, sopno stopst); + */ +static const RCHAR_T * /* where it ended */ +slow(m, start, stop, startst, stopst) +register struct match *m; +const RCHAR_T *start; +const RCHAR_T *stop; +sopno startst; +sopno stopst; +{ + register states st = m->st; + register states empty = m->empty; + register states tmp = m->tmp; + register const RCHAR_T *p = start; + register RCHAR_T c = (start == m->beginp) ? OUT : *(start-1); + register RCHAR_T lastc; /* previous c */ + register int flag; + register int i; + register const RCHAR_T *matchp; /* last p at which a match ended */ + + AT("slow", start, stop, startst, stopst); + CLEAR(st); + SET1(st, startst); + SP("sstart", st, *p); + st = step(m->g, startst, stopst, st, NOTHING, OUT, st); + matchp = NULL; + for (;;) { + /* next character */ + lastc = c; + c = (p == m->endp) ? OUT : *p; + + /* is there an EOL and/or BOL between lastc and c? */ + flag = 0; + i = 0; + if ( (lastc == '\n' && m->g->cflags®_NEWLINE) || + (lastc == OUT && !(m->eflags®_NOTBOL)) ) { + flag = BOL; + i = m->g->nbol; + } + if ( (c == '\n' && m->g->cflags®_NEWLINE) || + (c == OUT && !(m->eflags®_NOTEOL)) ) { + flag = (flag == BOL) ? BOLEOL : EOL; + i += m->g->neol; + } + if (i != 0) { + for (; i > 0; i--) + st = step(m->g, startst, stopst, st, flag, OUT, st); + SP("sboleol", st, c); + } + + /* how about a word boundary? */ + if ( (flag == BOL || (lastc != OUT && !ISWORD(lastc))) && + (c != OUT && ISWORD(c)) ) { + flag = BOW; + } + if ( (lastc != OUT && ISWORD(lastc)) && + (flag == EOL || (c != OUT && !ISWORD(c))) ) { + flag = EOW; + } + if (flag == BOW || flag == EOW) { + st = step(m->g, startst, stopst, st, flag, OUT, st); + SP("sboweow", st, c); + } + + /* are we done? */ + if (ISSET(st, stopst)) + matchp = p; + if (EQ(st, empty) || p == stop) + break; /* NOTE BREAK OUT */ + + /* no, we must deal with this character */ + ASSIGN(tmp, st); + ASSIGN(st, empty); + assert(c != OUT); + st = step(m->g, startst, stopst, tmp, 0, c, st); + SP("saft", st, c); + assert(EQ(step(m->g, startst, stopst, st, NOTHING, OUT, st), st)); + p++; + } + + return(matchp); +} + + +/* + - step - map set of states reachable before char to set reachable after + == static states step(register struct re_guts *g, sopno start, sopno stop, \ + == register states bef, int flag, RCHAR_T ch, register states aft); + == #define BOL (1) + == #define EOL (BOL+1) + == #define BOLEOL (BOL+2) + == #define NOTHING (BOL+3) + == #define BOW (BOL+4) + == #define EOW (BOL+5) + */ +static states +step(g, start, stop, bef, flag, ch, aft) +register struct re_guts *g; +sopno start; /* start state within strip */ +sopno stop; /* state after stop state within strip */ +register states bef; /* states reachable before */ +int flag; /* NONCHAR flag */ +RCHAR_T ch; /* character code */ +register states aft; /* states already known reachable after */ +{ + register cset *cs; + register sop s; + register RCHAR_T d; + register sopno pc; + register onestate here; /* note, macros know this name */ + register sopno look; + register int i; + + for (pc = start, INIT(here, pc); pc != stop; pc++, INC(here)) { + s = g->strip[pc]; + d = g->stripdata[pc]; + switch (s) { + case OEND: + assert(pc == stop-1); + break; + case OCHAR: + /* only characters can match */ + assert(!flag || ch != d); + if (ch == d) + FWD(aft, bef, 1); + break; + case OBOL: + if (flag == BOL || flag == BOLEOL) + FWD(aft, bef, 1); + break; + case OEOL: + if (flag == EOL || flag == BOLEOL) + FWD(aft, bef, 1); + break; + case OBOW: + if (flag == BOW) + FWD(aft, bef, 1); + break; + case OEOW: + if (flag == EOW) + FWD(aft, bef, 1); + break; + case OANY: + if (!flag) + FWD(aft, bef, 1); + break; + case OANYOF: + cs = &g->sets[d]; + if (!flag && CHIN(cs, ch)) + FWD(aft, bef, 1); + break; + case OBACK_: /* ignored here */ + case O_BACK: + FWD(aft, aft, 1); + break; + case OPLUS_: /* forward, this is just an empty */ + FWD(aft, aft, 1); + break; + case O_PLUS: /* both forward and back */ + FWD(aft, aft, 1); + i = ISSETBACK(aft, d); + BACK(aft, aft, d); + if (!i && ISSETBACK(aft, d)) { + /* oho, must reconsider loop body */ + pc -= d + 1; + INIT(here, pc); + } + break; + case OQUEST_: /* two branches, both forward */ + FWD(aft, aft, 1); + FWD(aft, aft, d); + break; + case O_QUEST: /* just an empty */ + FWD(aft, aft, 1); + break; + case OLPAREN: /* not significant here */ + case ORPAREN: + FWD(aft, aft, 1); + break; + case OCH_: /* mark the first two branches */ + FWD(aft, aft, 1); + assert(OP(g->strip[pc+d]) == OOR2); + FWD(aft, aft, d); + break; + case OOR1: /* done a branch, find the O_CH */ + if (ISSTATEIN(aft, here)) { + for (look = 1; /**/; look += d) { + s = g->strip[pc+look]; + d = g->stripdata[pc+look]; + if (s == O_CH) + break; + assert(s == OOR2); + } + FWD(aft, aft, look); + } + break; + case OOR2: /* propagate OCH_'s marking */ + FWD(aft, aft, 1); + if (g->strip[pc+d] != O_CH) { + assert(g->strip[pc+d] == OOR2); + FWD(aft, aft, d); + } + break; + case O_CH: /* just empty */ + FWD(aft, aft, 1); + break; + default: /* ooooops... */ + assert(nope); + break; + } + } + + return(aft); +} + +#ifdef REDEBUG +/* + - print - print a set of states + == #ifdef REDEBUG + == static void print(struct match *m, char *caption, states st, \ + == int ch, FILE *d); + == #endif + */ +static void +print(m, caption, st, ch, d) +struct match *m; +char *caption; +states st; +int ch; +FILE *d; +{ + register struct re_guts *g = m->g; + register int i; + register int first = 1; + + if (!(m->eflags®_TRACE)) + return; + + fprintf(d, "%s", caption); + if (ch != '\0') + fprintf(d, " %s", pchar(ch)); + for (i = 0; i < g->nstates; i++) + if (ISSET(st, i)) { + fprintf(d, "%s%d", (first) ? "\t" : ", ", i); + first = 0; + } + fprintf(d, "\n"); +} + +/* + - at - print current situation + == #ifdef REDEBUG + == static void at(struct match *m, char *title, char *start, char *stop, \ + == sopno startst, sopno stopst); + == #endif + */ +static void +at(m, title, start, stop, startst, stopst) +struct match *m; +char *title; +char *start; +char *stop; +sopno startst; +sopno stopst; +{ + if (!(m->eflags®_TRACE)) + return; + + printf("%s %s-", title, pchar(*start)); + printf("%s ", pchar(*stop)); + printf("%ld-%ld\n", (long)startst, (long)stopst); +} + +#ifndef PCHARDONE +#define PCHARDONE /* never again */ +/* + - pchar - make a character printable + == #ifdef REDEBUG + == static char *pchar(int ch); + == #endif + * + * Is this identical to regchar() over in debug.c? Well, yes. But a + * duplicate here avoids having a debugging-capable regexec.o tied to + * a matching debug.o, and this is convenient. It all disappears in + * the non-debug compilation anyway, so it doesn't matter much. + */ +static char * /* -> representation */ +pchar(ch) +int ch; +{ + static char pbuf[10]; + + if (isprint(ch) || ch == ' ') + snprintf(pbuf, sizeof(pbuf), "%c", ch); + else + snprintf(pbuf, sizeof(pbuf), "\\%o", ch); + return(pbuf); +} +#endif +#endif + +#undef matcher +#undef fast +#undef slow +#undef dissect +#undef backref +#undef step +#undef print +#undef at +#undef match diff --git a/regex/re_format.7 b/regex/re_format.7 new file mode 100644 index 000000000000..61d1aeaa85f4 --- /dev/null +++ b/regex/re_format.7 @@ -0,0 +1,271 @@ +.\" $NetBSD: re_format.7,v 1.1.1.2 2008/05/18 14:31:37 aymeric Exp $ +.\" +.\" Copyright (c) 1992, 1993, 1994 Henry Spencer. +.\" Copyright (c) 1992, 1993, 1994 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" This code is derived from software contributed to Berkeley by +.\" Henry Spencer of the University of Toronto. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)re_format.7 8.2 (Berkeley) 3/16/94 +.\" +.TH RE_FORMAT 7 "March 16, 1994" +.SH NAME +re_format \- POSIX 1003.2 regular expressions +.SH DESCRIPTION +Regular expressions (``RE''s), +as defined in POSIX 1003.2, come in two forms: +modern REs (roughly those of +.IR egrep ; +1003.2 calls these ``extended'' REs) +and obsolete REs (roughly those of +.IR ed ; +1003.2 ``basic'' REs). +Obsolete REs mostly exist for backward compatibility in some old programs; +they will be discussed at the end. +1003.2 leaves some aspects of RE syntax and semantics open; +`\(dg' marks decisions on these aspects that +may not be fully portable to other 1003.2 implementations. +.PP +A (modern) RE is one\(dg or more non-empty\(dg \fIbranches\fR, +separated by `|'. +It matches anything that matches one of the branches. +.PP +A branch is one\(dg or more \fIpieces\fR, concatenated. +It matches a match for the first, followed by a match for the second, etc. +.PP +A piece is an \fIatom\fR possibly followed +by a single\(dg `*', `+', `?', or \fIbound\fR. +An atom followed by `*' matches a sequence of 0 or more matches of the atom. +An atom followed by `+' matches a sequence of 1 or more matches of the atom. +An atom followed by `?' matches a sequence of 0 or 1 matches of the atom. +.PP +A \fIbound\fR is `{' followed by an unsigned decimal integer, +possibly followed by `,' +possibly followed by another unsigned decimal integer, +always followed by `}'. +The integers must lie between 0 and RE_DUP_MAX (255\(dg) inclusive, +and if there are two of them, the first may not exceed the second. +An atom followed by a bound containing one integer \fIi\fR +and no comma matches +a sequence of exactly \fIi\fR matches of the atom. +An atom followed by a bound +containing one integer \fIi\fR and a comma matches +a sequence of \fIi\fR or more matches of the atom. +An atom followed by a bound +containing two integers \fIi\fR and \fIj\fR matches +a sequence of \fIi\fR through \fIj\fR (inclusive) matches of the atom. +.PP +An atom is a regular expression enclosed in `()' (matching a match for the +regular expression), +an empty set of `()' (matching the null string)\(dg, +a \fIbracket expression\fR (see below), `.' +(matching any single character), `^' (matching the null string at the +beginning of a line), `$' (matching the null string at the +end of a line), a `\e' followed by one of the characters +`^.[$()|*+?{\e' +(matching that character taken as an ordinary character), +a `\e' followed by any other character\(dg +(matching that character taken as an ordinary character, +as if the `\e' had not been present\(dg), +or a single character with no other significance (matching that character). +A `{' followed by a character other than a digit is an ordinary +character, not the beginning of a bound\(dg. +It is illegal to end an RE with `\e'. +.PP +A \fIbracket expression\fR is a list of characters enclosed in `[]'. +It normally matches any single character from the list (but see below). +If the list begins with `^', +it matches any single character +(but see below) \fInot\fR from the rest of the list. +If two characters in the list are separated by `\-', this is shorthand +for the full \fIrange\fR of characters between those two (inclusive) in the +collating sequence, +e.g. `[0-9]' in ASCII matches any decimal digit. +It is illegal\(dg for two ranges to share an +endpoint, e.g. `a-c-e'. +Ranges are very collating-sequence-dependent, +and portable programs should avoid relying on them. +.PP +To include a literal `]' in the list, make it the first character +(following a possible `^'). +To include a literal `\-', make it the first or last character, +or the second endpoint of a range. +To use a literal `\-' as the first endpoint of a range, +enclose it in `[.' and `.]' to make it a collating element (see below). +With the exception of these and some combinations using `[' (see next +paragraphs), all other special characters, including `\e', lose their +special significance within a bracket expression. +.PP +Within a bracket expression, a collating element (a character, +a multi-character sequence that collates as if it were a single character, +or a collating-sequence name for either) +enclosed in `[.' and `.]' stands for the +sequence of characters of that collating element. +The sequence is a single element of the bracket expression's list. +A bracket expression containing a multi-character collating element +can thus match more than one character, +e.g. if the collating sequence includes a `ch' collating element, +then the RE `[[.ch.]]*c' matches the first five characters +of `chchcc'. +.PP +Within a bracket expression, a collating element enclosed in `[=' and +`=]' is an equivalence class, standing for the sequences of characters +of all collating elements equivalent to that one, including itself. +(If there are no other equivalent collating elements, +the treatment is as if the enclosing delimiters were `[.' and `.]'.) +For example, if o and \o'o^' are the members of an equivalence class, +then `[[=o=]]', `[[=\o'o^'=]]', and `[o\o'o^']' are all synonymous. +An equivalence class may not\(dg be an endpoint +of a range. +.PP +Within a bracket expression, the name of a \fIcharacter class\fR enclosed +in `[:' and `:]' stands for the list of all characters belonging to that +class. +Standard character class names are: +.PP +.RS +.nf +.ta 3c 6c 9c +alnum digit punct +alpha graph space +blank lower upper +cntrl print xdigit +.fi +.RE +.PP +These stand for the character classes defined in +.IR ctype (3). +A locale may provide others. +A character class may not be used as an endpoint of a range. +.PP +There are two special cases\(dg of bracket expressions: +the bracket expressions `[[:<:]]' and `[[:>:]]' match the null string at +the beginning and end of a word respectively. +A word is defined as a sequence of +word characters +which is neither preceded nor followed by +word characters. +A word character is an +.I alnum +character (as defined by +.IR ctype (3)) +or an underscore. +This is an extension, +compatible with but not specified by POSIX 1003.2, +and should be used with +caution in software intended to be portable to other systems. +.PP +In the event that an RE could match more than one substring of a given +string, +the RE matches the one starting earliest in the string. +If the RE could match more than one substring starting at that point, +it matches the longest. +Subexpressions also match the longest possible substrings, subject to +the constraint that the whole match be as long as possible, +with subexpressions starting earlier in the RE taking priority over +ones starting later. +Note that higher-level subexpressions thus take priority over +their lower-level component subexpressions. +.PP +Match lengths are measured in characters, not collating elements. +A null string is considered longer than no match at all. +For example, +`bb*' matches the three middle characters of `abbbc', +`(wee|week)(knights|nights)' matches all ten characters of `weeknights', +when `(.*).*' is matched against `abc' the parenthesized subexpression +matches all three characters, and +when `(a*)*' is matched against `bc' both the whole RE and the parenthesized +subexpression match the null string. +.PP +If case-independent matching is specified, +the effect is much as if all case distinctions had vanished from the +alphabet. +When an alphabetic that exists in multiple cases appears as an +ordinary character outside a bracket expression, it is effectively +transformed into a bracket expression containing both cases, +e.g. `x' becomes `[xX]'. +When it appears inside a bracket expression, all case counterparts +of it are added to the bracket expression, so that (e.g.) `[x]' +becomes `[xX]' and `[^x]' becomes `[^xX]'. +.PP +No particular limit is imposed on the length of REs\(dg. +Programs intended to be portable should not employ REs longer +than 256 bytes, +as an implementation can refuse to accept such REs and remain +POSIX-compliant. +.PP +Obsolete (``basic'') regular expressions differ in several respects. +`|', `+', and `?' are ordinary characters and there is no equivalent +for their functionality. +The delimiters for bounds are `\e{' and `\e}', +with `{' and `}' by themselves ordinary characters. +The parentheses for nested subexpressions are `\e(' and `\e)', +with `(' and `)' by themselves ordinary characters. +`^' is an ordinary character except at the beginning of the +RE or\(dg the beginning of a parenthesized subexpression, +`$' is an ordinary character except at the end of the +RE or\(dg the end of a parenthesized subexpression, +and `*' is an ordinary character if it appears at the beginning of the +RE or the beginning of a parenthesized subexpression +(after a possible leading `^'). +Finally, there is one new type of atom, a \fIback reference\fR: +`\e' followed by a non-zero decimal digit \fId\fR +matches the same sequence of characters +matched by the \fId\fRth parenthesized subexpression +(numbering subexpressions by the positions of their opening parentheses, +left to right), +so that (e.g.) `\e([bc]\e)\e1' matches `bb' or `cc' but not `bc'. +.SH SEE ALSO +regex(3) +.PP +POSIX 1003.2, section 2.8 (Regular Expression Notation). +.SH BUGS +Having two kinds of REs is a botch. +.PP +The current 1003.2 spec says that `)' is an ordinary character in +the absence of an unmatched `('; +this was an unintentional result of a wording error, +and change is likely. +Avoid relying on it. +.PP +Back references are a dreadful botch, +posing major problems for efficient implementations. +They are also somewhat vaguely defined +(does +`a\e(\e(b\e)*\e2\e)*d' match `abbbd'?). +Avoid using them. +.PP +1003.2's specification of case-independent matching is vague. +The ``one case implies all cases'' definition given above +is current consensus among implementors as to the right interpretation. +.PP +The syntax for word boundaries is incredibly ugly. diff --git a/regex/regcomp.c b/regex/regcomp.c new file mode 100644 index 000000000000..8f7438f28d8a --- /dev/null +++ b/regex/regcomp.c @@ -0,0 +1,1737 @@ +/* $NetBSD: regcomp.c,v 1.7 2011/11/19 17:45:11 tnozaki Exp $ */ + +/*- + * Copyright (c) 1992, 1993, 1994 Henry Spencer. + * Copyright (c) 1992, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Henry Spencer of the University of Toronto. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)regcomp.c 8.4 (Berkeley) 3/19/94 + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)regcomp.c 8.4 (Berkeley) 3/19/94"; +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include +#include +#include + +#include "utils.h" +#include "regex2.h" + +#include "cclass.h" +#include "cname.h" + +/* + * parse structure, passed up and down to avoid global variables and + * other clumsinesses + */ +struct parse { + RCHAR_T *next; /* next character in RE */ + RCHAR_T *end; /* end of string (-> NUL normally) */ + int error; /* has an error been seen? */ + sop *strip; /* malloced strip */ + RCHAR_T *stripdata; /* malloced stripdata */ + sopno ssize; /* malloced strip size (allocated) */ + sopno slen; /* malloced strip length (used) */ + int ncsalloc; /* number of csets allocated */ + struct re_guts *g; +# define NPAREN 10 /* we need to remember () 1-9 for back refs */ + sopno pbegin[NPAREN]; /* -> ( ([0] unused) */ + sopno pend[NPAREN]; /* -> ) ([0] unused) */ +}; + +/* ========= begin header generated by ./mkh ========= */ +#ifdef __cplusplus +extern "C" { +#endif + +/* === regcomp.c === */ +static void p_ere __P((struct parse *p, int stop, size_t reclimit)); +static void p_ere_exp __P((struct parse *p, size_t reclimit)); +static void p_str __P((struct parse *p)); +static void p_bre __P((struct parse *p, int end1, int end2, size_t reclimit)); +static int p_simp_re __P((struct parse *p, int starordinary, size_t reclimit)); +static int p_count __P((struct parse *p)); +static void p_bracket __P((struct parse *p)); +static void p_b_term __P((struct parse *p, cset *cs)); +static void p_b_cclass __P((struct parse *p, cset *cs)); +static void p_b_eclass __P((struct parse *p, cset *cs)); +static char p_b_symbol __P((struct parse *p)); +static char p_b_coll_elem __P((struct parse *p, int endc)); +static char othercase __P((int ch)); +static void bothcases __P((struct parse *p, int ch)); +static void ordinary __P((struct parse *p, int ch)); +static void nonnewline __P((struct parse *p)); +static void repeat __P((struct parse *p, sopno start, int from, int to, size_t reclimit)); +static int seterr __P((struct parse *p, int e)); +static cset *allocset __P((struct parse *p)); +static void freeset __P((struct parse *p, cset *cs)); +static int freezeset __P((struct parse *p, cset *cs)); +static int firstch __P((struct parse *p, cset *cs)); +static int nch __P((struct parse *p, cset *cs)); +static void mcadd __P((struct parse *p, cset *cs, const char *cp)); +#ifdef notdef +static void mcsub __P((cset *cs, char *cp)); +static int mcin __P((cset *cs, char *cp)); +static char *mcfind __P((cset *cs, char *cp)); +#endif +static void mcinvert __P((struct parse *p, cset *cs)); +static void mccase __P((struct parse *p, cset *cs)); +#ifdef notdef +static int isinsets __P((struct re_guts *g, int c)); +static int samesets __P((struct re_guts *g, int c1, int c2)); +#endif +static void categorize __P((struct parse *p, struct re_guts *g)); +static sopno dupl __P((struct parse *p, sopno start, sopno finish)); +static void doemit __P((struct parse *p, sop op, size_t opnd)); +static void doinsert __P((struct parse *p, sop op, size_t opnd, sopno pos)); +static void dofwd __P((struct parse *p, sopno pos, sop value)); +static int enlarge __P((struct parse *p, sopno size)); +static void stripsnug __P((struct parse *p, struct re_guts *g)); +static void findmust __P((struct parse *p, struct re_guts *g)); +static sopno pluscount __P((struct parse *p, struct re_guts *g)); + +#ifdef __cplusplus +} +#endif +/* ========= end header generated by ./mkh ========= */ + +static RCHAR_T nuls[10]; /* place to point scanner in event of error */ + +/* + * macros for use with parse structure + * BEWARE: these know that the parse structure is named `p' !!! + */ +#define PEEK() (*p->next) +#define PEEK2() (*(p->next+1)) +#define MORE() (p->next < p->end) +#define MORE2() (p->next+1 < p->end) +#define SEE(c) (MORE() && PEEK() == (c)) +#define SEETWO(a, b) (MORE() && MORE2() && PEEK() == (a) && PEEK2() == (b)) +#define EAT(c) ((SEE(c)) ? (NEXT(), 1) : 0) +#define EATTWO(a, b) ((SEETWO(a, b)) ? (NEXT2(), 1) : 0) +#define NEXT() (p->next++) +#define NEXT2() (p->next += 2) +#define NEXTn(n) (p->next += (n)) +#define GETNEXT() (*p->next++) +#define SETERROR(e) seterr(p, (e)) +#define REQUIRE(co, e) ((co) || SETERROR(e)) +#define MUSTSEE(c, e) (REQUIRE(MORE() && PEEK() == (c), e)) +#define MUSTEAT(c, e) (REQUIRE(MORE() && GETNEXT() == (c), e)) +#define MUSTNOTSEE(c, e) (REQUIRE(!MORE() || PEEK() != (c), e)) +#define EMIT(op, sopnd) doemit(p, (sop)(op), (size_t)(sopnd)) +#define INSERT(op, pos) doinsert(p, (sop)(op), HERE()-(pos)+1, pos) +#define AHEAD(pos) dofwd(p, pos, HERE()-(pos)) +#define ASTERN(sop, pos) EMIT(sop, HERE()-pos) +#define HERE() (p->slen) +#define THERE() (p->slen - 1) +#define THERETHERE() (p->slen - 2) +#define DROP(n) (p->slen -= (n)) + +#ifndef NDEBUG +static int never = 0; /* for use in asserts; shuts lint up */ +#else +#define never 0 /* some s have bugs too */ +#endif + +#define MEMLIMIT 0x8000000 +#define MEMSIZE(p) \ + ((p)->ncsalloc / CHAR_BIT * (p)->g->csetsize + \ + (p)->ncsalloc * sizeof(cset) + \ + (p)->ssize * sizeof(sop)) +#define RECLIMIT 256 + +/* + - regcomp - interface for parser and compilation + = extern int regcomp(regex_t *, const RCHAR_T *, int); + = #define REG_BASIC 0000 + = #define REG_EXTENDED 0001 + = #define REG_ICASE 0002 + = #define REG_NOSUB 0004 + = #define REG_NEWLINE 0010 + = #define REG_NOSPEC 0020 + = #define REG_PEND 0040 + = #define REG_DUMP 0200 + */ +int /* 0 success, otherwise REG_something */ +regcomp(regex_t *preg, const RCHAR_T *pattern, int cflags) +{ + struct parse pa; + register struct re_guts *g; + register struct parse *p = &pa; + register int i; + register size_t len; +#ifdef REDEBUG +# define GOODFLAGS(f) (f) +#else +# define GOODFLAGS(f) ((f)&~REG_DUMP) +#endif + + cflags = GOODFLAGS(cflags); + if ((cflags®_EXTENDED) && (cflags®_NOSPEC)) + return(REG_INVARG); + + if (cflags®_PEND) { + if (preg->re_endp < pattern) + return(REG_INVARG); + len = preg->re_endp - pattern; + } else + len = STRLEN(pattern); + + /* do the mallocs early so failure handling is easy */ + g = (struct re_guts *)malloc(sizeof(struct re_guts) + + (NC-1)*sizeof(cat_t)); + if (g == NULL) + return(REG_ESPACE); + p->ssize = len/(size_t)2*(size_t)3 + (size_t)1; /* ugh */ + p->strip = (sop *)malloc(p->ssize * sizeof(sop)); + if (p->strip == NULL) { + free((char *)g); + return(REG_ESPACE); + } + p->stripdata = (RCHAR_T *)malloc(p->ssize * sizeof(RCHAR_T)); + if (p->stripdata == NULL) { + free((char *)p->strip); + free((char *)g); + return(REG_ESPACE); + } + p->slen = 0; + + /* set things up */ + p->g = g; + p->next = (RCHAR_T *)pattern; /* convenience; we do not modify it */ + p->end = p->next + len; + p->error = 0; + p->ncsalloc = 0; + for (i = 0; i < NPAREN; i++) { + p->pbegin[i] = 0; + p->pend[i] = 0; + } + g->csetsize = NC; + g->sets = NULL; + g->setbits = NULL; + g->ncsets = 0; + g->cflags = cflags; + g->iflags = 0; + g->nbol = 0; + g->neol = 0; + g->must = NULL; + g->mlen = 0; + g->nsub = 0; +#if 0 + g->ncategories = 1; /* category 0 is "everything else" */ + g->categories = &g->catspace[-(CHAR_MIN)]; + (void) memset((char *)g->catspace, 0, NC*sizeof(cat_t)); +#endif + g->backrefs = 0; + + /* do it */ + EMIT(OEND, 0); + g->firststate = THERE(); + if (cflags®_EXTENDED) + p_ere(p, OUT, 0); + else if (cflags®_NOSPEC) + p_str(p); + else + p_bre(p, OUT, OUT, 0); + EMIT(OEND, 0); + g->laststate = THERE(); + + /* tidy up loose ends and fill things in */ + categorize(p, g); + stripsnug(p, g); + findmust(p, g); + g->nplus = pluscount(p, g); + g->magic = MAGIC2; + preg->re_nsub = g->nsub; + preg->re_g = g; + preg->re_magic = MAGIC1; +#ifndef REDEBUG + /* not debugging, so can't rely on the assert() in regexec() */ + if (g->iflags&BAD) + SETERROR(REG_ASSERT); +#endif + + /* win or lose, we're done */ + if (p->error != 0) /* lose */ + regfree(preg); + return(p->error); +} + +/* + - p_ere - ERE parser top level, concatenation and alternation + == static void p_ere(register struct parse *p, int stop, size_t reclimit); + */ +static void +p_ere(register struct parse *p, int stop, size_t reclimit) + + /* character this ERE should end at */ +{ + register char c; + register sopno prevback = 0; + register sopno prevfwd = 0; + register sopno conc; + register int first = 1; /* is this the first alternative? */ + + if (reclimit++ > RECLIMIT || p->error == REG_ESPACE) { + p->error = REG_ESPACE; + return; + } + + for (;;) { + /* do a bunch of concatenated expressions */ + conc = HERE(); + while (MORE() && (c = PEEK()) != '|' && c != stop) + p_ere_exp(p, reclimit); + (void)REQUIRE(HERE() != conc, REG_EMPTY); /* require nonempty */ + + if (!EAT('|')) + break; /* NOTE BREAK OUT */ + + if (first) { + INSERT(OCH_, conc); /* offset is wrong */ + prevfwd = conc; + prevback = conc; + first = 0; + } + ASTERN(OOR1, prevback); + prevback = THERE(); + AHEAD(prevfwd); /* fix previous offset */ + prevfwd = HERE(); + EMIT(OOR2, 0); /* offset is very wrong */ + } + + if (!first) { /* tail-end fixups */ + AHEAD(prevfwd); + ASTERN(O_CH, prevback); + } + + assert(!MORE() || SEE(stop)); +} + +/* + - p_ere_exp - parse one subERE, an atom possibly followed by a repetition op + == static void p_ere_exp(register struct parse *p); + */ +static void +p_ere_exp(register struct parse *p, size_t reclimit) +{ + register char c; + register sopno pos; + register int count; + register int count2; + register sopno subno; + int wascaret = 0; + + assert(MORE()); /* caller should have ensured this */ + c = GETNEXT(); + + pos = HERE(); + switch (c) { + case '(': + (void)REQUIRE(MORE(), REG_EPAREN); + p->g->nsub++; + subno = p->g->nsub; + if (subno < NPAREN) + p->pbegin[subno] = HERE(); + EMIT(OLPAREN, subno); + if (!SEE(')')) + p_ere(p, ')', reclimit); + if (subno < NPAREN) { + p->pend[subno] = HERE(); + assert(p->pend[subno] != 0); + } + EMIT(ORPAREN, subno); + (void)MUSTEAT(')', REG_EPAREN); + break; +#ifndef POSIX_MISTAKE + case ')': /* happens only if no current unmatched ( */ + /* + * You may ask, why the ifndef? Because I didn't notice + * this until slightly too late for 1003.2, and none of the + * other 1003.2 regular-expression reviewers noticed it at + * all. So an unmatched ) is legal POSIX, at least until + * we can get it fixed. + */ + SETERROR(REG_EPAREN); + break; +#endif + case '^': + EMIT(OBOL, 0); + p->g->iflags |= USEBOL; + p->g->nbol++; + wascaret = 1; + break; + case '$': + EMIT(OEOL, 0); + p->g->iflags |= USEEOL; + p->g->neol++; + break; + case '|': + SETERROR(REG_EMPTY); + break; + case '*': + case '+': + case '?': + SETERROR(REG_BADRPT); + break; + case '.': + if (p->g->cflags®_NEWLINE) + nonnewline(p); + else + EMIT(OANY, 0); + break; + case '[': + p_bracket(p); + break; + case '\\': + (void)REQUIRE(MORE(), REG_EESCAPE); + c = GETNEXT(); + ordinary(p, c); + break; + case '{': /* okay as ordinary except if digit follows */ + (void)REQUIRE(!MORE() || !ISDIGIT((UCHAR_T)PEEK()), REG_BADRPT); + /* FALLTHROUGH */ + default: + ordinary(p, c); + break; + } + + if (!MORE()) + return; + c = PEEK(); + /* we call { a repetition if followed by a digit */ + if (!( c == '*' || c == '+' || c == '?' || + (c == '{' && MORE2() && ISDIGIT((UCHAR_T)PEEK2())) )) + return; /* no repetition, we're done */ + NEXT(); + + (void)REQUIRE(!wascaret, REG_BADRPT); + switch (c) { + case '*': /* implemented as +? */ + /* this case does not require the (y|) trick, noKLUDGE */ + INSERT(OPLUS_, pos); + ASTERN(O_PLUS, pos); + INSERT(OQUEST_, pos); + ASTERN(O_QUEST, pos); + break; + case '+': + INSERT(OPLUS_, pos); + ASTERN(O_PLUS, pos); + break; + case '?': + /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */ + INSERT(OCH_, pos); /* offset slightly wrong */ + ASTERN(OOR1, pos); /* this one's right */ + AHEAD(pos); /* fix the OCH_ */ + EMIT(OOR2, 0); /* offset very wrong... */ + AHEAD(THERE()); /* ...so fix it */ + ASTERN(O_CH, THERETHERE()); + break; + case '{': + count = p_count(p); + if (EAT(',')) { + if (ISDIGIT((UCHAR_T)PEEK())) { + count2 = p_count(p); + (void)REQUIRE(count <= count2, REG_BADBR); + } else /* single number with comma */ + count2 = INFINITY; + } else /* just a single number */ + count2 = count; + repeat(p, pos, count, count2, 0); + if (!EAT('}')) { /* error heuristics */ + while (MORE() && PEEK() != '}') + NEXT(); + (void)REQUIRE(MORE(), REG_EBRACE); + SETERROR(REG_BADBR); + } + break; + } + + if (!MORE()) + return; + c = PEEK(); + if (!( c == '*' || c == '+' || c == '?' || + (c == '{' && MORE2() && ISDIGIT((UCHAR_T)PEEK2())) ) ) + return; + SETERROR(REG_BADRPT); +} + +/* + - p_str - string (no metacharacters) "parser" + == static void p_str(register struct parse *p); + */ +static void +p_str(register struct parse *p) +{ + (void)REQUIRE(MORE(), REG_EMPTY); + while (MORE()) + ordinary(p, GETNEXT()); +} + +/* + - p_bre - BRE parser top level, anchoring and concatenation + == static void p_bre(register struct parse *p, register int end1, \ + == register int end2, size_t reclimit); + * Giving end1 as OUT essentially eliminates the end1/end2 check. + * + * This implementation is a bit of a kludge, in that a trailing $ is first + * taken as an ordinary character and then revised to be an anchor. The + * only undesirable side effect is that '$' gets included as a character + * category in such cases. This is fairly harmless; not worth fixing. + * The amount of lookahead needed to avoid this kludge is excessive. + */ +static void +p_bre(register struct parse *p, register int end1, register int end2, size_t reclimit) + + /* first terminating character */ + /* second terminating character */ +{ + register sopno start; + register int first = 1; /* first subexpression? */ + register int wasdollar = 0; + + if (reclimit++ > RECLIMIT || p->error == REG_ESPACE) { + p->error = REG_ESPACE; + return; + } + + start = HERE(); + + if (EAT('^')) { + EMIT(OBOL, 0); + p->g->iflags |= USEBOL; + p->g->nbol++; + } + while (MORE() && !SEETWO(end1, end2)) { + wasdollar = p_simp_re(p, first, reclimit); + first = 0; + } + if (wasdollar) { /* oops, that was a trailing anchor */ + DROP(1); + EMIT(OEOL, 0); + p->g->iflags |= USEEOL; + p->g->neol++; + } + + (void)REQUIRE(HERE() != start, REG_EMPTY); /* require nonempty */ +} + +/* + - p_simp_re - parse a simple RE, an atom possibly followed by a repetition + == static int p_simp_re(register struct parse *p, int starordinary, size_t reclimit); + */ +static int /* was the simple RE an unbackslashed $? */ +p_simp_re(register struct parse *p, int starordinary, size_t reclimit) + + /* is a leading * an ordinary character? */ +{ + register int c; + register int count; + register int count2; + register sopno pos; + register int i; + register sopno subno; + int backsl; + + pos = HERE(); /* repetion op, if any, covers from here */ + + assert(MORE()); /* caller should have ensured this */ + c = GETNEXT(); + backsl = c == '\\'; + if (backsl) { + (void)REQUIRE(MORE(), REG_EESCAPE); + c = (unsigned char)GETNEXT(); + switch (c) { + case '{': + SETERROR(REG_BADRPT); + break; + case '(': + p->g->nsub++; + subno = p->g->nsub; + if (subno < NPAREN) + p->pbegin[subno] = HERE(); + EMIT(OLPAREN, subno); + /* the MORE here is an error heuristic */ + if (MORE() && !SEETWO('\\', ')')) + p_bre(p, '\\', ')', reclimit); + if (subno < NPAREN) { + p->pend[subno] = HERE(); + assert(p->pend[subno] != 0); + } + EMIT(ORPAREN, subno); + (void)REQUIRE(EATTWO('\\', ')'), REG_EPAREN); + break; + case ')': /* should not get here -- must be user */ + case '}': + SETERROR(REG_EPAREN); + break; + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + i = c - '0'; + assert(i < NPAREN); + if (p->pend[i] != 0) { + assert(i <= p->g->nsub); + EMIT(OBACK_, i); + assert(p->pbegin[i] != 0); + assert(p->strip[p->pbegin[i]] == OLPAREN); + assert(p->strip[p->pend[i]] == ORPAREN); + (void) dupl(p, p->pbegin[i]+1, p->pend[i]); + EMIT(O_BACK, i); + } else + SETERROR(REG_ESUBREG); + p->g->backrefs = 1; + break; + default: + ordinary(p, c); + break; + } + } else { + switch (c) { + case '.': + if (p->g->cflags®_NEWLINE) + nonnewline(p); + else + EMIT(OANY, 0); + break; + case '[': + p_bracket(p); + break; + case '*': + (void)REQUIRE(starordinary, REG_BADRPT); + /* FALLTHROUGH */ + default: + ordinary(p, c); + break; + } + } + + if (EAT('*')) { /* implemented as +? */ + /* this case does not require the (y|) trick, noKLUDGE */ + INSERT(OPLUS_, pos); + ASTERN(O_PLUS, pos); + INSERT(OQUEST_, pos); + ASTERN(O_QUEST, pos); + } else if (EATTWO('\\', '{')) { + count = p_count(p); + if (EAT(',')) { + if (MORE() && ISDIGIT((UCHAR_T)PEEK())) { + count2 = p_count(p); + (void)REQUIRE(count <= count2, REG_BADBR); + } else /* single number with comma */ + count2 = INFINITY; + } else /* just a single number */ + count2 = count; + repeat(p, pos, count, count2, reclimit); + if (!EATTWO('\\', '}')) { /* error heuristics */ + while (MORE() && !SEETWO('\\', '}')) + NEXT(); + (void)REQUIRE(MORE(), REG_EBRACE); + SETERROR(REG_BADBR); + } + } else if (!backsl && c == (unsigned char)'$') /* $ (but not \$) ends it */ + return(1); + + return(0); +} + +/* + - p_count - parse a repetition count + == static int p_count(register struct parse *p); + */ +static int /* the value */ +p_count(register struct parse *p) +{ + register int count = 0; + register int ndigits = 0; + + while (MORE() && ISDIGIT((UCHAR_T)PEEK()) && count <= DUPMAX) { + count = count*10 + (GETNEXT() - '0'); + ndigits++; + } + + (void)REQUIRE(ndigits > 0 && count <= DUPMAX, REG_BADBR); + return(count); +} + +/* + - p_bracket - parse a bracketed character list + == static void p_bracket(register struct parse *p); + * + * Note a significant property of this code: if the allocset() did SETERROR, + * no set operations are done. + */ +static void +p_bracket(register struct parse *p) +{ + register cset *cs; + register int invert = 0; + static RCHAR_T bow[] = { '[', ':', '<', ':', ']', ']' }; + static RCHAR_T eow[] = { '[', ':', '>', ':', ']', ']' }; + + cs = allocset(p); + if (cs == NULL) + return; + + /* Dept of Truly Sickening Special-Case Kludges */ + if (p->next + 5 < p->end && MEMCMP(p->next, bow, 6) == 0) { + EMIT(OBOW, 0); + NEXTn(6); + return; + } + if (p->next + 5 < p->end && MEMCMP(p->next, eow, 6) == 0) { + EMIT(OEOW, 0); + NEXTn(6); + return; + } + + if (EAT('^')) + invert++; /* make note to invert set at end */ + if (EAT(']')) + CHadd(cs, ']'); + else if (EAT('-')) + CHadd(cs, '-'); + while (MORE() && PEEK() != ']' && !SEETWO('-', ']')) + p_b_term(p, cs); + if (EAT('-')) + CHadd(cs, '-'); + (void)MUSTEAT(']', REG_EBRACK); + + if (p->error != 0) /* don't mess things up further */ + return; + + if (p->g->cflags®_ICASE) { + register int i; + register int ci; + + for (i = p->g->csetsize - 1; i >= 0; i--) + if (CHIN(cs, i) && isalpha(i)) { + ci = othercase(i); + if (ci != i) + CHadd(cs, ci); + } + if (cs->multis != NULL) + mccase(p, cs); + } + if (invert) { + register int i; + + for (i = p->g->csetsize - 1; i >= 0; i--) + if (CHIN(cs, i)) + CHsub(cs, i); + else + CHadd(cs, i); + if (p->g->cflags®_NEWLINE) + CHsub(cs, '\n'); + if (cs->multis != NULL) + mcinvert(p, cs); + } + + assert(cs->multis == NULL); /* xxx */ + + if (nch(p, cs) == 1) { /* optimize singleton sets */ + ordinary(p, firstch(p, cs)); + freeset(p, cs); + } else + EMIT(OANYOF, freezeset(p, cs)); +} + +/* + - p_b_term - parse one term of a bracketed character list + == static void p_b_term(register struct parse *p, register cset *cs); + */ +static void +p_b_term(register struct parse *p, register cset *cs) +{ + register char c; + register char start, finish; + register int i; + + /* classify what we've got */ + switch ((MORE()) ? PEEK() : '\0') { + case '[': + c = (MORE2()) ? PEEK2() : '\0'; + break; + case '-': + SETERROR(REG_ERANGE); + return; /* NOTE RETURN */ + break; + default: + c = '\0'; + break; + } + + switch (c) { + case ':': /* character class */ + NEXT2(); + (void)REQUIRE(MORE(), REG_EBRACK); + c = PEEK(); + (void)REQUIRE(c != '-' && c != ']', REG_ECTYPE); + p_b_cclass(p, cs); + (void)REQUIRE(MORE(), REG_EBRACK); + (void)REQUIRE(EATTWO(':', ']'), REG_ECTYPE); + break; + case '=': /* equivalence class */ + NEXT2(); + (void)REQUIRE(MORE(), REG_EBRACK); + c = PEEK(); + (void)REQUIRE(c != '-' && c != ']', REG_ECOLLATE); + p_b_eclass(p, cs); + (void)REQUIRE(MORE(), REG_EBRACK); + (void)REQUIRE(EATTWO('=', ']'), REG_ECOLLATE); + break; + default: /* symbol, ordinary character, or range */ +/* xxx revision needed for multichar stuff */ + start = p_b_symbol(p); + if (SEE('-') && MORE2() && PEEK2() != ']') { + /* range */ + NEXT(); + if (EAT('-')) + finish = '-'; + else + finish = p_b_symbol(p); + } else + finish = start; +/* xxx what about signed chars here... */ + (void)REQUIRE(start <= finish, REG_ERANGE); + for (i = start; i <= finish; i++) + CHadd(cs, i); + break; + } +} + +/* + - p_b_cclass - parse a character-class name and deal with it + == static void p_b_cclass(register struct parse *p, register cset *cs); + */ +static void +p_b_cclass(register struct parse *p, register cset *cs) +{ + register RCHAR_T *sp = p->next; + register struct cclass *cp; + register size_t len; + register const char *u; + register char c; + + while (MORE() && isalpha(PEEK())) + NEXT(); + len = p->next - sp; + for (cp = cclasses; cp->name != NULL; cp++) + if (STRLEN(cp->name) == len && !MEMCMP(cp->name, sp, len)) + break; + if (cp->name == NULL) { + /* oops, didn't find it */ + SETERROR(REG_ECTYPE); + return; + } + + u = cp->chars; + while ((c = *u++) != '\0') + CHadd(cs, c); + for (u = cp->multis; *u != '\0'; u += strlen(u) + 1) + MCadd(p, cs, u); +} + +/* + - p_b_eclass - parse an equivalence-class name and deal with it + == static void p_b_eclass(register struct parse *p, register cset *cs); + * + * This implementation is incomplete. xxx + */ +static void +p_b_eclass(register struct parse *p, register cset *cs) +{ + register char c; + + c = p_b_coll_elem(p, '='); + CHadd(cs, c); +} + +/* + - p_b_symbol - parse a character or [..]ed multicharacter collating symbol + == static char p_b_symbol(register struct parse *p); + */ +static char /* value of symbol */ +p_b_symbol(register struct parse *p) +{ + register char value; + + (void)REQUIRE(MORE(), REG_EBRACK); + if (!EATTWO('[', '.')) + return(GETNEXT()); + + /* collating symbol */ + value = p_b_coll_elem(p, '.'); + (void)REQUIRE(EATTWO('.', ']'), REG_ECOLLATE); + return(value); +} + +/* + - p_b_coll_elem - parse a collating-element name and look it up + == static char p_b_coll_elem(register struct parse *p, int endc); + */ +static char /* value of collating element */ +p_b_coll_elem(register struct parse *p, int endc) + + /* name ended by endc,']' */ +{ + register RCHAR_T *sp = p->next; + register struct cname *cp; + register size_t len; + + while (MORE() && !SEETWO(endc, ']')) + NEXT(); + if (!MORE()) { + SETERROR(REG_EBRACK); + return(0); + } + len = p->next - sp; + for (cp = cnames; cp->name != NULL; cp++) + if (STRLEN(cp->name) == len && MEMCMP(cp->name, sp, len)) + return(cp->code); /* known name */ + if (len == 1) + return(*sp); /* single character */ + SETERROR(REG_ECOLLATE); /* neither */ + return(0); +} + +/* + - othercase - return the case counterpart of an alphabetic + == static char othercase(int ch); + */ +static char /* if no counterpart, return ch */ +othercase(int ch) +{ + assert(isalpha(ch)); + if (isupper(ch)) + return(tolower(ch)); + else if (islower(ch)) + return(toupper(ch)); + else /* peculiar, but could happen */ + return(ch); +} + +/* + - bothcases - emit a dualcase version of a two-case character + == static void bothcases(register struct parse *p, int ch); + * + * Boy, is this implementation ever a kludge... + */ +static void +bothcases(register struct parse *p, int ch) +{ + register RCHAR_T *oldnext = p->next; + register RCHAR_T *oldend = p->end; + RCHAR_T bracket[3]; + + assert(othercase(ch) != ch); /* p_bracket() would recurse */ + p->next = bracket; + p->end = bracket+2; + bracket[0] = ch; + bracket[1] = ']'; + bracket[2] = '\0'; + p_bracket(p); + assert(p->next == bracket+2); + p->next = oldnext; + p->end = oldend; +} + +/* + - ordinary - emit an ordinary character + == static void ordinary(register struct parse *p, register int ch); + */ +static void +ordinary(register struct parse *p, register int ch) +{ +/* + register cat_t *cap = p->g->categories; +*/ + + if ((p->g->cflags®_ICASE) && isalpha(ch) && othercase(ch) != ch) + bothcases(p, ch); + else { + EMIT(OCHAR, (UCHAR_T)ch); +/* + if (cap[ch] == 0) + cap[ch] = p->g->ncategories++; +*/ + } +} + +/* + - nonnewline - emit REG_NEWLINE version of OANY + == static void nonnewline(register struct parse *p); + * + * Boy, is this implementation ever a kludge... + */ +static void +nonnewline(register struct parse *p) +{ + register RCHAR_T *oldnext = p->next; + register RCHAR_T *oldend = p->end; + RCHAR_T bracket[4]; + + p->next = bracket; + p->end = bracket+3; + bracket[0] = '^'; + bracket[1] = '\n'; + bracket[2] = ']'; + bracket[3] = '\0'; + p_bracket(p); + assert(p->next == bracket+3); + p->next = oldnext; + p->end = oldend; +} + +/* + - repeat - generate code for a bounded repetition, recursively if needed + == static void repeat(register struct parse *p, sopno start, int from, int to, size_t reclimit); + */ +static void +repeat(register struct parse *p, sopno start, int from, int to, size_t reclimit) + + /* operand from here to end of strip */ + /* repeated from this number */ + /* to this number of times (maybe INFINITY) */ +{ + register sopno finish; +# define N 2 +# define INF 3 +# define REP(f, t) ((f)*8 + (t)) +# define MAP(n) (((n) <= 1) ? (n) : ((n) == INFINITY) ? INF : N) + register sopno copy; + + if (reclimit++ > RECLIMIT) + p->error = REG_ESPACE; + if (p->error) + return; + + finish = HERE(); + + assert(from <= to); + + switch (REP(MAP(from), MAP(to))) { + case REP(0, 0): /* must be user doing this */ + DROP(finish-start); /* drop the operand */ + break; + case REP(0, 1): /* as x{1,1}? */ + case REP(0, N): /* as x{1,n}? */ + case REP(0, INF): /* as x{1,}? */ + /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */ + INSERT(OCH_, start); /* offset is wrong... */ + repeat(p, start+1, 1, to, reclimit); + ASTERN(OOR1, start); + AHEAD(start); /* ... fix it */ + EMIT(OOR2, 0); + AHEAD(THERE()); + ASTERN(O_CH, THERETHERE()); + break; + case REP(1, 1): /* trivial case */ + /* done */ + break; + case REP(1, N): /* as x?x{1,n-1} */ + /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */ + INSERT(OCH_, start); + ASTERN(OOR1, start); + AHEAD(start); + EMIT(OOR2, 0); /* offset very wrong... */ + AHEAD(THERE()); /* ...so fix it */ + ASTERN(O_CH, THERETHERE()); + copy = dupl(p, start+1, finish+1); + assert(copy == finish+4); + repeat(p, copy, 1, to-1, reclimit); + break; + case REP(1, INF): /* as x+ */ + INSERT(OPLUS_, start); + ASTERN(O_PLUS, start); + break; + case REP(N, N): /* as xx{m-1,n-1} */ + copy = dupl(p, start, finish); + repeat(p, copy, from-1, to-1, reclimit); + break; + case REP(N, INF): /* as xx{n-1,INF} */ + copy = dupl(p, start, finish); + repeat(p, copy, from-1, to, reclimit); + break; + default: /* "can't happen" */ + SETERROR(REG_ASSERT); /* just in case */ + break; + } +} + +/* + - seterr - set an error condition + == static int seterr(register struct parse *p, int e); + */ +static int /* useless but makes type checking happy */ +seterr(register struct parse *p, int e) +{ + if (p->error == 0) /* keep earliest error condition */ + p->error = e; + p->next = nuls; /* try to bring things to a halt */ + p->end = nuls; + return(0); /* make the return value well-defined */ +} + +/* + - allocset - allocate a set of characters for [] + == static cset *allocset(register struct parse *p); + */ +static cset * +allocset(register struct parse *p) +{ + register int no = p->g->ncsets++; + register size_t nc; + register size_t nbytes; + register cset *cs; + register size_t css = (size_t)p->g->csetsize; + register int i; + + if (no >= p->ncsalloc) { /* need another column of space */ + p->ncsalloc += CHAR_BIT; + nc = p->ncsalloc; + assert(nc % CHAR_BIT == 0); + nbytes = nc / CHAR_BIT * css; + if (MEMSIZE(p) > MEMLIMIT) + goto oomem; + if (p->g->sets == NULL) + p->g->sets = (cset *)malloc(nc * sizeof(cset)); + else + p->g->sets = (cset *)realloc((char *)p->g->sets, + nc * sizeof(cset)); + if (p->g->setbits == NULL) + p->g->setbits = (uch *)malloc(nbytes); + else { + p->g->setbits = (uch *)realloc((char *)p->g->setbits, + nbytes); + /* xxx this isn't right if setbits is now NULL */ + for (i = 0; i < no; i++) + p->g->sets[i].ptr = p->g->setbits + css*(i/CHAR_BIT); + } + if (p->g->sets != NULL && p->g->setbits != NULL) + (void) memset((char *)p->g->setbits + (nbytes - css), + 0, css); + else { +oomem: + no = 0; + SETERROR(REG_ESPACE); + /* caller's responsibility not to do set ops */ + return NULL; + } + } + + cs = &p->g->sets[no]; + cs->ptr = p->g->setbits + css*((no)/CHAR_BIT); + cs->mask = 1 << ((no) % CHAR_BIT); + cs->hash = 0; + cs->smultis = 0; + cs->multis = NULL; + + return(cs); +} + +/* + - freeset - free a now-unused set + == static void freeset(register struct parse *p, register cset *cs); + */ +static void +freeset(register struct parse *p, register cset *cs) +{ + register size_t i; + register cset *top = &p->g->sets[p->g->ncsets]; + register size_t css = (size_t)p->g->csetsize; + + for (i = 0; i < css; i++) + CHsub(cs, i); + if (cs == top-1) /* recover only the easy case */ + p->g->ncsets--; +} + +/* + - freezeset - final processing on a set of characters + == static int freezeset(register struct parse *p, register cset *cs); + * + * The main task here is merging identical sets. This is usually a waste + * of time (although the hash code minimizes the overhead), but can win + * big if REG_ICASE is being used. REG_ICASE, by the way, is why the hash + * is done using addition rather than xor -- all ASCII [aA] sets xor to + * the same value! + */ +static int /* set number */ +freezeset(register struct parse *p, register cset *cs) +{ + register uch h = cs->hash; + register size_t i; + register cset *top = &p->g->sets[p->g->ncsets]; + register cset *cs2; + register size_t css = (size_t)p->g->csetsize; + + /* look for an earlier one which is the same */ + for (cs2 = &p->g->sets[0]; cs2 < top; cs2++) + if (cs2->hash == h && cs2 != cs) { + /* maybe */ + for (i = 0; i < css; i++) + if (!!CHIN(cs2, i) != !!CHIN(cs, i)) + break; /* no */ + if (i == css) + break; /* yes */ + } + + if (cs2 < top) { /* found one */ + freeset(p, cs); + cs = cs2; + } + + return((int)(cs - p->g->sets)); +} + +/* + - firstch - return first character in a set (which must have at least one) + == static int firstch(register struct parse *p, register cset *cs); + */ +static int /* character; there is no "none" value */ +firstch(register struct parse *p, register cset *cs) +{ + register size_t i; + register size_t css = (size_t)p->g->csetsize; + + for (i = 0; i < css; i++) + if (CHIN(cs, i)) + return((char)i); + assert(never); + return(0); /* arbitrary */ +} + +/* + - nch - number of characters in a set + == static int nch(register struct parse *p, register cset *cs); + */ +static int +nch(register struct parse *p, register cset *cs) +{ + register size_t i; + register size_t css = (size_t)p->g->csetsize; + register int n = 0; + + for (i = 0; i < css; i++) + if (CHIN(cs, i)) + n++; + return(n); +} + +/* + - mcadd - add a collating element to a cset + == static void mcadd(register struct parse *p, register cset *cs, \ + == register char *cp); + */ +static void +mcadd(register struct parse *p, register cset *cs, register const char *cp) +{ + register size_t oldend = cs->smultis; + void *np; + + cs->smultis += strlen(cp) + 1; + np = realloc(cs->multis, cs->smultis); + if (np == NULL) { + if (cs->multis) + free(cs->multis); + cs->multis = NULL; + SETERROR(REG_ESPACE); + return; + } + cs->multis = np; + + (void) strlcpy(cs->multis + oldend - 1, cp, cs->smultis - oldend + 1); +} + +#ifdef notdef +/* + - mcsub - subtract a collating element from a cset + == static void mcsub(register cset *cs, register char *cp); + */ +static void +mcsub(register cset *cs, register char *cp) +{ + register char *fp = mcfind(cs, cp); + register size_t len = strlen(fp); + + assert(fp != NULL); + (void) memmove(fp, fp + len + 1, + cs->smultis - (fp + len + 1 - cs->multis)); + cs->smultis -= len; + + if (cs->smultis == 0) { + free(cs->multis); + cs->multis = NULL; + return; + } + + cs->multis = realloc(cs->multis, cs->smultis); + assert(cs->multis != NULL); +} + +/* + - mcin - is a collating element in a cset? + == static int mcin(register cset *cs, register char *cp); + */ +static int +mcin(register cset *cs, register char *cp) +{ + return(mcfind(cs, cp) != NULL); +} + +/* + - mcfind - find a collating element in a cset + == static char *mcfind(register cset *cs, register char *cp); + */ +static char * +mcfind(register cset *cs, register char *cp) +{ + register char *p; + + if (cs->multis == NULL) + return(NULL); + for (p = cs->multis; *p != '\0'; p += strlen(p) + 1) + if (strcmp(cp, p) == 0) + return(p); + return(NULL); +} +#endif + +/* + - mcinvert - invert the list of collating elements in a cset + == static void mcinvert(register struct parse *p, register cset *cs); + * + * This would have to know the set of possibilities. Implementation + * is deferred. + */ +static void +mcinvert(register struct parse *p, register cset *cs) +{ + assert(cs->multis == NULL); /* xxx */ +} + +/* + - mccase - add case counterparts of the list of collating elements in a cset + == static void mccase(register struct parse *p, register cset *cs); + * + * This would have to know the set of possibilities. Implementation + * is deferred. + */ +static void +mccase(register struct parse *p, register cset *cs) +{ + assert(cs->multis == NULL); /* xxx */ +} + +#ifdef notdef +/* + - isinsets - is this character in any sets? + == static int isinsets(register struct re_guts *g, int c); + */ +static int /* predicate */ +isinsets(register struct re_guts *g, int c) +{ + register uch *col; + register int i; + register int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT; + register unsigned uc = (unsigned char)c; + + for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize) + if (col[uc] != 0) + return(1); + return(0); +} + +/* + - samesets - are these two characters in exactly the same sets? + == static int samesets(register struct re_guts *g, int c1, int c2); + */ +static int /* predicate */ +samesets(register struct re_guts *g, int c1, int c2) +{ + register uch *col; + register int i; + register int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT; + register unsigned uc1 = (unsigned char)c1; + register unsigned uc2 = (unsigned char)c2; + + for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize) + if (col[uc1] != col[uc2]) + return(0); + return(1); +} +#endif + +/* + - categorize - sort out character categories + == static void categorize(struct parse *p, register struct re_guts *g); + */ +static void +categorize(struct parse *p, register struct re_guts *g) +{ +#ifdef notdef + register cat_t *cats = g->categories; + register int c; + register int c2; + register cat_t cat; + + /* avoid making error situations worse */ + if (p->error != 0) + return; + + for (c = CHAR_MIN; c <= CHAR_MAX; c++) + if (cats[c] == 0 && isinsets(g, c)) { + cat = g->ncategories++; + cats[c] = cat; + for (c2 = c+1; c2 <= CHAR_MAX; c2++) + if (cats[c2] == 0 && samesets(g, c, c2)) + cats[c2] = cat; + } +#endif +} + +/* + - dupl - emit a duplicate of a bunch of sops + == static sopno dupl(register struct parse *p, sopno start, sopno finish); + */ +static sopno /* start of duplicate */ +dupl(register struct parse *p, sopno start, sopno finish) + + /* from here */ + /* to this less one */ +{ + register sopno ret = HERE(); + register sopno len = finish - start; + + assert(finish >= start); + if (len == 0) + return(ret); + if (!enlarge(p, p->ssize + len)) /* this many unexpected additions */ + return ret; + assert(p->ssize >= p->slen + len); + (void) memcpy((char *)(p->strip + p->slen), + (char *)(p->strip + start), (size_t)len*sizeof(sop)); + (void) memcpy((char *)(p->stripdata + p->slen), + (char *)(p->stripdata + start), (size_t)len*sizeof(RCHAR_T)); + p->slen += len; + return(ret); +} + +/* + - doemit - emit a strip operator + == static void doemit(register struct parse *p, sop op, size_t opnd); + * + * It might seem better to implement this as a macro with a function as + * hard-case backup, but it's just too big and messy unless there are + * some changes to the data structures. Maybe later. + */ +static void +doemit(register struct parse *p, sop op, size_t opnd) +{ + /* avoid making error situations worse */ + if (p->error != 0) + return; + + /* deal with oversize operands ("can't happen", more or less) */ + assert(opnd < 1); + + /* deal with undersized strip */ + if (p->slen >= p->ssize) + if (!enlarge(p, (p->ssize+1) / 2 * 3)) /* +50% */ + return; + + /* finally, it's all reduced to the easy case */ + p->strip[p->slen] = op; + p->stripdata[p->slen] = opnd; + p->slen++; +} + +/* + - doinsert - insert a sop into the strip + == static void doinsert(register struct parse *p, sop op, size_t opnd, sopno pos); + */ +static void +doinsert(register struct parse *p, sop op, size_t opnd, sopno pos) +{ + register sopno sn; + register sop s; + register RCHAR_T d; + register int i; + + /* avoid making error situations worse */ + if (p->error != 0) + return; + + sn = HERE(); + EMIT(op, opnd); /* do checks, ensure space */ + assert(HERE() == sn+1); + s = p->strip[sn]; + d = p->stripdata[sn]; + + /* adjust paren pointers */ + assert(pos > 0); + for (i = 1; i < NPAREN; i++) { + if (p->pbegin[i] >= pos) { + p->pbegin[i]++; + } + if (p->pend[i] >= pos) { + p->pend[i]++; + } + } + + memmove((char *)&p->strip[pos+1], (char *)&p->strip[pos], + (HERE()-pos-1)*sizeof(sop)); + memmove((char *)&p->stripdata[pos+1], (char *)&p->stripdata[pos], + (HERE()-pos-1)*sizeof(RCHAR_T)); + p->strip[pos] = s; + p->stripdata[pos] = d; +} + +/* + - dofwd - complete a forward reference + == static void dofwd(register struct parse *p, sopno pos, sop value); + */ +static void +dofwd(register struct parse *p, register sopno pos, sop value) +{ + /* avoid making error situations worse */ + if (p->error != 0) + return; + + assert(value < 1); + p->stripdata[pos] = value; +} + +/* + - enlarge - enlarge the strip + == static int enlarge(register struct parse *p, sopno size); + */ +static int +enlarge(register struct parse *p, register sopno size) +{ + register sop *sp; + register RCHAR_T *dp; + sopno osize; + + if (p->ssize >= size) + return 1; + + osize = p->ssize; + p->ssize = size; + if (MEMSIZE(p) > MEMLIMIT) + goto oomem; + sp = realloc(p->strip, p->ssize * sizeof(sop)); + if (sp == NULL) + goto oomem; + p->strip = sp; + dp = realloc(p->stripdata, p->ssize * sizeof(RCHAR_T)); + if (dp == NULL) { +oomem: + p->ssize = osize; + SETERROR(REG_ESPACE); + return 0; + } + p->stripdata = dp; + return 1; +} + +/* + - stripsnug - compact the strip + == static void stripsnug(register struct parse *p, register struct re_guts *g); + */ +static void +stripsnug(register struct parse *p, register struct re_guts *g) +{ + g->nstates = p->slen; + g->strip = (sop *)realloc((char *)p->strip, + p->slen * sizeof(sop)); + if (g->strip == NULL) { + SETERROR(REG_ESPACE); + g->strip = p->strip; + } + g->stripdata = (RCHAR_T *)realloc((char *)p->stripdata, + p->slen * sizeof(RCHAR_T)); + if (g->stripdata == NULL) { + SETERROR(REG_ESPACE); + g->stripdata = p->stripdata; + } +} + +/* + - findmust - fill in must and mlen with longest mandatory literal string + == static void findmust(register struct parse *p, register struct re_guts *g); + * + * This algorithm could do fancy things like analyzing the operands of | + * for common subsequences. Someday. This code is simple and finds most + * of the interesting cases. + * + * Note that must and mlen got initialized during setup. + */ +static void +findmust(struct parse *p, register struct re_guts *g) +{ + register sop *scans; + register RCHAR_T *scand; + sop *starts = 0; + RCHAR_T *startd = NULL; + register sop *newstarts = 0; + register RCHAR_T *newstartd = NULL; + register sopno newlen; + register sop s; + register RCHAR_T d; + register RCHAR_T *cp; + register sopno i; + + /* avoid making error situations worse */ + if (p->error != 0) + return; + + /* find the longest OCHAR sequence in strip */ + newlen = 0; + scans = g->strip + 1; + scand = g->stripdata + 1; + do { + s = *scans++; + d = *scand++; + switch (s) { + case OCHAR: /* sequence member */ + if (newlen == 0) { /* new sequence */ + newstarts = scans - 1; + newstartd = scand - 1; + } + newlen++; + break; + case OPLUS_: /* things that don't break one */ + case OLPAREN: + case ORPAREN: + break; + case OQUEST_: /* things that must be skipped */ + case OCH_: + scans--; + scand--; + do { + scans += d; + scand += d; + s = *scans; + d = *scand; + /* assert() interferes w debug printouts */ + if (s != O_QUEST && s != O_CH && s != OOR2) { + g->iflags |= BAD; + return; + } + } while (s != O_QUEST && s != O_CH); + /* fallthrough */ + default: /* things that break a sequence */ + if (newlen > g->mlen) { /* ends one */ + starts = newstarts; + startd = newstartd; + g->mlen = newlen; + } + newlen = 0; + break; + } + } while (s != OEND); + + if (g->mlen == 0) /* there isn't one */ + return; + + /* turn it into a character string */ + g->must = malloc(((size_t)g->mlen + 1) * sizeof(RCHAR_T)); + if (g->must == NULL) { /* argh; just forget it */ + g->mlen = 0; + return; + } + cp = g->must; + scans = starts; + scand = startd; + for (i = g->mlen; i > 0; i--) { + for (;;) { + s = *scans++; + d = *scand++; + if (s == OCHAR) + break; + } + assert(cp < g->must + g->mlen); + *cp++ = d; + } + assert(cp == g->must + g->mlen); + *cp++ = '\0'; /* just on general principles */ +} + +/* + - pluscount - count + nesting + == static sopno pluscount(register struct parse *p, register struct re_guts *g); + */ +static sopno /* nesting depth */ +pluscount(struct parse *p, register struct re_guts *g) +{ + register sop *scan; + register sop s; + register sopno plusnest = 0; + register sopno maxnest = 0; + + if (p->error != 0) + return(0); /* there may not be an OEND */ + + scan = g->strip + 1; + do { + s = *scan++; + switch (s) { + case OPLUS_: + plusnest++; + break; + case O_PLUS: + if (plusnest > maxnest) + maxnest = plusnest; + plusnest--; + break; + } + } while (s != OEND); + if (plusnest != 0) + g->iflags |= BAD; + return(maxnest); +} diff --git a/regex/regerror.c b/regex/regerror.c new file mode 100644 index 000000000000..5ff1f6b67b21 --- /dev/null +++ b/regex/regerror.c @@ -0,0 +1,176 @@ +/* $NetBSD: regerror.c,v 1.2 2008/12/05 22:51:43 christos Exp $ */ + +/*- + * Copyright (c) 1992, 1993, 1994 Henry Spencer. + * Copyright (c) 1992, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Henry Spencer of the University of Toronto. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)regerror.c 8.3 (Berkeley) 3/19/94 + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)regerror.c 8.3 (Berkeley) 3/19/94"; +#endif /* LIBC_SCCS and not lint */ + +#include +#include +#include +#include +#include +#include +#include + +#include "utils.h" + +/* ========= begin header generated by ./mkh ========= */ +#ifdef __cplusplus +extern "C" { +#endif + +/* === regerror.c === */ +static char *regatoi __P((const regex_t *preg, char *localbuf)); + +#ifdef __cplusplus +} +#endif +/* ========= end header generated by ./mkh ========= */ +/* + = #define REG_NOMATCH 1 + = #define REG_BADPAT 2 + = #define REG_ECOLLATE 3 + = #define REG_ECTYPE 4 + = #define REG_EESCAPE 5 + = #define REG_ESUBREG 6 + = #define REG_EBRACK 7 + = #define REG_EPAREN 8 + = #define REG_EBRACE 9 + = #define REG_BADBR 10 + = #define REG_ERANGE 11 + = #define REG_ESPACE 12 + = #define REG_BADRPT 13 + = #define REG_EMPTY 14 + = #define REG_ASSERT 15 + = #define REG_INVARG 16 + = #define REG_ATOI 255 // convert name to number (!) + = #define REG_ITOA 0400 // convert number to name (!) + */ +static struct rerr { + int code; + const char *name; + const char *explain; +} rerrs[] = { + { REG_NOMATCH, "REG_NOMATCH", "regexec() failed to match" }, + { REG_BADPAT, "REG_BADPAT", "invalid regular expression" }, + { REG_ECOLLATE, "REG_ECOLLATE", "invalid collating element" }, + { REG_ECTYPE, "REG_ECTYPE", "invalid character class" }, + { REG_EESCAPE, "REG_EESCAPE", "trailing backslash (\\)" }, + { REG_ESUBREG, "REG_ESUBREG", "invalid backreference number" }, + { REG_EBRACK, "REG_EBRACK", "brackets ([ ]) not balanced" }, + { REG_EPAREN, "REG_EPAREN", "parentheses not balanced" }, + { REG_EBRACE, "REG_EBRACE", "braces not balanced" }, + { REG_BADBR, "REG_BADBR", "invalid repetition count(s)" }, + { REG_ERANGE, "REG_ERANGE", "invalid character range" }, + { REG_ESPACE, "REG_ESPACE", "out of memory" }, + { REG_BADRPT, "REG_BADRPT", "repetition-operator operand invalid" }, + { REG_EMPTY, "REG_EMPTY", "empty (sub)expression" }, + { REG_ASSERT, "REG_ASSERT", "\"can't happen\" -- you found a bug" }, + { REG_INVARG, "REG_INVARG", "invalid argument to regex routine" }, + { 0, "", "*** unknown regexp error code ***" }, +}; + +/* + - regerror - the interface to error numbers + = extern size_t regerror(int, const regex_t *, char *, size_t); + */ +/* ARGSUSED */ +size_t +regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size) +{ + register struct rerr *r; + register size_t len; + register int target = errcode &~ REG_ITOA; + register const char *s; + char convbuf[50]; + + if (errcode == REG_ATOI) + s = regatoi(preg, convbuf); + else { + for (r = rerrs; r->code != 0; r++) + if (r->code == target) + break; + + if (errcode®_ITOA) { + if (r->code != 0) { + assert(strlen(r->name) < sizeof(convbuf)); + (void) strlcpy(convbuf, r->name, sizeof(convbuf)); + } else + (void) snprintf(convbuf, sizeof(convbuf), + "REG_0x%x", target); + s = convbuf; + } else + s = r->explain; + } + + len = strlen(s) + 1; + if (errbuf_size > 0) { + (void) strlcpy(errbuf, s, errbuf_size); + } + + return(len); +} + +/* + - regatoi - internal routine to implement REG_ATOI + == static char *regatoi(const regex_t *preg, char *localbuf); + */ +static char * +regatoi(const regex_t *preg, char *localbuf) +{ +#if 0 /* we don't seem to use this and it gives a warning. */ + register struct rerr *r; + register size_t siz; + register char *p; + + for (r = rerrs; r->code != 0; r++) + if (strcmp(r->name, preg->re_endp) == 0) + break; + if (r->code == 0) + return("0"); + + sprintf(localbuf, "%d", r->code); +#else + *localbuf = '\0'; +#endif + return(localbuf); +} diff --git a/regex/regex.3 b/regex/regex.3 new file mode 100644 index 000000000000..2c17254c1a16 --- /dev/null +++ b/regex/regex.3 @@ -0,0 +1,540 @@ +.\" $NetBSD: regex.3,v 1.1.1.2 2008/05/18 14:31:38 aymeric Exp $ +.\" +.\" Copyright (c) 1992, 1993, 1994 Henry Spencer. +.\" Copyright (c) 1992, 1993, 1994 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" This code is derived from software contributed to Berkeley by +.\" Henry Spencer of the University of Toronto. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)regex.3 8.2 (Berkeley) 3/16/94 +.\" +.TH REGEX 3 "March 16, 1994" +.de ZR +.\" one other place knows this name: the SEE ALSO section +.IR re_format (7) \\$1 +.. +.SH NAME +regcomp, regexec, regerror, regfree \- regular-expression library +.SH SYNOPSIS +.ft B +.\".na +#include +.br +#include +.HP 10 +int regcomp(regex_t\ *preg, const\ char\ *pattern, int\ cflags); +.HP +int\ regexec(const\ regex_t\ *preg, const\ char\ *string, +size_t\ nmatch, regmatch_t\ pmatch[], int\ eflags); +.HP +size_t\ regerror(int\ errcode, const\ regex_t\ *preg, +char\ *errbuf, size_t\ errbuf_size); +.HP +void\ regfree(regex_t\ *preg); +.\".ad +.ft +.SH DESCRIPTION +These routines implement POSIX 1003.2 regular expressions (``RE''s); +see +.ZR . +.I Regcomp +compiles an RE written as a string into an internal form, +.I regexec +matches that internal form against a string and reports results, +.I regerror +transforms error codes from either into human-readable messages, +and +.I regfree +frees any dynamically-allocated storage used by the internal form +of an RE. +.PP +The header +.I +declares two structure types, +.I regex_t +and +.IR regmatch_t , +the former for compiled internal forms and the latter for match reporting. +It also declares the four functions, +a type +.IR regoff_t , +and a number of constants with names starting with ``REG_''. +.PP +.I Regcomp +compiles the regular expression contained in the +.I pattern +string, +subject to the flags in +.IR cflags , +and places the results in the +.I regex_t +structure pointed to by +.IR preg . +.I Cflags +is the bitwise OR of zero or more of the following flags: +.IP REG_EXTENDED \w'REG_EXTENDED'u+2n +Compile modern (``extended'') REs, +rather than the obsolete (``basic'') REs that +are the default. +.IP REG_BASIC +This is a synonym for 0, +provided as a counterpart to REG_EXTENDED to improve readability. +.IP REG_NOSPEC +Compile with recognition of all special characters turned off. +All characters are thus considered ordinary, +so the ``RE'' is a literal string. +This is an extension, +compatible with but not specified by POSIX 1003.2, +and should be used with +caution in software intended to be portable to other systems. +REG_EXTENDED and REG_NOSPEC may not be used +in the same call to +.IR regcomp . +.IP REG_ICASE +Compile for matching that ignores upper/lower case distinctions. +See +.ZR . +.IP REG_NOSUB +Compile for matching that need only report success or failure, +not what was matched. +.IP REG_NEWLINE +Compile for newline-sensitive matching. +By default, newline is a completely ordinary character with no special +meaning in either REs or strings. +With this flag, +`[^' bracket expressions and `.' never match newline, +a `^' anchor matches the null string after any newline in the string +in addition to its normal function, +and the `$' anchor matches the null string before any newline in the +string in addition to its normal function. +.IP REG_PEND +The regular expression ends, +not at the first NUL, +but just before the character pointed to by the +.I re_endp +member of the structure pointed to by +.IR preg . +The +.I re_endp +member is of type +.IR const\ char\ * . +This flag permits inclusion of NULs in the RE; +they are considered ordinary characters. +This is an extension, +compatible with but not specified by POSIX 1003.2, +and should be used with +caution in software intended to be portable to other systems. +.PP +When successful, +.I regcomp +returns 0 and fills in the structure pointed to by +.IR preg . +One member of that structure +(other than +.IR re_endp ) +is publicized: +.IR re_nsub , +of type +.IR size_t , +contains the number of parenthesized subexpressions within the RE +(except that the value of this member is undefined if the +REG_NOSUB flag was used). +If +.I regcomp +fails, it returns a non-zero error code; +see DIAGNOSTICS. +.PP +.I Regexec +matches the compiled RE pointed to by +.I preg +against the +.IR string , +subject to the flags in +.IR eflags , +and reports results using +.IR nmatch , +.IR pmatch , +and the returned value. +The RE must have been compiled by a previous invocation of +.IR regcomp . +The compiled form is not altered during execution of +.IR regexec , +so a single compiled RE can be used simultaneously by multiple threads. +.PP +By default, +the NUL-terminated string pointed to by +.I string +is considered to be the text of an entire line, minus any terminating +newline. +The +.I eflags +argument is the bitwise OR of zero or more of the following flags: +.IP REG_NOTBOL \w'REG_STARTEND'u+2n +The first character of +the string +is not the beginning of a line, so the `^' anchor should not match before it. +This does not affect the behavior of newlines under REG_NEWLINE. +.IP REG_NOTEOL +The NUL terminating +the string +does not end a line, so the `$' anchor should not match before it. +This does not affect the behavior of newlines under REG_NEWLINE. +.IP REG_STARTEND +The string is considered to start at +\fIstring\fR\ + \fIpmatch\fR[0].\fIrm_so\fR +and to have a terminating NUL located at +\fIstring\fR\ + \fIpmatch\fR[0].\fIrm_eo\fR +(there need not actually be a NUL at that location), +regardless of the value of +.IR nmatch . +See below for the definition of +.IR pmatch +and +.IR nmatch . +This is an extension, +compatible with but not specified by POSIX 1003.2, +and should be used with +caution in software intended to be portable to other systems. +Note that a non-zero \fIrm_so\fR does not imply REG_NOTBOL; +REG_STARTEND affects only the location of the string, +not how it is matched. +.PP +See +.ZR +for a discussion of what is matched in situations where an RE or a +portion thereof could match any of several substrings of +.IR string . +.PP +Normally, +.I regexec +returns 0 for success and the non-zero code REG_NOMATCH for failure. +Other non-zero error codes may be returned in exceptional situations; +see DIAGNOSTICS. +.PP +If REG_NOSUB was specified in the compilation of the RE, +or if +.I nmatch +is 0, +.I regexec +ignores the +.I pmatch +argument (but see below for the case where REG_STARTEND is specified). +Otherwise, +.I pmatch +points to an array of +.I nmatch +structures of type +.IR regmatch_t . +Such a structure has at least the members +.I rm_so +and +.IR rm_eo , +both of type +.I regoff_t +(a signed arithmetic type at least as large as an +.I off_t +and a +.IR ssize_t ), +containing respectively the offset of the first character of a substring +and the offset of the first character after the end of the substring. +Offsets are measured from the beginning of the +.I string +argument given to +.IR regexec . +An empty substring is denoted by equal offsets, +both indicating the character following the empty substring. +.PP +The 0th member of the +.I pmatch +array is filled in to indicate what substring of +.I string +was matched by the entire RE. +Remaining members report what substring was matched by parenthesized +subexpressions within the RE; +member +.I i +reports subexpression +.IR i , +with subexpressions counted (starting at 1) by the order of their opening +parentheses in the RE, left to right. +Unused entries in the array\(emcorresponding either to subexpressions that +did not participate in the match at all, or to subexpressions that do not +exist in the RE (that is, \fIi\fR\ > \fIpreg\fR\->\fIre_nsub\fR)\(emhave both +.I rm_so +and +.I rm_eo +set to \-1. +If a subexpression participated in the match several times, +the reported substring is the last one it matched. +(Note, as an example in particular, that when the RE `(b*)+' matches `bbb', +the parenthesized subexpression matches each of the three `b's and then +an infinite number of empty strings following the last `b', +so the reported substring is one of the empties.) +.PP +If REG_STARTEND is specified, +.I pmatch +must point to at least one +.I regmatch_t +(even if +.I nmatch +is 0 or REG_NOSUB was specified), +to hold the input offsets for REG_STARTEND. +Use for output is still entirely controlled by +.IR nmatch ; +if +.I nmatch +is 0 or REG_NOSUB was specified, +the value of +.IR pmatch [0] +will not be changed by a successful +.IR regexec . +.PP +.I Regerror +maps a non-zero +.I errcode +from either +.I regcomp +or +.I regexec +to a human-readable, printable message. +If +.I preg +is non-NULL, +the error code should have arisen from use of +the +.I regex_t +pointed to by +.IR preg , +and if the error code came from +.IR regcomp , +it should have been the result from the most recent +.I regcomp +using that +.IR regex_t . +.RI ( Regerror +may be able to supply a more detailed message using information +from the +.IR regex_t .) +.I Regerror +places the NUL-terminated message into the buffer pointed to by +.IR errbuf , +limiting the length (including the NUL) to at most +.I errbuf_size +bytes. +If the whole message won't fit, +as much of it as will fit before the terminating NUL is supplied. +In any case, +the returned value is the size of buffer needed to hold the whole +message (including terminating NUL). +If +.I errbuf_size +is 0, +.I errbuf +is ignored but the return value is still correct. +.PP +If the +.I errcode +given to +.I regerror +is first ORed with REG_ITOA, +the ``message'' that results is the printable name of the error code, +e.g. ``REG_NOMATCH'', +rather than an explanation thereof. +If +.I errcode +is REG_ATOI, +then +.I preg +shall be non-NULL and the +.I re_endp +member of the structure it points to +must point to the printable name of an error code; +in this case, the result in +.I errbuf +is the decimal digits of +the numeric value of the error code +(0 if the name is not recognized). +REG_ITOA and REG_ATOI are intended primarily as debugging facilities; +they are extensions, +compatible with but not specified by POSIX 1003.2, +and should be used with +caution in software intended to be portable to other systems. +Be warned also that they are considered experimental and changes are possible. +.PP +.I Regfree +frees any dynamically-allocated storage associated with the compiled RE +pointed to by +.IR preg . +The remaining +.I regex_t +is no longer a valid compiled RE +and the effect of supplying it to +.I regexec +or +.I regerror +is undefined. +.PP +None of these functions references global variables except for tables +of constants; +all are safe for use from multiple threads if the arguments are safe. +.SH IMPLEMENTATION CHOICES +There are a number of decisions that 1003.2 leaves up to the implementor, +either by explicitly saying ``undefined'' or by virtue of them being +forbidden by the RE grammar. +This implementation treats them as follows. +.PP +See +.ZR +for a discussion of the definition of case-independent matching. +.PP +There is no particular limit on the length of REs, +except insofar as memory is limited. +Memory usage is approximately linear in RE size, and largely insensitive +to RE complexity, except for bounded repetitions. +See BUGS for one short RE using them +that will run almost any system out of memory. +.PP +A backslashed character other than one specifically given a magic meaning +by 1003.2 (such magic meanings occur only in obsolete [``basic''] REs) +is taken as an ordinary character. +.PP +Any unmatched [ is a REG_EBRACK error. +.PP +Equivalence classes cannot begin or end bracket-expression ranges. +The endpoint of one range cannot begin another. +.PP +RE_DUP_MAX, the limit on repetition counts in bounded repetitions, is 255. +.PP +A repetition operator (?, *, +, or bounds) cannot follow another +repetition operator. +A repetition operator cannot begin an expression or subexpression +or follow `^' or `|'. +.PP +`|' cannot appear first or last in a (sub)expression or after another `|', +i.e. an operand of `|' cannot be an empty subexpression. +An empty parenthesized subexpression, `()', is legal and matches an +empty (sub)string. +An empty string is not a legal RE. +.PP +A `{' followed by a digit is considered the beginning of bounds for a +bounded repetition, which must then follow the syntax for bounds. +A `{' \fInot\fR followed by a digit is considered an ordinary character. +.PP +`^' and `$' beginning and ending subexpressions in obsolete (``basic'') +REs are anchors, not ordinary characters. +.SH SEE ALSO +grep(1), re_format(7) +.PP +POSIX 1003.2, sections 2.8 (Regular Expression Notation) +and +B.5 (C Binding for Regular Expression Matching). +.SH DIAGNOSTICS +Non-zero error codes from +.I regcomp +and +.I regexec +include the following: +.PP +.nf +.ta \w'REG_ECOLLATE'u+3n +REG_NOMATCH regexec() failed to match +REG_BADPAT invalid regular expression +REG_ECOLLATE invalid collating element +REG_ECTYPE invalid character class +REG_EESCAPE \e applied to unescapable character +REG_ESUBREG invalid backreference number +REG_EBRACK brackets [ ] not balanced +REG_EPAREN parentheses ( ) not balanced +REG_EBRACE braces { } not balanced +REG_BADBR invalid repetition count(s) in { } +REG_ERANGE invalid character range in [ ] +REG_ESPACE ran out of memory +REG_BADRPT ?, *, or + operand invalid +REG_EMPTY empty (sub)expression +REG_ASSERT ``can't happen''\(emyou found a bug +REG_INVARG invalid argument, e.g. negative-length string +.fi +.SH HISTORY +Originally written by Henry Spencer at University of Toronto. +Altered for inclusion in the 4.4BSD distribution. +.SH BUGS +This is an alpha release with known defects. +Please report problems. +.PP +There is one known functionality bug. +The implementation of internationalization is incomplete: +the locale is always assumed to be the default one of 1003.2, +and only the collating elements etc. of that locale are available. +.PP +The back-reference code is subtle and doubts linger about its correctness +in complex cases. +.PP +.I Regexec +performance is poor. +This will improve with later releases. +.I Nmatch +exceeding 0 is expensive; +.I nmatch +exceeding 1 is worse. +.I Regexec +is largely insensitive to RE complexity \fIexcept\fR that back +references are massively expensive. +RE length does matter; in particular, there is a strong speed bonus +for keeping RE length under about 30 characters, +with most special characters counting roughly double. +.PP +.I Regcomp +implements bounded repetitions by macro expansion, +which is costly in time and space if counts are large +or bounded repetitions are nested. +An RE like, say, +`((((a{1,100}){1,100}){1,100}){1,100}){1,100}' +will (eventually) run almost any existing machine out of swap space. +.PP +There are suspected problems with response to obscure error conditions. +Notably, +certain kinds of internal overflow, +produced only by truly enormous REs or by multiply nested bounded repetitions, +are probably not handled well. +.PP +Due to a mistake in 1003.2, things like `a)b' are legal REs because `)' is +a special character only in the presence of a previous unmatched `('. +This can't be fixed until the spec is fixed. +.PP +The standard's definition of back references is vague. +For example, does +`a\e(\e(b\e)*\e2\e)*d' match `abbbd'? +Until the standard is clarified, +behavior in such cases should not be relied on. +.PP +The implementation of word-boundary matching is a bit of a kludge, +and bugs may lurk in combinations of word-boundary matching and anchoring. diff --git a/regex/regex.h b/regex/regex.h new file mode 100644 index 000000000000..cabd66b0528a --- /dev/null +++ b/regex/regex.h @@ -0,0 +1,109 @@ +/* $NetBSD: regex.h,v 1.1.1.2 2008/05/18 14:31:38 aymeric Exp $ */ + +/*- + * Copyright (c) 1992 Henry Spencer. + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Henry Spencer of the University of Toronto. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)regex.h 8.1 (Berkeley) 6/2/93 + */ + +#ifndef _REGEX_H_ +#define _REGEX_H_ + +#ifdef __REGEX_PRIVATE +#include "config.h" +#include "../common/multibyte.h" +#endif + +/* types */ +typedef off_t regoff_t; + +typedef struct { + int re_magic; + size_t re_nsub; /* number of parenthesized subexpressions */ + const RCHAR_T *re_endp; /* end pointer for REG_PEND */ + struct re_guts *re_g; /* none of your business :-) */ +} regex_t; + +typedef struct { + regoff_t rm_so; /* start of match */ + regoff_t rm_eo; /* end of match */ +} regmatch_t; + +/* regcomp() flags */ +#define REG_BASIC 0000 +#define REG_EXTENDED 0001 +#define REG_ICASE 0002 +#define REG_NOSUB 0004 +#define REG_NEWLINE 0010 +#define REG_NOSPEC 0020 +#define REG_PEND 0040 +#define REG_DUMP 0200 + +/* regerror() flags */ +#define REG_NOMATCH 1 +#define REG_BADPAT 2 +#define REG_ECOLLATE 3 +#define REG_ECTYPE 4 +#define REG_EESCAPE 5 +#define REG_ESUBREG 6 +#define REG_EBRACK 7 +#define REG_EPAREN 8 +#define REG_EBRACE 9 +#define REG_BADBR 10 +#define REG_ERANGE 11 +#define REG_ESPACE 12 +#define REG_BADRPT 13 +#define REG_EMPTY 14 +#define REG_ASSERT 15 +#define REG_INVARG 16 +#define REG_ATOI 255 /* convert name to number (!) */ +#define REG_ITOA 0400 /* convert number to name (!) */ + +/* regexec() flags */ +#define REG_NOTBOL 00001 +#define REG_NOTEOL 00002 +#define REG_STARTEND 00004 +#define REG_TRACE 00400 /* tracing of execution */ +#define REG_LARGE 01000 /* force large representation */ +#define REG_BACKR 02000 /* force use of backref code */ + +int regcomp __P((regex_t *, const RCHAR_T *, int)); +size_t regerror __P((int, const regex_t *, char *, size_t)); +int regexec __P((const regex_t *, + const RCHAR_T *, size_t, regmatch_t [], int)); +void regfree __P((regex_t *)); + +#endif /* !_REGEX_H_ */ diff --git a/regex/regex2.h b/regex/regex2.h new file mode 100644 index 000000000000..7c9352831c28 --- /dev/null +++ b/regex/regex2.h @@ -0,0 +1,174 @@ +/* $NetBSD: regex2.h,v 1.5 2011/11/23 15:43:39 tnozaki Exp $ */ + +/*- + * Copyright (c) 1992, 1993, 1994 Henry Spencer. + * Copyright (c) 1992, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Henry Spencer of the University of Toronto. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)regex2.h 8.3 (Berkeley) 3/16/94 + */ + +/* + * First, the stuff that ends up in the outside-world include file + = typedef off_t regoff_t; + = typedef struct { + = int re_magic; + = size_t re_nsub; // number of parenthesized subexpressions + = const char *re_endp; // end pointer for REG_PEND + = struct re_guts *re_g; // none of your business :-) + = } regex_t; + = typedef struct { + = regoff_t rm_so; // start of match + = regoff_t rm_eo; // end of match + = } regmatch_t; + */ +/* + * internals of regex_t + */ +#define MAGIC1 ((('r'^0200)<<8) | 'e') + +/* + * The internal representation is a *strip*, a sequence of + * operators ending with an endmarker. (Some terminology etc. is a + * historical relic of earlier versions which used multiple strips.) + * Certain oddities in the representation are there to permit running + * the machinery backwards; in particular, any deviation from sequential + * flow must be marked at both its source and its destination. Some + * fine points: + * + * - OPLUS_ and O_PLUS are *inside* the loop they create. + * - OQUEST_ and O_QUEST are *outside* the bypass they create. + * - OCH_ and O_CH are *outside* the multi-way branch they create, while + * OOR1 and OOR2 are respectively the end and the beginning of one of + * the branches. Note that there is an implicit OOR2 following OCH_ + * and an implicit OOR1 preceding O_CH. + * + * In state representations, an operator's bit is on to signify a state + * immediately *preceding* "execution" of that operator. + */ +typedef char sop; /* strip operator */ +typedef size_t sopno; +/* operators meaning operand */ +/* (back, fwd are offsets) */ +#define OEND (1) /* endmarker - */ +#define OCHAR (2) /* character unsigned char */ +#define OBOL (3) /* left anchor - */ +#define OEOL (4) /* right anchor - */ +#define OANY (5) /* . - */ +#define OANYOF (6) /* [...] set number */ +#define OBACK_ (7) /* begin \d paren number */ +#define O_BACK (8) /* end \d paren number */ +#define OPLUS_ (9) /* + prefix fwd to suffix */ +#define O_PLUS (10) /* + suffix back to prefix */ +#define OQUEST_ (11) /* ? prefix fwd to suffix */ +#define O_QUEST (12) /* ? suffix back to prefix */ +#define OLPAREN (13) /* ( fwd to ) */ +#define ORPAREN (14) /* ) back to ( */ +#define OCH_ (15) /* begin choice fwd to OOR2 */ +#define OOR1 (16) /* | pt. 1 back to OOR1 or OCH_ */ +#define OOR2 (17) /* | pt. 2 fwd to OOR2 or O_CH */ +#define O_CH (18) /* end choice back to OOR1 */ +#define OBOW (19) /* begin word - */ +#define OEOW (20) /* end word - */ + +/* + * Structure for [] character-set representation. Character sets are + * done as bit vectors, grouped 8 to a byte vector for compactness. + * The individual set therefore has both a pointer to the byte vector + * and a mask to pick out the relevant bit of each byte. A hash code + * simplifies testing whether two sets could be identical. + * + * This will get trickier for multicharacter collating elements. As + * preliminary hooks for dealing with such things, we also carry along + * a string of multi-character elements, and decide the size of the + * vectors at run time. + */ +typedef struct { + uch *ptr; /* -> uch [csetsize] */ + uch mask; /* bit within array */ + uch hash; /* hash code */ + size_t smultis; + char *multis; /* -> char[smulti] ab\0cd\0ef\0\0 */ +} cset; +/* note that CHadd and CHsub are unsafe, and CHIN doesn't yield 0/1 */ +#define CHadd(cs, c) ((cs)->ptr[(uch)(c)] |= (cs)->mask, (cs)->hash += (c)) +#define CHsub(cs, c) ((cs)->ptr[(uch)(c)] &= ~(cs)->mask, (cs)->hash -= (c)) +#define CHIN(cs, c) ((cs)->ptr[(uch)(c)] & (cs)->mask) +#define MCadd(p, cs, cp) mcadd(p, cs, cp) /* regcomp() internal fns */ +#define MCsub(p, cs, cp) mcsub(p, cs, cp) +#define MCin(p, cs, cp) mcin(p, cs, cp) + +/* stuff for character categories */ +typedef RCHAR_T cat_t; + +/* + * main compiled-expression structure + */ +struct re_guts { + int magic; +# define MAGIC2 ((('R'^0200)<<8)|'E') + sop *strip; /* malloced area for strip */ + RCHAR_T *stripdata; /* malloced area for stripdata */ + size_t csetsize; /* number of bits in a cset vector */ + size_t ncsets; /* number of csets in use */ + cset *sets; /* -> cset [ncsets] */ + uch *setbits; /* -> uch[csetsize][ncsets/CHAR_BIT] */ + int cflags; /* copy of regcomp() cflags argument */ + sopno nstates; /* = number of sops */ + sopno firststate; /* the initial OEND (normally 0) */ + sopno laststate; /* the final OEND */ + int iflags; /* internal flags */ +# define USEBOL 01 /* used ^ */ +# define USEEOL 02 /* used $ */ +# define BAD 04 /* something wrong */ + size_t nbol; /* number of ^ used */ + size_t neol; /* number of $ used */ +#if 0 + size_t ncategories; /* how many character categories */ + cat_t *categories; /* ->catspace[-CHAR_MIN] */ +#endif + RCHAR_T *must; /* match must contain this string */ + size_t mlen; /* length of must */ + size_t nsub; /* copy of re_nsub */ + int backrefs; /* does it use back references? */ + sopno nplus; /* how deep does it nest +s? */ + /* catspace must be last */ +#if 0 + cat_t catspace[1]; /* actually [NC] */ +#endif +}; + +/* misc utilities */ +#define OUT REOF /* a non-character value */ +#define ISWORD(c) ((c) == '_' || (ISGRAPH((UCHAR_T)c) && !ISPUNCT((UCHAR_T)c))) diff --git a/regex/regexec.c b/regex/regexec.c new file mode 100644 index 000000000000..89ab2ca9786d --- /dev/null +++ b/regex/regexec.c @@ -0,0 +1,180 @@ +/* $NetBSD: regexec.c,v 1.4 2009/10/31 20:11:53 dsl Exp $ */ + +/*- + * Copyright (c) 1992, 1993, 1994 Henry Spencer. + * Copyright (c) 1992, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Henry Spencer of the University of Toronto. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)regexec.c 8.2 (Berkeley) 3/16/94 + */ + +#if defined(LIBC_SCCS) && !defined(lint) +static char sccsid[] = "@(#)regexec.c 8.2 (Berkeley) 3/16/94"; +#endif /* LIBC_SCCS and not lint */ + +/* + * the outer shell of regexec() + * + * This file includes engine.c *twice*, after muchos fiddling with the + * macros that code uses. This lets the same code operate on two different + * representations for state sets. + */ +#include +#include +#include +#include +#include +#include +#include + +#include "utils.h" +#include "regex2.h" + +#ifdef notdef +static int nope = 0; /* for use in asserts; shuts lint up */ +#endif + +/* macros for manipulating states, small version */ +#define states int +#define states1 int /* for later use in regexec() decision */ +#define CLEAR(v) ((v) = 0) +#define SET0(v, n) ((v) &= ~(1 << (n))) +#define SET1(v, n) ((v) |= 1 << (n)) +#define ISSET(v, n) ((v) & (1 << (n))) +#define ASSIGN(d, s) ((d) = (s)) +#define EQ(a, b) ((a) == (b)) +#define STATEVARS int dummy /* dummy version */ +#define STATESETUP(m, n) /* nothing */ +#define STATETEARDOWN(m) /* nothing */ +#define SETUP(v) ((v) = 0) +#define onestate int +#define INIT(o, n) ((o) = (unsigned)1 << (n)) +#define INC(o) ((o) <<= 1) +#define ISSTATEIN(v, o) ((v) & (o)) +/* some abbreviations; note that some of these know variable names! */ +/* do "if I'm here, I can also be there" etc without branches */ +#define FWD(dst, src, n) ((dst) |= ((unsigned)(src)&(here)) << (n)) +#define BACK(dst, src, n) ((dst) |= ((unsigned)(src)&(here)) >> (n)) +#define ISSETBACK(v, n) ((v) & ((unsigned)here >> (n))) +/* function names */ +#define SNAMES /* engine.c looks after details */ + +#include "engine.c" + +/* now undo things */ +#undef states +#undef CLEAR +#undef SET0 +#undef SET1 +#undef ISSET +#undef ASSIGN +#undef EQ +#undef STATEVARS +#undef STATESETUP +#undef STATETEARDOWN +#undef SETUP +#undef onestate +#undef INIT +#undef INC +#undef ISSTATEIN +#undef FWD +#undef BACK +#undef ISSETBACK +#undef SNAMES + +/* macros for manipulating states, large version */ +#define states char * +#define CLEAR(v) memset(v, 0, m->g->nstates) +#define SET0(v, n) ((v)[n] = 0) +#define SET1(v, n) ((v)[n] = 1) +#define ISSET(v, n) ((v)[n]) +#define ASSIGN(d, s) memcpy(d, s, m->g->nstates) +#define EQ(a, b) (memcmp(a, b, m->g->nstates) == 0) +#define STATEVARS int vn; char *space +#define STATESETUP(m, nv) { (m)->space = malloc((nv)*(m)->g->nstates); \ + if ((m)->space == NULL) return(REG_ESPACE); \ + (m)->vn = 0; } +#define STATETEARDOWN(m) { free((m)->space); } +#define SETUP(v) ((v) = &m->space[m->vn++ * m->g->nstates]) +#define onestate int +#define INIT(o, n) ((o) = (n)) +#define INC(o) ((o)++) +#define ISSTATEIN(v, o) ((v)[o]) +/* some abbreviations; note that some of these know variable names! */ +/* do "if I'm here, I can also be there" etc without branches */ +#define FWD(dst, src, n) ((dst)[here+(n)] |= (src)[here]) +#define BACK(dst, src, n) ((dst)[here-(n)] |= (src)[here]) +#define ISSETBACK(v, n) ((v)[here - (n)]) +/* function names */ +#define LNAMES /* flag */ + +#include "engine.c" + +/* + - regexec - interface for matching + = extern int regexec(const regex_t *, const char *, size_t, \ + = regmatch_t [], int); + = #define REG_NOTBOL 00001 + = #define REG_NOTEOL 00002 + = #define REG_STARTEND 00004 + = #define REG_TRACE 00400 // tracing of execution + = #define REG_LARGE 01000 // force large representation + = #define REG_BACKR 02000 // force use of backref code + * + * We put this here so we can exploit knowledge of the state representation + * when choosing which matcher to call. Also, by this point the matchers + * have been prototyped. + */ +int /* 0 success, REG_NOMATCH failure */ +regexec(const regex_t *preg, const RCHAR_T *string, size_t nmatch, regmatch_t *pmatch, int eflags) +{ + register struct re_guts *g = preg->re_g; +#ifdef REDEBUG +# define GOODFLAGS(f) (f) +#else +# define GOODFLAGS(f) ((f)&(REG_NOTBOL|REG_NOTEOL|REG_STARTEND)) +#endif + + if (preg->re_magic != MAGIC1 || g->magic != MAGIC2) + return(REG_BADPAT); + assert(!(g->iflags&BAD)); + if (g->iflags&BAD) /* backstop for no-debug case */ + return(REG_BADPAT); + eflags = GOODFLAGS(eflags); + + if (g->nstates <= (int)(CHAR_BIT*sizeof(states1)) && !(eflags®_LARGE)) + return(smatcher(g, string, nmatch, pmatch, eflags)); + else + return(lmatcher(g, string, nmatch, pmatch, eflags)); +} diff --git a/clib/strdup.c b/regex/regfree.c similarity index 64% rename from clib/strdup.c rename to regex/regfree.c index 4bc2303cee54..61df17cb6664 100644 --- a/clib/strdup.c +++ b/regex/regfree.c @@ -1,7 +1,13 @@ -/* - * Copyright (c) 1988, 1993 +/* $NetBSD: regfree.c,v 1.2 2009/01/02 00:32:11 tnozaki Exp $ */ + +/*- + * Copyright (c) 1992, 1993, 1994 Henry Spencer. + * Copyright (c) 1992, 1993, 1994 * The Regents of the University of California. All rights reserved. * + * This code is derived from software contributed to Berkeley by + * Henry Spencer of the University of Toronto. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -29,35 +35,49 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * @(#)regfree.c 8.2 (Berkeley) 3/16/94 */ -#include "config.h" - #if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)strdup.c 8.1 (Berkeley) 6/4/93"; +static char sccsid[] = "@(#)regfree.c 8.2 (Berkeley) 3/16/94"; #endif /* LIBC_SCCS and not lint */ #include - -#include +#include #include -#include +#include + +#include "utils.h" +#include "regex2.h" /* - * PUBLIC: #ifndef HAVE_STRDUP - * PUBLIC: char *strdup __P((const char *)); - * PUBLIC: #endif + - regfree - free everything + = extern void regfree(regex_t *); */ -char * -strdup(str) - const char *str; +void +regfree(regex_t *preg) { - size_t len; - char *copy; + register struct re_guts *g; - len = strlen(str) + 1; - if (!(copy = malloc((u_int)len))) - return (NULL); - memcpy(copy, str, len); - return (copy); + if (preg->re_magic != MAGIC1) /* oops */ + return; /* nice to complain, but hard */ + + g = preg->re_g; + if (g == NULL || g->magic != MAGIC2) /* oops again */ + return; + preg->re_magic = 0; /* mark it invalid */ + g->magic = 0; /* mark it invalid */ + + if (g->strip != NULL) + free((char *)g->strip); + if (g->stripdata != NULL) + free((char *)g->stripdata); + if (g->sets != NULL) + free((char *)g->sets); + if (g->setbits != NULL) + free((char *)g->setbits); + if (g->must != NULL) + free(g->must); + free((char *)g); } diff --git a/clib/memchr.c b/regex/utils.h similarity index 72% rename from clib/memchr.c rename to regex/utils.h index b6d4c311bff6..4a6f57a3fe6c 100644 --- a/clib/memchr.c +++ b/regex/utils.h @@ -1,9 +1,12 @@ +/* $NetBSD: utils.h,v 1.1.1.2 2008/05/18 14:31:39 aymeric Exp $ */ + /*- - * Copyright (c) 1990, 1993 + * Copyright (c) 1992, 1993, 1994 Henry Spencer. + * Copyright (c) 1992, 1993, 1994 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by - * Chris Torek. + * Henry Spencer of the University of Toronto. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -32,34 +35,25 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * @(#)utils.h 8.2 (Berkeley) 3/16/94 */ -#include "config.h" +/* utility definitions */ +#define DUPMAX _POSIX2_RE_DUP_MAX /* xxx is this right? */ +#define INFINITY (DUPMAX + 1) +#define NC (CHAR_MAX - CHAR_MIN + 1) +typedef unsigned char uch; -#if defined(LIBC_SCCS) && !defined(lint) -static const char sccsid[] = "@(#)memchr.c 8.1 (Berkeley) 6/4/93"; -#endif /* LIBC_SCCS and not lint */ +/* switch off assertions (if not already off) if no REDEBUG */ +#ifndef REDEBUG +#ifndef NDEBUG +#define NDEBUG /* no assertions please */ +#endif +#endif +#include -#include - -/* - * PUBLIC: #ifndef HAVE_MEMCHR - * PUBLIC: void *memchr __P((const void *, int, size_t)); - * PUBLIC: #endif - */ -void * -memchr(s, c, n) - const void *s; - register unsigned char c; - register size_t n; -{ - if (n != 0) { - register const unsigned char *p = s; - - do { - if (*p++ == c) - return ((void *)(p - 1)); - } while (--n != 0); - } - return (NULL); -} +/* for old systems with bcopy() but no memmove() */ +#ifdef USEBCOPY +#define memmove(d, s, c) bcopy(s, d, c) +#endif diff --git a/tcl_api/tcl.c b/tcl_api/tcl.c deleted file mode 100644 index 8f4a430bac4c..000000000000 --- a/tcl_api/tcl.c +++ /dev/null @@ -1,852 +0,0 @@ -/*- - * Copyright (c) 1992, 1993, 1994 - * The Regents of the University of California. All rights reserved. - * Copyright (c) 1992, 1993, 1994, 1995 - * Keith Bostic. All rights reserved. - * Copyright (c) 1995 - * George V. Neville-Neil. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)tcl.c 8.16 (Berkeley) 10/16/96"; -#endif /* not lint */ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../common/common.h" -#include "tcl_extern.h" - -static int getint __P((Tcl_Interp *, char *, char *, int *)); -static int getscreenid __P((Tcl_Interp *, SCR **, char *, char *)); -static void msghandler __P((SCR *, mtype_t, char *, size_t)); - -extern GS *__global_list; /* XXX */ - -/* - * INITMESSAGE -- - * Macros to point messages at the Tcl message handler. - */ -#define INITMESSAGE \ - scr_msg = __global_list->scr_msg; \ - __global_list->scr_msg = msghandler; -#define ENDMESSAGE \ - __global_list->scr_msg = scr_msg; - -/* - * tcl_fscreen -- - * Return the screen id associated with file name. - * - * Tcl Command: viFindScreen - * Usage: viFindScreen file - */ -static int -tcl_fscreen(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char **argv; -{ - SCR *sp; - - if (argc != 2) { - Tcl_SetResult(interp, "Usage: viFindScreen file", TCL_STATIC); - return (TCL_ERROR); - } - - if (getscreenid(interp, &sp, NULL, argv[1])) - return (TCL_ERROR); - - (void)sprintf(interp->result, "%d", sp->id); - return (TCL_OK); -} - -/* - * tcl_aline -- - * -- Append the string text after the line in lineNumber. - * - * Tcl Command: viAppendLine - * Usage: viAppendLine screenId lineNumber text - */ -static int -tcl_aline(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char **argv; -{ - SCR *sp; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int lno, rval; - - if (argc != 4) { - Tcl_SetResult(interp, - "Usage: viAppendLine screenId lineNumber text", TCL_STATIC); - return (TCL_ERROR); - } - - if (getscreenid(interp, &sp, argv[1], NULL) || - getint(interp, "line number", argv[2], &lno)) - return (TCL_ERROR); - INITMESSAGE; - rval = api_aline(sp, (recno_t)lno, argv[3], strlen(argv[3])); - ENDMESSAGE; - - return (rval ? TCL_ERROR : TCL_OK); -} - -/* - * tcl_dline -- - * Delete lineNum. - * - * Tcl Command: viDelLine - * Usage: viDelLine screenId lineNum - */ -static int -tcl_dline(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char **argv; -{ - SCR *sp; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int lno, rval; - - if (argc != 3) { - Tcl_SetResult(interp, - "Usage: viDelLine screenId lineNumber", TCL_STATIC); - return (TCL_ERROR); - } - - if (getscreenid(interp, &sp, argv[1], NULL) || - getint(interp, "line number", argv[2], &lno)) - return (TCL_ERROR); - INITMESSAGE; - rval = api_dline(sp, (recno_t)lno); - ENDMESSAGE; - - return (rval ? TCL_ERROR : TCL_OK); -} - -/* - * tcl_gline -- - * Return lineNumber. - * - * Tcl Command: viGetLine - * Usage: viGetLine screenId lineNumber - */ -static int -tcl_gline(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char **argv; -{ - SCR *sp; - size_t len; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int lno, rval; - char *line, *p; - - if (argc != 3) { - Tcl_SetResult(interp, - "Usage: viGetLine screenId lineNumber", TCL_STATIC); - return (TCL_ERROR); - } - if (getscreenid(interp, &sp, argv[1], NULL) || - getint(interp, "line number", argv[2], &lno)) - return (TCL_ERROR); - INITMESSAGE; - rval = api_gline(sp, (recno_t)lno, &p, &len); - ENDMESSAGE; - - if (rval) - return (TCL_ERROR); - - if ((line = malloc(len + 1)) == NULL) - exit(1); /* XXX */ - memmove(line, p, len); - line[len] = '\0'; - Tcl_SetResult(interp, line, TCL_DYNAMIC); - return (TCL_OK); -} - -/* - * tcl_iline -- - * Insert the string text after the line in lineNumber. - * - * Tcl Command: viInsertLine - * Usage: viInsertLine screenId lineNumber text - */ -static int -tcl_iline(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char **argv; -{ - SCR *sp; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int lno, rval; - - if (argc != 4) { - Tcl_SetResult(interp, - "Usage: viInsertLine screenId lineNumber text", TCL_STATIC); - return (TCL_ERROR); - } - - if (getscreenid(interp, &sp, argv[1], NULL) || - getint(interp, "line number", argv[2], &lno)) - return (TCL_ERROR); - INITMESSAGE; - rval = api_iline(sp, (recno_t)lno, argv[3], strlen(argv[3])); - ENDMESSAGE; - - return (rval ? TCL_ERROR : TCL_OK); -} - -/* - * tcl_lline -- - * Return the last line in the screen. - * - * Tcl Command: viLastLine - * Usage: viLastLine screenId - */ -static int -tcl_lline(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char **argv; -{ - SCR *sp; - recno_t last; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - - if (argc != 2) { - Tcl_SetResult(interp, "Usage: viLastLine screenId", TCL_STATIC); - return (TCL_ERROR); - } - - if (getscreenid(interp, &sp, argv[1], NULL)) - return (TCL_ERROR); - INITMESSAGE; - rval = api_lline(sp, &last); - ENDMESSAGE; - if (rval) - return (TCL_ERROR); - - (void)sprintf(interp->result, "%lu", (unsigned long)last); - return (TCL_OK); -} - -/* - * tcl_sline -- - * Set lineNumber to the text supplied. - * - * Tcl Command: viSetLine - * Usage: viSetLine screenId lineNumber text - */ -static int -tcl_sline(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char **argv; -{ - SCR *sp; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int lno, rval; - - if (argc != 4) { - Tcl_SetResult(interp, - "Usage: viSetLine screenId lineNumber text", TCL_STATIC); - return (TCL_ERROR); - } - - if (getscreenid(interp, &sp, argv[1], NULL) || - getint(interp, "line number", argv[2], &lno)) - return (TCL_ERROR); - INITMESSAGE; - rval = api_sline(sp, (recno_t)lno, argv[3], strlen(argv[3])); - ENDMESSAGE; - - return (rval ? TCL_ERROR : TCL_OK); -} - -/* - * tcl_getmark -- - * Return the mark's cursor position as a list with two elements. - * {line, column}. - * - * Tcl Command: viGetMark - * Usage: viGetMark screenId mark - */ -static int -tcl_getmark(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char **argv; -{ - MARK cursor; - SCR *sp; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - char buf[20]; - - if (argc != 3) { - Tcl_SetResult(interp, - "Usage: viGetMark screenId mark", TCL_STATIC); - return (TCL_ERROR); - } - - if (getscreenid(interp, &sp, argv[1], NULL)) - return (TCL_ERROR); - INITMESSAGE; - rval = api_getmark(sp, (int)argv[2][0], &cursor); - ENDMESSAGE; - - if (rval) - return (TCL_ERROR); - - (void)snprintf(buf, sizeof(buf), "%lu", (u_long)cursor.lno); - Tcl_AppendElement(interp, buf); - (void)snprintf(buf, sizeof(buf), "%lu", (u_long)cursor.cno); - Tcl_AppendElement(interp, buf); - return (TCL_OK); -} - -/* - * tcl_setmark -- - * Set the mark to the line and column numbers supplied. - * - * Tcl Command: viSetMark - * Usage: viSetMark screenId mark line column - */ -static int -tcl_setmark(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char **argv; -{ - MARK cursor; - SCR *sp; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int i, rval; - - if (argc != 5) { - Tcl_SetResult(interp, - "Usage: viSetMark screenId mark line column", TCL_STATIC); - return (TCL_ERROR); - } - - if (getscreenid(interp, &sp, argv[1], NULL)) - return (TCL_ERROR); - if (getint(interp, "line number", argv[3], &i)) - return (TCL_ERROR); - cursor.lno = i; - if (getint(interp, "column number", argv[4], &i)) - return (TCL_ERROR); - cursor.cno = i; - INITMESSAGE; - rval = api_setmark(sp, (int)argv[2][0], &cursor); - ENDMESSAGE; - - return (rval ? TCL_ERROR : TCL_OK); -} - -/* - * tcl_getcursor -- - * Return the current cursor position as a list with two elements. - * {line, column}. - * - * Tcl Command: viGetCursor - * Usage: viGetCursor screenId - */ -static int -tcl_getcursor(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char **argv; -{ - MARK cursor; - SCR *sp; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - char buf[20]; - - if (argc != 2) { - Tcl_SetResult(interp, - "Usage: viGetCursor screenId", TCL_STATIC); - return (TCL_ERROR); - } - - if (getscreenid(interp, &sp, argv[1], NULL)) - return (TCL_ERROR); - INITMESSAGE; - rval = api_getcursor(sp, &cursor); - ENDMESSAGE; - - if (rval) - return (TCL_ERROR); - - (void)snprintf(buf, sizeof(buf), "%lu", (u_long)cursor.lno); - Tcl_AppendElement(interp, buf); - (void)snprintf(buf, sizeof(buf), "%lu", (u_long)cursor.cno); - Tcl_AppendElement(interp, buf); - return (TCL_OK); -} - -/* - * tcl_setcursor -- - * Set the cursor to the line and column numbers supplied. - * - * Tcl Command: viSetCursor - * Usage: viSetCursor screenId line column - */ -static int -tcl_setcursor(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char **argv; -{ - MARK cursor; - SCR *sp; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int i, rval; - - if (argc != 4) { - Tcl_SetResult(interp, - "Usage: viSetCursor screenId line column", TCL_STATIC); - return (TCL_ERROR); - } - - if (getscreenid(interp, &sp, argv[1], NULL)) - return (TCL_ERROR); - if (getint(interp, "screen id", argv[2], &i)) - return (TCL_ERROR); - cursor.lno = i; - if (getint(interp, "screen id", argv[3], &i)) - return (TCL_ERROR); - cursor.cno = i; - INITMESSAGE; - rval = api_setcursor(sp, &cursor); - ENDMESSAGE; - - return (rval ? TCL_ERROR : TCL_OK); -} - -/* - * tcl_msg -- - * Set the message line to text. - * - * Tcl Command: viMsg - * Usage: viMsg screenId text - */ -static int -tcl_msg(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char **argv; -{ - SCR *sp; - - if (argc != 3) { - Tcl_SetResult(interp, "Usage: viMsg screenId text", TCL_STATIC); - return (TCL_ERROR); - } - - if (getscreenid(interp, &sp, argv[1], NULL)) - return (TCL_ERROR); - api_imessage(sp, argv[2]); - - return (TCL_OK); -} - -/* - * tcl_iscreen -- - * Create a new screen. If a filename is specified then the screen - * is opened with that file. - * - * Tcl Command: viNewScreen - * Usage: viNewScreen screenId [file] - */ -static int -tcl_iscreen(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char **argv; -{ - SCR *sp, *nsp; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - - if (argc != 2 && argc != 3) { - Tcl_SetResult(interp, - "Usage: viNewScreen screenId [file]", TCL_STATIC); - return (TCL_ERROR); - } - - if (getscreenid(interp, &sp, argv[1], NULL)) - return (TCL_ERROR); - INITMESSAGE; - rval = api_edit(sp, argv[2], &nsp, 1); - ENDMESSAGE; - - if (rval) - return (TCL_ERROR); - - (void)sprintf(interp->result, "%d", nsp->id); - return (TCL_OK); -} - -/* - * tcl_escreen -- - * End a screen. - * - * Tcl Command: viEndScreen - * Usage: viEndScreen screenId - */ -static int -tcl_escreen(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char **argv; -{ - SCR *sp; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - - if (argc != 2) { - Tcl_SetResult(interp, - "Usage: viEndScreen screenId", TCL_STATIC); - return (TCL_ERROR); - } - - if (getscreenid(interp, &sp, argv[1], NULL)) - return (TCL_ERROR); - INITMESSAGE; - rval = api_escreen(sp); - ENDMESSAGE; - - return (rval ? TCL_ERROR : TCL_OK); -} - -/* - * tcl_swscreen -- - * Change the current focus to screen. - * - * Tcl Command: viSwitchScreen - * Usage: viSwitchScreen screenId screenId - */ -static int -tcl_swscreen(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char **argv; -{ - SCR *sp, *new; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - - if (argc != 3) { - Tcl_SetResult(interp, - "Usage: viSwitchScreen cur_screenId new_screenId", - TCL_STATIC); - return (TCL_ERROR); - } - - if (getscreenid(interp, &sp, argv[1], NULL)) - return (TCL_ERROR); - if (getscreenid(interp, &new, argv[2], NULL)) - return (TCL_ERROR); - INITMESSAGE; - rval = api_swscreen(sp, new); - ENDMESSAGE; - - return (rval ? TCL_ERROR : TCL_OK); -} - -/* - * tcl_map -- - * Associate a key with a tcl procedure. - * - * Tcl Command: viMapKey - * Usage: viMapKey screenId key tclproc - */ -static int -tcl_map(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char **argv; -{ - SCR *sp; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - char command[256]; - - if (argc != 4) { - Tcl_SetResult(interp, - "Usage: viMapKey screenId key tclproc", TCL_STATIC); - return (TCL_ERROR); - } - - if (getscreenid(interp, &sp, argv[1], NULL)) - return (TCL_ERROR); - INITMESSAGE; - (void)snprintf(command, sizeof(command), ":tcl %s\n", argv[3]); - rval = api_map(sp, argv[2], command, strlen(command)); - ENDMESSAGE; - - return (rval ? TCL_ERROR : TCL_OK); -} - -/* - * tcl_unmap -- - * Unmap a key. - * - * Tcl Command: viUnmapKey - * Usage: viUnmMapKey screenId key - */ -static int -tcl_unmap(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char **argv; -{ - SCR *sp; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - - if (argc != 3) { - Tcl_SetResult(interp, - "Usage: viUnmapKey screenId key", TCL_STATIC); - return (TCL_ERROR); - } - - if (getscreenid(interp, &sp, argv[1], NULL)) - return (TCL_ERROR); - INITMESSAGE; - rval = api_unmap(sp, argv[2]); - ENDMESSAGE; - - return (rval ? TCL_ERROR : TCL_OK); -} - -/* - * tcl_opts_set -- - * Set an option. - * - * Tcl Command: viSetOpt - * Usage: viSetOpt screenId command - */ -static int -tcl_opts_set(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char **argv; -{ - SCR *sp; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - char *setting; - - if (argc != 3) { - Tcl_SetResult(interp, - "Usage: viSetOpt screenId command", TCL_STATIC); - return (TCL_ERROR); - } - - if (getscreenid(interp, &sp, argv[1], NULL)) - return (TCL_ERROR); - INITMESSAGE; - /*rval = api_opts_set(sp, argv[2]);*/ - MALLOC(sp, setting, char *, strlen(argv[2])+6); - strcpy(setting, ":set "); - strcpy(setting+5, argv[2]); - rval=api_run_str(sp, setting); - free(setting); - ENDMESSAGE; - - return (rval ? TCL_ERROR : TCL_OK); -} - -/* - * tcl_opts_get -- - Return the value of an option. - * - * Tcl Command: viGetOpt - * Usage: viGetOpt screenId option - */ -static int -tcl_opts_get(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char **argv; -{ - SCR *sp; - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); - int rval; - char *value; - - if (argc != 3) { - Tcl_SetResult(interp, - "Usage: viGetOpt screenId option", TCL_STATIC); - return (TCL_ERROR); - } - - if (getscreenid(interp, &sp, argv[1], NULL)) - return (TCL_ERROR); - INITMESSAGE; - rval = api_opts_get(sp, argv[2], &value, NULL); - ENDMESSAGE; - if (rval) - return (TCL_ERROR); - - Tcl_SetResult(interp, value, TCL_DYNAMIC); - return (TCL_OK); -} - -/* - * tcl_init -- - * Create the TCL commands used by nvi. - * - * PUBLIC: int tcl_init __P((GS *)); - */ -int -tcl_init(gp) - GS *gp; -{ - gp->tcl_interp = Tcl_CreateInterp(); - if (Tcl_Init(gp->tcl_interp) == TCL_ERROR) - return (1); - -#define TCC(name, function) { \ - Tcl_CreateCommand(gp->tcl_interp, name, function, \ - (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); \ -} - TCC("viAppendLine", tcl_aline); - TCC("viDelLine", tcl_dline); - TCC("viEndScreen", tcl_escreen); - TCC("viFindScreen", tcl_fscreen); - TCC("viGetCursor", tcl_getcursor); - TCC("viGetLine", tcl_gline); - TCC("viGetMark", tcl_getmark); - TCC("viGetOpt", tcl_opts_get); - TCC("viInsertLine", tcl_iline); - TCC("viLastLine", tcl_lline); - TCC("viMapKey", tcl_map); - TCC("viMsg", tcl_msg); - TCC("viNewScreen", tcl_iscreen); - TCC("viSetCursor", tcl_setcursor); - TCC("viSetLine", tcl_sline); - TCC("viSetMark", tcl_setmark); - TCC("viSetOpt", tcl_opts_set); - TCC("viSwitchScreen", tcl_swscreen); - TCC("viUnmapKey", tcl_unmap); - - return (0); -} - -/* - * getscreenid -- - * Get the specified screen pointer. - * - * XXX - * This is fatal. We can't post a message into vi that we're unable to find - * the screen without first finding the screen... So, this must be the first - * thing a Tcl routine does, and, if it fails, the last as well. - */ -static int -getscreenid(interp, spp, id, name) - Tcl_Interp *interp; - SCR **spp; - char *id, *name; -{ - int scr_no; - char buf[64]; - - if (id != NULL && getint(interp, "screen id", id, &scr_no)) - return (1); - if ((*spp = api_fscreen(scr_no, name)) == NULL) { - (void)snprintf(buf, sizeof(buf), - "unknown screen id: %s", name == NULL ? id : name); - Tcl_SetResult(interp, buf, TCL_VOLATILE); - return (1); - } - return (0); -} - -/* - * getint -- - * Get a Tcl integer. - * - * XXX - * This code assumes that both recno_t and size_t are larger than ints. - */ -static int -getint(interp, msg, s, intp) - Tcl_Interp *interp; - char *msg, *s; - int *intp; -{ - char buf[64]; - - if (Tcl_GetInt(interp, s, intp) == TCL_ERROR) - return (1); - if (*intp < 0) { - (void)snprintf(buf, sizeof(buf), - "illegal %s %s: may not be negative", msg, s); - Tcl_SetResult(interp, buf, TCL_VOLATILE); - return (1); - } - return (0); -} - -/* - * msghandler -- - * Tcl message routine so that error messages are processed in - * Tcl, not in nvi. - */ -static void -msghandler(sp, mtype, msg, len) - SCR *sp; - mtype_t mtype; - char *msg; - size_t len; -{ - /* Replace the trailing with an EOS. */ - msg[len - 1] = '\0'; - - Tcl_SetResult(sp->gp->tcl_interp, msg, TCL_VOLATILE); -} diff --git a/tcl_scripts/errors.tcl b/tcl_scripts/errors.tcl deleted file mode 100644 index 94a1e6a8c3c9..000000000000 --- a/tcl_scripts/errors.tcl +++ /dev/null @@ -1,44 +0,0 @@ -# @(#)errors.tcl 8.2 (Berkeley) 11/18/95 -# -# File: errors.tcl -# -# Author: George V. Neville-Neil -# -# Purpose: This file contains vi/tcl code that allows a vi user to parse -# compiler errors and warnings from a make.out file. - -proc findErr {} { - global errScreen - global currFile - global fileScreen - set errLine [lindex [viGetCursor $errScreen] 0] - set currLine [split [viGetLine $errScreen $errLine] :] - set currFile [lindex $currLine 0] - set fileScreen [viNewScreen $errScreen $currFile] - viSetCursor $fileScreen [lindex $currLine 1] 1 - viMapKey $viScreenId  nextErr -} - -proc nextErr {} { - global errScreen - global fileScreen - global currFile - set errLine [lindex [viGetCursor $errScreen] 0] - set currLine [split [viGetLine $errScreen $errLine] :] - if {[string match $currFile [lindex $currLine 0]]} { - viSetCursor $fileScreen [lindex $currLine 1] 0 - viSwitchScreen $fileScreen - } else { - viEndScreen $fileScreen - set currFile [lindex $currLine 0] - set fileScreen[viNewScreen $errScreen $currFile] - viSetCursor $fileScreen [lindex $currLine 1] 0 - } -} - -proc initErr {} { - global viScreenId - global errScreen - set errScreen [viNewScreen $viScreenId make.out] - viMapKey $viScreenId  findErr -} diff --git a/tcl_scripts/gnats.tcl b/tcl_scripts/gnats.tcl deleted file mode 100644 index 61ecb6e2cda0..000000000000 --- a/tcl_scripts/gnats.tcl +++ /dev/null @@ -1,95 +0,0 @@ -# @(#)gnats.tcl 8.2 (Berkeley) 11/18/95 -# -proc init {catFile} { - global viScreenId - global categories - set categories {} - set categoriesFile [open $catFile r] - while {[gets $categoriesFile line] >= 0} { - lappend categories $line - } - close $categoriesFile - viMsg $viScreenId $categories - viMapKey $viScreenId  next -} - -proc next {} { - global viScreenId - set cursor [viGetCursor $viScreenId] - set lineNum [lindex $cursor 0] - set line [viGetLine $viScreenId $lineNum] - viMsg $viScreenId [lindex $line 0] - if {[lindex $line 0] == ">Confidential:"} { - confNext $lineNum $line - } elseif {[lindex $line 0] == ">Severity:"} { - sevNext $lineNum $line - } elseif {[lindex $line 0] == ">Priority:"} { - priNext $lineNum $line - } elseif {[lindex $line 0] == ">Class:"} { - classNext $lineNum $line - } elseif {[lindex $line 0] == ">Category:"} { - catNext $lineNum $line - } -} - -proc confNext {lineNum line} { - global viScreenId - viMsg $viScreenId [lindex $line 1] - if {[lindex $line 1] == "yes"} { - viSetLine $viScreenId $lineNum ">Confidential: no" - } else { - viSetLine $viScreenId $lineNum ">Confidential: yes" - } -} - -proc sevNext {lineNum line} { - global viScreenId - viMsg $viScreenId [lindex $line 1] - if {[lindex $line 1] == "non-critical"} { - viSetLine $viScreenId $lineNum ">Severity: serious" - } elseif {[lindex $line 1] == "serious"} { - viSetLine $viScreenId $lineNum ">Severity: critical" - } elseif {[lindex $line 1] == "critical"} { - viSetLine $viScreenId $lineNum ">Severity: non-critical" - } -} - -proc priNext {lineNum line} { - global viScreenId - viMsg $viScreenId [lindex $line 1] - if {[lindex $line 1] == "low"} { - viSetLine $viScreenId $lineNum ">Priority: medium" - } elseif {[lindex $line 1] == "medium"} { - viSetLine $viScreenId $lineNum ">Priority: high" - } elseif {[lindex $line 1] == "high"} { - viSetLine $viScreenId $lineNum ">Priority: low" - } -} - -proc classNext {lineNum line} { - global viScreenId - viMsg $viScreenId [lindex $line 1] - if {[lindex $line 1] == "sw-bug"} { - viSetLine $viScreenId $lineNum ">Class: doc-bug" - } elseif {[lindex $line 1] == "doc-bug"} { - viSetLine $viScreenId $lineNum ">Class: change-request" - } elseif {[lindex $line 1] == "change-request"} { - viSetLine $viScreenId $lineNum ">Class: support" - } elseif {[lindex $line 1] == "support"} { - viSetLine $viScreenId $lineNum ">Class: sw-bug" - } -} - -proc catNext {lineNum line} { - global viScreenId - global categories - viMsg $viScreenId [lindex $line 1] - set curr [lsearch -exact $categories [lindex $line 1]] - if {$curr == -1} { - set curr 0 - } - viMsg $viScreenId $curr - viSetLine $viScreenId $lineNum ">Class: [lindex $categories $curr]" -} - -init abekas diff --git a/tcl_scripts/mailprocs.tcl b/tcl_scripts/mailprocs.tcl deleted file mode 100644 index eccb9cdfcf74..000000000000 --- a/tcl_scripts/mailprocs.tcl +++ /dev/null @@ -1,115 +0,0 @@ -# @(#)mailprocs.tcl 8.3 (Berkeley) 4/29/96 -# -proc validLine {} { - global viScreenId - set line [viGetLine $viScreenId [lindex [viGetCursor $viScreenId] 0]] - if {[string compare [lindex [split $line :] 0] "To"] == 0} { - set addrs [lindex [split $line :] 1] - foreach name [split $addrs ,] { - isValid [string trim $name] - } - } -} - -proc valid {target} { - set found 0 - set aliasFile [open "~/Mail/aliases" r] - while {[gets $aliasFile line] >= 0} { - set name [lindex [split $line :] 0] - set address [lindex [split $line :] 1] - if {[string compare $target $name] == 0} { - set found 1 - break - } - } - close $aliasFile - if {$found == 1} { - return $address - } else { - return $found - } -} - -proc isValid {target} { - global viScreenId - set address [valid $target] - if {$address != 0} { - viMsg $viScreenId "$target is [string trim $address]" - } else { - viMsg $viScreenId "$target not found" - } -} - -proc isAliasedLine {} { - global viScreenId - set line [viGetLine $viScreenId [lindex [viGetCursor $viScreenId] 0]] - if {[string match [lindex [split $line :] 0] "*To"] == 0} { - set addrs [lindex [split $line :] 1] - foreach name [split $addrs ,] { - isAliased [string trim $name] - } - } -} - -proc aliased {target} { - set found 0 - set aliasFile [open "~/Mail/aliases" r] - while {[gets $aliasFile line] >= 0} { - set name [lindex [split $line :] 0] - set address [lindex [split $line :] 1] - if {[string compare $target [string trim $address]] == 0} { - set found 1 - break - } - } - close $aliasFile - - return $found -} - -proc isAliased {target} { - global viScreenId - set found [aliased $target] - - if {$found} { - viMsg $viScreenId "$target is aliased to [string trim $name]" - } else { - viMsg $viScreenId "$target not aliased" - } -} - -proc appendAlias {target address} { - if {![aliased $target]} { - set aliasFile [open "~/Mail/aliases" a] - puts $aliasFile "$target: $address" - } - close $aliasFile -} - -proc expand {} { - global viScreenId - set row [lindex [viGetCursor $viScreenId] 0]] - set column [lindex [viGetCursor $viScreenId] 1]] - set line [viGetLine $viScreenId $row] - while {$column < [string length $line] && \ - [string index $line $column] != ' '} { - append $target [string index $line $column] - incr $column - } - set found [isValid $target] -} - -proc cite {} { - global viScreenId - global viStartLine - global viStopLine - for {set i $viStartLine} {$i <= $viStopLine} {incr i} { - set newLine "> " - append newLine [viGetLine $viScreenId $i] - viSetLine $viScreenId $i $newLine - } -} - -global viScreenId -viMapKey $viScreenId  isAliasedLine -viMapKey $viScreenId  validLine diff --git a/tcl_scripts/wc.tcl b/tcl_scripts/wc.tcl deleted file mode 100644 index 25d0f6254391..000000000000 --- a/tcl_scripts/wc.tcl +++ /dev/null @@ -1,16 +0,0 @@ -# @(#)wc.tcl 8.2 (Berkeley) 11/18/95 -# -proc wc {} { - global viScreenId - global viStartLine - global viStopLine - - set lines [viLastLine $viScreenId] - set output "" - set words 0 - for {set i $viStartLine} {$i <= $viStopLine} {incr i} { - set outLine [split [string trim [viGetLine $viScreenId $i]]] - set words [expr $words + [llength $outLine]] - } - viMsg $viScreenId "$words words" -} diff --git a/tk/init.tcl b/tk/init.tcl deleted file mode 100644 index 78c5a115c0a7..000000000000 --- a/tk/init.tcl +++ /dev/null @@ -1,1096 +0,0 @@ -# @(#)init.tcl 8.10 (Berkeley) 7/19/96 -proc screen {} { - global tk_ssize_row - global tk_ssize_col - - # Build menubar with File, Options and Help entries. - frame .menu -relief raised -borderwidth 1 - pack append . .menu {top fillx} - - # File pull-down menu - menubutton .menu.file -text "File" \ - -menu .menu.file.fileops -underline 0 - menu .menu.file.fileops - .menu.file.fileops add command -label "Edit ..." \ - -command "tk_edit" -underline 0 - .menu.file.fileops add command -label "Save File" \ - -command "tk_write" -underline 0 - .menu.file.fileops add command -label "Save File as ..." \ - -command "tk_writeas" -underline 1 - .menu.file.fileops add command -label "Save and Quit" \ - -command "tk_writequit" -underline 7 - .menu.file.fileops add command -label "Quit" \ - -command "tk_quit" -underline 0 - - # Options pull-down menu - menubutton .menu.option -text "Options" \ - -menu .menu.option.optionops -underline 0 - menu .menu.option.optionops - .menu.option.optionops add command -label "Set all" \ - -command tk_options -underline 0 - - # Help pull-down menu - menubutton .menu.help -text "Help" \ - -menu .menu.help.helpops -underline 0 - menu .menu.help.helpops - .menu.help.helpops add command -label "On Help" -underline 3 \ - -command tk_help - .menu.help.helpops add command -label "On Version" -underline 3 \ - -command tk_version - - pack append .menu \ - .menu.file {left} .menu.option {left} .menu.help {right} - - # Set up for keyboard-based menu traversal - tk_bindForTraversal . - bind . {focus .} - focus . - tk_menuBar .menu .menu.file .menu.help - - # Create text window - text .t -relief raised -bd 1 -setgrid true -yscrollcommand ".s set" - scrollbar .s -relief flat -command ".t yview" - pack append . .s {right filly} .t {expand fill} - - # Use tags to build a cursor for the text window. - set bg [lindex [.t config -background] 4] - set fg [lindex [.t config -foreground] 4] - .t tag configure tk_cursor -background $fg -foreground $bg - .t mark set tk_cursor_indx insert - .t tag add tk_cursor tk_cursor_indx - - # Bind the keys. - bind .t {tk_flash; break} - bind .t 0 {tk_key_enter "0"; break} - bind .t 1 {tk_key_enter "1"; break} - bind .t 2 {tk_key_enter "2"; break} - bind .t 3 {tk_key_enter "3"; break} - bind .t 4 {tk_key_enter "4"; break} - bind .t 5 {tk_key_enter "5"; break} - bind .t 6 {tk_key_enter "6"; break} - bind .t 7 {tk_key_enter "7"; break} - bind .t 8 {tk_key_enter "8"; break} - bind .t 9 {tk_key_enter "9"; break} - bind .t {tk_key_enter "\010"; break} - bind .t {tk_key_enter "\001"; break} - bind .t {tk_key_enter "\002"; break} - bind .t {tk_key_enter "\003"; break} - bind .t {tk_key_enter "\004"; break} - bind .t {tk_key_enter "\005"; break} - bind .t {tk_key_enter "\006"; break} - bind .t {tk_key_enter "\007"; break} - bind .t {tk_key_enter "\010"; break} - bind .t {tk_key_enter "\011"; break} - bind .t {tk_key_enter "\012"; break} - bind .t {tk_key_enter "\013"; break} - bind .t {tk_key_enter "\014"; break} - bind .t {tk_key_enter "\015"; break} - bind .t {tk_key_enter "\016"; break} - bind .t {tk_key_enter "\017"; break} - bind .t {tk_key_enter "\020"; break} - bind .t {tk_key_enter "\021"; break} - bind .t {tk_key_enter "\022"; break} - bind .t {tk_key_enter "\023"; break} - bind .t {tk_key_enter "\024"; break} - bind .t {tk_key_enter "\025"; break} - bind .t {tk_key_enter "\026"; break} - bind .t {tk_key_enter "\027"; break} - bind .t {tk_key_enter "\030"; break} - bind .t {tk_key_enter "\031"; break} - bind .t {tk_key_enter "\032"; break} - bind .t {tk_noop; break} - bind .t {tk_noop; break} - bind .t {tk_key_enter "x"; break} - bind .t {tk_key_enter "j"; break} - bind .t {tk_key_enter "G"; break} - bind .t {tk_key_enter "\033"; break} - bind .t {tk_key_enter "1G"; break} - bind .t {tk_key_enter "i"; break} - bind .t {tk_key_enter "h"; break} - bind .t {tk_key_enter "\006"; break} - bind .t {tk_key_enter "\002"; break} - bind .t {tk_key_enter "\015"; break} - bind .t {tk_key_enter "l"; break} - bind .t {tk_noop; break} - bind .t {tk_noop; break} - bind .t {tk_noop; break} - bind .t {tk_key_enter "\011"; break} - bind .t {tk_key_enter "k"; break} - bind .t {tk_key_enter "&"; break} - bind .t {tk_key_enter "^"; break} - bind .t {tk_key_enter "~"; break} - bind .t {tk_key_enter "*"; break} - bind .t {tk_key_enter "@"; break} - bind .t {tk_key_enter "\\"; break} - bind .t {tk_key_enter "|"; break} - bind .t {tk_key_enter "{"; break} - bind .t {tk_key_enter "; break}"} - bind .t {tk_key_enter "\["; break} - bind .t {tk_key_enter "]"; break} - bind .t {tk_key_enter ":"; break} - bind .t {tk_key_enter ","; break} - bind .t {tk_key_enter "$"; break} - bind .t {tk_key_enter "="; break} - bind .t {tk_key_enter "!"; break} - bind .t {tk_key_enter ">"; break} - bind .t {tk_key_enter "<"; break} - bind .t {tk_key_enter "-"; break} - bind .t {tk_key_enter "#"; break} - bind .t {tk_key_enter "("; break} - bind .t {tk_key_enter ")"; break} - bind .t {tk_key_enter "%"; break} - bind .t {tk_key_enter "."; break} - bind .t {tk_key_enter "+"; break} - bind .t {tk_key_enter "?"; break} - bind .t {tk_key_enter "\""; break} - bind .t {tk_key_enter "'"; break} - bind .t {tk_key_enter ";"; break} - bind .t {tk_key_enter "/"; break} - bind .t {tk_key_enter " "; break} - bind .t {tk_key_enter "_"; break} - bind .t A {tk_key_enter "A"; break} - bind .t B {tk_key_enter "B"; break} - bind .t C {tk_key_enter "C"; break} - bind .t D {tk_key_enter "D"; break} - bind .t E {tk_key_enter "E"; break} - bind .t F {tk_key_enter "F"; break} - bind .t G {tk_key_enter "G"; break} - bind .t H {tk_key_enter "H"; break} - bind .t I {tk_key_enter "I"; break} - bind .t J {tk_key_enter "J"; break} - bind .t K {tk_key_enter "K"; break} - bind .t L {tk_key_enter "L"; break} - bind .t M {tk_key_enter "M"; break} - bind .t N {tk_key_enter "N"; break} - bind .t O {tk_key_enter "O"; break} - bind .t P {tk_key_enter "P"; break} - bind .t Q {tk_key_enter "Q"; break} - bind .t R {tk_key_enter "R"; break} - bind .t S {tk_key_enter "S"; break} - bind .t T {tk_key_enter "T"; break} - bind .t U {tk_key_enter "U"; break} - bind .t V {tk_key_enter "V"; break} - bind .t W {tk_key_enter "W"; break} - bind .t X {tk_key_enter "X"; break} - bind .t Y {tk_key_enter "Y"; break} - bind .t Z {tk_key_enter "Z"; break} - bind .t a {tk_key_enter "a"; break} - bind .t b {tk_key_enter "b"; break} - bind .t c {tk_key_enter "c"; break} - bind .t d {tk_key_enter "d"; break} - bind .t e {tk_key_enter "e"; break} - bind .t f {tk_key_enter "f"; break} - bind .t g {tk_key_enter "g"; break} - bind .t h {tk_key_enter "h"; break} - bind .t i {tk_key_enter "i"; break} - bind .t j {tk_key_enter "j"; break} - bind .t k {tk_key_enter "k"; break} - bind .t l {tk_key_enter "l"; break} - bind .t m {tk_key_enter "m"; break} - bind .t n {tk_key_enter "n"; break} - bind .t o {tk_key_enter "o"; break} - bind .t p {tk_key_enter "p"; break} - bind .t q {tk_key_enter "q"; break} - bind .t r {tk_key_enter "r"; break} - bind .t s {tk_key_enter "s"; break} - bind .t t {tk_key_enter "t"; break} - bind .t u {tk_key_enter "u"; break} - bind .t v {tk_key_enter "v"; break} - bind .t w {tk_key_enter "w"; break} - bind .t x {tk_key_enter "x"; break} - bind .t y {tk_key_enter "y"; break} - bind .t z {tk_key_enter "z"; break} - - # XXX - # I haven't been able to make Tcl/Tk write uninitialized portions - # of the text window. Fill in the screen. - tk_ssize - .t mark set insert 1.0 - for {set i 1} {$i <= $tk_ssize_row} {incr i} { - for {set j 1} {$j <= $tk_ssize_col} {incr j} { - .t insert insert " " - } - .t insert insert "\n" - } -} - -# tk_noop -- -# Do nothing. -# -# XXX -# I can't figure out how to get a binding that does nothing without -# calling a function, so this stub does it for me. -proc tk_noop {} { -} - -# tk_key_enter -- -# Enter a key. -proc tk_key_enter {val} { - global newkey - global waiting - - set waiting 0 - tk_key $val - set newkey 1 -} - -# tk_key_wait -- -# Wait for a key. -proc tk_key_wait {timeout} { - global newkey - global waiting - - if { $timeout != 0 } { - after $timeout "set newkey 1" - } - set waiting 1 - tkwait variable newkey -} - -# Callback functions for the File menu. -# tk_edit -# Edit another file. -proc tk_edit {} { -} - -# tk_quit -# Quit. -proc tk_quit {} { - global newkey - global waiting - - tk_op quit - if { $waiting != 0 } { - set newkey 1 - } -} - -# tk_write -# Write the edit buffer. -proc tk_write {} { - global newkey - global waiting - - tk_op write - if { $waiting != 0 } { - set newkey 1 - } -} - -# tk_writeas -# Write the edit buffer to a named file. -proc tk_writeas {} { -} - -# tk_writequit -# Write and quit. -proc tk_writequit {} { - global newkey - global waiting - - tk_op writequit - if { $waiting != 0 } { - set newkey 1 - } -} - -# Callback functions for the Help menu. -# -# tk_help -- -# Present a help screen. -proc tk_help {} { - tk_dialog .d {} "No help screen currently available." {} 0 Continue -} - -# tk_options -# Contains the option selector box. It is divided into three parts, the -# checkbuttons for the boolean options, the entry fields for the string -# numeric options, and a control area containing buttons. There is only -# one function. -proc tk_options {} { - - # Build option selector box with three subframes for boolean, - # numeric, and string options. Make it a toplevel window. - toplevel .os - wm title .os options - - # Option variables. - global tko_altwerase - global tko_autoindent - global tko_autoprint - global tko_autowrite - global tko_backup - global tko_beautify - global tko_cdpath - global tko_cedit - global tko_columns - global tko_comment - global tko_directory - global tko_edcompatible - global tko_escapetime - global tko_errorbells - global tko_exrc - global tko_extended - global tko_filec - global tko_flash - global tko_hardtabs - global tko_iclower - global tko_ignorecase - global tko_keytime - global tko_leftright - global tko_lines - global tko_lisp - global tko_list - global tko_lock - global tko_magic - global tko_matchtime - global tko_mesg - global tko_modeline - global tko_msgcat - global tko_noprint - global tko_number - global tko_octal - global tko_open - global tko_optimize - global tko_paragraphs - global tko_print - global tko_prompt - global tko_readonly - global tko_recdir - global tko_redraw - global tko_remap - global tko_report - global tko_ruler - global tko_scroll - global tko_searchincr - global tko_sections - global tko_secure - global tko_shell - global tko_shellmeta - global tko_shiftwidth - global tko_showmatch - global tko_showmode - global tko_sidescroll - global tko_slowopen - global tko_sourceany - global tko_tabstop - global tko_taglength - global tko_tags - global tko_term - global tko_terse - global tko_tildeop - global tko_timeout - global tko_ttywerase - global tko_verbose - global tko_warn - global tko_window - global tko_windowname - global tko_wraplen - global tko_wrapmargin - global tko_wrapscan - global tko_writeany - - # Initialize option values. - tk_opt_init - - # Build subframe for boolean options. - frame .os.bopts - - # This is the width of the edcompatible button. - set buttonwidth 13 - - # Pack the boolean os, 5 to a frame. - frame .os.bopts.f1 - pack append .os.bopts .os.bopts.f1 {top} - checkbutton .os.bopts.f1.b1 \ - -variable tko_altwerase -text "altwerase" \ - -command "tk_opt_set altwerase $tko_altwerase" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f1.b2 \ - -variable tko_autoindent -text "autoindent" \ - -command "tk_opt_set autoindent $tko_autoindent" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f1.b3 \ - -variable tko_autoprint -text "autoprint" \ - -command "tk_opt_set autoprint $tko_autoprint" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f1.b4 \ - -variable tko_autowrite -text "autowrite" \ - -command "tk_opt_set autowrite $tko_autowrite" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f1.b5 \ - -variable tko_beautify -text "beautify" \ - -command "tk_opt_set beautify $tko_beautify" \ - -width $buttonwidth -anchor w - pack append .os.bopts.f1 \ - .os.bopts.f1.b1 {left frame w} \ - .os.bopts.f1.b2 {left frame w} \ - .os.bopts.f1.b3 {left frame w} \ - .os.bopts.f1.b4 {left frame w} \ - .os.bopts.f1.b5 {left frame w} - - frame .os.bopts.f2 - pack append .os.bopts .os.bopts.f2 {top} - checkbutton .os.bopts.f2.b1 \ - -variable tko_comment -text "comment" \ - -command "tk_opt_set comment $tko_comment" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f2.b2 \ - -variable tko_edcompatible -text "edcompatible" \ - -command "tk_opt_set edcompatible $tko_edcompatible" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f2.b3 \ - -variable tko_errorbells -text "errorbells" \ - -command "tk_opt_set errorbells $tko_errorbells" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f2.b4 \ - -variable tko_exrc -text "exrc" \ - -command "tk_opt_set exrc $tko_exrc" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f2.b5 \ - -variable tko_extended -text "extended" \ - -command "tk_opt_set extended $tko_extended" \ - -width $buttonwidth -anchor w - pack append .os.bopts.f2 \ - .os.bopts.f2.b1 {left frame w} \ - .os.bopts.f2.b2 {left frame w} \ - .os.bopts.f2.b3 {left frame w} \ - .os.bopts.f2.b4 {left frame w} \ - .os.bopts.f2.b5 {left frame w} - - frame .os.bopts.f3 - pack append .os.bopts .os.bopts.f3 {top} - checkbutton .os.bopts.f3.b1 \ - -variable tko_flash -text "flash" \ - -command "tk_opt_set flash $tko_flash" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f3.b2 \ - -variable tko_iclower -text "iclower" \ - -command "tk_opt_set iclower $tko_iclower" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f3.b3 \ - -variable tko_ignorecase -text "ignorecase" \ - -command "tk_opt_set ignorecase $tko_ignorecase" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f3.b4 \ - -variable tko_leftright -text "leftright" \ - -command "tk_opt_set leftright $tko_leftright" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f3.b5 \ - -variable tko_lisp -text "lisp" \ - -command "tk_opt_set lisp $tko_lisp" \ - -width $buttonwidth -anchor w - pack append .os.bopts.f3 \ - .os.bopts.f3.b1 {left frame w} \ - .os.bopts.f3.b2 {left frame w} \ - .os.bopts.f3.b3 {left frame w} \ - .os.bopts.f3.b4 {left frame w} \ - .os.bopts.f3.b5 {left frame w} - - frame .os.bopts.f4 - pack append .os.bopts .os.bopts.f4 {top} - checkbutton .os.bopts.f4.b1 \ - -variable tko_list -text "list" \ - -command "tk_opt_set list $tko_list" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f4.b2 \ - -variable tko_lock -text "lock" \ - -command "tk_opt_set lock $tko_lock" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f4.b3 \ - -variable tko_magic -text "magic" \ - -command "tk_opt_set magic $tko_magic" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f4.b4 \ - -variable tko_mesg -text "mesg" \ - -command "tk_opt_set mesg $tko_mesg" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f4.b5\ - -variable tko_number -text "number" \ - -command "tk_opt_set number $tko_number" \ - -width $buttonwidth -anchor w - pack append .os.bopts.f4 \ - .os.bopts.f4.b1 {left frame w} \ - .os.bopts.f4.b2 {left frame w} \ - .os.bopts.f4.b3 {left frame w} \ - .os.bopts.f4.b4 {left frame w} \ - .os.bopts.f4.b5 {left frame w} - - frame .os.bopts.f5 - pack append .os.bopts .os.bopts.f5 {top} - checkbutton .os.bopts.f5.b1 \ - -variable tko_octal -text "octal" \ - -command "tk_opt_set octal $tko_octal" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f5.b2 \ - -variable tko_open -text "open" \ - -command "tk_opt_set open $tko_open" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f5.b3 \ - -variable tko_optimize -text "optimize" \ - -command "tk_opt_set optimize $tko_optimize" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f5.b4 \ - -variable tko_prompt -text "prompt" \ - -command "tk_opt_set prompt $tko_prompt" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f5.b5 \ - -variable tko_readonly -text "readonly" \ - -command "tk_opt_set readonly $tko_readonly" \ - -width $buttonwidth -anchor w - pack append .os.bopts.f5 \ - .os.bopts.f5.b1 {left frame w} \ - .os.bopts.f5.b2 {left frame w} \ - .os.bopts.f5.b3 {left frame w} \ - .os.bopts.f5.b4 {left frame w} \ - .os.bopts.f5.b5 {left frame w} - - frame .os.bopts.f6 - pack append .os.bopts .os.bopts.f6 {top} - checkbutton .os.bopts.f6.b1 \ - -variable tko_remap -text "remap" \ - -command "tk_opt_set remap $tko_remap" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f6.b2 \ - -variable tko_ruler -text "ruler" \ - -command "tk_opt_set ruler $tko_ruler" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f6.b3 \ - -variable tko_searchincr -text "searchincr" \ - -command "tk_opt_set searchincr $tko_searchincr" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f6.b4 \ - -variable tko_secure -text "secure" \ - -command "tk_opt_set secure $tko_secure" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f6.b5 \ - -variable tko_showmatch -text "showmatch" \ - -command "tk_opt_set showmatch $tko_showmatch" \ - -width $buttonwidth -anchor w - pack append .os.bopts.f6 \ - .os.bopts.f6.b1 {left frame w} \ - .os.bopts.f6.b2 {left frame w} \ - .os.bopts.f6.b3 {left frame w} \ - .os.bopts.f6.b4 {left frame w} \ - .os.bopts.f6.b5 {left frame w} - - frame .os.bopts.f7 - pack append .os.bopts .os.bopts.f7 {top} - checkbutton .os.bopts.f7.b1 \ - -variable tko_showmode -text "showmode" \ - -command "tk_opt_set showmode $tko_showmode" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f7.b2 \ - -variable tko_slowopen -text "slowopen" \ - -command "tk_opt_set slowopen $tko_slowopen" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f7.b3 \ - -variable tko_sourceany -text "sourceany" \ - -command "tk_opt_set sourceany $tko_sourceany" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f7.b4 \ - -variable tko_terse -text "terse" \ - -command "tk_opt_set terse $tko_terse" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f7.b5 \ - -variable tko_tildeop -text "tildeop" \ - -command "tk_opt_set tildeope $tko_tildeop" \ - -width $buttonwidth -anchor w - pack append .os.bopts.f7 \ - .os.bopts.f7.b1 {left frame w} \ - .os.bopts.f7.b2 {left frame w} \ - .os.bopts.f7.b3 {left frame w} \ - .os.bopts.f7.b4 {left frame w} \ - .os.bopts.f7.b5 {left frame w} - - frame .os.bopts.f8 - pack append .os.bopts .os.bopts.f8 {top fillx} - checkbutton .os.bopts.f8.b1 \ - -variable tko_timeout -text "timeout" \ - -command "tk_opt_set timeout $tko_timeout" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f8.b2 \ - -variable tko_ttywerase -text "ttywerase" \ - -command "tk_opt_set ttywerase $tko_ttywerase" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f8.b3 \ - -variable tko_verbose -text "verbose" \ - -command "tk_opt_set verbose $tko_verbose" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f8.b4 \ - -variable tko_warn -text "warn" \ - -command "tk_opt_set warn $tko_warn" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f8.b5 \ - -variable tko_windowname -text "windowname" \ - -command "tk_opt_set windowname $tko_windowname" \ - -width $buttonwidth -anchor w - pack append .os.bopts.f8 \ - .os.bopts.f8.b1 {left frame w} \ - .os.bopts.f8.b2 {left frame w} \ - .os.bopts.f8.b3 {left frame w} \ - .os.bopts.f8.b4 {left frame w} \ - .os.bopts.f8.b5 {left frame w} - - frame .os.bopts.f9 - pack append .os.bopts .os.bopts.f9 {top fillx} - checkbutton .os.bopts.f9.b1 \ - -variable tko_wrapscan -text "wrapscan" \ - -command "tk_opt_set wrapscan $tko_wrapscan" \ - -width $buttonwidth -anchor w - checkbutton .os.bopts.f9.b2 \ - -variable tko_writeany -text "writeany" \ - -command "tk_opt_set writeany $tko_writeany" \ - -width $buttonwidth -anchor w - pack append .os.bopts.f9 \ - .os.bopts.f9.b1 {left frame w} \ - .os.bopts.f9.b2 {left frame w} - - # Build frame for number options: - frame .os.nopts - - # Label and entry widths. - set lwidth 12 - set ewidth 3 - - frame .os.nopts.n1 - label .os.nopts.n1.l -text "column:" -width $lwidth -anchor w - entry .os.nopts.n1.e -width $ewidth -relief raised \ - -textvariable tko_columns - trace variable tko_columns w tk_opt_ew - pack append .os.nopts.n1 \ - .os.nopts.n1.l {left} .os.nopts.n1.e {left frame w} - - frame .os.nopts.n2 - label .os.nopts.n2.l -text "escapetime:" -width $lwidth -anchor w - entry .os.nopts.n2.e -width $ewidth -textvariable tko_escapetime \ - -relief raised - trace variable tko_escapetime w tk_opt_ew - pack append .os.nopts.n2 \ - .os.nopts.n2.l {left} .os.nopts.n2.e {left frame w} - - frame .os.nopts.n3 - label .os.nopts.n3.l -text "hardtabs:" -width $lwidth -anchor w - entry .os.nopts.n3.e -width $ewidth -textvariable tko_hardtabs \ - -relief raised - trace variable tko_hardtabs w tk_opt_ew - pack append .os.nopts.n3 \ - .os.nopts.n3.l {left} .os.nopts.n3.e {left frame w} - - frame .os.nopts.n4 - label .os.nopts.n4.l -text "keytime:" -width $lwidth -anchor w - entry .os.nopts.n4.e -width $ewidth -textvariable tko_keytime \ - -relief raised - trace variable tko_keytime w tk_opt_ew - pack append .os.nopts.n4 \ - .os.nopts.n4.l {left} .os.nopts.n4.e {left frame w} - - frame .os.nopts.n5 - label .os.nopts.n5.l -text "lines:" -width $lwidth -anchor w - entry .os.nopts.n5.e -width $ewidth -textvariable tko_lines \ - -relief raised - trace variable tko_lines w tk_opt_ew - pack append .os.nopts.n5 \ - .os.nopts.n5.l {left} .os.nopts.n5.e {left frame w} - - frame .os.nopts.n6 - label .os.nopts.n6.l -text "matchtime:" -width $lwidth -anchor w - entry .os.nopts.n6.e -width $ewidth -textvariable tko_matchtime \ - -relief raised - trace variable tko_matchtime w tk_opt_ew - pack append .os.nopts.n6 \ - .os.nopts.n6.l {left} .os.nopts.n6.e {left frame w} - - frame .os.nopts.n7 - label .os.nopts.n7.l -text "report:" -width $lwidth -anchor w - entry .os.nopts.n7.e -width $ewidth -textvariable tko_report \ - -relief raised - trace variable tko_report w tk_opt_ew - pack append .os.nopts.n7 \ - .os.nopts.n7.l {left} .os.nopts.n7.e {left frame w} - - frame .os.nopts.n8 - label .os.nopts.n8.l -text "scroll:" -width $lwidth -anchor w - entry .os.nopts.n8.e -width $ewidth -textvariable tko_scroll \ - -relief raised - trace variable tko_scroll w tk_opt_ew - pack append .os.nopts.n8 \ - .os.nopts.n8.l {left} .os.nopts.n8.e {left frame w} - - frame .os.nopts.n9 - label .os.nopts.n9.l -text "shiftwidth:" -width $lwidth -anchor w - entry .os.nopts.n9.e -width $ewidth -textvariable tko_shiftwidth \ - -relief raised - trace variable tko_shiftwidth w tk_opt_ew - pack append .os.nopts.n9 \ - .os.nopts.n9.l {left} .os.nopts.n9.e {left frame w} - - frame .os.nopts.n10 - label .os.nopts.n10.l -text "sidescroll:" -width $lwidth -anchor w - entry .os.nopts.n10.e -width $ewidth -textvariable tko_sidescroll \ - -relief raised - trace variable tko_sidescroll w tk_opt_ew - pack append .os.nopts.n10 \ - .os.nopts.n10.l {left} .os.nopts.n10.e {left frame w} - - frame .os.nopts.n11 - label .os.nopts.n11.l -text "tabstop:" -width $lwidth -anchor w - entry .os.nopts.n11.e -width $ewidth -textvariable tko_tabstop \ - -relief raised - trace variable tko_tabstop w tk_opt_ew - pack append .os.nopts.n11 \ - .os.nopts.n11.l {left} .os.nopts.n11.e {left frame w} - - frame .os.nopts.n12 - label .os.nopts.n12.l -text "taglength:" -width $lwidth -anchor w - entry .os.nopts.n12.e -width $ewidth -textvariable tko_taglength \ - -relief raised - trace variable tko_taglength w tk_opt_ew - pack append .os.nopts.n12 \ - .os.nopts.n12.l {left} .os.nopts.n12.e {left frame w} - - frame .os.nopts.n13 - label .os.nopts.n13.l -text "window:" -width $lwidth -anchor w - entry .os.nopts.n13.e -width $ewidth -textvariable tko_window \ - -relief raised - trace variable tko_window w tk_opt_ew - pack append .os.nopts.n13 \ - .os.nopts.n13.l {left} .os.nopts.n13.e {left frame w} - - frame .os.nopts.n14 - label .os.nopts.n14.l -text "wraplen:" -width $lwidth -anchor w - entry .os.nopts.n14.e -width $ewidth -textvariable tko_wraplen \ - -relief raised - trace variable tko_wraplen w tk_opt_ew - pack append .os.nopts.n14 \ - .os.nopts.n14.l {left} .os.nopts.n14.e {left frame w} - - frame .os.nopts.n15 - label .os.nopts.n15.l -text "wrapmargin:" -width $lwidth -anchor w - entry .os.nopts.n15.e -width $ewidth -textvariable tko_wrapmargin \ - -relief raised - trace variable tko_wrapmargin w tk_opt_ew - pack append .os.nopts.n15 \ - .os.nopts.n15.l {left} .os.nopts.n15.e {left frame w} - - pack append .os.nopts \ - .os.nopts.n1 {top fillx} \ - .os.nopts.n3 {top expand fillx} \ - .os.nopts.n4 {top expand fillx} \ - .os.nopts.n5 {top expand fillx} \ - .os.nopts.n6 {top expand fillx} \ - .os.nopts.n7 {top expand fillx} \ - .os.nopts.n8 {top expand fillx} \ - .os.nopts.n9 {top expand fillx} \ - .os.nopts.n10 {top expand fillx} \ - .os.nopts.n11 {top expand fillx} \ - .os.nopts.n12 {top expand fillx} \ - .os.nopts.n13 {top expand fillx} \ - .os.nopts.n14 {top expand fillx} \ - .os.nopts.n15 {top expand fillx} - - # Build frame for string options - frame .os.sopts - - # Entry width. - set ewidth 40 - - frame .os.sopts.s1 - label .os.sopts.s1.l -text "backup:" -width $lwidth -anchor w - entry .os.sopts.s1.e -width $ewidth -textvariable tko_backup \ - -relief raised - pack append .os.sopts.s1 \ - .os.sopts.s1.l {left} .os.sopts.s1.e {left frame w} - - frame .os.sopts.s2 - label .os.sopts.s2.l -text "cdpath:" -width $lwidth -anchor w - entry .os.sopts.s2.e -width $ewidth -textvariable tko_cdpath \ - -relief raised - pack append .os.sopts.s2 \ - .os.sopts.s2.l {left} .os.sopts.s2.e {left frame w} - - frame .os.sopts.s3 - label .os.sopts.s3.l -text "directory:" -width $lwidth -anchor w - entry .os.sopts.s3.e -width $ewidth -textvariable tko_directory \ - -relief raised - pack append .os.sopts.s3 \ - .os.sopts.s3.l {left} .os.sopts.s3.e {left frame w} - - frame .os.sopts.s4 - label .os.sopts.s4.l -text "cedit:" -width $lwidth -anchor w - entry .os.sopts.s4.e -width $ewidth -textvariable tko_cedit \ - -relief raised - pack append .os.sopts.s4 \ - .os.sopts.s4.l {left} .os.sopts.s4.e {left frame w} - - frame .os.sopts.s5 - label .os.sopts.s5.l -text "filec:" -width $lwidth -anchor w - entry .os.sopts.s5.e -width $ewidth -textvariable tko_filec \ - -relief raised - pack append .os.sopts.s5 \ - .os.sopts.s5.l {left} .os.sopts.s5.e {left frame w} - - frame .os.sopts.s6 - label .os.sopts.s6.l -text "msgcat:" -width $lwidth -anchor w - entry .os.sopts.s6.e -width $ewidth -textvariable tko_msgcat \ - -relief raised - pack append .os.sopts.s6 \ - .os.sopts.s6.l {left} .os.sopts.s6.e {left frame w} - - frame .os.sopts.s7 - label .os.sopts.s7.l -text "noprint:" -width $lwidth -anchor w - entry .os.sopts.s7.e -width $ewidth -textvariable tko_noprint \ - -relief raised - pack append .os.sopts.s7 \ - .os.sopts.s7.l {left} .os.sopts.s7.e {left frame w} - - frame .os.sopts.s8 - label .os.sopts.s8.l -text "paragraphs:" -width $lwidth -anchor w - entry .os.sopts.s8.e -width $ewidth -textvariable tko_paragraphs \ - -relief raised - pack append .os.sopts.s8 \ - .os.sopts.s8.l {left} .os.sopts.s8.e {left frame w} - - frame .os.sopts.s9 - label .os.sopts.s9.l -text "print:" -width $lwidth -anchor w - entry .os.sopts.s9.e -width $ewidth -textvariable tko_print \ - -relief raised - pack append .os.sopts.s9 \ - .os.sopts.s9.l {left} .os.sopts.s9.e {left frame w} - - frame .os.sopts.s10 - label .os.sopts.s10.l -text "recdir:" -width $lwidth -anchor w - entry .os.sopts.s10.e -width $ewidth -textvariable tko_recdir \ - -relief raised - pack append .os.sopts.s10 \ - .os.sopts.s10.l {left} .os.sopts.s10.e {left frame w} - - frame .os.sopts.s11 - label .os.sopts.s11.l -text "sections:" -width $lwidth -anchor w - entry .os.sopts.s11.e -width $ewidth -textvariable tko_sections \ - -relief raised - pack append .os.sopts.s11 \ - .os.sopts.s11.l {left} .os.sopts.s11.e {left frame w} - - frame .os.sopts.s12 - label .os.sopts.s12.l -text "shell:" -width $lwidth -anchor w - entry .os.sopts.s12.e -width $ewidth -textvariable tko_shell \ - -relief raised - pack append .os.sopts.s12 \ - .os.sopts.s12.l {left} .os.sopts.s12.e {left frame w} - - frame .os.sopts.s13 - label .os.sopts.s13.l -text "shellmeta:" -width $lwidth -anchor w - entry .os.sopts.s13.e -width $ewidth -textvariable tko_shellmeta \ - -relief raised - pack append .os.sopts.s13 \ - .os.sopts.s13.l {left} .os.sopts.s13.e {left frame w} - - frame .os.sopts.s14 - label .os.sopts.s14.l -text "tags:" -width $lwidth -anchor w - entry .os.sopts.s14.e -width $ewidth -textvariable tko_tags \ - -relief raised - pack append .os.sopts.s14 \ - .os.sopts.s14.l {left} .os.sopts.s14.e {left frame w} - - frame .os.sopts.s15 - label .os.sopts.s15.l -text "term:" -width $lwidth -anchor w - entry .os.sopts.s15.e -width $ewidth -textvariable tko_term \ - -relief raised - pack append .os.sopts.s15 \ - .os.sopts.s15.l {left} .os.sopts.s15.e {left frame w} - - pack append .os.sopts \ - .os.sopts.s1 {top expand fillx} \ - .os.sopts.s2 {top expand fillx} \ - .os.sopts.s3 {top expand fillx} \ - .os.sopts.s4 {top expand fillx} \ - .os.sopts.s5 {top expand fillx} \ - .os.sopts.s6 {top expand fillx} \ - .os.sopts.s7 {top expand fillx} \ - .os.sopts.s8 {top expand fillx} \ - .os.sopts.s9 {top expand fillx} \ - .os.sopts.s10 {top expand fillx} \ - .os.sopts.s11 {top expand fillx} \ - .os.sopts.s12 {top expand fillx} \ - .os.sopts.s13 {top expand fillx} \ - .os.sopts.s14 {top expand fillx} \ - .os.sopts.s15 {top expand fillx} - - # Build frame for continue button. - frame .os.control -bd 4 - button .os.control.quit -text "Continue" -command "destroy .os" - bind .os ".os.control.quit flash; destroy .os" - pack append .os.control .os.control.quit {left} - - # Pack everything together. - pack append .os \ - .os.bopts {top} \ - .os.control {bottom fillx} \ - .os.nopts {left fillx padx 4m pady 4m} \ - .os.sopts {left fillx pady 4m} - - grab .os - focus .os -} - -# tk_opt_ew -- -# Handle a change to an option entry widget. -proc tk_opt_ew {name element op} { - upvar $name x - tk_opt_set "$name=$x" -} - -# tk_err -- -# Display a Tcl/Tk error message. -proc tk_err {msg} { - tk_dialog .d {} "$msg" {} 0 Continue - - #puts "msg: $msg" -} - -# tk_addstr -- -# Add a string to the screen. -proc tk_addstr {len str} { - global tk_cursor_row - global tk_cursor_col - - # Delete the current characters, then insert the new ones. - .t mark set insert $tk_cursor_row.$tk_cursor_col - .t delete insert "insert + $len chars" - .t insert insert "$str" - incr tk_cursor_col $len - - #puts "tk_addstr: row $tk_cursor_row col $tk_cursor_col: insert $str" -} - -# tk_clrtoeol -- -# Clear to the end of the line. -proc tk_clrtoeol {} { - global tk_cursor_row - global tk_cursor_col - global tk_ssize_col - - # Overwrite to the end of the line with spaces. - .t mark set insert $tk_cursor_row.$tk_cursor_col - .t delete insert "insert lineend" - for {set j $tk_cursor_col} {$j < $tk_ssize_col} {incr j} { - .t insert insert " " - } - - #puts "tk_clrtoel: row $tk_cursor_row col $tk_cursor_col" -} - -# tk_deleteln -- -# Delete the line. -proc tk_deleteln {} { - global tk_cursor_row - global tk_cursor_col - global tk_ssize_col - - # Delete the line. - .t mark set insert $tk_cursor_row.$tk_cursor_col - .t delete insert "insert lineend + 1 chars" - - # Append a new, blank line at the end of the screen. - .t mark set insert end - for {set j 1} {$j <= $tk_ssize_col} {incr j} { - .t insert insert " " - } - .t insert insert "\n" - - #puts "tk_deleteln: row $tk_cursor_row" -} - -# tk_flash -- -# Flash the screen. -proc tk_flash {} { - set bg [lindex [.t config -background] 4] - set fg [lindex [.t config -foreground] 4] - .t configure -background $fg -foreground $bg - update idletasks - .t configure -background $bg -foreground $fg - update idletasks -} - -# tk_insertln -- -# Insert the line. -proc tk_insertln {} { - global tk_cursor_row - global tk_cursor_col - global tk_ssize_row - global tk_ssize_col - - # Delete the last line on the screen. - .t mark set insert $tk_ssize_row.0 - .t delete insert "insert lineend + 1 chars" - - # Insert a new, blank line. - .t mark set insert $tk_cursor_row.$tk_cursor_col - for {set j 1} {$j <= $tk_ssize_col} {incr j} { - .t insert insert " " - } - .t insert insert "\n" - - #puts "tk_insertln: row $tk_cursor_row" -} - -# tk_move -- -# Move the cursor. -proc tk_move {row col} { - global tk_cursor_row - global tk_cursor_col - - # Convert to Tcl/Tk coordinates, update the insert cursor. - set tk_cursor_row [ expr $row + 1 ] - set tk_cursor_col $col - .t mark set insert $tk_cursor_row.$tk_cursor_col - - # Update the screen cursor. - .t tag remove tk_cursor tk_cursor_indx - .t mark set tk_cursor_indx insert - .t tag add tk_cursor tk_cursor_indx - - #puts "tk_move: row $tk_cursor_row col $tk_cursor_col" -} - -# tk_rename -- -# Rename the screen. -proc tk_rename {name} { - wm title . "$name" -} - -# tk_ssize -- -# Return the window size. -proc tk_ssize {} { - global tk_ssize_col - global tk_ssize_row - - set s [ .t configure -width ] - set tk_ssize_col [ lindex $s [ expr [ llength $s ] -1 ] ] - set s [ .t configure -height ] - set tk_ssize_row [ lindex $s [ expr [ llength $s ] -1 ] ] - - #puts "tk_ssize: rows $tk_ssize_row, cols $tk_ssize_col" -} - -# tk_standout -- -# Change into standout mode. -proc tk_standout {} { -} - -# tk_standend -- -# Change out of standout mode. -proc tk_standend {} { -} - -# Cursor -set tk_cursor_row 1 -set tk_cursor_col 0 - -# Screen size -set tk_ssize_row 0 -set tk_ssize_col 0 - -screen -#tkwait window . diff --git a/tk/tk_funcs.c b/tk/tk_funcs.c deleted file mode 100644 index be2b0d96ea09..000000000000 --- a/tk/tk_funcs.c +++ /dev/null @@ -1,346 +0,0 @@ -/*- - * Copyright (c) 1993, 1994 - * The Regents of the University of California. All rights reserved. - * Copyright (c) 1993, 1994, 1995, 1996 - * Keith Bostic. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)tk_funcs.c 8.11 (Berkeley) 9/23/96"; -#endif /* not lint */ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../common/common.h" -#include "../vi/vi.h" -#include "tki.h" - -/* - * tk_addstr -- - * Add len bytes from the string at the cursor, advancing the cursor. - * - * PUBLIC: int tk_addstr __P((SCR *, const char *, size_t)); - */ -int -tk_addstr(sp, str, len) - SCR *sp; - const char *str; - size_t len; -{ - TK_PRIVATE *tkp; - int iv; - char buf[20]; - - iv = 0; - - tkp = TKP(sp); - if (iv) - (void)Tcl_Eval(tkp->interp, "tk_standout"); - - (void)snprintf(buf, sizeof(buf), "%d ", (int)len); - if ((Tcl_VarEval(tkp->interp, - "tk_addstr ", buf, "{", str, "}", NULL) != TCL_OK)) - return (1); - - if (iv) - (void)Tcl_Eval(tkp->interp, "tk_standend"); - return (0); -} - -/* - * tk_attr -- - * Toggle a screen attribute on/off. - * - * PUBLIC: int tk_attr __P((SCR *, scr_attr_t, int)); - */ -int -tk_attr(sp, attribute, on) - SCR *sp; - scr_attr_t attribute; - int on; -{ - TK_PRIVATE *tkp; - - tkp = TKP(sp); - switch (attribute) { - case SA_ALTERNATE: /* No alternate screen. */ - break; - case SA_INVERSE: - if (on) - (void)Tcl_Eval(tkp->interp, "tk_standout"); - else - (void)Tcl_Eval(tkp->interp, "tk_standend"); - break; - default: - abort(); - } - return (0); -} - -/* - * tk_baud -- - * Return the baud rate. - * - * PUBLIC: int tk_baud __P((SCR *, u_long *)); - */ -int -tk_baud(sp, ratep) - SCR *sp; - u_long *ratep; -{ - *ratep = 9600; - return (0); -} - -/* - * tk_bell -- - * Ring the bell/flash the screen. - * - * PUBLIC: int tk_bell __P((SCR *)); - */ -int -tk_bell(sp) - SCR *sp; -{ - TK_PRIVATE *tkp; - - tkp = TKP(sp); - return (Tcl_Eval(tkp->interp, "tk_flash") != TCL_OK); -} - -/* - * tk_clrtoeol -- - * Clear from the current cursor to the end of the line. - * - * PUBLIC: int tk_clrtoeol __P((SCR *)); - */ -int -tk_clrtoeol(sp) - SCR *sp; -{ - TK_PRIVATE *tkp; - - tkp = TKP(sp); - return (Tcl_Eval(tkp->interp, "tk_clrtoeol") != TCL_OK); -} - -/* - * tk_cursor -- - * Return the current cursor position. - * - * PUBLIC: int tk_cursor __P((SCR *, size_t *, size_t *)); - */ -int -tk_cursor(sp, yp, xp) - SCR *sp; - size_t *yp, *xp; -{ - TK_PRIVATE *tkp; - - tkp = TKP(sp); - *yp = (tkp->tk_cursor_row - 1) - sp->woff; - *xp = tkp->tk_cursor_col; - return (0); -} - -/* - * tk_deleteln -- - * Delete the current line, scrolling all lines below it. - * - * PUBLIC: int tk_deleteln __P((SCR *)); - */ -int -tk_deleteln(sp) - SCR *sp; -{ - TK_PRIVATE *tkp; - - tkp = TKP(sp); - return (Tcl_Eval(tkp->interp, "tk_deleteln") != TCL_OK); -} - -/* - * tk_ex_adjust -- - * Adjust the screen for ex. - * - * PUBLIC: int tk_ex_adjust __P((SCR *, exadj_t)); - */ -int -tk_ex_adjust(sp, action) - SCR *sp; - exadj_t action; -{ - abort(); - /* NOTREACHED */ -} - -/* - * tk_insertln -- - * Push down the current line, discarding the bottom line. - * - * PUBLIC: int tk_insertln __P((SCR *)); - */ -int -tk_insertln(sp) - SCR *sp; -{ - TK_PRIVATE *tkp; - - tkp = TKP(sp); - return (Tcl_Eval(tkp->interp, "tk_insertln") != TCL_OK); -} - -/* - * tk_keyval -- - * Return the value for a special key. - * - * PUBLIC: int tk_keyval __P((SCR *, scr_keyval_t, CHAR_T *, int *)); - */ -int -tk_keyval(sp, val, chp, dnep) - SCR *sp; - scr_keyval_t val; - CHAR_T *chp; - int *dnep; -{ - TK_PRIVATE *tkp; - - /* - * VEOF, VERASE and VKILL are required by POSIX 1003.1-1990, - * VWERASE is a 4BSD extension. - */ - tkp = TKP(sp); - switch (val) { - case KEY_VEOF: - *dnep = (*chp = tkp->orig.c_cc[VEOF]) == _POSIX_VDISABLE; - break; - case KEY_VERASE: - *dnep = (*chp = tkp->orig.c_cc[VERASE]) == _POSIX_VDISABLE; - break; - case KEY_VKILL: - *dnep = (*chp = tkp->orig.c_cc[VKILL]) == _POSIX_VDISABLE; - break; -#ifdef VWERASE - case KEY_VWERASE: - *dnep = (*chp = tkp->orig.c_cc[VWERASE]) == _POSIX_VDISABLE; - break; -#endif - default: - *dnep = 1; - break; - } - return (0); -} - -/* - * tk_move -- - * Move the cursor. - * - * PUBLIC: int tk_move __P((SCR *, size_t, size_t)); - */ -int -tk_move(sp, lno, cno) - SCR *sp; - size_t lno, cno; -{ - TK_PRIVATE *tkp; - char buf[40]; - - (void)snprintf(buf, sizeof(buf), "%d %d", RLNO(sp, lno), cno); - - tkp = TKP(sp); - return (Tcl_VarEval(tkp->interp, "tk_move ", buf, NULL) != TCL_OK); -} - -/* - * tk_refresh -- - * Refresh the screen. - * - * PUBLIC: int tk_refresh __P((SCR *, int)); - */ -int -tk_refresh(sp, repaint) - SCR *sp; - int repaint; -{ - TK_PRIVATE *tkp; - - /* - * If repaint is set, the editor is telling us that we don't know - * what's on the screen, so we have to repaint from scratch. - * - * XXX - * I have no idea how to do this in Tk. My guess is that we have - * to delete all of the text and call the editor with an E_REPAINT - * event. - */ - if (repaint) { - } - - tkp = TKP(sp); - return (Tcl_Eval(tkp->interp, "update idletasks") != TCL_OK); -} - -/* - * tk_rename -- - * Rename the file. - * - * PUBLIC: int tk_rename __P((SCR *)); - */ -int -tk_rename(sp) - SCR *sp; -{ - TK_PRIVATE *tkp; - - tkp = TKP(sp); - return (Tcl_VarEval(tkp->interp, - "tk_rename ", sp->frp->name, NULL) != TCL_OK); -} - -/* - * tk_suspend -- - * Suspend a screen. - * - * PUBLIC: int tk_suspend __P((SCR *, int *)); - */ -int -tk_suspend(sp, allowedp) - SCR *sp; - int *allowedp; -{ - *allowedp = 0; - return (0); -} - -/* - * tk_usage -- - * Print out the Tk/Tcl usage messages. - * - * PUBLIC: void tk_usage __P((void)); - */ -void -tk_usage() -{ -#define USAGE "\ -usage: tkvi [-eFlRrSv] [-c command] [-bg color] [-fg color]\n\ - [-geometry widthxheight+x+y] [-i script] [-t tag] [-w size]\n\ - [file ...]\n" - (void)fprintf(stderr, "%s", USAGE); -#undef USAGE -} diff --git a/tk/tk_main.c b/tk/tk_main.c deleted file mode 100644 index c2f34e7b2d9f..000000000000 --- a/tk/tk_main.c +++ /dev/null @@ -1,423 +0,0 @@ -/*- - * Copyright (c) 1993, 1994 - * The Regents of the University of California. All rights reserved. - * Copyright (c) 1993, 1994, 1995, 1996 - * Keith Bostic. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)tk_main.c 8.18 (Berkeley) 9/24/96"; -#endif /* not lint */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../common/common.h" -#include "tki.h" -#include "pathnames.h" - -GS *__global_list; /* GLOBAL: List of screens. */ -sigset_t __sigblockset; /* GLOBAL: Blocked signals. */ - -static GS *gs_init __P((char *)); -static void killsig __P((SCR *)); -static void perr __P((char *, char *)); -static void sig_end __P((GS *)); -static int sig_init __P((GS *)); -static int tcl_init __P((GS *)); -static void tcl_err __P((TK_PRIVATE *)); - -/* - * main -- - * This is the main loop for the standalone Tcl/Tk editor. - */ -int -main(argc, argv) - int argc; - char *argv[]; -{ - static int reenter; - GS *gp; - TK_PRIVATE *tkp; - size_t rows, cols; - int rval; - char **p_av, **t_av, *script; - - /* If loaded at 0 and jumping through a NULL pointer, stop. */ - if (reenter++) - abort(); - - /* Create and initialize the global structure. */ - __global_list = gp = gs_init(argv[0]); - - /* Initialize Tk/Tcl. */ - if (tcl_init(gp)) - exit (1); - - /* - * Strip out any arguments that the common editor doesn't understand - * (i.e. the Tk/Tcl arguments). Search for -i first, it's the Tk/Tcl - * startup script and needs to be run first. - * - * XXX - * There's no way to portably call getopt twice. - */ - script = "init.tcl"; - for (p_av = t_av = argv;;) { - if (*t_av == NULL) { - *p_av = NULL; - break; - } - if (!strcmp(*t_av, "--")) { - while ((*p_av++ = *t_av++) != NULL); - break; - } - if (!memcmp(*t_av, "-i", sizeof("-i") - 1)) { - if (t_av[0][2] != '\0') { - script = t_av[0] + 2; - ++t_av; - --argc; - continue; - } - if (t_av[1] != NULL) { - script = t_av[1]; - t_av += 2; - argc -= 2; - continue; - } - } - *p_av++ = *t_av++; - } - for (p_av = t_av = argv;;) { - if (*t_av == NULL) { - *p_av = NULL; - break; - } - if (!strcmp(*t_av, "--")) { - while ((*p_av++ = *t_av++) != NULL); - break; - } - if (t_av[1] != NULL && - (!memcmp(*t_av, "-background", sizeof("-background") - 1) || - !memcmp(*t_av, "-bg", sizeof("-bg") - 1) || - !memcmp(*t_av, "-borderwidth", sizeof("-borderwidth") - 1)|| - !memcmp(*t_av, "-bd", sizeof("-bd") - 1) || - !memcmp(*t_av, "-foreground", sizeof("-foreground") - 1) || - !memcmp(*t_av, "-fg", sizeof("-fg") - 1) || - !memcmp(*t_av, "-font", sizeof("-font") - 1))) { - if (Tcl_VarEval(tkp->interp, ".t configure ", - t_av[0], " ", t_av[1], NULL) == TCL_ERROR) - tcl_err(tkp); - t_av += 2; - argc -= 2; - continue; - } - if (!memcmp(*t_av, "-geometry", sizeof("-geometry") - 1)) { - if (Tcl_VarEval(tkp->interp, "wm geometry . ", - *t_av + sizeof("-geometry") - 1, NULL) == TCL_ERROR) - tcl_err(tkp); - ++t_av; - --argc; - continue; - } - *p_av++ = *t_av++; - } - - /* Load the initial Tcl/Tk script. */ - tkp = GTKP(gp); - if (Tcl_EvalFile(tkp->interp, script) == TCL_ERROR) - tcl_err(tkp); - - /* Add the terminal type to the global structure. */ - if ((OG_D_STR(gp, GO_TERM) = - OG_STR(gp, GO_TERM) = strdup("tkterm")) == NULL) - perr(gp->progname, NULL); - - /* Figure out how big the screen is. */ - if (tk_ssize(NULL, 0, &rows, &cols, NULL)) - exit (1); - - /* Add the rows and columns to the global structure. */ - OG_VAL(gp, GO_LINES) = OG_D_VAL(gp, GO_LINES) = rows; - OG_VAL(gp, GO_COLUMNS) = OG_D_VAL(gp, GO_COLUMNS) = cols; - - /* Start catching signals. */ - if (sig_init(gp)) - exit (1); - - /* Run ex/vi. */ - rval = editor(gp, argc, argv); - - /* Clean up signals. */ - sig_end(gp); - - /* Clean up the terminal. */ - (void)tk_quit(gp); - - /* If a killer signal arrived, pretend we just got it. */ - if (tkp->killersig) { - (void)signal(tkp->killersig, SIG_DFL); - (void)kill(getpid(), tkp->killersig); - /* NOTREACHED */ - } - - /* Free the global and TK private areas. */ -#if defined(DEBUG) || defined(PURIFY) || defined(LIBRARY) - free(tkp); - free(gp); -#endif - - exit (rval); -} - -/* - * gs_init -- - * Create and partially initialize the GS structure. - */ -static GS * -gs_init(name) - char *name; -{ - TK_PRIVATE *tkp; - GS *gp; - int fd; - char *p; - - /* Figure out what our name is. */ - if ((p = strrchr(name, '/')) != NULL) - name = p + 1; - - /* Allocate the global structure. */ - CALLOC_NOMSG(NULL, gp, GS *, 1, sizeof(GS)); - - /* Allocate the CL private structure. */ - if (gp != NULL) - CALLOC_NOMSG(NULL, tkp, TK_PRIVATE *, 1, sizeof(TK_PRIVATE)); - if (gp == NULL || tkp == NULL) - perr(name, NULL); - gp->tk_private = tkp; - TAILQ_INIT(&tkp->evq); - - /* Initialize the list of curses functions. */ - gp->scr_addstr = tk_addstr; - gp->scr_attr = tk_attr; - gp->scr_baud = tk_baud; - gp->scr_bell = tk_bell; - gp->scr_busy = NULL; - gp->scr_clrtoeol = tk_clrtoeol; - gp->scr_cursor = tk_cursor; - gp->scr_deleteln = tk_deleteln; - gp->scr_event = tk_event; - gp->scr_ex_adjust = tk_ex_adjust; - gp->scr_fmap = tk_fmap; - gp->scr_insertln = tk_insertln; - gp->scr_keyval = tk_keyval; - gp->scr_move = tk_move; - gp->scr_msg = NULL; - gp->scr_optchange = tk_optchange; - gp->scr_refresh = tk_refresh; - gp->scr_rename = tk_rename; - gp->scr_screen = tk_screen; - gp->scr_suspend = tk_suspend; - gp->scr_usage = tk_usage; - - /* - * We expect that if we've lost our controlling terminal that the - * open() (but not the tcgetattr()) will fail. - */ - if (isatty(STDIN_FILENO)) { - if (tcgetattr(STDIN_FILENO, &tkp->orig) == -1) - goto tcfail; - } else if ((fd = open(_PATH_TTY, O_RDONLY, 0)) != -1) { - if (tcgetattr(fd, &tkp->orig) == -1) -tcfail: perr(name, "tcgetattr"); - (void)close(fd); - } - - gp->progname = name; - return (gp); -} - -/* - * tcl_init -- - * Get Tcl/Tk up and running. - */ -static int -tcl_init(gp) - GS *gp; -{ - TK_PRIVATE *tkp; - - tkp = GTKP(gp); - if ((tkp->interp = Tcl_CreateInterp()) == NULL) - tcl_err(tkp); - /* XXX: Tk 4.1 has an incompatible change. */ -#if (TK_MAJOR_VERSION == 4) && (TK_MINOR_VERSION == 0) - if (Tk_CreateMainWindow(tkp->interp, NULL, "vi", "Vi") == NULL) - tcl_err(tkp); -#endif - if (Tcl_Init(tkp->interp) == TCL_ERROR) - tcl_err(tkp); - if (Tk_Init(tkp->interp) == TCL_ERROR) - tcl_err(tkp); - - /* Shared variables. */ - (void)Tcl_LinkVar(tkp->interp, - "tk_cursor_row", (char *)&tkp->tk_cursor_row, TCL_LINK_INT); - (void)Tcl_LinkVar(tkp->interp, - "tk_cursor_col", (char *)&tkp->tk_cursor_col, TCL_LINK_INT); - (void)Tcl_LinkVar(tkp->interp, - "tk_ssize_row", (char *)&tkp->tk_ssize_row, TCL_LINK_INT); - (void)Tcl_LinkVar(tkp->interp, - "tk_ssize_col", (char *)&tkp->tk_ssize_col, TCL_LINK_INT); - - /* Functions called by Tcl script. */ - Tcl_CreateCommand(tkp->interp, "tk_key", tk_key, tkp, NULL); - Tcl_CreateCommand(tkp->interp, "tk_op", tk_op, tkp, NULL); - Tcl_CreateCommand(tkp->interp, "tk_opt_init", tk_opt_init, tkp, NULL); - Tcl_CreateCommand(tkp->interp, "tk_opt_set", tk_opt_set, tkp, NULL); - Tcl_CreateCommand(tkp->interp, "tk_version", tk_version, tkp, NULL); - - /* Other initialization. */ - if (Tcl_Eval(tkp->interp, "wm geometry . =80x28+0+0") == TCL_ERROR) - tcl_err(tkp); - return (0); -} - -/* - * tcl_err -- - * Tcl/Tk error message during initialization. - */ -static void -tcl_err(tkp) - TK_PRIVATE *tkp; -{ - (void)fprintf(stderr, "%s\n", tkp->interp->result != NULL ? - tkp->interp->result : "Tcl/Tk: initialization error"); - (void)tk_usage(); - exit (1); -} - -#define GLOBAL_TKP \ - TK_PRIVATE *tkp = GTKP(__global_list); -static void -h_hup(signo) - int signo; -{ - GLOBAL_TKP; - - F_SET(tkp, TK_SIGHUP); - tkp->killersig = SIGHUP; -} - -static void -h_int(signo) - int signo; -{ - GLOBAL_TKP; - - F_SET(tkp, TK_SIGINT); -} - -static void -h_term(signo) - int signo; -{ - GLOBAL_TKP; - - F_SET(tkp, TK_SIGTERM); - tkp->killersig = SIGTERM; -} - -static void -h_winch(signo) - int signo; -{ - GLOBAL_TKP; - - F_SET(tkp, TK_SIGWINCH); -} -#undef GLOBAL_TKP - -/* - * sig_init -- - * Initialize signals. - */ -static int -sig_init(gp) - GS *gp; -{ - TK_PRIVATE *tkp; - struct sigaction act; - - tkp = GTKP(gp); - - (void)sigemptyset(&__sigblockset); - - /* - * Use sigaction(2), not signal(3), since we don't always want to - * restart system calls. The example is when waiting for a command - * mode keystroke and SIGWINCH arrives. Besides, you can't portably - * restart system calls (thanks, POSIX!). - */ -#define SETSIG(signal, handler, off) { \ - if (sigaddset(&__sigblockset, signal)) \ - goto err; \ - act.sa_handler = handler; \ - sigemptyset(&act.sa_mask); \ - act.sa_flags = 0; \ - if (sigaction(signal, &act, &tkp->oact[off])) \ - goto err; \ -} -#undef SETSIG - return (0); - -err: perr(gp->progname, NULL); - return (1); -} - -/* - * sig_end -- - * End signal setup. - */ -static void -sig_end(gp) - GS *gp; -{ - TK_PRIVATE *tkp; - - tkp = GTKP(gp); - (void)sigaction(SIGHUP, NULL, &tkp->oact[INDX_HUP]); - (void)sigaction(SIGINT, NULL, &tkp->oact[INDX_INT]); - (void)sigaction(SIGTERM, NULL, &tkp->oact[INDX_TERM]); - (void)sigaction(SIGWINCH, NULL, &tkp->oact[INDX_WINCH]); -} - -/* - * perr -- - * Print system error. - */ -static void -perr(name, msg) - char *name, *msg; -{ - (void)fprintf(stderr, "%s:", name); - if (msg != NULL) - (void)fprintf(stderr, "%s:", msg); - (void)fprintf(stderr, "%s\n", strerror(errno)); - exit(1); -} diff --git a/tk/tk_read.c b/tk/tk_read.c deleted file mode 100644 index b5cfab71c7e2..000000000000 --- a/tk/tk_read.c +++ /dev/null @@ -1,207 +0,0 @@ -/*- - * Copyright (c) 1993, 1994 - * The Regents of the University of California. All rights reserved. - * Copyright (c) 1993, 1994, 1995, 1996 - * Keith Bostic. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)tk_read.c 8.12 (Berkeley) 9/24/96"; -#endif /* not lint */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../common/common.h" -#include "../ex/script.h" -#include "tki.h" - -static input_t tk_read __P((SCR *, int)); -static int tk_resize __P((SCR *, size_t, size_t)); - - -/* - * tk_event -- - * Return a single event. - * - * PUBLIC: int tk_event __P((SCR *, EVENT *, u_int32_t, int)); - */ -int -tk_event(sp, evp, flags, timeout) - SCR *sp; - EVENT *evp; - u_int32_t flags; - int timeout; -{ - EVENT *tevp; - TK_PRIVATE *tkp; - size_t lines, columns; - int changed; - - /* - * Queue signal based events. We never clear SIGHUP or SIGTERM events, - * so that we just keep returning them until the editor dies. - */ - tkp = TKP(sp); -sig: if (LF_ISSET(EC_INTERRUPT) || F_ISSET(tkp, TK_SIGINT)) { - if (F_ISSET(tkp, TK_SIGINT)) { - F_CLR(tkp, TK_SIGINT); - evp->e_event = E_INTERRUPT; - } else - evp->e_event = E_TIMEOUT; - return (0); - } - if (F_ISSET(tkp, TK_SIGHUP | TK_SIGTERM | TK_SIGWINCH)) { - if (F_ISSET(tkp, TK_SIGHUP)) { - evp->e_event = E_SIGHUP; - return (0); - } - if (F_ISSET(tkp, TK_SIGTERM)) { - evp->e_event = E_SIGTERM; - return (0); - } - if (F_ISSET(tkp, TK_SIGWINCH)) { - F_CLR(tkp, TK_SIGWINCH); - (void)tk_ssize(sp, 1, &lines, &columns, &changed); - if (changed) { - (void)tk_resize(sp, lines, columns); - evp->e_event = E_WRESIZE; - return (0); - } - /* No change, so ignore the signal. */ - } - } - - /* Queue special ops. */ -ops: if ((tevp = tkp->evq.tqh_first) != NULL) { - *evp = *tevp; - TAILQ_REMOVE(&tkp->evq, tevp, q); - free(tevp); - return (0); - } - - /* Read input characters. */ - switch (tk_read(sp, timeout)) { - case INP_OK: - evp->e_csp = tkp->ibuf; - evp->e_len = tkp->ibuf_cnt; - evp->e_event = E_STRING; - tkp->ibuf_cnt = 0; - break; - case INP_EOF: - evp->e_event = E_EOF; - break; - case INP_ERR: - evp->e_event = E_ERR; - break; - case INP_INTR: - goto sig; - break; - case INP_TIMEOUT: - /* May have returned because queued a special op. */ - if (tkp->evq.tqh_first != NULL) - goto ops; - - /* Otherwise, we timed out. */ - evp->e_event = E_TIMEOUT; - break; - default: - abort(); - } - return (0); -} - -/* - * tk_read -- - * Read characters from the input. - */ -static input_t -tk_read(sp, timeout) - SCR *sp; - int timeout; -{ - TK_PRIVATE *tkp; - char buf[20]; - - /* - * Check scripting window file descriptors. It's ugly that we wait - * on scripting file descriptors here, but it's the only way to keep - * from locking out scripting windows. - */ - if (F_ISSET(sp->gp, G_SCRWIN) && sscr_input(sp)) - return (INP_ERR); - - /* Read characters. */ - tkp = TKP(sp); - (void)snprintf(buf, sizeof(buf), "%d", timeout); - (void)Tcl_VarEval(tkp->interp, "tk_key_wait ", buf, NULL); - - return (tkp->ibuf_cnt == 0 ? INP_TIMEOUT : INP_OK); -} - -/* - * tk_key -- - * Receive an input key. - * - * PUBLIC: int tk_key __P((ClientData, Tcl_Interp *, int, char *[])); - */ -int -tk_key(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char *argv[]; -{ - TK_PRIVATE *tkp; - u_int8_t *p, *t; - - tkp = (TK_PRIVATE *)clientData; - for (p = - tkp->ibuf + tkp->ibuf_cnt, t = argv[1]; (*p++ = *t++) != '\0'; - ++tkp->ibuf_cnt); - return (TCL_OK); -} - -/* - * tk_resize -- - * Reset the options for a resize event. - */ -static int -tk_resize(sp, lines, columns) - SCR *sp; - size_t lines, columns; -{ - ARGS *argv[2], a, b; - int rval; - char b1[1024]; - - a.bp = b1; - b.bp = NULL; - a.len = b.len = 0; - argv[0] = &a; - argv[1] = &b; - - (void)snprintf(b1, sizeof(b1), "lines=%lu", (u_long)lines); - a.len = strlen(b1); - if (opts_set(sp, argv, NULL)) - return (1); - (void)snprintf(b1, sizeof(b1), "columns=%lu", (u_long)columns); - a.len = strlen(b1); - if (opts_set(sp, argv, NULL)) - return (1); - return (0); -} diff --git a/tk/tk_screen.c b/tk/tk_screen.c deleted file mode 100644 index e1090930ba23..000000000000 --- a/tk/tk_screen.c +++ /dev/null @@ -1,86 +0,0 @@ -/*- - * Copyright (c) 1993, 1994 - * The Regents of the University of California. All rights reserved. - * Copyright (c) 1993, 1994, 1995, 1996 - * Keith Bostic. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)tk_screen.c 8.9 (Berkeley) 5/24/96"; -#endif /* not lint */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../common/common.h" -#include "tki.h" - -/* - * tk_screen -- - * Initialize/shutdown the Tcl/Tk screen. - * - * PUBLIC: int tk_screen __P((SCR *, u_int32_t)); - */ -int -tk_screen(sp, flags) - SCR *sp; - u_int32_t flags; -{ - TK_PRIVATE *tkp; - - tkp = TKP(sp); - - /* See if we're already in the right mode. */ - if (LF_ISSET(SC_VI) && F_ISSET(sp, SC_SCR_VI)) - return (0); - - /* Ex isn't possible. */ - if (LF_ISSET(SC_EX)) - return (1); - - /* Initialize terminal based information. */ - if (tk_term_init(sp)) - return (1); - - /* Put up the first file name. */ - if (tk_rename(sp)) - return (1); - - F_SET(tkp, TK_SCR_VI_INIT); - return (0); -} - -/* - * tk_quit -- - * Shutdown the screens. - * - * PUBLIC: int tk_quit __P((GS *)); - */ -int -tk_quit(gp) - GS *gp; -{ - TK_PRIVATE *tkp; - int rval; - - /* Clean up the terminal mappings. */ - rval = tk_term_end(gp); - - tkp = GTKP(gp); - F_CLR(tkp, TK_SCR_VI_INIT); - - return (rval); -} diff --git a/tk/tk_term.c b/tk/tk_term.c deleted file mode 100644 index 18299a28ae77..000000000000 --- a/tk/tk_term.c +++ /dev/null @@ -1,169 +0,0 @@ -/*- - * Copyright (c) 1993, 1994 - * The Regents of the University of California. All rights reserved. - * Copyright (c) 1993, 1994, 1995, 1996 - * Keith Bostic. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)tk_term.c 8.12 (Berkeley) 10/13/96"; -#endif /* not lint */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../common/common.h" -#include "tki.h" - -/* - * tk_term_init -- - * Initialize the terminal special keys. - * - * PUBLIC: int tk_term_init __P((SCR *)); - */ -int -tk_term_init(sp) - SCR *sp; -{ - SEQ *qp; - - /* - * Rework any function key mappings that were set before the - * screen was initialized. - */ - for (qp = sp->gp->seqq.lh_first; qp != NULL; qp = qp->q.le_next) - if (F_ISSET(qp, SEQ_FUNCMAP)) - (void)tk_fmap(sp, qp->stype, - qp->input, qp->ilen, qp->output, qp->olen); - return (0); -} - -/* - * tk_term_end -- - * End the special keys defined by the termcap/terminfo entry. - * - * PUBLIC: int tk_term_end __P((GS *)); - */ -int -tk_term_end(gp) - GS *gp; -{ - SEQ *qp, *nqp; - - /* Delete screen specific mappings. */ - for (qp = gp->seqq.lh_first; qp != NULL; qp = nqp) { - nqp = qp->q.le_next; - if (F_ISSET(qp, SEQ_SCREEN)) - (void)seq_mdel(qp); - } - return (0); -} - -/* - * tk_fmap -- - * Map a function key. - * - * PUBLIC: int tk_fmap __P((SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t)); - */ -int -tk_fmap(sp, stype, from, flen, to, tlen) - SCR *sp; - seq_t stype; - CHAR_T *from, *to; - size_t flen, tlen; -{ - VI_INIT_IGNORE(sp); - - /* Bind a Tk/Tcl function key to a string sequence. */ - return (0); -} - -/* - * tk_optchange -- - * Curses screen specific "option changed" routine. - * - * PUBLIC: int tk_optchange __P((SCR *, int, char *, u_long *)); - */ -int -tk_optchange(sp, opt, str, valp) - SCR *sp; - int opt; - char *str; - u_long *valp; -{ - switch (opt) { - case O_COLUMNS: - case O_LINES: - /* - * Changing the columns or lines require that we restart - * the screen. - */ - F_SET(sp->gp, G_SRESTART); - F_CLR(sp, SC_SCR_EX | SC_SCR_VI); - break; - case O_TERM: - msgq(sp, M_ERR, "The screen type may not be changed"); - return (1); - } - return (0); -} - -/* - * tk_ssize -- - * Return the window size. - * - * PUBLIC: int tk_ssize __P((SCR *, int, size_t *, size_t *, int *)); - */ -int -tk_ssize(sp, sigwinch, rowp, colp, changedp) - SCR *sp; - int sigwinch; - size_t *rowp, *colp; - int *changedp; -{ - TK_PRIVATE *tkp; - - tkp = GTKP(__global_list); - (void)Tcl_Eval(tkp->interp, "tk_ssize"); - - /* - * SunOS systems deliver SIGWINCH when windows are uncovered - * as well as when they change size. In addition, we call - * here when continuing after being suspended since the window - * may have changed size. Since we don't want to background - * all of the screens just because the window was uncovered, - * ignore the signal if there's no change. - * - * !!! - * sp may be NULL. - */ - if (sigwinch && sp != NULL && - tkp->tk_ssize_row == O_VAL(sp, O_LINES) && - tkp->tk_ssize_col == O_VAL(sp, O_COLUMNS)) { - if (changedp != NULL) - *changedp = 0; - return (0); - } - - if (rowp != NULL) - *rowp = tkp->tk_ssize_row; - if (colp != NULL) - *colp = tkp->tk_ssize_col; - if (changedp != NULL) - *changedp = 1; - return (0); -} diff --git a/tk/tk_util.c b/tk/tk_util.c deleted file mode 100644 index 096fa7bb3eba..000000000000 --- a/tk/tk_util.c +++ /dev/null @@ -1,250 +0,0 @@ -/*- - * Copyright (c) 1993, 1994 - * The Regents of the University of California. All rights reserved. - * Copyright (c) 1993, 1994, 1995, 1996 - * Keith Bostic. All rights reserved. - * - * See the LICENSE file for redistribution information. - */ - -#include "config.h" - -#ifndef lint -static const char sccsid[] = "@(#)tk_util.c 8.14 (Berkeley) 7/19/96"; -#endif /* not lint */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../common/common.h" -#include "tki.h" - -static int tk_op_push __P((SCR *, TK_PRIVATE *, e_event_t)); - -/* - * tk_op -- - * Events provided directly from Tcl/Tk. - * - * PUBLIC: int tk_op __P((ClientData, Tcl_Interp *, int, char *[])); - */ -int -tk_op(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char *argv[]; -{ - SCR *sp; - TK_PRIVATE *tkp; - - sp = __global_list->dq.cqh_first; /* XXX */ - tkp = (TK_PRIVATE *)clientData; - - switch (argv[1][0]) { - case 'q': - if (!strcmp(argv[1], "quit")) - return (tk_op_push(sp, tkp, E_QUIT)); - break; - case 'w': - if (!strcmp(argv[1], "write")) - return (tk_op_push(sp, tkp, E_WRITE)); - if (!strcmp(argv[1], "writequit")) { - if (tk_op_push(sp, tkp, E_WRITE) != TCL_OK) - return (TCL_ERROR); - if (tk_op_push(sp, tkp, E_QUIT) != TCL_OK) - return (TCL_ERROR); - return (TCL_OK); - } - break; - } - (void)Tcl_VarEval(tkp->interp, - "tk_err {", argv[1], ": unknown event", "}", NULL); - return (TCL_OK); -} - -/* - * tk_op_push -- - * Push an event. - */ -static int -tk_op_push(sp, tkp, et) - SCR *sp; - TK_PRIVATE *tkp; - e_event_t et; -{ - EVENT *evp; - - CALLOC(sp, evp, EVENT *, 1, sizeof(EVENT)); - if (evp == NULL) - return (TCL_ERROR); - - evp->e_event = et; - TAILQ_INSERT_TAIL(&tkp->evq, evp, q); - return (TCL_OK); -} - -/* - * tk_opt_init -- - * Initialize the values of the current options. - * - * PUBLIC: int tk_opt_init __P((ClientData, Tcl_Interp *, int, char *[])); - */ -int -tk_opt_init(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char *argv[]; -{ - OPTLIST const *op; - SCR *sp; - TK_PRIVATE *tkp; - int off; - char buf[20]; - - sp = __global_list->dq.cqh_first; /* XXX */ - - tkp = (TK_PRIVATE *)clientData; - for (op = optlist, off = 0; op->name != NULL; ++op, ++off) { - if (F_ISSET(op, OPT_NDISP)) - continue; - switch (op->type) { - case OPT_0BOOL: - case OPT_1BOOL: - (void)Tcl_VarEval(tkp->interp, "set tko_", - op->name, O_ISSET(sp, off) ? " 1" : " 0", NULL); - break; - case OPT_NUM: - (void)snprintf(buf, - sizeof(buf), " %lu", O_VAL(sp, off)); - (void)Tcl_VarEval(tkp->interp, - "set tko_", op->name, buf, NULL); - break; - case OPT_STR: - (void)Tcl_VarEval(tkp->interp, - "set tko_", op->name, " {", - O_STR(sp, off) == NULL ? "" : O_STR(sp, off), - "}", NULL); - break; - } - } - return (TCL_OK); -} - -/* - * tk_opt_set -- - * Set an options button. - * - * PUBLIC: int tk_opt_set __P((ClientData, Tcl_Interp *, int, char *[])); - */ -int -tk_opt_set(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char *argv[]; -{ - ARGS *ap[2], a, b; - GS *gp; - SCR *sp; - int rval; - void (*msg) __P((SCR *, mtype_t, char *, size_t)); - char buf[64]; - - gp = __global_list; - sp = gp->dq.cqh_first; /* XXX */ - - switch (argc) { - case 2: - a.bp = argv[1] + (sizeof("tko_") - 1); - a.len = strlen(a.bp); - break; - case 3: - a.bp = buf; - a.len = snprintf(buf, sizeof(buf), - "%s%s", atoi(argv[2]) ? "no" : "", argv[1]); - break; - default: - abort(); - } - b.bp = NULL; - b.len = 0; - ap[0] = &a; - ap[1] = &b; - - /* Use Tcl/Tk for error messages. */ - msg = gp->scr_msg; - gp->scr_msg = tk_msg; - - rval = opts_set(sp, ap, NULL); - - gp->scr_msg = msg; - return (rval ? TCL_ERROR : TCL_OK); -} - -/* - * tk_version -- - * Display the version in Tcl/Tk. - * - * PUBLIC: int tk_version __P((ClientData, Tcl_Interp *, int, char *[])); - */ -int -tk_version(clientData, interp, argc, argv) - ClientData clientData; - Tcl_Interp *interp; - int argc; - char *argv[]; -{ - EXCMD cmd; - GS *gp; - SCR *sp; - int rval; - void (*msg) __P((SCR *, mtype_t, char *, size_t)); - - gp = __global_list; - sp = gp->dq.cqh_first; /* XXX */ - - msg = gp->scr_msg; - gp->scr_msg = tk_msg; - - ex_cinit(&cmd, C_VERSION, 0, OOBLNO, OOBLNO, 0, NULL); - rval = cmd.cmd->fn(sp, &cmd); - (void)ex_fflush(sp); - - gp->scr_msg = msg; - return (rval ? TCL_ERROR : TCL_OK); -} - -/* - * tk_msg -- - * Display an error message in Tcl/Tk. - * - * PUBLIC: void tk_msg __P((SCR *, mtype_t, char *, size_t)); - */ -void -tk_msg(sp, mtype, line, rlen) - SCR *sp; - mtype_t mtype; - char *line; - size_t rlen; -{ - TK_PRIVATE *tkp; - char buf[2048]; - - if (line == NULL) - return; - - tkp = TKP(sp); - (void)snprintf(buf, sizeof(buf), "%.*s", (int)rlen, line); - (void)Tcl_VarEval(tkp->interp, "tk_err {", buf, "}", NULL); -} diff --git a/tk/tki.h b/tk/tki.h deleted file mode 100644 index 206dacf5d73b..000000000000 --- a/tk/tki.h +++ /dev/null @@ -1,64 +0,0 @@ -/*- - * Copyright (c) 1993, 1994 - * The Regents of the University of California. All rights reserved. - * Copyright (c) 1993, 1994, 1995, 1996 - * Keith Bostic. All rights reserved. - * - * See the LICENSE file for redistribution information. - * - * @(#)tki.h 8.6 (Berkeley) 4/27/96 - */ - -#include -#include - -typedef struct _tk_private { - Tcl_Interp *interp;/* Tcl interpreter cookie. */ - - /* Shared variables. */ - int tk_cursor_row; /* Current cursor row. */ - int tk_cursor_col; /* Current cursor col. */ - int tk_ssize_row; /* Screen rows. */ - int tk_ssize_col; /* Screen columns. */ - - struct termios orig; /* Original terminal values. */ - - CHAR_T ibuf[64]; /* Input keys. */ - int ibuf_cnt; /* Number of input keys. */ - - /* Event queue. */ - TAILQ_HEAD(_eventh, _event) evq; - - int killersig; /* Killer signal. */ -#define INDX_HUP 0 -#define INDX_INT 1 -#define INDX_TERM 2 -#define INDX_WINCH 3 -#define INDX_MAX 4 /* Original signal information. */ - struct sigaction oact[INDX_MAX]; - -#define TK_LLINE_IV 0x0001 /* Last line is in inverse video. */ -#define TK_SCR_VI_INIT 0x0002 /* Vi screen initialized. */ -#define TK_SIGHUP 0x0004 /* SIGHUP arrived. */ -#define TK_SIGINT 0x0008 /* SIGINT arrived. */ -#define TK_SIGTERM 0x0010 /* SIGTERM arrived. */ -#define TK_SIGWINCH 0x0020 /* SIGWINCH arrived. */ - u_int16_t flags; -} TK_PRIVATE; - -extern GS *__global_list; -#define TKP(sp) ((TK_PRIVATE *)((sp)->gp->tk_private)) -#define GTKP(gp) ((TK_PRIVATE *)gp->tk_private) - -/* Return possibilities from the keyboard read routine. */ -typedef enum { INP_OK=0, INP_EOF, INP_ERR, INP_INTR, INP_TIMEOUT } input_t; - -/* The screen line relative to a specific window. */ -#define RLNO(sp, lno) (sp)->woff + (lno) - -/* Some functions can be safely ignored until the screen is running. */ -#define VI_INIT_IGNORE(sp) \ - if (F_ISSET(sp, SC_VI) && !F_ISSET(TKP(sp), TK_SCR_VI_INIT)) \ - return (0); - -#include "tk_extern.h" diff --git a/include/vi_extern.h b/vi/extern.h similarity index 93% rename from include/vi_extern.h rename to vi/extern.h index b3c335e6c580..600caa673c95 100644 --- a/include/vi_extern.h +++ b/vi/extern.h @@ -22,7 +22,6 @@ int v_switch __P((SCR *, VICMD *)); int v_tagpush __P((SCR *, VICMD *)); int v_tagpop __P((SCR *, VICMD *)); int v_filter __P((SCR *, VICMD *)); -int v_event_exec __P((SCR *, VICMD *)); int v_ex __P((SCR *, VICMD *)); int v_ecl_exec __P((SCR *)); int v_increment __P((SCR *, VICMD *)); @@ -46,7 +45,9 @@ int v_zero __P((SCR *, VICMD *)); int v_mark __P((SCR *, VICMD *)); int v_bmark __P((SCR *, VICMD *)); int v_fmark __P((SCR *, VICMD *)); +int v_emark __P((SCR *, VICMD *)); int v_match __P((SCR *, VICMD *)); +int v_buildmcs __P((SCR *, char *)); int v_paragraphf __P((SCR *, VICMD *)); int v_paragraphb __P((SCR *, VICMD *)); int v_buildps __P((SCR *, char *, char *)); @@ -83,7 +84,7 @@ int v_sentenceb __P((SCR *, VICMD *)); int v_status __P((SCR *, VICMD *)); int v_tcmd __P((SCR *, VICMD *, ARG_CHAR_T, u_int)); int v_txt __P((SCR *, VICMD *, MARK *, - const char *, size_t, ARG_CHAR_T, recno_t, u_long, u_int32_t)); + const CHAR_T *, size_t, ARG_CHAR_T, recno_t, u_long, u_int32_t)); int v_txt_auto __P((SCR *, recno_t, TEXT *, size_t, TEXT *)); int v_ulcase __P((SCR *, VICMD *)); int v_mulcase __P((SCR *, VICMD *)); @@ -94,7 +95,7 @@ void v_eol __P((SCR *, MARK *)); void v_nomove __P((SCR *)); void v_sof __P((SCR *, MARK *)); void v_sol __P((SCR *)); -int v_isempty __P((char *, size_t)); +int v_isempty __P((CHAR_T *, size_t)); void v_emsg __P((SCR *, char *, vim_t)); int v_wordW __P((SCR *, VICMD *)); int v_wordw __P((SCR *, VICMD *)); @@ -109,11 +110,12 @@ int v_z __P((SCR *, VICMD *)); int vs_crel __P((SCR *, long)); int v_zexit __P((SCR *, VICMD *)); int vi __P((SCR **)); +int v_curword __P((SCR *)); int vs_line __P((SCR *, SMAP *, size_t *, size_t *)); int vs_number __P((SCR *)); void vs_busy __P((SCR *, const char *, busy_t)); void vs_home __P((SCR *)); -void vs_update __P((SCR *, const char *, const char *)); +void vs_update __P((SCR *, const char *, const CHAR_T *)); void vs_msg __P((SCR *, mtype_t, char *, size_t)); int vs_ex_resolve __P((SCR *, int *)); int vs_resolve __P((SCR *, SCR *, int)); @@ -121,7 +123,7 @@ int vs_repaint __P((SCR *, EVENT *)); int vs_refresh __P((SCR *, int)); int vs_column __P((SCR *, size_t *)); size_t vs_screens __P((SCR *, recno_t, size_t *)); -size_t vs_columns __P((SCR *, char *, recno_t, size_t *, size_t *)); +size_t vs_columns __P((SCR *, CHAR_T *, recno_t, size_t *, size_t *)); size_t vs_rcm __P((SCR *, recno_t, int)); size_t vs_colpos __P((SCR *, recno_t, size_t)); int vs_change __P((SCR *, recno_t, lnop_t)); @@ -135,6 +137,7 @@ int vs_sm_cursor __P((SCR *, SMAP **)); int vs_sm_position __P((SCR *, MARK *, u_long, pos_t)); recno_t vs_sm_nlines __P((SCR *, SMAP *, recno_t, size_t)); int vs_split __P((SCR *, SCR *, int)); +int vs_vsplit __P((SCR *, SCR *)); int vs_discard __P((SCR *, SCR **)); int vs_fg __P((SCR *, SCR **, CHAR_T *, int)); int vs_bg __P((SCR *)); diff --git a/vi/getc.c b/vi/getc.c index 5e60adee96d7..deb3554a0abc 100644 --- a/vi/getc.c +++ b/vi/getc.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)getc.c 10.10 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: getc.c,v 10.13 2011/12/27 00:49:31 zy Exp $"; #endif /* not lint */ #include @@ -43,9 +43,7 @@ static const char sccsid[] = "@(#)getc.c 10.10 (Berkeley) 3/6/96"; * PUBLIC: int cs_init __P((SCR *, VCS *)); */ int -cs_init(sp, csp) - SCR *sp; - VCS *csp; +cs_init(SCR *sp, VCS *csp) { int isempty; @@ -71,11 +69,9 @@ cs_init(sp, csp) * PUBLIC: int cs_next __P((SCR *, VCS *)); */ int -cs_next(sp, csp) - SCR *sp; - VCS *csp; +cs_next(SCR *sp, VCS *csp) { - char *p; + CHAR_T *p; switch (csp->cs_flags) { case CS_EMP: /* EMP; get next line. */ @@ -123,16 +119,14 @@ cs_next(sp, csp) * PUBLIC: int cs_fspace __P((SCR *, VCS *)); */ int -cs_fspace(sp, csp) - SCR *sp; - VCS *csp; +cs_fspace(SCR *sp, VCS *csp) { - if (csp->cs_flags != 0 || !isblank(csp->cs_ch)) + if (csp->cs_flags != 0 || !ISBLANK(csp->cs_ch)) return (0); for (;;) { if (cs_next(sp, csp)) return (1); - if (csp->cs_flags != 0 || !isblank(csp->cs_ch)) + if (csp->cs_flags != 0 || !ISBLANK(csp->cs_ch)) break; } return (0); @@ -145,15 +139,13 @@ cs_fspace(sp, csp) * PUBLIC: int cs_fblank __P((SCR *, VCS *)); */ int -cs_fblank(sp, csp) - SCR *sp; - VCS *csp; +cs_fblank(SCR *sp, VCS *csp) { for (;;) { if (cs_next(sp, csp)) return (1); if (csp->cs_flags == CS_EOL || csp->cs_flags == CS_EMP || - csp->cs_flags == 0 && isblank(csp->cs_ch)) + (csp->cs_flags == 0 && ISBLANK(csp->cs_ch))) continue; break; } @@ -167,9 +159,7 @@ cs_fblank(sp, csp) * PUBLIC: int cs_prev __P((SCR *, VCS *)); */ int -cs_prev(sp, csp) - SCR *sp; - VCS *csp; +cs_prev(SCR *sp, VCS *csp) { switch (csp->cs_flags) { case CS_EMP: /* EMP; get previous line. */ @@ -218,15 +208,13 @@ cs_prev(sp, csp) * PUBLIC: int cs_bblank __P((SCR *, VCS *)); */ int -cs_bblank(sp, csp) - SCR *sp; - VCS *csp; +cs_bblank(SCR *sp, VCS *csp) { for (;;) { if (cs_prev(sp, csp)) return (1); if (csp->cs_flags == CS_EOL || csp->cs_flags == CS_EMP || - csp->cs_flags == 0 && isblank(csp->cs_ch)) + (csp->cs_flags == 0 && ISBLANK(csp->cs_ch))) continue; break; } diff --git a/vi/v_at.c b/vi/v_at.c index d266f275d983..45757d4b4733 100644 --- a/vi/v_at.c +++ b/vi/v_at.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_at.c 10.8 (Berkeley) 4/27/96"; +static const char sccsid[] = "$Id: v_at.c,v 10.11 2001/06/25 15:19:30 skimo Exp $"; #endif /* not lint */ #include @@ -21,6 +21,7 @@ static const char sccsid[] = "@(#)v_at.c 10.8 (Berkeley) 4/27/96"; #include #include #include +#include #include "../common/common.h" #include "vi.h" @@ -32,15 +33,16 @@ static const char sccsid[] = "@(#)v_at.c 10.8 (Berkeley) 4/27/96"; * PUBLIC: int v_at __P((SCR *, VICMD *)); */ int -v_at(sp, vp) - SCR *sp; - VICMD *vp; +v_at(SCR *sp, VICMD *vp) { CB *cbp; CHAR_T name; TEXT *tp; size_t len; char nbuf[20]; + CHAR_T wbuf[20]; + CHAR_T *wp; + size_t wlen; /* * !!! @@ -87,13 +89,13 @@ v_at(sp, vp) * together. We don't get this right; I'm waiting for the new DB * logging code to be available. */ - for (tp = cbp->textq.cqh_last; - tp != (void *)&cbp->textq; tp = tp->q.cqe_prev) - if ((F_ISSET(cbp, CB_LMODE) || - tp->q.cqe_next != (void *)&cbp->textq) && - v_event_push(sp, NULL, "\n", 1, 0) || + TAILQ_FOREACH_REVERSE(tp, cbp->textq, _texth, q) { + if (((F_ISSET(cbp, CB_LMODE) || + TAILQ_NEXT(tp, q) != NULL) && + v_event_push(sp, NULL, L("\n"), 1, 0)) || v_event_push(sp, NULL, tp->lb, tp->len, 0)) return (1); + } /* * !!! @@ -102,7 +104,9 @@ v_at(sp, vp) */ if (F_ISSET(vp, VC_C1SET)) { len = snprintf(nbuf, sizeof(nbuf), "%lu", vp->count); - if (v_event_push(sp, NULL, nbuf, len, 0)) + CHAR2INT(sp, nbuf, len, wp, wlen); + MEMCPY(wbuf, wp, wlen); + if (v_event_push(sp, NULL, wp, wlen, 0)) return (1); } return (0); diff --git a/vi/v_ch.c b/vi/v_ch.c index 6a1b61182680..04fb6af65272 100644 --- a/vi/v_ch.c +++ b/vi/v_ch.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_ch.c 10.8 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: v_ch.c,v 10.11 2011/12/02 19:49:50 zy Exp $"; #endif /* not lint */ #include @@ -35,9 +35,7 @@ static void noprev __P((SCR *)); * PUBLIC: int v_chrepeat __P((SCR *, VICMD *)); */ int -v_chrepeat(sp, vp) - SCR *sp; - VICMD *vp; +v_chrepeat(SCR *sp, VICMD *vp) { vp->character = VIP(sp)->lastckey; @@ -66,9 +64,7 @@ v_chrepeat(sp, vp) * PUBLIC: int v_chrrepeat __P((SCR *, VICMD *)); */ int -v_chrrepeat(sp, vp) - SCR *sp; - VICMD *vp; +v_chrrepeat(SCR *sp, VICMD *vp) { cdir_t savedir; int rval; @@ -107,9 +103,7 @@ v_chrrepeat(sp, vp) * PUBLIC: int v_cht __P((SCR *, VICMD *)); */ int -v_cht(sp, vp) - SCR *sp; - VICMD *vp; +v_cht(SCR *sp, VICMD *vp) { if (v_chf(sp, vp)) return (1); @@ -140,14 +134,13 @@ v_cht(sp, vp) * PUBLIC: int v_chf __P((SCR *, VICMD *)); */ int -v_chf(sp, vp) - SCR *sp; - VICMD *vp; +v_chf(SCR *sp, VICMD *vp) { size_t len; u_long cnt; - int isempty, key; - char *endp, *p, *startp; + int isempty; + ARG_CHAR_T key; + CHAR_T *endp, *p, *startp; /* * !!! @@ -198,9 +191,7 @@ empty: notfound(sp, key); * PUBLIC: int v_chT __P((SCR *, VICMD *)); */ int -v_chT(sp, vp) - SCR *sp; - VICMD *vp; +v_chT(SCR *sp, VICMD *vp) { if (v_chF(sp, vp)) return (1); @@ -225,14 +216,13 @@ v_chT(sp, vp) * PUBLIC: int v_chF __P((SCR *, VICMD *)); */ int -v_chF(sp, vp) - SCR *sp; - VICMD *vp; +v_chF(SCR *sp, VICMD *vp) { size_t len; u_long cnt; - int isempty, key; - char *endp, *p; + int isempty; + ARG_CHAR_T key; + CHAR_T *endp, *p; /* * !!! @@ -280,16 +270,13 @@ empty: notfound(sp, key); } static void -noprev(sp) - SCR *sp; +noprev(SCR *sp) { msgq(sp, M_BERR, "178|No previous F, f, T or t search"); } static void -notfound(sp, ch) - SCR *sp; - ARG_CHAR_T ch; +notfound(SCR *sp, ARG_CHAR_T ch) { msgq(sp, M_BERR, "179|%s not found", KEY_NAME(sp, ch)); } diff --git a/vi/v_cmd.c b/vi/v_cmd.c index cc9e30f79ae4..f77cd273cf08 100644 --- a/vi/v_cmd.c +++ b/vi/v_cmd.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_cmd.c 10.9 (Berkeley) 3/28/96"; +static const char sccsid[] = "$Id: v_cmd.c,v 10.9 1996/03/28 15:18:39 bostic Exp $"; #endif /* not lint */ #include diff --git a/vi/v_delete.c b/vi/v_delete.c index 70df78b22e2c..b3b879e93dd3 100644 --- a/vi/v_delete.c +++ b/vi/v_delete.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_delete.c 10.9 (Berkeley) 10/23/96"; +static const char sccsid[] = "$Id: v_delete.c,v 10.11 2001/06/25 15:19:31 skimo Exp $"; #endif /* not lint */ #include @@ -32,9 +32,7 @@ static const char sccsid[] = "@(#)v_delete.c 10.9 (Berkeley) 10/23/96"; * PUBLIC: int v_delete __P((SCR *, VICMD *)); */ int -v_delete(sp, vp) - SCR *sp; - VICMD *vp; +v_delete(SCR *sp, VICMD *vp) { recno_t nlines; size_t len; diff --git a/vi/v_ex.c b/vi/v_ex.c index 359080c656e3..e5ac5731d074 100644 --- a/vi/v_ex.c +++ b/vi/v_ex.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_ex.c 10.42 (Berkeley) 6/28/96"; +static const char sccsid[] = "$Id: v_ex.c,v 10.61 2011/12/22 18:41:53 zy Exp $"; #endif /* not lint */ #include @@ -40,16 +40,12 @@ static int v_exec_ex __P((SCR *, VICMD *, EXCMD *)); * PUBLIC: int v_again __P((SCR *, VICMD *)); */ int -v_again(sp, vp) - SCR *sp; - VICMD *vp; +v_again(SCR *sp, VICMD *vp) { - ARGS *ap[2], a; EXCMD cmd; - ex_cinit(&cmd, C_SUBAGAIN, 2, vp->m_start.lno, vp->m_start.lno, 1, ap); - ex_cadd(&cmd, &a, "", 1); - + ex_cinit(sp, &cmd, C_SUBAGAIN, 2, vp->m_start.lno, vp->m_start.lno, 1); + argv_exp0(sp, &cmd, L(""), 1); return (v_exec_ex(sp, vp, &cmd)); } @@ -60,9 +56,7 @@ v_again(sp, vp) * PUBLIC: int v_exmode __P((SCR *, VICMD *)); */ int -v_exmode(sp, vp) - SCR *sp; - VICMD *vp; +v_exmode(SCR *sp, VICMD *vp) { GS *gp; @@ -98,9 +92,7 @@ v_exmode(sp, vp) * PUBLIC: int v_join __P((SCR *, VICMD *)); */ int -v_join(sp, vp) - SCR *sp; - VICMD *vp; +v_join(SCR *sp, VICMD *vp) { EXCMD cmd; int lno; @@ -118,7 +110,7 @@ v_join(sp, vp) if (F_ISSET(vp, VC_C1SET) && vp->count > 2) lno = vp->m_start.lno + (vp->count - 1); - ex_cinit(&cmd, C_JOIN, 2, vp->m_start.lno, lno, 0, NULL); + ex_cinit(sp, &cmd, C_JOIN, 2, vp->m_start.lno, lno, 0); return (v_exec_ex(sp, vp, &cmd)); } @@ -129,15 +121,12 @@ v_join(sp, vp) * PUBLIC: int v_shiftl __P((SCR *, VICMD *)); */ int -v_shiftl(sp, vp) - SCR *sp; - VICMD *vp; +v_shiftl(SCR *sp, VICMD *vp) { - ARGS *ap[2], a; EXCMD cmd; - ex_cinit(&cmd, C_SHIFTL, 2, vp->m_start.lno, vp->m_stop.lno, 0, ap); - ex_cadd(&cmd, &a, "<", 1); + ex_cinit(sp, &cmd, C_SHIFTL, 2, vp->m_start.lno, vp->m_stop.lno, 0); + argv_exp0(sp, &cmd, L("<"), 2); return (v_exec_ex(sp, vp, &cmd)); } @@ -148,15 +137,12 @@ v_shiftl(sp, vp) * PUBLIC: int v_shiftr __P((SCR *, VICMD *)); */ int -v_shiftr(sp, vp) - SCR *sp; - VICMD *vp; +v_shiftr(SCR *sp, VICMD *vp) { - ARGS *ap[2], a; EXCMD cmd; - ex_cinit(&cmd, C_SHIFTR, 2, vp->m_start.lno, vp->m_stop.lno, 0, ap); - ex_cadd(&cmd, &a, ">", 1); + ex_cinit(sp, &cmd, C_SHIFTR, 2, vp->m_start.lno, vp->m_stop.lno, 0); + argv_exp0(sp, &cmd, L(">"), 2); return (v_exec_ex(sp, vp, &cmd)); } @@ -167,15 +153,12 @@ v_shiftr(sp, vp) * PUBLIC: int v_suspend __P((SCR *, VICMD *)); */ int -v_suspend(sp, vp) - SCR *sp; - VICMD *vp; +v_suspend(SCR *sp, VICMD *vp) { - ARGS *ap[2], a; EXCMD cmd; - ex_cinit(&cmd, C_STOP, 0, OOBLNO, OOBLNO, 0, ap); - ex_cadd(&cmd, &a, "suspend", sizeof("suspend") - 1); + ex_cinit(sp, &cmd, C_STOP, 0, OOBLNO, OOBLNO, 0); + argv_exp0(sp, &cmd, L("suspend"), SIZE(L("suspend"))); return (v_exec_ex(sp, vp, &cmd)); } @@ -186,13 +169,12 @@ v_suspend(sp, vp) * PUBLIC: int v_switch __P((SCR *, VICMD *)); */ int -v_switch(sp, vp) - SCR *sp; - VICMD *vp; +v_switch(SCR *sp, VICMD *vp) { - ARGS *ap[2], a; EXCMD cmd; char *name; + CHAR_T *wp; + size_t wlen; /* * Try the alternate file name, then the previous file @@ -207,8 +189,9 @@ v_switch(sp, vp) if (file_m1(sp, 0, FS_ALL)) return (1); - ex_cinit(&cmd, C_EDIT, 0, OOBLNO, OOBLNO, 0, ap); - ex_cadd(&cmd, &a, name, strlen(name)); + ex_cinit(sp, &cmd, C_EDIT, 0, OOBLNO, OOBLNO, 0); + CHAR2INT(sp, name, strlen(name) + 1, wp, wlen); + argv_exp0(sp, &cmd, wp, wlen); return (v_exec_ex(sp, vp, &cmd)); } @@ -219,15 +202,12 @@ v_switch(sp, vp) * PUBLIC: int v_tagpush __P((SCR *, VICMD *)); */ int -v_tagpush(sp, vp) - SCR *sp; - VICMD *vp; +v_tagpush(SCR *sp, VICMD *vp) { - ARGS *ap[2], a; EXCMD cmd; - ex_cinit(&cmd, C_TAG, 0, OOBLNO, 0, 0, ap); - ex_cadd(&cmd, &a, VIP(sp)->keyw, strlen(VIP(sp)->keyw)); + ex_cinit(sp, &cmd, C_TAG, 0, OOBLNO, 0, 0); + argv_exp0(sp, &cmd, VIP(sp)->keyw, STRLEN(VIP(sp)->keyw) + 1); return (v_exec_ex(sp, vp, &cmd)); } @@ -238,13 +218,11 @@ v_tagpush(sp, vp) * PUBLIC: int v_tagpop __P((SCR *, VICMD *)); */ int -v_tagpop(sp, vp) - SCR *sp; - VICMD *vp; +v_tagpop(SCR *sp, VICMD *vp) { EXCMD cmd; - ex_cinit(&cmd, C_TAGPOP, 0, OOBLNO, 0, 0, NULL); + ex_cinit(sp, &cmd, C_TAGPOP, 0, OOBLNO, 0, 0); return (v_exec_ex(sp, vp, &cmd)); } @@ -255,9 +233,7 @@ v_tagpop(sp, vp) * PUBLIC: int v_filter __P((SCR *, VICMD *)); */ int -v_filter(sp, vp) - SCR *sp; - VICMD *vp; +v_filter(SCR *sp, VICMD *vp) { EXCMD cmd; TEXT *tp; @@ -283,11 +259,11 @@ v_filter(sp, vp) */ if (F_ISSET(vp, VC_ISDOT) || ISCMD(vp->rkp, 'N') || ISCMD(vp->rkp, 'n')) { - ex_cinit(&cmd, C_BANG, - 2, vp->m_start.lno, vp->m_stop.lno, 0, NULL); + ex_cinit(sp, + &cmd, C_BANG, 2, vp->m_start.lno, vp->m_stop.lno, 0); EXP(sp)->argsoff = 0; /* XXX */ - if (argv_exp1(sp, &cmd, "!", 1, 1)) + if (argv_exp1(sp, &cmd, L("!"), 1, 1)) return (1); cmd.argc = EXP(sp)->argsoff; /* XXX */ cmd.argv = EXP(sp)->args; /* XXX */ @@ -306,7 +282,7 @@ v_filter(sp, vp) * Entering on an empty line was historically an error, * this implementation doesn't bother. */ - tp = sp->tiq.cqh_first; + tp = TAILQ_FIRST(sp->tiq); if (tp->term != TERM_OK) { vp->m_final.lno = sp->lno; vp->m_final.cno = sp->cno; @@ -316,7 +292,7 @@ v_filter(sp, vp) /* Home the cursor. */ vs_home(sp); - ex_cinit(&cmd, C_BANG, 2, vp->m_start.lno, vp->m_stop.lno, 0, NULL); + ex_cinit(sp, &cmd, C_BANG, 2, vp->m_start.lno, vp->m_stop.lno, 0); EXP(sp)->argsoff = 0; /* XXX */ if (argv_exp1(sp, &cmd, tp->lb + 1, tp->len - 1, 1)) @@ -326,41 +302,12 @@ v_filter(sp, vp) return (v_exec_ex(sp, vp, &cmd)); } -/* - * v_event_exec -- - * Execute some command(s) based on an event. - * - * PUBLIC: int v_event_exec __P((SCR *, VICMD *)); - */ -int -v_event_exec(sp, vp) - SCR *sp; - VICMD *vp; -{ - EXCMD cmd; - - switch (vp->ev.e_event) { - case E_QUIT: - ex_cinit(&cmd, C_QUIT, 0, OOBLNO, OOBLNO, 0, NULL); - break; - case E_WRITE: - ex_cinit(&cmd, C_WRITE, 0, OOBLNO, OOBLNO, 0, NULL); - break; - default: - abort(); - } - return (v_exec_ex(sp, vp, &cmd)); -} - /* * v_exec_ex -- * Execute an ex command. */ static int -v_exec_ex(sp, vp, exp) - SCR *sp; - VICMD *vp; - EXCMD *exp; +v_exec_ex(SCR *sp, VICMD *vp, EXCMD *exp) { int rval; @@ -375,9 +322,7 @@ v_exec_ex(sp, vp, exp) * PUBLIC: int v_ex __P((SCR *, VICMD *)); */ int -v_ex(sp, vp) - SCR *sp; - VICMD *vp; +v_ex(SCR *sp, VICMD *vp) { GS *gp; TEXT *tp; @@ -405,7 +350,7 @@ v_ex(sp, vp) if (v_tcmd(sp, vp, ':', TXT_BS | TXT_CEDIT | TXT_FILEC | TXT_PROMPT)) return (1); - tp = sp->tiq.cqh_first; + tp = TAILQ_FIRST(sp->tiq); /* * If the user entered a single , they want to @@ -423,6 +368,10 @@ v_ex(sp, vp) if (tp->term == TERM_BS) break; + /* If the user changed their mind, return. */ + if (tp->term != TERM_OK) + break; + /* Log the command. */ if (O_STR(sp, O_CEDIT) != NULL && v_ecl_log(sp, tp)) return (1); @@ -501,9 +450,7 @@ v_ex(sp, vp) * Cleanup from an ex command. */ static int -v_ex_done(sp, vp) - SCR *sp; - VICMD *vp; +v_ex_done(SCR *sp, VICMD *vp) { size_t len; @@ -545,8 +492,7 @@ v_ex_done(sp, vp) * Start an edit window on the colon command-line commands. */ static int -v_ecl(sp) - SCR *sp; +v_ecl(SCR *sp) { GS *gp; SCR *new; @@ -582,6 +528,11 @@ v_ecl(sp) /* It's a special window. */ F_SET(new, SC_COMEDIT); +#if defined(USE_WIDECHAR) && defined(USE_ICONV) + /* Bypass iconv on writing to DB. */ + o_set(new, O_FILEENCODING, OS_STRDUP, codeset(), 0); +#endif + /* Set up the switch. */ sp->nextdisp = new; F_SET(sp, SC_SSWITCH); @@ -595,11 +546,10 @@ v_ecl(sp) * PUBLIC: int v_ecl_exec __P((SCR *)); */ int -v_ecl_exec(sp) - SCR *sp; +v_ecl_exec(SCR *sp) { size_t len; - char *p; + CHAR_T *p; if (db_get(sp, sp->lno, 0, &p, &len) && sp->lno == 1) { v_emsg(sp, NULL, VIM_EMPTY); @@ -625,39 +575,43 @@ v_ecl_exec(sp) * Log a command into the colon command-line log file. */ static int -v_ecl_log(sp, tp) - SCR *sp; - TEXT *tp; +v_ecl_log(SCR *sp, TEXT *tp) { - EXF *save_ep; recno_t lno; int rval; + CHAR_T *p; + size_t len; + SCR *ccl_sp; /* Initialize the screen, if necessary. */ if (sp->gp->ccl_sp == NULL && v_ecl_init(sp)) return (1); + ccl_sp = sp->gp->ccl_sp; + /* * Don't log colon command window commands into the colon command * window... */ - if (sp->ep == sp->gp->ccl_sp->ep) + if (sp->ep == ccl_sp->ep) return (0); - /* - * XXX - * Swap the current EXF with the colon command file EXF. This - * isn't pretty, but too many routines "know" that sp->ep points - * to the current EXF. - */ - save_ep = sp->ep; - sp->ep = sp->gp->ccl_sp->ep; - if (db_last(sp, &lno)) { - sp->ep = save_ep; + if (db_last(ccl_sp, &lno)) { return (1); } - rval = db_append(sp, 0, lno, tp->lb, tp->len); - sp->ep = save_ep; + /* Don't log line that is identical to previous one */ + if (lno > 0 && + !db_get(ccl_sp, lno, 0, &p, &len) && + len == tp->len && + !MEMCMP(tp->lb, p, len)) + rval = 0; + else { + rval = db_append(ccl_sp, 0, lno, tp->lb, tp->len); + /* XXXX end "transaction" on ccl */ + /* Is this still necessary now that we no longer hijack sp ? */ + log_cursor(ccl_sp); + } + return (rval); } @@ -666,8 +620,7 @@ v_ecl_log(sp, tp) * Initialize the colon command-line log file. */ static int -v_ecl_init(sp) - SCR *sp; +v_ecl_init(SCR *sp) { FREF *frp; GS *gp; @@ -686,6 +639,7 @@ v_ecl_init(sp) return (1); if (file_init(gp->ccl_sp, frp, NULL, 0)) { (void)screen_end(gp->ccl_sp); + gp->ccl_sp = NULL; return (1); } diff --git a/vi/v_increment.c b/vi/v_increment.c index 45e763fa5bd5..0a121a914c96 100644 --- a/vi/v_increment.c +++ b/vi/v_increment.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_increment.c 10.12 (Berkeley) 3/19/96"; +static const char sccsid[] = "$Id: v_increment.c,v 10.17 2011/12/02 01:17:53 zy Exp $"; #endif /* not lint */ #include @@ -28,17 +28,17 @@ static const char sccsid[] = "@(#)v_increment.c 10.12 (Berkeley) 3/19/96"; #include "../common/common.h" #include "vi.h" -static char * const fmt[] = { +static CHAR_T * const fmt[] = { #define DEC 0 - "%ld", + L("%ld"), #define SDEC 1 - "%+ld", + L("%+ld"), #define HEXC 2 - "0X%0*lX", + L("0X%0*lX"), #define HEXL 3 - "0x%0*lx", + L("0x%0*lx"), #define OCTAL 4 - "%#0*lo", + L("%#0*lo"), }; static void inc_err __P((SCR *, enum nresult)); @@ -50,16 +50,15 @@ static void inc_err __P((SCR *, enum nresult)); * PUBLIC: int v_increment __P((SCR *, VICMD *)); */ int -v_increment(sp, vp) - SCR *sp; - VICMD *vp; +v_increment(SCR *sp, VICMD *vp) { enum nresult nret; u_long ulval; long change, ltmp, lval; size_t beg, blen, end, len, nlen, wlen; int base, isempty, rval; - char *bp, *ntype, *p, *t, nbuf[100]; + CHAR_T *ntype, nbuf[100]; + CHAR_T *bp, *p, *t; /* Validate the operator. */ if (vp->character == '#') @@ -91,7 +90,7 @@ v_increment(sp, vp) * implies moving the cursor to its beginning, if we moved, refresh * now. */ - for (beg = vp->m_start.cno; beg < len && isspace(p[beg]); ++beg); + for (beg = vp->m_start.cno; beg < len && ISSPACE(p[beg]); ++beg); if (beg >= len) goto nonum; if (beg != vp->m_start.cno) { @@ -100,9 +99,9 @@ v_increment(sp, vp) } #undef ishex -#define ishex(c) (isdigit(c) || strchr("abcdefABCDEF", c)) +#define ishex(c) (ISXDIGIT(c)) #undef isoctal -#define isoctal(c) (isdigit(c) && (c) != '8' && (c) != '9') +#define isoctal(c) ((c) >= '0' && (c) <= '7') /* * Look for 0[Xx], or leading + or - signs, guess at the base. @@ -175,9 +174,9 @@ nonum: msgq(sp, M_ERR, "181|Cursor not in a number"); * buffer big enough to fit the line changes as well, and only * allocate once. */ - GET_SPACE_RET(sp, bp, blen, len + 50); + GET_SPACE_RETW(sp, bp, blen, len + 50); if (end == len) { - memmove(bp, &p[beg], wlen); + MEMMOVE(bp, &p[beg], wlen); bp[wlen] = '\0'; t = bp; } else @@ -203,7 +202,7 @@ nonum: msgq(sp, M_ERR, "181|Cursor not in a number"); /* If we cross 0, signed numbers lose their sign. */ if (lval == 0 && ntype == fmt[SDEC]) ntype = fmt[DEC]; - nlen = snprintf(nbuf, sizeof(nbuf), ntype, lval); + nlen = SPRINTF(nbuf, sizeof(nbuf), ntype, lval); } else { if ((nret = nget_uslong(&ulval, t, NULL, base)) != NUM_OK) goto err; @@ -225,13 +224,13 @@ nonum: msgq(sp, M_ERR, "181|Cursor not in a number"); if (base == 16) wlen -= 2; - nlen = snprintf(nbuf, sizeof(nbuf), ntype, wlen, ulval); + nlen = SPRINTF(nbuf, sizeof(nbuf), ntype, wlen, ulval); } /* Build the new line. */ - memmove(bp, p, beg); - memmove(bp + beg, nbuf, nlen); - memmove(bp + beg + nlen, p + end, len - beg - (end - beg)); + MEMMOVE(bp, p, beg); + MEMMOVE(bp + beg, nbuf, nlen); + MEMMOVE(bp + beg + nlen, p + end, len - beg - (end - beg)); len = beg + nlen + (len - beg - (end - beg)); nret = NUM_OK; @@ -242,14 +241,12 @@ err: rval = 1; inc_err(sp, nret); } if (bp != NULL) - FREE_SPACE(sp, bp, blen); + FREE_SPACEW(sp, bp, blen); return (rval); } static void -inc_err(sp, nret) - SCR *sp; - enum nresult nret; +inc_err(SCR *sp, enum nresult nret) { switch (nret) { case NUM_ERR: diff --git a/vi/v_init.c b/vi/v_init.c index ee58de377ada..e47a821df9c4 100644 --- a/vi/v_init.c +++ b/vi/v_init.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_init.c 10.8 (Berkeley) 3/30/96"; +static const char sccsid[] = "$Id: v_init.c,v 10.10 2012/02/11 00:33:46 zy Exp $"; #endif /* not lint */ #include @@ -34,8 +34,7 @@ static const char sccsid[] = "@(#)v_init.c 10.8 (Berkeley) 3/30/96"; * PUBLIC: int v_screen_copy __P((SCR *, SCR *)); */ int -v_screen_copy(orig, sp) - SCR *orig, *sp; +v_screen_copy(SCR *orig, SCR *sp) { VI_PRIVATE *ovip, *nvip; @@ -58,6 +57,11 @@ v_screen_copy(orig, sp) nvip->rep_len = ovip->rep_len; } + /* Copy the match characters information. */ + if (ovip->mcs != NULL && (nvip->mcs = + v_wstrdup(sp, ovip->mcs, STRLEN(ovip->mcs))) == NULL) + return (1); + /* Copy the paragraph/section information. */ if (ovip->ps != NULL && (nvip->ps = v_strdup(sp, ovip->ps, strlen(ovip->ps))) == NULL) @@ -78,8 +82,7 @@ v_screen_copy(orig, sp) * PUBLIC: int v_screen_end __P((SCR *)); */ int -v_screen_end(sp) - SCR *sp; +v_screen_end(SCR *sp) { VI_PRIVATE *vip; @@ -89,6 +92,8 @@ v_screen_end(sp) free(vip->keyw); if (vip->rep != NULL) free(vip->rep); + if (vip->mcs != NULL) + free(vip->mcs); if (vip->ps != NULL) free(vip->ps); @@ -108,13 +113,11 @@ v_screen_end(sp) * PUBLIC: int v_optchange __P((SCR *, int, char *, u_long *)); */ int -v_optchange(sp, offset, str, valp) - SCR *sp; - int offset; - char *str; - u_long *valp; +v_optchange(SCR *sp, int offset, char *str, u_long *valp) { switch (offset) { + case O_MATCHCHARS: + return (v_buildmcs(sp, str)); case O_PARAGRAPHS: return (v_buildps(sp, str, O_STR(sp, O_SECTIONS))); case O_SECTIONS: diff --git a/vi/v_itxt.c b/vi/v_itxt.c index 6cf93773ac3d..8b263297aeb0 100644 --- a/vi/v_itxt.c +++ b/vi/v_itxt.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_itxt.c 10.16 (Berkeley) 10/23/96"; +static const char sccsid[] = "$Id: v_itxt.c,v 10.21 2001/06/25 15:19:32 skimo Exp $"; #endif /* not lint */ #include @@ -66,9 +66,7 @@ static u_int32_t set_txt_std __P((SCR *, VICMD *, u_int32_t)); * PUBLIC: int v_iA __P((SCR *, VICMD *)); */ int -v_iA(sp, vp) - SCR *sp; - VICMD *vp; +v_iA(SCR *sp, VICMD *vp) { size_t len; @@ -88,14 +86,12 @@ v_iA(sp, vp) * PUBLIC: int v_ia __P((SCR *, VICMD *)); */ int -v_ia(sp, vp) - SCR *sp; - VICMD *vp; +v_ia(SCR *sp, VICMD *vp) { size_t len; u_int32_t flags; int isempty; - char *p; + CHAR_T *p; flags = set_txt_std(sp, vp, 0); sp->showmode = SM_APPEND; @@ -127,9 +123,7 @@ v_ia(sp, vp) * PUBLIC: int v_iI __P((SCR *, VICMD *)); */ int -v_iI(sp, vp) - SCR *sp; - VICMD *vp; +v_iI(SCR *sp, VICMD *vp) { sp->cno = 0; if (nonblank(sp, vp->m_start.lno, &sp->cno)) @@ -148,14 +142,12 @@ v_iI(sp, vp) * PUBLIC: int v_ii __P((SCR *, VICMD *)); */ int -v_ii(sp, vp) - SCR *sp; - VICMD *vp; +v_ii(SCR *sp, VICMD *vp) { size_t len; u_int32_t flags; int isempty; - char *p; + CHAR_T *p; flags = set_txt_std(sp, vp, 0); sp->showmode = SM_INSERT; @@ -183,9 +175,7 @@ static int io __P((SCR *, VICMD *, enum which)); * PUBLIC: int v_iO __P((SCR *, VICMD *)); */ int -v_iO(sp, vp) - SCR *sp; - VICMD *vp; +v_iO(SCR *sp, VICMD *vp) { return (io(sp, vp, O_cmd)); } @@ -197,23 +187,18 @@ v_iO(sp, vp) * PUBLIC: int v_io __P((SCR *, VICMD *)); */ int -v_io(sp, vp) - SCR *sp; - VICMD *vp; +v_io(SCR *sp, VICMD *vp) { return (io(sp, vp, o_cmd)); } static int -io(sp, vp, cmd) - SCR *sp; - VICMD *vp; - enum which cmd; +io(SCR *sp, VICMD *vp, enum which cmd) { recno_t ai_line, lno; size_t len; u_int32_t flags; - char *p; + CHAR_T *p; flags = set_txt_std(sp, vp, TXT_ADDNEWLINE | TXT_APPENDEOL); sp->showmode = SM_INSERT; @@ -227,7 +212,7 @@ io(sp, vp, cmd) len = 0; ai_line = OOBLNO; } else { -insert: p = ""; +insert: p = L(""); sp->cno = 0; LOG_CORRECT; @@ -258,14 +243,13 @@ insert: p = ""; * PUBLIC: int v_change __P((SCR *, VICMD *)); */ int -v_change(sp, vp) - SCR *sp; - VICMD *vp; +v_change(SCR *sp, VICMD *vp) { size_t blen, len; u_int32_t flags; int isempty, lmode, rval; - char *bp, *p; + CHAR_T *bp; + CHAR_T *p; /* * 'c' can be combined with motion commands that set the resulting @@ -356,8 +340,8 @@ v_change(sp, vp) */ if (db_get(sp, vp->m_start.lno, DBG_FATAL, &p, &len)) return (1); - GET_SPACE_RET(sp, bp, blen, vp->m_start.cno); - memmove(bp, p, vp->m_start.cno); + GET_SPACE_RETW(sp, bp, blen, vp->m_start.cno); + MEMMOVE(bp, p, vp->m_start.cno); } else bp = NULL; @@ -388,7 +372,7 @@ v_change(sp, vp) 0, OOBLNO, F_ISSET(vp, VC_C1SET) ? vp->count : 1, flags); if (bp != NULL) - FREE_SPACE(sp, bp, blen); + FREE_SPACEW(sp, bp, blen); return (rval); } @@ -399,14 +383,12 @@ v_change(sp, vp) * PUBLIC: int v_Replace __P((SCR *, VICMD *)); */ int -v_Replace(sp, vp) - SCR *sp; - VICMD *vp; +v_Replace(SCR *sp, VICMD *vp) { size_t len; u_int32_t flags; int isempty; - char *p; + CHAR_T *p; flags = set_txt_std(sp, vp, 0); sp->showmode = SM_REPLACE; @@ -435,14 +417,12 @@ v_Replace(sp, vp) * PUBLIC: int v_subst __P((SCR *, VICMD *)); */ int -v_subst(sp, vp) - SCR *sp; - VICMD *vp; +v_subst(SCR *sp, VICMD *vp) { size_t len; u_int32_t flags; int isempty; - char *p; + CHAR_T *p; flags = set_txt_std(sp, vp, 0); sp->showmode = SM_CHANGE; @@ -477,10 +457,7 @@ v_subst(sp, vp) * Initialize text processing flags. */ static u_int32_t -set_txt_std(sp, vp, flags) - SCR *sp; - VICMD *vp; - u_int32_t flags; +set_txt_std(SCR *sp, VICMD *vp, u_int32_t flags) { LF_SET(TXT_CNTRLT | TXT_ESCAPE | TXT_MAPINPUT | TXT_RECORD | TXT_RESOLVE); diff --git a/vi/v_left.c b/vi/v_left.c index cfed80c74bf4..2a8f6e61b83a 100644 --- a/vi/v_left.c +++ b/vi/v_left.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_left.c 10.7 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: v_left.c,v 10.9 2001/06/25 15:19:32 skimo Exp $"; #endif /* not lint */ #include @@ -31,9 +31,7 @@ static const char sccsid[] = "@(#)v_left.c 10.7 (Berkeley) 3/6/96"; * PUBLIC: int v_left __P((SCR *, VICMD *)); */ int -v_left(sp, vp) - SCR *sp; - VICMD *vp; +v_left(SCR *sp, VICMD *vp) { recno_t cnt; @@ -71,9 +69,7 @@ v_left(sp, vp) * PUBLIC: int v_cfirst __P((SCR *, VICMD *)); */ int -v_cfirst(sp, vp) - SCR *sp; - VICMD *vp; +v_cfirst(SCR *sp, VICMD *vp) { recno_t cnt, lno; @@ -140,9 +136,7 @@ v_cfirst(sp, vp) * PUBLIC: int v_first __P((SCR *, VICMD *)); */ int -v_first(sp, vp) - SCR *sp; - VICMD *vp; +v_first(SCR *sp, VICMD *vp) { /* * !!! @@ -204,9 +198,7 @@ v_first(sp, vp) * PUBLIC: int v_ncol __P((SCR *, VICMD *)); */ int -v_ncol(sp, vp) - SCR *sp; - VICMD *vp; +v_ncol(SCR *sp, VICMD *vp) { if (F_ISSET(vp, VC_C1SET) && vp->count > 1) { --vp->count; @@ -266,9 +258,7 @@ v_ncol(sp, vp) * PUBLIC: int v_zero __P((SCR *, VICMD *)); */ int -v_zero(sp, vp) - SCR *sp; - VICMD *vp; +v_zero(SCR *sp, VICMD *vp) { /* * !!! diff --git a/vi/v_mark.c b/vi/v_mark.c index 447430efabe8..39ed0aaae3be 100644 --- a/vi/v_mark.c +++ b/vi/v_mark.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_mark.c 10.8 (Berkeley) 9/20/96"; +static const char sccsid[] = "$Id: v_mark.c,v 10.12 2001/06/25 15:19:32 skimo Exp $"; #endif /* not lint */ #include @@ -25,6 +25,9 @@ static const char sccsid[] = "@(#)v_mark.c 10.8 (Berkeley) 9/20/96"; #include "../common/common.h" #include "vi.h" +enum which {BQMARK, FQMARK}; +static int mark __P((SCR *, VICMD *, int, enum which)); + /* * v_mark -- m[a-z] * Set a mark. @@ -32,17 +35,11 @@ static const char sccsid[] = "@(#)v_mark.c 10.8 (Berkeley) 9/20/96"; * PUBLIC: int v_mark __P((SCR *, VICMD *)); */ int -v_mark(sp, vp) - SCR *sp; - VICMD *vp; +v_mark(SCR *sp, VICMD *vp) { return (mark_set(sp, vp->character, &vp->m_start, 1)); } -enum which {BQMARK, FQMARK}; -static int mark __P((SCR *, VICMD *, enum which)); - - /* * v_bmark -- `['`a-z] * Move to a mark. @@ -59,11 +56,9 @@ static int mark __P((SCR *, VICMD *, enum which)); * PUBLIC: int v_bmark __P((SCR *, VICMD *)); */ int -v_bmark(sp, vp) - SCR *sp; - VICMD *vp; +v_bmark(SCR *sp, VICMD *vp) { - return (mark(sp, vp, BQMARK)); + return (mark(sp, vp, 1, BQMARK)); } /* @@ -75,11 +70,31 @@ v_bmark(sp, vp) * PUBLIC: int v_fmark __P((SCR *, VICMD *)); */ int -v_fmark(sp, vp) - SCR *sp; - VICMD *vp; +v_fmark(SCR *sp, VICMD *vp) { - return (mark(sp, vp, FQMARK)); + return (mark(sp, vp, 1, FQMARK)); +} + +/* + * v_emark -- + * Mouse mark. + * + * PUBLIC: int v_emark __P((SCR *, VICMD *)); + */ +int +v_emark(SCR *sp, VICMD *vp) +{ + SMAP *smp; + + smp = HMAP + vp->ev.e_lno; + if (smp > TMAP) { + msgq(sp, M_BERR, "320|Unknown cursor position."); + return (1); + } + vp->m_stop.lno = smp->lno; + vp->m_stop.cno = + vs_colpos(sp, smp->lno, vp->ev.e_cno + (smp->soff - 1) * sp->cols); + return (mark(sp, vp, 0, BQMARK)); } /* @@ -87,16 +102,13 @@ v_fmark(sp, vp) * Mark commands. */ static int -mark(sp, vp, cmd) - SCR *sp; - VICMD *vp; - enum which cmd; +mark(SCR *sp, VICMD *vp, int getmark, enum which cmd) { dir_t dir; MARK m; size_t len; - if (mark_get(sp, vp->character, &vp->m_stop, M_BERR)) + if (getmark && mark_get(sp, vp->character, &vp->m_stop, M_BERR)) return (1); /* @@ -111,7 +123,7 @@ mark(sp, vp, cmd) if (db_get(sp, vp->m_stop.lno, DBG_FATAL, NULL, &len)) return (1); if (vp->m_stop.cno < len || - vp->m_stop.cno == len && len == 0) + (vp->m_stop.cno == len && len == 0)) break; if (ISMOTION(vp)) @@ -152,8 +164,8 @@ mark(sp, vp, cmd) * and backward motions can happen for any kind of search command. */ if (vp->m_start.lno > vp->m_stop.lno || - vp->m_start.lno == vp->m_stop.lno && - vp->m_start.cno > vp->m_stop.cno) { + (vp->m_start.lno == vp->m_stop.lno && + vp->m_start.cno > vp->m_stop.cno)) { m = vp->m_start; vp->m_start = vp->m_stop; vp->m_stop = m; @@ -187,15 +199,15 @@ mark(sp, vp, cmd) #ifdef HISTORICAL_PRACTICE if (ISCMD(vp->rkp, 'y')) { if ((cmd == BQMARK || - cmd == FQMARK && vp->m_start.lno != vp->m_stop.lno) && + (cmd == FQMARK && vp->m_start.lno != vp->m_stop.lno)) && (vp->m_start.lno > vp->m_stop.lno || - vp->m_start.lno == vp->m_stop.lno && - vp->m_start.cno > vp->m_stop.cno)) + (vp->m_start.lno == vp->m_stop.lno && + vp->m_start.cno > vp->m_stop.cno))) vp->m_final = vp->m_stop; } else if (ISCMD(vp->rkp, 'd')) if (vp->m_start.lno > vp->m_stop.lno || - vp->m_start.lno == vp->m_stop.lno && - vp->m_start.cno > vp->m_stop.cno) + (vp->m_start.lno == vp->m_stop.lno && + vp->m_start.cno > vp->m_stop.cno)) vp->m_final = vp->m_stop; #else vp->m_final = vp->m_start; diff --git a/vi/v_match.c b/vi/v_match.c index 3996560aaa73..2fae58e3a8e1 100644 --- a/vi/v_match.c +++ b/vi/v_match.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_match.c 10.8 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: v_match.c,v 10.11 2012/02/11 00:33:46 zy Exp $"; #endif /* not lint */ #include @@ -18,8 +18,10 @@ static const char sccsid[] = "@(#)v_match.c 10.8 (Berkeley) 3/6/96"; #include #include +#include #include #include +#include #include #include "../common/common.h" @@ -32,15 +34,23 @@ static const char sccsid[] = "@(#)v_match.c 10.8 (Berkeley) 3/6/96"; * PUBLIC: int v_match __P((SCR *, VICMD *)); */ int -v_match(sp, vp) - SCR *sp; - VICMD *vp; +v_match(SCR *sp, VICMD *vp) { VCS cs; MARK *mp; size_t cno, len, off; int cnt, isempty, matchc, startc, (*gc)__P((SCR *, VCS *)); - char *p; + CHAR_T *p; + CHAR_T *cp; + const CHAR_T *match_chars; + + /* + * Historically vi would match (), {} and [] however + * an update included <>. This is ok for editing HTML + * but a pain in the butt for C source. + * Making it an option lets the user decide what is 'right'. + */ + match_chars = VIP(sp)->mcs; /* * !!! @@ -60,43 +70,14 @@ v_match(sp, vp) nomatch: msgq(sp, M_BERR, "184|No match character on this line"); return (1); } - switch (startc = p[off]) { - case '(': - matchc = ')'; - gc = cs_next; + startc = p[off]; + cp = STRCHR(match_chars, startc); + if (cp != NULL) { + cnt = cp - match_chars; + matchc = match_chars[cnt ^ 1]; + gc = cnt & 1 ? cs_prev : cs_next; break; - case ')': - matchc = '('; - gc = cs_prev; - break; - case '[': - matchc = ']'; - gc = cs_next; - break; - case ']': - matchc = '['; - gc = cs_prev; - break; - case '{': - matchc = '}'; - gc = cs_next; - break; - case '}': - matchc = '{'; - gc = cs_prev; - break; - case '<': - matchc = '>'; - gc = cs_next; - break; - case '>': - matchc = '<'; - gc = cs_prev; - break; - default: - continue; } - break; } cs.cs_lno = vp->m_start.lno; @@ -135,8 +116,8 @@ nomatch: msgq(sp, M_BERR, "184|No match character on this line"); * starting cursor position when deleting to a match. */ if (vp->m_start.lno < vp->m_stop.lno || - vp->m_start.lno == vp->m_stop.lno && - vp->m_start.cno < vp->m_stop.cno) + (vp->m_start.lno == vp->m_stop.lno && + vp->m_start.cno < vp->m_stop.cno)) vp->m_final = ISMOTION(vp) ? vp->m_start : vp->m_stop; else vp->m_final = vp->m_stop; @@ -168,3 +149,29 @@ nomatch: msgq(sp, M_BERR, "184|No match character on this line"); F_SET(vp, VM_LMODE); return (0); } + +/* + * v_buildmcs -- + * Build the match character list. + * + * PUBLIC: int v_buildmcs __P((SCR *, char *)); + */ +int +v_buildmcs(SCR *sp, char *str) +{ + CHAR_T **mp = &VIP(sp)->mcs; + size_t len = strlen(str) + 1; + + if (*mp != NULL) + free(*mp); + MALLOC(sp, *mp, CHAR_T *, len * sizeof(CHAR_T)); + if (*mp == NULL) + return (1); +#ifdef USE_WIDECHAR + if (mbstowcs(*mp, str, len) == (size_t)-1) + return (1); +#else + memcpy(*mp, str, len); +#endif + return (0); +} diff --git a/vi/v_paragraph.c b/vi/v_paragraph.c index 762e38e01671..4ff4b15ec0d5 100644 --- a/vi/v_paragraph.c +++ b/vi/v_paragraph.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_paragraph.c 10.7 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: v_paragraph.c,v 10.10 2001/06/25 15:19:32 skimo Exp $"; #endif /* not lint */ #include @@ -64,15 +64,14 @@ static const char sccsid[] = "@(#)v_paragraph.c 10.7 (Berkeley) 3/6/96"; * PUBLIC: int v_paragraphf __P((SCR *, VICMD *)); */ int -v_paragraphf(sp, vp) - SCR *sp; - VICMD *vp; +v_paragraphf(SCR *sp, VICMD *vp) { enum { P_INTEXT, P_INBLANK } pstate; size_t lastlen, len; recno_t cnt, lastlno, lno; int isempty; - char *p, *lp; + CHAR_T *p; + char *lp; /* * !!! @@ -203,14 +202,13 @@ eof: if (vp->m_start.lno == lno || vp->m_start.lno == lno - 1) { * PUBLIC: int v_paragraphb __P((SCR *, VICMD *)); */ int -v_paragraphb(sp, vp) - SCR *sp; - VICMD *vp; +v_paragraphb(SCR *sp, VICMD *vp) { enum { P_INTEXT, P_INBLANK } pstate; size_t len; recno_t cnt, lno; - char *p, *lp; + CHAR_T *p; + char *lp; /* * !!! @@ -311,9 +309,7 @@ found: vp->m_stop.lno = lno; * PUBLIC: int v_buildps __P((SCR *, char *, char *)); */ int -v_buildps(sp, p_p, s_p) - SCR *sp; - char *p_p, *s_p; +v_buildps(SCR *sp, char *p_p, char *s_p) { VI_PRIVATE *vip; size_t p_len, s_len; diff --git a/vi/v_put.c b/vi/v_put.c index 77220ea14ff9..a739bd1a80e3 100644 --- a/vi/v_put.c +++ b/vi/v_put.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_put.c 10.5 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: v_put.c,v 10.6 2001/06/25 15:19:34 skimo Exp $"; #endif /* not lint */ #include @@ -33,9 +33,7 @@ static void inc_buf __P((SCR *, VICMD *)); * PUBLIC: int v_Put __P((SCR *, VICMD *)); */ int -v_Put(sp, vp) - SCR *sp; - VICMD *vp; +v_Put(SCR *sp, VICMD *vp) { u_long cnt; @@ -66,9 +64,7 @@ v_Put(sp, vp) * PUBLIC: int v_put __P((SCR *, VICMD *)); */ int -v_put(sp, vp) - SCR *sp; - VICMD *vp; +v_put(SCR *sp, VICMD *vp) { u_long cnt; @@ -108,9 +104,7 @@ v_put(sp, vp) * the buffer increment gets done regardless of the success of the put. */ static void -inc_buf(sp, vp) - SCR *sp; - VICMD *vp; +inc_buf(SCR *sp, VICMD *vp) { CHAR_T v; diff --git a/vi/v_redraw.c b/vi/v_redraw.c index 4c965c713913..979f37c70ecc 100644 --- a/vi/v_redraw.c +++ b/vi/v_redraw.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_redraw.c 10.6 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: v_redraw.c,v 10.7 2001/06/25 15:19:34 skimo Exp $"; #endif /* not lint */ #include @@ -31,9 +31,7 @@ static const char sccsid[] = "@(#)v_redraw.c 10.6 (Berkeley) 3/6/96"; * PUBLIC: int v_redraw __P((SCR *, VICMD *)); */ int -v_redraw(sp, vp) - SCR *sp; - VICMD *vp; +v_redraw(SCR *sp, VICMD *vp) { return (sp->gp->scr_refresh(sp, 1)); } diff --git a/vi/v_replace.c b/vi/v_replace.c index a4712b683a91..2a7ea979e86f 100644 --- a/vi/v_replace.c +++ b/vi/v_replace.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_replace.c 10.17 (Berkeley) 6/30/96"; +static const char sccsid[] = "$Id: v_replace.c,v 10.24 2001/06/25 15:19:34 skimo Exp $"; #endif /* not lint */ #include @@ -43,9 +43,7 @@ static const char sccsid[] = "@(#)v_replace.c 10.17 (Berkeley) 6/30/96"; * PUBLIC: int v_replace __P((SCR *, VICMD *)); */ int -v_replace(sp, vp) - SCR *sp; - VICMD *vp; +v_replace(SCR *sp, VICMD *vp) { EVENT ev; VI_PRIVATE *vip; @@ -53,7 +51,8 @@ v_replace(sp, vp) size_t blen, len; u_long cnt; int quote, rval; - char *bp, *p; + CHAR_T *bp; + CHAR_T *p; vip = VIP(sp); @@ -144,8 +143,8 @@ next: if (v_event_get(sp, &ev, 0, 0)) } /* Copy the line. */ - GET_SPACE_RET(sp, bp, blen, len); - memmove(bp, p, len); + GET_SPACE_RETW(sp, bp, blen, len); + MEMMOVE(bp, p, len); p = bp; /* @@ -154,7 +153,7 @@ next: if (v_event_get(sp, &ev, 0, 0)) * is different from the historic vi, which replaced N characters with * a single new line. Users complained, so we match historic practice. */ - if (!quote && vip->rvalue == K_CR || vip->rvalue == K_NL) { + if ((!quote && vip->rvalue == K_CR) || vip->rvalue == K_NL) { /* Set return line. */ vp->m_stop.lno = vp->m_start.lno + 1; vp->m_stop.cno = 0; @@ -193,10 +192,10 @@ err_ret: rval = 1; rval = 0; } } else { - memset(bp + vp->m_start.cno, vip->rlast, cnt); + STRSET(bp + vp->m_start.cno, vip->rlast, cnt); rval = db_set(sp, vp->m_start.lno, bp, len); } - FREE_SPACE(sp, bp, blen); + FREE_SPACEW(sp, bp, blen); vp->m_final = vp->m_stop; return (rval); diff --git a/vi/v_right.c b/vi/v_right.c index c2f349eb2328..566f952716af 100644 --- a/vi/v_right.c +++ b/vi/v_right.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_right.c 10.7 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: v_right.c,v 10.8 2001/06/25 15:19:34 skimo Exp $"; #endif /* not lint */ #include @@ -31,9 +31,7 @@ static const char sccsid[] = "@(#)v_right.c 10.7 (Berkeley) 3/6/96"; * PUBLIC: int v_right __P((SCR *, VICMD *)); */ int -v_right(sp, vp) - SCR *sp; - VICMD *vp; +v_right(SCR *sp, VICMD *vp) { size_t len; int isempty; @@ -83,9 +81,7 @@ eol: v_eol(sp, NULL); * PUBLIC: int v_dollar __P((SCR *, VICMD *)); */ int -v_dollar(sp, vp) - SCR *sp; - VICMD *vp; +v_dollar(SCR *sp, VICMD *vp) { size_t len; int isempty; diff --git a/vi/v_screen.c b/vi/v_screen.c index 85cd1e32bca0..d7932a4e7b1a 100644 --- a/vi/v_screen.c +++ b/vi/v_screen.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_screen.c 10.10 (Berkeley) 4/27/96"; +static const char sccsid[] = "$Id: v_screen.c,v 10.12 2001/06/25 15:19:34 skimo Exp $"; #endif /* not lint */ #include @@ -31,9 +31,7 @@ static const char sccsid[] = "@(#)v_screen.c 10.10 (Berkeley) 4/27/96"; * PUBLIC: int v_screen __P((SCR *, VICMD *)); */ int -v_screen(sp, vp) - SCR *sp; - VICMD *vp; +v_screen(SCR *sp, VICMD *vp) { /* * You can't leave a colon command-line edit window -- it's not that @@ -51,13 +49,13 @@ v_screen(sp, vp) * Try for the next lower screen, or, go back to the first * screen on the stack. */ - if (sp->q.cqe_next != (void *)&sp->gp->dq) - sp->nextdisp = sp->q.cqe_next; - else if (sp->gp->dq.cqh_first == sp) { + if (TAILQ_NEXT(sp, q) != NULL) + sp->nextdisp = TAILQ_NEXT(sp, q); + else if (TAILQ_FIRST(sp->gp->dq) == sp) { msgq(sp, M_ERR, "187|No other screen to switch to"); return (1); } else - sp->nextdisp = sp->gp->dq.cqh_first; + sp->nextdisp = TAILQ_FIRST(sp->gp->dq); F_SET(sp->nextdisp, SC_STATUS); F_SET(sp, SC_SSWITCH | SC_STATUS); diff --git a/vi/v_scroll.c b/vi/v_scroll.c index 92def4b3e48d..71528a02b220 100644 --- a/vi/v_scroll.c +++ b/vi/v_scroll.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_scroll.c 10.9 (Berkeley) 4/27/96"; +static const char sccsid[] = "$Id: v_scroll.c,v 10.12 2001/06/25 15:19:34 skimo Exp $"; #endif /* not lint */ #include @@ -67,9 +67,7 @@ static void goto_adjust __P((VICMD *)); * PUBLIC: int v_lgoto __P((SCR *, VICMD *)); */ int -v_lgoto(sp, vp) - SCR *sp; - VICMD *vp; +v_lgoto(SCR *sp, VICMD *vp) { recno_t nlines; @@ -106,9 +104,7 @@ v_lgoto(sp, vp) * PUBLIC: int v_home __P((SCR *, VICMD *)); */ int -v_home(sp, vp) - SCR *sp; - VICMD *vp; +v_home(SCR *sp, VICMD *vp) { if (vs_sm_position(sp, &vp->m_stop, F_ISSET(vp, VC_C1SET) ? vp->count - 1 : 0, P_TOP)) @@ -125,9 +121,7 @@ v_home(sp, vp) * PUBLIC: int v_middle __P((SCR *, VICMD *)); */ int -v_middle(sp, vp) - SCR *sp; - VICMD *vp; +v_middle(SCR *sp, VICMD *vp) { /* * Yielding to none in our quest for compatibility with every @@ -148,9 +142,7 @@ v_middle(sp, vp) * PUBLIC: int v_bottom __P((SCR *, VICMD *)); */ int -v_bottom(sp, vp) - SCR *sp; - VICMD *vp; +v_bottom(SCR *sp, VICMD *vp) { if (vs_sm_position(sp, &vp->m_stop, F_ISSET(vp, VC_C1SET) ? vp->count - 1 : 0, P_BOTTOM)) @@ -160,8 +152,7 @@ v_bottom(sp, vp) } static void -goto_adjust(vp) - VICMD *vp; +goto_adjust(VICMD *vp) { /* Guess that it's the end of the range. */ vp->m_final = vp->m_stop; @@ -199,8 +190,8 @@ goto_adjust(vp) * stay at the start of the range. Ignore others. */ if (vp->m_stop.lno < vp->m_start.lno || - vp->m_stop.lno == vp->m_start.lno && - vp->m_stop.cno < vp->m_start.cno) { + (vp->m_stop.lno == vp->m_start.lno && + vp->m_stop.cno < vp->m_start.cno)) { if (ISCMD(vp->rkp, 'y') && vp->m_stop.lno == vp->m_start.lno) vp->m_final = vp->m_start; } else @@ -214,9 +205,7 @@ goto_adjust(vp) * PUBLIC: int v_up __P((SCR *, VICMD *)); */ int -v_up(sp, vp) - SCR *sp; - VICMD *vp; +v_up(SCR *sp, VICMD *vp) { recno_t lno; @@ -238,9 +227,7 @@ v_up(sp, vp) * PUBLIC: int v_cr __P((SCR *, VICMD *)); */ int -v_cr(sp, vp) - SCR *sp; - VICMD *vp; +v_cr(SCR *sp, VICMD *vp) { /* If it's a colon command-line edit window, it's an ex command. */ if (F_ISSET(sp, SC_COMEDIT)) @@ -261,9 +248,7 @@ v_cr(sp, vp) * PUBLIC: int v_down __P((SCR *, VICMD *)); */ int -v_down(sp, vp) - SCR *sp; - VICMD *vp; +v_down(SCR *sp, VICMD *vp) { recno_t lno; @@ -284,9 +269,7 @@ v_down(sp, vp) * PUBLIC: int v_hpageup __P((SCR *, VICMD *)); */ int -v_hpageup(sp, vp) - SCR *sp; - VICMD *vp; +v_hpageup(SCR *sp, VICMD *vp) { /* * Half screens always succeed unless already at SOF. @@ -310,9 +293,7 @@ v_hpageup(sp, vp) * PUBLIC: int v_hpagedown __P((SCR *, VICMD *)); */ int -v_hpagedown(sp, vp) - SCR *sp; - VICMD *vp; +v_hpagedown(SCR *sp, VICMD *vp) { /* * Half screens always succeed unless already at EOF. @@ -340,9 +321,7 @@ v_hpagedown(sp, vp) * PUBLIC: int v_pagedown __P((SCR *, VICMD *)); */ int -v_pagedown(sp, vp) - SCR *sp; - VICMD *vp; +v_pagedown(SCR *sp, VICMD *vp) { recno_t offset; @@ -361,8 +340,8 @@ v_pagedown(sp, vp) * any screen but the "next" one anyway. We do it the historical * way as there's no good reason to change it. * - * If the screen has been split, use the smaller of the current - * window size and the window option value. + * If the screen has been split horizontally, use the smaller of + * the current window size and the window option value. * * It possible for this calculation to be less than 1; move at * least one line. @@ -388,9 +367,7 @@ v_pagedown(sp, vp) * PUBLIC: int v_pageup __P((SCR *, VICMD *)); */ int -v_pageup(sp, vp) - SCR *sp; - VICMD *vp; +v_pageup(SCR *sp, VICMD *vp) { recno_t offset; @@ -414,8 +391,8 @@ v_pageup(sp, vp) * but the first screen. We do it the historical way as there's * no good reason to change it. * - * If the screen has been split, use the smaller of the current - * window size and the window option value. + * If the screen has been split horizontally, use the smaller of + * the current window size and the window option value. * * It possible for this calculation to be less than 1; move at * least one line. @@ -436,9 +413,7 @@ v_pageup(sp, vp) * PUBLIC: int v_lineup __P((SCR *, VICMD *)); */ int -v_lineup(sp, vp) - SCR *sp; - VICMD *vp; +v_lineup(SCR *sp, VICMD *vp) { /* * The cursor moves down, staying with its original line, unless it @@ -458,9 +433,7 @@ v_lineup(sp, vp) * PUBLIC: int v_linedown __P((SCR *, VICMD *)); */ int -v_linedown(sp, vp) - SCR *sp; - VICMD *vp; +v_linedown(SCR *sp, VICMD *vp) { /* * The cursor moves up, staying with its original line, unless it diff --git a/vi/v_search.c b/vi/v_search.c index 4f7a2671ab8e..1d6b26030118 100644 --- a/vi/v_search.c +++ b/vi/v_search.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_search.c 10.18 (Berkeley) 9/19/96"; +static const char sccsid[] = "$Id: v_search.c,v 10.31 2012/02/08 07:26:59 zy Exp $"; #endif /* not lint */ #include @@ -29,7 +29,7 @@ static const char sccsid[] = "@(#)v_search.c 10.18 (Berkeley) 9/19/96"; #include "vi.h" static int v_exaddr __P((SCR *, VICMD *, dir_t)); -static int v_search __P((SCR *, VICMD *, char *, size_t, u_int, dir_t)); +static int v_search __P((SCR *, VICMD *, CHAR_T *, size_t, u_int, dir_t)); /* * v_srch -- [count]?RE[? offset] @@ -38,9 +38,7 @@ static int v_search __P((SCR *, VICMD *, char *, size_t, u_int, dir_t)); * PUBLIC: int v_searchb __P((SCR *, VICMD *)); */ int -v_searchb(sp, vp) - SCR *sp; - VICMD *vp; +v_searchb(SCR *sp, VICMD *vp) { return (v_exaddr(sp, vp, BACKWARD)); } @@ -52,9 +50,7 @@ v_searchb(sp, vp) * PUBLIC: int v_searchf __P((SCR *, VICMD *)); */ int -v_searchf(sp, vp) - SCR *sp; - VICMD *vp; +v_searchf(SCR *sp, VICMD *vp) { return (v_exaddr(sp, vp, FORWARD)); } @@ -64,19 +60,19 @@ v_searchf(sp, vp) * Do a vi search (which is really an ex address). */ static int -v_exaddr(sp, vp, dir) - SCR *sp; - VICMD *vp; - dir_t dir; +v_exaddr(SCR *sp, VICMD *vp, dir_t dir) { - static EXCMDLIST fake = { "search" }; + static EXCMDLIST fake = { L("search") }; EXCMD *cmdp; GS *gp; TEXT *tp; recno_t s_lno; size_t len, s_cno, tlen; int err, nb, type; - char *cmd, *t, buf[20]; + char buf[20]; + CHAR_T *cmd, *t; + CHAR_T *w; + size_t wlen; /* * !!! @@ -93,7 +89,7 @@ v_exaddr(sp, vp, dir) (O_ISSET(sp, O_SEARCHINCR) ? TXT_SEARCHINCR : 0))) return (1); - tp = sp->tiq.cqh_first; + tp = TAILQ_FIRST(sp->tiq); /* If the user backspaced over the prompt, do nothing. */ if (tp->term == TERM_BS) @@ -245,7 +241,7 @@ v_exaddr(sp, vp, dir) /* Default to z+. */ if (!type && - v_event_push(sp, NULL, "+", 1, CH_NOMAP | CH_QUOTED)) + v_event_push(sp, NULL, L("+"), 1, CH_NOMAP | CH_QUOTED)) return (1); /* Push the user's command. */ @@ -255,7 +251,8 @@ v_exaddr(sp, vp, dir) /* Push line number so get correct z display. */ tlen = snprintf(buf, sizeof(buf), "%lu", (u_long)vp->m_stop.lno); - if (v_event_push(sp, NULL, buf, tlen, CH_NOMAP | CH_QUOTED)) + CHAR2INT(sp, buf, tlen, w, wlen); + if (v_event_push(sp, NULL, w, wlen, CH_NOMAP | CH_QUOTED)) return (1); /* Don't refresh until after 'z' happens. */ @@ -284,9 +281,7 @@ err2: vp->m_final.lno = s_lno; * PUBLIC: int v_searchN __P((SCR *, VICMD *)); */ int -v_searchN(sp, vp) - SCR *sp; - VICMD *vp; +v_searchN(SCR *sp, VICMD *vp) { dir_t dir; @@ -311,13 +306,34 @@ v_searchN(sp, vp) * PUBLIC: int v_searchn __P((SCR *, VICMD *)); */ int -v_searchn(sp, vp) - SCR *sp; - VICMD *vp; +v_searchn(SCR *sp, VICMD *vp) { return (v_search(sp, vp, NULL, 0, SEARCH_PARSE, sp->searchdir)); } +/* + * is_special -- + * Test if the character is special in a basic RE. + */ +static int +is_special(CHAR_T c) +{ + /* + * !!! + * `*' and `$' are ordinary when appear at the beginning of a RE, + * but it's safe to distinguish them from the ordinary characters. + * The tilde is vi-specific, of course. + */ + return (STRCHR(L(".[*\\^$~"), c) && c); +} + +/* + * Rear delimiter for word search when the keyword ends in + * (i.e., consists of) a non-word character. See v_searchw below. + */ +#define RE_NWSTOP L("([^[:alnum:]_]|$)") +#define RE_NWSTOP_LEN (SIZE(RE_NWSTOP) - 1) + /* * v_searchw -- [count]^A * Search for the word under the cursor. @@ -325,21 +341,47 @@ v_searchn(sp, vp) * PUBLIC: int v_searchw __P((SCR *, VICMD *)); */ int -v_searchw(sp, vp) - SCR *sp; - VICMD *vp; +v_searchw(SCR *sp, VICMD *vp) { size_t blen, len; int rval; - char *bp; + CHAR_T *bp, *p; - len = VIP(sp)->klen + sizeof(RE_WSTART) + sizeof(RE_WSTOP); - GET_SPACE_RET(sp, bp, blen, len); - len = snprintf(bp, blen, "%s%s%s", RE_WSTART, VIP(sp)->keyw, RE_WSTOP); + /* An upper bound for the SIZE of the RE under construction. */ + len = VIP(sp)->klen + MAX(RE_WSTART_LEN, 1) + + MAX(RE_WSTOP_LEN, RE_NWSTOP_LEN); + GET_SPACE_RETW(sp, bp, blen, len); + p = bp; + /* Only the first character can be non-word, see v_curword. */ + if (inword(VIP(sp)->keyw[0])) { + MEMCPY(p, RE_WSTART, RE_WSTART_LEN); + p += RE_WSTART_LEN; + } else if (is_special(VIP(sp)->keyw[0])) { + MEMCPY(p, L("\\"), 1); + p += 1; + } + + MEMCPY(p, VIP(sp)->keyw, VIP(sp)->klen); + p += VIP(sp)->klen; + + if (inword(p[-1])) { + MEMCPY(p, RE_WSTOP, RE_WSTOP_LEN); + p += RE_WSTOP_LEN; + } else { + /* + * The keyword is a single non-word character. + * We want it to stay the same when typing ^A several times + * in a row, just the way the other cases behave. + */ + MEMCPY(p, RE_NWSTOP, RE_NWSTOP_LEN); + p += RE_NWSTOP_LEN; + } + + len = p - bp; rval = v_search(sp, vp, bp, len, SEARCH_SET, FORWARD); - FREE_SPACE(sp, bp, blen); + FREE_SPACEW(sp, bp, blen); return (rval); } @@ -348,13 +390,7 @@ v_searchw(sp, vp) * The search commands. */ static int -v_search(sp, vp, ptrn, plen, flags, dir) - SCR *sp; - VICMD *vp; - u_int flags; - char *ptrn; - size_t plen; - dir_t dir; +v_search(SCR *sp, VICMD *vp, CHAR_T *ptrn, size_t plen, u_int flags, dir_t dir) { /* Display messages. */ LF_SET(SEARCH_MSG); @@ -417,10 +453,7 @@ v_search(sp, vp, ptrn, plen, flags, dir) * PUBLIC: int v_correct __P((SCR *, VICMD *, int)); */ int -v_correct(sp, vp, isdelta) - SCR *sp; - VICMD *vp; - int isdelta; +v_correct(SCR *sp, VICMD *vp, int isdelta) { dir_t dir; MARK m; @@ -462,8 +495,8 @@ v_correct(sp, vp, isdelta) * because of the wrapscan option. */ if (vp->m_start.lno > vp->m_stop.lno || - vp->m_start.lno == vp->m_stop.lno && - vp->m_start.cno > vp->m_stop.cno) { + (vp->m_start.lno == vp->m_stop.lno && + vp->m_start.cno > vp->m_stop.cno)) { m = vp->m_start; vp->m_start = vp->m_stop; vp->m_stop = m; diff --git a/vi/v_section.c b/vi/v_section.c index 20e8ff2808fd..e769cdad3289 100644 --- a/vi/v_section.c +++ b/vi/v_section.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_section.c 10.7 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: v_section.c,v 10.10 2001/06/25 15:19:35 skimo Exp $"; #endif /* not lint */ #include @@ -62,13 +62,12 @@ static const char sccsid[] = "@(#)v_section.c 10.7 (Berkeley) 3/6/96"; * PUBLIC: int v_sectionf __P((SCR *, VICMD *)); */ int -v_sectionf(sp, vp) - SCR *sp; - VICMD *vp; +v_sectionf(SCR *sp, VICMD *vp) { recno_t cnt, lno; size_t len; - char *p, *list, *lp; + CHAR_T *p; + char *list, *lp; /* Get the macro list. */ if ((list = O_STR(sp, O_SECTIONS)) == NULL) @@ -98,7 +97,7 @@ v_sectionf(sp, vp) for (lno = vp->m_start.lno; !db_get(sp, ++lno, 0, &p, &len);) { if (len == 0) continue; - if (p[0] == '{' || ISMOTION(vp) && p[0] == '}') { + if (p[0] == '{' || (ISMOTION(vp) && p[0] == '}')) { if (!--cnt) { if (p[0] == '{') goto adjust1; @@ -122,7 +121,7 @@ v_sectionf(sp, vp) continue; for (lp = list; *lp != '\0'; lp += 2 * sizeof(*lp)) if (lp[0] == p[1] && - (lp[1] == ' ' && len == 2 || lp[1] == p[2]) && + ((lp[1] == ' ' && len == 2) || lp[1] == p[2]) && !--cnt) { /* * !!! @@ -170,13 +169,12 @@ ret2: if (ISMOTION(vp)) { * PUBLIC: int v_sectionb __P((SCR *, VICMD *)); */ int -v_sectionb(sp, vp) - SCR *sp; - VICMD *vp; +v_sectionb(SCR *sp, VICMD *vp) { size_t len; recno_t cnt, lno; - char *p, *list, *lp; + CHAR_T *p; + char *list, *lp; /* An empty file or starting from line 1 is always illegal. */ if (vp->m_start.lno <= 1) { @@ -213,7 +211,7 @@ v_sectionb(sp, vp) continue; for (lp = list; *lp != '\0'; lp += 2 * sizeof(*lp)) if (lp[0] == p[1] && - (lp[1] == ' ' && len == 2 || lp[1] == p[2]) && + ((lp[1] == ' ' && len == 2) || lp[1] == p[2]) && !--cnt) { adjust1: vp->m_stop.lno = lno; vp->m_stop.cno = 0; diff --git a/vi/v_sentence.c b/vi/v_sentence.c index a3d9376be403..ddbc6c707aad 100644 --- a/vi/v_sentence.c +++ b/vi/v_sentence.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_sentence.c 10.7 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: v_sentence.c,v 10.9 2001/06/25 15:19:35 skimo Exp $"; #endif /* not lint */ #include @@ -52,9 +52,7 @@ static const char sccsid[] = "@(#)v_sentence.c 10.7 (Berkeley) 3/6/96"; * PUBLIC: int v_sentencef __P((SCR *, VICMD *)); */ int -v_sentencef(sp, vp) - SCR *sp; - VICMD *vp; +v_sentencef(SCR *sp, VICMD *vp) { enum { BLANK, NONE, PERIOD } state; VCS cs; @@ -74,7 +72,7 @@ v_sentencef(sp, vp) * This may not handle " . " correctly, but it's real unclear * what correctly means in that case. */ - if (cs.cs_flags == CS_EMP || cs.cs_flags == 0 && isblank(cs.cs_ch)) { + if (cs.cs_flags == CS_EMP || (cs.cs_flags == 0 && isblank(cs.cs_ch))) { if (cs_fblank(sp, &cs)) return (1); if (--cnt == 0) { @@ -193,9 +191,7 @@ okret: vp->m_stop.lno = cs.cs_lno; * PUBLIC: int v_sentenceb __P((SCR *, VICMD *)); */ int -v_sentenceb(sp, vp) - SCR *sp; - VICMD *vp; +v_sentenceb(SCR *sp, VICMD *vp) { VCS cs; recno_t slno; diff --git a/vi/v_status.c b/vi/v_status.c index 7095d782c60a..82fe74b601b6 100644 --- a/vi/v_status.c +++ b/vi/v_status.c @@ -10,13 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_status.c 10.9 (Berkeley) 5/15/96"; +static const char sccsid[] = "$Id: v_status.c,v 10.10 2001/06/25 15:19:35 skimo Exp $"; #endif /* not lint */ #include #include #include -#include #include #include @@ -32,9 +31,7 @@ static const char sccsid[] = "@(#)v_status.c 10.9 (Berkeley) 5/15/96"; * PUBLIC: int v_status __P((SCR *, VICMD *)); */ int -v_status(sp, vp) - SCR *sp; - VICMD *vp; +v_status(SCR *sp, VICMD *vp) { (void)msgq_status(sp, vp->m_start.lno, MSTAT_SHOWLAST); return (0); diff --git a/vi/v_txt.c b/vi/v_txt.c index c47a485686fb..e81e34880e2b 100644 --- a/vi/v_txt.c +++ b/vi/v_txt.c @@ -10,13 +10,12 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_txt.c 10.87 (Berkeley) 10/13/96"; +static const char sccsid[] = "$Id: v_txt.c,v 11.5 2013/05/19 20:37:45 bentley Exp $"; #endif /* not lint */ #include #include #include -#include #include #include @@ -63,11 +62,7 @@ static void txt_unmap __P((SCR *, TEXT *, u_int32_t *)); * PUBLIC: int v_tcmd __P((SCR *, VICMD *, ARG_CHAR_T, u_int)); */ int -v_tcmd(sp, vp, prompt, flags) - SCR *sp; - VICMD *vp; - ARG_CHAR_T prompt; - u_int flags; +v_tcmd(SCR *sp, VICMD *vp, ARG_CHAR_T prompt, u_int flags) { /* Normally, we end up where we started. */ vp->m_final.lno = sp->lno; @@ -118,8 +113,7 @@ v_tcmd(sp, vp, prompt, flags) * Initialize the screen map for colon command-line input. */ static int -txt_map_init(sp) - SCR *sp; +txt_map_init(SCR *sp) { SMAP *esmp; VI_PRIVATE *vip; @@ -171,8 +165,7 @@ txt_map_init(sp) * Reset the screen map for colon command-line input. */ static int -txt_map_end(sp) - SCR *sp; +txt_map_end(SCR *sp) { VI_PRIVATE *vip; size_t cnt; @@ -242,26 +235,26 @@ txt_map_end(sp) * Vi text input. * * PUBLIC: int v_txt __P((SCR *, VICMD *, MARK *, - * PUBLIC: const char *, size_t, ARG_CHAR_T, recno_t, u_long, u_int32_t)); + * PUBLIC: const CHAR_T *, size_t, ARG_CHAR_T, recno_t, u_long, u_int32_t)); */ int -v_txt(sp, vp, tm, lp, len, prompt, ai_line, rcount, flags) - SCR *sp; - VICMD *vp; - MARK *tm; /* To MARK. */ - const char *lp; /* Input line. */ - size_t len; /* Input line length. */ - ARG_CHAR_T prompt; /* Prompt to display. */ - recno_t ai_line; /* Line number to use for autoindent count. */ - u_long rcount; /* Replay count. */ - u_int32_t flags; /* TXT_* flags. */ +v_txt( + SCR *sp, + VICMD *vp, + MARK *tm, /* To MARK. */ + const CHAR_T *lp, /* Input line. */ + size_t len, /* Input line length. */ + ARG_CHAR_T prompt, /* Prompt to display. */ + recno_t ai_line, /* Line number to use for autoindent count. */ + u_long rcount, /* Replay count. */ + u_int32_t flags) /* TXT_* flags. */ { - EVENT ev, *evp; /* Current event. */ + EVENT ev, *evp = NULL; /* Current event. */ EVENT fc; /* File name completion event. */ GS *gp; TEXT *ntp, *tp; /* Input text structures. */ TEXT ait; /* Autoindent text structure. */ - TEXT wmt; /* Wrapmargin text structure. */ + TEXT wmt = {{ 0 }}; /* Wrapmargin text structure. */ TEXTH *tiqh; VI_PRIVATE *vip; abb_t abb; /* State of abbreviation checks. */ @@ -281,7 +274,8 @@ v_txt(sp, vp, tm, lp, len, prompt, ai_line, rcount, flags) int showmatch; /* Showmatch set on this character. */ int wm_set, wm_skip; /* Wrapmargin happened, blank skip flags. */ int max, tmp; - char *p; + int nochange; + CHAR_T *p; gp = sp->gp; vip = VIP(sp); @@ -298,23 +292,24 @@ v_txt(sp, vp, tm, lp, len, prompt, ai_line, rcount, flags) * default to 0 -- text_init() handles this.) If changing a line, * copy it into the TEXT buffer. */ - tiqh = &sp->tiq; - if (tiqh->cqh_first != (void *)tiqh) { - tp = tiqh->cqh_first; - if (tp->q.cqe_next != (void *)tiqh || tp->lb_len < len + 32) { + tiqh = sp->tiq; + if (!TAILQ_EMPTY(tiqh)) { + tp = TAILQ_FIRST(tiqh); + if (TAILQ_NEXT(tp, q) != NULL || tp->lb_len < len + 32) { text_lfree(tiqh); goto newtp; } tp->ai = tp->insert = tp->offset = tp->owrite = 0; if (lp != NULL) { tp->len = len; - memmove(tp->lb, lp, len); + BINC_RETW(sp, tp->lb, tp->lb_len, len); + MEMMOVE(tp->lb, lp, len); } else tp->len = 0; } else { newtp: if ((tp = text_init(sp, lp, len, len + 32)) == NULL) return (1); - CIRCLEQ_INSERT_HEAD(tiqh, tp, q); + TAILQ_INSERT_HEAD(tiqh, tp, q); } /* Set default termination condition. */ @@ -463,6 +458,7 @@ newtp: if ((tp = text_init(sp, lp, len, len + 32)) == NULL) /* Other text input mode setup. */ quote = Q_NOTSET; carat = C_NOTSET; + nochange = 0; FL_INIT(is_flags, LF_ISSET(TXT_SEARCHINCR) ? IS_RESTART | IS_RUNNING : 0); filec_redraw = hexcnt = showmatch = 0; @@ -539,7 +535,7 @@ next: if (v_event_get(sp, evp, 0, ec_flags)) * This was not documented as far as I know, and is a great test of vi * clones. */ - if (rcol == 0 && !LF_ISSET(TXT_REPLAY) && evp->e_c == '\0') { + if (LF_ISSET(TXT_RECORD) && rcol == 0 && evp->e_c == '\0') { if (vip->rep == NULL) goto done; @@ -594,13 +590,16 @@ next: if (v_event_get(sp, evp, 0, ec_flags)) /* Check to see if the character fits into the replay buffers. */ if (LF_ISSET(TXT_RECORD)) { - BINC_GOTO(sp, vip->rep, + BINC_GOTO(sp, EVENT, vip->rep, vip->rep_len, (rcol + 1) * sizeof(EVENT)); vip->rep[rcol++] = *evp; } -replay: if (LF_ISSET(TXT_REPLAY)) +replay: if (LF_ISSET(TXT_REPLAY)) { + if (rcol == vip->rep_cnt) + goto k_escape; evp = vip->rep + rcol++; + } /* Wrapmargin check for leading space. */ if (wm_skip) { @@ -651,7 +650,7 @@ replay: if (LF_ISSET(TXT_REPLAY)) * this test delimits the value by any non-hex character. Offset by * one, we use 0 to mean that we've found . */ - if (hexcnt > 1 && !isxdigit(evp->e_c)) { + if (hexcnt > 1 && !ISXDIGIT(evp->e_c)) { hexcnt = 0; if (txt_hex(sp, tp)) goto err; @@ -673,7 +672,7 @@ k_cr: if (LF_ISSET(TXT_CR)) { if (vs_change(sp, tp->lno, LINE_RESET)) goto err; } else if (F_ISSET(sp, SC_SCRIPT)) - (void)v_event_push(sp, NULL, "\r", 1, CH_NOMAP); + (void)v_event_push(sp, NULL, L("\r"), 1, CH_NOMAP); /* Set term condition: if empty. */ if (tp->cno <= tp->offset) @@ -771,7 +770,7 @@ k_cr: if (LF_ISSET(TXT_CR)) { if ((ntp = text_init(sp, p, insert + owrite, insert + owrite + 32)) == NULL) goto err; - CIRCLEQ_INSERT_TAIL(&sp->tiq, ntp, q); + TAILQ_INSERT_TAIL(sp->tiq, ntp, q); /* Set up bookkeeping for the new line. */ ntp->insert = insert; @@ -786,10 +785,11 @@ k_cr: if (LF_ISSET(TXT_CR)) { * characters may have been erased. */ if (LF_ISSET(TXT_AUTOINDENT)) { - if (carat == C_NOCHANGE) { + if (nochange) { + nochange = 0; if (v_txt_auto(sp, OOBLNO, &ait, ait.ai, ntp)) goto err; - FREE_SPACE(sp, ait.lb, ait.lb_len); + FREE_SPACEW(sp, ait.lb, ait.lb_len); } else if (v_txt_auto(sp, OOBLNO, tp, tp->cno, ntp)) goto err; @@ -808,9 +808,9 @@ k_cr: if (LF_ISSET(TXT_CR)) { if (wmt.offset != 0 || wmt.owrite != 0 || wmt.insert != 0) { #define WMTSPACE wmt.offset + wmt.owrite + wmt.insert - BINC_GOTO(sp, ntp->lb, + BINC_GOTOW(sp, ntp->lb, ntp->lb_len, ntp->len + WMTSPACE + 32); - memmove(ntp->lb + ntp->cno, wmt.lb, WMTSPACE); + MEMMOVE(ntp->lb + ntp->cno, wmt.lb, WMTSPACE); ntp->len += WMTSPACE; ntp->cno += wmt.offset; ntp->owrite = wmt.owrite; @@ -821,7 +821,7 @@ k_cr: if (LF_ISSET(TXT_CR)) { /* New lines are TXT_APPENDEOL. */ if (ntp->owrite == 0 && ntp->insert == 0) { - BINC_GOTO(sp, ntp->lb, ntp->lb_len, ntp->len + 1); + BINC_GOTOW(sp, ntp->lb, ntp->lb_len, ntp->len + 1); LF_SET(TXT_APPENDEOL); ntp->lb[ntp->cno] = CH_CURSOR; ++ntp->insert; @@ -842,6 +842,7 @@ k_cr: if (LF_ISSET(TXT_CR)) { if (rcount > 1) { --rcount; + vip->rep_cnt = rcol; rcol = 0; abb = AB_NOTSET; LF_CLR(TXT_RECORD); @@ -884,7 +885,7 @@ k_escape: LINE_RESOLVE; * characters, and making them into insert characters. */ if (LF_ISSET(TXT_REPLACE)) - txt_Rresolve(sp, &sp->tiq, tp, len); + txt_Rresolve(sp, sp->tiq, tp, len); /* * If there are any overwrite characters, copy down @@ -892,7 +893,7 @@ k_escape: LINE_RESOLVE; */ if (tp->owrite) { if (tp->insert) - memmove(tp->lb + tp->cno, + MEMMOVE(tp->lb + tp->cno, tp->lb + tp->cno + tp->owrite, tp->insert); tp->len -= tp->owrite; } @@ -907,10 +908,10 @@ k_escape: LINE_RESOLVE; * This is wrong, should pass back a length. */ if (LF_ISSET(TXT_RESOLVE)) { - if (txt_resolve(sp, &sp->tiq, flags)) + if (txt_resolve(sp, sp->tiq, flags)) goto err; } else { - BINC_GOTO(sp, tp->lb, tp->lb_len, tp->len + 1); + BINC_GOTOW(sp, tp->lb, tp->lb_len, tp->len + 1); tp->lb[tp->len] = '\0'; } @@ -954,11 +955,12 @@ k_escape: LINE_RESOLVE; /* Save the ai string for later. */ ait.lb = NULL; ait.lb_len = 0; - BINC_GOTO(sp, ait.lb, ait.lb_len, tp->ai); - memmove(ait.lb, tp->lb, tp->ai); + BINC_GOTOW(sp, ait.lb, ait.lb_len, tp->ai); + MEMMOVE(ait.lb, tp->lb, tp->ai); ait.ai = ait.len = tp->ai; - carat = C_NOCHANGE; + carat = C_NOTSET; + nochange = 1; goto leftmargin; case C_ZEROSET: /* 0^D */ if (tp->ai == 0 || tp->cno > tp->ai + tp->offset + 1) @@ -993,7 +995,7 @@ leftmargin: tp->lb[tp->cno - 1] = ' '; */ if (tp->cno == 0) { if ((ntp = - txt_backup(sp, &sp->tiq, tp, &flags)) == NULL) + txt_backup(sp, sp->tiq, tp, &flags)) == NULL) goto err; tp = ntp; break; @@ -1045,7 +1047,7 @@ leftmargin: tp->lb[tp->cno - 1] = ' '; */ if (tp->cno == 0) { if ((ntp = - txt_backup(sp, &sp->tiq, tp, &flags)) == NULL) + txt_backup(sp, sp->tiq, tp, &flags)) == NULL) goto err; tp = ntp; } @@ -1075,7 +1077,7 @@ leftmargin: tp->lb[tp->cno - 1] = ' '; } /* Skip over trailing space characters. */ - while (tp->cno > max && isblank(tp->lb[tp->cno - 1])) { + while (tp->cno > max && ISBLANK(tp->lb[tp->cno - 1])) { --tp->cno; ++tp->owrite; } @@ -1104,12 +1106,12 @@ leftmargin: tp->lb[tp->cno - 1] = ' '; */ if (LF_ISSET(TXT_TTYWERASE)) while (tp->cno > max) { + if (ISBLANK(tp->lb[tp->cno - 1])) + break; --tp->cno; ++tp->owrite; if (FL_ISSET(is_flags, IS_RUNNING)) tp->lb[tp->cno] = ' '; - if (isblank(tp->lb[tp->cno - 1])) - break; } else { if (LF_ISSET(TXT_ALTWERASE)) { @@ -1117,19 +1119,17 @@ leftmargin: tp->lb[tp->cno - 1] = ' '; ++tp->owrite; if (FL_ISSET(is_flags, IS_RUNNING)) tp->lb[tp->cno] = ' '; - if (isblank(tp->lb[tp->cno - 1])) - break; } if (tp->cno > max) tmp = inword(tp->lb[tp->cno - 1]); while (tp->cno > max) { + if (tmp != inword(tp->lb[tp->cno - 1]) + || ISBLANK(tp->lb[tp->cno - 1])) + break; --tp->cno; ++tp->owrite; if (FL_ISSET(is_flags, IS_RUNNING)) tp->lb[tp->cno] = ' '; - if (tmp != inword(tp->lb[tp->cno - 1]) - || isblank(tp->lb[tp->cno - 1])) - break; } } @@ -1146,7 +1146,7 @@ leftmargin: tp->lb[tp->cno - 1] = ' '; */ if (tp->cno == 0) { if ((ntp = - txt_backup(sp, &sp->tiq, tp, &flags)) == NULL) + txt_backup(sp, sp->tiq, tp, &flags)) == NULL) goto err; tp = ntp; } @@ -1195,11 +1195,6 @@ leftmargin: tp->lb[tp->cno - 1] = ' '; if (txt_dent(sp, tp, 1)) goto err; goto ebuf_chk; - case K_RIGHTBRACE: - case K_RIGHTPAREN: - if (LF_ISSET(TXT_SHOWMATCH)) - showmatch = 1; - goto ins_ch; case K_BACKSLASH: /* Quote next erase/kill. */ /* * !!! @@ -1247,6 +1242,14 @@ leftmargin: tp->lb[tp->cno - 1] = ' '; hexcnt = 1; goto insq_ch; default: /* Insert the character. */ + if (LF_ISSET(TXT_SHOWMATCH)) { + CHAR_T *match_chars, *cp; + + match_chars = VIP(sp)->mcs; + cp = STRCHR(match_chars, evp->e_c); + if (cp != NULL && (cp - match_chars) & 1) + showmatch = 1; + } ins_ch: /* * Historically, vi eliminated nul's out of hand. If the * beautify option was set, it also deleted any unknown @@ -1260,7 +1263,7 @@ leftmargin: tp->lb[tp->cno - 1] = ' '; * wasn't a replay and wasn't handled specially, except * or . */ - if (LF_ISSET(TXT_BEAUTIFY) && iscntrl(evp->e_c) && + if (LF_ISSET(TXT_BEAUTIFY) && ISCNTRL(evp->e_c) && evp->e_value != K_FORMFEED && evp->e_value != K_TAB) { msgq(sp, M_BERR, "192|Illegal character; quote to enter"); @@ -1313,7 +1316,7 @@ insl_ch: if (txt_insch(sp, tp, &evp->e_c, flags)) * number of hex bytes. Offset by one, we use 0 to mean * that we've found . */ - if (hexcnt != 0 && hexcnt++ == sizeof(CHAR_T) * 2 + 1) { + if (hexcnt != 0 && hexcnt++ == 3) { hexcnt = 0; if (txt_hex(sp, tp)) goto err; @@ -1352,7 +1355,7 @@ insl_ch: if (txt_insch(sp, tp, &evp->e_c, flags)) * the length of the motion. */ ebuf_chk: if (tp->cno >= tp->len) { - BINC_GOTO(sp, tp->lb, tp->lb_len, tp->len + 1); + BINC_GOTOW(sp, tp->lb, tp->lb_len, tp->len + 1); LF_SET(TXT_APPENDEOL); tp->lb[tp->cno] = CH_CURSOR; @@ -1373,7 +1376,7 @@ ebuf_chk: if (tp->cno >= tp->len) { #ifdef DEBUG if (tp->cno + tp->insert + tp->owrite != tp->len) { msgq(sp, M_ERR, - "len %u != cno: %u ai: %u insert %u overwrite %u", + "len %zu != cno: %zu ai: %zu insert %zu overwrite %zu", tp->len, tp->cno, tp->ai, tp->insert, tp->owrite); if (LF_ISSET(TXT_REPLAY)) goto done; @@ -1456,7 +1459,8 @@ ebuf_chk: if (tp->cno >= tp->len) { err: alloc_err: - txt_err(sp, &sp->tiq); + F_CLR(sp, SC_TINPUT); + txt_err(sp, sp->tiq); return (1); } @@ -1465,11 +1469,7 @@ ebuf_chk: if (tp->cno >= tp->len) { * Handle abbreviations. */ static int -txt_abbrev(sp, tp, pushcp, isinfoline, didsubp, turnoffp) - SCR *sp; - TEXT *tp; - CHAR_T *pushcp; - int isinfoline, *didsubp, *turnoffp; +txt_abbrev(SCR *sp, TEXT *tp, CHAR_T *pushcp, int isinfoline, int *didsubp, int *turnoffp) { VI_PRIVATE *vip; CHAR_T ch, *p; @@ -1613,7 +1613,7 @@ search: if (isinfoline) tp->owrite += len; else { if (tp->insert) - memmove(tp->lb + tp->cno + qp->olen, + MEMMOVE(tp->lb + tp->cno + qp->olen, tp->lb + tp->cno + tp->owrite + len, tp->insert); tp->owrite += qp->olen; tp->len -= len - qp->olen; @@ -1635,13 +1635,10 @@ search: if (isinfoline) * Handle the unmap command. */ static void -txt_unmap(sp, tp, ec_flagsp) - SCR *sp; - TEXT *tp; - u_int32_t *ec_flagsp; +txt_unmap(SCR *sp, TEXT *tp, u_int32_t *ec_flagsp) { size_t len, off; - char *p; + CHAR_T *p; /* Find the beginning of this "word". */ for (off = tp->cno - 1, p = tp->lb + off, len = 0;; --p, --off) { @@ -1678,15 +1675,12 @@ txt_unmap(sp, tp, ec_flagsp) * When a line is resolved by , review autoindent characters. */ static void -txt_ai_resolve(sp, tp, changedp) - SCR *sp; - TEXT *tp; - int *changedp; +txt_ai_resolve(SCR *sp, TEXT *tp, int *changedp) { u_long ts; int del; size_t cno, len, new, old, scno, spaces, tab_after_sp, tabs; - char *p; + CHAR_T *p; *changedp = 0; @@ -1729,7 +1723,7 @@ txt_ai_resolve(sp, tp, changedp) * If there are no spaces, or no tabs after spaces and less than * ts spaces, it's already minimal. */ - if (!spaces || !tab_after_sp && spaces < ts) + if (!spaces || (!tab_after_sp && spaces < ts)) return; /* Count up spaces/tabs needed to get to the target. */ @@ -1748,7 +1742,7 @@ txt_ai_resolve(sp, tp, changedp) /* Shift the rest of the characters down, adjust the counts. */ del = old - new; - memmove(p - del, p, tp->len - old); + MEMMOVE(p - del, p, tp->len - old); tp->len -= del; tp->cno -= del; @@ -1768,14 +1762,10 @@ txt_ai_resolve(sp, tp, changedp) * PUBLIC: int v_txt_auto __P((SCR *, recno_t, TEXT *, size_t, TEXT *)); */ int -v_txt_auto(sp, lno, aitp, len, tp) - SCR *sp; - recno_t lno; - TEXT *aitp, *tp; - size_t len; +v_txt_auto(SCR *sp, recno_t lno, TEXT *aitp, size_t len, TEXT *tp) { size_t nlen; - char *p, *t; + CHAR_T *p, *t; if (aitp == NULL) { /* @@ -1802,15 +1792,15 @@ v_txt_auto(sp, lno, aitp, len, tp) return (0); /* Make sure the buffer's big enough. */ - BINC_RET(sp, tp->lb, tp->lb_len, tp->len + nlen); + BINC_RETW(sp, tp->lb, tp->lb_len, tp->len + nlen); /* Copy the buffer's current contents up. */ if (tp->len != 0) - memmove(tp->lb + nlen, tp->lb, tp->len); + MEMMOVE(tp->lb + nlen, tp->lb, tp->len); tp->len += nlen; /* Copy the indentation into the new buffer. */ - memmove(tp->lb, t, nlen); + MEMMOVE(tp->lb, t, nlen); /* Set the autoindent count. */ tp->ai = nlen; @@ -1822,17 +1812,13 @@ v_txt_auto(sp, lno, aitp, len, tp) * Back up to the previously edited line. */ static TEXT * -txt_backup(sp, tiqh, tp, flagsp) - SCR *sp; - TEXTH *tiqh; - TEXT *tp; - u_int32_t *flagsp; +txt_backup(SCR *sp, TEXTH *tiqh, TEXT *tp, u_int32_t *flagsp) { VI_PRIVATE *vip; TEXT *ntp; /* Get a handle on the previous TEXT structure. */ - if ((ntp = tp->q.cqe_prev) == (void *)tiqh) { + if ((ntp = TAILQ_PREV(tp, _texth, q)) == NULL) { if (!FL_ISSET(*flagsp, TXT_REPLAY)) msgq(sp, M_BERR, "193|Already at the beginning of the insert"); @@ -1853,7 +1839,7 @@ txt_backup(sp, tiqh, tp, flagsp) FL_CLR(*flagsp, TXT_APPENDEOL); /* Release the current TEXT. */ - CIRCLEQ_REMOVE(tiqh, tp, q); + TAILQ_REMOVE(tiqh, tp, q); text_free(tp); /* Update the old line on the screen. */ @@ -1891,7 +1877,7 @@ txt_backup(sp, tiqh, tp, flagsp) * Technically, txt_dent should be part of the screen interface, as it requires * knowledge of character sizes, including s, on the screen. It's here * because it's a complicated little beast, and I didn't want to shove it down - * into the screen. It's probable that KEY_LEN will call into the screen once + * into the screen. It's probable that KEY_COL will call into the screen once * there are screens with different character representations. * * txt_dent -- @@ -1901,14 +1887,11 @@ txt_backup(sp, tiqh, tp, flagsp) * changes. */ static int -txt_dent(sp, tp, isindent) - SCR *sp; - TEXT *tp; - int isindent; +txt_dent(SCR *sp, TEXT *tp, int isindent) { CHAR_T ch; u_long sw, ts; - size_t cno, current, spaces, target, tabs, off; + size_t cno, current, spaces, target, tabs; int ai_reset; ts = O_VAL(sp, O_TABSTOP); @@ -1932,13 +1915,15 @@ txt_dent(sp, tp, isindent) */ for (current = cno = 0; cno < tp->cno; ++cno) current += tp->lb[cno] == '\t' ? - COL_OFF(current, ts) : KEY_LEN(sp, tp->lb[cno]); + COL_OFF(current, ts) : KEY_COL(sp, tp->lb[cno]); target = current; if (isindent) target += COL_OFF(target, sw); - else - target -= --target % sw; + else { + --target; + target -= target % sw; + } /* * The AI characters will be turned into overwrite characters if the @@ -1960,7 +1945,7 @@ txt_dent(sp, tp, isindent) --tp->cno, ++tp->owrite); for (current = cno = 0; cno < tp->cno; ++cno) current += tp->lb[cno] == '\t' ? - COL_OFF(current, ts) : KEY_LEN(sp, tp->lb[cno]); + COL_OFF(current, ts) : KEY_COL(sp, tp->lb[cno]); /* * If we didn't move up to or past the target, it's because there @@ -2000,24 +1985,23 @@ txt_dent(sp, tp, isindent) /* * txt_fc -- - * File name completion. + * File name and ex command completion. */ static int -txt_fc(sp, tp, redrawp) - SCR *sp; - TEXT *tp; - int *redrawp; +txt_fc(SCR *sp, TEXT *tp, int *redrawp) { struct stat sb; ARGS **argv; - CHAR_T s_ch; EXCMD cmd; size_t indx, len, nlen, off; - int argc, trydir; - char *p, *t; + int argc; + CHAR_T *p, *t, *bp; + char *np, *epd = NULL; + size_t nplen; + int fstwd = 1; - trydir = 0; *redrawp = 0; + ex_cinit(sp, &cmd, 0, 0, OOBLNO, OOBLNO, 0); /* * Find the beginning of this "word" -- if we're at the beginning @@ -2026,67 +2010,53 @@ txt_fc(sp, tp, redrawp) if (tp->cno == 1) { len = 0; p = tp->lb; - } else -retry: for (len = 0, - off = tp->cno - 1, p = tp->lb + off;; --off, --p) { - if (isblank(*p)) { - ++p; - break; - } - ++len; - if (off == tp->ai || off == tp->offset) - break; + } else { + CHAR_T *ap; + + for (len = 0, + off = MAX(tp->ai, tp->offset), ap = tp->lb + off, p = ap; + off < tp->cno; ++off, ++ap) { + if (IS_ESCAPE(sp, &cmd, *ap)) { + if (++off == tp->cno) + break; + ++ap; + len += 2; + } else if (cmdskip(*ap)) { + p = ap + 1; + if (len > 0) + fstwd = 0; + len = 0; + } else + ++len; } + } /* - * Get enough space for a wildcard character. - * - * XXX - * This won't work for "foo\", since the \ will escape the expansion - * character. I'm not sure if that's a bug or not... + * If we are at the first word, do ex command completion instead of + * file name completion. */ - off = p - tp->lb; - BINC_RET(sp, tp->lb, tp->lb_len, tp->len + 1); - p = tp->lb + off; - - s_ch = p[len]; - p[len] = '*'; - - /* Build an ex command, and call the ex expansion routines. */ - ex_cinit(&cmd, 0, 0, OOBLNO, OOBLNO, 0, NULL); - if (argv_init(sp, &cmd)) - return (1); - if (argv_exp2(sp, &cmd, p, len + 1)) { - p[len] = s_ch; - return (0); + if (fstwd) + (void)argv_flt_ex(sp, &cmd, p, len); + else { + if ((bp = argv_uesc(sp, &cmd, p, len)) == NULL) + return (1); + if (argv_flt_path(sp, &cmd, bp, STRLEN(bp))) { + FREE_SPACEW(sp, bp, 0); + return (0); + } + FREE_SPACEW(sp, bp, 0); } argc = cmd.argc; argv = cmd.argv; - p[len] = s_ch; - switch (argc) { case 0: /* No matches. */ - if (!trydir) - (void)sp->gp->scr_bell(sp); + (void)sp->gp->scr_bell(sp); return (0); case 1: /* One match. */ - /* If something changed, do the exchange. */ - nlen = strlen(cmd.argv[0]->bp); - if (len != nlen || memcmp(cmd.argv[0]->bp, p, len)) - break; - - /* If haven't done a directory test, do it now. */ - if (!trydir && - !stat(cmd.argv[0]->bp, &sb) && S_ISDIR(sb.st_mode)) { - p += len; - goto isdir; - } - - /* If nothing changed, period, ring the bell. */ - if (!trydir) - (void)sp->gp->scr_bell(sp); - return (0); + /* Always overwrite the old text. */ + nlen = STRLEN(cmd.argv[0]->bp); + break; default: /* Multiple matches. */ *redrawp = 1; if (txt_fc_col(sp, argc, argv)) @@ -2104,8 +2074,17 @@ retry: for (len = 0, break; } + /* Escape the matched part of the path. */ + if (fstwd) + bp = cmd.argv[0]->bp; + else { + if ((bp = argv_esc(sp, &cmd, cmd.argv[0]->bp, nlen)) == NULL) + return (1); + nlen = STRLEN(bp); + } + /* Overwrite the expanded text first. */ - for (t = cmd.argv[0]->bp; len > 0 && nlen > 0; --len, --nlen) + for (t = bp; len > 0 && nlen > 0; --len, --nlen) *p++ = *t++; /* If lost text, make the remaining old text overwrite characters. */ @@ -2121,36 +2100,44 @@ retry: for (len = 0, /* Shift remaining text up, and move the cursor to the end. */ if (nlen) { off = p - tp->lb; - BINC_RET(sp, tp->lb, tp->lb_len, tp->len + nlen); + BINC_RETW(sp, tp->lb, tp->lb_len, tp->len + nlen); p = tp->lb + off; tp->cno += nlen; tp->len += nlen; if (tp->insert != 0) - (void)memmove(p + nlen, p, tp->insert); + (void)MEMMOVE(p + nlen, p, tp->insert); while (nlen--) *p++ = *t++; } - /* If a single match and it's a directory, retry it. */ - if (argc == 1 && !stat(cmd.argv[0]->bp, &sb) && S_ISDIR(sb.st_mode)) { -isdir: if (tp->owrite == 0) { + if (!fstwd) + FREE_SPACEW(sp, bp, 0); + + /* If not a single match of path, we've done. */ + if (argc != 1 || fstwd) + return (0); + + /* If a single match and it's a directory, append a '/'. */ + INT2CHAR(sp, cmd.argv[0]->bp, cmd.argv[0]->len + 1, np, nplen); + if ((epd = expanduser(np)) != NULL) + np = epd; + if (!stat(np, &sb) && S_ISDIR(sb.st_mode)) { + if (tp->owrite == 0) { off = p - tp->lb; - BINC_RET(sp, tp->lb, tp->lb_len, tp->len + 1); + BINC_RETW(sp, tp->lb, tp->lb_len, tp->len + 1); p = tp->lb + off; if (tp->insert != 0) - (void)memmove(p + 1, p, tp->insert); + (void)MEMMOVE(p + 1, p, tp->insert); ++tp->len; } else --tp->owrite; ++tp->cno; *p++ = '/'; - - trydir = 1; - goto retry; } + free(epd); return (0); } @@ -2159,27 +2146,28 @@ isdir: if (tp->owrite == 0) { * Display file names for file name completion. */ static int -txt_fc_col(sp, argc, argv) - SCR *sp; - int argc; - ARGS **argv; +txt_fc_col(SCR *sp, int argc, ARGS **argv) { ARGS **av; CHAR_T *p; GS *gp; size_t base, cnt, col, colwidth, numrows, numcols, prefix, row; int ac, nf, reset; + char *np, *pp; + size_t nlen; gp = sp->gp; /* Trim any directory prefix common to all of the files. */ - if ((p = strrchr(argv[0]->bp, '/')) == NULL) + INT2CHAR(sp, argv[0]->bp, argv[0]->len + 1, np, nlen); + if ((pp = strrchr(np, '/')) == NULL) prefix = 0; else { - prefix = (p - argv[0]->bp) + 1; + prefix = (pp - np) + 1; for (ac = argc - 1, av = argv + 1; ac > 0; --ac, ++av) if (av[0]->len < prefix || - memcmp(av[0]->bp, argv[0]->bp, prefix)) { + MEMCMP(av[0]->bp, argv[0]->bp, + prefix)) { prefix = 0; break; } @@ -2194,7 +2182,7 @@ txt_fc_col(sp, argc, argv) */ for (ac = argc, av = argv, colwidth = 0; ac > 0; --ac, ++av) { for (col = 0, p = av[0]->bp + prefix; *p != '\0'; ++p) - col += KEY_LEN(sp, *p); + col += KEY_COL(sp, *p); if (col > colwidth) colwidth = col; } @@ -2215,15 +2203,17 @@ txt_fc_col(sp, argc, argv) goto intr; /* If the largest file name is too large, just print them. */ - if (colwidth > sp->cols) { - p = msg_print(sp, av[0]->bp + prefix, &nf); + if (colwidth >= sp->cols) { for (ac = argc, av = argv; ac > 0; --ac, ++av) { - (void)ex_printf(sp, "%s\n", p); + INT2CHAR(sp, av[0]->bp+prefix, av[0]->len+1-prefix, + np, nlen); + pp = msg_print(sp, np, &nf); + (void)ex_printf(sp, "%s\n", pp); + if (nf) + FREE_SPACE(sp, pp, 0); if (F_ISSET(gp, G_INTERRUPTED)) break; } - if (nf) - FREE_SPACE(sp, p, 0); CHK_INTR; } else { /* Figure out the number of columns. */ @@ -2238,10 +2228,12 @@ txt_fc_col(sp, argc, argv) /* Display the files in sorted order. */ for (row = 0; row < numrows; ++row) { for (base = row, col = 0; col < numcols; ++col) { - p = msg_print(sp, argv[base]->bp + prefix, &nf); - cnt = ex_printf(sp, "%s", p); + INT2CHAR(sp, argv[base]->bp+prefix, + argv[base]->len+1-prefix, np, nlen); + pp = msg_print(sp, np, &nf); + cnt = ex_printf(sp, "%s", pp); if (nf) - FREE_SPACE(sp, p, 0); + FREE_SPACE(sp, pp, 0); CHK_INTR; if ((base += numrows) >= argc) break; @@ -2271,14 +2263,12 @@ intr: F_CLR(gp, G_INTERRUPTED); * Set the end mark on the line. */ static int -txt_emark(sp, tp, cno) - SCR *sp; - TEXT *tp; - size_t cno; +txt_emark(SCR *sp, TEXT *tp, size_t cno) { - CHAR_T ch, *kp; + CHAR_T ch; + u_char *kp; size_t chlen, nlen, olen; - char *p; + CHAR_T *p; ch = CH_ENDMARK; @@ -2286,11 +2276,11 @@ txt_emark(sp, tp, cno) * The end mark may not be the same size as the current character. * Don't let the line shift. */ - nlen = KEY_LEN(sp, ch); + nlen = KEY_COL(sp, ch); if (tp->lb[cno] == '\t') (void)vs_columns(sp, tp->lb, tp->lno, &cno, &olen); else - olen = KEY_LEN(sp, tp->lb[cno]); + olen = KEY_COL(sp, tp->lb[cno]); /* * If the line got longer, well, it's weird, but it's easy. If @@ -2298,20 +2288,22 @@ txt_emark(sp, tp, cno) * to fix it up. */ if (olen > nlen) { - BINC_RET(sp, tp->lb, tp->lb_len, tp->len + olen); + BINC_RETW(sp, tp->lb, tp->lb_len, tp->len + olen); chlen = olen - nlen; if (tp->insert != 0) - memmove(tp->lb + cno + 1 + chlen, + MEMMOVE(tp->lb + cno + 1 + chlen, tp->lb + cno + 1, tp->insert); tp->len += chlen; tp->owrite += chlen; p = tp->lb + cno; - if (tp->lb[cno] == '\t') + if (tp->lb[cno] == '\t' || + KEY_NEEDSWIDE(sp, tp->lb[cno])) for (cno += chlen; chlen--;) *p++ = ' '; else - for (kp = KEY_NAME(sp, tp->lb[cno]), + for (kp = (u_char *) + KEY_NAME(sp, tp->lb[cno]), cno += chlen; chlen--;) *p++ = *kp++; } @@ -2324,9 +2316,7 @@ txt_emark(sp, tp, cno) * Handle an error during input processing. */ static void -txt_err(sp, tiqh) - SCR *sp; - TEXTH *tiqh; +txt_err(SCR *sp, TEXTH *tiqh) { recno_t lno; @@ -2339,7 +2329,7 @@ txt_err(sp, tiqh) * We depend on at least one line number being set in the text * chain. */ - for (lno = tiqh->cqh_first->lno; + for (lno = TAILQ_FIRST(tiqh)->lno; !db_exist(sp, lno) && lno > 0; --lno); sp->lno = lno == 0 ? 1 : lno; @@ -2359,14 +2349,12 @@ txt_err(sp, tiqh) * may not be able to enter. */ static int -txt_hex(sp, tp) - SCR *sp; - TEXT *tp; +txt_hex(SCR *sp, TEXT *tp) { CHAR_T savec; size_t len, off; u_long value; - char *p, *wp; + CHAR_T *p, *wp; /* * Null-terminate the string. Since nul isn't a legal hex value, @@ -2393,8 +2381,8 @@ txt_hex(sp, tp) /* Get the value. */ errno = 0; - value = strtol(wp, NULL, 16); - if (errno || value > MAX_CHAR_T) { + value = STRTOL(wp, NULL, 16); + if (errno || value > UCHAR_MAX) { nothex: tp->lb[tp->cno] = savec; return (0); } @@ -2409,12 +2397,14 @@ nothex: tp->lb[tp->cno] = savec; /* Copy down any overwrite characters. */ if (tp->owrite) - memmove(tp->lb + tp->cno, tp->lb + tp->cno + len, tp->owrite); + MEMMOVE(tp->lb + tp->cno, tp->lb + tp->cno + len, + tp->owrite); /* Copy down any insert characters. */ if (tp->insert) - memmove(tp->lb + tp->cno + tp->owrite, - tp->lb + tp->cno + tp->owrite + len, tp->insert); + MEMMOVE(tp->lb + tp->cno + tp->owrite, + tp->lb + tp->cno + tp->owrite + len, + tp->insert); return (0); } @@ -2439,15 +2429,12 @@ nothex: tp->lb[tp->cno] = savec; * of the screen space they require, but that it not overwrite other characters. */ static int -txt_insch(sp, tp, chp, flags) - SCR *sp; - TEXT *tp; - CHAR_T *chp; - u_int flags; +txt_insch(SCR *sp, TEXT *tp, CHAR_T *chp, u_int flags) { - CHAR_T *kp, savech; + u_char *kp; + CHAR_T savech; size_t chlen, cno, copydown, olen, nlen; - char *p; + CHAR_T *p; /* * The 'R' command does one-for-one replacement, because there's @@ -2473,7 +2460,7 @@ txt_insch(sp, tp, chp, flags) (void)vs_columns(sp, tp->lb, tp->lno, &cno, &nlen); tp->lb[cno] = savech; } else - nlen = KEY_LEN(sp, *chp); + nlen = KEY_COL(sp, *chp); /* * Eat overwrite characters until we run out of them or we've @@ -2488,7 +2475,7 @@ txt_insch(sp, tp, chp, flags) (void)vs_columns(sp, tp->lb, tp->lno, &cno, &olen); else - olen = KEY_LEN(sp, tp->lb[cno]); + olen = KEY_COL(sp, tp->lb[cno]); if (olen == nlen) { nlen = 0; @@ -2498,19 +2485,21 @@ txt_insch(sp, tp, chp, flags) ++copydown; nlen -= olen; } else { - BINC_RET(sp, + BINC_RETW(sp, tp->lb, tp->lb_len, tp->len + olen); chlen = olen - nlen; - memmove(tp->lb + cno + 1 + chlen, - tp->lb + cno + 1, tp->owrite + tp->insert); + MEMMOVE(tp->lb + cno + 1 + chlen, + tp->lb + cno + 1, + tp->owrite + tp->insert); tp->len += chlen; tp->owrite += chlen; - if (tp->lb[cno] == '\t') + if (tp->lb[cno] == '\t' || + KEY_NEEDSWIDE(sp, tp->lb[cno])) for (p = tp->lb + cno + 1; chlen--;) *p++ = ' '; else - for (kp = + for (kp = (u_char *) KEY_NAME(sp, tp->lb[cno]) + nlen, p = tp->lb + cno + 1; chlen--;) *p++ = *kp++; @@ -2525,7 +2514,7 @@ txt_insch(sp, tp, chp, flags) * into position. */ if (copydown != 0 && (tp->len -= copydown) != 0) - memmove(tp->lb + cno, tp->lb + cno + copydown, + MEMMOVE(tp->lb + cno, tp->lb + cno + copydown, tp->owrite + tp->insert + copydown); /* If we had enough overwrite characters, we're done. */ @@ -2536,14 +2525,14 @@ txt_insch(sp, tp, chp, flags) } /* Check to see if the character fits into the input buffer. */ - BINC_RET(sp, tp->lb, tp->lb_len, tp->len + 1); + BINC_RETW(sp, tp->lb, tp->lb_len, tp->len + 1); ++tp->len; if (tp->insert) { /* Insert a character. */ if (tp->insert == 1) tp->lb[tp->cno + 1] = tp->lb[tp->cno]; else - memmove(tp->lb + tp->cno + 1, + MEMMOVE(tp->lb + tp->cno + 1, tp->lb + tp->cno, tp->owrite + tp->insert); } tp->lb[tp->cno++] = *chp; @@ -2555,11 +2544,7 @@ txt_insch(sp, tp, chp, flags) * Do an incremental search. */ static int -txt_isrch(sp, vp, tp, is_flagsp) - SCR *sp; - VICMD *vp; - TEXT *tp; - u_int8_t *is_flagsp; +txt_isrch(SCR *sp, VICMD *vp, TEXT *tp, u_int8_t *is_flagsp) { MARK start; recno_t lno; @@ -2592,7 +2577,7 @@ txt_isrch(sp, vp, tp, is_flagsp) * If it's a magic shell character, and not quoted, reset the cursor * to the starting point. */ - if (strchr(O_STR(sp, O_SHELLMETA), tp->lb[tp->cno - 1]) != NULL && + if (IS_SHELLMETA(sp, tp->lb[tp->cno - 1]) && (tp->cno == 2 || tp->lb[tp->cno - 2] != '\\')) vp->m_final = vp->m_start; @@ -2679,10 +2664,7 @@ txt_isrch(sp, vp, tp, is_flagsp) * Resolve the input text chain into the file. */ static int -txt_resolve(sp, tiqh, flags) - SCR *sp; - TEXTH *tiqh; - u_int32_t flags; +txt_resolve(SCR *sp, TEXTH *tiqh, u_int32_t flags) { VI_PRIVATE *vip; TEXT *tp; @@ -2697,23 +2679,23 @@ txt_resolve(sp, tiqh, flags) * about the line will be wrong. */ vip = VIP(sp); - tp = tiqh->cqh_first; + tp = TAILQ_FIRST(tiqh); if (LF_ISSET(TXT_AUTOINDENT)) txt_ai_resolve(sp, tp, &changed); else changed = 0; if (db_set(sp, tp->lno, tp->lb, tp->len) || - changed && vs_change(sp, tp->lno, LINE_RESET)) + (changed && vs_change(sp, tp->lno, LINE_RESET))) return (1); - for (lno = tp->lno; (tp = tp->q.cqe_next) != (void *)&sp->tiq; ++lno) { + for (lno = tp->lno; (tp = TAILQ_NEXT(tp, q)) != NULL; ++lno) { if (LF_ISSET(TXT_AUTOINDENT)) txt_ai_resolve(sp, tp, &changed); else changed = 0; if (db_append(sp, 0, lno, tp->lb, tp->len) || - changed && vs_change(sp, tp->lno, LINE_RESET)) + (changed && vs_change(sp, tp->lno, LINE_RESET))) return (1); } @@ -2736,9 +2718,7 @@ txt_resolve(sp, tiqh, flags) * I think not. */ static int -txt_showmatch(sp, tp) - SCR *sp; - TEXT *tp; +txt_showmatch(SCR *sp, TEXT *tp) { GS *gp; VCS cs; @@ -2767,7 +2747,7 @@ txt_showmatch(sp, tp) cs.cs_cno = tp->cno - 1; if (cs_init(sp, &cs)) return (1); - startc = (endc = cs.cs_ch) == ')' ? '(' : '{'; + startc = STRCHR(VIP(sp)->mcs, endc = cs.cs_ch)[-1]; /* Search for the match. */ for (cnt = 1;;) { @@ -2788,7 +2768,7 @@ txt_showmatch(sp, tp) } /* If the match is on the screen, move to it. */ - if (cs.cs_lno < m.lno || cs.cs_lno == m.lno && cs.cs_cno < m.cno) + if (cs.cs_lno < m.lno || (cs.cs_lno == m.lno && cs.cs_cno < m.cno)) return (0); sp->lno = cs.cs_lno; sp->cno = cs.cs_cno; @@ -2805,15 +2785,11 @@ txt_showmatch(sp, tp) * Handle margin wrap. */ static int -txt_margin(sp, tp, wmtp, didbreak, flags) - SCR *sp; - TEXT *tp, *wmtp; - int *didbreak; - u_int32_t flags; +txt_margin(SCR *sp, TEXT *tp, TEXT *wmtp, int *didbreak, u_int32_t flags) { VI_PRIVATE *vip; size_t len, off; - char *p, *wp; + CHAR_T *p, *wp; /* Find the nearest previous blank. */ for (off = tp->cno - 1, p = tp->lb + off, len = 0;; --off, --p, ++len) { @@ -2885,15 +2861,11 @@ txt_margin(sp, tp, wmtp, didbreak, flags) * Resolve the input line for the 'R' command. */ static void -txt_Rresolve(sp, tiqh, tp, orig_len) - SCR *sp; - TEXTH *tiqh; - TEXT *tp; - const size_t orig_len; +txt_Rresolve(SCR *sp, TEXTH *tiqh, TEXT *tp, const size_t orig_len) { TEXT *ttp; size_t input_len, retain; - char *p; + CHAR_T *p; /* * Check to make sure that the cursor hasn't moved beyond @@ -2906,9 +2878,9 @@ txt_Rresolve(sp, tiqh, tp, orig_len) * Calculate how many characters the user has entered, * plus the blanks erased by /s. */ - for (ttp = tiqh->cqh_first, input_len = 0;;) { + for (ttp = TAILQ_FIRST(tiqh), input_len = 0;;) { input_len += ttp == tp ? tp->cno : ttp->len + ttp->R_erase; - if ((ttp = ttp->q.cqe_next) == (void *)&sp->tiq) + if ((ttp = TAILQ_NEXT(ttp, q)) == NULL) break; } @@ -2929,9 +2901,9 @@ txt_Rresolve(sp, tiqh, tp, orig_len) if (input_len < orig_len) { retain = MIN(tp->owrite, orig_len - input_len); if (db_get(sp, - tiqh->cqh_first->lno, DBG_FATAL | DBG_NOCACHE, &p, NULL)) + TAILQ_FIRST(tiqh)->lno, DBG_FATAL | DBG_NOCACHE, &p, NULL)) return; - memcpy(tp->lb + tp->cno, p + input_len, retain); + MEMCPY(tp->lb + tp->cno, p + input_len, retain); tp->len -= tp->owrite - retain; tp->owrite = 0; tp->insert += retain; @@ -2943,8 +2915,7 @@ txt_Rresolve(sp, tiqh, tp, orig_len) * No more characters message. */ static void -txt_nomorech(sp) - SCR *sp; +txt_nomorech(SCR *sp) { msgq(sp, M_BERR, "194|No more characters to erase"); } diff --git a/vi/v_ulcase.c b/vi/v_ulcase.c index 179bebabcc11..10d3d359619d 100644 --- a/vi/v_ulcase.c +++ b/vi/v_ulcase.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_ulcase.c 10.7 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: v_ulcase.c,v 10.12 2011/12/02 19:58:32 zy Exp $"; #endif /* not lint */ #include @@ -47,14 +47,12 @@ static int ulcase __P((SCR *, recno_t, CHAR_T *, size_t, size_t, size_t)); * PUBLIC: int v_ulcase __P((SCR *, VICMD *)); */ int -v_ulcase(sp, vp) - SCR *sp; - VICMD *vp; +v_ulcase(SCR *sp, VICMD *vp) { recno_t lno; size_t cno, lcnt, len; u_long cnt; - char *p; + CHAR_T *p; lno = vp->m_start.lno; cno = vp->m_start.cno; @@ -107,9 +105,7 @@ v_ulcase(sp, vp) * PUBLIC: int v_mulcase __P((SCR *, VICMD *)); */ int -v_mulcase(sp, vp) - SCR *sp; - VICMD *vp; +v_mulcase(SCR *sp, VICMD *vp) { CHAR_T *p; size_t len; @@ -145,28 +141,24 @@ v_mulcase(sp, vp) * Change part of a line's case. */ static int -ulcase(sp, lno, lp, len, scno, ecno) - SCR *sp; - recno_t lno; - CHAR_T *lp; - size_t len, scno, ecno; +ulcase(SCR *sp, recno_t lno, CHAR_T *lp, size_t len, size_t scno, size_t ecno) { size_t blen; int change, rval; - CHAR_T ch, *p, *t; - char *bp; + ARG_CHAR_T ch; + CHAR_T *p, *t, *bp; - GET_SPACE_RET(sp, bp, blen, len); - memmove(bp, lp, len); + GET_SPACE_RETW(sp, bp, blen, len); + MEMMOVE(bp, lp, len); change = rval = 0; for (p = bp + scno, t = bp + ecno + 1; p < t; ++p) { - ch = *(u_char *)p; - if (islower(ch)) { - *p = toupper(ch); + ch = (UCHAR_T)*p; + if (ISLOWER(ch)) { + *p = TOUPPER(ch); change = 1; - } else if (isupper(ch)) { - *p = tolower(ch); + } else if (ISUPPER(ch)) { + *p = TOLOWER(ch); change = 1; } } @@ -174,6 +166,6 @@ ulcase(sp, lno, lp, len, scno, ecno) if (change && db_set(sp, lno, bp, len)) rval = 1; - FREE_SPACE(sp, bp, blen); + FREE_SPACEW(sp, bp, blen); return (rval); } diff --git a/vi/v_undo.c b/vi/v_undo.c index d04a8a18810b..2bbd9208643c 100644 --- a/vi/v_undo.c +++ b/vi/v_undo.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_undo.c 10.5 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: v_undo.c,v 10.6 2001/06/25 15:19:36 skimo Exp $"; #endif /* not lint */ #include @@ -34,9 +34,7 @@ static const char sccsid[] = "@(#)v_undo.c 10.5 (Berkeley) 3/6/96"; * PUBLIC: int v_Undo __P((SCR *, VICMD *)); */ int -v_Undo(sp, vp) - SCR *sp; - VICMD *vp; +v_Undo(SCR *sp, VICMD *vp) { /* * Historically, U reset the cursor to the first column in the line @@ -70,9 +68,7 @@ v_Undo(sp, vp) * PUBLIC: int v_undo __P((SCR *, VICMD *)); */ int -v_undo(sp, vp) - SCR *sp; - VICMD *vp; +v_undo(SCR *sp, VICMD *vp) { EXF *ep; diff --git a/vi/v_util.c b/vi/v_util.c index c4c0daa901fd..6348ca73ec85 100644 --- a/vi/v_util.c +++ b/vi/v_util.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_util.c 10.11 (Berkeley) 6/30/96"; +static const char sccsid[] = "$Id: v_util.c,v 10.14 2001/06/25 15:19:36 skimo Exp $"; #endif /* not lint */ #include @@ -35,9 +35,7 @@ static const char sccsid[] = "@(#)v_util.c 10.11 (Berkeley) 6/30/96"; * PUBLIC: void v_eof __P((SCR *, MARK *)); */ void -v_eof(sp, mp) - SCR *sp; - MARK *mp; +v_eof(SCR *sp, MARK *mp) { recno_t lno; @@ -60,9 +58,7 @@ v_eof(sp, mp) * PUBLIC: void v_eol __P((SCR *, MARK *)); */ void -v_eol(sp, mp) - SCR *sp; - MARK *mp; +v_eol(SCR *sp, MARK *mp) { size_t len; @@ -85,8 +81,7 @@ v_eol(sp, mp) * PUBLIC: void v_nomove __P((SCR *)); */ void -v_nomove(sp) - SCR *sp; +v_nomove(SCR *sp) { msgq(sp, M_BERR, "197|No cursor movement made"); } @@ -98,9 +93,7 @@ v_nomove(sp) * PUBLIC: void v_sof __P((SCR *, MARK *)); */ void -v_sof(sp, mp) - SCR *sp; - MARK *mp; +v_sof(SCR *sp, MARK *mp) { if (mp == NULL || mp->lno == 1) msgq(sp, M_BERR, "198|Already at the beginning of the file"); @@ -115,8 +108,7 @@ v_sof(sp, mp) * PUBLIC: void v_sol __P((SCR *)); */ void -v_sol(sp) - SCR *sp; +v_sol(SCR *sp) { msgq(sp, M_BERR, "200|Already in the first column"); } @@ -125,12 +117,10 @@ v_sol(sp) * v_isempty -- * Return if the line contains nothing but white-space characters. * - * PUBLIC: int v_isempty __P((char *, size_t)); + * PUBLIC: int v_isempty __P((CHAR_T *, size_t)); */ int -v_isempty(p, len) - char *p; - size_t len; +v_isempty(CHAR_T *p, size_t len) { for (; len--; ++p) if (!isblank(*p)) @@ -145,10 +135,7 @@ v_isempty(p, len) * PUBLIC: void v_emsg __P((SCR *, char *, vim_t)); */ void -v_emsg(sp, p, which) - SCR *sp; - char *p; - vim_t which; +v_emsg(SCR *sp, char *p, vim_t which) { switch (which) { case VIM_COMBUF: diff --git a/vi/v_word.c b/vi/v_word.c index e6e4a63c57e7..6336e2d97ce8 100644 --- a/vi/v_word.c +++ b/vi/v_word.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_word.c 10.5 (Berkeley) 3/6/96"; +static const char sccsid[] = "$Id: v_word.c,v 10.7 2011/12/27 00:49:31 zy Exp $"; #endif /* not lint */ #include @@ -77,9 +77,7 @@ static int fword __P((SCR *, VICMD *, enum which)); * PUBLIC: int v_wordW __P((SCR *, VICMD *)); */ int -v_wordW(sp, vp) - SCR *sp; - VICMD *vp; +v_wordW(SCR *sp, VICMD *vp) { return (fword(sp, vp, BIGWORD)); } @@ -91,9 +89,7 @@ v_wordW(sp, vp) * PUBLIC: int v_wordw __P((SCR *, VICMD *)); */ int -v_wordw(sp, vp) - SCR *sp; - VICMD *vp; +v_wordw(SCR *sp, VICMD *vp) { return (fword(sp, vp, LITTLEWORD)); } @@ -103,10 +99,7 @@ v_wordw(sp, vp) * Move forward by words. */ static int -fword(sp, vp, type) - SCR *sp; - VICMD *vp; - enum which type; +fword(SCR *sp, VICMD *vp, enum which type) { enum { INWORD, NOTWORD } state; VCS cs; @@ -125,7 +118,7 @@ fword(sp, vp, type) * counts as a single word move. If it's a motion command, * don't move off the end of the line. */ - if (cs.cs_flags == CS_EMP || cs.cs_flags == 0 && isblank(cs.cs_ch)) { + if (cs.cs_flags == CS_EMP || (cs.cs_flags == 0 && ISBLANK(cs.cs_ch))) { if (ISMOTION(vp) && cs.cs_flags != CS_EMP && cnt == 1) { if (ISCMD(vp->rkp, 'c')) return (0); @@ -153,7 +146,7 @@ fword(sp, vp, type) return (1); if (cs.cs_flags == CS_EOF) goto ret; - if (cs.cs_flags != 0 || isblank(cs.cs_ch)) + if (cs.cs_flags != 0 || ISBLANK(cs.cs_ch)) break; } /* @@ -185,7 +178,7 @@ fword(sp, vp, type) return (1); if (cs.cs_flags == CS_EOF) goto ret; - if (cs.cs_flags != 0 || isblank(cs.cs_ch)) + if (cs.cs_flags != 0 || ISBLANK(cs.cs_ch)) break; if (state == INWORD) { if (!inword(cs.cs_ch)) @@ -204,7 +197,7 @@ fword(sp, vp, type) } /* Eat whitespace characters. */ - if (cs.cs_flags != 0 || isblank(cs.cs_ch)) + if (cs.cs_flags != 0 || ISBLANK(cs.cs_ch)) if (cs_fblank(sp, &cs)) return (1); if (cs.cs_flags == CS_EOF) @@ -244,9 +237,7 @@ ret: if (!ISMOTION(vp) && * PUBLIC: int v_wordE __P((SCR *, VICMD *)); */ int -v_wordE(sp, vp) - SCR *sp; - VICMD *vp; +v_wordE(SCR *sp, VICMD *vp) { return (eword(sp, vp, BIGWORD)); } @@ -258,9 +249,7 @@ v_wordE(sp, vp) * PUBLIC: int v_worde __P((SCR *, VICMD *)); */ int -v_worde(sp, vp) - SCR *sp; - VICMD *vp; +v_worde(SCR *sp, VICMD *vp) { return (eword(sp, vp, LITTLEWORD)); } @@ -270,10 +259,7 @@ v_worde(sp, vp) * Move forward to the end of the word. */ static int -eword(sp, vp, type) - SCR *sp; - VICMD *vp; - enum which type; +eword(SCR *sp, VICMD *vp, enum which type) { enum { INWORD, NOTWORD } state; VCS cs; @@ -291,10 +277,10 @@ eword(sp, vp, type) * it. (This doesn't count as a word move.) Stay at the character * past the current one, it sets word "state" for the 'e' command. */ - if (cs.cs_flags == 0 && !isblank(cs.cs_ch)) { + if (cs.cs_flags == 0 && !ISBLANK(cs.cs_ch)) { if (cs_next(sp, &cs)) return (1); - if (cs.cs_flags == 0 && !isblank(cs.cs_ch)) + if (cs.cs_flags == 0 && !ISBLANK(cs.cs_ch)) goto start; } if (cs_fblank(sp, &cs)) @@ -313,7 +299,7 @@ start: if (type == BIGWORD) return (1); if (cs.cs_flags == CS_EOF) goto ret; - if (cs.cs_flags != 0 || isblank(cs.cs_ch)) + if (cs.cs_flags != 0 || ISBLANK(cs.cs_ch)) break; } /* @@ -342,7 +328,7 @@ start: if (type == BIGWORD) return (1); if (cs.cs_flags == CS_EOF) goto ret; - if (cs.cs_flags != 0 || isblank(cs.cs_ch)) + if (cs.cs_flags != 0 || ISBLANK(cs.cs_ch)) break; if (state == INWORD) { if (!inword(cs.cs_ch)) @@ -359,7 +345,7 @@ start: if (type == BIGWORD) } /* Eat whitespace characters. */ - if (cs.cs_flags != 0 || isblank(cs.cs_ch)) + if (cs.cs_flags != 0 || ISBLANK(cs.cs_ch)) if (cs_fblank(sp, &cs)) return (1); if (cs.cs_flags == CS_EOF) @@ -397,9 +383,7 @@ ret: if (!ISMOTION(vp) && * PUBLIC: int v_wordB __P((SCR *, VICMD *)); */ int -v_wordB(sp, vp) - SCR *sp; - VICMD *vp; +v_wordB(SCR *sp, VICMD *vp) { return (bword(sp, vp, BIGWORD)); } @@ -411,9 +395,7 @@ v_wordB(sp, vp) * PUBLIC: int v_wordb __P((SCR *, VICMD *)); */ int -v_wordb(sp, vp) - SCR *sp; - VICMD *vp; +v_wordb(SCR *sp, VICMD *vp) { return (bword(sp, vp, LITTLEWORD)); } @@ -423,10 +405,7 @@ v_wordb(sp, vp) * Move backward by words. */ static int -bword(sp, vp, type) - SCR *sp; - VICMD *vp; - enum which type; +bword(SCR *sp, VICMD *vp, enum which type) { enum { INWORD, NOTWORD } state; VCS cs; @@ -445,10 +424,10 @@ bword(sp, vp, type) * character before the current one, it sets word "state" for the * 'b' command. */ - if (cs.cs_flags == 0 && !isblank(cs.cs_ch)) { + if (cs.cs_flags == 0 && !ISBLANK(cs.cs_ch)) { if (cs_prev(sp, &cs)) return (1); - if (cs.cs_flags == 0 && !isblank(cs.cs_ch)) + if (cs.cs_flags == 0 && !ISBLANK(cs.cs_ch)) goto start; } if (cs_bblank(sp, &cs)) @@ -467,7 +446,7 @@ start: if (type == BIGWORD) return (1); if (cs.cs_flags == CS_SOF) goto ret; - if (cs.cs_flags != 0 || isblank(cs.cs_ch)) + if (cs.cs_flags != 0 || ISBLANK(cs.cs_ch)) break; } /* @@ -496,7 +475,7 @@ start: if (type == BIGWORD) return (1); if (cs.cs_flags == CS_SOF) goto ret; - if (cs.cs_flags != 0 || isblank(cs.cs_ch)) + if (cs.cs_flags != 0 || ISBLANK(cs.cs_ch)) break; if (state == INWORD) { if (!inword(cs.cs_ch)) @@ -513,7 +492,7 @@ start: if (type == BIGWORD) } /* Eat whitespace characters. */ - if (cs.cs_flags != 0 || isblank(cs.cs_ch)) + if (cs.cs_flags != 0 || ISBLANK(cs.cs_ch)) if (cs_bblank(sp, &cs)) return (1); if (cs.cs_flags == CS_SOF) diff --git a/vi/v_xchar.c b/vi/v_xchar.c index 15f155ffed33..a0c1a692be90 100644 --- a/vi/v_xchar.c +++ b/vi/v_xchar.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_xchar.c 10.9 (Berkeley) 10/23/96"; +static const char sccsid[] = "$Id: v_xchar.c,v 10.10 2001/06/25 15:19:36 skimo Exp $"; #endif /* not lint */ #include @@ -31,9 +31,7 @@ static const char sccsid[] = "@(#)v_xchar.c 10.9 (Berkeley) 10/23/96"; * PUBLIC: int v_xchar __P((SCR *, VICMD *)); */ int -v_xchar(sp, vp) - SCR *sp; - VICMD *vp; +v_xchar(SCR *sp, VICMD *vp) { size_t len; int isempty; @@ -80,9 +78,7 @@ nodel: msgq(sp, M_BERR, "206|No characters to delete"); * PUBLIC: int v_Xchar __P((SCR *, VICMD *)); */ int -v_Xchar(sp, vp) - SCR *sp; - VICMD *vp; +v_Xchar(SCR *sp, VICMD *vp) { u_long cnt; diff --git a/vi/v_yank.c b/vi/v_yank.c index 4708f1996774..7b02cce04adb 100644 --- a/vi/v_yank.c +++ b/vi/v_yank.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_yank.c 10.9 (Berkeley) 5/19/96"; +static const char sccsid[] = "$Id: v_yank.c,v 10.10 2001/06/25 15:19:36 skimo Exp $"; #endif /* not lint */ #include @@ -42,9 +42,7 @@ static const char sccsid[] = "@(#)v_yank.c 10.9 (Berkeley) 5/19/96"; * PUBLIC: int v_yank __P((SCR *, VICMD *)); */ int -v_yank(sp, vp) - SCR *sp; - VICMD *vp; +v_yank(SCR *sp, VICMD *vp) { size_t len; diff --git a/vi/v_z.c b/vi/v_z.c index 5f02ddf5a10b..9d4ef64f73f7 100644 --- a/vi/v_z.c +++ b/vi/v_z.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_z.c 10.10 (Berkeley) 5/16/96"; +static const char sccsid[] = "$Id: v_z.c,v 10.13 2011/12/02 17:26:59 zy Exp $"; #endif /* not lint */ #include @@ -31,12 +31,10 @@ static const char sccsid[] = "@(#)v_z.c 10.10 (Berkeley) 5/16/96"; * PUBLIC: int v_z __P((SCR *, VICMD *)); */ int -v_z(sp, vp) - SCR *sp; - VICMD *vp; +v_z(SCR *sp, VICMD *vp) { recno_t lno; - u_int value; + e_key_t value; /* * The first count is the line to use. If the value doesn't @@ -136,9 +134,7 @@ v_z(sp, vp) * PUBLIC: int vs_crel __P((SCR *, long)); */ int -vs_crel(sp, count) - SCR *sp; - long count; +vs_crel(SCR *sp, long int count) { sp->t_minrows = sp->t_rows = count; if (sp->t_rows > sp->rows - 1) diff --git a/vi/v_zexit.c b/vi/v_zexit.c index 3e454caa5bea..a2decd662882 100644 --- a/vi/v_zexit.c +++ b/vi/v_zexit.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)v_zexit.c 10.6 (Berkeley) 4/27/96"; +static const char sccsid[] = "$Id: v_zexit.c,v 10.7 2001/06/25 15:19:37 skimo Exp $"; #endif /* not lint */ #include @@ -32,9 +32,7 @@ static const char sccsid[] = "@(#)v_zexit.c 10.6 (Berkeley) 4/27/96"; * PUBLIC: int v_zexit __P((SCR *, VICMD *)); */ int -v_zexit(sp, vp) - SCR *sp; - VICMD *vp; +v_zexit(SCR *sp, VICMD *vp) { /* Write back any modifications. */ if (F_ISSET(sp->ep, F_MODIFIED) && diff --git a/vi/vi.c b/vi/vi.c index d20f7f284e39..aafdbd139c5f 100644 --- a/vi/vi.c +++ b/vi/vi.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)vi.c 10.57 (Berkeley) 10/13/96"; +static const char sccsid[] = "$Id: vi.c,v 10.61 2011/12/21 13:08:30 zy Exp $"; #endif /* not lint */ #include @@ -40,7 +40,6 @@ static int v_count __P((SCR *, ARG_CHAR_T, u_long *)); static void v_dtoh __P((SCR *)); static int v_init __P((SCR *)); static gcret_t v_key __P((SCR *, int, EVENT *, u_int32_t)); -static int v_keyword __P((SCR *)); static int v_motion __P((SCR *, VICMD *, VICMD *, int *)); #if defined(DEBUG) && defined(COMLOG) @@ -62,13 +61,12 @@ static void v_comlog __P((SCR *, VICMD *)); * PUBLIC: int vi __P((SCR **)); */ int -vi(spp) - SCR **spp; +vi(SCR **spp) { GS *gp; MARK abs; SCR *next, *sp; - VICMD cmd, *vp; + VICMD cmd = { 0 }, *vp; VI_PRIVATE *vip; int comcount, mapped, rval; @@ -76,9 +74,8 @@ vi(spp) sp = *spp; gp = sp->gp; - /* Initialize the command structure. */ + /* Point to the command structure. */ vp = &cmd; - memset(vp, 0, sizeof(VICMD)); /* Reset strange attraction. */ F_SET(vp, VM_RCM_SET); @@ -158,8 +155,6 @@ vi(spp) case GC_ERR_NOFLUSH: goto gc_err_noflush; case GC_EVENT: - if (v_event_exec(sp, vp)) - goto err; goto gc_event; case GC_FATAL: goto ret; @@ -347,9 +342,9 @@ ex_continue: if (vp->kp->func(sp, vp)) * command, since the tag may be moving to the same file. */ if ((F_ISSET(vp, V_ABS) || - F_ISSET(vp, V_ABS_L) && sp->lno != abs.lno || - F_ISSET(vp, V_ABS_C) && - (sp->lno != abs.lno || sp->cno != abs.cno)) && + (F_ISSET(vp, V_ABS_L) && sp->lno != abs.lno) || + (F_ISSET(vp, V_ABS_C) && + (sp->lno != abs.lno || sp->cno != abs.cno))) && mark_set(sp, ABSMARK1, &abs, 1)) goto err; @@ -405,6 +400,7 @@ intr: CLR_INTERRUPT(sp); if (F_ISSET(gp, G_SRESTART) || F_ISSET(sp, SC_EX)) { *spp = sp; v_dtoh(sp); + gp->scr_discard(sp, NULL); break; } } @@ -452,11 +448,13 @@ VIKEYS const tmotion = { * [count] key [character] */ static gcret_t -v_cmd(sp, dp, vp, ismotion, comcountp, mappedp) - SCR *sp; - VICMD *dp, *vp; - VICMD *ismotion; /* Previous key if getting motion component. */ - int *comcountp, *mappedp; +v_cmd( + SCR *sp, + VICMD *dp, + VICMD *vp, + VICMD *ismotion, /* Previous key if getting motion component. */ + int *comcountp, + int *mappedp) { enum { COMMANDMODE, ISPARTIAL, NOTPARTIAL } cpart; EVENT ev; @@ -494,7 +492,7 @@ v_cmd(sp, dp, vp, ismotion, comcountp, mappedp) if (ismotion == NULL) cpart = NOTPARTIAL; - /* Pick up optional buffer. */ + /* Pick up an optional buffer. */ if (key == '"') { cpart = ISPARTIAL; if (ismotion != NULL) { @@ -508,10 +506,10 @@ v_cmd(sp, dp, vp, ismotion, comcountp, mappedp) } /* - * Pick up optional count, where a leading 0 is not a count, + * Pick up an optional count, where a leading 0 is not a count, * it's a command. */ - if (isdigit(key) && key != '0') { + if (ISDIGIT(key) && key != '0') { if (v_count(sp, key, &vp->count)) return (GC_ERR); F_SET(vp, VC_C1SET); @@ -650,7 +648,7 @@ v_cmd(sp, dp, vp, ismotion, comcountp, mappedp) * Don't set the EC_MAPCOMMAND flag, apparently ] is a popular * vi meta-character, and we don't want the user to wait while * we time out a possible mapping. This *appears* to match - * historic vi practice, but with mapping characters, you Just + * historic vi practice, but with mapping characters, You Just * Never Know. */ KEY(key, 0); @@ -669,7 +667,7 @@ usage: if (ismotion == NULL) /* Special case: 'z' command. */ if (vp->key == 'z') { KEY(vp->character, 0); - if (isdigit(vp->character)) { + if (ISDIGIT(vp->character)) { if (v_count(sp, vp->character, &vp->count2)) return (GC_ERR); F_SET(vp, VC_C2SET); @@ -678,8 +676,8 @@ usage: if (ismotion == NULL) } /* - * Commands that have motion components can be doubled to - * imply the current line. + * Commands that have motion components can be doubled to imply the + * current line. */ if (ismotion != NULL && ismotion->key != key && !LF_ISSET(V_MOVE)) { msgq(sp, M_ERR, "210|%s may not be used as a motion command", @@ -687,12 +685,12 @@ usage: if (ismotion == NULL) return (GC_ERR); } - /* Required character. */ + /* Pick up required trailing character. */ if (LF_ISSET(V_CHAR)) KEY(vp->character, 0); /* Get any associated cursor word. */ - if (F_ISSET(kp, V_KEYW) && v_keyword(sp)) + if (F_ISSET(kp, V_KEYW) && v_curword(sp)) return (GC_ERR); return (GC_OK); @@ -716,10 +714,11 @@ esc: switch (cpart) { * Get resulting motion mark. */ static int -v_motion(sp, dm, vp, mappedp) - SCR *sp; - VICMD *dm, *vp; - int *mappedp; +v_motion( + SCR *sp, + VICMD *dm, + VICMD *vp, + int *mappedp) { VICMD motion; size_t len; @@ -785,7 +784,7 @@ v_motion(sp, dm, vp, mappedp) vp->m_stop.lno = sp->lno + motion.count - 1; if (db_get(sp, vp->m_stop.lno, 0, NULL, &len)) { if (vp->m_stop.lno != 1 || - vp->key != 'c' && vp->key != '!') { + (vp->key != 'c' && vp->key != '!')) { v_emsg(sp, NULL, VIM_EMPTY); return (1); } @@ -857,7 +856,7 @@ v_motion(sp, dm, vp, mappedp) */ if (!db_exist(sp, vp->m_stop.lno)) { if (vp->m_stop.lno != 1 || - vp->key != 'c' && vp->key != '!') { + (vp->key != 'c' && vp->key != '!')) { v_emsg(sp, NULL, VIM_EMPTY); return (1); } @@ -901,8 +900,8 @@ v_motion(sp, dm, vp, mappedp) * Motions are from the from MARK to the to MARK (inclusive). */ if (motion.m_start.lno > motion.m_stop.lno || - motion.m_start.lno == motion.m_stop.lno && - motion.m_start.cno > motion.m_stop.cno) { + (motion.m_start.lno == motion.m_stop.lno && + motion.m_start.cno > motion.m_stop.cno)) { vp->m_start = motion.m_stop; vp->m_stop = motion.m_start; } else { @@ -929,8 +928,7 @@ v_motion(sp, dm, vp, mappedp) * Initialize the vi screen. */ static int -v_init(sp) - SCR *sp; +v_init(SCR *sp) { GS *gp; VI_PRIVATE *vip; @@ -964,12 +962,12 @@ v_init(sp) sp->t_minrows = sp->t_rows = sp->rows - 1; msgq(sp, M_INFO, "214|Windows option value is too large, max is %u", - sp->t_rows); + (u_int)sp->t_rows); } sp->t_maxrows = sp->rows - 1; } else sp->t_maxrows = 1; - sp->woff = 0; + sp->roff = sp->coff = 0; /* Create a screen map. */ CALLOC_RET(sp, HMAP, SMAP *, SIZE_HMAP(sp), sizeof(SMAP)); @@ -1000,8 +998,7 @@ v_init(sp) * Move all but the current screen to the hidden queue. */ static void -v_dtoh(sp) - SCR *sp; +v_dtoh(SCR *sp) { GS *gp; SCR *tsp; @@ -1009,42 +1006,40 @@ v_dtoh(sp) /* Move all screens to the hidden queue, tossing screen maps. */ for (hidden = 0, gp = sp->gp; - (tsp = gp->dq.cqh_first) != (void *)&gp->dq; ++hidden) { + (tsp = TAILQ_FIRST(gp->dq)) != NULL; ++hidden) { if (_HMAP(tsp) != NULL) { free(_HMAP(tsp)); _HMAP(tsp) = NULL; } - CIRCLEQ_REMOVE(&gp->dq, tsp, q); - CIRCLEQ_INSERT_TAIL(&gp->hq, tsp, q); + TAILQ_REMOVE(gp->dq, tsp, q); + TAILQ_INSERT_TAIL(gp->hq, tsp, q); + /* XXXX Change if hidden screens per window */ + gp->scr_discard(tsp, NULL); } /* Move current screen back to the display queue. */ - CIRCLEQ_REMOVE(&gp->hq, sp, q); - CIRCLEQ_INSERT_TAIL(&gp->dq, sp, q); + TAILQ_REMOVE(gp->hq, sp, q); + TAILQ_INSERT_TAIL(gp->dq, sp, q); - /* - * XXX - * Don't bother internationalizing this message, it's going to - * go away as soon as we have one-line screens. --TK - */ if (hidden > 1) msgq(sp, M_INFO, - "%d screens backgrounded; use :display to list them", + "319|%d screens backgrounded; use :display to list them", hidden - 1); } /* - * v_keyword -- - * Get the word (or non-word) the cursor is on. + * v_curword -- + * Get the word (tagstring, actually) the cursor is on. + * + * PUBLIC: int v_curword __P((SCR *)); */ -static int -v_keyword(sp) - SCR *sp; +int +v_curword(SCR *sp) { VI_PRIVATE *vip; size_t beg, end, len; - int moved, state; - char *p; + int moved; + CHAR_T *p; if (db_get(sp, sp->lno, DBG_FATAL, &p, &len)) return (1); @@ -1065,7 +1060,7 @@ v_keyword(sp) * follow the same rule. */ for (moved = 0, - beg = sp->cno; beg < len && isspace(p[beg]); moved = 1, ++beg); + beg = sp->cno; beg < len && ISSPACE(p[beg]); moved = 1, ++beg); if (beg >= len) { msgq(sp, M_BERR, "212|Cursor not in a word"); return (1); @@ -1075,14 +1070,19 @@ v_keyword(sp) (void)vs_refresh(sp, 0); } - /* Find the end of the word. */ - for (state = inword(p[beg]), - end = beg; ++end < len && state == inword(p[end]);); + /* + * Find the end of the word. + * + * !!! + * Historically, vi accepted any non-blank as initial character + * when building up a tagstring. Required by IEEE 1003.1-2001. + */ + for (end = beg; ++end < len && inword(p[end]);); vip = VIP(sp); - len = (end - beg); - BINC_RET(sp, vip->keyw, vip->klen, len); - memmove(vip->keyw, p + beg, len); + vip->klen = len = (end - beg); + BINC_RETW(sp, vip->keyw, vip->keywlen, len+1); + MEMMOVE(vip->keyw, p + beg, len); vip->keyw[len] = '\0'; /* XXX */ return (0); } @@ -1092,10 +1092,10 @@ v_keyword(sp) * Check for a command alias. */ static VIKEYS const * -v_alias(sp, vp, kp) - SCR *sp; - VICMD *vp; - VIKEYS const *kp; +v_alias( + SCR *sp, + VICMD *vp, + VIKEYS const *kp) { CHAR_T push; @@ -1128,10 +1128,10 @@ v_alias(sp, vp, kp) * Return the next count. */ static int -v_count(sp, fkey, countp) - SCR *sp; - ARG_CHAR_T fkey; - u_long *countp; +v_count( + SCR *sp, + ARG_CHAR_T fkey, + u_long *countp) { EVENT ev; u_long count, tc; @@ -1150,7 +1150,7 @@ v_count(sp, fkey, countp) if (v_key(sp, 0, &ev, EC_MAPCOMMAND | EC_MAPNODIGIT) != GC_OK) return (1); - } while (isdigit(ev.e_c)); + } while (ISDIGIT(ev.e_c)); msgq(sp, M_ERR, "235|Number larger than %lu", ULONG_MAX); return (1); @@ -1158,7 +1158,7 @@ v_count(sp, fkey, countp) count = tc; if (v_key(sp, 0, &ev, EC_MAPCOMMAND | EC_MAPNODIGIT) != GC_OK) return (1); - } while (isdigit(ev.e_c)); + } while (ISDIGIT(ev.e_c)); *countp = count; return (0); } @@ -1168,11 +1168,11 @@ v_count(sp, fkey, countp) * Return the next event. */ static gcret_t -v_key(sp, command_events, evp, ec_flags) - SCR *sp; - int command_events; - EVENT *evp; - u_int32_t ec_flags; +v_key( + SCR *sp, + int command_events, + EVENT *evp, + u_int32_t ec_flags) { u_int32_t quote; @@ -1216,10 +1216,6 @@ v_key(sp, command_events, evp, ec_flags) break; case E_WRESIZE: return (GC_ERR); - case E_QUIT: - case E_WRITE: - if (command_events) - return (GC_EVENT); /* FALLTHROUGH */ default: v_event_err(sp, evp); @@ -1235,13 +1231,13 @@ v_key(sp, command_events, evp, ec_flags) * Log the contents of the command structure. */ static void -v_comlog(sp, vp) - SCR *sp; - VICMD *vp; +v_comlog( + SCR *sp, + VICMD *vp) { - TRACE(sp, "vcmd: %c", vp->key); + TRACE(sp, "vcmd: "WC, vp->key); if (F_ISSET(vp, VC_BUFFER)) - TRACE(sp, " buffer: %c", vp->buffer); + TRACE(sp, " buffer: "WC, vp->buffer); if (F_ISSET(vp, VC_C1SET)) TRACE(sp, " c1: %lu", vp->count); if (F_ISSET(vp, VC_C2SET)) diff --git a/vi/vi.h b/vi/vi.h index bede3a651817..2cfbb999ab93 100644 --- a/vi/vi.h +++ b/vi/vi.h @@ -6,11 +6,11 @@ * * See the LICENSE file for redistribution information. * - * @(#)vi.h 10.19 (Berkeley) 6/30/96 + * $Id: vi.h,v 10.29 2012/02/11 00:33:46 zy Exp $ */ /* Definition of a vi "word". */ -#define inword(ch) (isalnum(ch) || (ch) == '_') +#define inword(ch) ((ch) == '_' || (ISGRAPH(ch) && !ISPUNCT(ch))) typedef struct _vikeys VIKEYS; @@ -188,23 +188,24 @@ int cs_prev __P((SCR *, VCS *)); * slot for the colon command line, so there is room to add any screen into * another one at screen exit. * - * Lno is the line number. If doing the historic vi long line folding, off + * Lno is the line number. If doing the historic vi long line folding, soff * is the screen offset into the line. For example, the pair 2:1 would be * the first screen of line 2, and 2:2 would be the second. In the case of * long lines, the screen map will tend to be staggered, e.g., 1:1, 1:2, 1:3, - * 2:1, 3:1, etc. If doing left-right scrolling, the off field is the screen + * 2:1, 3:1, etc. If doing left-right scrolling, the coff field is the screen * column offset into the lines, and can take on any value, as it's adjusted * by the user set value O_SIDESCROLL. */ typedef struct _smap { - recno_t lno; /* 1-N: Physical file line number. */ + recno_t lno; /* 1-N: Physical file line number. */ size_t coff; /* 0-N: Column offset in the line. */ size_t soff; /* 1-N: Screen offset in the line. */ /* vs_line() cache information. */ - size_t c_sboff; /* 0-N: offset of first character byte. */ - size_t c_eboff; /* 0-N: offset of last character byte. */ + size_t c_sboff; /* 0-N: offset of first character on screen. */ + size_t c_eboff; /* 0-N: offset of last character on screen. */ u_int8_t c_scoff; /* 0-N: offset into the first character. */ + /* 255: no character of line visible. */ u_int8_t c_eclen; /* 1-N: columns from the last character. */ u_int8_t c_ecsize; /* 1-N: size of the last character. */ } SMAP; @@ -253,8 +254,11 @@ typedef struct _vi_private { size_t busy_fx; /* Busy character x coordinate. */ size_t busy_oldy; /* Saved y coordinate. */ size_t busy_oldx; /* Saved x coordinate. */ - struct timeval busy_tv; /* Busy timer. */ + struct timespec busy_ts;/* Busy timer. */ + MARK sel; /* Select start position. */ + + CHAR_T *mcs; /* Match character list. */ char *ps; /* Paragraph plus section list. */ u_long u_ccnt; /* Undo command count. */ @@ -351,10 +355,15 @@ typedef struct _vi_private { */ #define TAB_OFF(c) COL_OFF((c), O_VAL(sp, O_TABSTOP)) +/* If more than one horizontal screen being shown. */ +#define IS_HSPLIT(sp) \ + ((sp)->rows != O_VAL(sp, O_LINES)) +/* If more than one vertical screen being shown. */ +#define IS_VSPLIT(sp) \ + ((sp)->cols != O_VAL(sp, O_COLUMNS)) /* If more than one screen being shown. */ #define IS_SPLIT(sp) \ - ((sp)->q.cqe_next != (void *)&(sp)->gp->dq || \ - (sp)->q.cqe_prev != (void *)&(sp)->gp->dq) + (IS_HSPLIT(sp) || IS_VSPLIT(sp)) /* Screen adjustment operations. */ typedef enum { A_DECREASE, A_INCREASE, A_SET } adj_t; @@ -374,4 +383,4 @@ typedef enum { VIM_NOCOM, VIM_NOCOM_B, VIM_USAGE, VIM_WRESIZE } vim_t; -#include "vi_extern.h" +#include "extern.h" diff --git a/vi/vs_line.c b/vi/vs_line.c index 2e5166227b35..dc12a3ad11fd 100644 --- a/vi/vs_line.c +++ b/vi/vs_line.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)vs_line.c 10.19 (Berkeley) 9/26/96"; +static const char sccsid[] = "$Id: vs_line.c,v 10.40 2012/02/13 19:22:25 zy Exp $"; #endif /* not lint */ #include @@ -38,20 +38,19 @@ static const char sccsid[] = "@(#)vs_line.c 10.19 (Berkeley) 9/26/96"; * PUBLIC: int vs_line __P((SCR *, SMAP *, size_t *, size_t *)); */ int -vs_line(sp, smp, yp, xp) - SCR *sp; - SMAP *smp; - size_t *xp, *yp; +vs_line(SCR *sp, SMAP *smp, size_t *yp, size_t *xp) { - CHAR_T *kp; + u_char *kp; GS *gp; SMAP *tsmp; - size_t chlen, cno_cnt, cols_per_screen, len, nlen; + size_t chlen = 0, cno_cnt, cols_per_screen, len, nlen; size_t offset_in_char, offset_in_line, oldx, oldy; size_t scno, skip_cols, skip_screens; - int ch, dne, is_cached, is_partial, is_tab, no_draw; + int dne, is_cached, is_partial, is_tab, no_draw; int list_tab, list_dollar; - char *p, *cbp, *ecbp, cbuf[128]; + CHAR_T *p; + CHAR_T *cbp, *ecbp, cbuf[128]; + ARG_CHAR_T ch = '\0'; #if defined(DEBUG) && 0 TRACE(sp, "vs_line: row %u: line: %u off: %u\n", @@ -139,9 +138,9 @@ vs_line(sp, smp, yp, xp) if (O_ISSET(sp, O_NUMBER)) { cols_per_screen -= O_NUMBER_LENGTH; if ((!dne || smp->lno == 1) && skip_cols == 0) { - nlen = snprintf(cbuf, - sizeof(cbuf), O_NUMBER_FMT, smp->lno); - (void)gp->scr_addstr(sp, cbuf, nlen); + nlen = snprintf((char*)cbuf, + sizeof(cbuf), O_NUMBER_FMT, (u_long)smp->lno); + (void)gp->scr_addstr(sp, (char*)cbuf, nlen); } } } @@ -193,6 +192,12 @@ empty: (void)gp->scr_addstr(sp, return (0); } + /* If we shortened this line in another screen, the cursor + * position may have fallen off. + */ + if (sp->lno == smp->lno && sp->cno >= len) + sp->cno = len - 1; + /* * If we just wrote this or a previous line, we cached the starting * and ending positions of that line. The way it works is we keep @@ -258,8 +263,8 @@ empty: (void)gp->scr_addstr(sp, /* Do it the hard way, for leftright scrolling screens. */ if (O_ISSET(sp, O_LEFTRIGHT)) { for (; offset_in_line < len; ++offset_in_line) { - chlen = (ch = *(u_char *)p++) == '\t' && !list_tab ? - TAB_OFF(scno) : KEY_LEN(sp, ch); + chlen = (ch = *p++) == '\t' && !list_tab ? + TAB_OFF(scno) : KEY_COL(sp, ch); if ((scno += chlen) >= skip_cols) break; } @@ -285,8 +290,8 @@ empty: (void)gp->scr_addstr(sp, /* Do it the hard way, for historic line-folding screens. */ else { for (; offset_in_line < len; ++offset_in_line) { - chlen = (ch = *(u_char *)p++) == '\t' && !list_tab ? - TAB_OFF(scno) : KEY_LEN(sp, ch); + chlen = (ch = *p++) == '\t' && !list_tab ? + TAB_OFF(scno) : KEY_COL(sp, ch); if ((scno += chlen) < cols_per_screen) continue; scno -= cols_per_screen; @@ -332,14 +337,14 @@ empty: (void)gp->scr_addstr(sp, cno_cnt = (sp->cno - offset_in_line) + 1; /* This is the loop that actually displays characters. */ - ecbp = (cbp = cbuf) + sizeof(cbuf) - 1; + ecbp = (cbp = cbuf) + SIZE(cbuf) - 1; for (is_partial = 0, scno = 0; offset_in_line < len; ++offset_in_line, offset_in_char = 0) { - if ((ch = *(u_char *)p++) == '\t' && !list_tab) { + if ((ch = *p++) == '\t' && !list_tab) { scno += chlen = TAB_OFF(scno) - offset_in_char; is_tab = 1; } else { - scno += chlen = KEY_LEN(sp, ch) - offset_in_char; + scno += chlen = KEY_COL(sp, ch) - offset_in_char; is_tab = 0; } @@ -382,7 +387,10 @@ empty: (void)gp->scr_addstr(sp, --cno_cnt == 0 && (F_ISSET(sp, SC_TINPUT) || !is_partial)) { *yp = smp - HMAP; if (F_ISSET(sp, SC_TINPUT)) - *xp = scno - chlen; + if (is_partial) + *xp = scno - smp->c_ecsize; + else + *xp = scno - chlen; else *xp = scno - 1; if (O_ISSET(sp, O_NUMBER) && @@ -400,7 +408,7 @@ empty: (void)gp->scr_addstr(sp, #define FLUSH { \ *cbp = '\0'; \ - (void)gp->scr_addstr(sp, cbuf, cbp - cbuf); \ + (void)gp->scr_waddstr(sp, cbuf, cbp - cbuf); \ cbp = cbuf; \ } /* @@ -419,14 +427,26 @@ empty: (void)gp->scr_addstr(sp, else { if (cbp + chlen >= ecbp) FLUSH; - for (kp = KEY_NAME(sp, ch) + offset_in_char; chlen--;) - *cbp++ = *kp++; + + /* don't display half a wide character */ + if (is_partial && CHAR_WIDTH(sp, ch) > 1) { + *cbp++ = ' '; + break; + } + + if (KEY_NEEDSWIDE(sp, ch)) + *cbp++ = ch; + else + for (kp = (u_char *) + KEY_NAME(sp, ch) + offset_in_char; + chlen--;) + *cbp++ = *kp++; } } if (scno < cols_per_screen) { /* If didn't paint the whole line, update the cache. */ - smp->c_ecsize = smp->c_eclen = KEY_LEN(sp, ch); + smp->c_ecsize = smp->c_eclen = KEY_COL(sp, ch); smp->c_eboff = len - 1; /* @@ -440,7 +460,8 @@ empty: (void)gp->scr_addstr(sp, chlen = KEY_LEN(sp, '$'); if (cbp + chlen >= ecbp) FLUSH; - for (kp = KEY_NAME(sp, '$'); chlen--;) + for (kp = (u_char *) + KEY_NAME(sp, '$'); chlen--;) *cbp++ = *kp++; } @@ -464,8 +485,7 @@ ret1: (void)gp->scr_move(sp, oldy, oldx); * PUBLIC: int vs_number __P((SCR *)); */ int -vs_number(sp) - SCR *sp; +vs_number(SCR *sp) { GS *gp; SMAP *smp; @@ -510,7 +530,7 @@ vs_number(sp) break; (void)gp->scr_move(sp, smp - HMAP, 0); - len = snprintf(nbuf, sizeof(nbuf), O_NUMBER_FMT, smp->lno); + len = snprintf(nbuf, sizeof(nbuf), O_NUMBER_FMT, (u_long)smp->lno); (void)gp->scr_addstr(sp, nbuf, len); } (void)gp->scr_move(sp, oldy, oldx); diff --git a/vi/vs_msg.c b/vi/vs_msg.c index 7ef8f5343c15..32b2755c1722 100644 --- a/vi/vs_msg.c +++ b/vi/vs_msg.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)vs_msg.c 10.77 (Berkeley) 10/13/96"; +static const char sccsid[] = "$Id: vs_msg.c,v 10.88 2013/03/19 09:59:03 zy Exp $"; #endif /* not lint */ #include @@ -56,15 +56,13 @@ static void vs_wait __P((SCR *, int *, sw_t)); * PUBLIC: void vs_busy __P((SCR *, const char *, busy_t)); */ void -vs_busy(sp, msg, btype) - SCR *sp; - const char *msg; - busy_t btype; +vs_busy(SCR *sp, const char *msg, busy_t btype) { GS *gp; VI_PRIVATE *vip; static const char flagc[] = "|/-\\"; - struct timeval tv; + struct timespec ts, ts_diff; + const struct timespec ts_min = { 0, 125000000 }; size_t len, notused; const char *p; @@ -89,7 +87,7 @@ vs_busy(sp, msg, btype) /* Initialize state for updates. */ vip->busy_ch = 0; - (void)gettimeofday(&vip->busy_tv, NULL); + timepoint_steady(&vip->busy_ts); /* Save the current cursor. */ (void)gp->scr_cursor(sp, &vip->busy_oldy, &vip->busy_oldx); @@ -122,11 +120,12 @@ vs_busy(sp, msg, btype) break; /* Update no more than every 1/8 of a second. */ - (void)gettimeofday(&tv, NULL); - if (((tv.tv_sec - vip->busy_tv.tv_sec) * 1000000 + - (tv.tv_usec - vip->busy_tv.tv_usec)) < 125000) + timepoint_steady(&ts); + ts_diff = ts; + timespecsub(&ts_diff, &vip->busy_ts); + if (timespeccmp(&ts_diff, &ts_min, <)) return; - vip->busy_tv = tv; + vip->busy_ts = ts; /* Display the update. */ if (vip->busy_ch == sizeof(flagc) - 1) @@ -146,8 +145,7 @@ vs_busy(sp, msg, btype) * PUBLIC: void vs_home __P((SCR *)); */ void -vs_home(sp) - SCR *sp; +vs_home(SCR *sp) { (void)sp->gp->scr_move(sp, LASTLINE(sp), 0); (void)sp->gp->scr_refresh(sp, 0); @@ -157,15 +155,15 @@ vs_home(sp) * vs_update -- * Update a command. * - * PUBLIC: void vs_update __P((SCR *, const char *, const char *)); + * PUBLIC: void vs_update __P((SCR *, const char *, const CHAR_T *)); */ void -vs_update(sp, m1, m2) - SCR *sp; - const char *m1, *m2; +vs_update(SCR *sp, const char *m1, const CHAR_T *m2) { GS *gp; size_t len, mlen, oldx, oldy; + CONST char *np; + size_t nlen; gp = sp->gp; @@ -178,8 +176,10 @@ vs_update(sp, m1, m2) * expanded, and by the ex substitution confirmation prompt. */ if (F_ISSET(sp, SC_SCR_EXWROTE)) { + if (m2 != NULL) + INT2CHAR(sp, m2, STRLEN(m2) + 1, np, nlen); (void)ex_printf(sp, - "%s\n", m1 == NULL? "" : m1, m2 == NULL ? "" : m2); + "%s\n", m1 == NULL? "" : m1, m2 == NULL ? "" : np); (void)ex_fflush(sp); } @@ -205,10 +205,10 @@ vs_update(sp, m1, m2) } else len = 0; if (m2 != NULL) { - mlen = strlen(m2); + mlen = STRLEN(m2); if (len + mlen > sp->cols - 2) mlen = (sp->cols - 2) - len; - (void)gp->scr_addstr(sp, m2, mlen); + (void)gp->scr_waddstr(sp, m2, mlen); } (void)gp->scr_move(sp, oldy, oldx); @@ -228,11 +228,7 @@ vs_update(sp, m1, m2) * PUBLIC: void vs_msg __P((SCR *, mtype_t, char *, size_t)); */ void -vs_msg(sp, mtype, line, len) - SCR *sp; - mtype_t mtype; - char *line; - size_t len; +vs_msg(SCR *sp, mtype_t mtype, char *line, size_t len) { GS *gp; VI_PRIVATE *vip; @@ -394,17 +390,12 @@ ret: (void)gp->scr_move(sp, oldy, oldx); * Output the text to the screen. */ static void -vs_output(sp, mtype, line, llen) - SCR *sp; - mtype_t mtype; - const char *line; - int llen; +vs_output(SCR *sp, mtype_t mtype, const char *line, int llen) { - CHAR_T *kp; GS *gp; VI_PRIVATE *vip; - size_t chlen, notused; - int ch, len, rlen, tlen; + size_t notused; + int len, rlen, tlen; const char *p, *t; char *cbp, *ecbp, cbuf[128]; @@ -472,7 +463,6 @@ vs_output(sp, mtype, line, llen) } ecbp = (cbp = cbuf) + sizeof(cbuf) - 1; for (t = line, tlen = len; tlen--; ++t) { - ch = *t; /* * Replace tabs with spaces, there are places in * ex that do column calculations without looking @@ -480,13 +470,9 @@ vs_output(sp, mtype, line, llen) * do their own expansions. This catches * in things like tag search strings. */ - if (ch == '\t') - ch = ' '; - chlen = KEY_LEN(sp, ch); - if (cbp + chlen >= ecbp) + if (cbp + 1 >= ecbp) FLUSH; - for (kp = KEY_NAME(sp, ch); chlen--;) - *cbp++ = *kp++; + *cbp++ = *t == '\t' ? ' ' : *t; } if (cbp > cbuf) FLUSH; @@ -523,9 +509,7 @@ vs_output(sp, mtype, line, llen) * PUBLIC: int vs_ex_resolve __P((SCR *, int *)); */ int -vs_ex_resolve(sp, continuep) - SCR *sp; - int *continuep; +vs_ex_resolve(SCR *sp, int *continuep) { EVENT ev; GS *gp; @@ -598,7 +582,7 @@ vs_ex_resolve(sp, continuep) * If we're not the bottom of the split screen stack, the screen * image itself is wrong, so redraw everything. */ - if (sp->q.cqe_next != (void *)&sp->gp->dq) + if (TAILQ_NEXT(sp, q) != NULL) F_SET(sp, SC_SCR_REDRAW); /* If ex changed the underlying file, the map itself is wrong. */ @@ -649,9 +633,7 @@ vs_ex_resolve(sp, continuep) * PUBLIC: int vs_resolve __P((SCR *, SCR *, int)); */ int -vs_resolve(sp, csp, forcewait) - SCR *sp, *csp; - int forcewait; +vs_resolve(SCR *sp, SCR *csp, int forcewait) { EVENT ev; GS *gp; @@ -696,12 +678,12 @@ vs_resolve(sp, csp, forcewait) * messages.) Once this is done, don't trust the cursor. That * extra refresh screwed the pooch. */ - if (gp->msgq.lh_first != NULL) { + if (!SLIST_EMPTY(gp->msgq)) { if (!F_ISSET(sp, SC_SCR_VI) && vs_refresh(sp, 1)) return (1); - while ((mp = gp->msgq.lh_first) != NULL) { + while ((mp = SLIST_FIRST(gp->msgq)) != NULL) { gp->scr_msg(sp, mp->mtype, mp->buf, mp->len); - LIST_REMOVE(mp, q); + SLIST_REMOVE_HEAD(gp->msgq, q); free(mp->buf); free(mp); } @@ -758,10 +740,7 @@ vs_resolve(sp, csp, forcewait) * Scroll the screen for output. */ static void -vs_scroll(sp, continuep, wtype) - SCR *sp; - int *continuep; - sw_t wtype; +vs_scroll(SCR *sp, int *continuep, sw_t wtype) { GS *gp; VI_PRIVATE *vip; @@ -779,7 +758,7 @@ vs_scroll(sp, continuep, wtype) (void)gp->scr_deleteln(sp); /* If there are screens below us, push them back into place. */ - if (sp->q.cqe_next != (void *)&sp->gp->dq) { + if (TAILQ_NEXT(sp, q) != NULL) { (void)gp->scr_move(sp, LASTLINE(sp), 0); (void)gp->scr_insertln(sp); } @@ -794,10 +773,7 @@ vs_scroll(sp, continuep, wtype) * Prompt the user to continue. */ static void -vs_wait(sp, continuep, wtype) - SCR *sp; - int *continuep; - sw_t wtype; +vs_wait(SCR *sp, int *continuep, sw_t wtype) { EVENT ev; VI_PRIVATE *vip; @@ -868,8 +844,7 @@ vs_wait(sp, continuep, wtype) * Draw a dividing line between the screen and the output. */ static void -vs_divider(sp) - SCR *sp; +vs_divider(SCR *sp) { GS *gp; size_t len; @@ -888,11 +863,7 @@ vs_divider(sp) * Save a message for later display. */ static void -vs_msgsave(sp, mt, p, len) - SCR *sp; - mtype_t mt; - char *p; - size_t len; +vs_msgsave(SCR *sp, mtype_t mt, char *p, size_t len) { GS *gp; MSGS *mp_c, *mp_n; @@ -912,11 +883,13 @@ vs_msgsave(sp, mt, p, len) mp_n->mtype = mt; gp = sp->gp; - if ((mp_c = gp->msgq.lh_first) == NULL) { - LIST_INSERT_HEAD(&gp->msgq, mp_n, q); + if (SLIST_EMPTY(gp->msgq)) { + SLIST_INSERT_HEAD(gp->msgq, mp_n, q); } else { - for (; mp_c->q.le_next != NULL; mp_c = mp_c->q.le_next); - LIST_INSERT_AFTER(mp_c, mp_n, q); + SLIST_FOREACH(mp_c, gp->msgq, q) + if (SLIST_NEXT(mp_c, q) == NULL) + break; + SLIST_INSERT_AFTER(mp_c, mp_n, q); } return; diff --git a/vi/vs_refresh.c b/vi/vs_refresh.c index 81587608c1a2..98b66c492d1f 100644 --- a/vi/vs_refresh.c +++ b/vi/vs_refresh.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)vs_refresh.c 10.44 (Berkeley) 10/13/96"; +static const char sccsid[] = "$Id: vs_refresh.c,v 10.52 2011/12/16 11:06:25 zy Exp $"; #endif /* not lint */ #include @@ -40,9 +40,9 @@ static int vs_paint __P((SCR *, u_int)); * PUBLIC: int vs_repaint __P((SCR *, EVENT *)); */ int -vs_repaint(sp, evp) - SCR *sp; - EVENT *evp; +vs_repaint( + SCR *sp, + EVENT *evp) { SMAP *smp; @@ -62,13 +62,13 @@ vs_repaint(sp, evp) * PUBLIC: int vs_refresh __P((SCR *, int)); */ int -vs_refresh(sp, forcepaint) - SCR *sp; - int forcepaint; +vs_refresh( + SCR *sp, + int forcepaint) { GS *gp; SCR *tsp; - int need_refresh; + int need_refresh = 0; u_int priv_paint, pub_paint; gp = sp->gp; @@ -80,8 +80,7 @@ vs_refresh(sp, forcepaint) * that we can find, including status lines. */ if (F_ISSET(sp, SC_SCR_REDRAW)) - for (tsp = gp->dq.cqh_first; - tsp != (void *)&gp->dq; tsp = tsp->q.cqe_next) + TAILQ_FOREACH(tsp, gp->dq, q) if (tsp != sp) F_SET(tsp, SC_SCR_REDRAW | SC_STATUS); @@ -98,8 +97,7 @@ vs_refresh(sp, forcepaint) priv_paint = VIP_CUR_INVALID | VIP_N_REFRESH; if (O_ISSET(sp, O_NUMBER)) priv_paint |= VIP_N_RENUMBER; - for (tsp = gp->dq.cqh_first; - tsp != (void *)&gp->dq; tsp = tsp->q.cqe_next) + TAILQ_FOREACH(tsp, gp->dq, q) if (tsp != sp && !F_ISSET(tsp, SC_EXIT | SC_EXIT_FORCE) && (F_ISSET(tsp, pub_paint) || F_ISSET(VIP(tsp), priv_paint))) { @@ -134,8 +132,7 @@ vs_refresh(sp, forcepaint) * And, finally, if we updated any status lines, make sure the cursor * gets back to where it belongs. */ - for (need_refresh = 0, tsp = gp->dq.cqh_first; - tsp != (void *)&gp->dq; tsp = tsp->q.cqe_next) + TAILQ_FOREACH(tsp, gp->dq, q) if (F_ISSET(tsp, SC_STATUS)) { need_refresh = 1; vs_resolve(tsp, sp, 0); @@ -162,17 +159,17 @@ vs_refresh(sp, forcepaint) * what you're doing. It's subtle and quick to anger. */ static int -vs_paint(sp, flags) - SCR *sp; - u_int flags; +vs_paint( + SCR *sp, + u_int flags) { GS *gp; SMAP *smp, tmp; VI_PRIVATE *vip; recno_t lastline, lcnt; size_t cwtotal, cnt, len, notused, off, y; - int ch, didpaint, isempty, leftright_warp; - char *p; + int ch = 0, didpaint, isempty, leftright_warp; + CHAR_T *p; #define LNO sp->lno /* Current file line. */ #define OLNO vip->olno /* Remembered file line. */ @@ -470,7 +467,7 @@ adjust: if (!O_ISSET(sp, O_LEFTRIGHT) && #ifdef DEBUG /* Sanity checking. */ if (CNO >= len && len != 0) { - msgq(sp, M_ERR, "Error: %s/%d: cno (%u) >= len (%u)", + msgq(sp, M_ERR, "Error: %s/%d: cno (%zu) >= len (%zu)", tail(__FILE__), __LINE__, CNO, len); return (1); } @@ -507,8 +504,8 @@ adjust: if (!O_ISSET(sp, O_LEFTRIGHT) && * Count up the widths of the characters. If it's a tab * character, go do it the the slow way. */ - for (cwtotal = 0; cnt--; cwtotal += KEY_LEN(sp, ch)) - if ((ch = *(u_char *)p--) == '\t') + for (cwtotal = 0; cnt--; cwtotal += KEY_COL(sp, ch)) + if ((ch = *(UCHAR_T *)p--) == '\t') goto slow; /* @@ -521,8 +518,8 @@ adjust: if (!O_ISSET(sp, O_LEFTRIGHT) && * If we're moving left, and there's a wide character in the * current position, go to the end of the character. */ - if (KEY_LEN(sp, ch) > 1) - cwtotal -= KEY_LEN(sp, ch) - 1; + if (KEY_COL(sp, ch) > 1) + cwtotal -= KEY_COL(sp, ch) - 1; /* * If the new column moved us off of the current logical line, @@ -547,9 +544,9 @@ adjust: if (!O_ISSET(sp, O_LEFTRIGHT) && * screen boundary, we can quit. */ for (cwtotal = SCNO; cnt--;) { - if ((ch = *(u_char *)p++) == '\t') + if ((ch = *(UCHAR_T *)p++) == '\t') goto slow; - if ((cwtotal += KEY_LEN(sp, ch)) >= SCREEN_COLS(sp)) + if ((cwtotal += KEY_COL(sp, ch)) >= SCREEN_COLS(sp)) break; } @@ -595,7 +592,7 @@ slow: for (smp = HMAP; smp->lno != LNO; ++smp); * for the number option offset. */ cnt = vs_columns(sp, NULL, LNO, &CNO, NULL); - if (O_ISSET(sp, O_NUMBER)) + if (O_ISSET(sp, O_NUMBER) && cnt >= O_NUMBER_LENGTH) cnt -= O_NUMBER_LENGTH; /* Adjust the window towards the beginning of the line. */ @@ -613,8 +610,8 @@ slow: for (smp = HMAP; smp->lno != LNO; ++smp); } /* Adjust the window towards the end of the line. */ - if (off == 0 && off + SCREEN_COLS(sp) < cnt || - off != 0 && off + sp->cols < cnt) { + if ((off == 0 && off + SCREEN_COLS(sp) < cnt) || + (off != 0 && off + sp->cols < cnt)) { do { off += O_VAL(sp, O_SIDESCROLL); } while (off + sp->cols < cnt); @@ -763,8 +760,7 @@ number: if (O_ISSET(sp, O_NUMBER) && * Update the mode line. */ static void -vs_modeline(sp) - SCR *sp; +vs_modeline(SCR *sp) { static char * const modes[] = { "215|Append", /* SM_APPEND */ @@ -775,9 +771,9 @@ vs_modeline(sp) }; GS *gp; size_t cols, curcol, curlen, endpoint, len, midpoint; - const char *t; + const char *t = NULL; int ellipsis; - char *p, buf[20]; + char buf[20]; gp = sp->gp; @@ -799,19 +795,23 @@ vs_modeline(sp) /* If more than one screen in the display, show the file name. */ curlen = 0; if (IS_SPLIT(sp)) { - for (p = sp->frp->name; *p != '\0'; ++p); - for (ellipsis = 0, cols = sp->cols / 2; --p > sp->frp->name;) { + CHAR_T *wp, *p; + size_t l; + + CHAR2INT(sp, sp->frp->name, strlen(sp->frp->name) + 1, wp, l); + p = wp + l; + for (ellipsis = 0, cols = sp->cols / 2; --p > wp;) { if (*p == '/') { ++p; break; } - if ((curlen += KEY_LEN(sp, *p)) > cols) { + if ((curlen += KEY_COL(sp, *p)) > cols) { ellipsis = 3; curlen += KEY_LEN(sp, '.') * 3 + KEY_LEN(sp, ' '); while (curlen > cols) { ++p; - curlen -= KEY_LEN(sp, *p); + curlen -= KEY_COL(sp, *p); } break; } @@ -825,7 +825,7 @@ vs_modeline(sp) } for (; *p != '\0'; ++p) (void)gp->scr_addstr(sp, - KEY_NAME(sp, *p), KEY_LEN(sp, *p)); + KEY_NAME(sp, *p), KEY_COL(sp, *p)); } /* Clear the rest of the line. */ @@ -845,8 +845,8 @@ vs_modeline(sp) cols = sp->cols - 1; if (O_ISSET(sp, O_RULER)) { vs_column(sp, &curcol); - len = - snprintf(buf, sizeof(buf), "%lu,%lu", sp->lno, curcol + 1); + len = snprintf(buf, sizeof(buf), "%lu,%lu", + (u_long)sp->lno, (u_long)(curcol + 1)); midpoint = (cols - ((len + 1) / 2)) / 2; if (curlen < midpoint) { diff --git a/vi/vs_relative.c b/vi/vs_relative.c index 878fc4f944ad..5f25b51d9342 100644 --- a/vi/vs_relative.c +++ b/vi/vs_relative.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)vs_relative.c 10.11 (Berkeley) 5/13/96"; +static const char sccsid[] = "$Id: vs_relative.c,v 10.19 2011/12/01 15:22:59 zy Exp $"; #endif /* not lint */ #include @@ -32,9 +32,7 @@ static const char sccsid[] = "@(#)vs_relative.c 10.11 (Berkeley) 5/13/96"; * PUBLIC: int vs_column __P((SCR *, size_t *)); */ int -vs_column(sp, colp) - SCR *sp; - size_t *colp; +vs_column(SCR *sp, size_t *colp) { VI_PRIVATE *vip; @@ -55,10 +53,7 @@ vs_column(sp, colp) * PUBLIC: size_t vs_screens __P((SCR *, recno_t, size_t *)); */ size_t -vs_screens(sp, lno, cnop) - SCR *sp; - recno_t lno; - size_t *cnop; +vs_screens(SCR *sp, recno_t lno, size_t *cnop) { size_t cols, screens; @@ -98,18 +93,14 @@ vs_screens(sp, lno, cnop) * Return the screen columns necessary to display the line, or, * if specified, the physical character column within the line. * - * PUBLIC: size_t vs_columns __P((SCR *, char *, recno_t, size_t *, size_t *)); + * PUBLIC: size_t vs_columns __P((SCR *, CHAR_T *, recno_t, size_t *, size_t *)); */ size_t -vs_columns(sp, lp, lno, cnop, diffp) - SCR *sp; - char *lp; - recno_t lno; - size_t *cnop, *diffp; +vs_columns(SCR *sp, CHAR_T *lp, recno_t lno, size_t *cnop, size_t *diffp) { - size_t chlen, cno, curoff, last, len, scno; + size_t chlen, cno, curoff, last = 0, len, scno; int ch, leftright, listset; - char *p; + CHAR_T *p; /* * Initialize the screen offset. @@ -142,11 +133,11 @@ done: if (diffp != NULL) /* XXX */ * Initialize the pointer into the buffer and current offset. */ p = lp; - curoff = 0; + curoff = scno; /* Macro to return the display length of any signal character. */ -#define CHLEN(val) (ch = *(u_char *)p++) == '\t' && \ - !listset ? TAB_OFF(val) : KEY_LEN(sp, ch); +#define CHLEN(val) (ch = *(UCHAR_T *)p++) == '\t' && \ + !listset ? TAB_OFF(val) : KEY_COL(sp, ch); /* * If folding screens (the historic vi screen format), past the end @@ -204,10 +195,7 @@ done: if (diffp != NULL) /* XXX */ * PUBLIC: size_t vs_rcm __P((SCR *, recno_t, int)); */ size_t -vs_rcm(sp, lno, islast) - SCR *sp; - recno_t lno; - int islast; +vs_rcm(SCR *sp, recno_t lno, int islast) { size_t len; @@ -233,14 +221,11 @@ vs_rcm(sp, lno, islast) * PUBLIC: size_t vs_colpos __P((SCR *, recno_t, size_t)); */ size_t -vs_colpos(sp, lno, cno) - SCR *sp; - recno_t lno; - size_t cno; +vs_colpos(SCR *sp, recno_t lno, size_t cno) { size_t chlen, curoff, len, llen, off, scno; - int ch, leftright, listset; - char *lp, *p; + int ch = 0, leftright, listset; + CHAR_T *lp, *p; /* Need the line to go any further. */ (void)db_get(sp, lno, 0, &lp, &llen); diff --git a/vi/vs_smap.c b/vi/vs_smap.c index 18d7942b742a..0ab2df9e95bf 100644 --- a/vi/vs_smap.c +++ b/vi/vs_smap.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)vs_smap.c 10.25 (Berkeley) 7/12/96"; +static const char sccsid[] = "$Id: vs_smap.c,v 10.31 2011/02/26 13:56:21 skimo Exp $"; #endif /* not lint */ #include @@ -42,10 +42,7 @@ static int vs_sm_up __P((SCR *, MARK *, recno_t, scroll_t, SMAP *)); * PUBLIC: int vs_change __P((SCR *, recno_t, lnop_t)); */ int -vs_change(sp, lno, op) - SCR *sp; - recno_t lno; - lnop_t op; +vs_change(SCR *sp, recno_t lno, lnop_t op) { VI_PRIVATE *vip; SMAP *p; @@ -64,7 +61,8 @@ vs_change(sp, lno, op) * * Check for line #2 before going to the end of the file. */ - if ((op == LINE_APPEND && lno == 0 || op == LINE_INSERT && lno == 1) && + if (((op == LINE_APPEND && lno == 0) || + (op == LINE_INSERT && lno == 1)) && !db_exist(sp, 2)) { lno = 1; op = LINE_RESET; @@ -138,11 +136,15 @@ vs_change(sp, lno, op) case LINE_DELETE: if (vs_sm_delete(sp, lno)) return (1); + if (sp->lno > lno) + --sp->lno; F_SET(vip, VIP_N_RENUMBER); break; case LINE_INSERT: if (vs_sm_insert(sp, lno)) return (1); + if (sp->lno > lno) + ++sp->lno; F_SET(vip, VIP_N_RENUMBER); break; case LINE_RESET: @@ -172,10 +174,7 @@ vs_change(sp, lno, op) * PUBLIC: int vs_sm_fill __P((SCR *, recno_t, pos_t)); */ int -vs_sm_fill(sp, lno, pos) - SCR *sp; - recno_t lno; - pos_t pos; +vs_sm_fill(SCR *sp, recno_t lno, pos_t pos) { SMAP *p, tmp; size_t cnt; @@ -225,6 +224,16 @@ vs_sm_fill(sp, lno, pos) top: HMAP->lno = lno; HMAP->coff = 0; HMAP->soff = 1; + } else { + /* + * If number of lines HMAP->lno (top line) spans + * changed due to, say reformatting, and now is + * fewer than HMAP->soff, reset so the line is + * redrawn at the top of the screen. + */ + cnt = vs_screens(sp, HMAP->lno, NULL); + if (cnt < HMAP->soff) + HMAP->soff = 1; } /* If we fail, just punt. */ for (p = HMAP, cnt = sp->t_rows; --cnt; ++p) @@ -299,9 +308,7 @@ err: HMAP->lno = 1; * Delete a line out of the SMAP. */ static int -vs_sm_delete(sp, lno) - SCR *sp; - recno_t lno; +vs_sm_delete(SCR *sp, recno_t lno) { SMAP *p, *t; size_t cnt_orig; @@ -349,9 +356,7 @@ vs_sm_delete(sp, lno) * Insert a line into the SMAP. */ static int -vs_sm_insert(sp, lno) - SCR *sp; - recno_t lno; +vs_sm_insert(SCR *sp, recno_t lno) { SMAP *p, *t; size_t cnt_orig, cnt, coff; @@ -405,9 +410,7 @@ vs_sm_insert(sp, lno) * Reset a line in the SMAP. */ static int -vs_sm_reset(sp, lno) - SCR *sp; - recno_t lno; +vs_sm_reset(SCR *sp, recno_t lno) { SMAP *p, *t; size_t cnt_orig, cnt_new, cnt, diff; @@ -512,11 +515,7 @@ vs_sm_reset(sp, lno) * PUBLIC: int vs_sm_scroll __P((SCR *, MARK *, recno_t, scroll_t)); */ int -vs_sm_scroll(sp, rp, count, scmd) - SCR *sp; - MARK *rp; - recno_t count; - scroll_t scmd; +vs_sm_scroll(SCR *sp, MARK *rp, recno_t count, scroll_t scmd) { SMAP *smp; @@ -573,12 +572,7 @@ vs_sm_scroll(sp, rp, count, scmd) * Scroll the SMAP up count logical lines. */ static int -vs_sm_up(sp, rp, count, scmd, smp) - SCR *sp; - MARK *rp; - scroll_t scmd; - recno_t count; - SMAP *smp; +vs_sm_up(SCR *sp, MARK *rp, recno_t count, scroll_t scmd, SMAP *smp) { int cursor_set, echanged, zset; SMAP *ssmp, s1, s2; @@ -754,8 +748,7 @@ vs_sm_up(sp, rp, count, scmd, smp) * PUBLIC: int vs_sm_1up __P((SCR *)); */ int -vs_sm_1up(sp) - SCR *sp; +vs_sm_1up(SCR *sp) { /* * Delete the top line of the screen. Shift the screen map @@ -784,14 +777,19 @@ vs_sm_1up(sp) * line and other screens back. */ static int -vs_deleteln(sp, cnt) - SCR *sp; - int cnt; +vs_deleteln(SCR *sp, int cnt) { GS *gp; size_t oldy, oldx; gp = sp->gp; + + /* If the screen is vertically split, we can't scroll it. */ + if (IS_VSPLIT(sp)) { + F_SET(sp, SC_SCR_REDRAW); + return (0); + } + if (IS_ONELINE(sp)) (void)gp->scr_clrtoeol(sp); else { @@ -811,12 +809,7 @@ vs_deleteln(sp, cnt) * Scroll the SMAP down count logical lines. */ static int -vs_sm_down(sp, rp, count, scmd, smp) - SCR *sp; - MARK *rp; - recno_t count; - SMAP *smp; - scroll_t scmd; +vs_sm_down(SCR *sp, MARK *rp, recno_t count, scroll_t scmd, SMAP *smp) { SMAP *ssmp, s1, s2; int cursor_set, ychanged, zset; @@ -967,8 +960,7 @@ vs_sm_down(sp, rp, count, scmd, smp) * Erase the small screen area for the scrolling functions. */ static int -vs_sm_erase(sp) - SCR *sp; +vs_sm_erase(SCR *sp) { GS *gp; @@ -989,8 +981,7 @@ vs_sm_erase(sp) * PUBLIC: int vs_sm_1down __P((SCR *)); */ int -vs_sm_1down(sp) - SCR *sp; +vs_sm_1down(SCR *sp) { /* * Insert a line at the top of the screen. Shift the screen map @@ -1019,14 +1010,19 @@ vs_sm_1down(sp) * line and other screens back. */ static int -vs_insertln(sp, cnt) - SCR *sp; - int cnt; +vs_insertln(SCR *sp, int cnt) { GS *gp; size_t oldy, oldx; gp = sp->gp; + + /* If the screen is vertically split, we can't scroll it. */ + if (IS_VSPLIT(sp)) { + F_SET(sp, SC_SCR_REDRAW); + return (0); + } + if (IS_ONELINE(sp)) { (void)gp->scr_move(sp, LASTLINE(sp), 0); (void)gp->scr_clrtoeol(sp); @@ -1049,9 +1045,7 @@ vs_insertln(sp, cnt) * PUBLIC: int vs_sm_next __P((SCR *, SMAP *, SMAP *)); */ int -vs_sm_next(sp, p, t) - SCR *sp; - SMAP *p, *t; +vs_sm_next(SCR *sp, SMAP *p, SMAP *t) { size_t lcnt; @@ -1079,9 +1073,7 @@ vs_sm_next(sp, p, t) * PUBLIC: int vs_sm_prev __P((SCR *, SMAP *, SMAP *)); */ int -vs_sm_prev(sp, p, t) - SCR *sp; - SMAP *p, *t; +vs_sm_prev(SCR *sp, SMAP *p, SMAP *t) { SMAP_FLUSH(t); if (O_ISSET(sp, O_LEFTRIGHT)) { @@ -1106,9 +1098,7 @@ vs_sm_prev(sp, p, t) * PUBLIC: int vs_sm_cursor __P((SCR *, SMAP **)); */ int -vs_sm_cursor(sp, smpp) - SCR *sp; - SMAP **smpp; +vs_sm_cursor(SCR *sp, SMAP **smpp) { SMAP *p; @@ -1147,11 +1137,7 @@ vs_sm_cursor(sp, smpp) * PUBLIC: int vs_sm_position __P((SCR *, MARK *, u_long, pos_t)); */ int -vs_sm_position(sp, rp, cnt, pos) - SCR *sp; - MARK *rp; - u_long cnt; - pos_t pos; +vs_sm_position(SCR *sp, MARK *rp, u_long cnt, pos_t pos) { SMAP *smp; recno_t last; @@ -1231,11 +1217,7 @@ eof: msgq(sp, M_BERR, * PUBLIC: recno_t vs_sm_nlines __P((SCR *, SMAP *, recno_t, size_t)); */ recno_t -vs_sm_nlines(sp, from_sp, to_lno, max) - SCR *sp; - SMAP *from_sp; - recno_t to_lno; - size_t max; +vs_sm_nlines(SCR *sp, SMAP *from_sp, recno_t to_lno, size_t max) { recno_t lno, lcnt; diff --git a/vi/vs_split.c b/vi/vs_split.c index d01735490e69..07bc8e50e2b0 100644 --- a/vi/vs_split.c +++ b/vi/vs_split.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "@(#)vs_split.c 10.31 (Berkeley) 10/13/96"; +static const char sccsid[] = "$Id: vs_split.c,v 10.42 2001/06/25 15:19:38 skimo Exp $"; #endif /* not lint */ #include @@ -27,18 +27,23 @@ static const char sccsid[] = "@(#)vs_split.c 10.31 (Berkeley) 10/13/96"; #include "../common/common.h" #include "vi.h" -static SCR *vs_getbg __P((SCR *, char *)); +typedef enum { HORIZ_FOLLOW, HORIZ_PRECEDE, VERT_FOLLOW, VERT_PRECEDE } jdir_t; + +static SCR *vs_getbg __P((SCR *, char *)); +static void vs_insert __P((SCR *sp, GS *gp)); +static int vs_join __P((SCR *, SCR **, jdir_t *)); /* * vs_split -- - * Create a new screen. + * Create a new screen, horizontally. * * PUBLIC: int vs_split __P((SCR *, SCR *, int)); */ int -vs_split(sp, new, ccl) - SCR *sp, *new; - int ccl; /* Colon-command line split. */ +vs_split( + SCR *sp, + SCR *new, + int ccl) /* Colon-command line split. */ { GS *gp; SMAP *smp; @@ -58,10 +63,6 @@ vs_split(sp, new, ccl) /* Wait for any messages in the screen. */ vs_resolve(sp, NULL, 1); - half = sp->rows / 2; - if (ccl && half > 6) - half = 6; - /* Get a new screen map. */ CALLOC(sp, _HMAP(new), SMAP *, SIZE_HMAP(sp), sizeof(SMAP)); if (_HMAP(new) == NULL) @@ -70,6 +71,11 @@ vs_split(sp, new, ccl) _HMAP(new)->coff = 0; _HMAP(new)->soff = 1; + /* Split the screen in half. */ + half = sp->rows / 2; + if (ccl && half > 6) + half = 6; + /* * Small screens: see vs_refresh.c section 6a. Set a flag so * we know to fix the screen up later. @@ -77,6 +83,7 @@ vs_split(sp, new, ccl) issmallscreen = IS_SMALL(sp); /* The columns in the screen don't change. */ + new->coff = sp->coff; new->cols = sp->cols; /* @@ -93,24 +100,20 @@ vs_split(sp, new, ccl) !ccl && (vs_sm_cursor(sp, &smp) ? 0 : (smp - HMAP) + 1) >= half; if (splitup) { /* Old is bottom half. */ new->rows = sp->rows - half; /* New. */ - new->woff = sp->woff; + new->roff = sp->roff; sp->rows = half; /* Old. */ - sp->woff += new->rows; - /* Link in before old. */ - CIRCLEQ_INSERT_BEFORE(&gp->dq, sp, new, q); + sp->roff += new->rows; /* * If the parent is the bottom half of the screen, shift * the map down to match on-screen text. */ - memmove(_HMAP(sp), _HMAP(sp) + new->rows, + memcpy(_HMAP(sp), _HMAP(sp) + new->rows, (sp->t_maxrows - new->rows) * sizeof(SMAP)); } else { /* Old is top half. */ new->rows = half; /* New. */ sp->rows -= half; /* Old. */ - new->woff = sp->woff + sp->rows; - /* Link in after old. */ - CIRCLEQ_INSERT_AFTER(&gp->dq, sp, new, q); + new->roff = sp->roff + sp->rows; } /* Adjust maximum text count. */ @@ -168,6 +171,12 @@ vs_split(sp, new, ccl) if ((new->defscroll = new->t_maxrows / 2) == 0) new->defscroll = 1; + /* Fit the screen into the logical chain. */ + vs_insert(new, sp->gp); + + /* Tell the display that we're splitting. */ + (void)gp->scr_split(sp, new); + /* * Initialize the screen flags: * @@ -189,6 +198,134 @@ vs_split(sp, new, ccl) return (0); } +/* + * vs_vsplit -- + * Create a new screen, vertically. + * + * PUBLIC: int vs_vsplit __P((SCR *, SCR *)); + */ +int +vs_vsplit(SCR *sp, SCR *new) +{ + GS *gp; + size_t cols; + + gp = sp->gp; + + /* Check to see if it's possible. */ + if (sp->cols / 2 <= MINIMUM_SCREEN_COLS) { + msgq(sp, M_ERR, + "288|Screen must be larger than %d columns to split", + MINIMUM_SCREEN_COLS * 2); + return (1); + } + + /* Wait for any messages in the screen. */ + vs_resolve(sp, NULL, 1); + + /* Get a new screen map. */ + CALLOC(sp, _HMAP(new), SMAP *, SIZE_HMAP(sp), sizeof(SMAP)); + if (_HMAP(new) == NULL) + return (1); + _HMAP(new)->lno = sp->lno; + _HMAP(new)->coff = 0; + _HMAP(new)->soff = 1; + + /* + * Split the screen in half; we have to sacrifice a column to delimit + * the screens. + * + * XXX + * We always split to the right... that makes more sense to me, and + * I don't want to play the stupid games that I play when splitting + * horizontally. + * + * XXX + * We reserve a column for the screen, "knowing" that curses needs + * one. This should be worked out with the display interface. + */ + cols = sp->cols / 2; + new->cols = sp->cols - cols - 1; + sp->cols = cols; + new->coff = sp->coff + cols + 1; + sp->cno = 0; + + /* Nothing else changes. */ + new->rows = sp->rows; + new->t_rows = sp->t_rows; + new->t_maxrows = sp->t_maxrows; + new->t_minrows = sp->t_minrows; + new->roff = sp->roff; + new->defscroll = sp->defscroll; + _TMAP(new) = _HMAP(new) + (new->t_rows - 1); + + /* Fit the screen into the logical chain. */ + vs_insert(new, sp->gp); + + /* Tell the display that we're splitting. */ + (void)gp->scr_split(sp, new); + + /* Redraw the old screen from scratch. */ + F_SET(sp, SC_SCR_REFORMAT | SC_STATUS); + + /* + * Initialize the screen flags: + * + * If we're in vi mode in one screen, we don't have to reinitialize. + * This isn't just a cosmetic fix. The path goes like this: + * + * return into vi(), SC_SSWITCH set + * call vs_refresh() with SC_STATUS set + * call vs_resolve to display the status message + * call vs_refresh() because the SC_SCR_VI bit isn't set + * + * Things go downhill at this point. + * + * Draw the new screen from scratch, and add a status line. + */ + F_SET(new, + SC_SCR_REFORMAT | SC_STATUS | + F_ISSET(sp, SC_EX | SC_VI | SC_SCR_VI | SC_SCR_EX)); + return (0); +} + +/* + * vs_insert -- + * Insert the new screen into the correct place in the logical + * chain. + */ +static void +vs_insert(SCR *sp, GS *gp) +{ + SCR *tsp; + + gp = sp->gp; + + /* Move past all screens with lower row numbers. */ + TAILQ_FOREACH(tsp, gp->dq, q) + if (tsp->roff >= sp->roff) + break; + /* + * Move past all screens with the same row number and lower + * column numbers. + */ + for (; tsp != NULL; tsp = TAILQ_NEXT(tsp, q)) + if (tsp->roff != sp->roff || tsp->coff > sp->coff) + break; + + /* + * If we reached the end, this screen goes there. Otherwise, + * put it before or after the screen where we stopped. + */ + if (tsp == NULL) { + TAILQ_INSERT_TAIL(gp->dq, sp, q); + } else if (tsp->roff < sp->roff || + (tsp->roff == sp->roff && tsp->coff < sp->coff)) { + TAILQ_INSERT_AFTER(gp->dq, tsp, sp, q); + } else + TAILQ_INSERT_BEFORE(tsp, sp, q); +} + /* * vs_discard -- * Discard the screen, folding the real-estate into a related screen, @@ -197,11 +334,13 @@ vs_split(sp, new, ccl) * PUBLIC: int vs_discard __P((SCR *, SCR **)); */ int -vs_discard(sp, spp) - SCR *sp, **spp; +vs_discard(SCR *sp, SCR **spp) { - SCR *nsp; - dir_t dir; + GS *gp; + SCR *tsp, **lp, *list[100]; + jdir_t jdir; + + gp = sp->gp; /* * Save the old screen's cursor information. @@ -216,67 +355,255 @@ vs_discard(sp, spp) F_SET(sp->frp, FR_CURSORSET); } - /* - * Add into a previous screen and then into a subsequent screen, as - * they're the closest to the current screen. If that doesn't work, - * there was no screen to join. - */ - if ((nsp = sp->q.cqe_prev) != (void *)&sp->gp->dq) { - nsp->rows += sp->rows; - sp = nsp; - dir = FORWARD; - } else if ((nsp = sp->q.cqe_next) != (void *)&sp->gp->dq) { - nsp->woff = sp->woff; - nsp->rows += sp->rows; - sp = nsp; - dir = BACKWARD; - } else - sp = NULL; + /* If no other screens to join, we're done. */ + if (!IS_SPLIT(sp)) { + (void)gp->scr_discard(sp, NULL); - if (spp != NULL) - *spp = sp; - if (sp == NULL) + if (spp != NULL) + *spp = NULL; return (0); - - /* - * Make no effort to clean up the discarded screen's information. If - * it's not exiting, we'll do the work when the user redisplays it. - * - * Small screens: see vs_refresh.c section 6a. Adjust text line info, - * unless it's a small screen. - * - * Reset the length of the default scroll. - */ - if (!IS_SMALL(sp)) - sp->t_rows = sp->t_minrows = sp->rows - 1; - sp->t_maxrows = sp->rows - 1; - sp->defscroll = sp->t_maxrows / 2; - *(HMAP + (sp->t_rows - 1)) = *TMAP; - TMAP = HMAP + (sp->t_rows - 1); + } /* - * Draw the new screen from scratch, and add a status line. + * Find a set of screens that cover one of the screen's borders. + * Check the vertical axis first, for no particular reason. * * XXX - * We could play games with the map, if this were ever to be a - * performance problem, but I wrote the code a few times and it - * was never clean or easy. + * It's possible (I think?), to create a screen that shares no full + * border with any other set of screens, so we can't discard it. We + * just complain at the user until they clean it up. */ - switch (dir) { - case FORWARD: - vs_sm_fill(sp, OOBLNO, P_TOP); + if (vs_join(sp, list, &jdir)) + return (1); + + /* + * Modify the affected screens. Redraw the modified screen(s) from + * scratch, setting a status line. If this is ever a performance + * problem we could play games with the map, but I wrote that code + * before and it was never clean or easy. + * + * Don't clean up the discarded screen's information. If the screen + * isn't exiting, we'll do the work when the user redisplays it. + */ + switch (jdir) { + case HORIZ_FOLLOW: + case HORIZ_PRECEDE: + for (lp = &list[0]; (tsp = *lp) != NULL; ++lp) { + /* + * Small screens: see vs_refresh.c section 6a. Adjust + * text line info, unless it's a small screen. + * + * Reset the length of the default scroll. + * + * Reset the map references. + */ + tsp->rows += sp->rows; + if (!IS_SMALL(tsp)) + tsp->t_rows = tsp->t_minrows = tsp->rows - 1; + tsp->t_maxrows = tsp->rows - 1; + + tsp->defscroll = tsp->t_maxrows / 2; + + *(_HMAP(tsp) + (tsp->t_rows - 1)) = *_TMAP(tsp); + _TMAP(tsp) = _HMAP(tsp) + (tsp->t_rows - 1); + + switch (jdir) { + case HORIZ_FOLLOW: + tsp->roff = sp->roff; + vs_sm_fill(tsp, OOBLNO, P_TOP); + break; + case HORIZ_PRECEDE: + vs_sm_fill(tsp, OOBLNO, P_BOTTOM); + break; + default: + abort(); + } + F_SET(tsp, SC_STATUS); + } break; - case BACKWARD: - vs_sm_fill(sp, OOBLNO, P_BOTTOM); + case VERT_FOLLOW: + case VERT_PRECEDE: + for (lp = &list[0]; (tsp = *lp) != NULL; ++lp) { + if (jdir == VERT_FOLLOW) + tsp->coff = sp->coff; + tsp->cols += sp->cols + 1; /* XXX: DIVIDER */ + vs_sm_fill(tsp, OOBLNO, P_TOP); + F_SET(tsp, SC_STATUS); + } break; default: abort(); } - F_SET(sp, SC_STATUS); + /* Find the closest screen that changed and move to it. */ + tsp = list[0]; + if (spp != NULL) + *spp = tsp; + + /* Tell the display that we're discarding a screen. */ + (void)gp->scr_discard(sp, list); + return (0); } +/* + * vs_join -- + * Find a set of screens that covers a screen's border. + */ +static int +vs_join(SCR *sp, SCR **listp, jdir_t *jdirp) +{ + GS *gp; + SCR **lp, *tsp; + int first; + size_t tlen; + + gp = sp->gp; + + /* Check preceding vertical. */ + for (lp = listp, tlen = sp->rows, + tsp = TAILQ_FIRST(gp->dq); + tsp != NULL; tsp = TAILQ_NEXT(tsp, q)) { + if (sp == tsp) + continue; + /* Test if precedes the screen vertically. */ + if (tsp->coff + tsp->cols + 1 != sp->coff) + continue; + /* + * Test if a subset on the vertical axis. If overlaps the + * beginning or end, we can't join on this axis at all. + */ + if (tsp->roff > sp->roff + sp->rows) + continue; + if (tsp->roff < sp->roff) { + if (tsp->roff + tsp->rows >= sp->roff) + break; + continue; + } + if (tsp->roff + tsp->rows > sp->roff + sp->rows) + break; +#ifdef DEBUG + if (tlen < tsp->rows) + abort(); +#endif + tlen -= tsp->rows; + *lp++ = tsp; + } + if (tlen == 0) { + *lp = NULL; + *jdirp = VERT_PRECEDE; + return (0); + } + + /* Check following vertical. */ + for (lp = listp, tlen = sp->rows, + tsp = TAILQ_FIRST(gp->dq); + tsp != NULL; tsp = TAILQ_NEXT(tsp, q)) { + if (sp == tsp) + continue; + /* Test if follows the screen vertically. */ + if (tsp->coff != sp->coff + sp->cols + 1) + continue; + /* + * Test if a subset on the vertical axis. If overlaps the + * beginning or end, we can't join on this axis at all. + */ + if (tsp->roff > sp->roff + sp->rows) + continue; + if (tsp->roff < sp->roff) { + if (tsp->roff + tsp->rows >= sp->roff) + break; + continue; + } + if (tsp->roff + tsp->rows > sp->roff + sp->rows) + break; +#ifdef DEBUG + if (tlen < tsp->rows) + abort(); +#endif + tlen -= tsp->rows; + *lp++ = tsp; + } + if (tlen == 0) { + *lp = NULL; + *jdirp = VERT_FOLLOW; + return (0); + } + + /* Check preceding horizontal. */ + for (first = 0, lp = listp, tlen = sp->cols, + tsp = TAILQ_FIRST(gp->dq); + tsp != NULL; tsp = TAILQ_NEXT(tsp, q)) { + if (sp == tsp) + continue; + /* Test if precedes the screen horizontally. */ + if (tsp->roff + tsp->rows != sp->roff) + continue; + /* + * Test if a subset on the horizontal axis. If overlaps the + * beginning or end, we can't join on this axis at all. + */ + if (tsp->coff > sp->coff + sp->cols) + continue; + if (tsp->coff < sp->coff) { + if (tsp->coff + tsp->cols >= sp->coff) + break; + continue; + } + if (tsp->coff + tsp->cols > sp->coff + sp->cols) + break; +#ifdef DEBUG + if (tlen < tsp->cols) + abort(); +#endif + tlen -= tsp->cols + first; + first = 1; + *lp++ = tsp; + } + if (tlen == 0) { + *lp = NULL; + *jdirp = HORIZ_PRECEDE; + return (0); + } + + /* Check following horizontal. */ + for (first = 0, lp = listp, tlen = sp->cols, + tsp = TAILQ_FIRST(gp->dq); + tsp != NULL; tsp = TAILQ_NEXT(tsp, q)) { + if (sp == tsp) + continue; + /* Test if precedes the screen horizontally. */ + if (tsp->roff != sp->roff + sp->rows) + continue; + /* + * Test if a subset on the horizontal axis. If overlaps the + * beginning or end, we can't join on this axis at all. + */ + if (tsp->coff > sp->coff + sp->cols) + continue; + if (tsp->coff < sp->coff) { + if (tsp->coff + tsp->cols >= sp->coff) + break; + continue; + } + if (tsp->coff + tsp->cols > sp->coff + sp->cols) + break; +#ifdef DEBUG + if (tlen < tsp->cols) + abort(); +#endif + tlen -= tsp->cols + first; + first = 1; + *lp++ = tsp; + } + if (tlen == 0) { + *lp = NULL; + *jdirp = HORIZ_FOLLOW; + return (0); + } + return (1); +} + /* * vs_fg -- * Background the current screen, and foreground a new one. @@ -284,26 +611,29 @@ vs_discard(sp, spp) * PUBLIC: int vs_fg __P((SCR *, SCR **, CHAR_T *, int)); */ int -vs_fg(sp, nspp, name, newscreen) - SCR *sp, **nspp; - CHAR_T *name; - int newscreen; +vs_fg(SCR *sp, SCR **nspp, CHAR_T *name, int newscreen) { GS *gp; SCR *nsp; + char *np; + size_t nlen; gp = sp->gp; + if (name) + INT2CHAR(sp, name, STRLEN(name) + 1, np, nlen); + else + np = NULL; if (newscreen) /* Get the specified background screen. */ - nsp = vs_getbg(sp, name); + nsp = vs_getbg(sp, np); else /* Swap screens. */ - if (vs_swap(sp, &nsp, name)) + if (vs_swap(sp, &nsp, np)) return (1); if ((*nspp = nsp) == NULL) { - msgq_str(sp, M_ERR, name, + msgq_wstr(sp, M_ERR, name, name == NULL ? "223|There are no background screens" : "224|There's no background screen editing a file named %s"); @@ -312,17 +642,17 @@ vs_fg(sp, nspp, name, newscreen) if (newscreen) { /* Remove the new screen from the background queue. */ - CIRCLEQ_REMOVE(&gp->hq, nsp, q); + TAILQ_REMOVE(gp->hq, nsp, q); /* Split the screen; if we fail, hook the screen back in. */ if (vs_split(sp, nsp, 0)) { - CIRCLEQ_INSERT_TAIL(&gp->hq, nsp, q); + TAILQ_INSERT_TAIL(gp->hq, nsp, q); return (1); } } else { /* Move the old screen to the background queue. */ - CIRCLEQ_REMOVE(&gp->dq, sp, q); - CIRCLEQ_INSERT_TAIL(&gp->hq, sp, q); + TAILQ_REMOVE(gp->dq, sp, q); + TAILQ_INSERT_TAIL(gp->hq, sp, q); } return (0); } @@ -334,8 +664,7 @@ vs_fg(sp, nspp, name, newscreen) * PUBLIC: int vs_bg __P((SCR *)); */ int -vs_bg(sp) - SCR *sp; +vs_bg(SCR *sp) { GS *gp; SCR *nsp; @@ -352,8 +681,8 @@ vs_bg(sp) } /* Move the old screen to the background queue. */ - CIRCLEQ_REMOVE(&gp->dq, sp, q); - CIRCLEQ_INSERT_TAIL(&gp->hq, sp, q); + TAILQ_REMOVE(gp->dq, sp, q); + TAILQ_INSERT_TAIL(gp->hq, sp, q); /* Toss the screen map. */ free(_HMAP(sp)); @@ -373,12 +702,10 @@ vs_bg(sp) * PUBLIC: int vs_swap __P((SCR *, SCR **, char *)); */ int -vs_swap(sp, nspp, name) - SCR *sp, **nspp; - char *name; +vs_swap(SCR *sp, SCR **nspp, char *name) { GS *gp; - SCR *nsp; + SCR *nsp, *list[2]; gp = sp->gp; @@ -409,7 +736,7 @@ vs_swap(sp, nspp, name) /* Initialize screen information. */ nsp->cols = sp->cols; nsp->rows = sp->rows; /* XXX: Only place in vi that sets rows. */ - nsp->woff = sp->woff; + nsp->roff = sp->roff; /* * Small screens: see vs_refresh.c, section 6a. @@ -435,6 +762,7 @@ vs_swap(sp, nspp, name) _TMAP(nsp) = _HMAP(nsp) + (nsp->t_rows - 1); /* Fill the map. */ + nsp->gp = sp->gp; if (vs_sm_fill(nsp, nsp->lno, P_FILL)) return (1); @@ -444,8 +772,8 @@ vs_swap(sp, nspp, name) * the exit will delete the old one, if we're foregrounding, the fg * code will move the old one to the background queue. */ - CIRCLEQ_REMOVE(&gp->hq, nsp, q); - CIRCLEQ_INSERT_AFTER(&gp->dq, sp, nsp, q); + TAILQ_REMOVE(gp->hq, nsp, q); + TAILQ_INSERT_AFTER(gp->dq, sp, nsp, q); /* * Don't change the screen's cursor information other than to @@ -455,6 +783,10 @@ vs_swap(sp, nspp, name) /* Draw the new screen from scratch, and add a status line. */ F_SET(nsp, SC_SCR_REDRAW | SC_STATUS); + + list[0] = nsp; list[1] = NULL; + (void)gp->scr_discard(sp, list); + return (0); } @@ -465,13 +797,10 @@ vs_swap(sp, nspp, name) * PUBLIC: int vs_resize __P((SCR *, long, adj_t)); */ int -vs_resize(sp, count, adj) - SCR *sp; - long count; - adj_t adj; +vs_resize(SCR *sp, long int count, adj_t adj) { GS *gp; - SCR *g, *s; + SCR *g, *s, *prev, *next, *list[3] = {NULL, NULL, NULL}; size_t g_off, s_off; gp = sp->gp; @@ -494,6 +823,23 @@ vs_resize(sp, count, adj) } } + /* Find first overlapping screen */ + for (next = TAILQ_NEXT(sp, q); next != NULL && + (next->coff >= sp->coff + sp->cols || + next->coff + next->cols <= sp->coff); + next = TAILQ_NEXT(next, q)); + /* See if we can use it */ + if (next != NULL && + (sp->coff != next->coff || sp->cols != next->cols)) + next = NULL; + for (prev = TAILQ_PREV(sp, _dqh, q); prev != NULL && + (prev->coff >= sp->coff + sp->cols || + prev->coff + prev->cols <= sp->coff); + prev = TAILQ_PREV(prev, _dqh, q)); + if (prev != NULL && + (sp->coff != prev->coff || sp->cols != prev->cols)) + prev = NULL; + g_off = s_off = 0; if (adj == A_DECREASE) { if (count < 0) @@ -501,23 +847,21 @@ vs_resize(sp, count, adj) s = sp; if (s->t_maxrows < MINIMUM_SCREEN_ROWS + count) goto toosmall; - if ((g = sp->q.cqe_prev) == (void *)&gp->dq) { - if ((g = sp->q.cqe_next) == (void *)&gp->dq) + if ((g = prev) == NULL) { + if ((g = next) == NULL) goto toobig; g_off = -count; } else s_off = count; } else { g = sp; - if ((s = sp->q.cqe_next) != (void *)&gp->dq) - if (s->t_maxrows < MINIMUM_SCREEN_ROWS + count) - s = NULL; - else + if ((s = next) != NULL && + s->t_maxrows >= MINIMUM_SCREEN_ROWS + count) s_off = count; else s = NULL; if (s == NULL) { - if ((s = sp->q.cqe_prev) == (void *)&gp->dq) { + if ((s = prev) == NULL) { toobig: msgq(sp, M_BERR, adj == A_DECREASE ? "227|The screen cannot shrink" : "228|The screen cannot grow"); @@ -539,9 +883,9 @@ toosmall: msgq(sp, M_BERR, * to make it worthwhile. */ s->rows += -count; - s->woff += s_off; + s->roff += s_off; g->rows += count; - g->woff += g_off; + g->roff += g_off; g->t_rows += count; if (g->t_minrows == g->t_maxrows) @@ -557,6 +901,10 @@ toosmall: msgq(sp, M_BERR, _TMAP(s) -= count; F_SET(s, SC_SCR_REFORMAT | SC_STATUS); + /* XXXX */ + list[0] = g; list[1] = s; + gp->scr_discard(0, list); + return (0); } @@ -566,9 +914,7 @@ toosmall: msgq(sp, M_BERR, * background screen. */ static SCR * -vs_getbg(sp, name) - SCR *sp; - char *name; +vs_getbg(SCR *sp, char *name) { GS *gp; SCR *nsp; @@ -577,22 +923,18 @@ vs_getbg(sp, name) gp = sp->gp; /* If name is NULL, return the first background screen on the list. */ - if (name == NULL) { - nsp = gp->hq.cqh_first; - return (nsp == (void *)&gp->hq ? NULL : nsp); - } + if (name == NULL) + return (TAILQ_FIRST(gp->hq)); /* Search for a full match. */ - for (nsp = gp->hq.cqh_first; - nsp != (void *)&gp->hq; nsp = nsp->q.cqe_next) + TAILQ_FOREACH(nsp, gp->hq, q) if (!strcmp(nsp->frp->name, name)) break; - if (nsp != (void *)&gp->hq) + if (nsp != NULL) return (nsp); /* Search for a last-component match. */ - for (nsp = gp->hq.cqh_first; - nsp != (void *)&gp->hq; nsp = nsp->q.cqe_next) { + TAILQ_FOREACH(nsp, gp->hq, q) { if ((p = strrchr(nsp->frp->name, '/')) == NULL) p = nsp->frp->name; else @@ -600,7 +942,7 @@ vs_getbg(sp, name) if (!strcmp(p, name)) break; } - if (nsp != (void *)&gp->hq) + if (nsp != NULL) return (nsp); return (NULL); From cc9bf4918fdbd5b82bf22767e1836a1679298e19 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 11 Nov 2013 16:38:34 +0000 Subject: [PATCH 4/6] Import nvi2 2.1.2-95773e17e2751. --- README | 4 +- catalog/dump.c | 30 +- common/main.c | 4 +- docs/USD.doc/vi.man/vi.1 | 3431 +++++++++++++++++++++++++------------- ex/ex_print.c | 43 +- vi/v_txt.c | 3 +- vi/vs_refresh.c | 5 +- 7 files changed, 2365 insertions(+), 1155 deletions(-) diff --git a/README b/README index bb05379e7a7c..c129439d38d0 100644 --- a/README +++ b/README @@ -1,6 +1,6 @@ -# $Id: README,v 9.0 2012/10/07 09:13:54 zy Exp $ +# $Id: README,v 9.1 2013/11/02 02:50:23 zy Exp $ -This is version 2.1.1 (2012-10-07) of nex/nvi, a reimplementation of the ex/vi +This is version 2.1.2 (2012-11-02) of nex/nvi, a reimplementation of the ex/vi text editors originally distributed as part of the Fourth Berkeley Software Distribution (4BSD), by the University of California, Berkeley. diff --git a/catalog/dump.c b/catalog/dump.c index 4cd39df863b2..13ffb8bb422a 100644 --- a/catalog/dump.c +++ b/catalog/dump.c @@ -2,12 +2,38 @@ * Copyright (c) 1992, 1993, 1994 * The Regents of the University of California. All rights reserved. * - * %sccs.include.redist.c% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. */ #ifndef lint static char copyright[] = -"%Z% Copyright (c) 1992, 1993, 1994\n\ +"@(#) Copyright (c) 1992, 1993, 1994\n\ The Regents of the University of California. All rights reserved.\n"; #endif /* not lint */ diff --git a/common/main.c b/common/main.c index 16b3fb19e22d..6ff418173007 100644 --- a/common/main.c +++ b/common/main.c @@ -11,9 +11,9 @@ #ifndef lint static const char copyright[] = -"%Z% Copyright (c) 1992, 1993, 1994\n\ +"@(#) Copyright (c) 1992, 1993, 1994\n\ The Regents of the University of California. All rights reserved.\n\ -%Z% Copyright (c) 1992, 1993, 1994, 1995, 1996\n\ +@(#) Copyright (c) 1992, 1993, 1994, 1995, 1996\n\ Keith Bostic. All rights reserved.\n"; #endif /* not lint */ diff --git a/docs/USD.doc/vi.man/vi.1 b/docs/USD.doc/vi.man/vi.1 index 1292eef3ffa8..e4a51cb8fdd3 100644 --- a/docs/USD.doc/vi.man/vi.1 +++ b/docs/USD.doc/vi.man/vi.1 @@ -5,1570 +5,2741 @@ .\" Copyright (c) 2011 .\" Zhihao Yuan. All rights reserved. .\" -.\" This document may not be republished without written permission from -.\" Keith Bostic. +.\" The vi program is freely redistributable. +.\" You are welcome to copy, modify and share it with others +.\" under the conditions listed in the LICENSE file. +.\" If any company (not individual!) finds vi sufficiently useful +.\" that you would have purchased it, or if any company wishes to +.\" redistribute it, contributions to the authors would be appreciated. .\" -.\" See the LICENSE file for redistribution information. +.\" $Id: vi.1,v 9.0 2013/11/02 12:11:56 zy Exp $ .\" -.\" $Id: vi.1,v 8.59 2012/02/12 12:56:37 zy Exp $ -.\" -.TH VI 1 "11 February, 2012" -.UC -.SH NAME -ex, vi, view \- text editors -.SH SYNOPSIS -.B ex -[\c -.B -eFRrSsv\c -] [\c -.BI -c " cmd"\c -] [\c -.BI -t " tag"\c -] [\c -.BI -w " size"\c -] [file ...] -.br -.B vi -[\c -.B -eFlRrSv\c -] [\c -.BI -c " cmd"\c -] [\c -.BI -t " tag"\c -] [\c -.BI -w " size"\c -] [file ...] -.br -.B view -[\c -.B -eFRrSv\c -] [\c -.BI -c " cmd"\c -] [\c -.BI -t " tag"\c -] [\c -.BI -w " size"\c -] [file ...] -.SH LICENSE -The vi program is freely redistributable. You are welcome to copy, -modify and share it with others under the conditions listed in the -LICENSE file. If any company (not individual!) finds vi sufficiently -useful that you would have purchased it, or if any company wishes to -redistribute it, contributions to the authors would be appreciated. -.SH DESCRIPTION -.I \&Vi -is a screen oriented text editor. -.I \&Ex +.Dd November 2, 2013 +.Dt VI 1 +.Os +.Sh NAME +.Nm ex , vi , view +.Nd text editors +.Sh SYNOPSIS +.Nm ex +.Op Fl FRrSsv +.Op Fl c Ar cmd +.Op Fl t Ar tag +.Op Fl w Ar size +.Op Ar +.Nm vi\ \& +.Op Fl eFRrS +.Op Fl c Ar cmd +.Op Fl t Ar tag +.Op Fl w Ar size +.Op Ar +.Nm view +.Op Fl eFrS +.Op Fl c Ar cmd +.Op Fl t Ar tag +.Op Fl w Ar size +.Op Ar +.Sh DESCRIPTION +.Nm vi +is a screen-oriented text editor. +.Nm ex is a line-oriented text editor. -.I \&Ex +.Nm ex and -.I \&vi +.Nm vi are different interfaces to the same program, and it is possible to switch back and forth during an edit session. -.I View +.Nm view is the equivalent of using the -.B \-R -(read-only) option of -.IR \&vi . -.PP +.Fl R +.Pq read-only +option of +.Nm vi . +.Pp This manual page is the one provided with the -.I nex/nvi +.Nm nex Ns / Ns Nm nvi versions of the -.I ex/vi +.Nm ex Ns / Ns Nm vi text editors. -.I Nex/nvi +.Nm nex Ns / Ns Nm nvi are intended as bug-for-bug compatible replacements for the original -Fourth Berkeley Software Distribution (4BSD) -.I \&ex +Fourth Berkeley Software Distribution +.Pq 4BSD +.Nm ex and -.I \&vi +.Nm vi programs. For the rest of this manual page, -.I nex/nvi +.Nm nex Ns / Ns Nm nvi is used only when it's necessary to distinguish it from the historic implementations of -.IR ex/vi . -.PP +.Nm ex Ns / Ns Nm vi . +.Pp This manual page is intended for users already familiar with -.IR ex/vi . +.Nm ex Ns / Ns Nm vi . Anyone else should almost certainly read a good tutorial on the editor before this manual page. -If you're in an unfamiliar environment, and you absolutely have to -get work done immediately, read the section after the options -description, entitled ``Fast Startup''. +If you're in an unfamiliar environment, +and you absolutely have to get work done immediately, +read the section after the options description, entitled +.Sx FAST STARTUP . It's probably enough to get you going. -.PP +.Pp The following options are available: -.TP -.B \-c +.Bl -tag -width "-w size " +.It Fl c Ar cmd Execute -.B cmd -immediately after starting the edit session. -Particularly useful for initial positioning in the file, however -.B cmd +.Ar cmd +on the first file loaded. +Particularly useful for initial positioning in the file, although +.Ar cmd is not limited to positioning commands. -This is the POSIX 1003.2 interface for the historic ``+cmd'' syntax. -.I Nex/nvi +This is the POSIX 1003.2 interface for the historic +.Dq +cmd +syntax. +.Nm nex Ns / Ns Nm nvi supports both the old and new syntax. -.TP -.B \-e +.It Fl e Start editing in ex mode, as if the command name were -.IR \&ex . -.TP -.B \-F +.Nm ex . +.It Fl F Don't copy the entire file when first starting to edit. (The default is to make a copy in case someone else modifies the file during your edit session.) -.TP -.B \-l -Start editing with the lisp and showmatch options set. -.TP -.B \-R +.\" .It Fl l +.\" Start editing with the lisp and showmatch options set. +.It Fl R Start editing in read-only mode, as if the command name was -.IR view , +.Nm view , or the -.B readonly +.Cm readonly option was set. -.TP -.B \-r +.It Fl r Recover the specified files, or, if no files are specified, list the files that could be recovered. If no recoverable files by the specified name exist, the file is edited as if the -.B \-r +.Fl r option had not been specified. -.TP -.B \-S +.It Fl S Run with the -.B secure +.Cm secure edit option set, disallowing all access to external programs. -.TP -.B \-s +.It Fl s Enter batch mode; applicable only to -.I \&ex +.Nm ex edit sessions. Batch mode is useful when running -.I \&ex +.Nm ex scripts. -Prompts, informative messages and other user oriented message -are turned off, +Prompts, informative messages and other user oriented messages are turned off, and no startup files or environment variables are read. -This is the POSIX 1003.2 interface for the historic ``\-'' argument. -.I \&Nex/nvi +This is the POSIX 1003.2 interface for the historic +.Dq - +argument. +.Nm nex Ns / Ns Nm nvi supports both the old and new syntax. -.TP -.B \-t -Start editing at the specified tag. -(See -.IR ctags (1)). -.TP -.B \-w -Set the initial window size to the specified number of lines. -.TP -.B \-v +.It Fl t Ar tag +Start editing at the specified +.Ar tag +.Pq see Xr ctags 1 . +.It Fl v Start editing in vi mode, as if the command name was -.I \&vi -or -.IR view . -.PP +.Nm vi . +.It Fl w Ar size +Set the initial window size to the specified number of lines. +.El +.Pp Command input for -.I ex/vi +.Nm ex Ns / Ns Nm vi is read from the standard input. In the -.I \&vi +.Nm vi interface, it is an error if standard input is not a terminal. In the -.I \&ex +.Nm ex interface, if standard input is not a terminal, -.I \&ex -will read commands from it regardless, however, the session will be a +.Nm ex +will read commands from it regardless; however, the session will be a batch mode session, exactly as if the -.B \-s +.Fl s option had been specified. -.PP -.I Ex/vi -exits 0 on success, and greater than 0 if an error occurs. -.SH FAST STARTUP +.Sh FAST STARTUP This section will tell you the minimum amount that you need to do simple editing tasks using -.IR \&vi . -If you've never used any screen editor before, you're likely to have -problems even with this simple introduction. +.Nm vi . +If you've never used any screen editor before, +you're likely to have problems even with this simple introduction. In that case you should find someone that already knows -.I \&vi +.Nm vi and have them walk you through this section. -.PP -.I \&Vi +.Pp +.Nm vi is a screen editor. -This means that it takes up almost the entire screen, displaying part -of the file on each screen line, except for the last line of the screen. +This means that it takes up almost the entire screen, +displaying part of the file on each screen line, +except for the last line of the screen. The last line of the screen is used for you to give commands to -.IR \&vi , +.Nm vi , and for -.I \&vi +.Nm vi to give information to you. -.PP +.Pp The other fact that you need to understand is that -.I \&vi -is a modeful editor, i.e. you are either entering text or you -are executing commands, and you have to be in the right mode -to do one or the other. +.Nm vi +is a modeful editor, +i.e., you are either entering text or you are executing commands, +and you have to be in the right mode to do one or the other. You will be in command mode when you first start editing a file. There are commands that switch you into input mode. There is only one key that takes you out of input mode, -and that is the key. -(Key names are written using less-than and greater-than signs, e.g. - means the ``escape'' key, usually labeled ``esc'' on your -terminal's keyboard.) +and that is the +.Aq escape +key. +.Pp +Key names are written using less-than and greater-than signs, e.g., +.Aq escape +means the +.Dq escape +key, usually labeled +.Dq Esc +on your terminal's keyboard. If you're ever confused as to which mode you're in, -keep entering the key until -.I \&vi +keep entering the +.Aq escape +key until +.Nm vi beeps at you. -(Generally, -.I \&vi +Generally, +.Nm vi will beep at you if you try and do something that's not allowed. -It will also display error messages.) -.PP -To start editing a file, enter the command ``vi file_name''. -The command you should enter as soon as you start editing is -``:set verbose showmode''. +It will also display error messages. +.Pp +To start editing a file, enter the following command: +.Pp +.Dl $ vi file +.Pp +The command you should enter as soon as you start editing is: +.Pp +.Dl :set verbose showmode +.Pp This will make the editor give you verbose error messages and display the current mode at the bottom of the screen. -.PP +.Pp The commands to move around the file are: -.TP -.B h +.Bl -tag -width Ds +.It Cm h Move the cursor left one character. -.TP -.B j +.It Cm j Move the cursor down one line. -.TP -.B k +.It Cm k Move the cursor up one line. -.TP -.B l +.It Cm l Move the cursor right one character. -.TP -.B +.It Aq Cm cursor-arrows The cursor arrow keys should work, too. -.TP -.B /text -Search for the string ``text'' in the file, +.It Cm / Ns text +Search for the string +.Dq text +in the file, and move the cursor to its first character. -.PP +.El +.Pp The commands to enter new text are: -.TP -.B a -Append new text, -.I after -the cursor. -.TP -.B i -Insert new text, -.I before -the cursor. -.TP -.B o -Open a new line below the line the cursor is on, and start -entering text. -.TP -.B O -Open a new line above the line the cursor is on, and start -entering text. -.TP -.B -Once you've entered input mode using the one of the -.BR \&a , -.BR \&i , -.BR \&O -or -.B \&o +.Bl -tag -width "" +.It Cm a +Append new text, after the cursor. +.It Cm i +Insert new text, before the cursor. +.It Cm o +Open a new line below the line the cursor is on, and start entering text. +.It Cm O +Open a new line above the line the cursor is on, and start entering text. +.It Aq Cm escape +Once you've entered input mode using one of the +.Cm a , +.Cm i , +.Cm o +or +.Cm O commands, use -.B +.Aq Cm escape to quit entering text and return to command mode. -.PP +.El +.Pp The commands to copy text are: -.TP -.B yy +.Bl -tag -width Ds +.It Cm yy Copy the line the cursor is on. -.TP -.B p +.It Cm p Append the copied line after the line the cursor is on. -.PP +.El +.Pp The commands to delete text are: -.TP -.B dd +.Bl -tag -width Ds +.It Cm dd Delete the line the cursor is on. -.TP -.B x +.It Cm x Delete the character the cursor is on. -.PP +.El +.Pp The commands to write the file are: -.TP -.B :w +.Bl -tag -width Ds +.It Cm :w Write the file back to the file with the name that you originally used as an argument on the -.I \&vi +.Nm vi command line. -.TP -.B ":w file_name" -Write the file back to the file with the name ``file_name''. -.PP +.It Cm :w Ar file_name +Write the file back to the file with the name +.Ar file_name . +.El +.Pp The commands to quit editing and exit the editor are: -.TP -.B :q -Quit editing and leave vi (if you've modified the file, but not -saved your changes, -.I \&vi +.Bl -tag -width Ds +.It Cm :q +Quit editing and leave +.Nm vi +(if you've modified the file, but not saved your changes, +.Nm vi will refuse to quit). -.TP -.B :q! +.It Cm :q! Quit, discarding any modifications that you may have made. -.PP -One final caution. +.El +.Pp +One final caution: Unusual characters can take up more than one column on the screen, and long lines can take up more than a single screen line. -The above commands work on ``physical'' characters and lines, -i.e. they affect the entire line no matter how many screen lines it -takes up and the entire character no matter how many screen columns -it takes up. -.SH VI COMMANDS +The above commands work on +.Dq physical +characters and lines, +i.e., they affect the entire line no matter how many screen lines it takes up +and the entire character no matter how many screen columns it takes up. +.Sh REGULAR EXPRESSIONS +.Nm ex Ns / Ns Nm vi +supports regular expressions +.Pq REs , +as documented in +.Xr re_format 7 , +for line addresses, as the first part of the +.Nm ex Cm substitute , +.Cm global +and +.Cm v +commands, and in search patterns. +Basic regular expressions +.Pq BREs +are enabled by default; +extended regular expressions +.Pq EREs +are used if the +.Cm extended +option is enabled. +The use of regular expressions can be largely disabled using the +.Cm magic +option. +.Pp +The following strings have special meanings in the +.Nm ex Ns / Ns Nm vi +version of regular expressions: +.Bl -bullet -offset 6u +.It +An empty regular expression is equivalent to the last regular expression used. +.It +.Sq \e\(la +matches the beginning of the word. +.It +.Sq \e\(ra +matches the end of the word. +.It +.Sq \(a~ +matches the replacement part of the last +.Cm substitute +command. +.El +.Sh BUFFERS +A buffer is an area where commands can save changed or deleted text +for later use. +.Nm vi +buffers are named with a single character preceded by a double quote, +for example +.Pf \&" Ns Aq c ; +.Nm ex +buffers are the same, +but without the double quote. +.Nm nex Ns / Ns Nm nvi +permits the use of any character without another meaning in the position where +a buffer name is expected. +.Pp +All buffers are either in +.Em line mode +or +.Em character mode . +Inserting a buffer in line mode into the text creates new lines for each of the +lines it contains, while a buffer in character mode creates new lines for any +lines +.Em other +than the first and last lines it contains. +The first and last lines are inserted at the current cursor position, becoming +part of the current line. +If there is more than one line in the buffer, +the current line itself will be split. +All +.Nm ex +commands which store text into buffers do so in line mode. +The behaviour of +.Nm vi +commands depend on their associated motion command: +.Bl -bullet -offset 6u +.It +.Aq Cm control-A , +.Cm h , +.Cm l , +.Cm ,\& , +.Cm 0 , +.Cm B , +.Cm E , +.Cm F , +.Cm T , +.Cm W , +.Cm ^ , +.Cm b , +.Cm e , +.Cm f +and +.Cm t +make the destination buffer character-oriented. +.It +.Cm j , +.Aq Cm control-M , +.Cm k , +.Cm ' , +.Cm - , +.Cm G , +.Cm H , +.Cm L , +.Cm M , +.Cm _ +and +.Cm |\& +make the destination buffer line-oriented. +.It +.Cm $ , +.Cm % , +.Cm ` , +.Cm (\& , +.Cm )\& , +.Cm / , +.Cm ?\& , +.Cm [[ , +.Cm ]] , +.Cm { +and +.Cm } +make the destination buffer character-oriented, unless the starting and +end positions are the first and last characters on a line. +In that case, the buffer is line-oriented. +.El +.Pp +The +.Nm ex +command +.Cm display buffers +displays the current mode for each buffer. +.Pp +Buffers named +.Sq a +through +.Sq z +may be referred to using their uppercase equivalent, in which case new content +will be appended to the buffer, instead of replacing it. +.Pp +Buffers named +.Sq 1 +through +.Sq 9 +are special. +A region of text modified using the +.Cm c +.Pq change +or +.Cm d +.Pq delete +commands is placed into the numeric buffer +.Sq 1 +if no other buffer is specified and if it meets one of the following conditions: +.Bl -bullet -offset 6u +.It +It includes characters from more than one line. +.It +It is specified using a line-oriented motion. +.It +It is specified using one of the following motion commands: +.Aq Cm control-A , +.Cm ` Ns Aq Cm character , +.Cm n , +.Cm N , +.Cm % , +.Cm / , +.Cm { , +.Cm } , +.Cm \&( , +.Cm \&) , +and +.Cm \&? . +.El +.Pp +Before this copy is done, the previous contents of buffer +.Sq 1 +are moved into buffer +.Sq 2 , +.Sq 2 +into buffer +.Sq 3 , +and so on. +The contents of buffer +.Sq 9 +are discarded. +Note that this rotation occurs +.Em regardless +of the user specifying another buffer. +In +.Nm vi , +text may be explicitly stored into the numeric buffers. +In this case, the buffer rotation occurs before the replacement of the buffer's +contents. +The numeric buffers are only available in +.Nm vi +mode. +.Sh VI COMMANDS The following section describes the commands available in the command mode of the -.I \&vi +.Nm vi editor. -In each entry below, the tag line is a usage synopsis for the command -character. -.PP -.TP -.B "[count] " +The following words have a special meaning in the commands description: +.Pp +.Bl -tag -width bigword -compact -offset 3u +.It Ar bigword +A set of non-whitespace characters. +.It Ar buffer +Temporary area where commands may place text. +If not specified, the default buffer is used. +See also +.Sx BUFFERS , +above. +.It Ar count +A positive number used to specify the desired number of iterations +of a command. +It defaults to 1 if not specified. +.It Ar motion +A cursor movement command which indicates the other end of the affected region +of text, the first being the current cursor position. +Repeating the command character makes it affect the whole current line. +.It Ar word +A sequence of letters, digits or underscores. +.El +.Pp +.Ar buffer +and +.Ar count , +if both present, may be specified in any order. +.Ar motion +and +.Ar count , +if both present, are effectively multiplied together +and considered part of the motion. +.Pp +.Bl -tag -width Ds -compact +.It Xo +.Aq Cm control-A +.Xc Search forward -.I count -times for the current word. -.TP -.B "[count] " +for the word starting at the cursor position. +.Pp +.It Xo +.Op Ar count +.Aq Cm control-B +.Xc Page backwards -.I count +.Ar count screens. -.TP -.B "[count] " +Two lines of overlap are maintained, if possible. +.Pp +.It Xo +.Op Ar count +.Aq Cm control-D +.Xc Scroll forward -.I count +.Ar count lines. -.TP -.B "[count] " +If +.Ar count +is not given, scroll forward the number of lines specified by the last +.Aq Cm control-D +or +.Aq Cm control-U +command. +If this is the first +.Aq Cm control-D +command, scroll half the number of lines in the current screen. +.Pp +.It Xo +.Op Ar count +.Aq Cm control-E +.Xc Scroll forward -.I count +.Ar count lines, leaving the current line and column as is, if possible. -.TP -.B "[count] " +.Pp +.It Xo +.Op Ar count +.Aq Cm control-F +.Xc Page forward -.I count +.Ar count screens. -.TP -.B "" -Display the file information. -.TP -.B "" -.TP -.B "[count] h" +Two lines of overlap are maintained, if possible. +.Pp +.It Aq Cm control-G +Display the following file information: +the file name +.Pq as given to Nm vi ; +whether the file has been modified since it was last written; +if the file is read-only; +the current line number; +the total number of lines in the file; +and the current line number as a percentage of the total lines in the file. +.Pp +.It Xo +.Op Ar count +.Aq Cm control-H +.Xc +.It Xo +.Op Ar count +.Cm h +.Xc Move the cursor back -.I count +.Ar count characters in the current line. -.TP -.B "[count] " -.TP -.B "[count] " -.TP -.B "[count] j" +.Pp +.It Xo +.Op Ar count +.Aq Cm control-J +.Xc +.It Xo +.Op Ar count +.Aq Cm control-N +.Xc +.It Xo +.Op Ar count +.Cm j +.Xc Move the cursor down -.I count +.Ar count lines without changing the current column. -.TP -.B "" -.TP -.B "" +.Pp +.It Aq Cm control-L +.It Aq Cm control-R Repaint the screen. -.TP -.B "[count] " -.TP -.B "[count] +" +.Pp +.It Xo +.Op Ar count +.Aq Cm control-M +.Xc +.It Xo +.Op Ar count +.Cm + +.Xc Move the cursor down -.I count -lines to the first nonblank character of that line. -.TP -.B "[count] " -.TP -.B "[count] k" +.Ar count +lines to the first non-blank character of that line. +.Pp +.It Xo +.Op Ar count +.Aq Cm control-P +.Xc +.It Xo +.Op Ar count +.Cm k +.Xc Move the cursor up -.I count +.Ar count lines, without changing the current column. -.TP -.B "" +.Pp +.It Aq Cm control-T Return to the most recent tag context. -.TP -.B "" +.Pp +.It Xo +.Op Ar count +.Aq Cm control-U +.Xc Scroll backwards -.I count +.Ar count lines. -.TP -.B "" -Switch to the next lower screen in the window, or, to the first -screen if there are no lower screens in the window. -.TP -.B "" +If +.Ar count +is not given, scroll backwards the number of lines specified by the last +.Aq Cm control-D +or +.Aq Cm control-U +command. +If this is the first +.Aq Cm control-U +command, scroll half the number of lines in the current screen. +.Pp +.It Aq Cm control-W +Switch to the next lower screen in the window, +or to the first screen if there are no lower screens in the window. +.Pp +.It Xo +.Op Ar count +.Aq Cm control-Y +.Xc Scroll backwards -.I count +.Ar count lines, leaving the current line and column as is, if possible. -.TP -.B "" +.Pp +.It Aq Cm control-Z Suspend the current editor session. -.TP -.B "" -Execute -.I \&ex -commands or cancel partial commands. -.TP -.B "" +.Pp +.It Aq Cm escape +Execute the +.Nm ex +command being entered, or cancel it if it is only partial. +.Pp +.It Aq Cm control-] Push a tag reference onto the tag stack. -.TP -.B "" +.Pp +.It Aq Cm control-^ Switch to the most recently edited file. -.TP -.B "[count] " -.TP -.B "[count] l" +.Pp +.It Xo +.Op Ar count +.Aq Cm space +.Xc +.It Xo +.Op Ar count +.Cm l +.Xc Move the cursor forward -.I count +.Ar count characters without changing the current line. -.TP -.B "[count] ! motion shell-argument(s)" -Replace text with results from a shell command. -.TP -.B "[count] # #|+|-" -Increment or decrement the cursor number. -.TP -.B "[count] $" +.Pp +.It Xo +.Op Ar count +.Cm !\& +.Ar motion shell-argument(s) +.Aq Li carriage-return +.Xc +Replace the lines spanned by +.Ar count +and +.Ar motion +with the output +.Pq standard output and standard error +of the program named by the +.Cm shell +option, called with a +.Fl c +flag followed by the +.Ar shell-argument(s) +.Pq bundled into a single argument . +Within +.Ar shell-argument(s) , +the +.Sq % , +.Sq # +and +.Sq !\& +characters are expanded to the current file name, +the previous current file name, +and the command text of the previous +.Cm !\& +or +.Cm :! +commands, respectively. +The special meaning of +.Sq % , +.Sq # +and +.Sq !\& +can be overridden by escaping them with a backslash. +.Pp +.It Xo +.Op Ar count +.Cm # +.Sm off +.Cm # | + | - +.Sm on +.Xc +Increment +.Pq trailing So # Sc or So + Sc +or decrement +.Pq trailing Sq - +the number under the cursor by +.Ar count , +starting at the cursor position or at the first non-blank +character following it. +Numbers with a leading +.Sq 0x +or +.Sq 0X +are interpreted as hexadecimal numbers. +Numbers with a leading +.Sq 0 +are interpreted as octal numbers unless they contain a non-octal digit. +Other numbers may be prefixed with a +.Sq + +or +.Sq - +sign. +.Pp +.It Xo +.Op Ar count +.Cm $ +.Xc Move the cursor to the end of a line. -.TP -.B "%" -Move to the matching character. -.TP -.B "&" +If +.Ar count +is specified, additionally move the cursor down +.Ar count +\- 1 lines. +.Pp +.It Cm % +Move to the +.Cm matchchars +character matching +the one found at the cursor position or the closest to the right of it. +.Pp +.It Cm & Repeat the previous substitution command on the current line. -.TP -.B "'" -.TP -.B "`" -Return to a context marked by the character -.IR . -.TP -.B "[count] (" -Back up -.I count -sentences. -.TP -.B "[count] )" -Move forward -.I count -sentences. -.TP -.B "[count] ," +.Pp +.It Xo +.Cm ' Ns Aq Ar character +.Xc +.It Xo +.Cm ` Ns Aq Ar character +.Xc +Return to the cursor position marked by the character +.Ar character , +or, if +.Ar character +is +.Sq ' +or +.Sq ` , +to the position of the cursor before the last of the following commands: +.Aq Cm control-A , +.Aq Cm control-T , +.Aq Cm control-] , +.Cm % , +.Cm ' , +.Cm ` , +.Cm (\& , +.Cm )\& , +.Cm / , +.Cm ?\& , +.Cm G , +.Cm H , +.Cm L , +.Cm [[ , +.Cm ]] , +.Cm { , +.Cm } . +The first form returns to the first non-blank character of the line marked by +.Ar character . +The second form returns to the line and column marked by +.Ar character . +.Pp +.It Xo +.Op Ar count +.Cm \&( +.Xc +.It Xo +.Op Ar count +.Cm \&) +.Xc +Move +.Ar count +sentences backward or forward, respectively. +A sentence is an area of text that begins with the first nonblank character +following the previous sentence, paragraph, or section +boundary and continues until the next period, exclamation point, +or question mark character, followed by any number of closing parentheses, +brackets, double or single quote characters, followed by +either an end-of-line or two whitespace characters. +Groups of empty lines +.Pq or lines containing only whitespace characters +are treated as a single sentence. +.Pp +.It Xo +.Op Ar count +.Cm ,\& +.Xc Reverse find character -.I count +.Pq i.e., the last Cm F , f , T No or Cm t No command +.Ar count times. -.TP -.B "[count] -" -Move to first nonblank of the previous line, -.I count +.Pp +.It Xo +.Op Ar count +.Cm - +.Xc +Move to the first non-blank character of the previous line, +.Ar count times. -.TP -.B "[count] ." +.Pp +.It Xo +.Op Ar count +.Cm .\& +.Xc Repeat the last -.I \&vi +.Nm vi command that modified text. -.TP -.B "/RE" -.TP -.B "/RE/ [offset]" -.TP -.B "?RE" -.TP -.B "?RE? [offset]" -.TP -.B "N" -.TP -.B "n" -Search forward or backward for a regular expression. -.TP -.B "0" +.Ar count +replaces both the +.Ar count +argument of the repeated command and that of the associated +.Ar motion . +If the +.Cm .\& +command repeats the +.Cm u +command, the change log is rolled forward or backward, depending on the action +of the +.Cm u +command. +.Pp +.It Xo +.Pf / Ns Ar RE +.Aq Li carriage-return +.Xc +.It Xo +.Pf / Ns Ar RE Ns / +.Op Ar offset +.Op Cm z +.Aq Li carriage-return +.Xc +.It Xo +.Pf ?\& Ns Ar RE +.Aq Li carriage-return +.Xc +.It Xo +.Pf ?\& Ns Ar RE Ns ?\& +.Op Ar offset +.Op Cm z +.Aq Li carriage-return +.Xc +.It Cm N +.It Cm n +Search forward +.Pq Sq / +or backward +.Pq Sq ?\& +for a regular expression. +.Cm n +and +.Cm N +repeat the last search in the same or opposite directions, respectively. +If +.Ar RE +is empty, the last search regular expression is used. +If +.Ar offset +is specified, the cursor is placed +.Ar offset +lines before or after the matched regular expression. +If either +.Cm n +or +.Cm N +commands are used as motion components for the +.Cm !\& +command, there will be no prompt for the text of the command and the previous +.Cm !\& +will be executed. +Multiple search patterns may be grouped together by delimiting them with +semicolons and zero or more whitespace characters. +These patterns are evaluated from left to right with the final cursor position +determined by the last search pattern. +A +.Cm z +command may be appended to the closed search expressions to reposition the +result line. +.Pp +.It Cm 0 Move to the first character in the current line. -.TP -.B ":" -Execute an ex command. -.TP -.B "[count] ;" +.Pp +.It Cm :\& +Execute an +.Nm ex +command. +.Pp +.It Xo +.Op Ar count +.Cm ;\& +.Xc Repeat the last character find -.I count +.Pq i.e., the last .Cm F , f , T No or Cm t No command +.Ar count times. -.TP -.B "[count] < motion" -.TP -.B "[count] > motion" -Shift lines left or right. -.TP -.B "@ buffer" -Execute a named buffer. -.TP -.B "[count] A" +.Pp +.It Xo +.Op Ar count +.Cm < +.Ar motion +.Xc +.It Xo +.Op Ar count +.Cm > +.Ar motion +.Xc +Shift +.Ar count +lines left or right, respectively, by an amount of +.Cm shiftwidth . +.Pp +.It Cm @ Ar buffer +Execute a named +.Ar buffer +as +.Nm vi +commands. +The buffer may include +.Nm ex +commands too, but they must be expressed as a +.Cm \&: +command. +If +.Ar buffer +is +.Sq @ +or +.Sq * , +then the last buffer executed shall be used. +.Pp +.It Xo +.Op Ar count +.Cm A +.Xc Enter input mode, appending the text after the end of the line. -.TP -.B "[count] B" +If a +.Ar count +argument is given, the characters input are repeated +.Ar count +\- 1 times after input mode is exited. +.Pp +.It Xo +.Op Ar count +.Cm B +.Xc Move backwards -.I count +.Ar count bigwords. -.TP -.B "[buffer] [count] C" +.Pp +.It Xo +.Op Ar buffer +.Cm C +.Xc Change text from the current position to the end-of-line. -.TP -.B "[buffer] D" +If +.Ar buffer +is specified, +.Dq yank +the deleted text into +.Ar buffer . +.Pp +.It Xo +.Op Ar buffer +.Cm D +.Xc Delete text from the current position to the end-of-line. -.TP -.B "[count] E" +If +.Ar buffer +is specified, +.Dq yank +the deleted text into +.Ar buffer . +.Pp +.It Xo +.Op Ar count +.Cm E +.Xc Move forward -.I count +.Ar count end-of-bigwords. -.TP -.B "[count] F " +.Pp +.It Xo +.Op Ar count +.Cm F Aq Ar character +.Xc Search -.I count +.Ar count times backward through the current line for -.IR . -.TP -.B "[count] G" +.Aq Ar character . +.Pp +.It Xo +.Op Ar count +.Cm G +.Xc Move to line -.IR count , +.Ar count , or the last line of the file if -.I count -not specified. -.TP -.B "[count] H" +.Ar count +is not specified. +.Pp +.It Xo +.Op Ar count +.Cm H +.Xc Move to the screen line -.I "count - 1" -lines below the top of the screen. -.TP -.B "[count] I" +.Ar count +\- 1 lines below the top of the screen. +.Pp +.It Xo +.Op Ar count +.Cm I +.Xc Enter input mode, inserting the text at the beginning of the line. -.TP -.B "[count] J" -Join lines. -.TP -.B "[count] L" +If a +.Ar count +argument is given, +the characters input are repeated +.Ar count +\- 1 more times. +.Pp +.It Xo +.Op Ar count +.Cm J +.Xc +Join +.Ar count +lines with the current line. +The spacing between two joined lines is set to two whitespace characters if the +former ends with a question mark, a period or an exclamation point. +It is set to one whitespace character otherwise. +.Pp +.It Xo +.Op Ar count +.Cm L +.Xc Move to the screen line -.I "count - 1" -lines above the bottom of the screen. -.TP -.B " M" +.Ar count +\- 1 lines above the bottom of the screen. +.Pp +.It Cm M Move to the screen line in the middle of the screen. -.TP -.B "[count] O" +.Pp +.It Xo +.Op Ar count +.Cm O +.Xc Enter input mode, appending text in a new line above the current line. -.TP -.B "[buffer] P" -Insert text from a buffer. -.TP -.B "Q" +If a +.Ar count +argument is given, +the characters input are repeated +.Ar count +\- 1 more times. +.Pp +.It Xo +.Op Ar buffer +.Cm P +.Xc +Insert text from +.Ar buffer +before the current column if +.Ar buffer +is character-oriented or before the current line if it is line-oriented. +.Pp +.It Cm Q Exit -.I \&vi -(or visual) mode and switch to -.I \&ex +.Nm vi +.Pq or visual +mode and switch to +.Nm ex mode. -.TP -.B "[count] R" +.Pp +.It Xo +.Op Ar count +.Cm R +.Xc Enter input mode, replacing the characters in the current line. -.TP -.B "[buffer] [count] S" +If a +.Ar count +argument is given, +the characters input are repeated +.Ar count +\- 1 more times upon exit from insert mode. +.Pp +.It Xo +.Op Ar buffer +.Op Ar count +.Cm S +.Xc Substitute -.I count +.Ar count lines. -.TP -.B "[count] T " +If +.Ar buffer +is specified, +.Dq yank +the deleted text into +.Ar buffer . +.Pp +.It Xo +.Op Ar count +.Cm T +.Aq Ar character +.Xc Search backwards, -.I count -times, -through the current line for the character -.I after -the specified -.IR . -.TP -.B "U" -Restore the current line to its state before the cursor last -moved to it. -.TP -.B "[count] W" +.Ar count +times, through the current line for the character after the specified +.Aq Ar character . +.Pp +.It Cm U +Restore the current line to its state before the cursor last moved to it. +.Pp +.It Xo +.Op Ar count +.Cm W +.Xc Move forward -.I count +.Ar count bigwords. -.TP -.B "[buffer] [count] X" +.Pp +.It Xo +.Op Ar buffer +.Op Ar count +.Cm X +.Xc Delete -.I count -characters before the cursor. -.TP -.B "[buffer] [count] Y" -Copy (or ``yank'') -.I count -lines into the specified buffer. -.TP -.B "ZZ" +.Ar count +characters before the cursor, on the current line. +If +.Ar buffer +is specified, +.Dq yank +the deleted text into +.Ar buffer . +.Pp +.It Xo +.Op Ar buffer +.Op Ar count +.Cm Y +.Xc +Copy +.Pq or Dq yank +.Ar count +lines into +.Ar buffer . +.Pp +.It Cm ZZ Write the file and exit -.IR \&vi . -.TP -.B "[count] [[" +.Nm vi +if there are no more files to edit. +Entering two +.Dq quit +commands in a row ignores any remaining file to edit. +.Pp +.It Xo +.Op Ar count +.Cm [[ +.Xc Back up -.I count +.Ar count section boundaries. -.TP -.B "[count] ]]" +.Pp +.It Xo +.Op Ar count +.Cm ]] +.Xc Move forward -.I count +.Ar count section boundaries. -.TP -.B "\&^" -Move to first nonblank character on the current line. -.TP -.B "[count] _" +.Pp +.It Cm ^ +Move to the first non-blank character on the current line. +.Pp +.It Xo +.Op Ar count +.Cm _ +.Xc Move down -.I "count - 1" -lines, to the first nonblank character. -.TP -.B "[count] a" +.Ar count +\- 1 lines, to the first non-blank character. +.Pp +.It Xo +.Op Ar count +.Cm a +.Xc Enter input mode, appending the text after the cursor. -.TP -.B "[count] b" +If a +.Ar count +argument is given, +the characters input are repeated +.Ar count +number of times. +.Pp +.It Xo +.Op Ar count +.Cm b +.Xc Move backwards -.I count +.Ar count words. -.TP -.B "[buffer] [count] c motion" -Change a region of text. -.TP -.B "[buffer] [count] d motion" -Delete a region of text. -.TP -.B "[count] e" +.Pp +.It Xo +.Op Ar buffer +.Op Ar count +.Cm c +.Ar motion +.Xc +Change the region of text described by +.Ar count +and +.Ar motion . +If +.Ar buffer +is specified, +.Dq yank +the changed text into +.Ar buffer . +.Pp +.It Xo +.Op Ar buffer +.Op Ar count +.Cm d +.Ar motion +.Xc +Delete the region of text described by +.Ar count +and +.Ar motion . +If +.Ar buffer +is specified, +.Dq yank +the deleted text into +.Ar buffer . +.Pp +.It Xo +.Op Ar count +.Cm e +.Xc Move forward -.I count +.Ar count end-of-words. -.TP -.B "[count] f" +.Pp +.It Xo +.Op Ar count +.Cm f Aq Ar character +.Xc Search forward, -.I count +.Ar count times, through the rest of the current line for -.IR . -.TP -.B "[count] i" +.Aq Ar character . +.Pp +.It Xo +.Op Ar count +.Cm i +.Xc Enter input mode, inserting the text before the cursor. -.TP -.B "m " -Save the current context (line and column) as -.IR . -.TP -.B "[count] o" +If a +.Ar count +argument is given, +the characters input are repeated +.Ar count +number of times. +.Pp +.It Xo +.Cm m +.Aq Ar character +.Xc +Save the current context +.Pq line and column +as +.Aq Ar character . +.Pp +.It Xo +.Op Ar count +.Cm o +.Xc Enter input mode, appending text in a new line under the current line. -.TP -.B "[buffer] p" -Append text from a buffer. -.TP -.B "[count] r " +If a +.Ar count +argument is given, +the characters input are repeated +.Ar count +\- 1 more times. +.Pp +.It Xo +.Op Ar buffer +.Cm p +.Xc +Append text from +.Ar buffer . +Text is appended after the current column if +.Ar buffer +is character oriented, or after the current line otherwise. +.Pp +.It Xo +.Op Ar count +.Cm r +.Aq Ar character +.Xc Replace -.I count -characters. -.TP -.B "[buffer] [count] s" +.Ar count +characters with +.Ar character . +.Pp +.It Xo +.Op Ar buffer +.Op Ar count +.Cm s +.Xc Substitute -.I count +.Ar count characters in the current line starting with the current character. -.TP -.B "[count] t " +If +.Ar buffer +is specified, +.Dq yank +the substituted text into +.Ar buffer . +.Pp +.It Xo +.Op Ar count +.Cm t +.Aq Ar character +.Xc Search forward, -.I count -times, through the current line for the character immediately -.I before -.IR . -.TP -.B "u" +.Ar count +times, through the current line for the character immediately before +.Aq Ar character . +.Pp +.It Cm u Undo the last change made to the file. -.TP -.B "[count] w" +If repeated, the +.Cm u +command alternates between these two states. +The +.Cm .\& +command, when used immediately after +.Cm u , +causes the change log to be rolled forward or backward, depending on the action +of the +.Cm u +command. +.Pp +.It Xo +.Op Ar count +.Cm w +.Xc Move forward -.I count +.Ar count words. -.TP -.B "[buffer] [count] x" +.Pp +.It Xo +.Op Ar buffer +.Op Ar count +.Cm x +.Xc Delete -.I count -characters. -.TP -.B "[buffer] [count] y motion" -Copy (or ``yank'') -a text region specified by the -.I count -and motion into a buffer. -.TP -.B "[count1] z [count2] -|.|+|^|" +.Ar count +characters at the current cursor position, but no more than there are till the +end of the line. +.Pp +.It Xo +.Op Ar buffer +.Op Ar count +.Cm y +.Ar motion +.Xc +Copy +.Pq or Dq yank +a text region specified by +.Ar count +and +.Ar motion +into a buffer. +.Pp +.It Xo +.Op Ar count1 +.Cm z +.Op Ar count2 +.Cm type +.Xc Redraw, optionally repositioning and resizing the screen. -.TP -.B "[count] {" +If +.Ar count2 +is specified, limit the screen size to +.Ar count2 +lines. +The following +.Cm type +characters may be used: +.Bl -tag -width Ds +.It Cm + +If +.Ar count1 +is specified, place the line +.Ar count1 +at the top of the screen. +Otherwise, display the screen after the current screen. +.It Aq Cm carriage-return +Place the line +.Ar count1 +at the top of the screen. +.It Cm .\& +Place the line +.Ar count1 +in the center of the screen. +.It Cm - +Place the line +.Ar count1 +at the bottom of the screen. +.It Cm ^ +If +.Ar count1 +is given, +display the screen before the screen before +.Ar count1 +.Pq i.e., 2 screens before . +Otherwise, display the screen before the current screen. +.El +.Pp +.It Xo +.Op Ar count +.Cm {\& +.Xc Move backward -.I count +.Ar count paragraphs. -.TP -.B "[count] |" +.Pp +.It Xo +.Op Ar column +.Cm |\& +.Xc Move to a specific -.I column +.Ar column position on the current line. -.TP -.B "[count] }" +If +.Ar column +is omitted, +move to the start of the current line. +.Pp +.It Xo +.Op Ar count +.Cm }\& +.Xc Move forward -.I count +.Ar count paragraphs. -.TP -.B "[count] ~" -Reverse the case of the next -.I count -character(s). -.TP -.B "[count] ~ motion" -Reverse the case of the characters in a text region specified by the -.I count +.Pp +.It Xo +.Op Ar count +.Cm ~ +.Ar motion +.Xc +If the +.Cm tildeop +option is not set, reverse the case of the next +.Ar count +character(s) and no +.Ar motion +can be specified. +Otherwise +.Ar motion +is mandatory and +.Cm ~ +reverses the case of the characters in a text region specified by the +.Ar count and -.IR motion . -.TP -.B "" +.Ar motion . +.Pp +.It Aq Cm interrupt Interrupt the current operation. -.SH VI TEXT INPUT COMMANDS -The following section describes the commands available in the text -input mode of the -.I \&vi +The +.Aq interrupt +character is usually +.Aq control-C . +.El +.Sh VI TEXT INPUT COMMANDS +The following section describes the commands available in the text input mode +of the +.Nm vi editor. -.PP -.TP -.B "" +.Pp +.Bl -tag -width Ds -compact +.It Aq Cm nul Replay the previous input. -.TP -.B "" +.Pp +.It Aq Cm control-D Erase to the previous -.B shiftwidth +.Ar shiftwidth column boundary. -.TP -.B "^" +.Pp +.It Cm ^ Ns Aq Cm control-D Erase all of the autoindent characters, and reset the autoindent level. -.TP -.B "0" +.Pp +.It Cm 0 Ns Aq Cm control-D Erase all of the autoindent characters. -.TP -.B "" +.Pp +.It Aq Cm control-T Insert sufficient -.I +.Aq tab and -.I +.Aq space characters to move forward to the next -.B shiftwidth +.Ar shiftwidth column boundary. -.TP -.B " -.TP -.B "" +.Pp +.It Aq Cm erase +.It Aq Cm control-H Erase the last character. -.TP -.B "" -Quote the next character. -.TP -.B " +.Pp +.It Aq Cm literal next +Escape the next character from any special meaning. +The +.Aq literal\ \&next +character is usually +.Aq control-V . +.Pp +.It Aq Cm escape Resolve all text input into the file, and return to command mode. -.TP -.B "" +.Pp +.It Aq Cm line erase Erase the current line. -.TP -.B "" -.TP -.B "" +.Pp +.It Aq Cm control-W +.It Aq Cm word erase Erase the last word. The definition of word is dependent on the -.B altwerase +.Cm altwerase and -.B ttywerase +.Cm ttywerase options. -.TP -.B "[0-9A-Fa-f]+" +.Pp +.Sm off +.It Xo +.Aq Cm control-X +.Bq Cm 0-9A-Fa-f +.Cm + +.Xc +.Sm on Insert a character with the specified hexadecimal value into the text. -.TP -.B "" +.Pp +.It Aq Cm interrupt Interrupt text input mode, returning to command mode. -.SH EX COMMANDS +The +.Aq interrupt +character is usually +.Aq control-C . +.El +.Sh EX COMMANDS The following section describes the commands available in the -.I \&ex +.Nm ex editor. In each entry below, the tag line is a usage synopsis for the command. -.PP -.TP -.B "" +.Pp +.Bl -tag -width Ds -compact +.It Aq Cm end-of-file Scroll the screen. -.TP -.B "! argument(s)" -.TP -.B "[range]! argument(s)" +.Pp +.It Cm !\& Ar argument(s) +.It Xo +.Op Ar range +.Cm !\& +.Ar argument(s) +.Xc Execute a shell command, or filter lines through a shell command. -.TP -.B \&" +.Pp +.It Cm \&" A comment. -.TP -.B "[range] nu[mber] [count] [flags]" -.TP -.B "[range] # [count] [flags]" +.Pp +.It Xo +.Op Ar range +.Cm nu Ns Op Cm mber +.Op Ar count +.Op Ar flags +.Xc +.It Xo +.Op Ar range +.Cm # +.Op Ar count +.Op Ar flags +.Xc Display the selected lines, each preceded with its line number. -.TP -.B "@ buffer" -.TP -.B "* buffer" +.Pp +.It Cm @ Ar buffer +.It Cm * Ar buffer Execute a buffer. -.TP -.B "[line] a[ppend][!]" +.Pp +.It Xo +.Op Ar range +.Cm < Ns Op Cm < ... +.Op Ar count +.Op Ar flags +.Xc +Shift lines left. +.Pp +.It Xo +.Op Ar line +.Cm = +.Op Ar flags +.Xc +Display the line number of +.Ar line . +If +.Ar line +is not specified, display the line number of the last line in the file. +.Pp +.It Xo +.Op Ar range +.Cm > Ns Op Cm > ... +.Op Ar count +.Op Ar flags +.Xc +Shift lines right. +.Pp +.It Xo +.Cm ab Ns Op Cm breviate +.Ar lhs rhs +.Xc +.Nm vi +only. +Add +.Ar lhs +as an abbreviation for +.Ar rhs +to the abbreviation list. +.Pp +.It Xo +.Op Ar line +.Cm a Ns Op Cm ppend Ns +.Op Cm !\& +.Xc The input text is appended after the specified line. -.TP -.B "[range] c[hange][!] [count]" +.Pp +.It Cm ar Ns Op Cm gs +Display the argument list. +.Pp +.It Cm bg +.Nm vi +only. +Background the current screen. +.Pp +.It Xo +.Op Ar range +.Cm c Ns Op Cm hange Ns +.Op Cm !\& +.Op Ar count +.Xc The input text replaces the specified range. -.TP -.B "cs[cope] add | find | help | kill | reset" +.Pp +.It Xo +.Cm chd Ns Op Cm ir Ns +.Op Cm !\& +.Op Ar directory +.Xc +.It Xo +.Cm cd Ns Op Cm !\& +.Op Ar directory +.Xc +Change the current working directory. +.Pp +.It Xo +.Op Ar range +.Cm co Ns Op Cm py +.Ar line +.Op Ar flags +.Xc +.It Xo +.Op Ar range +.Cm t +.Ar line +.Op Ar flags +.Xc +Copy the specified lines after the destination +.Ar line . +.Pp +.It Xo +.Cm cs Ns Op Cm cope +.Cm add | find | help | kill | reset +.Xc Execute a Cscope command. -.TP -.B "[range] d[elete] [buffer] [count] [flags]" +.Pp +.It Xo +.Op Ar range +.Cm d Ns Op Cm elete +.Op Ar buffer +.Op Ar count +.Op Ar flags +.Xc Delete the lines from the file. -.TP -.B "di[splay] b[uffers] | c[onnections] | s[creens] | t[ags]" +.Pp +.It Xo +.Cm di Ns Op Cm splay +.Cm b Ns Oo Cm uffers Oc | +.Cm c Ns Oo Cm onnections Oc | +.Cm s Ns Oo Cm creens Oc | +.Cm t Ns Op Cm ags +.Xc Display buffers, Cscope connections, screens or tags. -.TP -.B "[Ee][dit][!] [+cmd] [file]" -.TP -.B "[Ee]x[!] [+cmd] [file]" +.Pp +.It Xo +.Op Cm Ee Ns +.Op Cm dit Ns +.Op Cm !\& +.Op Ar +cmd +.Op Ar file +.Xc +.It Xo +.Op Cm Ee Ns +.Cm x Ns Op Cm !\& +.Op Ar +cmd +.Op Ar file +.Xc Edit a different file. -.TP -.B "exu[sage] [command]" +.Pp +.It Xo +.Cm exu Ns Op Cm sage +.Op Ar command +.Xc Display usage for an -.I \&ex +.Nm ex command. -.TP -.B "f[ile] [file]" +.Pp +.It Xo +.Cm f Ns Op Cm ile +.Op Ar file +.Xc Display and optionally change the file name. -.TP -.B "[Ff]g [name]" -.I \&Vi +.Pp +.It Xo +.Op Cm Ff Ns +.Cm g +.Op Ar name +.Xc +.Nm vi mode only. Foreground the specified screen. -.TP -.B "[range] g[lobal] /pattern/ [commands]" -.TP -.B "[range] v /pattern/ [commands]" -Apply commands to lines matching (or not matching) a pattern. -.TP -.B "he[lp]" +.Pp +.It Xo +.Op Ar range +.Cm g Ns Op Cm lobal +.No / Ns Ar pattern Ns / +.Op Ar commands +.Xc +.It Xo +.Op Ar range +.Cm v +.No / Ns Ar pattern Ns / +.Op Ar commands +.Xc +Apply commands to lines matching +.Pq Sq global +or not matching +.Pq Sq v +a pattern. +.Pp +.It Cm he Ns Op Cm lp Display a help message. -.TP -.B "[line] i[nsert][!]" +.Pp +.It Xo +.Op Ar line +.Cm i Ns Op Cm nsert Ns +.Op Cm !\& +.Xc The input text is inserted before the specified line. -.TP -.B "[range] j[oin][!] [count] [flags]" +.Pp +.It Xo +.Op Ar range +.Cm j Ns Op Cm oin Ns +.Op Cm !\& +.Op Ar count +.Op Ar flags +.Xc Join lines of text together. -.TP -.B "[range] l[ist] [count] [flags]" +.Pp +.It Xo +.Op Ar range +.Cm l Ns Op Cm ist +.Op Ar count +.Op Ar flags +.Xc Display the lines unambiguously. -.TP -.B "map[!] [lhs rhs]" -Define or display maps (for -.I \&vi -only). -.TP -.B "[line] ma[rk] " -.TP -.B "[line] k " +.Pp +.It Xo +.Cm map Ns Op Cm !\& +.Op Ar lhs rhs +.Xc +Define or display maps +.Pq for Nm vi No only . +.Pp +.It Xo +.Op Ar line +.Cm ma Ns Op Cm rk +.Aq Ar character +.Xc +.It Xo +.Op Ar line +.Cm k Aq Ar character +.Xc Mark the line with the mark -.IR . -.TP -.B "[range] m[ove] line" +.Aq Ar character . +.Pp +.It Xo +.Op Ar range +.Cm m Ns Op Cm ove +.Ar line +.Xc Move the specified lines after the target line. -.TP -.B "mk[exrc][!] file" +.Pp +.It Xo +.Cm mk Ns Op Cm exrc Ns +.Op Cm !\& +.Ar file +.Xc Write the abbreviations, editor options and maps to the specified -file. -.TP -.B "[Nn][ext][!] [file ...]" +.Ar file . +.Pp +.It Xo +.Op Cm Nn Ns +.Op Cm ext Ns +.Op Cm !\& +.Op Ar +.Xc Edit the next file from the argument list. -.TP -.B "[line] o[pen] /pattern/ [flags]" -Enter open mode. -.TP -.B "pre[serve]" +.\" .Pp +.\" .It Xo +.\" .Op Ar line +.\" .Cm o Ns Op Cm pen +.\" .No / Ns Ar pattern Ns / +.\" .Op Ar flags +.\" .Xc +.\" Enter open mode. +.Pp +.It Cm pre Ns Op Cm serve Save the file in a form that can later be recovered using the -.I \&ex -.B \-r +.Nm ex +.Fl r option. -.TP -.B "[Pp]rev[ious][!]" +.Pp +.It Xo +.Op Cm \&Pp Ns +.Cm rev Ns Op Cm ious Ns +.Op Cm !\& +.Xc Edit the previous file from the argument list. -.TP -.B "[range] p[rint] [count] [flags]" +.Pp +.It Xo +.Op Ar range +.Cm p Ns Op Cm rint +.Op Ar count +.Op Ar flags +.Xc Display the specified lines. -.TP -.B "[line] pu[t] [buffer]" +.Pp +.It Xo +.Op Ar line +.Cm pu Ns Op Cm t +.Op Ar buffer +.Xc Append buffer contents to the current line. -.TP -.B "q[uit][!]" +.Pp +.It Xo +.Cm q Ns Op Cm uit Ns +.Op Cm !\& +.Xc End the editing session. -.TP -.B "[line] r[ead][!] [file]" +.Pp +.It Xo +.Op Ar line +.Cm r Ns Op Cm ead Ns +.Op Cm !\& +.Op Ar file +.Xc Read a file. -.TP -.B "rec[over] file" +.Pp +.It Xo +.Cm rec Ns Op Cm over +.Ar file +.Xc Recover -.I file +.Ar file if it was previously saved. -.TP -.B "res[ize] [+|-]size" -.I \&Vi +.Pp +.It Xo +.Cm res Ns Op Cm ize +.Op Cm + Ns | Ns Cm - Ns +.Ar size +.Xc +.Nm vi mode only. Grow or shrink the current screen. -.TP -.B "rew[ind][!]" +.Pp +.It Xo +.Cm rew Ns Op Cm ind Ns +.Op Cm !\& +.Xc Rewind the argument list. -.TP -.B "se[t] [option[=[value]] ...] [nooption ...] [option? ...] [all]" +.Pp +.It Xo +.Cm se Ns Op Cm t +.Sm off +.Op option Oo = Oo value Oc Oc \ \&... +.Sm on +.Pf \ \& Op nooption ... +.Op option? ... +.Op Ar all +.Xc Display or set editor options. -.TP -.B "sh[ell]" +.Pp +.It Cm sh Ns Op Cm ell Run a shell program. -.TP -.B "so[urce] file" +.Pp +.It Xo +.Cm so Ns Op Cm urce +.Ar file +.Xc Read and execute -.I \&ex +.Nm ex commands from a file. -.TP -.B "[range] s[ubstitute] [/pattern/replace/] [options] [count] [flags]" -.TP -.B "[range] & [options] [count] [flags]" -.TP -.B "[range] ~ [options] [count] [flags]" +.Pp +.It Xo +.Op Ar range +.Cm s Ns Op Cm ubstitute +.Sm off +.Op / Ar pattern No / Ar replace No / +.Sm on +.Pf \ \& Op Ar options +.Op Ar count +.Op Ar flags +.Xc +.It Xo +.Op Ar range +.Cm & +.Op Ar options +.Op Ar count +.Op Ar flags +.Xc +.It Xo +.Op Ar range +.Cm ~ +.Op Ar options +.Op Ar count +.Op Ar flags +.Xc Make substitutions. -.TP -.B "su[spend][!]" -.TP -.B "st[op][!]" -.TP -.B +The +.Ar replace +field may contain any of the following sequences: +.Bl -tag -width Ds +.It Sq \*(Am +The text matched by +.Ar pattern . +.It Sq \(a~ +The replacement part of the previous +.Cm substitute +command. +.It Sq % +If this is the entire +.Ar replace +pattern, the replacement part of the previous +.Cm substitute +command. +.It Sq \e\(sh +Where +.Sq \(sh +is an integer from 1 to 9, the text matched by the #'th subexpression in +.Ar pattern . +.It Sq \eL +Causes the characters up to the end of the line of the next occurrence of +.Sq \eE +or +.Sq \ee +to be converted to lowercase. +.It Sq \el +Causes the next character to be converted to lowercase. +.It Sq \eU +Causes the characters up to the end of the line of the next occurrence of +.Sq \eE +or +.Sq \ee +to be converted to uppercase. +.It Sq \eu +Causes the next character to be converted to uppercase. +.El +.Pp +.It Xo +.Cm su Ns Op Cm spend Ns +.Op Cm !\& +.Xc +.It Xo +.Cm st Ns Op Cm op Ns +.Op Cm !\& +.Xc +.It Aq Cm suspend Suspend the edit session. -.TP -.B "[Tt]a[g][!] tagstring" +The +.Aq suspend +character is usually +.Aq control-Z . +.Pp +.It Xo +.Op Cm Tt Ns +.Cm a Ns Op Cm g Ns +.Op Cm !\& +.Ar tagstring +.Xc Edit the file containing the specified tag. -.TP -.B "tagn[ext][!]" +.Pp +.It Xo +.Cm tagn Ns Op Cm ext Ns +.Op Cm !\& +.Xc Edit the file containing the next context for the current tag. -.TP -.B "tagp[op][!] [file | number]" +.Pp +.It Xo +.Cm tagp Ns Op Cm op Ns +.Op Cm !\& +.Op Ar file | number +.Xc Pop to the specified tag in the tags stack. -.TP -.B "tagp[rev][!]" +.Pp +.It Xo +.Cm tagpr Ns Op Cm ev Ns +.Op Cm !\& +.Xc Edit the file containing the previous context for the current tag. -.TP -.B "unm[ap][!] lhs" +.Pp +.It Xo +.Cm tagt Ns Op Cm op Ns +.Op Cm !\& +.Xc +Pop to the least recent tag on the tags stack, clearing the stack. +.Pp +.It Xo +.Cm una Ns Op Cm bbreviate +.Ar lhs +.Xc +.Nm vi +only. +Delete an abbreviation. +.Pp +.It Cm u Ns Op Cm ndo +Undo the last change made to the file. +.Pp +.It Xo +.Cm unm Ns Op Cm ap Ns +.Op Cm !\& +.Ar lhs +.Xc Unmap a mapped string. -.TP -.B "ve[rsion]" +.Pp +.It Cm ve Ns Op Cm rsion Display the version of the -.I \&ex/vi +.Nm ex Ns / Ns Nm vi editor. -.TP -.B "[line] vi[sual] [type] [count] [flags]" -.I \&Ex +.Pp +.It Xo +.Op Ar line +.Cm vi Ns Op Cm sual +.Op Ar type +.Op Ar count +.Op Ar flags +.Xc +.Nm ex mode only. Enter -.IR \&vi . -.TP -.B "[Vi]i[sual][!] [+cmd] [file]" -.I \&Vi +.Nm vi . +.Pp +.It Xo +.Op Cm Vi Ns +.Cm i Ns Op Cm sual Ns +.Op Cm !\& +.Op Ar +cmd +.Op Ar file +.Xc +.Nm vi mode only. Edit a new file. -.TP -.B "viu[sage] [command]" +.Pp +.It Xo +.Cm viu Ns Op Cm sage +.Op Ar command +.Xc Display usage for a -.I \&vi +.Nm vi command. -.TP -.B "[range] w[rite][!] [>>] [file]" -.TP -.B "[range] w[rite] [!] [file]" -.TP -.B "[range] wn[!] [>>] [file]" -.TP -.B "[range] wq[!] [>>] [file]" +.Pp +.It Xo +.Op Ar range +.Cm w Ns Op Cm rite Ns +.Op Cm !\& +.Op >> +.Op Ar file +.Xc +.It Xo +.Op Ar range +.Cm w Ns Op Cm rite +.Op Cm !\& +.Op Ar file +.Xc +.It Xo +.Op Ar range +.Cm wn Ns Op Cm !\& +.Op >> +.Op Ar file +.Xc +.It Xo +.Op Ar range +.Cm wq Ns Op Cm !\& +.Op >> +.Op Ar file +.Xc Write the file. -.TP -.B "[range] x[it][!] [file]" -Write the file if it has been modified. -.TP -.B "[range] ya[nk] [buffer] [count]" +.Pp +.It Xo +.Op Ar range +.Cm x Ns Op Cm it Ns +.Op Cm !\& +.Op Ar file +.Xc +Exit the editor, +writing the file if it has been modified. +.Pp +.It Xo +.Op Ar range +.Cm ya Ns Op Cm nk +.Op Ar buffer +.Op Ar count +.Xc Copy the specified lines to a buffer. -.TP -.B "[line] z [type] [count] [flags]" +.Pp +.It Xo +.Op Ar line +.Cm z +.Op Ar type +.Op Ar count +.Op Ar flags +.Xc Adjust the window. -.SH SET OPTIONS -There are a large number of options that may be set (or unset) to -change the editor's behavior. +.El +.Sh SET OPTIONS +There are a large number of options that may be set +.Pq or unset +to change the editor's behavior. This section describes the options, their abbreviations and their default values. -.PP +.Pp In each entry below, the first part of the tag line is the full name of the option, followed by any equivalent abbreviations. The part in square brackets is the default value of the option. -Most of the options are boolean, i.e. they are either on or off, +Most of the options are boolean, i.e., they are either on or off, and do not have an associated value. -.PP +.Pp Options apply to both -.I \&ex +.Nm ex and -.I \&vi +.Nm vi modes, unless otherwise specified. -.PP -.TP -.B "altwerase [off]" -.I \&Vi +.Bl -tag -width Ds +.It Cm altwerase Bq off +.Nm vi only. Select an alternate word erase algorithm. -.TP -.B "autoindent, ai [off]" +.It Cm autoindent , ai Bq off Automatically indent new lines. -.TP -.B "autoprint, ap [off]" -.I \&Ex +.It Cm autoprint , ap Bq on +.Nm ex only. Display the current line automatically. -.TP -.B "autowrite, aw [off]" -Write modified files automatically when changing files. -.\" I cannot get a double quote to print between the square brackets -.\" to save my life. The ONLY way I've been able to get this to work -.\" is with the .tr command. -.tr Q" -.ds ms backup [QQ] -.TP -.B "\*(ms" -.tr QQ -Backup files before they are overwritten. -.TP -.B "beautify, bf [off]" +.It Cm autowrite , aw Bq off +Write modified files automatically when changing files or suspending the editor +session. +.It Cm backup Bq \&"\&" +Back up files before they are overwritten. +.It Cm beautify , bf Bq off Discard control characters. -.TP -.B "cdpath [environment variable CDPATH, or current directory]" +.It Cm cdpath Bq "environment variable CDPATH, or current directory" The directory paths used as path prefixes for the -.B cd +.Cm cd command. -.TP -.B "cedit [no default]" +.It Cm cedit Bq no default Set the character to edit the colon command-line history. -.TP -.B "columns, co [80]" +.It Cm columns , co Bq 80 Set the number of columns in the screen. -.TP -.B "comment [off]" -.I \&Vi +.It Cm comment Bq off +.Nm vi only. Skip leading comments in shell, C and C++ language files. -.TP -.B "directory, dir [environment variable TMPDIR, or /tmp]" +.It Cm directory , dir Bq "environment variable TMPDIR, or /tmp" The directory where temporary files are created. -.TP -.B "edcompatible, ed [off]" -Remember the values of the ``c'' and ``g'' suffices to the -.B substitute -commands, instead of initializing them as unset for each new -command. -.TP -.B "errorbells, eb [off]" -.I \&Ex +.It Cm edcompatible , ed Bq off +Remember the values of the +.Sq c +and +.Sq g +suffixes to the +.Cm substitute +commands, instead of initializing them as unset for each new command. +.It Cm errorbells , eb Bq off +.Nm ex only. Announce error messages with a bell. -.TP -.B "exrc, ex [off]" +.It Cm escapetime Bq 1 +The tenths of a second +.Nm ex Ns / Ns Nm vi +waits for a subsequent key to complete an +.Aq escape +key mapping. +.It Cm exrc , ex Bq off Read the startup files in the local directory. -.TP -.B "extended [off]" -Regular expressions are extended (i.e. -.IR egrep (1)\-\c -style) expressions. -.TP -.B "filec []" -Set the character to perform file path completion on the colon -command line. -.TP -.B "fileencoding, fe [auto detect]" +.It Cm extended Bq off +Use extended regular expressions +.Pq EREs +rather than basic regular expressions +.Pq BREs . +See +.Xr re_format 7 +for more information on regular expressions. +.It Cm filec Bq Aq tab +Set the character to perform file path completion on the colon command line. +.It Cm fileencoding , fe Bq auto detect Set the encoding of the current file. -.TP -.B "flash [on]" +.It Cm flash Bq on Flash the screen instead of beeping the keyboard on error. -.TP -.B "hardtabs, ht [8]" +.It Cm hardtabs, ht Bq 0 Set the spacing between hardware tab settings. -.TP -.B "iclower [off]" -Makes all Regular Expressions case-insensitive, +This option currently has no effect. +.It Cm iclower Bq off +Makes all regular expressions case-insensitive, as long as an upper-case letter does not appear in the search string. -.TP -.B "ignorecase, ic [off]" +.It Cm ignorecase , ic Bq off Ignore case differences in regular expressions. -.TP -.B "inputencoding, ie [locale]" +.It Cm inputencoding , ie Bq locale Set the encoding of your input characters. -.TP -.B "keytime [6]" -The 10th's of a second -.I ex/vi +.It Cm keytime Bq 6 +The tenths of a second +.Nm ex Ns / Ns Nm vi waits for a subsequent key to complete a key mapping. -.TP -.B "leftright [off]" -.I \&Vi +.It Cm leftright Bq off +.Nm vi only. Do left-right scrolling. -.TP -.B "lines, li [24]" -.I \&Vi +.It Cm lines , li Bq 24 +.Nm vi only. Set the number of lines in the screen. -.TP -.B "lisp [off]" -.I \&Vi +.It Cm lisp Bq off +.Nm vi only. Modify various search commands and options to work with Lisp. -.I "This option is not yet implemented." -.TP -.B "list [off]" +This option is not yet implemented. +.It Cm list Bq off Display lines in an unambiguous fashion. -.TP -.B "lock [on]" -Attempt to get an exclusive lock on any file being edited, -read or written. -.TP -.B "magic [on]" -Treat certain characters specially in regular expressions. -.TP -.B "matchchars [[]{}()]" +.It Cm lock Bq on +Attempt to get an exclusive lock on any file being edited, read or written. +.It Cm magic Bq on +When turned off, all regular expression characters except for +.Sq \(ha +and +.Sq \(Do +are treated as ordinary characters. +Preceding individual characters by +.Sq \e +re-enables them. +.It Cm matchchars Bq []{}() Character pairs looked for by the -.B % +.Cm % command. -.TP -.B "matchtime [7]" -.I \&Vi +.It Cm matchtime Bq 7 +.Nm vi only. -The 10th's of a second -.I ex/vi +The tenths of a second +.Nm ex Ns / Ns Nm vi pauses on the matching character when the -.B showmatch +.Cm showmatch option is set. -.TP -.B "mesg [on]" +.It Cm mesg Bq on Permit messages from other users. -.TP -.B "modelines, modeline [off]" +.It Cm msgcat Bq /usr/share/vi/catalog/ +Selects a message catalog to be used to display error and informational +messages in a specified language. +.It Cm modelines , modeline Bq off Read the first and last few lines of each file for -.I ex +.Nm ex commands. -.I "This option will never be implemented." -.\" I cannot get a double quote to print between the square brackets -.\" to save my life. The ONLY way I've been able to get this to work -.\" is with the .tr command. -.tr Q" -.ds ms noprint [QQ] -.TP -.B "\*(ms" -.tr QQ +This option will never be implemented. +.It Cm noprint Bq \&"\&" Characters that are never handled as printable characters. -.TP -.B "number, nu [off]" +.It Cm number , nu Bq off Precede each line displayed with its current line number. -.TP -.B "octal [off]" +.It Cm octal Bq off Display unknown characters as octal numbers, instead of the default hexadecimal. -.TP -.B "open [on]" -.I \&Ex +.It Cm open Bq on +.Nm ex only. If this option is not set, the -.B open +.Cm open and -.B visual +.Cm visual commands are disallowed. -.TP -.B "optimize, opt [on]" -.I \&Vi +.It Cm optimize , opt Bq on +.Nm vi only. Optimize text throughput to dumb terminals. -.I "This option is not yet implemented." -.TP -.B "paragraphs, para [IPLPPPQPP LIpplpipbp]" -.I \&Vi +This option is not yet implemented. +.It Cm paragraphs , para Bq "IPLPPPQPP LIpplpipbp" +.Nm vi only. Define additional paragraph boundaries for the -.B \&{ +.Cm {\& and -.B \&} +.Cm }\& commands. -.TP -.B "path []" +.It Cm path Bq \&"\&" Define additional directories to search for files being edited. -.\" I cannot get a double quote to print between the square brackets -.\" to save my life. The ONLY way I've been able to get this to work -.\" is with the .tr command. -.tr Q" -.ds ms print [QQ] -.TP -.B "\*(ms" -.tr QQ +.It Cm print Bq \&"\&" Characters that are always handled as printable characters. -.TP -.B "prompt [on]" -.I \&Ex +.It Cm prompt Bq on +.Nm ex only. Display a command prompt. -.TP -.B "readonly, ro [off]" +.It Cm readonly , ro Bq off Mark the file and session as read-only. -.TP -.B "recdir [/var/tmp/vi.recover]" +.It Cm recdir Bq /var/tmp/vi.recover The directory where recovery files are stored. -.TP -.B "redraw, re [off]" -.I \&Vi +.It Cm redraw , re Bq off +.Nm vi only. Simulate an intelligent terminal on a dumb one. -.I "This option is not yet implemented." -.TP -.B "remap [on]" +This option is not yet implemented. +.It Cm remap Bq on Remap keys until resolved. -.TP -.B "report [5]" -Set the number of lines about which the editor reports changes -or yanks. -.TP -.B "ruler [off]" -.I \&Vi +.It Cm report Bq 5 +Set the number of lines about which the editor reports changes or yanks. +.It Cm ruler Bq off +.Nm vi only. Display a row/column ruler on the colon command line. -.TP -.B "scroll, scr [window / 2]" +.It Cm scroll , scr Bq "window size / 2" Set the number of lines scrolled. -.TP -.B "searchincr [off]" +.It Cm searchincr Bq off Makes the -.B \&/ +.Cm / and -.B \&? +.Cm ?\& commands incremental. -.TP -.B "sections, sect [NHSHH HUnhsh]" -.I \&Vi +.It Cm sections , sect Bq "NHSHH HUnhsh" +.Nm vi only. Define additional section boundaries for the -.B \&[[ +.Cm [[ and -.B \&]] +.Cm ]] commands. -.TP -.B "secure [off]" +.It Cm secure Bq off Turns off all access to external programs. -.TP -.B "shell, sh [environment variable SHELL, or /bin/sh]" +.It Cm shell , sh Bq "environment variable SHELL, or /bin/sh" Select the shell used by the editor. -.\" I cannot get a double quote to print between the square brackets -.\" to save my life. The ONLY way I've been able to get this to work -.\" is with the .tr command. -.tr Q" -.ds ms shellmeta [~{[*?$`'Q\e] -.TP -.B "\*(ms" -.tr QQ +.It Cm shellmeta Bq ~{[*?$`'\&"\e Set the meta characters checked to determine if file name expansion is necessary. -.TP -.B "shiftwidth, sw [8]" +.It Cm shiftwidth , sw Bq 8 Set the autoindent and shift command indentation width. -.TP -.B "showmatch, sm [off]" -.I \&Vi +.It Cm showmatch , sm Bq off +.Nm vi only. Note the left matching characters when the right ones are inserted. -.TP -.B "showmode, smd [off]" -.I \&Vi +.It Cm showmode , smd Bq off +.Nm vi only. -Display the current editor mode and a ``modified'' flag. -.TP -.B "sidescroll [16]" -.I \&Vi +Display the current editor mode and a +.Dq modified +flag. +.It Cm sidescroll Bq 16 +.Nm vi only. Set the amount a left-right scroll will shift. -.TP -.B "slowopen, slow [off]" +.It Cm slowopen , slow Bq off Delay display updating during text input. -.I "This option is not yet implemented." -.TP -.B "sourceany [off]" +This option is not yet implemented. +.It Cm sourceany Bq off Read startup files not owned by the current user. -.I "This option will never be implemented." -.TP -.B "tabstop, ts [8]" +This option will never be implemented. +.It Cm tabstop , ts Bq 8 This option sets tab widths for the editor display. -.TP -.B "taglength, tl [0]" +.It Cm taglength , tl Bq 0 Set the number of significant characters in tag names. -.TP -.B "tags, tag [tags /var/db/libc.tags /sys/kern/tags]" +.It Cm tags , tag Bq tags Set the list of tags files. -.TP -.B "term, ttytype, tty [environment variable TERM]" +.It Xo +.Cm term , ttytype , tty +.Bq "environment variable TERM" +.Xc Set the terminal type. -.TP -.B "terse [off]" +.It Cm terse Bq off This option has historically made editor messages less verbose. It has no effect in this implementation. -.TP -.B "tildeop [off]" +.It Cm tildeop Bq off Modify the -.B \&~ +.Cm ~ command to take an associated motion. -.TP -.B "timeout, to [on]" +.It Cm timeout , to Bq on Time out on keys which may be mapped. -.TP -.B "ttywerase [off]" -.I \&Vi +.It Cm ttywerase Bq off +.Nm vi only. Select an alternate erase algorithm. -.TP -.B "verbose [off]" -.I \&Vi +.It Cm verbose Bq off +.Nm vi only. Display an error message for every error. -.TP -.B "w300 [no default]" -.I \&Vi +.It Cm w300 Bq no default +.Nm vi only. Set the window size if the baud rate is less than 1200 baud. -.TP -.B "w1200 [no default]" -.I \&Vi +.It Cm w1200 Bq no default +.Nm vi only. Set the window size if the baud rate is equal to 1200 baud. -.TP -.B "w9600 [no default]" -.I \&Vi +.It Cm w9600 Bq no default +.Nm vi only. Set the window size if the baud rate is greater than 1200 baud. -.TP -.B "warn [on]" -.I \&Ex +.It Cm warn Bq on +.Nm ex only. -This option causes a warning message to the terminal if the file has -been modified, since it was last written, before a -.B \&! +This option causes a warning message to be printed on the terminal +if the file has been modified since it was last written, before a +.Cm !\& command. -.TP -.B "window, w, wi [environment variable LINES]" +.It Xo +.Cm window , w , wi +.Bq "environment variable LINES \- 1" +.Xc Set the window size for the screen. -.TP -.B "windowname [off]" +.It Cm windowname Bq off Change the icon/window name to the current file name. -.TP -.B "wraplen, wl [0]" -.I \&Vi +.It Cm wraplen , wl Bq 0 +.Nm vi only. -Break lines automatically, the specified number of columns from the -left-hand margin. +Break lines automatically, +the specified number of columns from the left-hand margin. If both the -.B wraplen +.Cm wraplen and -.B wrapmargin +.Cm wrapmargin edit options are set, the -.B wrapmargin +.Cm wrapmargin value is used. -.TP -.B "wrapmargin, wm [0]" -.I \&Vi +.It Cm wrapmargin , wm Bq 0 +.Nm vi only. -Break lines automatically, the specified number of columns from the -right-hand margin. +Break lines automatically, +the specified number of columns from the right-hand margin. If both the -.B wraplen +.Cm wraplen and -.B wrapmargin +.Cm wrapmargin edit options are set, the -.B wrapmargin +.Cm wrapmargin value is used. -.TP -.B "wrapscan, ws [on]" +.It Cm wrapscan , ws Bq on Set searches to wrap around the end or beginning of the file. -.TP -.B "writeany, wa [off]" +.It Cm writeany , wa Bq off Turn off file-overwriting checks. -.SH ENVIRONMENT VARIABLES -.TP -.I COLUMNS +.El +.Sh ENVIRONMENT +.Bl -tag -width "COLUMNS" +.It Ev COLUMNS The number of columns on the screen. This value overrides any system or terminal specific values. If the -.I COLUMNS +.Ev COLUMNS environment variable is not set when -.I ex/vi +.Nm ex Ns / Ns Nm vi runs, or the -.B columns +.Cm columns option is explicitly reset by the user, -.I ex/vi +.Nm ex Ns / Ns Nm vi enters the value into the environment. -.TP -.I EXINIT +.It Ev EXINIT A list of -.I \&ex -startup commands, read if the variable -.I NEXINIT -is not set. -.TP -.I HOME -The user's home directory, used as the initial directory path -for the startup ``$\fIHOME\fP/.nexrc'' and ``$\fIHOME\fP/.exrc'' +.Nm ex +startup commands, read after +.Pa /etc/vi.exrc +unless the variable +.Ev NEXINIT +is also set. +.It Ev HOME +The user's home directory, used as the initial directory path for the startup +.Pa $HOME/.nexrc +and +.Pa $HOME/.exrc files. This value is also used as the default directory for the -.I \&vi -.B \&cd +.Cm cd command. -.TP -.I LINES +.It Ev LINES The number of rows on the screen. This value overrides any system or terminal specific values. If the -.I LINES +.Ev LINES environment variable is not set when -.I ex/vi +.Nm ex Ns / Ns Nm vi runs, or the -.B lines +.Cm lines option is explicitly reset by the user, -.I ex/vi +.Nm ex Ns / Ns Nm vi enters the value into the environment. -.TP -.I NEXINIT +.It Ev NEXINIT A list of -.I \&ex -startup commands. -.TP -.I SHELL -The user's shell of choice (see also the -.B shell -option). -.TP -.I TERM +.Nm ex +startup commands, read after +.Pa /etc/vi.exrc . +.It Ev SHELL +The user's shell of choice +.Pq see also the Cm shell No option . +.It Ev TERM The user's terminal type. -The default is the type ``unknown''. +The default is the type +.Dq unknown . If the -.I TERM +.Ev TERM environment variable is not set when -.I ex/vi +.Nm ex Ns / Ns Nm vi runs, or the -.B term +.Cm term option is explicitly reset by the user, -.I ex/vi +.Nm ex Ns / Ns Nm vi enters the value into the environment. -.TP -.I TMPDIR -The location used to stored temporary files (see also the -.B directory -edit option). -.SH ASYNCHRONOUS EVENTS -.TP -SIGALRM -.I \&Vi/ex -uses this signal for periodic backups of file modifications and to -display ``busy'' messages when operations are likely to take a long time. -.TP -SIGHUP -.TP -SIGTERM -If the current buffer has changed since it was last written in its -entirety, the editor attempts to save the modified file so it can -be later recovered. +.It Ev TMPDIR +The location used to store temporary files +.Pq see also the Cm directory No edit option . +.El +.Sh ASYNCHRONOUS EVENTS +.Bl -tag -width "SIGWINCH" -compact +.It Dv SIGALRM +.Nm vi Ns / Ns Nm ex +uses this signal for periodic backups of file modifications and to display +.Dq busy +messages when operations are likely to take a long time. +.Pp +.It Dv SIGHUP +.It Dv SIGTERM +If the current buffer has changed since it was last written in its entirety, +the editor attempts to save the modified file so it can be later recovered. See the -.I \&vi/ex -Reference manual section entitled ``Recovery'' for more information. -.TP -SIGINT -When an interrupt occurs, -the current operation is halted, +.Nm vi Ns / Ns Nm ex +reference manual section +.Sx Recovery +for more information. +.Pp +.It Dv SIGINT +When an interrupt occurs, the current operation is halted and the editor returns to the command level. If interrupted during text input, the text already input is resolved into the file as if the text input had been normally terminated. -.TP -SIGWINCH +.Pp +.It Dv SIGWINCH The screen is resized. See the -.I \&vi/ex -Reference manual section entitled ``Sizing the Screen'' for more information. -.TP -SIGCONT -.TP -SIGQUIT -.TP -SIGTSTP -.I \&Vi/ex -ignores these signals. -.SH FILES -.TP -/bin/sh +.Nm vi Ns / Ns Nm ex +reference manual section +.Sx Sizing the Screen +for more information. +.\" .Pp +.\" .It Dv SIGCONT +.\" .It Dv SIGTSTP +.\" .Nm vi Ns / Ns Nm ex +.\" ignores these signals. +.El +.Sh FILES +.Bl -tag -width "/var/tmp/vi.recover" +.It Pa /bin/sh The default user shell. -.TP -/etc/vi.exrc -System-wide vi startup file. -.TP -/tmp +.It Pa /etc/vi.exrc +System-wide +.Nm vi +startup file. +It is read for +.Nm ex +commands first in the startup sequence. +Must be owned by root or the user, +and writable only by the owner. +.It Pa /tmp Temporary file directory. -.TP -/var/tmp/vi.recover +.It Pa /var/tmp/vi.recover The default recovery file directory. -.TP -$HOME/.nexrc -1st choice for user's home directory startup file. -.TP -$HOME/.exrc -2nd choice for user's home directory startup file. -.TP -\&.nexrc -1st choice for local directory startup file. -.TP -\&.exrc -2nd choice for local directory startup file. -.SH SEE ALSO -.IR ctags (1), -.IR iconv (1), -.IR more (1), -.IR curses (3), -.IR dbopen (3) -.sp -``UNIX User's Manual Supplementary Documents: Text Editing''. -.SH HISTORY +.It Pa $HOME/.nexrc +First choice for user's home directory startup file, read for +.Nm ex +commands right after +.Pa /etc/vi.exrc +unless either +.Ev NEXINIT +or +.Ev EXINIT +are set. +Must be owned by root or the user, +and writable only by the owner. +.It Pa $HOME/.exrc +Second choice for user's home directory startup file, read for +.Nm ex +commands under the same conditions as +.Pa $HOME/.nexrc . +.It Pa .nexrc +First choice for local directory startup file, read for +.Nm ex +commands at the end of the startup sequence if the +.Cm exrc +option was turned on earlier. +Must be owned by the user +and writable only by the owner. +.It Pa .exrc +Second choice for local directory startup file, read for +.Nm ex +commands under the same conditions as +.Pa .nexrc . +.El +.Sh EXIT STATUS The -.I nex/nvi -replacements for the -.I ex/vi -editor first appeared in 4.4BSD. -.SH STANDARDS -.I \&Nex/nvi -is close to IEEE Std1003.2 (``POSIX''). +.Nm ex +and +.Nm vi +utilities exit 0 on success, +and \*(Gt0 if an error occurs. +.Sh SEE ALSO +.Xr ctags 1 , +.Xr iconv 1 , +.Xr re_format 7 +.Sh STANDARDS +.Nm nex Ns / Ns Nm nvi +is close to +.St -p1003.1-2008 . That document differs from historical -.I ex/vi +.Nm ex Ns / Ns Nm vi practice in several places; there are changes to be made on both sides. +.Sh HISTORY +The +.Nm ex +editor first appeared in +.Bx 1 . +The +.Nm nex Ns / Ns Nm nvi +replacements for the +.Nm ex Ns / Ns Nm vi +editor first appeared in +.Bx 4.4 . +.Sh AUTHORS +.An Bill Joy +wrote the original version of +.Nm ex +in 1977. diff --git a/ex/ex_print.c b/ex/ex_print.c index 2c9208aa6729..5903e9711ee5 100644 --- a/ex/ex_print.c +++ b/ex/ex_print.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "$Id: ex_print.c,v 10.25 2011/12/12 22:12:20 zy Exp $"; +static const char sccsid[] = "$Id: ex_print.c,v 10.26 2013/11/02 02:11:07 zy Exp $"; #endif /* not lint */ #include @@ -213,7 +213,7 @@ ex_prchars(SCR *sp, const CHAR_T *p, size_t *colp, size_t len, gp = sp->gp; ts = O_VAL(sp, O_TABSTOP); for (col = *colp; len--;) - if ((ch = *p++) == '\t' && !LF_ISSET(E_C_LIST)) + if ((ch = *p++) == L('\t') && !LF_ISSET(E_C_LIST)) for (tlen = ts - col % ts; col < sp->cols && tlen--; ++col) { (void)ex_printf(sp, @@ -223,21 +223,32 @@ ex_prchars(SCR *sp, const CHAR_T *p, size_t *colp, size_t len, } else { kp = KEY_NAME(sp, ch); - tlen = KEY_LEN(sp, ch); - if (!repeatc && col + tlen < sp->cols) { + tlen = KEY_COL(sp, ch); + + /* + * Start a new line if the last character does not fit + * into the current line. The implicit new lines are + * not interruptible. + */ + if (col + tlen > sp->cols) { + col = 0; + (void)ex_puts(sp, "\n"); + } + + col += tlen; + if (!repeatc) { (void)ex_puts(sp, kp); - col += tlen; - } else - for (; tlen--; ++kp, ++col) { - if (col == sp->cols) { - col = 0; - (void)ex_puts(sp, "\n"); - } - (void)ex_printf(sp, - "%c", repeatc ? repeatc : *kp); - if (INTERRUPTED(sp)) - goto intr; - } + if (INTERRUPTED(sp)) + goto intr; + } else while (tlen--) { + (void)ex_printf(sp, "%c", repeatc); + if (INTERRUPTED(sp)) + goto intr; + } + if (col == sp->cols) { + col = 0; + (void)ex_puts(sp, "\n"); + } } intr: *colp = col; return (0); diff --git a/vi/v_txt.c b/vi/v_txt.c index e81e34880e2b..1348b278979b 100644 --- a/vi/v_txt.c +++ b/vi/v_txt.c @@ -295,7 +295,8 @@ v_txt( tiqh = sp->tiq; if (!TAILQ_EMPTY(tiqh)) { tp = TAILQ_FIRST(tiqh); - if (TAILQ_NEXT(tp, q) != NULL || tp->lb_len < len + 32) { + if (TAILQ_NEXT(tp, q) != NULL || + tp->lb_len < (len + 32) * sizeof(CHAR_T)) { text_lfree(tiqh); goto newtp; } diff --git a/vi/vs_refresh.c b/vi/vs_refresh.c index 98b66c492d1f..8343b8041c29 100644 --- a/vi/vs_refresh.c +++ b/vi/vs_refresh.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "$Id: vs_refresh.c,v 10.52 2011/12/16 11:06:25 zy Exp $"; +static const char sccsid[] = "$Id: vs_refresh.c,v 10.53 2013/11/01 11:57:36 zy Exp $"; #endif /* not lint */ #include @@ -331,7 +331,8 @@ small_fill: (void)gp->scr_move(sp, LASTLINE(sp), 0); if (vs_sm_1down(sp)) return (1); goto adjust; - } + } else + goto top; /* XXX No such line. */ /* * If less than a half screen from the bottom of the file, From 26f97c99d0d4ef7c06e3e6b6f6987e597b285993 Mon Sep 17 00:00:00 2001 From: peter Date: Sun, 8 Dec 2013 00:04:25 +0000 Subject: [PATCH 5/6] Import nvi2 as of c80f493, including: Fix cleanup multikey mappgs (FreeBSD bin/182463) --- cl/cl_term.c | 12 ++++++++---- common/key.c | 4 ++-- common/key.h | 10 ++++++---- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/cl/cl_term.c b/cl/cl_term.c index 3d8cdb2e2b52..7e8f6c7735a2 100644 --- a/cl/cl_term.c +++ b/cl/cl_term.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "$Id: cl_term.c,v 10.33 2012/04/21 23:51:46 zy Exp $"; +static const char sccsid[] = "$Id: cl_term.c,v 10.34 2013/12/07 16:21:14 wjenkner Exp $"; #endif /* not lint */ #include @@ -187,14 +187,18 @@ cl_term_init(SCR *sp) int cl_term_end(GS *gp) { - SEQ *qp, *nqp; + SEQ *qp, *nqp, *pre_qp = NULL; /* Delete screen specific mappings. */ SLIST_FOREACH_SAFE(qp, gp->seqq, q, nqp) if (F_ISSET(qp, SEQ_SCREEN)) { - SLIST_REMOVE_HEAD(gp->seqq, q); + if (qp == SLIST_FIRST(gp->seqq)) + SLIST_REMOVE_HEAD(gp->seqq, q); + else + SLIST_REMOVE_AFTER(pre_qp, q); (void)seq_free(qp); - } + } else + pre_qp = qp; return (0); } diff --git a/common/key.c b/common/key.c index 652b8f3eae00..9fc20b73d940 100644 --- a/common/key.c +++ b/common/key.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "$Id: key.c,v 10.53 2013/03/11 01:20:53 yamt Exp $"; +static const char sccsid[] = "$Id: key.c,v 10.54 2013/11/13 12:15:27 zy Exp $"; #endif /* not lint */ #include @@ -272,7 +272,7 @@ v_key_name( * The code prints non-printable wide characters in 4 or 5 digits * Unicode escape sequences, so only supports plane 0 to 15. */ - if (ISPRINT(ach)) + if (CAN_PRINT(sp, ach)) goto done; nopr: if (iscntrl(ch) && (ch < 0x20 || ch == 0x7f)) { sp->cname[0] = '^'; diff --git a/common/key.h b/common/key.h index 3eeca124a00a..43cef77a4af5 100644 --- a/common/key.h +++ b/common/key.h @@ -6,7 +6,7 @@ * * See the LICENSE file for redistribution information. * - * $Id: key.h,v 10.55 2012/10/07 01:31:17 zy Exp $ + * $Id: key.h,v 10.56 2013/11/13 12:15:27 zy Exp $ */ #include "multibyte.h" @@ -23,8 +23,9 @@ #define INPUT2INT5(sp,cw,n,nlen,w,wlen) \ sp->conv.input2int(sp, n, nlen, &(cw), &wlen, &w) #define CONST +#define INTISWIDE(c) (wctob(c) == EOF) #define CHAR_WIDTH(sp, ch) wcwidth(ch) -#define INTISWIDE(c) (wctob(c) == EOF) +#define CAN_PRINT(sp, ch) (CHAR_WIDTH(sp, ch) > 0) #else #define FILE2INT5(sp,buf,n,nlen,w,wlen) \ (w = n, wlen = nlen, 0) @@ -36,9 +37,10 @@ (n = w, nlen = wlen, 0) #define INPUT2INT5(sp,buf,n,nlen,w,wlen) \ (w = n, wlen = nlen, 0) -#define CONST const -#define INTISWIDE(c) 0 +#define CONST const +#define INTISWIDE(c) 0 #define CHAR_WIDTH(sp, ch) 1 +#define CAN_PRINT(sp, ch) isprint(ch) #endif #define FILE2INT(sp,n,nlen,w,wlen) \ FILE2INT5(sp,sp->cw,n,nlen,w,wlen) From c42d98a117446dd83b8d13800dd2e3726cb0d2d0 Mon Sep 17 00:00:00 2001 From: bapt Date: Fri, 10 Apr 2015 13:26:05 +0000 Subject: [PATCH 6/6] Import nvi 2.1.3 Approved by: peter --- README | 4 +- catalog/dump.c | 19 +- catalog/spell.ok | 19 - cl/cl.h | 12 - cl/cl_funcs.c | 46 +- cl/cl_main.c | 37 +- cl/cl_read.c | 11 +- cl/cl_screen.c | 50 +- cl/cl_term.c | 27 +- cl/extern.h | 62 +- common/common.h | 4 +- common/conv.c | 536 +++-- common/cut.c | 14 +- common/delete.c | 2 +- common/encoding.c | 26 +- common/exf.c | 41 +- common/extern.h | 262 +-- common/gs.h | 70 +- common/key.c | 28 +- common/line.c | 79 +- common/log.c | 30 +- common/main.c | 24 +- common/mark.c | 16 +- common/msg.c | 28 +- common/options.c | 42 +- common/options.h | 2 +- common/options_f.c | 30 +- common/put.c | 2 +- common/recover.c | 29 +- common/screen.c | 6 +- common/search.c | 21 +- common/seq.c | 30 +- common/util.c | 30 +- docs/TODO | 147 -- docs/USD.doc/edit/Makefile | 11 - docs/USD.doc/edit/edit.vindex | 115 - docs/USD.doc/edit/edittut.ms | 2280 ------------------ docs/USD.doc/exref/Makefile | 17 - docs/USD.doc/exref/ex.rm | 2213 ------------------ docs/USD.doc/exref/ex.summary | 730 ------ docs/USD.doc/vi.man/spell.ok | 179 -- docs/USD.doc/vi.ref/Makefile | 32 - docs/USD.doc/vi.ref/ex.cmd.roff | 1924 --------------- docs/USD.doc/vi.ref/index.so | 260 --- docs/USD.doc/vi.ref/merge.awk | 16 - docs/USD.doc/vi.ref/ref.so | 103 - docs/USD.doc/vi.ref/set.opt.roff | 1303 ----------- docs/USD.doc/vi.ref/spell.ok | 414 ---- docs/USD.doc/vi.ref/vi.cmd.roff | 3085 ------------------------- docs/USD.doc/vi.ref/vi.ref | 1840 --------------- docs/USD.doc/vitut/Makefile | 22 - docs/USD.doc/vitut/vi.apwh.ms | 1081 --------- docs/USD.doc/vitut/vi.chars | 645 ------ docs/USD.doc/vitut/vi.in | 2074 ----------------- docs/USD.doc/vitut/vi.summary | 468 ---- docs/changelog | 1102 --------- docs/ev | 55 - docs/features | 83 - docs/help | 229 -- docs/internals/autowrite | 88 - docs/internals/context | 32 - docs/internals/cscope.NOTES | 142 -- docs/internals/gdb.script | 76 - docs/internals/input | 350 --- docs/internals/openmode | 36 - docs/internals/quoting | 208 -- docs/internals/structures | 68 - docs/interp/interp | 190 -- docs/interp/spell.ok | 46 - docs/{USD.doc/vi.man => man}/Makefile | 0 docs/{USD.doc/vi.man => man}/vi.1 | 68 +- docs/spell.ok | 173 -- docs/tutorial/vi.advanced | 1458 ------------ docs/tutorial/vi.beginner | 741 ------ docs/tutorial/vi.tut.csh | 24 - ex/ex.c | 30 +- ex/ex.h | 4 +- ex/ex_abbrev.c | 4 +- ex/ex_append.c | 8 +- ex/ex_args.c | 12 +- ex/ex_argv.c | 32 +- ex/ex_at.c | 2 +- ex/ex_bang.c | 2 +- ex/ex_cd.c | 2 +- ex/ex_cscope.c | 44 +- ex/ex_delete.c | 2 +- ex/ex_display.c | 8 +- ex/ex_edit.c | 4 +- ex/ex_equal.c | 2 +- ex/ex_file.c | 2 +- ex/ex_filter.c | 6 +- ex/ex_global.c | 8 +- ex/ex_init.c | 14 +- ex/ex_join.c | 6 +- ex/ex_map.c | 4 +- ex/ex_mark.c | 2 +- ex/ex_mkexrc.c | 2 +- ex/ex_move.c | 4 +- ex/ex_open.c | 2 +- ex/ex_preserve.c | 4 +- ex/ex_print.c | 22 +- ex/ex_put.c | 2 +- ex/ex_quit.c | 2 +- ex/ex_read.c | 4 +- ex/ex_screen.c | 8 +- ex/ex_script.c | 20 +- ex/ex_set.c | 2 +- ex/ex_shell.c | 8 +- ex/ex_shift.c | 6 +- ex/ex_source.c | 2 +- ex/ex_stop.c | 2 +- ex/ex_subst.c | 26 +- ex/ex_tag.c | 60 +- ex/ex_txt.c | 6 +- ex/ex_undo.c | 2 +- ex/ex_usage.c | 6 +- ex/ex_util.c | 12 +- ex/ex_version.c | 2 +- ex/ex_visual.c | 2 +- ex/ex_write.c | 57 +- ex/ex_yank.c | 2 +- ex/ex_z.c | 6 +- ex/extern.h | 258 +-- ex/version.h | 2 +- regex/COPYRIGHT | 6 +- regex/cclass.h | 6 +- regex/cname.h | 6 +- regex/engine.c | 248 +- regex/re_format.7 | 6 +- regex/regcomp.c | 498 ++-- regex/regerror.c | 25 +- regex/regex.3 | 6 +- regex/regex.h | 16 +- regex/regex2.h | 6 +- regex/regexec.c | 15 +- regex/regfree.c | 9 +- regex/utils.h | 6 +- vi/extern.h | 290 +-- vi/getc.c | 12 +- vi/v_at.c | 2 +- vi/v_ch.c | 16 +- vi/v_delete.c | 2 +- vi/v_ex.c | 34 +- vi/v_increment.c | 4 +- vi/v_init.c | 6 +- vi/v_itxt.c | 22 +- vi/v_left.c | 10 +- vi/v_mark.c | 25 +- vi/v_match.c | 6 +- vi/v_paragraph.c | 6 +- vi/v_put.c | 6 +- vi/v_redraw.c | 2 +- vi/v_replace.c | 2 +- vi/v_right.c | 4 +- vi/v_screen.c | 2 +- vi/v_scroll.c | 28 +- vi/v_search.c | 16 +- vi/v_section.c | 4 +- vi/v_sentence.c | 4 +- vi/v_status.c | 2 +- vi/v_txt.c | 46 +- vi/v_ulcase.c | 6 +- vi/v_undo.c | 4 +- vi/v_util.c | 14 +- vi/v_word.c | 18 +- vi/v_xchar.c | 4 +- vi/v_yank.c | 2 +- vi/v_z.c | 4 +- vi/v_zexit.c | 2 +- vi/vi.c | 21 +- vi/vi.h | 14 +- vi/vs_line.c | 4 +- vi/vs_msg.c | 22 +- vi/vs_refresh.c | 12 +- vi/vs_relative.c | 10 +- vi/vs_smap.c | 36 +- vi/vs_split.c | 26 +- 177 files changed, 1843 insertions(+), 26256 deletions(-) delete mode 100644 catalog/spell.ok delete mode 100644 docs/TODO delete mode 100644 docs/USD.doc/edit/Makefile delete mode 100644 docs/USD.doc/edit/edit.vindex delete mode 100644 docs/USD.doc/edit/edittut.ms delete mode 100644 docs/USD.doc/exref/Makefile delete mode 100644 docs/USD.doc/exref/ex.rm delete mode 100644 docs/USD.doc/exref/ex.summary delete mode 100644 docs/USD.doc/vi.man/spell.ok delete mode 100644 docs/USD.doc/vi.ref/Makefile delete mode 100644 docs/USD.doc/vi.ref/ex.cmd.roff delete mode 100644 docs/USD.doc/vi.ref/index.so delete mode 100644 docs/USD.doc/vi.ref/merge.awk delete mode 100644 docs/USD.doc/vi.ref/ref.so delete mode 100644 docs/USD.doc/vi.ref/set.opt.roff delete mode 100644 docs/USD.doc/vi.ref/spell.ok delete mode 100644 docs/USD.doc/vi.ref/vi.cmd.roff delete mode 100644 docs/USD.doc/vi.ref/vi.ref delete mode 100644 docs/USD.doc/vitut/Makefile delete mode 100644 docs/USD.doc/vitut/vi.apwh.ms delete mode 100644 docs/USD.doc/vitut/vi.chars delete mode 100644 docs/USD.doc/vitut/vi.in delete mode 100644 docs/USD.doc/vitut/vi.summary delete mode 100644 docs/changelog delete mode 100644 docs/ev delete mode 100644 docs/features delete mode 100644 docs/help delete mode 100644 docs/internals/autowrite delete mode 100644 docs/internals/context delete mode 100644 docs/internals/cscope.NOTES delete mode 100644 docs/internals/gdb.script delete mode 100644 docs/internals/input delete mode 100644 docs/internals/openmode delete mode 100644 docs/internals/quoting delete mode 100644 docs/internals/structures delete mode 100644 docs/interp/interp delete mode 100644 docs/interp/spell.ok rename docs/{USD.doc/vi.man => man}/Makefile (100%) rename docs/{USD.doc/vi.man => man}/vi.1 (98%) delete mode 100644 docs/spell.ok delete mode 100644 docs/tutorial/vi.advanced delete mode 100644 docs/tutorial/vi.beginner delete mode 100755 docs/tutorial/vi.tut.csh diff --git a/README b/README index c129439d38d0..26fcc167fc6f 100644 --- a/README +++ b/README @@ -1,6 +1,6 @@ -# $Id: README,v 9.1 2013/11/02 02:50:23 zy Exp $ +# $Id: README,v 9.2 2015/04/08 17:18:56 zy Exp $ -This is version 2.1.2 (2012-11-02) of nex/nvi, a reimplementation of the ex/vi +This is version 2.1.3 (2015-04-08) of nex/nvi, a reimplementation of the ex/vi text editors originally distributed as part of the Fourth Berkeley Software Distribution (4BSD), by the University of California, Berkeley. diff --git a/catalog/dump.c b/catalog/dump.c index 13ffb8bb422a..585a6d908e41 100644 --- a/catalog/dump.c +++ b/catalog/dump.c @@ -10,11 +10,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -31,12 +27,6 @@ * SUCH DAMAGE. */ -#ifndef lint -static char copyright[] = -"@(#) Copyright (c) 1992, 1993, 1994\n\ - The Regents of the University of California. All rights reserved.\n"; -#endif /* not lint */ - #ifndef lint static char sccsid[] = "$Id: dump.c,v 8.2 2011/07/14 00:05:25 zy Exp $"; #endif /* not lint */ @@ -45,8 +35,7 @@ static char sccsid[] = "$Id: dump.c,v 8.2 2011/07/14 00:05:25 zy Exp $"; #include static void -parse(fp) - FILE *fp; +parse(FILE *fp) { int ch, s1, s2, s3; @@ -96,9 +85,7 @@ parse(fp) } int -main(argc, argv) - int argc; - char *argv[]; +main(int argc, char *argv[]) { FILE *fp; diff --git a/catalog/spell.ok b/catalog/spell.ok deleted file mode 100644 index 00be47141879..000000000000 --- a/catalog/spell.ok +++ /dev/null @@ -1,19 +0,0 @@ -ARGMAX -LC -NL -XXXX -arg1 -arg2 -chys -english -english.base -german.base -langauge -msg -msg.c -msgcat -msgq -nvi -nvi's -pathname -sp diff --git a/cl/cl.h b/cl/cl.h index c84ef88428c0..cca0acb8eba7 100644 --- a/cl/cl.h +++ b/cl/cl.h @@ -80,16 +80,4 @@ typedef enum { INP_OK=0, INP_EOF, INP_ERR, INP_INTR, INP_TIMEOUT } input_t; #define RCNO(sp, cno) (cno) #define RLNO(sp, lno) (lno) -/* - * XXX - * Some implementations of curses.h don't define these for us. Used for - * compatibility only. - */ -#ifndef TRUE -#define TRUE 1 -#endif -#ifndef FALSE -#define FALSE 0 -#endif - #include "extern.h" diff --git a/cl/cl_funcs.c b/cl/cl_funcs.c index 8b14e8da747d..4c15458456ad 100644 --- a/cl/cl_funcs.c +++ b/cl/cl_funcs.c @@ -33,7 +33,7 @@ static const char sccsid[] = "$Id: cl_funcs.c,v 10.74 2012/10/11 10:30:16 zy Exp #include "../vi/vi.h" #include "cl.h" -static void cl_rdiv __P((SCR *)); +static void cl_rdiv(SCR *); static int addstr4(SCR *sp, void *str, size_t len, int wide) @@ -76,31 +76,31 @@ addstr4(SCR *sp, void *str, size_t len, int wide) * cl_waddstr -- * Add len bytes from the string at the cursor, advancing the cursor. * - * PUBLIC: int cl_waddstr __P((SCR *, const CHAR_T *, size_t)); + * PUBLIC: int cl_waddstr(SCR *, const CHAR_T *, size_t); */ int cl_waddstr(SCR *sp, const CHAR_T *str, size_t len) { - return addstr4(sp, (void *)str, len, 1); + return addstr4(sp, (void *)str, len, 1); } /* * cl_addstr -- * Add len bytes from the string at the cursor, advancing the cursor. * - * PUBLIC: int cl_addstr __P((SCR *, const char *, size_t)); + * PUBLIC: int cl_addstr(SCR *, const char *, size_t); */ int cl_addstr(SCR *sp, const char *str, size_t len) { - return addstr4(sp, (void *)str, len, 0); + return addstr4(sp, (void *)str, len, 0); } /* * cl_attr -- * Toggle a screen attribute on/off. * - * PUBLIC: int cl_attr __P((SCR *, scr_attr_t, int)); + * PUBLIC: int cl_attr(SCR *, scr_attr_t, int); */ int cl_attr(SCR *sp, scr_attr_t attribute, int on) @@ -187,7 +187,7 @@ cl_attr(SCR *sp, scr_attr_t attribute, int on) * cl_baud -- * Return the baud rate. * - * PUBLIC: int cl_baud __P((SCR *, u_long *)); + * PUBLIC: int cl_baud(SCR *, u_long *); */ int cl_baud(SCR *sp, u_long *ratep) @@ -228,7 +228,7 @@ cl_baud(SCR *sp, u_long *ratep) * cl_bell -- * Ring the bell/flash the screen. * - * PUBLIC: int cl_bell __P((SCR *)); + * PUBLIC: int cl_bell(SCR *); */ int cl_bell(SCR *sp) @@ -252,7 +252,7 @@ cl_bell(SCR *sp) * cl_clrtoeol -- * Clear from the current cursor to the end of the line. * - * PUBLIC: int cl_clrtoeol __P((SCR *)); + * PUBLIC: int cl_clrtoeol(SCR *); */ int cl_clrtoeol(SCR *sp) @@ -281,7 +281,7 @@ cl_clrtoeol(SCR *sp) * cl_cursor -- * Return the current cursor position. * - * PUBLIC: int cl_cursor __P((SCR *, size_t *, size_t *)); + * PUBLIC: int cl_cursor(SCR *, size_t *, size_t *); */ int cl_cursor(SCR *sp, size_t *yp, size_t *xp) @@ -307,7 +307,7 @@ cl_cursor(SCR *sp, size_t *yp, size_t *xp) * cl_deleteln -- * Delete the current line, scrolling all lines below it. * - * PUBLIC: int cl_deleteln __P((SCR *)); + * PUBLIC: int cl_deleteln(SCR *); */ int cl_deleteln(SCR *sp) @@ -344,7 +344,7 @@ cl_deleteln(SCR *sp) * cl_discard -- * Discard a screen. * - * PUBLIC: int cl_discard __P((SCR *, SCR **)); + * PUBLIC: int cl_discard(SCR *, SCR **); */ int cl_discard(SCR *discardp, SCR **acquirep) @@ -385,7 +385,7 @@ cl_discard(SCR *discardp, SCR **acquirep) * Adjust the screen for ex. This routine is purely for standalone * ex programs. All special purpose, all special case. * - * PUBLIC: int cl_ex_adjust __P((SCR *, exadj_t)); + * PUBLIC: int cl_ex_adjust(SCR *, exadj_t); */ int cl_ex_adjust(SCR *sp, exadj_t action) @@ -440,7 +440,7 @@ cl_ex_adjust(SCR *sp, exadj_t action) * cl_insertln -- * Push down the current line, discarding the bottom line. * - * PUBLIC: int cl_insertln __P((SCR *)); + * PUBLIC: int cl_insertln(SCR *); */ int cl_insertln(SCR *sp) @@ -458,7 +458,7 @@ cl_insertln(SCR *sp) * cl_keyval -- * Return the value for a special key. * - * PUBLIC: int cl_keyval __P((SCR *, scr_keyval_t, CHAR_T *, int *)); + * PUBLIC: int cl_keyval(SCR *, scr_keyval_t, CHAR_T *, int *); */ int cl_keyval(SCR *sp, scr_keyval_t val, CHAR_T *chp, int *dnep) @@ -496,7 +496,7 @@ cl_keyval(SCR *sp, scr_keyval_t val, CHAR_T *chp, int *dnep) * cl_move -- * Move the cursor. * - * PUBLIC: int cl_move __P((SCR *, size_t, size_t)); + * PUBLIC: int cl_move(SCR *, size_t, size_t); */ int cl_move(SCR *sp, size_t lno, size_t cno) @@ -516,7 +516,7 @@ cl_move(SCR *sp, size_t lno, size_t cno) * cl_refresh -- * Refresh the screen. * - * PUBLIC: int cl_refresh __P((SCR *, int)); + * PUBLIC: int cl_refresh(SCR *, int); */ int cl_refresh(SCR *sp, int repaint) @@ -599,7 +599,7 @@ cl_rdiv(SCR *sp) * cl_rename -- * Rename the file. * - * PUBLIC: int cl_rename __P((SCR *, char *, int)); + * PUBLIC: int cl_rename(SCR *, char *, int); */ int cl_rename(SCR *sp, char *name, int on) @@ -621,7 +621,7 @@ cl_rename(SCR *sp, char *name, int on) if (on) { clp->focus = sp; if (!F_ISSET(clp, CL_RENAME_OK) || - strncmp(OG_STR(gp, GO_TERM), "xterm", 5)) + strncmp(OG_STR(gp, GO_TERM), "xterm", 5)) return (0); if (clp->oname == NULL && (wid = getenv("WINDOWID"))) { @@ -654,7 +654,7 @@ rename: cl_setname(gp, name); * cl_setname -- * Set a X11 icon/window name. * - * PUBLIC: void cl_setname __P((GS *, char *)); + * PUBLIC: void cl_setname(GS *, char *); */ void cl_setname(GS *gp, char *name) @@ -671,7 +671,7 @@ cl_setname(GS *gp, char *name) * cl_split -- * Split a screen. * - * PUBLIC: int cl_split __P((SCR *, SCR *)); + * PUBLIC: int cl_split(SCR *, SCR *); */ int cl_split(SCR *origp, SCR *newp) @@ -697,7 +697,7 @@ cl_split(SCR *origp, SCR *newp) * cl_suspend -- * Suspend a screen. * - * PUBLIC: int cl_suspend __P((SCR *, int *)); + * PUBLIC: int cl_suspend(SCR *, int *); */ int cl_suspend(SCR *sp, int *allowedp) @@ -825,7 +825,7 @@ cl_suspend(SCR *sp, int *allowedp) * cl_usage -- * Print out the curses usage messages. * - * PUBLIC: void cl_usage __P((void)); + * PUBLIC: void cl_usage(void); */ void cl_usage(void) diff --git a/cl/cl_main.c b/cl/cl_main.c index 98f13136a061..42c3c82b84f1 100644 --- a/cl/cl_main.c +++ b/cl/cl_main.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "$Id: cl_main.c,v 10.55 2011/08/15 19:52:28 zy Exp $"; +static const char sccsid[] = "$Id: cl_main.c,v 10.56 2015/04/05 06:20:53 zy Exp $"; #endif /* not lint */ #include @@ -36,20 +36,20 @@ static const char sccsid[] = "$Id: cl_main.c,v 10.55 2011/08/15 19:52:28 zy Exp GS *__global_list; /* GLOBAL: List of screens. */ sigset_t __sigblockset; /* GLOBAL: Blocked signals. */ -static void cl_func_std __P((GS *)); -static CL_PRIVATE *cl_init __P((GS *)); -static GS *gs_init __P((char *)); -static void perr __P((char *, char *)); -static int setsig __P((int, struct sigaction *, void (*)(int))); -static void sig_end __P((GS *)); -static void term_init __P((char *, char *)); +static void cl_func_std(GS *); +static CL_PRIVATE *cl_init(GS *); +static GS *gs_init(char *); +static void perr(char *, char *); +static int setsig(int, struct sigaction *, void (*)(int)); +static void sig_end(GS *); +static void term_init(char *, char *); /* * main -- * This is the main loop for the standalone curses editor. */ int -main(int argc, char **argv) +main(int argc, char *argv[]) { static int reenter; CL_PRIVATE *clp; @@ -92,7 +92,7 @@ main(int argc, char **argv) * have to use termcap/terminfo to find out how big the screen is. */ if ((ttype = getenv("TERM")) == NULL) - ttype = "unknown"; + ttype = "ansi"; term_init(gp->progname, ttype); /* Add the terminal type to the global structure. */ @@ -146,7 +146,7 @@ main(int argc, char **argv) } /* Free the global and CL private areas. */ -#if defined(DEBUG) || defined(PURIFY) || defined(LIBRARY) +#if defined(DEBUG) || defined(PURIFY) if (clp->oname != NULL) free(clp->oname); free(clp); @@ -292,7 +292,7 @@ h_winch(int signo) * sig_init -- * Initialize signals. * - * PUBLIC: int sig_init __P((GS *, SCR *)); + * PUBLIC: int sig_init(GS *, SCR *); */ int sig_init(GS *gp, SCR *sp) @@ -337,7 +337,7 @@ sig_init(GS *gp, SCR *sp) * Set a signal handler. */ static int -setsig(int signo, struct sigaction *oactp, void (*handler) (int)) +setsig(int signo, struct sigaction *oactp, void (*handler)(int)) { struct sigaction act; @@ -345,21 +345,12 @@ setsig(int signo, struct sigaction *oactp, void (*handler) (int)) * Use sigaction(2), not signal(3), since we don't always want to * restart system calls. The example is when waiting for a command * mode keystroke and SIGWINCH arrives. Besides, you can't portably - * restart system calls (thanks, POSIX!). On the other hand, you - * can't portably NOT restart system calls (thanks, Sun!). SunOS - * used SA_INTERRUPT as their extension to NOT restart read calls. - * We sure hope nobody else used it for anything else. Mom told me - * there'd be days like this. She just never told me that there'd - * be so many. + * restart system calls (thanks, POSIX!). */ act.sa_handler = handler; sigemptyset(&act.sa_mask); -#ifdef SA_INTERRUPT - act.sa_flags = SA_INTERRUPT; -#else act.sa_flags = 0; -#endif return (sigaction(signo, &act, oactp)); } diff --git a/cl/cl_read.c b/cl/cl_read.c index 410cdd4318cc..3d9064c56002 100644 --- a/cl/cl_read.c +++ b/cl/cl_read.c @@ -35,15 +35,15 @@ static const char sccsid[] = "$Id: cl_read.c,v 10.30 2012/07/12 18:28:58 zy Exp #undef columns #undef lines -static input_t cl_read __P((SCR *, - u_int32_t, char *, size_t, int *, struct timeval *)); -static int cl_resize __P((SCR *, size_t, size_t)); +static input_t cl_read(SCR *, + u_int32_t, char *, size_t, int *, struct timeval *); +static int cl_resize(SCR *, size_t, size_t); /* * cl_event -- * Return a single event. * - * PUBLIC: int cl_event __P((SCR *, EVENT *, u_int32_t, int)); + * PUBLIC: int cl_event(SCR *, EVENT *, u_int32_t, int); */ int cl_event(SCR *sp, EVENT *evp, u_int32_t flags, int ms) @@ -143,7 +143,8 @@ retest: if (LF_ISSET(EC_INTERRUPT) || F_ISSET(clp, CL_SIGINT)) { * Read characters from the input. */ static input_t -cl_read(SCR *sp, u_int32_t flags, char *bp, size_t blen, int *nrp, struct timeval *tp) +cl_read(SCR *sp, u_int32_t flags, char *bp, size_t blen, int *nrp, + struct timeval *tp) { struct termios term1, term2; CL_PRIVATE *clp; diff --git a/cl/cl_screen.c b/cl/cl_screen.c index 91ff2789961e..16c87725487d 100644 --- a/cl/cl_screen.c +++ b/cl/cl_screen.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "$Id: cl_screen.c,v 10.56 2002/05/03 19:59:44 skimo Exp $"; +static const char sccsid[] = "$Id: cl_screen.c,v 10.58 2015/04/08 02:12:11 zy Exp $"; #endif /* not lint */ #include @@ -32,18 +32,18 @@ static const char sccsid[] = "$Id: cl_screen.c,v 10.56 2002/05/03 19:59:44 skimo #include "../common/common.h" #include "cl.h" -static int cl_ex_end __P((GS *)); -static int cl_ex_init __P((SCR *)); -static void cl_freecap __P((CL_PRIVATE *)); -static int cl_vi_end __P((GS *)); -static int cl_vi_init __P((SCR *)); -static int cl_putenv __P((char *, char *, u_long)); +static int cl_ex_end(GS *); +static int cl_ex_init(SCR *); +static void cl_freecap(CL_PRIVATE *); +static int cl_vi_end(GS *); +static int cl_vi_init(SCR *); +static int cl_putenv(char *, char *, u_long); /* * cl_screen -- * Switch screen types. * - * PUBLIC: int cl_screen __P((SCR *, u_int32_t)); + * PUBLIC: int cl_screen(SCR *, u_int32_t); */ int cl_screen(SCR *sp, u_int32_t flags) @@ -58,11 +58,9 @@ cl_screen(SCR *sp, u_int32_t flags) /* See if the current information is incorrect. */ if (F_ISSET(gp, G_SRESTART)) { - if (CLSP(sp)) { - delwin(CLSP(sp)); - sp->cl_private = NULL; - } - if (cl_quit(gp)) + if ((!F_ISSET(sp, SC_SCR_EX | SC_SCR_VI) || + resizeterm(O_VAL(sp, O_LINES), O_VAL(sp, O_COLUMNS))) && + cl_quit(gp)) return (1); F_CLR(gp, G_SRESTART); } @@ -131,7 +129,7 @@ cl_screen(SCR *sp, u_int32_t flags) * cl_quit -- * Shutdown the screens. * - * PUBLIC: int cl_quit __P((GS *)); + * PUBLIC: int cl_quit(GS *); */ int cl_quit(GS *gp) @@ -234,20 +232,15 @@ cl_vi_init(SCR *sp) cl_putenv("COLUMNS", NULL, (u_long)O_VAL(sp, O_COLUMNS)); /* - * We don't care about the SCREEN reference returned by newterm, we - * never have more than one SCREEN at a time. - * - * XXX - * The SunOS initscr() can't be called twice. Don't even think about - * using it. It fails in subtle ways (e.g. select(2) on fileno(stdin) - * stops working). (The SVID notes that applications should only call - * initscr() once.) - * - * XXX - * The HP/UX newterm doesn't support the NULL first argument, so we - * have to specify the terminal type. + * The terminal is aways initialized, either in `main`, or by a + * previous call to newterm(3X). */ (void)del_curterm(cur_term); + + /* + * We never have more than one SCREEN at a time, so set_term(NULL) will + * give us the last SCREEN. + */ errno = 0; if (newterm(ttype, stdout, stdin) == NULL) { if (errno) @@ -416,6 +409,9 @@ cl_vi_end(GS *gp) /* End curses window. */ (void)endwin(); + /* Free the SCREEN created by newterm(3X). */ + delscreen(set_term(NULL)); + /* * XXX * The screen TE sequence just got sent. See the comment in @@ -520,7 +516,7 @@ cl_ex_end(GS *gp) * cl_getcap -- * Retrieve termcap/terminfo strings. * - * PUBLIC: int cl_getcap __P((SCR *, char *, char **)); + * PUBLIC: int cl_getcap(SCR *, char *, char **); */ int cl_getcap(SCR *sp, char *name, char **elementp) diff --git a/cl/cl_term.c b/cl/cl_term.c index 7e8f6c7735a2..d4b1efc8fe84 100644 --- a/cl/cl_term.c +++ b/cl/cl_term.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "$Id: cl_term.c,v 10.34 2013/12/07 16:21:14 wjenkner Exp $"; +static const char sccsid[] = "$Id: cl_term.c,v 10.35 2015/04/08 02:12:11 zy Exp $"; #endif /* not lint */ #include @@ -34,7 +34,7 @@ static const char sccsid[] = "$Id: cl_term.c,v 10.34 2013/12/07 16:21:14 wjenkne #include "../common/common.h" #include "cl.h" -static int cl_pfmap __P((SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t)); +static int cl_pfmap(SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t); /* * XXX @@ -81,7 +81,7 @@ static TKLIST const m2_tklist[] = { /* Input mappings (set or delete). */ * cl_term_init -- * Initialize the special keys defined by the termcap/terminfo entry. * - * PUBLIC: int cl_term_init __P((SCR *)); + * PUBLIC: int cl_term_init(SCR *); */ int cl_term_init(SCR *sp) @@ -182,7 +182,7 @@ cl_term_init(SCR *sp) * cl_term_end -- * End the special keys defined by the termcap/terminfo entry. * - * PUBLIC: int cl_term_end __P((GS *)); + * PUBLIC: int cl_term_end(GS *); */ int cl_term_end(GS *gp) @@ -206,7 +206,7 @@ cl_term_end(GS *gp) * cl_fmap -- * Map a function key. * - * PUBLIC: int cl_fmap __P((SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t)); + * PUBLIC: int cl_fmap(SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t); */ int cl_fmap(SCR *sp, seq_t stype, CHAR_T *from, size_t flen, CHAR_T *to, size_t tlen) @@ -258,7 +258,7 @@ cl_pfmap(SCR *sp, seq_t stype, CHAR_T *from, size_t flen, CHAR_T *to, size_t tle * cl_optchange -- * Curses screen specific "option changed" routine. * - * PUBLIC: int cl_optchange __P((SCR *, int, char *, u_long *)); + * PUBLIC: int cl_optchange(SCR *, int, char *, u_long *); */ int cl_optchange(SCR *sp, int opt, char *str, u_long *valp) @@ -268,15 +268,16 @@ cl_optchange(SCR *sp, int opt, char *str, u_long *valp) clp = CLP(sp); switch (opt) { + case O_TERM: + F_CLR(sp, SC_SCR_EX | SC_SCR_VI); + /* FALLTHROUGH */ case O_COLUMNS: case O_LINES: - case O_TERM: /* - * Changing the columns, lines or terminal require that - * we restart the screen. + * Changing the terminal type requires that we reinitialize + * curses, while resizing does not. */ F_SET(sp->gp, G_SRESTART); - F_CLR(sp, SC_SCR_EX | SC_SCR_VI); break; case O_MESG: (void)cl_omesg(sp, clp, *valp); @@ -305,7 +306,7 @@ cl_optchange(SCR *sp, int opt, char *str, u_long *valp) * cl_omesg -- * Turn the tty write permission on or off. * - * PUBLIC: int cl_omesg __P((SCR *, CL_PRIVATE *, int)); + * PUBLIC: int cl_omesg(SCR *, CL_PRIVATE *, int); */ int cl_omesg(SCR *sp, CL_PRIVATE *clp, int on) @@ -351,7 +352,7 @@ cl_omesg(SCR *sp, CL_PRIVATE *clp, int on) * cl_ssize -- * Return the terminal size. * - * PUBLIC: int cl_ssize __P((SCR *, int, size_t *, size_t *, int *)); + * PUBLIC: int cl_ssize(SCR *, int, size_t *, size_t *, int *); */ int cl_ssize(SCR *sp, int sigwinch, size_t *rowp, size_t *colp, int *changedp) @@ -467,7 +468,7 @@ noterm: if (row == 0) * cl_putchar -- * Function version of putchar, for tputs. * - * PUBLIC: int cl_putchar __P((int)); + * PUBLIC: int cl_putchar(int); */ int cl_putchar(int ch) diff --git a/cl/extern.h b/cl/extern.h index 626f4fbea167..7b01ccd3f8cf 100644 --- a/cl/extern.h +++ b/cl/extern.h @@ -1,31 +1,31 @@ -int cl_waddstr __P((SCR *, const CHAR_T *, size_t)); -int cl_addstr __P((SCR *, const char *, size_t)); -int cl_attr __P((SCR *, scr_attr_t, int)); -int cl_baud __P((SCR *, u_long *)); -int cl_bell __P((SCR *)); -int cl_clrtoeol __P((SCR *)); -int cl_cursor __P((SCR *, size_t *, size_t *)); -int cl_deleteln __P((SCR *)); -int cl_discard __P((SCR *, SCR **)); -int cl_ex_adjust __P((SCR *, exadj_t)); -int cl_insertln __P((SCR *)); -int cl_keyval __P((SCR *, scr_keyval_t, CHAR_T *, int *)); -int cl_move __P((SCR *, size_t, size_t)); -int cl_refresh __P((SCR *, int)); -int cl_rename __P((SCR *, char *, int)); -void cl_setname __P((GS *, char *)); -int cl_split __P((SCR *, SCR *)); -int cl_suspend __P((SCR *, int *)); -void cl_usage __P((void)); -int sig_init __P((GS *, SCR *)); -int cl_event __P((SCR *, EVENT *, u_int32_t, int)); -int cl_screen __P((SCR *, u_int32_t)); -int cl_quit __P((GS *)); -int cl_getcap __P((SCR *, char *, char **)); -int cl_term_init __P((SCR *)); -int cl_term_end __P((GS *)); -int cl_fmap __P((SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t)); -int cl_optchange __P((SCR *, int, char *, u_long *)); -int cl_omesg __P((SCR *, CL_PRIVATE *, int)); -int cl_ssize __P((SCR *, int, size_t *, size_t *, int *)); -int cl_putchar __P((int)); +int cl_waddstr(SCR *, const CHAR_T *, size_t); +int cl_addstr(SCR *, const char *, size_t); +int cl_attr(SCR *, scr_attr_t, int); +int cl_baud(SCR *, u_long *); +int cl_bell(SCR *); +int cl_clrtoeol(SCR *); +int cl_cursor(SCR *, size_t *, size_t *); +int cl_deleteln(SCR *); +int cl_discard(SCR *, SCR **); +int cl_ex_adjust(SCR *, exadj_t); +int cl_insertln(SCR *); +int cl_keyval(SCR *, scr_keyval_t, CHAR_T *, int *); +int cl_move(SCR *, size_t, size_t); +int cl_refresh(SCR *, int); +int cl_rename(SCR *, char *, int); +void cl_setname(GS *, char *); +int cl_split(SCR *, SCR *); +int cl_suspend(SCR *, int *); +void cl_usage(void); +int sig_init(GS *, SCR *); +int cl_event(SCR *, EVENT *, u_int32_t, int); +int cl_screen(SCR *, u_int32_t); +int cl_quit(GS *); +int cl_getcap(SCR *, char *, char **); +int cl_term_init(SCR *); +int cl_term_end(GS *); +int cl_fmap(SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t); +int cl_optchange(SCR *, int, char *, u_long *); +int cl_omesg(SCR *, CL_PRIVATE *, int); +int cl_ssize(SCR *, int, size_t *, size_t *, int *); +int cl_putchar(int); diff --git a/common/common.h b/common/common.h index 71f4c7fb69cb..c64adb51d6b4 100644 --- a/common/common.h +++ b/common/common.h @@ -23,8 +23,8 @@ */ typedef struct _cb CB; typedef struct _csc CSC; -typedef struct _conv CONV; -typedef struct _conv_win CONVWIN; +typedef struct _conv CONV; +typedef struct _conv_win CONVWIN; typedef struct _event EVENT; typedef struct _excmd EXCMD; typedef struct _exf EXF; diff --git a/common/conv.c b/common/conv.c index 7803cec9922e..aaa7af37e548 100644 --- a/common/conv.c +++ b/common/conv.c @@ -12,7 +12,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "$Id: conv.c,v 2.39 2013/07/01 23:28:13 zy Exp $"; +static const char sccsid[] = "$Id: conv.c,v 2.40 2014/02/27 16:25:29 zy Exp $"; #endif /* not lint */ #include @@ -36,35 +36,37 @@ static const char sccsid[] = "$Id: conv.c,v 2.39 2013/07/01 23:28:13 zy Exp $"; * codeset -- * Get the locale encoding. * - * PUBLIC: char * codeset __P((void)); + * PUBLIC: char * codeset(void); */ char * -codeset(void) { - static char *cs; +codeset(void) +{ + static char *cs; - if (cs == NULL) - cs = nl_langinfo(CODESET); - return cs; + if (cs == NULL) + cs = nl_langinfo(CODESET); + + return cs; } #ifdef USE_WIDECHAR static int -raw2int(SCR *sp, const char * str, ssize_t len, CONVWIN *cw, - size_t *tolen, CHAR_T **dst) +raw2int(SCR *sp, const char * str, ssize_t len, CONVWIN *cw, size_t *tolen, + CHAR_T **dst) { - int i; - CHAR_T **tostr = &cw->bp1.wc; - size_t *blen = &cw->blen1; + int i; + CHAR_T **tostr = &cw->bp1.wc; + size_t *blen = &cw->blen1; - BINC_RETW(NULL, *tostr, *blen, len); + BINC_RETW(NULL, *tostr, *blen, len); - *tolen = len; - for (i = 0; i < len; ++i) - (*tostr)[i] = (u_char) str[i]; + *tolen = len; + for (i = 0; i < len; ++i) + (*tostr)[i] = (u_char) str[i]; - *dst = cw->bp1.wc; + *dst = cw->bp1.wc; - return 0; + return 0; } #define CONV_BUFFER_SIZE 512 @@ -73,27 +75,27 @@ raw2int(SCR *sp, const char * str, ssize_t len, CONVWIN *cw, * len contains the number of bytes put in the buffer */ #ifdef USE_ICONV -#define CONVERT(str, left, src, len) \ - do { \ - size_t outleft; \ - char *bp = buffer; \ - outleft = CONV_BUFFER_SIZE; \ - errno = 0; \ - if (iconv(id, (iconv_src_t)&str, &left, &bp, &outleft) == -1 && \ - errno != E2BIG) \ - goto err; \ - if ((len = CONV_BUFFER_SIZE - outleft) == 0) { \ - error = -left; \ - goto err; \ - } \ - src = buffer; \ - } while (0) +#define CONVERT(str, left, src, len) \ + do { \ + size_t outleft; \ + char *bp = buffer; \ + outleft = CONV_BUFFER_SIZE; \ + errno = 0; \ + if (iconv(id, (iconv_src_t)&str, &left, &bp, &outleft) \ + == -1 && errno != E2BIG) \ + goto err; \ + if ((len = CONV_BUFFER_SIZE - outleft) == 0) { \ + error = -left; \ + goto err; \ + } \ + src = buffer; \ + } while (0) #define IC_RESET() \ - do { \ - if (id != (iconv_t)-1) \ - iconv(id, NULL, NULL, NULL, NULL); \ - } while(0) + do { \ + if (id != (iconv_t)-1) \ + iconv(id, NULL, NULL, NULL, NULL); \ + } while(0) #else #define CONVERT(str, left, src, len) #define IC_RESET() @@ -101,114 +103,116 @@ raw2int(SCR *sp, const char * str, ssize_t len, CONVWIN *cw, static int default_char2int(SCR *sp, const char * str, ssize_t len, CONVWIN *cw, - size_t *tolen, CHAR_T **dst, iconv_t id) + size_t *tolen, CHAR_T **dst, iconv_t id) { - size_t i = 0, j; - CHAR_T **tostr = &cw->bp1.wc; - size_t *blen = &cw->blen1; - mbstate_t mbs; - size_t n; - ssize_t nlen = len; - char *src = (char *)str; + size_t i = 0, j; + CHAR_T **tostr = &cw->bp1.wc; + size_t *blen = &cw->blen1; + mbstate_t mbs; + size_t n; + ssize_t nlen = len; + char *src = (char *)str; #ifdef USE_ICONV - char buffer[CONV_BUFFER_SIZE]; + char buffer[CONV_BUFFER_SIZE]; #endif - size_t left = len; - int error = 1; + size_t left = len; + int error = 1; - BZERO(&mbs, 1); - BINC_RETW(NULL, *tostr, *blen, nlen); + BZERO(&mbs, 1); + BINC_RETW(NULL, *tostr, *blen, nlen); #ifdef USE_ICONV - if (id != (iconv_t)-1) - CONVERT(str, left, src, len); + if (id != (iconv_t)-1) + CONVERT(str, left, src, len); #endif - for (i = 0, j = 0; j < len; ) { - n = mbrtowc((*tostr)+i, src+j, len-j, &mbs); - /* NULL character converted */ - if (n == -2) error = -(len-j); - if (n == -1 || n == -2) goto err; - if (n == 0) n = 1; - j += n; - if (++i >= *blen) { - nlen += 256; - BINC_RETW(NULL, *tostr, *blen, nlen); + for (i = 0, j = 0; j < len; ) { + n = mbrtowc((*tostr)+i, src+j, len-j, &mbs); + /* NULL character converted */ + if (n == -2) + error = -(len-j); + if (n == -1 || n == -2) + goto err; + if (n == 0) + n = 1; + j += n; + if (++i >= *blen) { + nlen += 256; + BINC_RETW(NULL, *tostr, *blen, nlen); + } + if (id != (iconv_t)-1 && j == len && left) { + CONVERT(str, left, src, len); + j = 0; + } } - if (id != (iconv_t)-1 && j == len && left) { - CONVERT(str, left, src, len); - j = 0; - } - } - error = 0; + error = 0; err: - *tolen = i; - *dst = cw->bp1.wc; - IC_RESET(); + *tolen = i; + *dst = cw->bp1.wc; + IC_RESET(); - return error; + return error; } static int -fe_char2int(SCR *sp, const char * str, ssize_t len, CONVWIN *cw, - size_t *tolen, CHAR_T **dst) +fe_char2int(SCR *sp, const char * str, ssize_t len, CONVWIN *cw, size_t *tolen, + CHAR_T **dst) { - return default_char2int(sp, str, len, cw, tolen, dst, - sp->conv.id[IC_FE_CHAR2INT]); + return default_char2int(sp, str, len, cw, tolen, dst, + sp->conv.id[IC_FE_CHAR2INT]); } static int -ie_char2int(SCR *sp, const char * str, ssize_t len, CONVWIN *cw, - size_t *tolen, CHAR_T **dst) +ie_char2int(SCR *sp, const char * str, ssize_t len, CONVWIN *cw, size_t *tolen, + CHAR_T **dst) { - return default_char2int(sp, str, len, cw, tolen, dst, - sp->conv.id[IC_IE_CHAR2INT]); + return default_char2int(sp, str, len, cw, tolen, dst, + sp->conv.id[IC_IE_CHAR2INT]); } static int -cs_char2int(SCR *sp, const char * str, ssize_t len, CONVWIN *cw, - size_t *tolen, CHAR_T **dst) +cs_char2int(SCR *sp, const char * str, ssize_t len, CONVWIN *cw, size_t *tolen, + CHAR_T **dst) { - return default_char2int(sp, str, len, cw, tolen, dst, - (iconv_t)-1); + return default_char2int(sp, str, len, cw, tolen, dst, (iconv_t)-1); } static int -int2raw(SCR *sp, const CHAR_T * str, ssize_t len, CONVWIN *cw, - size_t *tolen, char **dst) +int2raw(SCR *sp, const CHAR_T * str, ssize_t len, CONVWIN *cw, size_t *tolen, + char **dst) { - int i; - char **tostr = &cw->bp1.c; - size_t *blen = &cw->blen1; + int i; + char **tostr = &cw->bp1.c; + size_t *blen = &cw->blen1; - BINC_RETC(NULL, *tostr, *blen, len); + BINC_RETC(NULL, *tostr, *blen, len); - *tolen = len; - for (i = 0; i < len; ++i) - (*tostr)[i] = str[i]; + *tolen = len; + for (i = 0; i < len; ++i) + (*tostr)[i] = str[i]; - *dst = cw->bp1.c; + *dst = cw->bp1.c; - return 0; + return 0; } static int default_int2char(SCR *sp, const CHAR_T * str, ssize_t len, CONVWIN *cw, - size_t *tolen, char **pdst, iconv_t id) + size_t *tolen, char **pdst, iconv_t id) { - size_t i, j, offset = 0; - char **tostr = &cw->bp1.c; - size_t *blen = &cw->blen1; - mbstate_t mbs; - size_t n; - ssize_t nlen = len + MB_CUR_MAX; - char *dst; - size_t buflen; + size_t i, j, offset = 0; + char **tostr = &cw->bp1.c; + size_t *blen = &cw->blen1; + mbstate_t mbs; + size_t n; + ssize_t nlen = len + MB_CUR_MAX; + char *dst; + size_t buflen; #ifdef USE_ICONV - char buffer[CONV_BUFFER_SIZE]; + char buffer[CONV_BUFFER_SIZE]; #endif - int error = 1; + int error = 1; /* convert first len bytes of buffer and append it to cw->bp * len is adjusted => 0 @@ -217,87 +221,90 @@ default_int2char(SCR *sp, const CHAR_T * str, ssize_t len, CONVWIN *cw, */ #ifdef USE_ICONV #define CONVERT2(_buffer, lenp, cw, offset) \ - do { \ - char *bp = _buffer; \ - int ret; \ do { \ - size_t outleft = cw->blen1 - offset; \ - char *obp = cw->bp1.c + offset; \ - if (cw->blen1 < offset + MB_CUR_MAX) { \ - nlen += 256; \ - BINC_RETC(NULL, cw->bp1.c, cw->blen1, nlen); \ - } \ - errno = 0; \ - ret = iconv(id, (iconv_src_t)&bp, lenp, &obp, &outleft); \ - if (ret == -1 && errno != E2BIG) \ - goto err; \ - offset = cw->blen1 - outleft; \ - } while (ret != 0); \ - } while (0) + char *bp = _buffer; \ + int ret; \ + do { \ + size_t outleft = cw->blen1 - offset; \ + char *obp = cw->bp1.c + offset; \ + if (cw->blen1 < offset + MB_CUR_MAX) { \ + nlen += 256; \ + BINC_RETC(NULL, cw->bp1.c, cw->blen1, \ + nlen); \ + } \ + errno = 0; \ + ret = iconv(id, (iconv_src_t)&bp, lenp, &obp, \ + &outleft); \ + if (ret == -1 && errno != E2BIG) \ + goto err; \ + offset = cw->blen1 - outleft; \ + } while (ret != 0); \ + } while (0) #else #define CONVERT2(_buffer, lenp, cw, offset) #endif - BZERO(&mbs, 1); - BINC_RETC(NULL, *tostr, *blen, nlen); - dst = *tostr; buflen = *blen; + BZERO(&mbs, 1); + BINC_RETC(NULL, *tostr, *blen, nlen); + dst = *tostr; buflen = *blen; #ifdef USE_ICONV - if (id != (iconv_t)-1) { - dst = buffer; buflen = CONV_BUFFER_SIZE; - } + if (id != (iconv_t)-1) { + dst = buffer; buflen = CONV_BUFFER_SIZE; + } #endif - for (i = 0, j = 0; i < len; ++i) { - n = wcrtomb(dst+j, str[i], &mbs); - if (n == -1) goto err; - j += n; - if (buflen < j + MB_CUR_MAX) { - if (id != (iconv_t)-1) { - CONVERT2(buffer, &j, cw, offset); - } else { - nlen += 256; - BINC_RETC(NULL, *tostr, *blen, nlen); - dst = *tostr; buflen = *blen; - } + for (i = 0, j = 0; i < len; ++i) { + n = wcrtomb(dst+j, str[i], &mbs); + if (n == -1) + goto err; + j += n; + if (buflen < j + MB_CUR_MAX) { + if (id != (iconv_t)-1) { + CONVERT2(buffer, &j, cw, offset); + } else { + nlen += 256; + BINC_RETC(NULL, *tostr, *blen, nlen); + dst = *tostr; buflen = *blen; + } + } } - } - n = wcrtomb(dst+j, L'\0', &mbs); - j += n - 1; /* don't count NUL at the end */ - *tolen = j; - - if (id != (iconv_t)-1) { - CONVERT2(buffer, &j, cw, offset); - CONVERT2(NULL, NULL, cw, offset); /* back to the initial state */ - *tolen = offset; - } - - error = 0; -err: - if (error) + n = wcrtomb(dst+j, L'\0', &mbs); + j += n - 1; /* don't count NUL at the end */ *tolen = j; - *pdst = cw->bp1.c; - IC_RESET(); - return error; + if (id != (iconv_t)-1) { + CONVERT2(buffer, &j, cw, offset); + /* back to the initial state */ + CONVERT2(NULL, NULL, cw, offset); + *tolen = offset; + } + + error = 0; +err: + if (error) + *tolen = j; + *pdst = cw->bp1.c; + IC_RESET(); + + return error; } static int fe_int2char(SCR *sp, const CHAR_T * str, ssize_t len, CONVWIN *cw, - size_t *tolen, char **dst) + size_t *tolen, char **dst) { - return default_int2char(sp, str, len, cw, tolen, dst, - sp->conv.id[IC_FE_INT2CHAR]); + return default_int2char(sp, str, len, cw, tolen, dst, + sp->conv.id[IC_FE_INT2CHAR]); } static int cs_int2char(SCR *sp, const CHAR_T * str, ssize_t len, CONVWIN *cw, - size_t *tolen, char **dst) + size_t *tolen, char **dst) { - return default_int2char(sp, str, len, cw, tolen, dst, - (iconv_t)-1); + return default_int2char(sp, str, len, cw, tolen, dst, (iconv_t)-1); } #endif @@ -306,58 +313,58 @@ cs_int2char(SCR *sp, const CHAR_T * str, ssize_t len, CONVWIN *cw, * conv_init -- * Initialize the iconv environment. * - * PUBLIC: void conv_init __P((SCR *, SCR *)); + * PUBLIC: void conv_init(SCR *, SCR *); */ void conv_init(SCR *orig, SCR *sp) { - int i; + int i; - if (orig == NULL) - setlocale(LC_ALL, ""); - if (orig != NULL) - BCOPY(&orig->conv, &sp->conv, 1); + if (orig == NULL) + setlocale(LC_ALL, ""); + if (orig != NULL) + BCOPY(&orig->conv, &sp->conv, 1); #ifdef USE_WIDECHAR - else { - char *ctype = setlocale(LC_CTYPE, NULL); + else { + char *ctype = setlocale(LC_CTYPE, NULL); - /* - * XXX - * This hack fixes the libncursesw issue on FreeBSD. - */ - if (!strcmp(ctype, "ko_KR.CP949")) - setlocale(LC_CTYPE, "ko_KR.eucKR"); - else if (!strcmp(ctype, "zh_CN.GB2312")) - setlocale(LC_CTYPE, "zh_CN.eucCN"); - else if (!strcmp(ctype, "zh_CN.GBK")) - setlocale(LC_CTYPE, "zh_CN.GB18030"); + /* + * XXX + * This hack fixes the libncursesw issue on FreeBSD. + */ + if (!strcmp(ctype, "ko_KR.CP949")) + setlocale(LC_CTYPE, "ko_KR.eucKR"); + else if (!strcmp(ctype, "zh_CN.GB2312")) + setlocale(LC_CTYPE, "zh_CN.eucCN"); + else if (!strcmp(ctype, "zh_CN.GBK")) + setlocale(LC_CTYPE, "zh_CN.GB18030"); - /* - * Switch to 8bit mode if locale is C; - * LC_CTYPE should be reseted to C if unmatched. - */ - if (!strcmp(ctype, "C") || !strcmp(ctype, "POSIX")) { - sp->conv.sys2int = sp->conv.file2int = raw2int; - sp->conv.int2sys = sp->conv.int2file = int2raw; - sp->conv.input2int = raw2int; - } else { - sp->conv.sys2int = cs_char2int; - sp->conv.int2sys = cs_int2char; - sp->conv.file2int = fe_char2int; - sp->conv.int2file = fe_int2char; - sp->conv.input2int = ie_char2int; + /* + * Switch to 8bit mode if locale is C; + * LC_CTYPE should be reseted to C if unmatched. + */ + if (!strcmp(ctype, "C") || !strcmp(ctype, "POSIX")) { + sp->conv.sys2int = sp->conv.file2int = raw2int; + sp->conv.int2sys = sp->conv.int2file = int2raw; + sp->conv.input2int = raw2int; + } else { + sp->conv.sys2int = cs_char2int; + sp->conv.int2sys = cs_int2char; + sp->conv.file2int = fe_char2int; + sp->conv.int2file = fe_int2char; + sp->conv.input2int = ie_char2int; + } +#ifdef USE_ICONV + o_set(sp, O_INPUTENCODING, OS_STRDUP, codeset(), 0); +#endif } -#ifdef USE_ICONV - o_set(sp, O_INPUTENCODING, OS_STRDUP, codeset(), 0); -#endif - } #endif - /* iconv descriptors must be distinct to screens. */ - for (i = 0; i <= IC_IE_TO_UTF16; ++i) - sp->conv.id[i] = (iconv_t)-1; + /* iconv descriptors must be distinct to screens. */ + for (i = 0; i <= IC_IE_TO_UTF16; ++i) + sp->conv.id[i] = (iconv_t)-1; #ifdef USE_ICONV - conv_enc(sp, O_INPUTENCODING, 0); + conv_enc(sp, O_INPUTENCODING, 0); #endif } @@ -365,82 +372,99 @@ conv_init(SCR *orig, SCR *sp) * conv_enc -- * Convert file/input encoding. * - * PUBLIC: int conv_enc __P((SCR *, int, char *)); + * PUBLIC: int conv_enc(SCR *, int, char *); */ int conv_enc(SCR *sp, int option, char *enc) { #if defined(USE_WIDECHAR) && defined(USE_ICONV) - iconv_t *c2w, *w2c; + iconv_t *c2w, *w2c; + iconv_t id_c2w, id_w2c; + + switch (option) { + case O_FILEENCODING: + c2w = sp->conv.id + IC_FE_CHAR2INT; + w2c = sp->conv.id + IC_FE_INT2CHAR; + if (!enc) + enc = O_STR(sp, O_FILEENCODING); + + if (strcasecmp(codeset(), enc)) { + if ((id_c2w = iconv_open(codeset(), enc)) == + (iconv_t)-1) + goto err; + if ((id_w2c = iconv_open(enc, codeset())) == + (iconv_t)-1) + goto err; + } else { + id_c2w = (iconv_t)-1; + id_w2c = (iconv_t)-1; + } + + break; + + case O_INPUTENCODING: + c2w = sp->conv.id + IC_IE_CHAR2INT; + w2c = sp->conv.id + IC_IE_TO_UTF16; + if (!enc) + enc = O_STR(sp, O_INPUTENCODING); + + if (strcasecmp(codeset(), enc)) { + if ((id_c2w = iconv_open(codeset(), enc)) == + (iconv_t)-1) + goto err; + } else + id_c2w = (iconv_t)-1; + + /* UTF-16 can not be locale and can not be inputed. */ + if ((id_w2c = iconv_open("utf-16be", enc)) == (iconv_t)-1) + goto err; + + break; + + default: + abort(); + } - switch (option) { - case O_FILEENCODING: - c2w = sp->conv.id + IC_FE_CHAR2INT; - w2c = sp->conv.id + IC_FE_INT2CHAR; - if (!enc) enc = O_STR(sp, O_FILEENCODING); if (*c2w != (iconv_t)-1) - iconv_close(*c2w); + iconv_close(*c2w); if (*w2c != (iconv_t)-1) - iconv_close(*w2c); - if (strcasecmp(codeset(), enc)) { - if ((*c2w = iconv_open(codeset(), enc)) == (iconv_t)-1) - goto err; - if ((*w2c = iconv_open(enc, codeset())) == (iconv_t)-1) - goto err; - } else *c2w = *w2c = (iconv_t)-1; - break; - case O_INPUTENCODING: - c2w = sp->conv.id + IC_IE_CHAR2INT; - w2c = sp->conv.id + IC_IE_TO_UTF16; - if (!enc) enc = O_STR(sp, O_INPUTENCODING); - if (*c2w != (iconv_t)-1) - iconv_close(*c2w); - if (*w2c != (iconv_t)-1) - iconv_close(*w2c); - if (strcasecmp(codeset(), enc)) { - if ((*c2w = iconv_open(codeset(), enc)) == (iconv_t)-1) - goto err; - } else *c2w = (iconv_t)-1; - /* UTF-16 can not be locale and can not be inputed. */ - if ((*w2c = iconv_open("utf-16be", enc)) == (iconv_t)-1) - goto err; - break; - } + iconv_close(*w2c); - F_CLR(sp, SC_CONV_ERROR); - F_SET(sp, SC_SCR_REFORMAT); + *c2w = id_c2w; + *w2c = id_w2c; - return 0; + F_CLR(sp, SC_CONV_ERROR); + F_SET(sp, SC_SCR_REFORMAT); + + return 0; err: #endif - switch (option) { - case O_FILEENCODING: - msgq(sp, M_ERR, - "321|File encoding conversion not supported"); - break; - case O_INPUTENCODING: - msgq(sp, M_ERR, - "322|Input encoding conversion not supported"); - break; - } - return 1; + switch (option) { + case O_FILEENCODING: + msgq(sp, M_ERR, "321|File encoding conversion not supported"); + break; + case O_INPUTENCODING: + msgq(sp, M_ERR, "322|Input encoding conversion not supported"); + break; + } + return 1; } /* * conv_end -- * Close the iconv descriptors, release the buffer. * - * PUBLIC: void conv_end __P((SCR *)); + * PUBLIC: void conv_end(SCR *); */ void conv_end(SCR *sp) { #if defined(USE_WIDECHAR) && defined(USE_ICONV) - int i; - for (i = 0; i <= IC_IE_TO_UTF16; ++i) - if (sp->conv.id[i] != (iconv_t)-1) - iconv_close(sp->conv.id[i]); + int i; + for (i = 0; i <= IC_IE_TO_UTF16; ++i) + if (sp->conv.id[i] != (iconv_t)-1) + iconv_close(sp->conv.id[i]); if (sp->cw.bp1.c != NULL) - free(sp->cw.bp1.c); + free(sp->cw.bp1.c); #endif } diff --git a/common/cut.c b/common/cut.c index 11db42fb8158..810aef6ac89c 100644 --- a/common/cut.c +++ b/common/cut.c @@ -27,7 +27,7 @@ static const char sccsid[] = "$Id: cut.c,v 10.12 2012/02/11 15:52:33 zy Exp $"; #include "common.h" -static void cb_rotate __P((SCR *)); +static void cb_rotate(SCR *); /* * cut -- @@ -61,7 +61,7 @@ static void cb_rotate __P((SCR *)); * replacing the contents. Hopefully it's not worth getting right, and here * we just treat the numeric buffers like any other named buffer. * - * PUBLIC: int cut __P((SCR *, CHAR_T *, MARK *, MARK *, int)); + * PUBLIC: int cut(SCR *, CHAR_T *, MARK *, MARK *, int); */ int cut( @@ -222,7 +222,7 @@ cb_rotate(SCR *sp) * cut_line -- * Cut a portion of a single line. * - * PUBLIC: int cut_line __P((SCR *, recno_t, size_t, size_t, CB *)); + * PUBLIC: int cut_line(SCR *, recno_t, size_t, size_t, CB *); */ int cut_line( @@ -266,7 +266,7 @@ cut_line( * cut_close -- * Discard all cut buffers. * - * PUBLIC: void cut_close __P((GS *)); + * PUBLIC: void cut_close(GS *); */ void cut_close(GS *gp) @@ -291,7 +291,7 @@ cut_close(GS *gp) * text_init -- * Allocate a new TEXT structure. * - * PUBLIC: TEXT *text_init __P((SCR *, const CHAR_T *, size_t, size_t)); + * PUBLIC: TEXT *text_init(SCR *, const CHAR_T *, size_t, size_t); */ TEXT * text_init( @@ -323,7 +323,7 @@ text_init( * text_lfree -- * Free a chain of text structures. * - * PUBLIC: void text_lfree __P((TEXTH *)); + * PUBLIC: void text_lfree(TEXTH *); */ void text_lfree(TEXTH *headp) @@ -340,7 +340,7 @@ text_lfree(TEXTH *headp) * text_free -- * Free a text structure. * - * PUBLIC: void text_free __P((TEXT *)); + * PUBLIC: void text_free(TEXT *); */ void text_free(TEXT *tp) diff --git a/common/delete.c b/common/delete.c index bb476c0c8a7c..b9bd0388946f 100644 --- a/common/delete.c +++ b/common/delete.c @@ -30,7 +30,7 @@ static const char sccsid[] = "$Id: delete.c,v 10.18 2012/02/11 15:52:33 zy Exp $ * del -- * Delete a range of text. * - * PUBLIC: int del __P((SCR *, MARK *, MARK *, int)); + * PUBLIC: int del(SCR *, MARK *, MARK *, int); */ int del( diff --git a/common/encoding.c b/common/encoding.c index 6de509e5b8ec..7bdcf7069238 100644 --- a/common/encoding.c +++ b/common/encoding.c @@ -11,10 +11,10 @@ static const char sccsid[] = "$Id: encoding.c,v 1.4 2011/12/13 19:40:52 zy Exp $ #include -int looks_utf8 __P((const char *, size_t)); -int looks_utf16 __P((const char *, size_t)); -int decode_utf8 __P((const char *)); -int decode_utf16 __P((const char *, int)); +int looks_utf8(const char *, size_t); +int looks_utf16(const char *, size_t); +int decode_utf8(const char *); +int decode_utf16(const char *, int); #define F 0 /* character never appears in text */ #define T 1 /* character appears in plain ASCII text */ @@ -54,7 +54,7 @@ static char text_chars[256] = { * * Based on RFC 3629. UTF-8 with BOM is not accepted. * - * PUBLIC: int looks_utf8 __P((const char *, size_t)); + * PUBLIC: int looks_utf8(const char *, size_t); */ int looks_utf8(const char *ibuf, size_t nbytes) @@ -115,7 +115,7 @@ looks_utf8(const char *ibuf, size_t nbytes) * 1: Little-endian UTF-16 * 2: Big-endian UTF-16 * - * PUBLIC: int looks_utf16 __P((const char *, size_t)); + * PUBLIC: int looks_utf16(const char *, size_t); */ int looks_utf16(const char *ibuf, size_t nbytes) @@ -175,9 +175,11 @@ looks_utf16(const char *ibuf, size_t nbytes) * * Based on RFC 3629, but without error detection. * - * PUBLIC: int decode_utf8 __P((const char *)); + * PUBLIC: int decode_utf8(const char *); */ -int decode_utf8(const char *ibuf) { +int +decode_utf8(const char *ibuf) +{ const u_char *buf = (u_char *)ibuf; int u = -1; @@ -194,6 +196,7 @@ int decode_utf8(const char *ibuf) { u = (buf[0] ^ 0xF0) << 18 ^ (buf[1] ^ 0x80) << 12 ^ (buf[2] ^ 0x80) << 6 ^ (buf[3] ^ 0x80); } + return u; } @@ -204,9 +207,11 @@ int decode_utf8(const char *ibuf) { * * No error detection on supplementary bytes. * - * PUBLIC: int decode_utf16 __P((const char *, int)); + * PUBLIC: int decode_utf16(const char *, int); */ -int decode_utf16(const char* ibuf, int bigend) { +int +decode_utf16(const char* ibuf, int bigend) +{ const u_char *buf = (u_char *)ibuf; int u = -1; unsigned int w1, w2; @@ -226,5 +231,6 @@ int decode_utf16(const char* ibuf, int bigend) { w2 = buf[2] ^ buf[3] << 8; u = ((w1 ^ 0xD800) << 10 ^ (w2 ^ 0xDC00)) + 0x10000; } + return u; } diff --git a/common/exf.c b/common/exf.c index 6579ab2118d3..1fcf7f6da498 100644 --- a/common/exf.c +++ b/common/exf.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "$Id: exf.c,v 10.62 2013/07/01 23:28:13 zy Exp $"; +static const char sccsid[] = "$Id: exf.c,v 10.64 2015/04/05 15:21:55 zy Exp $"; #endif /* not lint */ #include @@ -37,11 +37,11 @@ static const char sccsid[] = "$Id: exf.c,v 10.62 2013/07/01 23:28:13 zy Exp $"; #include "common.h" -static int file_backup __P((SCR *, char *, char *)); -static void file_cinit __P((SCR *)); -static void file_encinit __P((SCR *)); -static void file_comment __P((SCR *)); -static int file_spath __P((SCR *, FREF *, struct stat *, int *)); +static int file_backup(SCR *, char *, char *); +static void file_cinit(SCR *); +static void file_encinit(SCR *); +static void file_comment(SCR *); +static int file_spath(SCR *, FREF *, struct stat *, int *); /* * file_add -- @@ -56,7 +56,7 @@ static int file_spath __P((SCR *, FREF *, struct stat *, int *)); * vi now remembers the last location in any file that it has ever edited, * not just the previously edited file. * - * PUBLIC: FREF *file_add __P((SCR *, char *)); + * PUBLIC: FREF *file_add(SCR *, char *); */ FREF * file_add( @@ -118,7 +118,7 @@ file_add( * let go of any previous file. Don't release the previous file until * absolutely sure we have the new one. * - * PUBLIC: int file_init __P((SCR *, FREF *, char *, int)); + * PUBLIC: int file_init(SCR *, FREF *, char *, int); */ int file_init( @@ -259,6 +259,8 @@ file_init( DB_RECNO, &oinfo)) == NULL) { msgq_str(sp, M_SYSERR, rcv_name == NULL ? oname : rcv_name, "%s"); + if (F_ISSET(frp, FR_NEWFILE)) + goto err; /* * !!! * Historically, vi permitted users to edit files that couldn't @@ -340,6 +342,8 @@ file_init( break; case LOCK_UNAVAIL: readonly = 1; + if (F_ISSET(sp, SC_READONLY)) + break; msgq_str(sp, M_INFO, oname, "239|%s already locked, session is read-only"); break; @@ -625,7 +629,7 @@ file_cinit(SCR *sp) * file_end -- * Stop editing a file. * - * PUBLIC: int file_end __P((SCR *, EXF *, int)); + * PUBLIC: int file_end(SCR *, EXF *, int); */ int file_end( @@ -737,7 +741,7 @@ file_end( * semantics for whether or not writes would happen. That's * why all the flags. * - * PUBLIC: int file_write __P((SCR *, MARK *, MARK *, char *, int)); + * PUBLIC: int file_write(SCR *, MARK *, MARK *, char *, int); */ int file_write( @@ -841,7 +845,6 @@ file_write( return (1); /* Open the file. */ - SIGBLOCK; if ((fd = open(name, oflags, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)) < 0) { if (errno == EACCES && LF_ISSET(FS_FORCE)) { @@ -873,11 +876,9 @@ file_write( errno = EACCES; } msgq_str(sp, M_SYSERR, name, "%s"); - SIGUNBLOCK; return (1); } success_open: - SIGUNBLOCK; /* Try and get a lock. */ if (!noname && file_lock(sp, NULL, fd, 0) == LOCK_UNAVAIL) @@ -1246,7 +1247,7 @@ file_encinit(SCR *sp) if (looks_utf8(buf, blen) > 1) o_set(sp, O_FILEENCODING, OS_STRDUP, "utf-8", 0); else if (!O_ISSET(sp, O_FILEENCODING) || - !strncasecmp(O_STR(sp, O_FILEENCODING), "utf-8", 5)) + !strcasecmp(O_STR(sp, O_FILEENCODING), "utf-8")) o_set(sp, O_FILEENCODING, OS_STRDUP, codeset(), 0); conv_enc(sp, O_FILEENCODING, 0); @@ -1302,7 +1303,7 @@ file_comment(SCR *sp) * First modification check routine. The :next, :prev, :rewind, :tag, * :tagpush, :tagpop, ^^ modifications check. * - * PUBLIC: int file_m1 __P((SCR *, int, int)); + * PUBLIC: int file_m1(SCR *, int, int); */ int file_m1( @@ -1343,7 +1344,7 @@ file_m1( * Second modification check routine. The :edit, :quit, :recover * modifications check. * - * PUBLIC: int file_m2 __P((SCR *, int)); + * PUBLIC: int file_m2(SCR *, int); */ int file_m2( @@ -1375,7 +1376,7 @@ file_m2( * file_m3 -- * Third modification check routine. * - * PUBLIC: int file_m3 __P((SCR *, int)); + * PUBLIC: int file_m3(SCR *, int); */ int file_m3( @@ -1411,7 +1412,7 @@ file_m3( * is not set, write the file. A routine so there's a place to put the * comment. * - * PUBLIC: int file_aw __P((SCR *, int)); + * PUBLIC: int file_aw(SCR *, int); */ int file_aw( @@ -1472,7 +1473,7 @@ file_aw( * If the user edits a temporary file, there may be times when there is no * alternative file name. A name argument of NULL turns it off. * - * PUBLIC: void set_alt_name __P((SCR *, char *)); + * PUBLIC: void set_alt_name(SCR *, char *); */ void set_alt_name( @@ -1491,7 +1492,7 @@ set_alt_name( * file_lock -- * Get an exclusive lock on a file. * - * PUBLIC: lockr_t file_lock __P((SCR *, char *, int, int)); + * PUBLIC: lockr_t file_lock(SCR *, char *, int, int); */ lockr_t file_lock( diff --git a/common/extern.h b/common/extern.h index 20672e380b14..f8acf8eacd83 100644 --- a/common/extern.h +++ b/common/extern.h @@ -1,132 +1,132 @@ -char * codeset __P((void)); -void conv_init __P((SCR *, SCR *)); -int conv_enc __P((SCR *, int, char *)); -void conv_end __P((SCR *)); -int cut __P((SCR *, CHAR_T *, MARK *, MARK *, int)); -int cut_line __P((SCR *, recno_t, size_t, size_t, CB *)); -void cut_close __P((GS *)); -TEXT *text_init __P((SCR *, const CHAR_T *, size_t, size_t)); -void text_lfree __P((TEXTH *)); -void text_free __P((TEXT *)); -int del __P((SCR *, MARK *, MARK *, int)); -int looks_utf8 __P((const char *, size_t)); -int looks_utf16 __P((const char *, size_t)); -int decode_utf8 __P((const char *)); -int decode_utf16 __P((const char *, int)); -FREF *file_add __P((SCR *, char *)); -int file_init __P((SCR *, FREF *, char *, int)); -int file_end __P((SCR *, EXF *, int)); -int file_write __P((SCR *, MARK *, MARK *, char *, int)); -int file_m1 __P((SCR *, int, int)); -int file_m2 __P((SCR *, int)); -int file_m3 __P((SCR *, int)); -int file_aw __P((SCR *, int)); -void set_alt_name __P((SCR *, char *)); -lockr_t file_lock __P((SCR *, char *, int, int)); -int v_key_init __P((SCR *)); -void v_key_ilookup __P((SCR *)); -size_t v_key_len __P((SCR *, ARG_CHAR_T)); -char *v_key_name __P((SCR *, ARG_CHAR_T)); -e_key_t v_key_val __P((SCR *, ARG_CHAR_T)); -int v_event_push __P((SCR *, EVENT *, CHAR_T *, size_t, u_int)); -int v_event_get __P((SCR *, EVENT *, int, u_int32_t)); -void v_event_err __P((SCR *, EVENT *)); -int v_event_flush __P((SCR *, u_int)); -int db_eget __P((SCR *, recno_t, CHAR_T **, size_t *, int *)); -int db_get __P((SCR *, recno_t, u_int32_t, CHAR_T **, size_t *)); -int db_delete __P((SCR *, recno_t)); -int db_append __P((SCR *, int, recno_t, CHAR_T *, size_t)); -int db_insert __P((SCR *, recno_t, CHAR_T *, size_t)); -int db_set __P((SCR *, recno_t, CHAR_T *, size_t)); -int db_exist __P((SCR *, recno_t)); -int db_last __P((SCR *, recno_t *)); -int db_rget __P((SCR *, recno_t, char **, size_t *)); -int db_rset __P((SCR *, recno_t, char *, size_t)); -void db_err __P((SCR *, recno_t)); -int log_init __P((SCR *, EXF *)); -int log_end __P((SCR *, EXF *)); -int log_cursor __P((SCR *)); -int log_line __P((SCR *, recno_t, u_int)); -int log_mark __P((SCR *, LMARK *)); -int log_backward __P((SCR *, MARK *)); -int log_setline __P((SCR *)); -int log_forward __P((SCR *, MARK *)); -int editor __P((GS *, int, char *[])); -void v_end __P((GS *)); -int mark_init __P((SCR *, EXF *)); -int mark_end __P((SCR *, EXF *)); -int mark_get __P((SCR *, ARG_CHAR_T, MARK *, mtype_t)); -int mark_set __P((SCR *, ARG_CHAR_T, MARK *, int)); -int mark_insdel __P((SCR *, lnop_t, recno_t)); -void msgq __P((SCR *, mtype_t, const char *, ...)); -void msgq_wstr __P((SCR *, mtype_t, const CHAR_T *, const char *)); -void msgq_str __P((SCR *, mtype_t, const char *, const char *)); -void mod_rpt __P((SCR *)); -void msgq_status __P((SCR *, recno_t, u_int)); -int msg_open __P((SCR *, char *)); -void msg_close __P((GS *)); -const char *msg_cmsg __P((SCR *, cmsg_t, size_t *)); -const char *msg_cat __P((SCR *, const char *, size_t *)); -char *msg_print __P((SCR *, const char *, int *)); -int opts_init __P((SCR *, int *)); -int opts_set __P((SCR *, ARGS *[], char *)); -int o_set __P((SCR *, int, u_int, char *, u_long)); -int opts_empty __P((SCR *, int, int)); -void opts_dump __P((SCR *, enum optdisp)); -int opts_save __P((SCR *, FILE *)); -OPTLIST const *opts_search __P((CHAR_T *)); -void opts_nomatch __P((SCR *, CHAR_T *)); -int opts_copy __P((SCR *, SCR *)); -void opts_free __P((SCR *)); -int f_altwerase __P((SCR *, OPTION *, char *, u_long *)); -int f_columns __P((SCR *, OPTION *, char *, u_long *)); -int f_lines __P((SCR *, OPTION *, char *, u_long *)); -int f_lisp __P((SCR *, OPTION *, char *, u_long *)); -int f_msgcat __P((SCR *, OPTION *, char *, u_long *)); -int f_print __P((SCR *, OPTION *, char *, u_long *)); -int f_readonly __P((SCR *, OPTION *, char *, u_long *)); -int f_recompile __P((SCR *, OPTION *, char *, u_long *)); -int f_reformat __P((SCR *, OPTION *, char *, u_long *)); -int f_ttywerase __P((SCR *, OPTION *, char *, u_long *)); -int f_w300 __P((SCR *, OPTION *, char *, u_long *)); -int f_w1200 __P((SCR *, OPTION *, char *, u_long *)); -int f_w9600 __P((SCR *, OPTION *, char *, u_long *)); -int f_window __P((SCR *, OPTION *, char *, u_long *)); -int f_encoding __P((SCR *, OPTION *, char *, u_long *)); -int put __P((SCR *, CB *, CHAR_T *, MARK *, MARK *, int)); -int rcv_tmp __P((SCR *, EXF *, char *)); -int rcv_init __P((SCR *)); -int rcv_sync __P((SCR *, u_int)); -int rcv_list __P((SCR *)); -int rcv_read __P((SCR *, FREF *)); -int screen_init __P((GS *, SCR *, SCR **)); -int screen_end __P((SCR *)); -SCR *screen_next __P((SCR *)); -int f_search __P((SCR *, - MARK *, MARK *, CHAR_T *, size_t, CHAR_T **, u_int)); -int b_search __P((SCR *, - MARK *, MARK *, CHAR_T *, size_t, CHAR_T **, u_int)); -void search_busy __P((SCR *, busy_t)); -int seq_set __P((SCR *, CHAR_T *, - size_t, CHAR_T *, size_t, CHAR_T *, size_t, seq_t, int)); -int seq_delete __P((SCR *, CHAR_T *, size_t, seq_t)); -int seq_free __P((SEQ *)); +char * codeset(void); +void conv_init(SCR *, SCR *); +int conv_enc(SCR *, int, char *); +void conv_end(SCR *); +int cut(SCR *, CHAR_T *, MARK *, MARK *, int); +int cut_line(SCR *, recno_t, size_t, size_t, CB *); +void cut_close(GS *); +TEXT *text_init(SCR *, const CHAR_T *, size_t, size_t); +void text_lfree(TEXTH *); +void text_free(TEXT *); +int del(SCR *, MARK *, MARK *, int); +int looks_utf8(const char *, size_t); +int looks_utf16(const char *, size_t); +int decode_utf8(const char *); +int decode_utf16(const char *, int); +FREF *file_add(SCR *, char *); +int file_init(SCR *, FREF *, char *, int); +int file_end(SCR *, EXF *, int); +int file_write(SCR *, MARK *, MARK *, char *, int); +int file_m1(SCR *, int, int); +int file_m2(SCR *, int); +int file_m3(SCR *, int); +int file_aw(SCR *, int); +void set_alt_name(SCR *, char *); +lockr_t file_lock(SCR *, char *, int, int); +int v_key_init(SCR *); +void v_key_ilookup(SCR *); +size_t v_key_len(SCR *, ARG_CHAR_T); +char *v_key_name(SCR *, ARG_CHAR_T); +e_key_t v_key_val(SCR *, ARG_CHAR_T); +int v_event_push(SCR *, EVENT *, CHAR_T *, size_t, u_int); +int v_event_get(SCR *, EVENT *, int, u_int32_t); +void v_event_err(SCR *, EVENT *); +int v_event_flush(SCR *, u_int); +int db_eget(SCR *, recno_t, CHAR_T **, size_t *, int *); +int db_get(SCR *, recno_t, u_int32_t, CHAR_T **, size_t *); +int db_delete(SCR *, recno_t); +int db_append(SCR *, int, recno_t, CHAR_T *, size_t); +int db_insert(SCR *, recno_t, CHAR_T *, size_t); +int db_set(SCR *, recno_t, CHAR_T *, size_t); +int db_exist(SCR *, recno_t); +int db_last(SCR *, recno_t *); +int db_rget(SCR *, recno_t, char **, size_t *); +int db_rset(SCR *, recno_t, char *, size_t); +void db_err(SCR *, recno_t); +int log_init(SCR *, EXF *); +int log_end(SCR *, EXF *); +int log_cursor(SCR *); +int log_line(SCR *, recno_t, u_int); +int log_mark(SCR *, LMARK *); +int log_backward(SCR *, MARK *); +int log_setline(SCR *); +int log_forward(SCR *, MARK *); +int editor(GS *, int, char *[]); +void v_end(GS *); +int mark_init(SCR *, EXF *); +int mark_end(SCR *, EXF *); +int mark_get(SCR *, ARG_CHAR_T, MARK *, mtype_t); +int mark_set(SCR *, ARG_CHAR_T, MARK *, int); +int mark_insdel(SCR *, lnop_t, recno_t); +void msgq(SCR *, mtype_t, const char *, ...); +void msgq_wstr(SCR *, mtype_t, const CHAR_T *, const char *); +void msgq_str(SCR *, mtype_t, const char *, const char *); +void mod_rpt(SCR *); +void msgq_status(SCR *, recno_t, u_int); +int msg_open(SCR *, char *); +void msg_close(GS *); +const char *msg_cmsg(SCR *, cmsg_t, size_t *); +const char *msg_cat(SCR *, const char *, size_t *); +char *msg_print(SCR *, const char *, int *); +int opts_init(SCR *, int *); +int opts_set(SCR *, ARGS *[], char *); +int o_set(SCR *, int, u_int, char *, u_long); +int opts_empty(SCR *, int, int); +void opts_dump(SCR *, enum optdisp); +int opts_save(SCR *, FILE *); +OPTLIST const *opts_search(CHAR_T *); +void opts_nomatch(SCR *, CHAR_T *); +int opts_copy(SCR *, SCR *); +void opts_free(SCR *); +int f_altwerase(SCR *, OPTION *, char *, u_long *); +int f_columns(SCR *, OPTION *, char *, u_long *); +int f_lines(SCR *, OPTION *, char *, u_long *); +int f_lisp(SCR *, OPTION *, char *, u_long *); +int f_msgcat(SCR *, OPTION *, char *, u_long *); +int f_print(SCR *, OPTION *, char *, u_long *); +int f_readonly(SCR *, OPTION *, char *, u_long *); +int f_recompile(SCR *, OPTION *, char *, u_long *); +int f_reformat(SCR *, OPTION *, char *, u_long *); +int f_ttywerase(SCR *, OPTION *, char *, u_long *); +int f_w300(SCR *, OPTION *, char *, u_long *); +int f_w1200(SCR *, OPTION *, char *, u_long *); +int f_w9600(SCR *, OPTION *, char *, u_long *); +int f_window(SCR *, OPTION *, char *, u_long *); +int f_encoding(SCR *, OPTION *, char *, u_long *); +int put(SCR *, CB *, CHAR_T *, MARK *, MARK *, int); +int rcv_tmp(SCR *, EXF *, char *); +int rcv_init(SCR *); +int rcv_sync(SCR *, u_int); +int rcv_list(SCR *); +int rcv_read(SCR *, FREF *); +int screen_init(GS *, SCR *, SCR **); +int screen_end(SCR *); +SCR *screen_next(SCR *); +int f_search(SCR *, + MARK *, MARK *, CHAR_T *, size_t, CHAR_T **, u_int); +int b_search(SCR *, + MARK *, MARK *, CHAR_T *, size_t, CHAR_T **, u_int); +void search_busy(SCR *, busy_t); +int seq_set(SCR *, CHAR_T *, + size_t, CHAR_T *, size_t, CHAR_T *, size_t, seq_t, int); +int seq_delete(SCR *, CHAR_T *, size_t, seq_t); +int seq_free(SEQ *); SEQ *seq_find - __P((SCR *, SEQ **, EVENT *, CHAR_T *, size_t, seq_t, int *)); -void seq_close __P((GS *)); -int seq_dump __P((SCR *, seq_t, int)); -int seq_save __P((SCR *, FILE *, char *, seq_t)); -int e_memcmp __P((CHAR_T *, EVENT *, size_t)); -void *binc __P((SCR *, void *, size_t *, size_t)); -int nonblank __P((SCR *, recno_t, size_t *)); -char *tail __P((char *)); -char *join __P((char *, char *)); -char *expanduser __P((char *)); -char *quote __P((char *)); -char *v_strdup __P((SCR *, const char *, size_t)); -CHAR_T *v_wstrdup __P((SCR *, const CHAR_T *, size_t)); -enum nresult nget_uslong __P((u_long *, const CHAR_T *, CHAR_T **, int)); -enum nresult nget_slong __P((long *, const CHAR_T *, CHAR_T **, int)); -void timepoint_steady __P((struct timespec *)); -void timepoint_system __P((struct timespec *)); -void TRACE __P((SCR *, const char *, ...)); + (SCR *, SEQ **, EVENT *, CHAR_T *, size_t, seq_t, int *); +void seq_close(GS *); +int seq_dump(SCR *, seq_t, int); +int seq_save(SCR *, FILE *, char *, seq_t); +int e_memcmp(CHAR_T *, EVENT *, size_t); +void *binc(SCR *, void *, size_t *, size_t); +int nonblank(SCR *, recno_t, size_t *); +char *tail(char *); +char *join(char *, char *); +char *expanduser(char *); +char *quote(char *); +char *v_strdup(SCR *, const char *, size_t); +CHAR_T *v_wstrdup(SCR *, const CHAR_T *, size_t); +enum nresult nget_uslong(u_long *, const CHAR_T *, CHAR_T **, int); +enum nresult nget_slong(long *, const CHAR_T *, CHAR_T **, int); +void timepoint_steady(struct timespec *); +void timepoint_system(struct timespec *); +void TRACE(SCR *, const char *, ...); diff --git a/common/gs.h b/common/gs.h index 33a02458b0f9..4d0dc6fe5bf8 100644 --- a/common/gs.h +++ b/common/gs.h @@ -144,73 +144,55 @@ struct _gs { /* Screen interface functions. */ /* Add a string to the screen. */ - int (*scr_addstr) __P((SCR *, const char *, size_t)); + int (*scr_addstr)(SCR *, const char *, size_t); /* Add a string to the screen. */ - int (*scr_waddstr) __P((SCR *, const CHAR_T *, size_t)); + int (*scr_waddstr)(SCR *, const CHAR_T *, size_t); /* Toggle a screen attribute. */ - int (*scr_attr) __P((SCR *, scr_attr_t, int)); + int (*scr_attr)(SCR *, scr_attr_t, int); /* Terminal baud rate. */ - int (*scr_baud) __P((SCR *, u_long *)); + int (*scr_baud)(SCR *, u_long *); /* Beep/bell/flash the terminal. */ - int (*scr_bell) __P((SCR *)); + int (*scr_bell)(SCR *); /* Display a busy message. */ - void (*scr_busy) __P((SCR *, const char *, busy_t)); + void (*scr_busy)(SCR *, const char *, busy_t); /* Prepare child. */ - int (*scr_child) __P((SCR *)); + int (*scr_child)(SCR *); /* Clear to the end of the line. */ - int (*scr_clrtoeol) __P((SCR *)); + int (*scr_clrtoeol)(SCR *); /* Return the cursor location. */ - int (*scr_cursor) __P((SCR *, size_t *, size_t *)); + int (*scr_cursor)(SCR *, size_t *, size_t *); /* Delete a line. */ - int (*scr_deleteln) __P((SCR *)); + int (*scr_deleteln)(SCR *); /* Discard a screen. */ - int (*scr_discard) __P((SCR *, SCR **)); + int (*scr_discard)(SCR *, SCR **); /* Get a keyboard event. */ - int (*scr_event) __P((SCR *, EVENT *, u_int32_t, int)); + int (*scr_event)(SCR *, EVENT *, u_int32_t, int); /* Ex: screen adjustment routine. */ - int (*scr_ex_adjust) __P((SCR *, exadj_t)); + int (*scr_ex_adjust)(SCR *, exadj_t); int (*scr_fmap) /* Set a function key. */ - __P((SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t)); + (SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t); /* Get terminal key value. */ - int (*scr_keyval) __P((SCR *, scr_keyval_t, CHAR_T *, int *)); + int (*scr_keyval)(SCR *, scr_keyval_t, CHAR_T *, int *); /* Insert a line. */ - int (*scr_insertln) __P((SCR *)); + int (*scr_insertln)(SCR *); /* Handle an option change. */ - int (*scr_optchange) __P((SCR *, int, char *, u_long *)); + int (*scr_optchange)(SCR *, int, char *, u_long *); /* Move the cursor. */ - int (*scr_move) __P((SCR *, size_t, size_t)); + int (*scr_move)(SCR *, size_t, size_t); /* Message or ex output. */ - void (*scr_msg) __P((SCR *, mtype_t, char *, size_t)); + void (*scr_msg)(SCR *, mtype_t, char *, size_t); /* Refresh the screen. */ - int (*scr_refresh) __P((SCR *, int)); + int (*scr_refresh)(SCR *, int); /* Rename the file. */ - int (*scr_rename) __P((SCR *, char *, int)); + int (*scr_rename)(SCR *, char *, int); /* Reply to an event. */ - int (*scr_reply) __P((SCR *, int, char *)); + int (*scr_reply)(SCR *, int, char *); /* Set the screen type. */ - int (*scr_screen) __P((SCR *, u_int32_t)); + int (*scr_screen)(SCR *, u_int32_t); /* Split the screen. */ - int (*scr_split) __P((SCR *, SCR *)); + int (*scr_split)(SCR *, SCR *); /* Suspend the editor. */ - int (*scr_suspend) __P((SCR *, int *)); + int (*scr_suspend)(SCR *, int *); /* Print usage message. */ - void (*scr_usage) __P((void)); + void (*scr_usage)(void); }; - -/* - * XXX - * Block signals if there are asynchronous events. Used to keep DB system calls - * from being interrupted and not restarted, as that will result in consistency - * problems. This should be handled by DB. - */ -#ifdef BLOCK_SIGNALS -#include -extern sigset_t __sigblockset; -#define SIGBLOCK \ - (void)sigprocmask(SIG_BLOCK, &__sigblockset, NULL) -#define SIGUNBLOCK \ - (void)sigprocmask(SIG_UNBLOCK, &__sigblockset, NULL); -#else -#define SIGBLOCK -#define SIGUNBLOCK -#endif diff --git a/common/key.c b/common/key.c index 9fc20b73d940..790c3719e9b6 100644 --- a/common/key.c +++ b/common/key.c @@ -30,11 +30,11 @@ static const char sccsid[] = "$Id: key.c,v 10.54 2013/11/13 12:15:27 zy Exp $"; #include "common.h" #include "../vi/vi.h" -static int v_event_append __P((SCR *, EVENT *)); -static int v_event_grow __P((SCR *, int)); -static int v_key_cmp __P((const void *, const void *)); -static void v_keyval __P((SCR *, int, scr_keyval_t)); -static void v_sync __P((SCR *, int)); +static int v_event_append(SCR *, EVENT *); +static int v_event_grow(SCR *, int); +static int v_key_cmp(const void *, const void *); +static void v_keyval(SCR *, int, scr_keyval_t); +static void v_sync(SCR *, int); /* * !!! @@ -97,7 +97,7 @@ static int nkeylist = * v_key_init -- * Initialize the special key lookup table. * - * PUBLIC: int v_key_init __P((SCR *)); + * PUBLIC: int v_key_init(SCR *); */ int v_key_init(SCR *sp) @@ -179,7 +179,7 @@ v_keyval( * v_key_ilookup -- * Build the fast-lookup key display array. * - * PUBLIC: void v_key_ilookup __P((SCR *)); + * PUBLIC: void v_key_ilookup(SCR *); */ void v_key_ilookup(SCR *sp) @@ -203,7 +203,7 @@ v_key_ilookup(SCR *sp) * Return the length of the string that will display the key. * This routine is the backup for the KEY_LEN() macro. * - * PUBLIC: size_t v_key_len __P((SCR *, ARG_CHAR_T)); + * PUBLIC: size_t v_key_len(SCR *, ARG_CHAR_T); */ size_t v_key_len( @@ -219,7 +219,7 @@ v_key_len( * Return the string that will display the key. This routine * is the backup for the KEY_NAME() macro. * - * PUBLIC: char *v_key_name __P((SCR *, ARG_CHAR_T)); + * PUBLIC: char *v_key_name(SCR *, ARG_CHAR_T); */ char * v_key_name( @@ -327,7 +327,7 @@ done: sp->cname[sp->clen = len] = '\0'; * Fill in the value for a key. This routine is the backup * for the KEY_VAL() macro. * - * PUBLIC: e_key_t v_key_val __P((SCR *, ARG_CHAR_T)); + * PUBLIC: e_key_t v_key_val(SCR *, ARG_CHAR_T); */ e_key_t v_key_val( @@ -351,7 +351,7 @@ v_key_val( * an associated flag value, which indicates if it has already been quoted, * and if it is the result of a mapping or an abbreviation. * - * PUBLIC: int v_event_push __P((SCR *, EVENT *, CHAR_T *, size_t, u_int)); + * PUBLIC: int v_event_push(SCR *, EVENT *, CHAR_T *, size_t, u_int); */ int v_event_push( @@ -532,7 +532,7 @@ v_event_append( * point. Given that this might make the log grow unacceptably (consider that * cursor keys are done with maps), for now we leave any changes made in place. * - * PUBLIC: int v_event_get __P((SCR *, EVENT *, int, u_int32_t)); + * PUBLIC: int v_event_get(SCR *, EVENT *, int, u_int32_t); */ int v_event_get( @@ -771,7 +771,7 @@ v_sync( * v_event_err -- * Unexpected event. * - * PUBLIC: void v_event_err __P((SCR *, EVENT *)); + * PUBLIC: void v_event_err(SCR *, EVENT *); */ void v_event_err( @@ -821,7 +821,7 @@ v_event_err( * v_event_flush -- * Flush any flagged keys, returning if any keys were flushed. * - * PUBLIC: int v_event_flush __P((SCR *, u_int)); + * PUBLIC: int v_event_flush(SCR *, u_int); */ int v_event_flush( diff --git a/common/line.c b/common/line.c index 0bceccfa5bcc..5549ad93cb66 100644 --- a/common/line.c +++ b/common/line.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "$Id: line.c,v 10.26 2011/08/12 12:36:41 zy Exp $"; +static const char sccsid[] = "$Id: line.c,v 10.27 2015/04/03 14:17:21 zy Exp $"; #endif /* not lint */ #include @@ -26,13 +26,13 @@ static const char sccsid[] = "$Id: line.c,v 10.26 2011/08/12 12:36:41 zy Exp $"; #include "common.h" #include "../vi/vi.h" -static int scr_update __P((SCR *, recno_t, lnop_t, int)); +static int scr_update(SCR *, recno_t, lnop_t, int); /* * db_eget -- * Front-end to db_get, special case handling for empty files. * - * PUBLIC: int db_eget __P((SCR *, recno_t, CHAR_T **, size_t *, int *)); + * PUBLIC: int db_eget(SCR *, recno_t, CHAR_T **, size_t *, int *); */ int db_eget( @@ -76,7 +76,7 @@ db_eget( * Look in the text buffers for a line, followed by the cache, followed * by the database. * - * PUBLIC: int db_get __P((SCR *, recno_t, u_int32_t, CHAR_T **, size_t *)); + * PUBLIC: int db_get(SCR *, recno_t, u_int32_t, CHAR_T **, size_t *); */ int db_get( @@ -92,7 +92,6 @@ db_get( recno_t l1, l2; CHAR_T *wp; size_t wlen; - size_t nlen; /* * The underlying recno stuff handles zero by returning NULL, but @@ -152,8 +151,6 @@ db_get( ep->c_lno = OOBLNO; nocache: - nlen = 1024; -retry: /* Get the line from the underlying database. */ key.data = &lno; key.size = sizeof(lno); @@ -169,11 +166,6 @@ err3: if (lenp != NULL) if (pp != NULL) *pp = NULL; return (1); - case 0: - if (data.size > nlen) { - nlen = data.size; - goto retry; - } } if (FILE2INT(sp, data.data, data.size, wp, wlen)) { @@ -207,7 +199,7 @@ err3: if (lenp != NULL) * db_delete -- * Delete a line from the file. * - * PUBLIC: int db_delete __P((SCR *, recno_t)); + * PUBLIC: int db_delete(SCR *, recno_t); */ int db_delete( @@ -238,13 +230,11 @@ db_delete( /* Update file. */ key.data = &lno; key.size = sizeof(lno); - SIGBLOCK; if (ep->db->del(ep->db, &key, 0) == 1) { msgq(sp, M_SYSERR, "003|unable to delete line %lu", (u_long)lno); return (1); } - SIGUNBLOCK; /* Flush the cache, update line count, before screen update. */ if (lno <= ep->c_lno) @@ -265,7 +255,7 @@ db_delete( * db_append -- * Append a line into the file. * - * PUBLIC: int db_append __P((SCR *, int, recno_t, CHAR_T *, size_t)); + * PUBLIC: int db_append(SCR *, int, recno_t, CHAR_T *, size_t); */ int db_append( @@ -297,13 +287,11 @@ db_append( key.size = sizeof(lno); data.data = fp; data.size = flen; - SIGBLOCK; if (ep->db->put(ep->db, &key, &data, R_IAFTER) == -1) { msgq(sp, M_SYSERR, "004|unable to append to line %lu", (u_long)lno); return (1); } - SIGUNBLOCK; /* Flush the cache, update line count, before screen update. */ if (lno < ep->c_lno) @@ -343,7 +331,7 @@ db_append( * db_insert -- * Insert a line into the file. * - * PUBLIC: int db_insert __P((SCR *, recno_t, CHAR_T *, size_t)); + * PUBLIC: int db_insert(SCR *, recno_t, CHAR_T *, size_t); */ int db_insert( @@ -375,13 +363,11 @@ db_insert( key.size = sizeof(lno); data.data = fp; data.size = flen; - SIGBLOCK; if (ep->db->put(ep->db, &key, &data, R_IBEFORE) == -1) { msgq(sp, M_SYSERR, "005|unable to insert at line %lu", (u_long)lno); return (1); } - SIGUNBLOCK; /* Flush the cache, update line count, before screen update. */ if (lno >= ep->c_lno) @@ -412,7 +398,7 @@ db_insert( * db_set -- * Store a line in the file. * - * PUBLIC: int db_set __P((SCR *, recno_t, CHAR_T *, size_t)); + * PUBLIC: int db_set(SCR *, recno_t, CHAR_T *, size_t); */ int db_set( @@ -446,13 +432,11 @@ db_set( key.size = sizeof(lno); data.data = fp; data.size = flen; - SIGBLOCK; if (ep->db->put(ep->db, &key, &data, 0) == -1) { msgq(sp, M_SYSERR, "006|unable to store line %lu", (u_long)lno); return (1); } - SIGUNBLOCK; /* Flush the cache, before logging or screen update. */ if (lno == ep->c_lno) @@ -474,7 +458,7 @@ db_set( * db_exist -- * Return if a line exists. * - * PUBLIC: int db_exist __P((SCR *, recno_t)); + * PUBLIC: int db_exist(SCR *, recno_t); */ int db_exist( @@ -509,7 +493,7 @@ db_exist( * db_last -- * Return the number of lines in the file. * - * PUBLIC: int db_last __P((SCR *, recno_t *)); + * PUBLIC: int db_last(SCR *, recno_t *); */ int db_last( @@ -552,8 +536,6 @@ db_last( case 1: *lnop = 0; return (0); - case 0: - ; } memcpy(&lno, key.data, sizeof(lno)); @@ -581,9 +563,9 @@ db_last( /* * db_rget -- - * Retrieve a raw line from database. No cache, no conversion. + * Retrieve a raw line from the database. * - * PUBLIC: int db_rget __P((SCR *, recno_t, char **, size_t *)); + * PUBLIC: int db_rget(SCR *, recno_t, char **, size_t *); */ int db_rget( @@ -593,31 +575,26 @@ db_rget( size_t *lenp) /* Length store. */ { DBT data, key; - EXF *ep; - - /* Check for no underlying file. */ - if ((ep = sp->ep) == NULL) - return (1); + EXF *ep = sp->ep; + int rval; /* Get the line from the underlying database. */ key.data = &lno; key.size = sizeof(lno); - if (ep->db->get(ep->db, &key, &data, 0)) - /* We do not report error, and do not ensure the size! */ - return (1); - - if (lenp != NULL) + if ((rval = ep->db->get(ep->db, &key, &data, 0)) == 0) + { *lenp = data.size; - if (pp != NULL) *pp = data.data; - return (0); + } + + return (rval); } /* * db_rset -- - * Store a line in the file. No log, no conversion. + * Store a raw line into the database. * - * PUBLIC: int db_rset __P((SCR *, recno_t, char *, size_t)); + * PUBLIC: int db_rset(SCR *, recno_t, char *, size_t); */ int db_rset( @@ -627,29 +604,21 @@ db_rset( size_t len) { DBT data, key; - EXF *ep; + EXF *ep = sp->ep; - /* Check for no underlying file. */ - if ((ep = sp->ep) == NULL) - return (1); - /* Update file. */ key.data = &lno; key.size = sizeof(lno); data.data = p; data.size = len; - if (ep->db->put(ep->db, &key, &data, 0) == -1) - /* We do not report error, and do not ensure the size! */ - return (1); - - return (0); + return ep->db->put(ep->db, &key, &data, 0); } /* * db_err -- * Report a line error. * - * PUBLIC: void db_err __P((SCR *, recno_t)); + * PUBLIC: void db_err(SCR *, recno_t); */ void db_err( diff --git a/common/log.c b/common/log.c index eb8d85bc84cf..5adfeaf0fc58 100644 --- a/common/log.c +++ b/common/log.c @@ -63,13 +63,13 @@ static const char sccsid[] = "$Id: log.c,v 10.27 2011/07/13 06:25:50 zy Exp $"; * behaved that way. */ -static int log_cursor1 __P((SCR *, int)); -static void log_err __P((SCR *, char *, int)); +static int log_cursor1(SCR *, int); +static void log_err(SCR *, char *, int); #if defined(DEBUG) && 0 -static void log_trace __P((SCR *, char *, recno_t, u_char *)); +static void log_trace(SCR *, char *, recno_t, u_char *); #endif -static int apply_with __P((int (*)(SCR *, recno_t, CHAR_T *, size_t), - SCR *, recno_t, u_char *, size_t)); +static int apply_with(int (*)(SCR *, recno_t, CHAR_T *, size_t), + SCR *, recno_t, u_char *, size_t); /* Try and restart the log on failure, i.e. if we run out of memory. */ #define LOG_ERR { \ @@ -81,8 +81,8 @@ static int apply_with __P((int (*)(SCR *, recno_t, CHAR_T *, size_t), * because it is passed to db_set as a string */ typedef struct { - char data[sizeof(u_char) /* type */ + sizeof(recno_t)]; - CHAR_T str[1]; + char data[sizeof(u_char) /* type */ + sizeof(recno_t)]; + CHAR_T str[1]; } log_t; #define CHAR_T_OFFSET ((char *)(((log_t*)0)->str) - (char *)0) @@ -90,7 +90,7 @@ typedef struct { * log_init -- * Initialize the logging subsystem. * - * PUBLIC: int log_init __P((SCR *, EXF *)); + * PUBLIC: int log_init(SCR *, EXF *); */ int log_init( @@ -126,7 +126,7 @@ log_init( * log_end -- * Close the logging subsystem. * - * PUBLIC: int log_end __P((SCR *, EXF *)); + * PUBLIC: int log_end(SCR *, EXF *); */ int log_end( @@ -156,7 +156,7 @@ log_end( * log_cursor -- * Log the current cursor position, starting an event. * - * PUBLIC: int log_cursor __P((SCR *)); + * PUBLIC: int log_cursor(SCR *); */ int log_cursor(SCR *sp) @@ -221,7 +221,7 @@ log_cursor1( * log_line -- * Log a line change. * - * PUBLIC: int log_line __P((SCR *, recno_t, u_int)); + * PUBLIC: int log_line(SCR *, recno_t, u_int); */ int log_line( @@ -324,7 +324,7 @@ log_line( * would mean that undo operations would only reset marks, and not * cause any other change. * - * PUBLIC: int log_mark __P((SCR *, LMARK *)); + * PUBLIC: int log_mark(SCR *, LMARK *); */ int log_mark( @@ -370,7 +370,7 @@ log_mark( * Log_backward -- * Roll the log backward one operation. * - * PUBLIC: int log_backward __P((SCR *, MARK *)); + * PUBLIC: int log_backward(SCR *, MARK *); */ int log_backward( @@ -474,7 +474,7 @@ err: F_CLR(ep, F_NOLOG); * then move back on and do a 'U', the line will be restored to the way * it was before the original change. * - * PUBLIC: int log_setline __P((SCR *)); + * PUBLIC: int log_setline(SCR *); */ int log_setline(SCR *sp) @@ -558,7 +558,7 @@ err: F_CLR(ep, F_NOLOG); * Log_forward -- * Roll the log forward one operation. * - * PUBLIC: int log_forward __P((SCR *, MARK *)); + * PUBLIC: int log_forward(SCR *, MARK *); */ int log_forward( diff --git a/common/main.c b/common/main.c index 6ff418173007..d9ae96f9e7dd 100644 --- a/common/main.c +++ b/common/main.c @@ -9,14 +9,6 @@ #include "config.h" -#ifndef lint -static const char copyright[] = -"@(#) Copyright (c) 1992, 1993, 1994\n\ - The Regents of the University of California. All rights reserved.\n\ -@(#) Copyright (c) 1992, 1993, 1994, 1995, 1996\n\ - Keith Bostic. All rights reserved.\n"; -#endif /* not lint */ - #ifndef lint static const char sccsid[] = "$Id: main.c,v 11.0 2012/10/17 06:34:37 zy Exp $"; #endif /* not lint */ @@ -38,15 +30,15 @@ static const char sccsid[] = "$Id: main.c,v 11.0 2012/10/17 06:34:37 zy Exp $"; #include "../vi/vi.h" #include "pathnames.h" -static void attach __P((GS *)); -static void v_estr __P((char *, int, char *)); -static int v_obsolete __P((char *, char *[])); +static void attach(GS *); +static void v_estr(char *, int, char *); +static int v_obsolete(char *, char *[]); /* * editor -- * Main editor routine. * - * PUBLIC: int editor __P((GS *, int, char *[])); + * PUBLIC: int editor(GS *, int, char *[]); */ int editor( @@ -436,7 +428,7 @@ err: rval = 1; * v_end -- * End the program, discarding screens and most of the global area. * - * PUBLIC: void v_end __P((GS *)); + * PUBLIC: void v_end(GS *); */ void v_end(gp) @@ -455,7 +447,7 @@ v_end(gp) while ((sp = TAILQ_FIRST(gp->hq)) != NULL) (void)screen_end(sp); -#if defined(DEBUG) || defined(PURIFY) || defined(LIBRARY) +#if defined(DEBUG) || defined(PURIFY) { FREF *frp; /* Free FREF's. */ while ((frp = TAILQ_FIRST(gp->frefq)) != NULL) { @@ -499,13 +491,13 @@ v_end(gp) (void)fprintf(stderr, "%s%.*s", mp->mtype == M_ERR ? "ex/vi: " : "", (int)mp->len, mp->buf); SLIST_REMOVE_HEAD(gp->msgq, q); -#if defined(DEBUG) || defined(PURIFY) || defined(LIBRARY) +#if defined(DEBUG) || defined(PURIFY) free(mp->buf); free(mp); #endif } -#if defined(DEBUG) || defined(PURIFY) || defined(LIBRARY) +#if defined(DEBUG) || defined(PURIFY) /* Free any temporary space. */ if (gp->tmp_bp != NULL) free(gp->tmp_bp); diff --git a/common/mark.c b/common/mark.c index 7a954392278c..a3158e4560b6 100644 --- a/common/mark.c +++ b/common/mark.c @@ -26,7 +26,7 @@ static const char sccsid[] = "$Id: mark.c,v 10.14 2011/07/04 14:42:58 zy Exp $"; #include "common.h" -static LMARK *mark_find __P((SCR *, ARG_CHAR_T)); +static LMARK *mark_find(SCR *, ARG_CHAR_T); /* * Marks are maintained in a key sorted singly linked list. We can't @@ -63,7 +63,7 @@ static LMARK *mark_find __P((SCR *, ARG_CHAR_T)); * mark_init -- * Set up the marks. * - * PUBLIC: int mark_init __P((SCR *, EXF *)); + * PUBLIC: int mark_init(SCR *, EXF *); */ int mark_init( @@ -84,7 +84,7 @@ mark_init( * mark_end -- * Free up the marks. * - * PUBLIC: int mark_end __P((SCR *, EXF *)); + * PUBLIC: int mark_end(SCR *, EXF *); */ int mark_end( @@ -108,7 +108,7 @@ mark_end( * mark_get -- * Get the location referenced by a mark. * - * PUBLIC: int mark_get __P((SCR *, ARG_CHAR_T, MARK *, mtype_t)); + * PUBLIC: int mark_get(SCR *, ARG_CHAR_T, MARK *, mtype_t); */ int mark_get( @@ -125,12 +125,12 @@ mark_get( lmp = mark_find(sp, key); if (lmp == NULL || lmp->name != key) { msgq(sp, mtype, "017|Mark %s: not set", KEY_NAME(sp, key)); - return (1); + return (1); } if (F_ISSET(lmp, MARK_DELETED)) { msgq(sp, mtype, "018|Mark %s: the line was deleted", KEY_NAME(sp, key)); - return (1); + return (1); } /* @@ -153,7 +153,7 @@ mark_get( * mark_set -- * Set the location referenced by a mark. * - * PUBLIC: int mark_set __P((SCR *, ARG_CHAR_T, MARK *, int)); + * PUBLIC: int mark_set(SCR *, ARG_CHAR_T, MARK *, int); */ int mark_set( @@ -220,7 +220,7 @@ mark_find( * mark_insdel -- * Update the marks based on an insertion or deletion. * - * PUBLIC: int mark_insdel __P((SCR *, lnop_t, recno_t)); + * PUBLIC: int mark_insdel(SCR *, lnop_t, recno_t); */ int mark_insdel( diff --git a/common/msg.c b/common/msg.c index c0930b88afcd..3099b1e98b3c 100644 --- a/common/msg.c +++ b/common/msg.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "$Id: msg.c,v 11.0 2012/10/17 06:34:37 zy Exp $"; +static const char sccsid[] = "$Id: msg.c,v 11.1 2015/02/09 11:12:44 marc Exp $"; #endif /* not lint */ #include @@ -36,7 +36,7 @@ static const char sccsid[] = "$Id: msg.c,v 11.0 2012/10/17 06:34:37 zy Exp $"; * msgq -- * Display a message. * - * PUBLIC: void msgq __P((SCR *, mtype_t, const char *, ...)); + * PUBLIC: void msgq(SCR *, mtype_t, const char *, ...); */ void msgq( @@ -60,7 +60,7 @@ msgq( size_t blen, len, mlen, nlen; const char *p; char *bp, *mp; - va_list ap; + va_list ap; #ifndef NL_ARGMAX int ch; char *rbp, *s_rbp; @@ -274,7 +274,7 @@ retry: FREE_SPACE(sp, bp, blen); #ifndef NL_ARGMAX format: /* Format the arguments into the string. */ #endif - va_start(ap, fmt); + va_start(ap, fmt); len = vsnprintf(mp, REM, fmt, ap); va_end(ap); if (len >= nlen) @@ -356,7 +356,7 @@ nofmt: mp += len; * msgq_wstr -- * Display a message with an embedded string. * - * PUBLIC: void msgq_wstr __P((SCR *, mtype_t, const CHAR_T *, const char *)); + * PUBLIC: void msgq_wstr(SCR *, mtype_t, const CHAR_T *, const char *); */ void msgq_wstr( @@ -380,7 +380,7 @@ msgq_wstr( * msgq_str -- * Display a message with an embedded string. * - * PUBLIC: void msgq_str __P((SCR *, mtype_t, const char *, const char *)); + * PUBLIC: void msgq_str(SCR *, mtype_t, const char *, const char *); */ void msgq_str( @@ -423,7 +423,7 @@ msgq_str( * the command 2d}, from the 'b' would report that two lines were deleted, * not one. * - * PUBLIC: void mod_rpt __P((SCR *)); + * PUBLIC: void mod_rpt(SCR *); */ void mod_rpt(SCR *sp) @@ -533,7 +533,7 @@ mod_rpt(SCR *sp) * msgq_status -- * Report on the file's status. * - * PUBLIC: void msgq_status __P((SCR *, recno_t, u_int)); + * PUBLIC: void msgq_status(SCR *, recno_t, u_int); */ void msgq_status( @@ -647,7 +647,7 @@ msgq_status( p += len; } else { t = msg_cat(sp, "027|line %lu of %lu [%ld%%]", &len); - (void)snprintf(p, ep - p, t, lno, last, + (void)snprintf(p, ep - p, t, (u_long)lno, (u_long)last, ((u_long)lno * 100) / last); p += strlen(p); } @@ -705,7 +705,7 @@ msgq_status( * msg_open -- * Open the message catalogs. * - * PUBLIC: int msg_open __P((SCR *, char *)); + * PUBLIC: int msg_open(SCR *, char *); */ int msg_open( @@ -772,7 +772,7 @@ ret: free(p); * msg_close -- * Close the message catalogs. * - * PUBLIC: void msg_close __P((GS *)); + * PUBLIC: void msg_close(GS *); */ void msg_close(GS *gp) @@ -785,7 +785,7 @@ msg_close(GS *gp) * msg_cont -- * Return common continuation messages. * - * PUBLIC: const char *msg_cmsg __P((SCR *, cmsg_t, size_t *)); + * PUBLIC: const char *msg_cmsg(SCR *, cmsg_t, size_t *); */ const char * msg_cmsg( @@ -823,7 +823,7 @@ msg_cmsg( * Only a single catalog message can be accessed at a time, if multiple * ones are needed, they must be copied into local memory. * - * PUBLIC: const char *msg_cat __P((SCR *, const char *, size_t *)); + * PUBLIC: const char *msg_cat(SCR *, const char *, size_t *); */ const char * msg_cat( @@ -861,7 +861,7 @@ msg_cat( * msg_print -- * Return a printable version of a string, in allocated memory. * - * PUBLIC: char *msg_print __P((SCR *, const char *, int *)); + * PUBLIC: char *msg_print(SCR *, const char *, int *); */ char * msg_print( diff --git a/common/options.c b/common/options.c index 71a5e43e58cb..e619d8f08eb7 100644 --- a/common/options.c +++ b/common/options.c @@ -30,9 +30,9 @@ static const char sccsid[] = "$Id: options.c,v 10.73 2012/10/09 06:14:07 zy Exp #include "../vi/vi.h" #include "pathnames.h" -static int opts_abbcmp __P((const void *, const void *)); -static int opts_cmp __P((const void *, const void *)); -static int opts_print __P((SCR *, OPTLIST const *)); +static int opts_abbcmp(const void *, const void *); +static int opts_cmp(const void *, const void *); +static int opts_print(SCR *, OPTLIST const *); #ifdef USE_WIDECHAR #define OPT_WC 0 @@ -243,8 +243,8 @@ OPTLIST const optlist[] = { }; typedef struct abbrev { - CHAR_T *name; - int offset; + CHAR_T *name; + int offset; } OABBREV; static OABBREV const abbrev[] = { @@ -294,7 +294,7 @@ static OABBREV const abbrev[] = { * opts_init -- * Initialize some of the options. * - * PUBLIC: int opts_init __P((SCR *, int *)); + * PUBLIC: int opts_init(SCR *, int *); */ int opts_init( @@ -460,7 +460,7 @@ err: msgq_wstr(sp, M_ERR, optlist[optindx].name, * opts_set -- * Change the values of one or more options. * - * PUBLIC: int opts_set __P((SCR *, ARGS *[], char *)); + * PUBLIC: int opts_set(SCR *, ARGS *[], char *); */ int opts_set( @@ -754,7 +754,7 @@ badnum: INT2CHAR(sp, name, STRLEN(name) + 1, * o_set -- * Set an option's value. * - * PUBLIC: int o_set __P((SCR *, int, u_int, char *, u_long)); + * PUBLIC: int o_set(SCR *, int, u_int, char *, u_long); */ int o_set( @@ -798,7 +798,7 @@ o_set( * opts_empty -- * Return 1 if the string option is invalid, 0 if it's OK. * - * PUBLIC: int opts_empty __P((SCR *, int, int)); + * PUBLIC: int opts_empty(SCR *, int, int); */ int opts_empty( @@ -821,7 +821,7 @@ opts_empty( * opts_dump -- * List the current values of selected options. * - * PUBLIC: void opts_dump __P((SCR *, enum optdisp)); + * PUBLIC: void opts_dump(SCR *, enum optdisp); */ void opts_dump( @@ -987,7 +987,7 @@ opts_print( * opts_save -- * Write the current configuration to a file. * - * PUBLIC: int opts_save __P((SCR *, FILE *)); + * PUBLIC: int opts_save(SCR *, FILE *); */ int opts_save( @@ -1045,7 +1045,7 @@ opts_save( * opts_search -- * Search for an option. * - * PUBLIC: OPTLIST const *opts_search __P((CHAR_T *)); + * PUBLIC: OPTLIST const *opts_search(CHAR_T *); */ OPTLIST const * opts_search(CHAR_T *name) @@ -1090,7 +1090,7 @@ opts_search(CHAR_T *name) * opts_nomatch -- * Standard nomatch error message for options. * - * PUBLIC: void opts_nomatch __P((SCR *, CHAR_T *)); + * PUBLIC: void opts_nomatch(SCR *, CHAR_T *); */ void opts_nomatch( @@ -1103,25 +1103,25 @@ opts_nomatch( static int opts_abbcmp( - const void *a, - const void *b) + const void *a, + const void *b) { - return(STRCMP(((OABBREV *)a)->name, ((OABBREV *)b)->name)); + return(STRCMP(((OABBREV *)a)->name, ((OABBREV *)b)->name)); } static int opts_cmp( - const void *a, - const void *b) + const void *a, + const void *b) { - return(STRCMP(((OPTLIST *)a)->name, ((OPTLIST *)b)->name)); + return(STRCMP(((OPTLIST *)a)->name, ((OPTLIST *)b)->name)); } /* * opts_copy -- * Copy a screen's OPTION array. * - * PUBLIC: int opts_copy __P((SCR *, SCR *)); + * PUBLIC: int opts_copy(SCR *, SCR *); */ int opts_copy( @@ -1169,7 +1169,7 @@ nomem: msgq(orig, M_SYSERR, NULL); * opts_free -- * Free all option strings * - * PUBLIC: void opts_free __P((SCR *)); + * PUBLIC: void opts_free(SCR *); */ void opts_free(SCR *sp) diff --git a/common/options.h b/common/options.h index fe1f80f5f16d..aaeece144d89 100644 --- a/common/options.h +++ b/common/options.h @@ -78,7 +78,7 @@ struct _option { struct _optlist { CHAR_T *name; /* Name. */ /* Change function. */ - int (*func) __P((SCR *, OPTION *, char *, u_long *)); + int (*func)(SCR *, OPTION *, char *, u_long *); /* Type of object. */ enum { OPT_0BOOL, OPT_1BOOL, OPT_NUM, OPT_STR } type; diff --git a/common/options_f.c b/common/options_f.c index 482a37e39d39..850bfc2eca5c 100644 --- a/common/options_f.c +++ b/common/options_f.c @@ -29,7 +29,7 @@ static const char sccsid[] = "$Id: options_f.c,v 10.34 04/07/11 16:06:29 zy Exp #include "common.h" /* - * PUBLIC: int f_altwerase __P((SCR *, OPTION *, char *, u_long *)); + * PUBLIC: int f_altwerase(SCR *, OPTION *, char *, u_long *); */ int f_altwerase( @@ -44,7 +44,7 @@ f_altwerase( } /* - * PUBLIC: int f_columns __P((SCR *, OPTION *, char *, u_long *)); + * PUBLIC: int f_columns(SCR *, OPTION *, char *, u_long *); */ int f_columns( @@ -78,7 +78,7 @@ f_columns( } /* - * PUBLIC: int f_lines __P((SCR *, OPTION *, char *, u_long *)); + * PUBLIC: int f_lines(SCR *, OPTION *, char *, u_long *); */ int f_lines( @@ -135,7 +135,7 @@ f_lines( } /* - * PUBLIC: int f_lisp __P((SCR *, OPTION *, char *, u_long *)); + * PUBLIC: int f_lisp(SCR *, OPTION *, char *, u_long *); */ int f_lisp( @@ -149,7 +149,7 @@ f_lisp( } /* - * PUBLIC: int f_msgcat __P((SCR *, OPTION *, char *, u_long *)); + * PUBLIC: int f_msgcat(SCR *, OPTION *, char *, u_long *); */ int f_msgcat( @@ -163,7 +163,7 @@ f_msgcat( } /* - * PUBLIC: int f_print __P((SCR *, OPTION *, char *, u_long *)); + * PUBLIC: int f_print(SCR *, OPTION *, char *, u_long *); */ int f_print( @@ -192,7 +192,7 @@ f_print( } /* - * PUBLIC: int f_readonly __P((SCR *, OPTION *, char *, u_long *)); + * PUBLIC: int f_readonly(SCR *, OPTION *, char *, u_long *); */ int f_readonly( @@ -213,7 +213,7 @@ f_readonly( } /* - * PUBLIC: int f_recompile __P((SCR *, OPTION *, char *, u_long *)); + * PUBLIC: int f_recompile(SCR *, OPTION *, char *, u_long *); */ int f_recompile( @@ -234,7 +234,7 @@ f_recompile( } /* - * PUBLIC: int f_reformat __P((SCR *, OPTION *, char *, u_long *)); + * PUBLIC: int f_reformat(SCR *, OPTION *, char *, u_long *); */ int f_reformat( @@ -248,7 +248,7 @@ f_reformat( } /* - * PUBLIC: int f_ttywerase __P((SCR *, OPTION *, char *, u_long *)); + * PUBLIC: int f_ttywerase(SCR *, OPTION *, char *, u_long *); */ int f_ttywerase( @@ -263,7 +263,7 @@ f_ttywerase( } /* - * PUBLIC: int f_w300 __P((SCR *, OPTION *, char *, u_long *)); + * PUBLIC: int f_w300(SCR *, OPTION *, char *, u_long *); */ int f_w300( @@ -284,7 +284,7 @@ f_w300( } /* - * PUBLIC: int f_w1200 __P((SCR *, OPTION *, char *, u_long *)); + * PUBLIC: int f_w1200(SCR *, OPTION *, char *, u_long *); */ int f_w1200( @@ -305,7 +305,7 @@ f_w1200( } /* - * PUBLIC: int f_w9600 __P((SCR *, OPTION *, char *, u_long *)); + * PUBLIC: int f_w9600(SCR *, OPTION *, char *, u_long *); */ int f_w9600( @@ -326,7 +326,7 @@ f_w9600( } /* - * PUBLIC: int f_window __P((SCR *, OPTION *, char *, u_long *)); + * PUBLIC: int f_window(SCR *, OPTION *, char *, u_long *); */ int f_window( @@ -342,7 +342,7 @@ f_window( } /* - * PUBLIC: int f_encoding __P((SCR *, OPTION *, char *, u_long *)); + * PUBLIC: int f_encoding(SCR *, OPTION *, char *, u_long *); */ int f_encoding( diff --git a/common/put.c b/common/put.c index 6e9dc09902de..d3adf5c08607 100644 --- a/common/put.c +++ b/common/put.c @@ -30,7 +30,7 @@ static const char sccsid[] = "$Id: put.c,v 10.19 04/07/11 17:00:24 zy Exp $"; * put -- * Put text buffer contents into the file. * - * PUBLIC: int put __P((SCR *, CB *, CHAR_T *, MARK *, MARK *, int)); + * PUBLIC: int put(SCR *, CB *, CHAR_T *, MARK *, MARK *, int); */ int put( diff --git a/common/recover.c b/common/recover.c index b20471f111b2..d0a927bd4301 100644 --- a/common/recover.c +++ b/common/recover.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "$Id: recover.c,v 11.2 2012/10/09 08:06:58 zy Exp $"; +static const char sccsid[] = "$Id: recover.c,v 11.3 2015/04/04 03:50:42 zy Exp $"; #endif /* not lint */ #include @@ -102,18 +102,18 @@ static const char sccsid[] = "$Id: recover.c,v 11.2 2012/10/09 08:06:58 zy Exp $ #define VI_DHEADER "X-vi-data:" -static int rcv_copy __P((SCR *, int, char *)); -static void rcv_email __P((SCR *, char *)); -static int rcv_mailfile __P((SCR *, int, char *)); -static int rcv_mktemp __P((SCR *, char *, char *)); -static int rcv_dlnwrite __P((SCR *, const char *, const char *, FILE *)); -static int rcv_dlnread __P((SCR *, char **, char **, FILE *)); +static int rcv_copy(SCR *, int, char *); +static void rcv_email(SCR *, char *); +static int rcv_mailfile(SCR *, int, char *); +static int rcv_mktemp(SCR *, char *, char *); +static int rcv_dlnwrite(SCR *, const char *, const char *, FILE *); +static int rcv_dlnread(SCR *, char **, char **, FILE *); /* * rcv_tmp -- * Build a file name that will be used as the recovery file. * - * PUBLIC: int rcv_tmp __P((SCR *, EXF *, char *)); + * PUBLIC: int rcv_tmp(SCR *, EXF *, char *); */ int rcv_tmp( @@ -172,7 +172,7 @@ err: msgq(sp, M_ERR, * rcv_init -- * Force the file to be snapshotted for recovery. * - * PUBLIC: int rcv_init __P((SCR *)); + * PUBLIC: int rcv_init(SCR *); */ int rcv_init(SCR *sp) @@ -234,7 +234,7 @@ err: msgq(sp, M_ERR, * sending email to the user if the file was modified * ending the file session * - * PUBLIC: int rcv_sync __P((SCR *, u_int)); + * PUBLIC: int rcv_sync(SCR *, u_int); */ int rcv_sync( @@ -252,15 +252,12 @@ rcv_sync( /* Sync the file if it's been modified. */ if (F_ISSET(ep, F_MODIFIED)) { - SIGBLOCK; if (ep->db->sync(ep->db, R_RECNOSYNC)) { F_CLR(ep, F_RCV_ON | F_RCV_NORM); msgq_str(sp, M_SYSERR, ep->rcv_path, "060|File backup failed: %s"); - SIGUNBLOCK; return (1); } - SIGUNBLOCK; /* REQUEST: don't remove backing file on exit. */ if (LF_ISSET(RCV_PRESERVE)) @@ -505,7 +502,7 @@ err: if (!issync) * rcv_list -- * List the files that can be recovered by this user. * - * PUBLIC: int rcv_list __P((SCR *)); + * PUBLIC: int rcv_list(SCR *); */ int rcv_list(SCR *sp) @@ -612,7 +609,7 @@ next: (void)fclose(fp); * rcv_read -- * Start a recovered file as the file to edit. * - * PUBLIC: int rcv_read __P((SCR *, FREF *)); + * PUBLIC: int rcv_read(SCR *, FREF *); */ int rcv_read( @@ -635,7 +632,7 @@ rcv_read( return (1); rp = O_STR(sp, O_RECDIR); if ((dirp = opendir(rp)) == NULL) { - msgq_str(sp, M_ERR, rp, "%s"); + msgq_str(sp, M_SYSERR, rp, "%s"); return (1); } diff --git a/common/screen.c b/common/screen.c index 9ff684509d94..ae6fb207567f 100644 --- a/common/screen.c +++ b/common/screen.c @@ -32,7 +32,7 @@ static const char sccsid[] = "$Id: screen.c,v 10.25 2011/12/04 04:06:45 zy Exp $ * screen_init -- * Do the default initialization of an SCR structure. * - * PUBLIC: int screen_init __P((GS *, SCR *, SCR **)); + * PUBLIC: int screen_init(GS *, SCR *, SCR **); */ int screen_init( @@ -129,7 +129,7 @@ err: screen_end(sp); * Release a screen, no matter what had (and had not) been * initialized. * - * PUBLIC: int screen_end __P((SCR *)); + * PUBLIC: int screen_end(SCR *); */ int screen_end(SCR *sp) @@ -205,7 +205,7 @@ screen_end(SCR *sp) * screen_next -- * Return the next screen in the queue. * - * PUBLIC: SCR *screen_next __P((SCR *)); + * PUBLIC: SCR *screen_next(SCR *); */ SCR * screen_next(SCR *sp) diff --git a/common/search.c b/common/search.c index 22f020315070..4831a0874aae 100644 --- a/common/search.c +++ b/common/search.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "$Id: search.c,v 10.26 2011/07/04 20:16:26 zy Exp $"; +static const char sccsid[] = "$Id: search.c,v 10.27 2015/03/13 18:41:35 zy Exp $"; #endif /* not lint */ #include @@ -30,8 +30,8 @@ static const char sccsid[] = "$Id: search.c,v 10.26 2011/07/04 20:16:26 zy Exp $ typedef enum { S_EMPTY, S_EOF, S_NOPREV, S_NOTFOUND, S_SOF, S_WRAP } smsg_t; -static void search_msg __P((SCR *, smsg_t)); -static int search_init __P((SCR *, dir_t, CHAR_T *, size_t, CHAR_T **, u_int)); +static void search_msg(SCR *, smsg_t); +static int search_init(SCR *, dir_t, CHAR_T *, size_t, CHAR_T **, u_int); /* * search_init -- @@ -142,8 +142,8 @@ prev: if (sp->re == NULL) { * f_search -- * Do a forward search. * - * PUBLIC: int f_search __P((SCR *, - * PUBLIC: MARK *, MARK *, CHAR_T *, size_t, CHAR_T **, u_int)); + * PUBLIC: int f_search(SCR *, + * PUBLIC: MARK *, MARK *, CHAR_T *, size_t, CHAR_T **, u_int); */ int f_search( @@ -159,7 +159,7 @@ f_search( recno_t lno; regmatch_t match[1]; size_t coff, len; - int cnt, eval, rval, wrapped; + int cnt, eval, rval, wrapped = 0; CHAR_T *l; if (search_init(sp, FORWARD, ptrn, plen, eptrn, flags)) @@ -198,13 +198,14 @@ f_search( return (1); } lno = 1; + wrapped = 1; } } else coff = fm->cno + 1; } btype = BUSY_ON; - for (cnt = INTERRUPT_CHECK, rval = 1, wrapped = 0;; ++lno, coff = 0) { + for (cnt = INTERRUPT_CHECK, rval = 1;; ++lno, coff = 0) { if (cnt-- == 0) { if (INTERRUPTED(sp)) break; @@ -288,8 +289,8 @@ f_search( * b_search -- * Do a backward search. * - * PUBLIC: int b_search __P((SCR *, - * PUBLIC: MARK *, MARK *, CHAR_T *, size_t, CHAR_T **, u_int)); + * PUBLIC: int b_search(SCR *, + * PUBLIC: MARK *, MARK *, CHAR_T *, size_t, CHAR_T **, u_int); */ int b_search( @@ -487,7 +488,7 @@ search_msg( * search_busy -- * Put up the busy searching message. * - * PUBLIC: void search_busy __P((SCR *, busy_t)); + * PUBLIC: void search_busy(SCR *, busy_t); */ void search_busy( diff --git a/common/seq.c b/common/seq.c index 45c6c1111083..61c7fcd0b285 100644 --- a/common/seq.c +++ b/common/seq.c @@ -31,8 +31,8 @@ static const char sccsid[] = "$Id: seq.c,v 10.18 2011/12/11 23:13:00 zy Exp $"; * seq_set -- * Internal version to enter a sequence. * - * PUBLIC: int seq_set __P((SCR *, CHAR_T *, - * PUBLIC: size_t, CHAR_T *, size_t, CHAR_T *, size_t, seq_t, int)); + * PUBLIC: int seq_set(SCR *, CHAR_T *, + * PUBLIC: size_t, CHAR_T *, size_t, CHAR_T *, size_t, seq_t, int); */ int seq_set( @@ -136,7 +136,7 @@ mem1: errno = sv_errno; * seq_delete -- * Delete a sequence. * - * PUBLIC: int seq_delete __P((SCR *, CHAR_T *, size_t, seq_t)); + * PUBLIC: int seq_delete(SCR *, CHAR_T *, size_t, seq_t); */ int seq_delete( @@ -172,7 +172,7 @@ seq_delete( * seq_free -- * Free a map entry. * - * PUBLIC: int seq_free __P((SEQ *)); + * PUBLIC: int seq_free(SEQ *); */ int seq_free(SEQ *qp) @@ -193,7 +193,7 @@ seq_free(SEQ *qp) * isn't NULL, partial matches count. * * PUBLIC: SEQ *seq_find - * PUBLIC: __P((SCR *, SEQ **, EVENT *, CHAR_T *, size_t, seq_t, int *)); + * PUBLIC: (SCR *, SEQ **, EVENT *, CHAR_T *, size_t, seq_t, int *); */ SEQ * seq_find( @@ -278,7 +278,7 @@ seq_find( * seq_close -- * Discard all sequences. * - * PUBLIC: void seq_close __P((GS *)); + * PUBLIC: void seq_close(GS *); */ void seq_close(GS *gp) @@ -295,7 +295,7 @@ seq_close(GS *gp) * seq_dump -- * Display the sequence entries of a specified type. * - * PUBLIC: int seq_dump __P((SCR *, seq_t, int)); + * PUBLIC: int seq_dump(SCR *, seq_t, int); */ int seq_dump( @@ -343,7 +343,7 @@ seq_dump( * seq_save -- * Save the sequence entries to a file. * - * PUBLIC: int seq_save __P((SCR *, FILE *, char *, seq_t)); + * PUBLIC: int seq_save(SCR *, FILE *, char *, seq_t); */ int seq_save( @@ -389,7 +389,7 @@ seq_save( * e_memcmp -- * Compare a string of EVENT's to a string of CHAR_T's. * - * PUBLIC: int e_memcmp __P((CHAR_T *, EVENT *, size_t)); + * PUBLIC: int e_memcmp(CHAR_T *, EVENT *, size_t); */ int e_memcmp( @@ -398,11 +398,11 @@ e_memcmp( size_t n) { if (n != 0) { - do { - if (*p1++ != ep->e_c) - return (*--p1 - ep->e_c); + do { + if (*p1++ != ep->e_c) + return (*--p1 - ep->e_c); ++ep; - } while (--n != 0); - } - return (0); + } while (--n != 0); + } + return (0); } diff --git a/common/util.c b/common/util.c index 43fa9d1e9f20..44c8e29482e6 100644 --- a/common/util.c +++ b/common/util.c @@ -39,7 +39,7 @@ static const char sccsid[] = "$Id: util.c,v 10.30 2013/03/19 10:00:27 yamt Exp $ * binc -- * Increase the size of a buffer. * - * PUBLIC: void *binc __P((SCR *, void *, size_t *, size_t)); + * PUBLIC: void *binc(SCR *, void *, size_t *, size_t); */ void * binc( @@ -76,7 +76,7 @@ binc( * including or after the starting column. On error, set * the column to 0, it's safest. * - * PUBLIC: int nonblank __P((SCR *, recno_t, size_t *)); + * PUBLIC: int nonblank(SCR *, recno_t, size_t *); */ int nonblank( @@ -112,7 +112,7 @@ nonblank( * tail -- * Return tail of a path. * - * PUBLIC: char *tail __P((char *)); + * PUBLIC: char *tail(char *); */ char * tail(char *path) @@ -128,12 +128,12 @@ tail(char *path) * join -- * Join two paths; need free. * - * PUBLIC: char *join __P((char *, char *)); + * PUBLIC: char *join(char *, char *); */ char * join( - char *path1, - char *path2) + char *path1, + char *path2) { char *p; @@ -148,7 +148,7 @@ join( * expanduser -- * Return a "~" or "~user" expanded path; need free. * - * PUBLIC: char *expanduser __P((char *)); + * PUBLIC: char *expanduser(char *); */ char * expanduser(char *str) @@ -198,7 +198,7 @@ expanduser(char *str) * quote -- * Return a escaped string for /bin/sh; need free. * - * PUBLIC: char *quote __P((char *)); + * PUBLIC: char *quote(char *); */ char * quote(char *str) @@ -245,7 +245,7 @@ quote(char *str) * v_strdup -- * Strdup for 8-bit character strings with an associated length. * - * PUBLIC: char *v_strdup __P((SCR *, const char *, size_t)); + * PUBLIC: char *v_strdup(SCR *, const char *, size_t); */ char * v_strdup( @@ -267,7 +267,7 @@ v_strdup( * v_wstrdup -- * Strdup for wide character strings with an associated length. * - * PUBLIC: CHAR_T *v_wstrdup __P((SCR *, const CHAR_T *, size_t)); + * PUBLIC: CHAR_T *v_wstrdup(SCR *, const CHAR_T *, size_t); */ CHAR_T * v_wstrdup(SCR *sp, @@ -288,7 +288,7 @@ v_wstrdup(SCR *sp, * nget_uslong -- * Get an unsigned long, checking for overflow. * - * PUBLIC: enum nresult nget_uslong __P((u_long *, const CHAR_T *, CHAR_T **, int)); + * PUBLIC: enum nresult nget_uslong(u_long *, const CHAR_T *, CHAR_T **, int); */ enum nresult nget_uslong( @@ -310,7 +310,7 @@ nget_uslong( * nget_slong -- * Convert a signed long, checking for overflow and underflow. * - * PUBLIC: enum nresult nget_slong __P((long *, const CHAR_T *, CHAR_T **, int)); + * PUBLIC: enum nresult nget_slong(long *, const CHAR_T *, CHAR_T **, int); */ enum nresult nget_slong( @@ -336,7 +336,7 @@ nget_slong( * timepoint_steady -- * Get a timestamp from a monotonic clock. * - * PUBLIC: void timepoint_steady __P((struct timespec *)); + * PUBLIC: void timepoint_steady(struct timespec *); */ void timepoint_steady( @@ -367,7 +367,7 @@ timepoint_steady( * timepoint_system -- * Get the current calendar time. * - * PUBLIC: void timepoint_system __P((struct timespec *)); + * PUBLIC: void timepoint_system(struct timespec *); */ void timepoint_system( @@ -401,7 +401,7 @@ timepoint_system( * TRACE -- * debugging trace routine. * - * PUBLIC: void TRACE __P((SCR *, const char *, ...)); + * PUBLIC: void TRACE(SCR *, const char *, ...); */ void TRACE( diff --git a/docs/TODO b/docs/TODO deleted file mode 100644 index 6fe88295d5ff..000000000000 --- a/docs/TODO +++ /dev/null @@ -1,147 +0,0 @@ -CL: In single-line screens, have to press 'q' twice when quitting out - of a ":set all" display. - -COMMON: There's a serious problem with error returns -- we need to separate - command failure from fatal error, consistently, over the entire source - tree. - - We need to rework all of vi to have three return values: - - 0: success - 1: vi error, continue - 2: fatal error, die - - Right now we don't recognize fatal errors for what they are. - -VI: Change the screen scrolling to not eat user characters... i.e. - g/pattern/foo should not eat already entered chars. - -COMMON: It's known that it's possible to sync the backing files in the - wrong manner, leaving backup files that aren't recoverable. This - is going to be left alone until we have a logging version of DB, - which will hopefully fix this (or at least make it possible to - easily do so). - -COMMON: The complete list of POSIX.1 calls that can return EINTR are: - - wait, waitpid, sleep, dup2, close, read, write, - fcntl(SETLCKW) tcsetattr, tcdrain - - The problem is that technically, any system/library call can - return EINTR, so, while nvi blocks (most of?) the obvious ones, - someone may have to do a complete pass and block signals - everywhere. - -COMMON: The vi main command loop should use the general-purpose overflow - and underflow routines. In addition, the vi command loop uses - unsigned longs -- should probably be fixed as a 32-bit unsigned - type, and then check to make sure it's never used as as variable - type again. - -DB: When nvi edits files that don't have trailing newlines, it appends - one, regardless. This is required, by default, from POSIX.2. - -COMMON: Open mode is not yet implemented. - -COMMON: ^C isn't passed to the shell in the script windows as an interrupt - character. - -COMMON: The options: - - hardtabs, lisp, optimize, redraw, slowopen - - are recognized, but not implemented. These options are unlikely - to be implemented, so if you want them you might want to say - something! I will implement lisp if anyone ever documents how it - worked. - -COMMON: If you run out of space in the recovery directory, the recovery - file is left in place. - -COMMON: Should "view" set a lock on the file? - -COMMON: Field editing shouldn't be hard to add to nvi: - - Field editing file template: - - version # - field # row/column start row/column stop - label field # Label string - re field # Matching re string. - field # row/column start row/column stop - label field # Label string - re field # Matching re string. - - moves to the next field - in column 0 moves to the previous field - -COMMON: Let's rethink using an IPC mechanism: - - Two way channel, with events passing in both directions. - - Load into the same address space (else, how do file permissions) forks - in v_init -- screens get events from vi, vi gets events queued up from - screens. - - Vi: - E_CHARACTER, /* Input character: e_c set. */ - E_EOF, /* End of input (NOT ^D). */ - E_ERR, /* Input error. */ - E_INTERRUPT, /* Interrupt. */ - E_REPAINT, /* Repaint: e_flno, e_tlno set. */ - E_RESIZE, /* SIGWINCH: e_lno, e_cno set. */ - E_SIGCONT, /* SIGCONT arrived. */ - E_SIGFATAL, /* fatal signal arrived. - E_START, /* Start ex/vi. */ - E_STOP, /* Stop ex/vi. */ - E_STRING, /* Input string: e_csp, e_len set. */ - - Screen: - E_ADDSTR /* Add a string to the screen. */ - E_ATTRIBUTE /* Screen attribute. */ - E_BELL /* Beep/bell/flash the terminal. */ - E_BUSY /* Display a busy message. */ - E_CANONICAL /* Enter tty canonical mode. */ - E_CLRTOEOL /* Clear to the end of the line. */ - E_CURSOR /* Return the cursor location. */ - E_DELETELN /* Delete a line. */ - E_DISCARD /* Discard a screen. */ - E_EXADJUST /* Ex: screen adjustment routine. */ - E_FMAP /* Set a function key. */ - E_GETKEY /* Get a key event. */ - E_INSERTLN /* Insert a line. */ - E_MOVE /* Move the cursor. */ - E_MESSAGE /* Message or ex output. */ - E_REFRESH /* Refresh the screen. */ - E_RESIZE /* Resize two screens. */ - E_SPLIT /* Split the screen. */ - E_SUSPEND /* Suspend the editor. */ - -EX: It would be nice to inverse video the replaced text during - interactive substitute. - -EX: The :args command should put the current file name out in reverse - video. This isn't going to be easy, currently only full lines can - be in reverse video, not just parts. - -TK: We currently permit the user to change the lines, columns and term - edit options. Shouldn't that be illegal in tknvi? - -VI: The strings found by searches should be highlighted until the next - character is entered. - -VI: Display a split vi screen for the :help command. - -VI: When getting a key for a continue screen, we should always read from - the terminal, not from a mapped key. - -VI: The sentence, paragraph and section movement commands don't match - historic practice in some boundary cases. This should be left - alone until POSIX 1003.2 makes up its mind. - -VI: The vs_sm_fill routine should scroll if possible, not always redraw. - -VI: Think about setting a dirty/inuse bits on the lines of the SMAP - structure. That way the message routines could steal lines and - refresh would continue to work, because it would know not to touch - the lines that were in use. diff --git a/docs/USD.doc/edit/Makefile b/docs/USD.doc/edit/Makefile deleted file mode 100644 index 0c59f6d0816e..000000000000 --- a/docs/USD.doc/edit/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -# @(#)Makefile 8.4 (Berkeley) 8/18/96 - -ROFF= groff -TBL= tbl - -edittut.ps: edittut.ms - ${TBL} edittut.ms | ${ROFF} -ms > $@ - chmod 444 $@ - -clean: - rm -f edittut.ps diff --git a/docs/USD.doc/edit/edit.vindex b/docs/USD.doc/edit/edit.vindex deleted file mode 100644 index 2098f14ea190..000000000000 --- a/docs/USD.doc/edit/edit.vindex +++ /dev/null @@ -1,115 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)edit.vindex 8.1 (Berkeley) 6/8/93 -.\" -.bd I -.ND -.TL -Index -.sp 3 -.2C -.nf -addressing, \fIsee\fR line numbers -append mode, 4 -backslash (\\), 18 -buffer, 2 -command mode, 4 -context search, 8, 10, 13, 18 -control characters (``^'' notation), 8 -control-d, 6 -current filename, 19, 20 -current line (.), 9, 15 -diagnostic messages, 4 -disk, 2 -documentation, 21 -edit (to begin editing session), 3, 7 -editing commands: -.in +2 -append (a), 4, 7 -change (c), 16 -copy (co), 13 -delete (d), 13-14 -edit (e), 12 -file (f), 19 -global (g), 18-19 -move (m), 12-13 -number (nu), 9 -preserve (pre), 20-21 -print (p), 8 -quit (q), 5, 11 -quit! (q!), 11 -read (r), 20 -recover (rec), 20 -substitute (s), 9-10, 17, 18 -undo (u), 14, 17 -write (w), 5-6, 11, 19-20 -z, 11 -.sp 10i -! (shell escape), 19 -$= , 15 -+, 15 -\-, 15 -//, 8, 18 -??, 18 -\&\fB.\fR, 9, 15 -\&\fB.\fR=, 9, 15 -.in -2 -erasing -.ti +2 -characters (#), 8 -.ti +2 -lines (@), 8 -ex (text editor), 21 -\fIEx Reference Manual\fR, 21 -file, 1 -file recovery, 20 -filename, 2 -Interrupt (message), 7 -line numbers, \fIsee also\fR current line -.ti +2 -dollar sign ($), 8, 12-13, 15 -.ti +2 -dot (.), 9, 15 -.ti +2 -relative (+ and \-), 15, 16 -logging out, 6 -login procedure, 2 -``magic'' characters, 21 -non-printing characters, 8 -``not found'' (message), 3 -program, 1 -recovery \fIsee\fR file recovery -shell, 18 -shell escape (!), 19 -special characters (^, $, \e), 18 -text input mode, 4 -UNIX, 1 diff --git a/docs/USD.doc/edit/edittut.ms b/docs/USD.doc/edit/edittut.ms deleted file mode 100644 index 8a9d66ede2e6..000000000000 --- a/docs/USD.doc/edit/edittut.ms +++ /dev/null @@ -1,2280 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)edittut.ms 8.3 (Berkeley) 8/18/96 -.\" -.ll 6.5i -.nr LL 6.5i -.EH 'USD:11-%''Edit: A Tutorial' -.OH 'Edit: A Tutorial''USD:11-%' -.LP -.ds u \s-2UNIX\s0 -.ND -.sp 4 -.ce -\f3\s+2Edit: A Tutorial\s0\f1 -.sp -.ce 3 -.I -Ricki Blau -.sp -James Joyce -.R -.sp -.ce 3 -Computing Services -University of California -Berkeley, California 94720 -.sp 3 -.ce -.I -ABSTRACT -.R -.sp -.LP -This narrative introduction to the use of the text editor -.I edit -assumes no prior familiarity with computers or with text editing. -Its aim is to lead the beginning \s-2UNIX\(dg\s+2 user through the -.FS -\(dgUNIX is a trademark of Bell Laboratories. -.FE -fundamental steps of writing and revising a file of text. -Edit, -a version of the text editor -.I ex, -was designed to provide an informative environment -for new and casual users. -.PP -We welcome comments and suggestions about this tutorial -and the \s-2UNIX\s+2 documentation in general. -.sp .5v -September 1981 -.bp -.ll 6.5i -.nr LL 6.5i -.nr LT 6.5i -.ds u \s-2UNIX\s0 -.ce -\s+2\f3Contents\f1\s0 -.LP -.nf -Introduction\ \ \ 3 -.sp -Session 1\ \ 4 -.in +.5i -Making contact with \s-2UNIX\s+2\ \ \ 4 -Logging in\ \ 4 -Asking for \fIedit\fR\ \ \ 4 -The ``Command not found'' message\ \ \ 5 -A summary\ \ 5 -Entering text\ \ \ 5 -Messages from \fIedit\fR\ \ \ 5 -Text input mode\ \ \ 6 -Making corrections\ \ \ 6 -Writing text to disk\ \ \ 7 -Signing off\ \ 7 -.in -.5i -.sp -Session 2\ \ \ 8 -.in +.5i -Adding more text to the file\ \ \ 8 -Interrupt\ \ \ 8 -Making corrections\ \ \ 8 -Listing what's in the buffer (p)\ \ \ 9 -Finding things in the buffer\ \ \ 9 -The current line\ \ \ 10 -Numbering lines (nu)\ \ \ 10 -Substitute command (s)\ \ \ 10 -Another way to list what's in the buffer (z)\ \ \ 11 -Saving the modified text\ \ \ 12 -.in -.5i -.sp -Session 3\ \ \ 13 -.in +.5i -Bringing text into the buffer (e)\ \ \ 13 -Moving text in the buffer (m)\ \ \ 13 -Copying lines (copy)\ \ \ 14 -Deleting lines (d)\ \ \ 14 -A word or two of caution\ \ \ 15 -Undo (u) to the rescue\ \ \ 15 -More about the dot (.) and buffer end ($)\ \ \ 16 -Moving around in the buffer (+ and \-)\ \ \ 16 -Changing lines (c)\ \ \ 17 -.in -.5i -.sp -Session 4\ \ \ 18 -.in +.5i -Making commands global (g)\ \ \ 18 -More about searching and substituting\ \ \ 19 -Special characters\ \ \ 19 -Issuing \s-2UNIX\s+2 commands from the editor\ \ \ 20 -Filenames and file manipulation\ \ \ 20 -The file (f) command\ \ \ 20 -Reading additional files (r)\ \ \ 21 -Writing parts of the buffer\ \ \ 21 -Recovering files\ \ \ 21 -Other recovery techniques\ \ \ 21 -Further reading and other information\ \ \ 22 -Using \fIex\fR\ \ \ 22 -.in -.5i -.sp -Index\ \ \ 23 -.bp -.SH -.ce -\s+2Introduction\s0 -.PP -Text editing using a terminal connected to a computer -allows you to create, modify, and print text -easily. -A -.I -text editor -.R -is a program -that assists you -as you create and modify text. -The text editor you will learn here is named -.I edit. -Creating text using edit is as easy as typing it -on an electric typewriter. -Modifying text involves telling the text editor -what you want to add, change, or delete. -You can review your text -by typing a command -to print the file contents -as they are currently. -Another program (which we do not discuss in this -document), a text formatter, -rearranges your text -for you into ``finished form.'' -.PP -These lessons assume no prior familiarity with computers -or with text editing. -They consist of a series of text editing sessions -which lead you through the fundamental steps -of creating and revising text. -After scanning each lesson and before beginning the next, -you should try the examples at a terminal to get a feeling -for the actual process of text editing. -If you set aside some time for experimentation, -you will soon become familiar with using the -computer to write and modify text. -In addition to the actual use of the text editor, -other features of \s-2UNIX\s0 will be very important to your work. -You can begin to -learn about these other features by -reading one of the other tutorials -that provide a general introduction to the system. -You will be ready to proceed with this lesson as soon as -you are familiar with (1) your terminal and its special keys, -(2) how to login, -(3) and the ways of correcting typing errors. -Let's first define some terms: -.sp .5 -.IP program 12 -A set of instructions, given to the computer, -describing the sequence of steps the computer performs -in order to accomplish a specific task. -The task must be specific, -such as balancing your checkbook -or editing your text. -A general task, -such as working for world peace, -is something we can all do, -but not something we can currently write programs to do. -.IP UNIX -\s-2UNIX\s0 is a special type of program, -called an operating system, that supervises the machinery -and all other programs comprising the total -computer system. -.IP edit -.I edit -is the name of the \s-2UNIX\s0 text editor you will be learning to use, -and is a program that aids you in writing or revising text. -Edit was designed for beginning users, -and is a simplified version of an editor named -.I ex. -.IP file -Each \s-2UNIX\s0 account is allotted -space for the permanent storage of information, -such as programs, data or text. -A file is a logical unit of data, -for example, an essay, a program, -or a chapter from a book, -which is stored on a computer system. -Once you create a file, -it is kept until you instruct the system to remove it. -You may create a file during one \s-2UNIX\s0 session, -end the session, -and return to use it at a later time. -Files contain anything you choose to write and store in them. -The sizes of files vary to suit your needs; -one file might hold only a single number, -yet another might contain -a very long document or program. -The only way to save -information from one session to the next is to store it in a file, -which you will learn in Session 1. -.IP filename -Filenames are used to distinguish one file from another, -serving the same purpose as the labels of manila -folders in a file cabinet. -In order to write or access information in a file, -you use the name of that file in a \s-2UNIX\s0 command, -and the system will automatically locate the file. -.IP disk -Files are stored on an input/output device called a disk, -which looks something like a stack of phonograph records. -Each surface is coated with a material similar to that -on magnetic recording tape, -and information is recorded on it. -.IP buffer -A temporary work space, made available to the user -for the duration of a session of text editing -and used for creating and modifying -the text file. -We can think of the buffer as a blackboard that is -erased after each class, where each session with the editor -is a class. -.bp -.SH -.ce 1 -\s+2Session 1\s0 -.sp 1 -.SH -Making contact with \s-1UNIX\s0 -.PP -To use the editor you must first make contact with the computer -by logging in to \s-2UNIX\s0. -We'll quickly review the standard \s-2UNIX\s0 login procedure -for the two ways you can make contact: -on a terminal that is directly linked to the computer, -or over a telephone line where the computer answers your call. -.SH -Directly-linked terminals -.PP -Turn on your terminal and press the \s-1RETURN\s0 key. -You are now ready to login. -.SH -Dial-up terminals -.PP -If your terminal connects with the computer over a telephone line, -turn on the terminal, dial the system access number, -and, when you hear a high-pitched tone, place the -telephone handset in the acoustic coupler, if you are using one. -You are now ready to login. -.SH -Logging in -.PP -The message inviting you to login is: -.DS I 1i -login: -.DE -.LP -Type your login name, which identifies you to \s-2UNIX\s0, -on the same line as the login message, -and press \s-2RETURN\s+2. -If the terminal you are using -has both upper and lower case, -.B -be sure you enter your login name in lower case; -.R -otherwise \s-2UNIX\s0 assumes your terminal -has only upper case and will not recognize lower case -letters you may type. -\s-2UNIX\s0 types ``login:'' and you reply -with your login name, for example ``susan'': -.DS I 1i -login: \fBsusan\fR \fI(and press the \s-2RETURN\s0 key)\fR -.DE -(In the examples, input you would type appears in -.B "bold face" -to distinguish it from the responses from \s-2UNIX\s0.) -.PP -\s-2UNIX\s0 will next respond with a request for a password -as an additional precaution to prevent -unauthorized people from using your account. -The password will not appear when you type it, -to prevent others from seeing it. -The message is: -.DS I 1i -Password: \fI(type your password and press \s-2RETURN\s+2)\fR -.DE -If any of the information you gave during the login -sequence was mistyped or incorrect, -\s-2UNIX\s0 will respond with -.DS I 1i -Login incorrect. -.if t .sp .2v -.if n .sp 1 -login: -.DE -in which case you should start the login process anew. -Assuming that you have successfully -logged in, \s-2UNIX\s0 -will print the message of the day and eventually will present -you with a % at the beginning of a fresh line. -The % is the \s-2UNIX\s0 prompt symbol -which tells you that \s-2UNIX\s0 is ready to accept a command. -.bd I 3 -.SH -Asking for \fIedit\fP -.fl -.bd I -.PP -You are ready to tell \s-2UNIX\s0 that you -want to work with edit, the text editor. -Now is a convenient time to choose -a name for the file of text you are about to create. -To begin your editing session, -type -.B edit -followed by a space and then the filename -you have selected; for example, ``text''. -After that, -press the \s-2RETURN\s0 key and wait for edit's response: -.DS I 1i -% \fBedit text\fP \fI(followed by a \s-2RETURN\s+2)\fR -"text" No such file or directory -: -.DE -If you typed the command correctly, -you will now be in communication with edit. -Edit has set aside a buffer for use as -a temporary working space during your current editing session. -Since ``text'' is a new file we are about to create -the editor was unable to find that file, which it -confirms by saying: -.DS I 1i -"text" No such file or directory -.DE -On the next line appears edit's prompt ``:'', -announcing that you are in \f2command mode\f1 and -edit expects a command from you. -You may now begin to create the new file. -.SH -The ``Command not found'' message -.PP -If you misspelled edit by typing, say, ``editor'', -this might appear: -.DS I 1i -% \fBeditor\fP -editor: Command not found -% -.DE -Your mistake in calling edit ``editor'' was -treated by \s-2UNIX\s0 as a request -for a program named ``editor''. -Since there is no program -named ``editor'', -\s-2UNIX\s0 reported that the program was ``not found''. -A new % indicates that \s-2UNIX\s0 is ready for another command, -and you may then enter the correct command. -.SH -A summary -.PP -Your exchange with \s-2UNIX\s0 as you logged in and made contact with edit -should look something like this: -.DS I 1i -login: \fBsusan\fP -Password: -\&... A Message of General Interest ... -% \fBedit text\fP -"text" No such file or directory -: -.DE -.SH -Entering text -.PP -You may now begin entering text into the buffer. -This is done by \fIappending\fP (or adding) text to whatever -is currently in the buffer. -Since there is nothing in the buffer at the moment, -you are appending text to nothing; -in effect, -since you are adding text to nothing -you are creating text. -Most edit commands have two equivalent forms: -a word that suggests what the command does, -and a shorter abbreviation of that word. -Many beginners find the full command names -easier to remember at first, -but once you are familiar with editing you may -prefer to type the shorter abbreviations. -The command to input text is ``append''. -(It may be abbreviated ``a''.) -Type -.B append -and press the \s-2RETURN\s0 key. -.DS I 1i -% \fBedit text -\fR:\|\fBappend -.R -.DE -.SH -.bd I 3 -Messages from -.I edit -.fl -.bd I -.PP -If you make a mistake in entering a command and -type something that edit does not recognize, -edit will respond with a message -intended to help you diagnose your error. -For example, if you misspell the command to input text by typing, -perhaps, ``add'' instead of ``append'' or ``a'', -you will receive this message: -.DS I 1i -:\|\fBadd\fR -add: Not an editor command -: -.DE -When you receive a diagnostic message, -check what you typed in order to determine what -part of your command confused edit. -The message above means that edit -was unable to recognize your mistyped command -and, therefore, did not execute it. -Instead, a new ``:'' -appeared to let you know that -edit is again ready to execute a command. -.SH -Text input mode -.PP -By giving the command ``append'' (or using the abbreviation ``a''), -you entered -.I -text input mode, -.R -also known as -.I -append mode. -.R -When you enter text input mode, -edit stops sending you a prompt. -You will not receive any prompts -or error messages -while in text input mode. -You can enter -pretty much anything you want on the lines. -The lines are transmitted one by one to the buffer -and held there during the editing session. -You may append as much text as you want, and -.I -when you wish to stop entering text lines you should -type a period as the only character on the line -and press the \s-2RETURN\s0 key. -.R -When you type the period and press \s-2RETURN\s0, -you signal that you want to stop appending text, -and edit responds by allowing -you to exit text input mode and reenter command mode. -Edit will again -prompt you for a command by printing ``:''. -.PP -Leaving append mode does not destroy the text in -the buffer. -You have to leave append -mode to do any of the other kinds of editing, -such as changing, adding, or printing text. -If you type a period as the first character and -type any other character on the same line, -edit will believe you want to remain in append mode -and will not let you out. -As this can be very frustrating, -be sure to type -.B only -the period and the \s-2RETURN\s0 key. -.PP -This is a good place to learn an important -lesson about computers and text: a blank space is -a character as far as a computer is concerned. -If you so much as type a period followed by a blank -(that is, type a period and then the space bar on the keyboard), -you will remain in append mode with the last line of text -being: -.DS I 1i -.B -.ps +2 -\&. -.ps -2 -.R -.DE -Let's say that you enter the lines -(try to type -.B exactly -what you see, including ``thiss''): -.DS I 1i -.B -This is some sample text. -And thiss is some more text. -Text editing is strange, but nice. -\&. -.R -.DE -The last line is the period followed by a \s-2RETURN\s0 -that gets you out of append mode. -.SH -Making corrections -.PP -If you have read a general introduction to \s-2UNIX\s0, -you will recall that it is possible to erase individual -letters that you have typed. -This is done by typing the designated erase character -as many times as there are characters -you want to erase. -.PP -The usual erase character varies from place to place and -user to user. Often it -is the backspace (control-H), -so you can correct typing errors -in the line you are typing -by holding down the \s-1CTRL\s+1 key -and typing the ``H'' key. (Sometimes it is the DEL key.) -If you type the erase character -you will notice -that the terminal backspaces in the line you are on. -You can backspace over your error, -and then type what you want to be the rest of the line. -.PP -If you make a bad start -in a line -and would like to begin again, -you can either backspace to the beginning of the line -or you can use the at-sign ``@'' to erase everything on the line: -.DS I 1i -.B -Text edtiing is strange, but@ -Text editing is strange, but nice. -.R -.fl -.bd S -.DE -When you type the at-sign (@), you erase -the entire line typed so far -and are given a fresh line to type on. -You may immediately begin to retype the line. -This, unfortunately, does not work after you type the -line and press \s-2RETURN\s+2. -To make corrections in lines that have been completed, -it is necessary to use the editing commands -covered in the next sessions. -.SH -Writing text to disk -.PP -You are now ready to edit the text. One common operation -is to write the text to disk as a file for safekeeping -after the session is over. -This is the only way to save information from one session to the next, -since the editor's buffer is temporary and will last only until the -end of the editing session. -Learning how to write a file to disk is second in -importance only to entering the text. -To write the contents of the buffer to a disk -file, use the command ``write'' -(or its abbreviation ``w''): -.DS I 1i -:\|\fBwrite -.R -.DE -Edit will copy the contents of the buffer to a disk file. -If the file does not yet exist, -a new file will be created automatically -and the presence of a ``[New file]'' will be noted. -The newly-created file will be given the name specified when -you entered the editor, in this case ``text''. -To confirm that the disk file has been successfully written, -edit will repeat the filename and give -the number of lines and the total -number of characters in the file. -The buffer remains unchanged by the ``write'' command. -All of the lines that were written to disk will still be -in the buffer, -should you want to modify or add to them. -.PP -Edit must have a name for the file to be written. -If you forgot to indicate the name of the file -when you began to edit, -edit will print in response to your write command: -.DS I 1i -No current filename -.DE -If this happens, you can specify the filename in a new write command: -.DS I 1i -:\|\fBwrite text -.R -.DE -After the ``write'' (or ``w''), type a space and then the name of the file. -.SH -Signing off -.PP -We have done enough for this first lesson on using the -\s-2UNIX\s0 text editor, and are ready to quit the session with edit. -To do this we type ``quit'' (or ``q'') and press \s-2RETURN\s+2: -.DS I 1i -:\|\fBwrite -.R -"text" [New file] 3 lines, 90 characters -:\|\fBquit\fR -% -.DE -The % is from \s-2UNIX\s0 to tell you that your session with edit is -over and you may command \s-2UNIX\s0 further. -Since we want -to end the entire session at the terminal, we also need to -exit from \s-2UNIX\s0. -In response to the \s-2UNIX\s0 prompt of ``\|%\|'' -type the command -.DS I 1i -%\|\fBlogout\fR -.DE -This will end your session with \s-2UNIX\s0, and will ready the -terminal for the next user. -It is always important to type \fBlogout\fR at the end of a session -to make absolutely sure no one -could accidentally stumble into your abandoned -session and thus gain access to your files, -tempting even the most honest of souls. -.sp 1 -.PP -This is the end of the first session on \s-2UNIX\s0 text editing. -.bp -.TL -Session 2 -.sp -.PP -Login with \s-2UNIX\s0 as in the first session: -.DS I 1i -login: \fBsusan\fP \fI(carriage return)\fR -Password: \fI(give password and carriage return)\fR -.if t .sp .2v -.if n .sp 1 -\&... A Message of General Interest ... -% -.DE -When you indicate you want to edit, -you can specify the name of the file you worked on last time. -This will -start edit working, and it will fetch the contents of the -file into the buffer, so that you can resume editing the same file. -When edit has copied the file into the buffer, it -will repeat its name and tell -you the number of lines and characters it contains. -Thus, -.DS I 1i -.B -% edit text -.R -"text" 3 lines, 90 characters -: -.DE -means you asked edit to fetch -the file named ``text'' for editing, -causing it to copy the -90 characters of text into the buffer. -Edit awaits -your further instructions, -and indicates this by its prompt character, the colon (:). -In this session, we will append more text to our file, -print the contents of the buffer, and learn to change the text of a line. -.SH -Adding more text to the file -.PP -If you want to add more to the end of your -text you may do so by using the append command to enter text input mode. -When ``append'' is the first command -of your editing session, -the lines you enter -are placed at the end of the buffer. -Here we'll use the abbreviation for the append command, ``a'': -.DS I 1i -:\|\fBa -This is text added in Session 2. -It doesn't mean much here, but -it does illustrate the editor. -\|\fB\s+2\&.\s-2 -.R -.DE -You may recall that once you enter append mode -using the ``a'' (or ``append'') command, -you need to type a line containing only a period (.) -to exit append mode. -.SH -Interrupt -.PP -Should you press the \s-2RUB\s+2 key (sometimes labelled \s-2DELETE\s+2) -while working with edit, -it will send this message to you: -.DS I 1i -Interrupt -: -.DE -Any command that edit might be executing -is terminated by rub or delete, -causing edit to prompt you for a new command. -If you are appending text at the time, -you will exit from append mode -and be expected to give another command. -The line of text you were typing -when the append command was interrupted -will not be entered into the buffer. -.SH -Making corrections -.PP -If while typing the line you hit an incorrect key, -recall that -you may delete the incorrect character -or cancel the entire line of input by erasing in the usual way. -Refer either -to the last few pages of Session 1 -if you need to review -the procedures for making a correction. -The most important idea to remember is that -erasing a character or cancelling a line must be done -before you press the \s-2RETURN\s+2 key. -.SH -Listing what's in the buffer (p) -.PP -Having appended text to what you wrote in Session 1, -you might want to see all the lines in the buffer. -To print the contents of the buffer, type the command: -.DS I 1i -:\|\fB1,$p -.R -.DE -The ``1''\(dg -.FS -\(dgThe numeral ``one'' is the top left-most key, -and should not be confused with the letter ``el''. -.FE -stands for line 1 of the buffer, -the ``$'' is a special symbol designating the last line -of the buffer, -and ``p'' (or \fBprint\fR) is the command to print from line 1 -to the end of the buffer. -The command ``1,$p'' gives you: -.DS I 1i -This is some sample text. -And thiss is some more text. -Text editing is strange, but nice. -This is text added in Session 2. -It doesn't mean much here, but -it does illustrate the editor. -.DE -Occasionally, you may accidentally -type a character that can't be printed, -which can be done by striking a key -while the \s-2CTRL\s0 key is pressed. -In printing lines, edit uses a special notation to -show the existence of non-printing characters. -Suppose you had introduced the non-printing character ``control-A'' -into the word ``illustrate'' -by accidently pressing the \s-2CTRL\s0 key while -typing ``a''. -This can happen on many terminals -because the \s-2CTRL\s+2 key and the ``A'' key -are beside each other. -If your finger presses between the two keys, -control-A results. -When asked to print the contents of the buffer, -edit would display -.DS I 1i -it does illustr^Ate the editor. -.DE -To represent the control-A, edit shows ``^A''. -The sequence ``^'' followed by a capital -letter stands for the one character -entered by holding down the \s-2CTRL\s0 key and typing the letter -which appears after the ``^''. -We'll soon discuss the commands that can be used -to correct this typing error. -.PP -In looking over the text we see that -``this'' is typed as ``thiss'' in the second line, -a deliberate error so we can learn to make corrections. -Let's correct the spelling. -.SH -Finding things in the buffer -.PP -In order to change something in the buffer we first need to -find it. -We can find ``thiss'' in the text we have -entered by looking at a listing -of the lines. -Physically speaking, we search the lines -of text looking for ``thiss'' and stop searching when -we have found it. -The way to tell edit to search for something -is to type it inside slash marks: -.DS I 1i -:\|\fB/thiss/ -.R -.DE -By typing -.B /thiss/ -and pressing \s-1RETURN\s0, -you instruct edit to search for ``thiss''. -If you ask edit to look for a pattern of characters -which it cannot find in the buffer, -it will respond ``Pattern not found''. -When edit finds -the characters ``thiss'', it will print the line of text -for your inspection: -.DS I 1i -And thiss is some more text. -.DE -Edit is now positioned in the buffer at the -line it just printed, -ready to make a change in the line. -.bp -.SH -The current line -.PP -Edit keeps track of the line in the buffer where it is located -at all times during an editing session. -In general, the line that has been most recently -printed, entered, or changed -is the current location in the buffer. -The editor is prepared to make changes -at the current location in the buffer, -unless you direct it to another location. -.PP -In particular, -when you bring a file into the buffer, -you will be located at the last line in the file, -where the editor left off copying the lines -from the file to the buffer. -If your first editing command is ``append'', -the lines you enter are added -to the end of the file, -after the current line \(em -the last line in the file. -.PP -You can refer to your current location in the buffer by the -symbol -period (.) usually known by the name ``dot''. -If you type ``.'' and carriage -return you will be instructing edit to print the current line: -.DS I 1i -:\|\fB\s+2\&.\s-2 -.R -And thiss is some more text. -.DE -.PP -If you want to know the number of the current line, -you can type -.B \&.= -and press \s-2RETURN\s+2, -and edit will respond with the line number: -.DS I 1i -:\|\fB\s+2.\s-2= -.R -2 -.DE -If you type the number of any line and press \s-2RETURN\s+2, -edit will position you at that line and -print its contents: -.DS I 1i -:\|\fB2 -.R -And thiss is some more text. -.DE -You should experiment with these commands -to gain experience in using them to make changes. -.SH -Numbering lines (nu) -.PP -The -.B -number (nu) -.R -command is similar to print, -giving both the number and the text of each printed line. -To see the number and the text of the current line type -.DS I 1i -:\|\fBnu -.R -\0\0\0\0\02\0\0And thiss is some more text. -.DE -Note that the shortest abbreviation for the number command is -``nu'' (and not ``n'', which is used for a different command). -You may specify a range of lines -to be listed by the number command in the same way that lines -are specified for print. -For example, \f31,$nu\f1 lists all lines in the buffer with their -corresponding line numbers. -.SH -Substitute command (s) -.PP -Now that you have found the misspelled word, -you can change it from ``thiss'' to ``this''. -As far as edit is concerned, -changing things is a matter of -substituting one thing for another. -As -.I a -stood for -.I append, -so -.I s -stands for -.I substitute. -We will use the abbreviation ``s'' to reduce the chance -of mistyping the substitute command. -This command will instruct edit to make the change: -.DS I 1i -\f32s/thiss/this/\f1 -.DE -We first indicate the line to be changed, line 2, -and then -type an ``s'' to indicate we want -edit to make a substitution. -Inside the first set of slashes -are the characters that we want to change, -followed by the characters to replace them, -and then a closing slash mark. -To summarize: -.DS I 1i -2s/ \fIwhat is to be changed\fR / \fIwhat to change it to \fR/ -.DE -If edit finds an exact match of the characters to be -changed it will make the change -.B only -in the first occurrence of the characters. -If it does not find the characters -to be changed, it will respond: -.DS I 1i -Substitute pattern match failed -.DE -indicating that your instructions could not be carried out. -When edit does find the characters that you want to change, -it will make the substitution and automatically print -the changed line, so that you can check that the correct substitution -was made. -In the example, -.DS I 1i -:\|\fB2s/thiss/this/ -.R -And this is some more text. -.DE -line 2 (and line 2 only) will be searched for the characters -``thiss'', and when the first exact match is found, ``thiss'' -will be changed to ``this''. -Strictly speaking, it was not necessary above to -specify the number of the line to be changed. -In -.DS I 1i -:\|\fBs/thiss/this/ -.R -.DE -edit will assume that we mean to change -the line where we are currently located (``.''). -In this case, -the command without a line number would have produced the same result -because we were already located -at the line we wished to change. -.PP -For another illustration of the substitute command, -let us choose the line: -.DS I 1i -Text editing is strange, but nice. -.DE -You can make this line a bit more positive -by taking out the characters ``strange, but\ '' so the line -reads: -.DS I 1i -Text editing is nice. -.DE -A command that will first position edit at the desired line -and then make the substitution is: -.DS I 1i -:\|\fB/strange/s/strange, but // -.R -.DE -.LP -What we have done here is combine our search with -our substitution. -Such combinations are perfectly legal, -and speed up editing quite a bit -once you get used to them. -That is, you do not necessarily have to use -line numbers to identify a line to edit. -Instead, you may identify the line you want to change -by asking edit to search for a specified pattern of letters -that occurs in that line. -The parts of the above command are: -.in +1i -.TS -l l. -\fB/strange/\fP tells edit to find the characters ``strange'' in the text -\fBs\fP tells edit to make a substitution -\fB/strange, but //\fP substitutes nothing at all for the characters ``strange, but '' -.TE -.in -1i -.PP -You should note the space after ``but'' in ``/strange, but /''. -If you do not indicate that the space is to be taken out, -your line will read: -.DS I 1i -.if t Text editing is nice. -.if n Text editing is nice. -.DE -which looks a little funny -because of the extra space between ``is'' and ``nice''. -Again, we realize from this that a blank space -is a real character to a computer, and in editing text -we need to be aware of spaces -within a line just as we would be aware of an ``a'' or -a ``4''. -.SH -Another way to list what's in the buffer (z) -.PP -Although the print command is useful for looking at specific lines -in the buffer, -other commands may be more convenient for -viewing large sections of text. -You can ask to see a screen full of text at a time -by using the command -.B z. -If you type -.DS I 1i -:\|\fB1z -.R -.DE -edit will start with line 1 and continue printing lines, -stopping either when the screen of -your terminal is full -or when the last line in the buffer has been printed. -If you want to read the next segment of text, type the command -.DS I 1i -:\|\fBz -.DE -If no starting line number is given for the z command, -printing will start at the ``current'' line, in this case the -last line printed. -Viewing lines in the buffer one screen full at a time -is known as \fIpaging\fR. -Paging can also be used to print -a section of text on a hard-copy terminal. -.SH -Saving the modified text -.PP -This seems to be a good place to pause in our work, -and so we should end the second session. -If you (in haste) type ``q'' to quit the session -your dialogue with edit will be: -.DS I 1i -:\|\fBq -.R -No write since last change (:quit! overrides) -: -.DE -This is edit's warning that you have not written -the modified contents of the buffer to disk. -You run the risk of losing the work you did -during the editing session since you typed the latest write -command. -Because in this lesson we have not written -to disk at all, everything we have done -would have been lost -if edit had obeyed the \fBq\fR command. -If you did not want to save the work done during -this editing session, you would have to type ``q!'' -or (``quit!'') -to confirm that you indeed wanted to end the session -immediately, -leaving the file as it was -after the most recent ``write'' command. -However, -since you want to save what -you have edited, you need to type: -.DS I 1i -:\|\fBw -.R -"text" 6 lines, 171 characters -.DE -and then follow with the commands to quit and logout: -.DS I 1i -:\|\fBq -% \fBlogout\fR -.DE -and hang up the phone or turn off the terminal when -\s-2UNIX\s0 asks for a name. -Terminals connected to the port selector -will stop after the logout command, -and pressing keys on the keyboard will do nothing. -.sp 1 -.PP -This is the end of the second session on \s-2UNIX\s0 text editing. -.bp -.TL -Session 3 -.SH -Bringing text into the buffer (e) -.PP -Login to \s-2UNIX\s0 and make contact with edit. -You should try to login without -looking at the notes, but if you must -then by all means do. -.PP -Did you remember to give the name of the file -you wanted to edit? -That is, did you type -.DS I 1i -% \fBedit text\fR -.DE -or simply -.DS I 1i -% \fBedit\fR -.DE -Both ways get you in contact with edit, but the first way -will bring a copy of the file named ``text'' into -the buffer. -If you did forget to tell edit the name of your file, -you can get it into the buffer by -typing: -.DS I 1i -:\|\fBe text -.R -"text" 6 lines, 171 characters -.DE -The command -.B edit, -which may be abbreviated \fBe\fR, -tells edit that you want -to erase anything that might already be in -the buffer and bring a copy of the file ``text'' into the buffer -for editing. -You may also use the edit (e) command to change files in -the middle of an editing session, -or to give edit the name of a new file that you want to create. -Because the edit command clears the buffer, -you will receive a warning if you try to edit a new file without -having saved a copy of the old file. -This gives you a chance to write the contents of the buffer to disk -before editing the next file. -.SH -Moving text in the buffer (m) -.PP -Edit allows you to move lines of text -from one location in the buffer to another -by means of the -.B move -(\fBm\fR) command. -The first two examples are for illustration only, -though after you have read this Session -you are welcome to return to them for practice. -The command -.DS I 1i -:\|\fB2,4m$ -.R -.DE -directs edit to move lines 2, 3, and 4 -to the end of the buffer ($). -The format for the move command is that you specify -the first line to be moved, the last line to be moved, -the move command ``m'', and the line after which -the moved text is to be placed. -So, -.DS I 1i -:\|\fB1,3m6 -.R -.DE -would instruct edit to move lines 1 through 3 (inclusive) -to a location after line 6 in the buffer. -To move only one line, say, line 4, -to a location in the buffer after line 5, -the command would be ``4m5''. -.PP -Let's move some text using the command: -.DS I 1i -:\|\fB5,$m1 -.R -2 lines moved -it does illustrate the editor. -.DE -After executing a command that moves more than one line of the buffer, -edit tells how many lines were affected by the move -and prints the last moved line for your inspection. -If you want to see more than just the last line, -you can then -use the print (p), z, or number (nu) command to view more text. -The buffer should now contain: -.DS I 1i -This is some sample text. -It doesn't mean much here, but -it does illustrate the editor. -And this is some more text. -Text editing is nice. -This is text added in Session 2. -.DE -You can restore the original order by typing: -.DS I 1i -:\|\fB4,$m1 -.R -.DE -or, combining context searching and the move command: -.DS I 1i -:\|\fB/And this is some/,/This is text/m/This is some sample/ -.R -.DE -(Do not type both examples here!) -The problem with combining context searching -with the move command -is that your chance of making a typing error -in such a long command is greater than -if you type line numbers. -.SH -Copying lines (copy) -.PP -The -.B copy -command -is used to make a second copy of specified lines, -leaving the original lines where they were. -Copy -has the same format as the move command, for example: -.DS I 1i -:\|\fB2,5copy $ -.R -.DE -makes a copy of lines 2 through 5, -placing the added lines after the buffer's end ($). -Experiment with the copy command -so that you can become familiar with how it works. -Note that the shortest abbreviation for copy is -\f3co\f1 (and -not the letter ``c'', which has another meaning). -.SH -Deleting lines (d) -.PP -Suppose you want to delete -the line -.DS I 1i -This is text added in Session 2. -.DE -from the buffer. -If you know the number of the line to be deleted, -you can type -that number followed by -\fBdelete\fR or \fBd\fR. -This example deletes line 4, -which is ``This is text added in Session 2.'' -if you typed the commands -suggested so far. -.DS I 1i -:\|\fB4d -.R -It doesn't mean much here, but -.DE -Here ``4'' is the number of the line to be deleted, -and ``delete'' or ``d'' is the command to delete the line. -After executing the delete command, -edit prints the line that has become the current line (``.''). -.PP -If you do not happen to know the line number -you can search for the line and then delete it using this -sequence of commands: -.DS I 1i -:\|\fB/added in Session 2./ -.R -This is text added in Session 2. -:\|\fBd -.R -It doesn't mean much here, but -.DE -The ``/added in Session 2./'' -asks edit to locate and print -the line containing the indicated text, -starting its search at the current line -and moving line by line -until it finds the text. -Once you are sure that you have correctly specified the line -you want to delete, -you can enter the delete (d) command. -In this case it is not necessary to -specify a line number before the ``d''. -If no line number is given, -edit deletes the current line (``.''), -that is, the line found by our search. -After the deletion, your buffer should contain: -.DS I 1i -This is some sample text. -And this is some more text. -Text editing is nice. -It doesn't mean much here, but -it does illustrate the editor. -And this is some more text. -Text editing is nice. -This is text added in Session 2. -It doesn't mean much here, but -.DE -To delete both lines 2 and 3: -.DS I 1i -And this is some more text. -Text editing is nice. -.DE -you type -.DS I 1i -:\|\f32,3d\f1 -2 lines deleted -.DE -which specifies the range of lines from 2 to 3, -and the operation on those lines \(em ``d'' for delete. -If you delete more than one line -you will receive a message -telling you the number of lines deleted, -as indicated in the example above. -.PP -The previous example assumes that you know the line numbers for -the lines to be deleted. -If you do not you might combine the search command -with the delete command: -.DS I 1i -:\|\fB/And this is some/,/Text editing is nice./d -.R -.DE -.SH -A word or two of caution -.PP -In using the search function to locate lines to -be deleted you should be -.B -absolutely sure -.R -the characters you give as the basis for the search -will take edit to the line you want deleted. -Edit will search for the first -occurrence of the characters starting from where -you last edited \- -that is, from the line you see printed if you type dot (.). -.PP -A search based on too few -characters may result in the wrong lines being deleted, -which edit will do as easily as if you had meant it. -For this reason, it is usually safer -to specify the search and then delete in two separate steps, -at least until you become familiar enough with using the editor -that you understand how best to specify searches. -For a beginner it is not a bad idea to double-check -each command before pressing \s-2RETURN\s+2 to send the command on its way. -.SH -Undo (u) to the rescue -.PP -The -.B -undo (u) -.R -command has the ability to -reverse the effects of the last command that changed the buffer. -To undo the previous command, type -``u'' or ``undo''. -Undo can rescue -the contents of the buffer from many an unfortunate mistake. -However, its powers are not unlimited, -so it is still wise to be reasonably -careful about the commands you give. -.PP -It is possible to undo only commands which -have the power to change the buffer \(em for example, -delete, append, move, copy, substitute, and even undo itself. -The commands write (w) and edit (e), which interact with disk files, -cannot be undone, nor can commands that do not change -the buffer, such as print. -Most importantly, -the -.B only -command that can be reversed by undo -is the -last ``undo-able'' command you typed. -You can use control-H and @ to change -commands while you are typing them, -and undo to reverse the effect of the commands -after you have typed them and pressed \s-2RETURN\s+2. -.PP -To illustrate, -let's issue an undo command. -Recall that the last buffer-changing command we gave deleted -the lines formerly numbered 2 and 3. -Typing undo at this moment will reverse the effects -of the deletion, causing those two lines to be -replaced in the buffer. -.DS I 1i -:\|\fBu -.R -2 more lines in file after undo -And this is some more text. -.DE -Here again, edit informs you if the command affects more -than one line, -and prints -the text of the line which is now ``dot'' (the current line). -.SH -More about the dot (.) and buffer end ($) -.PP -The function assumed by the symbol dot depends on its context. -It can be used: -.IP -1. to exit from append mode; we type dot (and only a dot) on -a line and press \s-2RETURN\s+2; -.IP -2. to refer to the line we are at in the buffer. -.LP -Dot can also be combined with the equal sign to get -the number of the line currently being edited: -.DS I 1i -:\|\fB\&.= -.R -.DE -If we type ``\fB.\fR='' we are asking for the number of the line, -and if we type ``\fB.\fR'' we are asking for the text of the line. -.PP -In this editing session and the last, we used the dollar -sign to indicate the end of the buffer -in commands such as print, copy, and move. -The dollar sign as a command asks edit to print the last -line in the buffer. -If the dollar sign is combined with the equal sign (\f3$=\f1) -edit will print the line number corresponding to the -last line in the buffer. -.PP -``\fB.\fR'' and ``$'', then, represent line numbers. -Whenever appropriate, these symbols can be used in -place of line numbers in commands. -For example -.DS I 1i -:\|\fB\s+2.\s-2,$d -.R -.DE -instructs edit to delete all lines from the current line (\fB.\fR) -to the end of the buffer. -.SH -Moving around in the buffer (+ and \-) -.PP -When you are editing -you often want -to go back and re-read a previous line. -You could specify a context search for a line you want to -read if you remember some of its text, -but if you simply want to see what was written a few, say 3, lines -ago, you can type -.DS I 1i -\-3p -.DE -This tells edit to move back to a position 3 lines -before the current line (.) -and print that line. -You can move forward in the buffer similarly: -.DS I 1i -+2p -.DE -instructs edit to print the line that is 2 -ahead of your current position. -.PP -You may use ``+'' and ``\-'' in any command where edit -accepts line numbers. -Line numbers specified with ``+'' or ``\-'' -can be combined to print a range of lines. -The command -.DS I 1i -:\|\fB\-1,+2copy$ -.R -.DE -makes a copy of 4 lines: the current line, the line before it, -and the two after it. -The copied lines will be placed after the last line -in the buffer ($), -and the original lines referred to by ``\-1'' and ``+2'' -remain where they are. -.PP -Try typing only ``\-''; you will move back one line just as -if you had typed ``\-1p''. -Typing the command ``+'' works similarly. -You might also try typing a few plus or minus signs in a row -(such as ``+++'') to see edit's response. -Typing \s-2RETURN\s+2 alone on a line is the equivalent -of typing ``+1p''; it will move you one line ahead in the buffer -and print that line. -.PP -If you are at the last line of the buffer and try -to move further ahead, perhaps by typing a ``+'' or -a carriage return alone on the line, -edit will remind you that you are at the end of the buffer: -.sp -.nf -.ti 1i -At end-of-file -.br -or -.ti 1i -Not that many lines in buffer -.fi -.LP -Similarly, if you try to move to a position before the first line, -edit will print one of these messages: -.sp -.nf -.ti 1i -Nonzero address required on this command -.br -or -.ti 1i -Negative address \- first buffer line is 1 -.fi -.LP -The number associated with a buffer line is the line's ``address'', -in that it can be used to locate the line. -.SH -Changing lines (c) -.PP -You can also delete certain lines and -insert new text in their place. -This can be accomplished easily with the -.B "change (c)" -command. -The change command instructs edit to delete specified lines -and then switch to text input mode to -accept the text that will replace them. -Let's say you want to change the first two lines in the buffer: -.DS I 1i -This is some sample text. -And this is some more text. -.DE -to read -.DS I 1i -This text was created with the \s-2UNIX\s0 text editor. -.DE -To do so, you type: -.DS I 1i -:\|\fB1,2c -.R -2 lines changed -.B -This text was created with the \s-2UNIX\s0 text editor. -\s+2\&.\s-2 -.R -: -.DE -In the command -.B 1,2c -we specify that we want to change -the range of lines beginning with 1 and ending with 2 -by giving line numbers as with the print command. -These lines will be deleted. -After you type \s-2RETURN\s+2 to end the change command, -edit notifies you if more than one line will be changed -and places you in text input mode. -Any text typed on the following lines will be inserted into -the position where lines were deleted by the change command. -.B -You will remain in text input mode until you exit in the usual way, -by typing a period alone on a line. -.R -Note that the number of lines added to the buffer need not be -the same as the number of lines deleted. -.sp 1 -.PP -This is the end of the third session on text editing with \s-2UNIX\s0. -.bp -.SH -.ce 1 -\s+2Session 4\s0 -.sp -.PP -This lesson covers several topics, starting with -commands that apply throughout the buffer, -characters with special meanings, -and how to issue \s-2UNIX\s0 commands while in the editor. -The next topics deal with files: -more on reading and writing, -and methods of recovering files lost in a crash. -The final section suggests sources of further information. -.SH -Making commands global (g) -.PP -One disadvantage to the commands we have used for -searching or substituting is that if you -have a number of instances of a word to change -it appears that you have to type the command -repeatedly, once for -each time the change needs to be made. -Edit, however, provides a way to make commands -apply to the entire contents of the buffer \- -the -.B -global (g) -.R -command. -.PP -To print all lines -containing a certain sequence of characters -(say, ``text'') -the command is: -.DS I 1i -:\|\fBg/text/p -.R -.DE -The ``g'' instructs edit to -make a global search for all lines -in the buffer containing the characters ``text''. -The ``p'' prints the lines found. -.PP -To issue a global command, start by typing a ``g'' and then a search -pattern identifying -the lines to be affected. -Then, on the same line, type the command to be -executed for the identified lines. -Global substitutions are frequently useful. -For example, -to change all instances of the word ``text'' to the word ``material'' -the command would be a combination of the global search and the -substitute command: -.DS I 1i -:\|\fBg/text/s/text/material/g -.R -.DE -Note the ``g'' at the end of the global command, -which instructs edit to change -each and every instance of ``text'' to ``material''. -If you do not type the ``g'' at the end of the command -only the -.I first -instance of ``text'' \fIin each line\fR will be changed -(the normal result of the substitute command). -The ``g'' at the end of the command is independent of the ``g'' -at the beginning. -You may give a command such as: -.DS I 1i -:\|\fB5s/text/material/g -.R -.DE -to change every instance of ``text'' in line 5 alone. -Further, neither command will change ``text'' to ``material'' -if ``Text'' begins with a capital rather than a lower-case -.I t. -.PP -Edit does not automatically print the lines modified by a -global command. -If you want the lines to be printed, type a ``p'' -at the end of the global command: -.DS I 1i -:\|\fBg/text/s/text/material/gp -.R -.DE -You should be careful -about using the global command in combination with any other \- -in essence, be sure of what you are telling edit to do -to the entire buffer. -For example, -.DS I 1i -:\|\fBg/ /d -.R -72 less lines in file after global -.DE -will delete every line containing a blank anywhere in it. -This could adversely affect -your document, since most lines have spaces between words -and thus would be deleted. -After executing the global command, -edit will print a warning if the command added or deleted more than one line. -Fortunately, the undo command can reverse -the effects of a global command. -You should experiment with the global command -on a small file of text to see what it can do for you. -.SH -More about searching and substituting -.PP -In using slashes to identify a character string -that we want to search for or change, -we have always specified the exact characters. -There is a less tedious way to -repeat the same string of characters. -To change ``text'' to ``texts'' we may type either -.DS I 1i -:\|\fB/text/s/text/texts/ -.R -.DE -as we have done in the past, -or a somewhat abbreviated command: -.DS I 1i -:\|\fB/text/s//texts/ -.R -.DE -In this example, the characters to be changed -are not specified \- -there are no characters, not even a space, -between the two slash marks -that indicate what is to be changed. -This lack of characters between the slashes -is taken by the editor to mean -``use the characters we last searched for as the characters to be changed.'' -.PP -Similarly, the last context search may be repeated -by typing a pair of slashes with nothing between them: -.DS I 1i -:\|\fB/does/ -.R -It doesn't mean much here, but -:\|\fB// -.R -it does illustrate the editor. -.DE -(You should note that the search command found the characters ``does'' -in the word ``doesn't'' in the first search request.) -Because no characters are specified for the second search, -the editor scans the buffer for the next occurrence of the -characters ``does''. -.PP -Edit normally searches forward through the buffer, -wrapping around from the end of the buffer to the beginning, -until the specified character string is found. -If you want to search in the reverse direction, -use question marks (?) instead of slashes -to surround the characters you are searching for. -.PP -It is also possible -to repeat the last substitution -without having to retype the entire command. -An ampersand (&) used as a command -repeats the most recent substitute command, -using the same search and replacement patterns. -After altering the current line by typing -.DS I 1i -:\|\fBs/text/texts/ -.R -.DE -you type -.DS I 1i -:\|\fB/text/& -.R -.DE -or simply -.DS I 1i -:\|\fB//& -.R -.DE -to make the same change on the next line in the buffer -containing the characters ``text''. -.SH -Special characters -.PP -Two characters have special meanings when -used in specifying searches: ``$'' and ``^''. -``$'' is taken by the editor to mean ``end of the line'' -and is used to identify strings -that occur at the end of a line. -.DS I 1i -:\|\fBg/text.$/s//material./p -.R -.DE -tells the editor to search for all lines ending in ``text.'' -(and nothing else, not even a blank space), -to change each final ``text.'' to ``material.'', -and print the changed lines. -.PP -The symbol ``^'' indicates the beginning of a line. -Thus, -.DS I 1i -:\|\fBs/^/1. / -.R -.DE -instructs the editor to insert ``1.'' and a space at the beginning -of the current line. -.PP -The characters ``$'' and ``^'' have special meanings only in the context -of searching. -At other times, they are ordinary characters. -If you ever need to search for a character that has a special meaning, -you must indicate that the -character is to lose temporarily -its special significance by typing another special character, -the backslash (\\), before it. -.DS I 1i -:\|\fBs/\\\\\&$/dollar/ -.R -.DE -looks for the character ``$'' in the current -line and replaces it by the word ``dollar''. -Were it not for the backslash, the ``$'' would have represented -``the end of the line'' in your search -rather than the character ``$''. -The backslash retains its special significance -unless it is preceded by another backslash. -.SH -Issuing \s-2UNIX\s0 commands from the editor -.PP -After creating several files with the editor, -you may want to delete files -no longer useful to you or ask for a list of your files. -Removing and listing files are not functions of the editor, -and so they require the use of \s-2UNIX\s0 system commands -(also referred to as ``shell'' commands, as -``shell'' is the name of the program that processes \s-2UNIX\s0 commands). -You do not need to quit the editor to execute a \s-2UNIX\s0 command -as long as you indicate that it -is to be sent to the shell for execution. -To use the \s-2UNIX\s0 command -.B rm -to remove the file named ``junk'' type: -.DS I 1i -:\|\fB!rm junk -.R -! -: -.DE -The exclamation mark (!) -indicates that the rest of the line is to be processed as a shell command. -If the buffer contents have not been written since the last change, -a warning will be printed before the command is executed: -.DS I 1i -[No write since last change] -.DE -The editor prints a ``!'' when the command is completed. -Other tutorials describe useful features of the system, -of which an editor is only one part. -.SH -Filenames and file manipulation -.PP -Throughout each editing session, -edit keeps track of the name of the file being edited as the -.I "current filename." -Edit remembers as the current filename the name given -when you entered the editor. -The current filename changes whenever the edit (e) command -is used to specify a new file. -Once edit has recorded a current filename, -it inserts that name into any command where a filename has been omitted. -If a write command does not specify a file, -edit, as we have seen, supplies the current filename. -If you are editing a file named ``draft3'' having 283 lines in it, -you can have the editor write onto a different file -by including its name in the write command: -.DS I 1i -:\fB\|w chapter3 -.R -"chapter3" [new file] 283 lines, 8698 characters -.DE -The current filename remembered by the editor -.I -will not be changed as a result of the write command. -.R -Thus, if the next write command -does not specify a name, -edit will write onto the current file (``draft3'') -and not onto the file ``chapter3''. -.SH -The file (f) command -.PP -To ask for the current filename, type -.B file -(or -.B f ). -In response, the editor provides current information about the buffer, -including the filename, your current position, the number of -lines in the buffer, -and the percent of the distance through the file -your current location is. -.DS I 1i -:\|\fBf -.R -"text" [Modified] line 3 of 4 --75%-- -.DE -.\"The expression ``[Edited]'' indicates that the buffer contains -.\"either the editor's copy of the existing file ``text'' -.\"or a file which you are just now creating. -If the contents of the buffer have changed -since the last time the file was written, -the editor will tell you that the file has been ``[Modified]''. -After you save the changes by writing onto a disk file, -the buffer will no longer be considered modified: -.DS I 1i -:\|\fBw -.R -"text" 4 lines, 88 characters -:\|\fBf -.R -"text" line 3 of 4 --75%-- -.DE -.SH -Reading additional files (r) -.PP -The -\f3read (r)\f1 command allows you to add the contents of a file -to the buffer -at a specified location, -essentially copying new lines -between two existing lines. -To use it, specify the line after which the new text will be placed, -the \f3read (r)\f1 command, -and then the name of the file. -If you have a file named ``example'', the command -.DS I 1i -:\|\fB$r example -.R -"example" 18 lines, 473 characters -.DE -reads the file ``example'' -and adds it to the buffer after the last line. -The current filename is not changed by the read command. -.SH -Writing parts of the buffer -.PP -The -.B -write (w) -.R -command can write all or part of the buffer -to a file you specify. -We are already familiar with -writing the entire contents of the -buffer to a disk file. -To write only part of the buffer onto a file, -indicate the beginning and ending lines before the write command, -for example -.DS I 1i -:\|\fB45,$w ending -.R -.DE -Here all lines from 45 through the end of the buffer -are written onto the file named -.I ending. -The lines remain in the buffer -as part of the document you are editing, -and you may continue to edit the entire buffer. -Your original file is unaffected -by your command to write part of the buffer -to another file. -Edit still remembers whether you have saved changes to the buffer -in your original file or not. -.SH -Recovering files -.PP -Although it does not happen very often, -there are times \s-2UNIX\s+2 stops working -because of some malfunction. -This situation is known as a \fIcrash\fR. -Under most circumstances, -edit's crash recovery feature -is able to save work to within a few lines of changes -before a crash (or an accidental phone hang up). -If you lose the contents of an editing buffer in a system crash, -you will normally receive mail when you login that gives -the name of the recovered file. -To recover the file, -enter the editor and type the command -.B recover -(\fBrec\fR), -followed by the name of the lost file. -For example, -to recover the buffer for an edit session -involving the file ``chap6'', the command is: -.DS I 1i -.R -:\|\fBrecover chap6 -.R -.DE -Recover is sometimes unable to save the entire buffer successfully, -so always check the contents of the saved buffer carefully -before writing it back onto the original file. -For best results, -write the buffer to a new file temporarily -so you can examine it without risk to the original file. -Unfortunately, -you cannot use the recover command -to retrieve a file you removed -using the shell command \f3rm\f1. -.SH -Other recovery techniques -.PP -If something goes wrong when you are using the editor, -it may be possible to save your work by using the command -.B preserve -(\fBpre\fR), -which saves the buffer as if the system had crashed. -If you are writing a file and you get the message -``Quota exceeded'', you have tried to use more disk storage -than is allotted to your account. -.I -Proceed with caution -.R -because it is likely that only a part -of the editor's buffer is now present in the file you tried to write. -In this case you should use the shell escape from the editor (!) -to remove some files you don't need and try to write -the file again. -If this is not possible and you cannot find someone to help you, -enter the command -.DS I 1i -:\|\fBpreserve -.R -.DE -and wait for the reply, -.DS I 1i -File preserved. -.DE -If you do not receive this reply, -seek help immediately. -Do not simply leave the editor. -If you do, the buffer will be lost, -and you may not be able to save your file. -If the reply is ``File preserved.'' -you can leave the editor -(or logout) -to remedy the situation. -After a preserve, you can use the recover command -once the problem has been corrected, -or the \fB\-r\fR option of the edit command -if you leave the editor and want to return. -.PP -If you make an undesirable change to the buffer -and type a write command before discovering your mistake, -the modified version will replace any previous version of the file. -Should you ever lose a good version of a document in this way, -do not panic and leave the editor. -As long as you stay in the editor, -the contents of the buffer remain accessible. -Depending on the nature of the problem, -it may be possible -to restore the buffer to a more complete -state with the undo command. -After fixing the damaged buffer, you can again write the file -to disk. -.SH -Further reading and other information -.PP -Edit is an editor designed for beginning and casual users. -It is actually a version of a more powerful editor called -.I ex. -These lessons are intended to introduce you to the editor -and its more commonly-used commands. -We have not covered all of the editor's commands, -but a selection of commands -that should be sufficient to accomplish most of your editing tasks. -You can find out more about the editor in the -.I -Ex Reference Manual, -.R -which is applicable to both -.I ex -and -.I edit. -One way to become familiar with the manual is to begin by reading -the description of commands that you already know. -.bd I 3 -.SH -Using -.I ex -.fl -.bd I -.PP -As you become more experienced with using the editor, -you may still find that edit continues to meet your needs. -However, should you become interested in using -.I ex, -it is easy to switch. -To begin an editing session with -.I ex, -use the name -.B ex -in your command instead of -.B edit. -.PP -Edit commands also work in -.I ex, -but the editing environment is somewhat different. -You should be aware of a few differences -between -.I ex -and -.I edit. -In edit, only the characters ``^'', ``$'', and ``\\'' have -special meanings in searching the buffer -or indicating characters to be changed by a substitute command. -Several additional characters have special -meanings in ex, as described in the -.I -Ex Reference Manual. -.R -Another feature of the edit environment prevents users from -accidently entering two alternative modes of editing, -.I open -and -.I visual, -in which -the editor behaves quite differently from normal command mode. -If you are using ex and you encounter strange behavior, -you may have accidently entered open mode by typing ``o''. -Type the \s-2ESC\s0 key and then a ``Q'' -to get out of open or visual mode and back into -the regular editor command mode. -The document -.I -An Introduction to Display Editing with Vi\|\| -.R -provide full details of visual mode. -.bp -.SH -.ce 1 -\s+2Index\s0 -.LP -.sp 2 -.2C -.nf -addressing, \fIsee\fR line numbers -ampersand, 20 -append mode, 6-7 -append (a) command, 6, 7, 9 -``At end of file'' (message), 18 -backslash (\\), 21 -buffer, 3 -caret (^), 10, 20 -change (c) command, 18 -command mode, 5-6 -``Command not found'' (message), 6 -context search, 10-12, 19-21 -control characters (``^'' notation), 10 -control-H, 7 -copy (co) command, 15 -corrections, 7, 16 -current filename, 21 -current line (\|.\|), 11, 17 -delete (d) command, 15-16 -dial-up, 5 -disk, 3 -documentation, 3, 23 -dollar ($), 10, 11, 17, 20-21 -dot (\f3\|.\|\f1) 11, 17 -edit (text editor), 3, 5, 23 -edit (e) command, 5, 9, 14 -editing commands: -.in +.25i -append (a), 6, 7, 9 -change (c), 18 -copy (co), 15 -delete (d), 15-16 -edit (text editor), 3, 5, 23 -edit (e), 5, 9, 14 -file (f), 21-22 -global (g), 19 -move (m), 14-15 -number (nu), 11 -preserve (pre), 22-23 -print (p), 10 -quit (q), 8, 13 -read (r), 22 -recover (rec), 22, 23 -substitute (s), 11-12, 19, 20 -undo (u), 16-17, 23 -write (w), 8, 13, 21, 22 -z, 12-13 -! (shell escape), 21 -$=, 17 -+, 17 -\-, 17 -//, 12, 20 -??, 20 -\&., 11, 17 -\&.=, 11, 17 -.in -.25i -entering text, 3, 6-7 -erasing -.in +.25i -characters (^H), 7 -lines (@), 7 -.in -.25i -error corrections, 7, 16 -ex (text editor), 23 -\fIEx Reference Manual\fR, 23 -exclamation (!), 21 -file, 3 -file (f) command, 21-22 -file recovery, 22-23 -filename, 3, 21 -global (g) command, 19 -input mode, 6-7 -Interrupt (message), 9 -line numbers, \fIsee also\fR current line -.in +.25i -dollar sign ($), 10, 11, 17 -dot (\|.\|), 11, 17 -relative (+ and \-), 17 -.in -.25i -list, 10 -logging in, 4-6 -logging out, 8 -``Login incorrect'' (message), 5 -minus (\-), 17 -move (m) command, 14-15 -``Negative address\(emfirst buffer line is 1'' (message), 18 -``No current filename'' (message), 8 -``No such file or directory'' (message), 5, 6 -``No write since last change'' (message), 21 -non-printing characters, 10 -``Nonzero address required'' (message), 18 -``Not an editor command'' (message), 6 -``Not that many lines in buffer'' (message), 18 -number (nu) command, 11 -password, 5 -period (\|.\|), 11, 17 -plus (+), 17 -preserve (pre) command, 22-23 -print (p) command, 10 -program, 3 -prompts -.in .25i -% (\s-2UNIX\s0), 5 -: (edit), 5, 6, 7 -\0 (append), 7 -.in -.25i -question (?), 20 -quit (q) command, 8, 13 -read (r) command, 22 -recover (rec) command, 22, 23 -recovery, \fIsee\fR\| file recovery -references, 3, 23 -remove (rm) command, 21, 22 -reverse command effects (undo), 16-17, 23 -searching, 10-12, 19-21 -shell, 21 -shell escape (!), 21 -slash (/), 11-12, 20 -special characters (^, $, \\), 10, 11, 17, 20-21 -substitute (s) command, 11-12, 19, 20 -terminals, 4-5 -text input mode, 7 -undo (u) command, 16-17, 23 -\s-1UNIX\s0, 3 -write (w) command, 8, 13, 21, 22 -z command, 12-13 - diff --git a/docs/USD.doc/exref/Makefile b/docs/USD.doc/exref/Makefile deleted file mode 100644 index 11b5423607e7..000000000000 --- a/docs/USD.doc/exref/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -# @(#)Makefile 8.8 (Berkeley) 10/10/96 - -ROFF= groff -TBL= tbl - -all: exref.ps summary.ps - -exref.ps: ex.rm - ${TBL} ex.rm | ${ROFF} -ms > $@ - chmod 444 $@ - -summary.ps: ex.summary - ${TBL} ex.summary | ${ROFF} -ms > $@ - chmod 444 $@ - -clean: - rm -f exref.ps summary.ps diff --git a/docs/USD.doc/exref/ex.rm b/docs/USD.doc/exref/ex.rm deleted file mode 100644 index 217bad46d277..000000000000 --- a/docs/USD.doc/exref/ex.rm +++ /dev/null @@ -1,2213 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)ex.rm 8.5 (Berkeley) 8/18/96 -.\" -.nr LL 6.5i -.nr FL 6.5i -.EH 'USD:12-%''Ex Reference Manual' -.OH 'Ex Reference Manual''USD:12-%' -.nr )P 0 -.de ZP -.nr pd \\n()P -.nr )P 0 -.if \\n(.$=0 .IP -.if \\n(.$=1 .IP "\\$1" -.if \\n(.$>=2 .IP "\\$1" "\\$2" -.nr )P \\n(pd -.rm pd -.. -.de LC -.br -.sp .1i -.ne 4 -.LP -.ta 4.0i -.. -.bd S B 3 -.\".RP -.TL -Ex Reference Manual -.br -Version 3.7 -.AU -William Joy -.AU -Mark Horton -.AI -Computer Science Division -Department of Electrical Engineering and Computer Science -University of California, Berkeley -Berkeley, Ca. 94720 -.AB -.I Ex -a line oriented text editor, which supports both command and display -oriented editing. -This reference manual describes the command oriented part of -.I ex; -the display editing features of -.I ex -are described in -.I "An Introduction to Display Editing with Vi." -Other documents about the editor include the introduction -.I "Edit: A tutorial", -the -.I "Ex/edit Command Summary", -and a -.I "Vi Quick Reference" -card. -.AE -.NH 1 -Starting ex -.PP -.FS -The financial support of an \s-2IBM\s0 Graduate Fellowship and the National -Science Foundation under grants MCS74-07644-A03 and MCS78-07291 is gratefully -acknowledged. -.FE -Each instance of the editor has a set of options, -which can be set to tailor it to your liking. -The command -.I edit -invokes a version of -.I ex -designed for more casual or beginning -users by changing the default settings of some of these options. -To simplify the description which follows we -assume the default settings of the options. -.PP -When invoked, -.I ex -determines the terminal type from the \s-2TERM\s0 variable in the environment. -It there is a \s-2TERMCAP\s0 variable in the environment, and the type -of the terminal described there matches the \s-2TERM\s0 variable, -then that description -is used. Also if the \s-2TERMCAP\s0 variable contains a pathname (beginning -with a \fB/\fR) then the editor will seek the description of the terminal -in that file (rather than the default /etc/termcap). -If there is a variable \s-2EXINIT\s0 in the environment, then the editor -will execute the commands in that variable, -otherwise if there is a file -.I \&.exrc -in your \s-2HOME\s0 directory -.I ex -reads commands from that file, simulating a -.I source -command. -Option setting commands placed in -\s-2EXINIT\s0 or -.I \&.exrc -will be executed before each editor session. -.PP -A command to enter -.I ex -has the following prototype:\(dg -.FS -\(dg Brackets `[' `]' surround optional parameters here. -.FE -.DS -\fBex\fP [ \fB\-\fP ] [ \fB\-v\fP ] [ \fB\-t\fP \fItag\fP ] [ \fB\-r\fP ] [ \fB\-l\fP ] [ \fB\-w\fP\fIn\fP ] [ \fB\-x\fP ] [ \fB\-R\fP ] [ \fB+\fP\fIcommand\fP ] name ... -.DE -The most common case edits a single file with no options, i.e.: -.DS -\fBex\fR name -.DE -The -.B \- -command line option -option suppresses all interactive-user feedback -and is useful in processing editor scripts in command files. -The -.B \-v -option is equivalent to using -.I vi -rather than -.I ex. -The -.B \-t -option is equivalent to an initial -.I tag -command, editing the file containing the -.I tag -and positioning the editor at its definition. -The -.B \-r -option is used in recovering after an editor or system crash, -retrieving the last saved version of the named file or, -if no file is specified, -typing a list of saved files. -The -.B \-l -option sets up for editing \s-2LISP\s0, setting the -.I showmatch -and -.I lisp -options. -The -.B \-w -option sets the default window size to -.I n, -and is useful on dialups to start in small windows. -The -.B \-x -option causes -.I ex -to prompt for a -.I key , -which is used to encrypt and decrypt the contents of the file, -which should already be encrypted using the same key, -see -.I crypt (1). -The -.B \-R -option sets the -.I readonly -option at the start. -.I Name -arguments indicate files to be edited. -An argument of the form -\fB+\fIcommand\fR -indicates that the editor should begin by executing the specified command. -If -.I command -is omitted, then it defaults to ``$'', positioning the editor at the last -line of the first file initially. Other useful commands here are scanning -patterns of the form ``/pat'' or line numbers, e.g. ``+100'' starting -at line 100. -.NH 1 -File manipulation -.NH 2 -Current file -.PP -.I Ex -is normally editing the contents of a single file, -whose name is recorded in the -.I current -file name. -.I Ex -performs all editing actions in a buffer -(actually a temporary file) -into which the text of the file is initially read. -Changes made to the buffer have no effect on the file being -edited unless and until the buffer contents are written out to the -file with a -.I write -command. -After the buffer contents are written, -the previous contents of the written file are no longer accessible. -When a file is edited, -its name becomes the current file name, -and its contents are read into the buffer. -.PP -The current file is almost always considered to be -.I edited. -This means that the contents of the buffer are logically -connected with the current file name, -so that writing the current buffer contents onto that file, -even if it exists, -is a reasonable action. -If the current file is not -.I edited -then -.I ex -will not normally write on it if it already exists.* -.FS -* The -.I file -command will say ``[Not edited]'' if the current file is not considered -edited. -.FE -.NH 2 -Alternate file -.PP -Each time a new value is given to the current file name, -the previous current file name is saved as the -.I alternate -file name. -Similarly if a file is mentioned but does not become the current file, -it is saved as the alternate file name. -.NH 2 -Filename expansion -.PP -Filenames within the editor may be specified using the normal -shell expansion conventions. -In addition, -the character `%' in filenames is replaced by the -.I current -file name and the character -`#' by the -.I alternate -file name.\(dg -.FS -\(dg This makes it easy to deal alternately with -two files and eliminates the need for retyping the -name supplied on an -.I edit -command after a -.I "No write since last change" -diagnostic is received. -.FE -.NH 2 -Multiple files and named buffers -.PP -If more than one file is given on the command line, -then the first file is edited as described above. -The remaining arguments are placed with the first file in the -.I "argument list." -The current argument list may be displayed with the -.I args -command. -The next file in the argument list may be edited with the -.I next -command. -The argument list may also be respecified by specifying -a list of names to the -.I next -command. -These names are expanded, -the resulting list of names becomes the new argument list, -and -.I ex -edits the first file on the list. -.PP -For saving blocks of text while editing, and especially when editing -more than one file, -.I ex -has a group of named buffers. -These are similar to the normal buffer, except that only a limited number -of operations are available on them. -The buffers have names -.I a -through -.I z.\(dd -.FS -\(dd It is also possible to refer to -.I A -through -.I Z; -the upper case buffers are the same as the lower but commands -append to named buffers rather than replacing -if upper case names are used. -.FE -.NH 2 -Read only -.PP -It is possible to use -.I ex -in -.I "read only" -mode to look at files that you have no intention of modifying. -This mode protects you from accidently overwriting the file. -Read only mode is on when the -.I readonly -option is set. -It can be turned on with the -.B \-R -command line option, -by the -.I view -command line invocation, -or by setting the -.I readonly -option. -It can be cleared by setting -.I noreadonly . -It is possible to write, even while in read only mode, by indicating -that you really know what you are doing. -You can write to a different file, or can use the ! form of write, -even while in read only mode. -.NH 1 -Exceptional Conditions -.NH 2 -Errors and interrupts -.PP -When errors occur -.I ex -(optionally) rings the terminal bell and, in any case, prints an error -diagnostic. If the primary input is from a file, editor processing -will terminate. If an interrupt signal is received, -.I ex -prints ``Interrupt'' and returns to its command level. If the primary -input is a file, then -.I ex -will exit when this occurs. -.NH 2 -Recovering from hangups and crashes -.PP -If a hangup signal is received and the buffer has been modified since -it was last written out, or if the system crashes, either the editor -(in the first case) or the system (after it reboots in the second) will -attempt to preserve the buffer. The next time you log in you should be -able to recover the work you were doing, losing at most a few lines of -changes from the last point before the hangup or editor crash. To -recover a file you can use the -.B \-r -option. If you were editing the file -.I resume, -then you should change -to the directory where you were when the crash occurred, giving the command -.DS -\fBex \-r\fP\fI resume\fP -.DE -After checking that the retrieved file is indeed ok, you can -.I write -it over the previous contents of that file. -.PP -You will normally get mail from the system telling you when a file has -been saved after a crash. The command -.DS -\fBex\fP \-\fBr\fP -.DE -will print a list of the files which have been saved for you. -(In the case of a hangup, -the file will not appear in the list, -although it can be recovered.) -.NH 1 -Editing modes -.PP -.I Ex -has five distinct modes. The primary mode is -.I command -mode. Commands are entered in command mode when a `:' prompt is -present, and are executed each time a complete line is sent. In -.I "text input" -mode -.I ex -gathers input lines and places them in the file. The -.I append, -.I insert, -and -.I change -commands use text input mode. -No prompt is printed when you are in text input mode. -This mode is left by typing a `.' alone at the beginning of a line, and -.I command -mode resumes. -.PP -The last three modes are -.I open -and -.I visual -modes, entered by the commands of the same name, and, within open and -visual modes -.I "text insertion" -mode. -.I Open -and -.I visual -modes allow local editing operations to be performed on the text in the -file. The -.I open -command displays one line at a time on any terminal while -.I visual -works on \s-2CRT\s0 terminals with random positioning cursors, using the -screen as a (single) window for file editing changes. -These modes are described (only) in -.I "An Introduction to Display Editing with Vi." -.NH -Command structure -.PP -Most command names are English words, -and initial prefixes of the words are acceptable abbreviations. -The ambiguity of abbreviations is resolved in favor of the more commonly -used commands.* -.FS -* As an example, the command -.I substitute -can be abbreviated `s' -while the shortest available abbreviation for the -.I set -command is `se'. -.FE -.NH 2 -Command parameters -.PP -Most commands accept prefix addresses specifying the lines in the file -upon which they are to have effect. -The forms of these addresses will be discussed below. -A number of commands also may take a trailing -.I count -specifying the number of lines to be involved in the command.\(dg -.FS -\(dg Counts are rounded down if necessary. -.FE -Thus the command ``10p'' will print the tenth line in the buffer while -``delete 5'' will delete five lines from the buffer, -starting with the current line. -.PP -Some commands take other information or parameters, -this information always being given after the command name.\(dd -.FS -\(dd Examples would be option names in a -.I set -command i.e. ``set number'', -a file name in an -.I edit -command, -a regular expression in a -.I substitute -command, -or a target address for a -.I copy -command, i.e. ``1,5 copy 25''. -.FE -.NH 2 -Command variants -.PP -A number of commands have two distinct variants. -The variant form of the command is invoked by placing an -`!' immediately after the command name. -Some of the default variants may be controlled by options; -in this case, the `!' serves to toggle the default. -.NH 2 -Flags after commands -.PP -The characters `#', `p' and `l' may be placed after many commands.** -.FS -** -A `p' or `l' must be preceded by a blank or tab -except in the single special case `dp'. -.FE -In this case, the command abbreviated by these characters -is executed after the command completes. -Since -.I ex -normally prints the new current line after each change, `p' is rarely necessary. -Any number of `+' or `\-' characters may also be given with these flags. -If they appear, the specified offset is applied to the current line -value before the printing command is executed. -.NH 2 -Comments -.PP -It is possible to give editor commands which are ignored. -This is useful when making complex editor scripts -for which comments are desired. -The comment character is the double quote: ". -Any command line beginning with " is ignored. -Comments beginning with " may also be placed at the ends -of commands, except in cases where they could be confused as part -of text (shell escapes and the substitute and map commands). -.NH 2 -Multiple commands per line -.PP -More than one command may be placed on a line by separating each pair -of commands by a `|' character. -However the -.I global -commands, -comments, -and the shell escape `!' -must be the last command on a line, as they are not terminated by a `|'. -.NH 2 -Reporting large changes -.PP -Most commands which change the contents of the editor buffer give -feedback if the scope of the change exceeds a threshold given by the -.I report -option. -This feedback helps to detect undesirably large changes so that they may -be quickly and easily reversed with an -.I undo. -After commands with more global effect such as -.I global -or -.I visual, -you will be informed if the net change in the number of lines -in the buffer during this command exceeds this threshold. -.NH 1 -Command addressing -.NH 2 -Addressing primitives -.IP \fB.\fR 20 -The current line. -Most commands leave the current line as the last line which they affect. -The default address for most commands is the current line, -thus `\fB.\fR' is rarely used alone as an address. -.IP \fIn\fR 20 -The \fIn\fRth line in the editor's buffer, lines being numbered -sequentially from 1. -.IP \fB$\fR 20 -The last line in the buffer. -.IP \fB%\fR 20 -An abbreviation for ``1,$'', the entire buffer. -.IP \fI+n\fR\ \fI\-n\fR 20 -An offset relative to the current buffer line.\(dg -.FS -\(dg -The forms `.+3' `+3' and `+++' are all equivalent; -if the current line is line 100 they all address line 103. -.FE -.IP \fB/\fIpat\fR\fB/\fR\ \fB?\fIpat\fR\fB?\fR 20 -Scan forward and backward respectively for a line containing \fIpat\fR, a -regular expression (as defined below). The scans normally wrap around the end -of the buffer. -If all that is desired is to print the next line containing \fIpat\fR, then -the trailing \fB/\fR or \fB?\fR may be omitted. -If \fIpat\fP is omitted or explicitly empty, then the last -regular expression specified is located.\(dd -.FS -\(dd The forms \fB\e/\fP and \fB\e?\fP scan -using the last regular expression used in a scan; after a substitute -\fB//\fP and \fB??\fP would scan using the substitute's regular expression. -.FE -.IP \fB\(aa\(aa\fP\ \fB\(aa\fP\fIx\fP 20 -Before each non-relative motion of the current line `\fB.\fP', -the previous current line is marked with a tag, subsequently referred to as -`\(aa\(aa'. -This makes it easy to refer or return to this previous context. -Marks may also be established by the -.I mark -command, using single lower case letters -.I x -and the marked lines referred to as -`\(aa\fIx\fR'. -.NH 2 -Combining addressing primitives -.PP -Addresses to commands consist of a series of addressing primitives, -separated by `,' or `;'. -Such address lists are evaluated left-to-right. -When addresses are separated by `;' the current line `\fB.\fR' -is set to the value of the previous addressing expression -before the next address is interpreted. -If more addresses are given than the command requires, -then all but the last one or two are ignored. -If the command takes two addresses, the first addressed line must -precede the second in the buffer.\(dg -.FS -\(dg Null address specifications are permitted in a list of addresses, -the default in this case is the current line `.'; -thus `,100' is equivalent to `\fB.\fR,100'. -It is an error to give a prefix address to a command which expects none. -.FE -.NH 1 -Command descriptions -.PP -The following form is a prototype for all -.I ex -commands: -.DS -\fIaddress\fR \fBcommand\fR \fI! parameters count flags\fR -.DE -All parts are optional; the degenerate case is the empty command which prints -the next line in the file. For sanity with use from within -.I visual -mode, -.I ex -ignores a ``:'' preceding any command. -.PP -In the following command descriptions, the -default addresses are shown in parentheses, -which are -.I not, -however, -part of the command. -.LC -\fBabbreviate\fR \fIword rhs\fP abbr: \fBab\fP -.ZP -Add the named abbreviation to the current list. -When in input mode in visual, if -.I word -is typed as a complete word, it will be changed to -.I rhs . -.LC -( \fB.\fR ) \fBappend\fR abbr: \fBa\fR -.br -\fItext\fR -.br -\&\fB.\fR -.ZP -Reads the input text and places it after the specified line. -After the command, `\fB.\fR' -addresses the last line input or the -specified line if no lines were input. -If address `0' is given, -text is placed at the beginning of the buffer. -.LC -\fBa!\fR -.br -\fItext\fR -.br -\&\fB.\fR -.ZP -The variant flag to -.I append -toggles the setting for the -.I autoindent -option during the input of -.I text. -.LC -\fBargs\fR -.ZP -The members of the argument list are printed, with the current argument -delimited by `[' and `]'. -.ig -.PP -\fBcd\fR \fIdirectory\fR -.ZP -The -.I cd -command is a synonym for -.I chdir. -.. -.LC -( \fB.\fP , \fB.\fP ) \fBchange\fP \fIcount\fP abbr: \fBc\fP -.br -\fItext\fP -.br -\&\fB.\fP -.ZP -Replaces the specified lines with the input \fItext\fP. -The current line becomes the last line input; -if no lines were input it is left as for a -\fIdelete\fP. -.LC -\fBc!\fP -.br -\fItext\fP -.br -\&\fB.\fP -.ZP -The variant toggles -.I autoindent -during the -.I change. -.ig -.LC -\fBchdir\fR \fIdirectory\fR -.ZP -The specified \fIdirectory\fR becomes the current directory. -If no directory is specified, the current value of the -.I home -option is used as the target directory. -After a -.I chdir -the current file is not considered to have been -edited so that write restrictions on pre-existing files apply. -.. -.LC -( \fB.\fP , \fB.\fP )\|\fBcopy\fP \fIaddr\fP \fIflags\fP abbr: \fBco\fP -.ZP -A -.I copy -of the specified lines is placed after -.I addr, -which may be `0'. -The current line -`\fB.\fR' -addresses the last line of the copy. -The command -.I t -is a synonym for -.I copy. -.LC -( \fB.\fR , \fB.\fR )\|\fBdelete\fR \fIbuffer\fR \fIcount\fR \fIflags\fR abbr: \fBd\fR -.ZP -Removes the specified lines from the buffer. -The line after the last line deleted becomes the current line; -if the lines deleted were originally at the end, -the new last line becomes the current line. -If a named -.I buffer -is specified by giving a letter, -then the specified lines are saved in that buffer, -or appended to it if an upper case letter is used. -.LC -\fBedit\fR \fIfile\fR abbr: \fBe\fR -.br -\fBex\fR \fIfile\fR -.ZP -Used to begin an editing session on a new file. -The editor -first checks to see if the buffer has been modified since the last -.I write -command was issued. -If it has been, -a warning is issued and the -command is aborted. -The -command otherwise deletes the entire contents of the editor buffer, -makes the named file the current file and prints the new filename. -After insuring that this file is sensible\(dg -.FS -\(dg I.e., that it is not a binary file such as a directory, -a block or character special file other than -.I /dev/tty, -a terminal, -or a binary or executable file -(as indicated by the first word). -.FE -the editor reads the file into its buffer. -.IP -If the read of the file completes without error, -the number of lines and characters read is typed. -If there were any non-\s-2ASCII\s0 characters -in the file they are stripped of their non-\s-2ASCII\s0 -high bits, -and any null characters in the file are discarded. -If none of these errors occurred, the file is considered -.I edited. -If the last line of the input file is missing the trailing -newline character, it will be supplied and a complaint will be issued. -This command leaves the current line `\fB.\fR' at the last line read.\(dd -.FS -\(dd If executed from within -.I open -or -.I visual, -the current line is initially the first line of the file. -.FE -.LC -\fBe!\fR \fIfile\fR -.ZP -The variant form suppresses the complaint about modifications having -been made and not written from the editor buffer, thus -discarding all changes which have been made before editing the new file. -.LC -\fBe\fR \fB+\fIn\fR \fIfile\fR -.ZP -Causes the editor to begin at line -.I n -rather than at the last line; -\fIn\fR may also be an editor command containing no spaces, e.g.: ``+/pat''. -.LC -\fBfile\fR abbr: \fBf\fR -.ZP -Prints the current file name, -whether it has been `[Modified]' since the last -.I write -command, -whether it is -.I "read only" , -the current line, -the number of lines in the buffer, -and the percentage of the way through the buffer of the current line.* -.FS -* In the rare case that the current file is `[Not edited]' this is -noted also; in this case you have to use the form \fBw!\fR to write to -the file, since the editor is not sure that a \fBwrite\fR will not -destroy a file unrelated to the current contents of the buffer. -.FE -.LC -\fBfile\fR \fIfile\fR -.ZP -The current file name is changed to -.I file -which is considered -`[Not edited]'. -.LC -( 1 , $ ) \fBglobal\fR /\fIpat\|\fR/ \fIcmds\fR abbr: \fBg\fR -.ZP -First marks each line among those specified which matches -the given regular expression. -Then the given command list is executed with `\fB.\fR' initially -set to each marked line. -.IP -The command list consists of the remaining commands on the current -input line and may continue to multiple lines by ending all but the -last such line with a `\e'. -If -.I cmds -(and possibly the trailing \fB/\fR delimiter) is omitted, each line matching -.I pat -is printed. -.I Append, -.I insert, -and -.I change -commands and associated input are permitted; -the `\fB.\fR' terminating input may be omitted if it would be on the -last line of the command list. -.I Open -and -.I visual -commands are permitted in the command list and take input from the terminal. -.IP -The -.I global -command itself may not appear in -.I cmds. -The -.I undo -command is also not permitted there, -as -.I undo -instead can be used to reverse the entire -.I global -command. -The options -.I autoprint -and -.I autoindent -are inhibited during a -.I global, -(and possibly the trailing \fB/\fR delimiter) and the value of the -.I report -option is temporarily infinite, -in deference to a \fIreport\fR for the entire global. -Finally, the context mark `\'\'' is set to the value of -`.' before the global command begins and is not changed during a global -command, -except perhaps by an -.I open -or -.I visual -within the -.I global. -.LC -\fBg!\fR \fB/\fIpat\fB/\fR \fIcmds\fR abbr: \fBv\fR -.IP -The variant form of \fIglobal\fR runs \fIcmds\fR at each line not matching -\fIpat\fR. -.LC -( \fB.\fR )\|\fBinsert\fR abbr: \fBi\fR -.br -\fItext\fR -.br -\&\fB.\fR -.ZP -Places the given text before the specified line. -The current line is left at the last line input; -if there were none input it is left at the line before the addressed line. -This command differs from -.I append -only in the placement of text. -.KS -.LC -\fBi!\fR -.br -\fItext\fR -.br -\&\fB.\fR -.ZP -The variant toggles -.I autoindent -during the -.I insert. -.KE -.LC -( \fB.\fR , \fB.\fR+1 ) \fBjoin\fR \fIcount\fR \fIflags\fR abbr: \fBj\fR -.ZP -Places the text from a specified range of lines -together on one line. -White space is adjusted at each junction to provide at least -one blank character, two if there was a `\fB.\fR' at the end of the line, -or none if the first following character is a `)'. -If there is already white space at the end of the line, -then the white space at the start of the next line will be discarded. -.LC -\fBj!\fR -.ZP -The variant causes a simpler -.I join -with no white space processing; the characters in the lines are simply -concatenated. -.LC -( \fB.\fR ) \fBk\fR \fIx\fR -.ZP -The -.I k -command is a synonym for -.I mark. -It does not require a blank or tab before the following letter. -.LC -( \fB.\fR , \fB.\fR ) \fBlist\fR \fIcount\fR \fIflags\fR -.ZP -Prints the specified lines in a more unambiguous way: -tabs are printed as `^I' -and the end of each line is marked with a trailing `$'. -The current line is left at the last line printed. -.LC -\fBmap\fR \fIlhs\fR \fIrhs\fR -.ZP -The -.I map -command is used to define macros for use in -.I visual -mode. -.I Lhs -should be a single character, or the sequence ``#n'', for n a digit, -referring to function key \fIn\fR. When this character or function key -is typed in -.I visual -mode, it will be as though the corresponding \fIrhs\fR had been typed. -On terminals without function keys, you can type ``#n''. -See section 6.9 of the ``Introduction to Display Editing with Vi'' -for more details. -.LC -( \fB.\fR ) \fBmark\fR \fIx\fR -.ZP -Gives the specified line mark -.I x, -a single lower case letter. -The -.I x -must be preceded by a blank or a tab. -The addressing form `\'x' then addresses this line. -The current line is not affected by this command. -.LC -( \fB.\fR , \fB.\fR ) \fBmove\fR \fIaddr\fR abbr: \fBm\fR -.ZP -The -.I move -command repositions the specified lines to be after -.I addr . -The first of the moved lines becomes the current line. -.LC -\fBnext\fR abbr: \fBn\fR -.ZP -The next file from the command line argument list is edited. -.LC -\fBn!\fR -.ZP -The variant suppresses warnings about the modifications to the buffer not -having been written out, discarding (irretrievably) any changes which may -have been made. -.LC -\fBn\fR \fIfilelist\fR -.br -\fBn\fR \fB+\fIcommand\fR \fIfilelist\fR -.ZP -The specified -.I filelist -is expanded and the resulting list replaces the -current argument list; -the first file in the new list is then edited. -If -.I command -is given (it must contain no spaces), then it is executed after editing the first such file. -.LC -( \fB.\fR , \fB.\fR ) \fBnumber\fR \fIcount\fR \fIflags\fR abbr: \fB#\fR or \fBnu\fR -.ZP -Prints each specified line preceded by its buffer line -number. -The current line is left at the last line printed. -.KS -.LC -( \fB.\fR ) \fBopen\fR \fIflags\fR abbr: \fBo\fR -.br -( \fB.\fR ) \fBopen\fR /\fIpat\|\fR/ \fIflags\fR -.ZP -Enters intraline editing \fIopen\fR mode at each addressed line. -If -.I pat -is given, -then the cursor will be placed initially at the beginning of the -string matched by the pattern. -To exit this mode use Q. -See -.I "An Introduction to Display Editing with Vi" -for more details. -.KE -.LC -\fBpreserve\fR -.ZP -The current editor buffer is saved as though the system had just crashed. -This command is for use only in emergencies when a -.I write -command has resulted in an error and you don't know how to save your work. -After a -.I preserve -you should seek help. -.LC -( \fB.\fR , \fB.\fR )\|\fBprint\fR \fIcount\fR abbr: \fBp\fR or \fBP\fR -.ZP -Prints the specified lines -with non-printing characters printed as control characters `^\fIx\fR\|'; -delete (octal 177) is represented as `^?'. -The current line is left at the last line printed. -.LC -( \fB.\fR )\|\fBput\fR \fIbuffer\fR abbr: \fBpu\fR -.ZP -Puts back -previously -.I deleted -or -.I yanked -lines. -Normally used with -.I delete -to effect movement of lines, -or with -.I yank -to effect duplication of lines. -If no -.I buffer -is specified, then the last -.I deleted -or -.I yanked -text is restored.* -.FS -* But no modifying commands may intervene between the -.I delete -or -.I yank -and the -.I put, -nor may lines be moved between files without using a named buffer. -.FE -By using a named buffer, text may be restored that was saved there at any -previous time. -.LC -\fBquit\fR abbr: \fBq\fR -.ZP -Causes -.I ex -to terminate. -No automatic write of the editor buffer to a file is performed. -However, -.I ex -issues a warning message if the file has changed -since the last -.I write -command was issued, and does not -.I quit.\(dg -.FS -\(dg \fIEx\fR -will also issue a diagnostic if there are more files in the argument -list. -.FE -Normally, you will wish to save your changes, and you -should give a \fIwrite\fR command; -if you wish to discard them, use the \fBq!\fR command variant. -.LC -\fBq!\fR -.ZP -Quits from the editor, discarding changes to the buffer without complaint. -.LC -( \fB.\fR ) \fBread\fR \fIfile\fR abbr: \fBr\fR -.ZP -Places a copy of the text of the given file in the -editing buffer after the specified line. -If no -.I file -is given the current file name is used. -The current file name is not changed unless there is none in which -case -.I file -becomes the current name. -The sensibility restrictions for the -.I edit -command apply here also. -If the file buffer is empty and there is no current name then -.I ex -treats this as an -.I edit -command. -.IP -Address `0' is legal for this command and causes the file to be read at -the beginning of the buffer. -Statistics are given as for the -.I edit -command when the -.I read -successfully terminates. -After a -.I read -the current line is the last line read.\(dd -.FS -\(dd Within -.I open -and -.I visual -the current line is set to the first line read rather than the last. -.FE -.LC -( \fB.\fR ) \fBread\fR \fB!\fR\fIcommand\fR -.ZP -Reads the output of the command -.I command -into the buffer after the specified line. -This is not a variant form of the command, rather a read -specifying a -.I command -rather than a -.I filename; -a blank or tab before the \fB!\fR is mandatory. -.LC -\fBrecover \fIfile\fR -.ZP -Recovers -.I file -from the system save area. -Used after a accidental hangup of the phone** -.FS -** The system saves a copy of the file you were editing only if you -have made changes to the file. -.FE -or a system crash** or -.I preserve -command. -Except when you use -.I preserve -you will be notified by mail when a file is saved. -.LC -\fBrewind\fR abbr: \fBrew\fR -.ZP -The argument list is rewound, and the first file in the list is edited. -.LC -\fBrew!\fR -.ZP -Rewinds the argument list discarding any changes made to the current buffer. -.LC -\fBset\fR \fIparameter\fR -.ZP -With no arguments, prints those options whose values have been -changed from their defaults; -with parameter -.I all -it prints all of the option values. -.IP -Giving an option name followed by a `?' -causes the current value of that option to be printed. -The `?' is unnecessary unless the option is Boolean valued. -Boolean options are given values either by the form -`set \fIoption\fR' to turn them on or -`set no\fIoption\fR' to turn them off; -string and numeric options are assigned via the form -`set \fIoption\fR=value'. -.IP -More than one parameter may be given to -.I set \|; -they are interpreted left-to-right. -.LC -\fBshell\fR abbr: \fBsh\fR -.IP -A new shell is created. -When it terminates, editing resumes. -.LC -\fBsource\fR \fIfile\fR abbr: \fBso\fR -.IP -Reads and executes commands from the specified file. -.I Source -commands may be nested. -.LC -( \fB.\fR , \fB.\fR ) \fBsubstitute\fR /\fIpat\fR\|/\fIrepl\fR\|/ \fIoptions\fR \fIcount\fR \fIflags\fR abbr: \fBs\fR -.IP -On each specified line, the first instance of pattern -.I pat -is replaced by replacement pattern -.I repl. -If the -.I global -indicator option character `g' -appears, then all instances are substituted; -if the -.I confirm -indication character `c' appears, -then before each substitution the line to be substituted -is typed with the string to be substituted marked -with `\(ua' characters. -By typing an `y' one can cause the substitution to be performed, -any other input causes no change to take place. -After a -.I substitute -the current line is the last line substituted. -.IP -Lines may be split by substituting -new-line characters into them. -The newline in -.I repl -must be escaped by preceding it with a `\e'. -Other metacharacters available in -.I pat -and -.I repl -are described below. -.LC -.B stop -.ZP -Suspends the editor, returning control to the top level shell. -If -.I autowrite -is set and there are unsaved changes, -a write is done first unless the form -.B stop ! -is used. -This commands is only available where supported by the teletype driver -and operating system. -.LC -( \fB.\fR , \fB.\fR ) \fBsubstitute\fR \fIoptions\fR \fIcount\fR \fIflags\fR abbr: \fBs\fR -.ZP -If -.I pat -and -.I repl -are omitted, then the last substitution is repeated. -This is a synonym for the -.B & -command. -.LC -( \fB.\fR , \fB.\fR ) \fBt\fR \fIaddr\fR \fIflags\fR -.ZP -The -.I t -command is a synonym for -.I copy . -.LC -\fBta\fR \fItag\fR -.ZP -The focus of editing switches to the location of -.I tag, -switching to a different line in the current file where it is defined, -or if necessary to another file.\(dd -.FS -\(dd If you have modified the current file before giving a -.I tag -command, you must write it out; giving another -.I tag -command, specifying no -.I tag -will reuse the previous tag. -.FE -.IP -The tags file is normally created by a program such as -.I ctags, -and consists of a number of lines with three fields separated by blanks -or tabs. The first field gives the name of the tag, -the second the name of the file where the tag resides, and the third -gives an addressing form which can be used by the editor to find the tag; -this field is usually a contextual scan using `/\fIpat\fR/' to be immune -to minor changes in the file. Such scans are always performed as if -.I nomagic -was set. -.PP -The tag names in the tags file must be sorted alphabetically. -.LC -\fBunabbreviate\fR \fIword\fP abbr: \fBuna\fP -.ZP -Delete -.I word -from the list of abbreviations. -.LC -\fBundo\fR abbr: \fBu\fR -.ZP -Reverses the changes made in the buffer by the last -buffer editing command. -Note that -.I global -commands are considered a single command for the purpose of -.I undo -(as are -.I open -and -.I visual.) -Also, the commands -.I write -and -.I edit -which interact with the -file system cannot be undone. -.I Undo -is its own inverse. -.IP -.I Undo -always marks the previous value of the current line `\fB.\fR' -as `\'\''. -After an -.I undo -the current line is the first line restored -or the line before the first line deleted if no lines were restored. -For commands with more global effect -such as -.I global -and -.I visual -the current line regains it's pre-command value after an -.I undo. -.LC -\fBunmap\fR \fIlhs\fR -.ZP -The macro expansion associated by -.I map -for -.I lhs -is removed. -.LC -( 1 , $ ) \fBv\fR /\fIpat\fR\|/ \fIcmds\fR -.ZP -A synonym for the -.I global -command variant \fBg!\fR, running the specified \fIcmds\fR on each -line which does not match \fIpat\fR. -.LC -\fBversion\fR abbr: \fBve\fR -.ZP -Prints the current version number of the editor -as well as the date the editor was last changed. -.LC -( \fB.\fR ) \fBvisual\fR \fItype\fR \fIcount\fR \fIflags\fR abbr: \fBvi\fR -.ZP -Enters visual mode at the specified line. -.I Type -is optional and may be `\-' , `\(ua' or `\fB.\fR' -as in the -.I z -command to specify the placement of the specified line on the screen. -By default, if -.I type -is omitted, the specified line is placed as the first on the screen. -A -.I count -specifies an initial window size; the default is the value of the option -.I window. -See the document -.I "An Introduction to Display Editing with Vi" -for more details. -To exit this mode, type Q. -.LC -\fBvisual\fP file -.br -\fBvisual\fP +\fIn\fP file -.ZP -From visual mode, -this command is the same as edit. -.LC -( 1 , $ ) \fBwrite\fR \fIfile\fR abbr: \fBw\fR -.ZP -Writes changes made back to \fIfile\fR, printing the number of lines and -characters written. -Normally \fIfile\fR is omitted and the text goes back where it came from. -If a \fIfile\fR is specified, then text will be written to that file.* -.FS -* The editor writes to a file only if it is -the current file and is -.I edited , -if the file does not exist, -or if the file is actually a teletype, -.I /dev/tty, -.I /dev/null. -Otherwise, you must give the variant form \fBw!\fR to force the write. -.FE -If the file does not exist it is created. -The current file name is changed only if there is no current file -name; the current line is never changed. -.IP -If an error occurs while writing the current and -.I edited -file, the editor -considers that there has been ``No write since last change'' -even if the buffer had not previously been modified. -.LC -( 1 , $ ) \fBwrite>>\fR \fIfile\fR abbr: \fBw>>\fR -.ZP -Writes the buffer contents at the end of -an existing file. -.IP -.LC -\fBw!\fR \fIname\fR -.ZP -Overrides the checking of the normal \fIwrite\fR command, -and will write to any file which the system permits. -.LC -( 1 , $ ) \fBw\fR \fB!\fR\fIcommand\fR -.ZP -Writes the specified lines into -.I command. -Note the difference between \fBw!\fR which overrides checks and -\fBw\ \ !\fR which writes to a command. -.LC -\fBwq\fR \fIname\fR -.ZP -Like a \fIwrite\fR and then a \fIquit\fR command. -.LC -\fBwq!\fR \fIname\fR -.ZP -The variant overrides checking on the sensibility of the -.I write -command, as \fBw!\fR does. -.LC -\fBxit\fP \fIname\fR -.ZP -If any changes have been made and not written, writes the buffer out. -Then, in any case, quits. -.LC -( \fB.\fR , \fB.\fR )\|\fByank\fR \fIbuffer\fR \fIcount\fR abbr: \fBya\fR -.ZP -Places the specified lines in the named -.I buffer, -for later retrieval via -.I put. -If no buffer name is specified, the lines go to a more volatile place; -see the \fIput\fR command description. -.LC -( \fB.+1\fR ) \fBz\fR \fIcount\fR -.ZP -Print the next \fIcount\fR lines, default \fIwindow\fR. -.LC -( \fB.\fR ) \fBz\fR \fItype\fR \fIcount\fR -.ZP -Prints a window of text with the specified line at the top. -If \fItype\fR is `\-' the line is placed at the bottom; a `\fB.\fR' causes -the line to be placed in the center.* -A count gives the number of lines to be displayed rather than -double the number specified by the \fIscroll\fR option. -On a \s-2CRT\s0 the screen is cleared before display begins unless a -count which is less than the screen size is given. -The current line is left at the last line printed. -.FS -* Forms `z=' and `z\(ua' also exist; `z=' places the current line in the -center, surrounds it with lines of `\-' characters and leaves the current -line at this line. The form `z\(ua' prints the window before `z\-' -would. The characters `+', `\(ua' and `\-' may be repeated for cumulative -effect. -On some v2 editors, no -.I type -may be given. -.FE -.LC -\fB!\fR \fIcommand\fR\fR -.ZP -The remainder of the line after the `!' character is sent to a shell -to be executed. -Within the text of -.I command -the characters -`%' and `#' are expanded as in filenames and the character -`!' is replaced with the text of the previous command. -Thus, in particular, -`!!' repeats the last such shell escape. -If any such expansion is performed, the expanded line will be echoed. -The current line is unchanged by this command. -.IP -If there has been ``[No\ write]'' of the buffer contents since the last -change to the editing buffer, then a diagnostic will be printed -before the command is executed as a warning. -A single `!' is printed when the command completes. -.LC -( \fIaddr\fR , \fIaddr\fR ) \fB!\fR \fIcommand\fR\fR -.ZP -Takes the specified address range and supplies it as -standard input to -.I command; -the resulting output then replaces the input lines. -.LC -( $ ) \fB=\fR -.ZP -Prints the line number of the -addressed line. -The current line is unchanged. -.KS -.LC -( \fB.\fR , \fB.\fR ) \fB>\fR \fIcount\fR \fIflags\fR -.br -( \fB.\fR , \fB.\fR ) \fB<\fR \fIcount\fR \fIflags\fR -.IP -Perform intelligent shifting on the specified lines; -\fB<\fR shifts left and \fB>\fR shift right. -The quantity of shift is determined by the -.I shiftwidth -option and the repetition of the specification character. -Only white space (blanks and tabs) is shifted; -no non-white characters are discarded in a left-shift. -The current line becomes the last line which changed due to the -shifting. -.KE -.LC -\fB^D\fR -.ZP -An end-of-file from a terminal input scrolls through the file. -The -.I scroll -option specifies the size of the scroll, normally a half screen of text. -.LC -( \fB.\fR+1 , \fB.\fR+1 ) -.br -( \fB.\fR+1 , \fB.\fR+1 ) | -.ZP -An address alone causes the addressed lines to be printed. -A blank line prints the next line in the file. -.LC -( \fB.\fR , \fB.\fR ) \fB&\fR \fIoptions\fR \fIcount\fR \fIflags\fR -.ZP -Repeats the previous -.I substitute -command. -.LC -( \fB.\fR , \fB.\fR ) \fB\s+2~\s0\fR \fIoptions\fR \fIcount\fR \fIflags\fR -.ZP -Replaces the previous regular expression with the previous -replacement pattern from a substitution. -.NH 1 -Regular expressions and substitute replacement patterns -.NH 2 -Regular expressions -.PP -A regular expression specifies a set of strings of characters. -A member of this set of strings is said to be -.I matched -by the regular expression. -.I Ex -remembers two previous regular expressions: -the previous regular expression used in a -.I substitute -command -and the previous regular expression used elsewhere -(referred to as the previous \fIscanning\fR regular expression.) -The previous regular expression -can always be referred to by a null \fIre\fR, e.g. `//' or `??'. -.NH 2 -Magic and nomagic -.PP -The regular expressions allowed by -.I ex -are constructed in one of two ways depending on the setting of -the -.I magic -option. -The -.I ex -and -.I vi -default setting of -.I magic -gives quick access to a powerful set of regular expression -metacharacters. -The disadvantage of -.I magic -is that the user must remember that these metacharacters are -.I magic -and precede them with the character `\e' -to use them as ``ordinary'' characters. -With -.I nomagic, -the default for -.I edit, -regular expressions are much simpler, -there being only two metacharacters. -The power of the other metacharacters is still available by preceding -the (now) ordinary character with a `\e'. -Note that `\e' is thus always a metacharacter. -.PP -The remainder of the discussion of regular expressions assumes -that -that the setting of this option is -.I magic.\(dg -.FS -\(dg To discern what is true with -.I nomagic -it suffices to remember that the only -special characters in this case will be `\(ua' at the beginning -of a regular expression, -`$' at the end of a regular expression, -and `\e'. -With -.I nomagic -the characters `\s+2~\s0' and `&' also lose their special meanings -related to the replacement pattern of a substitute. -.FE -.NH 2 -Basic regular expression summary -.PP -The following basic constructs are used to construct -.I magic -mode regular expressions. -.IP \fIchar\fR 15 -An ordinary character matches itself. -The characters `\(ua' at the beginning of a line, -`$' at the end of line, -`*' as any character other than the first, -`.', `\e', `[', and `\s+2~\s0' are not ordinary characters and -must be escaped (preceded) by `\e' to be treated as such. -.IP \fB\(ua\fR -At the beginning of a pattern -forces the match to succeed only at the beginning of a line. -.IP \fB$\fR -At the end of a regular expression forces the match to -succeed only at the end of the line. -.IP \&\fB.\fR -Matches any single character except -the new-line character. -.IP \fB\e<\fR -Forces the match -to occur only at the beginning of a ``variable'' or ``word''; -that is, either at the beginning of a line, or just before -a letter, digit, or underline and after a character not one of -these. -.IP \fB\e>\fR -Similar to `\e<', but matching the end of a ``variable'' -or ``word'', i.e. either the end of the line or before character -which is neither a letter, nor a digit, nor the underline character. -.IP \fB[\fIstring\fR]\fR -Matches any (single) character in the class defined by -.I string. -Most characters in -.I string -define themselves. -A pair of characters separated by `\-' in -.I string -defines the set of characters collating between the specified lower and upper -bounds, thus `[a\-z]' as a regular expression matches -any (single) lower-case letter. -If the first character of -.I string -is an `\(ua' then the construct -matches those characters which it otherwise would not; -thus `[\(uaa\-z]' matches anything but a lower-case letter (and of course a -newline). -To place any of the characters -`\(ua', `[', or `\-' in -.I string -you must escape them with a preceding `\e'. -.NH 2 -Combining regular expression primitives -.PP -The concatenation of two regular expressions matches the leftmost and -then longest string -which can be divided with the first piece matching the first regular -expression and the second piece matching the second. -Any of the (single character matching) regular expressions mentioned -above may be followed by the character `*' to form a regular expression -which matches any number of adjacent occurrences (including 0) of characters -matched by the regular expression it follows. -.PP -The character `\s+2~\s0' may be used in a regular expression, -and matches the text which defined the replacement part -of the last -.I substitute -command. -A regular expression may be enclosed between the sequences -`\e(' and `\e)' with side effects in the -.I substitute -replacement patterns. -.NH 2 -Substitute replacement patterns -.PP -The basic metacharacters for the replacement pattern are -`&' and `~'; these are -given as `\e&' and `\e~' when -.I nomagic -is set. -Each instance of `&' is replaced by the characters -which the regular expression matched. -The metacharacter `~' stands, in the replacement pattern, -for the defining text of the previous replacement pattern. -.PP -Other metasequences possible in the replacement pattern -are always introduced by the escaping character `\e'. -The sequence `\e\fIn\fR' is replaced by the text matched -by the \fIn\fR-th regular subexpression enclosed between -`\e(' and `\e)'.\(dg -.FS -\(dg When nested, parenthesized subexpressions are present, -\fIn\fR is determined by counting occurrences of `\e(' starting from the left. -.FE -The sequences `\eu' and `\el' cause the immediately following character in -the replacement to be converted to upper- or lower-case respectively -if this character is a letter. -The sequences `\eU' and `\eL' turn such conversion on, either until -`\eE' or `\ee' is encountered, or until the end of the replacement pattern. -.de LC -.br -.sp .1i -.ne 4 -.LP -.ta 3i -.. -.NH 1 -Option descriptions -.PP -.LC -\fBautoindent\fR, \fBai\fR default: noai -.ZP -Can be used to ease the preparation of structured program text. -At the beginning of each -.I append , -.I change -or -.I insert -command -or when a new line is -.I opened -or created by an -.I append , -.I change , -.I insert , -or -.I substitute -operation within -.I open -or -.I visual -mode, -.I ex -looks at the line being appended after, -the first line changed -or the line inserted before and calculates the amount of white space -at the start of the line. -It then aligns the cursor at the level of indentation so determined. -.IP -If the user then types lines of text in, -they will continue to be justified at the displayed indenting level. -If more white space is typed at the beginning of a line, -the following line will start aligned with the first non-white character -of the previous line. -To back the cursor up to the preceding tab stop one can hit -\fB^D\fR. -The tab stops going backwards are defined at multiples of the -.I shiftwidth -option. -You -.I cannot -backspace over the indent, -except by sending an end-of-file with a \fB^D\fR. -.IP -Specially processed in this mode is a line with no characters added -to it, which turns into a completely blank line (the white -space provided for the -.I autoindent -is discarded.) -Also specially processed in this mode are lines beginning with -an `\(ua' and immediately followed by a \fB^D\fR. -This causes the input to be repositioned at the beginning of the line, -but retaining the previous indent for the next line. -Similarly, a `0' followed by a \fB^D\fR -repositions at the beginning but without -retaining the previous indent. -.IP -.I Autoindent -doesn't happen in -.I global -commands or when the input is not a terminal. -.LC -\fBautoprint\fR, \fBap\fR default: ap -.ZP -Causes the current line to be printed after each -.I delete , -.I copy , -.I join , -.I move , -.I substitute , -.I t , -.I undo -or -shift command. -This has the same effect as supplying a trailing `p' -to each such command. -.I Autoprint -is suppressed in globals, -and only applies to the last of many commands on a line. -.LC -\fBautowrite\fR, \fBaw\fR default: noaw -.ZP -Causes the contents of the buffer to be written to the current file -if you have modified it and give a -.I next, -.I rewind, -.I stop, -.I tag, -or -.I ! -command, or a \fB^\(ua\fR (switch files) or \fB^]\fR (tag goto) command -in -.I visual. -Note, that the -.I edit -and -.I ex -commands do -.B not -autowrite. -In each case, there is an equivalent way of switching when autowrite -is set to avoid the -.I autowrite -(\fIedit\fR -for -.I next , -.I rewind! -for .I rewind , -.I stop! -for -.I stop , -.I tag! -for -.I tag , -.I shell -for -.I ! , -and -\fB:e\ #\fR and a \fB:ta!\fR command from within -.I visual). -.LC -\fBbeautify\fR, \fBbf\fR default: nobeautify -.ZP -Causes all control characters except tab, newline and form-feed -to be discarded from the input. -A complaint is registered the first time a -backspace character is discarded. -.I Beautify -does not apply to command input. -.LC -\fBdirectory\fR, \fBdir\fR default: dir=/tmp -.ZP -Specifies the directory in which -.I ex -places its buffer file. -If this directory in not -writable, then the editor will exit abruptly when it fails to be -able to create its buffer there. -.LC -\fBedcompatible\fR default: noedcompatible -.ZP -Causes the presence of absence of -.B g -and -.B c -suffixes on substitute commands to be remembered, and to be toggled -by repeating the suffices. The suffix -.B r -makes the substitution be as in the -.I ~ -command, instead of like -.I &. -.LC -\fBerrorbells\fR, \fBeb\fR default: noeb -.ZP -Error messages are preceded by a bell.* -.FS -* Bell ringing in -.I open -and -.I visual -on errors is not suppressed by setting -.I noeb. -.FE -If possible the editor always places the error message in a standout mode of the -terminal (such as inverse video) instead of ringing the bell. -.LC -\fBhardtabs\fR, \fBht\fR default: ht=8 -.ZP -Gives the boundaries on which terminal hardware tabs are set (or -on which the system expands tabs). -.LC -\fBignorecase\fR, \fBic\fR default: noic -.ZP -All upper case characters in the text are mapped to lower case in regular -expression matching. -In addition, all upper case characters in regular expressions are mapped -to lower case except in character class specifications. -.LC -\fBlisp\fR default: nolisp -.ZP -\fIAutoindent\fR indents appropriately for -.I lisp -code, and the \fB( ) { } [[\fR and \fB]]\fR commands in -.I open -and -.I visual -are modified to have meaning for \fIlisp\fR. -.LC -\fBlist\fR default: nolist -.ZP -All printed lines will be displayed (more) unambiguously, -showing tabs and end-of-lines as in the -.I list -command. -.LC -\fBmagic\fR default: magic for \fIex\fR and \fIvi\fR\(dg -.FS -\(dg \fINomagic\fR for \fIedit\fR. -.FE -.ZP -If -.I nomagic -is set, the number of regular expression metacharacters is greatly reduced, -with only `\(ua' and `$' having special effects. -In addition the metacharacters -`~' -and -`&' -of the replacement pattern are treated as normal characters. -All the normal metacharacters may be made -.I magic -when -.I nomagic -is set by preceding them with a `\e'. -.LC -\fBmesg\fR default: mesg -.ZP -Causes write permission to be turned off to the terminal -while you are in visual mode, if -.I nomesg -is set. -.LC -\fBmodeline\fR default: nomodeline -.ZP -If -.I modeline -is set, then the first 5 lines and the last five lines of the file -will be checked for ex command lines and the comands issued. -To be recognized as a command line, the line must have the string -.B ex: -or -.B vi: -preceeded by a tab or a space. This string may be anywhere in the -line and anything after the -.I : -is interpeted as editor commands. This option defaults to off because -of unexpected behavior when editting files such as -.I /etc/passwd. -.LC -\fBnumber, nu\fR default: nonumber -.ZP -Causes all output lines to be printed with their -line numbers. -In addition each input line will be prompted for by supplying the line number -it will have. -.LC -\fBopen\fR default: open -.ZP -If \fInoopen\fR, the commands -.I open -and -.I visual -are not permitted. -This is set for -.I edit -to prevent confusion resulting from accidental entry to -open or visual mode. -.LC -\fBoptimize, opt\fR default: optimize -.ZP -Throughput of text is expedited by setting the terminal -to not do automatic carriage returns -when printing more than one (logical) line of output, -greatly speeding output on terminals without addressable -cursors when text with leading white space is printed. -.LC -\fBparagraphs,\ para\fR default: para=IPLPPPQPP\0LIbp -.ZP -Specifies the paragraphs for the \fB{\fR and \fB}\fR operations in -.I open -and -.I visual. -The pairs of characters in the option's value are the names -of the macros which start paragraphs. -.LC -\fBprompt\fR default: prompt -.ZP -Command mode input is prompted for with a `:'. -.LC -\fBredraw\fR default: noredraw -.ZP -The editor simulates (using great amounts of output), an intelligent -terminal on a dumb terminal (e.g. during insertions in -.I visual -the characters to the right of the cursor position are refreshed -as each input character is typed.) -Useful only at very high speed. -.LC -\fBremap\fP default: remap -.ZP -If on, macros are repeatedly tried until they are unchanged. -For example, if -.B o -is mapped to -.B O , -and -.B O -is mapped to -.B I , -then if -.I remap -is set, -.B o -will map to -.B I , -but if -.I noremap -is set, it will map to -.B O . -.LC -\fBreport\fR default: report=5\(dg -.FS -\(dg 2 for \fIedit\fR. -.FE -.ZP -Specifies a threshold for feedback from commands. -Any command which modifies more than the specified number of lines -will provide feedback as to the scope of its changes. -For commands such as -.I global , -.I open , -.I undo , -and -.I visual -which have potentially more far reaching scope, -the net change in the number of lines in the buffer is -presented at the end of the command, subject to this same threshold. -Thus notification is suppressed during a -.I global -command on the individual commands performed. -.LC -\fBscroll\fR default: scroll=\(12 window -.ZP -Determines the number of logical lines scrolled when an end-of-file -is received from a terminal input in command mode, -and the number of lines printed by a command mode -.I z -command (double the value of -.I scroll ). -.LC -\fBsections\fR default: sections=SHNHH\0HU -.ZP -Specifies the section macros for the \fB[[\fR and \fB]]\fR operations -in -.I open -and -.I visual. -The pairs of characters in the options's value are the names -of the macros which start paragraphs. -.LC -\fBshell\fR, \fBsh\fR default: sh=/bin/sh -.ZP -Gives the path name of the shell forked for -the shell escape command `!', and by the -.I shell -command. -The default is taken from SHELL in the environment, if present. -.LC -\fBshiftwidth\fR, \fBsw\fR default: sw=8 -.ZP -Gives the width a software tab stop, -used in reverse tabbing with \fB^D\fR when using -.I autoindent -to append text, -and by the shift commands. -.LC -\fBshowmatch, sm\fR default: nosm -.ZP -In -.I open -and -.I visual -mode, when a \fB)\fR or \fB}\fR is typed, move the cursor to the matching -\fB(\fR or \fB{\fR for one second if this matching character is on the -screen. Extremely useful with -.I lisp. -.LC -\fBslowopen, slow\fR terminal dependent -.ZP -Affects the display algorithm used in -.I visual -mode, holding off display updating during input of new text to improve -throughput when the terminal in use is both slow and unintelligent. -See -.I "An Introduction to Display Editing with Vi" -for more details. -.LC -\fBtabstop,\ ts\fR default: ts=8 -.ZP -The editor expands tabs in the input file to be on -.I tabstop -boundaries for the purposes of display. -.LC -\fBtaglength,\ tl\fR default: tl=0 -.ZP -Tags are not significant beyond this many characters. -A value of zero (the default) means that all characters are significant. -.LC -\fBtags\fR default: tags=tags /usr/lib/tags -.ZP -A path of files to be used as tag files for the -.I tag -command. -A requested tag is searched for in the specified files, sequentially. -By default, files called -.B tags -are searched for in the current directory and in /usr/lib -(a master file for the entire system). -.LC -\fBterm\fR from environment TERM -.ZP -The terminal type of the output device. -.LC -\fBterse\fR default: noterse -.ZP -Shorter error diagnostics are produced for the experienced user. -.LC -\fBwarn\fR default: warn -.ZP -Warn if there has been `[No write since last change]' before a `!' -command escape. -.LC -\fBwindow\fR default: window=speed dependent -.ZP -The number of lines in a text window in the -.I visual -command. -The default is 8 at slow speeds (600 baud or less), -16 at medium speed (1200 baud), -and the full screen (minus one line) at higher speeds. -.LC -\fBw300,\ w1200\, w9600\fR -.ZP -These are not true options but set -.B window -only if the speed is slow (300), medium (1200), or high (9600), -respectively. -They are suitable for an EXINIT -and make it easy to change the 8/16/full screen rule. -.LC -\fBwrapscan\fR, \fBws\fR default: ws -.ZP -Searches using the regular expressions in addressing -will wrap around past the end of the file. -.LC -\fBwrapmargin\fR, \fBwm\fR default: wm=0 -.ZP -Defines a margin for automatic wrapover of text during input in -.I open -and -.I visual -modes. See -.I "An Introduction to Text Editing with Vi" -for details. -.LC -\fBwriteany\fR, \fBwa\fR default: nowa -.IP -Inhibit the checks normally made before -.I write -commands, allowing a write to any file which the system protection -mechanism will allow. -.NH 1 -Acknowledgements -.PP -Chuck Haley contributed greatly to the early development of -.I ex. -Bruce Englar encouraged the redesign which led to -.I ex -version 1. -Bill Joy wrote versions 1 and 2.0 through 2.7, -and created the framework that users see in the present editor. -Mark Horton added macros and other features and made the -editor work on a large number of terminals and Unix systems. diff --git a/docs/USD.doc/exref/ex.summary b/docs/USD.doc/exref/ex.summary deleted file mode 100644 index 83084a368ed8..000000000000 --- a/docs/USD.doc/exref/ex.summary +++ /dev/null @@ -1,730 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)ex.summary 8.3 (Berkeley) 8/18/96 -.\" -.ds p \v'-0.2'.\v'+0.2' -.ds U \s-2UNIX\s+2 -.ds c \v'-0.2':\v'+0.2' -.nr LL 6.5i -.lt 6.5i -.ll 6.5i -.ds CH -.ds LF Computing Services, U.C. Berkeley -.ds RF April 3, 1979 -.de SP -.sp 1v -.. -.nr PI 3n -.nr PD 0 -.ND -.ps 12 -.ft B -.ce 1 -Ex/Edit Command Summary (Version 2.0) -.sp 1 -.ft R -.nr VS 11 -.nr PS 9 -.2C -.PP -.I Ex -and -.I edit -are text editors, used for creating -and modifying files of text on the \*U -computer system. -.I Edit -is a variant of -.I ex -with features designed to -make it less complicated -to learn and use. -In terms of command syntax and effect -the editors are essentially identical, -and this command summary applies to both. -.PP -The summary is meant as a quick reference -for users already acquainted -with -.I edit -or \fIex\fP. -Fuller explanations of the editors are available -in the documents -.I -Edit: A Tutorial -.R -(a self-teaching introduction) and the -.I -Ex Reference Manual -.R -(the comprehensive reference source for -both \fIedit\fP and \fIex\fP). -Both of these writeups are available in the -Computing Services Library. -.PP -In the examples included with the -summary, commands and text entered by -the user are printed in \fBboldface\fR to -distinguish them from responses printed -by the computer. -.sp 0.45v -.LP -.B -The Editor Buffer -.PP -In order to perform its tasks -the editor sets aside a temporary -work space, -called a \fIbuffer\fR, -separate from the user's permanent -file. -Before starting to work on an existing -file the editor makes a copy of it in the -buffer, leaving the original untouched. -All editing changes are made to the -buffer copy, which must then -be written back to the permanent -file in order to update the -old version. -The buffer disappears -at the end of the editing session. -.sp 0.45v -.LP -.B -Editing: Command and Text Input Modes -.PP -.R -During an editing session there are -two usual modes of operation: -\fIcommand\fP mode and \fItext input\fP -mode. -(This disregards, for the moment, -.I open -and -.I visual -modes, discussed below.) -In command mode, the editor issues a -colon prompt (:) -to show that it is ready to -accept and execute a command. -In text input mode, on the other hand, there is -no prompt and the editor merely accepts text to -be added to the buffer. -Text input mode is initiated by the commands -\fIappend\fP, \fIinsert\fP, and \fIchange\fP, -and is terminated by typing a period as the -first and only character on a line. -.sp 0.45v -.LP -.B -Line Numbers and Command Syntax -.PP -.R -The editor keeps track of lines of text -in the buffer by numbering them consecutively -starting with 1 and renumbering -as lines are added or deleted. -At any given time the editor is positioned -at one of these lines; this position is -called the \fIcurrent line\fP. -Generally, commands that change the -contents of the buffer print the -new current line at the end of their -execution. -.PP -Most commands can be preceded by one or two -line-number addresses which indicate the lines -to be affected. -If one number is given the command operates on -that line only; if two, on an inclusive range -of lines. -Commands that can take line-number prefixes also -assume default prefixes if none are given. -The default assumed by each command is designed -to make it convenient to use in many instances -without any line-number prefix. -For the most part, a command used without a -prefix operates on the current line, -though exceptions to this rule should be noted. -The \fIprint\fP command -by itself, for instance, causes -one line, the current line, to be -printed at the terminal. -.PP -The summary shows the number of line addresses -that can be -prefixed to each command as well as -the defaults assumed if they are omitted. -For example, -.I (.,.) -means that up to 2 line-numbers may be given, -and that if none is given the -command operates on the current line. -(In the address prefix notation, ``.'' stands -for the current line and ``$'' stands for -the last line of the buffer.) -If no such notation appears, no -line-number prefix may be used. -.PP -Some commands take trailing -information; -only -the more important instances of this -are mentioned in the summary. -.sp 0.25v -.LP -.B -Open and Visual Modes -.PP -.R -Besides command and text input modes, -.I ex -and -.I edit -provide on some CRT terminals other modes of editing, -.I open -and -.I visual . -In these modes the cursor can -be moved to individual words -or characters in a line. -The commands then given are very different -from the standard editor commands; most do not appear on the screen when -typed. -.I -An Introduction to Display Editing with Vi -.R -provides a full discussion. -.sp 0.25v -.LP -.B -Special Characters -.PP -.R -.fi -Some characters take on special meanings -when used in context searches -and in patterns given to the \fIsubstitute\fP command. -For \fIedit\fR, these are ``^'' and ``$'', -meaning the beginning and end of a line, -respectively. -.I Ex -has the following additional special characters: -.B -.ce 1 -\&. & * [ ] ~ -.R -To use one of the special characters as its -simple graphic representation -rather than with its special meaning, -precede it by a backslash (\\). -The backslash always has a special meaning. -.1C -.TS -cp10 cp10 cp10 cp10 -ltw(1.0i) lt2w(0.40i)fB ltw(3.0i) ltw(1.8i). -Name Abbr Description Examples -.sp 1.75 -(.)\fBappend a T{ -Begins text input mode, -adding lines to the buffer after -the line specified. Appending continues -until ``.'' is typed alone at the -beginning of a new line, followed by -a carriage return. \fI0a\fR places -lines at the beginning of the buffer. -T} T{ -.nf -\fR:\fBa -Three lines of text -are added to the buffer -after the current line. -\*p -.R -\*c -.fi -T} -.SP -\fR(.,.)\fBchange c T{ -Deletes indicated line(s) and -initiates text input mode to -replace them with new text which follows. -New text is terminated the same way -as with \fIappend\fR. -T} T{ -.nf -:\fB5,6c -Lines 5 and 6 are -deleted and replaced by -these three lines. -\*p -.R -\*c -.fi -T} -.SP -\fR(.,.)\fBcopy \fIaddr co T{ -Places a copy of the specified lines -after the line indicated by \fIaddr\fR. -The example places a copy of lines 8 through -12, inclusive, after line 25. -T} T{ -.nf -\fR:\fB8,12co 25 -\fRLast line copied is printed -\fR\*c -.fi -T} -.SP -\fR(.,.)\fBdelete d T{ -Removes lines from the buffer -and prints the current line after the deletion. -T} T{ -.nf -\fR:\fB13,15d -\fRNew current line is printed -\*c -.fi -T} -.TE -.sp 0.5v -.TS -ltw(1.0i) lt2w(0.40i)fB ltw(3.0i) ltw(1.8i). -T{ -\fBedit \fIfile\fP -.br -\fBedit! \fIfile\fP -T} T{ -e -.br -e! -T} T{ -.fi -\fRClears the editor buffer and then -copies into it the named \fIfile\fR, -which becomes the current file. -This is a way of shifting to a different -file -without leaving the editor. -The editor issues a warning -message if this command is used before -saving changes -made to the file already in the buffer; -using the form \fBe!\fR overrides this protective mechanism. -T} T{ -.nf -\fR:\fBe ch10\fR -No write since last change -:\fBe! ch10\fR -"ch10" 3 lines, 62 characters -\*c -.fi -T} -.SP -\fBfile \fIname\fR f T{ -\fRIf followed by a \fIname\fR, renames -the current file to \fIname\fR. -If used without \fIname\fR, prints -the name of the current file. -T} T{ -.nf -\fR:\fBf ch9 -\fR"ch9" [Modified] 3 lines ... -:\fBf -\fR"ch9" [Modified] 3 lines ... -\*c -.fi -T} -.SP -(1,$)\fBglobal g \fBglobal/\fIpattern\fB/\fIcommands T{ -.nf -:\fBg/nonsense/d -\fR\*c -.fi -T} -\fR(1,$)\fBglobal! g!\fR or \fBv T{ -Searches the entire buffer (unless a smaller -range is specified by line-number prefixes) and -executes \fIcommands\fR on every line with -an expression matching \fIpattern\fR. -The second form, abbreviated -either \fBg!\fR or \fBv\fR, -executes \fIcommands\fR on lines that \fIdo -not\fR contain the expression \fIpattern\fR. -T} \^ -.SP -\fR(.)\fBinsert i T{ -Inserts new lines of text immediately before the specified line. -Differs from -.I append -only in that text is placed before, rather than after, the indicated line. -In other words, \fB1i\fR has the same effect as \fB0a\fR. -T} T{ -.nf -:\fB1i -These lines of text will -be added prior to line 1. -\&. -\fR: -.fi -T} -.SP -\fR(.,.+1)\fBjoin j T{ -Join lines together, adjusting white space (spaces -and tabs) as necessary. -T} T{ -.nf -:\fB2,5j\fR -Resulting line is printed -: -.fi -T} -.TE -.bp -.TS -cp10 cp10 cp10 cp10 -ltw(1.0i) lt2w(0.40i)fB ltw(3.0i) ltw(1.8i). -Name Abbr Description Examples -.sp 1.75 -\fR(.,.)\fBlist l T{ -\fRPrints lines in a more -unambiguous way than the \fIprint\fR -command does. The end of a line, -for example, is marked with a ``$'', -and tabs printed as ``^I''. -T} T{ -.nf -:\fB9l -\fRThis is line 9$ -\*c -.fi -T} -.TE -.sp 0.5v -.TS -ltw(1.0i) lt2w(0.40i)fB ltw(3.0i) ltw(1.8i). -\fR(.,.)\fBmove \fIaddr\fB m T{ -\fRMoves the specified lines -to a position after the line -indicated by \fIaddr\fR. -T} T{ -.nf -\fR:\fB12,15m 25\fR -New current line is printed -\*c -.fi -T} -.SP -\fR(.,.)\fBnumber nu T{ -Prints each line preceded -by its buffer line number. -T} T{ -.nf -\fR:\fBnu -\0\0\fR10\0 This is line 10 -\*c -.fi -T} -.SP -\fR(.)\fBopen o T{ -Too involved to discuss here, -but if you enter open mode -accidentally, press -the \s-2ESC\s0 key followed by -\fBq\fR to -get back into normal editor -command mode. -\fIEdit\fP is designed to -prevent accidental use of -the open command. -T} -.SP -\fBpreserve pre T{ -Saves a copy of the current buffer contents as though the system had -just crashed. This is for use in an emergency when a -.I write -command has failed and you don't know how else to save your work.\(dg -T} T{ -.nf -:\fBpreserve\fR -File preserved. -: -.fi -T} -.SP -\fR(.,.)\fBprint p Prints the text of line(s). T{ -.nf -:\fB+2,+3p\fR -The second and third lines -after the current line -: -.fi -T} -.TE -.FS -.ll 6.5i -\(dg You should seek assistance from a system administrator as soon as -possible after saving a file with the -.I preserve -command, because the preserved copy of the file is saved in a -directory used to store temporary files, and thus, the preserved -copy may only be available for a short period of time. -.FE -.SP -.nf -.TS -ltw(1.0i) lt2w(0.40i)fB ltw(3.0i) ltw(1.8i). -T{ -.nf -\fBquit -quit! -.fi -T} T{ -.nf -q -q! -T} T{ -.fi -\fREnds the editing session. -You will receive a -warning if you have changed the buffer -since last writing its contents -to the file. In this event you -must either type \fBw\fR to write, -or type \fBq!\fR to exit from -the editor without saving your changes. -T} T{ -.nf -\fR:\fBq -\fRNo write since last change -:\fBq! -\fR% -.fi -T} -.SP -\fR(.)\fBread \fIfile\fP r T{ -.fi -\fRPlaces a copy of \fIfile\fR in the -buffer after the specified line. -Address 0 is permissible and causes -the copy of \fIfile\fR to be placed -at the beginning of the buffer. -The \fIread\fP command does not -erase any text already in the buffer. -If no line number is specified, -\fIfile\fR is placed after the -current line. -T} T{ -.nf -\fR:\fB0r newfile -\fR"newfile" 5 lines, 86 characters -\*c -.fi -T} -.SP -\fBrecover \fIfile\fP rec T{ -.fi -Retrieves a copy of the editor buffer -after a system crash, editor crash, -phone line disconnection, or -\fIpreserve\fR command. -T} -.SP -\fR(.,.)\fBsubstitute s T{ -.nf -\fBsubstitute/\fIpattern\fB/\fIreplacement\fB/ -substitute/\fIpattern\fB/\fIreplacement\fB/gc -.fi -\fRReplaces the first occurrence of \fIpattern\fR -on a line -with \fIreplacement\fP. -Including a \fBg\fR after the command -changes all occurrences of \fIpattern\fP -on the line. -The \fBc\fR option allows the user to -confirm each substitution before it is -made; see the manual for details. -T} T{ -.nf -:\fB3p -\fRLine 3 contains a misstake -:\fBs/misstake/mistake/ -\fRLine 3 contains a mistake -\*c -.fi -T} -.TE -.bp -.TS -cp10 cp10 cp10 cp10 -ltw(1.0i) lt2w(0.40i)fB ltw(3.0i) ltw(1.8i). -Name Abbr Description Examples -.sp 1.75 -\fBundo u T{ -.fi -\fRReverses the changes made in -the buffer by the last buffer-editing -command. -Note that this example contains -a notification about the number of -lines affected. -T} T{ -.nf -\fR:\fB1,15d -\fR15 lines deleted -new line number 1 is printed -:\fBu -\fR15 more lines in file ... -old line number 1 is printed -\*c -.fi -T} -.SP -\fR(1,$)\fBwrite \fIfile\fR w T{ -.fi -\fRCopies data from the buffer onto -a permanent file. If no \fIfile\fR -is named, the current filename -is used. -The file is automatically created -if it does not yet exist. -A response containing the number of -lines and characters in the file -indicates that the write -has been completed successfully. -The editor's built-in protections -against overwriting existing files -will in some circumstances -inhibit a write. -The form \fBw!\fR forces the -write, confirming that -an existing file is to be overwritten. -T} T{ -.nf -\fR:\fBw -\fR"file7" 64 lines, 1122 characters -:\fBw file8 -\fR"file8" File exists ... -:\fBw! file8 -\fR"file8" 64 lines, 1122 characters -\*c -.fi -T} -\fR(1,$)\fBwrite! \fIfile\fP w! \^ \^ -.TE -.sp 0.5v -.TS -ltw(1.0i) lt2w(0.40i)fB ltw(3.0i) ltw(1.8i). -\fR(.)\fBz \fIcount\fP z T{ -.fi -\fRPrints a screen full of text starting -with the line indicated; -or, if \fIcount\fR is specified, -prints that number of lines. -Variants of the \fIz\fR command -are described in the manual. -T} -.SP -\fB!\fIcommand T{ -.fi -Executes the remainder of the line -after \fB!\fR as a \*U command. -The buffer is unchanged by this, and -control is returned to the editor when -the execution of \fIcommand\fR is complete. -T} T{ -.nf -\fR:\fB!date -\fRFri Jun 9 12:15:11 PDT 1978 -! -\*c -.fi -T} -.SP -\fRcontrol-d T{ -.fi -Prints the next \fIscroll\fR of text, -normally half of a screen. See the -manual for details of the \fIscroll\fR -option. -T} -.SP -\fR(.+1) T{ -.fi -An address alone followed by a carriage -return causes the line to be printed. -A carriage return by itself prints the -line following the current line. -T} T{ -.nf -:\fR -the line after the current line -\*c -.fi -T} -.TE -.sp 0.5v -.TS -ltw(1.0i) lt2w(0.40i)fB ltw(3.0i) ltw(1.8i). -\fB/\fIpattern\fB/ T{ -.fi -\fRSearches for the next line in which -\fIpattern\fR occurs and prints it. -T} T{ -.nf -\fR:\fB/This pattern/ -\fRThis pattern next occurs here. -\*c -.fi -T} -.SP -\fB// T{ -Repeats the most recent search. -T} T{ -.nf -\fR:\fB// -\fRThis pattern also occurs here. -\*c -.fi -T} -.SP -\fB?\fIpattern\fB? T{ -Searches in the reverse direction -for \fIpattern\fP. -T} -.SP -\fB?? T{ -Repeats the most recent search, -moving in the reverse direction -through the buffer. -T} -.TE diff --git a/docs/USD.doc/vi.man/spell.ok b/docs/USD.doc/vi.man/spell.ok deleted file mode 100644 index 80ebcaba829d..000000000000 --- a/docs/USD.doc/vi.man/spell.ok +++ /dev/null @@ -1,179 +0,0 @@ -Ar -Bostic -CDPATH -COLUMNSXX -Cscope -Ds -EXINIT -Ee -Ev -Fa -Ff -Fl -HUnhsh -IPLPPPQPP -LIpplpipbp -Li -Lite -NEXINIT -NHSHH -Nex -Nn -POSIX -Pp -QQ -SIGWINCHXX -Std -Sy -TMPDIR -Tt -USD -Unmap -VI -Vi -XXXX -ZZ -ags -ai -altwerase -ap -autoindent -autoprint -autowrite -aw -bf -bigwords -cd -cdpath -cedit -cmd -co -creens -cs -ctags -db -dbopen -dd -di -dir -dit -doc -docs -eFRrsv -eFRrv -eFlRrv -ead -eb -edcompatible -egrep -elete -errorbells -esc -exrc -exu -fg -filec -hange -hardtabs -ht -ic -iclower -ignorecase -ile -ind -ious -ist -ize -keytime -leftright -lhs -li -libc -lobal -lp -matchtime -mber -mesg -mk -modeful -modeline -modelines -nex -nexrc -nk -nonblank -nooption -noprint -nsert -nul -nvi -oin -onnections -ove -ppend -prev -pu -readonly -rec -recdir -redist -rhs -rint -rk -ro -rsion -sccs -scr -se -searchincr -sh -shareware -shellmeta -shiftwidth -showmatch -showmode -sidescroll -slowopen -sm -smd -sourceany -su -sual -sw -ta -tabstop -taglength -tagn -tagp -tagstring -th's -tildeop -tl -tmp -tr -ts -ttytype -ttywerase -ubstitute -uffers -uit -unm -urce -var -ve -vi -viu -wa -wi -windowname -wl -wm -wn -wq -wraplen -wrapmargin -wrapscan -writeany -ws -ya -yy diff --git a/docs/USD.doc/vi.ref/Makefile b/docs/USD.doc/vi.ref/Makefile deleted file mode 100644 index 0e1b6343350d..000000000000 --- a/docs/USD.doc/vi.ref/Makefile +++ /dev/null @@ -1,32 +0,0 @@ -# @(#)Makefile 8.20 (Berkeley) 8/18/96 - -MACROS= -me -ROFF= groff -TBL= tbl - -all: vi.ref.txt vi.ref.ps - -vi.ref.txt: vi.ref index.so - soelim vi.ref | ${TBL} | groff ${MACROS} -Tascii > $@ - rm -f index - chmod 444 $@ - -vi.ref.ps: vi.ref index.so - soelim vi.ref | ${TBL} | ${ROFF} ${MACROS} > $@ - rm -f index - chmod 444 $@ - -index.so: vi.ref - # Build index.so, side-effect of building the paper. - soelim vi.ref | ${TBL} | ${ROFF} ${MACROS} > /dev/null - sed -e 's/MINUSSIGN/\\-/' \ - -e 's/DOUBLEQUOTE/""/' \ - -e "s/SQUOTE/'/" \ - -e 's/ /__SPACE/g' < index | \ - sort -u '-t ' +0 -1 +1n | awk -f merge.awk | \ - sed -e 's/__SPACE/ /g' > $@ - rm -f index - chmod 444 $@ - -clean: - rm -f vi.ref.ps vi.ref.txt index index.so diff --git a/docs/USD.doc/vi.ref/ex.cmd.roff b/docs/USD.doc/vi.ref/ex.cmd.roff deleted file mode 100644 index 382e635a6fdd..000000000000 --- a/docs/USD.doc/vi.ref/ex.cmd.roff +++ /dev/null @@ -1,1924 +0,0 @@ -.\" Copyright (c) 1994 -.\" The Regents of the University of California. All rights reserved. -.\" Copyright (c) 1994, 1995, 1996 -.\" Keith Bostic. All rights reserved. -.\" -.\" See the LICENSE file for redistribution information. -.\" -.\" @(#)ex.cmd.roff 8.41 (Berkeley) 8/17/96 -.\" -.SH 1 "Ex Description" -.pp -The following words have special meanings for -.CO ex -commands. -.KY "" -.IP "" -The end-of-file character is used to scroll the screen in the -.CO ex -editor. -This character is normally -.LI . -However, whatever character is set for the current terminal is supported -as well as -.LI . -.KY "line" -.IP "line" -A single-line address, given in any of the forms described in the -section entitled -.QB "Ex Addressing" . -The default for -.LI line -is the current line. -.KY "range" -.IP "range" -A line, or a pair of line addresses, separated by a comma or semicolon. -(See the section entitled -.QB "Ex Addressing" -for more information.) -The default for range is the current line -.i only , -i.e. -.QT \&.,. . -A percent sign -.PQ % -stands for the range -.QT 1,$ . -The starting address must be less than, or equal to, the ending address. -.KY "count" -.IP "count" -A positive integer, specifying the number of lines to be affected by -the command; the default is 1. -Generally, a count past the end-of-file may be specified, e.g. the -command -.QT "p 3000" -in a 10 line file is acceptable, and will print from the current line -through the last line in the file. -.KY "flags" -.IP "flags" -One or more of the characters -.QQ # , -.QQ p , -and -.QQ l . -When a command that accepts these flags completes, the addressed line(s) -are written out as if by the corresponding -.CO # , -.CO l -or -.CO p -commands. -In addition, any number of -.QT + -or -.QT \- -characters can be specified before, after, or during the flags, in which -case the line written is not necessarily the one affected by the command, -but rather the line addressed by the offset address specified. -The default for -.LI flags -is none. -.KY "file" -.IP "file" -A pattern used to derive a pathname; the default is the current file. -File names are subjected to normal -.XR sh 1 -word expansions. -.pp -Anywhere a file name is specified, it is also possible to use -the special string -.QT /tmp . -This will be replaced with a temporary file name which can be used -for temporary work, e.g. -.QT ":e /tmp" -creates and edits a new file. -.pp -If both a count and a range are specified for commands that use either, -the starting line for the command is the -.i last -line addressed by the range, and -.LI count - 1 -subsequent lines are affected by the command, e.g. the command -.QT 2,3p4 -prints out lines 3, 4, 5 and 6. -.pp -When only a line or range is specified, with no command, the implied -command is either a -.CO list , -.CO number -or -.CO print -command. -The command used is the most recent of the three commands to have been -used (including any use as a flag). -If none of these commands have been used before, the -.CO print -command is the implied command. -When no range or count is specified and the command line is a blank line, -the current line is incremented by 1 and then the current line is displayed. -.pp -Zero or more whitespace characters may precede or follow the addresses, -count, flags, or command name. -Any object following a command name (such as buffer, file, etc.), -that begins with an alphabetic character, -should be separated from the command name by at least one whitespace -character. -.pp -Any character, including -.LI , -.QT % -and -.QT # -retain their literal value when preceded by a backslash. -.SH 1 "Ex Commands" -.pp -The following section describes the commands available in the -.CO ex -editor. -In each entry below, the tag line is a usage synopsis for the command. -.pp -Each command can be entered as the abbreviation -(those characters in the synopsis command word preceding the -.QQ [ -character), -the full command (all characters shown for the command word, -omitting the -.QQ [ -and -.QQ ] -characters), -or any leading subset of the full command down to the abbreviation. -For example, the args command (shown as -.QT ar[gs] -in the synopsis) -can be entered as -.QT ar , -.QT arg -or -.QT args . -.pp -Each -.CO ex -command described below notes the new current line after it -is executed, as well as any options that affect the command. -.\" I cannot get a double quote to print to save my life. The ONLY way -.\" I've been able to get this to work is with the .tr command. -.tr Q" -.ds ms Q -.KY DOUBLEQUOTE -.IP "\*(ms" -.tr QQ -A comment. -Command lines beginning with the double-quote character -.PQ """" -are ignored. -This permits comments in editor scripts and startup files. -.KY "" -.KY "" -.IP "" -.IP "" -Scroll the screen. -Write the next N lines, where N is the value of the -.OP scroll -option. -The command is the end-of-file terminal character, which may be -different on different terminals. -Traditionally, it is the -.LI -key. -.sp -Historically, the -.CO eof -command ignored any preceding count, and the -.LI -character was ignored unless it was entered as the first character -of the command. -This implementation treats it as a command -.i only -if entered as the first character of the command line, and otherwise -treats it as any other character. -.SS -.SP Line: -Set to the last line written. -.SP Options: -Affected by the -.OP scroll -option. -.SE -.KY "!" -.IP "! argument(s)" -.Ip "[range]! argument(s)" -Execute a shell command, or filter lines through a shell command. -In the first synopsis, the remainder of the line after the -.QT ! -character is passed to the program named by the -.OP shell -option, as a single argument. -.sp -Within the rest of the line, -.QT % -and -.QT # -are expanded into the current and alternate pathnames, respectively. -The character -.QT ! -is expanded with the command text of the previous -.CO ! -command. -(Therefore, the command -.CO !! -repeats the previous -.CO ! -command.) -The special meanings of -.QT % , -.QT # , -and -.QT ! -can be overridden by escaping them with a backslash. -If no -.CO ! -or -.CO :! -command has yet been executed, it is an error to use an unescaped -.QT ! -character. -The -.CO ! -command does -.i not -do shell expansion on the strings provided as arguments. -If any of the above expansions change the command the user entered, -the command is redisplayed at the bottom of the screen. -.sp -.CO Ex -then executes the program named by the -.OP shell -option, with a -.b \-c -flag followed by the arguments (which are bundled into a single argument). -.sp -The -.CO ! -command is permitted in an empty file. -.sp -If the file has been modified since it was last completely written, -the -.Co ! -command will warn you. -.sp -A single -.QT ! -character is displayed when the command completes. -.sp -In the second form of the -.CO ! -command, the remainder of the line after the -.QT ! -is passed to the program named by the -.OP shell -option, as described above. -The specified lines are passed to the program as standard input, -and the standard and standard error output of the program replace -the original lines. -.SS -.SP Line: -Unchanged if no range was specified, otherwise set to the first -line of the range. -.SP Options: -Affected by the -.OP shell -and -.OP warn -options. -.SE -.KY "#" -.IP "[range] # [count] [flags]" -.KY "number" -.Ip "[range] nu[mber] [count] [flags]" -Display the selected lines, each preceded with its line number. -.sp -The line number format is -.QQ %6d , -followed by two spaces. -.SS -.SP Line: -Set to the last line displayed. -.SP Options: -Affected by the -.OP list -option. -.SE -.KY "@" -.IP "@ buffer" -.KY "*" -.Ip "* buffer" -Execute a buffer. -Each line in the named buffer is executed as an -.CO ex -command. -If no buffer is specified, or if the specified buffer is -.QT @ -or -.QT * , -the last buffer executed is used. -.KY < -.IP "[range] <[< ...] [count] [flags]" -Shift lines left or right. -The specified lines are shifted to the left (for the -.CO < -command) or right (for the -.CO > -command), by the number of columns specified by the -.OP shiftwidth -option. -Only leading whitespace characters are deleted when shifting left; -once the first column of the line contains a nonblank character, -the -.CO shift -command will succeed, but the line will not be modified. -.sp -If the command character -.CO < -or -.CO > -is repeated more than once, the command is repeated once for each -additional command character. -.SS -.SP Line: -If the current line is set to one of the lines that are affected -by the command, it is unchanged. -Otherwise, it is set to the first nonblank character of the lowest -numbered line shifted. -.SP Options: -Affected by the -.OP shiftwidth -option. -.SE -.KY = -.IP "[line] = [flags]" -Display the line number of -.LI line -(which defaults to the last line in the file). -.SS -.SP Line: -Unchanged. -.SP Options: -None. -.SE -.KY > -.IP "[range] >[> ...] [count] [flags]" -Shift right. -The specified lines are shifted to the right by the number of columns -specified by the -.OP shiftwidth -option, by inserting tab and space characters. -Empty lines are not changed. -.sp -If the command character -.QT > -is repeated more than once, the command is repeated once for each -additional command character. -.SS -.SP Line: -Set to the last line modified by the command. -.SP Options: -Affected by the -.OP shiftwidth -option. -.SE -.KY abbrev -.IP "ab[brev] lhs rhs" -Add an abbreviation to the current abbreviation list. -When inserting text in -.CO vi , -each time a non-word character is entered after a word character, -a set of characters ending at the word character are checked for -a match with -.LI lhs . -If a match is found, they are replaced with -.LI rhs . -The set of characters that are checked for a match are defined as follows, -for inexplicable historical reasons. -If only one or two characters were entered before the non-word character -that triggered the check, -and after the beginning of the insertion, -or the beginning of the line or the file, -or the last -.LI -character that was entered, -then the one or the both characters are checked for a match. -Otherwise, the set includes both characters, -as well as the characters that precede them that are the same word -class (i.e. word or non-word) as the -.b second -to last character entered before the non-word character that triggered -the check, -back to the first -.LI character, -the beginning of the insertion, -or the beginning of the line or the file. -.sp -For example, the abbreviations: -.sp -.ne 3v -.ft C -.TS -r l l. -:abbreviate abc ABC -:abbreviate #i #include -:abbreviate /*#i /*#include -.TE -.ft R -will all work, while the abbreviations: -.sp -.ne 2v -.ft C -.TS -r l l. -:abbreviate a#i A#include -:abbreviate /* /******************** -.TE -.ft R -will not work, and are not permitted by -.CO nvi . -.sp -To keep the abbreviation expansion from happening, -the character immediately following the -.LI lhs -characters should be quoted with a -.LI -character. -.sp -The replacement -.LI rhs -is itself subject to both further abbreviation expansion and further -map expansion. -.SS -.SP Line: -Unchanged. -.SP Options: -None. -.SE -.KY append -.IP "[line] a[ppend][!]" -The input text is appended to the specified line. -If line 0 is specified, the text is inserted at the beginning of the file. -Set to the last line input. -If no lines are input, then set to -.LI line , -or to the first line of the file if a -.LI line -of 0 was specified. -Following the command name with a -.QT ! -character causes the -.OP autoindent -option to be toggled for the duration of the command. -.SS -.SP Line: -Unchanged. -.SP Options: -Affected by the -.OP autoindent -and -.OP number -options. -.SE -.KY args -.IP "ar[gs]" -Display the argument list. -The current argument is displayed inside of -.QT [ -and -.QT ] -characters. -The argument list is the list of operands specified on startup, -which can be replaced using the -.CO next -command. -.SS -.SP Line: -Unchanged. -.SP Options: -None. -.SE -.KY bg -.IP bg -.CO Vi -mode only. -Background the current screen. -The screen is unchanged, -but is no longer accessible and disappears from the display. -Use the -.CO fg -command to bring the screen back to the display foreground. -.SS -.SP Line: -Set to the current line when the screen was last edited. -.SP Options: -None. -.SE -.KY change -.IP "[range] c[hange][!] [count]" -Replace the lines with input text. -Following the command name with a -.QT ! -character causes the -.OP autoindent -option to be toggled for the duration of the command. -.SS -.SP Line: -Set to the last line input, or, if no lines were input, -set to the line before the target line, or to the first -line of the file if there are no lines preceding the target line. -.SP Options: -Affected by the -.OP autoindent -and -.OP number -options. -.SE -.KY cd -.KY chdir -.IP "chd[ir][!] [directory]" -.Ip "cd[!] [directory]" -Change the current working directory. -The -.LI directory -argument is subjected to -.XR sh 1 -word expansions. -When invoked with no directory argument and the -.LI HOME -environment variable is set, the directory named by the -.LI HOME -environment variable becomes the new current directory. -Otherwise, the new current directory becomes the directory returned -by the -.XR getpwent 3 -routine. -.sp -The -.CO chdir -command will fail if the file has been modified since the last complete -write of the file. -You can override this check by appending a -.QT ! -character to the command. -.SS -.SP Line: -Unchanged. -.SP Options: -Affected by the -.OP cdpath -option. -.SE -.KY copy -.KY t -.IP "[range] co[py] line [flags]" -.Ip "[range] t line [flags]" -Copy the specified lines (range) after the destination line. -Line 0 may be specified to insert the lines at the beginning of -the file. -.SS -.SP Line: -Unchanged. -.SP Options: -None. -.SE -.KY cscope -.IP "cs[cope] command [args]" -Execute a -.CO cscope -command. -For more information, see the section of the reference manual entitled -.QB "Tags, Tag Stacks, and Cscope" . -.KY delete -.IP "[range] d[elete] [buffer] [count] [flags]" -Delete the lines from the file. -The deleted text is saved in the specified buffer, or, if no buffer -is specified, in the unnamed buffer. -If the command name is followed by a letter that could be interpreted -as either a buffer name or a flag value (because neither a -.LI count -or -.LI flags -values were given), -.CO ex -treats the letter as a -.LI flags -value if the letter immediately follows the command name, -without any whitespace separation. -If the letter is preceded by whitespace characters, -it treats it as a buffer name. -.SS -.SP Line: -Set to the line following the deleted lines, -or to the last line if the deleted lines were at the end. -.SP Options: -None. -.SE -.KY display -.IP "di[splay] b[uffers] | c[onnections] | s[creens] | t[ags]" -Display buffers, -.CO cscope -connections, screens or tags. -The -.CO display -command takes one of three additional arguments, which are as follows: -.SS -.SP b[uffers] -Display all buffers (including named, unnamed, and numeric) -that contain text. -.SP c[onnections] -Display the source directories for all attached -.CO cscope -databases. -.SP s[creens] -Display the file names of all background screens. -.SP t[ags] -Display the tags stack. -.SE -.SS -.SP Line: -Unchanged. -.SP Options: -None. -.SE -.KY edit -.IP "e[dit][!] [+cmd] [file]" -.Ip "ex[!] [+cmd] [file]" -Edit a different file. -If the current buffer has been modified since the last complete write, -the command will fail. -You can override this by appending a -.QT ! -character to the command name. -.sp -If the -.QT +cmd -option is specified, that -.CO ex -command will be executed in the new file. -Any -.CO ex -command may be used, although the most common use of this feature is -to specify a line number or search pattern to set the initial location -in the new file. -.sp -Capitalizing the first letter of the command, i.e. -.CO Edit -or -.CO Ex , -while in -.CO vi -mode, will edit the file in a new screen. -In this case, any modifications to the current file are ignored. -.SS -.SP Line: -If you have previously edited the file, the current line will be set -to your last position in the file. -If that position does not exist, or you have not previously edited the -file, the current line will be set to the first line of the file if -you are in -.CO vi -mode, and the last line of the file if you are in -.CO ex . -.SP Options: -None. -.SE -.KY exusage -.IP "exu[sage] [command]" -Display usage for an -.CO ex -command. -If -.LI command -is specified, a usage statement for that command is displayed. -Otherwise, usage statements for all -.CO ex -commands are displayed. -.SS -.SP Line: -Unchanged. -.SP Options: -None. -.SE -.KY file -.IP "f[ile] [file]" -Display and optionally change the file name. -If a file name is specified, the current pathname is changed to the -specified name. -The current pathname, the number of lines, and the current position -in the file are displayed. -.SS -.SP Line: -Unchanged. -.SP Options: -None. -.SE -.KY fg -.IP "fg [name]" -.CO Vi -mode only. -Foreground the specified screen. -If the argument name doesn't exactly match the name of a file displayed -by a background screen, -it is compared against the last component of each of the file names. -If no background screen is specified, -the first background screen is foregrounded. -.sp -By default, -foregrounding causes the current screen to be swapped with the backgrounded -screen. -Capitalizing the first letter of the command, i.e. -.CO Fg , -will foreground the backgrounded screen in a new screen instead of -swapping it with the current screen. -.SS -.SP Line: -Set to the current line when the screen was last edited. -.SP Options: -None. -.SE -.KY global -.IP "[range] g[lobal] /pattern/ [commands]" -.KY v -.Ip "[range] v /pattern/ [commands]" -Apply commands to lines matching (or not matching) a pattern. -The lines within the given range that match -.PQ g[lobal] , -or do not match -.PQ v -the given pattern are selected. -Then, the specified -.CO ex -command(s) are executed with the current line -.PQ \&. -set to each selected line. -If no range is specified, the entire file is searched for matching, -or not matching, lines. -.sp -Multiple commands can be specified, one per line, by escaping each -.LI -character with a backslash, or by separating commands with a -.QT | -character. -If no commands are specified, the command defaults to the -.CO print -command. -.sp -For the -.CO append , -.CO change -and -.CO insert -commands, the input text must be part of the global command line. -In this case, the terminating period can be omitted if it ends the commands. -.sp -The -.CO visual -command may also be specified as one of the -.CO ex -commands. -In this mode, input is taken from the terminal. -Entering a -.CO Q -command in -.CO vi -mode causes the next line matching the pattern to be selected and -.CO vi -to be reentered, until the list is exhausted. -.sp -The -.CO global , -.CO v -and -.CO undo -commands cannot be used as part of these commands. -.sp -The editor options -.OP autoindent , -.OP autoprint -and -.OP report -are turned off for the duration of the -.CO global -and -.CO v -commands. -.SS -.SP Line: -The last line modified. -.SP Options: -Affected by the -.OP ignorecase -and -.OP magic -options. -Turns off the -.OP autoindent , -.OP autoprint -and -.OP report -options. -.SE -.KY help -.IP "he[lp]" -Display a help message. -.SS -.SP Line: -Unchanged. -.SP Options: -None. -.SE -.KY insert -.IP "[line] i[nsert][!]" -The input text is inserted before the specified line. -Following the command name with a -.QT ! -character causes the -.OP autoindent -option setting to be toggled for the duration of this command. -.SS -.SP Line: -Set to the last line input; if no lines were input, -set to the line before the target line, or to the first line -of the file if there are no lines preceding the target line. -Affected by the -.OP autoindent -and -.OP number -options. -.SE -.KY join -.IP "[range] j[oin][!] [count] [flags]" -Join lines of text together. -.sp -A -.LI count -specified to the -.Sy join -command specifies that the last line of the -.LI range -plus -.LI count -subsequent lines will be joined. -(Note, this differs by one from the general rule where only -.LI count - 1 -subsequent lines are affected.) -.sp -If the current line ends with a whitespace character, all whitespace -is stripped from the next line. -Otherwise, if the next line starts with a open parenthesis -.PQ ( , -do nothing. -Otherwise, if the current line ends with a question mark -.PQ ? , -period -.PQ \&. -or exclamation point -.PQ ! , -insert two spaces. -Otherwise, insert a single space. -.sp -Appending a -.QT ! -character to the command name causes a simpler join with no -white-space processing. -.SS -.SP Line: -Unchanged. -.SP Options: -None. -.SE -.KY list -.IP "[range] l[ist] [count] [flags]" -Display the lines unambiguously. -Tabs are displayed as -.QT ^I , -and the end of the line is marked with a -.QT $ -character. -.SS -.SP Line: -Set to the last line displayed. -.SP Options: -Affected by the -.OP number -option. -.SE -.KY map -.IP "map[!] [lhs rhs]" -Define or display maps (for -.CO vi -only). -.sp -If -.QT lhs -and -.QT rhs -are not specified, the current set of command mode maps are displayed. -If a -.QT ! -character is appended to to the command, -the text input mode maps are displayed. -.sp -Otherwise, when the -.QT lhs -character sequence is entered in -.CO vi , -the action is as if the corresponding -.QT rhs -had been entered. -If a -.QT ! -character is appended to the command name, -the mapping is effective during text input mode, -otherwise, it is effective during command mode. -This allows -.QT lhs -to have two different macro definitions at the same time: one for command -mode and one for input mode. -.sp -Whitespace characters require escaping with a -.LI -character to be entered in the -.LI lhs -string in visual mode. -.sp -Normally, keys in the -.LI rhs -string are remapped (see the -.OP remap -option), -and it is possible to create infinite loops. -However, keys which map to themselves are not further remapped, -regardless of the setting of the -.OP remap -option. -For example, the command -.QT ":map n nz." -maps the -.QT n -key to the -.CO n -and -.CO z -commands. -.sp -To exit an infinitely looping map, use the terminal -.LI -character. -.SS -.SP Line: -Unchanged. -.SP Options: -Affected by the -.OP remap -option. -.SE -.KY mark -.KY k -.IP "[line] ma[rk] " -.Ip "[line] k " -Mark the line with the mark -.LI . -The expressions -.QT ' -and -.QT ` -can then be used as an address in any command that uses one. -.SS -.SP Line: -Unchanged. -.SP Options: -None. -.SE -.KY move -.IP "[range] m[ove] line" -Move the specified lines after the target line. -A target line of 0 places the lines at the beginning of the file. -.SS -.SP Line: -Set to the first of the moved lines. -.SP Options: -None. -.SE -.KY mkexrc -.IP "mk[exrc][!] file" -Write the abbreviations, editor options and maps to the specified -file. -Information is written in a form which can later be read back in -using the -.CO ex -.CO source -command. -If -.LI file -already exists, the -.CO mkexrc -command will fail. -This check can be overridden by appending a -.QT ! -character to the command. -.SS -.SP Line: -Unchanged. -.SP Options: -None. -.SE -.KY next -.IP "n[ext][!] [file ...]" -Edit the next file from the argument list. -The -.CO next -command will fail if the file has been modified since the last complete -write. -This check can be overridden by appending the -.QT ! -character to the command name. -The argument list can optionally be replaced by specifying a new one -as arguments to this command. -In this case, editing starts with the first file on the new list. -.sp -Capitalizing the first letter of the command, i.e. -.CO Next , -while in -.CO vi -mode, will set the argument list and edit the file in a new screen. -In this case, any modifications to the current file are ignored. -.SS -.SP Line: -Set as described for the -.CO edit -command. -.SP Options: -Affected by the options -.OP autowrite -and -.OP writeany . -.SE -.KY open -.IP "[line] o[pen] /pattern/ [flags]" -Enter open mode. -Open mode is the same as being in -.CO vi , -but with a one-line window. -All the standard -.CO vi -commands are available. -If a match is found for the optional RE argument, -the cursor is set to the start of the matching pattern. -.sp -.i "This command is not yet implemented." -.SS -.SP Line: -Unchanged, unless the optional RE is specified, in which case it is -set to the line where the matching pattern is found. -.SP Options: -Affected by the -.OP open -option. -.SE -.KY preserve -.IP "pre[serve]" -Save the file in a form that can later be recovered using the -.CO ex -.b \-r -option. -When the file is preserved, an email message is sent to the user. -.SS -.SP Line: -Unchanged. -.SP Options: -None. -.SE -.KY previous -.IP "prev[ious][!]" -Edit the previous file from the argument list. -The -.CO previous -command will fail if the file has been modified since the last complete -write. -This check can be overridden by appending the -.QT ! -character to the command name. -.sp -Capitalizing the first letter of the command, i.e. -.CO Previous , -while in -.CO vi -mode, will edit the file in a new screen. -In this case, any modifications to the current file are ignored. -.SS -.SP Line: -Set as described for the -.CO edit -command. -.SP Options: -Affected by the options -.OP autowrite -and -.OP writeany . -None. -.SE -.KY print -.IP "[range] p[rint] [count] [flags]" -Display the specified lines. -.SS -.SP Line: -Set to the last line displayed. -.SP Options: -Affected by the -.OP list -and -.OP number -option. -.SE -.KY put -.IP "[line] pu[t] [buffer]" -Append buffer contents to the current line. -If a buffer is specified, its contents are appended to the line, -otherwise, the contents of the unnamed buffer are used. -.SS -.SP Line: -Set to the line after the current line. -.SP Options: -None. -.SE -.KY quit -.IP "q[uit][!]" -End the editing session. -If the file has been modified since the last complete write, the -.CO quit -command will fail. -This check may be overridden by appending a -.QT ! -character to the command. -.sp -If there are more files to edit, the -.CO quit -command will fail. -Appending a -.QT ! -character to the command name or entering two -.CO quit -commands (i.e. -.CO wq , -.CO quit , -.CO xit -or -.CO ZZ ) -in a row) will override this check and the editor will exit. -.SS -.SP Line: -Unchanged. -.SP Options: -None. -.SE -.KY read -.IP "[line] r[ead][!] [file]" -Read a file. -A copy of the specified file is appended to the line. -If -.LI line -is 0, the copy is inserted at the beginning of the file. -If no file is specified, the current file is read; if there is no -current file, then -.LI file -becomes the current file. -If there is no current file and no -.LI file -is specified, then the -.CO read -command will fail. -.sp -If -.LI file -is preceded by a -.QT ! -character, -.LI file -is treated as if it were a shell command, and passed to the program -named by the -.OP shell -edit option. -The standard and standard error outputs of that command are read into -the file after the specified line. -The special meaning of the -.QT ! -character can be overridden by escaping it with a backslash -.PQ \e -character. -.SS -.SP Line: -When executed from -.CO ex , -the current line is set to the last line read. -When executed from -.CO vi , -the current line is set to the first line read. -.SP Options: -None. -.SE -.KY recover -.IP "rec[over] file" -Recover -.LI file -if it was previously saved. -If no saved file by that name exists, the -.CO recover -command behaves equivalently to the -.CO edit -command. -.SS -.SP Line: -Set as described for the -.CO edit -command. -.SP Options: -None. -.SE -.KY resize -.IP "res[ize] [+|-]size" -.CO Vi -mode only. -Grow or shrink the current screen. -If -.LI size -is a positive, signed number, the current screen is grown by that many lines. -If -.LI size -is a negative, signed number, the current screen is shrunk by that many lines. -If -.LI size -is not signed, the current screen is set to the specified -.LI size . -Applicable only to split screens. -.SS -.SP Line: -Unchanged. -.SP Options: -None. -.SE -.KY rewind -.IP "rew[ind][!]" -Rewind the argument list. -If the current file has been modified since the last complete write, -the -.CO rewind -command will fail. -This check may be overridden by appending the -.QT ! -character to the command. -.sp -Otherwise, the current file is set to the first file in the argument -list. -.SS -.SP Line: -Set as described for the -.CO edit -command. -.SP Options: -Affected by the -.OP autowrite -and -.OP writeany -options. -.SE -.KY set -.IP "se[t] [option[=[value]] ...] [nooption ...] [option? ...] [all]" -Display or set editor options. -When no arguments are specified, the editor option -.OP term , -and any editor options whose values have been changed from the -default settings are displayed. -If the argument -.LI all -is specified, the values of all of editor options are displayed. -.sp -Specifying an option name followed by the character -.QT ? -causes the current value of that option to be displayed. -The -.QT ? -can be separated from the option name by whitespace characters. -The -.QT ? -is necessary only for Boolean valued options. -Boolean options can be given values by the form -.QT "set option" -to turn them on, or -.QT "set nooption" -to turn them off. -String and numeric options can be assigned by the form -.QT "set option=value" . -Any whitespace characters in strings can be included literally by preceding -each with a backslash. -More than one option can be set or listed by a single set command, -by specifying multiple arguments, each separated from the next by -whitespace characters. -.SS -.SP Line: -Unchanged. -.SP Options: -None. -.SE -.KY shell -.IP "sh[ell]" -Run the shell program. -The program named by the -.OP shell -option is run with a -.b \-i -(for interactive) flag. -Editing is resumed when that program exits. -.SS -.SP Line: -Unchanged. -.SP Options: -Affected by the -.OP shell -option. -.SE -.KY source -.IP "so[urce] file" -Read and execute -.CO ex -commands from a file. -.CO Source -commands may be nested. -.SS -.SP Line: -Unchanged. -.SP Options: -None. -.SE -.KY substitute -.IP "[range] s[ubstitute] [/pattern/replace/] [options] [count] [flags]" -.KY & -.Ip "[range] & [options] [count] [flags]" -.KY ~ -.Ip "[range] ~ [options] [count] [flags]" -Make substitutions. -Replace the first instance of -.LI pattern -with the string -.LI replace -on the specified line(s). -If the -.QT /pattern/repl/ -argument is not specified, the -.QT /pattern/repl/ -from the previous -.CO substitute -command is used. -Any character other than an alphabetic, numeric, or backslash -character may be used as the delimiter. -.sp -If -.LI options -includes the letter -.QT c -(confirm), you will be prompted for confirmation before each replacement -is done. -An affirmative response (in English, a -.QT y -character) causes the replacement to be made. -A quit response (in English, a -.QT q -character) causes the -.CO substitute -command to be terminated. -Any other response causes the replacement not to be made, and the -.CO substitute -command continues. -If -.LI options -includes the letter -.QT g -(global), all nonoverlapping instances of -.LI pattern -in the line are replaced. -.sp -The -.CO & -version of the command is the same as not specifying a pattern -or replacement string to the -.CO substitute -command, and the -.QT & -is replaced by the pattern and replacement information from the -previous substitute command. -.sp -The -.CO ~ -version of the command is the same as -.CO & -and -.CO s , -except that the search pattern used is the last RE used in -.i any -command, not necessarily the one used in the last -.CO substitute -command. -.sp -For example, in the sequence -.ft C -.(b -s/red/blue/ -/green -~ -.)b -.ft R -the -.QT ~ -is equivalent to -.QT s/green/blue/ . -.sp -The -.CO substitute -command may be interrupted, using the terminal interrupt character. -All substitutions completed before the interrupt are retained. -.SS -.SP Line: -Set to the last line upon which a substitution was made. -.SP Options: -Affected by the -.OP ignorecase -and -.OP magic -option. -.SE -.KY suspend -.IP "su[spend][!]" -.KY stop -.Ip "st[op][!]" -.KY -.Ip -Suspend the edit session. -Appending a -.QT ! -character to these commands turns off the -.OP autowrite -option for the command. -.SS -.SP Line: -Unchanged. -.SP Options: -Affected by the -.OP autowrite -and -.OP writeany -options. -.SE -.KY tag -.IP "ta[g][!] tagstring" -Edit the file containing the specified tag. -If the tag is in a different file, then the new file is edited. -If the current file has been modified since the last complete write, -the -.CO tag -command will fail. -This check can be overridden by appending the -.QT ! -character to the command name. -.sp -The -.CO tag -command searches for -.LI tagstring -in the tags file(s) specified by the -.Op tags -option. -(See -.XR ctags 1 -for more information on tags files.) -.sp -Capitalizing the first letter of the command, i.e. -.CO Tag , -while in -.CO vi -mode, will edit the file in a new screen. -In this case, any modifications to the current file are ignored. -.SS -.SP Line: -Set to the line indicated by the tag. -.SP Options: -Affected by the -.OP autowrite , -.OP taglength , -.OP tags -and -.OP writeany -options. -.SE -.KY tagnext -.IP "tagn[ext][!]" -Edit the file containing the next context for the current tag. -If the context is in a different file, then the new file is edited. -If the current file has been modified since the last complete write, -the -.CO tagnext -command will fail. -This check can be overridden by appending the -.QT ! -character to the command name. -.sp -Capitalizing the first letter of the command, i.e. -.CO Tagnext , -while in -.CO vi -mode, will edit the file in a new screen. -In this case, any modifications to the current file are ignored. -.SS -.SP Line: -Set to the line indicated by the tag. -.SP Options: -Affected by the -.OP autowrite -and -.OP writeany -options. -.SE -.KY tagpop -.IP "tagp[op][!] [file | number]" -Pop to the specified tag in the tags stack. -If neither -.LI file -or -.LI number -is specified, the -.CO tagpop -command pops to the most recent entry on the tags stack. -If -.LI file -or -.LI number -is specified, the -.CO tagpop -command pops to the most recent entry in the tags stack for that file, -or numbered entry in the tags stack, respectively. -(See the -.CO display -command for information on displaying the tags stack.) -.sp -If the file has been modified since the last complete write, the -.CO tagpop -command will fail. -This check may be overridden by appending a -.QT ! -character to the command name. -.SS -.SP Line: -Set to the line indicated by the tag. -.SP Options: -Affected by the -.OP autowrite -and -.OP writeany -options. -.SE -.KY tagprev -.IP "tagp[rev][!]" -Edit the file containing the previous context for the current tag. -If the context is in a different file, then the new file is edited. -If the current file has been modified since the last complete write, -the -.CO tagprev -command will fail. -This check can be overridden by appending the -.QT ! -character to the command name. -.sp -Capitalizing the first letter of the command, i.e. -.CO Tagprev , -while in -.CO vi -mode, will edit the file in a new screen. -In this case, any modifications to the current file are ignored. -.SS -.SP Line: -Set to the line indicated by the tag. -.SP Options: -Affected by the -.OP autowrite -and -.OP writeany -options. -.SE -.KY tagtop -.IP "tagt[op][!]" -Pop to the least recent tag on the tags stack, clearing the tags stack. -.sp -If the file has been modified since the last complete write, the -.CO tagtop -command will fail. -This check may be overridden by appending a -.QT ! -character to the command name. -.SS -.SP Line: -Set to the line indicated by the tag. -.SP Options: -Affected by the -.OP autowrite -and -.OP writeany -options. -.SE -.KY unabbrev -.IP "una[bbrev] lhs" -Delete an abbreviation. -Delete -.LI lhs -from the current list of abbreviations. -.SS -.SP Line: -Unchanged. -.SP Options: -None. -.SE -.KY undo -.IP "u[ndo]" -Undo the last change made to the file. -Changes made by -.CO global , -.CO v , -.CO visual -and map sequences are considered a single command. -If repeated, the -.CO u -command alternates between these two states, and is its own inverse. -.SS -.SP Line: -Set to the last line modified by the command. -.SP Options: -None. -.SE -.KY unmap -.IP "unm[ap][!] lhs" -Unmap a mapped string. -Delete the command mode map definition for -.LI lhs . -If a -.QT ! -character is appended to the command name, delete the text input mode -map definition instead. -.SS -.SP Line: -Unchanged. -.SP Options: -None. -.SE -.KY version -.IP "ve[rsion]" -Display the version of the -.CO ex/vi -editor. -.KY visual -.IP "[line] vi[sual] [type] [count] [flags]" -.CO Ex -mode only. -Enter -.CO vi . -The -.LI type -is optional, and can be -.QT \- , -.QT + -or -.QT ^ , -as in the -.CO ex -.CO z -command, to specify the position of the specified line in the screen -window. -(The default is to place the line at the top of the screen window.) -A -.LI count -specifies the number of lines that will initially be displayed. -(The default is the value of the -.OP window -editor option.) -.SS -.SP Line: -Unchanged unless -.LI line -is specified, in which case it is set to that line. -.SP Options: -None. -.SE -.KY visual -.IP "vi[sual][!] [+cmd] [file]" -.CO Vi -mode only. -Edit a new file. -Identical to the -.QT "edit[!] [+cmd] [file]" -command. -.sp -Capitalizing the first letter of the command, i.e. -.CO Visual , -will edit the file in a new screen. -In this case, any modifications to the current file are ignored. -.KY viusage -.IP "viu[sage] [command]" -Display usage for a -.CO vi -command. -If -.LI command -is specified, a usage statement for that command is displayed. -Otherwise, usage statements for all -.CO vi -commands are displayed. -.SS -.SP Line: -Unchanged. -.SP Options: -None. -.SE -.KY write -.IP "[range] w[rite][!] [>>] [file]" -.Ip "[range] w[rite] [!] [file]" -.KY wn -.Ip "[range] wn[!] [>>] [file]" -.KY wq -.Ip "[range] wq[!] [>>] [file]" -Write the file. -The specified lines (the entire file, if no range is given) is written -to -.LI file . -If -.LI file -is not specified, the current pathname is used. -If -.LI file -is specified, and it exists, or if the current pathname was set using the -.CO file -command, and the file already exists, these commands will fail. -Appending a -.QT ! -character to the command name will override this check and the write -will be attempted, regardless. -.sp -Specifying the optional -.QT >> -string will cause the write to be appended to the file, in which case -no tests are made for the file already existing. -.sp -If the file is preceded by a -.QT ! -character, the program named by the shell edit option is -invoked with file as its second argument, and the specified -lines are passed as standard input to that command. -The -.QT ! -in this usage must be separated from command name by at least one -whitespace character. -The special meaning of the -.QT ! -may be overridden by escaping it with a backslash -.PQ \e -character. -.sp -The -.CO wq -version of the write command will exit the editor after writing the file, -if there are no further files to edit. -Appending a -.QT ! -character to the command name or entering two -.QQ quit -commands (i.e. -.CO wq , -.CO quit , -.CO xit -or -.CO ZZ ) -in a row) will override this check and the editor will exit, -ignoring any files that have not yet been edited. -.sp -The -.CO wn -version of the write command will move to the next file after writing -the file, unless the write fails. -.SS -.SP Line: -Unchanged. -.SP Options: -Affected by the -.OP readonly -and -.OP writeany -options. -.SE -.KY xit -.IP "[range] x[it][!] [file]" -Write the file if it has been modified. -The specified lines are written to -.LI file , -if the file has been modified since the last complete write to any -file. -If no -.LI range -is specified, the entire file is written. -.sp -The -.CO xit -command will exit the editor after writing the file, -if there are no further files to edit. -Appending a -.QT ! -character to the command name or entering two -.QQ quit -commands (i.e. -.CO wq , -.CO quit , -.CO xit -or -.CO ZZ ) -in a row) will override this check and the editor will exit, -ignoring any files that have not yet been edited. -.SS -.SP Line: -Unchanged. -.SP Options: -Affected by the -.OP readonly -and -.OP writeany -options. -.SE -.KY yank -.IP "[range] ya[nk] [buffer] [count]" -Copy the specified lines to a buffer. -If no buffer is specified, the unnamed buffer is used. -.SS -.SP Line: -Unchanged. -.SP Options: -None. -.SE -.KY z -.IP "[line] z [type] [count] [flags]" -Adjust the window. -If no -.LI type -is specified, then -.LI count -lines following the specified line are displayed. -The default -.LI count -is the value of the -.OP window -option. -The -.LI type -argument changes the position at which -.LI line -is displayed on the screen by changing the number of lines -displayed before and after -.LI line . -The following -.LI type -characters may be used: -.SS -.SP \- -Place the line at the bottom of the screen. -.SP + -Place the line at the top of the screen. -.SP \&. -Place the line in the middle of the screen. -.SP ^ -Write out count lines starting -.LI "count * 2" -lines before -.LI line ; -the net effect of this is that a -.QT z^ -command following a -.CO z -command writes the previous page. -.SP = -Center -.LI line -on the screen with a line of hyphens displayed immediately before and -after it. -The number of preceding and following lines of text displayed are -reduced to account for those lines. -.SE -.SS -.SP Line: -Set to the last line displayed, with the exception of the -.Dq Li \&= -.LI type , -where the current line is set to the line specified by the command. -.SP Options: -Affected by the -.OP scroll -option. -.SE diff --git a/docs/USD.doc/vi.ref/index.so b/docs/USD.doc/vi.ref/index.so deleted file mode 100644 index 4c3acb6e4f04..000000000000 --- a/docs/USD.doc/vi.ref/index.so +++ /dev/null @@ -1,260 +0,0 @@ -! 21, 42 -"" 42 -# 22, 43 -$ 22 -% 22 -& 23, 51 -' 23 -( 23 -) 24 -* 43 -+ 19 -, 24 -. 24 -/RE/ 25 -0 25 -0 38 -: 26 -; 26 -< 26, 43 - 14 - 17 - 17 - 17, 38, 42 - 18 - 18 - 18 - 18, 39 - 19 - 19 - 19 - 19 - 19 - 19 - 19, 38 - 20 - 20, 39 - 39 - 20 - 20, 52 - 20 - 21 - 40, 42 - 39 - 20, 39 - 12, 37, 39 - 39 - 12, 39 - 14 - 38 - 21 - 39 -= 43 -> 26, 43 -?RE? 25 -@ 26, 43 -A 27 -B 27 -C 27 -D 27 -E 28 -F 28 -G 28 -H 28 -I 28 -J 29 -L 29 -M 29 -N 25 -O 29 -P 29 -Q 30 -R 30 -S 30 -T 30 -U 30 -W 31 -X 31 -Y 31 -ZZ 31 -[[ 31 -\- 24 -]] 32 -^ 32 -^ 38 -_ 32 -` 23 -a 32 -abbrev 43 -alternate pathname 13 -altwerase 56 -append 44 -args 44 -autoindent 56 -autoprint 56 -autowrite 57 -b 32 -backup 57 -beautify 57 -bg 44 -bigword 16 -buffer 13 -c 33 -cd 45 -cdpath 57 -cedit 57 -change 45 -chdir 45 -columns 58 -comment 58 -copy 45 -count 16, 41 -cscope 45 -current pathname 12 -d 33 -delete 45 -directory 58 -display 45 -e 33 -edcompatible 58 -edit 46 -errorbells 58 -escapetime 58 -exrc 58 -extended 58 -exusage 46 -f 33 -fg 46 -file 41, 46 -filec 58 -flags 41 -flash 59 -global 47 -hardtabs 59 -help 47 -i 33 -iclower 59 -ignorecase 59 -insert 47 -j 19 -join 47 -k 19, 48 -keytime 59 -l 21 -leftright 59 -line 41 -lines 59 -lisp 59 -list 48, 59 -lock 59 -m 34 -magic 60 -map 48 -mark 48 -matchtime 60 -mesg 60 -mkexrc 49 -modelines 60 -motion 15 -move 48 -msgcat 60 -n 25 -next 49 -noprint 60 -number 43, 61 -o 34 -octal 61 -open 49, 61 -optimize 61 -p 34 -paragraph 16 -paragraphs 61 -path 61 -preserve 49 -previous 49 -previous context 15 -print 50, 61 -prompt 61 -put 50 -quit 50 -r 34 -range 41 -read 50 -readonly 61 -recdir 62 -recover 50 -redraw 62 -remap 62 -report 62 -resize 50 -rewind 51 -ruler 62 -s 34 -scroll 62 -searchincr 62 -section 17 -sections 63 -secure 63 -sentence 17 -set 51 -shell 51, 63 -shellmeta 63 -shiftwidth 63 -showmatch 63 -showmode 63 -sidescroll 63 -slowopen 63 -source 51 -sourceany 64 -stop 52 -substitute 51 -suspend 52 -t 35, 45 -tabstop 64 -tag 52 -taglength 64 -tagnext 52 -tagpop 53 -tagprev 53 -tags 64 -tagtop 53 -term 64 -terse 64 -tildeop 64 -timeout 64 -ttywerase 64 -u 35 -unabbrev 53 -undo 53 -unmap 54 -unnamed buffer 14 -v 47 -verbose 64 -version 54 -visual 54 -viusage 54 -w 35 -w1200 64 -w300 64 -w9600 64 -warn 65 -whitespace 14 -window 65 -windowname 65 -wn 54 -word 16 -wq 54 -wraplen 65 -wrapmargin 65 -wrapscan 65 -write 54 -writeany 66 -x 35 -xit 55 -y 35 -yank 55 -z 36, 55 -{ 36 -| 36 -} 37 -~ 37, 51 diff --git a/docs/USD.doc/vi.ref/merge.awk b/docs/USD.doc/vi.ref/merge.awk deleted file mode 100644 index c65207c106a7..000000000000 --- a/docs/USD.doc/vi.ref/merge.awk +++ /dev/null @@ -1,16 +0,0 @@ -# @(#)merge.awk 8.3 (Berkeley) 5/25/94 -# -# merge index entries into one line per label -$1 == prev { - printf ", %s", $2; - next; -} -{ - if (NR != 1) - printf "\n"; - printf "%s \t%s", $1, $2; - prev = $1; -} -END { - printf "\n" -} diff --git a/docs/USD.doc/vi.ref/ref.so b/docs/USD.doc/vi.ref/ref.so deleted file mode 100644 index a82c79258bb1..000000000000 --- a/docs/USD.doc/vi.ref/ref.so +++ /dev/null @@ -1,103 +0,0 @@ -.\" Copyright (c) 1994 -.\" The Regents of the University of California. All rights reserved. -.\" Copyright (c) 1994, 1995, 1996 -.\" Keith Bostic. All rights reserved. -.\" -.\" See the LICENSE file for redistribution information. -.\" -.\" @(#)ref.so 8.9 (Berkeley) 8/17/96 -.\" -.\" -.\" indented paragraph, with spaces between the items, bold font -.de IP -.\".tm arg 1 \\$1 arg 2 \\$2 arg 3 \\$3 -.sp 1 -.nr PS \\n(ps -.nr ps 0 -.ip "\fB\\$1\fP" \\$2 -.nr ps \\n(PS -.br -.. -.\" indented paragraph, no spaces between the items, bold font -.de Ip -.\".tm arg 1 \\$1 arg 2 \\$2 arg 3 \\$3 -.nr PS \\n(ps -.nr ps 0 -.ns -.ip "\fB\\$1\fP" \\$2 -.nr ps \\n(PS -.br -.. -.\" start nested .IP -.de SS -.sp -.ba +5n -.. -.\" end nested .IP -.de SE -.ba -5n -.. -.\" nested .IP, no spaces, normal font -.de SP -.\".tm arg 1 \\$1 arg 2 \\$2 arg 3 \\$3 -.nr PS \\n(ps -.nr ps 0 -.ns -.ip "\\$1" 9n -.nr ps \\n(PS -.. -.\" typewriter font -.de LI -\&\fC\\$1\fP\\$2 -.. -.\" ex/vi names in command font -.de EV -\&\fB\\$1\fP/\fB\\$2\fP\\$3 -.. -.\" command names -.de CO -\&\fB\\$1\fP\\$2 -.. -.\" key words for index -.de KY -.sy echo >>index '\\$1 \\n%' -.. -.\" option names -.de OP -\&\fB\\$1\fP\\$2 -.. -.\" paren quoted (typewriter font) -.de PQ -(\*(lq\fC\\$1\fP\*(rq)\\$2 -.. -.\" quoted bold -.de QB -\*(lq\fB\\$1\fP\*(rq\\$2 -.. -.\" quoted command -.de QC -\*(lq\fB\\$1\fP\*(rq\\$2 -.. -.\" quoted option -.de QO -\*(lq\fB\\$1\fP\*(rq\\$2 -.. -.\" quoted (no font change) -.de QQ -\*(lq\\$1\*(rq\\$2 -.. -.\" quoted (typewriter font) -.de QT -\*(lq\fC\\$1\fP\*(rq\\$2 -.. -.\" section macro to build TOC -.de SH -.(x -\\$2 -.)x -.sh \\$1 "\\$2" -.. -.\" manual section -.de XR -\&\fI\\$1\fP(\\$2)\\$3 -.. diff --git a/docs/USD.doc/vi.ref/set.opt.roff b/docs/USD.doc/vi.ref/set.opt.roff deleted file mode 100644 index 838412897ab0..000000000000 --- a/docs/USD.doc/vi.ref/set.opt.roff +++ /dev/null @@ -1,1303 +0,0 @@ -.\" Copyright (c) 1994 -.\" The Regents of the University of California. All rights reserved. -.\" Copyright (c) 1994, 1995, 1996 -.\" Keith Bostic. All rights reserved. -.\" -.\" See the LICENSE file for redistribution information. -.\" -.\" @(#)set.opt.roff 8.66 (Berkeley) 10/10/96 -.\" -.SH 1 "Set Options" -.pp -There are a large number of options that may be set (or unset) to -change the editor's behavior. -This section describes the options, their abbreviations and their -default values. -.pp -In each entry below, the first part of the tag line is the full name -of the option, followed by any equivalent abbreviations. -(Regardless of the abbreviations, it is only necessary to use the -minimum number of characters necessary to distinguish an abbreviation -from all other commands for it to be accepted, in -.EV nex nvi . -Historically, only the full name and the official abbreviations -were accepted by -.EV ex vi . -Using full names in your startup files and environmental variables will -probably make them more portable.) -The part in square brackets is the default value of the option. -Most of the options are boolean, i.e. they are either on or off, -and do not have an associated value. -.pp -Options apply to both -.CO ex -and -.CO vi -modes, unless otherwise specified. -.pp -With a few exceptions, -all options are settable per screen, i.e. the -.OP tags -option can be set differently in each screen. -The exceptions are the -.OP columns , -.OP lines , -.OP secure -and -.OP term -options. -Changing these options modifies the respective information for all screens. -.pp -For information on modifying the options or to display the options and -their current values, see the -.QQ set -command in the section entitled -.QB "Ex Commands" . -.KY altwerase -.IP "altwerase [off]" -.CO Vi -only. -Change how -.CO vi -does word erase during text input. -When this option is set, text is broken up into three classes: -alphabetic, numeric and underscore characters, other nonblank -characters, and blank characters. -Changing from one class to another marks the end of a word. -In addition, the class of the first character erased is ignored -(which is exactly what you want when erasing pathname components). -.KY autoindent -.IP "autoindent, ai [off]" -If this option is set, whenever you create a new line (using the -.CO vi -.CO A , -.CO a , -.CO C , -.CO c , -.CO I , -.CO i , -.CO O , -.CO o , -.CO R , -.CO r , -.CO S , -and -.CO s -commands, or the -.CO ex -.CO append , -.CO change , -and -.CO insert -commands) the new line is automatically indented to align the cursor with -the first nonblank character of the line from which you created it. -Lines are indented using tab characters to the extent possible (based on -the value of the -.OP tabstop -option) and then using space characters as necessary. -For commands inserting text into the middle of a line, any blank characters -to the right of the cursor are discarded, and the first nonblank character -to the right of the cursor is aligned as described above. -.sp -The indent characters are themselves somewhat special. -If you do not enter more characters on the new line before moving to -another line, or entering -.LI , -the indent character will be deleted and the line will be empty. -For example, if you enter -.LI -twice in succession, -the line created by the first -.LI -will not have any characters in it, -regardless of the indentation of the previous or subsequent line. -.sp -Indent characters also require that you enter additional erase characters -to delete them. -For example, -if you have an indented line, containing only blanks, the first -.LI -character you enter will erase up to end of the indent characters, -and the second will erase back to the beginning of the line. -(Historically, only the -.LI -key would erase the indent characters. -Both the -.LI -key and the usual erase keys work in -.CO nvi .) -In addition, if the cursor is positioned at the end of the indent -characters, the keys -.QT 0 -will erase all of the indent characters for the current line, -resetting the indentation level to 0. -Similarly, the keys -.QT ^ -will erase all of the indent characters for the current line, -leaving the indentation level for future created lines unaffected. -.sp -Finally, if the -.OP autoindent -option is set, the -.CO S -and -.CO cc -commands change from the first nonblank of the line to the end of the -line, instead of from the beginning of the line to the end of the line. -.KY autoprint -.IP "autoprint, ap [off]" -.CO Ex -only. -Cause the current line to be automatically displayed after the -.CO ex -commands -.CO < , -.CO > , -.CO copy , -.CO delete , -.CO join , -.CO move , -.CO put , -.CO t , -.CO Undo , -and -.CO undo . -This automatic display is suppressed during -.CO global -and -.CO v -commands, and for any command where optional flags are used to explicitly -display the line. -.KY autowrite -.IP "autowrite, aw [off]" -If this option is set, the -.CO vi -.CO ! , -.CO ^^ , -.CO ^] -and -.CO -commands, and the -.CO ex -.CO edit , -.CO next , -.CO rewind , -.CO stop , -.CO suspend , -.CO tag , -.CO tagpop , -and -.CO tagtop -commands automatically write the current file back to the current file name -if it has been modified since it was last written. -If the write fails, the command fails and goes no further. -.sp -Appending the optional force flag character -.QT ! -to the -.CO ex -commands -.CO next , -.CO rewind , -.CO stop , -.CO suspend , -.CO tag , -.CO tagpop , -and -.CO tagtop -stops the automatic write from being attempted. -.sp -(Historically, the -.CO next -command ignored the optional force flag.) -Note, the -.CO ex -commands -.CO edit , -.CO quit , -.CO shell , -and -.CO xit -are -.i not -affected by the -.OP autowrite -option. -.sp -The -.OP autowrite -option is ignored if the file is considered read-only for any reason. -.\" I cannot get a double quote to print between the square brackets -.\" to save my life. The ONLY way I've been able to get this to work -.\" is with the .tr command. -.tr Q" -.ds ms backup [QQ] -.KY backup -.IP "\*(ms" -.tr QQ -If this option is set, it specifies a pathname used as a backup file, -and, whenever a file is written, the file's current contents are copied -to it. -The pathname is -.QT \&# , -.QT \&% -and -.QT \&! -expanded. -.sp -If the first character of the pathname is -.QT \&N , -a version number is appended to the pathname (and the -.QT \&N -character is then discarded). -Version numbers are always incremented, and each backup file will have -a version number one greater than the highest version number currently -found in the directory. -.sp -Backup files must be regular files, owned by the real user ID of the -user running the editor, and not accessible by any other user. -.KY beautify -.IP "beautify, bf [off]" -If this option is set, all control characters that are not currently being -specially interpreted, other than -.LI , -.LI , -and -.LI , -are -discarded from commands read in by -.CO ex -from command files, and from input text entered to -.CO vi -(either into the file or to the colon command line). -Text files read by -.EV ex vi -are -.i not -affected by the -.OP beautify -option. -.KY cdpath -.IP "cdpath [environment variable CDPATH, or current directory]" -This option is used to specify a colon separated list of directories -which are used as path prefixes for any relative path names used as -arguments for the -.CO cd -command. -The value of this option defaults to the value of the environmental -variable -.LI CDPATH -if it is set, otherwise to the current directory. -For compatibility with the POSIX 1003.2 shell, the -.CO cd -command does -.i not -check the current directory as a path prefix for relative path names -unless it is explicitly specified. -It may be so specified by entering an empty string or a -.QT \&. -character into the -.LI CDPATH -variable or the option value. -.KY cedit -.IP "cedit [no default]" -This option adds the ability to edit the colon command-line history. -This option is set to a string. -Whenever the first character of that string is entered on the colon -command line, -you will enter a normal editing window on the collected commands that -you've entered on the -.CO vi -colon command-line. -You may then modify and/or execute the commands. -All normal text editing is available, -except that you cannot use -.CO -to switch to an alternate screen. -Entering a -.CO -will execute the current line of the screen window as an ex command in -the context of the screen from which you created the colon command-line -screen, -and you will then return to that screen. -.sp -Because of -.CO vi \&'s -parsing rules, it can be difficult to set the colon command-line edit -character to the -.LI -character. -To set it to -.LI , -use -.QT "set cedit=" . -.sp -If the -.OP cedit -edit option is set to the same character as the -.OP filec -edit option, -.CO vi -will perform colon command-line editing if the character is entered as -the first character of the line, -otherwise, -.CO vi -will perform file name expansion. -.KY columns -.IP "columns, co [80]" -The number of columns in the screen. -Setting this option causes -.EV ex vi -to set (or reset) the environmental variable -.LI COLUMNS . -See the section entitled -.QB "Sizing the Screen" -more information. -.KY comment -.IP "comment [off]" -.CO Vi -only. -If the first non-empty line of the file begins with the string -.QT # , -.QT /\&* -or -.QT // , -this option causes -.CO vi -to skip to the end of that shell, C or C++ comment (probably a -terribly boring legal notice) before displaying the file. -.KY directory -.IP "directory, dir [environment variable TMPDIR, or /tmp]" -The directory where temporary files are created. -The environmental variable -.LI TMPDIR -is used as the default value if it exists, otherwise -.LI /tmp -is used. -.KY edcompatible -.IP "edcompatible, ed [off]" -Remember the values of the -.QQ c -and -.QQ g -suffixes to the -.CO substitute -commands, instead of initializing them as unset for each new -command. -Specifying pattern and replacement strings to the -.CO substitute -command unsets the -.QQ c -and -.QQ g -suffixes as well. -.KY escapetime -.IP "escapetime [1]" -The 10th's of a second -.EV ex vi -waits for a subsequent key to complete an -.LI -key mapping. -.KY errorbells -.IP "errorbells, eb [off]" -.CO Ex -only. -.CO Ex -error messages are normally presented in inverse video. -If that is not possible for the terminal, setting this option causes -error messages to be announced by ringing the terminal bell. -.KY exrc -.IP "exrc, ex [off]" -If this option is turned on in the EXINIT environment variables, -or the system or $HOME startup files, -the local startup files are read, -unless they are the same as the system or $HOME startup files or -fail to pass the standard permission checks. -See the section entitled -.QB "Startup Information" -for more information. -.KY extended -.IP "extended [off]" -This option causes all regular expressions to be treated as POSIX -1003.2 Extended Regular Expressions (which are similar to historic -.XR egrep 1 -style expressions). -.KY filec -.IP "filec [no default]" -This option adds the ability to do shell expansion when entering input -on the colon command line. -This option is set to a string. -Whenever the first character of that string is entered on the colon -command line, -the delimited string immediately before the cursor is expanded -as if it were followed by a -.LI \&* -character, and file name expansion for the -.CO ex -edit command was done. -If no match is found, the screen is flashed and text input resumed. -If a single match results, that match replaces the expanded text. -In addition, if the single match is for a directory, a -.LI \&/ -character is appended and file completion is repeated. -If more than a single match results, -any unique prefix shared by the matches replaces the expanded text, -the matches are displayed, -and text input resumed. -.sp -Because of -.CO vi \&'s -parsing rules, it can be difficult to set the path completion character -to two command values, -.LI -and -.LI . -To set it to -.LI , -use -.QT "set filec=" . -To set it to -.LI , -use -.QT "set filec=\e" . -.sp -If the -.OP cedit -edit option is set to the same character as the -.OP filec -edit option, -.CO vi -will perform colon command-line editing if the character is entered as -the first character of the line, -otherwise, -.CO vi -will perform file name expansion. -.KY flash -.IP "flash [on]" -This option causes the screen to flash instead of beeping the keyboard, -on error, if the terminal has the capability. -.KY hardtabs -.IP "hardtabs, ht [8]" -This option defines the spacing between hardware tab settings, i.e. -the tab expansion done by the operating system and/or the terminal -itself. -As -.EV nex nvi -never writes -.LI -characters to the terminal, unlike historic versions of -.EV ex vi , -this option does not currently have any affect. -.KY iclower -.IP "iclower [off]" -The -.OP iclower -edit option makes all Regular Expressions case-insensitive, -as long as an upper-case letter does not appear in the search string. -.KY ignorecase -.IP "ignorecase, ic [off]" -This option causes regular expressions, both in -.CO ex -commands and in searches, -to be evaluated in a case-insensitive manner. -.KY keytime -.IP "keytime [6]" -The 10th's of a second -.EV ex vi -waits for a subsequent key to complete a key mapping. -.KY leftright -.IP "leftright [off]" -.CO Vi -only. -This option causes the screen to be scrolled left-right to view -lines longer than the screen, instead of the traditional -.CO vi -screen interface which folds long lines at the right-hand margin -of the terminal. -.KY lines -.IP "lines, li [24]" -.CO Vi -only. -The number of lines in the screen. -Setting this option causes -.EV ex vi -to set (or reset) the environmental variable -.LI LINES . -See the section entitled -.QB "Sizing the Screen" -for more information. -.KY lisp -.IP "lisp [off]" -.CO Vi -only. -This option changes the behavior of the -.CO vi -.CO ( , -.CO ) , -.CO { , -.CO } , -.CO [[ -and -.CO ]] -commands to match the Lisp language. -Also, the -.OP autoindent -option's behavior is changed to be appropriate for Lisp. -.sp -.i "This option is not yet implemented." -.KY list -.IP "list [off]" -This option causes lines to be displayed in an unambiguous fashion. -Specifically, tabs are displayed as control characters, i.e. -.QT ^I , -and the ends of lines are marked with a -.QT $ -character. -.KY lock -.IP "lock [on]" -This option causes the editor to attempt to get an exclusive lock on -any file being edited, read or written. -Reading or writing a file that cannot be locked produces a warning -message, but no other effect. -Editing a file that cannot be locked results in a read only edit session, -as if the -.OP readonly -edit option were set. -.KY magic -.IP "magic [on]" -This option is on by default. -Turning the -.OP magic -option off causes all regular expression characters except for -.QT ^ -and -.QT $ , -to be treated as ordinary characters. -To re-enable characters individually, when the -.OP magic -option is off, -precede them with a backslash -.QT \e -character. -See the section entitled -.QB "Regular Expressions and Replacement Strings" -for more information. -.KY matchtime -.IP "matchtime [7]" -.CO Vi -only. -The 10th's of a second -.CO vi -pauses on the matching character when the -.OP showmatch -option is set. -.KY mesg -.IP "mesg [on]" -This option allows other users to contact you using the -.XR talk 1 -and -.XR write 1 -utilities, while you are editing. -.EV Ex vi -does not turn message on, i.e. if messages were turned off when the -editor was invoked, they will stay turned off. -This option only permits you to disallow messages for the edit session. -See the -.XR mesg 1 -utility for more information. -.KY msgcat -.IP "msgcat [./]" -This option selects a message catalog to be used to display error and -informational messages in a specified language. -If the value of this option ends with a '/', it is treated as the name -of a directory that contains a message catalog -.QT "vi_XXXX" , -where -.QT XXXX -is the value of the -.LI LANG -environmental variable, if it's set, or the value of the -.LI LC_MESSAGES -environmental variable if it's not. -If neither of those environmental variables are set, -or if the option doesn't end in a '/', -the option is treated as the full path name of the message catalog to use. -.sp -If any messages are missing from the catalog, -the backup text (English) is used instead. -.sp -See the distribution file -.LI catalog/README -for additional information on building and installing message catalogs. -.KY modelines -.IP "modelines, modeline [off]" -If the -.OP modelines -option is set, -.EV ex vi -has historically scanned the first and last five lines of each file as -it is read for editing, looking for any -.CO ex -commands that have been placed in those lines. -After the startup information has been processed, and before the user -starts editing the file, any commands embedded in the file are executed. -.sp -Commands were recognized by the letters -.QQ e -or -.QQ v -followed by -.QQ x -or -.QQ i , -at the beginning of a line or following a tab or space character, -and followed by a -.QQ : , -an -.CO ex -command, and another -.QQ : . -.sp -This option is a security problem of immense proportions, -and should not be used under any circumstances. -.sp -.i "This option will never be implemented." -.\" I cannot get a double quote to print between the square brackets -.\" to save my life. The ONLY way I've been able to get this to work -.\" is with the .tr command. -.tr Q" -.ds ms noprint [QQ] -.KY noprint -.IP "\*(ms" -.tr QQ -Characters that are never handled as printable characters. -By default, the C library function -.XR isprint 3 -is used to determine if a character is printable or not. -This edit option overrides that decision. -.KY number -.IP "number, nu [off]" -Precede each line displayed with its current line number. -.KY octal -.IP "octal [off]" -Display unknown characters as octal numbers -.PQ "\e###" , -instead of the default -hexadecimal -.PQ "\ex##" . -.KY open -.IP "open [on]" -.CO Ex -only. -If this option is not set, the -.CO open -and -.CO visual -commands are disallowed. -.KY optimize -.IP "optimize, opt [on]" -.CO Vi -only. -Throughput of text is expedited by setting the terminal not to do automatic -carriage returns when printing more than one (logical) line of output, -greatly speeding output on terminals without addressable cursors when text -with leading white space is printed. -.sp -.i "This option is not yet implemented." -.KY paragraphs -.IP "paragraphs, para [IPLPPPQPP LIpplpipbp]" -.CO Vi -only. -Define additional paragraph boundaries for the -.CO { -and -.CO } -commands. -The value of this option must be a character string consisting -of zero or more character pairs. -.sp -In the text to be edited, the character string -.LI "." , -(where -.LI -is one of the character pairs in the option's value) -defines a paragraph boundary. -For example, if the option were set to -.LI "LaA##" , -then all of the following additional paragraph boundaries would be -recognized: -.sp -.(l -.La -.A -.## -.)l -.KY path -.IP "path []" -The path option can be used to specify a -separated list of -paths, similar to the -.LI PATH -environment variable in the shells. -If this option is set, -the name of the file to be edited is not an absolute pathname, -the first component of the filename is not -.QT \&. -or -.QT \&.. , -and the file to be edited doesn't exist in the current directory, -the elements of the -.OP path -option are sequentially searched for a file of the specified name. -If such a file is found, it is edited. -.\" I cannot get a double quote to print between the square brackets -.\" to save my life. The ONLY way I've been able to get this to work -.\" is with the .tr command. -.tr Q" -.ds ms print [QQ] -.KY print -.IP "\*(ms" -.tr QQ -Characters that are always handled as printable characters. -By default, the C library function -.XR isprint 3 -is used to determine if a character is printable or not. -This edit option overrides that decision. -.KY prompt -.IP "prompt [on]" -.CO Ex -only. -This option causes -.CO ex -to prompt for command input with a -.QT : -character; when it is not set, no prompt is displayed. -.KY readonly -.IP "readonly, ro [off]" -This option causes a force flag to be required to attempt to write the file. -Setting this option is equivalent to using the -.b \-R -command line option, -or executing the -.CO vi -program using the name -.CO view . -.sp -The -.OP readonly -edit option is not usually persistent, like other edit options. -If the -.b \-R -command line option is set, -.CO vi -is executed as -.CO view , -or the -.OP readonly -edit option is explicitly set, -all files edited in the screen will be marked readonly, -and the force flag will be required to write them. -However, if none of these conditions are true, -or the -.OP readonly -edit option is explicitly unset, -then the -.OP readonly -edit option will toggle based on the write permissions of the file currently -being edited as of when it is loaded into the edit buffer. -In other words, the -.OP readonly -edit option will be set if the current file lacks write permissions, -and will not be set if the user has write permissions for the file. -.KY recdir -.IP "recdir [/var/tmp/vi.recover]" -The directory where recovery files are stored. -.sp -If you change the value of -.OP recdir , -be careful to choose a directory whose contents are not regularly -deleted. -Bad choices include directories in memory based filesystems, -or -.LI /tmp , -on most systems, -as their contents are removed when the machine is rebooted. -.sp -Public directories like -.LI /usr/tmp -and -.LI /var/tmp -are usually safe, although some sites periodically prune old files -from them. -There is no requirement that you use a public directory, -e.g. a sub-directory of your home directory will work fine. -.sp -Finally, if you change the value of -.OP recdir , -you must modify the recovery script to operate in your chosen recovery -area. -.sp -See the section entitled -.QB "Recovery" -for further information. -.KY redraw -.IP "redraw, re [off]" -.CO Vi -only. -The editor simulates (using great amounts of output), an intelligent -terminal on a dumb terminal (e.g. during insertions in -.CO vi -the characters to the right of the cursor are refreshed as each input -character is typed). -.sp -.i "This option is not yet implemented." -.KY remap -.IP "remap [on]" -If this option is set, -it is possible to define macros in terms of other macros. -Otherwise, each key is only remapped up to one time. -For example, if -.QT A -is mapped to -.QT B , -and -.QT B -is mapped to -.QT C , -The keystroke -.QT A -will be mapped to -.QT C -if the -.OP remap -option is set, and to -.QT B -if it is not set. -.KY report -.IP "report [5]" -Set the threshold of the number of lines that need to be changed or -yanked before a message will be displayed to the user. -For everything but the yank command, the value is the largest value -about which the editor is silent, i.e. by default, 6 lines must be -deleted before the user is notified. -However, if the number of lines yanked is greater than -.i "or equal to" -the set value, it is reported to the user. -.KY ruler -.IP "ruler [off]" -.CO Vi -only. -Display a row/column ruler on the colon command line. -.KY scroll -.IP "scroll, scr [(environment variable LINES - 1) / 2]" -Set the number of lines scrolled by the -.CO ex -.CO -and -.CO -commands. -.sp -Historically, the -.CO ex -.CO z -command, when specified without a count, used two times the size of the -scroll value; the POSIX 1003.2 standard specified the window size, which -is a better choice. -.KY searchincr -.IP "searchincr [off]" -The -.OP searchincr -edit option makes the search commands -.CO \&/ -and -.CO \&? -incremental, i.e. the screen is updated and the cursor moves to the matching -text as the search pattern is entered. -If the search pattern is not found, -the screen is beeped and the cursor remains on the colon-command line. -Erasing characters from the search pattern backs the cursor up to the -previous matching text. -.KY sections -.IP "sections, sect [NHSHH HUnhsh]" -.CO Vi -only. -Define additional section boundaries for the -.CO [[ -and -.CO ]] -commands. -The -.OP sections -option should be set to a character string consisting of zero or -more character pairs. -In the text to be edited, the character string -.LI "." , -(where -.LI -is one of the character pairs in the option's value), -defines a section boundary in the same manner that -.OP paragraphs -option boundaries are defined. -.KY secure -.IP "secure [off]" -The -.OP secure -edit option turns off all access to external programs. -This means that the versions of the -.CO read -and -.CO write -commands that filter text through other programs, -the -.CO vi -.CO \&! -and -.CO -commands, -the -.CO ex -.CO \&! , -.CO script , -.CO shell , -.CO stop -and -.CO suspend -commands and file name expansion will not be permitted. -Once set, -the -.OP secure -edit option may not be unset. -.KY shell -.IP "shell, sh [environment variable SHELL, or /bin/sh]" -Select the shell used by the editor. -The specified path is the pathname of the shell invoked by the -.CO vi -.CO ! -shell escape command and by the -.CO ex -.CO shell -command. -This program is also used to resolve any shell meta-characters in -.CO ex -commands. -.\" I cannot get a double quote to print between the square brackets -.\" to save my life. The ONLY way I've been able to get this to work -.\" is with the .tr command. -.tr Q" -.ds ms shellmeta [~{[*?$`'Q\e] -.KY shellmeta -.IP "\*(ms" -.tr QQ -The set of characters that -.CO ex -checks for when doing file name expansion. -If any of the specified characters are found in the file name arguments -to the -.CO ex -commands, -the arguments are expanded using the program defined by the -.OP shell -option. -The default set of characters is a union of meta characters -from the Version 7 and the Berkeley C shell. -.KY shiftwidth -.IP "shiftwidth, sw [8]" -Set the autoindent and shift command indentation width. -This width is used by the -.OP autoindent -option and by the -.CO < , -.CO > , -and -.CO shift -commands. -.KY showmatch -.IP "showmatch, sm [off]" -.CO Vi -only. -This option causes -.CO vi , -when a -.QT } -or -.QT ) -is entered, to briefly move the cursor the matching -.QT { -or -.QT ( . -See the -.OP matchtime -option for more information. -.KY showmode -.IP "showmode, smd [off]" -.CO Vi -only. -This option causes -.CO vi -to display a string identifying the current editor mode on the colon -command line. -The string is preceded by an asterisk (``*'') if the file has been -modified since it was last completely written, -.KY sidescroll -.IP "sidescroll [16]" -.CO Vi -only. -Sets the number of columns that are shifted to the left or right, -when -.CO vi -is doing left-right scrolling and the left or right margin is -crossed. -See the -.OP leftright -option for more information. -.KY slowopen -.IP "slowopen, slow [off]" -This option affects the display algorithm used by -.CO vi , -holding off display updating during input of new text to improve -throughput when the terminal in use is slow and unintelligent. -.sp -.i "This option is not yet implemented." -.KY sourceany -.IP "sourceany [off]" -If this option is turned on, -.CO vi -historically read startup files that were owned by someone other than -the editor user. -See the section entitled -.QB "Startup Information" -for more information. -This option is a security problem of immense proportions, -and should not be used under any circumstances. -.sp -.i "This option will never be implemented." -.KY tabstop -.IP "tabstop, ts [8]" -This option sets tab widths for the editor display. -.KY taglength -.IP "taglength, tl [0]" -This option sets the maximum number of characters that are considered -significant in a tag name. -Setting the value to 0 makes all of the characters in the tag name -significant. -.KY tags -.IP "tags, tag [tags /var/db/libc.tags /sys/kern/tags]" -Sets the list of tags files, in search order, -which are used when the editor searches for a tag. -.KY term -.IP "term, ttytype, tty [environment variable TERM]" -Set the terminal type. -Setting this option causes -.EV ex vi -to set (or reset) the environmental variable -.LI TERM . -.KY terse -.IP "terse [off]" -This option has historically made editor messages less verbose. -It has no effect in this implementation. -See the -.OP verbose -option for more information. -.KY tildeop -.IP "tildeop [off]" -Modify the -.CO ~ -command to take an associated motion. -.KY timeout -.IP "timeout, to [on]" -If this option is set, -.EV ex vi -waits for a specific period for a subsequent key to complete a key -mapping (see the -.OP keytime -option). -If the option is not set, the editor waits until enough keys are -entered to resolve the ambiguity, regardless of how long it takes. -.KY ttywerase -.IP "ttywerase [off]" -.CO Vi -only. -This option changes how -.CO vi -does word erase during text input. -If this option is set, text is broken up into two classes, -blank characters and nonblank characters. -Changing from one class to another marks the end of a word. -.KY verbose -.IP "verbose [off]" -.CO Vi -only. -.CO Vi -historically bells the terminal for many obvious mistakes, e.g. trying -to move past the left-hand margin, or past the end of the file. -If this option is set, an error message is displayed for all errors. -.KY w300 -.IP "w300 [no default]" -.CO Vi -only. -Set the window size if the baud rate is less than 1200 baud. -See the -.OP window -option for more information. -.KY w1200 -.IP "w1200 [no default]" -.CO Vi -only. -Set the window size if the baud rate is equal to 1200 baud. -See the -.OP window -option for more information. -.KY w9600 -.IP "w9600 [no default]" -.CO Vi -only. -Set the window size if the baud rate is greater than 1200 baud. -See the -.OP window -option for more information. -.KY warn -.IP "warn [on]" -.CO Ex -only. -This option causes a warning message to the terminal if the file has -been modified, since it was last written, before a -.CO ! -command. -.KY window -.IP "window, w, wi [environment variable LINES - 1]" -This option determines the default number of lines in a screenful, -as displayed by the -.CO z -command. -It also determines the number of lines scrolled by the -.CO vi -commands -.CO -and -.CO , -and the default number of lines scrolled by the -.CO vi -commands -.CO -and -.CO . -The value of window can be unrelated to the real screen size, -although it starts out as the number of lines on the screen. -See the section entitled -.QB "Sizing the Screen" -for more information. -Setting the value of the -.OP window -option is the same as using the -.b \-w -command line option. -.sp -If the value of the -.OP window -option (as set by the -.OP window , -.OP w300 , -.OP w1200 -or -.OP w9600 -options) is smaller than the actual size of the screen, -large screen movements will result in displaying only that smaller -number of lines on the screen. -(Further movements in that same area will result in the screen being -filled.) -This can provide a performance improvement when viewing different -places in one or more files over a slow link. -.sp -Resetting the window size does not reset the default number of lines -scrolled by the -.CO -and -.CO -commands. -.KY windowname -.IP "windowname [off]" -.CO Vi -changes the name of the editor's icon/window to the current file name -when it's possible and not destructive, i.e., -when the editor can restore it to its original value on exit or when -the icon/window will be discarded as the editor exits. -If the -.OP windowname -edit option is set, -.CO vi -will change the icon/window name even when it's destructive and the -icon/window name will remain after the editor exits. -(This is the case for -.XR xterm 1 ). -.KY wraplen -.IP "wraplen, wl [0]" -This option is identical to the -.OP wrapmargin -option, with the exception that it specifies the number of columns -from the -.i left -margin before the line splits, not the right margin. -.sp -If both -.OP wraplen -and -.OP wrapmargin -are set, the -.OP wrapmargin -value is used. -.KY wrapmargin -.IP "wrapmargin, wm [0]" -.CO Vi -only. -If the value of the -.OP wrapmargin -option is non-zero, -.CO vi -will split lines so that they end at least that number of columns -before the right-hand margin of the screen. -(Note, the value of -.OP wrapmargin -is -.i not -a text length. -In a screen that is 80 columns wide, the command -.QT ":set wrapmargin=8" -attempts to keep the lines less than or equal to 72 columns wide.) -.sp -Lines are split at the previous whitespace character closest to the -number. -Any trailing whitespace characters before that character are deleted. -If the line is split because of an inserted -.LI -or -.LI -character, and you then enter another -.LI -character, it is discarded. -.sp -If wrapmargin is set to 0, -or if there is no blank character upon which to split the line, -the line is not broken. -.sp -If both -.OP wraplen -and -.OP wrapmargin -are set, the -.OP wrapmargin -value is used. -.KY wrapscan -.IP "wrapscan, ws [on]" -This option causes searches to wrap around the end or the beginning -of the file, and back to the starting point. -Otherwise, the end or beginning of the file terminates the search. -.KY writeany -.IP "writeany, wa [off]" -If this option is set, file-overwriting checks that would usually be -made before the -.CO write -and -.CO xit -commands, or before an automatic write (see the -.OP autowrite -option), are not made. -This allows a write to any file, provided the file permissions allow it. diff --git a/docs/USD.doc/vi.ref/spell.ok b/docs/USD.doc/vi.ref/spell.ok deleted file mode 100644 index a7d95e35d03a..000000000000 --- a/docs/USD.doc/vi.ref/spell.ok +++ /dev/null @@ -1,414 +0,0 @@ -ABC -Amir -Autoindent -Autoprint -BRE's -Bostic -Bourne -CDPATH -CSCOPE -Cscope -DIRS -DOUBLEQUOTE -Dq -Ds -ERE's -EXINIT -Englar -Ev -FF -Fa -Fg -FindScreen -Fl -Foregrounding -HUnhsh -IPLPPPQPP -Kirkendall -Korn -LC -LIpplpipbp -LaA -Li -Lowercase -MINUSSIGN -Makefiles -Mayoff -NEX -NEXINIT -NHSHH -NVI -Neville -Nex -Nvi -OS -POSIX -Perl -PostScript -QQ -RE's -README -RECDIR -Reference''USD:13 -SENDMAIL -SIGHUP -SIGWINCH -SQUOTE -Se -Std -Std1003.2 -Sven -Sy -TANDARDS -TIOCGWINSZ -TMPDIR -TOC -Tagnext -Tagprev -Tcl -Tk -Todo -USD -USD.doc -USD:13 -UUNET -Unmap -VI -Verdoolaege -Vi -Vx -Whitespace -XOFF -XON -XOptions -XXCOLUMNS -XXXX -XXXXXX -XXb -ZZ -ab -abbrev -abc -ags -ai -al -altwerase -ap -api -ar -arg -args -att -autoindent -autoprint -autowrite -aw -backgrounded -backgrounding -bbrev -berkeley -bf -bg -bigword -bigwords -bostic -bp -brev -bsd -bugs.current -c2w -carat -cd -cdpath -cdy -cedit -changelog -chd -chdir -cmd -co -count1 -count2 -creens -cs -cs.berkeley.edu -cscope -ctags -cw -db -dbopen -dd -def -di -dir -dit -docs -eE -eFlRsv -eFlRv -eL -eU -ead -eb -edcompatible -edu -ee -egrep -elete -elp -elvis -email -enum -eof -errorbells -esc -escapetime -eset -eu -ex.cmd.roff -exrc -ext -exu -exusage -fcntl -fg -fi -filec -filesystem -filesystems -foo -foregrounded -foregrounding -ftp.cs.berkeley.edu -ftp.uu.net -gdb -gdb.script -getpwent -gs -gzip'd -halfbyte -hange -hangup -hardtabs -ht -html -http -ic -iclower -ifdef -ignorecase -ile -ind -initially -ious -ir -iscntrl -isprint -ist -ize -keystroke -keystrokes -keytime -leftright -lhs -li -lib -libc -libc.tags -lineNum -lineNumber -lobal -lowercase -lp -luR -matchtime -mber -mesg -meta -mk -mkexrc -modeful -modeline -modelines -ms -msgcat -ndo -nex -nexrc -nk -nomagic -nonblank -nonoverlapping -nooption -noprint -nsert -nul -nvi -nvi.tar.Z -nvi.tar.z -nz -oin -onnections -op -ove -para -pathname -pathnames -pe -perl -perld -ppend -prev -pu -py -rc -rc.local -readonly -rec -recdir -recfile -recover.XXXX -recover.XXXXXX -recover.c -recover.script -redist -redistributable -reimplementations -remapmax -remapped -repl -res -rew -rhs -rint -ript -rk -rl -ro -roff -rsion -sc -sccs -scr -screeen -screenId -se -searchincr -sendmail -set.opt.roff -settable -setuid -sh -shareware -shellmeta -shiftwidth -showmatch -showmode -sidescroll -slowopen -sm -smd -sourceany -sp -spell.ok -ssg -st -su -sual -svi -sw -ta -tabstop -taglength -tagn -tagnext -tagp -tagpop -tagprev -tagstring -tagt -tagtop -tc -tcl -tclproc -terminfo -th -th's -tildeop -tl -tmp -toolchest -tpath -tr -ts -ttytype -ttywerase -uR -ubstitute -ucb -uffers -uit -una -unabbrev -unescaped -unm -unmap -unsets -uppercase -urce -usr -uunet -v -var -ve -vi -vi.0.ps -vi.0.txt -vi.1 -vi.XXXX -vi.XXXXXX -vi.cmd.roff -vi.exrc -vi.recover -viAppendLine -viDelLine -viEndScreen -viFindScreen -viGetCursor -viGetLine -viGetMark -viGetOpt -viInsertLine -viLastLine -viMapKey -viMsg -viNewScreen -viSetCursor -viSetLine -viSetMark -viSetOpt -viSwitchScreen -viUnmMapKey -vibackup -virecovery -viu -viusage -wa -whitespace -wi -windowname -wl -wm -wn -wq -wraplen -wrapmargin -wrapscan -writeany -ws -www -xaw -xit -xterm -ya -yy diff --git a/docs/USD.doc/vi.ref/vi.cmd.roff b/docs/USD.doc/vi.ref/vi.cmd.roff deleted file mode 100644 index 12030cd52b08..000000000000 --- a/docs/USD.doc/vi.ref/vi.cmd.roff +++ /dev/null @@ -1,3085 +0,0 @@ -.\" Copyright (c) 1994 -.\" The Regents of the University of California. All rights reserved. -.\" Copyright (c) 1994, 1995, 1996 -.\" Keith Bostic. All rights reserved. -.\" -.\" See the LICENSE file for redistribution information. -.\" -.\" @(#)vi.cmd.roff 8.49 (Berkeley) 8/17/96 -.\" -.SH 1 "Vi Description" -.pp -.CO Vi -takes up the entire screen to display the edited file, -except for the bottom line of the screen. -The bottom line of the screen is used to enter -.CO ex -commands, and for -.CO vi -error and informational messages. -If no other information is being displayed, -the default display can show the current cursor row and cursor column, -an indication of whether the file has been modified, -and the current mode of the editor. -See the -.OP ruler -and -.OP showmode -options for more information. -.pp -Empty lines do not have any special representation on the screen, -but lines on the screen that would logically come after the end of -the file are displayed as a single tilde -.PQ ~ -character. -To differentiate between empty lines and lines consisting of only -whitespace characters, use the -.OP list -option. -Historically, implementations of -.CO vi -have also displayed some lines as single asterisk -.PQ @ -characters. -These were lines that were not correctly displayed, i.e. lines on the -screen that did not correspond to lines in the file, or lines that did -not fit on the current screen. -.CO Nvi -never displays lines in this fashion. -.pp -.CO Vi -is a modeful editor, i.e. it has two modes, -.QQ command -mode and -.QQ "text input" -mode. -When -.CO vi -first starts, it is in command mode. -There are several commands that change -.CO vi -into text input mode. -The -.LI -character is used to resolve the text input into the file, -and exit back into command mode. -In -.CO vi -command mode, the cursor is always positioned on the last column of -characters which take up more than one column on the screen. -In -.CO vi -text insert mode, the cursor is positioned on the first column of -characters which take up more than one column on the screen. -.pp -When positioning the cursor to a new line and column, -the type of movement is defined by the distance to the new cursor position. -If the new position is close, -the screen is scrolled to the new location. -If the new position is far away, -the screen is repainted so that the new position is on the screen. -If the screen is scrolled, -it is moved a minimal amount, -and the cursor line will usually appear at the top or bottom of the screen. -If the screen is repainted, -the cursor line will appear in the center of the screen, -unless the cursor is sufficiently close to the beginning or end of the file -that this isn't possible. -If the -.OP leftright -option is set, the screen may be scrolled or repainted in a horizontal -direction as well as in a vertical one. -.pp -A major difference between the historical -.CO vi -presentation and -.CO nvi -is in the scrolling and screen oriented position commands, -.CO , -.CO , -.CO , -.CO , -.CO , -.CO , -.CO H , -.CO L -and -.CO M . -In historical implementations of -.CO vi , -these commands acted on physical (as opposed to logical, or screen) -lines. -For lines that were sufficiently long in relation to the size of the -screen, this meant that single line scroll commands might repaint the -entire screen, scrolling or screen positioning commands might not change -the screen or move the cursor at all, and some lines simply could not -be displayed, even though -.CO vi -would edit the file that contained them. -In -.CO nvi , -these commands act on logical, i.e. screen lines. -You are unlikely to notice any difference unless you are editing files -with lines significantly longer than a screen width. -.pp -.CO Vi -keeps track of the currently -.QQ "most attractive" -cursor position. -Each command description (for commands that alter the current cursor -position), -specifies if the cursor is set to a specific location in the line, -or if it is moved to the -.QQ "most attractive cursor position" . -The latter means that the cursor is moved to the cursor position that -is horizontally as close as possible to the current cursor position. -If the current line is shorter than the cursor position -.CO vi -would select, the cursor is positioned on the last character in the line. -(If the line is empty, the cursor is positioned on the first column -of the line.) -If a command moves the cursor to the most attractive position, -it does not alter the current cursor position, and a subsequent -movement will again attempt to move the cursor to that position. -Therefore, although a movement to a line shorter than the currently -most attractive position will cause the cursor to move to the end of -that line, a subsequent movement to a longer line will cause the -cursor to move back to the most attractive position. -.pp -In addition, the -.CO $ -command makes the end of each line the most attractive cursor position -rather than a specific column. -.pp -Each -.CO vi -command described below notes where the cursor ends up after it is -executed. -This position is described in terms of characters on the line, i.e. -.QQ "the previous character" , -or, -.QQ "the last character in the line" . -This is to avoid needing to continually refer to on what part of the -character the cursor rests. -.pp -The following words have special meaning for -.CO vi -commands. -.KY "previous context" -.IP "previous context" -The position of the cursor before the command which caused the -last absolute movement was executed. -Each -.CO vi -command described in the next section that is considered an -absolute movement is so noted. -In addition, specifying -.i any -address to an -.CO ex -command is considered an absolute movement. -.KY "motion" -.IP "motion" -A second -.CO vi -command can be used as an optional trailing argument to the -.CO vi -.CO \&< , -.CO \&> , -.CO \&! , -.CO \&c , -.CO \&d , -.CO \&y , -and (depending on the -.OP tildeop -option) -.CO \&~ -commands. -This command indicates the end of the region of text that's affected by -the command. -The motion command may be either the command character repeated (in -which case it means the current line) or a cursor movement command. -In the latter case, the region affected by the command is from the -starting or stopping cursor position which comes first in the file, -to immediately before the starting or stopping cursor position which -comes later in the file. -Commands that operate on lines instead of using beginning and ending -cursor positions operate on all of the lines that are wholly or -partially in the region. -In addition, some other commands become line oriented depending on -where in the text they are used. -The command descriptions below note these special cases. -.sp -The following commands may all be used as motion components for -.CO vi -commands: -.sp -.ne 12v -.ft C -.TS -r r r r. - - $ -% ' ( ) -+ , - / -0 ; ? B -E F G H -L M N T -W [[ ]] ^ -\&_ ` b e -f h j k -l n t w -{ | } -.TE -.ft R -.sp -The optional count prefix available for some of the -.CO vi -commands that take motion commands, -or the count prefix available for the -.CO vi -commands that are used as motion components, -may be included and is -.i always -considered part of the motion argument. -For example, the commands -.QT c2w -and -.QT 2cw -are equivalent, and the region affected by the -.CO c -command is two words of text. -In addition, -if the optional count prefix is specified for both the -.CO vi -command and its motion component, -the effect is multiplicative and is considered part of the motion argument. -For example, the commands -.QT 4cw -and -.QT 2c2w -are equivalent, and the region affected by the -.CO c -command is four words of text. -.KY "count" -.IP "count" -A positive number used as an optional argument to most commands, -either to give a size or a position (for display or movement commands), -or as a repeat count (for commands that modify text). -The count argument is always optional and defaults to 1 unless otherwise -noted in the command description. -.sp -When a -.CO vi -command synopsis shows both a -.LI [buffer] -and -.LI [count] , -they may be presented in any order. -.KY word -.IP word -Generally, in languages where it is applicable, -.CO vi -recognizes two kinds of words. -First, a sequence of letters, digits and underscores, -delimited at both ends by: -characters other than letters, digits, or underscores, -the beginning or end of a line, and the beginning or end of the file. -Second, a sequence of characters other than letters, digits, underscores, -or whitespace characters, delimited at both ends by: a letter, digit, -underscore, or whitespace character, -the beginning or end of a line, and the beginning or end of the file. -For example, the characters -.QT " !@#abc$%^ " -contain three words: -.QT "!@#" , -.QT "abc" -and -.QT "$%^" . -.sp -Groups of empty lines (or lines containing only whitespace characters) -are treated as a single word. -.KY "bigword" -.IP "bigword" -A set of non-whitespace characters preceded and followed by whitespace -characters or the beginning or end of the file or line. -For example, the characters -.QT " !@#abc$%^ " -contain one bigword: -.QT "!@#abc$%^" . -.sp -Groups of empty lines (or lines containing only whitespace characters) -are treated as a single bigword. -.KY "paragraph" -.IP "paragraph" -An area of text that begins with either the beginning of a file, -an empty line, or a section boundary, and continues until either -an empty line, section boundary, or the end of the file. -.sp -Groups of empty lines (or lines containing only whitespace characters) -are treated as a single paragraph. -.sp -Additional paragraph boundaries can be defined using the -.OP paragraphs -option. -.KY "section" -.IP "section" -An area of text that starts with the beginning of the file or a line -whose first character is an open brace -.PQ { -and continues until the next section or the end of the file. -.sp -Additional section boundaries can be defined using the -.OP sections -option. -.KY "sentence" -.IP "sentence" -An area of text that begins with either the beginning of the file or the -first nonblank character following the previous sentence, paragraph, or -section boundary and continues until the end of the file or a period -.PQ \&. -exclamation point -.PQ ! -or question mark -.PQ ? -character, -followed by either an end-of-line or two whitespace characters. -Any number of closing parentheses -.PQ ) , -brackets -.PQ ] , -double-quote -.PQ """" -or single quote -.PQ ' -characters can appear between the period, exclamation point, -or question mark and the whitespace characters or end-of-line. -.sp -Groups of empty lines (or lines containing only whitespace characters) -are treated as a single sentence. -.SH 1 "Vi Commands" -.pp -The following section describes the commands available in the command -mode of the -.CO vi -editor. -In each entry below, the tag line is a usage synopsis for the command -character. -In addition, the final line and column the cursor rests upon, -and any options which affect the command are noted. -.KY -.IP "[count] " -Search forward -.LI count -times for the current word. -The current word begins at the first non-whitespace character on or -after the current cursor position, -and extends up to the next non-word character or the end of the line. -The search is literal, i.e. no characters in the word have any special -meaning in terms of Regular Expressions. -It is an error if no matching pattern is found between the starting position -and the end of the file. -.sp -The -.CO -command is an absolute movement. -The -.CO -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented. -.SS -.SP Line: -Set to the line where the word is found. -.SP Column: -Set to the first character of the word. -.SP Options: -Affected by the -.OP ignorecase -and -.OP wrapscan -options. -.SE -.KY -.IP "[count] " -Page backward -.LI count -screens. -Two lines of overlap are maintained, if possible, -by displaying the window starting at line -.LI "(top_line - count * window_size) + 2" , -where -.LI window_size -is the value of the -.OP window -option. -(In the case of split screens, this size is corrected to the -current screen size.) -It is an error if the movement is past the beginning of the file. -.SS -.SP Line: -Set to the last line of text displayed on the screen. -.SP Column: -Set to the first nonblank character of the line. -.SP Options: -Affected by the -.OP window -option. -.SE -.KY -.IP "[count] " -Scroll forward -.LI count -lines. -If -.LI count -is not specified, scroll forward the number of lines specified by the last -.CO -or -.CO -command. -If this is the first -.CO -or -.CO -command, -scroll forward half the number of lines in the screen. -(In the case of split screens, the default scrolling distance is -corrected to half the current screen size.) -It is an error if the movement is past the end of the file. -.SS -.SP Line: -Set to the current line plus the number of lines scrolled. -.SP Column: -Set to the first nonblank character of the line. -.SP Options: -None. -.SE -.KY -.IP "[count] " -Scroll forward -.LI count -lines, leaving the cursor on the current line and column, if possible. -It is an error if the movement is past the end of the file. -.SS -.SP Line: -Unchanged unless the current line scrolls off the screen, -in which case it is set to the first line on the screen. -.SP Column: -Unchanged unless the current line scrolls off the screen, -in which case it is set to the most attractive cursor position. -.SP Options: -None. -.SE -.KY -.IP "[count] " -Page forward -.LI count -screens. -Two lines of overlap are maintained, if possible, -by displaying the window starting at line -.LI "top_line + count * window_size - 2" , -where -.LI window_size -is the value of the -.OP window -option. -(In the case of split screens, this size is corrected to the -current screen size.) -It is an error if the movement is past the end of the file. -.SS -.SP Line: -Set to the first line on the screen. -.SP Column: -Set to the first nonblank character of the current line. -.SP Options: -Affected by the -.OP window -option. -.SE -.KY -.IP "" -Display the file information. -The information includes the current pathname, the current line, -the number of total lines in the file, the current line as a percentage -of the total lines in the file, if the file has been modified, -was able to be locked, if the file's name has been changed, -and if the edit session is read-only. -.SS -.SP Line: -Unchanged. -.SP Column: -Unchanged. -.SP Options: -None. -.SE -.KY -.IP "[count] " -.Ip "[count] h" -Move the cursor back -.LI count -characters in the current line. -It is an error if the cursor is on the first character in the line. -.sp -The -.CO -and -.CO h -commands may be used as the motion component of other -.CO vi -commands, -in which case any text copied into a buffer is character oriented. -.SS -.SP Line: -Unchanged. -.SP Column: -Set to the -.LI "current - count" -character, or, the first character in the line if -.LI count -is greater than or equal to the number of characters in the line -before the cursor. -.SP Options: -None. -.SE -.KY -.IP "[count] " -.KY -.Ip "[count] " -.KY j -.Ip "[count] j" -Move the cursor down -.LI count -lines without changing the current column. -It is an error if the movement is past the end of the file. -.sp -The -.CO , -.CO -and -.CO j -commands may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -line oriented. -.SS -.SP Line: -Set to the current line plus -.LI count . -.SP Column: -The most attractive cursor position. -.SP Options: -None. -.SE -.KY -.IP "" -.KY -.Ip "" -Repaint the screen. -.SS -.SP Line: -Unchanged. -.SP Column: -Unchanged. -.SP Options: -None. -.SE -.KY -.IP "[count] " -.KY + -.Ip "[count] +" -Move the cursor down -.LI count -lines to the first nonblank character of that line. -It is an error if the movement is past the end of the file. -.sp -The -.CO -and -.CO + -commands may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -line oriented. -.SS -.SP Line: -Set to the current line plus -.LI count . -.SP Column: -Set to the first nonblank character in the line. -.SP Options: -None. -.SE -.KY -.IP "[count] " -.KY k -.Ip "[count] k" -Move the cursor up -.LI count -lines, without changing the current column. -It is an error if the movement is past the beginning of the file. -.sp -The -.CO -and -.CO k -commands may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -line oriented. -.SS -.SP Line: -Set to the current line minus -.LI count . -.SP Column: -The most attractive cursor position. -.SP Options: -None. -.SE -.KY -.IP "" -Return to the most recent tag context. -The -.CO -command is an absolute movement. -.SS -.SP Line: -Set to the context of the previous tag command. -.SP Column: -Set to the context of the previous tag command. -.SP Options: -None. -.SE -.KY -.IP "[count] " -Scroll backward -.LI count -lines. -If -.LI count -is not specified, scroll backward the number of lines specified by the -last -.CO -or -.CO -command. -If this is the first -.CO -or -.CO -command, -scroll backward half the number of lines in the screen. -(In the case of split screens, the default scrolling distance is -corrected to half the current screen size.) -It is an error if the movement is past the beginning of the file. -.SS -.SP Line: -Set to the current line minus the amount scrolled. -.SP Column: -Set to the first nonblank character in the line. -.SP Options: -None. -.SE -.KY -.IP "" -Switch to the next lower screen in the window, or, to the first -screen if there are no lower screens in the window. -.SS -.SP Line: -Set to the previous cursor position in the window. -.SP Column: -Set to the previous cursor position in the window. -.SP Options: -None. -.SE -.KY -.IP "[count] " -Scroll backward -.LI count -lines, leaving the current line and column as is, if possible. -It is an error if the movement is past the beginning of the file. -.SS -.SP Line: -Unchanged unless the current line scrolls off the screen, -in which case it is set to the last line of text displayed -on the screen. -.SP Column: -Unchanged unless the current line scrolls off the screen, -in which case it is the most attractive cursor position. -.SP Options: -None. -.SE -.KY -.IP "" -Suspend the current editor session. -If the file has been modified since it was last completely written, -and the -.OP autowrite -option is set, the file is written before the editor session is -suspended. -If this write fails, the editor session is not suspended. -.SS -.SP Line: -Unchanged. -.SP Column: -Unchanged. -.SP Options: -Affected by the -.OP autowrite -option. -.SE -.KY -.IP "" -Execute -.CO ex -commands or cancel partial commands. -If an -.CO ex -command is being entered (e.g. -.CO / , -.CO ? , -.CO : -or -.CO ! ), -the command is executed. -If a partial command has been entered, e.g. -.QT "[0-9]*" , -or -.QT "[0-9]*[!<>cdy]" , -the command is cancelled. -Otherwise, it is an error. -.SS -.SP Line: -When an -.CO ex -command is being executed, the current line is set as described for -that command. -Otherwise, unchanged. -.SP Column: -When an -.CO ex -command is being executed, the current column is set as described for -that command. -Otherwise, unchanged. -.SP Options: -None. -.SE -.KY -.IP "" -Push a tag reference onto the tag stack. -The tags files (see the -.OP tags -option for more information) are searched for a tag matching the -current word. -The current word begins at the first non-whitespace character on or -after the current cursor position, -and extends up to the next non-word character or the end of the line. -If a matching tag is found, the current file is discarded and the -file containing the tag reference is edited. -.sp -If the current file has been modified since it was last completely -written, the command will fail. -The -.CO -command is an absolute movement. -.SS -.SP Line: -Set to the line containing the matching tag string. -.SP Column: -Set to the start of the matching tag string. -.SP Options: -Affected by the -.OP tags -and -.OP taglength -options. -.SE -.KY -.IP "" -Switch to the most recently edited file. -.sp -If the file has been modified since it was last completely written, -and the -.OP autowrite -option is set, the file is written out. -If this write fails, the command will fail. -Otherwise, if the current file has been modified since it was last -completely written, the command will fail. -.SS -.SP Line: -Set to the line the cursor was on when the file was last edited. -.SP Column: -Set to the column the cursor was on when the file was last edited. -.SP Options: -Affected by the -.OP autowrite -option. -.SE -.KY -.IP "[count] " -.KY l -.Ip "[count] l" -Move the cursor forward -.LI count -characters without changing the current line. -It is an error if the cursor is on the last character in the line. -.sp -The -.CO -and -.CO \&l -commands may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented. -In addition, these commands may be used as the motion components -of other commands when the cursor is on the last character in the -line, without error. -.SS -.SP Line: -Unchanged. -.SP Column: -Set to the current character plus the next -.LI count -characters, or to the last character on the line if -.LI count -is greater than the number of characters in the line after the -current character. -.SP Options: -None. -.SE -.KY ! -.IP "[count] ! motion shell-argument(s)" -Replace text with results from a shell command. -Pass the lines specified by the -.LI count -and -.LI motion -arguments as standard input to the program named by the -.OP shell -option, and replace those lines with the output (both -standard error and standard output) of that command. -.sp -After the motion is entered, -.CO vi -prompts for arguments to the shell command. -.sp -Within those arguments, -.QT % -and -.QT # -characters are expanded to the current and alternate pathnames, -respectively. -The -.QT ! -character is expanded with the command text of the previous -.CO ! -or -.CO :! -commands. -(Therefore, the command -.CO !! -repeats the previous -.CO ! -command.) -The special meanings of -.QT % , -.QT # -and -.QT ! -can be overridden by escaping them with a backslash. -If no -.CO ! -or -.CO :! -command has yet been executed, -it is an error to use an unescaped -.QT ! -character as a shell argument. -The -.CO ! -command does -.i not -do shell expansion on the strings provided as arguments. -If any of the above expansions change the arguments the user entered, -the command is redisplayed at the bottom of the screen. -.sp -.CO Vi -then executes the program named by the -.OP shell -option, with a -.b \-c -flag followed by the arguments (which are bundled into a single argument). -.sp -The -.CO ! -command is permitted in an empty file. -.sp -If the file has been modified since it was last completely written, -the -.CO ! -command will warn you. -.SS -.SP Line: -The first line of the replaced text. -.SP Column: -The first column of the replaced text. -.SP Options: -Affected by the -.OP shell -option. -.SE -.KY # -.IP "[count] # #|+|-" -Increment or decrement the number referenced by the cursor. -If the trailing character is a -.LI \&+ -or -.LI \&# , -the number is incremented by -.LI count . -If the trailing character is a -.LI \&- , -the number is decremented by -.LI count . -.sp -A leading -.QT \&0X -or -.QT \&0x -causes the number to be interpreted as a hexadecimal number. -Otherwise, a leading -.QT \&0 -causes the number to be interpreted as an octal number, unless a non-octal -digit is found as part of the number. -Otherwise, the number is interpreted as a decimal number, and may -have a leading -.LI \&+ -or -.LI \&- -sign. -The current number begins at the first non-blank character at or after -the current cursor position, and extends up to the end of the line or -the first character that isn't a possible character for the numeric type. -The format of the number (e.g. leading 0's, signs) is retained unless -the new value cannot be represented in the previous format. -.sp -Octal and hexadecimal numbers, and the result of the operation, must fit -into an -.QT "unsigned long" . -Similarly, decimal numbers and their result must fit into a -.QT "signed long" . -It is an error to use this command when the cursor is not positioned at -a number. -.sp -.SS -.SP Line: -Unchanged. -.SP Column: -Set to the first character in the cursor number. -.SP Options: -None. -.SE -.KY $ -.IP "[count] $" -Move the cursor to the end of a line. -If -.LI count -is specified, the cursor moves down -.LI "count - 1" -lines. -.sp -It is not an error to use the -.CO $ -command when the cursor is on the last character in the line or -when the line is empty. -.sp -The -.CO $ -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented, unless the cursor is at, or before the first -nonblank character in the line, in which case it is line oriented. -It is not an error to use the -.CO $ -command as a motion component when the cursor is on the last character -in the line, although it is an error when the line is empty. -.SS -.SP Line: -Set to the current line plus -.LI count -minus 1. -.SP Column: -Set to the last character in the line. -.SP Options: -None. -.SE -.KY % -.IP % -Move to the matching character. -The cursor moves to the parenthesis or curly brace which -.i matches -the parenthesis or curly brace found at the current cursor position -or which is the closest one to the right of the cursor on the line. -It is an error to execute the -.CO % -command on a line without a parenthesis or curly brace. -Historically, any -.LI count -specified to the -.CO % -command was ignored. -.sp -The -.CO % -command is an absolute movement. -The -.CO % -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented, unless the starting point of the region is at -or before the first nonblank character on its line, and the ending -point is at or after the last nonblank character on its line, in -which case it is line oriented. -.SS -.SP Line: -Set to the line containing the matching character. -.SP Column: -Set to the matching character. -.SP Options: -None. -.SE -.KY & -.IP "&" -Repeat the previous substitution command on the current line. -.sp -Historically, any -.LI count -specified to the -.CO & -command was ignored. -.SS -.SP Line: -Unchanged. -.SP Column: -Unchanged if the cursor was on the last character in the line, -otherwise, set to the first nonblank character in the line. -.SP Options: -Affected by the -.OP edcompatible , -.OP extended , -.OP ignorecase -and -.OP magic -options. -.SE -.KY SQUOTE -.IP \' -.KY ` -.Ip ` -Return to a context marked by the character -.LI . -If -.LI -is the -.QT ' -or -.QT ` -character, return to the previous context. -If -.LI -is any other character, -return to the context marked by that character (see the -.CO m -command for more information). -If the command is the -.CO \' -command, only the line value is restored, -and the cursor is placed on the first nonblank character of that line. -If the command is the -.CO ` -command, both the line and column values are restored. -.sp -It is an error if the context no longer exists because of -line deletion. -(Contexts follow lines that are moved, or which are deleted -and then restored.) -.sp -The -.CO \' -and -.CO ` -commands are both absolute movements. -They may be used as a motion component for other -.CO vi -commands. -For the -.CO \' -command, any text copied into a buffer is line oriented. -For the -.CO ` -command, -any text copied into a buffer is character oriented, -unless it both starts and stops at the first character in the line, -in which case it is line oriented. -In addition, when using the -.CO ` -command as a motion component, -commands which move backward and started at the first character in the line, -or move forward and ended at the first character in the line, -are corrected to the last character of the line preceding the starting and -ending lines, respectively. -.SS -.SP Line: -Set to the line from the context. -.SP Column: -Set to the first nonblank character in the line, for the -.CO \' -command, and set to the context's column for the -.CO ` -command. -.SP Options: -None. -.SE -.KY ( -.IP "[count] (" -Back up -.LI count -sentences. -.sp -The -.CO ( -command is an absolute movement. -The -.CO ( -command may be used as the motion component of other -.CO vi -commands, -in which case any text copied into a buffer is character oriented, -unless the starting and stopping points of the region are the first -character in the line, -in which case it is line oriented. -If it is line oriented, -the starting point of the region is adjusted to be the end of the line -immediately before the starting cursor position. -.SS -.SP Line: -Set to the line containing the beginning of the sentence. -.SP Column: -Set to the first nonblank character of the sentence. -.SP Options: -Affected by the -.OP lisp -option. -.SE -.KY ) -.IP "[count] )" -Move forward -.LI count -sentences. -.sp -The -.CO ) -command is an absolute movement. -The -.CO ) -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented, unless the starting point of the region is the -first character in the line, in which case it is line oriented. -In the latter case, if the stopping point of the region is also -the first character in the line, it is adjusted to be the end of the -line immediately before it. -.SS -.SP Line: -Set to the line containing the beginning of the sentence. -.SP Column: -Set to the first nonblank character of the sentence. -.SP Options: -Affected by the -.OP lisp -option. -.SE -.KY , -.IP "[count] ," -Reverse find character -.LI count -times. -Reverse the last -.CO F , -.CO f , -.CO T -or -.CO t -command, searching the other way in the line, -.LI count -times. -It is an error if a -.CO F , -.CO f , -.CO T -or -.CO t -command has not been performed yet. -.sp -The -.CO , -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented. -.SS -.SP Line: -Unchanged. -.SP Column: -Set to the searched-for character for the -.CO F -and -.CO f -commands, -before the character for the -.CO t -command -and after the character for the -.CO T -command. -.SP Options: -None. -.SE -.KY MINUSSIGN -.IP "[count] \-" -Move to the first nonblank of the previous line, -.LI count -times. -.sp -It is an error if the movement is past the beginning of the file. -.sp -The -.CO - -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -line oriented. -.SS -.SP Line: -Set to the current line minus -.LI count . -.SP Column: -Set to the first nonblank character in the line. -.SP Options: -None. -.SE -.KY \&. -.IP "[count] \&." -Repeat the last -.CO vi -command that modified text. -The repeated command may be a command and motion component combination. -If -.LI count -is specified, it replaces -.i both -the count specified for the repeated command, and, if applicable, for -the repeated motion component. -If -.LI count -is not specified, the counts originally specified to the command being -repeated are used again. -.sp -As a special case, if the -.CO \. -command is executed immediately after the -.CO u -command, the change log is rolled forward or backward, depending on -the action of the -.CO u -command. -.SS -.SP Line: -Set as described for the repeated command. -.SP Column: -Set as described for the repeated command. -.SP Options: -None. -.SE -.KY /RE/ -.IP "/RE" -.Ip "/RE/ [offset]" -.KY ?RE? -.Ip "?RE" -.Ip "?RE? [offset]" -.KY N -.Ip "N" -.KY n -.Ip "n" -Search forward or backward for a regular expression. -The commands beginning with a slash -.PQ / -character are forward searches, the commands beginning with a -question mark -.PQ ? -are backward searches. -.CO Vi -prompts with the leading character on the last line of the screen -for a string. -It then searches forward or backward in the file for the next -occurrence of the string, which is interpreted as a Basic Regular -Expression. -.sp -The -.CO / -and -.CO ? -commands are absolute movements. -They may be used as the motion components of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented, unless the search started and ended on -the first column of a line, in which case it is line oriented. -In addition, forward searches ending at the first character of a line, -and backward searches beginning at the first character in the line, -are corrected to begin or end at the last character of the previous line. -(Note, forward and backward searches can occur for both -.CO / -and -.CO ? -commands, if the -.OP wrapscan -option is set.) -.sp -If an offset from the matched line is specified (i.e. a trailing -.QT / -or -.QT ? -character is followed by a signed offset), the buffer will always -be line oriented (e.g. -.QT /string/+0 -will always guarantee a line orientation). -.sp -The -.CO N -command repeats the previous search, but in the reverse direction. -The -.CO n -command repeats the previous search. -If either the -.CO N -or -.CO n -commands are used as motion components for the -.CO ! -command, you will not be prompted for the text of the bang command, -instead the previous bang command will be executed. -.sp -Missing RE's (e.g. -.QT // , -.QT / , -.QT ?? , -or -.QT ? -search for the last search RE, in the indicated direction. -.sp -Searches may be interrupted using the -.LI -character. -.sp -Multiple search patterns may be grouped together by delimiting -them with semicolons and zero or more whitespace characters, e.g. -.LI "/foo/ ; ?bar?" -searches forward for -.LI foo -and then, from that location, backwards for -.LI bar . -When search patterns are grouped together in this manner, -the search patterns are evaluated left to right with the -final cursor position determined by the last search pattern. -.sp -It is also permissible to append a -.CO z -command to the search strings, e.g. -.LI "/foo/ z." -searches forward for the next occurrence of -.LI foo , -and then positions that line in the middle of screen. -.SS -.SP Line: -Set to the line in which the match occurred. -.SP Column: -Set to the first character of the matched string. -.SP Options: -Affected by the -.OP edcompatible , -.OP extended , -.OP ignorecase , -.OP magic , -and -.OP wrapscan -options. -.SE -.KY 0 -.IP "0" -Move to the first character in the current line. -It is not an error to use the -.CO 0 -command when the cursor is on the first character in the line, -.sp -The -.CO 0 -command may be used as the motion component of other -.CO vi -commands, -in which case it is an error if the cursor is on the first character -in the line, -and any text copied into a buffer is character oriented. -.SS -.SP Line: -Unchanged. -.SP Column: -Set to the first character in the line. -.SP Options: -None. -.SE -.KY : -.IP ":" -Execute an -.CO ex -command. -.CO Vi -prompts for an -.CO ex -command on the last line of the screen, using a colon -.PQ : -character. -The command is terminated by a -.LI , -.LI -or -.LI -character; all of these characters may be escaped by using a -.LI "" -character. -The command is then executed. -.sp -If the -.CO ex -command writes to the screen, -.CO vi -will prompt the user for a -.LI -before continuing -when the -.CO ex -command finishes. -Large amounts of output from the -.CO ex -command will be paged for the user, and the user prompted for a -.LI -or -.LI -key to continue. -In some cases, a quit (normally a -.QQ q -character) or -.LI -may be entered to interrupt the -.CO ex -command. -.sp -When the -.CO ex -command finishes, and the user is prompted to resume visual mode, -it is also possible to enter another -.QT : -character followed by another -.CO ex -command. -.SS -.SP Line: -The current line is set as described for the -.CO ex -command. -.SP Column: -The current column is set as described for the -.CO ex -command. -.SP Options: -Affected as described for the -.CO ex -command. -.SE -.KY ; -.IP "[count] ;" -Repeat the last character find -.LI count -times. -The last character find is one of the -.CO F , -.CO f , -.CO T -or -.CO t -commands. -It is an error if a -.CO F , -.CO f , -.CO T -or -.CO t -command has not been performed yet. -.sp -The -.CO ; -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented. -.SS -.SP Line: -Unchanged. -.SP Column: -Set to the searched-for character for the -.CO F -and -.CO f -commands, -before the character for the -.CO t -command -and after the character for the -.CO T -command. -.SP Options: -None. -.SE -.KY < -.IP "[count] < motion" -.KY > -.Ip "[count] > motion" -Shift lines left or right. -Shift the number of lines in the region specified by the -.LI count -and -.LI motion -left (for the -.CO < -command) or right (for the -.CO > -command) by the number of columns specified by the -.OP shiftwidth -option. -Only whitespace characters are deleted when shifting left. -Once the first character in the line no longer contains a whitespace -character, the command will succeed, -but the line will not be modified. -.SS -.SP Line: -Unchanged. -.SP Column: -Set to the first nonblank character in the line. -.SP Options: -Affected by the -.OP shiftwidth -option. -.SE -.KY @ -.IP "@ buffer" -Execute a named buffer. -Execute the named buffer as -.CO vi -commands. -The buffer may include -.CO ex -commands, too, but they must be expressed as a -.CO : -command. -If the buffer is line oriented, -.LI -characters are logically appended to each line of the buffer. -If the buffer is character oriented, -.LI -characters are logically appended to all but the last line in the buffer. -.sp -If the buffer name is -.QT @ , -or -.QT * , -then the last buffer executed shall be used. -It is an error to specify -.QT @@ -or -.QT @* -if there were no previous buffer executions. -The text of a buffer may contain a -.CO @ -command, -and it is possible to create infinite loops in this manner. -(The -.LI -character may be used to interrupt the loop.) -.SS -.SP Line: -The current line is set as described for the command(s). -.SP Column: -The current column is set as described for the command(s). -.SP Options: -None. -.SE -.KY A -.IP "[count] A" -Enter input mode, appending the text after the end of the line. -If -.LI count -is specified, the text is repeatedly input -.LI "count - 1" -more times after input mode is exited. -.SS -.SP Line: -Set to the last line upon which characters were entered. -.SP Column: -Set to the last character entered. -.SP Options: -Affected by the -.OP altwerase , -.OP autoindent , -.OP beautify , -.OP showmatch , -.OP ttywerase -and -.OP wrapmargin -options. -.SE -.KY B -.IP "[count] B" -Move backward -.LI count -bigwords. -Move the cursor backward to the beginning of a bigword by repeating the -following algorithm: if the current position is at the beginning of a -bigword or the character at the current position cannot be part of a bigword, -move to the first character of the preceding bigword. -Otherwise, move to the first character of the bigword at the current position. -If no preceding bigword exists on the current line, move to the first -character of the last bigword on the first preceding line that contains a -bigword. -.sp -The -.CO B -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented. -.SS -.SP Line: -Set to the line containing the word selected. -.SP Column: -Set to the first character of the word selected. -.SP Options: -None. -.SE -.KY C -.IP "[buffer] [count] C" -Change text from the current position to the end-of-line. -If -.LI count -is specified, the input text replaces from the current position to -the end-of-line, plus -.LI "count - 1" -subsequent lines. -.SS -.SP Line: -Set to the last line upon which characters were entered. -.SP Column: -Set to the last character entered. -.SP Options: -Affected by the -.OP altwerase , -.OP autoindent , -.OP beautify , -.OP showmatch , -.OP ttywerase -and -.OP wrapmargin -options. -.SE -.KY D -.IP "[buffer] D" -Delete text from the current position to the end-of-line. -.sp -It is not an error to execute the -.CO D -command on an empty line. -.SS -.SP Line: -Unchanged. -.SP Column: -Set to the character before the current character, or, column 1 if -the cursor was on column 1. -.SP Options: -None. -.SE -.KY E -.IP "[count] E" -Move forward -.LI count -end-of-bigwords. -Move the cursor forward to the end of a bigword by repeating the -following algorithm: if the current position is the end of a -bigword or the character at that position cannot be part of a bigword, -move to the last character of the following bigword. -Otherwise, move to the last character of the bigword at the current -position. -If no succeeding bigword exists on the current line, -move to the last character of the first bigword on the next following -line that contains a bigword. -.sp -The -.CO E -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented. -.SS -.SP Line: -Set to the line containing the word selected. -.SP Column: -Set to the last character of the word selected. -.SP Options: -None. -.SE -.KY F -.IP "[count] F " -Search -.LI count -times backward through the current line for -.LI . -.sp -The -.CO F -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented. -.SS -.SP Line: -Unchanged. -.SP Column: -Set to the searched-for character. -.SP Options: -None. -.SE -.KY G -.IP "[count] G" -Move to line -.LI count , -or the last line of the file if -.LI count -not specified. -.sp -The -.CO G -command is an absolute movement. -The -.CO \&G -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -line oriented. -.SS -.SP Line: -Set to -.LI count , -if specified, otherwise, the last line. -.SP Column: -Set to the first nonblank character in the line. -.SP Options: -None. -.SE -.KY H -.IP "[count] H" -Move to the screen line -.LI "count - 1" -lines below the top of the screen. -.sp -The -.CO H -command is an absolute movement. -The -.CO H -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -line oriented. -.SS -.SP Line: -Set to the line -.LI "count - 1" -lines below the top of the screen. -.SP Column: -Set to the first nonblank character of the -.i screen -line. -.SP Options: -None. -.SE -.KY I -.IP "[count] I" -Enter input mode, inserting the text at the beginning of the line. -If -.LI count -is specified, the text input is repeatedly input -.LI "count - 1" -more times. -.SS -.SP Line: -Set to the last line upon which characters were entered. -.SP Column: -Set to the last character entered. -.SP Options: -None. -.SE -.KY J -.IP "[count] J" -Join lines. -If -.LI count -is specified, -.LI count -lines are joined; a minimum of two lines are always joined, -regardless of the value of -.LI count . -.sp -If the current line ends with a whitespace character, all whitespace -is stripped from the next line. -Otherwise, if the next line starts with a open parenthesis -.PQ ( -do nothing. -Otherwise, if the current line ends with a question mark -.PQ ? , -period -.PQ \&. -or exclamation point -.PQ ! , -insert two spaces. -Otherwise, insert a single space. -.sp -It is not an error to join lines past the end of the file, -i.e. lines that do not exist. -.SS -.SP Line: -Unchanged. -.SP Column: -Set to the character after the last character of the next-to-last -joined line. -.SP Options: -None. -.SE -.KY L -.IP "[count] L" -Move to the screen line -.LI "count - 1" -lines above the bottom of the screen. -.sp -The -.CO L -command is an absolute movement. -The -.CO L -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -line oriented. -.SS -.SP Line: -Set to the line -.LI "count - 1" -lines above the bottom of the screen. -.SP Column: -Set to the first nonblank character of the -.i screen -line. -.SP Options: -None. -.SE -.KY M -.IP " M" -Move to the screen line in the middle of the screen. -.sp -The -.CO M -command is an absolute movement. -The -.CO M -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -line oriented. -.sp -Historically, any -.LI count -specified to the -.CO M -command was ignored. -.SS -.SP Line: -Set to the line in the middle of the screen. -.SP Column: -Set to the first nonblank character of the -.i screen -line. -.SP Options: -None. -.SE -.KY O -.IP "[count] O" -Enter input mode, appending text in a new line above the current line. -If -.LI count -is specified, the text input is repeatedly input -.LI "count - 1" -more times. -.sp -Historically, any -.LI count -specified to the -.CO O -command was ignored. -.SS -.SP Line: -Set to the last line upon which characters were entered. -.SP Column: -Set to the last character entered. -.SP Options: -Affected by the -.OP altwerase , -.OP autoindent , -.OP beautify , -.OP showmatch , -.OP ttywerase -and -.OP wrapmargin -options. -.SE -.KY P -.IP "[buffer] P" -Insert text from a buffer. -Text from the buffer (the unnamed buffer by default) is inserted -before the current column or, if the buffer is line oriented, -before the current line. -.SS -.SP Line: -Set to the lowest numbered line insert, -if the buffer is line oriented, otherwise unchanged. -.SP Column: -Set to the first nonblank character of the appended text, -if the buffer is line oriented, otherwise, the last character -of the appended text. -.SP Options: -None. -.SE -.KY Q -.IP "Q" -Exit -.CO vi -(or visual) mode and switch to -.CO ex -mode. -.SS -.SP Line: -Unchanged. -.SP Column: -No longer relevant. -.SP Options: -None. -.SE -.KY R -.IP "[count] R" -Enter input mode, replacing the characters in the current line. -If -.LI count -is specified, the text input is repeatedly input -.LI "count - 1" -more times. -.sp -If the end of the current line is reached, no more characters are -replaced and any further characters input are appended to the line. -.SS -.SP Line: -Set to the last line upon which characters were entered. -.SP Column: -Set to the last character entered. -.SP Options: -Affected by the -.OP altwerase , -.OP autoindent , -.OP beautify , -.OP showmatch , -.OP ttywerase -and -.OP wrapmargin -options. -.SE -.KY S -.IP "[buffer] [count] S" -Substitute -.LI count -lines. -.SS -.SP Line: -Set to the last line upon which characters were entered. -.SP Column: -Set to the last character entered. -.SP Options: -Affected by the -.OP altwerase , -.OP autoindent , -.OP beautify , -.OP showmatch , -.OP ttywerase -and -.OP wrapmargin -options. -.SE -.KY T -.IP "[count] T " -Search backward, -.LI count -times, -through the current line for the character -.i after -the specified -.LI . -.sp -The -.CO T -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented. -.SS -.SP Line: -Unchanged. -.SP Column: -Set to the character -.i after -the searched-for character. -.SP Options: -None. -.SE -.KY U -.IP "U" -Restore the current line to its state before the cursor last -moved to it. -.SS -.SP Line: -Unchanged. -.SP Column: -The first character in the line. -.SP Options: -None. -.SE -.KY W -.IP "[count] W" -Move forward -.LI count -bigwords. -Move the cursor forward to the beginning of a bigword by repeating the -following algorithm: if the current position is within a bigword or the -character at that position cannot be part of a bigword, move to the first -character of the next bigword. -If no subsequent bigword exists on the current line, -move to the first character of the first bigword on the first following -line that contains a bigword. -.sp -The -.CO W -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented. -.SS -.SP Line: -The line containing the word selected. -.SP Column: -The first character of the word selected. -.SP Options: -None. -.SE -.KY X -.IP "[buffer] [count] X" -Delete -.LI count -characters before the cursor. -If the number of characters to be deleted is greater than or equal to -the number of characters to the beginning of the line, all of the -characters before the current cursor position, to the beginning of the -line, are deleted. -.SS -.SP Line: -Unchanged. -.SP Column: -Set to the current character minus -.LI count , -or the first character if count is greater than the number of -characters in the line before the cursor. -.SP Options: -None. -.SE -.KY Y -.IP "[buffer] [count] Y" -Copy (or -.QQ yank ) -.LI count -lines into the specified buffer. -.SS -.SP Line: -Unchanged. -.SP Column: -Unchanged. -.SP Options: -None. -.SE -.KY ZZ -.IP "ZZ" -Write the file and exit -.CO vi . -The file is only written if it has been modified since the last -complete write of the file to any file. -.sp -The -.CO ZZ -command will exit the editor after writing the file, -if there are no further files to edit. -Entering two -.QQ quit -commands (i.e. -.CO wq , -.CO quit , -.CO xit -or -.CO ZZ ) -in a row will override this check and the editor will exit, -ignoring any files that have not yet been edited. -.SS -.SP Line: -Unchanged. -.SP Column: -Unchanged. -.SP Options: -None. -.SE -.KY [[ -.IP "[count] [[" -Back up -.LI count -section boundaries. -.sp -The -.CO [[ -command is an absolute movement. -The -.CO [[ -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented, unless the starting position is column 0, -in which case it is line oriented. -.sp -It is an error if the movement is past the beginning of the file. -.SS -.SP Line: -Set to the previous line that is -.LI count -section boundaries back, -or the first line of the file if no more section boundaries exist -preceding the current line. -.SP Column: -Set to the first nonblank character in the line. -.SP Options: -Affected by the -.OP sections -option. -.SE -.KY ]] -.IP "[count] ]]" -Move forward -.LI count -section boundaries. -.sp -The -.CO ]] -command is an absolute movement. -The -.CO ]] -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented, unless the starting position is column 0, -in which case it is line oriented. -.sp -It is an error if the movement is past the end of the file. -.SS -.SP Line: -Set to the line that is -.LI count -section boundaries forward, -or to the last line of the file if no more section -boundaries exist following the current line. -.SP Column: -Set to the first nonblank character in the line. -.SP Options: -Affected by the -.OP sections -option. -.SE -.KY ^ -.IP "\&^" -Move to first nonblank character on the current line. -.sp -The -.CO ^ -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented. -.SS -.SP Line: -Unchanged. -.SP Column: -Set to the first nonblank character of the current line. -.SP Options: -None. -.SE -.KY _ -.IP "[count] _" -Move down -.LI "count - 1" -lines, to the first nonblank character. -The -.CO _ -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -line oriented. -.sp -It is not an error to execute the -.CO _ -command when the cursor is on the first character in the line. -.SS -.SP Line: -The current line plus -.LI "count - 1" . -.SP Column: -The first nonblank character in the line. -.SP Options: -None. -.SE -.KY a -.IP "[count] a" -Enter input mode, appending the text after the cursor. -If -.LI count -is specified, the text input is repeatedly input -.LI "count - 1" -more times. -.SS -.SP Line: -Set to the last line upon which characters were entered. -.SP Column: -Set to the last character entered. -.SP Options: -Affected by the -.OP altwerase , -.OP autoindent , -.OP beautify , -.OP showmatch , -.OP ttywerase -and -.OP wrapmargin -options. -.SE -.KY b -.IP "[count] b" -Move backward -.LI count -words. -Move the cursor backward to the beginning of a word by repeating the -following algorithm: if the current position is at the beginning of a word, -move to the first character of the preceding word. -Otherwise, the current position moves to the first character of the word -at the current position. -If no preceding word exists on the current line, move to the first -character of the last word on the first preceding line that contains -a word. -.sp -The -.CO b -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented. -.SS -.SP Line: -Set to the line containing the word selected. -.SP Column: -Set to the first character of the word selected. -.SP Options: -None. -.SE -.KY c -.IP "[buffer] [count] c motion" -Change the region of text specified by the -.LI count -and -.LI motion . -If only part of a single line is affected, then the last character -being changed is marked with a -.QT $ . -Otherwise, the region of text is deleted, and input mode is entered. -.SS -.SP Line: -Set to the last line upon which characters were entered. -.SP Column: -Set to the last character entered. -.SP Options: -Affected by the -.OP altwerase , -.OP autoindent , -.OP beautify , -.OP showmatch , -.OP ttywerase -and -.OP wrapmargin -options. -.SE -.KY d -.IP "[buffer] [count] d motion" -Delete the region of text specified by the -.LI count -and -.LI motion . -.SS -.SP Line: -Set to the line where the region starts. -.SP Column: -Set to the first character in the line after the last character in the -region. -If no such character exists, set to the last character before the region. -.SP Options: -None. -.SE -.KY e -.IP "[count] e" -Move forward -.LI count -end-of-words. -Move the cursor forward to the end of a word by repeating the following -algorithm: if the current position is the end of a word, -move to the last character of the following word. -Otherwise, move to the last character of the word at the current position. -If no succeeding word exists on the current line, move to the last character -of the first word on the next following line that contains a word. -.sp -The -.CO e -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented. -.SS -.SP Line: -Set to the line containing the word selected. -.SP Column: -Set to the last character of the word selected. -.SP Options: -None. -.SE -.KY f -.IP "[count] f " -Search forward, -.LI count -times, through the rest of the current line for -.LI . -.sp -The -.CO f -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented. -.SS -.SP Line: -Unchanged. -.SP Column: -Set to the searched-for character. -.SP Options: -None. -.SE -.KY i -.IP "[count] i" -Enter input mode, inserting the text before the cursor. -If -.LI count -is specified, the text input is repeatedly input -.LI "count - 1" -more times. -.SS -.SP Line: -Set to the last line upon which characters were entered. -.SP Column: -Set to the last character entered. -.SP Options: -Affected by the -.OP altwerase , -.OP autoindent , -.OP beautify , -.OP showmatch , -.OP ttywerase -and -.OP wrapmargin -options. -.SE -.KY m -.IP "m " -Save the current context (line and column) as -.LI . -The exact position is referred to by -.QT ` . -The line is referred to by -.QT ' . -.sp -Historically, -.LI -was restricted to lower-case letters. -.CO Nvi -permits the use of any character. -.SS -.SP Line: -Unchanged. -.SP Column: -Unchanged. -.SP Options: -None. -.SE -.KY o -.IP "[count] o" -Enter input mode, appending text in a new line under the current line. -If -.LI count -is specified, the text input is repeatedly input -.LI "count - 1" -more times. -.sp -Historically, any -.LI count -specified to the -.CO o -command was ignored. -.SS -.SP Line: -Set to the last line upon which characters were entered. -.SP Column: -Set to the last character entered. -.SP Options: -Affected by the -.OP altwerase , -.OP autoindent , -.OP beautify , -.OP showmatch , -.OP ttywerase -and -.OP wrapmargin -options. -.SE -.KY p -.IP "[buffer] p" -Append text from a buffer. -Text from the buffer (the unnamed buffer by default) is appended -after the current column or, if the buffer is line oriented, -after the current line. -.SS -.SP Line: -Set to the first line appended, if the buffer is line oriented, -otherwise unchanged. -.SP Column: -Set to the first nonblank character of the appended text if the buffer -is line oriented, otherwise, the last character of the appended text. -.SP Options: -None. -.SE -.KY r -.IP "[count] r " -Replace characters. -The next -.LI count -characters in the line are replaced with -.LI . -Replacing characters with -.LI -characters results in creating new, empty lines into the file. -.sp -If -.LI -is -.LI , -the command is cancelled. -.SS -.SP Line: -Unchanged unless the replacement character is a -.LI , -in which case it is set to the current line plus -.LI "count - 1" . -.SP Column: -Set to the last character replaced, -unless the replacement character is a -.LI , -in which case the cursor is in column 1 of the last line inserted. -.SP Options: -None. -.SE -.KY s -.IP "[buffer] [count] s" -Substitute -.LI count -characters in the current line starting with the current character. -.SS -.SP Line: -Set to the last line upon which characters were entered. -.SP Column: -Set to the last character entered. -.SP Options: -Affected by the -.OP altwerase , -.OP autoindent , -.OP beautify , -.OP showmatch , -.OP ttywerase -and -.OP wrapmargin -options. -.SE -.KY t -.IP "[count] t " -Search forward, -.LI count -times, through the current line for the character immediately -.i before -.LI . -.sp -The -.CO t -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented. -.SS -.SP Line: -Unchanged. -.SP Column: -Set to the character -.i before -the searched-for character. -.SP Options: -None. -.SE -.KY u -.IP "u" -Undo the last change made to the file. -If repeated, the -.CO u -command alternates between these two states, and is its own inverse. -When used after an insert that inserted text on more than one line, -the lines are saved in the numeric buffers. -.sp -The -.CO \&. -command, when used immediately after the -.CO u -command, causes the change log to be rolled forward or backward, -depending on the action of the -.CO u -command. -.SS -.SP Line: -Set to the position of the first line changed, if the reversal affects -only one line or represents an addition or change; otherwise, the line -preceding the deleted text. -.SP Column: -Set to the cursor position before the change was made. -.SP Options: -None. -.SE -.KY w -.IP "[count] w" -Move forward -.LI count -words. -Move the cursor forward to the beginning of a word by repeating the -following algorithm: if the current position is at the -beginning of a word, move to the first character of the next word. -If no subsequent word exists on the current line, move to the first -character of the first word on the first following line that contains -a word. -.sp -The -.CO w -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented. -.SS -.SP Line: -Set to the line containing the word selected. -.SP Column: -Set to the first character of the word selected. -.SP Options: -None. -.SE -.KY x -.IP "[buffer] [count] x" -Delete -.LI count -characters. -The deletion is at the current character position. -If the number of characters to be deleted is greater than or equal to -the number of characters to the end of the line, all of the characters -from the current cursor position to the end of the line are deleted. -.SS -.SP Line: -Unchanged. -.SP Column: -Unchanged unless the last character in the line is deleted and the cursor -is not already on the first character in the line, in which case it is -set to the previous character. -.SP Options: -None. -.SE -.KY y -.IP "[buffer] [count] y motion" -Copy (or -.QQ yank ) -the text region specified by the -.LI count -and -.LI motion , -into a buffer. -.SS -.SP Line: -Unchanged, unless the region covers more than a single line, -in which case it is set to the line where the region starts. -.SP Column: -Unchanged, unless the region covers more than a single line, -in which case it is set to the character were the region starts. -.SP Options: -None. -.SE -.KY z -.IP "[count1] z [count2] type" -Redraw the screen with a window -.LI count2 -lines long, with line -.LI count1 -placed as specified by the -.LI type -character. -If -.LI count1 -is not specified, it defaults to the current line. -If -.LI count2 -is not specified, it defaults to the current window size. -.sp -The following -.LI type -characters may be used: -.SS -.SP + -If -.LI count1 -is specified, place the line -.LI count1 -at the top of the screen. -Otherwise, display the screen after the current screen, similarly to the -.CO -command. -.SP -Place the line -.LI count1 -at the top of the screen. -.SP \&. -Place the line -.LI count1 -in the center of the screen. -.SP \- -Place the line -.LI count1 -at the bottom of the screen. -.SP ^ -If -.LI count1 -is specified, place the line that is at the top of the screen -when -.LI count1 -is at the bottom of the screen, at the bottom of the screen, -i.e. display the screen before the screen before -.LI count1 . -Otherwise, display the screen before the current screen, similarly to the -.CO -command. -.SE -.SS -.SP Line: -Set to -.LI count1 -unless -.LI count1 -is not specified and the -.LI type -character was either -.QT ^ -or -.QT + , -in which case it is set to the line before the first line on the -previous screen or the line after the last line on the previous -screen, respectively. -.SP Column: -Set to the first nonblank character in the line. -.SP Options: -None. -.SE -.KY { -.IP "[count] {" -Move backward -.LI count -paragraphs. -.sp -The -.CO { -command is an absolute movement. -The -.CO { -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented, unless the starting character is the first -character on its line, in which case it is line oriented. -.SS -.SP Line: -Set to the line containing the beginning of the previous paragraph. -.SP Column: -Set to the first nonblank character in the line. -.SP Options: -Affected by the -.OP paragraph -option. -.SE -.KY | -.IP "[count] |" -Move to a specific -.i column -position on the current line. -.sp -The -.CO | -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented. -It is an error to use the -.CO | -command as a motion component and for the cursor not to move. -.SS -.SP Line: -Unchanged. -.SP Column: -Set to the character occupying the column position identified by -.LI count , -if the position exists in the line. -If the column length of the current line is less than -.LI count , -the cursor is moved to the last character in the line. -.SP Options: -None. -.SE -.KY } -.IP "[count] }" -Move forward -.LI count -paragraphs. -.sp -The -.CO } -command is an absolute movement. -The -.CO } -command may be used as the motion component of other -.CO vi -commands, in which case any text copied into a buffer is -character oriented, unless the starting character is at or -before any nonblank characters in its line, -in which case it is line oriented. -.SS -.SP Line: -Set to the line containing the beginning of the next paragraph. -.SP Column: -Set to the first nonblank character in the line. -.SP Options: -Affected by the -.OP paragraph -option. -.SE -.KY ~ -.IP "[count] ~" -Reverse the case of the next -.LI count -character(s). -This is the historic semantic for the -.CO ~ -command and it is only in effect if the -.OP tildeop -option is not set. -.sp -Lowercase alphabetic characters are changed to uppercase, -and uppercase characters are changed to lowercase. -No other characters are affected. -.sp -Historically, the -.CO ~ -command did not take an associated count, nor did it move past the -end of the current line. -As it had no associated motion it was difficult to change the case -of large blocks of text. -In -.CO nvi , -if the cursor is on the last character of a line, and there are -more lines in the file, the cursor moves to the next line. -.sp -It is not an error to specify a count larger than the number of -characters between the cursor and the end of the file. -.SS -.SP Line: -Set to the line of the character after -.LI count -characters, or, end of file. -.SP Column: -Set to the character after -.LI count -characters, or, end-of-file. -.SP Options: -Affected by the -.OP tildeop -option. -.SE -.KY ~ -.IP "[count] ~ motion" -Reverse the case of the characters in a text region specified by the -.LI count -and -.LI motion . -Only in effect if the -.OP tildeop -option is set. -.sp -Lowercase characters are changed to uppercase, -and uppercase characters are changed to lowercase. -No other characters are affected. -.SS -.SP Line: -Set to the line of the character after the last character in the region. -.SP Column: -Set to the character after the last character in the region. -.SP Options: -Affected by the -.OP tildeop -option. -.SE -.KY -.IP "" -Interrupt the current operation. -Many of the potentially long-running -.CO vi -commands may be interrupted using the terminal interrupt character. -These operations include searches, file reading and writing, filter -operations and map character expansion. -Interrupts are also enabled when running commands outside of -.CO vi . -.sp -If the -.LI -character is used to interrupt while entering an -.CO ex -command, the command is aborted, the cursor returns to its previous -position, and -.CO vi -remains in command mode. -.sp -Generally, if the -.LI -character is used to interrupt any -operation, any changes made before the interrupt are left in place. -.SS -.SP Line: -Dependent on the operation being interrupted. -.SP Column: -Dependent on the operation being interrupted. -.SP Options: -None. -.SH 1 "Vi Text Input Commands" -.pp -The following section describes the commands available in the text -input mode of the -.CO vi -editor. -.pp -Historically, -.CO vi -implementations only permitted the characters inserted on the current -line to be erased. -In addition, only the -.LI -erase character and the -.QT 0 -and -.QT ^ -erase strings could erase autoindent characters. -(Autoindent characters include both the characters inserted automatically -at the beginning of an input line as well as characters inserted using the -.LI -command.) -This implementation permits erasure to continue past the beginning -of the current line, and back to where text input mode was entered. -In addition, autoindent characters may be erased using the standard -erase characters. -For the line and word erase characters, reaching the autoindent -characters forms a -.QQ soft -boundary, denoting the end of the current word or line erase. -Repeating the word or line erase key will erase the autoindent characters. -.pp -Historically, -.CO vi -always used -.LI -and -.LI -as character and word erase characters, respectively, regardless of -the current terminal settings. -This implementation accepts, in addition to these two characters, -the current terminal characters for those operations. -.KY -.IP "" -If the first character of the input is a -.LI , -the previous input is replayed, as if just entered. -.KY -.IP "" -If the previous character on the line was an autoindent character, -erase characters to move the cursor back to the column immediately -after the previous (1-based) column which is a multiple of the -.OP shiftwidth -edit option. -This may result in any number of -.LI -and -.LI -characters preceding the cursor being changed. -.sp -Otherwise, if the -.OP autoindent -option is set and the user is entering the first character in the line, -.LI -is ignored. -Otherwise, a literal -.LI -character is entered. -.KY ^ -.IP "^" -If the previous character on the line was an autoindent character, -erase all of the autoindent characters on the line. -In addition, the autoindent level is reset to 0. -.KY 0 -.IP "0" -If the previous character on the line was an autoindent character, -erase all of the autoindent characters on the line. -The autoindent level is not altered. -.KY -.IP "" -Insert sufficient -.LI -and -.LI -characters to move the cursor forward to the column immediately -after the next (1-based) column which is a multiple of the -.OP shiftwidth -edit option. -This may result in any number of -.LI -and -.LI -characters preceding the cursor being changed. -.sp -Historically, -.CO vi -did not permit the -.LI -command to be used unless the cursor was at the first column of a new -line or it was preceded only by autoindent characters. -.CO Nvi -permits it to be used at any time during insert mode. -.KY -.IP -.KY -.Ip -Erase the last character. -.KY "" -.IP "" -Quote the next character. -The next character will not be mapped (see the -.CO map -command for more information) -or interpreted specially. -A carat -.PQ ^ -character will be displayed immediately as a placeholder, -but will be replaced by the next character. -.KY -.IP -If on the colon command line, and the -.OP filec -edit option is set, behave as described for that option. -Otherwise, if on the colon command line, -execute the command. -Otherwise, if not on the colon command line, -resolve all text input into the file, and return to command mode. -.KY "" -.IP "" -Erase the current line. -.KY "" -.IP "" -.KY "" -.Ip "" -Erase the last word. -The definition of word is dependent on the -.OP altwerase -and -.OP ttywerase -options. -.KY "" -.IP "[0-9A-Fa-f]+" -Insert a character with the specified hexadecimal value into the text. -The value is delimited by any non-hexadecimal character or the input -of the maximum number of characters that can be translated into a single -character value. -.KY -.IP "" -Interrupt text input mode, returning to command mode. -If the -.LI -character is used to interrupt inserting text into the file, -it is as if the -.LI -character was used; all text input up to the interruption is -resolved into the file. diff --git a/docs/USD.doc/vi.ref/vi.ref b/docs/USD.doc/vi.ref/vi.ref deleted file mode 100644 index 12a483f1edb1..000000000000 --- a/docs/USD.doc/vi.ref/vi.ref +++ /dev/null @@ -1,1840 +0,0 @@ -.\" Copyright (c) 1994 -.\" The Regents of the University of California. All rights reserved. -.\" Copyright (c) 1994, 1995, 1996 -.\" Keith Bostic. All rights reserved. -.\" -.\" This document may not be republished without written permission from -.\" Keith Bostic. -.\" -.\" See the LICENSE file for redistribution information. -.\" -.\" @(#)vi.ref 8.88 (Berkeley) 10/19/96 -.\" -.\" $FreeBSD$ -.\" -.so ref.so -.tp -.(l C -.ps 12 -.ft B -Vi/Ex Reference Manual -.ft -.ps -.sp -.i "Keith Bostic" -.sp -Computer Science Division -Department of Electrical Engineering and Computer Science -University of California, Berkeley -Berkeley, California 94720 -.sp 1 -.)l -.sp 3 -.(l C -.i Abstract -.)l -.(q -.pp -This document is the reference guide for the 4.4BSD -implementations of -.EV nex nvi , -which are implementations of the historic Berkeley -.EV ex vi -editors. -.)q -.sp 3 -.(l C -.i Licensing -.)l -.sp -.lp -Copyright (c) 1991, 1992, 1993, 1994 -.ti +5 -The Regents of the University of California. All Rights Reserved. -.lp -Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996 -.ti +5 -Keith Bostic. All Rights Reserved. -.sp -.pp -The vi program is freely redistributable. You are welcome to copy, -modify and share it with others under the conditions listed in the -LICENSE file. If any company (not individual!) finds vi sufficiently -useful that you would have purchased it, or if any company wishes to -redistribute it, contributions to the authors would be appreciated. -.bp 2 -.(l C -.i Acknowledgements -.)l -.sp -.(q -.pp -Bruce Englar encouraged the early development of the historic -.EV ex vi -editor. -Peter Kessler helped bring sanity to version 2's command layout. -Bill Joy wrote versions 1 and 2.0 through 2.7, -and created the framework that users see in the present editor. -Mark Horton added macros and other features and made -.EV ex vi -work on a large number of terminals and Unix systems. -.pp -.CO Nvi -is originally derived from software contributed to the University of -California, Berkeley by Steve Kirkendall, the author of the -.CO vi -clone -.CO elvis . -.pp -IEEE Standard Portable Operating System Interface for Computer -Environments (POSIX) 1003.2 style Regular Expression support was -done by Henry Spencer. -.pp -The curses library was originally done by Ken Arnold. -Scrolling and reworking for -.CO nvi -was done by Elan Amir. -.pp -George Neville-Neil added the Tcl interpreter, -and Sven Verdoolaege added the Perl interpreter. -.pp -Rob Mayoff added Cscope support. -.pp -The Institute of Electrical and Electronics Engineers has -given us permission to reprint portions of their documentation. -Portions of this document are reprinted and reproduced from -IEEE Std 1003.2-1992, IEEE Standard Portable Operating -System Interface for Computer Environments (POSIX), -copyright 1992 by the Institute of Electrical and Electronics -Engineers, Inc. -.pp -The financial support of UUNET Communications Services is gratefully -acknowledged. -.)q -.sy echo -n >index -.oh 'Vi/Ex Reference''USD:13-%' -.eh 'USD:13-%''Vi/Ex Reference' -.bp 4 -.SH 1 Description -.pp -.CO Vi -is a screen oriented text editor. -.CO Ex -is a line-oriented text editor. -.CO Ex -and -.CO vi -are different interfaces to the same program, -and it is possible to switch back and forth during an edit session. -.CO View -is the equivalent of using the -.b \-R -(read-only) option of -.CO vi . -.pp -This reference manual is the one provided with the -.EV nex nvi -versions of the -.EV ex vi -text editors. -.EV Nex nvi -are intended as bug-for-bug compatible replacements for the original -Fourth Berkeley Software Distribution (4BSD) -.EV ex vi -programs. -This reference manual is accompanied by a traditional-style manual page. -That manual page describes the functionality found in -.EV ex vi -in far less detail than the description here. -In addition, it describes the system interface to -.EV ex vi , -e.g. command line options, session recovery, signals, -environmental variables, and similar things. -.pp -This reference is intended for users already familiar with -.EV ex vi . -Anyone else should almost certainly read a good tutorial on the -editor first. -If you are in an unfamiliar environment, -and you absolutely have to get work done immediately, -see the section entitled -.QB "Fast Startup" -in the manual page. -It is probably enough to get you started. -.pp -There are a few features in -.EV nex nvi -that are not found in historic versions of -.EV ex vi . -Some of the more interesting of those features are briefly described -in the next section, entitled -.QB "Additional Features" . -For the rest of this document, -.EV nex nvi -is used only when it is necessary to distinguish it from the historic -implementations of -.EV ex vi . -.pp -Future versions of this software will be periodically made available -by anonymous ftp, and can be retrieved from -.LI ftp.cs.berkeley.edu , -in the directory -.LI ucb/4bsd . -.SH 1 "Additional Features in Nex/Nvi" -.pp -There are a few features in -.EV nex nvi -that are not found in historic versions of -.EV ex vi . -Some of the more interesting of these are as follows: -.IP "8-bit clean data, large lines, files" -.EV Nex nvi -will edit any format file. -Line lengths are limited by available memory, -and file sizes are limited by available disk space. -The -.CO vi -text input mode command -.CO -can insert any possible character value into the text. -.IP "Background and foreground screens" -The -.CO bg -command backgrounds the current screen, and the -.CO fg -command foregrounds backgrounded screens. -The -.CO display -command can be used to list the background screens. -.IP "Command Editing" -You can enter a normal editing window on the collected commands that -you've entered on the -.CO vi -colon command-line, -and then modify and/or execute the commands. -See the -.OP cedit -edit option for more information. -.IP "Displays" -The -.CO display -command can be used to display the current buffers, the backgrounded -screens, and the tags stack. -.IP "Extended Regular Expressions" -The -.CO extended -option causes Regular Expressions to be interpreted as as Extended -Regular Expressions, (i.e. \fIegrep\fP(1) style Regular Expressions). -.IP "File Name Completion" -It is possible to do file name completion and file name displays when -entering commands on the -.CO vi -colon command-line. -See the -.OP filec -option for more information. -.IP "Infinite undo" -Changes made during an edit session may be rolled backward and forward. -A -.CO \&. -command immediately after a -.CO u -command continues either forward or backward depending on whether the -.CO u -command was an undo or a redo. -.IP "Left-right scrolling" -The -.CO leftright -option causes -.CO nvi -to do left-right screen scrolling, instead of the traditional -.CO vi -line wrapping. -.IP "Message Catalogs" -It is possible to display informational and error messages in different -languages by providing a catalog of messages. -See the -.OP msgcat -option and the file -.LI "catalog/README" -for more information. -.IP "Incrementing numbers" -The -.CO \&# -command increments or decrements the number referenced by the cursor. -.IP "Previous file" -The -.CO previous -command edits the previous file from the argument list. -.IP "Scripting languages" -The -.CO ":pe[rl] cmd" , -.CO ":perld[o] cmd" -and -.CO ":tc[l] cmd" -commands execute Perl and Tcl/Tk commands, respectively, -on lines from the edit buffer. -See the -.QB "Scripting Languages" -section and the specific commands for more information. -.\".IP "Shell screens" -.\"The -.\".CO ":sc[ript] [file ...]" -.\"command runs a shell in the screen. -.\"Editing is unchanged, with the exception that a \fC\fP -.\"enters the current line (stripped of any prompt) as input to the -.\"shell. -.IP "Split screens" -The -.CO Edit , -.CO Ex , -.CO Next , -.CO Previous , -.CO Tag -and -.CO Visual -(in -.CO vi -mode) commands divide the screen into multiple editing regions and -then perform their normal function in a new screen area. -The -.CO -command rotates between the foreground screens. -The -.CO resize -command can be used to grow or shrink a particular screen. -.IP "Tag stacks" -Tags are now maintained in a stack. -The -.CO -command returns to the previous tag location. -The -.CO tagpop -command returns to the most recent tag location by default, or, -optionally to a specific tag number in the tag stack, -or the most recent tag from a specified file. -The -.CO display -command can be used to list the tags stack. -The -.CO tagtop -command returns to the top of the tag stack. -.IP "Usage information" -The -.CO exusage -and -.CO viusage -commands provide usage information for all of the -.CO ex -and -.CO vi -commands by default, or, optionally, for a specific command or key. -.IP "Word search" -The -.CO -command searches for the word referenced by the cursor. -.SH 1 "Startup Information" -.pp -.EV Ex vi -interprets one of two possible environmental variables and reads up to -three of five possible files during startup. -The variables and files are expected to contain -.CO ex -commands, not -.CO vi -commands. -In addition, they are interpreted -.i before -the file to be edited is read, and therefore many -.CO ex -commands may not be used. -Generally, any command that requires output to the screen or that -needs a file upon which to operate, will cause an error if included -in a startup file or environmental variable. -.pp -Because the -.CO ex -command set supported by -.EV nex nvi -is a superset of the command set supported by historical implementations of -.CO ex , -.EV nex nvi -can use the startup files created for the historical implementations, -but the converse may not be true. -.pp -If the -.b \-s -(the historic \- option) -is specified, or if standard input is redirected from a file, -all environmental variables and startup files are ignored. -.pp -Otherwise, startup files and environmental variables are handled -in the following order: -.np -The file -.LI /etc/vi.exrc -is read, -as long as it is owned by root or the effective user ID of the user. -.np -The environmental variable -.LI NEXINIT -(or the variable -.LI EXINIT , -if -.LI NEXINIT -is not set) is interpreted. -.np -If neither -.LI NEXINIT -or -.LI EXINIT -was set, and the -.LI HOME -environmental variable is set, the file -.LI $HOME/.nexrc -(or the file -.LI $HOME/.exrc , -if -.LI $HOME/.nexrc -does not exist) is read, -as long as the effective user ID of the user is root or is the same as -the owner of the file. -.sp -When the $HOME directory is being used for both -.EV nex nvi -and an historic implementation of -.EV ex vi , -a possible solution is to put -.EV nex nvi -specific commands in the -.LI \&.nexrc -file, along with a -.CO ":source $HOME/.exrc" -command to read in the commands common to both implementations. -.np -If the -.OP exrc -option was turned on by one of the previous startup information -sources, the file -.LI \&.nexrc -(or the file -.LI \&.exrc , -if -.LI \&.nexrc -does not exist) is read, as long as the effective user ID of the user -is the same as the owner of the file. -.pp -No startup file is read if it is writable by anyone other than its owner. -.pp -It is not an error for any of the startup environmental variables or files -not to exist. -.pp -Once all environmental variables are interpreted, -and all startup files are read, -the first file to be edited is read in (or a temporary file is created). -Then, any commands specified using the -.b \-c -option are executed, in the context of that file. -.SH 1 "Recovery" -.pp -There is no recovery program for -.EV nex nvi , -nor does -.EV nex nvi -run setuid. -Recovery files are created readable and writable by the owner only. -Users may recover any file which they can read, -and the superuser may recover any edit session. -.pp -Edit sessions are backed by files in the directory named by the -.OP recdir -option (the directory -.LI /var/tmp/vi.recover -by default), and are named -.QC vi.XXXXXX , -where -.QC XXXXXX -is a number related to the process ID. -When a file is first modified, -a second recovery file containing an email message for the user is created, -and is named -.QC recover.XXXXXX , -where, again, -.QC XXXXXX -is associated with the process ID. -Both files are removed at the end of a normal edit session, -but will remain if the edit session is abnormally terminated -or the user runs the -.CO ex -.CO preserve -command. -.pp -The -.OP recdir -option may be set in either the user's or system's startup information, -changing the recovery directory. -(Note, however, that if a memory based file system is used as the backup -directory, each system reboot will delete all of the recovery files! -The same caution applies to directories such as -.LI /tmp -which are cleared of their contents by a system reboot, or -.LI /usr/tmp -which is periodically cleared of old files on many systems.) -.pp -The recovery directory should be owned by root, or at least by a pseudo-user. -In addition, if directory -.QQ sticky-bit -semantics are available, the directory should have the sticky-bit -set so that files may only be removed by their owners. -The recovery directory must be read, write, and executable by any user, -i.e. mode 1777. -.pp -If the recovery directory does not exist, -.EV ex vi -will attempt to create it. -This can result in the recovery directory being owned by a normal user, -which means that that user will be able to remove other user's recovery -and backup files. -This is annoying, but is not a security issue as the user cannot -otherwise access or modify the files. -.pp -The recovery file has all of the necessary information in it to enable the -user to recover the edit session. -In addition, it has all of the necessary email headers for -.XR sendmail 8 . -When the system is rebooted, all of the files in -.LI /var/tmp/vi.recover -named -.QC recover.XXXXXX -should be sent to their owners, by email, using the -.b \-t -option of -.CO sendmail -(or a similar mechanism in other mailers). -If -.EV ex vi -receives a hangup (SIGHUP) signal, or the user executes the -.CO ex -.CO preserve -command, -.EV ex vi -will automatically email the recovery information to the user. -.pp -If your system does not have the -.CO sendmail -utility (or a mailer program which supports its interface) -the source file -.LI nvi/common/recover.c -will have to be modified to use your local mail delivery programs. -Note, if -.EV nex nvi -is changed to use another mailer, -it is important to remember that the owner of the file given to -the mailer is the -.EV nex nvi -user, so nothing in the file should be trusted as it may have been -modified in an effort to compromise the system. -.pp -Finally, the owner execute bit is set on backup files when they are -created, and unset when they are first modified, e.g. backup files -that have no associated email recovery file will have this bit set. -(There is also a small window where empty files can be created and -not yet have this bit set. -This is due to the method in which the files are created.) -Such files should be deleted when the system reboots. -.pp -A simple way to do this cleanup is to run the Bourne shell script -.CO recover , -from your -.LI /etc/rc.local -(or other system startup) file. -The script should work with the historic Bourne shell, -a POSIX 1003.2 shell or the Korn shell. -The -.CO recover -script is installed as part of the -.EV nex nvi -installation process. -.pp -Consult the manual page for details on recovering preserved or -aborted editing sessions. -.SH 1 "Sizing the Screen" -.pp -The size of the screen can be set in a number of ways. -.EV Ex vi -takes the following steps until values are obtained for both the -number of rows and number of columns in the screen. -.np -If the environmental variable -.LI LINES -exists, -it is used to specify the number of rows in the screen. -.np -If the environmental variable -.LI COLUMNS -exists, -it is used to specify the number of columns in the screen. -.np -The TIOCGWINSZ -.XR ioctl 2 -is attempted on the standard error file descriptor. -.np -The termcap entry (or terminfo entry on System V machines) -is checked for the -.QQ li -entry (rows) and the -.QQ co -entry (columns). -.np -The number of rows is set to 24, and the number of columns is set to 80. -.pp -If a window change size signal (SIGWINCH) is received, -the new window size is retrieved using the TIOCGWINSZ -.XR ioctl 2 -call, and all other information is ignored. -.SH 1 "Character Display" -.pp -In both -.CO ex -and -.CO vi -printable characters as defined by -.XR isprint 3 -are displayed using the local character set. -.pp -Non-printable characters, for which -.XR iscntrl 3 -returns true, and which are less than octal \e040, -are displayed as the string -.QT ^ , -where -.LI -is the character that is the original character's value offset from the -.QT @ -character. -For example, the octal character \e001 is displayed as -.QT ^A . -If -.XR iscntrl 3 -returns true for the octal character \e177, -it is displayed as the string -.QT ^? . -All other characters are displayed as either hexadecimal values, -in the form -.QT "0x ... 0x" , -or as octal values, in the form -.QT "\e ... \e" . -The display of unknown characters is based on the value of the -.OP octal -option. -.pp -In -.CO vi -command mode, the cursor is always positioned on the last column of -characters which take up more than one column on the screen. -In -.CO vi -text input mode, the cursor is positioned on the first column of -characters which take up more than one column on the screen. -.SH 1 "Multiple Screens" -.pp -.CO Nvi -supports multiple screens by dividing the window into regions. -It also supports stacks of screens by permitting the user to change -the set of screens that are currently displayed. -.pp -The -.CO Edit , -.CO Ex , -.CO Fg , -.CO Next , -.CO Previous , -.CO Tag -and -.CO Visual -(in -.CO vi -mode) -commands divide the current screen into two regions of approximately -equal size and then perform their usual action in a new screen area. -If the cursor is in the lower half of the screen, the screen will split -up, i.e. the new screen will be above the old one. -If the cursor is in the upper half of the screen, the new screen will be -below the old one. -.pp -When more than one screen is editing a file, changes in any screen are -reflected in all other screens editing the same file. -Exiting a screen without saving any changes (or explicitly discarding -them) is permitted until the last screen editing the file is exited, -at which time the changes must be saved or discarded. -.pp -The -.CO resize -command permits resizing of individual screens. -Screens may be grown, shrunk or set to an absolute number of rows. -.pp -The -.CO ^W -command is used to switch between screens. -Each -.CO ^W -moves to the next lower screen in the window, or to the first screen -in the window if there are no lower screens. -.pp -The -.CO bg -command -.QQ backgrounds -the current screen. -The screen disappears from the window, -and the rows it occupied are taken over by a neighboring screen. -It is an error to attempt to background the only screen in the window. -.pp -The -.CO "display screens" -command displays the names of the files associated with the current -backgrounded screens in the window. -.pp -The -.CO "fg [file]" -command moves the specified screen from the list of backgrounded screens -to the foreground. -If no file argument is specified, the first screen on the list is -foregrounded. -By default, -foregrounding consists of backgrounding the current screen, -and replacing its space in the window with the foregrounded screen. -.pp -Capitalizing the first letter of the command, i.e. -.CO Fg , -will foreground the backgrounded screen in a new screen instead of -swapping it with the current screen. -.pp -If the last foregrounded screen in the window is exited, -and there are backgrounded screens, -the first screen on the list of backgrounded screens takes over the window. -.SH 1 "Tags, Tag Stacks, and Cscope" -.pp -.CO Nvi -supports the historic -.CO vi -tag command -.CO , -and the historic -.CO ex -tag command -.CO tag . -These commands change the current file context to a new location, -based on information found in the -.LI tags -files. -If you are unfamiliar with these commands, -you should review their description in the -.CO ex -and -.CO vi -commands section of this manual. -For additional information on tags files, -see the discussion of the -.OP tags -edit option and the system -.XR ctags 1 -manual page. -.pp -In addition, -.CO nvi -supports the notion of -.QQ "tags stacks" , -using the -.CO -command. -The -.CO -command returns the user to the previous context, i.e., -the last place from which a -.CO -or -.CO "tag" -command was entered. -These three commands provide the basic functionality which allows you -to use -.CO vi -to review source code in a structured manner. -.pp -.CO Nvi -also provides two other basic -.CO ex -commands for tag support: -.CO tagpop -and -.CO tagtop . -The -.CO tagpop -command is identical to the -.CO -command, -with the additional functionality that you may specify that modifications -to the current file are to be discarded. -This cannot be done using the -.CO -command. -The -.CO tagtop -command discards all of the contexts that have been pushed onto the tag -stack, returning to the context from which the first -.CO -or -.CO tag -command was entered. -.pp -The historic -.XR ctags 1 -tags file format supports only a single location per tag, -normally the function declaration or structure or string definition. -More sophisticated source code tools often provide multiple locations -per tag, e.g., -a list of the places from which a function is called or a string -definition is used. -An example of this functionality is the System V source code tool, -.CO cscope . -.sp -.CO Cscope -creates a database of information on source code files, -and supports a query language for that information as described in the -.XR cscope 1 -manual page. -.CO Nvi -contains an interface to the -.CO cscope -query language which permits you to query -.CO cscope -and then sequentially step through the locations in the sources files which -.CO cscope -returns. -There are two -.CO nvi -commands which support this ability to step through multiple locations. -They are the -.CO ex -commands -.CO tagnext -and -.CO tagprev . -The -.CO tagnext -command moves to the next location for the current tag. -The -.CO tagprev -command moves to the previous location for the current tag. -(See the -.CO tagnext -and -.CO tagprev -command discussion in the -.CO ex -commands section of this manual for more information.) -At any time during this sequential walk, -you may use the -.CO , -.CO tag -or -.CO cscope -commands to move to a new tag context, and then use the -.CO -or -.CO tagpop -commands to return and continue stepping through the locations for this -tag. -This is similar to the previous model of a simple tag stack, -except that each entry in the tag stack may have more than one file context -that is of interest. -.pp -Although there is no widely distributed version of -.XR ctags 1 -that creates tags files with multiple locations per tag, -.CO nvi -has been written to understand the obvious extension to the historic -tags file format, i.e., more than a single line in the tags file with -the same initial tag name. -If you wish to extend your -.CO ctags -implementation or other tool with which you build tags files, -this extension should be simple and will require no changes to -.CO nvi . -.pp -The -.CO nvi -and -.CO cscope -interface is based on the new -.CO ex -command -.CO cscope , -which has five subcommands: -.CO add , -.CO find , -.CO help , -.CO kill -and -.CO reset . -The subcommand -.CO find -itself has eight subcommands: -.CO \&c , -.CO \&d , -.CO \&e , -.CO \&f , -.CO \&g , -.CO \&i , -.CO \&s -and -.CO \&t . -.pp -.IP "cs[cope] a[dd] file" -The -.CO add -command attaches to the specified -.CO cscope -database. -The file name is expanded using the standard filename expansions. -If -.CO file -is a directory, the file -.QQ cscope.out -in that directory is used as the database. -.pp -After -.CO nvi -attaches to a new database, -all subsequent -.CO cscope -queries will be asked of that database. -The result of any single query is the collection of response to the query -from all of the attached databases. -.sp -If the -.QQ CSCOPE_DIRS -environmental variable is set when -.CO nvi -is run, -it is expected to be a or -separated list of -.CO cscope -databases or directories containing -.CO cscope -databases, to which the user wishes to attach. -.IP ":cs[cope] f[ind] c|d|e|f|g|i|s|t buffer|pattern" -The -.CO find -command is the -.CO cscope -query command for -.CO nvi . -For this command, -.CO nvi -queries all attached -.CO cscope -databases for the pattern. -If the pattern is a double-quote character followed by a valid buffer -name (e.g., -.LI """" ), -then the contents of the named buffer are used as the pattern. -Otherwise, the pattern is a Regular Expression. -.sp -The -.CO find -command pushes the current location onto the tags stack, -and switches to the first location resulting from the query, -if the query returned at least one result. -.sp -File names returned by the -.CO cscope -query, if not absolute paths, are searched for relative to the directory -where the -.CO cscope -database is located. -In addition, if the file -.QQ cscope.tpath -appears in the same directory as the -.CO cscope -database, -it is expected to contain a colon-separated list of directory names -where files referenced by its associated -.CO cscope -database may be found. -.sp -The -.CO find -subcommand is one of the following: -.SS -.SP \&c -Find callers of the name. -.SP \&d -Find all function calls made from name. -.SP \&e -Find pattern. -.SP \&f -Find files with name as substring. -.SP \&g -Find definition of name. -.SP \&i -Find files #including name. -.SP \&s -Find all uses of name. -.SP \&t -Find assignments to name. -.SE -.IP ":cs[cope] h[elp] [command]" -List the -.CO cscope -commands, -or optionally list usage help for any single -.CO cscope -command. -.IP ":display c[onnections]" -Display the list of -.CO cscope -databases to which -.CO nvi -is currently connected. -.IP ":cs[cope] k[ill] #" -Disconnect from a specific -.CO cscope -database. -The connection number is the one displayed by the -.CO ex -.CO "display connections" -command. -.IP ":cs[cope] r[eset]" -Disconnect from all attached -.CO cscope -databases. -.pp -Cscope is not freely redistributable software, -but is fairly inexpensive and easily available. -To purchase a copy of -.CO cscope , -see http://www.att.com/ssg/products/toolchest.html. -.SH 1 "Regular Expressions and Replacement Strings" -.pp -Regular expressions are used in line addresses, -as the first part of the -.CO ex -.CO substitute , -.CO global , -and -.CO v -commands, and in search patterns. -.pp -The regular expressions supported by -.EV ex vi -are, by default, the Basic Regular Expressions (BRE's) described in the -IEEE POSIX Standard 1003.2. -The -.OP extended -option causes all regular expressions to be interpreted as the Extended -Regular Expressions (ERE's) described by the same standard. -(See -.XR re_format 7 -for more information.) -Generally speaking, BRE's are the Regular Expressions found in -.XR ed 1 -and -.XR grep 1 , -and ERE's are the Regular Expressions found in -.XR egrep 1 . -.pp -The following is not intended to provide a description of Regular -Expressions. -The information here only describes strings and characters which -have special meanings in the -.EV ex vi -version of RE's, -or options which change the meanings of characters that normally -have special meanings in RE's. -.np -An empty RE (e.g. -.QT // -or -.QT ?? -is equivalent to the last RE used. -.np -The construct -.QT \e< -matches the beginning of a word. -.np -The construct -.QT \e> -matches the end of a word. -.np -The character -.QT ~ -matches the replacement part of the last -.CO substitute -command. -.pp -When the -.OP magic -option is -.i not -set, the only characters with special meanings are a -.QT ^ -character at the beginning of an RE, a -.QT $ -character at the end of an RE, and the escaping character -.QT \e . -The characters -.QT \&. , -.QT * , -.QT [ -and -.QT ~ -are treated as ordinary characters unless preceded by a -.QT \e ; -when preceded by a -.QT \e -they regain their special meaning. -.pp -Replacement strings are the second part of a -.CO substitute -command. -.pp -The character -.QT & -(or -.QT \e& -if the -.OP magic -option is -.i not -set) in the replacement string stands for the text matched by the RE -that is being replaced. -The character -.QT ~ -(or -.QT \e~ -if the -.OP magic -option is -.i not -set) stands for the replacement part of the previous -.CO substitute -command. -It is only valid after a -.CO substitute -command has been performed. -.pp -The string -.QT \e# , -where -.QT # -is an integer value from 1 to 9, stands for the text matched by -the portion of the RE enclosed in the -.QT # 'th -set of escaped parentheses, e.g. -.QT \e( -and -.QT \e) . -For example, -.QT "s/abc\e(.*\e)def/\e1/" -deletes the strings -.QT abc -and -.QT def -from the matched pattern. -.pp -The strings -.QT \el , -.QT \eu , -.QT \eL -and -.QT \eU -can be used to modify the case of elements in the replacement string. -The string -.QT \el -causes the next character to be converted to lowercase; -the string -.QT \eu -behaves similarly, but converts to uppercase -(e.g. -.LI s/abc/\eU&/ -replaces the string -.LI abc -with -.LI ABC ). -The string -.QT \eL -causes characters up to the end of the string or the next occurrence -of the strings -.QT \ee -or -.QT \eE -to be converted to lowercase; -the string -.QT \eU -behaves similarly, but converts to uppercase. -.pp -If the entire replacement pattern is -.QT % , -then the last replacement pattern is used again. -.pp -In -.CO vi , -inserting a -.LI -into the replacement string will cause -the matched line to be split into two lines at that point. -(The -.LI -will be discarded.) -.SH 1 "Scripting Languages" -.pp -The -.CO nvi -editor currently supports two scripting languages, Tcl/Tk and Perl. -(Note that Perl4 isn't sufficient, and that the Perl5 used must be -version 5.002 or later. -See the -.QB "Building Nvi" -section for more information. -.pp -The scripting language interface is still being worked on, -therefore the following information is probably incomplete, -probably wrong in cases, and likely to change. -See the -.LI perl_api -and -.LI tcl_api -source directories for more information. -As a quick reference, the following function calls are provided for -both the Perl and Tcl interfaces. -The Perl interface uses a slightly different naming convention, -e.g. ``viFindScreen'' is named ``VI::FindScreen''. -.IP "viFindScreen file" -Return the -.LI "screenId" associated with -.LI file . -.IP "viAppendLine screenId lineNumber text" -Append -.LI text -as a new line after line number -.LI lineNumber , -in the screen -.LI screenId . -.IP "viDelLine screenId lineNum" -Delete the line -.LI lineNumber -from the screen -.LI screenId . -.IP "viGetLine screenId lineNumber" -Return the line -.LI lineNumber -from the screen -.LI screenId . -.IP "viInsertLine screenId lineNumber text" -Insert -.LI text -as a new line before line number -.LI lineNumber -in the screen -.LI screenId . -.IP "viLastLine screenId" -Return the line number of the last line in the screen -.LI screenId . -.IP "viSetLine screenId lineNumber text" -Change the line -.LI lineNumber -in the screen -.LI screenId -to match the specified -.LI text . -.IP "viGetMark screenId mark" -Return the current line and column for the specified -.LI mark -from the screen -.LI screenId . -.IP "viSetMark screenId mark line column" -Set the specified -.LI mark -to be at line -.LI line , -column -.LI column , -in the screen -.LI screenId . -.IP "viGetCursor screenId" -Return the current line and column for the cursor in the screen -.LI screenId . -.IP "viSetCursor screenId line column" -Set the cursor in the screen -.LI screenId -to the specified -.LI line -and -.LI column . -.IP "viMsg screenId text" -Display the specified -.LI text -as a vi message in the screen -.LI screenId . -.IP "viNewScreen screenId [file]" -Create a new screen. -.IP "viEndScreen screenId" -Exit the screen -.LI screenId . -.IP "viSwitchScreen screenId screenId" -Switch from the screen -.LI screenId -to the screen -.LI screenId . -.IP "viMapKey screenId key tclproc" -Map the specified -.LI key -in the screen -.LI screenId -to the Tcl procedure -.LI tclproc . -.IP "viUnmMapKey screenId key" -Unmap the specified -.LI key -in the screen -.LI screenId -.IP "viGetOpt screenId option" -Return the value of the specified -.LI option -from the screen -.LI screenId . -.IP "viSetOpt screenId command" -Set one or more options in the screen -.LI screenId . -.SH 1 "General Editor Description" -.pp -When -.CO ex -or -.CO vi -are executed, -the text of a file is read (or a temporary file is created), -and then all editing changes happen within the context of the -copy of the file. -.i "No changes affect the actual file until the file is written out" , -either using a write command or another command which is affected by the -.OP autowrite -option. -.pp -All files are locked (using the -.XR flock 2 -or -.XR fcntl 2 -interfaces) during the edit session, -to avoid inadvertently making modifications to multiple copies of the file. -If a lock cannot be obtained for a file because it is locked by another -process, the edit session is read-only (as if the -.OP readonly -option or the -.b \-R -flag had been specified). -If a lock cannot be obtained for other reasons, the edit session will -continue, but the file status information -(see the -.CO -command) will reflect this fact. -.pp -Both -.CO ex -and -.CO vi -are modeful editors, i.e. they have two modes, -.QQ command -mode and -.QQ "text input" -mode. -The former is intended to permit you to enter commands which modifies -already existing text. -The latter is intended to permit you to enter new text. -When -.CO ex -first starts running, it is in command mode, and usually displays a prompt -(see the -.OP prompt -option for more information). -The prompt is a single colon -.PQ : -character. -There are three commands that switch -.CO ex -into text input mode: -.CO append , -.CO change -and -.CO insert . -Once in input mode, entering a line containing only a single period -.PQ \&. -ends text input mode and returns to command mode, -where the prompt is redisplayed. -.pp -When -.CO vi -first starts running, it is in command mode as well. -There are eleven commands that switch -.CO vi -into text input mode: -.CO A , -.CO a , -.CO C , -.CO c , -.CO I , -.CO i , -.CO O , -.CO o , -.CO R , -.CO S -and -.CO s . -Once in input mode, entering an -.LI -character ends text input mode and returns to command mode. -.pp -.EV Ex vi -present three different interfaces to editing a file. -.CO Ex -presents a line oriented interface. -.CO Vi -presents a full screen display oriented interface, -also known as -.QQ "visual mode" . -In addition, there is a third mode, -.QQ "open mode" , -which is line oriented, -but supports cursor movement and editing within the displayed line, -similarly to visual mode. -Open mode is not yet implemented in -.CO nvi . -.pp -The following words have special meanings in both the -.CO ex -and -.CO vi -command descriptions: -.KY -.IP -The interrupt character is used to interrupt the current operation. -Normally -.LI , -whatever character is set for the current terminal is used. -.KY "" -.IP "" -The literal next character is used to escape the subsequent character -from any special meaning. -This character is always -.LI . -If the terminal is not set up to do XON/XOFF flow control, -then -.LI -is used to mean literal next as well. -.KY "current pathname" -.IP "current pathname" -The pathname of the file currently being edited by vi. -When the percent character -.PQ % -appears in a file name entered as part of an -.CO ex -command argument, it is replaced by the current pathname. -(The -.QT % -character can be escaped by preceding it with a backslash.) -.KY "alternate pathname" -.IP "alternate pathname" -The name of the last file name mentioned in an -.CO ex -command, or, -the previous current pathname if the last file mentioned -becomes the current file. -When the hash mark character -.PQ # -appears in a file name entered as part of an -.CO ex -command argument, it is replaced by the alternate pathname. -(The -.QT # -character can be escaped by preceding it with a backslash.) -.KY buffer -.IP buffer -One of a number of named areas for saving copies of text. -Commands that change or delete text can save the changed or deleted -text into a specific buffer, for later use, if the command allows -it (i.e. the -.CO ex -.CO change -command cannot save the changed text in a named buffer). -Buffers are named with a single character, preceded by a double quote, -e.g. -.LI """" -in -.CO vi -and -without the double quote, e.g. -.LI , -in -.CO ex . -(The double quote isn't necessary for -.CO ex -because buffers names are denoted by their position in the command line.) -Historic implementations of -.EV ex vi -limited -.LI -to the alphanumeric characters; -.EV nex nvi -permits the use of any character without another meaning in the position -where a buffer name is expected. -.sp -Buffers named by uppercase characters are the same as buffers -named by lowercase characters, e.g. the buffer named by the -English character -.QT A -is the same as the buffer named by the character -.QT a , -with the exception that, if the buffer contents are being changed (as -with a text deletion or -.CO vi -.CO change -command), the text is -.i appended -to the buffer, instead of replacing the current contents. -.sp -The buffers named by the numeric characters (in English, -.QT 1 -through -.QT 9 ), -are special. -If a region of text including characters from more than one line, -or a single line of text specified by using a line-oriented motion, -is changed or deleted in the file using the -.CO vi -.CO change -or -.CO delete -commands, a copy of the text is placed into the numeric buffer -.QT 1 , -regardless of the user specifying another buffer in which to save it. -In addition, there are a few commands which, when used as a -.LI motion -with the -.CO vi -.CO change -and -.CO delete -commands, -.i always -copy the specified region of text into the numeric buffers regardless -of the region including characters from more than one line. -These commands are: -.sp -.ne 3v -.ft C -.TS -r r r r. - % ( ) -` / ? N -n { } -.TE -.ft R -.sp -Before this copy is done, the previous contents of buffer -.QT 1 -are moved into buffer -.QT 2 , -.QT 2 -into buffer -.QT 3 , -and so on. -The contents of buffer -.QT 9 -are discarded. -In -.CO vi , -text may be explicitly stored into the numeric buffers. -In this case, the buffer rotation described above occurs before the -replacement of the buffer's contents. -The numeric buffers are only available in -.LI visual -and -.LI open -modes, -and are not accessible by -.CO ex -in any way, although changed and deleted text is still stored there -while in -.CO ex -mode. -.sp -When a -.CO vi -command synopsis shows both a -.LI [buffer] -and a -.LI [count] , -they may be presented in any order. -.sp -Finally, all buffers are either -.QQ line -or -.QQ character -oriented. -All -.CO ex -commands which store text into buffers are line oriented. -Some -.CO vi -commands which store text into buffers are line oriented, -and some are character oriented; the description for each applicable -.CO vi -command notes whether text copied into buffers using the command -is line or character oriented. -In addition, the -.CO vi -command -.CO "display buffers" -displays the current orientation for each buffer. -Generally, the only importance attached to this orientation is that -if the buffer is subsequently inserted into the text, line oriented -buffers create new lines for each of the lines they contain, and -character oriented buffers create new lines for any lines -.i other -than the first and last lines they contain. -The first and last lines are inserted into the text at the current -cursor position, becoming part of the current line. -If there is more than one line in the buffer, however, the current -line itself will be split. -.KY "unnamed buffer" -.IP "unnamed buffer" -The unnamed buffer is a text storage area which is used by commands -that use or operate on a buffer when no buffer is specified by the user. -If the command stores text into a buffer, -the text is stored into the unnamed buffer even if a buffer is also -specified by the user. -It is not possible to append text to the unnamed buffer. -If text is appended to a named buffer, -the named buffer contains both the old and new text, -while the unnamed buffer contains only the new text. -There is no way to explicitly reference the unnamed buffer. -.sp -Historically, the contents of the unnamed buffer were discarded by many -different commands, even ones that didn't store text into it. -.EV Nex nvi -never discards the contents of the unnamed buffer until new text -replaces them. -.KY whitespace -.IP whitespace -The characters and . -.KY "" -.IP "" -The character represented by an ASCII -.LI . -This character is almost always treated identically to a -.LI -character, but differs in that it can be escaped into the file text or -into a command. -.KY -.IP -The character represented by an ASCII -.LI . -This character is almost always treated identically to a -.LI -character, but differs in that it cannot be escaped into the file text or -into a command. -.oh 'Vi/Ex Reference (Vi Commands)''USD:13-%' -.eh 'USD:13-%''Vi/Ex Reference (Vi Commands)' -.so vi.cmd.roff -.oh 'Vi/Ex Reference''USD:13-%' -.eh 'USD:13-%''Vi/Ex Reference' -.SH 1 "Ex Addressing" -.pp -Addressing in -.CO ex -(and when -.CO ex -commands are executed from -.CO vi ) -relates to the current line. -In general, the current line is the last line affected by a command. -The exact effect on the current line is discussed under the description -of each command. -When the file contains no lines, the current line is zero. -.pp -Addresses are constructed by one or more of the following methods: -.np -The address -.QT \&. -refers to the current line. -.np -The address -.QT $ -refers to the last line of the file. -.np -The address -.QT N , -where -.LI N -is a positive number, refers to the N-th line of the file. -.np -The address -.QT ' -or -.QT ` -refers to the line marked with the name -.LI . -(See the -.CO k -or -.CO m -commands for more information on how to mark lines.) -.np -A regular expression (RE) enclosed by slashes -.PQ / -is an address, -and it refers to the first line found by searching forward from the line -.i after -the current line toward the end of the file, and stopping at the -first line containing a string matching the RE. -(The trailing slash can be omitted at the end of the command line.) -.sp -If no RE is specified, i.e. the pattern is -.QT // , -the last RE used in any command is used in the search. -.sp -If the -.OP extended -option is set, the RE is handled as an extended RE, not a basic RE. -If the -.OP wrapscan -option is set, the search wraps around to the beginning of the file -and continues up to and including the current line, so that the entire -file is searched. -.sp -The form -.QT \e/ -is accepted for historic reasons, -and is identical to -.QT // . -.np -An RE enclosed in question marks -.PQ ? -addresses the first line found by searching backward from the line -.i preceding -the current line, toward the beginning of the file and stopping at the -first line containing a string matching the RE. -(The trailing question mark can be omitted at the end of a command line.) -.sp -If no RE is specified, i.e. the pattern is -.QT ?? , -the last RE used in any command is used in the search. -.sp -If the -.OP extended -option is set, the RE is handled as an extended RE, not a basic RE. -If the -.OP wrapscan -option is set, the search wraps around from the beginning of the file to -the end of the file and continues up to and including the current line, -so that the entire file is searched. -.sp -The form -.QT \e? -is accepted for historic reasons, and is identical to -.QT ?? . -.np -An address followed by a plus sign -.PQ + -or a minus sign -.PQ - -followed by a number is an offset address and refers to the address -plus (or minus) the indicated number of lines. -If the address is omitted, the addition or subtraction is done with -respect to the current line. -.np -An address of -.QT + -or -.QT \- -followed by a number is an offset from the current line. -For example, -.QT \-5 -is the same as -.QT \&.\-5 . -.np -An address ending with -.QT + -or -.QT - -has 1 added to or subtracted from the address, respectively. -As a consequence of this rule and of the previous rule, the address -.QT \- -refers to the line preceding the current line. -Moreover, trailing -.QT + -and -.QT \- -characters have a cumulative effect. -For example, -.QT ++\-++ -refers to the current line plus 3. -.np -A percent sign -.PQ % -is equivalent to the address range -.QT 1,$ . -.pp -.CO Ex -commands require zero, one, or two addresses. -It is an error to specify an address to a command which requires zero -addresses. -.pp -If the user provides more than the expected number of addresses to any -.CO ex -command, the first addresses specified are discarded. -For example, -.QT 1,2,3,5 print -prints lines 3 through 5, because the -.CO print -command only takes two addresses. -.pp -The addresses in a range are separated from each other by a comma -.PQ , -or a semicolon -.PQ ; . -In the latter case, the current line -.PQ \&. -is set to the first address, and only then is the second address calculated. -This feature can be used to determine the starting line for forward and -backward searches (see rules (5) and (6) above). -The second address of any two-address sequence corresponds to a line that -follows, in the file, the line corresponding to the first address. -The first address must be less than or equal to the second address. -The first address must be greater than or equal to the first line of the -file, and the last address must be less than or equal to the last line -of the file. -.oh 'Vi/Ex Reference (Ex Commands)''USD:13-%' -.eh 'USD:13-%''Vi/Ex Reference (Ex Commands)' -.so ex.cmd.roff -.oh 'Vi/Ex Reference (Options)''USD:13-%' -.eh 'USD:13-%''Vi/Ex Reference (Options)' -.so set.opt.roff -.oh 'Vi/Ex Reference''USD:13-%' -.eh 'USD:13-%''Vi/Ex Reference' -.bp -.SH 1 Index -.lp -.2c +0.5i 3 -.ta \n($luR -.nf -.so index.so -.fi -.\" Force the TOC to an odd page, in case it's a duplex printer. -.if o .bp -.bp 3 -.1c -.ce 1 -\fB\s+2Table of Contents\s0\fP -.sp -.xp diff --git a/docs/USD.doc/vitut/Makefile b/docs/USD.doc/vitut/Makefile deleted file mode 100644 index 3d4aca0a64e6..000000000000 --- a/docs/USD.doc/vitut/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -# @(#)Makefile 8.7 (Berkeley) 8/18/96 - -MACROS= -ms -ROFF= groff -TBL= tbl - -all: vitut.ps summary.ps viapwh.ps - -vitut.ps: vi.in vi.chars - ${TBL} vi.in vi.chars | ${ROFF} ${MACROS} > $@ - chmod 444 $@ - -summary.ps: vi.summary - ${TBL} vi.summary | ${ROFF} ${MACROS} > $@ - chmod 444 $@ - -viapwh.ps: vi.apwh.ms - ${TBL} vi.apwh.ms | ${ROFF} ${MACROS} > $@ - chmod 444 $@ - -clean: - rm -f vitut.ps summary.ps viapwh.ps diff --git a/docs/USD.doc/vitut/vi.apwh.ms b/docs/USD.doc/vitut/vi.apwh.ms deleted file mode 100644 index 6b0763055ca9..000000000000 --- a/docs/USD.doc/vitut/vi.apwh.ms +++ /dev/null @@ -1,1081 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)vi.apwh.ms 8.2 (Berkeley) 8/18/96 -.\" -.nr LL 6.5i -.nr FL 6.5i -.TL -Vi Command & Function Reference -.AU CB 2675 -Alan P.W. Hewett -.sp -Revised for version 2.12 by Mark Horton -.CB -.NH 1 -Author's Disclaimer -.LP -This document does not claim to be 100% complete. There are a -few commands listed in the original document that I was unable -to test either because I do not speak \fBlisp\fR, because they -required programs we don't have, or because I wasn't able to make -them work. In these cases I left the command out. The commands -listed in this document have been tried and are known to work. -It is expected that prospective users of this document will read -it once to get the flavor of everything that \fBvi\fR can do -and then use it as a reference document. Experimentation is -recommended. If you don't understand a command, try it and -see what happens. -.LP -[Note: In revising this document, I have attempted to make it -completely reflect version 2.12 of -.B vi . -It does not attempt to document the VAX version (version 3), -but with one or two exceptions (wrapmargin, arrow keys) -everything said about 2.12 should apply to 3.1. -.I "Mark Horton" ] -.NH 1 -Notation -.LP -\fB[option]\fR is used to denote optional parts of a command. -Many \fBvi\fR commands have an optional count. \fB[cnt]\fR -means that an optional number may precede the command to -multiply or iterate the command. -\fB{variable item}\fR is used to denote parts of the command -which must appear, but can take a number of different values. -\fB\fR means that the character or -one of the characters in the range described between the -two angle brackets is to be typed. -For example \fB\fR means -the \fBescape\fR key is to be typed. \fB\fR means that a -lower case letter is to be typed. \fB^\fR means that -the character is to be typed as a \fBcontrol\fR character, that is, -with the \fB\fR key held down while simultaneously typing -the specified character. In this document control characters will -be denoted using the \fIupper case\fR character, but -^ and ^ are equivalent. That is, for -example, \fB<^D>\fR is equal to \fB<^d>\fR. -The most common character abbreviations -used in this list are as follows: -.VL 8 -.IP 8 -escape, octal 033 -.IP 8 -carriage return, ^M, octal 015 -.IP 8 -linefeed ^J, octal 012 -.IP 8 -newline, ^J, octal 012 (same as linefeed) -.IP 8 -backspace, ^H, octal 010 -.IP 8 -tab, ^I, octal 011 -.IP 8 -bell, ^G, octal 07 -.IP 8 -formfeed, ^L, octal 014 -.IP 8 -space, octal 040 -.IP 8 -delete, octal 0177 -.LE -.sp 1 -.NH 1 -Basics -.LP -To run \fBvi\fR the shell variable \fBTERM\fR must be defined and -exported to your environment. -How you do this depends on which shell you are using. -You can tell which shell you have by the character it -prompts you for commands with. -The Bourne shell prompts with `$', and the C shell prompts with `%'. -For these examples, we will suppose -that you are using an HP 2621 terminal, whose termcap name is ``2621''. -.NH 2 -Bourne Shell -.LP -To manually set your terminal type to 2621 you would type: -.DS -TERM=2621 -export TERM -.DE -.PP -There are various ways of having this automatically or -semi-automatically done when you log in. -Suppose you usually dial in on a 2621. -You want to tell this to the machine, but still have it -work when you use a hardwired terminal. -The recommended way, if you have the -.B tset -program, is to use the sequence -.DS -tset \-s \-d 2621 > tset$$ -\&. tset$$ -rm tset$$ -.DE -in your .login (for csh) or the same thing using `.' instead of `source' -in your .profile (for sh). -The above line says that if you are dialing in you are on a 2621, -but if you are on a hardwired terminal it figures out your terminal -type from an on-line list. -.NH 2 -The C Shell -.LP -To manually set your terminal type to 2621 you would type: -.DS -setenv TERM 2621 -.DE -.PP -There are various ways of having this automatically or -semi-automatically done when you log in. -Suppose you usually dial in on a 2621. -You want to tell this to the machine, but still have it -work when you use a hardwired terminal. -The recommended way, if you have the -.B tset -program, is to use the sequence -.DS -tset \-s \-d 2621 > tset$$ -source tset$$ -rm tset$$ -.DE -in your .login.* -.FS -* On a version 6 system -without environments, the invocation of tset -is simpler, just add the line ``tset \-d 2621'' -to your .login or .profile. -.FE -The above line says that if you are dialing in you are on a 2621, -but if you are on a hardwired terminal it figures out your terminal -type from an on-line list. -.NH 1 -Normal Commands -.LP -\fBVi\fR is a visual editor with a window on the file. What -you see on the screen is \fBvi\fR's current notion of -what your file will contain, -(at this point in the file), -when it is written out. -Most commands do not cause any change in the screen until the -complete command is typed. Should you get confused while -typing a command, you can abort the command by typing an - character. You will know you are back to command level -when you hear a . Usually typing an will produce the -same result. When \fBvi\fR gets an improperly formatted command -it rings the . -Following are the \fBvi\fR commands broken down by function. -.NH 2 -Entry and Exit -.LP -To enter -.B vi -on a particular -.I file , -type -.DS -\fBvi\fP \fIfile\fP -.DE -The file will be read in and the cursor will be placed at the beginning -of the first line. -The first screenfull of the file will be displayed on the terminal. -.PP -To get out of the editor, type -.DS -ZZ -.DE -If you are in some special mode, such as input mode -or the middle of a multi-keystroke command, it may -be necessary to type first. -.NH 2 -Cursor and Page Motion -.LP -.VL 16 -.B NOTE: -The arrow keys (see the next four commands) -on certain kinds of terminals will not work with the -PDP-11 version of vi. The control versions or the hjkl versions will -work on any terminal. Experienced users prefer the hjkl keys because -they are always right under their fingers. Beginners often prefer -the arrow keys, since they do not require memorization of which hjkl -key is which. -The mnemonic value of hjkl is clear from looking at the keyboard of an adm3a. -.sp -.IP "[cnt] or [cnt]h or [cnt]\(<-" 16 -.br -Move the cursor to the left one character. Cursor stops at the left -margin of the page. -If cnt is given, these commands move that many spaces. -.IP "[cnt]^N or [cnt]j or [cnt]\(da or [cnt]" 16 -.br -Move down one line. -Moving off the screen scrolls the window to force a new line -onto the screen. -Mnemonic: \fBN\fRext -.IP "[cnt]^P or [cnt]k or [cnt]\(ua" 16 -.br -Move up one line. -Moving off the top of the screen forces new text onto the screen. -Mnemonic: \fBP\fRrevious -.IP "[cnt] or [cnt]l or [cnt]\(->" 16 -.br -Move to the right one character. -Cursor will not go beyond the end of the line. -.IP [cnt]- 16 -Move the cursor up the screen to the beginning of the next line. -Scroll if necessary. -.IP "[cnt]+ or [cnt]" 16 -.sp 1 -Move the cursor down the screen to the beginning of the next line. -Scroll up if necessary. -.IP "[cnt]$" 16 -Move the cursor to the end of the line. -If there is a count, move to the end of the line "cnt" lines -forward in the file. -.IP "^" 16 -Move the cursor to the beginning of the first word on the line. -.IP "0" 16 -Move the cursor to the left margin of the current line. -.IP "[cnt]|" 16 -Move the cursor to the column specified by the count. The default is -column zero. -.IP "[cnt]w" 16 -Move the cursor to the beginning of the next word. If there -is a count, then move forward that many words and -position the cursor at the beginning of the word. -Mnemonic: next-\fBw\fRord -.IP "[cnt]W" 16 -Move the cursor to the beginning of the next word which follows -a "white space" (,, or ). Ignore other punctuation. -.IP "[cnt]b" 16 -Move the cursor to the preceding word. Mnemonic: \fBb\fRackup-word -.IP "[cnt]B" 16 -Move the cursor to the preceding word that is separated from the -current word by a "white space" (,, or ). -.IP "[cnt]e" 16 -Move the cursor to the end of the current word or the end of the -"cnt"'th word hence. Mnemonic: \fBe\fRnd-of-word -.IP "[cnt]E" 16 -Move the cursor to the end of the current word which is delimited by -"white space" (,, or ). -.IP "[line number]G" 16 -.br -Move the cursor to the line specified. Of particular use are the -sequences "1G" and "G", which move the cursor to the beginning and -the end of the file respectively. Mnemonic: \fBG\fRo-to -.LP -.B NOTE: -The next four commands (^D, ^U, ^F, ^B) -are not true motion commands, in that they -cannot be used as the object of commands such as delete or change. -.IP "[cnt]^D" 16 -Move the cursor down in the file by "cnt" lines (or the last "cnt" -if a new count isn't given. The initial default is half a page.) The -screen is simultaneously scrolled up. Mnemonic: \fBD\fRown -.IP "[cnt]^U" 16 -Move the cursor up in the file by "cnt" lines. The screen is simultaneously -scrolled down. Mnemonic: \fBU\fRp -.IP "[cnt]^F" 16 -Move the cursor to the next page. A count moves that many pages. -Two lines of the previous page are kept on the screen for continuity if -possible. Mnemonic: \fBF\fRorward-a-page -.IP "[cnt]^B" 16 -Move the cursor to the previous page. Two lines of the current page -are kept if possible. Mnemonic: \fBB\fRackup-a-page -.IP "[cnt](" 16 -Move the cursor to the beginning of the next sentence. -A sentence is defined as ending with a ".", "!", or "?" -followed by two spaces or a . -.IP "[cnt])" 16 -Move the cursor backwards to the beginning of a sentence. -.IP "[cnt]}" 16 -Move the cursor to the beginning of the next paragraph. This command -works best inside \fBnroff\fR documents. It understands two sets of -\fBnroff\fR macros, \fB\-ms\fR and \fB\-mm\fR, for which the -commands ".IP", ".LP", ".PP", ".QP", "P", as well as the nroff command ".bp" -are considered to be paragraph delimiters. -A blank line also delimits a paragraph. -The \fBnroff\fR macros that it accepts as paragraph delimiters is -adjustable. See \fBparagraphs\fR under the \fBSet Commands\fR section. -.IP "[cnt]{" 16 -Move the cursor backwards to the beginning of a paragraph. -.IP "]]" 16 -Move the cursor to the next "section", where a section is defined by -two sets of \fBnroff\fR macros, \fB\-ms\fR and \fB\-mm\fR, in which -".NH", ".SH", and ".H" delimit a section. A line beginning with a -sequence, or a line beginning with a "{" are also considered to -be section delimiters. The last option makes it -useful for finding the beginnings of C functions. -The \fBnroff\fR macros that are used for section delimiters can be adjusted. -See \fBsections\fR under the \fBSet Commands\fR section. -.IP "[[" 16 -Move the cursor backwards to the beginning of a section. -.IP "%" 16 -Move the cursor to the matching parenthesis -or brace. This is very useful in C or lisp code. If the -cursor is sitting on a \fB( ) {\fR or \fB}\fR the cursor -is moved to the matching character at the other end of the -section. If the cursor is not sitting on a brace or a -parenthesis, \fBvi\fR searches forward until it finds one -and then jumps to the match mate. -.IP "[cnt]H" 16 -If there is no count move the cursor to the top left position on the screen. -If there is a count, then move the cursor to the beginning of the line -"cnt" lines from the top of the screen. Mnemonic: \fBH\fRome -.IP "[cnt]L" 16 -If there is no count move the cursor to the beginning -of the last line on the screen. -If there is a count, then move the cursor to the beginning of the line -"cnt" lines from the bottom of the screen. Mnemonic: \fBL\fRast -.IP "M" 16 -Move the cursor to the beginning of the middle line on the screen. -Mnemonic: \fBM\fRiddle -.IP "m" 16 -This command does not move the cursor, but it \fBmarks\fR the place -in the file and the character "" becomes the label for referring -to this location in the file. See the next two commands. Mnemonic: -\fBm\fRark -.B NOTE: -The mark command is not a motion, and cannot be used as the target -of commands such as delete. -.IP "\(aa" 16 -Move the cursor to the beginning of the line that is marked with the label -"". -.IP "\(ga" 16 -Move the cursor to the exact position on the line that was marked with -with the label "". -.IP "\(aa\(aa" 16 -Move the cursor back to the beginning of the line where it was before the -last "non-relative" move. A "non-relative" move is something such as a -search or a jump to a specific line in the file, rather than moving the -cursor or scrolling the screen. -.IP "\(ga\(ga" 16 -Move the cursor back to the exact spot on the line where it was located -before the last "non-relative" move. -.LE -.NH 2 -Searches -.LP -The following commands allow you to search for items in a file. -.VL 16 -.IP [cnt]f{chr} 16 -.sp 1 -Search forward on the line for the next or "cnt"'th occurrence of -the character "chr". The cursor is placed \fBat\fR the character -of interest. Mnemonic: \fBf\fRind character -.IP [cnt]F{chr} 16 -.sp 1 -Search backwards on the line for the next or "cnt"'th occurrence of -the character "chr". The cursor is placed \fBat\fR the character -of interest. -.IP [cnt]t{chr} 16 -.sp 1 -Search forward on the line for the next or "cnt"'th occurrence of -the character "chr". The cursor is placed \fBjust preceding\fR -the character of interest. Mnemonic: move cursor up \fBt\fRo character -.IP [cnt]T{chr} 16 -.sp 1 -Search backwards on the line for the next or "cnt"'th occurrence of -the character "chr". The cursor is placed \fBjust preceding\fR -the character of interest. -.IP "[cnt];" 16 -Repeat the last "f", "F", "t" or "T" command. -.IP "[cnt]," 16 -Repeat the last "f", "F", "t" or "T" command, but in the opposite -search direction. This is useful if you overshoot. -.IP "[cnt]/[string]/" 16 -.br -Search forward for the next occurrence of "string". -Wrap around at the end of the file -does occur. -The final \fB\fR is not required. -.IP "[cnt]?[string]?" 16 -.br -Search backwards for the next occurrence of "string". If a count is -specified, the count becomes the new window size. Wrap around at the beginning -of the file does occur. -The final \fB\fR is not required. -.IP n 16 -Repeat the last /[string]/ or ?[string]? search. Mnemonic: \fBn\fRext -occurrence. -.IP N 16 -Repeat the last /[string]/ or ?[string]? search, but in the reverse -direction. -.IP ":g/[string]/[editor command]" 16 -.sp 1 -Using the \fB:\fR syntax it is possible to do global searches ala the -standard UNIX "ed" editor. -.LE -.NH 2 -Text Insertion -.LP -The following commands allow for the insertion of text. All multicharacter -text insertions are terminated with an character. -The last change -can always be \fBundone\fR by typing a \fBu\fR. -The text insert in insertion mode can contain newlines. -.VL 16 -.IP a{text} 16 -Insert text immediately following the cursor position. -Mnemonic: \fBa\fRppend -.IP A{text} 16 -Insert text at the end of the current line. -Mnemonic: \fBA\fRppend -.IP i{text} 16 -Insert text immediately preceding the cursor position. -Mnemonic: \fBi\fRnsert -.IP I{text} 16 -Insert text at the beginning of the current line. -.IP o{text} 16 -Insert a new line after the line on which the cursor appears and -insert text there. Mnemonic: \fBo\fRpen new line -.IP O{text} 16 -Insert a new line preceding the line on which the cursor appears -and insert text there. -.LE -.NH 2 -Text Deletion -.LP -The following commands allow the user to delete text in various ways. -All changes can always be \fBundone\fR by typing the \fBu\fR command. -.VL 16 -.IP "[cnt]x" 16 -Delete the character or characters starting at the cursor position. -.IP "[cnt]X" 16 -Delete the character or characters starting at the character preceding -the cursor position. -.IP "D" 16 -Deletes the remainder of the line starting at the cursor. -Mnemonic: \fBD\fRelete the rest of line -.IP "[cnt]d{motion}" 16 -.br -Deletes one or more occurrences of the specified motion. -Any motion from sections 4.1 and 4.2 can be used here. -The d can be stuttered (e.g. [cnt]dd) to delete cnt lines. -.LE -.NH 2 -Text Replacement -.LP -The following commands allow the user to simultaneously delete and -insert new text. All such actions can be \fBundone\fR by typing -\fBu\fR following the command. -.VL 16 -.IP "r" 16 -Replaces the character at the current cursor position with . This -is a one character replacement. No is required for termination. -Mnemonic: \fBr\fReplace character -.IP "R{text}" 16 -Starts overlaying the characters on the screen with whatever you type. -It does not stop until an is typed. -.IP "[cnt]s{text}" 16 -Substitute for "cnt" characters beginning at the current cursor -position. A "$" will appear at the position in the text where the -"cnt"'th character appears so you will know how much you are erasing. -Mnemonic: \fBs\fRubstitute -.IP "[cnt]S{text}" 16 -Substitute for the entire current line (or lines). If no count is given, -a "$" appears at the end of the current line. If a count of more than -1 is given, all the lines to be replaced are deleted before the insertion -begins. -.IP "[cnt]c{motion}{text}" 16 -.br -Change the specified "motion" by replacing it with the -insertion text. A "$" will appear at the end of the last item -that is being deleted unless the deletion involves whole lines. -Motion's can be any motion from sections 4.1 or 4.2. -Stuttering the c (e.g. [cnt]cc) changes cnt lines. -.LE -.NH 2 -Moving Text -.LP -\fBVi\fR provides a number of ways of moving chunks of text around. -There are nine buffers into which each piece of text which is deleted -or "yanked" is put in addition to the "undo" buffer. -The most recent deletion or yank is in the "undo" buffer and also -usually in buffer -1, the next most recent in buffer 2, and so forth. Each new deletion -pushes down all the older deletions. Deletions older than 9 -disappear. There is also -a set of named registers, a-z, into which text can optionally -be placed. If any delete or replacement type command is preceded -by \fB"\fR, that named buffer will contain the text deleted -after the command is executed. For example, \fB"a3dd\fR will delete -three lines starting at the current line and put them in buffer \fB"a\fR.* -.FS -* Referring to an upper case letter as a buffer name (A-Z) is the -same as referring to the lower case letter, except that text placed -in such a buffer is appended to it instead of replacing it. -.FE -There are two more basic commands and -some variations useful in getting and putting text into a file. -.VL 16 -.IP ["][cnt]y{motion} 16 -.sp 1 -Yank the specified item or "cnt" items and put in the "undo" buffer or -the specified buffer. The variety of "items" that can be yanked -is the same as those that can be deleted with the "d" command or -changed with the "c" command. In the same way that "dd" means -delete the current line and "cc" means replace the current line, -"yy" means yank the current line. -.IP ["][cnt]Y 16 -Yank the current line or the "cnt" lines starting from the current -line. If no buffer is specified, they will go into the "undo" buffer, -like any delete would. It is equivalent to "yy". -Mnemonic: \fBY\fRank -.IP ["]p 16 -Put "undo" buffer or the specified buffer down \fBafter\fR the cursor. -If whole lines were yanked or deleted into the buffer, then they will be -put down on the line following the line the cursor is on. If -something else was deleted, like a word or sentence, then it will -be inserted immediately following the cursor. -Mnemonic: \fBp\fRut buffer -.IP -It should be noted that text in the named buffers remains there when you -start editing a new file with the \fB:e file\fR command. Since -this is so, it is possible to copy or delete text from one file and -carry it over to another file in the buffers. -However, the undo buffer and the ability to undo are lost when -changing files. -.IP ["]P 16 -Put "undo" buffer or the specified buffer down \fBbefore\fR the cursor. -If whole lines where yanked or deleted into the buffer, then they will be -put down on the line preceding the line the cursor is on. If -something else was deleted, like a word or sentence, then it will -be inserted immediately preceding the cursor. -.IP [cnt]>{motion} 16 -The shift operator will right shift all the text from the line on which -the cursor is located to the line where the \fBmotion\fR is located. -The text is shifted by one \fBshiftwidth\fR. (See section 6.) -\fB>>\fR means right shift the current line or lines. -.IP [cnt]<{motion} 16 -The shift operator will left shift all the text from the line on which -the cursor is located to the line where the \fBitem\fR is located. -The text is shifted by one \fBshiftwidth\fR. (See section 6.) -\fB<<\fR means left shift the current line or lines. -Once the line has reached the left margin it is not further affected. -.IP [cnt]={motion} 16 -Prettyprints the indicated area according to -.B lisp -conventions. -The area should be a lisp s-expression. -.LE -.NH 2 -Miscellaneous Commands -.LP -\fBVi\fR has a number of miscellaneous commands that are very -useful. They are: -.VL 16 -.IP ZZ 16 -This is the normal way to exit from vi. -If any changes have been made, the file is written out. -Then you are returned to the shell. -.IP ^L 16 -Redraw the current screen. This is useful if someone "write"s you -while you are in "vi" or if for any reason garbage gets onto the -screen. -.IP ^R 16 -On dumb terminals, those not having the "delete line" function -(the vt100 is such a terminal), \fBvi\fR saves redrawing the -screen when you delete a line by just marking the line with an -"@" at the beginning and blanking the line. If you want to -actually get rid of the lines marked with "@" and see what the -page looks like, typing a ^R will do this. -.IP \s+4.\s0 16 -"Dot" is a particularly useful command. It repeats the last -text modifying command. Therefore you can type a command once and -then to another place and repeat it by just typing ".". -.IP u 16 -Perhaps the most important command in the editor, -u undoes the last command that changed the buffer. -Mnemonic: \fBu\fRndo -.IP U 16 -Undo all the text modifying commands performed on the current line -since the last time you moved onto it. -.IP [cnt]J 16 -Join the current line and the following line. The is deleted -and the two lines joined, usually with a space between the -end of the first line and the beginning of what was the second -line. If the first line ended with a "period", then two spaces -are inserted. -A count joins the next cnt lines. -Mnemonic: \fBJ\fRoin lines -.IP Q 16 -Switch to \fBex\fR editing mode. -In this mode \fBvi\fR will behave very much like \fBed\fR. -The editor in this mode will operate on single lines normally and -will not attempt to keep the "window" up to date. -Once in this mode it is also possible to switch to the \fBopen\fR -mode of editing. By entering the command \fB[line number]open\fR -you enter this mode. It is similar to the normal visual mode -except the window is only \fBone\fR line long. -Mnemonic: \fBQ\fRuit visual mode -.IP ^] 16 -An abbreviation for a tag command. -The cursor should be positioned at the beginning of a word. -That word is taken as a tag name, and the tag with that -name is found as if it had been typed in a :tag command. -.IP [cnt]!{motion}{UNIX\ cmd} 16 -.br -Any UNIX filter -(e.g. command that reads the standard input and outputs something -to the standard output) can be sent a section of the current file and -have the output of the command replace the original text. Useful -examples are programs like \fBcb\fR, \fBsort\fR, and -\fBnroff\fR. For instance, using \fBsort\fR it would be possible to -sort a section of the current file into a new list. -Using \fB!!\fR means take a line or lines starting at the line the -cursor is currently on and pass them to the UNIX command. -.B NOTE: -To just escape to the shell for one command, -use :!{cmd}, see section 5. -.IP z{cnt} 16 -This resets the current window size to "cnt" lines and redraws the screen. -.LE -.NH 2 -Special Insert Characters -.LP -There are some characters that have special meanings during -insert modes. They are: -.VL 16 -.IP ^V 16 -During inserts, typing a ^V allows you to quote control characters -into the file. Any character typed after the ^V will be inserted -into the file. -.IP [^]^D\ or\ [0]^D 16 -<^D> without any argument backs up one \fBshiftwidth\fR. This is necessary -to remove indentation that was inserted by the \fBautoindent\fR feature. -^<^D> temporarily removes all the autoindentation, thus placing the cursor -at the left margin. On the next line, the previous indent level will be -restored. This is useful for putting "labels" at the left margin. -0<^D> says remove all autoindents and stay that way. Thus the cursor -moves to the left margin and stays there on successive lines until -'s are typed. As with the , the <^D> is only effective before -any other "non-autoindent" controlling characters are typed. -Mnemonic: \fBD\fRelete a shiftwidth -.IP ^W 16 -If the cursor is sitting on a word, <^W> moves the cursor back to the beginning -of the word, thus erasing the word from the insert. -Mnemonic: erase \fBW\fRord -.IP 16 -The backspace always serves as an erase during insert modes in addition -to your normal "erase" character. To insert a into your file, use -the <^V> to quote it. -.LE -.NH 1 -\fB:\fR Commands -.LP -Typing a ":" during command mode causes \fBvi\fR to put the cursor at -the bottom on the screen in preparation for a command. In the -":" mode, \fBvi\fR can be given most \fBed\fR commands. It is -also from this mode that you exit from \fBvi\fR or switch to different -files. All commands of this variety are terminated by a , , -or . -.VL 16 -.IP ":w[!] [file]" 16 -Causes \fBvi\fR to write out the current text to the disk. It is -written to the file you are editing unless "file" is supplied. If -"file" is supplied, the write is directed to that file instead. If -that file already exists, \fBvi\fR will not perform the write unless -the "!" is supplied indicating you -.I really -want to destroy the older copy of the file. -.IP :q[!] 16 -Causes \fBvi\fR to exit. If you have modified the file you are -looking at currently and haven't written it out, \fBvi\fR will -refuse to exit unless the "!" is supplied. -.IP ":e[!] [+[cmd]] [file]" 16 -.sp 1 -Start editing a new file called "file" or start editing the current -file over again. The command ":e!" says "ignore the changes I've made -to this file and start over from the beginning". It is useful if -you really mess up the file. The optional "+" says instead of starting -at the beginning, start at the "end", or, -if "cmd" is supplied, execute "cmd" first. -Useful cases of this are where cmd is "n" (any integer) which starts -at line number n, -and "/text", which searches for "text" and starts at the line where -it is found. -.IP "^^" 16 -Switch back to the place you were before your last tag command. -If your last tag command stayed within the file, ^^ returns to that tag. -If you have no recent tag command, it will return to the -same place in the previous file that it was showing when you switched -to the current file. -.IP ":n[!]" 16 -Start editing the next file in the argument list. Since \fBvi\fR -can be called with multiple file names, the ":n" command tells it to -stop work on the current file and switch to the next file. If the -current file was modifies, it has to be written out before the ":n" -will work or else the "!" must be supplied, which says discard the -changes I made to the current file. -.IP ":n[!] file [file file ...]" 16 -.sp -Replace the current argument list with a new list of files and start -editing the first file in this new list. -.IP ":r file" 16 -Read in a copy of "file" on the line after the cursor. -.IP ":r !cmd" 16 -Execute the "cmd" and take its output and put it into the file after -the current line. -.IP ":!cmd" 16 -Execute any UNIX shell command. -.IP ":ta[!] tag" 16 -.B Vi -looks in the file named -.B tags -in the current directory. -.B Tags -is a file of lines in the format: -.sp 1 -.ti +8 -tag filename \fBvi\fR-search-command -.sp 1 -If \fBvi\fR finds the tag you specified in the \fB:ta\fR command, -it stops editing the current file if necessary and if the current file is -up to date on the disk and switches to the file specified and uses the -search pattern specified to find the "tagged" item of interest. This -is particularly useful when editing multi-file C programs such as the -operating system. There is a program called \fBctags\fR which will -generate an appropriate \fBtags\fR file for C and f77 -programs so that by saying -\fB:ta function\fR you will be switched to that function. -It could also be useful when editing multi-file documents, though the -\fBtags\fR file would have to be generated manually. -.LE -.NH 1 -Special Arrangements for Startup -.PP -\fBVi\fR takes the value of \fB$TERM\fR and looks up the characteristics -of that terminal in the file \fB/etc/termcap\fR. -If you don't know \fBvi\fR's name for the terminal you are working -on, look in \fB/etc/termcap\fR. -.PP -When \fBvi\fR starts, it attempts to read the variable EXINIT -from your environment.* -If that exists, it takes the values in it as the default values -for certain of its internal constants. See the section on "Set Values" -for further details. -If EXINIT doesn't exist you will get all the normal defaults. -.FS -* On version 6 systems -Instead of EXINIT, put the startup commands in the file .exrc -in your home directory. -.FE -.PP -Should you inadvertently hang up the phone while inside -.B vi , -or should the computer crash, -all may not be lost. -Upon returning to the system, type: -.DS -vi \-r file -.DE -This will normally recover the file. If there is more than one -temporary file for a specific file name, \fBvi\fR recovers the -newest one. You can get an older version by recovering the -file more than once. -The command "vi -r" without a file name gives you the list of files -that were saved in the last system crash -(but -.I not -the file just saved when the phone was hung up). -.NH 1 -Set Commands -.LP -\fBVi\fR has a number of internal variables and switches which can be -set to achieve special affects. -These options come in three forms, those that are switches, which toggle -from off to on and back, those that require a numeric value, and those -that require an alphanumeric string value. -The toggle options are set by a command of the form: -.DS -:set option -.DE -and turned off with the command: -.DS -:set nooption -.DE -Commands requiring a value are set with a command of the form: -.DS -:set option=value -.DE -To display the value of a specific option type: -.DS -:set option? -.DE -To display only those that you have changed type: -.DS -:set -.DE -and to display the long table of all the settable parameters and -their current values type: -.DS -:set all -.DE -.PP -Most of the options have a long form and an abbreviation. Both are -listed in the following table as well as the normal default value. -.PP -To arrange to have values other than the default used every time you -enter -.B vi , -place the appropriate -.B set -command in EXINIT in your environment, e.g. -.DS -EXINIT='set ai aw terse sh=/bin/csh' -export EXINIT -.DE -or -.DS -setenv EXINIT 'set ai aw terse sh=/bin/csh' -.DE -for -.B sh -and -.B csh , -respectively. -These are usually placed in your .profile or .login. -If you are running a system without environments (such as version 6) -you can place the set command in the file .exrc in your home -directory. -.VL 16 -.IP autoindent\ ai 16 -Default: noai Type: toggle -.br -When in autoindent mode, vi helps you indent code by starting each -line in the same column as the preceding line. -Tabbing to the right with or <^T> will move this boundary to -the right, and it can be moved to the left with <^D>. -.IP autoprint\ ap 16 -Default: ap Type: toggle -.br -Causes the current line to be printed after each ex text modifying command. -This is not of much interest in the normal \fBvi\fR visual mode. -.IP autowrite\ aw 16 -Default: noaw type: toggle -.br -Autowrite causes an automatic write to be done if there are unsaved -changes before certain commands which change files or otherwise -interact with the outside world. -These commands are :!, :tag, :next, :rewind, ^^, and ^]. -.IP beautify\ bf 16 -Default: nobf Type: toggle -.br -Causes all control characters except , , and to be discarded. -.IP directory\ dir 16 -Default: dir=/tmp Type: string -.br -This is the directory in which \fBvi\fR puts its temporary file. -.IP errorbells\ eb 16 -Default: noeb Type: toggle -.br -Error messages are preceded by a . -.IP hardtabs\ ht 16 -Default: hardtabs=8 Type: numeric -.br -This option contains the value of hardware tabs in your terminal, or -of software tabs expanded by the Unix system. -.IP ignorecase\ ic 16 -Default: noic Type: toggle -.br -All upper case characters are mapped to lower case in regular expression -matching. -.IP lisp 16 -Default: nolisp Type: toggle -.br -Autoindent for \fBlisp\fR code. The commands \fB( ) [[\fR and \fB]]\fR -are modified appropriately to affect s-expressions and functions. -.IP list 16 -Default: nolist Type: toggle -.br -All printed lines have the and characters displayed visually. -.IP magic 16 -Default: magic Type: toggle -.br -Enable the metacharacters for matching. These include \fB. * < > [string] -[^string]\fR and \fB[-]\fR. -.IP number\ nu 16 -Default: nonu Type: toggle -.br -Each line is displayed with its line number. -.IP open 16 -Default: open Type: toggle -.br -When set, prevents entering open or visual modes from ex or edit. -Not of interest from vi. -.IP optimize\ opt 16 -Default: opt Type: toggle -.br -Basically of use only when using the \fBex\fR capabilities. This -option prevents automatic s from taking place, -and speeds up output of indented lines, -at the expense of losing typeahead on some versions of UNIX. -.IP paragraphs\ para 16 -Default: para=IPLPPPQPP\ bp Type: string -.br -Each pair of characters in the string indicate \fBnroff\fR macros -which are to be treated as the beginning of a paragraph for the -\fB{\fR and \fB}\fR commands. The default string is for the \fB-ms\fR -and \fB-mm\fR macros. -To indicate one letter \fBnroff\fR macros, such as \fB.P\fR or \fB.H\fR, -quote a space in for the second character position. For example: -.sp 1 -.ti +8 -:set paragraphs=P\e bp -.sp 1 -would cause \fBvi\fR to consider \fB.P\fR and \fB.bp\fR as paragraph -delimiters. -.IP prompt 16 -Default: prompt Type: toggle -.br -In -.B ex -command mode the prompt character \fB:\fR will be printed when -\fBex\fR is waiting for a command. This is not of interest from vi. -.IP redraw 16 -Default: noredraw Type: toggle -.br -On dumb terminals, force the screen to always be up to date, -by sending great amounts of output. Useful only at high speeds. -.IP report 16 -Default: report=5 Type: numeric -.br -This sets the threshold for the number of lines modified. When -more than this number of lines are modified, removed, or yanked, -\fBvi\fR will report the number of lines changed at the bottom of -the screen. -.IP scroll 16 -Default: scroll={1/2 window} Type: numeric -.br -This is the number of lines that the screen scrolls up or down when -using the <^U> and <^D> commands. -.IP sections 16 -Default: sections=SHNHH HU Type: string -.br -Each two character pair of this string specify \fBnroff\fR macro names -which are to be treated as the beginning of a section by the -\fB]]\fR and \fB[[\fR commands. The default string is for the \fB-ms\fR -and \fB-mm\fR macros. -To enter one letter \fBnroff\fR macros, use a quoted space as the -second character. -See \fBparagraphs\fR for a fuller explanation. -.IP shell\ sh 16 -Default: sh=from environment SHELL or /bin/sh Type: string -.br -This is the name of the \fBsh\fR to be used for "escaped" commands. -.IP shiftwidth\ sw 16 -Default: sw=8 Type: numeric -.br -This is the number of spaces that a <^T> or <^D> will move over for -indenting, and the amount < and > shift by. -.IP showmatch\ sm 16 -Default: nosm Type: toggle -.br -When a \fB)\fR or \fB}\fR is typed, show the matching \fB(\fR or \fB{\fR -by moving the cursor to it for one second if it is on the current screen. -.IP slowopen\ slow 16 -Default: terminal dependent Type: toggle -.br -On terminals that are slow and unintelligent, this option prevents the -updating of the screen some of the time to improve speed. -.IP tabstop\ ts 16 -Default: ts=8 Type: numeric -.br -s are expanded to boundaries that are multiples of this value. -.IP taglength\ tl 16 -Default: tl=0 Type: numeric -.br -If nonzero, tag names are only significant to this many characters. -.IP term 16 -Default: (from environment \fBTERM\fP, else dumb) Type: string -.br -This is the terminal and controls the visual displays. It cannot be -changed when in "visual" mode, -you have to Q to command mode, type a -set term command, and do ``vi.'' to get back into visual. -Or exit vi, fix $TERM, and reenter. -The definitions that drive a particular -terminal type are found in the file \fB/etc/termcap\fR. -.IP terse 16 -Default: terse Type: toggle -.br -When set, the error diagnostics are short. -.IP warn 16 -Default: warn Type: toggle -.br -The user is warned if she/he tries to escape to -the shell without writing out the current changes. -.IP window 16 -Default: window={8 at 600 baud or less, 16 at 1200 baud, and screen -size \- 1 at 2400 baud or more} Type: numeric -.br -This is the number of lines in the window whenever \fBvi\fR must redraw -an entire screen. It is useful to make this size smaller if you are -on a slow line. -.IP w300,\ w1200,\ w9600 -.br -These set window, but only within the corresponding speed ranges. -They are useful in an EXINIT to fine tune window sizes. -For example, -.DS -set w300=4 w1200=12 -.DE -causes a 4 lines window at speed up to 600 baud, a 12 line window at 1200 -baud, and a full screen (the default) at over 1200 baud. -.IP wrapscan\ ws 16 -Default: ws Type: toggle -.br -Searches will wrap around the end of the file when is option is set. When -it is off, the search will terminate when it reaches the end or the -beginning of the file. -.IP wrapmargin\ wm 16 -Default: wm=0 Type: numeric -.br -\fBVi\fR will automatically insert a when it finds a natural -break point (usually a between words) that occurs within -"wm" spaces of the right margin. -Therefore with "wm=0" the option is off. Setting it to 10 would -mean that any time you are within 10 spaces of the right margin -\fBvi\fR would be looking for a or which it could -replace with a . This is convenient for people who forget -to look at the screen while they type. -(In version 3, wrapmargin behaves more like nroff, in that the -boundary specified by the distance from the right edge of the screen -is taken as the rightmost edge of the area where a break is allowed, -instead of the leftmost edge.) -.IP writeany\ wa 16 -Default: nowa Type: toggle -.br -\fBVi\fR normally makes a number of checks before it writes out a file. -This prevents the user from inadvertently destroying a file. When the -"writeany" option is enabled, \fBvi\fR no longer makes these checks. -.LE diff --git a/docs/USD.doc/vitut/vi.chars b/docs/USD.doc/vitut/vi.chars deleted file mode 100644 index 7941065d1d0f..000000000000 --- a/docs/USD.doc/vitut/vi.chars +++ /dev/null @@ -1,645 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)vi.chars 8.3 (Berkeley) 6/27/96 -.\" -.bd S 3 -.pn 21 -.de iP -.IP "\fB\\$1\fR" \\$2 -.. -.SH -Appendix: character functions -.PP -This appendix gives the uses the editor makes of each character. The -characters are presented in their order in the \s-2ASCII\s0 character -set: Control characters come first, then most special characters, then -the digits, upper and then lower case characters. -.PP -For each character we tell a meaning it has as a command and any meaning it -has during an insert. -If it has only meaning as a command, then only this is discussed. -Section numbers in parentheses indicate where the character is discussed; -a `f' after the section number means that the character is mentioned -in a footnote. -.iP "^@" 15 -Not a command character. -If typed as the first character of an insertion it is replaced with the -last text inserted, and the insert terminates. Only 128 characters are -saved from the last insert; if more characters were inserted the mechanism -is not available. -A \fB^@\fR cannot be part of the file due to the editor implementation -(7.5f). -.iP "^A" 15 -Unused. -.iP "^B" 15 -Backward window. -A count specifies repetition. -Two lines of continuity are kept if possible (2.1, 6.1, 7.2). -.iP "^C" 15 -Unused. -.iP "^D" 15 -As a command, scrolls down a half-window of text. -A count gives the number of (logical) lines to scroll, and is remembered -for future \fB^D\fR and \fB^U\fR commands (2.1, 7.2). -During an insert, backtabs over \fIautoindent\fR white space at the beginning -of a line (6.6, 7.5); this white space cannot be backspaced over. -.iP "^E" 15 -Exposes one more line below the current screen in the file, leaving -the cursor where it is if possible. -(Version 3 only.) -.iP "^F" 15 -Forward window. A count specifies repetition. -Two lines of continuity are kept if possible (2.1, 6.1, 7.2). -.iP "^G" 15 -Equivalent to \fB:f\fR\s-2CR\s0, printing the current file, whether -it has been modified, the current line number and the number of lines -in the file, and the percentage of the way through the file that you -are. -.iP "^H (\fR\s-2BS\s0\fP)" 15 -Same as -.B "left arrow" . -(See -.B h ). -During an insert, eliminates the last input character, backing over it -but not erasing it; it remains so you can see what you typed if you -wish to type something only slightly different (3.1, 7.5). -.iP "^I\ (\fR\s-2TAB\s0\fP)" 15 -Not a command character. -When inserted it prints as some -number of spaces. -When the cursor is at a tab character it rests at the last of the spaces -which represent the tab. -The spacing of tabstops is controlled by the \fItabstop\fR option (4.1, 6.6). -.iP "^J\ (\fR\s-2LF\s0\fP)" 15 -Same as -.B "down arrow" -(see -.B j ). -.iP "^K" 15 -Unused. -.iP "^L" 15 -The \s-2ASCII\s0 formfeed character, this causes the screen to be cleared -and redrawn. This is useful after a transmission error, if characters -typed by a program other than the editor scramble the screen, -or after output is stopped by an interrupt (5.4, 7.2f). -.ne 1i -.iP "^M\ (\fR\s-2CR\s0\fP)" 15 -A carriage return advances to the next line, at the first non-white position -in the line. Given a count, it advances that many lines (2.3). -During an insert, a \s-2CR\s0 causes the insert to continue onto -another line (3.1). -.iP "^N" 15 -Same as -.B "down arrow" -(see -.B j ). -.iP "^O" 15 -Unused. -.iP "^P" 15 -Same as -.B "up arrow" -(see -.B k ). -.iP "^Q" 15 -Not a command character. -In input mode, -.B ^Q -quotes the next character, the same as -.B ^V , -except that some teletype drivers will eat the -.B ^Q -so that the editor never sees it. -.iP "^R" 15 -Redraws the current screen, eliminating logical lines not corresponding -to physical lines (lines with only a single @ character on them). -On hardcopy terminals in \fIopen\fR mode, retypes the current line -(5.4, 7.2, 7.8). -.iP "^S" 15 -Unused. Some teletype drivers use -.B ^S -to suspend output until -.B ^Q is pressed. -.iP "^T" 15 -Not a command character. -During an insert, with \fIautoindent\fR set and at the beginning of the -line, inserts \fIshiftwidth\fR white space. -.iP "^U" 15 -Scrolls the screen up, inverting \fB^D\fR which scrolls down. Counts work as -they do for \fB^D\fR, and the previous scroll amount is common to both. -On a dumb terminal, \fB^U\fR will often necessitate clearing and redrawing -the screen further back in the file (2.1, 7.2). -.iP "^V" 15 -Not a command character. -In input mode, quotes the next character so that it is possible -to insert non-printing and special characters into the file (4.2, 7.5). -.iP "^W" 15 -Not a command character. -During an insert, backs up as \fBb\fR would in command mode; the deleted -characters remain on the display (see \fB^H\fR) (7.5). -.iP "^X" 15 -Unused. -.iP "^Y" 15 -Exposes one more line above the current screen, leaving the cursor where -it is if possible. (No mnemonic value for this key; however, it is next -to \fB^U\fR which scrolls up a bunch.) -(Version 3 only.) -.iP "^Z" 15 -If supported by the Unix system, -stops the editor, exiting to the top level shell. -Same as \fB:stop\fP\s-2CR\s0. -Otherwise, unused. -.iP "^[\ (\fR\s-2ESC\s0\fP)" 15 -Cancels a partially formed command, such as a \fBz\fR when no following -character has yet been given; terminates inputs on the last line (read -by commands such as \fB: /\fR and \fB?\fR); ends insertions of new text -into the buffer. -If an \s-2ESC\s0 is given when quiescent in command state, the editor -rings the bell or flashes the screen. You can thus hit \s-2ESC\s0 if -you don't know what is happening till the editor rings the bell. -If you don't know if you are in insert mode you can type \s-2ESC\s0\fBa\fR, -and then material to be input; the material will be inserted correctly -whether or not you were in insert mode when you started (1.5, 3.1, 7.5). -.iP "^\e" 15 -Unused. -.iP "^]" 15 -Searches for the word which is after the cursor as a tag. Equivalent -to typing \fB:ta\fR, this word, and then a \s-2CR\s0. -Mnemonically, this command is ``go right to'' (7.3). -.iP "^\(ua" 15 -Equivalent to \fB:e #\fR\s-2CR\s0, returning to the previous position -in the last edited file, or editing a file which you specified if you -got a `No write since last change diagnostic' and do not want to have -to type the file name again (7.3). -(You have to do a \fB:w\fR before \fB^\(ua\fR -will work in this case. If you do not wish to write the file you should -do \fB:e!\ #\fR\s-2CR\s0 instead.) -.iP "^_" 15 -Unused. -Reserved as the command character for the -Tektronix 4025 and 4027 terminal. -.iP "\fR\s-2SPACE\s0\fP" 15 -Same as -.B "right arrow" -(see -.B l ). -.iP "!" 15 -An operator, which processes lines from the buffer with reformatting commands. -Follow \fB!\fR with the object to be processed, and then the command name -terminated by \s-2CR\s0. Doubling \fB!\fR and preceding it by a count -causes count lines to be filtered; otherwise the count -is passed on to the object after the \fB!\fR. Thus \fB2!}\fR\fIfmt\fR\s-2CR\s0 -reformats the next two paragraphs by running them through the program -\fIfmt\fR. If you are working on \s-2LISP\s0, -the command \fB!%\fR\fIgrind\fR\s-2CR\s0,* -.FS -*Both -.I fmt -and -.I grind -are Berkeley programs and may not be present at all installations. -.FE -given at the beginning of a -function, will run the text of the function through the \s-2LISP\s0 grinder -(6.7, 7.3). -To read a file or the output of a command into the buffer use \fB:r\fR (7.3). -To simply execute a command use \fB:!\fR (7.3). -.tr " -.iP  15 -Precedes a named buffer specification. There are named buffers \fB1\-9\fR -used for saving deleted text and named buffers \fBa\-z\fR into which you can -place text (4.3, 6.3) -.tr  -.iP "#" 15 -The macro character which, when followed by a number, will substitute -for a function key on terminals without function keys (6.9). -In input mode, -if this is your erase character, it will delete the last character -you typed in input mode, and must be preceded with a \fB\e\fR to insert -it, since it normally backs over the last input character you gave. -.iP "$" 15 -Moves to the end of the current line. If you \fB:se list\fR\s-2CR\s0, -then the end of each line will be shown by printing a \fB$\fR after the -end of the displayed text in the line. Given a count, advances to the -count'th following end of line; thus \fB2$\fR advances to the end of the -following line. -.iP "%" 15 -Moves to the parenthesis or brace \fB{ }\fR which balances the parenthesis -or brace at the current cursor position. -.iP "&" 15 -A synonym for \fB:&\fR\s-2CR\s0, by analogy with the -.I ex -.B & -command. -.iP "\(aa" 15 -When followed by a \fB\(aa\fR returns to the previous context at the -beginning of a line. The previous context is set whenever the current -line is moved in a non-relative way. -When followed by a letter \fBa\fR\-\fBz\fR, returns to the line which -was marked with this letter with a \fBm\fR command, at the first non-white -character in the line. (2.2, 5.3). -When used with an operator such as \fBd\fR, the operation takes place -over complete lines; if you use \fB\(ga\fR, the operation takes place -from the exact marked place to the current cursor position within the -line. -.iP "(" 15 -Retreats to the beginning of a -sentence, or to the beginning of a \s-2LISP\s0 s-expression -if the \fIlisp\fR option is set. -A sentence ends at a \fB. !\fR or \fB?\fR which is followed by either -the end of a line or by two spaces. Any number of closing \fB) ] "\fR -and \fB\(aa\fR characters may appear after the \fB. !\fR or \fB?\fR, -and before the spaces or end of line. Sentences also begin -at paragraph and section boundaries -(see \fB{\fR and \fB[[\fR below). -A count advances that many sentences (4.2, 6.8). -.iP ")" 15 -Advances to the beginning of a sentence. -A count repeats the effect. -See \fB(\fR above for the definition of a sentence (4.2, 6.8). -.iP "*" 15 -Unused. -.iP "+" 15 -Same as \s-2CR\s0 when used as a command. -.iP "," 15 -Reverse of the last \fBf F t\fR or \fBT\fR command, looking the other way -in the current line. Especially useful after hitting too many \fB;\fR -characters. A count repeats the search. -.iP "\-" 15 -Retreats to the previous line at the first non-white character. -This is the inverse of \fB+\fR and \s-2RETURN\s0. -If the line moved to is not on the screen, the screen is scrolled, or -cleared and redrawn if this is not possible. -If a large amount of scrolling would be required the screen is also cleared -and redrawn, with the current line at the center (2.3). -.iP "\&." 15 -Repeats the last command which changed the buffer. Especially useful -when deleting words or lines; you can delete some words/lines and then -hit \fB.\fR to delete more and more words/lines. -Given a count, it passes it on to the command being repeated. Thus after -a \fB2dw\fR, \fB3.\fR deletes three words (3.3, 6.3, 7.2, 7.4). -.iP "/" 15 -Reads a string from the last line on the screen, and scans forward for -the next occurrence of this string. The normal input editing sequences may -be used during the input on the bottom line; an returns to command state -without ever searching. -The search begins when you hit \s-2CR\s0 to terminate the pattern; -the cursor moves to the beginning of the last line to indicate that the search -is in progress; the search may then -be terminated with a \s-2DEL\s0 or \s-2RUB\s0, or by backspacing when -at the beginning of the bottom line, returning the cursor to -its initial position. -Searches normally wrap end-around to find a string -anywhere in the buffer. -.IP -When used with an operator the enclosed region is normally affected. -By mentioning an -offset from the line matched by the pattern you can force whole lines -to be affected. To do this give a pattern with a closing -a closing \fB/\fR and then an offset \fB+\fR\fIn\fR or \fB\-\fR\fIn\fR. -.IP -To include the character \fB/\fR in the search string, you must escape -it with a preceding \fB\e\fR. -A \fB\(ua\fR at the beginning of the pattern forces the match to occur -at the beginning of a line only; this speeds the search. A \fB$\fR at -the end of the pattern forces the match to occur at the end of a line -only. -More extended pattern matching is available, see section 7.4; -unless you set \fBnomagic\fR in your \fI\&.exrc\fR file you will have -to preceed the characters \fB. [ *\fR and \fB~\fR in the search pattern -with a \fB\e\fR to get them to work as you would naively expect (1.5, 2,2, -6.1, 7.2, 7.4). -.iP "0" 15 -Moves to the first character on the current line. -Also used, in forming numbers, after an initial \fB1\fR\-\fB9\fR. -.iP "1\-9" 15 -Used to form numeric arguments to commands (2.3, 7.2). -.iP ":" 15 -A prefix to a set of commands for file and option manipulation and escapes -to the system. Input is given on the bottom line and terminated with -an \s-2CR\s0, and the command then executed. You can return to where -you were by hitting \s-2DEL\s0 or \s-2RUB\s0 if you hit \fB:\fR accidentally -(see primarily 6.2 and 7.3). -.iP ";" 15 -Repeats the last single character find which used \fBf F t\fR or \fBT\fR. -A count iterates the basic scan (4.1). -.iP "<" 15 -An operator which shifts lines left one \fIshiftwidth\fR, normally 8 -spaces. Like all operators, affects lines when repeated, as in -\fB<<\fR. Counts are passed through to the basic object, thus \fB3<<\fR -shifts three lines (6.6, 7.2). -.iP "=" 15 -Reindents line for \s-2LISP\s0, as though they were typed in with \fIlisp\fR -and \fIautoindent\fR set (6.8). -.iP ">" 15 -An operator which shifts lines right one \fIshiftwidth\fR, normally 8 -spaces. Affects lines when repeated as in \fB>>\fR. Counts repeat the -basic object (6.6, 7.2). -.iP "?" 15 -Scans backwards, the opposite of \fB/\fR. See the \fB/\fR description -above for details on scanning (2.2, 6.1, 7.4). -.iP "@" 15 -A macro character (6.9). If this is your kill character, you must escape it with a \e -to type it in during input mode, as it normally backs over the input you -have given on the current line (3.1, 3.4, 7.5). -.iP "A" 15 -Appends at the end of line, a synonym for \fB$a\fR (7.2). -.iP "B" 15 -Backs up a word, where words are composed of non-blank sequences, placing -the cursor at the beginning of the word. A count repeats the effect -(2.4). -.iP "C" 15 -Changes the rest of the text on the current line; a synonym for \fBc$\fR. -.iP "D" 15 -Deletes the rest of the text on the current line; a synonym for \fBd$\fR. -.iP "E" 15 -Moves forward to the end of a word, defined as blanks and non-blanks, -like \fBB\fR and \fBW\fR. A count repeats the effect. -.iP "F" 15 -Finds a single following character, backwards in the current line. -A count repeats this search that many times (4.1). -.iP "G" 15 -Goes to the line number given as preceding argument, or the end of the -file if no preceding count is given. The screen is redrawn with the -new current line in the center if necessary (7.2). -.iP "H" 15 -.B "Home arrow" . -Homes the cursor to the top line on the screen. If a count is given, -then the cursor is moved to the count'th line on the screen. -In any case the cursor is moved to the first non-white character on the -line. If used as the target of an operator, full lines are affected -(2.3, 3.2). -.iP "I" 15 -Inserts at the beginning of a line; a synonym for \fB\(uai\fR. -.iP "J" 15 -Joins together lines, supplying appropriate white space: one space between -words, two spaces after a \fB.\fR, and no spaces at all if the first -character of the joined on line is \fB)\fR. A count causes that many -lines to be joined rather than the default two (6.5, 7.1f). -.iP "K" 15 -Unused. -.iP "L" 15 -Moves the cursor to the first non-white character of the last line on -the screen. With a count, to the first non-white of the count'th line -from the bottom. Operators affect whole lines when used with \fBL\fR -(2.3). -.iP "M" 15 -Moves the cursor to the middle line on the screen, at the first non-white -position on the line (2.3). -.iP "N" 15 -Scans for the next match of the last pattern given to -\fB/\fR or \fB?\fR, but in the reverse direction; this is the reverse -of \fBn\fR. -.iP "O" 15 -Opens a new line above the current line and inputs text there up to an -\s-2ESC\s0. A count can be used on dumb terminals to specify a number -of lines to be opened; this is generally obsolete, as the \fIslowopen\fR -option works better (3.1). -.iP "P" 15 -Puts the last deleted text back before/above the cursor. The text goes -back as whole lines above the cursor if it was deleted as whole lines. -Otherwise the text is inserted between the characters before and at the -cursor. May be preceded by a named buffer specification \fB"\fR\fIx\fR -to retrieve the contents of the buffer; buffers \fB1\fR\-\fB9\fR contain -deleted material, buffers \fBa\fR\-\fBz\fR are available for general -use (6.3). -.iP "Q" 15 -Quits from \fIvi\fR to \fIex\fR command mode. In this mode, whole lines -form commands, ending with a \s-2RETURN\s0. You can give all the \fB:\fR -commands; the editor supplies the \fB:\fR as a prompt (7.7). -.iP "R" 15 -Replaces characters on the screen with characters you type (overlay fashion). -Terminates with an \s-2ESC\s0. -.iP "S" 15 -Changes whole lines, a synonym for \fBcc\fR. A count substitutes for -that many lines. The lines are saved in the numeric buffers, and erased -on the screen before the substitution begins. -.iP "T" 15 -Takes a single following character, locates the character before the -cursor in the current line, and places the cursor just after that character. -A count repeats the effect. Most useful with operators such as \fBd\fR -(4.1). -.iP "U" 15 -Restores the current line to its state before you started changing it -(3.5). -.iP "V" 15 -Unused. -.iP "W" 15 -Moves forward to the beginning of a word in the current line, -where words are defined as sequences of blank/non-blank characters. -A count repeats the effect (2.4). -.iP "X" 15 -Deletes the character before the cursor. A count repeats the effect, -but only characters on the current line are deleted. -.iP "Y" 15 -Yanks a copy of the current line into the unnamed buffer, to be put back -by a later \fBp\fR or \fBP\fR; a very useful synonym for \fByy\fR. -A count yanks that many lines. May be preceded by a buffer name to put -lines in that buffer (7.4). -.iP "ZZ" 15 -Exits the editor. -(Same as \fB:x\fP\s-2CR\s0.) -If any changes have been made, the buffer is written out to the current file. -Then the editor quits. -.iP "[[" 15 -Backs up to the previous section boundary. A section begins at each -macro in the \fIsections\fR option, -normally a `.NH' or `.SH' and also at lines which which start -with a formfeed \fB^L\fR. Lines beginning with \fB{\fR also stop \fB[[\fR; -this makes it useful for looking backwards, a function at a time, in C -programs. If the option \fIlisp\fR is set, stops at each \fB(\fR at the -beginning of a line, and is thus useful for moving backwards at the top -level \s-2LISP\s0 objects. (4.2, 6.1, 6.6, 7.2). -.iP "\e" 15 -Unused. -.iP "]]" 15 -Forward to a section boundary, see \fB[[\fR for a definition (4.2, 6.1, -6.6, 7.2). -.iP "\(ua" 15 -Moves to the first non-white position on the current line (4.4). -.iP "_" 15 -Unused. -.iP "\(ga" 15 -When followed by a \fB\(ga\fR returns to the previous context. -The previous context is set whenever the current -line is moved in a non-relative way. -When followed by a letter \fBa\fR\-\fBz\fR, returns to the position which -was marked with this letter with a \fBm\fR command. -When used with an operator such as \fBd\fR, the operation takes place -from the exact marked place to the current position within the line; -if you use \fB\(aa\fR, the operation takes place over complete lines -(2.2, 5.3). -.iP "a" 15 -Appends arbitrary text after the current cursor position; the insert -can continue onto multiple lines by using \s-2RETURN\s0 within the insert. -A count causes the inserted text to be replicated, but only if the inserted -text is all on one line. -The insertion terminates with an \s-2ESC\s0 (3.1, 7.2). -.iP "b" 15 -Backs up to the beginning of a word in the current line. A word is a -sequence of alphanumerics, or a sequence of special characters. -A count repeats the effect (2.4). -.iP "c" 15 -An operator which changes the following object, replacing it with the -following input text up to an \s-2ESC\s0. If more than part of a single -line is affected, the text which is changed away is saved in the numeric named -buffers. If only part of the current line is affected, then the last -character to be changed away is marked with a \fB$\fR. -A count causes that many objects to be affected, thus both -\fB3c)\fR and \fBc3)\fR change the following three sentences (7.4). -.iP "d" 15 -An operator which deletes the following object. If more than part of -a line is affected, the text is saved in the numeric buffers. -A count causes that many objects to be affected; thus \fB3dw\fR is the -same as \fBd3w\fR (3.3, 3.4, 4.1, 7.4). -.iP "e" 15 -Advances to the end of the next word, defined as for \fBb\fR and \fBw\fR. -A count repeats the effect (2.4, 3.1). -.iP "f" 15 -Finds the first instance of the next character following the cursor on -the current line. A count repeats the find (4.1). -.iP "g" 15 -Unused. -.sp -Arrow keys -.B h , -.B j , -.B k , -.B l , -and -.B H . -.iP "h" 15 -.B "Left arrow" . -Moves the cursor one character to the left. -Like the other arrow keys, either -.B h , -the -.B "left arrow" -key, or one of the synonyms (\fB^H\fP) has the same effect. -On v2 editors, arrow keys on certain kinds of terminals -(those which send escape sequences, such as vt52, c100, or hp) -cannot be used. -A count repeats the effect (3.1, 7.5). -.iP "i" 15 -Inserts text before the cursor, otherwise like \fBa\fR (7.2). -.iP "j" 15 -.B "Down arrow" . -Moves the cursor one line down in the same column. -If the position does not exist, -.I vi -comes as close as possible to the same column. -Synonyms include -.B ^J -(linefeed) and -.B ^N . -.iP "k" 15 -.B "Up arrow" . -Moves the cursor one line up. -.B ^P -is a synonym. -.iP "l" 15 -.B "Right arrow" . -Moves the cursor one character to the right. -\s-2SPACE\s0 is a synonym. -.iP "m" 15 -Marks the current position of the cursor in the mark register which is -specified by the next character \fBa\fR\-\fBz\fR. Return to this position -or use with an operator using \fB\(ga\fR or \fB\(aa\fR (5.3). -.iP "n" 15 -Repeats the last \fB/\fR or \fB?\fR scanning commands (2.2). -.iP "o" 15 -Opens new lines below the current line; otherwise like \fBO\fR (3.1). -.iP "p" 15 -Puts text after/below the cursor; otherwise like \fBP\fR (6.3). -.iP "q" 15 -Unused. -.iP "r" 15 -Replaces the single character at the cursor with a single character you -type. The new character may be a \s-2RETURN\s0; this is the easiest -way to split lines. A count replaces each of the following count characters -with the single character given; see \fBR\fR above which is the more -usually useful iteration of \fBr\fR (3.2). -.iP "s" 15 -Changes the single character under the cursor to the text which follows -up to an \s-2ESC\s0; given a count, that many characters from the current -line are changed. The last character to be changed is marked with \fB$\fR -as in \fBc\fR (3.2). -.iP "t" 15 -Advances the cursor upto the character before the next character typed. -Most useful with operators such as \fBd\fR and \fBc\fR to delete the -characters up to a following character. You can use \fB.\fR to delete -more if this doesn't delete enough the first time (4.1). -.iP "u" 15 -Undoes the last change made to the current buffer. If repeated, will -alternate between these two states, thus is its own inverse. When used -after an insert which inserted text on more than one line, the lines are -saved in the numeric named buffers (3.5). -.iP "v" 15 -Unused. -.iP "w" 15 -Advances to the beginning of the next word, as defined by \fBb\fR (2.4). -.iP "x" 15 -Deletes the single character under the cursor. With a count deletes -deletes that many characters forward from the cursor position, but only -on the current line (6.5). -.iP "y" 15 -An operator, yanks the following object into the unnamed temporary buffer. -If preceded by a named buffer specification, \fB"\fR\fIx\fR, the text -is placed in that buffer also. Text can be recovered by a later \fBp\fR -or \fBP\fR (7.4). -.iP "z" 15 -Redraws the screen with the current line placed as specified by the following -character: \s-2RETURN\s0 specifies the top of the screen, \fB.\fR the -center of the screen, and \fB\-\fR at the bottom of the screen. -A count may be given after the \fBz\fR and before the following character -to specify the new screen size for the redraw. -A count before the \fBz\fR gives the number of the line to place in the -center of the screen instead of the default current line. (5.4) -.iP "{" 15 -Retreats to the beginning of the beginning of the preceding paragraph. -A paragraph begins at each macro in the \fIparagraphs\fR option, normally -`.IP', `.LP', `.PP', `.QP' and `.bp'. -A paragraph also begins after a completely -empty line, and at each section boundary (see \fB[[\fR above) (4.2, 6.8, -7.6). -.iP "|" 15 -Places the cursor on the character in the column specified -by the count (7.1, 7.2). -.iP "}" 15 -Advances to the beginning of the next paragraph. See \fB{\fR for the -definition of paragraph (4.2, 6.8, 7.6). -.iP "~" 15 -Unused. -.iP "^?\ (\s-2\fRDEL\fP\s0)" 15 -Interrupts the editor, returning it to command accepting state (1.5, -7.5) -.bp -\&. diff --git a/docs/USD.doc/vitut/vi.in b/docs/USD.doc/vitut/vi.in deleted file mode 100644 index c36ebe41743e..000000000000 --- a/docs/USD.doc/vitut/vi.in +++ /dev/null @@ -1,2074 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)vi.in 8.5 (Berkeley) 8/18/96 -.\" -.nr LL 6.5i -.nr FL 6.5i -.EH 'USD:11-%''An Introduction to Display Editing with Vi' -.OH 'An Introduction to Display Editing with Vi''USD:11-%' -.bd S 3 -.if t .ds dg \(dg -.if n .ds dg + -.if t .ds dd \(dd -.if n .ds dd ++ -.\".RP -.TL -An Introduction to Display Editing with Vi -.AU -William Joy -.AU -Mark Horton -.AI -Computer Science Division -Department of Electrical Engineering and Computer Science -University of California, Berkeley -Berkeley, Ca. 94720 -.AB -.PP -.I Vi -(visual) is a display oriented interactive text editor. -When using -.I vi -the screen of your terminal acts as a window into the file which you -are editing. Changes which you make to the file are reflected -in what you see. -.PP -Using -.I vi -you can insert new text any place in the file quite easily. -Most of the commands to -.I vi -move the cursor around in the file. -There are commands to move the cursor -forward and backward in units of characters, words, -sentences and paragraphs. -A small set of operators, like -.B d -for delete and -.B c -for change, are combined with the motion commands to form operations -such as delete word or change paragraph, in a simple and natural way. -This regularity and the mnemonic assignment of commands to keys makes the -editor command set easy to remember and to use. -.PP -.I Vi -will work on a large number of display terminals, -and new terminals are easily driven after editing a terminal description file. -While it is advantageous to have an intelligent terminal which can locally -insert and delete lines and characters from the display, the editor will -function quite well on dumb terminals over slow phone lines. -The editor makes allowance for the low bandwidth in these situations -and uses smaller window sizes and -different display updating algorithms to make best use of the -limited speed available. -.PP -It is also possible to use the command set of -.I vi -on hardcopy terminals, storage tubes and ``glass tty's'' using a one line -editing window; thus -.I vi's -command set is available on all terminals. -The full command set of the more traditional, line -oriented editor -.I ex -is available within -.I vi; -it is quite simple to switch between the two modes of editing. -.AE -.NH 1 -Getting started -.PP -.FS -The financial support of an \s-2IBM\s0 Graduate Fellowship and the -National Science Foundation under grants MCS74-07644-A03 and MCS78-07291 -is gratefully acknowledged. -.FE -This document provides a quick introduction to -.I vi. -(Pronounced \fIvee-eye\fP.) -You should be running -.I vi -on a file you are familiar with while you are reading this. -The first part of this document (sections 1 through 5) -describes the basics of using -.I vi. -Some topics of special interest are presented in section 6, and -some nitty-gritty details of how the editor functions are saved for section -7 to avoid cluttering the presentation here. -.PP -There is also a short appendix here, which gives for each character the -special meanings which this character has in \fIvi\fR. Attached to -this document should be a quick reference card. -This card summarizes the commands of -.I vi -in a very compact format. You should have the card handy while you are -learning -.I vi. -.NH 2 -Specifying terminal type -.PP -Before you can start -.I vi -you must tell the system what kind of terminal you are using. -Here is a (necessarily incomplete) list of terminal type codes. -If your terminal does not appear here, you should consult with one of -the staff members on your system to find out the code for your terminal. -If your terminal does not have a code, one can be assigned and a description -for the terminal can be created. -.LP -.TS -center; -ab ab ab -a a a. -Code Full name Type -_ -2621 Hewlett-Packard 2621A/P Intelligent -2645 Hewlett-Packard 264x Intelligent -act4 Microterm ACT-IV Dumb -act5 Microterm ACT-V Dumb -adm3a Lear Siegler ADM-3a Dumb -adm31 Lear Siegler ADM-31 Intelligent -c100 Human Design Concept 100 Intelligent -dm1520 Datamedia 1520 Dumb -dm2500 Datamedia 2500 Intelligent -dm3025 Datamedia 3025 Intelligent -fox Perkin-Elmer Fox Dumb -h1500 Hazeltine 1500 Intelligent -h19 Heathkit h19 Intelligent -i100 Infoton 100 Intelligent -mime Imitating a smart act4 Intelligent -t1061 Teleray 1061 Intelligent -vt52 Dec VT-52 Dumb -.TE -.PP -Suppose for example that you have a Hewlett-Packard HP2621A -terminal. The code used by the system for this terminal is `2621'. -In this case you can use one of the following commands to tell the system -the type of your terminal: -.DS -% \fBsetenv TERM\fP 2621 -.DE -This command works with the -.I csh -shell. -If you are using the standard Bourne shell -.I sh -then you should give the commands -.DS -$ \fBTERM=\fP2621 -$ \fBexport TERM\fP -.DE -.PP -If you want to arrange to have your terminal type set up automatically -when you log in, you can use the -.I tset -program. -If you dial in on a -.I mime , -but often use hardwired ports, a typical line for your -.I .login -file (if you use csh) would be -.DS -\fBsetenv TERM \(gatset\fP \- \-d mime\(ga -.DE -or for your -.I .profile -file (if you use sh) -.DS -\fBTERM=\(gatse\fPt \- \-d mime\(ga -.DE -.I Tset -knows which terminals are hardwired to each port -and needs only to be told that when you dial in you -are probably on a -.I mime . -.I Tset -is usually used to change the erase and kill characters, too. -.NH 2 -Editing a file -.PP -After telling the system which kind of terminal you have, you should -make a copy of a file you are familiar with, and run -.I vi -on this file, giving the command -.DS -% \fBvi\fR \fIname\fR -.DE -replacing \fIname\fR with the name of the copy file you just created. -The screen should clear and the text of your file should appear on the -screen. If something else happens refer to the footnote.\*(dd -.FS -\*(dd If you gave the system an incorrect terminal type code then the -editor may have just made a mess out of your screen. This happens when -it sends control codes for one kind of terminal to some other -kind of terminal. In this case hit -the keys \fB:q\fR (colon and the q key) and then hit the \s-2RETURN\s0 key. -This should get you back to the command level interpreter. -Figure out what you did wrong (ask someone else if necessary) and try again. - Another thing which can go wrong is that you typed the wrong file name and -the editor just printed an error diagnostic. In this case you should -follow the above procedure for getting out of the editor, and try again -this time spelling the file name correctly. - If the editor doesn't seem to respond to the commands which you type -here, try sending an interrupt to it by hitting the \s-2DEL\s0 or \s-2RUB\s0 -key on your terminal, and then hitting the \fB:q\fR command again followed -by a carriage return. -.sp -.FE -.NH 2 -The editor's copy: the buffer -.PP -The editor does not directly modify the file which you are editing. -Rather, the editor makes a copy of this file, in a place called the -.I buffer, -and remembers the file's -name. You do not affect the contents of the file unless and until you -write the changes you make back into the original file. -.NH 2 -Notational conventions -.PP -In our examples, input which must be typed as is will be presented in -\fBbold face\fR. Text which should be replaced with appropriate input -will be given in \fIitalics\fR. We will represent special characters -in \s-2SMALL CAPITALS\s0. -.NH 2 -Arrow keys -.PP -The editor command set is independent of the terminal -you are using. On most terminals with cursor positioning keys, these keys -will also work within the editor. -If you don't have cursor positioning keys, or even if you do, you can use -the \fBh j k\fR and \fBl\fR keys as cursor positioning -keys (these are labelled with arrows on an -.I adm3a).* -.PP -(Particular note for the HP2621: on this terminal the function keys -must be \fIshifted\fR (ick) to send to the machine, otherwise they -only act locally. Unshifted use will leave the cursor positioned -incorrectly.) -.FS -* As we will see later, -.I h -moves back to the left (like control-h which is a backspace), -.I j -moves down (in the same column), -.I k -moves up (in the same column), -and -.I l -moves to the right. -.FE -.NH 2 -Special characters: \s-2ESC\s0, \s-2CR\s0 and \s-2DEL\s0 -.PP -Several of these special characters are very important, so be sure to -find them right now. Look on your keyboard for a key labelled \s-2ESC\s0 -or \s-2ALT\s0. It should be near the upper left corner of your terminal. -Try hitting this key a few times. The editor will ring the bell -to indicate that it is in a quiescent state.\*(dd -.FS -\*(dd On smart terminals where it is possible, the editor will quietly -flash the screen rather than ringing the bell. -.FE -Partially formed commands are cancelled by \s-2ESC\s0, and when you insert -text in the file you end the text insertion -with \s-2ESC\s0. This key is a fairly -harmless one to hit, so you can just hit it if you don't know -what is going on until the editor rings the bell. -.PP -The \s-2CR\s0 or \s-2RETURN\s0 key is important because it is used -to terminate certain commands. -It is usually at the right side of the keyboard, -and is the same command used at the end of each shell command. -.PP -Another very useful key is the \s-2DEL\s0 or \s-2RUB\s0 key, which generates -an interrupt, telling the editor to stop what it is doing. -It is a forceful way of making the editor listen -to you, or to return it to the quiescent state if you don't know or don't -like what is going on. Try hitting the `/' key on your terminal. This -key is used when you want to specify a string to be searched for. The -cursor should now be positioned at the bottom line of the terminal after -a `/' printed as a prompt. You can get the cursor back to the current -position by hitting the \s-2DEL\s0 or \s-2RUB\s0 key; try this now.* -.FS -* Backspacing over the `/' will also cancel the search. -.FE -From now on we will simply refer to hitting the \s-2DEL\s0 or \s-2RUB\s0 -key as ``sending an interrupt.''** -.FS -** On some systems, this interruptibility comes at a price: you cannot type -ahead when the editor is computing with the cursor on the bottom line. -.FE -.PP -The editor often echoes your commands on the last line of the terminal. -If the cursor is on the first position of this last line, then the editor -is performing a computation, such as computing a new position in the -file after a search or running a command to reformat part of the buffer. -When this is happening you can stop the editor by -sending an interrupt. -.NH 2 -Getting out of the editor -.PP -After you have worked with this introduction for a while, and you wish -to do something else, you can give the command \fBZZ\fP -to the editor. -This will write the contents of the editor's buffer back into -the file you are editing, if you made any changes, and then quit from -the editor. You can also end an editor -session by giving the command \fB:q!\fR\s-2CR\s0;\*(dg -.FS -\*(dg All commands which read from the last display line can also be -terminated with a \s-2ESC\s0 as well as an \s-2CR\s0. -.FE -this is a dangerous but occasionally essential -command which ends the editor session and discards all your changes. -You need to know about this command in case you change the editor's -copy of a file you wish only to look at. Be very careful -not to give this command when you really want to save -the changes you have made. -.NH 1 -Moving around in the file -.NH 2 -Scrolling and paging -.PP -The editor has a number of commands for moving around in the file. -The most useful of these is generated by hitting the control and D keys -at the same time, a control-D or `^D'. We will use this two character -notation for referring to these control keys from now on. You may have -a key labelled `^' on your terminal. This key will be represented as `\(ua' -in this document; `^' is exclusively used as part of the `^x' notation -for control characters.\*(dd -.FS -\*(dd If you don't have a `^' key on your terminal -then there is probably a key labelled `\(ua'; in any case these characters -are one and the same. -.FE -.PP -As you know now if you tried hitting \fB^D\fR, this command scrolls down in -the file. The \fBD\fR thus stands for down. Many editor commands are mnemonic -and this makes them much easier to remember. For instance the command -to scroll up is \fB^U\fR. Many dumb terminals can't scroll up at all, in which -case hitting \fB^U\fR clears the screen and refreshes it -with a line which is farther back in the file at the top. -.PP -If you want to see more of the file below where you are, you can -hit \fB^E\fR to expose one more line at the bottom of the screen, -leaving the cursor where it is. -The command \fB^Y\fR (which is hopelessly non-mnemonic, but next to \fB^U\fR -on the keyboard) exposes one more line at the top of the screen. -.PP -There are other ways to move around in the file; the keys \fB^F\fR and \fB^B\fR -move forward and backward a page, -keeping a couple of lines of continuity between screens -so that it is possible to read through a file using these rather than -\fB^D\fR and \fB^U\fR if you wish. -.PP -Notice the difference between scrolling and paging. If you are trying -to read the text in a file, hitting \fB^F\fR to move forward a page -will leave you only a little context to look back at. Scrolling on the -other hand leaves more context, and happens more smoothly. You can continue -to read the text as scrolling is taking place. -.NH 2 -Searching, goto, and previous context -.PP -Another way to position yourself in the file is by giving the editor a string -to search for. Type the character \fB/\fR followed by a string of characters -terminated by \s-2CR\s0. The editor will position the cursor -at the next occurrence of this string. -Try hitting \fBn\fR to then go to the next occurrence of this string. -The character \fB?\fR will search backwards from where you are, and is -otherwise like \fB/\fR.\*(dg -.FS -\*(dg These searches will normally wrap around the end of the file, and thus -find the string even if it is not on a line in the direction you search -provided it is anywhere else in the file. You can disable this wraparound -in scans by giving the command \fB:se nowrapscan\fR\s-2CR\s0, -or more briefly \fB:se nows\fR\s-2CR\s0. -.FE -.PP -If the search string you give the editor is not present in the -file the editor will print -a diagnostic on the last line of the screen, and the cursor will be returned -to its initial position. -.PP -If you wish the search to match only at the beginning of a line, begin -the search string with an \fB\(ua\fR. To match only at the end of -a line, end the search string with a \fB$\fR. -Thus \fB/\(uasearch\fR\s-2CR\s0 will search for the word `search' at -the beginning of a line, and \fB/last$\fR\s-2CR\s0 searches for the -word `last' at the end of a line.* -.FS -*Actually, the string you give to search for here can be a -.I "regular expression" -in the sense of the editors -.I ex (1) -and -.I ed (1). -If you don't wish to learn about this yet, you can disable this more -general facility by doing -\fB:se\ nomagic\fR\s-2CR\s0; -by putting this command in -EXINIT -in your environment, you can have this always be in effect (more -about -.I EXINIT -later.) -.FE -.PP -The command \fBG\fR, when preceded by a number will position the cursor -at that line in the file. -Thus \fB1G\fR will move the cursor to -the first line of the file. If you give \fBG\fR no count, then it moves -to the end of the file. -.PP -If you are near the end of the file, and the last line is not at the bottom -of the screen, the editor will place only the character `~' on each remaining -line. This indicates that the last line in the file is on the screen; -that is, the `~' lines are past the end of the file. -.PP -You can find out the state of the file you are editing by typing a \fB^G\fR. -The editor will show you the name of the file you are editing, the number -of the current line, the number of lines in the buffer, and the percentage -of the way through the buffer which you are. -Try doing this now, and remember the number of the line you are on. -Give a \fBG\fR command to get to the end and then another \fBG\fR command -to get back where you were. -.PP -You can also get back to a previous position by using the command -\fB\(ga\(ga\fR (two back quotes). -This is often more convenient than \fBG\fR because it requires no advance -preparation. -Try giving a \fBG\fR or a search with \fB/\fR or \fB?\fR and then a -\fB\(ga\(ga\fR to get back to where you were. If you accidentally hit -\fBn\fR or any command which moves you far away from a context of interest, you -can quickly get back by hitting \fB\(ga\(ga\fR. -.NH 2 -Moving around on the screen -.PP -Now try just moving the cursor around on the screen. -If your terminal has arrow keys (4 or 5 keys with arrows -going in each direction) try them and convince yourself -that they work. -If you don't have working arrow keys, you can always use -.B h , -.B j , -.B k , -and -.B l . -Experienced users of -.I vi -prefer these keys to arrow keys, -because they are usually right underneath their fingers. -.PP -Hit the \fB+\fR key. Each time you do, notice that the cursor -advances to the next line in the file, at the first non-white position -on the line. The \fB\-\fR key is like \fB+\fR but goes the other way. -.PP -These are very common keys for moving up and down lines in the file. -Notice that if you go off the bottom or top with these keys then the -screen will scroll down (and up if possible) to bring a line at a time -into view. The \s-2RETURN\s0 key has the same effect as the \fB+\fR -key. -.PP -.I Vi -also has commands to take you to the top, middle and bottom of the screen. -\fBH\fR will take you to the top (home) line on the screen. -Try preceding it with a -number as in \fB3H\fR. -This will take you to the third line on the screen. -Many -.I vi -commands take preceding numbers and do interesting things with them. -Try \fBM\fR, -which takes you to the middle line on the screen, -and \fBL\fR, -which takes you to the last line on the screen. -\fBL\fR also takes counts, thus -\fB5L\fR will take you to the fifth line from the bottom. -.NH 2 -Moving within a line -.PP -Now try picking a word on some line on the screen, not the -first word on the line. -move the cursor using \s-2RETURN\s0 and \fB\-\fR to be on the line where -the word is. -Try hitting the \fBw\fR key. This will advance the cursor to the -next word on the line. -Try hitting the \fBb\fR key to back up words -in the line. -Also try the \fBe\fR key which advances you to the end of the current -word rather than to the beginning of the next word. -Also try \s-2SPACE\s0 (the space bar) which moves right one character -and the \s-2BS\s0 (backspace or \fB^H\fR) key which moves left one character. -The key \fBh\fR works as \fB^H\fR does and is useful if you don't have -a \s-2BS\s0 key. -(Also, as noted just above, \fBl\fR will move to the right.) -.PP -If the line had punctuation in it you may have noticed that -that the \fBw\fR and \fBb\fR -keys stopped at each group of punctuation. You can also go back and -forwards words without stopping at punctuation by using \fBW\fR and \fBB\fR -rather than the lower case equivalents. Think of these as bigger words. -Try these on a few lines with punctuation to see how they differ from -the lower case \fBw\fR and \fBb\fR. -.PP -The word keys wrap around the end of line, -rather than stopping at the end. Try moving to a word on a line below -where you are by repeatedly hitting \fBw\fR. -.NH 2 -Summary -.IP -.TS -lw(.50i)b a. -\fR\s-2SPACE\s0\fP advance the cursor one position -^B backwards to previous page -^D scrolls down in the file -^E exposes another line at the bottom -^F forward to next page -^G tell what is going on -^H backspace the cursor -^N next line, same column -^P previous line, same column -^U scrolls up in the file -^Y exposes another line at the top -+ next line, at the beginning -\- previous line, at the beginning -/ scan for a following string forwards -? scan backwards -B back a word, ignoring punctuation -G go to specified line, last default -H home screen line -M middle screen line -L last screen line -W forward a word, ignoring punctuation -b back a word -e end of current word -n scan for next instance of \fB/\fR or \fB?\fR pattern -w word after this word -.TE -.NH 2 -View -.PP -If you want to use the editor to look at a file, -rather than to make changes, -invoke it as -.I view -instead of -.I vi . -This will set the -.I readonly -option which will prevent you from -accidently overwriting the file. -.sp -.NH 1 -Making simple changes -.NH 2 -Inserting -.PP -One of the most useful commands is the -\fBi\fR (insert) command. -After you type \fBi\fR, everything you type until you hit \s-2ESC\s0 -is inserted into the file. -Try this now; position yourself to some word in the file and try inserting -text before this word. -If you are on an dumb terminal it will seem, for a minute, -that some of the characters in your line have been overwritten, but they will -reappear when you hit \s-2ESC\s0. -.PP -Now try finding a word which can, but does not, end in an `s'. -Position yourself at this word and type \fBe\fR (move to end of word), then -\fBa\fR for append and then `s\s-2ESC\s0' to terminate the textual insert. -This sequence of commands can be used to easily pluralize a word. -.PP -Try inserting and appending a few times to make sure you understand how -this works; \fBi\fR placing text to the left of the cursor, \fBa\fR to -the right. -.PP -It is often the case that you want to add new lines to the file you are -editing, before or after some specific line in the file. Find a line -where this makes sense and then give the command \fBo\fR to create a -new line after the line you are on, or the command \fBO\fR to create -a new line before the line you are on. After you create a new line in -this way, text you type up to an \s-2ESC\s0 is inserted on the new line. -.PP -Many related editor commands -are invoked by the same letter key and differ only in that one is given -by a lower -case key and the other is given by -an upper case key. In these cases, the -upper case key often differs from the lower case key in its sense of -direction, with -the upper case key working backward and/or up, while the lower case -key moves forward and/or down. -.PP -Whenever you are typing in text, you can give many lines of input or -just a few characters. -To type in more than one line of text, -hit a \s-2RETURN\s0 at the middle of your input. A new line will be created -for text, and you can continue to type. If you are on a slow -and dumb terminal the editor may choose to wait to redraw the -tail of the screen, and will let you type over the existing screen lines. -This avoids the lengthy delay which would occur if the editor attempted -to keep the tail of the screen always up to date. The tail of the screen will -be fixed up, and the missing lines will reappear, when you hit \s-2ESC\s0. -.PP -While you are inserting new text, you can use the characters you normally use -at the system command level (usually \fB^H\fR or \fB#\fR) to backspace -over the last -character which you typed, and the character which you use to kill input lines -(usually \fB@\fR, \fB^X\fR, or \fB^U\fR) -to erase the input you have typed on the current line.\*(dg -.FS -\*(dg In fact, the character \fB^H\fR (backspace) always works to erase the -last input character here, regardless of what your erase character is. -.FE -The character \fB^W\fR -will erase a whole word and leave you after the space after the previous -word; it is useful for quickly backing up in an insert. -.PP -Notice that when you backspace during an insertion the characters you -backspace over are not erased; the cursor moves backwards, and the characters -remain on the display. This is often useful if you are planning to type -in something similar. In any case the characters disappear when when -you hit \s-2ESC\s0; if you want to get rid of them immediately, hit an -\s-2ESC\s0 and then \fBa\fR again. -.PP -Notice also that you can't erase characters which you didn't insert, and that -you can't backspace around the end of a line. If you need to back up -to the previous line to make a correction, just hit \s-2ESC\s0 and move -the cursor back to the previous line. After making the correction you -can return to where you were and use the insert or append command again. -.sp .5 -.NH 2 -Making small corrections -.PP -You can make small corrections in existing text quite easily. -Find a single character which is wrong or just pick any character. -Use the arrow keys to find the character, or -get near the character with the word motion keys and then either -backspace (hit the \s-2BS\s0 key or \fB^H\fR or even just \fBh\fR) or -\s-2SPACE\s0 (using the space bar) -until the cursor is on the character which is wrong. -If the character is not needed then hit the \fBx\fP key; this deletes -the character from the file. It is analogous to the way you \fBx\fP -out characters when you make mistakes on a typewriter (except it's not -as messy). -.PP -If the character -is incorrect, you can replace it with the correct character by giving -the command \fBr\fR\fIc\fR, -where \fIc\fR is replaced by the correct character. -Finally if the character which is incorrect should be replaced -by more than one character, give the command \fBs\fR which substitutes -a string of characters, ending with \s-2ESC\s0, for it. -If there are a small number of characters -which are wrong you can precede \fBs\fR with a count of the number of -characters to be replaced. Counts are also useful with \fBx\fR to specify -the number of characters to be deleted. -.NH 2 -More corrections: operators -.PP -You already know almost enough to make changes at a higher level. -All you need to know now is that the -.B d -key acts as a delete operator. Try the command -.B dw -to delete a word. -Try hitting \fB.\fR a few times. Notice that this repeats the effect -of the \fBdw\fR. The command \fB.\fR repeats the last command which -made a change. You can remember it by analogy with an ellipsis `\fB...\fR'. -.PP -Now try -\fBdb\fR. -This deletes a word backwards, namely the preceding word. -Try -\fBd\fR\s-2SPACE\s0. This deletes a single character, and is equivalent -to the \fBx\fR command. -.PP -Another very useful operator is -.B c -or change. The command -.B cw -thus changes the text of a single word. -You follow it by the replacement text ending with an \s-2ESC\s0. -Find a word which you can change to another, and try this -now. -Notice that the end of the text to be changed was marked with the character -`$' so that you can see this as you are typing in the new material. -.sp .5 -.NH 2 -Operating on lines -.PP -It is often the case that you want to operate on lines. -Find a line which you want to delete, and type -\fBdd\fR, -the -.B d -operator twice. This will delete the line. -If you are on a dumb terminal, the editor may just erase the line on -the screen, replacing it with a line with only an @ on it. This line -does not correspond to any line in your file, but only acts as a place -holder. It helps to avoid a lengthy redraw of the rest of the screen -which would be necessary to close up the hole created by the deletion -on a terminal without a delete line capability. -.PP -Try repeating the -.B c -operator twice; this will change a whole line, erasing its previous contents and -replacing them with text you type up to an \s-2ESC\s0.\*(dg -.FS -\*(dg The command \fBS\fR is a convenient synonym for for \fBcc\fR, by -analogy with \fBs\fR. Think of \fBS\fR as a substitute on lines, while -\fBs\fR is a substitute on characters. -.FE -.PP -You can delete or change more than one line by preceding the -.B dd -or -.B cc -with a count, i.e. \fB5dd\fR deletes 5 lines. -You can also give a command like \fBdL\fR to delete all the lines up to -and including -the last line on the screen, or \fBd3L\fR to delete through the third from -the bottom line. Try some commands like this now.* -.FS -* One subtle point here involves using the \fB/\fR search after a \fBd\fR. -This will normally delete characters from the current position to the -point of the match. If what is desired is to delete whole lines -including the two points, give the pattern as \fB/pat/+0\fR, a line address. -.FE -Notice that the editor lets you know when you change a large number of -lines so that you can see the extent of the change. -The editor will also always tell you when a change you make affects text which -you cannot see. -.NH 2 -Undoing -.PP -Now suppose that the last change which you made was incorrect; -you could use the insert, delete and append commands to put the correct -material back. However, since it is often the case that we regret a -change or make a change incorrectly, the editor provides a -.B u -(undo) command to reverse the last change which you made. -Try this a few times, and give it twice in a row to notice that an -.B u -also undoes a -.B u. -.PP -The undo command lets you reverse only a single change. After you make -a number of changes to a line, you may decide that you would rather have -the original state of the line back. The -.B U -command restores the current line to the state before you started changing -it. -.PP -You can recover text which you delete, even if -undo will not bring it back; see the section on recovering lost text -below. -.NH 2 -Summary -.IP -.TS -lw(.50i)b a. -\fR\s-2SPACE\s0\fP advance the cursor one position -^H backspace the cursor -^W erase a word during an insert -\fRerase\fP your erase (usually ^H or #), erases a character during an insert -\fRkill\fP your kill (usually @, ^X, or ^U), kills the insert on this line -\&\fB.\fP repeats the changing command -O opens and inputs new lines, above the current -U undoes the changes you made to the current line -a appends text after the cursor -c changes the object you specify to the following text -d deletes the object you specify -i inserts text before the cursor -o opens and inputs new lines, below the current -u undoes the last change -.TE -.NH 1 -Moving about; rearranging and duplicating text -.NH 2 -Low level character motions -.PP -Now move the cursor to a line where there is a punctuation or a bracketing -character such as a parenthesis or a comma or period. Try the command -\fBf\fR\fIx\fR where \fIx\fR is this character. This command finds -the next \fIx\fR character to the right of the cursor in the current -line. Try then hitting a \fB;\fR, which finds the next instance of the -same character. By using the \fBf\fR command and then a sequence of -\fB;\fR's you can often -get to a particular place in a line much faster than with a sequence -of word motions or \s-2SPACE\s0s. -There is also a \fBF\fR command, which is like \fBf\fR, but searches -backward. The \fB;\fR command repeats \fBF\fR also. -.PP -When you are operating on the text in a line it is often desirable to -deal with the characters up to, but not including, the first instance of -a character. Try \fBdf\fR\fIx\fR for some \fIx\fR now and -notice that the \fIx\fR character is deleted. Undo this with \fBu\fR -and then try \fBdt\fR\fIx\fR; the \fBt\fR here stands for to, i.e. -delete up to the next \fIx\fR, but not the \fIx\fR. The command \fBT\fR -is the reverse of \fBt\fR. -.PP -When working with the text of a single line, an \fB\(ua\fR moves the -cursor to the first non-white position on the line, and a -\fB$\fR moves it to the end of the line. Thus \fB$a\fR will append new -text at the end of the current line. -.PP -Your file may have tab (\fB^I\fR) characters in it. These -characters are represented as a number of spaces expanding to a tab stop, -where tab stops are every 8 positions.* -.FS -* This is settable by a command of the form \fB:se ts=\fR\fIx\fR\s-2CR\s0, -where \fIx\fR is 4 to set tabstops every four columns. This has -effect on the screen representation within the editor. -.FE -When the cursor is at a tab, it sits on the last of the several spaces -which represent that tab. Try moving the cursor back and forth over -tabs so you understand how this works. -.PP -On rare occasions, your file may have nonprinting characters in it. -These characters are displayed in the same way they are represented in -this document, that is with a two character code, the first character -of which is `^'. On the screen non-printing characters resemble a `^' -character adjacent to another, but spacing or backspacing over the character -will reveal that the two characters are, like the spaces representing -a tab character, a single character. -.PP -The editor sometimes discards control characters, -depending on the character and the setting of the -.I beautify -option, -if you attempt to insert them in your file. -You can get a control character in the file by beginning -an insert and then typing a \fB^V\fR before the control -character. The -\fB^V\fR quotes the following character, causing it to be -inserted directly into the file. -.PP -.NH 2 -Higher level text objects -.PP -In working with a document it is often advantageous to work in terms -of sentences, paragraphs, and sections. The operations \fB(\fR and \fB)\fR -move to the beginning of the previous and next sentences respectively. -Thus the command \fBd)\fR will delete the rest of the current sentence; -likewise \fBd(\fR will delete the previous sentence if you are at the -beginning of the current sentence, or the current sentence up to where -you are if you are not at the beginning of the current sentence. -.PP -A sentence is defined to end at a `.', `!' or `?' which is followed by -either the end of a line, or by two spaces. Any number of closing `)', -`]', `"' and `\(aa' characters may appear after the `.', `!' or `?' before -the spaces or end of line. -.PP -The operations \fB{\fR and \fB}\fR move over paragraphs and the operations -\fB[[\fR and \fB]]\fR move over sections.\*(dg -.FS -\*(dg The \fB[[\fR and \fB]]\fR operations -require the operation character to be doubled because they can move the -cursor far from where it currently is. While it is easy to get back -with the command \fB\(ga\(ga\fP, -these commands would still be frustrating -if they were easy to hit accidentally. -.FE -.PP -A paragraph begins after each empty line, and also -at each of a set of paragraph macros, specified by the pairs of characters -in the definition of the string valued option \fIparagraphs\fR. -The default setting for this option defines the paragraph macros of the -\fI\-ms\fR and \fI\-mm\fR macro packages, i.e. the `.IP', `.LP', `.PP' -and `.QP', `.P' and `.LI' macros.\*(dd -.FS -\*(dd You can easily change or extend this set of macros by assigning a -different string to the \fIparagraphs\fR option in your EXINIT. -See section 6.2 for details. -The `.bp' directive is also considered to start a paragraph. -.FE -Each paragraph boundary is also a sentence boundary. The sentence -and paragraph commands can -be given counts to operate over groups of sentences and paragraphs. -.PP -Sections in the editor begin after each macro in the \fIsections\fR option, -normally `.NH', `.SH', `.H' and `.HU', and each line with a formfeed \fB^L\fR -in the first column. -Section boundaries are always line and paragraph boundaries also. -.PP -Try experimenting with the sentence and paragraph commands until you are -sure how they work. If you have a large document, try looking through -it using the section commands. -The section commands interpret a preceding count as a different window size in -which to redraw the screen at the new location, and this window size -is the base size for newly drawn windows until another size is specified. -This is very useful -if you are on a slow terminal and are looking for a particular section. -You can give the first section command a small count to then see each successive -section heading in a small window. -.NH 2 -Rearranging and duplicating text -.PP -The editor has a single unnamed buffer where the last deleted or -changed away text is saved, and a set of named buffers \fBa\fR\-\fBz\fR -which you can use to save copies of text and to move text around in -your file and between files. -.PP -The operator -.B y -yanks a copy of the object which follows into the unnamed buffer. -If preceded by a buffer name, \fB"\fR\fIx\fR\|\fBy\fR, where -\fIx\fR here is replaced by a letter \fBa\-z\fR, it places the text in the named -buffer. The text can then be put back in the file with the commands -.B p -and -.B P; -\fBp\fR puts the text after or below the cursor, while \fBP\fR puts the text -before or above the cursor. -.PP -If the text which you -yank forms a part of a line, or is an object such as a sentence which -partially spans more than one line, then when you put the text back, -it will be placed after the cursor (or before if you -use \fBP\fR). If the yanked text forms whole lines, they will be put -back as whole lines, without changing the current line. In this case, -the put acts much like a \fBo\fR or \fBO\fR command. -.PP -Try the command \fBYP\fR. This makes a copy of the current line and -leaves you on this copy, which is placed before the current line. -The command \fBY\fR is a convenient abbreviation for \fByy\fR. -The command \fBYp\fR will also make a copy of the current line, and place -it after the current line. You can give \fBY\fR a count of lines to -yank, and thus duplicate several lines; try \fB3YP\fR. -.PP -To move text within the buffer, you need to delete it in one place, and -put it back in another. You can precede a delete operation by the -name of a buffer in which the text is to be stored as in \fB"a5dd\fR -deleting 5 lines into the named buffer \fIa\fR. You can then move the -cursor to the eventual resting place of the these lines and do a \fB"ap\fR -or \fB"aP\fR to put them back. -In fact, you can switch and edit another file before you put the lines -back, by giving a command of the form \fB:e \fR\fIname\fR\s-2CR\s0 where -\fIname\fR is the name of the other file you want to edit. You will -have to write back the contents of the current editor buffer (or discard -them) if you have made changes before the editor will let you switch -to the other file. -An ordinary delete command saves the text in the unnamed buffer, -so that an ordinary put can move it elsewhere. -However, the unnamed buffer is lost when you change files, -so to move text from one file to another you should use an unnamed buffer. -.NH 2 -Summary. -.IP -.TS -lw(.50i)b a. -\(ua first non-white on line -$ end of line -) forward sentence -} forward paragraph -]] forward section -( backward sentence -{ backward paragraph -[[ backward section -f\fIx\fR find \fIx\fR forward in line -p put text back, after cursor or below current line -y yank operator, for copies and moves -t\fIx\fR up to \fIx\fR forward, for operators -F\fIx\fR f backward in line -P put text back, before cursor or above current line -T\fIx\fR t backward in line -.TE -.ne 1i -.NH 1 -High level commands -.NH 2 -Writing, quitting, editing new files -.PP -So far we have seen how to enter -.I vi -and to write out our file using either -\fBZZ\fR or \fB:w\fR\s-2CR\s0. The first exits from -the editor, -(writing if changes were made), -the second writes and stays in the editor. -.PP -If you have changed the editor's copy of the file but do not wish to -save your changes, either because you messed up the file or decided that the -changes are not an improvement to the file, then you can give the command -\fB:q!\fR\s-2CR\s0 to quit from the editor without writing the changes. -You can also reedit the same file (starting over) by giving the command -\fB:e!\fR\s-2CR\s0. These commands should be used only rarely, and with -caution, as it is not possible to recover the changes you have made after -you discard them in this manner. -.PP -You can edit a different file without leaving the editor by giving the -command \fB:e\fR\ \fIname\fR\s-2CR\s0. If you have not written out -your file before you try to do this, then the editor will tell you this, -and delay editing the other file. You can then give the command -\fB:w\fR\s-2CR\s0 to save your work and then the \fB:e\fR\ \fIname\fR\s-2CR\s0 -command again, or carefully give the command \fB:e!\fR\ \fIname\fR\s-2CR\s0, -which edits the other file discarding the changes you have made to the -current file. -To have the editor automatically save changes, -include -.I "set autowrite" -in your EXINIT, -and use \fB:n\fP instead of \fB:e\fP. -.NH 2 -Escaping to a shell -.PP -You can get to a shell to execute a single command by giving a -.I vi -command of the form \fB:!\fIcmd\fR\s-2CR\s0. -The system will run the single command -.I cmd -and when the command finishes, the editor will ask you to hit a \s-2RETURN\s0 -to continue. When you have finished looking at the output on the screen, -you should hit \s-2RETURN\s0 and the editor will clear the screen and -redraw it. You can then continue editing. -You can also give another \fB:\fR command when it asks you for a \s-2RETURN\s0; -in this case the screen will not be redrawn. -.PP -If you wish to execute more than one command in the shell, then you can -give the command \fB:sh\fR\s-2CR\s0. -This will give you a new shell, and when you finish with the shell, ending -it by typing a \fB^D\fR, the editor will clear the screen and continue. -.PP -On systems which support it, \fB^Z\fP will suspend the editor -and return to the (top level) shell. -When the editor is resumed, the screen will be redrawn. -.NH 2 -Marking and returning -.PP -The command \fB\(ga\(ga\fR returned to the previous place -after a motion of the cursor by a command such as \fB/\fR, \fB?\fR or -\fBG\fR. You can also mark lines in the file with single letter tags -and return to these marks later by naming the tags. Try marking the -current line with the command \fBm\fR\fIx\fR, where you should pick some -letter for \fIx\fR, say `a'. Then move the cursor to a different line -(any way you like) and hit \fB\(gaa\fR. The cursor will return to the -place which you marked. -Marks last only until you edit another file. -.PP -When using operators such as -.B d -and referring to marked lines, it is often desirable to delete whole lines -rather than deleting to the exact position in the line marked by \fBm\fR. -In this case you can use the form \fB\(aa\fR\fIx\fR rather than -\fB\(ga\fR\fIx\fR. Used without an operator, \fB\(aa\fR\fIx\fR will move to -the first non-white character of the marked line; similarly \fB\(aa\(aa\fR -moves to the first non-white character of the line containing the previous -context mark \fB\(ga\(ga\fR. -.NH 2 -Adjusting the screen -.PP -If the screen image is messed up because of a transmission error to your -terminal, or because some program other than the editor wrote output -to your terminal, you can hit a \fB^L\fR, the \s-2ASCII\s0 form-feed -character, to cause the screen to be refreshed. -.PP -On a dumb terminal, if there are @ lines in the middle of the screen -as a result of line deletion, you may get rid of these lines by typing -\fB^R\fR to cause the editor to retype the screen, closing up these holes. -.PP -Finally, if you wish to place a certain line on the screen at the top -middle or bottom of the screen, you can position the cursor to that line, -and then give a \fBz\fR command. -You should follow the \fBz\fR command with a \s-2RETURN\s0 if you want -the line to appear at the top of the window, a \fB.\fR if you want it -at the center, or a \fB\-\fR if you want it at the bottom. -.NH 1 -Special topics -.NH 2 -Editing on slow terminals -.PP -When you are on a slow terminal, it is important to limit the amount -of output which is generated to your screen so that you will not suffer -long delays, waiting for the screen to be refreshed. We have already -pointed out how the editor optimizes the updating of the screen during -insertions on dumb terminals to limit the delays, and how the editor erases -lines to @ when they are deleted on dumb terminals. -.PP -The use of the slow terminal insertion mode is controlled by the -.I slowopen -option. You can force the editor to use this mode even on faster terminals -by giving the command \fB:se slow\fR\s-2CR\s0. If your system is sluggish -this helps lessen the amount of output coming to your terminal. -You can disable this option by \fB:se noslow\fR\s-2CR\s0. -.PP -The editor can simulate an intelligent terminal on a dumb one. Try -giving the command \fB:se redraw\fR\s-2CR\s0. This simulation generates -a great deal of output and is generally tolerable only on lightly loaded -systems and fast terminals. You can disable this by giving the command - \fB:se noredraw\fR\s-2CR\s0. -.PP -The editor also makes editing more pleasant at low speed by starting -editing in a small window, and letting the window expand as you edit. -This works particularly well on intelligent terminals. The editor can -expand the window easily when you insert in the middle of the screen -on these terminals. If possible, try the editor on an intelligent terminal -to see how this works. -.PP -You can control the size of the window which is redrawn each time the -screen is cleared by giving window sizes as argument to the commands -which cause large screen motions: -.DS -.B ": / ? [[ ]] \(ga \(aa" -.DE -Thus if you are searching for a particular instance of a common string -in a file you can precede the first search command by a small number, -say 3, and the editor will draw three line windows around each instance -of the string which it locates. -.PP -You can easily expand or contract the window, placing the current line -as you choose, by giving a number on a \fBz\fR command, after the \fBz\fR -and before the following \s-2RETURN\s0, \fB.\fR or \fB\-\fR. Thus the -command \fBz5.\fR redraws the screen with the current line in the center -of a five line window.\*(dg -.FS -\*(dg Note that the command \fB5z.\fR has an entirely different effect, -placing line 5 in the center of a new window. -.FE -.PP -If the editor is redrawing or otherwise updating large portions of the -display, you can interrupt this updating by hitting a \s-2DEL\s0 or \s-2RUB\s0 -as usual. If you do this you may partially confuse the editor about -what is displayed on the screen. You can still edit the text on -the screen if you wish; clear up the confusion -by hitting a \fB^L\fR; or move or search again, ignoring the -current state of the display. -.PP -See section 7.8 on \fIopen\fR mode for another way to use the -.I vi -command set on slow terminals. -.NH 2 -Options, set, and editor startup files -.PP -The editor has a set of options, some of which have been mentioned above. -The most useful options are given in the following table. -.PP -The options are of three kinds: numeric options, string options, and -toggle options. You can set numeric and string options by a statement -of the form -.DS -\fBset\fR \fIopt\fR\fB=\fR\fIval\fR -.DE -and toggle options can be set or unset by statements of one of the forms -.DS -\fBset\fR \fIopt\fR -\fBset\fR \fBno\fR\fIopt\fR -.DE -.KF -.TS -lb lb lb lb -l l l a. -Name Default Description -_ -autoindent noai Supply indentation automatically -autowrite noaw Automatic write before \fB:n\fR, \fB:ta\fR, \fB^\(ua\fR, \fB!\fR -ignorecase noic Ignore case in searching -lisp nolisp \fB( { ) }\fR commands deal with S-expressions -list nolist Tabs print as ^I; end of lines marked with $ -magic nomagic The characters . [ and * are special in scans -number nonu Lines are displayed prefixed with line numbers -paragraphs para=IPLPPPQPbpP LI Macro names which start paragraphs -redraw nore Simulate a smart terminal on a dumb one -sections sect=NHSHH HU Macro names which start new sections -shiftwidth sw=8 Shift distance for <, > and input \fB^D\fP and \fB^T\fR -showmatch nosm Show matching \fB(\fP or \fB{\fP as \fB)\fP or \fB}\fR is typed -slowopen slow Postpone display updates during inserts -term dumb The kind of terminal you are using. -.TE -.KE -These statements can be placed in your EXINIT in your environment, -or given while you are running -.I vi -by preceding them with a \fB:\fR and following them with a \s-2CR\s0. -.PP -You can get a list of all options which you have changed by the -command \fB:set\fR\s-2CR\s0, or the value of a single option by the -command \fB:set\fR \fIopt\fR\fB?\fR\s-2CR\s0. -A list of all possible options and their values is generated by -\fB:set all\fP\s-2CR\s0. -Set can be abbreviated \fBse\fP. -Multiple options can be placed on one line, e.g. -\fB:se ai aw nu\fP\s-2CR\s0. -.PP -Options set by the \fBset\fP command only last -while you stay in the editor. -It is common to want to have certain options set whenever you -use the editor. -This can be accomplished by creating a list of \fIex\fP commands\*(dg -.FS -\*(dg -All commands which start with -.B : -are \fIex\fP commands. -.FE -which are to be run every time you start up \fIex\fP, \fIedit\fP, -or \fIvi\fP. -A typical list includes a \fBset\fP command, and possibly a few -\fBmap\fP commands. -Since it is advisable to get these commands on one line, they can -be separated with the | character, for example: -.DS -\fBset\fP ai aw terse|\fBmap\fP @ dd|\fBmap\fP # x -.DE -which sets the options \fIautoindent\fP, \fIautowrite\fP, \fIterse\fP, -(the -.B set -command), -makes @ delete a line, -(the first -.B map ), -and makes # delete a character, -(the second -.B map ). -(See section 6.9 for a description of the \fBmap\fP command) -This string should be placed in the variable EXINIT in your environment. -If you use the shell \fIcsh\fP, -put this line in the file -.I .login -in your home directory: -.DS -setenv EXINIT \(aa\fBset\fP ai aw terse|\fBmap\fP @ dd|\fBmap\fP # x\(aa -.DE -If you use the standard shell \fIsh\fP, -put these lines in the file -.I .profile -in your home directory: -.DS -EXINIT=\(aa\fBset\fP ai aw terse|\fBmap\fP @ dd|\fBmap\fP # x\(aa -export EXINIT -.DE -Of course, the particulars of the line would depend on which options -you wanted to set. -.NH 2 -Recovering lost lines -.PP -You might have a serious problem if you delete a number of lines and then -regret that they were deleted. Despair not, the editor saves the last -9 deleted blocks of text in a set of numbered registers 1\-9. -You can get the \fIn\fR'th previous deleted text back in your file by -the command -"\fR\fIn\fR\|\fBp\fR. -The "\fR here says that a buffer name is to follow, -\fIn\fR is the number of the buffer you wish to try -(use the number 1 for now), -and -.B p -is the put command, which puts text in the buffer after the cursor. -If this doesn't bring back the text you wanted, hit -.B u -to undo this and then -\fB\&.\fR -(period) -to repeat the put command. -In general the -\fB\&.\fR -command will repeat the last change you made. -As a special case, when the last command refers to a numbered text buffer, -the \fB.\fR command increments the number of the buffer before repeating -the command. Thus a sequence of the form -.DS -\fB"1pu.u.u.\fR -.DE -will, if repeated long enough, show you all the deleted text which has -been saved for you. -You can omit the -.B u -commands here to gather up all this text in the buffer, or stop after any -\fB\&.\fR command to keep just the then recovered text. -The command -.B P -can also be used rather than -.B p -to put the recovered text before rather than after the cursor. -.NH 2 -Recovering lost files -.PP -If the system crashes, you can recover the work you were doing -to within a few changes. You will normally receive mail when you next -login giving you the name of the file which has been saved for you. -You should then change to the directory where you were when the system -crashed and give a command of the form: -.DS -% \fBvi \-r\fR \fIname\fR -.DE -replacing \fIname\fR with the name of the file which you were editing. -This will recover your work to a point near where you left off.\*(dg -.FS -\*(dg In rare cases, some of the lines of the file may be lost. The -editor will give you the numbers of these lines and the text of the lines -will be replaced by the string `LOST'. These lines will almost always -be among the last few which you changed. You can either choose to discard -the changes which you made (if they are easy to remake) or to replace -the few lost lines by hand. -.FE -.PP -You can get a listing of the files which are saved for you by giving -the command: -.DS -% \fBvi \-r\fR -.DE -If there is more than one instance of a particular file saved, the editor -gives you the newest instance each time you recover it. You can thus -get an older saved copy back by first recovering the newer copies. -.PP -For this feature to work, -.I vi -must be correctly installed by a super user on your system, -and the -.I mail -program must exist to receive mail. -The invocation ``\fIvi -r\fP'' will not always list all saved files, -but they can be recovered even if they are not listed. -.NH 2 -Continuous text input -.PP -When you are typing in large amounts of text it is convenient to have -lines broken near the right margin automatically. You can cause this -to happen by giving the command -\fB:se wm=10\fR\s-2CR\s0. -This causes all lines to be broken at a space at least 10 columns -from the right hand edge of the screen. -.PP -If the editor breaks an input line and you wish to put it back together -you can tell it to join the lines with \fBJ\fR. You can give \fBJ\fR -a count of the number of lines to be joined as in \fB3J\fR to join 3 -lines. The editor supplies white space, if appropriate, -at the juncture of the joined -lines, and leaves the cursor at this white space. -You can kill the white space with \fBx\fR if you don't want it. -.NH 2 -Features for editing programs -.PP -The editor has a number of commands for editing programs. -The thing that most distinguishes editing of programs from editing of text -is the desirability of maintaining an indented structure to the body of -the program. The editor has a -.I autoindent -facility for helping you generate correctly indented programs. -.PP -To enable this facility you can give the command \fB:se ai\fR\s-2CR\s0. -Now try opening a new line with \fBo\fR and type some characters on the -line after a few tabs. If you now start another line, notice that the -editor supplies white space at the beginning of the line to line it up -with the previous line. You cannot backspace over this indentation, -but you can use \fB^D\fR key to backtab over the supplied indentation. -.PP -Each time you type \fB^D\fR you back up one position, normally to an -8 column boundary. This amount is settable; the editor has an option -called -.I shiftwidth -which you can set to change this value. -Try giving the command \fB:se sw=4\fR\s-2CR\s0 -and then experimenting with autoindent again. -.PP -For shifting lines in the program left and right, there are operators -.B < -and -.B >. -These shift the lines you specify right or left by one -.I shiftwidth. -Try -.B << -and -.B >> -which shift one line left or right, and -.B L -shifting the rest of the display left and right. -.PP -If you have a complicated expression and wish to see how the parentheses -match, put the cursor at a left or right parenthesis and hit \fB%\fR. -This will show you the matching parenthesis. -This works also for braces { and }, and brackets [ and ]. -.PP -If you are editing C programs, you can use the \fB[[\fR and \fB]]\fR keys -to advance or retreat to a line starting with a \fB{\fR, i.e. a function -declaration at a time. When \fB]]\fR is used with an operator it stops -after a line which starts with \fB}\fR; this is sometimes useful with -\fBy]]\fR. -.NH 2 -Filtering portions of the buffer -.PP -You can run system commands over portions of the buffer using the operator -\fB!\fR. -You can use this to sort lines in the buffer, or to reformat portions -of the buffer with a pretty-printer. -Try typing in a list of random words, one per line and ending them -with a blank line. Back up to the beginning of the list, and then give -the command \fB!}sort\fR\s-2CR\s0. This says to sort the next paragraph -of material, and the blank line ends a paragraph. -.NH 2 -Commands for editing \s-2LISP\s0 -.PP -If you are editing a \s-2LISP\s0 program you should set the option -.I lisp -by doing -\fB:se\ lisp\fR\s-2CR\s0. -This changes the \fB(\fR and \fB)\fR commands to move backward and forward -over s-expressions. -The \fB{\fR and \fB}\fR commands are like \fB(\fR and \fB)\fR but don't -stop at atoms. These can be used to skip to the next list, or through -a comment quickly. -.PP -The -.I autoindent -option works differently for \s-2LISP\s0, supplying indent to align at -the first argument to the last open list. If there is no such argument -then the indent is two spaces more than the last level. -.PP -There is another option which is useful for typing in \s-2LISP\s0, the -.I showmatch -option. -Try setting it with -\fB:se sm\fR\s-2CR\s0 -and then try typing a `(' some words and then a `)'. Notice that the -cursor shows the position of the `(' which matches the `)' briefly. -This happens only if the matching `(' is on the screen, and the cursor -stays there for at most one second. -.PP -The editor also has an operator to realign existing lines as though they -had been typed in with -.I lisp -and -.I autoindent -set. This is the \fB=\fR operator. -Try the command \fB=%\fR at the beginning of a function. This will realign -all the lines of the function declaration. -.PP -When you are editing \s-2LISP\s0,, the \fB[[\fR and \fR]]\fR advance -and retreat to lines beginning with a \fB(\fR, and are useful for dealing -with entire function definitions. -.NH 2 -Macros -.PP -.I Vi -has a parameterless macro facility, which lets you set it up so that -when you hit a single keystroke, the editor will act as though -you had hit some longer sequence of keys. You can set this up if -you find yourself typing the same sequence of commands repeatedly. -.PP -Briefly, there are two flavors of macros: -.IP a) -Ones where you put the macro body in a buffer register, say \fIx\fR. -You can then type \fB@x\fR to invoke the macro. The \fB@\fR may be followed -by another \fB@\fR to repeat the last macro. -.IP b) -You can use the -.I map -command from -.I vi -(typically in your -.I EXINIT ) -with a command of the form: -.DS -:map \fIlhs\fR \fIrhs\fR\s-2CR -.DE -mapping -.I lhs -into -.I rhs. -There are restrictions: -.I lhs -should be one keystroke (either 1 character or one function key) -since it must be entered within one second -(unless -.I notimeout -is set, in which case you can type it as slowly as you wish, -and -.I vi -will wait for you to finish it before it echoes anything). -The -.I lhs -can be no longer than 10 characters, the -.I rhs -no longer than 100. -To get a space, tab or newline into -.I lhs -or -.I rhs -you should escape them with a \fB^V\fR. -(It may be necessary to double the \fB^V\fR if the map -command is given inside -.I vi, -rather than in -.I ex.) -Spaces and tabs inside the -.I rhs -need not be escaped. -.PP -Thus to make the \fBq\fR key write and exit the editor, you can give -the command -.DS -:map q :wq\fB^V^V\fP\s-2CR CR\s0 -.DE -which means that whenever you type \fBq\fR, it will be as though you -had typed the four characters \fB:wq\fR\s-2CR\s0. -A \fB^V\fR's is needed because without it the \s-2CR\s0 would end the -\fB:\fR command, rather than becoming part of the -.I map -definition. -There are two -.B ^V 's -because from within -.I vi , -two -.B ^V 's -must be typed to get one. -The first \s-2CR\s0 is part of the -.I rhs , -the second terminates the : command. -.PP -Macros can be deleted with -.DS -unmap lhs -.DE -.PP -If the -.I lhs -of a macro is ``#0'' through ``#9'', this maps the particular function key -instead of the 2 character ``#'' sequence. So that terminals without -function keys can access such definitions, the form ``#x'' will mean function -key -.I x -on all terminals (and need not be typed within one second.) -The character ``#'' can be changed by using a macro in the usual way: -.DS -:map \fB^V^V^I\fP # -.DE -to use tab, for example. (This won't affect the -.I map -command, which still uses -.B #, -but just the invocation from visual mode. -.PP -The undo command reverses an entire macro call as a unit, -if it made any changes. -.PP -Placing a `!' after the word -.B map -causes the mapping to apply -to input mode, rather than command mode. -Thus, to arrange for \fB^T\fP to be the same as 4 spaces in input mode, -you can type: -.DS -:map \fB^T\fP \fB^V\fP\o'b/'\o'b/'\o'b/'\o'b/' -.DE -where -.B \o'b/' -is a blank. -The \fB^V\fP is necessary to prevent the blanks from being taken as -white space between the -.I lhs -and -.I rhs . -.NH -Word Abbreviations -.PP -A feature similar to macros in input mode is word abbreviation. -This allows you to type a short word and have it expanded into -a longer word or words. -The commands are -.B :abbreviate -and -.B :unabbreviate -(\fB:ab\fP -and -.B :una ) -and have the same syntax as -.B :map . -For example: -.DS -:ab eecs Electrical Engineering and Computer Sciences -.DE -causes the word `eecs' to always be changed into the -phrase `Electrical Engineering and Computer Sciences'. -Word abbreviation is different from macros in that -only whole words are affected. -If `eecs' were typed as part of a larger word, it would -be left alone. -Also, the partial word is echoed as it is typed. -There is no need for an abbreviation to be a single keystroke, -as it should be with a macro. -.NH 2 -Abbreviations -.PP -The editor has a number of short -commands which abbreviate longer commands which we -have introduced here. You can find these commands easily -on the quick reference card. -They often save a bit of typing and you can learn them as convenient. -.NH 1 -Nitty-gritty details -.NH 2 -Line representation in the display -.PP -The editor folds long logical lines onto many physical lines in the display. -Commands which advance lines advance logical lines and will skip -over all the segments of a line in one motion. The command \fB|\fR moves -the cursor to a specific column, and may be useful for getting near the -middle of a long line to split it in half. Try \fB80|\fR on a line which -is more than 80 columns long.\*(dg -.FS -\*(dg You can make long lines very easily by using \fBJ\fR to join together -short lines. -.FE -.PP -The editor only puts full lines on the display; if there is not enough -room on the display to fit a logical line, the editor leaves the physical -line empty, placing only an @ on the line as a place holder. When you -delete lines on a dumb terminal, the editor will often just clear the -lines to @ to save time (rather than rewriting the rest of the screen.) -You can always maximize the information on the screen by giving the \fB^R\fR -command. -.PP -If you wish, you can have the editor place line numbers before each line -on the display. Give the command \fB:se nu\fR\s-2CR\s0 to enable -this, and the command \fB:se nonu\fR\s-2CR\s0 to turn it off. -You can have tabs represented as \fB^I\fR and the ends of lines indicated -with `$' by giving the command \fB:se list\fR\s-2CR\s0; -\fB:se nolist\fR\s-2CR\s0 turns this off. -.PP -Finally, lines consisting of only the character `~' are displayed when -the last line in the file is in the middle of the screen. These represent -physical lines which are past the logical end of file. -.NH 2 -Counts -.PP -Most -.I vi -commands will use a preceding count to affect their behavior in some way. -The following table gives the common ways in which the counts are used: -.DS -.TS -l lb. -new window size : / ? [[ ]] \` \' -scroll amount ^D ^U -line/column number z G | -repeat effect \fRmost of the rest\fP -.TE -.DE -.PP -The editor maintains a notion of the current default window size. -On terminals which run at speeds greater than 1200 baud -the editor uses the full terminal screen. -On terminals which are slower than 1200 baud -(most dialup lines are in this group) -the editor uses 8 lines as the default window size. -At 1200 baud the default is 16 lines. -.PP -This size is the size used when the editor clears and refills the screen -after a search or other motion moves far from the edge of the current window. -The commands which take a new window size as count all often cause the -screen to be redrawn. If you anticipate this, but do not need as large -a window as you are currently using, you may wish to change the screen -size by specifying the new size before these commands. -In any case, the number of lines used on the screen will expand if you -move off the top with a \fB\-\fR or similar command or off the bottom -with a command such as \s-2RETURN\s0 or \fB^D\fR. -The window will revert to the last specified size the next time it is -cleared and refilled.\*(dg -.FS -\*(dg But not by a \fB^L\fR which just redraws the screen as it is. -.FE -.PP -The scroll commands \fB^D\fR and \fB^U\fR likewise remember the amount -of scroll last specified, using half the basic window size initially. -The simple insert commands use a count to specify a repetition of the -inserted text. Thus \fB10a+\-\-\-\-\fR\s-2ESC\s0 will insert a grid-like -string of text. -A few commands also use a preceding count as a line or column number. -.PP -Except for a few commands which ignore any counts (such as \fB^R\fR), -the rest of the editor commands use a count to indicate a simple repetition -of their effect. Thus \fB5w\fR advances five words on the current line, -while \fB5\fR\s-2RETURN\s0 advances five lines. A very useful instance -of a count as a repetition is a count given to the \fB.\fR command, which -repeats the last changing command. If you do \fBdw\fR and then \fB3.\fR, -you will delete first one and then three words. You can then delete -two more words with \fB2.\fR. -.NH 2 -More file manipulation commands -.PP -The following table lists the file manipulation commands which you can -use when you are in -.I vi. -.KF -.DS -.TS -lb l. -:w write back changes -:wq write and quit -:x write (if necessary) and quit (same as ZZ). -:e \fIname\fP edit file \fIname\fR -:e! reedit, discarding changes -:e + \fIname\fP edit, starting at end -:e +\fIn\fP edit, starting at line \fIn\fP -:e # edit alternate file -:w \fIname\fP write file \fIname\fP -:w! \fIname\fP overwrite file \fIname\fP -:\fIx,y\fPw \fIname\fP write lines \fIx\fP through \fIy\fP to \fIname\fP -:r \fIname\fP read file \fIname\fP into buffer -:r !\fIcmd\fP read output of \fIcmd\fP into buffer -:n edit next file in argument list -:n! edit next file, discarding changes to current -:n \fIargs\fP specify new argument list -:ta \fItag\fP edit file containing tag \fItag\fP, at \fItag\fP -.TE -.DE -.KE -All of these commands are followed by a \s-2CR\s0 or \s-2ESC\s0. -The most basic commands are \fB:w\fR and \fB:e\fR. -A normal editing session on a single file will end with a \fBZZ\fR command. -If you are editing for a long period of time you can give \fB:w\fR commands -occasionally after major amounts of editing, and then finish -with a \fBZZ\fR. When you edit more than one file, you can finish -with one with a \fB:w\fR and start editing a new file by giving a \fB:e\fR -command, -or set -.I autowrite -and use \fB:n\fP . -.PP -If you make changes to the editor's copy of a file, but do not wish to -write them back, then you must give an \fB!\fR after the command you -would otherwise use; this forces the editor to discard any changes -you have made. Use this carefully. -.ne 1i -.PP -The \fB:e\fR command can be given a \fB+\fR argument to start at the -end of the file, or a \fB+\fR\fIn\fR argument to start at line \fIn\fR\^. -In actuality, \fIn\fR may be any editor command not containing a space, -usefully a scan like \fB+/\fIpat\fR or \fB+?\fIpat\fR. -In forming new names to the \fBe\fR command, you can use the character -\fB%\fR which is replaced by the current file name, or the character -\fB#\fR which is replaced by the alternate file name. -The alternate file name is generally the last name you typed other than -the current file. Thus if you try to do a \fB:e\fR and get a diagnostic -that you haven't written the file, you can give a \fB:w\fR command and -then a \fB:e #\fR command to redo the previous \fB:e\fR. -.PP -You can write part of the buffer to a file by finding out the lines -that bound the range to be written using \fB^G\fR, and giving these -numbers after the \fB:\fR -and before the \fBw\fP, separated by \fB,\fR's. -You can also mark these lines with \fBm\fR and -then use an address of the form \fB\(aa\fR\fIx\fR\fB,\fB\(aa\fR\fIy\fR -on the \fBw\fR command here. -.PP -You can read another file into the buffer after the current line by using -the \fB:r\fR command. -You can similarly read in the output from a command, just use \fB!\fR\fIcmd\fR -instead of a file name. -.PP -If you wish to edit a set of files in succession, you can give all the -names on the command line, and then edit each one in turn using the command -\fB:n\fR. It is also possible to respecify the list of files to be edited -by giving the \fB:n\fR command a list of file names, or a pattern to -be expanded as you would have given it on the initial -.I vi -command. -.PP -If you are editing large programs, you will find the \fB:ta\fR command -very useful. It utilizes a data base of function names and their locations, -which can be created by programs such as -.I ctags, -to quickly find a function whose name you give. -If the \fB:ta\fR command will require the editor to switch files, then -you must \fB:w\fR or abandon any changes before switching. You can repeat -the \fB:ta\fR command without any arguments to look for the same tag -again. -.NH 2 -More about searching for strings -.PP -When you are searching for strings in the file with \fB/\fR and \fB?\fR, -the editor normally places you at the next or previous occurrence -of the string. If you are using an operator such as \fBd\fR, -\fBc\fR or \fBy\fR, then you may well wish to affect lines up to the -line before the line containing the pattern. You can give a search of -the form \fB/\fR\fIpat\fR\fB/\-\fR\fIn\fR to refer to the \fIn\fR'th line -before the next line containing \fIpat\fR, or you can use \fB+\fR instead -of \fB\-\fR to refer to the lines after the one containing \fIpat\fR. -If you don't give a line offset, then the editor will affect characters -up to the match place, rather than whole lines; thus use ``+0'' to affect -to the line which matches. -.PP -You can have the editor ignore the case of words in the searches it does -by giving the command \fB:se ic\fR\s-2CR\s0. -The command \fB:se noic\fR\s-2CR\s0 turns this off. -.ne 1i -.PP -Strings given to searches may actually be regular expressions. -If you do not want or need this facility, you should -.DS -set nomagic -.DE -in your EXINIT. -In this case, -only the characters \fB\(ua\fR and \fB$\fR are special in patterns. -The character \fB\e\fR is also then special (as it is most everywhere in -the system), and may be used to get at the -an extended pattern matching facility. -It is also necessary to use a \e before a -\fB/\fR in a forward scan or a \fB?\fR in a backward scan, in any case. -The following table gives the extended forms when \fBmagic\fR is set. -.DS -.TS -lb l. -\(ua at beginning of pattern, matches beginning of line -$ at end of pattern, matches end of line -\fB\&.\fR matches any character -\e< matches the beginning of a word -\e> matches the end of a word -[\fIstr\fP] matches any single character in \fIstr\fP -[\(ua\fIstr\fP] matches any single character not in \fIstr\fP -[\fIx\fP\-\fIy\fP] matches any character between \fIx\fP and \fIy\fP -* matches any number of the preceding pattern -.TE -.DE -If you use \fBnomagic\fR mode, then -the \fB. [\fR and \fB*\fR primitives are given with a preceding -\e. -.NH 2 -More about input mode -.PP -There are a number of characters which you can use to make corrections -during input mode. These are summarized in the following table. -.sp .5 -.DS -.TS -lb l. -^H deletes the last input character -^W deletes the last input word, defined as by \fBb\fR -erase your erase character, same as \fB^H\fP -kill your kill character, deletes the input on this line -\e escapes a following \fB^H\fP and your erase and kill -\s-2ESC\s0 ends an insertion -\s-2DEL\s0 interrupts an insertion, terminating it abnormally -\s-2CR\s0 starts a new line -^D backtabs over \fIautoindent\fP -0^D kills all the \fIautoindent\fP -\(ua^D same as \fB0^D\fP, but restores indent next line -^V quotes the next non-printing character into the file -.TE -.DE -.sp .5 -.PP -The most usual way of making corrections to input is by typing \fB^H\fR -to correct a single character, or by typing one or more \fB^W\fR's to -back over incorrect words. If you use \fB#\fR as your erase character -in the normal system, it will work like \fB^H\fR. -.PP -Your system kill character, normally \fB@\fR, \fB^X\fP or \fB^U\fR, -will erase all -the input you have given on the current line. -In general, you can neither -erase input back around a line boundary nor can you erase characters -which you did not insert with this insertion command. To make corrections -on the previous line after a new line has been started you can hit \s-2ESC\s0 -to end the insertion, move over and make the correction, and then return -to where you were to continue. The command \fBA\fR which appends at the -end of the current line is often useful for continuing. -.PP -If you wish to type in your erase or kill character (say # or @) then -you must precede it with a \fB\e\fR, just as you would do at the normal -system command level. A more general way of typing non-printing characters -into the file is to precede them with a \fB^V\fR. The \fB^V\fR echoes -as a \fB\(ua\fR character on which the cursor rests. This indicates that -the editor expects you to type a control character. In fact you may -type any character and it will be inserted into the file at that point.* -.FS -* This is not quite true. The implementation of the editor does -not allow the \s-2NULL\s0 (\fB^@\fR) character to appear in files. Also -the \s-2LF\s0 (linefeed or \fB^J\fR) character is used by the editor -to separate lines in the file, so it cannot appear in the middle of a -line. You can insert any other character, however, if you wait for the -editor to echo the \fB\(ua\fR before you type the character. In fact, -the editor will treat a following letter as a request for the corresponding -control character. This is the only way to type \fB^S\fR or \fB^Q\fP, -since the system normally uses them to suspend and resume output -and never gives them to the editor to process. -.FE -.PP -If you are using \fIautoindent\fR you can backtab over the indent which -it supplies by typing a \fB^D\fR. This backs up to a \fIshiftwidth\fR -boundary. -This only works immediately after the supplied \fIautoindent\fR. -.PP -When you are using \fIautoindent\fR you may wish to place a label at -the left margin of a line. The way to do this easily is to type \fB\(ua\fR -and then \fB^D\fR. The editor will move the cursor to the left margin -for one line, and restore the previous indent on the next. You can also -type a \fB0\fR followed immediately by a \fB^D\fR if you wish to kill -all the indent and not have it come back on the next line. -.NH 2 -Upper case only terminals -.PP -If your terminal has only upper case, you can still use -.I vi -by using the normal -system convention for typing on such a terminal. -Characters which you normally type are converted to lower case, and you -can type upper case letters by preceding them with a \e. -The characters { ~ } | \(ga are not available on such terminals, but you -can escape them as \e( \e\(ua \e) \e! \e\(aa. -These characters are represented on the display in the same way they -are typed.\*(dd -.FS -\*(dd The \e character you give will not echo until you type another -key. -.FE -.NH 2 -Vi and ex -.PP -.I Vi -is actually one mode of editing within the editor -.I ex. -When you are running -.I vi -you can escape to the line oriented editor of -.I ex -by giving the command -\fBQ\fR. -All of the -.B : -commands which were introduced above are available in -.I ex. -Likewise, most -.I ex -commands can be invoked from -.I vi -using :. -Just give them without the \fB:\fR and follow them with a \s-2CR\s0. -.PP -In rare instances, an internal error may occur in -.I vi. -In this case you will get a diagnostic and be left in the command mode of -.I ex. -You can then save your work and quit if you wish by giving a command -\fBx\fR after the \fB:\fR which \fIex\fR prompts you with, or you can -reenter \fIvi\fR by giving -.I ex -a -.I vi -command. -.PP -There are a number of things which you can do more easily in -.I ex -than in -.I vi. -Systematic changes in line oriented material are particularly easy. -You can read the advanced editing documents for the editor -.I ed -to find out a lot more about this style of editing. -Experienced -users often mix their use of -.I ex -command mode and -.I vi -command mode to speed the work they are doing. -.NH 2 -Open mode: vi on hardcopy terminals and ``glass tty's'' -\(dd -.PP -If you are on a hardcopy terminal or a terminal which does not have a cursor -which can move off the bottom line, you can still use the command set of -.I vi, -but in a different mode. -When you give a -.I vi -command, the editor will tell you that it is using -.I open -mode. -This name comes from the -.I open -command in -.I ex, -which is used to get into the same mode. -.PP -The only difference between -.I visual -mode -and -.I open -mode is the way in which the text is displayed. -.PP -In -.I open -mode the editor uses a single line window into the file, and moving backward -and forward in the file causes new lines to be displayed, always below the -current line. -Two commands of -.I vi -work differently in -.I open: -.B z -and -\fB^R\fR. -The -.B z -command does not take parameters, but rather draws a window of context around -the current line and then returns you to the current line. -.PP -If you are on a hardcopy terminal, -the -.B ^R -command will retype the current line. -On such terminals, the editor normally uses two lines to represent the -current line. -The first line is a copy of the line as you started to edit it, and you work -on the line below this line. -When you delete characters, the editor types a number of \e's to show -you the characters which are deleted. The editor also reprints the current -line soon after such changes so that you can see what the line looks -like again. -.PP -It is sometimes useful to use this mode on very slow terminals which -can support -.I vi -in the full screen mode. -You can do this by entering -.I ex -and using an -.I open -command. -.LP -.SH -Acknowledgements -.PP -Bruce Englar encouraged the early development of this display editor. -Peter Kessler helped bring sanity to version 2's command layout. -Bill Joy wrote versions 1 and 2.0 through 2.7, -and created the framework that users see in the present editor. -Mark Horton added macros and other features and made the -editor work on a large number of terminals and Unix systems. diff --git a/docs/USD.doc/vitut/vi.summary b/docs/USD.doc/vitut/vi.summary deleted file mode 100644 index 8a09ce944407..000000000000 --- a/docs/USD.doc/vitut/vi.summary +++ /dev/null @@ -1,468 +0,0 @@ -.\" Copyright (c) 1980, 1993 -.\" The Regents of the University of California. All rights reserved. -.\" -.\" Redistribution and use in source and binary forms, with or without -.\" modification, are permitted provided that the following conditions -.\" are met: -.\" 1. Redistributions of source code must retain the above copyright -.\" notice, this list of conditions and the following disclaimer. -.\" 2. Redistributions in binary form must reproduce the above copyright -.\" notice, this list of conditions and the following disclaimer in the -.\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -.\" SUCH DAMAGE. -.\" -.\" @(#)vi.summary 8.3 (Berkeley) 8/18/96 -.\" -.ds CH -.ds CF -.de TS -.br -.if !\\n(1T .RT -.ul 0 -.ti \\n(.iu -.if t .sp 0.25 -.if n .sp -.if \\$1H .TQ -.nr IX 1 -.. -.nr PS 9 -.ps 9 -.nr VS 11 -.vs 11 -.nr HM .50i -.nr FM .25i -.nr PO 1.0i -.po 1.0i -.nr LL 4.5i -.ll 4.5i -.de nc -.bp -.. -.de h -.LG -.B -\\$1 -.R -.NL -.. -.LG -.LG -.B -.ce -Ex Quick Reference -.R -.NL -.LP -.LP -.h "Entering/leaving ex" -.TS -aw(1.4i)b aw(1.8i). -% ex \fIname\fP edit \fIname\fP, start at end -% ex +\fIn\fP \fIname\fP ... at line \fIn\fP -% ex \-t \fItag\fP start at \fItag\fP -% ex \-r list saved files -% ex \-r \fIname\fP recover file \fIname\fP -% ex \fIname\fP ... edit first; rest via \fB:n\fP -% ex \-R \fIname\fP read only mode -: x exit, saving changes -: q! exit, discarding changes -.TE -.h "Ex states" -.TS -lw(1i) lw(2.0i). -Command T{ -Normal and initial state. Input prompted for by \fB:\fP. -Your kill character cancels partial command. -T} -Insert T{ -Entered by \fBa\fP \fBi\fP and \fBc\fP. -Arbitrary text then terminates with line having only \fB.\fP -character on it or abnormally with interrupt. -T} -Open/visual T{ -Entered by \fBopen\fP or \fBvi\fP, terminates with \fBQ\fP -or ^\e. -T} -.TE -.h "Ex commands" -.TS -lw(.45i) lw(.08i)b lw(.45i) lw(.08i)b lw(.45i) lw(.08i)b. -abbrev ab next n unabbrev una -append a number nu undo u -args ar open o unmap unm -change c preserve pre version ve -copy co print p visual vi -delete d put pu write w -edit e quit q xit x -file f read re yank ya -global g recover rec \fIwindow\fP z -insert i rewind rew \fIescape\fP ! -join j set se \fIlshift\fP < -list l shell sh \fIprint next\fP \fRCR\fP -map source so \fIresubst\fP & -mark ma stop st \fIrshift\fP > -move m substitute s \fIscroll\fP ^D -.TE -.h "Ex command addresses" -.TS -lw(.3i)b lw(0.8i) lw(.3i)b lw(0.8i). -\fIn\fP line \fIn\fP /\fIpat\fP next with \fIpat\fP -\&. current ?\fIpat\fP previous with \fIpat\fP -$ last \fIx\fP-\fIn\fP \fIn\fP before \fIx\fP -+ next \fIx\fP,\fIy\fP \fIx\fP through \fIy\fP -\- previous \(aa\fIx\fP marked with \fIx\fP -+\fIn\fP \fIn\fP forward \(aa\(aa previous context -% 1,$ -.TE -.nc -.h "Specifying terminal type" -.TS -aw(1.7i)b aw(1.5i). -% setenv TERM \fItype\fP \fIcsh\fP and all version 6 -$ TERM=\fItype\fP; export TERM \fIsh\fP in Version 7 -See also \fItset\fR(1) -.TE -.h "Some terminal types" -.TS -lw(.4i) lw(.4i) lw(.4i) lw(.4i) lw(.4i). -2621 43 adm31 dw1 h19 -2645 733 adm3a dw2 i100 -300s 745 c100 gt40 mime -33 act4 dm1520 gt42 owl -37 act5 dm2500 h1500 t1061 -4014 adm3 dm3025 h1510 vt52 -.TE -.h "Initializing options" -.TS -lw(.9i)b aw(1.5i). -EXINIT place \fBset\fP's here in environment var. -set \fIx\fP enable option -set no\fIx\fP disable option -set \fIx\fP=\fIval\fP give value \fIval\fP -set show changed options -set all show all options -set \fIx\fP? show value of option \fIx\fP -.TE -.h "Useful options" -.TS -lw(.9i)b lw(.3i) lw(1.0i). -autoindent ai supply indent -autowrite aw write before changing files -ignorecase ic in scanning -lisp \fB( ) { }\fP are s-exp's -list print ^I for tab, $ at end -magic \fB. [ *\fP special in patterns -number nu number lines -paragraphs para macro names which start ... -redraw simulate smart terminal -scroll command mode lines -sections sect macro names ... -shiftwidth sw for \fB< >\fP, and input \fB^D\fP -showmatch sm to \fB)\fP and \fB}\fP as typed -slowopen slow choke updates during insert -window visual mode lines -wrapscan ws around end of buffer? -wrapmargin wm automatic line splitting -.TE -.LP -.h "Scanning pattern formation" -.TS -aw(.9i)b aw(1.0i). -\(ua beginning of line -$ end of line -\fB.\fR any character -\e< beginning of word -\e> end of word -[\fIstr\fP] any char in \fIstr\fP -[\(ua\fIstr\fP] ... not in \fIstr\fP -[\fIx\-y\fP] ... between \fIx\fP and \fIy\fP -* any number of preceding -.TE -.nc -.LP -.LG -.LG -.B -.ce -Vi Quick Reference -.NL -.R -.LP -.LP -.h "Entering/leaving vi" -.TS -aw(1.4i)b aw(1.8i). -% vi \fIname\fP edit \fIname\fP at top -% vi +\fIn\fP \fIname\fP ... at line \fIn\fP -% vi + \fIname\fP ... at end -% vi \-r list saved files -% vi \-r \fIname\fP recover file \fIname\fP -% vi \fIname\fP ... edit first; rest via \fB:n\fP -% vi \-t \fItag\fP start at \fItag\fP -% vi +/\fIpat\fP \fIname\fP search for \fIpat\fP -% view \fIname\fP read only mode -ZZ exit from vi, saving changes -^Z stop vi for later resumption -.TE -.h "The display" -.TS -lw(.75i) lw(2.2i). -Last line T{ -Error messages, echoing input to \fB: / ?\fP and \fB!\fR, -feedback about i/o and large changes. -T} -@ lines On screen only, not in file. -~ lines Lines past end of file. -^\fIx\fP Control characters, ^? is delete. -tabs Expand to spaces, cursor at last. -.TE -.LP -.h "Vi states" -.TS -lw(.75i) lw(2.2i). -Command T{ -Normal and initial state. Others return here. -ESC (escape) cancels partial command. -T} -Insert T{ -Entered by \fBa i A I o O c C s S\fP \fBR\fP. -Arbitrary text then terminates with ESC character, -or abnormally with interrupt. -T} -Last line T{ -Reading input for \fB: / ?\fP or \fB!\fP; terminate -with ESC or CR to execute, interrupt to cancel. -T} -.TE -.h "Counts before vi commands" -.TS -lw(1.5i) lw(1.7i)b. -line/column number z G | -scroll amount ^D ^U -replicate insert a i A I -repeat effect \fRmost rest\fP -.TE -.h "Simple commands" -.TS -lw(1.5i)b lw(1.7i). -dw delete a word -de ... leaving punctuation -dd delete a line -3dd ... 3 lines -i\fItext\fP\fRESC\fP insert text \fIabc\fP -cw\fInew\fP\fRESC\fP change word to \fInew\fP -ea\fIs\fP\fRESC\fP pluralize word -xp transpose characters -.TE -.nc -.h "Interrupting, cancelling" -.TS -aw(0.75i)b aw(1.6i). -ESC end insert or incomplete cmd -^? (delete or rubout) interrupts -^L reprint screen if \fB^?\fR scrambles it -.TE -.h "File manipulation" -.TS -aw(0.75i)b aw(1.6i). -:w write back changes -:wq write and quit -:q quit -:q! quit, discard changes -:e \fIname\fP edit file \fIname\fP -:e! reedit, discard changes -:e + \fIname\fP edit, starting at end -:e +\fIn\fR edit starting at line \fIn\fR -:e # edit alternate file -^\(ua synonym for \fB:e #\fP -:w \fIname\fP write file \fIname\fP -:w! \fIname\fP overwrite file \fIname\fP -:sh run shell, then return -:!\fIcmd\fP run \fIcmd\fR, then return -:n edit next file in arglist -:n \fIargs\fP specify new arglist -:f show current file and line -^G synonym for \fB:f\fP -:ta \fItag\fP to tag file entry \fItag\fP -^] \fB:ta\fP, following word is \fItag\fP -.TE -.h "Positioning within file" -.TS -aw(0.75i)b aw(1.6i). -^F forward screenfull -^B backward screenfull -^D scroll down half screen -^U scroll up half screen -G goto line (end default) -/\fIpat\fR next line matching \fIpat\fR -?\fIpat\fR prev line matching \fIpat\fR -n repeat last \fB/\fR or \fB?\fR -N reverse last \fB/\fR or \fB?\fR -/\fIpat\fP/+\fIn\fP n'th line after \fIpat\fR -?\fIpat\fP?\-\fIn\fP n'th line before \fIpat\fR -]] next section/function -[[ previous section/function -% find matching \fB( ) {\fP or \fB}\fP -.TE -.h "Adjusting the screen" -.TS -aw(0.75i)b aw(1.6i). -^L clear and redraw -^R retype, eliminate @ lines -z\fRCR\fP redraw, current at window top -z\- ... at bottom -z\|. ... at center -/\fIpat\fP/z\- \fIpat\fP line at bottom -z\fIn\fP\|. use \fIn\fP line window -^E scroll window down 1 line -^Y scroll window up 1 line -.TE -.nc -.h "Marking and returning -.TS -aw(0.5i)b aw(2.0i). -\(ga\(ga previous context -\(aa\(aa ... at first non-white in line -m\fIx\fP mark position with letter \fIx\fP -\(ga\fIx\fP to mark \fIx\fP -\(aa\fIx\fP ... at first non-white in line -.TE -.h "Line positioning" -.TS -aw(0.5i)b aw(2.0i). -H home window line -L last window line -M middle window line -+ next line, at first non-white -\- previous line, at first non-white -\fRCR\fP return, same as + -\(da \fRor\fP j next line, same column -\(ua \fRor\fP k previous line, same column -.TE -.h "Character positioning" -.TS -aw(0.5i)b aw(2.0i). -\(ua first non white -0 beginning of line -$ end of line -h \fRor\fP \(-> forward -l \fRor\fP \(<- backwards -^H same as \fB\(<-\fP -\fRspace\fP same as \fB\(->\fP -f\fIx\fP find \fIx\fP forward -F\fIx\fP \fBf\fR backward -t\fIx\fP upto \fIx\fP forward -T\fIx\fP back upto \fIx\fP -; repeat last \fBf F t\fP or \fBT\fP -, inverse of \fB;\fP -| to specified column -% find matching \fB( { )\fP or \fB}\fR -.TE -.h "Words, sentences, paragraphs" -.TS -aw(0.5i)b aw(2.0i). -w word forward -b back word -e end of word -) to next sentence -} to next paragraph -( back sentence -{ back paragraph -W blank delimited word -B back \fBW\fP -E to end of \fBW\fP -.TE -.h "Commands for \s-2LISP\s0" -.TS -aw(0.5i)b aw(2.0i). -) Forward s-expression -} ... but don't stop at atoms -( Back s-expression -{ ... but don't stop at atoms -.TE -.nc -.h "Corrections during insert" -.TS -aw(.5i)b aw(2.0i). -^H erase last character -^W erases last word -\fRerase\fP your erase, same as \fB^H\fP -\fRkill\fP your kill, erase input this line -\e escapes \fB^H\fR, your erase and kill -\fRESC\fP ends insertion, back to command -^? interrupt, terminates insert -^D backtab over \fIautoindent\fP -\(ua^D kill \fIautoindent\fP, save for next -0^D ... but at margin next also -^V quote non-printing character -.TE -.h "Insert and replace" -.TS -aw(.5i)b aw(2.0i). -a append after cursor -i insert before -A append at end of line -I insert before first non-blank -o open line below -O open above -r\fIx\fP replace single char with \fIx\fP -R replace characters -.TE -.h "Operators (double to affect lines)" -.TS -aw(0.5i)b aw(2.0i). -d delete -c change -< left shift -> right shift -! filter through command -\&= indent for \s-2LISP\s0 -y yank lines to buffer -.TE -.h "Miscellaneous operations" -.TS -aw(0.5i)b aw(2.0i). -C change rest of line -D delete rest of line -s substitute chars -S substitute lines -J join lines -x delete characters -X ... before cursor -Y yank lines -.TE -.h "Yank and put" -.TS -aw(0.5i)b aw(2.0i). -p put back lines -P put before -"\fIx\fPp put from buffer \fIx\fP -"\fIx\fPy yank to buffer \fIx\fP -"\fIx\fPd delete into buffer \fIx\fP -.TE -.h "Undo, redo, retrieve" -.TS -aw(0.5i)b aw(2.0i). -u undo last change -U restore current line -\fB.\fP repeat last change -"\fId\fP\|p retrieve \fId\fP'th last delete -.TE diff --git a/docs/changelog b/docs/changelog deleted file mode 100644 index 1f2a8c67b478..000000000000 --- a/docs/changelog +++ /dev/null @@ -1,1102 +0,0 @@ -1.78 -> 1.79 (10/23/96) - + Rename delete() to del(), for C++. - + Add Spanish to the list of translations. - + Update to Perl 5.003_06, and other Perl interpreter updates. - + Update the set-edit-option interface for the scripting languages. - + Rework ex command parsing to match historic practice for backslash - escaped characters inside of global commands. - + Enhance the comment edit option to skip C++ comments. - + Change installation to configure the recovery shell script to match - the system pathnames and to install it into the vi data directory. - Move the recover script into the build directory, and delete the - recover directory. - + Enhance LynxOS support. -1.76 -> 1.78 (10/01/96) - + Fix bugs when both the leftright scrolling and number edit options - were on. - + Fix bug where splitting in the middle of the screen could repaint - incorrectly. - + Fix first-nul in input bug, where random garbage was inserted. - + Correct search and mark-as-motion-command bug, it's a line mode - action if the search starts at or before the first non. - + Fix bug autoindent bug, where ^D could shift too far in the line. - + Fix core dump where ! command called from the .exrc file. - + Add the -S command-line option, which initializes vi to have the - secure edit option preset. -1.75 -> 1.76 (09/15/96) - + Fix bug where ^V didn't keep input mapping from happening. - + Fix a core dump bug in the R command. - + Give up on licensing: no more shareware, adware, whatever. - + Fix cursor positioning bug for C, S and c$ in an empty file. -1.74 -> 1.75 (08/22/96) - + Add French to the error message translations. - + Move the UNLICENSED message to the end of the message line. - + Fix bug where wide characters in a file name weren't calculated - correctly in the status message. - + Fix bug where cl_rename was called directly, by the ex shell code. - + Fix bug where splitting a screen resulting in a new screen at the - top of the display resulted in badly displayed status messages. -1.73 -> 1.74 (08/18/96) - + Fix bug where the status line wasn't redisplayed if the user ran - an ex command that trashed the screen. - + Fix bug where the long version of the status line wasn't displayed - when switching screens. - + Rework fast-path filename completion code to sort the entries, and - strip out . and .. by default. - + Fix bug where ex went to the first line instead of the last one when - reading in a file. -1.72 -> 1.73 (08/12/96) - + Do filename completion and some file expansion internally for speed. - + Fix CSCOPE_DIRS environmental variable support. - + Ex parser fix for global commands in script files. - + Add the O_PATH option, so you can specify a directory search path - for files. - + Make it possible to specify the database file to cscope, allowing - multiple databases in a single directory. - + Fix incremental search to overwrite erased characters so the user - can tell where they are on the colon-command line. - + Fix incremental search to restart the search if the user enters an - unescaped shell meta character. -1.71 -> 1.72 (07/12/96) - + Cscope fix: test for files newer than the database was reversed. - + Display "files to edit" message for rewind, next and initial screen. - + Fix a bug in the R command where it could fail if the user extended - the file. - + Fix a bug where text abbreviations could corrupt the line. - + Fix a bug where the windowname edit option couldn't be set before a - file was loaded into the edit buffer. - + Fix a bug where the system .exrc values weren't being overridden by - the user's $HOME .exrc values. - + Fix a bug in the filename completion code, where garbage characters - could be added to the colon command line. - + Fix bug where multiple edit sessions on a non-existent file could - all write the file without warning. - + Fix bug where screen update was incorrect if a character triggered - both a wrapmargin and showmatch condition. - + Fix bug in leftright scrolling where during text input didn't - return the cursor to the left margin. - + Rev the Perl interpreter code, new version from Sven Verdoolaege, - based on Perl 5.003.01. - + Fix bug in tags file pattern search introduced in 1.71. -1.70 -> 1.71 (07/01/96) - + Don't include -- neither HPUX or Solaris can cope with it. - + Fix bug where ^M's in the original pattern were converted into new - lines in the file during substitution commands. - + Make window resize events separate from interrupts -- too many users - complained. - + Fix bug in first-character-is-null text input semantic. - + Rework search routines to take a length instead of a nul-terminated - string for a pattern. This fixes a couple of bugs in searching, but - probably introduces new ones. - + Fix prompting the user after a write filter command, the way I did - it in 1.70 broke the display. - + Don't switch to the alternate xterm screen when entering the ex - text input commands from vi mode. - + Implement the Fg command, so can foreground a background screen into - a split screen. - + Change the fg command to match screen names using the last component - of the filename the full filename fails. -1.69 -> 1.70 (06/28/96) - + Change the ex read command to support named pipes. - + Copy the EXINIT/NEXINIT strings before executing their commands so - we don't step on the process environment. - + Don't do "line modification" reports for intermediate commands - executed from the vi colon command line, it screws up filter - reads, causing nvi to prompt for the user to continue. - + Add "smd" as an abbreviation for showmode: HP, ICL and SCO have it. - + Change nvi to always prompt the user after a write filter command. - This matches historic practice. - + Fix recovery information mailed to the user to reflect the program's - installed name. - + Change configuration script to not cache option information, e.g., - --disable-curses. - + Fix a bug where the second character of the vi [[, ]] and ZZ - commands could start a command mapped sequence. - + Fix 3 write bugs: partial writes (3,$write), were clearing the - modified flag, full writes using line numbers (1,$write) were - not, and append historically never cleared the modified flag, and - we didn't get that right. - + Shorten the "more files to edit" message so it can gang on a single - line, lots of people have complained. Add the number of files that - are left to edit, it's historic practice. - + Fix core dump where message catalogs collided with truncating the - write path. Add a new write message so the string "appended" is - taken from a message catalog. - + Fix bug where an undo followed by '.' to repeat it wouldn't work - if no other repeatable commands had been entered. - + Fix core dump when resolution of input lines' autoindent characters - invalidated cached display information. - + Set the name of the X11 xterm icon/window to "xterm" when exiting, - if modified based on the windowname option. - + Include if it exists, fixes portability problems on IRIX - systems. -1.68 -> 1.69 (06/17/96) - + Add the windowname edit option and code to change the icon/window - name for xterm's. - + Enhance the comment edit option to skip shell comments. - + Add conditional prototypes to replacement C library functions. - + Minor enhancements/reworking to Makefile.in, other build files. - + Fix bug in vi text input ^D processing, could result in cursor - warp to the beginning of the line. - + Fix leftright screen bug where the screen wasn't repainted when - being repainted from scratch. - + Update the Swedish and Dutch catalogs. - + Truncate paths in write commands if they don't fit on one line. - + Fix alternate screen bug where the screen flashed and output lost - when switching to/from the X11 xterm alternate screen. Fix bug - where nvi switched into the alternate screen during filter-read - commands, which doesn't match historic practice. - + Minor relative cursor positioning change, make cursor position - changes from ex real and permanent. -1.67 -> 1.68 (06/09/96) - + Fix core dump when tagging out of a modified file. -1.66 -> 1.67 (06/09/96) - + Convert the license to adware. - + Leftright scrolling tweak, don't repaint the screen as often. - + Change so that search warning/error messages don't appear during an - incremental search. - + Cscope fix: test for files newer than the database was reversed. - + Don't display ex `welcome message' if in ex batch mode. - + Test for vsnprintf and snprintf separately, HP 10.10 has snprintf - but not vsnprintf. - + Reverse lookup order between LC_MESSAGES and LANG. - + Fix Tcl/Perl core dumps in common API code to get/set options. - + Fix R command -- it used a DB pinned page after discarding it. - + Minor fixes in multiple edit buffer message handling code. - + Fix yk command moving to shorter line core dump. - + Rework message handling to try and gang more messages onto a single - line. -1.65 -> 1.66 (05/18/96) - + Convert vi man page to historic -man macro package, and install it. - + Fix bug were !! on an empty line with a nonexistent command left the - cursor on the second character, not the first. - + Fix bug where line redisplay was wrong when a replaced a - previous in the line. - + Fix bug where D (d$) didn't reset the relative cursor position. - + Fix bug where yG incorrectly reset the relative cursor position. - + Fix bug where the window size couldn't be grown once it was shrunk. - + Fix bug where the extended edit option caused tag searches to fail. - + If multiple lines in the tags file with the same leading tag, build - a tags stack like the Cscope stack. This is the obvious extension, - and the way that Larry McVoy's ctags program works. - + Send the appropriate TI/TE sequence in the curses screen whenever - entering ex/vi mode. This means that :shell now shows the correct - screen when using xterm alternate screens. - + Rework the options display code to get five columns in an 80 column - screen. - + Interactive Unix V3.0 port -- mostly file name shortening, other - minor changes. Only preliminary, more work will be necessary. - + Add debugging option to not read EXINIT/.exrc information. - + Fix bug where re_compile printed an error message to the screen - when the user entered [ to an incremental search. - + Turn off screen beeps when incremental search is failing. - + Fix bug where the iclower option didn't trigger an RE recompilation. - + Fix bug where -t into an already locked file forced the user to wait - as if a startup command had failed. - + LynxOS port -- mostly adding even though - was already included. - + Fix ex output bug, where it appeared as if an ex command was skipped - due to flags not being cleared in the vs_msg() routine. - + Fix core dump when global command tried to switch screens. -1.64 -> 1.65 (05/13/96) - + Fix cscope -matching pattern to use extended RE's, and bug - that kept cscope from finding patterns containing s. - + Fix core dumps in both leftright and folded screens when tabstops - edit option value was large, and tab characters occurred as the last - character in the logical screen. - + Fix core dump where the second screen of a folded line wasn't - displayed correctly. - + Fix incremental search to match the current location for strings - starting with \< patterns. - + Fix bug where margins were ignored during replay of text input. - + Fix bug where motion components to shorter lines could lose because - the relative motion flags weren't ever set. This has been broken - forever, but the change almost certainly breaks something else -- I - have no idea what. - + Tags display: don't print the current entry separately, display - them all and add a trailing asterisk for the current one. - + Change the cscope add command to put the directory name through - standard file name expansion. - + Fix cscope use of buffers -- search commands weren't nul-terminated. -1.63 -> 1.64 (05/08/96) - + Add installation target to the Makefile. - + Add documentation on the new tags commands to the Vi Reference - Manual. - + Make the sidescroll edit option work again. - + Fix bug where messages output during startup by ex could be lost. - + Change ex/vi commands errors into beeps, unless the verbose edit - option is set -- there are too many macros that are expected to - eventually fail. This matches historic practice. - + Truncate paths in initial vi screen if they won't fit on one line. - + Make cursor position after filter write match historic practice. - + Force the user to wait if there is output and the user is leaving - the screen for any reason -- don't permit further ex commands. - + Don't use a character to scroll the screen when exiting, - scroll in the vi screen before endwin() is called. - + Fix bug where the column number could be incorrect because the old - screen wasn't updated after a screen split. - + Fix ex print routine to correctly specify print flags. - + Make -g/-O a separate make/configuration option. - + Fix bug where ex/vi messages weren't being joined. - + Fix bug where termcap strings were free'd twice. - + Fix bug where TI/TE still weren't working -- I didn't put in the - translation strings for BSD style curses. - + Fix bug where I misspelled the iclower edit option as icloser. -1.62 -> 1.63 (04/29/96) - + Robustness and type/lint fixes for the Tcl interface code. - + Fix core dump if TERM wasn't set or terminal type was unknown. - + Fix bug where combining ex commands that did/did not require an - ex screen would overwrite the command with the want-to-continue - messsage. - + Fix bug where the screen was never resolved if the user continued - entering ex commands using the : character, but then backspaced - over the prompt to quit or tried to edit their colon command-line - history. - + Fix bug where cursor wasn't placed over the ^ placeholder character - when quoting using the literal-next character. - + Fix bug where nvi under BSD style curses wasn't sending TI/TE termcap - strings when suspending the process. - + Rename mic again, to iclower. - + Fix bug where 'z' commands trailing / or ? commands weren't being - executed. - + Change incremental search to leave the cursor at its last position - when searching for something that was never found. - + Fix bug where search-with-confirmation from vi mode didn't position - the cursor correctly after displaying the confirm message. - + Fix bug where the "search wrapped" message was dependent on the - verbose edit option, which doesn't match historic practice. Change - search messages to be in inverse video. - + Fix bug where matched showmatch character wasn't being displayed - before the matching character was displayed. - + Another cursor update bug required a change to vs_paint(). - + Fix bug were initial line offset was wrong for the first split screen - (symptom is very strange column numbers and blank first line). - + Create filename "argument" lists when creating new screens. - + Fix bug where globals with associated commands that included both - buffer execution and other commands could fail to execute the latter. -1.61 -> 1.62 (04/22/96) - + Rename the "searchci" edit option to be "mic". - + Fix memory corruption in global commands ending in searches. - + Fix text resolution bug, corrected the cursor based on the - first line input, not the last. - + Rework the readonly edit option to match historic practice. - + Fix several minor incremental search bugs; make incremental - searches work in maps. - + Fix long-line core dump, where an incorrect screen map could be - used. -1.60 -> 1.61 (04/12/96) - + The cursor now ends up on the FIRST character of the put text for - all versions of the vi put commands, regardless of the source - of the text. This matches System III/V behavior and POSIX 1003.2. - + Fixed bug where showmatch messages were getting discarded. - + Minor Perl integration fixes. - + Integrate Cscope into the tags stack code -- major change. - + Fixed bug where ^T would drop core if returning to a temporary file. - + Changed vs_ routine to display ex output to replace tab characters - with spaces. - + Fix autoindent code to not back up past beginning of line when ^T - inserted into the middle of a line, i.e. offset != 0. - + Fix "notimeout" option, was being ignored, by a coding error. - + Fix showmatch code to never flash on a match if keys are waiting. - + Change the vi 'D' command to ignore any supplied count, matching - historic practice. - + Fix viusage for D, S, C and Y (the aliased vi commands). - + Fix the Perl5 configuration bug in the configuration script. - + Make file completion commands in empty lines work. - + Fix where the change to let vi use the default ex command structure - broke the ex specification of the script or source file name. - + Fix to free saved RE structures when screens exit. This is a major - RE change, which fixed several bugs in the handling of saved/subst - RE's. It's likely to have added new bugs, however. - + Add case-independent searching (the searchci edit option). - + Add incremental search (the searchincr edit option). - + Home the cursor when executing ex commands from vi. -1.59 -> 1.60 (03/29/96) - + Fix ":w >>" core dump, make that command match historic practice. - + Fix autoindent bug where the length of the line was incorrectly - calculated. - + Fix cursor bug where cursor could end up at the wrong place if the - movement keys were entered quickly enough. - + Change the read/write whirling indicator to appear only every 1/4 - second, clean up the appearance. - + Don't change the options real values until underlying functions - have returned OK -- fix "set tabstop=0" core dump. - + Fix resizing on Sun's: use SA_INTERRUPT to interrupt read calls. - + Fix two forward mark command bugs: one where it wasn't setting the - "favorite cursor" position because of the refresh optimization, - and one where it didn't have VM_RCM_SET set in the command flags - for some reason. - + Fix a bug were the 's' command on top of a didn't correctly - copy the buffer. - + Make :exusage command work for commands having optional leading - capital letters, e.g. Next. - + Previous changes broke the inital-matching-prefix code in the key - mapping part of v_event_get -- fix it, and fix the infinite macro - interrupt code at the same time. - + Add "cedit" edit option, so colon command-line editing is optional. - Change filec/cedit so that you can set them to the same character, - and they do cedit if in column 1, and filec otherwise. - + Fix "source of non-existent file" core dump. - + Fix bug where functions keys specified in startup information were - never resolved/activated. - + Fix v_txt bug where could infinitely loop if triggered an - abbreviation expansion. - + Move version string into VERSION file, out of ex_version.c -1.58 -> 1.59 - + Configuration changes, several minor bug fixes, including a few - core dumps. No functional changes. -1.57 -> 1.58 - + Fix the problem where colon command-line temporary files were - getting left in /tmp. - + Fix the configuration scripts to quit immediately if the Perl - or Tk/Tcl libraries are specified but not found. - + Several screen fixes -- the changes in 1.57 weren't as safe as - I thought. More specifically, the refresh-only-if-waiting change - caused a lot of problems. In general, fixing them should provide - even more speedup, but I'm nervous. - + Lots of changes in the configuration scripts, hopefully this is - just a first-round ordeal. - + Several other minor bug fixes. -1.56 -> 1.57 - + Add hook to colon commands, so you can edit colon commands. - + Add Perl5 interpreter. - + Change shell expansion code to fail if it doesn't read at least - one non-blank character from the shell. If the shell expansion - process fails, or if not at least one non-blank character, it - now displays an error message to the user. - + Rework the screen display so that it matches the historic vi screen - refreshes. - + Rework options processing: print/noprint are no longer cumulative, - provide more information to underlying edit options modules, move - O_MESG information into the screen specific code. - + Make file completion character settable. - + Rework terminal restart -- you can now use ":set term" to switch - terminal types. This cleaned up screen resizing considerably. - + Character display fix, display \177 as ^?, not in hex/octal. - + Tag search bug fix, don't repeat search if successful. - + Replace sys_siglist[] use with private sigmsg() routine. - + Fix core dump if illegal screenId specified to Tcl routine. - + Add get/set mark interface to Tcl Interpreter interface. - + Fix core dump if file expansion code stressed (re: filec edit option) - + Fix bug where filter commands in empty files couldn't find line 0. - + Switch to GNU autoconf 2.7 for configuration, delete nvi/PORT. - Many random portability fixes. -1.55 -> 1.56 (11/26/95) - + Bug fix release -- generally available beta release. -1.54 -> 1.55 (11/18/95) - + Bug fix release. - + Integrate Tcl interpreter. -1.53 -> 1.54 (11/11/95) - + Bug fix release. A major change in reworking the ex commands, when - called from the colon command line, to match historic practice, and - permit them to be entered repeatedly after ex has trashed the screen. - + Use restartable endwin() from System V curses to implement screen - + suspend. -1.52 -> 1.53 (10/29/95) - + Switch to using vendor's curses library for all ports. - + Back out the event driven version, leaving screen separation. - + User configuration of timeout (the escapetime edit option). - + Add Tcl/Tk screen support. - + Add file name completion (the filec edit option). - + Disallow access to outside applications (the secure edit option). -1.51 -> 1.52 (7/26/95) - + Minor cleanups, snapshotted for SMI. -1.50 -> 1.51 (7/05/95) - + Lots and lots of changes for event driven model, largely in moving - the boundary between the screen code and the editor up and down. - Private release for Rob Zimmermann @ Tartan and Bill Shannon @ SMI. -1.49 -> 1.50 Fri Jun 9 13:56:17 1995 - + Minor bug fixes for stability. - + Convert to an event driven model, with the usual Nachos Supreme - layering that results. This is a completely new version, nothing - done previously matters any more. -1.48 -> 1.49 Wed Mar 8 10:42:17 1995 - + Changes in 1.46 broke ^A processing. - + Add :previous to split screen commands. - + Lots o' random bug fixes -- passes purify testing again. -1.47 -> 1.48 Thu Feb 9 18:13:29 1995 - + Random bug fixes for 1.47. - + Move the FREF (file structure) list out of the screen and into - the global area. - + Change semantics to :E to more closely match :e -- ":E" joins - the current file, so ":E /tmp" is now the command to match the - historic ":split". -1.46 -> 1.47 Wed Feb 8 19:43:41 1995 - + All ex commands (including visual and excluding global and v) - are now supported inside ex global commands. - + Rework the append/change/insert commands to match historic - practice for text appended to the ex command line, and inside - of ex global commands. - + Restructure to make single-line screens work. - + Restructure to create curses independent screen routines. - + Restructure to permit Edit, Next, and Tag routines to create new - screens on the fly. - + Change hexadecimal output to be \x## instead of 0x##. - + Change ex commands run from vi to stay in vi mode for as long as - possible, i.e. until ex modifies the screen outside of the editor. -1.45 -> 1.46 Tue Jan 24 10:22:27 1995 - + Restructure to build as a library. -1.44 -> 1.45 Thu Jan 12 21:33:06 1995 - + Fix relative cursor motion to handle folded lines. - + Recompile the search pattern if applicable edit options change. - + Change +/-c command ordering to match historic practice. - + Rework autoindent code to always resolve preceeding - characters when a ^T or ^D are entered. - + Add the print/noprint edit options, so can now specify if - a character is printable. - + Change ex to run in canonical mode. - + Fix ex text input to support the number edit option. - + Vi text input fix for the R command to correctly restore - characters entered and then backspaced over. - + Several vi increment command fixes. -1.43 -> 1.44 - + Bug fix, vi was printing the last line number on the status line - at startup. Change to execute commands at first line set, i.e. - "vi -t tag -c cmd" executes cmd at the tag line, not EOF. -1.42 -> 1.43 Sat Dec 3 13:11:32 1994 - + Marks, SunOS signed comparison fix for 1.42. -1.41 -> 1.42 Fri Dec 2 20:08:16 1994 - + Make autowrite require the file not be read-only. - + Make the ex insert command work in empty files. - + Tab expansion is no longer limited to values < 20 (which matches - historical practice). - + Simplify (and fix limit detection for) the # command. It's no - longer possible to use the # command itself to repeat or modify - a previous # command, '.' is the only possibility. - + Lots more reworking of the ex addresses, putting ? and / into - the ex addressing code broke the world. - + Make the Put, Preserve and Print commands work (don't ask). - + Split stdout/stderr from shell expansions; stdout is expansion - text, stderr is entered on the message queue. -1.40 -> 1.41 Fri Nov 18 16:13:52 1994 - + Addition of a port for AUX 3.1 - + Addition of a message catalog for Russian. - + Make vi ? and / commands be true ex addresses (historic practice). - + Display the date first in vi -r recovery list. -1.39 -> 1.40 Mon Nov 14 10:46:56 1994 - + Two bug fixes for 1.39; -r option and v_change core dump. -1.38 -> 1.39 Sun Nov 13 18:04:08 1994 - + Ex substitution with confirmation now matches historic practice - (except that it still runs in raw mode, not cooked). - + Nvi now clears the screen before painting, if repainting the - entire screen. - + Fix final cursor position for put command entering text in a - single line. - + Change to break error message lines on the last in the - line. - + Always center the current line when returning to a previously - edited file or moving to a tag line that's not visible on the - screen. - + Change write of the current file using an explicit name or % to - match the semantics of :w, not :w file. - + Add command aliases to vi, and remap 6 historic commands to their - historic counterparts: D->d$, Y->y_, S->c_, C->c$, A->$a, I->^i. - + Match option display to historic practice; if boolean or numeric - options changed to default values, not displayed by default. - Nvi treats string options the same way, vi always displayed any - string option that was changed. - + Added lock edit option, if not set, no file locking is done. - + Rework ex to permit any ex command in the EXINIT variable or - exrc startup files. This fixes the bug were `vi +100 file' - painted the screen and then moved to line 100 and repainted. - (Yanked to SCCS ID 9.1.) - + Bug fix: could report file modified more recently than it was - written, incorrectly. - + Search fix: historically, motions with deltas were not corrected - to the previous/next line based on the starting/stopping column. - + Addressing fixes: make trailing non-existent addresses work, change - % to be text substitution, not a unique address (to follow future - POSIX). -1.37 -> 1.38 Mon Oct 24 12:51:58 1994 - + Scrolling fix; ^B can move to nonexistent lines. - + Fix to vi mapped commands; characters while already in - command mode did not historically cause the mapped characters to - be flushed. - + Add the backup edit option, automatically version edit files. - + Make it possible to edit files that db can't read, i.e. edit a - temporary file, with the correct file name. - + Only anchor the last line of the file to the bottom line of the - screen if there's half or less of a screen between the target - line and the end of the file. - + Fix wrapmargin text allocation bug. - + Fix ex put command to work in any empty file. - + Fix global command to handle move's to line 0 correctly. - + Regularize the yank cursor motions, several bug fixes for historic - practice. - + Fix N and n, when used as a motion command for the ! command, - repeat the last bang command instead of prompting for a new - one. - + Timeout maps beginning with quickly, instead of based - on the keytime option. - + Bug fix for wraplen option, wasn't triggered for input commands. -1.36 -> 1.37 Sun Oct 9 19:02:53 1994 - + Change PORT directories to install patches before distribution. - + Fix ^A to set search direction and pattern for consistency. - + Fold the showdirty option into the showmode option. - + Ex addressing fix: change search offset and line arguments (e.g. - the copy command) to be ex addressing offsets, matching historic - practice. - + Ex addressing fix: support ^ as an offset/flag equivalent to -. - + Ex addressing fix: historically, any missing address defaulted to - dot, e.g. "4,,," was the same as ".,.". - + Ex addressing fix: historically, separated numbers were - additive, e.g. "3 5p" displayed line 8. - + Ex addressing fix: make ';' as a range delimiter match historic - practice. - + Change nvi to exit immediately if stdout isn't a terminal. - + Change alternate file name behavior to match historic practice, - make the :write command set the current file name. - + Text input fix; input keys from a map, with an associated count, - weren't historically affected by the wrapmargin value. - + Add wraplen option, same as wrapmargin, but from the left-hand - column, not the right. - + Make ex address . be equivalent to .+, i.e. the - '+' is understood; matches historic practice, and it's widely - documented for ed(1). - + Input mode ^V^J historically mapped into a single ^J. - + Minor catalog changes, fixes; don't use 's' to pluralize words. -1.35 -> 1.36 Thu Sep 8 08:40:25 1994 - + Don't overwrite user's maps with standard (termcap) mappings. - + Make \ escape kill and erase characters in vi text input mode. - + Fix ^D autoindent bug by resolving leading s at ^D. - + Rework abbreviation tests (again!) to match historic practice. - + Change ^D/^U default scrolling value to be based on window option - value, not screen lines, correct scrolling option value, both to - match historic practice. NOTE: System V does this differently! -1.34 -> 1.35 Wed Aug 31 19:20:15 1994 - + Add the historic -l option. - + Message catalogs. - + Display global messages at each flush, just in case some are there. - + Fix global substitute code, `\\' wasn't handled correctly. - + Fix abbreviation code to use s as the preceding character. - + Fix ruler to display logical column, not physical column. - + Block signals when user issues :preserve command, so no race caused - by SIGHUP/SIGTERM. -1.33 -> 1.34 Wed Aug 17 14:37:32 1994 (PUBLICLY AVAILABLE VERSION) - + Back out sccsid string fix, it won't work on SunOS 4.1. -1.32 -> 1.33 Wed Aug 17 09:31:41 1994 (PUBLICLY AVAILABLE VERSION) - + Get back 5K of data space for the sccsid strings. - + Fix bug where cG fix in version 1.31 broke cw cursor positioning - when the change command extended the line. - + Fix core dump in map/seq code if character larger than 7 bits. - + Block signals when manipulating the SCR chains. - + Fix memory allocation for machines with multiple pointer sizes. -1.31 -> 1.32 Mon Aug 15 14:27:49 1994 - + Turn off recno mmap call for Solaris 2.4/SunOS 5.4. -1.30 -> 1.31 Sun Aug 14 13:13:35 1994 - + Fix bug were cG on the last line of a file wasn't done in line mode, - and where the cursor wasn't positioned correctly after exiting text - insert mode. - + Add termcap workaround to make function keys greater than 9 work - correctly (or fail if old-style termcap support). - + Change ex/vi to not flush mapped keys on error -- this is historic - practice, and people depended on it. - + Rework vi parser so that no command including a mapped key ever - becomes the '.' command, matching historic practice. - + Make cancellation in the vi parser match POSIX 1003.2. - + Fix curses bug where standout string was written for each standout - character, and where standout mode was never exited explicitly. - Fix bugs in curses SF/sf and SR/sr scrolling, as seen on Sun and - x86 consoles. - + The v/global commands execute the print command by default. - + The number option historically applies to ex as well as vi. -1.29 -> 1.30 Mon Aug 8 10:30:42 1994 - + Make first read into a temporary set the file's name. - + Permit any key to continue scrolling or ex commands -- this - allows stacked colon commands, and matches historic practice. - + Don't output normal ! command commentary in ex silent mode. - + Allow +/- flags after substitute commands, make line (flag) - offsets from vi mode match historic practice. - + Return to ex immediately, even if preceded by spaces. Rework - ex parser to do erase the prompt instead of depending on the print - routines to do it. Minor fixes to the ex parser for display of - default and scrolling commands. MORE EX PARSER CHANGES. -1.28 -> 1.29 Fri Aug 5 10:18:07 1994 - + Make the abbreviated ex delete command work (:dele---###lll for - example, is historically legal. - + When autoprint fires, multiple flags may be set, use ex_print - directly instead of the stub routines. - + Change v/global commands to turn off autoprint while running. - + Minor changes to make the ! command display match historic output. - + Rework the ex parser to permit multiple command separators without - commands -- MAJOR CHANGE, likely to introduce all sorts of new bugs. - + Fix cd command to expand argument in the context of each element - of the cdpath option, make relative paths always relative to the - current directory. - + Rework write/quit cases for temporary files, so that user's don't - discard them accidentally. - + Check for window size changes when continuing after a suspend. - + Fix memory problem in svi_screen, used free'd memory. - + Change the ex change, insert, append commands to match historic - cursor positions if no data entered by the user. - + Change ex format flags (#, l, p) to affect future commands, not - just the current one, to match historic practice. - + Make the user's EOF character an additional scroll character in ex. - + Fix ex ^D scrolling to be the value of the scroll option, not half - the screen. - + Fix buffer execution to match historic practice -- bugs where the - '*' command didn't work, and @ didn't work. - + Fix doubled reporting of deleted lines in filters. - + Rework the % ` / ? ( ) N n { and ^A commands to always cut into - numeric buffers regardless of the location or length of the cut. - This matches historic practice. - + Fix the { command to check the current line if the cursor doesn't - start on the first character of the line. - + Do '!' expansion in the ex read command arguments, it's historic - practice. In addition, it sets the last '!' command. -1.27 -> 1.28 Wed Jul 27 21:29:18 1994 - + Add support for scrolling using the CS and SF/sf/SR/sr termcap - strings to the 4BSD curses. - + Rework of getkey() introduced a bug where command interrupt put - nvi into an infinite loop. - + Piping through a filter historically cut the replaced lines into - the default buffer, although not the numeric ones. - + Read of a filter and !! historically moved to the first nonblank - of the resulting cursor line (most of the time). - + Rework cursor motion flags, to support '!' as a motion command. -1.26 -> 1.27 Tue Jul 26 10:27:58 1994 - + Add the meta option, to specify characters the shell will expand. - + Fix the read command to match historic practice, the white space - and bang characters weren't getting parsed correctly. - + Change SIGALRM handler to save and restore errno. - + Change SunOS include/compat.h to include so that the - ex/filter.c code works again. - + Don't put lines deleted by the ex delete command into the numeric - buffers, matching historic practice. - + Fix; if appending to a buffer, default buffer historically only - references the appended text, not the resulting text. - + Support multiple, semi-colon separated search strings, and 'z' - commands after search strings. - + Make previous context mark setting match historic practice (see - docs/internals/context). - + Fix the set command to permit whitespace between the option and - the question mark, fix question marks in general. - + Fix bug where ex error messages could be accidentally preceded - by a single space. - + Fix bug where curses reorganization could lose screen specific - mappings as soon as any screen exited. - + Fix bug in paragraph code where invalid macros could be matched. - Make paragraph motions stop at formfeed (^L) characters. - + Change 'c' to match historic practice, it cut text into numeric - buffers. -1.25 -> 1.26 Tue Jul 19 17:46:24 1994 - + Ignore SIGWINCH if the screen size is unchanged; SunOS systems - deliver one when a screen is uncovered. - + Fix: don't permit a command with a motion component to wrap due - to wrapscan and return to the original cursor position. - + Fix: ^E wasn't beeping when reaching the bottom of the file. - + Fix bg/fg bug where tmp file exiting caused a NULL dereference. - + Rework file locking code to use fcntl(2) explicitly. - + Fix bug in section code where invalid macros could be matched. - + Fix bug where line number reset by vi's Q command. - + Add explicit character mode designation to character mode buffers. - + Add include to sex/sex_window.c, needed by NET/2 - vintage systems. - + Change to always flush a character during suspend, 4BSD curses - has the optimization where it doesn't flush after a standend(). - + Fix bug on OSF1 where changes the values of VERASE, - VKILL and VWERASE to incorrect ones. - + Fix bug where optarg used incorrectly in main.c. - + Block all signals when acting on a signal delivery. - + Fix recovery bug where RCV_EMAIL could fire even if there wasn't - a backing file; format recovery message. -1.24 -> 1.25 Sun Jul 17 14:33:38 1994 - + Stop allowing keyboard suspends (^Z) in insert mode, it's hard - to get autowrite correct, and it's not historic practice. - + Fix z^, z+ to match historic practice. - + Bug in message handling, "vi +35 non-existent_file" lost the - status message because the "+35" pushed onto the stack erased - it. For now, change so that messages aren't displayed if there - are keys waiting -- may need to add a "don't-erase" bit to the - character in the stack instead. - + Bug in svi_msgflush(), where error messages could come out in - normal video. -1.23 -> 1.24 Sat Jul 16 18:30:18 1994 - + Fix core dump in exf.c, where editing a non-existent file and - exiting could cause already free'd memory to be free'd. - + Clean up numerous memory errors, courtesy of Purify. - + Change process wait code to fail if wait fails, and not attempt - to interpret the wait return information. - + Open recovery and DB files for writing as well as reading, System - V (fcntl) won't let you acquire LOCK_EX locks otherwise. - + Fix substitute bug where could malloc 0 bytes (AIX breaks). - + Permit the mapping of , it's historic practice. - + Historic vi didn't eat characters before the force - flag, match historic practice. - + Bug in ex argument parsing, corrected for literal characters - twice. - + Delete screen specific maps when the screen closes. - + Move to the first non- in the line on startup; historic - practice. - + Change the ex visual command to move directly to a line if no - trailing 'z' command. - + Fix "[[" and "]]" to match historic practice (yet again...). - + Fix "yb" and "y{" commands to update the cursor correctly. - + Change "~" to match the yank cursor movement semantics - exactly. - + Move all of the curses related code into sex/svi -- major rework, - but should help in future ports. - + Fix bug in split code caused by new file naming code, where would - drop core when a split screen exited. - + Change svi_ex_write to do character display translation, so that - messages with file names in them are displayed correctly. - + Display the file name on split screens instead of a divider line. - + Fix move bug, wasn't copying lines before putting them. - + Fix bug were :n dropped core if no arguments supplied. - + Don't quote characters in executed buffer: "ifoo" should leave - insert mode after the buffer is executed. - + Tagpop and tagpush should set the absolute mark in case only moving - within a file. - + Skip leading whitespace characters before tags and cursor word - searches. - + Fix bug in ex_global where re_conv() was allocating the temporary - buffer and not freeing it. -1.22 -> 1.23: Wed Jun 29 19:22:33 1994 - + New required "inline" to change to "__inline" - + Fix System V curses code for new ^Z support. - + Fix off-by-one in the move code, avoid ":1,$mo$" with only one - line in the buffer. - + Line orientation of motion commands was remembered too long, - i.e. '.' command could be incorrectly marked as line oriented. - + Move file modification time into EXF, so it's shared across - split screens. - + Put the prev[ious] command back in, people complained. - + Random fixes to next/prev semantics changed in 1.22. - + Historically vi doesn't only move to the last address if there's - ANYTHING after the addresses, e.g. ":3" moves to line 3, ":3|" - prints line 3. -1.21 -> 1.22: Mon Jun 27 11:01:41 1994 - + Make the line between split screens inverse video again. - + Delete the prev[ious] command, it's not useful enough to keep. - + Rework :args/file name handling from scratch -- MAJOR CHANGE, - likely to introduce all sorts of new bugs. - + Fix RE bug where no subexpressions in the pattern but there were - subexpressions referenced in the replacement, e.g. "s/XXX/\1/g". - + Change recovery to not leave unmodified files around after a - crash, by using the owner 'x' bit on unmodified backup files. - MAJOR CHANGE, the system recovery script has to change! - + Change -r option to delete recovery.* files that reference non- - existent vi.* files. - + Rework recovery locking so that fcntl(2) locking will work. - + Fix append (upper-case) buffers, broken by cut fixes. - + Fix | to not set the absolute motion mark. - + Read $HOME/.exrc file on startup if the effective user ID is - root. This makes running vi while su(1)'d work correctly. - + Use the full pathname of the file as the recovery name, not - just the last component. Matches historic practice. - + Keep marks in empty files from being destroyed. - + Block all caught signals before calling the DB routines. - + Make the line change report match historic practice (yanked - lines were different than everything else). - + Add section on multiple screens to the reference manual. - + Display all messages at once, combine onto a single line if - possible. Delete the trailing period from all messages. -1.20 -> 1.21: Thu May 19 12:21:58 1994 - + Delete the -l flag from the recover mail. - + Send the user email if ex command :preserve executed, this matches - historic practice. Lots of changes to the preserve and recovery - code, change preserve to snapshot files (again, historic practice). - + Make buffers match historic practice: "add logically stores text - into buffer a, buffer 1, and the unnamed buffer. - + Print characters as ^I on the colon command line if the - list option set. - + Adjust ^F and ^B scroll values in the presence of split screens - and small windows. - + Break msg* routines out from util.c into msg.c, start thinking - about message catalogs. - + Add tildeop set option, based on stevie's option of the same name. - Changes the ~ command into "[count] ~ motion", i.e. ~ takes a - trailing motion. - + Chose NOT to match historic practice on cursor positioning after - consecutive undo commands on a single line; see vi/v_undo.c for - the comment. - + Add a one line cache so that multiple changes to the same line - are only counted once (e.g. "dl35p" changes one line, not 35). - + Rework signals some more. Block file sync signals in vi routines - that interface to DB, so can sync the files at interrupt time. - Write up all of the signal handling arguments, see signal.c. -1.19 -> 1.20: Thu May 5 19:24:57 1994 - + Return ^Z to synchronous handling. See the dicussion in signal.c - and svi_screen.c:svi_curses_init(). - + Fix bug where line change report was wrong in util.c:msg_rpt(). -1.18 -> 1.19: Thu May 5 12:59:51 1994 - + Block DSUSP so that ^Y isn't delivered at SIGTSTP. - + Fix bug -- put into an empty file leaves the cursor at 1,0, - not the first nonblank. - + Fix bug were number of lines reported for the 'P' command was - off-by-one. - + Fix bug were 0^D wasn't being handled correctly. - + Delete remnants of ^Z as a raw character. - + Fix bug where if a map was an entire colon command, it may never - have been displayed. - + Final cursor position fixes for the vi T and t commands. - + The ex :next command took an optional ex command as it's first - argument similar to the :edit commands. Match historic practice. -1.17 -> 1.18: Wed May 4 13:57:10 1994 - + Rework curses information in the PORT/Makefile's. - + Minor fixes to ^Z asynchronous code. -1.16 -> 1.17: Wed May 4 11:15:56 1994 - + Make ex comment handling match historic practice. - + Make ^Z work asynchronously, we can no longer use the SIGTSTP - handler in the curses library. -1.15 -> 1.16: Mon May 2 19:42:07 1994 - + Make the 'p' and 'P' commands support counts, i.e. "Y10p" works. - + Make characters that map to themselves as the first part of the - mapping work, it's historic practice. - + Fix bug where "s/./\& /" discarded the space in the replacement - string. - + Add support for up/down cursor arrows in text input mode, rework - left/right support to match industry practice. - + Fix bug were enough character remapping could corrupt memory. - + Delete O_REMAPMAX in favor of setting interrupts after N mapped - characters without a read, delete the map counter per character. - MAJOR CHANGE. All of the interrupt signal handling has been - reworked so that interrupts are always turned on instead of - being turned on periodically, when an interruptible operation is - pending. - + Fix bug where vi wait() was interrupted by the recovery alarm. - + Make +cmd's and initial commands execute with the current line - set to the last line of the file. This is historic practice. - + Change "lock failed" error message to a file status message. - It always fails over NFS, and making all NFS files readonly - isn't going to fly. - + Use the historic line number format, but check for overflow. - + Fix bug where vi command parser ignored buffers specified as - part of the motion command. - + Make [@*]buffer commands on character mode buffers match historic - practice. - + Fix bug where the cmap/chf entries of the tty structure weren't - being cleared when new characters were read. - + Fix bug where the default command motion flags were being set - when the command was a motion component. - + Fix wrapmargin bug; if appending characters, and wrapmargin breaks - the line, an additional space is eaten. -1.14 -> 1.15: Fri Apr 29 07:44:57 1994 - + Make the ex delete command work in any empty file. - + Fix bug where 't' command placed the cursor on the character - instead of to its left. - + ^D and ^U didn't set the scroll option value historically. - Note, this change means that any user set value (e.g. 15^D) - will be lost when splitting the screen, since the split code - now resets the scroll value regardless. - + Fix the ( command to set the absolute movement mark. - + Only use TIOCGWINSZ for window information if SIGWINCH signal - caught. - + Delete the -l flag, and make -r work for multiple arguments. - Add the ex "recover[!] file" command. - + Switch into ex terminal mode and use the sex routines when - append/change/insert called from vi mode. - + Make ^F and ^B match historic practice. This required a fairly - extensive rework of the svi scrolling code. - + Cursor positioning in H, M, L, G (first non-blank for 1G) wasn't - being done correctly. Delete the SETLFNB flag. H, M, and L stay - logical movements (SETNNB) and G always moves to the first nonblank. - + System V uses "lines" and "cols", not "li" and "co", change as - necessary. Check termcap function returns for errors. - + Fix ` command to do start/end of line correction, - and to set line mode if starting and stopping at column 0. - + Fix bug in delete code where dropped core if deleted in character - mode to an empty line. (Rework the delete code for efficiency.) - + Give up on SunOS 4.1.X, and use "cc" instead of /usr/5bin/cc. - + Protect ex_getline routine from interrupted system calls (if - possible, set SA_RESTART on SIGALRM, too). - + Fix leftright scrolling bug, when moving to a shorter line. - + Do validity checking on the copy, move, t command target line - numbers. - + Change for System V % pattern broke trailing flags for empty - replacement strings. - + Fix bug when RCM flags retained in the saved dot structure. - + Make the ex '=' command work for empty files. - + Fix bug where special_key array was being free'd (it's no longer - allocated). - + Matches cut in line mode only if the starting cursor is at or - before the first nonblank in its line, and the ending cursor is - at or after the last nonblank in its line. - + Add the :wn command, so you can write a file and switch to a new - file in one command. - + Allow only a single key as an argument to :viusage. - + New movement code broke filter/paragraph operations in empty - files ("!}date" in an empty file was dropping core). -1.12 -> 1.14: Mon Apr 18 11:05:10 1994 (PUBLICLY AVAILABLE VERSION, 4.4BSD) - + Fix FILE structure leakage in the ex filter code. - + Rework suspend code for System V curses. Nvi has to do the - the work, there's no way to get curses to do it right. - + Revert SunOS 4.1.X ports to the distributed curses. There's - a bug in Sun's implementation that we can't live with. - + Quit immediately if row/column values are unreasonable. - + Fix the function keys to match vi historic behavior. - + Replace the echo/awk magic in the Makefile's with awk scripts. -1.11 -> 1.12: Thu Apr 14 11:10:19 1994 - + Fix bug where only the first vi key was checked for validity. - + Make 'R' continue to overwrite after a . - + Only display the "no recovery" message once. - + Rework line backup code to restore the line to its previous - condition. - + Don't permit :q in a .exrc file or EXINIT variable. - + Fix wrapscan option bug where forward searches become backward - searches and do cursor correction accordingly. - + Change "dd" to move the cursor to the first non-blank on the line. - + Delete cursor attraction to the first non-blank, change non-blank - motions to set the most attractive cursor position instead. - + Fix 'r' substitute option to set the RE to the last RE, not the - last substitute RE. - + Fix 'c' and 'g' substitute options to always toggle, and fix - edcompatible option to not reset them. - + Display ex error messages in inverse video. - + Fix errorbells option to match historic practice. - + Delete fixed character display table in favor of table built based - on the current locale. - + Add ":set octal" option, that displays unknown characters as octal - values instead of the default hexadecimal. - + Make all command and text input modes interruptible. - + Fix ex input mode to display error messages immediately, instead - of waiting for the lines to be resolved. - + Fix bug where vi calling append could overwrite the command. - + Fix off-by-one in the ex print routine tab code. - + Fix incorrect ^D test in vi text input routines. - + Add autoindent support for ex text insert routines. - + Add System V substitute command replacement pattern semantics, - where '%' means the last replacement pattern. - + Fix bug that \ didn't escape newlines in ex commands. - + Regularize the names of special characters to CH_*. - + Change hex insert character from ^Vx to ^X - + Integrate System V style curses, so SunOS and Solaris ports can - use the native curses implementation. -1.10 -> 1.11: Thu Mar 24 16:07:45 EST 1994 (PUBLICLY AVAILABLE VERSION) - + Change H, M, and L to set the absolute mark, historical practice. - + Fix bug in stepping through multiple tags files. - + Add "remapmax" option that turns off map counts so you can remap - infinitely. If it's off, term_key() can be interrupted from the - keyboard, which will cause the buffers to flush. I also dropped - the default max number of remaps to 50. (Only Dave Hitz's TM - macros and maze appear to go over that limit.) - + Change :mkexrc to not dump w{300,1200,9600}, lisp options. - + Fix backward search within a line bug. - + Change all the includes of "pathnames.h" to use <>'s so that the - PORT versions can use -I. to replace it with their own versions. - + Make reads and writes interruptible. Rework code that enters and - leaves ex for '!' and filter commands, rework all interrupt and - timer code. - + Fix core dump when user displayed option in .exrc file. - + Fix bug where writing empty files didn't update the saved - modification time. - + Fix bug where /pattern/ addressing was always a backward search. - + Fix bug triggered by autoindent of more than 32 characters, where - nvi wasn't checking the right TEXT length. - + Fix bug where joining only empty lines caused a core dump. -1.09 -> 1.10: Sat Mar 19 15:40:29 EST 1994 - + Fix "set all" core dump. -1.08 -> 1.09: Sat Mar 19 10:11:14 EST 1994 - + If the tag's file path is relative, and it doesn't exist, check - relative to the tag file location. - + Fix ~ command to free temporary buffer on error return. - + Create vi.ref, a first cut at a reference document for vi. - The manual page and the reference document only document the - set options, so far. - + Fix 1G bug not always going to the first non-blank. - + Upgrade PORT/regex to release alpha3.4, from Henry Spencer. - + Add MKS vi's "cdpath" option, supporting a cd search path. - + Handle if search as a motion was discarded, i.e. "d/". - + Change nvi to not create multiple recovery files if modifying - a recovered file. - + Decide to ignore that the cursor is before the '$' when inserting - in list mode. It's too hard to fix. -1.07 -> 1.08: Wed Mar 16 07:37:36 EST 1994 - + Leftright and big line scrolling fixes. This meant more changes - to the screen display code, so there may be new problems. - + Don't permit search-style addresses until a file has been read. - + "c[Ww]" command incorrectly handled the "in whitespace" case. - + Fix key space allocation bug triggered by cut/paste under SunOS. - + Ex move command got the final cursor position wrong. - + Delete "optimize option not implemented" message. - + Make the literal-next character turn off mapping for the next - character in text input mode. -1.06 -> 1.07: Mon Mar 14 11:10:33 EST 1994 - + The "wire down" change in 1.05 broke ex command parsing, there - wasn't a corresponding change to handle multiple K_VLNEXT chars. - + Fix final position for vi's 't' command. -1.05 -> 1.06: Sun Mar 13 16:12:52 EST 1994 - + Wire down ^D, ^H, ^W, and ^V, regardless of the user's termios - values. - + Add ^D as the ex scroll command. - + Support ^Q as a literal-next character. - + Rework abbreviations to be delimited by any !inword() character. - + Add options description to the manual page. - + Minor screen cache fix for svi_get.c. - + Rework beautify option support to match historical practice. - + Exit immediately if not reading from a tty and a command fails. - + Default the SunOS 4.* ports to the distributed curses, not SMI's. -1.04 -> 1.05: Thu Mar 24 16:07:45 EST 1994 - + Make cursor keys work in input mode. - + Rework screen column code in vi curses screen. MAJOR CHANGE -- - after this, we'll be debugging curses screen presentation from - scratch. - + Explode include files in vi.h into the source files. -1.03 -> 1.04: Sun Mar 6 14:14:16 EST 1994 - + Make the ex move command keep the marks on the moved lines. - + Change resize semantics so you can set the screen size to a - specific value. A couple of screen fixes for the resize code. - + Fixes for foreground/background due to SIGWINCH. - + Complete rework of all of vi's cursor movements. The underlying - assumption in the old code was that the starting cursor position - was part of the range of lines cut or deleted. The command - "d[[" is an example where this isn't true. Change it so that all - motion component commands set the final cursor position separately - from the range, as it can't be done correctly later. This is a - MAJOR CHANGE -- after this change, we'll be debugging the cursor - positioning from scratch. - + Rewrite the B, b, E, e commands to use vi's getc() interface - instead of rolling their own. - + Add a second MARK structure, LMARK, which is the larger mark - needed by the logging and mark queue code. Everything else uses - the reworked MARK structure, which is simply a line/column pair. - + Rework cut/delete to not expect 1-past-the-end in the range, but - to act on text to the end of the range, inclusive. - + Sync on write's, to force NFS to flush. -1.01 -> 1.03: Sun Jan 23 17:50:35 EST 1994 (PUBLICLY AVAILABLE VERSION) - + Tag stack fixes, was returning to the tag, not the position from - which the user tagged. - + Only use from the cursor to the end of the word in cursor word - searches and tags. (Matches historical vi behavior.) - + Fix delete-last-line bug when line number option set. - + Fix usage line for :split command. - + If O_NUMBER set, long input lines would eventually fail, the column - count for the second screen of long lines wasn't set correctly. - + Fix for [[ reaching SOF with a column longer than the first line. - + Fix for multiple error messages if no screen displayed. - + Fix :read to set alternate file name as in historical practice. - + Fix cut to rotate the numeric buffers if line mode flag set. -1.00 -> 1.01: Wed Jan 12 13:37:18 EST 1994 - + Don't put cut items into numeric buffers if cutting less than - parts of two lines. -0.94 -> 1.00: Mon Jan 10 02:27:27 EST 1994 - + Read-ahead not there; BSD tty driver problem, SunOS curses - problem. - + Global command could error if it deleted the last line of - the file. - + Change '.' to only apply to the 'u' if entered immediately - after the 'u' command. "1pu.u.u. is still broken, but I - expect that it's going to be sacrificed for multiple undo. - + If backward motion on a command, now move to the point; get - yank cursor positioning correct. - + Rework cut buffers to match historic practice -- yank/delete - numeric buffers redone sensibly, ignoring historic practice. -0.92 -> 0.93: Mon Dec 20 19:52:14 EST 1993 - + Christos Zoulas reimplemented the script windows using pty's, - which means that they now work reasonably. The down side of - this is that almost all ports other than 4.4BSD need to include - two new files, login_tty.c and pty.c from the PORT/clib directory. - I've added them to the Makefiles. - + All calloc/malloc/realloc functions now cast their pointers, for - SunOS -- there should be far fewer warning messages, during the - build. The remaining messages are where CHAR_T's meet char *'s, - i.e. where 8-bit clean meets strcmp. - + The user's argument list handling has been reworked so that there - is always a single consistent position for use by :next, :prev and - :rewind. - + All of the historical options are now at least accepted, although - not all of them are implemented. (Edcompatible, hardtabs, lisp, - optimize, redraw, and slowopen aren't implemented.) - + The RE's have been reworked so that matches of length 0 are handled - in the same way as vi used to handle them. - + Several more mapping fixes and ex parser addressing fixes. diff --git a/docs/ev b/docs/ev deleted file mode 100644 index 144295a319f2..000000000000 --- a/docs/ev +++ /dev/null @@ -1,55 +0,0 @@ -# @(#)ev 8.4 (Berkeley) 4/29/94 - -Ev: Vi: Result: - (Cursor keys). Move around the file. - -Meta key commands: -^A<#> <#>G Goto line #. -^A$ G Goto the end of the file. -^A/ / Prompt and execute a forward search. -^A: : Prompt and execute an ex command. -^A? ? Prompt and execute a backward search. -^Ac y' Copy to mark in line mode (or copy the current line). -^AC y` Copy to mark in character mode. -^Ad d' Delete to mark in line mode (or delete the current line). -^AD d` Delete to mark in character mode. -^Aj J Join lines. -^Am m Mark the current cursor position. -^AN N Repeat search in the reverse direction. -^An ^A Search for the word under the cursor. -^Ar u Redo a command. -^Au u Undo a command. - -Single key commands: -^B ^B Page up a screen. -^C ^C Interrupt long-running commands. -^D ^D Page down a half-screen. -^E $ End of line. -^F ^F Page down a screen. -^G ^G File status/information. -^H X Delete the character to the left of the cursor. -^I (TAB) -^J j Cursor down one line. -^K k Cursor up one line. -^L ^L Redraw the screen. -^M (CR) ^M In insert mode, split the line at the current cursor, - creating a new line. - In overwrite mode, cursor down one line. -^N n Repeat previous search, in previous direction. -^O (UNUSED) -^P p Paste the cut text at the cursor position. -^Q (XON/XOFF) -^R (UNUSED) -^S (XON/XOFF) -^T D Truncate the line at the cursor position. -^U ^U Page up a half-screen. -^V ^V Insert/overwrite with a literal next character. -^W w Move forward one whitespace separated word. -^X x Delete the current character. -^Y (UNUSED) -^Z ^Z Suspend. - -New ex mode commands: - -^A:set ov[erwrite] Toggle "insert" mode, so that input keys overwrite - the existing characters. diff --git a/docs/features b/docs/features deleted file mode 100644 index 51650f949efc..000000000000 --- a/docs/features +++ /dev/null @@ -1,83 +0,0 @@ -List of things that should be added: -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - -+ X11 (Tk, Motif, Xaw) interface. -+ Interpreted language (Perl, Scheme, Tcl/Rush, Python) -+ Additional ports: Windows, Windows NT, MSDOS -+ Forms editing package; use RE's to verify field contents. -+ Internationalization, including wide character and multibyte support. -+ Support for single line window editing, including full editing - capability on the vi colon command line. -+ Rob Pike's sam style RE's. -+ Right-to-left and bottom to top text support. -+ Quitall command, to leave all windows. A ! will force the quit. - -List of suggested features: -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -+ It would be nice to have the completion mechanism found in tcsh versions - >= 6.03. For instance, the completion for the `:cd' command will be - directories only. The completion for the `:set' command will be all - options not set at that moment, and for `:set un' will be all options - that are set at that moment. The completion for `:< count' will be the - flags. - -+ Add an command-line option to initially split the screen based on the - number of file arguments, e.g., "nvi -a file1 file2" would initialize - a two edit-buffer display. - -+ Add a "push" command that would push a file on the tags stack. - (Essentially make tags a special case of the stack, and make - the stack more general purpose.) - -+ Make :script just run a command and edit the output, and :interactive, - which allows interactive shell session, instead of just the current - :script. - -+ Add tagging information to the man page so that users can display - the part of the man page that discusses the command in which they're - interested. - -+ Add a zone option so that you can declare that top/bottom few lines - of the screen aren't filled except by accident, so that the text - you ask for is always concentrated in the center of the screen. - -+ Change - :di[splay] tags -> :tags - :di[splay] screens -> :screens - :di[splay] buffers -> :buffers - -+ A macro record function. Add the ability to record a sequence - of keystrokes into a named buffer for later use. Handy when - you're trying to build a semi-complex macro. - -+ The semantics of :split, :bg, and :fg aren't right. Someone needs to - rethink how they should interact. The main problem arises when users - want to get a window into a new file. Currently, the necessary sequence - is ":split newfile|^W|:bg". It would be nice if you could simply - background the current screen and edit a new one. - -+ An option to turn on a ``quarter plane'' model so that you can - go as far to the right or down as you wish. The File or the - current line is only extended if you actually put down a char at - the new location. Very handy for ascii graphics and tables. - -+ Some way of replacing the command bindings. For this to work - cleanly the notion of a command must be separate from that of a - key. (Simulate the Rand editor?) - -+ Vertical splitting, so you can see files side by side. - -+ Tracking. Two or more files are associated so that when one file - is scrolled up/down/left/right other files track by the same amount. - Tracking may be constrained such that two files only track vertically - or horizontally. This is relatively easy to implement. - -+ A status file so that the next time invocation of the editor returns - to the same place, with the same number of windows etc. In case of - change of the screen size, reasonable defaults are used. For each - window size and location of the window, name of the file and position - in it, any tab settings, any other settings for the window (such as - insert/overwrite mode, auto indent etc). Last search RE and maybe - direction. If a file does not exist the next time you invoke the - editor, its window is left in the same place but with some default - message. diff --git a/docs/help b/docs/help deleted file mode 100644 index a7b5d748e043..000000000000 --- a/docs/help +++ /dev/null @@ -1,229 +0,0 @@ -MOVING THE CURSOR: - k - cursor up ^F - page forward / - search forward - j - cursor down ^B - page backward ? - search backward - h - cursor left w - move forward a "word" n - repeat the last search - l - cursor right b - move backward a "word" - -ENTERING TEXT: -a - append after the cursor. Use the key to return to -i - insert before the cursor. command mode. -o - open a new line below the cursor. -O - open new line above the cursor. - -WRITING AND EXITING: -:w - write the file -:q - exit the file -:q! - exit without writing the file -:# - move to a line (e.g., :35 moves to line 35) - -MISCELLANEOUS: -^G - display the file name - J - join two lines (use i to split a line) - u - undo the last change (enter . after a 'u' to undo more than one change) - -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -VI COMMANDS: - ^A search forward for cursor word - ^B scroll up by screens - ^C interrupt an operation (e.g. read, write, search) - ^D scroll down by half screens (setting count) - ^E scroll down by lines - ^F scroll down by screens - ^G file status - ^H move left by characters - ^J move down by lines - ^L redraw screen - ^M move down by lines (to first non-blank) - ^N move down by lines - ^P move up by lines - ^R redraw screen - ^T tag pop - ^U half page up (set count) - ^V input a literal character - ^W move to next screen - ^Y page up by lines - ^Z suspend editor - ^[ exit input mode, cancel partial commands - ^\ switch to ex mode - ^] tag push cursor word - ^^ switch to previous file - move right by columns - ! filter through command(s) to motion - # number increment/decrement - $ move to last column - % move to match - & repeat substitution - ' move to mark (to first non-blank) - ( move back sentence - ) move forward sentence - + move down by lines (to first non-blank) - , reverse last F, f, T or t search - - move up by lines (to first non-blank) - . repeat the last command - / search forward - 0 move to first character - : ex command - ; repeat last F, f, T or t search - < shift lines left to motion - > shift lines right to motion - ? search backward - @ execute buffer - A append to the line - B move back bigword - C change to end-of-line - D delete to end-of-line - E move to end of bigword - F character in line backward search - G move to line - H move to count lines from screen top - I insert before first nonblank - J join lines - L move to screen bottom - M move to screen middle - N reverse last search - O insert above line - P insert before cursor from buffer - Q switch to ex mode - R replace characters - S substitute for the line(s) - T before character in line backward search - U Restore the current line - W move to next bigword - X delete character before cursor - Y copy line - ZZ save file and exit - [[ move back section - ]] move forward section - ^ move to first non-blank - _ move to first non-blank - ` move to mark - a append after cursor - b move back word - c change to motion - d delete to motion - e move to end of word - f character in line forward search - h move left by columns - i insert before cursor - j move down by lines - k move up by lines - l move right by columns - m set mark - n repeat last search - o append after line - p insert after cursor from buffer - r replace character - s substitute character - t before character in line forward search - u undo last change - w move to next word - x delete character - y copy text to motion into a cut buffer - z reposition the screen - { move back paragraph - | move to column - } move forward paragraph - ~ reverse case -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -EX COMMANDS: - ^D: scroll lines - !: filter lines through commands or run commands - #: display numbered lines - &: repeat the last substitution - *: execute a buffer - <: shift lines left - =: display line number - >: shift lines right - @: execute a buffer - append: append input to a line - abbreviate: specify an input abbreviation - args: display file argument list - bg: background the current screen - change: change lines to input - cd: change the current directory - chdir: change the current directory - copy: copy lines elsewhere in the file - cscope: create a set of tags using a cscope command - delete: delete lines from the file - display: display buffers, screens or tags - [Ee]dit: begin editing another file - [Ee]x: begin editing another file - exusage: display ex command usage statement - file: display (and optionally set) file name - fg: switch the current screen and a backgrounded screen - global: execute a global command on lines matching an RE - help: display help statement - insert: insert input before a line - join: join lines into a single line - k: mark a line position - list: display lines in an unambiguous form - move: move lines elsewhere in the file - mark: mark a line position - map: map input or commands to one or more keys - mkexrc: write a .exrc file - [Nn]ext: edit (and optionally specify) the next file - number: change display to number lines - open: enter "open" mode (not implemented) - print: display lines - perl: run the perl interpreter with the command - perldo: run the perl interpreter with the command, on each line - preserve: preserve an edit session for recovery - [Pp]revious: edit the previous file in the file argument list - put: append a cut buffer to the line - quit: exit ex/vi - read: append input from a command or file to the line - recover: recover a saved file - resize: grow or shrink the current screen - rewind: re-edit all the files in the file argument list - s: substitute on lines matching an RE - script: run a shell in a screen - set: set options (use ":set all" to see all options) - shell: suspend editing and run a shell - source: read a file of ex commands - stop: suspend the edit session - suspend: suspend the edit session - t: copy lines elsewhere in the file - [Tt]ag: edit the file containing the tag - tagnext: move to the next tag - tagpop: return to the previous group of tags - tagprev: move to the previous tag - tagtop: discard all tags - tcl: run the tcl interpreter with the command - undo: undo the most recent change -unabbreviate: delete an abbreviation - unmap: delete an input or command map - v: execute a global command on lines NOT matching an RE - version: display the program version information - visual: enter visual (vi) mode from ex mode - [Vv]isual: edit another file (from vi mode only) - viusage: display vi key usage statement - write: write the file - wn: write the file and switch to the next file - wq: write the file and exit - xit: exit - yank: copy lines to a cut buffer - z: display different screens of the file - ~: replace previous RE with previous replacement string, -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -Edit options: -noaltwerase filec="" nomodeline scroll=17 notildeop -autoindent flash msgcat="./" nosearchincr timeout -autoprint hardtabs=0 noprint="" nosecure nottywerase -noautowrite noiclower nonumber shiftwidth=8 noverbose -backup="" noignorecase nooctal noshowmatch warn -nobeautify keytime=6 open noshowmode window=35 -cedit="" noleftright optimize sidescroll=16 nowindowname -columns=80 lines=36 print="" noslowopen wraplen=0 -comment nolisp prompt nosourceany wrapmargin=0 -noedcompatible nolist readonly tabstop=8 wrapscan -escapetime=1 lock noredraw taglength=0 nowriteany -noerrorbells magic remap tags="tags" -exrc matchtime=7 report=5 term="xterm" -noextended mesg ruler noterse -cdpath="/usr/src/local/nvi:/tmp" -directory="/tmp" -paragraphs="IPLPPPQPP LIpplpipbp" -recdir="/var/tmp/vi.recover" -sections="NHSHH HUnhsh" -shell="/bin/csh" -shellmeta="~{[*?$`'"\" diff --git a/docs/internals/autowrite b/docs/internals/autowrite deleted file mode 100644 index dbad6c8bae8a..000000000000 --- a/docs/internals/autowrite +++ /dev/null @@ -1,88 +0,0 @@ -# @(#)autowrite 8.3 (Berkeley) 2/17/95 - -Vi autowrite behavior, the fields with *'s are "don't cares". - -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -Commands that are affected only by autowrite: - -Command File Autowrite? Action: - modified? ------------------------------------------------ -^Z Y Y Write file and suspend. -^Z Y N Suspend. -^Z N * Suspend. - -# This behavior is NOT identical to :edit. -^^ Y Y Write file and jump. -^^ Y N Error. -^^ N * Jump. - -# The new nvi command ^T (:tagpop) behaves identically to ^]. -# This behavior is identical to :tag, :tagpop, and :tagpush with -# force always set to N. -^] Y Y Write file and jump. -^] Y N Error. -^] N * Jump. - -# There's no way to specify a force flag to the '!' command. -:! Y Y Write file and execute. -:! Y N Warn (if warn option) and execute. -:! N * Execute. - -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -Commands that are affected by both autowrite and force: - -NOTE: the "force" flag is never passed on, i.e. the write -to the file caused by the autowrite flag is never forced. - -Command File Autowrite? Force? Action: - modified? (!) -------------------------------------------------------- -# The first rule (YYY) is historic practice, but seems wrong. -# In nvi, :next and :prev commands behave identically to :rewind. -:next Y Y Y Write changes and jump. -:next Y Y N Write changes and jump. -:next Y N Y Abandon changes and jump. -:next Y N N Error. -:next N * * Jump. - -:rewind Y Y Y Abandon changes and jump. -:rewind Y Y N Write changes and jump. -:rewind Y N Y Abandon changes and jump. -:rewind Y N N Error. -:rewind N * * Jump. - -# The new nvi commands, :tagpop and :tagtop, behave identically to :tag. -# Note, this behavior is the same as :rewind and friends, as well. -:tag Y Y Y Abandon changes and jump. -:tag Y Y N Write changes and jump. -:tag Y N Y Abandon changes and jump. -:tag Y N N Error. -:tag N * * Jump. - -# The command :suspend behaves identically to :stop. -:stop Y Y Y Suspend. -:stop Y Y N Write changes and suspend. -:stop Y N Y Suspend. -:stop Y N N Suspend. -:stop N * * Suspend. - -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -Commands that might be affected by autowrite, but aren't: - -Command File Autowrite? Force? Action: - modified? (!) -------------------------------------------------------- -#:ex, and :vi (executed while in vi mode) behave identically to :edit. -:edit Y * Y Abandon changes and jump. -:edit Y * N Error. -:edit N * * Jump. - -:quit Y * Y Quit. -:quit Y * N Error. -:quit N * * Quit. - -:shell * * * Execute shell. - -:xit Y * * Write changes and exit. -:xit N * * Exit. diff --git a/docs/internals/context b/docs/internals/context deleted file mode 100644 index 8b1db32768b7..000000000000 --- a/docs/internals/context +++ /dev/null @@ -1,32 +0,0 @@ -# @(#)context 8.6 (Berkeley) 10/14/94 - -In historic vi, the previous context mark was always set: - -ex address: - any number, , , , - , - -ex commands: undo, "z.", global, v - -vi commands: (, ), {, }, %, [[, ]], ^] - -nvi adds the vi command ^T to this list. - -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -In historic vi, the previous context mark was set if the -line changed: - -vi commands: ', G, H, L, M, z - -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -In historic vi, the previous context mark was set if the -line or column changed: - -vi commands: `, /, ?, N, n - -nvi adds the vi command ^A to this list. - -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -In historic vi, the previous context mark was set in non-visual -mode for ^R and ^L if the line changed, but I have yet to figure -out how the line could change. diff --git a/docs/internals/cscope.NOTES b/docs/internals/cscope.NOTES deleted file mode 100644 index e0e3483d26ed..000000000000 --- a/docs/internals/cscope.NOTES +++ /dev/null @@ -1,142 +0,0 @@ -Cscope Notes: - -The nvi tags structure has been reworked to handle the notion of multiple -locations per tag. This supports cscope, which returns multiple locations -per query. It will hopefully support ctags programs that create databases -with multiple locations per tag as well. - -There is now a list of "tag queues" chained from each screen. Each tag -queue has one or more "tag locations". - - +----+ +----+ +----+ +----+ - | EP | -> | Q1 | <-- | T1 | <-- | T2 | - +----+ +----+ --> +----+ --> +----+ - | - +----+ +----+ - | Q2 | <-- | T1 | - +----+ --> +----+ - | - +----+ +----+ - | Q3 | <-- | T1 | - +----+ --> +----+ - -In the above diagram, each "Q" is a "tag queue", and each "T" is a -tag location. Generally, the commands: - - :tag create a new Q - ^[ create a new Q - :cscope find create a new Q - :tagnext move to the next T - :tagprev move to the previous T - :tagpop discard one or more Q's - ^T discard the most recent Q - :tagtop discard all Q's - -More specifically: - -:cs[cope] a[dd] cscope-dir - - Attach to the cscope database in cscope-dir. - -:cs[cope] f[ind] c|d|e|f|g|i|s|t buffer|pattern - - Query all attached cscopes for the pattern. The pattern is a - regular expression. If the pattern is a double-quote character - followed by a valid buffer name (e.g., "t), then the contents - of the named buffer are used as the pattern. - - c: find callers of name - d: find all function calls made from name - e: find pattern - f: find files with name as substring - g: find definition of name - i: find files #including name - s: find all uses of name - t: find assignments to name - - The find command pushes the current location onto the tags stack, - and switches to the first location resulting from the query, if - the query returned at least one result. - -:cs[cope] h[elp] [command] - - List the cscope commands, or usage help on one command. - -:display c[onnections] - - Display the list of cscope connections - -:display t[ags] - - The tags display has been enhanced to display multiple tag - locations per tag query. - -:cs[cope] k[ill] # - - Kill cscope connection number #. - -:cs[cope] r[eset] - Kill all attached cscopes. Useful if one got hung but you don't - know which one. - -:tagn[ext][!] - - Move to the next tag resulting from a query. - -:tagpr[ev][!] - - Return to the previous tag resulting from a query. - -:tagp[op], ^T - - Return to the previous tag group (no change). - -:tagt[op] - - Discard all tag groups (no change). - -Suggested maps: - - " ^N: move to the next tag - map ^N :tagnext^M - " ^P: move to the previous tag - map ^P :tagprev^M - - " Tab+letter performs a C-Scope query on the current word. - " C-Scope 12.9 has a text-string query (type t). - " C-Scope 13.3 replaces it with an assignment query; hence a==t. - map a "tye:csc find t"t - map c "tye:csc find c"t - map d "tye:csc find d"t - map e "tye:csc find e"t - map f "tye:csc find f"t - map g "tye:csc find g"t - map i "tye:csc find i"t - map s "tye:csc find s"t - map t "tye:csc find t"t - -To start nvi with an initial set of cscope directories, use the environment -variable CSCOPE_DIRS. This variable should contain a -separated -list of directories containing cscope databases. (This MAY be changed to -be an edit option, I haven't really decided, yet.) - -Each cscope directory must contain a file named "cscope.out" which is the -main cscope database, or nvi will not attempt to connect to a cscope to -handle requests for that database. - -The file "cscope.tpath" may contain a colon-separated directory search -path which will be used to find the files reported by cscope. If this -cscope.tpath does not exist, then the paths are assumed to be relative to -the cscope directory itself. This is an extension to the standard cscope, -but seems important enough to keep. - -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -Cscope Availability: - -UNIXWare System V Release 4.0 variants such as Sun Solaris 2.x -(/opt/SUNWspro/bin) have version 11.5, and UNIXWare System V -Release 4.1 has version 12.10 with an option for much faster -searching. - -You can buy version 13.3 source with an unrestricted license -for $400 from AT&T Software Solutions by calling +1-800-462-8146. diff --git a/docs/internals/gdb.script b/docs/internals/gdb.script deleted file mode 100644 index a1122343c162..000000000000 --- a/docs/internals/gdb.script +++ /dev/null @@ -1,76 +0,0 @@ -# @(#)gdb.script 8.5 (Berkeley) 5/4/96 - -# display the VI screen map -# usage dmap(sp) -define dmap - set $h = ((VI_PRIVATE *)$arg0->vi_private)->h_smap - set $t = ((VI_PRIVATE *)$arg0->vi_private)->t_smap - while ($h <= $t) - printf "lno: %2d; soff %d coff %d ", \ - (int)$h->lno, (int)$h->soff, (int)$h->coff - if ($h->c_ecsize == 0) - printf "flushed\n" - else - printf "\n\tsboff %d; scoff %d\n", \ - (int)$h->c_sboff, (int)$h->c_scoff - printf "\teboff %d; eclen %d; ecsize %d\n", \ - (int)$h->c_eboff, (int)$h->c_eclen, \ - (int)$h->c_ecsize - end - set $h = $h + 1 - end -end - -# display the tail of the VI screen map -define tmap - set $h = ((VI_PRIVATE *)$arg0->vi_private)->h_smap - set $t = ((VI_PRIVATE *)$arg0->vi_private)->t_smap - while ($t >= $h) - printf "lno: %2d; soff %d coff %d ", \ - (int)$t->lno, (int)$t->soff, (int)$t->coff - if ($t->c_ecsize == 0) - printf "flushed\n" - else - printf "\n\tsboff %d; scoff %d\n", \ - (int)$t->c_sboff, (int)$t->c_scoff - printf "\teboff %d; eclen %d; ecsize %d\n", \ - (int)$t->c_eboff, (int)$t->c_eclen, \ - (int)$t->c_ecsize - end - set $t = $t - 1 - end -end - -# display the private structures -define clp - print *((CL_PRIVATE *)sp->gp->cl_private) -end -define vip - print *((VI_PRIVATE *)sp->vi_private) -end -define exp - print *((EX_PRIVATE *)sp->ex_private) -end - -# display the marks -define markp - set $h = sp->ep->marks.next - set $t = &sp->ep->marks - while ($h != 0 && $h != $t) - printf "key %c lno: %d cno: %d flags: %x\n", \ - ((MARK *)$h)->name, ((MARK *)$h)->lno, \ - ((MARK *)$h)->cno, ((MARK *)$h)->flags - set $h = ((MARK *)$h)->next - end -end - -# display the tags -define tagp - set $h = sp->taghdr.next - set $t = &sp->taghdr - while ($h != 0 && $h != $t) - printf "tag: %s lno %d cno %d\n", ((TAG *)$h)->frp->fname, \ - ((TAG *)$h)->lno, ((TAG *)$h)->cno - set $h= ((TAG *)$h)->next - end -end diff --git a/docs/internals/input b/docs/internals/input deleted file mode 100644 index 9a7506ee2337..000000000000 --- a/docs/internals/input +++ /dev/null @@ -1,350 +0,0 @@ -# @(#)input 5.5 (Berkeley) 7/2/94 - -MAPS, EXECUTABLE BUFFERS AND INPUT IN EX/VI: - -The basic rule is that input in ex/vi is a stack. Every time a key which -gets expanded is encountered, it is expanded and the expansion is treated -as if it were input from the user. So, maps and executable buffers are -simply pushed onto the stack from which keys are returned. The exception -is that if the "remap" option is turned off, only a single map expansion -is done. I intend to be fully backward compatible with this. - -Historically, if the mode of the editor changed (ex to vi or vice versa), -any queued input was silently discarded. I don't see any reason to either -support or not support this semantic. I intend to retain the queued input, -mostly because it's simpler than throwing it away. - -Historically, neither the initial command on the command line (the + flag) -or the +cmd associated with the ex and edit commands was subject to mapping. -Also, while the +cmd appears to be subject to "@buffer" expansion, once -expanded it doesn't appear to work correctly. I don't see any reason to -either support or not support these semantics, so, for consistency, I intend -to pass both the initial command and the command associated with ex and edit -commands through the standard mapping and @ buffer expansion. - -One other difference between the historic ex/vi and nex/nvi is that nex -displays the executed buffers as it executes them. This means that if -the file is: - - set term=xterm - set term=yterm - set term=yterm - -the user will see the following during a typical edit session: - - nex testfile - testfile: unmodified: line 3 - :1,$yank a - :@a - :set term=zterm - :set term=yterm - :set term=xterm - :q! - -This seems like a feature and unlikely to break anything, so I don't -intend to match historic practice in this area. - -The rest of this document is a set of conclusions as to how I believe -the historic maps and @ buffers work. The summary is as follows: - -1: For buffers that are cut in "line mode", or buffers that are not cut - in line mode but which contain portions of more than a single line, a - trailing character appears in the input for each line in the - buffer when it is executed. For buffers not cut in line mode and which - contain portions of only a single line, no additional characters - appear in the input. -2: Executable buffers that execute other buffers don't load their - contents until they execute them. -3: Maps and executable buffers are copied when they are executed -- - they can be modified by the command but that does not change their - actions. -4: Historically, executable buffers are discarded if the editor - switches between ex and vi modes. -5: Executable buffers inside of map commands are expanded normally. - Maps inside of executable buffers are expanded normally. -6: If an error is encountered while executing a mapped command or buffer, - the rest of the mapped command/buffer is discarded. No user input - characters are discarded. -7: Characters in executable buffers are remapped. -8: Characters in executable buffers are not quoted. - -Individual test cases follow. Note, in the test cases, control characters -are not literal and will have to be replaced to make the test cases work. - -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -1: For buffers that are cut in "line mode", or buffers that are not cut - in line mode but which contain portions of more than a single line, a - trailing character appears in the input for each line in the - buffer when it is executed. For buffers not cut in line mode and which - contain portions of only a single line, no additional characters - appear in the input. - -=== test file === -3Gw -w -line 1 foo bar baz -line 2 foo bar baz -line 3 foo bar baz -=== end test file === - - If the first line is loaded into 'a' and executed: - -1G"ayy@a - - The cursor ends up on the '2', a result of pushing "3Gw^J" onto - the stack. - - If the first two lines are loaded into 'a' and executed: - -1G2"ayy@a - - The cursor ends up on the 'f' in "foo" in the fifth line of the - file, a result of pushing "3Gw^Jw^J" onto the stack. - - If the first line is loaded into 'a', but not using line mode, - and executed: - -1G"ay$@a - - The cursor ends up on the '1', a result of pushing "3Gw" onto - the stack - - If the first two lines are loaded into 'a', but not using line mode, - and executed: - -1G2"ay$@a - - The cursor ends up on the 'f' in "foo" in the fifth line of the - file, a result of pushing "3Gw^Jw^J" onto the stack. - -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -2: Executable buffers that execute other buffers don't load their - contents until they execute them. - -=== test file === -cwLOAD B^[ -line 1 foo bar baz -line 2 foo bar baz -line 3 foo bar baz -@a@b -"byy -=== end test file === - - The command is loaded into 'e', and then executed. 'e' executes - 'a', which loads 'b', then 'e' executes 'b'. - -5G"eyy6G"ayy1G@e - - The output should be: - -=== output file === -cwLOAD B^[ -LOAD B 1 foo bar baz -line 2 foo bar baz -line 3 foo bar baz -@a@b -"byy -=== end output file === - -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -3: Maps and executable buffers are copied when they are executed -- - they can be modified by the command but that does not change their - actions. - - Executable buffers: - -=== test file === -line 1 foo bar baz -line 2 foo bar baz -line 3 foo bar baz -@a@b -"eyy -cwEXECUTE B^[ -=== end test file === - -4G"eyy5G"ayy6G"byy1G@eG"ep - - The command is loaded into 'e', and then executed. 'e' executes - 'a', which loads 'e', then 'e' executes 'b' anyway. - - The output should be: - -=== output file === -line 1 foo bar baz -EXECUTE B 2 foo bar baz -line 3 foo bar baz -@a@b -"eyy -cwEXECUTE B^[ -line 1 foo bar baz -=== end output file === - - Maps: - -=== test file === -Cine 1 foo bar baz -line 2 foo bar baz -line 3 foo bar baz -=== end test file === - - Entering the command ':map = :map = rB^V^MrA^M1G==' shows that - the first time the '=' is entered the '=' map is set and the - character is changed to 'A', the second time the character is - changed to 'B'. - -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -4: Historically, executable buffers are discarded if the editor - switches between ex and vi modes. - -=== test file === -line 1 foo bar baz -line 2 foo bar baz -line 3 foo bar baz -cwCHANGE^[Q:set -set|visual|1Gwww -=== end test file === - -vi testfile -4G"ayy@a - -ex testfile -$p -yank a -@a - - In vi, the command is loaded into 'a' and then executed. The command - subsequent to the 'Q' is (historically, silently) discarded. - - In ex, the command is loaded into 'a' and then executed. The command - subsequent to the 'visual' is (historically, silently) discarded. The - first set command is output by ex, although refreshing the screen usually - causes it not to be seen. - -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -5: Executable buffers inside of map commands are expanded normally. - Maps inside of executable buffers are expanded normally. - - Buffers inside of map commands: - -=== test file === -line 1 foo bar baz -line 2 foo bar baz -line 3 foo bar baz -cwREPLACE BY A^[ -=== end test file === - -4G"ay$:map x @a -1Gx - - The output should be: - -=== output file === -REPLACE BY A 1 foo bar baz -line 2 foo bar baz -line 3 foo bar baz -cwREPLACE BY A^[ -=== end output file === - - Maps commands inside of executable buffers: - -=== test file === -line 1 foo bar baz -line 2 foo bar baz -line 3 foo bar baz -X -=== end test file === - -:map X cwREPLACE BY XMAP^[ -4G"ay$1G@a - - The output should be: - -=== output file === -REPLACE BY XMAP 1 foo bar baz -line 2 foo bar baz -line 3 foo bar baz -X -=== end output file === - - Here's a test that does both, repeatedly. - -=== test file === -line 1 foo bar baz -line 2 foo bar baz -line 3 foo bar baz -X -Y -cwREPLACED BY C^[ -blank line -=== end test file === - -:map x @a -4G"ay$ -:map X @b -5G"by$ -:map Y @c -6G"cy$ -1Gx - - The output should be: - -=== output file === -REPLACED BY C 1 foo bar baz -line 2 foo bar baz -line 3 foo bar baz -X -Y -cwREPLACED BY C^[ -blank line -=== end output file === - -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -6: If an error is encountered while executing a mapped command or - a buffer, the rest of the mapped command/buffer is discarded. No - user input characters are discarded. - -=== test file === -line 1 foo bar baz -line 2 foo bar baz -line 3 foo bar baz -:map = 10GcwREPLACMENT^V^[^[ -=== end test file === - - The above mapping fails, however, if the 10G is changed to 1, 2, - or 3G, it will succeed. - -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -7: Characters in executable buffers are remapped. - -=== test file === -abcdefghijklmnnop -ggg -=== end test file === - -:map g x -2G"ay$1G@a - - The output should be: - -=== output file === -defghijklmnnop -ggg -=== end output file === - -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -8: Characters in executable buffers are not quoted. - -=== test file === -iFOO^[ - -=== end test file === - -1G"ay$2G@a - - The output should be: - -=== output file === -iFOO^[ -FOO -=== end output file === -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= diff --git a/docs/internals/openmode b/docs/internals/openmode deleted file mode 100644 index c64b76774b3e..000000000000 --- a/docs/internals/openmode +++ /dev/null @@ -1,36 +0,0 @@ - @(#)openmode 8.1 (Berkeley) 10/29/94 - -Open mode has the following special behaviors: - -z, ^F, ^B: - If count is not specified, it shall default to the window - edit option - 2. - - Write lines from the edit buffer starting at: - - (the current line) - ((count - 2) / 2) - - until: - - (((count + 1) / 2) * 2) - 1 - - lines, or the last line in the edit buffer has been written. A - line consisting of the smaller of the number of columns in the - display divided by two or 40 ``-'' characters shall be written - immediately before and after the specified is written. These two - lines shall count against the total number of lines to be written. - A blank line shall be written after the last line is written. - - z, ^F and ^B all behave identically. - -^D: Display the next scroll value lines, change the current line. - -^U: Change the current line, do nothing else. - -^E, ^Y: Do nothing. - -^L: Clear the screen and redisplay the current line. - -H, L, M: - Move to the first nonblank of the current line and do nothing - else. diff --git a/docs/internals/quoting b/docs/internals/quoting deleted file mode 100644 index a5fb8926a33c..000000000000 --- a/docs/internals/quoting +++ /dev/null @@ -1,208 +0,0 @@ -# @(#)quoting 5.5 (Berkeley) 11/12/94 - -QUOTING IN EX/VI: - -There are four escape characters in historic ex/vi: - - \ (backslashes) - ^V - ^Q (assuming it wasn't used for IXON/IXOFF) - The terminal literal next character. - -Vi did not use the lnext character, it always used ^V (or ^Q). -^V and ^Q were equivalent in all cases for vi. - -There are four different areas in ex/vi where escaping characters -is interesting: - - 1: In vi text input mode. - 2: In vi command mode. - 3: In ex command and text input modes. - 4: In the ex commands themselves. - -1: Vi text input mode (a, i, o, :colon commands, etc.): - - The set of characters that users might want to escape are as follows. - As ^L and ^Z were not special in input mode, they are not listed. - - carriage return (^M) - escape (^[) - autoindents (^D, 0, ^, ^T) - erase (^H) - word erase (^W) - line erase (^U) - newline (^J) (not historic practice) - - Historic practice was that ^V was the only way to escape any - of these characters, and that whatever character followed - the ^V was taken literally, e.g. ^V^V is a single ^V. I - don't see any strong reason to make it possible to escape - ^J, so I'm going to leave that alone. - - One comment regarding the autoindent characters. In historic - vi, if you entered "^V0^D" autoindent erasure was still - triggered, although it wasn't if you entered "0^V^D". In - nvi, if you escape either character, autoindent erasure is - not triggered. - - Abbreviations were not performed if the non-word character - that triggered the abbreviation was escaped by a ^V. Input - maps were not triggered if any part of the map was escaped - by a ^V. - - The historic vi implementation for the 'r' command requires - two leading ^V's to replace a character with a literal - character. This is obviously a bug, and should be fixed. - -2: Vi command mode - - Command maps were not triggered if the second or later - character of a map was escaped by a ^V. - - The obvious extension is that ^V should keep the next command - character from being mapped, so you can do ":map x xxx" and - then enter ^Vx to delete a single character. - -3: Ex command and text input modes. - - As ex ran in canonical mode, there was little work that it - needed to do for quoting. The notable differences between - ex and vi are that it was possible to escape a in - the ex command and text input modes, and ex used the "literal - next" character, not control-V/control-Q. - -4: The ex commands: - - Ex commands are delimited by '|' or newline characters. - Within the commands, whitespace characters delimit the - arguments. Backslash will generally escape any following - character. In the abbreviate, unabbreviate, map and unmap - commands, control-V escapes the next character, instead. - - This is historic behavior in vi, although there are special - cases where it's impossible to escape a character, generally - a whitespace character. - - Escaping characters in file names in ex commands: - - :cd [directory] (directory) - :chdir [directory] (directory) - :edit [+cmd] [file] (file) - :ex [+cmd] [file] (file) - :file [file] (file) - :next [file ...] (file ...) - :read [!cmd | file] (file) - :source [file] (file) - :write [!cmd | file] (file) - :wq [file] (file) - :xit [file] (file) - - Since file names are also subject to word expansion, the - underlying shell had better be doing the correct backslash - escaping. This is NOT historic behavior in vi, making it - impossible to insert a whitespace, newline or carriage return - character into a file name. - -4: Escaping characters in non-file arguments in ex commands: - - :abbreviate word string (word, string) -* :edit [+cmd] [file] (+cmd) -* :ex [+cmd] [file] (+cmd) - :map word string (word, string) -* :set [option ...] (option) -* :tag string (string) - :unabbreviate word (word) - :unmap word (word) - - These commands use whitespace to delimit their arguments, and use - ^V to escape those characters. The exceptions are starred in the - above list, and are discussed below. - - In general, I intend to treat a ^V in any argument, followed by - any character, as that literal character. This will permit - editing of files name "foo|", for example, by using the string - "foo\^V|", where the literal next character protects the pipe - from the ex command parser and the backslash protects it from the - shell expansion. - - This is backward compatible with historical vi, although there - were a number of special cases where vi wasn't consistent. - -4.1: The edit/ex commands: - - The edit/ex commands are a special case because | symbols may - occur in the "+cmd" field, for example: - - :edit +10|s/abc/ABC/ file.c - - In addition, the edit and ex commands have historically - ignored literal next characters in the +cmd string, so that - the following command won't work. - - :edit +10|s/X/^V / file.c - - I intend to handle the literal next character in edit/ex consistently - with how it is handled in other commands. - - More fun facts to know and tell: - The acid test for the ex/edit commands: - - date > file1; date > file2 - vi - :edit +1|s/./XXX/|w file1| e file2|1 | s/./XXX/|wq - - No version of vi, of which I'm aware, handles it. - -4.2: The set command: - - The set command treats ^V's as literal characters, so the - following command won't work. Backslashes do work in this - case, though, so the second version of the command does work. - - set tags=tags_file1^V tags_file2 - set tags=tags_file1\ tags_file2 - - I intend to continue permitting backslashes in set commands, - but to also permit literal next characters to work as well. - This is backward compatible, but will also make set - consistent with the other commands. I think it's unlikely - to break any historic .exrc's, given that there are probably - very few files with ^V's in their name. - -4.3: The tag command: - - The tag command ignores ^V's and backslashes; there's no way to - get a space into a tag name. - - I think this is a don't care, and I don't intend to fix it. - -5: Regular expressions: - - :global /pattern/ command - :substitute /pattern/replace/ - :vglobal /pattern/ command - - I intend to treat a backslash in the pattern, followed by the - delimiter character or a backslash, as that literal character. - - This is historic behavior in vi. It would get rid of a fairly - hard-to-explain special case if we could just use the character - immediately following the backslash in all cases, or, if we - changed nvi to permit using the literal next character as a - pattern escape character, but that would probably break historic - scripts. - - There is an additional escaping issue for regular expressions. - Within the pattern and replacement, the '|' character did not - delimit ex commands. For example, the following is legal. - - :substitute /|/PIPE/|s/P/XXX/ - - This is a special case that I will support. - -6: Ending anything with an escape character: - - In all of the above rules, an escape character (either ^V or a - backslash) at the end of an argument or file name is not handled - specially, but used as a literal character. - diff --git a/docs/internals/structures b/docs/internals/structures deleted file mode 100644 index a25c780c8e63..000000000000 --- a/docs/internals/structures +++ /dev/null @@ -1,68 +0,0 @@ -# @(#)structures 5.4 (Berkeley) 10/4/95 - -There are three major data structures in this package, plus a single data -structure per screen type. The first is a single global structure (GS) -which contains information common to all files and screens. It hold -global things like the input key queues, and functions as a single place -to hang things. For example, interrupt routines have to be able to find -screen structures, and they can only do this if they have a starting -point. The number of globals in nvi is dependent on the screen type, but -every screen type will have at least one global, __global_list, which -references the GS structure. - -The GS structure contains linked lists of screen (SCR) structures. -Each SCR structure normally references a file (EXF) structure. - -The GS structure has a set of functions which update the screen and/or -return information about the screen from the underlying screen package. -The GS structure never goes away. The SCR structure persists over -instances of screens, and the EXF structure persists over references to -files. - -File names have different properties than files themselves, so the name -information for a file is held in an FREF structure which is chained from -the SCR structure. - -In general, functions are always passed an SCR structure, which usually -references an underlying EXF structure. The SCR structure is necessary -for any routine that wishes to talk to the screen, the EXF structure is -necessary for any routine that wants to modify the file. The relationship -between an SCR structure and its underlying EXF structure is not fixed, -and various ex commands will substitute a new EXF in place of the current -one, and there's no way to detect this. - -The naming of the structures is consistent across the program. (Macros -even depend on it, so don't try and change it!) The global structure is -"gp", the screen structure is "sp", and the file structure is "ep". - -A few other data structures: - -TEXT In nvi/cut.h. This structure describes a portion of a line, - and is used by the input routines and as the "line" part of a - cut buffer. - -CB In nvi/cut.h. A cut buffer. A cut buffer is a place to - hang a list of TEXT structures. - -CL The curses screen private data structure. Everything to - do standalone curses screens. - -MARK In nvi/mark.h. A cursor position, consisting of a line number - and a column number. - -MSG In nvi/msg.h. A chain of messages for the user. - -SEQ In nvi/seq.h. An abbreviation or a map entry. - -TK The Tcl/Tk screen private data structure. Everything to - do standalone Tcl/Tk screens. - -EXCMD In nvi/ex/ex.h. The structure that gets passed around to the - functions that implement the ex commands. (The main ex command - loop (see nvi/ex/ex.c) builds this up and then passes it to the - ex functions.) - -VICMD In nvi/vi/vi.h. The structure that gets passed around to the - functions that implement the vi commands. (The main vi command - loop (see nvi/vi/vi.c) builds this up and then passes it to the - vi functions.) diff --git a/docs/interp/interp b/docs/interp/interp deleted file mode 100644 index 3da5a8f656dc..000000000000 --- a/docs/interp/interp +++ /dev/null @@ -1,190 +0,0 @@ -# @(#)interp 8.5 (Berkeley) 10/19/96 - Nvi Interpreter API - -Introduction: - The intention is to provide a way to graft a fairly generic extension - language into nvi. I think that the obvious candidates are Tcl/Rush, - Scheme, Python and Perl. Since the interpretation language chosen - is often a religious issue, the method should be as flexible as - possible. I don't expect to rewrite the editor in the interpreted - language, so that isn't a consideration. - - Q: Is there any reason for nvi to support multiple interpreters in - a single executable? - -Interpreter functions in nvi: - - 1: Function to get the current screen pointer. - - SCR *inter_screen(); - - Return a pointer to the current screen. - - 2: Functions to execute both ex and vi commands. The return value of the - function will be success/failure. The editor itself will continue to - handle the display of all messages and text for the foreseeable future. - - int inter_vicmd(SCR *, char *cmds, size_t len); - int inter_excmd(SCR *, char *cmds, size_t len); - - The byte string cmds, of length len, is entered into the standard - vi or ex parser, as if typed by the user. The characters are not - mapped in any way, i.e. the user's vi mappings don't apply. If - any error occurs, an error value is returned, and the rest of the - characters are discarded. - - 3: Functions to handle lines of text in the file. - - int inter_gline(SCR *, recno_t lno, char **lp, size_t *lenp); - - Return a pointer to the text of the line lno, into the location - referenced by lp, and its length into the location referenced by - lenp. - - int inter_dline(SCR *, recno_t lno); - - Delete the line lno from the file. - - int inter_aline(SCR *, recno_t lno, char *lp, size_t len); - - Append a line consisting of the len bytes of text referenced by - lp to the line lno. - - int inter_iline(SCR *, recno_t lno, char *lp, size_t len); - - Insert a line consisting of the len bytes of text referenced by - lp before the line lno. - - int inter_sline(SCR *, recno_t lno, char *lp, size_t len); - - Replace line lno with the len bytes of text referenced by lp. - - int inter_lline(SCR *, recno_t *lnop); - - Return the number of the last line in the file in the location - referenced by lnop. - - 4: Function to post an error message to the user. - - int inter_msgq(SCR *, enum msgtype, char *fmt, ...); - - Display the message for the user. Valid message types are: - - M_BERR Error: M_ERR if verbose, else bell. - M_ERR Error: Display in inverse video. - M_INFO Info: Display in normal video. - M_SYSERR Error: M_ERR, using strerror(3) message. - M_VINFO Info: M_INFO if verbose, else ignore. - - 5: Function to manipulate cut buffers. - - int inter_setbuf(SCR *, CHAR_T buffer); - - Create the specified buffer if it does not exist (the - buffer will have no contents). - - int inter_getbuf(SCR *, CHAR_T buffer, TEXT **textp); - - Return a pointer to the specified buffer in the location - referenced by textp. (Since a pointer to the real item - is being returned, it can be manipulated in any way the - interpreter chooses.) - - 6: Functions to manipulate marks. - - int inter_setmark(SCR *, CHAR_T name); - - Create the specified mark if it does not exist (the - mark will have no contents). - - int inter_getmark(SCR *, CHAR_T name, MARK **markp); - - Return a pointer to the specified mark in the location - referenced by markp. (Since a pointer to the real item - is being returned, it can be manipulated in any way the - interpreter chooses.) - - 7: Function to manipulate screens. - - SCR *inter_iscreen(); - - Create a new screen, and return a pointer to it. - - int inter_escreen(SCR *); - - End a screen. - - 8: Functions to get input from the user. - - int inter_getchar(CHAR_T *chp, - enum maptype {NONE, INPUT, COMMAND} mapt); - - Return a character from the keyboard into the location referenced - by chp. Mapt can be set to INPUT, COMMAND or NONE, depending on - what vi mappings should be applied to the character. - - int inter_getline(SCR *, char *prompt, CHAR_T **linep, - size_t *lenp, enum maptype {NONE, INPUT, COMMAND} mapt); - - Return a pointer to a line entered by the user, and its length, - into the locations linep and lenp. A prompt may be specified - by prompt, and mappings by mapt. - - int inter_freeline(CHAR_T *linep); - - Free the memory that was allocated by inter_getline(); - - 9: Function to retrieve and set the cursor. - - int inter_getcursor(SCR *, MARK *mark); - - Store the current cursor position in mark. - - int inter_setcursor(SCR *, MARK *mark); - - Set the current cursor position to mark. - -10: Function to return a motion command from the user. - - int inter_getmotion(SCR *, - MARK *start, MARK *end, enum movetype {LINE, CHAR} *mt); - - Nvi gets a motion command from the user and returns the starting - and stopping points of the movement, reordered from the beginning - to the end of the file. The standard rules for line/character - motions are applied, and returned to the interpreter through the - mt argument. - -11: Functions to return pathnames. - -12: Functions to return edit options. - -13: Nvi commands which will send text to the interpreter. - - Nvi will have a new ex command "inter", which will pipe the rest of - the line up to the first unescaped to the interpreter, of - the following form: - - :[address[,address]] inter [count] command - - The interface from the ex command to the interpreter is a function: - - int inter_ex( - SCR *, /* Current screen. */ - char *cmd; /* The command. */ - size_t len; /* The command length. */ - MARK *start, /* Starting address for INTER_EX */ - MARK *end, /* Ending address for INTER_EX */ - int count); /* Count. */ - - Nvi will have a new vi command "*" which will pipe the contents - of the named buffer to the interpreter, of the following form: - - [count]* - - The interface from the vi command to the interpreter is a function: - - int inter_vi( - SCR *, /* Current screen. */ - CHAR_T buffer, /* Buffer. */ - int count); /* Count. */ diff --git a/docs/interp/spell.ok b/docs/interp/spell.ok deleted file mode 100644 index 4ca990c21720..000000000000 --- a/docs/interp/spell.ok +++ /dev/null @@ -1,46 +0,0 @@ -API -BERR -Mapt -Nvi -Perl -SCR -SYSERR -Tcl -VINFO -aline -callback -chp -cmd -cmds -dline -enum -escreen -excmd -freeline -getbuf -getcursor -getline -getmotion -gline -iline -int -interp -iscreen -lenp -linep -lline -lno -lnop -lp -mapt -maptype -movetype -msgq -msgtype -nvi -recno -setcursor -sline -strerror -textp -vicmd diff --git a/docs/USD.doc/vi.man/Makefile b/docs/man/Makefile similarity index 100% rename from docs/USD.doc/vi.man/Makefile rename to docs/man/Makefile diff --git a/docs/USD.doc/vi.man/vi.1 b/docs/man/vi.1 similarity index 98% rename from docs/USD.doc/vi.man/vi.1 rename to docs/man/vi.1 index e4a51cb8fdd3..73ebdbdb7e13 100644 --- a/docs/USD.doc/vi.man/vi.1 +++ b/docs/man/vi.1 @@ -197,7 +197,8 @@ and that is the .Aq escape key. .Pp -Key names are written using less-than and greater-than signs, e.g., +In this manual, +key names are denoted with \(la and \(ra, e.g., .Aq escape means the .Dq escape @@ -238,9 +239,9 @@ Move the cursor up one line. Move the cursor right one character. .It Aq Cm cursor-arrows The cursor arrow keys should work, too. -.It Cm / Ns text +.It Cm / Ns Ar text Search for the string -.Dq text +.Dq Ar text in the file, and move the cursor to its first character. .El @@ -346,10 +347,10 @@ version of regular expressions: .It An empty regular expression is equivalent to the last regular expression used. .It -.Sq \e\(la +.Sq \e< matches the beginning of the word. .It -.Sq \e\(ra +.Sq \e> matches the end of the word. .It .Sq \(a~ @@ -363,7 +364,7 @@ for later use. .Nm vi buffers are named with a single character preceded by a double quote, for example -.Pf \&" Ns Aq c ; +.Cm \&" Ns Aq Ar c ; .Nm ex buffers are the same, but without the double quote. @@ -413,7 +414,7 @@ make the destination buffer character-oriented. .Cm j , .Aq Cm control-M , .Cm k , -.Cm ' , +.Cm \(aq , .Cm - , .Cm G , .Cm H , @@ -426,7 +427,7 @@ make the destination buffer line-oriented. .It .Cm $ , .Cm % , -.Cm ` , +.Cm \` , .Cm (\& , .Cm )\& , .Cm / , @@ -476,7 +477,7 @@ It is specified using a line-oriented motion. .It It is specified using one of the following motion commands: .Aq Cm control-A , -.Cm ` Ns Aq Cm character , +.Cm \` Ns Aq Ar character , .Cm n , .Cm N , .Cm % , @@ -803,7 +804,7 @@ If .Ar count is specified, additionally move the cursor down .Ar count -\- 1 lines. +\(mi 1 lines. .Pp .It Cm % Move to the @@ -815,26 +816,26 @@ the one found at the cursor position or the closest to the right of it. Repeat the previous substitution command on the current line. .Pp .It Xo -.Cm ' Ns Aq Ar character +.Cm \(aq Ns Aq Ar character .Xc .It Xo -.Cm ` Ns Aq Ar character +.Cm \` Ns Aq Ar character .Xc Return to the cursor position marked by the character .Ar character , or, if .Ar character is -.Sq ' +.Sq \(aq or -.Sq ` , +.Sq \` , to the position of the cursor before the last of the following commands: .Aq Cm control-A , .Aq Cm control-T , .Aq Cm control-] , .Cm % , -.Cm ' , -.Cm ` , +.Cm \(aq , +.Cm \` , .Cm (\& , .Cm )\& , .Cm / , @@ -1027,7 +1028,7 @@ If a .Ar count argument is given, the characters input are repeated .Ar count -\- 1 times after input mode is exited. +\(mi 1 times after input mode is exited. .Pp .It Xo .Op Ar count @@ -1094,7 +1095,7 @@ is not specified. .Xc Move to the screen line .Ar count -\- 1 lines below the top of the screen. +\(mi 1 lines below the top of the screen. .Pp .It Xo .Op Ar count @@ -1106,7 +1107,7 @@ If a argument is given, the characters input are repeated .Ar count -\- 1 more times. +\(mi 1 more times. .Pp .It Xo .Op Ar count @@ -1125,7 +1126,7 @@ It is set to one whitespace character otherwise. .Xc Move to the screen line .Ar count -\- 1 lines above the bottom of the screen. +\(mi 1 lines above the bottom of the screen. .Pp .It Cm M Move to the screen line in the middle of the screen. @@ -1140,7 +1141,7 @@ If a argument is given, the characters input are repeated .Ar count -\- 1 more times. +\(mi 1 more times. .Pp .It Xo .Op Ar buffer @@ -1170,7 +1171,7 @@ If a argument is given, the characters input are repeated .Ar count -\- 1 more times upon exit from insert mode. +\(mi 1 more times upon exit from insert mode. .Pp .It Xo .Op Ar buffer @@ -1267,7 +1268,7 @@ Move to the first non-blank character on the current line. .Xc Move down .Ar count -\- 1 lines, to the first non-blank character. +\(mi 1 lines, to the first non-blank character. .Pp .It Xo .Op Ar count @@ -1371,7 +1372,7 @@ If a argument is given, the characters input are repeated .Ar count -\- 1 more times. +\(mi 1 more times. .Pp .It Xo .Op Ar buffer @@ -2050,10 +2051,11 @@ If this is the entire pattern, the replacement part of the previous .Cm substitute command. -.It Sq \e\(sh +.It Sq \e Ns Ar \(sh Where -.Sq \(sh -is an integer from 1 to 9, the text matched by the #'th subexpression in +.Sq Ar \(sh +is an integer from 1 to 9, the text matched by the +.Ar # Ns 'th subexpression in .Ar pattern . .It Sq \eL Causes the characters up to the end of the line of the next occurrence of @@ -2264,7 +2266,7 @@ session. Back up files before they are overwritten. .It Cm beautify , bf Bq off Discard control characters. -.It Cm cdpath Bq "environment variable CDPATH, or current directory" +.It Cm cdpath Bo environment variable Ev CDPATH , or current directory Bc The directory paths used as path prefixes for the .Cm cd command. @@ -2276,7 +2278,7 @@ Set the number of columns in the screen. .Nm vi only. Skip leading comments in shell, C and C++ language files. -.It Cm directory , dir Bq "environment variable TMPDIR, or /tmp" +.It Cm directory , dir Bo environment variable Ev TMPDIR , or Pa /tmp Bc The directory where temporary files are created. .It Cm edcompatible , ed Bq off Remember the values of the @@ -2445,9 +2447,9 @@ and commands. .It Cm secure Bq off Turns off all access to external programs. -.It Cm shell , sh Bq "environment variable SHELL, or /bin/sh" +.It Cm shell , sh Bo environment variable Ev SHELL , or Pa /bin/sh Bc Select the shell used by the editor. -.It Cm shellmeta Bq ~{[*?$`'\&"\e +.It Cm shellmeta Bq ~{[*?$\`\(aq\&"\e Set the meta characters checked to determine if file name expansion is necessary. .It Cm shiftwidth , sw Bq 8 @@ -2480,7 +2482,7 @@ Set the number of significant characters in tag names. Set the list of tags files. .It Xo .Cm term , ttytype , tty -.Bq "environment variable TERM" +.Bq environment variable Ev TERM .Xc Set the terminal type. .It Cm terse Bq off @@ -2521,7 +2523,7 @@ if the file has been modified since it was last written, before a command. .It Xo .Cm window , w , wi -.Bq "environment variable LINES \- 1" +.Bq environment variable Ev LINES No \(mi 1 .Xc Set the window size for the screen. .It Cm windowname Bq off diff --git a/docs/spell.ok b/docs/spell.ok deleted file mode 100644 index ec854ffa41b4..000000000000 --- a/docs/spell.ok +++ /dev/null @@ -1,173 +0,0 @@ -API's -Amiga -Amir -Bostic -CFLAGS -CR -CTYPE -Cscope -Ctags -DB -DPURIFY -Darren -Ds -Dw -EXINIT -Englar -FreeBSD -GDB -Hiebert -Kirkendall -LC -LN -Linux -Lite -MSDOS -Makefile -Mayoff -NEXINIT -NVI -NetBSD -Neville -Nvi -Nvi's -OS -POSIX -POSIX.2 -Perl -PostScript -README -Roff -Solaris -SunOS -Sven -Tcl -Tk -Todo -USD -USD.doc -USD:14 -USD:15 -USD:16 -UUNET -UX -Verdoolaege -Vi -Vi's -WindowsNT -ags -al -american -api -autowrite -berkeley -bitstring -bitstring.h -bostic -bsd -bugs.current -ccil -changelog -cl -clib -cont -cs -cs.berkeley.edu -cscope -csh -cshrc -ctags -darren -db -dbopen -devel -doc -docs -edu -elvis -email -enum -escapetime -esr -execl -exrc -exref -fcntl -filesystem -free's -ftp.cs.berkeley.edu -gdb -gdb.script -gvr -gz -gzip'd -hardtabs -hiwaay -html -http -ic -iclower -ignorecase -il -init -init.tcl -iso -isprint -kB -keystrokes -ksh -lang -ld -lt -lu -mmap -ncurses -nex -nexrc -nul's -nvi -nvi's -nvi.ALPHA.tar.gz -nvi.tar.Z -nvi.tar.gz -openmode -org -perl -preformatted -ps -queue.h -readonly -recover.script -redistributable -regex -remapped -setenv -settable -shiftwidth -sirsi -slowopen -sourced -struct -sunsite -svi -tcl -tclapi -terminfo -tk -tknvi -txt -ucb -unc -uunet -version's -vi -vi's -vi.man -vi.ref -vi.ref.ps -vi.ref.txt -vitut -writeable -www -xaw -ynq diff --git a/docs/tutorial/vi.advanced b/docs/tutorial/vi.advanced deleted file mode 100644 index f757ad19c44a..000000000000 --- a/docs/tutorial/vi.advanced +++ /dev/null @@ -1,1458 +0,0 @@ -Section 26: Index to the rest of the tutorial - -The remainder of the tutorial can be perused at your leisure. Simply find the -topic of interest in the following list, and {/Section xx:/^M} to get to the -appropriate section. (Remember that ^M means the return key) - -The material in the following sections is not necessarily in a bottom up -order. It should be fairly obvious that if a section mentions something with -which you are not familiar, say, buffers, you might {/buffer/^M} followed by -several {n} to do a keyword search of the file for more details on that item. -Another point to remember is that commands are surrounded by curly-braces and -can therefore be found rather easily. To see where, say, the X command is -used try {/{X}/^M}. Subsequent {n} will show you other places the command was -used. We have tried to maintain the convention of placing the command letter -surrounded by curly-braces on the section line where that command is -mentioned. - -Finally, you should have enough 'savvy' at this point to be able to do your -own experimentation with commands without too much hand-holding on the part of -the tutorial. Experimentation is the best way to learn the effects of the -commands. - - Section Topic - description - ------- ------------------- -(Sections 1 through 25 are located in the file vi.beginner.) - 1 introduction: {^F} {ZZ} - 2 introduction (con't) and positioning: {^F} {^B} - 3 introduction (con't) and positioning: {^F} {^B} - 4 positioning: {^F} {^B} ^M (return key) - 5 quitting: {:q!} ^M key - 6 marking, cursor and screen positioning: {m} {G} {'} {z} - 7 marking, cursor and screen positioning: {m} {G} {'} {z} - 8 marking, cursor and screen positioning: {z} {m} {'} - 9 marking and positioning: {m} {''} - 10 line positioning: {^M} {-} - 11 scrolling with {^M} - 12 scrolling with {-} and screen adjustment {z} - 13 notes on use of tutorial - 14 other scrolling and postioning commands: {^E} {^Y} {^D} {^U} - 15 searching: {/ .. /^M} - 16 searching: {? .. ?^M} {n} (in search strings ^ $) - 17 searching: \ and magic-characters in search strings - 18 colon commands, exiting: {:} {ZZ} - 19 screen positioning: {H} {M} {L} - 20 character positioning: {w} {b} {0} {W} {B} {e} {E} {'} {`} - 21 cursor positioning: {l} {k} {j} {h} - 22 adding text: {i} {a} {I} {A} {o} {O} ^[ (escape key) - 23 character manipulation: {f} {x} {X} {w} {l} {r} {R} {s} {S} {J} - 24 undo: {u} {U} - 25 review -(The following sections are in this file.) - 26 Index to the rest of the tutorial ******** YOU ARE HERE ******* - 27 discussion of repeat counts and the repeat command: {.} - 28 more on low-level character motions: {t} {T} {|} - 29 advanced correction operators: {d} {c} - 30 updating the screen: {^R} - 31 text buffers: {"} - 32 rearranging and duplicating text: {p} {P} {y} {Y} - 33 recovering lost lines - 34 advanced file manipulation with vi - 34.1 more than one file at a time: {:n} - 34.2 reading files and command output: {:r} - 34.3 invoking vi from within vi: {:e} {:vi} - 34.4 escaping to a shell: {:sh} {:!} - 34.5 writing parts of a file: {:w} - 34.6 filtering portions of text: {!} - 35 advanced searching: magic patterns - 36 advanced substitution: {:s} - 37 advanced line addressing: {:p} {:g} {:v} - 38 higher level text objects and nroff: ( ) { } [[ ]] - 39 more about inserting text - 40 more on operators: {d} {c} {<} {>} {!} {=} {y} - 41 abbreviations: {:ab} - 42 vi's relationship with the ex editor: {:} - 43 vi on hardcopy terminals and dumb terminals: open mode - 44 options: {:set} {setenv EXINIT} - 44.1 autoindent - 44.2 autoprint - 44.3 autowrite - 44.4 beautify - 44.5 directory - 44.6 edcompatible - 44.7 errorbells - 44.8 hardtabs - 44.9 ignorecase - 44.10 lisp - 44.11 list - 44.12 magic - 44.13 mesg - 44.14 number - 44.15 open - 44.16 optimize - 44.17 paragraphs - 44.18 prompt - 44.19 readonly - 44.20 redraw - 44.21 remap - 44.22 report - 44.23 scroll - 44.24 sections - 44.25 shell - 44.26 shiftwidth - 44.27 showmatch - 44.28 slowopen - 44.29 tabstop - 44.30 tags - 44.31 taglength - 44.32 term - 44.33 terse - 44.34 timeout - 44.35 ttytype - 44.36 warn - 44.37 window - 44.38 wrapscan - 44.39 wrapmargin - 44.40 writeany - 44.41 w300, w1200, w9600 - -Section 27: repetition counts and the repeat command {.} - -Most vi commands will use a preceding count to affect their behavior in some -way. We have already seen how {3x} deletes three characters, and {22G} moves -us to line 22 of the file. For almost all of the commands, one can survive by -thinking of these leading numbers as a 'repeat count' specifying that the -command is to be repeated so many number of times. - -Other commands use the repeat count slightly differently, like the {G} command -which use it as a line number. - -For example: - -{3^D} means scroll down in the file three lines. Subsequent {^D} OR {^U} will -scroll only three lines in their respective directions! - -{3z^M} says put line three of the file at the top of the screen, while {3z.} -says put line three as close to the middle of the screen as possible. - -{50|} moves the cursor to column fifty in the current line. - -{3^F} says move forward 3 screenfulls. This is a repetition count. The -documents advertise that {3^B} should move BACK three screenfulls, but I -can't get it to work. - -Position the cursor on some text and try {3r.}. This replaces three characters -with '...'. However, {3s.....^[} is the same as {3xi.....^[}. - -Try {10a+----^[}. - -A very useful instance of a repetition count is one given to the '.' command, -which repeats the last 'change' command. If you {dw} and then {3.}, you will -delete first one and then three words. You can then delete two more words with -{2.}. If you {3dw}, you will delete three words. A subsequent {.} will delete -three more words. But a subsequent {2.} will delete only two words, not three -times two words. - -Caveat: The author has noticed that any repetition count with {^B} will NOT -work: indeed, if you are at the end of your file and try {3^B} sufficiently -often, the editor will hang you in an infinite loop. Please don't try it: -take my word for it. - -Section 28: {t} {T} {|} - -Position the cursor on line 13 below: - -Line 13: Four score and seven years ago, our forefathers brought ... - -Note that {fv} moves the cursor on/over the 'v' in 'seven'. Do a {0} to return -to the beginning of the line and try a {tv}. The cursor is now on/over the -first 'e' in 'seven'. The {f} command finds the next occurrence of the -specified letter and moves the cursor to it. The {t} command finds the -specified letter and moves the cursor to the character immediately preceding -it. {T} searches backwards, as does {F}. - -Now try {60|}: the cursor is now on the 'o' in 'brought', which is the -sixtieth character on the line. - -Section 29: {d} {c} - -Due to their complexity we have delayed discussion of two of the most powerful -operators in vi until now. Effective use of these operators requires more -explanation than was deemed appropriate for the first half of the tutorial. - -{d} and {c} are called operators instead of commands because they consist of -three parts: a count specification or a buffer specification (see section -#BUFFERS), the {d} or {c}, and the object or range description. We will not -discuss buffers at this stage, but will limit ourselves to count -specifications. Examples speak louder than words: position the cursor at the -beginning of line 14: - -Line 14: Euclid alone has looked on beauty bear. - -Obviously, there is something wrong with this quotation. Type {2fb} to -position the cursor on the 'b' of 'bear'. Now, type {cwbare^[} -and observe the results. The {cw} specifies that the change command {c} is to -operate on a word object. More accurately, it specifies that the range of the -change command includes the next word. - -Position the cursor on the period in Line 14. (one way is to use {f.}) -Now, type {cbbeast^[}. This specifies the range of the change command to be the -previous word (the 'b' reminiscent of the {b} command). If we had wished to -delete the word rather than change it, we would have used the {d} operator, -rather than the {c} operator. - -Position the cursor at the beginning of the line with {0}. Type -{d/look/^M}. The search string specified the range of the delete. -Everything UP TO the word 'looking' was deleted from the line. - -In general, almost any command that would move the cursor will specify a range -for these commands. The most confusing exception to this rule is when {dd} or -{cc} is entered: they refer to the whole line. Following is a summary of the -suffixes (suffices? suffici?) and the ranges they specify: - - suffix will delete{d}/change{c} - ------ ------------------------ - ^[ cancels the command - w the word to the right of the cursor - W ditto, but ignoring punctuation - b the word to the left of the cursor - B ditto, but ignoring punctuation - e see below. - E ditto - (space) a character - $ to the end of the line - ^ to the beginning of the line - / .. / up to, but not including, the string - ? .. ? back to and including the string - fc up to and including the occurrence of c - Fc back to and including the occurrence of c - tc up to but not including the occurrence of c - Tc back to but not including the occurrence of c - ^M TWO lines (that's right: two) - (number)^M that many lines plus one - (number)G up to and including line (number) - ( the previous sentence if you are at the beginning of - the current sentence, or the current sentence up to where - you are if you are not at the beginning of the current - sentence. Here, 'sentence' refers to the intuitive - notion of an English sentence, ending with '!', '?', - or '.' and followed by an end of line or two spaces. - ) the rest of the current sentence - { analogous to '(', but in reference to paragraphs: - sections of text surrounded by blank lines - } analogous to ')', but in reference to paragraphs - [[ analogous to '(', but in reference to sections - ]] analogous to ')', but in reference to sections - H the first line on the screen - M the middle line on the screen - L the last line on the screen - 3L through the third line from the bottom of the screen - ^F forward a screenful - ^B backward a screenful - : - : etc. etc. etc. - -This list is not exhaustive, but it should be sufficient to get the idea -across: after the {c} or {d} operator, you can specify a range with another -move-the-cursor command, and that is the region of text over which the command -will be effective. - -Section 30: updating the screen {^R} - -Vi tries to be very intelligent about the type of terminal you are working on -and tries to use the in-terminal computing power (if any) of your terminal. -Also if the terminal is running at a low baud rate (say 1200 or below), vi sets -various parameters to make things easier for you. For example, if you were -running on a 300 baud terminal (that's 30 characters per second transmission -rate) not all 24 lines of the screen would be used by vi. In addition, there -is a large portion of the editor keeping track of what your screen currently -looks like, and what it would look like after a command has been executed. Vi -then compares the two, and updates only those portions of the screen that have -changed. - -Furthermore, some of you may have noticed (it depends on your terminal) that -deleting lines or changing large portions of text may leave some lines on the -screen looking like: -@ -meaning that this line of the screen does not correspond to any line in your -file. It would cost more to update the line than to leave it blank for the -moment. If you would like to see your screen fully up-to-date with the -contents of your file, type {^R}. - -To see it in action, delete several lines with {5dd}, type {^R}, and then type -{u} to get the lines back. - -Here is as good a place as any to mention that if the editor is displaying the -end of your file, there may be lines on the screen that look like: -~ -indicating that that screen line would not be affected by {^R}. These lines -simply indicate the end of the file. - -Section 31: text buffers {"} - -Vi gives you the ability to store text away in "buffers". This feature is very -convenient for moving text around in your file. There are a total of thirty- -five buffers available in vi. There is the "unnamed" buffer that is used by all -commands that delete text, including the change operator {c}, the substitute -and replace commands {s} and {r}, as well as the delete operator {d} and delete -commands {x} and {X}. This buffer is filled each time any of these commands -are used. However, the undo command {u} has no effect on the unnamed buffer. - -There are twenty-six buffers named 'a' through 'z' which are available for the -user. If the name of the buffer is capitalized, then the buffer is not -overwritten but appended to. For example, the command {"qdd} will delete one -line and store that line in the 'q' buffer, destroying the previous contents of -the buffer. However, {"Qdd} will delete one line of text and append that line -to the current contents of the 'q' buffer. - -Finally, there are nine buffers named '1' through '9' in which the last nine -deletes are stored. Buffer 1 is the default buffer for the modify commands and -is sometimes called the unnamed buffer. - -To reference a specific buffer, use the double-quote command {"} followed by -the name of the buffer. The next two sections show how buffers can be used to -advantage. - -Section 32: rearranging and duplicating text: {y} {Y} {p} {P} - -Position yourself on line 15 below and {z^M}: - -Line 15: A tree as lovely as a poem ... -Line 16: I think that I shall never see - -Type {dd}. Line 15 has disappeared and been replaced with the empty line (one -with the single character @ on it) or (again depending on your terminal) Line -16 has moved up and taken its place. We could recover Line 15 with an undo -{u} but that would simply return it to its original location. Obviously, the -two lines are reversed, so we want to put line 15 AFTER line 16. This is -simply done with the put command {p}, which you should type now. What has -happened is that {dd} put Line 15 into the unnamed buffer, and the {p} command -retrieved the line from the unnamed buffer. - -Now type {u} and observe that Line 15 disappears again (the put was undone -without affecting the unnamed buffer). Type {P} and see that the capital {P} -puts the line BEFORE the cursor. - -To get Line 15 where it belongs again type {dd}{p}. - -Also in Line 15 note that the words 'tree' and 'poem' are reversed. Using the -unnamed buffer again: {ft}{dw}{ma}{fp}{P}{w}{dw}{`aP} will set things aright -(note the use of the reverse quote). - -The put commands {p} and {P} do not affect the contents of the buffer. -Therefore, multiple {p} or {P} will put multiple copies of the unnamed buffer -into your file. - -Experiment with {d} and {p} on words, paragraphs, etc. Whatever {d} -deletes, {p} can put. - -Position the cursor on Line 17 and {z^M}: - -Line 17: interest apple cat elephant boy dog girl hay farmer - -Our task is to alphabetize the words on line 17. With the named buffers (and a -contrived example) it is quite easy: - -{"idw}{"adw}{"cdw}{"edw}{"bdw}{"ddw}{"gdw}{"hdw}{"fdw} - -stores each of the words in the named buffer corresponding to the first letter -of each of the words ('interest' goes in buffer "i, 'apple' goes in buffer "a, -etc.). Now to put the words in order type: - -{"ap$}{"bp$}{"cp$}{"dp$}{"ep$}{"fp$}{"gp$}{"hp$}{"ip$} - -Notice that, because 'farmer' was at the end of the line, {dw} did not include -a space after it, and that, therefore, there is no space between 'farmer' and -'girl'. This is corrected with {Fg}{i ^[}. - -This example could have been done just as easily with lines as with -words. - -You do not have to delete the text in order to put it into a buffer. If all -you wish to do is to copy the text somewhere else, don't use {d}, rather use -the yank commands {y} or {Y}. {y} is like {d} and {c} - an operator rather -than a command. It, too, takes a buffer specification and a range -specification. Therefore, instead of {dw}{P} to load the unnamed buffer with a -word without deleting the word, use {yw} (yank a word). - -{Y} is designed yank lines, and not arbitrary ranges. That is, {Y} is -equivalent to {yy} (remember that operators doubled means the current line), -and {3Y} is equivalent to {3yy}. - -If the text you yank or modify forms a part of a line, or is an object such as -a sentence which partially spans more than one line, then when you put the text -back, it will be placed after the cursor (or before if you use {P}). If the -yanked text forms whole lines, they will be put back as whole lines, without -changing the current line. In this case, the put acts much like the {o} or {O} -command. - -The named buffers "a through "z are not affected by changing edit files. -However, the unnamed buffer is lost when you change files, so to move text from -one file to another you should use a named buffer. - -Section 33: recovering lost lines - -Vi also keeps track of the last nine deletes, whether you ask for it or not. -This is very convenient if you would like to recover some text that was -accidentally deleted or modified. Position the cursor on line 18 following, -and {z^M}. - - -Line 18: line 1 -Line 19: line 2 -Line 20: line 3 -Line 21: line 4 -Line 22: line 5 -Line 23: line 6 -Line 24: line 7 -Line 25: line 8 -Line 26: line 9 -Type {dd} nine times: now don't cheat with {9dd}! That is totally different. - -The command {"1p} will retrieve the last delete. Furthermore, when the -numbered buffers are used, the repeat-command command {.} will increment the -buffer numbers before executing, so that subsequent {.} will recover all nine -of the deleted lines, albeit in reverse order. If you would like to review the -last nine deletes without affecting the buffers or your file, do an undo {u} -after each put {p} and {.}: - -{"1p}{u}{.}{u}{.}{u}{.}{u}{.}{u}{.}{u}{.}{u}{.}{u}{.} - -will show you all the buffers and leave them and your file intact. - -If you had cheated above and deleted the nine lines with {9dd}, all nine lines -would have been stored in both the unnamed buffer and in buffer number 1. -(Obviously, buffer number 1 IS the unnamed buffer and is just the default -buffer for the modify commands.) - -Section 34: advanced file manipulation: {:r} {:e} {:n} {:w} {!} {:!} - -We've already looked at writing out the file you are editing with the -{:w} command. Now let's look at some other vi commands to make editing -more efficient. - -Section 34.1: more than one file at a time {:n} {:args} - -Many times you will want to edit more than one file in an editing session. -Instead of entering vi and editing the first file, exiting, entering vi and -editing the second, etc., vi will allow you to specify ALL files that you wish -to edit on the invocation line. Therefore, if you wanted to edit file1 and -file2: - -% vi file1 file2 - -will set up file1 for editing. When you are done editing file one, write it -out {:w^M} and then type {:n^M} to get the next file on the list. On large -programming projects with many source files, it is often convenient just to -specify all source files with, say: - -% vi *.c - -If {:n^M} brings in a file that does not need any editing, another {:n^M} -will bring in the next file. - -If you have made changes to the first file, but decide to discard these changes -and proceed to the next file, {:n!^M} forces the editor to discard the current -contents of the editor. - -You can specify a new list of files after {:n}; e.g., {:n f1 f2 f3^M}. This -will replace the current list of files (if any). - -You can see the current list of files being edited with {:args^M}. - -Section 34.2: reading files and command output: {:r} - -Typing {:r fname^M} will read the contents of file fname into the editor and -put the contents AFTER the cursor line. - -Typing {:r !cmd^M} will read the output of the command cmd and place that -output after the cursor line. - -Section 34.3: invoking vi from within vi: {:e} {:vi} - -To edit another file not mentioned on the invocation line, type {:e filename^M} -or {:vi filename^M}. If you wish to discard the changes to the current file, -use the exclamation point after the command, e.g. {:e! filename^M}. - -Section 34.4: escaping to a shell: {:sh} {:!} {^Z} - -Occasionally, it is useful to interrupt the current editing session to perform -a UNIX task. However, there is no need to write the current file out, exit -the editor, perform the task, and then reinvoke the editor on the same file. -One thing to do is to spin off another process. If there are several UNIX -commands you will need to execute, simply create another shell with {:sh^M}. -At this point, the editor is put to sleep and will be reawakened when you log -out of the shell. - -If it is a single command that you want to execute, type {:!cmd^M}, where cmd -is the command that you wish to run. The output of the command will come to -the terminal as normal, and will not be made part of your file. The message -"[Hit return to continue]" will be displayed by vi after the command is -finished. Hitting return will then repaint the screen. Typing another -{:!cmd^M} at this point is also acceptable. - -However, there is a quicker, easier way: type {^Z}. Now this is a little -tricky, but hang in there. When you logged into UNIX, the first program you -began communicating with was a program that is called a "shell" (i.e. it 'lays -over' the operating system protecting you from it, sort of like a considerate -porcupine). When you got your first prompt on the terminal (probably a '%' -character) this was the shell telling you to type your first command. When -you typed {vi filename} for some file, the shell did not go away, it just went -to sleep. The shell is now the parent of vi. When you type {^Z} the editor -goes to sleep, the shell wakes up and says "you rang?" in the form of another -prompt (probably '%'). At this point you are talking to the shell again and -you can do anything that you could before including edit another file! (The -only thing you can't do is log out: you will get the message "There are -stopped jobs.") - -When your business with the shell is done, type {fg} for 'foreground' and the -last process which you ^Z'd out of will be reawakened and the shell will go -back to sleep. I will refer you to the documentation for the Berkeley shell -'csh' for more information on this useful capability. - -Section 34.5: writing parts of a file: {:w} - -The {:w} command will accept a range specifier that will then write only a -selected range of lines to a file. To write this section to a file, position -the cursor on the section line (e.g. {/^Section 34.5:/^M}) and {z^M}. Now type -{^G} to find out the line number (it will be something like "line 513"). Now -{/^Section 34.6:/-1^M} to find the last line of this section, and {^G} to find -its line number (it will be something like 542). To write out this section of -text by itself to a separate file which we will call "sepfile", type -{:510,542w sepfile^M}. If sepfile already exists, you will have to use the -exclamation point: {:1147,1168w! sepfile^M} or write to a different, non- -existent file. - -{:!cat sepfile^M} will display the file just written, and it should be the -contents of this section. - -There is an alternate method of determining the line numbers for the write. -{:set number^M} will repaint the screen with each line numbered. When the file -is written and the numbers no longer needed, {:set nonumber^M} will remove the -numbers, and {^R} will adjust the screen. - -Or, if you remember your earlier lessons about marking lines of text, -mark the beginning and ending lines. Suppose we had used {ma} to mark the -first line of the section and {mb} to mark the last. Then the command -{:'a,'bw sepfile^M} will write the section into "sepfile". In general, -you can replace a line number with the 'name' of a marked line (a single-quote -followed by the letter used to mark the line) - - -Section 34.6: filtering portions of text: {!} - -{!} is an operator like {c} and {d}. That is, it consists of a repetition -count, {!}, and a range specifier. Once the {!} operator is entered in its -entirety, a prompt will be given at the bottom of the screen for a UNIX -command. The text specified by the {!} operator is then deleted and -passed/filtered/piped to the UNIX command you type. The output of the UNIX -command is then placed in your file. For example, place the cursor at the -beginning of the following line and {z^M}: - -ls -l vi.tutorial -********* marks the bottom of the output from the ls command ********** - -Now type {!!csh^M}. The line will be replaced with the output from the ls -command. The {u} command works on {!}, also. - -Here is an extended exercise to display some of these capabilities. When this -tutorial was prepared, certain auxiliary programs were created to aid in its -development. Of major concern was the formatting of sections of the tutorial -to fit on a single screen, particularly the first few sections. What was -needed was a vi command that would 'format' a paragraph; that is, fill out -lines with as many words as would fit in eighty columns. There is no such vi -command. Therefore, another method had to be found. - -Of course, nroff was designed to do text formatting. However, it produces a -'page'; meaning that there may be many blank lines at the end of a formatted -paragraph from nroff. The awk program was used to strip these blank lines from -the output from nroff. Below are the two files used for this purpose: I refer -you to documentation on nroff and awk for a full explanation of their function. -Position the cursor on the next line and {z^M}. - -******** contents of file f ********** -# -nroff -i form.mac | awk "length != 0 { print }" -***** contents of file form.mac ****** -.na -.nh -.ll 79 -.ec  -.c2  -.cc  -************************************** - -Determine the line numbers of the two lines of file f. They should be -something like 574 and 575, although you better double check: this file is -under constant revision and the line numbers may change inadvertently. Then -{:574,575w f^M}. Do the same for the lines of file form.mac. They will be -approximately 577 and 582. Then {:577,582w form.mac^M}. File f must have -execute privileges as a shell file: {:!chmod 744 f^M}. - -Observe that this paragraph is -rather ratty in appearance. With our newly created files we can -clean it up dramatically. Position the cursor at the beginning -of this paragraph and type the following sequence of -characters -(note that we must abandon temporarily our convention -of curly braces since the command itself contains a curly brace - we -will use square brackets for the nonce): [!}f^M]. - -Here is a brief explanation of what has happened. By typing [!}f^M] we -specified that the paragraph (all text between the cursor and the first blank -line) will be removed from the edit file and piped to a UNIX program called -"f". This is a shell command file that we have created. This shell file runs -nroff, pipes its output to awk to remove blank lines, and the output from awk -is then read back into our file in the place of the old, ratty paragraph. The -file form.mac is a list of commands to nroff to get it to produce paragraphs -to our taste (the right margin is not justified, the line is 79 characters -long, words are not hyphenated, and three nroff characters are renamed to -avoid conflict: note that in this file, the {^G} you see there is vi's display -of the control-G character, and not the two separate characters ^ up-arrow and -G upper-case g). - -This example was created before the existence of the fmt program. I now type -[!}fmt^M] to get the same effect much faster. Actually, I don't type those -six keys each time: I have an abbreviation (which see). - -Section 35: searching with magic patterns - -The documentation available for "magic patterns" (i.e. regular expressions) is -very scanty. The following should explain this possibly very confusing feature -of the editor. This section assumes that the magic option is on. To make -sure, you might want to type {:set magic^M}. - -By "magic pattern" we mean a general description of a piece of text that the -editor attempts to find during a search. Most search patterns consist of -strings of characters that must be matched exactly, e.g. {/card/^M} searches -for a specific string of four characters. Let us suppose that you have -discovered that you consistently have mistyped this simple word as either ccrd -or czrd (this is not so far-fetched for touch typists). You could {/ccrd/^M} -and {n} until there are no more of this spelling, followed by {/czrd/^M} and -{n} until there are no more of these. Or you could {/c.rd/^M} and catch all of -them on the first pass. Try typing {/c.rd/^M} followed by several {n} and -observe the effect. - -Line 27: card cord curd ceard - -When '.' is used in a search string, it has the effect of matching any single -character. - -The character '^' (up-arrow) used at the beginning of a search string means -the beginning of the line. {/^Line 27/^M} will find the example line above, -while {/Line 27/^M} will find an occurrence of this string anywhere in the -line. - -Similarly, {/ the$/^M} will find all occurrences of the word 'the' occurring -at the end of a line. There are several of them in this file. - -Note that {:set nomagic^M} will turn off the special meaning of these magic -characters EXCEPT for '^' and '$' which retain their special meanings at the -beginning and end of a search string. Within the search string they hold no -special meaning. Try {/\/ the$\//^M} and note that the dollar-sign is not the -last character in the search string. Let the dollar-sign be the last -character in the search string, as in {/\/ the$/^M} and observe the result. - -Observe the result of {/back.*file/^M}. This command, followed by sufficient -{n}, will show you all lines in the file that contain both the words 'back' -and 'file' on the same line. The '*' magic character specifies that the -previous regular expression (the '.' in our example) is to be repeatedly -matched zero or more times. In our example we specified that the words 'back' -and 'file' must appear on the same line (they may be parts of words such as -'backwards' or 'workfile') separated by any number (including zero) of -characters. - -We could have specified that 'back' and 'file' are to be words by themselves by -using the magic sequences '\<' or '\>'. E.g. {/\.*\/^M}. The -sequence '\<' specifies that this point of the search string must match the -beginning of a word, while '\>' specifies a match at the end of a word. By -surrounding a string with these characters we have specified that they must be -words. - -To find all words that begin with an 'l' or a 'w', followed by an 'a' or an -'e', and ending in 'ing', try {/\<[lw][ea][a-z]*ing\>/^M}. This will match -words like 'learning', 'warning', and 'leading'. The '[..]' notation matches -exactly ONE character. The character matched will be one of the characters -enclosed in the square brackets. The characters may be specified individually -as in [abcd] or a '-' may be used to specify a range of characters as in [a-d]. -That is, [az] will match the letter 'a' OR the letter 'z', while [a-z] will -match any of the lower case letters from 'a' through 'z'. If you would like to -match either an 'a', a '-', or a 'z', then the '-' must be escaped: [a\-z] will -match ONE of the three characters 'a', '-', or 'z'. - -If you wish to find all Capitalized words, try {/\<[A-Z][a-z]*\>/^M}. The -following will find all character sequences that do NOT begin with an -uncapitalized letter by applying a special meaning to the '^' character in -square brackets: {/\<[^a-z][a-z]*\>/^M}. When '^' is the first character of a -square-bracket expression, it specifies "all but these characters". (No -one claimed vi was consistent.) - -To find all variable names (the first character is alphabetic, the remaining -characters are alphanumeric): try {/\<[A-Za-z][A-Za-z0-9]*\>/^M}. - -In summary, here are the primitives for building regular expressions: - - ^ at beginning of pattern, matches beginning of line - $ at end of pattern, matches end of line - . matches any single character - \< matches the beginning of a word - \> matches the end of a word - [str] matches any single character in str - [^str] matches any single character NOT in str - [x-y] matches any character in the ASCII range between x and y - * matches any number (including zero) of the preceding pattern - -Section 36: advanced substitution: {:s} - -The straightforward colon-substitute command looks like the substitute -command of most line-oriented editors. Indeed, vi is nothing more than a -superstructure on the line-oriented editor ex and the colon commands are -simply a way of accessing commands within ex (see section #EX). This gives us -a lot of global file processing not usually found in visual oriented editors. - -The colon-substitute command looks like: {:s/ .. / .. /^M} and will find the -pattern specified after the first slash (this is called the search pattern), -and replace it with the pattern specified after the second slash (called, -obviously enough, the replacement pattern). E.g. position the cursor on line -28 below and {:s/esample/example/^M}: - -Line 28: This is an esample. - -The {u} and {U} commands work for {:s}. The first pattern (the search pattern) -may be a regular expression just as for the search command (after all, it IS a -search, albeit limited to the current line). Do an {u} on the above line, and -try the following substitute, which will do almost the same thing: -{:s/s[^ ]/x/^M}. -Better undo it with {u}. The first pattern {s[^ ]} matches an 's' -NOT followed by a blank: the search therefore ignores the 's'es in 'This' and -'is'. However, the character matched by {[^ ]} must appear in the replacement -pattern. But, in general, we do not know what that character is! (In this -particular example we obviously do, but more complicated examples will follow.) -Therefore, vi (really ex) has a duplication mechanism to copy patterns matched -in the search string into the replacement string. Line 29 below is a copy of -line 28 above so you can adjust your screen. - -Line 29: This is an esample. - -In general, you can nest parts of the search pattern in \( .. \) and refer to -it in the replacement pattern as \n, where n is a digit. The problem outlined -in the previous paragraph is solved with {:s/s\([^ ]\)/x\1/^M}: try it. Here -\1 refers to the first pattern grouping \( .. \) in the search string. - -Obviously, for a single line, this is rather tedious. Where it becomes -powerful, if not necessary, is in colon-substitutes that cover a range of -lines. (See the next section for a particularly comprehensive example.) - -If the entire character sequence matched by the search pattern is needed in -the replacement pattern, then the unescaped character '&' can be used. On -Line 29 above, try {:s/an e.ample/not &/^M}. If another line is to have the -word 'not' prepended to a pattern, then '~' can save you from re-typing the -replacement pattern. E.g. {:s/some pattern/~/^M} after the previous example -would be equivalent to {:s/some pattern/not &/^M}. - -One other useful replacement pattern allows you to change the case of -individual letters. The sequences {\u} and {\l} cause the immediately -following character in the replacement to be converted to upper- or lower-case, -respectively, if this character is a letter. The sequences {\U} and {\L} turn -such conversion on, either until {\E} or {\e} is encountered, or until the end -of the replacement pattern. - -For example, position the cursor on a line: pick a line, any line. Type -{:s/.*/\U&/^M} and observe the result. You can undo it with {u}. - -The search pattern may actually match more than once on a single line. -However, only the first pattern is substituted. If you would like ALL -patterns matched on the line to be substituted, append a 'g' after the -replacement pattern: {:s/123/456/g^M} will substitute EVERY occurrence -on the line of 123 with 456. - -Section 37: advanced line addressing: {:p} {:g} {:v} - -Ex (available through the colon command in vi) offers several methods for -specifying the lines on which a set of commands will act. For example, if you -would like to see lines 50 through 100 of your file: {:50,100p^M} will display -them, wait for you to [Hit return to continue], and leave you on line 100. -Obviously, it would be easier just to do {100G} from within vi. But -what if you would like to make changes to just those lines? Then the -addressing is important and powerful. - -Line 30: This is a text. -Line 31: Here is another text. -Line 32: One more text line. - -The lines above contain a typing error that the author of this tutorial tends -to make every time he attempts to type the word 'test'. To change all of these -'text's into 'test's, try the following: -{:/^Line 30/,/^Line 32/s/text/test/^M}. This finds the beginning and end of -the portion of text to be changed, and limits the substitution to each of the -lines in that range. The {u} command applies to ALL of the substitutions as -a group. - -This provides a mechanism for powerful text manipulations. -And very complicated examples. - -Line 33: This test is a. -Line 34: Here test is another. -Line 35: One line more test. - -The above three lines have the second word out of order. The following command -string will put things right. Be very careful when typing this: it is very -long, full of special characters, and easy to mess up. You may want to -consider reading the following section to understand it before trying the -experiment. Don't worry about messing up the rest of the file, though: the -address range is specified. - -{:/^Line 33/,/^Line 35/s/\([^:]*\): \([^ ]*\) \([^ ]*\) \([^.]*\)/\1: \2 \4 \3/^M} - -There are several things to note about this command string. First of all, the -range of the substitute was limited by the address specification {/^Line -33/,/^Line 35/^M}. It might have been simpler to do {:set number^M} to see the -line numbers directly, and then, in place of the two searches, typed -the line numbers, e.g. {1396,1398}. Or to mark the lines with {ma} and {mb} -and use {'a,'b}. - -Then follows the substitute pattern itself. To make it easier to understand -what the substitute is doing, the command is duplicated below with the various -patterns named for easier reference: - - s/\([^:]*\): \([^ ]*\) \([^ ]*\) \([^.]*\)/\1: \2 \4 \3/ - |--\1---| |--\2---| |--\3---| |--\4---| - |--------search pattern------------------|-replacement| - |--pattern---| - -In overview, the substitute looks for a particular pattern made up of -sub-patterns, which are named \1, \2, \3, and \4. These patterns are specified -by stating what they are NOT. Pattern \1 is the sequence of characters that -are NOT colons: in the search string, {[^:]} will match exactly one character -that is not a colon, while appending the asterisk {[^:]*} specifies that the -'not a colon' pattern is to be repeated until no longer satisfied, and -{\([^:]*\)} then gives the pattern its name, in this case \1. Outside of the -specification of \1 comes {: }, specifying that the next two characters must be -a colon followed by a blank. - -Patterns \2 and \3 are similar, specifying character sequences that are -not blanks. Pattern \4 matches up to the period at the end of the line. - -The replacement pattern then consists of specifying the new order of the -patterns. - -This is a particularly complicated example, perhaps the most complicated -in this tutorial/reference. For our small examples, it is obviously -tedious and error prone. For large files, however, it may be the most -efficient way to make the desired modifications. - -(The reader is advised to look at the documentation for awk. This tool is very -powerful and slightly simpler to use than vi for this kind of file -manipulation. But, it is another command language to learn.) - -Many times, you will not want to operate on every line in a certain -range. Rather you will want to make changes on lines that satisfy -certain patterns; e.g. for every line that has the string 'NPS' on it, -change 'NPS' to 'Naval Postgraduate School'. The {:g} addressing -command was designed for this purpose. The example of this paragraph -could be typed as {:g/NPS/s//Naval Postgraduate School/^M}. - -The general format of the command is {:g/(pattern)/cmds^M} and it -works in the following way: all lines that match the pattern -following the {:g} are 'tagged' in a special way. Then each of these -lines have the commands following the pattern executed over them. - -Line 36: ABC rhino george farmer Dick jester lest -Line 37: george farmer rhino lest jester ABC -Line 38: rhino lest george Dick farmer ABC jester - -Type: - -{:g/^Line.*ABC/s/Dick/Harry Binswanger/|s/george farmer/gentleman george/p^M} - -There are several things of note here. First, lines 36, 37, and 38 above are -tagged by the {:g}. Type {:g/^Line.*ABC/p^M} to verify this. Second, there -are two substitutes on the same line separated by '|'. In general, any colon -commands can be strung together with '|'. Third, both substitutes operate on -all three lines, even though the first stubstitute works on only two of the -lines (36 and 38). Fourth, the second substitute works on only two lines (36 -and 37) and those are the two lines printed by the trailing 'p'. - -The {:v} command works similarly to the {:g} command, except that the sense of -the test for 'tagging' the lines is reversed: all lines NOT matching the search -pattern are tagged and operated on by the commands. - -Using {^V} to quote carriage return (see section 39) can be used in global -substitutions to split two lines. For example, the command -{:g/\. /s//.^V^M/g^M} will change your file so that each sentence is on a -separate line. (Note that we have to 'escape' the '.', because '.' by itself -matches any character. Our command says to find any line which contains a -period followed by 2 spaces, and inserts a carriage return after the period.) - -Caveat: In some of the documentation for ex and vi you may find the -comment to the effect that {\^M} can be used between commands following -{:g}. The author of this tutorial has never gotten this to work and has -crashed the editor trying. - -Section 38: higher level text objects and nroff: {(} {)} [{] [}] {[[} {]]} - -(Note: this section may be a little confusing because of our command -notation. Using curly braces to surround command strings works fine as -long as the command string does not contain any curly braces itself. -However, the curly braces are legitimate commands in vi. Therefore, for -any command sequence that contains curly braces, we will surround that -sequence with SQUARE braces, as on the previous Section line.) - -In working with a document, particularly if using the text formatting -programs nroff or troff, it is often advantageous to work in terms of -sentences, paragraphs, and sections. The operations {(} and {)} move to -the beginning of the previous and next sentences, respectively. Thus -the command {d)} will delete the rest of the current sentence; likewise -{d(} will delete the previous sentence if you are at the beginning of -the current sentence, or, if you are not at the beginning of a sentence, -it will delete the current sentence from the beginning -up to where you are. - -A sentence is defined to end at a '.', '!', or '?' which is followed -by either the end of a line, or by two spaces. Any number of closing -')', ']', '"', and ''' characters may appear after the '.', '!', or '?' -before the spaces or end of line. Therefore, the {(} and {)} commands -would recognize only one sentence in the following line, but two -sentences on the second following line. - -Line 39: This is one sentence. Even though it looks like two. -Line 40: This is two sentences. Because it has two spaces after the '.'. - -The operations [{] and [}] move over paragraphs and the operations {[[} -and {]]} move over sections. - -A paragraph begins after each empty line, and also at each of a set of nroff -paragraph macros. A section begins after each line with a form-feed ^L in the -first column, and at each of a set of nroff section macros. When preparing a -text file as input to nroff, you will probably be using a set of nroff macros -to make the formatting specifications easier, or more to your taste. These -macros are invoked by beginning a line with a period followed by the one or two -letter macro name. Vi has been programmed to recognize these nroff macros, and -if it doesn't recognize your particular macro you can use the {:set paragraphs} -or {:set sections} commands so that it will. - -Section 39: more about inserting text - -There are a number of characters which you can use to make correnctions -during input mode. These are summarized in the following table. - - ^H deletes the last input character - ^W deletes the last input word - (erase) same as ^H; each terminal can define its own erase character; - for some it is ^H, for others it is the DELETE key, and for - others it is '@'. - (kill) deletes the input on this line; each terminal can define its - own line-kill character; for some it is ^U, for others it is - '@'; you will need to experiment on your terminal to find - out what your line-kill and erase characters are. - \ escapes a following ^H, (kill), and (erase) characters: i.e. - this is how to put these characters in your file. - ^[ escape key; ends insertion mode - ^? the delete key; interrupts an insertion, terminating it - abnormally. - ^M the return key; starts a new line. - ^D backtabs over the indentation set by the autoindent option - 0^D backtabs over all indentation back to the beginning of the line - ^^D (up-arrow followed by control-d)same as 0^D, except the indentation - will be restored at the beginning of the next line. - ^V quotes the next non-printing character into the file - -If you wish to type in your erase or kill character (say # or @ or ^U) then you -must precede it with a \, just as you would do at the normal system command -level. A more general way of typing non-printing characters into the file is -to precede them with a ^V. The ^V echoes as a ^ character on which the cursor -rests. This indicates that the editor expects you to type a control character -and it will be inserted into the file at that point. There are a few -exceptions to note. The implementation of the editor does not allow the null -character ^@ to appear in files. Also the linefeed character ^J is used by the -editor to separate lines in the file, so it cannot appear in the middle of a -line. (Trying to insert a ^M into a file, or putting it in the replacement -part of a substitution string will result in the matched line being split in -two. This, in effect, is how to split lines by using a substitution.) You can -insert any other character, however, if you wait for the editor to echo the ^ -before you type the character. In fact, the editor will treat a following -letter as a request for the corresponding control character. This is the only -way to type ^S or ^Q, since the system normally uses them to suspend and resume -output and never gives them to the editor to process. - -If you are using the autoindent option you can backtab over the indent which it -supplies by typing a ^D. This backs up to the boundary specified by the -shiftwidth option. This only works immediately after the supplied autoindent. - -When you are using the autoindent option you may wish to place a label at the -left margin of a line. The way to do this easily is to type ^ (up-arrow) and -then ^D. The editor will move the cursor to the left margin for one line, and -restore the previous indent on the next. You can also type a 0 followed -immediately by a ^D if you wish to kill all indentation and not have it resume -on the next line. - -Section 40: more on operators: {d} {c} {<} {>} {!} {=} {y} - -Below is a non-exhaustive list of commands that can follow the operators -to affect the range over which the operators will work. However, note -that the operators {<}, {>}, {!}, and {=} do not operate on any object -less than a line. Try {!w} and you will get a beep. To get the -operator to work on just the current line, double it. E.g. {<<}. - - suffix will operate on - ------ ------------------------ - ^[ cancels the command - w the word to the right of the cursor - W ditto, but ignoring punctuation - b the word to the left of the cursor - B ditto, but ignoring punctuation - e see below. - E ditto - (space) a character - $ to the end of the line - ^ to the beginning of the line - / .. / up to, but not including, the string - ? .. ? back to and including the string - fc up to and including the occurrence of c - Fc back to and including the occurrence of c - tc up to but not including the occurrence of c - Tc back to but not including the occurrence of c - ^M TWO lines (that's right: two) - (number)^M that many lines plus one - (number)G up to and including line (number) - ( the previous sentence if you are at the beginning of - the current sentence, or the current sentence up to where - you are if you are not at the beginning of the current - sentence. Here, 'sentence' refers to the intuitive - notion of an English sentence, ending with '!', '?', - or '.' and followed by an end of line or two spaces. - ) the rest of the current sentence - { analogous to '(', but in reference to paragraphs: - sections of text surrounded by blank lines - } analogous to ')', but in reference to paragraphs - [[ analogous to '(', but in reference to sections - ]] analogous to ')', but in reference to sections - H the first line on the screen - M the middle line on the screen - L the last line on the screen - 3L through the third line from the bottom of the screen - ^F forward a screenful - ^B backward a screenful - : - : etc. etc. etc. - -This list is not exhaustive, but it should be sufficient to get the idea -across: after the operator, you can specify a range with a move-the-cursor -command, and that is the region of text over which the operator will be -effective. - -Section 41: abbreviations: {:ab} - -When typing large documents you may find yourself typing a large phrase -over and over. Vi gives you the ability to specify an abbreviation for -a long string such that typing the abbreviation will automatically -expand into the longer phrase. - -Type {:ab nps Naval Postgraduate School^M}. Now type: - -{iThis is to show off the nps's UNIX editor.^M^[} - -Section 42: vi's relationship with the ex editor: {:} - -Vi is actually one mode of editing within the editor ex. When you are -running vi you can escape to the line oriented editor of ex by giving -the command {Q}. All of the colon-commands which were introduced above -are available in ex. Likewise, most ex commands can be invoked from vi -using {:}. - -In rare instances, an internal error may occur in vi. In this case you -will get a diagnostic and will be left in the command mode of ex. You can -then save your work and quit if you wish by giving the command {x} after -the colon prompt of ex. Or you can reenter vi (if you are brave) by -giving ex the command {vi}. - -Section 43: vi on hardcopy terminals and dumb terminals: open mode - -(The author has not checked the following documentation for accuracy. It is -abstracted from the Introduction to Vi Editing document.) - -If you are on a hardcopy terminal or a terminal which does not have a cursor -which can move off the bottom line, you can still use the command set of vi, -but in a different mode. When you give the vi command to UNIX, the editor will -tell you that it is using open mode. This name comes from the open command in -ex, which is used to get into the same mode. - -The only difference between visual mode (normal vi) and open mode is the way in -which the text is displayed. - -In open mode the editor uses a single line window into the file, and moving -backward and forward in the file causes new lines to be displayed, always below -the current line. Two commands of vi work differently in open: {z} and {^R}. -The {z} command does not take parameters, but rather draws a window of context -around the current line and then returns you to the current line. - -If you are on a hardcopy terminal, the {^R} command will retype the current -line. On such terminals, the editor normally uses two lines to represent the -current line. The first line is a copy of the line as you started to edit it, -and you work on the line below this line. When you delete characters, the -editor types a number of \'s to show you the characters which are deleted. The -editor also reprints the current line soon after such changes so that you can -see what the line looks like again. - -It is sometimes useful to use this mode on very slow terminals which can -support vi in the full screen mode. You can do this by entering ex and using -an {open} command. - -********************************************************************* -Section 44: options: {:set} {setenv EXINIT} - -You will discover options as you need them. Do not worry about them very much -on the first pass through this document. My advice is to glance through them, -noting the ones that look interesting, ignoring the ones you don't understand, -and try re-scanning them in a couple of weeks. - -If you decide that you have a favorite set of options and would like to change -the default values for the editor, place a {setenv EXINIT} command in your -.login file. When you are given an account under UNIX your directory has -placed in it a file that is executed each time you log in. If one of the -commands in this file sets the environment variable EXINIT to a string of vi -commands, you can have many things done for you each time you invoke vi. For -example, if you decide that you don't like tabstops placed every eight columns -but prefer every four columns, and that you wish the editor to insert linefeeds -for you when your typing gets you close to column 72, and you want -autoindentation, then include the following line in your .login file: - -setenv EXINIT='set tabstop=4 wrapmargin=8 autoindent' - -or equivalently - -setenv EXINIT='se ts=4 wm=8 ai' - -Each time you bring up vi, this command will be executed and the options set. - -There are forty options in the vi/ex editor that the user can set for his/her -own convenience. They are described in more detail in individual sections -below. The section line will show the full spelling of the option name, the -abbreviation, and the default value of the option. The text itself -comes from the ex reference manual and is not the epitome of clarity. - -Section 44.1: {autoindent}, {ai} default: noai - -Can be used to ease the preparation of structured program text. At the -beginning of each append, change or insert command or when a new line is opened -or created by an append, change, insert, or substitute operation within open or -visual mode, ex looks at the line being appended after, the first line changed -or the line inserted before and calculates the amount of white space at the -start of the line. It then aligns the cursor at the level of indentation so -determined. - -If the user then types lines of text in, they will continue to be justified at -the displayed indenting level. If more white space is typed at the beginning -of a line, the following line will start aligned with the first non-white -character of the previous line. To back the cursor up to the preceding tab -stop one can hit {^D}. The tab stops going backwards are defined at multiples -of the shiftwidth option. You cannot backspace over the indent, except by -sending an end-of-file with a {^D}. A line with no characters added to it -turns into a completely blank line (the white space provided for the autoindent -is discarded). Also specially processed in this mode are lines beginning with -an up-arrow `^' and immediately followed by a {^D}. This causes the input to -be repositioned at the beginning of the line, but retaining the previous indent -for the next line. Similarly, a `0' followed by a {^D} repositions at the -beginning but without retaining the previous indent. Autoindent doesn't happen -in global commands or when the input is not a terminal. - -Section 44.2: {autoprint}, {ap} default: ap - -Causes the current line to be printed after each delete, copy, join, move, -substitute, t, undo or shift command. This has the same effect as supplying a -trailing `p' to each such command. Autoprint is suppressed in globals, and -only applies to the last of many commands on a line. - -Section 44.3: {autowrite}, {aw} default: noaw - -Causes the contents of the buffer to be written to the current file if you have -modified it and give a next, rewind, stop, tag, or {!} command, or a control- -up-arrow {^^} (switch files) or {^]} (tag goto) command in visual. Note, that -the edit and ex commands do not autowrite. In each case, there is an -equivalent way of switching when autowrite is set to avoid the autowrite -({edit} for next, rewind! for rewind, stop! for stop, tag! for tag, shell -for {!}, and {:e #} and a {:ta!} command from within visual). - -Section 44.4: {beautify}, {bf} default: nobeautify - -Causes all control characters except tab ^I, newline ^M and form-feed ^L to be -discarded from the input. A complaint is registered the first time a backspace -character is discarded. Beautify does not apply to command input. - -Section 44.5: {directory}, {dir} default: dir=/tmp - -Specifies the directory in which ex places its buffer file. If this directory -in not writable, then the editor will exit abruptly when it fails to be able to -create its buffer there. - -Section 44.6: {edcompatible} default: noedcompatible - -Causes the presence or absence of g and c suffixes on substitute commands to be -remembered, and to be toggled by repeating the suffices. The suffix r makes -the substitution be as in the {~} command, instead of like {&}. - -[Author's note: this should not concern users of vi.] - -Section 44.7: {errorbells}, {eb} default: noeb - -Error messages are preceded by a bell. However, bell ringing in open and -visual modes on errors is not suppressed by setting noeb. If possible the -editor always places the error message in a standout mode of the terminal (such -as inverse video) instead of ringing the bell. - -Section 44.8: {hardtabs}, {ht} default: ht=8 - -Gives the boundaries on which terminal hardware tabs are set (or on which the -system expands tabs). - -Section 44.9: {ignorecase}, {ic} default: noic - -All upper case characters in the text are mapped to lower case in regular -expression matching. In addition, all upper case characters in regular -expressions are mapped to lower case except in character class specifications -(that is, character in square brackets). - -Section 44.10: {lisp} default: nolisp - -Autoindent indents appropriately for lisp code, and the {(}, {)}, [{], [}], -{[[}, and {]]} commands in open and visual modes are modified in a -striaghtforward, intuitive fashion to have meaning for lisp. - -[Author's note: but don't ask me to define them precisely.] - -Section 44.11: {list} default: nolist - -All printed lines will be displayed (more) unambiguously, showing tabs as ^I -and end-of-lines with `$'. This is the same as in the ex command {list}. - -Section 44.12: {magic} default: magic for {ex} and {vi}, nomagic for edit. - -If nomagic is set, the number of regular expression metacharacters is greatly -reduced, with only up-arrow `^' and `$' having special effects. In addition -the metacharacters `~' and `&' of the replacement pattern are treated as normal -characters. All the normal metacharacters may be made magic when nomagic is -set by preceding them with a `\'. - -[Author's note: In other words, if magic is set a back-slant turns the magic -off for the following character, and if nomagic is set a back-slant turns the -magic ON for the following character. And, no, we are not playing Dungeons and -Dragons, although I think the writers of these option notes must have played it -all the time.] - -Section 44.13: {mesg} default: mesg - -Causes write permission to be turned off to the terminal while you are in -visual mode, if nomesg is set. - -[Author's note: I don't know if anyone could have made any one sentence -paragraph more confusing than this one. What it says is: mesg allows people to -write to you even if you are in visual or open mode; nomesg locks your terminal -so they can't write to you and mess up your screen.] - -Section 44.14: {number, nu} default: nonumber - -Causes all output lines to be printed with their line numbers. In addition -each input line will be prompted with its line number. - -Section 44.15: {open} default: open - -If {noopen}, the commands open and visual are not permitted. This is set for -edit to prevent confusion resulting from accidental entry to open or visual -mode. - -[Author's note: As you may have guessed by now, there are actually three -editors available under Berkeley UNIX that are in reality the same -program, ex, with different options set: ex itself, vi, and edit.] - -Section 44.16: {optimize, opt} default: optimize - -Throughput of text is expedited by setting the terminal to not do automatic -carriage returns when printing more than one (logical) line of output, greatly -speeding output on terminals without addressable cursors when text with leading -white space is printed. - -[Author's note: I still don't know what this option does.] - -Section 44.17: {paragraphs, para} default: para=IPLPPPQPP LIbp - -Specifies the paragraphs for the [{] and [}] operations in open and visual. -The pairs of characters in the option's value are the names of the nroff macros -which start paragraphs. - -Section 44.18: {prompt} default: prompt - -Command mode input is prompted for with a `:'. - -[Author's note: Doesn't seem to have any effect on vi.] - -Section 44.19: {readonly}, {ro} default: noro, unless invoked with -R - or insufficient privileges on file - -This option allows you to guarantee that you won't clobber your file by -accident. You can set the option and writes will fail unless you use an `!' -after the write. Commands such as {x}, {ZZ}, the autowrite option, and in -general anything that writes is affected. This option is turned on if you -invoke the editor with the -R flag. - -Section 44.20: {redraw} default: noredraw - -The editor simulates (using great amounts of output), an intelligent terminal -on a dumb terminal (e.g. during insertions in visual the characters to the -right of the cursor position are refreshed as each input character is typed). -Useful only at very high baud rates, and should be used only if the system is -not heavily loaded: you will notice the performance degradation yourself. - -Section 44.21: {remap} default: remap - -If on, macros are repeatedly tried until they are unchanged. For example, if o -is mapped to O, and O is mapped to I, then if remap is set, o will map to I, -but if noremap is set, it will map to O . - -Section 44.22: {report} default: report=5 for ex and vi, 2 for edit - -Specifies a threshold for feedback from commands. Any command which modifies -more than the specified number of lines will provide feedback as to the scope -of its changes. For commands such as global, open, undo, and visual which have -potentially more far reaching scope, the net change in the number of lines in -the buffer is presented at the end of the command, subject to this same -threshold. Thus notification is suppressed during a global command on the -individual commands performed. - -Section 44.23: {scroll} default: scroll=1/2 window - -Determines the number of logical lines scrolled when a {^D} is received from a -terminal in command mode, and determines the number of lines printed by a -command mode z command (double the value of scroll). - -[Author's note: Doesn't seem to affect {^D} and {z} in visual (vi) mode.] - -Section 44.24: sections {sections} default: sections=SHNHH HU - -Specifies the section macros from nroff for the {[[} and {]]} operations in -open and visual. The pairs of characters in the options's value are the names -of the macros which start paragraphs. - -Section 44.25: {shell}, {sh} default: sh=/bin/sh - -Gives the path name of the shell forked for the shell escape command `!', and -by the shell command. The default is taken from SHELL in the environment, if -present. - -[Editor's note: I would suggest that you place the following line in -your .login file: -setenv SHELL '/bin/csh' -] - -Section 44.26: {shiftwidth}, {sw} default: sw=8 - -Used in reverse tabbing with {^D} when using autoindent to append text, and -used by the shift commands. Should probably be the same value as the tabstop -option. - -Section 44.27: {showmatch}, {sm} default: nosm - -In open and visual mode, when a `)' or `}' is typed, if the matching `(' or `{' -is on the screen, move the cursor to it for one second. Extremely useful with -complicated nested expressions, or with lisp. - -Section 44.28: {slowopen}, {slow} default: terminal dependent - -Affects the display algorithm used in visual mode, holding off display updating -during input of new text to improve throughput when the terminal in use is both -slow and unintelligent. See "An Introduction to Display Editing with Vi" for -more details. - -Section 44.29: {tabstop}, {ts} default: ts=8 - -The editor expands tabs ^I to tabstop boundaries in the display. - -Section 44.30: {taglength}, {tl} default: tl=0 - -Tags are not significant beyond this many characters. -A value of zero (the default) means that all characters are significant. - -Section 44.31: {tags} default: tags=tags /usr/lib/tags - -A path of files to be used as tag files for the tag command. A requested tag -is searched for in the specified files, sequentially. By default files called -tags are searched for in the current directory and in /usr/lib (a master file -for the entire system). - -[Author's note: The author of this tutorial has never used this option, nor -seen it used. I'm not even sure I know what they are talking about.] - -Section 44.32: {term} default: from environment variable TERM - -The terminal type of the output device. - -Section 44.33: {terse} default: noterse - -Shorter error diagnostics are produced for the experienced user. - -Section 44.34: {timeout} default: timeout - -Causes macros to time out after one second. Turn it off and they will -wait forever. This is useful if you want multi-character macros, but if -your terminal sends escape sequences for arrow keys, it will be -necessary to hit escape twice to get a beep. - -[Editor's note: Another paragraph which requires a cryptographer.] - -Section 44.35: ttytype - -[Editor's note: I have found no documentation for this option at all.] - -Section 44.36: {warn} default: warn - -Warn if there has been `[No write since last change]' before a `!' command -escape. - -Section 44.37: {window} default: window=speed dependent - -The number of lines in a text window in the visual command. The default is 8 -at slow speeds (600 baud or less), 16 at medium speed (1200 baud), and the full -screen (minus one line) at higher speeds. - -Section 44.38: {wrapscan}, {ws} default: ws - -Searches using the regular expressions in addressing will wrap around past the -end of the file. - -Section 44.39: {wrapmargin}, {wm} default: wm=0 - -Defines a margin for automatic wrapover of text during input in open and visual -modes. The numeric value is the number of columns from the right edge of the -screen around which vi looks for a convenient place to insert a new-line -character (wm=0 is OFF). This is very convenient for touch typists. -Wrapmargin behaves much like fill/nojustify mode does in nroff. - -Section 44.40: {writeany}, {wa} default: nowa - -Inhibit the checks normally made before write commands, allowing a write to any -file which the system protection mechanism will allow. - -Section 44.41: {w300}, {w1200}, {w9600} defaults: w300=8 - w1200=16 - w9600=full screen minus one - -These are not true options but set the default size of the window for when the -speed is slow (300), medium (1200), or high (9600), respectively. They are -suitable for an EXINIT and make it easy to change the 8/16/full screen rule. - -Section 45: Limitations - -Here are some editor limits that the user is likely to encounter: - 1024 characters per line - 256 characters per global command list - 128 characters per file name - 128 characters in the previous inserted and deleted text in open or - visual - 100 characters in a shell escape command - 63 characters in a string valued option - 30 characters in a tag name - 250000 lines in the file (this is silently enforced). - -The visual implementation limits the number of macros defined with map to 32, -and the total number of characters in macros to be less than 512. - -[Editor's note: these limits may not apply to versions after 4.1BSD.] diff --git a/docs/tutorial/vi.beginner b/docs/tutorial/vi.beginner deleted file mode 100644 index 3bf35ac939f8..000000000000 --- a/docs/tutorial/vi.beginner +++ /dev/null @@ -1,741 +0,0 @@ -Section 1: {^F} {ZZ} - -To get out of this tutorial, type: ZZ (two capital Z's). - -Learning a new computer system implies learning a new text editor. These -tutorial lessons were created by Dain Samples to help you come to grips with -UC Berkeley's screen oriented editor called vi (for VIsual). This tutorial -uses the vi editor itself as the means of presentation. - -For best use of this tutorial, read all of a screen before performing any of -the indicated actions. This tutorial (or, at least, the first half of it) has -been designed to systematically present the vi commands IF THE INSTRUCTIONS -ARE FOLLOWED! If you are too adventuresome, you may find yourself lost. If -you ever find yourself stuck, remember the first line of this section. - -OK, now find the control key on your keyboard; it usually has CTL or CTRL -written on its upper surface. Your first assignment is to hold the control -key down while you press the 'F' key on your keyboard. Please do so now. - - - -Section 2: {^F} {^B} -Many of vi's commands use the control key and some other key in combination, -as with the control and the 'F' key above. This is abbreviated CTL-F, or ^F. - -As you have probably guessed by now, ^F (CTL-F) moves you forward a fixed -number of lines in the file. Throughout the remainder of the tutorial when -you are ready to advance to the next section of text, hit ^F. - -The opposite command is ^B. Just for fun, you might want to try a ^B to see -the previous section again. Be sure to do a ^F to return you here. - -Determine what the cursor looks like on your screen. Whatever it is (a box, -an underscore, blinking, flashing, inverse, etc.) it should now be positioned -in the upper left-hand corner of your screen under or on the S of Section. -Become familiar with your cursor: to use vi correctly it is important to -always know where the cursor is. - -Did you notice that when you do a ^F the cursor is left at the top of the -screen, and a ^B leaves the cursor near the bottom of the screen? Try the two -commands ^B^F again. And now do another ^F to see the next section. - -Section 3: {^F} {^B} -You now have two basic commands for examining a file, both forwards (^F) and -backwards (^B). - -Note that these are vi text editing commands: they are not commands for the -tutorial. Indeed, this tutorial is nothing but a text file which you are now -editing. Everything you do and learn in this tutorial will be applicable to -editing text files. - -Therefore, when you are editing a file and are ready to see more of the text, -entering ^F will get you to the next section of the file. Entering ^B will -show you the previous section. - -Time for you to do another ^F. - - - - - - - -Section 4: {^F} {^B} {^M} (return key) -We will adopt the notation of putting commands in curly braces so we can write -them unambiguously. For example, if you are to type the command sequence -"control B control F" (as we asked you to do above) it would appear as {^B^F}. -This allows clear delineation of the command strings from the text. Remember -that the curly braces are NOT part of the command string you are to type. Do -NOT type the curly braces. - -Sometimes, the command string in the curly braces will be rather long, and may -be such that the first couple of characters of the command will erase from -the screen the string you are trying to read and type. It is suggested that -you write down the longer commands BEFORE you type them so you won't forget -them once they disappear. - -Now locate the return key on your keyboard: it is usually marked 'RETURN', -indicate hitting the return key. In fact, the control-M key sequence is -exactly the same as if you hit the return key, and vice versa. - -Now type {^F}. - - -Section 5: {:q!} {ZZ} {^M} (return key) -Recognize that this tutorial is nothing more than a text file that you -are editing. This means that if you do something wrong, it is possible -for you to destroy the information in this file. Don't worry. If this -happens, type {ZZ} (two capital Z's) or {:q!^M} to leave the tutorial. -Restart the tutorial. Once in the tutorial, you can then page forward -with {^F} until you are back to where you want to be. (There are -easier ways to do this, some of which will be discussed later, but this -is the most straightforward.) - -You may want to write these commands down in a convenient place for quick -reference: {:q!^M} and {ZZ} - -We will assume that you now know to do a {^F} to advance the file - - - - - - - -Section 6: {m} {G} {'} {z} -Now that you know how to get around in the file via ^F and ^B let's look at -other ways of examining a text file. Sometimes it is necessary, in the midst -of editing a file, to examine another part of the file. You are then faced -with the problem of remembering your place in the file, looking at the other -text, and then getting back to your original location. Vi has a 'mark' -command, m. Type {mp}. You have just 'marked' your current location in the -file and given it the name 'p'. The command string below will do three -things: position you at the beginning of the file (line 1), then return you to -the location 'p' that you just marked with the 'm' command, and, since the -screen will not look exactly the same as it does right now, the 'z' command -will reposition the screen. (You may want to write the string down before -typing it: once you type {1G} it will no longer be on the screen.) - -So now type {1G'pz^M} - a one followed by a capital G, followed by the quote -mark, followed by a lower case 'p', then a lower case 'z', then a return -(which is the same as a ^M). The {1G} moves you to line 1, i.e. the beginning -of the file. The {'p} moves you to the location you marked with {mp}. The -{z^M} command will repaint the screen putting the cursor at the top of the -screen. (Now {^F}.) - -Section 7: {m} {G} {'} {z} -Let's look at some variations on those commands. If you wanted to look at -line 22 in the file and return to this location you could type {mp22G'p}. Do -so now, observing that {22G} puts your cursor at the beginning of section 2 in -the middle of the screen. - -Also note that, without the {z^M} command, the line with 'Section 7' on it is -now in the MIDDLE of the screen, and not at the top. Our cursor is on the -correct line (where we did the {mp} command) but the line is not where we -might like it to be on the screen. That is the function of the {z^M} command. -(Remember, ^M is the same as the 'return' key on your keyboard.) Type {z^M} -now and observe the effect. - -As you can see, the 'Section 7' line is now at the top of the screen with the -cursor happily under the capital S. If you would like the cursor line (i.e. -the line which the cursor is on) in the middle of the screen again, you would -type {z.}. If you wanted the cursor line to be at the BOTTOM of the screen, -type {z-}. Try typing {z-z.z^M} and watch what happens. - -{^F} - -Section 8: {z} {m} {'} - -Note that the z command does not change the position of our cursor in the file -itself, it simply moves the cursor around on the screen by moving the contents -of the file around on the screen. The cursor stays on the same line of the -file when using the z command. - -This brings up an important point. There are two questions that the users of -vi continually need to know the answer to: "Where am I in the file?" and -"Where am I on the screen?" The cursor on your terminal shows the answer to -both questions. Some commands will move you around in the file, usually -changing the location of the cursor on the screen as well. Other commands -move the cursor around on the screen without changing your location in the -file. - -Now type {ma}. Your location in the file has been given the name 'a'. If you -type {'p'a} you will see the previous location we marked in section 7, and -then will be returned to the current location. (You will want to do a {z^M} -to repaint the screen afterwards.) Try it. -{^F} - -Section 9: {m} {''} -Now we can move about in our file pretty freely. By using the {m} command we -can give the current cursor position a lower-case-character name, like 'p', -'a', 'e', 'm', or 'b'. Using the {G} command preceded by a line number we can -look at any line in the file we like. Using the single quote command {'} -followed by a character used in an {m} command, we can return to any location -in the file we have marked. - -However, try {m3}, or {mM}. You should hear a beep, or bell. Only lower-case -letters are acceptable to the {m} and {'} commands: numbers, upper-case -letters, and special characters are not acceptable. - -If you type the {'} command with a character that is lower-case alphabetic but -that has not been used in an {m} command, or for which the 'marked' text has -been deleted, you will also get a beep. Try {'i}. You should get a beep -because the command {mi} has never been issued. (Unless you've been -experimenting.) - -The command {''} attempts to return you to the location at which you last -modified some part of your file. However, my experience has been that it is -difficult to predict exactly where you will end up. -Section 10: {^M} {-} -Now do {ma}, marking your position at the top of the screen. Now hit {^M} (or -return) until the cursor is right ... -* <- here, over/under the asterisk. Now -type {mb'a'b} and watch the cursor move from the asterisk to the top of the -screen and back again. - -The {^M} command moves the cursor to the beginning of the next line. Now type -{^M} until the cursor is right ... -* <- here. The command to move the cursor to the beginning of the -previous line is {-}. Practice moving the cursor around on the screen by using -{^M} and {-}. BE CAREFUL to not move the cursor OFF the screen just yet. If -you do, type {'az^M}. - -Now we can move to any line within the screen. Practice moving around in the -file using the {^F}, {^B}, {-}, {^M}, {z}, and {'} commands. When you are -fairly confident that you can get to where you need to be in the file, and -position the cursor on the screen where you want it type {'az^M^F} (which, of -course, moves you back to the beginning of this section, repositions the -cursor at the top of the screen, and advances you to the next section). - -Section 11: scrolling: {^M} -The cursor should now be on the S of 'Section 11', and this should be on the -first line of the screen. If it is not, do {^M} or {-} as appropriate to put -the cursor on the section line, and type {z^M}. - -Type {mc} to mark your place. - -Now type {^M} until the cursor is on the last line of this screen. Now do one -more {^M} and observe the result. This is called scrolling. When you -attempted to move to a line not displayed on the screen, the line at the top of -the screen was 'scrolled off', and a line at the bottom of the screen was -'scrolled on'. The top line with 'Section 11' should no longer be visible. - -Now type {'cz^M} to reset the screen and type {^F} for the next section. - - - - - - - -Section 12: {-} {z} - -The {-} command moves the cursor to the previous line in the file. Now type -{-}, which attempts to move the cursor to the previous line in this file. -However, that line is not on the screen. The resulting action will depend on -your terminal. (Do a {^Mz^M} to reposition the file). On intelligent -terminals (e.g. VT100s, Z19s, Concept 100s), a top line is 'scrolled on' and -the bottom line is 'scrolled off'. Other terminals, however, may not have -this 'reverse scrolling' feature. They will simply repaint the screen with -the cursor line in the middle of the screen. On such terminals it is -necessary to type {z^M} to get the cursor line back to the top of the screen. - - - - - - - - - - -Section 13: -Up until this point, the tutorial has always tried to make sure that the first -line of each screen has on it the section number and a list of the commands -covered in that section. This will no longer be strictly maintained. If you -want the section line at the top of the screen, you now know enough commands to -do it easily: do {^M} or {-} until the cursor is on the section line and -then {z^M}. Also, from this point on, it may not be the case that a {^F} will -put you at the beginning of the next section. Therefore, be aware of where you -are in the file as we look at other commands. You may have to find your way -back to a particular section without any help from the tutorial. If you do not -feel comfortable with this, then it is suggested that you practice moving from -section 1 to section 13, back and forth, using {^M}, {-}, {^F}, and {^B} -commands for a while. - -Also make liberal use of the mark command {m}: if, for example, you make a -habit of using {mz} to mark your current location in the file, then you will -always be able to return to that location with {'z} if the editor does -something strange and you have no idea where you are or what happened. - -And finally, the proscription against experimentation is hereby lifted: play -with the editor. Feel free to try out variations on the commands and move -around in the file. By this time you should be able to recover from any gross -errors. - -Section 14: {^E} {^Y} {^D} {^U} -Let us now look at a few other commands for moving around in the file, and -moving the file around on the screen. Note that the commands we have already -looked at are sufficient: you really don't need any more commands for looking -in a file. The following commands are not absolutely necessary. However, -they can make editing more convenient, and you should take note of their -existence. But it would be perfectly valid to decide to ignore them on this -first pass: you can learn them later when you see a need for them, if you ever -do. - -First, let's clear up some potentially confusing language. In at least one -place in the official document ('An Introduction to Display Editing with Vi' -by William Joy, and Mark Horton, September 1980), the expression "to scroll -down text" means that the cursor is moved down in your file. However, note -that this may result in the text on the screen moving UP. This use of the -word 'scroll' refers to the action of the cursor within the file. However, -another legitimate use of the word refers to the action of the text on the -screen. That is, if the lines on your screen move up toward the top of the -screen, this would be 'scrolling the screen up'. If the lines move down -toward the bottom of the screen, this would be refered to as scrolling down. - -I have tried to maintain the following jargon: 'scrolling' refers to what the -text does on the screen, not to what the cursor does within the file. For the -latter I will refer to the cursor 'moving', or to 'moving the cursor'. I -realize that this is not necessarily consistent with Joy and Horton, but they -were wrong. - -{^E} scrolls the whole screen up one line, keeping the cursor on the same line, -if possible. However, if the cursor line is the first line on the screen, then -the cursor is moved to the next line in the file. Try typing {^E}. - -{^Y} scrolls the screen down one line, keeping the cursor on the same line, if -possible. However, if the cursor line is the last line on the screen, then the -cursor is moved to the previous line in the file. Try it. - -{^D} moves the cursor down into the file, scrolling the screen up. - -{^U} moves the cursor up into the file, also scrolling the screen if the -terminal you are on has the reverse scroll capability. Otherwise the -screen is repainted. - -Note that {^E} and {^Y} move the cursor on the screen while trying to keep the -cursor at the same place in the file (if possible: however, the cursor can -never move off screen), while {^D} and {^U} keep the cursor at the same place -on the screen while moving the cursor within the file. - -Section 15: {/ .. /^M} - -Another way to position yourself in the file is by giving the editor a string -to search for. Type the following: {/Here 1/^M} and the cursor should end up -right ...........................here ^. Now type {/Section 15:/^M} and the -cursor will end up over/on .....................here ^. Now type {//^M} and -observe that the cursor is now over the capital S five lines above this line. -Typing {//^M} several more times will bounce the cursor back and forth between -the two occurrences of the string. In other words, when you type a string -between the two slashes, it is searched for. Typing the slashes with nothing -between them acts as if you had typed the previous string again. - -Observe that the string you type between the two slashes is entered on the -bottom line of the screen. Now type {/Search for x /^M} except replace the 'x' -in the string with some other character, say 'b'. The message "Pattern not -found" should appear on the bottom of the screen. If you hadn't replaced the -'x', then you would have found the string. Try it. - -Section 16: {? .. ?^M} {n} (search strings: ^ $) - -When you surround the sought-for string with slashes as in {/Search/}, the -file is searched beginning from your current position in the file. If the -string is not found by the end of the file, searching is restarted at the -beginning of the file. However, if you do want the search to find the -PREVIOUS rather than the NEXT occurrence of the string, surround the string -with question marks instead of slash marks. - -Below are several occurrences of the same string. -Here 2 Here 2 Here 2 - Here 2 Here 2. -Observe the effect of the following search commands (try them in the -sequence shown): -{/Here 2/^M} {//^M} {??^M} -{/^Here 2/^M} {//^M} {??^M} -{/Here 2$/^M} {//^M} {??^M} - -The first command looks for the next occurrence of the string 'Here 2'. -However the second line of commands looks for an occurrence of 'Here 2' that -is at the beginning of the line. When the up-arrow is the first character of -a search string it stands for the beginning of the line. When the dollar-sign -is the last character of the search string it stands for the end of the line. -Therefore, the third line of commands searches for the string only when it is -at the end of the line. Since there is only one place the string begins a -line, and only one place the string ends the line, subsequent {//^M} and -{??^M} will find those same strings over and over. - -The {n} command will find the next occurrence of the / or ? search -string. Try {/Here 2/^M} followed by several {n} and observe the -effect. Then try {??^M} followed by several {n}. The {n} command -remembers the direction of the last search. It is just a way to save a -few keystrokes. - -Section 17: \ and magic-characters in search strings - -Now type {/Here 3$/^M}. You might expect the cursor to end up -right......^ here. However, you will get "Pattern not found" at the bottom of -the screen. Remember that the dollar-sign stands for the end of the line. -Somehow, you must tell vi that you do not want the end of the line, but a -dollar-sign. In other words, you must take away the special meaning that the -dollar-sign has for the search mechanism. You do this (for any special -character, including the up-arrow ^) by putting a back-slash ('\', not '/') in -front of the character. - -Now try {/Here 3\$/^M} and you should end up nine lines above this one. Try -{//^M} and note that it returns you to the same place, and not to the first -line of this paragraph: the back-slash character is not part of the search -string and will not be found. To find the string in the first line of this -paragraph, type {/Here 3\\\$/^M}. There are three back-slashes: the first takes -away the special meaning from the second, and the third takes away the special -meaning from the dollar-sign. - -Following is a list of the characters that have special meanings in search -strings. If you wish to find a string containing one of these characters, you -will have to be precede the character with a backslash. These characters are -called magic characters because of the fun and games you can have with them -and they can have with you, if you aren't aware of what they do. - - ^ - (up-arrow) beginning of a line - $ - (dollar-sign) end of a line - . - (period) matches any character - \ - (backslant) the escape character itself - [ - (square bracket) for finding patterns (see section #SEARCH) - ] - (square bracket) ditto - * - (asterisk) ditto - -Without trying to explain it here, note that {:set nomagic^M} turns off the -special meanings of all but the ^ up-arrow, $ dollar-sign, and backslash -characters. - -Section 18: {: (colon commands)} {ZZ} - -In this section we will discuss getting into and out of the editor in more -detail. If you are editing a file and wish to save the results the command -sequence {:w^M} writes the current contents of the file out to disk, using the -file name you used when you invoked the editor. That is, if you are at the -command level in Unix, and you invoke vi with {vi foo} where foo is the name -of the file you wish to edit, then foo is the name of the file used by the -{:w^M} command. - -If you are done, the write and quit commands can be combined into a single -command {:wq^M}. An even simpler way is the command {ZZ} (two capital Z's). - -If, for some reason, you wish to exit without saving any changes you have made, -{:q!^M} does the trick. If you have not made any changes, the exclamation -point is not necessary: {:q^M}. Vi is pretty good about not letting you -get out without warning you that you haven't saved your file. - -We have mentioned before that you are currently in the vi editor, editing a -file. If you wish to start the tutorial over from the very beginning, you -could {ZZ}, and then type {vi.tut beginner} in response to the Unix prompt. -This will create a fresh copy of this file for you, which might be necessary -if you accidentally destroyed the copy you were working with. Just do a -search for the last section you were in: e.g. {/Section 18:/^Mz^M}. - -Section 19: {H} {M} {L} - -Here are a few more commands that will move you around on the screen. Again, -they are not absolutely necessary, but they can make screen positioning easier: - -{H} - puts the cursor at the top of the screen (the 'home' position) - -{M} - puts the cursor in the middle of the screen - -{L} - puts the cursor at the bottom of the screen. - -Try typing {HML} and watch the cursor. - -Try typing {5HM5L} and note that 5H puts you five lines from the top of the -screen, and 5L puts you five lines from the bottom of the screen. - -Section 20: {w} {b} {0} {W} {B} {e} {E} {'} {`} - -Up to this point we have concentrated on positioning in the file, and -positioning on the screen. Now let's look at positioning in a line. Put the -cursor at the beginning of the following line and type {z^M}: - -This is a test line: your cursor should initially be at its beginning. - -The test line should now be at the top of your screen. Type {w} several times. -Note that it moves you forward to the beginning of the next word. Now type -{b} (back to the beginning of the word) several times till you are at the -beginning of the line. (If you accidentally type too many {b}, type {w} until -you are on the beginning of the line again.) Type {wwwww} (five w's) and note -that the cursor is now on the colon in the sentence. The lower-case w command -moves you forward one word, paying attention to certain characters such as -colon and period as delimiters and counting them as words themselves. Now -type {0} (zero, not o 'oh'): this moves you to the beginning of the current -line. Now type {5w} and notice that this has the effect of repeating {w} five -times and that you are now back on the colon. Type {0} (zero) again. To -ignore the delimiters and to move to the beginning of the next word using only -blanks, tabs and carriage-returns (these are called white-space characters) to -delimit the words, use the {W} command: upper-case W. {B} takes you back a -word using white-space characters as word delimiters. - -Note that the commands {wbWB} do not stop at the beginning or end of a line: -they will continue to the next word on the next line in the direction specified -(a blank line counts as a word). - -If you are interested in the END of the word, and not the BEGINNING, then use -the {e} and {E} commands. These commands only move forward and there are no -corresponding 'reverse search' commands for the end of a word. - -Also, we have been using the {'} command to move the cursor to a position that -we have previously marked with the {m} command. However, position the cursor -in the middle of a line (any line, just pick one) and type {mk}, marking that -position with the letter k. Now type a few returns {^M} and type {'k}. -Observe that the cursor is now at the beginning of the line that you marked. -Now try {`k}: note that this is the reverse apostrophe, or back-quote, or grave -accent, or whatever you want to call it. Also note that it moves you to the -character that was marked, not just to the line that was marked. - -In addition, the {``} command works just like the {''} command except that you -are taken to the exact character, not just to the line. (I'm still not -sure which exact character, just as I'm still not sure which line.) - -Section 21: {l} {k} {j} {h} - -There are several commands to move around on the screen on a character by -character basis: - -l - moves the cursor one character to the RIGHT -k - moves the cursor UP one line -j - moves the cursor DOWN one line -h - moves the cursor one character to the LEFT - -Section 22: {i} {a} {I} {A} {o} {O} ^[ (escape key) - -For this and following sections you will need to use the ESCAPE key on your -terminal. It is usually marked ESC. Since the escape key is the same as -typing {^[} we will use ^[ for the escape key. - -Probably the most often used command in an editor is the insert command. Below -are two lines of text, the first correct, the second incorrect. Position your -cursor at the beginning of Line 1 and type {z^M}. - -Line 1: This is an example of the insert command. -Line 2: This is an of the insert command. - -To make line 2 look like line 1, we are going to insert the characters -'example ' before the word 'of'. So, now move the cursor so that it is -positioned on the 'o' of 'of'. (You can do this by typing {^M} to move -to the beginning of line 2, followed by {6w} or {wwwwww} to position the cursor -on the word 'of'.) - -Now carefully type the following string and observe the effects: - {iexample ^[} (remember: ^[ is the escape key)} -The {i} begins the insert mode, and 'example ' is inserted into the line: -be sure to notice the blank in 'example '. The ^[ ends insertion mode, -and the line is updated to include the new string. Line 1 should look exactly -like Line 2. - -Move the cursor to the beginning of Line 3 below and type {z^M}: - -Line 3: These lines are examples for the 'a' command. -Line 4: These line are examples for the ' - -We will change line four to look like line three by using the append command. -We need to append an 's' to the word 'line'. Position the cursor on the 'e' -of 'line'. You can do this in several ways, one way is the following: -First, type {/line /^M}. This puts us on the word 'line' in Line 4 -(the blank in the search string is important!). Next, type {e}. The 'e' puts -us at the end of the word. Now, type {as^[ (^[ is the escape character)}. -The 'a' puts us in insert mode, AFTER the current character. We appended the -'s', and the escape ^[ ended the insert mode. - -The difference between {i} (insert) and {a} (append) is that {i} begins -inserting text BEFORE the cursor, and {a} begins inserting AFTER the cursor. - -Now type {Aa' command.^[}. The cursor is moved to the end of the line and the -string following {A} is inserted into the text. Line 4 should now look like -line 3. - -Just as {A} moves you to the end of the line to begin inserting, {I} would -begin inserting at the FRONT of the line. - -To begin the insertion of a line after the cursor line, type {o}. To insert a -line before the cursor line, type {O}. In other words {o123^[} is equivalent -to {A^M123^[}, and {O123^[} is equivalent to {I123^M^[}. The text after the -{o} or {O} is ended with an escape ^[. - -This paragraph contains information that is terminal dependent: you will just -have to experiment to discover what your terminal does. Once in the insert -mode, if you make a mistake in the typing, ^H will delete the previous -character up to the beginning of the current insertion. ^W will delete the -previous word, and one of ^U, @, or ^X will delete the current line (up to the -beginning of the current insertion). You will need to experiment with ^U, @, -and ^X to determine which works for your terminal. - -Section 23: {f} {x} {X} {w} {l} {r} {R} {s} {S} {J} - -Position the cursor at the beginning of line 5 and {z^M}: - -Line 5: The line as it should be. -Line 6: The line as it shouldn't be. - -To make Line 6 like Line 5, we have to delete the 'n', the apostrophe, and the -'t'. There are several ways to position ourselves at the 'n'. Choose -whichever one suits your fancy: - -{/n't/^M} -{^M7w6l} or {^M7w6 } (note the space) -{^M3fn} (finds the 3rd 'n' on the line) - -Now {xxx} will delete the three characters, as will {3x}. - -Note that {X} deletes the character just BEFORE the cursor, as opposed -to the character AT the cursor. - -Position the cursor at line 7 and {z^M}: - -Line 7: The line as it would be. -Line 8: The line as it could be. - -To change line 8 into line 7 we need to change the 'c' in 'could' into a 'w'. -The 'r' (replace) command was designed for this. Typing {rc} is the same as -typing {xic^[} (i.e. delete the 'bad' character and insert the correct -new character). Therefore, assuming that you have positioned the cursor on the -'c' of 'could', the easiest way to change 'could' into 'would' is {rw}. - -If you would like to now change the 'would' into 'should', use the substitute -command, 's': {ssh^[}. The difference between 'r' and 's' is that 'r' -(replace) replaces the current character with another character, while 's' -(substitute) substitutes the current character with a string, ended with an -escape. - -The capital letter version of replace {R} replaces each character by a -character one at a time until you type an escape, ^[. The 'S' command -substitutes the whole line. - -Position your cursor at the beginning of line 9 and {z^M}. - -Line 9: Love is a many splendored thing. -Line 10: Love is a most splendored thing. - -To change line 10 into line 9, position the cursor at the beginning of 'most', -and type {Rmany^[}. - -You may have noticed that, when inserting text, a new line is formed by typing -{^M}. When changing, replacing, or substituting text you can make a new line -by typing {^M}. However, neither {x} nor {X} will remove ^M to make two lines -into one line. To do this, position the cursor on the first of the two lines -you wish to make into a single line and type {J} (uppercase J for 'Join'). - -Section 24: {u} {U} - -Finally, before we review, let's look at the undo command. Position -your cursor on line 11 below and {z^M}. - -Line 11: The quick brown fox jumped over the lazy hound dog. -Line 12: the qwick black dog dumped over the laxy poune fox. - -Type the following set of commands, and observe carefully the effect of each -of the commands: - -{/^Line 12:/^M} {ft} {rT} {fw} {ru} {w} {Rbrown fox^[} {w} {rj} -{fx} {rz} {w} {Rhound dog^[} - -Line 12 now matches line 11. Now type {U} - capital 'U'. And line 12 now -looks like it did before you typed in the command strings. Now type: - -{ft} {rT} {fw} {ru} {^M} {^M} - -and then type {u}: the cursor jumps back to the line containing the second -change you made and 'undoes' it. That is, {U} 'undoes' all the changes on the -line, and {u} 'undoes' only the last change. Type {u} several times and -observe what happens: {u} can undo a previous {u}! - -Caveat: {U} only works as long as the cursor is still on the line. Move the -cursor off the line and {U} will have no effect, except to possibly beep at -you. However, {u} will undo the last change, no matter where it occurred. - -Section 25: review - -At this point, you have all the commands you need in order to make use of vi. -The remainder of this tutorial will discuss variations on these commands as -well as introduce new commands that make the job of editing more efficient. -Here is a brief review of the basic commands we have covered. They are listed -in the order of increasing complexity and/or decreasing necessity (to say that -a command is less necessary is not to say that it is less useful!). These -commands allow you to comfortably edit any text file. There are other -commands that will make life easier but will require extra time to learn, -obviously. You may want to consider setting this tutorial aside for several -weeks and returning to it later after gaining experience with vi and getting -comfortable with it. The convenience of some of the more exotic commands may -then be apparent and worth the extra investment of time and effort -required to master them. - -to get into the editor from Unix: {vi filename} -to exit the editor - saving all changes {ZZ} or {:wq^M} - throwing away all changes {:q!^M} - when no changes have been made {:q^M} -save a file without exiting the editor {:w^M} -write the file into another file {:w filename^M} -insert text - before the cursor {i ...text... ^[} - at the beginning of the line {I ...text... ^[} - after the cursor (append) {a ...text... ^[} - at the end of the line {A ...text... ^[} - after the current line {o ...text... ^[} - before the current line {O ...text... ^[} -delete the character ... - under the cursor {x} - to the left of the cursor {X} -delete n characters {nx} or {nX} (for n a number) -make two lines into one line (Join) {J} -find a string in the file ... - searching forward {/ ...string... /^M} - searching backwards {? ...string... ?^M} -repeat the last search command {n} -repeat the last search command in the - opposite direction {N} -find the character c on this line ... - searching forward {fc} - searching backward {Fc} -repeat the last 'find character' command {;} -replace a character with character x {rx} -substitute a single character with text {s ...text... ^[} -substitute n characters with text {ns ...text... ^[} -replace characters one-by-one with text {R ...text... ^[} -undo all changes to the current line {U} -undo the last single change {u} -move forward in the file a "screenful" {^F} -move back in the file a "screenful" {^B} -move forward in the file one line {^M} or {+} -move backward in the file one line {-} -move to the beginning of the line {0} -move to the end of the line {$} -move forward one word {w} -move forward one word, ignoring punctuation {W} -move forward to the end of the next word {e} -to the end of the word, ignoring punctuation{E} -move backward one word {b} -move back one word, ignoring punctuation {B} -return to the last line modified {''} -scroll a line onto the top of the screen {^Y} -scroll a line onto the bottom of the screen {^E} -move "up" in the file a half-screen {^U} -move "down" in the file a half-screen {^D} -move the cursor to the top screen line {H} -move the cursor to the bottom screen line {L} -move the cursor to the middle line {M} -move LEFT one character position {h} or {^H} -move RIGHT one character position {l} or { } -move UP in the same column {k} or {^P} -move DOWN in the same column {j} or {^N} -mark the current position, name it x {mx} -move to the line marked/named x {'x} -move to the character position named x {`x} -move to the beginning of the file {1G} -move to the end of the file {G} -move to line 23 in the file {23G} -repaint the screen with the cursor line - at the top of the screen {z^M} - in the middle of the screen {z.} - at the bottom of the screen {z-} - -More information on vi can be found in the file vi.advanced, which you can -peruse at your leisure. From UNIX, type {vi.tut advanced^M}. diff --git a/docs/tutorial/vi.tut.csh b/docs/tutorial/vi.tut.csh deleted file mode 100755 index 01554bc4e5fd..000000000000 --- a/docs/tutorial/vi.tut.csh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/csh -f -# -# This makes the user's EXINIT variable set to the 'correct' things. -# I don't know what will happen if they also have a .exrc file! -# -# XXX -# Make sure that user is using a 24 line window!!! -# -if ($1 != "beginner" && $1 != "advanced") then - echo Usage: $0 beginner or $0 advanced - exit -endif - -if ($?EXINIT) then - set oexinit="$EXINIT" - setenv EXINIT 'se ts=4 wm=8 sw=4' -endif - -vi vi.{$1} - -onintr: - if ($?oexinit) then - setenv EXINIT "$oexinit" -endif diff --git a/ex/ex.c b/ex/ex.c index 609f961bbe46..00df2cc65f80 100644 --- a/ex/ex.c +++ b/ex/ex.c @@ -31,20 +31,20 @@ static const char sccsid[] = "$Id: ex.c,v 10.80 2012/10/03 16:24:40 zy Exp $"; #include "../vi/vi.h" #if defined(DEBUG) && defined(COMLOG) -static void ex_comlog __P((SCR *, EXCMD *)); +static void ex_comlog(SCR *, EXCMD *); #endif static EXCMDLIST const * - ex_comm_search __P((CHAR_T *, size_t)); -static int ex_discard __P((SCR *)); -static int ex_line __P((SCR *, EXCMD *, MARK *, int *, int *)); -static int ex_load __P((SCR *)); -static void ex_unknown __P((SCR *, CHAR_T *, size_t)); + ex_comm_search(CHAR_T *, size_t); +static int ex_discard(SCR *); +static int ex_line(SCR *, EXCMD *, MARK *, int *, int *); +static int ex_load(SCR *); +static void ex_unknown(SCR *, CHAR_T *, size_t); /* * ex -- * Main ex loop. * - * PUBLIC: int ex __P((SCR **)); + * PUBLIC: int ex(SCR **); */ int ex(SCR **spp) @@ -187,7 +187,7 @@ ex(SCR **spp) * * For extra credit, try them in a startup .exrc file. * - * PUBLIC: int ex_cmd __P((SCR *)); + * PUBLIC: int ex_cmd(SCR *); */ int ex_cmd(SCR *sp) @@ -1616,7 +1616,7 @@ rsuccess: tmp = 0; * ex_range -- * Get a line range for ex commands, or perform a vi ex address search. * - * PUBLIC: int ex_range __P((SCR *, EXCMD *, int *)); + * PUBLIC: int ex_range(SCR *, EXCMD *, int *); */ int ex_range(SCR *sp, EXCMD *ecp, int *errp) @@ -1689,12 +1689,12 @@ ex_range(SCR *sp, EXCMD *ecp, int *errp) ++ecp->cp; --ecp->clen; break; - case ',': /* Comma delimiter. */ + case ',': /* Comma delimiter. */ /* Vi ex address searches didn't permit commas. */ if (F_ISSET(ecp, E_VISEARCH)) goto ret; /* FALLTHROUGH */ - case ';': /* Semi-colon delimiter. */ + case ';': /* Semi-colon delimiter. */ if (sp->ep == NULL) { ex_badaddr(sp, NULL, A_EMPTY, NUM_OK); *errp = 1; @@ -1825,7 +1825,7 @@ ex_line(SCR *sp, EXCMD *ecp, MARK *mp, int *isaddrp, int *errp) GS *gp; long total, val; int isneg; - int (*sf) __P((SCR *, MARK *, MARK *, CHAR_T *, size_t, CHAR_T **, u_int)); + int (*sf)(SCR *, MARK *, MARK *, CHAR_T *, size_t, CHAR_T **, u_int); CHAR_T *endp; gp = sp->gp; @@ -2219,7 +2219,7 @@ ex_unknown(SCR *sp, CHAR_T *cmd, size_t len) * [un]abbreviate command, so it can turn off abbreviations. See * the usual ranting in the vi/v_txt_ev.c:txt_abbrev() routine. * - * PUBLIC: int ex_is_abbrev __P((CHAR_T *, size_t)); + * PUBLIC: int ex_is_abbrev(CHAR_T *, size_t); */ int ex_is_abbrev(CHAR_T *name, size_t len) @@ -2236,7 +2236,7 @@ ex_is_abbrev(CHAR_T *name, size_t len) * unmap command, so it can turn off input mapping. See the usual * ranting in the vi/v_txt_ev.c:txt_unmap() routine. * - * PUBLIC: int ex_is_unmap __P((CHAR_T *, size_t)); + * PUBLIC: int ex_is_unmap(CHAR_T *, size_t); */ int ex_is_unmap(CHAR_T *name, size_t len) @@ -2279,7 +2279,7 @@ ex_comm_search(CHAR_T *name, size_t len) * Display a bad address message. * * PUBLIC: void ex_badaddr - * PUBLIC: __P((SCR *, EXCMDLIST const *, enum badaddr, enum nresult)); + * PUBLIC: (SCR *, EXCMDLIST const *, enum badaddr, enum nresult); */ void ex_badaddr(SCR *sp, const EXCMDLIST *cp, enum badaddr ba, enum nresult nret) diff --git a/ex/ex.h b/ex/ex.h index f5ba4c2311aa..4cb52ccb3545 100644 --- a/ex/ex.h +++ b/ex/ex.h @@ -13,7 +13,7 @@ typedef struct _excmdlist { /* Ex command table structure. */ CHAR_T *name; /* Command name, underlying function. */ - int (*fn) __P((SCR *, EXCMD *)); + int (*fn)(SCR *, EXCMD *); #define E_ADDR1 0x00000001 /* One address. */ #define E_ADDR2 0x00000002 /* Two addresses. */ @@ -222,7 +222,7 @@ typedef enum { /* Ex address error types. */ enum badaddr { A_COMBO, A_EMPTY, A_EOF, A_NOTSET, A_ZERO }; -/* Ex common tag error messages. */ +/* Ex common tag error messages. */ typedef enum { TAG_BADLNO, /* Tag line doesn't exist. */ TAG_EMPTY, /* Tags stack is empty. */ diff --git a/ex/ex_abbrev.c b/ex/ex_abbrev.c index 662488966717..5fd5735d1df8 100644 --- a/ex/ex_abbrev.c +++ b/ex/ex_abbrev.c @@ -31,7 +31,7 @@ static const char sccsid[] = "$Id: ex_abbrev.c,v 10.10 2001/12/16 18:18:54 skimo * ex_abbr -- :abbreviate [key replacement] * Create an abbreviation or display abbreviations. * - * PUBLIC: int ex_abbr __P((SCR *, EXCMD *)); + * PUBLIC: int ex_abbr(SCR *, EXCMD *); */ int ex_abbr(SCR *sp, EXCMD *cmdp) @@ -95,7 +95,7 @@ ex_abbr(SCR *sp, EXCMD *cmdp) * ex_unabbr -- :unabbreviate key * Delete an abbreviation. * - * PUBLIC: int ex_unabbr __P((SCR *, EXCMD *)); + * PUBLIC: int ex_unabbr(SCR *, EXCMD *); */ int ex_unabbr(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_append.c b/ex/ex_append.c index de224f82589d..d2d44e288912 100644 --- a/ex/ex_append.c +++ b/ex/ex_append.c @@ -27,14 +27,14 @@ static const char sccsid[] = "$Id: ex_append.c,v 10.34 2001/06/25 15:19:14 skimo enum which {APPEND, CHANGE, INSERT}; -static int ex_aci __P((SCR *, EXCMD *, enum which)); +static int ex_aci(SCR *, EXCMD *, enum which); /* * ex_append -- :[line] a[ppend][!] * Append one or more lines of new text after the specified line, * or the current line if no address is specified. * - * PUBLIC: int ex_append __P((SCR *, EXCMD *)); + * PUBLIC: int ex_append(SCR *, EXCMD *); */ int ex_append(SCR *sp, EXCMD *cmdp) @@ -46,7 +46,7 @@ ex_append(SCR *sp, EXCMD *cmdp) * ex_change -- :[line[,line]] c[hange][!] [count] * Change one or more lines to the input text. * - * PUBLIC: int ex_change __P((SCR *, EXCMD *)); + * PUBLIC: int ex_change(SCR *, EXCMD *); */ int ex_change(SCR *sp, EXCMD *cmdp) @@ -59,7 +59,7 @@ ex_change(SCR *sp, EXCMD *cmdp) * Insert one or more lines of new text before the specified line, * or the current line if no address is specified. * - * PUBLIC: int ex_insert __P((SCR *, EXCMD *)); + * PUBLIC: int ex_insert(SCR *, EXCMD *); */ int ex_insert(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_args.c b/ex/ex_args.c index 2105d2d057d0..37dfa88bd487 100644 --- a/ex/ex_args.c +++ b/ex/ex_args.c @@ -27,7 +27,7 @@ static const char sccsid[] = "$Id: ex_args.c,v 10.19 2011/12/16 16:18:10 zy Exp #include "../common/common.h" #include "../vi/vi.h" -static int ex_N_next __P((SCR *, EXCMD *)); +static int ex_N_next(SCR *, EXCMD *); /* * ex_next -- :next [+cmd] [files] @@ -39,7 +39,7 @@ static int ex_N_next __P((SCR *, EXCMD *)); * idea was that it ignored the force flag if the autowrite flag was * set. This implementation handles them all identically. * - * PUBLIC: int ex_next __P((SCR *, EXCMD *)); + * PUBLIC: int ex_next(SCR *, EXCMD *); */ int ex_next(SCR *sp, EXCMD *cmdp) @@ -171,7 +171,7 @@ ex_N_next(SCR *sp, EXCMD *cmdp) * ex_prev -- :prev * Edit the previous file. * - * PUBLIC: int ex_prev __P((SCR *, EXCMD *)); + * PUBLIC: int ex_prev(SCR *, EXCMD *); */ int ex_prev(SCR *sp, EXCMD *cmdp) @@ -220,7 +220,7 @@ ex_prev(SCR *sp, EXCMD *cmdp) * anyone noticing, but if they do, we'll have to put information into the SCR * structure so we can keep track of it. * - * PUBLIC: int ex_rew __P((SCR *, EXCMD *)); + * PUBLIC: int ex_rew(SCR *, EXCMD *); */ int ex_rew(SCR *sp, EXCMD *cmdp) @@ -258,7 +258,7 @@ ex_rew(SCR *sp, EXCMD *cmdp) * ex_args -- :args * Display the list of files. * - * PUBLIC: int ex_args __P((SCR *, EXCMD *)); + * PUBLIC: int ex_args(SCR *, EXCMD *); */ int ex_args(SCR *sp, EXCMD *cmdp) @@ -299,7 +299,7 @@ ex_args(SCR *sp, EXCMD *cmdp) * ex_buildargv -- * Build a new file argument list. * - * PUBLIC: char **ex_buildargv __P((SCR *, EXCMD *, char *)); + * PUBLIC: char **ex_buildargv(SCR *, EXCMD *, char *); */ char ** ex_buildargv(SCR *sp, EXCMD *cmdp, char *name) diff --git a/ex/ex_argv.c b/ex/ex_argv.c index b3e3edf1a7e9..2d121cb5e560 100644 --- a/ex/ex_argv.c +++ b/ex/ex_argv.c @@ -30,18 +30,18 @@ static const char sccsid[] = "$Id: ex_argv.c,v 11.2 2012/10/09 23:00:29 zy Exp $ #include "../common/common.h" -static int argv_alloc __P((SCR *, size_t)); -static int argv_comp __P((const void *, const void *)); -static int argv_fexp __P((SCR *, EXCMD *, - CHAR_T *, size_t, CHAR_T *, size_t *, CHAR_T **, size_t *, int)); -static int argv_sexp __P((SCR *, CHAR_T **, size_t *, size_t *)); -static int argv_flt_user __P((SCR *, EXCMD *, CHAR_T *, size_t)); +static int argv_alloc(SCR *, size_t); +static int argv_comp(const void *, const void *); +static int argv_fexp(SCR *, EXCMD *, + CHAR_T *, size_t, CHAR_T *, size_t *, CHAR_T **, size_t *, int); +static int argv_sexp(SCR *, CHAR_T **, size_t *, size_t *); +static int argv_flt_user(SCR *, EXCMD *, CHAR_T *, size_t); /* * argv_init -- * Build a prototype arguments list. * - * PUBLIC: int argv_init __P((SCR *, EXCMD *)); + * PUBLIC: int argv_init(SCR *, EXCMD *); */ int argv_init(SCR *sp, EXCMD *excp) @@ -61,7 +61,7 @@ argv_init(SCR *sp, EXCMD *excp) * argv_exp0 -- * Append a string to the argument list. * - * PUBLIC: int argv_exp0 __P((SCR *, EXCMD *, CHAR_T *, size_t)); + * PUBLIC: int argv_exp0(SCR *, EXCMD *, CHAR_T *, size_t); */ int argv_exp0(SCR *sp, EXCMD *excp, CHAR_T *cmd, size_t cmdlen) @@ -84,7 +84,7 @@ argv_exp0(SCR *sp, EXCMD *excp, CHAR_T *cmd, size_t cmdlen) * Do file name expansion on a string, and append it to the * argument list. * - * PUBLIC: int argv_exp1 __P((SCR *, EXCMD *, CHAR_T *, size_t, int)); + * PUBLIC: int argv_exp1(SCR *, EXCMD *, CHAR_T *, size_t, int); */ int argv_exp1(SCR *sp, EXCMD *excp, CHAR_T *cmd, size_t cmdlen, int is_bang) @@ -123,7 +123,7 @@ ret: FREE_SPACEW(sp, bp, blen); * Do file name and shell expansion on a string, and append it to * the argument list. * - * PUBLIC: int argv_exp2 __P((SCR *, EXCMD *, CHAR_T *, size_t)); + * PUBLIC: int argv_exp2(SCR *, EXCMD *, CHAR_T *, size_t); */ int argv_exp2(SCR *sp, EXCMD *excp, CHAR_T *cmd, size_t cmdlen) @@ -209,7 +209,7 @@ err: FREE_SPACEW(sp, bp, blen); * Take a string and break it up into an argv, which is appended * to the argument list. * - * PUBLIC: int argv_exp3 __P((SCR *, EXCMD *, CHAR_T *, size_t)); + * PUBLIC: int argv_exp3(SCR *, EXCMD *, CHAR_T *, size_t); */ int argv_exp3(SCR *sp, EXCMD *excp, CHAR_T *cmd, size_t cmdlen) @@ -277,7 +277,7 @@ argv_exp3(SCR *sp, EXCMD *excp, CHAR_T *cmd, size_t cmdlen) * Filter the ex commands with a prefix, and append the results to * the argument list. * - * PUBLIC: int argv_flt_ex __P((SCR *, EXCMD *, CHAR_T *, size_t)); + * PUBLIC: int argv_flt_ex(SCR *, EXCMD *, CHAR_T *, size_t); */ int argv_flt_ex(SCR *sp, EXCMD *excp, CHAR_T *cmd, size_t cmdlen) @@ -520,7 +520,7 @@ mem: msgq(sp, M_SYSERR, NULL); * argv_free -- * Free up argument structures. * - * PUBLIC: int argv_free __P((SCR *)); + * PUBLIC: int argv_free(SCR *); */ int argv_free(SCR *sp) @@ -550,7 +550,7 @@ argv_free(SCR *sp) * Find all file names matching the prefix and append them to the * argument list. * - * PUBLIC: int argv_flt_path __P((SCR *, EXCMD *, CHAR_T *, size_t)); + * PUBLIC: int argv_flt_path(SCR *, EXCMD *, CHAR_T *, size_t); */ int argv_flt_path(SCR *sp, EXCMD *excp, CHAR_T *path, size_t plen) @@ -812,7 +812,7 @@ alloc_err: rval = SEXP_ERR; * argv_esc -- * Escape a string into an ex and shell argument. * - * PUBLIC: CHAR_T *argv_esc __P((SCR *, EXCMD *, CHAR_T *, size_t)); + * PUBLIC: CHAR_T *argv_esc(SCR *, EXCMD *, CHAR_T *, size_t); */ CHAR_T * argv_esc(SCR *sp, EXCMD *excp, CHAR_T *str, size_t len) @@ -875,7 +875,7 @@ argv_esc(SCR *sp, EXCMD *excp, CHAR_T *str, size_t len) * argv_uesc -- * Unescape an escaped ex and shell argument. * - * PUBLIC: CHAR_T *argv_uesc __P((SCR *, EXCMD *, CHAR_T *, size_t)); + * PUBLIC: CHAR_T *argv_uesc(SCR *, EXCMD *, CHAR_T *, size_t); */ CHAR_T * argv_uesc(SCR *sp, EXCMD *excp, CHAR_T *str, size_t len) diff --git a/ex/ex_at.c b/ex/ex_at.c index 0c12e6ce8e5a..875423f81ec3 100644 --- a/ex/ex_at.c +++ b/ex/ex_at.c @@ -32,7 +32,7 @@ static const char sccsid[] = "$Id: ex_at.c,v 10.16 2001/06/25 15:19:14 skimo Exp * * Execute the contents of the buffer. * - * PUBLIC: int ex_at __P((SCR *, EXCMD *)); + * PUBLIC: int ex_at(SCR *, EXCMD *); */ int ex_at(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_bang.c b/ex/ex_bang.c index 4b6f75e8d0f7..9b7c3766ec70 100644 --- a/ex/ex_bang.c +++ b/ex/ex_bang.c @@ -44,7 +44,7 @@ static const char sccsid[] = "$Id: ex_bang.c,v 10.36 2001/06/25 15:19:14 skimo E * ways of getting here display the right things. It took a long time to * get it right (wrong?), so be careful. * - * PUBLIC: int ex_bang __P((SCR *, EXCMD *)); + * PUBLIC: int ex_bang(SCR *, EXCMD *); */ int ex_bang(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_cd.c b/ex/ex_cd.c index 30a596f3c365..4b3216635ef9 100644 --- a/ex/ex_cd.c +++ b/ex/ex_cd.c @@ -31,7 +31,7 @@ static const char sccsid[] = "$Id: ex_cd.c,v 10.13 2012/04/12 06:28:27 zy Exp $" * ex_cd -- :cd[!] [directory] * Change directories. * - * PUBLIC: int ex_cd __P((SCR *, EXCMD *)); + * PUBLIC: int ex_cd(SCR *, EXCMD *); */ int ex_cd(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_cscope.c b/ex/ex_cscope.c index afc7fa93ee8c..0503fb315162 100644 --- a/ex/ex_cscope.c +++ b/ex/ex_cscope.c @@ -61,15 +61,15 @@ find c|d|e|f|g|i|s|t buffer|pattern\n\ s: find all uses of name\n\ t: find assignments to name" -static int cscope_add __P((SCR *, EXCMD *, CHAR_T *)); -static int cscope_find __P((SCR *, EXCMD*, CHAR_T *)); -static int cscope_help __P((SCR *, EXCMD *, CHAR_T *)); -static int cscope_kill __P((SCR *, EXCMD *, CHAR_T *)); -static int cscope_reset __P((SCR *, EXCMD *, CHAR_T *)); +static int cscope_add(SCR *, EXCMD *, CHAR_T *); +static int cscope_find(SCR *, EXCMD*, CHAR_T *); +static int cscope_help(SCR *, EXCMD *, CHAR_T *); +static int cscope_kill(SCR *, EXCMD *, CHAR_T *); +static int cscope_reset(SCR *, EXCMD *, CHAR_T *); typedef struct _cc { char *name; - int (*function) __P((SCR *, EXCMD *, CHAR_T *)); + int (*function)(SCR *, EXCMD *, CHAR_T *); char *help_msg; char *usage_msg; } CC; @@ -88,23 +88,23 @@ static CC const cscope_cmds[] = { { NULL } }; -static TAGQ *create_cs_cmd __P((SCR *, char *, size_t *)); -static int csc_help __P((SCR *, char *)); -static void csc_file __P((SCR *, - CSC *, char *, char **, size_t *, int *)); -static int get_paths __P((SCR *, CSC *)); -static CC const *lookup_ccmd __P((char *)); -static int parse __P((SCR *, CSC *, TAGQ *, int *)); -static int read_prompt __P((SCR *, CSC *)); -static int run_cscope __P((SCR *, CSC *, char *)); -static int start_cscopes __P((SCR *, EXCMD *)); -static int terminate __P((SCR *, CSC *, int)); +static TAGQ *create_cs_cmd(SCR *, char *, size_t *); +static int csc_help(SCR *, char *); +static void csc_file(SCR *, + CSC *, char *, char **, size_t *, int *); +static int get_paths(SCR *, CSC *); +static CC const *lookup_ccmd(char *); +static int parse(SCR *, CSC *, TAGQ *, int *); +static int read_prompt(SCR *, CSC *); +static int run_cscope(SCR *, CSC *, char *); +static int start_cscopes(SCR *, EXCMD *); +static int terminate(SCR *, CSC *, int); /* * ex_cscope -- * Perform an ex cscope. * - * PUBLIC: int ex_cscope __P((SCR *, EXCMD *)); + * PUBLIC: int ex_cscope(SCR *, EXCMD *); */ int ex_cscope(SCR *sp, EXCMD *cmdp) @@ -861,7 +861,7 @@ csc_help(SCR *sp, char *cmd) return (1); } else { ex_printf(sp, - "Command: %s (%s)\n", ccp->name, ccp->help_msg); + "Command: %s (%s)\n", ccp->name, ccp->help_msg); ex_printf(sp, " Usage: %s\n", ccp->usage_msg); return (0); } @@ -965,7 +965,7 @@ cscope_reset(SCR *sp, EXCMD *cmdp, CHAR_T *notusedp) * cscope_end -- * End all cscope connections. * - * PUBLIC: int cscope_end __P((SCR *)); + * PUBLIC: int cscope_end(SCR *); */ int cscope_end(SCR *sp) @@ -982,7 +982,7 @@ cscope_end(SCR *sp) * cscope_display -- * Display current connections. * - * PUBLIC: int cscope_display __P((SCR *)); + * PUBLIC: int cscope_display(SCR *); */ int cscope_display(SCR *sp) @@ -1006,7 +1006,7 @@ cscope_display(SCR *sp) * cscope_search -- * Search a file for a cscope entry. * - * PUBLIC: int cscope_search __P((SCR *, TAGQ *, TAG *)); + * PUBLIC: int cscope_search(SCR *, TAGQ *, TAG *); */ int cscope_search(SCR *sp, TAGQ *tqp, TAG *tp) diff --git a/ex/ex_delete.c b/ex/ex_delete.c index 34bbee480d4c..e59948981560 100644 --- a/ex/ex_delete.c +++ b/ex/ex_delete.c @@ -28,7 +28,7 @@ static const char sccsid[] = "$Id: ex_delete.c,v 10.11 2001/06/25 15:19:15 skimo * * Delete lines from the file. * - * PUBLIC: int ex_delete __P((SCR *, EXCMD *)); + * PUBLIC: int ex_delete(SCR *, EXCMD *); */ int ex_delete(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_display.c b/ex/ex_display.c index 6142a44a2cfa..0ace60bb3029 100644 --- a/ex/ex_display.c +++ b/ex/ex_display.c @@ -26,16 +26,16 @@ static const char sccsid[] = "$Id: ex_display.c,v 10.15 2001/06/25 15:19:15 skim #include "../common/common.h" #include "tag.h" -static int is_prefix __P((ARGS *, CHAR_T *)); -static int bdisplay __P((SCR *)); -static void db __P((SCR *, CB *, const char *)); +static int is_prefix(ARGS *, CHAR_T *); +static int bdisplay(SCR *); +static void db(SCR *, CB *, const char *); /* * ex_display -- :display b[uffers] | c[onnections] | s[creens] | t[ags] * * Display cscope connections, buffers, tags or screens. * - * PUBLIC: int ex_display __P((SCR *, EXCMD *)); + * PUBLIC: int ex_display(SCR *, EXCMD *); */ int ex_display(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_edit.c b/ex/ex_edit.c index ce0f9a41407c..f9f77e813988 100644 --- a/ex/ex_edit.c +++ b/ex/ex_edit.c @@ -27,7 +27,7 @@ static const char sccsid[] = "$Id: ex_edit.c,v 10.15 2011/12/22 23:26:50 zy Exp #include "../common/common.h" #include "../vi/vi.h" -static int ex_N_edit __P((SCR *, EXCMD *, FREF *, int)); +static int ex_N_edit(SCR *, EXCMD *, FREF *, int); /* * ex_edit -- :e[dit][!] [+cmd] [file] @@ -43,7 +43,7 @@ static int ex_N_edit __P((SCR *, EXCMD *, FREF *, int)); * a file name as well. This seems unreasonable, so we support it * regardless. * - * PUBLIC: int ex_edit __P((SCR *, EXCMD *)); + * PUBLIC: int ex_edit(SCR *, EXCMD *); */ int ex_edit(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_equal.c b/ex/ex_equal.c index 7da5a20a3054..a6745ce05bee 100644 --- a/ex/ex_equal.c +++ b/ex/ex_equal.c @@ -26,7 +26,7 @@ static const char sccsid[] = "$Id: ex_equal.c,v 10.12 2001/06/25 15:19:15 skimo /* * ex_equal -- :address = * - * PUBLIC: int ex_equal __P((SCR *, EXCMD *)); + * PUBLIC: int ex_equal(SCR *, EXCMD *); */ int ex_equal(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_file.c b/ex/ex_file.c index 12714a3974ba..fdef2112f118 100644 --- a/ex/ex_file.c +++ b/ex/ex_file.c @@ -30,7 +30,7 @@ static const char sccsid[] = "$Id: ex_file.c,v 10.14 2001/06/25 15:19:16 skimo E * ex_file -- :f[ile] [name] * Change the file's name and display the status line. * - * PUBLIC: int ex_file __P((SCR *, EXCMD *)); + * PUBLIC: int ex_file(SCR *, EXCMD *); */ int ex_file(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_filter.c b/ex/ex_filter.c index 9af9a7c7becc..cff55bfc5bf2 100644 --- a/ex/ex_filter.c +++ b/ex/ex_filter.c @@ -27,7 +27,7 @@ static const char sccsid[] = "$Id: ex_filter.c,v 10.44 2003/11/05 17:11:54 skimo #include "../common/common.h" -static int filter_ldisplay __P((SCR *, FILE *)); +static int filter_ldisplay(SCR *, FILE *); /* * ex_filter -- @@ -35,8 +35,8 @@ static int filter_ldisplay __P((SCR *, FILE *)); * replace the original text with the stdout/stderr output of * the utility. * - * PUBLIC: int ex_filter __P((SCR *, - * PUBLIC: EXCMD *, MARK *, MARK *, MARK *, CHAR_T *, enum filtertype)); + * PUBLIC: int ex_filter(SCR *, + * PUBLIC: EXCMD *, MARK *, MARK *, MARK *, CHAR_T *, enum filtertype); */ int ex_filter(SCR *sp, EXCMD *cmdp, MARK *fm, MARK *tm, MARK *rp, CHAR_T *cmd, enum filtertype ftype) diff --git a/ex/ex_global.c b/ex/ex_global.c index 5dbbb07db0a7..4482ccd32ad9 100644 --- a/ex/ex_global.c +++ b/ex/ex_global.c @@ -30,13 +30,13 @@ static const char sccsid[] = "$Id: ex_global.c,v 10.32 2011/12/26 23:37:01 zy Ex enum which {GLOBAL, V}; -static int ex_g_setup __P((SCR *, EXCMD *, enum which)); +static int ex_g_setup(SCR *, EXCMD *, enum which); /* * ex_global -- [line [,line]] g[lobal][!] /pattern/ [commands] * Exec on lines matching a pattern. * - * PUBLIC: int ex_global __P((SCR *, EXCMD *)); + * PUBLIC: int ex_global(SCR *, EXCMD *); */ int ex_global(SCR *sp, EXCMD *cmdp) @@ -49,7 +49,7 @@ ex_global(SCR *sp, EXCMD *cmdp) * ex_v -- [line [,line]] v /pattern/ [commands] * Exec on lines not matching a pattern. * - * PUBLIC: int ex_v __P((SCR *, EXCMD *)); + * PUBLIC: int ex_v(SCR *, EXCMD *); */ int ex_v(SCR *sp, EXCMD *cmdp) @@ -248,7 +248,7 @@ usage: ex_emsg(sp, cmdp->cmd->usage, EXM_USAGE); * ex_g_insdel -- * Update the ranges based on an insertion or deletion. * - * PUBLIC: int ex_g_insdel __P((SCR *, lnop_t, recno_t)); + * PUBLIC: int ex_g_insdel(SCR *, lnop_t, recno_t); */ int ex_g_insdel(SCR *sp, lnop_t op, recno_t lno) diff --git a/ex/ex_init.c b/ex/ex_init.c index 5b93e5bbccab..ad54591a2395 100644 --- a/ex/ex_init.c +++ b/ex/ex_init.c @@ -30,15 +30,15 @@ static const char sccsid[] = "$Id: ex_init.c,v 10.33 2012/04/11 19:12:34 zy Exp #include "pathnames.h" enum rc { NOEXIST, NOPERM, RCOK }; -static enum rc exrc_isok __P((SCR *, struct stat *, char *, int, int)); +static enum rc exrc_isok(SCR *, struct stat *, char *, int, int); -static int ex_run_file __P((SCR *, char *)); +static int ex_run_file(SCR *, char *); /* * ex_screen_copy -- * Copy ex screen. * - * PUBLIC: int ex_screen_copy __P((SCR *, SCR *)); + * PUBLIC: int ex_screen_copy(SCR *, SCR *); */ int ex_screen_copy(SCR *orig, SCR *sp) @@ -74,7 +74,7 @@ ex_screen_copy(SCR *orig, SCR *sp) * ex_screen_end -- * End a vi screen. * - * PUBLIC: int ex_screen_end __P((SCR *)); + * PUBLIC: int ex_screen_end(SCR *); */ int ex_screen_end(SCR *sp) @@ -120,7 +120,7 @@ ex_screen_end(SCR *sp) * ex_optchange -- * Handle change of options for ex. * - * PUBLIC: int ex_optchange __P((SCR *, int, char *, u_long *)); + * PUBLIC: int ex_optchange(SCR *, int, char *, u_long *); */ int ex_optchange(SCR *sp, int offset, char *str, u_long *valp) @@ -137,7 +137,7 @@ ex_optchange(SCR *sp, int offset, char *str, u_long *valp) * Read the EXINIT environment variable and the startup exrc files, * and execute their commands. * - * PUBLIC: int ex_exrc __P((SCR *)); + * PUBLIC: int ex_exrc(SCR *); */ int ex_exrc(SCR *sp) @@ -281,7 +281,7 @@ ex_run_file(SCR *sp, char *name) * ex_run_str -- * Set up a string of ex commands to run. * - * PUBLIC: int ex_run_str __P((SCR *, char *, CHAR_T *, size_t, int, int)); + * PUBLIC: int ex_run_str(SCR *, char *, CHAR_T *, size_t, int, int); */ int ex_run_str(SCR *sp, char *name, CHAR_T *str, size_t len, int ex_flags, int nocopy) diff --git a/ex/ex_join.c b/ex/ex_join.c index 822ed79c4854..2917b2e2d8ab 100644 --- a/ex/ex_join.c +++ b/ex/ex_join.c @@ -30,7 +30,7 @@ static const char sccsid[] = "$Id: ex_join.c,v 10.17 2004/03/16 14:14:04 skimo E * ex_join -- :[line [,line]] j[oin][!] [count] [flags] * Join lines. * - * PUBLIC: int ex_join __P((SCR *, EXCMD *)); + * PUBLIC: int ex_join(SCR *, EXCMD *); */ int ex_join(SCR *sp, EXCMD *cmdp) @@ -62,7 +62,7 @@ ex_join(SCR *sp, EXCMD *cmdp) ++cmdp->addr2.lno; clen = tlen = 0; - for (first = 1, + for (first = 1, from = cmdp->addr1.lno, to = cmdp->addr2.lno; from <= to; ++from) { /* * Get next line. Historic versions of vi allowed "10J" while @@ -154,7 +154,7 @@ ex_join(SCR *sp, EXCMD *cmdp) sp->lno = cmdp->addr1.lno; /* Delete the joined lines. */ - for (from = cmdp->addr1.lno, to = cmdp->addr2.lno; to > from; --to) + for (from = cmdp->addr1.lno, to = cmdp->addr2.lno; to > from; --to) if (db_delete(sp, to)) goto err; diff --git a/ex/ex_map.c b/ex/ex_map.c index 60dbfe07d66f..932d63385d50 100644 --- a/ex/ex_map.c +++ b/ex/ex_map.c @@ -40,7 +40,7 @@ static const char sccsid[] = "$Id: ex_map.c,v 10.11 2001/06/25 15:19:17 skimo Ex * put the map in a .exrc file, things would often work much better. * No clue why. * - * PUBLIC: int ex_map __P((SCR *, EXCMD *)); + * PUBLIC: int ex_map(SCR *, EXCMD *); */ int ex_map(SCR *sp, EXCMD *cmdp) @@ -103,7 +103,7 @@ nofunc: if (stype == SEQ_COMMAND && input[1] == '\0') * ex_unmap -- (:unmap[!] key) * Unmap a key. * - * PUBLIC: int ex_unmap __P((SCR *, EXCMD *)); + * PUBLIC: int ex_unmap(SCR *, EXCMD *); */ int ex_unmap(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_mark.c b/ex/ex_mark.c index 8c8ec3405ab3..e259837d5d1e 100644 --- a/ex/ex_mark.c +++ b/ex/ex_mark.c @@ -29,7 +29,7 @@ static const char sccsid[] = "$Id: ex_mark.c,v 10.9 2001/06/25 15:19:17 skimo Ex * Mark lines. * * - * PUBLIC: int ex_mark __P((SCR *, EXCMD *)); + * PUBLIC: int ex_mark(SCR *, EXCMD *); */ int ex_mark(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_mkexrc.c b/ex/ex_mkexrc.c index 87530149addc..82678b14878e 100644 --- a/ex/ex_mkexrc.c +++ b/ex/ex_mkexrc.c @@ -34,7 +34,7 @@ static const char sccsid[] = "$Id: ex_mkexrc.c,v 10.13 2001/06/25 15:19:17 skimo * * Create (or overwrite) a .exrc file with the current info. * - * PUBLIC: int ex_mkexrc __P((SCR *, EXCMD *)); + * PUBLIC: int ex_mkexrc(SCR *, EXCMD *); */ int ex_mkexrc(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_move.c b/ex/ex_move.c index c2499fd79a8f..a7f6b5fb87f1 100644 --- a/ex/ex_move.c +++ b/ex/ex_move.c @@ -29,7 +29,7 @@ static const char sccsid[] = "$Id: ex_move.c,v 10.16 2012/02/11 15:52:33 zy Exp * ex_copy -- :[line [,line]] co[py] line [flags] * Copy selected lines. * - * PUBLIC: int ex_copy __P((SCR *, EXCMD *)); + * PUBLIC: int ex_copy(SCR *, EXCMD *); */ int ex_copy(SCR *sp, EXCMD *cmdp) @@ -81,7 +81,7 @@ err: text_lfree(cb.textq); * ex_move -- :[line [,line]] mo[ve] line * Move selected lines. * - * PUBLIC: int ex_move __P((SCR *, EXCMD *)); + * PUBLIC: int ex_move(SCR *, EXCMD *); */ int ex_move(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_open.c b/ex/ex_open.c index 97414b93e3dc..ca54eca08f6d 100644 --- a/ex/ex_open.c +++ b/ex/ex_open.c @@ -28,7 +28,7 @@ static const char sccsid[] = "$Id: ex_open.c,v 10.8 2001/06/25 15:19:17 skimo Ex * * Switch to single line "open" mode. * - * PUBLIC: int ex_open __P((SCR *, EXCMD *)); + * PUBLIC: int ex_open(SCR *, EXCMD *); */ int ex_open(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_preserve.c b/ex/ex_preserve.c index bda4bb44b695..e0dc286f82c5 100644 --- a/ex/ex_preserve.c +++ b/ex/ex_preserve.c @@ -29,7 +29,7 @@ static const char sccsid[] = "$Id: ex_preserve.c,v 10.15 2001/06/25 15:19:18 ski * ex_preserve -- :pre[serve] * Push the file to recovery. * - * PUBLIC: int ex_preserve __P((SCR *, EXCMD *)); + * PUBLIC: int ex_preserve(SCR *, EXCMD *); */ int ex_preserve(SCR *sp, EXCMD *cmdp) @@ -63,7 +63,7 @@ ex_preserve(SCR *sp, EXCMD *cmdp) * ex_recover -- :rec[over][!] file * Recover the file. * - * PUBLIC: int ex_recover __P((SCR *, EXCMD *)); + * PUBLIC: int ex_recover(SCR *, EXCMD *); */ int ex_recover(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_print.c b/ex/ex_print.c index 5903e9711ee5..7cdde7a38a25 100644 --- a/ex/ex_print.c +++ b/ex/ex_print.c @@ -26,15 +26,15 @@ static const char sccsid[] = "$Id: ex_print.c,v 10.26 2013/11/02 02:11:07 zy Exp #include "../common/common.h" -static int ex_prchars __P((SCR *, const CHAR_T *, size_t *, size_t, - u_int, int)); +static int ex_prchars(SCR *, + const CHAR_T *, size_t *, size_t, u_int, int); /* * ex_list -- :[line [,line]] l[ist] [count] [flags] * * Display the addressed lines such that the output is unambiguous. * - * PUBLIC: int ex_list __P((SCR *, EXCMD *)); + * PUBLIC: int ex_list(SCR *, EXCMD *); */ int ex_list(SCR *sp, EXCMD *cmdp) @@ -52,7 +52,7 @@ ex_list(SCR *sp, EXCMD *cmdp) * * Display the addressed lines with a leading line number. * - * PUBLIC: int ex_number __P((SCR *, EXCMD *)); + * PUBLIC: int ex_number(SCR *, EXCMD *); */ int ex_number(SCR *sp, EXCMD *cmdp) @@ -70,7 +70,7 @@ ex_number(SCR *sp, EXCMD *cmdp) * * Display the addressed lines. * - * PUBLIC: int ex_pr __P((SCR *, EXCMD *)); + * PUBLIC: int ex_pr(SCR *, EXCMD *); */ int ex_pr(SCR *sp, EXCMD *cmdp) @@ -86,7 +86,7 @@ ex_pr(SCR *sp, EXCMD *cmdp) * ex_print -- * Print the selected lines. * - * PUBLIC: int ex_print __P((SCR *, EXCMD *, MARK *, MARK *, u_int32_t)); + * PUBLIC: int ex_print(SCR *, EXCMD *, MARK *, MARK *, u_int32_t); */ int ex_print(SCR *sp, EXCMD *cmdp, MARK *fp, MARK *tp, u_int32_t flags) @@ -141,7 +141,7 @@ ex_print(SCR *sp, EXCMD *cmdp, MARK *fp, MARK *tp, u_int32_t flags) * ex_ldisplay -- * Display a line without any preceding number. * - * PUBLIC: int ex_ldisplay __P((SCR *, const CHAR_T *, size_t, size_t, u_int)); + * PUBLIC: int ex_ldisplay(SCR *, const CHAR_T *, size_t, size_t, u_int); */ int ex_ldisplay(SCR *sp, const CHAR_T *p, size_t len, size_t col, u_int flags) @@ -162,7 +162,7 @@ ex_ldisplay(SCR *sp, const CHAR_T *p, size_t len, size_t col, u_int flags) * ex_scprint -- * Display a line for the substitute with confirmation routine. * - * PUBLIC: int ex_scprint __P((SCR *, MARK *, MARK *)); + * PUBLIC: int ex_scprint(SCR *, MARK *, MARK *); */ int ex_scprint(SCR *sp, MARK *fp, MARK *tp) @@ -258,7 +258,7 @@ intr: *colp = col; * ex_printf -- * Ex's version of printf. * - * PUBLIC: int ex_printf __P((SCR *, const char *, ...)); + * PUBLIC: int ex_printf(SCR *, const char *, ...); */ int ex_printf( @@ -288,7 +288,7 @@ ex_printf( * ex_puts -- * Ex's version of puts. * - * PUBLIC: int ex_puts __P((SCR *, const char *)); + * PUBLIC: int ex_puts(SCR *, const char *); */ int ex_puts(SCR *sp, const char *str) @@ -314,7 +314,7 @@ ex_puts(SCR *sp, const char *str) * ex_fflush -- * Ex's version of fflush. * - * PUBLIC: int ex_fflush __P((SCR *sp)); + * PUBLIC: int ex_fflush(SCR *sp); */ int ex_fflush(SCR *sp) diff --git a/ex/ex_put.c b/ex/ex_put.c index 7a3996be77c8..384b500f4709 100644 --- a/ex/ex_put.c +++ b/ex/ex_put.c @@ -29,7 +29,7 @@ static const char sccsid[] = "$Id: ex_put.c,v 10.8 2001/06/25 15:19:18 skimo Exp * ex_put -- [line] pu[t] [buffer] * Append a cut buffer into the file. * - * PUBLIC: int ex_put __P((SCR *, EXCMD *)); + * PUBLIC: int ex_put(SCR *, EXCMD *); */ int ex_put(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_quit.c b/ex/ex_quit.c index 2cfaeb1dc0fc..faf31d71d953 100644 --- a/ex/ex_quit.c +++ b/ex/ex_quit.c @@ -27,7 +27,7 @@ static const char sccsid[] = "$Id: ex_quit.c,v 10.8 2001/06/25 15:19:18 skimo Ex * ex_quit -- :quit[!] * Quit. * - * PUBLIC: int ex_quit __P((SCR *, EXCMD *)); + * PUBLIC: int ex_quit(SCR *, EXCMD *); */ int ex_quit(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_read.c b/ex/ex_read.c index 187f0902398a..00276a270cd3 100644 --- a/ex/ex_read.c +++ b/ex/ex_read.c @@ -36,7 +36,7 @@ static const char sccsid[] = "$Id: ex_read.c,v 10.44 2001/06/25 15:19:19 skimo E * !!! * Historical vi wouldn't undo a filter read, for no apparent reason. * - * PUBLIC: int ex_read __P((SCR *, EXCMD *)); + * PUBLIC: int ex_read(SCR *, EXCMD *); */ int ex_read(SCR *sp, EXCMD *cmdp) @@ -291,7 +291,7 @@ ex_read(SCR *sp, EXCMD *cmdp) * ex_readfp -- * Read lines into the file. * - * PUBLIC: int ex_readfp __P((SCR *, char *, FILE *, MARK *, recno_t *, int)); + * PUBLIC: int ex_readfp(SCR *, char *, FILE *, MARK *, recno_t *, int); */ int ex_readfp(SCR *sp, char *name, FILE *fp, MARK *fm, recno_t *nlinesp, int silent) diff --git a/ex/ex_screen.c b/ex/ex_screen.c index 9cb108f976a7..7bec2bc9ab12 100644 --- a/ex/ex_screen.c +++ b/ex/ex_screen.c @@ -30,7 +30,7 @@ static const char sccsid[] = "$Id: ex_screen.c,v 10.12 2001/06/25 15:19:19 skimo * ex_bg -- :bg * Hide the screen. * - * PUBLIC: int ex_bg __P((SCR *, EXCMD *)); + * PUBLIC: int ex_bg(SCR *, EXCMD *); */ int ex_bg(SCR *sp, EXCMD *cmdp) @@ -42,7 +42,7 @@ ex_bg(SCR *sp, EXCMD *cmdp) * ex_fg -- :fg [file] * Show the screen. * - * PUBLIC: int ex_fg __P((SCR *, EXCMD *)); + * PUBLIC: int ex_fg(SCR *, EXCMD *); */ int ex_fg(SCR *sp, EXCMD *cmdp) @@ -66,7 +66,7 @@ ex_fg(SCR *sp, EXCMD *cmdp) * ex_resize -- :resize [+-]rows * Change the screen size. * - * PUBLIC: int ex_resize __P((SCR *, EXCMD *)); + * PUBLIC: int ex_resize(SCR *, EXCMD *); */ int ex_resize(SCR *sp, EXCMD *cmdp) @@ -95,7 +95,7 @@ ex_resize(SCR *sp, EXCMD *cmdp) * ex_sdisplay -- * Display the list of screens. * - * PUBLIC: int ex_sdisplay __P((SCR *)); + * PUBLIC: int ex_sdisplay(SCR *); */ int ex_sdisplay(SCR *sp) diff --git a/ex/ex_script.c b/ex/ex_script.c index 5ba0acf2e2f2..2dc44658a62d 100644 --- a/ex/ex_script.c +++ b/ex/ex_script.c @@ -45,18 +45,18 @@ static const char sccsid[] = "$Id: ex_script.c,v 10.44 2012/10/05 10:17:47 zy Ex #include "script.h" #include "pathnames.h" -static void sscr_check __P((SCR *)); -static int sscr_getprompt __P((SCR *)); -static int sscr_init __P((SCR *)); -static int sscr_insert __P((SCR *)); -static int sscr_matchprompt __P((SCR *, char *, size_t, size_t *)); -static int sscr_setprompt __P((SCR *, char *, size_t)); +static void sscr_check(SCR *); +static int sscr_getprompt(SCR *); +static int sscr_init(SCR *); +static int sscr_insert(SCR *); +static int sscr_matchprompt(SCR *, char *, size_t, size_t *); +static int sscr_setprompt(SCR *, char *, size_t); /* * ex_script -- : sc[ript][!] [file] * Switch to script mode. * - * PUBLIC: int ex_script __P((SCR *, EXCMD *)); + * PUBLIC: int ex_script(SCR *, EXCMD *); */ int ex_script(SCR *sp, EXCMD *cmdp) @@ -292,7 +292,7 @@ prompterr: sscr_end(sp); * sscr_exec -- * Take a line and hand it off to the shell. * - * PUBLIC: int sscr_exec __P((SCR *, recno_t)); + * PUBLIC: int sscr_exec(SCR *, recno_t); */ int sscr_exec(SCR *sp, recno_t lno) @@ -368,7 +368,7 @@ err1: rval = 1; * sscr_input -- * Read any waiting shell input. * - * PUBLIC: int sscr_input __P((SCR *)); + * PUBLIC: int sscr_input(SCR *); */ int sscr_input(SCR *sp) @@ -577,7 +577,7 @@ sscr_matchprompt(SCR *sp, char *lp, size_t line_len, size_t *lenp) * sscr_end -- * End the pipe to a shell. * - * PUBLIC: int sscr_end __P((SCR *)); + * PUBLIC: int sscr_end(SCR *); */ int sscr_end(SCR *sp) diff --git a/ex/ex_set.c b/ex/ex_set.c index 5134babff7f6..2acc3a887221 100644 --- a/ex/ex_set.c +++ b/ex/ex_set.c @@ -27,7 +27,7 @@ static const char sccsid[] = "$Id: ex_set.c,v 10.8 2001/06/25 15:19:19 skimo Exp * ex_set -- :set * Ex set option. * - * PUBLIC: int ex_set __P((SCR *, EXCMD *)); + * PUBLIC: int ex_set(SCR *, EXCMD *); */ int ex_set(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_shell.c b/ex/ex_shell.c index d12730505968..43be5cb21756 100644 --- a/ex/ex_shell.c +++ b/ex/ex_shell.c @@ -29,14 +29,14 @@ static const char sccsid[] = "$Id: ex_shell.c,v 10.44 2012/07/06 06:51:26 zy Exp #include "../common/common.h" -static const char *sigmsg __P((int)); +static const char *sigmsg(int); /* * ex_shell -- :sh[ell] * Invoke the program named in the SHELL environment variable * with the argument -i. * - * PUBLIC: int ex_shell __P((SCR *, EXCMD *)); + * PUBLIC: int ex_shell(SCR *, EXCMD *); */ int ex_shell(SCR *sp, EXCMD *cmdp) @@ -82,7 +82,7 @@ ex_shell(SCR *sp, EXCMD *cmdp) * ex_exec_proc -- * Run a separate process. * - * PUBLIC: int ex_exec_proc __P((SCR *, EXCMD *, char *, const char *, int)); + * PUBLIC: int ex_exec_proc(SCR *, EXCMD *, char *, const char *, int); */ int ex_exec_proc(SCR *sp, EXCMD *cmdp, char *cmd, const char *msg, int need_newline) @@ -147,7 +147,7 @@ ex_exec_proc(SCR *sp, EXCMD *cmdp, char *cmd, const char *msg, int need_newline) * rules get you. I'm using a long based on the belief that nobody is * going to make it unsigned and it's unlikely to be a quad. * - * PUBLIC: int proc_wait __P((SCR *, long, const char *, int, int)); + * PUBLIC: int proc_wait(SCR *, long, const char *, int, int); */ int proc_wait(SCR *sp, long int pid, const char *cmd, int silent, int okpipe) diff --git a/ex/ex_shift.c b/ex/ex_shift.c index cc6e1aac4b4b..fec800ca7ded 100644 --- a/ex/ex_shift.c +++ b/ex/ex_shift.c @@ -26,13 +26,13 @@ static const char sccsid[] = "$Id: ex_shift.c,v 10.17 2001/06/25 15:19:20 skimo #include "../common/common.h" enum which {LEFT, RIGHT}; -static int shift __P((SCR *, EXCMD *, enum which)); +static int shift(SCR *, EXCMD *, enum which); /* * ex_shiftl -- :<[<...] * * - * PUBLIC: int ex_shiftl __P((SCR *, EXCMD *)); + * PUBLIC: int ex_shiftl(SCR *, EXCMD *); */ int ex_shiftl(SCR *sp, EXCMD *cmdp) @@ -43,7 +43,7 @@ ex_shiftl(SCR *sp, EXCMD *cmdp) /* * ex_shiftr -- :>[>...] * - * PUBLIC: int ex_shiftr __P((SCR *, EXCMD *)); + * PUBLIC: int ex_shiftr(SCR *, EXCMD *); */ int ex_shiftr(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_source.c b/ex/ex_source.c index 63375d2b7ee2..6ac698da512f 100644 --- a/ex/ex_source.c +++ b/ex/ex_source.c @@ -32,7 +32,7 @@ static const char sccsid[] = "$Id: ex_source.c,v 10.17 2011/12/19 16:17:06 zy Ex * ex_source -- :source file * Execute ex commands from a file. * - * PUBLIC: int ex_source __P((SCR *, EXCMD *)); + * PUBLIC: int ex_source(SCR *, EXCMD *); */ int ex_source(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_stop.c b/ex/ex_stop.c index 79167896b1cf..4bc1bb2a5e2d 100644 --- a/ex/ex_stop.c +++ b/ex/ex_stop.c @@ -31,7 +31,7 @@ static const char sccsid[] = "$Id: ex_stop.c,v 10.11 2001/06/25 15:19:20 skimo E * :suspend[!] * Suspend execution. * - * PUBLIC: int ex_stop __P((SCR *, EXCMD *)); + * PUBLIC: int ex_stop(SCR *, EXCMD *); */ int ex_stop(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_subst.c b/ex/ex_subst.c index 93398431ca70..db79376fcd32 100644 --- a/ex/ex_subst.c +++ b/ex/ex_subst.c @@ -32,12 +32,12 @@ static const char sccsid[] = "$Id: ex_subst.c,v 10.53 2011/12/21 20:40:35 zy Exp #define SUB_FIRST 0x01 /* The 'r' flag isn't reasonable. */ #define SUB_MUSTSETR 0x02 /* The 'r' flag is required. */ -static int re_conv __P((SCR *, CHAR_T **, size_t *, int *)); -static int re_cscope_conv __P((SCR *, CHAR_T **, size_t *, int *)); -static int re_sub __P((SCR *, - CHAR_T *, CHAR_T **, size_t *, size_t *, regmatch_t [10])); -static int re_tag_conv __P((SCR *, CHAR_T **, size_t *, int *)); -static int s __P((SCR *, EXCMD *, CHAR_T *, regex_t *, u_int)); +static int re_conv(SCR *, CHAR_T **, size_t *, int *); +static int re_cscope_conv(SCR *, CHAR_T **, size_t *, int *); +static int re_sub(SCR *, + CHAR_T *, CHAR_T **, size_t *, size_t *, regmatch_t [10]); +static int re_tag_conv(SCR *, CHAR_T **, size_t *, int *); +static int s(SCR *, EXCMD *, CHAR_T *, regex_t *, u_int); /* * ex_s -- @@ -45,7 +45,7 @@ static int s __P((SCR *, EXCMD *, CHAR_T *, regex_t *, u_int)); * * Substitute on lines matching a pattern. * - * PUBLIC: int ex_s __P((SCR *, EXCMD *)); + * PUBLIC: int ex_s(SCR *, EXCMD *); */ int ex_s(SCR *sp, EXCMD *cmdp) @@ -250,7 +250,7 @@ tilde: ++p; * * Substitute using the last substitute RE and replacement pattern. * - * PUBLIC: int ex_subagain __P((SCR *, EXCMD *)); + * PUBLIC: int ex_subagain(SCR *, EXCMD *); */ int ex_subagain(SCR *sp, EXCMD *cmdp) @@ -273,7 +273,7 @@ ex_subagain(SCR *sp, EXCMD *cmdp) * * Substitute using the last RE and last substitute replacement pattern. * - * PUBLIC: int ex_subtilde __P((SCR *, EXCMD *)); + * PUBLIC: int ex_subtilde(SCR *, EXCMD *); */ int ex_subtilde(SCR *sp, EXCMD *cmdp) @@ -879,8 +879,8 @@ err: rval = 1; * re_compile -- * Compile the RE. * - * PUBLIC: int re_compile __P((SCR *, - * PUBLIC: CHAR_T *, size_t, CHAR_T **, size_t *, regex_t *, u_int)); + * PUBLIC: int re_compile(SCR *, + * PUBLIC: CHAR_T *, size_t, CHAR_T **, size_t *, regex_t *, u_int); */ int re_compile(SCR *sp, CHAR_T *ptrn, size_t plen, CHAR_T **ptrnp, size_t *lenp, regex_t *rep, u_int flags) @@ -1280,7 +1280,7 @@ re_cscope_conv(SCR *sp, CHAR_T **ptrnp, size_t *plenp, int *replacedp) * re_error -- * Report a regular expression error. * - * PUBLIC: void re_error __P((SCR *, int, regex_t *)); + * PUBLIC: void re_error(SCR *, int, regex_t *); */ void re_error(SCR *sp, int errcode, regex_t *preg) @@ -1396,7 +1396,7 @@ re_sub( case '5': case '6': case '7': case '8': case '9': no = *rp++ - '0'; subzero: if (match[no].rm_so == -1 || - match[no].rm_eo == -1) + match[no].rm_eo == -1) break; mlen = match[no].rm_eo - match[no].rm_so; for (t = ip + match[no].rm_so; mlen--; ++t) diff --git a/ex/ex_tag.c b/ex/ex_tag.c index 4ef03fb37d35..172e5e204d55 100644 --- a/ex/ex_tag.c +++ b/ex/ex_tag.c @@ -36,24 +36,24 @@ static const char sccsid[] = "$Id: ex_tag.c,v 10.54 2012/04/12 07:17:30 zy Exp $ #include "../vi/vi.h" #include "tag.h" -static char *binary_search __P((char *, char *, char *)); -static int compare __P((char *, char *, char *)); -static void ctag_file __P((SCR *, TAGF *, char *, char **, size_t *)); -static int ctag_search __P((SCR *, CHAR_T *, size_t, char *)); -static int ctag_sfile __P((SCR *, TAGF *, TAGQ *, char *)); -static TAGQ *ctag_slist __P((SCR *, CHAR_T *)); -static char *linear_search __P((char *, char *, char *, long)); -static int tag_copy __P((SCR *, TAG *, TAG **)); -static int tag_pop __P((SCR *, TAGQ *, int)); -static int tagf_copy __P((SCR *, TAGF *, TAGF **)); -static int tagf_free __P((SCR *, TAGF *)); -static int tagq_copy __P((SCR *, TAGQ *, TAGQ **)); +static char *binary_search(char *, char *, char *); +static int compare(char *, char *, char *); +static void ctag_file(SCR *, TAGF *, char *, char **, size_t *); +static int ctag_search(SCR *, CHAR_T *, size_t, char *); +static int ctag_sfile(SCR *, TAGF *, TAGQ *, char *); +static TAGQ *ctag_slist(SCR *, CHAR_T *); +static char *linear_search(char *, char *, char *, long); +static int tag_copy(SCR *, TAG *, TAG **); +static int tag_pop(SCR *, TAGQ *, int); +static int tagf_copy(SCR *, TAGF *, TAGF **); +static int tagf_free(SCR *, TAGF *); +static int tagq_copy(SCR *, TAGQ *, TAGQ **); /* * ex_tag_first -- * The tag code can be entered from main, e.g., "vi -t tag". * - * PUBLIC: int ex_tag_first __P((SCR *, CHAR_T *)); + * PUBLIC: int ex_tag_first(SCR *, CHAR_T *); */ int ex_tag_first(SCR *sp, CHAR_T *tagarg) @@ -86,7 +86,7 @@ ex_tag_first(SCR *sp, CHAR_T *tagarg) * * Enter a new TAGQ context based on a ctag string. * - * PUBLIC: int ex_tag_push __P((SCR *, EXCMD *)); + * PUBLIC: int ex_tag_push(SCR *, EXCMD *); */ int ex_tag_push(SCR *sp, EXCMD *cmdp) @@ -137,7 +137,7 @@ ex_tag_push(SCR *sp, EXCMD *cmdp) * ex_tag_next -- * Switch context to the next TAG. * - * PUBLIC: int ex_tag_next __P((SCR *, EXCMD *)); + * PUBLIC: int ex_tag_next(SCR *, EXCMD *); */ int ex_tag_next(SCR *sp, EXCMD *cmdp) @@ -177,7 +177,7 @@ ex_tag_next(SCR *sp, EXCMD *cmdp) * ex_tag_prev -- * Switch context to the next TAG. * - * PUBLIC: int ex_tag_prev __P((SCR *, EXCMD *)); + * PUBLIC: int ex_tag_prev(SCR *, EXCMD *); */ int ex_tag_prev(SCR *sp, EXCMD *cmdp) @@ -217,7 +217,7 @@ ex_tag_prev(SCR *sp, EXCMD *cmdp) * ex_tag_nswitch -- * Switch context to the specified TAG. * - * PUBLIC: int ex_tag_nswitch __P((SCR *, TAG *, int)); + * PUBLIC: int ex_tag_nswitch(SCR *, TAG *, int); */ int ex_tag_nswitch(SCR *sp, TAG *tp, int force) @@ -251,7 +251,7 @@ ex_tag_nswitch(SCR *sp, TAG *tp, int force) * ex_tag_Nswitch -- * Switch context to the specified TAG in a new screen. * - * PUBLIC: int ex_tag_Nswitch __P((SCR *, TAG *, int)); + * PUBLIC: int ex_tag_Nswitch(SCR *, TAG *, int); */ int ex_tag_Nswitch(SCR *sp, TAG *tp, int force) @@ -305,7 +305,7 @@ ex_tag_Nswitch(SCR *sp, TAG *tp, int force) * * Pop to a previous TAGQ context. * - * PUBLIC: int ex_tag_pop __P((SCR *, EXCMD *)); + * PUBLIC: int ex_tag_pop(SCR *, EXCMD *); */ int ex_tag_pop(SCR *sp, EXCMD *cmdp) @@ -384,7 +384,7 @@ filearg: arglen = strlen(arg); * ex_tag_top -- :tagt[op][!] * Clear the tag stack. * - * PUBLIC: int ex_tag_top __P((SCR *, EXCMD *)); + * PUBLIC: int ex_tag_top(SCR *, EXCMD *); */ int ex_tag_top(SCR *sp, EXCMD *cmdp) @@ -459,7 +459,7 @@ tag_pop(SCR *sp, TAGQ *dtqp, int force) * ex_tag_display -- * Display the list of tags. * - * PUBLIC: int ex_tag_display __P((SCR *)); + * PUBLIC: int ex_tag_display(SCR *); */ int ex_tag_display(SCR *sp) @@ -536,7 +536,7 @@ ex_tag_display(SCR *sp) * ex_tag_copy -- * Copy a screen's tag structures. * - * PUBLIC: int ex_tag_copy __P((SCR *, SCR *)); + * PUBLIC: int ex_tag_copy(SCR *, SCR *); */ int ex_tag_copy(SCR *orig, SCR *sp) @@ -677,7 +677,7 @@ tagf_free(SCR *sp, TAGF *tfp) * tagq_free -- * Free a TAGQ structure (and associated TAG structures). * - * PUBLIC: int tagq_free __P((SCR *, TAGQ *)); + * PUBLIC: int tagq_free(SCR *, TAGQ *); */ int tagq_free(SCR *sp, TAGQ *tqp) @@ -702,7 +702,7 @@ tagq_free(SCR *sp, TAGQ *tqp) } /* - * PUBLIC: int tagq_push __P((SCR*, TAGQ*, int, int )); + * PUBLIC: int tagq_push(SCR*, TAGQ*, int, int ); */ int tagq_push(SCR *sp, TAGQ *tqp, int new_screen, int force) @@ -814,7 +814,7 @@ tagq_push(SCR *sp, TAGQ *tqp, int new_screen, int force) * tag_msg * A few common messages. * - * PUBLIC: void tag_msg __P((SCR *, tagmsg_t, char *)); + * PUBLIC: void tag_msg(SCR *, tagmsg_t, char *); */ void tag_msg(SCR *sp, tagmsg_t msg, char *tag) @@ -839,7 +839,7 @@ tag_msg(SCR *sp, tagmsg_t msg, char *tag) * ex_tagf_alloc -- * Create a new list of ctag files. * - * PUBLIC: int ex_tagf_alloc __P((SCR *, char *)); + * PUBLIC: int ex_tagf_alloc(SCR *, char *); */ int ex_tagf_alloc(SCR *sp, char *str) @@ -881,7 +881,7 @@ ex_tagf_alloc(SCR *sp, char *str) * ex_tag_free -- * Free the ex tag information. * - * PUBLIC: int ex_tag_free __P((SCR *)); + * PUBLIC: int ex_tag_free(SCR *); */ int ex_tag_free(SCR *sp) @@ -1241,9 +1241,9 @@ ctag_file(SCR *sp, TAGF *tfp, char *name, char **dirp, size_t *dlenp) while (p < back && *p++ != '\n') continue; static char * -binary_search(register char *string, register char *front, register char *back) +binary_search(char *string, char *front, char *back) { - register char *p; + char *p; p = front + (back - front) / 2; SKIP_PAST_NEWLINE(p, back); @@ -1304,7 +1304,7 @@ linear_search(char *string, char *front, char *back, long tl) * However, historic programs did use spaces, and, I got complaints. */ static int -compare(register char *s1, register char *s2, register char *back) +compare(char *s1, char *s2, char *back) { for (; *s1 && s2 < back && (*s2 != '\t' && *s2 != ' '); ++s1, ++s2) if (*s1 != *s2) diff --git a/ex/ex_txt.c b/ex/ex_txt.c index 21d9f4412654..4e62a7ecde8c 100644 --- a/ex/ex_txt.c +++ b/ex/ex_txt.c @@ -44,14 +44,14 @@ static const char sccsid[] = "$Id: ex_txt.c,v 10.23 2001/06/25 15:19:21 skimo Ex * characters remaining when failure occurred. */ -static int txt_dent __P((SCR *, TEXT *)); -static void txt_prompt __P((SCR *, TEXT *, ARG_CHAR_T, u_int32_t)); +static int txt_dent(SCR *, TEXT *); +static void txt_prompt(SCR *, TEXT *, ARG_CHAR_T, u_int32_t); /* * ex_txt -- * Get lines from the terminal for ex. * - * PUBLIC: int ex_txt __P((SCR *, TEXTH *, ARG_CHAR_T, u_int32_t)); + * PUBLIC: int ex_txt(SCR *, TEXTH *, ARG_CHAR_T, u_int32_t); */ int ex_txt(SCR *sp, TEXTH *tiqh, ARG_CHAR_T prompt, u_int32_t flags) diff --git a/ex/ex_undo.c b/ex/ex_undo.c index 9e4cd7977559..32f35fd58333 100644 --- a/ex/ex_undo.c +++ b/ex/ex_undo.c @@ -28,7 +28,7 @@ static const char sccsid[] = "$Id: ex_undo.c,v 10.7 2001/06/25 15:19:21 skimo Ex * ex_undo -- u * Undo the last change. * - * PUBLIC: int ex_undo __P((SCR *, EXCMD *)); + * PUBLIC: int ex_undo(SCR *, EXCMD *); */ int ex_undo(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_usage.c b/ex/ex_usage.c index 9a20ce18903d..b28d8a57271d 100644 --- a/ex/ex_usage.c +++ b/ex/ex_usage.c @@ -31,7 +31,7 @@ static const char sccsid[] = "$Id: ex_usage.c,v 10.16 2011/12/21 19:26:48 zy Exp * ex_help -- :help * Display help message. * - * PUBLIC: int ex_help __P((SCR *, EXCMD *)); + * PUBLIC: int ex_help(SCR *, EXCMD *); */ int ex_help(SCR *sp, EXCMD *cmdp) @@ -52,7 +52,7 @@ ex_help(SCR *sp, EXCMD *cmdp) * ex_usage -- :exusage [cmd] * Display ex usage strings. * - * PUBLIC: int ex_usage __P((SCR *, EXCMD *)); + * PUBLIC: int ex_usage(SCR *, EXCMD *); */ int ex_usage(SCR *sp, EXCMD *cmdp) @@ -133,7 +133,7 @@ ex_usage(SCR *sp, EXCMD *cmdp) * ex_viusage -- :viusage [key] * Display vi usage strings. * - * PUBLIC: int ex_viusage __P((SCR *, EXCMD *)); + * PUBLIC: int ex_viusage(SCR *, EXCMD *); */ int ex_viusage(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_util.c b/ex/ex_util.c index 2e56a068d8ff..6071fe2db9c8 100644 --- a/ex/ex_util.c +++ b/ex/ex_util.c @@ -31,7 +31,7 @@ static const char sccsid[] = "$Id: ex_util.c,v 10.32 2001/06/25 15:19:21 skimo E * ex_cinit -- * Create an EX command structure. * - * PUBLIC: void ex_cinit __P((SCR *, EXCMD *, int, int, recno_t, recno_t, int)); + * PUBLIC: void ex_cinit(SCR *, EXCMD *, int, int, recno_t, recno_t, int); */ void ex_cinit(SCR *sp, EXCMD *cmdp, int cmd_id, int naddr, recno_t lno1, recno_t lno2, int force) @@ -51,7 +51,7 @@ ex_cinit(SCR *sp, EXCMD *cmdp, int cmd_id, int naddr, recno_t lno1, recno_t lno2 * ex_getline -- * Return a line from the file. * - * PUBLIC: int ex_getline __P((SCR *, FILE *, size_t *)); + * PUBLIC: int ex_getline(SCR *, FILE *, size_t *); */ int ex_getline(SCR *sp, FILE *fp, size_t *lenp) @@ -91,7 +91,7 @@ ex_getline(SCR *sp, FILE *fp, size_t *lenp) * ex_ncheck -- * Check for more files to edit. * - * PUBLIC: int ex_ncheck __P((SCR *, int)); + * PUBLIC: int ex_ncheck(SCR *, int); */ int ex_ncheck(SCR *sp, int force) @@ -120,7 +120,7 @@ ex_ncheck(SCR *sp, int force) * ex_init -- * Init the screen for ex. * - * PUBLIC: int ex_init __P((SCR *)); + * PUBLIC: int ex_init(SCR *); */ int ex_init(SCR *sp) @@ -145,7 +145,7 @@ ex_init(SCR *sp) * ex_emsg -- * Display a few common ex and vi error messages. * - * PUBLIC: void ex_wemsg __P((SCR *, CHAR_T *, exm_t)); + * PUBLIC: void ex_wemsg(SCR *, CHAR_T *, exm_t); */ void ex_wemsg(SCR* sp, CHAR_T *p, exm_t which) @@ -162,7 +162,7 @@ ex_wemsg(SCR* sp, CHAR_T *p, exm_t which) * ex_emsg -- * Display a few common ex and vi error messages. * - * PUBLIC: void ex_emsg __P((SCR *, char *, exm_t)); + * PUBLIC: void ex_emsg(SCR *, char *, exm_t); */ void ex_emsg(SCR *sp, char *p, exm_t which) diff --git a/ex/ex_version.c b/ex/ex_version.c index 4f0a17d714f8..dc18aa1a9aeb 100644 --- a/ex/ex_version.c +++ b/ex/ex_version.c @@ -28,7 +28,7 @@ static const char sccsid[] = "$Id: ex_version.c,v 10.32 2001/06/25 15:19:22 skim * ex_version -- :version * Display the program version. * - * PUBLIC: int ex_version __P((SCR *, EXCMD *)); + * PUBLIC: int ex_version(SCR *, EXCMD *); */ int ex_version(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_visual.c b/ex/ex_visual.c index f913c71d81fc..bfad97c6ea31 100644 --- a/ex/ex_visual.c +++ b/ex/ex_visual.c @@ -31,7 +31,7 @@ static const char sccsid[] = "$Id: ex_visual.c,v 10.16 2001/08/29 11:04:13 skimo * ex_visual -- :[line] vi[sual] [^-.+] [window_size] [flags] * Switch to visual mode. * - * PUBLIC: int ex_visual __P((SCR *, EXCMD *)); + * PUBLIC: int ex_visual(SCR *, EXCMD *); */ int ex_visual(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_write.c b/ex/ex_write.c index 1f94a632ed5b..18a578ca816c 100644 --- a/ex/ex_write.c +++ b/ex/ex_write.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "$Id: ex_write.c,v 10.41 2011/12/02 01:07:06 zy Exp $"; +static const char sccsid[] = "$Id: ex_write.c,v 10.43 2015/04/03 15:18:45 zy Exp $"; #endif /* not lint */ #include @@ -25,19 +25,18 @@ static const char sccsid[] = "$Id: ex_write.c,v 10.41 2011/12/02 01:07:06 zy Exp #include #include #include -#include #include #include "../common/common.h" enum which {WN, WQ, WRITE, XIT}; -static int exwr __P((SCR *, EXCMD *, enum which)); +static int exwr(SCR *, EXCMD *, enum which); /* * ex_wn -- :wn[!] [>>] [file] * Write to a file and switch to the next one. * - * PUBLIC: int ex_wn __P((SCR *, EXCMD *)); + * PUBLIC: int ex_wn(SCR *, EXCMD *); */ int ex_wn(SCR *sp, EXCMD *cmdp) @@ -57,7 +56,7 @@ ex_wn(SCR *sp, EXCMD *cmdp) * ex_wq -- :wq[!] [>>] [file] * Write to a file and quit. * - * PUBLIC: int ex_wq __P((SCR *, EXCMD *)); + * PUBLIC: int ex_wq(SCR *, EXCMD *); */ int ex_wq(SCR *sp, EXCMD *cmdp) @@ -83,7 +82,7 @@ ex_wq(SCR *sp, EXCMD *cmdp) * :write [!] [cmd] * Write to a file. * - * PUBLIC: int ex_write __P((SCR *, EXCMD *)); + * PUBLIC: int ex_write(SCR *, EXCMD *); */ int ex_write(SCR *sp, EXCMD *cmdp) @@ -96,7 +95,7 @@ ex_write(SCR *sp, EXCMD *cmdp) * ex_xit -- :x[it]! [file] * Write out any modifications and quit. * - * PUBLIC: int ex_xit __P((SCR *, EXCMD *)); + * PUBLIC: int ex_xit(SCR *, EXCMD *); */ int ex_xit(SCR *sp, EXCMD *cmdp) @@ -279,8 +278,8 @@ exwr(SCR *sp, EXCMD *cmdp, enum which cmd) * ex_writefp -- * Write a range of lines to a FILE *. * - * PUBLIC: int ex_writefp __P((SCR *, - * PUBLIC: char *, FILE *, MARK *, MARK *, u_long *, u_long *, int)); + * PUBLIC: int ex_writefp(SCR *, + * PUBLIC: char *, FILE *, MARK *, MARK *, u_long *, u_long *, int); */ int ex_writefp(SCR *sp, char *name, FILE *fp, MARK *fm, MARK *tm, u_long *nlno, u_long *nch, int silent) @@ -291,11 +290,7 @@ ex_writefp(SCR *sp, char *name, FILE *fp, MARK *fm, MARK *tm, u_long *nlno, u_lo recno_t fline, tline, lcnt; size_t len; int rval; - char *msg; - CHAR_T *p; - char *f; - size_t flen; - int isutf16; + char *msg, *p; gp = sp->gp; fline = fm->lno; @@ -324,17 +319,7 @@ ex_writefp(SCR *sp, char *name, FILE *fp, MARK *fm, MARK *tm, u_long *nlno, u_lo ccnt = 0; lcnt = 0; msg = "253|Writing..."; - - if (O_ISSET(sp, O_FILEENCODING)) { - isutf16 = !strncasecmp(O_STR(sp, O_FILEENCODING), "utf-16", 6); - isutf16 += !strncasecmp(O_STR(sp, O_FILEENCODING), "utf-16le", 8); - } else isutf16 = 0; - - if (tline != 0) { - if (isutf16 == 1 && fwrite("\xfe\xff", 1, 2, fp) != 2) - goto err; - if (isutf16 == 2 && fwrite("\xff\xfe", 1, 2, fp) != 2) - goto err; + if (tline != 0) for (; fline <= tline; ++fline, ++lcnt) { /* Caller has to provide any interrupt message. */ if ((lcnt + 1) % INTERRUPT_CHECK == 0) { @@ -346,31 +331,17 @@ ex_writefp(SCR *sp, char *name, FILE *fp, MARK *fm, MARK *tm, u_long *nlno, u_lo msg = NULL; } } - if (db_get(sp, fline, DBG_FATAL, &p, &len)) + if (db_rget(sp, fline, &p, &len)) goto err; - INT2FILE(sp, p, len, f, flen); - if (fwrite(f, 1, flen, fp) != flen) + if (fwrite(p, 1, len, fp) != len) goto err; ccnt += len; - /* UTF-16 w/o BOM is big-endian */ - switch (isutf16) { - case 1: /* UTF-16BE */ - if (fwrite("\0\x0a", 1, 2, fp) != 2) - goto done; + if (putc('\n', fp) != '\n') break; - case 2: /* UTF-16LE */ - if (fwrite("\x0a\0", 1, 2, fp) != 2) - goto done; - break; - default: - if (putc('\n', fp) != '\n') - goto done; - } ++ccnt; } - } -done: if (fflush(fp)) + if (fflush(fp)) goto err; /* * XXX diff --git a/ex/ex_yank.c b/ex/ex_yank.c index 262c78f978bc..5d1be5a8800d 100644 --- a/ex/ex_yank.c +++ b/ex/ex_yank.c @@ -27,7 +27,7 @@ static const char sccsid[] = "$Id: ex_yank.c,v 10.8 2001/06/25 15:19:22 skimo Ex * ex_yank -- :[line [,line]] ya[nk] [buffer] [count] * Yank the lines into a buffer. * - * PUBLIC: int ex_yank __P((SCR *, EXCMD *)); + * PUBLIC: int ex_yank(SCR *, EXCMD *); */ int ex_yank(SCR *sp, EXCMD *cmdp) diff --git a/ex/ex_z.c b/ex/ex_z.c index 18a78590ded5..fff80d8d282b 100644 --- a/ex/ex_z.c +++ b/ex/ex_z.c @@ -29,7 +29,7 @@ static const char sccsid[] = "$Id: ex_z.c,v 10.12 2001/06/25 15:19:22 skimo Exp * ex_z -- :[line] z [^-.+=] [count] [flags] * Adjust window. * - * PUBLIC: int ex_z __P((SCR *, EXCMD *)); + * PUBLIC: int ex_z(SCR *, EXCMD *); */ int ex_z(SCR *sp, EXCMD *cmdp) @@ -54,11 +54,7 @@ ex_z(SCR *sp, EXCMD *cmdp) if (FL_ISSET(cmdp->iflags, E_C_COUNT)) cnt = cmdp->count; else -#ifdef HISTORICAL_PRACTICE - cnt = O_VAL(sp, O_SCROLL) * 2; -#else cnt = O_VAL(sp, O_WINDOW) - 1; -#endif equals = 0; eofcheck = 0; diff --git a/ex/extern.h b/ex/extern.h index f54548b4cf09..ed1e1b793172 100644 --- a/ex/extern.h +++ b/ex/extern.h @@ -1,130 +1,130 @@ -int ex __P((SCR **)); -int ex_cmd __P((SCR *)); -int ex_range __P((SCR *, EXCMD *, int *)); -int ex_is_abbrev __P((CHAR_T *, size_t)); -int ex_is_unmap __P((CHAR_T *, size_t)); +int ex(SCR **); +int ex_cmd(SCR *); +int ex_range(SCR *, EXCMD *, int *); +int ex_is_abbrev(CHAR_T *, size_t); +int ex_is_unmap(CHAR_T *, size_t); void ex_badaddr - __P((SCR *, EXCMDLIST const *, enum badaddr, enum nresult)); -int ex_abbr __P((SCR *, EXCMD *)); -int ex_unabbr __P((SCR *, EXCMD *)); -int ex_append __P((SCR *, EXCMD *)); -int ex_change __P((SCR *, EXCMD *)); -int ex_insert __P((SCR *, EXCMD *)); -int ex_next __P((SCR *, EXCMD *)); -int ex_prev __P((SCR *, EXCMD *)); -int ex_rew __P((SCR *, EXCMD *)); -int ex_args __P((SCR *, EXCMD *)); -char **ex_buildargv __P((SCR *, EXCMD *, char *)); -int argv_init __P((SCR *, EXCMD *)); -int argv_exp0 __P((SCR *, EXCMD *, CHAR_T *, size_t)); -int argv_exp1 __P((SCR *, EXCMD *, CHAR_T *, size_t, int)); -int argv_exp2 __P((SCR *, EXCMD *, CHAR_T *, size_t)); -int argv_exp3 __P((SCR *, EXCMD *, CHAR_T *, size_t)); -int argv_flt_ex __P((SCR *, EXCMD *, CHAR_T *, size_t)); -int argv_free __P((SCR *)); -int argv_flt_path __P((SCR *, EXCMD *, CHAR_T *, size_t)); -CHAR_T *argv_esc __P((SCR *, EXCMD *, CHAR_T *, size_t)); -CHAR_T *argv_uesc __P((SCR *, EXCMD *, CHAR_T *, size_t)); -int ex_at __P((SCR *, EXCMD *)); -int ex_bang __P((SCR *, EXCMD *)); -int ex_cd __P((SCR *, EXCMD *)); -int ex_cscope __P((SCR *, EXCMD *)); -int cscope_end __P((SCR *)); -int cscope_display __P((SCR *)); -int cscope_search __P((SCR *, TAGQ *, TAG *)); -int ex_delete __P((SCR *, EXCMD *)); -int ex_display __P((SCR *, EXCMD *)); -int ex_edit __P((SCR *, EXCMD *)); -int ex_equal __P((SCR *, EXCMD *)); -int ex_file __P((SCR *, EXCMD *)); -int ex_filter __P((SCR *, - EXCMD *, MARK *, MARK *, MARK *, CHAR_T *, enum filtertype)); -int ex_global __P((SCR *, EXCMD *)); -int ex_v __P((SCR *, EXCMD *)); -int ex_g_insdel __P((SCR *, lnop_t, recno_t)); -int ex_screen_copy __P((SCR *, SCR *)); -int ex_screen_end __P((SCR *)); -int ex_optchange __P((SCR *, int, char *, u_long *)); -int ex_exrc __P((SCR *)); -int ex_run_str __P((SCR *, char *, CHAR_T *, size_t, int, int)); -int ex_join __P((SCR *, EXCMD *)); -int ex_map __P((SCR *, EXCMD *)); -int ex_unmap __P((SCR *, EXCMD *)); -int ex_mark __P((SCR *, EXCMD *)); -int ex_mkexrc __P((SCR *, EXCMD *)); -int ex_copy __P((SCR *, EXCMD *)); -int ex_move __P((SCR *, EXCMD *)); -int ex_open __P((SCR *, EXCMD *)); -int ex_preserve __P((SCR *, EXCMD *)); -int ex_recover __P((SCR *, EXCMD *)); -int ex_list __P((SCR *, EXCMD *)); -int ex_number __P((SCR *, EXCMD *)); -int ex_pr __P((SCR *, EXCMD *)); -int ex_print __P((SCR *, EXCMD *, MARK *, MARK *, u_int32_t)); -int ex_ldisplay __P((SCR *, const CHAR_T *, size_t, size_t, u_int)); -int ex_scprint __P((SCR *, MARK *, MARK *)); -int ex_printf __P((SCR *, const char *, ...)); -int ex_puts __P((SCR *, const char *)); -int ex_fflush __P((SCR *sp)); -int ex_put __P((SCR *, EXCMD *)); -int ex_quit __P((SCR *, EXCMD *)); -int ex_read __P((SCR *, EXCMD *)); -int ex_readfp __P((SCR *, char *, FILE *, MARK *, recno_t *, int)); -int ex_bg __P((SCR *, EXCMD *)); -int ex_fg __P((SCR *, EXCMD *)); -int ex_resize __P((SCR *, EXCMD *)); -int ex_sdisplay __P((SCR *)); -int ex_script __P((SCR *, EXCMD *)); -int sscr_exec __P((SCR *, recno_t)); -int sscr_input __P((SCR *)); -int sscr_end __P((SCR *)); -int ex_set __P((SCR *, EXCMD *)); -int ex_shell __P((SCR *, EXCMD *)); -int ex_exec_proc __P((SCR *, EXCMD *, char *, const char *, int)); -int proc_wait __P((SCR *, long, const char *, int, int)); -int ex_shiftl __P((SCR *, EXCMD *)); -int ex_shiftr __P((SCR *, EXCMD *)); -int ex_source __P((SCR *, EXCMD *)); -int ex_stop __P((SCR *, EXCMD *)); -int ex_s __P((SCR *, EXCMD *)); -int ex_subagain __P((SCR *, EXCMD *)); -int ex_subtilde __P((SCR *, EXCMD *)); -int re_compile __P((SCR *, - CHAR_T *, size_t, CHAR_T **, size_t *, regex_t *, u_int)); -void re_error __P((SCR *, int, regex_t *)); -int ex_tag_first __P((SCR *, CHAR_T *)); -int ex_tag_push __P((SCR *, EXCMD *)); -int ex_tag_next __P((SCR *, EXCMD *)); -int ex_tag_prev __P((SCR *, EXCMD *)); -int ex_tag_nswitch __P((SCR *, TAG *, int)); -int ex_tag_Nswitch __P((SCR *, TAG *, int)); -int ex_tag_pop __P((SCR *, EXCMD *)); -int ex_tag_top __P((SCR *, EXCMD *)); -int ex_tag_display __P((SCR *)); -int ex_tag_copy __P((SCR *, SCR *)); -int tagq_free __P((SCR *, TAGQ *)); -int tagq_push __P((SCR*, TAGQ*, int, int )); -void tag_msg __P((SCR *, tagmsg_t, char *)); -int ex_tagf_alloc __P((SCR *, char *)); -int ex_tag_free __P((SCR *)); -int ex_txt __P((SCR *, TEXTH *, ARG_CHAR_T, u_int32_t)); -int ex_undo __P((SCR *, EXCMD *)); -int ex_help __P((SCR *, EXCMD *)); -int ex_usage __P((SCR *, EXCMD *)); -int ex_viusage __P((SCR *, EXCMD *)); -void ex_cinit __P((SCR *, EXCMD *, int, int, recno_t, recno_t, int)); -int ex_getline __P((SCR *, FILE *, size_t *)); -int ex_ncheck __P((SCR *, int)); -int ex_init __P((SCR *)); -void ex_wemsg __P((SCR *, CHAR_T *, exm_t)); -void ex_emsg __P((SCR *, char *, exm_t)); -int ex_version __P((SCR *, EXCMD *)); -int ex_visual __P((SCR *, EXCMD *)); -int ex_wn __P((SCR *, EXCMD *)); -int ex_wq __P((SCR *, EXCMD *)); -int ex_write __P((SCR *, EXCMD *)); -int ex_xit __P((SCR *, EXCMD *)); -int ex_writefp __P((SCR *, - char *, FILE *, MARK *, MARK *, u_long *, u_long *, int)); -int ex_yank __P((SCR *, EXCMD *)); -int ex_z __P((SCR *, EXCMD *)); + (SCR *, EXCMDLIST const *, enum badaddr, enum nresult); +int ex_abbr(SCR *, EXCMD *); +int ex_unabbr(SCR *, EXCMD *); +int ex_append(SCR *, EXCMD *); +int ex_change(SCR *, EXCMD *); +int ex_insert(SCR *, EXCMD *); +int ex_next(SCR *, EXCMD *); +int ex_prev(SCR *, EXCMD *); +int ex_rew(SCR *, EXCMD *); +int ex_args(SCR *, EXCMD *); +char **ex_buildargv(SCR *, EXCMD *, char *); +int argv_init(SCR *, EXCMD *); +int argv_exp0(SCR *, EXCMD *, CHAR_T *, size_t); +int argv_exp1(SCR *, EXCMD *, CHAR_T *, size_t, int); +int argv_exp2(SCR *, EXCMD *, CHAR_T *, size_t); +int argv_exp3(SCR *, EXCMD *, CHAR_T *, size_t); +int argv_flt_ex(SCR *, EXCMD *, CHAR_T *, size_t); +int argv_free(SCR *); +int argv_flt_path(SCR *, EXCMD *, CHAR_T *, size_t); +CHAR_T *argv_esc(SCR *, EXCMD *, CHAR_T *, size_t); +CHAR_T *argv_uesc(SCR *, EXCMD *, CHAR_T *, size_t); +int ex_at(SCR *, EXCMD *); +int ex_bang(SCR *, EXCMD *); +int ex_cd(SCR *, EXCMD *); +int ex_cscope(SCR *, EXCMD *); +int cscope_end(SCR *); +int cscope_display(SCR *); +int cscope_search(SCR *, TAGQ *, TAG *); +int ex_delete(SCR *, EXCMD *); +int ex_display(SCR *, EXCMD *); +int ex_edit(SCR *, EXCMD *); +int ex_equal(SCR *, EXCMD *); +int ex_file(SCR *, EXCMD *); +int ex_filter(SCR *, + EXCMD *, MARK *, MARK *, MARK *, CHAR_T *, enum filtertype); +int ex_global(SCR *, EXCMD *); +int ex_v(SCR *, EXCMD *); +int ex_g_insdel(SCR *, lnop_t, recno_t); +int ex_screen_copy(SCR *, SCR *); +int ex_screen_end(SCR *); +int ex_optchange(SCR *, int, char *, u_long *); +int ex_exrc(SCR *); +int ex_run_str(SCR *, char *, CHAR_T *, size_t, int, int); +int ex_join(SCR *, EXCMD *); +int ex_map(SCR *, EXCMD *); +int ex_unmap(SCR *, EXCMD *); +int ex_mark(SCR *, EXCMD *); +int ex_mkexrc(SCR *, EXCMD *); +int ex_copy(SCR *, EXCMD *); +int ex_move(SCR *, EXCMD *); +int ex_open(SCR *, EXCMD *); +int ex_preserve(SCR *, EXCMD *); +int ex_recover(SCR *, EXCMD *); +int ex_list(SCR *, EXCMD *); +int ex_number(SCR *, EXCMD *); +int ex_pr(SCR *, EXCMD *); +int ex_print(SCR *, EXCMD *, MARK *, MARK *, u_int32_t); +int ex_ldisplay(SCR *, const CHAR_T *, size_t, size_t, u_int); +int ex_scprint(SCR *, MARK *, MARK *); +int ex_printf(SCR *, const char *, ...); +int ex_puts(SCR *, const char *); +int ex_fflush(SCR *sp); +int ex_put(SCR *, EXCMD *); +int ex_quit(SCR *, EXCMD *); +int ex_read(SCR *, EXCMD *); +int ex_readfp(SCR *, char *, FILE *, MARK *, recno_t *, int); +int ex_bg(SCR *, EXCMD *); +int ex_fg(SCR *, EXCMD *); +int ex_resize(SCR *, EXCMD *); +int ex_sdisplay(SCR *); +int ex_script(SCR *, EXCMD *); +int sscr_exec(SCR *, recno_t); +int sscr_input(SCR *); +int sscr_end(SCR *); +int ex_set(SCR *, EXCMD *); +int ex_shell(SCR *, EXCMD *); +int ex_exec_proc(SCR *, EXCMD *, char *, const char *, int); +int proc_wait(SCR *, long, const char *, int, int); +int ex_shiftl(SCR *, EXCMD *); +int ex_shiftr(SCR *, EXCMD *); +int ex_source(SCR *, EXCMD *); +int ex_stop(SCR *, EXCMD *); +int ex_s(SCR *, EXCMD *); +int ex_subagain(SCR *, EXCMD *); +int ex_subtilde(SCR *, EXCMD *); +int re_compile(SCR *, + CHAR_T *, size_t, CHAR_T **, size_t *, regex_t *, u_int); +void re_error(SCR *, int, regex_t *); +int ex_tag_first(SCR *, CHAR_T *); +int ex_tag_push(SCR *, EXCMD *); +int ex_tag_next(SCR *, EXCMD *); +int ex_tag_prev(SCR *, EXCMD *); +int ex_tag_nswitch(SCR *, TAG *, int); +int ex_tag_Nswitch(SCR *, TAG *, int); +int ex_tag_pop(SCR *, EXCMD *); +int ex_tag_top(SCR *, EXCMD *); +int ex_tag_display(SCR *); +int ex_tag_copy(SCR *, SCR *); +int tagq_free(SCR *, TAGQ *); +int tagq_push(SCR*, TAGQ*, int, int ); +void tag_msg(SCR *, tagmsg_t, char *); +int ex_tagf_alloc(SCR *, char *); +int ex_tag_free(SCR *); +int ex_txt(SCR *, TEXTH *, ARG_CHAR_T, u_int32_t); +int ex_undo(SCR *, EXCMD *); +int ex_help(SCR *, EXCMD *); +int ex_usage(SCR *, EXCMD *); +int ex_viusage(SCR *, EXCMD *); +void ex_cinit(SCR *, EXCMD *, int, int, recno_t, recno_t, int); +int ex_getline(SCR *, FILE *, size_t *); +int ex_ncheck(SCR *, int); +int ex_init(SCR *); +void ex_wemsg(SCR *, CHAR_T *, exm_t); +void ex_emsg(SCR *, char *, exm_t); +int ex_version(SCR *, EXCMD *); +int ex_visual(SCR *, EXCMD *); +int ex_wn(SCR *, EXCMD *); +int ex_wq(SCR *, EXCMD *); +int ex_write(SCR *, EXCMD *); +int ex_xit(SCR *, EXCMD *); +int ex_writefp(SCR *, + char *, FILE *, MARK *, MARK *, u_long *, u_long *, int); +int ex_yank(SCR *, EXCMD *); +int ex_z(SCR *, EXCMD *); diff --git a/ex/version.h b/ex/version.h index 295dd8e68b62..e079bc6ca88a 100644 --- a/ex/version.h +++ b/ex/version.h @@ -1 +1 @@ -#define VI_VERSION "2.1.1 (2012-10-07)" +#define VI_VERSION "2.1.3 (2015-04-08)" diff --git a/regex/COPYRIGHT b/regex/COPYRIGHT index 574f6bcec6c7..a0f83a48ebe5 100644 --- a/regex/COPYRIGHT +++ b/regex/COPYRIGHT @@ -32,11 +32,7 @@ to the following restrictions: * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * diff --git a/regex/cclass.h b/regex/cclass.h index f28bccdfafcc..e635dcd17e6f 100644 --- a/regex/cclass.h +++ b/regex/cclass.h @@ -16,11 +16,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * diff --git a/regex/cname.h b/regex/cname.h index da69843df9de..60656d257217 100644 --- a/regex/cname.h +++ b/regex/cname.h @@ -16,11 +16,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * diff --git a/regex/engine.c b/regex/engine.c index ad1c501067e3..069a473921c5 100644 --- a/regex/engine.c +++ b/regex/engine.c @@ -16,11 +16,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -92,12 +88,12 @@ extern "C" { #endif /* === engine.c === */ -static int matcher __P((struct re_guts *g, const RCHAR_T *string, size_t nmatch, regmatch_t pmatch[], int eflags)); -static const RCHAR_T *dissect __P((struct match *m, const RCHAR_T *start, const RCHAR_T *stop, sopno startst, sopno stopst)); -static const RCHAR_T *backref __P((struct match *m, const RCHAR_T *start, const RCHAR_T *stop, sopno startst, sopno stopst, sopno lev)); -static const RCHAR_T *fast __P((struct match *m, const RCHAR_T *start, const RCHAR_T *stop, sopno startst, sopno stopst)); -static const RCHAR_T *slow __P((struct match *m, const RCHAR_T *start, const RCHAR_T *stop, sopno startst, sopno stopst)); -static states step __P((struct re_guts *g, sopno start, sopno stop, states bef, int flag, RCHAR_T ch, states aft)); +static int matcher(struct re_guts *g, const RCHAR_T *string, size_t nmatch, regmatch_t pmatch[], int eflags); +static const RCHAR_T *dissect(struct match *m, const RCHAR_T *start, const RCHAR_T *stop, sopno startst, sopno stopst); +static const RCHAR_T *backref(struct match *m, const RCHAR_T *start, const RCHAR_T *stop, sopno startst, sopno stopst, sopno lev); +static const RCHAR_T *fast(struct match *m, const RCHAR_T *start, const RCHAR_T *stop, sopno startst, sopno stopst); +static const RCHAR_T *slow(struct match *m, const RCHAR_T *start, const RCHAR_T *stop, sopno startst, sopno stopst); +static states step(struct re_guts *g, sopno start, sopno stop, states bef, int flag, RCHAR_T ch, states aft); #define BOL (1) #define EOL (BOL+1) #define BOLEOL (BOL+2) @@ -105,13 +101,13 @@ static states step __P((struct re_guts *g, sopno start, sopno stop, states bef, #define BOW (BOL+4) #define EOW (BOL+5) #ifdef REDEBUG -static void print __P((struct match *m, char *caption, states st, int ch, FILE *d)); +static void print(struct match *m, char *caption, states st, int ch, FILE *d); #endif #ifdef REDEBUG -static void at __P((struct match *m, char *title, char *start, char *stop, sopno startst, sopno stopst)); +static void at(struct match *m, char *title, char *start, char *stop, sopno startst, sopno stopst); #endif #ifdef REDEBUG -static char *pchar __P((int ch)); +static char *pchar(int ch); #endif #ifdef __cplusplus @@ -131,24 +127,18 @@ static char *pchar __P((int ch)); /* - matcher - the actual matching engine - == static int matcher(register struct re_guts *g, const RCHAR_T *string, \ - == size_t nmatch, regmatch_t pmatch[], int eflags); */ static int /* 0 success, REG_NOMATCH failure */ -matcher(g, string, nmatch, pmatch, eflags) -register struct re_guts *g; -const RCHAR_T *string; -size_t nmatch; -regmatch_t pmatch[]; -int eflags; +matcher(struct re_guts *g, const RCHAR_T *string, size_t nmatch, + regmatch_t pmatch[], int eflags) { - register const RCHAR_T *endp; - register size_t i; + const RCHAR_T *endp; + size_t i; struct match mv; - register struct match *m = &mv; - register const RCHAR_T *dp; - register const sopno gf = g->firststate+1; /* +1 for OEND */ - register const sopno gl = g->laststate; + struct match *m = &mv; + const RCHAR_T *dp; + const sopno gf = g->firststate+1; /* +1 for OEND */ + const sopno gl = g->laststate; const RCHAR_T *start; const RCHAR_T *stop; @@ -297,30 +287,24 @@ int eflags; /* - dissect - figure out what matched what, no back references - == static const RCHAR_T *dissect(register struct match *m, const RCHAR_T *start, \ - == const RCHAR_T *stop, sopno startst, sopno stopst); */ static const RCHAR_T * /* == stop (success) always */ -dissect(m, start, stop, startst, stopst) -register struct match *m; -const RCHAR_T *start; -const RCHAR_T *stop; -sopno startst; -sopno stopst; +dissect(struct match *m, const RCHAR_T *start, const RCHAR_T *stop, + sopno startst, sopno stopst) { - register int i; - register sopno ss; /* start sop of current subRE */ - register sopno es; /* end sop of current subRE */ - register const RCHAR_T *sp; /* start of string matched by it */ - register const RCHAR_T *stp; /* string matched by it cannot pass here */ - register const RCHAR_T *rest; /* start of rest of string */ - register const RCHAR_T *tail; /* string unmatched by rest of RE */ - register sopno ssub; /* start sop of subsubRE */ - register sopno esub; /* end sop of subsubRE */ - register const RCHAR_T *ssp; /* start of string matched by subsubRE */ - register const RCHAR_T *sep; /* end of string matched by subsubRE */ - register const RCHAR_T *oldssp; /* previous ssp */ - register const RCHAR_T *dp; + int i; + sopno ss; /* start sop of current subRE */ + sopno es; /* end sop of current subRE */ + const RCHAR_T *sp; /* start of string matched by it */ + const RCHAR_T *stp; /* string matched by it cannot pass here */ + const RCHAR_T *rest; /* start of rest of string */ + const RCHAR_T *tail; /* string unmatched by rest of RE */ + sopno ssub; /* start sop of subsubRE */ + sopno esub; /* end sop of subsubRE */ + const RCHAR_T *ssp; /* start of string matched by subsubRE */ + const RCHAR_T *sep; /* end of string matched by subsubRE */ + const RCHAR_T *oldssp; /* previous ssp */ + const RCHAR_T *dp; AT("diss", start, stop, startst, stopst); sp = start; @@ -485,31 +469,24 @@ sopno stopst; /* - backref - figure out what matched what, figuring in back references - == static const RCHAR_T *backref(register struct match *m, const RCHAR_T *start, \ - == const RCHAR_T *stop, sopno startst, sopno stopst, sopno lev); */ static const RCHAR_T * /* == stop (success) or NULL (failure) */ -backref(m, start, stop, startst, stopst, lev) -register struct match *m; -const RCHAR_T *start; -const RCHAR_T *stop; -sopno startst; -sopno stopst; -sopno lev; /* PLUS nesting level */ +backref(struct match *m, const RCHAR_T *start, const RCHAR_T *stop, + sopno startst, sopno stopst, sopno lev) /* PLUS nesting level */ { - register int i; - register sopno ss; /* start sop of current subRE */ - register const RCHAR_T *sp; /* start of string matched by it */ - register sopno ssub; /* start sop of subsubRE */ - register sopno esub; /* end sop of subsubRE */ - register const RCHAR_T *ssp; /* start of string matched by subsubRE */ - register const RCHAR_T *dp; - register size_t len; - register int hard; - register sop s; - register RCHAR_T d; - register regoff_t offsave; - register cset *cs; + int i; + sopno ss; /* start sop of current subRE */ + const RCHAR_T *sp; /* start of string matched by it */ + sopno ssub; /* start sop of subsubRE */ + sopno esub; /* end sop of subsubRE */ + const RCHAR_T *ssp; /* start of string matched by subsubRE */ + const RCHAR_T *dp; + size_t len; + int hard; + sop s; + RCHAR_T d; + regoff_t offsave; + cset *cs; AT("back", start, stop, startst, stopst); sp = start; @@ -698,26 +675,20 @@ sopno lev; /* PLUS nesting level */ /* - fast - step through the string at top speed - == static const RCHAR_T *fast(register struct match *m, const RCHAR_T *start, \ - == const RCHAR_T *stop, sopno startst, sopno stopst); */ static const RCHAR_T * /* where tentative match ended, or NULL */ -fast(m, start, stop, startst, stopst) -register struct match *m; -const RCHAR_T *start; -const RCHAR_T *stop; -sopno startst; -sopno stopst; +fast(struct match *m, const RCHAR_T *start, const RCHAR_T *stop, sopno startst, + sopno stopst) { - register states st = m->st; - register states fresh = m->fresh; - register states tmp = m->tmp; - register const RCHAR_T *p = start; - register RCHAR_T c = (start == m->beginp) ? OUT : *(start-1); - register RCHAR_T lastc; /* previous c */ - register int flag; - register int i; - register const RCHAR_T *coldp; /* last p after which no match was underway */ + states st = m->st; + states fresh = m->fresh; + states tmp = m->tmp; + const RCHAR_T *p = start; + RCHAR_T c = (start == m->beginp) ? OUT : *(start-1); + RCHAR_T lastc; /* previous c */ + int flag; + int i; + const RCHAR_T *coldp; /* last p after which no match was underway */ CLEAR(st); SET1(st, startst); @@ -789,26 +760,20 @@ sopno stopst; /* - slow - step through the string more deliberately - == static const RCHAR_T *slow(register struct match *m, const RCHAR_T *start, \ - == const RCHAR_T *stop, sopno startst, sopno stopst); */ static const RCHAR_T * /* where it ended */ -slow(m, start, stop, startst, stopst) -register struct match *m; -const RCHAR_T *start; -const RCHAR_T *stop; -sopno startst; -sopno stopst; +slow(struct match *m, const RCHAR_T *start, const RCHAR_T *stop, sopno startst, + sopno stopst) { - register states st = m->st; - register states empty = m->empty; - register states tmp = m->tmp; - register const RCHAR_T *p = start; - register RCHAR_T c = (start == m->beginp) ? OUT : *(start-1); - register RCHAR_T lastc; /* previous c */ - register int flag; - register int i; - register const RCHAR_T *matchp; /* last p at which a match ended */ + states st = m->st; + states empty = m->empty; + states tmp = m->tmp; + const RCHAR_T *p = start; + RCHAR_T c = (start == m->beginp) ? OUT : *(start-1); + RCHAR_T lastc; /* previous c */ + int flag; + int i; + const RCHAR_T *matchp; /* last p at which a match ended */ AT("slow", start, stop, startst, stopst); CLEAR(st); @@ -876,32 +841,23 @@ sopno stopst; /* - step - map set of states reachable before char to set reachable after - == static states step(register struct re_guts *g, sopno start, sopno stop, \ - == register states bef, int flag, RCHAR_T ch, register states aft); - == #define BOL (1) - == #define EOL (BOL+1) - == #define BOLEOL (BOL+2) - == #define NOTHING (BOL+3) - == #define BOW (BOL+4) - == #define EOW (BOL+5) */ static states -step(g, start, stop, bef, flag, ch, aft) -register struct re_guts *g; -sopno start; /* start state within strip */ -sopno stop; /* state after stop state within strip */ -register states bef; /* states reachable before */ -int flag; /* NONCHAR flag */ -RCHAR_T ch; /* character code */ -register states aft; /* states already known reachable after */ +step(struct re_guts *g, + sopno start, /* start state within strip */ + sopno stop, /* state after stop state within strip */ + states bef, /* states reachable before */ + int flag, /* NONCHAR flag */ + RCHAR_T ch, /* character code */ + states aft) /* states already known reachable after */ { - register cset *cs; - register sop s; - register RCHAR_T d; - register sopno pc; - register onestate here; /* note, macros know this name */ - register sopno look; - register int i; + cset *cs; + sop s; + RCHAR_T d; + sopno pc; + onestate here; /* note, macros know this name */ + sopno look; + int i; for (pc = start, INIT(here, pc); pc != stop; pc++, INC(here)) { s = g->strip[pc]; @@ -1008,22 +964,13 @@ register states aft; /* states already known reachable after */ #ifdef REDEBUG /* - print - print a set of states - == #ifdef REDEBUG - == static void print(struct match *m, char *caption, states st, \ - == int ch, FILE *d); - == #endif */ static void -print(m, caption, st, ch, d) -struct match *m; -char *caption; -states st; -int ch; -FILE *d; +print(struct match *m, char *caption, states st, int ch, FILE *d) { - register struct re_guts *g = m->g; - register int i; - register int first = 1; + struct re_guts *g = m->g; + int i; + int first = 1; if (!(m->eflags®_TRACE)) return; @@ -1041,19 +988,10 @@ FILE *d; /* - at - print current situation - == #ifdef REDEBUG - == static void at(struct match *m, char *title, char *start, char *stop, \ - == sopno startst, sopno stopst); - == #endif */ static void -at(m, title, start, stop, startst, stopst) -struct match *m; -char *title; -char *start; -char *stop; -sopno startst; -sopno stopst; +at(struct match *m, char *title, char *start, char *stop, sopno startst, + sopno stopst) { if (!(m->eflags®_TRACE)) return; @@ -1067,9 +1005,6 @@ sopno stopst; #define PCHARDONE /* never again */ /* - pchar - make a character printable - == #ifdef REDEBUG - == static char *pchar(int ch); - == #endif * * Is this identical to regchar() over in debug.c? Well, yes. But a * duplicate here avoids having a debugging-capable regexec.o tied to @@ -1077,8 +1012,7 @@ sopno stopst; * the non-debug compilation anyway, so it doesn't matter much. */ static char * /* -> representation */ -pchar(ch) -int ch; +pchar(int ch) { static char pbuf[10]; diff --git a/regex/re_format.7 b/regex/re_format.7 index 61d1aeaa85f4..ca6f71debb5b 100644 --- a/regex/re_format.7 +++ b/regex/re_format.7 @@ -15,11 +15,7 @@ .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors +.\" 3. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" diff --git a/regex/regcomp.c b/regex/regcomp.c index 8f7438f28d8a..cec7ba079688 100644 --- a/regex/regcomp.c +++ b/regex/regcomp.c @@ -16,11 +16,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -82,50 +78,50 @@ extern "C" { #endif /* === regcomp.c === */ -static void p_ere __P((struct parse *p, int stop, size_t reclimit)); -static void p_ere_exp __P((struct parse *p, size_t reclimit)); -static void p_str __P((struct parse *p)); -static void p_bre __P((struct parse *p, int end1, int end2, size_t reclimit)); -static int p_simp_re __P((struct parse *p, int starordinary, size_t reclimit)); -static int p_count __P((struct parse *p)); -static void p_bracket __P((struct parse *p)); -static void p_b_term __P((struct parse *p, cset *cs)); -static void p_b_cclass __P((struct parse *p, cset *cs)); -static void p_b_eclass __P((struct parse *p, cset *cs)); -static char p_b_symbol __P((struct parse *p)); -static char p_b_coll_elem __P((struct parse *p, int endc)); -static char othercase __P((int ch)); -static void bothcases __P((struct parse *p, int ch)); -static void ordinary __P((struct parse *p, int ch)); -static void nonnewline __P((struct parse *p)); -static void repeat __P((struct parse *p, sopno start, int from, int to, size_t reclimit)); -static int seterr __P((struct parse *p, int e)); -static cset *allocset __P((struct parse *p)); -static void freeset __P((struct parse *p, cset *cs)); -static int freezeset __P((struct parse *p, cset *cs)); -static int firstch __P((struct parse *p, cset *cs)); -static int nch __P((struct parse *p, cset *cs)); -static void mcadd __P((struct parse *p, cset *cs, const char *cp)); +static void p_ere(struct parse *p, int stop, size_t reclimit); +static void p_ere_exp(struct parse *p, size_t reclimit); +static void p_str(struct parse *p); +static void p_bre(struct parse *p, int end1, int end2, size_t reclimit); +static int p_simp_re(struct parse *p, int starordinary, size_t reclimit); +static int p_count(struct parse *p); +static void p_bracket(struct parse *p); +static void p_b_term(struct parse *p, cset *cs); +static void p_b_cclass(struct parse *p, cset *cs); +static void p_b_eclass(struct parse *p, cset *cs); +static char p_b_symbol(struct parse *p); +static char p_b_coll_elem(struct parse *p, int endc); +static char othercase(int ch); +static void bothcases(struct parse *p, int ch); +static void ordinary(struct parse *p, int ch); +static void nonnewline(struct parse *p); +static void repeat(struct parse *p, sopno start, int from, int to, size_t reclimit); +static int seterr(struct parse *p, int e); +static cset *allocset(struct parse *p); +static void freeset(struct parse *p, cset *cs); +static int freezeset(struct parse *p, cset *cs); +static int firstch(struct parse *p, cset *cs); +static int nch(struct parse *p, cset *cs); +static void mcadd(struct parse *p, cset *cs, const char *cp); #ifdef notdef -static void mcsub __P((cset *cs, char *cp)); -static int mcin __P((cset *cs, char *cp)); -static char *mcfind __P((cset *cs, char *cp)); +static void mcsub(cset *cs, char *cp); +static int mcin(cset *cs, char *cp); +static char *mcfind(cset *cs, char *cp); #endif -static void mcinvert __P((struct parse *p, cset *cs)); -static void mccase __P((struct parse *p, cset *cs)); +static void mcinvert(struct parse *p, cset *cs); +static void mccase(struct parse *p, cset *cs); #ifdef notdef -static int isinsets __P((struct re_guts *g, int c)); -static int samesets __P((struct re_guts *g, int c1, int c2)); +static int isinsets(struct re_guts *g, int c); +static int samesets(struct re_guts *g, int c1, int c2); #endif -static void categorize __P((struct parse *p, struct re_guts *g)); -static sopno dupl __P((struct parse *p, sopno start, sopno finish)); -static void doemit __P((struct parse *p, sop op, size_t opnd)); -static void doinsert __P((struct parse *p, sop op, size_t opnd, sopno pos)); -static void dofwd __P((struct parse *p, sopno pos, sop value)); -static int enlarge __P((struct parse *p, sopno size)); -static void stripsnug __P((struct parse *p, struct re_guts *g)); -static void findmust __P((struct parse *p, struct re_guts *g)); -static sopno pluscount __P((struct parse *p, struct re_guts *g)); +static void categorize(struct parse *p, struct re_guts *g); +static sopno dupl(struct parse *p, sopno start, sopno finish); +static void doemit(struct parse *p, sop op, size_t opnd); +static void doinsert(struct parse *p, sop op, size_t opnd, sopno pos); +static void dofwd(struct parse *p, sopno pos, sop value); +static int enlarge(struct parse *p, sopno size); +static void stripsnug(struct parse *p, struct re_guts *g); +static void findmust(struct parse *p, struct re_guts *g); +static sopno pluscount(struct parse *p, struct re_guts *g); #ifdef __cplusplus } @@ -179,24 +175,15 @@ static int never = 0; /* for use in asserts; shuts lint up */ /* - regcomp - interface for parser and compilation - = extern int regcomp(regex_t *, const RCHAR_T *, int); - = #define REG_BASIC 0000 - = #define REG_EXTENDED 0001 - = #define REG_ICASE 0002 - = #define REG_NOSUB 0004 - = #define REG_NEWLINE 0010 - = #define REG_NOSPEC 0020 - = #define REG_PEND 0040 - = #define REG_DUMP 0200 */ int /* 0 success, otherwise REG_something */ regcomp(regex_t *preg, const RCHAR_T *pattern, int cflags) { struct parse pa; - register struct re_guts *g; - register struct parse *p = &pa; - register int i; - register size_t len; + struct re_guts *g; + struct parse *p = &pa; + int i; + size_t len; #ifdef REDEBUG # define GOODFLAGS(f) (f) #else @@ -257,7 +244,7 @@ regcomp(regex_t *preg, const RCHAR_T *pattern, int cflags) #if 0 g->ncategories = 1; /* category 0 is "everything else" */ g->categories = &g->catspace[-(CHAR_MIN)]; - (void) memset((char *)g->catspace, 0, NC*sizeof(cat_t)); + memset((char *)g->catspace, 0, NC*sizeof(cat_t)); #endif g->backrefs = 0; @@ -296,18 +283,16 @@ regcomp(regex_t *preg, const RCHAR_T *pattern, int cflags) /* - p_ere - ERE parser top level, concatenation and alternation - == static void p_ere(register struct parse *p, int stop, size_t reclimit); */ static void -p_ere(register struct parse *p, int stop, size_t reclimit) - +p_ere(struct parse *p, int stop, size_t reclimit) /* character this ERE should end at */ { - register char c; - register sopno prevback = 0; - register sopno prevfwd = 0; - register sopno conc; - register int first = 1; /* is this the first alternative? */ + char c; + sopno prevback = 0; + sopno prevfwd = 0; + sopno conc; + int first = 1; /* is this the first alternative? */ if (reclimit++ > RECLIMIT || p->error == REG_ESPACE) { p->error = REG_ESPACE; @@ -347,16 +332,15 @@ p_ere(register struct parse *p, int stop, size_t reclimit) /* - p_ere_exp - parse one subERE, an atom possibly followed by a repetition op - == static void p_ere_exp(register struct parse *p); */ static void -p_ere_exp(register struct parse *p, size_t reclimit) +p_ere_exp(struct parse *p, size_t reclimit) { - register char c; - register sopno pos; - register int count; - register int count2; - register sopno subno; + char c; + sopno pos; + int count; + int count2; + sopno subno; int wascaret = 0; assert(MORE()); /* caller should have ensured this */ @@ -495,10 +479,9 @@ p_ere_exp(register struct parse *p, size_t reclimit) /* - p_str - string (no metacharacters) "parser" - == static void p_str(register struct parse *p); */ static void -p_str(register struct parse *p) +p_str(struct parse *p) { (void)REQUIRE(MORE(), REG_EMPTY); while (MORE()) @@ -507,8 +490,6 @@ p_str(register struct parse *p) /* - p_bre - BRE parser top level, anchoring and concatenation - == static void p_bre(register struct parse *p, register int end1, \ - == register int end2, size_t reclimit); * Giving end1 as OUT essentially eliminates the end1/end2 check. * * This implementation is a bit of a kludge, in that a trailing $ is first @@ -518,14 +499,14 @@ p_str(register struct parse *p) * The amount of lookahead needed to avoid this kludge is excessive. */ static void -p_bre(register struct parse *p, register int end1, register int end2, size_t reclimit) - - /* first terminating character */ - /* second terminating character */ +p_bre(struct parse *p, + int end1, /* first terminating character */ + int end2, /* second terminating character */ + size_t reclimit) { - register sopno start; - register int first = 1; /* first subexpression? */ - register int wasdollar = 0; + sopno start; + int first = 1; /* first subexpression? */ + int wasdollar = 0; if (reclimit++ > RECLIMIT || p->error == REG_ESPACE) { p->error = REG_ESPACE; @@ -555,19 +536,18 @@ p_bre(register struct parse *p, register int end1, register int end2, size_t rec /* - p_simp_re - parse a simple RE, an atom possibly followed by a repetition - == static int p_simp_re(register struct parse *p, int starordinary, size_t reclimit); */ static int /* was the simple RE an unbackslashed $? */ -p_simp_re(register struct parse *p, int starordinary, size_t reclimit) - - /* is a leading * an ordinary character? */ +p_simp_re(struct parse *p, + int starordinary, /* is a leading * an ordinary character? */ + size_t reclimit) { - register int c; - register int count; - register int count2; - register sopno pos; - register int i; - register sopno subno; + int c; + int count; + int count2; + sopno pos; + int i; + sopno subno; int backsl; pos = HERE(); /* repetion op, if any, covers from here */ @@ -680,13 +660,12 @@ p_simp_re(register struct parse *p, int starordinary, size_t reclimit) /* - p_count - parse a repetition count - == static int p_count(register struct parse *p); */ static int /* the value */ -p_count(register struct parse *p) +p_count(struct parse *p) { - register int count = 0; - register int ndigits = 0; + int count = 0; + int ndigits = 0; while (MORE() && ISDIGIT((UCHAR_T)PEEK()) && count <= DUPMAX) { count = count*10 + (GETNEXT() - '0'); @@ -699,16 +678,15 @@ p_count(register struct parse *p) /* - p_bracket - parse a bracketed character list - == static void p_bracket(register struct parse *p); * * Note a significant property of this code: if the allocset() did SETERROR, * no set operations are done. */ static void -p_bracket(register struct parse *p) +p_bracket(struct parse *p) { - register cset *cs; - register int invert = 0; + cset *cs; + int invert = 0; static RCHAR_T bow[] = { '[', ':', '<', ':', ']', ']' }; static RCHAR_T eow[] = { '[', ':', '>', ':', ']', ']' }; @@ -744,8 +722,8 @@ p_bracket(register struct parse *p) return; if (p->g->cflags®_ICASE) { - register int i; - register int ci; + int i; + int ci; for (i = p->g->csetsize - 1; i >= 0; i--) if (CHIN(cs, i) && isalpha(i)) { @@ -757,7 +735,7 @@ p_bracket(register struct parse *p) mccase(p, cs); } if (invert) { - register int i; + int i; for (i = p->g->csetsize - 1; i >= 0; i--) if (CHIN(cs, i)) @@ -781,14 +759,13 @@ p_bracket(register struct parse *p) /* - p_b_term - parse one term of a bracketed character list - == static void p_b_term(register struct parse *p, register cset *cs); */ static void -p_b_term(register struct parse *p, register cset *cs) +p_b_term(struct parse *p, cset *cs) { - register char c; - register char start, finish; - register int i; + char c; + char start, finish; + int i; /* classify what we've got */ switch ((MORE()) ? PEEK() : '\0') { @@ -845,16 +822,15 @@ p_b_term(register struct parse *p, register cset *cs) /* - p_b_cclass - parse a character-class name and deal with it - == static void p_b_cclass(register struct parse *p, register cset *cs); */ static void -p_b_cclass(register struct parse *p, register cset *cs) +p_b_cclass(struct parse *p, cset *cs) { - register RCHAR_T *sp = p->next; - register struct cclass *cp; - register size_t len; - register const char *u; - register char c; + RCHAR_T *sp = p->next; + struct cclass *cp; + size_t len; + const char *u; + char c; while (MORE() && isalpha(PEEK())) NEXT(); @@ -877,14 +853,13 @@ p_b_cclass(register struct parse *p, register cset *cs) /* - p_b_eclass - parse an equivalence-class name and deal with it - == static void p_b_eclass(register struct parse *p, register cset *cs); * * This implementation is incomplete. xxx */ static void -p_b_eclass(register struct parse *p, register cset *cs) +p_b_eclass(struct parse *p, cset *cs) { - register char c; + char c; c = p_b_coll_elem(p, '='); CHadd(cs, c); @@ -892,12 +867,11 @@ p_b_eclass(register struct parse *p, register cset *cs) /* - p_b_symbol - parse a character or [..]ed multicharacter collating symbol - == static char p_b_symbol(register struct parse *p); */ static char /* value of symbol */ -p_b_symbol(register struct parse *p) +p_b_symbol(struct parse *p) { - register char value; + char value; (void)REQUIRE(MORE(), REG_EBRACK); if (!EATTWO('[', '.')) @@ -911,16 +885,15 @@ p_b_symbol(register struct parse *p) /* - p_b_coll_elem - parse a collating-element name and look it up - == static char p_b_coll_elem(register struct parse *p, int endc); */ static char /* value of collating element */ -p_b_coll_elem(register struct parse *p, int endc) +p_b_coll_elem(struct parse *p, int endc) /* name ended by endc,']' */ { - register RCHAR_T *sp = p->next; - register struct cname *cp; - register size_t len; + RCHAR_T *sp = p->next; + struct cname *cp; + size_t len; while (MORE() && !SEETWO(endc, ']')) NEXT(); @@ -940,7 +913,6 @@ p_b_coll_elem(register struct parse *p, int endc) /* - othercase - return the case counterpart of an alphabetic - == static char othercase(int ch); */ static char /* if no counterpart, return ch */ othercase(int ch) @@ -956,15 +928,14 @@ othercase(int ch) /* - bothcases - emit a dualcase version of a two-case character - == static void bothcases(register struct parse *p, int ch); * * Boy, is this implementation ever a kludge... */ static void -bothcases(register struct parse *p, int ch) +bothcases(struct parse *p, int ch) { - register RCHAR_T *oldnext = p->next; - register RCHAR_T *oldend = p->end; + RCHAR_T *oldnext = p->next; + RCHAR_T *oldend = p->end; RCHAR_T bracket[3]; assert(othercase(ch) != ch); /* p_bracket() would recurse */ @@ -981,13 +952,12 @@ bothcases(register struct parse *p, int ch) /* - ordinary - emit an ordinary character - == static void ordinary(register struct parse *p, register int ch); */ static void -ordinary(register struct parse *p, register int ch) +ordinary(struct parse *p, int ch) { /* - register cat_t *cap = p->g->categories; + cat_t *cap = p->g->categories; */ if ((p->g->cflags®_ICASE) && isalpha(ch) && othercase(ch) != ch) @@ -1003,15 +973,14 @@ ordinary(register struct parse *p, register int ch) /* - nonnewline - emit REG_NEWLINE version of OANY - == static void nonnewline(register struct parse *p); * * Boy, is this implementation ever a kludge... */ static void -nonnewline(register struct parse *p) +nonnewline(struct parse *p) { - register RCHAR_T *oldnext = p->next; - register RCHAR_T *oldend = p->end; + RCHAR_T *oldnext = p->next; + RCHAR_T *oldend = p->end; RCHAR_T bracket[4]; p->next = bracket; @@ -1028,21 +997,20 @@ nonnewline(register struct parse *p) /* - repeat - generate code for a bounded repetition, recursively if needed - == static void repeat(register struct parse *p, sopno start, int from, int to, size_t reclimit); */ static void -repeat(register struct parse *p, sopno start, int from, int to, size_t reclimit) - - /* operand from here to end of strip */ - /* repeated from this number */ - /* to this number of times (maybe INFINITY) */ +repeat(struct parse *p, + sopno start, /* operand from here to end of strip */ + int from, /* repeated from this number */ + int to, /* to this number of times (maybe INFINITY) */ + size_t reclimit) { - register sopno finish; + sopno finish; # define N 2 # define INF 3 # define REP(f, t) ((f)*8 + (t)) # define MAP(n) (((n) <= 1) ? (n) : ((n) == INFINITY) ? INF : N) - register sopno copy; + sopno copy; if (reclimit++ > RECLIMIT) p->error = REG_ESPACE; @@ -1104,10 +1072,9 @@ repeat(register struct parse *p, sopno start, int from, int to, size_t reclimit) /* - seterr - set an error condition - == static int seterr(register struct parse *p, int e); */ static int /* useless but makes type checking happy */ -seterr(register struct parse *p, int e) +seterr(struct parse *p, int e) { if (p->error == 0) /* keep earliest error condition */ p->error = e; @@ -1118,17 +1085,16 @@ seterr(register struct parse *p, int e) /* - allocset - allocate a set of characters for [] - == static cset *allocset(register struct parse *p); */ static cset * -allocset(register struct parse *p) +allocset(struct parse *p) { - register int no = p->g->ncsets++; - register size_t nc; - register size_t nbytes; - register cset *cs; - register size_t css = (size_t)p->g->csetsize; - register int i; + int no = p->g->ncsets++; + size_t nc; + size_t nbytes; + cset *cs; + size_t css = (size_t)p->g->csetsize; + int i; if (no >= p->ncsalloc) { /* need another column of space */ p->ncsalloc += CHAR_BIT; @@ -1152,7 +1118,7 @@ allocset(register struct parse *p) p->g->sets[i].ptr = p->g->setbits + css*(i/CHAR_BIT); } if (p->g->sets != NULL && p->g->setbits != NULL) - (void) memset((char *)p->g->setbits + (nbytes - css), + memset((char *)p->g->setbits + (nbytes - css), 0, css); else { oomem: @@ -1175,14 +1141,13 @@ allocset(register struct parse *p) /* - freeset - free a now-unused set - == static void freeset(register struct parse *p, register cset *cs); */ static void -freeset(register struct parse *p, register cset *cs) +freeset(struct parse *p, cset *cs) { - register size_t i; - register cset *top = &p->g->sets[p->g->ncsets]; - register size_t css = (size_t)p->g->csetsize; + size_t i; + cset *top = &p->g->sets[p->g->ncsets]; + size_t css = (size_t)p->g->csetsize; for (i = 0; i < css; i++) CHsub(cs, i); @@ -1192,7 +1157,6 @@ freeset(register struct parse *p, register cset *cs) /* - freezeset - final processing on a set of characters - == static int freezeset(register struct parse *p, register cset *cs); * * The main task here is merging identical sets. This is usually a waste * of time (although the hash code minimizes the overhead), but can win @@ -1201,13 +1165,13 @@ freeset(register struct parse *p, register cset *cs) * the same value! */ static int /* set number */ -freezeset(register struct parse *p, register cset *cs) +freezeset(struct parse *p, cset *cs) { - register uch h = cs->hash; - register size_t i; - register cset *top = &p->g->sets[p->g->ncsets]; - register cset *cs2; - register size_t css = (size_t)p->g->csetsize; + uch h = cs->hash; + size_t i; + cset *top = &p->g->sets[p->g->ncsets]; + cset *cs2; + size_t css = (size_t)p->g->csetsize; /* look for an earlier one which is the same */ for (cs2 = &p->g->sets[0]; cs2 < top; cs2++) @@ -1230,13 +1194,12 @@ freezeset(register struct parse *p, register cset *cs) /* - firstch - return first character in a set (which must have at least one) - == static int firstch(register struct parse *p, register cset *cs); */ static int /* character; there is no "none" value */ -firstch(register struct parse *p, register cset *cs) +firstch(struct parse *p, cset *cs) { - register size_t i; - register size_t css = (size_t)p->g->csetsize; + size_t i; + size_t css = (size_t)p->g->csetsize; for (i = 0; i < css; i++) if (CHIN(cs, i)) @@ -1247,14 +1210,13 @@ firstch(register struct parse *p, register cset *cs) /* - nch - number of characters in a set - == static int nch(register struct parse *p, register cset *cs); */ static int -nch(register struct parse *p, register cset *cs) +nch(struct parse *p, cset *cs) { - register size_t i; - register size_t css = (size_t)p->g->csetsize; - register int n = 0; + size_t i; + size_t css = (size_t)p->g->csetsize; + int n = 0; for (i = 0; i < css; i++) if (CHIN(cs, i)) @@ -1264,13 +1226,11 @@ nch(register struct parse *p, register cset *cs) /* - mcadd - add a collating element to a cset - == static void mcadd(register struct parse *p, register cset *cs, \ - == register char *cp); */ static void -mcadd(register struct parse *p, register cset *cs, register const char *cp) +mcadd(struct parse *p, cset *cs, const char *cp) { - register size_t oldend = cs->smultis; + size_t oldend = cs->smultis; void *np; cs->smultis += strlen(cp) + 1; @@ -1284,85 +1244,29 @@ mcadd(register struct parse *p, register cset *cs, register const char *cp) } cs->multis = np; - (void) strlcpy(cs->multis + oldend - 1, cp, cs->smultis - oldend + 1); + strlcpy(cs->multis + oldend - 1, cp, cs->smultis - oldend + 1); } -#ifdef notdef -/* - - mcsub - subtract a collating element from a cset - == static void mcsub(register cset *cs, register char *cp); - */ -static void -mcsub(register cset *cs, register char *cp) -{ - register char *fp = mcfind(cs, cp); - register size_t len = strlen(fp); - - assert(fp != NULL); - (void) memmove(fp, fp + len + 1, - cs->smultis - (fp + len + 1 - cs->multis)); - cs->smultis -= len; - - if (cs->smultis == 0) { - free(cs->multis); - cs->multis = NULL; - return; - } - - cs->multis = realloc(cs->multis, cs->smultis); - assert(cs->multis != NULL); -} - -/* - - mcin - is a collating element in a cset? - == static int mcin(register cset *cs, register char *cp); - */ -static int -mcin(register cset *cs, register char *cp) -{ - return(mcfind(cs, cp) != NULL); -} - -/* - - mcfind - find a collating element in a cset - == static char *mcfind(register cset *cs, register char *cp); - */ -static char * -mcfind(register cset *cs, register char *cp) -{ - register char *p; - - if (cs->multis == NULL) - return(NULL); - for (p = cs->multis; *p != '\0'; p += strlen(p) + 1) - if (strcmp(cp, p) == 0) - return(p); - return(NULL); -} -#endif - /* - mcinvert - invert the list of collating elements in a cset - == static void mcinvert(register struct parse *p, register cset *cs); * * This would have to know the set of possibilities. Implementation * is deferred. */ static void -mcinvert(register struct parse *p, register cset *cs) +mcinvert(struct parse *p, cset *cs) { assert(cs->multis == NULL); /* xxx */ } /* - mccase - add case counterparts of the list of collating elements in a cset - == static void mccase(register struct parse *p, register cset *cs); * * This would have to know the set of possibilities. Implementation * is deferred. */ static void -mccase(register struct parse *p, register cset *cs) +mccase(struct parse *p, cset *cs) { assert(cs->multis == NULL); /* xxx */ } @@ -1370,15 +1274,14 @@ mccase(register struct parse *p, register cset *cs) #ifdef notdef /* - isinsets - is this character in any sets? - == static int isinsets(register struct re_guts *g, int c); */ static int /* predicate */ -isinsets(register struct re_guts *g, int c) +isinsets(struct re_guts *g, int c) { - register uch *col; - register int i; - register int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT; - register unsigned uc = (unsigned char)c; + uch *col; + int i; + int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT; + unsigned uc = (unsigned char)c; for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize) if (col[uc] != 0) @@ -1388,16 +1291,15 @@ isinsets(register struct re_guts *g, int c) /* - samesets - are these two characters in exactly the same sets? - == static int samesets(register struct re_guts *g, int c1, int c2); */ static int /* predicate */ -samesets(register struct re_guts *g, int c1, int c2) +samesets(struct re_guts *g, int c1, int c2) { - register uch *col; - register int i; - register int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT; - register unsigned uc1 = (unsigned char)c1; - register unsigned uc2 = (unsigned char)c2; + uch *col; + int i; + int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT; + unsigned uc1 = (unsigned char)c1; + unsigned uc2 = (unsigned char)c2; for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize) if (col[uc1] != col[uc2]) @@ -1408,16 +1310,15 @@ samesets(register struct re_guts *g, int c1, int c2) /* - categorize - sort out character categories - == static void categorize(struct parse *p, register struct re_guts *g); */ static void -categorize(struct parse *p, register struct re_guts *g) +categorize(struct parse *p, struct re_guts *g) { #ifdef notdef - register cat_t *cats = g->categories; - register int c; - register int c2; - register cat_t cat; + cat_t *cats = g->categories; + int c; + int c2; + cat_t cat; /* avoid making error situations worse */ if (p->error != 0) @@ -1436,16 +1337,14 @@ categorize(struct parse *p, register struct re_guts *g) /* - dupl - emit a duplicate of a bunch of sops - == static sopno dupl(register struct parse *p, sopno start, sopno finish); */ static sopno /* start of duplicate */ -dupl(register struct parse *p, sopno start, sopno finish) - - /* from here */ - /* to this less one */ +dupl(struct parse *p, + sopno start, /* from here */ + sopno finish) /* to this less one */ { - register sopno ret = HERE(); - register sopno len = finish - start; + sopno ret = HERE(); + sopno len = finish - start; assert(finish >= start); if (len == 0) @@ -1463,14 +1362,13 @@ dupl(register struct parse *p, sopno start, sopno finish) /* - doemit - emit a strip operator - == static void doemit(register struct parse *p, sop op, size_t opnd); * * It might seem better to implement this as a macro with a function as * hard-case backup, but it's just too big and messy unless there are * some changes to the data structures. Maybe later. */ static void -doemit(register struct parse *p, sop op, size_t opnd) +doemit(struct parse *p, sop op, size_t opnd) { /* avoid making error situations worse */ if (p->error != 0) @@ -1492,15 +1390,14 @@ doemit(register struct parse *p, sop op, size_t opnd) /* - doinsert - insert a sop into the strip - == static void doinsert(register struct parse *p, sop op, size_t opnd, sopno pos); */ static void -doinsert(register struct parse *p, sop op, size_t opnd, sopno pos) +doinsert(struct parse *p, sop op, size_t opnd, sopno pos) { - register sopno sn; - register sop s; - register RCHAR_T d; - register int i; + sopno sn; + sop s; + RCHAR_T d; + int i; /* avoid making error situations worse */ if (p->error != 0) @@ -1533,10 +1430,9 @@ doinsert(register struct parse *p, sop op, size_t opnd, sopno pos) /* - dofwd - complete a forward reference - == static void dofwd(register struct parse *p, sopno pos, sop value); */ static void -dofwd(register struct parse *p, register sopno pos, sop value) +dofwd(struct parse *p, sopno pos, sop value) { /* avoid making error situations worse */ if (p->error != 0) @@ -1548,13 +1444,12 @@ dofwd(register struct parse *p, register sopno pos, sop value) /* - enlarge - enlarge the strip - == static int enlarge(register struct parse *p, sopno size); */ static int -enlarge(register struct parse *p, register sopno size) +enlarge(struct parse *p, sopno size) { - register sop *sp; - register RCHAR_T *dp; + sop *sp; + RCHAR_T *dp; sopno osize; if (p->ssize >= size) @@ -1581,10 +1476,9 @@ enlarge(register struct parse *p, register sopno size) /* - stripsnug - compact the strip - == static void stripsnug(register struct parse *p, register struct re_guts *g); */ static void -stripsnug(register struct parse *p, register struct re_guts *g) +stripsnug(struct parse *p, struct re_guts *g) { g->nstates = p->slen; g->strip = (sop *)realloc((char *)p->strip, @@ -1603,7 +1497,6 @@ stripsnug(register struct parse *p, register struct re_guts *g) /* - findmust - fill in must and mlen with longest mandatory literal string - == static void findmust(register struct parse *p, register struct re_guts *g); * * This algorithm could do fancy things like analyzing the operands of | * for common subsequences. Someday. This code is simple and finds most @@ -1612,19 +1505,19 @@ stripsnug(register struct parse *p, register struct re_guts *g) * Note that must and mlen got initialized during setup. */ static void -findmust(struct parse *p, register struct re_guts *g) +findmust(struct parse *p, struct re_guts *g) { - register sop *scans; - register RCHAR_T *scand; + sop *scans; + RCHAR_T *scand; sop *starts = 0; RCHAR_T *startd = NULL; - register sop *newstarts = 0; - register RCHAR_T *newstartd = NULL; - register sopno newlen; - register sop s; - register RCHAR_T d; - register RCHAR_T *cp; - register sopno i; + sop *newstarts = 0; + RCHAR_T *newstartd = NULL; + sopno newlen; + sop s; + RCHAR_T d; + RCHAR_T *cp; + sopno i; /* avoid making error situations worse */ if (p->error != 0) @@ -1704,15 +1597,14 @@ findmust(struct parse *p, register struct re_guts *g) /* - pluscount - count + nesting - == static sopno pluscount(register struct parse *p, register struct re_guts *g); */ static sopno /* nesting depth */ -pluscount(struct parse *p, register struct re_guts *g) +pluscount(struct parse *p, struct re_guts *g) { - register sop *scan; - register sop s; - register sopno plusnest = 0; - register sopno maxnest = 0; + sop *scan; + sop s; + sopno plusnest = 0; + sopno maxnest = 0; if (p->error != 0) return(0); /* there may not be an OEND */ diff --git a/regex/regerror.c b/regex/regerror.c index 5ff1f6b67b21..ad86119069d7 100644 --- a/regex/regerror.c +++ b/regex/regerror.c @@ -16,11 +16,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -59,7 +55,7 @@ extern "C" { #endif /* === regerror.c === */ -static char *regatoi __P((const regex_t *preg, char *localbuf)); +static char *regatoi(const regex_t *preg, char *localbuf); #ifdef __cplusplus } @@ -117,10 +113,10 @@ static struct rerr { size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size) { - register struct rerr *r; - register size_t len; - register int target = errcode &~ REG_ITOA; - register const char *s; + struct rerr *r; + size_t len; + int target = errcode &~ REG_ITOA; + const char *s; char convbuf[50]; if (errcode == REG_ATOI) @@ -144,7 +140,7 @@ regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size) len = strlen(s) + 1; if (errbuf_size > 0) { - (void) strlcpy(errbuf, s, errbuf_size); + strlcpy(errbuf, s, errbuf_size); } return(len); @@ -152,15 +148,14 @@ regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size) /* - regatoi - internal routine to implement REG_ATOI - == static char *regatoi(const regex_t *preg, char *localbuf); */ static char * regatoi(const regex_t *preg, char *localbuf) { #if 0 /* we don't seem to use this and it gives a warning. */ - register struct rerr *r; - register size_t siz; - register char *p; + struct rerr *r; + size_t siz; + char *p; for (r = rerrs; r->code != 0; r++) if (strcmp(r->name, preg->re_endp) == 0) diff --git a/regex/regex.3 b/regex/regex.3 index 2c17254c1a16..8646fd3ff92b 100644 --- a/regex/regex.3 +++ b/regex/regex.3 @@ -15,11 +15,7 @@ .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. -.\" 3. All advertising materials mentioning features or use of this software -.\" must display the following acknowledgement: -.\" This product includes software developed by the University of -.\" California, Berkeley and its contributors. -.\" 4. Neither the name of the University nor the names of its contributors +.\" 3. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" diff --git a/regex/regex.h b/regex/regex.h index cabd66b0528a..20ea7865c0a0 100644 --- a/regex/regex.h +++ b/regex/regex.h @@ -16,11 +16,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -100,10 +96,10 @@ typedef struct { #define REG_LARGE 01000 /* force large representation */ #define REG_BACKR 02000 /* force use of backref code */ -int regcomp __P((regex_t *, const RCHAR_T *, int)); -size_t regerror __P((int, const regex_t *, char *, size_t)); -int regexec __P((const regex_t *, - const RCHAR_T *, size_t, regmatch_t [], int)); -void regfree __P((regex_t *)); +int regcomp(regex_t *, const RCHAR_T *, int); +size_t regerror(int, const regex_t *, char *, size_t); +int regexec(const regex_t *, + const RCHAR_T *, size_t, regmatch_t [], int); +void regfree(regex_t *); #endif /* !_REGEX_H_ */ diff --git a/regex/regex2.h b/regex/regex2.h index 7c9352831c28..c3530633155d 100644 --- a/regex/regex2.h +++ b/regex/regex2.h @@ -16,11 +16,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * diff --git a/regex/regexec.c b/regex/regexec.c index 89ab2ca9786d..67abd01e5c87 100644 --- a/regex/regexec.c +++ b/regex/regexec.c @@ -16,11 +16,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -61,10 +57,6 @@ static char sccsid[] = "@(#)regexec.c 8.2 (Berkeley) 3/16/94"; #include "utils.h" #include "regex2.h" -#ifdef notdef -static int nope = 0; /* for use in asserts; shuts lint up */ -#endif - /* macros for manipulating states, small version */ #define states int #define states1 int /* for later use in regexec() decision */ @@ -157,9 +149,10 @@ static int nope = 0; /* for use in asserts; shuts lint up */ * have been prototyped. */ int /* 0 success, REG_NOMATCH failure */ -regexec(const regex_t *preg, const RCHAR_T *string, size_t nmatch, regmatch_t *pmatch, int eflags) +regexec(const regex_t *preg, const RCHAR_T *string, size_t nmatch, + regmatch_t *pmatch, int eflags) { - register struct re_guts *g = preg->re_g; + struct re_guts *g = preg->re_g; #ifdef REDEBUG # define GOODFLAGS(f) (f) #else diff --git a/regex/regfree.c b/regex/regfree.c index 61df17cb6664..33297686a9eb 100644 --- a/regex/regfree.c +++ b/regex/regfree.c @@ -16,11 +16,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -53,12 +49,11 @@ static char sccsid[] = "@(#)regfree.c 8.2 (Berkeley) 3/16/94"; /* - regfree - free everything - = extern void regfree(regex_t *); */ void regfree(regex_t *preg) { - register struct re_guts *g; + struct re_guts *g; if (preg->re_magic != MAGIC1) /* oops */ return; /* nice to complain, but hard */ diff --git a/regex/utils.h b/regex/utils.h index 4a6f57a3fe6c..75f061e59e46 100644 --- a/regex/utils.h +++ b/regex/utils.h @@ -16,11 +16,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * diff --git a/vi/extern.h b/vi/extern.h index 600caa673c95..8e145c6318ef 100644 --- a/vi/extern.h +++ b/vi/extern.h @@ -1,145 +1,145 @@ -int cs_init __P((SCR *, VCS *)); -int cs_next __P((SCR *, VCS *)); -int cs_fspace __P((SCR *, VCS *)); -int cs_fblank __P((SCR *, VCS *)); -int cs_prev __P((SCR *, VCS *)); -int cs_bblank __P((SCR *, VCS *)); -int v_at __P((SCR *, VICMD *)); -int v_chrepeat __P((SCR *, VICMD *)); -int v_chrrepeat __P((SCR *, VICMD *)); -int v_cht __P((SCR *, VICMD *)); -int v_chf __P((SCR *, VICMD *)); -int v_chT __P((SCR *, VICMD *)); -int v_chF __P((SCR *, VICMD *)); -int v_delete __P((SCR *, VICMD *)); -int v_again __P((SCR *, VICMD *)); -int v_exmode __P((SCR *, VICMD *)); -int v_join __P((SCR *, VICMD *)); -int v_shiftl __P((SCR *, VICMD *)); -int v_shiftr __P((SCR *, VICMD *)); -int v_suspend __P((SCR *, VICMD *)); -int v_switch __P((SCR *, VICMD *)); -int v_tagpush __P((SCR *, VICMD *)); -int v_tagpop __P((SCR *, VICMD *)); -int v_filter __P((SCR *, VICMD *)); -int v_ex __P((SCR *, VICMD *)); -int v_ecl_exec __P((SCR *)); -int v_increment __P((SCR *, VICMD *)); -int v_screen_copy __P((SCR *, SCR *)); -int v_screen_end __P((SCR *)); -int v_optchange __P((SCR *, int, char *, u_long *)); -int v_iA __P((SCR *, VICMD *)); -int v_ia __P((SCR *, VICMD *)); -int v_iI __P((SCR *, VICMD *)); -int v_ii __P((SCR *, VICMD *)); -int v_iO __P((SCR *, VICMD *)); -int v_io __P((SCR *, VICMD *)); -int v_change __P((SCR *, VICMD *)); -int v_Replace __P((SCR *, VICMD *)); -int v_subst __P((SCR *, VICMD *)); -int v_left __P((SCR *, VICMD *)); -int v_cfirst __P((SCR *, VICMD *)); -int v_first __P((SCR *, VICMD *)); -int v_ncol __P((SCR *, VICMD *)); -int v_zero __P((SCR *, VICMD *)); -int v_mark __P((SCR *, VICMD *)); -int v_bmark __P((SCR *, VICMD *)); -int v_fmark __P((SCR *, VICMD *)); -int v_emark __P((SCR *, VICMD *)); -int v_match __P((SCR *, VICMD *)); -int v_buildmcs __P((SCR *, char *)); -int v_paragraphf __P((SCR *, VICMD *)); -int v_paragraphb __P((SCR *, VICMD *)); -int v_buildps __P((SCR *, char *, char *)); -int v_Put __P((SCR *, VICMD *)); -int v_put __P((SCR *, VICMD *)); -int v_redraw __P((SCR *, VICMD *)); -int v_replace __P((SCR *, VICMD *)); -int v_right __P((SCR *, VICMD *)); -int v_dollar __P((SCR *, VICMD *)); -int v_screen __P((SCR *, VICMD *)); -int v_lgoto __P((SCR *, VICMD *)); -int v_home __P((SCR *, VICMD *)); -int v_middle __P((SCR *, VICMD *)); -int v_bottom __P((SCR *, VICMD *)); -int v_up __P((SCR *, VICMD *)); -int v_cr __P((SCR *, VICMD *)); -int v_down __P((SCR *, VICMD *)); -int v_hpageup __P((SCR *, VICMD *)); -int v_hpagedown __P((SCR *, VICMD *)); -int v_pagedown __P((SCR *, VICMD *)); -int v_pageup __P((SCR *, VICMD *)); -int v_lineup __P((SCR *, VICMD *)); -int v_linedown __P((SCR *, VICMD *)); -int v_searchb __P((SCR *, VICMD *)); -int v_searchf __P((SCR *, VICMD *)); -int v_searchN __P((SCR *, VICMD *)); -int v_searchn __P((SCR *, VICMD *)); -int v_searchw __P((SCR *, VICMD *)); -int v_correct __P((SCR *, VICMD *, int)); -int v_sectionf __P((SCR *, VICMD *)); -int v_sectionb __P((SCR *, VICMD *)); -int v_sentencef __P((SCR *, VICMD *)); -int v_sentenceb __P((SCR *, VICMD *)); -int v_status __P((SCR *, VICMD *)); -int v_tcmd __P((SCR *, VICMD *, ARG_CHAR_T, u_int)); -int v_txt __P((SCR *, VICMD *, MARK *, - const CHAR_T *, size_t, ARG_CHAR_T, recno_t, u_long, u_int32_t)); -int v_txt_auto __P((SCR *, recno_t, TEXT *, size_t, TEXT *)); -int v_ulcase __P((SCR *, VICMD *)); -int v_mulcase __P((SCR *, VICMD *)); -int v_Undo __P((SCR *, VICMD *)); -int v_undo __P((SCR *, VICMD *)); -void v_eof __P((SCR *, MARK *)); -void v_eol __P((SCR *, MARK *)); -void v_nomove __P((SCR *)); -void v_sof __P((SCR *, MARK *)); -void v_sol __P((SCR *)); -int v_isempty __P((CHAR_T *, size_t)); -void v_emsg __P((SCR *, char *, vim_t)); -int v_wordW __P((SCR *, VICMD *)); -int v_wordw __P((SCR *, VICMD *)); -int v_wordE __P((SCR *, VICMD *)); -int v_worde __P((SCR *, VICMD *)); -int v_wordB __P((SCR *, VICMD *)); -int v_wordb __P((SCR *, VICMD *)); -int v_xchar __P((SCR *, VICMD *)); -int v_Xchar __P((SCR *, VICMD *)); -int v_yank __P((SCR *, VICMD *)); -int v_z __P((SCR *, VICMD *)); -int vs_crel __P((SCR *, long)); -int v_zexit __P((SCR *, VICMD *)); -int vi __P((SCR **)); -int v_curword __P((SCR *)); -int vs_line __P((SCR *, SMAP *, size_t *, size_t *)); -int vs_number __P((SCR *)); -void vs_busy __P((SCR *, const char *, busy_t)); -void vs_home __P((SCR *)); -void vs_update __P((SCR *, const char *, const CHAR_T *)); -void vs_msg __P((SCR *, mtype_t, char *, size_t)); -int vs_ex_resolve __P((SCR *, int *)); -int vs_resolve __P((SCR *, SCR *, int)); -int vs_repaint __P((SCR *, EVENT *)); -int vs_refresh __P((SCR *, int)); -int vs_column __P((SCR *, size_t *)); -size_t vs_screens __P((SCR *, recno_t, size_t *)); -size_t vs_columns __P((SCR *, CHAR_T *, recno_t, size_t *, size_t *)); -size_t vs_rcm __P((SCR *, recno_t, int)); -size_t vs_colpos __P((SCR *, recno_t, size_t)); -int vs_change __P((SCR *, recno_t, lnop_t)); -int vs_sm_fill __P((SCR *, recno_t, pos_t)); -int vs_sm_scroll __P((SCR *, MARK *, recno_t, scroll_t)); -int vs_sm_1up __P((SCR *)); -int vs_sm_1down __P((SCR *)); -int vs_sm_next __P((SCR *, SMAP *, SMAP *)); -int vs_sm_prev __P((SCR *, SMAP *, SMAP *)); -int vs_sm_cursor __P((SCR *, SMAP **)); -int vs_sm_position __P((SCR *, MARK *, u_long, pos_t)); -recno_t vs_sm_nlines __P((SCR *, SMAP *, recno_t, size_t)); -int vs_split __P((SCR *, SCR *, int)); -int vs_vsplit __P((SCR *, SCR *)); -int vs_discard __P((SCR *, SCR **)); -int vs_fg __P((SCR *, SCR **, CHAR_T *, int)); -int vs_bg __P((SCR *)); -int vs_swap __P((SCR *, SCR **, char *)); -int vs_resize __P((SCR *, long, adj_t)); +int cs_init(SCR *, VCS *); +int cs_next(SCR *, VCS *); +int cs_fspace(SCR *, VCS *); +int cs_fblank(SCR *, VCS *); +int cs_prev(SCR *, VCS *); +int cs_bblank(SCR *, VCS *); +int v_at(SCR *, VICMD *); +int v_chrepeat(SCR *, VICMD *); +int v_chrrepeat(SCR *, VICMD *); +int v_cht(SCR *, VICMD *); +int v_chf(SCR *, VICMD *); +int v_chT(SCR *, VICMD *); +int v_chF(SCR *, VICMD *); +int v_delete(SCR *, VICMD *); +int v_again(SCR *, VICMD *); +int v_exmode(SCR *, VICMD *); +int v_join(SCR *, VICMD *); +int v_shiftl(SCR *, VICMD *); +int v_shiftr(SCR *, VICMD *); +int v_suspend(SCR *, VICMD *); +int v_switch(SCR *, VICMD *); +int v_tagpush(SCR *, VICMD *); +int v_tagpop(SCR *, VICMD *); +int v_filter(SCR *, VICMD *); +int v_ex(SCR *, VICMD *); +int v_ecl_exec(SCR *); +int v_increment(SCR *, VICMD *); +int v_screen_copy(SCR *, SCR *); +int v_screen_end(SCR *); +int v_optchange(SCR *, int, char *, u_long *); +int v_iA(SCR *, VICMD *); +int v_ia(SCR *, VICMD *); +int v_iI(SCR *, VICMD *); +int v_ii(SCR *, VICMD *); +int v_iO(SCR *, VICMD *); +int v_io(SCR *, VICMD *); +int v_change(SCR *, VICMD *); +int v_Replace(SCR *, VICMD *); +int v_subst(SCR *, VICMD *); +int v_left(SCR *, VICMD *); +int v_cfirst(SCR *, VICMD *); +int v_first(SCR *, VICMD *); +int v_ncol(SCR *, VICMD *); +int v_zero(SCR *, VICMD *); +int v_mark(SCR *, VICMD *); +int v_bmark(SCR *, VICMD *); +int v_fmark(SCR *, VICMD *); +int v_emark(SCR *, VICMD *); +int v_match(SCR *, VICMD *); +int v_buildmcs(SCR *, char *); +int v_paragraphf(SCR *, VICMD *); +int v_paragraphb(SCR *, VICMD *); +int v_buildps(SCR *, char *, char *); +int v_Put(SCR *, VICMD *); +int v_put(SCR *, VICMD *); +int v_redraw(SCR *, VICMD *); +int v_replace(SCR *, VICMD *); +int v_right(SCR *, VICMD *); +int v_dollar(SCR *, VICMD *); +int v_screen(SCR *, VICMD *); +int v_lgoto(SCR *, VICMD *); +int v_home(SCR *, VICMD *); +int v_middle(SCR *, VICMD *); +int v_bottom(SCR *, VICMD *); +int v_up(SCR *, VICMD *); +int v_cr(SCR *, VICMD *); +int v_down(SCR *, VICMD *); +int v_hpageup(SCR *, VICMD *); +int v_hpagedown(SCR *, VICMD *); +int v_pagedown(SCR *, VICMD *); +int v_pageup(SCR *, VICMD *); +int v_lineup(SCR *, VICMD *); +int v_linedown(SCR *, VICMD *); +int v_searchb(SCR *, VICMD *); +int v_searchf(SCR *, VICMD *); +int v_searchN(SCR *, VICMD *); +int v_searchn(SCR *, VICMD *); +int v_searchw(SCR *, VICMD *); +int v_correct(SCR *, VICMD *, int); +int v_sectionf(SCR *, VICMD *); +int v_sectionb(SCR *, VICMD *); +int v_sentencef(SCR *, VICMD *); +int v_sentenceb(SCR *, VICMD *); +int v_status(SCR *, VICMD *); +int v_tcmd(SCR *, VICMD *, ARG_CHAR_T, u_int); +int v_txt(SCR *, VICMD *, MARK *, + const CHAR_T *, size_t, ARG_CHAR_T, recno_t, u_long, u_int32_t); +int v_txt_auto(SCR *, recno_t, TEXT *, size_t, TEXT *); +int v_ulcase(SCR *, VICMD *); +int v_mulcase(SCR *, VICMD *); +int v_Undo(SCR *, VICMD *); +int v_undo(SCR *, VICMD *); +void v_eof(SCR *, MARK *); +void v_eol(SCR *, MARK *); +void v_nomove(SCR *); +void v_sof(SCR *, MARK *); +void v_sol(SCR *); +int v_isempty(CHAR_T *, size_t); +void v_emsg(SCR *, char *, vim_t); +int v_wordW(SCR *, VICMD *); +int v_wordw(SCR *, VICMD *); +int v_wordE(SCR *, VICMD *); +int v_worde(SCR *, VICMD *); +int v_wordB(SCR *, VICMD *); +int v_wordb(SCR *, VICMD *); +int v_xchar(SCR *, VICMD *); +int v_Xchar(SCR *, VICMD *); +int v_yank(SCR *, VICMD *); +int v_z(SCR *, VICMD *); +int vs_crel(SCR *, long); +int v_zexit(SCR *, VICMD *); +int vi(SCR **); +int v_curword(SCR *); +int vs_line(SCR *, SMAP *, size_t *, size_t *); +int vs_number(SCR *); +void vs_busy(SCR *, const char *, busy_t); +void vs_home(SCR *); +void vs_update(SCR *, const char *, const CHAR_T *); +void vs_msg(SCR *, mtype_t, char *, size_t); +int vs_ex_resolve(SCR *, int *); +int vs_resolve(SCR *, SCR *, int); +int vs_repaint(SCR *, EVENT *); +int vs_refresh(SCR *, int); +int vs_column(SCR *, size_t *); +size_t vs_screens(SCR *, recno_t, size_t *); +size_t vs_columns(SCR *, CHAR_T *, recno_t, size_t *, size_t *); +size_t vs_rcm(SCR *, recno_t, int); +size_t vs_colpos(SCR *, recno_t, size_t); +int vs_change(SCR *, recno_t, lnop_t); +int vs_sm_fill(SCR *, recno_t, pos_t); +int vs_sm_scroll(SCR *, MARK *, recno_t, scroll_t); +int vs_sm_1up(SCR *); +int vs_sm_1down(SCR *); +int vs_sm_next(SCR *, SMAP *, SMAP *); +int vs_sm_prev(SCR *, SMAP *, SMAP *); +int vs_sm_cursor(SCR *, SMAP **); +int vs_sm_position(SCR *, MARK *, u_long, pos_t); +recno_t vs_sm_nlines(SCR *, SMAP *, recno_t, size_t); +int vs_split(SCR *, SCR *, int); +int vs_vsplit(SCR *, SCR *); +int vs_discard(SCR *, SCR **); +int vs_fg(SCR *, SCR **, CHAR_T *, int); +int vs_bg(SCR *); +int vs_swap(SCR *, SCR **, char *); +int vs_resize(SCR *, long, adj_t); diff --git a/vi/getc.c b/vi/getc.c index deb3554a0abc..1d2dc2b627d4 100644 --- a/vi/getc.c +++ b/vi/getc.c @@ -40,7 +40,7 @@ static const char sccsid[] = "$Id: getc.c,v 10.13 2011/12/27 00:49:31 zy Exp $"; * cs_init -- * Initialize character stream routines. * - * PUBLIC: int cs_init __P((SCR *, VCS *)); + * PUBLIC: int cs_init(SCR *, VCS *); */ int cs_init(SCR *sp, VCS *csp) @@ -66,7 +66,7 @@ cs_init(SCR *sp, VCS *csp) * cs_next -- * Retrieve the next character. * - * PUBLIC: int cs_next __P((SCR *, VCS *)); + * PUBLIC: int cs_next(SCR *, VCS *); */ int cs_next(SCR *sp, VCS *csp) @@ -116,7 +116,7 @@ cs_next(SCR *sp, VCS *csp) * function -- once the other word routines are converted, they may have * to change. * - * PUBLIC: int cs_fspace __P((SCR *, VCS *)); + * PUBLIC: int cs_fspace(SCR *, VCS *); */ int cs_fspace(SCR *sp, VCS *csp) @@ -136,7 +136,7 @@ cs_fspace(SCR *sp, VCS *csp) * cs_fblank -- * Eat forward to the next non-whitespace character. * - * PUBLIC: int cs_fblank __P((SCR *, VCS *)); + * PUBLIC: int cs_fblank(SCR *, VCS *); */ int cs_fblank(SCR *sp, VCS *csp) @@ -156,7 +156,7 @@ cs_fblank(SCR *sp, VCS *csp) * cs_prev -- * Retrieve the previous character. * - * PUBLIC: int cs_prev __P((SCR *, VCS *)); + * PUBLIC: int cs_prev(SCR *, VCS *); */ int cs_prev(SCR *sp, VCS *csp) @@ -205,7 +205,7 @@ cs_prev(SCR *sp, VCS *csp) * cs_bblank -- * Eat backward to the next non-whitespace character. * - * PUBLIC: int cs_bblank __P((SCR *, VCS *)); + * PUBLIC: int cs_bblank(SCR *, VCS *); */ int cs_bblank(SCR *sp, VCS *csp) diff --git a/vi/v_at.c b/vi/v_at.c index 45757d4b4733..96e1616b732e 100644 --- a/vi/v_at.c +++ b/vi/v_at.c @@ -30,7 +30,7 @@ static const char sccsid[] = "$Id: v_at.c,v 10.11 2001/06/25 15:19:30 skimo Exp * v_at -- @ * Execute a buffer. * - * PUBLIC: int v_at __P((SCR *, VICMD *)); + * PUBLIC: int v_at(SCR *, VICMD *); */ int v_at(SCR *sp, VICMD *vp) diff --git a/vi/v_ch.c b/vi/v_ch.c index 04fb6af65272..86bd53247115 100644 --- a/vi/v_ch.c +++ b/vi/v_ch.c @@ -25,14 +25,14 @@ static const char sccsid[] = "$Id: v_ch.c,v 10.11 2011/12/02 19:49:50 zy Exp $"; #include "../common/common.h" #include "vi.h" -static void notfound __P((SCR *, ARG_CHAR_T)); -static void noprev __P((SCR *)); +static void notfound(SCR *, ARG_CHAR_T); +static void noprev(SCR *); /* * v_chrepeat -- [count]; * Repeat the last F, f, T or t search. * - * PUBLIC: int v_chrepeat __P((SCR *, VICMD *)); + * PUBLIC: int v_chrepeat(SCR *, VICMD *); */ int v_chrepeat(SCR *sp, VICMD *vp) @@ -61,7 +61,7 @@ v_chrepeat(SCR *sp, VICMD *vp) * v_chrrepeat -- [count], * Repeat the last F, f, T or t search in the reverse direction. * - * PUBLIC: int v_chrrepeat __P((SCR *, VICMD *)); + * PUBLIC: int v_chrrepeat(SCR *, VICMD *); */ int v_chrrepeat(SCR *sp, VICMD *vp) @@ -100,7 +100,7 @@ v_chrrepeat(SCR *sp, VICMD *vp) * Search forward in the line for the character before the next * occurrence of the specified character. * - * PUBLIC: int v_cht __P((SCR *, VICMD *)); + * PUBLIC: int v_cht(SCR *, VICMD *); */ int v_cht(SCR *sp, VICMD *vp) @@ -131,7 +131,7 @@ v_cht(SCR *sp, VICMD *vp) * Search forward in the line for the next occurrence of the * specified character. * - * PUBLIC: int v_chf __P((SCR *, VICMD *)); + * PUBLIC: int v_chf(SCR *, VICMD *); */ int v_chf(SCR *sp, VICMD *vp) @@ -188,7 +188,7 @@ empty: notfound(sp, key); * Search backward in the line for the character after the next * occurrence of the specified character. * - * PUBLIC: int v_chT __P((SCR *, VICMD *)); + * PUBLIC: int v_chT(SCR *, VICMD *); */ int v_chT(SCR *sp, VICMD *vp) @@ -213,7 +213,7 @@ v_chT(SCR *sp, VICMD *vp) * Search backward in the line for the next occurrence of the * specified character. * - * PUBLIC: int v_chF __P((SCR *, VICMD *)); + * PUBLIC: int v_chF(SCR *, VICMD *); */ int v_chF(SCR *sp, VICMD *vp) diff --git a/vi/v_delete.c b/vi/v_delete.c index b3b879e93dd3..b36808edd2f9 100644 --- a/vi/v_delete.c +++ b/vi/v_delete.c @@ -29,7 +29,7 @@ static const char sccsid[] = "$Id: v_delete.c,v 10.11 2001/06/25 15:19:31 skimo * [buffer][count]D * Delete a range of text. * - * PUBLIC: int v_delete __P((SCR *, VICMD *)); + * PUBLIC: int v_delete(SCR *, VICMD *); */ int v_delete(SCR *sp, VICMD *vp) diff --git a/vi/v_ex.c b/vi/v_ex.c index e5ac5731d074..c6c1133c78d6 100644 --- a/vi/v_ex.c +++ b/vi/v_ex.c @@ -27,17 +27,17 @@ static const char sccsid[] = "$Id: v_ex.c,v 10.61 2011/12/22 18:41:53 zy Exp $"; #include "../common/common.h" #include "vi.h" -static int v_ecl __P((SCR *)); -static int v_ecl_init __P((SCR *)); -static int v_ecl_log __P((SCR *, TEXT *)); -static int v_ex_done __P((SCR *, VICMD *)); -static int v_exec_ex __P((SCR *, VICMD *, EXCMD *)); +static int v_ecl(SCR *); +static int v_ecl_init(SCR *); +static int v_ecl_log(SCR *, TEXT *); +static int v_ex_done(SCR *, VICMD *); +static int v_exec_ex(SCR *, VICMD *, EXCMD *); /* * v_again -- & * Repeat the previous substitution. * - * PUBLIC: int v_again __P((SCR *, VICMD *)); + * PUBLIC: int v_again(SCR *, VICMD *); */ int v_again(SCR *sp, VICMD *vp) @@ -53,7 +53,7 @@ v_again(SCR *sp, VICMD *vp) * v_exmode -- Q * Switch the editor into EX mode. * - * PUBLIC: int v_exmode __P((SCR *, VICMD *)); + * PUBLIC: int v_exmode(SCR *, VICMD *); */ int v_exmode(SCR *sp, VICMD *vp) @@ -89,7 +89,7 @@ v_exmode(SCR *sp, VICMD *vp) * v_join -- [count]J * Join lines together. * - * PUBLIC: int v_join __P((SCR *, VICMD *)); + * PUBLIC: int v_join(SCR *, VICMD *); */ int v_join(SCR *sp, VICMD *vp) @@ -118,7 +118,7 @@ v_join(SCR *sp, VICMD *vp) * v_shiftl -- [count]motion * Shift lines right. * - * PUBLIC: int v_shiftr __P((SCR *, VICMD *)); + * PUBLIC: int v_shiftr(SCR *, VICMD *); */ int v_shiftr(SCR *sp, VICMD *vp) @@ -150,7 +150,7 @@ v_shiftr(SCR *sp, VICMD *vp) * v_suspend -- ^Z * Suspend vi. * - * PUBLIC: int v_suspend __P((SCR *, VICMD *)); + * PUBLIC: int v_suspend(SCR *, VICMD *); */ int v_suspend(SCR *sp, VICMD *vp) @@ -166,7 +166,7 @@ v_suspend(SCR *sp, VICMD *vp) * v_switch -- ^^ * Switch to the previous file. * - * PUBLIC: int v_switch __P((SCR *, VICMD *)); + * PUBLIC: int v_switch(SCR *, VICMD *); */ int v_switch(SCR *sp, VICMD *vp) @@ -199,7 +199,7 @@ v_switch(SCR *sp, VICMD *vp) * v_tagpush -- ^[ * Do a tag search on the cursor keyword. * - * PUBLIC: int v_tagpush __P((SCR *, VICMD *)); + * PUBLIC: int v_tagpush(SCR *, VICMD *); */ int v_tagpush(SCR *sp, VICMD *vp) @@ -215,7 +215,7 @@ v_tagpush(SCR *sp, VICMD *vp) * v_tagpop -- ^T * Pop the tags stack. * - * PUBLIC: int v_tagpop __P((SCR *, VICMD *)); + * PUBLIC: int v_tagpop(SCR *, VICMD *); */ int v_tagpop(SCR *sp, VICMD *vp) @@ -230,7 +230,7 @@ v_tagpop(SCR *sp, VICMD *vp) * v_filter -- [count]!motion command(s) * Run range through shell commands, replacing text. * - * PUBLIC: int v_filter __P((SCR *, VICMD *)); + * PUBLIC: int v_filter(SCR *, VICMD *); */ int v_filter(SCR *sp, VICMD *vp) @@ -319,7 +319,7 @@ v_exec_ex(SCR *sp, VICMD *vp, EXCMD *exp) * v_ex -- : * Execute a colon command line. * - * PUBLIC: int v_ex __P((SCR *, VICMD *)); + * PUBLIC: int v_ex(SCR *, VICMD *); */ int v_ex(SCR *sp, VICMD *vp) @@ -543,7 +543,7 @@ v_ecl(SCR *sp) * v_ecl_exec -- * Execute a command from a colon command-line window. * - * PUBLIC: int v_ecl_exec __P((SCR *)); + * PUBLIC: int v_ecl_exec(SCR *); */ int v_ecl_exec(SCR *sp) diff --git a/vi/v_increment.c b/vi/v_increment.c index 0a121a914c96..0293425cb4ab 100644 --- a/vi/v_increment.c +++ b/vi/v_increment.c @@ -41,13 +41,13 @@ static CHAR_T * const fmt[] = { L("%#0*lo"), }; -static void inc_err __P((SCR *, enum nresult)); +static void inc_err(SCR *, enum nresult); /* * v_increment -- [count]#[#+-] * Increment/decrement a keyword number. * - * PUBLIC: int v_increment __P((SCR *, VICMD *)); + * PUBLIC: int v_increment(SCR *, VICMD *); */ int v_increment(SCR *sp, VICMD *vp) diff --git a/vi/v_init.c b/vi/v_init.c index e47a821df9c4..a9966323f4a0 100644 --- a/vi/v_init.c +++ b/vi/v_init.c @@ -31,7 +31,7 @@ static const char sccsid[] = "$Id: v_init.c,v 10.10 2012/02/11 00:33:46 zy Exp $ * v_screen_copy -- * Copy vi screen. * - * PUBLIC: int v_screen_copy __P((SCR *, SCR *)); + * PUBLIC: int v_screen_copy(SCR *, SCR *); */ int v_screen_copy(SCR *orig, SCR *sp) @@ -79,7 +79,7 @@ v_screen_copy(SCR *orig, SCR *sp) * v_screen_end -- * End a vi screen. * - * PUBLIC: int v_screen_end __P((SCR *)); + * PUBLIC: int v_screen_end(SCR *); */ int v_screen_end(SCR *sp) @@ -110,7 +110,7 @@ v_screen_end(SCR *sp) * v_optchange -- * Handle change of options for vi. * - * PUBLIC: int v_optchange __P((SCR *, int, char *, u_long *)); + * PUBLIC: int v_optchange(SCR *, int, char *, u_long *); */ int v_optchange(SCR *sp, int offset, char *str, u_long *valp) diff --git a/vi/v_itxt.c b/vi/v_itxt.c index 8b263297aeb0..64460921f2f9 100644 --- a/vi/v_itxt.c +++ b/vi/v_itxt.c @@ -57,13 +57,13 @@ static const char sccsid[] = "$Id: v_itxt.c,v 10.21 2001/06/25 15:19:32 skimo Ex (void)log_cursor(sp); \ } -static u_int32_t set_txt_std __P((SCR *, VICMD *, u_int32_t)); +static u_int32_t set_txt_std(SCR *, VICMD *, u_int32_t); /* * v_iA -- [count]A * Append text to the end of the line. * - * PUBLIC: int v_iA __P((SCR *, VICMD *)); + * PUBLIC: int v_iA(SCR *, VICMD *); */ int v_iA(SCR *sp, VICMD *vp) @@ -83,7 +83,7 @@ v_iA(SCR *sp, VICMD *vp) * [count]A * Append text to the cursor position. * - * PUBLIC: int v_ia __P((SCR *, VICMD *)); + * PUBLIC: int v_ia(SCR *, VICMD *); */ int v_ia(SCR *sp, VICMD *vp) @@ -120,7 +120,7 @@ v_ia(SCR *sp, VICMD *vp) * v_iI -- [count]I * Insert text at the first nonblank. * - * PUBLIC: int v_iI __P((SCR *, VICMD *)); + * PUBLIC: int v_iI(SCR *, VICMD *); */ int v_iI(SCR *sp, VICMD *vp) @@ -139,7 +139,7 @@ v_iI(SCR *sp, VICMD *vp) * [count]I * Insert text at the cursor position. * - * PUBLIC: int v_ii __P((SCR *, VICMD *)); + * PUBLIC: int v_ii(SCR *, VICMD *); */ int v_ii(SCR *sp, VICMD *vp) @@ -166,13 +166,13 @@ v_ii(SCR *sp, VICMD *vp) } enum which { o_cmd, O_cmd }; -static int io __P((SCR *, VICMD *, enum which)); +static int io(SCR *, VICMD *, enum which); /* * v_iO -- [count]O * Insert text above this line. * - * PUBLIC: int v_iO __P((SCR *, VICMD *)); + * PUBLIC: int v_iO(SCR *, VICMD *); */ int v_iO(SCR *sp, VICMD *vp) @@ -184,7 +184,7 @@ v_iO(SCR *sp, VICMD *vp) * v_io -- [count]o * Insert text after this line. * - * PUBLIC: int v_io __P((SCR *, VICMD *)); + * PUBLIC: int v_io(SCR *, VICMD *); */ int v_io(SCR *sp, VICMD *vp) @@ -240,7 +240,7 @@ insert: p = L(""); * [buffer][count]S * Change command. * - * PUBLIC: int v_change __P((SCR *, VICMD *)); + * PUBLIC: int v_change(SCR *, VICMD *); */ int v_change(SCR *sp, VICMD *vp) @@ -380,7 +380,7 @@ v_change(SCR *sp, VICMD *vp) * v_Replace -- [count]R * Overwrite multiple characters. * - * PUBLIC: int v_Replace __P((SCR *, VICMD *)); + * PUBLIC: int v_Replace(SCR *, VICMD *); */ int v_Replace(SCR *sp, VICMD *vp) @@ -414,7 +414,7 @@ v_Replace(SCR *sp, VICMD *vp) * v_subst -- [buffer][count]s * Substitute characters. * - * PUBLIC: int v_subst __P((SCR *, VICMD *)); + * PUBLIC: int v_subst(SCR *, VICMD *); */ int v_subst(SCR *sp, VICMD *vp) diff --git a/vi/v_left.c b/vi/v_left.c index 2a8f6e61b83a..dd7ccb894876 100644 --- a/vi/v_left.c +++ b/vi/v_left.c @@ -28,7 +28,7 @@ static const char sccsid[] = "$Id: v_left.c,v 10.9 2001/06/25 15:19:32 skimo Exp * v_left -- [count]^H, [count]h * Move left by columns. * - * PUBLIC: int v_left __P((SCR *, VICMD *)); + * PUBLIC: int v_left(SCR *, VICMD *); */ int v_left(SCR *sp, VICMD *vp) @@ -66,7 +66,7 @@ v_left(SCR *sp, VICMD *vp) * v_cfirst -- [count]_ * Move to the first non-blank character in a line. * - * PUBLIC: int v_cfirst __P((SCR *, VICMD *)); + * PUBLIC: int v_cfirst(SCR *, VICMD *); */ int v_cfirst(SCR *sp, VICMD *vp) @@ -133,7 +133,7 @@ v_cfirst(SCR *sp, VICMD *vp) * v_first -- ^ * Move to the first non-blank character in this line. * - * PUBLIC: int v_first __P((SCR *, VICMD *)); + * PUBLIC: int v_first(SCR *, VICMD *); */ int v_first(SCR *sp, VICMD *vp) @@ -195,7 +195,7 @@ v_first(SCR *sp, VICMD *vp) * requested column is past EOL, move to EOL. The nasty part is * that we have to know character column widths to make this work. * - * PUBLIC: int v_ncol __P((SCR *, VICMD *)); + * PUBLIC: int v_ncol(SCR *, VICMD *); */ int v_ncol(SCR *sp, VICMD *vp) @@ -255,7 +255,7 @@ v_ncol(SCR *sp, VICMD *vp) * v_zero -- 0 * Move to the first column on this line. * - * PUBLIC: int v_zero __P((SCR *, VICMD *)); + * PUBLIC: int v_zero(SCR *, VICMD *); */ int v_zero(SCR *sp, VICMD *vp) diff --git a/vi/v_mark.c b/vi/v_mark.c index 39ed0aaae3be..2254fd334a46 100644 --- a/vi/v_mark.c +++ b/vi/v_mark.c @@ -26,13 +26,13 @@ static const char sccsid[] = "$Id: v_mark.c,v 10.12 2001/06/25 15:19:32 skimo Ex #include "vi.h" enum which {BQMARK, FQMARK}; -static int mark __P((SCR *, VICMD *, int, enum which)); +static int mark(SCR *, VICMD *, int, enum which); /* * v_mark -- m[a-z] * Set a mark. * - * PUBLIC: int v_mark __P((SCR *, VICMD *)); + * PUBLIC: int v_mark(SCR *, VICMD *); */ int v_mark(SCR *sp, VICMD *vp) @@ -53,7 +53,7 @@ v_mark(SCR *sp, VICMD *vp) * people don't know it and will be delighted that you are able to tell * them. * - * PUBLIC: int v_bmark __P((SCR *, VICMD *)); + * PUBLIC: int v_bmark(SCR *, VICMD *); */ int v_bmark(SCR *sp, VICMD *vp) @@ -67,7 +67,7 @@ v_bmark(SCR *sp, VICMD *vp) * * Move to the first nonblank character of the line containing the mark. * - * PUBLIC: int v_fmark __P((SCR *, VICMD *)); + * PUBLIC: int v_fmark(SCR *, VICMD *); */ int v_fmark(SCR *sp, VICMD *vp) @@ -79,7 +79,7 @@ v_fmark(SCR *sp, VICMD *vp) * v_emark -- * Mouse mark. * - * PUBLIC: int v_emark __P((SCR *, VICMD *)); + * PUBLIC: int v_emark(SCR *, VICMD *); */ int v_emark(SCR *sp, VICMD *vp) @@ -196,22 +196,7 @@ mark(SCR *sp, VICMD *vp, int getmark, enum which cmd) * Delete cursor motion was always to the start of the text region, * regardless. Ignore other motion commands. */ -#ifdef HISTORICAL_PRACTICE - if (ISCMD(vp->rkp, 'y')) { - if ((cmd == BQMARK || - (cmd == FQMARK && vp->m_start.lno != vp->m_stop.lno)) && - (vp->m_start.lno > vp->m_stop.lno || - (vp->m_start.lno == vp->m_stop.lno && - vp->m_start.cno > vp->m_stop.cno))) - vp->m_final = vp->m_stop; - } else if (ISCMD(vp->rkp, 'd')) - if (vp->m_start.lno > vp->m_stop.lno || - (vp->m_start.lno == vp->m_stop.lno && - vp->m_start.cno > vp->m_stop.cno)) - vp->m_final = vp->m_stop; -#else vp->m_final = vp->m_start; -#endif /* * Forward marks are always line oriented, and it's set in the diff --git a/vi/v_match.c b/vi/v_match.c index 2fae58e3a8e1..503c65c731fb 100644 --- a/vi/v_match.c +++ b/vi/v_match.c @@ -31,7 +31,7 @@ static const char sccsid[] = "$Id: v_match.c,v 10.11 2012/02/11 00:33:46 zy Exp * v_match -- % * Search to matching character. * - * PUBLIC: int v_match __P((SCR *, VICMD *)); + * PUBLIC: int v_match(SCR *, VICMD *); */ int v_match(SCR *sp, VICMD *vp) @@ -39,7 +39,7 @@ v_match(SCR *sp, VICMD *vp) VCS cs; MARK *mp; size_t cno, len, off; - int cnt, isempty, matchc, startc, (*gc)__P((SCR *, VCS *)); + int cnt, isempty, matchc, startc, (*gc)(SCR *, VCS *); CHAR_T *p; CHAR_T *cp; const CHAR_T *match_chars; @@ -154,7 +154,7 @@ nomatch: msgq(sp, M_BERR, "184|No match character on this line"); * v_buildmcs -- * Build the match character list. * - * PUBLIC: int v_buildmcs __P((SCR *, char *)); + * PUBLIC: int v_buildmcs(SCR *, char *); */ int v_buildmcs(SCR *sp, char *str) diff --git a/vi/v_paragraph.c b/vi/v_paragraph.c index 4ff4b15ec0d5..2cc40b1e5968 100644 --- a/vi/v_paragraph.c +++ b/vi/v_paragraph.c @@ -61,7 +61,7 @@ static const char sccsid[] = "$Id: v_paragraph.c,v 10.10 2001/06/25 15:19:32 ski * Paragraphs are empty lines after text, formfeed characters, or values * from the paragraph or section options. * - * PUBLIC: int v_paragraphf __P((SCR *, VICMD *)); + * PUBLIC: int v_paragraphf(SCR *, VICMD *); */ int v_paragraphf(SCR *sp, VICMD *vp) @@ -199,7 +199,7 @@ eof: if (vp->m_start.lno == lno || vp->m_start.lno == lno - 1) { * v_paragraphb -- [count]{ * Move backward count paragraphs. * - * PUBLIC: int v_paragraphb __P((SCR *, VICMD *)); + * PUBLIC: int v_paragraphb(SCR *, VICMD *); */ int v_paragraphb(SCR *sp, VICMD *vp) @@ -306,7 +306,7 @@ found: vp->m_stop.lno = lno; * v_buildps -- * Build the paragraph command search pattern. * - * PUBLIC: int v_buildps __P((SCR *, char *, char *)); + * PUBLIC: int v_buildps(SCR *, char *, char *); */ int v_buildps(SCR *sp, char *p_p, char *s_p) diff --git a/vi/v_put.c b/vi/v_put.c index a739bd1a80e3..8843c6933ce2 100644 --- a/vi/v_put.c +++ b/vi/v_put.c @@ -24,13 +24,13 @@ static const char sccsid[] = "$Id: v_put.c,v 10.6 2001/06/25 15:19:34 skimo Exp #include "../common/common.h" #include "vi.h" -static void inc_buf __P((SCR *, VICMD *)); +static void inc_buf(SCR *, VICMD *); /* * v_Put -- [buffer]P * Insert the contents of the buffer before the cursor. * - * PUBLIC: int v_Put __P((SCR *, VICMD *)); + * PUBLIC: int v_Put(SCR *, VICMD *); */ int v_Put(SCR *sp, VICMD *vp) @@ -61,7 +61,7 @@ v_Put(SCR *sp, VICMD *vp) * v_put -- [buffer]p * Insert the contents of the buffer after the cursor. * - * PUBLIC: int v_put __P((SCR *, VICMD *)); + * PUBLIC: int v_put(SCR *, VICMD *); */ int v_put(SCR *sp, VICMD *vp) diff --git a/vi/v_redraw.c b/vi/v_redraw.c index 979f37c70ecc..5549546a1643 100644 --- a/vi/v_redraw.c +++ b/vi/v_redraw.c @@ -28,7 +28,7 @@ static const char sccsid[] = "$Id: v_redraw.c,v 10.7 2001/06/25 15:19:34 skimo E * v_redraw -- ^L, ^R * Redraw the screen. * - * PUBLIC: int v_redraw __P((SCR *, VICMD *)); + * PUBLIC: int v_redraw(SCR *, VICMD *); */ int v_redraw(SCR *sp, VICMD *vp) diff --git a/vi/v_replace.c b/vi/v_replace.c index 2a7ea979e86f..e471df595eaa 100644 --- a/vi/v_replace.c +++ b/vi/v_replace.c @@ -40,7 +40,7 @@ static const char sccsid[] = "$Id: v_replace.c,v 10.24 2001/06/25 15:19:34 skimo * character, it required three characters after the * command. This may not be right, but at least it's not insane. * - * PUBLIC: int v_replace __P((SCR *, VICMD *)); + * PUBLIC: int v_replace(SCR *, VICMD *); */ int v_replace(SCR *sp, VICMD *vp) diff --git a/vi/v_right.c b/vi/v_right.c index 566f952716af..bfcf8dd62d72 100644 --- a/vi/v_right.c +++ b/vi/v_right.c @@ -28,7 +28,7 @@ static const char sccsid[] = "$Id: v_right.c,v 10.8 2001/06/25 15:19:34 skimo Ex * v_right -- [count]' ', [count]l * Move right by columns. * - * PUBLIC: int v_right __P((SCR *, VICMD *)); + * PUBLIC: int v_right(SCR *, VICMD *); */ int v_right(SCR *sp, VICMD *vp) @@ -78,7 +78,7 @@ eol: v_eol(sp, NULL); * v_dollar -- [count]$ * Move to the last column. * - * PUBLIC: int v_dollar __P((SCR *, VICMD *)); + * PUBLIC: int v_dollar(SCR *, VICMD *); */ int v_dollar(SCR *sp, VICMD *vp) diff --git a/vi/v_screen.c b/vi/v_screen.c index d7932a4e7b1a..97c60e4ff140 100644 --- a/vi/v_screen.c +++ b/vi/v_screen.c @@ -28,7 +28,7 @@ static const char sccsid[] = "$Id: v_screen.c,v 10.12 2001/06/25 15:19:34 skimo * v_screen -- ^W * Switch screens. * - * PUBLIC: int v_screen __P((SCR *, VICMD *)); + * PUBLIC: int v_screen(SCR *, VICMD *); */ int v_screen(SCR *sp, VICMD *vp) diff --git a/vi/v_scroll.c b/vi/v_scroll.c index 71528a02b220..35c01a05fdd0 100644 --- a/vi/v_scroll.c +++ b/vi/v_scroll.c @@ -25,7 +25,7 @@ static const char sccsid[] = "$Id: v_scroll.c,v 10.12 2001/06/25 15:19:34 skimo #include "../common/common.h" #include "vi.h" -static void goto_adjust __P((VICMD *)); +static void goto_adjust(VICMD *); /* * The historic vi had a problem in that all movements were by physical @@ -64,7 +64,7 @@ static void goto_adjust __P((VICMD *)); * Go to first non-blank character of the line count, the last line * of the file by default. * - * PUBLIC: int v_lgoto __P((SCR *, VICMD *)); + * PUBLIC: int v_lgoto(SCR *, VICMD *); */ int v_lgoto(SCR *sp, VICMD *vp) @@ -101,7 +101,7 @@ v_lgoto(SCR *sp, VICMD *vp) * Move to the first non-blank character of the logical line * count - 1 from the top of the screen, 0 by default. * - * PUBLIC: int v_home __P((SCR *, VICMD *)); + * PUBLIC: int v_home(SCR *, VICMD *); */ int v_home(SCR *sp, VICMD *vp) @@ -118,7 +118,7 @@ v_home(SCR *sp, VICMD *vp) * Move to the first non-blank character of the logical line * in the middle of the screen. * - * PUBLIC: int v_middle __P((SCR *, VICMD *)); + * PUBLIC: int v_middle(SCR *, VICMD *); */ int v_middle(SCR *sp, VICMD *vp) @@ -139,7 +139,7 @@ v_middle(SCR *sp, VICMD *vp) * Move to the first non-blank character of the logical line * count - 1 from the bottom of the screen, 0 by default. * - * PUBLIC: int v_bottom __P((SCR *, VICMD *)); + * PUBLIC: int v_bottom(SCR *, VICMD *); */ int v_bottom(SCR *sp, VICMD *vp) @@ -202,7 +202,7 @@ goto_adjust(VICMD *vp) * v_up -- [count]^P, [count]k, [count]- * Move up by lines. * - * PUBLIC: int v_up __P((SCR *, VICMD *)); + * PUBLIC: int v_up(SCR *, VICMD *); */ int v_up(SCR *sp, VICMD *vp) @@ -224,7 +224,7 @@ v_up(SCR *sp, VICMD *vp) * In a script window, send the line to the shell. * In a regular window, move down by lines. * - * PUBLIC: int v_cr __P((SCR *, VICMD *)); + * PUBLIC: int v_cr(SCR *, VICMD *); */ int v_cr(SCR *sp, VICMD *vp) @@ -245,7 +245,7 @@ v_cr(SCR *sp, VICMD *vp) * v_down -- [count]^J, [count]^N, [count]j, [count]^M, [count]+ * Move down by lines. * - * PUBLIC: int v_down __P((SCR *, VICMD *)); + * PUBLIC: int v_down(SCR *, VICMD *); */ int v_down(SCR *sp, VICMD *vp) @@ -266,7 +266,7 @@ v_down(SCR *sp, VICMD *vp) * v_hpageup -- [count]^U * Page up half screens. * - * PUBLIC: int v_hpageup __P((SCR *, VICMD *)); + * PUBLIC: int v_hpageup(SCR *, VICMD *); */ int v_hpageup(SCR *sp, VICMD *vp) @@ -290,7 +290,7 @@ v_hpageup(SCR *sp, VICMD *vp) * v_hpagedown -- [count]^D * Page down half screens. * - * PUBLIC: int v_hpagedown __P((SCR *, VICMD *)); + * PUBLIC: int v_hpagedown(SCR *, VICMD *); */ int v_hpagedown(SCR *sp, VICMD *vp) @@ -318,7 +318,7 @@ v_hpagedown(SCR *sp, VICMD *vp) * if EOF was already displayed on the screen. This implementation does * move to EOF in that case, making ^F more like the the historic ^D. * - * PUBLIC: int v_pagedown __P((SCR *, VICMD *)); + * PUBLIC: int v_pagedown(SCR *, VICMD *); */ int v_pagedown(SCR *sp, VICMD *vp) @@ -364,7 +364,7 @@ v_pagedown(SCR *sp, VICMD *vp) * if SOF was already displayed on the screen. This implementation does * move to SOF in that case, making ^B more like the the historic ^U. * - * PUBLIC: int v_pageup __P((SCR *, VICMD *)); + * PUBLIC: int v_pageup(SCR *, VICMD *); */ int v_pageup(SCR *sp, VICMD *vp) @@ -410,7 +410,7 @@ v_pageup(SCR *sp, VICMD *vp) * v_lineup -- [count]^Y * Page up by lines. * - * PUBLIC: int v_lineup __P((SCR *, VICMD *)); + * PUBLIC: int v_lineup(SCR *, VICMD *); */ int v_lineup(SCR *sp, VICMD *vp) @@ -430,7 +430,7 @@ v_lineup(SCR *sp, VICMD *vp) * v_linedown -- [count]^E * Page down by lines. * - * PUBLIC: int v_linedown __P((SCR *, VICMD *)); + * PUBLIC: int v_linedown(SCR *, VICMD *); */ int v_linedown(SCR *sp, VICMD *vp) diff --git a/vi/v_search.c b/vi/v_search.c index 1d6b26030118..59525834d939 100644 --- a/vi/v_search.c +++ b/vi/v_search.c @@ -28,14 +28,14 @@ static const char sccsid[] = "$Id: v_search.c,v 10.31 2012/02/08 07:26:59 zy Exp #include "../common/common.h" #include "vi.h" -static int v_exaddr __P((SCR *, VICMD *, dir_t)); -static int v_search __P((SCR *, VICMD *, CHAR_T *, size_t, u_int, dir_t)); +static int v_exaddr(SCR *, VICMD *, dir_t); +static int v_search(SCR *, VICMD *, CHAR_T *, size_t, u_int, dir_t); /* * v_srch -- [count]?RE[? offset] * Ex address search backward. * - * PUBLIC: int v_searchb __P((SCR *, VICMD *)); + * PUBLIC: int v_searchb(SCR *, VICMD *); */ int v_searchb(SCR *sp, VICMD *vp) @@ -47,7 +47,7 @@ v_searchb(SCR *sp, VICMD *vp) * v_searchf -- [count]/RE[/ offset] * Ex address search forward. * - * PUBLIC: int v_searchf __P((SCR *, VICMD *)); + * PUBLIC: int v_searchf(SCR *, VICMD *); */ int v_searchf(SCR *sp, VICMD *vp) @@ -278,7 +278,7 @@ err2: vp->m_final.lno = s_lno; * v_searchN -- N * Reverse last search. * - * PUBLIC: int v_searchN __P((SCR *, VICMD *)); + * PUBLIC: int v_searchN(SCR *, VICMD *); */ int v_searchN(SCR *sp, VICMD *vp) @@ -303,7 +303,7 @@ v_searchN(SCR *sp, VICMD *vp) * v_searchn -- n * Repeat last search. * - * PUBLIC: int v_searchn __P((SCR *, VICMD *)); + * PUBLIC: int v_searchn(SCR *, VICMD *); */ int v_searchn(SCR *sp, VICMD *vp) @@ -338,7 +338,7 @@ is_special(CHAR_T c) * v_searchw -- [count]^A * Search for the word under the cursor. * - * PUBLIC: int v_searchw __P((SCR *, VICMD *)); + * PUBLIC: int v_searchw(SCR *, VICMD *); */ int v_searchw(SCR *sp, VICMD *vp) @@ -450,7 +450,7 @@ v_search(SCR *sp, VICMD *vp, CHAR_T *ptrn, size_t plen, u_int flags, dir_t dir) * 'k' and put would no longer work correctly. In any case, we try to do * the right thing, but it's not going to exactly match historic practice. * - * PUBLIC: int v_correct __P((SCR *, VICMD *, int)); + * PUBLIC: int v_correct(SCR *, VICMD *, int); */ int v_correct(SCR *sp, VICMD *vp, int isdelta) diff --git a/vi/v_section.c b/vi/v_section.c index e769cdad3289..3613afeee07f 100644 --- a/vi/v_section.c +++ b/vi/v_section.c @@ -59,7 +59,7 @@ static const char sccsid[] = "$Id: v_section.c,v 10.10 2001/06/25 15:19:35 skimo * a section, it did NOT include the matched line. If it matched a }, it * did include the line. No clue why. * - * PUBLIC: int v_sectionf __P((SCR *, VICMD *)); + * PUBLIC: int v_sectionf(SCR *, VICMD *); */ int v_sectionf(SCR *sp, VICMD *vp) @@ -166,7 +166,7 @@ ret2: if (ISMOTION(vp)) { * v_sectionb -- [count][[ * Move backward count sections/functions. * - * PUBLIC: int v_sectionb __P((SCR *, VICMD *)); + * PUBLIC: int v_sectionb(SCR *, VICMD *); */ int v_sectionb(SCR *sp, VICMD *vp) diff --git a/vi/v_sentence.c b/vi/v_sentence.c index ddbc6c707aad..df108392b83f 100644 --- a/vi/v_sentence.c +++ b/vi/v_sentence.c @@ -49,7 +49,7 @@ static const char sccsid[] = "$Id: v_sentence.c,v 10.9 2001/06/25 15:19:35 skimo * v_sentencef -- [count]) * Move forward count sentences. * - * PUBLIC: int v_sentencef __P((SCR *, VICMD *)); + * PUBLIC: int v_sentencef(SCR *, VICMD *); */ int v_sentencef(SCR *sp, VICMD *vp) @@ -188,7 +188,7 @@ okret: vp->m_stop.lno = cs.cs_lno; * v_sentenceb -- [count]( * Move backward count sentences. * - * PUBLIC: int v_sentenceb __P((SCR *, VICMD *)); + * PUBLIC: int v_sentenceb(SCR *, VICMD *); */ int v_sentenceb(SCR *sp, VICMD *vp) diff --git a/vi/v_status.c b/vi/v_status.c index 82fe74b601b6..0d9afd0e224e 100644 --- a/vi/v_status.c +++ b/vi/v_status.c @@ -28,7 +28,7 @@ static const char sccsid[] = "$Id: v_status.c,v 10.10 2001/06/25 15:19:35 skimo * v_status -- ^G * Show the file status. * - * PUBLIC: int v_status __P((SCR *, VICMD *)); + * PUBLIC: int v_status(SCR *, VICMD *); */ int v_status(SCR *sp, VICMD *vp) diff --git a/vi/v_txt.c b/vi/v_txt.c index 1348b278979b..be4309a1813b 100644 --- a/vi/v_txt.c +++ b/vi/v_txt.c @@ -29,25 +29,25 @@ static const char sccsid[] = "$Id: v_txt.c,v 11.5 2013/05/19 20:37:45 bentley Ex #include "../common/common.h" #include "vi.h" -static int txt_abbrev __P((SCR *, TEXT *, CHAR_T *, int, int *, int *)); -static void txt_ai_resolve __P((SCR *, TEXT *, int *)); -static TEXT *txt_backup __P((SCR *, TEXTH *, TEXT *, u_int32_t *)); -static int txt_dent __P((SCR *, TEXT *, int)); -static int txt_emark __P((SCR *, TEXT *, size_t)); -static void txt_err __P((SCR *, TEXTH *)); -static int txt_fc __P((SCR *, TEXT *, int *)); -static int txt_fc_col __P((SCR *, int, ARGS **)); -static int txt_hex __P((SCR *, TEXT *)); -static int txt_insch __P((SCR *, TEXT *, CHAR_T *, u_int)); -static int txt_isrch __P((SCR *, VICMD *, TEXT *, u_int8_t *)); -static int txt_map_end __P((SCR *)); -static int txt_map_init __P((SCR *)); -static int txt_margin __P((SCR *, TEXT *, TEXT *, int *, u_int32_t)); -static void txt_nomorech __P((SCR *)); -static void txt_Rresolve __P((SCR *, TEXTH *, TEXT *, const size_t)); -static int txt_resolve __P((SCR *, TEXTH *, u_int32_t)); -static int txt_showmatch __P((SCR *, TEXT *)); -static void txt_unmap __P((SCR *, TEXT *, u_int32_t *)); +static int txt_abbrev(SCR *, TEXT *, CHAR_T *, int, int *, int *); +static void txt_ai_resolve(SCR *, TEXT *, int *); +static TEXT *txt_backup(SCR *, TEXTH *, TEXT *, u_int32_t *); +static int txt_dent(SCR *, TEXT *, int); +static int txt_emark(SCR *, TEXT *, size_t); +static void txt_err(SCR *, TEXTH *); +static int txt_fc(SCR *, TEXT *, int *); +static int txt_fc_col(SCR *, int, ARGS **); +static int txt_hex(SCR *, TEXT *); +static int txt_insch(SCR *, TEXT *, CHAR_T *, u_int); +static int txt_isrch(SCR *, VICMD *, TEXT *, u_int8_t *); +static int txt_map_end(SCR *); +static int txt_map_init(SCR *); +static int txt_margin(SCR *, TEXT *, TEXT *, int *, u_int32_t); +static void txt_nomorech(SCR *); +static void txt_Rresolve(SCR *, TEXTH *, TEXT *, const size_t); +static int txt_resolve(SCR *, TEXTH *, u_int32_t); +static int txt_showmatch(SCR *, TEXT *); +static void txt_unmap(SCR *, TEXT *, u_int32_t *); /* Cursor character (space is hard to track on the screen). */ #if defined(DEBUG) && 0 @@ -59,7 +59,7 @@ static void txt_unmap __P((SCR *, TEXT *, u_int32_t *)); * v_tcmd -- * Fill a buffer from the terminal for vi. * - * PUBLIC: int v_tcmd __P((SCR *, VICMD *, ARG_CHAR_T, u_int)); + * PUBLIC: int v_tcmd(SCR *, VICMD *, ARG_CHAR_T, u_int); */ int v_tcmd(SCR *sp, VICMD *vp, ARG_CHAR_T prompt, u_int flags) @@ -234,8 +234,8 @@ txt_map_end(SCR *sp) * v_txt -- * Vi text input. * - * PUBLIC: int v_txt __P((SCR *, VICMD *, MARK *, - * PUBLIC: const CHAR_T *, size_t, ARG_CHAR_T, recno_t, u_long, u_int32_t)); + * PUBLIC: int v_txt(SCR *, VICMD *, MARK *, + * PUBLIC: const CHAR_T *, size_t, ARG_CHAR_T, recno_t, u_long, u_int32_t); */ int v_txt( @@ -1760,7 +1760,7 @@ txt_ai_resolve(SCR *sp, TEXT *tp, int *changedp) * Handle autoindent. If aitp isn't NULL, use it, otherwise, * retrieve the line. * - * PUBLIC: int v_txt_auto __P((SCR *, recno_t, TEXT *, size_t, TEXT *)); + * PUBLIC: int v_txt_auto(SCR *, recno_t, TEXT *, size_t, TEXT *); */ int v_txt_auto(SCR *sp, recno_t lno, TEXT *aitp, size_t len, TEXT *tp) diff --git a/vi/v_ulcase.c b/vi/v_ulcase.c index 10d3d359619d..9e306caebb60 100644 --- a/vi/v_ulcase.c +++ b/vi/v_ulcase.c @@ -28,7 +28,7 @@ static const char sccsid[] = "$Id: v_ulcase.c,v 10.12 2011/12/02 19:58:32 zy Exp #include "../common/common.h" #include "vi.h" -static int ulcase __P((SCR *, recno_t, CHAR_T *, size_t, size_t, size_t)); +static int ulcase(SCR *, recno_t, CHAR_T *, size_t, size_t, size_t); /* * v_ulcase -- [count]~ @@ -44,7 +44,7 @@ static int ulcase __P((SCR *, recno_t, CHAR_T *, size_t, size_t, size_t)); * if there had been an associated motion, but it's too late to make * that the default now. * - * PUBLIC: int v_ulcase __P((SCR *, VICMD *)); + * PUBLIC: int v_ulcase(SCR *, VICMD *); */ int v_ulcase(SCR *sp, VICMD *vp) @@ -102,7 +102,7 @@ v_ulcase(SCR *sp, VICMD *vp) * v_mulcase -- [count]~[count]motion * Toggle upper & lower case letters over a range. * - * PUBLIC: int v_mulcase __P((SCR *, VICMD *)); + * PUBLIC: int v_mulcase(SCR *, VICMD *); */ int v_mulcase(SCR *sp, VICMD *vp) diff --git a/vi/v_undo.c b/vi/v_undo.c index 2bbd9208643c..6cac736d9c5b 100644 --- a/vi/v_undo.c +++ b/vi/v_undo.c @@ -31,7 +31,7 @@ static const char sccsid[] = "$Id: v_undo.c,v 10.6 2001/06/25 15:19:36 skimo Exp * v_Undo -- U * Undo changes to this line. * - * PUBLIC: int v_Undo __P((SCR *, VICMD *)); + * PUBLIC: int v_Undo(SCR *, VICMD *); */ int v_Undo(SCR *sp, VICMD *vp) @@ -65,7 +65,7 @@ v_Undo(SCR *sp, VICMD *vp) * v_undo -- u * Undo the last change. * - * PUBLIC: int v_undo __P((SCR *, VICMD *)); + * PUBLIC: int v_undo(SCR *, VICMD *); */ int v_undo(SCR *sp, VICMD *vp) diff --git a/vi/v_util.c b/vi/v_util.c index 6348ca73ec85..f8f3792e7d76 100644 --- a/vi/v_util.c +++ b/vi/v_util.c @@ -32,7 +32,7 @@ static const char sccsid[] = "$Id: v_util.c,v 10.14 2001/06/25 15:19:36 skimo Ex * v_eof -- * Vi end-of-file error. * - * PUBLIC: void v_eof __P((SCR *, MARK *)); + * PUBLIC: void v_eof(SCR *, MARK *); */ void v_eof(SCR *sp, MARK *mp) @@ -55,7 +55,7 @@ v_eof(SCR *sp, MARK *mp) * v_eol -- * Vi end-of-line error. * - * PUBLIC: void v_eol __P((SCR *, MARK *)); + * PUBLIC: void v_eol(SCR *, MARK *); */ void v_eol(SCR *sp, MARK *mp) @@ -78,7 +78,7 @@ v_eol(SCR *sp, MARK *mp) * v_nomove -- * Vi no cursor movement error. * - * PUBLIC: void v_nomove __P((SCR *)); + * PUBLIC: void v_nomove(SCR *); */ void v_nomove(SCR *sp) @@ -90,7 +90,7 @@ v_nomove(SCR *sp) * v_sof -- * Vi start-of-file error. * - * PUBLIC: void v_sof __P((SCR *, MARK *)); + * PUBLIC: void v_sof(SCR *, MARK *); */ void v_sof(SCR *sp, MARK *mp) @@ -105,7 +105,7 @@ v_sof(SCR *sp, MARK *mp) * v_sol -- * Vi start-of-line error. * - * PUBLIC: void v_sol __P((SCR *)); + * PUBLIC: void v_sol(SCR *); */ void v_sol(SCR *sp) @@ -117,7 +117,7 @@ v_sol(SCR *sp) * v_isempty -- * Return if the line contains nothing but white-space characters. * - * PUBLIC: int v_isempty __P((CHAR_T *, size_t)); + * PUBLIC: int v_isempty(CHAR_T *, size_t); */ int v_isempty(CHAR_T *p, size_t len) @@ -132,7 +132,7 @@ v_isempty(CHAR_T *p, size_t len) * v_emsg -- * Display a few common vi messages. * - * PUBLIC: void v_emsg __P((SCR *, char *, vim_t)); + * PUBLIC: void v_emsg(SCR *, char *, vim_t); */ void v_emsg(SCR *sp, char *p, vim_t which) diff --git a/vi/v_word.c b/vi/v_word.c index 6336e2d97ce8..f07dbb6e359c 100644 --- a/vi/v_word.c +++ b/vi/v_word.c @@ -66,15 +66,15 @@ static const char sccsid[] = "$Id: v_word.c,v 10.7 2011/12/27 00:49:31 zy Exp $" enum which {BIGWORD, LITTLEWORD}; -static int bword __P((SCR *, VICMD *, enum which)); -static int eword __P((SCR *, VICMD *, enum which)); -static int fword __P((SCR *, VICMD *, enum which)); +static int bword(SCR *, VICMD *, enum which); +static int eword(SCR *, VICMD *, enum which); +static int fword(SCR *, VICMD *, enum which); /* * v_wordW -- [count]W * Move forward a bigword at a time. * - * PUBLIC: int v_wordW __P((SCR *, VICMD *)); + * PUBLIC: int v_wordW(SCR *, VICMD *); */ int v_wordW(SCR *sp, VICMD *vp) @@ -86,7 +86,7 @@ v_wordW(SCR *sp, VICMD *vp) * v_wordw -- [count]w * Move forward a word at a time. * - * PUBLIC: int v_wordw __P((SCR *, VICMD *)); + * PUBLIC: int v_wordw(SCR *, VICMD *); */ int v_wordw(SCR *sp, VICMD *vp) @@ -234,7 +234,7 @@ ret: if (!ISMOTION(vp) && * v_wordE -- [count]E * Move forward to the end of the bigword. * - * PUBLIC: int v_wordE __P((SCR *, VICMD *)); + * PUBLIC: int v_wordE(SCR *, VICMD *); */ int v_wordE(SCR *sp, VICMD *vp) @@ -246,7 +246,7 @@ v_wordE(SCR *sp, VICMD *vp) * v_worde -- [count]e * Move forward to the end of the word. * - * PUBLIC: int v_worde __P((SCR *, VICMD *)); + * PUBLIC: int v_worde(SCR *, VICMD *); */ int v_worde(SCR *sp, VICMD *vp) @@ -380,7 +380,7 @@ ret: if (!ISMOTION(vp) && * v_WordB -- [count]B * Move backward a bigword at a time. * - * PUBLIC: int v_wordB __P((SCR *, VICMD *)); + * PUBLIC: int v_wordB(SCR *, VICMD *); */ int v_wordB(SCR *sp, VICMD *vp) @@ -392,7 +392,7 @@ v_wordB(SCR *sp, VICMD *vp) * v_wordb -- [count]b * Move backward a word at a time. * - * PUBLIC: int v_wordb __P((SCR *, VICMD *)); + * PUBLIC: int v_wordb(SCR *, VICMD *); */ int v_wordb(SCR *sp, VICMD *vp) diff --git a/vi/v_xchar.c b/vi/v_xchar.c index a0c1a692be90..52fa03a55884 100644 --- a/vi/v_xchar.c +++ b/vi/v_xchar.c @@ -28,7 +28,7 @@ static const char sccsid[] = "$Id: v_xchar.c,v 10.10 2001/06/25 15:19:36 skimo E * v_xchar -- [buffer] [count]x * Deletes the character(s) on which the cursor sits. * - * PUBLIC: int v_xchar __P((SCR *, VICMD *)); + * PUBLIC: int v_xchar(SCR *, VICMD *); */ int v_xchar(SCR *sp, VICMD *vp) @@ -75,7 +75,7 @@ nodel: msgq(sp, M_BERR, "206|No characters to delete"); * Deletes the character(s) immediately before the current cursor * position. * - * PUBLIC: int v_Xchar __P((SCR *, VICMD *)); + * PUBLIC: int v_Xchar(SCR *, VICMD *); */ int v_Xchar(SCR *sp, VICMD *vp) diff --git a/vi/v_yank.c b/vi/v_yank.c index 7b02cce04adb..7322f7336df3 100644 --- a/vi/v_yank.c +++ b/vi/v_yank.c @@ -39,7 +39,7 @@ static const char sccsid[] = "$Id: v_yank.c,v 10.10 2001/06/25 15:19:36 skimo Ex * to the line and column marked by a. Hopefully, the motion component code * got it right... Unlike delete, we make no adjustments here. * - * PUBLIC: int v_yank __P((SCR *, VICMD *)); + * PUBLIC: int v_yank(SCR *, VICMD *); */ int v_yank(SCR *sp, VICMD *vp) diff --git a/vi/v_z.c b/vi/v_z.c index 9d4ef64f73f7..c95c82d19c38 100644 --- a/vi/v_z.c +++ b/vi/v_z.c @@ -28,7 +28,7 @@ static const char sccsid[] = "$Id: v_z.c,v 10.13 2011/12/02 17:26:59 zy Exp $"; * v_z -- [count]z[count][-.+^] * Move the screen. * - * PUBLIC: int v_z __P((SCR *, VICMD *)); + * PUBLIC: int v_z(SCR *, VICMD *); */ int v_z(SCR *sp, VICMD *vp) @@ -131,7 +131,7 @@ v_z(SCR *sp, VICMD *vp) * vs_crel -- * Change the relative size of the current screen. * - * PUBLIC: int vs_crel __P((SCR *, long)); + * PUBLIC: int vs_crel(SCR *, long); */ int vs_crel(SCR *sp, long int count) diff --git a/vi/v_zexit.c b/vi/v_zexit.c index a2decd662882..b9805b337568 100644 --- a/vi/v_zexit.c +++ b/vi/v_zexit.c @@ -29,7 +29,7 @@ static const char sccsid[] = "$Id: v_zexit.c,v 10.7 2001/06/25 15:19:37 skimo Ex * v_zexit -- ZZ * Save the file and exit. * - * PUBLIC: int v_zexit __P((SCR *, VICMD *)); + * PUBLIC: int v_zexit(SCR *, VICMD *); */ int v_zexit(SCR *sp, VICMD *vp) diff --git a/vi/vi.c b/vi/vi.c index aafdbd139c5f..144d903449a3 100644 --- a/vi/vi.c +++ b/vi/vi.c @@ -34,16 +34,16 @@ typedef enum { } gcret_t; static VIKEYS const - *v_alias __P((SCR *, VICMD *, VIKEYS const *)); -static gcret_t v_cmd __P((SCR *, VICMD *, VICMD *, VICMD *, int *, int *)); -static int v_count __P((SCR *, ARG_CHAR_T, u_long *)); -static void v_dtoh __P((SCR *)); -static int v_init __P((SCR *)); -static gcret_t v_key __P((SCR *, int, EVENT *, u_int32_t)); -static int v_motion __P((SCR *, VICMD *, VICMD *, int *)); + *v_alias(SCR *, VICMD *, VIKEYS const *); +static gcret_t v_cmd(SCR *, VICMD *, VICMD *, VICMD *, int *, int *); +static int v_count(SCR *, ARG_CHAR_T, u_long *); +static void v_dtoh(SCR *); +static int v_init(SCR *); +static gcret_t v_key(SCR *, int, EVENT *, u_int32_t); +static int v_motion(SCR *, VICMD *, VICMD *, int *); #if defined(DEBUG) && defined(COMLOG) -static void v_comlog __P((SCR *, VICMD *)); +static void v_comlog(SCR *, VICMD *); #endif /* @@ -58,7 +58,7 @@ static void v_comlog __P((SCR *, VICMD *)); * vi -- * Main vi command loop. * - * PUBLIC: int vi __P((SCR **)); + * PUBLIC: int vi(SCR **); */ int vi(SCR **spp) @@ -1031,7 +1031,7 @@ v_dtoh(SCR *sp) * v_curword -- * Get the word (tagstring, actually) the cursor is on. * - * PUBLIC: int v_curword __P((SCR *)); + * PUBLIC: int v_curword(SCR *); */ int v_curword(SCR *sp) @@ -1216,7 +1216,6 @@ v_key( break; case E_WRESIZE: return (GC_ERR); - /* FALLTHROUGH */ default: v_event_err(sp, evp); return (GC_ERR); diff --git a/vi/vi.h b/vi/vi.h index 2cfbb999ab93..eeb6b9fc0797 100644 --- a/vi/vi.h +++ b/vi/vi.h @@ -126,7 +126,7 @@ typedef struct _vicmd { /* Vi command table structure. */ struct _vikeys { /* Underlying function. */ - int (*func) __P((SCR *, VICMD *)); + int (*func)(SCR *, VICMD *); #define V_ABS 0x00004000 /* Absolute movement, set '' mark. */ #define V_ABS_C 0x00008000 /* V_ABS: if the line/column changed. */ #define V_ABS_L 0x00010000 /* V_ABS: if the line changed. */ @@ -161,12 +161,12 @@ typedef struct _vcs { int cs_flags; /* Return flags. */ } VCS; -int cs_bblank __P((SCR *, VCS *)); -int cs_fblank __P((SCR *, VCS *)); -int cs_fspace __P((SCR *, VCS *)); -int cs_init __P((SCR *, VCS *)); -int cs_next __P((SCR *, VCS *)); -int cs_prev __P((SCR *, VCS *)); +int cs_bblank(SCR *, VCS *); +int cs_fblank(SCR *, VCS *); +int cs_fspace(SCR *, VCS *); +int cs_init(SCR *, VCS *); +int cs_next(SCR *, VCS *); +int cs_prev(SCR *, VCS *); /* * We use a single "window" for each set of vi screens. The model would be diff --git a/vi/vs_line.c b/vi/vs_line.c index dc12a3ad11fd..e523076bf29e 100644 --- a/vi/vs_line.c +++ b/vi/vs_line.c @@ -35,7 +35,7 @@ static const char sccsid[] = "$Id: vs_line.c,v 10.40 2012/02/13 19:22:25 zy Exp * vs_line -- * Update one line on the screen. * - * PUBLIC: int vs_line __P((SCR *, SMAP *, size_t *, size_t *)); + * PUBLIC: int vs_line(SCR *, SMAP *, size_t *, size_t *); */ int vs_line(SCR *sp, SMAP *smp, size_t *yp, size_t *xp) @@ -482,7 +482,7 @@ ret1: (void)gp->scr_move(sp, oldy, oldx); * vs_number -- * Repaint the numbers on all the lines. * - * PUBLIC: int vs_number __P((SCR *)); + * PUBLIC: int vs_number(SCR *); */ int vs_number(SCR *sp) diff --git a/vi/vs_msg.c b/vi/vs_msg.c index 32b2755c1722..2eb88e4e7e69 100644 --- a/vi/vs_msg.c +++ b/vi/vs_msg.c @@ -37,11 +37,11 @@ typedef enum { */ } sw_t; -static void vs_divider __P((SCR *)); -static void vs_msgsave __P((SCR *, mtype_t, char *, size_t)); -static void vs_output __P((SCR *, mtype_t, const char *, int)); -static void vs_scroll __P((SCR *, int *, sw_t)); -static void vs_wait __P((SCR *, int *, sw_t)); +static void vs_divider(SCR *); +static void vs_msgsave(SCR *, mtype_t, char *, size_t); +static void vs_output(SCR *, mtype_t, const char *, int); +static void vs_scroll(SCR *, int *, sw_t); +static void vs_wait(SCR *, int *, sw_t); /* * vs_busy -- @@ -53,7 +53,7 @@ static void vs_wait __P((SCR *, int *, sw_t)); * messages, e.g. X11 clock icons, should set their scr_busy function to the * correct function before calling the main editor routine. * - * PUBLIC: void vs_busy __P((SCR *, const char *, busy_t)); + * PUBLIC: void vs_busy(SCR *, const char *, busy_t); */ void vs_busy(SCR *sp, const char *msg, busy_t btype) @@ -142,7 +142,7 @@ vs_busy(SCR *sp, const char *msg, busy_t btype) * vs_home -- * Home the cursor to the bottom row, left-most column. * - * PUBLIC: void vs_home __P((SCR *)); + * PUBLIC: void vs_home(SCR *); */ void vs_home(SCR *sp) @@ -155,7 +155,7 @@ vs_home(SCR *sp) * vs_update -- * Update a command. * - * PUBLIC: void vs_update __P((SCR *, const char *, const CHAR_T *)); + * PUBLIC: void vs_update(SCR *, const char *, const CHAR_T *); */ void vs_update(SCR *sp, const char *m1, const CHAR_T *m2) @@ -225,7 +225,7 @@ vs_update(SCR *sp, const char *m1, const CHAR_T *m2) * alternate method of displaying messages, e.g. dialog boxes, should set their * scr_msg function to the correct function before calling the editor. * - * PUBLIC: void vs_msg __P((SCR *, mtype_t, char *, size_t)); + * PUBLIC: void vs_msg(SCR *, mtype_t, char *, size_t); */ void vs_msg(SCR *sp, mtype_t mtype, char *line, size_t len) @@ -506,7 +506,7 @@ vs_output(SCR *sp, mtype_t mtype, const char *line, int llen) * This routine is called when exiting a colon command to resolve any ex * output that may have occurred. * - * PUBLIC: int vs_ex_resolve __P((SCR *, int *)); + * PUBLIC: int vs_ex_resolve(SCR *, int *); */ int vs_ex_resolve(SCR *sp, int *continuep) @@ -630,7 +630,7 @@ vs_ex_resolve(SCR *sp, int *continuep) * vs_resolve -- * Deal with message output. * - * PUBLIC: int vs_resolve __P((SCR *, SCR *, int)); + * PUBLIC: int vs_resolve(SCR *, SCR *, int); */ int vs_resolve(SCR *sp, SCR *csp, int forcewait) diff --git a/vi/vs_refresh.c b/vi/vs_refresh.c index 8343b8041c29..68b51a12b35b 100644 --- a/vi/vs_refresh.c +++ b/vi/vs_refresh.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "$Id: vs_refresh.c,v 10.53 2013/11/01 11:57:36 zy Exp $"; +static const char sccsid[] = "$Id: vs_refresh.c,v 10.54 2015/04/08 16:32:49 zy Exp $"; #endif /* not lint */ #include @@ -30,14 +30,14 @@ static const char sccsid[] = "$Id: vs_refresh.c,v 10.53 2013/11/01 11:57:36 zy E #define UPDATE_CURSOR 0x01 /* Update the cursor. */ #define UPDATE_SCREEN 0x02 /* Flush to screen. */ -static void vs_modeline __P((SCR *)); -static int vs_paint __P((SCR *, u_int)); +static void vs_modeline(SCR *); +static int vs_paint(SCR *, u_int); /* * v_repaint -- * Repaint selected lines from the screen. * - * PUBLIC: int vs_repaint __P((SCR *, EVENT *)); + * PUBLIC: int vs_repaint(SCR *, EVENT *); */ int vs_repaint( @@ -59,7 +59,7 @@ vs_repaint( * vs_refresh -- * Refresh all screens. * - * PUBLIC: int vs_refresh __P((SCR *, int)); + * PUBLIC: int vs_refresh(SCR *, int); */ int vs_refresh( @@ -593,7 +593,7 @@ slow: for (smp = HMAP; smp->lno != LNO; ++smp); * for the number option offset. */ cnt = vs_columns(sp, NULL, LNO, &CNO, NULL); - if (O_ISSET(sp, O_NUMBER) && cnt >= O_NUMBER_LENGTH) + if (O_ISSET(sp, O_NUMBER)) cnt -= O_NUMBER_LENGTH; /* Adjust the window towards the beginning of the line. */ diff --git a/vi/vs_relative.c b/vi/vs_relative.c index 5f25b51d9342..abeb70e68e1f 100644 --- a/vi/vs_relative.c +++ b/vi/vs_relative.c @@ -29,7 +29,7 @@ static const char sccsid[] = "$Id: vs_relative.c,v 10.19 2011/12/01 15:22:59 zy * vs_column -- * Return the logical column of the cursor in the line. * - * PUBLIC: int vs_column __P((SCR *, size_t *)); + * PUBLIC: int vs_column(SCR *, size_t *); */ int vs_column(SCR *sp, size_t *colp) @@ -50,7 +50,7 @@ vs_column(SCR *sp, size_t *colp) * the physical character column within the line, including space * required for the O_NUMBER and O_LIST options. * - * PUBLIC: size_t vs_screens __P((SCR *, recno_t, size_t *)); + * PUBLIC: size_t vs_screens(SCR *, recno_t, size_t *); */ size_t vs_screens(SCR *sp, recno_t lno, size_t *cnop) @@ -93,7 +93,7 @@ vs_screens(SCR *sp, recno_t lno, size_t *cnop) * Return the screen columns necessary to display the line, or, * if specified, the physical character column within the line. * - * PUBLIC: size_t vs_columns __P((SCR *, CHAR_T *, recno_t, size_t *, size_t *)); + * PUBLIC: size_t vs_columns(SCR *, CHAR_T *, recno_t, size_t *, size_t *); */ size_t vs_columns(SCR *sp, CHAR_T *lp, recno_t lno, size_t *cnop, size_t *diffp) @@ -192,7 +192,7 @@ done: if (diffp != NULL) /* XXX */ * character closest to the currently most attractive character * position (which is stored as a screen column). * - * PUBLIC: size_t vs_rcm __P((SCR *, recno_t, int)); + * PUBLIC: size_t vs_rcm(SCR *, recno_t, int); */ size_t vs_rcm(SCR *sp, recno_t lno, int islast) @@ -218,7 +218,7 @@ vs_rcm(SCR *sp, recno_t lno, int islast) * Return the physical column from the line that will display a * character closest to the specified screen column. * - * PUBLIC: size_t vs_colpos __P((SCR *, recno_t, size_t)); + * PUBLIC: size_t vs_colpos(SCR *, recno_t, size_t); */ size_t vs_colpos(SCR *sp, recno_t lno, size_t cno) diff --git a/vi/vs_smap.c b/vi/vs_smap.c index 0ab2df9e95bf..9dcb8d49b626 100644 --- a/vi/vs_smap.c +++ b/vi/vs_smap.c @@ -26,20 +26,20 @@ static const char sccsid[] = "$Id: vs_smap.c,v 10.31 2011/02/26 13:56:21 skimo E #include "../common/common.h" #include "vi.h" -static int vs_deleteln __P((SCR *, int)); -static int vs_insertln __P((SCR *, int)); -static int vs_sm_delete __P((SCR *, recno_t)); -static int vs_sm_down __P((SCR *, MARK *, recno_t, scroll_t, SMAP *)); -static int vs_sm_erase __P((SCR *)); -static int vs_sm_insert __P((SCR *, recno_t)); -static int vs_sm_reset __P((SCR *, recno_t)); -static int vs_sm_up __P((SCR *, MARK *, recno_t, scroll_t, SMAP *)); +static int vs_deleteln(SCR *, int); +static int vs_insertln(SCR *, int); +static int vs_sm_delete(SCR *, recno_t); +static int vs_sm_down(SCR *, MARK *, recno_t, scroll_t, SMAP *); +static int vs_sm_erase(SCR *); +static int vs_sm_insert(SCR *, recno_t); +static int vs_sm_reset(SCR *, recno_t); +static int vs_sm_up(SCR *, MARK *, recno_t, scroll_t, SMAP *); /* * vs_change -- * Make a change to the screen. * - * PUBLIC: int vs_change __P((SCR *, recno_t, lnop_t)); + * PUBLIC: int vs_change(SCR *, recno_t, lnop_t); */ int vs_change(SCR *sp, recno_t lno, lnop_t op) @@ -171,7 +171,7 @@ vs_change(SCR *sp, recno_t lno, lnop_t op) * slot is already filled in, P_BOTTOM means that the TMAP slot is * already filled in, and we just finish up the job. * - * PUBLIC: int vs_sm_fill __P((SCR *, recno_t, pos_t)); + * PUBLIC: int vs_sm_fill(SCR *, recno_t, pos_t); */ int vs_sm_fill(SCR *sp, recno_t lno, pos_t pos) @@ -512,7 +512,7 @@ vs_sm_reset(SCR *sp, recno_t lno) * Scroll the SMAP up/down count logical lines. Different * semantics based on the vi command, *sigh*. * - * PUBLIC: int vs_sm_scroll __P((SCR *, MARK *, recno_t, scroll_t)); + * PUBLIC: int vs_sm_scroll(SCR *, MARK *, recno_t, scroll_t); */ int vs_sm_scroll(SCR *sp, MARK *rp, recno_t count, scroll_t scmd) @@ -745,7 +745,7 @@ vs_sm_up(SCR *sp, MARK *rp, recno_t count, scroll_t scmd, SMAP *smp) * vs_sm_1up -- * Scroll the SMAP up one. * - * PUBLIC: int vs_sm_1up __P((SCR *)); + * PUBLIC: int vs_sm_1up(SCR *); */ int vs_sm_1up(SCR *sp) @@ -978,7 +978,7 @@ vs_sm_erase(SCR *sp) * vs_sm_1down -- * Scroll the SMAP down one. * - * PUBLIC: int vs_sm_1down __P((SCR *)); + * PUBLIC: int vs_sm_1down(SCR *); */ int vs_sm_1down(SCR *sp) @@ -1042,7 +1042,7 @@ vs_insertln(SCR *sp, int cnt) * vs_sm_next -- * Fill in the next entry in the SMAP. * - * PUBLIC: int vs_sm_next __P((SCR *, SMAP *, SMAP *)); + * PUBLIC: int vs_sm_next(SCR *, SMAP *, SMAP *); */ int vs_sm_next(SCR *sp, SMAP *p, SMAP *t) @@ -1070,7 +1070,7 @@ vs_sm_next(SCR *sp, SMAP *p, SMAP *t) * vs_sm_prev -- * Fill in the previous entry in the SMAP. * - * PUBLIC: int vs_sm_prev __P((SCR *, SMAP *, SMAP *)); + * PUBLIC: int vs_sm_prev(SCR *, SMAP *, SMAP *); */ int vs_sm_prev(SCR *sp, SMAP *p, SMAP *t) @@ -1095,7 +1095,7 @@ vs_sm_prev(SCR *sp, SMAP *p, SMAP *t) * vs_sm_cursor -- * Return the SMAP entry referenced by the cursor. * - * PUBLIC: int vs_sm_cursor __P((SCR *, SMAP **)); + * PUBLIC: int vs_sm_cursor(SCR *, SMAP **); */ int vs_sm_cursor(SCR *sp, SMAP **smpp) @@ -1134,7 +1134,7 @@ vs_sm_cursor(SCR *sp, SMAP **smpp) * (The vi H, M and L commands.) Here because only the screen routines * know what's really out there. * - * PUBLIC: int vs_sm_position __P((SCR *, MARK *, u_long, pos_t)); + * PUBLIC: int vs_sm_position(SCR *, MARK *, u_long, pos_t); */ int vs_sm_position(SCR *sp, MARK *rp, u_long cnt, pos_t pos) @@ -1214,7 +1214,7 @@ eof: msgq(sp, M_BERR, * Return the number of screen lines from an SMAP entry to the * start of some file line, less than a maximum value. * - * PUBLIC: recno_t vs_sm_nlines __P((SCR *, SMAP *, recno_t, size_t)); + * PUBLIC: recno_t vs_sm_nlines(SCR *, SMAP *, recno_t, size_t); */ recno_t vs_sm_nlines(SCR *sp, SMAP *from_sp, recno_t to_lno, size_t max) diff --git a/vi/vs_split.c b/vi/vs_split.c index 07bc8e50e2b0..d70b4a184d85 100644 --- a/vi/vs_split.c +++ b/vi/vs_split.c @@ -10,7 +10,7 @@ #include "config.h" #ifndef lint -static const char sccsid[] = "$Id: vs_split.c,v 10.42 2001/06/25 15:19:38 skimo Exp $"; +static const char sccsid[] = "$Id: vs_split.c,v 10.43 2015/04/05 15:21:55 zy Exp $"; #endif /* not lint */ #include @@ -29,15 +29,15 @@ static const char sccsid[] = "$Id: vs_split.c,v 10.42 2001/06/25 15:19:38 skimo typedef enum { HORIZ_FOLLOW, HORIZ_PRECEDE, VERT_FOLLOW, VERT_PRECEDE } jdir_t; -static SCR *vs_getbg __P((SCR *, char *)); -static void vs_insert __P((SCR *sp, GS *gp)); -static int vs_join __P((SCR *, SCR **, jdir_t *)); +static SCR *vs_getbg(SCR *, char *); +static void vs_insert(SCR *sp, GS *gp); +static int vs_join(SCR *, SCR **, jdir_t *); /* * vs_split -- * Create a new screen, horizontally. * - * PUBLIC: int vs_split __P((SCR *, SCR *, int)); + * PUBLIC: int vs_split(SCR *, SCR *, int); */ int vs_split( @@ -194,7 +194,7 @@ vs_split( */ F_SET(new, SC_SCR_REFORMAT | SC_STATUS | - F_ISSET(sp, SC_EX | SC_VI | SC_SCR_VI | SC_SCR_EX)); + F_ISSET(sp, SC_EX | SC_VI | SC_SCR_VI | SC_SCR_EX | SC_READONLY)); return (0); } @@ -202,7 +202,7 @@ vs_split( * vs_vsplit -- * Create a new screen, vertically. * - * PUBLIC: int vs_vsplit __P((SCR *, SCR *)); + * PUBLIC: int vs_vsplit(SCR *, SCR *); */ int vs_vsplit(SCR *sp, SCR *new) @@ -285,7 +285,7 @@ vs_vsplit(SCR *sp, SCR *new) */ F_SET(new, SC_SCR_REFORMAT | SC_STATUS | - F_ISSET(sp, SC_EX | SC_VI | SC_SCR_VI | SC_SCR_EX)); + F_ISSET(sp, SC_EX | SC_VI | SC_SCR_VI | SC_SCR_EX | SC_READONLY)); return (0); } @@ -331,7 +331,7 @@ vs_insert(SCR *sp, GS *gp) * Discard the screen, folding the real-estate into a related screen, * if one exists, and return that screen. * - * PUBLIC: int vs_discard __P((SCR *, SCR **)); + * PUBLIC: int vs_discard(SCR *, SCR **); */ int vs_discard(SCR *sp, SCR **spp) @@ -608,7 +608,7 @@ vs_join(SCR *sp, SCR **listp, jdir_t *jdirp) * vs_fg -- * Background the current screen, and foreground a new one. * - * PUBLIC: int vs_fg __P((SCR *, SCR **, CHAR_T *, int)); + * PUBLIC: int vs_fg(SCR *, SCR **, CHAR_T *, int); */ int vs_fg(SCR *sp, SCR **nspp, CHAR_T *name, int newscreen) @@ -661,7 +661,7 @@ vs_fg(SCR *sp, SCR **nspp, CHAR_T *name, int newscreen) * vs_bg -- * Background the screen, and switch to the next one. * - * PUBLIC: int vs_bg __P((SCR *)); + * PUBLIC: int vs_bg(SCR *); */ int vs_bg(SCR *sp) @@ -699,7 +699,7 @@ vs_bg(SCR *sp) * vs_swap -- * Swap the current screen with a backgrounded one. * - * PUBLIC: int vs_swap __P((SCR *, SCR **, char *)); + * PUBLIC: int vs_swap(SCR *, SCR **, char *); */ int vs_swap(SCR *sp, SCR **nspp, char *name) @@ -794,7 +794,7 @@ vs_swap(SCR *sp, SCR **nspp, char *name) * vs_resize -- * Change the absolute size of the current screen. * - * PUBLIC: int vs_resize __P((SCR *, long, adj_t)); + * PUBLIC: int vs_resize(SCR *, long, adj_t); */ int vs_resize(SCR *sp, long int count, adj_t adj)