commit: c951d76a8a780f78c3f75885276144b9e0a37875
parent 89ca88eaea2990af694cb2fbe0df6012db558422
Author: Andrius Štikonas <andrius@stikonas.eu>
Date: Tue, 26 Jan 2021 22:22:56 +0000
Add heirloom lex.
Diffstat:
2 files changed, 459 insertions(+), 0 deletions(-)
diff --git a/sysa/heirloom-devtools-070527/heirloom-devtools-070527.kaem b/sysa/heirloom-devtools-070527/heirloom-devtools-070527.kaem
@@ -6,6 +6,8 @@ mkdir build
cd build
bindir=/after/bin
+libdir=/after/lib
+lexdir=/lex
# Extract
bunzip2 ../src/${pkg}.tar.bz2
@@ -14,6 +16,7 @@ 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
@@ -23,4 +26,14 @@ make -f Makefile.mk CC=tcc AR=tcc\ -ar CFLAGS=-DMAXPATHLEN=100\ -DEILSEQ=84\ -DM
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
@@ -0,0 +1,446 @@
+From 508eb06d40498acf954fc51ecb9171d2ce2236f6 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andrius=20=C5=A0tikonas?= <andrius@stikonas.eu>
+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 <sys/euc.h>
+ #include <widec.h>
+ #endif
+-#include <wctype.h>
+-#include <wchar.h>
+
+ 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 <widec.h>
+ #endif
+-#include <wctype.h>
+
+ #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 <getopt.h>
+ #include <string.h>
+ #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 <ctype.h>
+-#include <wchar.h>
+ #include <inttypes.h>
+ #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 <euc.h>
+ #include <widec.h>
+ #else /* !sun */
+-#include <wchar.h>
+ #endif /* !sun */
+ #include <limits.h>
+ #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 <limits.h>
+-#include <wchar.h>
+ #include <ctype.h>
+ #include <stdarg.h>
+
+@@ -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
+