aboutsummaryrefslogtreecommitdiff
path: root/sunrpc/rpc_parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'sunrpc/rpc_parse.c')
-rw-r--r--sunrpc/rpc_parse.c687
1 files changed, 0 insertions, 687 deletions
diff --git a/sunrpc/rpc_parse.c b/sunrpc/rpc_parse.c
deleted file mode 100644
index 505a6554cf..0000000000
--- a/sunrpc/rpc_parse.c
+++ /dev/null
@@ -1,687 +0,0 @@
-/*
- * From: @(#)rpc_parse.c 1.8 89/02/22
- *
- * Copyright (c) 2010, Oracle America, Inc.
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following
- * disclaimer in the documentation and/or other materials
- * provided with the distribution.
- * * Neither the name of the "Oracle America, Inc." nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * rpc_parse.c, Parser for the RPC protocol compiler
- * Copyright (C) 1987 Sun Microsystems, Inc.
- */
-#include <stdio.h>
-#include <string.h>
-#include "rpc/types.h"
-#include "rpc_scan.h"
-#include "rpc_parse.h"
-#include "rpc_util.h"
-#include "proto.h"
-
-#define ARGNAME "arg"
-
-static void isdefined (definition * defp);
-static void def_struct (definition * defp);
-static void def_program (definition * defp);
-static void def_enum (definition * defp);
-static void def_const (definition * defp);
-static void def_union (definition * defp);
-static void check_type_name (const char *name, int new_type);
-static void def_typedef (definition * defp);
-static void get_declaration (declaration * dec, defkind dkind);
-static void get_prog_declaration (declaration * dec, defkind dkind, int num);
-static void get_type (const char **prefixp, const char **typep, defkind dkind);
-static void unsigned_dec (const char **typep);
-
-/*
- * return the next definition you see
- */
-definition *
-get_definition (void)
-{
- definition *defp;
- token tok;
-
- defp = ALLOC (definition);
- get_token (&tok);
- switch (tok.kind)
- {
- case TOK_STRUCT:
- def_struct (defp);
- break;
- case TOK_UNION:
- def_union (defp);
- break;
- case TOK_TYPEDEF:
- def_typedef (defp);
- break;
- case TOK_ENUM:
- def_enum (defp);
- break;
- case TOK_PROGRAM:
- def_program (defp);
- break;
- case TOK_CONST:
- def_const (defp);
- break;
- case TOK_EOF:
- free (defp);
- return (NULL);
- default:
- error ("definition keyword expected");
- }
- scan (TOK_SEMICOLON, &tok);
- isdefined (defp);
- return (defp);
-}
-
-static void
-isdefined (definition * defp)
-{
- STOREVAL (&defined, defp);
-}
-
-static void
-def_struct (definition * defp)
-{
- token tok;
- declaration dec;
- decl_list *decls;
- decl_list **tailp;
-
- defp->def_kind = DEF_STRUCT;
-
- scan (TOK_IDENT, &tok);
- defp->def_name = tok.str;
- scan (TOK_LBRACE, &tok);
- tailp = &defp->def.st.decls;
- do
- {
- get_declaration (&dec, DEF_STRUCT);
- decls = ALLOC (decl_list);
- decls->decl = dec;
- *tailp = decls;
- tailp = &decls->next;
- scan (TOK_SEMICOLON, &tok);
- peek (&tok);
- }
- while (tok.kind != TOK_RBRACE);
- get_token (&tok);
- *tailp = NULL;
-}
-
-static void
-def_program (definition * defp)
-{
- token tok;
- declaration dec;
- decl_list *decls;
- decl_list **tailp;
- version_list *vlist;
- version_list **vtailp;
- proc_list *plist;
- proc_list **ptailp;
- int num_args;
- bool_t isvoid = FALSE; /* whether first argument is void */
- defp->def_kind = DEF_PROGRAM;
- scan (TOK_IDENT, &tok);
- defp->def_name = tok.str;
- scan (TOK_LBRACE, &tok);
- vtailp = &defp->def.pr.versions;
- tailp = &defp->def.st.decls;
- scan (TOK_VERSION, &tok);
- do
- {
- scan (TOK_IDENT, &tok);
- vlist = ALLOC (version_list);
- vlist->vers_name = tok.str;
- scan (TOK_LBRACE, &tok);
- ptailp = &vlist->procs;
- do
- {
- /* get result type */
- plist = ALLOC (proc_list);
- get_type (&plist->res_prefix, &plist->res_type,
- DEF_PROGRAM);
- if (streq (plist->res_type, "opaque"))
- {
- error ("illegal result type");
- }
- scan (TOK_IDENT, &tok);
- plist->proc_name = tok.str;
- scan (TOK_LPAREN, &tok);
- /* get args - first one */
- num_args = 1;
- isvoid = FALSE;
- /* type of DEF_PROGRAM in the first
- * get_prog_declaration and DEF_STURCT in the next
- * allows void as argument if it is the only argument
- */
- get_prog_declaration (&dec, DEF_PROGRAM, num_args);
- if (streq (dec.type, "void"))
- isvoid = TRUE;
- decls = ALLOC (decl_list);
- plist->args.decls = decls;
- decls->decl = dec;
- tailp = &decls->next;
- /* get args */
- while (peekscan (TOK_COMMA, &tok))
- {
- num_args++;
- get_prog_declaration (&dec, DEF_STRUCT,
- num_args);
- decls = ALLOC (decl_list);
- decls->decl = dec;
- *tailp = decls;
- if (streq (dec.type, "void"))
- isvoid = TRUE;
- tailp = &decls->next;
- }
- /* multiple arguments are only allowed in newstyle */
- if (!newstyle && num_args > 1)
- {
- error ("only one argument is allowed");
- }
- if (isvoid && num_args > 1)
- {
- error ("illegal use of void in program definition");
- }
- *tailp = NULL;
- scan (TOK_RPAREN, &tok);
- scan (TOK_EQUAL, &tok);
- scan_num (&tok);
- scan (TOK_SEMICOLON, &tok);
- plist->proc_num = tok.str;
- plist->arg_num = num_args;
- *ptailp = plist;
- ptailp = &plist->next;
- peek (&tok);
- }
- while (tok.kind != TOK_RBRACE);
- *ptailp = NULL;
- *vtailp = vlist;
- vtailp = &vlist->next;
- scan (TOK_RBRACE, &tok);
- scan (TOK_EQUAL, &tok);
- scan_num (&tok);
- vlist->vers_num = tok.str;
- /* make the argument structure name for each arg */
- for (plist = vlist->procs; plist != NULL;
- plist = plist->next)
- {
- plist->args.argname = make_argname (plist->proc_name,
- vlist->vers_num);
- /* free the memory ?? */
- }
- scan (TOK_SEMICOLON, &tok);
- scan2 (TOK_VERSION, TOK_RBRACE, &tok);
- }
- while (tok.kind == TOK_VERSION);
- scan (TOK_EQUAL, &tok);
- scan_num (&tok);
- defp->def.pr.prog_num = tok.str;
- *vtailp = NULL;
-}
-
-
-static void
-def_enum (definition * defp)
-{
- token tok;
- enumval_list *elist;
- enumval_list **tailp;
-
- defp->def_kind = DEF_ENUM;
- scan (TOK_IDENT, &tok);
- defp->def_name = tok.str;
- scan (TOK_LBRACE, &tok);
- tailp = &defp->def.en.vals;
- do
- {
- scan (TOK_IDENT, &tok);
- elist = ALLOC (enumval_list);
- elist->name = tok.str;
- elist->assignment = NULL;
- scan3 (TOK_COMMA, TOK_RBRACE, TOK_EQUAL, &tok);
- if (tok.kind == TOK_EQUAL)
- {
- scan_num (&tok);
- elist->assignment = tok.str;
- scan2 (TOK_COMMA, TOK_RBRACE, &tok);
- }
- *tailp = elist;
- tailp = &elist->next;
- }
- while (tok.kind != TOK_RBRACE);
- *tailp = NULL;
-}
-
-static void
-def_const (definition * defp)
-{
- token tok;
-
- defp->def_kind = DEF_CONST;
- scan (TOK_IDENT, &tok);
- defp->def_name = tok.str;
- scan (TOK_EQUAL, &tok);
- scan2 (TOK_IDENT, TOK_STRCONST, &tok);
- defp->def.co = tok.str;
-}
-
-static void
-def_union (definition *defp)
-{
- token tok;
- declaration dec;
- case_list *cases;
-/* case_list *tcase; */
- case_list **tailp;
-#if 0
- int flag;
-#endif
-
- defp->def_kind = DEF_UNION;
- scan (TOK_IDENT, &tok);
- defp->def_name = tok.str;
- scan (TOK_SWITCH, &tok);
- scan (TOK_LPAREN, &tok);
- get_declaration (&dec, DEF_UNION);
- defp->def.un.enum_decl = dec;
- tailp = &defp->def.un.cases;
- scan (TOK_RPAREN, &tok);
- scan (TOK_LBRACE, &tok);
- scan (TOK_CASE, &tok);
- while (tok.kind == TOK_CASE)
- {
- scan2 (TOK_IDENT, TOK_CHARCONST, &tok);
- cases = ALLOC (case_list);
- cases->case_name = tok.str;
- scan (TOK_COLON, &tok);
- /* now peek at next token */
-#if 0
- flag = 0;
-#endif
- if (peekscan (TOK_CASE, &tok))
- {
-
- do
- {
- scan2 (TOK_IDENT, TOK_CHARCONST, &tok);
- cases->contflag = 1; /* continued case statement */
- *tailp = cases;
- tailp = &cases->next;
- cases = ALLOC (case_list);
- cases->case_name = tok.str;
- scan (TOK_COLON, &tok);
-
- }
- while (peekscan (TOK_CASE, &tok));
- }
-#if 0
- else if (flag)
- {
-
- *tailp = cases;
- tailp = &cases->next;
- cases = ALLOC (case_list);
- };
-#endif
-
- get_declaration (&dec, DEF_UNION);
- cases->case_decl = dec;
- cases->contflag = 0; /* no continued case statement */
- *tailp = cases;
- tailp = &cases->next;
- scan (TOK_SEMICOLON, &tok);
-
- scan3 (TOK_CASE, TOK_DEFAULT, TOK_RBRACE, &tok);
- }
- *tailp = NULL;
- if (tok.kind == TOK_DEFAULT)
- {
- scan (TOK_COLON, &tok);
- get_declaration (&dec, DEF_UNION);
- defp->def.un.default_decl = ALLOC (declaration);
- *defp->def.un.default_decl = dec;
- scan (TOK_SEMICOLON, &tok);
- scan (TOK_RBRACE, &tok);
- }
- else
- {
- defp->def.un.default_decl = NULL;
- }
-}
-
-static const char *reserved_words[] =
-{
- "array",
- "bytes",
- "destroy",
- "free",
- "getpos",
- "inline",
- "pointer",
- "reference",
- "setpos",
- "sizeof",
- "union",
- "vector",
- NULL
-};
-
-static const char *reserved_types[] =
-{
- "opaque",
- "string",
- NULL
-};
-
-/*
- * check that the given name is not one that would eventually result in
- * xdr routines that would conflict with internal XDR routines.
- */
-static void
-check_type_name (const char *name, int new_type)
-{
- int i;
- char tmp[100];
-
- for (i = 0; reserved_words[i] != NULL; i++)
- {
- if (strcmp (name, reserved_words[i]) == 0)
- {
- sprintf (tmp,
- "illegal (reserved) name :\'%s\' in type definition", name);
- error (tmp);
- }
- }
- if (new_type)
- {
- for (i = 0; reserved_types[i] != NULL; i++)
- {
- if (strcmp (name, reserved_types[i]) == 0)
- {
- sprintf (tmp,
- "illegal (reserved) name :\'%s\' in type definition", name);
- error (tmp);
- }
- }
- }
-}
-
-
-
-static void
-def_typedef (definition * defp)
-{
- declaration dec;
-
- defp->def_kind = DEF_TYPEDEF;
- get_declaration (&dec, DEF_TYPEDEF);
- defp->def_name = dec.name;
- check_type_name (dec.name, 1);
- defp->def.ty.old_prefix = dec.prefix;
- defp->def.ty.old_type = dec.type;
- defp->def.ty.rel = dec.rel;
- defp->def.ty.array_max = dec.array_max;
-}
-
-static void
-get_declaration (declaration * dec, defkind dkind)
-{
- token tok;
-
- get_type (&dec->prefix, &dec->type, dkind);
- dec->rel = REL_ALIAS;
- if (streq (dec->type, "void"))
- {
- return;
- }
-
- check_type_name (dec->type, 0);
-
- scan2 (TOK_STAR, TOK_IDENT, &tok);
- if (tok.kind == TOK_STAR)
- {
- dec->rel = REL_POINTER;
- scan (TOK_IDENT, &tok);
- }
- dec->name = tok.str;
- if (peekscan (TOK_LBRACKET, &tok))
- {
- if (dec->rel == REL_POINTER)
- {
- error ("no array-of-pointer declarations -- use typedef");
- }
- dec->rel = REL_VECTOR;
- scan_num (&tok);
- dec->array_max = tok.str;
- scan (TOK_RBRACKET, &tok);
- }
- else if (peekscan (TOK_LANGLE, &tok))
- {
- if (dec->rel == REL_POINTER)
- {
- error ("no array-of-pointer declarations -- use typedef");
- }
- dec->rel = REL_ARRAY;
- if (peekscan (TOK_RANGLE, &tok))
- {
- dec->array_max = "~0"; /* unspecified size, use max */
- }
- else
- {
- scan_num (&tok);
- dec->array_max = tok.str;
- scan (TOK_RANGLE, &tok);
- }
- }
- if (streq (dec->type, "opaque"))
- {
- if (dec->rel != REL_ARRAY && dec->rel != REL_VECTOR)
- {
- error ("array declaration expected");
- }
- }
- else if (streq (dec->type, "string"))
- {
- if (dec->rel != REL_ARRAY)
- {
- error ("variable-length array declaration expected");
- }
- }
-}
-
-static void
-get_prog_declaration (declaration * dec, defkind dkind, int num /* arg number */ )
-{
- token tok;
- char name[MAXLINESIZE]; /* argument name */
-
- if (dkind == DEF_PROGRAM)
- {
- peek (&tok);
- if (tok.kind == TOK_RPAREN)
- { /* no arguments */
- dec->rel = REL_ALIAS;
- dec->type = "void";
- dec->prefix = NULL;
- dec->name = NULL;
- return;
- }
- }
- get_type (&dec->prefix, &dec->type, dkind);
- dec->rel = REL_ALIAS;
- if (peekscan (TOK_IDENT, &tok)) /* optional name of argument */
- strcpy (name, tok.str);
- else
- sprintf (name, "%s%d", ARGNAME, num); /* default name of argument */
-
- dec->name = (char *) strdup (name);
-
- if (streq (dec->type, "void"))
- {
- return;
- }
-
- if (streq (dec->type, "opaque"))
- {
- error ("opaque -- illegal argument type");
- }
- if (peekscan (TOK_STAR, &tok))
- {
- if (streq (dec->type, "string"))
- {
- error ("pointer to string not allowed in program arguments\n");
- }
- dec->rel = REL_POINTER;
- if (peekscan (TOK_IDENT, &tok)) /* optional name of argument */
- dec->name = strdup (tok.str);
- }
- if (peekscan (TOK_LANGLE, &tok))
- {
- if (!streq (dec->type, "string"))
- {
- error ("arrays cannot be declared as arguments to procedures -- use typedef");
- }
- dec->rel = REL_ARRAY;
- if (peekscan (TOK_RANGLE, &tok))
- {
- dec->array_max = "~0"; /* unspecified size, use max */
- }
- else
- {
- scan_num (&tok);
- dec->array_max = tok.str;
- scan (TOK_RANGLE, &tok);
- }
- }
- if (streq (dec->type, "string"))
- {
- if (dec->rel != REL_ARRAY)
- { /* .x specifies just string as
- * type of argument
- * - make it string<>
- */
- dec->rel = REL_ARRAY;
- dec->array_max = "~0"; /* unspecified size, use max */
- }
- }
-}
-
-static void
-get_type (const char **prefixp, const char **typep, defkind dkind)
-{
- token tok;
-
- *prefixp = NULL;
- get_token (&tok);
- switch (tok.kind)
- {
- case TOK_IDENT:
- *typep = tok.str;
- break;
- case TOK_STRUCT:
- case TOK_ENUM:
- case TOK_UNION:
- *prefixp = tok.str;
- scan (TOK_IDENT, &tok);
- *typep = tok.str;
- break;
- case TOK_UNSIGNED:
- unsigned_dec (typep);
- break;
- case TOK_SHORT:
- *typep = "short";
- (void) peekscan (TOK_INT, &tok);
- break;
- case TOK_LONG:
- *typep = "long";
- (void) peekscan (TOK_INT, &tok);
- break;
- case TOK_HYPER:
- *typep = "quad_t";
- (void) peekscan(TOK_INT, &tok);
- break;
- case TOK_VOID:
- if (dkind != DEF_UNION && dkind != DEF_PROGRAM)
- {
- error ("voids allowed only inside union and program definitions with one argument");
- }
- *typep = tok.str;
- break;
- case TOK_STRING:
- case TOK_OPAQUE:
- case TOK_CHAR:
- case TOK_INT:
- case TOK_FLOAT:
- case TOK_DOUBLE:
- case TOK_BOOL:
- *typep = tok.str;
- break;
- default:
- error ("expected type specifier");
- }
-}
-
-static void
-unsigned_dec (const char **typep)
-{
- token tok;
-
- peek (&tok);
- switch (tok.kind)
- {
- case TOK_CHAR:
- get_token (&tok);
- *typep = "u_char";
- break;
- case TOK_SHORT:
- get_token (&tok);
- *typep = "u_short";
- (void) peekscan (TOK_INT, &tok);
- break;
- case TOK_LONG:
- get_token (&tok);
- *typep = "u_long";
- (void) peekscan (TOK_INT, &tok);
- break;
- case TOK_HYPER:
- get_token (&tok);
- *typep = "u_quad_t";
- (void) peekscan(TOK_INT, &tok);
- break;
- case TOK_INT:
- get_token (&tok);
- *typep = "u_int";
- break;
- default:
- *typep = "u_int";
- break;
- }
-}