program define labcopy
*! NJC 1.0.1 6 April 2000
* NJC 1.0.0 13 January 2000
	version 6
	gettoken vallbl 0 : 0, parse(" ,")
	capture label list `vallbl'
	if _rc {
		di in r "`vallbl' not a value label"
		exit 498
	}

	syntax , [ From(numlist min=1 int) To(numlist min=1 int) /*
	*/ Swap(numlist min=2 max=2 int) List ]

	if "`swap'`from'`to'" == "" {
		di in bl "nothing to do?"
	}

	if "`swap'" != "" & "`from'`to'" != "" {
		di in r "may not combine swapping and mapping"
		exit 198
	}

	local nopts = ("`from'" != "") + ("`to'" != "")
	if `nopts' == 1 {
		di in r "from( ) must be combined with to( )"
		exit 198
	}

	if "`swap'" != "" { /* swapping */
		local i = 1
		while `i' <= 2 {
			local n`i' : word `i' of `swap'
			local l`i' : label `vallbl' `n`i''
			if `"`l`i''"' == "`n`i''" {
				di in r "`vallbl': no value label for `n`i''"
				exit 498
			}
			local i = `i' + 1
		}

		di _n `"label def `vallbl' `n1' `"`l2'"' "' _c
		di `" `n2' `"`l1'"', modify "'
                label def `vallbl' `n1' `"`l2'"' `n2' `"`l1'"', modify
	}

	if "`from'`to'" != "" { /* mapping */
		local nfrom : word count `from'
		local nto : word count `to'

		if `nfrom' != `nto' {
			di in r "from( ) and to( ) should match one-one"
			exit 198
		}

		tokenize `from'
		local i = 1
		while `i' <= `nfrom' {
			local l`i' : label `vallbl' ``i''
			if `"`l`i''"' == "``i''" {
				di in r "`vallbl': no value label for ``i''"
				exit 498
			}
			local t`i' : word `i' of `to'
			local args `"`args' `t`i'' `"`l`i''"'"'
			local i = `i' + 1
		}

		di _n `"label def `vallbl' `args', modify"'
		label def `vallbl' `args', modify
	}

	if "`list'" != "" {
		di
		label li `vallbl'
	}
end