aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2018-12-05 08:38:55 +0000
committerRon Yorston <rmy@pobox.com>2018-12-05 08:38:55 +0000
commit2a34d6d4e3122df2f84eb1290221128be47dc36b (patch)
treea7035842113f36823c4e7c16744416259f0a8bf6
parent5448a3893434a64d184055be81a58f47ea6af51b (diff)
parentd08206dce1291f512d7de9037d9ef1ffbf705cac (diff)
downloadbusybox-w32-2a34d6d4e3122df2f84eb1290221128be47dc36b.tar.gz
busybox-w32-2a34d6d4e3122df2f84eb1290221128be47dc36b.tar.bz2
busybox-w32-2a34d6d4e3122df2f84eb1290221128be47dc36b.zip
Merge branch 'busybox' into merge
-rw-r--r--coreutils/cat.c6
-rw-r--r--coreutils/nl.c7
-rw-r--r--editors/awk.c2
-rw-r--r--editors/vi.c45
-rw-r--r--include/libbb.h2
-rw-r--r--libbb/print_numbered_lines.c10
-rw-r--r--libbb/process_escape_sequence.c16
7 files changed, 58 insertions, 30 deletions
diff --git a/coreutils/cat.c b/coreutils/cat.c
index fb735f994..65f0648f9 100644
--- a/coreutils/cat.c
+++ b/coreutils/cat.c
@@ -195,6 +195,7 @@ int cat_main(int argc UNUSED_PARAM, char **argv)
195# define CAT_OPT_b (1<<1) 195# define CAT_OPT_b (1<<1)
196 if (opts & (CAT_OPT_n|CAT_OPT_b)) { /* -n or -b */ 196 if (opts & (CAT_OPT_n|CAT_OPT_b)) { /* -n or -b */
197 struct number_state ns; 197 struct number_state ns;
198 int exitcode;
198 199
199 ns.width = 6; 200 ns.width = 6;
200 ns.start = 1; 201 ns.start = 1;
@@ -203,10 +204,11 @@ int cat_main(int argc UNUSED_PARAM, char **argv)
203 ns.empty_str = "\n"; 204 ns.empty_str = "\n";
204 ns.all = !(opts & CAT_OPT_b); /* -n without -b */ 205 ns.all = !(opts & CAT_OPT_b); /* -n without -b */
205 ns.nonempty = (opts & CAT_OPT_b); /* -b (with or without -n) */ 206 ns.nonempty = (opts & CAT_OPT_b); /* -b (with or without -n) */
207 exitcode = EXIT_SUCCESS;
206 do { 208 do {
207 print_numbered_lines(&ns, *argv); 209 exitcode |= print_numbered_lines(&ns, *argv);
208 } while (*++argv); 210 } while (*++argv);
209 fflush_stdout_and_exit(EXIT_SUCCESS); 211 fflush_stdout_and_exit(exitcode);
210 } 212 }
211 /*opts >>= 2;*/ 213 /*opts >>= 2;*/
212#endif 214#endif
diff --git a/coreutils/nl.c b/coreutils/nl.c
index c2f8b1042..2fdc9d85e 100644
--- a/coreutils/nl.c
+++ b/coreutils/nl.c
@@ -58,6 +58,8 @@ int nl_main(int argc UNUSED_PARAM, char **argv)
58 "number-width\0" Required_argument "w" 58 "number-width\0" Required_argument "w"
59 ; 59 ;
60#endif 60#endif
61 int exitcode;
62
61 ns.width = 6; 63 ns.width = 6;
62 ns.start = 1; 64 ns.start = 1;
63 ns.inc = 1; 65 ns.inc = 1;
@@ -72,9 +74,10 @@ int nl_main(int argc UNUSED_PARAM, char **argv)
72 if (!*argv) 74 if (!*argv)
73 *--argv = (char*)"-"; 75 *--argv = (char*)"-";
74 76
77 exitcode = EXIT_SUCCESS;
75 do { 78 do {
76 print_numbered_lines(&ns, *argv); 79 exitcode |= print_numbered_lines(&ns, *argv);
77 } while (*++argv); 80 } while (*++argv);
78 81
79 fflush_stdout_and_exit(EXIT_SUCCESS); 82 fflush_stdout_and_exit(exitcode);
80} 83}
diff --git a/editors/awk.c b/editors/awk.c
index b9c8d2130..8e79d3159 100644
--- a/editors/awk.c
+++ b/editors/awk.c
@@ -1853,6 +1853,8 @@ static void handle_special(var *v)
1853 1853
1854 if (v == intvar[NF]) { 1854 if (v == intvar[NF]) {
1855 n = (int)getvar_i(v); 1855 n = (int)getvar_i(v);
1856 if (n < 0)
1857 syntax_error("NF set to negative value");
1856 fsrealloc(n); 1858 fsrealloc(n);
1857 1859
1858 /* recalculate $0 */ 1860 /* recalculate $0 */
diff --git a/editors/vi.c b/editors/vi.c
index 05d30f2ff..57fac59ad 100644
--- a/editors/vi.c
+++ b/editors/vi.c
@@ -255,8 +255,8 @@ enum {
255 YANKDEL = TRUE, 255 YANKDEL = TRUE,
256 FORWARD = 1, // code depends on "1" for array index 256 FORWARD = 1, // code depends on "1" for array index
257 BACK = -1, // code depends on "-1" for array index 257 BACK = -1, // code depends on "-1" for array index
258 LIMITED = 0, // how much of text[] in char_search 258 LIMITED = 0, // char_search() only current line
259 FULL = 1, // how much of text[] in char_search 259 FULL = 1, // char_search() to the end/beginning of entire text
260 260
261 S_BEFORE_WS = 1, // used in skip_thing() for moving "dot" 261 S_BEFORE_WS = 1, // used in skip_thing() for moving "dot"
262 S_TO_WS = 2, // used in skip_thing() for moving "dot" 262 S_TO_WS = 2, // used in skip_thing() for moving "dot"
@@ -563,7 +563,7 @@ static void indicate_error(void); // use flash or beep to indicate error
563static void Hit_Return(void); 563static void Hit_Return(void);
564 564
565#if ENABLE_FEATURE_VI_SEARCH 565#if ENABLE_FEATURE_VI_SEARCH
566static char *char_search(char *, const char *, int, int); // search for pattern starting at p 566static char *char_search(char *, const char *, int); // search for pattern starting at p
567#endif 567#endif
568#if ENABLE_FEATURE_VI_COLON 568#if ENABLE_FEATURE_VI_COLON
569static char *get_one_address(char *, int *); // get colon addr, if present 569static char *get_one_address(char *, int *); // get colon addr, if present
@@ -940,7 +940,7 @@ static char *get_one_address(char *p, int *addr) // get colon addr, if present
940 p = q; 940 p = q;
941 if (*p == '/') 941 if (*p == '/')
942 p++; 942 p++;
943 q = char_search(dot, pat, FORWARD, FULL); 943 q = char_search(dot, pat, (FORWARD << 1) | FULL);
944 if (q != NULL) { 944 if (q != NULL) {
945 *addr = count_lines(text, q); 945 *addr = count_lines(text, q);
946 } 946 }
@@ -1444,7 +1444,7 @@ static void colon(char *buf)
1444 char *ls = q; // orig line start 1444 char *ls = q; // orig line start
1445 char *found; 1445 char *found;
1446 vc4: 1446 vc4:
1447 found = char_search(q, F, FORWARD, LIMITED); // search cur line only for "find" 1447 found = char_search(q, F, (FORWARD << 1) | LIMITED); // search cur line only for "find"
1448 if (found) { 1448 if (found) {
1449 uintptr_t bias; 1449 uintptr_t bias;
1450 // we found the "find" pattern - delete it 1450 // we found the "find" pattern - delete it
@@ -1897,13 +1897,14 @@ static char *new_screen(int ro, int co)
1897# if ENABLE_FEATURE_VI_REGEX_SEARCH 1897# if ENABLE_FEATURE_VI_REGEX_SEARCH
1898 1898
1899// search for pattern starting at p 1899// search for pattern starting at p
1900static char *char_search(char *p, const char *pat, int dir, int range) 1900static char *char_search(char *p, const char *pat, int dir_and_range)
1901{ 1901{
1902 struct re_pattern_buffer preg; 1902 struct re_pattern_buffer preg;
1903 const char *err; 1903 const char *err;
1904 char *q; 1904 char *q;
1905 int i; 1905 int i;
1906 int size; 1906 int size;
1907 int range;
1907 1908
1908 re_syntax_options = RE_SYNTAX_POSIX_EXTENDED; 1909 re_syntax_options = RE_SYNTAX_POSIX_EXTENDED;
1909 if (ignorecase) 1910 if (ignorecase)
@@ -1916,10 +1917,16 @@ static char *char_search(char *p, const char *pat, int dir, int range)
1916 return p; 1917 return p;
1917 } 1918 }
1918 1919
1919 // assume a LIMITED forward search 1920 range = (dir_and_range & 1);
1920 q = end - 1; 1921 q = end - 1; // if FULL
1921 if (dir == BACK) 1922 if (range == LIMITED)
1923 q = next_line(p);
1924 if (dir_and_range < 0) { // BACK?
1922 q = text; 1925 q = text;
1926 if (range == LIMITED)
1927 q = prev_line(p);
1928 }
1929
1923 // RANGE could be negative if we are searching backwards 1930 // RANGE could be negative if we are searching backwards
1924 range = q - p; 1931 range = q - p;
1925 q = p; 1932 q = p;
@@ -1942,7 +1949,7 @@ static char *char_search(char *p, const char *pat, int dir, int range)
1942 regfree(&preg); 1949 regfree(&preg);
1943 if (i < 0) 1950 if (i < 0)
1944 return NULL; 1951 return NULL;
1945 if (dir == FORWARD) 1952 if (dir_and_range > 0) // FORWARD?
1946 p = p + i; 1953 p = p + i;
1947 else 1954 else
1948 p = p - i; 1955 p = p - i;
@@ -1963,13 +1970,15 @@ static int mycmp(const char *s1, const char *s2, int len)
1963# define mycmp strncmp 1970# define mycmp strncmp
1964# endif 1971# endif
1965 1972
1966static char *char_search(char *p, const char *pat, int dir, int range) 1973static char *char_search(char *p, const char *pat, int dir_and_range)
1967{ 1974{
1968 char *start, *stop; 1975 char *start, *stop;
1969 int len; 1976 int len;
1977 int range;
1970 1978
1971 len = strlen(pat); 1979 len = strlen(pat);
1972 if (dir == FORWARD) { 1980 range = (dir_and_range & 1);
1981 if (dir_and_range > 0) { //FORWARD?
1973 stop = end - 1; // assume range is p..end-1 1982 stop = end - 1; // assume range is p..end-1
1974 if (range == LIMITED) 1983 if (range == LIMITED)
1975 stop = next_line(p); // range is to next line 1984 stop = next_line(p); // range is to next line
@@ -1978,7 +1987,7 @@ static char *char_search(char *p, const char *pat, int dir, int range)
1978 return start; 1987 return start;
1979 } 1988 }
1980 } 1989 }
1981 } else if (dir == BACK) { 1990 } else { //BACK
1982 stop = text; // assume range is text..p 1991 stop = text; // assume range is text..p
1983 if (range == LIMITED) 1992 if (range == LIMITED)
1984 stop = prev_line(p); // range is to prev line 1993 stop = prev_line(p); // range is to prev line
@@ -2357,7 +2366,7 @@ static void undo_push(char *src, unsigned int length, uint8_t u_type) // Add to
2357 // Allocate a new undo object 2366 // Allocate a new undo object
2358 if (u_type == UNDO_DEL || u_type == UNDO_DEL_CHAIN) { 2367 if (u_type == UNDO_DEL || u_type == UNDO_DEL_CHAIN) {
2359 // For UNDO_DEL objects, save deleted text 2368 // For UNDO_DEL objects, save deleted text
2360 if ((src + length) == end) 2369 if ((text + length) == end)
2361 length--; 2370 length--;
2362 // If this deletion empties text[], strip the newline. When the buffer becomes 2371 // If this deletion empties text[], strip the newline. When the buffer becomes
2363 // zero-length, a newline is added back, which requires this to compensate. 2372 // zero-length, a newline is added back, which requires this to compensate.
@@ -3865,7 +3874,7 @@ static void do_cmd(int c)
3865 p = dot - 1; 3874 p = dot - 1;
3866 } 3875 }
3867 dc4: 3876 dc4:
3868 q = char_search(p, last_search_pattern + 1, dir, FULL); 3877 q = char_search(p, last_search_pattern + 1, (dir << 1) | FULL);
3869 if (q != NULL) { 3878 if (q != NULL) {
3870 dot = q; // good search, update "dot" 3879 dot = q; // good search, update "dot"
3871 msg = NULL; 3880 msg = NULL;
@@ -3876,7 +3885,7 @@ static void do_cmd(int c)
3876 if (dir == BACK) { 3885 if (dir == BACK) {
3877 p = end - 1; 3886 p = end - 1;
3878 } 3887 }
3879 q = char_search(p, last_search_pattern + 1, dir, FULL); 3888 q = char_search(p, last_search_pattern + 1, (dir << 1) | FULL);
3880 if (q != NULL) { // found something 3889 if (q != NULL) { // found something
3881 dot = q; // found new pattern- goto it 3890 dot = q; // found new pattern- goto it
3882 msg = "search hit BOTTOM, continuing at TOP"; 3891 msg = "search hit BOTTOM, continuing at TOP";
@@ -3892,13 +3901,13 @@ static void do_cmd(int c)
3892 } while (--cmdcnt > 0); 3901 } while (--cmdcnt > 0);
3893 break; 3902 break;
3894 case '{': // {- move backward paragraph 3903 case '{': // {- move backward paragraph
3895 q = char_search(dot, "\n\n", BACK, FULL); 3904 q = char_search(dot, "\n\n", (BACK << 1) | FULL);
3896 if (q != NULL) { // found blank line 3905 if (q != NULL) { // found blank line
3897 dot = next_line(q); // move to next blank line 3906 dot = next_line(q); // move to next blank line
3898 } 3907 }
3899 break; 3908 break;
3900 case '}': // }- move forward paragraph 3909 case '}': // }- move forward paragraph
3901 q = char_search(dot, "\n\n", FORWARD, FULL); 3910 q = char_search(dot, "\n\n", (FORWARD << 1) | FULL);
3902 if (q != NULL) { // found blank line 3911 if (q != NULL) { // found blank line
3903 dot = next_line(q); // move to next blank line 3912 dot = next_line(q); // move to next blank line
3904 } 3913 }
diff --git a/include/libbb.h b/include/libbb.h
index 405c929a2..4ac749fd3 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -1431,7 +1431,7 @@ struct number_state {
1431 const char *empty_str; 1431 const char *empty_str;
1432 smallint all, nonempty; 1432 smallint all, nonempty;
1433}; 1433};
1434void print_numbered_lines(struct number_state *ns, const char *filename) FAST_FUNC; 1434int print_numbered_lines(struct number_state *ns, const char *filename) FAST_FUNC;
1435 1435
1436 1436
1437/* Networking */ 1437/* Networking */
diff --git a/libbb/print_numbered_lines.c b/libbb/print_numbered_lines.c
index 9a8a51440..d6459d7c3 100644
--- a/libbb/print_numbered_lines.c
+++ b/libbb/print_numbered_lines.c
@@ -8,12 +8,16 @@
8 8
9#include "libbb.h" 9#include "libbb.h"
10 10
11void FAST_FUNC print_numbered_lines(struct number_state *ns, const char *filename) 11int FAST_FUNC print_numbered_lines(struct number_state *ns, const char *filename)
12{ 12{
13 FILE *fp = fopen_or_warn_stdin(filename); 13 FILE *fp = fopen_or_warn_stdin(filename);
14 unsigned N = ns->start; 14 unsigned N;
15 char *line; 15 char *line;
16 16
17 if (!fp)
18 return EXIT_FAILURE;
19
20 N = ns->start;
17 while ((line = xmalloc_fgetline(fp)) != NULL) { 21 while ((line = xmalloc_fgetline(fp)) != NULL) {
18 if (ns->all 22 if (ns->all
19 || (ns->nonempty && line[0]) 23 || (ns->nonempty && line[0])
@@ -27,4 +31,6 @@ void FAST_FUNC print_numbered_lines(struct number_state *ns, const char *filenam
27 ns->start = N; 31 ns->start = N;
28 32
29 fclose(fp); 33 fclose(fp);
34
35 return EXIT_SUCCESS;
30} 36}
diff --git a/libbb/process_escape_sequence.c b/libbb/process_escape_sequence.c
index 59d0d3ea8..13022b83e 100644
--- a/libbb/process_escape_sequence.c
+++ b/libbb/process_escape_sequence.c
@@ -37,12 +37,18 @@ char FAST_FUNC bb_process_escape_sequence(const char **ptr)
37 * We treat \2 as a valid octal escape sequence. */ 37 * We treat \2 as a valid octal escape sequence. */
38 do { 38 do {
39 unsigned r; 39 unsigned r;
40#if !WANT_HEX_ESCAPES
41 unsigned d = (unsigned char)(*q) - '0'; 40 unsigned d = (unsigned char)(*q) - '0';
42#else 41#if WANT_HEX_ESCAPES
43 unsigned d = (unsigned char)_tolower(*q) - '0'; 42 if (d >= 10) {
44 if (d >= 10) 43 d = (unsigned char)_tolower(*q) - 'a';
45 d += ('0' - 'a' + 10); 44 //d += 10;
45 /* The above would map 'A'-'F' and 'a'-'f' to 10-15,
46 * however, some chars like '@' would map to 9 < base.
47 * Do not allow that, map invalid chars to N > base:
48 */
49 if ((int)d >= 0)
50 d += 10;
51 }
46#endif 52#endif
47 if (d >= base) { 53 if (d >= base) {
48 if (WANT_HEX_ESCAPES && base == 16) { 54 if (WANT_HEX_ESCAPES && base == 16) {