File: [local] / src / usr.bin / mg / modes.c (download)
Revision 1.12, Tue Aug 9 00:53:48 2005 UTC (18 years, 10 months ago) by kjell
Branch: MAIN
CVS Tags: OPENBSD_3_8_BASE, OPENBSD_3_8 Changes since 1.11: +3 -2 lines
Clean up eread handling in mg. (basically, fallout from the 'enter often
means abort' behaviour added during the hackathon). Eliminates
redundant ereply function, fixes miscellaneous cores when aborting,
and move a number of assumed pathnames into the prompt text, since
they are used there anyway. All changes consistent with emacs behavior
ok beck@ many, many moons ago.
|
/* $OpenBSD: modes.c,v 1.12 2005/08/09 00:53:48 kjell Exp $ */
/* This file is in the public domain. */
/*
* Commands to toggle modes. Without an argument, these functions will
* toggle the given mode. A negative or zero argument will turn the mode
* off. A positive argument will turn the mode on.
*/
#include "def.h"
#include "kbd.h"
static int changemode(int, int, char *);
int defb_nmodes = 0;
MAPS *defb_modes[PBMODES] = { &fundamental_mode };
int defb_flag = 0;
static int
changemode(int f, int n, char *mode)
{
int i;
MAPS *m;
if ((m = name_mode(mode)) == NULL) {
ewprintf("Can't find mode %s", mode);
return (FALSE);
}
if (!(f & FFARG)) {
for (i = 0; i <= curbp->b_nmodes; i++)
if (curbp->b_modes[i] == m) {
/* mode already set */
n = 0;
break;
}
}
if (n > 0) {
for (i = 0; i <= curbp->b_nmodes; i++)
if (curbp->b_modes[i] == m)
/* mode already set */
return (TRUE);
if (curbp->b_nmodes >= PBMODES - 1) {
ewprintf("Too many modes");
return (FALSE);
}
curbp->b_modes[++(curbp->b_nmodes)] = m;
} else {
/* fundamental is b_modes[0] and can't be unset */
for (i = 1; i <= curbp->b_nmodes && m != curbp->b_modes[i];
i++);
if (i > curbp->b_nmodes)
return (TRUE); /* mode wasn't set */
for (; i < curbp->b_nmodes; i++)
curbp->b_modes[i] = curbp->b_modes[i + 1];
curbp->b_nmodes--;
}
upmodes(curbp);
return (TRUE);
}
int
indentmode(int f, int n)
{
return (changemode(f, n, "indent"));
}
int
fillmode(int f, int n)
{
return (changemode(f, n, "fill"));
}
/*
* Fake the GNU "blink-matching-paren" variable.
*/
int
blinkparen(int f, int n)
{
return (changemode(f, n, "blink"));
}
#ifdef NOTAB
int
notabmode(int f, int n)
{
if (changemode(f, n, "notab") == FALSE)
return (FALSE);
if (f & FFARG) {
if (n <= 0)
curbp->b_flag &= ~BFNOTAB;
else
curbp->b_flag |= BFNOTAB;
} else
curbp->b_flag ^= BFNOTAB;
return (TRUE);
}
#endif /* NOTAB */
int
overwrite(int f, int n)
{
if (changemode(f, n, "overwrite") == FALSE)
return (FALSE);
if (f & FFARG) {
if (n <= 0)
curbp->b_flag &= ~BFOVERWRITE;
else
curbp->b_flag |= BFOVERWRITE;
} else
curbp->b_flag ^= BFOVERWRITE;
return (TRUE);
}
int
set_default_mode(int f, int n)
{
int i;
MAPS *m;
char mode[32], *bufp;
if ((bufp = eread("Set Default Mode: ", mode, sizeof(mode),
EFNEW)) == NULL)
return (ABORT);
else if (bufp[0] == '\0')
return (FALSE);
if ((m = name_mode(mode)) == NULL) {
ewprintf("can't find mode %s", mode);
return (FALSE);
}
if (!(f & FFARG)) {
for (i = 0; i <= defb_nmodes; i++)
if (defb_modes[i] == m) {
/* mode already set */
n = 0;
break;
}
}
if (n > 0) {
for (i = 0; i <= defb_nmodes; i++)
if (defb_modes[i] == m)
/* mode already set */
return (TRUE);
if (defb_nmodes >= PBMODES - 1) {
ewprintf("Too many modes");
return (FALSE);
}
defb_modes[++defb_nmodes] = m;
} else {
/* fundamental is defb_modes[0] and can't be unset */
for (i = 1; i <= defb_nmodes && m != defb_modes[i]; i++);
if (i > defb_nmodes)
/* mode was not set */
return (TRUE);
for (; i < defb_nmodes; i++)
defb_modes[i] = defb_modes[i + 1];
defb_nmodes--;
}
if (strcmp(mode, "overwrite") == 0) {
if (n <= 0)
defb_flag &= ~BFOVERWRITE;
else
defb_flag |= BFOVERWRITE;
}
#ifdef NOTAB
if (strcmp(mode, "notab") == 0)
if (n <= 0)
defb_flag &= ~BFNOTAB;
else
defb_flag |= BFNOTAB;
#endif /* NOTAB */
return (TRUE);
}