** FTOOLS Overview **
---------------------
This set of tools to make it easier and more automated to organize and archive
large collections of "commonly changed" files (like program source files).


** Details **
-------------
The tools are:
    FCL     File Command(s) from List
        Lets you perform commands on files in a "directory format" listing.
        Can make and sort lists so that files can be grouped together with:
          Same Name (in different paths)
          Same Size and (optional) CRC)
    FVT     File View as Text
    FVB     File Vire as Binary
    FCT     File Compare as Text
    FCB     File Compare as Binary
    FEXP    File EXPlorer - easily "" (and/or other commands) on files in tree
    FLCMD   File List - performs commands CoManD
    FRF     Find Recent Files
    FTIF    Find text in files
    FAW     File Archive Working
        Helps automate making a backup archive of working files (in current
        directory) to removable storage.
    IDC     Interactive Directory Compare
        Easily see what's changed/updated since backup/posting etc.

To see delails of command syntax, try entering the command with no arguments,
or: command -?


**Why**
-------
As I continue to recover, I find that I'm writing quite a few tools that help
me a lot (like these ones), and some of them have been so useful that I decided
to make them available for others to benefit.


A somewhat ongoing problem I have is that "the new me" is doing a lot more
development on different systems in different places.

    I have several "main" systems in my office/basement.
    I've set up a system in a spare room upstairs.
    I have loptops I often use in the living, dining rooms etc.
    I have a couple of very small "netbooks" which I often use "in bed" or
        other places where table space is limited.

I use a network to move things around, but often a given system isn't turned
on, or I might "forget" to copy changes to a "master".

Also, as I move things around, I often need files that I'm NOT changing!
also things sometimes get copied "elsewhere" during testing where I may want
need them on an ongoing basis.

As a result of these, I sometimes have several different places where I've put
"things", and don't know exactly where latest/operational copies are located...
and it becomes a huge amount of work to sort it all out!


So.. I wrote "File Command from List" along with its associated view/compare
tools.

I can either collect my working areas from all systems onto a large external
drive, or connect to them all-at-once over the network.

I then use FCL to build a large "master list", then sort it to put files having
the same names (or [Crc-]Size) together.

Then I use it to look at and compare the files.  This makes it MUCH easier to
determine what I have modified, move changes to appropriate "master" locations,
and remove transient stuff I don't need anymore.


FAW is a separate tool I created to simplify moving working files back and
forth between systems as simple "ZIP" archives.

The archive name will be YYMMDDxx.ZIP where "xx" is a sequence of two letters
['A-Z' '-' '0-9'] based on the time of day. As there are 86,400 seconds in a
day, and 37 possible characters gives 1,369 possible sequences, this only
changes at about 63 second intervale!


**Technical notes**
-------------------
For command sytax help, run the command with no arguments!

When scanning for the filename, FCL looks for "(A-Z):\", this means that the
file list must have full paths. FCL and many of my other tools can do this.

FCL tries to minimize the size of printed dates/times, leaving more space on
a line for the filename.
    instead of: YYYY-MM-DD HH:MM:SS
    it shows:   YYMMDD HHMMSS
It will work fine with larger format lists, you just might have to do a bit
more side-scrolling to see long file names.

You can (for example) use my RECENT tool to generate the original file list
(in this case, having only most recent files). Since some tools may not handle
miltiple directory trees "at once"... you can manually concatinate several list
files together:
    eg: recent *.c >list
        recent *.h >>list

You can change the commands performed by FCL either:
    Temporarily:    with command line options: -0text to -9text
or  Permanently:    with my ESP (Executable String Patch) tool

Each command text must begin with the menu character to active the command  *1,
followed by the text of the command which may have these "special" characters:

    -1-0    ESP     [Fx] denotes hex character values                       *6
    ----    ----
    ~E~e    [F0]    perform command by exec() otherwise system()            *2
    ~S      [F1]    insert SelFile path\name
    ~M      [F2]    insert MarFile ""
    ~s      [F3]    insert SelFile name only
    ~m      [F4]    insert MarFile ""
    ~C~c    [F5]    Confirm (issue "Are you sure?" prompt)
    ~_              insert ' '          \   These characters
    ~(              "" '<'               >  can be difficult
    ~)              "" '>'               >  to enter at the
    ~!              "" '|'              /   command prompt

*1      When using ESP, make sure activation character is UPPER case!

*2      exec() has a bit less overhead, but does NOT support command shell
        functions like pipes '|' and redirection '<>'
        **It is important with DVM because exec() will launch another .DVM
          within the same virtual machine, system() passes command to host.


**FAW - ESP strings**
---------------------
    1   Drive letters to NOT allow as a destination                         *3
    2   File extensiion for archives.
    3   File extensions to archive, separated by ':'s
         eg:    "C:H:TXT:BAT" means .C , .H, .TXT and .BAT
    4   Command to build archive                                            *4
    5   Location to put a copy of content to be archived                    *5

*3  any drive letters should be UPPER case

*4  You can use any suitable archiver. I use DOS: PKZIP, Windows: 7zip      *6
        This is "printf" format, "%s" is the destination archive filename

*5  This should be a full path (begins with: drive:\path )                  *36
    drive: must be unique, MVZ will NOT access this drive otherwise
        I use my R: RAMdisk
        You can use SUBST to make a "pseudo drive" pointing to a path.
    I don't recommend making this the "root" of a drive because Windows
    can make "special" files and directories there (like "$RECYCLE$.BIN")
    and 7-zip will happily include them in the archive!

*6  "long" filenames don't work in DOS(Win32) MVZ, use .DVM

**IDC - ESP strings**
---------------------
    Each string is a possible operation to be performed on selected file(s)
    1st Character is the letter to be typed to execute this command
    Remainder is the command to execute, special byte values:
        FF  - Causes commannd to be performed by exec() otherwise System()
              and marks the seperation of the command filename and its args.
              Important with DVM as exec() will launch another DVM program
                system() launches a system command.
        Fx  - Special a file to execute, F[dDnN]
                d   left must be Directory (otherwise file)
                D   right ""
                n   Name of Left selection      00 means only Left OR Right
                N   Name of Right selection         can be selected/used
 * For each different name in the directories being compared,  IDC needs the
    sizeof name(+1) plus 16 bytes for the two timestamps and sizes. For this
    reason, IDC is limited to <= 512 different names!
