From c951d76a8a780f78c3f75885276144b9e0a37875 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrius=20=C5=A0tikonas?= Date: Tue, 26 Jan 2021 22:22:56 +0000 Subject: [PATCH] Add heirloom lex. --- .../heirloom-devtools-070527.kaem | 13 + .../patches/lex_remove_wchar.patch | 446 ++++++++++++++++++ 2 files changed, 459 insertions(+) create mode 100644 sysa/heirloom-devtools-070527/patches/lex_remove_wchar.patch diff --git a/sysa/heirloom-devtools-070527/heirloom-devtools-070527.kaem b/sysa/heirloom-devtools-070527/heirloom-devtools-070527.kaem index 35e1b11..9d08f15 100755 --- 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 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 +