* NJC 1.0.1 28 Jan 2009
* NJC 1.0.0 7 Jan 2009
program _grownvals
	version 9
	gettoken type 0 : 0
	gettoken h    0 : 0
	gettoken eqs  0 : 0

	syntax varlist(numeric) [if] [in] [, BY(string) MISSing]
	if `"`by'"' != "" {
		_egennoby rownvals() `"`by'"'
		/* NOTREACHED */
	}

	marksample touse, novarlist
	local miss = "`missing'" != ""
	quietly {
		mata : row_nvals("`varlist'", "`touse'", "`h'", "`type'", `miss')
	}
end

mata :

void row_nvals(string scalar varnames,
		string scalar tousename,
		string scalar nvalsname,
		string scalar type,
		real scalar miss)
{
	real matrix y
	real colvector nvals, row

        st_view(y, ., tokens(varnames), tousename)
	nvals = J(rows(y), 1, .)

	if (miss) {
		for(i = 1; i <= rows(y); i++) {
			row = y[i,]'
			nvals[i] = length(uniqrows(row))
	        }
	}
	else {
		for(i = 1; i <= rows(y); i++) {
			row = y[i,]'
			nvals[i] = length(uniqrows(select(row, (row :< .))))
		}
        }

	st_addvar(type, nvalsname)
	st_store(., nvalsname, tousename, nvals)
}

end