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

📄 iconv.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <draw.h>#include <memdraw.h>voidusage(void){	fprint(2, "usage: iconv [-u] [-c chanstr] [file]\n");	exits("usage");}voidwriteuncompressed(int fd, Memimage *m){	char chanstr[32];	int bpl, y, j;	uchar *buf;	if(chantostr(chanstr, m->chan) == nil)		sysfatal("can't convert channel descriptor: %r");	fprint(fd, "%11s %11d %11d %11d %11d ",		chanstr, m->r.min.x, m->r.min.y, m->r.max.x, m->r.max.y);	bpl = bytesperline(m->r, m->depth);	buf = malloc(bpl);	if(buf == nil)		sysfatal("malloc failed: %r");	for(y=m->r.min.y; y<m->r.max.y; y++){		j = unloadmemimage(m, Rect(m->r.min.x, y, m->r.max.x, y+1), buf, bpl);		if(j != bpl)			sysfatal("image unload failed: %r");		if(write(fd, buf, bpl) != bpl)			sysfatal("write failed: %r");	}	free(buf);}voidmain(int argc, char *argv[]){	char *tostr, *file;	int fd, uncompressed;	ulong tochan;	Memimage *m, *n;	tostr = nil;	uncompressed = 0;	ARGBEGIN{	case 'c':		tostr = EARGF(usage());		break;	case 'u':		uncompressed = 1;		break;	default:		usage();	}ARGEND	memimageinit();	file = "<stdin>";	m = nil;	switch(argc){	case 0:		m = readmemimage(0);		break;	case 1:		file = argv[0];		fd = open(file, OREAD);		if(fd < 0)			sysfatal("can't open %s: %r", file);		m = readmemimage(fd);		close(fd);		break;	default:		usage();	}	if(m == nil)		sysfatal("can't read %s: %r", file);	if(tostr == nil)		tochan = m->chan;	else{		tochan = strtochan(tostr);		if(tochan == 0)			sysfatal("bad channel descriptor '%s'", tostr);	}	n = allocmemimage(m->r, tochan);	if(n == nil)		sysfatal("can't allocate new image: %r");	memimagedraw(n, n->r, m, m->r.min, nil, ZP, S);	if(uncompressed)		writeuncompressed(1, n);	else		writememimage(1, n);	exits(nil);}

⌨️ 快捷键说明

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