aboutsummaryrefslogtreecommitdiff
path: root/sunrpc/rpc_scan.c
diff options
context:
space:
mode:
Diffstat (limited to 'sunrpc/rpc_scan.c')
-rw-r--r--sunrpc/rpc_scan.c544
1 files changed, 0 insertions, 544 deletions
diff --git a/sunrpc/rpc_scan.c b/sunrpc/rpc_scan.c
deleted file mode 100644
index 0a88bafe76..0000000000
--- a/sunrpc/rpc_scan.c
+++ /dev/null
@@ -1,544 +0,0 @@
-/*
- * From: @(#)rpc_scan.c 1.11 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_scan.c, Scanner for the RPC protocol compiler
- * Copyright (C) 1987, Sun Microsystems, Inc.
- */
-#include <stdio.h>
-#include <ctype.h>
-#include <string.h>
-#include <libintl.h>
-#include "rpc_scan.h"
-#include "rpc_parse.h"
-#include "rpc_util.h"
-#include "proto.h"
-
-#define startcomment(where) (where[0] == '/' && where[1] == '*')
-#define endcomment(where) (where[-1] == '*' && where[0] == '/')
-
-static int pushed = 0; /* is a token pushed */
-static token lasttok; /* last token, if pushed */
-
-static void unget_token (token * tokp);
-static void findstrconst (const char **str, const char **val);
-static void findchrconst (const char **str, const char **val);
-static void findconst (const char **str, const char **val);
-static void findkind (const char **mark, token * tokp);
-static int cppline (const char *line);
-static int directive (const char *line);
-static void printdirective (const char *line);
-static void docppline (const char *line, int *lineno, const char **fname);
-
-/*
- * scan expecting 1 given token
- */
-void
-scan (tok_kind expect, token * tokp)
-{
- get_token (tokp);
- if (tokp->kind != expect)
- expected1 (expect);
-}
-
-/*
- * scan expecting any of the 2 given tokens
- */
-void
-scan2 (tok_kind expect1, tok_kind expect2, token * tokp)
-{
- get_token (tokp);
- if (tokp->kind != expect1 && tokp->kind != expect2)
- {
- expected2 (expect1, expect2);
- }
-}
-
-/*
- * scan expecting any of the 3 given token
- */
-void
-scan3 (tok_kind expect1, tok_kind expect2, tok_kind expect3, token * tokp)
-{
- get_token (tokp);
- if (tokp->kind != expect1 && tokp->kind != expect2
- && tokp->kind != expect3)
- {
- expected3 (expect1, expect2, expect3);
- }
-}
-
-/*
- * scan expecting a constant, possibly symbolic
- */
-void
-scan_num (token *tokp)
-{
- get_token (tokp);
- switch (tokp->kind)
- {
- case TOK_IDENT:
- break;
- default:
- error (_("constant or identifier expected"));
- }
-}
-
-/*
- * Peek at the next token
- */
-void
-peek (token *tokp)
-{
- get_token (tokp);
- unget_token (tokp);
-}
-
-/*
- * Peek at the next token and scan it if it matches what you expect
- */
-int
-peekscan (tok_kind expect, token *tokp)
-{
- peek (tokp);
- if (tokp->kind == expect)
- {
- get_token (tokp);
- return 1;
- }
- return 0;
-}
-
-/*
- * Get the next token, printing out any directive that are encountered.
- */
-void
-get_token (token *tokp)
-{
- int commenting;
-
- if (pushed)
- {
- pushed = 0;
- *tokp = lasttok;
- return;
- }
- commenting = 0;
- for (;;)
- {
- if (*where == 0)
- {
- for (;;)
- {
- if (!fgets (curline, MAXLINESIZE, fin))
- {
- tokp->kind = TOK_EOF;
- *curline = 0;
- where = curline;
- return;
- }
- linenum++;
- if (commenting)
- {
- break;
- }
- else if (cppline (curline))
- {
- docppline (curline, &linenum,
- &infilename);
- }
- else if (directive (curline))
- {
- printdirective (curline);
- }
- else
- {
- break;
- }
- }
- where = curline;
- }
- else if (isspace (*where))
- {
- while (isspace (*where))
- {
- where++; /* eat */
- }
- }
- else if (commenting)
- {
- for (where++; *where; where++)
- {
- if (endcomment (where))
- {
- where++;
- commenting--;
- break;
- }
- }
- }
- else if (startcomment (where))
- {
- where += 2;
- commenting++;
- }
- else
- {
- break;
- }
- }
-
- /*
- * 'where' is not whitespace, comment or directive Must be a token!
- */
- switch (*where)
- {
- case ':':
- tokp->kind = TOK_COLON;
- where++;
- break;
- case ';':
- tokp->kind = TOK_SEMICOLON;
- where++;
- break;
- case ',':
- tokp->kind = TOK_COMMA;
- where++;
- break;
- case '=':
- tokp->kind = TOK_EQUAL;
- where++;
- break;
- case '*':
- tokp->kind = TOK_STAR;
- where++;
- break;
- case '[':
- tokp->kind = TOK_LBRACKET;
- where++;
- break;
- case ']':
- tokp->kind = TOK_RBRACKET;
- where++;
- break;
- case '{':
- tokp->kind = TOK_LBRACE;
- where++;
- break;
- case '}':
- tokp->kind = TOK_RBRACE;
- where++;
- break;
- case '(':
- tokp->kind = TOK_LPAREN;
- where++;
- break;
- case ')':
- tokp->kind = TOK_RPAREN;
- where++;
- break;
- case '<':
- tokp->kind = TOK_LANGLE;
- where++;
- break;
- case '>':
- tokp->kind = TOK_RANGLE;
- where++;
- break;
-
- case '"':
- tokp->kind = TOK_STRCONST;
- findstrconst (&where, &tokp->str);
- break;
- case '\'':
- tokp->kind = TOK_CHARCONST;
- findchrconst (&where, &tokp->str);
- break;
-
- case '-':
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- tokp->kind = TOK_IDENT;
- findconst (&where, &tokp->str);
- break;
-
- default:
- if (!(isalpha (*where) || *where == '_'))
- {
- char buf[100];
- char *p;
-
- s_print (buf, _("illegal character in file: "));
- p = buf + strlen (buf);
- if (isprint (*where))
- {
- s_print (p, "%c", *where);
- }
- else
- {
- s_print (p, "%d", *where);
- }
- error (buf);
- }
- findkind (&where, tokp);
- break;
- }
-}
-
-static void
-unget_token (token * tokp)
-{
- lasttok = *tokp;
- pushed = 1;
-}
-
-static void
-findstrconst (const char **str, const char **val)
-{
- const char *p;
- char *tmp;
- int size;
-
- p = *str;
- do
- {
- p++;
- }
- while (*p && *p != '"');
- if (*p == 0)
- {
- error (_("unterminated string constant"));
- }
- p++;
- size = p - *str;
- tmp = alloc (size + 1);
- strncpy (tmp, *str, size);
- tmp[size] = 0;
- *val = tmp;
- *str = p;
-}
-
-static void
-findchrconst (const char **str, const char **val)
-{
- const char *p;
- char *tmp;
- int size;
-
- p = *str;
- do
- {
- p++;
- }
- while (*p && *p != '\'');
- if (*p == 0)
- {
- error (_("unterminated string constant"));
- }
- p++;
- size = p - *str;
- if (size != 3)
- {
- error (_("empty char string"));
- }
- tmp = alloc (size + 1);
- strncpy (tmp, *str, size);
- tmp[size] = 0;
- *val = tmp;
- *str = p;
-}
-
-static void
-findconst (const char **str, const char **val)
-{
- const char *p;
- char *tmp;
- int size;
-
- p = *str;
- if (*p == '0' && *(p + 1) == 'x')
- {
- p++;
- do
- {
- p++;
- }
- while (isxdigit (*p));
- }
- else
- {
- do
- {
- p++;
- }
- while (isdigit (*p));
- }
- size = p - *str;
- tmp = alloc (size + 1);
- strncpy (tmp, *str, size);
- tmp[size] = 0;
- *val = tmp;
- *str = p;
-}
-
-static const token symbols[] =
-{
- {TOK_CONST, "const"},
- {TOK_UNION, "union"},
- {TOK_SWITCH, "switch"},
- {TOK_CASE, "case"},
- {TOK_DEFAULT, "default"},
- {TOK_STRUCT, "struct"},
- {TOK_TYPEDEF, "typedef"},
- {TOK_ENUM, "enum"},
- {TOK_OPAQUE, "opaque"},
- {TOK_BOOL, "bool"},
- {TOK_VOID, "void"},
- {TOK_CHAR, "char"},
- {TOK_INT, "int"},
- {TOK_UNSIGNED, "unsigned"},
- {TOK_SHORT, "short"},
- {TOK_LONG, "long"},
- {TOK_HYPER, "hyper"},
- {TOK_FLOAT, "float"},
- {TOK_DOUBLE, "double"},
- {TOK_STRING, "string"},
- {TOK_PROGRAM, "program"},
- {TOK_VERSION, "version"},
- {TOK_EOF, "??????"},
-};
-
-static void
-findkind (const char **mark, token *tokp)
-{
- int len;
- const token *s;
- const char *str;
- char *tmp;
-
- str = *mark;
- for (s = symbols; s->kind != TOK_EOF; s++)
- {
- len = strlen (s->str);
- if (strncmp (str, s->str, len) == 0)
- {
- if (!isalnum (str[len]) && str[len] != '_')
- {
- tokp->kind = s->kind;
- tokp->str = s->str;
- *mark = str + len;
- return;
- }
- }
- }
- tokp->kind = TOK_IDENT;
- for (len = 0; isalnum (str[len]) || str[len] == '_'; len++);
- tmp = alloc (len + 1);
- strncpy (tmp, str, len);
- tmp[len] = 0;
- tokp->str = tmp;
- *mark = str + len;
-}
-
-static int
-cppline (const char *line)
-{
- return line == curline && *line == '#';
-}
-
-static int
-directive (const char *line)
-{
- return line == curline && *line == '%';
-}
-
-static void
-printdirective (const char *line)
-{
- f_print (fout, "%s", line + 1);
-}
-
-static void
-docppline (const char *line, int *lineno, const char **fname)
-{
- char *file;
- int num;
- char *p;
-
- line++;
- while (isspace (*line))
- {
- line++;
- }
- num = atoi (line);
- while (isdigit (*line))
- {
- line++;
- }
- while (isspace (*line))
- {
- line++;
- }
- if (*line != '"')
- {
- error (_("preprocessor error"));
- }
- line++;
- p = file = alloc (strlen (line) + 1);
- while (*line && *line != '"')
- {
- *p++ = *line++;
- }
- if (*line == 0)
- {
- error (_("preprocessor error"));
- }
- *p = 0;
- if (*file == 0)
- {
- free (file);
- *fname = NULL;
- }
- else
- {
- *fname = file;
- }
- *lineno = num - 1;
-}