Ignore:
Timestamp:
Nov 13, 2006, 2:02:05 AM (16 years ago)
Author:
Sam Hocevar
Message:
  • Support for ANSI escape codes in the input:

http://zoy.org/~sam/toilet-ansi.png
http://zoy.org/~sam/toilet-ansi2.png

  • Empty lines are currently broken.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • toilet/trunk/src/render.c

    r1376 r1385  
    4747int render_stdin(context_t *cx)
    4848{
    49     char buf[10];
    50     unsigned int i = 0, len;
    51     uint32_t ch;
     49    cucul_canvas_t *cv;
     50    char *line;
     51    unsigned int i, len;
     52
     53    /* FIXME: we can't read longer lines */
     54    len = 1024;
     55    line = malloc(len);
     56    cv = cucul_create_canvas(0, 0);
    5257
    5358    /* Read from stdin */
    5459    while(!feof(stdin))
    5560    {
    56         buf[i++] = getchar();
    57         buf[i] = '\0';
     61        if(!fgets(line, len, stdin))
     62            break;
    5863
    59         ch = cucul_utf8_to_utf32(buf, &len);
     64        cucul_set_canvas_size(cv, 0, 0);
     65        cucul_import_memory(cv, line, strlen(line), "utf8");
     66        for(i = 0; i < cucul_get_canvas_width(cv); i++)
     67        {
     68            uint32_t ch = cucul_get_char(cv, i, 0);
     69            uint32_t at = cucul_get_attr(cv, i, 0);
     70            cx->feed(cx, ch, at);
     71            if(cucul_utf32_is_fullwidth(ch)) i++;
     72        }
    6073
    61         if(!len)
    62             continue;
     74        render_flush(cx);
     75    }
    6376
    64         cx->feed(cx, ch);
    65         i = 0;
    66 
    67         if(ch == '\n')
    68             render_flush(cx);
    69     }
     77    free(line);
    7078
    7179    return 0;
     
    7482int render_list(context_t *cx, unsigned int argc, char *argv[])
    7583{
    76     unsigned int i, j;
     84    cucul_canvas_t *cv;
     85    unsigned int i, j, len;
     86    char *parser = NULL;
    7787
    78     for(i = 0; i < argc; i++)
     88    cv = cucul_create_canvas(0, 0);
     89
     90    for(j = 0; j < argc; )
    7991    {
    80         /* Read from commandline */
    81         unsigned int len;
     92        char *cr;
    8293
    83         if(i)
    84             cx->feed(cx, ' ');
     94        if(!parser)
     95        {
     96            if(j)
     97                cx->feed(cx, ' ', 0);
     98            parser = argv[j];
     99        }
    85100
    86         for(j = 0; argv[i][j];)
     101        cr = strchr(parser, '\n');
     102        if(cr)
     103            len = (cr - parser) + 1;
     104        else
     105            len = strlen(parser);
     106
     107        cucul_set_canvas_size(cv, 0, 0);
     108        cucul_import_memory(cv, parser, len, "utf8");
     109        for(i = 0; i < cucul_get_canvas_width(cv); i++)
    87110        {
    88             cx->feed(cx, cucul_utf8_to_utf32(argv[i] + j, &len));
    89             j += len;
     111            uint32_t ch = cucul_get_char(cv, i, 0);
     112            uint32_t at = cucul_get_attr(cv, i, 0);
     113            cx->feed(cx, ch, at);
     114            if(cucul_utf32_is_fullwidth(ch)) i++;
     115        }
     116
     117        if(cr)
     118        {
     119            parser += len;
     120            render_flush(cx);
     121        }
     122        else
     123        {
     124            parser = NULL;
     125            j++;
    90126        }
    91127    }
Note: See TracChangeset for help on using the changeset viewer.