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

📄 appendfiletombox.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include "common.h"enum {	Buffersize = 64*1024,};typedef struct Inbuf Inbuf;struct Inbuf{	char buf[Buffersize];	char *wp;	char *rp;	int eof;	int in;	int out;	int last;	ulong bytes;};static Inbuf*allocinbuf(int in, int out){	Inbuf *b;	b = mallocz(sizeof(Inbuf), 1);	if(b == nil)		sysfatal("reading mailbox: %r");	b->rp = b->wp = b->buf;	b->in = in;	b->out = out;	return b;}static intfill(Inbuf *b, int addspace){	int i, n;	if(b->eof && b->wp - b->rp == 0)		return 0;	n = b->rp - b->buf;	if(n > 0){		i = write(b->out, b->buf, n);		if(i != n)			return -1;		b->last = b->buf[n-1];		b->bytes += n;	}	if(addspace){		if(write(b->out, " ", 1) != 1)			return -1;		b->last = ' ';		b->bytes++;	}	n = b->wp - b->rp;	memmove(b->buf, b->rp, n);	b->rp = b->buf;	b->wp = b->rp + n;	i = read(b->in, b->buf+n, sizeof(b->buf)-n);	if(i < 0)		return -1;	b->wp += i;	return b->wp - b->rp;}/* code to escape ' '*From' ' at the beginning of a line */intappendfiletombox(int in, int out){	int addspace;	int n;	char *p;	int sol;	Inbuf *b;	seek(out, 0, 2);	b = allocinbuf(in, out);	addspace = 0;	sol = 1;	for(;;){		if(b->wp - b->rp < 5){			n = fill(b, addspace);			addspace = 0;			if(n < 0)				goto error;			if(n == 0)				break;			if(n < 5){				b->rp = b->wp;				continue;			}		}		/* state machine looking for ' '*From' ' */		if(!sol){			p = memchr(b->rp, '\n', b->wp - b->rp);			if(p == nil)				b->rp = b->wp;			else{				b->rp = p+1;				sol = 1;			}			continue;		} else {			if(*b->rp == ' ' || strncmp(b->rp, "From ", 5) != 0){				b->rp++;				continue;			}			addspace = 1;			sol = 0;		}	}	/* mailbox entries always terminate with two newlines */	n = b->last == '\n' ? 1 : 2;	if(write(out, "\n\n", n) != n)		goto error;	n += b->bytes;	free(b);	return n;error:	free(b);	return -1;}intappendfiletofile(int in, int out){	int n;	Inbuf *b;	seek(out, 0, 2);	b = allocinbuf(in, out);	for(;;){		n = fill(b, 0);		if(n < 0)			goto error;		if(n == 0)			break;		b->rp = b->wp;	}	n = b->bytes;	free(b);	return n;error:	free(b);	return -1;}

⌨️ 快捷键说明

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