# HG changeset patch # User Space Falcon # Date 1441622120 0 # Node ID 7a189b7bbd67700c9a173855da6cfd4cf7a85982 # Parent 69623c4cbf6cf1c42e8a2e1df97c5dfbf461081f lcdemu: input processing implemented, compiles diff -r 69623c4cbf6c -r 7a189b7bbd67 lcdemu/process.c --- a/lcdemu/process.c Mon Sep 07 10:18:39 2015 +0000 +++ b/lcdemu/process.c Mon Sep 07 10:35:20 2015 +0000 @@ -3,6 +3,7 @@ */ #include +#include #include #include #include @@ -12,6 +13,80 @@ #include #include "globals.h" +#define MAX_WIDTH 176 + +static unsigned +hexdecode(str) + char *str; +{ + unsigned accum = 0; + int i, c, n; + + for (i = 0; i < 4; i++) { + c = str[i]; + if (isdigit(c)) + n = c - '0'; + else if (isupper(c)) + n = c - 'A' + 10; + else + n = c - 'a' + 10; + accum <<= 4; + accum |= n; + } + return(accum); +} + +process_input_line(line) + char *line; +{ + int blitrow, blitcol, npix; + uint16_t pix16[MAX_WIDTH]; + char *cp; + XImage *xi; + + for (cp = line; isspace(*cp); cp++) + ; + if (!isdigit(*cp)) { +inv: fprintf(stderr, "fc-lcdemu: invalid input line\n"); + exit(1); + } + blitrow = atoi(cp); + while (isdigit(*cp)) + cp++; + if (!isspace(*cp)) + goto inv; + while (isspace(*cp)) + cp++; + if (!isdigit(*cp)) + goto inv; + blitcol = atoi(cp); + while (isdigit(*cp)) + cp++; + if (!isspace(*cp)) + goto inv; + while (isspace(*cp)) + cp++; + if (!isxdigit(*cp)) + goto inv; + for (npix = 0; *cp; ) { + if (!isxdigit(cp[0]) || !isxdigit(cp[1]) || + !isxdigit(cp[2]) || !isxdigit(cp[3])) + goto inv; + if (npix >= MAX_WIDTH) { + fprintf(stderr, + "fc-lcdemu error: input line exceeds MAX_WIDTH of %d pixels\n", + MAX_WIDTH); + exit(1); + } + pix16[npix++] = hexdecode(cp); + cp += 4; + } + xi = convert_function(pix16, npix); + XPutImage(mydisplay, mainwindow, mainwingc, xi, 0, 0, blitcol, blitrow, + npix, 1); + XDestroyImage(xi); +} + input_on_stdin(inbuf, incount) char *inbuf; { @@ -31,9 +106,3 @@ linebuf[linesz++] = *cp; } } - -process_input_line(line) - char *line; -{ - printf("Got input line: %s\n", line); -} diff -r 69623c4cbf6c -r 7a189b7bbd67 lcdemu/ximage.c --- a/lcdemu/ximage.c Mon Sep 07 10:18:39 2015 +0000 +++ b/lcdemu/ximage.c Mon Sep 07 10:35:20 2015 +0000 @@ -52,7 +52,7 @@ break; default: fprintf(stderr, -"error: fc-ledemu has not been adapted for X11 depth != 24, yours is %d\n", +"error: fc-lcdemu has not been adapted for X11 depth != 24, yours is %d\n", display_depth); exit(1); }