hardio.c

来自「一个很有名的浏览器」· C语言 代码 · 共 148 行

C
148
字号
/* Low-level terminal-suitable I/O routines *//* $Id: hardio.c,v 1.14 2004/10/13 15:34:47 zas Exp $ */#ifdef HAVE_CONFIG_H#include "config.h"#endif#include <errno.h>#include <stdio.h>#include <sys/types.h>#ifdef HAVE_UNISTD_H#include <unistd.h>#endif#include "elinks.h"#include "terminal/hardio.h"#include "util/error.h"/* Define it to have data written to stderr *//* #define DEBUG_HARDIO */#undef debug_open#undef debug_flush#undef debug_write#ifdef DEBUG_HARDIOstatic voidhw_debug_open(unsigned char *name, int fd, unsigned char *p, int l){	fprintf(stderr, "[%s (fd=%d, p=%p, l=%d)]\n",name, fd, p, l);}static voidhw_debug_flush() {	fputs("\n\n", stderr);	fflush(stderr);}static voidhw_debug_write(unsigned char *p, int w){	int hex = 0;	int i = 0;	if (!w) return;	for (; i < w; i++) {		if (p[i] == ' ') {			int c = i;			while (i < w && p[++i] == ' ');			if (i - c - 1 > 1) {				fprintf(stderr, "[+ %d spaces]\n", i - c - 1);				if (i == w) break;				c = 0;				continue;			}			c = 0;			i--;		}		if (p[i] >= ' ' && p[i] < 127 && p[i] != '|') {			if (hex) {				fputc('|', stderr);				hex = 0;			}			fputc(p[i], stderr);		} else {			if (!hex) {				fputc('|', stderr);				hex = 1;			}			fprintf(stderr,"%02x", p[i]);		}	}}#define debug_open(n, fd, p, l) hw_debug_open(n, fd, p, l)#define debug_flush() hw_debug_flush()#define debug_write(p, l) hw_debug_write(p, l)#else#define debug_open(n, fd, p, l)#define debug_flush()#define debug_write(p, l)#endifinthard_write(int fd, unsigned char *p, int l){	int t = l;	assert(p && l >= 0);	if_assert_failed return -1;	debug_open("hard_write", fd, p, l);	while (l > 0) {		int w = safe_write(fd, p, l);		if (w <= 0) {			if (w) return -1;			break;		}		debug_write(p, w);		p += w;		l -= w;	}	debug_flush();	/* Return number of bytes written. */	return (t - l);}inthard_read(int fd, unsigned char *p, int l){	int t = l;	assert(p && l >= 0);	if_assert_failed return -1;	debug_open("hard_read", fd, p, l);	while (l > 0) {		int r = safe_read(fd, p, l);		if (r <= 0) {			if (r) return -1;			break;		}		debug_write(p, r);		p += r;		l -= r;	}	debug_flush();	/* Return number of bytes read. */	return (t - l);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?