program def inslist, rclass
*! NJC 1.1.0 14 December 2000
* NJC 1.0.0 7 November 2000
	version 6.0
	gettoken list 0 : 0, parse(",")
	if "`list'" == "" | "`list'" == "," {
		di in r "nothing in list"
		exit 198
	}

	local nlist : word count `list'

	syntax , Insert(string) Pos(numlist sort int >=-`nlist' <=`nlist') /*
	*/ [ Global(str) Noisily ]

	if length("`global'") > 8 {
		di in r "global name must be <=8 characters"
		exit 198
	}

	local np1 = `nlist' + 1
	tknz `pos' `np1', s(p)
	local np : word count `pos'

	* negative indexes to positive
	local i = 1
	while `p`i'' < 0 {
		local p`i' = `nlist' + 1 + `p`i''
		local i = `i' + 1
	}

	local nins : word count `insert'
	if `nins' < `np' {
		local rep = 1 + int( `np' / `nins')
		local insert : di _dup(`rep') "`insert' "
		local nins : word count `insert'
	}

	tknz `insert', s(i)

	local j = 1

	while `p`j'' == 0 {
		local newlist "`newlist'`i`j'' "
		local j = `j' + 1
	}

	tokenize `list'

	local i = 1
	while `i' <= `nlist' {
		local newlist "`newlist'``i'' "
		while `i' == `p`j'' & `j' <= `np' {
			local newlist "`newlist'`i`j'' "
			local j = `j' + 1
		}
		local i = `i' + 1
	}

	if "`noisily'" != "" { di "`newlist'" }
	if "`global'" != "" { global `global' "`newlist'" }
	return local list `newlist'
end

program def tknz, rclass
* NJC 1.1.0 2 June 2000
	version 6.0
	gettoken list 0 : 0, parse(",")
	syntax , Stub(str) [ * ]
	tokenize `"`list'"' , `options'

	local i = 1
	while "``i''" != "" {
		c_local `stub'`i' `"``i''"'
		local i = `i' + 1
	}
end