1 /* $OpenBSD: modes.c,v 1.18 2008/06/14 08:46:30 kjell Exp $ */
3 /* This file is in the public domain. */
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.
14 int changemode(int, int, char *);
17 struct maps_s *defb_modes[PBMODES] = { &fundamental_mode };
21 changemode(int f, int n, char *mode)
26 if ((m = name_mode(mode)) == NULL) {
27 ewprintf("Can't find mode %s", mode);
31 for (i = 0; i <= curbp->b_nmodes; i++)
32 if (curbp->b_modes[i] == m) {
33 /* mode already set */
39 for (i = 0; i <= curbp->b_nmodes; i++)
40 if (curbp->b_modes[i] == m)
41 /* mode already set */
43 if (curbp->b_nmodes >= PBMODES - 1) {
44 ewprintf("Too many modes");
47 curbp->b_modes[++(curbp->b_nmodes)] = m;
49 /* fundamental is b_modes[0] and can't be unset */
50 for (i = 1; i <= curbp->b_nmodes && m != curbp->b_modes[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];
63 indentmode(int f, int n)
65 return (changemode(f, n, "indent"));
69 fillmode(int f, int n)
71 return (changemode(f, n, "fill"));
76 notabmode(int f, int n)
78 if (changemode(f, n, "notab") == FALSE)
82 curbp->b_flag &= ~BFNOTAB;
84 curbp->b_flag |= BFNOTAB;
86 curbp->b_flag ^= BFNOTAB;
92 overwrite_mode(int f, int n)
94 if (changemode(f, n, "overwrite") == FALSE)
98 curbp->b_flag &= ~BFOVERWRITE;
100 curbp->b_flag |= BFOVERWRITE;
102 curbp->b_flag ^= BFOVERWRITE;
107 set_default_mode(int f, int n)
111 char modebuf[32], *bufp;
113 if ((bufp = eread("Set Default Mode: ", modebuf, sizeof(modebuf),
116 else if (bufp[0] == '\0')
118 if ((m = name_mode(modebuf)) == NULL) {
119 ewprintf("can't find mode %s", modebuf);
123 for (i = 0; i <= defb_nmodes; i++)
124 if (defb_modes[i] == m) {
125 /* mode already set */
131 for (i = 0; i <= defb_nmodes; i++)
132 if (defb_modes[i] == m)
133 /* mode already set */
135 if (defb_nmodes >= PBMODES - 1) {
136 ewprintf("Too many modes");
139 defb_modes[++defb_nmodes] = m;
141 /* fundamental is defb_modes[0] and can't be unset */
142 for (i = 1; i <= defb_nmodes && m != defb_modes[i]; i++);
144 /* mode was not set */
146 for (; i < defb_nmodes; i++)
147 defb_modes[i] = defb_modes[i + 1];
150 if (strcmp(modebuf, "overwrite") == 0) {
152 defb_flag &= ~BFOVERWRITE;
154 defb_flag |= BFOVERWRITE;
157 if (strcmp(modebuf, "notab") == 0) {
159 defb_flag &= ~BFNOTAB;
161 defb_flag |= BFNOTAB;