THIS IS NOT SHAREWARE IT IS FOR FREE ! DO NOT PAY 10$ ! 16. November 1994 $VER: MCD V1.40 Written by Martin Weiss and Oliver Kaufmann Released on November 14th, 1994 MCD comes with: MCDScan_000 V1.40 scan utility for MC68000 MCD_000 V1.40 main program for MC68000 MCDScan_020 V1.40 scan utility for MC68020 or higher processors MCD_020 V1.40 main program for MC68020 or higher processors CkFPBits V1.01 check file protection bits utility MCDenv configuration environment variable MCD.doc (this file) MCD.doc.info This program is Copyright 1993, 1994 by Martin Weiss and Oliver Kaufmann. All Rights Reserved. MCD is freely distributable, but the authors retain all rights in regards to the program. Permission is granted to distribute this program for a minimal charge (for copying, handling, etc.). This package may be distributed as is only. Executables must NOT be crunched in any way. Use these programs at your own risk, no warranties will be made. MCD (My Change Directory) is a Shell-command similar to CD with many additional features. It features directory abbreviation, i.e. recognition by initials without specification of complete AmigaDOS paths and provides "directory shuffle". All wildcards are supported. MCD uses a brain file containing the directory structure of your hard disks. Multiple volumes are supported. The brain file is permanently loaded into memory only once when MCD is called for the first time. This brain file is created by the MCDSCAN program that also comes with this package. MCD can be used from the command line only as it is a shell command !? It has been thoroughly tested on Amiga 500 - 4000 under various configurations. Requires AmigaDOS 2.0 or higher. Using MCD ========= I.Quick Start ------------- a. Copy MCD_0x0 to your c: directory (or to any other directory, which is in your path) and rename it to MCD (or maybe CD, if you like) b. Copy MCDScan_0x0 to your c: directory (or to any other directory, which is in your path) and rename it to MCDScan c. Edit MCDenv to suit your desire and/or just copy it to env: and envarc: :> copy MCDenv env: :> copy MCDenv envarc: d. Create the brain file by :> mcdscan -c where is your harddisk (e.g. dh0:, dh1: or fh0:, fh1: ...) This will create a file s:mcd.tree e. Go ahead and have a try! :> mcd e.g. mcd print will probably cd you to :devs/printers e.g. mcd priTN will probably cd you to :devs/printers as well! ^^ II.Program Descriptions ----------------------- 1. Creating the brain file with MCDSCAN --------------------------------------- The syntax for MCDSCAN is MCDSCAN [[-a|-c|-s][file]] directory [directory list] [~excludedirs] -c[file]: create a brain file for one or more directories default file is s:mcd.tree -a[file]: append one or more directories to the brain file default file is s:mcd.tree -s[file]: use a scriptfile containing a directory list default is s:mcd.script directory: directories to be scanned excludedirs: directories not to be scanned (must be preceeded by ~) no options: dump all directories matching the specified directory Examples: Suppose your hard disk is device DH0: volume HARD: containing the following files: Prefs (dir) Env-Archive (dir) sys (dir) wbconfig.prefs Presets (dir) Font Font.info ... Libs (dir) asl.library commodities.library L (dir) aux-handler port-handler queue-handler speak-handler S (dir) Startup-sequence Startup-sequence.HD Devs (dir) Keymaps (dir) Printers (dir) Example (dir) generic clipboard.device MountList system-configuration C (dir) AddBuffers Assign ... ThisIsAVeryLongDirectoryName (dir) ThisIsAnEvenLongerDirectoryName (dir) ContainingAnotherFingerBreaker (dir) and_file_1 and_file_2 emaNyrotceriDsihTdaeRuoYnaC (dir) emaNyrotceriDsihTepyTuoYnaCrO (dir) you_cannot even_remember_it The first thing you have to do is to scan your hard disk drive dh0: by 1> MCDScan -c dh0: which will generate a brain file called MCD.tree in your S: directory. This file stores all of the directory structure on your hard disk in preprocessed form. It is essential not to modify this file. Scanning a Quantum LPS 105MB hard disk with a GVP SCSI II controller takes up to 2 minutes (with 600 directories) and produces a brain file of about 10 kBytes. You can also use subdirectories like 1> MCDScan -c dh0:prefs or 1> MCDScan -c DEVS: To scan several devices or directories simply type 1> MCDScan -c dh0: dh1: Tools: dh2:compiler If you want to add one or more volumes to the brain file type 1> MCDScan -a dh4: dh5: In this version it is not possible to remove or update a volume in an existing brain file. This means you have to rescan ALL of your drives if the directory structure in your brain file is out of date. (See below for a tricky workaround.) Anyway, you can join brain files for different volumes using the Amiga-DOS command JOIN to give one brain file. If you have a lot of volumes to be scanned each time it would be quite annoying to specify all of them in the command line. For more ease and comfort the '-s' switch has been implemented. The only thing you have to do is to create a file called MCD.SCRIPT containing all volume names to be scanned in plain ASCII (no blank lines) and place it in your s: directory. For example s:mcd.script could look like this dh0: dh1: dh2: fh0: fh1: fh2: ~dh0:temp ~fh0:tmp ~fh1:private Then 1> MCDScan -s would do the job. (= MCDScan -c ) Remember: ~ means that this directory and all dirs in its subtree will not be scanned (added to the directory structure database), so you won't be able to MCD to those. Since Version 1.03 you can also say something like 1> MCDScan [-a[outfile]] -s[scriptfile] 1> MCDScan [-c[outfile]] -s[scriptfile] 1> MCDScan pattern [pattern list] examples: 1> MCDScan -a -sram:temp.script 1> MCDScan -cs:mcd.tree_test -sram:temp.script 1> MCDScan -s -a 1> MCDScan -s -c ~temp 1> MCDScan tools de* ?dri* If you don't specify the -c or -a switch in scriptmode, MCDScan assumes -c, i.e. create a new s:mcd.tree file and use the scriptfile given. -s simply tries to use s:mcd.script if available. If you've got a lot of volumes which usually don't change (e.g. boot partitions), but still some which do change (work partitions), then it would be a good idea to store them in different treefiles. That means, create one treefile, let's say s:mcd.tree_boot, with e.g. 1. > MCDScan -cs:mcd.tree_boot boot: for your boot partition. Then create another treefile, let's say s:mcd.tree_work, with e.g. 2. > MCDScan -cs:mcd.tree_work work: for your work partition Now join both treefiles to one by 3. >join s:mcd.tree_boot s:mcd.tree_work TO s:mcd.tree After that you can use the new treefile as usually. If your work partition changes then you just have to repeat steps 2 and 3. That's it! Step 2 replaces the obsolete s:mcd.tree_work treefile and step 3 creates the new brainfile to be used. Keep in mind that MCD by default uses s:mcd.tree as its brainfile. So when creating treefiles with other names (e.g. -c) you will have to rename or join them to a file called s:mcd.tree in order to take effect. If you want MCD to use a file other than s:mcd.tree then you can specify a line TREEFILE in your MCDenv environment variable. Remember that MCDScan does not take care of MCDenv! Workaround ---------- This is my implementation: - I have got a directory s:mcdtrees, where I store all my scanned directories and volumes (dh0: dh1: pclinuxnfs: Amigaserv: ...) as separate files. e.g. mcdtree.dh0 mcdtree.dh1 mcdtree.pcl ... - This is how I create them ^ ^ ^ mcdscan -cs:mcdtrees/mcdtree.dh0 dh0: mcdscan -cs:mcdtrees/mcdtree.dh1 dh1: (*) mcdscan -cs:mcdtrees/mcdtree.pcl pclinuxnfs: ... - I've included these 5 lines into my user-startup ckfpbits >nil: s:mcdtrees/mcdtree.#? a if NOT warn join >nil: s:mcdtrees/mcdtree.#? TO s:mcd.tree protect s:mcdtrees/mcdtree.#? a add endif - If I want to rescan a special volume (or add a new one), I've got to issue one of the commands from (*) e.g. mcdscan -cs:mcdtrees/mcdtree.dh0 dh0: (or something similar) With my next reboot all files in s:mcdtrees will be joined to s:mcd.tree and their protection flags will be set to a (archive). (With further reboots no more files will be joined until at least one is modified or a new one is added to the s:mcdtrees directory. Without options to mcdscan you can see a list of all directories matching a certain pattern in alphabetic order. All wildcards are supported as explained below. MCDScan #? lists all directories in the brain file. Limitations of MCDScan -s: - The number of directories (devices, volumes etc.) in a scriptfile must not exceed 253 (probably no limitation, who's got 253 volumes?). The number of excludedirs in a scriptfile must not exceed 253. Nevertheless the mcd.tree file is NOT limited in any respect. So you can join multiple treefiles to one containing as many directory structures as you like. 2. Using MCD ------------ usage: mcd Now you can use MCD almost as a substitute for the CD command: 1> MCD dh0:c will work exactly as 1> CD dh0:c Note: MCD first of all tries to change directory directly to the specified pattern. On success there will not be any additional scaning of the database and MCD will return. This is to provide the highest compatibility with the original CD command. If this first attempt is not successful MCD will unfold its true power and use the supplied database to find a matching directory to change to. If you've got more volumes scanned MCD will at first try to find a match on the current volume, then on the others. This is not true if you are in shuffling mode (see below). But you can now do a lot of things more: you can use abbreviations and wildcards on any directory. MCD will look up a matching directory and change the current directory to this directory. Just look at the following examples: MCD CD ------ ------ 1> MCD sys CD hard:prefs/env-archive/sys 2> MCD print CD hard:devs/printers 3> MCD This/This CD hard:ThisIsAVeryLongDirectoryName/ ThisIsAnEvenLongerDirectoryName 4> MCD #?archive CD hard:prefs/env-archive 5> MCD //k CD hard:devs/keymaps This means: MCD looks up a directory having at least two parents. Note that the root directory is treated like an ordinary directory even if it is separated by a colon. 6> MCD :/k CD hard:devs/keymaps This takes you to a directory exactly one level below the root directory. 7> MCD devs:ke CD hard:devs/keymaps You can also use logical volumes assigned to directories on hard disks in your brain file. All logical volumes are resolved to their full physical path: DEVS: is expanded to HARD:devs (or wherever you have it assigned to). WARNING: You should NOT use logical directories when scanning your hard disks. These names are expanded to their physical names but still treated as one unit. For example: 1> MCDScan devs: 2> MCD :/e CD hard:devs/printers/example But nevertheless: this enables you to use names assigned after scanning in your patterns (as these are expanded to physical names anyway). Remeber: no wildcards like #? (or *, if you are using WildStar) are required at the end of a pattern, that doesn´t already contain wildcards. If the given pattern does already contain userspecified wildcards, #? will NOT automatically be added to the end of the pattern. That is to prevent misinterpretation of what the pattern really means. For example mcd ? should look up all directory names consisting of only ONE single character, as it was supposed to. It would be fatal to add #? at the end, as it would result in mcd ?#?, which is almost the same as mcd #? what really wasn't meant! Note: You may even use wildcards on volume names. That means that you can issue somthing like 1>MCD h*:/*s/??amp* to change to hard:devs/printers/example. In this case MCD wil NOT try to cd directly to the specified pattern, as this would result in a system request: please insert volume h*: in any drive. MCD will instead look up a match immediately. Resolving multiple matches Usually there are several directories on your hard disk with the same or almost the same name. MCD provides "directory shuffle": In the above example 1> MCD ThisIs is ambiguous. In this case MCD chooses the lexicographically smaller match resulting in 1> CD dh0:ThisIsAVeryLongDirectoryName/ThisIsAnEvenLongerDirectoryName From the shell prompt you can see which directory was chosen. If you actually wanted to CD to a different directory you can simply repeat the last command: 1> MCD ThisIs This now results in the next match 1> CD dh0:ThisIsAVeryLongDirectoryName You can shuffle through all matching directories until you are back at the first match. Try 1> MCD #? This steps through all of your directories in alphabetic order! Note: Since V 1.40 you can independently shuffle in different shells with different patterns. There are special options, which can be enabled by keywords in the env variable mcdenv. For details see the section about Environment Variables. Here are some examples of special commands: mcd devs: = change to devs: mcd = tell current directory and let it become the home dir mcd ram: = change to ram: mcd ! = change back to last dir (devs:) mcd ! = change back to last dir (ram:) mcd ~ = change to home dir (devs:) mcd ! = change back to last dir (ram:) mcd ~/dosd = change to homedir/dosdrivers mcd !/t = change to lastdir/t ... To find out about MCD just play around with it and see what happens. Environment Variables --------------------- MCD uses an environment variable for its configuration. It is called MCDenv and consists of plain ASCII. Each line may hold only one keyword at the very beginning of each line as described below: warnings : to turn on the printing of warnings (verbose mode) quickcd : to do 'quick' cds instead of 'slow' ones staylocal : force MCD not to cd to volumes other than the current one dynamic : MCD will try to read :mcdtree from the current volume and use it as its brainfile. treefile : have MCD use instead of any default. dotdot : turn on handling of .. ../ and ./ lastdir : enable storing of most recently used dir, mcd ! jumps back homedir : enable home dir feature, mcd stores current dir as home mcd ~ takes you back there, also mcd ~/path works. If MCDenv contains the string 'warnings', then mcd will print warnings about non existing directories, reminding to rescan disks (verbose mode). If it contains the string 'quickcd', mcd will not behave exactly like AmigaDos CD. This only affects patterns containing wildcards. In detail it will ONLY ONCE try to cd direktly (locally) to a specified pattern. If a pattern contains wildcards, mcd (since V1_06) at first would usually do a series of MatchNext()s like AmigaDos to find a matching directory locally. As a matter of fact this would take some time (listen to your hard disk). Furthermore you probably never wanted to cd locally, but just did so right now. To prevent such waste of time and unwanted local cds, you can specify the keyword 'quickcd'. Then mcd will only once (concession) try to cd locally. If it does not find a matching directory in the first attempt, it will immediately look up a matching directory in its database, as supposed. Time evaluation: Try this: cd c:* .....wait.....wait....ok, I understand! Try this: mcd c:* without 'quickcd' set ....wait....wait....ok I see! Try this: mcd c:* with 'quickcd' set ...ah! Nevertheless most mcd #? will probably work with or without 'quickcd' set. Depends, if and what files/dirs match the pattern locally. (Especially mcd ram:req* will hopefully work!) If MCDenv contains the string 'staylocal', then mcd will not cd to volumes other than the current one, even if there are numerous others stored in the brainfile. This might be usefull, if you've got many volumes scaned and you don't want to jump through all of them only to find one directory on the volume you are currently on. If MCDenv contains the string 'dynamic', then every time you invoke mcd, it will inquire if there is a file called :mcdtree on the current volume. If it is and it hasn't bee loaded before, the file will be read in as the new brainfile. That means every volume can have its own brainfile. The brainfile will be kept in memory until you cd to a different volume and issue mcd there, which will discard the old one and read in the new one. Remember that for mcd the default dynamic brainfile is :mcdtree. Without dynamic (normal) the default brainfile is s:mcd.tree ! If MCDenv contains the string 'treefile ', mcd will use that as its new default brainfile (both for dynamic and normal mode !) To set the env-variable, type :> setenv mcdenv warnings or :> setenv mcdenv quickcd If MCDenv contains the string 'dotdot', mcd will try to handle .. ../ and ./ like DOS/UNIX does. Mcd ../path should work as well. If MCDenv contains the string 'lastdir', mcd stores the most recently used current directory in the environment variable mcdlast. Mcd ! will take you back there. Type mcd ! again to toggle between two directories. If MCDenv contains the string 'homedir', mcd issued with no arguments will store the current directory as the home directory in the environment variable mcdhome. Mcd ~ takes you back to your home directory. Mcd ~/path should work as well. If you want to add more than one keyword to the env-variable, you have got to use your favourite text editor (e.g. ed, emacs, vi, edward or ced). Put each keyword in its own line, save the file to env:mcdenv. I've included my mcdenv file for your convenience. Just edit it and copy it to envarc:. You can comment out any keyword by putting a '#' infront of it (actually any character). To permanently use your configuration copy env:mcdenv to envarc: :> copy env:mcdenv to envarc: The MCDenv environment variable does not affect MCDScan at all! 3. Updating the brain file -------------------------- Actually there is no way for updating the brain file (yet), so whenever new directories are created those are not automatically appended to the brain file. Therefore you should re-scan your hard disk (as described above) in regular intervals to keep the brain file up to date. Changes to the brain file will take effect immediately after scanning. 4. Not yet implemented ---------------------- - intuition interface for MCDScan - automatic updating for the brain file - pure MCD to be held resident - assembler version for more speed - merge both MCD and MCDScan into one programm MCD 5. Inspiration -------------- This program was inspired by NCD from Norton Utilities on MS-DOS and Uffe Holst Christiansen, whose UCD on fish disk 785 did not quite meet our expectations. MCD is superior in many ways: - it's faster both scanning the disk and changing directories - the brain file is shorter (less than 50 %) - the brain file is loaded only once for very fast access - properly sets the path prompt (UCD does not) - fully supports wildcards (UCD does not, neither does NCD) - directory shuffle (UCD does not) 6. CkFPBits Description ----------------------- usage: CkFPBits filepattern [ProtectionBits (sparwed)] [-p] CkFPBits takes a file or filepattern and a set of protection bits as its arguments. It returns a returncode of 0 (OK) or 5 (WARN) depending on the given ProtectionBits and the corresponding Bits of the matching file(s). In detail CkFPBits returns 5 (WARN), if ALL matched files DO HAVE the given ProtectionBits SET. Otherwise it returns 0 (OK), i.e. if at least one of the given ProtectionBits of at least one matched file is NOT SET. If the -p switch is given, detailed file information is printed. 7. Miscellaneous ---------------- MCD was written using the MANX Aztec C Compiler V5.2 on an Amiga 4000 and an Amiga 2000 with GVP G-Force040/33. If you have also problems with Aztec C on 68040 machines: force the compiler NOT to automatically start the assembler using the -a option and launch the assembler separately. The brain file is kept in memory as a resource called mcd.resource. We do not see a moral obligation to pay a shareware fee for this kind of program. Keep your money - get a grip on yourself and write some useful little programs for the Amiga community. If you have any questions or comments regarding this program, please feel free to get in touch with us at the following addresses: Oliver Kaufmann Eserwallstrasse 8 86159 Augsburg Germany e-mail: kaufmano@informatik.tu-muenchen.de Martin Weiss Eichendorffstrasse 4 86368 Gersthofen Germany e-mail: weissmar@rzsun2.rz.uni-augsburg.de DISCLAIMER: Use this program at your own risk. Feedback, Suggestions and Proposals: ------------------------------------ These are the people, who had the guts to contribute their ideas to mcd - Tero Turtiainen: directory exclusion (in) (Mon, 20 Sep 1993 11:38:32) - Peter Bernhard quiet/verbose mode (in) - Richard Hartmann slow/quick cd (in) THANKS to - Jay Miner for the Amiga - Ralph Babel for his Guru-Book - Lyman Epp for QMouse - Kai Iske for KCommodity - Thomas Krehbiel for vt - MANX for the C compiler (even if it does not work properly on 68040) - Nic Wilson for his 25th anniversary of SysInfo - Peter Norton for the idea and Uffe Holst Christiansen for his first attempt - Olaf Barthel and all the others for their freeware concept - all those GNU contributors and linux makers - all the others I haven't mentioned yet NO THANKS to - Commodore for secretiveness, arrogance and nonexisting support quote in German: "...Der A4000 ist die Wucht in Tüten...", which is definitely not true! R.I.P. - Data Becker for hundreds of errors in their books Amiga Intern: ... P725, P750, P769, P785, P1018, P1019 ... - all those who disable their software with annoying requesters and call it shareware, accept this program as payment KNOWN BUGS: - :/// does not work correctly LEGEND: - brainfile = treefile : file that stores the directory structure created with mcdscan (default s:mcd.tree) - mcdenv : environment variable used to configure mcd - mcd : main program, changes directory - mcdscan : needed to create the necessary brainfile - [