You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
3.3 KiB
Plaintext
107 lines
3.3 KiB
Plaintext
*! usesasdel Version 2.0 dan.blanchette@duke.edu 16Mar2009
|
|
*! Center of Entrepreneurship and Innovation Duke University's Fuqua School of Business
|
|
** shortdir Version 2.0 dan_blanchette@unc.edu 17Jan2008
|
|
** research computing, unc-ch
|
|
* - added check that if forward slashes used as dir separators
|
|
* then that is handled by converting them to back slashes
|
|
* - uses Nick Cox's way of loading a text file line by line
|
|
* into a local macro instead of reading it in as a dataset
|
|
** shortdir Version 1.1 dan_blanchette@unc.edu 28Oct2004
|
|
* - added test that directory actually exists
|
|
** shortdir Version 1.0 dan_blanchette@unc.edu 09Oct2003
|
|
** the carolina population center, unc-ch
|
|
|
|
program define shortdir, rclass
|
|
version 8
|
|
syntax using/ [, SHort ]
|
|
|
|
confirmdir "`using'"
|
|
if _rc !=0 {
|
|
di `"{error}The directory "`using'" does not exist."'
|
|
exit _rc
|
|
}
|
|
|
|
if "`c(os)'"=="Windows" {
|
|
preserve
|
|
local cwd "`c(pwd)'`macval(\\\)'"
|
|
if "`using'"=="." {
|
|
local using "`macval(cwd)'"
|
|
}
|
|
if "`using'"=="`cwd'" {
|
|
quietly cd ..
|
|
}
|
|
// check if forward slashes used and replace them if so
|
|
local subtest : subinstr local using `"/"' `""' , count(local cnt)
|
|
if `cnt' != 0 {
|
|
local using : subinstr local using "/" "\" , all
|
|
}
|
|
tokenize "`using'" , parse("\")
|
|
local i=1
|
|
while "``i''" !="" {
|
|
if `i'==1 {
|
|
local path "`1'"
|
|
}
|
|
else {
|
|
if "`short'"=="short" { /* create macro that conditionally checks
|
|
* for longer than 8 letter directory names */
|
|
local gt8=(length("``i''")>8)
|
|
local gt8="| `gt8'"
|
|
}
|
|
if index("``i''"," ") `gt8' { /* if sub dir name has space in name or maybe longer than 8 */
|
|
tempfile temp
|
|
_getfilename "`temp'"
|
|
local tfilen "`r(filename)'"
|
|
|
|
local tfileh=substr("`tfilen'",1,index("`tfilen'",".")-1) /* create file handle */
|
|
quietly {
|
|
cd "`path'\"
|
|
// options /x and /a create a short directory listing
|
|
// so `temp' is a very small, short file
|
|
! dir /x /a "``i''"* > "`temp'"
|
|
tempname in
|
|
file open `in' using `"`temp'"', r
|
|
file read `in' line
|
|
local dline ""
|
|
local dir "<DIR>"
|
|
while r(eof) == 0 {
|
|
// local line: subinstr local line "`old'" "`new'"
|
|
file read `in' line
|
|
if `: list local(dir) in local(line) ' {
|
|
local dline `"`line'"'
|
|
}
|
|
}
|
|
local gotit = 0
|
|
local shortname ""
|
|
local n = 1
|
|
while `gotit' == 0 {
|
|
local shortname : word `n' of `dline'
|
|
if `: list local(shortname) == local(dir) ' {
|
|
// the shortname of the subdir is the next word after "<DIR>"
|
|
local shortname : word `= `n' + 1' of `dline'
|
|
local gotit = 1
|
|
}
|
|
local n = `n' + 1
|
|
}
|
|
}
|
|
local sdir`i'=trim(substr(`"`shortname'"',1,10))
|
|
} /* end of if directory has a space */
|
|
else {
|
|
local sdir`i' "``i''"
|
|
}
|
|
if "``i''"!="\" {
|
|
local path "`macval(path)'\\`sdir`i''"
|
|
}
|
|
} /* if not the beginning of the path, like c: */
|
|
local i=`i'+1
|
|
} /* end of while loop */
|
|
quietly cd "`macval(cwd)'\\\"
|
|
local shortdir="`path'"+"\"
|
|
return local shortdir `shortdir'
|
|
} /* end of if windows */
|
|
else {
|
|
di "{error}shortdir only works in Windoze."
|
|
exit
|
|
}
|
|
|
|
end
|