Index: trunk/BUILDING
===================================================================
--- trunk/BUILDING	(revision 1912)
+++ 	(revision )
@@ -1,151 +1,0 @@
-
-Building FM/2
-=============
-
-This document explains how to build FM/2 from source.
-
-Tools
-=====
-
-The following tools are currently used to build the FM/2 binaries
-
-  OpenWatcom v1.6 or newer
-  IBM Developers Toolkit v4.5
-  lxlite LX compressor
-
-Older versions of the Toolkit may work.  The OpenWatcom implementation of 
-the Toolkit should work, but this has not been fully verified.  There are no 
-known special setup requirements. 
-
-Not all versions of RC.EXE are created equal.  Currently, the best version to
-use is
-
- 12-18-97   6:01         868,000           0  RC.EXE
-
-which reports itself as
-
- IBM RC (Resource Compiler) Version 5.00.002 Dec 18 1997
-
-and it is available from
-
-  <ftp://ftp.software.ibm.com/ps/products/warpzilla/os2tk40rc.zip>
-
-You can get LXLITE.EXE from
-
- <http://hobbes.nmsu.edu/cgi-bin/h-search?key=lxlite&pushbutton=Search>
-
-You can get OpenWatcom from
-
- <http://www.openwatcom.org>
-
-
-Building
-========
-
-Use subversion to pull a copy of the source code distribution into your 
-client workspace.  See
-
- <http://svn.netlabs.org/fm2>
-
-for instructions on how to do this.
-
-Build the release version with
-
-  wmake
-
-Build the debug version with
-
-  wmake DEBUG=1
-
-or
-
-  set DEBUG=1
-  wmake
-
-The build outputs are:
-
-  av2.exe
-  databar.exe
-  dirsize.exe
-  eas.exe
-  fm3.exe
-  fm4.exe
-  global.exe
-  ini.exe
-  killproc.exe
-  sysinfo.exe
-  undel.exe
-  vcollect.exe
-  vdir.exe
-  viewinfs.exe
-  vtree.exe
-
-  dll\fm3dll.dll
-  dll\fm3res.dll
-
-
-  dll\fm3res.str
-
-  dll\ipf\fm3.hlp
-
-  internal\mkstr.exe
-
-Release Packaging
-=================
-
-FM/2 is released as a WarpIN package.
-
-The basic process is
-
-  wmake wpi
-
-See
-
- <http://svn.netlabs.org/fm2/wiki/WPIBuild>
-
-for more details.
-
-
-About FM/2
-==========
-
-FM2 was originally written by
-
-  Mark Kimes
-  <hectorplasmic@worldnet.att.net>
-
-He has kindly allowed us to take over maintenance and support of FM/2 and to
-release the program under the GNU GPL license.  I'm sure he would appreciate
-a Thank You note for his generosity.
-
-
-Support
-=======
-
-FM/2 is a Netlabs project.  The project URL is
-
- <http://svn.netlabs.org/fm2>
-
-The user support mailing list is
-
-  <mailto:fm2-user@netlabs.org>
-
-Like all Netlabs mailing list, this is mirrored to gmane.
-
-In addition the maintainers, monitor the comp.os.os2.programmer.misc 
-newsgroup and others in the comp.os.os2.* hierarchy.
-
-There is also an archived Yahoo group at
-
- http://tech.groups.yahoo.com/group/fm2/
-
-The list is closed to new posts, but contains some useful info.
-
-If all else fails, you can always e-mail me directly at
-
-  Steven H. Levine
-  steve53@earthlink.net
-
-Thanks and enjoy.
-
-$Id$
Index: trunk/COPYING
===================================================================
--- trunk/COPYING	(revision 1912)
+++ 	(revision )
@@ -1,345 +1,0 @@
-		    GNU GENERAL PUBLIC LICENSE
-		       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-			    Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-
-		    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-			    NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-		     END OF TERMS AND CONDITIONS
-
-
-	    How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Library General
-Public License instead of this License.
Index: trunk/CodingStyle.txt
===================================================================
--- trunk/CodingStyle.txt	(revision 1912)
+++ 	(revision )
@@ -1,229 +1,0 @@
-
-Coding Style Guidelines
-========================
-
-Line lengths
-
-  Try to keep lines less than 80 characters.
-
-  Break lines after logical separators.
-
-  Vertically align like constructs.
-
-    func(arg1,
-         arg2);
-
-Indents
-
-  Place function definition { in column 1
-
-  Place function definition } in column 1
-
-  Indent nested constructs by 2 characters
-
-  void func()
-  {
-    statement;
-    if (expr)
-      statement2;
-  }
-
-Tabs
-
-  Use only 8 column tabs.
-
-Layouts
-
-  if (expr)
-    statement;
-
-  // If expr and statement are brief single line is OK.
-  if (expr) statement;
-
-  // If statement is long, split logically and use braces.
-  if (expr) {
-    statement_part1...
-      restoflongstatement;
-  }
-
-  if (expr)
-    statement;
-  else
-    statement2;
-
-  if (expr1) {
-    statement1;
-    statement2;
-  }
-  else if (expr2) {
-  }
-  else {
-  }
-
-  // If expression wrapped, align like constructs vertically.
-  if (expr1 &&
-      expr2))
-  {
-  }
-
-  // Prefer expression sense that places shorter statement list first.
-  if (!expr)
-    ReportError();
-  else {
-    statement1;
-    ...;
-    statementn;
-  }
-
-  while (expr) {
-  }
-
-  for (expr; expr; expr) {
-  }
-
-  typedef struct {
-
-  } TYPENAME;
-
-Variable definitions
-
-  Define one variable per line.  They are easier to find and understand.
-
-    INT a;
-    INT *pb;
-
-  not
-
-    INT a,*b;
-
-Variable naming
-
-  Prefer Hungarian notation and CamelCaps for global variables.
-
-    BOOL fAGlobalFlag;
-
-  Prefer lower case and underscores for local variables.
-
-    BOOL is_ok;
-
-  Local variables can be short as long as meaning is clear.
-
-    BOOL ok;
-
-  Underscores can be omitted if name remains readable.
-
-    USHORT maxcnt;
-
-Spaces
-
-  Separate keywords from leading paren with 1 space.
-
-    if (expr) statement;
-
-  No spaces between function name and leading paren.
-  No spaces between last arg and trailing paren.
-
-    func()
-
-  Follow separating commas and semicolons with a space.
-
-    x = func(a, c)
-
-  No spaces between pointer operators and variables.
-
-    p->a
-    *p
-
-  Surround other binary operators with a leading and trailing spaces.
-
-    x = a + b
-
-  No spaces between unary operators and variables.
-
-    !a
-    b++
-    ++c
-
-  Try to avoid spurious internal and trailing whitespace.
-
-Expressions
-
-  Do not use superfluous parens.
-
-  Prefer
-
-    return 0;
-
-  to
-
-    return (0);
-
-  Do not use superfluous parens when operator precedence will do the
-  right thing.
-
-  Prefer
-
-    if (a & mask && c)
-
-  to
-
-    if ((a & mask) && c)
-
-  Avoid nested ternary conditionals (i.e. ? :).  They are hard to read and
-  rarely generate better code than switch or if statement.
-
-Commenting code
-
-  Prefer javadoc style comments for function headers.
-
-  When using // comments, // should be followed by a space.
-
-  Avoid using /* */ comments to disable code.  They can be hard to see.
-
-Disabling code
-
-  When disabling multiple lines of code, prefer
-
-    #if 0
-    #endif
-
-  to
-
-    /*
-    */
-
-  comments or // comments.
-
-  When disabling multiple lines of code, it is acceptable to use // comments
-  to disable a single line.  The // should be followed by a trailing space
-
-    // DbgMsg("here");
-
-Memory
-
- - Check all malloc/realloc/strdup/DosAllocMem calls
-   Use xmalloc in non-time critical code
-   Use xrealloc in non-time critical code
-   Use xstrdup in non-time critical code
-
- - Use xfree rather than free
-
- - If buffer overflow possible, check for it.
-
-Windows
-
- - Check all WinCreateWindow calls
- - Check QWL_USER pointer data
-
-Error notifications
-
-  DosBeep(50,100)       Alert user to operator error
-                        Use only when failure reason is obvious
-
-  saymsg                Alert user to operator error with popup
-
-  Runtime_Error         Report "should not occur" errors
-  Dos_Error
-  Win_Error
-
-$Id$
Index: trunk/HISTORY
===================================================================
--- trunk/HISTORY	(revision 1912)
+++ 	(revision )
@@ -1,1815 +1,0 @@
-New stuff at the top.  This list is not necessarily complete.
-
-3.25
- o Adjust layouts of dialogs to support larger font sizes (Gregg)
- o Move the Help button to the lower left corner on most dialogs (Gregg)
- o Fix spurious ea, date and time on nonexistent files in the compare dialog 
-   Ticket #575 (Gregg)
- o Fix occasional corruption in tree container on startup and rescan
-   Ticket #583 (Gregg)
- o Fix spurious "no drop" on first subdirectories in the tree container
-   Ticket #584 (Gregg)
- o Fix a trap caused by using a keyboard search in the tree container (Gregg)
- o Fix a rare trap on tree container scan or rescan (Gregg)
- o Fix some font and layout issues in View and Newview (Gregg)
- o Rework RemoveCnrItems and RemoveArcItems to prevent traps (Steven)
- o Rework FreeCnrItems to assure that all CNRITEMs are deleted (Steven)
- o Use WinSendMsg CMA_NEXT instead of preccNextRecord so linkage is maintained 
-   following inserts and deletions. (Steven)
- o Some packaging updates including Ticket #574 (John)  
-
-3.24
- o Rework Flesh/Stubby logic to avoid doing work on thread 1 (Steven)
- o Add generic linked list support routines (Steven)
- o Get tree switch code to work with new Flesh/Stubby code (Steven, Gregg)
- o Move tree expand code off thread 1 (Gregg)
- o Get ExpandAll to work with new Flesh/Stubby code (Gregg)
- o Fix failure of CD/DVD icon and display name to revert on disk eject (Gregg)
- o Stop Stubby from adding a null string file name eliminating some random traps
-   and occasional blank lines in the tree (Gregg)
- o Get notify on hard drive without subdirectories code working (Gregg)
- o Add missing MAKETOP code in directory containers works in tree view (Gregg)
- o Removed recurse drive scan code -- obsolete with Flesh/Stubby changes (Gregg)
- o Fixed occasional spurious A:\ drive not ready error on startup (Gregg)
- o Improved consistency of MAKETOP in tree container (Gregg)
- o Release tool improvements (John)
- o Created high-mem safe wrappers for all API functions that fail when loaded high (John)
- o Fixed trap in Stubby on startup (Gregg)
- o Fixed failure of rename dialog to update the tree container (Gregg)
- o Fixed trap on close while direct editing a file name (Gregg)
- o Fixed heap corruption trap on rescan while a scan was still running (Gregg)
- o Prevent a file name from being left blank during direct editing (Gregg)
- o Fixed direct edit code prevents double free attempts and misc traps (Gregg)
- o Made searchapath thread safe prevents potential traps (John)
- o Corrected failure to show error message on attempted delete of locked nonexecutable
-   files (Gregg)
- o Fix directory container compare selection code (Gregg)
- o Fix real object creation when generating multiple objects (Gregg)
-
-3.23 
- o Rework FM/2 Lite Config menu.  Add drag&drop dialog toggle. (Steven)
- o Rework FM/2 Lite Config menu.  Add confirm delete toggle. (Steven)
- o Correct View, Sort and Filter button initialization. (Steven)
- o Rework FM/2 Config menu.  Add confirm delete toggle. (Steven)
- o Fix hang on scanning in FM/2 lite when drive tree is hidden (Steven)
- o Fixed code errors identified by CPPCheck (Gregg)
- o Fixed archive directory failure retry code (Gregg)
- o Stopped using FM2Play to open multimedia files since MMOS/2 misidentifies many
-   file types (caused by mmioMP3 ioproc which claims it can play most anything) 
-   Ticket 541 (Gregg)
- o Unlock fixes (removed redundant error messages, now only try to unlock exes and dlls)
-   Ticket 549, 542 (Gregg)
- o Suppress redundant error messages on answering no to deleting R/O files. Ticket 548
-   (Gregg)
- o Update the dialog box type for "suggest dialog" Ticket 538 (Gregg)
- o Newview mailto changes: improved identification of email addresses in text files;
-   fixed a buffer overflow trap; cut trailing punctuation from addresses; limited domain 
-   to 3 characters.  Tickets 543, 544 (Gregg)
- o Newview now recognizes https:// as a url. Cut trailing punctuation from urls. (Gregg)  
- o Fixed failure to remove leading quote from extract directory in some cases Ticket 495
-   (Gregg)
- o Fixed details view column allocation for drives that failed drive check (Gregg)
- o Fixed a trap in Filter occurring with rescan or close while scan was in progress. 
-   Ticket 535 (Gregg)
- o Fixed rare tree container draw errors Ticket 545 (Gregg)
- o JAVA objects can now be made by selection "Real object" on a .jar file. Ticket 37 (Gregg)
- o Added support for critical EAs (Steven)
- o Limited help auto open in quick settings to once per session. Ticket 520 (Gregg)
-
-3.22
- o Compare directories enhancements: 
-   Fix snapshot file to actually load and save (with/without subdirectories) properly. 
-   Toggle of include subdirectories leaves snapshot file loaded. Added an indicator 
-   (textbox) that a list (snapshot) file is loaded.Ticket 490 (Gregg)
-   Added optional confirmation dialogs for delete move and copy Ticket 277 (Gregg)
-   Added EA compare option Ticket 80 (Gregg)
-   Fixed some minor interspace/display issues (Steven, Gregg)
- o Fixed the readonly warning on delete code and enhanced the dialog it now has focus on 
-   opening, accel keys, defaults to no and Esc key cancels operation. Rework readonly 
-   code so it works with move to trashcan enabled Ticket 506 (Gregg)
-   Suppress readonly warning for delete of temporary files. Ticket 497 (Gregg)
- o Changes to get 7z archives to work with AV2. Includes an ugly hack to compensate for 
-   the fact that the compressed size is missing from some files in some archives. 
-   This results in the filename being put in the nsize variable which then must be passed 
-   to fname. Fortunately it displays compressed size as 0 since it can't deal with the non 
-   numeric text string. A file name that is all numeric will show odd results. 
-   Ticket 492 (Gregg)
- o Changes to fix .tar.gz list because of changes in tar 1.20 (maybe earlier). Ticket 493
-   (Gregg)
- o Added lzip support Ticket 494 (Gregg)
- o Fix failure to create directory from archive file name when the name had a space.
-   Ticket 495 (Gregg)
- o Added instruction for creating a new archiver definition in Archiver.bb2 using an 
-   archive of the new type as a template to the help file. Ticket 21 (Gregg) 
- o Improved user interface responsiveness during long seek and scan operations (Gregg)
- o Fixed trap that occurred when trying to run commands from the command list drop down
-   Ticket 509 (Gregg)
- o Support git, svn, hg etc. version control metadata directory excludes in seek and scan
-   Ticket 404 (Steven)
- o Fix trap on opening a file without an extension Ticket 496 (Gregg)  
- o Fix separate parameters. Moved to general page renamed separate settings for apps. 
-   Ticket 497 (Gregg)
- o Add "#" command line switch to workaround problem with blank command shell started 
-   from fm2 after fm2 has been started with stdout and stderr redirected to a file.
-   Ticket 508 (Gregg)
- o Fixed move to trashcan so it works when the trashcan::drives key hadn't been written 
-   to OS2.INI Ticket 507 (Gregg)
- o Installer fixes: Fixed the FM2 with logging object. Ticket 511 (Gregg)
-   Fixed install of file shadows in FM2 folder and subfolders Ticket 501 (John)
-   Fixed FM2 utilities install by FM2 warpin. (Gregg)
-   Fixed the suggest dialog which suggests parameters for newly installed objects.
-   Ticket 527 (Gregg)
- o Fixed trap caused by cleanup of temp files left after a crash. Ticket 515 (John)
- o Stopped file extensions in directory containers from changing to upper case following 
-   a double click. Ticket 513 (Gregg)
- o Stop loading FM2 in high memory to prevent odd traps. Ticket 500 (John)
- o Fixed trap when attempting to print a file from an archive container Ticket 525 (Gregg)
- o Disabled menu choices in archive container that aren't options for the selected
-   archiver. Ticket 100 (Gregg)
- o Enhanced initial drive scan speed Ticket 528 (Gregg)
- o Suppressed error message drive A: not ready on initial scan Ticket 529 (Gregg)
- o Added information about drag and drop on program objects to the help file Ticket 530
-   (Gregg)
-
-3.21
- o Search for duplicates now sorts results by filename. Ticket 8 (Gregg)
- o Since eCS includes unlock.exe I have added unlock file to the file (directory container context) menu
-   so you can easily unlock a dll or exe file. Delete, copy and move operations open a dialog which allow 
-   you to unlock files as part of these operations. An icon is included if you wish to add unlock to a
-   toolbar button. Ticket 11, 12, 357, 408 (Gregg)
- o Added information on FM/2 as a WPS replacement to help files; a few additional documentation updates.
-   Ticket 55, 134 (Gregg)
- o Enhance compare directories to allow inclusion of subdirectories or use of a list file on opening
-   Fixed failure of list file loading Ticket 145, 489 (Gregg)
- o Added a warning dialog when a delete, copy or move operation which replaces/deletes a read only file.
-   Ticket 319 (Gregg)
- o The "target directory" is now a drop target for move/copy or conditionally to change the target.
-   Ticket 373 (Gregg)
- o The user can now change the presentation parameters in "thread notes" and "compare directories"
-   Ticket 443 (Gregg)
- o Fixed 2 reported traps. Ticket 486, 487 (Gregg)  
-
-3.20
- o Identified mmioIdentifyFile's failure to correctly identify some files as the root cause of
-   a trap in GBM.DLL. ShowMultiMedia now only checks files with known multimedia extensions.
-   This will minimize but not complete prevent the problem. Ticket 402 (Gregg)
- o Add suggested drive flags for use with Netdrive drives to help file. Ticket 171 (Gregg)
- o Clarify ARCHIVER.BB2 date types and add a new one to fix displaying of .tar.gz files for Tar 1.15 and higher.
-   (Requires installation of ARCHIVER.TMP -> ARCHIVER.BB2) Ticket 473, 474 (Gregg)
- o Stop loading EA.EXE's resources in high memory. This caused a trap on some machines. Ticket 470 (Gregg)
- o Fixed behavior of the duplicate hotkey warning dialog in "Commands". Ticket 476 (Gregg)
- o Fixed the failure of FM/2 to create a list file if it didn't already exist. Ticket 477 (Gregg)
- o Fixed missing file size after copy in compare directories. Ticket 479 (Gregg)
- o Extract called from the popup menu would fail if the archive file name contained a space. Ticket 480
-   (Gregg)
- o Selecting "View" in the View Help Files dialog failed to open the selected file. Ticket 481 (Gregg) 
- o Fixed command line quoting. Ticket 475 (Gregg)
- o The thread notes window now reopens on startup if it was open at shutdown. Ticket 482 (Gregg)
- o Fixed a trap on drag in compare directory dialog. Ticket 483 (Gregg)
- o Fix missing icons on archive and multimedia files. Ticket 484 (Gregg)
- o FM/2 only opens either the scan error or select dialog on a drive scan error not both. Ticket 485
-   (Gregg)
- o Code cleanup to try to increase drive scan speed. (Gregg)  
-
-3.19.1
- o This is a bug fix release. Most of these have existed for a very long time but were only
-   discovered recently.
- o Fixed trap on startup when TMP and TEMP environment variable aren't present or aren't valid
-   Ticket 468 (Gregg)
- o Fixed overlapped buttons in EA editor which prevented changing EAs. Ticket 467 (Gregg)
- o Fixed collector trap when duplicate files were drop in. Ticket 461 (Steven)
- o Fixed counter in collector to update # of files and KIBs at the same time. Ticket 455 (Gregg)
- o Fixed path quoting code to prevent it adding a single " in some cases Ticket 463 (Gregg)
- o Fixed commands to avoid assigning duplicate ID numbers. Ticket 463 (Gregg)
- o Fixed commands dialog not to exit following clearing of a duplicate hotkey error. Ticket 464
-   (Gregg)
- o Fixed FM/2 utilities wpi script so it can be installed without install FM/2 also. None of
-   the utilities have been updated. Ticket 460 (John)
- o Fixed CMD file that installs unzip V6 support to avoid a warpin hang. Ticket 459 (John)
- o Associations were not being saved when an association was moved to the top or bottom of the
-   list. Ticket 466 (Gregg)    
-
-3.19
- o Added the option to open the directory container of an item in the collector. Ticket 362 (Gregg)
- o Finally appear to have fixed the duplicate names in the tree container on drive scanning
-   Ticket 363 (Gregg)
- o Corrected the drive space display in the drive information dialog. Ticket 367 (Gregg)
- o Eliminate "Drive not Ready" error when change the "Show in tree" option. Ticket 437 (Gregg)
- o Force a reload of Archiver.bb2 anytime it is edited using FM/2's archiver editor and on
-   opening the editor if it has been changed on disk. Ticket 438, 441 (Steven, Gregg)
- o Added an Open file button to the EA editor so multiple files can be edited without opening and 
-   closing the dialog box. Ticket 439 (Gregg)
- o Prevent an AV/2 hang caused by deletion of the temp directory and check that the temp
-   directory exists before creating temp files also prevents some hangs. Ticket 440, 442 (Gregg)
- o Fixed trap that occurred if seeall is closed while it is scanning. Ticket 444 (Steven)
- o Fixed trap that occurred when a scan added more than 64k files to a container. Ticket 446, 448
-   (Steven, Gregg)
- o Improved UI and PM response during large file scans and container closes. Tickets 452-57
-   (Steven, Gregg)
- o Eliminate double count up of files and kibs in directory containers Ticket 458 (Gregg)
- o Removed instructions for updating resources which was badly out of date. Ticket 371 (Gregg)
- o Added .xqs files and now install debug package by default to better utilize exceptq. 
-   Ticket 447 (Gregg)
- o Load as much of FM/2 in high memory as possible. (Gregg)  
-
-3.18 
- o Rework compare directories for speed; allow AND'ed selections;
-   allow fast cancel from long running operations; more content menu items Ticket 276 (Steven)
- o Use Ctrl-click to select state or commonly used directory quicklist entry without activating.
-   Handy for deleting entries without changing window state. Ticket 433 (Steven)
- o Use Ctrl-click to select walk dialog user list entry without activating.    
-   Handy for deleting entries without changing entry field content. Ticket 433 (Steven)
- o Avoid drivebar MB2 exception (Steven)
- o Avoid traps when changing tree container display style Ticket 408 (Steven, Gregg)
- o Restore missing drives to drive list dropdown (Steven)
- o Correct docopyf regression which caused move to same volume to fail with access denied (Steven)
- o Eliminate intermittent hang on drive rescan (Gregg)
- o Move clipboard buffer to low memory to correct paste failure in VIO windows. (Gregg)
- o Corrected the file open logic to avoid attempting to open zero byte files as multimedia
-   among other oddities. (zero-byte now open a warning that gives the option of opening them
-   in the default text editor). Ticket 70, 409 (Gregg)
- o Moved data from COMMADS.DAT to FM3.INI. This allows you to reorder your "commands" without
-   breaking any tool buttons you have created or changing the command's hotkey assignment.
-   Hotkeys are now user selectable. Tickets 65, 186 412 (Gregg) 
- o MPGs are now recognized as media files. Ticket 405 (Gregg)
- o Another attempt to fix the rare situation where directory names are double listed in the
-   Tree container. Ticket 363 (Gregg)
- o Remove high memory version which was broken by changes in open watcom 1.9 which use DosOpenL
-   (can open files larger than 2 gigs). DosOpenL doesn't thunk the high addresses correctly.
-   (Gregg)
- o "Separate Parameters" now works. Ticket 414 (Gregg)
- o Updated the quick settings page to include my standard settings as a choice and make 
-   Default match the currently shipped defaults. Ticket 415 (Gregg)
- o Changes to use wipfc as the default help file compiler. Tickets 420, 421 431 (Robert, Gregg)
- o Fix a dialog box hang when an open archive is deleted or moved. Ticket 422 (John)
- o Fix run failure of DOS and Win16 programs called from within an archive. Ticket 423 (John)
- o Change "Cancel" button to "Close" in the Select Archiver dialog to better reflect its 
-   function. Ticket 427 (John)
- o Warpin installer will delete FM3RES.STR from your install directory. The file is obsolete.
-   Ticket 430 (John)
- o Add support for unzip 6.0 in ARCHIVER.TMP file. Ticket 428 (John) 
- o Documented in the help files the error message returned by the trashcan when a disk 
-   is full and explained its meaning. Ticket 251 (Gregg)
- o Improved error message when the executable for an archiver isn't found in the PATH.
-   Ticket 403 (Gregg)
- o .wpi files are now passed to PM for opening if no association is provided. Ticket 432 (Gregg)  
- o Append checkbox in save list dialog now works as expected. Ticket 436 (Gregg)
- o Suppressed ERROR_FILENAME_EXCED_RANGE error on NTFS volumes; it appears to be an issue with
-   NTFS.IFS or the kernel. Ticket 435 (Gregg)
- o Improve startup parameter suggestion wording and make behavior work as described. Ticket 434
-   (John)
-
-3.17
-
- o Added progress indicators when copying or moving files and/or directories - flashing
- led also shows list including # of total in thread notes window Ticket 302 (Steven)
- o Place drive letters over bitmaps replace, enlarge bitmaps in drive bar and add a refresh
- removable media and rescan button to the drive bar. Tickets 13, 91, 378, 385 (Gregg, David)
- o Added Option to list drive label or file system name along side of the drive letter
- in the drive tree. Tickets 47 339 (Gregg)
- o Modified the directory container "Scanning" message to "Please wait ...scanning...
- Ticket 291 (Steven)
- o Toggling between split and full status bars no longer opens a databar window. Ticket 364
- (Gregg)
- o Shortened the status line 1 message for split status lines; Conditionally added
- file system type to message. Ticket 365 (Gregg)
- o Added option to open user INI, System INI or fm/2's INI files to a submenu on
- the Utilities menu Ticket 366 (Gregg)
- o FM/2 can now load in high memory. We have shipped both high (3.17.1) and low (3.17.0)
- versions. Ticket 368, 388. 389, 401 (Gregg)
- o Streamlined container scanning/loading Ticket 369, 370, 380, 381, 382 (Gregg, Steven)
- o Fixed crashes caused by collecting files from list file and by pressing Ctrl-g
- in the collector. Ticket 376, 395 (Gregg, Steven)
- o Allow .LONGNAME to be displayed for FAT & LAN drives	and delete .LONGNAME EA
- if it becomes the filename on a copy or move. Ticket 377. 379, 386 (Gregg)
- o Setting to turn off state save now work Ticket 383 (Gregg)
- o Fixed container update failure in FM2 lite Ticket 390 (Gregg)
- o Changed check for protectonly systems to avoid starting command.com which can hang a system
- with a bad MDOS install Ticket 392 (Gregg)
- o Update window layout help & fix labeling issues in fm2 main window help bmp Ticket 393
- (Steven, David)
- o Fixed a hang that occurred on SMP systems. Ticket 394 (Steven, Gregg)
- o Fixed odd behavior when double clicking on the directory container directory icon.
- Ticket 398 (Gregg)
- o Provided the option to turn off the "drive exclude" suggestion dialog on start up.
- Ticket 399 (Gregg)
- o Suppressed error messages when scanning a directory containing a locked text file
- or when Drag&Dropping more then one file from PMMail Ticket 391 400 (Gregg)
-
-3.16
- o Correct walk, compare and dirsizes dialog setups to ignore saved dialog size
- Ticket 342 (Steven)
- o Move translatable strings to fm3dll.rc STRINGTABLE to support NLS translations
- Tickets 6, 81, 340 (Steven, Gregg)
- o Support backspace in directory container type to search allow longer time between
- key strokes in type to search Ticket 348 (Steven)
- o Filtering and select/deselect mask now work in archive containers that have
- pathnames Tickets 358, 359 (Gregg)
- o Date formatting and "thousand separator" should now reflect the system locale settings
- Tickets 28, 82 (Gregg)
- o Resolved a rare hang during startup drive scanning Ticket 361 (Gregg)
- o Fixed failure of some system based toolbar buttons in FM/2 lite Ticket 352 (Gregg)
- o Compare directories now remembers changes to details settings Ticket 346 (Gregg)
- o EA checkbox on directory container notebook page now works Ticket 344 (Gregg)
- o Error/Alert beeps can now be turned off in the settings notebook Ticket 341 (Gregg)
- o Improve identification of text verses binary files when opening viewers Tickets 326, 338
- (Gregg)
- o Removed VAC 3.65 specific code Ticket 350 (Gregg)
- o Reworked detail switches handling for saved states Tickets 343, 345, 347 (Gregg, John)
-
-3.15
- o Added the option to turn write verify off on a per drive basis; it is turned off on nonfloppy
- removables by default to address reports of hangs with FAT32 usb drives and of FAT USB
- drives behaving as read only devices. Ticket 318/323 (Gregg)
- o Seek and scan can now be started from the drives or directories context menus. Doing so
- will use the drive/directory as the root for the search. Ticket 167 (Gregg)
- o Added "DataBar" menu item to utilities menu. Ticket 280 (Gregg)
- o Eliminated the need for archiver list to have start and end list strings; this allows it to
- work with tar for example. Ticket 284 (John)
- o Add setup for using latest tar including for .tar.gz and .tar.bz files (gzip and/or bzip must
- also be in your path) to archiver.tmp (John)
- o Added check for protectonly systems will gray out dos/win command line menu items and causes
- Dos/Win executables to be opened in a viewer since they will fail anyway. Ticket 325 (Gregg)
- o Added the option to rescan the drive tree on media eject (see scanning page of config notebook)
- Ticket 48 (Gregg)
- o Added Refresh removable media item to tree container menus Ticket 54 (Gregg)
- o Grayed out partition tool menu item where the tool is not available in the path; removed partition
- submenu default selection. Ticket 36 (Gregg)
- o Added option to recursively scan selected drives at startup Ticket 322 (Gregg)
- o Moved toggle word wrap in the MLE editor to "View" menu from a "Config" submenu Ticket 160
- (Gregg)
- o Added option to create extract directory from archive name Ticket 22 (Gregg)
- o Added drop help to the tree container; fixed drop help to show the correct action on DO_DEFAULT
- Ticket 320, 324
- o Fixed seek and scan drive selection code so nonexistent drives aren't selected Ticket 301, 303
- (Gregg)
- o Several interface appearance/behavior issues were addressed Ticket 283, 305, 306, 311, 312
- 313, 316, 321, 328, 329, 330, 332 (Gregg)
- o Fixed traps associated with deleting directories; closing a container after its
- associated drive had been ejected and trying to execute a dll. Ticket 304, 317, 331 (Gregg)
- o Added exceptq and process dump functionality to simplify defect reporting
- Ticket 26, 307 (Steven)
-
-3.14
- o New toolbar and drive icons (David)
- o Updated toolbars they all include buttons to switch to any other provided toolbar (David)
- o Right click on unformatted drive now provides the drives context menu Ticket 279 (Gregg)
- o Corrected the menu items available for remote, virtual and removable drives
-   Eliminated instances of multiple menu defaults. Ticket 290 (Gregg)
- o Added new icons for some objects in the FM/2 folder. Ticket 292, 294 (David, John)
- o Enhanced scan speed for initial and complete rescan of drive tree. Ticket 25 (Gregg)
- o Fixed typo that had changed the the filters data file from filters.dat to filter.dat;
-   It is now filters.dat which it was originally. (Gregg)
- o Help file clean up, minor corrections updates and new icons. (David, John)
- o Some additional bug fixes. Tickets 163, 187, 286, 289, 2, 58, 282, 285, 287, 293
-   (Gregg, John, Steven)
-
-3.13
- o Trash can only used for drives that support it; it is not used as default Ticket 250 (Gregg)
- o Check disk space remaining for temp and user files; Fix several issues related to full drives.
-   Tickets 154, 214, 268, 271 (Gregg)
- o Added current toolbar and target directory to states. Ticket 259 (John)
- o Add BMP resources for the 7 FM2 provided toolbars & make it clear how to turn them off.
-   Tickets 273, 274 (Gregg, David)
- o Fix problems with default toolbars and develop a seamless install saving user modifications.
-   Ticket 267 (John)
- o Fix issues with the toolbar button edit/add etc code. Tickets 260, 264, 266, 272, 275 (Gregg)
- o Fix Dirsizes issues including a trap. Tickets 224, 255, 269 (Gregg)
- o Performance optimizations. Tickets 252, 253 (Gregg)
- o Interface cleanup; Tickets 257, 258, 261, 262, 270 (Gregg)
- o Some additional bugs fixed; Tickets 254, 256, 278 & several without tickets (Gregg, Steven)
- o Developed a release validation assistant. Ticket 107 (John)
-
-3.12
- o When viewing archives, users can now select "Open default" or "Open Settings".
-   These options are available through the context menu and via the F6 and F7 keys.
-   Also available is open in FM2Play.exe for multimedia accel key only Ctrl + l
-   Ticket 126, 249. (John Gregg)
- o The Settings notebook now responds to certain accelerator keys: F1 for help; F3
-   and both Enter keys for "Close and save" and ESC for "Close and discard changes".
-   Ticket 197. (John)
- o For those who select "Show environment variables" in the Drive Tree, the list of
-   environment variables is now user-selectable on the "Tree" page of the Settings notebook.
-   Ticket 114. (John)
- o FM/2 now uses the system TMP/TEMP directory for its Temp files. It should cleanup after
-   itself but it does it when it reopens following a crash. Let us know if it doesn't
-   Ticket 20 (Gregg)
- o We have reworked the menus and accel keys in file containers (ie dircnr) to allow
-   for either the full path name (always available) or the filename to be saved/appended
-   to the clipboard. The menus were reworked to make access to these functions more obvious.
-   Ticket 137 (Gregg)
- o Bug fixes, code cleanup and fortify enhancements (Steve, John, Gregg)
-
-3.11
- o Fixed 2 traps in Dirsize, ticket 243 (Gregg Steven)
- o Added the option of having delete move the files to the Xworkplace trash can, ticket 43
-   (Gregg)
- o Added fortify support fix several memory management issues, ticket 213 240 (Steven Gregg)
- o Fixed multi dot file association/filtering logic, ticket 235 (KO Myung-Hun)
- o The Newviewer (not the old MLE) is used to view files when view is selected from menus
-   ticket 241 (Gregg)
- o Fixed issues with details view not following user selected settings, ticket 237 239
-   (Gregg John)
- o Eliminated the "bare" ini key details setting names. They are now prefaced by the container
-   name (ie DIRCNRS_) ticket 234 (John)
- o Made all command line lengths obey user selected command line length, ticket 233 (Gregg)
- o Added a state "FM2ShutDown" to the states dropdown box to allow easy return to the startup
-   state, ticket 227 (John)
- o Fixed crash in compare directories if a file's name exceeded the OS/2 maximum, ticket 213
-   (Gregg)
- o FM/2 reopens directory containers in the position they were closed in, ticket 103 (John)
- o Add warnall support (Steven)
-
-3.10
- o Removed the close button and menu item from the tree container which closed FM/2 (Gregg)
- o Implement bubble help for bitmap menu items in collector and arc container (Gregg)
- o Correct/enhance settings notebook navigation, ticket #188 (Steven)
- o Reopen settings notebook to last selected page unless overridden, ticket #188 (Steven)
- o Correct Compare Directories select count regression (Steven)
- o Correct Compare Directories file sizes regression (Steven)
- o Speed up Compare Directories filter redraw (Steven)
- o Rework Config menu.  Move some to submenu.  Add drag&drop dialog toggle. (Steven)
- o Rework Walk dialog.  Put entry field at the top. (Steven)
- o Subjectwidth/left now works in the collector. (Gregg)
- o Change Config->Edit and Config->Palette menus to have no default (Steven)
- o Avoid spurious error reports for R/O directories on FAT volumes.  Ticket #116. (Steven)
- o Add immediate updates toggle to config menu.  Ticket #132. (Steven)
- o Fix toolbar to change background colors with color drag drop ticket #161 (Gregg)
- o More Compare Directories rework.  Filters now honored by actions.  Tickets #191, #198 (Steven)
- o Fix failure of direct edit of Subjects and LongNames (Gregg)
- o Walk directories and walk directories2 now remember size and position. (Gregg)
- o Compare directories dialog remembers size and position. (Gregg)
- o Individual directory containers can have different fonts & colors which are saved
-   and restored (Gregg)
- o Moved command line, system and bookshelf to submenus on the utilities menu (Gregg)
- o Restore no-prescan drives if restoring named state
-   This reverts to original behavior for named states
- o Rework collector progress reporting and improve performance (ticket #79)
- o Compile OpenWatcom version into binary (Steven)
- o Add conditional cascade to main menu settings menu item (Steven)
- o Rework ResizeChildren to resize drive tree correctly (Steven)
- o Avoid trap in TreeCnrWndProc WM_SAVEAPPLICATION (Steven)
- o Fix _fsopen failure when creating a new list file (Gregg)
- o Stop collector from trying to remove container items that were never inserted (Gregg)
- o Recollect of hidden items now updates the items and unhides them (Gregg)
- o Put hide/remove etc menu options on collector "view" menu (Gregg)
- o Fix trap in seeall cause by pathname(s) that exceed maxpath (Gregg)
- o Restore SaveDirCnrState internal state save logic - accidentally removed
- o Move save shutdown state name to strings (IDS_SHUTDOWNSTATE, ShutdownState)
- o Add unhide menu option (Gregg)
- o Enable user settable command line length (Gregg)
- o Add presparams & update appearance of "Sizes" dialog (Gregg)
- o Fix save and restore of non-default details view settings (John)
- o The state at shutdown is now available (read-only) in the States combo box (John)
- o The list of excluded drives in the parameters of the FM/2 object
-   are no longer overwritten during the FM/2 install (John)
- o The FM/2 Utilities package will no longer be selected automatically
-   during the install if it has already been installed. (John)
- o Add a "debugging support" package to the Warpin WPI file (John)
- o The build process has been changed so that script is updated with the new
-   version number the first time the WPI file for that version is built (John)
- o Changed the build process to skip LXLITE processing on debug builds (John)
-
-
-3.09
- o Check program strings entered in assoc, commands & settings for quoting,
- file extension, space before args and existence on entry. (Gregg)
- o Add TestFDate and TestCDate for date compare and sort functions (Gregg)
- o Use commaFMTULL for formatting additional file, EA etc size information(Gregg)
- o Give LIBPATHSTRICT option for mailto & run FTP/HTTP (Gregg)
- o Add "mailto" option in new viewer (Gregg)
- o Make WPURLDEFAULTSETTINGS the fall back for ftp/httprun (Gregg)
- o Update CopyPresParams to copy all types of pres parameters (Gregg)
- o Add "Save as" menu item to internal viewer (Gregg)
- o Eliminate deletion of ext path if it was not valid on startup
- o Allow saving of a currently not valid ext path with warning (Gregg)
- o Internal editor now handles readonly files (Gregg)
- o Correct hex edit buffer sizing to avoid data loss (Steven)
- o Use CopyPresParams to fix presparam inconsistencies in menus (Gregg)
- o Correct variable cast to fix hex code display problem (Gregg)
- o Correct variable cast to fix hex code display problem (Gregg)
- o Update includes to allow standalone usage (Steven)
- o Switch to wrc.exe default; support USE_RC from environment (Steven)
- o Avoid out of memory traps in Compare Directories (Steven)
- o Correct INI editor copy failures (Steven)
- o Use CloseProfile to avoid spurious system INI closes (Steven)
-
-3.08
- o Cancel in walk directories dialog now directly closes dialog even if
-   directory path text has changed (Gregg)
- o Fixed seek and scan crash caused by file names that exceed maxpath(Gregg)
- o Fixed INVALID_NAME error caused by FILEFIND buffer crossing a 64k boundary (Steven)
- o Added 32 bit DosQuerySysState API (Gregg)
- o Warpin build will not attempt to use wrong wic.exe (John)
- o Make directory now always lists current directory (not subdirectories)
-   on status line (Gregg)
- o Use thousands separator from default COUNTRYINFO (Gregg, Steven)
- o Add support for files over 4GiB (Gregg, Steven)
- o Rework filemask logic to match last extension and allow for better
-   string matching (Gregg)
- o Use 4096 byte buffers to protect against NFTS driver small read defect (Steven)
-
-3.07
- o Tweak build process (Steven)
- o Rework internals to increase file and directory limits (Steven, Gregg)
- o Rework internal sleep durations to increase performance (Gregg)
- o Rework file scanning buffer handling to increase performance (Gregg)
- o Speed up Config->Tree->Collapse before switching speed (Steven)
- o Speed up Dup find code. (Gregg)
- o Update configuration notebook scanning page (Steven)
- o Rework states logic to allow longer state names, tickets #109, #31 (Steven)
- o Report delta time in debug messages (Steven)
- o Added BldFullPathName cleaned up comp dirs code fix right left misalignment(Steven)
- o Added BldQuotedFileName and BldQuotedFullPathName to streamline code. (Steven, Gregg)
- o Increased limit on Subject EA to 1024 from 40. (Gregg)
- o Corrected dir sizes accel key to ctrl + z. (Gregg)
- o Fixed addition of ff in Hex notation by archiver editor. (John)
- o Updated build instructions on FM/2 Wiki. (David)
- o Dir sizes correct some sizing and positioning issues. (Steve)
- o Removed error message in eas.c which caused seek and scan for text including eas to fail on
-   read only files. (Gregg)
- o Fixed unnecessary menu item removal when FM/2 is run as the WPS.(Gregg)
- o Fixed the restore of the settings under "Include in details view" on the "DirView"
-   tab of the configuration notebook, Ticket 118/71 (John)
- o Subject column can be moved to left side of split bar in directory container
-   and/or sized which will truncate long subjects (Gregg)
- o Avoid can not set fm3.ini read-only failure - DosSetPathInfo (Steven)
- o Avoid exception when exiting File/Directory Object Information dialog (Steven)
- o Fix a fast viewer text file load failure. (Gregg)
- o Reversed behavior of horizontal scroll bar in fast viewer bar present with unwrapped text
-   absent with wrapped text and hex
- o Add accelerator support to quicklist windows (Steven)
-
-3.06
- o First release built with OpenWatcom associated documentation updates (Steven,Gregg,John)
- o Fixed ramdisk not shown in quicklist drives dropdown and drive bar drive lists (Gregg)
- o Fixed WORKPLACE_PROCESS environment variable check (Gregg)
- o Add CheckPmDrgLimit including IsFm2Window as part of work around PM drag limit (Steven,Gregg)
- o Change mouse button 3 white space click to fail silently (Gregg)
- o Document behavior of global.exe when attempt is made to run it from 4os2 (Gregg)
-
-3.05.09
- o Update readme to reflect warpin install and other code changes (David, John, Gregg)
- o Avoid spurious add_udir error reports (Steven)
- o Harden drag/drop error recovery (Steven, Gregg)
- o Add DbgMsg (Steven)
- o Rework selective error logging logic
- o Rework state save/restore user interface to report problems better (Steven)
- o Correct FileInfoProc binary file detect (Steven)
- o Correct FileInfoProc/IconProc race crash - ticket#77 (Steven)
- o Convert to WarpIN installer - ticket #10 (David, John)
- o Work around for drag/drop limit in PM ticket 50 (Gregg, Steven)
- o Add RunFM2Utils function find utils in path or \utils (Gregg)
- o Fix MMPM file scan to not try to play nonmedia files (Gregg)
- o "Replace" in commands dialog now leave list order intact (Gregg)
- o Code cleanup (ROT13 compiler warning, removed win class pstrings QWL_USER) (Gregg)
- o Removed original Readme from distribution package
-
-3.05 beta08
- o Add SelectDriveIcon function (Gregg)
- o New drive flags - ramdisk, virtual drive & no drive stats (Gregg)
- o New icons for ramdisk, virtual drives & directories (David)
- o Avoid saving directory settings for no prescan drives on close (Steven)
- o Restore Make directory menu item to drive container context menu (Gregg)
- o Add read only NTFS file support (requires NTFS.ifs) (Gregg)
- o Removed most hard coded fonts from dialogs updated Helv font to Helvetica (Gregg)
- o Moved fonts to string file (Gregg)
- o Expanded FM2's recognition of image & archive file types (Gregg)
- o Help file updates (Gregg)
- o Source code cleanup (Gregg)
- o Icons update appropriately with drive flag changes (Steven)
- o Avoid restoring directory windows for no prescan drives (Steven)
- o Avoid hangs when viewing zip content and running viewer as child
- o Honor NOPRESCAN flags for drives left open on exit
- o Refresh tree container drive icon after prescan enable
-
-3.05beta07
- o Support additional file systems types (Gregg)
- o Reorganize menus (Gregg)
- o Enhance unzip option controls (Gregg)
- o Remember search options in Seek and Scan (Gregg)
- o Allow drive flag editing for not ready drives (Gregg)
- o Correct bitmap loading defects (Steven)
- o Update documentation (Gregg)
- o Add newer, better bitmaps (David)
- o Update Readme to discuss move to Netlabs (Steve)
-
-3.05beta06
- o Put .. back in walk list - oops
- o Correct walk directory list build regression - oops
-
-3.05beta05
- o Rework session termination logic - avoids hanging zip windows and others
- o NDFS support by Gregg
- o Default seek and scan to show files
- o Rework menus
- o Correct . and .. compare logic to not skip .dir and ..dir
- o Correct compare directories . and .. skip logic to not skip .dir
- o Association editor fixes by Gregg
-
-3.05beta04
- o Change to standard F1 Help hotkey by Gregg
- o Association editor enhancements by Gregg
- o Commands editor enhancements by Gregg
- o Avoid spurious error popups
-
-3.05beta03
- o Help file updated by David
- o Avoid toolbar bitmap edit exception
- o Toolbars reworked by David
- o Add more missing fm3.hlp dependents to makefile
- o More great bitmaps from David
-
-3.05beta02
- o Disable conflicting menu options while collector busy
- o Integrate Gregg Young's partition format enhancements
- o Integrate John Small's switch list title logic
-
-3.05beta01
- o More great bitmaps from David
- o Avoid cascading messages when collector file list is a binary file
- o Rework some error messages
- o Add unlock.exe to commands template
-
-3.04
- o Recover corrupted finger pointer
- o Allow quick abort of large archive open
- o Open large archive containers at idle priority
- o Update archiver usage help (thanks Gregg)
- o Expose internal errors to user rather than just beeping
- o Check and report more "should not occur" errors
- o More new icons (thanks David)
- o Allow vcollect applet to die on window close
-
-3.04 pre11:
- o Add hide not selected to Compare Directories
- o Add compare content to Compare Directories
-
-3.04 pre10:
- o Allow non-null terminated archive signatures
- o Preserve archiver.bbs comments
-
-3.04 pre9:
- o Add archiver definition add/delete/move support
-
-3.04 pre8:
- o Avoid toolbar window list trap (action 9010)
- o Avoid internal editor file corruption when wrap on
-
-3.04 pre7:
- o More archiver.bb2 template rework
- o Correct archiver window date/time suppress logic
- o Clean up archiver.bb2 loader
- o Minor makefile corrections
-
-3.04 pre6:
- o Correct typo in MakeValidDir() - avoid drive button RMB trap
-
-3.04 pre5:
- o Support archivers with no list headers (tar)
- o Support archivers that only extract with directories (tar)
- o Disable menus for not ready volumes
- o Correct missing collector view button window updates
- o Correct fallback logic in MakeValidDir()
-
-3.04 pre4:
- o Correct longnames display enable
- o archiver.tmp (archiver.bb2) updated and optimized
- o Support archiver.tmp install
-
-3.04 pre3:
- o Support jfsopt.cmd install
- o Support tarlist.cmd install
- o Ensure install.cmd updates fm/2 Desktop folder icons
- o Support empty signatures in archiver.bb2
-
-3.04 pre2:
- o More icon updates (David's v18)
- o Avoid user directory edit crash
- o Avoid crashing if archiver.bb2 entry has no signature
-
-3.04 pre1:
- o Avoid commands menu do it yourself trap
- o Correct filesystem type details view column selections
- o Rework resource kit into standard makefiles
- o Replace bitmaps and icons (thanks to David Graser and others)
- o Add JFS optimize support (thanks to Gregg Young)
- o Avoid Directory Sizes hangs
-
-3.03:
- o Rework resource kit and reskit readme
- o Correct directory sizes sort
- o Correct archive sort again
-
-3.02i:
- o Rework Databar to avoid delays for inaccessible volumes
- o Lots of work on large file support
- o Switch to VAC 3.65
- o Correct name parsing in collector and archive containers
- o Output popup error messages to stderr and to screen
- o Correct archive container initial sort setup
- o Avoid startup trap in FindSwapperDat (VAC3.65 compat)
- o Correct reversed wrap menu in new viewer
- o Misc VAC3.65 compat rework
- o Avoid referencing garbage in collector
- o Resolve some icon selection inconsistencies
-
-3.02h:
- o Show full target path in Drag/Drop dialogs
- o Add debug support to troubleshoot invisible FAT32 drive
- o Correct archiver.bb2 editing
-
-3.02g:
- o Update removable drive support to work for USB MSD
-
-3.02f:
- o Add large drive support to the dirsize applet startup screen
- o Avoid spurious filldir errors for large drives
-   Will still get get math errors for >4GB directories
-
-3.02e:
- o More see all files fixes
- o Correct internal viewer WM_VSCROLL logic (amouse)
-
-3.02d:
- o Clean up icon usage
- o Add missing refresh after compare subdir toggle
- o Try to avoid playing non-MM files when use MMOS2 enabled
- o Rework directory sizes for large drives
- o Correct Show All Files requests from Tree View context menu
- o Correct resource strings
-
-3.02c:
- o Correct broken assignments
- o Force Compare Directories window refresh on subdir toggle
-
-3.02b:
- o Add JFS and FAT32 support
-
-3.02a:
- o Replace corrupted remote.ico.
- o Correct archive name display
-
-3.02:
- o First open source release.
-
-3.01:
- o Added another archiver date type for user Jans-Peter Otto.
-
-3.00d:
- o FM/2 Lite remembers if a directory pane was maximized when it
-   closed now (duh -- should have all along, I just forgot).
-
-3.00c:
- o More minor bug fixes.
-
-3.00b:
- o Fix two minor bugs reported by users.
-
-3.00:
- o Most of the text in FM/2 is now accessible from outside the source
-   code files, meaning translations to other languages should now be
-   possible without much problem.  A resource translation kit is offered
-   free-of-charge to registered users.  This required some additional
-   files (FM3RES.DLL and FM3RES.STR), but FM3DLL.DLL becomes (at least)
-   correspondingly smaller.
- o Jazzed up Autoview a bit.
- o Removed a bug that sneaked in during code optimization detected by
-   a user where archive members couldn't be dragged.  Then optimized
-   some more, thus tempting fate.
- o Improved FM/2's internal window selection from menus.
- o The status button in Directory Containers that shows the selected
-   number of files and bytes now displays a select menu when clicked.
- o Drive buttons will now show free space on drives as bubble help
-   except for CD-ROM drives, diskette drives A: and B:, and drives
-   marked as "slow" in the drive flags dialog.  I also made the buttons
-   a little bigger, and they'll "stack" if required due to insufficient
-   width.
- o Removed System Information applet from FM/2 -- OS/2 seems to have
-   this stuff built-in now.
- o Moved MakeArc into the FM/2 Utilities package.
- o You can now add selected environment variables that list directories
-   (like PATH, LIBPATH and DPATH) to the Drive Tree with a toggle in
-   the internal Settings notebook on the Tree page.  Cool.
- o You can now set a default Target directory for menu and accelerator
-   key copy and move operations, and choose to confirm (and perhaps
-   change) that directory on each operation, or accept it without
-   confirmation.
- o FM/2 will now make program object Parameters suggestions the first
-   time it's run (no FM3.INI exists) if you should exclude any drives,
-   and will even set the Parameters for you if you like.
- o Yet more tweaking that no one will ever notice...
-
-2.67:
- o Jazzed up the mini-command line a bit.
- o Command lines for the Execute dialog and mini-command line are now
-   saved separately (the former in CMDLINES.DAT, the latter in
-   CMDMINI.DAT, same format).  You can save, or not, either type for
-   recall.
-
-2.66:
- o Increased duration of error window to 5 seconds from 3 (click it to
-   make it vanish early), changed background color to white and text
-   color to dark red, surrounded with red rectangle to make it stand out
-   more.  Also gave it a distinctive sound.  (This is the error window
-   you get if you do something like try to open the diskette drive when
-   there's no diskette inserted.)
- o Killed bug reported by Paulo Mario where FM/2 could crash (suddenly
-   exit) after moving a file and overwriting an existing file.
- o Reworked Databar a bit.
- o For the adventurous among you, try holding Shift or Ctrl while
-   clicking that second status window in a Directory Container...
-
-2.65:
- o You can drag an object onto the Drive tree's Open button now, and
-   a Directory Container for that object will be opened.
- o Long-overdue code cleanup begins...
- o Fixed bug in FM/2 Lite where it was sorta paying attention to the
-   "bottom buttons" setting in FM/2 when it should ignore it.
- o Played with FM/2's default settings for new users -- some of the
-   best stuff was turned off by default!
- o Changed the behavior of the Rename dialog somewhat per user
-   suggestion.  "Overwrite if target older or same," "Overwrite if
-   target newer" and "Don't ask again" checkboxes now allow you to
-   selectively skip being asked about naming conflicts for the rest of
-   an operation.  Note that clicking the "Okay" button honors these
-   choices, but the "Overwrite" button overrides them for that one file
-   (an overwrite _will_ be performed).
-
-2.64:
- o Made Window->Tile a cascade menu with Tile as the default, but you
-   can also set Autotile and Tile backwards toggles (renamed Tile
-   horizontal) there.
- o More help file work.
- o Tweaking of a few things no one will ever notice, except perhaps
-   as a feeling of more smoothness in a few places.
- o Added "Leave all attrs" button to Attributes dialog to make
-   "touching" files easier.
-
-2.63:
- o Fixed bug in UNDEL.EXE pointed out by a user.
- o Added "Double-click" topic to Tutorial section of help.  Did you know
-   that you can make FM/2 do something different when you double-click
-   an object?  Other miscellaneous work on the help file.
- o Moved "Create shadows" command under "Copy" cascade in menus where no
-   separate "Create objects" cascade is available and a "Copy" cascade
-   is available.
- o Made the way menus appear on new View and Sort buttons more
-   attractive (IMHO).
- o Bubble help won't appear if the window isn't active now (oversight).
- o To make it easier to parse the saved output from a Directory sizes
-   window, directory names containing spaces are now surrounded by quote
-   marks.
- o Related:  Put SEEHELP.EXE into FM2UTILS.ZIP for those who have
-   versions of OS/2 with VIEW.EXEs that won't read .HLP files directly.
-   You can read the FM/2 help file directly using this program on such
-   systems:  "SEEHELP FM3.HLP".
-
-2.62:
- o Added /SAVE and /NOSAVE to mini-command line options for a user.
-
-2.61:
- o Added new buttons to Directory Container, Archive Containers and the
-   Collector that allow you to set sort, filter and view.  Removed
-   filter button from bottom of screen (no longer needed).  Revised
-   window layouts help to show modified layouts.
- o More newuser-friendly junk (more bubble help, etc.).
- o Added Find first/next to INI viewer.  Listbox command will work in
-   is bordered in red.
- o Just a BTW -- there's a new IMAGE.EXE (the FM/2 image viewer utility)
-   in FM2UTILS.ZIP, available free-of-charge at
-   http://www.bmtmicro.com/catalog/fm2
-   I put some stuff in it that I needed for making pictures for the help
-   files.
-
-2.60:
- o Fast internal viewer can start configured editor from menu (Ctrl + e
-   accelerator) per user request.  Remember, to edit files in an
-   archive, you must still use Files->Refresh to cause selected files to
-   be refreshed in the archive.
- o Added a bit more bubble help (remember, you can turn bubble help on
-   and off (somewhat selectively) in the internal Settings notebook).
-
-2.59:
- o Rename dialog will now specifically tell you if the source file is
-   newer, older or same date as target and smaller, larger or same size
-   if there's a conflict with an existing target file, per user request.
-
-2.58:
- o Added ability to create a new directory and switch to it in the
-   common directories user list (select <New directory>).  Revised
-   help to reflect this.
- o Holding down Shift while selecting a state name will prevent FM/2
-   from closing windows already open now (per user request).  An
-   automatic retile of all windows is then performed.
-
-2.57:
- o Added ability to sort by subject per user request (wouldn't it be
-   nice if Netscape put where we got downloaded files from in an EA?  Or
-   let you drag a file over it without locking up the system?).
-
-2.56:
- o Added ability to use exclusion masks in the Seek and Scan dialog
-   per Harry Travis' request.  Also added Append checkbox.
-
-2.55:
- o Fixed bug reported by Ralph Alvy -- "Append" checkbox being ignored
-   in Save to listfile dialog, FM/2 always appended to listfile.
-
-2.54:
- o Small tweaks.
- o I don't do Compuserve anymore.  Reach me via the net, or just go to
-   FM/2's web page at http://www.bmtmicro.com/catalog/fm2
-
-2.53:
- o Added Commands user dropdown list for picking commands to run on
-   selected files more quickly and easily.
- o Removed "#" character from AV/2 temporary directory -- WebEx and
-   Netscape were choking on it (a).
- o Allow disabling FM/2's custom file dialog so you can use MSE's
-   instead, if you like (the toggle's on the General page).  (What's
-   MSE?  Look at http://www.bmtmicro.com/catalog/mse) (a).
- o Added support for PKZIP 2.50 (b).
-
-2.52:
- o When the FM/2 main window is resized and a Directory Container is
-   maximized within it, it will remain maximized.
- o Modified AV/2 and ARCHIVER.BB2 so that RAR v2's woefully NIH
-   listings can be read.  Would it just _kill_ you archiver authors to
-   get together and come up with some sort of easily parsed listing
-   standard, then stick to it?  Please?
- o FM/2 will now show the current decryption keyword for extra programs
-   like DBFVIEW and FMT from the About box.
-
-2.51:
- o Tweaked image viewer initial sizing algorithm to better handle very
-   small bitmaps at more nearly correct perspectives.
- o Added "No folder menu" toggle to internal Settings notebook by
-   user request.
- o Put floppy letters back into drives userlist dropdown due to
-   user request.
- o Made image viewer a separate executable due to a memory leak in
-   OS/2's MMPM/2 (mmio) under Merlin beta and some Warp 3 fixpack
-   configurations -- closing the application frees the memory, but
-   nothing else will, so a small, fast, separate application "fixes" the
-   problem (or, if you prefer, "OS/2 bug").  Like FM2PLAY.EXE, this
-   IMAGE.EXE file will now be in the FM/2 Utilities package (FM2UTL.ZIP
-   on CI$ or FM2UTILS.ZIP on the internet).  You'll probably want to
-   remove any old IMAGE.CMD file built by previous FM/2 installs.
- o Added ability to view and manipulate files in archives containing
-   spaces in the filename for archivers that provide information in a
-   particular way (see ARCHIVER.BB2 -- ZIP and LZH archives are set up
-   this way).  Other folks who use ARCHIVER.BB2 should take a look at
-   the updated documentation to see how to take advantage of this, but
-   it's backward-compatible, so old versions of those programs will
-   still work correctly with this change.
- o Removed SEEHELP.EXE -- Warp has the ability to view help files using
-   VIEW.EXE which comes with the OS.
- o Added "WPS Move" and "WPS Copy" commands.
- o I no longer accept registrations via direct mail.  Registrations are
-   available through BMT Micro or CIS' SWREG only (BMT recommended --
-   see REGISTER.TXT).  I just got too much snail mail and couldn't keep
-   up with all of it.
-
-2.50b:
- o Added ability to convert an image file to another format from the
-   image viewer window.
- o All supported multimedia types are now "played" automatically on
-   double-click unless you have an FM/2 Association set for them.
-
-2.50a:
- o Added "Run Viewer as child session" toggle -- if used, any open
-   viewers will close when FM/2 closes.
- o Added "Env" button to Seek and scan dialog (for searching through
-   directories listed in environment variables).
- o Added "No sort" option to Collector sorting.
- o FM/2 will now offer to remove old registration when started after
-   registration has expired, making it easy to enter updated
-   registration information.
- o Directory Containers can now be switched into Tree View.  See also
-   new "Stay in Tree View" toggle.
- o B2 on Directory Container Folder buttons pulls up an abbreviated
-   popup menu.
- o Bugfix:  The Autoview window wouldn't let you enter Comments on an
-   object that didn't already have them (duh).
- o FM/2 now taps into MMPM/2 to display image files, instead of GBM.  To
-   activate FM/2's "internal" image file viewing, be sure to remove any
-   Associations for MMPM/2-supported image file types (JPG, TIF, BMP,
-   PCX, GIF, etc.) using FM/2's Config->Edit Associations command.
-
-2.50:
- o Added a horizontal scrollbar to Global files viewer.
- o Added line wrap (and thus horizontal scrollbar) to fast internal
-   viewer.
- o Added WWW and FTP component launching to internal viewers per
-   user request.  BTW, testpm.exe from the FM/2 Utilities is handy for
-   deciphering the arguments to FTPPM.EXE, which are a bit bizarre and
-   undocumented.  Just rename FTPPM.EXE to FTPPM.BAK, copy TESTPM.EXE
-   to FTPPM.EXE in the same directory, open the FTP object's Settings
-   notebook, then open the FTP object's program and compare the
-   results.
- o Added optional blue/yellow LEDs which can be used in place of the
-   default red/green thread LED bitmaps.
- o Added a toggle to make the databar boring for those who can't stand
-   too much excitement (I have users who are easily worn out :-).  Also
-   added file system type to end of string on user request.
- o Execute dialog will try to remind you why you called it up in case
-   you fall asleep after double-clicking the mouse and awake confused.
-   It could happen.
- o Couple of more small workarounds for Merlin beta bugs.
- o Changed the way the toolbar displays help to eliminate capturing
-   the mouse (kludge, OS/2 should have a WM_MOUSELEAVING message).
- o Added mini-toolbar to fast internal viewer.
- o Note new internet address.
- o Price reduction for commercial registrations.
- o SET environment variable DOS_SHELL in CONFIG.SYS if you want to use
-   an alternate command processor in DOS sessions (for example,
-   SET DOS_SHELL=C:\4DOS\4DOS.EXE).
- o Remap command now uses NET USE, enhancements (like it works, for
-   one :-).
- o Added Miscellaneous->Detach (Ctrl + H) command to Drive Tree drive
-   popup to detach local drives from remote resources.
- o Updated FM2PLAY.EXE (in FM2UTL.ZIP on CIS, FM2UTILS.ZIP elsewhere),
-   including more controls and ability to load list of files from a
-   listfile.  FM/2 will use this listfile method when playing more
-   multimedia files than will fit on a command line using the
-   View->Multimedia (Ctrl + l) command.  OS/2 command lines are
-   limited to about 1000 characters, if you're interested.
- o Lots of other little tweaks and improvements -- some you might
-   even notice.
-
-2.49:
- o More cosmetic tweaking -- for example, changing status line or bottom
-   button text font will now result in resizing of control to match new
-   font.  BTW, if you set ugly fonts or colors and want the defaults
-   back, one way to do it completely is to delete the window position
-   entry in OS2.INI and start from scratch...
- o Work around for nasty bug in Merlin beta Voice Manager.
- o Remap drives command added -- untested at this time, as I have no
-   LAN.  If you try it and it doesn't work, please report the error
-   code displayed.  If it works, let me know that, too.
- o Fixed bug in Merge code.
- o Added mini-toolbars to Archive Containers and the Collector (visible
-   only if you have the toolbar in FM/2 turned on, of course).
- o A couple of other little things folks asked for -- I forget.
-
-2.48a:
- o Lots of cosmetic stuff (for example, check out the Databar).
- o Additional help, partitioned Context menu help into smaller "chunks."
- o Added Find button to Archive dialog.
- o More Merlin preparations.
- o Added UserDirs dropdown to standard OS/2 file dialogs used by FM/2.
- o Added Duplicates command to Global file viewer.
- o More (subtle) tweaking of Seek and Scan dialog.
- o Anybody else notice how the competition is trying (in vain) to
-   copy FM/2, but having a great deal of trouble keeping up with
-   the Joneses?  :-)
-
-2.48:
- o Ideal size button logic adjusted so it will work as might be expected
-   with Merlin's new Warpcenter.
- o Logic for sizing of titlebar buttons adjusted so they look better
-   under Merlin.
- o Fixed bug in EA editor's MLE control -- an apparent change in the way
-   Warp handles the MLM_QUERYFORMATTEXTLENGTH with an overlong length
-   parameter has changed, resulting in the MLE not being cleared properly.
- o Autoviewing file comments (.COMMENTS EA) now displays the comments in
-   an MLE rather than static text control, allowing editing.  Moving the
-   focus from the MLE after making a change saves the new EA.  Note:  if
-   a .COMMENTS EA is damaged, FM/2 won't let you edit it in this window
-   for safety (maybe some strange program wanted it that way).  You can
-   fix it in the EA viewer (Ctrl + Shift + E) if you know it's an anomaly.
-   Use the Ctrl + Tab accelerator key to switch focus to the Autoview
-   MLE if you're keyboarding.  FM/2 supports .COMMENTS EAs up to 32767
-   characters in length.  Each line of the MLE (newline, not wrap)
-   creates a separate EAT_ASCII value, in case you care and know what
-   the heck I'm talking about...  BTW, GCP downloads automatically fill
-   in the .COMMENTS and .SUBJECT EAs for you if so configured, though
-   it seems to save the .COMMENTS EA in a weird (different from the
-   WPS) format -- but it's readable.
- o You can use command line switch -<ininame> to start FM/2 with a
-   different INI file (i.e. "FM3.EXE -C:\MYINI.INI").  This means
-   that different users can set up FM/2 to taste and use separate
-   FM/2 objects to start their "version" of the program on the same
-   machine.
- o FM/2 will try to remind you why the Walk directories dialog was
-   invoked, per forgetful, worn-out user request.  :-)
- o Keys help added per user request.
-
-2.47:
- o Added "View->As archive" context menu option per user request.
- o Added maximize/restore button to "FM/2 Lite" Directory Containers.
- o Added Autoview window to "FM/2 Lite."
- o Added "View archive" button to Archive List Error window.
- o Fixed bug -- Ctrl + F7 not bringing up context menu with Sort
-   submenu selected.
- o Jazzed up direct renaming of files and directories.
- o Jazzed up Seek and Scan dialog per user request.
- o AV/2 will now accept wildcarded filenames and view the first matching
-   file in whatever manner seems most appropriate.
- o Delete key deletes files, Ctrl + Delete is permanent delete, Shift +
-   Delete is save to clipboard, Ctrl + Insert is make directory, Ctrl +
-   Pageup is parent directory, Ctrl + Pagedown is previous directory,
-   Ctrl + Home is root directory.  Obviously, not all these keystrokes
-   are meaningful in all windows (for instance, parent directory doesn't
-   do anything in the Collector).  These new shortcut keys are in
-   addition to existing accelerators.  Applicable windows (see previous
-   caveat): Directory Containers, Drive Tree, Archive Containers,
-   Collector, Global files windows.  Per user request.  These are not
-   "real" accelerator keys as they tend to bleed through and mess with
-   normal interactions (even these bleed through here and there, but
-   it's benign), but hopefully you'll never notice the difference.
- o In "FM/2 Lite," you can direct-edit the title of a Directory
-   Container to change directories.
- o Install now accepts /UNATTENDED argument to run without asking any
-   questions.
-
-2.46:
- o Fixed drive button bug.
- o Added "FM/2 Lite" (or whatever you want to call it), a new
-   "personality" for FM/2 intended for those who can't deal with
-   the real thing.
-
-2.45:
- o When selecting or deselecting by mask, you can specify a text string
-   to be used.  First the file is tested against the mask(s), then
-   tested to see if it contains the text (if any is specified).
- o Fixed bug -- context menus quit working after a Directory Container
-   was closed.
- o Added Makearc module, mainly for access from NTree.
- o Fixed bug -- "case sensitive" flag was being reversed for Seek and
-   Scan.
-
-2.44:
- o "Thread busy" LED added per user request.
- o Toolbar buttons now allow you to use different bitmaps of your own
-   design.  Notes:  using user-defined bitmaps in the toolbar can slow
-   loading of FM/2 slightly, but probably not noticeably unless you
-   replace all of them.  Request a context menu on a toolbar button and
-   pick "Edit button" to get the dialog where you tell FM/2 to use a
-   user-defined bitmap.
- o External Archive Containers, Collector, VTree and VDirs now have
-   their own pulldown menu for Files and Views (the shadow menus) and
-   Help for easy keyboard access and/or novice users.
- o Command lines executed through the command line dialog are remembered
-   for possible later retrieval.
- o Directory sizes dialog reworked (prettier, sizeable).  DIRSIZE.EXE
-   program provided for accessing this function directly (object placed
-   in FM/2 Tools subfolder by INSTALL.CMD).
-
-2.43:
- o Added optional drivebar per user request.
- o Added Lock and Unlock commands for removable drives.
- o Added UUDecode command and Merge command (yep, got another internet
-   connection, finally).
- o When presented with a list of objects in a dialog (as in the Edit EAs
-   or Attributes dialogs), double-clicking a file object will bring up
-   the configured viewer with the file loaded.  This is just a quick
-   view purely for convenience; no attempt is made to view the file as
-   an archive or check Associations.  You can double-click it in the
-   Directory Container if you need to go that far.
- o Added "Thread notes" window -- if you don't like it, minimize it and
-   it should stay that way.  When a thread does something that takes
-   awhile, like copying a file, it tells you when it starts and when
-   it finishes.
- o Under Warp, FM/2 will now query the active desktop in a documented
-   manner when asked to create objects.  There is no reliable method
-   under older OS/2 versions.
- o Improved FM/2's built-in printing somewhat.  Still not as good as
-   printing from the appropriate application, of course.
- o Confirmation lists will now display a bitmap representing the command
-   to be executed on the dialog, where applicable, as a quick visual
-   reminder.
- o When switching a Directory Container to the parent, FM/2 will
-   make the vacated directory's object the current object.
-
-2.42:
- o More threading in strategic spots to make response when moving around
-   really slow drives (like ZIP and EZ drives) snappier.  The drivers
-   for these drives need a bit more work, developers -- think "cache,"
-   especially for things like providing the label and usage info.  When
-   it's slower than the floppy drives, some work needs to be done, eh?
- o Edit->Drive flags dialog now available from a drive (root dir) object
-   in the Drive Tree -- lets you set flags you used to _have_ to set
-   from the command line (and a couple of new ones).  You can still set
-   flags from the command line as an override.
- o Files can be included in the Drive Tree display on a per-drive basis
-   if you can actually think of a reason to do it (I can't, but someone
-   asked).  If you do find a use for it, tell me what the heck it is.
- o See all files can be invoked on directory (folder) objects
-   (Miscellaneous->Show all files) or the directory into which a
-   Directory Container looks.
- o See all files window and Collector now have new "Move and preserve"
-   and "Copy and preserve" commands to move or copy objects while
-   preserving their directory relationship (see online help for
-   examples).
- o Double-clicking on an empty part of the Drive Tree now invokes the
-   Make Directory command.  Double-clicking on an empty part of a
-   Directory Container opens its WPS folder.
- o Target of a drag and drop operation can be changed from the FM/2
-   drag and drop dialog (if you're using the dialog, of course).
- o Improved directory comparison dialog (no, it's still no PMDirMatch
-   and never will be, and yes, you can still tell FM/2 to use PMDirMatch
-   instead of the internal).
- o Added Utilities->Compare directories command.
- o Sorting an Archive Container by date is now possible, at least for
-   some archive types.  See ARCHIVER.BB2 for details.  You can also
-   Alt-B1 click the titles of sortable fields in Archive Containers now
-   to change the sort type (just like you can in a Directory Container).
-
-2.41:
- o VTree now runs Directory Containers (VDirs) as part of its process,
-   which should save on a little memory for those of you using FM/2 as
-   as "super drives objects."  To take full advantage of this, the
-   "Separate parameters" toggle should be checked.
- o External FM/2 windows can be closed from the PM Window List without
-   closing the entire program (excepting the main window, of course).
- o Fixed bug:  last line of a hex view wasn't formatted very
-   attractively.
- o Fixed bug:  quick config page didn't work right anymore.
- o Fixed bug:  VDir and AV/2 windows would show external FM/2 windows
-   but not switch to them.
- o Window dialog now shows and acts on external FM/2 windows.
- o Checking "Separate parameters" toggle now saves all parameters
-   under the new appname immediately when the Settings notebook
-   is closed.  You'll want to be careful here -- think before choosing.
-   BTW, a backup of your FM3.INI file, once you get it set up to your
-   liking, is always a good idea.  Don't use FM3INI.BAK as the filename,
-   since FM/2 automatically does a one-generation backup to that name.
- o Warp no longer allows a container item to be hidden by a thread other
-   than the thread that controls the container if the item is selected
-   (Why?  Who knows?  Why don't DrgQueryDraginfoPtrFromDragitem() and
-   CN_DROPHELP work?). Since this forces single threaded hiding of
-   objects, I must conclude this is a bug in OS/2.  However, since it's
-   in "GA" OS/2 code, I reluctantly worked around it by making Hide
-   objects single-threaded -- you'll have to wait for it to get done.
-   Shouldn't be a major problem.
- o Added codepage 1004 to codepage dialog.  Someone asked, I didn't even
-   know the blamed thing was there.
- o Added Ctrl + F10 and Ctrl + F11 accelerators to start/end a direct
-   edit of a filename for the rodently challenged.
- o Added Next/Prev blank line menu items and buttons to new internal
-   viewer (accelerators were there before).  In text where paragraphs
-   are separated by blank lines, these go down or up to the next
-   paragraph.  Something I use.
- o Added Recent Directories dropdown list to Walk Directories dialog,
-   which separates the recently used directories from the user-defined
-   directories in that dialog.  Just wanted to.
- o Added "DOS-think" and "Windoze-think" quick-config options to
-   internal Settings notebook. If you use 'em they'll stunt your growth.
- o Fixed an obscure tile bug no one else seems to have noticed.
- o Changed Shift + F? accelerators to Ctrl + F? to avoid conflicting
-   with a couple of OS/2-used keys.
- o Further tightened integration between VTree and its Directory
-   Containers.
- o Made Tree (optionally) smart.
- o Reorganized internal Settings notebook for more "logical" grouping
-   (some things grow with a life of their own).
- o Changed Install so that it puts many objects in a separate Toolbox
-   folder (someone who's not even registered suggested it, and I decided
-   to give it a try -- tell me what you think.  If upgrading, delete the
-   old FM/2 folder before running Install again.).
-
-2.40:
- o Added "All" button to Filter dialog.
- o Added more optional buttons to main window.
- o Added %u/%U metastrings.
- o Added hex/ASCII + drag-me window to bottom of new internal text
-   viewer.
- o Added %! metastring.
- o Added default archiver setting.
- o PM uses several ALT + F? accelerators to control frame windows.
-   However, this applies to the current frame window, which can be
-   within the main FM/2 window when run monolithically.  Add Ctrl to
-   these accelerators to affect the main window in that case.  I don't
-   change the system menu text to reflect this as it may be in a foreign
-   language, and I'm an ignorant, ugly one-language American.
- o Added "Separate parameters" toggle.
- o Added "Treetop on expand" toggle.
- o Windows pulldown now lists external FM/2 windows, as does a submenu
-   on the container popup in VTree, VDir and AV/2 windows.
- o Fixed some minor bugs in Commands menu generation.
- o Fixed bug in Collector -- unshifted double-click didn't work on
-   directories.
- o VDirs, external Archive Containers and Viewers now retain their last
-   set window size -- position is still determined by the Shell (PM).
- o Lots of little tweaks no one but me will ever notice.
-
-2.39:
- o Fixed weird bug -- apparently IBM changed the behavior of
-   MLM_QUERYFORMATTEXTLENGTH in Warp.  This change may only take effect
-   at FP10+ levels.
- o Added Open Directory Container button to Drive Tree titlebar -- only
-   shows up when FM/2 is run as a monolithic app.
- o Added "Directory" attributes to Filter dialog per user request --
-   lets you exclude directories from Directory Containers, or show only
-   directories.  NOTE:  if you are upgrading, you may need to go into
-   the Filter and turn on the Directory attribute -- it's on by default
-   for new installations.  Use the internal Settings notebook to
-   activate the Filter dialog (DirView and ColView pages) by setting the
-   focus to the Filter: entryfield, so that the "general" filter is
-   changed.
- o Help file improvements (a never ending saga).
-
-2.38:
- o Walk Directories dialog will now display non-writable drives unless
-   the directory selection is for an action that requires writing to the
-   selected directory (for example, copy or move, set extract directory,
-   etc.).
- o Filtering in Drive Tree now available, per user request.  NOTE:
-   filtering is performed _after_ expansion; therefore, it is possible
-   for the Tree to "lie" to you until you expand a branch (i.e. indicate
-   that other directories are available, but remove the "+/-" when you
-   attempt to expand the branch.  If it's important for you to know what
-   the entire tree of a drive looks like with filtering applied, use the
-   Expand/Collapse->Expand command from the Files menu or a popup.  You
-   can thereafter collapse and expand the tree as desired.  Tricks can
-   be played with the filter mask; for instance, "/C:\OS2*;/C:\MMOS2*;
-   /C:\TCPIP*;*" will exclude some system directories on drive C: and
-   show everything else.
- o Got rid of the annoying (to me, anyway) extra refresh when the
-   "Immediate Updates" toggle is not used (more cheating).
- o Windows will now be created with the WS_ANIMATE style if "Animate"
-   toggle on internal Settings notebook's Windows page is checked.  Of
-   course, system animation must still be turned on to see any effect.
- o Keyboard input of "standard" characters now performs a text search
-   to find the closest matching file system object in the container.
-   You can get the old (OS/2 default) behavior (move to nearest object
-   starting with the pressed letter) by holding down the shift key.
- o When a background task that FM/2 is waiting on takes more than about
-   two seconds to complete its job, FM/2 will switch it to the
-   foreground.  This means that if an archive is encrypted (passworded),
-   you'll get the opportunity to enter a password without having to
-   resort to the Window List to manually bring the window to the
-   foreground.
-
-2.37:
- o Added "Autoview comments" notebook toggle (page 2) and Config menu
-   items for same.  You can have FM/2 autoview file contents _or_
-   .COMMENTS EAs -- handy for looking at files that were downloaded by
-   a package that puts the file description in that EA.  You can also
-   get to that EA on the third page of a WPS object's File page or via
-   FM/2's Edit EAs dialog, BTW.
- o CTRL + Shift + B1 doubleclick opens an object's WPS Settings notebook.
- o You can now link-drag a root directory (drive) from the Drive Tree.
-   For cryin' out loud, BE CAREFUL!
- o Credit card registrations via BMT Micro are now available.
- o Directory Containers can now have independent sorts if you DON'T use
-   the "Immediate Updates" toggle.  When you set a sort (or filter) in
-   the internal Settings notebook, you're setting a default for
-   subsequently created Directory Containers.  When you set a sort (or
-   filter) using the popup menu of a Directory Container, you're
-   changing only that container.  States will now also save the type of
-   view (Icon, Details, etc.), sort and filter settings for each open
-   Directory Container.
-
-2.36:
- o Added "Rename existing" button to Rename dialog -- allows you to
-   rename (move) an existing target file system object out of the way
-   before moving or copying another file system object to that name.
- o Fixed "obscure" bug (reporting user's words :-) causing FM/2 to
-   enter a loop when "Views" cascade was selected from the action
-   bar menu when an internal Archive Container was the current window.
- o Tutorial section added to online help.
- o When a bitmapped graphic file is viewed, the window is sized to fit
-   on the screen even when the image is larger than the screen.
-   Proportion is maintained for the initial window positioning.  You can
-   stretch the size of the window.  The bitmap is scaled to fit. GBM is,
-   of course, still required to directly view images in FM/2.
- o Changed toolbar button help to "bubble" style, added toggle to disable.
- o Added Directory Compare (DirCmp:) field to Files/Dirs page of internal
-   Settings notebook.
- o Added %d and %D metastrings for Commands.
- o Percentages in Directory Sizes dialog more accurate (to nearest
-   thousandth).
- o "Include subdirectories" toggle in Directory Compare dialog.
- o Fixed bug in 2.35a's INSTALL.CMD.  Can you say "duh?"  Apparently I can.
- o As usual, many little things no one will notice.
-
-2.35:
- o Performance tuning.
- o Implemented "minor" user suggestions.
- o Added "Recent Dirs" toggle -- automatically adds temporary
-   directories to UserList as you change directories.  You can make them
-   permanent by Adding them as usual.
- o FM/2 may handle DOS archivers now (actually, it does -- I tested with
-   ARJ); however, you'll have to set them up for yourself and I won't
-   support them.  Don't forget that DOS archivers don't support EAs.
-   AVOID WHENEVER POSSIBLE OR YOU'LL GET BURNED.
- o If you have GBM.DLL on your LIBPATH or in the FM/2 directory, FM/2
-   will use it to display GBM-supported raster file types when they're
-   double-clicked.  GBM currently supports most OS/2 and Windows
-   bitmaps, .GIF, .PCX, .TIF, .TGA, .IFF, .VID, .PGM, .KPS, .IAX, .XBM,
-   .SPR, and .PSE files.  And it's free.
- o Changed some icons around for a fresher look, added some for display
-   when you aren't loading icons from disk (for scanning speed).
- o Added "Settings" button to Info dialog.
-
-2.34:
- o Added "Tile backwards" toggle, but don't use it (it's a DOS-think
-   knee-jerk thing to do).
- o Viewer won't "restore" the container that called it when it closes if
-   the container is maximized.
- o Filtering speeded up when Autoview window is open.
- o Show a little patch of color beside color names in Colors dialogs.
- o Added "Folder after extract" toggle.
- o Added ^F3 close monolithic app toggle (command id 1111 if anyone's
-   interested).
- o More commands in INI viewer (rename, copy appname/keyname) and
-   enhanced existing Add/Edit INI record commands.
- o Changed method of storing a few things so that they're both easily
-   human editable (for power users) and so they allow me to
-   "preconfigure" some things (for new users).  If you're upgrading from
-   previous versions, there's a CONVERT.EXE that'll copy your old
-   settings to the appropriate format and get rid of old baggage.
- o Added "Userlist switches" toggle to internal Settings notebook.
- o Added "%r/%R" to metastrings.
- o Added "Extract" to drag and drop dialog.
- o Height of autoview window can be changed.
- o More info displayed in drive info dialog.
- o INSTALL is a bit smarter.
- o Added two new buttons on status line -- different behaviors depending on
-   whether you click with B1 or B2 and the shift state.
-
-2.33:
- o Added new internal viewer -- loads files at least five times faster
-   than the old viewer (which is still available via a toggle in the
-   internal Settings notebook).
- o See all files window retains settings, is a bit slicker.
- o Fixed bug -- rename box came up for each file moved/copied.
- o Fixed bug -- FM/2 didn't start right with toolbar turned off.  Weird.
- o Worked around Warp bug -- PM locks up if you select a codepage that
-   hasn't been prepared.  This should be ignored as in previous versions
-   of OS/2, but crashes the system instead (sheesh).
- o Warp apparently still has a 64k limit to what the clipboard can hold.
-   While I could limit what you send to the clipboard, this is (hopefully)
-   one of those limits which will vanish with further updates to OS/2
-   itself, so I'll just caution you about it.
- o Colors are adjustable in See all files windows.
- o Several fonts are available in See all files windows (all fixed width).
- o See all files window allows entering multiple keys to find a file if
-   the keys are entered within one second of each other.
- o System info command made somewhat more human-readable.
-
-2.32:
- o See all files window fleshed out.
- o Added "Viewer outside," "Arcboxes outside," "INI viewer outside" and
-   "Collector outside" toggles to Toggles2 page of internal Settings
-   notebook.
- o Added "Save" button to Directory Sizes dialog
- o Sort type can now be changed in Details view by holding ALT and
-   clicking the title of the field to sort on (assuming titles are
-   turned on and the field is one for which sorting is available,
-   of course).
- o Added toggle to allow user to select default delete type.
- o Added "toolbox" dropdown to user lists.
- o Added sample toolboxes to archive.
- o Info and EA dialogs now include listbox, lets you scroll through all
-   objects instead of popping up for each selected object.  EAS.EXE
-   mini-app inherits this; now accepts multiple filenames.
- o Check list dialogs now allow calling up the Info dialog for files in
-   the list.
-
-2.31:
- o Added "Minimize to databar" toggle, also accessible as a standalone
-   miniapp.
- o Tree remembers directories, once expanded.
- o An individual drive may now be rescanned in the Drive Tree (related
-   to the above).
- o More keyboard shortcuts for the rodently challenged.
- o Drag from recessed text fields in Directory and Archive Containers
-   now possible (drags the directory or archive, respectively).
- o Default Commands command (Do it yourself) added.
- o Extract path can now be assigned "*" meaning "use directory in which
-   the archive resides."
- o More menu compaction (well, you think of a term for it).
- o New "See all files" window (still under construction, but already
-   much faster and very functional, without the standard listbox
-   limitation of 32767 maximum items).  Loads, sorts and displays
-   15,792 files from two local fixed drives in 18 seconds on my
-   486/66DX2 with normal (for me, of course) background load.
- o Fixed buglet in Archive Container status display.
- o More user suggestions implemented.
-
-2.30:
- o I forget.
-
-2.29:
- o Added "Topic" entry field in Bookshelf Viewer dialog.
- o Added "Quick arc find" toggle in Settings notebook; can speed up
-   drag and drop operations on floppy/network drives.
- o Worked around PM bug in custom frame controls.
- o Added "Directory Container state" saving and restoring in a dropdown
-   list (turned on with "Toggle quicklists" under Config menu).
- o Fixed drag and drop bug (couldn't move, duh).  Smartened up drag and
-   drop while I was at it; no sense offering options not really
-   available due to media type (i.e. can't copy to a CD-ROM).
- o Added "Launch" button to drag and drop dialog.
- o Added quick-help for dropdown lists (in status box 2).
- o Added ability to drop onto userlist dropdown to add a directory.
-   Also added popup maintenance menu (add and delete directories to/from
-   list).
-
-2.28:
- o Added optional user directory list dropdown box on main window
-   (maintenance of the list is still performed in the Walk Directories
-   dialog).
- o Added Drives submenu on Drive Tree's views context menu -- select a
-   drive from it and the tree scrolls to show it and makes it the
-   current object.
- o Restricted filename quoting in command lines to absolute essentials
-   -- some programs are broken and choke on quoted filenames.  We
-   absolutely cannot have LIST choking if it can be avoided.
- o Double-clicking a directory in the Drive Tree container will cause an
-   existing Directory Container looking into that directory, if one
-   exists, to come to the foreground rather than opening a new one; if
-   the existing window is minimized, it'll be restored. Ditto for new
-   userlist dropdown.
- o FM/2 can now launch Windows apps seamless -- maybe.  Sheesh, I'd
-   use a DOS app first...
-
-2.27:
- o Added "Move & rename" and "Copy & rename" commands per user request.
-   This extends into the drag and drop dialog (said dialog is now on by
-   default, BTW).
- o Many tiny tweaks that no one will ever notice (for instance,
-   filenames containing "&" are now quoted on command lines where they
-   weren't before).
- o Added EXAMPLE.CMD to archive as an example of how REXX scripts can
-   manipulate files listed in listfiles created by FM/2.  This allows
-   Commands to circumvent the apx. 1000 character limit of OS/2 command
-   lines.
- o Made notification window look more homogenous.
-
-2.26:
- o Fixed stupid new bug in moving files from HPFS->FAT with long
-   filenames.
- o Fixed bug in RemoteBug fix that conflicted with another fix for
-   remote FSD bugs.  I'm getting sick of working around remote FSD
-   bugs -- think I'll just let the LAN folks fix _their_ stuff from
-   now on...
- o Made titlebar of Drive Tree containers respond to request for context
-   menu as if it were container whitespace per user request.
- o Added "Min on dir open" toggle -- a more elegant solution to a taste
-   thing (IMHO) than a user requested feature.
- o Chord on status windows brings up window dialog like it does on
-   client window whitespace.
- o Added "Append to clipboard" command to internal viewer/editor's
-   Edit menu.
- o Moved "Write block" command out of Edit->Blocks submenu of internal
-   viewer/editor to the main Edit submenu as "Copy to file" so it's
-   accessible in readonly (viewing) mode while I was at it.
- o Added informational tweaking to viewer/editor's Edit->Undo menu
-   command.
- o Added "Walk" button to Seek and scan dialog.
- o Added special FM/2 Association command line "<>" to indicate that the
-   default WPS view should be opened for matching files.
-
-2.25:
- o Added "Edit" and "Refresh" to Archive Containers per user request.
- o Added Drag and drop dialog and corresponding toggle per user request.
-
-2.24:
- o Added "Remote bug" toggle since network FSD developers can't seem to
-   consistently produce working DosFindFirst/Next code to save their
-   lives.
- o Undelete enhancements.
-
-2.23:
- o Enhancements to potential dupe finder per user requests and other
-   stuff I thunk up all by my lonesome.
- o Placed "Seek and scan" on the Utility pulldown.  All it does is
-   start the Collector and post it a WM_COMMAND message as though you'd
-   clicked Seek and scan on its context menu.  Maybe even folks who
-   don't read the help can find it now (who knows?).
-
-2.22:
- o Additional detail and options are presented when FM/2 can't figure
-   out how to list the contents of an archive (ARCHIVER.BB2
-   misconfigured or archive bad) via new dialog.  This should make
-   determining what the archive problem is much easier when the
-   inevitable problem arises.
- o Added duplicate file finder to Seek-and-Scan dialog.  Finds files
-   with same name and/or size and filedate.
-
-2.21:
- o Shift and CTRL modifiers for double-clicking objects in Drive Tree,
-   Directory Containers and Collector implemented.  Shift causes new
-   FM/2 window to open (directories; direct to View for files), CTRL
-   causes default WPS open.
- o More stuff in the help file (sheesh -- this has gotta stop).  The
-   online help should now make a rather complete manual when printed
-   together with the READ.ME file (see READ.ME for suggestions).
- o INSTALL now makes an object for the online help so that it can be
-   viewed without starting FM/2 (using SEEHELP.EXE, included).
- o Added Filter "Always show directories" toggle.
- o Ideal size button supports a psuedo-restore operation, allowing
-   toggling between two sizes (mine and yours).
- o Other stuff I forget.
-
-2.20:
- o Fixed stupid bug that made FM/2 freak out on restart if you turned the
-   toolbar off and left it off (duh).
- o Move-drag onto archives allowed now (if you have the archiver for that
-   archive type configured to allow moving files, of course).
- o Fixed bug in longname<->shortname conversion (FAT<->HPFS).
- o Found a nasty way to get Warp's printer objects to recognize FM/2's
-   D&D.
- o Extract dialog can be told to remember its settings (extract directory,
-   masks, "with directories") distinctly from those set in Archive
-   Containers.
- o Added a few pictures to the online help for extreme novices.
- o Added new "Compare Select" submenu with commands that can make
-   selections based on comparing unfiltered files in all open Directory
-   Containers.  Powerful stuff.
- o Added "Hide objects" command (selective individual object filtering).
- o Fixed bug -- drag to toolbar quit working when toolbar code rewritten.
- o Slight modification to ARCHIVER.BB2 -- -1 for filename position means
-   to use the last "field" of an archive listing for the filename.
- o FM/2 is compiled with optimization turned off now -- caught it
-   generating bad code in the new Compare Select module and don't trust
-   it (again).
-
-2.19:
- o Added "Ideal size" System Menu command and titlebar button -- an
-   alternative to maximizing.
- o More work on help file hypertext links using suggestions from a
-   registered user.  Added a labeled bitmap showing the layout of FM/2
-   windows.
- o Worked around weird bugs in Sizes and deleting toolbar buttons that
-   shouldn't be bugs but nonetheless cause problems on some machines.
- o Added some one-line help fields to some dialogs to guide the user
-   along.
- o Added the "Close" checkbox to the Edit Associations dialog, to allow
-   executing an association to shut down FM/2 (or a VDir window, mainly
-   for use by folks using FM/2 to replace the Drives objects).
- o Added "Start Minimized" and "Start Maximized" buttons to the Windows
-   page of the Settings notebook.  FM/2 starts normal size then adjusts
-   (that lets it size all its windows right first, and gives you something
-   to return to from the maximized state).
-
-2.18:
- o Added ability to use the undocumented DosQProcStat API in the Process
-   Killer.  While this will enable the Process Killer to work without an
-   English version of PSTAT.EXE being present, DosQProcStat is an API
-   subject to change by IBM, so beware.
- o Added FATOPT.EXE program to optimize FAT drives.  THIS IS A BETA
-   PROGRAM AND USES LOW-LEVEL DRIVE ACCESS -- BACK UP BEFORE USING!
- o Tweaked the online help, adding more hypertext links and detail.
-
-2.17:
- o Optimized for speed:  Quick trees, tree sizes.
- o Dug the names of the new color palettes out of Warp's INI files.
-   Under 2.x both color palette commands (one new) load the same object.
-   Under Warp they load the two different palette objects available.
- o Added swapfile/memory watch when Drive Tree is active window in FM/2.
- o Added HPFSOPT.EXE program to optimize HPFS drives.
-
-2.16:
- o Added "Update objects" command.
- o Added "Optimize" command.  Be sure to read the online help on this
-   one (under "Context Menus").
- o Added toolbar changing buttons (buttons that automatically load a
-   new toolbox into the toolbar).  See comments in online help under
-   "Toolbar->Add Tool."
- o Hmmm...Warp has broken the DM_DROPHELP message within an application
-   -- the passed DRAGINFO structure is inaccessible (apparently already
-   deallocated).  An appropriate error message will be displayed, and
-   the code's still there so that when IBM fixes it it'll automatically
-   start working again.
-
-2.15:
- o Added "Collect list in file(s)" command.
- o Added "Collect from a list file" command.
- o Added "Select List" command.
- o System VIO fonts have been renamed, jumping between "System" and
-   "System VIO", a couple of times now.  To top it off, when the name
-   changes, the sizes do, too (i.e. 7.System == 5.System VIO, more or
-   less).  Warp is now GA and uses "System VIO" again, so I've changed
-   it back to that.  If some fonts don't look right on your 2.11 system,
-   I'm sorry, but I'm trying to hit a moving target.  Don't shoot me,
-   I'm just the piano player.
- o Did some other stuff, but forgot to write it down and have now
-   forgotten what it was.  Old age is hell.
-
-2.14:
- o FM/2 will now detect that a CD-ROM drive which didn't have a disk in
-   it or had a music disk in it when FM/2 was started is a CD-ROM drive
-   when accessed later with a data disk in it, and change the icon
-   accordingly.  This also applies to hard drives that were locked when
-   FM/2 started, by happy coincidence, and should work on other
-   removable media drives.
- o Hints given in error popup for some access errors (for example, when
-   clicking on an empty diskette drive).
- o Install.cmd will not change the parameters field of objects that it
-   creates if the File Manager/2 folder already existed.  It will still
-   update the paths.
- o VTree honors drive exclusions like it should have in the first place.
- o VTree will delete a directory if the Shredder refuses for some reason.
- o Added VTree->WPS folder toggle.
- o Shortened VTree tasklist title for registered users.
- o FM/2 will attempt to fit smaller files onto diskettes when a larger
-   file in the list to be moved/copied won't fit before prompting you to
-   change diskettes due to a disk full condition.
- o Help for toolbar buttons shows up when mouse passes over them --
-   figured out how to implement without excessive message passing (IOW,
-   to my satisfaction).
-
-2.13:
- o Added ability to set type of selection used in some containers (in
-   the Settings Notebook on the "Windows" page).
- o Selecting "Settings Notebook" in the FM3.EXE monolithic app, even
-   from container context menus, will always bring up a full settings
-   notebook.
- o Slightly reduced memory usage for HPFS drives (ah, another reason
-   to use HPFS...).
- o Fixed bug in SetIcon.
- o Did some more work on FM2PLAY.EXE to make it more eye-appealing and
-   maybe a bit more functional.
- o Shortened tasklist title for registered users.
-
-2.12:
- o AV/2 will now ignore an association if it contains the string
-   "AV2.EXE" in the command line (meaning it might call itself).
- o Fixed "Lowercase name" bug.
- o Worked over the context menus again, added a couple more
-   accelerator keys.
- o Hooked Help button in Child Window dialog to some help.
-
-2.11:
- o Fixed odd bug in second status line in Directory Containers.
- o Fixed rename buglet that caused rename from menu/button to
-   give funny default drive.
- o Added drag and drop to INI Viewer to allow moving and copying
-   data between different INI files.
- o Added FM2PLAY.EXE to allow playing multimedia files (via MMPM/2)
-   from FM/2 easily.  Usage:  FM2PLAY.EXE <file> [<file> <file...>].
-   There's a menu item for it.
- o Added "associat.txt" containing recommended associations for use
-   with FM/2.  Please send your ideas for this list.
- o Enhanced the Bookshelf Viewer.
-
-2.10:
- o Added Undo buttons to Settings notebook pages.
- o Fixed bug wherein Save state of dir windows toggle was ignored.
- o Put in some comma formatting to prevent an untimely death.
- o Fixed bug wherein Doubleclick Opens toggle was ignored.
- o Added a couple more Settings pages.
- o Made appropriate Settings pages available to standalone modules.
- o Tweaked a few menus for a more consistent appearance.
-
-2.09:
- o Changed things so the little notification box doesn't steal the
-   focus when it comes up.  Duh.
- o Added "Backup Profile", "Change System Profiles" and "Replace System
-   Profiles" to the INI viewer.
- o Fixed some glitches in new mask "must have" attribute processing.
- o Found and fixed bug in Collector's Seek & Scan that could cause FM/2
-   to trap.
- o Added a Settings notebook containing global toggles and such.
-   Slower than the menus, but Ron Hester asked for it, and I always do
-   what Ron says...
- o Return of the weirding ... but that'd be telling.
- o Added optional split status line.
-
-2.08:
- o Added "must have" attributes to Filter.
- o Fixed Undelete dialog so selecting a new drive from the combobox
-   causes the listbox to be refreshed for that drive, and so a missing
-   DELETE environment variable for the selected drive doesn't cause the
-   dialog to abort unless you select Cancel in the information box (so
-   you can pick a different drive).
- o Added limited optional logging for some simple but critical
-   operations (copy, move, rename, delete).
- o Documented "start minimized" command line argument.
- o Added "don't save/restore state of dir windows this time" command
-   line argument.
-
-2.07:
- o Added "View Bookshelf" and "View Helpfiles" utilities.
- o Fixed bug in Quick Tree added while fixing the last one...
- o VTree now saves its size and position on desktop (Ron Gawer wanted
-   that).  VDir doesn't, as you can have several of them open at once
-   and it would be somewhat irritating to have them all on top of each
-   other.
-
-2.06:
- o In the Collector's Seek-and-scan dialog, the All HDs button now skips
-   removable drives (like CD-ROMs) for convenience.
- o Quick tree works around the OS/2 DosFindFirst bug that prevents FAT
-   root drives from being found.
- o Added "separator" attribute for tool buttons -- causes a small amount
-   of space to be added after the button with the attribute, for
-   appearance (grouping of buttons).
- o Added ability to turn on titles below bitmap buttons in toolbar (it'll
-   have to be short and sweet) and grouped all toolbar toggles under a
-   Toolbar conditional cascade submenu.
-
-[lazy bum skipped a few...]
-
-2.00:
- o A whole new look for FM/2 -- the same thing, only more so.  Some
-   things were enhanced, some dropped, some replaced or superceded.
-   Still, if you used 1.x you should feel at home.
-
-$Id$
Index: trunk/README
===================================================================
--- trunk/README	(revision 1912)
+++ 	(revision )
@@ -1,836 +1,0 @@
- ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
- ³  F(ile) M(anager)/2 is free software from Mark Kimes ³
- ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄŽ
- ³       See end of document for contact info           ³
- ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
-
-FM/2 3.25 Modifies the layiut of the dialogs some they will work better with larger
-font sizes. It fixes several traps/potential traps. Occasional tree container
-corruption on scan/rescan should be gone. The "0" ea size, date and time on
-nonexistent files in the compare directory are gone. Fix a problem with the first
-subdirectories in the tree container spuriously reporting "no drop". See the
-history for more details.
-
-FM/2 3.24 includes a major performance enhancement by moving almost all the file
-scanning onto a background thread leaving the user interface accessible during
-scans. The only negative side effect of this is that expand all runs slower. However,
-I am not sure why anyone would use this regularly on large drives (except me of 
-course to get it working with the scanning changes). This release should also be
-much more stable as we identified several areas (apparently little used) where 
-reproducible traps occurred. We also eliminated a major potential cause of 
-random hard to reproduce traps and hangs when we re-did the scanning code. Some
-tree container cosmetic issues have been fixed including removal of occasional
-blank lines and double enters; fixing CD/DVD drives so they always change icon
-and if needed display name on eject; improved the consistency of the "make top"
-code and fixed it so the container updates on renaming a directory. We also
-fixed the failure to generate multiple real objects (broken in 3.23 my bad), 
-some issues with the direct edit code and fix the directory container compare
-select code. See the history for more details.
-
-FM/2 3.23 provides several enhancements. Implemented creation of a JAVA executable
-object from a jar file. Select a jar file and "Real object" from the "Create 
-object" sub-menu. You will be prompted to select the JAVA exe you wish to use.
-Your choice will be recorded for use in the future. You will then be prompted
-to select an icon for the object. Once the object is created you will be prompted
-to restart the desktop. I highly recommend you do so. If you don't the object icon 
-will be lost if you open the object in settings view. Additionally, I have 
-experienced WPS hangs forcing a reboot when accessing the desktop or trashcan
-context menu following the icon loss described above. I have not had any problem
-if I restarted the desktop. We have added menu toggles for confirm delete and the 
-drag & drop dialog options. Newview now handles selecting and utilizing email 
-addresses and URLs much better and more completely (https is supported) than 
-in previous versions. The EA editor now checks for EAs marked as critical and
-report this to the user.
-
-We have also fixed multiple defects including eliminating redundant error messages
-from unlock and read only checking code and now only trying to unlock exes or dlls.
-Fixed a string handling problem with the extract directory and a trap that sometimes
-occurred when closing or starting a rescan while scanning was in progress. Limited
-auto open of help to the first time the quick settings configuration page is open
-each session. Finally we stopped using FM2Play to open multimedia files. The 
-problem was caused by the fact that mmioMP3 would report it could handle most
-any thing (exes for example). This lead to FM2Play trying to play them. I have
-fixed and updated mmioMP3 and it should be available on Hobbes by the time you 
-read this. See the history file for more details. Please let us know if you find 
-a defect.
-
-FM/2 3.22 provides enhancements to compare directories, seek and scan and the 
-archive viewer. It fixes the check for readonly files on delete to work in all 
-cases. It fixes some problems with the installer. We have also fixed a number 
-of cosmetic issues and several traps. We no longer load FM/2 in high memory as 
-we determined that was causing some of the traps. We tried to improve the speed
-of drive scans and the responsiveness of the UI during long seek and scans.
-See the history file for more details. Please let us know if you find a defect.
-
-FM/2 3.21 has a few enhancement which we hope you will find useful. Since eCS 
-includes unlock.exe I have added unlock file to the file (directory container 
-context) menu so you can easily unlock a dll or exe file. Delete, copy and move 
-operations will open a dialog which allow you to unlock files as part of these 
-operations. An icon is included if you wish to add unlock to a toolbar button.
-(See the help file for the unlock id and instruction on adding a button).
-Search for duplicate files now sorts results by filename. Updated the help file 
-adding information on FM/2 as a WPS replacement. Enhance compare directories to 
-allow inclusion of subdirectories or use of a list file on opening and fixed 
-a list file load failure. Added a warning dialog for a delete, copy or move 
-operation which replaces/deletes a read only file. Finally,the "target 
-directory" is now a drop target for move/copy or conditionally to change the target.
-See the history file for more details. Please let us know if you find a defect.
-
-FM/2 3.20 mainly addresses things that were annoying me. The only new item
-is a new date type for ARCHIVER.BB2 which allows for the viewing of .tar.gz
-archives directly using Tar 1.15 or higher. You will need to either replace
-your ARCHIVER.BB2 with ARCHIVER.TMP from the package or replace/add Entry #10
-(tar.gz) from the .TMP file to your existing ARCHIVER.BB2. We don't do this
-automatically to avoid breaking any custom changes you may have made. We updated
-some of the help information, fixed several rare traps and little things like
-the failure to create a list file if it didn't already exist. See the history
-file for more details. Please let us know if you find a defect.
-
-FM/2 3.19.1 This is a bug fix release. Most of these have existed for a
-very long time but were only discovered recently. Included is a fixed
-FM/2 utilities wpi file. None of the utilities have been updated. The
-fix allows you to install the utilities without having to install FM/2.
-See the history file for more details. Please let us know if you find
-a defect.
-
-FM/2 3.19 I am dedicating this release of FM/2 to the memory of my
-parents Ralph and Helen Young both of whom passed away earlier  this
-year. It has been over a year since the last release. The FM/2 team has
-been busy with a lot of other projects. This release mostly fixes bugs.
-
-The major change is that this version uses high memory to
-load much of FM/2's code, data and resources. If your version of OS/2
-(Warp 4 pre about Fixpack 13 or Warp 3 pre about Fixpack 37) doesn't
-support high memory please contact me and I will provide a low memory
-version. If anyone contacts me, I will plan on both a high and low
-memory version (or a way to convert one to the other) for future
-releases.
-
-You can now open a directory container from an item in the collector and
-the EA editor now has a file open option. We also made some improvements
-to FM/2's handling of containers holding large numbers of files
-(greater than 64k). Please see the history file for more details.
-
-FM/2 3.18 This release removes high memory support at least for now.
-Changes made to the openwatcom compiler which adds large file support to the
-open file functions created a problem since DosOpenL doesn't work correctly
-with high memory. This change also fixes the paste failure in VIO windows
-when copying from FM/2.
-
-We have provided an archiver description for use with unzip ver 6. It is contained
-in ARCHIVER.TMP. The installer copies the description to ARCHIVER.BB2 (last entry).
-If you plan on using ver 6 as your default unzip you will need to activate this
-description. The instructions follow:
-
-- This archiver definition assumes that UNZIP v6
-  a) is named UNZIP.EXE
-  b) is on the PATH
-  c) precedes all other UNZIP.EXE versions on the PATH.
-  If any of these are not true, then either correct the problem listed above or:
-     1) Select the UNZIP v6 definition. (See below.)
-     2) Click on the "Edit" button
-     3) Modify all instances of UNZIP.EXE to include a full path for UNZIP.EXE v6.
-     4) Click on "OK", then "Close" and then "Yes" to exit and save your changes.
-     5) Restart FM/2
-
-- FM/2 will not use this entry unless
-  a) It is the only UNZIP definition; or
-  b) You select it manually; or
-  c) You move UNZIP v6 ahead of all the UNZIP's in the list of archivers.
-     In order to move UNZIP v6 ahead of the other UNZIP's:
-     1) Select the UNZIP v6 definition. (See below.)
-     2) Click on the "Up" button until the UNZIP v6 entry precedes all other
-        UNZIP definitions.(If you have never modified ARCHIVER.BB2 it will
-        need to be moved to the very top)
-     3) Click on "Close" and then "Yes" to exit and save your changes
-     4) Restart FM/2
-
-- Selecting the UNZIP v6 definition:
-     1) Start FM/2
-     2) Select the "Config" menu
-     3) Select the "Edit" submenu
-     4) Select the "Edit an archiver..." menu item
-     5) In the dialog that appears scroll the list, if necessary, and select
-        the UNZIP v6 definition
-
-We have made changes to the open files logic to correct some odd issues
-caused by MMPM when ogg, flac and/or mpg IOProcs are installed. MPGs are now
-recognized as media and zero byte files trigger a dialog offering to open
-them in the text editor. We now pass .wpi files to the WPS if no association
-is set for them. If you see FM/2 attempt to open non-media files as a media file
-or fails to open a media file recognized as such by OS/2 as media, let us know.
-
-We reworked the user commands. Doing so makes COMMANDS.DAT obsolete with the
-commands moving to FM3INI.INI. We did this to eliminate toolbar entry failures
-caused by reordering the commands. It also keeps the hotkey the same following
-a reorder and allows the user to select the hotkey they wish to use. The first
-time you run 3.18, it will copy the commands information from COMMANDS.DAT to
-the INI. COMMANDS.DAT isn't deleted or changed so you can revert to an earlier
-version without losing old commands. However, any commands you add or change
-with this version will not be seen by older versions.
-
-You can use Ctrl-click to select state or commonly used directory quicklist entries
-or walk dialog user list entries without activating them. This is handy for deleting
-entries without changing the window's state.Compare directories has been rework to
-enhance its speed, allow for quick cancel and provide the option of AND'ed
-selection (CTRL click). AND'ed selection selects from currently selected entries
-as opposed to all entries. See the help file for more information. We have fixed
-some rare traps and hangs and a few annoying bugs like the failure of the append
-checkbox in the list file dialog to append. Please see the history file for a more
-complete list of changes.
-
-FM/2 3.17: This release provides for loading FM/2 partially in high memory
-since this won't work on older systems (pre fixpack 13?) or you might have
-other reasons not to use it we provide a low memory version also. Some high
-loaded programs hang in the exit handler (i.e. don't close). We didn't
-experience this problem but if you do install the low memory version (3.17.0).
-The high memory version is 3.17.1.
-
-This release makes changes that should speed the scanning and
-container filling in FM/2. We have added some visual clues to let you know
-FM/2 is still working. The LED in the lower right hand corner now blinks
-while long operations are in progress or you can open the thread note
-window (click on the LED) for even more detailed information about an
-operation in progress. We also added a better "scanning" message.
-
-We have updated the look and functionality of the drivebar. It now has the
-drive letters superimposed over the drive icons allowing for larger icons.
-We have add a refresh removable media and rescan button to the beginning
-of the bar to make it a more complete replacement for the tree container
-in FM/2 lite. You can also show the file system type or drive label next
-to the drive letter in the tree container. See the Tree settings notebook
-page to try this option.
-
-The INI viewer option on the utilities menu now lets you choose to open
-the user INI, system INI or FM2's INI. We now allow LONGNAMES to be
-displayed for FAT & LAN drives and we  delete .LONGNAME EA if it becomes
-the filename on a copy or move. In addition to these we fixed 2 rare crashes
-and a hang associated with SMP. We also fixed a handful of interface problems.
-See the history file for more information.
-
-FM/2 3.16: This release makes changes that should allow FM/2 to be
-translated into different languages. It also adds date and number
-formatting based on the system locale settings. We now need to find
-some individuals who are interested in doing the translations.
-Currently, double bit character sets are not supported in FM/2.
-
-We have also fixed multiple minor annoyances such as improving
-detection of text verses binary files when opening viewers and
-filtering/(de)select mask now works for archives with pathnames.
-We added the ability to turn error/alert beeps on and off in the
-settings notebook (General page) and changes to the details switches
-in compare directories are now saved. See the history for more details.
-
-FM/2 3.15: This release turns on some new features by default
-don't panic they can all be turned off if you don't like them.
-The first is recursive scanning on start up. This slows the initial
-scan a bit but speeds expansion of the tree later. It is on for
-local hard drives and can be turned on for other drive types. The
-second new feature is an automatic rescan of the drive tree on
-eject of removable media keeping the tree container more current.
-Both of these features can be turn on or off on the scanning page
-of the notebook. The third new feature actually turns write verify
-off on a per drive basis. This is to address the fact that many
-USB removables fail or worse (hangs/traps) when write verify is on.
-We turn it off by default for removables other than standard floppies.
-If you want it on/off for a given drive edit that drive's drive flags
-accordingly. The global write verify selector is unchanged and the
-drive flags have no effect if it is off.
-
-We have some additional new items we hope you will find useful. We
-have added the ability to have the extract commands create a
-subdirectory based on the archive file name for the extraction target.
-Seek and Scan has been added to the drives and directories context
-menu and when selected from there will add the drive or directory as
-the root for the search. We also added refresh removable media so
-you can scan for newly inserted drives from the tree container
-We did some additional work on the main menus like adding Databar
-to the utilities menu and we now gray out items that are unavailable
-or inappropriate and un-grayed some items that were inappropriately
-turned off. We reorganized the internal editor menus as well.
-
-We made changes to the archiver code so that archivers that don't
-have specific start/end list strings will work (i.e. TAR.EXE). We
-have included the commands for .tar .tar.gz and .tar.bz in archiver.tmp
-(gzip.exe and/or bzip.exe must be in the path) These only work with tar 1.15
-or higher. We included a separate entry for TAR 1.10 but versions of TAR prior
-to 1.15 don't work for tar.gz/bz2 files. You can either replace archiver.bb2
-with the archiver.tmp or if you have made changes to archiver.bb2 you can cut
-and paste the new archiver definitions into an appropriate position in your
-existing archiver.bb2
-
-Numerous fixes to minor interface appearance and behavior issues are also include.
-We have added exceptq support to make it easier to track down defects. We
-also eliminated the cause of three rare traps including one associated with
-deleting directories. See the history file for more details.
-
-FM/2 3.14: This release updates many of the icons and bitmaps
-used in FM/2. In addition, more updates have been made to the
-toolbars to activate the new toolbars follow the instruction for
-using CFGMGR in the section about version 3.13. One other change
-may require some user intervention. Inadvertently the expected
-name of the filters data file was change in version 3.12 from
-filters.dat to filter.dat. We have corrected this, however, this
-means your filters may be spread across 2 different files or may
-seem to have disappeared. If they have disappeared go to the FM/2
-directory and rename the file filter.dat to filters.dat. This should
-restore your saved filters. If you find you have both filter.dat and
-filters.dat use a text editor to add the contents of filter.dat
-to filters.dat.
-
-This release also contains some menu changes with unformatted drives
-using the "drives" context menu, the elimination of more than one
-default on some submenus and menu items such as "format" being
-disabled for network drives and enabled for removables. Some of the
-changes should make FM/2 more responsive (Let us know if you notice
-a difference). We have also included some bug fixes.
-
-FM/2 3.13: Many of the changes in this release are related to
-the toolbars. A new feature is that the current toolbar, along
-with the current Target directory, are now saved and restored
-with states. Toolbar code and documentation has been improved, new
-toolbar button bitmaps have been added and bugs have been fixed.
-
-The installation of FM/2 will not replace existing user
-customization files like the toolbar files. So, if this is not
-your first installation of FM/2, some of these improvements will
-not be available because of the old, pre v3.13 toolbar files. It
-is therefore recommended that you run the following:
-
-        CFGMGR /INSTALL /DEFAULTS /TOOLBARSONLY /UNATTENDED
-
-CFGMGR is a REXX program located in the FM/2 installation directory.
-If run as given above it will copy your existing toolbar files into
-a "User_config_backup" subdirectory and then install FM/2 default
-toolbar files. If you have done some customizations of FM/2 toolbars
-you can use a text editor and/or file comparison utility like GFC
-to "merge" your changes, now found in the backup subdirectory,
-with the default files now found in the FM/2 directory. If you want
-more control over the operation of CFGMGR, then leave off the
-/UNATTENDED parameter. Without the /UNATTENDED parameter CFGMGR
-will ask your permission before replacing each file.
-
-The delete = move to trash can is off by default (turn it on on the
-General settings notebook page). FM/2 now checks for adequate disk
-space to avoid data loss.
-
-We also fixed some additional bugs and provide some performance
-enhancements. If you have had trouble with "broken pipe" errors
-copying to a Netdrive samba drive let me know if it now works
-better. I have built in some retries for this error but can't test
-it since I don't see the problem. Also please report back to us anytime
-you see the Debug error report to author box with as much detail about
-what you were doing as possible. Thanks
-
-FM/2 3.12 Fixes a bug introduced in 3.11 (trap when viewing
-multiple files from an archive at the same time). It also adds
-Open Default, Open Settings and via an accel key ctrl + l Open
-Multimedia (using FM2play.exe) to the archive viewer. FM/2 now
-uses the system TMP/TEMP directory for it temporary files and
-cleans up after a crash on the next restart. FM/2 creates a
-subdirectory of the pattern $FM2*.*. The settings notebook can
-now be closed using Esc, F3 or Enter; the last 2 save any
-changes that have been made. You can now select which environment
-variables to show when using show the environment in the drive
-tree. Just add or remove from the list on the "Tree" page of
-the notebook. It defaults initially to the current list. You can
-now save/append either a full pathname or just a filename or a
-list of either to the clipboard. We have changed the wording
-in the menus to make this easier to find. We fixed a few other
-minor issues see the history for more details.
-
-FM/2 3.11 adds the option of having delete move the objects
-to the Xworkplace trashcan. Undelete will open the trashcan
-so you can restore deleted files. The only short coming is you
-will need to rescan in order to see the restored file.
-We also added a reserved state which allows you to return
-FM/2 to the state it was in on start up (the shut down state).
-We have improved the filtering of file names that contain
-multiple periods and fixed FM/2's failure to always follow
-the details settings from the setup notebook. The primary
-task achieved for this release was the addition of fortify
-support which allowed us to fix a handful of memory usage
-related bugs. We fixed a few other minor issues see the
-history for more details.
-
-Fm/2 3.10 adds the ability to set the command line length
-to correspond to the command shell you are using. We have
-moved some menu items to submenus to reduce menu clutter
-while adding "unhide" to reveal previously hidden items and
-adding a settings notebook submenu to allow selection of the
-page you wish to visit. We have updated the look of several
-dialogs and containers including adding the ability to remember
-size location and presentation parameters. We have reworked
-the save state on close so it will save the different states
-of multiple directory containers and in greater detail. This
-state can also be restored at anytime during a session by
-selecting it from the "States" drop down. We have provided better
-progress indicators to update the progress of long operations.
-We now provide both the SYM & MAP files in a separate WarpIN
-package. This will allow interested individuals the tools needed
-to assist with analyzing any problem that may occur. This
-package is not needed to run FM/2. As always this update
-provides some performance enhancements and defect fixes.
-
-FM/2 3.09 adds "mailto:" so you can configure the ability to
-double click an email address in the new viewer and have it
-open a new email using that address. The viewer page in the
-settings notebook was split into 2 pages to facilitate the
-change. Additionally, We fixed some defects and enhanced
-performance in some areas such as commandline quoting.
-
-FM/2 3.08 has had changes to its file filtering logic.
-It now searches for the last extension if a mask like *.zip
-is used. This change was made to over come the problem with
-associations failing on files with multiple ".". You can
-also search for a complete string within the file names by
-using the pattern *stuff* (stuff can't contain an * or ?).
-If "stuff" contains an * or ? the old method of searching
-(character by character)is used.Large (>4GiB) file support
-has been added.
-
-FM/2 3.07 had changes made to its INI file structure.
-These changes mean that the INI file is not backward
-compatible. Please backup you FM3.INI file before installing
-so you can revert to an earlier version without losing some
-of your customizations. Please note you need to leave a copy
-of the fm3.ini file in the install directory in order to keep your
-customizations in 3.07. The temp file fm3.!!! will not update
-the new INI as it is only used when FM/2 is running.
-
-File Manager/2 (FM/2) starting with version 3.6 is being
-built with OpenWatcom. Changing compilers can introduce
-unexpected problem so you may want to backup your current
-install, or at minimum have a working copy of the FM/2
-version 3.5.9 WarpIN package available for reinstall if problems arise.
-To backup your current install simple zip up your install
-directory with its subdirectories or copy them to a different
-location.To restore simply copy the old FM/2 back to the
-its original location. Remember you can't use the new FM/2
-to do this since if it is running some files will be locked
-and won't be replaced. If you didn't backup and need to go
-back just install the 3.5.9 WarpIN package over the new
-install. It will warn you that the install is newer but just
-tell it to install anyway. The WarpIN install process is
-designed to save all your customizations. Don't delete the
-new install if you don't have a backup since this will result
-in the loss of any custom changes you have made. If you need
-to delete it to get the reinstall to work. Backup up the new
-install and then copy the *.bmp, *.tls, *.dat, *.cmd & *.ini
-files back to the install directory after the reinstall.
-Don't copy the *.str files as they are version specific.
-If you have problems be sure to report it (See Support
-at the end of this file).
-
-File Manager/2 (FM/2) is a free OS/2(Warp)/eCS Presentation
-Manager 32-bit file/directory/archive maintenance utility
-(a sort of super-Drives object, something midway between the
-Drives objects and a more traditional file manager) with plenty
-of bells, whistles and utilities, drag and drop, context menus,
-toolbars, bubble help and accelerator keys. If you know how
-to use OS/2, you already know how to use most of FM/2. You
-can easily glean the rest from the extensive online help,
-including tutorials.
-
-This document explains how to install FM/2, including
-upgrading from previous versions. It explains command line
-syntaxes (parameters in a program object) and how to get the
-program(s) running. The online help tells you how to
-actually use FM/2. I'll try to keep this brief.
-
-This program is free software; you can redistribute it
-and/or modify it under the terms of the GNU General Public
-License as published by the Free Software Foundation; either
-version 2 of the License, or (at your option) any later
-version.
-
-This program is distributed in the hope that it will be
-useful, but WITHOUT ANY WARRANTY; without even the implied
-warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-PURPOSE. See the GNU General Public License for more
-details.
-
-You should have received a copy of the GNU General Public
-License along with this program; if not, write to the Free
-Software Foundation, Inc., 59 Temple Place, Suite 330,
-Boston, MA 02111-1307 USA
-
-
-FM/2 3.x installation instructions:
-==================================
-
-Pre-requisite:
-   WarpIN 0.9.20 or higher must be installed.
-
-Install (or re-install) from a FM/2 ZIP file distribution
----------------------------------------------------------
-
-1. Unpack the FM2*.ZIP archive in a private directory (for
-example, C:\TMP). (UNZIP.EXE works nicely to unpack the
-file.) Two WPI files, FM2.WPI and FM2UTILS.WPI will be
-unzipped.
-
-2. Follow the instructions for installing from WPI file(s)
-below.
-
-
-Install (or re-install) from a FM/2 WPI file distribution
----------------------------------------------------------
-
-1. Open the WPS folder containing the WPI file(s).
-
-2. Double click on FM2.WPI. Since WarpIN associates itself
-with WPI files this will start WarpIN with FM2.WPI as the
-parameter.
-
-3, You may then install FM/2 to a directory of your choice
-and, if FM2UTILS.WPI is present, install FM/2 Utilities to
-a directory of your choice.
-
-NOTE: If you double click on FM2UTILS.WPI instead of
-FM2.WPI, you will only be able to install the FM/2
-Utilities. It is recommended that, even if you only want to
-install FM/2 Utilities, that you do so using FM2.WPI.
-
-
-Moving FM/2 and/or FM/2 Utilities:
-----------------------------------
-
-1. Copy your existing installation directory to the new
-location.
-
-2. If you have added your own icons to any of the FM/2
-folders, then you should move them elsewhere temporarily.
-
-3. Follow the instructions for de-installing below.
-
-4. Re-install the package using the installation
-instructions above. This will update the WarpIN database and
-reset your icons to the new locations.
-
-5. Move the icons you saved in step #2, back into the FM/2
-folders if you wish.
-
-
-De-installing FM/2 and/or FM/2 Utilities:
------------------------------------------
-
-1. Run WarpIN without parameters.
-
-2. Right click on a package you want to de-install and
-select "de-install all packages".
-
-3. Click on OK in the "De-install Packages" window that
-appears.
-
-
-=================
-First-time notes:
-=================
-
-Starting FM/2 -- how it works, customizing parameters:
-
-If you start File Manager/2 (filename FM3.EXE) with no
-parameters, it opens the Drive Tree window but no directory
-windows (unless the "Save state of dir windows" toggle is
-checked -- see online help).
-
-File Manager/2 optionally accepts names of directories in
-the parameters field of its program object; it'll open a
-directory window for each one. Hint: If you often do
-different specific things with FM/2, you might set up a WPS
-object customized to start up ideally for each activity. For
-example, if you wanted to maintain your BBS areas, you might
-have one object with parameters like: "D:\BBSDIR
-D:\BBSDIR\MAILIN D:\BBSDIR\MAILOUT", and if you also like to
-use FM/2 to set icons on files, you might have another
-object with parameters like: "E:\MYICONS D:\NEWFILES". The
-State quicklist can also be used for this within FM/2 itself
--- see online help.
-
-You can exclude drives in the parameters by prefacing the
-drive letter with "/", and there can be more than one drive
-letter behind the "/" (i.e. "/BH" to exclude both drives B:
-and H:). Hint: Many people like to use /B to exclude
-"phantom" drive B: if they have a single-floppy system.
-Similarly, you can cause drives NOT to be prescanned by the
-Drive Tree by prefacing the drive letter with ";", drives
-NOT to load icons for objects by prefacing the drive letter
-with ",", drives NOT to load subjects for objects by
-prefacing the drive letter with "`" and drives NOT to load
-longnames for objects by prefacing the drive letter with
-"'". This can be handy if you have a very slow drive like a
-CD-ROM or Zip drive. FM/2 Lite recognizes these switches,
-too. See also the Drive Flags dialog in FM/2.
-
-If you place the plus sign "+" (alone, separated from
-anything else by spaces) in the parameters, FM/2 will log,
-to FM2.LOG, delete, rename, move and copy operations that
-are performed by drag-and-drop or with the menus. FM/2 Lite
-recognizes this switch, too.
-
-The parameter "-" (alone, separated from anything else by
-spaces) causes FM/2 to ignore, not load or save, the
-previous state of directory windows (see the "Save state of
-dir windows" toggle under Config Menu->Toggles in the online
-help) for that invocation.
-
-You can specify the name of an alternate INI file with
-"-<inifilename>" -- for example: "-C:\FM2\MYINI.INI".
-
-You can also specify the INI file location with the
-environment variable FM2INI -- for example:
-   SET FM2INI=C:\FM2\MYINI.INI.
-
-
-------------------------------
-How to get started using FM/2:
------------------------------
-Please read the following sections in the online help when
-you start FM/2 for the first time: "How to use FM/2's Help,"
-"Terminology" and "General Help," then "Hints." A peek at
-the labeled "Window Layouts" pictures would probably be a
-good idea, too. The rest you can browse as you get time/feel
-the need; for instance, if you want to know what a toggle
-does, read the help under Settings notebook for that page
-(each Settings notebook page has its own Help button).
-
-If you prefer hard copy help, print this file, run FM/2,
-press F1, click the "Print" button at the bottom (IBM View)
-or top (Newview)of the help window that appears and then print
-both the "Contents" and "All sections" (keep an eye on the printer,
-after page 100 of "All sections" as the Help Manager will
-begin printing its own help then -- you may want to abort
-printing at that point). Advanced and/or curious users may
-also want to print FM3TOOLS.DAT and ARCHIVER.BB2. Be sure
-you have plenty of paper and ink handy -- the package is
-well documented. You'll probably also want a three-ring
-binder and hole punch to get it bound, as staples aren't
-going through that puppy. You can, of course, print only the
-sections that are of particular interest to you.
-
-Additional documentation:
-------------------------
-  FM3.HLP:        FM/2's online help file.
-
-Look in the FM/2 Docs subfolder of the File Manager/2 folder
-for easy access to all documentation.
-
-
-Bonus programs:
-==============
-
-You'll note the extra objects that the Install program
-creates in the FM/2 Tools subfolder of the File Manager/2
-folder. FM/2 is modular, so that you can get directly to
-some of its components without running the entire ball of
-wax. This may allow you to enhance the behavior of some of
-your other applications in the WPS tradition. You don't
-_have_ to keep these around, of course -- FM/2 itself
-contains all their functionality.
-
-ARCHIVE VIEWER/2: Intended for drag-and-drop operation (or
-WPS association) with WPS objects or other applications.
-Drag an archive onto it, drop it, get an archive listing
-box. FM/2's installation program sets up some associations
-between archive files and this program by file extension.
-AV/2 will try to display whatever you give it as
-sensibly as it can. Filename AV2.EXE.
-
-EA VIEWER: Drag a file system object onto it and it'll show
-you the object's extended attributes. Filename EAS.EXE.
-
-INI VIEWER: Drag an .INI file onto it and it'll show you its
-contents. Filename INI.EXE.
-
-BOOKSHELF VIEWER: Shows all .INF files in a listbox and lets
-you pick the one(s) you want to view. If you give any
-command line argument, the .HLP files on the HELP path will
-be shown instead (the Helpfile Viewer object calls
-VIEWINFS.EXE with "dummy" for an argument, for example).
-Filename VIEWINFS.EXE.
-
-PROCESS KILLER: Lets you kill off renegade processes. An
-English version of PSTAT.EXE must be on your PATH. Filename
-KILLPROC.EXE.
-
-UNDELETE: Lets you undelete files (via interface with
-UNDELETE.COM). Drag a file system object onto it and it'll
-let you undelete files for that drive. Filename UNDEL.EXE.
-
-VISUAL TREE: Opens a Drive Tree window (like the WPS Drives
-object with more horsepower). Filename VTREE.EXE.
-
-VISUAL DIRECTORY: Opens a Directory Container window; drag a
-file system object onto it and this will open its directory
-(like a WPS directory Folder with more horsepower). Filename
-VDIR.EXE.
-
-COLLECTOR: Opens a Collector window. Filename VCOLLECT.EXE.
-Two other objects, "See all files" and "Seek and scan" are
-created which call up the Collector and go directly to
-dialogs for the appropriate purpose.
-
-GLOBAL VIEWER: Opens a global view of a drive or drives.
-Filename GLOBAL.EXE.
-
-DATABAR: Opens a databar showing some system information.
-Filename DATABAR.EXE.
-
-DIRSIZE: Shows where drive usage is concentrated. Filename
-DIRSIZE.EXE.
-
-FM/2 LITE: A simplified interface for "dummies." Filename
-FM4.EXE.
-
-FM/2's install creates FM2.CMD, AV2.CMD, VDIR.CMD,
-VTREE.CMD, VCOLLECT.CMD, UNDEL.CMD, KILLPROC.CMD, INI.CMD,
-EAS.CMD, DIRSIZE.CMD, VIEWINFS.CMD and VIEWHELP.CMD files
-for you in a directory "utils" off the install directory.
-You should add this directory to your PATH= statement in
-CONFIG.SYS (type HELP PATH at a command line for more info).
-If you prefer, FM/2's INSTALL builds a SETENV.CMD in the
-FM/2 directory which you can call to set the PATH for FM/2
-in any given session without modifying CONFIG.SYS.
-
-
-Troubleshooting:
-===============
-
-If FM/2 won't run, the probable culprit is CONFIG.SYS. Your
-LIBPATH statement should contain a ".;" entry. If yours
-doesn't, add it. It's standard for an OS/2 installation, but
-some buggy install programs knock it out because they
-translate entries to their full pathname before rewriting
-(so ".;" gets translated to whatever the current directory
-is for the buggy install program). What this ".;" entry does
-is allow a program to find and use .DLL files in the
-program's current directory -- obviously something you want
-programs to be able to do, otherwise you'd have to put every
-application's .DLLs into directories already on the LIBPATH,
-or add the directories of all applications to the LIBPATH, a
-rather huge pain in the, uh, neck.
-
-If things in FM/2 are suddenly acting strange after an
-upgrade, first check the integrity of the install using
-using WarpIN. If it shows a problem rerun the install
-package. If that fails try uninstalling with WarpIN and reinstalling.
-Backup your existing directory so you can save any changes
-you made to the template files then uninstall and reinstall.
-Once you have FM/2 working migrate the *.ini, *.dat, *.tls,
-*.bb2 and *.cmd from your old install/backup to recover your
-custom settings
-
-If the "FM/2 Online Help" object in the "FM/2 Docs"
-subfolder won't work properly, you've got a version of
-VIEW.EXE that won't directly display help (.HLP) files. Use
-SEEHELP.EXE from the FM/2 Utilities package to get around
-this problem (or upgrade your version of OS/2).
-
-Don't drag files over Netscape -- it will lock up if files
-(not WPS objects; there's a subtle difference) are dragged
-over it.
-
-If you get a popup dialog that needs to be reported to the
-maintainer, you can either take a screen shot or you can
-capture the information from STDERR with:
-
-  FM3 2>STDERR.LOG
-
-This technique works for FM/2, FM/2 Lite and all the
-standalone applets.
-
-If you are having trouble with Drag and Drop operations, try
-the + command line switch described above. The content of
-FM2.LOG may be helpful.
-
-
-Known problems/shortcomings:
-===========================
-
-- See the section of this name in the FM/2 help file (FM3.hlp).
-It is installed to the same directory as FM/2.
-
-- See http://svn.netlabs.org/fm2/report/1 for a complete list of
-currently active bugs
-
-
-About FM/2:
-==========
-
-FM/2 was originally written by:
-
-  Mark Kimes
-  <hectorplasmic@worldnet.att.net>
-
-He has kindly allowed me to take over maintenance and
-support of FM/2 and to release the program under the GNU GPL
-license. I'm sure he would appreciate a Thank You note for
-his generosity.
-
-
-Support:
-=======
-
-There is a Yahoo group devoted to fm/2 at:
-
-  http://groups.yahoo.com/group/fm2user/
-
-  This group is now closed but it still contains some useful information
-
-There is a new mailing list at:
-
-  fm2-user@netlabs.org
-
-  To subscribe send an email to:
-
-  fm2-user-subscribe@netlabs.org
-
-  The subject and body can be empty.
-
-  This group is mirrored on Gmane at:
-
-  http://dir.gmane.org/gmane.org.netlabs.fm2.user
-
-You will find lots of friendly folks ready to help.
-
-FM/2 has moved to Netlabs (thanks Adrian).
-
-Check it out at
-
-  http://svn.netlabs.org/fm2
-
-To create a ticket reporting a defect or requesting an enhancement.
-You must be logged into TRAC. Please login with your Netlabs login id.
-If you do not have a login id, you can request one at
-http://www.netlabs.org/en/site/member/member.xml.
-If you have troubles acquiring a Netlabs login id send an e-mail to
-Netlabs Community Mailing List <community@netlabs.org>.
-
-You can also browse the source at this site.
-
-To obtain the source from the SVN use something like the following to check out the trunk
-
-  mkdir fm2_workspace
-  cd fm2_workspace
-  svn checkout http://svn.netlabs.org/repos/fm2/trunk trunk
-
-If you wish commit access please contact us directly.
-
-You can reach us directly at:
-
-  Steven H. Levine
-  steve53@earthlink.net
-
-    or
-
-  Gregg Young
-  ygk@qwest.net
-
-We also monitor the comp.os.os2.apps newsgroup, several
-others in the comp.os.os2.* hierarchy and other groups where
-release announcements are made.
-
-Thanks and enjoy.
-
-$Id$
Index: trunk/ReleaseEdit.cmd
===================================================================
--- trunk/ReleaseEdit.cmd	(revision 1912)
+++ 	(revision )
@@ -1,374 +1,0 @@
-/*
- * $Id$
- *
- * ReleaseEdit: a program which will edit a file and set the version
- *    number and the date of an FM/2 release as appropriate for that file.
- *    This program operates non-interactively.
- *
- * Usage:
- *    ReleaseEdit <version> <relative-filename> [trace=<trace-option>]
- *
- *    where
- *       <version> is in the form x.y.z or x.y (where x, y and z are numbers)
- *       <relative-filename> is ONE of the files (i.e. no wildcards)
- *          which need a version number and/or date set. For example:
- *             *.def, file_id.diz, dll\version.h, warpin\fm2.wis
- *       <trace-option> is a valid comnbination of trace options:
- *          '? a c e f i l n o r'. This is an OPTIONAL parameter.
- *
- * Examples:
- *    ReleaseEdit 3.15.0 av2.def
- *    ReleaseEdit 3.15.0 fm3.def trace=i
- *
- * Change log:
- *    18 Nov 08 JBS Ticket 297: Various build improvements/corrections
- *       -  Use SysTempFilename instead of hard-coded temp file name
- *       -  Removed support for changing version in FM2.WIS (not needed)
- *    21 Nov 08 JBS Ticket 297: Various build improvements/corrections
- *       -  Changed code for option description lines in DEF files.
- *          Instead of reading the current lines, they are recontructed
- *          scratch. The data for these lines is:
- *          - provided as a parameter (version/revision)
- *          - read from a repository file, option_descriptions.txt
- *            - all fields read from have default values
- *            - support for environment variables
- *          - edits length of all fields in option description
- *       - added support for changing copyright years
- *       - improved error handling: tmp file renamed back to deleted file
- *       - improved "usage" routine
- *    22 Nov 08 JBS Ticket 297
- *       - Fix bugs in version edits and added
- *       - Support for an optional trace parameter.
- *       - Improved "usage" routine
- *       - Suppressed output of 'del' commands
- *    23 Nov 08 JBS Improved handling of invalid or missing <trace-option>
- *       and a 'NOTREADY' condition when closing the repository.
- *    06 Jan 09 JBS Added code to set VERREALMINOR in dll\version.h
- *       a) to value of FM2_VERREALMINOR environment variable, if set
- *       b) to " "__DATE__ if FM2_VERREALMINOR environment variable is not set
- *       NOTE: FM2_VERREALMINOR, if set, must have an even number (including 0)
- *       of double quotes. SED seems to choke on an odd number, even if they are
- *       properly escaped.
- *    12 May 10 JBS Ticket 424: Deleted code related to obsolete "internal\makefile"
- *    09 Feb 14 JBS Ticket 499: Changed bldlevel date format to YYYY-MM-DD
- *
-*/
-
-n = setlocal()
-
-/*
-   sed_separator:
-     - used only for SED edits of DEF file descriptions
-     - MUST be a character not found in ANY DEF file description!
-     - MUST be a character acceptable to SED as a separator
-*/
-sed_separator = '&'
-
-call RxFuncAdd 'SysLoadFuncs', 'REXXUTIL', 'SysLoadFuncs'
-call SysLoadFuncs
-
-parse arg args
-p = pos('TRACE=', translate(args))
-if p > 0 then
-   do
-      args = args || ' ' /* make sure there's a space at the end */
-      traceopt = substr(args, p+6, pos(' ', args, p+5) - (p+6))
-      args = delstr(args, p, 6+length(traceopt))
-      if traceopt \= '' then
-         if verify(translate(traceopt), '?ACEFILNOR') = 0 & length(traceopt) < 3 then
-            trace value traceopt
-         else
-            call Usage
-      else
-         do
-            parse source . called_as .
-            if called_as = 'COMMAND' then
-               call Usage
-            else
-               nop /* traceopt = '' OK for ReleaseEdit because it is usually called from ReleaseTool? */
-         end
-   end
-else
-   traceopt = ''
-
-signal on Error
-signal on FAILURE name Error
-signal on Halt
-signal on NOTREADY name Error
-signal on NOVALUE name Error
-signal on SYNTAX name Error
-/*
-signal on novalue             /* for debugging */
-*/
-
-/* Change to proper directory */
-parse source . . thispgm
-thisdir = left(thispgm, lastpos('\', thispgm)) || '.'
-call directory thisdir
-
-/* Process parameters */
-parse var args ver file .
-if ver = '' | file = '' then
-   call Usage           /* and exit */
-else if stream(file, 'c', 'query exists') = '' then
-   call Usage           /* and exit */
-parse var ver major '.' minor '.' CSDLevel
-if CSDlevel = '' then
-   CSDlevel = 0
-
-if datatype(major) \= 'NUM' | datatype(minor) \= 'NUM' | datatype(CSDlevel) \= 'NUM' then
-   call Usage
-ver = major || '.' || minor || '.' || CSDlevel
-
-/* Set extension, if none set it to uppercase(file) */
-ext = substr(translate(file), lastpos('.', file) +1)
-
-/* Prepare temporary file */
-tmpfile = SysTempFilename('redittmp.???')
-'@copy' file tmpfile '1>nul 2>nul'
-if rc \= 0 then
-   do
-      say;say 'Unable to copy to ' || tmpfile || '!! Proceesing aborted.'
-      exit 1
-   end
-if wordpos(ext, 'H') = 0 then
-   '@del' file '1>nul 2>nul'
-
-/* Set fixed strings */
-globals = 'repository copyright_year_marker copyright_year_marker_len'
-repository = 'option_descriptions.txt'
-warpin_makefile = 'WARPIN\MAKEFILE'
-copyright_h     = 'DLL\COPYRIGHT.H'
-parse value date('s') with year 5 month 7 day
-last_year = year - 1
-
-/* Process the request */
-/*                              month || '/' || day || '/' || year || ' ' || ,  */ /* or day month year? */
-select
-   when ext = 'DEF' then
-      do
-         if stream(repository, 'c', 'query exists') = '' then
-            do
-               say 'Error! Unable to locate repository file:' repository
-               say
-               say 'Unable to proceed with request.'
-               say
-               '@if not exist' file 'copy' tmpfile file '>nul 2>nul'
-               '@pause'
-               signal exit_routine
-            end
-         say 'Processing file:' file
-         copyright_year_marker = 'copyright-year'
-         copyright_year_marker_len = length(copyright_year_marker)
-
-         vendor         = GetFromRepository( 'vendor', 'The Netlabs FM/2 team', 31 )
-         revision       = ver
-         buildhost      = GetFromRepository( 'buildhost', 'GKYBuild', 11 )
-         asd_feature_id = GetFromRepository( 'asd_feature_id', '', 11 )
-         language_code  = GetFromRepository( 'language_code', 'EN', 4 )
-         country_code   = GetFromRepository( 'country_code', 'US', 4 )
-         build          = GetFromRepository( 'build', '0', 7 )
-         processor_type = GetFromRepository( 'processor_type', 'U', 1 )
-         fixpack_ver    = GetFromRepository( 'fixpack_ver', '', 11 )
-         description    = GetFromRepository( 'desc.' || left(file, pos('.', file) - 1), '', 579 /* i.e. disable length check */ )
-
-         option_description = '@#' || vendor || ':' || revision || '#@##1## ' || ,
-                              year || '-' || month || '-' || day || ' ' || ,
-                              right(major, 2, '0') || ':' || right(minor, 2, '0') || ':' || right(CSDlevel, 2, '0') || ,
-                              copies(' ', 6) || buildhost || ':' || asd_feature_id || ':' || ,
-                              language_code || ':' || country_code || ':' || build || ':' || ,
-                              processor_type || ':' || fixpack_ver || '@@' || description
-         do forever
-            p = pos(copyright_year_marker, option_description)
-            if p = 0 then
-               leave
-            else
-               if p = 1 then
-                  option_description = year || substr(option_description, p + copyright_year_marker_len)
-               else
-                  if p + copyright_year_marker_len >= length(option_description) then
-                     option_description = left(option_description, p - 1) || year
-                  else
-                     option_description = left(option_description, p - 1) || year || substr(option_description, p + copyright_year_marker_len)
-         end
-         option_description = "option description '" || option_description || "'"
-         'sed -r -e "/option description/s' || sed_separator || '.*' || sed_separator || option_description || sed_separator || '" ' || tmpfile || ' >' file
-      end
-   when ext = 'H' then
-      do
-         if translate(file) = copyright_h then
-            do
-               say 'Processing file:' file
-               'grep -E "^#define.*COPYRIGHT_YEAR.*' || year || '" ' || file || ' >nul || del ' || file || '>nul 2>nul && sed -r -e "/#define.*COPYRIGHT_YEAR/s/[0-9]+/' || year || '/" ' || tmpfile || ' >' file
-            end
-         else
-            do /* change below to delete and then update version.h only if version is different? */
-               say 'Processing file:' file
-               fm2_verrealminor = value('FM2_VERREALMINOR',, 'OS2ENVIRONMENT')
-               if fm2_verrealminor = '' then
-                  fm2_verrealminor = '\" \"__DATE__'
-               else
-                  fm2_verrealminor = EscapeSEDString(fm2_verrealminor)
-               '@del' file '1>nul 2>nul'
-               'sed -r -e "/#define[ \t]+VERMAJOR/s/(#define[ \t]+VERMAJOR[ \t]+)[^ \t]+/\1' || major || '/g" -e "/#define[ \t]+VERMINOR/s/(#define[ \t]+VERMINOR[ \t]+)[^ \t]+/\1' || minor || '/g" -e "/^[ \t]*#define[ \t]+VERREALMINOR/s/(#define[ \t]+VERREALMINOR).*/\1 ' || fm2_verrealminor || '/g" ' || tmpfile || ' >' file
-            end
-      end
-   when ext = 'DIZ' then
-      do
-         say 'Processing file:' file
-         'sed -r "/FM\/2 v/s/(FM\/2 v)[0-9]+\.[0-9.]+/\1' || ver || '/" ' || tmpfile || ' >' file
-      end
-   when ext = warpin_makefile then
-      do
-         say 'Processing file:' file
-         warpin_db_ver = (major + 0) || '\\' || (minor + 0) || '\\' || (CSDlevel + 0)
-         warpin_makefile_ver  = major || '-' || minor || '-' || CSDlevel
-         'sed -r -e "/FM2_VER=-/s/(FM2_VER=-)[-0-9]+/\1' || warpin_makefile_ver || '/" ' || tmpfile || ' >' file
-      end
-   otherwise
-      nop         /* Or error message or usage info? */
-end
-exit_routine:
-'@if exist' tmpfile 'del' tmpfile '>nul 2>nul'
-n = endlocal()
-return
-
-/* Subroutines */
-GetFromRepository: procedure expose (globals)
-   parse arg value_name, value_default, max_value_len
-   /* Replace this with code for each DEF file */
-   call SysFileSearch value_name || '=', repository, 'lines.'
-   if lines.0 = 0 then
-      if left(value_name, 5) = 'desc.' then
-         call MissingDescriptionInRepository value_name
-      else
-         value_value = value_default
-   else
-      do
-         n = lines.0
-         parse var lines.n . '=' value_value
-      end
-   value_value = strip(value_value)
-   if length(value_value) > 1 then
-      if left(value_value, 1) = '%' & right(value_value, 1) = '%' then
-         do
-            value_value = value(substr(value_value, 2, length(value_value) - 2),, 'OS2ENVIRONMENT')
-            if value_value = '' then
-               value_value = value_default
-         end
-   if pos(copyright_year_marker, value_value) > 0 then
-      value_len = length(value_value) - copyright_year_marker_len + 4
-   else
-      value_len = length(value_value)
-   if value_len > max_value_len then
-      do
-         say
-         say 'Error in length of data field!'
-         say '  Field name:' value_name
-         say '  Length    :' value_len
-         say '  Max. len. :' max_value_len
-         say '  Field     :' value_value
-         say '  Trunc''d  :' left(value_value, max_value_len)
-         say
-         say 'This should be corrected in the repository:' repository
-         say
-         '@pause'
-      end
-return value_value
-
-Usage:
-   say;say;say
-   i = 1
-   do forever
-      srcline = sourceline(i)
-      if pos('CHANGE LOG', translate(srcline)) > 0 then
-         exit
-      say srcline
-      i = i + 1
-      if (i // 22) = 0 then
-         '@pause'
-   end
-
-EscapeSEDString: procedure
-  parse arg SEDString
-  SEDString = SEDString || '00'x
-  escape_chars = '\/"'
-  escape_char  = '\'
-  escaped_string = ''
-  next_char = left(SEDString, 1)
-  do i = 1 to length(SEDString)
-     this_char = substr(SEDString, i, 1)
-     if this_char = escape_char then
-        do
-           next_char = substr(SEDString, i + 1, 1)
-           if pos(next_char, escape_chars) > 0 then
-              do
-                 escaped_string = escaped_string || this_char || next_char
-                 i = i + 1
-              end
-           else
-              escaped_string = escaped_string || escape_char || this_char
-        end
-     else
-        if pos(this_char, escape_chars) > 0 then
-           escaped_string = escaped_string || escape_char || this_char
-        else
-           if this_char \= '00'x then
-              escaped_string = escaped_string || this_char
-  end
-return escaped_string
-
-/*=== Error() Report ERROR, FAILURE etc. and exit ===*/
-
-Error:
-  say
-  parse source . . cmd
-  say 'CONDITION'('C') 'signaled at' cmd 'line' SIGL'.'
-  if 'CONDITION'('D') \= '' then
-    say 'REXX reason =' 'CONDITION'('D')'.'
-  if 'CONDITION'('C') == 'SYNTAX' & 'SYMBOL'('RC') == 'VAR' then
-    say 'REXX error =' RC '-' 'ERRORTEXT'(RC)'.'
-  else if 'SYMBOL'('RC') == 'VAR' then
-    say 'RC =' RC'.'
-  say 'Source =' 'SOURCELINE'(SIGL)
-
-  if 'CONDITION'('I') \== 'CALL' | 'CONDITION'('C') == 'NOVALUE' | 'CONDITION'('C') == 'SYNTAX' then do
-    trace '?A'
-    say 'Exiting.'
-    'if exist' tmpfile 'move' tmpfile file
-    call 'SYSSLEEP' 2
-    exit 'CONDITION'('C')
-  end
-
-  return
-
-novalue:
-   say 'Uninitialized variable: ' || condition('D') || ' on line: 'sigl
-   say 'Line text: 'sourceline(sigl)
-   cfg.errorcode = 3
-   signal ErrorExit
-
-/*
- * bldlevel string docs:
-    Format of BLDLEVEL string (Type III)
-
-@#<Vendor>:<Revision>#@##1## DD.MM.YY hh:mm:ss      <BuildHost>:<ASDFeatureID>:<LanguageCode>:<CountryCode>:<Build>:<Unknown>:<FixPackVer>@@<Description>
-
-where
-
-    * DD.MM.YY is the build date in day/month/year, preceded by 1 space
-    * hh:mm:ss is the build time in hour/minute/second, preceded by 1 space
-    * <BuildHost> is machine on which build compiled, preceded by 8 spaces
-    * <ASDFeatureID> is identifier of ASD feature
-    * <LanguageCode> is code of language of component
-    * <CountryCode> is country code of component
-    * <Build> is build number
-    * <Unknown> is not known information (must be empty)
-    * <FixPackVer> is FixPack version (if distibuted as part of).
-
-Note: If you leave build date and/or build time empty you still have to provide the same amount of spaces to replace build date/build time.
-
-
-*/
-
-
Index: trunk/ReleaseTool.cmd
===================================================================
--- trunk/ReleaseTool.cmd	(revision 1912)
+++ 	(revision )
@@ -1,2749 +1,0 @@
-/*
- * $Id$
- *
- * ReleaseTool: Provides a guide and assitance to the process of
- *              of building, uploading and announcing a release of FM/2.
- *
- * As a minimum, the menu provides a list of what needs to be done.
- * Additionally, many of the steps can be accomplished by selecting
- * the relevant number from the menu.
- *
- * Usage:
- *    ReleaseTool [version] [/?] [trace=<trace-option>]
- *
- *    where
- *       version is the version for the pending release
- *       /? : Causes help/usage screens to be displayed (and exits).
- *       <trace-option> is a valid comnbination of trace options:
- *          '? a c e f i l n o r'. This is an OPTIONAL parameter.
- *    All parameters are optional.
- *
- * This program uses the following enviromental variables, if set
- *    SVN_EDITOR or EDITOR to set the text editor that is called
- *       If neither is set, then TEDIT is used.
- *    SVN_TESTER to call a cmd file that copies files to your test directory
- *               and changes to that directory
- *    SVN_KILL allows you to set a program to kill any running version of FM/2
- *             killpid is used as default (must be in path)
- *    SVN_WPIVIEWER or WPIVIEWER to set the program to view WPI files
- *       If neither is set, then WIC is used.
- *    PAGER to set the "pager" program (usually MORE or LESS)
- *       If PAGER is not set, then LESS if used if it is on the PATH
- *       and MORE is used if LESS is not on the PATH.
- *
- * Change log:
- *    18 Nov 08 JBS Ticket 297: Various build improvements/corrections
- *       - Use same file list for option 8 and option 20
- *       - Set the file list for option 8 and option 20 once, in Init routine
- *       - Removed fm2.wis from the file list for option 8 and option 20 (not needed)
- *       - Added optional commit to option 20
- *       - Removed extraneous 'pause' in option 20
- *       - Fixed a bug in option 0 (run a command shell)
- *    22 Nov 08 JBS Ticket 297
- *       - Fix bugs in version edits
- *       - Support for an optional trace parameter.
- *       - Support for EDITOR env var
- *       - Improved "usage" routine
- *    23 Nov 08 JBS Improved handling of invalid or missing <trace-option>
- *    04 Jan 09 JBS Fixed bug in option 9: Apply tag
- *    02 Apr 10 JBS Removed reference to obsolete "internal\makefile" file
- *    29 May 10 GKY Use TEE to generate log files for the build options
- *       - Use DIFF to compare changes in WARNALL builds
- *    31 May 10 JBS Add support of use of PAGER env. variable to the the pager used.
- *    31 May 10 JBS Build zip file and Hobbes txt file in Warpin directory
- *    29 Jun 11 JBS Ticket 462: Fixed bug in NNTP code and standardized version format to x.yy.z
- *    02 Jul 11 JBS Ticket 462: Updated Wiki updates instructions per SHL
- *    23 Jul 11 JBS Ticket 462:
- *       - Major rework of email code.
- *          - Simplified process to add/change CFG data dynamically
- *          - Added support for COMMAND to FTP and NNTP code
- *          - Added support for multiple SMTP servers
- *          - Added support non-authenticated SMTP transactions
- *          - Added structure to support other SMTP authentication methods
- *       - Major rework of CFG file.
- *          - Improved documentation
- *          - Added support for COMMAND in all sections
- *          - New syntax used!
- *       - Added email to developers asking for work to be committed. (Task #1)
- *       - Improved support for external commands which perform some or all of a task
- *          - Improved error handling
- *          - Added support for FTP and NNTP commands
- *    07 Aug 11 JBS Ticket 462: Fix bug in NNTP "To" code
- *    11 Feb 14 JBS Ticket 462: Improved handling of missing cfg file.
- *    28 Feb 14 JBS Ticket 510: Improved handling cleaenup of temporary files
- *    30 Aug 14 GKY Add "pub" to front of Hobbes path to prevent deletion of upload
- *    27 Jun 15 JBS Ticket #510:
- *                - Improved email and nntp code
- *                   - Improved error handling
- *                   - Added support for "PLAIN" email authentication
- *                   - Improved recognition for various email authentications
- *                   - Added a descriptor to the start of the email screens which identifies the purpose of the email
- *                - Support for all-at-once or one-at-a-time uploads
- *                - Several minor improvements to user interface
- *                - Corrected some typos and improved some wording
- *
- * To Do
- *    -  Research and implement ways to pass "Full name" <user@domain.net> addresses to external programs
- *    -  Support multiple description lines for SMTP/NNTP (to improve readabliity on verification screens)
- *    -  Make sure ##macro## key_values are filled before use?
- *    -  More flexibility for SMTP settings for the "Commit work" (to FM/2 developers)
- *       and the "Please move uplaoded file" (to Netlabs) emails. Currently only the
- *       first SMTP definition found in the CFG file will be used for both.
- *    -  Support multiple commands for an SMTP (or NNTP or FTP) task?
- *    -  Support configurable Hobbes names and email address? via parameter or CFG file?
- *    -  "hidden" display/entry for passwords?
- *    -  Prompt for edit to fix or delete the Hobbes TXT file if invalid email address found
- *
-*/
-
-n = setlocal()
-
-signal on Error
-signal on Failure name Error
-signal on Notready name Error
-signal on Syntax name Error
-signal on Novalue
-
-globals = 'cfg. ver. mainmenu. cmd. email. Hobbes. available. prev_user_choice currentSMTP'
-
-parse arg args
-if wordpos('/?', args) > 0 | ,
-   wordpos('-?', args) > 0 | ,
-   wordpos('/H', translate(args)) > 0 | ,
-   wordpos('-H', args) > 0 then
-   do
-      call Usage
-      exit
-   end
-
-p = pos('TRACE=', translate(args))
-if p > 0 then
-   do
-      args = args || ' ' /* make sure there's a space at the end */
-      traceopt = substr(args, p+6, pos(' ', args, p+5) - (p+6))
-      args = delstr(args, p, 6+length(traceopt))
-      if traceopt \= '' then
-         if verify(translate(traceopt), '?ACEFILNOR') = 0 & length(traceopt) < 3 then
-            trace value traceopt
-         else
-            call Usage
-      else
-         do
-            parse source . called_as .
-            if called_as = 'COMMAND' then
-               call Usage
-            else
-               nop /* traceopt = '' OK for ReleaseEdit because it is usually called from ReleaseTool? */
-         end
-   end
-else
-   traceopt = ''
-
-call Init strip(args)
-cfginit_rc = CfgInit()
-select
-   when cfginit_rc > 10000 then
-      do
-         say
-         say 'Syntax error detected in' cfg.file
-         say
-         say 'A line that was not:'
-         say '  - blank'
-         say '  - a comment line'
-         say '  - a section name line (e.g. [FTP])'
-         say '  - a "key-name = key-value" line'
-         say 'was found at or around line:' (cfginit_rc - 10000)
-         say
-         say 'Correct the error and restart.'
-         exit
-      end
-   when cfginit_rc < -10000 then
-      do
-         say
-         say 'Syntax error detected in' cfg.file
-         say
-         say 'An unknown key-name was found at or around line:' (-cfginit_rc - 10000)
-         say
-         say 'Correct the error and restart.'
-         exit
-      end
-   otherwise
-      do forever
-         user_choice = DisplayMenu()
-         if datatype(user_choice) = 'NUM' then
-            call NewScreenWithHeading user_choice
-         cmdfile_option = ''
-         if stream(user_choice || '.cmd', 'c', 'query exists') \= '' then
-            do
-               say
-               say 'Found 'user_choice'.cmd.'
-               say
-               say 'Do you want to run it...'
-               say '   I)nstead of the default processing'
-               say '   B)efore the default processing'
-               say '   A)fter the default processing'
-               say '   N)ot at all (Default)'
-               say
-               call charout , 'Type the first letter of your choice (I/B/A/N): '
-               cmdfile_option = translate(SysGetKey())
-               say
-               if cmdfile_option = 'I' | cmdfile_option = 'B' then
-                  do
-                     call ExecCmd 'call' user_choice || '.cmd.'
-                     if cmdfile_option = 'I' then
-                        user_choice = -1             /* Skip SELECT below */
-                  end
-               prev_user_choice = user_choice
-            end
-         select
-            when user_choice = 'C' then
-               do /* Open a command line */
-                  call Commandline
-                  prev_user_choice = user_choice
-               end
-/* JBS: Disabled internal CFG code:
-            when user_choice = 'G' then
-               do /* Lead user through configuration */
-                  call Configuration
-                  prev_user_choice = user_choice
-               end
-*/
-            when user_choice = 'S' then
-               do /* Run SmartSVN */
-                  dirsave = directory()
-                  svndrive = filespec('D', cmd.smartsvn)
-                  svndrive_dirsave = directory(svndrive)
-                  call directory strip(svndrive || filespec('P', cmd.smartsvn), 'T', '\')
-                  call ExecCmd 'call smartsvn.cmd'
-                  call directory svndrive_dirsave
-                  call directory dirsave
-                  say;say
-                  say 'If SmartSVN did not run correctly, make sure the default Java'
-                  say 'is Java 1.4.1 or later before running ReleaseTool.'
-                  prev_user_choice = user_choice
-               end
-            when user_choice = mainmenu.Ensure_work_done_num then
-               do /* Ensure all work (by others) is comitted */
-                  if Email(user_choice) \= 0 then
-                     do
-                        say 'Error prevented automated emails.'
-                        say 'This notification will have to be done manually.'
-                     end
-                  prev_user_choice = user_choice
-               end
-            when user_choice = mainmenu.Verify_tickets_closed_num then
-               do /* Verify completed tickets are marked closed */
-                  call NotYet user_choice
-                  say 'Check for committed work.'
-                  prev_user_choice = user_choice
-               end
-            when user_choice = mainmenu.Local_SVN_update_num then
-               do /* Ensure all work (by others) is local */
-                  svn_cmd = 'svn update'
-                  say
-                  say 'Online and OK to execute: 'svn_cmd'? (Y/n)'
-                  if translate(SysGetKey()) \= 'N' then call ExecCmd svn_cmd
-                  prev_user_choice = user_choice
-               end
-            when user_choice = mainmenu.Check_SVN_status_num then
-               do /* Ensure all local source is up to date */
-                  if cmd.processor_is_4os2 = 1 then
-                     svn_cmd = 'svn status -v |&' cmd.pager
-                  else
-                     svn_cmd = 'svn status -v |' cmd.pager
-                  say
-                  say 'Online and OK to execute: 'svn_cmd'? (Y/n)'
-                  if translate(SysGetKey()) \= 'N' then call ExecCmd svn_cmd
-                  prev_user_choice = user_choice
-               end
-            when user_choice = mainmenu.Version_number_edits_num then
-               do /* Edit version #'s and date/time stamps (ReleaseTool) */
-                  do f = 1 to words(ver.filelist)
-                     call ReleaseEdit ver.full word(ver.filelist, f) 'trace=' || traceopt
-                     say
-                  end
-                  ver.filelist2 = 'HISTORY README'
-                  do f = 1 to words(ver.filelist2)
-                     file = word(ver.filelist2, f)
-                     call NewScreenWithHeading user_choice
-                     say
-                     say 'Next, edit the' file 'file.'
-                     say
-                     say 'Include descriptions of salient changes to FM/2.'
-                     say
-                     say 'And be sure to update the version number to' ver.full
-                     say
-                     '@pause'
-                     call ExecCmd cmd.editor file cmd.editorcmds
-                  end
-                  call BuildHobbesTxt
-                  prev_user_choice = user_choice
-               end
-            when user_choice = mainmenu.WARNALL_build_num then
-               do /* Ensure the edits build */
-                  say
-                  myWarnall = SetEnv('WARNALL', '1')
-                  call ExecCmd 'wmake -a all | tee warnall.log |' cmd.pager
-                  call SetEnv 'WARNALL', myWarnall
-                  call ExecCmd 'diff.exe -rub warnall.base warnall.log > warnall.diff'
-                  call ExecCmd cmd.editor 'warnall.diff'
-                  say
-                  call charout , 'Make WARNALL.LOG the new WARNALL.BASE? (y/N): '
-                  if translate(SysGetKey()) = 'Y' then
-                     'copy WARNALL.LOG WARNALL.BASE'
-                  say
-                  prev_user_choice = user_choice
-               end
-            when user_choice = mainmenu.Test_WARNALL_build_num then
-               do /* Test built code */
-                  if cmd.tester == '' then
-                     do
-                        call NotYet user_choice
-                        say 'Test the built code.'
-                     end
-                   else
-                     call RunTester
-                  prev_user_choice = user_choice
-               end
-            when user_choice = mainmenu.Commit_code_num then
-               do /* Commit code */
-                  call CommitifOK
-                  prev_user_choice = user_choice
-               end
-            when user_choice = mainmenu.Build_all_for_release_num then
-               do /* Build for the release */
-                  myWarnall = SetEnv('WARNALL', '')
-                  myFortify = SetEnv('FORTIFY', '')
-                  myDebug   = SetEnv('DEBUG', '')
-
-                  call ExecCmd 'wmake -a all  | tee build.log'
-
-                  call SetEnv 'WARNALL', myWarnall
-                  call SetEnv 'FORTIFY', myFortify
-                  call SetEnv 'DEBUG', myDebug
-                  prev_user_choice = user_choice
-               end
-            when user_choice = mainmenu.Test_release_build_num then
-               do /* Test the binaries */
-                  if cmd.tester == '' then
-                     do
-                        call NotYet user_choice
-                        say 'Test the binaries.'
-                        say
-                        say 'At a minimum you should run all the exes and do some'
-                        say 'basic file manipulation with each.'
-                        say
-                        say 'You should, where possible, also verify that any bugs'
-                        say 'that were fixed for the release are working as expected.'
-                     end
-                  else
-                     call RunTester
-                  prev_user_choice = user_choice
-               end
-            when user_choice = mainmenu.LXLITE_build_num then
-               do /* Lxlite */
-                  myDebug = SetEnv('DEBUG', '')
-
-                  'wmake -a lxlite | tee lxlite.log'
-
-                  call SetEnv 'DEBUG', myDebug
-                  prev_user_choice = user_choice
-               end
-            when user_choice = mainmenu.Test_LXLITE_build_num then
-               do /* Test the release code */
-                  if cmd.tester == '' then
-                     do
-                        call NotYet user_choice
-                        say 'Test the (compressed) release code.'
-                        say
-                        say 'Verify that all exe''s continue to load and run after being compressed.'
-                     end
-                  else
-                     call RunTester
-                  prev_user_choice = user_choice
-               end
-            when user_choice = mainmenu.Build_WPI_file_num then
-               do /* Build distro */
-                  myWarnall = SetEnv('WARNALL', '')
-                  myFortify = SetEnv('FORTIFY', '')
-                  myDebug   = SetEnv('DEBUG', '')
-
-                  call ExecCmd 'wmake dist | tee dist.log'
-
-                  call SetEnv 'WARNALL', myWarnall
-                  call SetEnv 'FORTIFY', myFortify
-                  call SetEnv 'DEBUG', myDebug
-                  prev_user_choice = user_choice
-               end
-            when user_choice = mainmenu.Test_WPI_file_num then
-               do /* Test WPI file */
-                  call TestWPI user_choice
-                  prev_user_choice = user_choice
-               end
-            when user_choice = mainmenu.Apply_tag_num then
-               do /* Apply tag */
-                  svn_cmd = 'svn copy -m"Tag release FM2-' || ver.tag || '" http://svn.netlabs.org/repos/fm2/trunk http://svn.netlabs.org/repos/fm2/tags/FM2-' || ver.tag
-                  say;say;say
-                  say 'Online and OK to execute:'
-                  call charout , svn_cmd'? (y/N) '
-                  choice2 = translate(SysGetKey())
-                  say
-                  if choice2 = 'Y' then call ExecCmd svn_cmd
-                  prev_user_choice = user_choice
-               end
-            when user_choice = mainmenu.Zip_files_num then
-               do /* Zip up files */
-                  call ZipFiles
-                  prev_user_choice = user_choice
-               end
-            when user_choice = mainmenu.WIKI_updates_num then
-               do /* Wiki updates */
-                  call WikiUpdates user_choice
-                  prev_user_choice = user_choice
-               end
-            when user_choice = mainmenu.Upload_num then
-               do /* Upload to distribution points and request Netlabs move of uploaded file. */
-                  say
-                  if UploadRelease() = 0 then
-                     do
-                        say
-                        say 'Attempting to notify Netlabs of the upload...'
-                        say
-                        call Email user_choice
-                     end
-                  else
-                     say 'Upload(s) failed (or aborted). Email to Netlabs canceled.'
-                  prev_user_choice = user_choice
-              end
-            when user_choice = mainmenu.Announce_num then
-               do /* Announce the release. */
-                  call Email user_choice
-/*
-                  '@pause'
-*/
-                  call AnnounceToNewsgroups
-                  prev_user_choice = user_choice
-              end
-            when user_choice = mainmenu.TRAC_update_and_Next_ver_num then
-               do /* TRAC updates */
-                  call TracUpdates
-                  prev_user_choice = user_choice
-               end
-            when user_choice = 'Q' then
-               leave
-            otherwise
-               nop
-         end
-         if cmdfile_option = 'A' then
-            call Commandline
-         say;say;say
-         if user_choice \= 'Q' & /* JBS: Disabled internal CFG code: user_choice \= 'G' & */ ,
-            user_choice \= 'C' & ,
-            user_choice \= mainmenu.Test_WPI_file_num then
-            '@pause'
-      end
-      if available.tee = 0 then
-         call SysFileDelete 'tee.cmd'
-end
-
-n = endlocal()
-
-return
-
-/*** Subroutines ***/
-Email: procedure expose (globals)
-   parse arg user_choice
-   if cfg.SMTP.0 = 0 then
-      do
-        if \cfg.file_exists then
-          say 'Error: Cannot send Email without the configuration file:' cfg.file
-        else
-          say 'Error: Cannot send Email. No SMTP sections were found in' cfg.file ||'.'
-        say
-        '@pause'
-        return -1
-      end
-   rcx = -1
-   email.body_file = SysTempFilename('SMTPBody.???')
-   select
-      when user_choice = mainmenu.Ensure_work_done_num then
-         do
-            server_count = 1
-            page_title = 'Note to FM/2 developer list requesting work commit.'
-            email.subject = 'Request: Commit work for upcoming release.'
-            email.to_list = '"FM/2 Developers" <fm2-dev@netlabs.org>'
-            call lineout email.body_file, 'The release of FM/2' ver.full 'is imminent.'
-            call lineout email.body_file, ''
-            call lineout email.body_file, 'Please commit all work for this release within 24 hours.'
-            call lineout email.body_file, ''
-            call lineout email.body_file, 'Reply to this email if there are reasons to delay the release.'
-            call stream  email.body_file, 'c', 'close'
-        end
-      when user_choice = mainmenu.Upload_num then
-         do
-            server_count = 1
-            page_title = 'Note to Netlabs requesting move of release file'
-            email.subject = 'Request: Move uploaded file'
-            email.to_list = '"Netlabs Community" <community@netlabs.org>'
-            call lineout email.body_file, 'The FM/2' ver.full 'has been released.'
-            call lineout email.body_file, ''
-            call lineout email.body_file, 'The file: fm2-' || ver.wpi
-            call lineout email.body_file, 'has been uploaded to /incoming/fm2'
-            call lineout email.body_file, ''
-            call lineout email.body_file, 'Please move this file to /pub/fm2'
-            call stream  email.body_file, 'c', 'close'
-        end
-      when user_choice = mainmenu.Announce_num then
-         do
-            server_count = cfg.SMTP.0
-            page_title = 'Release announcement'
-            email.subject = 'File Manager/2' ver.full 'released'
-            call SetDefaultAnnouncementText email.body_file
-        end
-      otherwise
-         do
-            say 'Email for option' user_choice 'has not been implemented.'
-            return
-         end
-   end
-   _text = '<Standard>'
-   do until ((option = 'C') | (option = 'Q'))
-      call SysCls
-      say
-      say 'Email:' page_title cfg.crlf
-      say 'Verify/edit content' cfg.crlf
-      say 'Subject  :' email.subject
-      say 'Text     :' _text
-      say
-      say 'Type "C" to confirm the above and proceed.'
-      say '     "Q" to abort.'
-      say '     "S" to edit the subject.'
-      say '     "T" to edit the message text (in an editor).'
-      say
-      call charout, '==> '
-      option = translate(SysGetKey())
-      say
-      say
-      say
-      select
-         when ((option = 'C') | (option = 'Q')) then
-            nop
-         when option = 'S' then
-            do
-               say 'Enter the Subject (followed by the ENTER key):'
-               email.subject = linein()
-            end
-         when option = 'T' then
-            do
-               b4_timestamp = SysGetFileDateTime(email.body_file)
-               say 'The current body of the email will now be loaded into an editor.'
-               say 'Make desired changes, if any, and save the file.'
-               say
-               call charout, 'Press any key when ready to load the message body into an editor: '
-               call SysGetKey
-               say
-               call ExecCmd cmd.editor email.body_file
-               if b4_timestamp \= SysGetFileDateTime(email.body_file) then
-                  _text = '<Modified>'
-            end
-         otherwise
-            nop
-      end
-   end
-   if option \= 'Q' then
-      do currentSMTP = 1 to server_count
-         if user_choice = mainmenu.Announce_num then
-            email.to_list = cfg.SMTP.currentSMTP.to
-         do until ((option = 'C') | (option = 'Q'))
-            call SysCls
-            say
-            say 'Email:' page_title cfg.crlf
-            say 'Verify/edit server-specific data for' cfg.SMTP.currentSMTP.host cfg.crlf
-            say 'To       :' email.to_list
-            say 'UserID   :' cfg.SMTP.currentSMTP.userid
-            say 'Password :' cfg.SMTP.currentSMTP.password
-            say
-            say 'Type "C" to confirm the above and send.'
-            say '     "Q" to abort sending this email.'
-            say '     "T" to change the list of addressees.'
-            say '     "U" to change the Userid.'
-            say '     "P" to change the Password.'
-            say
-            call charout, '==> '
-            option = translate(SysGetKey())
-            say
-            say
-            select
-               when option = 'T' then
-                  do
-                     say 'NOTE: Currently no edits are done on the email addresses.'
-                     say 'So make sure you use a proper format.'
-                     say
-                     say 'For multiple addressees, enter a comma-separated list.'
-                     say
-                     say 'Enter the addressee(s) (followed by the ENTER key).'
-                     email.to_list = linein()
-                  end
-               when option = 'U' then
-                  do
-                     say 'Enter the UserID (followed by the ENTER key):'
-                     cfg.SMTP.currentSMTP.userid = linein()
-                  end
-               when option = 'P' then
-                  do
-                     say 'Enter the Password (followed by the ENTER key):'
-                     cfg.SMTP.currentSMTP.password = linein()
-                  end
-               otherwise
-                  nop
-            end
-         end
-         if option = 'C' then
-            do
-               if cfg.SMTP.currentSMTP.command = '' then /* Use internal SMTP code */
-                  rcx = SendEmail()
-               else                                      /* Use external command */
-                  do
-                     say 'Using external command(s) to send email...'
-                     _command = cfg.SMTP.currentSMTP.Command
-                     do while pos('##TO##', _command) > 0
-                        parse var _command part1 '##TO##' part2
-                        _command = part1 || email.to_list || part2
-                     end
-                     do while pos('##FROM##', _command) > 0
-                        parse var _command part1 '##FROM##' part2
-                        _command = part1 || cfg.SMTP.currentSMTP.from || part2
-                     end
-                     do while pos('##SUBJECT##', _command) > 0
-                        parse var _command part1 '##SUBJECT##' part2
-                        _command = part1 || email.subject || part2
-                     end
-                     do while pos('##MESSAGE_BODY_FILE##', _command) > 0
-                        parse var _command part1 '##MESSAGE_BODY_FILE##' part2
-                        _command = part1 || stream(email.body_file, 'c', 'query exists') || part2
-                     end
-                     do while pos('##HOST##', _command) > 0
-                        parse var _command part1 '##HOST##' part2
-                        _command = part1 || cfg.SMTP.currentSMTP.host || part2
-                     end
-                     do while pos('##PORT##', _command) > 0
-                        parse var _command part1 '##PORT##' part2
-                        _command = part1 || cfg.SMTP.currentSMTP.port || part2
-                     end
-                     do while pos('##USERID##', _command) > 0
-                        parse var _command part1 '##USERID##' part2
-                        _command = part1 || cfg.SMTP.currentSMTP.userid || part2
-                     end
-                     do while pos('##PASSWORD##', _command) > 0
-                        parse var _command part1 '##PASSWORD##' part2
-                        _command = part1 || cfg.SMTP.currentSMTP.password || part2
-                     end
-                     do while pos('##UTCOFFSET##', _command) > 0
-                        parse var _command part1 '##UTCOFFSET##' part2
-                        _command = part1 || cfg.SMTP.currentSMTP.UTCOffset || part2
-                     end
-                     rcx = ExecCmd(_command)
-                  end
-            end
-         else
-            rcx = -1
-      end
-   call SysFileDelete email.body_file
-return rcx
-
-SetDefaultAnnouncementText: procedure expose (globals)
-   parse arg tempfile
-   release_file = 'fm2-' || ver.wpi || '.zip'
-   call lineout tempfile, 'FM/2' ver.full 'has been released. The file name is' release_file
-   call lineout tempfile, ''
-   call lineout tempfile, 'It has been uploaded to Netlabs and to Hobbes.'
-   call lineout tempfile, ''
-   call lineout tempfile, 'NETLABS'
-   call lineout tempfile, 'Initially uploaded to:'
-   call lineout tempfile, '  <ftp://ftp.netlabs.org/incoming/fm2/' || release_file || '>'
-   call lineout tempfile, 'Eventual location:'
-   call lineout tempfile, '  <ftp://ftp.netlabs.org/pub/fm2/' || release_file || '>'
-   call lineout tempfile, ''
-   call lineout tempfile, 'HOBBES'
-   call lineout tempfile, 'Search for it at:'
-   call lineout tempfile, '  <http://hobbes.nmsu.edu/h-search.php?sh=1&button=Search&key=' || release_file || '&dir=%2Fpub>'
-   call lineout tempfile, 'Initially uploaded to:'
-   call lineout tempfile, '  <http://hobbes.nmsu.edu/pub/incoming/' || release_file || '>'
-   call lineout tempfile, 'Eventual location:'
-   call lineout tempfile, '  <http://hobbes.nmsu.edu/pub/os2/util/browser/' || release_file || '>'
-/*
-   call lineout tempfile, '  http://hobbes.nmsu.edu/h-search.php?sh=1&button=Search&key=fm2&dir=%2Fpub%2Fincoming'
-   call lineout tempfile, 'which will eventually move to'
-   call lineout tempfile, '  http://hobbes.nmsu.edu/h-search.php?sh=1&button=Search&key=fm2&dir=%2Fpub%2Fos2%2Futil%2Fbrowser'
-*/
-   call lineout tempfile, ''
-   call lineout tempfile, ver.full 'Changes:'
-   history_file = 'history'
-   do until left(history_line || 'xxx', 3)  = ' o '
-      history_line = linein(history_file)
-   end
-   history_line = strip(history_line, 'T')
-   do until left(history_line, 1) > ' '
-      if length(history_line) > 3 then
-         if left(history_line, 3) = ' o ' then
-            history_line = ' * ' || substr(history_line, 4)
-      call lineout tempfile, history_line
-      history_line = strip(linein(history_file), 'T')
-   end
-   call stream tempfile, 'c', 'close'
-   call stream history_file, 'c', 'close'
-return
-
-SendEmail: procedure expose (globals)
-   retval = -2    /* Assume error of some sort */
-   say "Using ReleaseTool's internal SMTP code to send email..."
-   do 1
-      socket = ConnectToMailServer(cfg.SMTP.currentSMTP.host, cfg.SMTP.currentSMTP.port)
-      if socket < 0 then
-         do
-            say 'Unable to connect to' cfg.SMTP.currentSMTP.host
-            call SockPSock_errno
-            leave
-         end
-      reply = GetServerReply(socket)
-      if left(reply, 3) \= '220' then
-          do
-             say 'Unexpected initial response from:' cfg.SMTP.currentSMTP.host
-             say reply
-             leave
-          end
-      reply = SendDataAndGetServerReply(socket, 'EHLO' cfg.myHostName)
-      if left(reply, 3) \= '250' then
-         do
-            /* JBS: Send HELO instead? */
-            say reply
-            leave
-         end
-      parse value translate(translate(reply), ' ', '-') with . '250 AUTH ' auth_mechanisms (cfg.crlf) .
-      select
-         when auth_mechanisms = '' then
-            /* JBS: OK to assume no authorization? */
-            say 'AUTH not returned by server. Assuming no authentication required...'
-         when wordpos('LOGIN', auth_mechanisms) > 0 then
-            do
-               /* AUTH LOGIN login here */
-               reply = SendDataAndGetServerReply(socket, 'AUTH LOGIN')
-               if left(reply, 3) \= '334' then
-                  do
-                     say 'Authorization failed (or unexpected response to AUTH LOGIN).' || cfg.crlf || reply
-                     leave
-                  end
-               reply = SendDataAndGetServerReply(socket, EncodeB64(cfg.SMTP.currentSMTP.userid))
-               if left(reply, 3) \= '334' then
-                  do
-                     say 'Authorization failed (or unexpected response to userid).' || cfg.crlf || reply
-                     leave
-                  end
-               reply = SendDataAndGetServerReply(socket, EncodeB64(cfg.SMTP.currentSMTP.password))
-               if left(reply, 3) \= '235' then
-                  do
-                     say 'Authorization failed (or unexpected response to password).' || cfg.crlf || reply
-                     leave
-                  end
-            end
-         when wordpos('PLAIN', auth_mechanisms) > 0 then
-            do
-               /*
-                * AUTH LOGIN login here
-                *
-                * "The mechanism consists of a single message from the client to the server.
-                * The client sends the authorization identity (identity to login as),
-                * followed by a US-ASCII NULL character, followed by the authentication
-                * identity (identity whose password will be used), followed by a US-ASCII
-                * NULL character, followed by the clear-text password. The client may leave the
-                * authorization identity empty to indicate that it is the same as the authentication identity."
-                */
-               msg = cfg.SMTP.currentSMTP.userid || '00'x || cfg.SMTP.currentSMTP.userid || '00'x || cfg.SMTP.currentSMTP.password
-               reply = SendDataAndGetServerReply(socket, 'AUTH PLAIN' EncodeB64(msg))
-               if left(reply, 3) \= '235' then
-                  do
-                     say 'Authorization failed (or unexpected response to authentication).' || cfg.crlf || reply
-                     leave
-                  end
-            end
-         when wordpos('CRAM-MD5', auth_mechanisms) > 0 then
-            do
-/*
-               The CRAM-MD5 protocol involves a single challenge and response cycle, and is initiated by the server:
-
-                   Challenge: The server sends a base64-encoded string to the client. Before encoding, it could be any random string, but the standard that currently defines CRAM-MD5 says that it is in the format of a Message-ID email header value (including angle brackets) and includes an arbitrary string of random digits, a timestamp, and the server's fully qualified domain name.
-                   Response: The client responds with a string created as follows.
-                       The challenge is base64-decoded.
-                       The decoded challenge is hashed using HMAC-MD5, with a shared secret (typically, the user's password, or a hash thereof) as the secret key.
-                       The hashed challenge is converted to a string of lowercase hex digits.
-                       The username and a space character are prepended to the hex digits.
-                       The concatenation is then base64-encoded and sent to the server
-                   Comparison: The server uses the same method to compute the expected response. If the given response and the expected response match, then authentication was successful.
-*/
-
-               /* JBS: Implement AUTH CRAM-MD5 here? */
-               /* JBS: If implemented, move to top to become "preferred" authentication? */
-               say 'AUTH CRAM-MD5 not yet implemented!'
-               leave
-            end
-         when wordpos('DIGEST-MD5', auth_mechanisms) > 0 then
-            do
-               /* JBS: Implement AUTH DIGEST-MD5 here? */
-               /* JBS: If implemented, move to top to become "preferred" authentication? */
-               say 'AUTH DIGEST-MD5 not yet implemented!'
-               leave
-            end
-         otherwise
-            do
-               /* Unknown authorization required */
-               say 'Unknown, unimplemented authorization mechanisms:' auth_mechanisms
-               leave
-            end
-      end
-      say 'Preparing data to send...'
-      reply = SendDataAndGetServerReply(socket, 'MAIL FROM:<' || StrippedEmailAddress(cfg.SMTP.currentSMTP.from) || '>')
-      if left(reply, 3) \= '250' then
-         do
-            say 'Unexpected response to MAIL FROM:' || cfg.crlf || reply
-            leave
-         end
-      temp_to_list = email.to_list
-      do until (temp_to_list = '' | left(reply, 3) \= 250)
-         parse var temp_to_list addressee ',' temp_to_list
-         reply = SendDataAndGetServerReply(socket, 'RCPT TO: <' || StrippedEmailAddress(addressee) || '>')
-      end
-      if left(reply, 3) \= '250' then
-         do
-            say 'Unexpected response to RCPT TO:' || cfg.crlf || reply
-            leave
-         end
-      reply = SendDataAndGetServerReply(socket, 'DATA')
-      if left(reply, 3) \= '354' then
-         do
-            say 'Unexpected response to DATA:' || cfg.crlf || reply
-            leave
-         end
-      data = 'Date:' left(date('W'),3) || ', ' || date('N') || ' ' || time('N') || ' ' || cfg.SMTP.currentSMTP.UTCOffset || cfg.crlf
-      /* JBS: Message Id? */
-      data = data || 'To:' email.to_list || cfg.crlf
-      data = data || 'From:' cfg.SMTP.currentSMTP.FROM || cfg.crlf
-      /* JBS: Reply-to same as From? */
-      data = data || 'Reply-To:' cfg.SMTP.currentSMTP.FROM || cfg.crlf
-      data = data || 'Subject:' email.subject || cfg.crlf
-      data = data || 'MIME-Version: 1.0' || cfg.crlf
-      data = data || 'X-Mailer:' cfg.user_agent || cfg.crlf
-      data = data || 'X-Mailer-Platform: OS/2; architecture=x86; version=20.45' || cfg.crlf
-      data = data || cfg.crlf /* End of Header */
-      do while lines(email.body_file) > 0
-         line = linein(email.body_file)
-         data = data || line || cfg.crlf
-      end
-      call stream email.body_file, 'c', 'close'
-
-      data = data || cfg.SMTP.signature_preface || cfg.crlf   /* Start of signature */
-      do i = 1 to cfg.SMTP.currentSMTP.signature.0
-         data = data || cfg.SMTP.currentSMTP.signature.i || cfg.crlf
-      end
-      data = data || cfg.closing                             /* End of Message */
-      say
-
-/*
-      call charout , 'OK to send email? (Y/n): '
-      reply = translate(SysGetKey())
-      say
-      if reply \= 'N' then
-*/
-
-         do
-            reply = SendDataAndGetServerReply(socket, data)
-            if left(reply, 3) \= '250' then
-               do
-                  say 'Unexpected response to message send:' || cfg.crlf || reply
-                  retval = -1
-               end
-            else
-               do
-                  say 'Message sent successfully...'
-                  retval = 0
-               end
-         end
-      reply = SendDataAndGetServerReply(socket, 'QUIT')
-      if left(reply, 3) \= '221' then
-         do
-            say 'Unexpected response to QUIT:' || cfg.crlf || reply
-         end
-   end
-   if socket >= 0 then
-      do
-         say 'Disconnecting from server...'
-         call SockClose(socket)
-      end
-return retval
-
-StrippedEmailAddress: procedure
-   parse arg email_address
-   email_address = strip(email_address)
-   if left(email_address, 1) = '"' then
-      parse var email_address '"' . '"' email_address
-return strip(strip(strip(email_address), 'L', '<'), 'T', '>')
-
-GetServerReply: procedure expose (globals)
-   /* JBS: 1-time receive with large buffer or as-many-as-needed receives? */
-   max_recv_buffersize = 1024
-   parse arg socket
-   rc = SockRecv(socket, 'server_reply', max_recv_buffersize)
-   select
-      when rc < 0 then
-         return 'ERROR on receive:' rc
-      when rc = 0 then
-         return 'ERROR on receive: Connection closed prematurely.'
-      when rc = max_recv_buffersize then
-         return 'ERROR on receive: Buffer size too small?'
-      when pos(cfg.crlf, server_reply) = 0 then
-         return 'ERROR No CRLF found. Buffer too small?' || cfg.crlf || 'Reply:' server_reply
-      otherwise
-         nop
-   end
-return server_reply
-
-/**********************************************************************/
-EncodeB64: procedure expose (globals) /* encodes a text string */
-/**********************************************************************/
-   parse arg Text  /* get the argument */
-   B64Chars = xrange('A','Z')||xrange('a','z')||xrange('0','9')||'+/'  /* define the base64 character set */
-   B64Str = ''  /* start with nothing */
-   do while (length(Text) > 3)  /* go on while the length is sufficient */
-      parse var Text NextBlock 4 Text  /* get the next block of 3 characters */
-      NextBits = x2b(c2x(NextBlock))  /* convert it to 24 bits */
-      do 4  /* do 4 times */
-         parse var NextBits NextSext 7 NextBits  /* get the next sextet */
-         B64Str = B64Str||substr(B64Chars,x2d(b2x(NextSext))+1,1)  /* convert to decimal, get the corresponding B64 character, and add */
-      end
-   end
-   TextLeft = length(Text)  /* the number of 8-bit characters left (1, 2, or 3) */
-   if (TextLeft > 0) then  /* if we have anything left */
-      do
-         NextBits = x2b(c2x(Text))||copies('00',(3-TextLeft))  /* convert to bits and add zeroes */
-         do (TextLeft + 1)  /* do so many times */
-            parse var NextBits NextSext 7 NextBits  /* get the next sextet */
-            B64Str = B64Str||substr(B64Chars,x2d(b2x(NextSext))+1,1)  /* convert to decimal, get the corresponding B64 character, and add */
-         end
-         B64Str = B64Str||copies('=',3 - TextLeft)  /* add this */
-      end
-return B64Str  /* end of Encode64 */
-
-ConnectToMailServer: procedure expose (globals)
-   parse arg email_server_name, email_server_port
-   if strip(email_server_port) = '' then
-      email_server_port = 25
-
-   say 'Retrieving this host''s name...'
-   myIPaddr = SockGetHostid()
-   rc = SockGetHostByAddr(myIPaddr, 'hoststem.')
-   if rc = 0 then
-      do
-         say 'Error: SockGetHostByAddr'
-         say 'Error code:' SockSock_Errno()
-         call SockPSock_Errno 'Error text'
-         say 'Trying to use HOSTNAME command...'
-         '@hostname | rxqueue'
-         hn = ''
-         do while queued() > 0
-            parse pull cfg.myHostName
-         end
-         say 'Hostname output:' cfg.myHostName
-/*
-         return (-1000)
-*/
-      end
-   else
-      cfg.myHostName = hoststem.name
-   say 'Connecting to mail server...'
-   rc = SockGetHostByName(email_server_name, 'hoststem.')
-   if rc = 0 then
-      do
-         say 'Error: SockGetHostByName'
-         say 'Error code:' SockSock_Errno()
-         call SockPSock_Errno('Error text')
-         return (-1001)
-      end
-   serverIPaddr = hoststem.addr
-
-   socket = SockSocket('AF_INET', 'SOCK_STREAM', 'IPPROTO_TCP')
-   if socket < 0 then
-      exit_rc = -1
-   else
-      do
-         inetaddr.family = 'AF_INET'
-         inetaddr.addr   = serverIPaddr
-         inetaddr.port   = email_server_port
-         exit_rc         = SockConnect(socket, 'inetaddr.')
-      end
-   if exit_rc < 0 then
-      return exit_rc
-   else
-      return socket
-
-SendDataAndGetServerReply: procedure expose (globals)
-   parse arg socket, data
-   p = pos(cfg.crlf, data)
-   if p > 1 then
-      say 'Sending:' left(data, min(p - 1, 60)) || '...'
-   else if length(data) >  60 then
-      say 'Sending:' left(data, 60) || '...'
-   else
-      say 'Sending:' data
-   rc = SockSend(socket, data || cfg.crlf)
-   if rc <= 0 then
-      do
-         call SockPSock_errno
-         return 'ERROR on send:' rc
-      end
-   else
-      return GetServerReply(socket)
-
-Init: procedure expose (globals)
-   call RxFuncAdd 'SysLoadFuncs', 'REXXUTIL', 'SysLoadFuncs'
-   call SysLoadFuncs
-
-   call RxFuncAdd "SockLoadFuncs", "RXSOCK", "SockLoadFuncs"
-   call SockLoadFuncs 0
-   available.RXSOCK = 1
-
-/*
-   rcx = 0
-   call RxFuncAdd "SockLoadFuncs", "RXSOCK", "SockLoadFuncs"
-   signal on syntax name rxsockerr
-   call SockLoadFuncs 0
-   rcx = 1
-rxsockerr:
-   signal on syntax name Error
-   rcx = 1
-   if rcx = 1 then
-      available.RXSOCK = 1
-   else
-      do
-         available.RXSOCK = 0
-         call RxFuncDrop "SockLoadFuncs", "RXSOCK", "SockLoadFuncs"
-         say
-         say 'RXSOCK.DLL load failed.'
-         say 'Newsgroup announcements will not be possible.'
-         say
-         '@pause'
-      end
-
-*/
-
-   rcx = 0
-   call RxFuncAdd "FtpLoadFuncs", "RXFTP", "FTPLOADFUNCS"
-   signal on syntax name rxftperr
-   call FtpLoadFuncs 1
-   rcx = FtpSetBinary("Binary")
-rxftperr:
-   signal on syntax name Error
-   if rcx = 1 then
-      available.RXFTP = 1
-   else
-      do
-         available.RXFTP = 0
-         say
-         say 'RXFTP.DLL load failed.'
-         say 'Uploads will not be possible.'
-         say
-         '@pause'
-      end
-
-   ver. = ''
-   parse arg ver.in
-   call SetVer
-   ver.filelist = 'av2.def databar.def dirsize.def dll\fm3dll.def dll\fm3res.def'
-   ver.filelist = ver.filelist 'dll\version.h eas.def fm3.def fm4.def global.def ini.def'
-   ver.filelist = ver.filelist 'killproc.def sysinfo.def undel.def vcollect.def vdir.def'
-   ver.filelist = ver.filelist 'viewinfs.def vtree.def file_id.diz'
-   ver.filelist = ver.filelist 'warpin\makefile dll\copyright.h'
-
-   Hobbes.                       = ''
-   Hobbes.default_name           = 'Gregg Young'
-   Hobbes.default_email          = 'ygk@qwest.net'
-   Hobbes.TxtFilename            = '.\warpin\fm2-' || ver.wpi || '.txt'
-   if stream(Hobbes.TxtFilename, 'c', 'query exists') \= ''then
-      do
-         call SysFileSearch 'Email address:', Hobbes.TxtFilename, 'lines.'
-         if lines.0 = 1 then
-            Hobbes.uploader_email_address = word(lines.1, 3)
-         else
-            Hobbes.uploader_email_address = 'N/A (' || Hobbes.TxtFilename 'has zero or more than one email addresses!)'
-      end
-   else
-      Hobbes.uploader_email_address = 'N/A (' || Hobbes.TxtFilename 'does not yet exist!)'
-
-   cmd.           = ''
-   cmd.processor  = value('COMSPEC',,'OS2ENVIRONMENT')
-   cmd.processor_is_4os2 = Is4OS2()
-   if cmd.processor_is_4os2 = 1 then
-      available.tee = 1
-   else
-      do
-         if SysSearchPath('PATH', 'tee.exe') \= '' then
-            available.tee = 1
-         else
-            do
-               available.tee = 0
-               call SysFileDelete 'tee.cmd'
-               call lineout 'tee.cmd', '/* */'
-               call lineout 'tee.cmd', 'parse arg filename'
-               call lineout 'tee.cmd', 'call SysFileDelete filename'
-               call lineout 'tee.cmd', 'do while lines() > 0'
-               call lineout 'tee.cmd', '   parse pull line'
-               call lineout 'tee.cmd', '   call lineout filename, line'
-               call lineout 'tee.cmd', '   say line'
-               call lineout 'tee.cmd', 'end'
-               call lineout 'tee.cmd', "call stream filename, 'c', 'close'"
-               call stream  'tee.cmd', 'c', 'close'
-            end
-      end
-   userprompt = value('PROMPT',,'OS2ENVIRONMENT')
-   parse var userprompt . '$e[' colorset 'm' .
-   if colorset = '' then
-      colorset = '0'
-   if pos('$i', userprompt) > 0 then
-      row = '2'
-   else
-      row = '1'
-   cmd.prompt     = "$e[s$e[" || row || ";1H$e[34;47mType 'exit' to return to ReleaseTool$e[K$e[" || colorset || "m$e[u" || userprompt
-   cmd.pager      = value('PAGER',,'OS2ENVIRONMENT')
-   if cmd.pager = '' then
-      if SysSearchPath( 'PATH', 'less.exe') \= '' then
-         cmd.pager = 'less'
-      else
-         cmd.pager = 'more'
-
-   cmd.editor = value('SVN_EDITOR',,'OS2ENVIRONMENT')
-   cmd.editorparms = ""
-   if cmd.editor = '' then
-      cmd.editor = value('EDITOR',,'OS2ENVIRONMENT')
-   if cmd.editor = '' then
-      cmd.editor = 'tedit'
-   else
-      do
-         upperwrd1 = translate(word(cmd.editor, 1))
-         if upperwrd1 = 'EPM' | upperwrd1 = 'EPM.EXE' then
-            cmd.editorparms = "/m '3'"
-      end
-
-   cmd.smartsvn   = SysSearchPath('PATH', 'smartsvn.cmd')
-   cmd.tester     = value('SVN_TESTER',,'OS2ENVIRONMENT')
-   cmd.killpid    = value('SVN_KILL',,'OS2ENVIRONMENT')
-   if cmd.killpid = '' then
-      cmd.killpid = 'killpid'
-   cmd.killtarget = 'FM/2'
-
-   m = 0
-
-   m = m + 1
-   mainmenu.Ensure_work_done_num       = m
-   mainmenu.m.text                     = 'Ensure all work for this release is committed.'
-   m = m + 1
-   mainmenu.Verify_tickets_closed_num  = m
-   mainmenu.m.text                     = 'Verify completed tickets are marked closed.'
-   m = m + 1
-   mainmenu.Local_SVN_update_num       = m
-   mainmenu.m.text                     = '(SVN) Update local files.'
-   m = m + 1
-   mainmenu.Check_SVN_status_num       = m
-   mainmenu.m.text                     = 'Check (SVN) status of local files.'
-   m = m + 1
-   mainmenu.Version_number_edits_num   = m
-   mainmenu.m.text                     = 'Edit various files with version #''s and date''s.'
-   m = m + 1
-   mainmenu.WARNALL_build_num          = m
-   mainmenu.m.text                     = 'Ensure the edits build. (WARNALL build)'
-   m = m + 1
-   mainmenu.Test_WARNALL_build_num     = m
-   mainmenu.m.text                     = 'Test built code.'
-   m = m + 1
-   mainmenu.Commit_code_num            = m
-   mainmenu.m.text                     = 'Commit code.'
-   m = m + 1
-   mainmenu.Build_all_for_release_num  = m
-   mainmenu.m.text                     = 'Build (all) for the release.'
-   m = m + 1
-   mainmenu.Test_release_build_num     = m
-   mainmenu.m.text                     = 'Test the release build.'
-   m = m + 1
-   mainmenu.LXLITE_build_num           = m
-   mainmenu.m.text                     = 'Lxlite the build.'
-   m = m + 1
-   mainmenu.Test_LXLITE_build_num      = m
-   mainmenu.m.text                     = 'Re-test the "lxlited" release code.'
-   m = m + 1
-   mainmenu.Build_WPI_file_num         = m
-   mainmenu.m.text                     = 'Build distribution WPI file.'
-   m = m + 1
-   mainmenu.Test_WPI_file_num          = m
-   mainmenu.m.text                     = 'Test WPI file.'
-   m = m + 1
-   mainmenu.Apply_tag_num              = m
-   mainmenu.m.text                     = 'Apply tag.'
-   m = m + 1
-   mainmenu.Zip_files_num              = m
-   mainmenu.m.text                     = 'Zip distribution WPI file(s).'
-   m = m + 1
-   mainmenu.WIKI_updates_num           = m
-   mainmenu.m.text                     = 'Wiki updates.'
-   m = m + 1
-   mainmenu.Upload_num                 = m
-   mainmenu.m.text                     = 'Upload to distribution points.'
-   m = m + 1
-   mainmenu.Announce_num               = m
-   mainmenu.m.text                     = 'Announce the release.'
-   m = m + 1
-   mainmenu.TRAC_update_and_Next_ver_num  = m
-   mainmenu.m.text                        = 'TRAC updates and set next version (no HISTORY or README update).'
-
-   mainmenu.0 = m
-
-   prev_user_choice = 'N/A'
-return
-
-SetVer: procedure expose (globals)
-   do forever
-      if ver.in = '' then
-         do
-            say
-            call charout , 'Please enter the version (x.yy.z) for the pending release: '
-            ver.in = linein()
-         end
-      parse var ver.in num1 '.' num2 '.' num3
-      if num2    = '' then
-         num2    = 0
-      if num3 = '' then
-         num3 = 0
-      if datatype(num1) \= 'NUM' | datatype(num2) \= 'NUM' | datatype(num3) \= 'NUM' then
-         do
-            say 'Error: Invalid version entered:' ver.in
-            ver.in = ''
-         end
-      else
-         leave
-   end
-   /* The following will remove leading zeros */
-   ver.major      = num1 + 0
-   ver.minor      = num2 + 0
-   ver.CSDlevel   = num3 + 0
-   ver.full       = ver.major || '.' || ver.minor || '.' || ver.CSDlevel
-   ver.list       = ver.major || '.' || right(ver.minor, 2, '0') || '.' || ver.CSDlevel
-   ver.wpi        = translate(ver.list, '-', '.')
-   ver.tag        = translate(ver.list, '_', '.')
-return
-
-CfgInit: procedure expose (globals)
-   cfg.            = ''
-   cfg.file        = 'ReleaseTool.cfg'
-   cfg.file_exists = (stream(cfg.file, 'c', 'query exists') \= '')
-   if  \cfg.file_exists then
-     do
-       template_file = left(cfg.file, lastpos('.', cfg.file)) || 'tmp'
-       /* JBS: Check for missing template file? */
-       no_cfg_option = 0
-       do until wordpos(no_cfg_option, '1 2 3 4') > 0
-         call SysCls
-         say
-         say 'No' cfg.file 'file found.'
-         say
-         say 'Options:'
-         say '   1. Proceed without FTP, SMTP and NNTP features until one is configured.'
-         say '   2. Copy the template file (' || template_file || ') to' cfg.file 'and proceed'
-         say '         with (mostly) invalid CFG data.'
-         say '   3. Copy the template file to' cfg.file 'and edit it right now with'
-         say '         your SVN_EDITOR to suit your environment.'
-         say '   4. Exit now, create your own' cfg.file 'and restart ReleaseTool later.'
-         say
-         call charout , 'Enter the number of your choice: '
-         no_cfg_option = SysGetKey()
-         say
-         select
-           when no_cfg_option = 1 then
-             cfg.file_exists = 0
-           when no_cfg_option = 2 then
-             do
-               call CopyTemplateFile template_file, cfg.file /* No return on error */
-               cfg.file_exists = 1
-             end
-           when no_cfg_option = 3 then
-             do
-               call CopyTemplateFile template_file, cfg.file /* No return on error */
-               cmd.editor cmd.editorparams cfg.file
-               cfg.file_exists = 1
-             end
-           when no_cfg_option = 4 then
-             exit
-           otherwise
-             nop
-         end
-       end
-     end
-
-   cfg.crlf       = '0D0A'x
-   cfg.closing    = cfg.crlf || cfg.crlf || '.'
-   cfg.user_agent = 'FM2ReleaseTool'
-
-   cfg.FTP.0      = 0
-   cfg.NNTP.0     = 0
-   cfg.SMTP.0     = 0
-   cfg.FTP.keys   = 'DESCRIPTION COMMAND HOST USERID PASSWORD DIRECTORY FILE'
-   cfg.NNTP.keys  = 'DESCRIPTION COMMAND HOST USERID PASSWORD TO FROM SIGNATURE'
-   cfg.SMTP.keys  = 'DESCRIPTION COMMAND HOST USERID PASSWORD PORT TO FROM SIGNATURE UTCOFFSET'
-
-   cfg.NNTP.signature_preface     = cfg.crlf || '-- ' || cfg.crlf
-   cfg.NNTP.mime_version          = '1.0'
-   cfg.NNTP.content_type          = 'text/plain; charset=US-ASCII'
-   cfg.NNTP.content_transfer_encoding = '8bit'
-   cfg.maxNNTPrecvbufsize = 200   /* JBS: Better number? */
-   /* JBS: Better name? */
-
-   cfg.SMTP.signature_preface     = cfg.crlf || '-- ' || cfg.crlf
-
-   retval = 0
-   linenum = 0
-   node = ''
-   if cfg.file_exists then
-     do
-       do while (lines(cfg.file) > 0 & retval = 0)
-          parse value linein(cfg.file) || ';' with line ';'
-          linenum = linenum + 1
-          line = strip(line)
-          select
-             when line = '' then
-                nop      /* Skip blank/empty lines */
-             when left(line, 1) = ';' then
-                nop      /* Skip comment lines */
-             when left(line, 1) = '[' then
-                do
-                   select
-                      when node = 'FTP' then
-                         do
-                            cfg.node.n.directory.0 = d
-                            cfg.node.n.directory.d.file.0 = f
-                         end
-                      when node = 'SMTP' | node = 'NNTP' then
-                         do
-                            cfg.node.n.signature.0 = s
-                            s = 0
-                         end
-                      otherwise
-                         nop
-                   end
-                   parse upper var line '[' node ']'
-                   cfg.node.0 = cfg.node.0 + 1
-                   n = cfg.node.0
-                   d = 0
-                   f = 0
-                   s = 0
-                end
-             when pos('=', line) = 0 then
-                retval = 10000 + linenum
-             otherwise
-                do
-                   parse var line key_name '=' key_value
-                   key_name = translate(strip(key_name))
-                   key_value = strip(key_value)
-                   p =  lastpos(';', key_value)
-                   if p = 1 then
-                      do
-                         retval = 10000 + linenum
-                         iterate
-                      end
-                   else if p > 1 then
-                      key_value = strip(left(key_value, p - 1))
-                   select
-                      when wordpos(key_name, cfg.node.keys) = 0 then
-                         retval = -(10000 + linenum)
-                      when (node = 'SMTP' | node = 'NNTP') & key_name = 'SIGNATURE' then
-                         do
-                            s = s + 1
-                            cfg.node.n.signature.s = key_value
-                         end
-                      when node = 'FTP' & key_name = 'DIRECTORY' then
-                         do
-                            d = d + 1
-                            cfg.node.n.directory.d = key_value
-                         end
-                      when node = 'FTP' & key_name = 'FILE' then
-                         do
-                            if d = 0 then
-                               do
-                                  d = 1
-                                  cfg.node.n.directory.d = ''
-                               end
-                            f = f + 1
-                            cfg.node.n.directory.d.file.f = key_value
-                         end
-                      otherwise
-                         cfg.node.n.key_name = key_value
-                   end
-                end
-          end
-       end
-       if node = 'FTP' then
-          do
-             cfg.node.n.directory.0 = d
-             cfg.node.n.directory.d.file.0 = f
-          end
-       else if (node = 'SMTP' | node = 'NNTP') then
-          cfg.node.n.signature.0 = s
-       call stream cfg.file, 'c', 'close'
-     end
-return retval
-
-CopyTemplateFile: procedure
-  parse arg template_file, cfg_file
-  do i = 1 to 2
-    if stream(template_file, 'c', 'query exists') = '' then
-      do
-        say
-        say 'Unable to find template file:' template_file
-        if i = 1 then
-          do
-            say 'Trying to get one from the repository...'
-            'svn update' template_file
-          end
-        else
-          do
-            say 'svn update failed.'
-            say 'Exiting...'
-            exit
-          end
-      end
-  end
-  signal off error
-  '@copy' template_file cfg_file '>NUL 2>NUL'
-  if rc \= 0 then
-    do
-      say 'Copy of template file failed.'
-      say 'Exiting...'
-      exit
-    end
-  signal on error
-return
-
-DisplayMenu: procedure expose (globals)
-   do forever
-      call SysCls
-      say;say;say
-      say 'Release Tasks' || copies(' ', 35) || 'Previous action:' prev_user_choice
-      say
-      do m = 1 to mainmenu.0
-         say right(m, 2) || '.' mainmenu.m.text
-      end
-      say
-      call charout , 'N)ext C)ommandline '
-/*
-      call charout , 'cfG) '
-*/
-      if cmd.smartsvn \= '' then
-         call charout , 'S)martSVN '
-      call charout , 'Q)uit or menu item number: '
-      user_choice = translate(translate(SysGetKey()), 'N', '0d'x)
-      if user_choice = 'N' | /* JBS: Disabled internal CFG code: user_choice = 'G' | */ ,
-         user_choice = 'C' | ,
-         user_choice = 'Q' | ,
-         (cmd.smartsvn \= '' & user_choice = 'S') then
-         leave
-      if datatype(user_choice) = 'NUM' then
-         do
-            user_choice = user_choice || linein()
-            say
-            if datatype(user_choice) = 'NUM' then
-               if user_choice = trunc(user_choice) then
-                  if user_choice > 0 & user_choice <= mainmenu.0 then
-                     leave
-         end
-   end
-   say
-   if user_choice = 'N' then
-      if prev_user_choice = 'N/A' then
-         user_choice = 1
-      else
-         if prev_user_choice < mainmenu.0 then
-            user_choice = prev_user_choice + 1
-return user_choice
-
-NotYet: procedure
-   parse arg user_choice
-   say;say
-   say 'This option has not yet been (and may never be) automated.'
-   say 'You will have to do this manually. See instructions below:'
-   say;say
-return
-
-BuildHobbesTxt: procedure expose (globals)
-   if stream(Hobbes.TxtFilename, 'c', 'query exists') \= '' then
-      do
-         say;say;say
-         say Hobbes.TxtFilename 'already exists!'
-         call charout , 'Do you want to replace this file? (y/N) '
-         if translate(SysGetKey()) \= 'Y' then
-            do
-               say;say;
-               say Hobbes.TxtFilename 'update aborted.'
-               return
-            end
-         call SysFileDelete Hobbes.TxtFilename
-      end
-   /* Prompt for user input (name, email, permission to email, previous version) here? */
-   default_OKtoListEmail   = 'yes'
-   entry = ''
-   do until (entry = 'Y' | entry = '0d'x)
-      say;say
-      say 'You will now be prompted for potentially variable fields within:'
-      say '   ' Hobbes.TxtFilename
-      say
-      say 'A default value will be given for most fields.'
-      say 'To accept the default just press the Enter key.'
-      say
-      call charout , 'Name of the releaser (default:' Hobbes.default_name '): '
-      entry = strip(linein())
-      if entry = '' then
-         name = Hobbes.default_name
-      else
-         name = entry
-      say;say
-      call charout , 'Email address of the releaser (default:' Hobbes.default_email '): '
-      entry = strip(linein())
-      if entry = '' then
-         Hobbes.uploader_email_address = Hobbes.default_email
-      else
-         Hobbes.uploader_email_address = entry
-      say;say
-      call charout , 'OK to list email address of the releaser (default:' default_OKtoListEmail '): '
-      entry = strip(linein())
-      if entry = '' then
-         OKtoListEmail = default_OKtoListEmail
-      else
-         if translate(left(entry, 1)) = translate(left(default_OKtoListEmail, 1)) then
-            OKtoListEmail = default_OKtoListEmail
-         else
-            if left(default_OKtoListEmail, 1) = 'y' then
-               OKtoListEmail = 'no'
-            else
-               OKtoListEmail = 'yes'
-      say;say
-      say 'Please enter the version of the zip file to be replaced (default:' ver.wpi || '):'
-      entry = strip(linein())
-      if entry = '' then
-         replaced_ver_zip = 'fm2-' || ver.wpi || '.zip'
-      else
-         replaced_ver_zip = 'fm2-' || translate(linein(), '-', '.') || '.zip'
-      say;say
-      say 'Data entered:'
-      say '  Name of releaser   :' name
-      say '  Email of releaser  :' Hobbes.uploader_email_address
-      say '  OK to list email   :' OKtoListEmail
-      say '  Zip to be replaced :' replaced_ver_zip
-      say;say
-      call charout , 'OK to write Hobbes'' text file? (Y/n) '
-      entry = translate(SysGetKey())
-      say
-   end
-
-   rm1 = 73
-   rm2 = 25
-   call lineout Hobbes.TxtFilename, right('Upload Information Template for Hobbes.nmsu.edu', rm1)
-   call lineout Hobbes.TxtFilename, right(copies('=', length('Upload Information Template for Hobbes.nmsu.edu')), rm1)
-   call lineout Hobbes.TxtFilename, ''
-   call lineout Hobbes.TxtFilename, right('Archive Filename:', rm2) || ' fm2-' || ver.wpi || '.wpi'
-   call lineout Hobbes.TxtFilename, right('Short Description:', rm2) || ' Mark Kimes FM/2 File Manager ' || ver.full
-   call lineout Hobbes.TxtFilename, right('Long Description:', rm2) || ' The package contains a warpin package for installing FM2.'
-   call lineout Hobbes.TxtFilename, copies(' ', rm2) || ' The FM2 source code is available on netlabs.'
-   call lineout Hobbes.TxtFilename, right('Proposed directory ', rm2)
-   call lineout Hobbes.TxtFilename, right('for placement:', rm2) || ' pub/os2/util/browser'
-   call lineout Hobbes.TxtFilename, ''
-   call lineout Hobbes.TxtFilename, right('Your name:', rm2) name
-   call lineout Hobbes.TxtFilename, right('Email address:', rm2) Hobbes.uploader_email_address
-   call lineout Hobbes.TxtFilename, right('Program contact name:', rm2) || ' (same)'
-   call lineout Hobbes.TxtFilename, right('Program contact email:', rm2) || ' (same)'
-   call lineout Hobbes.TxtFilename, right('Program URL:', rm2) || ' http://svn.netlabs.org/fm2'
-   call lineout Hobbes.TxtFilename, ''
-   call lineout Hobbes.TxtFilename, right('Would you like the ', rm2)
-   call lineout Hobbes.TxtFilename, right('contact email address ', rm2)
-   call lineout Hobbes.TxtFilename, right('included in listings?', rm2) OKtoListEmail
-   call lineout Hobbes.TxtFilename, ''
-   call lineout Hobbes.TxtFilename, right('Operating System/Version:', rm2) || ' OS/2 Warp 3.0 and up.'
-   call lineout Hobbes.TxtFilename, right('Additional requirements:', rm2)
-   call lineout Hobbes.TxtFilename, ''
-   call lineout Hobbes.TxtFilename, right('Replaces:', rm2) replaced_ver_zip
-   call stream  Hobbes.TxtFilename, 'c', 'close'
-   say;say;say
-   say Hobbes.TxtFilename 'has been written.'
-return
-
-Commandline: procedure expose (globals)
-   signal off Error
-   if cmd.processor_is_4os2 = 1 then
-      '@' || cmd.processor "prompt"  cmd.prompt
-   else
-      '@' || cmd.processor "/k prompt=" || cmd.prompt
-   signal on Error
-return
-
-ExecCmd: procedure
-   parse arg command
-   signal off Error
-   command
-   rcx = rc
-   signal on Error
-return rcx
-
-/*=== Is4OS2() Return true if 4OS2 running ===*/
-Is4OS2: procedure
-  call setlocal
-  '@set X=%@eval[0]'
-  yes = value('X',, 'OS2ENVIRONMENT') = 0
-  call endlocal
-return yes				/* if running under 4OS2 */
-
-RunTester: procedure expose (globals)
-/* kills FM/2 using killpid from FM/2 utils (must be in path) ... */
-   call ExecCmd cmd.killpid cmd.killtarget
-/* and run cmd to copy files to test directory and change to that directory must type exit to return here */
-   call ExecCmd cmd.processor cmd.tester
-return
-
-TestWPI: procedure expose (globals)
-   parse arg tasknum
-   if cmd.wic = '' then
-      do
-         warpin_path = strip(SysIni('USER', 'WarpIN', 'Path'), 'T', '00'x)
-         if warpin_path = 'ERROR:' then
-            do
-               call NewScreenWithHeading tasknum
-               say
-               say
-               say 'Unable to find Warpin directory in OS2.INI file.'
-               say
-               say 'Testing the WPI file is not possible without it.'
-               say
-               say 'Please reinstall Warpin and try again.'
-               say
-            end
-         else
-            do
-               cmd.wic = warpin_path || '\wic.exe'
-               cmd.warpin = warpin_path || '\warpin.exe'
-               beginlibpath = SysQueryExtLibpath('B')
-               if pos( ';' || translate(warpin_path) || ';', ';' || translate(beginlibpath) || ';') = 0 then
-                  do
-                     call SysSetExtLibpath warpin_path || ';' || beginlibpath, 'B'
-                  end
-               warpin_ini = warpin_path || '\datbas_' || left(SysBootDrive(), 1) || '.ini'
-               cmd.wpi_viewer = value('SVN_WPIVIEWER',,'OS2ENVIRONMENT')
-               if cmd.wpi_viewer = '' then
-                  do
-                     cmd.wpi_viewer = value('WPIVIEWER',,'OS2ENVIRONMENT')
-                     if cmd.wpi_viewer = '' then
-                        cmd.wpi_viewer = SysSearchPath('PATH', 'wpiview.exe')
-                  end
-            end
-      end
-   if cmd.wic \= '' then
-      do
-         previous_choice = 0
-         do until choice = 'Q'
-            call NewScreenWithHeading tasknum
-            say
-            say '1. View FM/2 WPI file'
-            say '2. De-install FM/2 and fully delete FM/2 installation directories.'
-            say '3. Install FM/2'
-            say '4. Test the new installation.'
-            say '5. Create ZIP file for debugging WPI file problems.'
-            say
-            call charout , 'N)ext C)ommandline Q)uit (to main menu) or number of choice: '
-            choice = translate(translate(SysGetKey()), 'N', '0d'x)
-            say
-            if choice = 'N' then
-               if previous_choice = '5' then
-                  iterate
-               else
-                  choice = previous_choice + 1
-            select
-               when choice = 'C' then
-                  call Commandline
-               when choice = '1' then
-                  do
-                     if cmd.wpi_viewer = '' then
-                        do
-                           say
-                           say 'This program has searched for w WPI viewer (in the order listed):'
-                           say '  1. Environment variable: SVN_WPIVIEWER'
-                           say '  2. Environment variable: WPIVIEWER'
-                           say '  3. WPIView.exe on the PATH'
-                           say
-                           say 'A viewer was not found. Using wic.exe instead...'
-                           say
-                           '@pause'
-                           call ExecCmd cmd.wic '-l warpin\fm2-' || ver.wpi || '.wpi | rxqueue'
-                           p = 0
-                           do while queued() > 0
-                              parse pull line
-                              if word(line, 1) = 'Package' then
-                                 do
-                                    p = p + 1
-                                    pkg.p.num = word(line, 2)
-                                 end
-                           end
-                           pkg.0 = p
-                           do p = 1 to pkg.0
-                              call ExecCmd cmd.wic '-l warpin\fm2-' || ver.wpi || '.wpi' pkg.p.num '|' cmd.pager
-                           end
-                           if pos('less', cmd.page) = 0 then 'pause'
-                        end
-                     else
-                        do
-                           cmd.wpi_viewer 'warpin\fm2-' || ver.wpi || '.wpi'
-                        end
-                  end
-               when choice = '2' then
-                  do
-                     deinstall. = ''
-                     call SysIni warpin_ini, 'ALL:', 'warpin_apps.'
-                     do i = 1 to warpin_apps.0
-                        select
-                           when left(warpin_apps.i, 17) = 'Netlabs\FM2\Base\'then
-                              deinstall.base_dir_before  = strip(SysIni( warpin_ini, warpin_apps.i, 'TargetPath' ), 'T', '00'x)
-                           when left(warpin_apps.i, 31) = 'Netlabs\FM2 Utilities\FM2Utils\'then
-                              deinstall.utils_dir_before = strip(SysIni( warpin_ini, warpin_apps.i, 'TargetPath' ), 'T', '00'x)
-                           otherwise
-                              nop
-                        end
-                     end
-                     drop warpin_apps.
-                     say
-                     say 'There are two parts to this process:'
-                     say '  1. Invoking WarpIN to deinstall FM/2'
-                     say "  2. Using the DELTREE utility to delete all remaining files and directories."
-                     say
-                     say 'Part 1: Warpin de-install. WarpIN is a PM program and the deinstallation will'
-                     say 'not be automated by this program. Please follow these steps once WarpIN'
-                     say 'has started:'
-                     say '  a) It will appear just as a normal installation. Proceed to the window where'
-                     say '     packages are selected.'
-                     say '  b) If you want to deinstall ALL packages, use the "Selections" menu and'
-                     say '     choose "De-install". Otherwise, for each package you want to de-install,'
-                     say '     double click on its icon until it changes to one with a red "X"'
-                     say '  c) Once the packages to be de-installed each have an icon with a red "X",'
-                     say '     click on "Next".'
-                     say '  d) Then click on "Install" in the next window.'
-                     say '  e) You should get a message box asking if it is OK to proceed.'
-                     say '     Click on OK when ready.'
-                     say
-                     say 'WarpIN will be started asyncronously. This will allow you to switch back'
-                     say 'to this window for these instructions, if needed. Once WarpIN has finished,'
-                     say 'switch back to this window.'
-                     say
-                     call charout , 'Press any key when ready to start WarpIN...'
-                     call SysGetKey
-                     say
-                     call ExecCmd 'start' cmd.warpin 'warpin\fm2-' || ver.wpi || '.wpi'
-                     say
-                     do until choice2 = 'Y' | choice2 = 'N'
-                        say
-                        say 'Part 2: Deleting the remaining files'
-                        say
-                        call charout , 'Has WarpIN finshed completely and is it OK to proceed? (y/n): '
-                        choice2 = translate(SysGetKey())
-                        say;say
-                     end
-                     if choice2 = 'Y' then
-                        do
-                           call SysIni warpin_ini, 'ALL:', 'warpin_apps.'
-                           do i = 1 to warpin_apps.0
-                              select
-                                 when left(warpin_apps.i, 17) = 'Netlabs\FM2\Base\'then
-                                    deinstall.base_dir_after  = strip(SysIni( warpin_ini, warpin_apps.i, 'TargetPath' ), 'T', '00'x)
-                                 when left(warpin_apps.i, 31) = 'Netlabs\FM2 Utilities\FM2Utils\'then
-                                    deinstall.utils_dir_after = strip(SysIni( warpin_ini, warpin_apps.i, 'TargetPath' ), 'T', '00'x)
-                                 otherwise
-                                    nop
-                              end
-                           end
-                           drop warpin_apps.
-                           if deinstall.base_dir_after = '' then
-                              if deinstall.base_dir_before \= '' then
-                                 do
-                                    do until (choice2 = 'Y' | choice2 = 'N')
-                                       say
-                                       say 'You have de-installed the FM/2 base package.'
-                                       say
-                                       say 'Next is the deletion of ALL files and directories in its installation directory:'
-                                       say '   ' deinstall.base_dir_before
-                                       call charout , 'Are you sure you want to proceed? (y/N): '
-                                       choice2 = translate(SysGetKey())
-                                    end
-                                    if choice2 = 'Y' then
-                                       do
-                                          signal off Error
-                                          'warpin\fm2utils\deltree' deinstall.base_dir_before
-                                          signal on Error
-                                       end
-                                 end
-                           if deinstall.utils_dir_after = '' then
-                              if deinstall.utils_dir_before \= '' then
-                                 do
-                                    call SysFileTree deinstall.utils_dir_before, 'dirlist.', 'DO'
-                                    if dirlist.0 = 1 then
-                                       do
-                                          do until (choice2 = 'Y' | choice2 = 'N')
-                                             say
-                                             say 'You have de-installed the FM/2 Utilities package.'
-                                             say
-                                             say 'Next is the deletion of ALL files and directories in its installation directory:'
-                                             say '   ' deinstall.utils_dir_before
-                                             call charout , 'Are you sure you want to proceed? (y/N): '
-                                             choice2 = translate(SysGetKey())
-                                          end
-                                          if choice2 = 'Y' then
-                                             do
-                                                call ExecCmd 'warpin\fm2utils\deltree' deinstall.utils_dir_before
-                                             end
-                                       end
-                                 end
-                        end
-                  end
-               when choice = '3' then
-                  do
-                     say
-                     say 'Opening a commandline session for testing...'
-                     say
-                     call ExecCmd cmd.warpin 'warpin\fm2-' || ver.wpi || '.wpi'
-                  end
-               when choice = '4' then
-                  do
-                     call SysIni warpin_ini, 'ALL:', 'warpin_apps.'
-                     do i = 1 to warpin_apps.0
-                        if left(warpin_apps.i, 17) = 'Netlabs\FM2\Base\'then
-                           do
-                              fm2_installation_dir  = SysIni( warpin_ini, warpin_apps.i, 'TargetPath' )
-                              leave
-                           end
-                     end
-                     drop warpin_apps.
-                     curdir = directory()
-                     installation_drive = left(fm2_installation_dir, 2)
-                     curdir2 = directory(installation_drive)
-                     call directory fm2_installation_dir
-                     call Commandline
-                     call directory installation_drive
-                     call directory curdir2
-                     call directory left(curdir, 2)
-                     call directory curdir
-                  end
-               when choice = '5' then
-                  do
-                     if cmd.zip = '' then
-                        cmd.zip = SysSearchPath('PATH', 'zip.exe')
-                     if cmd.zip = '' then
-                        do
-                           say
-                           say 'ZIP.EXE was not found on the PATH. Please correct'
-                           say 'this ASAP and execute this option again.'
-                        end
-                     else
-                        do
-                           tmpzipfile = SysTempFilename('rtdbg???.zip')
-                           tmpdirfile = SysTempFilename('rtdbgdir.???')
-                           call ExecCmd '@dir * /s >' tmpdirfile
-                           call ExecCmd cmd.zip '-9X' tmpzipfile 'warpin\fm2-' || ver.wpi || '.wpi'
-                           call ExecCmd cmd.zip '-9X' tmpzipfile 'warpin\bld_fm2_wpidirs.*'
-                           call ExecCmd cmd.zip '-9X' tmpzipfile 'warpin\fm2.wis.in'
-                           call ExecCmd cmd.zip '-9mX' tmpzipfile tmpdirfile
-                           say
-                           say 'If the preceding zip commands were successful, please send an email to'
-                           say '     jsmall@os2world.net'
-                           say 'and attach the file:'
-                           say '   ' tmpzipfile
-                           say 'as an attachment. In the text of the message, please describe'
-                           say 'the errors you detected in detail. After the email has been sent'
-                           say 'you may delete:'
-                           say '   ' tmpzipfile
-                           say
-                           'pause'
-                        end
-                  end
-               otherwise
-                  nop
-            end
-         end
-      end
-return
-
-UploadRelease: procedure expose (globals)
-  rcx = 0
-  upload_count = 0
-  select
-    when (available.RXFTP = 0 | \cfg.file_exists) then
-      do
-        if \cfg.file_exists then
-          say 'Until' cfg.file ' has been created and customized,'
-        else
-          say 'Until RXFTP.DLL is placed in a directory on the LIBPATH,'
-        say 'manual uploading will be required.'
-        say
-        call charout , 'Would you like a commandline session to upload? (Y/n) '
-        reply = translate(SysGetKey())
-        say
-        if reply \= 'N' then
-           call Commandline
-        else
-           rcx = 1
-        say
-      end
-    otherwise
-      do
-         call SysCls
-         do until (choice = 'A' | choice = 'Q')
-            say
-            say 'Choose which uploads to perform:'
-            say
-            say 'A) Perform all uploads'
-            do u = 1 to cfg.FTP.0
-               say u || ') Upload to' cfg.ftp.u.description
-            end
-            say 'Q) Quit, perform no (more) uploads'
-            say
-            call charout , 'Enter the letter or number of your choice: '
-            choice = translate(SysGetKey())
-            say
-            select
-               when choice = 'A' then
-                  do
-                     startat = 1
-                     endat = cfg.FTP.0
-                  end
-               when choice = 'Q' then
-                  do
-                     startat = 10
-                     endat = 1
-                  end
-               when datatype(choice) = 'NUM' then
-                  if choice > cfg.FTP.0 then
-                     iterate
-                  else
-                     do
-                        startat = choice
-                        endat = choice
-                     end
-               otherwise
-                  iterate
-            end
-            say
-            do u = startat to endat
-               rcx = 0
-               say 'Uploading to' cfg.FTP.u.description || '...'
-               if cfg.FTP.u.command \= '' then
-                  do
-                     say 'Using external command(s) to upload...'
-                     _command = cfg.FTP.u.command
-                     do while pos('##HOST##', _command) > 0
-                        parse var _command part1 '##HOST##' part2
-                        _command = part1 || cfg.FTP.u.host || part2
-                     end
-                     do while pos('##PORT##', _command) > 0
-                        parse var _command part1 '##PORT##' part2
-                        _command = part1 || cfg.FTP.u.port || part2
-                     end
-                     do while pos('##USERID##', _command) > 0
-                        parse var _command part1 '##USERID##' part2
-                        _command = part1 || cfg.FTP.u.userid || part2
-                     end
-                     do while pos('##PASSWORD##', _command) > 0
-                        parse var _command part1 '##PASSWORD##' part2
-                        _command = part1 || cfg.FTP.u.password || part2
-                     end
-                     do while pos('[Release-zip]', _command) > 0
-                        parse var _command part1 '[Release-zip]' part2
-                        _command = part1 || 'warpin\fm2-' || ver.wpi || '.zip' || part2
-                     end
-                     do while pos('[Hobbes-text]', _command) > 0
-                        parse var _command part1 '[Hobbes-text]' part2
-                        _command = part1 || 'warpin\fm2-' || ver.wpi || '.txt' || part2
-                     end
-                     rcx = ExecCmd(_command)
-                     if rcx = 0 then
-                        upload_count = upload_count + 1
-                     say
-                  end
-               else
-                  do
-                     say '   Setting up logon data...'
-                     if cfg.FTP.u.password = '[Hobbes-email]' then
-                        if left(Hobbes.uploader_email_address, 3) = 'N/A' then
-                           cfg.FTP.u.password = ''
-                        else
-                           cfg.FTP.u.password = Hobbes.uploader_email_address
-                     if (cfg.FTP.u.userid = '' | cfg.FTP.u.password = '') then
-                        do
-                           say
-                           say '      The userid and/or password were not found in ReleaseTool.cfg.'
-                           say '      You will now be prompted for the missing data.'
-                           say
-                           if cfg.FTP.u.userid = '' then
-                              do
-                                 call charout , '      Please enter the userid for' cfg.FTP.u.descriptive_hostname ||': '
-                                 cfg.FTP.u.userid = strip(linein())
-                                 say
-                              end
-                           say
-                           if cfg.FTP.u.password = '' then
-                              do
-                                 call charout , '      Please enter the password for' cfg.FTP.u.descriptive_hostname ||': '
-                                 cfg.FTP.u.password  = strip(linein())
-                                 say
-                              end
-                           say '      In order to avoid being prompted in the future, edit the'
-                           say '      ReleaseTool.cfg file to include this data.'
-                           say
-                        end
-                     rcx = FtpSetUser( cfg.FTP.u.host, StripNotNeeded(cfg.FTP.u.userid), StripNotNeeded(cfg.FTP.u.password), '')
-                     if rcx \= 1 then
-                        say '      Unable to set user data. Unable to continue.'
-                     else
-                        do
-                           do d = 1 to cfg.FTP.u.directory.0
-                              if cfg.FTP.u.directory.d \= '' then
-                                 do
-                                    say '   Changing directory to:' cfg.FTP.u.directory.d
-                                    rcx = FtpChDir(cfg.FTP.u.directory.d)
-                                    if rcx \= 0 then
-                                       do
-                                          say '   Unable to change directory. FTP Error:' FTPERRNO
-                                          iterate
-                                       end
-                                 end
-                              do f = 1 to cfg.FTP.u.directory.d.file.0
-                                 select
-                                    when cfg.FTP.u.directory.d.file.f = '[Release-zip]' then
-                                       uploadfile = 'warpin\fm2-' || ver.wpi || '.zip'
-                                    when cfg.FTP.u.directory.d.file.f = '[Hobbes-text]' then
-                                       uploadfile = 'warpin\fm2-' || ver.wpi || '.txt'
-                                    otherwise
-                                       uploadfile = cfg.FTP.u.directory.d.file.f
-                                 end
-                                 say '   Uploading:' uploadfile
-                                 rcx = FtpPut(uploadfile, filespec('n', uploadfile), "Binary")
-                                 if rcx \= 0 then
-                                    do
-                                       say '   Unable to upload. FTP Error:' FTPERRNO
-                                       leave
-                                    end
-                                 else
-                                    upload_count = upload_count + 1
-                              end
-                           end
-                           say '   Logging off' cfg.FTP.u.descriptive_hostname || '...'
-                           call FtpLogoff
-                           say
-                        end
-                  end
-/*
-               if rcx \= 0 then
-                  leave
-*/
-            end
-         end
-      end
-   end
-   '@pause'
-   if upload_count = 0 then
-      return -100
-   else
-      return rcx
-
-AnnounceToNewsgroups: procedure expose (globals)
-   if \cfg.file_exists then
-     do
-       say 'Unable to post to newsgroups without the configuration file:' cfg.file
-       say
-       return
-     end
-   nntp_body_file = SysTempFilename('NNTPBody.???')
-   call SetDefaultAnnouncementText nntp_body_file
-   cfg.NNTP.subject = 'FM/2' ver.full 'has been released.'
-   _text = '<Standard>'
-   do until ((option = 'C') | (option = 'Q'))
-      call SysCls
-      say
-      say 'News: Verify/edit content'
-      say
-      say 'Subject  :' cfg.NNTP.subject
-      say 'Text     :' _text
-      say
-      say 'Type "C" to confirm the above and proceed.'
-      say '     "Q" to abort.'
-      say '     "S" to edit the subject.'
-      say '     "T" to edit the message text (in an editor).'
-      say
-      call charout, '==> '
-      option = translate(SysGetKey())
-      say
-      say
-      select
-         when ((option = 'C') | (option = 'Q')) then
-            nop
-         when option = 'S' then
-            do
-               say 'Enter the Subject (followed by the ENTER key):'
-               cfg.NNTP.subject = linein()
-            end
-         when option = 'T' then
-            do
-               b4_timestamp = SysGetFileDateTime(nntp_body_file)
-               say 'The current body of the newsgroup message will now be loaded into an editor.'
-               say 'Make desired changes, if any, and save the file.'
-               say
-               call charout, 'Press any key when ready to load the message body into an editor: '
-               call SysGetKey
-               say
-               call ExecCmd cmd.editor nntp_body_file
-               if b4_timestamp \= SysGetFileDateTime(nntp_body_file) then
-                  _text = '<Modified>'
-            end
-         otherwise
-            nop
-      end
-   end
-   if option = 'Q' then
-      rcx = -1      /* User aborted operation */
-   else
-      do s = 1 to cfg.NNTP.0
-         call SysCls
-         say
-         do until ((option = 'C') | (option = 'Q'))
-/*
-            call SysCls
-*/
-            say cfg.crlf cfg.crlf cfg.crlf
-            say 'News: Announce release to newsgroups' cfg.crlf
-            say 'Verify/edit server-specific data for' cfg.NNTP.s.host
-            say
-            say 'Host     :' cfg.NNTP.s.host
-            say 'To       :' cfg.NNTP.s.to
-            say 'From     :' cfg.NNTP.s.from
-            say 'UserID   :' cfg.NNTP.s.userid
-            say 'Password :' cfg.NNTP.s.password
-            say
-            say 'Type "C" to confirm the above and send.'
-            say '     "Q" to abort sending this email.'
-            say '     "H" to change the name of the host.'
-            say '     "T" to change the list of newsgroups.'
-            say '     "F" to change the From address.'
-            say '     "U" to change the Userid.'
-            say '     "P" to change the Password.'
-            say
-            call charout, '==> '
-            option = translate(SysGetKey())
-            say
-            say
-            say
-            select
-               when option = 'H' then
-                  do
-                     say 'Enter the newsgroup host to use (followed by the ENTER key).'
-                     cfg.NNTP.s.host = linein()
-                  end
-               when option = 'T' then
-                  do
-                     say 'Enter a comma=separated list of newagroup(s) (followed by the ENTER key).'
-                     cfg.NNTP.s.to = linein()
-                  end
-               when option = 'F' then
-                  do
- /*
-                     say 'F.Y.I. The Hobbes email address is:' Hobbes.uploader_email_address
-                     say
-                  if reply \= '' then
-                     cfg.NNTP.s.from = reply
-                  else
-                     cfg.NNTP.s.from = Hobbes.uploader_email_address
- */
-                     say 'Enter the From email address. (followed by the ENTER key).'
-                     say '(You may want to disguise the address to avoid spam.)'
-                     cfg.NNTP.s.from = linein()
-                  end
-               when option = 'U' then
-                  do
-                     say 'Enter the UserID (followed by the ENTER key):'
-                     cfg.NNTP.s.userid = linein()
-                  end
-               when option = 'P' then
-                  do
-                     say 'Enter the Password (followed by the ENTER key):'
-                     cfg.NNTP.s.password = linein()
-                  end
-               otherwise
-                  nop
-            end
-         end
-         if option = 'C' then
-           do
-            if cfg.NNTP.s.command \= '' then
-               do
-                  say 'Using external command(s) to post to newsgroup(s)...'
-                  _command = cfg.NNTP.s.command
-                  do while pos('##HOST##', _command) > 0
-                     parse var _command part1 '##HOST##' part2
-                     _command = part1 || cfg.NNTP.s.host || part2
-                  end
-                  do while pos('##PORT##', _command) > 0
-                     parse var _command part1 '##PORT##' part2
-                     _command = part1 || cfg.NNTP.s.port || part2
-                  end
-                  do while pos('##USERID##', _command) > 0
-                     parse var _command part1 '##USERID##' part2
-                     _command = part1 || cfg.NNTP.s.userid || part2
-                  end
-                  do while pos('##PASSWORD##', _command) > 0
-                     parse var _command part1 '##PASSWORD##' part2
-                     _command = part1 || cfg.NNTP.s.password || part2
-                  end
-                  do while pos('##MESSAGE_BODY_FILE##', _command) > 0
-                     parse var _command part1 '##MESSAGE_BODY_FILE##' part2
-                     _command = part1 || stream(body_file, 'c', 'query exists') || part2
-                  end
-                  do while pos('##FROM##', _command) > 0
-                     parse var _command part1 '##FROM##' part2
-                     _command = part1 || cfg.NNTP.s.from || part2
-                  end
-                  do while pos('##TO##', _command) > 0
-                     parse var _command part1 '##TO##' part2
-                     _command = part1 || cfg.NNTP.s.to || part2
-                  end
-                  rcx = ExecCmd(_command)
-               end
-            else
-               do
-                  cfg.NNTP.message_body = ''
-                  do while lines(nntp_body_file) > 0
-                     cfg.NNTP.message_body = cfg.NNTP.message_body || linein(nntp_body_file) || cfg.crlf
-                  end
-                  call stream nntp_body_file, 'c', 'close'
-                  rcx = SendNNTP(s)
-               end
-             if rcx \= 0 then 'pause'
-           end
-         else
-            rcx = -1 /* User aborted */
-      end
-   call SysFileDelete nntp_body_file
-return rcx
-
-SendNNTP: procedure expose (globals)
-   parse arg s
-   say
-   say 'NNTP: Sending to' cfg.NNTP.s.host '...'
-   exit_rc = SockGetHostByName( cfg.NNTP.s.host, 'hostip.' )
-   if exit_rc = 0 then
-      do
-         say 'NNTP: DNS lookup on' cfg.NNTP.s.host 'failed.'
-      end
-   else
-      do
-         socket = SockSocket('AF_INET', 'SOCK_STREAM', 'IPPROTO_TCP')
-         if socket < 0 then
-            do
-               say 'NNTP: Unable to create a socket for use with' cfg.NNTP.s.host || '.'
-               iterate
-            end
-         else
-            do
-               inetaddr.family = 'AF_INET'
-               inetaddr.addr   = hostip.addr
-               inetaddr.port   = 119
-               exit_rc         = SockConnect(socket, 'inetaddr.')
-            end
-         if exit_rc < 0 then
-            do
-               say 'NNTP: Unable to connect to' cfg.NNTP.s.host || '.'
-            end
-         else
-            do forever
-               parse value NNTPReceive(socket, cfg.maxNNTPrecvbufsize) with rc server_reply
-               if rc \= 0 then leave
-/*
-               say 'NNTP: Sending initial POST...'
-               rc = SockSend(socket, 'POST' || cfg.crlf)
-               if rc < 0 then
-                  do
-                     say 'NNTP: Failed on sending initial POST request.'
-                     leave
-                  end
-               say 'NNTP: Receiving response to initial POST...'
-               parse value NNTPReceive(socket, cfg.maxNNTPrecvbufsize) with rc server_reply
-               if pos('480', server_reply) > 0 then /* authentication required */
-*/
-                  do
-                     say 'NNTP: Sending userid...'
-                     rc = SockSend(socket, 'AUTHINFO USER' StripNotNeeded(cfg.NNTP.1.userid) || cfg.crlf)
-                     if rc < 0 then
-                        do
-                           say 'NNTP: Failed on sending userid.'
-                           leave
-                        end
-                     say 'NNTP: Receiving response to userid...'
-                     parse value NNTPReceive(socket, cfg.maxNNTPrecvbufsize) with rc server_reply
-                     if pos('381', server_reply) > 0 then /* further authentication (password) required */
-                        do
-                     say 'NNTP: Sending password...'
-                           rc = SockSend(socket, 'AUTHINFO PASS' StripNotNeeded(cfg.NNTP.1.password) || cfg.crlf)
-                           if rc < 0 then
-                              do
-                                 say 'NNTP: Failed on sending password.'
-                                 leave
-                              end
-                        end
-                     else
-                        if pos('501', server_reply) > 0 then
-                           do
-                              say 'NNTP: Bad authentication'
-                              leave
-                           end
-                     say 'NNTP: Receiving response to password...'
-                     parse value NNTPReceive(socket, cfg.maxNNTPrecvbufsize) with rc server_reply
-                     if rc \= 0 then leave
-                     if pos('281', server_reply) = 0 then
-                        do
-                           say 'Bad response to password:' server_reply
-                           leave
-                        end
-                     say 'NNTP: Sending POST (After authorization)...'
-                     rc = SockSend(socket, 'POST' || cfg.crlf)
-                     if rc < 0 then
-                        do
-                           say 'NNTP: Failed on sending second POST request.'
-                           leave
-                        end
-                     say 'NNTP: Receiving response to POST (After authorization)...'
-                     parse value NNTPReceive(socket, cfg.maxNNTPrecvbufsize) with rc server_reply
-                     if rc \= 0 then leave
-                  end
-               if pos('340', server_reply) > 0 then /* OK to send */
-                  do
-                     parse var server_reply . '<' msg_id '>' .
-                     say 'NNTP: Sending message...'
-                     NNTPsig = ''
-                     do i = 1 to cfg.NNTP.s.signature.0
-                        NNTPsig = NNTPsig || cfg.NNTP.s.signature.i || cfg.crlf
-                     end
-                     senddata = 'From:' cfg.NNTP.s.from || cfg.crlf || ,
-                                'Message-ID: <' || msg_id || '>' || cfg.crlf || ,
-                                'Newsgroups:' cfg.NNTP.s.to || cfg.crlf || ,
-                                'Subject:' cfg.NNTP.subject || cfg.crlf || ,
-                                'User-Agent:' cfg.user_agent || cfg.crlf || ,
-                                'MIME-version:' cfg.NNTP.mime_version || cfg.crlf || ,
-                                'Content-Type:' cfg.NNTP.content_type || cfg.crlf || ,
-                                'Content-Transfer-Encoding:' cfg.NNTP.content_transfer_encoding || cfg.crlf || ,
-                                'Headings: Year' || cfg.crlf || ,
-                                cfg.crlf || ,
-                                cfg.NNTP.message_body || ,
-                                cfg.NNTP.signature_preface || ,
-                                NNTPsig || ,
-                                cfg.closing || cfg.crlf
-                     rc = SockSend(socket, senddata)
-                     if rc < 0 then
-                        do
-                           say 'NNTP: Send message failed.'
-                           leave
-                        end
-                     say 'NNTP: Receiving response to message send...'
-                     parse value NNTPReceive(socket, cfg.maxNNTPrecvbufsize) with rc server_reply
-                     if rc \= 0 then leave
-                     if pos('240', server_reply) = 0 then
-                        do
-                           say 'NNTP: Unknown response from server to message send:' server_reply
-                        end
-                  end
-               else
-                  say 'NNTP: Failed to get "OK to send" respsonse from server.'
-               leave
-            end
-         call SockSoClose(socket)
-
-      end
-return rc
-
-NNTPReceive: procedure expose (globals)
-   parse arg socket, maxdatasize
-   reply = ""
-   exit_rc = 10
-   do while (exit_rc = 10)
-      rc = SockRecv(socket, 'indata', maxdatasize )
-      select
-         when rc > 0 then
-            do
-               reply = reply || indata
-               if pos(cfg.crlf, reply) > 0 then
-                  do
-                     exit_rc = 0
-                     if rc = maxdatasize then
-                        say 'NNTP: Receive buffer size,' masdatasize || ', too small???'
-                  end
-
-            end
-         when rc = 0 then /* connection closed */
-            do
-               say "NNTP: Connection closed prematurely."
-               exit_rc = 4
-            end
-         otherwise /* Error occurred */
-            do
-               exit_rc = rc
-               /* JBS: SockPSock_errno write to STDERR, is this OK? */
-               call SockPSock_errno
-            end
-      end
-   end
-   if exit_rc \= 0 then
-      do
-         say 'NNTP: Error on initial response.'
-         say 'NNTP: Error code:' rc
-         say 'NNTP: Text returned:' server_reply
-      end
-return exit_rc reply
-
-ZipFiles: procedure expose (globals)
-   release_zipfile = '.\warpin\fm2-' || ver.wpi || '.zip'
-   /* Zip distro */
-   'zip -jX9' release_zipfile 'warpin\fm2-' || ver.wpi || '.wpi'
-
-   /* Zip FM/2 Utilities' */
-   /* JBS: Following code is temprarily abandoned */
-/*
-   call SysFileTree 'warpin\fm2utils*.wpi', 'utilswpi.', 'FO'
-   utilsmajor = '1'
-   utilsminor = '1'
-   do u = 1 to utilswpi.0
-      parse var utilswpi.u '-' utilsfilemajor '-' utilsfileminor '.'
-      utilsfilemajor = utilsfilemajor + 0
-      utilsfileminor = utilsfileminor + 0
-      if (utilsfilemajor > utilsmajor | ,
-          (utilsfilemajor = utilsmajor & ,
-           utilsfileminor > utilsminor)) then
-         do
-            utilsmajor = utilsfilemajor
-            utilsminor = utilsfileminor
-         end
-   end
-   utilsver = utilsmajor || '-' || utilsminor
-   if utilsver \= '1-1' then
-   else
-   if stream( 'warpin\fm2utils-' || utilsver || '.zip', 'c', 'query exists') = '' then
-      do
-         say 'Zipping up (new) FM2Utils...'
-         'zip -9jX' release_zipfile  'warpin\fm2utils-' || utilsver || '.wpi'
-      end
-*/
-return
-
-StripNotNeeded: procedure
-   parse arg instring
-   if instring = '[NotNeeded]' then
-      return ''
-   else
-      return instring
-
-TracUpdates: procedure expose (globals)
-   nextver.1 = ver.major || '.' || ver.minor + 1 || '.0'
-   nextver.2 = ver.major || '.' || ver.minor || '.' || ver.CSDlevel + 1
-   nextver.3 = ver.major + 1 || '.0.0'
-   nextver.0 = 3
-   do until (choice2 = 1 | choice2 = 2 | choice2 = 3)
-      say
-      say 'Set next version and update TRAC'
-      say
-      say 'The just-released version of FM/2 is:' ver.full
-      say
-      say 'Please select the next version:'
-      say
-      do i = 1 to nextver.0
-         say '  ' || i || ')' nextver.i
-      end
-      say
-      call charout , 'Enter the number of your choice: '
-      choice2 = SysGetKey()
-      say
-      say
-   end
-   say;say
-   say '   Create a TRAC version for FM/2' nextver.choice2
-   say
-   say '   Mark the next version as the default version for new tickets.'
-   say
-   say '   Create a TRAC milestone for FM/2' nextver.choice2 || ', if needed.'
-   say
-   say '   Mark the new milestone as the default milestone.'
-   say
-   say '   Mark the completed milestone as complete and'
-   say '   move any residual tickets to a future milestone.'
-   say '   (TRAC can move the tickets in bulk when you mark'
-   say '   the version milestone complete.)'
-   say
-/* JBS: Code disabled until its need/usefulness is determined. */
-/*
-   call charout , 'Press any key when ready to proceed: '
-   call SysGetKey
-   say
-*/
-   /* Set next version */
-/* JBS: Code disabled until its need/usefulness is determined. */
-/*
-   do f = 1 to words(ver.filelist)
-      call ReleaseEdit nextver.choice2 word(ver.filelist, f) 'trace=' || traceopt
-      say
-   end
-   call CommitifOK ver.filelist
-*/
-return
-
-NewScreenWithHeading: procedure expose (globals)
-   parse arg tasknum
-   call SysCls
-   say
-   say 'Task:' mainmenu.tasknum.text
-return
-
-CommitIfOK: procedure
-   parse arg filelist
-   svn_cmd = 'svn commit'
-   say;say;say
-   say 'Online and OK to execute:' svn_cmd filelist || '? (Y/n)'
-   if translate(SysGetKey()) \= 'N' then call ExecCmd svn_cmd filelist
-return
-
-/*** Usage/Error routines ***/
-
-Usage: procedure
-   say;say;say
-   i = 1
-   parse value SysTextScreenSize() with rows .
-   linesperscreen = rows - 2
-   do forever
-      srcline = sourceline(i)
-      if pos('CHANGE LOG', translate(srcline)) > 0 then
-         leave
-      else
-         say srcline
-      i = i + 1
-      if (i // linesperscreen) = 0 then
-         do
-            say
-            call charout , 'F)orward B)ack Q)uit: '
-            reply = translate(SysGetKey())
-            say
-            select
-               when reply = 'B' then
-                  i = i - (2 * linesperscreen)
-               when reply = 'Q' then
-                  leave
-               otherwise
-                  nop
-            end
-         end
-   end
-exit
-
-Novalue:
-  say 'Uninitialized value found on line:' sigl
-  say 'Variable:' condition('D')
-  say 'Text:'
-  do i = sigl-3 to sigl+3
-     if i = sigl then
-        call charout , '--> '
-     else
-        call charout , '    '
-     say sourceline(i)
-  end
-exit
-
-/*=== Error() Report ERROR, FAILURE etc. and exit ===*/
-Error:
-  say;say;say
-  parse source . . cmdfile
-  say 'CONDITION'('C') 'signaled at' cmdfile 'line' SIGL'.'
-  if 'CONDITION'('D') \= '' then
-    say 'REXX reason =' 'CONDITION'('D')'.'
-  if 'CONDITION'('C') == 'SYNTAX' & 'SYMBOL'('RC') == 'VAR' then
-    say 'REXX error =' RC '-' 'ERRORTEXT'(RC)'.'
-  else if 'SYMBOL'('RC') == 'VAR' then
-    say 'RC =' RC'.'
-  say 'Source =' 'SOURCELINE'(SIGL)
-
-  if 'CONDITION'('I') \== 'CALL' | 'CONDITION'('C') == 'NOVALUE' | 'CONDITION'('C') == 'SYNTAX' then do
-    trace '?A'
-    say 'Exiting.'
-    call 'SYSSLEEP' 2
-    exit 'CONDITION'('C')
-  end
-
-return
-
-WikiUpdates: procedure expose (globals)
-   call NotYet arg(1)
-   say '1) Add the next version to: http://svn.netlabs.org/fm2/admin/ticket/versions'
-   say '2) Make this version the default'
-   say '3) Add the next milestone'
-   say '4) Make the next milestone the default'
-   say '5) Close the old milestone and move residual tickets to the new one.'
-   say '6) Update "WikiStart" with the newly released version:' ver.full
-   say '7) Update "RBuild" with the new tag: FM2-' || ver.tag
-return
-
-GetEnv: procedure expose (globals)
-   parse arg varname
-return value(varname,, 'OS2ENVIRONMENT')
-
-SetEnv: procedure expose (globals)
-   parse arg varname, varvalue
-   oldvarvalue = GetEnv(varname)
-   call value varname, varvalue, 'OS2ENVIRONMENT'
-return oldvarvalue
-
-/* JBS: Disabled internal CFG code:
-Configuration: procedure expose (globals)
-   do until option = 'S' | option = 'Q'
-      call SysCls
-      say
-      say 'ReleaseTool configuration'
-      say
-      say 'If this is the first time through this configuration, please maake sure all'
-      say 'of the following are properly configured for you. Defaults will not work'
-      say 'for everyone.'
-      say
-      say 'With proper configuration, the following activities can be automated:'
-      say '   Uploads of files (to Netlabs, Hobbes, etc.).'
-      say '   Requesting that Netlabs move the uploaded file.'
-      say '   Email notifications of the release (to lists and/or individuals).'
-      say '   Newsgroup notifications of the release (to various newsgroups).'
-      say
-      say "Enter the first letter of the activity to configure or..."
-      say "'S' to save or 'Q' to quit. ('S' or 'Q' will return you to the main menv)."
-      call charout , "Enter 'U', 'R', 'E', 'N', 'S' or 'Q': "
-      option = translate(SysGetKey())
-      say
-      select
-         when option = 'S' then
-            do
-               /* save configuration */
-               call SaveConfiguration
-            end
-         when option = 'Q' then
-            do
-               /* restore initially read configuration */
-               /*
-                * if missing or invalid config data, get confirmation
-                * before restoring file data.
-                */
-            end
-         when option = 'U' then
-            do
-               /* configure uploads                    */
-               call ConfigureUploads
-            end
-         when option = 'R' then
-            do
-               /* configure Netlabs request            */
-               call ConfigureNetlabsRequest
-            end
-         when option = 'E' then
-            do
-               /* configure (other) email notifications*/
-               call ConfigureEmailNotifications
-            end
-         when option = 'N' then
-            do
-               /* configure newsgroup  notifications   */
-               call ConfigureNewsgroupNotifications
-            end
-         otherwise
-            nop
-      end
-   end
-return
-
-SaveConfiguration: procedure expose (globals)
-return
-
-ConfigureUploads: procedure expose (globals)
-   do until option = 'Q'
-      call SysCls
-      say
-      say 'Configure uploads'
-      say
-      say 'The following uploads are currently configured:'
-      do i = 1 to cfg.FTP.0
-         say '   ' || i || ')' cfg.FTP.i.descriptive_hostname
-      end
-      say
-      say 'Enter the number of the upload to configure, or ...'
-      say "'A' to add a new upload definition, or ..."
-      say "'D' to delete one of these definitions, or ..."
-      call charout , "'Q' to return to the previous menu: "
-      option = translate(SysGetKey())
-      say
-      select
-         when option = 'Q' then
-            nop
-         when option = 'A' then
-            call AddUpload
-         when option = 'D' then
-            do
-               say
-               say 'Enter the number of the upload definition to delete.'
-               call charout , '(An invalid entry will cancel the deletion): '
-               i = SysGetKey()
-               say
-               if CheckNum(i, cfg.FTP.0) then
-                  do
-                     call charout , "Confirm deletion of upload #" || i '(y/N): '
-                     if translate(SysGetKey()) = 'Y' then
-                        do
-                        /* Delete an upload definition here */
-                        end
-                  end
-            end
-         when CheckNum(option, cfg.FTP.0) then
-            do
-               /* Edit an upload here */
-               call EditUpload
-            end
-         otherwise
-            nop
-      end
-   end
-return
-
-CheckNum: procedure
-   parse arg num, maxval
-   retval = 0
-   if datatype(num, 'NUM') then
-      if num <= maxval then
-         if num > 0 then
-            if trunc(num) = num then
-               retval = 1
-return retval
-
-AddUpload: procedure expose (globals)
-return
-
-EditUpload: procedure expose (globals)
-return
-
-ConfigureNetlabsRequest: procedure expose (globals)
-return
-
-ConfigureEmailNotifications: procedure expose (globals)
-return
-
-ConfigureNewsgroupNotifications: procedure expose (globals)
-return
-*/
-
Index: trunk/ReleaseTool.tmp
===================================================================
--- trunk/ReleaseTool.tmp	(revision 1912)
+++ 	(revision )
@@ -1,211 +1,0 @@
-
-;  $Id$
-
-;  Change log:
-;     23 Jul 11 JBS   Initial version (replaces obsolete ReleaseTool.CFG
-;                     in the repository.)
-;     05 Aug 11 JBS   -  Added comp.os.os2.announce and submit@os2voice.org
-;                        to proposed list of addressees
-;                     -  Updated the documentation
-;     27 Jun 15 JBS   Ticket #539: Added comments to encoursge use of "Full name" <user@domain.net> format for FROM addresses
-
-;  This file is a sample of a file used by ReleaseTool to provide
-;  various configuration data to ReleaseTool.cmd (RT).
-
-;  The actual file used by RT is named ReleaseTool.cfg. This file
-;  can be editted and saved with that file name.
-
-;  This file contains extensive comments explaining the possible
-;  configurations that can be made.
-
-;  SYNTAX: ReleaseTool expects each line to be one of four types:
-;  1) Blank/empty lines (which are ignored)
-
-;  2) Comment lines. All text following a semicolon, ";", will be ignored.
-;     Any line whose first non-blank is a semicolon, like this line, is
-;     a comment line and will be ignored by ReleaseTool.
-
-;     Section and data lines (below) can have end-of-line comments like
-;     C++'s // comments EXCEPT that only the LAST semicolon on a data line
-;     is considered the start of a comment. Any other semicolons on a data
-;     line are considered part of the key_value.
-
-;  3) Section lines. Section lines are of the form:
-;        [section-name]
-;     Section lines mark the start of a new set of data.  The section
-;     name (within the brackets) defines which type of data follows.
-
-;     Details for each section recognized by RT follow.
-
-;  4) Data lines. These lines provide the actual data to ReleaseTool.
-;     The format of these lines is:
-;        key-name = key-value
-
-;     Leading and trailing whitespace are ignored.
-
-;     Key-name's are case-insensitive. Key-values are case sensitive.
-
-;     Within a section, data lines can be in any order except that DIRECTORY lines,
-;     if any, must precede the FILE lines to which they apply.
-
-;     Details for each data line recognized by RT follow.
-
-
-;  SECTIONS : RT currently supports section names: FTP, NNTP and SMTP.
-;     FTP
-;        FTP sections are used to define data for uploading one or more files.
-;        If the internal REXX FTP code is used (instead of COMMAND's), then
-;        an FTP section will be required for each FTP server.
-;     NNTP
-;        NNTP sections are used to define data for uploading messages to one
-;        or more newsgroups on a single newsgroup server. Since the
-;        eComstation newsgroups are available only at news.ecomstation.com
-;        and since news.ecomstation.com does not offer other newsgroups
-;        (comp.os.os2.*, for example), more than one NNTP section will
-;        ususally be required.
-;     SMTP
-;        SMTP sections are used to define data for sending email messages
-;        through a single email server. Use multiple SMTP sections if:
-;           -  You need to use different "From" addresses (perhaps because you
-;              are registered to different lists under different ids
-;           -  You want diffferent lists of "To"  addressees. Perhaps you
-;              want to send individually addressed emails to particular
-;              individfuals/lists.
-;        NOTE: Only the first SMTP section is used to send...
-;           -  The email requesting commtted work (Task #1)
-;           -  The email to Netlabs requesting that the uploaded file be moved (Task #18)
-;        For these two tasks the addressees, "To", are hard-coded in RT. (IOW, the "To"
-;        setting in the CFG file is not used for these two tasks.
-
-;        All SMTP sections are used when sending announcement emails. So the "To" setting
-;        for each section should be a list of addressees who should get an announcemnt using
-;        the settings for that section.
-
-;  DATA LINES
-
-;     The following table lists the key-names recognized by ReleaseTool, the
-;     sections to which they apply, a code (explained below) and a short description:
-
-;     Key-name      Sections       Codes  Description
-
-;     DESCRIPTION   FTP,NNTP,SMTP   N N   Text used by ReleaseTool to identify to the user the
-;                                         section currently "in use" while RT runs.
-;     COMMAND       FTP,NNTP,SMTP   N N   An external command to run to perform the task.
-;                                         (See COMMAND notes below!)
-;     HOST          FTP,NNTP,SMTP   Y N   The host name of the FTP/NNTP/SMTP server
-;     PORT          FTP,NNTP,SMTP   N N   Port number. If not set, standard defaults are used.
-;     USERID        FTP,NNTP,SMTP   Y N   The userid used to log in
-;     PASSWORD      FTP,NNTP,SMTP   Y N   The password used to log in.
-;     TO            NNTP,SMTP       Y N   NNTP: Comma-separated list of newsgroups
-;                                         SMTP: Comma-separated list of addressees (email address(es))
-;     FROM          NNTP,SMTP       Y N   "From" email address
-;     SIGNATURE     NNTP,SMTP       N Y   Zero or more lines of "signature"
-;     UTCOFFSET     SMTP            N N   Offset from UTC/GMT (e.g. for EST, UTCOFFSET is -0500
-;                                         (05 hours, 00 minutes before UTC)
-;     DIRECTORY     FTP             N Y   If a change directory command is needed before uploading
-;                                         a file, then this key-value should be provided. If more
-;                                         than one file is to be uploaded and they are to be uploaded
-;                                         into different directories, precede each set of FILE lines
-;                                         by an appropriate Directory line.
-;     FILE          FTP             N Y   The local name of a file to be uploaded. This should include
-;                                         path info if the file is not in the same directory as RT.
-
-;     Codes:
-;        First code  : This data can be set in the CFG file and optionally reset while RT runs.
-;        Second code : Multiple lines of this data can be set within each section.
-
-;     "Special" key-values:
-;        PASSWORD
-;           [Hobbes-email] : RT automatically replaces this with the email address from the Hobbes text file.
-;        FILE
-;           [Release-Zip]  : RT automatically replaces this with FM/2 release zip filename.
-;           [Hobbes-text]  : RT automatically replaces this with Hobbes text filename.
-;        [Release-Zip] and [Hobbes-text] can also be used as part of a COMMAND key_value
-
-;     COMMAND notes:
-;        - If no COMMAND is provided, RT will use internal code to perform the task.
-;        - If a COMMAND is provided, all other keys for that section are optional.
-;        - If multiple external commands are needed to perform a task, then either
-;           - roll them into a CMD file and use COMMAND = call <cmdfile> <parameters>
-;           - use "&&" to separate multiple commands run from a single command line. For example:
-;              COMMAND = copy a b && copy c d
-;        - COMMAND key values may include certain "macros". The syntax for these
-;          macros is: ##macroname##. The macros recognized by RT are:
-;            HOST, PORT, USERID, PASSWORD, TO, FROM, SUBJECT, UTCOFFSET and MESSAGE_BODY_FILE
-;          With the exception of MESSAGE_BODY_FILE, the value for the macro comes from
-;          the correspondingly-named key. MESSAGE_BODY_FILE, on the other hand, is replaced
-;          with the name of a temporary file which is built by RT and holds all the text
-;          of the message to be sent.
-;           - NOTE:  Not all keys currently have corresponding macros!
-;           - NOTE:  RT recognizes these macros only when they are relevant. For example,
-;                    TO is not relevant to FTP transfers so ##TO## would be ignored in an FTP COMMAND.
-;           - NOTE:  If macros are used, make sure the corresponding keys have values, via the CFG file
-;                    or during execution of RT. RT does not check that each macro has a setting.
-;           - NOTE:  If macros are used, keep in mind that their values will become part of a
-;                    commandline command. So certain characters may cause problems: " > < / - ^ & |
-
-;     PASSWORD note: Instead of recording passwords in this file, you may prefer to provide them as RT runs.
-
-;     TO/FROM notes:
-;        - Accepted email address formats:
-;           "Full name" <user@domain.net>
-;           <user@domain.net>
-;           user@domain.net
-;        - If you plan to use the ##TO## or ##FROM## macros, then probably the third form would be the wisest choice
-;          because the other two forms have characters which can cause problems when used on a command line.
-
-;        FROM notes:
-;           - Try to use the "Full name" <user@domain.net> format for FROM addresses (Ticket #539)
-;           - For newsgroups you may want to use a disguised/false email address to avoid spam.
-
-
-[FTP]
-Description = Netlabs
-Host        = ftp.netlabs.org
-Userid      =
-Password    =
-Directory   = /incoming/fm2
-File        = [Release-zip]
-
-[FTP]
-Description = Hobbes
-Host        = hobbes.nmsu.edu
-Userid      = anonymous
-Password    = [Hobbes-email]
-Directory   = /pub/incoming
-File        = [Hobbes-text]
-File        = [Release-zip]
-
-[NNTP]
-Description = Newsgroup announcement(s) via eComstation news server
-Host        = news.ecomstation.nl
-;Userid      =
-;Password    =
-To          = ecomstation.apps
-From        = zjsmallz@osworld.net
-Signature   = John Small
-Signature   = FM/2 Development Team
-Signature   = (Remove z's for address)
-
-[NNTP]
-Description = Newsgroup announcement(s) via non-eComstation (i.e. "other") news server
-Host        =            ; ISP's or free news server
-Userid      =
-Password    =
-To          = comp.os.os2.apps,comp.os.os2.utilities,comp.os.os2.announce     ; "alt.test" can be used for testing
-From        = zjsmallz@osworld.net
-Signature   = John Small
-Signature   = FM/2 Development Team
-Signature   = (Remove z's for address)
-
-[SMTP]
-;Command     = G:\pmmail\bin\pmmsend -a G:\PMMail\Accounts\ygk_us0.act -t "##USERTD##" -s "##SUBJECT##" -m ##MESSAGE_BODY_FILE##
-;Command     = call d:\utils\internet\rexxmail\rexxmail /NewMessageSend "##USERTD## ?subject=##SUBJECT## &body=##MESSAGE_BODY_FILE##" /Address=##FROM## /SMTPServer=##SERVER## /SMTPUSER=##USERID## /SMTPPASSWORD=##PASSWORD## /TimeZone=##UTCOFFSET##
-Host        = smtp.toast.net
-;Port        = 587
-Userid      =
-Password    =
-To          = "FM/2 Developers" <fm2-dev@netlabs.org>,"FM/2 Users" <fm2-user@netlabs.org>,submit@os2voice.org    ; <== Add other users/lists (separated by commas) as appropriate
-From        =
-Signature   = FM/2 Development Team
-UTCOffset   = -0500
Index: trunk/archiver.tmp
===================================================================
--- trunk/archiver.tmp	(revision 1912)
+++ 	(revision )
@@ -1,1165 +1,0 @@
-21
-;
-;The first line is the number of lines/definition in this archiver.bb2 file...
-;It is very important; do not change.  It allows modifications to the
-;file format to be transparent to older programs.
-
-;ARCHIVER.BB2, archiver control file for FM/2, AV, XBBS-OS/2 & XGROUP
-;KEEP A COPY OF THIS ORIGINAL FILE FOR INFORMATION LATER!
-
-; $Id$
-
-;Format for this archiver.bb2 file (each entry has 21 lines):
-;
-; 1st line:  archiver id (i.e. ARC, LHARC, PKZIP, etc.) for human consumption
-; 2nd line:  normal extension for archives without period  (i.e ZIP, ARC, LZH)
-; 3rd line:  offset into file to signature (leave blank if no signature)
-; 4th line:  list command
-; 5th line:  extract command
-; 6th line:  extract with directories command
-; 7th line:  test archive command
-; 8th line:  add/create command
-; 9th line:  add/create with paths command
-;10th line:  add/create & recurse command
-;11th line:  move command
-;12th line:  move with paths command
-;13th line:  delete command
-;14th line:  signature (case sensitive, leading spaces count!)
-;15th line:  startlist string
-;16th line:  endlist string
-;17th line:  old size position (0-based, -1 = not available)
-;18th line:  new size position  (0-based, -1 = not available)
-;19th line:  file date position (0-based, -1 = not available) [,type of date (0 for none)]
-;20th line:  number of elements in dates (for "03 June 92" would be 3)
-;21st line:  file name position (absolutely required, of course; -1 = last pos)[,name is last (1 = TRUE, n/a w/ -1 pos)[name is next line (1 = TRUE)[,name is first line, then rest of data (1 = TRUE)]]]
-; see ZOO entry for example of -1 in file name position
-; see LH entry for example of name is last
-; see RAR 2.00 entry for example of name is first
-; check listings generated by these programs for clarification
-
-;ARCHIVER AUTHORS:  MAKE A STANDARD!
-
-;A semicolon marks a comment.  They may appear at any point *except*
-;within the 21 lines of an archiver definition entry.  Comments are ignored.
-;Archiver definition entries that contain numeric values may have trailing comments.
-;Archiver definition lines that contain strings do not support trailing comments.
-
-;Blank lines are ignored except within a 21 line archiver definition entry.
-;A blank line with a definition entry will be treats as either an empty string
-;or the number 0, depending on what content is expected for the definition line.
-
-;Note that all archiver command strings should include the archiver's parameter(s)
-;which prevent it from prompting for input!  Also note that archive types are checked
-;in order of their listing in this file.  Finally, this file is set up for
-;the archivers I had lying around. If yours are different versions, you may
-;have to modify this file.  All archivers are OS/2 (or FAPI) versions.
-;DOS archivers may work with FM/2, but it'll be up to you to set them up.
-
-;Supported date input types:
-;--------------------
-;                       No date in data         0
-;02-31-98  23:55:32     mm-dd-yy hh:mm:ss       1
-;31 Feb 98 23:55:32     dd-Mmm- yy hh:mm:ss     2
-;31 Feb 98  11:55p      dd Mmm yy hh:mmA        3
-;98-02-31 23:55:32      yy-mm-dd hh:mm:ss       4
-;31-02-98  23:55        dd-mm-yy hh:mm          5
-;Aug 21 23:55 2011      mm-dd-yyyy hh:mm:ss     6 Fixes tar.gz date/time formatting when using tar 1.15+
-
-; Dash (-) and slash (/) separators are both supported.
-; Both 2 digit and 4 digit years are supported.
-; 2 digit years slide about 1980.
-
-;The positions specified in an archiver defintion are word numbers, where a
-;word is something separated by whitespace.  Counting starts at zero (0).
-;Minus one (-1) usually indicates the item does not exist.  The exception is
-;the file name position (line 21), where -1 indicates that the filename is
-;the last entry on the listing line.  This allow files names with spaces to
-;be supported.
-
-;How archiver selection works (for the curious):
-
-;The archive selector scans the known archivers in the order in which they
-;are defined.  The selector first tries a signature match, unless this is
-;suppressed in the settings.  If there is no signature defined or if
-;the signature match is suppressed, the selector checks to see if the file
-;extension matches.  The matching entry defines the commands used for the
-;various archiving operations and supplies parameters that enable the archiver
-;outputs to be parsed.
-
-;Warning:  I'm told there's a bug in some versions of 4OS2 that can cause
-;a call to an archiver to fail if the archiver has an extension (i.e.
-;UNZIP works, UNZIP.EXE doesn't).  If things fail for no apparent reason
-;and you're using 4OS2 you might keep it in mind.
-;
-;The FM/2 code for accessing and using this information is in avl.c, avl.c and
-;arccnrs.c and is freely available for use in in your own projects under
-;the terms of then GNU GPL2 license.
-
-;------------------- Current Archivers -------------------------
-;
-; Entry #1 - InfoZip Zip/UnZip 2.2/5.4, sent to me by V. Lee Conyers.
-;
-Zip/UnZip 2.2/5.4
-ZIP
-0
-UNZIP.EXE -lv
-UNZIP.EXE -jo
-UNZIP.EXE -o
-UNZIP.EXE -t
-ZIP.EXE -j9g
-ZIP.EXE -9g
-ZIP.EXE -r9g
-ZIP.EXE -mj9g
-ZIP.EXE -m9g
-ZIP.EXE -d
-PK\x03\x04
---------  ------  ------- -----   ----   ----   ------    ----
---------          -------  ---                            -------
-0
-2
-4,1
-2
-7,1,0,0
-;
-;
-; Entry #2 - InfoZip Zip/UnZip 2.2/6.0
-;
-Zip/UnZip 2.2/6.0
-ZIP
-0
-UNZIP.EXE -lv
-UNZIP.EXE -jo
-UNZIP.EXE -o
-UNZIP.EXE -t
-ZIP.EXE -j9g
-ZIP.EXE -9g
-ZIP.EXE -r9g
-ZIP.EXE -mj9g
-ZIP.EXE -m9g
-ZIP.EXE -d
-PK\x03\x04
---------  ------  ------- ---- ---------- ----- --------  ----
---------          -------  ---                            -------
-0
-2
-4,1
-2
-7,1,0,0
-;
-; Entry #3 (7z)
-;
-7z
-7Z
-0
-7za.exe l
-7za.exe e
-7za.exe x
-7za.exe t
-7za.exe a
-
-
-
-
-7za.exe d
-7z
-------------------- ----- ------------ ------------  ------------------------
-------------------- ----- ------------ ------------  ------------------------
-3
-4
-0,4
-1
-5,1,0,0
-;
-;
-; Entry #4 - PKZIP 2.50 named PKZip (true OS/2 executable).
-;
-PKZip 2.50
-ZIP
-0
-PKZIP.EXE /locale=canada /nofix
-PKZIP.EXE /overwrite /extract /nofix
-PKZIP.EXE /overwrite /extract /directories /nofix
-PKZIP.EXE /test
-PKZIP.EXE /add /nofix
-PKZIP.EXE /add /path /nofix
-PKZIP.EXE /add /path /recurse /nofix
-PKZIP.EXE /add /move /nofix
-PKZIP.EXE /add /move /path /nofix
-PKZIP.EXE /delete /nofix
-PK\x03\x04\x14
-------  ------   ----- -----    ----   ----   -------- ----  ----
-------          ------ -----                                 ----
-0
-2
-4,0
-2
-8,1,0,0
-;
-; Entry #5 - InfoZip unzipsfx self-extractors.
-;
-unzipsfx
-
-217
-UNZIP.EXE -vUo
-UNZIP.EXE -jo
-UNZIP.EXE -o
-UNZIP.EXE -to
-
-
-
-
-
-ZIP.EXE -d
-unzipsfx
-------  ------   ----  -----   ----    ----   ------     ----
-------          ------  ---                              -------
-0
-2
-4,1
-2
-7,1,0,0
-;
-;
-; Entry #6 - PKWare PKZIP self-extractors type 1.
-;
-PK(Un)Zip SE #1
-
-2934
-PKZIP.EXE /locale=canada /nofix
-PKZIP.EXE /overwrite /extract /nofix
-PKZIP.EXE /overwrite /extract /directories /nofix
-PKZIP.EXE /test
-PKZIP.EXE /add /nofix
-PKZIP.EXE /add /path /nofix
-PKZIP.EXE /add /path /recurse /nofix
-PKZIP.EXE /add /move /nofix
-PKZIP.EXE /add /move /path /nofix
-PKZIP.EXE /delete /nofix
-PK\x03\x04
-------  ------   ----- -----   ----    ----   ------  ----  ----
-------          ------  ---                                 -------
-0
-2
-4,0
-2
-8,0,0,0
-;
-; Entry #7 - is for PKWare PKZIP self-extractors type 2.
-;
-PK(Un)Zip SE #2
-
-12784
-PKZIP.EXE /locale=canada /nofix
-PKZIP.EXE /overwrite /extract /nofix
-PKZIP.EXE /overwrite /extract /directories /nofix
-PKZIP.EXE /test
-PKZIP.EXE /add /nofix
-PKZIP.EXE /add /path /nofix
-PKZIP.EXE /add /path /recurse /nofix
-PKZIP.EXE /add /move /nofix
-PKZIP.EXE /add /move /path /nofix
-PKZIP.EXE /delete /nofix
-PK\x03\x04
-------  ------   ----- -----   ----    ----   ------  ----  ----
-------          ------  ---                                 -------
-0
-2
-4,0
-2
-8,0,0,0
-;
-;
-; Entry #8 - PKWare PKZIP self-extractors type 3.
-;
-PK(Un)Zip SE #2
-
-30948
-PKZIP.EXE /locale=canada /nofix
-PKZIP.EXE /overwrite /extract /nofix
-PKZIP.EXE /overwrite /extract /directories /nofix
-PKZIP.EXE /test
-PKZIP.EXE /add /nofix
-PKZIP.EXE /add /path /nofix
-PKZIP.EXE /add /path /recurse /nofix
-PKZIP.EXE /add /move /nofix
-PKZIP.EXE /add /move /path /nofix
-PKZIP.EXE /delete /nofix
-PK\x03\x04
-------  ------   ----- -----   ----    ----   ------  ----  ----
-------          ------  ---                                 -------
-0
-2
-4,0
-2
-8,0,0,0
-;
-;
-; Entry #9 - TAR 1.15.1 from Gregg Young
-;
-TAR 1.15.1 (or higher)
-TAR
-257
-Tar.exe -tvf
-Tar.exe --wildcards -xpf
-Tar.exe --wildcards -xpf
-
-
-Tar.exe --no-recursion -rpf
-Tar.exe -rpf
-
-Tar.exe --remove-files -rpf
-Tar.exe --delete -f
-ustar
-None
-None
-2
--1
-3,0
-2
-5,1,0,0
-;
-; Entry #10 - TAR 1.1.0.
-;
-TAR 1.10
-TAR
-257
-tar110.exe -tvf
-Tar110.exe -xpf
-Tar110.exe -xpf
-
-Tar110.exe -rpyf
-Tar110.exe -rpf
-Tar110.exe --help
-
-
-Tar110.exe --delete -f
-ustar
-None
-None
-2
--1
-3,2
-4
-9,1,0,0
-;
-;
-; Entry #11 (tar.gz)
-;
-TAR.GZ (Req. TAR 1.20+ & GZIP)
-TAR.GZ
-0
-tar.exe -tzvf
-tar.exe -xzpvf
-tar.exe -xzpvf
-
-tar.exe -rzpf
-tar.exe -rpf
-
-
-
-tar.exe -z --delete -f
-\x1f\x8b
-None
-None
-2
--1
-3,5
-2
-5,1,0,0
-;
-;
-; Entry #12 (tar.gz)
-;
-TAR.GZ (Req. TAR 1.10-15 & GZIP)
-TAR.GZ
-0
-tar.exe -tzvf
-tar.exe -xzpvf
-tar.exe -xzpvf
-
-tar.exe -rzpf
-tar.exe -rpf
-
-
-
-tar.exe -z --delete -f
-\x1f\x8b
-None
-None
-2
--1
-3,5
-4
-7,1,0,0
-;
-; Entry #13 (tar.bz2)
-;
-TAR.BZ2 (Req. TAR 1.15+ & BZIP2)
-tar.bz2
-0
-tar.exe -tjvf
-tar.exe -xjpvf
-tar.exe -xjpvf
-
-tar.exe -crjpf
-tar.exe -rjpf
-
-
-
-tar.exe -j --delete -f
-BZh
-None
-None
-2
--1
-3,0
-2
-5,1,0,0
-;
-; Entry #14 - GZIP (GZ).
-;
-GZIP (GZ) (req. GZIP & TAR 1.15+)
-GZ
-0
-gzip.exe -lv
-gzip.exe -d
-
-gzip.exe -t
-gzip.exe
-gzip.exe
-gzip.exe -r
-gzip.exe
-gzip.exe
-
-\x1f\x8b
-None
-None
-2
--1
-3,4
-2
-5,1,0,0
-;
-; Entry #15 - GZIP (Z).
-;
-GZIP (Z)
-Z
-0
-gzip.exe -lv
-gzip.exe -d
-
-gzip.exe -t
-gzip.exe -9 -s .z
-gzip.exe -9 -s .z
-gzip.exe -r
-
-
-
-\x1f\x8b
-method  crc     date  time  compressed  uncompr. ratio uncompressed_name
-None
-6
-5
-2,0
-3
-8,0,0,0
-;
-; Entry #16 (Lzip)
-;
-Lzip
-lz
-0
-lzip.exe
-lzip.EXE -d
-lzip.EXE -d
-lzip.EXE -tvvv
-Lzip.EXE -k
-
-
-Lzip.EXE
-
-
-LZIP
-None
-None
--1
--1
--1,0
--1
--1,0,0,0
-;
-; Entry #17 - Unarj 2.30 demo version.
-; Don't use Unarj 2.41; it's broken.
-;
-(Un)Arj 2.30 demo
-
-0
-UNARJ.EXE l
-UNARJ.EXE e
-UNARJ.EXE x
-UNARJ.EXE t
-
-
-
-
-
-
-`\xea
------------- ---------- ---------- ----- ----------------- -------- -----------
------------- ---------- ---------- ----- -----------------
-1
-2
-4,0
-1
-0,0,0,0
-;
-; Entry #18 - Arj 2.00 (DOS).
-; Note that other programs that use this control file may not be able to
-; handle calling a DOS archiver correctly!  FM/2 is the only one that I
-; know of which can at this time.  This means you may need to keep FM/2's
-; ARCHIVER.BB2 separate from those for other programs.
-;
-Arj 2.00 DOS
-ARJ
-0
-ARJ.EXE l
-ARJ.EXE e -y
-ARJ.EXE x -y
-ARJ.EXE t
-ARJ.EXE a -y -e
-ARJ.EXE a -y
-ARJ.EXE a -y -r
-ARJ.EXE m -y -e
-ARJ.EXE m -y
-ARJ.EXE d -y
-`\xea
------------- ---------- ---------- ----- ----------------- -------- ---- ------
------------- ---------- ---------- -----
-1
-2
-4,0
-1
-0,0,0,0
-;
-; Entry #19 (RAR v.3.5)
-;
-RAR v.3.5
-RAR
-0
-RAR32.EXE v -c-
-RAR32.EXE e -y -c- -o+
-RAR32.EXE x -y -c- -o+
-RAR32.EXE t -c-
-RAR32.EXE a -ep1 -y
-RAR32.EXE a -y
-RAR32.EXE a -r -y
-RAR32.EXE mf -ep1 -y
-RAR32.EXE m -y
-RAR32.EXE d -y
-Rar!\x1a\x07
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-0
-1
-3,5
-2
-0,0,0,1
-;
-; Entry #20 - RAR/2 v2, provided by Eugene Roshal.
-;
-RAR/2 v2
-RAR
-0
-RAR.EXE v -c-
-RAR.EXE e -y -c- -o+
-RAR.EXE x -y -c- -o+
-RAR.EXE t -c-
-RAR.EXE a -ep1 -y
-RAR.EXE a -y
-RAR.EXE a -r -y
-RAR.EXE mf -ep1 -y
-RAR.EXE m -y
-RAR.EXE d -y
-Rar!\x1a\x07
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-0
-1
-3,0
-1
-0,0,0,1
-;
-; Entry #21 - RAR/2 v.1.53beta OS/2 SFX.
-;
-RAR/2 v.1.53beta OS/2 SFX
-
-13707
-RAR.EXE l -c-
-RAR.EXE e -y -c- -o+
-RAR.EXE x -y -c- -o+
-RAR.EXE t -c-
-RAR.EXE a -ep1 -y
-RAR.EXE a -y
-RAR.EXE a -r -y
-RAR.EXE mf -ep1 -y
-RAR.EXE m -y
-RAR.EXE d -y
-Rar!\x1a\x07
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-1
-2
-4,0
-1
-0,0,0,1
-;
-; Entry #22 - RAR v.1.53 DOS SFX.
-;
-RAR v.1.53 DOS SFX
-
-7195
-RAR.EXE l -c-
-RAR.EXE e -y -c- -o+
-RAR.EXE x -y -c- -o+
-RAR.EXE t -c-
-RAR.EXE a -ep1 -y
-RAR.EXE a -y
-RAR.EXE a -r -y
-RAR.EXE mf -ep1 -y
-RAR.EXE m -y
-RAR.EXE d -y
-Rar!\x1a\x07
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-1
-2
-4,0
-1
-0,0,0,1
-;
-; Entry #23 - RAR v.2.00 SFX.
-;
-RAR v.2.00 SFX
-
-28
-RAR.EXE l -c-
-RAR.EXE e -y -c- -o+
-RAR.EXE x -y -c- -o+
-RAR.EXE t -c-
-RAR.EXE a -ep1 -y
-RAR.EXE a -y
-RAR.EXE a -r -y
-RAR.EXE mf -ep1 -y
-RAR.EXE m -y
-RAR.EXE d -y
-RSFXjr
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-1
-2
-4,0
-1
-0,0,0,1
-;
-;
-; Entry #24 - LHarc 2.22.
-; Supposedly fixes bugs in earlier versions.
-; Actually seems to have done so.  Good work, Peter.
-;
-LHarc 2.22
-LZH
-2
-LH.EXE /o l
-LH.EXE /o x
-LH.EXE /o /s x
-LH.EXE t
-LH.EXE /o a
-
-LH.EXE /o /s a
-LH.EXE /o m
-
-LH.EXE /o d
--lh
--------- --------  -----------------------------------------
---------          -----------------------------------------
-0
--1
-1,4
-1
-2,1,0,0
-;
-; Entry #25 - LHarc 2.22 using LH32 executable.
-;
-LHarc-32 2.22
-LZH
-2
-LH32.EXE /o l
-LH32.EXE /o x
-LH32.EXE /o /s x
-LH32.EXE t
-LH32.EXE /o a
-
-LH32.EXE /o /s a
-LH32.EXE /o m
-
-LH32.EXE /o d
--lh
--------- --------  -----------------------------------------
---------          -----------------------------------------
-0
--1
-1,4
-1
-2,1,0,0
-;
-; Entry #26 - LHarc 2.22 self-extractors..
-;
-LHarc 2.22 SE
-LZH
-22963
-LH.EXE /o l
-LH.EXE /o x
-LH.EXE /o /s x
-LH.EXE t
-LH.EXE /o a
-
-LH.EXE /o /s a
-LH.EXE /o m
-
-LH.EXE /o d
--lh
--------- --------  -----------------------------------------
---------          -----------------------------------------
-0
--1
-1,4
-1
-2,1,0,0
-;
-; Entry #27 - LHA 2.12 (DOS) self-extractors.
-; LH 2.22 seems to recognize them
-;
-LHarc 2.12 DOS SE
-LZH
-1638
-LH.EXE /o l
-LH.EXE /o x
-LH.EXE /o /s x
-LH.EXE t
-LH.EXE /o a
-
-LH.EXE /o /s a
-LH.EXE /o m
-
-LH.EXE /o d
--lh
--------- --------  -----------------------------------------
---------          -----------------------------------------
-0
--1
-1,4
-1
-2,1,0,0
-;
-; Entry #28 - LHA 2.12 (DOS) self-extractors.
-; LH 2.22 seems to recognize them
-;
-LHarc 2.12 DOS SE
-LZH
-37
-LH.EXE /o l
-LH.EXE /o x
-LH.EXE /o /s x
-LH.EXE t
-LH.EXE /o a
-
-LH.EXE /o /s a
-LH.EXE /o m
-
-LH.EXE /o d
-$LHarc's SFX
--------- --------  -----------------------------------------
---------          -----------------------------------------
-0
--1
-1,4
-1
-2,1,0,0
-;
-; Entry #29 - LHA 2.13L (DOS) self-extractors.
-; LH 2.22 seems to recognize them
-;
-LHarc 2.13 DOS SE
-LZH
-36
-LH.EXE /o l
-LH.EXE /o x
-LH.EXE /o /s x
-LH.EXE t
-LH.EXE /o a
-
-LH.EXE /o /s a
-LH.EXE /o m
-
-LH.EXE /o d
-LHA's SFX 2.13L (c) Yoshi, 1991\r\n
--------- --------  -----------------------------------------
---------          -----------------------------------------
-0
--1
-1,4
-1
-2,1,0,0
-;
-; Entry #30 - LH2 2.11.
-; NOTE:  sometimes will put a file into an archive more than once, necessitating
-; deleting both.  EAs not handled well, but at least they're handled.
-;
-LHarc 2.11
-LZH
-2
-LH.EXE /o l
-LH.EXE /o x
-LH.EXE /o /s x
-LH.EXE t
-LH.EXE /o a
-
-LH.EXE /o /s a
-LH.EXE /o m
-
-LH.EXE /o d
--lh
--------- -------- -----------------------------------------
---------          -----------------------------------------
-0
--1
-1,0
-1
-2,1,0,0
-;
-; Entry #31 - ZIP 1.9/UNZIP 5.0 (available in 32-bit versions).
-;ZIP/UNZIP should work with PKZIP 2.04 files.  Saves EAs well.  Won't
-;extract a file stored with path without the path (actually, this seems
-;to be fixed now.  Maybe.  There are dozens of versions floating around;
-;you don't pays your money and you takes your chances).  If you have a
-;version that won't extract files with paths without the paths, there's
-;a workaround -- change the line "UNZIP.EXE -jo" below to "UNZIP.EXE -o".
-;Because of broken ZIP archives floating around everywhere, this is here
-;without the version flag in the signature (should really be PK\x03\x04\x14).
-;Damnit, it looks like Katz's own software is what does the botching.  So
-;much for the keeper of the ZIP standard...  Zip still seems to have to
-;have erratic problems with creating archives with some pathnames...
-;
-Zip/UnZip 1.9/5.0
-ZIP
-0
-UNZIP.EXE -vUo
-UNZIP.EXE -jo
-UNZIP.EXE -o
-UNZIP.EXE -to
-ZIP.EXE -j9g
-ZIP.EXE -9g
-ZIP.EXE -r9g
-ZIP.EXE -mj9g
-ZIP.EXE -m9g
-ZIP.EXE -d
-PK\x03\x04
-------  ------   ----  -----   ----    ----   ------     ----
-------          ------  ---                              -------
-0
-2
-4,1
-2
-7,1,0,0
-;
-; Entry #32 - ZIP 1.9/UNZIP 5.0 using *32 executables.
-;
-Zip/UnZip-32 1.9/5.0
-ZIP
-0
-UNZIP32.EXE -vUo
-UNZIP32.EXE -jo
-UNZIP32.EXE -o
-UNZIP32.EXE -to
-ZIP32.EXE -j9g
-ZIP32.EXE -9g
-ZIP32.EXE -r9g
-ZIP32.EXE -mj9g
-ZIP32.EXE -m9g
-ZIP32.EXE -d
-PK\x03\x04
-------  ------   ----  -----   ----    ----   ------     ----
-------          ------  ---                              -------
-0
-2
-4,1
-2
-7,1,0,0
-;
-; Entry #33 - ZIP 1.9/UNZIP 5.0, using the -l listing format.
-; (the -v long format can sometimes result in the old length field
-; being crammed together with the Method field, resulting in an
-; unparsable format).  Some info, like old length, will be missing,
-; but at least you can view the contents.
-;
-Zip/UnZip 1.9/5.0 Short
-ZIP
-0
-UNZIP.EXE -lUo
-UNZIP.EXE -jo
-UNZIP.EXE -o
-UNZIP.EXE -to
-ZIP.EXE -j9g
-ZIP.EXE -9g
-ZIP.EXE -r9g
-ZIP.EXE -mj9g
-ZIP.EXE -m9g
-ZIP.EXE -d
-PK\x03\x04
-------    ----    ----    ----
-------                    -------
--1
-0
-1,1
-2
-3,1,0,0
-;
-; Entry #34 - Zoo 2.1.
-; NOTE:  Bug in Zoo 2.1 seems to cause files stored with paths to
-; be extracted with paths even when you don't ask it to do so...
-;
-Zoo 2.1
-ZOO
-20
-ZOO.EXE v
-ZOO.EXE xO
-ZOO.EXE xO/
-ZOO.EXE -test
-ZOO.Exe ah:
-ZOO.EXE ah
-
-ZOO.EXE aM:h
-ZOO.EXE aMh
-ZOO.EXE -delete
-\xdc\xa7\xc4\xfd
---------  --- --------  --------- --------
---------  --- --------  --------- --------
-0
-2
-3,2
-3
--1,0,0,0
-;
-;----------------- Older, less used archivers --------------
-;
-; Entry #35 - ARC 5.12mpl.
-;
-Arc 5.12mpl
-ARC
-0
-ARC.EXE lwn
-ARC.EXE ewn
-
-ARC.EXE t
-ARC.EXE awn
-
-
-ARC.EXE mwn
-
-ARC.EXE dwn
-\x1a
-============  ========  =========
-====  ========
-1
--1
-2,3
-3
-0,0,0,0
-;
-; Entry #36 - ARC2 (6.0).
-; Note that I don't actually have a copy of this...
-;
-Arc 6.0
-ARC
-0
-ARC.EXE l
-ARC.EXE ewn
-
-ARC.EXE t
-ARC.EXE awn
-
-
-ARC.EXE mwn
-
-ARC.EXE dwn
-\x1a
-=================  ========  =========
-====  ========
-1
--1
-2,0
-3
-0,0,0,0
-;
-; Entry #37 - ARC2 (6.0) using ARC2 executable.
-;
-Arc 6.0
-ARC
-0
-ARC2.EXE l
-ARC2.EXE ewn
-
-ARC2.EXE t
-ARC2.EXE awn
-
-
-ARC2.EXE mwn
-
-ARC2.EXE dwn
-\x1a
-=================  ========  =========
-====  ========
-1
--1
-2,0
-3
-0,0,0,0
-;
-; Entry #38 (CABExtract 1.0)
-;
-CABExtract 1.0
-CAB
-0
-Cabextract.exe -l
-Cabextract.exe
-
-
-
-
-
-
-
-
-MSCF
------------+---------------------+-------------
-
-0
--1
--1,0
-2
-5,1,0,0
-;
-; Entry #39 (Untgz Ver 0.95)
-; Supplied by Gregg Young
-;
-Untgz Ver 0.95
-TAR.GZ
-0
-untgzos2.exe -l
-untgzos2.exe
-
-untgzos2.exe -t
-
-
-
-
-
-
-\x1f\x8b
-------- ----- ---- ----- ---------------------------------------------------
-------- ----- ---- ----- ---------------------------------------------------
-0
--1
-1,0
-3
-5,1,0,0
-;
-;----------------- End of archiver data -----------------------
-
-; For possible future use:
-
-; Squeeze-it signature:  (Offset 0)     \x48\x4c\x53\x51\x5ah
-; HA signature:          (Offset 0)     HA
-; HAP signature:         (Offset 0)     \x913HF
-; HPK signature:         (Offset 0)     HPAK
-; SQZ signature:         (Offset 0)     HLSQZ
-; DWZ signature:         (Offset -3)    DWC
-
-; No OS/2 versions available yet to my knowledge...
-
-;Notes on modifying/updating this file:
-;=====================================
-
-;You can add as many archivers as you like to this file.
-;here are some suggestions on how to go about it:
-
-;List an archive with the archiver, redirecting to a disk
-;file (ex. "ARC l AFILE.ARC > TEMP.").  Load the resultant
-;file into a text editor.  Clip out the startlist and endlist
-;strings and paste directly into this file on the appropriate
-;lines; prevents errors due to typos when copying manually.
-;Count the positions of filename, date, etc. and place on the
-;appropriate line.  Now run the archiver redirected to a file
-;to get its help screen (ex. "ARC > TEMP." or "ZOO h > TEMP.").
-;Look for the various command options (extract, list, etc.) and
-;put them into the file on the appropriate lines -- remember to
-;add the modifiers to prevent the archiver from stopping to ask
-;questions!  You could be in deep doo-doo if it's a detached
-;process.  While it may seem a pain in the arse to have to
-;edit this file when an archiver changes its command structure
-;or list format, at least it's something within your control;
-;you don't have to wait for an update to FM/2.  That means if I
-;die tomorrow you'll still be able to use FM/2 for years to come.
-
-;Here's an example of an ARC listing (5.12mpl, command "ARC l"):
-
-;----------------cut here----------------------
-;Name          Length    Date
-;============  ========  =========    <--this line is start-of-list
-;MAKEFILE           374  28 Nov 89
-;QSORT.C          14279  29 Nov 89
-;QSORT.EXE        24629  29 Nov 89
-;STUFF.H            371  29 Nov 89
-;        ====  ========               <--this line is end-of-list
-;Total      4     39653
-;----------------cut here----------------------
-
-;Note the filename is in position 0, old length in position 1, and the
-;date starts in position 2, with 3 parts, and there's no new length
-;field (so it'd be -1).  Compare that to the archiver entry for
-;ARC 5.12mpl above and you should get a feel for what all those fields
-;mean.  Here's a diagram of how a file line breaks down:
-
-;STUFF.H            371  29 Nov 89
-;  ^                 ^   ^
-;  |                 |   |
-;  |                 |   +--Date starts in field 2, 3 parts (29, Nov, and 89)
-;  |                 |
-;  |                 +--Old file length, field 1
-;  |
-;  +--Filename, field 0 (count from 0, not 1)
-
-;If you're adding an entirely new archive format, note that you can
-;use 'C'-style \x<hexnumber> on the signature line in this file.
-;For example, the \x1a in ARC 5.12mpl's signature line means FM/2 will
-;look for an ASCII 26 (text EOF marker) in position 0 (first byte, as
-;indicated by ARC's line 3, the offset into a file for the signature)
-;of a file to determine if it's an archive.  If line 3's offset is
-;negative, FM/2 looks from the end of the file instead of the beginning.
-;You can usually figure out what an archiver's signature is by looking
-;at a few archives with a file viewing program like Vernon Buerg's
-;LIST.  By all means send me anything new you figure out for inclusion
-;in future releases.
-
-;You can have several entries for one type of archive in this file.  FM/2
-;tries entries sequentially to list the file until it finds one that works.
-;If the first entry for a signature doesn't work, and FM/2 finds one that
-;does, it moves that entry to the top of the list and rewrites ARCHIVER.BB2
-;to make future accesses faster.  This allows me to list everything I can
-;get entries for and let FM/2 sort out what the user actually has that works.
-;It also lets you, the user, create archives with more than one archiver that
-;produces the same sort of archive (or with different switches, like one with
-;LHArc producing -lh5- compression and one with it producing old, compatible
-;-lh1- compression).
-
-;Always end file with blank line or comment
Index: trunk/assoc.tmp
===================================================================
--- trunk/assoc.tmp	(revision 1912)
+++ 	(revision )
@@ -1,41 +1,0 @@
-; FM/2 associations file -- 5 lines: mask, cmd line, sig, offset, flags
-;  For OS/2 associations only, uncomment following 5 lines:
-;*
-;<>
-;
-;0
-;0
-;
-*.ico;*.ptr
-iconedit.exe %a
-
-0
-0
-;
-*.inf;*.hlp
-view.exe %a
-HSP
-0
-0
-;
-*.dsk;*.?dk
-loaddskf.exe %a A:
-
-0
-0
-;
-;To use seamokey for html Rename Run!.exe (found on Hobbes) to 
-;seamonky!L.exe and place in your Seamonkey Directory include the full 
-;path on the seamonkey!L.exe line and uncomment the next 5 lines 
-;*.htm;*.html
-;seamonkey!L.exe %a 
-;
-;0
-;0
-;
-*.wpi
-<>
-
-0
-0
-
Index: trunk/av2.c
===================================================================
--- trunk/av2.c	(revision 1912)
+++ 	(revision )
@@ -1,262 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  Archive viewer applet
-
-  Copyright (c) 1993-98 M. Kimes
-  Copyright (c) 2007, 2008 Steven H. Levine
-
-  23 Sep 07 SHL Sync with standards
-  23 Sep 07 SHL Get rid of statics
-  17 Sep 08 JBS Convert to use of wrapped DosFind... (i.e. xDosFind...)
-  14 Dec 08 SHL Add exception handler support
-
-***********************************************************************/
-
-#include <stdlib.h>			// getenv
-#include <string.h>
-
-#define INCL_DOS
-#define INCL_WIN
-#define INCL_LONGLONG
-#define INCL_DOSEXCEPTIONS		// XCTP_...
-#define INCL_DOSERRORS			// NO_ERROR
-
-#include "dll\fm3dll.h"
-#include "dll\mainwnd.h"		// hwndBubble
-#include "dll\notebook.h"		// appname hwndHelp
-#include "dll\arccnrs.h"
-#include "dll\fm3str.h"
-#include "dll\version.h"
-#include "dll\arccnrs.h"
-#include "dll\assoc.h"			// ExecAssociation
-#include "dll\defview.h"		// ShowMultimedia
-#include "dll\inis.h"			// StartIniEditor
-#include "dll\dirs.h"			// switch_to
-#include "dll\viewer.h"			// StartMLEEditor
-#include "dll\getnames.h"		// insert_filename
-#include "dll\copyf.h"			// unlinkf
-#include "dll\init.h"			// InitFM3DLL
-#include "dll\valid.h"			// IsFile
-#include "dll\wrappers.h"		// xDosFind...
-#include "dll\errutil.h"		// Error reporting
-#include "dll\excputil.h"		// Exception handlers
-
-static PSZ pszSrcFile = __FILE__;
-
-HMTX av2Sem;
-
-VOID APIENTRY deinit(ULONG why)
-{
-  // cleanup before exiting
-
-  DosCloseMutexSem(av2Sem);
-  if (DosOpenMutexSem("\\SEM32\\AV2", &av2Sem)) {
-    CHAR s[CCHMAXPATH];			// 23 Sep 07 SHL
-    CHAR *enddir;
-    HDIR search_handle;
-    ULONG num_matches;
-    FILEFINDBUF3 ffb3;
-
-    save_dir(s);
-    if (s[strlen(s) - 1] != '\\')
-      strcat(s, "\\");
-    enddir = &s[strlen(s)];
-    if (*ArcTempRoot) {
-      strcat(s, ArcTempRoot);
-      strcat(s, "*");
-      search_handle = HDIR_CREATE;
-      num_matches = 1;
-      if (!xDosFindFirst(s,
-			&search_handle,
-			FILE_NORMAL | FILE_DIRECTORY | FILE_SYSTEM |
-			FILE_READONLY | FILE_HIDDEN | FILE_ARCHIVED,
-			&ffb3,
-			sizeof(ffb3),
-			&num_matches,
-			FIL_STANDARD)) {
-	do {
-	  strcpy(enddir, ffb3.achName);
-	  if (ffb3.attrFile & FILE_DIRECTORY) {
-	    wipeallf(TRUE, "%s\\*", s);
-	    DosDeleteDir(s);
-	  }
-	  else
-	    unlinkf(s);
-	} while (!xDosFindNext(search_handle,
-			      &ffb3, sizeof(FILEFINDBUF3), &num_matches, FIL_STANDARD));
-	DosFindClose(search_handle);
-      }
-    }
-  }
-  else
-    DosCloseMutexSem(av2Sem);
-
-  DosExitList(EXLST_REMOVE, deinit);
-}
-
-int main(int argc, char *argv[])
-{
-  HAB hab;
-  HMQ hmq;
-  QMSG qmsg;
-  HWND hwndFrame = 0;
-  CHAR fullname[CCHMAXPATH] = { 0 };	// 14 Dec 08 SHL was static
-  PSZ thisarg = NULL;
-  UINT x;
-  APIRET regRet;
-  EXCEPTIONREGISTRATIONRECORD regRec = { NULL, NULL };
-
-  strcpy(appname, "AV/2");
-  fAmAV2 = TRUE;
-  DosError(FERR_DISABLEHARDERR);
-
-  regRec.ExceptionHandler = HandleException;
-  regRet = DosSetExceptionHandler(&regRec);
-  if (regRet != NO_ERROR) {
-    DbgMsg(pszSrcFile, __LINE__,
-	   "DosSetExceptionHandler failed with error %u", regRet);
-  }
-
-  for (x = 1; x < argc; x++) {
-    if (!strchr("/;,`\'", *argv[x]) &&
-	!thisarg &&
-	(IsFile(argv[x]) == 1 ||
-	 (strchr(argv[x], '?') || strchr(argv[x], '*') ||
-	  !strchr(argv[x], '.')))) {
-      thisarg = argv[x];
-      break;
-    }
-  }
-
-  DosExitList(EXLST_ADD, deinit);
-
-  if (DosOpenMutexSem("\\SEM32\\AV2", &av2Sem))
-    DosCreateMutexSem("\\SEM32\\AV2", &av2Sem, DC_SEM_SHARED, FALSE);
-
-  if (thisarg) {
-    if (DosQueryPathInfo(thisarg,
-			 FIL_QUERYFULLNAME, fullname, sizeof(fullname)))
-      strcpy(fullname, thisarg);
-    if (*fullname && (strchr(fullname, '?') ||
-		      strchr(fullname, '*') || !strchr(fullname, '.'))) {
-
-      FILEFINDBUF3 ffb3;
-      ULONG nm;
-      HDIR hdir;
-      CHAR *enddir;
-
-      if (!strchr(fullname, '.'))
-	strcat(fullname, ".*");
-      enddir = strrchr(fullname, '\\');
-      if (enddir) {
-	enddir++;
-	hdir = HDIR_CREATE;
-	nm = 1;
-	if (!DosFindFirst(fullname,
-			  &hdir,
-			  FILE_NORMAL | FILE_SYSTEM |
-			  FILE_READONLY | FILE_HIDDEN | FILE_ARCHIVED,
-			  &ffb3, sizeof(FILEFINDBUF3), &nm, FIL_STANDARD)) {
-	  strcpy(enddir, ffb3.achName);
-	  DosFindClose(hdir);
-	}
-      }
-    }
-  }
-
-  hab = WinInitialize(0);
-  if (hab) {
-    hmq = WinCreateMsgQueue(hab, 1024);
-    if (hmq) {
-      {
-	CHAR path[CCHMAXPATH];
-	CHAR *env;
-	FILESTATUS3 fs;
-
-	env = getenv("FM3INI");
-	if (env && *env) {
-	  DosError(FERR_DISABLEHARDERR);
-	  if (!DosQueryPathInfo(env, FIL_QUERYFULLNAME, path, sizeof(path))) {
-	    DosError(FERR_DISABLEHARDERR);
-	    if (!DosQueryPathInfo(path, FIL_STANDARD, &fs, sizeof(fs))) {
-	      if (!(fs.attrFile & FILE_DIRECTORY)) {
-		env = strrchr(path, '\\');
-		if (env)
-		  *env = 0;
-	      }
-	      DosError(FERR_DISABLEHARDERR);
-	      if (!DosQueryPathInfo(path, FIL_STANDARD, &fs, sizeof(fs))) {
-		if (fs.attrFile & FILE_DIRECTORY)
-		  switch_to(path);
-	      }
-	    }
-	  }
-	}
-      }
-      if (InitFM3DLL(hab, argc, argv)) {
-	if (CheckVersion(VERMAJOR, VERMINOR)) {
-	  fAmAV2 = TRUE;
-	  if (!*fullname) {
-	    strcpy(fullname, "*");
-	    if (!insert_filename(HWND_DESKTOP,
-				 fullname,
-				 TRUE,
-				 FALSE) || !*fullname || *fullname == '*')
-	      goto Abort;
-	  }
-	  if (*fullname) {
-	    if (ExecAssociation(HWND_DESKTOP, fullname) == -1) {
-	      hwndFrame = StartArcCnr(HWND_DESKTOP,
-				      (HWND) 0, fullname, 0, NULL);
-	      if (!hwndFrame) {
-
-		CHAR *p = strrchr(fullname, '.');
-
-		if (p) {
-		  if (!stricmp(p, ".INI"))
-		    hwndFrame = StartIniEditor(HWND_DESKTOP, fullname, 0);
-		}
-		if (!ShowMultimedia(fullname))
-		  hwndFrame = StartMLEEditor(HWND_DESKTOP,
-					     1,
-					     ((*fullname) ?
-					      fullname : NULL), (HWND) 0);
-	      }
-	      if (hwndFrame && WinIsWindow(hab, hwndFrame)) {
-		if (hwndHelp)
-		  WinAssociateHelpInstance(hwndHelp, hwndFrame);
-		for (;;) {
-		  if (!WinGetMsg(hab, &qmsg, (HWND) 0, 0, 0)) {
-		    if (!WinIsWindow(hab, hwndFrame))
-		      break;
-		    if (qmsg.hwnd)
-		      qmsg.msg = WM_CLOSE;
-		    else
-		      break;
-		  }
-		  if (hwndBubble &&
-		      ((qmsg.msg > (WM_BUTTON1DOWN - 1) &&
-			qmsg.msg < (WM_BUTTON3DBLCLK + 1)) ||
-		       (qmsg.msg > (WM_CHORD - 1) &&
-			qmsg.msg < (WM_BUTTON3CLICK + 1))) &&
-		      WinIsWindowVisible(hwndBubble))
-		    WinShowWindow(hwndBubble, FALSE);
-		  WinDispatchMsg(hab, &qmsg);
-		}
-		DosSleep(125);
-	      }
-	    }
-	  }
-	}
-      }
-    Abort:
-      DosSleep(125);
-      WinDestroyMsgQueue(hmq);
-    }
-    WinTerminate(hab);
-  }
-  return 0;
-}
Index: trunk/av2.def
===================================================================
--- trunk/av2.def	(revision 1912)
+++ 	(revision )
@@ -1,9 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2009 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-
-option description '@#The Netlabs FM/2 team:3.25.0#@##1## 2024-06-02 03:25:00      ZOBOPEEP::EN:US:0:U:@@FM/2 Archive Viewer MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, 2024 Steven Levine and Associates, Inc. All rights reserved'
-
-option stack = 488416
Index: trunk/av2.mak
===================================================================
--- trunk/av2.mak	(revision 1912)
+++ 	(revision )
@@ -1,23 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2007 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-# 23 Feb 08 JBS Add support for building SYM files
-# 04 Jul 11 GKY Make xqs files an explicit target so they will be rebuild if lost somehow.
-
-BASE=av2
-
-!include makefile_pre.mk
-
-all: $(BASE).exe $(BASE).res .symbolic
-
-sym: $(BASE).sym $(BASE).xqs .symbolic
-
-$(BASE).res: $(BASE).rc dll\fm3dll.h icons\view3.ico bitmaps\*.bmp
-
-$(BASE).obj: $(BASE).c dll\version.h
-
-!include makefile_post.mk
-
-# The end
Index: trunk/av2.rc
===================================================================
--- trunk/av2.rc	(revision 1912)
+++ 	(revision )
@@ -1,43 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  av2 resources
-
-  Copyright (c) 1993-02 M. Kimes
-  Copyright (c) 2003, 2008 Steven H.Levine
-
-  15 Oct 02 MK Baseline
-  04 Nov 03 SHL Drop extra default icon
-  04 Jan 08 SHL Sync with fm3dll.h mods
-
-***********************************************************************/
-
-#include "dll\fm3dll2.h"
-
-DEFAULTICON                 icons\VIEW3.ICO
-
-BITMAP DIR_FOLDERICON       bitmaps\PMAP.BMP
-BITMAP DIR_FRAME            bitmaps\FILE.BMP
-BITMAP 65534                bitmaps\EMPTY.BMP
-BITMAP IDM_DELETE           bitmaps\DELETE.BMP
-BITMAP IDM_EXTRACT          bitmaps\EXTRACT.BMP
-BITMAP IDM_PRINT            bitmaps\PRINT.BMP
-BITMAP IDM_TEST             bitmaps\TEST.BMP
-BITMAP IDM_VIRUSSCAN        bitmaps\VIRUS.BMP
-BITMAP IDM_EXEC             bitmaps\EXEC.BMP
-BITMAP IDM_VIEW             bitmaps\VIEW.BMP
-BITMAP IDM_PERMDELETE       bitmaps\PERMDEL.BMP
-BITMAP IDM_RESCAN           bitmaps\RESCAN.BMP
-BITMAP IDM_REFRESH          bitmaps\RESCAN.BMP
-BITMAP IDM_FILTER           bitmaps\FILTER.BMP
-BITMAP IDM_WALKDIR          bitmaps\WALK.BMP
-BITMAP IDM_GREP             bitmaps\GREP.BMP
-BITMAP IDM_SEEALL           bitmaps\SEEALL.BMP
-BITMAP IDM_FINDFIRST        bitmaps\FINDFRST.BMP
-BITMAP IDM_FINDNEXT         bitmaps\FINDNEXT.BMP
-BITMAP IDM_FINDPREV         bitmaps\FINDPREV.BMP
-BITMAP IDM_CLEARCNR         bitmaps\CLEARCNR.BMP
-BITMAP IDM_REMOVE           bitmaps\REMOVOBJ.BMP
-
Index: trunk/cfgmgr.cmd
===================================================================
--- trunk/cfgmgr.cmd	(revision 1912)
+++ 	(revision )
@@ -1,1004 +1,0 @@
-/*
-   $Id$
-
-   CFGMGR.CMD - manage installation, maintenance and deinstallation
-                of FM/2 configuration files
-
-   Optional Parameters:
-
-           /DEFAULTS     Forces overwrite of existing configuration
-                   files, i.e. "reset to FM/2 defaults"
-
-           /DELETE        Deletes the configuration files
-
-           /UNATTENDED
-                   Runs without user interaction/confirmation
-
-           /TOOLBARSONLY
-                   Process toolbar-related files only
-
-   If CFGMGR.CMD is run without parameters, it will install a default
-   configuration file ONLY if that configuration file does not already
-   exist.
-
-   TODO:
-      Read filename, dirname info from a file
-      Allow the above filename to be passed as a parameter
-      Edit to make sure this program is located correctly
-      Add version checking
-      Fully implement logging
-
-   Change log:
-      16 Mar 09 JBS Added code to copy discontinued directory container state ini keys to new names
-      12 Apr 10 JBS Ticket 429: Speed up the deletion of obsolete state-related FM3.INI keys.
-      12 Apr 10 JBS Ticket 429: Add code to delete obsolete "LastToolBox" key(s).
-      30 May 10 JBS Ticket 428: Add support for UNZIP v6. This program was modified to:
-         if not already done then
-            backup existing .\ARCHIVER.BB2 file to .\USER_CONFIG_BACKUP\B4UNZIP6.BB2
-            insert the UNZIP v6 entry from .\TMPLATES\ARCHVER.TMP into ,\ARCHIVER.BB2 (at the end)
-      30 Jun 11 JBS Ticket 459: Fix a bug and improve text when support for Unzip v6 has already been added.
-      05 Mar 14 JBS Ticket #532: Modified to append additional archiver definitions to ARCHIVER,BB2
-         Also, reworked the code to make appending more definitions easier in the future
-         Also, added missing features and a partial implementation of logging.
-
-*/
-
-n = setlocal()
-
-signal on Error
-signal on FAILURE name Error
-signal on Halt
-signal on NOTREADY name Error
-signal on NOVALUE name Error
-signal on SYNTAX name Error
-signal on novalue             /* for debugging */
-
-call RxFuncAdd 'SysLoadFuncs', 'REXXUTIL', 'SysLoadFuncs'
-call SysLoadFuncs
-
-globals = 'cfg. button.'
-
-call Init
-
-parse arg args
-call ProcessArgs strip(args)
-if cfg.errorcode \= 0 then
-   signal ErrorExit
-
-if cfg.operation = 'INSTALL' then
-   call UpdateFM2Ini
-
-if cfg.attended = 1 then
-   do
-      call GetUserOptions
-      if cfg.userabort = 1 then
-         signal NormalExit
-   end
-
-/*
- *
- * The following code
- *    Installs default files if /DEFAULTS is specified or if a cfg file is missing
- *    Handles all /DEINSTALL actions
- * It should precede the call to UpdateArchiverBB2
- *
- */
-
-do f = 1 to cfg.file.0
-   file_exists = stream(cfg.file.f.name, 'c' , 'query exists')
-   if cfg.operation = 'INSTALL' then
-      if file_exists \= '' then
-         if (cfg.toolbarsonly = 0 | cfg.file.f.toolbar = 1) then
-            do
-               if cfg.defaults = 1 then
-                  if FilesAreDifferent(cfg.file.f.default, cfg.file.f.name) = 1 then
-                     do
-                        if cfg.attended = 1 then
-                           do
-                              if PromptForReplaceOption(f) = 'N' then
-                                 iterate
-                           end
-                        /* attended = 0 or user choice = 'Y' */
-                        cfg.errorcode = CfgAction( 'RESETTODEFAULT', f )
-                     end
-                  else
-                     nop
-               else
-                  if (cfg.file.f.toolbar = 1) & (cfg.attended = 0) & (translate(right(cfg.file.f.name, 13, ' ')) \= '\QUICKTLS.DAT') then
-                     call Ticket267Fix cfg.file.f.name
-            end
-         else
-            nop
-      else
-        cfg.errorcode = CfgAction( 'INSTALLDEFAULT', f )
-   else /* operation = deinstall */
-      do
-         if BackupFileIsOK(f) = 0 then
-            iterate
-         if cfg.attended = 1 then
-            do
-               user_choice = PromptForReplaceOption(f)
-               if user_choice == 'Q' then
-                  signal NormalExit
-               if user_choice == 'N' then
-                  iterate
-            end
-         cfg.errorcode = CfgAction('DEINSTALL', f)
-         if cfg.errorcode \= 0 then
-            leave
-      end
-end
-
-call UpdateArchiverBB2
-
-ErrorExit:
-select
-   when cfg.errorcode = 0 then
-      nop
-   when cfg.errorcode = 1 then
-      call Usage
-   when cfg.errorcode = 2 then
-      call Usage
-   when cfg.errorcode = 5 then
-      do
-         say 'Fatal error occurred in updating your ARCHIVER.BB2 file!'
-      end
-   when cfg.errorcode = 3 then
-      call ProgramError
-   otherwise
-      call ProgramError
-end
-
-NormalExit:
-signal off notready
-call stream cfg.log_file, 'c', 'close'
-n = endlocal()
-exit cfg.errorcode
-
-/* Subroutines */
-
-/*=== Error() Report ERROR, FAILURE etc. and exit ===*/
-
-Error:
-   say
-   parse source . . cmd
-   say 'CONDITION'('C') 'signaled at' cmd 'line' SIGL'.'
-   if 'CONDITION'('D') \= '' then
-     say 'REXX reason =' 'CONDITION'('D')'.'
-   if 'CONDITION'('C') == 'SYNTAX' & 'SYMBOL'('RC') == 'VAR' then
-     say 'REXX error =' RC '-' 'ERRORTEXT'(RC)'.'
-   else if 'SYMBOL'('RC') == 'VAR' then
-     say 'RC =' RC'.'
-   say 'Source =' 'SOURCELINE'(SIGL)
-
-   if 'CONDITION'('I') \== 'CALL' | 'CONDITION'('C') == 'NOVALUE' | 'CONDITION'('C') == 'SYNTAX' then do
-     trace '?A'
-     say 'Exiting.'
-     call 'SYSSLEEP' 2
-     exit 'CONDITION'('C')
-   end
-return
-
-/* end Error */
-
-novalue:
-   say 'Uninitialized variable: ' || condition('D') || ' on line: 'sigl
-   say 'Line text: 'sourceline(sigl)
-   cfg.errorcode = 3
-   signal ErrorExit
-
-
-Init: procedure expose (globals)
-
-   button.                         = ''
-
-   button.CMDS.helptext = 'Commands toolbar'
-   button.CMDS.text     = 'Cmds'
-   button.CMDS.id       = 4900
-
-   button.UTILS.helptext = 'Utility toolbar'
-   button.UTILS.text     = 'Utils'
-   button.UTILS.id       = 4901
-
-   button.SORT.helptext = 'Sort toolbar'
-   button.SORT.text     = 'Sort'
-   button.SORT.id       = 4902
-
-   button.SELECT.helptext = 'Select toolbar'
-   button.SELECT.text     = 'Select'
-   button.SELECT.id       = 4903
-
-   button.CONFIG.helptext = 'Configuration toolbar'
-   button.CONFIG.text     = 'Cmds'
-   button.CONFIG.id       = 4904
-
-   button.FILES.helptext = 'Files toolbar'
-   button.FILES.text     = 'Files'
-   button.FILES.id       = 4905
-
-   button.VIEWS.helptext = 'Views toolbar'
-   button.VIEWS.text     = 'Views'
-   button.VIEWS.id       = 4906
-
-   cfg.              = ''
-   cfg.errorcode     = 0
-   cfg.defaults      = 0
-   cfg.attended      = 1
-   cfg.toolbarsonly  = 0
-   cfg.actionmethod  = 'COPY'       /* The default (and currently only) method of backing up and restoring */
-   cfg.log_file      = 'cfgmgr.log'
-   cfg.vio_output_control = '>NUL 2>NUL'
-
-   parse source . . thispgm
-   p = lastpos('\', thispgm)
-   cfg.this_dir = filespec('D', thispgm) || filespec('P', thispgm)  /* Directory w/ backslash */
-   cfg.this_dir = left(cfg.this_dir, length(cfg.this_dir) - 1)      /* Directory w/o backslash */
-   if length(cfg.this_dir) = 2 then /* If root dir */
-      call directory cfg.this_dir || '\'
-   else                            /* not root dir */
-      call directory left(cfg.this_dir, length(cfg.this_dir) - 1)
-
-   cfg.backup_dir = cfg.this_dir || '\User_Config_Backup'
-   call SysMkDir cfg.backup_dir
-
-   cfg.pgmname  = translate(substr(thispgm, p + 1, lastpos('.', thispgm) - p - 1))
-
-   fm3ini = value('FM3INI',,'OS2ENVIRONMENT')
-   if fm3ini = '' then
-      cfg.inifile = cfg.this_dir || '\FM3.INI'
-   else
-      cfg.inifile = fm3ini
-
-
-   /*   Read from a file instead?   */
-
-   f = 0
-
-   f = f + 1
-   cfg.file.f.default = '.\Tmplates\assoc.tmp'
-   cfg.file.f.name    = '.\assoc.dat'
-   cfg.file.f.desc.1  = 'FM/2 associations'
-   cfg.file.f.desc.0  = 1
-   cfg.file.f.toolbar = 0
-
-   f = f + 1
-   cfg.file.f.default = '.\Tmplates\commands.tmp'
-   cfg.file.f.name    = '.\commands.dat'
-   cfg.file.f.desc.1  = 'FM/2 user-defined commands'
-   cfg.file.f.desc.0  = 1
-   cfg.file.f.toolbar = 0
-
-   f = f + 1
-   cfg.file.f.default = '.\Tmplates\archiver.tmp'
-   cfg.file.f.name    = '.\archiver.bb2'
-   cfg.file.f.desc.1  = 'FM/2 archiver definitions'
-   cfg.file.f.desc.0  = 1
-   cfg.file.f.toolbar = 0
-
-   f = f + 1
-   cfg.file.f.default = '.\Tmplates\cmds.tmp'
-   cfg.file.f.name    = '.\cmds.tls'
-   cfg.file.f.desc.1  = 'FM/2 toolbar: commands'
-   cfg.file.f.desc.0  = 1
-   cfg.file.f.toolbar = 1
-
-   f = f + 1
-   cfg.file.f.default = '.\Tmplates\files.tmp'
-   cfg.file.f.name    = '.\files.tls'
-   cfg.file.f.desc.1  = 'FM/2 toolbar: files'
-   cfg.file.f.desc.0  = 1
-   cfg.file.f.toolbar = 1
-
-   f = f + 1
-   cfg.file.f.default = '.\Tmplates\select.tmp'
-   cfg.file.f.name    = '.\select.tls'
-   cfg.file.f.desc.1  = 'FM/2 toolbar: select'
-   cfg.file.f.desc.0  = 1
-   cfg.file.f.toolbar = 1
-
-   f = f + 1
-   cfg.file.f.default = '.\Tmplates\sort.tmp'
-   cfg.file.f.name    = '.\sort.tls'
-   cfg.file.f.desc.1  = 'FM/2 toolbar: sort'
-   cfg.file.f.desc.0  = 1
-   cfg.file.f.toolbar = 1
-
-   f = f + 1
-   cfg.file.f.default = '.\Tmplates\utils.tmp'
-   cfg.file.f.name    = '.\utils.tls'
-   cfg.file.f.desc.1  = 'FM/2 toolbar: utils'
-   cfg.file.f.desc.0  = 1
-   cfg.file.f.toolbar = 1
-
-   f = f + 1
-   cfg.file.f.default = '.\Tmplates\views.tmp'
-   cfg.file.f.name    = '.\views.tls'
-   cfg.file.f.desc.1  = 'FM/2 toolbar: views'
-   cfg.file.f.desc.0  = 1
-   cfg.file.f.toolbar = 1
-
-   f = f + 1
-   cfg.file.f.default = '.\Tmplates\config.tmp'
-   cfg.file.f.name    = '.\config.tls'
-   cfg.file.f.desc.1  = 'FM/2 toolbar: config'
-   cfg.file.f.desc.0  = 1
-   cfg.file.f.toolbar = 1
-
-   f = f + 1
-   cfg.file.f.default = '.\Tmplates\fm3tools.tmp'
-   cfg.file.f.name    = '.\fm3tools.dat'
-   cfg.file.f.desc.1  = 'FM/2 toolbar: tools?'
-   cfg.file.f.desc.0  = 1
-   cfg.file.f.toolbar = 0
-
-   f = f + 1
-   cfg.file.f.default = '.\Tmplates\filters.tmp'
-   cfg.file.f.name    = '.\filters.dat'
-   cfg.file.f.desc.1  = 'FM/2 filters'
-   cfg.file.f.desc.0  = 1
-   cfg.file.f.toolbar = 0
-
-   f = f + 1
-   cfg.file.f.default = '.\Tmplates\quicktls.tmp'
-   cfg.file.f.name    = '.\quicktls.dat'
-   cfg.file.f.desc.1  = 'FM/2 toolbar list'
-   cfg.file.f.desc.0  = 1
-   cfg.file.f.toolbar = 1
-
-   f = f + 1
-   cfg.file.f.default = '.\Tmplates\fatopt.tmp'
-   cfg.file.f.name    = '.\fatopt.cmd'
-   cfg.file.f.desc.1  = 'FM/2 FAT optimizing command'
-   cfg.file.f.desc.0  = 1
-   cfg.file.f.toolbar = 0
-
-   f = f + 1
-   cfg.file.f.default = '.\Tmplates\hpfsopt.tmp'
-   cfg.file.f.name    = '.\hpfsopt.cmd'
-   cfg.file.f.desc.1  = 'FM/2 HPFS optimizing command'
-   cfg.file.f.desc.0  = 1
-   cfg.file.f.toolbar = 0
-
-   f = f + 1
-   cfg.file.f.default = '.\Tmplates\jfsopt.tmp'
-   cfg.file.f.name    = '.\jfsopt.cmd'
-   cfg.file.f.desc.1  = 'FM/2 JFS optimizing command'
-   cfg.file.f.desc.0  = 1
-   cfg.file.f.toolbar = 0
-
-   cfg.file.0         = f
-
-
-/*
- * Unused code
- *
-   parse value SysTextScreenSize() with . cfg.screen_width
-   if cfg.screen_width = 0 then           /* for running in PMREXX, EPM, etc. */
-      cfg.screen_width = 80
-*/
-
-return
-
-ProcessArgs: procedure expose (globals)
-   parse arg args
-   call lineout cfg.log_file, 'Arguments:' args
-   if pos('/ToOlBaRsOnLy', args) > 0 then
-      cfg.specialiconrun = 1
-   else
-      cfg.specialiconrun = 0
-   parse upper arg args
-   do while args \= '' & cfg.errorcode = 0
-      parse var args param args
-      select
-         when param = '/INSTALL' then
-            if cfg.operation \= '' then
-               cfg.errorcode = 1
-            else
-               cfg.operation = 'INSTALL'
-         when param = '/DEINSTALL' then
-            if cfg.operation \= '' then
-               cfg.errorcode = 1
-            else
-               cfg.operation = 'DEINSTALL'
-         when param = '/UNATTENDED' then
-            cfg.attended = 0
-         when param = '/DEFAULTS' then
-            cfg.defaults = 1
-         when param = '/TOOLBARSONLY' then
-            cfg.toolbarsonly = 1
-         otherwise
-            cfg.errorcode = 2
-      end
-   end
-   if cfg.operation = '' then
-      cfg.errorcode = 1
-/*
-   else
-      if cfg.operation = 'INSTALL' & cfg.defaults = 0 then
-         cfg.attended = 0
-*/
-return
-
-GetUserOptions: procedure expose (globals)
-   call SysCls
-   option = ''
-   if cfg.defaults = 1 then
-      do
-         do while wordpos(option, 'A C Q') == 0
-            say
-            say
-            say
-            say ' *** Reset configuration files to default values ***'
-            say
-            say 'This program can reset ALL files to default values.'
-            say
-            say 'OR'
-            say
-            say 'This program can ask for confirmation before each file,'
-            say 'if it already exists, is replaced with its default.'
-            say
-            option = GetResponse('Type ''A'' for ALL files, ''C'' for Confirmations, ''Q'' to quit')
-         end
-         cfg.userabort = (option == 'Q')
-         if option == 'A' then
-            do
-               say
-               say
-               say '****  WARNING  ****' || copies(d2c(7), 3)
-               say
-               say 'You have chosen to replace ALL configuration files with'
-               say 'default values.'
-               say
-               if GetResponse('Type ''Y'' to proceed, anything else cancels') = 'Y' then
-                  cfg.attended = 0
-               else
-                  cfg.userabort = 1
-            end
-      end
-   else
-      if cfg.operation = 'DEINSTALL' then
-         do
-            /* messages here about delete */
-            call SysCls
-            say
-            say '****  WARNING  ****' || copies(d2c(7), 3)
-            say
-            say 'If you provide your consent, this program will'
-            say 'DELETE all FM/2 configuration files.'
-            say
-            if GetResponse('Type ''Y'' to proceed, anthing else cancels') = 'Y' then
-               cfg.attended = 0
-            else
-               cfg.userabort = 1
-         end
-return
-
-GetResponse: procedure
-   parse arg prompt
-   call charout , prompt || ': '
-   reply = translate(strip(SysGetKey()))
-   say
-return reply
-
-FilesAreDifferent: procedure
-   parse arg file.1, file.2
-   retval = 1                 /* assume files are different */
-   file.1.size = stream(file.1, 'c', 'query size')
-   file.2.size = stream(file.2, 'c', 'query size')
-   if file.1.size = file.2.size then
-      do
-         file.1.data = charin(file.1, 1, file.1.size)
-         call stream file.1, 'c', 'close'
-         file.2.data = charin(file.2, 1, file.2.size)
-         call stream file.2, 'c', 'close'
-         if file.1.data = file.2.data then
-            retval = 0
-      end
-   drop file.
-return retval
-
-PromptForReplaceOption: procedure expose (globals)
-   parse arg f
-   filename = filespec('N', cfg.file.f.name)
-   call SysCls
-   say
-   say
-   say 'Configuration file reset confirmation'
-   say
-   say 'File:'
-   say '   'filename
-   say
-   say 'Description:'
-   do d = 1 to cfg.file.f.desc.0
-      say '   'cfg.file.f.desc.d
-   end
-   say
-   if cfg.operation = 'INSTALL' then
-      do
-         say 'Back up and then overwrite your current 'filename
-         msg = 'with default values'
-      end
-   else
-      msg = 'Replace your current 'filename' with the backup file'
-return GetResponse(msg '(Y/n)?')
-
-Usage: procedure expose (globals)
-   say 'Proper usage of 'cfg.pgmname' (the order of the parameters is not important):'
-   say
-   say cfg.pgmname' /INSTALL [/UNATTENDED] [/TOOLBARSONLY]'
-   say '   This installs any missing configuration files with default values.'
-   say
-   say cfg.pgmname' /INSTALL /DEFAULTS [/UNATTENDED] [/TOOLBARSONLY]'
-   say '   This action backs up user-modified configuration files and replaces'
-   say '   them with default values. Unless /UNATTENDED, you are asked to confirm'
-   say '   this action.'
-   say
-   say cfg.pgmname' /DEINSTALL /DEFAULTS [/UNATTENDED] [/TOOLBARSONLY]'
-   say '   This reverses the action described above.'
-   say
-   say cfg.pgmname' /DEINSTALL [/UNATTENDED] [/TOOLBARSONLY]'
-   say '   This deletes all configuration files. Unless /UNATTENDED, you are asked'
-   say '   to confirm this action. (This is action is automatically done during'
-   say '   de-installation of FM/2. It is not an action users should normally take.)'
-   say
-   say 'The optional parameter /UNATTENDED means there will be NO user interaction'
-   say '   or confirmation of the operation!!!'
-   say
-   say 'The optional parameter /TOOLBARSONLY means only toolbar-related files will'
-   say '   be processed.'
-return
-
-ProgramError: procedure expose (globals)
-   say 'Fatal program error.'
-   say
-   say 'This file may have been altered in some way. Please re-install FM/2.'
-   say
-   say 'If this error continues after re-installing FM/2, contact FM/2 support'
-   say 'through the FM2_USER group on Netlabs.'
-exit
-
-CfgAction: procedure expose (globals)
-   parse arg action, f
-   retval = 0
-   select
-      when action = 'RESETTODEFAULT' then
-         select
-            when cfg.actionmethod = 'COPY' then
-               do
-                  call CopyFile cfg.file.f.name, cfg.backup_dir
-                  call CopyFile cfg.file.f.default, cfg.file.f.name
-               end
-            /* Implement other archive/restore methods here */
-            otherwise
-               retval = 4
-         end
-      when action = 'INSTALLDEFAULT' then
-         select
-            when cfg.actionmethod = 'COPY' then
-               do
-                  call CopyFile cfg.file.f.default, cfg.file.f.name
-               end
-            /* Implement other archive/restore methods here */
-            otherwise
-               retval = 4
-         end
-      when action = 'DEINSTALL' then
-         if cfg.defaults = 1 then
-            select
-               when cfg.actionmethod = 'COPY' then
-                  do
-                     call CopyFile cfg.backup_dir || '\' || cfg.file.f.name, ' .'
-                  end
-               /* Implement other archive/restore methods here */
-               otherwise
-                  retval = 4
-            end
-         else
-            select
-               when cfg.actionmethod = 'COPY' then
-                  if stream(cfg.file.f.name, 'c', 'query exists') \= '' then
-                     if FilesAreDifferent(cfg.file.f.name, cfg.file.f.default) = 0 then
-                        do
-                           '@del 'cfg.file.f.name cfg.vio_output_control
-                        end
-               /* Implement other archive/restore methods here */
-               otherwise
-                  retval = 4
-            end
-      otherwise
-         retval = 5
-
-   end
-return retval
-
-BackupFileIsOK: procedure expose (globals)
-   parse arg f
-   retval = 1                    /* assume yes */
-   if cfg.defaults = 1 then      /* Not needed when cfg.defaults = 0 */
-      do
-         retval = 0
-         select
-            when cfg.actionmethod = 'COPY' then
-               do
-                  backup_file = cfg.backup_dir || '\' || cfg.file.f.name
-                  if stream(backup_file, 'c', 'query exists') \= '' then
-                     retval = FilesAreDifferent(cfg.file.f.name, backup_file)
-               end
-            /* Implement other archive/restore methods here */
-            otherwise
-               cfg.errorcode = 4
-         end
-      end
-return retval
-
-UpdateFM2Ini: procedure expose (globals)
-   EnvVarList = strip(SysIni(cfg.inifile, 'FM/3', 'TreeEnvVarList'))
-   if EnvVarList = '' | EnvVarList = 'ERROR:' then
-      call SysIni cfg.inifile, 'FM/3', 'TreeEnvVarList', 'PATH;DPATH;LIBPATH;HELP;BOOKSHELF;LIB;INCLUDE;LOCPATH;SMINCLUDE;LPATH;CODELPATH'
-   LastToolbox = SysIni(cfg.inifile, 'FM/3', 'LastToolBox')
-   LastToolbar = SysIni(cfg.inifile, 'FM/3', 'LastToolbar')
-   if LastToolbar = 'ERROR:' then
-      do
-         if LastToolBox = 'ERROR:' then
-            LastToolbar = 'CMDS.TLS'
-         else
-            LastToolbar = LastToolbox
-        call SysIni cfg.inifile, 'FM/3', 'LastToolbar', LastToolbar
-      end
-   if LastToolbox \= 'ERROR:' then
-      call SysIni cfg.inifile, 'FM/3', 'LastToolBox', 'DELETE:'
-   if SysIni(cfg.inifile, 'FM/3', 'FM2Shutdown.Toolbar') = 'ERROR:' then
-      call SysIni cfg.inifile, 'FM/3', 'FM2Shutdown.Toolbar', LastToolbar
-   if SysIni(cfg.inifile, 'FM/4', 'LastToolbar') = 'ERROR:' then
-      call SysIni cfg.inifile, 'FM/4', 'LastToolbar', LastToolbar
-   if SysIni(cfg.inifile, 'FM/4', 'LastToolbox') \= 'ERROR:' then
-      call SysIni cfg.inifile, 'FM/4', 'LastToolBox', 'DELETE:'
-   do /* Copy old details keys to new names */
-      /* Check to see if this has already been done */
-      DetailsKeysConverted = SysIni(cfg.inifile, 'FM/3', 'DetailsKeysConverted')
-      StateNames = SysIni(cfg.inifile, 'FM/3', 'LastSetups')
-      KeyFragments = 'Dir Filter Pos Sort View'
-      NumKeyFragments = words(KeyFragments)
-      null = '00'x
-      if StateNames = 'ERROR:' then
-         StateNames = 'FM2Shutdown' || null
-      else
-         if pos('FM2Shutdown' || null, StateNames) = 0 then
-            StateNames = StateNames || 'FM2Shutdown' || null
-      do while StateNames \= ''
-         parse var StateNames StateName (null) StateNames
-         NumDirCnrs = SysIni(cfg.inifile, 'FM/3', StateName || '.NumDirsLastTime')
-         if NumDirCnrs \= 'ERROR:' then
-            do
-               NumDirCnrs = c2d(reverse(NumDirCnrs)) - 1  /* for 0 to num-1 loop */
-               do d = 0 to NumDirCnrs
-                  d2 = NumDirCnrs + 1 - d /* Work from the last to the first */
-                  do f = 1 to NumKeyFragments
-                     frag = word(KeyFragments, f)
-                     OldKey = StateName || '.DirCnr' || frag || '.' || d2
-                     OldKeyValue = SysIni(cfg.inifile, 'FM/3', OldKey)
-                     if OldKeyValue = 'ERROR:' then
-                        do
-                           f = NumKeyFragments  /* Force end of loop for this container */
-                           d = NumDirCnrs       /* Force end of loop for dir cnrs for this state */
-                        end
-                     else
-                        do
-                           call SysIni cfg.inifile, 'FM/3', OldKey, 'DELETE:'
-                           NewKey = StateName || '.DirCnr.' || d || '.' || frag
-                           call SysIni cfg.inifile, 'FM/3', NewKey, OldKeyValue
-                        end
-                  end
-               end
-               say
-            end
-      end
-   end
-return
-
-Ticket267Fix: procedure expose (globals)
-   parse arg infile
-   fix_string = 'Fixed: Ticket 267'
-   abort_fix = 0
-   outfile = SysTempFilename('cfgmgr??.fix')
-   call lineout outfile, ';' fix_string
-   /* Read file, if comment has "already repaired" message then stop */
-   do while lines(infile) > 0
-      line = linein(infile)
-      if left(line, 1) = ';' then
-         if pos(fix_string, line) > 0 then
-            do
-               abort_fix = 1
-               leave
-            end
-         else
-            call lineout outfile, line
-      else if word(line, 1) = ':spacer' then
-         call lineout outfile, ';' || substr(line, 2)
-      else
-         do
-            tool.1 = line
-            tool.2 = linein(infile)
-            tool.3 = linein(infile)
-            tool.4 = linein(infile)
-            button_name = translate(tool.2)
-            if (button.button_name.text \= '') & (tool.4 >= 4900) & (tool.4 < 4950) then
-               do
-                  call lineout outfile, button.button_name.helptext
-                  call lineout outfile, button.button_name.text
-                  call lineout outfile, tool.3
-                  call lineout outfile, button.button_name.id
-               end
-            else
-               do
-                  call lineout outfile, tool.1
-                  call lineout outfile, tool.2
-                  call lineout outfile, tool.3
-                  call lineout outfile, tool.4
-               end
-         end
-   end
-   call stream infile, 'c', 'close'
-   call stream outfile, 'c', 'close'
-   if abort_fix = 0 then
-      do
-         'copy' infile cfg.backup_dir         /* backup tls file */
-         'copy' outfile infile                   /* "install" new  tls file */
-      end
-   call SysFileDelete outfile
-return
-
-/* Write a message to the log file and, if attended, to the screen */
-WriteMsg: procedure expose (globals)
-   parse arg msg
-   call lineout cfg.log_file, date() time() ':' msg
-   if cfg.attended = 1 then
-      say msg
-return
-
-CopyFile: procedure expose (globals)
-   parse arg from_file, to_file
-   '@copy' from_file to_file cfg.vio_output_control
-return rc
-
-UpdateArchiverBB2: procedure expose (globals)
-   myrc = 0
-
-   /*
-    *    If CFGMGR was called with /DEFAULTS and/or /DEINSTALL parameters then there is nothing to do here!
-    */
-   if cfg.defaults = 1 | cfg.operation = 'DEINSTALL' then
-      return myrc
-
-   bb2_file = cfg.this_dir || '\ARCHIVER.BB2'
-   bb2_template_file = cfg.this_dir || '\Tmplates\archiver.tmp'
-
-   bb2_backup_file = cfg.backup_dir || '\Backup.bb2'  /* <== Change this each new archivers are to be inserted */
-
-   myrc = CopyFile(bb2_file, bb2_backup_file)
-   if myrc \= 0 then
-      do
-         if cfg.attended = 1 then
-            do
-               say
-               call WriteMsg 'Error: Unable to back up' filespec('n', bb2_file) || '.'
-               say
-               if cfg.defaults = 1 then
-                  msgend = 'reverting to a default FM/2 ARCHIVER.BB2.'
-               else
-                  msgend = 'appending new archiver definitions to' filespec('n', bb2_file) || '.'
-               call WriteMsg "Enter 'P' to proceed with" msgend ', or...'
-               user_option = GetResponse("Enter 'Q' to abort" cfg.pgmname '(P/q)')
-            end
-         else
-            user_option = 'P'
-      end
-   else
-      user_option = 'P'
-   if user_option = 'P' then
-      do
-         if cfg.attended = 1 & myrc \= 0 then
-            do
-               say
-               call WriteMsg 'Appending new archiver definitions to' filespec('n', bb2_file) || '.'
-               say
-               user_option = GetResponse("OK to proceed? (Y/n)")
-            end
-         else
-            user_option = 'Y'
-         if user_option = 'Y' then
-            do
-               myrc = InsertNewArchivers(bb2_file, bb2_template_file)
-               select
-                  when myrc < 0 then
-                     do
-                        if cfg.attended = 1 then
-                           do
-                              say
-                              call WriteMsg filespec('n', bb2_file) 'already has definitions for the new archivers.'
-                           end
-                        myrc = 0
-                     end
-                  when myrc = 0 then
-                     if cfg.attended = 1 then
-                        do
-                           say
-                           call WriteMsg filespec('n', bb2_file) 'successfully updated with new archivers definitions.'
-                        end
-                  otherwise
-                     do
-                        if cfg.attended = 1 then
-                           do
-                              say
-                              call WriteMsg 'Error: Unable to update' filespec('n', bb2_file) 'with new archiver definitions.'
-                              say
-                              call WriteMsg 'Current file continues in use.'
-                              say
-                              call WriteMsg "Enter 'P' to proceed with other updates or..."
-                              user_option = GetResponse("Enter 'Q' to abort" cfg.pgmname '(P/q)')
-                              if user_option = 'Q' then
-                                 cfg.userabort = 1
-                           end
-                     end
-               end
-            end
-      end /* Install, append new */
-   else /* Backup not OK, no proceed */
-      cfg.userabort = 1
-return (5*(myrc \= 0))  /* Convert any non-zero into a 5 */
-
-InsertNewArchivers: procedure expose(globals)
-   parse arg bb2_file, bb2_template_file
-   myrc = 0
-
-   files.1.name = bb2_file
-   files.2.name = bb2_template_file
-   files.0 = 2
-
-   do i = 1 to files.0
-      j = 0
-      do while lines(files.i.name) > 0
-         j = j + 1
-         files.i.lines.j = linein(files.i.name)
-      end
-      files.i.lines.0 = j
-      call stream files.i.name, 'c', 'close'
-   end
-
-   zip6_liststart_line = '--------  ------  ------- ---- ---------- ----- --------  ----'
-   zip6_listend_line =   '--------          -------  ---                            -------'
-
-   markers. = ''
-   i = 0
-   i = i + 1
-   markers.i.name = 'Zip v6.0'
-   markers.i.markerline_start = zip6_listend_line
-   markers.i.markerline_pos_in_def = 16
-   markers.i.pos_of_def_in_file.1 = 0
-   markers.i.pos_of_def_in_file.2 = 0
-   i = i + 1
-   markers.i.name = '7 Zip'
-   markers.i.markerline_start = '7ZA.EXE'
-   markers.i.markerline_pos_in_def   = 4
-   markers.i.pos_of_def_in_file.1 = 0
-   markers.i.pos_of_def_in_file.2 = 0
-   i = i + 1
-   markers.i.name = 'LZip'
-   markers.i.markerline_start = 'LZIP.EXE'
-   markers.i.markerline_pos_in_def   = 4
-   markers.i.pos_of_def_in_file.1 = 0
-   markers.i.pos_of_def_in_file.2 = 0
-   i = i + 1
-   markers.i.name = 'XC'
-   markers.i.markerline_start = 'XC.EXE'
-   markers.i.markerline_pos_in_def   = 4
-   markers.i.pos_of_def_in_file.1 = 0
-   markers.i.pos_of_def_in_file.2 = 0
-
-   markers.0 = i - 1 /* test: skip xc for now */
-
-   do i = 1 to files.0
-      in_def = 0
-      do j = 1 to files.i.lines.0
-         if left(files.i.lines.j, 1) = ';' then
-            do
-               if in_def = 1 then in_def = 0
-               iterate
-            end
-         else
-            if in_def = 0 then
-               if strip(files.i.lines.j) = '' then  /* 1st line of def can't be blank? */
-                  iterate
-               else
-                  do
-                     in_def = 1
-                     def_line = 1
-                     last_def.i = j
-                  end
-            else
-               def_line = def_line + 1
-         do m = 1 to markers.0
-            if markers.m.pos_of_def_in_file.i = 0 then
-               if markers.m.markerline_pos_in_def = def_line then
-                  do /* Check for marker line here */
-                     if abbrev(translate(files.i.lines.j), markers.m.markerline_start) = 1 then
-                        do
-                           if markers.m.name \= 'Zip v6.0' then
-                              do
-                                 markers.m.pos_of_def_in_file.i = j - markers.m.markerline_pos_in_def + 1
-/*
-                                 call WriteMsg 'Found' markers.m.name 'definition in' filespec('n', files.i.name) || '.'
-*/
-                              end
-                           else
-                              do /* special code for zip 6 with 2 marker lines */
-                                 q = j - 1
-                                 if abbrev(files.i.lines.q, zip6_liststart_line) = 1 then
-                                    do
-                                       markers.m.pos_of_def_in_file.i = j - markers.m.markerline_pos_in_def + 1
-/*
-                                       call WriteMsg 'Found' markers.m.name 'definition in' filespec('n', files.i.name) || '.'
-*/
-                                    end
-                              end
-                        end
-                  end
-         end
-      end
-   end
-   end_of_archivers_line = last_def.1 + 21
-
-   temp_file = SysTempFilename(cfg.this_dir || '\bb2temp.???')
-   new_data_written = 0
-   do j = 1 to end_of_archivers_line
-      call lineout temp_file, files.1.lines.j
-   end
-   do m = 1 to markers.0
-      if markers.m.pos_of_def_in_file.1 = 0 then
-/*
-   Don't bother checking to see if archiver.tmp has new defs. Just assume this.
-         if markers.m.pos_of_def_in_file.2 = 0 then
-            do
-               call WriteMsg 'Definition for' markers.m.name 'not found in either file!!'
-            end
-         else
-*/
-            do
-               call WriteMsg 'Inserting definition for' markers.m.name
-               start_at = markers.m.pos_of_def_in_file.2 - 3
-               end_at = start_at + 21 + 4 - 1
-               do q = start_at to end_at
-                  call lineout temp_file, files.2.lines.q
-               end
-               new_data_written = 1
-            end
-/*
-   Debug code
-      else
-         if markers.m.pos_of_def_in_file.2 = 0 then
-            do
-               call WriteMsg 'Definition for' markers.m.name 'not found in' filespec('n', files.2.name) || '!!'
-            end
-         else
-            do
-               call WriteMsg markers.m.name 'found in' files.1.name 'and' files.2.name
-            end
-*/
-   end
-   if new_data_written = 1 then
-      do
-         do q = j to files.1.lines.0   /* "j" is from the earlier loop */
-            call lineout temp_file, files.1.lines.q
-         end
-         call stream temp_file, 'c', 'close'
-         call SysFileDelete files.1.name
-         myrc = CopyFile( temp_file, files.1.name )
-      end
-   else
-      do /* No need to update ARCHIVER.BB2 */
-         myrc = -1
-         call stream temp_file, 'c', 'close'
-      end
-   call SysFileDelete temp_file
-return myrc
-
Index: trunk/cmds.tmp
===================================================================
--- trunk/cmds.tmp	(revision 1912)
+++ 	(revision )
@@ -1,125 +1,0 @@
-; Fixed: Ticket 267
-;
-;This file contains some command definitions for the FM/2 toolbar.
-;
-View Files (Ctrl + v)
-View
-1
-1023
-;
-Edit Files (Ctrl + e)
-Edit
-1
-1024
-;
-Object Information (Ctrl + i)
-Info
-1
-1010
-;
-Delete Files/Directories (Ctrl + d)
-Delete
-1
-1004
-;
-Set Attributes and Date/Time of Files/Directories (Ctrl + a)
-Attribs
-1
-1009
-;
-Copy Files/Directories (Ctrl + c)
-Copy
-1
-1002
-;
-Move Files/Directories (Ctrl + m)
-Move
-9
-1001
-;
-Archive Files/Directories (Ctrl + A)
-Archive
-1
-1029
-;
-Extract From Archives (Ctrl + x)
-Extract
-1
-1030
-;
-Collect Files/Directories (Ctrl + C)
-Collect
-0
-1011
-;
-Play Multimedia (Ctrl + l)
-Play
-9
-1058
-;
-Filter Container (Ctrl + f)
-Filter
-0
-5001
-;
-Window Dialog (Ctrl + W)
-Windws
-0
-9010
-;
-Settings Notebook
-Setngs
-0
-3059
-;
-FM/2 Help
-Help
-8
-999
-;
-Make Directory (Ctrl + M)
-MkDir
-0
-1026
-;
-Rescan (Ctrl + R)
-Rescan
-0
-5021
-;
-Print Files (Ctrl + p)
-Print
-9
-1007
-;
-Exit FM2 (Ctrl + F3)
-Exit
-8
-1111
-;
-Utility toolbar
-Utils
-0
-4901
-;
-Sort toolbar
-Sort
-0
-4902
-;
-Select toolbar
-Select
-0
-4903
-;
-Configuration toolbar
-Config
-0
-4904
-;
-Files toolbar
-Files
-8
-4905
-;
-;     $Id$
Index: trunk/commands.tmp
===================================================================
--- trunk/commands.tmp	(revision 1912)
+++ 	(revision )
@@ -1,67 +1,0 @@
-; FM/2 commands file -- 3 lines: title, cmd line, flags
-;
-Unlock exe or dll
-unlock -v %a
-4096
-;
-Test a Zip file
-unzip.exe -t %a
-12288
-;
-Test an Lzh file
-lh.exe t %a
-12288
-;
-Test an Arc file
-arc.exe t %a
-12288
-;
-Test an Arj file
-unarj.exe t %a
-12288
-;
-Test a Zoo file
-zoo.exe -test %a
-12288
-;
-Diskcopy A: -> B:
-diskcopy.exe a: b:
-4096
-;
-Diskcopy B: -> A:
-diskcopy.exe b: a:
-4096
-;
-Create disk image from A:
-savedskf.exe a: /N
-6144
-;
-Rename files to uppercase
-rencase.exe /u /#%!
-0
-;
-Rename files to lowercase
-rencase.exe /l /#%!
-0
-;
-Rename files to mixedcase
-rencase.exe /m /#%!
-0
-;
-View image file
-image.exe %a
-8192
-;
-Iconify image files
-iconify.exe /#%!
-0
-;
-Wipe (erase, expunge) files
-wipe.exe /a /y /#%!
-0
-;
-Zap all EAs of files (careful!)
-ea.exe /d /y /h /$ /v /#%!
-0
-;
-; $Id$
Index: trunk/config.tmp
===================================================================
--- trunk/config.tmp	(revision 1912)
+++ 	(revision )
@@ -1,132 +1,0 @@
-; Fixed: Ticket 267
-;
-;This file contains some utility definitions for the FM/2 toolbar.
-;FM/2 saved this file as "<DRIVE>:\FM2\CONFIG.TLS".
-;
-;Each tool button has four lines that describe it.  The first line is
-;the help for the button.
-;
-;The second line is the text for the button (internally defined tools
-;have icons, and the text is ignored).
-;
-;The third line is a number indicating flags associated with the button.
-;A flag value of 0 means the button is non-droppable, 1 means the button
-;is droppable, 4 means invisible (5 both), 8 means non-droppable with a
-;spacer following, and 9 means droppable with a spacer following.
-;
-;The fourth line is the ID of the button (for internal commands only).
-;Note Commands begin at ID 4000, so a button with ID 4000 would cause
-;the first Command to be run and ID 4001 would run the second, and so on.
-;4900 marks the first "quick toolbox change" item, and you can
-;have up to 50 of them (these buttons load other toolboxes, see
-;online help).
-;
-;You can use \r in the help string to break the help into multiple lines.
-;
-;
-Set Target Directory (Ctrl + T)
-TargetDir
-0
-1154
-;
-Filter Container (Ctrl + f)
-Filter
-0
-5001
-;
-Edit Associations
-Assoc
-0
-3001
-;
-Edit Commands
-Cmds
-8
-1048
-;
-Font Palette
-FntPal
-0
-3020
-;
-System Clock
-SysClk
-0
-2009
-;
-Solid Color Palette
-SolPal
-0
-3021
-;
-Hi Color Palette
-MixPal
-8
-3061
-;
-Seek and scan files
-SeekScan
-0
-1047
-;
-OS/2 Command Line (F9)
-OS/2
-8
-2007
-;
-Settings Notebook
-Setngs
-0
-3059
-;
-FM/2 Help (Ctrl + k)
-Help
-8
-999
-;
-Make Directory (Ctrl + M)
-MakeDir
-0
-1026
-;
-Rescan (Ctrl + R)
-Rescan
-0
-5021
-;
-Print Files (Ctrl + p)
-Print
-9
-1007
-;
-Exit FM2 (Ctrl + F3)
-Exit
-8
-1111
-;
-Commands toolbar
-Cmds
-0
-4900
-;
-Utility toolbar
-Utils
-0
-4901
-;
-Sort toolbar
-Sort
-0
-4902
-;
-Select toolbar
-Select
-0
-4903
-;
-Files toolbar
-Files
-8
-4905
-;
-; $Id$
Index: trunk/databar.c
===================================================================
--- trunk/databar.c	(revision 1912)
+++ 	(revision )
@@ -1,67 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  databar applet
-
-  Copyright (c) 1993-98 M. Kimes
-  Copyright (c) 2005, 2008 Steven H. Levine
-
-  15 Oct 02 SHL Baseline
-  07 Dec 05 SHL Avoid warnings
-  14 Dec 08 SHL Add exception handler support
-  14 Dec 08 SHL Drop NEVER used code
-
-***********************************************************************/
-
-#include <string.h>
-
-#define INCL_WIN
-#define INCL_LONGLONG
-#define INCL_DOSEXCEPTIONS		// XCTP_...
-#define INCL_DOSERRORS			// NO_ERROR
-
-#include "dll\fm3dll.h"
-#include "dll\notebook.h"		// appname
-#include "dll\datamin.h"
-#include "dll\fm3dlg.h"
-#include "dll\init.h"			// InitFM3DLL
-#include "dll\errutil.h"		// Error reporting
-#include "dll\excputil.h"		// Exception handlers
-
-static PSZ pszSrcFile = __FILE__;
-
-int main(int argc, char *argv[])
-{
-  HAB hab;
-  HMQ hmq;
-  QMSG qmsg;
-  APIRET regRet;
-  EXCEPTIONREGISTRATIONRECORD regRec = { NULL, NULL };
-
-  strcpy(appname, "DATABAR");
-
-  regRec.ExceptionHandler = HandleException;
-  regRet = DosSetExceptionHandler(&regRec);
-  if (regRet != NO_ERROR) {
-    DbgMsg(pszSrcFile, __LINE__,
-	   "DosSetExceptionHandler failed with error %u", regRet);
-  }
-
-  hab = WinInitialize(0);
-  if (hab) {
-    hmq = WinCreateMsgQueue(hab, 384);
-    if (hmq) {
-      if (InitFM3DLL(hab, argc, argv)) {
-	if (CreateDataBar(HWND_DESKTOP, 0)) {
-	  while (WinGetMsg(hab, &qmsg, (HWND) 0, 0, 0))
-	    WinDispatchMsg(hab, &qmsg);
-	}
-      }
-      WinDestroyMsgQueue(hmq);
-    }
-    WinTerminate(hab);
-  }
-  return 0;
-}
Index: trunk/databar.def
===================================================================
--- trunk/databar.def	(revision 1912)
+++ 	(revision )
@@ -1,10 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2009 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-
-option description '@#The Netlabs FM/2 team:3.25.0#@##1## 2024-06-02 03:25:00      ZOBOPEEP::EN:US:0:U:@@FM/2 Databar MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, 2024 Steven Levine and Associates, Inc. All rights reserved'
-
-#option stack = 65536 # 14 Dec 08 SHL
-option stack = 98304
Index: trunk/databar.mak
===================================================================
--- trunk/databar.mak	(revision 1912)
+++ 	(revision )
@@ -1,23 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2007 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-# 23 Feb 08 JBS Add support for building SYM files
-# 04 Jul 11 GKY Make xqs files an explicit target so they will be rebuild if lost somehow.
-
-BASE=databar
-
-!include makefile_pre.mk
-
-all: $(BASE).exe $(BASE).res .symbolic
-
-sym: $(BASE).sym $(BASE).xqs .symbolic
-
-$(BASE).res: $(BASE).rc dll\fm3dll.h icons\$(BASE).ico bitmaps\*.bmp
-
-$(BASE).obj: $(BASE).c
-
-!include makefile_post.mk
-
-# The end
Index: trunk/databar.rc
===================================================================
--- trunk/databar.rc	(revision 1912)
+++ 	(revision )
@@ -1,43 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  databar resources
-
-  Copyright (c) 1993-02 M. Kimes
-  Copyright (c) 2003, 2008 Steven H.Levine
-
-  15 Oct 02 MK - Baseline
-  04 Nov 03 SHL - Drop extra default icon
-  04 Jan 08 SHL - Sync with fm3dll.h mods
-
-***********************************************************************/
-
-#include "dll\fm3dll2.h"
-
-DEFAULTICON                 icons\DATABAR.ICO
-
-BITMAP 65534                bitmaps\EMPTY.BMP
-BITMAP DIR_FOLDERICON       bitmaps\PMAP.BMP
-BITMAP DIR_FRAME            bitmaps\FILE.BMP
-BITMAP IDM_DELETE           bitmaps\DELETE.BMP
-BITMAP IDM_EXTRACT          bitmaps\EXTRACT.BMP
-BITMAP IDM_PRINT            bitmaps\PRINT.BMP
-BITMAP IDM_TEST             bitmaps\TEST.BMP
-BITMAP IDM_VIRUSSCAN        bitmaps\VIRUS.BMP
-BITMAP IDM_EXEC             bitmaps\EXEC.BMP
-BITMAP IDM_VIEW             bitmaps\VIEW.BMP
-BITMAP IDM_PERMDELETE       bitmaps\PERMDEL.BMP
-BITMAP IDM_RESCAN           bitmaps\RESCAN.BMP
-BITMAP IDM_REFRESH          bitmaps\RESCAN.BMP
-BITMAP IDM_FILTER           bitmaps\FILTER.BMP
-BITMAP IDM_WALKDIR          bitmaps\WALK.BMP
-BITMAP IDM_GREP             bitmaps\GREP.BMP
-BITMAP IDM_SEEALL           bitmaps\SEEALL.BMP
-BITMAP IDM_FINDFIRST        bitmaps\FINDFRST.BMP
-BITMAP IDM_FINDNEXT         bitmaps\FINDNEXT.BMP
-BITMAP IDM_FINDPREV         bitmaps\FINDPREV.BMP
-BITMAP IDM_CLEARCNR         bitmaps\CLEARCNR.BMP
-BITMAP IDM_REMOVE           bitmaps\REMOVOBJ.BMP
-
Index: trunk/dirsize.c
===================================================================
--- trunk/dirsize.c	(revision 1912)
+++ 	(revision )
@@ -1,269 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  Directory sizes applet
-
-  Copyright (c) 1993-98 M. Kimes
-  Copyright (c) 2004, 2008 Steven H.Levine
-
-  11 Jun 02 SHL Baseline
-  06 Jan 04 SHL Total drives >4GB better
-  08 Jul 08 SHL Avoid WARNALL warning
-  14 Dec 08 SHL Add exception handler support
-  14 Dec 08 SHL Drop NEVER used code
-
-***********************************************************************/
-
-#include <string.h>
-#include <ctype.h>			// toupper
-
-#define INCL_DOS
-#define INCL_WIN
-#define INCL_DOSEXCEPTIONS		// XCTP_...
-#define INCL_DOSERRORS			// NO_ERROR
-
-#include "dll\fm3dll.h"
-#include "dll\fm3dll2.h"		// #define's for UM_*, control id's, etc.
-#include "dll\info.h"			// driveflags
-#include "dll\mainwnd.h"		// FM3ModHandle
-#include "dll\fm3dlg.h"
-#include "dll\valid.h"			// CheckDrive
-#include "dll\init.h"			// InitFM3DLL
-#include "dll\dirsize.h"		// DirSizeProc
-#include "dll\errutil.h"		// Error reporting
-#include "dll\excputil.h"		// Exception handlers
-
-static PSZ pszSrcFile = __FILE__;
-
-MRESULT EXPENTRY DirMainProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
-{
-  static CHAR curdir[4];
-
-  switch (msg) {
-  case WM_INITDLG:
-    *curdir = 0;
-    WinSendMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
-    break;
-
-  case UM_UNDO:
-    {
-      ULONG x;
-      ULONG ulDriveMap;
-      ULONG ulDriveNum;
-      CHAR dirname[] = " :\\";
-      BOOL first = TRUE;
-
-      WinSendDlgItemMsg(hwnd, DIRSIZE_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
-
-      DosError(FERR_DISABLEHARDERR);
-      DosQCurDisk(&ulDriveNum, &ulDriveMap);
-
-      for (x = 2; x < 26; x++) {
-	if ((ulDriveMap & (1L << x)) && !(driveflags[x] & DRIVE_IGNORE)) {
-	  *dirname = (CHAR) x + 'A';
-	  WinSendDlgItemMsg(hwnd, DIRSIZE_LISTBOX, LM_INSERTITEM,
-			    MPFROM2SHORT(LIT_END, 0), MPFROMP(dirname));
-	  if (first) {
-	    WinSendDlgItemMsg(hwnd, DIRSIZE_LISTBOX, LM_SELECTITEM,
-			      MPFROMSHORT(0), MPFROMSHORT(TRUE));
-	    first = FALSE;
-	  }
-	}
-      }
-    }
-    return 0;
-
-  case UM_RESCAN:
-    {
-      CHAR FileSystem[CCHMAXPATH];
-      CHAR s[CCHMAXPATH * 2];
-      FSALLOCATE fsa;
-      ULONG type;
-      USHORT percentused;
-      USHORT percentfree;
-      struct
-      {
-	ULONG serial;
-	CHAR volumelength;
-	CHAR volumelabel[CCHMAXPATH];
-      }
-      volser;
-      INT removable;
-
-      WinSetDlgItemText(hwnd, DIRSIZE_LABEL, "");
-      WinSetDlgItemText(hwnd, DIRSIZE_UNITSFREE, "");
-      WinSetDlgItemText(hwnd, DIRSIZE_UNITSUSED, "");
-      WinSetDlgItemText(hwnd, DIRSIZE_UNITSIZE, "");
-      WinSetDlgItemText(hwnd, DIRSIZE_PERCENT, "");
-      WinSetDlgItemText(hwnd, DIRSIZE_BYTESUSED, "");
-      WinSetDlgItemText(hwnd, DIRSIZE_BYTESFREE, "");
-      WinSetDlgItemText(hwnd, DIRSIZE_IFS, "");
-      WinSetDlgItemText(hwnd, DIRSIZE_LOCAL, "");
-      WinSendDlgItemMsg(hwnd, DIRSIZE_SLIDER, SLM_SETSLIDERINFO,
-			MPFROM2SHORT(SMA_SLIDERARMPOSITION,
-				     SMA_INCREMENTVALUE), MPFROMSHORT(0));
-      removable = CheckDrive(toupper(*curdir), FileSystem, &type);
-      if (removable != -1) {
-	if (type & DRIVE_ZIPSTREAM)
-	  WinSetDlgItemText(hwnd, DIRSIZE_LOCAL, "Zipstream drive");
-	else if (type & DRIVE_REMOTE)
-	  WinSetDlgItemText(hwnd, DIRSIZE_LOCAL, "Remote drive");
-	else if (type & DRIVE_VIRTUAL)
-	    WinSetDlgItemText(hwnd, DIRSIZE_LOCAL, "Virtual drive");
-	else if (type & DRIVE_RAMDISK)
-	  WinSetDlgItemText(hwnd, DIRSIZE_LOCAL, "Ramdisk");
-	else {
-	  sprintf(s, "Local drive%s", (removable) ? " (removable)" : "");
-	  WinSetDlgItemText(hwnd, DIRSIZE_LOCAL, s);
-	}
-	sprintf(s, "IFS:  %s", FileSystem);
-	WinSetDlgItemText(hwnd, DIRSIZE_IFS, s);
-	memset(&volser, 0, sizeof(volser));
-	DosError(FERR_DISABLEHARDERR);
-	if (!DosQueryFSInfo(toupper(*curdir) - '@', FSIL_VOLSER,
-			    &volser, (ULONG) sizeof(volser))) {
-	  sprintf(s, "Label:  %s", volser.volumelabel);
-	  WinSetDlgItemText(hwnd, DIRSIZE_LABEL, s);
-	}
-	if (!DosQueryFSInfo(toupper(*curdir) - '@',
-			    FSIL_ALLOC, &fsa, sizeof(FSALLOCATE))) {
-	  percentfree = fsa.cUnit ? (USHORT)((fsa.cUnitAvail * 100) / fsa.cUnit) : 0;	// 27 May 08 SHL
-	  if (!percentfree && fsa.cUnitAvail)
-	    percentfree = 1;
-	  percentused = 100 - percentfree;
-	  sprintf(s, "Units free:  %lu", fsa.cUnitAvail);
-	  WinSetDlgItemText(hwnd, DIRSIZE_UNITSFREE, s);
-	  sprintf(s, "Unit size:  %lu x %u = %lu",
-		  fsa.cSectorUnit,
-		  fsa.cbSector, fsa.cSectorUnit * fsa.cbSector);
-	  WinSetDlgItemText(hwnd, DIRSIZE_UNITSIZE, s);
-	  sprintf(s, "Units used:  %lu", fsa.cUnit - fsa.cUnitAvail);
-	  WinSetDlgItemText(hwnd, DIRSIZE_UNITSUSED, s);
-	  sprintf(s, "Bytes free:  %.0f",
-		  (float)fsa.cUnitAvail * (fsa.cSectorUnit * fsa.cbSector));
-	  WinSetDlgItemText(hwnd, DIRSIZE_BYTESFREE, s);
-	  sprintf(s, "Bytes used:  %.0f",
-		  (float)(fsa.cUnit - fsa.cUnitAvail) *
-		  (fsa.cSectorUnit * fsa.cbSector));
-	  WinSetDlgItemText(hwnd, DIRSIZE_BYTESUSED, s);
-	  sprintf(s, "Percent used:  %u%%", percentused);
-	  WinSetDlgItemText(hwnd, DIRSIZE_PERCENT, s);
-	  WinSendDlgItemMsg(hwnd, DIRSIZE_SLIDER, SLM_SETSLIDERINFO,
-			    MPFROM2SHORT(SMA_SLIDERARMPOSITION,
-					 SMA_INCREMENTVALUE),
-			    MPFROMSHORT(percentused));
-	  WinShowWindow(WinWindowFromID(hwnd, DIRSIZE_SLIDER), TRUE);
-	}
-      }
-      else {
-	WinSetDlgItemText(hwnd, DIRSIZE_LOCAL, "Drive not ready.");
-	WinShowWindow(WinWindowFromID(hwnd, DIRSIZE_SLIDER), FALSE);
-      }
-    }
-    return 0;
-
-  case WM_CONTROL:
-    switch (SHORT1FROMMP(mp1)) {
-    case DIRSIZE_LISTBOX:
-      switch (SHORT2FROMMP(mp1)) {
-      case LN_ENTER:
-	WinPostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
-	break;
-      case LN_SELECT:
-	{
-	  SHORT x;
-
-	  x = (SHORT) WinSendDlgItemMsg(hwnd, DIRSIZE_LISTBOX,
-					LM_QUERYSELECTION,
-					MPFROMSHORT(LIT_FIRST), MPVOID);
-	  if (x >= 0) {
-	    WinSendDlgItemMsg(hwnd, DIRSIZE_LISTBOX,
-			      LM_QUERYITEMTEXT,
-			      MPFROM2SHORT(x, sizeof(curdir)),
-			      MPFROMP(curdir));
-	    WinPostMsg(hwnd, UM_RESCAN, MPVOID, MPVOID);
-	  }
-	}
-	break;
-      }
-      break;
-    }
-    return 0;
-
-  case WM_COMMAND:
-    switch (SHORT1FROMMP(mp1)) {
-    case DID_CANCEL:
-      WinDismissDlg(hwnd, 0);
-      break;
-
-    case DID_OK:
-      if (*curdir) {
-	WinSetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_HIDE);
-	WinDlgBox(HWND_DESKTOP, hwnd,
-		  DirSizeProc, FM3ModHandle, DSZ_FRAME, curdir);
-	WinSetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_SHOW);
-      }
-      else
-	DosBeep(50, 100);
-      break;
-    }
-    return 0;
-  } // switch
-  return WinDefDlgProc(hwnd, msg, mp1, mp2);
-}
-
-int main(int argc, char *argv[])
-{
-  HAB hab;
-  HMQ hmq;
-  CHAR fullname[CCHMAXPATH] = { 0 };	// 14 Dec 08 SHL was static
-  UINT x;
-  ULONG rcl;
-  APIRET regRet;
-  EXCEPTIONREGISTRATIONRECORD regRec = { NULL, NULL };
-
-  DosError(FERR_DISABLEHARDERR);
-
-  regRec.ExceptionHandler = HandleException;
-  regRet = DosSetExceptionHandler(&regRec);
-  if (regRet != NO_ERROR) {
-    DbgMsg(pszSrcFile, __LINE__,
-	   "DosSetExceptionHandler failed with error %u", regRet);
-  }
-
-  for (x = 1; x < argc; x++) {
-    if (!strchr("/;,`\'", *argv[x]) &&
-	!*fullname && (IsRoot(argv[x]) || IsFile(argv[x]) == 0)) {
-      if (IsRoot(argv[x]))
-	strcpy(fullname, argv[x]);
-      else if (DosQueryPathInfo(argv[x],
-				FIL_QUERYFULLNAME,
-				fullname, sizeof(fullname)))
-	*fullname = 0;			// Forget name
-    }
-  }
-
-  hab = WinInitialize(0);
-  if (hab) {
-    hmq = WinCreateMsgQueue(hab, 384);
-    if (hmq) {
-      if (InitFM3DLL(hab, argc, argv)) {
-	if (!*fullname)
-	  rcl = WinDlgBox(HWND_DESKTOP,
-			  HWND_DESKTOP, DirMainProc, 0, DIRSIZE_FRAME, NULL);
-	else
-	  rcl = WinDlgBox(HWND_DESKTOP,
-			  HWND_DESKTOP,
-			  DirSizeProc, FM3ModHandle, DSZ_FRAME, fullname);
-	if (rcl == DID_ERROR)
-	  rcl = WinGetLastError(hab);
-      }
-      WinDestroyMsgQueue(hmq);
-    }
-    WinTerminate(hab);
-  }
-  return 0;
-
-} // main
Index: trunk/dirsize.def
===================================================================
--- trunk/dirsize.def	(revision 1912)
+++ 	(revision )
@@ -1,9 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2009 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-
-option description '@#The Netlabs FM/2 team:3.25.0#@##1## 2024-06-02 03:25:00      ZOBOPEEP::EN:US:0:U:@@FM/2 Directory Sizes MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, 2024 Steven Levine and Associates, Inc. All rights reserved'
-
-option stack = 0x50000
Index: trunk/dirsize.dlg
===================================================================
--- trunk/dirsize.dlg	(revision 1912)
+++ 	(revision )
@@ -1,55 +1,0 @@
-/***********************************************************************
-
-  $Id$
-
-  Dialog templates
-
-  Copyright (c) 1993-98 M. Kimes
-  Copyright (c) 2003, 2007 Steven H. Levine
-
-  07 Jan 07 GKY Updated Helv font to vector font Helvetica
-  28 Feb 07 GKY Move fonts to string file
-
-***********************************************************************/
-
-#include "dll\dirsize.h"
-
-DLGTEMPLATE DIRSIZE_FRAME LOADONCALL MOVEABLE DISCARDABLE
-BEGIN
-    DIALOG  "FM/2:  Directory sizes", DIRSIZE_FRAME, 12, 6, 254, 128,
-            WS_VISIBLE, FCF_TITLEBAR
-    BEGIN
-        GROUPBOX        "", -1, 34, 28, 57, 82, NOT WS_GROUP
-        CTEXT           "Select a drive to display size information on, then"
-                        " click Show.", -1, 38, 34, 49, 65, DT_WORDBREAK |
-                        NOT WS_GROUP
-                        // PRESPARAMS PP_FONTNAMESIZE, "8.Helvetica"
-        LISTBOX         DIRSIZE_LISTBOX, 2, 2, 30, 124, WS_GROUP
-                        PRESPARAMS PP_FONTNAMESIZE, "10.System Monospaced"
-        DEFPUSHBUTTON   "Show", DID_OK, 44, 110, 40, 14, BS_NOPOINTERFOCUS |
-                        WS_GROUP
-        PUSHBUTTON      "Close", DID_CANCEL, 44, 2, 40, 14,
-                        BS_NOPOINTERFOCUS
-        LTEXT           "Label:", DIRSIZE_LABEL, 96, 114, 152, 8, DT_VCENTER
-        LTEXT           "Unit size:", DIRSIZE_UNITSIZE, 96, 102, 152, 8,
-                        DT_VCENTER
-        LTEXT           "Units free:", DIRSIZE_UNITSFREE, 96, 90, 152, 8,
-                        DT_VCENTER
-        LTEXT           "Units used:", DIRSIZE_UNITSUSED, 96, 78, 152, 8,
-                        DT_VCENTER
-        LTEXT           "Bytes free:", DIRSIZE_BYTESFREE, 96, 66, 152, 8,
-                        DT_VCENTER
-        LTEXT           "Bytes used:", DIRSIZE_BYTESUSED, 96, 54, 152, 8,
-                        DT_VCENTER
-        LTEXT           "Local drive", DIRSIZE_LOCAL, 96, 42, 152, 8,
-                        DT_VCENTER
-        LTEXT           "IFS:", DIRSIZE_IFS, 96, 30, 152, 8, DT_VCENTER
-        LTEXT           "Percent used:", DIRSIZE_PERCENT, 96, 18, 152, 8,
-                        DT_VCENTER
-        CONTROL         "", DIRSIZE_SLIDER, 96, 2, 152, 14, WC_SLIDER,
-                        SLS_HORIZONTAL | SLS_CENTER | SLS_READONLY |
-                        SLS_RIBBONSTRIP | SLS_HOMELEFT | SLS_PRIMARYSCALE1 |
-                        WS_GROUP | WS_TABSTOP | WS_VISIBLE
-                        CTLDATA 12, 0, 101, 0, 0, 0
-    END
-END
Index: trunk/dirsize.mak
===================================================================
--- trunk/dirsize.mak	(revision 1912)
+++ 	(revision )
@@ -1,23 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2007 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-# 23 Feb 08 JBS Add support for building SYM files
-# 04 Jul 11 GKY Make xqs files an explicit target so they will be rebuild if lost somehow.
-
-BASE=dirsize
-
-!include makefile_pre.mk
-
-all: $(BASE).exe $(BASE).res .symbolic
-
-sym: $(BASE).sym $(BASE).xqs .symbolic
-
-$(BASE).res: dll\dirsize.h dll\fm3dll.h $(BASE).rc $(BASE).dlg
-
-$(BASE).obj: $(BASE).c
-
-!include makefile_post.mk
-
-# The end
Index: trunk/dirsize.rc
===================================================================
--- trunk/dirsize.rc	(revision 1912)
+++ 	(revision )
@@ -1,35 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  dirsize resources
-
-  Copyright (c) 1993-02 M. Kimes
-  Copyright (c) 2003, 2008 Steven H.Levine
-
-  15 Oct 02 MK Baseline
-  04 Jan 08 SHL Sync with fm3dll.h mods
-
-***********************************************************************/
-
-#include "dll\fm3dll.h"
-#include "dll\fm3dll2.h"
-
-DEFAULTICON                 icons\DIRSIZE.ICO
-
-RCINCLUDE dirsize.dlg
-
-BITMAP  MAIN_TRASHCAN       bitmaps\TRASH.BMP
-
-BITMAP DIR_FRAME            bitmaps\FILE.BMP
-BITMAP DIR_FOLDERICON       bitmaps\PMAP.BMP
-BITMAP 65534                bitmaps\EMPTY.BMP
-BITMAP IDM_DELETE           bitmaps\DELETE.BMP
-BITMAP IDM_EXTRACT          bitmaps\EXTRACT.BMP
-BITMAP IDM_PRINT            bitmaps\PRINT.BMP
-BITMAP IDM_PERMDELETE       bitmaps\PERMDEL.BMP
-BITMAP IDM_FINDFIRST        bitmaps\FINDFRST.BMP
-BITMAP IDM_FINDNEXT         bitmaps\FINDNEXT.BMP
-BITMAP IDM_FINDPREV         bitmaps\FINDPREV.BMP
-
Index: trunk/eas.c
===================================================================
--- trunk/eas.c	(revision 1912)
+++ 	(revision )
@@ -1,103 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  EA viewer applet
-
-  Copyright (c) 1993-98 M. Kimes
-  Copyright (c) 2002, 2008 Steven H.Levine
-
-  16 Oct 02 SHL Reformat
-  08 Feb 03 SHL Free list with free() since we don't
-		allocate list contents
-  08 Apr 07 SHL Minor reformat
-  10 May 08 SHL Correct compare typo
-  14 Dec 08 SHL Add exception handler support
-
-***********************************************************************/
-
-#include <string.h>
-
-#define INCL_DOS
-#define INCL_WIN
-#define INCL_DOSEXCEPTIONS		// XCTP_...
-#define INCL_DOSERRORS			// NO_ERROR
-
-#include "dll\fm3dll.h"
-#include "dll\mainwnd.h"		// FM3ModHandle
-#include "dll\fm3dlg.h"
-#include "dll\makelist.h"		// AddToList
-#include "dll\eas.h"			// DisplayEAsProc
-#include "dll\init.h"			// InitFM3DLL
-#include "dll\valid.h"			// IsFile
-#include "dll\wrappers.h"		// xfree
-#include "dll\getnames.h"		// insert_filename
-#include "dll\errutil.h"		// Error reporting
-#include "dll\excputil.h"		// Exception handlers
-
-static PSZ pszSrcFile = __FILE__;
-
-int main (int argc,char *argv[])
-{
-  HAB hab;
-  HMQ hmq;
-  CHAR fullname[CCHMAXPATH];
-  CHAR **list = NULL;
-  UINT x;
-  UINT numfiles = 0;
-  UINT numalloc = 0;
-  APIRET regRet;
-  EXCEPTIONREGISTRATIONRECORD regRec = { NULL, NULL };
-
-  DosError(FERR_DISABLEHARDERR);
-
-  regRec.ExceptionHandler = HandleException;
-  regRet = DosSetExceptionHandler(&regRec);
-  if (regRet != NO_ERROR) {
-    DbgMsg(pszSrcFile, __LINE__,
-	   "DosSetExceptionHandler failed with error %u", regRet);
-  }
-
-  for(x = 1; x < argc; x++) {
-    if (!strchr("/;,`\'",*argv[x]) && IsFile(argv[x]) != -1) {
-      if (DosQueryPathInfo(argv[x],
-			   FIL_QUERYFULLNAME,fullname,
-			   sizeof(fullname)))
-	strcpy(fullname, argv[x]);
-      AddToList(fullname,&list,&numfiles,&numalloc);
-    }
-  }
-
-  hab = WinInitialize(0);
-  if (hab) {
-    hmq = WinCreateMsgQueue(hab,384);
-    if (hmq) {
-      if (InitFM3DLL(hab,argc,argv)) {
-	if (!list) {
-	  strcpy(fullname, "*");
-	  list = xmalloc(sizeof(CHAR *) * 2, pszSrcFile, __LINE__);
-	  if (list &&
-	      insert_filename(HWND_DESKTOP,fullname,TRUE,FALSE) &&
-	      *fullname && *fullname != '*') {
-	   list[0] = fullname;
-	   list[1] = NULL;
-	  }
-	}
-	if (list) {
-	  WinDlgBox(HWND_DESKTOP,
-		    HWND_DESKTOP,
-		    DisplayEAsProc,
-		    FM3ModHandle,
-		    EA_FRAME,
-		    (PVOID)list);
-	}
-      }
-      WinDestroyMsgQueue(hmq);
-    }
-    WinTerminate(hab);
-  }
-  xfree(list, pszSrcFile, __LINE__);
-  return 0;
-}
-
Index: trunk/eas.def
===================================================================
--- trunk/eas.def	(revision 1912)
+++ 	(revision )
@@ -1,9 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2009 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-
-option description '@#The Netlabs FM/2 team:3.25.0#@##1## 2024-06-02 03:25:00      ZOBOPEEP::EN:US:0:U:@@FM/2 EA Editor MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, 2024 Steven Levine and Associates, Inc. All rights reserved'
-
-option stack = 0x50000
Index: trunk/eas.mak
===================================================================
--- trunk/eas.mak	(revision 1912)
+++ 	(revision )
@@ -1,25 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2012 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-# 23 Feb 08 JBS Add support for building SYM files
-# 04 Jul 11 GKY Make xqs files an explicit target so they will be rebuild if lost somehow.
-# 25 Jan 12 SHL Renamae LOW -> NOHIGHMEM
-
-BASE=eas
-NOHIGHMEM=1     # Avoid system traps
-
-!include makefile_pre.mk
-
-all: $(BASE).exe $(BASE).res .symbolic
-
-sym: $(BASE).sym $(BASE).xqs .symbolic
-
-$(BASE).res: $(BASE).rc dll\fm3dll.h icons\$(BASE).ico bitmaps\*.bmp
-
-$(BASE).obj: $(BASE).c
-
-!include makefile_post.mk
-
-# The end
Index: trunk/eas.rc
===================================================================
--- trunk/eas.rc	(revision 1912)
+++ 	(revision )
@@ -1,31 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  eas resources
-
-  Copyright (c) 1993-02 M. Kimes
-  Copyright (c) 2003, 2008 Steven H.Levine
-
-  15 Oct 02 MK Baseline
-  04 Nov 03 SHL Drop extra default icon
-  04 Jan 08 SHL Sync with fm3dll.h mods
-
-***********************************************************************/
-
-#include "dll\fm3dll2.h"
-
-DEFAULTICON                 icons\EAS.ICO
-
-BITMAP DIR_FOLDERICON       bitmaps\PMAP.BMP
-BITMAP DIR_FRAME            bitmaps\FILE.BMP
-BITMAP 65534                bitmaps\EMPTY.BMP
-BITMAP IDM_DELETE           bitmaps\DELETE.BMP
-BITMAP IDM_EXTRACT          bitmaps\EXTRACT.BMP
-BITMAP IDM_PRINT            bitmaps\PRINT.BMP
-BITMAP IDM_PERMDELETE       bitmaps\PERMDEL.BMP
-BITMAP IDM_FINDFIRST        bitmaps\FINDFRST.BMP
-BITMAP IDM_FINDNEXT         bitmaps\FINDNEXT.BMP
-BITMAP IDM_FINDPREV         bitmaps\FINDPREV.BMP
-
Index: trunk/example.tmp
===================================================================
--- trunk/example.tmp	(revision 1912)
+++ 	(revision )
@@ -1,89 +1,0 @@
-/************************************************************************
- * Example of how a rexx file can operate on a list file created by     *
- * FM/2 (the list file should contain filenames only, one per line).    *
- *                                                                      *
- * This example can be editted at the boxed comment area below and      *
- * used with FM/2 Commands containing the %! metastring.                *
- *                                                                      *
- * Call as "%c /C <drive:\path\>EXAMPLE.CMD %!" (exclude quotes)        *
- *  (for example:  %c /C e:\fm2\EXAMPLES.CMD %!)                        *
- ************************************************************************/
-
-/* suppress echo from "batch" commands */
-'@Echo off'
-/* clear screen (GPs). */
-'@cls'
-
-/* get name of listfile from command line. */
-parse arg listfile
-
-/* if no listfile name was given, issue help and exit. */
-if listfile = '' then
-do
-  say 'Give the name of a listfile as an argument to this REXX script.'
-  exit
-end
-
-/* for debugging purposes: */
-say 'Name of our listfile is "'listfile'".'
-
-/* see if the listfile given exists -- exit with error message if not */
-rc = stream(listfile,'C','QUERY EXISTS')
-if rc = '' then
-do
-  say 'File "'listfile'" doesn''t exist.'
-  exit
-end
-
-/* attempt to open the listfile given on the command line */
-rc = stream(listfile,'C','OPEN')
-
-/* if open was successful, enter loop */
-if rc = 'READY:' then
-do
-  counter = 0     /* initialize counter (debugging aid) */
-
-  /* read each line of the listfile into filename */
-  do while lines(listfile) = 1
-    filename = linein(listfile)
-
-    /* remove any leading/trailing blanks */
-    filename = strip(filename,'b')
-
-    /* process only non-blank strings */
-    if filename \= '' then
-    do
-    /*************************************************************
-     * here you would do something to/with the file in filename. *
-     * since this is only an example, we'll just print the name. *
-     * note that you could do most anything to the file here --  *
-     * use your imagination.                                     *
-     *************************************************************/
-
-      say filename  /* replace with your command(s)! */
-
-    /*************************************************************
-     * end of area where you'd do your special processing.       *
-     *************************************************************/
-      counter = counter + 1 /* count files processed for debugging. */
-    end
-  end
-
-  /* close the listfile. */
-  rc = stream(listfile,'C','CLOSE')
-
-  /* remove the listfile -- checks to disallow wildcards in name (GPs). */
-  if (pos('*',listfile) = 0) & (pos('?',listfile) = 0) then
-  do
-    'del "'listfile'" 1>NUL 2>NUL'
-  end
-
-end
-else /* couldn't open listfile */
-do
-  say 'Error opening "'listfile'".'
-  exit
-end
-
-/* we're done -- issue count for debugging. */
-say '  **I processed 'counter' objects.'
Index: trunk/fatopt.tmp
===================================================================
--- trunk/fatopt.tmp	(revision 1912)
+++ 	(revision )
@@ -1,34 +1,0 @@
-@echo off
-rem
-rem first run chkdsk/f to make sure the drive's clean
-rem
-
-CHKDSK %1 /F
-
-rem
-rem suggestions:
-rem
-rem -i for idle priority (not with DOS programs running)
-rem -o for "optimize without asking"
-rem -p in low memory situations
-rem
-rem since fatopt returns the percentage of fragmented files when run in
-rem report-only mode (-r), you could set this command file up to only
-rem run to optimize when a report run indicated that fragmentation was
-rem above a certain percentage...
-rem
-
-rem
-rem This notice is just so users know what's going on and can change it...
-rem
-ECHO This is FATOPT.CMD, which you can customize to use any FAT optimizing
-ECHO program you like.
-
-FATOPT.EXE %1
-
-rem
-rem if there's an error or user abort, pause the display so the user
-rem can see what's happened.
-rem
-
-IF ERRORLEVEL == 1 PAUSE
Index: trunk/file_id.diz
===================================================================
--- trunk/file_id.diz	(revision 1912)
+++ 	(revision )
@@ -1,38 +1,0 @@
-FM/2 v3.25.0 built with OpenWatcom
-An OS/2 Warp+ PM 32-bit
-file/directory/disk/archive/etc.
-maintenance package with plenty of
-bells and whistles -- a Swiss army
-knife for OS/2.  Only file management
-winner of a 1995 OS/2 Magazine
-Editor's Choice award.  Winner of
-OS/2 e-Zine!'s 1996 Readers' Choice
-Award for "Best Disk/File Utility or
-Suite."
-
-Copy and move files (even with rename
-and wildcards), merge, delete,
-UUdecode, create objects, compare
-directories, find duplicates, search
-for files by wildcards containing text
-in file or EAs, edit file or EAs,
-autoview file or comments, view all
-files in a directory tree or on one or
-more drives in one window, etc.
-Utilities like process killer,
-undelete interface, etc.  Access parts
-of FM/2 without loading the whole
-thing.
-
-Drag and drop, pulldown and context
-menus, accelerator keys, optional
-editable toolbar -- pick your
-interface.  Detailed online help
-including tutorials, diagrams of main
-windows, etc.
-
-Freeware.
-License agreement is in README along
-with easy installation instructions.
-
-$Id$
Index: trunk/files.tmp
===================================================================
--- trunk/files.tmp	(revision 1912)
+++ 	(revision )
@@ -1,187 +1,0 @@
-; Fixed: Ticket 267
-;
-;This file contains definitions for an FM/2 toolbox.
-;FM/2 saved this file as "<DRIVE>:\FM2\FILES.TLS"
-;
-;Each tool button has four lines that describe it.  The first line is
-;the help for the button.
-;
-;The second line is the text for the button (internally defined tools
-;have icons, and the text is ignored).
-;
-;The third line is a number indicating flags associated with the button.
-;A flag value of 0 means the button is non-droppable, 1 means the button
-;is droppable, 4 means invisible (5 both), 8 means non-droppable with a
-;spacer following, and 9 means droppable with a spacer following.
-;
-;The fourth line is the ID of the button (for internal commands only).
-;Note Commands begin at ID 4000, so a button with ID 4000 would cause
-;the first Command to be run and ID 4001 would run the second, and so on.
-;4900 marks the first "quick toolbox change" item, and you can
-;have up to 50 of them (these buttons load other toolboxes, see
-;online help).
-;
-;You can use \r in the help string to break the help into multiple lines.
-;;
-;
-Rename Files/Directories (Ctrl + r)
-Rename
-1
-1005
-;
-Copy Files/Directories (Ctrl + c)
-Copy
-1
-1002
-;
-WPS Copy Files/Directories
-WPSCopy
-1
-1153
-;
-Move Files/Directories (Ctrl + m)
-Move
-1
-1001
-;
-WPS Move Files/Directories
-WPSMove
-1
-1152
-;
-View Files (Ctrl + v)
-View
-1
-1023
-;
-Edit Files (Ctrl + e)
-Edit
-1
-1024
-;
-Extended Attributes (Ctrl + E)
-EAs
-1
-1008
-;
-Open Default (F6)
-Open
-1
-1017
-;
-Set Attributes and Date/Time of Files/Directories (Ctrl + a)
-Attribs
-9
-1009
-;
-Create Objects
-Objects
-1
-1022
-;
-Remove objects
-RemoveObj
-1
-1043
-;
-Object Information (Ctrl + i)
-Info
-1
-1010
-;
-Create Shadow Objects
-Shadows
-9
-1021
-;
-Save List to Clipboard (Ctrl + [)
-SvClip
-1
-1027
-;
-Save List to File (Ctrl + S)
-SvList
-8
-1028
-;
-Archive Files/Directories (Ctrl + A)
-Archive
-1
-1029
-;
-Extract From Archives (Ctrl + x)
-Extract
-1
-1030
-;
-Text to binary decoding (Ctrl + U)
-UUDecode
-9
-1132
-;
-Permanently Delete Files/Directories (Ctrl + D)
-Kill
-0
-1006
-;
-Delete Files/Directories (Ctrl + d)
-Delete
-1
-1004
-;
-Undelete Files
-Undel
-8
-2004
-;
-Seek and scan files
-SeekScan
-8
-1047
-;
-Make Directory (Ctrl + M)
-MakeDir
-0
-1026
-;
-Rescan (Ctrl + R)
-Rescan
-0
-5021
-;
-Print Files (Ctrl + p)
-Print
-9
-1007
-;
-Exit FM2 (Ctrl + F3)
-Exit
-8
-1111
-;
-Commands toolbar
-Cmds
-0
-4900
-;
-Utility toolbar
-Utils
-0
-4901
-;
-Sort toolbar
-Sort
-0
-4902
-;
-Select toolbar
-Select
-0
-4903
-;
-Configuration toolbar
-Config
-8
-4904
-;
-; $Id$
Index: trunk/filters.tmp
===================================================================
--- trunk/filters.tmp	(revision 1912)
+++ 	(revision )
@@ -1,7 +1,0 @@
-; FM/2 filter mask file, one mask set per line
-*
-*.zip;*.lzh;*.arc;*.arj;*.zoo;
-*.c;*.h;*.def;*.rc;*.dlg
-*.exe;*.com;*.cmd;*.bat
-*.old;*.bak
-*.log
Index: trunk/fm3.c
===================================================================
--- trunk/fm3.c	(revision 1912)
+++ 	(revision )
@@ -1,123 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  fm/2 starter
-
-  Copyright (c) 1993-98 M. Kimes
-  Copyright (c) 2008, 2015 Steven H.Levine
-
-  05 Jan 08 SHL Sync
-  18 Jul 08 SHL Add Fortify support
-  11 Dec 08 SHL Add exception handler support
-  08 Aug 15 SHL Comments
-
-***********************************************************************/
-
-#include <string.h>
-
-#define INCL_DOS
-#define INCL_WIN
-#define INCL_LONGLONG
-#define INCL_DOSEXCEPTIONS		// XCTP_...
-#define INCL_DOSERRORS			// NO_ERROR
-
-#include "dll\fm3dll.h"
-#include "dll\mainwnd.h"		// hwndBubble
-#include "dll\version.h"		// VER...
-#include "dll\init.h"			// StartFM3
-#include "dll\notebook.h"		// appname
-#include "dll\fortify.h"
-#include "dll\errutil.h"		// Error reporting
-#include "dll\excputil.h"		// Exception handlers
-
-static PSZ pszSrcFile = __FILE__;
-
-int main(int argc, char *argv[])
-{
-  HAB hab;
-  HMQ hmq;
-  QMSG qmsg;
-  HWND hwndFrame;
-  APIRET regRet;
-  EXCEPTIONREGISTRATIONRECORD regRec = { NULL, NULL };
-
-  strcpy(appname, "FM/3");
-  DosError(FERR_DISABLEHARDERR);
-
-  regRec.ExceptionHandler = HandleException;
-  regRet = DosSetExceptionHandler(&regRec);
-  if (regRet != NO_ERROR) {
-#if 0 // 10 Dec 08 SHL fixme to report later maybe?
-    Dos_Error(MB_ENTER, regRet, HWND_DESKTOP, pszSrcFile, __LINE__,
-	      "DosSetExceptionHandler");
-#endif
-    DbgMsg(pszSrcFile, __LINE__,
-	   "DosSetExceptionHandler failed with error %u", regRet);
-  }
-
-  hab = WinInitialize(0);
-  if (hab) {
-    hmq = WinCreateMsgQueue(hab, 2048);
-    if (hmq) {
-      if (InitFM3DLL(hab, argc, argv)) {
-	if (CheckVersion(VERMAJOR, VERMINOR)) {
-#	  ifdef FORTIFY
-	  Fortify_EnterScope();
-#	  endif
-	  hwndFrame = StartFM3(hab, argc, argv);
-	  if (hwndFrame != (HWND)0) {
-	    for (;;) {
-	      if (!WinGetMsg(hab, &qmsg, (HWND) 0, 0, 0)) {
-		// Get WM_QUIT
-		if (!qmsg.hwnd)
-		  break;		// Time to die if no window
-		// Map quit to close
-		// Must use System Menu or Ctrl-Alt-F4 accel to shutdown
-		qmsg.msg = WM_CLOSE;
-	      }
-	      if (hwndBubble &&
-		  ((qmsg.msg > WM_BUTTON1DOWN - 1 &&
-		    qmsg.msg < WM_BUTTON3DBLCLK + 1) ||
-		   (qmsg.msg > WM_CHORD - 1 &&
-		    qmsg.msg < WM_BUTTON3CLICK + 1)) &&
-		  WinIsWindowVisible(hwndBubble))
-	      {
-		WinShowWindow(hwndBubble, FALSE);	// Hide
-	      }
-	      WinDispatchMsg(hab, &qmsg);
-	    } // for
-	    // Time to die
-	    if (WinIsWindow(hab, WinWindowFromID(hwndFrame, FID_CLIENT)))
-	      WinSendMsg(WinWindowFromID(hwndFrame, FID_CLIENT), WM_CLOSE,
-			 MPVOID, MPVOID);
-	  }
-#	  ifdef FORTIFY
-	  for (;;) {
-	    UCHAR scope = Fortify_LeaveScope();
-	    if ((CHAR)scope == 0)
-	      break;
-	    Runtime_Error(__FILE__, __LINE__, "Attempting to exit thread with scope non-zero (%u)", scope);
-	    if ((CHAR)scope < 0)
-	      break;
-	  }
-	  Fortify_DumpAllMemory();
-#	  endif
-	}
-      }
-      DosSleep(250L);
-      WinDestroyMsgQueue(hmq);
-    }
-    WinTerminate(hab);
-  }
-
-  if (regRet == NO_ERROR) {
-    regRet = DosUnsetExceptionHandler(&regRec);
-    if (regRet != NO_ERROR) {
-      DbgMsg(pszSrcFile, __LINE__,
-	     "DosUnsetExceptionHandler failed with error %u", regRet);
-    }
-  }
-  return 0;
-}
Index: trunk/fm3.def
===================================================================
--- trunk/fm3.def	(revision 1912)
+++ 	(revision )
@@ -1,9 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2009 Steven H. Levine
-
-# 14 Jun 07 SHL Convert to OpenWatcom
-
-option description '@#The Netlabs FM/2 team:3.25.0#@##1## 2024-06-02 03:25:00      ZOBOPEEP::EN:US:0:U:@@F(ile) M(anager)/2 Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, 2024 Steven Levine and Associates, Inc. All rights reserved'
-
-option stack = 655360
Index: trunk/fm3.rc
===================================================================
--- trunk/fm3.rc	(revision 1912)
+++ 	(revision )
@@ -1,153 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  fm3 resources (fm/2 standard)
-
-  Copyright (c) 1993-98 M. Kimes
-  Copyright (c) 2005, 2008 Steven H. Levine
-
-  09 Aug 05 SHL Drop dup icon
-  21 Aug 06 SHL Add select and sort toolbar bitmaps
-  01 Sep 06 SHL Add more select and sort toolbar bitmaps
-  03 Sep 06 SHL Add more select and sort toolbar bitmaps from David
-  17 Feb 07 GKY Add more drive type bitmaps from David
-  16 Aug 07 SHL Document AUTHOR_PICTURE
-  04 Jan 08 SHL Sync with fm3dll.h mods
-  29 Aug 08 GKY Add bmps from David for the 7 predefined toolbars 
-  22 Jul 09 GKY Drivebar enhancements add refresh removable, rescan all drives, drive button
-                loads drive root directory in directory container or expands drive tree
-                and rescans drive in tree container depending on container focus, greyed out
-                inappropriate menu context choices
-  04 Aug 12 GKY Changes to use Unlock to unlock files if Unlock.exe is in path both from menu/toolbar and as part of
-                copy, move and delete operations
-
-***********************************************************************/
-
-#include "dll\fm3dll2.h"
-
-DEFAULTICON                 icons\FM3.ICO
-
-BITMAP  MAIN_TRASHCAN       bitmaps\TRASH.BMP
-
-BITMAP DIR_FRAME            bitmaps\FILE.BMP
-BITMAP DIR_FOLDERICON       bitmaps\PMAP.BMP
-BITMAP TREE_OPENCNR         bitmaps\OPENCONT.BMP
-BITMAP IDM_TOOLLEFT         bitmaps\TOOLLEFT.BMP
-BITMAP IDM_TOOLRIGHT        bitmaps\TOOLRT.BMP
-BITMAP IDM_INFO             bitmaps\INFO.BMP
-BITMAP IDM_DELETE           bitmaps\DELETE.BMP
-BITMAP IDM_VIEW             bitmaps\VIEW.BMP
-BITMAP IDM_EDIT             bitmaps\EDIT.BMP
-BITMAP IDM_EXEC             bitmaps\EXEC.BMP
-BITMAP IDM_TEST             bitmaps\TEST.BMP
-BITMAP IDM_VIRUSSCAN        bitmaps\VIRUS.BMP
-BITMAP IDM_ATTRS            bitmaps\ATTRLIST.BMP
-BITMAP IDM_RENAME           bitmaps\RENAME.BMP
-
-BITMAP IDM_SELECTALL        bitmaps\SELALL.BMP
-BITMAP IDM_SELECTALLFILES   bitmaps\SELECT.BMP
-BITMAP IDM_SELECTALLDIRS    bitmaps\SELDIRS.BMP
-BITMAP IDM_DESELECTALL      bitmaps\DESELECT.BMP
-BITMAP IDM_DESELECTALLFILES bitmaps\DESELFIL.BMP
-BITMAP IDM_DESELECTALLDIRS  bitmaps\DESELDIR.BMP
-BITMAP IDM_SELECTLIST       bitmaps\SELLIST.BMP
-BITMAP IDM_SELECTCLIP       bitmaps\SELCLIP.BMP
-BITMAP IDM_DESELECTCLIP     bitmaps\DSELCLIP.BMP
-BITMAP IDM_INVERT           bitmaps\INVRTSEL.BMP
-BITMAP IDM_RESELECT         bitmaps\RESLCT.BMP
-
-BITMAP IDM_ARCHIVE          bitmaps\ARCHIVE.BMP
-BITMAP IDM_EXTRACT          bitmaps\EXTRACT.BMP
-BITMAP IDM_MOVE             bitmaps\MOVER.BMP
-BITMAP IDM_COPY             bitmaps\COPIER.BMP
-BITMAP IDM_SHADOW           bitmaps\SHADOW.BMP
-BITMAP IDM_UNDELETE         bitmaps\UNDELETE.BMP
-BITMAP IDM_KILLPROC         bitmaps\KILLPROC.BMP
-BITMAP IDM_INSTANT          bitmaps\INSTANT.BMP
-BITMAP IDM_COMMANDLINE      bitmaps\CMDLINE.BMP
-BITMAP IDM_PRINT            bitmaps\PRINT.BMP
-BITMAP IDM_FILTER           bitmaps\FILTER.BMP
-BITMAP IDM_WALKDIR          bitmaps\WALK.BMP
-BITMAP IDM_EDITASSOC        bitmaps\ASSOC.BMP
-BITMAP IDM_EDITCOMMANDS     bitmaps\COMMAND.BMP
-BITMAP IDM_RESCAN           bitmaps\RESCAN.BMP
-BITMAP IDM_REFRESH          bitmaps\RESCAN.BMP
-BITMAP IDM_EAS              bitmaps\EA.BMP
-BITMAP IDM_INIVIEWER        bitmaps\INI.BMP
-BITMAP IDM_PERMDELETE       bitmaps\PERMDEL.BMP
-BITMAP IDM_SYSINFO          bitmaps\SYSINFO.BMP
-BITMAP IDM_SYSTEMCLOCK      bitmaps\SYSCLOCK.BMP
-BITMAP IDM_SAVETOCLIP       bitmaps\SAVECLIP.BMP
-BITMAP IDM_HELP             bitmaps\HELP.BMP
-BITMAP IDM_SAVETOLIST       bitmaps\SAVELIST.BMP
-BITMAP IDM_COLLECTOR        bitmaps\COLLECT.BMP
-BITMAP IDM_COLLECT          bitmaps\COLLECT.BMP
-BITMAP IDM_OBJECT           bitmaps\OBJECT.BMP
-BITMAP IDM_WINDOWDLG        bitmaps\WINDOW.BMP
-BITMAP IDM_MKDIR            bitmaps\MKDIR.BMP
-BITMAP IDM_VIEWINFS         bitmaps\VIEWINFS.BMP
-BITMAP IDM_MCIPLAY          bitmaps\PLAYMM.BMP
-BITMAP IDM_OPENDEFAULT      bitmaps\OPEND.BMP
-BITMAP IDM_COLLECTFROMFILE  bitmaps\COLLLIST.BMP
-BITMAP IDM_NOTEBOOK         bitmaps\NOTEBOOK.BMP
-BITMAP IDM_GREP             bitmaps\GREP.BMP
-BITMAP IDM_SEEALL           bitmaps\SEEALL.BMP
-BITMAP IDM_SELECTMASK       bitmaps\SELMASK.BMP
-BITMAP IDM_DESELECTMASK     bitmaps\DSELMASK.BMP
-BITMAP IDM_USERLIST         bitmaps\USERLIST.BMP
-BITMAP IDM_OPENWALK         bitmaps\WALK2.BMP
-BITMAP FLOPPY_ICON          bitmaps\FLOPPY.BMP
-BITMAP DRIVE_ICON           bitmaps\HDRIVE.BMP
-BITMAP REMOVABLE_ICON       bitmaps\REMOV.BMP
-BITMAP CDROM_ICON           bitmaps\CDROM.BMP
-BITMAP REMOTE_ICON          bitmaps\REMOTE.BMP
-BITMAP VIRTUAL_ICON         bitmaps\VIRTUAL.BMP
-BITMAP RAMDISK_ICON         bitmaps\RAMDISK.BMP
-BITMAP DONNO_ICON           bitmaps\DONNO.BMP
-BITMAP IDM_RESCANALL        bitmaps\rescanhd2.bmp
-BITMAP IDM_REFRESHREMOVABLE bitmaps\refremov.bmp
-BITMAP 65534                bitmaps\EMPTY.BMP
-BITMAP LEDON_BMP            bitmaps\LEDON.BMP
-BITMAP LEDOFF_BMP           bitmaps\LEDOFF.BMP
-BITMAP LEDON2_BMP           bitmaps\LEDON2.BMP
-BITMAP LEDOFF2_BMP          bitmaps\LEDOFF2.BMP
-BITMAP IDM_SIZES            bitmaps\DIRSIZE.BMP
-BITMAP IDM_FINDFIRST        bitmaps\FINDFRST.BMP
-BITMAP IDM_FINDNEXT         bitmaps\FINDNEXT.BMP
-BITMAP IDM_FINDPREV         bitmaps\FINDPREV.BMP
-BITMAP IDM_SETTARGET        bitmaps\TARGET.BMP
-BITMAP IDM_CLEARCNR         bitmaps\CLEARCNR.BMP
-BITMAP IDM_REMOVE           bitmaps\REMOVOBJ.BMP
-
-BITMAP IDM_SORTFILENAME     bitmaps\SORTNAM.BMP
-BITMAP IDM_SORTSIZE         bitmaps\SORTSIZ.BMP
-BITMAP IDM_SORTEASIZE       bitmaps\SORTEASZ.BMP
-BITMAP IDM_SORTFIRST        bitmaps\SORT1ST.BMP
-BITMAP IDM_SORTLAST         bitmaps\SORTLAST.BMP
-BITMAP IDM_SORTLWDATE       bitmaps\SORTDATE.BMP
-BITMAP IDM_SORTCRDATE       bitmaps\SORTCDAT.BMP
-BITMAP IDM_SORTREVERSE      bitmaps\SORTREV.BMP
-
-BITMAP IDM_COLORPALETTE     bitmaps\COLORPAL.BMP
-BITMAP IDM_FONTPALETTE      bitmaps\FNTPALET.BMP
-BITMAP IDM_KILLME           bitmaps\KILLME.BMP
-BITMAP IDM_MERGE            bitmaps\MERGE.BMP
-BITMAP IDM_HICOLORPALETTE   bitmaps\HICOLPAL.BMP
-BITMAP IDM_VIEWHELPS        bitmaps\VIEWHELP.BMP
-BITMAP IDM_WPSCOPY          bitmaps\WPSCOPYB.BMP
-BITMAP IDM_WPSMOVE          bitmaps\WPSMOVEB.BMP
-BITMAP IDM_UUDECODE         bitmaps\UDECODE.BMP
-BITMAP IDM_UNLOCKFILE       bitmaps\UNLOCK.BMP
-
-#define AUTHOR_PICTURE           26102               /* fm3dlg.h */
-BITMAP AUTHOR_PICTURE       bitmaps\HECTOR.BMP
-
-BITMAP IDM_CMDTOOLBAR       bitmaps\cmdstls.bmp
-BITMAP IDM_UTILSTOOLBAR     bitmaps\utilstls.bmp
-BITMAP IDM_SORTTOOLBAR      bitmaps\sorttls.bmp
-BITMAP IDM_SELECTTOOLBAR    bitmaps\selecttls.bmp
-BITMAP IDM_CONFIGTOOLBAR    bitmaps\configtls.bmp
-BITMAP IDM_FILESTOOLBAR     bitmaps\filestls.bmp
-BITMAP IDM_VIEWSTOOLBAR     bitmaps\viewstls.bmp
Index: trunk/fm3tools.tmp
===================================================================
--- trunk/fm3tools.tmp	(revision 1912)
+++ 	(revision )
@@ -1,329 +1,0 @@
-; Fixed: Ticket 267
-;
-; This file contains definitions for an FM/2 toolbar.
-;
-; To edit this file manually, see "Manual edit of toolbar files"
-; in the FM/2 help file.
-;
-;
-Archive Files/Directories (Ctrl + A)
-Archive
-1
-1029
-;
-Collect Files/Directories
-Collect
-0
-1011
-;
-Collect Files/Directories from list(s)
-ColList
-1
-1060
-;
-Copy Files/Directories (Ctrl + c)
-Copy
-1
-1002
-;
-Create Objects
-Objects
-1
-1022
-;
-Create Shadow Objects
-Shadows
-1
-1021
-;
-Delete Files/Directories (Ctrl + d)
-Delete
-1
-1004
-;
-Deselect All (Ctrl + \)
--All
-0
-10007
-;
-Deselect Dirs
--Dirs
-0
-10011
-;
-Deselect Mask (Ctrl + +)
--Mask
-0
-10013
-;
-Directory Sizes (Ctrl + Z)
-DirSiz
-0
-1031
-;
-Edit Associations
-Assoc
-0
-3001
-;
-Edit Commands
-Cmds
-0
-1048
-;
-Edit Files (Ctrl + e)
-Edit
-1
-1024
-;
-Exit FM2 (Ctrl + F3)
-Exit
-0
-1111
-;
-Extended Attributes (Ctrl + E)
-EAs
-1
-1008
-;
-Extract From Archives (Ctrl + x)
-Extract
-1
-1030
-;
-Filter Container (Ctrl + f)
-Filter
-0
-5001
-;
-FM/2 Help (Ctrl + k)
-Help
-0
-999
-;
-Font Palette
-FntPal
-0
-3020
-;
-Hi Color Palette
-MixPal
-0
-3061
-;
-HLP Bookself viewer
-HlpBooks
-0
-2011
-;
-Instant Command File
-Instant
-0
-2006
-;
-INF Bookself viewer
-InfBooks
-0
-2010
-;
-Invert selections (Ctrl + ;)
-Invert
-0
-10014
-;
-Kill Process
-KillPrc
-0
-2003
-;
-Make Directory (Ctrl + M)
-MkDir
-0
-1026
-;
-Move Files/Directories (Ctrl + m)
-Move
-1
-1001
-;
-Object Information (Ctrl + i)
-Info
-1
-1010
-;
-Open Default (F6)
-Open
-1
-1017
-;
-OS/2 Command Line
-OS/2
-0
-2007
-;
-Play Multimedia
-Play
-1
-1058
-;
-Permanently Delete Files/Directories (Ctrl + D)
-Kill
-1
-1006
-;
-Print Files (Ctrl + p)
-Print
-1
-1007
-;
-Remove objects
-RemoveObj
-1
-1043
-;
-Rename Files/Directories (Ctrl + r)
-Rename
-1
-1005
-;
-Reselect (Ctrl +  ')
-Reslct
-0
-10027
-;
-Reverse sort
-Rev
-8
-3015
-;
-Save List to Clipboard (Ctrl + [)
-SvClip
-1
-1027
-;
-Save List to File (Ctrl + S)
-SvList
-0
-1028
-;
-See all files
-SeeAll
-0
-1067
-;
-Select All Files (Ctrl + /)
-+All
-0
-10008
-;
-Seek and scan files
-SeekScan
-0
-1047
-;
-Select Mask (Ctrl + =)
-+Mask
-0
-10012
-;
-Set Attributes and Date/Time of Files/Directories
-Attribs
-1
-1009
-;
-Set Target Directory (Ctrl + T)
-TargetDir
-0
-1154
-;
-Settings Notebook
-Setngs
-0
-3059
-;
-Solid Color Palette
-SolPal
-0
-3021
-;
-Sort by EA size
-EAsz
-0
-3007
-;
-Sort by creation date
-CrDate
-0
-3012
-;
-Sort by filename
-Name
-0
-3005
-;
-Sort by first extension
-1st
-0
-3008
-;
-Sort by last extension
-Last
-0
-3009
-;
-Sort by lastwrite date
-LwDate
-0
-3010
-;
-Sort by size
-Size
-0
-3006
-;
-System Clock
-SysClk
-0
-2009
-;
-Text to binary decoding (Ctrl + U)
-UUDecode
-1
-1132
-;
-Undelete Files
-Undel
-0
-2004
-;
-Walk Directories (Ctrl + w)
-Walk
-0
-10002
-;
-Window Dialog (Ctrl + W)
-Windws
-0
-9010
-;
-WPS Copy Files/Directories
-WPSCopy
-1
-1153
-;
-WPS Move Files/Directories
-WPSMove
-1
-1152
-;
-View Files (Ctrl + v)
-View
-1
-1023
-;
-View INI Files
-INIs
-1
-2001
-;
-; $Id$
Index: trunk/fm4.c
===================================================================
--- trunk/fm4.c	(revision 1912)
+++ 	(revision )
@@ -1,102 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  fm/2 lite applet
-
-  Copyright (c) 1993-98 M. Kimes
-  Copyright (c) 2008 Steven H.Levine
-
-  05 Jan 08 SHL Sync
-  14 Dec 08 SHL Add exception handler support
-
-***********************************************************************/
-
-#include <string.h>
-
-#define INCL_DOS
-#define INCL_WIN
-#define INCL_LONGLONG
-#define INCL_DOSEXCEPTIONS		// XCTP_...
-#define INCL_DOSERRORS			// NO_ERROR
-
-#include "dll\fm3dll.h"
-#include "dll\mainwnd.h"		// hwndBubble
-#include "dll\notebook.h"		// appname
-#include "dll\tools.h"
-#include "dll\version.h"
-#include "dll\mainwnd2.h"		// StartFM32
-#include "dll\init.h"			// InitFM3DLL
-#include "dll\errutil.h"		// Error reporting
-#include "dll\excputil.h"		// Exception handlers
-
-static PSZ pszSrcFile = __FILE__;
-
-int main(int argc, char *argv[])
-{
-  HAB hab;
-  HMQ hmq;
-  QMSG qmsg;
-  HWND hwndFrame;
-  APIRET regRet;
-  UINT x;
-  EXCEPTIONREGISTRATIONRECORD regRec = { NULL, NULL };
-
-  strcpy(appname, "FM/4");
-  DosError(FERR_DISABLEHARDERR);
-
-  regRec.ExceptionHandler = HandleException;
-  regRet = DosSetExceptionHandler(&regRec);
-  if (regRet != NO_ERROR) {
-    DbgMsg(pszSrcFile, __LINE__,
-	   "DosSetExceptionHandler failed with error %u", regRet);
-  }
-
-  for (x = 1; x < argc; x++) {
-    if (*argv[x] == '+' && !argv[x][1])
-      fLogFile = TRUE;
-    if (*argv[x] == '-') {
-      if (argv[x][1])
-	strcpy(profile, &argv[x][1]);
-    }
-  }
-
-  hab = WinInitialize(0);
-  if (hab) {
-    hmq = WinCreateMsgQueue(hab, 2048);
-    if (hmq) {
-      if (InitFM3DLL(hab, argc, argv)) {
-	if (CheckVersion(VERMAJOR, VERMINOR)) {
-	  hwndFrame = StartFM32(hab, argc, argv);
-	  if (hwndFrame != (HWND) 0) {
-	    for (;;) {
-	      if (!WinGetMsg(hab, &qmsg, (HWND) 0, 0, 0)) {
-		if (qmsg.hwnd)
-		  qmsg.msg = WM_CLOSE;
-		else
-		  break;
-	      }
-	      if (hwndBubble &&
-		  ((qmsg.msg > (WM_BUTTON1DOWN - 1) &&
-		    qmsg.msg < (WM_BUTTON3DBLCLK + 1)) ||
-		   (qmsg.msg > (WM_CHORD - 1) &&
-		    qmsg.msg < (WM_BUTTON3CLICK + 1))) &&
-		  WinIsWindowVisible(hwndBubble))
-		WinShowWindow(hwndBubble, FALSE);
-	      WinDispatchMsg(hab, &qmsg);
-	    }
-	    if (WinIsWindow(hab, WinWindowFromID(hwndFrame, FID_CLIENT)))
-	      WinSendMsg(WinWindowFromID(hwndFrame,
-					 FID_CLIENT),
-			 WM_CLOSE, MPVOID, MPVOID);
-	  }
-	}
-      }
-      DosSleep(250L);
-      WinDestroyMsgQueue(hmq);
-    }
-    WinTerminate(hab);
-  }
-  return 0;
-}
Index: trunk/fm4.def
===================================================================
--- trunk/fm4.def	(revision 1912)
+++ 	(revision )
@@ -1,9 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2009 Steven H. Levine
-
-# 14 Jun 07 SHL Convert to OpenWatcom
-
-option description '@#The Netlabs FM/2 team:3.25.0#@##1## 2024-06-02 03:25:00      ZOBOPEEP::EN:US:0:U:@@F(ile) M(anager)/2 Lite Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, 2024 Steven Levine and Associates, Inc. All rights reserved'
-
-option stack = 655360
Index: trunk/fm4.mak
===================================================================
--- trunk/fm4.mak	(revision 1912)
+++ 	(revision )
@@ -1,23 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2007 Steven H. Levine
-
-# 14 Jun 07 SHL Convert to OpenWatcom
-# 23 Feb 08 JBS Add support for building SYM files
-# 04 Jul 11 GKY Make xqs files an explicit target so they will be rebuild if lost somehow.
-
-BASE=fm4
-
-!include makefile_pre.mk
-
-all: $(BASE).exe $(BASE).res .symbolic
-
-sym: $(BASE).sym $(BASE).xqs .symbolic
-
-$(BASE).res: $(BASE).rc icons\$(BASE).ico bitmaps\*.bmp
-
-$(BASE).obj: $(BASE).c dll\version.h
-
-!include makefile_post.mk
-
-# The end
Index: trunk/fm4.rc
===================================================================
--- trunk/fm4.rc	(revision 1912)
+++ 	(revision )
@@ -1,151 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  fm4 resources (fm/2 lite)
-
-  Copyright (c) 1993-98 M. Kimes
-  Copyright (c) 2005, 2008 Steven H. Levine
-
-  09 Aug 05 SHL Drop dup icon
-  04 Sep 06 SHL Sync with fm3.rc
-  17 Feb 07 GKY Add more drive type bitmaps from David
-  16 Aug 07 SHL Document AUTHOR_PICTURE
-  04 Jan 08 SHL Sync with fm3dll.h mods
-  29 Aug 08 GKY Add bmps from David for the 7 predefined toolbars
-  22 Jul 09 GKY Drivebar enhancements add refresh removable, rescan all drives, drive button
-                loads drive root directory in directory container or expands drive tree
-                and rescans drive in tree container depending on container focus, greyed out
-                inappropriate menu context choices
-  04 Aug 12 GKY Changes to use Unlock to unlock files if Unlock.exe is in path both from menu/toolbar and as part of
-                copy, move and delete operations
-                
-***********************************************************************/
-
-#include "dll\fm3dll2.h"
-
-DEFAULTICON                 icons\FM4.ICO
-
-BITMAP  MAIN_TRASHCAN       bitmaps\TRASH.BMP
-
-BITMAP DIR_FRAME            bitmaps\FILE.BMP
-BITMAP DIR_FOLDERICON       bitmaps\PMAP.BMP
-BITMAP IDM_TOOLLEFT         bitmaps\TOOLLEFT.BMP
-BITMAP IDM_TOOLRIGHT        bitmaps\TOOLRT.BMP
-BITMAP IDM_INFO             bitmaps\INFO.BMP
-BITMAP IDM_DELETE           bitmaps\DELETE.BMP
-BITMAP IDM_VIEW             bitmaps\VIEW.BMP
-BITMAP IDM_EDIT             bitmaps\EDIT.BMP
-BITMAP IDM_EXEC             bitmaps\EXEC.BMP
-BITMAP IDM_TEST             bitmaps\TEST.BMP
-BITMAP IDM_VIRUSSCAN        bitmaps\VIRUS.BMP
-BITMAP IDM_ATTRS            bitmaps\ATTRLIST.BMP
-BITMAP IDM_RENAME           bitmaps\RENAME.BMP
-
-BITMAP IDM_SELECTALL        bitmaps\SELALL.BMP
-BITMAP IDM_SELECTALLFILES   bitmaps\SELECT.BMP
-BITMAP IDM_SELECTALLDIRS    bitmaps\SELDIRS.BMP
-BITMAP IDM_DESELECTALL      bitmaps\DESELECT.BMP
-BITMAP IDM_DESELECTALLFILES bitmaps\DESELFIL.BMP
-BITMAP IDM_DESELECTALLDIRS  bitmaps\DESELDIR.BMP
-BITMAP IDM_SELECTLIST       bitmaps\SELLIST.BMP
-BITMAP IDM_SELECTCLIP       bitmaps\SELCLIP.BMP
-BITMAP IDM_DESELECTCLIP     bitmaps\DSELCLIP.BMP
-BITMAP IDM_INVERT           bitmaps\INVRTSEL.BMP
-BITMAP IDM_RESELECT         bitmaps\RESLCT.BMP
-
-BITMAP IDM_ARCHIVE          bitmaps\ARCHIVE.BMP
-BITMAP IDM_EXTRACT          bitmaps\EXTRACT.BMP
-BITMAP IDM_MOVE             bitmaps\MOVER.BMP
-BITMAP IDM_COPY             bitmaps\COPIER.BMP
-BITMAP IDM_SHADOW           bitmaps\SHADOW.BMP
-BITMAP IDM_UNDELETE         bitmaps\UNDELETE.BMP
-BITMAP IDM_KILLPROC         bitmaps\KILLPROC.BMP
-BITMAP IDM_INSTANT          bitmaps\INSTANT.BMP
-BITMAP IDM_COMMANDLINE      bitmaps\CMDLINE.BMP
-BITMAP IDM_PRINT            bitmaps\PRINT.BMP
-BITMAP IDM_FILTER           bitmaps\FILTER.BMP
-BITMAP IDM_WALKDIR          bitmaps\WALK.BMP
-BITMAP IDM_EDITASSOC        bitmaps\ASSOC.BMP
-BITMAP IDM_EDITCOMMANDS     bitmaps\COMMAND.BMP
-BITMAP IDM_RESCAN           bitmaps\RESCAN.BMP
-BITMAP IDM_REFRESH          bitmaps\RESCAN.BMP
-BITMAP IDM_EAS              bitmaps\EA.BMP
-BITMAP IDM_INIVIEWER        bitmaps\INI.BMP
-BITMAP IDM_PERMDELETE       bitmaps\PERMDEL.BMP
-BITMAP IDM_SYSINFO          bitmaps\SYSINFO.BMP
-BITMAP IDM_SYSTEMCLOCK      bitmaps\SYSCLOCK.BMP
-BITMAP IDM_SAVETOCLIP       bitmaps\SAVECLIP.BMP
-BITMAP IDM_HELP             bitmaps\HELP.BMP
-BITMAP IDM_SAVETOLIST       bitmaps\SAVELIST.BMP
-BITMAP IDM_COLLECTOR        bitmaps\COLLECT.BMP
-BITMAP IDM_COLLECT          bitmaps\COLLECT.BMP
-BITMAP IDM_OBJECT           bitmaps\OBJECT.BMP
-BITMAP IDM_WINDOWDLG        bitmaps\WINDOW.BMP
-BITMAP IDM_MKDIR            bitmaps\MKDIR.BMP
-BITMAP IDM_VIEWINFS         bitmaps\VIEWINFS.BMP
-BITMAP IDM_MCIPLAY          bitmaps\PLAYMM.BMP
-BITMAP IDM_OPENDEFAULT      bitmaps\OPEND.BMP
-BITMAP IDM_COLLECTFROMFILE  bitmaps\COLLLIST.BMP
-BITMAP IDM_NOTEBOOK         bitmaps\NOTEBOOK.BMP
-BITMAP IDM_GREP             bitmaps\GREP.BMP
-BITMAP IDM_SEEALL           bitmaps\SEEALL.BMP
-BITMAP IDM_SELECTMASK       bitmaps\SELMASK.BMP
-BITMAP IDM_DESELECTMASK     bitmaps\DSELMASK.BMP
-BITMAP IDM_USERLIST         bitmaps\USERLIST.BMP
-BITMAP IDM_OPENWALK         bitmaps\WALK2.BMP
-BITMAP FLOPPY_ICON          bitmaps\FLOPPY.BMP
-BITMAP DRIVE_ICON           bitmaps\HDRIVE.BMP
-BITMAP REMOVABLE_ICON       bitmaps\REMOV.BMP
-BITMAP CDROM_ICON           bitmaps\CDROM.BMP
-BITMAP REMOTE_ICON          bitmaps\REMOTE.BMP
-BITMAP VIRTUAL_ICON         bitmaps\VIRTUAL.BMP
-BITMAP RAMDISK_ICON         bitmaps\RAMDISK.BMP
-BITMAP DONNO_ICON           bitmaps\DONNO.BMP
-BITMAP IDM_RESCANALL        bitmaps\rescanhd2.bmp
-BITMAP IDM_REFRESHREMOVABLE bitmaps\refremov.bmp
-BITMAP 65534                bitmaps\EMPTY.BMP
-BITMAP LEDON_BMP            bitmaps\LEDON.BMP
-BITMAP LEDOFF_BMP           bitmaps\LEDOFF.BMP
-BITMAP LEDON2_BMP           bitmaps\LEDON2.BMP
-BITMAP LEDOFF2_BMP          bitmaps\LEDOFF2.BMP
-BITMAP IDM_SIZES            bitmaps\DIRSIZE.BMP
-BITMAP DIR_MAX              bitmaps\DIRMAX1.BMP    /* fixme to be gone if not used? */
-BITMAP IDM_FINDFIRST        bitmaps\FINDFRST.BMP
-BITMAP IDM_FINDNEXT         bitmaps\FINDNEXT.BMP
-BITMAP IDM_FINDPREV         bitmaps\FINDPREV.BMP
-BITMAP IDM_SETTARGET        bitmaps\TARGET.BMP
-BITMAP IDM_CLEARCNR         bitmaps\CLEARCNR.BMP
-BITMAP IDM_REMOVE           bitmaps\REMOVOBJ.BMP
-
-BITMAP IDM_SORTFILENAME     bitmaps\SORTNAM.BMP
-BITMAP IDM_SORTSIZE         bitmaps\SORTSIZ.BMP
-BITMAP IDM_SORTEASIZE       bitmaps\SORTEASZ.BMP
-BITMAP IDM_SORTFIRST        bitmaps\SORT1ST.BMP
-BITMAP IDM_SORTLAST         bitmaps\SORTLAST.BMP
-BITMAP IDM_SORTLWDATE       bitmaps\SORTDATE.BMP
-BITMAP IDM_SORTCRDATE       bitmaps\SORTCDAT.BMP
-BITMAP IDM_SORTREVERSE      bitmaps\SORTREV.BMP
-
-BITMAP IDM_COLORPALETTE     bitmaps\COLORPAL.BMP
-BITMAP IDM_FONTPALETTE      bitmaps\FNTPALET.BMP
-BITMAP IDM_KILLME           bitmaps\KILLME.BMP
-BITMAP IDM_MERGE            bitmaps\MERGE.BMP
-BITMAP IDM_HICOLORPALETTE   bitmaps\HICOLPAL.BMP
-BITMAP IDM_VIEWHELPS        bitmaps\VIEWHELP.BMP
-BITMAP IDM_WPSCOPY          bitmaps\WPSCOPYB.BMP
-BITMAP IDM_WPSMOVE          bitmaps\WPSMOVEB.BMP
-BITMAP IDM_UUDECODE         bitmaps\UDECODE.BMP
-BITMAP IDM_UNLOCKFILE       bitmaps\UNLOCK.BMP
-
-#define AUTHOR_PICTURE		 26102               /* fm3dlg.h */
-BITMAP AUTHOR_PICTURE       bitmaps\HECTOR.BMP
-
-BITMAP IDM_CMDTOOLBAR       bitmaps\cmdstls.bmp
-BITMAP IDM_UTILSTOOLBAR     bitmaps\utilstls.bmp
-BITMAP IDM_SORTTOOLBAR      bitmaps\sorttls.bmp
-BITMAP IDM_SELECTTOOLBAR    bitmaps\selecttls.bmp
-BITMAP IDM_CONFIGTOOLBAR    bitmaps\configtls.bmp
-BITMAP IDM_FILESTOOLBAR     bitmaps\filestls.bmp
-BITMAP IDM_VIEWSTOOLBAR     bitmaps\viewstls.bmp
Index: trunk/global.c
===================================================================
--- trunk/global.c	(revision 1912)
+++ 	(revision )
@@ -1,99 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  See all files applet
-
-  Copyright (c) 1993-98 M. Kimes
-  Copyright (c) 2008 Steven H.Levine
-
-  05 Jan 08 SHL Sync
-  14 Dec 08 SHL Add exception handler support
-
-***********************************************************************/
-
-#include <string.h>
-
-#define INCL_DOS
-#define INCL_WIN
-#define INCL_DOSEXCEPTIONS		// XCTP_...
-#define INCL_DOSERRORS			// NO_ERROR
-
-#include "dll\fm3dll.h"
-#include "dll\mainwnd.h"		// hwndBubble
-#include "dll\notebook.h"		// appname
-#include "dll\fm3str.h"
-#include "dll\seeall.h"			// StartSeeAll
-#include "dll\valid.h"			// IsFile
-#include "dll\init.h"			// InitFM3DLL
-#include "dll\errutil.h"		// Error reporting
-#include "dll\excputil.h"		// Exception handlers
-
-static PSZ pszSrcFile = __FILE__;
-
-int main(int argc, char *argv[])
-{
-  HAB hab;
-  HMQ hmq;
-  QMSG qmsg;
-  HWND hwndFrame;
-  CHAR fullname[CCHMAXPATH] = { 0 };	// 14 Dec 08 SHL was static
-  UINT x;
-  APIRET regRet;
-  EXCEPTIONREGISTRATIONRECORD regRec = { NULL, NULL };
-
-  strcpy(appname, "SEEALL");
-  DosError(FERR_DISABLEHARDERR);
-
-  regRec.ExceptionHandler = HandleException;
-  regRet = DosSetExceptionHandler(&regRec);
-  if (regRet != NO_ERROR) {
-    DbgMsg(pszSrcFile, __LINE__,
-	   "DosSetExceptionHandler failed with error %u", regRet);
-  }
-
-  hab = WinInitialize(0);
-  if (hab) {
-    hmq = WinCreateMsgQueue(hab, 1024);
-    if (hmq) {
-      if (InitFM3DLL(hab, argc, argv)) {
-	for (x = 1; x < argc; x++) {
-	  if (!strchr("/;,`\'", *argv[x]) && !*fullname &&
-	      (IsRoot(argv[x]) || IsFile(argv[x]) == 0)) {
-	    if (IsRoot(argv[x]))
-	      strcpy(fullname, argv[x]);
-	    else if (DosQueryPathInfo(argv[x],
-				      FIL_QUERYFULLNAME,
-				      fullname, sizeof(fullname)))
-	      *fullname = 0;		// Forget name
-	  }
-	}
-	hwndFrame = StartSeeAll(HWND_DESKTOP, TRUE, fullname);
-	if (hwndFrame) {
-	  for (;;) {
-	    if (!WinGetMsg(hab, &qmsg, (HWND) 0, 0, 0)) {
-	      if (qmsg.hwnd)
-		qmsg.msg = WM_CLOSE;
-	      else
-		break;
-	    }
-	    if (hwndBubble &&
-		((qmsg.msg > (WM_BUTTON1DOWN - 1) &&
-		  qmsg.msg < (WM_BUTTON3DBLCLK + 1)) ||
-		 (qmsg.msg > (WM_CHORD - 1) &&
-		  qmsg.msg < (WM_BUTTON3CLICK + 1))) &&
-		WinIsWindowVisible(hwndBubble))
-	      WinShowWindow(hwndBubble, FALSE);
-	    WinDispatchMsg(hab, &qmsg);
-	  }
-	  DosSleep(125L);
-	}
-      }
-      DosSleep(125L);
-      WinDestroyMsgQueue(hmq);
-    }
-    WinTerminate(hab);
-  }
-  return 0;
-}
Index: trunk/global.def
===================================================================
--- trunk/global.def	(revision 1912)
+++ 	(revision )
@@ -1,9 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2009 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-
-option description '@#The Netlabs FM/2 team:3.25.0#@##1## 2024-06-02 03:25:00      ZOBOPEEP::EN:US:0:U:@@FM/2 Global MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, 2024 Steven Levine and Associates, Inc. All rights reserved'
-
-option stack = 388416
Index: trunk/global.mak
===================================================================
--- trunk/global.mak	(revision 1912)
+++ 	(revision )
@@ -1,23 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2007 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-# 23 Feb 08 JBS Add support for building SYM files
-# 04 Jul 11 GKY Make xqs files an explicit target so they will be rebuild if lost somehow.
-
-BASE=global
-
-!include makefile_pre.mk
-
-all: $(BASE).exe $(BASE).res .symbolic
-
-sym: $(BASE).sym $(BASE).xqs .symbolic
-
-$(BASE).res: $(BASE).rc icons\$(BASE).ico bitmaps\*.bmp
-
-$(BASE).obj: $(BASE).c
-
-!include makefile_post.mk
-
-# The end
Index: trunk/global.rc
===================================================================
--- trunk/global.rc	(revision 1912)
+++ 	(revision )
@@ -1,43 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  global utility resources
-
-  Copyright (c) 1993-02 M. Kimes
-  Copyright (c) 2003 Steven H.Levine
-
-  15 Oct 02 MK Baseline
-  04 Nov 03 SHL Drop extra default icon
-  04 Jan 08 SHL Sync with fm3dll.h mods
-
-***********************************************************************/
-
-#include "dll\fm3dll2.h"
-
-DEFAULTICON                 icons\GLOBAL.ICO
-
-BITMAP DIR_FOLDERICON       bitmaps\PMAP.BMP
-BITMAP DIR_FRAME            bitmaps\FILE.BMP
-BITMAP 65534                bitmaps\EMPTY.BMP
-BITMAP IDM_DELETE           bitmaps\DELETE.BMP
-BITMAP IDM_EXTRACT          bitmaps\EXTRACT.BMP
-BITMAP IDM_PRINT            bitmaps\PRINT.BMP
-BITMAP IDM_TEST             bitmaps\TEST.BMP
-BITMAP IDM_VIRUSSCAN        bitmaps\VIRUS.BMP
-BITMAP IDM_EXEC             bitmaps\EXEC.BMP
-BITMAP IDM_VIEW             bitmaps\VIEW.BMP
-BITMAP IDM_PERMDELETE       bitmaps\PERMDEL.BMP
-BITMAP IDM_RESCAN           bitmaps\RESCAN.BMP
-BITMAP IDM_REFRESH          bitmaps\RESCAN.BMP
-BITMAP IDM_FILTER           bitmaps\FILTER.BMP
-BITMAP IDM_WALKDIR          bitmaps\WALK.BMP
-BITMAP IDM_GREP             bitmaps\GREP.BMP
-BITMAP IDM_SEEALL           bitmaps\SEEALL.BMP
-BITMAP IDM_FINDFIRST        bitmaps\FINDFRST.BMP
-BITMAP IDM_FINDNEXT         bitmaps\FINDNEXT.BMP
-BITMAP IDM_FINDPREV         bitmaps\FINDPREV.BMP
-BITMAP IDM_CLEARCNR         bitmaps\CLEARCNR.BMP
-BITMAP IDM_REMOVE           bitmaps\REMOVOBJ.BMP
-
Index: trunk/hpfsopt.tmp
===================================================================
--- trunk/hpfsopt.tmp	(revision 1912)
+++ 	(revision )
@@ -1,20 +1,0 @@
-@echo off
-rem
-rem Recommendations:  hpfsopt -i %1 for idle priority
-rem note:  idle is not a good idea if DOS programs are running...
-rem
-
-rem
-rem This notice is just so users know what's going on and can change it...
-rem
-ECHO This is HPFSOPT.CMD, which you can customize to use any HPFS
-ECHO optimizing program you like.
-
-HPFSOPT.EXE %1
-
-rem
-rem if there was an error or user abort, pause the display so the
-rem user can see what's happened.
-rem
-
-IF ERRORLEVEL == 1 PAUSE
Index: trunk/ini.c
===================================================================
--- trunk/ini.c	(revision 1912)
+++ 	(revision )
@@ -1,66 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  Ini view/edit applet
-
-  Copyright (c) 1993-98 M. Kimes
-  Copyright (c) 2008 Steven H.Levine
-
-  05 Jan 08 SHL Sync
-  14 Dec 08 SHL Add exception handler support
-
-***********************************************************************/
-
-#define INCL_DOS
-#define INCL_WIN
-#define INCL_DOSEXCEPTIONS		// XCTP_...
-#define INCL_DOSERRORS			// NO_ERROR
-
-#include "dll\fm3dll.h"
-#include "dll\notebook.h"		// hwndHelp
-#include "dll\init.h"			// InitFM3DLL
-#include "dll\inis.h"                   // StartIniEditor
-#include "dll\errutil.h"		// Error reporting
-#include "dll\excputil.h"		// Exception handlers
-
-static PSZ pszSrcFile = __FILE__;
-
-int main(int argc, char *argv[])
-{
-  HAB hab;
-  HMQ hmq;
-  QMSG qmsg;
-  HWND hwndFrame;
-  APIRET regRet;
-  EXCEPTIONREGISTRATIONRECORD regRec = { NULL, NULL };
-
-  DosError(FERR_DISABLEHARDERR);
-
-  regRec.ExceptionHandler = HandleException;
-  regRet = DosSetExceptionHandler(&regRec);
-  if (regRet != NO_ERROR) {
-    DbgMsg(pszSrcFile, __LINE__,
-	   "DosSetExceptionHandler failed with error %u", regRet);
-  }
-
-  hab = WinInitialize(0);
-  if (hab) {
-    hmq = WinCreateMsgQueue(hab, 512);
-    if (hmq) {
-      if (InitFM3DLL(hab, argc, argv) &&
-          ((hwndFrame =
-            StartIniEditor(HWND_DESKTOP, argv[1], 0)) != (HWND) 0)) {
-        if (hwndHelp)
-          WinAssociateHelpInstance(hwndHelp, hwndFrame);
-        while (WinGetMsg(hab, &qmsg, (HWND) 0, 0, 0))
-          WinDispatchMsg(hab, &qmsg);
-      }
-      DosSleep(125L);
-      WinDestroyMsgQueue(hmq);
-    }
-    WinTerminate(hab);
-  }
-  return 0;
-}
Index: trunk/ini.def
===================================================================
--- trunk/ini.def	(revision 1912)
+++ 	(revision )
@@ -1,9 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2009 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-
-option description '@#The Netlabs FM/2 team:3.25.0#@##1## 2024-06-02 03:25:00      ZOBOPEEP::EN:US:0:U:@@FM/2 INI Editor MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, 2024 Steven Levine and Associates, Inc. All rights reserved'
-
-option stack = 0x60000
Index: trunk/ini.mak
===================================================================
--- trunk/ini.mak	(revision 1912)
+++ 	(revision )
@@ -1,23 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2007 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-# 23 Feb 08 JBS Add support for building SYM files
-# 04 Jul 11 GKY Make xqs files an explicit target so they will be rebuild if lost somehow.
-
-BASE=ini
-
-!include makefile_pre.mk
-
-all: $(BASE).exe $(BASE).res .symbolic
-
-sym: $(BASE).sym $(BASE).xqs .symbolic
-
-$(BASE).res: $(BASE).rc icons\$(BASE).ico bitmaps\file.bmp
-
-$(BASE).obj: $(BASE).c
-
-!include makefile_post.mk
-
-# The end
Index: trunk/ini.rc
===================================================================
--- trunk/ini.rc	(revision 1912)
+++ 	(revision )
@@ -1,19 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  ini resources
-
-  Copyright (c) 1993-02 M. Kimes
-  Copyright (c) 2003, 2008 Steven H.Levine
-
-  15 Oct 02 MK Baseline
-  04 Jan 08 SHL Sync with fm3dll.h mods
-
-***********************************************************************/
-
-#include "dll\fm3dll2.h"
-
-DEFAULTICON                 icons\INI.ICO
-BITMAP         DIR_FRAME    bitmaps\FILE.BMP
Index: trunk/jfsopt.tmp
===================================================================
--- trunk/jfsopt.tmp	(revision 1912)
+++ 	(revision )
@@ -1,17 +1,0 @@
-@echo off
-rem $Id$
-
-rem
-rem This notice is just so users know what's going on and can change it...
-rem
-ECHO This is JFSOPT.CMD, which you can customize to use any JFS
-ECHO optimizing program you like.
-
-Defragfs.exe %1
-
-rem
-rem if there's an error or user abort, pause the display so the user
-rem can see what's happened.
-rem
-
-IF ERRORLEVEL == 1 PAUSE
Index: trunk/killproc.c
===================================================================
--- trunk/killproc.c	(revision 1912)
+++ 	(revision )
@@ -1,61 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  Process killer applet
-
-  Copyright (c) 1993-98 M. Kimes
-  Copyright (c) 2008 Steven H.Levine
-
-  05 Jan 08 SHL Sync
-  14 Dec 08 SHL Add exception handler support
-
-***********************************************************************/
-
-#define INCL_DOS
-#define INCL_WIN
-#define INCL_DOSEXCEPTIONS		// XCTP_...
-#define INCL_DOSERRORS			// NO_ERROR
-
-#include "dll\fm3dll.h"
-#include "dll\mainwnd.h"		// FM3ModHandle
-#include "dll\fm3dlg.h"
-#include "dll\init.h"			// InitFM3DLL
-#include "dll\killproc.h"		// KillDlgProc
-#include "dll\errutil.h"		// Error reporting
-#include "dll\excputil.h"		// Exception handlers
-
-static PSZ pszSrcFile = __FILE__;
-
-int main(int argc, char *argv[])
-{
-  HAB hab;
-  HMQ hmq;
-  APIRET regRet;
-  EXCEPTIONREGISTRATIONRECORD regRec = { NULL, NULL };
-
-  DosError(FERR_DISABLEHARDERR);
-
-  regRec.ExceptionHandler = HandleException;
-  regRet = DosSetExceptionHandler(&regRec);
-  if (regRet != NO_ERROR) {
-    DbgMsg(pszSrcFile, __LINE__,
-	   "DosSetExceptionHandler failed with error %u", regRet);
-  }
-
-  hab = WinInitialize(0);
-  if (hab) {
-    hmq = WinCreateMsgQueue(hab, 256);
-    if (hmq) {
-      if (InitFM3DLL(hab, argc, argv)) {
-	WinDlgBox(HWND_DESKTOP,
-		  HWND_DESKTOP, KillDlgProc, FM3ModHandle, KILL_FRAME, NULL);
-      }
-      DosSleep(250L);
-      WinDestroyMsgQueue(hmq);
-    }
-    WinTerminate(hab);
-  }
-  return 0;
-}
Index: trunk/killproc.def
===================================================================
--- trunk/killproc.def	(revision 1912)
+++ 	(revision )
@@ -1,9 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2009 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-
-option description '@#The Netlabs FM/2 team:3.25.0#@##1## 2024-06-02 03:25:00      ZOBOPEEP::EN:US:0:U:@@FM/2 Kill Process MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, 2024 Steven Levine and Associates, Inc. All rights reserved'
-
-option stack = 0x50000
Index: trunk/killproc.mak
===================================================================
--- trunk/killproc.mak	(revision 1912)
+++ 	(revision )
@@ -1,23 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2007 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-# 23 Feb 08 JBS Add support for building SYM files
-# 04 Jul 11 GKY Make xqs files an explicit target so they will be rebuild if lost somehow.
-
-BASE=killproc
-
-!include makefile_pre.mk
-
-all: $(BASE).exe $(BASE).res .symbolic
-
-sym: $(BASE).sym $(BASE).xqs .symbolic
-
-$(BASE).res: $(BASE).rc icons\$(BASE).ico
-
-$(BASE).obj: $(BASE).c
-
-!include makefile_post.mk
-
-# The end
Index: trunk/killproc.rc
===================================================================
--- trunk/killproc.rc	(revision 1912)
+++ 	(revision )
@@ -1,16 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  killproc resources
-
-  Copyright (c) 1993-02 M. Kimes
-  Copyright (c) 2008 Steven H.Levine
-
-  15 Oct 02 MK Baseline
-  04 Jan 08 SHL Sync with fm3dll.h mods
-
-***********************************************************************/
-
-DEFAULTICON                 icons\KILLPROC.ICO
Index: trunk/logfm2.cmd
===================================================================
--- trunk/logfm2.cmd	(revision 1912)
+++ 	(revision )
@@ -1,81 +1,0 @@
-/*
- * $Id$
- *
- * Run FM/2 with logging enabled
- *
- * Change log:
- *    17 Jul 11 JBS Corrected redirection syntax
- *    17 Feb 14 JBS Ticket 512: Improvements
- *        Enhanced error-handling
- *           No log file parameter defaults to fm2.log
- *           Checks for write-ability of the log file and prompts for action if unwritable
- *        Other improvements
- *           All logs are written to the <fm2dir>\debug\logfiles directory
- *             (so they are easy to find and do not clutter other directories)
- *           Headers and footers are written to the log file to aid in interpreting
- *             the contents
- *           When FM/2 closes the log file is opened
- *
- */
-
-/* Determine and ensure existence of log file directory */
-parse source . . thispgm
-logfiledir = filespec('D', thispgm) || filespec('P', thispgm) || 'LogFiles'
-call SysMkDir logfiledir
-
-/* Process parameter, using default if none is passed. */
-parse arg logfile
-logfile = strip(logfile)
-if logfile = '' then
-  logfile = 'fm2.log'         /* Default to "fm2.log" */
-
-/* Check "write-ablility" and set the full filename for the log file */
-do until logfile_ok = 1
-   fulllogfilename = logfiledir || '\' || filespec('N', logfile)
-   logfile_exists = (stream(fulllogfilename, 'c', 'query exists') \= '')
-   /* Check for locked file here */
-   if stream(fulllogfilename, 'c', 'open write') = 'READY:' then
-      logfile_ok = 1
-   else
-      do
-         logfile_ok = 0
-         rc = stream(fulllogfilename, 'c', 'close')
-         say 'Unable to open existing log file:' logfile
-         say
-         say logfile 'may be locked by another process.'
-         say
-         say 'Please close any processes that may be using' logfile || '.'
-         say '(Another instance of a logged FM/2 or an editor perhaps?)'
-         say
-         say 'Just press the Enter key to retry' logfile || '.'
-         say 'Or type in a new log file name:'
-         newlogfile = strip(linein())
-         if newlogfile \= '' then
-            logfile = newlogfile
-      end
-end
-
-/* Write "header" */
-if logfile_exists = 1 then
-   do
-      call lineout fulllogfilename, LinePrefix() 'Created log file:' fulllogfilename
-      /* Write "instructions" to file here? */
-   end
-call lineout fulllogfilename, LinePrefix() 'Logging started.'
-call stream fulllogfilename, 'c', 'close'
-
-/* Start FM/2 */
-call directory logfiledir || '\..\..'
-'fm3.exe 2>>' || fulllogfilename
-
-/* Write "footer" */
-call lineout fulllogfilename,  LinePrefix() 'Logging ended.'
-call stream fulllogfilename, 'c', 'close'
-
-/* Open log file for viewing */
-call SysSetObjectData fulllogfilename, 'OPEN=DEFAULT'
-return
-
-LinePrefix: procedure
-return '###' date() time()
-
Index: trunk/makeall.cmd
===================================================================
--- trunk/makeall.cmd	(revision 1912)
+++ 	(revision )
@@ -1,10 +1,0 @@
-:: $Id$
-
-:: %1 only useful for standard target names
-cd dll
-nmake %1
-if errorlevel 1 cancel
-cd ..
-nmake %1
-if errorlevel 1 cancel
-for %X in (*.mak) do nmake /f %X %1
Index: trunk/makefile
===================================================================
--- trunk/makefile	(revision 1912)
+++ 	(revision )
@@ -1,152 +1,0 @@
-# makefile - build all fm/2 components
-# $Id$
-
-# Copyright (c) 1993-98 M. Kimes
-# Copyright (c) 2002-2010 Steven H. Levine
-
-# 24 May 05 SHL Add clean and cleanobj target
-# 16 Jun 05 SHL Workaround makeflags wierdness
-# 18 Jul 05 SHL Add bitmap dependencies
-# 20 Jul 05 SHL Add makeres support
-# 16 Apr 06 SHL Add lxlite target
-# 31 Jul 06 SHL Tweak dependencies
-# 26 Aug 06 SHL Add rest of lxlite support
-# 14 Jun 07 SHL Convert to OpenWatcom
-# 22 Jun 07 JBS Moved some macro-handling code to this
-#               file from warpin\makefile because of some
-#               differences in how Watcom handles macros.
-# 04 Jul 07 SHL Pass DEBUG settings to sub-make
-# 21 Jan 08 SHL Add *.lrf to clean target
-# 22 Feb 08 JBS Suppress lxlite processing when DEBUG=1
-# 08 Jul 08 SHL Avoid extra work for wmake -a dist
-# 22 Jul 08 SHL Change from dll\dllsyms to dll\syms target for consistency
-# 22 Jul 08 SHL Pass FORTIFY options to subordinate makefiles
-# 25 Oct 08 SHL Sanitize DEBUG usage
-# 18 Nov 08 JBS Ticket 297: Various build improvements/corrections
-# 14 Dec 08 SHL Build fm3.sym
-# 12 Jul 09 GKY Allow FM/2 to load in high memory call exehdr /hi
-# 13 Apr 10 SHL Drop HIMEM support
-# 21 Jun 11 GKY Add exceptq .xqs support
-# 21 Jun 11 GKY Make high memory builds the default (resources only for exes)
-# 04 Jul 11 GKY Make xqs files an explicit target so they will be rebuild if lost somehow.
-# 04 Jul 11 GKY Add eFTE backup files (*~) to clean target
-# 13 Aug 11 GKY Build xqs and sym files as part of dll and all targets
-# 25 Jan 20 SHL Add PMPRINTF support - PMPRINTF_OPT
-# 06 Aug 22 GKY Add FM4_NOWARN_DSPACE - FM4_NOWARN_DSPACE_OPT 
-
-# Environment - see makefile_pre.mk and dll\makefile
-
-BASE = fm3
-
-# Pass values for FM2_VER, FM2UTILS_VER and BUILD_FM2UTILS which
-# have been set on the command line, if any, on to the
-# warpin\makefile using the WARPIN_OPTS macro.
-
-!ifdef FM2_VER                  # if defined on wmake command, pass it
-WARPIN_OPTS = FM2_VER=$(FM2_VER)
-!endif
-
-!ifdef FM2UTILS_VER             # if defined on wmake command, pass it
-WARPIN_OPTS = $(WARPIN_OPTS) FM2UTILS_VER=$(FM2UTILS_VER)
-!endif
-
-!ifdef BUILD_FM2UTILS           # if defined on wmake command, pass it
-WARPIN_OPTS = $(WARPIN_OPTS) BUILD_FM2UTILS=$(BUILD_FM2UTILS)
-!endif
-
-!include makefile_pre.mk
-
-all: dll $(BASE) allexe fm3.sym fm3.xqs exesyms .symbolic
-
-syms: fm3.sym fm3.xqs exesyms dllsyms .symbolic
-
-dist: all syms lxlite wpi .symbolic
-
-disth: $(BASE) allexe syms lxlite wpi .symbolic
-
-# Only update resources
-res: .symbolic
-  @echo Updating resources only
-  $(MAKE) -h $(__MAKEOPTS__) $(DEBUG_OPT) MAKERES=1
-
-# make DLL components
-
-dll: .symbolic
-  cd dll
-  $(MAKE) -h $(__MAKEOPTS__) $(DEBUG_OPT) $(FORTIFY_OPT) $(PMPRINTF_OPT) $(FM4_NOWARN_DSPACE)
-  cd ..
-
-dllsyms: .symbolic
-  cd dll
-  $(MAKE) -h $(__MAKEOPTS__) $(DEBUG_OPT) $(FORTIFY_OPT) $(PMPRINTF_OPT) $(FM4_NOWARN_DSPACE) syms
-  cd ..
-
-$(BASE): $(BASE).exe $(BASE).res .symbolic
-
-$(BASE).res: $(BASE).rc  icons\$(BASE).ico bitmaps\*.bmp  .autodepend
-
-$(BASE).obj: $(BASE).c dll\version.h .autodepend
-
-# make EXE compenents
-
-allexe: *.mak .symbolic
-  @for %f in ($<) do $(MAKE) -h -f %f $(__MAKEOPTS__) $(DEBUG_OPT) $(FORTIFY_OPT) $(PMPRINTF_OPT) $(FM4_NOWARN_DSPACE)
-
-# make SYM files
-
-exesyms: *.mak .symbolic
-  @for %f in ($<) do $(MAKE) -h -f %f $(__MAKEOPTS__) $(DEBUG_OPT) $(FORTIFY_OPT) $(PMPRINTF_OPT) $(FM4_NOWARN_DSPACE) sym
-
-# make WPI files
-
-wpi: .symbolic
-  cd warpin
-  $(MAKE) -h $(__MAKEOPTS__) $(DEBUG_OPT) $(WARPIN_OPTS)
-  cd ..
-
-lxlite:: lxlitedll lxliteexe .symbolic
-
-# makefile_post.mk contains lxlite target for $(BASE).exe
-# Apply to each *.mak for other exes
-lxliteexe: *.mak .symbolic
-!ifndef DEBUG
-  @for %f in ($<) do $(MAKE) -h -f %f $(__MAKEOPTS__) $(DEBUG_OPT) $(FORTIFY_OPT) $(PMPRINTF_OPT) $(FM4_NOWARN_DSPACE) lxlite
-!endif
-
-# Apply to dlls
-lxlitedll: .symbolic
-!ifndef DEBUG
-  cd dll
-  $(MAKE) -h lxlite
-# FIXME to be gone
-# $(MAKE) -h $(__MAKEOPTS__) $(DEBUG_OPT) $(FORTIFY_OPT) $(PMPRINTF_OPT) $(FM4_NOWARN_DSPACE) lxlite
-  cd ..
-!endif
-
-cleanobj: .symbolic
-  cd dll
-  $(MAKE) -h $(__MAKEOPTS__) $(DEBUG_OPT) cleanobj
-  cd ..
-  -del *.obj
-
-clean:: .symbolic
-  cd dll
-  $(MAKE) -h $(__MAKEOPTS__) $(DEBUG_OPT) clean
-  cd ..
-  -del *.exe
-  -del *.lrf
-  -del *.map
-  -del *.obj
-  -del *.res
-  -del *.sym
-  -del *.xqs
-  -del *~
-
-distclean: clean .symbolic
-  cd warpin
-  $(MAKE) -h $(__MAKEOPTS__) $(DEBUG_OPT) distclean
-  cd ..
-
-!include makefile_post.mk
-
-# eof
Index: trunk/makefile_post.mk
===================================================================
--- trunk/makefile_post.mk	(revision 1912)
+++ 	(revision )
@@ -1,97 +1,0 @@
-# makefile_post.mk - common makefile suffix settings for all makefiles
-# $Id$
-
-# Copyright (c) 2002-2020 Steven H. Levine
-
-# 16 Aug 05 SHL Clean up
-# 16 Apr 06 SHL Add lxlite target
-# 02 Jun 07 SHL Convert to OpenWatcom
-# 23 Feb 08 JBS Add support for building SYM files (Ticket 226)
-# 25 Oct 08 JBS Rework DEBUG usage to match what C code expects
-# 18 Nov 08 JBS Ticket 297: Various build improvements/corrections
-# 19 Nov 08 JBS Ticket 297: Removed bldlevel calls
-# 14 Dec 08 SHL Drop EXCEPTQ support - will not be used
-# 24 Jul 09 SHL Comments
-# 21 Jun 11 GKY Add exceptq .xqs support
-# 21 Jun 11 GKY Make high memory builds the default resources only for exes
-# 04 Jul 11 GKY Make xqs files an explicit target so they will be rebuild if lost somehow.
-# 25 Jan 12 SHL Renamae LOW -> NOHIGHMEM and allow set from enviroment
-# 17 Jan 14 JBS Ticket 500: Stop setting exe objects to high-memory
-# 25 Jan 20 SHL Comments
-
-!ifndef MAKERES
-
-# Build executable
-# Common parameters go in .lrf
-# Executable specific paramters go in .def
-# Put 32-bit data in high memory unless overridden
-
-!ifndef NOHIGHMEM
-!ifdef %NOHIGHMEM
-NOHIGHMEM=$(%NOHIGHMEM)
-!endif
-!endif
-
-$(BASE).exe: $(BASE).lrf $(BASE).obj $(BASE).res $(BASE).def .explicit
-  @echo Linking $(BASE).exe
-  $(LINK) @$(BASE).lrf @$(BASE).def
-  @echo.
-  @echo Attaching resources to $@
-  @echo.
-  $(RC) $(RCFLAGS2) $(BASE).res $@
-# !ifndef NOHIGHMEM
-#   !exehdr /highmem:3 $@
-# !endif
-
-# 2012-01-25 SHL fixme to be gone - does not undefine
-# NOHIGHMEM =
-
-$(BASE).lrf: $(__MAKEFILES__) .explicit
-   @%write $^@ $(LFLAGS)
-   @%append $^@ name $(BASE)
-   @%append $^@ file $(BASE).obj
-   @%append $^@ library dll\fm3dll.lib
-   @%append $^@ library os2386.lib
-
-$(BASE).xqs: $(BASE).map .explicit
-   @echo Processing: $?
-   -mapxqs $?
-
-$(BASE).sym: $(BASE).map .explicit
-   @echo Processing: $?
-   -perl debugtools\mapsymw.pl $?
-
-!else
-
-# Replace resources
-$(BASE).exe: $(BASE).res .explicit
-  @if not exist $@ echo $@ missing
-!ifndef DEBUG
-     lxlite $@ /x+ /b-
-     lxlite $@ /c:minstub
-!endif
-  @echo.
-  @echo Attaching resources to $@
-  @echo.
-  $(RC) $(RCFLAGS2) $(BASE).res $@
-!ifndef DEBUG
-  lxlite $@ /x- /b-
-!endif
-
-!endif
-
-lxlite:: $(BASE).exe .symbolic .explicit
-!ifndef DEBUG
-  lxlite /x- /b- $?
-!endif
-
-clean:: .symbolic .explicit
-  -del $(BASE).exe
-  -del $(BASE).lrf
-  -del $(BASE).map
-  -del $(BASE).obj
-  -del $(BASE).res
-  -del $(BASE).sym
-  -del $(BASE).xqs
-
-# The end
Index: trunk/makefile_pre.mk
===================================================================
--- trunk/makefile_pre.mk	(revision 1912)
+++ 	(revision )
@@ -1,175 +1,0 @@
-# makefile_pre.mk - common makefile prefix settings for all makefiles
-# $Id$
-
-# Copyright (c) 1993-98 M. Kimes
-# Copyright (c) 2002-2020 Steven H. Levine
-
-# 03 Jan 08 SHL Switch to wrc.exe default; support USE_RC from environment
-# 23 Jan 08 JBS Add support for building SYM files (Ticket 226)
-# 27 May 08 SHL Add WARNALL and FORTIFY support
-# 22 Jul 08 SHL Pass FORTIFY to subordinate makefiles
-# 06 Oct 08 SHL Pass DEBUG in CFLAGS; clean up USE_RC usage
-# 18 Nov 08 JBS Ticket 297: Various build improvements/corrections
-# 13 Apr 10 SHL Drop HIMEM support
-# 21 Jun 11 GKY Add exceptq .xqs support
-# 07 Jan 11 SHL sort map
-# 25 Jan 12 SHL Comments
-# 14 Aug 15 SHL Test hll debug - FIXME to be gone
-# 25 Jan 20 SHL Add PMPRINTF support - PMPRINTF_OPT CFLAGS
-# 06 Aug 22 GKY Add FM4_NOWARN_DSPACE 
-
-# Environment: see dll\makefile
-
-# DEBUG - not defined = release build, defined = debug build
-# WARNALL - add more warnings if defined
-# FORTIFY - build with FORTIFYed memory
-# USE_RC - build with rc.exe if defined, other build with wrc.exe
-
-CC = wcc386
-LINK = wlink
-
-!ifndef USE_RC			# if not defined on command line
-!ifdef %USE_RC			# if defined in environment
-USE_RC = $(%USE_RC)
-!endif
-!endif
-
-!ifdef USE_RC
-RC = rc -n
-!else
-RC = wrc -q
-!endif
-
-# Keep this code in sync with dll\makefile
-!ifdef DEBUG			# if defined on wmake command line
-DEBUG_OPT = DEBUG=$(DEBUG)	# set in case needed by sub-make
-!else
-!ifdef %DEBUG			# if defined in environment
-DEBUG = $(%DEBUG)		# use value from environment
-DEBUG_OPT = DEBUG=$(DEBUG)	# set in case needed by sub-make
-!endif
-!endif
-
-!ifdef %WARNALL			# if defined in environment
-WARNALL = $(%WARNALL)		# use value from environment
-!endif
-
-!ifdef FORTIFY				# if defined on wmake command line
-FORTIFY_OPT = FORTIFY=$(FORTIFY)	# set in case needed by sub-make
-!else
-!ifdef %FORTIFY				# if defined in environment
-FORTIFY = $(%FORTIFY)			# use value from environment
-FORTIFY_OPT = FORTIFY=$(FORTIFY)	# set in case needed by sub-make
-!endif
-!endif
-
-!ifdef PMPRINTF				# if defined on wmake command line
-PMPRINTF_OPT = PMPRINTF=$(PMPRINTF)	# set in case needed by sub-make
-!else
-!ifdef %PMPRINTF			# if defined in environment
-PMPRINTF = $(%PMPRINTF)			# use value from environment
-PMPRINTF_OPT = PMPRINTF=$(PMPRINTF)	# set in case needed by sub-make
-!endif
-!endif
-
-!ifdef FM4_NOWARN_DSPACE		                        # if defined on wmake command line
-FM4_NOWARN_DSPACE_OPT = FM4_NOWARN_DSPACE=$(FM4_NOWARN_DSPACE)	# set in case needed by sub-make
-!else
-!ifdef %FM4_NOWARN_DSPACE
-FM4_NOWARN_DSPACE = $(%FM4_NOWARN_DSPACE)			# use value from environment
-FM4_NOWARN_DSPACE_OPT = FM4_NOWARN_DSPACE=$(FM4_NOWARN_DSPACE)	# set in case needed by sub-make
-!endif
-!endif
-
-SYMS = $(BASE).sym			# target for building SYM files
-
-# Some flags are order dependent - see OpenWatcom docs
-# -bc		console app
-# -bd		build target is a Dynamic Link Library (DLL) (see bd)
-# -bg		gui app with WinMain entry point
-# -bm		multithread libs
-# -bt=os2	target
-# -d2		full debug
-# -d3		full debug w/unref
-# -hd		dwarf
-# -j		signed char
-# -mf		flat
-# -olinars	optimze loops, inline, e(n)able fp recip, relax (a)lias, reordering, space
-# -s		disable stack checks
-# -sg		generate calls to grow the stack
-# -st		touch stack through SS first
-# -we		treat warnings as errors
-# -wx		max warnings
-# -zfp		disable fs use
-# -zgp		disable gs use
-# -zp4		align 4
-# -zq		quiet
-
-# -wx excludes these
-# See GenCOptions() in openwatcom\bld\cc\c\coptions.c
-# -wce130	possible loss of precision
-# -wcd=303	no reference to formal parameter
-# -wcd=307	obsolete non-prototype declarator
-# -wcd=308	unprototyped function called
-# -wcd=309	unprototyped function called indirectly
-
-# We always compile with debug info to avoid needing a full rebuild just to debug
-# 2015-08-14 SHL HLL debug testing
-# CFLAGS = -bt=os2 -mf -bm -d2 -olirs -s -j -wx -zfp -zgp -zp4 -zq -hc
-CFLAGS = -bt=os2 -mf -bm -d2 -olirs -s -j -wx -zfp -zgp -zp4 -zq -hd
-
-!ifdef WARNALL
-CFLAGS += -wce=118 -wce=130 -wce=303 -wce=307 -wce=308 -wce=309
-!else
-CFLAGS += -we
-!endif
-
-!ifdef FORTIFY
-CFLAGS += -dFORTIFY
-!endif
-
-!ifdef PMPRINTF
-CFLAGS += -dPMPRINTF
-!endif
-
-LFLAGS = sys os2v2_pm op quiet op verbose op cache op caseexact op map sort global
-!ifdef DEBUG
-CFLAGS += -d$DEBUG_OPT
-# 2015-08-14 SHL HLL debug testing
-# LFLAGS += debug hll all
-LFLAGS += debug dwarf all
-!endif
-
-# rc Includes can be in current director or dll subdirectory
-!ifdef USE_RC
-RCFLAGS = -r -i dll
-RCFLAGS2 = -x2
-!else
-# Pass 1 flags
-RCFLAGS = -r -i=dll -ad
-# Pass 2 flags
-RCFLAGS2 =-ad
-!endif
-
-.SUFFIXES:
-.SUFFIXES: .obj .c .res .rc .ipf .sym .map .xqs
-
-!ifdef USE_RC
-.rc.res:
-   @echo.
-   @echo Compiling resource: $*.rc
-   @echo.
-   $(RC) $(RCFLAGS) $*.rc
-   ren $*.res $*.res
-!else
-.rc.res: .AUTODEPEND
-   @echo.
-   @echo Compiling resource: $*.rc
-   @echo.
-  $(RC) $(RCFLAGS) $*.rc
-!endif
-
-.c.obj: .AUTODEPEND
-  $(CC) $(CFLAGS) $*.c
-
-# eof
Index: trunk/option_descriptions.txt
===================================================================
--- trunk/option_descriptions.txt	(revision 1912)
+++ 	(revision )
@@ -1,70 +1,0 @@
-;
-; $Id$
-;
-; This file is read by ReleaseEdit.cmd so that it can build the
-; "option description" lines from scratch.
-;
-; The format of this file should be fairly evident. The descriptions
-; (the last part of "option description", following the '@@') are of
-; the form:
-; 	desc.<relative-def-filename-without-.DEF>
-; So the description for av2.def starts with:
-;       desc.av2=
-; and the description for dll\fm3dll.def starts with:
-;       desc.dll\fm3dll=
-;
-; EVERY def file needs an entry for the description in this file.
-;
-; NOTE: In the copyright portion of the description, use the
-; string "copyright-year" as a placeholder for the current year.
-; ReleaseEdit with replace it with the current year.
-;
-; NOTE: If a description requires a '&', then ReleaseEdit.cmd
-; will have to be modified to use a different separator for the
-; SED find and replace strings! (Search for "sed_separator".)
-;
-; Lines which do not start with desc. are "global" (i.e. they will
-; apply to ALL def files. All of these "global" fields have defaults
-; which ReleaseEdit will use. Certain "global" fields in the option
-; description are omitted because their default values are unlikely
-; to change:
-;   asd_feature_id: <null>
-;   build/file version: 0
-;   fixpack_ver: <null>
-; These defaults can be overriddem by adding appropriate lines to this file.
-;
-; An value may be set to the current setting of an environment variable.
-; See "buildhost" below for an example.
-;
-; If there are duplicate entries (e.g. two desc.databar lines), then
-; the LAST one will be used. So keep these comments up front so they
-; will not be used mistakenly by ReleaseEdit.cmd.
-;
-; Case is significant to the right of the equals sign (except for
-; environment variable names) and insignificant to the left of the equals sign.
-;
-; Change Log
-;   21 Nov 08 JBS Initial version added to SVN repository
-;
-vendor=The Netlabs FM/2 team
-buildhost=%HOSTNAME%
-language_code=EN
-country_code=US
-processor_type=U
-desc.av2=FM/2 Archive Viewer MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, copyright-year Steven Levine and Associates, Inc. All rights reserved
-desc.databar=FM/2 Databar MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, copyright-year Steven Levine and Associates, Inc. All rights reserved
-desc.dirsize=FM/2 Directory Sizes MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, copyright-year Steven Levine and Associates, Inc. All rights reserved
-desc.eas=FM/2 EA Editor MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, copyright-year Steven Levine and Associates, Inc. All rights reserved
-desc.fm3=F(ile) M(anager)/2 Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, copyright-year Steven Levine and Associates, Inc. All rights reserved
-desc.fm4=F(ile) M(anager)/2 Lite Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, copyright-year Steven Levine and Associates, Inc. All rights reserved
-desc.global=FM/2 Global MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, copyright-year Steven Levine and Associates, Inc. All rights reserved
-desc.ini=FM/2 INI Editor MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, copyright-year Steven Levine and Associates, Inc. All rights reserved
-desc.killproc=FM/2 Kill Process MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, copyright-year Steven Levine and Associates, Inc. All rights reserved
-desc.sysinfo=FM/2 SysInfo MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, copyright-year Steven Levine and Associates, Inc. All rights reserved
-desc.undel=FM/2 Undelete MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, copyright-year Steven Levine and Associates, Inc. All rights reserved
-desc.vcollect=FM/2 Collector MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, copyright-year Steven Levine and Associates, Inc. All rights reserved
-desc.vdir=FM/2 View Directory MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, copyright-year Steven Levine and Associates, Inc. All rights reserved
-desc.viewinfs=FM/2 View INFs MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, copyright-year Steven Levine and Associates, Inc. All rights reserved
-desc.vtree=FM/2 Tree View MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, copyright-year Steven Levine and Associates, Inc. All rights reserved
-desc.dll\fm3dll=FM/2 Runtime DLL Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, copyright-year Steven Levine and Associates, Inc. All rights reserved
-desc.dll\fm3res=FM/2 Runtime Resource DLL Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, copyright-year Steven Levine and Associates, Inc. All rights reserved
Index: trunk/quicktls.tmp
===================================================================
--- trunk/quicktls.tmp	(revision 1912)
+++ 	(revision )
@@ -1,14 +1,0 @@
-;
-;Sample quick toolbars for FM/2
-;
-cmds.tls
-utils.tls
-sort.tls
-select.tls
-config.tls
-files.tls
-views.tls
-fm3tools.dat
-;
-; $Id$
-
Index: trunk/select.tmp
===================================================================
--- trunk/select.tmp	(revision 1912)
+++ 	(revision )
@@ -1,116 +1,0 @@
-; Fixed: Ticket 267
-;
-;This file contains some selecting definitions for the FM/2 toolbar.
-;
-;
-Select All
-+All
-0
-10006
-;
-Deselect All
--All
-8
-10007
-;
-Select Files
-+Files
-0
-10008
-;
-Deselect Files
--Files
-8
-10009
-;
-Select Dirs
-+Dirs
-0
-10010
-;
-Deselect Dirs
--Dirs
-8
-10011
-;
-Reselect
-Reslct
-0
-10027
-;
-Invert selections
-Invert
-8
-10014
-;
-Select List
-+List
-0
-10033
-;
-Select Clipboard
-+Clip
-0
-10028
-;
-Deselect Clipboard
--Clip
-8
-10029
-;
-Select Mask
-+Mask
-0
-10012
-;
-Deselect Mask
--Mask
-8
-10013
-;
-Make Directory (Ctrl + M)
-MakeDir
-0
-1026
-;
-Rescan (Ctrl + R)
-Rescan
-0
-5021
-;
-Print Files (Ctrl + p)
-Print
-9
-1007
-;
-Exit FM2 (Ctrl + F3)
-Exit
-8
-1111
-;
-Commands toolbar
-Cmds
-0
-4900
-;
-Utility toolbar
-Utils
-0
-4901
-;
-Sort toolbar
-Sort
-0
-4902
-;
-Configuration toolbar
-Config
-0
-4904
-;
-Files toolbar
-Files
-8
-4905
-;
-; $Id$
Index: trunk/shdwmgr.cmd
===================================================================
--- trunk/shdwmgr.cmd	(revision 1912)
+++ 	(revision )
@@ -1,103 +1,0 @@
-/*
- * $Id$
- *
- * ShdwMgr: Create Shadows for FM/2 installation
- *
- * 14 Feb 14  JBS Ticket 501: Corrected a syntax error and improved the error handling.
- *                            Errors are now logged to a file.
- *
- */
-
-call RxFuncAdd 'SysLoadFuncs', 'REXXUTIL', 'SysLoadFuncs'
-call SysLoadFuncs
-
-parse source . . thispgm
-thisdir = left(thispgm, lastpos('\', thispgm) - 1)
-if length(thisdir) = 2 then
-   thisdir = thisdir || '\'
-call directory thisdir
-parse value filespec('N', thispgm) with program_stem '.' .
-
-parse upper arg package_parm .
-if strip(package_parm) == '' then
-   package_parm = 'FM2'
-pkgnum = wordpos(package_parm, 'FM2 FM2UTILS')
-
-error_log = program_stem || pkgnum || '.err'
-call SysFileDelete error_log              /* Delete previous error logs for this package */
-errors = 0
-
-if pkgnum = 0 then
-   do
-      call lineout error_log, 'Invalid parameter:' package_parm
-      call lineout error_log, 'Program aborted....'
-      exit 1
-   end
-
-i = 0
-
-i = i + 1
-Shadow.i.package  = 'FM2'
-Shadow.i.folderid = '<FM3_Docs>'
-Shadow.i.filename = '..\docs\readme'
-Shadow.i.longname = 'Read Me'
-
-i = i + 1
-Shadow.i.package  = 'FM2'
-Shadow.i.folderid = '<FM3_Docs>'
-Shadow.i.filename = '..\docs\copying'
-Shadow.i.longname = 'GNU General Public License'
-
-i = i + 1
-Shadow.i.package  = 'FM2'
-Shadow.i.folderid = '<FM3_Docs>'
-Shadow.i.filename = '..\docs\history'
-Shadow.i.longname = 'History'
-
-i = i + 1
-Shadow.i.package  = 'FM2UTILS'
-Shadow.i.folderid = '<FM2_Utilities>'
-Shadow.i.filename = '.\fm2utils.doc'
-Shadow.i.longname = 'FM/2 Utilities Read Me'
-
-Shadow.0 = i
-
-do i = 1 to Shadow.0
-   if package_parm = Shadow.i.package then
-      do
-         fullfilename = stream(thisdir || '\' || Shadow.i.filename, 'c', 'query exists')
-         if fullfilename = '' then
-            do
-               call lineout error_log, 'Unable to find file: 'Shadow.i.filename
-               errors = errors + 1
-            end
-         else
-            do
-               lenbytes = X2C( D2X( LENGTH( Shadow.i.longname ), 4 ))
-               rc = SysPutEA( fullfilename, '.LONGNAME', X2C('FDFF') || REVERSE( lenbytes ) || Shadow.i.longname )
-               if rc \= 0 then
-                  do
-                     call lineout error_log, 'Error in setting .LONGNAME EA: 'rc
-                     errors = errors + 1
-                  end
-
-               p = lastpos('\', Shadow.i.filename)
-               if p > 0 then
-                  shadowidname = substr(Shadow.i.filename, p + 1)
-               else
-                  shadowidname = Shadow.i.filename
-               rc = SysCreateObject( 'WPShadow', Shadow.i.longname, Shadow.i.folderid , 'SHADOWID='fullfilename';OBJECTID=<FM3_Shadow_'shadowidname'>;', 'R')
-               if rc \= 1 then
-                  do
-                     call lineout error_log, 'Unable to create shadow object for :'Shadow.i.filename
-                     errors = errors + 1
-                  end
-            end
-      end
-end
-if errors > 0 then
-   do
-      call lineout error_log, errors 'errors encountered.'
-      call stream error_log, 'c', 'close'
-   end
-
Index: trunk/sort.tmp
===================================================================
--- trunk/sort.tmp	(revision 1912)
+++ 	(revision )
@@ -1,95 +1,0 @@
-; Fixed: Ticket 267
-;
-;This file contains some sorting definitions for the FM/2 toolbar.
-;
-;
-Filter Container
-Filter
-8
-5001
-;
-Sort by filename
-Name
-0
-3005
-;
-Sort by size
-Size
-0
-3006
-;
-Sort by EA size
-EAsz
-0
-3007
-;
-Sort by first extension
-1st
-0
-3008
-;
-Sort by last extension
-Last
-0
-3009
-;
-Sort by lastwrite date
-Lw Date
-0
-3010
-;
-Sort by create date
-Cr Date
-8
-3012
-;
-Reverse sort
-Rev
-8
-3015
-;
-Make Directory (Ctrl + M)
-MakeDir
-0
-1026
-;
-Rescan (Ctrl + R)
-Rescan
-0
-5021
-;
-Print Files (Ctrl + p)
-Print
-9
-1007
-;
-Exit FM2 (Ctrl + F3)
-Exit
-8
-1111
-;
-Commands toolbar
-Cmds
-0
-4900
-;
-Utility toolbar
-Utils
-0
-4901
-;
-Select toolbar
-Select
-0
-4903
-Configuration toolbar
-Config
-0
-4904
-;
-Files toolbar
-Files
-8
-4905
-;
-; $Id$
Index: trunk/sysinfo.c
===================================================================
--- trunk/sysinfo.c	(revision 1912)
+++ 	(revision )
@@ -1,57 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  System information applet
-
-  Copyright (c) 1993-98 M. Kimes
-  Copyright (c) 2008 Steven H.Levine
-
-  05 Jan 08 SHL Sync
-  14 Dec 08 SHL Add exception handler support
-
-***********************************************************************/
-
-#define INCL_WIN
-#define INCL_DOSEXCEPTIONS		// XCTP_...
-#define INCL_DOSERRORS			// NO_ERROR
-
-#include "dll\fm3dll.h"
-#include "dll\mainwnd.h"		// FM3ModHandle
-#include "dll\fm3dlg.h"
-#include "dll\init.h"			// InitFM3DLL
-#include "dll\sysinfo.h"		// SysInfoDlgProc
-#include "dll\errutil.h"		// Error reporting
-#include "dll\excputil.h"		// Exception handlers
-
-static PSZ pszSrcFile = __FILE__;
-
-int main(int argc, char *argv[])
-{
-  HAB hab;
-  HMQ hmq;
-  APIRET regRet;
-  EXCEPTIONREGISTRATIONRECORD regRec = { NULL, NULL };
-
-  regRec.ExceptionHandler = HandleException;
-  regRet = DosSetExceptionHandler(&regRec);
-  if (regRet != NO_ERROR) {
-    DbgMsg(pszSrcFile, __LINE__,
-	   "DosSetExceptionHandler failed with error %u", regRet);
-  }
-
-  hab = WinInitialize(0);
-  if (hab) {
-    hmq = WinCreateMsgQueue(hab, 256);
-    if (hmq) {
-      if (InitFM3DLL(hab, argc, argv)) {
-	WinDlgBox(HWND_DESKTOP, HWND_DESKTOP,
-		  SysInfoDlgProc, FM3ModHandle, SYS_FRAME, NULL);
-      }
-      WinDestroyMsgQueue(hmq);
-    }
-    WinTerminate(hab);
-  }
-  return 0;
-}
Index: trunk/sysinfo.def
===================================================================
--- trunk/sysinfo.def	(revision 1912)
+++ 	(revision )
@@ -1,9 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2009 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-
-option description '@#The Netlabs FM/2 team:3.25.0#@##1## 2024-06-02 03:25:00      ZOBOPEEP::EN:US:0:U:@@FM/2 SysInfo MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, 2024 Steven Levine and Associates, Inc. All rights reserved'
-
-option stack = 0x50000
Index: trunk/sysinfo.mak
===================================================================
--- trunk/sysinfo.mak	(revision 1912)
+++ 	(revision )
@@ -1,24 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2007 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-# 23 Feb 08 JBS Add support for building SYM files
-# 04 Jul 11 GKY Make xqs files an explicit target so they will be rebuild if lost somehow.
-
-BASE=sysinfo
-
-!include makefile_pre.mk
-
-all: $(BASE).exe $(BASE).res .symbolic
-
-sym: $(BASE).sym $(BASE).xqs .symbolic
-
-$(BASE).res: $(BASE).rc icons\$(BASE).ico
-
-$(BASE).obj: $(BASE).c
-
-!include makefile_post.mk
-
-# The end
-
Index: trunk/sysinfo.rc
===================================================================
--- trunk/sysinfo.rc	(revision 1912)
+++ 	(revision )
@@ -1,16 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  sysinfo resources
-
-  Copyright (c) 1993-02 M. Kimes
-  Copyright (c) 2008 Steven H.Levine
-
-  15 Oct 02 MK Baseline
-  04 Jan 08 SHL Sync with fm3dll.h mods
-
-***********************************************************************/
-
-DEFAULTICON                 icons\SYSINFO.ICO
Index: trunk/undel.c
===================================================================
--- trunk/undel.c	(revision 1912)
+++ 	(revision )
@@ -1,92 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  File undelete applet
-
-  Copyright (c) 1993-98 M. Kimes
-  Copyright (c) 2007, 2008 Steven H. Levine
-
-  23 Sep 07 SHL Sync with standards
-  23 Sep 07 SHL Get rid of statics
-  14 Dec 08 SHL Add exception handler support
-
-***********************************************************************/
-
-#include <string.h>
-
-#define INCL_DOS
-#define INCL_DOSEXCEPTIONS		// XCTP_...
-#define INCL_DOSERRORS			// NO_ERROR
-
-#include "dll\fm3dll.h"
-#include "dll\mainwnd.h"		// FM3ModHandle
-#include "dll\fm3dlg.h"
-#include "dll\undel.h"			// UndeleteDlgProc
-#include "dll\init.h"			// InitFM3DLL
-#include "dll\valid.h"			// MakeValidDir
-#include "dll\dirs.h"			// save_dir
-#include "dll\errutil.h"		// Error reporting
-#include "dll\excputil.h"		// Exception handlers
-
-static PSZ pszSrcFile = __FILE__;
-
-int main(int argc, char *argv[])
-{
-  HAB hab;
-  HMQ hmq;
-  FILESTATUS3 fs;
-  CHAR fullname[CCHMAXPATH];
-  PSZ thisarg = NULL;
-  UINT x;
-  APIRET regRet;
-  EXCEPTIONREGISTRATIONRECORD regRec = { NULL, NULL };
-
-  DosError(FERR_DISABLEHARDERR);
-
-  regRec.ExceptionHandler = HandleException;
-  regRet = DosSetExceptionHandler(&regRec);
-  if (regRet != NO_ERROR) {
-    DbgMsg(pszSrcFile, __LINE__,
-	   "DosSetExceptionHandler failed with error %u", regRet);
-  }
-
-  for (x = 1; x < argc; x++) {
-    if (!strchr("/;,`\'", *argv[x]) && !thisarg) {
-      thisarg = argv[x];
-      break;
-    }
-  }
-  if (!thisarg) {
-    thisarg = fullname;
-    save_dir(fullname);
-  }
-  DosError(FERR_DISABLEHARDERR);
-  if (thisarg && !DosQueryPathInfo(thisarg, FIL_STANDARD, &fs, sizeof(fs))) {
-    if (DosQueryPathInfo(thisarg,
-			 FIL_QUERYFULLNAME, fullname, sizeof(fullname)))
-      strcpy(fullname, thisarg);
-    hab = WinInitialize(0);
-    if (hab) {
-      hmq = WinCreateMsgQueue(hab, 256);
-      if (hmq) {
-	if (InitFM3DLL(hab, argc, argv)) {
-	  MakeValidDir(fullname);
-	  WinDlgBox(HWND_DESKTOP,
-		    HWND_DESKTOP,
-		    UndeleteDlgProc,
-		    FM3ModHandle,
-		    UNDEL_FRAME,
-		    fullname);
-	}
-	DosSleep(250);
-	WinDestroyMsgQueue(hmq);
-      }
-      WinTerminate(hab);
-    }
-  }
-  else
-    DosBeep(250, 100);
-  return 0;
-}
Index: trunk/undel.def
===================================================================
--- trunk/undel.def	(revision 1912)
+++ 	(revision )
@@ -1,9 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2009 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-
-option description '@#The Netlabs FM/2 team:3.25.0#@##1## 2024-06-02 03:25:00      ZOBOPEEP::EN:US:0:U:@@FM/2 Undelete MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, 2024 Steven Levine and Associates, Inc. All rights reserved'
-
-option stack = 0x50000
Index: trunk/undel.mak
===================================================================
--- trunk/undel.mak	(revision 1912)
+++ 	(revision )
@@ -1,24 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2007 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-# 23 Feb 08 JBS Add support for building SYM files
-# 04 Jul 11 GKY Make xqs files an explicit target so they will be rebuild if lost somehow.
-
-BASE=undel
-
-!include makefile_pre.mk
-
-all: $(BASE).exe $(BASE).res .symbolic
-
-sym: $(BASE).sym $(BASE).xqs .symbolic
-
-$(BASE).res: $(BASE).rc icons\$(BASE).ico
-
-$(BASE).obj: $(BASE).c
-
-!include makefile_post.mk
-
-# The end
-
Index: trunk/undel.rc
===================================================================
--- trunk/undel.rc	(revision 1912)
+++ 	(revision )
@@ -1,16 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  undel resources
-
-  Copyright (c) 1993-02 M. Kimes
-  Copyright (c) 2008 Steven H.Levine
-
-  15 Oct 02 MK Baseline
-  04 Jan 08 SHL Sync with fm3dll.h mods
-
-***********************************************************************/
-
-DEFAULTICON                 icons\UNDEL.ICO
Index: trunk/uninstal.cmd
===================================================================
--- trunk/uninstal.cmd	(revision 1912)
+++ 	(revision )
@@ -1,122 +1,0 @@
-/*****************************************************************************
- *                        FM/2 deinstallation program                        *
- *****************************************************************************
- *                                                                           *
- * This program removes the FM/2 folder and any OS2USER.INI records          *
- * for FM/2.  Optionally it will wipe all files and remove all directories   *
- * created by the FM/2 installation program.  Run from the FM/2 directory.   *
- *                                                                           *
- *****************************************************************************
- * For unattended deinstallation, call with /UNATTENDED as the first         *
- * argument.                                                                 *
- *****************************************************************************
- *                                                                           *
- *                        UNINSTAL /? for usage help.                        *
- *                                                                           *
- *****************************************************************************/
-
-'@Echo off'
-'cls'
-'echo  ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿'
-'echo  ³                   FM/2 Deinstallation Program                     ³'
-'echo  ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ'
-
-/* see if we might be in the right directory... */
-
-curdir = directory()
-
-rc = stream('fm3.exe','c','query exists')
-if rc = '' then
-do
-  say 'Sorry, FM3.EXE not found.  Must not be right directory.  Terminating.'
-  exit
-end
-
-/* tell user what we're doing, give him a chance to hit CTRL-C */
-
-say ''
-say ' **WARNING:  This program uninstalls FM/2.'
-say ''
-
-parse upper arg dummy
-
-if dummy = '/?' then
-do
-  say ''
-  say 'Usage:  UNINSTAL [/UNATTENDED]'
-  say ''
-  say ' /UNATTENDED          don''t ask any questions; run without stopping.'
-  say ''
-  say 'Examples:'
-  say ' UNINSTAL'
-  say ' UNINSTAL /UNATTENDED'
-  exit
-end
-
-if dummy = '/UNATTENDED' then unattended = ''
-if unattended = '' then say '     /UNATTENDED = TRUE'
-
-if unattended = 'UNATTENDED' then
-do
-  say 'Press [Enter] (or CTRL-C then [Enter] to abort).'
-  Pull dummy .
-  say ''
-  /* to be extra safe... */
-  if dummy \= '' then
-  do
-    say 'Something besides just [Enter] pressed -- aborting.'
-    exit
-  end
-end
-
-/* load rexx utility functions */
-
-call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
-call SysLoadFuncs
-
-say 'Working...'
-
-/* remove FM/2 folder object */
-call SysDestroyObject "<FM3_Folder>"
-
-/* remove all FM/2-related information from user ini file */
-call SysIni 'USER', 'FM/2'
-call SysIni 'USER', 'FM2'
-call SysIni 'USER', 'FM/3'
-call SysIni 'USER', 'FM/4'
-
-/* done */
-
-dummy = ''
-if unattended = 'UNATTENDED' then
-do
-  say ''
-  say "Delete programs and directories "curdir
-  say "and "curdir"\utils"
-  say "as follows, and then you're done:"
-  say "CD\"
-  say "DEL "curdir"\UTILS\*"
-  say "RMDIR "curdir"\UTILS"
-  say "DEL "curdir"\*"
-  say "RMDIR "curdir
-  say ""
-  say "Shall I perform these tasks for you?"
-  parse upper pull dummy
-end
-else dummy = 'Y'
-
-if left(dummy,1) = 'Y' then
-do
-  'CD\'
-  '@ECHO ON'
-  'ECHO Y | DEL 'curdir'\UTILS\* && RD 'curdir'\UTILS'
-  'ECHO Y | DEL 'curdir'\* && RD 'curdir
-  '@ECHO OFF'
-end
-else say "Okay, it's a simple enough operation that even a human can do it. :-)"
-
-say ""
-say "Don't forget to remove any PATH statements from CONFIG.SYS that you"
-say "entered for FM/2 or its utilities."
-say ""
-say "I'm done now."
Index: trunk/utils.tmp
===================================================================
--- trunk/utils.tmp	(revision 1912)
+++ 	(revision )
@@ -1,162 +1,0 @@
-; Fixed: Ticket 267
-;
-;This file contains some utility definitions for the FM/2 toolbar.
-;FM/2 saved this file as "<DRIVE>:\FM2\UTILS.TLS".
-;
-;Each tool button has four lines that describe it.  The first line is
-;the help for the button.
-;
-;The second line is the text for the button (internally defined tools
-;have icons, and the text is ignored).
-;
-;The third line is a number indicating flags associated with the button.
-;A flag value of 0 means the button is non-droppable, 1 means the button
-;is droppable, 4 means invisible (5 both), 8 means non-droppable with a
-;spacer following, and 9 means droppable with a spacer following.
-;
-;The fourth line is the ID of the button (for internal commands only).
-;Note Commands begin at ID 4000, so a button with ID 4000 would cause
-;the first Command to be run and ID 4001 would run the second, and so on.
-;4900 marks the first "quick toolbox change" item, and you can
-;have up to 50 of them (these buttons load other toolboxes, see
-;online help).
-;
-;You can use \r in the help string to break the help into multiple lines.
-;
-;
-Collect Files/Directories (Ctrl + C)
-Collect
-0
-1011
-;
-See all files
-SeeAll
-0
-1067
-;
-Window Dialog (Ctrl + W)
-Windws
-0
-9010
-;
-Directory Sizes (Ctrl + Z)
-DirSiz
-0
-1031
-;
-Kill Process
-KillPrc
-0
-2003
-;
-Seek and Scan for files
-SeekScan
-8
-1047
-;
-Edit Files (Ctrl + e)
-Edit
-1
-1024
-;
-Extended Attributes
-EAs
-1
-1008
-;
-View INI Files
-INIs
-1
-2001
-;
-Edit Associations
-Assoc
-0
-3001
-;
-Set Attributes and Date/Time of Files/Directories (Ctrl + a)
-Attribs
-9
-1009
-;
-Instant Command File
-Instant
-0
-2006
-;
-OS/2 Command Line (F9)
-OS/2
-8
-2007
-;
-INF Bookshelf viewer
-InfBooks
-0
-2010
-;
-HLP Bookshelf viewer
-HlpBooks
-8
-2011
-;
-Play Multimedia (Ctrl + l)
-Play
-9
-1058
-;
-Settings Notebook
-Setngs
-0
-3059
-;
-FM/2 Help (Ctrl + k)
-Help
-8
-999
-;
-Make Directory (Ctrl + M)
-MakeDir
-0
-1026
-;
-Rescan (Ctrl + R)
-Rescan
-0
-5021
-;
-Print Files (Ctrl + p)
-Print
-9
-1007
-;
-Exit FM2 (Ctrl + F3)
-Exit
-8
-1111
-;
-Commands toolbar
-Cmds
-0
-4900
-;
-Sort toolbar
-Sort
-0
-4902
-;
-Select toolbar
-Select
-0
-4903
-;
-Configuration toolbar
-Config
-0
-4904
-;
-Files toolbar
-Files
-8
-4905
-;
-; $Id$
Index: trunk/utilsmgr.cmd
===================================================================
--- trunk/utilsmgr.cmd	(revision 1912)
+++ 	(revision )
@@ -1,818 +1,0 @@
-/*
-   UTILSMGR - FM/2 program which is used to install various CMD files
-   which facilitate access to FM/2 and its associated utilities from
-   the command line.
-
-   For unattended operation, call with /UNATTENDED argument.
-
-   For usage help, run as MKUTILS /?
-
-   List of CMD files:
-      FM2.CMD
-      AV2.CMD
-      DIRSIZE.CMD
-      EAS.CMD
-      GLOBAL.CMD
-      INI.CMD
-      KILLPROC.CMD
-      UNDEL.CMD
-      VCOLLECT.CMD
-      VDIR.CMD
-      VIEWHELP.CMD
-      VIEWINFS.CMD
-      VTREE.CMD
-
-
-*/
-
-n = setlocal()
-
-signal on novalue
-
-/* Identify ourself */
-
-/*
-'@echo off'
-'cls'
-
-say'     ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿'
-say'     ³                    FM/2 Installation Program                      ³'
-say'     ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ'
-*/
-
-/* set defaults, check arguments and adjust as required */
-
-attended = 1
-delete   = 0
-
-parse upper arg tail
-do while tail \= ''
-  parse var tail curarg tail
-  curarg = strip(curarg)
-  /* if user asked for usage help, give it */
-  if curarg = '/?' then do
-    call report ''
-    call report 'Usage:  MKUTILS [/DELETE] [/UNATTENDED]'
-    call report ''
-    call report ' /DELETE              Remove the CMD files'
-    call report ' /UNATTENDED          don''t ask any questions; run without stopping.'
-    call report ''
-    call report 'Examples:'
-    call report ' MKUTILS'
-    call report ' MKUTILS /UNATTENDED'
-    call report ' MKUTILS /DELETE'
-    call report ' MKUTILS /DELETE /UNATTENDED'
-    exit
-  end
-  if curarg = '/DELETE' then delete = 1
-  else if curarg = '/UNATTENDED' then attended = 0
-end
-
-if attended = 1 then
-   do
-      if delete   = 1 then call report '     /DELETE     = TRUE'
-                           call report '     /UNATTENDED = FALSE'
-   end
-
-parse source . . thispgm
-thisdir           = left(thispgm, lastpos('\', thispgm) - 1)
-if length(thisdir) = 2 then
-   thisdir = thisdir || '\'
-call directory thisdir
-
-/* see if we might be in the right directory... */
-
-/*
-if delete = 1 then
-   checkfile = 'setenv.cmd'
-else
-   checkfile = 'fm3.exe'
-*/
-checkfile = 'fm3.exe'
-rc = stream(checkfile,'c','query exists')
-if rc = '' then
-do
-  call report 'Sorry, 'checkfile' not found.  Must not be right directory.  Terminating.'
-  call beep 100,100
-  exit
-end
-
-/* load rexx utility functions */
-
-call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
-call SysLoadFuncs
-
-/* give user a chance to hit CTRL-C */
-
-if attended then do
-  call charout ,'  Press [Enter] to continue...'
-  ans = ''
-  do until ans = '0d'x
-    ans = SysGetKey('NOECHO')
-  end
-  call charout ,'0d1b'x'[K'
-end
-
-if delete = 0 then
-   call CreateCmds directory()
-else
-   call DeleteCmds
-
-call report 'Done.'
-n = endlocal()
-exit
-
-
-/* Subroutines */
-DeleteCmds: procedure
-   'if exist SETENV.CMD del SETENV.CMD  1>NUL 2>NUL'
-   'if exist Utils\FM2.CMD del Utils\FM2.CMD  1>NUL 2>NUL'
-   'if exist Utils\AV2.CMD del Utils\AV2.CMD 1>NUL 2>NUL'
-   'if exist Utils\DIRSIZE.CMD del Utils\DIRSIZE.CMD 1>NUL 2>NUL'
-   'if exist Utils\EAS.CMD del Utils\EAS.CMD 1>NUL 2>NUL'
-   'if exist Utils\GLOBAL.CMD del Utils\GLOBAL.CMD 1>NUL 2>NUL'
-   'if exist Utils\INI.CMD del Utils\INI.CMD 1>NUL 2>NUL'
-   'if exist Utils\KILLPROC.CMD del Utils\KILLPROC.CMD 1>NUL 2>NUL'
-   'if exist Utils\UNDEL.CMD del Utils\UNDEL.CMD 1>NUL 2>NUL'
-   'if exist Utils\VCOLLECT.CMD del Utils\VCOLLECT.CMD 1>NUL 2>NUL'
-   'if exist Utils\VDIR.CMD del Utils\VDIR.CMD 1>NUL 2>NUL'
-   'if exist Utils\VIEWHELP.CMD del Utils\VIEWHELP.CMD 1>NUL 2>NUL'
-   'if exist Utils\VIEWINFS.CMD del Utils\VIEWINFS.CMD 1>NUL 2>NUL'
-   'if exist Utils\VTREE.CMD del Utils\VTREE.CMD 1>NUL 2>NUL'
-   'rd Utils 1>NUL 2>NUL'
-return
-
-CreateCmds: procedure expose attended
-   parse arg curdir
-   /*
-    * create command files that the user can execute from anywhere (we'll
-    * ask the user to put this utils directory on the PATH) and that other
-    * programs can execute to use FM/2 as "their" file manager.
-    */
-   /* say it, then do it */
-   call report "Creating File Manager/2 folders and objects..."
-
-   'del SETENV.CMD 1>NUL 2>NUL'
-   rc = stream('SETENV.CMD','C','open')
-   if rc = 'READY:' then
-   do
-     call lineout 'SETENV.CMD','@ECHO OFF'
-     call lineout 'SETENV.CMD','REM'
-     call lineout 'SETENV.CMD','REM If you prefer, you can call this .CMD file'
-     call lineout 'SETENV.CMD','REM instead of altering the PATH= statement in'
-     call lineout 'SETENV.CMD','REM CONFIG.SYS to gain access to the FM/2'
-     call lineout 'SETENV.CMD','REM command line utilities.'
-     call lineout 'SETENV.CMD','REM'
-     call lineout 'SETENV.CMD','IF "%FM2ENVSET%" == "" GOTO INSTALL'
-     call lineout 'SETENV.CMD','GOTO SKIP'
-     call lineout 'SETENV.CMD',':INSTALL'
-     call lineout 'SETENV.CMD','SET FM2ENVSET=YES'
-     call lineout 'SETENV.CMD','SET PATH=%PATH%;'curdir'\Utils;'
-     call lineout 'SETENV.CMD','SET BEGINLIBPATH='curdir
-     call lineout 'SETENV.CMD','SET FM3INI='curdir
-     call lineout 'SETENV.CMD','ECHO Path set for FM/2 and utilities.'
-     call lineout 'SETENV.CMD','GOTO END'
-     call lineout 'SETENV.CMD',':SKIP'
-     call lineout 'SETENV.CMD','ECHO Paths already set for FM/2 and utilities.'
-     call lineout 'SETENV.CMD',':END'
-     call stream 'SETENV.CMD','C','close'
-   end
-
-   /*
-    * place an object for SETENV.CMD in folder so user doesn't have to diddle
-    * their PATH statement if they don't want to for command line work.
-    */
-
-   rc = stream('SETENV.CMD','c','query exists')
-/*
-   if rc \= '' then
-   do
-     shell = value('COMSPEC',,'OS2ENVIRONMENT')
-     if shell = '' then shell = value('OS2_SHELL',,'OS2ENVIRONMENT')
-     if shell = '' then shell = 'CMD.EXE'
-     title = "FM/2 Utilities command line"
-     classname = 'WPProgram'
-     location = '<FM3_Tools>'
-     setup = 'EXENAME='shell';PARAMETERS=/K 'rc';STARTUPDIR=?:\'
-     call SysCreateObject classname,title,location,setup,'u'
-   end
-*/
-
-   call SysMkDir curdir'\Utils'
-   if translate(directory(curdir'\Utils')) \= translate(curdir'\Utils') then
-     call report "Couldn't switch to "curdir"\Utils"
-   else
-   do
-     'set PATH=%PATH%;'curdir'\Utils'
-/*
-     'move ..\example.cmd 1>NUL 2>NUL'
-*/
-     'del FM2.CMD 1>NUL 2>NUL'
-     rc = stream('FM2.CMD','C','open')
-     if rc = 'READY:' then
-     do
-       call report 'Creating an FM2.CMD file.'
-       call lineout 'FM2.CMD', "/* FM/2 command file.  Locate in a directory"
-       call lineout 'FM2.CMD', " * on your PATH. */"
-       call lineout 'FM2.CMD', "'@echo off'"
-         call lineout 'FM2.CMD', "mydir = directory()"
-         call lineout 'FM2.CMD', "arg arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9"
-         call lineout 'FM2.CMD', "if arg1 \= '' then "
-         call lineout 'FM2.CMD', "do"
-         call lineout 'FM2.CMD', "  if left(arg1,1,1) \= '/' then"
-         call lineout 'FM2.CMD', "  do"
-         call lineout 'FM2.CMD', "    arg0 = arg1"
-         call lineout 'FM2.CMD', "    arg1 = stream(arg1,'c','query exists')"
-         call lineout 'FM2.CMD', "    if arg1 = '' then"
-         call lineout 'FM2.CMD', "    do"
-         call lineout 'FM2.CMD', "      arg1 = directory(arg0)"
-         call lineout 'FM2.CMD', "      call directory mydir"
-         call lineout 'FM2.CMD', "    end"
-         call lineout 'FM2.CMD', "  end"
-         call lineout 'FM2.CMD', "end"
-         call lineout 'FM2.CMD', "else arg1 = mydir"
-         call lineout 'FM2.CMD', "if arg2 \= '' then "
-         call lineout 'FM2.CMD', "do"
-         call lineout 'FM2.CMD', "  if left(arg2,1,1) \= '/' then"
-         call lineout 'FM2.CMD', "  do"
-         call lineout 'FM2.CMD', "    arg0 = arg2"
-         call lineout 'FM2.CMD', "    arg2 = stream(arg2,'c','query exists')"
-         call lineout 'FM2.CMD', "    if arg2 = '' then"
-         call lineout 'FM2.CMD', "    do"
-         call lineout 'FM2.CMD', "      arg2 = directory(arg0)"
-         call lineout 'FM2.CMD', "      call directory mydir"
-         call lineout 'FM2.CMD', "    end"
-         call lineout 'FM2.CMD', "  end"
-         call lineout 'FM2.CMD', "end"
-         call lineout 'FM2.CMD', "if arg3 \= '' then "
-         call lineout 'FM2.CMD', "do"
-         call lineout 'FM2.CMD', "  if left(arg3,1,1) \= '/' then"
-         call lineout 'FM2.CMD', "  do"
-         call lineout 'FM2.CMD', "    arg0 = arg3"
-         call lineout 'FM2.CMD', "    arg3 = stream(arg3,'c','query exists')"
-         call lineout 'FM2.CMD', "    if arg3 = '' then"
-         call lineout 'FM2.CMD', "    do"
-         call lineout 'FM2.CMD', "      arg3 = directory(arg0)"
-         call lineout 'FM2.CMD', "      call directory mydir"
-         call lineout 'FM2.CMD', "    end"
-         call lineout 'FM2.CMD', "  end"
-         call lineout 'FM2.CMD', "end"
-         call lineout 'FM2.CMD', "if arg4 \= '' then "
-         call lineout 'FM2.CMD', "do"
-         call lineout 'FM2.CMD', "  if left(arg4,1,1) \= '/' then"
-         call lineout 'FM2.CMD', "  do"
-         call lineout 'FM2.CMD', "    arg0 = arg4"
-         call lineout 'FM2.CMD', "    arg4 = stream(arg4,'c','query exists')"
-         call lineout 'FM2.CMD', "    if arg4 = '' then"
-         call lineout 'FM2.CMD', "    do"
-         call lineout 'FM2.CMD', "      arg4 = directory(arg0)"
-         call lineout 'FM2.CMD', "      call directory mydir"
-         call lineout 'FM2.CMD', "    end"
-         call lineout 'FM2.CMD', "  end"
-         call lineout 'FM2.CMD', "end"
-         call lineout 'FM2.CMD', "if arg5 \= '' then "
-         call lineout 'FM2.CMD', "do"
-         call lineout 'FM2.CMD', "  if left(arg5,1,1) \= '/' then"
-         call lineout 'FM2.CMD', "  do"
-         call lineout 'FM2.CMD', "    arg0 = arg5"
-         call lineout 'FM2.CMD', "    arg5 = stream(arg5,'c','query exists')"
-         call lineout 'FM2.CMD', "    if arg5 = '' then"
-         call lineout 'FM2.CMD', "    do"
-         call lineout 'FM2.CMD', "      arg5 = directory(arg0)"
-         call lineout 'FM2.CMD', "      call directory mydir"
-         call lineout 'FM2.CMD', "    end"
-         call lineout 'FM2.CMD', "  end"
-         call lineout 'FM2.CMD', "end"
-         call lineout 'FM2.CMD', "if arg6 \= '' then "
-         call lineout 'FM2.CMD', "do"
-         call lineout 'FM2.CMD', "  if left(arg6,1,1) \= '/' then"
-         call lineout 'FM2.CMD', "  do"
-         call lineout 'FM2.CMD', "    arg0 = arg6"
-         call lineout 'FM2.CMD', "    arg6 = stream(arg6,'c','query exists')"
-         call lineout 'FM2.CMD', "    if arg6 = '' then"
-         call lineout 'FM2.CMD', "    do"
-         call lineout 'FM2.CMD', "      arg6 = directory(arg0)"
-         call lineout 'FM2.CMD', "      call directory mydir"
-         call lineout 'FM2.CMD', "    end"
-         call lineout 'FM2.CMD', "  end"
-         call lineout 'FM2.CMD', "end"
-         call lineout 'FM2.CMD', "if arg7 \= '' then "
-         call lineout 'FM2.CMD', "do"
-         call lineout 'FM2.CMD', "  if left(arg7,1,1) \= '/' then"
-         call lineout 'FM2.CMD', "  do"
-         call lineout 'FM2.CMD', "    arg0 = arg7"
-         call lineout 'FM2.CMD', "    arg7 = stream(arg7,'c','query exists')"
-         call lineout 'FM2.CMD', "    if arg7 = '' then"
-         call lineout 'FM2.CMD', "    do"
-         call lineout 'FM2.CMD', "      arg7 = directory(arg0)"
-         call lineout 'FM2.CMD', "      call directory mydir"
-         call lineout 'FM2.CMD', "    end"
-         call lineout 'FM2.CMD', "  end"
-         call lineout 'FM2.CMD', "end"
-         call lineout 'FM2.CMD', "if arg8 \= '' then "
-         call lineout 'FM2.CMD', "do"
-         call lineout 'FM2.CMD', "  if left(arg8,1,1) \= '/' then"
-         call lineout 'FM2.CMD', "  do"
-         call lineout 'FM2.CMD', "    arg0 = arg8"
-         call lineout 'FM2.CMD', "    arg8 = stream(arg8,'c','query exists')"
-         call lineout 'FM2.CMD', "    if arg8 = '' then"
-         call lineout 'FM2.CMD', "    do"
-         call lineout 'FM2.CMD', "      arg8 = directory(arg0)"
-         call lineout 'FM2.CMD', "      call directory mydir"
-         call lineout 'FM2.CMD', "    end"
-         call lineout 'FM2.CMD', "  end"
-         call lineout 'FM2.CMD', "end"
-         call lineout 'FM2.CMD', "if arg9 \= '' then "
-         call lineout 'FM2.CMD', "do"
-         call lineout 'FM2.CMD', "  if left(arg9,1,1) \= '/' then"
-         call lineout 'FM2.CMD', "  do"
-         call lineout 'FM2.CMD', "    arg0 = arg9"
-         call lineout 'FM2.CMD', "    arg9 = stream(arg9,'c','query exists')"
-         call lineout 'FM2.CMD', "    if arg9 = '' then"
-         call lineout 'FM2.CMD', "    do"
-         call lineout 'FM2.CMD', "      arg9 = directory(arg0)"
-         call lineout 'FM2.CMD', "      call directory mydir"
-         call lineout 'FM2.CMD', "    end"
-         call lineout 'FM2.CMD', "  end"
-         call lineout 'FM2.CMD', "end"
-       call lineout 'FM2.CMD', "n = setlocal()"
-       call lineout 'FM2.CMD', "n = directory('"curdir"')"
-       call lineout 'FM2.CMD', "'start fm3.exe 'arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9"
-       call lineout 'FM2.CMD', "n = endlocal()"
-       call stream 'FM2.CMD','C','close'
-       'del AV2.CMD 1>NUL 2>NUL'
-       rc = stream('AV2.CMD','C','open')
-       if rc = 'READY:' then
-       do
-         call report 'Creating an AV2.CMD file.'
-         call lineout 'AV2.CMD', "@echo off"
-         call lineout 'AV2.CMD', "rem AV/2 command file.  Locate in a directory"
-         call lineout 'AV2.CMD', "rem on your PATH."
-         call lineout 'AV2.CMD', "setlocal"
-         call lineout 'AV2.CMD', "set FM3INI="curdir
-         call lineout 'AV2.CMD', "set BEGINLIBPATH="curdir
-         call lineout 'AV2.CMD', "start "curdir"\FM2Tools\av2.exe %1 %2 %3 %4 %5 %6 %7 %8 %9"
-         call lineout 'AV2.CMD', "endlocal"
-         call stream 'AV2.CMD','C','close'
-       end
-       else call report "Couldn't create AV2.CMD file."
-       'del VDIR.CMD 1>NUL 2>NUL'
-       rc = stream('VDIR.CMD','C','open')
-       if rc = 'READY:' then
-       do
-         call report 'Creating a VDIR.CMD file.'
-         call lineout 'VDIR.CMD', "/* VDIR (FM/2) command file.  Locate in a directory"
-         call lineout 'VDIR.CMD', " * on your PATH. */"
-         call lineout 'VDIR.CMD', "'@echo off'"
-         call lineout 'VDIR.CMD', "mydir = directory()"
-         call lineout 'VDIR.CMD', "arg arg1 arg2"
-         call lineout 'VDIR.CMD', "if arg1 \= '' then "
-         call lineout 'VDIR.CMD', "do"
-         call lineout 'VDIR.CMD', "  if left(arg1,1,1) \= '/' then"
-         call lineout 'VDIR.CMD', "  do"
-         call lineout 'VDIR.CMD', "    arg0 = arg1"
-         call lineout 'VDIR.CMD', "    arg1 = stream(arg1,'c','query exists')"
-         call lineout 'VDIR.CMD', "    if arg1 = '' then"
-         call lineout 'VDIR.CMD', "    do"
-         call lineout 'VDIR.CMD', "      arg1 = directory(arg0)"
-         call lineout 'VDIR.CMD', "      call directory mydir"
-         call lineout 'VDIR.CMD', "    end"
-         call lineout 'VDIR.CMD', "  end"
-         call lineout 'VDIR.CMD', "end"
-         call lineout 'VDIR.CMD', "else arg1 = mydir"
-         call lineout 'VDIR.CMD', "n = setlocal()"
-         call lineout 'VDIR.CMD', "n = directory('"curdir"')"
-         call lineout 'VDIR.CMD', "'start FM2Tools\vdir.exe 'arg1 '%2 %3 %4 %5 %6 %7 %8 %9'"
-         call lineout 'VDIR.CMD', "n = endlocal()"
-         call stream 'VDIR.CMD','C','close'
-       end
-       else call report "Couldn't create VDIR.CMD file."
-       'del VTREE.CMD 1>NUL 2>NUL'
-       rc = stream('VTREE.CMD','C','open')
-       if rc = 'READY:' then
-       do
-         call report 'Creating a VTREE.CMD file.'
-         call lineout 'VTREE.CMD', "/* VTREE (FM/2) command file.  Locate in a directory"
-         call lineout 'VTREE.CMD', " * on your PATH. */"
-         call lineout 'VTREE.CMD', "'@echo off'"
-         call lineout 'VTREE.CMD', "n = setlocal()"
-         call lineout 'VTREE.CMD', "n = directory('"curdir"')"
-         call lineout 'VTREE.CMD', "'start FM2Tools\vtree.exe %1 %2 %3 %4 %5 %6 %7 %8 %9'"
-         call lineout 'VTREE.CMD', "n = endlocal()"
-         call stream 'VTREE.CMD','C','close'
-       end
-       else call report "Couldn't create VTREE.CMD file."
-       'del VCOLLECT.CMD 1>NUL 2>NUL'
-       rc = stream('VCOLLECT.CMD','C','open')
-       if rc = 'READY:' then
-       do
-         call report 'Creating a VCOLLECT.CMD file.'
-         call lineout 'VCOLLECT.CMD', "/* VCOLLECT (FM/2) command file.  Locate in a directory"
-         call lineout 'VCOLLECT.CMD', " * on your PATH. */"
-         call lineout 'VCOLLECT.CMD', "'@echo off'"
-         call lineout 'VCOLLECT.CMD', "arg arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9"
-         call lineout 'VCOLLECT.CMD', "if arg1 \= '' then "
-         call lineout 'VCOLLECT.CMD', "do"
-         call lineout 'VCOLLECT.CMD', "  if left(arg1,1,1) \= '/' then"
-         call lineout 'VCOLLECT.CMD', "  do"
-         call lineout 'VCOLLECT.CMD', "    arg1 = stream(arg1,'c','query exists')"
-         call lineout 'VCOLLECT.CMD', "  end"
-         call lineout 'VCOLLECT.CMD', "end"
-         call lineout 'VCOLLECT.CMD', "if arg2 \= '' then "
-         call lineout 'VCOLLECT.CMD', "do"
-         call lineout 'VCOLLECT.CMD', "  if left(arg2,1,1) \= '/' then"
-         call lineout 'VCOLLECT.CMD', "  do"
-         call lineout 'VCOLLECT.CMD', "    arg2 = stream(arg2,'c','query exists')"
-         call lineout 'VCOLLECT.CMD', "  end"
-         call lineout 'VCOLLECT.CMD', "end"
-         call lineout 'VCOLLECT.CMD', "if arg3 \= '' then "
-         call lineout 'VCOLLECT.CMD', "do"
-         call lineout 'VCOLLECT.CMD', "  if left(arg3,1,1) \= '/' then"
-         call lineout 'VCOLLECT.CMD', "  do"
-         call lineout 'VCOLLECT.CMD', "    arg3 = stream(arg3,'c','query exists')"
-         call lineout 'VCOLLECT.CMD', "  end"
-         call lineout 'VCOLLECT.CMD', "end"
-         call lineout 'VCOLLECT.CMD', "if arg4 \= '' then "
-         call lineout 'VCOLLECT.CMD', "do"
-         call lineout 'VCOLLECT.CMD', "  if left(arg4,1,1) \= '/' then"
-         call lineout 'VCOLLECT.CMD', "  do"
-         call lineout 'VCOLLECT.CMD', "    arg4 = stream(arg4,'c','query exists')"
-         call lineout 'VCOLLECT.CMD', "  end"
-         call lineout 'VCOLLECT.CMD', "end"
-         call lineout 'VCOLLECT.CMD', "if arg5 \= '' then "
-         call lineout 'VCOLLECT.CMD', "do"
-         call lineout 'VCOLLECT.CMD', "  if left(arg5,1,1) \= '/' then"
-         call lineout 'VCOLLECT.CMD', "  do"
-         call lineout 'VCOLLECT.CMD', "    arg5 = stream(arg5,'c','query exists')"
-         call lineout 'VCOLLECT.CMD', "  end"
-         call lineout 'VCOLLECT.CMD', "end"
-         call lineout 'VCOLLECT.CMD', "if arg6 \= '' then "
-         call lineout 'VCOLLECT.CMD', "do"
-         call lineout 'VCOLLECT.CMD', "  if left(arg6,1,1) \= '/' then"
-         call lineout 'VCOLLECT.CMD', "  do"
-         call lineout 'VCOLLECT.CMD', "    arg6 = stream(arg6,'c','query exists')"
-         call lineout 'VCOLLECT.CMD', "  end"
-         call lineout 'VCOLLECT.CMD', "end"
-         call lineout 'VCOLLECT.CMD', "if arg7 \= '' then "
-         call lineout 'VCOLLECT.CMD', "do"
-         call lineout 'VCOLLECT.CMD', "  if left(arg7,1,1) \= '/' then"
-         call lineout 'VCOLLECT.CMD', "  do"
-         call lineout 'VCOLLECT.CMD', "    arg7 = stream(arg7,'c','query exists')"
-         call lineout 'VCOLLECT.CMD', "  end"
-         call lineout 'VCOLLECT.CMD', "end"
-         call lineout 'VCOLLECT.CMD', "if arg8 \= '' then "
-         call lineout 'VCOLLECT.CMD', "do"
-         call lineout 'VCOLLECT.CMD', "  if left(arg8,1,1) \= '/' then"
-         call lineout 'VCOLLECT.CMD', "  do"
-         call lineout 'VCOLLECT.CMD', "    arg8 = stream(arg8,'c','query exists')"
-         call lineout 'VCOLLECT.CMD', "  end"
-         call lineout 'VCOLLECT.CMD', "end"
-         call lineout 'VCOLLECT.CMD', "if arg9 \= '' then "
-         call lineout 'VCOLLECT.CMD', "do"
-         call lineout 'VCOLLECT.CMD', "  if left(arg9,1,1) \= '/' then"
-         call lineout 'VCOLLECT.CMD', "  do"
-         call lineout 'VCOLLECT.CMD', "    arg9 = stream(arg9,'c','query exists')"
-         call lineout 'VCOLLECT.CMD', "  end"
-         call lineout 'VCOLLECT.CMD', "end"
-         call lineout 'VCOLLECT.CMD', "n = setlocal()"
-         call lineout 'VCOLLECT.CMD', "n = directory('"curdir"')"
-         call lineout 'VCOLLECT.CMD', "'start FM2Tools\vcollect.exe 'arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9"
-         call lineout 'VCOLLECT.CMD', "n = endlocal()"
-         call stream 'VCOLLECT.CMD','C','close'
-       end
-       else call report "Couldn't create VCOLLECT.CMD file."
-       'del INI.CMD 1>NUL 2>NUL'
-       rc = stream('INI.CMD','C','open')
-       if rc = 'READY:' then
-       do
-         call report 'Creating an INI.CMD file.'
-         call lineout 'INI.CMD', "/* INI (FM/2) command file.  Locate in a directory"
-         call lineout 'INI.CMD', " * on your PATH. */"
-         call lineout 'INI.CMD', "'@echo off'"
-         call lineout 'INI.CMD', "arg arg1"
-         call lineout 'INI.CMD', "if arg1 \= '' then arg1 = stream(arg1,'c','query exists')"
-         call lineout 'INI.CMD', "n = setlocal()"
-         call lineout 'INI.CMD', "n = directory('"curdir"')"
-         call lineout 'INI.CMD', "'start FM2Tools\INI.exe 'arg1"
-         call lineout 'INI.CMD', "n = endlocal()"
-         call stream 'INI.CMD','C','close'
-       end
-       else call report "Couldn't create INI.CMD file."
-       'del EAS.CMD 1>NUL 2>NUL'
-       rc = stream('EAS.CMD','C','open')
-       if rc = 'READY:' then
-       do
-         call report 'Creating an EAS.CMD file.'
-         call lineout 'EAS.CMD', "/* EAS (FM/2) command file.  Locate in a directory"
-         call lineout 'EAS.CMD', " * on your PATH. */"
-         call lineout 'EAS.CMD', "'@echo off'"
-         call lineout 'EAS.CMD', "arg arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9"
-         call lineout 'EAS.CMD', "if arg1 \= '' then "
-         call lineout 'EAS.CMD', "do"
-         call lineout 'EAS.CMD', "  if left(arg1,1,1) \= '/' then"
-         call lineout 'EAS.CMD', "  do"
-         call lineout 'EAS.CMD', "    arg1 = stream(arg1,'c','query exists')"
-         call lineout 'EAS.CMD', "  end"
-         call lineout 'EAS.CMD', "end"
-         call lineout 'EAS.CMD', "else arg1 = directory()"
-         call lineout 'EAS.CMD', "if arg2 \= '' then "
-         call lineout 'EAS.CMD', "do"
-         call lineout 'EAS.CMD', "  if left(arg2,1,1) \= '/' then"
-         call lineout 'EAS.CMD', "  do"
-         call lineout 'EAS.CMD', "    arg2 = stream(arg2,'c','query exists')"
-         call lineout 'EAS.CMD', "  end"
-         call lineout 'EAS.CMD', "end"
-         call lineout 'EAS.CMD', "if arg3 \= '' then "
-         call lineout 'EAS.CMD', "do"
-         call lineout 'EAS.CMD', "  if left(arg3,1,1) \= '/' then"
-         call lineout 'EAS.CMD', "  do"
-         call lineout 'EAS.CMD', "    arg3 = stream(arg3,'c','query exists')"
-         call lineout 'EAS.CMD', "  end"
-         call lineout 'EAS.CMD', "end"
-         call lineout 'EAS.CMD', "if arg4 \= '' then "
-         call lineout 'EAS.CMD', "do"
-         call lineout 'EAS.CMD', "  if left(arg4,1,1) \= '/' then"
-         call lineout 'EAS.CMD', "  do"
-         call lineout 'EAS.CMD', "    arg4 = stream(arg4,'c','query exists')"
-         call lineout 'EAS.CMD', "  end"
-         call lineout 'EAS.CMD', "end"
-         call lineout 'EAS.CMD', "if arg5 \= '' then "
-         call lineout 'EAS.CMD', "do"
-         call lineout 'EAS.CMD', "  if left(arg5,1,1) \= '/' then"
-         call lineout 'EAS.CMD', "  do"
-         call lineout 'EAS.CMD', "    arg5 = stream(arg5,'c','query exists')"
-         call lineout 'EAS.CMD', "  end"
-         call lineout 'EAS.CMD', "end"
-         call lineout 'EAS.CMD', "if arg6 \= '' then "
-         call lineout 'EAS.CMD', "do"
-         call lineout 'EAS.CMD', "  if left(arg6,1,1) \= '/' then"
-         call lineout 'EAS.CMD', "  do"
-         call lineout 'EAS.CMD', "    arg6 = stream(arg6,'c','query exists')"
-         call lineout 'EAS.CMD', "  end"
-         call lineout 'EAS.CMD', "end"
-         call lineout 'EAS.CMD', "if arg7 \= '' then "
-         call lineout 'EAS.CMD', "do"
-         call lineout 'EAS.CMD', "  if left(arg7,1,1) \= '/' then"
-         call lineout 'EAS.CMD', "  do"
-         call lineout 'EAS.CMD', "    arg7 = stream(arg7,'c','query exists')"
-         call lineout 'EAS.CMD', "  end"
-         call lineout 'EAS.CMD', "end"
-         call lineout 'EAS.CMD', "if arg8 \= '' then "
-         call lineout 'EAS.CMD', "do"
-         call lineout 'EAS.CMD', "  if left(arg8,1,1) \= '/' then"
-         call lineout 'EAS.CMD', "  do"
-         call lineout 'EAS.CMD', "    arg8 = stream(arg8,'c','query exists')"
-         call lineout 'EAS.CMD', "  end"
-         call lineout 'EAS.CMD', "end"
-         call lineout 'EAS.CMD', "if arg9 \= '' then "
-         call lineout 'EAS.CMD', "do"
-         call lineout 'EAS.CMD', "  if left(arg9,1,1) \= '/' then"
-         call lineout 'EAS.CMD', "  do"
-         call lineout 'EAS.CMD', "    arg9 = stream(arg9,'c','query exists')"
-         call lineout 'EAS.CMD', "  end"
-         call lineout 'EAS.CMD', "end"
-         call lineout 'EAS.CMD', "n = setlocal()"
-         call lineout 'EAS.CMD', "n = directory('"curdir"')"
-         call lineout 'EAS.CMD', "'start FM2Tools\eas.exe 'arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9"
-         call lineout 'EAS.CMD', "n = endlocal()"
-         call stream 'EAS.CMD','C','close'
-       end
-       else call report "Couldn't create EAS.CMD file."
-       'del DIRSIZE.CMD 1>NUL 2>NUL'
-       rc = stream('DIRSIZE.CMD','C','open')
-       if rc = 'READY:' then
-       do
-         call report 'Creating a DIRSIZE.CMD file.'
-         call lineout 'DIRSIZE.CMD', "/* DIRSIZE (FM/2) command file.  Locate in a directory"
-         call lineout 'DIRSIZE.CMD', " * on your PATH. */"
-         call lineout 'DIRSIZE.CMD', "'@echo off'"
-         call lineout 'DIRSIZE.CMD', "mydir = directory()"
-         call lineout 'DIRSIZE.CMD', "arg arg1 arg2"
-         call lineout 'DIRSIZE.CMD', "if arg1 \= '' then "
-         call lineout 'DIRSIZE.CMD', "do"
-         call lineout 'DIRSIZE.CMD', "  if left(arg1,1,1) \= '/' then"
-         call lineout 'DIRSIZE.CMD', "  do"
-         call lineout 'DIRSIZE.CMD', "    arg0 = arg1"
-         call lineout 'DIRSIZE.CMD', "    arg1 = stream(arg1,'c','query exists')"
-         call lineout 'DIRSIZE.CMD', "    if arg1 = '' then"
-         call lineout 'DIRSIZE.CMD', "    do"
-         call lineout 'DIRSIZE.CMD', "      arg1 = directory(arg0)"
-         call lineout 'DIRSIZE.CMD', "      call directory mydir"
-         call lineout 'DIRSIZE.CMD', "    end"
-         call lineout 'DIRSIZE.CMD', "  end"
-         call lineout 'DIRSIZE.CMD', "end"
-         call lineout 'DIRSIZE.CMD', "else arg1 = mydir"
-         call lineout 'DIRSIZE.CMD', "n = setlocal()"
-         call lineout 'DIRSIZE.CMD', "n = directory('"curdir"')"
-         call lineout 'DIRSIZE.CMD', "'start FM2Tools\dirsize.exe 'arg1 '%2 %3 %4 %5 %6 %7 %8 %9'"
-         call lineout 'DIRSIZE.CMD', "n = endlocal()"
-         call stream 'DIRSIZE.CMD','C','close'
-       end
-       else call report "Couldn't create DIRSIZE.CMD file."
-       'del UNDEL.CMD 1>NUL 2>NUL'
-       rc = stream('UNDEL.CMD','C','open')
-       if rc = 'READY:' then
-       do
-         call report 'Creating an UNDEL.CMD file.'
-         call lineout 'UNDEL.CMD', "/* UNDEL (FM/2) command file.  Locate in a directory"
-         call lineout 'UNDEL.CMD', " * on your PATH. */"
-         call lineout 'UNDEL.CMD', "'@echo off'"
-         call lineout 'UNDEL.CMD', "n = setlocal()"
-         call lineout 'UNDEL.CMD', "n = directory('"curdir"')"
-         call lineout 'UNDEL.CMD', "'start FM2Tools\undel.exe %1'"
-         call lineout 'UNDEL.CMD', "n = endlocal()"
-         call stream 'UNDEL.CMD','C','close'
-       end
-       else call report "Couldn't create UNDEL.CMD file."
-       'del KILLPROC.CMD 1>NUL 2>NUL'
-       rc = stream('KILLPROC.CMD','C','open')
-       if rc = 'READY:' then
-       do
-         call report 'Creating a KILLPROC.CMD file.'
-         call lineout 'KILLPROC.CMD', "/* KILLPROC (FM/2) command file.  Locate in a directory"
-         call lineout 'KILLPROC.CMD', " * on your PATH. */"
-         call lineout 'KILLPROC.CMD', "'@echo off'"
-         call lineout 'KILLPROC.CMD', "n = setlocal()"
-         call lineout 'KILLPROC.CMD', "n = directory('"curdir"')"
-         call lineout 'KILLPROC.CMD', "'start FM2Tools\killproc.exe'"
-         call lineout 'KILLPROC.CMD', "n = endlocal()"
-         call stream 'KILLPROC.CMD','C','close'
-       end
-       else call report "Couldn't create KILLPROC.CMD file."
-       'del VIEWINFS.CMD 1>NUL 2>NUL'
-       rc = stream('VIEWINFS.CMD','C','open')
-       if rc = 'READY:' then
-       do
-         call report 'Creating a VIEWINFS.CMD file.'
-         call lineout 'VIEWINFS.CMD', "/* VIEWINFS (FM/2) command file.  Locate in a directory"
-         call lineout 'VIEWINFS.CMD', " * on your PATH. */"
-         call lineout 'VIEWINFS.CMD', "'@echo off'"
-         call lineout 'VIEWINFS.CMD', "n = setlocal()"
-         call lineout 'VIEWINFS.CMD', "n = directory('"curdir"')"
-         call lineout 'VIEWINFS.CMD', "'start FM2Tools\viewinfs.exe'"
-         call lineout 'VIEWINFS.CMD', "n = endlocal()"
-         call stream 'VIEWINFS.CMD','C','close'
-       end
-       else call report "Couldn't create VIEWINFS.CMD file."
-       'del VIEWHELP.CMD 1>NUL 2>NUL'
-       rc = stream('VIEWHELP.CMD','C','open')
-       if rc = 'READY:' then
-       do
-         call report 'Creating a VIEWHELP.CMD file.'
-         call lineout 'VIEWHELP.CMD', "/* VIEWHELP (FM/2) command file.  Locate in a directory"
-         call lineout 'VIEWHELP.CMD', " * on your PATH. */"
-         call lineout 'VIEWHELP.CMD', "'@echo off'"
-         call lineout 'VIEWHELP.CMD', "n = setlocal()"
-         call lineout 'VIEWHELP.CMD', "n = directory('"curdir"')"
-         call lineout 'VIEWHELP.CMD', "'start FM2Tools\viewinfs.exe DUMMY'"
-         call lineout 'VIEWHELP.CMD', "n = endlocal()"
-         call stream 'VIEWHELP.CMD','C','close'
-       end
-       else call report "Couldn't create VIEWHELP.CMD file."
-       'del GLOBAL.CMD 1>NUL 2>NUL'
-       rc = stream('GLOBAL.CMD','C','open')
-       if rc = 'READY:' then
-       do
-         call report 'Creating a GLOBAL.CMD file.'
-         call lineout 'GLOBAL.CMD', "/* GLOBAL (FM/2) command file.  Locate in a directory"
-         call lineout 'GLOBAL.CMD', " * on your PATH. */"
-         call lineout 'GLOBAL.CMD', "'@echo off'"
-         call lineout 'GLOBAL.CMD', "arg arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9"
-         call lineout 'GLOBAL.CMD', "if arg1 \= '' then "
-         call lineout 'GLOBAL.CMD', "do"
-         call lineout 'GLOBAL.CMD', "  if left(arg1,1,1) \= '/' then"
-         call lineout 'GLOBAL.CMD', "  do"
-         call lineout 'GLOBAL.CMD', "    arg1 = stream(arg1,'c','query exists')"
-         call lineout 'GLOBAL.CMD', "  end"
-         call lineout 'GLOBAL.CMD', "end"
-         call lineout 'GLOBAL.CMD', "else arg1 = directory()"
-         call lineout 'GLOBAL.CMD', "if arg2 \= '' then "
-         call lineout 'GLOBAL.CMD', "do"
-         call lineout 'GLOBAL.CMD', "  if left(arg2,1,1) \= '/' then"
-         call lineout 'GLOBAL.CMD', "  do"
-         call lineout 'GLOBAL.CMD', "    arg2 = stream(arg2,'c','query exists')"
-         call lineout 'GLOBAL.CMD', "  end"
-         call lineout 'GLOBAL.CMD', "end"
-         call lineout 'GLOBAL.CMD', "if arg3 \= '' then "
-         call lineout 'GLOBAL.CMD', "do"
-         call lineout 'GLOBAL.CMD', "  if left(arg3,1,1) \= '/' then"
-         call lineout 'GLOBAL.CMD', "  do"
-         call lineout 'GLOBAL.CMD', "    arg3 = stream(arg3,'c','query exists')"
-         call lineout 'GLOBAL.CMD', "  end"
-         call lineout 'GLOBAL.CMD', "end"
-         call lineout 'GLOBAL.CMD', "if arg4 \= '' then "
-         call lineout 'GLOBAL.CMD', "do"
-         call lineout 'GLOBAL.CMD', "  if left(arg4,1,1) \= '/' then"
-         call lineout 'GLOBAL.CMD', "  do"
-         call lineout 'GLOBAL.CMD', "    arg4 = stream(arg4,'c','query exists')"
-         call lineout 'GLOBAL.CMD', "  end"
-         call lineout 'GLOBAL.CMD', "end"
-         call lineout 'GLOBAL.CMD', "if arg5 \= '' then "
-         call lineout 'GLOBAL.CMD', "do"
-         call lineout 'GLOBAL.CMD', "  if left(arg5,1,1) \= '/' then"
-         call lineout 'GLOBAL.CMD', "  do"
-         call lineout 'GLOBAL.CMD', "    arg5 = stream(arg5,'c','query exists')"
-         call lineout 'GLOBAL.CMD', "  end"
-         call lineout 'GLOBAL.CMD', "end"
-         call lineout 'GLOBAL.CMD', "if arg6 \= '' then "
-         call lineout 'GLOBAL.CMD', "do"
-         call lineout 'GLOBAL.CMD', "  if left(arg6,1,1) \= '/' then"
-         call lineout 'GLOBAL.CMD', "  do"
-         call lineout 'GLOBAL.CMD', "    arg6 = stream(arg6,'c','query exists')"
-         call lineout 'GLOBAL.CMD', "  end"
-         call lineout 'GLOBAL.CMD', "end"
-         call lineout 'GLOBAL.CMD', "if arg7 \= '' then "
-         call lineout 'GLOBAL.CMD', "do"
-         call lineout 'GLOBAL.CMD', "  if left(arg7,1,1) \= '/' then"
-         call lineout 'GLOBAL.CMD', "  do"
-         call lineout 'GLOBAL.CMD', "    arg7 = stream(arg7,'c','query exists')"
-         call lineout 'GLOBAL.CMD', "  end"
-         call lineout 'GLOBAL.CMD', "end"
-         call lineout 'GLOBAL.CMD', "if arg8 \= '' then "
-         call lineout 'GLOBAL.CMD', "do"
-         call lineout 'GLOBAL.CMD', "  if left(arg8,1,1) \= '/' then"
-         call lineout 'GLOBAL.CMD', "  do"
-         call lineout 'GLOBAL.CMD', "    arg8 = stream(arg8,'c','query exists')"
-         call lineout 'GLOBAL.CMD', "  end"
-         call lineout 'GLOBAL.CMD', "end"
-         call lineout 'GLOBAL.CMD', "if arg9 \= '' then "
-         call lineout 'GLOBAL.CMD', "do"
-         call lineout 'GLOBAL.CMD', "  if left(arg9,1,1) \= '/' then"
-         call lineout 'GLOBAL.CMD', "  do"
-         call lineout 'GLOBAL.CMD', "    arg9 = stream(arg9,'c','query exists')"
-         call lineout 'GLOBAL.CMD', "  end"
-         call lineout 'GLOBAL.CMD', "end"
-         call lineout 'GLOBAL.CMD', "n = setlocal()"
-         call lineout 'GLOBAL.CMD', "n = directory('"curdir"')"
-         call lineout 'GLOBAL.CMD', "'start FM2Tools\global.exe' arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9"
-         call lineout 'GLOBAL.CMD', "n = endlocal()"
-         call stream 'GLOBAL.CMD','C','close'
-       end
-       else call report "Couldn't create GLOBAL.CMD file."
-       call report ""
-     end
-     else call report "Couldn't create FM2.CMD file.  Panic."
-     call directory curdir
-   end
-
-   if attended = 1 then
-      do
-         /* type the install.dat file to show any critical info/notices */
-
-         rc = stream('install.dat','c','query exists')
-         if rc \= '' then
-            do
-              'type install.dat'
-              'DEL INSTALL.DAT 1>NUL 2>NUL'
-              if attended then
-              do
-                call charout ,'  Press [Enter] to continue...'
-                call linein
-   /*
-                ans = ''
-                do until ans = '0d'x
-                  ans = SysGetKey('NOECHO')
-                end
-   */
-                call charout ,'0d1b'x'[K'
-              end
-            end
-
-      end
-return
-
-/* InstallFile(file, template) install file from template unless file already exists */
-
-InstallFile: procedure
-
-  parse arg sFile sTemplate
-
-  rc = stream(sFile,'c','query exists')
-  if rc = '' then do
-    rc = stream(sTemplate,'c','query exists')
-    if rc \= '' then do
-      call report 'Creating a sample' sFile 'file for you.'
-      'ren' sTemplate sFile '1>nul 2>nul'
-    end
-  end
-  'del' sTemplate '1>nul 2>nul'
-
-  return
-
-  /* end InstallFile */
-
-report: procedure expose attended
-   if attended then
-      do
-         parse arg msg
-         say msg
-      end
-   return
-
-novalue:
-   call report 'Uninitialized value: ' || condition('D') || ' on line: ' || sigl
-   call report 'Lines: 'sourceline(sigl)
-   say
-   call report 'Exiting...'
-   '@pause'
-   exit
Index: trunk/vcollect.c
===================================================================
--- trunk/vcollect.c	(revision 1912)
+++ 	(revision )
@@ -1,94 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  Collector applet
-
-  Copyright (c) 1993-98 M. Kimes
-  Copyright (c) 2007, 2008 Steven H.Levine
-
-  05 Jan 08 SHL Sync
-  14 Dec 08 SHL Add exception handler support
-
-***********************************************************************/
-
-#include <string.h>
-
-#define INCL_DOS
-#define INCL_WIN
-#define INCL_DOSEXCEPTIONS		// XCTP_...
-#define INCL_DOSERRORS			// NO_ERROR
-
-#include "dll\fm3dll.h"
-#include "dll\fm3dll2.h"		// IDM_GREP
-#include "dll\mainwnd.h"		// Data declaration(s)
-#include "dll\notebook.h"		// Data declaration(s)
-#include "dll\fm3str.h"
-#include "dll\init.h"			// InitFM3DLL
-#include "dll\collect.h"		// StartCollector
-#include "dll\errutil.h"		// Error reporting
-#include "dll\excputil.h"		// Exception handlers
-
-static PSZ pszSrcFile = __FILE__;
-
-int main(int argc, char *argv[])
-{
-  HAB hab;
-  HMQ hmq;
-  QMSG qmsg;
-  HWND hwndFrame;
-  UINT x;
-  BOOL seekandscan = FALSE;
-  APIRET regRet;
-  EXCEPTIONREGISTRATIONRECORD regRec = { NULL, NULL };
-
-  strcpy(appname, "VCOLLECT");
-  DosError(FERR_DISABLEHARDERR);
-
-  regRec.ExceptionHandler = HandleException;
-  regRet = DosSetExceptionHandler(&regRec);
-  if (regRet != NO_ERROR) {
-    DbgMsg(pszSrcFile, __LINE__,
-	   "DosSetExceptionHandler failed with error %u", regRet);
-  }
-
-  for (x = 1; x < argc; x++) {
-    if (*argv[x] == '*' && argv[x][1] == '*') {
-      seekandscan = TRUE;
-      break;
-    }
-  }
-
-  hab = WinInitialize(0);
-  if (hab) {
-    hmq = WinCreateMsgQueue(hab, 1024);
-    if (hmq) {
-      if (InitFM3DLL(hab, argc, argv)) {
-	hwndFrame = StartCollector(HWND_DESKTOP, 0);
-	if (hwndFrame) {
-	  if (hwndHelp)
-	    WinAssociateHelpInstance(hwndHelp, hwndFrame);
-	  if (seekandscan)
-	    WinPostMsg(WinWindowFromID(hwndFrame, FID_CLIENT), WM_COMMAND,
-		       MPFROM2SHORT(IDM_GREP, 0), MPVOID);
-	  while (WinGetMsg(hab, &qmsg, (HWND) 0, 0, 0)) {
-	    if (hwndBubble &&
-		((qmsg.msg > (WM_BUTTON1DOWN - 1) &&
-		  qmsg.msg < (WM_BUTTON3DBLCLK + 1)) ||
-		 (qmsg.msg > (WM_CHORD - 1) &&
-		  qmsg.msg < (WM_BUTTON3CLICK + 1))) &&
-		WinIsWindowVisible(hwndBubble))
-	      WinShowWindow(hwndBubble, FALSE);
-	    WinDispatchMsg(hab, &qmsg);
-	  }
-	  DosSleep(125L);
-	}
-      }
-      DosSleep(125L);
-      WinDestroyMsgQueue(hmq);
-    }
-    WinTerminate(hab);
-  }
-  return 0;
-}
Index: trunk/vcollect.def
===================================================================
--- trunk/vcollect.def	(revision 1912)
+++ 	(revision )
@@ -1,9 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2009 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-
-option description '@#The Netlabs FM/2 team:3.25.0#@##1## 2024-06-02 03:25:00      ZOBOPEEP::EN:US:0:U:@@FM/2 Collector MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, 2024 Steven Levine and Associates, Inc. All rights reserved'
-
-option stack = 655360
Index: trunk/vcollect.mak
===================================================================
--- trunk/vcollect.mak	(revision 1912)
+++ 	(revision )
@@ -1,23 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2007 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-# 23 Feb 08 JBS Add support for building SYM files
-# 04 Jul 11 GKY Make xqs files an explicit target so they will be rebuild if lost somehow.
-
-BASE=vcollect
-
-!include makefile_pre.mk
-
-all: $(BASE).exe $(BASE).res .symbolic
-
-sym: $(BASE).sym $(BASE).xqs .symbolic
-
-$(BASE).res: $(BASE).rc dll\fm3dll.h icons\collect.ico bitmaps\*.bmp
-
-$(BASE).obj: $(BASE).c
-
-!include makefile_post.mk
-
-# The end
Index: trunk/vcollect.rc
===================================================================
--- trunk/vcollect.rc	(revision 1912)
+++ 	(revision )
@@ -1,44 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  vcollect resources
-
-  Copyright (c) 1993-02 M. Kimes
-  Copyright (c) 2003, 2008 Steven H.Levine
-
-  15 Oct 02 MK Baseline
-  04 Nov 03 SHL Drop extra default icon
-  04 Jan 08 SHL Sync with fm3dll.h mods
-
-***********************************************************************/
-
-#include "dll\fm3dll2.h"
-
-DEFAULTICON                 icons\COLLECT.ICO
-
-BITMAP DIR_FOLDERICON       bitmaps\PMAP.BMP
-BITMAP DIR_FRAME            bitmaps\FILE.BMP
-BITMAP 65534                bitmaps\EMPTY.BMP
-BITMAP IDM_DELETE           bitmaps\DELETE.BMP
-BITMAP IDM_EXTRACT          bitmaps\EXTRACT.BMP
-BITMAP IDM_PRINT            bitmaps\PRINT.BMP
-BITMAP IDM_TEST             bitmaps\TEST.BMP
-BITMAP IDM_VIRUSSCAN        bitmaps\VIRUS.BMP
-BITMAP IDM_EXEC             bitmaps\EXEC.BMP
-BITMAP IDM_VIEW             bitmaps\VIEW.BMP
-BITMAP IDM_PERMDELETE       bitmaps\PERMDEL.BMP
-BITMAP IDM_RESCAN           bitmaps\RESCAN.BMP
-BITMAP IDM_REFRESH          bitmaps\RESCAN.BMP
-BITMAP IDM_FILTER           bitmaps\FILTER.BMP
-BITMAP IDM_WALKDIR          bitmaps\WALK.BMP
-BITMAP IDM_GREP             bitmaps\GREP.BMP
-BITMAP IDM_SEEALL           bitmaps\SEEALL.BMP
-BITMAP IDM_FINDFIRST        bitmaps\FINDFRST.BMP
-BITMAP IDM_FINDNEXT         bitmaps\FINDNEXT.BMP
-BITMAP IDM_FINDPREV         bitmaps\FINDPREV.BMP
-
-BITMAP IDM_CLEARCNR         bitmaps\CLEARCNR.BMP
-BITMAP IDM_REMOVE           bitmaps\REMOVOBJ.BMP
-
Index: trunk/vdir.c
===================================================================
--- trunk/vdir.c	(revision 1912)
+++ 	(revision )
@@ -1,104 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  INF directory viewer applet
-
-  Copyright (c) 1993-98 M. Kimes
-  Copyright (c) 2007, 2008 Steven H.Levine
-
-  05 Jan 08 SHL Sync
-  14 Dec 08 SHL Add exception handler support
-
-***********************************************************************/
-
-#include <string.h>
-
-#define INCL_DOS
-#define INCL_WIN
-#define INCL_DOSEXCEPTIONS		// XCTP_...
-#define INCL_DOSERRORS			// NO_ERROR
-
-#include "dll\fm3dll.h"
-#include "dll\mainwnd.h"		// hwndHelp
-#include "dll\notebook.h"		// appname
-#include "dll\init.h"			// InitFM3DLL
-#include "dll\valid.h"			// IsFile
-#include "dll\dirs.h"			// save_dir
-#include "dll\errutil.h"		// Error reporting
-#include "dll\excputil.h"		// Exception handlers
-
-static PSZ pszSrcFile = __FILE__;
-
-int main(int argc, char *argv[])
-{
-  HAB hab;
-  HMQ hmq;
-  QMSG qmsg;
-  HWND hwndFrame;
-  CHAR fullname[CCHMAXPATH];
-  PSZ thisarg = NULL;
-  UINT x;
-  APIRET regRet;
-  EXCEPTIONREGISTRATIONRECORD regRec = { NULL, NULL };
-
-  strcpy(appname, "VDIR");
-  DosError(FERR_DISABLEHARDERR);
-
-  regRec.ExceptionHandler = HandleException;
-  regRet = DosSetExceptionHandler(&regRec);
-  if (regRet != NO_ERROR) {
-    DbgMsg(pszSrcFile, __LINE__,
-	   "DosSetExceptionHandler failed with error %u", regRet);
-  }
-
-  for (x = 1; x < argc; x++) {
-    if (!strchr("/;,`\'", *argv[x]) && (IsRoot(argv[x]) || !IsFile(argv[x]))) {
-      thisarg = argv[x];
-      break;
-    }
-  }
-
-  if (thisarg) {
-    if (DosQueryPathInfo(thisarg,
-			 FIL_QUERYFULLNAME, fullname, sizeof(fullname)))
-      strcpy(fullname, thisarg);
-  }
-  else
-    save_dir(fullname);
-
-  hab = WinInitialize(0);
-  if (hab) {
-    hmq = WinCreateMsgQueue(hab, 1024);
-    if (hmq) {
-      if (InitFM3DLL(hab, argc, argv)) {
-	hwndFrame = StartDirCnr(HWND_DESKTOP, fullname, (HWND) 0, 0);
-	if (hwndFrame) {
-	  if (hwndHelp)
-	    WinAssociateHelpInstance(hwndHelp, hwndFrame);
-	  for (;;) {
-	    if (!WinGetMsg(hab, &qmsg, (HWND) 0, 0, 0)) {
-	      if (qmsg.hwnd)
-		qmsg.msg = WM_CLOSE;
-	      else
-		break;
-	    }
-	    if (hwndBubble &&
-		((qmsg.msg > (WM_BUTTON1DOWN - 1) &&
-		  qmsg.msg < (WM_BUTTON3DBLCLK + 1)) ||
-		 (qmsg.msg > (WM_CHORD - 1) &&
-		  qmsg.msg < (WM_BUTTON3CLICK + 1))) &&
-		WinIsWindowVisible(hwndBubble))
-	      WinShowWindow(hwndBubble, FALSE);
-	    WinDispatchMsg(hab, &qmsg);
-	  }
-	}
-      }
-      DosSleep(125L);
-      WinDestroyMsgQueue(hmq);
-    }
-    WinTerminate(hab);
-  }
-  return 0;
-}
Index: trunk/vdir.def
===================================================================
--- trunk/vdir.def	(revision 1912)
+++ 	(revision )
@@ -1,9 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2009 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-
-option description '@#The Netlabs FM/2 team:3.25.0#@##1## 2024-06-02 03:25:00      ZOBOPEEP::EN:US:0:U:@@FM/2 View Directory MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, 2024 Steven Levine and Associates, Inc. All rights reserved'
-
-option stack = 488416
Index: trunk/vdir.mak
===================================================================
--- trunk/vdir.mak	(revision 1912)
+++ 	(revision )
@@ -1,24 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2007 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-# 23 Feb 08 JBS Add support for building SYM files
-# 04 Jul 11 GKY Make xqs files an explicit target so they will be rebuild if lost somehow.
-
-BASE=vdir
-
-!include makefile_pre.mk
-
-all: $(BASE).exe $(BASE).res .symbolic
-
-sym: $(BASE).sym $(BASE).xqs .symbolic
-
-$(BASE).res: $(BASE).rc dll\fm3dll.h icons\$(BASE).ico bitmaps\*.bmp
-
-$(BASE).obj: $(BASE).c
-
-!include makefile_post.mk
-
-# The end
-
Index: trunk/vdir.rc
===================================================================
--- trunk/vdir.rc	(revision 1912)
+++ 	(revision )
@@ -1,43 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  vdir resources
-
-  Copyright (c) 1993-02 M. Kimes
-  Copyright (c) 2003, 2008 Steven H.Levine
-
-  15 Oct 02 MK Baseline
-  04 Nov 03 SHL Drop extra default icon
-  04 Jan 08 SHL Sync with fm3dll.h mods
-
-***********************************************************************/
-
-#include "dll\fm3dll2.h"
-
-DEFAULTICON                 icons\VDIR.ICO
-
-BITMAP DIR_FOLDERICON       bitmaps\PMAP.BMP
-BITMAP DIR_FRAME            bitmaps\FILE.BMP
-BITMAP 65534                bitmaps\EMPTY.BMP
-BITMAP IDM_DELETE           bitmaps\DELETE.BMP
-BITMAP IDM_EXTRACT          bitmaps\EXTRACT.BMP
-BITMAP IDM_PRINT            bitmaps\PRINT.BMP
-BITMAP IDM_TEST             bitmaps\TEST.BMP
-BITMAP IDM_VIRUSSCAN        bitmaps\VIRUS.BMP
-BITMAP IDM_EXEC             bitmaps\EXEC.BMP
-BITMAP IDM_VIEW             bitmaps\VIEW.BMP
-BITMAP IDM_PERMDELETE       bitmaps\PERMDEL.BMP
-BITMAP IDM_RESCAN           bitmaps\RESCAN.BMP
-BITMAP IDM_REFRESH          bitmaps\RESCAN.BMP
-BITMAP IDM_FILTER           bitmaps\FILTER.BMP
-BITMAP IDM_WALKDIR          bitmaps\WALK.BMP
-BITMAP IDM_GREP             bitmaps\GREP.BMP
-BITMAP IDM_SEEALL           bitmaps\SEEALL.BMP
-BITMAP IDM_FINDFIRST        bitmaps\FINDFRST.BMP
-BITMAP IDM_FINDNEXT         bitmaps\FINDNEXT.BMP
-BITMAP IDM_FINDPREV         bitmaps\FINDPREV.BMP
-BITMAP IDM_CLEARCNR         bitmaps\CLEARCNR.BMP
-BITMAP IDM_REMOVE           bitmaps\REMOVOBJ.BMP
-
Index: trunk/viewinfs.c
===================================================================
--- trunk/viewinfs.c	(revision 1912)
+++ 	(revision )
@@ -1,63 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  INF viewer applet
-
-  Copyright (c) 1993-98 M. Kimes
-  Copyright (c) 2007, 2008 Steven H.Levine
-
-  03 Aug 07 SHL Minor cleanup
-  14 Dec 08 SHL Add exception handler support
-
-***********************************************************************/
-
-#define INCL_DOS			// DosSleep
-#define INCL_WIN
-#define INCL_DOSEXCEPTIONS		// XCTP_...
-#define INCL_DOSERRORS			// NO_ERROR
-
-#include "dll\fm3dll.h"
-#include "dll\notebook.h"		// appname
-#include "dll\mainwnd.h"		// FM3ModHandle
-#include "dll\fm3dlg.h"
-#include "dll\init.h"			// InitFM3DLL
-#include "dll\viewinf.h"		// ViewInfProc
-#include "dll\errutil.h"		// Error reporting
-#include "dll\excputil.h"		// Exception handlers
-
-static PSZ pszSrcFile = __FILE__;
-
-int main(int argc, char *argv[])
-{
-  HAB hab;
-  HMQ hmq;
-  APIRET regRet;
-  EXCEPTIONREGISTRATIONRECORD regRec = { NULL, NULL };
-
-  regRec.ExceptionHandler = HandleException;
-  regRet = DosSetExceptionHandler(&regRec);
-  if (regRet != NO_ERROR) {
-    DbgMsg(pszSrcFile, __LINE__,
-	   "DosSetExceptionHandler failed with error %u", regRet);
-  }
-
-  hab = WinInitialize(0);
-  if (hab) {
-    hmq = WinCreateMsgQueue(hab, 256);
-    if (hmq) {
-      if (InitFM3DLL(hab, argc, argv)) {
-	WinDlgBox(HWND_DESKTOP,
-		  HWND_DESKTOP,
-		  ViewInfProc,
-		  FM3ModHandle,
-		  VINF_FRAME, ((argc > 1) ? MPFROMP("") : MPVOID));
-      }
-      DosSleep(250);
-      WinDestroyMsgQueue(hmq);
-    }
-    WinTerminate(hab);
-  }
-  return 0;
-}
Index: trunk/viewinfs.def
===================================================================
--- trunk/viewinfs.def	(revision 1912)
+++ 	(revision )
@@ -1,9 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2009 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-
-option description '@#The Netlabs FM/2 team:3.25.0#@##1## 2024-06-02 03:25:00      ZOBOPEEP::EN:US:0:U:@@FM/2 View INFs MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, 2024 Steven Levine and Associates, Inc. All rights reserved'
-
-option stack = 122840
Index: trunk/viewinfs.mak
===================================================================
--- trunk/viewinfs.mak	(revision 1912)
+++ 	(revision )
@@ -1,23 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2007 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-# 23 Feb 08 JBS Add support for building SYM files
-# 04 Jul 11 GKY Make xqs files an explicit target so they will be rebuild if lost somehow.
-
-BASE=viewinfs
-
-!include makefile_pre.mk
-
-all: $(BASE).exe $(BASE).res .symbolic
-
-sym: $(BASE).sym $(BASE).xqs .symbolic
-
-$(BASE).res: $(BASE).rc icons\$(BASE).ico
-
-$(BASE).obj: $(BASE).c
-
-!include makefile_post.mk
-
-# The end
Index: trunk/viewinfs.rc
===================================================================
--- trunk/viewinfs.rc	(revision 1912)
+++ 	(revision )
@@ -1,17 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  viewinfs resources
-
-  Copyright (c) 1993-02 M. Kimes
-  Copyright (c) 2003, 2008 Steven H.Levine
-
-  15 Oct 02 MK Baseline
-  04 Nov 03 SHL Drop extra default icon
-  04 Jan 08 SHL Sync with fm3dll.h mods
-
-***********************************************************************/
-
-DEFAULTICON       icons\VIEWINFS.ICO
Index: trunk/views.tmp
===================================================================
--- trunk/views.tmp	(revision 1912)
+++ 	(revision )
@@ -1,187 +1,0 @@
-; Fixed: Ticket 267
-;
-;This file contains some utility definitions for the FM/2 toolbar.
-;FM/2 saved this file as "<DRIVE>:\FM2\VIEWS.TLS".
-;
-;Each tool button has four lines that describe it.  The first line is
-;the help for the button.
-;
-;The second line is the text for the button (internally defined tools
-;have icons, and the text is ignored).
-;
-;The third line is a number indicating flags associated with the button.
-;A flag value of 0 means the button is non-droppable, 1 means the button
-;is droppable, 4 means invisible (5 both), 8 means non-droppable with a
-;spacer following, and 9 means droppable with a spacer following.
-;
-;The fourth line is the ID of the button (for internal commands only).
-;Note Commands begin at ID 4000, so a button with ID 4000 would cause
-;the first Command to be run and ID 4001 would run the second, and so on.
-;4900 marks the first "quick toolbox change" item, and you can
-;have up to 50 of them (these buttons load other toolboxes, see
-;online help).
-;
-;You can use \r in the help string to break the help into multiple lines.
-;
-;
-Filter Container (Ctrl + f)
-Filter
-0
-5001
-;
-Walk Directories (Ctrl + w)
-Walk
-0
-10002
-;
-Sort by filename
-Name
-0
-3005
-;
-Sort by size
-Size
-0
-3006
-;
-Sort by EA size
-EAsz
-0
-3007
-;
-Sort by first extension
-1st
-0
-3008
-;
-Sort by last extension
-Last
-0
-3009
-;
-Sort by lastwrite date
-Date
-0
-3010
-;
-Sort by creation date
-CrDate
-0
-3012
-;
-Reverse sort
-Rev
-8
-3015
-;
-Select All
-+All
-0
-10006
-;
-Deselect All (Ctrl + \)
--All
-0
-10007
-;
-Deselect Dirs
--Dirs
-0
-10011
-;
-Select Files (Ctrl + /)
-+Files
-0
-10008
-;
-Invert selections (Ctrl + ;)
-Invert
-0
-10014
-;
-Reselect (Ctrl +  ')
-Reslct
-8
-10027
-;
-Select Mask (Ctrl + =)
-+Mask
-0
-10012
-;
-Deselect Mask (Ctrl + +)
--Mask
-8
-10013
-;
-Settings Notebook
-Setngs
-0
-3059
-;
-Set Target Directory (Ctrl + T)
-TargetDir
-8
-1154
-;
-Window Dialog (Ctrl + W)
-Windws
-8
-9010
-;
-Seek and scan files
-SeekScan
-8
-1047
-;
-Make Directory (Ctrl + M)
-MakeDir
-0
-1026
-;
-Rescan (Ctrl + R)
-Rescan
-0
-5021
-;
-Print Files (Ctrl + p)
-Print
-9
-1007
-;
-Exit FM2 (Ctrl + F3)
-Exit
-8
-1111
-;
-Commands toolbar
-Cmds
-0
-4900
-;
-Utility toolbar
-Utils
-0
-4901
-;
-Sort toolbar
-Sort
-0
-4902
-;
-Select toolbar
-Select
-0
-4903
-;
-Configuration toolbar
-Config
-0
-4904;
-;
-Files toolbar
-Files
-8
-4905
-;
-; $Id$
Index: trunk/vtree.c
===================================================================
--- trunk/vtree.c	(revision 1912)
+++ 	(revision )
@@ -1,110 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  Tree viewer applet
-
-  Copyright (c) 1993-98 M. Kimes
-  Copyright (c) 2008 Steven H.Levine
-
-  05 Jan 08 SHL Sync
-  14 Dec 08 SHL Add exception handler support
-
-***********************************************************************/
-
-#include <stdlib.h>			// min
-#include <string.h>
-
-#define INCL_DOS
-#define INCL_WIN
-#define INCL_DOSEXCEPTIONS		// XCTP_...
-#define INCL_DOSERRORS			// NO_ERROR
-
-#include "dll\fm3dll.h"
-#include "dll\mainwnd.h"		// hwndTree hwndBubble
-#include "dll\notebook.h"		// appname
-#include "dll\init.h"			// InitFM3DLL
-#include "dll\treecnr.h"		// StartTreeCnr
-#include "dll\errutil.h"		// Error reporting
-#include "dll\excputil.h"		// Exception handlers
-
-static PSZ pszSrcFile = __FILE__;
-
-int main(int argc, char *argv[])
-{
-  HAB hab;
-  HMQ hmq;
-  QMSG qmsg;
-  UINT x;
-  BOOL startminimized = FALSE;
-  APIRET regRet;
-  EXCEPTIONREGISTRATIONRECORD regRec = { NULL, NULL };
-
-  strcpy(appname, "VTREE");
-  DosError(FERR_DISABLEHARDERR);
-
-  regRec.ExceptionHandler = HandleException;
-  regRet = DosSetExceptionHandler(&regRec);
-  if (regRet != NO_ERROR) {
-    DbgMsg(pszSrcFile, __LINE__,
-	   "DosSetExceptionHandler failed with error %u", regRet);
-  }
-
-  hab = WinInitialize(0);
-  if (hab) {
-    hmq = WinCreateMsgQueue(hab, 1024);
-    if (hmq) {
-      if (InitFM3DLL(hab, argc, argv)) {
-	for (x = 1; x < argc; x++) {
-	  if (*argv[x] == '~') {
-	    startminimized = TRUE;
-	    break;
-	  }
-	}
-	hwndTree = StartTreeCnr(HWND_DESKTOP, 0);
-	if (hwndTree) {
-	  if (hwndHelp)
-	    WinAssociateHelpInstance(hwndHelp, hwndTree);
-	  if (!WinRestoreWindowPos("FM/2", "VTreeWindowPos", hwndTree)) {
-
-	    SWP swp;
-	    ULONG adjust;
-
-	    adjust = WinQuerySysValue(HWND_DESKTOP, SV_CXICON) * 8L;
-	    WinQueryTaskSizePos(hab, 0L, &swp);
-	    swp.cx = min(swp.cx, adjust);
-	    WinSetWindowPos(hwndTree, HWND_TOP, swp.x, swp.y, swp.cx, swp.cy,
-			    SWP_SHOW | SWP_MOVE | SWP_SIZE | SWP_ZORDER |
-			    SWP_ACTIVATE);
-	  }
-	  if (startminimized)
-	    WinSetWindowPos(hwndTree, HWND_TOP, 0, 0, 0, 0, SWP_MINIMIZE);
-	  else
-	    WinSetWindowPos(hwndTree, HWND_TOP, 0, 0, 0, 0,
-			    SWP_SHOW | SWP_ZORDER | SWP_ACTIVATE);
-	  for (;;) {
-	    if (!WinGetMsg(hab, &qmsg, (HWND) 0, 0, 0)) {
-	      if (qmsg.hwnd)
-		qmsg.msg = WM_CLOSE;
-	      else
-		break;
-	    }
-	    if (hwndBubble &&
-		((qmsg.msg > (WM_BUTTON1DOWN - 1) &&
-		  qmsg.msg < (WM_BUTTON3DBLCLK + 1)) ||
-		 (qmsg.msg > (WM_CHORD - 1) &&
-		  qmsg.msg < (WM_BUTTON3CLICK + 1))) &&
-		WinIsWindowVisible(hwndBubble))
-	      WinShowWindow(hwndBubble, FALSE);
-	    WinDispatchMsg(hab, &qmsg);
-	  }
-	}
-      }
-      DosSleep(125);
-      WinDestroyMsgQueue(hmq);
-    }
-    WinTerminate(hab);
-  }
-  return 0;
-}
Index: trunk/vtree.def
===================================================================
--- trunk/vtree.def	(revision 1912)
+++ 	(revision )
@@ -1,9 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2009 Steven H. Levine
-
-# 14 Jun 07 SHL Convert to OpenWatcom
-
-option description '@#The Netlabs FM/2 team:3.25.0#@##1## 2024-06-02 03:25:00      ZOBOPEEP::EN:US:0:U:@@FM/2 Tree View MiniApp Copyright (c) 1993, 1998 M. Kimes, Copyright (c) 2001, 2024 Steven Levine and Associates, Inc. All rights reserved'
-
-option stack = 488416
Index: trunk/vtree.mak
===================================================================
--- trunk/vtree.mak	(revision 1912)
+++ 	(revision )
@@ -1,23 +1,0 @@
-# $Id$
-
-# Copyright (c) 2002, 2007 Steven H. Levine
-
-# 16 Jun 07 GKY Convert to OpenWatcom
-# 23 Feb 08 JBS Add support for building SYM files
-# 04 Jul 11 GKY Make xqs files an explicit target so they will be rebuild if lost somehow.
-
-BASE=vtree
-
-!include makefile_pre.mk
-
-all: $(BASE).exe $(BASE).res .symbolic
-
-sym: $(BASE).sym $(BASE).xqs .symbolic
-
-$(BASE).res: $(BASE).rc icons\tree.ico bitmaps\*.bmp
-
-$(BASE).obj: $(BASE).c
-
-!include makefile_post.mk
-
-# The end
Index: trunk/vtree.rc
===================================================================
--- trunk/vtree.rc	(revision 1912)
+++ 	(revision )
@@ -1,43 +1,0 @@
-
-/***********************************************************************
-
-  $Id$
-
-  vtree resources
-
-  Copyright (c) 1993-02 M. Kimes
-  Copyright (c) 2003, 2008 Steven H.Levine
-
-  15 Oct 02 MK Baseline
-  04 Nov 03 SHL Drop extra default icon
-  04 Jan 08 SHL Sync with fm3dll.h mods
-
-***********************************************************************/
-
-#include "dll\fm3dll2.h"
-
-DEFAULTICON                 icons\TREE.ICO
-
-BITMAP DIR_FOLDERICON       bitmaps\PMAP.BMP
-BITMAP DIR_FRAME            bitmaps\FILE.BMP
-BITMAP 65534                bitmaps\EMPTY.BMP
-BITMAP IDM_DELETE           bitmaps\DELETE.BMP
-BITMAP IDM_EXTRACT          bitmaps\EXTRACT.BMP
-BITMAP IDM_PRINT            bitmaps\PRINT.BMP
-BITMAP IDM_TEST             bitmaps\TEST.BMP
-BITMAP IDM_VIRUSSCAN        bitmaps\VIRUS.BMP
-BITMAP IDM_EXEC             bitmaps\EXEC.BMP
-BITMAP IDM_VIEW             bitmaps\VIEW.BMP
-BITMAP IDM_PERMDELETE       bitmaps\PERMDEL.BMP
-BITMAP IDM_RESCAN           bitmaps\RESCAN.BMP
-BITMAP IDM_REFRESH          bitmaps\RESCAN.BMP
-BITMAP IDM_FILTER           bitmaps\FILTER.BMP
-BITMAP IDM_WALKDIR          bitmaps\WALK.BMP
-BITMAP IDM_GREP             bitmaps\GREP.BMP
-BITMAP IDM_SEEALL           bitmaps\SEEALL.BMP
-BITMAP IDM_FINDFIRST        bitmaps\FINDFRST.BMP
-BITMAP IDM_FINDNEXT         bitmaps\FINDNEXT.BMP
-BITMAP IDM_FINDPREV         bitmaps\FINDPREV.BMP
-BITMAP IDM_CLEARCNR         bitmaps\CLEARCNR.BMP
-BITMAP IDM_REMOVE           bitmaps\REMOVOBJ.BMP
-
