xref: /openbsd-src/usr.bin/mg/modes.c (revision b2ea75c1b17e1a9a339660e7ed45cd24946b230e)
1 /*	$OpenBSD: modes.c,v 1.6 2001/05/24 10:43:21 art 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	__P((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(f, n, mode)
20 	int   f, n;
21 	char *mode;
22 {
23 	int	 i;
24 	MAPS	*m;
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) {
33 				/* mode already set */
34 				n = 0;
35 				break;
36 			}
37 	}
38 	if (n > 0) {
39 		for (i = 0; i <= curbp->b_nmodes; i++)
40 			if (curbp->b_modes[i] == m)
41 				/* mode already set */
42 				return TRUE;
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 */
50 		for (i = 1; i <= curbp->b_nmodes && m != curbp->b_modes[i];
51 		    i++);
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;
60 }
61 
62 int
63 indentmode(f, n)
64 	int f, n;
65 {
66 	return changemode(f, n, "indent");
67 }
68 
69 int
70 fillmode(f, n)
71 	int f, n;
72 {
73 	return changemode(f, n, "fill");
74 }
75 
76 /*
77  * Fake the GNU "blink-matching-paren" variable.
78  */
79 int
80 blinkparen(f, n)
81 	int f, n;
82 {
83 	return changemode(f, n, "blink");
84 }
85 
86 #ifdef NOTAB
87 int
88 notabmode(f, n)
89 	int f, n;
90 {
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;
101 }
102 #endif	/* NOTAB */
103 
104 int
105 overwrite(f, n)
106 	int f, n;
107 {
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;
118 }
119 
120 int
121 set_default_mode(f, n)
122 	int f, n;
123 {
124 	int	 i;
125 	MAPS	*m;
126 	char	 mode[32];
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) {
137 				/* mode already set */
138 				n = 0;
139 				break;
140 			}
141 	}
142 	if (n > 0) {
143 		for (i = 0; i <= defb_nmodes; i++)
144 			if (defb_modes[i] == m)
145 				/* mode already set */
146 				return TRUE;
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 */
154 		for (i = 1; i <= defb_nmodes && m != defb_modes[i]; i++);
155 		if (i > defb_nmodes)
156 			/* mode was not set */
157 			return TRUE;
158 		for (; i < defb_nmodes; i++)
159 			defb_modes[i] = defb_modes[i + 1];
160 		defb_nmodes--;
161 	}
162 	if (strcmp(mode, "overwrite") == 0) {
163 		if (n <= 0)
164 			defb_flag &= ~BFOVERWRITE;
165 		else
166 			defb_flag |= BFOVERWRITE;
167 	}
168 #ifdef NOTAB
169 	if (strcmp(mode, "notab") == 0)
170 		if (n <= 0)
171 			defb_flag &= ~BFNOTAB;
172 		else
173 			defb_flag |= BFNOTAB;
174 #endif	/* NOTAB */
175 	return TRUE;
176 }
177