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