*! NJC 1.0.0 11 August 1998
program define catenate
    version 5.0

    local g "`1'"
    confirm new variable `g'

    mac shift
    mac shift               /* discard = sign */

    local varlist "req ex min(1)"
    local in "opt"
    local if "opt"
    local options "Punct(str)"
    parse "`*'"

    if "`punct'" == "" { local punct " " }
    else if "`punct'" == "no" { local punct "" }
    local plen = length("`punct'")

    quietly {
        gen str1 `g' = "" `if' `in'
        parse "`varlist'", parse(" ")
        while "`1'" != "" {
            capture confirm string variable `1'
            if _rc {
                capture assert `1' == int(`1') `if' `in'
                if _rc == 9 {
                    noi di in bl "warning: non-integer values in `1'"
                }
                replace `g' = `g' + "`punct'" + string(`1') `if' `in'
            }
            else { replace `g' = `g' + "`punct'"  + `1' `if' `in' }
            mac shift
        }
        replace `g' = substr(`g',1 + `plen',.)
    }
end