Changeset View
Changeset View
Standalone View
Standalone View
contrib/mg/modes.c
- This file was added.
/* $OpenBSD: modes.c,v 1.21 2017/05/30 07:05:22 florian 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 <sys/queue.h> | |||||
#include <signal.h> | |||||
#include <stdio.h> | |||||
#include <string.h> | |||||
#include "def.h" | |||||
#include "kbd.h" | |||||
int changemode(int, int, char *); | |||||
int defb_nmodes = 0; | |||||
struct maps_s *defb_modes[PBMODES] = { &fundamental_mode }; | |||||
int defb_flag = 0; | |||||
int | |||||
changemode(int f, int n, char *newmode) | |||||
{ | |||||
int i; | |||||
struct maps_s *m; | |||||
if ((m = name_mode(newmode)) == NULL) { | |||||
dobeep(); | |||||
ewprintf("Can't find mode %s", newmode); | |||||
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) { | |||||
dobeep(); | |||||
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")); | |||||
} | |||||
#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_mode(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; | |||||
struct maps_s *m; | |||||
char modebuf[32], *bufp; | |||||
if ((bufp = eread("Set Default Mode: ", modebuf, sizeof(modebuf), | |||||
EFNEW)) == NULL) | |||||
return (ABORT); | |||||
else if (bufp[0] == '\0') | |||||
return (FALSE); | |||||
if ((m = name_mode(modebuf)) == NULL) { | |||||
dobeep(); | |||||
ewprintf("can't find mode %s", modebuf); | |||||
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) { | |||||
dobeep(); | |||||
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(modebuf, "overwrite") == 0) { | |||||
if (n <= 0) | |||||
defb_flag &= ~BFOVERWRITE; | |||||
else | |||||
defb_flag |= BFOVERWRITE; | |||||
} | |||||
#ifdef NOTAB | |||||
if (strcmp(modebuf, "notab") == 0) { | |||||
if (n <= 0) | |||||
defb_flag &= ~BFNOTAB; | |||||
else | |||||
defb_flag |= BFNOTAB; | |||||
} | |||||
#endif /* NOTAB */ | |||||
return (TRUE); | |||||
} |