diff options
Diffstat (limited to 'sunrpc/rpc_scan.c')
-rw-r--r-- | sunrpc/rpc_scan.c | 544 |
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; -} |