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