lib/common/htmlparse.h
lib/common/ps_font_equiv.h
lib/common/svgcolor_lib
-lib/expr/exop.h
lib/expr/exparse.c
lib/expr/exparse.h
lib/graph/parser.c
-I$(top_srcdir)/lib/ast \
-I$(top_srcdir)/lib/cdt
-noinst_HEADERS = exgram.h exlib.h expr.h
+noinst_HEADERS = exgram.h exlib.h exop.h expr.h
noinst_LTLIBRARIES = libexpr_C.la
### expr.h includes ast.h and vmalloc.h which we don't install
$(libexpr_C_la_OBJECTS) $(libexpr_la_OBJECTS): \
exparse.h exparse.c exgram.h exop.h
-exop.h: exparse.h
- echo "static const char* exop[] = {" > exop.h
- echo " \"MINTOKEN\"," >> exop.h
- $(SED) -e '1,/^[ ]*#[ ]*define[ ][ ]*MINTOKEN/d' -e '/MAXTOKEN/,$$d' -e '/^[ ]*#[ ]*define[ ][ ]*[A-Z]/!d' -e 's/^[ ]*#[ ]*define[ ]*\([A-Z0-9_]*\).*/ "\1",/' < exparse.h >> exop.h
- echo "};" >> exop.h
-
exparse.c: y.tab.c
@SED@ "s/fprintf/sfprintf/g" <y.tab.c | \
@SED@ "s/FILE/Sfio_t/g" | \
EXTRA_DIST = $(man_MANS) $(pdf_DATA) \
Makefile.nmake Makefile.orig \
- exparse.c exparse.h exop.h \
+ exparse.c exparse.h \
y.tab.c y.tab.h y.output expr.vcxproj*
-DISTCLEANFILES = $(pdf_DATA) exparse.[ch] exop.h y.tab.[ch] y.output expr.3.ps
+DISTCLEANFILES = $(pdf_DATA) exparse.[ch] y.tab.[ch] y.output expr.3.ps
#include <expr/exlib.h>
#include <expr/exop.h>
+#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <time.h>
#ifdef _WIN32
-#include <stdlib.h>
#define srand48 srand
#define drand48 rand
#endif
static char buf[TOTNAME][MAXNAME];
if (op > MINTOKEN && op < MAXTOKEN)
- return (char*)exop[op - MINTOKEN];
+ return (char*)exop((size_t)op - MINTOKEN);
if (++n >= TOTNAME)
n = 0;
b = buf[n];
if (op == '=')
{
if (subop > MINTOKEN && subop < MAXTOKEN)
- sfsprintf(b, MAXNAME, "%s=", exop[subop - MINTOKEN]);
+ sfsprintf(b, MAXNAME, "%s=", exop((size_t)subop - MINTOKEN));
else if (subop > ' ' && subop <= '~')
sfsprintf(b, MAXNAME, "%c=", subop);
else
#include <expr/exlib.h>
#include <expr/exop.h>
+#include <stddef.h>
#define TOTNAME 3
#define MAXNAME 16
static char buf[TOTNAME][MAXNAME];
if (op > MINTOKEN && op < MAXTOKEN)
- return (char*)exop[op - MINTOKEN];
+ return (char*)exop((size_t)op - MINTOKEN);
if (++n > TOTNAME)
n = 0;
b = buf[n];
if (op == '=')
{
if (subop > MINTOKEN && subop < MAXTOKEN)
- sfsprintf(b, MAXNAME, "%s=", exop[subop - MINTOKEN]);
+ sfsprintf(b, MAXNAME, "%s=", exop((size_t)subop - MINTOKEN));
else if (subop > ' ' && subop <= '~')
sfsprintf(b, MAXNAME, "%c=", subop);
else sfsprintf(b, MAXNAME, "(%d)=", subop);
--- /dev/null
+#pragma once
+
+#include <stddef.h>
+
+/** retrieve a string representation of a lexer token
+ *
+ * \param id The numerical identifier of the sought token as an offset from
+ * MINTOKEN
+ * \return The string name of the token or NULL if id is invalid
+ */
+const char *exop(size_t id);
#endif
#endif
+#include <assert.h>
+#include <ctype.h>
+#include <expr/exop.h>
#include <stdio.h>
+#include <string.h>
#include <ast/ast.h>
#undef RS /* hp.pa <signal.h> grabs this!! */
%token MAXTOKEN
+ /* ask Bison to generate a table, yytname, containing string representations
+ * of all the above tokens
+ */
+%token-table
+
%{
#include "exgram.h"
%%
+const char *exop(size_t index) {
+
+ /* yytname is generated by the %token-table directive */
+
+ /* find the index of MINTOKEN */
+ size_t minid;
+ for (minid = 0; yytname[minid] != NULL; ++minid) {
+ if (strcmp(yytname[minid], "MINTOKEN") == 0) {
+ break;
+ }
+ }
+
+ assert(yytname[minid] != NULL
+ && "failed to find MINTOKEN; incorrect token list in exparse.y?");
+
+ /* find the requested token */
+ {
+ size_t i, j;
+ for (i = j = minid; yytname[i] != NULL; ++i) {
+
+ /* if this token is not a word, skip it */
+ {
+ size_t k;
+ for (k = 0; yytname[i][k] != '\0'; ++k) {
+ if (yytname[i][k] != '_' && !isalnum(yytname[i][k])) {
+ break;
+ }
+ }
+ if (yytname[i][k] != '\0') {
+ continue;
+ }
+ }
+
+ if (j == index + minid) {
+ return yytname[i];
+ }
+ ++j;
+ }
+ }
+
+ /* failed to find the requested token */
+ return NULL;
+}
+
#include "exgram.h"
+++ /dev/null
-static const char* exop[] = {
- "MINTOKEN",
- "INTEGER",
- "UNSIGNED",
- "CHARACTER",
- "FLOATING",
- "STRING",
- "VOIDTYPE",
- "STATIC",
- "ADDRESS",
- "ARRAY",
- "BREAK",
- "CALL",
- "CASE",
- "CONSTANT",
- "CONTINUE",
- "DECLARE",
- "DEFAULT",
- "DYNAMIC",
- "ELSE",
- "EXIT",
- "FOR",
- "FUNCTION",
- "GSUB",
- "ITERATE",
- "ITERATER",
- "ID",
- "IF",
- "LABEL",
- "MEMBER",
- "NAME",
- "POS",
- "PRAGMA",
- "PRE",
- "PRINT",
- "PRINTF",
- "PROCEDURE",
- "QUERY",
- "RAND",
- "RETURN",
- "SCANF",
- "SPLIT",
- "SPRINTF",
- "SRAND",
- "SSCANF",
- "SUB",
- "SUBSTR",
- "SWITCH",
- "TOKENS",
- "UNSET",
- "WHILE",
- "F2I",
- "F2S",
- "I2F",
- "I2S",
- "S2B",
- "S2F",
- "S2I",
- "F2X",
- "I2X",
- "S2X",
- "X2F",
- "X2I",
- "X2S",
- "X2X",
- "XPRINT",
- "OR",
- "AND",
- "EQ",
- "NE",
- "LE",
- "GE",
- "LS",
- "RS",
- "IN_OP",
- "UNARY",
- "INC",
- "DEC",
- "CAST",
-};