*! 1.0.0  26 Sept 2001  NJC
program define labvarch
 	version 7
	syntax [varlist] , [ Upper Lower PREFix(str) POSTFix(str) /*
	 */ SUFFix(str) PRESub(str asis) POSTSub(str asis) SUBst(str asis)  /*
	 */ PREDrop(str) POSTDrop(str) Trim(str) /*
	 */ Map(str asis) SYmbol(str) TEST Display /*
	 */ BEFore(str) AFTer(str) to(str) FRom(str) ]

	if `"`symbol'"' == "" {
		local symbol "@"
	}
	if `"`map'"' != "" & !index(`"`map'"',`"`symbol'"') {
		di as err `"map( ) does not contain `symbol'"'
		exit 198
	}

	* suffix is a synonym for postfix; issuing both
	* is not an error, so long as they agree
	if `"`suffix'"' != "" {
		if `"`postfix'"' != "" & `"`postfix'"' != `"`suffix'"' {
			di as err "postfix( ) and suffix( ) differ"
			exit 198
		}
		local postfix `"`suffix'"'
		local suffix
	}

	local nopt : word count `upper' `lower' /*
        */  `predrop' `postdrop' `trim'
	#delimit ;
	local nopt = `nopt' + (`"`prefix'"' != "") + (`"`postfix'"' != "")
	+ (`"`suffix'"' != "") + (`"`map'"' != "") + (`"`presub'"' != "")
	+ (`"`postsub'"' != "") + (`"`subst'"' != "") + (`"`before'"' != "") +
	(`"`after'"' != "") + (`"`to'"' != "") + (`"`from'"' != "");
	#delimit cr
 	if `nopt' != 1 {
 		di as err /*
		 */ "exactly one transformation option should be specified"
		exit 198
	}

	if `"`subst'"' != "" {
		local srch : word 1 of `subst'
		local repl : word 2 of `subst'
	}
	if `"`presub'"' != "" {
		local srch : word 1 of `presub'
		local repl : word 2 of `presub'
		local nsrch = length(`"`srch'"')
	}
	if `"`postsub'"' != "" {
		local srch : word 1 of `postsub'
		local repl : word 2 of `postsub'
		local nsrch = length(`"`srch'"')
	}

	foreach v of varlist `varlist' {
		local label : variable label `v'
 		if "`upper'" != "" {
 			local label = upper(`"`label'"')
 		}
 		else if "`lower'" != "" {
 			local label = lower(`"`label'"')
 		}
 		else if `"`prefix'"' != "" {
 			local label `"`prefix'`label'"'
 		}
 		else if `"`postfix'"'  != "" {
 			local label `"`label'`postfix'"'
 		}
 		else if `"`subst'"' != "" {
 			local label : /*
 			 */ subinstr local label `"`srch'"' `"`repl'"', all
 		}
 		else if `"`presub'"' != "" {
 			if `"`srch'"' == substr(`"`label'"',1,`nsrch') {
				local label = /*
  			 */ `"`repl'"' + substr(`"`label'"',`nsrch'+1,.)
 			}
 		}
 		else if `"`postsub'"' != "" {
 			if `"`srch'"' == substr(`"`label'"',-`nsrch',.) {
 				local label = /*
	 */ substr(`"`label'"',1,length(`"`label'"')-`nsrch') + `"`repl'"'
			}
 		}
 		else if `"`predrop'"' != "" {
 			confirm integer number `predrop'
 			local label = substr(`"`label'"', 1+`predrop', .)
 		}
 		else if `"`postdrop'"' != "" {
 			confirm integer number `postdrop'
 			local label = /*
		 */ substr(`"`label'"', 1, length(`"`label'"')-`postdrop')
 		}
 		else if `"`trim'"' != "" {
 			confirm integer number `trim'
 			local label = substr(`"`label'"', 1, `trim')
 		}
		else if `"`before'"' != "" {
			local where = index(`"`label'"', `"`before'"')
			if `where' {
				local label = /*
				*/ substr(`"`label'"', 1, `where' - 1)
			}
		}
		else if `"`to'"' != "" {
			local where = index(`"`label'"', `"`to'"')
			if `where' {
				local len = length(`"`to'"')
				local label = /*
				*/ substr(`"`label'"', 1, `where' + `len' - 1)
			}
		}
		else if `"`after'"' != "" {
			local where = index(`"`label'"', `"`after'"')
			if `where' {
				local len = length(`"`after'"')
				local label = /*
				*/ substr(`"`label'"',`where' + `len', .)
			}
		}
		else if `"`from'"' != "" {
			local where = index(`"`label'"', `"`from'"')
			if `where' {
				local label = /*
				*/ substr(`"`label'"',`where', .)
			}
		}
 		else if `"`map'"' != "" {
			local label : /*
			 */ subinstr local map "`symbol'" "`v'", all
			if _rc {
				di as err "inappropriate map?"
				exit _rc
			}
		}

		if "`test'" != "" {
			local abbrev = abbrev("`v'",18)
			di as res "`abbrev'" _col(21) `"`label'"'
		}
 		else label var `v' `"`label'"'

 	} /* end of syntax for transformation */

	if "`display'" != "" {
		describe `varlist'
	}
end