	program macro_main
c
c	macro processor
c
	implicit none
 
	include 'parameters.inc'	!parameters
	include 'io_control.inc'	!global io-data
	include 'language.inc'		!language and tab data
	include 'status.inc'		!exit status
 
c	local variables
 
	character*132 input_file,output_file,list_file
	integer*4 input_length,output_length,list_length
	integer*4 cli_stat
	character*32 language
	character*132 default_file,result_file
	integer*4 language_length,default_length,r_length
	logical l_output_open
	integer*4 arg_count,iargc
	integer*4 i,j,k,l,ic
 
	character*(max_line_length) value
	integer*4 value_length,ivalue
c
c	do all init
c
	call init_tables
c
	l_output=.true.
	l_output_open=.true.
	output_length=0
	l_list=.false.
	l_list_open=.false.
	list_length=0
	extention='.src'
	l_fortran=.false.
	language='NONE'
	l_debug=.false.
	l_case_sensitive=.false.
	l_detab=.false.
	input_length=0
c
c
c	parse command line
c
	arg_count=iargc()
	if(arg_count.lt.1)then
		call log_error(' ****No arguments specified****')
		call exit(4)
	endif
	do ic=1,arg_count
		call getarg(ic,value)
		if(value(1:2).eq.'+o')then
			l_output=.false.
			l_output_open=.false.
		elseif(value(1:2).eq.'-o')then
			l_output=.true.
			l_output_open=.true.
			call back_skip_blanks(value(3:max_line_length),j)
			output_length=j
			if(j.gt.0)output_file(1:j)=value(3:2+j)
		elseif(value(1:2).eq.'-l')then
			l_list=.true.
			l_list_open=.true.
			call back_skip_blanks(value(3:max_line_length),j)
			list_length=j
			if(j.gt.0)list_file(1:j)=value(3:2+j)
		elseif(value(1:2).eq.'-r')then
			do i=3,max_line_length
				if((ichar(value(i:i)).ge.ichar('a')).and.
	1			   (ichar(value(i:i)).le.ichar('z')))
	1				value(i:i)=char(ichar(value(i:i))-
	1					(ichar('a')-ichar('A')))
			enddo
			do i=1,number_lang
				j=language_name_length(i)
				if(value(3:j+2).eq.language_name(i)(1:j))then
					language=' '
					language=language_name(i)(1:j)
					extention=language_ext(i)
					if(i.eq.language_fortran)
	1					l_fortran=.true.
					goto 120
				endif
			enddo						
120			continue
		elseif(value(1:2).eq.'-d')then
			l_debug=.true.
		elseif(value(1:2).eq.'-c')then
			l_case_sensitive=.true.
		elseif(value(1:2).eq.'-t')then
			call back_skip_blanks(value(3:max_line_length),j)
			l_detab=.true.
			if(j.gt.0)then
				read(value(3:j+2),130)k
130				format(i<j>)
				if((abs(k).eq.0).or.
	1			   (abs(k).gt.max_line_length))then
				elseif(k.gt.0)then
					tab(k)=.true.
				else
					tab(-k)=.false.
				endif
			endif
		elseif(value(1:2).eq.'-s')then
			call back_skip_blanks(value(3:max_line_length),j)
			if(j.ge.3)then
				value(2:2)='('
				value(3+j:3+j)=')'
				call directive_set(value(2:j+3))
			endif
		else
			call back_skip_blanks(value,j)
			input_file(1:j)=value(1:j)
			input_length=j
		endif
	enddo
c	get the default file name for outputs
	default_file=input_file
	default_length=index(default_file(1:input_length),'.')
	if(default_length.eq.0)then
		default_length=input_length
	else
		default_length=default_length-1
	endif
 
c	open i/o files
 
	if(input_length.gt.0)then
		call build_filename(result_file,r_length,
	1		input_file(1:input_length),'.mcr')
		open(unit=input_unit,
	1	name=result_file(1:r_length),recl=(max_line_length+8),
	1	type='old',readonly,err=500)
	else
		goto 500
	endif
 
	if(l_output_open)then
		call build_filename(result_file,r_length,
	1		output_file(1:output_length),
	1		default_file(1:default_length)//extention)
		open(unit=output_unit,
	1	name=result_file(1:r_length),recl=(max_line_length+8),
	1	type='new',carriagecontrol='list')
		output_stream(0).open=.true.
	endif
	if(l_list_open)then
		call build_filename(result_file,r_length,
	1		list_file(1:list_length),
	1		default_file(1:default_length)//'.lis')
		open(unit=list_unit,
	1	name=result_file(1:r_length),recl=(max_line_length+8),
	1	type='new',carriagecontrol='list')
	endif
 
c
c	set predefined symbols
c
	value(1:18)='(DATE=''         '')'
	call date(value(8:16))
	call directive_default(value(1:18))
	value(1:17)='(TIME=''        '')'
	call time(value(8:15))
	call directive_default(value(1:17))
	value(1:13)='(UNIX=''IRIX'')'
	call directive_default(value(1:13))
	value(1:11)='(SGI=''SGI'')'
	call directive_default(value(1:11))
	value(1:45)='(LANGUAGE=''                                '')'
	value(12:43)=language
	call directive_default(value(1:45))
	do i=1,max_line_length
		value(i:i)=' '
	enddo
	value(1:7)='(FILE='''
	inquire(unit=input_unit,name=value(8:max_line_length))
	do i=8,max_line_length
		if(value(i:i).eq.' ')then
			value(i:i+1)=''')'
			call directive_default(value(1:i+1))
			goto 200
		endif
	enddo
	call log_error(
	1 ' **** File name too long, variable "FILE" undefined ****')
200	continue
 
	call process_file	!process the macro file
 
c	close all open files
 
	if(l_output)close(unit=output_unit)
	if(l_list)close(unit=list_unit)
	close(unit=input_unit)
	if(exit_status.eq.1)call exit(0)
	if(exit_status.eq.2)call exit(1)
	if(exit_status.eq.4)call exit(3)
	call exit(exit_status)
500	call log_error(' ****Error opening input file****')
	call exit(4)
	end
 
