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