svn commit: trunk/busybox/miscutils

vda at busybox.net vda at busybox.net
Thu May 31 15:55:03 UTC 2007


Author: vda
Date: 2007-05-31 08:55:03 -0700 (Thu, 31 May 2007)
New Revision: 18713

Log:
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



Modified:
   trunk/busybox/miscutils/less.c


Changeset:
Modified: trunk/busybox/miscutils/less.c
===================================================================
--- trunk/busybox/miscutils/less.c	2007-05-31 15:42:33 UTC (rev 18712)
+++ trunk/busybox/miscutils/less.c	2007-05-31 15:55:03 UTC (rev 18713)
@@ -72,27 +72,6 @@
 	TILDES = 1,
 };
 
-static unsigned max_displayed_line;
-static unsigned width;
-static const char *empty_line_marker = "~";
-
-static char *filename;
-static char **files;
-static unsigned num_files = 1;
-static unsigned current_file = 1;
-static const char **buffer;
-static const char **flines;
-static int cur_fline; /* signed */
-static unsigned max_fline;
-static unsigned max_lineno; /* this one tracks linewrap */
-
-static ssize_t eof_error = 1; /* eof if 0, error if < 0 */
-static char terminated = 1;
-static size_t readpos;
-static size_t readeof;
-/* last position in last line, taking into account tabs */
-static size_t linepos;
-
 /* Command line options */
 enum {
 	FLAG_E = 1,
@@ -104,26 +83,80 @@
 	LESS_STATE_MATCH_BACKWARDS = 1 << 15,
 };
 
+#if !ENABLE_FEATURE_LESS_REGEXP
+enum { pattern_valid = 0 };
+#endif
+
+struct globals {
+	int cur_fline; /* signed */
+	int kbd_fd;  /* fd to get input from */
+/* last position in last line, taking into account tabs */
+	size_t linepos;
+	unsigned max_displayed_line;
+	unsigned max_fline;
+	unsigned max_lineno; /* this one tracks linewrap */
+	unsigned width;
+	ssize_t eof_error; /* eof if 0, error if < 0 */
+	size_t readpos;
+	size_t readeof;
+	const char **buffer;
+	const char **flines;
+	const char *empty_line_marker;
+	unsigned num_files;
+	unsigned current_file;
+	char *filename;
+	char **files;
 #if ENABLE_FEATURE_LESS_MARKS
-static unsigned mark_lines[15][2];
-static unsigned num_marks;
+	unsigned num_marks;
+	unsigned mark_lines[15][2];
 #endif
-
 #if ENABLE_FEATURE_LESS_REGEXP
-static unsigned *match_lines;
-static int match_pos; /* signed! */
-static unsigned num_matches;
-static regex_t pattern;
-static unsigned pattern_valid;
-#else
-enum { pattern_valid = 0 };
+	unsigned *match_lines;
+	int match_pos; /* signed! */
+	unsigned num_matches;
+	regex_t pattern;
+	smallint pattern_valid;
 #endif
+	smallint terminated;
+	struct termios term_orig, term_less;
+};
+#define G (*ptr_to_globals)
+#define cur_fline           (G.cur_fline         )
+#define kbd_fd              (G.kbd_fd            )
+#define linepos             (G.linepos           )
+#define max_displayed_line  (G.max_displayed_line)
+#define max_fline           (G.max_fline         )
+#define max_lineno          (G.max_lineno        )
+#define width               (G.width             )
+#define eof_error           (G.eof_error         )
+#define readpos             (G.readpos           )
+#define readeof             (G.readeof           )
+#define buffer              (G.buffer            )
+#define flines              (G.flines            )
+#define empty_line_marker   (G.empty_line_marker )
+#define num_files           (G.num_files         )
+#define current_file        (G.current_file      )
+#define filename            (G.filename          )
+#define files               (G.files             )
+#define num_marks           (G.num_marks         )
+#define mark_lines          (G.mark_lines        )
+#define match_lines         (G.match_lines       )
+#define match_pos           (G.match_pos         )
+#define num_matches         (G.num_matches       )
+#define pattern             (G.pattern           )
+#define pattern_valid       (G.pattern_valid     )
+#define terminated          (G.terminated        )
+#define term_orig           (G.term_orig         )
+#define term_less           (G.term_less         )
+#define INIT_G() do { \
+		PTR_TO_GLOBALS = xzalloc(sizeof(G)); \
+		empty_line_marker = "~"; \
+		num_files = 1; \
+		current_file = 1; \
+		eof_error = 1; \
+		terminated = 1; \
+	} while (0)
 
