v_util.c revision 19304
119304Speter/*-
219304Speter * Copyright (c) 1992, 1993, 1994
319304Speter *	The Regents of the University of California.  All rights reserved.
419304Speter * Copyright (c) 1992, 1993, 1994, 1995, 1996
519304Speter *	Keith Bostic.  All rights reserved.
619304Speter *
719304Speter * See the LICENSE file for redistribution information.
819304Speter */
919304Speter
1019304Speter#include "config.h"
1119304Speter
1219304Speter#ifndef lint
1319304Speterstatic const char sccsid[] = "@(#)v_util.c	10.11 (Berkeley) 6/30/96";
1419304Speter#endif /* not lint */
1519304Speter
1619304Speter#include <sys/types.h>
1719304Speter#include <sys/queue.h>
1819304Speter#include <sys/time.h>
1919304Speter
2019304Speter#include <bitstring.h>
2119304Speter#include <ctype.h>
2219304Speter#include <limits.h>
2319304Speter#include <stdio.h>
2419304Speter#include <stdlib.h>
2519304Speter#include <string.h>
2619304Speter#include <unistd.h>
2719304Speter
2819304Speter#include "../common/common.h"
2919304Speter#include "vi.h"
3019304Speter
3119304Speter/*
3219304Speter * v_eof --
3319304Speter *	Vi end-of-file error.
3419304Speter *
3519304Speter * PUBLIC: void v_eof __P((SCR *, MARK *));
3619304Speter */
3719304Spetervoid
3819304Speterv_eof(sp, mp)
3919304Speter	SCR *sp;
4019304Speter	MARK *mp;
4119304Speter{
4219304Speter	recno_t lno;
4319304Speter
4419304Speter	if (mp == NULL)
4519304Speter		v_emsg(sp, NULL, VIM_EOF);
4619304Speter	else {
4719304Speter		if (db_last(sp, &lno))
4819304Speter			return;
4919304Speter		if (mp->lno >= lno)
5019304Speter			v_emsg(sp, NULL, VIM_EOF);
5119304Speter		else
5219304Speter			msgq(sp, M_BERR, "195|Movement past the end-of-file");
5319304Speter	}
5419304Speter}
5519304Speter
5619304Speter/*
5719304Speter * v_eol --
5819304Speter *	Vi end-of-line error.
5919304Speter *
6019304Speter * PUBLIC: void v_eol __P((SCR *, MARK *));
6119304Speter */
6219304Spetervoid
6319304Speterv_eol(sp, mp)
6419304Speter	SCR *sp;
6519304Speter	MARK *mp;
6619304Speter{
6719304Speter	size_t len;
6819304Speter
6919304Speter	if (mp == NULL)
7019304Speter		v_emsg(sp, NULL, VIM_EOL);
7119304Speter	else {
7219304Speter		if (db_get(sp, mp->lno, DBG_FATAL, NULL, &len))
7319304Speter			return;
7419304Speter		if (mp->cno == len - 1)
7519304Speter			v_emsg(sp, NULL, VIM_EOL);
7619304Speter		else
7719304Speter			msgq(sp, M_BERR, "196|Movement past the end-of-line");
7819304Speter	}
7919304Speter}
8019304Speter
8119304Speter/*
8219304Speter * v_nomove --
8319304Speter *	Vi no cursor movement error.
8419304Speter *
8519304Speter * PUBLIC: void v_nomove __P((SCR *));
8619304Speter */
8719304Spetervoid
8819304Speterv_nomove(sp)
8919304Speter	SCR *sp;
9019304Speter{
9119304Speter	msgq(sp, M_BERR, "197|No cursor movement made");
9219304Speter}
9319304Speter
9419304Speter/*
9519304Speter * v_sof --
9619304Speter *	Vi start-of-file error.
9719304Speter *
9819304Speter * PUBLIC: void v_sof __P((SCR *, MARK *));
9919304Speter */
10019304Spetervoid
10119304Speterv_sof(sp, mp)
10219304Speter	SCR *sp;
10319304Speter	MARK *mp;
10419304Speter{
10519304Speter	if (mp == NULL || mp->lno == 1)
10619304Speter		msgq(sp, M_BERR, "198|Already at the beginning of the file");
10719304Speter	else
10819304Speter		msgq(sp, M_BERR, "199|Movement past the beginning of the file");
10919304Speter}
11019304Speter
11119304Speter/*
11219304Speter * v_sol --
11319304Speter *	Vi start-of-line error.
11419304Speter *
11519304Speter * PUBLIC: void v_sol __P((SCR *));
11619304Speter */
11719304Spetervoid
11819304Speterv_sol(sp)
11919304Speter	SCR *sp;
12019304Speter{
12119304Speter	msgq(sp, M_BERR, "200|Already in the first column");
12219304Speter}
12319304Speter
12419304Speter/*
12519304Speter * v_isempty --
12619304Speter *	Return if the line contains nothing but white-space characters.
12719304Speter *
12819304Speter * PUBLIC: int v_isempty __P((char *, size_t));
12919304Speter */
13019304Speterint
13119304Speterv_isempty(p, len)
13219304Speter	char *p;
13319304Speter	size_t len;
13419304Speter{
13519304Speter	for (; len--; ++p)
13619304Speter		if (!isblank(*p))
13719304Speter			return (0);
13819304Speter	return (1);
13919304Speter}
14019304Speter
14119304Speter/*
14219304Speter * v_emsg --
14319304Speter *	Display a few common vi messages.
14419304Speter *
14519304Speter * PUBLIC: void v_emsg __P((SCR *, char *, vim_t));
14619304Speter */
14719304Spetervoid
14819304Speterv_emsg(sp, p, which)
14919304Speter	SCR *sp;
15019304Speter	char *p;
15119304Speter	vim_t which;
15219304Speter{
15319304Speter	switch (which) {
15419304Speter	case VIM_COMBUF:
15519304Speter		msgq(sp, M_ERR,
15619304Speter		    "201|Buffers should be specified before the command");
15719304Speter		break;
15819304Speter	case VIM_EMPTY:
15919304Speter		msgq(sp, M_BERR, "209|The file is empty");
16019304Speter		break;
16119304Speter	case VIM_EOF:
16219304Speter		msgq(sp, M_BERR, "202|Already at end-of-file");
16319304Speter		break;
16419304Speter	case VIM_EOL:
16519304Speter		msgq(sp, M_BERR, "203|Already at end-of-line");
16619304Speter		break;
16719304Speter	case VIM_NOCOM:
16819304Speter	case VIM_NOCOM_B:
16919304Speter		msgq(sp,
17019304Speter		    which == VIM_NOCOM_B ? M_BERR : M_ERR,
17119304Speter		    "204|%s isn't a vi command", p);
17219304Speter		break;
17319304Speter	case VIM_WRESIZE:
17419304Speter		msgq(sp, M_ERR, "Window resize interrupted text input mode");
17519304Speter		break;
17619304Speter	case VIM_USAGE:
17719304Speter		msgq(sp, M_ERR, "205|Usage: %s", p);
17819304Speter		break;
17919304Speter	}
18019304Speter}
181