xref: /openbsd-src/usr.bin/mg/modes.c (revision 2b0358df1d88d06ef4139321dd05bd5e05d91eaf)
1 /*	$OpenBSD: modes.c,v 1.18 2008/06/14 08:46:30 kjell 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 		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(int f, int n)
64 {
65 	return (changemode(f, n, "indent"));
66 }
67 
68 int
69 fillmode(int f, int n)
70 {
71 	return (changemode(f, n, "fill"));
72 }
73 
74 #ifdef NOTAB
75 int
76 notabmode(int f, int n)
77 {
78 	if (changemode(f, n, "notab") == FALSE)
79 		return (FALSE);
80 	if (f & FFARG) {
81 		if (n <= 0)
82 			curbp->b_flag &= ~BFNOTAB;
83 		else
84 			curbp->b_flag |= BFNOTAB;
85 	} else
86 		curbp->b_flag ^= BFNOTAB;
87 	return (TRUE);
88 }
89 #endif	/* NOTAB */
90 
91 int
92 overwrite_mode(int f, int n)
93 {
94 	if (changemode(f, n, "overwrite") == FALSE)
95 		return (FALSE);
96 	if (f & FFARG) {
97 		if (n <= 0)
98 			curbp->b_flag &= ~BFOVERWRITE;
99 		else
100 			curbp->b_flag |= BFOVERWRITE;
101 	} else
102 		curbp->b_flag ^= BFOVERWRITE;
103 	return (TRUE);
104 }
105 
106 int
107 set_default_mode(int f, int n)
108 {
109 	int	 i;
110 	struct maps_s	*m;
111 	char	 modebuf[32], *bufp;
112 
113 	if ((bufp = eread("Set Default Mode: ", modebuf, sizeof(modebuf),
114 	    EFNEW)) == NULL)
115 		return (ABORT);
116 	else if (bufp[0] == '\0')
117 		return (FALSE);
118 	if ((m = name_mode(modebuf)) == NULL) {
119 		ewprintf("can't find mode %s", modebuf);
120 		return (FALSE);
121 	}
122 	if (!(f & FFARG)) {
123 		for (i = 0; i <= defb_nmodes; i++)
124 			if (defb_modes[i] == m) {
125 				/* mode already set */
126 				n = 0;
127 				break;
128 			}
129 	}
130 	if (n > 0) {
131 		for (i = 0; i <= defb_nmodes; i++)
132 			if (defb_modes[i] == m)
133 				/* mode already set */
134 				return (TRUE);
135 		if (defb_nmodes >= PBMODES - 1) {
136 			ewprintf("Too many modes");
137 			return (FALSE);
138 		}
139 		defb_modes[++defb_nmodes] = m;
140 	} else {
141 		/* fundamental is defb_modes[0] and can't be unset */
142 		for (i = 1; i <= defb_nmodes && m != defb_modes[i]; i++);
143 		if (i > defb_nmodes)
144 			/* mode was not set */
145 			return (TRUE);
146 		for (; i < defb_nmodes; i++)
147 			defb_modes[i] = defb_modes[i + 1];
148 		defb_nmodes--;
149 	}
150 	if (strcmp(modebuf, "overwrite") == 0) {
151 		if (n <= 0)
152 			defb_flag &= ~BFOVERWRITE;
153 		else
154 			defb_flag |= BFOVERWRITE;
155 	}
156 #ifdef NOTAB
157 	if (strcmp(modebuf, "notab") == 0) {
158 		if (n <= 0)
159 			defb_flag &= ~BFNOTAB;
160 		else
161 			defb_flag |= BFNOTAB;
162 	}
163 #endif	/* NOTAB */
164 	return (TRUE);
165 }
166