comparison lcdemu/process.c @ 907:7a189b7bbd67

lcdemu: input processing implemented, compiles
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 07 Sep 2015 10:35:20 +0000
parents 841982f31be3
children
comparison
equal deleted inserted replaced
906:69623c4cbf6c 907:7a189b7bbd67
1 /* 1 /*
2 * Processing of LCD output (input to us) 2 * Processing of LCD output (input to us)
3 */ 3 */
4 4
5 #include <stdio.h> 5 #include <stdio.h>
6 #include <stdint.h>
6 #include <stdlib.h> 7 #include <stdlib.h>
7 #include <ctype.h> 8 #include <ctype.h>
8 #include <string.h> 9 #include <string.h>
9 #include <strings.h> 10 #include <strings.h>
10 #include <X11/Xlib.h> 11 #include <X11/Xlib.h>
11 #include <X11/Xresource.h> 12 #include <X11/Xresource.h>
12 #include <X11/Xutil.h> 13 #include <X11/Xutil.h>
13 #include "globals.h" 14 #include "globals.h"
15
16 #define MAX_WIDTH 176
17
18 static unsigned
19 hexdecode(str)
20 char *str;
21 {
22 unsigned accum = 0;
23 int i, c, n;
24
25 for (i = 0; i < 4; i++) {
26 c = str[i];
27 if (isdigit(c))
28 n = c - '0';
29 else if (isupper(c))
30 n = c - 'A' + 10;
31 else
32 n = c - 'a' + 10;
33 accum <<= 4;
34 accum |= n;
35 }
36 return(accum);
37 }
38
39 process_input_line(line)
40 char *line;
41 {
42 int blitrow, blitcol, npix;
43 uint16_t pix16[MAX_WIDTH];
44 char *cp;
45 XImage *xi;
46
47 for (cp = line; isspace(*cp); cp++)
48 ;
49 if (!isdigit(*cp)) {
50 inv: fprintf(stderr, "fc-lcdemu: invalid input line\n");
51 exit(1);
52 }
53 blitrow = atoi(cp);
54 while (isdigit(*cp))
55 cp++;
56 if (!isspace(*cp))
57 goto inv;
58 while (isspace(*cp))
59 cp++;
60 if (!isdigit(*cp))
61 goto inv;
62 blitcol = atoi(cp);
63 while (isdigit(*cp))
64 cp++;
65 if (!isspace(*cp))
66 goto inv;
67 while (isspace(*cp))
68 cp++;
69 if (!isxdigit(*cp))
70 goto inv;
71 for (npix = 0; *cp; ) {
72 if (!isxdigit(cp[0]) || !isxdigit(cp[1]) ||
73 !isxdigit(cp[2]) || !isxdigit(cp[3]))
74 goto inv;
75 if (npix >= MAX_WIDTH) {
76 fprintf(stderr,
77 "fc-lcdemu error: input line exceeds MAX_WIDTH of %d pixels\n",
78 MAX_WIDTH);
79 exit(1);
80 }
81 pix16[npix++] = hexdecode(cp);
82 cp += 4;
83 }
84 xi = convert_function(pix16, npix);
85 XPutImage(mydisplay, mainwindow, mainwingc, xi, 0, 0, blitcol, blitrow,
86 npix, 1);
87 XDestroyImage(xi);
88 }
14 89
15 input_on_stdin(inbuf, incount) 90 input_on_stdin(inbuf, incount)
16 char *inbuf; 91 char *inbuf;
17 { 92 {
18 char *input_end = inbuf + incount; 93 char *input_end = inbuf + incount;
29 } 104 }
30 if (linesz < sizeof(linebuf) - 1) 105 if (linesz < sizeof(linebuf) - 1)
31 linebuf[linesz++] = *cp; 106 linebuf[linesz++] = *cp;
32 } 107 }
33 } 108 }
34
35 process_input_line(line)
36 char *line;
37 {
38 printf("Got input line: %s\n", line);
39 }