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

📄 rpc_cout.c

📁 一个C源代码分析器
💻 C
字号:
/* @(#)rpc_cout.c	2.1 88/08/01 4.0 RPCSRC *//* * Sun RPC is a product of Sun Microsystems, Inc. and is provided for * unrestricted use provided that this legend is included on all tape * media and as a part of the software program in whole or part.  Users * may copy or modify Sun RPC without charge, but are not authorized * to license or distribute it to anyone else except as part of a product or * program developed by the user. *  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. *  * Sun RPC is provided with no support and without any obligation on the * part of Sun Microsystems, Inc. to assist in its use, correction, * modification or enhancement. *  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC * OR ANY PART THEREOF. *  * In no event will Sun Microsystems, Inc. be liable for any lost revenue * or profits or other special, indirect and consequential damages, even if * Sun has been advised of the possibility of such damages. *  * Sun Microsystems, Inc. * 2550 Garcia Avenue * Mountain View, California  94043 */#ifndef lintstatic char sccsid[] = "@(#)rpc_cout.c 1.8 87/06/24 (C) 1987 SMI";#endif/* * rpc_cout.c, XDR routine outputter for the RPC protocol compiler  * Copyright (C) 1987, Sun Microsystems, Inc.  */#include <stdio.h>#include <strings.h>#include "rpc_util.h"#include "rpc_parse.h"/* * Emit the C-routine for the given definition  */voidemit(def)	definition *def;{	if (def->def_kind == DEF_PROGRAM || def->def_kind == DEF_CONST) {		return;	}	print_header(def);	switch (def->def_kind) {	case DEF_UNION:		emit_union(def);		break;	case DEF_ENUM:		emit_enum(def);		break;	case DEF_STRUCT:		emit_struct(def);		break;	case DEF_TYPEDEF:		emit_typedef(def);		break;	}	print_trailer();}staticfindtype(def, type)	definition *def;	char *type;{	if (def->def_kind == DEF_PROGRAM || def->def_kind == DEF_CONST) {		return (0);	} else {		return (streq(def->def_name, type));	}}staticundefined(type)	char *type;{	definition *def;	def = (definition *) FINDVAL(defined, type, findtype);	return (def == NULL);}staticprint_header(def)	definition *def;{	space();	f_print(fout, "bool_t\n");	f_print(fout, "xdr_%s(xdrs, objp)\n", def->def_name);	f_print(fout, "\tXDR *xdrs;\n");	f_print(fout, "\t%s ", def->def_name);	if (def->def_kind != DEF_TYPEDEF ||	    !isvectordef(def->def.ty.old_type, def->def.ty.rel)) {		f_print(fout, "*");	}	f_print(fout, "objp;\n");	f_print(fout, "{\n");}staticprint_trailer(){	f_print(fout, "\treturn (TRUE);\n");	f_print(fout, "}\n");	space();}staticprint_ifopen(indent, name)	int indent;	char *name;{	tabify(fout, indent);	f_print(fout, "if (!xdr_%s(xdrs", name);}staticprint_ifarg(arg)	char *arg;{	f_print(fout, ", %s", arg);}staticprint_ifsizeof(prefix, type)	char *prefix;	char *type;{	if (streq(type, "bool")) {		f_print(fout, ", sizeof(bool_t), xdr_bool");	} else {		f_print(fout, ", sizeof(");		if (undefined(type) && prefix) {			f_print(fout, "%s ", prefix);		}		f_print(fout, "%s), xdr_%s", type, type);	}}staticprint_ifclose(indent)	int indent;{	f_print(fout, ")) {\n");	tabify(fout, indent);	f_print(fout, "\treturn (FALSE);\n");	tabify(fout, indent);	f_print(fout, "}\n");}staticspace(){	f_print(fout, "\n\n");}staticprint_ifstat(indent, prefix, type, rel, amax, objname, name)	int indent;	char *prefix;	char *type;	relation rel;	char *amax;	char *objname;	char *name;{	char *alt = NULL;	switch (rel) {	case REL_POINTER:		print_ifopen(indent, "pointer");		print_ifarg("(char **)");		f_print(fout, "%s", objname);		print_ifsizeof(prefix, type);		break;	case REL_VECTOR:		if (streq(type, "string")) {			alt = "string";		} else if (streq(type, "opaque")) {			alt = "opaque";		}		if (alt) {			print_ifopen(indent, alt);			print_ifarg(objname);		} else {			print_ifopen(indent, "vector");			print_ifarg("(char *)");			f_print(fout, "%s", objname);		}		print_ifarg(amax);		if (!alt) {			print_ifsizeof(prefix, type);		}		break;	case REL_ARRAY:		if (streq(type, "string")) {			alt = "string";		} else if (streq(type, "opaque")) {			alt = "bytes";		}		if (streq(type, "string")) {			print_ifopen(indent, alt);			print_ifarg(objname);		} else {			if (alt) {				print_ifopen(indent, alt);			} else {				print_ifopen(indent, "array");			}			print_ifarg("(char **)");			if (*objname == '&') {				f_print(fout, "%s.%s_val, (u_int *)%s.%s_len",					objname, name, objname, name);			} else {				f_print(fout, "&%s->%s_val, (u_int *)&%s->%s_len",					objname, name, objname, name);			}		}		print_ifarg(amax);		if (!alt) {			print_ifsizeof(prefix, type);		}		break;	case REL_ALIAS:		print_ifopen(indent, type);		print_ifarg(objname);		break;	}	print_ifclose(indent);}/* ARGSUSED */staticemit_enum(def)	definition *def;{	print_ifopen(1, "enum");	print_ifarg("(enum_t *)objp");	print_ifclose(1);}staticemit_union(def)	definition *def;{	declaration *dflt;	case_list *cl;	declaration *cs;	char *object;	char *format = "&objp->%s_u.%s";	print_stat(&def->def.un.enum_decl);	f_print(fout, "\tswitch (objp->%s) {\n", def->def.un.enum_decl.name);	for (cl = def->def.un.cases; cl != NULL; cl = cl->next) {		cs = &cl->case_decl;		f_print(fout, "\tcase %s:\n", cl->case_name);		if (!streq(cs->type, "void")) {			object = alloc(strlen(def->def_name) + strlen(format) +				       strlen(cs->name) + 1);			s_print(object, format, def->def_name, cs->name);			print_ifstat(2, cs->prefix, cs->type, cs->rel, cs->array_max,				     object, cs->name);			free(object);		}		f_print(fout, "\t\tbreak;\n");	}	dflt = def->def.un.default_decl;	if (dflt != NULL) {		if (!streq(dflt->type, "void")) {			f_print(fout, "\tdefault:\n");			object = alloc(strlen(def->def_name) + strlen(format) +				       strlen(dflt->name) + 1);			s_print(object, format, def->def_name, dflt->name);			print_ifstat(2, dflt->prefix, dflt->type, dflt->rel,				     dflt->array_max, object, dflt->name);			free(object);			f_print(fout, "\t\tbreak;\n");		}	} else {		f_print(fout, "\tdefault:\n");		f_print(fout, "\t\treturn (FALSE);\n");	}	f_print(fout, "\t}\n");}staticemit_struct(def)	definition *def;{	decl_list *dl;	for (dl = def->def.st.decls; dl != NULL; dl = dl->next) {		print_stat(&dl->decl);	}}staticemit_typedef(def)	definition *def;{	char *prefix = def->def.ty.old_prefix;	char *type = def->def.ty.old_type;	char *amax = def->def.ty.array_max;	relation rel = def->def.ty.rel;	print_ifstat(1, prefix, type, rel, amax, "objp", def->def_name);}staticprint_stat(dec)	declaration *dec;{	char *prefix = dec->prefix;	char *type = dec->type;	char *amax = dec->array_max;	relation rel = dec->rel;	char name[256];	if (isvectordef(type, rel)) {		s_print(name, "objp->%s", dec->name);	} else {		s_print(name, "&objp->%s", dec->name);	}	print_ifstat(1, prefix, type, rel, amax, name, dec->name);}

⌨️ 快捷键说明

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