xref: /openbsd-src/usr.bin/mg/modes.c (revision db3296cf5c1dd9058ceecc3a29fe4aaa0bd26000)
1 /*	$OpenBSD: modes.c,v 1.8 2002/07/01 14:33:44 vincent Exp $	*/
2 
3 /*
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
6  * off.  A positive argument will turn the mode on.
7  */
8 
9 #include "def.h"
10 #include "kbd.h"
11 
12 static int	changemode(int, int, char *);
13 
14 int	 defb_nmodes = 0;
15 MAPS	*defb_modes[PBMODES] = { &fundamental_mode };
16 int	 defb_flag = 0;
17 
18 static int
19 changemode(int f, int n, char *mode)
20 {
21 	int	 i;
22 	MAPS	*m;
23 
24 	if ((m = name_mode(mode)) == NULL) {
25 		ewprintf("Can't find mode %s", mode);
26 		return FALSE;
27 	}
28 	if (!(f & FFARG)) {
29 		for (i = 0; i <= curbp->b_nmodes; i++)
30 			if (curbp->b_modes[i] == m) {
31 				/* mode already set */
32 				n = 0;
33 				break;
34 			}
35 	}
36 	if (n > 0) {
37 		for (i = 0; i <= curbp->b_nmodes; i++)
38 			if (curbp->b_modes[i] == m)
39 				/* mode already set */
40 				return TRUE;
41 		if (curbp->b_nmodes >= PBMODES - 1) {
42 			ewprintf("Too many modes");
43 			return FALSE;
44 		}
45 		curbp->b_modes[++(curbp->b_nmodes)] = m;
46 	} else {
47 		/* fundamental is b_modes[0] and can't be unset */
48 		for (i = 1; i <= curbp->b_nmodes && m != curbp->b_modes[i];
49 		    i++);
50 		if (i > curbp->b_nmodes)
51 			return TRUE;	/* mode wasn't set */
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);
57 	return TRUE;
58 }
59 
60 int
61 indentmode(int f, int n)
62 {
63 	return changemode(f, n, "indent");
64 }
65 
66 int
67 fillmode(int f, int n)
68 {
69 	return changemode(f, n, "fill");
70 }
71 
72 /*
73  * Fake the GNU "blink-matching-paren" variable.
74  */
75 int
76 blinkparen(int f, int n)
77 {
78 	return changemode(f, n, "blink");
79 }
80 
81 #ifdef NOTAB
82 int
83 notabmode(int f, int n)
84 {
85 	if (changemode(f, n, "notab") == FALSE)
86 		return FALSE;
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;
94 	return TRUE;
95 }
96 #endif	/* NOTAB */
97 
98 int
99 overwrite(int f, int n)
100 {
101 	if (changemode(f, n, "overwrite") == FALSE)
102 		return FALSE;
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;
110 	return TRUE;
111 }
112 
113 int
114 set_default_mode(int f, int n)
115 {
116 	int	 i;
117 	MAPS	*m;
118 	char	 mode[32];
119 
120 	if (eread("Set Default Mode: ", mode, 32, EFNEW) != TRUE)
121 		return ABORT;
122 	if ((m = name_mode(mode)) == NULL) {
123 		ewprintf("can't find mode %s", mode);
124 		return FALSE;
125 	}
126 	if (!(f & FFARG)) {
127 		for (i = 0; i <= defb_nmodes; i++)
128 			if (defb_modes[i] == m) {
129 				/* mode already set */
130 				n = 0;
131 				break;
132 			}
133 	}
134 	if (n > 0) {
135 		for (i = 0; i <= defb_nmodes; i++)
136 			if (defb_modes[i] == m)
137 				/* mode already set */
138 				return TRUE;
139 		if (defb_nmodes >= PBMODES - 1) {
140 			ewprintf("Too many modes");
141 			return FALSE;
142 		}
143 		defb_modes[++defb_nmodes] = m;
144 	} else {
145 		/* fundamental is defb_modes[0] and can't be unset */
146 		for (i = 1; i <= defb_nmodes && m != defb_modes[i]; i++);
147 		if (i > defb_nmodes)
148 			/* mode was not set */
149 			return TRUE;
150 		for (; i < defb_nmodes; i++)
151 			defb_modes[i] = defb_modes[i + 1];
152 		defb_nmodes--;
153 	}
154 	if (strcmp(mode, "overwrite") == 0) {
155 		if (n <= 0)
156 			defb_flag &= ~BFOVERWRITE;
157 		else
158 			defb_flag |= BFOVERWRITE;
159 	}
160 #ifdef NOTAB
161 	if (strcmp(mode, "notab") == 0)
162 		if (n <= 0)
163 			defb_flag &= ~BFNOTAB;
164 		else
165 			defb_flag |= BFNOTAB;
166 #endif	/* NOTAB */
167 	return TRUE;
168 }
169