home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / ftplike.zip / ftplike.ih
Text File  |  1999-11-25  |  30KB  |  590 lines

  1. ;----------------------------------------------------------------------------
  2. ;     MODULE NAME:   FTPLIKE.IH
  3. ;
  4. ;         $Author:   Dennis_Bareis  $
  5. ;       $Revision:   1.8  $
  6. ;           $Date:   25 Nov 1999 17:57:06  $
  7. ;        $Logfile:   E:/DB/PVCS.IT/OS2/PPWIZARD/FTPLIKE.IHV  $
  8. ;
  9. ;     DESCRIPTION:   This allows you to create FTP like pages without
  10. ;                    having to do a lot of work.  Simply add the file
  11. ;                    to a directory will get it onto the correct HTML
  12. ;                    page.
  13. ;
  14. ;                    It would be wise to generate pages into their own
  15. ;                    directory on the off chance that this header file
  16. ;                    picks a name for a directories file which matches
  17. ;                    one of yours!
  18. ;
  19. ;                    Note that most of the code below is tricky only
  20. ;                    because I made it generic (ie very configurable),
  21. ;                    a specific implementation would be much smaller
  22. ;                    and much much easier to write as well!
  23. ;
  24. ;                    The whole look and feel of the generated data may
  25. ;                    be modified.
  26. ;
  27. ;                    It would be simple to have your normal look and feel
  28. ;                    items such as headers, footers backgrounds etc
  29. ;                    integrated into the generated output.
  30. ;
  31. ;                    Description file support (.diz) is available for both
  32. ;                    files and directories. The directory DIZ file should
  33. ;                    reside in the directory its describing. Note that the
  34. ;                    file can (and probably should) contain normal HTML
  35. ;                    formatting tags - by default anyway. If you have a
  36. ;                    file called "stuff.zip" this header will look for
  37. ;                    "stuff.zip.diz" and "stuff.diz".
  38. ;
  39. ;                    You should not modify the value of any definition
  40. ;                    that begins with an "_", you can modify virtually
  41. ;                    anything else.
  42. ;
  43. ;                    Note that dependancy checking does not make sense
  44. ;                    in this type of situation as files can appear simply
  45. ;                    by matching the wildcard. For this reason I do not
  46. ;                    bother with using the "#dependsOn INPUT" command for
  47. ;                    each file I process.
  48. ;
  49. ;
  50. ;                    NOT COMPLETE
  51. ;                    ~~~~~~~~~~~~
  52. ;                    I don't really like the way file date, time and size
  53. ;                    are displayed, if you have any better ideas please
  54. ;                    let me know.
  55. ;
  56. ;
  57. ;                    SUPPORTED OPERATING SYSTEMS
  58. ;                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~
  59. ;                    It is intended that all operating systems that PPWIZARD
  60. ;                    supports can also use this header, if you find that
  61. ;                    it does not work then please send me the output when
  62. ;                    you have used the "/debug" command line switch. Please
  63. ;                    also include a directory listing of the directory(s) you
  64. ;                    are processing.
  65. ;
  66. ;
  67. ;                    EXAMPLE - LINUX
  68. ;                    ~~~~~~~~~~~~~~~
  69. ;                    #define   FTPLIKE_FOLLOW_SUBDIRECTORIES
  70. ;                    #define   FTPLIKE_USE_LONG_FILENAMES
  71. ;                    #define   FTPLIKE_DIRECTORY           /home/dennis/
  72. ;                    #define   FTPLIKE_DIRECTORY_WEB       http://ftp
  73. ;                    #include  "ftplike.ih"
  74. ;
  75. ;
  76. ;                    EXAMPLE - OS/2, WINDOWS
  77. ;                    ~~~~~~~~~~~~~~~~~~~~~~~
  78. ;                    #define   FTPLIKE_FOLLOW_SUBDIRECTORIES
  79. ;                    #define   FTPLIKE_USE_LONG_FILENAMES   ;;Remove this definition for 8.3 names
  80. ;                    #define   FTPLIKE_DIRECTORY            C:\TMP\ASM_MAC
  81. ;                    #define   FTPLIKE_DIRECTORY_WEB        file:///C|TMP/ASM_MAC ;;Local testing
  82. ;                    #include  "FTPLIKE.IH"
  83. ;
  84. ;
  85. ;                    HELP WANTED
  86. ;                    ~~~~~~~~~~~
  87. ;                    I use "find" under linux, is there a expression that
  88. ;                    I can pass to "-name" to display all files/directories?
  89. ;
  90. ;----------------------------------------------------------------------------
  91.  
  92. ;--- First time through? ----------------------------------------------------
  93. #ifndef _FTPLIKE_INITIALIZED
  94.    ;--- Define the version number of this header file -----------------------
  95.    #define+  VERSION_FTPLIKE_IH    99.325
  96.    #require  99.325
  97.  
  98.    ;--- Check prerequisites -------------------------------------------------
  99.    #ifndef FTPLIKE_DIRECTORY
  100.            #error ^You must define the "FTPLIKE_DIRECTORY" value (local directory)!^
  101.    #endif
  102.    #ifndef FTPLIKE_DIRECTORY_WEB
  103.            #error ^You must define the "FTPLIKE_DIRECTORY_WEB" value (web location)!^
  104.    #endif
  105.  
  106.    ;--- Include macro push/pop support --------------------------------------
  107.    #ifndef VERSION_PUSHPOPM_H
  108.            #include "PushPopM.H"
  109.    #endif
  110.  
  111.    ;--- Use same date time on all generated pages ---------------------------
  112.    #ifndef FTPLIKE_DATETIME
  113.            #evaluate FTPLIKE_DATETIME @date('WeekDay') || ' ' || date('Month') || ' ' || substr(date('Sorted'), 7, 2) || ' ' || left(date('Sorted'), 4) || ' at ' || time('Civil')@
  114.    #endif
  115.  
  116.    ;--- Total numbers accross FTP pages -------------------------------------
  117.    #RexxVar FtpTotalDirCnt  = 0          ;;Number of directories
  118.    #RexxVar FtpTotalFileCnt = 0          ;;Number of files
  119.  
  120.    ;--- Remember the output level where it all began! -----------------------
  121.    #Rexxvar FtpStartLevel = <?OutputLevel>
  122.  
  123.    ;--- Work out what filemasks users wants ---------------------------------
  124.    #ifndef FTPLIKE_FILE_MASKS
  125.            ;--- Default is to process all files -----------------------------
  126.            #if ['<?OpSys>' = 'UNIX']
  127.                #define FTPLIKE_FILE_MASKS
  128.            #else
  129.                #define FTPLIKE_FILE_MASKS *.*
  130.            #endif
  131.    #endif
  132.    #ifndef FTPLIKE_DIR_MASKS
  133.            ;--- Default is to process all directories -----------------------
  134.            #if ['<?OpSys>' = 'UNIX']
  135.                #define FTPLIKE_DIR_MASKS
  136.            #else
  137.                #define FTPLIKE_DIR_MASKS *.*
  138.            #endif
  139.    #endif
  140.  
  141.    ;--- Do best we can for input dependancies -------------------------------
  142.    #ifdef  FTPLIKE_FOLLOW_SUBDIRECTORIES
  143.            #DependsOn  INPUT  ^*FILES=+<$FTPLIKE_DIRECTORY><?DirSlash><$FTPLIKE_DIR_MASKS>^
  144.    #elseif
  145.            #DependsOn  INPUT  ^*FILES=<$FTPLIKE_DIRECTORY><?DirSlash><$FTPLIKE_DIR_MASKS>^
  146.    #endif
  147.  
  148.    ;--- Allow user to easily support frames etc -----------------------------
  149.    #ifndef FTPLIKE_LINK2DIR
  150.            #define FTPLIKE_LINK2DIR   <A HREF="{$URL}">
  151.    #endif
  152.    #ifndef FTPLIKE_LINK2FILE
  153.            #define FTPLIKE_LINK2FILE  <A HREF="{$URL}">   ;;Probably would not want to override this
  154.    #endif
  155.  
  156.    ;--- Prepare for generating HTML page names ------------------------------
  157.    #ifdef  FTPLIKE_FOLLOW_SUBDIRECTORIES
  158.            ;--- Prepare for generating html page names (unique names!) ------
  159.            #evaluate '' ^call GetIdPrepare 'FTPLIKE', 'Y'^
  160.  
  161.            ;--- Don't generate filename same as current "base" file! --------
  162.            #evaluate '' ^call SetId        'FTPLIKE', '',  EnsureFileHasCorrectCase(_filespec('W', _filespec('Name', '<?OutputFile>')))^
  163.    #endif
  164.  
  165.    ;--- Now work out the output directory -----------------------------------
  166.    #evaluate+  'FtpGenDir' ^_filespec('location', '<?OutputFile>')^
  167.  
  168.    ;--- Work out the full name of this header file --------------------------
  169.    #RexxVar  FtpLikeFile = '<?InputComponent>'
  170.  
  171.    ;--- Relative web directory ----------------------------------------------
  172.    #define _FTPLIKE_DIRECTORY_WEB_RELATIVE
  173.  
  174.    ;--- Work out what user wants to call the "root" dir ---------------------
  175.    #ifndef FTPLIKE_DISPLAY_DIR
  176.            #define FTPLIKE_DISPLAY_DIR /
  177.    #endif
  178.  
  179.    ;--- Work out extension to use -------------------------------------------
  180.    #ifndef   FTPLIKE_HTML_EXTN
  181.              #define   FTPLIKE_HTML_EXTN   htm
  182.    #endif
  183.  
  184.    ;--- User want specific prefix for generated filenames -------------------
  185.    #ifndef   FTPLIKE_NEWHTML_PREFIX
  186.              #ifdef    FTPLIKE_USE_LONG_FILENAMES
  187.                        #define   FTPLIKE_NEWHTML_PREFIX     FtpLike_
  188.              #elseif
  189.                        #define   FTPLIKE_NEWHTML_PREFIX     ;;No prefix
  190.              #endif
  191.    #endif
  192.  
  193.  
  194.    ;--- Define Simple HEADERS & FOOTERS -------------------------------------
  195.    #ifndef FTPLIKE_HEADER
  196.            #define FTPLIKE_HEADER    <CENTER><H1>{$Title}</H1></CENTER>
  197.    #endif
  198.    #ifndef FTPLIKE_FOOTER
  199.            #define FTPLIKE_FOOTER          \
  200.                    <HR>                   %\
  201.                    <CENTER>               %\
  202.                    <FONT SIZE=-1>         %\
  203.                       <$FTPLIKE_DATETIME> %\
  204.                    </FONT>                %\
  205.                    </CENTER>              %\
  206.                    </BODY></HTML>
  207.    #endif
  208.  
  209.    ;--- Define START OF HTML page -------------------------------------------
  210.    #ifndef FTPLIKE_EXTRA_HEAD_TAGS
  211.            #define FTPLIKE_EXTRA_HEAD_TAGS
  212.    #endif
  213.    #ifndef FTPLIKE_BODY_TAG
  214.            #define FTPLIKE_BODY_TAG <BODY>
  215.    #endif
  216.    #ifndef FTPLIKE_START_HTML_PAGE
  217.            #define FTPLIKE_START_HTML_PAGE                           \
  218.                    <!-- Real Directory "<$FTPLIKE_DIRECTORY>" -->   %\
  219.                    <HTML>                                           %\
  220.                    <HEAD>                                           %\
  221.                       <META NAME="GENERATOR" CONTENT="FTPLIKE.IH <$VERSION_FTPLIKE_IH> macros for PPWIZARD <?Version>, free tool by <?PpwizardAuthor> (<?PpwizardHomePage>)"> %\
  222.                       <TITLE><$FTPLIKE_DISPLAY_DIR></TITLE>         %\
  223.                       <$FTPLIKE_EXTRA_HEAD_TAGS>                    -\
  224.                    </HEAD>                                          %\
  225.                    <$FTPLIKE_BODY_TAG>                              %\
  226.                    <$FTPLIKE_HEADER Title=^<$FTPLIKE_DISPLAY_DIR>^> %\
  227.                    <?NewLine>
  228.    #endif
  229.  
  230.    ;--- Define some stubs (you can add comments like "no directories found" etc) ---
  231.    #ifndef FTPLIKE_START_PAGE_AFTER_TITLE
  232.            #define FTPLIKE_START_PAGE_AFTER_TITLE  <$FTPLIKE_DIR_DIZ_HANDLER>
  233.    #endif
  234.    #ifndef FTPLIKE_BETWEEN_DIRS_AND_FILES
  235.            #define FTPLIKE_BETWEEN_DIRS_AND_FILES
  236.    #endif
  237.    #ifndef FTPLIKE_END_PAGE_ABOVE_FOOTER
  238.            #define FTPLIKE_END_PAGE_ABOVE_FOOTER
  239.    #endif
  240.  
  241.    ;--- Define START OF files -----------------------------------------------
  242.    #ifndef FTPLIKE_BEFORE_ALL_FILES
  243.            #define FTPLIKE_BEFORE_ALL_FILES                 \
  244.                    <CENTER>                                %\
  245.                    <TABLE BORDER=5 CELLPADDING=10>
  246.    #endif
  247.    #ifndef FTPLIKE_BEFORE_ALL_DIRS
  248.            #define FTPLIKE_BEFORE_ALL_DIRS                  \
  249.                    <CENTER>                                %\
  250.                    <TABLE BORDER=0 CELLPADDING=0>
  251.    #endif
  252.  
  253.  
  254.    ;--- How to handle a directory's name ------------------------------------
  255.    #ifndef FTPLIKE_GENERATE_HTML_FOR_DIR_TREE
  256.            #define FTPLIKE_GENERATE_HTML_FOR_DIR_TREE                       \
  257.                    #evaluate+  '' "FtpOutput = _filespec('name', FtpDir)"  -\
  258.                                                                            -\
  259.                    ;--- Work out HTML base name ------------               -\
  260.                    #ifdef     FTPLIKE_USE_LONG_FILENAMES                   -\
  261.                               #evaluate+ "FtpDirId"  ^EnsureFileHasCorrectCase( GetId('FTPLIKE', '2_',       '<$FTPLIKE_NEWHTML_PREFIX><$_FTPLIKE_DIRECTORY_WEB_RELATIVE $$SQx2>/' || FtpOutput) )^ -\
  262.                    #elseif                                                 -\
  263.                               #evaluate+ "FtpDirId"  ^EnsureFileHasCorrectCase( GetId('FTPLIKE', 'MAXCHARS', '<$FTPLIKE_NEWHTML_PREFIX>' || FtpOutput) )^ -\
  264.                    #endif                                                  -\
  265.                                                                            -\
  266.                    ;--- Start HTML page for new dir ---                    -\
  267.                    #output "<$FtpDirId>.<$FTPLIKE_HTML_EXTN>"              -\
  268.                       ;--- "PUSH" some values ---                          -\
  269.                       <$MacroPush Macro='FTPLIKE_DIRECTORY'>               -\
  270.                       <$MacroPush Macro='FTPLIKE_DIRECTORY_WEB'>           -\
  271.                       <$MacroPush Macro='FTPLIKE_DISPLAY_DIR'>             -\
  272.                       <$MacroPush Macro='_FTPLIKE_DIRECTORY_WEB_RELATIVE'> -\
  273.                       <$MacroPush Macro='FtpDirId'>                        -\
  274.                       #RexxVar    PUSH  FtpOutput FtpDir                   -\
  275.                                                                            -\
  276.                       ;--- Create HTML contents ---                        -\
  277.                       #option    PUSH DefineMacroReplace=ON                -\
  278.                       #define+   FTPLIKE_DIRECTORY              <$FTPLIKE_DIRECTORY><?DirSlash><??FtpOutput>      -\
  279.                       #evaluate+ FTPLIKE_DISPLAY_DIR            ^ReplaceString('<$FTPLIKE_DISPLAY_DIR $$SQx2>/' || FtpOutput, '//', '/')^ -\
  280.                       #define+   FTPLIKE_DIRECTORY_WEB          <$FTPLIKE_DIRECTORY_WEB>/<??FtpOutput>            -\
  281.                       #define+   _FTPLIKE_DIRECTORY_WEB_RELATIVE <$_FTPLIKE_DIRECTORY_WEB_RELATIVE>/<??FtpOutput> -\
  282.                       #option    POP                                       -\
  283.                       #include   "ftplike.ih"                              -\
  284.                                                                            -\
  285.                       ;--- "POP"  some values ---                          -\
  286.                       #RexxVar   POP  FtpOutput FtpDir                     -\
  287.                       <$MacroPop Macro='FtpDirId'>                         -\
  288.                       <$MacroPop Macro='_FTPLIKE_DIRECTORY_WEB_RELATIVE'>  -\
  289.                       <$MacroPop Macro='FTPLIKE_DISPLAY_DIR'>              -\
  290.                       <$MacroPop Macro='FTPLIKE_DIRECTORY_WEB'>            -\
  291.                       <$MacroPop Macro='FTPLIKE_DIRECTORY'>                -\
  292.                    #output
  293.    #endif
  294.  
  295.    ;--- How to handle (display) directory details ---------------------------
  296.    #ifndef FTPLIKE_DIR_HANDLER
  297.            #define FTPLIKE_DIR_HANDLER                                         \
  298.                    <TR>                                                       -\
  299.                    <TD>                                                       -\
  300.                       ;--- Link to HTML page we will create ---               -\
  301.                       <$FTPLIKE_LINK2DIR Url="<$FtpDirId>.<$FTPLIKE_HTML_EXTN>"> -\
  302.                          <??FtpOutput> ;;Just output short name                -\
  303.                       </A>                                                    -\
  304.                    </TD>                                                      -\
  305.                    <TD>                                                       -\
  306.                       <TABLE BORDER=0 CELLPADDING=5>                          -\
  307.                       <TR>                                                    -\
  308.                          <TD ALIGN=LEFT><??FtpSubdirTotalDirCnt> dirs</TD>    -\
  309.                          <TD ALIGN=RIGHT><??FtpSubdirTotalFileCnt> files</TD> -\
  310.                       </TR>                                                   -\
  311.                       </TABLE>                                                -\
  312.                    </TD>                                                      -\
  313.                    </TR>
  314.    #endif
  315.  
  316.  
  317.    ;--- How to handle a file's name -----------------------------------------
  318.    #ifndef FTPLIKE_FILE_HANDLER
  319.            #define FTPLIKE_FILE_HANDLER                                     \
  320.                    #evaluate '' ^FtpOutput = _filespec('name', FtpFile)^   -\
  321.                    #evaluate '' ^eURL = UrlEncode('<$FTPLIKE_DIRECTORY_WEB>/' || FtpOutput, 'TO%', ' ')^ -\
  322.                    <TR>                ;;Start New File row                %\
  323.                    <TD ALIGN=RIGHT>    ;;Start filename cell               %\
  324.                        <$FTPLIKE_LINK2FILE Url="<??eURL>">                 -\
  325.                           <??FtpOutput> ;;Just output short name           -\
  326.                        </A>                                                %\
  327.                    </TD>               ;;End cell
  328.    #endif
  329.  
  330.    ;--- How to handle a file's details --------------------------------------
  331.    #ifndef FTPLIKE_FILE_DETAILS_HANDLER
  332.            #define FTPLIKE_FILE_DETAILS_HANDLER                             \
  333.                    #evaluate '' ^<$FTPLIKE_FILE_ATTRIBUTE_HANDLER_REXX>^   -\
  334.                    <TD ALIGN=LEFT>     ;;Start file details cell           %\
  335.                        <??FtpDay> <??FtpMon> <??FtpYear>                    \
  336.                        <??FtpHour>:<??FtpMinute>:<??FtpSecond>,             \
  337.                        <?Space>                                             \
  338.                        <??FtpSize> bytes                                   %\
  339.                        <$FTPLIKE_FILE_DIZ_HANDLER>                         -\
  340.                    </TD>               ;;End cell                          %\
  341.                    </TR>               ;;End this File row
  342.    #endif
  343.  
  344.  
  345.    ;--- Define END OF files -------------------------------------------------
  346.    #ifndef FTPLIKE_AFTER_ALL_FILES
  347.            #define FTPLIKE_AFTER_ALL_FILES  </TABLE></CENTER>
  348.    #endif
  349.    #ifndef FTPLIKE_AFTER_ALL_DIRS
  350.            #define FTPLIKE_AFTER_ALL_DIRS   </TABLE></CENTER><P>
  351.    #endif
  352.  
  353.    ;--- Define ATTRIBUTE Handler (date, time, size etc) ---------------------
  354.    #ifndef FTPLIKE_FILE_ATTRIBUTE_HANDLER_REXX
  355.            #define FTPLIKE_FILE_ATTRIBUTE_HANDLER_REXX                     \
  356.                    FtpTimeStamp = GetFileTimeStamp(FtpFile);              -\
  357.                    FtpSize      = stream(FtpFile, 'c', 'query size');     -\
  358.                    FtpSize      = AddCommasToDecimalNumber(FtpSize);      -\
  359.                    parse var FtpTimeStamp FtpYear +4 FtpMonth +2 FtpDay +2 FtpHour +2 FtpMinute +2 FtpSecond;      -\
  360.                    FtpMon       = substr('JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC', ((FtpMonth-1)*4)+1, 3);
  361.    #endif
  362.  
  363.  
  364.    ;--- Process this directory? (no filter by default) ----------------------
  365.    #ifndef FTPLIKE_DO_THIS_DIR
  366.            #define FTPLIKE_DO_THIS_DIR       ;;Generate for all directories
  367.    #endif
  368.  
  369.    ;--- Process this file? (by default no ".diz" files!) --------------------
  370.    #ifndef FTPLIKE_DO_THIS_FILE
  371.            #define FTPLIKE_DO_THIS_FILE_REXX                           \
  372.                    if  translate(right(FtpFile, 4)) = '.diz' then;    -\
  373.                        FtpDoThisFile = 'N';    ;;Description file!
  374.            #define FTPLIKE_DO_THIS_FILE                                \
  375.                    #evaluate '' ^<$FTPLIKE_DO_THIS_FILE_REXX>^
  376.    #endif
  377.  
  378.    ;--- Define "DIZ" handler ------------------------------------------------
  379.    #ifndef FTPLIKE_FILE_DIZ_HANDLER
  380.            #define FTPLIKE_FILE_DIZ_HANDLER_REXX                        \
  381.                    FtpDizFile     = stream(FtpFile || '.diz', 'c', 'query exists'); -\
  382.                    if  FtpDizFile = '' then;                           -\
  383.                    do;                                                 -\
  384.                        ;--- Try changing extension to ".diz" ---       -\
  385.                        FtpPos = lastpos('.', FtpFile);                 -\
  386.                        if  FtpPos <> 0 then;                           -\
  387.                            FtpDizFile = stream(left(FtpFile,FtpPos) || 'DIZ', 'c', 'query exists'); -\
  388.                    end;                                                -\
  389.                    if  FtpDizFile = '' then;                           -\
  390.                        FtpDiz = '';                                    -\
  391.                    else;                                               -\
  392.                    do;                                                 -\
  393.                        FtpDiz  = charin(FtpDizFile, 1, 99999);         -\
  394.                        call DieIfIoErrorOccurred FtpDizFile;           -\
  395.                        CloseRc = stream(FtpDizFile, 'c', 'close');     -\
  396.                        <$FTPLIKE_DIZ_TRANSLATION_REXX>                 -\
  397.                        FtpDiz = {$Prefix=^''^} || FtpDiz || {$Suffix=^''^}; -\
  398.                    end;
  399.            #define FTPLIKE_FILE_DIZ_HANDLER                             \
  400.                    #evaluate '' ^<$FTPLIKE_FILE_DIZ_HANDLER_REXX PREFIX=~'<HR>'~>^  -\
  401.                    <??FtpDiz>
  402.    #endif
  403.    #ifndef FTPLIKE_DIR_DIZ_HANDLER
  404.            #define FTPLIKE_DIR_DIZ_HANDLER                              \
  405.                    #evaluate '' ^FtpFile = '<$FTPLIKE_DIRECTORY $$SQx2><?DirSlash>' || _filespec('name', '<$FTPLIKE_DIRECTORY $$SQx2>')^ -\
  406.                    #evaluate '' ^<$FTPLIKE_FILE_DIZ_HANDLER_REXX SUFFIX=~'<HR>'~>^  -\
  407.                    <??FtpDiz>
  408.    #endif
  409.  
  410.  
  411.    ;--- Define "DIZ" translations -------------------------------------------
  412.    #ifndef FTPLIKE_DIZ_TRANSLATION_REXX
  413.            #define FTPLIKE_DIZ_TRANSLATION_REXX                                 \
  414.                    FtpDiz = ReplaceString(FtpDiz, '1A'x,       '');  ;;EOF char
  415.    ;;;;;;          FtpDiz = ReplaceString(FtpDiz, '0D0A0D0A'x, '0D0A'x || '<P>');
  416.    #endif
  417.  
  418.  
  419.    ;--- Define how files are SORTED -----------------------------------------
  420.    #ifndef FTPLIKE_FILE_SORT
  421.            #ifndef FTPLIKE_FILE_SORT_REXX
  422.                    #define FTPLIKE_FILE_SORT_REXX             \
  423.                            call SortArray '{$ArrayName}'
  424.            #endif
  425.            #define FTPLIKE_FILE_SORT                          \
  426.                    #evaluate '' ^<$FTPLIKE_FILE_SORT_REXX ArrayName=~{$ArrayName}~>^
  427.    #endif
  428.    #ifndef FTPLIKE_DIRECTORY_SORT
  429.            #define FTPLIKE_DIRECTORY_SORT  <$FTPLIKE_FILE_SORT ArrayName=~{$ArrayName}~>  ;;Same as file sort by default
  430.    #endif
  431.  
  432.    ;--- Make sure not done again (when a directory being processed etc) -----
  433.    #define _FTPLIKE_INITIALIZED
  434. #endif
  435.  
  436.  
  437. ;--- Simple processing message ----------------------------------------------
  438. #evaluate '' ^ShortOutName = _filespec('Name', '<?OutputFile>')^
  439. #info ^Generating <??ShortOutName> <= <$FTPLIKE_DIRECTORY>^
  440.  
  441.  
  442. ;--- Initialization for this FTP page ---------------------------------------
  443. #RexxVar FtpDirCnt  = 0          ;;Number of directories on this html page
  444. #RexxVar FtpFileCnt = 0          ;;Number of files       on this html page
  445.  
  446.  
  447. ;--- Generate start of HTML -------------------------------------------------
  448. #if    <?OutputLevel> <> FtpStartLevel | defined('FTPLIKE_NO_HEADER_FOOTER_ON_1ST_PAGE') = 'N'
  449.        <$FTPLIKE_START_HTML_PAGE>
  450. #endif
  451. <$FTPLIKE_START_PAGE_AFTER_TITLE>
  452.  
  453. ;--- Process directories? (need to be careful as we include ourself) --------
  454. #ifdef  FTPLIKE_FOLLOW_SUBDIRECTORIES
  455.         ;--- Get list of directories ----------------------------------------
  456.         #evaluate '' ^call _SysFileTree '<$FTPLIKE_DIRECTORY $$SQx2><?DirSlash><$FTPLIKE_DIR_MASKS>', 'FtpArray<?OutputLevel>', 'DO'^
  457.  
  458.         ;--- Any directories to display? ------------------------------------
  459.         #if  [FtpArray<?OutputLevel>.0 <> 0]
  460.            ;--- Sort the list (if thats what user wants) --------------------
  461.            <$FTPLIKE_DIRECTORY_SORT ArrayName="FtpArray<?OutputLevel>">
  462.  
  463.            ;--- Process DIRECTORIES -----------------------------------------
  464.            #RexxVar FtpIndex<?OutputLevel> = 1
  465.            #{
  466.                ;--- Finished? -----------------------------------------------
  467.                #if [FtpIndex<?OutputLevel> > FtpArray<?OutputLevel>.0]
  468.                    #break
  469.                #endif
  470.  
  471.                ;--- Get name of this directory ------------------------------
  472.                #RexxVar FtpDir = FtpArray<?OutputLevel>.FtpIndex<?OutputLevel>
  473.  
  474.                ;--- Generate the files --------------------------------------
  475.                #RexxVar FtpDoThisDir = 'Y'
  476.                <$FTPLIKE_DO_THIS_DIR>              ;;User want this dir to be seen?
  477.                #if [FtpDoThisDir = 'Y']
  478.                    ;--- User does want this dir to be seen ------------------
  479.                    #RexxVar FtpDirCnt + 1
  480.                    #if [FtpDirCnt = 1]
  481.                        ;--- Start DIRECTORY output --------------------------
  482.                        <$FTPLIKE_BEFORE_ALL_DIRS>
  483.                    #endif
  484.  
  485.                    ;--- Save some variables ---------------------------------
  486.                    #RexxVar PUSH  FtpDirCnt FtpFileCnt FtpTotalDirCnt FtpTotalFileCnt
  487.  
  488.                    ;--- Reset totals ----------------------------------------
  489.                    #RexxVar FtpTotalDirCnt  = 0
  490.                    #RexxVar FtpTotalFileCnt = 0
  491.  
  492.                    ;--- Process all subdirectories (generating HTML as we go)
  493.                    <$FTPLIKE_GENERATE_HTML_FOR_DIR_TREE>
  494.  
  495.                    ;--- Remember subdirectory counts ------------------------
  496.                    #RexxVar FtpSubdirTotalFileCnt = FtpTotalFileCnt
  497.                    #RexxVar FtpSubdirTotalDirCnt  = FtpTotalDirCnt
  498.  
  499.                    ;--- Display directory details on this page --------------
  500.                    <$FTPLIKE_DIR_HANDLER>
  501.  
  502.                    ;--- Restore other variables -----------------------------
  503.                    #RexxVar POP  FtpDirCnt FtpFileCnt FtpTotalDirCnt FtpTotalFileCnt
  504.  
  505.                    ;--- Add to totals ---------------------------------------
  506.                    #RexxVar FtpTotalFileCnt + FtpSubdirTotalFileCnt
  507.                    #RexxVar FtpTotalDirCnt  + FtpSubdirTotalDirCnt
  508.                #endif
  509.  
  510.                ;--- Prepare for next file -----------------------------------
  511.                #RexxVar FtpIndex<?OutputLevel> + 1
  512.            #}
  513.  
  514.            ;--- Generate end DIRECTORY stuff --------------------------------
  515.            #if [FtpDirCnt <> 0]
  516.                <$FTPLIKE_AFTER_ALL_DIRS>
  517.            #endif
  518.         #endif
  519.  
  520.         ;--- Hook for displaying stuff --------------------------------------
  521.         <$FTPLIKE_BETWEEN_DIRS_AND_FILES>
  522. #endif
  523.  
  524. ;--- Get list of files ------------------------------------------------------
  525. #evaluate '' ^call _SysFileTree '<$FTPLIKE_DIRECTORY $$SQx2><?DirSlash><$FTPLIKE_FILE_MASKS>', 'FtpArray', 'FO'^
  526.  
  527. ;--- Any files in this directory? -------------------------------------------
  528. #if [FtpArray.0 <> 0]
  529.    ;--- Sort the list (if thats what user wants) ----------------------------
  530.    <$FTPLIKE_FILE_SORT ArrayName="FtpArray">
  531.  
  532.    ;--- Process files -------------------------------------------------------
  533.    #RexxVar FtpIndex = 1
  534.    #{
  535.        ;--- Finished? -------------------------------------------------------
  536.        #if [FtpIndex > FtpArray.0]
  537.            #break
  538.        #endif
  539.  
  540.        ;--- Get Filename ----------------------------------------------------
  541.        #RexxVar FtpFile = FtpArray.FtpIndex
  542.  
  543.        ;--- Generate the files ----------------------------------------------
  544.        #RexxVar FtpDoThisFile = 'Y'
  545.        <$FTPLIKE_DO_THIS_FILE>                 ;;User want this file to be seen?
  546.        #if [FtpDoThisFile = 'Y']
  547.            ;--- User does want this file to be seen -------------------------
  548.            #RexxVar FtpFileCnt + 1
  549.            #if [FtpFileCnt = 1]
  550.                ;--- Start FILE output ---------------------------------------
  551.                <$FTPLIKE_BEFORE_ALL_FILES>
  552.            #endif
  553.  
  554.            ;--- Output details for this file --------------------------------
  555.            <$FTPLIKE_FILE_HANDLER>
  556.            <$FTPLIKE_FILE_DETAILS_HANDLER>
  557.        #endif
  558.  
  559.        ;--- Prepare for next file -------------------------------------------
  560.        #RexxVar FtpIndex + 1
  561.    #}
  562.  
  563.    ;--- Generate end FILES stuff --------------------------------------------
  564.    #if [FtpFileCnt <> 0]
  565.        <$FTPLIKE_AFTER_ALL_FILES>
  566.    #endif
  567. #endif
  568.  
  569.  
  570. ;--- Generate END of HTML ---------------------------------------------------
  571. <$FTPLIKE_END_PAGE_ABOVE_FOOTER>
  572. #if    <?OutputLevel> <> FtpStartLevel | defined('FTPLIKE_NO_HEADER_FOOTER_ON_1ST_PAGE') = 'N'
  573.        ;--- User has not set up their own alternative -----------------------
  574.        <$FTPLIKE_FOOTER>               ;;Footer ends body and html
  575. #endif
  576.  
  577. ;--- Update totals ----------------------------------------------------------
  578. #RexxVar FtpTotalFileCnt + FtpFileCnt
  579. #RexxVar FtpTotalDirCnt  + FtpDirCnt
  580.  
  581. ;--- Output summary ---------------------------------------------------------
  582. #if    [<?OutputLevel> = FtpStartLevel]
  583.        #ifndef   FTPLIKE_FOLLOW_SUBDIRECTORIES
  584.            #info ^FTPLIKE processed <??FtpTotalFileCnt> file(s)^
  585.        #elseif
  586.            #info ^FTPLIKE processed <??FtpTotalFileCnt> file(s) in <??FtpTotalDirCnt> directories^
  587.        #endif
  588. #endif
  589.  
  590.