aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2017-07-27 11:58:25 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2017-07-27 11:58:25 +0200
commit7d2f33dc1f6dcd44671d88360bc598ad82c37a60 (patch)
tree22a34314e925faec15984d2c8a7f313b08a9a681
parent5ea50697fd13eb1caeecf3ceb8d03a1e7f578406 (diff)
downloadbusybox-w32-7d2f33dc1f6dcd44671d88360bc598ad82c37a60.tar.gz
busybox-w32-7d2f33dc1f6dcd44671d88360bc598ad82c37a60.tar.bz2
busybox-w32-7d2f33dc1f6dcd44671d88360bc598ad82c37a60.zip
ed: code shrink
function old new delta findString 117 115 -2 skip_blank 16 - -16 getNum 369 345 -24 doCommands 2448 2183 -265 ------------------------------------------------------------------------------ (add/remove: 0/1 grow/shrink: 0/3 up/down: 0/-307) Total: -307 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--editors/ed.c94
1 files changed, 43 insertions, 51 deletions
diff --git a/editors/ed.c b/editors/ed.c
index a2a389c2b..b13c3ed59 100644
--- a/editors/ed.c
+++ b/editors/ed.c
@@ -78,13 +78,6 @@ static int bad_nums(int num1, int num2, const char *for_what)
78 return 0; 78 return 0;
79} 79}
80 80
81static char *skip_blank(const char *cp)
82{
83 while (isblank(*cp))
84 cp++;
85 return (char *)cp;
86}
87
88/* 81/*
89 * Return a pointer to the specified line number. 82 * Return a pointer to the specified line number.
90 */ 83 */
@@ -138,15 +131,13 @@ static int findString(const LINE *lp, const char *str, int len, int offset)
138 const char *cp, *ncp; 131 const char *cp, *ncp;
139 132
140 cp = &lp->data[offset]; 133 cp = &lp->data[offset];
141 left = lp->len - offset; 134 left = lp->len - offset - len;
142 135
143 while (left >= len) { 136 while (left >= 0) {
144 ncp = memchr(cp, *str, left); 137 ncp = memchr(cp, str[0], left + 1);
145 if (ncp == NULL) 138 if (ncp == NULL)
146 return -1; 139 return -1;
147 left -= (ncp - cp); 140 left -= (ncp - cp);
148 if (left < len)
149 return -1;
150 cp = ncp; 141 cp = ncp;
151 if (memcmp(cp, str, len) == 0) 142 if (memcmp(cp, str, len) == 0)
152 return (cp - lp->data); 143 return (cp - lp->data);
@@ -203,25 +194,23 @@ static NOINLINE int searchLines(const char *str, int num1, int num2)
203/* 194/*
204 * Parse a line number argument if it is present. This is a sum 195 * Parse a line number argument if it is present. This is a sum
205 * or difference of numbers, '.', '$', 'x, or a search string. 196 * or difference of numbers, '.', '$', 'x, or a search string.
206 * Returns TRUE if successful (whether or not there was a number). 197 * Returns pointer which stopped the scan if successful (whether or not
207 * Returns FALSE if there was a parsing error, with a message output. 198 * there was a number).
199 * Returns NULL if there was a parsing error, with a message output.
208 * Whether there was a number is returned indirectly, as is the number. 200 * Whether there was a number is returned indirectly, as is the number.
209 * The character pointer which stopped the scan is also returned.
210 */ 201 */
211static int getNum(const char **retcp, smallint *retHaveNum, int *retNum) 202static const char* getNum(const char *cp, smallint *retHaveNum, int *retNum)
212{ 203{
213 const char *cp;
214 char *endStr, str[USERSIZE]; 204 char *endStr, str[USERSIZE];
215 int value, num; 205 int value, num;
216 smallint haveNum, minus; 206 smallint haveNum, minus;
217 207
218 cp = *retcp;
219 value = 0; 208 value = 0;
220 haveNum = FALSE; 209 haveNum = FALSE;
221 minus = 0; 210 minus = 0;
222 211
223 while (TRUE) { 212 while (TRUE) {
224 cp = skip_blank(cp); 213 cp = skip_whitespace(cp);
225 214
226 switch (*cp) { 215 switch (*cp) {
227 case '.': 216 case '.':
@@ -240,7 +229,7 @@ static int getNum(const char **retcp, smallint *retHaveNum, int *retNum)
240 cp++; 229 cp++;
241 if ((*cp < 'a') || (*cp > 'z')) { 230 if ((*cp < 'a') || (*cp > 'z')) {
242 bb_error_msg("bad mark name"); 231 bb_error_msg("bad mark name");
243 return FALSE; 232 return NULL;
244 } 233 }
245 haveNum = TRUE; 234 haveNum = TRUE;
246 num = marks[*cp++ - 'a']; 235 num = marks[*cp++ - 'a'];
@@ -256,16 +245,15 @@ static int getNum(const char **retcp, smallint *retHaveNum, int *retNum)
256 cp = ""; 245 cp = "";
257 num = searchLines(str, curNum, lastNum); 246 num = searchLines(str, curNum, lastNum);
258 if (num == 0) 247 if (num == 0)
259 return FALSE; 248 return NULL;
260 haveNum = TRUE; 249 haveNum = TRUE;
261 break; 250 break;
262 251
263 default: 252 default:
264 if (!isdigit(*cp)) { 253 if (!isdigit(*cp)) {
265 *retcp = cp;
266 *retHaveNum = haveNum; 254 *retHaveNum = haveNum;
267 *retNum = value; 255 *retNum = value;
268 return TRUE; 256 return cp;
269 } 257 }
270 num = 0; 258 num = 0;
271 while (isdigit(*cp)) 259 while (isdigit(*cp))
@@ -276,7 +264,7 @@ static int getNum(const char **retcp, smallint *retHaveNum, int *retNum)
276 264
277 value += (minus ? -num : num); 265 value += (minus ? -num : num);
278 266
279 cp = skip_blank(cp); 267 cp = skip_whitespace(cp);
280 268
281 switch (*cp) { 269 switch (*cp) {
282 case '-': 270 case '-':
@@ -290,10 +278,9 @@ static int getNum(const char **retcp, smallint *retHaveNum, int *retNum)
290 break; 278 break;
291 279
292 default: 280 default:
293 *retcp = cp;
294 *retHaveNum = haveNum; 281 *retHaveNum = haveNum;
295 *retNum = value; 282 *retNum = value;
296 return TRUE; 283 return cp;
297 } 284 }
298 } 285 }
299} 286}
@@ -789,12 +776,13 @@ static void subCommand(const char *cmd, int num1, int num2)
789 */ 776 */
790static void doCommands(void) 777static void doCommands(void)
791{ 778{
792 const char *cp;
793 char *endbuf, buf[USERSIZE];
794 int len, num1, num2;
795 smallint have1, have2;
796
797 while (TRUE) { 779 while (TRUE) {
780 char buf[USERSIZE];
781 const char *cp;
782 int len;
783 int n, num1, num2;
784 smallint h, have1, have2;
785
798 /* Returns: 786 /* Returns:
799 * -1 on read errors or EOF, or on bare Ctrl-D. 787 * -1 on read errors or EOF, or on bare Ctrl-D.
800 * 0 on ctrl-C, 788 * 0 on ctrl-C,
@@ -803,32 +791,36 @@ static void doCommands(void)
803 len = read_line_input(NULL, ": ", buf, sizeof(buf), /*timeout*/ -1); 791 len = read_line_input(NULL, ": ", buf, sizeof(buf), /*timeout*/ -1);
804 if (len <= 0) 792 if (len <= 0)
805 return; 793 return;
806 endbuf = &buf[len - 1]; 794 while (len && isblank(buf[--len]))
807 while ((endbuf > buf) && isblank(endbuf[-1])) 795 buf[len] = '\0';
808 endbuf--;
809 *endbuf = '\0';
810
811 cp = skip_blank(buf);
812 have1 = FALSE;
813 have2 = FALSE;
814 796
815 if ((curNum == 0) && (lastNum > 0)) { 797 if ((curNum == 0) && (lastNum > 0)) {
816 curNum = 1; 798 curNum = 1;
817 curLine = lines.next; 799 curLine = lines.next;
818 } 800 }
819 801
820 if (!getNum(&cp, &have1, &num1)) 802 have1 = FALSE;
803 have2 = FALSE;
804 /* Don't pass &have1, &num1 to getNum() since this forces
805 * compiler to keep them on stack, not in registers,
806 * which is usually quite suboptimal.
807 * Using intermediate variables shrinks code by ~150 bytes.
808 */
809 cp = getNum(skip_whitespace(buf), &h, &n);
810 if (!cp)
821 continue; 811 continue;
812 have1 = h;
813 num1 = n;
822 814
823 cp = skip_blank(cp); 815 cp = skip_whitespace(cp);
824
825 if (*cp == ',') { 816 if (*cp == ',') {
826 cp++; 817 cp = getNum(cp + 1, &h, &n);
827 if (!getNum(&cp, &have2, &num2)) 818 if (!cp)
828 continue; 819 continue;
820 num2 = n;
829 if (!have1) 821 if (!have1)
830 num1 = 1; 822 num1 = 1;
831 if (!have2) 823 if (!h)
832 num2 = lastNum; 824 num2 = lastNum;
833 have1 = TRUE; 825 have1 = TRUE;
834 have2 = TRUE; 826 have2 = TRUE;
@@ -857,7 +849,7 @@ static void doCommands(void)
857 bb_error_msg("bad file command"); 849 bb_error_msg("bad file command");
858 break; 850 break;
859 } 851 }
860 cp = skip_blank(cp); 852 cp = skip_whitespace(cp);
861 if (*cp == '\0') { 853 if (*cp == '\0') {
862 if (fileName) 854 if (fileName)
863 printf("\"%s\"\n", fileName); 855 printf("\"%s\"\n", fileName);
@@ -874,7 +866,7 @@ static void doCommands(void)
874 break; 866 break;
875 867
876 case 'k': 868 case 'k':
877 cp = skip_blank(cp); 869 cp = skip_whitespace(cp);
878 if ((*cp < 'a') || (*cp > 'z') || cp[1]) { 870 if ((*cp < 'a') || (*cp > 'z') || cp[1]) {
879 bb_error_msg("bad mark name"); 871 bb_error_msg("bad mark name");
880 break; 872 break;
@@ -891,7 +883,7 @@ static void doCommands(void)
891 break; 883 break;
892 884
893 case 'q': 885 case 'q':
894 cp = skip_blank(cp); 886 cp = skip_whitespace(cp);
895 if (have1 || *cp) { 887 if (have1 || *cp) {
896 bb_error_msg("bad quit command"); 888 bb_error_msg("bad quit command");
897 break; 889 break;
@@ -902,7 +894,7 @@ static void doCommands(void)
902 /* read error/EOF - no way to continue */ 894 /* read error/EOF - no way to continue */
903 if (len < 0) 895 if (len < 0)
904 return; 896 return;
905 cp = skip_blank(buf); 897 cp = skip_whitespace(buf);
906 if ((*cp | 0x20) == 'y') /* Y or y */ 898 if ((*cp | 0x20) == 'y') /* Y or y */
907 return; 899 return;
908 break; 900 break;
@@ -912,7 +904,7 @@ static void doCommands(void)
912 bb_error_msg("bad read command"); 904 bb_error_msg("bad read command");
913 break; 905 break;
914 } 906 }
915 cp = skip_blank(cp); 907 cp = skip_whitespace(cp);
916 if (*cp == '\0') { 908 if (*cp == '\0') {
917 bb_error_msg("no file name"); 909 bb_error_msg("no file name");
918 break; 910 break;
@@ -934,7 +926,7 @@ static void doCommands(void)
934 bb_error_msg("bad write command"); 926 bb_error_msg("bad write command");
935 break; 927 break;
936 } 928 }
937 cp = skip_blank(cp); 929 cp = skip_whitespace(cp);
938 if (!have1) { 930 if (!have1) {
939 num1 = 1; 931 num1 = 1;
940 num2 = lastNum; 932 num2 = lastNum;