program def dellist, rclass
*! NJC 1.5.0 14 December 2000
* NJC 1.4.0 6 Sept 2000
* NJC 1.3.0 6 June 2000
* NJC 1.2.0 31 Jan 2000
* NJC 1.1.0 22 Dec 1999
* NJC 1.0.0 22 Sept 1999
	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 , [ Delete(str) Pos(numlist sort int >=-`nlist' <=`nlist') /*
	*/ Exact All Global(str) Noisily ]

	local nopts = ("`delete'" != "") + ("`pos'" != "")
	if `nopts' != 1 {
		di in r "must specify one of delete( ) and pos( )"
		exit 198
	}

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

	if "`exact'" != "" & "`all'" != ""  {
		di in r "all option not allowed with exact option"
		exit 198
	}

	tokenize `list'

	if "`delete'" != "" {
		local i = 1
		while `i' <= `nlist' {
			local len = length("``i''")
			if `len' > 80 {
				di in r "cannot handle word length > 80"
				exit 498
			}
			local i = `i' + 1
		}

		tknz `delete', s(d)
		local nd : word count `delete'

		if "`exact'" != "" {
			while "`1'" != "" {
				local i = 1
				local OK = 0
				while `i' <= `nd' & !`OK' {
					local OK = "`1'" == "`d`i''"
					local i = `i' + 1
				}
				if !`OK' { local newlist "`newlist'`1' " }
				mac shift
			}
		}
		else {
			while "`1'" != "" {
				local i = 1
				local OK = 0
				while `i' <= `nd' {
					local thisOK = /*
					*/ index("`1'", "`d`i''") > 0
					local OK = `OK' + `thisOK'
					local i = `i' + 1
				}
				if "`all'" != "" { local OK = `OK' == `nd' }
	 			if !`OK' { local newlist "`newlist'`1' " }
				mac shift
			}
		}
	}
	else {
		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 i = 1
		local j = 1
		while `i' <= `nlist' {
			if `i' == `p`j'' { local j = `j' + 1 }
			else local newlist "`newlist'``i'' "
			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