aboutsummaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorBaptiste Daroussin <bapt@FreeBSD.org>2026-01-14 13:57:09 +0000
committerBaptiste Daroussin <bapt@FreeBSD.org>2026-01-14 13:57:09 +0000
commit3110ba77506bf66eef114d123fd8d091d443316a (patch)
tree3e2e55d54796084a0bb75d6df87696c00a4afca9 /common
parentae7f9696aefd6ce7b024af37c4d2c32f6783d106 (diff)
Diffstat (limited to 'common')
-rw-r--r--common/common.h13
-rw-r--r--common/cut.c5
-rw-r--r--common/extern.h131
-rw-r--r--common/line.c4
-rw-r--r--common/options.c39
-rw-r--r--common/options_def.h86
-rw-r--r--common/put.c46
-rw-r--r--common/recover.c2
8 files changed, 277 insertions, 49 deletions
diff --git a/common/common.h b/common/common.h
index fd97a4655cf5..a04b26ed8eb0 100644
--- a/common/common.h
+++ b/common/common.h
@@ -11,11 +11,7 @@
#define TCSASOFT 0
#endif
-#ifdef DB_H_ABS_PATH
-#include DB_H_ABS_PATH
-#else
#include <db.h>
-#endif
#include <regex.h> /* May refer to the bundled regex. */
#include <stdint.h>
@@ -92,4 +88,11 @@ typedef enum { SEQ_ABBREV, SEQ_COMMAND, SEQ_INPUT } seq_t;
#include "log.h"
#include "mem.h"
-#include "extern.h"
+#include "common_extern.h"
+
+#ifndef SLIST_REMOVE_AFTER
+#define SLIST_REMOVE_AFTER(elm, field) do { \
+ SLIST_NEXT(elm, field) = \
+ SLIST_NEXT(SLIST_NEXT(elm, field), field); \
+} while (0)
+#endif
diff --git a/common/cut.c b/common/cut.c
index 7d74f764a6d9..4b00d7c7b174 100644
--- a/common/cut.c
+++ b/common/cut.c
@@ -68,6 +68,10 @@ cut(SCR *sp, CHAR_T *namep, MARK *fm, MARK *tm, int flags)
recno_t lno;
int append, copy_one, copy_def;
+ /* Check if the line numbers are out-of-band */
+ if (fm->lno == OOBLNO || tm->lno == OOBLNO)
+ return (1);
+
/*
* If the user specified a buffer, put it there. (This may require
* a copy into the numeric buffers. We do the copy so that we don't
@@ -175,6 +179,7 @@ cut_line_err:
text_lfree(cbp->textq);
cbp->len = 0;
cbp->flags = 0;
+ sp->gp->dcbp = NULL;
return (1);
}
diff --git a/common/extern.h b/common/extern.h
new file mode 100644
index 000000000000..c887696080de
--- /dev/null
+++ b/common/extern.h
@@ -0,0 +1,131 @@
+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
+ (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 *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/line.c b/common/line.c
index 06d9a3e692d1..d1b7cb51e247 100644
--- a/common/line.c
+++ b/common/line.c
@@ -51,7 +51,7 @@ db_eget(SCR *sp,
* line in an empty file, find the last line of the file; db_last
* fails loudly.
*/
- if ((lno == 0 || lno == 1) && db_last(sp, &l1))
+ if ((lno == OOBLNO || lno == 1) && db_last(sp, &l1))
return (1);
/* If the file isn't empty, fail loudly. */
@@ -92,7 +92,7 @@ db_get(SCR *sp,
* have to have an OOB condition for the look-aside into the input
* buffer anyway.
*/
- if (lno == 0)
+ if (lno == OOBLNO)
goto err1;
/* Check for no underlying file. */
diff --git a/common/options.c b/common/options.c
index 87d5c5a88521..d54bf1d508d2 100644
--- a/common/options.c
+++ b/common/options.c
@@ -317,14 +317,13 @@ opts_init(SCR *sp, int *oargs)
argv[1] = &b;
/* Set numeric and string default values. */
-#define OI(indx, str) do { \
- a.len = STRLEN(str); \
- if (STRCMP((CHAR_T*)str, b2) != 0) \
- (void)MEMCPY(b2, str, a.len+1); \
- if (opts_set(sp, argv, NULL)) { \
- optindx = indx; \
+#define OI(indx, ...) do { \
+ size_t len = SPRINTF(b2, SIZE(b2), __VA_ARGS__); \
+ if (len < 0 || len >= SIZE(b2) || opts_set(sp, argv, NULL)) { \
+ optindx = indx; \
goto err; \
} \
+ a.len = len; \
} while (0)
/*
* Indirect global options to global space. Specifically, set up
@@ -345,9 +344,7 @@ opts_init(SCR *sp, int *oargs)
F_SET(&sp->opts[O_SECURE], OPT_GLOBAL);
/* Initialize string values. */
- (void)SPRINTF(b2, SIZE(b2),
- L("cdpath=%s"), (s = getenv("CDPATH")) == NULL ? ":" : s);
- OI(O_CDPATH, b2);
+ OI(O_CDPATH, L("cdpath=%s"), (s = getenv("CDPATH")) == NULL ? ":" : s);
OI(O_CEDIT, L("cedit=\033"));
/*
@@ -357,32 +354,26 @@ opts_init(SCR *sp, int *oargs)
* are two ways to change this -- the user can set either the directory
* option or the TMPDIR environmental variable.
*/
- (void)SPRINTF(b2, SIZE(b2),
+ OI(O_TMPDIR,
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_MSGCAT, L("msgcat=%s"), _PATH_MSGCAT);
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"), NVI_PATH_PRESERVE);
- OI(O_RECDIR, b2);
+ OI(O_PATH, L("path=%s"), "");
+ OI(O_RECDIR, L("recdir=%s"), NVI_PATH_PRESERVE);
OI(O_SECTIONS, L("sections=NHSHH HUnhsh"));
- (void)SPRINTF(b2, SIZE(b2),
+ OI(O_SHELL,
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);
+ OI(O_TAGS, L("tags=%s"), _PATH_TAGS);
/*
* XXX
@@ -391,8 +382,7 @@ opts_init(SCR *sp, int *oargs)
*/
if ((v = (O_VAL(sp, O_LINES) - 1) / 2) == 0)
v = 1;
- (void)SPRINTF(b2, SIZE(b2), L("scroll=%ld"), v);
- OI(O_SCROLL, b2);
+ OI(O_SCROLL, L("scroll=%ld"), v);
/*
* The default window option values are:
@@ -412,8 +402,7 @@ opts_init(SCR *sp, int *oargs)
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);
+ OI(O_WINDOW, L("window=%lu"), v);
/*
* Set boolean default values, and copy all settings into the default
diff --git a/common/options_def.h b/common/options_def.h
new file mode 100644
index 000000000000..15104845c380
--- /dev/null
+++ b/common/options_def.h
@@ -0,0 +1,86 @@
+#define O_ALTNOTATION 0
+#define O_ALTWERASE 1
+#define O_AUTOINDENT 2
+#define O_AUTOPRINT 3
+#define O_AUTOWRITE 4
+#define O_BACKUP 5
+#define O_BEAUTIFY 6
+#define O_CDPATH 7
+#define O_CEDIT 8
+#define O_COLUMNS 9
+#define O_COMBINED 10
+#define O_COMMENT 11
+#define O_TMPDIR 12
+#define O_EDCOMPATIBLE 13
+#define O_ERRORBELLS 14
+#define O_ESCAPETIME 15
+#define O_EXPANDTAB 16
+#define O_EXRC 17
+#define O_EXTENDED 18
+#define O_FILEC 19
+#define O_FILEENCODING 20
+#define O_FLASH 21
+#define O_HARDTABS 22
+#define O_ICLOWER 23
+#define O_IGNORECASE 24
+#define O_INPUTENCODING 25
+#define O_KEYTIME 26
+#define O_LEFTRIGHT 27
+#define O_LINES 28
+#define O_LISP 29
+#define O_LIST 30
+#define O_LOCKFILES 31
+#define O_MAGIC 32
+#define O_MATCHCHARS 33
+#define O_MATCHTIME 34
+#define O_MESG 35
+#define O_MODELINE 36
+#define O_MSGCAT 37
+#define O_NOPRINT 38
+#define O_NUMBER 39
+#define O_OCTAL 40
+#define O_OPEN 41
+#define O_OPTIMIZE 42
+#define O_PARAGRAPHS 43
+#define O_PATH 44
+#define O_PRINT 45
+#define O_PROMPT 46
+#define O_READONLY 47
+#define O_RECDIR 48
+#define O_REDRAW 49
+#define O_REMAP 50
+#define O_REPORT 51
+#define O_RULER 52
+#define O_SCROLL 53
+#define O_SEARCHINCR 54
+#define O_SECTIONS 55
+#define O_SECURE 56
+#define O_SHELL 57
+#define O_SHELLMETA 58
+#define O_SHIFTWIDTH 59
+#define O_SHOWFILENAME 60
+#define O_SHOWMATCH 61
+#define O_SHOWMODE 62
+#define O_SIDESCROLL 63
+#define O_SLOWOPEN 64
+#define O_SOURCEANY 65
+#define O_TABSTOP 66
+#define O_TAGLENGTH 67
+#define O_TAGS 68
+#define O_TERM 69
+#define O_TERSE 70
+#define O_TILDEOP 71
+#define O_TIMEOUT 72
+#define O_TTYWERASE 73
+#define O_VERBOSE 74
+#define O_W1200 75
+#define O_W300 76
+#define O_W9600 77
+#define O_WARN 78
+#define O_WINDOW 79
+#define O_WINDOWNAME 80
+#define O_WRAPLEN 81
+#define O_WRAPMARGIN 82
+#define O_WRAPSCAN 83
+#define O_WRITEANY 84
+#define O_OPTIONCOUNT 85
diff --git a/common/put.c b/common/put.c
index f39948808e7d..9862682c9bbb 100644
--- a/common/put.c
+++ b/common/put.c
@@ -26,16 +26,16 @@
* put --
* Put text buffer contents into the file.
*
- * PUBLIC: int put(SCR *, CB *, CHAR_T *, MARK *, MARK *, int);
+ * PUBLIC: int put(SCR *, CB *, CHAR_T *, MARK *, MARK *, int, int);
*/
int
-put(SCR *sp, CB *cbp, CHAR_T *namep, MARK *cp, MARK *rp, int append)
+put(SCR *sp, CB *cbp, CHAR_T *namep, MARK *cp, MARK *rp, int append, int cnt)
{
CHAR_T name;
TEXT *ltp, *tp;
recno_t lno;
size_t blen, clen, len;
- int rval;
+ int rval, i, isempty;
CHAR_T *bp, *t;
CHAR_T *p;
@@ -77,11 +77,16 @@ put(SCR *sp, CB *cbp, CHAR_T *namep, MARK *cp, MARK *rp, int append)
if (cp->lno == 1) {
if (db_last(sp, &lno))
return (1);
- if (lno == 0) {
- 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);
+ if (lno == 0 && F_ISSET(cbp, CB_LMODE)) {
+ for (i = cnt; i > 0; i--) {
+ 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);
+ tp = TAILQ_FIRST(cbp->textq);
+ }
rp->lno = 1;
rp->cno = 0;
return (0);
@@ -92,10 +97,14 @@ put(SCR *sp, CB *cbp, CHAR_T *namep, MARK *cp, MARK *rp, int append)
if (F_ISSET(cbp, CB_LMODE)) {
lno = append ? cp->lno : cp->lno - 1;
rp->lno = lno + 1;
- 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);
+ for (i = cnt; i > 0; i--) {
+ 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);
+ tp = TAILQ_FIRST(cbp->textq);
+ }
rp->cno = 0;
(void)nonblank(sp, rp->lno, &rp->cno);
return (0);
@@ -111,8 +120,11 @@ put(SCR *sp, CB *cbp, CHAR_T *namep, MARK *cp, MARK *rp, int append)
* Get the first line.
*/
lno = cp->lno;
- if (db_get(sp, lno, DBG_FATAL, &p, &len))
- return (1);
+ if (db_eget(sp, lno, &p, &len, &isempty)) {
+ if (!isempty)
+ return (1);
+ len = 0;
+ }
GET_SPACE_RETW(sp, bp, blen, tp->len + len + 1);
t = bp;
@@ -126,8 +138,10 @@ put(SCR *sp, CB *cbp, CHAR_T *namep, MARK *cp, MARK *rp, int append)
/* First line from the CB. */
if (tp->len != 0) {
- MEMCPY(t, tp->lb, tp->len);
- t += tp->len;
+ for (i = cnt; i > 0; i--) {
+ MEMCPY(t, tp->lb, tp->len);
+ t += tp->len;
+ }
}
/* Calculate length left in the original line. */
diff --git a/common/recover.c b/common/recover.c
index cf222bfb5200..7b3a1791f74d 100644
--- a/common/recover.c
+++ b/common/recover.c
@@ -34,8 +34,8 @@
#include <time.h>
#include <unistd.h>
-#include "../ex/version.h"
#include "common.h"
+#include "version.h"
#include "pathnames.h"
/*