TDI Modula-2 Directory Utility v1.5 - By Greg Browne (reached through New Horizons BBS-PC at 505-437-9117 after 7:00 p.m. MST) ( or Las Cruces RCP/M at 505-524-8372 any time ) Why write another Directory Utility with all the available 'c' code versions? Have you ever tried to read your M2: directory with them? They only allow 100 files in a directory. I have over 230 in my M2: directory, and they just pretend the ones over 100 aren't there. So...this allows 300 as written. It can be expanded or shrunk easily by recompiling DuDir.def/.mod with a different MaxMax. This is my first larger project in Modula-2. I am sure there are many things I could have done more sleekly and professionally. If someone hacks this up and makes it better, all I ask is that they put their efforts up on some boards for others to study. THERE IS VERY LITTLE STUDY MATERIAL FOR MODULA-2 ON THE AMIGA. It could be remedied if everyone shared their discoveries. ALL I ASK IS THAT YOU LEAVE THIS DOCUMENT (ALTERED THOUGH IT MAY BE) WITH THE PROGRAM, AND THAT YOU PUT ADEQUATE COMMENTS INTO THE SOURCE CODE SO SOMEONE CAN FIGURE OUT WHAT YOU DID. (EVEN IF I DIDN'T) Thanks to Richie Bielack (who doesn't know me) for the gadget ideas and the WBStartup code example, and to all the zillions of 'c' programmers for the general DU structure ideas. Also to Les Caudle at TDI, who was very patient with me on the phone several times. BUG: I seem to have missed something, and I can't find ANYTHING to cause it, but twice (out of hundreds of runs) it has just gone away. NOT guru, just freeze in place. If you find it, tell me where. I know it isn't stack problem, because mostly it runs great even with a 4000 stack. (The big array for filenames is AllocMem'ed). DISCLAIMER: I take no responsibility for damage or lost files if someone is foolish enough to use this on valuable files untested. I am NOT a professional programmer, and am prone to as many mistakes as anyone else. PERSONAL: This program is specifically placed in the public domain. Take FOIBLES this code and use it, delete it, hack it, give it away, copy it or whatever. Just don't try to sell it. (I doubt that it is worth much anyway). Please, please, don't have the gaul to take p.d. software, alter it, and call it 'shareware' just because you add a nice feature to it. (It will probably Guru on the user and cause them to hate you). I dislike seeing 'shareware' on so many programs "just in case" the program proves to be useful. Shareware used to be reserved for significant 'programs' (not utilities), but it is so misused lately that it is no wonder so many people don't honor it. Don't get me wrong, some programs are worth paying for. If someone needs 'incentive' to continue developing programs, then they should go into it for a serious living. Otherwise, do it for the love of it or don't do it. (This will probably make me some kind of villain to some of you, but I'll survive.) (* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *) OPERATION NOTES Please realize that everything in this program is "relative verify". That means you have to press AND RELEASE the left mouse button over a gadget (or name) for it to register with the program. You can sometimes save some grief by moving the pointer off a gadget without releasing the mouse button, and then releasing it in some blank area. ALSO if you are doing some multiple-file item like COPYDEL or ZAPFILE, you may interrupt it by pressing the mouse button on something. It will halt after the current operation is complete. (COPYDEL Includes deleting the source file it is copying as part of the same operation - sorry!) (*-----------------------------------------------------------------------*) The screen has 5 major divisions. 1) The large 'window' is the file display area. It is where files are shown for selected directories. (It is a gadget, by the way) 2) Immediately above this window is a series of device selection gadgets. These are "one-click-direct-select" gadgets. 3) To the right of the window is a slider. This allows scrolling through lists of filenames which are too long to show in a (15 name) window. 4) To the right of the slider are the 'BUTTON GADGETS'. They are the click-select functions. Some are used alone, others in conjunction with the other areas as will be described. 5) Below the 'GADGETS' are the string display areas, marked R,S,D, and M. These are for typed input and messages back to you. DEVICE SELECTION GADGETS: -> df0: df1: df2: dh0: dh1: ram: vd0: Clicking the left mouse button on any of these will cause the selection of this device. It will be read and the files displayed in the filewindow. FILEWINDOW GADGET: Clicking on top of an 'unselected' filename (white on black) causes it to be 'selected' and means it will be included in several multiple-file operations which are described below. Clicking on a 'selected' filename (black on white) will 'unselect' it. Clicking on a directory name (orange on black) will cause it to be 'selected'. A prompt will appear in the message field (M) and give you the option of switching into that directory with a second click on top of it. (Clicking anywhere else will cancel this option). Clicking on a selected (but entry cancelled) directory will 'unselect' it. Note that a click to cancel is not acted on except as a cancel. NOTE That only one directory at a time may be 'selected'. Any and/or all filenames may be 'selected'. SLIDER GADGET: The slider is a convenient way of scrolling through a long list of filenames for review. (This Du handles 300 names as currently written). Clicking below the white portion of the slider (in the background area) will advance a 'page' of names. You can also click-hold on the slider and move it wherever you wish. If the slider is filled and will not move, then all files/directories are displayed. STRING INPUT/OUTPUT GADGETS: -> Marked R S D M The 'R' gadget is the Run gadget. It is primarily to hold arguments to pass to a program being run, as though they were a command line tail. This gadget may occasionally be only part of a command line tail as will be described below. YOU MAY CLICK-AND-ENTER IN THIS GADGET. The 'S' gadget is the Source gadget. It displays the name of the currently displayed directory or device. If you click a device gadget, the name will be placed here. IF YOU CLICK-AND-ENTER into this gadget, the name you enter will be taken as a new device or directory to access. If access to the entered name fails, the program will return to the last accessed directory (or to ram: if that fails). The 'D' gadget is the Destination gadget. It holds the name of the path (or filename in some cases) to be used for certain GADGET functions such as COPY, MOVE, RENAME, ETC. YOU MAY CLICK-AND-ENTER IN THIS GADGET. The 'M' gadget is the Message gadget. It will display messages and other information from time to time. IF YOU CLICK-AND-ENTER IN THIS GADGET, I WON'T BE RESPONSIBLE. It is supposed to be a one-way (to the user) communication channel. (I don't think it hurts, but it will ignore you.) BUTTON GADGETS: (alphabetically - almost) (room for some more - hint hint) ARC This gadget requires the most complicated selections. When selected, the program will try to execute 'arc' with the tail consisting of the R gadget, the D gadget and the filewindow selected files in that order. i.e. R -> a D -> df1:Some.arc files selected in window -> Joe.doc Bill.exe Result executed is -> arc a df1:Some.arc Joe.doc arc a df1:Some.arc Bill.exe (The selections are concatenated in R - D - files order.) (One pass made for each file selected - sorry, no multiple tails) The same result can be achieved faster by this (one 'arc' load): R -> a df1:Some.arc Joe.doc Bill.exe D -> [empty] files selected in window -> [none] To Arc v something.arc make sure the D gadget is empty and select the file(s) to be listed. Also works for arc t. If no filename is selected, it will attempt to run the arc program with the R [and D if not empty] gadgets only. This gadget is versatile, and requires some experimentation on your part to learn just how much it can (and can't) do. BYTES This will total and display the number of bytes and files for all 'selected' files in the current filewindow. CLEAR This is a mass clearing of all (if any) 'selected' files. SELECT This is the reverse. It 'selects' all files (some Du's name ALL). COPY This will copy the 'selected' file(s) to the location given in the D gadget. THIS MUST NOT BE A FILENAME. The path in D must be to a valid device or directory. Since multiple copying may be done, copying to a specific filename is not supported. COPYDEL THIS IS A PHYSICAL COPY WITH DELETE AFTER. This is identical in operation to COPY **EXCEPT** the original file is deleted if the copy operation is successful. (I got tired of reselecting and deleting the old copies). DELDIR This is the command to delete a directory (which must be 'selected' and empty). IF these conditions are met, the magic CONFIRM will appear to give you one last chance to back out. Clicking on the DELDIR gadget again will perform the deletion. Remember that the first click after highlighting a directory is read ONLY as the 'enter-the-directory-or-not' answer. You will have an extra click somewhere in this one. EDIT This gadget will cause your editor to be invoked and the 'selected' filename(s) to be used as command tail. If more than one file is selected, they will be edited sequentially. If no filenames are selected, the editor will be run with no file. The name of the editor can be changed by patching. Use NewZap to find the only occurrance of 'MEmacs'. Change it to a null terminated string of your choice. There is space for up to an 8 character name. This is not RUN, just EXEC'ed to prevent the program from trying to RUN one and immediately RUN it again for the next one. EXEC f-R These two will try to execute the result of sticking together EXEC R-f the R gadget and the 'selected' filename(s)*. The order of placement depends on which gadget you select. If no files are selected, EITHER gadget will attempt to execute the R gadget content by itself. Unlike RUN f-R etc. below, this does not try to RUN >NIL: the program. It uses the DOS call EXECUTE like just typing in a command at the > prompt. * BE WARNED THAT THESE OPTIONS *WILL* INCLUDE ANY HIGHLIGHTED DIRECTORY NAME IN THE ATTEMPTS TO STICK TOGETHER R+f OR f+R AND DO IT. (So you could type 'list' in the R gadget and hit a directory - then EXEC R+f and get a listing without entering the directory). My most common use of this is for repeated copy (etc) of the same thing. Enter the command into R and exec it over and over. HPRINT These will cause the 'selected' file(s) to be acted on. The 'H' HTYPE prefixed GADGETS mean Hex output format. If this is a multiple PRINT file pass, it may be aborted by clicking ANYWHERE in the window. TYPE The (H)PRINT commands use the PRT: device. This may be patched to PAR: easily since PRT: occurs only once in the program body. INFO This will read the InfoBlock for the devices mentioned in S and D (if not empty) and report free space. Note that the ram: device always has 0 free space. The report will always be source first then destination. MAKEDIR This will attempt to make a new directory named in the D gadget. If no complete device:path is given, it will be relative to the path in the current S gadget. If it is made, then the directory in S will be reread in case it has changed. A check is made to insure you are not trying to create a directory with an already existing name. MOVE This is a quicker form of rename. The path (only - not name) to move the 'selected' file(s) to should be in the D gadget. This will attempt to rename them (between directories not devices). Since no name change is happening, and the files can only drop out of sight, they are eliminated from the filewindow without re-reading the S gadget device. PARENT, These two commands will attempt to 'back-up' either to the ROOT parent or root directory of the current device. If they fail (horrors) they return to the current directory. RELABEL This is a teaser for my next revision. I wanted to put it in, but got impatient. It will be used to relabel disks. (NOT a paper label). RENAME This attempts to rename the first 'selected' file (should be only one for this) it finds to the name given in the D gadget. Since it may be still in the same directory, it will re-read the directory afterwards. Wherever feasable, MOVE is faster. RUN f-R These two will try to run the result of sticking together the RUN R-f R gadget and the 'selected' filename(s). The order of placement depends on which gadget you select. If no files are selected, EITHER gadget will attempt to RUN the R gadget content by itself, a handy way to do small chores. This uses the DOS call to Execute a RUN >NIL: + the selected stuff. It runs sequentially through all 'selected' files, one at a time. BE AWARE that this can grind your disks to dust, since as soon as RUN is done, it thinks it is ready to RUN the next one. SHOW This will attempt to EXEC any program you have named SHOW and pass it successively the 'selected' filename(s). If no files have been selected, nothing will happen. Show can be patched to any 8 character (maximum) filename also. It appears only once in the program body with spaces behind it. Change that one. The other one is the gadget text. This is NOT RUN >NIL: for precisely the reason mentioned in the previous description. ZAPFILE This is the file delete function. It will bring up the magic CONFIRM message. If you click the ZAPFILE again, any and/or all files which are currently 'selected' will be deleted. The M gadget will show the progress, and the deletion may be stopped by clicking the left mouse button on any gadget (or in the filewindow). D -> R S -> D These commands allow quick movement of R S D D -> S S -> R contents. -> are all one-way and SWAP's R -> D SWAP S-D are two-way. IF THE S gadget is altered, by this, R -> S SWAP R-D it will be acted on as though freshly typed in. SWAP R-S I got tired of so much typing. CONFIRM This is not a gadget really, but a question which is to save you from yourself. On the destructive gadgets, you have to click a second time to confirm what you want to do. Even if you click there, you can stop the activity by clicking the left mouse button while it is going on. The program checks in between every deletion to see if you clicked. If you have used other DirUtils, all this should be familiar. If not, make yourself a junk disk (one that doesn't matter what you do to it) and try it out. It's easy, and given time (and inclination) someone will probably put the whole C: directory into one of these things and still leave it in public domain. COMPILATION NOTES When you unarc this set of files, notice that DuTypefile.def and DuTypefile.mod are shortened to DuTypefi (etc). Please be sure to rename them before compiling, or it will fail. There are several library modules to compile first. If you choose to fiddle with this and re-compile it, do it in this order: modula DuWindow.def modula DuWindow (* then put in M2: *) modula DuTypefile.def modula DuTypefile (* " *) modula DuDir.def modula DuDir (* " *) modula DuMisc.def modula DuMisc (* " *) modula DuM2 link DuM2 o (* be sure to optimize since all are $A+ *) (* and its too large otherwise *) THEN you must newzap the load file DuM2. This is because I can't find a way to imbed nonprinting characters in constants in Modula-2. I did, but it made them spaces. In the DuTypefile library module is a multi-color string prompt. To make it work, do a newzap search for PRT: (It is only there once) and immediately following it is the familiar next line next page etc message. Throughout that message all lower case q's must be zapped to 1BH (esc) and the 2 lower case x's around the blanks must be zapped to 0DH (cr). Then the last 'end of file' message has two lower case q's more to zap to 1BH (esc). This is a pain, I know, but I didn't want to waste space on a routine to do them at runtime. After this, you are free to name the load file any way you want.