home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CBM Funet Archive
/
cbm-funet-archive-2003.iso
/
cbm
/
programming
/
msdos
/
xa214f.lzh
/
xa214f
/
src
/
xap.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-01-26
|
23KB
|
896 lines
/*
XA65 - 6502 CROSS ASSEMBLER AND UTILITY SUITE
cOPYRIGHT (c) 1989-1998 aNDR{$e9} fACHAT (A.FACHAT@PHYSIK.TU-CHEMNITZ.DE)
tHIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
IT UNDER THE TERMS OF THE gnu gENERAL pUBLIC lICENSE AS PUBLISHED BY
THE fREE sOFTWARE fOUNDATION; EITHER VERSION 2 OF THE lICENSE, OR
(AT YOUR OPTION) ANY LATER VERSION.
tHIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
BUT without any warranty; WITHOUT EVEN THE IMPLIED WARRANTY OF
merchantability OR fitness for a particular purpose. sEE THE
gnu gENERAL pUBLIC lICENSE FOR MORE DETAILS.
yOU SHOULD HAVE RECEIVED A COPY OF THE gnu gENERAL pUBLIC lICENSE
ALONG WITH THIS PROGRAM; IF NOT, WRITE TO THE fREE sOFTWARE
fOUNDATION, iNC., 675 mASS aVE, cAMBRIDGE, ma 02139, usa.
*/
#INCLUDE <STDIO.H>
#INCLUDE <STDLIB.H>
#INCLUDE <CTYPE.H>
#INCLUDE <STRING.H>
#INCLUDE "XAH.H"
#INCLUDE "XAH2.H"
#INCLUDE "XAR.H"
#INCLUDE "XA.H"
#INCLUDE "XAM.H"
#INCLUDE "XAL.H"
#INCLUDE "XAT.H"
#INCLUDE "XAP.H"
CHAR S[maxline];
dATEI *FILEP;
STATIC INT TCOMPARE(CHAR*,CHAR**,INT);
STATIC INT PP_REPLACE(CHAR*,CHAR*,INT,INT);
STATIC INT SUCHDEF(CHAR*);
STATIC INT FGETLINE(CHAR*,INT LEN, INT *RLEN, file*);
#DEFINE HASHCODE(N,L) (N[0]&0X0F){$7c}(((L-1)?(N[1]&0X0F):0)<<4)
STATIC INT ICL_OPEN(CHAR*),PP_IFDEF(CHAR*),PP_IFNDEF(CHAR*);
STATIC INT PP_ELSE(CHAR*),PP_ENDIF(CHAR*);
STATIC INT PP_ECHO(CHAR*),PP_IF(CHAR*),PP_PRINT(CHAR*),PP_PRDEF(CHAR*);
STATIC INT PP_IFLDEF(CHAR*),PP_IFLUSED(CHAR*);
STATIC INT PP_UNDEF(CHAR*);
#DEFINE anzbef 13
#DEFINE valbef 6
STATIC CHAR *CMD[]={$7b} "ECHO","INCLUDE","DEFINE","UNDEF","PRINTDEF","PRINT",
"IFDEF","IFNDEF","ELSE","ENDIF",
"IFLDEF","IFLUSED","IF" {$7d};
STATIC INT (*FUNC[])(CHAR*) = {$7b} PP_ECHO,ICL_OPEN,PP_DEFINE,PP_UNDEF,
PP_PRDEF,PP_PRINT, PP_IFDEF,PP_IFNDEF,
PP_ELSE,PP_ENDIF,
PP_IFLDEF,PP_IFLUSED,PP_IF {$7d};
STATIC CHAR *MEM;
STATIC UNSIGNED LONG MEMFRE;
STATIC INT NLF;
STATIC INT NFF;
STATIC INT HASHINDEX[256];
STATIC lIST *LISTE;
STATIC UNSIGNED INT RLIST;
STATIC INT FSP;
STATIC INT LOOPFL;
STATIC dATEI FLIST[maxfile+1];
STATIC CHAR IN_LINE[maxline];
INT PP_COMAND(CHAR *T)
{$7b}
INT I,L,ER=1;
I=TCOMPARE(T,CMD,anzbef);
IF(I>=0)
{$7b}
IF(LOOPFL && (I<valbef))
ER=0;
ELSE
{$7b}
L=(INT)STRLEN(CMD[I]);
WHILE(ISSPACE(T[L])) L++;
ER=(*FUNC[I])(T+L);
{$7d}
{$7d}
RETURN(ER);
{$7d}
INT PP_IFDEF(CHAR *T)
{$7b}
/* INT X;
PRINTF("T=%S\N",T);
X=SUCHDEF(T);
PRINTF("SUCHDEF(T)=%D\N",X);
*/
LOOPFL=(LOOPFL<<1)+( SUCHDEF(T) ? 0 : 1 );
RETURN(0);
{$7d}
INT PP_IFNDEF(CHAR *T)
{$7b}
LOOPFL=(LOOPFL<<1)+( SUCHDEF(T) ? 1 : 0 );
RETURN(0);
{$7d}
INT PP_IFLDEF(CHAR *T)
{$7b}
LOOPFL=(LOOPFL<<1)+( LL_PDEF(T) ? 1 : 0 );
RETURN(0);
{$7d}
INT PP_IFLUSED(CHAR *T)
{$7b}
INT N;
LOOPFL=(LOOPFL<<1)+( LL_SUCH(T,&N) ? 1 : 0 );
RETURN(0);
{$7d}
INT PP_ECHO(CHAR *T)
{$7b}
INT ER;
IF((ER=PP_REPLACE(S,T,-1,RLIST)))
ERROUT(ER);
ELSE
{$7b}
LOGOUT(S);
LOGOUT("\N");
{$7d}
RETURN(0);
{$7d}
INT PP_PRINT(CHAR *T)
{$7b}
INT F,A,ER;
LOGOUT(T);
IF((ER=PP_REPLACE(S,T,-1,RLIST)))
{$7b}
LOGOUT("\N");
ERROUT(ER);
{$7d}
ELSE
{$7b}
LOGOUT("=");
LOGOUT(S);
LOGOUT("=");
ER=B_TERM(S,&A,&F,PC[SEGMENT]);
IF(ER)
{$7b}
LOGOUT("\N");
ERROUT(ER);
{$7d}
ELSE
{$7b} SPRINTF(S,"%D\N",A); LOGOUT(S); {$7d}
{$7d}
RETURN(0);
{$7d}
INT PP_IF(CHAR *T)
{$7b}
INT A,F,L,ER;
IF((ER=PP_REPLACE(S,T,-1,RLIST)))
ERROUT(ER);
ELSE
{$7b}
DSB_LEN = 1;
F=B_TERM(S,&A,&L,PC[SEGMENT]);
DSB_LEN = 0;
IF((!LOOPFL) && F)
ERROUT(F);
ELSE
LOOPFL=(LOOPFL<<1)+( A ? 0 : 1 );
{$7d}
RETURN(0);
{$7d}
INT PP_ELSE(CHAR *T)
{$7b}
LOOPFL ^=1;
RETURN(0);
{$7d}
INT PP_ENDIF(CHAR *T)
{$7b}
LOOPFL=LOOPFL>>1;
RETURN(0);
{$7d}
/* PP_UNDEF IS A GREAT HACK TO GET IT WORKING FAST... */
INT PP_UNDEF(CHAR *T) {$7b}
INT I;
IF((I=SUCHDEF(T))) {$7b}
I+=RLIST;
LISTE[I].S_LEN=0;
{$7d}
RETURN 0;
{$7d}
INT PP_PRDEF(CHAR *T)
{$7b}
CHAR *X;
INT I,J;
IF((I=SUCHDEF(T)))
{$7b}
I+=RLIST;
X=LISTE[I].SEARCH;
SPRINTF(S,"\N%S",X);
IF(LISTE[I].P_ANZ)
{$7b}
SPRINTF(S+STRLEN(S),"(");
FOR(J=0;J<LISTE[I].P_ANZ;J++)
{$7b}
X+=STRLEN(X)+1;
SPRINTF(S+STRLEN(S),"%S%C",X,(LISTE[I].P_ANZ-J-1) ? ',' : ')');
{$7d}
{$7d}
SPRINTF(S+STRLEN(S),"=%S\N",LISTE[I].REPLACE);
LOGOUT(S);
{$7d}
RETURN(e_ok);
{$7d}
INT SUCHDEF(CHAR *T)
{$7b}
INT I=0,J,K,L=0;
WHILE(T[L]!=' ' && T[L]!='\0') L++;
IF(RLIST)
{$7b}
I=HASHINDEX[HASHCODE(T,L)];
DO /*FOR(I=0;I<RLIST;I++)*/
{$7b}
K=LISTE[I].S_LEN;
J=0;
IF(K && (K==L))
{$7b}
WHILE((T[J]==LISTE[I].SEARCH[J])&&J<K) J++;
IF(J==K)
BREAK;
{$7d}
IF(!I)
{$7b}
I=RLIST;
BREAK;
{$7d}
I=LISTE[I].NEXTINDEX;
{$7d} WHILE(1);
{$7d}
RETURN(I-RLIST);
{$7d}
INT GA_PP(VOID)
{$7b}
RETURN(RLIST);
{$7d}
INT GM_PP(VOID)
{$7b}
RETURN(anzdef);
{$7d}
LONG GM_PPM(VOID)
{$7b}
RETURN(maxpp);
{$7d}
LONG GA_PPM(VOID)
{$7b}
RETURN(maxpp-MEMFRE);
{$7d}
INT PP_DEFINE(CHAR *K)
{$7b}
INT I,ER=e_ok,HASH,RL;
CHAR H[maxline*2],*T;
UNSIGNED INT J;
T=K;
IF(RLIST>=anzdef {$7c}{$7c} MEMFRE<maxline*2)
RETURN(e_nomem);
/*
PRINTF("DEFINE:MEM=%04LX\N",MEM);
GETCHAR();
*/
RL=RLIST++;
LISTE[RL].SEARCH=MEM;
FOR(I=0; (T[I]!=' ') && (T[I]!='\0') && (T[I]!='(') ;I++)
*MEM++=T[I];
*MEM++='\0';
MEMFRE-=I+1;
LISTE[RL].S_LEN=I;
LISTE[RL].P_ANZ=0;
/*
PRINTF("DEFINE:%S\NLEN1=%D\N",LISTE[RL].SEARCH,LISTE[RL].S_LEN);
GETCHAR();
*/
IF(T[I]=='(')
{$7b}
WHILE(T[I]!=')' && T[I]!='\0')
{$7b}
I++;
LISTE[RL].P_ANZ++;
FOR(J=0; T[I+J]!=')' && T[I+J]!=',' && T[I+J]!='\0';J++);
IF(J<MEMFRE)
{$7b}
STRNCPY(MEM,T+I,J);
MEM+=J+1;
MEMFRE-=J+1;
{$7d}
I+=J;
{$7d}
IF(T[I]==')')
I++;
{$7d}
WHILE(T[I]==' ')
I++;
T+=I;
PP_REPLACE(H,T,-1,0);
T=H;
LISTE[RL].REPLACE=MEM;
STRCPY(MEM,T);
MEM+=STRLEN(T)+1;
#IF 0/* DEBUG */
{$7b} CHAR *SS;
IF(LISTE[RL].P_ANZ)
{$7b}
SS=LISTE[RL].SEARCH;
PRINTF("DEFINE:\N%S(",LISTE[RL].SEARCH);
FOR(J=0;J<LISTE[RL].P_ANZ;J++)
{$7b}
SS+=STRLEN(SS)+1;
PRINTF("%S%C",SS,(LISTE[RL].P_ANZ-J-1) ? ',' : ')');
{$7d}
PRINTF("=%S\N",LISTE[RL].REPLACE);
GETCHAR();
{$7d}
ELSE
{$7b}
PRINTF("DEFINE:%S=%S\NLEN1=%D\N",LISTE[RL].SEARCH,
LISTE[RL].REPLACE,LISTE[RL].S_LEN);
{$7d}
{$7d}
#ENDIF
IF(!ER)
{$7b}
HASH=HASHCODE(LISTE[RL].SEARCH,LISTE[RL].S_LEN);
LISTE[RL].NEXTINDEX=HASHINDEX[HASH];
HASHINDEX[HASH]=RL;
{$7d} ELSE
RLIST=RL;
RETURN(ER);
{$7d}
INT TCOMPARE(CHAR S[],CHAR *V[], INT N)
{$7b}
INT I,J,L;
STATIC CHAR T[maxline];
FOR(I=0; S[I]!='\0'; I++)
T[I]=TOLOWER(S[I]);
T[I]='\0';
FOR(I=0;I<N;I++)
{$7b}
L=(INT)STRLEN(V[I]);
FOR(J=0;J<L;J++)
{$7b}
IF(T[J]!=V[I][J])
BREAK;
{$7d}
IF(J==L)
BREAK;
{$7d}
RETURN((I==N)? -1 : I);
{$7d}
INT PP_REPLACE(CHAR *TO, CHAR *TI, INT A,INT B)
{$7b}
CHAR *T=TO,C,*X,*Y,*MX,*RS;
INT I,L,N,SL,D,LD,ER=e_ok,HKFL,KLFL;
CHAR FTI[maxline],FTO[maxline];
/*
INT FLAG=!STRNCMP(TI,"tout",4);
IF(FLAG) PRINTF("FLAG=%D\N",FLAG);
*/
STRCPY(T,TI);
IF(RLIST)
{$7b}
WHILE(T[0]!='\0')
{$7b}
WHILE(!ISALPHA(T[0]) && T[0]!='_')
IF(T[0]=='\0')
BREAK; /*RETURN(e_ok);*/
ELSE
{$7b}
T++;
TI++;
{$7d}
FOR(L=0;ISALNUM(T[L]){$7c}{$7c}T[L]=='_';L++);
LD=L;
/*
IF(FLAG) PRINTF("L=%D,A=%D,T=%S\N",L,A,T);
*/
IF(A<0)
{$7b}
N=HASHINDEX[HASHCODE(T,L)];
DO
{$7b}
SL=LISTE[N].S_LEN;
IF(SL && (SL==L))
{$7b}
I=0;
X=LISTE[N].SEARCH;
WHILE(T[I]==*X++ && T[I])
I++;
IF(I==SL)
{$7b}
RS=LISTE[N].REPLACE;
IF(LISTE[N].P_ANZ)
{$7b}
STRCPY(FTI,LISTE[N].REPLACE);
IF(RLIST+LISTE[N].P_ANZ>=anzdef {$7c}{$7c} MEMFRE<maxline*2)
ER=e_nomem;
ELSE
{$7b}
Y=T+SL;
X=LISTE[N].SEARCH+SL+1;
IF(*Y!='(')
ER=e_syntax;
ELSE
{$7b}
MX=MEM-1;
FOR(I=0;I<LISTE[N].P_ANZ;I++)
{$7b}
LISTE[RLIST+I].SEARCH=X;
LISTE[RLIST+I].S_LEN=(INT)STRLEN(X);
X+=STRLEN(X)+1;
LISTE[RLIST+I].P_ANZ=0;
LISTE[RLIST+I].REPLACE=MX+1;
C=*(++MX)=*(++Y);
HKFL=KLFL=0;
WHILE(C!='\0'
&& ((HKFL!=0
{$7c}{$7c} KLFL!=0)
{$7c}{$7c} (C!=','
&& C!=')')
)
)
{$7b}
IF(C=='\"')
HKFL=HKFL^1;
IF(!HKFL)
{$7b}
IF(C=='(')
KLFL++;
IF(C==')')
KLFL--;
{$7d}
C=*(++MX)=*(++Y);
{$7d}
*MX='\0';
IF(C!=((I==LISTE[N].P_ANZ-1) ? ')' : ','))
{$7b}
ER=e_anzpar;
BREAK;
{$7d}
{$7d}
/*
PRINTF("REPLACE:\N");
PRINTF("%S=%S\N",LISTE[N].SEARCH,LISTE[N].REPLACE);
FOR(I=0;I<LISTE[N].P_ANZ;I++)
PRINTF("-%S=%S\N",LISTE[RLIST+I].SEARCH,LISTE[RLIST+I].REPLACE);
*/
IF(!ER)
ER=PP_REPLACE(FTO,FTI,RLIST,RLIST+I);
/* IF(FLAG) PRINTF("SL=%D,",SL);*/
SL=(INT)((LONG)Y+1l-(LONG)T);
/* IF(FLAG) PRINTF("SL=%D\N",SL);*/
RS=FTO;
/* PRINTF("->%S\N",FTO);*/
{$7d}
{$7d}
IF(ER)
RETURN(ER);
{$7d}
D=(INT)STRLEN(RS)-SL;
IF(STRLEN(TO)+D>=maxline)
RETURN(e_nomem);
/*
IF(D<0)
{$7b}
Y=T+SL+D;
X=T+SL;
WHILE(*Y++=*X++);
{$7d}
IF(D>0)
{$7b}
FOR(LL=STRLEN(T);LL>=SL;LL--)
T[LL+D]=T[LL];
{$7d}
*/
IF(D)
STRCPY(T+SL+D,TI+SL);
I=0;
WHILE((C=RS[I]))
T[I++]=C;
L=SL+D;/*=0;*/
BREAK;
{$7d}
{$7d}
IF(!N)
BREAK;
N=LISTE[N].NEXTINDEX;
{$7d} WHILE(1);
{$7d} ELSE
{$7b}
FOR(N=B-1;N>=A;N--)
{$7b}
SL=LISTE[N].S_LEN;
IF(SL && (SL==L))
{$7b}
I=0;
X=LISTE[N].SEARCH;
WHILE(T[I]==*X++ && T[I])
I++;
IF(I==SL)
{$7b}
RS=LISTE[N].REPLACE;
/*
IF(LISTE[N].P_ANZ)
{$7b}
STRCPY(FTI,LISTE[N].REPLACE);
IF(RLIST+LISTE[N].P_ANZ>=anzdef {$7c}{$7c} MEMFRE<maxline*2)
ER=e_nomem;
ELSE
{$7b}
Y=T+SL;
X=LISTE[N].SEARCH+SL+1;
IF(*Y!='(')
ER=e_syntax;
ELSE
{$7b}
MX=MEM-1;
FOR(I=0;I<LISTE[N].P_ANZ;I++)
{$7b}
LISTE[RLIST+I].SEARCH=X;
LISTE[RLIST+I].S_LEN=STRLEN(X);
X+=STRLEN(X)+1;
LISTE[RLIST+I].P_ANZ=0;
LISTE[RLIST+I].REPLACE=MX+1;
C=*(++MX)=*(++Y);
HKFL=KLFL=0;
WHILE(C!='\0'
&& ((HKFL!=0
{$7c}{$7c} KLFL!=0)
{$7c}{$7c} (C!=','
&& C!=')')
)
)
{$7b}
IF(C=='\"')
HKFL=HKFL^1;
IF(!HKFL)
{$7b}
IF(C=='(')
KLFL++;
IF(C==')')
KLFL--;
{$7d}
C=*(++MX)=*(++Y);
{$7d}
*MX='\0';
IF(C!=((I==LISTE[N].P_ANZ-1) ? ')' : ','))
{$7b}
ER=e_anzpar;
BREAK;
{$7d}
{$7d}
IF(!ER)
ER=PP_REPLACE(FTO,FTI,RLIST,RLIST+I);
SL=(INT)((LONG)Y+1l-(LONG)T);
RS=FTO;
{$7d}
{$7d}
IF(ER)
RETURN(ER);
{$7d}
*/
D=(INT)STRLEN(RS)-SL;
IF(STRLEN(TO)+D>=maxline)
RETURN(e_nomem);
/*
IF(D<0)
{$7b}
Y=T+SL+D;
X=T+SL;
WHILE(*Y++=*X++);
{$7d}
IF(D>0)
{$7b}
FOR(LL=STRLEN(T);LL>=SL;LL--)
T[LL+D]=T[LL];
{$7d}
*/
IF(D)
STRCPY(T+SL+D,TI+SL);
I=0;
WHILE((C=RS[I]))
T[I++]=C;
L+=D;/*0;*/
BREAK;
{$7d}
{$7d}
{$7d}
{$7d}
TI+=LD;
T+=L;
{$7d}
{$7d}
RETURN(e_ok);
{$7d}
INT PP_INIT(VOID)
{$7b}
INT ER;
FOR(ER=0;ER<256;ER++)
HASHINDEX[ER]=0;
FSP=0;
ER=0;
MEM=MALLOC(maxpp);
IF(!MEM) ER=e_nomem;
MEMFRE=maxpp;
RLIST=0;
NLF=1;
NFF=1;
IF(!ER) {$7b}
LISTE=MALLOC((LONG)anzdef*SIZEOF(lIST));
IF(!LISTE) ER=e_nomem;
{$7d}
RETURN(ER);
{$7d}
INT PP_OPEN(CHAR *NAME)
{$7b}
file *FP;
FP=XFOPEN(NAME,"R");
STRCPY(FLIST[0].FNAME,NAME);
FLIST[0].FLINE=0;
FLIST[0].BDEPTH=B_DEPTH();
FLIST[0].FILEP=FP;
FLIST[0].FLINEP=null;
RETURN(((LONG)FP)==0L);
{$7d}
VOID PP_CLOSE(VOID)
{$7b}
IF(FLIST[FSP].BDEPTH != B_DEPTH()) {$7b}
FPRINTF(STDERR, "bLOCKS NOT CONSISTENT IN FILE %S: START DEPTH=%D, END DEPTH=%D\N",
FLIST[FSP].FNAME, FLIST[FSP].BDEPTH, B_DEPTH());
{$7d}
FCLOSE(FLIST[FSP].FILEP);
{$7d}
VOID PP_END(VOID) {$7b} {$7d}
dATEI *PP_GETIDAT(VOID) {$7b}
RETURN &FLIST[FSP];
{$7d}
INT ICL_CLOSE(INT *C)
{$7b}
IF(!FSP)
RETURN(e_eof);
IF(FLIST[FSP].BDEPTH != B_DEPTH()) {$7b}
FPRINTF(STDERR, "bLOCKS NOT CONSISTENT IN FILE %S: START DEPTH=%D, END DEPTH=%D\N",
FLIST[FSP].FNAME, FLIST[FSP].BDEPTH, B_DEPTH());
{$7d}
FCLOSE(FLIST[FSP--].FILEP);
NFF=1;
*C='\N';
RETURN(e_ok);
{$7d}
INT ICL_OPEN(CHAR *TT)
{$7b}
file *FP2;
INT J,I=0;
PP_REPLACE(S,TT,-1,RLIST);
IF(FSP>=maxfile)
RETURN(-1);
IF(S[I]=='<' {$7c}{$7c} S[I]=='"')
I++;
FOR(J=I;S[J];J++)
IF(S[J]=='>' {$7c}{$7c} S[J]=='"')
S[J]='\0';
FP2=XFOPEN(S+I,"R");
IF(!FP2)
RETURN(e_fnf);
SETVBUF(FP2,null,_iofbf,bufsize);
FSP++;
STRCPY(FLIST[FSP].FNAME,S+I);
FLIST[FSP].FLINE=0;
FLIST[FSP].BDEPTH=B_DEPTH();
FLIST[FSP].FLINEP=null;
FLIST[FSP].FILEP=FP2;
NFF=1;
RETURN(0);
{$7d}
INT PGETLINE(CHAR *T)
{$7b}
INT C,ER=e_ok;
INT RLEN, TLEN;
LOOPFL =0;
FILEP =FLIST+FSP;
DO {$7b}
C=FGETLINE(IN_LINE, maxline, &RLEN, FLIST[FSP].FILEP);
/* CONTINUATION LINES */
TLEN = RLEN;
WHILE(C=='\N' && TLEN && IN_LINE[TLEN-1]=='\\') {$7b}
C=FGETLINE(IN_LINE + TLEN-1, maxline-TLEN, &RLEN, FLIST[FSP].FILEP);
TLEN += RLEN-1;
{$7d}
IF(IN_LINE[0]=='#')
{$7b}
IF((ER=PP_COMAND(IN_LINE+1)))
{$7b}
IF(ER!=1)
{$7b}
LOGOUT(IN_LINE);
LOGOUT("\N");
{$7d}
{$7d}
{$7d} ELSE
ER=1;
IF(C==eof)
ER=ICL_CLOSE(&C);
{$7d} WHILE(!ER {$7c}{$7c} (LOOPFL && ER!=e_eof));
IF(!ER {$7c}{$7c} LOOPFL)
IN_LINE[0]='\0';
ER= (ER==1) ? e_ok : ER ;
IF(!ER)
ER=PP_REPLACE(T,IN_LINE,-1,RLIST);
IF(!ER && NFF)
ER=e_newfile;
IF(!ER && NLF)
ER=e_newline;
NLF=NFF=0;
FILEP=FLIST+FSP;
FILEP->FLINEP=IN_LINE;
RETURN(ER);
{$7d}
/*************************************************************************/
INT RGETC(file *FP)
{$7b}
STATIC INT C,D,FL;
FL=0;
DO
{$7b}
WHILE((C=GETC(FP))==13); /* REMOVE ^m FOR UNICES */
IF(FL && (C=='*'))
{$7b}
IF((D=GETC(FP))!='/')
UNGETC(D,FP);
ELSE
{$7b}
FL--;
WHILE((C=GETC(FP))==13);
{$7d}
{$7d}
IF(C=='\N')
{$7b}
FLIST[FSP].FLINE++;
NLF=1;
{$7d} ELSE
IF(C=='/')
{$7b}
IF((D=GETC(FP))!='*')
UNGETC(D,FP);
ELSE
FL++;
{$7d}
{$7d} WHILE(FL && (C!=eof));
RETURN(C-'\T'?C:' ');
{$7d}
INT FGETLINE(CHAR *T, INT LEN, INT *RLEN, file *FP)
{$7b}
STATIC INT C,I;
I=0;
DO {$7b}
C=RGETC(FP);
IF(C==eof {$7c}{$7c} C=='\N')
{$7b}
T[I]='\0';
BREAK;
{$7d}
T[I]=C;
I= (I<LEN-1) ? I+1 : LEN-1;
{$7d} WHILE(1);
*RLEN = I;
RETURN(C);
{$7d}