Annotation of src/usr.bin/mg/modes.c, Revision 1.11
1.11 ! kjell 1: /* $OpenBSD: modes.c,v 1.10 2005/04/03 02:09:28 db Exp $ */
! 2:
! 3: /* This file is in the public domain. */
1.4 niklas 4:
1.1 deraadt 5: /*
1.5 mickey 6: * Commands to toggle modes. Without an argument, these functions will
7: * toggle the given mode. A negative or zero argument will turn the mode
1.3 millert 8: * off. A positive argument will turn the mode on.
1.1 deraadt 9: */
10:
11: #include "def.h"
12: #include "kbd.h"
13:
1.7 millert 14: static int changemode(int, int, char *);
1.3 millert 15:
16: int defb_nmodes = 0;
1.6 art 17: MAPS *defb_modes[PBMODES] = { &fundamental_mode };
1.3 millert 18: int defb_flag = 0;
1.2 millert 19:
20: static int
1.8 vincent 21: changemode(int f, int n, char *mode)
1.2 millert 22: {
1.3 millert 23: int i;
24: MAPS *m;
1.2 millert 25:
26: if ((m = name_mode(mode)) == NULL) {
27: ewprintf("Can't find mode %s", mode);
1.10 db 28: return (FALSE);
1.2 millert 29: }
30: if (!(f & FFARG)) {
31: for (i = 0; i <= curbp->b_nmodes; i++)
32: if (curbp->b_modes[i] == m) {
1.3 millert 33: /* mode already set */
34: n = 0;
1.2 millert 35: break;
36: }
37: }
38: if (n > 0) {
39: for (i = 0; i <= curbp->b_nmodes; i++)
40: if (curbp->b_modes[i] == m)
1.3 millert 41: /* mode already set */
1.10 db 42: return (TRUE);
1.2 millert 43: if (curbp->b_nmodes >= PBMODES - 1) {
44: ewprintf("Too many modes");
1.10 db 45: return (FALSE);
1.2 millert 46: }
47: curbp->b_modes[++(curbp->b_nmodes)] = m;
48: } else {
49: /* fundamental is b_modes[0] and can't be unset */
1.5 mickey 50: for (i = 1; i <= curbp->b_nmodes && m != curbp->b_modes[i];
1.3 millert 51: i++);
1.2 millert 52: if (i > curbp->b_nmodes)
1.10 db 53: return (TRUE); /* mode wasn't set */
1.2 millert 54: for (; i < curbp->b_nmodes; i++)
55: curbp->b_modes[i] = curbp->b_modes[i + 1];
56: curbp->b_nmodes--;
57: }
58: upmodes(curbp);
1.10 db 59: return (TRUE);
1.1 deraadt 60: }
61:
1.3 millert 62: int
1.8 vincent 63: indentmode(int f, int n)
1.1 deraadt 64: {
1.10 db 65: return (changemode(f, n, "indent"));
1.1 deraadt 66: }
67:
1.3 millert 68: int
1.8 vincent 69: fillmode(int f, int n)
1.1 deraadt 70: {
1.10 db 71: return (changemode(f, n, "fill"));
1.1 deraadt 72: }
73:
74: /*
75: * Fake the GNU "blink-matching-paren" variable.
76: */
1.3 millert 77: int
1.8 vincent 78: blinkparen(int f, int n)
1.1 deraadt 79: {
1.10 db 80: return (changemode(f, n, "blink"));
1.1 deraadt 81: }
82:
1.3 millert 83: #ifdef NOTAB
84: int
1.8 vincent 85: notabmode(int f, int n)
1.1 deraadt 86: {
1.2 millert 87: if (changemode(f, n, "notab") == FALSE)
1.10 db 88: return (FALSE);
1.2 millert 89: if (f & FFARG) {
90: if (n <= 0)
91: curbp->b_flag &= ~BFNOTAB;
92: else
93: curbp->b_flag |= BFNOTAB;
94: } else
95: curbp->b_flag ^= BFNOTAB;
1.10 db 96: return (TRUE);
1.1 deraadt 97: }
1.3 millert 98: #endif /* NOTAB */
1.1 deraadt 99:
1.3 millert 100: int
1.8 vincent 101: overwrite(int f, int n)
1.1 deraadt 102: {
1.2 millert 103: if (changemode(f, n, "overwrite") == FALSE)
1.10 db 104: return (FALSE);
1.2 millert 105: if (f & FFARG) {
106: if (n <= 0)
107: curbp->b_flag &= ~BFOVERWRITE;
108: else
109: curbp->b_flag |= BFOVERWRITE;
110: } else
111: curbp->b_flag ^= BFOVERWRITE;
1.10 db 112: return (TRUE);
1.1 deraadt 113: }
114:
1.3 millert 115: int
1.8 vincent 116: set_default_mode(int f, int n)
1.1 deraadt 117: {
1.3 millert 118: int i;
119: MAPS *m;
1.9 vincent 120: char mode[32], *bufp;
1.2 millert 121:
1.9 vincent 122: if ((bufp = eread("Set Default Mode: ", mode, 32, EFNEW)) == NULL)
1.10 db 123: return (ABORT);
1.9 vincent 124: else if (bufp[0] == '\0')
1.10 db 125: return (FALSE);
1.2 millert 126: if ((m = name_mode(mode)) == NULL) {
127: ewprintf("can't find mode %s", mode);
1.10 db 128: return (FALSE);
1.2 millert 129: }
130: if (!(f & FFARG)) {
131: for (i = 0; i <= defb_nmodes; i++)
132: if (defb_modes[i] == m) {
1.3 millert 133: /* mode already set */
134: n = 0;
1.2 millert 135: break;
136: }
137: }
138: if (n > 0) {
139: for (i = 0; i <= defb_nmodes; i++)
140: if (defb_modes[i] == m)
1.3 millert 141: /* mode already set */
1.10 db 142: return (TRUE);
1.2 millert 143: if (defb_nmodes >= PBMODES - 1) {
144: ewprintf("Too many modes");
1.10 db 145: return (FALSE);
1.2 millert 146: }
147: defb_modes[++defb_nmodes] = m;
148: } else {
149: /* fundamental is defb_modes[0] and can't be unset */
1.3 millert 150: for (i = 1; i <= defb_nmodes && m != defb_modes[i]; i++);
1.2 millert 151: if (i > defb_nmodes)
1.3 millert 152: /* mode was not set */
1.10 db 153: return (TRUE);
1.2 millert 154: for (; i < defb_nmodes; i++)
155: defb_modes[i] = defb_modes[i + 1];
156: defb_nmodes--;
157: }
1.3 millert 158: if (strcmp(mode, "overwrite") == 0) {
1.5 mickey 159: if (n <= 0)
1.2 millert 160: defb_flag &= ~BFOVERWRITE;
1.5 mickey 161: else
1.2 millert 162: defb_flag |= BFOVERWRITE;
1.3 millert 163: }
1.1 deraadt 164: #ifdef NOTAB
1.2 millert 165: if (strcmp(mode, "notab") == 0)
166: if (n <= 0)
167: defb_flag &= ~BFNOTAB;
168: else
169: defb_flag |= BFNOTAB;
1.3 millert 170: #endif /* NOTAB */
1.10 db 171: return (TRUE);
1.1 deraadt 172: }