118 lines
2.5 KiB
C
118 lines
2.5 KiB
C
// Copyright (c) 1993-1999 Microsoft Corporation
|
|
|
|
/* Edits:
|
|
* 06-Dec-80 Original code broken out of y1.c.
|
|
* 18-Dec-80 Add conditional code for Decus for tempfile deletion.
|
|
*/
|
|
|
|
#include "y1.h"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
FILE *pfopen(const char *path, char *search, const char *type);
|
|
|
|
void
|
|
others( void )
|
|
{
|
|
/* put out other arrays, copy the parsers */
|
|
register c, i, j;
|
|
char *psz;
|
|
extern char *infile;
|
|
|
|
finput = NULL;
|
|
if ((psz = strrchr(infile, '\\')) || (psz = strrchr(infile, ':'))) {
|
|
char tmp[FNAMESIZE];
|
|
char c = *++psz;
|
|
|
|
*psz = '\0';
|
|
strcpy(tmp, infile);
|
|
*psz = c;
|
|
strcat(tmp, PARSER);
|
|
finput = fopen(tmp, "r");
|
|
}
|
|
|
|
if ( !finput && !(finput = fopen(PARSER, "r"))) {
|
|
if (!(finput = pfopen(PARSER, getenv(LIBENV), "r"))) {
|
|
error( "cannot find parser %s", PARSER );
|
|
}
|
|
}
|
|
|
|
warray( "yyr1", levprd, nprod );
|
|
|
|
aryfil( temp1, nprod, 0 );
|
|
PLOOP(1,i)temp1[i] = prdptr[i+1]-prdptr[i]-2;
|
|
warray( "yyr2", temp1, nprod );
|
|
|
|
aryfil( temp1, nstate, -1000 );
|
|
TLOOP(i)
|
|
{
|
|
for( j=tstates[i]; j!=0; j=mstates[j] )
|
|
{
|
|
temp1[j] = tokset[i].value;
|
|
}
|
|
}
|
|
NTLOOP(i)
|
|
{
|
|
for( j=ntstates[i]; j!=0; j=mstates[j] )
|
|
{
|
|
temp1[j] = -i;
|
|
}
|
|
}
|
|
warray( "yychk", temp1, nstate );
|
|
|
|
warray( "yydef", defact, nstate );
|
|
|
|
/* copy parser text */
|
|
|
|
while( (c=unix_getc(finput) ) != EOF )
|
|
{
|
|
if( c == '$' ) {
|
|
switch (c=unix_getc(finput)) {
|
|
case 'A':
|
|
faction = fopen( ACTNAME, "r" );
|
|
if( faction == NULL ) error( "cannot reopen action tempfile" );
|
|
while( (c=unix_getc(faction) ) != EOF ) putc( c, ftable );
|
|
fclose(faction);
|
|
ZAPFILE(ACTNAME);
|
|
c = unix_getc(finput);
|
|
break;
|
|
|
|
case 'T':
|
|
if (pszPrefix) {
|
|
fprintf(ftable, "%s", pszPrefix);
|
|
}
|
|
c = unix_getc(finput);
|
|
break;
|
|
|
|
default:
|
|
putc( '$', ftable );
|
|
break;
|
|
}
|
|
}
|
|
|
|
putc( c, ftable );
|
|
}
|
|
|
|
fclose( ftable );
|
|
}
|
|
|
|
static char getbuf[30], *getbufptr = getbuf;
|
|
|
|
unix_getc(iop)
|
|
FILE *iop;
|
|
{
|
|
if(getbufptr == getbuf)
|
|
return(getc(iop));
|
|
else
|
|
return(*--getbufptr);
|
|
}
|
|
|
|
void
|
|
yungetc(c, iop)
|
|
SSIZE_T c;
|
|
FILE *iop; /* WARNING: iop ignored ... ungetc's are multiplexed!!! */
|
|
{
|
|
*getbufptr++ = (char) c;
|
|
}
|