*!cvar.ado
*!Puts Characteristics of a VARiable in a new variable and macro's.
*!Programming utility.
*22/3/97
*5/7/98 added: the different values  of the variable are also stored in macro's
/*

cvar var ,[nomis|mis] nam(string) select(string)


Creates int variable

`nam' 		with values 1,2,3,.., corresponding to the ordered values
		of var. If nam() not specified it will be default the first 
		6 characters of the name of var, followed by underscore _.

and global macro's 

$`nam'`i' 	The value label of the i-th value of var (if existing). 
		If no value label is associated with (the i-th value of) var
		it will contain the value itself.
		The label is embedded in double quotes " ", unless
		there is no value label associated with the variable.
$v`nam'`i' 	The i-th value of var.

$n`nam'	 	Number of classes
$l`nam'		Variable label of var.
$f`nam'		Display format in case of floating vars or date formatted vars
		without value label. 
$w`nam'		Width required to display the $`nam'`i', i.e. max(length("$nami")).



Var may be any type of variable.

If mis specified the missing value (or blank string) will be considered a 
separate class. If nomis is specified, records with var missing will be 
deleted! Default mis: missing values considered a separate class.

select() offers the possibility to create only the macro's or
	the new variable. If not specified: all macro's and the new variable
	will be created. If select is specified macro's and variable will
	be created dependent on the characters in select():
   v|V	           the variable `nam' only
   n|N|w|W|f|F 	   all the macro's  only
   l|L		   the l`nam' macro  only
		
Note: `nam' should not start with an underscore _, and may be maximum 5 
	characters. If not, the name will be shortened and/or the underscore  
	removed.


*/
program define cvar
version 6.0
local options "noMis Nam(string) SELect(string)"
local varlist "req ex min(1) max(1) "
local if "opt"
local in "opt"
parse `"`0'"' 
count `if' `in' 
if r(N)==0 {
  	noisily display `"`if' `in' : no observations"'
  	exit
}
local var `varlist'

*If nam starts with an underscore, remove it.
while index("`nam'","_")==1 { local nam=substr("`nam'",2,5) }
if "`nam'"=="" {  local nam =substr("`var'",1,4)+"_" }
local nam=substr("`nam'",1,5)

tempvar  x y
if "`select'"=="" {
	local ALL ALL
	local L L 
	local VAR VAR
}
else {
	nel ,str(A`select') el(vV)
	if $S_1>=1  {local VAR VAR }
	nel ,str(A`select') el(wWfFnN)
	if $S_1>=1  {local ALL ALL }
	nel ,str(A`select') el(wWfFnNlL)
	if $S_1>=1   {local L L }
}

eformat `var',lab val
local type   : type `var'
local format : format `var'
local vallab : value label `var'
local varlab : variable label `var'
if `"`varlab'"'=="" {local varlab "`var'" }

if "`L'"=="L" { global l`nam' `"`varlab'"' }

if "`VAR'"=="VAR" |"`ALL'"=="ALL" {
 if "`mis'"=="nomis" {
  if index("`type'","str")>0 	{	drop if `var'==""  }
  else 				{	drop if `var'==.   }
 }
 if _N==0 { 
  	noisily display "Only missing observations"
  	exit
 }

 sort `var'
 quietly by `var':gen int  `x'=1 if _n==1
 sort `x' `var'
 replace `x'=sum(`x') 
 quietly sum `x'

 if "`ALL'"=="ALL" {
  global w`nam':char `var'[width]
  global n`nam' =r(max) 
  local nn= r(max)

  if "`vallab'"~="" {              /* variable with value label */
   local i=1
   while `i'<=`nn' {
     local val=`var'[`i']
     global v`nam'`i' `val'
     local lab:label `vallab' `val' 
*     local val =substr("`lab'",1,8)   /* 14/9/01 modification: length macro may be longer than 8 now
                                                  unclear whether this may cause a problem elsewhere!
                                                  Can be made optional */
     local val  `lab'
     global `nam'`i' ""`val'""
     local i=`i'+1
   }
   global f`nam' 
  }
  else  {
   local i=1
   while `i'<=`nn' {
     local val =`var'[`i']
     global v`nam'`i' `val'
     if index("`type'","str")>0 {
         global `nam'`i' ""`val'""
     }
     else {
         global `nam'`i' ""`val'""
     }
     local i=`i'+1
   }
   if index("`type'","str")>0 {
     global f`nam' 
   }
   else {
     global f`nam' `format'
   }
  }
 }
*nois display "A1 VAR: `VAR'"
}
*nois display "A2 VAR: `VAR'"
if "`VAR'"=="VAR" {
*Test that `nam' is a new varname should be done!
  sort  `var' `x'
*nois display "A3 VAR: `VAR'"
  quietly by `var':gen int `nam'=`x'[1]
}
end