*! 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