⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scan.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lintstatic  char sccsid[] = "@(#)scan.c 1.1 92/07/30 SMI";#endif/* * Copyright (c) 1988 by Sun Microsystems, Inc. *//* *	Microassembler scanner for FPA *		scan.c	1.1	30 May 1985    */#include "micro.h"#include <stdio.h>#include <ctype.h>#define scansp(c)  while(isspace(c = *curpos)) curpos++#define scanb(c) scansp(c); if (c == ',' ){c=nextc(); scansp(c);}#define nextc()     *++curpos#define peekc()     *curpos#define MAXSYMBOL 256#define MAXLINE 1024int curlineno;char *curfilename;char *curpos;char *curline;char inputline[MAXLINE];/* The following 2 lines added by PWC to count lines of ucode. */extern NODE n[];extern NODE *curnode;extern short curaddr;extern short maxaddr;extern CODE code[];extern CODE *curword;extern Boolean aseq();extern Boolean ati8847();extern Boolean adata();extern Boolean arecreg();extern Boolean aram();extern Boolean aptr();extern char   *strcpy();Booleannewline(){    /* glom a new input line.     * clobber comments. do     * continuation-line collection, as well.     */    register char *  maxpos = inputline + sizeof inputline - 1;    register char *cp;    char *end;    register c;    int len;    cp = inputline;restart:    curlineno++;    do {	c = getchar();	if (c == '&') {		while ( getchar() != '\n' );		goto restart;	}	*cp++ = c;    } while ( c != '\n' && c != EOF && cp < maxpos );    if ( c == EOF ) return False;    end = cp;    *cp = '\0';    if (cp == maxpos){	error("Sorry, line(s) too long");	goto process;    }process:    curpos = inputline;    len = end-inputline;    curline = (char*)malloc(len+2);    if (curline == 0) {	error("unable to get sufficient storage\n");	return False;    }    strcpy( curline, inputline );    return True;}char *scansym( ){    static char stuff[MAXSYMBOL];    register char *cp;    register char c;    Boolean ok = True;    cp = stuff;    curpos -= 1; /*back up to get a running start*/    while( ok ){	while (isalnum(*cp++ = c = nextc()));	switch(c){	case '.':	case '_':	case '\\':	    continue;	default:	    ok = False;	}    }    *--cp = '\0';    return( stuff );}intgetnum( ){    register char c = *curpos;    register int val, base;    int sign;    sign = 1;    if (c == '-') {	sign = -1;	c = nextc();    } else if (c == '+') {	c = nextc();    }    val = c - '0';    base = (val==0)? 010 : 10;    c = nextc();    if ( val == 0 && (c == 'x' || c == 'X') ){	base = 0x10;	c = nextc();    }    while(isxdigit(c)){	val *= base;	if( isdigit(c) )	    val += c -'0';	else if (islower(c))	    val += c -'a' + 10;	else	    val += c -'A' + 10;	c = nextc();    }    if (sign == -1) {	val = -val;    }    return( val );}Booleanseqpart (name)	char    *name;{	register char      c;	register RESERVED *rp;	register char     *cp;	int      brnch = 001;		/* default to next */	int	 condition = 0;		/* default to never */	int      state = 0;		/* default */	int      latch = 1;	int      offset;	SYMTYPE  which = NEITHER;	int	 num   = 0;	static   char buff[MAXSYMBOL];	char	*labl = buff;#define CHEK    if(c==';') {c=nextc(); scanb(c); return ASEQ;} \		rp = resw_lookup( cp = scansym( ) ); \		if ( rp == 0 ) goto wbotch;#define ASEQ 	aseq( brnch, condition, which, num, labl, state, latch )	if ( name == 0 && peekc() == ';') {   /* no seq field */		c = nextc();		scanb(c);		return ASEQ;	}start:	rp = resw_lookup( cp = name );	if ( rp == 0 ) goto wbotch;	if ( rp->type == Branch1) {		brnch = rp->value1;		scanb(c);		if ( rp->value2 == 2 ) {		    curnode->jumpop = True;		    if ( isdigit(c) || c == '.' ) goto address;		    if ( isalpha(c) ) {			rp = resw_lookup(cp = scansym());			if ( rp == 0 ) {			    which = ALPHA;			    strcpy (labl, cp);			    scanb(c);			    CHEK;			}		    } else goto botch;		} else {		    CHEK		}	}	if ( rp->type == Branch2 ) {		condition = rp->value1;	address:		curnode->jumpop = True;		scanb(c);		if (isdigit(c)) {            		which = NUMBER;            		num = getnum( );            		scanb(c);        	} else if (isalpha(c)) {            		which = ALPHA;			strcpy (labl, scansym( ));            		scanb(c);        	} else if (c == '.') {            		which = NUMBER;            		offset = 0;            		c = nextc( );            		scanb(c);            		if (c == '+') {                		c = nextc();                		scanb(c);                		offset = getnum();                		scanb(c);            		} else if (c == '-') {				c = nextc();                		scanb(c);                		offset = -getnum();                		scanb(c);			}             		num = curaddr - 1 + offset;        	} else goto botch;		CHEK	}	if ( rp->type == State ) {		state = rp->value1;		scanb(c);		CHEK	}	if ( rp->type == Latch && rp->value2 == 1 ) {		latch = rp->value1;		scanb(c);		CHEK		if ( rp->type == Latch && rp->value2 == 2 ) {			latch += rp->value1;			scanb(c);			CHEK		}	}	if ( rp->type == Latch && rp->value2 == 3 ) {		latch += rp->value1;		scanb(c);		if ( c == ';' ) {			c = nextc();			scanb(c);			return ASEQ;		}	}wbotch :	error ("%s found in seq_state field", cp );	return False;botch:	error ("seq_state field syntax error, character %c is not expected", c);	return False;#undef ASEQ#undef CHEK}Booleantipart(){	register char c;	register RESERVED *rp;	char	*cp;	int	func  = 0x020,		/* default to spass */		src = 0xff,		/* default to RA input register */		regctl = 0,		csrc = 0,		output = 0x2,		conf = 1,		halt = 0;#define CHEK    if(c==';') {c=nextc(); scanb(c); return ATI8847;} \		rp = resw_lookup( cp = scansym( ) ); \		if ( rp == 0 ) goto wbotch;#define ATI8847 ati8847( func, src, regctl, csrc, output, halt, conf )	scanb(c);	if ( c == ';' ) {    /* no TIinst field */		c = nextc();		scanb(c);		return ATI8847;	}	rp = resw_lookup(cp=scansym( ));	if ( rp == 0 ) goto wbotch;	if ( rp->type == Function ) {		func = rp->value1;		scanb( c );		CHEK;		if ( rp->type == Source && rp->value2 == 1 ) {			src = ( src & ~0x03 ) | rp->value1;			scanb( c );			CHEK;		}		if ( rp->type == Source && rp->value2 == 2 ) {			src = ( src & ~0x0c ) | rp->value1;			scanb( c );			CHEK;		}		if ( rp->type == Source && rp->value2 == 3 ) {			src = ( src & ~0x30 ) | rp->value1;			scanb( c );			CHEK;		}		if ( rp->type == Source && rp->value2 == 4 ) {			src = ( src & ~0xc0 ) | rp->value1;			scanb( c );			CHEK;		}	}	if ( rp->type == Regctl && rp->value2 == 1 ) {		regctl = rp->value1;		scanb( c );		CHEK;	}	if ( rp->type == Regctl && rp->value2 == 2 ) {		regctl += rp->value1;		scanb( c );		CHEK;	}	if ( rp->type == Csrc && rp->value2 == 1 ) {		csrc = rp->value1;		scanb( c );		CHEK;	}	if ( rp->type == Csrc && rp->value2 == 2 ) {		csrc += rp->value1;		scanb( c );		CHEK;	}	if ( rp->type == Output && rp->value2 == 1 ) {		output = rp->value1;		scanb( c );		CHEK;	}	if ( rp->type == Output && rp->value2 == 2 ) {		output += rp->value1;		scanb( c );		CHEK;	}	if ( rp->type == Config ) {		conf = rp->value1;		scanb( c );		CHEK;	}	if ( rp->type == Halt ) {		halt = rp->value1;		scanb( c );		if (c == ';') {			c = nextc();			scanb(c);			return ATI8847;		}	}wbotch :	error ("%s found in TIinst field", cp );	return False;botch:	error ("TIinst syntax error, character %c is not expected", c);	return False;#undef CHEK#undef ATI8847}Booleanramoppart(){	register char c;	register RESERVED *rp;	char    *cp;	int      dctrl = 017;	/* default to idle state */#define ADATA   adata(dctrl)#define CHEK    if(c==';') {c=nextc(); scanb(c); return ADATA;} \		rp = resw_lookup( cp = scansym( ) ); \		if ( rp == 0 ) goto wbotch;	scanb(c);	if ( c == ';' ) {    /* no datamuxing field */		c = nextc();		scanb(c);		return ADATA;	}	rp = resw_lookup(cp=scansym( ));	if ( rp == 0 ) goto wbotch;	if (rp->type == Regram ) {		dctrl = rp->value1;		scanb(c);		if (c == ';') {			c = nextc();			scanb(c);			return ADATA;		}	}	error ("ramop syntax error, character %c is not expected", c);	return False;wbotch :	error ("%s found in ramop field", cp );	return False;#undef ADATA#undef CHEK}Booleanramctlpart(){	register char c;	register RESERVED *rp;	char    *cp;	int      ramcs = 0,		 ptr = 0;#define CHEK    if(c==';') {c=nextc(); scanb(c); return ARAM;} \        	rp = resw_lookup(cp=scansym( )); \        	if ( rp == 0 ) goto wbotch;#define ARAM	aram ( ramcs, ptr )			scanb(c);        if ( c == ';' ) {    /* no ramctrl field */                c = nextc();                scanb(c);                return ARAM;        }        rp = resw_lookup(cp=scansym( ));        if ( rp == 0 ) goto wbotch;        if (rp->type == Ramcs ) {                ramcs = rp->value1;                 scanb(c);                CHEK        }        if (rp->type == Pointer ) {		if ( rp->value2 == 2 ) {			error("pointer %s is not allowed here", cp);			return False;		}		ptr = rp->value1;		scanb(c);		if (c == ';') {			c = nextc();			scanb(c);			return ARAM;		}        }        error ("ram control field syntax error, character %c is not expected", c);        return False;wbotch :        error ("%s found in ram control field", cp );        return False;#undef CHEK#undef ARAM}Booleanptrpart ( ){	register char 	  c;	register RESERVED*rp;	register char 	 *cp;	int	 ptr = 0;	int	 act = 0;	SYMTYPE  which = NEITHER;	int	 num;	char	*sym;#define APTR 	aptr( ptr, act, which, num, sym) 	scanb(c);	if ( c== '|' || c == '\0' ) {         /* no ptr_action field */		if ( c == '|' ) {			c = nextc();			scanb(c);		}		return APTR;	}	rp = resw_lookup(cp=scansym( ));	if ( rp == 0 ) goto wbotch;	if ( rp->type == Pointer ) {		if ( rp->value2 == 1 ) {			error("pointer %s is not allowed here", cp);			return False;		}		ptr = rp->value1;		scanb(c);		switch (c) {		case '=' :             /* hold */			act = 0;			break;		case '!':			if ( ptr == 1 || ptr == 2 || ptr == 3 || ptr == 4) {				error("action is not allowed for the pointer");				return False;			}			act = 1;       /* load */			c = nextc();			scanb(c);			if ( c == '|' || c == '\0' ) return APTR;			if ( curnode->jumpop == True ) {				error("overlap address field with load value");				return False;			}			if (isdigit(c)) {				which = NUMBER;				num = getnum( );				scanb(c);				if ( c == '+') {					c = nextc();					scanb(c);					if (! isdigit(c)) goto wbotch;					num += getnum();					curpos--;				} else {					curpos--;				}			} else  if(isalpha(c)) {				which = ALPHA;				sym = scansym( );			} else goto wbotch;			break;		case '+':			if ( ptr == 6 || ptr == 7 ) {				error("action is not allowed for the pointer");				return False;			}			act = 3;			break;		case '-':			if ( ptr == 7 ) {				error("action is not allowed for the pointer");				return False;			}			act = 2;			break;		default :        		error ("ptr control field syntax error, character %c is not expected", c);        		return False;		}		c = nextc();		scanb(c);		if ( c == '|' || c == '\0' ) return APTR;	}wbotch :        error ("%s found in ptr control field", cp );        return False;#undef APTR}label(sp)    SYMBOL *sp;{    if (sp->defined){	error("label %s already defined", sp->name );	return;    }    sp->defined = True;    sp->node = curnode+1;    DEBUG("Label: defining %s\n", sp->name);}Booleancpp(){    /* the scanner just saw a '#' -- treat as cpp leaving */    register char c ;    char *sp;    int leng;    int cln;    nextc();    scanb(c);    cln = curlineno;    curlineno = getnum( ) - 1;    scanb(c);    if (c != '"') {	curlineno = cln;	error("#-line not of form output by C preprocessor");	return False;    }    /* just saw the " */    c = nextc(); /* skip it */    sp =  curpos;    while( (c=nextc()) != '"' );    *curpos = '\0';    leng = strlen( sp );    curfilename = (char *)malloc( leng+1 );    if (curfilename == 0) {	error("unable to get sufficient storage\n");	return False;    }    strcpy(  curfilename, sp );    DEBUG("# %d \"%s\"\n", curlineno+1, curfilename);    return True;}    scanprog(){    /*       for each line in the program text:	if it is blank, continue.	if it begins with a '#', its a cpp dropping	look at the first symbol on the line.	    if it is followed by a :, its a label,		so define the label and scan out the next symbol	assemble the seq_state part	assemble the Weitek instruction part	assemble the datamuxing part	assemble the recover reg ctrl part	assemble the ram control part	assemble the pointer actoin part    */    char c;    char *name;    SYMBOL *sp;    Boolean stopsw = False;    Boolean bkptsw = False;    int debugsw = 0;    register RESERVED *rp;    Boolean checkeol();    while (newline()){	if (*curpos == '#'){	    cpp();	    continue;	}restart:	scanb(c);	if( c == '\0') {	    continue; /* blank line */	}	if (c == ';') {	    name = 0;	    anext();	    goto doseq;	}	if (!isalnum(c)) {	    if (c != '|') {		error("character %c unexpected", c);	    }	    anext();	    curnode->org_pseudo = True;	    continue;	}	name = scansym( );	scanb(c);	if(c== ':') {	    /* what we have here is a label */	    sp = lookup( name );	    if (sp == 0)		sp = enter( name );	    label( sp );	    nextc();	    scanb(c);	    (curnode+1)->addr = curaddr;	    if (c == '\0') {		anext();		curnode->org_pseudo = True;	    }	    goto restart;	}	anext();	rp = resw_lookup( name );	if (rp != 0 && rp->type == Pseudo) {	    /* it's a pseudo-op */	    switch (rp->value1) {	    case 1:	/* org */	        scanb(c);	        if (!isdigit(c)) {		    error("expected digit; found %c", c);		    continue;		}		curnode->org_pseudo = True;		curaddr = getnum();		break;	    case 2:     /* sccsid */                scanb(c);		acode();                asccs(curpos);                curnode->addr = curaddr++;		if ( curaddr > maxaddr ) {			maxaddr = curaddr;		}                break;	    case 3:     /* routine */		doramtable( );		break;            }            continue;        } doseq:	acode();	curnode->addr = curaddr++;	if ( curaddr > maxaddr ) {		maxaddr = curaddr;	}	if (seqpart(name) == False) continue; 	if (tipart( ) == False) continue; 	if (ramoppart( ) == False) continue;	if (ramctlpart( ) == False) continue;	ptrpart( );    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -