glibc/sunrpc/rpc_cout.c
Ulrich Drepper 7ef90c1595 Update.
1998-09-14 11:26  Ulrich Drepper  <drepper@cygnus.com>

	* wcsmbs/wcsmbs-tst1.c: Include stdlib.h.

1998-09-14  Thorsten Kukuk  <kukuk@vt.uni-paderborn.de>

	* libc-work/nis/nss_nisplus/nisplus-service.c
	(_nss_nisplus_parse_servent): Convert port in network byte order.

1998-09-14 07:53 -0400  Zack Weinberg  <zack@rabi.phys.columbia.edu>

	* stdlib/stdlib.h: Add a switch, __need_malloc_and_calloc,
	to provide only malloc and calloc.
	* include/stdlib.h: Support the above.
	* string/bits/string2.h: Use __need_malloc_and_calloc when
	including stdlib.h.
	(__string2_1bptr_p): Avoid -Wbad-function-cast warnings.

	* iconvdata/iso-2022-jp.c: Include <stdlib.h>.
	* iconvdata/iso646.c: Include <stdlib.h>.

1998-09-14 07:51 -0400  Zack Weinberg  <zack@rabi.phys.columbia.edu>

	* sunrpc/rpc_cout.c: Add braces around ambiguous else.
	* sysdeps/libm-ieee754/w_pow.c: Likewise.
	* sysdeps/libm-ieee754/w_powf.c: Likewise.
	* sysdeps/libm-ieee754/w_powl.c: Likewise.

1998-09-14 07:57 -0400  Zack Weinberg  <zack@rabi.phys.columbia.edu>

	* stdio-common/stdio_lim.h.in: New file.  All parameters
	are adjustable at build time.
	* Rules: Add a rule to build bits/stdio_lim.h from
	stdio-common/stdio_lim.h.in.  (It has to be in Rules so that
	all subdirectories know how to make the file.  It can't be
	in Makerules because then it gets built at top level and the
	dependencies are wrong.)

	* stdio-common/Makefile (distribute): Add stdio_lim.h.in.
	* sysdeps/unix/sysv/linux/Makefile: Delete rules to make
	stdio_lim.h.
	* sysdeps/unix/sysv/linux/stdio_lim.h.in: Removed.
	* sysdeps/unix/sysv/linux/Dist: Take out stdio_lim.h.in.
	* sysdeps/posix/Makefile: Removed.
	* sysdeps/posix/mk-stdiolim.c: Removed.
	* sysdeps/generic/bits/stdio_lim.h: Removed.

1998-09-12  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* argp/argp-help.c: Fixup indentation.
	* nss/nss_files/files-alias.c: Quiet -Wparentheses warning.
	* resolv/nss_dns/dns-network.c: Likewise.
	* resolv/res_send.c: Likewise.
	* rt/aio_cancel.c: Likewise.
	* rt/aio_misc.c: Likewise.

1998-09-12  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* Makefile (install-symbolic-link): Remove the link list file at last.
	* Makerules (install-clean-symbolic-link-list): Removed.

1998-09-12  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* timezone/tst-timezone.c: Print time in UTC to get consistent
	output.

1998-09-12  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* elf/rtld.c (_dl_rpath): Removed.
	* elf/dl-support.c (_dl_path): Removed.
	* elf/Makefile ($(objpfx)ld.so): Don't pass -rpath.
	(CFLAGS-dl-support.c): Removed.

	* elf/dl-load.c (env_path_list): Renamed from fake_path_list.  All
	uses changed.
	(_dl_init_paths): Always set env_path_list from LD_LIBRARY_PATH,
	instead of appending it to the main map's rpath info.
	(_dl_map_object): Consistently use LD_LIBRARY_PATH after all
	DT_RPATHs.  This makes it effective again.
	(decompose_rpath): Remove second parameter, callers changed.
	(fillin_rpath): Allocate enough space in curwd.
	(expand_dynamic_string_token): Cope with get_origin returning -1.

1998-09-14  Thorsten Kukuk  <kukuk@vt.uni-paderborn.de>

	* libc-work/nis/nss_compat/compat-pwd.c: Add support for
	passwd.adjunct.

	* nis/nss_nis/nis-pwd.c (_nss_nis_getpwent_r): Correct test for
	invalid password.

