Compilation fix on Mingw32.
[elinks.git] / src / terminal / hardio.c
blobe3f039e32d569cc52d48d6e9936764ca49fbb58a
1 /** Low-level terminal-suitable I/O routines
2 * @file */
4 #ifdef HAVE_CONFIG_H
5 #include "config.h"
6 #endif
8 #include <errno.h>
9 #include <stdio.h>
10 #include <sys/types.h>
11 #ifdef HAVE_UNISTD_H
12 #include <unistd.h>
13 #endif
15 #include "elinks.h"
17 #include "terminal/hardio.h"
18 #include "util/error.h"
20 /* Define it to have data written to stderr */
21 #if 0
22 #define DEBUG_HARDIO
23 #endif
25 #undef debug_open
26 #undef debug_flush
27 #undef debug_write
29 #ifdef DEBUG_HARDIO
30 static void
31 hw_debug_open(unsigned char *name, int fd, unsigned char *data, int datalen)
33 fprintf(stderr, "[%s (fd=%d, data=%p, datalen=%d)]\n",
34 name, fd, data, datalen);
37 static void
38 hw_debug_flush()
40 fputs("\n\n", stderr);
41 fflush(stderr);
44 static void
45 hw_debug_write(unsigned char *data, int w)
47 int hex = 0;
48 int i = 0;
50 if (!w) return;
52 for (; i < w; i++) {
53 if (data[i] == ' ') {
54 int c = i;
56 while (i < w && data[++i] == ' ');
58 if (i - c - 1 > 1) {
59 fprintf(stderr, "[+ %d spaces]\n", i - c - 1);
60 if (i == w) break;
61 c = 0;
62 continue;
64 c = 0;
65 i--;
68 if (data[i] >= ' ' && data[i] < 127 && data[i] != '|') {
69 if (hex) {
70 fputc('|', stderr);
71 hex = 0;
73 fputc(data[i], stderr);
74 } else {
75 if (!hex) {
76 fputc('|', stderr);
77 hex = 1;
79 fprintf(stderr,"%02x", data[i]);
84 #define debug_open(n, fd, data, datalen) hw_debug_open(n, fd, data, datalen)
85 #define debug_flush() hw_debug_flush()
86 #define debug_write(data, datalen) hw_debug_write(data, datalen)
88 #else /* DEBUG_HARDIO */
90 #define debug_open(n, fd, data, datalen)
91 #define debug_flush()
92 #define debug_write(data, datalen)
94 #endif /* DEBUG_HARDIO */
97 ssize_t
98 hard_write(int fd, unsigned char *data, size_t datalen)
100 ssize_t total = datalen;
102 assert(data && datalen >= 0);
103 if_assert_failed return -1;
105 debug_open("hard_write", fd, data, datalen);
107 while (datalen > 0) {
108 ssize_t written = safe_write(fd, data, datalen);
110 if (written <= 0) {
111 if (written) return -1;
112 break;
115 debug_write(data, written);
117 data += written;
118 datalen -= written;
121 debug_flush();
123 /* Return number of bytes written. */
124 return (total - datalen);
127 ssize_t
128 hard_read(int fd, unsigned char *data, size_t datalen)
130 ssize_t total = datalen;
132 assert(data && datalen >= 0);
133 if_assert_failed return -1;
135 debug_open("hard_read", fd, data, datalen);
137 while (datalen > 0) {
138 ssize_t readlen = safe_read(fd, data, datalen);
140 if (readlen <= 0) {
141 if (readlen) return -1;
142 break;
145 debug_write(data, readlen);
147 data += readlen;
148 datalen -= readlen;
151 debug_flush();
153 /* Return number of bytes read. */
154 return (total - datalen);