*! 1.0.0 NJC 11 December 2000
program define _gmsub
	version 6.0

	gettoken type 0 : 0
	gettoken g    0 : 0
	gettoken eqs  0 : 0

	syntax varlist(max=1 string) [if] [in], /*
	*/ Find(str asis) [ Replace(str asis) N(int -1) Word ]

       	local fcn = cond("`word'" != "", "subinword", "subinstr")

	* doesn't work => user needs to update Stata
	capture local bar = `fcn'("foo","foo","bar",.)
	if _rc {
		di in r "Your version of Stata doesn't recognise `fcn'( )."
		di in r "I guess that you need to update."
		exit 198
	}

	local nfind : word count `find'
	local nrepl : word count `replace'

	if `nrepl' == 0 { /* no replacement => delete */
		local nrepl = `nfind'
	}
	else if `nrepl' == 1 { /* many to one replacements allowed */
    		local nrepl = `nfind'
		local replace : di _dup(`nfind') `"`replace' "'
	}
	else if `nfind' != `nrepl' {
    		di in r "number of find and replace arguments not equal"
		exit 198
	}

	marksample touse, strok
	local type "str1" /* ignores type passed from -egen- */
	local n = cond(`n' == -1, ., `n')

	quietly {
        	gen `type' `g' = ""
	        replace `g' = `varlist' if `touse'

        	local i = 1
		while `i' <= `nfind' {
			local f : word `i' of `find'
			local r : word `i' of `replace'
        	        replace `g' = `fcn'(`g', `"`f'"', `"`r'"', `n')
            		local i = `i' + 1
		}
        }
end