Trailing-Edge
-
PDP-10 Archives
-
tops20tools_v6_9-jan-86_dumper
-
tools/com/chdir.com
There are 3 other files named chdir.com in the archive. Click here to see a list.
$ v := 'F$VERIFY(0)
$!\\
$!\\ CHDIR - change current directory
$!\\
$!\\ There are several forms, most of which are not like UNIX.
$!\\
$!\\ SYNTAX SEMANTICS
$!\\ ------ ---------
$!\\
$!\\ CHDIR => "default". Go home, where home is defined
$!\\ by two global symbols presumably from your
$!\\ LOGIN.COM file. The usual case is:
$!\\ $ CHDIR$DISK :== "DBB1:"
$!\\ $ CHDIR$HOME :== "PAMMETT"
$!\\ CHDIR with no parameters, then, gets you
$!\\ the directory "dbb1:[pammett]".
$!\\
$!\\ CHDIR .. => "up". go to the directory immediately
$!\\ above the current one. However, if you
$!\\ are already at [PAMMETT], for example,
$!\\ you don't go anywhere, without warning.
$!\\ If a second parameter is given, it is
$!\\ ignored without warning.
$!\\
$!\\ CHDIR name => "sub directory". This is the usual case.
$!\\ If you are already at the 'top' of your
$!\\ directory string, (e.g. DB:[USER]), then
$!\\ "CHDIR sub" gets you to DB:[USER.sub].
$!\\ If you are in DB:[USER.sub], for example,
$!\\ "CHDIR new" gets you to DB:[USER.new], i.e.
$!\\ you remain at the current directory depth.
$!\\
$!\\ CHDIR .name => "down directory". If the given directory
$!\\ name starts with ".", then the new string
$!\\ is the current one suffixed by ".name".
$!\\ This is the usual way of "going down" one
$!\\ or more directory levels.
$!\\
$!\\ CHDIR string: => "escape". The given parameter is assumed
$!\\ [string] to be the complete and correct directory
$!\\ <string> specification if it contains a colon,
$!\\ xxx,xxx comma, left-angle, or left-square char.
$!\\ This makes CHDIR just like SET DEFAULT.
$!\\ If a second parameter is given, it is
$!\\ ignored without warning.
$!\\
$!\\ CHDIR .T => "top". Go to the 'top' level directory
$!\\ CHDIR .T sub of where you currently are. If a second
$!\\ parameter is given, it is equivalent to
$!\\ "CHDIR .T" followed by "CHDIR sub".
$!\\
$!\\ CHDIR .M => "my". This version first gets you HOME
$!\\ CHDIR .M xxx (CHDIR with no arg), and then gets you
$!\\ to the sub-directory XXX. With no XXX
$!\\ this version is identical to CHDIR with
$!\\ no parameter.
$!\\
$!\\ CHDIR .S => "save". The current directory name
$!\\ is 'remembered' in the global symbol
$!\\ called CHDIR$SAVE. See "CHDIR .R".
$!\\ This only works when you .S and then .R
$!\\ within the current log-in session.
$!\\ CHDIR$TELL => whether or not a message is
$!\\ produced to record what .R or .S does.
$!\\ No 2nd or subsequent parameter is allowed.
$!\\
$!\\ CHDIR .R => "restore" or "return". A SET DEFAULT
$!\\ to the last-stored directory name is done.
$!\\ CHDIR$TELL => whether or not a message is
$!\\ produced to record what .R or .S does.
$!\\ No 2nd or subsequent parameter is allowed.
$!\\
$!\\ For most versions of CHDIR, if a third (or subsequent) parameter is
$!\\ given, it is ignored without warning. Also, like SET DEFAULT, only
$!\\ limited syntax and existence checks are made on the final directory
$!\\ specification.
$!\\
$
$! This command file turns off VERIFY, but then puts it back to
$! what the user had it set to.
$!
$! Pick up the given parameter and see if it is null.
$
$ file := 'P1
$
$ ! A parameterless call => my 'home' directory.
$
$ if file.EQS."" then goto home
$ !
$ ! Check for the special case, "..", which is stolen from the UNIX
$ ! notion of "going up" to the directory above the current one.
$
$ if file.EQS.".." then goto upone
$
$ ! Then check for a .S, .M, .T, or .R case; they are simple.
$
$ if file.EQS.".S" then goto save
$ if file.EQS.".R" then goto restore
$ if file.EQS.".M" then goto mysubdir
$ if file.EQS.".T" then goto dotop
$
$ ! If there is a '<', ':', ',' or '[', then the parameter is
$ ! the entire target directory so we take it "as is".
$
$ IF 'F$LOCATE("[",file).NE.'F$LENGTH(FILE) THEN GOTO asis
$ IF 'F$LOCATE(",",file).NE.'F$LENGTH(FILE) THEN GOTO asis
$ IF 'F$LOCATE(":",file).NE.'F$LENGTH(FILE) THEN GOTO asis
$ IF 'F$LOCATE("<",file).EQ.'F$LENGTH(FILE) THEN GOTO subname
$
$ asis:
$
$ ! Believe that the given parameter is the entire and proper
$ ! directory specification and simply set the current directory
$ ! to it as given.
$
$ set default 'file
$ goto done
$
$ save:
$
$ ! Make sure that only the .S parameter is given.
$
$ optn := "S"
$ if P2.nes."" then goto how_r_s
$
$ ! This code saves away the current directory name so that
$ ! a later "CHDIR .R" (restore) command can be implemented.
$ ! We save away the whole directory name, including the disk.
$
$ chdir$save :== 'f$logical("SYS$DISK")''F$directory()'
$ out := "CHDIR: saved current directory name"
$ if chdir$tell then write sys$output "''out' ''chdir$save'"
$ goto done
$
$ restore:
$
$ ! Make sure that only the .R parameter is given.
$
$ optn := "R"
$ if P2.nes."" then goto how_r_s
$
$ ! This code simply gets you back to a place previously
$ ! 'saved' by a "CHDIR .S" command.
$
$ set default 'chdir$save
$ out := "CHDIR: restored current directory to"
$ if chdir$tell then write sys$output "''out' ''chdir$save'"
$ goto done
$
$ how_r_s:
$ write sys$output "Usage: CHDIR .''optn'"
$ goto done
$
$ mysubdir:
$
$ ! This code gets one to "my" directory where MY is defined on a
$ ! per user basis via two global symbols. See also CHDIR with no
$ ! parameter, or the code labeled by "home:", below.
$
$ if P2.nes."" then P2 := .'P2
$ top := 'chdir$disk'['chdir$home''P2']
$ set def 'top
$ goto done
$
$ dotop:
$
$ ! The 'top' case is that we assume the given parameter
$ ! is a sub directory of the top current directory. There are
$ ! two cases which we handle:
$ !
$ ! 1) we are already in a sub directory
$ ! e.g. PWD
$ ! [top.middle.subname]
$ ! CHDIR .T new
$ ! PWD
$ ! [top.new]
$ ! i.e. you go up to 1 below the top level.
$ !
$ ! 2) we are in a top-level directory
$ ! e.g. PWD
$ ! [top]
$ ! CHDIR .T new
$ ! PWD
$ ! [top.new]
$ ! i.e. you go down 1 level from the top.
$ !
$ ! Handle these two cases by first picking up the current directory
$ ! name. Then see if a period can be found somewhere in the string.
$
$ d := 'F$DIRECTORY() ""
$ IF 'F$LOCATE(".",d).EQ.'F$LENGTH(d) THEN GOTO nosub
$
$ ! There IS a sub directory. The 'top' portion of what we set
$ ! the new default to is the current directory string minus the
$ ! sub directory.
$
$ pos := 'F$LOCATE(".",d)
$
$ setdef:
$
$ pos = pos-1
$ top := 'F$EXTRACT(1,pos,d)
$
$ ! When there is no 2nd parameter for ".T", the user simply wants
$ ! to go to the 'top' of his directory structure. Otherwise
$ ! he wants to go to ['top'.sub]
$
$ file := 'top'
$ if P2.nes."" then file := 'top'.'P2'
$ set default ['file']
$ goto done
$
$ nosub:
$
$ ! There is no sub directory so the one specified is assumed to
$ ! be immediately subordinate to the current one. The current
$ ! directory, as a symbol name, may be enclosed in '<...>' or '[...]'.
$ ! Pick up the name of the 'top' directory, without the enclosing
$ ! angle or square brackets.
$
$ IF 'F$LOCATE("[",d).NE.'F$LENGTH(d) THEN pos := 'F$LOCATE("]",d)
$ IF 'F$LOCATE("<",d).NE.'F$LENGTH(d) THEN pos := 'F$LOCATE(">",d)
$ goto setdef
$
$ subname:
$
$ ! There are two cases here: "CHDIR name" and "CHDIR .name".
$ ! The former is handled by common code with "..", below.
$
$ if 'f$locate(".",P1).ne.0 then goto upone
$
$ ! To implement "CHDIR .name", we simply remove the "." from the
$ ! parameter and go do what "CHDIR name" would do if there were
$ ! no sub directory in the current one.
$
$ d := 'f$directory()
$ P2 := 'f$extract(1,200,P1)
$ goto nosub
$
$ upone:
$
$ ! At this point we are implementing "CHDIR ..", or "CHDIR name".
$ ! Both of these require first picking up the current directory
$ ! name and then finding the last "." in the string.
$
$ d := 'F$directory() ""
$ IF 'F$locate(".",d).eq.'f$length(d) then goto attop
$ pos = 'f$locate(".",d)
$
$ ! There is atleast one "." in the current directory name,
$ ! and 'pos' is the character position of the dot after it.
$ ! To get to the last dot in the string we have to loop,
$ ! extracting the rest of the string, locating another dot,
$ ! and updating POS (which still referrs to the original
$ ! string) by the character position in the REST string, each
$ ! time another dot is located.
$
$ nextdir:
$
$ newp = pos +1
$ rest := 'f$extract(newp,200,d)
$ IF 'f$locate(".",rest).eq.'f$length(rest) then goto nomore
$ p = 'f$locate(".",rest)
$ pos = pos + p +1
$ goto nextdir
$
$ attop:
$
$ ! At this point we are done if it was "CHDIR ..". On the other
$ ! hand, we implement "CHDIR name" in a standard way since there
$ ! are no sub directories.
$
$ if file.eqs.".." then goto done
$ P2 := 'P1
$ goto nosub
$
$ nomore:
$
$ ! Back over the last ".", and extract the entire UPPER portion of
$ ! the initial directory name. For the ".." case, this becomes the
$ ! new current directory and we're done. For the "CHDIR name" case
$ ! we tack on "name" before doing the same thing.
$
$ pos = pos -1
$ upper := 'f$extract(1,pos,d)
$ if P1.nes.".." then upper := 'upper'.'P1'
$ set def ['upper']
$ goto done
$
$ home:
$
$ ! CHDIR with no parameters means that we go to a directory defined
$ ! by symbols from your LOGIN.COM file via, for example:
$ !
$ ! $ chdir$disk :== "dbb1:"
$ ! $ chdir$home :== "pammett"
$
$ set def 'CHDIR$DISK'['chdir$HOME']
$
$ done:
$
$ ! Final clean up. For now, we only have to put the user-defined
$ ! value for VERIFY back to what it was.
$
$ show def
$ if v then set verify