prog.c

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

C
75
字号
#include <u.h>#include <libc.h>#include <thread.h>#include <sunrpc.h>SunStatussunCallPack(SunProg *prog, uchar *a, uchar *ea, uchar **pa, SunCall *c){	uchar *x;	int (*pack)(uchar*, uchar*, uchar**, SunCall*);	if(pa == nil)		pa = &x;	if(c->type < 0 || c->type >= prog->nproc || (pack=prog->proc[c->type].pack) == nil)		return SunProcUnavail;	if((*pack)(a, ea, pa, c) < 0)		return SunGarbageArgs;	return SunSuccess;}SunStatussunCallUnpack(SunProg *prog, uchar *a, uchar *ea, uchar **pa, SunCall *c){	uchar *x;	int (*unpack)(uchar*, uchar*, uchar**, SunCall*);	if(pa == nil)		pa = &x;	if(c->type < 0 || c->type >= prog->nproc || (unpack=prog->proc[c->type].unpack) == nil)		return SunProcUnavail;	if((*unpack)(a, ea, pa, c) < 0){		fprint(2, "in: %.*H unpack failed\n", (int)(ea-a), a);		return SunGarbageArgs;	}	return SunSuccess;}SunStatussunCallUnpackAlloc(SunProg *prog, SunCallType type, uchar *a, uchar *ea, uchar **pa, SunCall **pc){	uchar *x;	uint size;	int (*unpack)(uchar*, uchar*, uchar**, SunCall*);	SunCall *c;	if(pa == nil)		pa = &x;	if(type < 0 || type >= prog->nproc || (unpack=prog->proc[type].unpack) == nil)		return SunProcUnavail;	size = prog->proc[type].sizeoftype;	if(size == 0)		return SunProcUnavail;	c = mallocz(size, 1);	if(c == nil)		return SunSystemErr;	c->type = type;	if((*unpack)(a, ea, pa, c) < 0){		fprint(2, "in: %.*H unpack failed\n", (int)(ea-a), a);		free(c);		return SunGarbageArgs;	}	*pc = c;	return SunSuccess;}uintsunCallSize(SunProg *prog, SunCall *c){	uint (*size)(SunCall*);	if(c->type < 0 || c->type >= prog->nproc || (size=prog->proc[c->type].size) == nil)		return ~0;	return (*size)(c);}

⌨️ 快捷键说明

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