Merge with git+ssh://pasky.or.cz/srv/git/elinks.git
[elinks.git] / src / terminal / hardio.c
blob05c31f6079c6e8c97446e79fcce84c39c4a985d9
1 /* Low-level terminal-suitable I/O routines */
3 #ifdef HAVE_CONFIG_H
4 #include "config.h"
5 #endif
7 #include <errno.h>
8 #include <stdio.h>
9 #include <sys/types.h>
10 #ifdef HAVE_UNISTD_H
11 #include <unistd.h>
12 #endif
14 #include "elinks.h"
16 #include "terminal/hardio.h"
17 #include "util/error.h"
19 /* Define it to have data written to stderr */
20 #if 0
21 #define DEBUG_HARDIO
22 #endif
24 #undef debug_open
25 #undef debug_flush
26 #undef debug_write
28 #ifdef DEBUG_HARDIO
29 static void
30 hw_debug_open(unsigned char *name, int fd, unsigned char *data, int datalen)
32 fprintf(stderr, "[%s (fd=%d, data=%p, datalen=%d)]\n",
33 name, fd, data, datalen);
36 static void
37 hw_debug_flush()
39 fputs("\n\n", stderr);
40 fflush(stderr);
43 static void
44 hw_debug_write(unsigned char *data, int w)
46 int hex = 0;
47 int i = 0;
49 if (!w) return;
51 for (; i < w; i++) {
52 if (data[i] == ' ') {
53 int c = i;
55 while (i < w && data[++i] == ' ');
57 if (i - c - 1 > 1) {
58 fprintf(stderr, "[+ %d spaces]\n", i - c - 1);
59 if (i == w) break;
60 c = 0;
61 continue;
63 c = 0;
64 i--;
67 if (data[i] >= ' ' && data[i] < 127 && data[i] != '|') {
68 if (hex) {
69 fputc('|', stderr);
70 hex = 0;
72 fputc(data[i], stderr);
73 } else {
74 if (!hex) {
75 fputc('|', stderr);
76 hex = 1;
78 fprintf(stderr,"%02x", data[i]);
83 #define debug_open(n, fd, data, datalen) hw_debug_open(n, fd, data, datalen)
84 #define debug_flush() hw_debug_flush()
85 #define debug_write(data, datalen) hw_debug_write(data, datalen)
87 #else /* DEBUG_HARDIO */
89 #define debug_open(n, fd, data, datalen)
90 #define debug_flush()
91 #define debug_write(data, datalen)
93 #endif /* DEBUG_HARDIO */
96 ssize_t
97 hard_write(int fd, unsigned char *data, size_t datalen)
99 ssize_t total = datalen;
101 assert(data && datalen >= 0);
102 if_assert_failed return -1;
104 debug_open("hard_write", fd, data, datalen);
106 while (datalen > 0) {
107 ssize_t written = safe_write(fd, data, datalen);
109 if (written <= 0) {
110 if (written) return -1;
111 break;
114 debug_write(data, written);
116 data += written;
117 datalen -= written;
120 debug_flush();
122 /* Return number of bytes written. */
123 return (total - datalen);
126 ssize_t
127 hard_read(int fd, unsigned char *data, size_t datalen)
129 ssize_t total = datalen;
131 assert(data && datalen >= 0);
132 if_assert_failed return -1;
134 debug_open("hard_read", fd, data, datalen);
136 while (datalen > 0) {
137 ssize_t readlen = safe_read(fd, data, datalen);
139 if (readlen <= 0) {
140 if (readlen) return -1;
141 break;
144 debug_write(data, readlen);
146 data += readlen;
147 datalen -= readlen;
150 debug_flush();
152 /* Return number of bytes read. */
153 return (total - datalen);