Annotation of src/usr.bin/mg/modes.c, Revision 1.18
1.18 ! kjell 1: /* $OpenBSD: modes.c,v 1.17 2008/06/11 23:23:55 kjell Exp $ */
1.11 kjell 2:
3: /* This file is in the public domain. */
1.4 niklas 4:
1.1 deraadt 5: /*
1.5 mickey 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
1.3 millert 8: * off. A positive argument will turn the mode on.
1.1 deraadt 9: */
10:
11: #include "def.h"
12: #include "kbd.h"
13:
1.17 kjell 14: int changemode(int, int, char *);
1.3 millert 15:
16: int defb_nmodes = 0;
1.13 deraadt 17: struct maps_s *defb_modes[PBMODES] = { &fundamental_mode };
1.3 millert 18: int defb_flag = 0;
1.2 millert 19:
1.17 kjell 20: int
1.8 vincent 21: changemode(int f, int n, char *mode)
1.2 millert 22: {
1.3 millert 23: int i;
1.13 deraadt 24: struct maps_s *m;
1.2 millert 25:
26: if ((m = name_mode(mode)) == NULL) {
27: ewprintf("Can't find mode %s", mode);
1.10 db 28: return (FALSE);
1.2 millert 29: }
30: if (!(f & FFARG)) {
31: for (i = 0; i <= curbp->b_nmodes; i++)
32: if (curbp->b_modes[i] == m) {
1.3 millert 33: /* mode already set */
34: n = 0;
1.2 millert 35: break;
36: }
37: }
38: if (n > 0) {
39: for (i = 0; i <= curbp->b_nmodes; i++)
40: if (curbp->b_modes[i] == m)
1.3 millert 41: /* mode already set */
1.10 db 42: return (TRUE);
1.2 millert 43: if (curbp->b_nmodes >= PBMODES - 1) {
44: ewprintf("Too many modes");
1.10 db 45: return (FALSE);
1.2 millert 46: }
47: curbp->b_modes[++(curbp->b_nmodes)] = m;
48: } else {
49: /* fundamental is b_modes[0] and can't be unset */
1.5 mickey 50: for (i = 1; i <= curbp->b_nmodes && m != curbp->b_modes[i];
1.3 millert 51: i++);
1.2 millert 52: if (i > curbp->b_nmodes)
1.10 db 53: return (TRUE); /* mode wasn't set */
1.2 millert 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);
1.10 db 59: return (TRUE);
1.1 deraadt 60: }
61:
1.3 millert 62: int
1.8 vincent 63: indentmode(int f, int n)
1.1 deraadt 64: {
1.10 db 65: return (changemode(f, n, "indent"));
1.1 deraadt 66: }
67:
1.3 millert 68: int
1.8 vincent 69: fillmode(int f, int n)
1.1 deraadt 70: {
1.10 db 71: return (changemode(f, n, "fill"));
1.1 deraadt 72: }
73:
1.3 millert 74: #ifdef NOTAB
75: int
1.8 vincent 76: notabmode(int f, int n)
1.1 deraadt 77: {
1.2 millert 78: if (changemode(f, n, "notab") == FALSE)
1.10 db 79: return (FALSE);
1.2 millert 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;
1.10 db 87: return (TRUE);
1.1 deraadt 88: }
1.3 millert 89: #endif /* NOTAB */
1.1 deraadt 90:
1.3 millert 91: int
1.15 kjell 92: overwrite_mode(int f, int n)
1.1 deraadt 93: {
1.2 millert 94: if (changemode(f, n, "overwrite") == FALSE)
1.10 db 95: return (FALSE);
1.2 millert 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;
1.10 db 103: return (TRUE);
1.1 deraadt 104: }
105:
1.3 millert 106: int
1.8 vincent 107: set_default_mode(int f, int n)
1.1 deraadt 108: {
1.3 millert 109: int i;
1.13 deraadt 110: struct maps_s *m;
1.16 kjell 111: char modebuf[32], *bufp;
1.2 millert 112:
1.16 kjell 113: if ((bufp = eread("Set Default Mode: ", modebuf, sizeof(modebuf),
1.12 kjell 114: EFNEW)) == NULL)
1.10 db 115: return (ABORT);
1.9 vincent 116: else if (bufp[0] == '\0')
1.10 db 117: return (FALSE);
1.16 kjell 118: if ((m = name_mode(modebuf)) == NULL) {
119: ewprintf("can't find mode %s", modebuf);
1.10 db 120: return (FALSE);
1.2 millert 121: }
122: if (!(f & FFARG)) {
123: for (i = 0; i <= defb_nmodes; i++)
124: if (defb_modes[i] == m) {
1.3 millert 125: /* mode already set */
126: n = 0;
1.2 millert 127: break;
128: }
129: }
130: if (n > 0) {
131: for (i = 0; i <= defb_nmodes; i++)
132: if (defb_modes[i] == m)
1.3 millert 133: /* mode already set */
1.10 db 134: return (TRUE);
1.2 millert 135: if (defb_nmodes >= PBMODES - 1) {
136: ewprintf("Too many modes");
1.10 db 137: return (FALSE);
1.2 millert 138: }
139: defb_modes[++defb_nmodes] = m;
140: } else {
141: /* fundamental is defb_modes[0] and can't be unset */
1.3 millert 142: for (i = 1; i <= defb_nmodes && m != defb_modes[i]; i++);
1.2 millert 143: if (i > defb_nmodes)
1.3 millert 144: /* mode was not set */
1.10 db 145: return (TRUE);
1.2 millert 146: for (; i < defb_nmodes; i++)
147: defb_modes[i] = defb_modes[i + 1];
148: defb_nmodes--;
149: }
1.16 kjell 150: if (strcmp(modebuf, "overwrite") == 0) {
1.5 mickey 151: if (n <= 0)
1.2 millert 152: defb_flag &= ~BFOVERWRITE;
1.5 mickey 153: else
1.2 millert 154: defb_flag |= BFOVERWRITE;
1.3 millert 155: }
1.1 deraadt 156: #ifdef NOTAB
1.16 kjell 157: if (strcmp(modebuf, "notab") == 0) {
1.2 millert 158: if (n <= 0)
159: defb_flag &= ~BFNOTAB;
160: else
161: defb_flag |= BFNOTAB;
1.14 kjell 162: }
1.3 millert 163: #endif /* NOTAB */
1.10 db 164: return (TRUE);
1.1 deraadt 165: }