*! version 1.2.9  02nov2010
program define lincom, rclass
	version 6.0

	if "`e(prefix)'" != "svy" {
		is_svy
		if `r(is_svy)' {
			_svylc `0'
			return add
			exit
		}
	}

	gettoken token 0 : 0, parse(",= ")

	while `"`token'"'!="" & `"`token'"'!="," {
		if `"`token'"' == "=" {
			di in red _quote "=" _quote /*
			*/ " not allowed in expression"
			exit 198
		}

		local formula `"`formula'`token'"'

		gettoken token 0 : 0, parse(",= ")
	}

	if `"`0'"'!="" {
		local 0 `",`0'"'
		syntax [, Level(cilevel) OR IRr RRr HR SHR EForm SHOW *]
		local nopt : word count `or' `irr' `rrr' `hr' `shr' `eform'
		if `nopt' > 1 {
			di in red "only one display option can be specified"
			exit 198
		}
		if `"`show'"' != "" {
			capture assert `"`formula'"' == ""
			local rc = _rc
			capture syntax [, SHOW ]
			local rc = `rc' + _rc
			if `rc' {
				error 198
			}
			di /* blank line */
			est display
			exit
		}
		_get_diopts diopts, `options'
	}
	else {
		local level = $S_level
		local nopt 0
	}

	if "`e(cmd)'"=="logistic" {
		local or "or"
		local nopt 1
	}

	if "`or'"!="" {
		local eform "eform(Odds Ratio)"
	}
	else if "`irr'"!="" {
		local eform "eform(IRR)"
	}
	else if "`rrr'"!="" {
		local eform "eform(RRR)"
	}
	else if "`hr'"!="" {
		local eform "eform(Haz. Ratio)"
	}
	else if "`shr'"!="" {
		local eform "eform(SHR)"
	}
	else if "`eform'"!="" {
		local eform "eform(exp(b))"
	}

	tempname estname x b V est se

	qui test `formula' = 0 , matvlc(`V')

	matrix colnames `V' = (1)
	matrix rownames `V' = (1)

	if      "`r(chi2)'"!=""  { scalar `x' = r(chi2) }
	else if "`r(F)'"   !=""  { scalar `x' = r(F) }
	else                       scalar `x' = .

	if "`r(df_r)'"!="" { local dof = r(df_r) }
	else                 local dof = .

	if `dof'!=. { local dofopt "dof(`dof')" }

	if "`e(depvar)'"!="" {
		local ndepv : word count `e(depvar)'
		if `ndepv' == 1 { local depn "depn(`e(depvar)')" }
	}

	matrix `b' = get(Rr)
	if `nopt' == 1 & `b'[1,colsof(`b')] != 0 {
		if `"`or'`irr'`rrr'"' == "" {
			local eform eform
		}
		else	local eform
		di in smcl in red /*
*/ "additive constant term not allowed with {cmd:`or'`irr'`rrr'`eform'} option"
		exit 198
	}
	matrix `b' = e(b)*`b'[1,1..(colsof(`b')-1)]' - `b'[1,colsof(`b')]
	matrix colnames `b' = (1)

	/* Display formula. */
	test `formula' = 0, notest

	/* Save values of b and V for S_# macros. */
	if "`eform'"=="" {
		scalar `est' = `b'[1,1]
		scalar `se'  = sqrt(`V'[1,1])
	}
	else {
		scalar `est' = exp(`b'[1,1])
		scalar `se'  = exp(`b'[1,1])*sqrt(`V'[1,1])
	}
	nobreak {
		estimates hold `estname'
		capture noisily break {		/* Post results. */
			est post `b' `V', `dofopt' `depn'
			di
			est di, `eform' level(`level') `diopts'
		}
		local rc = _rc
		estimates unhold `estname'
		if `rc' { exit `rc' }
	}

/* Double save in r() and S_# */

	ret scalar estimate = `est'
	ret scalar se = `se'
	if `dof'!=. { ret scalar df = `dof' }

	global S_1 = `est'
	global S_2 = `se'
	if `dof'!=. { global S_3 `"`dof'"' }
	else	      global S_3
end
