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 } 166