Blame as10k1/parse.c

Packit Service b98cfc
/***************************************************************************
Packit Service b98cfc
                          parse.c  -  parses each line, stores in temp space
Packit Service b98cfc
                             -------------------
Packit Service b98cfc
    Date                 : May 23 2000
Packit Service b98cfc
    Copyright            : (C) 2000 by Daniel Bertrand
Packit Service b98cfc
    Email                : d.bertrand@ieee.ca
Packit Service b98cfc
 ***************************************************************************/
Packit Service b98cfc
Packit Service b98cfc
/***************************************************************************
Packit Service b98cfc
 *                                                                         *
Packit Service b98cfc
 *   This program is free software; you can redistribute it and/or modify  *
Packit Service b98cfc
 *   it under the terms of the GNU General Public License as published by  *
Packit Service b98cfc
 *   the Free Software Foundation; either version 2 of the License, or     *
Packit Service b98cfc
 *   (at your option) any later version.                                   *
Packit Service b98cfc
 *                                                                         *
Packit Service b98cfc
 ***************************************************************************/
Packit Service b98cfc
Packit Service b98cfc
#include<string.h>
Packit Service b98cfc
#include<stdio.h>
Packit Service b98cfc
#include"types.h"
Packit Service b98cfc
#include"parse.h"
Packit Service b98cfc
#include"proto.h" 
Packit Service b98cfc
Packit Service b98cfc
/*
Packit Service b98cfc
This function parses the asm file calling appropriate functions to blow up macros, include files,
Packit Service b98cfc
define constants, keep track of equates, and handling assembler directives.
Packit Service b98cfc
Packit Service b98cfc
This function is called on a line by line basis.
Packit Service b98cfc
Packit Service b98cfc
normally returns value 0 except when "end" directive is encountered in which case it returns 1,
Packit Service b98cfc
 the "endm" directive which return -1, or the "endfor" deirective which returns -2
Packit Service b98cfc
*/
Packit Service b98cfc
Packit Service b98cfc
extern char type_strings[GPR_TYPE_EQUATE+1][20];
Packit Service b98cfc
extern int dbg_opt;
Packit Service b98cfc
extern char *listing,listtemp[60];
Packit Service b98cfc
extern FILE *listfile;
Packit Service b98cfc
Packit Service b98cfc
int parse( char line_string[MAX_LINE_LENGTH], char *line)
Packit Service b98cfc
{
Packit Service b98cfc
        int tmp,i,arg[4];
Packit Service b98cfc
        static int defmacro=0; //set to 0 unless we're in a macro definition
Packit Service b98cfc
        int op_num;
Packit Service b98cfc
	char  *leading_symbol=NULL, *op_name_ptr,*tmpc;
Packit Service b98cfc
        extern char patch_name[PATCH_NAME_SIZE];
Packit Service b98cfc
	extern int ds_addr,ip,tram_addr,tram_delay_count,tram_table_count;
Packit Service b98cfc
        extern unsigned int macro_depth;
Packit Service b98cfc
     
Packit Service b98cfc
        struct sym *sym;
Packit Service b98cfc
        struct control *control;
Packit Service b98cfc
        
Packit Service b98cfc
        extern struct delay tram_delay[MAX_TANK_ADDR];
Packit Service b98cfc
        extern struct lookup tram_lookup[MAX_TANK_ADDR];
Packit Service b98cfc
	
Packit Service b98cfc
	
Packit Service b98cfc
	if( line_string[0]=='\0' || line_string[0]==';'||line_string[0]=='%'||line_string[0]=='*')
Packit Service b98cfc
	    	return(0);
Packit Service b98cfc
        //remove anything after a ; if one exist
Packit Service b98cfc
        tmpc=line_string;
Packit Service b98cfc
        while( *tmpc !=  ';' &&*tmpc != '\0')
Packit Service b98cfc
                tmpc++;
Packit Service b98cfc
        *tmpc='\0';
Packit Service b98cfc
Packit Service b98cfc
        //check for a leading symbol
Packit Service b98cfc
	if( line_string[0] != ' ' && line_string[0] != '\t'){
Packit Service b98cfc
		
Packit Service b98cfc
		if(strlen(leading_symbol=strtok(line_string,": \t\n"))>MAX_SYM_LEN ){
Packit Service b98cfc
			printf("symbol \"%s\" is more than %d characters long\n",leading_symbol,MAX_SYM_LEN );
Packit Service b98cfc
			as_exit("Parse error");
Packit Service b98cfc
                }
Packit Service b98cfc
		
Packit Service b98cfc
                //address ref for skip command:
Packit Service b98cfc
                if(*leading_symbol=='.'){
Packit Service b98cfc
                        if( issymbol(leading_symbol,&sym)!=-1)
Packit Service b98cfc
                                (sym->data.value)+=ip-1;
Packit Service b98cfc
                }
Packit Service b98cfc
		op_name_ptr=strtok(NULL, " \t\n");  
Packit Service b98cfc
        }else{
Packit Service b98cfc
                op_name_ptr=strtok(line_string, " \t\n");
Packit Service b98cfc
        }
Packit Service b98cfc
                
Packit Service b98cfc
	if(op_name_ptr==NULL)
Packit Service b98cfc
		return(0);
Packit Service b98cfc
Packit Service b98cfc
	        
Packit Service b98cfc
        //check if it a macro:
Packit Service b98cfc
        if((tmp=ismacro(op_name_ptr)) != -1 ){
Packit Service b98cfc
                if(defmacro==0)
Packit Service b98cfc
                        macro_expand(tmp,strtok(NULL,""));
Packit Service b98cfc
			return(0);
Packit Service b98cfc
        }
Packit Service b98cfc
	
Packit Service b98cfc
        if( (op_num=op_decode(op_name_ptr))==-1) {
Packit Service b98cfc
                printf("**Parse Error with op code field \"%s\"\n",op_name_ptr);
Packit Service b98cfc
                as_exit("Parse Error: Bad neumonic");
Packit Service b98cfc
        }
Packit Service b98cfc
	
Packit Service b98cfc
	//check to see if we're defining a macro
Packit Service b98cfc
	if(leading_symbol!=NULL && defmacro!=0 && op_num!=CON && op_num!=CONSTANT)
Packit Service b98cfc
		as_exit("Parse error: Cannot define symbols inside of a macro");
Packit Service b98cfc
                      
Packit Service b98cfc
             
Packit Service b98cfc
        switch(op_num){
Packit Service b98cfc
                
Packit Service b98cfc
        case EQU:
Packit Service b98cfc
                add_symbol(leading_symbol,GPR_TYPE_EQUATE,arg_decode(strtok(NULL, " \t\n"),0),0);
Packit Service b98cfc
                return(0);
Packit Service b98cfc
                
Packit Service b98cfc
        case DS:
Packit Service b98cfc
                printf("**Assembler warning: \"DS\" will be obsoleted\n");
Packit Service b98cfc
        case DYNAMIC:
Packit Service b98cfc
        case DYN:
Packit Service b98cfc
                add_symbol(leading_symbol,GPR_TYPE_DYNAMIC,ds_addr++,0);
Packit Service b98cfc
Packit Service b98cfc
                if( (tmpc=strtok(NULL, " \t\n"))==NULL)
Packit Service b98cfc
                        tmp=0;
Packit Service b98cfc
                else if((tmp=arg_decode(tmpc,0)) <=0)
Packit Service b98cfc
                        tmp=1;
Packit Service b98cfc
                for(i=1;i
Packit Service b98cfc
                        add_symbol( (char *)NO_SYM ,GPR_TYPE_DYNAMIC,ds_addr++,0);
Packit Service b98cfc
Packit Service b98cfc
                }
Packit Service b98cfc
                return(0);
Packit Service b98cfc
        case MACRO:
Packit Service b98cfc
                new_macro(leading_symbol,line,strtok(NULL, "")-line_string+line);
Packit Service b98cfc
                defmacro++;
Packit Service b98cfc
                return(0);                                
Packit Service b98cfc
        case DC:
Packit Service b98cfc
                printf("**Assembler warning: \"DC\" will be obsoleted\n");
Packit Service b98cfc
        case STA:
Packit Service b98cfc
        case STATIC:
Packit Service b98cfc
                tmpc = strtok(NULL, " ,\t\n") ;
Packit Service b98cfc
                
Packit Service b98cfc
                if(tmpc == NULL)
Packit Service b98cfc
                        as_exit("Error DC directive must contain an initial value");
Packit Service b98cfc
                while(tmpc!=NULL ){
Packit Service b98cfc
                        
Packit Service b98cfc
                        if(  tmpc[0] == '&' )
Packit Service b98cfc
                                tmp=arg2long(tmpc)*0x800; //account for 11 bit shift of addresses
Packit Service b98cfc
                        else
Packit Service b98cfc
                                tmp=arg2long(tmpc);
Packit Service b98cfc
Packit Service b98cfc
                        add_symbol(leading_symbol,GPR_TYPE_STATIC,ds_addr++,tmp);
Packit Service b98cfc
Packit Service b98cfc
                        leading_symbol=(char *)NO_SYM;
Packit Service b98cfc
                        
Packit Service b98cfc
			tmpc=strtok(NULL, " ,\t");
Packit Service b98cfc
                }
Packit Service b98cfc
                return(0);
Packit Service b98cfc
Packit Service b98cfc
        case CONSTANT:
Packit Service b98cfc
        case CON:
Packit Service b98cfc
		//declaring constants inside of a macro is legal and needed for branch macros
Packit Service b98cfc
		if(defmacro!=0)
Packit Service b98cfc
			return (0);
Packit Service b98cfc
		
Packit Service b98cfc
Packit Service b98cfc
		tmpc = strtok(NULL, " ,\t\n") ;
Packit Service b98cfc
                
Packit Service b98cfc
                if(tmpc == NULL)
Packit Service b98cfc
                        as_exit("Error Constant directive must contain a value");
Packit Service b98cfc
                while(tmpc!=NULL ){
Packit Service b98cfc
                        
Packit Service b98cfc
                        if(  tmpc[0] == '&' )
Packit Service b98cfc
                                tmp=arg2long(tmpc)*0x800; //account for 11 bit shift of addresses
Packit Service b98cfc
                        else
Packit Service b98cfc
                                tmp=arg2long(tmpc);
Packit Service b98cfc
                        
Packit Service b98cfc
			//     add_constant(leading_symbol,tmp);
Packit Service b98cfc
			
Packit Service b98cfc
			add_symbol(leading_symbol,GPR_TYPE_CONSTANT,ds_addr++,tmp);
Packit Service b98cfc
                        
Packit Service b98cfc
			leading_symbol=(char *)NO_SYM;
Packit Service b98cfc
                        
Packit Service b98cfc
                        tmpc=strtok(NULL, " ,\t");
Packit Service b98cfc
                }
Packit Service b98cfc
		
Packit Service b98cfc
                return(0);
Packit Service b98cfc
        case IO:
Packit Service b98cfc
                add_symbol(leading_symbol,GPR_TYPE_INPUT,ds_addr++,0);
Packit Service b98cfc
                add_symbol(strcat(leading_symbol,".o"),GPR_TYPE_OUTPUT,ds_addr++,0);
Packit Service b98cfc
                return(0);
Packit Service b98cfc
        case DIN:
Packit Service b98cfc
                as_exit("DIN is obsoleted, use IO instead");
Packit Service b98cfc
                add_symbol(leading_symbol,GPR_TYPE_INPUT,ds_addr++,0);
Packit Service b98cfc
                return(0);
Packit Service b98cfc
        case DOUT:
Packit Service b98cfc
                as_exit("DOUT is obsoleted, use IO instead");
Packit Service b98cfc
                        add_symbol(leading_symbol,GPR_TYPE_OUTPUT,ds_addr++,0);
Packit Service b98cfc
                        return(0);
Packit Service b98cfc
        case DD:
Packit Service b98cfc
		add_symbol(leading_symbol,GPR_TYPE_EQUATE,0x100+tram_delay_count,0);
Packit Service b98cfc
		(&tram_delay[tram_delay_count])->size = arg2long( strtok(NULL, " \t\n" ) ) +1;
Packit Service b98cfc
		
Packit Service b98cfc
		INIT_LIST_HEAD( &(tram_delay[tram_delay_count].tram  )  );
Packit Service b98cfc
		strcpy((&tram_delay[tram_delay_count])->name,leading_symbol);
Packit Service b98cfc
		if((dbg_opt&DBG_TRAM))
Packit Service b98cfc
			printf("Delay Line:  %-16s, length: 0x%05x samples,\n",(&tram_delay[tram_delay_count])->name, (&tram_delay[tram_delay_count])->size);
Packit Service b98cfc
		tram_delay_count++;
Packit Service b98cfc
                        return(0);
Packit Service b98cfc
        case DT:
Packit Service b98cfc
                add_symbol(leading_symbol,GPR_TYPE_EQUATE,tram_table_count,0);
Packit Service b98cfc
                (&tram_lookup[tram_table_count])->size = arg2long( strtok(NULL, " \t\n" ) );
Packit Service b98cfc
                INIT_LIST_HEAD(   &(tram_lookup[tram_table_count].tram) );
Packit Service b98cfc
		strcpy((&tram_lookup[tram_table_count])->name,leading_symbol);
Packit Service b98cfc
		
Packit Service b98cfc
		if((dbg_opt&DBG_TRAM))
Packit Service b98cfc
			printf("Lookup table: %-16s, length: 0x%05x samples\n",leading_symbol, (&tram_delay[tram_delay_count])->size);
Packit Service b98cfc
		tram_table_count++;
Packit Service b98cfc
                        return(0);
Packit Service b98cfc
        case DW:
Packit Service b98cfc
                //two symbols are created, "symbol"   ->  addr:0x2xx ; value: tram id #
Packit Service b98cfc
                //                         "symbol.a" ->  addr:0x3xx ; value: write offset
Packit Service b98cfc
		
Packit Service b98cfc
		add_symbol(leading_symbol,TYPE_TRAM_DATA,tram_addr+0x200, arg_decode(tmpc=strtok(NULL, " \t," ),0) );
Packit Service b98cfc
		add_symbol( strcat(leading_symbol,".a") ,TYPE_TRAM_ADDR_WRITE, (tram_addr++)+0x300 ,
Packit Service b98cfc
                            arg2long(strtok(NULL," \t\n")));
Packit Service b98cfc
		if(dbg_opt&DBG_TRAM)
Packit Service b98cfc
			printf(", in segment: \"%s\"\n",tmpc);
Packit Service b98cfc
		
Packit Service b98cfc
		return(0);
Packit Service b98cfc
Packit Service b98cfc
	case DR:
Packit Service b98cfc
		add_symbol(leading_symbol,TYPE_TRAM_DATA,tram_addr+0x200,arg_decode(tmpc=strtok(NULL, " \t," ),0) );
Packit Service b98cfc
		add_symbol(strcat(leading_symbol,".a"),TYPE_TRAM_ADDR_READ,(tram_addr++)+0x300,
Packit Service b98cfc
                           arg2long(strtok(NULL," \t\n")));
Packit Service b98cfc
		if(dbg_opt&DBG_TRAM)
Packit Service b98cfc
			printf(", in segment: \"%s\"\n",tmpc);
Packit Service b98cfc
		return(0);
Packit Service b98cfc
        case CONTROL:
Packit Service b98cfc
			if( (tmpc = strtok(NULL, "\t ,\n")) ==NULL)
Packit Service b98cfc
			    as_exit("Parse Error: missing operand(s)");
Packit Service b98cfc
			    
Packit Service b98cfc
                        if(  tmpc[0] == '&' )
Packit Service b98cfc
                                tmp=arg2long(tmpc)<<11; //account for 11 bit shift of addresses
Packit Service b98cfc
                        else
Packit Service b98cfc
                                tmp=arg2long(tmpc);
Packit Service b98cfc
                        add_symbol(leading_symbol,GPR_TYPE_CONTROL,ds_addr++,tmp);
Packit Service b98cfc
                        issymbol(leading_symbol,(struct sym **)(&control));
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
                        if( (tmpc = strtok(NULL, "\t ,\n") )==NULL)
Packit Service b98cfc
			    as_exit("Parse Error: missing operand(s)");
Packit Service b98cfc
                       
Packit Service b98cfc
Packit Service b98cfc
                        if(  tmpc[0] == '&' ) 
Packit Service b98cfc
                                control->min=arg2long(tmpc)<<11; //account for 11 bit shift of addresses
Packit Service b98cfc
                        else
Packit Service b98cfc
                                control->min=arg2long(tmpc);
Packit Service b98cfc
			
Packit Service b98cfc
			if( (tmpc = strtok(NULL, "\t ,\n")) ==NULL)
Packit Service b98cfc
			    as_exit("Parse Error: missing operand(s)");
Packit Service b98cfc
Packit Service b98cfc
                       
Packit Service b98cfc
                        if(  tmpc[0] == '&' ) 
Packit Service b98cfc
                                control->max=arg2long(tmpc)<<11; //account for 11 bit shift of addresses
Packit Service b98cfc
                        else
Packit Service b98cfc
                                control->max=arg2long(tmpc);
Packit Service b98cfc
                        
Packit Service b98cfc
                        return(0);
Packit Service b98cfc
        case ENDM:
Packit Service b98cfc
                        if(defmacro==1) {
Packit Service b98cfc
                                defmacro--;
Packit Service b98cfc
                                return(0);
Packit Service b98cfc
                        }else if(macro_depth!=0)
Packit Service b98cfc
                                return(-1);
Packit Service b98cfc
                        else
Packit Service b98cfc
                                as_exit("Error, stray ENDM directive");
Packit Service b98cfc
        case END:
Packit Service b98cfc
                        if(defmacro==1)
Packit Service b98cfc
                                as_exit("Error end directive in macro definition");
Packit Service b98cfc
                        return(1);	
Packit Service b98cfc
        case INCLUDE:
Packit Service b98cfc
                if(defmacro==1)
Packit Service b98cfc
                        as_exit("Error, cannot include file from within macro definition");
Packit Service b98cfc
		if(listing){
Packit Service b98cfc
			sprintf(listtemp,"including file");
Packit Service b98cfc
			fprintf(listfile,"%-50s ||   %s\n",listtemp,line);
Packit Service b98cfc
                }
Packit Service b98cfc
		asm_open(strtok(NULL, "\'\""));
Packit Service b98cfc
		
Packit Service b98cfc
                return(-3);
Packit Service b98cfc
        case NAME:
Packit Service b98cfc
                advance_to_end(op_name_ptr);
Packit Service b98cfc
                op_name_ptr++;
Packit Service b98cfc
                advance_over_whites(op_name_ptr);
Packit Service b98cfc
		if(dbg_opt)
Packit Service b98cfc
			printf("Patch name:%s\n",op_name_ptr);
Packit Service b98cfc
Packit Service b98cfc
		//	printf("%s\n",op_name_ptr);
Packit Service b98cfc
                tmpc=strtok(op_name_ptr,"\"");
Packit Service b98cfc
                if(tmpc==NULL)
Packit Service b98cfc
                        as_exit("Bad name string, did you remember quotes\"\"");
Packit Service b98cfc
                if(strlen(tmpc)>PATCH_NAME_SIZE)
Packit Service b98cfc
                        as_exit("Error Patch name exceeds maximum allowed amount (16)");
Packit Service b98cfc
		memset(patch_name,0,PATCH_NAME_SIZE);
Packit Service b98cfc
                strcpy(patch_name,tmpc);
Packit Service b98cfc
                return(0);
Packit Service b98cfc
        case FOR:
Packit Service b98cfc
		if(listing){
Packit Service b98cfc
			sprintf(listtemp,"FOR LOOP");
Packit Service b98cfc
			fprintf(listfile,"%-50s ||   %s\n",listtemp,line);
Packit Service b98cfc
                }
Packit Service b98cfc
                for_handler(line,strtok(NULL,""));
Packit Service b98cfc
		
Packit Service b98cfc
                return(-3);
Packit Service b98cfc
        case ENDFOR:
Packit Service b98cfc
		sprintf(listtemp,"FOR LOOP DONE");
Packit Service b98cfc
                return(-2);
Packit Service b98cfc
        default:
Packit Service b98cfc
                
Packit Service b98cfc
                if(defmacro==0){
Packit Service b98cfc
			
Packit Service b98cfc
                        for(i=0;i<=3;i++)
Packit Service b98cfc
                                arg[i]=arg_decode(strtok(NULL,","),0);
Packit Service b98cfc
                        op(op_num,arg[0],arg[1],arg[2],arg[3]);
Packit Service b98cfc
                        return(0);
Packit Service b98cfc
Packit Service b98cfc
                }else
Packit Service b98cfc
                        return(0);
Packit Service b98cfc
        }
Packit Service b98cfc
        return(0);
Packit Service b98cfc
}
Packit Service b98cfc
//assembly-time for loop handling:
Packit Service b98cfc
void for_handler(char *begin, char *operand )
Packit Service b98cfc
{
Packit Service b98cfc
        char *ptr,*next,*line,string[MAX_LINE_LENGTH];
Packit Service b98cfc
        int start,end,i,done;
Packit Service b98cfc
        int diff, incr=1;
Packit Service b98cfc
        struct sym *sym;
Packit Service b98cfc
        
Packit Service b98cfc
        ptr=strtok(operand,"=");
Packit Service b98cfc
Packit Service b98cfc
        start= arg_decode(strtok(NULL,":"),0);
Packit Service b98cfc
        end  = arg_decode(strtok(NULL," \t"),0);
Packit Service b98cfc
Packit Service b98cfc
        
Packit Service b98cfc
        if(end>start)
Packit Service b98cfc
                diff=end-start;
Packit Service b98cfc
        else{
Packit Service b98cfc
                diff=start-end;
Packit Service b98cfc
                incr=-1;
Packit Service b98cfc
        }
Packit Service b98cfc
        
Packit Service b98cfc
        if( (issymbol(ptr,&sym))!=-1)
Packit Service b98cfc
                sym->data.address=start;
Packit Service b98cfc
        else
Packit Service b98cfc
                add_symbol(ptr,GPR_TYPE_EQUATE, start,0);
Packit Service b98cfc
        
Packit Service b98cfc
        issymbol(ptr,&sym);
Packit Service b98cfc
        
Packit Service b98cfc
        
Packit Service b98cfc
        while(*begin!='\0')
Packit Service b98cfc
                begin++;
Packit Service b98cfc
        begin++;
Packit Service b98cfc
        
Packit Service b98cfc
        for(i=0;i
Packit Service b98cfc
                next=begin;
Packit Service b98cfc
                line=next;
Packit Service b98cfc
                done=0;
Packit Service b98cfc
                
Packit Service b98cfc
                while(done==0)
Packit Service b98cfc
                {
Packit Service b98cfc
                        while((*next!= '\n') )
Packit Service b98cfc
                                next++;
Packit Service b98cfc
			listtemp[0]='\0';
Packit Service b98cfc
                        *next='\0';
Packit Service b98cfc
                        if(strlen(line)>MAX_LINE_LENGTH)
Packit Service b98cfc
                                as_exit("Parse error: Line exceeds allowable limit");
Packit Service b98cfc
                        strcpy(&string[0],line);
Packit Service b98cfc
                        //printf("%s\n",string);
Packit Service b98cfc
                        done=parse(string, line);
Packit Service b98cfc
			if(listing)
Packit Service b98cfc
				if(done!=-2)
Packit Service b98cfc
					fprintf(listfile,"%-50s ||   %s\n",listtemp,line);
Packit Service b98cfc
                        *next='\n';
Packit Service b98cfc
                        if(done==-2)
Packit Service b98cfc
                                break;
Packit Service b98cfc
                        next++;
Packit Service b98cfc
                
Packit Service b98cfc
                
Packit Service b98cfc
                        line=next;          
Packit Service b98cfc
                }
Packit Service b98cfc
                sym->data.address = start+(incr*(i+1));
Packit Service b98cfc
               
Packit Service b98cfc
        }
Packit Service b98cfc
Packit Service b98cfc
	
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
int op_decode(char *op_name_ptr)
Packit Service b98cfc
{
Packit Service b98cfc
	int op_num;
Packit Service b98cfc
Packit Service b98cfc
	for(op_num=0;op_num
Packit Service b98cfc
      		if( strcasecmp(&op_codes[op_num][0],op_name_ptr) == 0 )
Packit Service b98cfc
			return(op_num);
Packit Service b98cfc
    	}
Packit Service b98cfc
	return(-1);
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
//check if a symbol is used and returns it's pointer value in sym 
Packit Service b98cfc
//normally returns 0, if symbol is non exitant, return -1
Packit Service b98cfc
Packit Service b98cfc
int issymbol(char *symbol,struct sym **sym)
Packit Service b98cfc
{
Packit Service b98cfc
        extern unsigned int macro_depth;
Packit Service b98cfc
        extern struct list_head sym_head;
Packit Service b98cfc
        struct list_head *entry;
Packit Service b98cfc
Packit Service b98cfc
        
Packit Service b98cfc
        list_for_each(entry,&sym_head){
Packit Service b98cfc
                (*sym)=list_entry(entry,struct sym,list);
Packit Service b98cfc
                if(symcmp((char *)&(*sym)->data.name,symbol)==0){
Packit Service b98cfc
                        if((*sym)->type!=TYPE_MACRO_ARG)
Packit Service b98cfc
                                return(0);
Packit Service b98cfc
                        else if( (*sym)->data.value==(macro_depth+1) )
Packit Service b98cfc
                                return(0);
Packit Service b98cfc
                }
Packit Service b98cfc
                
Packit Service b98cfc
                        
Packit Service b98cfc
        }
Packit Service b98cfc
  
Packit Service b98cfc
        return(-1);
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
Packit Service b98cfc
//compares to words, the words can be terminated with a ' ', '\t',  ',' or '\0'
Packit Service b98cfc
int symcmp (char *symbol1,char *symbol2)
Packit Service b98cfc
{
Packit Service b98cfc
Packit Service b98cfc
        
Packit Service b98cfc
        while(1){
Packit Service b98cfc
                if(*symbol1!=*symbol2)
Packit Service b98cfc
                        return(-1);
Packit Service b98cfc
                symbol1++;
Packit Service b98cfc
                symbol2++;
Packit Service b98cfc
                
Packit Service b98cfc
                if(symend(symbol1) && symend(symbol2))
Packit Service b98cfc
                        return(0);
Packit Service b98cfc
                
Packit Service b98cfc
        }
Packit Service b98cfc
        
Packit Service b98cfc
        
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
//copies a symbol, symbols can be terminated with a ' ' ,  '\t' ,  ','  ,  '\n'  ,  a '\0'
Packit Service b98cfc
void symcpy (char *dest, char *source)
Packit Service b98cfc
{  int i=0;
Packit Service b98cfc
        for(i=0;i<=MAX_SYM_LEN;i++){
Packit Service b98cfc
                if(source[i]== ' ' || source[i]=='\0' ||source[i]==',' ||source[i]=='\n' || source[i]=='\t'  ) {
Packit Service b98cfc
                        dest[i]='\0';
Packit Service b98cfc
                        return;
Packit Service b98cfc
                }
Packit Service b98cfc
                dest[i]=source[i];
Packit Service b98cfc
        }
Packit Service b98cfc
        as_exit("Error, Maximum symbol length exceeded");
Packit Service b98cfc
       
Packit Service b98cfc
       
Packit Service b98cfc
}