live-bootstrap/steps/byacc-20240109/patches/meslibc.patch

171 lines
4.2 KiB
Diff

SPDX-FileCopyrightText: 2024 Gábor Stefanik <netrolller.3d@gmail.com>
SPDX-License-Identifier: GPL-3.0-or-later
Remove usages of tmpfile(), rewind(), fgetpos(), fsetpos() and bsearch(),
which are unsupported by meslibc, and add missing declaration for strdup.
License note: Berkeley Yacc is in the public domain, but it's linked with
meslibc, which is GPL-3.0-or-later, so we apply that license here too.
diff -ru ../byacc-20240109.bak/main.c ./main.c
--- ../byacc-20240109.bak/main.c 2024-04-14 16:06:09.646465507 +0200
+++ ./main.c 2024-04-14 20:41:56.227083399 +0200
@@ -788,7 +788,7 @@
(void)umask(save_umask);
}
#else
- result = tmpfile();
+ result = fopen(label, "w+");
#endif
if (result == 0)
diff -ru ../byacc-20240109.bak/output.c ./output.c
--- ../byacc-20240109.bak/output.c 2024-04-14 16:06:09.646465507 +0200
+++ ./output.c 2024-04-14 16:06:24.636465897 +0200
@@ -1289,7 +1289,7 @@
{
if (union_file != 0)
{
- rewind(union_file);
+ fseek(union_file, 0, SEEK_SET);
while ((c = getc(union_file)) != EOF)
putc_code(fp, c);
}
@@ -1314,7 +1314,7 @@
if (text_file == NULL)
open_error("text_file");
- rewind(text_file);
+ fseek(text_file, 0, SEEK_SET);
in = text_file;
if ((c = getc(in)) == EOF)
return;
@@ -1684,7 +1684,7 @@
int state;
char line_state[20];
- rewind(action_file);
+ fseek(action_file, 0, SEEK_SET);
if ((c = getc(action_file)) == EOF)
return;
diff -ru ../byacc-20240109.bak/reader.c ./reader.c
--- ../byacc-20240109.bak/reader.c 2024-04-14 16:06:09.646465507 +0200
+++ ./reader.c 2024-04-14 20:40:58.387082748 +0200
@@ -70,7 +70,7 @@
char *line_data; /* saved input-line */
size_t line_used; /* position within saved input-line */
size_t line_size; /* length of saved input-line */
- fpos_t line_fpos; /* pointer before reading past saved input-line */
+ long line_fpos; /* pointer before reading past saved input-line */
}
SAVE_LINE;
@@ -315,7 +315,7 @@
line = save_area.line_data;
cptr = save_area.line_used + line;
linesize = save_area.line_size;
- if (fsetpos(input_file, &save_area.line_fpos) != 0)
+ if (fseek(input_file, save_area.line_fpos, SEEK_SET) != 0)
on_error();
memset(&save_area, 0, sizeof(save_area));
}
@@ -338,7 +338,7 @@
save_area.line_size = linesize;
NO_SPACE(save_area.line_data);
memcpy(save_area.line_data, line, linesize);
- if (fgetpos(f, &save_area.line_fpos) != 0)
+ if ((save_area.line_fpos = ftell(f)) == -1)
on_error();
must_save = -must_save;
}
@@ -572,6 +572,36 @@
return strcmp(p->name, q->name);
}
+/*
+ * Compare keyword to cached token, treating '_' and '-' the same. Some
+ * grammars rely upon this misfeature.
+ */
+static int
+matchec(const char *name)
+{
+ const char *p = cache;
+ const char *q = name;
+ int code = 0; /* assume mismatch */
+
+ while (*p != '\0' && *q != '\0')
+ {
+ char a = *p++;
+ char b = *q++;
+ if (a == '_')
+ a = '-';
+ if (b == '_')
+ b = '-';
+ if (a != b)
+ break;
+ if (*p == '\0' && *q == '\0')
+ {
+ code = 1;
+ break;
+ }
+ }
+ return code;
+}
+
static int
keyword(void)
{
@@ -612,10 +642,36 @@
}
cachec(NUL);
- if ((key = bsearch(cache, keywords,
- sizeof(keywords) / sizeof(*key),
- sizeof(*key), compare_keys)))
- return key->token;
+ if (matchec("token") || matchec("term"))
+ return (TOKEN);
+ if (matchec("type"))
+ return (TYPE);
+ if (matchec("left"))
+ return (LEFT);
+ if (matchec("right"))
+ return (RIGHT);
+ if (matchec("nonassoc") || matchec("binary"))
+ return (NONASSOC);
+ if (matchec("start"))
+ return (START);
+ if (matchec("union"))
+ return (UNION);
+ if (matchec("ident"))
+ return (IDENT);
+ if (matchec("expect"))
+ return (EXPECT);
+ if (matchec("expect-rr"))
+ return (EXPECT_RR);
+ if (matchec("pure-parser"))
+ return (PURE_PARSER);
+ if (matchec("parse-param"))
+ return (PARSE_PARAM);
+ if (matchec("lex-param"))
+ return (LEX_PARAM);
+ if (matchec("token-table"))
+ return (TOKEN_TABLE);
+ if (matchec("yacc"))
+ return (POSIX_YACC);
}
else
{
@@ -1178,6 +1234,9 @@
return result;
}
+char *
+strdup (char const *s);
+
static void
save_param(int k, char *buffer, int name, int type2)
{