WindowsXP-SP1/com/rpc/tools/yacc/yothrs.c
2020-09-30 16:53:49 +02:00

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;
}