Stop the read module from poking the el_chared.c_macro data structure
currently belonging to the chared module. The read module does so
from three of its functions, while no other module uses the macro
data, not even the chared module itself. That's quite logical
because macros are a feature of input handling, all of which is
done by the read module, and none by the chared module. So move
the data into the read modules's own opaque data structure, struct
el_read_t.
That simplifies internal interfaces in several respects: The
semi-public chared.h has one fewer struct, one fewer #define, and
one fewer member in struct el_chared_t; all three move to one single
C file, read.c, and are now module-local. And the internal interface
function ch_reset() needs one fewer argument, making the code of many
functions in various modules more readable.
The price is one additional internal interface function, read_end(),
10 lines long including comments, called publicly from exactly one
place: el_end() in el.c. That's hardly an increase in complexity
since most other modules already have their *_end() function, read.c
was the odd one out not having one.
From Ingo Schwarze
2016-05-22 22:44:26 +03:00
|
|
|
/* $NetBSD: chared.h,v 1.30 2016/05/22 19:44:26 christos Exp $ */
|
1997-01-11 09:47:47 +03:00
|
|
|
|
1994-05-06 10:01:42 +04:00
|
|
|
/*-
|
|
|
|
* Copyright (c) 1992, 1993
|
|
|
|
* The Regents of the University of California. All rights reserved.
|
|
|
|
*
|
|
|
|
* This code is derived from software contributed to Berkeley by
|
|
|
|
* Christos Zoulas of Cornell University.
|
|
|
|
*
|
|
|
|
* 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.
|
2003-08-07 20:42:00 +04:00
|
|
|
* 3. Neither the name of the University nor the names of its contributors
|
1994-05-06 10:01:42 +04:00
|
|
|
* 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.
|
|
|
|
*
|
|
|
|
* @(#)chared.h 8.1 (Berkeley) 6/4/93
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* el.chared.h: Character editor interface
|
|
|
|
*/
|
|
|
|
#ifndef _h_el_chared
|
2000-09-05 02:06:28 +04:00
|
|
|
#define _h_el_chared
|
1994-05-06 10:01:42 +04:00
|
|
|
|
|
|
|
/*
|
2005-08-08 18:05:37 +04:00
|
|
|
* This is an issue of basic "vi" look-and-feel. Defining VI_MOVE works
|
1994-05-06 10:01:42 +04:00
|
|
|
* like real vi: i.e. the transition from command<->insert modes moves
|
|
|
|
* the cursor.
|
|
|
|
*
|
1999-07-02 19:14:07 +04:00
|
|
|
* On the other hand we really don't want to move the cursor, because
|
1994-05-06 10:01:42 +04:00
|
|
|
* all the editing commands don't include the character under the cursor.
|
|
|
|
* Probably the best fix is to make all the editing commands aware of
|
|
|
|
* this fact.
|
|
|
|
*/
|
2000-09-05 02:06:28 +04:00
|
|
|
#define VI_MOVE
|
1994-05-06 10:01:42 +04:00
|
|
|
|
1999-07-02 19:14:07 +04:00
|
|
|
/*
|
2002-10-28 00:41:50 +03:00
|
|
|
* Undo information for vi - no undo in emacs (yet)
|
1994-05-06 10:01:42 +04:00
|
|
|
*/
|
|
|
|
typedef struct c_undo_t {
|
2009-02-16 00:55:23 +03:00
|
|
|
ssize_t len; /* length of saved line */
|
2002-10-28 00:41:50 +03:00
|
|
|
int cursor; /* position of saved cursor */
|
2016-04-11 03:50:13 +03:00
|
|
|
wchar_t *buf; /* full saved text */
|
1994-05-06 10:01:42 +04:00
|
|
|
} c_undo_t;
|
|
|
|
|
2002-11-15 17:32:32 +03:00
|
|
|
/* redo for vi */
|
|
|
|
typedef struct c_redo_t {
|
2016-04-11 03:50:13 +03:00
|
|
|
wchar_t *buf; /* redo insert key sequence */
|
|
|
|
wchar_t *pos;
|
|
|
|
wchar_t *lim;
|
2002-11-15 17:32:32 +03:00
|
|
|
el_action_t cmd; /* command to redo */
|
2016-04-11 03:50:13 +03:00
|
|
|
wchar_t ch; /* char that invoked it */
|
2002-11-15 17:32:32 +03:00
|
|
|
int count;
|
|
|
|
int action; /* from cv_action() */
|
|
|
|
} c_redo_t;
|
|
|
|
|
1994-05-06 10:01:42 +04:00
|
|
|
/*
|
|
|
|
* Current action information for vi
|
|
|
|
*/
|
|
|
|
typedef struct c_vcmd_t {
|
2000-09-05 02:06:28 +04:00
|
|
|
int action;
|
2016-04-11 03:50:13 +03:00
|
|
|
wchar_t *pos;
|
1994-05-06 10:01:42 +04:00
|
|
|
} c_vcmd_t;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Kill buffer for emacs
|
|
|
|
*/
|
|
|
|
typedef struct c_kill_t {
|
2016-04-11 03:50:13 +03:00
|
|
|
wchar_t *buf;
|
|
|
|
wchar_t *last;
|
|
|
|
wchar_t *mark;
|
1994-05-06 10:01:42 +04:00
|
|
|
} c_kill_t;
|
|
|
|
|
2010-08-28 19:44:59 +04:00
|
|
|
typedef void (*el_zfunc_t)(EditLine *, void *);
|
2014-06-18 22:12:28 +04:00
|
|
|
typedef const char *(*el_afunc_t)(void *, const char *);
|
2010-08-28 19:44:59 +04:00
|
|
|
|
1994-05-06 10:01:42 +04:00
|
|
|
/*
|
|
|
|
* Note that we use both data structures because the user can bind
|
|
|
|
* commands from both editors!
|
|
|
|
*/
|
|
|
|
typedef struct el_chared_t {
|
2000-09-05 02:06:28 +04:00
|
|
|
c_undo_t c_undo;
|
|
|
|
c_kill_t c_kill;
|
2002-11-15 17:32:32 +03:00
|
|
|
c_redo_t c_redo;
|
2000-09-05 02:06:28 +04:00
|
|
|
c_vcmd_t c_vcmd;
|
2010-08-28 19:44:59 +04:00
|
|
|
el_zfunc_t c_resizefun;
|
2014-06-18 22:12:28 +04:00
|
|
|
el_afunc_t c_aliasfun;
|
2010-08-28 19:44:59 +04:00
|
|
|
void * c_resizearg;
|
2014-06-18 22:12:28 +04:00
|
|
|
void * c_aliasarg;
|
1994-05-06 10:01:42 +04:00
|
|
|
} el_chared_t;
|
|
|
|
|
|
|
|
|
2000-09-05 02:06:28 +04:00
|
|
|
#define STRQQ "\"\""
|
1994-05-06 10:01:42 +04:00
|
|
|
|
2000-09-05 02:06:28 +04:00
|
|
|
#define isglob(a) (strchr("*[]?", (a)) != NULL)
|
1994-05-06 10:01:42 +04:00
|
|
|
|
2000-09-05 02:06:28 +04:00
|
|
|
#define NOP 0x00
|
|
|
|
#define DELETE 0x01
|
|
|
|
#define INSERT 0x02
|
2002-11-15 17:32:32 +03:00
|
|
|
#define YANK 0x04
|
1994-05-06 10:01:42 +04:00
|
|
|
|
2002-11-15 17:32:32 +03:00
|
|
|
#define CHAR_FWD (+1)
|
|
|
|
#define CHAR_BACK (-1)
|
1994-05-06 10:01:42 +04:00
|
|
|
|
2000-09-05 02:06:28 +04:00
|
|
|
#define MODE_INSERT 0
|
|
|
|
#define MODE_REPLACE 1
|
|
|
|
#define MODE_REPLACE_1 2
|
1994-05-06 10:01:42 +04:00
|
|
|
|
|
|
|
|
2016-05-10 00:46:56 +03:00
|
|
|
libedit_private int cv__isword(wint_t);
|
|
|
|
libedit_private int cv__isWord(wint_t);
|
|
|
|
libedit_private void cv_delfini(EditLine *);
|
|
|
|
libedit_private wchar_t *cv__endword(wchar_t *, wchar_t *, int, int (*)(wint_t));
|
|
|
|
libedit_private int ce__isword(wint_t);
|
|
|
|
libedit_private void cv_undo(EditLine *);
|
|
|
|
libedit_private void cv_yank(EditLine *, const wchar_t *, int);
|
|
|
|
libedit_private wchar_t *cv_next_word(EditLine*, wchar_t *, wchar_t *, int,
|
2016-04-11 03:50:13 +03:00
|
|
|
int (*)(wint_t));
|
2016-05-10 00:46:56 +03:00
|
|
|
libedit_private wchar_t *cv_prev_word(wchar_t *, wchar_t *, int, int (*)(wint_t));
|
|
|
|
libedit_private wchar_t *c__next_word(wchar_t *, wchar_t *, int, int (*)(wint_t));
|
|
|
|
libedit_private wchar_t *c__prev_word(wchar_t *, wchar_t *, int, int (*)(wint_t));
|
|
|
|
libedit_private void c_insert(EditLine *, int);
|
|
|
|
libedit_private void c_delbefore(EditLine *, int);
|
|
|
|
libedit_private void c_delbefore1(EditLine *);
|
|
|
|
libedit_private void c_delafter(EditLine *, int);
|
|
|
|
libedit_private void c_delafter1(EditLine *);
|
|
|
|
libedit_private int c_gets(EditLine *, wchar_t *, const wchar_t *);
|
|
|
|
libedit_private int c_hpos(EditLine *);
|
|
|
|
|
|
|
|
libedit_private int ch_init(EditLine *);
|
Stop the read module from poking the el_chared.c_macro data structure
currently belonging to the chared module. The read module does so
from three of its functions, while no other module uses the macro
data, not even the chared module itself. That's quite logical
because macros are a feature of input handling, all of which is
done by the read module, and none by the chared module. So move
the data into the read modules's own opaque data structure, struct
el_read_t.
That simplifies internal interfaces in several respects: The
semi-public chared.h has one fewer struct, one fewer #define, and
one fewer member in struct el_chared_t; all three move to one single
C file, read.c, and are now module-local. And the internal interface
function ch_reset() needs one fewer argument, making the code of many
functions in various modules more readable.
The price is one additional internal interface function, read_end(),
10 lines long including comments, called publicly from exactly one
place: el_end() in el.c. That's hardly an increase in complexity
since most other modules already have their *_end() function, read.c
was the odd one out not having one.
From Ingo Schwarze
2016-05-22 22:44:26 +03:00
|
|
|
libedit_private void ch_reset(EditLine *);
|
2016-05-10 00:46:56 +03:00
|
|
|
libedit_private int ch_resizefun(EditLine *, el_zfunc_t, void *);
|
|
|
|
libedit_private int ch_aliasfun(EditLine *, el_afunc_t, void *);
|
|
|
|
libedit_private int ch_enlargebufs(EditLine *, size_t);
|
|
|
|
libedit_private void ch_end(EditLine *);
|
1994-05-06 10:01:42 +04:00
|
|
|
|
|
|
|
#endif /* _h_el_chared */
|