v_util.c revision 254225
1169695Skan/*-
2169695Skan * Copyright (c) 1992, 1993, 1994
3169695Skan *	The Regents of the University of California.  All rights reserved.
4169695Skan * Copyright (c) 1992, 1993, 1994, 1995, 1996
5169695Skan *	Keith Bostic.  All rights reserved.
6169695Skan *
7169695Skan * See the LICENSE file for redistribution information.
8169695Skan */
9169695Skan
10169695Skan#include "config.h"
11169695Skan
12169695Skan#ifndef lint
13169695Skanstatic const char sccsid[] = "$Id: v_util.c,v 10.14 2001/06/25 15:19:36 skimo Exp $";
14169695Skan#endif /* not lint */
15169695Skan
16169695Skan#include <sys/types.h>
17169695Skan#include <sys/queue.h>
18169695Skan#include <sys/time.h>
19169695Skan
20169695Skan#include <bitstring.h>
21169695Skan#include <ctype.h>
22169695Skan#include <limits.h>
23169695Skan#include <stdio.h>
24169695Skan#include <stdlib.h>
25169695Skan#include <string.h>
26169695Skan#include <unistd.h>
27169695Skan
28169695Skan#include "../common/common.h"
29169695Skan#include "vi.h"
30169695Skan
31169695Skan/*
32169695Skan * v_eof --
33169695Skan *	Vi end-of-file error.
34169695Skan *
35169695Skan * PUBLIC: void v_eof __P((SCR *, MARK *));
36169695Skan */
37169695Skanvoid
38169695Skanv_eof(SCR *sp, MARK *mp)
39169695Skan{
40169695Skan	recno_t lno;
41169695Skan
42169695Skan	if (mp == NULL)
43169695Skan		v_emsg(sp, NULL, VIM_EOF);
44169695Skan	else {
45169695Skan		if (db_last(sp, &lno))
46169695Skan			return;
47169695Skan		if (mp->lno >= lno)
48169695Skan			v_emsg(sp, NULL, VIM_EOF);
49169695Skan		else
50169695Skan			msgq(sp, M_BERR, "195|Movement past the end-of-file");
51169695Skan	}
52169695Skan}
53169695Skan
54169695Skan/*
55169695Skan * v_eol --
56169695Skan *	Vi end-of-line error.
57169695Skan *
58169695Skan * PUBLIC: void v_eol __P((SCR *, MARK *));
59169695Skan */
60169695Skanvoid
61169695Skanv_eol(SCR *sp, MARK *mp)
62169695Skan{
63169695Skan	size_t len;
64169695Skan
65169695Skan	if (mp == NULL)
66169695Skan		v_emsg(sp, NULL, VIM_EOL);
67169695Skan	else {
68169695Skan		if (db_get(sp, mp->lno, DBG_FATAL, NULL, &len))
69169695Skan			return;
70169695Skan		if (mp->cno == len - 1)
71169695Skan			v_emsg(sp, NULL, VIM_EOL);
72169695Skan		else
73169695Skan			msgq(sp, M_BERR, "196|Movement past the end-of-line");
74169695Skan	}
75169695Skan}
76169695Skan
77169695Skan/*
78169695Skan * v_nomove --
79169695Skan *	Vi no cursor movement error.
80169695Skan *
81169695Skan * PUBLIC: void v_nomove __P((SCR *));
82169695Skan */
83169695Skanvoid
84169695Skanv_nomove(SCR *sp)
85169695Skan{
86169695Skan	msgq(sp, M_BERR, "197|No cursor movement made");
87169695Skan}
88169695Skan
89169695Skan/*
90169695Skan * v_sof --
91169695Skan *	Vi start-of-file error.
92169695Skan *
93169695Skan * PUBLIC: void v_sof __P((SCR *, MARK *));
94169695Skan */
95169695Skanvoid
96169695Skanv_sof(SCR *sp, MARK *mp)
97169695Skan{
98169695Skan	if (mp == NULL || mp->lno == 1)
99169695Skan		msgq(sp, M_BERR, "198|Already at the beginning of the file");
100169695Skan	else
101169695Skan		msgq(sp, M_BERR, "199|Movement past the beginning of the file");
102169695Skan}
103169695Skan
104169695Skan/*
105169695Skan * v_sol --
106169695Skan *	Vi start-of-line error.
107169695Skan *
108169695Skan * PUBLIC: void v_sol __P((SCR *));
109169695Skan */
110169695Skanvoid
111169695Skanv_sol(SCR *sp)
112169695Skan{
113169695Skan	msgq(sp, M_BERR, "200|Already in the first column");
114169695Skan}
115169695Skan
116169695Skan/*
117169695Skan * v_isempty --
118169695Skan *	Return if the line contains nothing but white-space characters.
119169695Skan *
120169695Skan * PUBLIC: int v_isempty __P((CHAR_T *, size_t));
121169695Skan */
122169695Skanint
123169695Skanv_isempty(CHAR_T *p, size_t len)
124169695Skan{
125169695Skan	for (; len--; ++p)
126169695Skan		if (!isblank(*p))
127169695Skan			return (0);
128169695Skan	return (1);
129169695Skan}
130169695Skan
131169695Skan/*
132169695Skan * v_emsg --
133169695Skan *	Display a few common vi messages.
134169695Skan *
135169695Skan * PUBLIC: void v_emsg __P((SCR *, char *, vim_t));
136169695Skan */
137169695Skanvoid
138169695Skanv_emsg(SCR *sp, char *p, vim_t which)
139169695Skan{
140169695Skan	switch (which) {
141169695Skan	case VIM_COMBUF:
142169695Skan		msgq(sp, M_ERR,
143169695Skan		    "201|Buffers should be specified before the command");
144169695Skan		break;
145169695Skan	case VIM_EMPTY:
146169695Skan		msgq(sp, M_BERR, "209|The file is empty");
147169695Skan		break;
148169695Skan	case VIM_EOF:
149169695Skan		msgq(sp, M_BERR, "202|Already at end-of-file");
150169695Skan		break;
151169695Skan	case VIM_EOL:
152169695Skan		msgq(sp, M_BERR, "203|Already at end-of-line");
153169695Skan		break;
154169695Skan	case VIM_NOCOM:
155169695Skan	case VIM_NOCOM_B:
156169695Skan		msgq(sp,
157169695Skan		    which == VIM_NOCOM_B ? M_BERR : M_ERR,
158169695Skan		    "204|%s isn't a vi command", p);
159169695Skan		break;
160169695Skan	case VIM_WRESIZE:
161169695Skan		msgq(sp, M_ERR, "Window resize interrupted text input mode");
162169695Skan		break;
163169695Skan	case VIM_USAGE:
164169695Skan		msgq(sp, M_ERR, "205|Usage: %s", p);
165169695Skan		break;
166169695Skan	}
167169695Skan}
168169695Skan