diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2017-07-27 11:58:25 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2017-07-27 11:58:25 +0200 |
commit | 7d2f33dc1f6dcd44671d88360bc598ad82c37a60 (patch) | |
tree | 22a34314e925faec15984d2c8a7f313b08a9a681 | |
parent | 5ea50697fd13eb1caeecf3ceb8d03a1e7f578406 (diff) | |
download | busybox-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.c | 94 |
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 | ||
81 | static 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 | */ |
211 | static int getNum(const char **retcp, smallint *retHaveNum, int *retNum) | 202 | static 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 | */ |
790 | static void doCommands(void) | 777 | static 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; |