]> pd.if.org Git - pd_readline/blob - mg/modes.c
Added mg from an OpenBSD mirror site. Many thanks to the OpenBSD team and the mg...
[pd_readline] / mg / modes.c
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 }