diff --git a/README.md b/README.md index 563522d..52a6179 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,13 @@ system. 1. `git clone https://github.com/fosslinux/live-bootstrap` 2. `git submodule update --init --recursive` 3. Provide a kernel (vmlinuz file) as the name kernel in the root of the repository. -4. `./rootfs.sh` - ensure your account has kvm priviliges and qemu installed. +4. `./rootfs.sh` - ensure your account has kvm privileges and qemu installed. a. Alternatively, run `./rootfs.sh chroot` to run it in a chroot. b. Alternatively, run `./rootfs.sh` but don't run the actual virtualization and instead copy sysa/tmp/initramfs.igz to a USB or some other device and boot from bare metal. 6. Wait. -7. Currently, live-bootstrap dosen't provide anything to you, as it is incomplete. +7. Currently, live-bootstrap doesn't provide anything to you, as it is incomplete. ## Background @@ -77,8 +77,8 @@ packages. Here is a list of file types that we deem unsuitable for bootstrapping. 1. Binaries (apart from seed hex0, kaem, kernel). -2. Any pregenerated configure scripts, or Makefile.in's from autotools. -3. Pregenerated bison/flex parsers (identifiable through a `.y` file). +2. Any pre-generated configure scripts, or Makefile.in's from autotools. +3. Pre-generated bison/flex parsers (identifiable through a `.y` file). 4. Any source code/binaries downloaded within a software's build system that is outside of our control to verify before use in the build system. 5. Any non-free software. [1] @@ -247,16 +247,21 @@ A few of the utilities cannot be easily compiled with Mes C library, so we skip GNU `grep` is a pattern matching utility. Is is not immediately needed but will be useful later for autotools. -#### Part 17: bash 2.05b +#### Part 17: heirloom devtools +`lex` and `yacc` from the Heirloom project. The Heirloom project is a collection +of standard UNIX utilities derived from code by Caldera and Sun. Differently from +the analogous utilities from the GNU project, they can be compiled with a simple `Makefile`. + +#### Part 21: bash 2.05b GNU `bash` is the most well known shell and the most complex piece of software so far. However, it comes with a number of great benefits over kaem, including proper POSIX sh support, globbing, etc. -NOTE: Currently, there is a bison pregenerated file here, which we are working +NOTE: Currently, there is a bison pre-generated file here, which we are working to remove. -#### Part 18: m4 1.4 +#### Part 22: m4 1.4 `m4` is the first piece of software we need in the autotools suite. It allows macros to be defined and files to be generated from those macros. diff --git a/rootfs.sh b/rootfs.sh index 32437ae..bb540fb 100755 --- a/rootfs.sh +++ b/rootfs.sh @@ -119,6 +119,9 @@ get_file https://ftp.gnu.org/gnu/coreutils/coreutils-5.0.tar.bz2 # grep 2.4 get_file https://ftp.gnu.org/gnu/grep/grep-2.4.tar.gz +# heirloom-devtools +get_file http://downloads.sourceforge.net/project/heirloom/heirloom-devtools/070527/heirloom-devtools-070527.tar.bz2 + # bash 2.05b get_file https://ftp.gnu.org/pub/gnu/bash/bash-2.05b.tar.gz diff --git a/sysa/after.kaem.run b/sysa/after.kaem.run index f504175..8390c23 100755 --- a/sysa/after.kaem.run +++ b/sysa/after.kaem.run @@ -130,6 +130,12 @@ cd ${pkg} kaem --file ${pkg}.kaem cd .. +# Part 16: heirloom-devtools +pkg="heirloom-devtools-070527" +cd ${pkg} +kaem --file ${pkg}.kaem +cd .. + # Part 17: bash pkg="bash-2.05b" cd ${pkg} diff --git a/sysa/heirloom-devtools-070527/heirloom-devtools-070527.kaem b/sysa/heirloom-devtools-070527/heirloom-devtools-070527.kaem new file mode 100755 index 0000000..9d08f15 --- /dev/null +++ b/sysa/heirloom-devtools-070527/heirloom-devtools-070527.kaem @@ -0,0 +1,39 @@ +#!/bin/sh + +set -ex + +mkdir build +cd build + +bindir=/after/bin +libdir=/after/lib +lexdir=/lex + +# Extract +bunzip2 ../src/${pkg}.tar.bz2 +tar xf ../src/${pkg}.tar ${pkg}/yacc ${pkg}/lex +cd ${pkg} + +# Prepare and patch +patch -Np0 -i ../../patches/yacc_remove_wchar.patch +patch -Np0 -i ../../patches/lex_remove_wchar.patch + +# Build yacc +cd yacc +make -f Makefile.mk CC=tcc AR=tcc\ -ar CFLAGS=-DMAXPATHLEN=100\ -DEILSEQ=84\ -DMB_LEN_MAX=100 LDFLAGS=-lgetopt RANLIB=true + +# Install yacc +install yacc ${bindir} +install -m 644 yaccpar / + +# Build lex +cd ../lex +make -f Makefile.mk CC=tcc AR=tcc\ -ar CFLAGS=-DEILSEQ=84\ -DMB_LEN_MAX=100 LDFLAGS=-lgetopt RANLIB=true + +# Install lex +mkdir ${lexdir} +install lex ${bindir} +install libl.a ${libdir} +install -m 644 ncform ${lexdir} + +cd ../../.. diff --git a/sysa/heirloom-devtools-070527/patches/lex_remove_wchar.patch b/sysa/heirloom-devtools-070527/patches/lex_remove_wchar.patch new file mode 100644 index 0000000..7f65f9d --- /dev/null +++ b/sysa/heirloom-devtools-070527/patches/lex_remove_wchar.patch @@ -0,0 +1,446 @@ +From 508eb06d40498acf954fc51ecb9171d2ce2236f6 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Andrius=20=C5=A0tikonas?= +Date: Wed, 27 Jan 2021 00:40:19 +0000 +Subject: [PATCH] Workaround for lex to work with mes libc. + +--- + lex/Makefile.mk | 2 +- + lex/allprint.c | 6 ++-- + lex/ldefs.c | 8 ----- + lex/main.c | 1 + + lex/parser.y | 77 +++++++++++++++++++++++++++++++++++-------------- + lex/reject.c | 1 - + lex/sub1.c | 44 ++++++++++++++++++---------- + lex/sub3.c | 2 +- + 8 files changed, 89 insertions(+), 52 deletions(-) + +diff --git lex/Makefile.mk lex/Makefile.mk +index 577f7cb..a413867 100644 +--- lex/Makefile.mk ++++ lex/Makefile.mk +@@ -1,4 +1,4 @@ +-XOBJ = main.o sub1.o sub2.o sub3.o header.o wcio.o parser.o getopt.o lsearch.o ++XOBJ = main.o sub1.o sub2.o sub3.o header.o parser.o getopt.o lsearch.o + + LOBJ = allprint.o libmain.o reject.o yyless.o yywrap.o \ + allprint_w.o reject_w.o yyless_w.o reject_e.o yyless_e.o +diff --git lex/allprint.c lex/allprint.c +index 6e82495..cb0c6bb 100644 +--- lex/allprint.c ++++ lex/allprint.c +@@ -42,8 +42,6 @@ + #include + #include + #endif +-#include +-#include + + extern FILE *yyout; + +@@ -78,10 +76,10 @@ allprint(CHR c) + fprintf(yyout, "\\_"); + break; + default: +- if (!iswprint(c)) ++ if (!iwprint(c)) + fprintf(yyout, "\\x%-2x", (int)c); + else +- putwc(c, yyout); ++ putc(c, yyout); + break; + } + } +diff --git lex/ldefs.c lex/ldefs.c +index ff99665..c5dcbaf 100644 +--- lex/ldefs.c ++++ lex/ldefs.c +@@ -43,7 +43,6 @@ + #ifdef __sun + #include + #endif +-#include + + #define CHR wchar_t + #define BYTE char +@@ -296,13 +295,6 @@ int mn1(int a, intptr_t d); + int mn0(int a); + int dupl(int n); + +-#undef getwc +-#define getwc(f) lex_getwc(f) +-extern wint_t lex_getwc(FILE *); +-#undef putwc +-#define putwc(c, f) lex_putwc(c, f) +-extern wint_t lex_putwc(wchar_t, FILE *); +- + #undef index + #define index lex_index + +diff --git lex/main.c lex/main.c +index 8aee8ea..52c892a 100644 +--- lex/main.c ++++ lex/main.c +@@ -38,6 +38,7 @@ + * Sccsid @(#)main.c 1.9 (gritter) 11/26/05 + */ + ++#include + #include + #include "once.h" + #include "sgs.h" +diff --git lex/parser.y lex/parser.y +index b8618e3..34a7e9a 100644 +--- lex/parser.y ++++ lex/parser.y +@@ -43,7 +43,6 @@ + void yyerror(char *); + + #include +-#include + #include + #ifndef __sun + #define wcsetno(c) 0 +@@ -289,6 +288,19 @@ r: CHAR + ; + + %% ++ ++/* ++Copy multibyte string into char string. ++Mes C library does not support wide strings, and fprintf truncates all strings to 1 character. ++This happens because wchar_t strings have 0 in a second byte. ++*/ ++int ++wstrcpy(char const *destination, wchar_t const *source) { ++ int i; ++ for (i = 0; source[i] != 0; i++) ++ destination[i]=source[i]; ++} ++ + int + yylex(void) + { +@@ -353,7 +365,7 @@ yylex(void) + (*(p+2) == 'O')) { + if(lgatflg) + error("Too late for %%pointer"); +- while(*p && !iswspace(*p)) ++ while(*p && !isspace(*p)) + p++; + isArray = 0; + continue; +@@ -397,7 +409,7 @@ yylex(void) + (*(p+2) == 'R')) { + if(lgatflg) + error("Too late for %%array"); +- while(*p && !iswspace(*p)) ++ while(*p && !isspace(*p)) + p++; + isArray = 1; + continue; +@@ -426,7 +438,7 @@ yylex(void) + if(handleeuc) + error("\ + Character table (%t) is supported only in ASCII compatibility mode.\n"); +- ZCH = wcstol(p+2, NULL, 10); ++ ZCH = strtol(p+2, NULL, 10); + if (ZCH < NCH) ZCH = NCH; + if (ZCH > 2*NCH) error("ch table needs redeclaration"); + chset = TRUE; +@@ -438,13 +450,13 @@ Character table (%t) is supported only in ASCII compatibility mode.\n"); + continue; + } + while(digit(*p)) p++; +- if(!iswspace(*p)) error("bad translation format"); +- while(iswspace(*p)) p++; ++ if(!isspace(*p)) error("bad translation format"); ++ while(isspace(*p)) p++; + t = p; + while(*t){ + c = ctrans(&t); + if(ctable[(unsigned)c]){ +- if (iswprint(c)) ++ if (isprint(c)) + warning("Character '%lc' used twice",c); + + else +@@ -485,8 +497,12 @@ Character table (%t) is supported only in ASCII compatibility mode.\n"); + while(getl(p) && scomp(p, L_PctCbr) != 0) + if(p[0]=='/' && p[1]=='*') + cpycom(p); +- else +- fprintf(fout,"%ls\n",p); ++ else { ++ char p2[100]; ++ wstrcpy(p2, p); ++ fprintf(fout,"%ls\n",p2); ++ memset(p2, 0, sizeof p2); ++ } + if(p[0] == '%') continue; + if (*p) error("EOF before %%%%"); + else error("EOF before %%}"); +@@ -501,12 +517,12 @@ Character table (%t) is supported only in ASCII compatibility mode.\n"); + start: + lgate(); + +- while(*p && !iswspace(*p) && ((*p) != (wchar_t)',')) p++; ++ while(*p && !isspace(*p) && ((*p) != (wchar_t)',')) p++; + n = TRUE; + while(n){ +- while(*p && (iswspace(*p) || ((*p) == (wchar_t)','))) p++; ++ while(*p && (isspace(*p) || ((*p) == (wchar_t)','))) p++; + t = p; +- while(*p && !iswspace(*p) && ((*p) != (wchar_t)',')) { ++ while(*p && !isspace(*p) && ((*p) != (wchar_t)',')) { + if(!isascii(*p)) + error("None-ASCII characters in start condition."); + p++; +@@ -516,7 +532,10 @@ start: + if (*t == 0) continue; + i = sptr*2; + if(!ratfor)fprintf(fout,"# "); +- fprintf(fout,"define %ls %d\n",t,i); ++ char t2[100]; ++ wstrcpy(t2, t); ++ fprintf(fout,"define %ls %d\n",t2,i); ++ memset(t2, 0, sizeof t2); + scopy(t,sp); + sname[sptr] = sp; + /* XCU4: save exclusive flag with start name */ +@@ -537,14 +556,20 @@ start: + case ' ': case '\t': /* must be code */ + lgate(); + if( p[1]=='/' && p[2]=='*' ) cpycom(p); +- else fprintf(fout, "%ls\n",p); ++ ++ else { ++ char p2[100]; ++ wstrcpy(p2, p); ++ fprintf(fout, "%ls\n",p2); ++ memset(p2, 0, sizeof p2); ++ } + continue; + case '/': /* look for comments */ + lgate(); + if((*(p+1))=='*') cpycom(p); + /* FALLTHRU */ + default: /* definition */ +- while(*p && !iswspace(*p)) p++; ++ while(*p && !isspace(*p)) p++; + if(*p == 0) + continue; + prev = *p; +@@ -557,7 +582,7 @@ start: + } + } else { /* still sect 1, but prev != '\n' */ + p = bptr; +- while(*p && iswspace(*p)) p++; ++ while(*p && isspace(*p)) p++; + if(*p == 0) + warning("No translation given - null string assumed"); + scopy(p,token); +@@ -632,8 +657,11 @@ start: + while(!eof&& getl(buf) && scomp(L_PctCbr,buf)!=0) + if(buf[0]=='/' && buf[1]=='*') + cpycom(buf); +- else +- fprintf(fout,"%ls\n",buf); ++ else { ++ char buf2[100]; ++ wstrcpy(buf2, p); ++ fprintf(fout,"%ls\n",buf2); ++ } + continue; + } + if(peek == '%'){ +@@ -944,9 +972,16 @@ Character range specified between different codesets."); + else + fprintf(fout, + "\n# line %d \"%s\"\n", yyline-1, sargv[optind]); +- fprintf(fout,"%ls\n",buf); +- while(getl(buf) && !eof) +- fprintf(fout,"%ls\n",buf); ++ char buf2[100]; ++ wstrcpy(buf2, buf); ++ fprintf(fout,"%ls\n",buf2); ++ memset(buf2, 0, sizeof buf2); ++ while(getl(buf) && !eof) { ++ wstrcpy(buf2, buf); ++ fprintf(fout,"%ls\n",buf2); ++ memset(buf2, 0, sizeof buf2); ++ } ++ memset(buf2, 0, sizeof buf2); + } + + return(freturn(0)); +diff --git lex/reject.c lex/reject.c +index 31928e7..ef08c57 100644 +--- lex/reject.c ++++ lex/reject.c +@@ -38,7 +38,6 @@ + #include + #include + #else /* !sun */ +-#include + #endif /* !sun */ + #include + #endif +diff --git lex/sub1.c lex/sub1.c +index b867948..eead84b 100644 +--- lex/sub1.c ++++ lex/sub1.c +@@ -38,7 +38,6 @@ + + #include "ldefs.c" + #include +-#include + #include + #include + +@@ -394,6 +393,19 @@ cclinter(int sw) + } + } + ++int ++mbtowc(wchar_t *pwc, const char *s, size_t n) ++{ ++ if (s != 0) { ++ if (n < 1) ++ return -1; ++ if (pwc != 0) ++ *pwc = *s & 0377; ++ return *s != '\0'; ++ } else ++ return 0; ++} ++ + int + usescape(int c) + { +@@ -546,7 +558,7 @@ cpyact(void) + break; + case ';': + if (brac == 0) { +- putwc(c, fout); ++ putc(c, fout); + putc('\n', fout); + return (1); + } +@@ -558,26 +570,26 @@ cpyact(void) + case '}': + brac--; + if (brac == 0) { +- putwc(c, fout); ++ putc(c, fout); + putc('\n', fout); + return (1); + } + break; + case '/': +- putwc(c, fout); ++ putc(c, fout); + c = gch(); + if (c != '*') + goto swt; +- putwc(c, fout); ++ putc(c, fout); + savline = yyline; + while (c = gch()) { + while (c == '*') { +- putwc(c, fout); ++ putc(c, fout); + if ((c = gch()) == '/') { + putc('/', fout); + while ((c = gch()) == ' ' || + c == '\t' || c == '\n') +- putwc(c, fout); ++ putc(c, fout); + goto swt; + } + } +@@ -590,16 +602,16 @@ cpyact(void) + case '\'': /* character constant */ + case '"': /* character string */ + mth = c; +- putwc(c, fout); ++ putc(c, fout); + while (c = gch()) { + if (c == '\\') { +- putwc(c, fout); ++ putc(c, fout); + c = gch(); + } + else + if (c == mth) + goto loop; +- putwc(c, fout); ++ putc(c, fout); + if (c == '\n') { + yyline--; + error( +@@ -620,7 +632,7 @@ cpyact(void) + loop: + if (c != ' ' && c != '\t' && c != '\n') + sw = FALSE; +- putwc(c, fout); ++ putc(c, fout); + if (peek == '\n' && !brac && copy_line) { + putc('\n', fout); + return (1); +@@ -636,7 +648,7 @@ gch(void) + int c; + prev = pres; + c = pres = peek; +- peek = pushptr > pushc ? *--pushptr : getwc(fin); ++ peek = pushptr > pushc ? *--pushptr : getc(fin); + while (peek == EOF) { + if (no_input) { + if (!yyline) +@@ -650,7 +662,7 @@ gch(void) + if (fin == NULL) + error("Cannot open file -- %s", + sargv[optind]); +- peek = getwc(fin); ++ peek = getc(fin); + } else + break; + } else { +@@ -856,11 +868,11 @@ allprint(CHR c) + printf("\\_"); + break; + default: +- if (!iswprint(c)) { ++ if (!isprint(c)) { + printf("\\x%-2x", c); /* up to fashion. */ + charc += 3; + } else +- putwc(c, stdout); ++ putc(c, stdout); + break; + } + charc++; +@@ -903,7 +915,7 @@ sect1dump(void) + allprint(i); + putchar(' '); + iswprint(ctable[i]) ? +- putwc(ctable[i], stdout) : ++ putc(ctable[i], stdout) : + printf("%d", ctable[i]); + putchar('\n'); + } +diff --git lex/sub3.c lex/sub3.c +index 186bcbc..aa07f66 100644 +--- lex/sub3.c ++++ lex/sub3.c +@@ -147,7 +147,7 @@ remch(wchar_t c) + */ + if (!handleeuc) { + if (!isascii(c)) +- if (iswprint(c)) ++ if (isprint(c)) + warning( + "Non-ASCII character '%lc' in pattern; use -w or -e lex option.", c); + else warning( +-- +2.26.2 + diff --git a/sysa/heirloom-devtools-070527/patches/yacc_remove_wchar.patch b/sysa/heirloom-devtools-070527/patches/yacc_remove_wchar.patch new file mode 100644 index 0000000..f7fa35a --- /dev/null +++ b/sysa/heirloom-devtools-070527/patches/yacc_remove_wchar.patch @@ -0,0 +1,1147 @@ +diff -U3 -r yacc/dextern yacc/dextern +--- yacc/dextern 2005-11-10 20:31:45.000000000 +0000 ++++ yacc/dextern 2021-01-25 18:21:45.286602527 +0000 +@@ -39,7 +39,6 @@ + #include + #include + #include +-#include + + /* MANIFEST CONSTANT DEFINITIONS */ + #define WORD32 +@@ -166,17 +165,17 @@ + } ITEM; + + typedef struct toksymb { +- wchar_t *name; ++ char *name; + int value; + } TOKSYMB; + + typedef struct mbclit { +- wchar_t character; ++ char character; + int tvalue; /* token issued for the character */ + } MBCLIT; + + typedef struct ntsymb { +- wchar_t *name; ++ char *name; + int tvalue; + } NTSYMB; + +@@ -212,7 +211,7 @@ + extern int nprod; /* number of productions */ + extern int **prdptr; /* pointers to descriptions of productions */ + extern int *levprd; /* contains production levels to break conflicts */ +-extern wchar_t *had_act; /* set if reduction has associated action code */ ++extern char *had_act; /* set if reduction has associated action code */ + + /* state information */ + +@@ -273,24 +272,15 @@ + extern void go2out(void); + extern void hideprod(void); + extern void callopt(void); +-extern void warray(wchar_t *, int *, int); +-extern wchar_t *symnam(int); +-extern wchar_t *writem(int *); ++extern void warray(char *, int *, int); ++extern char *symnam(int); ++extern char *writem(int *); + extern void exp_mem(int); + extern void exp_act(int **); + extern int apack(int *, int); + extern int state(int); +-extern void fprintf3(FILE *, const char *, const wchar_t *, const char *, ...); +-extern void error3(const char *, const wchar_t *, const char *, ...); +- +- /* multibyte i/o */ +- +-#undef getwc +-#define getwc(f) yacc_getwc(f) +-extern wint_t yacc_getwc(FILE *); +-#undef putwc +-#define putwc(c, f) yacc_putwc(c, f) +-extern wint_t yacc_putwc(wchar_t, FILE *); ++extern void fprintf3(FILE *, const char *, const char *, const char *, ...); ++extern void error3(const char *, const char *, const char *, ...); + + /* yaccpar location */ + +diff -U3 -r yacc/y1.c yacc/y1.c +--- yacc/y1.c 2005-11-26 17:37:56.000000000 +0000 ++++ yacc/y1.c 2021-01-25 18:02:31.251542365 +0000 +@@ -41,12 +41,11 @@ + #include + #include + #include /* For error() */ +-#include + + static void mktbls(void); + static void others(void); + static void summary(void); +-static wchar_t *chcopy(wchar_t *, wchar_t *); ++static char *chcopy(char *, char *); + static int setunion(int *, int *); + static void prlook(LOOKSETS *); + static void cpres(void); +@@ -229,13 +228,13 @@ + if (finput == NULL) + error("cannot find parser %s", parser); + +- warray(L"yyr1", levprd, nprod); ++ warray("yyr1", levprd, nprod); + + aryfil(temp1, nprod, 0); + /* had_act[i] is either 1 or 0 */ + PLOOP(1, i) + temp1[i] = ((prdptr[i+1] - prdptr[i]-2) << 1) | had_act[i]; +- warray(L"yyr2", temp1, nprod); ++ warray("yyr2", temp1, nprod); + + aryfil(temp1, nstate, -10000000); + TLOOP(i) +@@ -244,14 +243,14 @@ + NTLOOP(i) + for (j = ntstates[i]; j != 0; j = mstates[j]) + temp1[j] = -i; +- warray(L"yychk", temp1, nstate); ++ warray("yychk", temp1, nstate); + +- warray(L"yydef", defact, nstate); ++ warray("yydef", defact, nstate); + + if ((fdebug = fopen(DEBUGNAME, "r")) == NULL) + error("cannot open yacc.debug"); +- while ((c = getwc(fdebug)) != EOF) +- putwc(c, ftable); ++ while ((c = getc(fdebug)) != EOF) ++ putc(c, ftable); + fclose(fdebug); + ZAPFILE(DEBUGNAME); + +@@ -259,19 +258,19 @@ + fprintf(ftable, "# line\t1 \"%s\"\n", parser); + tmpline = 1; + /* copy parser text */ +- while ((c = getwc(finput)) != EOF) { ++ while ((c = getc(finput)) != EOF) { + if (c == '\n') + tmpline++; + if (c == L'$') { +- if ((c = getwc(finput)) != L'A') +- putwc(L'$', ftable); ++ if ((c = getc(finput)) != L'A') ++ putc(L'$', ftable); + else { /* copy actions */ + tmpline++; + faction = fopen(ACTNAME, "r"); + if (faction == NULL) + error("cannot open action tempfile"); +- while ((c = getwc(faction)) != EOF) +- putwc(c, ftable); ++ while ((c = getc(faction)) != EOF) ++ putc(c, ftable); + fclose(faction); + if (gen_lines) + fprintf(ftable, +@@ -279,18 +278,18 @@ + tmpline, + parser); + ZAPFILE(ACTNAME); +- c = getwc(finput); ++ c = getc(finput); + } + } +- putwc(c, ftable); ++ putc(c, ftable); + } + fclose(ftable); + } + + + /* copies string q into p, returning next free char ptr */ +-static wchar_t * +-chcopy(wchar_t *p, wchar_t *q) ++static char * ++chcopy(char *p, char *q) + { + while (*p = *q++) + ++p; +@@ -299,16 +298,16 @@ + + #define ISIZE 400 + /* creates output string for item pointed to by pp */ +-wchar_t * ++char * + writem(int *pp) + { + int i, *p; + static int isize = ISIZE; +- static wchar_t *sarr = NULL; +- wchar_t *q; ++ static char *sarr = NULL; ++ char *q; + + if (sarr == NULL) { +- sarr = malloc(sizeof (wchar_t) * isize); ++ sarr = malloc(sizeof (char) * isize); + if (sarr == NULL) + error("could not allocate output string array"); + for (i = 0; i < isize; ++i) +@@ -317,7 +316,7 @@ + for (p = pp; *p > 0; ++p) /* EMPTY */; + p = prdptr[-*p]; + q = chcopy(sarr, nontrst[*p-NTBASE].name); +- q = chcopy(q, L" : "); ++ q = chcopy(q, " : "); + + for (;;) { + *q++ = ++p == pp ? L'_' : L' '; +@@ -326,7 +325,7 @@ + break; + q = chcopy(q, symnam(i)); + while (q > &sarr[isize-30]) { +- static wchar_t *sarrbase; ++ static char *sarrbase; + + sarrbase = sarr; + isize += ISIZE; +@@ -339,17 +338,17 @@ + + /* an item calling for a reduction */ + if ((i = *pp) < 0) { +- q = chcopy(q, L" ("); +- swprintf(q, q + isize - sarr, L"%d)", -i); ++ q = chcopy(q, " ("); ++ sprintf(q, q + isize - sarr, "%d)", -i); + } + return (sarr); + } + + /* return a pointer to the name of symbol i */ +-wchar_t * ++char * + symnam(int i) + { +- wchar_t *cp; ++ char *cp; + + cp = (i >= NTBASE) ? nontrst[i-NTBASE].name : tokset[i].name; + if (*cp == L' ') +diff -U3 -r yacc/y2.c yacc/y2.c +--- yacc/y2.c 2005-11-26 17:39:44.000000000 +0000 ++++ yacc/y2.c 2021-01-25 19:02:52.472120036 +0000 +@@ -35,9 +35,9 @@ + * Sccsid @(#)y2.c 1.11 (gritter) 11/26/05 + */ + ++#include + #include "dextern" + #include "sgs.h" +-#include + #include + #define IDENTIFIER 257 + +@@ -66,17 +66,17 @@ + char *infile; /* input file name */ + static int numbval; /* value of an input number */ + static int toksize = NAMESIZE; +-static wchar_t *tokname; /* input token name */ ++static char *tokname; /* input token name */ + char *parser = NULL; /* location of common parser */ + + static void finact(void); +-static wchar_t *cstash(wchar_t *); ++static char *cstash(char *); + static void defout(void); + static void cpyunion(void); + static void cpycode(void); + static void cpyact(int); +-static void lhsfill(wchar_t *); +-static void rhsfill(wchar_t *); ++static void lhsfill(char *); ++static void rhsfill(char *); + static void lrprnt(void); + static void beg_debug(void); + static void end_toks(void); +@@ -85,9 +85,9 @@ + static void exp_prod(void); + static void exp_ntok(void); + static void exp_nonterm(void); +-static int defin(int, wchar_t *); ++static int defin(int, char *); + static int gettok(void); +-static int chfind(int, wchar_t *); ++static int chfind(int, char *); + static int skipcom(void); + static int findchtok(int); + static void put_prefix_define(char *); +@@ -101,11 +101,11 @@ + * points to initial block - more space + * is allocated as needed. + */ +-static wchar_t cnamesblk0[CNAMSZ]; +-static wchar_t *cnames = cnamesblk0; ++static char cnamesblk0[CNAMSZ]; ++static char *cnames = cnamesblk0; + + /* place where next name is to be put in */ +-static wchar_t *cnamp = cnamesblk0; ++static char *cnamp = cnamesblk0; + + /* number of defined symbols output */ + static int ndefout = 3; +@@ -113,7 +113,7 @@ + /* storage of types */ + static int defunion = 0; /* union of types defined? */ + static int ntypes = 0; /* number of types defined */ +-static wchar_t *typeset[NTYPES]; /* pointers to type tags */ ++static char *typeset[NTYPES]; /* pointers to type tags */ + + /* symbol tables for tokens and nonterminals */ + +@@ -143,8 +143,8 @@ + + /* output string */ + +-static wchar_t *lhstext; +-static wchar_t *rhstext; ++static char *lhstext; ++static char *rhstext; + + /* storage for grammar rules */ + +@@ -158,7 +158,7 @@ + + int **prdptr; + int *levprd; +-wchar_t *had_act; ++char *had_act; + + /* flag for generating the # line's default is yes */ + int gen_lines = 1; +@@ -181,7 +181,7 @@ + int c; + int *p; + char *cp; +- wchar_t actname[8]; ++ char actname[8]; + unsigned int options = 0; + char *file_prefix = DEFAULT_PREFIX; + char *sym_prefix = ""; +@@ -192,16 +192,16 @@ + fdefine = NULL; + i = 1; + +- tokname = malloc(sizeof (wchar_t) * toksize); ++ tokname = malloc(sizeof (char) * toksize); + tokset = malloc(sizeof (TOKSYMB) * ntoksz); + toklev = malloc(sizeof (int) * ntoksz); + nontrst = malloc(sizeof (NTSYMB) * nnontersz); + mem0 = malloc(sizeof (int) * new_memsize); + prdptr = malloc(sizeof (int *) * (nprodsz+2)); + levprd = malloc(sizeof (int) * (nprodsz+2)); +- had_act = calloc(nprodsz + 2, sizeof (wchar_t)); +- lhstext = malloc(sizeof (wchar_t) * LHS_TEXT_LEN); +- rhstext = malloc(sizeof (wchar_t) * RHS_TEXT_LEN); ++ had_act = calloc(nprodsz + 2, sizeof (char)); ++ lhstext = malloc(sizeof (char) * LHS_TEXT_LEN); ++ rhstext = malloc(sizeof (char) * RHS_TEXT_LEN); + aryfil(toklev, ntoksz, 0); + aryfil(levprd, nprodsz, 0); + for (ii = 0; ii < ntoksz; ++ii) +@@ -307,10 +307,10 @@ + + lineno = 1; + cnamp = cnames; +- defin(0, L"$end"); ++ defin(0, "$end"); + extval = 0400; +- defin(0, L"error"); +- defin(1, L"$accept"); ++ defin(0, "error"); ++ defin(1, "$accept"); + mem = mem0; + lev = 0; + ty = 0; +@@ -588,7 +588,7 @@ + /* process a rule */ + + if (t == L'|') { +- rhsfill((wchar_t *)0); /* restart fill of rhs */ ++ rhsfill((char *)0); /* restart fill of rhs */ + *mem = *prdptr[nprod-1]; + if (++mem >= &tracemem[new_memsize]) + exp_mem(1); +@@ -638,8 +638,8 @@ + /* action within rule... */ + + lrprnt(); /* dump lhs, rhs */ +- swprintf(actname, sizeof actname, +- L"$$%d", nprod); ++ sprintf(actname, sizeof actname, ++ "$$%d", nprod); + /* + * make it nonterminal + */ +@@ -722,8 +722,8 @@ + if (gen_lines) + fprintf(ftable, "\n# line %d \"%s\"\n", + lineno, infile); +- while ((c = getwc(finput)) != EOF) +- putwc(c, ftable); ++ while ((c = getc(finput)) != EOF) ++ putc(c, ftable); + } + fclose(finput); + } +@@ -736,15 +736,15 @@ + fprintf(ftable, "# define YYERRCODE %d\n", tokset[2].value); + } + +-static wchar_t * ++static char * + cstash(s) +-register wchar_t *s; ++register char *s; + { +- wchar_t *temp; ++ char *temp; + static int used = 0; + static int used_save = 0; + static int exp_cname = CNAMSZ; +- int len = wcslen(s); ++ int len = strlen(s); + + /* + * 2/29/88 - +@@ -755,7 +755,7 @@ + exp_cname += CNAMSZ; + if (!used) + free(cnames); +- if ((cnames = malloc(sizeof (wchar_t)*exp_cname)) == NULL) ++ if ((cnames = malloc(sizeof (char)*exp_cname)) == NULL) + error("cannot expand string dump"); + cnamp = cnames; + used = 0; +@@ -770,7 +770,7 @@ + } + + static int +-defin(int t, register wchar_t *s) ++defin(int t, register char *s) + { + /* define s to be a terminal if t=0 or a nonterminal if t=1 */ + +@@ -820,7 +820,7 @@ + } else if (s[2] <= L'7' && s[2] >= L'0') { /* \nnn sequence */ + int i = 3; + val = s[2] - L'0'; +- while (iswdigit(s[i]) && i <= 4) { ++ while (isdigit(s[i]) && i <= 4) { + if (s[i] >= L'0' && s[i] <= L'7') + val = val * 8 + s[i] - L'0'; + else +@@ -831,17 +831,17 @@ + error("illegal \\nnn construction"); + if (val > 255) + error( +-"\\nnn exceed \\377; use \\xnnnnnnnn for wchar_t value of multibyte char"); ++"\\nnn exceed \\377; use \\xnnnnnnnn for char value of multibyte char"); + if (val == 0 && i >= 4) + error("'\\000' is illegal"); + } else if (s[2] == L'x') { /* hexadecimal \xnnn sequence */ + int i = 3; + val = 0; + warning(1, "\\x is ANSI C hex escape"); +- if (iswxdigit(s[i])) +- while (iswxdigit(s[i])) { ++ if (isxdigit(s[i])) ++ while (isxdigit(s[i])) { + int tmpval; +- if (iswdigit(s[i])) ++ if (isdigit(s[i])) + tmpval = s[i] - L'0'; + else if (s[i] >= L'a') + tmpval = s[i] - L'a' + 10; +@@ -876,7 +876,7 @@ + /* write out the defines (at the end of the declaration section) */ + + register int i, c; +- register wchar_t *cp; ++ register char *cp; + + for (i = ndefout; i <= ntokens; ++i) { + +@@ -889,8 +889,8 @@ + } + + for (; (c = *cp) != 0; ++cp) { +- if (iswlower(c) || iswupper(c) || +- iswdigit(c) || c == L'_') /* EMPTY */; ++ if (islower(c) || isupper(c) || ++ isdigit(c) || c == L'_') /* EMPTY */; + else + goto nodef; + } +@@ -919,14 +919,14 @@ + reserve = 0; + lineno += peekline; + peekline = 0; +- c = getwc(finput); ++ c = getc(finput); + /* + * while (c == ' ' || c == '\n' || c == '\t' || c == '\f') { + */ +- while (iswspace(c)) { ++ while (isspace(c)) { + if (c == L'\n') + ++lineno; +- c = getwc(finput); ++ c = getc(finput); + } + if (c == L'/') { /* skip comment */ + lineno += skipcom(); +@@ -938,11 +938,11 @@ + case EOF: + return (ENDFILE); + case L'{': +- ungetwc(c, finput); ++ ungetc(c, finput); + return (L'='); /* action ... */ + case L'<': /* get, and look up, a type name (union member name) */ + i = 0; +- while ((c = getwc(finput)) != L'>' && ++ while ((c = getc(finput)) != L'>' && + c != EOF && c != L'\n') { + tokname[i] = c; + if (++i >= toksize) +@@ -954,7 +954,7 @@ + if (i == 0) + error("missing type name in < ... > clause"); + for (i = 1; i <= ntypes; ++i) { +- if (!wcscmp(typeset[i], tokname)) { ++ if (!strcmp(typeset[i], tokname)) { + numbval = i; + return (TYPENAME); + } +@@ -968,11 +968,11 @@ + tokname[0] = L' '; + i = 1; + for (;;) { +- c = getwc(finput); ++ c = getc(finput); + if (c == L'\n' || c == EOF) + error("illegal or missing ' or \""); + if (c == L'\\') { +- c = getwc(finput); ++ c = getc(finput); + tokname[i] = L'\\'; + if (++i >= toksize) + exp_tokname(); +@@ -986,7 +986,7 @@ + case L'%': + case L'\\': + +- switch (c = getwc(finput)) { ++ switch (c = getc(finput)) { + + case L'0': return (TERM); + case L'<': return (LEFT); +@@ -1001,81 +1001,81 @@ + + default: + +- if (iswdigit(c)) { /* number */ ++ if (isdigit(c)) { /* number */ + numbval = c - L'0'; + base = (c == L'0') ? 8 : 10; +- for (c = getwc(finput); +- iswdigit(c); +- c = getwc(finput)) { ++ for (c = getc(finput); ++ isdigit(c); ++ c = getc(finput)) { + numbval = numbval*base + c - L'0'; + } +- ungetwc(c, finput); ++ ungetc(c, finput); + return (NUMBER); +- } else if (iswlower(c) || iswupper(c) || ++ } else if (islower(c) || isupper(c) || + c == L'_' || c == L'.' || + c == L'$') { + i = 0; +- while (iswlower(c) || iswupper(c) || +- iswdigit(c) || c == L'_' || ++ while (islower(c) || isupper(c) || ++ isdigit(c) || c == L'_' || + c == L'.' || c == L'$') { + tokname[i] = c; +- if (reserve && iswupper(c)) +- tokname[i] = towlower(c); ++ if (reserve && isupper(c)) ++ tokname[i] = tolower(c); + if (++i >= toksize) + exp_tokname(); +- c = getwc(finput); ++ c = getc(finput); + } + } + else + return (c); + +- ungetwc(c, finput); ++ ungetc(c, finput); + } + + tokname[i] = 0; + + if (reserve) { /* find a reserved word */ +- if (!wcscmp(tokname, L"term")) ++ if (!strcmp(tokname, "term")) + return (TERM); +- if (!wcscmp(tokname, L"token")) ++ if (!strcmp(tokname, "token")) + return (TERM); +- if (!wcscmp(tokname, L"left")) ++ if (!strcmp(tokname, "left")) + return (LEFT); +- if (!wcscmp(tokname, L"nonassoc")) ++ if (!strcmp(tokname, "nonassoc")) + return (BINARY); +- if (!wcscmp(tokname, L"binary")) ++ if (!strcmp(tokname, "binary")) + return (BINARY); +- if (!wcscmp(tokname, L"right")) ++ if (!strcmp(tokname, "right")) + return (RIGHT); +- if (!wcscmp(tokname, L"prec")) ++ if (!strcmp(tokname, "prec")) + return (PREC); +- if (!wcscmp(tokname, L"start")) ++ if (!strcmp(tokname, "start")) + return (START); +- if (!wcscmp(tokname, L"type")) ++ if (!strcmp(tokname, "type")) + return (TYPEDEF); +- if (!wcscmp(tokname, L"union")) ++ if (!strcmp(tokname, "union")) + return (UNION); + error("invalid escape, or illegal reserved word: %ls", tokname); + } + + /* look ahead to distinguish IDENTIFIER from C_IDENTIFIER */ + +- c = getwc(finput); ++ c = getc(finput); + /* + * while (c == ' ' || c == '\t' || c == '\n' || c == '\f' || c == '/') + * { + */ +- while (iswspace(c) || c == L'/') { ++ while (isspace(c) || c == L'/') { + if (c == L'\n') { + ++peekline; + } else if (c == L'/') { /* look for comments */ + peekline += skipcom(); + } +- c = getwc(finput); ++ c = getc(finput); + } + if (c == L':') + return (C_IDENTIFIER); +- ungetwc(c, finput); ++ ungetc(c, finput); + return (IDENTIFIER); + } + +@@ -1096,19 +1096,19 @@ + } + + static int +-chfind(int t, register wchar_t *s) ++chfind(int t, register char *s) + { + int i; + + if (s[0] == ' ') + t = 0; + TLOOP(i) { +- if (!wcscmp(s, tokset[i].name)) { ++ if (!strcmp(s, tokset[i].name)) { + return (i); + } + } + NTLOOP(i) { +- if (!wcscmp(s, nontrst[i].name)) { ++ if (!strcmp(s, nontrst[i].name)) { + return (i + NTBASE); + } + } +@@ -1137,11 +1137,11 @@ + + level = 0; + for (;;) { +- if ((c = getwc(finput)) == EOF) ++ if ((c = getc(finput)) == EOF) + error("EOF encountered while processing %%union"); +- putwc(c, ftable); ++ putc(c, ftable); + if (fdefine) +- putwc(c, fdefine); ++ putc(c, fdefine); + + switch (c) { + +@@ -1172,29 +1172,29 @@ + /* copies code between \{ and \} */ + + int c; +- c = getwc(finput); ++ c = getc(finput); + if (c == L'\n') { +- c = getwc(finput); ++ c = getc(finput); + lineno++; + } + if (gen_lines) + fprintf(ftable, "\n# line %d \"%s\"\n", lineno, infile); + while (c != EOF) { + if (c == L'\\') { +- if ((c = getwc(finput)) == L'}') ++ if ((c = getc(finput)) == L'}') + return; + else +- putwc(L'\\', ftable); ++ putc(L'\\', ftable); + } else if (c == L'%') { +- if ((c = getwc(finput)) == L'}') ++ if ((c = getc(finput)) == L'}') + return; + else +- putwc(L'%', ftable); ++ putc(L'%', ftable); + } +- putwc(c, ftable); ++ putc(c, ftable); + if (c == L'\n') + ++lineno; +- c = getwc(finput); ++ c = getc(finput); + } + error("eof before %%}"); + } +@@ -1207,17 +1207,17 @@ + + /* skipcom is called after reading a / */ + +- if (getwc(finput) != L'*') ++ if (getc(finput) != L'*') + error("illegal comment"); +- c = getwc(finput); ++ c = getc(finput); + while (c != EOF) { + while (c == L'*') { +- if ((c = getwc(finput)) == L'/') ++ if ((c = getc(finput)) == L'/') + return (i); + } + if (c == L'\n') + ++i; +- c = getwc(finput); ++ c = getc(finput); + } + error("EOF inside comment"); + /* NOTREACHED */ +@@ -1229,7 +1229,7 @@ + { + /* copy C action to the next ; or closing } */ + int brac, c, match, i, t, j, s, tok, argument, m; +- wchar_t id_name[NAMESIZE+1]; ++ char id_name[NAMESIZE+1]; + int id_idx = 0; + + if (gen_lines) { +@@ -1239,12 +1239,12 @@ + brac = 0; + id_name[0] = 0; + loop: +- c = getwc(finput); ++ c = getc(finput); + swt: + switch (c) { + case L';': + if (brac == 0) { +- putwc(c, faction); ++ putc(c, faction); + return; + } + goto lcopy; +@@ -1255,13 +1255,13 @@ + s = 1; + tok = -1; + argument = 1; +- while ((c = getwc(finput)) == L' ' || c == L'\t') /* EMPTY */; ++ while ((c = getc(finput)) == L' ' || c == L'\t') /* EMPTY */; + if (c == L'<') { /* type description */ +- ungetwc(c, finput); ++ ungetc(c, finput); + if (gettok() != TYPENAME) + error("bad syntax on $ clause"); + tok = numbval; +- c = getwc(finput); ++ c = getc(finput); + } + if (c == L'$') { + fprintf(faction, "yyval"); +@@ -1272,10 +1272,10 @@ + } + goto loop; + } +- if (iswalpha(c)) { ++ if (isalpha(c)) { + int same = 0; + int id_sw = 0; +- ungetwc(c, finput); ++ ungetc(c, finput); + if (gettok() != IDENTIFIER) + error("bad action format"); + /* +@@ -1290,16 +1290,16 @@ + id_sw = 1; + else + id_sw = 0; +- while ((c = getwc(finput)) == L' ' || ++ while ((c = getc(finput)) == L' ' || + c == L'\t') /* EMPTY */; + if (c == L'#') { +- while ((c = getwc(finput)) == L' ' || ++ while ((c = getc(finput)) == L' ' || + c == L'\t') /* EMPTY */; +- if (iswdigit(c)) { ++ if (isdigit(c)) { + m = 0; +- while (iswdigit(c)) { ++ while (isdigit(c)) { + m = m*10+c-L'0'; +- c = getwc(finput); ++ c = getc(finput); + } + argument = m; + } else +@@ -1339,13 +1339,13 @@ + } + if (c == '-') { + s = -s; +- c = getwc(finput); ++ c = getc(finput); + } +- if (iswdigit(c)) { ++ if (isdigit(c)) { + j = 0; +- while (iswdigit(c)) { ++ while (isdigit(c)) { + j = j*10 + c - L'0'; +- c = getwc(finput); ++ c = getc(finput); + } + j = j*s - offset; + if (j > 0) { +@@ -1363,51 +1363,51 @@ + } + goto swt; + } +- putwc(L'$', faction); ++ putc(L'$', faction); + if (s < 0) +- putwc(L'-', faction); ++ putc(L'-', faction); + goto swt; + case L'}': + if (--brac) + goto lcopy; +- putwc(c, faction); ++ putc(c, faction); + return; + case L'/': /* look for comments */ +- putwc(c, faction); +- c = getwc(finput); ++ putc(c, faction); ++ c = getc(finput); + if (c != L'*') + goto swt; + /* it really is a comment */ +- putwc(c, faction); +- c = getwc(finput); ++ putc(c, faction); ++ c = getc(finput); + while (c != EOF) { + while (c == L'*') { +- putwc(c, faction); +- if ((c = getwc(finput)) == L'/') ++ putc(c, faction); ++ if ((c = getc(finput)) == L'/') + goto lcopy; + } +- putwc(c, faction); ++ putc(c, faction); + if (c == L'\n') + ++lineno; +- c = getwc(finput); ++ c = getc(finput); + } + error("EOF inside comment"); + /* FALLTHRU */ + case L'\'': /* character constant */ + case L'"': /* character string */ + match = c; +- putwc(c, faction); +- while ((c = getwc(finput)) != EOF) { ++ putc(c, faction); ++ while ((c = getc(finput)) != EOF) { + if (c == L'\\') { +- putwc(c, faction); +- c = getwc(finput); ++ putc(c, faction); ++ c = getc(finput); + if (c == L'\n') + ++lineno; + } else if (c == match) + goto lcopy; + else if (c == L'\n') + error("newline in string or char. const."); +- putwc(c, faction); ++ putc(c, faction); + } + error("EOF in string or character constant"); + /* FALLTHRU */ +@@ -1419,7 +1419,7 @@ + goto lcopy; + } + lcopy: +- putwc(c, faction); ++ putc(c, faction); + /* + * Save the possible identifier name. + * Used to print out a warning message. +@@ -1434,7 +1434,7 @@ + * If c has a possibility to be a + * part of identifier, save it. + */ +- else if (iswalnum(c) || c == L'_') { ++ else if (isalnum(c) || c == L'_') { + id_name[id_idx++] = c; + id_name[id_idx] = 0; + } else { +@@ -1446,28 +1446,28 @@ + + static void + lhsfill(s) /* new rule, dump old (if exists), restart strings */ +-wchar_t *s; ++char *s; + { + static int lhs_len = LHS_TEXT_LEN; +- int s_lhs = wcslen(s); ++ int s_lhs = strlen(s); + if (s_lhs >= lhs_len) { + lhs_len = s_lhs + 2; +- lhstext = realloc(lhstext, sizeof (wchar_t)*lhs_len); ++ lhstext = realloc(lhstext, sizeof (char)*lhs_len); + if (lhstext == NULL) + error("couldn't expanded LHS length"); + } + rhsfill(NULL); +- wcscpy(lhstext, s); /* don't worry about too long of a name */ ++ strcpy(lhstext, s); /* don't worry about too long of a name */ + } + + static void +-rhsfill(wchar_t *s) /* either name or 0 */ ++rhsfill(char *s) /* either name or 0 */ + { +- static wchar_t *loc; /* next free location in rhstext */ ++ static char *loc; /* next free location in rhstext */ + static int rhs_len = RHS_TEXT_LEN; + static int used = 0; +- int s_rhs = (s == NULL ? 0 : wcslen(s)); +- register wchar_t *p; ++ int s_rhs = (s == NULL ? 0 : strlen(s)); ++ register char *p; + + if (!s) /* print out and erase old text */ + { +@@ -1481,10 +1481,10 @@ + + used = loc - rhstext; + if ((s_rhs + 3) >= (rhs_len - used)) { +- static wchar_t *textbase; ++ static char *textbase; + textbase = rhstext; + rhs_len += s_rhs + RHS_TEXT_LEN; +- rhstext = realloc(rhstext, sizeof (wchar_t)*rhs_len); ++ rhstext = realloc(rhstext, sizeof (char)*rhs_len); + if (rhstext == NULL) + error("couldn't expanded RHS length"); + loc = loc - textbase + rhstext; +@@ -1508,15 +1508,15 @@ + static void + lrprnt (void) /* print out the left and right hand sides */ + { +- wchar_t *rhs; +- wchar_t *m_rhs = NULL; ++ char *rhs; ++ char *m_rhs = NULL; + + if (!*rhstext) /* empty rhs - print usual comment */ +- rhs = L" /* empty */"; ++ rhs = " /* empty */"; + else { + int idx1; /* tmp idx used to find if there are d_quotes */ + int idx2; /* tmp idx used to generate escaped string */ +- wchar_t *p; ++ char *p; + /* + * Check if there are any double quote in RHS. + */ +@@ -1525,8 +1525,8 @@ + /* + * A double quote is found. + */ +- idx2 = wcslen(rhstext)*2; +- p = m_rhs = malloc((idx2 + 1)*sizeof (wchar_t)); ++ idx2 = strlen(rhstext)*2; ++ p = m_rhs = malloc((idx2 + 1)*sizeof (char)); + if (m_rhs == NULL) + error( + "Couldn't allocate memory for RHS."); +@@ -1617,7 +1617,7 @@ + exp_tokname(void) + { + toksize += NAMESIZE; +- tokname = realloc(tokname, sizeof (wchar_t) * toksize); ++ tokname = realloc(tokname, sizeof (char) * toksize); + } + + +@@ -1633,7 +1633,7 @@ + + prdptr = realloc(prdptr, sizeof (int *) * (nprodsz+2)); + levprd = realloc(levprd, sizeof (int) * (nprodsz+2)); +- had_act = realloc(had_act, sizeof (wchar_t) * (nprodsz+2)); ++ had_act = realloc(had_act, sizeof (char) * (nprodsz+2)); + for (i = nprodsz-NPROD; i < nprodsz+2; ++i) + had_act[i] = 0; + +diff -U3 -r yacc/y3.c yacc/y3.c +--- yacc/y3.c 2005-11-26 17:37:56.000000000 +0000 ++++ yacc/y3.c 2021-01-25 19:01:48.390375872 +0000 +@@ -41,7 +41,7 @@ + static void precftn(int, int, int); + static void wract(int); + static void wrstate(int); +-static void wdef(wchar_t *, int); ++static void wdef(char *, int); + #ifndef NOLIBW + static void wrmbchars(void); + #endif /* !NOLIBW */ +@@ -121,7 +121,7 @@ + } + + fprintf(ftable, "\t};\n"); +- wdef(L"YYNPROD", nprod); ++ wdef("YYNPROD", nprod); + #ifndef NOLIBW + if (nmbchars > 0) { + wrmbchars(); +@@ -485,14 +485,14 @@ + } + + static void +-wdef(wchar_t *s, int n) ++wdef(char *s, int n) + { + /* output a definition of s to the value n */ + fprintf(ftable, "# define %ls %d\n", s, n); + } + + void +-warray(wchar_t *s, int *v, int n) ++warray(char *s, int *v, int n) + { + register int i; + fprintf(ftable, "static YYCONST yytabelem %ls[]={\n", s); +@@ -549,11 +549,11 @@ + wrmbchars(void) + { + int i; +- wdef(L"YYNMBCHARS", nmbchars); ++ wdef("YYNMBCHARS", nmbchars); + qsort(mbchars, nmbchars, sizeof (*mbchars), + (int (*)(const void *, const void *))cmpmbchars); + fprintf(ftable, +- "static struct{\n\twchar_t character;" ++ "static struct{\n\tchar character;" + "\n\tint tvalue;\n}yymbchars[YYNMBCHARS]={\n"); + for (i = 0; i < nmbchars; ++i) { + fprintf(ftable, "\t{%#x,%d}", +diff -U3 -r yacc/y4.c yacc/y4.c +--- yacc/y4.c 2005-11-26 17:37:56.000000000 +0000 ++++ yacc/y4.c 2021-01-25 19:02:06.780876425 +0000 +@@ -36,7 +36,6 @@ + */ + + #include "dextern" +-#include + #include + #define NOMORE -1000 + +@@ -44,7 +43,7 @@ + static void stin(int); + static void osummary(void); + static void aoutput(void); +-static void arout(wchar_t *, int *, int); ++static void arout(char *, int *, int); + static int nxti(void); + static int gtnm(void); + +@@ -414,13 +413,13 @@ + /* write out the optimized parser */ + + fprintf(ftable, "# define YYLAST %d\n", maxa-amem + 1); +- arout(L"yyact", amem, (maxa - amem) + 1); +- arout(L"yypact", indgo, nstate); +- arout(L"yypgo", pgo, nnonter + 1); ++ arout("yyact", amem, (maxa - amem) + 1); ++ arout("yypact", indgo, nstate); ++ arout("yypgo", pgo, nnonter + 1); + } + + static void +-arout(wchar_t *s, int *v, int n) ++arout(char *s, int *v, int n) + { + register int i; + +@@ -448,8 +447,8 @@ + s = 1; + val = 0; + +- while ((c = getwc(finput)) != EOF) { +- if (iswdigit(c)) ++ while ((c = getc(finput)) != EOF) { ++ if (isdigit(c)) + val = val * 10 + c - L'0'; + else if (c == L'-') + s = -1; +diff -U3 -r yacc/Makefile.mk yacc/Makefile.mk +--- yacc/Makefile.mk 2007-01-04 23:31:24.000000000 +0000 ++++ yacc/Makefile.mk 2021-01-25 01:25:15.592235579 +0000 +@@ -1,4 +1,4 @@ +-YOBJ = y1.o y2.o y3.o y4.o y5.o getopt.o ++YOBJ = y1.o y2.o y3.o y4.o getopt.o + + LOBJ = libmai.o libzer.o + diff --git a/sysa/heirloom-devtools-070527/src/.placeholder b/sysa/heirloom-devtools-070527/src/.placeholder new file mode 100644 index 0000000..e69de29