aboutsummaryrefslogtreecommitdiff
path: root/miscutils/less.c
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-05-31 15:55:03 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-05-31 15:55:03 +0000
commita1d24a0b6e18352930701bdff68c7f88e474c4cf (patch)
tree6ec43100b42c3fb66eb5997158b49abbc3cf3a90 /miscutils/less.c
parent199c0d542b51b55b99dddc1742c23325288f79eb (diff)
downloadbusybox-w32-a1d24a0b6e18352930701bdff68c7f88e474c4cf.tar.gz
busybox-w32-a1d24a0b6e18352930701bdff68c7f88e474c4cf.tar.bz2
busybox-w32-a1d24a0b6e18352930701bdff68c7f88e474c4cf.zip
less: stop using data/bss. Code got smaller too.
# size busybox_old busybox_unstripped text data bss dec hex filename 700719 2896 17880 721495 b0257 busybox_old 700547 2832 17432 720811 affab busybox_unstripped # size */*/less.o text data bss dec hex filename 6861 50 344 7255 1c57 busybox.t0/miscutils/less.o 6657 0 0 6657 1a01 busybox.t1/miscutils/less.o
Diffstat (limited to 'miscutils/less.c')
-rw-r--r--miscutils/less.c129
1 files changed, 82 insertions, 47 deletions
diff --git a/miscutils/less.c b/miscutils/less.c
index 3df1f3785..d6b71b9f2 100644
--- a/miscutils/less.c
+++ b/miscutils/less.c
@@ -72,27 +72,6 @@ enum {
72 TILDES = 1, 72 TILDES = 1,
73}; 73};
74 74
75static unsigned max_displayed_line;
76static unsigned width;
77static const char *empty_line_marker = "~";
78
79static char *filename;
80static char **files;
81static unsigned num_files = 1;
82static unsigned current_file = 1;
83static const char **buffer;
84static const char **flines;
85static int cur_fline; /* signed */
86static unsigned max_fline;
87static unsigned max_lineno; /* this one tracks linewrap */
88
89static ssize_t eof_error = 1; /* eof if 0, error if < 0 */
90static char terminated = 1;
91static size_t readpos;
92static size_t readeof;
93/* last position in last line, taking into account tabs */
94static size_t linepos;
95
96/* Command line options */ 75/* Command line options */
97enum { 76enum {
98 FLAG_E = 1, 77 FLAG_E = 1,
@@ -104,25 +83,79 @@ enum {
104 LESS_STATE_MATCH_BACKWARDS = 1 << 15, 83 LESS_STATE_MATCH_BACKWARDS = 1 << 15,
105}; 84};
106 85
107#if ENABLE_FEATURE_LESS_MARKS 86#if !ENABLE_FEATURE_LESS_REGEXP
108static unsigned mark_lines[15][2]; 87enum { pattern_valid = 0 };
109static unsigned num_marks;
110#endif 88#endif
111 89
90struct globals {
91 int cur_fline; /* signed */
92 int kbd_fd; /* fd to get input from */
93/* last position in last line, taking into account tabs */
94 size_t linepos;
95 unsigned max_displayed_line;
96 unsigned max_fline;
97 unsigned max_lineno; /* this one tracks linewrap */
98 unsigned width;
99 ssize_t eof_error; /* eof if 0, error if < 0 */
100 size_t readpos;
101 size_t readeof;
102 const char **buffer;
103 const char **flines;
104 const char *empty_line_marker;
105 unsigned num_files;
106 unsigned current_file;
107 char *filename;
108 char **files;
109#if ENABLE_FEATURE_LESS_MARKS
110 unsigned num_marks;
111 unsigned mark_lines[15][2];
112#endif
112#if ENABLE_FEATURE_LESS_REGEXP 113#if ENABLE_FEATURE_LESS_REGEXP
113static unsigned *match_lines; 114 unsigned *match_lines;
114static int match_pos; /* signed! */ 115 int match_pos; /* signed! */
115static unsigned num_matches; 116 unsigned num_matches;
116static regex_t pattern; 117 regex_t pattern;
117static unsigned pattern_valid; 118 smallint pattern_valid;
118#else
119enum { pattern_valid = 0 };
120#endif 119#endif
121 120 smallint terminated;
122static struct termios term_orig, term_vi; 121 struct termios term_orig, term_less;
123 122};
124/* File pointer to get input from */ 123#define G (*ptr_to_globals)
125static int kbd_fd; 124#define cur_fline (G.cur_fline )
125#define kbd_fd (G.kbd_fd )
126#define linepos (G.linepos )
127#define max_displayed_line (G.max_displayed_line)
128#define max_fline (G.max_fline )
129#define max_lineno (G.max_lineno )
130#define width (G.width )
131#define eof_error (G.eof_error )
132#define readpos (G.readpos )
133#define readeof (G.readeof )
134#define buffer (G.buffer )
135#define flines (G.flines )
136#define empty_line_marker (G.empty_line_marker )
137#define num_files (G.num_files )
138#define current_file (G.current_file )
139#define filename (G.filename )
140#define files (G.files )
141#define num_marks (G.num_marks )
142#define mark_lines (G.mark_lines )
143#define match_lines (G.match_lines )
144#define match_pos (G.match_pos )
145#define num_matches (G.num_matches )
146#define pattern (G.pattern )
147#define pattern_valid (G.pattern_valid )
148#define terminated (G.terminated )
149#define term_orig (G.term_orig )
150#define term_less (G.term_less )
151#define INIT_G() do { \
152 PTR_TO_GLOBALS = xzalloc(sizeof(G)); \
153 empty_line_marker = "~"; \
154 num_files = 1; \
155 current_file = 1; \
156 eof_error = 1; \
157 terminated = 1; \
158 } while (0)
126 159
127/* Reset terminal input to normal */ 160/* Reset terminal input to normal */
128static void set_tty_cooked(void) 161static void set_tty_cooked(void)
@@ -380,12 +413,12 @@ static void cap_cur_fline(int nlines)
380 } 413 }
381} 414}
382 415
383static char controls[] = 416static const char controls[] =
384 /* NUL: never encountered; TAB: not converted */ 417 /* NUL: never encountered; TAB: not converted */
385 /**/"\x01\x02\x03\x04\x05\x06\x07\x08" "\x0a\x0b\x0c\x0d\x0e\x0f" 418 /**/"\x01\x02\x03\x04\x05\x06\x07\x08" "\x0a\x0b\x0c\x0d\x0e\x0f"
386 "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f" 419 "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
387 "\x7f\x9b"; /* DEL and infamous Meta-ESC :( */ 420 "\x7f\x9b"; /* DEL and infamous Meta-ESC :( */
388static char ctrlconv[] = 421static const char ctrlconv[] =
389 /* '\n': it's a former NUL - subst with '@', not 'J' */ 422 /* '\n': it's a former NUL - subst with '@', not 'J' */
390 "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x40\x4b\x4c\x4d\x4e\x4f" 423 "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x40\x4b\x4c\x4d\x4e\x4f"
391 "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"; 424 "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f";
@@ -604,7 +637,7 @@ static void getch_nowait(char* input, int sz)
604 FD_SET(0, &readfds); 637 FD_SET(0, &readfds);
605 } 638 }
606 FD_SET(kbd_fd, &readfds); 639 FD_SET(kbd_fd, &readfds);
607 tcsetattr(kbd_fd, TCSANOW, &term_vi); 640 tcsetattr(kbd_fd, TCSANOW, &term_less);
608 select(kbd_fd + 1, &readfds, NULL, NULL, NULL); 641 select(kbd_fd + 1, &readfds, NULL, NULL, NULL);
609 642
610 input[0] = '\0'; 643 input[0] = '\0';
@@ -668,7 +701,7 @@ static char* less_gets(int sz)
668 701
669 /* I be damned if I know why is it needed *repeatedly*, 702 /* I be damned if I know why is it needed *repeatedly*,
670 * but it is needed. Is it because of stdio? */ 703 * but it is needed. Is it because of stdio? */
671 tcsetattr(kbd_fd, TCSANOW, &term_vi); 704 tcsetattr(kbd_fd, TCSANOW, &term_less);
672 705
673 read(kbd_fd, &c, 1); 706 read(kbd_fd, &c, 1);
674 if (c == 0x0d) 707 if (c == 0x0d)
@@ -1244,6 +1277,8 @@ int less_main(int argc, char **argv)
1244{ 1277{
1245 int keypress; 1278 int keypress;
1246 1279
1280 INIT_G();
1281
1247 /* TODO: -x: do not interpret backspace, -xx: tab also */ 1282 /* TODO: -x: do not interpret backspace, -xx: tab also */
1248 /* -xxx: newline also */ 1283 /* -xxx: newline also */
1249 /* -w N: assume width N (-xxx -w 32: hex viewer of sorts) */ 1284 /* -w N: assume width N (-xxx -w 32: hex viewer of sorts) */
@@ -1283,16 +1318,16 @@ int less_main(int argc, char **argv)
1283 tcgetattr(kbd_fd, &term_orig); 1318 tcgetattr(kbd_fd, &term_orig);
1284 signal(SIGTERM, sig_catcher); 1319 signal(SIGTERM, sig_catcher);
1285 signal(SIGINT, sig_catcher); 1320 signal(SIGINT, sig_catcher);
1286 term_vi = term_orig; 1321 term_less = term_orig;
1287 term_vi.c_lflag &= ~(ICANON | ECHO); 1322 term_less.c_lflag &= ~(ICANON | ECHO);
1288 term_vi.c_iflag &= ~(IXON | ICRNL); 1323 term_less.c_iflag &= ~(IXON | ICRNL);
1289 /*term_vi.c_oflag &= ~ONLCR;*/ 1324 /*term_less.c_oflag &= ~ONLCR;*/
1290 term_vi.c_cc[VMIN] = 1; 1325 term_less.c_cc[VMIN] = 1;
1291 term_vi.c_cc[VTIME] = 0; 1326 term_less.c_cc[VTIME] = 0;
1292 1327
1293 /* Want to do it just once, but it doesn't work, */ 1328 /* Want to do it just once, but it doesn't work, */
1294 /* so we are redoing it (see code above). Mystery... */ 1329 /* so we are redoing it (see code above). Mystery... */
1295 /*tcsetattr(kbd_fd, TCSANOW, &term_vi);*/ 1330 /*tcsetattr(kbd_fd, TCSANOW, &term_less);*/
1296 1331
1297 reinitialize(); 1332 reinitialize();
1298 while (1) { 1333 while (1) {