-static struct termios term_orig, term_vi;
-
-/* File pointer to get input from */
-static int kbd_fd;
-
 /* Reset terminal input to normal */
 static void set_tty_cooked(void)
 {
@@ -380,12 +413,12 @@
 	}
 }
 
-static char controls[] =
+static const char controls[] =
 	/* NUL: never encountered; TAB: not converted */
 	/**/"\x01\x02\x03\x04\x05\x06\x07\x08"  "\x0a\x0b\x0c\x0d\x0e\x0f"
 	"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
 	"\x7f\x9b"; /* DEL and infamous Meta-ESC :( */
-static char ctrlconv[] =
+static const char ctrlconv[] =
 	/* '\n': it's a former NUL - subst with '@', not 'J' */
 	"\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x40\x4b\x4c\x4d\x4e\x4f"
 	"\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f";
@@ -604,7 +637,7 @@
 		FD_SET(0, &readfds);
 	}
 	FD_SET(kbd_fd, &readfds);
-	tcsetattr(kbd_fd, TCSANOW, &term_vi);
+	tcsetattr(kbd_fd, TCSANOW, &term_less);
 	select(kbd_fd + 1, &readfds, NULL, NULL, NULL);
 
 	input[0] = '\0';
@@ -668,7 +701,7 @@
 
 		/* I be damned if I know why is it needed *repeatedly*,
 		 * but it is needed. Is it because of stdio? */
-		tcsetattr(kbd_fd, TCSANOW, &term_vi);
+		tcsetattr(kbd_fd, TCSANOW, &term_less);
 
 		read(kbd_fd, &c, 1);
 		if (c == 0x0d)
@@ -1244,6 +1277,8 @@
 {
 	int keypress;
 
+	INIT_G();
+
 	/* TODO: -x: do not interpret backspace, -xx: tab also */
 	/* -xxx: newline also */
 	/* -w N: assume width N (-xxx -w 32: hex viewer of sorts) */
@@ -1283,16 +1318,16 @@
 	tcgetattr(kbd_fd, &term_orig);
 	signal(SIGTERM, sig_catcher);
 	signal(SIGINT, sig_catcher);
-	term_vi = term_orig;
-	term_vi.c_lflag &= ~(ICANON | ECHO);
-	term_vi.c_iflag &= ~(IXON | ICRNL);
-	/*term_vi.c_oflag &= ~ONLCR;*/
-	term_vi.c_cc[VMIN] = 1;
-	term_vi.c_cc[VTIME] = 0;
+	term_less = term_orig;
+	term_less.c_lflag &= ~(ICANON | ECHO);
+	term_less.c_iflag &= ~(IXON | ICRNL);
+	/*term_less.c_oflag &= ~ONLCR;*/
+	term_less.c_cc[VMIN] = 1;
+	term_less.c_cc[VTIME] = 0;
 
 	/* Want to do it just once, but it doesn't work, */
 	/* so we are redoing it (see code above). Mystery... */
-	/*tcsetattr(kbd_fd, TCSANOW, &term_vi);*/
+	/*tcsetattr(kbd_fd, TCSANOW, &term_less);*/
 
 	reinitialize();
 	while (1) {




More information about the busybox-cvs mailing list