*! 1.0.0 NJC 21 January 2003 
program def mypkg 
	version 7 
	syntax [anything] [, ALL * ] 
	preserve 
	qui { 
		local source : sysdir STBPLUS 
		local sep : dirsep 
		infix str pkg 1-80 using "`source'`dirsep'stata.trk", clear  
		keep if substr(pkg,1,1) == "D" /* 
		*/ | substr(pkg,1,1) == "N"    
		gen str1 which = substr(pkg,1,1) 
		replace pkg = trim(substr(pkg,3,.)) 
		gen int npkg = 1 + int((_n - 1) / 2)
		reshape wide pkg, i(npkg) j(which) string 
		sort pkgN npkg 
		if "`all'" == "" { 
			by pkgN : keep if _n == _N 
		} 	
		replace pkgN = subinstr(pkgN,".pkg","",.)
		gen str1 number = "" 
		replace number = "[" + string(npkg) + "]"
		compress
		rename pkgN package 
		rename pkgD date
	} 

	local 0 `anything' 
	if "`0'" == "" { 
		list number package date, noobs `options' 
	} 
	else if index("`0'","*") | index("`0'","?") { 
		foreach p of local 0 { 
			list number package date if match(package,"`p'"), /* 
			*/ noobs `options'  
		}
	} 	
	else { 	
		foreach p of local 0 { 
			qui count if package == "`p'" 
			if r(N) { 
				qui Levels npkg if package == "`p'", /* 
				*/ local(levels) 
				foreach l of local levels { 
					ado desc [`l'] 
				} 
			} 	
			else di _n "{txt}package {inp}{bf:`p'} {txt}not found"
		} 
	} 	
end 

/* N.B. the U record is not necessarily what is used by -ado- !!! */ 

*! 1.0.1 NJC 10 Sept 2002 
*! 1.0.0 NJC 16 July 2002 
program define Levels, sortpreserve rclass 
        version 7.0
        syntax varname [if] [in] [, Separate(str) MISSing Local(str) ]
	
        if "`separate'" == "" { 
		local sep " " 
	} 
	else local sep "`separate'" 

	if "`missing'" != "" { local novarlist "novarlist" } 
        marksample touse, strok `novarlist' 
	capture confirm numeric variable `varlist'
	local isnum = _rc != 7 
	
        if `isnum' { /* numeric variable */
		capture assert `varlist' == int(`varlist') if `touse' 
		if _rc { 
			di as err "`varlist' contains non-integer values" 
			exit 459
			/* NOT REACHED */ 
		} 
		
                tempname Vals
                qui tab `varlist' if `touse', matrow(`Vals')
                local nvals = r(r)

                forval i = 1 / `nvals' {
                        local val = `Vals'[`i',1]
			if `i' < `nvals' { local vals "`vals'`val'`sep'" }
			else local vals "`vals'`val'" 
                }
		
		if "`missing'" != "" { 
			qui count if missing(`varlist') & `touse' 
			if `r(N)' > 0 { 
				local vals "`vals'`sep'." 
			} 	
		} 	
        }
	else { /* string variable */
                tempvar select counter
                bysort  `touse' `varlist' : /*
                 */ gen byte `select' = (_n == 1) * `touse'
                generate `counter' = sum(`select') * (`select' == 1) 
                sort `counter'
		qui count if `counter' == 0 
                local j = 1 + r(N)
		local nvals = _N 
		forval i = `j' / `nvals' { 
			local val = `varlist'[`i']
                        if `i' < `nvals' { 
				local vals `"`vals'`"`val'"'`sep'"' 
			}
			else local vals `"`vals'`"`val'"'"' 
                }
        }

        di as txt `"`vals'"' 
	return local levels `"`vals'"' 
	if "`local'" != "" { 
		c_local `local' `"`vals'"' 
	} 	
end