*! version 1.4.3 28Apr2017 Malte Kaukal
*!***************************************
*! Title: scandata.ado
*! Description: Ado to check variables for certain characteristics and distributions
*! Author: Malte Kaukal, GESIS - Leibniz Institute for the Social Sciences
*! Version 1.1.0: Infinite loop in correcting mutated vowels in uppercase-letters fixed;
*!   Threshold of value label length adapted					
*! Version 1.2.0: Mutated vowels correction has been improved and check for variable names has been adde
*! Version 1.3.0: title of tables wasn't always underlined; r-class elements renamed; corrections in help file (spelling);
*!   senseless if/in command erased; getting rid of complicated syntax; Infinite loop in correcting mutated vowels fixed (standalone mutated vowels couldn't be handled)
*! Version 1.3.1: error in nolabel option concerning 'too many values' error fixed
*! Version 1.4.0: implementation of a replace procedure for mutated vowels in open answers (strings); output corrections
*! Version 1.4.1: little bugfixes, performance improvements; correction of string option for mutated vowels; tempnames for locals are used
*! Version 1.4.2: correction of mutated vowels in strings is now optional and can be used on its own
*! Version 1.4.3: bug of infinite loop fixed
*!* ************************************************************************************************************

program scandata, rclass
	version 12
	syntax , [UPpercase] [LENgth(string asis)] [ODDvar(string asis)] [UMlaut] [STRUMlaut] [NOLabel] [ALL] [CORrect] [NOPrint]

	if `"`uppercase'"' == "" & `"`length'"' == ""  & `"`oddvar'"' == "" & `"`umlaut'"' == "" & `"`strumlaut'"' == "" & `"`nolabel'"' == ""  & `"`all'"' == "" {
		display as error "At least one option or {bf:all} has to be chosen"
		exit
	}

	capture which labellist
	if _rc == 111 {
		display as error "Ado {it:labellist} not found which is necessary to execute {it:scandata}."
		display as error "Type {input: ssc install labellist} to get the ado"
		exit
	}

	*Temporary names for input locals
	tempname vallabel varlabel varname crit1 crit2 crit3 crit1_out crit2_out

	*Parsing of length/oddvar criteria
	if "`all'" != "" & `"`length'"' == "" {
		local `vallabel' = 119
		local `varlabel' = 79
		local `varname' = 8
	}

	if "`all'" != "" & `"`oddvar'"' == "" {
		local `crit1' = 0.01
		local `crit2' = 0.95
		local `crit3' = 1
		local `crit1_out': display %4.2f ``crit1''*100
		local `crit2_out': display %4.2f ``crit2''*100
	}

	if "`length'" != "" | "`oddvar'" != "" {
		tempname option
		if  "`length'" != "" {
			local `option' = "length"
		}
		if "`oddvar'" != "" {
			local `option' = "oddvar"
		}
		if "`length'" != "" & "`oddvar'" != "" {
			local `option' = "length oddvar"
		}
		foreach par in ``option'' {
			tempname parse_`par'
			local `parse_`par'' = `"``par''"'
			if `"``parse_`par'''"' != "" {
				forvalue x = 1/3 {
					gettoken s`x' `parse_`par'': `parse_`par''
					gettoken w_`x' x_`x': s`x', pars("(")
					gettoken y_`x' z_`x' : x_`x', pars("(")
					gettoken `par'_s`x' : z_`x', pars(")")
				}
				foreach k in vallabel varname varlabel crit1 crit2 crit3 {
					forvalue  x = 1/3 {
						if strmatch(`"`s`x''"',"*`k'*") == 1 {
							if `"`k'"' == "vallabel" {
								local `vallabel' = 119
								if `"``par'_s`x''"' != ")" {
									local `vallabel' = ``par'_s`x''
								}
							}
							else if `"`k'"' == "varname" {
								local `varname' = 8
								if `"``par'_s`x''"' != ")" {
									local `varname' = ``par'_s`x''
								}
							}
							else if `"`k'"' == "varlabel" {
								local `varlabel' = 79
								if `"``par'_s`x''"' != ")" {
									local `varlabel' = ``par'_s`x''
								}
							}
							else if `"`k'"' == "crit1" {
								local `crit1' = 0.01
								if `"``par'_s`x''"' != ")" {
									local `crit1' = ``par'_s`x''
								}
								local `crit1_out': display %4.2f ``crit1''*100
							}
							else if `"`k'"' == "crit2" {
								local `crit2' = 0.95
								if `"``par'_s`x''"' != ")" {
									local `crit2' = ``par'_s`x''
								}
								local `crit2_out': display %4.2f ``crit2''*100
							}
							else if `"`k'"' == "crit3" {
								local `crit3' = 1
								if `"``par'_s`x''"' != ")" {
									local `crit3'=``par'_s`x''
								}
							}
						}
					}
				}
			}
		}
	}
	* Setting temporary names for variable loop
	tempname u ustr uppercase1 length_varname length_varlabel length_vallabel crashnote ///
	 				 u1 u2 u3 u4 um3 um4 um5 umlautvarname1 umlautvar1 numcount umlautval1 umlauttext ///
	 			 	 umlautcontrol umlaut_varname umlautdouble um2 lab_help lab1 lab2 lab3 lab4 lab5 lab_k_help ///
					 umlauttext numcount alllab crash varlab labpercent oddvar1 oddvar2 oddvar3 proport propercent ///
					 crashvar oddvar0 oddvar_or oddvar_and vallabel_var varlabel_var varname_var z nolabel1 ///
					 capvar1 check_rename

	*Check criteria
	*Different commands for Version 14
	if c(stata_version) >= 14 {
		local `u' u		// prefix for unicode commands
		local `ustr' ustr
	}

	*Setting locals independet of variables
	local `um3' : display ``u''char(220) ``u''char(196) ``u''char(214)							// Locals for checking of uppercase or lowercase transformation is needed
	local `um4' : display ``u''char(252) ``u''char(228) ``u''char(246)
	local `um5' : display ``u''char(223)
	local `u1' = ``u''char(220)
	local `u2' = ``u''char(196)
	local `u3' = ``u''char(214)
	local `u4' = ``u''char(223)

	foreach var of varlist _all {
		local `uppercase1' = ``u''lower(`"`var'"')
		local `length_varname' = ``u''length(`"`var'"')
		local `length_varlabel' = ``u''length(`"`:variable label `var''"')
		local `length_vallabel' = 0
		local `crashnote' = 0


		if `"`umlaut'"' != "" | `"`strumlaut'"' != "" | `"``vallabel''"' != "" | `"`all'"' != "" { // Check for mutated vowels in variable and labels
			if `"`umlaut'"'!="" | `"`all'"' != "" {
				*Variable names
				if ``ustr''regexm(`"`var'"',`"[``um3''``um4''``um5'']"') == 1 {
					local `umlautvarname1' `"``umlautvarname1'' `var'"'
					local `umlautvarname1' : list uniq `umlautvarname1'
				}

				*Variable labels
				if ``ustr''regexm(`"`:variable label `var''"',`"[``um3''``um4''``um5'']"') == 1 {
					local `umlautvar1' `"``umlautvar1'' `var'"'
					local `umlautvar1': list uniq `umlautvar1'
				}

				*Labels
				capture confirm numeric variable `var'
				if !_rc {
					local `numcount' = ``numcount''+1
					qui labellist `var'					// Ado by Daniel Klein
					foreach k in `r(values)' {

						if  ``u''length(`"`: label `:value label `var'' `k''"') > ``length_vallabel'' {				// Searching for greatest label length
							local `length_vallabel' = ``u''length(`"`: label `:value label `var'' `k''"')
						}

						if `"`umlaut'"' != "" | `"`all'"' != "" {
							if ``ustr''regexm(`"`:label `:value label `var'' `k''"',`"[``um3''``um4''``um5'']"') == 1 {
								local `umlautval1' `"``umlautval1'' `var'"'
								local `umlautval1' : list uniq `umlautval1'
							}
						}
					}
				}
			}
			if `"`strumlaut'"'!="" | `"`all'"' != "" {
				*Strings
				capture confirm string variable `var'
				if !_rc {
					qui tab1 `var' if ``ustr''regexm(`var',`"[``um3''``um4''``um5'']"') == 1
					if r(N) != 0 {
						local `umlauttext' `"``umlauttext'' `var'"'
						local `umlauttext' : list uniq `umlauttext'
					}
				}
			}


			if `"`correct'"' != "" {
				if (`"`umlaut'"' != "" | `"`all'"' != "") {
					*Variable names
					local `umlautcontrol' = 0
					if ``ustr''regexm(`"`var'"',`"[``um3''``um4''``um5'']"') == 1 {
							local `umlautcontrol' = 1
							local `umlaut_varname' = `"`var'"'
					}
					while ``umlautcontrol'' == 1 {
						foreach p in ``u''char(220) ``u''char(196) ``u''char(214) ``u''char(223) {
							local `umlautdouble' = 1
							while ``umlautdouble'' == 1 {
								local `um2' = `p'
								if ``ustr''regexm(`"``umlaut_varname''"',`"([``um2''][A-Z``um3'']+)|([A-Z``um3'']+[``um2''])"') == 1 {			// Checking for uppercase letters before or behind
									if "`p'" == "``u''char(220)" {
										local `umlaut_varname' = ``u''subinstr(`"``umlaut_varname''"',``u''char(220),``u''char(85) + ``u''char(69),1)
									}
									else if "`p'" == "``u''char(196)" {
										local `umlaut_varname' = ``u''subinstr(`"``umlaut_varname''"',``u''char(196),``u''char(65) + ``u''char(69),1)
									}
									else if "`p'" == "``u''char(214)" {
										local `umlaut_varname' = ``u''subinstr(`"``umlaut_varname''"',``u''char(214),``u''char(79) + ``u''char(69),1)
									}
									else if "`p'" == "``u''char(223)" {
										local `umlaut_varname' = ``u''subinstr(`"``umlaut_varname''"',``u''char(223),2*``u''char(83),1)
									}
								}
								if ``ustr''regexm(`"``umlaut_varname''"',`"([``um2''][a-z``um4'']+)|([a-z``um4'']+[``um2''])"') == 1 { 			// Checking for lowercase letters before or behind
									if "`p'" == "``u''char(220)" {
										local `umlaut_varname' = ``u''subinstr(`"``umlaut_varname''"',``u''char(220),``u''char(85) + ``u''char(101),1)
									}
									else if "`p'" == "``u''char(196)" {
										local `umlaut_varname' = ``u''subinstr(`"``umlaut_varname''"',``u''char(196),``u''char(65) + ``u''char(101),1)
									}
									else if "`p'" == "``u''char(214)" {
										local `umlaut_varname' = ``u''subinstr(`"``umlaut_varname''"',``u''char(214),``u''char(79) + ``u''char(101),1)
									}
									else if "`p'" == "``u''char(223)" {
										local `umlaut_varname' = ``u''subinstr(`"``umlaut_varname''"',``u''char(223),2*``u''char(115),1)
									}
								}
								if ``ustr''regexm(`"``umlaut_varname''"',`"(^[``um2'']$)"') == 1 { 			// Checking for standalone uppercase mutated vowels
									if "`p'" == "``u''char(220)" {
										local `umlaut_varname' = ``u''subinstr(`"``umlaut_varname''"',``u''char(220),``u''char(85) + ``u''char(69),1)
									}
									else if "`p'" == "``u''char(196)" {
										local `umlaut_varname' = ``u''subinstr(`"``umlaut_varname''"',``u''char(196),``u''char(65) + ``u''char(69),1)
									}
									else if "`p'" == "``u''char(214)" {
										local `umlaut_varname' = ``u''subinstr(`"``umlaut_varname''"',``u''char(214),``u''char(79) + ``u''char(69),1)
									}
									else if "`p'" == "``u''char(223)" {
										local `umlaut_varname' = ``u''subinstr(`"``umlaut_varname''"',``u''char(223),2*``u''char(83),1)
									}
								}
								if ``ustr''regexm(`"``umlaut_varname''"',"[``um2'']") == 0 {
									local `umlautdouble' = 0
								}
							}
						}
						local `umlaut_varname' = ``u''subinstr(`"``umlaut_varname''"',``u''char(228),``u''char(97) + ``u''char(101),1)
						local `umlaut_varname' = ``u''subinstr(`"``umlaut_varname''"',``u''char(246),``u''char(111) + ``u''char(101),1)
						local `umlaut_varname' = ``u''subinstr(`"``umlaut_varname''"',``u''char(252),``u''char(117) + ``u''char(101),1)
						local `umlaut_varname' = ``u''subinstr(`"``umlaut_varname''"',``u''char(223), 2*``u''char(83),1)

						local `umlautcontrol' = 0
						if ``ustr''regexm(`"``umlaut_varname''"',`"[``um3''``um4''``um5'']"') == 1 {
								local `umlautcontrol' = 1
						}
					}

					*Variable labels
					local `lab_help' = subinstr(`"`:variable label `var''"',``u''char(34),``u''char(7),.)		// Replacing quotation marks due to problems in word parsing
					local `lab_help' = subinstr(`"``lab_help''"',``u''char(39),``u''char(8),.)
					lab var `var' `"``lab_help''"'

					local `umlautcontrol' = 0
					if ``ustr''regexm(`"`:variable label `var''"',`"[``um3''``um4''``um5'']"') == 1 {
							local `umlautcontrol' = 1
					}
					while ``umlautcontrol'' == 1 {
						foreach x of numlist 1/`:word count `:variable label `var''' {
							foreach p in ``u''char(220) ``u''char(196) ``u''char(214) ``u''char(223) {
								local `umlautdouble' = 1
								while ``umlautdouble'' == 1 {
									local `um2' = `p'
									if ``ustr''regexm(`"`:word `x' of `:variable label `var'''"',`"([``um2''][A-Z``um3'']+)|([A-Z``um3'']+[``um2''])"') ==1  {			// Checking for uppercase letters before or behind
										if "`p'" == "``u''char(220)" {
											local `lab1' = ``u''subinstr(`"`:word `x' of `:variable label `var'''"',``u''char(220),``u''char(85) + ``u''char(69),1)
											local `lab2' = ``u''subinstr(`"`:variable label `var''"',`"`:word `x' of `:variable label `var'''"',"``lab1''",1)
											label variable `var' `"``lab2''"'
										}
										else if "`p'" == "``u''char(196)" {
											local `lab1' = ``u''subinstr(`"`:word `x' of `:variable label `var'''"',``u''char(196),``u''char(65) + ``u''char(69),1)
											local `lab2' = ``u''subinstr(`"`:variable label `var''"',`"`:word `x' of `:variable label `var'''"',"``lab1''",1)
											label variable `var' `"``lab2''"'
										}
										else if "`p'" == "``u''char(214)" {
											local `lab1' = ``u''subinstr(`"`:word `x' of `:variable label `var'''"',``u''char(214),``u''char(79) + ``u''char(69),1)
											local `lab2' = ``u''subinstr(`"`:variable label `var''"',`"`:word `x' of `:variable label `var'''"',"``lab1''",1)
											label variable `var' `"``lab2''"'
										}
										else if "`p'" == "``u''char(223)" {
											local `lab1' = ``u''subinstr(`"`:word `x' of `:variable label `var'''"',``u''char(223),2*``u''char(83),1)
											local `lab2' = ``u''subinstr(`"`:variable label `var''"',`"`:word `x' of `:variable label `var'''"',"``lab1''",1)
											label variable `var' `"``lab2''"'
										}
									}
									if ``ustr''regexm(`"`:word `x' of `:variable label `var'''"',`"([``um2''][a-z``um4'']+)|([a-z``um4'']+[``um2''])"') == 1 { 			// Checking for lowercase letters before or behind
										if "`p'" == "``u''char(220)" {
											local `lab1' = ``u''subinstr(`"`:word `x' of `:variable label `var'''"',``u''char(220),``u''char(85) + ``u''char(101),1)
											local `lab2' = ``u''subinstr(`"`:variable label `var''"',`"`:word `x' of `:variable label `var'''"',"``lab1''",1)
											label variable `var' `"``lab2''"'
										}
										else if "`p'" == "``u''char(196)" {
											local `lab1' = ``u''subinstr(`"`:word `x' of `:variable label `var'''"',``u''char(196),``u''char(65) + ``u''char(101),1)
											local `lab2' = ``u''subinstr(`"`:variable label `var''"',`"`:word `x' of `:variable label `var'''"',"``lab1''",1)
											label variable `var' `"``lab2''"'
										}
										else if "`p'" == "``u''char(214)" {
											local `lab1' = ``u''subinstr(`"`:word `x' of `:variable label `var'''"',``u''char(214),``u''char(79) + ``u''char(101),1)
											local `lab2' = ``u''subinstr(`"`:variable label `var''"',`"`:word `x' of `:variable label `var'''"',"``lab1''",1)
											label variable `var' `"``lab2''"'
										}
										else if "`p'" == "``u''char(223)" {
											local `lab1' = ``u''subinstr(`"`:word `x' of `:variable label `var'''"',``u''char(223),2*``u''char(115),1)
											local `lab2' = ``u''subinstr(`"`:variable label `var''"',`"`:word `x' of `:variable label `var'''"',"``lab1''",1)
											label variable `var' `"``lab2''"'
										}
									}
									if ``ustr''regexm(`"`:word `x' of `:variable label `var'''"',`"(^[``um2'']$)"') == 1 {			// Checking for standalone uppercase mutated vowels
										if "`p'" == "``u''char(220)" {
											local `lab1' = ``u''subinstr(`"`:word `x' of `:variable label `var'''"',``u''char(220),``u''char(85) + ``u''char(69),1)
											local `lab2' = ``u''subinstr(`"`:variable label `var''"',`"`:word `x' of `:variable label `var'''"',"``lab1''",1)
											label variable `var' `"``lab2''"'
										}
										else if "`p'" == "``u''char(196)" {
											local `lab1' = ``u''subinstr(`"`:word `x' of `:variable label `var'''"',``u''char(196),``u''char(65) + ``u''char(69),1)
											local `lab2' = ``u''subinstr(`"`:variable label `var''"',`"`:word `x' of `:variable label `var'''"',"``lab1''",1)
											label variable `var' `"``lab2''"'
										}
										else if "`p'" == "``u''char(214)" {
											local `lab1' = ``u''subinstr(`"`:word `x' of `:variable label `var'''"',``u''char(214),``u''char(79) + ``u''char(69),1)
											local `lab2' = ``u''subinstr(`"`:variable label `var''"',`"`:word `x' of `:variable label `var'''"',"``lab1''",1)
											label variable `var' `"``lab2''"'
										}
										else if "`p'" == "``u''char(223)" {
											local `lab1' = ``u''subinstr(`"`:word `x' of `:variable label `var'''"',``u''char(223),2*``u''char(83),1)
											local `lab2' = ``u''subinstr(`"`:variable label `var''"',`"`:word `x' of `:variable label `var'''"',"``lab1''",1)
											label variable `var' `"``lab2''"'
										}
									}

									if ``ustr''regexm(`"`:word `x' of `:variable label `var'''"',"[``um2'']") == 0 {
										local `umlautdouble' = 0
									}
								}
							}
						}
						local `lab2' = ``u''subinstr(`"`:variable label `var''"',``u''char(228),``u''char(97) + ``u''char(101),1)
						local `lab3' = ``u''subinstr(`"``lab2''"',``u''char(246),``u''char(111) + ``u''char(101),1)
						local `lab4' = ``u''subinstr(`"``lab3''"',``u''char(252),``u''char(117) + ``u''char(101),1)
						local `lab5' = ``u''subinstr(`"``lab4''"',``u''char(223), 2*``u''char(83),1)
						label variable `var' `"``lab5''"'

						local `umlautcontrol' = 0
						if ``ustr''regexm(`"`:variable label `var''"',`"[``um3''``um4''``um5'']"') == 1 {
								local `umlautcontrol' = 1
						}
					}

					local `lab_help' = ``u''subinstr(`"`:variable label `var''"',``u''char(7),``u''char(34),.)		// Restoring quotation marks
					local `lab_help' = ``u''subinstr(`"``lab_help''"',``u''char(8),``u''char(39),.)
					lab var `var' `"``lab_help''"'

					*Labels
					qui labellist `var'
					foreach k in `r(values)' {
						if `"`:label `:value label `var'' `k''"' != `"`k'"' {
							local `lab_k_help' = ``u''subinstr(`"`:label `:value label `var'' `k''"',``u''char(34),``u''char(7),.)  // Replacing quotation marks due to problems in word parsing
							local `lab_k_help' = ``u''subinstr(`"``lab_k_help''"',``u''char(39),``u''char(8),.)
							lab def `:value label `var'' `k' `"``lab_k_help''"', modify

							local `umlautcontrol' = 0
							if ``ustr''regexm(`"`:label `:value label `var'' `k''"',`"[``um3''``um4''``um5'']"') == 1 {
									local `umlautcontrol' = 1
							}
							while ``umlautcontrol'' == 1 {
								foreach x of numlist 1/`:word count `:label `:value label `var'' `k''' {
									local `umlautdouble' = 1
									while ``umlautdouble'' == 1 {
										foreach p in ``u''char(220) ``u''char(196) ``u''char(214) ``u''char(223) {
											local `um2' = `p'
											if ``ustr''regexm(`"`:word `x' of `:label `:value label `var'' `k'''"',`"([``um2''][A-Z``um3'']+)|([A-Z``um3'']+[``um2''])"') == 1 {  	// Checking for uppercase letters before or behind
												if "`p'" == "``u''char(220)" {
													local `lab1' = ``u''subinstr(`"`:word `x' of `:label `:value label `var'' `k'''"',``u''char(220),``u''char(85) + ``u''char(69),1)
													local `lab2' = ``u''subinstr(`"`:label `:value label `var'' `k''"',`"`:word `x' of `:label `:value label `var'' `k'''"',"``lab1''",1)
													label def `:value label `var'' `k' `"``lab2''"', modify
												}
												else if "`p'" == "``u''char(196)" {
													local `lab1' = ``u''subinstr(`"`:word `x' of `:label `:value label `var'' `k'''"',``u''char(196),``u''char(65) + ``u''char(69),1)
													local `lab2' = ``u''subinstr(`"`:label `:value label `var'' `k''"',`"`:word `x' of `:label `:value label `var'' `k'''"',"``lab1''",1)
													label def `:value label `var'' `k' `"``lab2''"', modify
												}
												else if "`p'" == "``u''char(214)" {
													local `lab1' = ``u''subinstr(`"`:word `x' of `:label `:value label `var'' `k'''"',``u''char(214),``u''char(79) + ``u''char(69),1)
													local `lab2' = ``u''subinstr(`"`:label `:value label `var'' `k''"',`"`:word `x' of `:label `:value label `var'' `k'''"',"``lab1''",1)
													label def `:value label `var'' `k' `"``lab2''"', modify
												}
												else if "`p'" == "``u''char(223)" {
													local `lab1' = ``u''subinstr(`"`:word `x' of `:label `:value label `var'' `k'''"',``u''char(223),2*``u''char(83),1)
													local `lab2' = ``u''subinstr(`"`:label `:value label `var'' `k''"',`"`:word `x' of `:label `:value label `var'' `k'''"',"``lab1''",1)
													label def `:value label `var'' `k' `"``lab2''"', modify
												}
											}
											if ``ustr''regexm(`"`:word `x' of `:label `:value label `var'' `k'''"',`"([``um2''][a-z``um4'']+)|([a-z``um4'']+[``um2''])"') == 1 {				// Checking for lowercase letters before or behind
												if "`p'" == "``u''char(220)" {
													local `lab1' = ``u''subinstr(`"`:word `x' of `:label `:value label `var'' `k'''"',``u''char(220),``u''char(85) + ``u''char(101),1)
													local `lab2' = ``u''subinstr(`"`:label `:value label `var'' `k''"',`"`:word `x' of `:label `:value label `var'' `k'''"',"``lab1''",1)
													label def `:value label `var'' `k' `"``lab2''"', modify
												}
												else if "`p'" == "``u''char(196)" {
													local `lab1' = ``u''subinstr(`"`:word `x' of `:label `:value label `var'' `k'''"',``u''char(196),``u''char(65) + ``u''char(101),1)
													local `lab2' = ``u''subinstr(`"`:label `:value label `var'' `k''"',`"`:word `x' of `:label `:value label `var'' `k'''"',"``lab1''",1)
													label def `:value label `var'' `k' `"``lab2''"', modify
												}
												else if "`p'" == "``u''char(214)" {
													local `lab1' = ``u''subinstr(`"`:word `x' of `:label `:value label `var'' `k'''"',``u''char(214),``u''char(79) + ``u''char(101),1)
													local `lab2' = ``u''subinstr(`"`:label `:value label `var'' `k''"',`"`:word `x' of `:label `:value label `var'' `k'''"',"``lab1''",1)
													label def `:value label `var'' `k' `"``lab2''"', modify
												}
												else if "`p'" == "``u''char(223)" {
													local `lab1' = ``u''subinstr(`"`:word `x' of `:label `:value label `var'' `k'''"',``u''char(223),2*``u''char(115),1)
													local `lab2' = ``u''subinstr(`"`:label `:value label `var'' `k''"',`"`:word `x' of `:label `:value label `var'' `k'''"',"``lab1''",1)
													label def `:value label `var'' `k' `"``lab2''"', modify
												}
											}
											if ``ustr''regexm(`"`:word `x' of `:label `:value label `var'' `k'''"',`"^[``um2'']$"') == 1 {  	// Checking for standalone uppercase mutated vowels
												if "`p'" == "``u''char(220)" {
													local `lab1' = ``u''subinstr(`"`:word `x' of `:label `:value label `var'' `k'''"',``u''char(220),``u''char(85) + ``u''char(69),1)
													local `lab2' = ``u''subinstr(`"`:label `:value label `var'' `k''"',`"`:word `x' of `:label `:value label `var'' `k'''"',"``lab1''",1)
													label def `:value label `var'' `k' `"``lab2''"', modify
												}
												else if "`p'" == "``u''char(196)" {
													local `lab1' = ``u''subinstr(`"`:word `x' of `:label `:value label `var'' `k'''"',``u''char(196),``u''char(65) + ``u''char(69),1)
													local `lab2' = ``u''subinstr(`"`:label `:value label `var'' `k''"',`"`:word `x' of `:label `:value label `var'' `k'''"',"``lab1''",1)
													label def `:value label `var'' `k' `"``lab2''"', modify
												}
												else if "`p'" == "``u''char(214)" {
													local `lab1' = ``u''subinstr(`"`:word `x' of `:label `:value label `var'' `k'''"',``u''char(214),``u''char(79) + ``u''char(69),1)
													local `lab2' = ``u''subinstr(`"`:label `:value label `var'' `k''"',`"`:word `x' of `:label `:value label `var'' `k'''"',"``lab1''",1)
													label def `:value label `var'' `k' `"``lab2''"', modify
												}
												else if "`p'" == "``u''char(223)" {
													local `lab1' = ``u''subinstr(`"`:word `x' of `:label `:value label `var'' `k'''"',``u''char(223),2*``u''char(83),1)
													local `lab2' = ``u''subinstr(`"`:label `:value label `var'' `k''"',`"`:word `x' of `:label `:value label `var'' `k'''"',"``lab1''",1)
													label def `:value label `var'' `k' `"``lab2''"', modify
												}
											}
										}
										if ``ustr''regexm(`"`:word `x' of `:label `:value label `var'' `k'''"',"[``um2'']") == 0 {
											local `umlautdouble' = 0
										}
									}
								}
								local `lab2' = ``u''subinstr(`"`:label `:value label `var'' `k''"',``u''char(228),``u''char(97) + ``u''char(101),1)
								local `lab3' = ``u''subinstr(`"``lab2''"',``u''char(246),``u''char(111) + ``u''char(101),1)
								local `lab4' = ``u''subinstr(`"``lab3''"',``u''char(252),``u''char(117) + ``u''char(101),1)
								local `lab5' = ``u''subinstr(`"``lab4''"',``u''char(223), 2*``u''char(83),1)
								label def `:value label `var'' `k' `"``lab5''"', modify

								local `umlautcontrol' = 0
								if ``ustr''regexm(`"`:label `:value label `var'' `k''"',`"[``um3''``um4''``um5'']"') == 1 {
										local `umlautcontrol' = 1
								}
							}
							local `lab_k_help' = ``u''subinstr(`"`:label `:value label `var'' `k''"',``u''char(7),``u''char(39),.)  // Restoring quotation marks
							local `lab_k_help' = ``u''subinstr(`"``lab_k_help''"',``u''char(8),``u''char(39),.)
							lab def `:value label `var'' `k' `"``lab_k_help''"', modify
						}
					}
				}
				*Text
				if (`"`strumlaut'"'!="" | `"`all'"' != "") {
					capture confirm string variable `var'
					if !_rc {
						quietly {
							qui tab1 `var' if ``ustr''regexm(`var',`"[``um3''``um4''``um5'']"') == 1
							if r(N) != 0 {
								local `umlauttext' `"``umlauttext'' `var'"'
								local `umlauttext': list uniq `umlauttext'

								gen `var'_cmv = `var'
								lab var `var'_cmv `"`:variable label `var'' [corrected mutated vowels]"'

								replace `var'_cmv = subinstr(`var'_cmv,``u''char(10),``u''char(32),.) // Linefeed is transformed in space
								replace `var'_cmv = subinstr(`var'_cmv,``u''char(13),``u''char(32),.) // Carriage return is transformed in space

								*uppercase following/preceeding
								replace `var'_cmv = ``ustr''regexs(1) + ``u''char(85) + ``u''char(69) + ``ustr''regexs(3) if ``ustr''regexm(`var'_cmv,`"(.*[ ]*)([``u1''])([A-Z``um3'']+.*)"') == 1
								replace `var'_cmv = ``ustr''regexs(1) + ``u''char(65) + ``u''char(69) + ``ustr''regexs(3) if ``ustr''regexm(`var'_cmv,`"(.*[ ]*)([``u2''])([A-Z``um3'']+.*)"') == 1
								replace `var'_cmv = ``ustr''regexs(1) + ``u''char(79) + ``u''char(69) + ``ustr''regexs(3) if ``ustr''regexm(`var'_cmv,`"(.*[ ]*)([``u3''])([A-Z``um3'']+.*)"') == 1
								replace `var'_cmv = ``ustr''regexs(1) + ``u''char(83) + ``u''char(83) + ``ustr''regexs(3) if ``ustr''regexm(`var'_cmv,`"(.*[ ]*)([``u4''])([A-Z``um3'']+.*)"') == 1

								replace `var'_cmv = ``u''char(85) + ``u''char(69) + ``ustr''regexs(2) if ``ustr''regexm(`var'_cmv,`"^([``u1''])([A-Z``um3'']+.*)"') == 1
								replace `var'_cmv = ``u''char(65) + ``u''char(69) + ``ustr''regexs(2) if ``ustr''regexm(`var'_cmv,`"^([``u2''])([A-Z``um3'']+.*)"') == 1
								replace `var'_cmv = ``u''char(79) + ``u''char(69) + ``ustr''regexs(2) if ``ustr''regexm(`var'_cmv,`"^([``u3''])([A-Z``um3'']+.*)"') == 1
								replace `var'_cmv = ``u''char(83) + ``u''char(83) + ``ustr''regexs(2) if ``ustr''regexm(`var'_cmv,`"^([``u4''])([A-Z``um3'']+.*)"') == 1

								replace `var'_cmv = ``ustr''regexs(1) + ``u''char(85) + ``u''char(69) + ``ustr''regexs(3) if ``ustr''regexm(`var'_cmv,`"(.*[A-Z``um3'']+)([``u1''])([ ]*.*)"') == 1
								replace `var'_cmv = ``ustr''regexs(1) + ``u''char(65) + ``u''char(69) + ``ustr''regexs(3) if ``ustr''regexm(`var'_cmv,`"(.*[A-Z``um3'']+)([``u2''])([ ]*.*)"') == 1
								replace `var'_cmv = ``ustr''regexs(1) + ``u''char(79) + ``u''char(69) + ``ustr''regexs(3) if ``ustr''regexm(`var'_cmv,`"(.*[A-Z``um3'']+)([``u3''])([ ]*.*)"') == 1
								replace `var'_cmv = ``ustr''regexs(1) + ``u''char(83) + ``u''char(83) + ``ustr''regexs(3) if ``ustr''regexm(`var'_cmv,`"(.*[A-Z``um3'']+)([``u4''])([ ]*.*)"') == 1

								replace `var'_cmv = ``ustr''regexs(1) + ``u''char(85) + ``u''char(69) + ``ustr''regexs(3) if ``ustr''regexm(`var'_cmv,`"(.*[A-Z``um3'']+)([``u1''])($)"') == 1
								replace `var'_cmv = ``ustr''regexs(1) + ``u''char(65) + ``u''char(69) + ``ustr''regexs(3) if ``ustr''regexm(`var'_cmv,`"(.*[A-Z``um3'']+)([``u2''])($)"') == 1
								replace `var'_cmv = ``ustr''regexs(1) + ``u''char(79) + ``u''char(69) + ``ustr''regexs(3) if ``ustr''regexm(`var'_cmv,`"(.*[A-Z``um3'']+)([``u3''])($)"') == 1
								replace `var'_cmv = ``ustr''regexs(1) + ``u''char(83) + ``u''char(83) + ``ustr''regexs(3) if ``ustr''regexm(`var'_cmv,`"(.*[A-Z``um3'']+)([``u4''])($)"') == 1

								*lowercase following
								replace `var'_cmv = ``ustr''regexs(1) + ``u''char(85) + ``u''char(101) + ``ustr''regexs(3) if ``ustr''regexm(`var'_cmv,`"(.*[ ]*)([``u1''])([a-z``um4'']+.*)"') == 1
								replace `var'_cmv = ``ustr''regexs(1) + ``u''char(65) + ``u''char(101) + ``ustr''regexs(3) if ``ustr''regexm(`var'_cmv,`"(.*[ ]*)([``u2''])([a-z``um4'']+.*)"') == 1
								replace `var'_cmv = ``ustr''regexs(1) + ``u''char(79) + ``u''char(101) + ``ustr''regexs(3) if ``ustr''regexm(`var'_cmv,`"(.*[ ]*)([``u3''])([a-z``um4'']+.*)"') == 1
								replace `var'_cmv = ``ustr''regexs(1) + ``u''char(83) + ``u''char(115) + ``ustr''regexs(3) if ``ustr''regexm(`var'_cmv,`"(.*[ ]*)([``u4''])([a-z``um4'']+.*)"') == 1

								replace `var'_cmv = ``u''char(85) + ``u''char(101) + ``ustr''regexs(2) if ``ustr''regexm(`var'_cmv,`"^([``u1''])([a-z``um4'']+.*)"') == 1
								replace `var'_cmv = ``u''char(65) + ``u''char(101) + ``ustr''regexs(2) if ``ustr''regexm(`var'_cmv,`"^([``u2''])([a-z``um4'']+.*)"') == 1
								replace `var'_cmv = ``u''char(79) + ``u''char(101) + ``ustr''regexs(2) if ``ustr''regexm(`var'_cmv,`"^([``u3''])([a-z``um4'']+.*)"') == 1
								replace `var'_cmv = ``u''char(83) + ``u''char(115) + ``ustr''regexs(2) if ``ustr''regexm(`var'_cmv,`"^([``u4''])([a-z``um4'']+.*)"') == 1

								*lowercase mutated vowels
								replace `var'_cmv = ``u''subinstr(`var'_cmv,``u''char(252),``u''char(117) + ``u''char(101),.)
								replace `var'_cmv = ``u''subinstr(`var'_cmv,``u''char(228),``u''char(97) + ``u''char(101),.)
								replace `var'_cmv = ``u''subinstr(`var'_cmv,``u''char(246),``u''char(111) + ``u''char(101),.)
								replace `var'_cmv = ``u''subinstr(`var'_cmv,``u''char(223),``u''char(115) + ``u''char(115),.)

							}
						}
					}
				}
			}
		}

		if `"`oddvar'"' != "" | `"`nolabel'"' != "" | `"`all'"' != "" {                                   // Check for odd distributions in variables
			capture confirm numeric variable `var'
			if `"`umlaut'"' == "" & `"`all'"' == "" {
				local `numcount' = ``numcount'' + 1
			}
			if !_rc {
				capture qui label list `:value label `var''
				local `alllab' = r(k)

				capture qui tab1 `var', matcell(matval) matrow(values)
				if _rc == 134 {
					if `"``crash''"' == "" {
						local `crash' = "`var'"
						local `crashnote' = 1
					}
					else {
						local `crash' = "``crash''" + " `var'"
					}
				}
				else {
					local `varlab' = r(r)
					if `"`oddvar'"' != "" | `"`all'"' != "" {
						local `labpercent' = ``varlab''/``alllab''							    // Percentage of all values used in variable being in the value label available

						if "``crit1''" != "" & "`:value label `var''" != "" {
							if ``labpercent'' < ``crit1'' {									// Odd distribution criterion 1: Percentage of used values regarding all labels
								local `oddvar1' = "``oddvar1'' `var'"
								local `oddvar1': list uniq `oddvar1'
							}
						}

						if "``crit2''" != "" | "``crit3''" != "" {
							forval x = 1/``varlab'' {
								local `proport' = el(matval,`x',1)
								local `propercent' = ``proport''/c(N)							    // Percentage of oberservations per value regarding all observations
								if "``crit2''" != "" {
									if  ``propercent'' > ``crit2'' & ``propercent'' < .  {		// Odd distribution criterion 2: Threshold of classifying value as having to many observations
										local `oddvar2' = "``oddvar2'' `var'"
										local `oddvar2': list uniq `oddvar2'
									}
								}
								if "``crit3''" != "" {
									if ``proport'' <= ``crit3'' {					// Odd distribution criterion 3: Threshold of classifying values as having too little observations
										local `oddvar3' = "``oddvar3'' `var'"
										local `oddvar3': list uniq `oddvar3'
									}
								}
							}
						}
					}
				}
			}

			local `crashvar': list clean `crash'

			if ("``crit1''" != "" & ("``crit2''" != "" | "``crit3''" != "")) | ///
			   ("``crit2''" != "" & ("``crit1''" != "" | "``crit3''" != "")) | ///
			   ("``crit3''" != "" & ("``crit1''" != "" | "``crit2''" != "")) {
					local `oddvar0': list `oddvar1' | `oddvar2'			          // Grouping odd variables
					local `oddvar_or': list `oddvar0' | `oddvar3'
					local `oddvar_or': list sort `oddvar_or'                                // Fitting one criteria out of all
			}

			if "``crit1''" != "" & "``crit2''" != "" & "``crit3''" != "" {
				local `oddvar_and': list `oddvar1' & `oddvar2'
				local `oddvar_and': list `oddvar_and' & `oddvar3'
				local `oddvar_and': list sort `oddvar_and'                            // Fitting all criteria apllied
			}
			else if "``crit1''" == "" & "``crit2''" != "" & "``crit3''" != "" {
				local `oddvar_and': list `oddvar2' & `oddvar3'
				local `oddvar_and': list sort `oddvar_and'                            // Fitting all criteria apllied
			}
			else if "``crit1''" != "" & "``crit2''" == "" & "``crit3''" != "" {
				local `oddvar_and': list `oddvar1' & `oddvar3'
				local `oddvar_and': list sort `oddvar_and'                            // Fitting all criteria apllied
			}
			else if "``crit1''" != "" & "``crit2''" != "" & "``crit3''" == "" {
				local `oddvar_and': list `oddvar1' & `oddvar2'
				local `oddvar_and': list sort `oddvar_and'                            // Fitting all criteria apllied
			}

			else if "``crit1''" != "" & "``crit2''" == "" & "``crit3''" == "" {
				local `oddvar_and': list sort `oddvar1'                            // Just one criterion chosen
			}
			else if "``crit1''" == "" & "``crit2''" != "" & "``crit3''" == "" {
				local `oddvar_and': list sort `oddvar2'                            // Just one criterion chosen
			}
			else if "``crit1''" == "" & "``crit2''" == "" & "``crit3''" != "" {
				local `oddvar_and': list sort `oddvar3'                            // Just one criterion chosen
			}
		}

		if `"`length'"' != "" | `"`all'"' != "" { 								// Check for length of variable name
			foreach k of newlist vallabel varlabel varname {
				if `"```k'''"' != "" {
					if ``length_`k''' > ```k''' {
						local ``k'_var' "```k'_var'' `var'"
						local ``k'_var': list uniq ``k'_var'
					}
				}
			}
		}

		if (`"`nolabel'"' != "" | `"`all'"' != "") & `"`:value label `var''"' != "" & "``crashnote''" == "0" {				// Searching for unlabeled values
			forval x = 1/``varlab'' {
				local `z' = el(values,`x',1)
				if `"`: label `:value label `var'' ``z'', strict'"' == "" {
					local `nolabel1' `"``nolabel1'' `var'"'
					local `nolabel1': list uniq `nolabel1'
				}
			}
		}

		if `"`uppercase'"' != "" | `"`all'"' != "" { 							// Check for uppercase letters
			if "``uppercase1''" != "`var'" | strmatch(`"`var'"',`"*``um5''*"') == 1 {
				local `capvar1' "``capvar1'' `var'"
				local `capvar1': list uniq `capvar1'
				if `"`correct'"' != "" {
					if (`"`umlaut'"' != "" | `"`all'"' != "") & strmatch("``umlautvarname1''",`"*`var'*"') == 1 {
						local `umlaut_varname' = ``u''strlower(`"``umlaut_varname''"')
						rename `var' ``umlaut_varname''
						local `check_rename' = 1
					}
					else {
						rename `var' ``uppercase1''
					}
				}
			}
		}

		if (`"`umlaut'"' != "" | `"`all'"' != "") & `"`correct'"' != "" & `"``check_rename''"' != "1" &  ``ustr''regexm(`"``umlautvarname1''"',`"(^`var'$)|([A-Za-z0-9]*[ ]`var'[ A-Za-z0-9]*)"') == 1 {
			 rename `var' ``umlaut_varname''
			 local `check_rename' = 0
		}
	}

	*Generating Output
	tempname number1 number2 wordn wordn2 y1 y2 ncol col hlpcol ctrl hlpcount hlich1 hlich2 capcount vallabel_count varlabel_count varname_count uml0count uml1count uml2count uml3count ///
					nolabelcount oddvar_or_count oddvar_or1_count oddvar_and_count check
	tempname done1 done2 done3 done4 done51 done52 done53 done54 done6 done7
	tempname done11 done12 done13 done14 done151 done152 done153 done154 done16 done17

	foreach output of newlist `capvar1' `vallabel_var' `varlabel_var' `varname_var' `umlautvarname1' `umlautvar1' `umlautval1' `umlauttext' `nolabel1' `oddvar_or' `oddvar_and' `crashvar' {

		*Defining locals I
		local `number1' = 0
		local `number2' = 0

		*Preparation for output/ defining locals II
		local `wordn' : word count ``output''
		local `y2' = 8
		forval z = 1/``wordn'' {
			local `y1' = length("`:word `z' of ``output'''")		// Checking length of variables
			if ``y1'' > ``y2'' {
				local `y2' = ``y1''
			}
		}

		local `ncol' = floor(c(linesize)/(``y2'' + 2))						// Locals needed for table output
		local `ctrl' = 1
		local `hlpcount' = 0
		local `wordn2' = ceil(``wordn''/``ncol'')
		local `hlich1' = (``y2'' + 2)*``wordn''
		local `hlich2' = (``y2'' + 2)*``ncol''

		local `capcount': word count ``capvar1''
		local `vallabel_count': word count ``vallabel_var''
		local `varlabel_count': word count ``varlabel_var''
		local `varname_count': word count ``varname_var''
		local `uml0count': word count ``umlautvarname1''
		local `uml1count': word count ``umlautvar1''
		local `uml2count': word count ``umlautval1''
		local `uml3count': word count ``umlauttext''
		local `nolabelcount': word count ``nolabel1''
		local `oddvar_or_count': word count ``oddvar_or''
		local `oddvar_or1_count': word count ``oddvar_or1''
		local `oddvar_and_count': word count ``oddvar_and''


		*Output

		if "`noprint'" == "" {
			if `"``output''"' != "" | `"`all'"' != "" {
				display ""
					if `"`output'"' == "`capvar1'" {
						display "{text} {bind:Variables with upper-case characters (``capcount'' of `c(k)' variables)}"
					}
					else if `"`output'"' == "`vallabel_var'"  & "``vallabel''" != "" {
						display "{text} {bind:Value labels with more than ``vallabel'' characters (``vallabel_count'' of ``numcount'' numeric variables)}"
					}
					else if `"`output'"' == "`varlabel_var'" & "``varlabel''" != "" {
						display "{text} {bind:Variable labels with more than ``varlabel'' characters (``varlabel_count'' of `c(k)' variables)}"
					}
					else if `"`output'"' == "`varname_var'" & "``varname''" != "" {
						display "{text} {bind:Variable names with more than ``varname'' characters (``varname_count'' of `c(k)' variables)}"
					}
					else if `"`output'"' == "`umlautvarname1'" {
						display "{text} {bind:Variables with mutated vowels in {ul:variable names} (``uml0count'' of `c(k)' variables)}"
					}
					else if `"`output'"' == "`umlautvar1'" {
						display "{text} {bind:Variables with mutated vowels in {ul:variable} labels (``uml1count'' of `c(k)' variables)}"
					}
					else if `"`output'"' == "`umlautval1'" {
						display "{text} {bind:Variables with mutated vowels in {ul:value} labels (``uml2count'' of ``numcount'' numeric variables)}"
					}
					else if `"`output'"' == "`umlauttext'" {
						display "{text} {bind:Variables with mutated vowels in {ul:string} variables (``uml3count'' of `c(k)' variables)}"
					}
					else if `"`output'"' == "`nolabel1'" {
						display "{text} {bind:Variables with unlabeled values (``nolabelcount'' of ``numcount'' numeric variables)}"
					}
					else if `"`output'"' == "`oddvar_or'" {
						display "{text} {bind:Variables fitting at least one criterion of an odd variable distribution (``oddvar_or_count'' of ``numcount'' numeric variables)}"
					}
					else if `"`output'"' == "`oddvar_and'" {
						display "{text} {bind:Variables fitting all criteria of an odd variable distribution (``oddvar_and_count'' of ``numcount'' numeric variables)}"
					}
					else if `"`output'"' == "`crashvar'" & "``crashvar''" != "" {
						display "{error} {bind:{ul:Variables being skipped while checking due to 'too many values' error}}"
					}

				if ``wordn'' <= ``ncol'' & ``hlich1'' > 99 & `"`output'"' != "`crashvar'" {
					display "{text} {hline ``hlich1''}"
				}
				else if ``wordn'' > ``ncol'' & ``hlich2'' > 99  & `"`output'"' != "`crashvar'" {
					display "{text} {hline ``hlich2''}"
				}
				else if  (``hlich1'' <= 99 | ``hlich2'' <= 99) & c(linesize)>99  & `"`output'"' != "`crashvar'"  {
					display "{text} {hline 99}"
				}
				else if c(linesize)<=99 & `"`output'"' != "`crashvar'"  {
					local line = c(linesize)-1
					display "{text} {hline `line'}"
				}

				while ``ctrl'' <= ``wordn2'' & ``hlpcount'' <= ``wordn'' {
					local `col' = 1
					local `hlpcol' = 1
					while ``col'' <= ``ncol'' & ``hlpcount'' <= ``wordn'' {
						local `hlpcount' = ``hlpcount'' + 1
						display "{result}{col ``hlpcol''} {bind: `:word ``hlpcount'' of ``output'''}" _continue
						local `hlpcol' = ``hlpcol'' + ``y2'' + 2
						local `col' = ``col'' + 1
					}
					display _newline _continue
					local `ctrl' = ``ctrl'' + 1
				}
				if `"`correct'"' != "" & `"``hlpcount''"' != "0" & (`"`output'"' != "`vallabel_var'" & `"`output'"' != "`varlabel_var'" & `"`output'"' != "`varname_var'" & `"`output'"' != "`nolabel1'") ///
					& strmatch(`"`output'"',"`oddvar_or'") != 1 & strmatch(`"`output'"',"`oddvar_and'") != 1 & strmatch(`"`output'"',"`crashvar'") != 1  {
					display "{text} {bind:Variables found have been corrected}"
				}
				if `"`correct'"'=="" & `"``hlpcount''"' != "0" & (`"`output'"' != "`vallabel_var'" & `"`output'"' != "`varlabel_var'" & `"`output'"' != "`varname_var'" & `"`output'"' != "`nolabel1'") ///
					& strmatch(`"`output'"',"`oddvar_or'") != 1 & strmatch(`"`output'"',"`oddvar_and'") != 1 & strmatch(`"`output'"',"`crashvar'") != 1  {
					display "{error} {bind:Variables found have {ul:not} been corrected}"
				}
			}

			if  `"`output'"' == "`capvar1'" & `"``output''"' == "" & "`uppercase'" != "" & "``done1''" != "1" {
				display ""
				display "{result} {bind:No variables with upper-case characters in the dataset}"
				local `done1' = 1
			}
			else if  `"`output'"' == "`vallabel_var'" & `"``output''"' == "" & strmatch("`length'","*vallabel*") == 1 & "``done2''" != "1" {
				display ""
				display "{result} {bind:No value labels with more than ``vallabel'' characters in the dataset}"
				local `done2' = 1
			}
			else if  `"`output'"' == "`varlabel_var'" & `"``output''"' == "" & strmatch("`length'","*varlabel*") == 1 & "``done3''" != "1" {
				display ""
				display "{result} {bind:No variable labels with more than ``varlabel'' characters in the dataset}"
				local `done3' = 1
			}
			else if  `"`output'"' == "`varname_var'" & `"``output''"' == "" & strmatch("`length'","*varname*") == 1 & "``done4''" != "1" {
				display ""
				display "{result} {bind:No variable names with more than ``varname'' characters in the dataset}"
				local `done4' = 1
			}
			else if  (`"`output'"' == "`umlautvar1'") & `"``output''"' == "" & "`umlaut'" != "" & "``done51''" != "1" {
				display ""
				display "{result} {bind:No variable labels with mutated vowels in the dataset}"
				local `done51' = 1
			}
			else if  (`"`output'"' == "`umlautval1'") & `"``output''"' == "" & "`umlaut'" != "" & "``done52''" != "1" {
				display ""
				display "{result} {bind:No labels with mutated vowels in the dataset}"
				local `done52' = 1
			}
			else if  (`"`output'"' == "`umlautvarname1'") & `"``output''"' == "" & "`umlaut'" != "" & "``done53''" != "1" {
				display ""
				display "{result} {bind:No variable names with mutated vowels in the dataset}"
				local `done53' = 1
			}
			else if  (`"`output'"' == "`umlauttext'") & `"``output''"' == "" & "`strumlaut'" != "" & "``done54''" != "1" {
				display ""
				display "{result} {bind:No strings with mutated vowels in the dataset}"
				local `done54' = 1
			}
			else if  `"`output'"' == "`nolabel1'" & `"``output''"' == "" & "`nolabel'" != "" & "``done6''" != "1" {
				display ""
				display "{result} {bind:No variables with unlabeled values in the dataset}"
				local `done6' = 1
			}
			else if  (strmatch(`"`output'"',"`oddvar_or'") == 1 | strmatch(`"`output'"',"`oddvar_and'") == 1) & (`"``oddvar_or''"' == "" & `"``oddvar_and''"' == "")  & "`oddvar'" != "" & "``done7''" != "1" {
				display ""
				display "{result} {bind:No variables with an odd distribution in the dataset}"
				local `done7' = 1
			}
		}


		if "`noprint'" != "" {
			if "``check''" != "1" {
				display _newline
				display "{text} {bind:{ul:Summary of variables found in the dataset}}"
				local `check' = 1
			}
			if `"``output''"' != "" | `"`all'"' != "" {
				if `"`output'"' == "`capvar1'" {
					display "{result} {bind:Variables with upper-case characters {text:({result:``capcount''} of `c(k)' variables)}}"_newline
				}
				else if `"`output'"' == "`vallabel_var'" & "``vallabel''" != "" {
					display "{result} {bind:Value labels with more than ``vallabel'' characters {text:({result:``vallabel_count''} of ``numcount'' numeric variables)}}"_newline
				}
				else if `"`output'"' == "`varlabel_var'" & "``varlabel''" != "" {
					display "{result} {bind:Variable labels with more than ``varlabel'' characters {text:({result:``varlabel_count''} of `c(k)' variables)}}"_newline
				}
				else if `"`output'"' == "`varname_var'" & "``varname''" != "" {
					display "{result} {bind:Variable names with more than ``varname'' characters {text:({result:``varname_count''} of `c(k)' variables)}}"_newline
				}
				else if `"`output'"' == "`umlautvarname1'" {
					display "{result} {bind:Variables with mutated vowels in variable names {text:({result:``uml0count''} of `c(k)' variables)}}"_newline
				}
				else if `"`output'"' == "`umlautvar1'" {
					display "{result} {bind:Variables with mutated vowels in variable labels {text:({result:``uml1count''} of `c(k)' variables)}}"_newline
				}
				else if `"`output'"' == "`umlautval1'" {
					display "{result} {bind:Variables with mutated vowels in value labels {text:({result:``uml2count''} of ``numcount'' numeric variables)}}"_newline
				}
				else if `"`output'"' == "`umlauttext'" {
					display "{result} {bind:Variables with mutated vowels in string variables {text:({result:``uml3count''} of `c(k)' variables)}}"_newline
				}
				else if `"`output'"' == "`nolabel1'" {
					display "{result} {bind:Variables with unlabeled values {text:({result:``nolabelcount''} of ``numcount'' numeric variables)}}"_newline
				}
				else if `"`output'"' == "`oddvar_or'" {
					display "{result} {bind:Variables fitting at least one criterion of an odd variable distribution {text:({result:``oddvar_or_count''} of ``numcount'' numeric variables)}}"_newline
				}
				else if `"`output'"' == "`oddvar_and'" {
					display "{result} {bind:Variables fitting all criteria of an odd variable distribution {text:({result:``oddvar_and_count''} of ``numcount'' numeric variables)}}" _newline
				}
				else if `"`output'"' == "`crashvar'" & "``crashvar''" != "" {
					display "{error} {bind:There are variables being skipped while checking due to 'too many values' error}"
				}
			}

			if  `"`output'"' == "`capvar1' " & `"``output''"' == "" & "`uppercase'" != "" & "``done11''" != "1" {
				display "{result} {bind:No variables with upper-case characters in the dataset}"
				local `done11' = 1
			}
			else if  `"`output'"' == "`vallabel_var'" & `"``output''"' == "" & "`length'" != "" & "``done12''" != "1" {
				display ""
				display "{result} {bind:No value labels with more than ``vallabel'' characters in the dataset}"
				local `done12' = 1
			}
			else if  `"`output'"' == "`varlabel_var'" & `"``output''"' == "" & "`length'" != "" & "``done13''" != "1" {
				display ""
				display "{result} {bind:No variable labels with more than ``varlabel'' characters in the dataset}"
				local `done13' = 1
			}
			else if  `"`output'"' == "`varname_var'" & `"``output''"' == "" & "`length'" != "" & "``done14''" != "1" {
				display ""
				display "{result} {bind:No variable names with more than ``varname'' characters in the dataset}"
				local `done14' = 1
			}
			else if  (`"`output'"' == "`umlautvar1'") & `"``output''"' == "" & "`umlaut'" != "" & "``done151''" != "1" {
				display ""
				display "{result} {bind:No variable labels with mutated vowels in the dataset}"
				local `done151' = 1
			}
			else if  (`"`output'"' == "`umlautval1'") & `"``output''"' == "" & "`umlaut'" != "" & "``done152''" != "1" {
				display ""
				display "{result} {bind:No labels with mutated vowels in the dataset}"
				local `done152' = 1
			}
			else if  (`"`output'"' == "`umlautvarname1'") & `"``output''"' == "" & "`umlaut'" != "" & "``done153''" != "1" {
				display ""
				display "{result} {bind:No variable names with mutated vowels in the dataset}"
				local `done153' = 1
			}
			else if  (`"`output'"' == "`umlauttext'") & `"``output''"' == "" & "`strumlaut'" != "" & "``done154''" != "1" {
				display ""
				display "{result} {bind:No strings with mutated vowels in the dataset}"
				local `done154' = 1
			}
			else if  `"`output'"' == "nolabel1" & `"``output''"' == "" & "`nolabel'" != "" & "``done16''" != "1" {
				display "{result} {bind:No variables with unlabeled values in the dataset}"
				local `done16' = 1
			}
			else if  (strmatch(`"`output'"',"`oddvar_or'") == 1 | strmatch(`"`output'"',"`oddvar_and'") == 1) & (`"``oddvar_or''"' == "" & `"``oddvar_or1''"' == "" & `"``oddvar_and''"' == "")  & "`oddvar'" != "" & "``done17''" != "1" {
				display "{result} {bind:No variables with odd distribution in the dataset}"
				local `done17' = 1
			}
		}
	}

	if `"`correct'"' != "" & "`noprint'" != "" & (`"`uppercase'"' != "" | `"`umlaut'"' != "" | `"`all'"' != "") ///
		& ("``capvar1''" != "" | "``vallabel_var''" != "" | "``varlabel_var''" != "" | "``varname_var''" != "" | "``umlautvarname1''" != "" | "``umlautvar1''" != "" | "``umlautval1''" != "" | "``umlauttext''" != "") {
		display "{text} {bind:Variables found have been corrected}"
	}
	if `"`correct'"' == "" & "`noprint'" != "" & (`"`uppercase'"' != "" | `"`umlaut'"' != "" | `"`all'"' != "") ///
		& ("``capvar1''" != "" | "``vallabel_var''" != "" | "``varlabel_var''" != "" | "``varname_var''" != "" | "``umlautvarname1''" != "" | "``umlautvar1''" != "" | "``umlautval1''" != "" | "``umlauttext''" != "") {
		display "{error} {bind:Variables found have {ul:not} been corrected}"
	}

	if  `"`oddvar'"' != "" | `"`all'"' != "" {
		display ""
		display "{text} {bind:{ul:Applied criteria of an odd distribution are:}}"
		if "``crit1''" != "" {
			display "{text} {bind:  (1) Less than ``crit1_out'' percent of values being available in value label have been chosen}"
		}
		if "``crit2''" != "" {
			display "{text} {bind:  (2) More than ``crit2_out'' percent of all observations are assigned to a single value}"
		}
		if "``crit3''" != "" {
			display "{text} {bind:  (3) Equal to or less than ``crit3'' observation(s) are assigned to a single value}"
		}
	}

	*Storing results
	return local capvar "``capvar1''"
	return local length_val "``vallabel_var''"
	return local length_var "``varlabel_var''"
	return local length_name "``varname_var''"
	return local umlaut_name "``umlautvarname1''"
	return local umlaut_var "``umlautvar1''"
	return local umlaut_val "``umlautval1''"
	return local umlaut_str "``umlauttext''"
	return local mis_lab "``nolabel1''"
	return local odd_or "``oddvar_or''"
	return local odd_and "``oddvar_and''"
end