runevsmprint.c

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

C
72
字号
#include <u.h>#include <libc.h>#include "fmtdef.h"static intruneFmtStrFlush(Fmt *f){	Rune *s;	int n;	if(f->start == nil)		return 0;	n = (uintptr)f->farg;	n *= 2;	s = (Rune*)f->start;	f->start = realloc(s, sizeof(Rune)*n);	if(f->start == nil){		f->farg = nil;		f->to = nil;		f->stop = nil;		free(s);		return 0;	}	f->farg = (void*)(uintptr)n;	f->to = (Rune*)f->start + ((Rune*)f->to - s);	f->stop = (Rune*)f->start + n - 1;	return 1;}intrunefmtstrinit(Fmt *f){	int n;	memset(f, 0, sizeof *f);	f->runes = 1;	n = 32;	f->start = malloc(sizeof(Rune)*n);	if(f->start == nil)		return -1;	f->to = f->start;	f->stop = (Rune*)f->start + n - 1;	f->flush = runeFmtStrFlush;	f->farg = (void*)(uintptr)n;	f->nfmt = 0;	return 0;}/* * print into an allocated string buffer */Rune*runevsmprint(char *fmt, va_list args){	Fmt f;	int n;	if(runefmtstrinit(&f) < 0)		return nil;	VA_COPY(f.args,args);	n = dofmt(&f, fmt);	VA_END(f.args);	if(f.start == nil)		return nil;	if(n < 0){		free(f.start);		return nil;	}	*(Rune*)f.to = '\0';	return (Rune*)f.start;}

⌨️ 快捷键说明

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