This is the revision history of Dr by Paul Kienitz: DIFFERENCES BETWEEN preliminary 1.5b AND RELEASE 1.5a: Woops -- fixed bug in fastscan.library that made it fail to follow hash chains from links, so that every once in a while something just wouldn't show in a directory with links in it. Commands executed by -{...} are now fed to System() instead of Execute() under 2.0 -- any nonzero return exits Dr. Fail level option needed. System is to use the UserShell instead of the default shell. Got rid of a lingering cosmetic bug wherein passing it "filename/#?" would cause an extra error message. 1.5a really should have gotten this. When writing out N filenames in more than N columns, it no longer scrunches the names extra close together in order to allow for one more column which isn't used anyway. DIFFERENCES BETWEEN RELEASE 1.5a AND RELEASE 1.5: This is strictly a bugfix; there are no new features. The bugs fixed relate to cases in which the item given in the command line is a file and not a directory. With various combinations of -O, -X, and -{}, it would do things like report totals when none were asked for, or execute malformed commands where it should have taken no action. Custom formatting would produce incorrect results for \p if -X was used or the arg being shown was a file. I had to do something cheap: in these cases \p simply puts out just what you typed, without even a change in capitalization. Except that for root directories, it writes the volume name. Converting what you typed into an absolute pathname is for another release. \d attempts to remove the "tail" to print the parent directory name, but can't do so in all cases, such as if you give a path ending in slashes indicating parent dir(s). Used my "purify.a" startup module to make it reentrant, instead of the brute force method of keeping everything on the stack. This made it a bit simpler and 400 bytes smaller. This is NOT the defective purify.a I released before; it's release 2. DIFFERENCES BETWEEN RELEASE 1.5 AND RELEASE 1.3: Threw in -M option at the last minute before beta release. Made it so that you use "" instead of *" to put a quote inside a quoted string, to make it easier to use * as a wildcard. Made * in patterns synonymous with #? under 1.3 -- under 2.0 this behavior is determined by the dos WILDSTAR flag, as for any other program. Patterns are now limited to 128 characters in length. Fixed it so that "?" in quotes actually is taken as a pattern rather than giving a help summary, as it was documented all along. Made total-summary report in parentheses the total number of dirs, files, bytes, and blocks found, when those totals differs from the numbers that fit the pattern and options, e.g. "0 (4) dirs, 3 files, 2893 bytes, 9 (13) blocks." Replaced that stupid line of dashes which many people hated with a layout wherein filenames are indented one space and directory names are not. It's weird at first but I rather like it this way. It no longer uses a different style of header to separate different directories coming from separate command line args than it does to separate different subdirs within a recursive display. It no longer produces a header when -R is used but only one dir gets listed. Name is now written after size/bits/date with -L, not before. When combined with -R and -O, name includes path relative to directory started from. The line giving totals at the end is now always written when either -L or -U is used, even when -[] or -O is used. -O now causes -UR and -LR to report only a final total rather than subtotals; in this case, "--- name ---" headers are given for different command line args but not for subdirs. -[] without -O now includes normal headers for separate dirs and subdirs, and totals if -U is used. Reduced excess spacing between output columns and allowed ten instead of five. Fake option -! turns off the cursor during console output for maximum speed. Formatting codes \b, \t, \s, \k, \e, \i, and \? added to -[ ] and -{ } options. -P can now handle multi-bit masks. (bit requirements are and'ed). -V and -Z options added. Command line parser now correctly handles letters mixed with [] or {} after a single option dash, e.g. -or{command}fp~a. Got rid of Requester() in fastscan since it is now officially unsupported as of dos 2.04; substituted EasyRequest(). ReportError() was unusable; as of 2.04 this function is a piece of shit. Dr used to report excessively high numbers of blocks used by large files; now accurate. Now lets the ram-handler tell it that dirs each occupy two blocks instead of one. Fastscan.library made able to understand hard and soft file links. In -L style output, Dr now tells the pathnames that soft links are linked to. Dr does not enter soft links during recursive scans, but fastscan is prepared if some other program using it does; if it ends up on a different volume, no fastscan optimization will be used on that other volume. If you use -X on an arg that is a soft link, Dr tells the pathname linked to, but the other information (size, datestamp, etc) is not accessible in this case due to the design of the file system. Fastscan.library now checks for 50K of spare memory rather than 20K, before going into high speed hog mode. Formerly acted as if window was one character narrower than it really was. Separate version for dos 2.04 (V37) and newer can now be compiled, but is not included in the distribution because its only advantage is that it's smaller, by about 3K. Both versions behave identically under 2.04; earlier versions of dos 2.0 (V36) are NOT supported -- they are treated like 1.x. I found that with HD's, often reading whole tracks is not optimal; dividing the reading into smaller chunks is faster. So it tries to divide large tracks into even subdivisions of 11-20 sectors. Dr now ignores MaxTransfer if not an even fraction of track size. (( somewhere around here 1.4, which was never released, became 1.5 )) Optimized disk search code now separated into fastscan.library; previously was linked into Dr, making it over 19K in size. Dr works whether library is installed or not. The library offers relatively small speed improvement under dos 2.0 or newer; big improvement on older systems. Fastscan.library now uses fully asynchronous IO at both the dos packet and exec device (track) levels, which squeezes about the last possible drop of speed out of it. Fastscan used to put up incorrect "read/write error" requesters when doing a recursive scan on an A3000 HD due to scsi.device returning an incorrect error code number; it now tolerates wrong error reports. It no longer puts up its own requester after the file system has already put up a "You MUST replace" requester. It no longer asks you to replace a removed disk in the same drive; it says "in any drive". Used Requester() to mimic the new V36-style requester for reporting disk read errors. Fixed signed/unsigned confusion that made fastscan divide by zero when MaxTransfer had most significant bit set. This made Dr unusable for many CrossDOS users. Dr 1.3 (but not 1.2?) could fail because it assumed root directories have valid byte-length and protection-bits field values -- they don't. Other small bugfixes of a mostly cosmetic nature. I woulda swore I tested this and it worked, but older versions did not correctly detect when output was redirected to PIPE:. -O now writes results unsorted during the disk scan. This takes the best possible advantage of asynchronous disk IO. -O now overrides -I. -L and -[] now work with -O, making them unsorted. Without -O, -[] now goes by normal sorting, and colorizes iconed names written with \f or \p. Any-depth patterns using double colon added. DIFFERENCES BETWEEN RELEASE 1.3 AND RELEASE 1.2: Sorting of names and elimination of matched .info's greatly sped up. Negated patterns with ~ in front added. -{...} and -[...] formatting options added. ForEvery no longer needed. -A and -B options added. -K option added. FastExamine makes sure there is some EXTRA memory (20K) that it probably won't need, before it goes into high speed ram-hog mode. Tested, but did not use, code to make FastExNext use asynchronous packets instead of ExNext() calls in the cases when it can't use its high speed code. I judge the speed improvement to be too small to justify the extra program size if disk IO and output are not interleaved. See makefile. DIFFERENCES BETWEEN 1.2 AND 1.1: -P option was added. My god! I never noticed that the PatMatch functions I used were not reentrant! I now use a modified patmatch.c instead of the original. ForEvery (and Whichever just for the halibut) bundled with Dr. 1.2 has been redone into ANSI C. It's a bit smaller. By request, the -s option now reports totals like the -l option. The feature wherein recent files would show their dates as "Today" or "Wednesday" instead of the actual date has been removed. To get it back, recompile dr.c with the symbol WEEEEK defined. See makefile. I wrote, but did not use, code to show directory names in boldface or against a black background or both instead of above a line of dashes. See the makefile for how to compile this way. Oops, the -- Name -- thing between different command line args' output was not eliminated by -o as documented, in older versions. DIFFERENCES BETWEEN 1.1 AND 1.0: 1.0 gurued on many device drivers which did not support ETD_READ. 1.1 uses CMD_READ when ETD_READ fails, and the dumb mistake which caused a guru when it tried to report the error was fixed. IF YOU SEE A COPY OF DR 1.0 ERASE IT, IT'S NO GOOD! (This bug never showed up on the hardware I had back then.) 1.1 pays attention to the MaxTransfer mount parameter, and if it is an integral fraction of the track size it pretends that this fraction is a "track", otherwise (gotta fix this someday) falls through to ExNext. 1.0 did not check for adequate stack. 1.1 makes sure there is enough stack each time it descends another level with the -r option. 1.0 had a small bug in reporting .info files with the -o option.