encodefmt.c

来自「这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易」· C语言 代码 · 共 78 行

C
78
字号
#include <u.h>#include <libc.h>#include <ctype.h>intencodefmt(Fmt *f){	char *out;	char *buf;	int len;	int ilen;	int rv;	uchar *b;	char *p;	char obuf[64];	// rsc optimization	if(!(f->flags&FmtPrec) || f->prec < 1)		goto error;	b = va_arg(f->args, uchar*);	if(b == 0)		return fmtstrcpy(f, "<nil>");	ilen = f->prec;	f->prec = 0;	f->flags &= ~FmtPrec;	switch(f->r){	case '<':		len = (8*ilen+4)/5 + 3;		break;	case '[':		len = (8*ilen+5)/6 + 4;		break;	case 'H':		len = 2*ilen + 1;		break;	default:		goto error;	}	if(len > sizeof(obuf)){		buf = malloc(len);		if(buf == nil)			goto error;	} else		buf = obuf;	// convert	out = buf;	switch(f->r){	case '<':		rv = enc32(out, len, b, ilen);		break;	case '[':		rv = enc64(out, len, b, ilen);		break;	case 'H':		rv = enc16(out, len, b, ilen);		if(rv >= 0 && (f->flags & FmtLong))			for(p = buf; *p; p++)				*p = tolower(*p);		break;	default:		rv = -1;		break;	}	if(rv < 0)		goto error;	fmtstrcpy(f, buf);	if(buf != obuf)		free(buf);	return 0;error:	return fmtstrcpy(f, "<encodefmt>");}

⌨️ 快捷键说明

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