xref: /openbsd-src/usr.bin/mg/modes.c (revision 50b7afb2c2c0993b0894d4e34bf857cb13ed9c80)
1 /*	$OpenBSD: modes.c,v 1.19 2014/03/20 07:47:29 lum Exp $	*/
2 
3 /* This file is in the public domain. */
4 
5 /*
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
8  * off.  A positive argument will turn the mode on.
9  */
10 
11 #include "def.h"
12 #include "kbd.h"
13 
14 int	changemode(int, int, char *);
15 
16 int	 defb_nmodes = 0;
17 struct maps_s	*defb_modes[PBMODES] = { &fundamental_mode };
18 int	 defb_flag = 0;
19 
20 int
21 changemode(int f, int n, char *mode)
22 {
23 	int	 i;
24 	struct maps_s	*m;
25 
26 	if ((m = name_mode(mode)) == NULL) {
27 		dobeep();
28 		ewprintf("Can't find mode %s", mode);
29 		return (FALSE);
30 	}
31 	if (!(f & FFARG)) {
32 		for (i = 0; i <= curbp->b_nmodes; i++)
33 			if (curbp->b_modes[i] == m) {
34 				/* mode already set */
35 				n = 0;
36 				break;
37 			}
38 	}
39 	if (n > 0) {
40 		for (i = 0; i <= curbp->b_nmodes; i++)
41 			if (curbp->b_modes[i] == m)
42 				/* mode already set */
43 				return (TRUE);
44 		if (curbp->b_nmodes >= PBMODES - 1) {
45 			dobeep();
46 			ewprintf("Too many modes");
47 			return (FALSE);
48 		}
49 		curbp->b_modes[++(curbp->b_nmodes)] = m;
50 	} else {
51 		/* fundamental is b_modes[0] and can't be unset */
52 		for (i = 1; i <= curbp->b_nmodes && m != curbp->b_modes[i];
53 		    i++);
54 		if (i > curbp->b_nmodes)
55 			return (TRUE);	/* mode wasn't set */
56 		for (; i < curbp->b_nmodes; i++)
57 			curbp->b_modes[i] = curbp->b_modes[i + 1];
58 		curbp->b_nmodes--;
59 	}
60 	upmodes(curbp);
61 	return (TRUE);
62 }
63 
64 int
65 indentmode(int f, int n)
66 {
67 	return (changemode(f, n, "indent"));
68 }
69 
70 int
71 fillmode(int f, int n)
72 {
73 	return (changemode(f, n, "fill"));
74 }
75 
76 #ifdef NOTAB
77 int
78 notabmode(int f, int n)
79 {
80 	if (changemode(f, n, "notab") == FALSE)
81 		return (FALSE);
82 	if (f & FFARG) {
83 		if (n <= 0)
84 			curbp->b_flag &= ~BFNOTAB;
85 		else
86 			curbp->b_flag |= BFNOTAB;
87 	} else
88 		curbp->b_flag ^= BFNOTAB;
89 	return (TRUE);
90 }
91 #endif	/* NOTAB */
92 
93 int
94 overwrite_mode(int f, int n)
95 {
96 	if (changemode(f, n, "overwrite") == FALSE)
97 		return (FALSE);
98 	if (f & FFARG) {
99 		if (n <= 0)
100 			curbp->b_flag &= ~BFOVERWRITE;
101 		else
102 			curbp->b_flag |= BFOVERWRITE;
103 	} else
104 		curbp->b_flag ^= BFOVERWRITE;
105 	return (TRUE);
106 }
107 
108 int
109 set_default_mode(int f, int n)
110 {
111 	int	 i;
112 	struct maps_s	*m;
113 	char	 modebuf[32], *bufp;
114 
115 	if ((bufp = eread("Set Default Mode: ", modebuf, sizeof(modebuf),
116 	    EFNEW)) == NULL)
117 		return (ABORT);
118 	else if (bufp[0] == '\0')
119 		return (FALSE);
120 	if ((m = name_mode(modebuf)) == NULL) {
121 		dobeep();
122 		ewprintf("can't find mode %s", modebuf);
123 		return (FALSE);
124 	}
125 	if (!(f & FFARG)) {
126 		for (i = 0; i <= defb_nmodes; i++)
127 			if (defb_modes[i] == m) {
128 				/* mode already set */
129 				n = 0;
130 				break;
131 			}
132 	}
133 	if (n > 0) {
134 		for (i = 0; i <= defb_nmodes; i++)
135 			if (defb_modes[i] == m)
136 				/* mode already set */
137 				return (TRUE);
138 		if (defb_nmodes >= PBMODES - 1) {
139 			dobeep();
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(modebuf, "overwrite") == 0) {
155 		if (n <= 0)
156 			defb_flag &= ~BFOVERWRITE;
157 		else
158 			defb_flag |= BFOVERWRITE;
159 	}
160 #ifdef NOTAB
161 	if (strcmp(modebuf, "notab") == 0) {
162 		if (n <= 0)
163 			defb_flag &= ~BFNOTAB;
164 		else
165 			defb_flag |= BFNOTAB;
166 	}
167 #endif	/* NOTAB */
168 	return (TRUE);
169 }
170