aboutsummaryrefslogtreecommitdiff
path: root/editors
diff options
context:
space:
mode:
authorJames Byrne <james.byrne@origamienergy.com>2019-07-02 11:35:03 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2019-07-02 11:35:03 +0200
commit6937487be73cd4563b876413277a295a5fe2f32c (patch)
treef16cc9999a7c827891e6ec8d99c699fc791008ee /editors
parentcaecfdc20d450686cd1f7e9b5f650322f894b3c2 (diff)
downloadbusybox-w32-6937487be73cd4563b876413277a295a5fe2f32c.tar.gz
busybox-w32-6937487be73cd4563b876413277a295a5fe2f32c.tar.bz2
busybox-w32-6937487be73cd4563b876413277a295a5fe2f32c.zip
libbb: reduce the overhead of single parameter bb_error_msg() calls
Back in 2007, commit 0c97c9d43707 ("'simple' error message functions by Loic Grenie") introduced bb_simple_perror_msg() to allow for a lower overhead call to bb_perror_msg() when only a string was being printed with no parameters. This saves space for some CPU architectures because it avoids the overhead of a call to a variadic function. However there has never been a simple version of bb_error_msg(), and since 2007 many new calls to bb_perror_msg() have been added that only take a single parameter and so could have been using bb_simple_perror_message(). This changeset introduces 'simple' versions of bb_info_msg(), bb_error_msg(), bb_error_msg_and_die(), bb_herror_msg() and bb_herror_msg_and_die(), and replaces all calls that only take a single parameter, or use something like ("%s", arg), with calls to the corresponding 'simple' version. Since it is likely that single parameter calls to the variadic functions may be accidentally reintroduced in the future a new debugging config option WARN_SIMPLE_MSG has been introduced. This uses some macro magic which will cause any such calls to generate a warning, but this is turned off by default to avoid use of the unpleasant macros in normal circumstances. This is a large changeset due to the number of calls that have been replaced. The only files that contain changes other than simple substitution of function calls are libbb.h, libbb/herror_msg.c, libbb/verror_msg.c and libbb/xfuncs_printf.c. In miscutils/devfsd.c, networking/udhcp/common.h and util-linux/mdev.c additonal macros have been added for logging so that single parameter and multiple parameter logging variants exist. The amount of space saved varies considerably by architecture, and was found to be as follows (for 'defconfig' using GCC 7.4): Arm: -92 bytes MIPS: -52 bytes PPC: -1836 bytes x86_64: -938 bytes Note that for the MIPS architecture only an exception had to be made disabling the 'simple' calls for 'udhcp' (in networking/udhcp/common.h) because it made these files larger on MIPS. Signed-off-by: James Byrne <james.byrne@origamienergy.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'editors')
-rw-r--r--editors/awk.c4
-rw-r--r--editors/diff.c4
-rw-r--r--editors/ed.c34
-rw-r--r--editors/patch_bbox.c6
-rw-r--r--editors/patch_toybox.c2
-rw-r--r--editors/sed.c18
-rw-r--r--editors/vi.c2
7 files changed, 35 insertions, 35 deletions
diff --git a/editors/awk.c b/editors/awk.c
index d25508e5d..f19990901 100644
--- a/editors/awk.c
+++ b/editors/awk.c
@@ -2633,7 +2633,7 @@ static var *evaluate(node *op, var *res)
2633 if (opn == '|') { 2633 if (opn == '|') {
2634 rsm->F = popen(R.s, "w"); 2634 rsm->F = popen(R.s, "w");
2635 if (rsm->F == NULL) 2635 if (rsm->F == NULL)
2636 bb_perror_msg_and_die("popen"); 2636 bb_simple_perror_msg_and_die("popen");
2637 rsm->is_pipe = 1; 2637 rsm->is_pipe = 1;
2638 } else { 2638 } else {
2639 rsm->F = xfopen(R.s, opn=='w' ? "w" : "a"); 2639 rsm->F = xfopen(R.s, opn=='w' ? "w" : "a");
@@ -3246,7 +3246,7 @@ int awk_main(int argc UNUSED_PARAM, char **argv)
3246 argv += optind; 3246 argv += optind;
3247 //argc -= optind; 3247 //argc -= optind;
3248 if (opt & OPT_W) 3248 if (opt & OPT_W)
3249 bb_error_msg("warning: option -W is ignored"); 3249 bb_simple_error_msg("warning: option -W is ignored");
3250 if (opt & OPT_F) { 3250 if (opt & OPT_F) {
3251 unescape_string_in_place(opt_F); 3251 unescape_string_in_place(opt_F);
3252 setvar_s(intvar[FS], opt_F); 3252 setvar_s(intvar[FS], opt_F);
diff --git a/editors/diff.c b/editors/diff.c
index 1462a9b18..dc40ab4f1 100644
--- a/editors/diff.c
+++ b/editors/diff.c
@@ -1006,7 +1006,7 @@ int diff_main(int argc UNUSED_PARAM, char **argv)
1006 xfunc_error_retval = 1; 1006 xfunc_error_retval = 1;
1007 1007
1008 if (gotstdin && (S_ISDIR(stb[0].st_mode) || S_ISDIR(stb[1].st_mode))) 1008 if (gotstdin && (S_ISDIR(stb[0].st_mode) || S_ISDIR(stb[1].st_mode)))
1009 bb_error_msg_and_die("can't compare stdin to a directory"); 1009 bb_simple_error_msg_and_die("can't compare stdin to a directory");
1010 1010
1011 /* Compare metadata to check if the files are the same physical file. 1011 /* Compare metadata to check if the files are the same physical file.
1012 * 1012 *
@@ -1037,7 +1037,7 @@ int diff_main(int argc UNUSED_PARAM, char **argv)
1037#if ENABLE_FEATURE_DIFF_DIR 1037#if ENABLE_FEATURE_DIFF_DIR
1038 diffdir(file, s_start); 1038 diffdir(file, s_start);
1039#else 1039#else
1040 bb_error_msg_and_die("no support for directory comparison"); 1040 bb_simple_error_msg_and_die("no support for directory comparison");
1041#endif 1041#endif
1042 } else { 1042 } else {
1043 bool dirfile = S_ISDIR(stb[0].st_mode) || S_ISDIR(stb[1].st_mode); 1043 bool dirfile = S_ISDIR(stb[0].st_mode) || S_ISDIR(stb[1].st_mode);
diff --git a/editors/ed.c b/editors/ed.c
index 1a36add39..d3ae8da92 100644
--- a/editors/ed.c
+++ b/editors/ed.c
@@ -165,7 +165,7 @@ static NOINLINE int searchLines(const char *str, int num1, int num2)
165 165
166 if (*str == '\0') { 166 if (*str == '\0') {
167 if (searchString[0] == '\0') { 167 if (searchString[0] == '\0') {
168 bb_error_msg("no previous search string"); 168 bb_simple_error_msg("no previous search string");
169 return 0; 169 return 0;
170 } 170 }
171 str = searchString; 171 str = searchString;
@@ -228,7 +228,7 @@ static const char* getNum(const char *cp, smallint *retHaveNum, int *retNum)
228 case '\'': 228 case '\'':
229 cp++; 229 cp++;
230 if ((unsigned)(*cp - 'a') >= 26) { 230 if ((unsigned)(*cp - 'a') >= 26) {
231 bb_error_msg("bad mark name"); 231 bb_simple_error_msg("bad mark name");
232 return NULL; 232 return NULL;
233 } 233 }
234 haveNum = TRUE; 234 haveNum = TRUE;
@@ -314,7 +314,7 @@ static int insertLine(int num, const char *data, int len)
314 LINE *newLp, *lp; 314 LINE *newLp, *lp;
315 315
316 if ((num < 1) || (num > lastNum + 1)) { 316 if ((num < 1) || (num > lastNum + 1)) {
317 bb_error_msg("inserting at bad line number"); 317 bb_simple_error_msg("inserting at bad line number");
318 return FALSE; 318 return FALSE;
319 } 319 }
320 320
@@ -384,7 +384,7 @@ static int readLines(const char *file, int num)
384 char *cp; 384 char *cp;
385 385
386 if ((num < 1) || (num > lastNum + 1)) { 386 if ((num < 1) || (num > lastNum + 1)) {
387 bb_error_msg("bad line for read"); 387 bb_simple_error_msg("bad line for read");
388 return FALSE; 388 return FALSE;
389 } 389 }
390 390
@@ -629,7 +629,7 @@ static void subCommand(const char *cmd, int num1, int num2)
629 cp = buf; 629 cp = buf;
630 630
631 if (isblank(*cp) || (*cp == '\0')) { 631 if (isblank(*cp) || (*cp == '\0')) {
632 bb_error_msg("bad delimiter for substitute"); 632 bb_simple_error_msg("bad delimiter for substitute");
633 return; 633 return;
634 } 634 }
635 635
@@ -638,7 +638,7 @@ static void subCommand(const char *cmd, int num1, int num2)
638 638
639 cp = strchr(cp, delim); 639 cp = strchr(cp, delim);
640 if (cp == NULL) { 640 if (cp == NULL) {
641 bb_error_msg("missing 2nd delimiter for substitute"); 641 bb_simple_error_msg("missing 2nd delimiter for substitute");
642 return; 642 return;
643 } 643 }
644 644
@@ -660,13 +660,13 @@ static void subCommand(const char *cmd, int num1, int num2)
660 printFlag = TRUE; 660 printFlag = TRUE;
661 break; 661 break;
662 default: 662 default:
663 bb_error_msg("unknown option for substitute"); 663 bb_simple_error_msg("unknown option for substitute");
664 return; 664 return;
665 } 665 }
666 666
667 if (*oldStr == '\0') { 667 if (*oldStr == '\0') {
668 if (searchString[0] == '\0') { 668 if (searchString[0] == '\0') {
669 bb_error_msg("no previous search string"); 669 bb_simple_error_msg("no previous search string");
670 return; 670 return;
671 } 671 }
672 oldStr = searchString; 672 oldStr = searchString;
@@ -846,7 +846,7 @@ static void doCommands(void)
846 846
847 case 'f': 847 case 'f':
848 if (*cp != '\0' && *cp != ' ') { 848 if (*cp != '\0' && *cp != ' ') {
849 bb_error_msg("bad file command"); 849 bb_simple_error_msg("bad file command");
850 break; 850 break;
851 } 851 }
852 cp = skip_whitespace(cp); 852 cp = skip_whitespace(cp);
@@ -870,7 +870,7 @@ static void doCommands(void)
870 case 'k': 870 case 'k':
871 cp = skip_whitespace(cp); 871 cp = skip_whitespace(cp);
872 if ((unsigned)(*cp - 'a') >= 26 || cp[1]) { 872 if ((unsigned)(*cp - 'a') >= 26 || cp[1]) {
873 bb_error_msg("bad mark name"); 873 bb_simple_error_msg("bad mark name");
874 break; 874 break;
875 } 875 }
876 marks[(unsigned)(*cp - 'a')] = num2; 876 marks[(unsigned)(*cp - 'a')] = num2;
@@ -887,7 +887,7 @@ static void doCommands(void)
887 case 'q': 887 case 'q':
888 cp = skip_whitespace(cp); 888 cp = skip_whitespace(cp);
889 if (have1 || *cp) { 889 if (have1 || *cp) {
890 bb_error_msg("bad quit command"); 890 bb_simple_error_msg("bad quit command");
891 break; 891 break;
892 } 892 }
893 if (!dirty) 893 if (!dirty)
@@ -903,12 +903,12 @@ static void doCommands(void)
903 903
904 case 'r': 904 case 'r':
905 if (*cp != '\0' && *cp != ' ') { 905 if (*cp != '\0' && *cp != ' ') {
906 bb_error_msg("bad read command"); 906 bb_simple_error_msg("bad read command");
907 break; 907 break;
908 } 908 }
909 cp = skip_whitespace(cp); 909 cp = skip_whitespace(cp);
910 if (*cp == '\0') { 910 if (*cp == '\0') {
911 bb_error_msg("no file name"); 911 bb_simple_error_msg("no file name");
912 break; 912 break;
913 } 913 }
914 if (!have1) 914 if (!have1)
@@ -925,14 +925,14 @@ static void doCommands(void)
925 925
926 case 'w': 926 case 'w':
927 if (*cp != '\0' && *cp != ' ') { 927 if (*cp != '\0' && *cp != ' ') {
928 bb_error_msg("bad write command"); 928 bb_simple_error_msg("bad write command");
929 break; 929 break;
930 } 930 }
931 cp = skip_whitespace(cp); 931 cp = skip_whitespace(cp);
932 if (*cp == '\0') { 932 if (*cp == '\0') {
933 cp = fileName; 933 cp = fileName;
934 if (!cp) { 934 if (!cp) {
935 bb_error_msg("no file name specified"); 935 bb_simple_error_msg("no file name specified");
936 break; 936 break;
937 } 937 }
938 } 938 }
@@ -960,7 +960,7 @@ static void doCommands(void)
960 960
961 case '.': 961 case '.':
962 if (have1) { 962 if (have1) {
963 bb_error_msg("no arguments allowed"); 963 bb_simple_error_msg("no arguments allowed");
964 break; 964 break;
965 } 965 }
966 printLines(curNum, curNum, FALSE); 966 printLines(curNum, curNum, FALSE);
@@ -984,7 +984,7 @@ static void doCommands(void)
984 break; 984 break;
985 985
986 default: 986 default:
987 bb_error_msg("unimplemented command"); 987 bb_simple_error_msg("unimplemented command");
988 break; 988 break;
989 } 989 }
990 } 990 }
diff --git a/editors/patch_bbox.c b/editors/patch_bbox.c
index 8e09ef488..d1f1ee2d6 100644
--- a/editors/patch_bbox.c
+++ b/editors/patch_bbox.c
@@ -30,7 +30,7 @@ static unsigned copy_lines(FILE *src_stream, FILE *dst_stream, unsigned lines_co
30 break; 30 break;
31 } 31 }
32 if (fputs(line, dst_stream) == EOF) { 32 if (fputs(line, dst_stream) == EOF) {
33 bb_perror_msg_and_die("error writing to new file"); 33 bb_simple_perror_msg_and_die("error writing to new file");
34 } 34 }
35 free(line); 35 free(line);
36 lines_count--; 36 lines_count--;
@@ -148,7 +148,7 @@ int patch_main(int argc UNUSED_PARAM, char **argv)
148 148
149 new_filename = extract_filename(patch_line, patch_level, "+++ "); 149 new_filename = extract_filename(patch_line, patch_level, "+++ ");
150 if (!new_filename) { 150 if (!new_filename) {
151 bb_error_msg_and_die("invalid patch"); 151 bb_simple_error_msg_and_die("invalid patch");
152 } 152 }
153 153
154 /* Get access rights from the file to be patched */ 154 /* Get access rights from the file to be patched */
@@ -209,7 +209,7 @@ int patch_main(int argc UNUSED_PARAM, char **argv)
209 /* src_beg_line will be 0 if it's a new file */ 209 /* src_beg_line will be 0 if it's a new file */
210 count = src_beg_line - src_cur_line; 210 count = src_beg_line - src_cur_line;
211 if (copy_lines(src_stream, dst_stream, count)) { 211 if (copy_lines(src_stream, dst_stream, count)) {
212 bb_error_msg_and_die("bad src file"); 212 bb_simple_error_msg_and_die("bad src file");
213 } 213 }
214 src_cur_line += count; 214 src_cur_line += count;
215 dst_cur_line += count; 215 dst_cur_line += count;
diff --git a/editors/patch_toybox.c b/editors/patch_toybox.c
index 3ffbf9084..aebab8132 100644
--- a/editors/patch_toybox.c
+++ b/editors/patch_toybox.c
@@ -200,7 +200,7 @@ int copy_tempfile(int fdin, char *name, char **tempname)
200 200
201 *tempname = xasprintf("%sXXXXXX", name); 201 *tempname = xasprintf("%sXXXXXX", name);
202 fd = mkstemp(*tempname); 202 fd = mkstemp(*tempname);
203 if(-1 == fd) bb_perror_msg_and_die("no temp file"); 203 if(-1 == fd) bb_simple_perror_msg_and_die("no temp file");
204 204
205 // Set permissions of output file 205 // Set permissions of output file
206 fstat(fdin, &statbuf); 206 fstat(fdin, &statbuf);
diff --git a/editors/sed.c b/editors/sed.c
index 57d3dda16..d3444003e 100644
--- a/editors/sed.c
+++ b/editors/sed.c
@@ -315,7 +315,7 @@ static int parse_regex_delim(const char *cmdstr, char **match, char **replace)
315 /* verify that the 's' or 'y' is followed by something. That something 315 /* verify that the 's' or 'y' is followed by something. That something
316 * (typically a 'slash') is now our regexp delimiter... */ 316 * (typically a 'slash') is now our regexp delimiter... */
317 if (*cmdstr == '\0') 317 if (*cmdstr == '\0')
318 bb_error_msg_and_die("bad format in substitution expression"); 318 bb_simple_error_msg_and_die("bad format in substitution expression");
319 delimiter = *cmdstr_ptr++; 319 delimiter = *cmdstr_ptr++;
320 320
321 /* save the match string */ 321 /* save the match string */
@@ -360,7 +360,7 @@ static int get_address(const char *my_str, int *linenum, regex_t ** regex)
360 } else { 360 } else {
361 *regex = G.previous_regex_ptr; 361 *regex = G.previous_regex_ptr;
362 if (!G.previous_regex_ptr) 362 if (!G.previous_regex_ptr)
363 bb_error_msg_and_die("no previous regexp"); 363 bb_simple_error_msg_and_die("no previous regexp");
364 } 364 }
365 /* Move position to next character after last delimiter */ 365 /* Move position to next character after last delimiter */
366 pos += (next+1); 366 pos += (next+1);
@@ -378,7 +378,7 @@ static int parse_file_cmd(/*sed_cmd_t *sed_cmd,*/ const char *filecmdstr, char *
378 start = skip_whitespace(filecmdstr); 378 start = skip_whitespace(filecmdstr);
379 eol = strchrnul(start, '\n'); 379 eol = strchrnul(start, '\n');
380 if (eol == start) 380 if (eol == start)
381 bb_error_msg_and_die("empty filename"); 381 bb_simple_error_msg_and_die("empty filename");
382 382
383 if (*eol) { 383 if (*eol) {
384 /* If lines glued together, put backslash back. */ 384 /* If lines glued together, put backslash back. */
@@ -468,7 +468,7 @@ static int parse_subst_cmd(sed_cmd_t *sed_cmd, const char *substr)
468 goto out; 468 goto out;
469 default: 469 default:
470 dbg("s bad flags:'%s'", substr + idx); 470 dbg("s bad flags:'%s'", substr + idx);
471 bb_error_msg_and_die("bad option in substitution expression"); 471 bb_simple_error_msg_and_die("bad option in substitution expression");
472 } 472 }
473 } 473 }
474 out: 474 out:
@@ -688,7 +688,7 @@ static void add_cmd(const char *cmdstr)
688 idx--; /* if 0, trigger error check below */ 688 idx--; /* if 0, trigger error check below */
689 } 689 }
690 if (idx < 0) 690 if (idx < 0)
691 bb_error_msg_and_die("no address after comma"); 691 bb_simple_error_msg_and_die("no address after comma");
692 sed_cmd->end_line_orig = sed_cmd->end_line; 692 sed_cmd->end_line_orig = sed_cmd->end_line;
693 } 693 }
694 694
@@ -706,7 +706,7 @@ static void add_cmd(const char *cmdstr)
706 706
707 /* last part (mandatory) will be a command */ 707 /* last part (mandatory) will be a command */
708 if (!*cmdstr) 708 if (!*cmdstr)
709 bb_error_msg_and_die("missing command"); 709 bb_simple_error_msg_and_die("missing command");
710 sed_cmd->cmd = *cmdstr++; 710 sed_cmd->cmd = *cmdstr++;
711 cmdstr = parse_cmd_args(sed_cmd, cmdstr); 711 cmdstr = parse_cmd_args(sed_cmd, cmdstr);
712 712
@@ -791,7 +791,7 @@ static int do_subst_command(sed_cmd_t *sed_cmd, char **line_p)
791 if (!current_regex) { 791 if (!current_regex) {
792 current_regex = G.previous_regex_ptr; 792 current_regex = G.previous_regex_ptr;
793 if (!current_regex) 793 if (!current_regex)
794 bb_error_msg_and_die("no previous regexp"); 794 bb_simple_error_msg_and_die("no previous regexp");
795 } 795 }
796 G.previous_regex_ptr = current_regex; 796 G.previous_regex_ptr = current_regex;
797 797
@@ -962,7 +962,7 @@ static void puts_maybe_newline(char *s, FILE *file, char *last_puts_char, char l
962 962
963 if (ferror(file)) { 963 if (ferror(file)) {
964 xfunc_error_retval = 4; /* It's what gnu sed exits with... */ 964 xfunc_error_retval = 4; /* It's what gnu sed exits with... */
965 bb_error_msg_and_die(bb_msg_write_error); 965 bb_simple_error_msg_and_die(bb_msg_write_error);
966 } 966 }
967 *last_puts_char = lpc; 967 *last_puts_char = lpc;
968} 968}
@@ -1192,7 +1192,7 @@ static void process_files(void)
1192 } 1192 }
1193 sed_cmd = sed_cmd->next; 1193 sed_cmd = sed_cmd->next;
1194 if (!sed_cmd) 1194 if (!sed_cmd)
1195 bb_error_msg_and_die("unterminated {"); 1195 bb_simple_error_msg_and_die("unterminated {");
1196 } 1196 }
1197 } 1197 }
1198 continue; 1198 continue;
diff --git a/editors/vi.c b/editors/vi.c
index 0ea547a75..f8fab7028 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -1042,7 +1042,7 @@ static int readit(void) // read (maybe cursor) key from stdin
1042 goto again; 1042 goto again;
1043 go_bottom_and_clear_to_eol(); 1043 go_bottom_and_clear_to_eol();
1044 cookmode(); // terminal to "cooked" 1044 cookmode(); // terminal to "cooked"
1045 bb_error_msg_and_die("can't read user input"); 1045 bb_simple_error_msg_and_die("can't read user input");
1046 } 1046 }
1047 return c; 1047 return c;
1048} 1048}