119304Speter/*- 219304Speter * Copyright (c) 1993, 1994 319304Speter * The Regents of the University of California. All rights reserved. 419304Speter * Copyright (c) 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 13254225Speterstatic const char sccsid[] = "$Id: ex_util.c,v 10.32 2001/06/25 15:19:21 skimo Exp $"; 1419304Speter#endif /* not lint */ 1519304Speter 1619304Speter#include <sys/types.h> 1719304Speter#include <sys/queue.h> 1819304Speter#include <sys/stat.h> 1919304Speter 2019304Speter#include <bitstring.h> 2119304Speter#include <errno.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 3019304Speter/* 3119304Speter * ex_cinit -- 3219304Speter * Create an EX command structure. 3319304Speter * 34254225Speter * PUBLIC: void ex_cinit __P((SCR *, EXCMD *, int, int, recno_t, recno_t, int)); 3519304Speter */ 3619304Spetervoid 37254225Speterex_cinit(SCR *sp, EXCMD *cmdp, int cmd_id, int naddr, recno_t lno1, recno_t lno2, int force) 3819304Speter{ 3919304Speter memset(cmdp, 0, sizeof(EXCMD)); 4019304Speter cmdp->cmd = &cmds[cmd_id]; 4119304Speter cmdp->addrcnt = naddr; 4219304Speter cmdp->addr1.lno = lno1; 4319304Speter cmdp->addr2.lno = lno2; 4419304Speter cmdp->addr1.cno = cmdp->addr2.cno = 1; 4519304Speter if (force) 4619304Speter cmdp->iflags |= E_C_FORCE; 47254225Speter (void)argv_init(sp, cmdp); 4819304Speter} 4919304Speter 5019304Speter/* 5119304Speter * ex_getline -- 5219304Speter * Return a line from the file. 5319304Speter * 5419304Speter * PUBLIC: int ex_getline __P((SCR *, FILE *, size_t *)); 5519304Speter */ 5619304Speterint 57254225Speterex_getline(SCR *sp, FILE *fp, size_t *lenp) 5819304Speter{ 5919304Speter EX_PRIVATE *exp; 6019304Speter size_t off; 6119304Speter int ch; 6219304Speter char *p; 6319304Speter 6419304Speter exp = EXP(sp); 6519304Speter for (errno = 0, off = 0, p = exp->ibp;;) { 6619304Speter if (off >= exp->ibp_len) { 67254225Speter BINC_RETC(sp, exp->ibp, exp->ibp_len, off + 1); 6819304Speter p = exp->ibp + off; 6919304Speter } 7019304Speter if ((ch = getc(fp)) == EOF && !feof(fp)) { 7119304Speter if (errno == EINTR) { 7219304Speter errno = 0; 7319304Speter clearerr(fp); 7419304Speter continue; 7519304Speter } 7619304Speter return (1); 7719304Speter } 7819304Speter if (ch == EOF || ch == '\n') { 7919304Speter if (ch == EOF && !off) 8019304Speter return (1); 8119304Speter *lenp = off; 8219304Speter return (0); 8319304Speter } 8419304Speter *p++ = ch; 8519304Speter ++off; 8619304Speter } 8719304Speter /* NOTREACHED */ 8819304Speter} 8919304Speter 9019304Speter/* 9119304Speter * ex_ncheck -- 9219304Speter * Check for more files to edit. 9319304Speter * 9419304Speter * PUBLIC: int ex_ncheck __P((SCR *, int)); 9519304Speter */ 9619304Speterint 97254225Speterex_ncheck(SCR *sp, int force) 9819304Speter{ 9919304Speter char **ap; 10019304Speter 10119304Speter /* 10219304Speter * !!! 10319304Speter * Historic practice: quit! or two quit's done in succession 10419304Speter * (where ZZ counts as a quit) didn't check for other files. 10519304Speter */ 10619304Speter if (!force && sp->ccnt != sp->q_ccnt + 1 && 10719304Speter sp->cargv != NULL && sp->cargv[1] != NULL) { 10819304Speter sp->q_ccnt = sp->ccnt; 10919304Speter 11019304Speter for (ap = sp->cargv + 1; *ap != NULL; ++ap); 11119304Speter msgq(sp, M_ERR, 112254225Speter "167|%d more files to edit", (int)(ap - sp->cargv) - 1); 11319304Speter 11419304Speter return (1); 11519304Speter } 11619304Speter return (0); 11719304Speter} 11819304Speter 11919304Speter/* 12019304Speter * ex_init -- 12119304Speter * Init the screen for ex. 12219304Speter * 12319304Speter * PUBLIC: int ex_init __P((SCR *)); 12419304Speter */ 12519304Speterint 126254225Speterex_init(SCR *sp) 12719304Speter{ 12819304Speter GS *gp; 12919304Speter 13019304Speter gp = sp->gp; 13119304Speter 13219304Speter if (gp->scr_screen(sp, SC_EX)) 13319304Speter return (1); 13419304Speter (void)gp->scr_attr(sp, SA_ALTERNATE, 0); 13519304Speter 13619304Speter sp->rows = O_VAL(sp, O_LINES); 13719304Speter sp->cols = O_VAL(sp, O_COLUMNS); 13819304Speter 13919304Speter F_CLR(sp, SC_VI); 14019304Speter F_SET(sp, SC_EX | SC_SCR_EX); 14119304Speter return (0); 14219304Speter} 14319304Speter 14419304Speter/* 14519304Speter * ex_emsg -- 14619304Speter * Display a few common ex and vi error messages. 14719304Speter * 148254225Speter * PUBLIC: void ex_wemsg __P((SCR *, CHAR_T *, exm_t)); 149254225Speter */ 150254225Spetervoid 151254225Speterex_wemsg(SCR* sp, CHAR_T *p, exm_t which) 152254225Speter{ 153254225Speter char *np; 154254225Speter size_t nlen; 155254225Speter 156254225Speter if (p) INT2CHAR(sp, p, STRLEN(p), np, nlen); 157254225Speter else np = NULL; 158254225Speter ex_emsg(sp, np, which); 159254225Speter} 160254225Speter 161254225Speter/* 162254225Speter * ex_emsg -- 163254225Speter * Display a few common ex and vi error messages. 164254225Speter * 16519304Speter * PUBLIC: void ex_emsg __P((SCR *, char *, exm_t)); 16619304Speter */ 16719304Spetervoid 168254225Speterex_emsg(SCR *sp, char *p, exm_t which) 16919304Speter{ 17019304Speter switch (which) { 17119304Speter case EXM_EMPTYBUF: 17219304Speter msgq(sp, M_ERR, "168|Buffer %s is empty", p); 17319304Speter break; 17419304Speter case EXM_FILECOUNT: 17519304Speter msgq_str(sp, M_ERR, p, 17619304Speter "144|%s: expanded into too many file names"); 17719304Speter break; 17819304Speter case EXM_NOCANON: 17919304Speter msgq(sp, M_ERR, 18019304Speter "283|The %s command requires the ex terminal interface", p); 18119304Speter break; 18219304Speter case EXM_NOCANON_F: 18319304Speter msgq(sp, M_ERR, 18419304Speter "272|That form of %s requires the ex terminal interface", 18519304Speter p); 18619304Speter break; 18719304Speter case EXM_NOFILEYET: 18819304Speter if (p == NULL) 18919304Speter msgq(sp, M_ERR, 19019304Speter "274|Command failed, no file read in yet."); 19119304Speter else 19219304Speter msgq(sp, M_ERR, 19319304Speter "173|The %s command requires that a file have already been read in", p); 19419304Speter break; 19519304Speter case EXM_NOPREVBUF: 19619304Speter msgq(sp, M_ERR, "171|No previous buffer to execute"); 19719304Speter break; 19819304Speter case EXM_NOPREVRE: 19919304Speter msgq(sp, M_ERR, "172|No previous regular expression"); 20019304Speter break; 20119304Speter case EXM_NOSUSPEND: 20219304Speter msgq(sp, M_ERR, "230|This screen may not be suspended"); 20319304Speter break; 20419304Speter case EXM_SECURE: 20519304Speter msgq(sp, M_ERR, 20619304Speter"290|The %s command is not supported when the secure edit option is set", p); 20719304Speter break; 20819304Speter case EXM_SECURE_F: 20919304Speter msgq(sp, M_ERR, 21019304Speter"284|That form of %s is not supported when the secure edit option is set", p); 21119304Speter break; 21219304Speter case EXM_USAGE: 21319304Speter msgq(sp, M_ERR, "174|Usage: %s", p); 21419304Speter break; 21519304Speter } 21619304Speter} 217