[git commit master 1/1] conspy: code shrink
Pascal Bellard
pascal.bellard at ads-lu.com
Tue Jun 29 13:05:11 UTC 2010
Hello,
Another shrink (106 bytes).
-pascal
> commit:
> http://git.busybox.net/busybox/commit/?id=ff37799dfe0e6e8fb9b971a2aeb4076d8a3784ec
> branch: http://git.busybox.net/busybox/commit/?id=refs/heads/master
>
> function old new delta
> conspy_main 1446 1444 -2
> screen_read_close 114 108 -6
> screen_char 299 293 -6
>
> Signed-off-by: Pascal Bellard <pascal.bellard at ads-lu.com>
> Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
> ---
> include/usage.src.h | 10 ----
> init/bootchartd.c | 31 ++++++-------
> miscutils/conspy.c | 123
> ++++++++++++++++++++++++++-------------------------
> 3 files changed, 78 insertions(+), 86 deletions(-)
>
> diff --git a/include/usage.src.h b/include/usage.src.h
> index 6d17ab5..53ee794 100644
> --- a/include/usage.src.h
> +++ b/include/usage.src.h
> @@ -163,16 +163,6 @@ INSERT
> #define blkid_full_usage "\n\n" \
> "Print UUIDs of all filesystems"
>
> -#define bootchartd_trivial_usage \
> - "start [PROG ARGS]|stop|init"
> -#define bootchartd_full_usage "\n\n" \
> - "Create /var/log/bootchart.tgz with boot chart data\n" \
> - "\nOptions:" \
> - "\nstart: start background logging; with PROG, run PROG, then kill
> logging with USR1" \
> - "\nstop: send USR1 to all bootchartd processes" \
> - "\ninit: start background logging; stop when getty/xdm is seen (for
> init scripts)" \
> - "\nUnder PID 1: as init, then exec $bootchart_init, /init,
> /sbin/init" \
> -
> #define brctl_trivial_usage \
> "COMMAND [BRIDGE [INTERFACE]]"
> #define brctl_full_usage "\n\n" \
> diff --git a/init/bootchartd.c b/init/bootchartd.c
> index f7de13e..4e15da4 100644
> --- a/init/bootchartd.c
> +++ b/init/bootchartd.c
> @@ -156,7 +156,7 @@ static int dump_procs(FILE *fp, int
> look_for_login_process)
> continue;
> p++;
> strchrnul(p, ')')[0] = '\0';
> - /* If is gdm, kdm or a getty? */
> + /* Is it gdm, kdm or a getty? */
> if (((p[0] == 'g' || p[0] == 'k' || p[0] == 'x') && p[1] == 'd' &&
> p[2] == 'm')
> || strstr(p, "getty")
> ) {
> @@ -258,13 +258,12 @@ static void finalize(char *tempdir, const char
> *prog)
> fprintf(header_fp, "profile.process = %s\n", prog);
>
> fputs("version = "BC_VERSION_STR"\n", header_fp);
> -
> if (ENABLE_FEATURE_BOOTCHARTD_BLOATED_HEADER) {
> char *hostname;
> char *kcmdline;
> time_t t;
> struct tm tm_time;
> - /* x2 for possible localized data */
> + /* x2 for possible localized weekday/month names */
> char date_buf[sizeof("Mon Jun 21 05:29:03 CEST 2010") * 2];
> struct utsname unamebuf;
>
> @@ -313,16 +312,16 @@ static void finalize(char *tempdir, const char
> *prog)
> */
> }
>
> -/* Usage:
> - * bootchartd start [PROG ARGS]: start logging in background, USR1 stops
> it.
> - * With PROG, runs PROG, then kills background logging.
> - * bootchartd stop: same as "killall -USR1 bootchartd"
> - * bootchartd init: start logging in background
> - * Stop when getty/gdm is seen (if AUTO_STOP_LOGGER = yes).
> - * Meant to be used from init scripts.
> - * bootchartd (pid==1): as init, but then execs $bootchart_init, /init,
> /sbin/init
> - * Meant to be used as kernel's init process.
> - */
> +//usage:#define bootchartd_trivial_usage
> +//usage: "start [PROG ARGS]|stop|init"
> +//usage:#define bootchartd_full_usage "\n\n"
> +//usage: "Create /var/log/bootchart.tgz with boot chart data\n"
> +//usage: "\nOptions:"
> +//usage: "\nstart: start background logging; with PROG, run PROG,
> then kill logging with USR1"
> +//usage: "\nstop: send USR1 to all bootchartd processes"
> +//usage: "\ninit: start background logging; stop when getty/xdm is
> seen (for init scripts)"
> +//usage: "\nUnder PID 1: as init, then exec $bootchart_init, /init,
> /sbin/init"
> +
> int bootchartd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
> int bootchartd_main(int argc UNUSED_PARAM, char **argv)
> {
> @@ -358,7 +357,7 @@ int bootchartd_main(int argc UNUSED_PARAM, char
> **argv)
> cmd = CMD_PID1;
> }
>
> - /* Here we are in START or INIT state */
> + /* Here we are in START, INIT or CMD_PID1 state */
>
> /* Read config file: */
> sample_period_us = 200 * 1000;
> @@ -422,7 +421,7 @@ int bootchartd_main(int argc UNUSED_PARAM, char
> **argv)
> execl(bootchart_init, bootchart_init, NULL);
> execl("/init", "init", NULL);
> execl("/sbin/init", "init", NULL);
> - bb_perror_msg_and_die("can't exec '%s'", "/sbin/init");
> + bb_perror_msg_and_die("can't execute '%s'", "/sbin/init");
> }
>
> if (cmd == CMD_START && argv[2]) { /* "start PROG ARGS" */
> @@ -432,7 +431,7 @@ int bootchartd_main(int argc UNUSED_PARAM, char
> **argv)
> if (pid == 0) { /* child */
> argv += 2;
> execvp(argv[0], argv);
> - bb_perror_msg_and_die("can't exec '%s'", argv[0]);
> + bb_perror_msg_and_die("can't execute '%s'", argv[0]);
> }
> /* parent */
> waitpid(pid, NULL, 0);
> diff --git a/miscutils/conspy.c b/miscutils/conspy.c
> index 11105f0..6f2f025 100644
> --- a/miscutils/conspy.c
> +++ b/miscutils/conspy.c
> @@ -56,31 +56,33 @@ struct globals {
> int size;
> int x, y;
> int kbd_fd;
> - unsigned width;
> - unsigned height;
> - unsigned col;
> - unsigned line;
> + int vcsa_fd;
> int ioerror_count;
> int key_count;
> int escape_count;
> int nokeys;
> int current;
> - int vcsa_fd;
> - uint16_t last_attr;
> - uint8_t last_bold;
> - uint8_t last_blink;
> - uint8_t last_fg;
> - uint8_t last_bg;
> - char attrbuf[sizeof("\033[0;1;5;30;40m")];
> + // cached local tty parameters
> + unsigned width;
> + unsigned height;
> + unsigned col;
> + unsigned line;
> smallint curoff;
> + uint8_t last_attr;
> + uint8_t force_attr_change;
> + char attrbuf[sizeof("\033[0;1;5;30;40m")];
> + // remote console
> struct screen_info remote;
> + // saved local tty terminfo
> struct termios term_orig;
> };
>
> #define G (*ptr_to_globals)
> #define INIT_G() do { \
> SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \
> - strcpy((char*)&G.last_attr, "\xff\xff\xff\xff\xff\xff" "\033["); \
> + G.attrbuf[0] = '\033'; \
> + G.attrbuf[1] = '['; \
> + G.force_attr_change = 0xff; \
> } while (0)
>
> enum {
> @@ -100,7 +102,6 @@ static void screen_read_close(void)
> char *data = G.data + G.current;
>
> xread(G.vcsa_fd, data, G.size);
> - G.last_attr = 0;
> for (i = 0; i < G.remote.lines; i++) {
> for (j = 0; j < G.remote.cols; j++, NEXT(data)) {
> unsigned x = j - G.x; // if will catch j < G.x too
> @@ -117,9 +118,12 @@ static void screen_read_close(void)
>
> static void screen_char(char *data)
> {
> - uint8_t attr = ATTR(data);
> + if (!BW) {
> + uint8_t attr = ATTR(data);
> + //uint8_t attr = ATTR(data) >> 1; // for framebuffer console
> + uint8_t attr_diff = (G.last_attr ^ attr) | G.force_attr_change;
>
> - if (!BW && G.last_attr != attr) {
> + if (attr_diff) {
> // Attribute layout for VGA compatible text videobuffer:
> // blinking text
> // |red bkgd
> @@ -143,51 +147,49 @@ static void screen_char(char *data)
> // green text
> // blue text
> // text 8th bit
> - // converting RGB color bit triad to BGR:
> - static const char color[8] = "04261537";
> - char *ptr;
> - uint8_t fg, bold, bg, blink;
> -
> - G.last_attr = attr;
> -
> - //attr >>= 1; // for framebuffer console
> - ptr = G.attrbuf + sizeof("\033[")-1;
> - fg = (attr & 0x07);
> - bold = (attr & 0x08);
> - bg = (attr & 0x70);
> - blink = (attr & 0x80);
> - if (G.last_bold > bold || G.last_blink > blink) {
> - G.last_bold = G.last_blink = 0;
> - G.last_bg = 0xff;
> - *ptr++ = '0';
> - *ptr++ = ';';
> - }
> - if (G.last_bold != bold) {
> - G.last_bold = bold;
> - *ptr++ = '1';
> - *ptr++ = ';';
> - }
> - if (G.last_blink != blink) {
> - G.last_blink = blink;
> - *ptr++ = '5';
> - *ptr++ = ';';
> - }
> - if (G.last_fg != fg) {
> - G.last_fg = fg;
> - *ptr++ = '3';
> - *ptr++ = color[fg];
> - *ptr++ = ';';
> - }
> - if (G.last_bg != bg) {
> - G.last_bg = bg;
> - *ptr++ = '4';
> - *ptr++ = color[bg >> 4];
> - *ptr++ = ';';
> - }
> - if (ptr != G.attrbuf + sizeof("\033[")-1) {
> - ptr[-1] = 'm';
> - *ptr = '\0';
> - fputs(G.attrbuf, stdout);
> + // converting RGB color bit triad to BGR:
> + static const char color[8] = "04261537";
> + const uint8_t fg_mask = 0x07, bold_mask = 0x08;
> + const uint8_t bg_mask = 0x70, blink_mask = 0x80;
> + char *ptr;
> +
> + ptr = G.attrbuf + 2; /* skip "ESC [" */
> +
> + // (G.last_attr & ~attr) has 1 only where
> + // G.last_attr has 1 but attr has 0.
> + // Here we check whether we have transition
> + // bold->non-bold or blink->non-blink:
> + if ((G.last_attr & ~attr) & (bold_mask | blink_mask)) {
> + *ptr++ = '0'; // "reset all attrs"
> + *ptr++ = ';';
> + // must set fg & bg, maybe need to set bold or blink:
> + attr_diff = attr | ~(bold_mask | blink_mask);
> + }
> + G.force_attr_change = 0;
> + G.last_attr = attr;
> + if (attr_diff & bold_mask) {
> + *ptr++ = '1';
> + *ptr++ = ';';
> + }
> + if (attr_diff & blink_mask) {
> + *ptr++ = '5';
> + *ptr++ = ';';
> + }
> + if (attr_diff & fg_mask) {
> + *ptr++ = '3';
> + *ptr++ = color[attr & fg_mask];
> + *ptr++ = ';';
> + }
> + if (attr_diff & bg_mask) {
> + *ptr++ = '4';
> + *ptr++ = color[(attr & bg_mask) >> 4];
> + *ptr++ = ';';
> + }
> + if (ptr != G.attrbuf + 2) {
> + ptr[-1] = 'm';
> + *ptr = '\0';
> + fputs(G.attrbuf, stdout);
> + }
> }
> }
> putchar(CHAR(data));
> @@ -402,6 +404,7 @@ int conspy_main(int argc UNUSED_PARAM, char **argv)
> termbuf.c_cc[VMIN] = 1;
> termbuf.c_cc[VTIME] = 0;
> tcsetattr(G.kbd_fd, TCSANOW, &termbuf);
> +
> poll_timeout_ms = 250;
> while (1) {
> struct pollfd pfd;
> --
> 1.7.1
>
> _______________________________________________
> busybox-cvs mailing list
> busybox-cvs at busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox-cvs
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: conspy.u
Type: application/octet-stream
Size: 8977 bytes
Desc: not available
URL: <http://lists.busybox.net/pipermail/busybox/attachments/20100629/d4d0fe33/attachment.obj>
More information about the busybox
mailing list