many re-arrangements
This commit is contained in:
parent
759026de6a
commit
ce6a1b9cfc
|
@ -1,9 +1,9 @@
|
||||||
EMHOME = ../../..
|
EMHOME = ../../..
|
||||||
INSTALL = $(EMHOME)/modules/install
|
INSTALL = $(EMHOME)/modules/install
|
||||||
COMPARE = $(EMHOME)/modules/compare
|
COMPARE = $(EMHOME)/modules/compare
|
||||||
INCORE = -DINCORE
|
|
||||||
CFLAGS = -I$(EMHOME)/h -I$(EMHOME)/modules/h -O
|
CFLAGS = -I$(EMHOME)/h -I$(EMHOME)/modules/h -O
|
||||||
OBS = failed.o insert.o internerr.o io.o getid.o
|
SRC = failed.c insert.c internerr.c getid.c
|
||||||
|
OBS = failed.o insert.o internerr.o getid.o
|
||||||
|
|
||||||
all: libeme.a libemk.a em_code.3
|
all: libeme.a libemk.a em_code.3
|
||||||
rm -f C_*.c
|
rm -f C_*.c
|
||||||
|
@ -22,11 +22,11 @@ em_code.3: em_code.3X
|
||||||
-sh -c 'tbl < em_code.3X > em_code.3'
|
-sh -c 'tbl < em_code.3X > em_code.3'
|
||||||
-sh -c 'if test -s em_code.3 ; then : ; else cp em_code.3X em_code.3 ; fi '
|
-sh -c 'if test -s em_code.3 ; then : ; else cp em_code.3X em_code.3 ; fi '
|
||||||
|
|
||||||
libeme.a: make.sh e/em_private.h e/em.c $(OBS)
|
libeme.a: make.sh e/em_private.h e/em.c $(OBS) io.c
|
||||||
EMHOME=$(EMHOME); export EMHOME; sh make.sh e
|
EMHOME=$(EMHOME); export EMHOME; sh make.sh e
|
||||||
-sh -c 'ranlib libeme.a'
|
-sh -c 'ranlib libeme.a'
|
||||||
|
|
||||||
libemk.a: make.sh k/em_private.h k/em.c $(OBS)
|
libemk.a: make.sh k/em_private.h k/em.c $(OBS) io.c
|
||||||
EMHOME=$(EMHOME); export EMHOME; sh make.sh k
|
EMHOME=$(EMHOME); export EMHOME; sh make.sh k
|
||||||
-sh -c 'ranlib libemk.a'
|
-sh -c 'ranlib libemk.a'
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ em.gen: make.em.gen $(EMHOME)/etc/em_table
|
||||||
make.em.gen $(EMHOME)/etc/em_table > em.gen
|
make.em.gen $(EMHOME)/etc/em_table > em.gen
|
||||||
|
|
||||||
pr:
|
pr:
|
||||||
@pr Makefile make.em.gen make.fun em.nogen e/em_private.h e/em.c k/em_private.h k/em.c
|
@pr Makefile make.em.gen make.fun em.nogen insert.h $(SRC) e/em_private.h e/em.c k/em_private.h k/em.c
|
||||||
|
|
||||||
opr:
|
opr:
|
||||||
make pr | opr
|
make pr | opr
|
||||||
|
@ -50,12 +50,9 @@ clean:
|
||||||
rm -f *.a em_code.3 em.gen make.sh
|
rm -f *.a em_code.3 em.gen make.sh
|
||||||
|
|
||||||
lintlib: make.sh
|
lintlib: make.sh
|
||||||
lint -I../../h -I../../../h -Ie -Ceme *.c e/*.c
|
lint -I. -I../../h -I../../../h -Ie -Ceme $(SRC) e/*.c
|
||||||
lint -I../../h -I../../../h -Ik -Cemk *.c k/*.c
|
lint -I. -I../../h -I../../../h -Ik -Cemk $(SRC) k/*.c
|
||||||
mv llib-leme.ln llib-lemk.ln $(EMHOME)/modules/lib
|
mv llib-leme.ln llib-lemk.ln $(EMHOME)/modules/lib
|
||||||
|
|
||||||
insert.o: insert.c insert.h
|
insert.o: insert.c insert.h
|
||||||
$(CC) $(CFLAGS) -c $(INCORE) insert.c
|
$(CC) $(CFLAGS) -c insert.c
|
||||||
|
|
||||||
io.o: io.c insert.h
|
|
||||||
$(CC) $(CFLAGS) -c $(INCORE) io.c
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
*/
|
*/
|
||||||
/* EM CODE OUTPUT ROUTINES */
|
/* EM CODE OUTPUT ROUTINES */
|
||||||
|
|
||||||
#include <system.h>
|
#include "io.c"
|
||||||
#include "em_private.h"
|
#include "em_private.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -26,7 +26,9 @@ static
|
||||||
wrs(s)
|
wrs(s)
|
||||||
register char *s;
|
register char *s;
|
||||||
{
|
{
|
||||||
while (*s) C_putbyte(*s++);
|
while (*s) {
|
||||||
|
C_putbyte(*s++);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
C_pt_dnam(s)
|
C_pt_dnam(s)
|
||||||
|
@ -74,8 +76,9 @@ C_pt_scon(x, y)
|
||||||
C_putbyte('\'');
|
C_putbyte('\'');
|
||||||
p = bts2str(x, (int) y, xbuf);
|
p = bts2str(x, (int) y, xbuf);
|
||||||
while (*p) {
|
while (*p) {
|
||||||
if (*p == '\'')
|
if (*p == '\'') {
|
||||||
C_putbyte('\\');
|
C_putbyte('\\');
|
||||||
|
}
|
||||||
C_putbyte(*p++);
|
C_putbyte(*p++);
|
||||||
}
|
}
|
||||||
C_putbyte('\'');
|
C_putbyte('\'');
|
||||||
|
@ -144,11 +147,13 @@ C_pt_wcon(sp, v, sz) /* sp_icon, sp_ucon or sp_fcon with int repr */
|
||||||
char *v;
|
char *v;
|
||||||
arith sz;
|
arith sz;
|
||||||
{
|
{
|
||||||
|
int ch = sp == sp_icon ? 'I' : sp == sp_ucon ? 'U' : 'F';
|
||||||
|
|
||||||
wrs(v);
|
wrs(v);
|
||||||
C_putbyte(sp == sp_icon ? 'I' : sp == sp_ucon ? 'U' : 'F');
|
C_putbyte(ch);
|
||||||
C_pt_cst(sz);
|
C_pt_cst(sz);
|
||||||
}
|
}
|
||||||
|
|
||||||
C_pt_nl() { C_putbyte('\n'); }
|
C_pt_nl() { C_putbyte('\n'); }
|
||||||
C_pt_comma() { C_putbyte(','); }
|
C_pt_comma() { C_putbyte(','); }
|
||||||
C_pt_ccend() { wrs(" ?"); }
|
C_pt_ccend() { C_putbyte('?'); }
|
||||||
|
|
|
@ -24,38 +24,38 @@ C_ina_dlb | label:l | PS(ps_ina); DLB(l); NL()
|
||||||
C_inp | char *:s | PS(ps_inp); PNAM(s); NL()
|
C_inp | char *:s | PS(ps_inp); PNAM(s); NL()
|
||||||
|
|
||||||
C_bss_cst | arith:n arith:w int:i |
|
C_bss_cst | arith:n arith:w int:i |
|
||||||
PS(ps_bss); DCST(n); COMMA(); CST(w); COMMA(); CST((arith) i); NL()
|
PS(ps_bss); CST(n); COMMA(); CST(w); COMMA(); CST((arith) i); NL()
|
||||||
C_bss_icon | arith:n char *:s arith:sz int:i |
|
C_bss_icon | arith:n char *:s arith:sz int:i |
|
||||||
PS(ps_bss); DCST(n); COMMA(); WCON(sp_icon, s, sz); COMMA(); CST((arith) i); NL()
|
PS(ps_bss); CST(n); COMMA(); WCON(sp_icon, s, sz); COMMA(); CST((arith) i); NL()
|
||||||
C_bss_ucon | arith:n char *:s arith:sz int:i |
|
C_bss_ucon | arith:n char *:s arith:sz int:i |
|
||||||
PS(ps_bss); DCST(n); COMMA(); WCON(sp_ucon, s, sz); COMMA(); CST((arith) i); NL()
|
PS(ps_bss); CST(n); COMMA(); WCON(sp_ucon, s, sz); COMMA(); CST((arith) i); NL()
|
||||||
C_bss_fcon | arith:n char *:s arith:sz int:i |
|
C_bss_fcon | arith:n char *:s arith:sz int:i |
|
||||||
PS(ps_bss); DCST(n); COMMA(); WCON(sp_fcon, s, sz); COMMA(); CST((arith) i); NL()
|
PS(ps_bss); CST(n); COMMA(); WCON(sp_fcon, s, sz); COMMA(); CST((arith) i); NL()
|
||||||
C_bss_dnam | arith:n char *:s arith:offs int:i |
|
C_bss_dnam | arith:n char *:s arith:offs int:i |
|
||||||
PS(ps_bss); DCST(n); COMMA(); NOFF(s, offs); COMMA(); CST((arith) i); NL()
|
PS(ps_bss); CST(n); COMMA(); NOFF(s, offs); COMMA(); CST((arith) i); NL()
|
||||||
C_bss_dlb | arith:n label:l arith:offs int:i |
|
C_bss_dlb | arith:n label:l arith:offs int:i |
|
||||||
PS(ps_bss); DCST(n); COMMA(); DOFF(l, offs); COMMA(); CST((arith) i); NL()
|
PS(ps_bss); CST(n); COMMA(); DOFF(l, offs); COMMA(); CST((arith) i); NL()
|
||||||
C_bss_ilb | arith:n label:l int:i |
|
C_bss_ilb | arith:n label:l int:i |
|
||||||
PS(ps_bss); DCST(n); COMMA(); ILB(l); COMMA(); CST((arith) i); NL()
|
PS(ps_bss); CST(n); COMMA(); ILB(l); COMMA(); CST((arith) i); NL()
|
||||||
C_bss_pnam | arith:n char *:s int:i |
|
C_bss_pnam | arith:n char *:s int:i |
|
||||||
PS(ps_bss); DCST(n); COMMA(); PNAM(s); COMMA(); CST((arith) i); NL()
|
PS(ps_bss); CST(n); COMMA(); PNAM(s); COMMA(); CST((arith) i); NL()
|
||||||
|
|
||||||
C_hol_cst | arith:n arith:w int:i |
|
C_hol_cst | arith:n arith:w int:i |
|
||||||
PS(ps_hol); DCST(n); COMMA(); CST(w); COMMA(); CST((arith) i); NL()
|
PS(ps_hol); CST(n); COMMA(); CST(w); COMMA(); CST((arith) i); NL()
|
||||||
C_hol_icon | arith:n char *:s arith:sz int:i |
|
C_hol_icon | arith:n char *:s arith:sz int:i |
|
||||||
PS(ps_hol); DCST(n); COMMA(); WCON(sp_icon, s, sz); COMMA(); CST((arith) i); NL()
|
PS(ps_hol); CST(n); COMMA(); WCON(sp_icon, s, sz); COMMA(); CST((arith) i); NL()
|
||||||
C_hol_ucon | arith:n char *:s arith:sz int:i |
|
C_hol_ucon | arith:n char *:s arith:sz int:i |
|
||||||
PS(ps_hol); DCST(n); COMMA(); WCON(sp_ucon, s, sz); COMMA(); CST((arith) i); NL()
|
PS(ps_hol); CST(n); COMMA(); WCON(sp_ucon, s, sz); COMMA(); CST((arith) i); NL()
|
||||||
C_hol_fcon | arith:n char *:s arith:sz int:i |
|
C_hol_fcon | arith:n char *:s arith:sz int:i |
|
||||||
PS(ps_hol); DCST(n); COMMA(); WCON(sp_fcon, s, sz); COMMA(); CST((arith) i); NL()
|
PS(ps_hol); CST(n); COMMA(); WCON(sp_fcon, s, sz); COMMA(); CST((arith) i); NL()
|
||||||
C_hol_dnam | arith:n char *:s arith:offs int:i |
|
C_hol_dnam | arith:n char *:s arith:offs int:i |
|
||||||
PS(ps_hol); DCST(n); COMMA(); NOFF(s, offs); COMMA(); CST((arith) i); NL()
|
PS(ps_hol); CST(n); COMMA(); NOFF(s, offs); COMMA(); CST((arith) i); NL()
|
||||||
C_hol_dlb | arith:n label:l arith:offs int:i |
|
C_hol_dlb | arith:n label:l arith:offs int:i |
|
||||||
PS(ps_hol); DCST(n); COMMA(); DOFF(l, offs); COMMA(); CST((arith) i); NL()
|
PS(ps_hol); CST(n); COMMA(); DOFF(l, offs); COMMA(); CST((arith) i); NL()
|
||||||
C_hol_ilb | arith:n label:l int:i |
|
C_hol_ilb | arith:n label:l int:i |
|
||||||
PS(ps_hol); DCST(n); COMMA(); ILB(l); COMMA(); CST((arith) i); NL()
|
PS(ps_hol); CST(n); COMMA(); ILB(l); COMMA(); CST((arith) i); NL()
|
||||||
C_hol_pnam | arith:n char *:s int:i |
|
C_hol_pnam | arith:n char *:s int:i |
|
||||||
PS(ps_hol); DCST(n); COMMA(); PNAM(s); COMMA(); CST((arith) i); NL()
|
PS(ps_hol); CST(n); COMMA(); PNAM(s); COMMA(); CST((arith) i); NL()
|
||||||
|
|
||||||
C_con_cst | arith:l | PS(ps_con); CST(l); CEND(); NL()
|
C_con_cst | arith:l | PS(ps_con); CST(l); CEND(); NL()
|
||||||
C_con_icon | char *:val arith:siz |
|
C_con_icon | char *:val arith:siz |
|
||||||
|
|
|
@ -64,6 +64,8 @@ emcode \- EM code interface for compilers
|
||||||
.B int id;
|
.B int id;
|
||||||
.PP
|
.PP
|
||||||
.B int C_getid()
|
.B int C_getid()
|
||||||
|
.PP
|
||||||
|
.B char *C_tmpdir;
|
||||||
.fi
|
.fi
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
This package provides a procedural EM code interface to be used in
|
This package provides a procedural EM code interface to be used in
|
||||||
|
@ -419,11 +421,22 @@ The order in which the parts are defined is not significant.
|
||||||
However, when
|
However, when
|
||||||
.I C_close
|
.I C_close
|
||||||
is called, all parts that have been inserted, must also be defined.
|
is called, all parts that have been inserted, must also be defined.
|
||||||
|
Parts may themselves again have sub-parts.
|
||||||
.PP
|
.PP
|
||||||
The routine
|
The routine
|
||||||
.I C_getid
|
.I C_getid
|
||||||
can be used to obtain a valid and unique part
|
can be used to obtain a valid and unique part
|
||||||
.IR id .
|
.IR id .
|
||||||
|
.PP
|
||||||
|
On implementations with limited memory, the mechanism is implemented with a
|
||||||
|
temporary file.
|
||||||
|
The directory in which this file resides is indicated by
|
||||||
|
.IR C_tmpdir .
|
||||||
|
The default is the #define TMP_DIR from ~em/h/em_path.h.
|
||||||
|
The user can change this by just changing
|
||||||
|
.I C_tmpdir
|
||||||
|
before calling
|
||||||
|
.IR C_open.
|
||||||
.SH FILES
|
.SH FILES
|
||||||
.nf
|
.nf
|
||||||
~em/modules/h/em.h
|
~em/modules/h/em.h
|
||||||
|
|
|
@ -12,11 +12,182 @@
|
||||||
#include <alloc.h>
|
#include <alloc.h>
|
||||||
#include "insert.h"
|
#include "insert.h"
|
||||||
|
|
||||||
#ifdef INCORE
|
#ifndef INCORE
|
||||||
#define C_switchtotmp() (C_ontmpfile = 1)
|
static int
|
||||||
#define C_switchtoout() (C_ontmpfile = 0)
|
getbyte(b)
|
||||||
|
long b;
|
||||||
|
{
|
||||||
|
/* Get the byte at offset "b" from the start of the
|
||||||
|
temporary file, and try to do so in an efficient way.
|
||||||
|
*/
|
||||||
|
static long start_core, curr_pos;
|
||||||
|
|
||||||
|
if (b < start_core || b >= curr_pos) {
|
||||||
|
/* the block wanted is not in core, so get it */
|
||||||
|
long nb = (b & ~(BUFSIZ - 1));
|
||||||
|
int n;
|
||||||
|
|
||||||
|
C_flush();
|
||||||
|
if (nb != curr_pos) {
|
||||||
|
if (sys_seek(tfr, nb, 0, &curr_pos) == 0) {
|
||||||
|
C_failed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (! ibuf) {
|
||||||
|
ibuf = Malloc(BUFSIZ);
|
||||||
|
}
|
||||||
|
if (sys_read(tfr, ibuf, BUFSIZ, &n) == 0) {
|
||||||
|
C_failed();
|
||||||
|
}
|
||||||
|
curr_pos += n;
|
||||||
|
start_core = nb;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ibuf[(int) (b - start_core)];
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static C_out_parts();
|
||||||
|
static Part *C_findpart();
|
||||||
|
|
||||||
|
outpart(id)
|
||||||
|
int id;
|
||||||
|
{
|
||||||
|
/* Output part "id", if present.
|
||||||
|
*/
|
||||||
|
Part *p = C_findpart(id);
|
||||||
|
|
||||||
|
if (p) C_out_parts(p->p_parts);
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
C_out_parts(pp)
|
||||||
|
register PartOfPart *pp;
|
||||||
|
{
|
||||||
|
/* Output the list of chunks started by "pp".
|
||||||
|
The list is build in reverse order, so this routine is
|
||||||
|
recursive.
|
||||||
|
*/
|
||||||
|
PartOfPart *prev = 0, *next;
|
||||||
|
|
||||||
|
while (pp) {
|
||||||
|
next = pp->pp_next;
|
||||||
|
pp->pp_next = prev;
|
||||||
|
prev = pp;
|
||||||
|
pp = next;
|
||||||
|
}
|
||||||
|
pp = prev;
|
||||||
|
|
||||||
|
while (pp) {
|
||||||
|
if (pp->pp_type == INSERT) {
|
||||||
|
C_outpart(pp->pp_id);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* copy the chunk to output */
|
||||||
|
#ifdef INCORE
|
||||||
|
register char *s = C_BASE + pp->pp_begin;
|
||||||
|
char *se = C_BASE + pp->pp_end;
|
||||||
|
|
||||||
|
while (s < se) {
|
||||||
|
put(*s++);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
register long b = pp->pp_begin;
|
||||||
|
|
||||||
|
while (b < pp->pp_end) {
|
||||||
|
put(getbyte(b++));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
pp = pp->pp_next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static Part *
|
||||||
|
C_findpart(part)
|
||||||
|
int part;
|
||||||
|
{
|
||||||
|
/* Look for part "part" in the table.
|
||||||
|
Return 0 if not present,
|
||||||
|
*/
|
||||||
|
register Part *p = C_stable[part % TABSIZ];
|
||||||
|
|
||||||
|
while (p && p->p_id != part) {
|
||||||
|
p = p->p_next;
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
switchtotmp()
|
||||||
|
{
|
||||||
|
#ifndef INCORE
|
||||||
|
if (C_tmpfile == 0) {
|
||||||
|
static char tmpbuf[64];
|
||||||
|
register char *p = tmpbuf;
|
||||||
|
|
||||||
|
strcpy(p, C_tmpdir);
|
||||||
|
strcat(p, "/CodeXXXXXX");
|
||||||
|
tmpfile = mktemp(p);
|
||||||
|
if (! sys_open(p, OP_WRITE, &C_old_ofp)) {
|
||||||
|
C_failed();
|
||||||
|
}
|
||||||
|
if (! sys_open(p, OP_READ, &C_tfr)) {
|
||||||
|
C_failed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (! C_ontmpfile) {
|
||||||
|
File *p = C_ofp;
|
||||||
|
|
||||||
|
C_flush();
|
||||||
|
C_ofp = C_old_ofp;
|
||||||
|
C_old_ofp = p;
|
||||||
|
C_ontmpfile = 1;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (! C_ontmpfile) {
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
p = C_opp;
|
||||||
|
C_opp = C_old_opp;
|
||||||
|
C_old_opp = p;
|
||||||
|
|
||||||
|
p = C_top;
|
||||||
|
C_top = C_old_top;
|
||||||
|
C_old_top = p;
|
||||||
|
C_ontmpfile = 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
switchtoout()
|
||||||
|
{
|
||||||
|
#ifndef INCORE
|
||||||
|
if (C_ontmpfile) {
|
||||||
|
File *p = C_ofp;
|
||||||
|
|
||||||
|
C_flush();
|
||||||
|
C_ofp = C_old_ofp;
|
||||||
|
C_old_ofp = p;
|
||||||
|
C_ontmpfile = 0;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (C_ontmpfile) {
|
||||||
|
char *p;
|
||||||
|
|
||||||
|
p = C_opp;
|
||||||
|
C_opp = C_old_opp;
|
||||||
|
C_old_opp = p;
|
||||||
|
|
||||||
|
p = C_top;
|
||||||
|
C_top = C_old_top;
|
||||||
|
C_old_top = p;
|
||||||
|
C_ontmpfile = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
available(part)
|
available(part)
|
||||||
int part;
|
int part;
|
||||||
|
@ -88,7 +259,7 @@ end_partofpart(p)
|
||||||
if (p) {
|
if (p) {
|
||||||
register PartOfPart *pp = p->p_parts;
|
register PartOfPart *pp = p->p_parts;
|
||||||
|
|
||||||
pp->pp_end = C_current_out;
|
pp->pp_end = C_current_out - C_BASE;
|
||||||
if (pp->pp_begin == pp->pp_end) {
|
if (pp->pp_begin == pp->pp_end) {
|
||||||
/* nothing in this chunk, so give it back */
|
/* nothing in this chunk, so give it back */
|
||||||
p->p_parts = pp->pp_next;
|
p->p_parts = pp->pp_next;
|
||||||
|
@ -106,12 +277,12 @@ resume(p)
|
||||||
*/
|
*/
|
||||||
register PartOfPart *pp = (PartOfPart *) Malloc(sizeof(PartOfPart));
|
register PartOfPart *pp = (PartOfPart *) Malloc(sizeof(PartOfPart));
|
||||||
|
|
||||||
C_switchtotmp();
|
switchtotmp();
|
||||||
C_curr_part = p;
|
C_curr_part = p;
|
||||||
pp->pp_next = p->p_parts;
|
pp->pp_next = p->p_parts;
|
||||||
p->p_parts = pp;
|
p->p_parts = pp;
|
||||||
pp->pp_type = TEXT;
|
pp->pp_type = TEXT;
|
||||||
pp->pp_begin = C_current_out;
|
pp->pp_begin = C_current_out - C_BASE;
|
||||||
}
|
}
|
||||||
|
|
||||||
C_insertpart(part)
|
C_insertpart(part)
|
||||||
|
@ -124,6 +295,9 @@ C_insertpart(part)
|
||||||
register Part *p;
|
register Part *p;
|
||||||
register PartOfPart *pp;
|
register PartOfPart *pp;
|
||||||
|
|
||||||
|
C_outpart = outpart;
|
||||||
|
C_switchtotmp = switchtotmp;
|
||||||
|
C_switchtoout = switchtoout;
|
||||||
if (C_sequential && available(part)) {
|
if (C_sequential && available(part)) {
|
||||||
outpart(part);
|
outpart(part);
|
||||||
return;
|
return;
|
||||||
|
@ -158,6 +332,10 @@ C_beginpart(part)
|
||||||
*/
|
*/
|
||||||
register Part *p = mkpart(part);
|
register Part *p = mkpart(part);
|
||||||
|
|
||||||
|
C_outpart = outpart;
|
||||||
|
C_switchtotmp = switchtotmp;
|
||||||
|
C_switchtoout = switchtoout;
|
||||||
|
|
||||||
end_partofpart(C_curr_part);
|
end_partofpart(C_curr_part);
|
||||||
|
|
||||||
p->p_prevpart = C_curr_part;
|
p->p_prevpart = C_curr_part;
|
||||||
|
@ -181,6 +359,6 @@ C_endpart(part)
|
||||||
if (p->p_prevpart) resume(p->p_prevpart);
|
if (p->p_prevpart) resume(p->p_prevpart);
|
||||||
else {
|
else {
|
||||||
C_curr_part = 0;
|
C_curr_part = 0;
|
||||||
C_switchtoout();
|
switchtoout();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,10 @@
|
||||||
end-pointer.
|
end-pointer.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <system.h>
|
||||||
|
|
||||||
|
#define INCORE /* mechanism implemented incore */
|
||||||
|
|
||||||
typedef struct partofpart {
|
typedef struct partofpart {
|
||||||
struct partofpart *pp_next;
|
struct partofpart *pp_next;
|
||||||
char pp_type;
|
char pp_type;
|
||||||
|
@ -29,15 +33,34 @@ typedef struct part {
|
||||||
int p_id; /* id of this part */
|
int p_id; /* id of this part */
|
||||||
} Part;
|
} Part;
|
||||||
|
|
||||||
#define outpart(xxx) C_out_parts(C_findpart(xxx)->p_parts)
|
|
||||||
|
|
||||||
#define TABSIZ 32
|
#define TABSIZ 32
|
||||||
|
|
||||||
extern int
|
extern int
|
||||||
C_ontmpfile, C_sequential;
|
C_ontmpfile, C_sequential;
|
||||||
extern Part
|
extern Part
|
||||||
*C_curr_part, *C_stable[];
|
*C_curr_part, *C_stable[];
|
||||||
|
#ifdef INCORE
|
||||||
|
extern char
|
||||||
|
*C_current_out, *C_BASE;
|
||||||
|
#define C_opp C_current_out
|
||||||
|
#else
|
||||||
extern long
|
extern long
|
||||||
C_current_out;
|
C_current_out;
|
||||||
extern Part
|
extern char *C_opp;
|
||||||
*C_findpart();
|
#define C_BASE 0
|
||||||
|
#endif
|
||||||
|
extern int (*C_outpart)(), (*C_switchtoout)(), (*C_switchtotmp)();
|
||||||
|
|
||||||
|
extern File *C_ofp;
|
||||||
|
|
||||||
|
#ifndef INCORE
|
||||||
|
extern File *C_tfr, *C_old_ofp;
|
||||||
|
extern char *C_tmpfile;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern char *C_top;
|
||||||
|
extern char *C_old_top;
|
||||||
|
extern char *C_old_opp;
|
||||||
|
|
||||||
|
#define put(c) if (C_opp == C_top) C_flush(); *C_opp++ = (c)
|
||||||
|
|
||||||
|
|
|
@ -3,108 +3,85 @@
|
||||||
/* I/O part of em_code module.
|
/* I/O part of em_code module.
|
||||||
Also contains C_open, C_close
|
Also contains C_open, C_close
|
||||||
*/
|
*/
|
||||||
#include <system.h>
|
|
||||||
#include <alloc.h>
|
#include <alloc.h>
|
||||||
#include <em_path.h>
|
#include <em_path.h>
|
||||||
#include <em_arith.h>
|
#include <em_arith.h>
|
||||||
|
#include <local.h>
|
||||||
#include "insert.h"
|
#include "insert.h"
|
||||||
|
|
||||||
int
|
int C_ontmpfile = 0;
|
||||||
C_ontmpfile = 0,
|
int C_sequential = 1;
|
||||||
C_sequential = 1;
|
Part *C_curr_part;
|
||||||
Part
|
Part *C_stable[TABSIZ];
|
||||||
*C_curr_part, *C_stable[TABSIZ];
|
char *C_tmpdir = TMP_DIR;
|
||||||
long
|
int (*C_outpart)(), (*C_switchtoout)(), (*C_switchtotmp)();
|
||||||
C_current_out;
|
|
||||||
|
|
||||||
#ifdef INCORE
|
#ifdef INCORE
|
||||||
static char *BASE;
|
char *C_BASE;
|
||||||
#endif
|
#endif
|
||||||
static File *ofp;
|
|
||||||
|
File *C_ofp;
|
||||||
|
|
||||||
#ifndef INCORE
|
#ifndef INCORE
|
||||||
static File *tfr, *old_ofp;
|
File *C_tfr, *C_old_ofp;
|
||||||
static char *tmpfile;
|
char *C_tmpfile;
|
||||||
char *strcpy(), *strcat(), *mktemp();
|
char *strcpy(), *strcat(), *mktemp();
|
||||||
static char *ibuf = 0;
|
static char *ibuf = 0;
|
||||||
|
long C_current_out;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static char obuf[BUFSIZ];
|
#if BUFSIZ <= 1024 && BIGMACHINE
|
||||||
static char *opp = obuf;
|
#define BUFFERSIZ 8*BUFSIZ
|
||||||
|
#else
|
||||||
|
#define BUFFERSIZ BUFSIZ
|
||||||
|
#endif
|
||||||
|
|
||||||
static
|
static char obuf[BUFFERSIZ];
|
||||||
flush() {
|
char *C_top = &obuf[BUFFERSIZ];
|
||||||
if (opp != obuf && sys_write(ofp, obuf, opp - obuf) == 0) {
|
char *C_old_top;
|
||||||
|
char *C_old_opp;
|
||||||
|
#ifdef INCORE
|
||||||
|
char *C_current_out = obuf;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
C_flush() {
|
||||||
|
#ifdef INCORE
|
||||||
|
static unsigned int bufsiz;
|
||||||
|
|
||||||
|
if (C_ontmpfile) {
|
||||||
|
if (C_BASE == 0) {
|
||||||
|
C_BASE = Malloc(BUFFERSIZ);
|
||||||
|
bufsiz = BUFFERSIZ;
|
||||||
|
C_current_out = C_BASE;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
C_BASE = Srealloc(C_BASE, (bufsiz << 1));
|
||||||
|
C_current_out = C_BASE + bufsiz;
|
||||||
|
bufsiz <<= 1;
|
||||||
|
}
|
||||||
|
C_top = C_BASE + bufsiz;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (C_opp != obuf && sys_write(C_ofp, obuf, C_opp - obuf) == 0) {
|
||||||
C_failed();
|
C_failed();
|
||||||
}
|
}
|
||||||
opp = obuf;
|
C_opp = obuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define put(c) if (opp == &obuf[BUFSIZ]) flush(); *opp++ = (c)
|
#ifndef INCORE
|
||||||
|
#define Xputbyte(c) if (C_ontmpfile) C_current_out++; put(c)
|
||||||
|
#else
|
||||||
|
#define Xputbyte(c) put(c)
|
||||||
|
#endif
|
||||||
|
|
||||||
C_putbyte(c)
|
C_putbyte(c)
|
||||||
int c;
|
int c;
|
||||||
{
|
{
|
||||||
if (C_ontmpfile) {
|
Xputbyte(c);
|
||||||
#ifdef INCORE
|
|
||||||
static unsigned sz;
|
|
||||||
|
|
||||||
if (BASE == 0) {
|
|
||||||
BASE = Malloc(BUFSIZ);
|
|
||||||
sz = BUFSIZ;
|
|
||||||
}
|
|
||||||
else if (C_current_out >= sz) {
|
|
||||||
BASE = Srealloc(BASE, (sz <<= 1));
|
|
||||||
}
|
|
||||||
*(BASE + C_current_out) = c;
|
|
||||||
#endif
|
|
||||||
C_current_out++;
|
|
||||||
#ifdef INCORE
|
|
||||||
return;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
put(c);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef INCORE
|
#define C_putbyte Xputbyte
|
||||||
C_switchtotmp()
|
|
||||||
{
|
|
||||||
if (tmpfile == 0) {
|
|
||||||
static char tmpbuf[64];
|
|
||||||
register char *p = tmpbuf;
|
|
||||||
|
|
||||||
strcpy(p, TMP_DIR);
|
|
||||||
strcat(p, "/CodeXXXXXX");
|
|
||||||
tmpfile = mktemp(p);
|
|
||||||
if (! sys_open(p, OP_WRITE, &old_ofp)) {
|
|
||||||
C_failed();
|
|
||||||
}
|
|
||||||
if (! sys_open(p, OP_READ, &tfr)) {
|
|
||||||
C_failed();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (! C_ontmpfile) {
|
|
||||||
File *p = ofp;
|
|
||||||
|
|
||||||
flush();
|
|
||||||
ofp = old_ofp;
|
|
||||||
old_ofp = p;
|
|
||||||
C_ontmpfile = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
C_switchtoout()
|
|
||||||
{
|
|
||||||
if (C_ontmpfile) {
|
|
||||||
File *p = ofp;
|
|
||||||
|
|
||||||
flush();
|
|
||||||
ofp = old_ofp;
|
|
||||||
old_ofp = p;
|
|
||||||
C_ontmpfile = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
C_init(w, p)
|
C_init(w, p)
|
||||||
arith w, p;
|
arith w, p;
|
||||||
|
@ -118,9 +95,9 @@ C_open(nm)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (nm == 0)
|
if (nm == 0)
|
||||||
ofp = STDOUT; /* standard output */
|
C_ofp = STDOUT; /* standard output */
|
||||||
else
|
else
|
||||||
if (sys_open(nm, OP_WRITE, &ofp) == 0)
|
if (sys_open(nm, OP_WRITE, &C_ofp) == 0)
|
||||||
return 0;
|
return 0;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -131,119 +108,35 @@ C_close()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef INCORE
|
#ifndef INCORE
|
||||||
flush();
|
C_flush();
|
||||||
if (tmpfile) {
|
if (tmpfile) {
|
||||||
C_switchtotmp();
|
(*C_switchtotmp)();
|
||||||
sys_close(ofp);
|
sys_close(C_ofp);
|
||||||
ofp = old_ofp;
|
|
||||||
#else
|
#else
|
||||||
if (BASE) {
|
if (C_BASE) {
|
||||||
#endif
|
#endif
|
||||||
if (C_curr_part) {
|
if (C_curr_part) {
|
||||||
C_curr_part->p_parts->pp_end = C_current_out;
|
C_curr_part->p_parts->pp_end = C_current_out - C_BASE;
|
||||||
}
|
}
|
||||||
|
(*C_switchtoout)();
|
||||||
if (! C_sequential) {
|
if (! C_sequential) {
|
||||||
outpart(0);
|
(*C_outpart)(0);
|
||||||
}
|
}
|
||||||
#ifndef INCORE
|
#ifndef INCORE
|
||||||
sys_close(tfr);
|
sys_close(C_tfr);
|
||||||
sys_remove(tmpfile);
|
sys_remove(tmpfile);
|
||||||
if (ibuf) free(ibuf);
|
if (ibuf) free(ibuf);
|
||||||
#else
|
#else
|
||||||
free(BASE);
|
free(C_BASE);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
flush();
|
C_flush();
|
||||||
if (ofp != STDOUT)
|
if (C_ofp != STDOUT)
|
||||||
sys_close(ofp);
|
sys_close(C_ofp);
|
||||||
ofp = 0;
|
C_ofp = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
C_busy()
|
C_busy()
|
||||||
{
|
{
|
||||||
return ofp != 0; /* true if code is being generated */
|
return C_ofp != 0; /* true if code is being generated */
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef INCORE
|
|
||||||
static int
|
|
||||||
getbyte(b)
|
|
||||||
long b;
|
|
||||||
{
|
|
||||||
/* Get the byte at offset "b" from the start of the
|
|
||||||
temporary file, and try to do so in an efficient way.
|
|
||||||
*/
|
|
||||||
static long start_core, curr_pos;
|
|
||||||
|
|
||||||
if (b < start_core || b >= curr_pos) {
|
|
||||||
/* the block wanted is not in core, so get it */
|
|
||||||
long nb = (b & ~(BUFSIZ - 1));
|
|
||||||
int n;
|
|
||||||
|
|
||||||
flush();
|
|
||||||
if (nb != curr_pos) {
|
|
||||||
if (sys_seek(tfr, nb, 0, &curr_pos) == 0) {
|
|
||||||
C_failed();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (! ibuf) {
|
|
||||||
ibuf = Malloc(BUFSIZ);
|
|
||||||
}
|
|
||||||
if (sys_read(tfr, ibuf, BUFSIZ, &n) == 0) {
|
|
||||||
C_failed();
|
|
||||||
}
|
|
||||||
curr_pos += n;
|
|
||||||
start_core = nb;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ibuf[(int) (b - start_core)];
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
C_out_parts(pp)
|
|
||||||
register PartOfPart *pp;
|
|
||||||
{
|
|
||||||
/* Output the list of chunks started by "pp".
|
|
||||||
The list is build in reverse order, so this routine is
|
|
||||||
recursive.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!pp) return;
|
|
||||||
if (pp->pp_next) C_out_parts(pp->pp_next);
|
|
||||||
|
|
||||||
if (pp->pp_type == INSERT) {
|
|
||||||
outpart(pp->pp_id);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* copy the chunk to output */
|
|
||||||
#ifdef INCORE
|
|
||||||
register char *s = BASE + pp->pp_begin;
|
|
||||||
char *se = BASE + pp->pp_end;
|
|
||||||
|
|
||||||
while (s < se) {
|
|
||||||
put(*s++);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
register long b = pp->pp_begin;
|
|
||||||
|
|
||||||
while (b < pp->pp_end) {
|
|
||||||
put(getbyte(b++));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Part *
|
|
||||||
C_findpart(part)
|
|
||||||
int part;
|
|
||||||
{
|
|
||||||
/* Look for part "part" in the table.
|
|
||||||
Return 0 if not present,
|
|
||||||
*/
|
|
||||||
register Part *p = C_stable[part % TABSIZ];
|
|
||||||
|
|
||||||
while (p && p->p_id != part) {
|
|
||||||
p = p->p_next;
|
|
||||||
}
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
/* $Header$ */
|
/* $Header$ */
|
||||||
/* EM CODE OUTPUT ROUTINES */
|
/* EM CODE OUTPUT ROUTINES */
|
||||||
|
|
||||||
#include <system.h>
|
#include "io.c"
|
||||||
#include "em_private.h"
|
#include "em_private.h"
|
||||||
|
|
||||||
#define put8(x) C_putbyte(x)
|
#define put8(x) C_putbyte(x)
|
||||||
|
|
|
@ -3,7 +3,7 @@ ed - $1 <<'EOI'
|
||||||
1,/^$/d
|
1,/^$/d
|
||||||
1,/^$/d
|
1,/^$/d
|
||||||
1,$s/^\(...\) \(.\).*/\1:\2/
|
1,$s/^\(...\) \(.\).*/\1:\2/
|
||||||
g/:d/s/^\(...\):\(.\).*/C_\1 | arith:\2 | OP(op_\1); DCST(\2); NL()/
|
g/:d/s/^\(...\):\(.\).*/C_\1 | arith:\2 | OP(op_\1); CST(\2); NL()/
|
||||||
g/:[cslnfzor]/s/^\(...\):\(.\).*/C_\1 | arith:\2 | OP(op_\1); CST(\2); NL()/
|
g/:[cslnfzor]/s/^\(...\):\(.\).*/C_\1 | arith:\2 | OP(op_\1); CST(\2); NL()/
|
||||||
g/:w/s/^\(...\).*/C_\1 | arith:w | OP(op_\1); CST(w); NL()\
|
g/:w/s/^\(...\).*/C_\1 | arith:w | OP(op_\1); CST(w); NL()\
|
||||||
C_\1_narg | | OP(op_\1); CCEND(); NL()/
|
C_\1_narg | | OP(op_\1); CCEND(); NL()/
|
||||||
|
|
|
@ -41,9 +41,9 @@ rm -f C_*.o
|
||||||
.
|
.
|
||||||
$a
|
$a
|
||||||
rm -f libem$1.a
|
rm -f libem$1.a
|
||||||
cc -c -O -I$1 -I$EMHOME/modules/h -I$EMHOME/h $1/em.c
|
cc -c -O -I. -I$1 -I$EMHOME/modules/h -I$EMHOME/h $1/em.c
|
||||||
mv em.o em$1.o
|
mv em.o em$1.o
|
||||||
ar rc libem$1.a C_*.o em$1.o insert.o io.o failed.o internerr.o getid.o
|
ar rc libem$1.a C_*.o em$1.o insert.o failed.o internerr.o getid.o
|
||||||
rm -f C_*.o
|
rm -f C_*.o
|
||||||
--EOF--
|
--EOF--
|
||||||
.
|
.
|
||||||
|
|
Loading…
Reference in a new issue