1 /* $OpenBSD: modes.c,v 1.6 2001/05/24 10:43:21 art Exp $ */ 2 3 /* 4 * Commands to toggle modes. Without an argument, these functions will 5 * toggle the given mode. A negative or zero argument will turn the mode 6 * off. A positive argument will turn the mode on. 7 */ 8 9 #include "def.h" 10 #include "kbd.h" 11 12 static int changemode __P((int, int, char *)); 13 14 int defb_nmodes = 0; 15 MAPS *defb_modes[PBMODES] = { &fundamental_mode }; 16 int defb_flag = 0; 17 18 static int 19 changemode(f, n, mode) 20 int f, n; 21 char *mode; 22 { 23 int i; 24 MAPS *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(f, n) 64 int f, n; 65 { 66 return changemode(f, n, "indent"); 67 } 68 69 int 70 fillmode(f, n) 71 int f, n; 72 { 73 return changemode(f, n, "fill"); 74 } 75 76 /* 77 * Fake the GNU "blink-matching-paren" variable. 78 */ 79 int 80 blinkparen(f, n) 81 int f, n; 82 { 83 return changemode(f, n, "blink"); 84 } 85 86 #ifdef NOTAB 87 int 88 notabmode(f, n) 89 int f, n; 90 { 91 if (changemode(f, n, "notab") == FALSE) 92 return FALSE; 93 if (f & FFARG) { 94 if (n <= 0) 95 curbp->b_flag &= ~BFNOTAB; 96 else 97 curbp->b_flag |= BFNOTAB; 98 } else 99 curbp->b_flag ^= BFNOTAB; 100 return TRUE; 101 } 102 #endif /* NOTAB */ 103 104 int 105 overwrite(f, n) 106 int f, n; 107 { 108 if (changemode(f, n, "overwrite") == FALSE) 109 return FALSE; 110 if (f & FFARG) { 111 if (n <= 0) 112 curbp->b_flag &= ~BFOVERWRITE; 113 else 114 curbp->b_flag |= BFOVERWRITE; 115 } else 116 curbp->b_flag ^= BFOVERWRITE; 117 return TRUE; 118 } 119 120 int 121 set_default_mode(f, n) 122 int f, n; 123 { 124 int i; 125 MAPS *m; 126 char mode[32]; 127 128 if (eread("Set Default Mode: ", mode, 32, EFNEW) != TRUE) 129 return ABORT; 130 if ((m = name_mode(mode)) == NULL) { 131 ewprintf("can't find mode %s", mode); 132 return FALSE; 133 } 134 if (!(f & FFARG)) { 135 for (i = 0; i <= defb_nmodes; i++) 136 if (defb_modes[i] == m) { 137 /* mode already set */ 138 n = 0; 139 break; 140 } 141 } 142 if (n > 0) { 143 for (i = 0; i <= defb_nmodes; i++) 144 if (defb_modes[i] == m) 145 /* mode already set */ 146 return TRUE; 147 if (defb_nmodes >= PBMODES - 1) { 148 ewprintf("Too many modes"); 149 return FALSE; 150 } 151 defb_modes[++defb_nmodes] = m; 152 } else { 153 /* fundamental is defb_modes[0] and can't be unset */ 154 for (i = 1; i <= defb_nmodes && m != defb_modes[i]; i++); 155 if (i > defb_nmodes) 156 /* mode was not set */ 157 return TRUE; 158 for (; i < defb_nmodes; i++) 159 defb_modes[i] = defb_modes[i + 1]; 160 defb_nmodes--; 161 } 162 if (strcmp(mode, "overwrite") == 0) { 163 if (n <= 0) 164 defb_flag &= ~BFOVERWRITE; 165 else 166 defb_flag |= BFOVERWRITE; 167 } 168 #ifdef NOTAB 169 if (strcmp(mode, "notab") == 0) 170 if (n <= 0) 171 defb_flag &= ~BFNOTAB; 172 else 173 defb_flag |= BFNOTAB; 174 #endif /* NOTAB */ 175 return TRUE; 176 } 177