*! version 1.0.2 13oct2009 caplog by roywada@hotmail.com
*! captures a log file, possibly for use with logout or dataout

program define caplog
version 6

local logfile : log

version 7

* invisible to Stata 7
local Version7 ""
cap local Version7 `c(stata_version)'

if "`Version7'"=="" {
	* it is version 7
	local bind ""
	*noi di in yel "limited functions under Stata 7"
}
else if `Version7'>=8.2 {
	version 8.2
	local bind "bind"
}

*qui log query
*if `"`r(status)'"'=="on" {
*	qui log close
*	local filename `"`r(filename)'"'
*}

if `"`logfile'"'~="" {
	di ""
	qui log close
	local filename `"`logfile'"'
}

* embbed to avoid log being open
_caplog `0'

cap log close

*** c_locals coming back
* clickables
if "`tempfile'"~="tempfile" {
	if "`smcl'"=="" {
		local cl_text `"{browse `"`using1'"'}"'
		noi di as txt `"`cl_text'"'
	}
	else {
		local cl_text `"{stata `"view `using1'"':`using1'}"'
		noi di as txt `"`cl_text'"'
	}
}

cap log close

*if `"`filename'"'~="" {
*	log using `"`filename'"', append
*}

end


********************************************************************************************


program define _caplog
version 7

local Version7 ""
cap local Version7 `c(stata_version)'

if "`Version7'"=="" {
	* it is version 7
	local bind ""
	*noi di in yel "limited functions under Stata 7"
}
else if `Version7'>=8.2 {
	version 8.2
	local bind "bind"
}

* encase the colon in file name in quotes, avoiding string function length limits

local behind `"`0'"'
local 0 ""
gettoken front behind: behind, parse(" ,")
local 0 ""
local done 0
while `"`front'"'~="" & `done'==0 {
	if `"`front'"'=="using" {
		
		gettoken rest behind: behind, parse(" ,")
		* strip off quotes
		gettoken first second: rest, parse(" ")
		cap local rest: list clean local(rest)
		
		* take off colon at the end
		local goldfish ""
		if index(`"`rest'"',":")~=0 {
			local end=substr(`"`rest'"',length(`"`rest'"'),length(`"`rest'"'))
			if "`end'"==":" {
				local rest=substr(`"`rest'"',1,`=length(`"`rest'"')-1')
				local goldfish " : "
			}
		}
		
		* colon reattached with a space at the end
		* .txt attached here, SMCL TO BE FIXED LATER
		local rabbit `"""'
		if index(`"`rest'"', ".")==0 {
			local using `"`rabbit'`rest'.txt`rabbit'`goldfish'"'
		}
		else {
			local using `"`rabbit'`rest'`rabbit'`goldfish'"'
		}
		local 0 `"`0' using `using' `behind'"'
		local done 1
	}
	else {
		local 0 `"`0' `front'"'
		gettoken front behind: behind, parse(" ,")
	}
}


gettoken first second : 0, parse(":") `bind' match(par) quotes
local 0 `"`first'"'
while `"`first'"'~=":" & `"`first'"'~="" {
	gettoken first second : second, parse(":") `bind' match(par) quotes
}
if `"`0'"'==":" {
	* colon only when shorthand combined with prefix
	local 0
}
else {
	local _0 `"`0'"'
}

*** shorthand syntax if [using] is missing

syntax using/ [, replace append tempfile text smcl subspace]

if "`smcl'"=="smcl" {
	if index(`"`using'"', ".txt")~=0 {
		local temp=substr(`"`using'"',1,length(`"`using'"')-4)
		local using `"`temp'.smcl"'
	}
}

if "`text'"~="" & "`smcl'"~="" {
	di "cannot choose both {opt text} and {opt smcl}"
	exit 198
}

if "`text'"=="" & "`smcl'"=="" {
	local text "text"
}


cap confirm file `"`using'"'
if !_rc & "`replace'"~="replace" & "`append'"~="append" {
	* it exists
	noi di in red `"`using' exists; specify {opt replace} or {opt append}"'
	exit 198
}

* goes with `second'
if `"`second'"'~="" {
	local _colon ":"
}

qui {
	if "`subspace'"=="subspace" {
		* fix the gaps in the value labels
		ds8
		foreach var in `r(varlist)'{
			local temp : var label `var'
			local temp = subinstr(`"`temp'"'," ","_",.)
			label var `var' `"`temp'"'
		}
	}
}

	* regular stuff
	if `"`using'"'~="" {
		* prefix use using file
		qui log using `"`using'"', `replace' `append' `text' `smcl'
		`second'
	}
	else {
		* prefix use temp file
		qui log using `"`using'"', `replace' `append' `text' `smcl'
		`second'
	}

* clickables
c_local smcl "`smcl'"
c_local using1 `"`using'"'
c_local tempfile `"`tempfile'"'

end


********************************************************************************************


*** ripped from outreg2 Mar 2009
program define ds8
	* get you the list of variable like -ds- does for version 8
	version 7.0
	qui ds
	if "`r(varlist)'"=="" {
		local dsVarlist ""
		foreach var of varlist _all {
			local dsVarlist "`dsVarlist' `var'"
		}
		c_local dsVarlist `dsVarlist'
	}
	else {
		c_local dsVarlist `r(varlist)'
	}
end




/*
* version 1.0.1 May2009 caplog by roywada@hotmail.com
smcl accepted
version control fixed

1.0.2 close the log file at the end to avoid the possibility of it being left open