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