1998-09-13 18:06  Ulrich Drepper  <drepper@cygnus.com>

	* locale/programs/locale.c: Update dates.
1998-09-14 11:43:26 +00:00

816 lines
18 KiB
C

/*
* 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 or with the express written consent of
* Sun Microsystems, Inc.
*
* 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
*/
/*
* From: @(#)rpc_cout.c 1.13 89/02/22 (C) 1987 SMI
*/
char cout_rcsid[] =
"$Id$";
/*
* rpc_cout.c, XDR routine outputter for the RPC protocol compiler
*/
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include "rpc_parse.h"
#include "rpc_util.h"
#include "proto.h"
static void emit_enum (definition * def);
static void emit_program (const definition * def);
static void emit_union (const definition * def);
static void emit_struct (definition * def);
static void emit_typedef (const definition * def);
static void emit_inline (int indent, declaration * decl, int flag);
static void emit_single_in_line (int indent, declaration *decl, int flag,
relation rel);
static int findtype (const definition * def, const char *type);
static int undefined (const char *type);
static void print_generic_header (const char *procname, int pointerp);
static void print_ifopen (int indent, const char *name);
static void print_ifarg (const char *arg);
static void print_ifsizeof (int indent, const char *prefix, const char *type);
static void print_ifclose (int indent);
static void print_ifstat (int indent, const char *prefix, const char *type,
relation rel, const char *amax,
const char *objname, const char *name);
static void print_stat (int indent, const declaration * dec);
static void print_header (const definition * def);
static void print_trailer (void);
static char *upcase (const char *str);
/*
* Emit the C-routine for the given definition
*/
void
emit (definition * def)
{
if (def->def_kind == DEF_CONST)
{
return;
}
if (def->def_kind == DEF_PROGRAM)
{
emit_program (def);
return;
}
if (def->def_kind == DEF_TYPEDEF)
{
/* now we need to handle declarations like
struct typedef foo foo;
since we don't want this to be expanded
into 2 calls to xdr_foo */
if (strcmp (def->def.ty.old_type, def->def_name) == 0)
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;
default:
/* can't happen */
break;
}
print_trailer ();
}
static int
findtype (const definition * def, const char *type)
{
if (def->def_kind == DEF_PROGRAM || def->def_kind == DEF_CONST)
{
return 0;
}
else
{
return (streq (def->def_name, type));
}
}
static int
undefined (const char *type)
{
definition *def;
def = (definition *) FINDVAL (defined, type, findtype);
return (def == NULL);
}
static void
print_generic_header (const char *procname, int pointerp)
{
f_print (fout, "\n");
f_print (fout, "bool_t\n");
if (Cflag)
{
f_print (fout, "xdr_%s (", procname);
f_print (fout, "XDR *xdrs, ");
f_print (fout, "%s ", procname);
if (pointerp)
f_print (fout, "*");
f_print (fout, "objp)\n{\n");
}
else
{
f_print (fout, "xdr_%s (xdrs, objp)\n", procname);
f_print (fout, "\tXDR *xdrs;\n");
f_print (fout, "\t%s ", procname);
if (pointerp)
f_print (fout, "*");
f_print (fout, "objp;\n{\n");
}
}
static void
print_header (const definition * def)
{
print_generic_header (def->def_name,
def->def_kind != DEF_TYPEDEF ||
!isvectordef (def->def.ty.old_type,
def->def.ty.rel));
/* Now add Inline support */
if (inlineflag == 0)
return;
/*May cause lint to complain. but ... */
f_print (fout, "\t register long *buf;\n\n");
}
static void
print_prog_header (const proc_list * plist)
{
print_generic_header (plist->args.argname, 1);
}
static void
print_trailer (void)
{
f_print (fout, "\treturn TRUE;\n");
f_print (fout, "}\n");
}
static void
print_ifopen (int indent, const char *name)
{
tabify (fout, indent);
f_print (fout, " if (!xdr_%s (xdrs", name);
}
static void
print_ifarg (const char *arg)
{
f_print (fout, ", %s", arg);
}
static void
print_ifsizeof (int indent, const char *prefix, const char *type)
{
if (indent)
{
fprintf (fout, ",\n");
tabify (fout, indent);
}
else
fprintf (fout, ", ");
if (streq (type, "bool"))
fprintf (fout, "sizeof (bool_t), (xdrproc_t) xdr_bool");
else
{
fprintf (fout, "sizeof (");
if (undefined (type) && prefix)
{
f_print (fout, "%s ", prefix);
}
fprintf (fout, "%s), (xdrproc_t) xdr_%s", type, type);
}
}
static void
print_ifclose (int indent)
{
f_print (fout, "))\n");
tabify (fout, indent);
f_print (fout, "\t return FALSE;\n");
}
static void
print_ifstat (int indent, const char *prefix, const char *type, relation rel,
const char *amax, const char *objname, const char *name)
{
const char *alt = NULL;
switch (rel)
{
case REL_POINTER:
print_ifopen (indent, "pointer");
print_ifarg ("(char **)");
f_print (fout, "%s", objname);
print_ifsizeof (0, 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 (indent + 1, 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 (indent + 1, prefix, type);
}
break;
case REL_ALIAS:
print_ifopen (indent, type);
print_ifarg (objname);
break;
}
print_ifclose (indent);
}
static void
emit_enum (definition * def)
{
(void) def;
print_ifopen (1, "enum");
print_ifarg ("(enum_t *) objp");
print_ifclose (1);
}
static void
emit_program (const definition * def)
{
decl_list *dl;
version_list *vlist;
proc_list *plist;
for (vlist = def->def.pr.versions; vlist != NULL; vlist = vlist->next)
for (plist = vlist->procs; plist != NULL; plist = plist->next)
{
if (!newstyle || plist->arg_num < 2)
continue; /* old style, or single argument */
print_prog_header (plist);
for (dl = plist->args.decls; dl != NULL;
dl = dl->next)
print_stat (1, &dl->decl);
print_trailer ();
}
}
static void
emit_union (const definition * def)
{
declaration *dflt;
case_list *cl;
declaration *cs;
char *object;
const char *vecformat = "objp->%s_u.%s";
const char *format = "&objp->%s_u.%s";
print_stat (1, &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)
{
f_print (fout, "\tcase %s:\n", cl->case_name);
if (cl->contflag == 1) /* a continued case statement */
continue;
cs = &cl->case_decl;
if (!streq (cs->type, "void"))
{
object = alloc (strlen (def->def_name) + strlen (format) +
strlen (cs->name) + 1);
if (isvectordef (cs->type, cs->rel))
{
s_print (object, vecformat, def->def_name,
cs->name);
}
else
{
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);
if (isvectordef (dflt->type, dflt->rel))
{
s_print (object, vecformat, def->def_name,
dflt->name);
}
else
{
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");
}
#ifdef __GNU_LIBRARY__
else
{
f_print (fout, "\tdefault:\n");
f_print (fout, "\t\tbreak;\n");
}
#endif
}
else
{
f_print (fout, "\tdefault:\n");
f_print (fout, "\t\treturn FALSE;\n");
}
f_print (fout, "\t}\n");
}
static void
inline_struct (definition *def, int flag)
{
decl_list *dl;
int i, size;
decl_list *cur = NULL;
decl_list *psav;
bas_type *ptr;
char *sizestr;
const char *plus;
char ptemp[256];
int indent = 1;
if (flag == PUT)
f_print (fout, "\n\tif (xdrs->x_op == XDR_ENCODE) {\n");
else
f_print (fout,
"\t\treturn TRUE;\n\t} else if (xdrs->x_op == XDR_DECODE) {\n");
i = 0;
size = 0;
sizestr = NULL;
for (dl = def->def.st.decls; dl != NULL; dl = dl->next)
{ /* xxx */
/* now walk down the list and check for basic types */
if ((dl->decl.prefix == NULL) &&
((ptr = find_type (dl->decl.type)) != NULL) &&
((dl->decl.rel == REL_ALIAS) || (dl->decl.rel == REL_VECTOR)))
{
if (i == 0)
cur = dl;
++i;
if (dl->decl.rel == REL_ALIAS)
size += ptr->length;
else
{
/* this is required to handle arrays */
if (sizestr == NULL)
plus = "";
else
plus = "+ ";
if (ptr->length != 1)
s_print (ptemp, " %s %s * %d", plus, dl->decl.array_max,
ptr->length);
else
s_print (ptemp, " %s%s ", plus, dl->decl.array_max);
/*now concatenate to sizestr !!!! */
if (sizestr == NULL)
sizestr = strdup (ptemp);
else
{
sizestr = realloc (sizestr, strlen (sizestr) +
strlen (ptemp) + 1);
if (sizestr == NULL)
{
f_print (stderr, "Fatal error : no memory \n");
crash ();
};
sizestr = strcat (sizestr, ptemp);
/*build up length of array */
}
}
}
else
{
if (i > 0)
{
if (sizestr == NULL && size < inlineflag)
{
/* don't expand into inline code if size < inlineflag */
while (cur != dl)
{
print_stat (indent + 1, &cur->decl);
cur = cur->next;
}
}
else
{
/* were already looking at a xdr_inlineable structure */
tabify (fout, indent + 1);
if (sizestr == NULL)
f_print (fout, "buf = XDR_INLINE (xdrs, %d * BYTES_PER_XDR_UNIT);", size);
else if (size == 0)
f_print (fout,
"buf = XDR_INLINE (xdrs, %s * BYTES_PER_XDR_UNIT);",
sizestr);
else
f_print (fout,
"buf = XDR_INLINE(xdrs, (%d + (%s)) * BYTES_PER_XDR_UNIT);",
size, sizestr);
f_print (fout, "\n");
tabify (fout, indent + 1);
fprintf (fout, "if (buf == NULL) {\n");
psav = cur;
while (cur != dl)
{
print_stat (indent + 2, &cur->decl);
cur = cur->next;
}
f_print (fout, "\n\t\t} else {\n");
cur = psav;
while (cur != dl)
{
emit_inline (indent + 1, &cur->decl, flag);
cur = cur->next;
}
tabify (fout, indent + 1);
f_print (fout, "}\n");
}
}
size = 0;
i = 0;
sizestr = NULL;
print_stat (indent + 1, &dl->decl);
}
}
if (i > 0)
{
if (sizestr == NULL && size < inlineflag)
{
/* don't expand into inline code if size < inlineflag */
while (cur != dl)
{
print_stat (indent + 1, &cur->decl);
cur = cur->next;
}
}
else
{
/* were already looking at a xdr_inlineable structure */
if (sizestr == NULL)
f_print (fout,
"\t\tbuf = XDR_INLINE(xdrs,%d * BYTES_PER_XDR_UNIT);",
size);
else if (size == 0)
f_print (fout,
"\t\tbuf = XDR_INLINE(xdrs,%s * BYTES_PER_XDR_UNIT);",
sizestr);
else
f_print (fout,
"\t\tbuf = XDR_INLINE(xdrs,(%d + %s)* BYTES_PER_XDR_UNIT);",
size, sizestr);
f_print (fout, "\n\t\tif (buf == NULL) {\n");
psav = cur;
while (cur != NULL)
{
print_stat (indent + 2, &cur->decl);
cur = cur->next;
}
f_print (fout, "\t\t} else {\n");
cur = psav;
while (cur != dl)
{
emit_inline (indent + 2, &cur->decl, flag);
cur = cur->next;
}
f_print (fout, "\t\t}\n");
}
}
}
/* this may be const. i haven't traced this one through yet. */
static void
emit_struct (definition * def)
{
decl_list *dl;
int j, size, flag;
bas_type *ptr;
int can_inline;
if (inlineflag == 0)
{
/* No xdr_inlining at all */
for (dl = def->def.st.decls; dl != NULL; dl = dl->next)
print_stat (1, &dl->decl);
return;
}
for (dl = def->def.st.decls; dl != NULL; dl = dl->next)
if (dl->decl.rel == REL_VECTOR)
{
f_print (fout, "\tint i;\n");
break;
}
size = 0;
can_inline = 0;
/*
* Make a first pass and see if inling is possible.
*/
for (dl = def->def.st.decls; dl != NULL; dl = dl->next)
if ((dl->decl.prefix == NULL) &&
((ptr = find_type (dl->decl.type)) != NULL) &&
((dl->decl.rel == REL_ALIAS) || (dl->decl.rel == REL_VECTOR)))
{
if (dl->decl.rel == REL_ALIAS)
size += ptr->length;
else
{
can_inline = 1;
break; /* can be inlined */
}
}
else
{
if (size >= inlineflag)
{
can_inline = 1;
break; /* can be inlined */
}
size = 0;
}
if (size > inlineflag)
can_inline = 1;
if (can_inline == 0)
{ /* can not inline, drop back to old mode */
for (dl = def->def.st.decls; dl != NULL; dl = dl->next)
print_stat (1, &dl->decl);
return;
};
flag = PUT;
for (j = 0; j < 2; j++)
{
inline_struct (def, flag);
if (flag == PUT)
flag = GET;
}
f_print (fout, "\t return TRUE;\n\t}\n\n");
/* now take care of XDR_FREE case */
for (dl = def->def.st.decls; dl != NULL; dl = dl->next)
print_stat (1, &dl->decl);
}
static void
emit_typedef (const definition * def)
{
const char *prefix = def->def.ty.old_prefix;
const char *type = def->def.ty.old_type;
const char *amax = def->def.ty.array_max;
relation rel = def->def.ty.rel;
print_ifstat (1, prefix, type, rel, amax, "objp", def->def_name);
}
static void
print_stat (int indent, const declaration * dec)
{
const char *prefix = dec->prefix;
const char *type = dec->type;
const 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 (indent, prefix, type, rel, amax, name, dec->name);
}
static void
emit_inline (int indent, declaration * decl, int flag)
{
switch (decl->rel)
{
case REL_ALIAS:
emit_single_in_line (indent, decl, flag, REL_ALIAS);
break;
case REL_VECTOR:
tabify (fout, indent);
f_print (fout, "{\n");
tabify (fout, indent + 1);
f_print (fout, "register %s *genp;\n\n", decl->type);
tabify (fout, indent + 1);
f_print (fout,
"for (i = 0, genp = objp->%s;\n", decl->name);
tabify (fout, indent + 2);
f_print (fout, "i < %s; ++i) {\n", decl->array_max);
emit_single_in_line (indent + 2, decl, flag, REL_VECTOR);
tabify (fout, indent + 1);
f_print (fout, "}\n");
tabify (fout, indent);
f_print (fout, "}\n");
break;
default:
/* ?... do nothing I guess */
}
}
static void
emit_single_in_line (int indent, declaration *decl, int flag, relation rel)
{
char *upp_case;
int freed = 0;
tabify (fout, indent);
if (flag == PUT)
f_print (fout, "IXDR_PUT_");
else
{
if (rel == REL_ALIAS)
f_print (fout, "objp->%s = IXDR_GET_", decl->name);
else
f_print (fout, "*genp++ = IXDR_GET_");
}
upp_case = upcase (decl->type);
/* hack - XX */
if (!strcmp (upp_case, "INT"))
{
free (upp_case);
freed = 1;
/* Casting is safe since the `freed' flag is set. */
upp_case = (char *) "LONG";
}
if (!strcmp (upp_case, "U_INT"))
{
free (upp_case);
freed = 1;
/* Casting is safe since the `freed' flag is set. */
upp_case = (char *) "U_LONG";
}
if (flag == PUT)
{
if (rel == REL_ALIAS)
f_print (fout, "%s(buf, objp->%s);\n", upp_case, decl->name);
else
f_print (fout, "%s(buf, *genp++);\n", upp_case);
}
else
{
f_print (fout, "%s(buf);\n", upp_case);
}
if (!freed)
free (upp_case);
}
static char *
upcase (const char *str)
{
char *ptr, *hptr;
ptr = malloc (strlen (str));
if (ptr == NULL)
{
f_print (stderr, "malloc failed\n");
exit (1);
}
hptr = ptr;
while (*str != '\0')
*ptr++ = toupper (*str++);
*ptr = '\0';
return hptr;
}