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

📄 filter.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <draw.h>#include <event.h>#include <bio.h>#include "page.h"Document*initfilt(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf, char *type, char *cmd, int docopy){	int ofd;	int p[2];	char xbuf[8192];	int n;	if(argc > 1) {		fprint(2, "can only view one %s file at a time\n", type);		return nil;	}	fprint(2, "converting from %s to postscript...\n", type);	if(docopy){		if(pipe(p) < 0){			fprint(2, "pipe fails: %r\n");			exits("Epipe");		}	}else{		p[0] = open("/dev/null", ORDWR);		p[1] = open("/dev/null", ORDWR);	}	ofd = opentemp("/tmp/pagecvtXXXXXXXXX");	switch(fork()){	case -1:		fprint(2, "fork fails: %r\n");		exits("Efork");	default:		close(p[1]);		if(docopy){			write(p[0], buf, nbuf);			if(b)				while((n = Bread(b, xbuf, sizeof xbuf)) > 0)					write(p[0], xbuf, n);			else				while((n = read(stdinfd, xbuf, sizeof xbuf)) > 0)					write(p[0], xbuf, n);		}		close(p[0]);		waitpid();		break;	case 0:		close(p[0]);		dup(p[1], 0);		dup(ofd, 1);		/* stderr shines through */		execl("/bin/rc", "rc", "-c", cmd, nil);		break;	}	if(b)		Bterm(b);	seek(ofd, 0, 0);	b = emalloc(sizeof(Biobuf));	Binit(b, ofd, OREAD);	return initps(b, argc, argv, nil, 0);}Document*initdvi(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf){	int fd;	char *name;	char cmd[256];	char fdbuf[20];	/*	 * Stupid DVIPS won't take standard input.	 */	if(b == nil){	/* standard input; spool to disk (ouch) */		fd = spooltodisk(buf, nbuf, &name);		sprint(fdbuf, "/fd/%d", fd);		b = Bopen(fdbuf, OREAD);		if(b == nil){			fprint(2, "cannot open disk spool file\n");			wexits("Bopen temp");		}		argv = &name;		argc = 1;	}	snprint(cmd, sizeof cmd, "dvips -Pps -r0 -q1 -f1 '%s'", argv[0]);	return initfilt(b, argc, argv, buf, nbuf, "dvi", cmd, 0);}Document*inittroff(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf){	return initfilt(b, argc, argv, buf, nbuf, "troff", "lp -dstdout", 1);}Document*initmsdoc(Biobuf *b, int argc, char **argv, uchar *buf, int nbuf){	return initfilt(b, argc, argv, buf, nbuf, "microsoft office", "doc2ps", 1);}

⌨️ 快捷键说明

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