1 /* $OpenBSD: modes.c,v 1.8 2002/07/01 14:33:44 vincent 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(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(int f, int n, char *mode) 20 { 21 int i; 22 MAPS *m; 23 24 if ((m = name_mode(mode)) == NULL) { 25 ewprintf("Can't find mode %s", mode); 26 return FALSE; 27 } 28 if (!(f & FFARG)) { 29 for (i = 0; i <= curbp->b_nmodes; i++) 30 if (curbp->b_modes[i] == m) { 31 /* mode already set */ 32 n = 0; 33 break; 34 } 35 } 36 if (n > 0) { 37 for (i = 0; i <= curbp->b_nmodes; i++) 38 if (curbp->b_modes[i] == m) 39 /* mode already set */ 40 return TRUE; 41 if (curbp->b_nmodes >= PBMODES - 1) { 42 ewprintf("Too many modes"); 43 return FALSE; 44 } 45 curbp->b_modes[++(curbp->b_nmodes)] = m; 46 } else { 47 /* fundamental is b_modes[0] and can't be unset */ 48 for (i = 1; i <= curbp->b_nmodes && m != curbp->b_modes[i]; 49 i++); 50 if (i > curbp->b_nmodes) 51 return TRUE; /* mode wasn't set */ 52 for (; i < curbp->b_nmodes; i++) 53 curbp->b_modes[i] = curbp->b_modes[i + 1]; 54 curbp->b_nmodes--; 55 } 56 upmodes(curbp); 57 return TRUE; 58 } 59 60 int 61 indentmode(int f, int n) 62 { 63 return changemode(f, n, "indent"); 64 } 65 66 int 67 fillmode(int f, int n) 68 { 69 return changemode(f, n, "fill"); 70 } 71 72 /* 73 * Fake the GNU "blink-matching-paren" variable. 74 */ 75 int 76 blinkparen(int f, int n) 77 { 78 return changemode(f, n, "blink"); 79 } 80 81 #ifdef NOTAB 82 int 83 notabmode(int f, int n) 84 { 85 if (changemode(f, n, "notab") == FALSE) 86 return FALSE; 87 if (f & FFARG) { 88 if (n <= 0) 89 curbp->b_flag &= ~BFNOTAB; 90 else 91 curbp->b_flag |= BFNOTAB; 92 } else 93 curbp->b_flag ^= BFNOTAB; 94 return TRUE; 95 } 96 #endif /* NOTAB */ 97 98 int 99 overwrite(int f, int n) 100 { 101 if (changemode(f, n, "overwrite") == FALSE) 102 return FALSE; 103 if (f & FFARG) { 104 if (n <= 0) 105 curbp->b_flag &= ~BFOVERWRITE; 106 else 107 curbp->b_flag |= BFOVERWRITE; 108 } else 109 curbp->b_flag ^= BFOVERWRITE; 110 return TRUE; 111 } 112 113 int 114 set_default_mode(int f, int n) 115 { 116 int i; 117 MAPS *m; 118 char mode[32]; 119 120 if (eread("Set Default Mode: ", mode, 32, EFNEW) != TRUE) 121 return ABORT; 122 if ((m = name_mode(mode)) == NULL) { 123 ewprintf("can't find mode %s", mode); 124 return FALSE; 125 } 126 if (!(f & FFARG)) { 127 for (i = 0; i <= defb_nmodes; i++) 128 if (defb_modes[i] == m) { 129 /* mode already set */ 130 n = 0; 131 break; 132 } 133 } 134 if (n > 0) { 135 for (i = 0; i <= defb_nmodes; i++) 136 if (defb_modes[i] == m) 137 /* mode already set */ 138 return TRUE; 139 if (defb_nmodes >= PBMODES - 1) { 140 ewprintf("Too many modes"); 141 return FALSE; 142 } 143 defb_modes[++defb_nmodes] = m; 144 } else { 145 /* fundamental is defb_modes[0] and can't be unset */ 146 for (i = 1; i <= defb_nmodes && m != defb_modes[i]; i++); 147 if (i > defb_nmodes) 148 /* mode was not set */ 149 return TRUE; 150 for (; i < defb_nmodes; i++) 151 defb_modes[i] = defb_modes[i + 1]; 152 defb_nmodes--; 153 } 154 if (strcmp(mode, "overwrite") == 0) { 155 if (n <= 0) 156 defb_flag &= ~BFOVERWRITE; 157 else 158 defb_flag |= BFOVERWRITE; 159 } 160 #ifdef NOTAB 161 if (strcmp(mode, "notab") == 0) 162 if (n <= 0) 163 defb_flag &= ~BFNOTAB; 164 else 165 defb_flag |= BFNOTAB; 166 #endif /* NOTAB */ 167 return TRUE; 168 } 169