1/*- 2 * Copyright (c) 1992, 1993, 1994 3 * The Regents of the University of California. All rights reserved. 4 * Copyright (c) 1992, 1993, 1994, 1995, 1996 5 * Keith Bostic. All rights reserved. 6 * 7 * See the LICENSE file for redistribution information. 8 */ 9 10#include "config.h" 11 12#ifndef lint 13static const char sccsid[] = "$Id: v_util.c,v 10.14 2001/06/25 15:19:36 skimo Exp $"; 14#endif /* not lint */ 15 16#include <sys/types.h> 17#include <sys/queue.h> 18#include <sys/time.h> 19 20#include <bitstring.h> 21#include <ctype.h> 22#include <limits.h> 23#include <stdio.h> 24#include <stdlib.h> 25#include <string.h> 26#include <unistd.h> 27 28#include "../common/common.h" 29#include "vi.h" 30 31/* 32 * v_eof -- 33 * Vi end-of-file error. 34 * 35 * PUBLIC: void v_eof(SCR *, MARK *); 36 */ 37void 38v_eof(SCR *sp, MARK *mp) 39{ 40 recno_t lno; 41 42 if (mp == NULL) 43 v_emsg(sp, NULL, VIM_EOF); 44 else { 45 if (db_last(sp, &lno)) 46 return; 47 if (mp->lno >= lno) 48 v_emsg(sp, NULL, VIM_EOF); 49 else 50 msgq(sp, M_BERR, "195|Movement past the end-of-file"); 51 } 52} 53 54/* 55 * v_eol -- 56 * Vi end-of-line error. 57 * 58 * PUBLIC: void v_eol(SCR *, MARK *); 59 */ 60void 61v_eol(SCR *sp, MARK *mp) 62{ 63 size_t len; 64 65 if (mp == NULL) 66 v_emsg(sp, NULL, VIM_EOL); 67 else { 68 if (db_get(sp, mp->lno, DBG_FATAL, NULL, &len)) 69 return; 70 if (mp->cno == len - 1) 71 v_emsg(sp, NULL, VIM_EOL); 72 else 73 msgq(sp, M_BERR, "196|Movement past the end-of-line"); 74 } 75} 76 77/* 78 * v_nomove -- 79 * Vi no cursor movement error. 80 * 81 * PUBLIC: void v_nomove(SCR *); 82 */ 83void 84v_nomove(SCR *sp) 85{ 86 msgq(sp, M_BERR, "197|No cursor movement made"); 87} 88 89/* 90 * v_sof -- 91 * Vi start-of-file error. 92 * 93 * PUBLIC: void v_sof(SCR *, MARK *); 94 */ 95void 96v_sof(SCR *sp, MARK *mp) 97{ 98 if (mp == NULL || mp->lno == 1) 99 msgq(sp, M_BERR, "198|Already at the beginning of the file"); 100 else 101 msgq(sp, M_BERR, "199|Movement past the beginning of the file"); 102} 103 104/* 105 * v_sol -- 106 * Vi start-of-line error. 107 * 108 * PUBLIC: void v_sol(SCR *); 109 */ 110void 111v_sol(SCR *sp) 112{ 113 msgq(sp, M_BERR, "200|Already in the first column"); 114} 115 116/* 117 * v_isempty -- 118 * Return if the line contains nothing but white-space characters. 119 * 120 * PUBLIC: int v_isempty(CHAR_T *, size_t); 121 */ 122int 123v_isempty(CHAR_T *p, size_t len) 124{ 125 for (; len--; ++p) 126 if (!isblank(*p)) 127 return (0); 128 return (1); 129} 130 131/* 132 * v_emsg -- 133 * Display a few common vi messages. 134 * 135 * PUBLIC: void v_emsg(SCR *, char *, vim_t); 136 */ 137void 138v_emsg(SCR *sp, char *p, vim_t which) 139{ 140 switch (which) { 141 case VIM_COMBUF: 142 msgq(sp, M_ERR, 143 "201|Buffers should be specified before the command"); 144 break; 145 case VIM_EMPTY: 146 msgq(sp, M_BERR, "209|The file is empty"); 147 break; 148 case VIM_EOF: 149 msgq(sp, M_BERR, "202|Already at end-of-file"); 150 break; 151 case VIM_EOL: 152 msgq(sp, M_BERR, "203|Already at end-of-line"); 153 break; 154 case VIM_NOCOM: 155 case VIM_NOCOM_B: 156 msgq(sp, 157 which == VIM_NOCOM_B ? M_BERR : M_ERR, 158 "204|%s isn't a vi command", p); 159 break; 160 case VIM_WRESIZE: 161 msgq(sp, M_ERR, "Window resize interrupted text input mode"); 162 break; 163 case VIM_USAGE: 164 msgq(sp, M_ERR, "205|Usage: %s", p); 165 break; 166 } 167} 168