Annotation of src/usr.bin/mg/modes.c, Revision 1.14
1.14 ! kjell 1: /* $OpenBSD: modes.c,v 1.13 2005/11/18 20:56:53 deraadt Exp $ */
1.11 kjell 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.13 deraadt 17: struct maps_s *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;
1.13 deraadt 24: struct maps_s *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;
1.13 deraadt 119: struct maps_s *m;
1.9 vincent 120: char mode[32], *bufp;
1.2 millert 121:
1.12 kjell 122: if ((bufp = eread("Set Default Mode: ", mode, sizeof(mode),
123: EFNEW)) == NULL)
1.10 db 124: return (ABORT);
1.9 vincent 125: else if (bufp[0] == '\0')
1.10 db 126: return (FALSE);
1.2 millert 127: if ((m = name_mode(mode)) == NULL) {
128: ewprintf("can't find mode %s", mode);
1.10 db 129: return (FALSE);
1.2 millert 130: }
131: if (!(f & FFARG)) {
132: for (i = 0; i <= defb_nmodes; i++)
133: if (defb_modes[i] == m) {
1.3 millert 134: /* mode already set */
135: n = 0;
1.2 millert 136: break;
137: }
138: }
139: if (n > 0) {
140: for (i = 0; i <= defb_nmodes; i++)
141: if (defb_modes[i] == m)
1.3 millert 142: /* mode already set */
1.10 db 143: return (TRUE);
1.2 millert 144: if (defb_nmodes >= PBMODES - 1) {
145: ewprintf("Too many modes");
1.10 db 146: return (FALSE);
1.2 millert 147: }
148: defb_modes[++defb_nmodes] = m;
149: } else {
150: /* fundamental is defb_modes[0] and can't be unset */
1.3 millert 151: for (i = 1; i <= defb_nmodes && m != defb_modes[i]; i++);
1.2 millert 152: if (i > defb_nmodes)
1.3 millert 153: /* mode was not set */
1.10 db 154: return (TRUE);
1.2 millert 155: for (; i < defb_nmodes; i++)
156: defb_modes[i] = defb_modes[i + 1];
157: defb_nmodes--;
158: }
1.3 millert 159: if (strcmp(mode, "overwrite") == 0) {
1.5 mickey 160: if (n <= 0)
1.2 millert 161: defb_flag &= ~BFOVERWRITE;
1.5 mickey 162: else
1.2 millert 163: defb_flag |= BFOVERWRITE;
1.3 millert 164: }
1.1 deraadt 165: #ifdef NOTAB
1.14 ! kjell 166: if (strcmp(mode, "notab") == 0) {
1.2 millert 167: if (n <= 0)
168: defb_flag &= ~BFNOTAB;
169: else
170: defb_flag |= BFNOTAB;
1.14 ! kjell 171: }
1.3 millert 172: #endif /* NOTAB */
1.10 db 173: return (TRUE);
1.1 deraadt 174: }