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