*! 1.1.0 NJC 7 December 2000 
* 1.0.0  NJC 12 July 2000
program define _geom 
	version 6
	
	gettoken type 0 : 0
	gettoken g 0 : 0
	gettoken eqs 0 : 0			/* "=" */
	gettoken paren 0 : 0, parse("(), ")	/* "(" */

	gettoken month 0 : 0, parse("(), ")
	gettoken year  0 : 0, parse("(), ")
	if `"`year'"' == "," { 
		gettoken year  0 : 0, parse("(), ")
	}
	gettoken paren 0 : 0, parse("(), ")	/* ")" */
	if `"`paren'"' != ")" { 
		error 198
	}

	syntax [if] [in] [ , Format(str) Lag(str) Work ] 

	quietly {
		tempvar touse 
		mark `touse' `if' `in'
		
		if "`lag'" == "" { local lag = 0 } 
		else { 
			capture assert `lag' == int(`lag') 
			if _rc { 
				di in r "`lag' contains non-integer value(s)" 
				exit 410 
			} 
		} 
		
		capture assert `month' > 0 & `month' < 13 if `touse' 
		if _rc { 
			di in r "`month' contains value(s) not 1 to 12" 
			exit 198 
		} 

		capture assert `month' == int(`month') if `touse' 
		if _rc { 
			di in r "`month' contains non-integer value(s)" 
			exit 410 
		} 	
		
		capture assert `year' == int(`year') if `touse' 
		if _rc { 
			di in r "`year' contains non-integer value(s)" 
			exit 410 
		} 	
			
		gen long `g' = dofm(ym(`year', `month') - `lag' + 1) - 1 /* 
		*/ if `touse'
		
		* Sunday? subtract 2; Saturday? subtract 1
		if "`work'" != "" { 
			replace `g' = `g' - 2 if dow(`g') == 0 
			replace `g' = `g' - 1 if dow(`g') == 6
		} 	

		if "`format'" != "" { 
			capture format `g' `format' 
			if _rc { 
				noi di in bl "`format' invalid format" 
			} 
		} 	
	}
end