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