⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iob.c

📁 Intel x86处理器的汇编器
💻 C
字号:
#include <unistd.h>#include "iob.h"/*  the backup buffer for readln_from_iob() */static char backup_buf[80];static int backup = 0;void init_iob(int fd, struct iob *p){	p->fd = fd;	p->cnt = 0;	p->buf_ptr = p->buf;	p->tail_ptr = p->buf;}/********************************************************* paramater:             p: the io buffer pointer            count: read into buffer bytes size return:	    -1 if ERROR, 	    read into buffer size;**********************************************************/int read_into_iob(struct iob *p, unsigned int count){	int cnt = 0;	if (p->buf_ptr == p->tail_ptr) { 		/* buffer free or readed by user */		if (count > IO_BUFSIZE)			cnt = IO_BUFSIZE;		else			cnt = count;		if (p->buf_ptr > p->buf)	/* already read by user */			p->buf_ptr = p->tail_ptr = p->buf;		p->cnt = read(p->fd, p->buf_ptr, cnt);	} else if (p->buf_ptr < p->tail_ptr) {		/* buffer stand by user read */		if (count > IO_BUFSIZE - (p->tail_ptr - p->buf))			cnt = IO_BUFSIZE - (p->tail_ptr - p->buf);		else			cnt = count;		p->cnt = read(p->fd, p->tail_ptr, cnt);	}	if (p->cnt < 0)		return -1;	p->tail_ptr += p->cnt;	return p->cnt;}int read_from_iob(struct iob *p, void *usrbuf, unsigned int count){	int cnt = 0;	if (p->tail_ptr > p->buf_ptr) {		if (count > (p->tail_ptr - p->buf_ptr))			cnt = p->tail_ptr - p->buf_ptr;		else			cnt = count;		memcpy(usrbuf, p->buf_ptr, cnt);		p->buf_ptr += cnt;	}		return cnt;}int readln_from_iob(struct iob *p, char *usrbuf){	int cnt = 0;	char c;	int i = 0;	if (backup) {		memcpy(usrbuf, backup_buf, backup);		i = backup;		backup = 0;	}	while (cnt = read_from_iob(p, &c, 1)) {		if (c == 0x0d)			continue;		if (c == '\n')			break;			if (i < LINE_SIZE)			usrbuf[i++] = c;	}	usrbuf[i] = 0;		if (c != '\n') {			/* the iob_buffer is free but no match '\n' */		memcpy(backup_buf, usrbuf, i);		backup = i;	}	return cnt;}/*************************************************************************/int write_into_iob(struct iob *p, void *usrbuf, unsigned int count){	int cnt = 0;	if (p->buf_ptr >= p->tail_ptr) {		if (count > IO_BUFSIZE)			cnt = IO_BUFSIZE;		else			cnt = count;		if (p->buf_ptr > p->buf)			p->buf_ptr = p->tail_ptr = p->buf;		memcpy(p->buf_ptr, usrbuf, cnt);	} else if (p->tail_ptr > p->buf_ptr) {		if (count > IO_BUFSIZE - (p->tail_ptr - p->buf))			cnt = IO_BUFSIZE - (p->tail_ptr - p->buf);		else			cnt = count;		memcpy(p->tail_ptr, usrbuf, cnt);	}		p->cnt = cnt;	p->tail_ptr += p->cnt;		return p->cnt;}int write_from_iob(struct iob *p, unsigned int count){	int cnt = 0;		if (count > p->tail_ptr - p->buf_ptr)		cnt = p->tail_ptr - p->buf_ptr;	else		cnt = count;	p->cnt = write(p->fd, p->buf_ptr, cnt);	p->buf_ptr += cnt;		return p->cnt;}int flush_all_iob(struct iob *p){	int cnt = write(p->fd, p->buf, p->tail_ptr - p->buf);	p->buf_ptr += cnt;	return cnt;}int flush_last_iob(struct iob *p){	int cnt = 0;	if (p->tail_ptr >= p->buf_ptr)		cnt = write(p->fd, p->buf_ptr, p->tail_ptr - p->buf_ptr);		p->buf_ptr += cnt;	return cnt;}int is_free_iob(struct iob *p){	return p->buf_ptr == p->buf && p->tail_ptr == p->buf;}int is_full_iob(struct iob *p){	return p->tail_ptr == p->buf + IO_BUFSIZE 		&& p->buf_ptr + IO_BUFSIZE;}int get_free_bytes(struct iob *p){	return IO_BUFSIZE - (p->tail_ptr - p->buf);}#if 0#include <fcntl.h>main(){	char msg[] = "hello";	struct iob r_iob, w_iob;	char str[80];	char c;	int r_fd = open("opcode.h", O_RDONLY);	int w_fd = open("ww", O_CREAT);	init_iob(r_fd, &r_iob);	init_iob(0, &w_iob);		write_into_iob(&w_iob, msg, sizeof(msg));	write_into_iob(&w_iob, msg, sizeof(msg));	printf("free: %d\n", get_free_bytes(&w_iob));	//printf("---%s---",w_iob.buf);	write_from_iob(&w_iob,100);	printf("free: %d\n", get_free_bytes(&w_iob));	puts("");	flush_all_iob(&w_iob);	flush_last_iob(&w_iob);/*	while (read_into_iob(&r_iob, sizeof(r_iob.buf))) {		write_into_iob(&w_iob, r_iob.buf,sizeof(w_iob.buf));		write_from_iob(&w_iob, IO_BUFSIZE);	}*/	close(r_fd);	close(w_fd);}#endif

⌨️ 快捷键说明

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