URI: 
       Add MC for a single line - st - simple terminal
  HTML git clone https://git.parazyd.org/st
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit cf332a325dafe7e9ed6d87df9dcec29149c5042c
   DIR parent 1f0d981bd7a1450ddfae3591c6e457253b3a6842
  HTML Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
       Date:   Fri, 31 Jan 2014 21:53:53 +0100
       
       Add MC for a single line
       
       This sequence print the current line. It is different to the
       'printer on' sequence, where all the characters that arrive to the
       terminal are printer. Here only the ascii characters are printed.
       
       Diffstat:
         M st.c                                |      41 ++++++++++++++++++++++++-------
       
       1 file changed, 32 insertions(+), 9 deletions(-)
       ---
   DIR diff --git a/st.c b/st.c
       @@ -356,6 +356,8 @@ static void strparse(void);
        static void strreset(void);
        
        static int tattrset(int);
       +static void tprinter(char *s, size_t len);
       +static void tdumpline(int);
        static void tclearregion(int, int, int, int);
        static void tcursor(int);
        static void tdeletechar(int);
       @@ -470,7 +472,7 @@ static STREscape strescseq;
        static int cmdfd;
        static pid_t pid;
        static Selection sel;
       -static int iofd;
       +static int iofd = STDOUT_FILENO;
        static char **opt_cmd = NULL;
        static char *opt_io = NULL;
        static char *opt_title = NULL;
       @@ -1985,6 +1987,8 @@ csihandle(void) {
                        switch(csiescseq.arg[0]) {
                        case 0:
                        case 1:
       +                        tdumpline(term.c.y);
       +                        break;
                        case 4:
                                term.mode &= ~MODE_PRINT;
                                break;
       @@ -2266,6 +2270,31 @@ strreset(void) {
        }
        
        void
       +tprinter(char *s, size_t len) {
       +        if(iofd != -1 && xwrite(iofd, s, len) < 0) {
       +                fprintf(stderr, "Error writing in %s:%s\n",
       +                        opt_io, strerror(errno));
       +                close(iofd);
       +                iofd = -1;
       +        }
       +}
       +
       +void
       +tdumpline(int n) {
       +        Glyph *bp, *end;
       +
       +        bp = &term.line[n][0];
       +        end = &bp[term.col-1];
       +        while(end > bp && !strcmp(" ", end->c))
       +                --end;
       +        if(bp != end || strcmp(bp->c, " ")) {
       +                for( ;bp <= end; ++bp)
       +                        tprinter(bp->c, strlen(bp->c));
       +        }
       +        tprinter("\n", 1);
       +}
       +
       +void
        tputtab(bool forward) {
                uint x = term.c.x;
        
       @@ -2346,14 +2375,8 @@ tputc(char *c, int len) {
                        width = wcwidth(u8char);
                }
        
       -        if(IS_SET(MODE_PRINT) && iofd != -1) {
       -                if(xwrite(iofd, c, len) < 0) {
       -                        fprintf(stderr, "Error writing in %s:%s\n",
       -                                opt_io, strerror(errno));
       -                        close(iofd);
       -                        iofd = -1;
       -                }
       -        }
       +        if(IS_SET(MODE_PRINT))
       +                tprinter(c, len);
        
                /*
                 * STR sequences must be checked before anything else