support for long strings

This commit is contained in:
ceriel 1990-08-01 14:30:45 +00:00
parent f4e1a15dfb
commit e0ff37aa6e
7 changed files with 91 additions and 110 deletions

View file

@ -58,8 +58,8 @@ extern char temppath[50];
extern FILE *input; extern FILE *input;
extern FILE *tempfile; extern FILE *tempfile;
extern char stringbuf[STRINGMAX]; extern char *stringbuf; /* contains last string value */
/* contains last string value */ extern int stringlen; /* contains length of last string value */
extern sect_t sect[SECTMAX]; extern sect_t sect[SECTMAX];
@ -116,6 +116,7 @@ extern FILE *fftemp();
extern long atol(); extern long atol();
extern char *mktemp(); extern char *mktemp();
extern char *malloc(); extern char *malloc();
extern char *realloc();
extern char *calloc(); extern char *calloc();
extern char *getenv(); extern char *getenv();
extern char *strncpy(); extern char *strncpy();

View file

@ -128,7 +128,7 @@ program : /* empty */
{ lineno++; LISTLINE(1); RELODONE;} { lineno++; LISTLINE(1); RELODONE;}
| program '#' NUMBER STRING '\n' | program '#' NUMBER STRING '\n'
{ lineno = $3; { lineno = $3;
if (modulename) strncpy(modulename, &stringbuf[1], STRINGMAX-1); if (modulename) strncpy(modulename, stringbuf, STRINGMAX-1);
LISTLINE(1); RELODONE; LISTLINE(1); RELODONE;
} }
| program error '\n' | program error '\n'
@ -196,7 +196,7 @@ operation
#endif #endif
newsymb( newsymb(
*(stringbuf+1) ? stringbuf+1 : (char *) 0, *stringbuf ? stringbuf : (char *) 0,
(short)( (short)(
($4.typ & (S_EXT|S_TYP)) ($4.typ & (S_EXT|S_TYP))
| |
@ -210,7 +210,7 @@ operation
| SYMD STRING ',' absexp ',' absexp | SYMD STRING ',' absexp ',' absexp
{ if ((sflag & SYM_SMB) && PASS_SYMB) { { if ((sflag & SYM_SMB) && PASS_SYMB) {
newsymb( newsymb(
*(stringbuf+1) ? stringbuf+1 : (char *) 0, *stringbuf ? stringbuf : (char *) 0,
(short)( (short)(
(DOTTYP & (S_EXT|S_TYP)) (DOTTYP & (S_EXT|S_TYP))
| |
@ -239,7 +239,7 @@ operation
{ if ((sflag & SYM_LIN) && PASS_SYMB) { { if ((sflag & SYM_LIN) && PASS_SYMB) {
hllino = 0; hllino = 0;
newsymb( newsymb(
stringbuf+1, stringbuf,
(short)(DOTTYP | S_FIL), (short)(DOTTYP | S_FIL),
(short)0, (short)0,
(valu_t)DOTVAL (valu_t)DOTVAL
@ -295,9 +295,9 @@ expr : error
$$.typ = $1->i_type & ~S_EXT; $$.typ = $1->i_type & ~S_EXT;
} }
| STRING | STRING
{ if (stringbuf[0] != 1) { if (stringlen != 1)
serror("too many chars"); serror("too many chars");
$$.val = stringbuf[1]; $$.val = stringbuf[0];
$$.typ = S_ABS; $$.typ = S_ABS;
} }
| ASC_LPAR expr ASC_RPAR | ASC_LPAR expr ASC_RPAR

View file

@ -105,8 +105,23 @@ putval(c)
p = (char *) &yylval.y_strp; break; p = (char *) &yylval.y_strp; break;
#endif #endif
case STRING: case STRING:
v = stringlen;
putc(c-128, tempfile);
for (n = 0; n < sizeof(v); n++) {
if (v == 0)
break;
v >>= 8;
}
c = NUMBER0 + n;
putc(c-128, tempfile);
v = stringlen;
while (--n >= 0)
putc((int) (v >> (n*8)), tempfile);
p = stringbuf; p = stringbuf;
n = (*p & 0377) + 1; break; n = stringlen;
while (--n >= 0)
putc(*p++, tempfile);
return;
case OP_EQ: case OP_EQ:
case OP_NE: case OP_NE:
case OP_LE: case OP_LE:
@ -166,8 +181,10 @@ getval(c)
p = (char *) &yylval.y_strp; break; p = (char *) &yylval.y_strp; break;
#endif #endif
case STRING: case STRING:
getval(getc(tempfile)+128);
stringlen = n = yylval.y_valu;
p = stringbuf; p = stringbuf;
*p++ = n = getc(tempfile); p[n] = '\0'; break; p[n] = '\0'; break;
case OP_EQ: case OP_EQ:
case OP_NE: case OP_NE:
case OP_LE: case OP_LE:
@ -346,8 +363,15 @@ instring(termc)
{ {
register char *p; register char *p;
register c; register c;
static int maxstring = 0;
p = stringbuf+1; if (! maxstring) {
maxstring = STRINGMAX;
if ((stringbuf = malloc(maxstring)) == 0) {
fatal("out of memory");
}
}
p = stringbuf;
for (;;) { for (;;) {
c = nextchar(); c = nextchar();
if (c == '\n' || c == '\0') { if (c == '\n' || c == '\0') {
@ -359,11 +383,17 @@ instring(termc)
break; break;
if (c == '\\') if (c == '\\')
c = inescape(); c = inescape();
if (p >= &stringbuf[STRINGMAX - 1]) if (p >= &stringbuf[maxstring - 1]) {
fatal("string buffer overflow"); int cnt = p - stringbuf;
if ((stringbuf = realloc(stringbuf, maxstring += 256)) == 0) {
fatal("out of memory");
}
p = stringbuf + cnt;
}
*p++ = c; *p++ = c;
} }
stringbuf[0] = p - stringbuf - 1; stringlen = p - stringbuf;
*p = '\0'; *p = '\0';
return(STRING); return(STRING);
} }

View file

@ -306,7 +306,7 @@ emitstr(zero)
register char *p; register char *p;
p = stringbuf; p = stringbuf;
i = *p++ & 0377; i = stringlen;
while (--i >= 0) while (--i >= 0)
emit1(*p++); emit1(*p++);
if (zero) if (zero)

View file

@ -18,6 +18,7 @@
*/ */
#include <assert.h> #include <assert.h>
#include <alloc.h>
#include <system.h> #include <system.h>
#include <em_label.h> #include <em_label.h>
#include <em_arith.h> #include <em_arith.h>
@ -60,29 +61,21 @@ _fill()
} }
} }
#define STRSIZ 256 /* Maximum length of strings */
static struct e_instr *emhead; /* Where we put the head */ static struct e_instr *emhead; /* Where we put the head */
static struct e_instr aheads[3]; static struct e_instr aheads[3];
static int ahead; static int ahead;
static struct string { static struct string {
int length; int length;
char str[STRSIZ + 1]; unsigned int maxlen;
char *str;
} string; } string;
#ifdef COMPACT
static arith strleft; /* count # of chars left to read
in a string
*/
#endif
static int state; /* What state are we in? */ static int state; /* What state are we in? */
#define CON 01 /* Reading a CON */ #define CON 01 /* Reading a CON */
#define ROM 02 /* Reading a ROM */ #define ROM 02 /* Reading a ROM */
#define MES 03 /* Reading a MES */ #define MES 03 /* Reading a MES */
#define PSEUMASK 03 #define PSEUMASK 03
#define INSTRING 010 /* Reading a string */
static int EM_initialized; /* EM_open called? */ static int EM_initialized; /* EM_open called? */
@ -399,35 +392,6 @@ EM_getinstr(p)
return EM_error == 0; return EM_error == 0;
} }
if (state & INSTRING) { /* We already delivered part of a string.
Deliver the next part
*/
register struct string *s;
s = getstring(0);
p->em_argtype = str_ptyp;
p->em_string = s->str;
p->em_size = s->length;
switch(state & PSEUMASK) {
default:
assert(0);
case MES:
if (!EM_error)
EM_error = "String too long in message";
p->em_type = EM_MESARG;
break;
case CON:
p->em_type = EM_PSEU;
p->em_opcode = ps_con;
break;
case ROM:
p->em_type = EM_PSEU;
p->em_opcode = ps_rom;
break;
}
return EM_error == 0;
}
/* Here, we are in a state reading arguments */ /* Here, we are in a state reading arguments */
getarg(any_ptyp, &(p->em_arg)); getarg(any_ptyp, &(p->em_arg));
if (EM_error && p->em_type != EM_FATAL) { if (EM_error && p->em_type != EM_FATAL) {

View file

@ -3,7 +3,7 @@
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
* See the copyright notice in the ACK home directory, in the file "Copyright". * See the copyright notice in the ACK home directory, in the file "Copyright".
*/ */
/* This file is ment to be included in the file read_emeV.c. /* This file is ment to be included in the file read_em.c.
It contains the part that takes care of the reading of human readable It contains the part that takes care of the reading of human readable
EM-code. EM-code.
*/ */
@ -171,6 +171,10 @@ getname()
s = &string; s = &string;
p = s->str; p = s->str;
if (!p) {
s->maxlen = 256;
s->str = p = Malloc(256);
}
c = getbyte(); c = getbyte();
if (!(isalpha(c) || c == '_')) { if (!(isalpha(c) || c == '_')) {
@ -180,7 +184,12 @@ getname()
} }
while (isalnum(c) || c == '_') { while (isalnum(c) || c == '_') {
if (p < &(s->str[STRSIZ])) *p++ = c; if (p >= &(s->str[s->maxlen])) {
int df = p - s->str;
s->str = Realloc(s->str, (s->maxlen += 256));
p = s->str + df;
}
*p++ = c;
c = getbyte(); c = getbyte();
} }
@ -202,15 +211,17 @@ getstring()
s = &string; s = &string;
p = s->str; p = s->str;
if (!p) {
s->maxlen = 256;
s->str = p = Malloc(256);
}
if (!(state & INSTRING)) { /* Not reading a string yet */
termc = getbyte(); termc = getbyte();
/* assert(termc == '"' || termc == '\''); */ /* assert(termc == '"' || termc == '\''); */
/* This assertion does not work. Compiler error messages. /* This assertion does not work. Compiler error messages.
The trouble lies in the ", it terminates the string The trouble lies in the ", it terminates the string
created in the assertion macro created in the assertion macro
*/ */
}
for (;;) { for (;;) {
if ((c = getbyte()) == '\n' || c == EOF) { if ((c = getbyte()) == '\n' || c == EOF) {
@ -221,16 +232,15 @@ getstring()
if (c == termc) { if (c == termc) {
if (termc == '"') *p++ = '\0'; if (termc == '"') *p++ = '\0';
state &= ~INSTRING;
break; break;
} }
if (c == '\\') c = getescape(); if (c == '\\') c = getescape();
if (p >= &(s->str[STRSIZ])) { if (p >= &(s->str[s->maxlen])) {
state |= INSTRING; int df = p - s->str;
ungetbyte(c); s->str = Realloc(s->str, (s->maxlen += 256));
break; p = s->str + df;
} }
*p++ = c; *p++ = c;
@ -268,7 +278,7 @@ getnumber(c, ap)
register int c; register int c;
register struct e_arg *ap; register struct e_arg *ap;
{ {
char str[STRSIZ + 1]; char str[256 + 1];
register char *p = str; register char *p = str;
int n; int n;
int expsign; int expsign;
@ -291,7 +301,7 @@ getnumber(c, ap)
n = sp_cst4; n = sp_cst4;
for (;;) { for (;;) {
if (p >= &(str[STRSIZ])) { if (p >= &(str[256])) {
syntax("number too long"); syntax("number too long");
return sp_cst4; return sp_cst4;
} }
@ -580,7 +590,7 @@ getmnem(c, p)
PRIVATE PRIVATE
line_line() line_line()
{ {
static char filebuf[STRSIZ + 1]; static char filebuf[256 + 1];
char *btscpy(); char *btscpy();
struct e_arg dummy; struct e_arg dummy;

View file

@ -109,11 +109,6 @@ getarg(typset, ap)
register struct string *p; register struct string *p;
p = getstring(1); p = getstring(1);
#ifdef CHECKING
if (state & INSTRING) {
xerror("Procedure name too long");
}
#endif CHECKING
ap->ema_pnam = p->str; ap->ema_pnam = p->str;
ap->ema_argtype = pro_ptyp; ap->ema_argtype = pro_ptyp;
break; break;
@ -124,11 +119,6 @@ getarg(typset, ap)
register struct string *p; register struct string *p;
p = getstring(1); p = getstring(1);
#ifdef CHECKING
if (state & INSTRING) {
xerror("Data label too long");
}
#endif CHECKING
ap->ema_dnam = p->str; ap->ema_dnam = p->str;
ap->ema_szoroff = 0; ap->ema_szoroff = 0;
ap->ema_argtype = sof_ptyp; ap->ema_argtype = sof_ptyp;
@ -154,11 +144,6 @@ getarg(typset, ap)
getarg(cst_ptyp, ap); getarg(cst_ptyp, ap);
ap->ema_szoroff = ap->ema_cst; ap->ema_szoroff = ap->ema_cst;
p = getstring(0); p = getstring(0);
#ifdef CHECKING
if (state & INSTRING) {
xerror("Numeric constant too long");
}
#endif CHECKING
ap->ema_argtype = ptyp(i); ap->ema_argtype = ptyp(i);
ap->ema_string = p->str; ap->ema_string = p->str;
break; break;
@ -226,8 +211,7 @@ checkident(s)
} }
#endif CHECKING #endif CHECKING
/* getstring: read a string from the input, but at most STRSIZ characters /* getstring: read a string from the input
of it. The next characters will be read another time around
*/ */
/*ARGSUSED*/ /*ARGSUSED*/
PRIVATE struct string * PRIVATE struct string *
@ -236,32 +220,24 @@ getstring(isident)
register char *p; register char *p;
register int n; register int n;
register struct string *s = &string; register struct string *s = &string;
if (!(state & INSTRING)) { /* Not reading a string yet */
struct e_arg dummy; struct e_arg dummy;
getarg(cst_ptyp, &dummy); getarg(cst_ptyp, &dummy);
/* Read length of string */ /* Read length of string */
strleft = dummy.ema_cst; n = dummy.ema_cst;
#ifdef CHECKING #ifdef CHECKING
if (strleft < 0) { if (n < 0) {
xerror("Negative length in string"); xerror("Negative length in string");
s->length = 0; s->length = 0;
return s; return s;
} }
#endif CHECKING #endif CHECKING
}
if (strleft <= STRSIZ) { /* Handle the whole string */ if (n > s->maxlen) {
n = strleft; if (! s->maxlen) {
state &= ~INSTRING; s->str = Malloc(s->maxlen = 256);
} }
else { /* Handle STRSIZ characters of it, and else s->str = Realloc(s->str, (s->maxlen = (n+255)&~255));
indicate that there is more
*/
n = STRSIZ;
strleft -= STRSIZ;
state |= INSTRING;
} }
s->length = n; s->length = n;